pax_global_header00006660000000000000000000000064122501277160014515gustar00rootroot0000000000000052 comment=8230c02f0dc5b9e9c505b0c88c37dba0cd5be0aa qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/000077500000000000000000000000001225012771600225775ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/.qmake.conf000066400000000000000000000001141225012771600246160ustar00rootroot00000000000000load(qt_build_config) CONFIG += qt_example_installs MODULE_VERSION = 5.1.1 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/.tag000066400000000000000000000000511225012771600233470ustar00rootroot000000000000008230c02f0dc5b9e9c505b0c88c37dba0cd5be0aa qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/LGPL_EXCEPTION.txt000066400000000000000000000022431225012771600255150ustar00rootroot00000000000000Digia Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/LICENSE.FDL000066400000000000000000000546611225012771600242240ustar00rootroot00000000000000 GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. 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, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/LICENSE.GPL000066400000000000000000001045131225012771600242310ustar00rootroot00000000000000 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. Copyright (C) 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: Copyright (C) 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 . qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/LICENSE.LGPL000066400000000000000000000643011225012771600243450ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). Contact: http://www.qt-project.org/legal You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/000077500000000000000000000000001225012771600252055ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/alsa/000077500000000000000000000000001225012771600261255ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/alsa/alsa.pro000066400000000000000000000000741225012771600275700ustar00rootroot00000000000000SOURCES = alsatest.cpp CONFIG -= qt dylib LIBS+=-lasound qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/alsa/alsatest.cpp000066400000000000000000000041741225012771600304570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #if (!(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 10)) #error "Alsa version found too old, require >= 1.0.10" #endif int main(int argc,char **argv) { } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/android/000077500000000000000000000000001225012771600266255ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/android/android.pro000066400000000000000000000001021225012771600307600ustar00rootroot00000000000000CONFIG += java API_VERSION = android-11 JAVASOURCES += main.java qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/android/main.java000066400000000000000000000001551225012771600304150ustar00rootroot00000000000000import android.graphics.SurfaceTexture; class BuildTest { public static void main(String [] args) { } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/avfoundation/000077500000000000000000000000001225012771600277025ustar00rootroot00000000000000avfoundation.pro000066400000000000000000000000761225012771600330450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/avfoundationOBJECTIVE_SOURCES += main.mm LIBS += -framework AVFoundation qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/avfoundation/main.mm000066400000000000000000000037651225012771600311740ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #import int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/directshow/000077500000000000000000000000001225012771600273605ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/directshow/directshow.pro000066400000000000000000000001651225012771600322570ustar00rootroot00000000000000CONFIG -= qt CONFIG += console SOURCES += main.cpp LIBS += -lstrmiids -ldmoguids -luuid -lmsdmo -lole32 -loleaut32 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/directshow/main.cpp000066400000000000000000000040101225012771600310030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int, char**) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/evr/000077500000000000000000000000001225012771600260015ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/evr/evr.pro000066400000000000000000000000641225012771600273170ustar00rootroot00000000000000CONFIG -= qt CONFIG += console SOURCES += main.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/evr/main.cpp000066400000000000000000000037421225012771600274370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int, char**) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer/000077500000000000000000000000001225012771600271765ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer/gstreamer.pro000066400000000000000000000003551225012771600317140ustar00rootroot00000000000000SOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ gstreamer-$$GST_VERSION \ gstreamer-base-$$GST_VERSION \ gstreamer-audio-$$GST_VERSION \ gstreamer-video-$$GST_VERSION \ gstreamer-pbutils-$$GST_VERSION qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer/main.cpp000066400000000000000000000040011225012771600306210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #define GST_USE_UNSTABLE_API #include int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_appsrc/000077500000000000000000000000001225012771600305465ustar00rootroot00000000000000gstreamer_appsrc.pro000066400000000000000000000003531225012771600345530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_appsrcSOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ gstreamer-$$GST_VERSION \ gstreamer-base-$$GST_VERSION \ gstreamer-audio-$$GST_VERSION \ gstreamer-video-$$GST_VERSION \ gstreamer-pbutils-$$GST_VERSION qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_appsrc/main.cpp000066400000000000000000000040301225012771600321730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #define GST_USE_UNSTABLE_API #include int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_encodingprofiles/000077500000000000000000000000001225012771600326105ustar00rootroot00000000000000gstreamer_encodingprofiles.pro000066400000000000000000000003541225012771600406600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_encodingprofilesSOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ gstreamer-$$GST_VERSION \ gstreamer-base-$$GST_VERSION \ gstreamer-audio-$$GST_VERSION \ gstreamer-video-$$GST_VERSION \ gstreamer-pbutils-$$GST_VERSION main.cpp000066400000000000000000000040701225012771600341620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_encodingprofiles/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #define GST_USE_UNSTABLE_API #include #include int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_photography/000077500000000000000000000000001225012771600316225ustar00rootroot00000000000000gstreamer_photography.pro000066400000000000000000000004241225012771600367020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_photographySOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ gstreamer-$$GST_VERSION \ gstreamer-base-$$GST_VERSION \ gstreamer-audio-$$GST_VERSION \ gstreamer-video-$$GST_VERSION \ gstreamer-pbutils-$$GST_VERSION LIBS += -lgstphotography-$$GST_VERSION main.cpp000066400000000000000000000042221225012771600331730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/gstreamer_photography/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #define GST_USE_UNSTABLE_API #include #include #include #include int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/openal/000077500000000000000000000000001225012771600264635ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/openal/main.cpp000066400000000000000000000040671225012771600301220ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #if defined(HEADER_OPENAL_PREFIX) #include #else #include #endif int main(int argc, char** argv) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/openal/openal.pro000066400000000000000000000002701225012771600304620ustar00rootroot00000000000000SOURCES += main.cpp win32: LIBS += -lOpenAL32 unix:!mac:!blackberry: LIBS += -lopenal blackberry: LIBS += -lOpenAL mac: LIBS += -framework OpenAL mac: DEFINES += HEADER_OPENAL_PREFIX qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/pulseaudio/000077500000000000000000000000001225012771600273575ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/pulseaudio/pulseaudio.cpp000066400000000000000000000044311225012771600322370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #if !defined(PA_API_VERSION) || PA_API_VERSION-0 != 12 # error "Incompatible PulseAudio API version" #endif int main(int, char **) { const char *headers = pa_get_headers_version(); const char *library = pa_get_library_version(); pa_glib_mainloop_new(0); return (headers - library) * 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/pulseaudio/pulseaudio.pro000066400000000000000000000002021225012771600322450ustar00rootroot00000000000000CONFIG -= qt CONFIG += link_pkgconfig PKGCONFIG += \ libpulse \ libpulse-mainloop-glib SOURCES = pulseaudio.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/resourcepolicy/000077500000000000000000000000001225012771600302545ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/resourcepolicy/main.cpp000066400000000000000000000042141225012771600317050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int argc, char** argv) { ResourcePolicy::ResourceSet *set = new ResourcePolicy::ResourceSet("player", 0); return 0; } resourcepolicy.pro000066400000000000000000000001221225012771600337610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/resourcepolicySOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ libresourceqt1 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmf/000077500000000000000000000000001225012771600257765ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmf/main.cpp000066400000000000000000000042341225012771600274310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include int main(int, char**) { HRESULT hr = MENonFatalError; if (SUCCEEDED(hr)) { return 1; } return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmf/wmf.pro000066400000000000000000000002261225012771600273110ustar00rootroot00000000000000CONFIG -= qt CONFIG += console SOURCES += main.cpp LIBS += -lstrmiids -ldmoguids -luuid -lmsdmo -lole32 -loleaut32 -lMf -lMfuuid -lMfplat -lPropsys qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmp/000077500000000000000000000000001225012771600260105ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmp/main.cpp000066400000000000000000000037421225012771600274460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int, char**) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmp/wmp.pro000066400000000000000000000001541225012771600273350ustar00rootroot00000000000000CONFIG -= qt CONFIG += console SOURCES += main.cpp LIBS += -lstrmiids -lole32 -lOleaut32 -luser32 -lgdi32 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmsdk/000077500000000000000000000000001225012771600263325ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmsdk/main.cpp000066400000000000000000000037441225012771600277720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int, char**) { return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/wmsdk/wmsdk.pro000066400000000000000000000000641225012771600302010ustar00rootroot00000000000000CONFIG -= qt CONFIG += console SOURCES += main.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/xvideo/000077500000000000000000000000001225012771600265035ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/xvideo/main.cpp000066400000000000000000000042601225012771600301350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Multimedia module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int argc, char** argv) { unsigned int count = 0; XvAdaptorInfo *adaptors = 0; // XvQueryAdaptors(0, 0, &count, &adaptors); return 0; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/config.tests/xvideo/xvideo.pro000066400000000000000000000001321225012771600305170ustar00rootroot00000000000000SOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ x11 \ xext \ xv qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/dist/000077500000000000000000000000001225012771600235425ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/dist/changes-5.0.1000066400000000000000000000064171225012771600255440ustar00rootroot00000000000000Qt 5.0.1 is a bug-fix release. It maintains both forward and backward source compatibility with Qt 5.0.0. However, to fix a bug we detected after the 5.0 release, this release has a limited binary compatibility break. We therefore recommend all users to recompile their applications that provided QtMultimedia plugins or dealt with them directly. This is an exceptional case: compatibility will be kept for further releases. For more details, refer to the online documentation included in this distribution. The documentation is also available online: http://qt-project.org/doc/qt-5.0/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: http://bugreports.qt-project.org/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * General * **************************************************************************** General Improvements -------------------- * Documentation: Various documentation fixes such as spelling and snippet corrections. * Fixed an issue that could cause memory leak when certain objects were destroyed. The fix for this issue required a binary compatibility break in two classes: QAudioSystemFactoryInterface and QMediaServiceProviderFactoryInterface. Those two classes are used only in QtMultimedia plugins and code directly dealing with them and recompilation is only strictly necessary for them. Third party components ---------------------- **************************************************************************** * Library * **************************************************************************** - WMF: added more metadata keys (on Windows 7 and later). - Compile in 32-bit mode. - remove leftover code from multimediawidgets carve-out - WMF: release video controls before releasing the session - WMF: Fixed uninitialized member variable. - WMF: re-enabled video probes and made it more robust. - [QTBUG-28376] Make QtMultimedia an identified module - [QTBUG-28727] Doc: Moved the qdocinc and image to the sourcedirs - Remove comma at the end of the enum - fix include statements - Use qrc to deploy qml files in declarative-camera examples - [QTBUG-26621] WMF: Fixed incorrect QMediaPlayer volume reporting. - Polish and fix qmlvideofx example - Add qmake generated files to .gitignore. - Example: Notify user of errors **************************************************************************** * Platform Specific Changes * **************************************************************************** **************************************************************************** * Compiler Specific Changes * **************************************************************************** **************************************************************************** * Plugins * **************************************************************************** qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/dist/changes-5.0.2000066400000000000000000000036121225012771600255370ustar00rootroot00000000000000Qt 5.0.2 is a bug-fix release. It maintains both forward and backward source compatibility with Qt 5.0.0 and 5.0.1. However, to fix a bug we detected after the 5.0 release, this release has a limited binary compatibility break. We therefore recommend all users to recompile their applications that provided QtMultimedia plugins or dealt with them directly. This is an exceptional case: compatibility will be kept for further releases. For more details, refer to the online documentation included in this distribution. The documentation is also available online: http://qt-project.org/doc/qt-5.0/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: http://bugreports.qt-project.org/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * General * **************************************************************************** General Improvements -------------------- **************************************************************************** * Library * **************************************************************************** - WMF: Enabled HW-accelerated video decoding for the QML video item. - WMF: Fixed unresolved topologies when using the custom MediaSink. - Disable FFT when building in static mode. - [QTBUG-28741] Added seek() function to QML Video item. **************************************************************************** * Platform Specific Changes * **************************************************************************** Qt for BlackBerry ----------------- - Fixed playback of streamed audio. qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/000077500000000000000000000000001225012771600244155ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/examples.pro000066400000000000000000000000741225012771600267560ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += multimedia multimediawidgets qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/000077500000000000000000000000001225012771600265475ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/000077500000000000000000000000001225012771600311765ustar00rootroot00000000000000audiodecoder.cpp000066400000000000000000000136011225012771600342530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiodecoder.h" #include AudioDecoder::AudioDecoder(bool isPlayback, bool isDelete) : m_cout(stdout, QIODevice::WriteOnly) { m_isPlayback = isPlayback; m_isDelete = isDelete; // Make sure the data we receive is in correct PCM format. // Our wav file writer only supports SignedInt sample type. QAudioFormat format; format.setChannelCount(2); format.setSampleSize(16); format.setSampleRate(48000); format.setCodec("audio/pcm"); format.setSampleType(QAudioFormat::SignedInt); m_decoder.setAudioFormat(format); connect(&m_decoder, SIGNAL(bufferReady()), this, SLOT(bufferReady())); connect(&m_decoder, SIGNAL(error(QAudioDecoder::Error)), this, SLOT(error(QAudioDecoder::Error))); connect(&m_decoder, SIGNAL(stateChanged(QAudioDecoder::State)), this, SLOT(stateChanged(QAudioDecoder::State))); connect(&m_decoder, SIGNAL(finished()), this, SLOT(finished())); connect(&m_decoder, SIGNAL(positionChanged(qint64)), this, SLOT(updateProgress())); connect(&m_decoder, SIGNAL(durationChanged(qint64)), this, SLOT(updateProgress())); connect(&m_soundEffect, SIGNAL(statusChanged()), this, SLOT(playbackStatusChanged())); connect(&m_soundEffect, SIGNAL(playingChanged()), this, SLOT(playingChanged())); m_progress = -1.0; } void AudioDecoder::setSourceFilename(const QString &fileName) { m_decoder.setSourceFilename(fileName); } void AudioDecoder::start() { m_decoder.start(); } void AudioDecoder::stop() { m_decoder.stop(); } void AudioDecoder::setTargetFilename(const QString &fileName) { m_targetFilename = fileName; } void AudioDecoder::bufferReady() { // read a buffer from audio decoder QAudioBuffer buffer = m_decoder.read(); if (!buffer.isValid()) return; if (!m_fileWriter.isOpen() && !m_fileWriter.open(m_targetFilename, buffer.format())) { m_decoder.stop(); return; } m_fileWriter.write(buffer); } void AudioDecoder::error(QAudioDecoder::Error error) { switch (error) { case QAudioDecoder::NoError: return; case QAudioDecoder::ResourceError: m_cout << "Resource error" << endl; break; case QAudioDecoder::FormatError: m_cout << "Format error" << endl; break; case QAudioDecoder::AccessDeniedError: m_cout << "Access denied error" << endl; break; case QAudioDecoder::ServiceMissingError: m_cout << "Service missing error" << endl; break; } emit done(); } void AudioDecoder::stateChanged(QAudioDecoder::State newState) { switch (newState) { case QAudioDecoder::DecodingState: m_cout << "Decoding..." << endl; break; case QAudioDecoder::StoppedState: m_cout << "Decoding stopped" << endl; break; } } void AudioDecoder::finished() { if (!m_fileWriter.close()) m_cout << "Failed to finilize output file" << endl; m_cout << "Decoding finished" << endl; if (m_isPlayback) { m_cout << "Starting playback" << endl; m_soundEffect.setSource(QUrl::fromLocalFile(m_targetFilename)); m_soundEffect.play(); } else { emit done(); } } void AudioDecoder::playbackStatusChanged() { if (m_soundEffect.status() == QSoundEffect::Error) { m_cout << "Playback error" << endl; emit done(); } } void AudioDecoder::playingChanged() { if (!m_soundEffect.isPlaying()) { m_cout << "Playback finished" << endl; if (m_isDelete) QFile::remove(m_targetFilename); emit done(); } } void AudioDecoder::updateProgress() { qint64 position = m_decoder.position(); qint64 duration = m_decoder.duration(); qreal progress = m_progress; if (position >= 0 && duration > 0) progress = position / (qreal)duration; if (progress > m_progress + 0.1) { m_cout << "Decoding progress: " << (int)(progress * 100.0) << "%" << endl; m_progress = progress; } } audiodecoder.h000066400000000000000000000056261225012771600337300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIODECODER_H #define AUDIODECODER_H #include "wavefilewriter.h" #include #include #include class AudioDecoder : public QObject { Q_OBJECT public: AudioDecoder(bool isPlayback, bool isDelete); ~AudioDecoder() { } void setSourceFilename(const QString &fileName); void start(); void stop(); void setTargetFilename(const QString &fileName); signals: void done(); public slots: void bufferReady(); void error(QAudioDecoder::Error error); void stateChanged(QAudioDecoder::State newState); void finished(); void playbackStatusChanged(); void playingChanged(); private slots: void updateProgress(); private: bool m_isPlayback; bool m_isDelete; QAudioDecoder m_decoder; QTextStream m_cout; QString m_targetFilename; WaveFileWriter m_fileWriter; QSoundEffect m_soundEffect; qreal m_progress; }; #endif // AUDIODECODER_H audiodecoder.pro000066400000000000000000000004251225012771600342710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoderTEMPLATE = app TARGET = audiodecoder HEADERS = \ audiodecoder.h \ wavefilewriter.h SOURCES = main.cpp \ audiodecoder.cpp \ wavefilewriter.cpp QT += multimedia CONFIG += console target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiodecoder INSTALLS += target main.cpp000066400000000000000000000072351225012771600325560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiodecoder.h" #include #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTextStream cout(stdout, QIODevice::WriteOnly); if (app.arguments().size() < 2) { cout << "Usage: audiodecoder [-p] [-pd] SOURCEFILE [TARGETFILE]" << endl; cout << "Set -p option if you want to play output file." << endl; cout << "Set -pd option if you want to play output file and delete it after successful playback." << endl; cout << "Default TARGETFILE name is \"out.wav\" in the same directory as the source file." << endl; return 0; } bool isPlayback = false; bool isDelete = false; if (app.arguments().at(1) == "-p") isPlayback = true; else if (app.arguments().at(1) == "-pd") { isPlayback = true; isDelete = true; } QFileInfo sourceFile; QFileInfo targetFile; int sourceFileIndex = (isPlayback || isDelete) ? 2 : 1; if (app.arguments().size() <= sourceFileIndex) { cout << "Error: source filename is not specified." << endl; return 0; } sourceFile.setFile(app.arguments().at(sourceFileIndex)); if (app.arguments().size() > sourceFileIndex + 1) targetFile.setFile(app.arguments().at(sourceFileIndex + 1)); else targetFile.setFile(sourceFile.dir().absoluteFilePath("out.wav")); AudioDecoder decoder(isPlayback, isDelete); QObject::connect(&decoder, SIGNAL(done()), &app, SLOT(quit())); decoder.setSourceFilename(sourceFile.absoluteFilePath()); decoder.setTargetFilename(targetFile.absoluteFilePath()); decoder.start(); return app.exec(); } wavefilewriter.cpp000066400000000000000000000135411225012771600346660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "wavefilewriter.h" struct Q_PACKED chunk { char id[4]; quint32 size; }; struct Q_PACKED RIFFHeader { chunk descriptor; // "RIFF" char type[4]; // "WAVE" }; struct Q_PACKED WAVEHeader { chunk descriptor; quint16 audioFormat; quint16 numChannels; quint32 sampleRate; quint32 byteRate; quint16 blockAlign; quint16 bitsPerSample; }; struct Q_PACKED DATAHeader { chunk descriptor; }; struct Q_PACKED CombinedHeader { RIFFHeader riff; WAVEHeader wave; DATAHeader data; }; static const int HeaderLength = sizeof(CombinedHeader); WaveFileWriter::WaveFileWriter(QObject *parent) : QObject(parent) , m_dataLength(0) { } WaveFileWriter::~WaveFileWriter() { close(); } bool WaveFileWriter::open(const QString& fileName, const QAudioFormat& format) { if (file.isOpen()) return false; // file already open if (format.codec() != "audio/pcm" || format.sampleType() != QAudioFormat::SignedInt) return false; // data format is not supported file.setFileName(fileName); if (!file.open(QIODevice::WriteOnly)) return false; // unable to open file for writing if (!writeHeader(format)) return false; m_format = format; return true; } bool WaveFileWriter::write(const QAudioBuffer &buffer) { if (buffer.format() != m_format) return false; // buffer format has changed qint64 written = file.write((const char *)buffer.constData(), buffer.byteCount()); m_dataLength += written; return written == buffer.byteCount(); } bool WaveFileWriter::close() { bool result = false; if (file.isOpen()) { Q_ASSERT(m_dataLength < INT_MAX); result = writeDataLength(); m_dataLength = 0; file.close(); } return result; } bool WaveFileWriter::writeHeader(const QAudioFormat &format) { // check if format is supported if (format.byteOrder() == QAudioFormat::BigEndian || format.sampleType() != QAudioFormat::SignedInt) return false; CombinedHeader header; memset(&header, 0, HeaderLength); #ifndef Q_LITTLE_ENDIAN // only implemented for LITTLE ENDIAN return false; #else // RIFF header memcpy(header.riff.descriptor.id, "RIFF", 4); header.riff.descriptor.size = 0; // this will be updated with correct duration: // m_dataLength + HeaderLength - 8 // WAVE header memcpy(header.riff.type, "WAVE", 4); memcpy(header.wave.descriptor.id, "fmt ", 4); header.wave.descriptor.size = quint32(16); header.wave.audioFormat = quint16(1); header.wave.numChannels = quint16(format.channelCount()); header.wave.sampleRate = quint32(format.sampleRate()); header.wave.byteRate = quint32(format.sampleRate() * format.channelCount() * format.sampleSize() / 8); header.wave.blockAlign = quint16(format.channelCount() * format.sampleSize() / 8); header.wave.bitsPerSample = quint16(format.sampleSize()); // DATA header memcpy(header.data.descriptor.id,"data", 4); header.data.descriptor.size = 0; // this will be updated with correct data length: m_dataLength return (file.write(reinterpret_cast(&header), HeaderLength) == HeaderLength); #endif } bool WaveFileWriter::writeDataLength() { #ifndef Q_LITTLE_ENDIAN // only implemented for LITTLE ENDIAN return false; #endif if (file.isSequential()) return false; // seek to RIFF header size, see header.riff.descriptor.size above if (!file.seek(4)) return false; quint32 length = m_dataLength + HeaderLength - 8; if (file.write(reinterpret_cast(&length), 4) != 4) return false; // seek to DATA header size, see header.data.descriptor.size above if (!file.seek(40)) return false; return file.write(reinterpret_cast(&m_dataLength), 4) == 4; } wavefilewriter.h000066400000000000000000000050631225012771600343330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WAVEFILEWRITER_H #define WAVEFILEWRITER_H #include #include #include class WaveFileWriter : public QObject { Q_OBJECT public: explicit WaveFileWriter(QObject *parent = 0); ~WaveFileWriter(); bool open(const QString &fileName, const QAudioFormat &format); bool write(const QAudioBuffer &buffer); bool close(); bool isOpen() const { return file.isOpen(); } private: bool writeHeader(const QAudioFormat &format); bool writeDataLength(); QFile file; QAudioFormat m_format; qint64 m_dataLength; }; #endif // WAVEFILEWRITER_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/000077500000000000000000000000001225012771600312135ustar00rootroot00000000000000audiodevices.cpp000066400000000000000000000256101225012771600343100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiodevices.h" // Utility functions for converting QAudioFormat fields into text static QString toString(QAudioFormat::SampleType sampleType) { QString result("Unknown"); switch (sampleType) { case QAudioFormat::SignedInt: result = "SignedInt"; break; case QAudioFormat::UnSignedInt: result = "UnSignedInt"; break; case QAudioFormat::Float: result = "Float"; break; case QAudioFormat::Unknown: result = "Unknown"; } return result; } static QString toString(QAudioFormat::Endian endian) { QString result("Unknown"); switch (endian) { case QAudioFormat::LittleEndian: result = "LittleEndian"; break; case QAudioFormat::BigEndian: result = "BigEndian"; break; } return result; } AudioDevicesBase::AudioDevicesBase(QWidget *parent) : QMainWindow(parent) { setupUi(this); } AudioDevicesBase::~AudioDevicesBase() {} AudioTest::AudioTest(QWidget *parent) : AudioDevicesBase(parent) { mode = QAudio::AudioOutput; connect(testButton, SIGNAL(clicked()), SLOT(test())); connect(modeBox, SIGNAL(activated(int)), SLOT(modeChanged(int))); connect(deviceBox, SIGNAL(activated(int)), SLOT(deviceChanged(int))); connect(sampleRateBox, SIGNAL(activated(int)), SLOT(sampleRateChanged(int))); connect(channelsBox, SIGNAL(activated(int)), SLOT(channelChanged(int))); connect(codecsBox, SIGNAL(activated(int)), SLOT(codecChanged(int))); connect(sampleSizesBox, SIGNAL(activated(int)), SLOT(sampleSizeChanged(int))); connect(sampleTypesBox, SIGNAL(activated(int)), SLOT(sampleTypeChanged(int))); connect(endianBox, SIGNAL(activated(int)), SLOT(endianChanged(int))); connect(populateTableButton, SIGNAL(clicked()), SLOT(populateTable())); modeBox->setCurrentIndex(0); modeChanged(0); deviceBox->setCurrentIndex(0); deviceChanged(0); } AudioTest::~AudioTest() { } void AudioTest::test() { // tries to set all the settings picked. testResult->clear(); if (!deviceInfo.isNull()) { if (deviceInfo.isFormatSupported(settings)) { testResult->setText(tr("Success")); nearestSampleRate->setText(""); nearestChannel->setText(""); nearestCodec->setText(""); nearestSampleSize->setText(""); nearestSampleType->setText(""); nearestEndian->setText(""); } else { QAudioFormat nearest = deviceInfo.nearestFormat(settings); testResult->setText(tr("Failed")); nearestSampleRate->setText(QString("%1").arg(nearest.sampleRate())); nearestChannel->setText(QString("%1").arg(nearest.channelCount())); nearestCodec->setText(nearest.codec()); nearestSampleSize->setText(QString("%1").arg(nearest.sampleSize())); nearestSampleType->setText(toString(nearest.sampleType())); nearestEndian->setText(toString(nearest.byteOrder())); } } else testResult->setText(tr("No Device")); } void AudioTest::modeChanged(int idx) { testResult->clear(); // mode has changed if (idx == 0) mode = QAudio::AudioInput; else mode = QAudio::AudioOutput; deviceBox->clear(); foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(mode)) deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); deviceBox->setCurrentIndex(0); deviceChanged(0); } void AudioTest::deviceChanged(int idx) { testResult->clear(); if (deviceBox->count() == 0) return; // device has changed deviceInfo = deviceBox->itemData(idx).value(); sampleRateBox->clear(); QList sampleRatez = deviceInfo.supportedSampleRates(); for (int i = 0; i < sampleRatez.size(); ++i) sampleRateBox->addItem(QString("%1").arg(sampleRatez.at(i))); if (sampleRatez.size()) settings.setSampleRate(sampleRatez.at(0)); channelsBox->clear(); QList chz = deviceInfo.supportedChannelCounts(); for (int i = 0; i < chz.size(); ++i) channelsBox->addItem(QString("%1").arg(chz.at(i))); if (chz.size()) settings.setChannelCount(chz.at(0)); codecsBox->clear(); QStringList codecs = deviceInfo.supportedCodecs(); for (int i = 0; i < codecs.size(); ++i) codecsBox->addItem(QString("%1").arg(codecs.at(i))); if (codecs.size()) settings.setCodec(codecs.at(0)); // Add false to create failed condition! codecsBox->addItem("audio/test"); sampleSizesBox->clear(); QList sampleSizez = deviceInfo.supportedSampleSizes(); for (int i = 0; i < sampleSizez.size(); ++i) sampleSizesBox->addItem(QString("%1").arg(sampleSizez.at(i))); if (sampleSizez.size()) settings.setSampleSize(sampleSizez.at(0)); sampleTypesBox->clear(); QList sampleTypez = deviceInfo.supportedSampleTypes(); for (int i = 0; i < sampleTypez.size(); ++i) sampleTypesBox->addItem(toString(sampleTypez.at(i))); if (sampleTypez.size()) settings.setSampleType(sampleTypez.at(0)); endianBox->clear(); QList endianz = deviceInfo.supportedByteOrders(); for (int i = 0; i < endianz.size(); ++i) endianBox->addItem(toString(endianz.at(i))); if (endianz.size()) settings.setByteOrder(endianz.at(0)); allFormatsTable->clearContents(); } void AudioTest::populateTable() { int row = 0; QAudioFormat format; foreach (QString codec, deviceInfo.supportedCodecs()) { format.setCodec(codec); foreach (int sampleRate, deviceInfo.supportedSampleRates()) { format.setSampleRate(sampleRate); foreach (int channels, deviceInfo.supportedChannelCounts()) { format.setChannelCount(channels); foreach (QAudioFormat::SampleType sampleType, deviceInfo.supportedSampleTypes()) { format.setSampleType(sampleType); foreach (int sampleSize, deviceInfo.supportedSampleSizes()) { format.setSampleSize(sampleSize); foreach (QAudioFormat::Endian endian, deviceInfo.supportedByteOrders()) { format.setByteOrder(endian); if (deviceInfo.isFormatSupported(format)) { allFormatsTable->setRowCount(row + 1); QTableWidgetItem *codecItem = new QTableWidgetItem(format.codec()); allFormatsTable->setItem(row, 0, codecItem); QTableWidgetItem *sampleRateItem = new QTableWidgetItem(QString("%1").arg(format.sampleRate())); allFormatsTable->setItem(row, 1, sampleRateItem); QTableWidgetItem *channelsItem = new QTableWidgetItem(QString("%1").arg(format.channelCount())); allFormatsTable->setItem(row, 2, channelsItem); QTableWidgetItem *sampleTypeItem = new QTableWidgetItem(toString(format.sampleType())); allFormatsTable->setItem(row, 3, sampleTypeItem); QTableWidgetItem *sampleSizeItem = new QTableWidgetItem(QString("%1").arg(format.sampleSize())); allFormatsTable->setItem(row, 4, sampleSizeItem); QTableWidgetItem *byteOrderItem = new QTableWidgetItem(toString(format.byteOrder())); allFormatsTable->setItem(row, 5, byteOrderItem); ++row; } } } } } } } } void AudioTest::sampleRateChanged(int idx) { // sample rate has changed settings.setSampleRate(sampleRateBox->itemText(idx).toInt()); } void AudioTest::channelChanged(int idx) { settings.setChannelCount(channelsBox->itemText(idx).toInt()); } void AudioTest::codecChanged(int idx) { settings.setCodec(codecsBox->itemText(idx)); } void AudioTest::sampleSizeChanged(int idx) { settings.setSampleSize(sampleSizesBox->itemText(idx).toInt()); } void AudioTest::sampleTypeChanged(int idx) { switch (sampleTypesBox->itemText(idx).toInt()) { case QAudioFormat::SignedInt: settings.setSampleType(QAudioFormat::SignedInt); break; case QAudioFormat::UnSignedInt: settings.setSampleType(QAudioFormat::UnSignedInt); break; case QAudioFormat::Float: settings.setSampleType(QAudioFormat::Float); } } void AudioTest::endianChanged(int idx) { switch (endianBox->itemText(idx).toInt()) { case QAudioFormat::LittleEndian: settings.setByteOrder(QAudioFormat::LittleEndian); break; case QAudioFormat::BigEndian: settings.setByteOrder(QAudioFormat::BigEndian); } } audiodevices.h000066400000000000000000000054641225012771600337620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIODEVICES_H #define AUDIODEVICES_H #include #include #include #include "ui_audiodevicesbase.h" class AudioDevicesBase : public QMainWindow, public Ui::AudioDevicesBase { public: AudioDevicesBase(QWidget *parent = 0); virtual ~AudioDevicesBase(); }; class AudioTest : public AudioDevicesBase { Q_OBJECT public: AudioTest(QWidget *parent = 0); virtual ~AudioTest(); QAudioDeviceInfo deviceInfo; QAudioFormat settings; QAudio::Mode mode; private slots: void modeChanged(int idx); void deviceChanged(int idx); void sampleRateChanged(int idx); void channelChanged(int idx); void codecChanged(int idx); void sampleSizeChanged(int idx); void sampleTypeChanged(int idx); void endianChanged(int idx); void test(); void populateTable(); }; #endif audiodevices.pro000066400000000000000000000004301225012771600343170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevicesTEMPLATE = app TARGET = audiodevices QT += multimedia HEADERS = audiodevices.h SOURCES = audiodevices.cpp \ main.cpp FORMS += audiodevicesbase.ui target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiodevices INSTALLS += target QT+=widgets audiodevicesbase.ui000066400000000000000000000351111225012771600347730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices AudioDevicesBase 0 0 679 598 Audio Devices 0 0 true 0 0 659 558 Mode Device Input Output 0 Test format 0 0 QFrame::NoFrame QFrame::Plain <i>Actual Settings</i> Qt::RichText Qt::AlignCenter 0 0 QFrame::NoFrame QFrame::Plain <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Nearest Settings</span></p></body></html> Qt::RichText Qt::AlignCenter 0 0 false false false false Test Frequency (Hz) Channels Sample size (bits) Endianess 0 0 Note: an invalid codec 'audio/test' exists in order to allow an invalid format to be constructed, and therefore to trigger a 'nearest format' calculation. true Codec false SampleType false All formats Populate table QAbstractItemView::NoEditTriggers false QAbstractItemView::NoSelection QAbstractItemView::SelectItems Qt::ElideNone false false false false false false Codec AlignHCenter|AlignVCenter|AlignCenter Frequency (Hz) AlignHCenter|AlignVCenter|AlignCenter Channels AlignHCenter|AlignVCenter|AlignCenter Sample type AlignHCenter|AlignVCenter|AlignCenter Sample size (bits) AlignHCenter|AlignVCenter|AlignCenter Endianness AlignHCenter|AlignVCenter|AlignCenter qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/doc/000077500000000000000000000000001225012771600317605ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600331465ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/docaudiodevices.png000066400000000000000000001120101225012771600363130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/doc/images‰PNG  IHDR¯re£¾;sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœìÝuXkð3Ûtww*ÆŠ€Šv\»»½æ5¯úÙWE½ÆUÑk^1°»;°$Dº;—Í™ïE¤E¥tÏïñyÜ™}çÌaáÝ9óÎ;»DjJ ”1êÝ€B¡_Úé¿çIP@”VcWãhÙŒïß¾‘C!„P9xþ ?#ÂoãDŠ*©Æ®<6}òHÉæ5n~!„ÐÏ"+'–µlÌ Ó4Tä›HMeì?xÈoÃŽ HK¤Ì¢ZÆB!„PV/;¿è뻵lo߯K]Y¡ìá¼Ñ#dä=»wÙoÃÅѲŠ¢j !„’qÙùÅ™¹…áoîyy°1Rûjûˆ„œ»×ÏÙ¶öue¹&8Z6ÑeÔòac§ñ¢²bo‰ 3¾WŠ¡ É1ëVËÆÉ.Iþ»çRÅ dÙÒÅM…á!ñBP0oáfÌ!;;hjù Ô´¥e¾ztͽK_]uÅZnò.*%üͽ6î=tÔ›HHÉ,xyûCºPa\@T˜±háÒZ†þkózV@2€Ìÿü"QÀ1pic¤Dû–­%ùï3Gü9Ä1—®¬J0PJÍêñÇJxýÚ’x g£Z€ÉâØÀà_®ìÑYrrªšÚ&FZªÌï=ˆ“…á)ß™B2‰ tÕ%dmÚêJáQrÌm J•VUÚº}sÙE‚ *7žûû‚ê6GèBæzŸÝ²ëÅYò9asvÆAKcÅo(((ÛKÊ÷Š¢jÛ‰H~lPtó)C¶è”n,ÎËÎ ¾ð8$ÍÌÎZ…^ûœÊfP~©Öù $«hŸ‰d­Ä¥JûW…Wï>­a«ž^í¾¡4HÙÆ•×”Pª¤ «êù"‘ÈïôE:N§Óè4AE‘$%‹%ɰA}H’¬ns„~’¢Ä…¾->ÏÜQ3õR‹¸^d`£HIÞû€ˆ ”­ZpuY¥‹*6-[k3)antxl|žXòr´/CyÈ[: Oþuæ”’¹››¢(RRœŸ›šW$¦€ÆRÑÔ±0×Se–ϤòQš`¨hh¸¸k¸´IÝ¿÷uÝÎ\F‘‚̸¸è´¼" ¶º¶•™¦!Î  Î$ ‹vÍ5X ÊzûòSIÓ°kÑÌQ±b>¤ 3>!&-§PHA—SÖqt0T¢CÕÁiY˜Ÿ' €Î’SÑ4´3Wcã ú•ž!ë é&•#ì\ЧÊMfm¹Tv/ÕE¸~ï™4¬-—¼=ݪ\S!B©ª¯”â°ÙtÉ Óhté^I’”&‰áËhAm_„~F’‚ô]‹vJÀ-â˜*ÈupV:ù”'6—„åM\=Ä… Ï\Z“¬ÏJ.’.Fœº¸.Q“™KöÒ­Ÿ…<äg\½Ã(Hñ>†]ô›td~q¬\+]AThª…»Ó´ ºFòˆx!^O´²5àT“VràÔ½1E Ê͹ͦyé*ÊéNf2sj£rjh‚QûÆéš(Ò€_ü&ôßûÑ4V¡ºwÿ‹ÍdtÀ„™vvðáƒxîÚ!NtÉ›cW6¿S]6=qth‚¡kóµcôÍ”h@‰R£?þ}6‘´PM«üAŒª½ #)2Wßvéo¶ªtàççE¼ÿpðM޾)èôccß¡l›¯Fع Ï¬-— |yQe„R5 Ðh46‡Åd0 :N§I’’‰D@I‘»†ÍúUHr“ ,º*Pq¡û‚Í7ôQSmfazãc¾XóËŸ>Tù˜Ÿšï5É{ ¦Òk°ó— Fâ)ARX’Ýàn³¬ŸSÌR“·ié´Îˆ³hoLŽƒé—áÿ²ÛQ¤¡om*ŸøìÙ9ï¿Üä@×¼£Òk¡9N»Í±cU]$o¤éÔ®í&Í—³Oó2^$53Q05oF½NÉ Qf-è”ë1 ¹²lJ˜žh9 ë;&PEEib¶®¹–jqtlDžM•ÁÏ|,T0Ù:ÀLÈÔ¸Ôd1SGOÃÉF™¼Ÿ-$U™ß4Ç¡ŸÁçñwŒ Àç3û*"HâeIèåǪŽÐ¥£Ë¬-—¤íËÖ³¶\êÒѥʥjš7@£ÑØ,‹Á`0 :CB’ÅÅÅ¡@"‘P$Åf±¤x‰ýÂ(q~"_cŠ=€ {™EEöáZËxÊÿrKE•Ÿ@Ó°èmä‡ ×W¼(Vth»{¤‘Âçæe[’¬EË¥Ö Ið™ëk‹™ÆN;§ZkjZ 7ßž-tÔd–ÙMYƒ­h`¢’Ás3–y+UIÍv„ èÜ®GÅ -»¿47´qôVN9øéy‘Ig­Î¢‘à4L›À ûÆVWâ™—H 3“ä-Û1 þÞÝÅwó$4’®¬kkÄÉ/4ª:¸â %UuÈÚq((”OÐ(PÔ1°¶Ôäà;úÕù¼R^Ú–>¾ûøEå65Dðêж´ šµå’W‡¶vQí¼¡HR®Á`ÐéLA¼bžP(”† èt’FiijÈ+(T¹9B¿QNšÄ¬e+™q3‚/,J¹KY›2¹.û.òÊœ´%GóGKC ÷ÞÒÈÞ$+*&LlÄeP²\ŸáóXš¹÷ÃH#GË‚Èø7…ÖÝiÆf ‚gÅ|ZÉÙ5U~C …" CÀç“B^OS @aÀ¬¾´”·Õ¦ˆ‚¼Ûïù]8m´ÙQdgs€ðy@6GË„JøR |ÇRK ûâó"mG&HÅ‚ü¦ˆ¡¤óeP¯lg#h,Qj\²róví¦¹Ê¤Å<Ìcòi™™ ¡ Dþ‡ÐƒŸ(AI(º©­žŸ© ¢,øû Çf šÎ¸^ÀÈz¯¤aG”Kˆ`p)™Y ®ê}\äßýJ#é*Z–*,AJ5Áy[YI9>áÔ…D’”p V,k׊¡ì¨!|Ê'µY8qýjˆJ£ô5Ý@R =vŸGé+Gª²°¨M„7oß•æPv¡´ hݲyå¥jª$ @£t:F#h40L ¼¼<}½·oÞ …b‰f¬Ð/ŠæeÊÙ¶³§P™;7Ü»“'È+ßuZïÆ´f®ºŠ!Éoâ%]ìèÚ;ù˜ñTŒU>Ï 23êJ²Õh}–û˜.j…Ê–ºÚ_W¨T5ò?úEZ̲f8 êuЫ˜­.Ï€Ì~Ÿô,T™±/[é·Ú»¦Õ—ÅâÔý~Ñ"cíä~á³mÙžã{YÇdePl#5mfÖßkŸÇ(›i¨ð¼.ØE‰Å€¢ûo •5 ª¸\>,uÍüÈcafsì˜&^»¦‰Øzʹ­ P UüáshöÏ 7ZZv\®®¢éÈ€¢È\º‚ž0 _­tß7ߟ¯úWñlu%Eí#À¬-—Z:5“>( Xe„R_¹Ã°³WDz‹A(++++©¢°°p±D"Rk)æT;è‰ÐOædÑ]úk$Å‹ô›µÐ` Hÿ”Æj„©¥³RòãË/®)r{±ôUE7/¼ÕïÕ²€©!÷è¥Á­ûš+63?º”îÙ¢ ûsìr;bj˜é¼;uÇÇÃiHk]Cuyñ"C>¹žÈ36×¢•é¡TåÞ*ÉÏÎ >ÿ(9KÇÒHŽ Luߟ¾½É½ù ®ž™™®!yOBcâÕåi4¶ºjLPL|—æÆó WMC§â½F@1ÔMuCÏÞþËÍi°³ž™¢¢ˆÒ>eæ°5 •ª.¯¬(É~™çl¬î¤C@aFê½ÛoﳌMÙ•â#ôó«üi•o(UáÓ>’`Gpjî(àÔܱº5"|Y#ýž‚ø´Ü²k9‰jþdâ Ï}Šþ$Rk)`ë×Ð ¡Ÿ%LŒH,7p´Rg}®ÄQ¡IÅrFö–š—›”Á“LyMARJ> Æv6ê J”Ÿ—œ^(¢è5525%y-AòÂ>eˆ€£om§Í&(R›’’’]È—P@c*¨hh)2*§$H‹ˆLâ—.Ó,¶¢ªº¶¶zicŠ䦦¦eðÄÁ`Ë+©¨ëéªrhÒáa©ÅÀÖ±·Õ.ùâ*ò榥¤eIƒÐÙŠfæ:ò´jƒ³Å¹I‰¹E¡„[Q]×@_ / _“ŠçæÕ³ƒ‡ŒˆJÊúzkP”c?º}±[ÏyEü&DbòË÷T˜H—Óúkóúš#ŠÔ¹"–~ðúÕ15­5KS¥#mLM‹%k) ” ¬” J·ÐÐþOR0”ô,lôJŸÒÒø¼ EröŽ¥‹@°TôMTÊØTUc,-G­*R-Ó˜`©è«èUÓ€¥iã¤Yqeù0UtUt+E¨&8ÅTÑ7S©x~@QµýÞu„~*ÒóòÔìÂÚßa˜ž]•>I°q#”ªzÞ@¾š+|ý«ñ3BÉ(¾HÒ¥çÀÛWÏÚºªª|ý+só ßwé9/’H¹M!B©¯Ì@!„Pe…<¾<‡åå=àîõs‰µÛÄË{€@(æ}¾û¿)D(UÓ=!„ªNQ±@]E¡W¿!µl/‰‹ŠM-‚ô£Ë°@!„¾SVnáÏA:ù€a«”yáæãL!„B?)[¥L\ükHvV&4vJ!„jJJJ”˜°ß÷Þ ŒBÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖUþîôªùøøÔk!„ª[;v©MËÚVü½ù „B¨A;v´ö¿¡øÖÐ!„ú)༄BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€Bɺ&Y ð¸{­,nì<B?F’rz¸Û #ñâÆN!T³º«¨ÜÛ¹\.wÈÑ/=Ÿ*xº¸#—Ëí¾9TPg;BÕŸÏYª­G¯‘sþ:õ:]ô}Ñ9SwoK¢n“DÕµoûÖ¢¯¡'þâØa“-™@å½> VcÖé>BõŒ`´Züïâ–lqq^Røó+ǶL½úxÉñm¾¹/ÓT§þé\9"„êTÝ^) ”Zâæ]»- s^øköêfLÿÒ‚,=±|Dç6\.·]Ÿ;¤–œr¹çôsãr¹G­¿žøe$Ax{Û´¾¸\.×sÈ¢#A¹’:Í!TMQßÔÜÜÒÚ¡u§3·üç;T9ÀgÓý, Ê.)ŽÿoˆKï‘Â’Í©‚§‹:¹Ï}K•¿R@ ooŸ9ÀËår]»Y7]\u@„PC«ãy„²ÓonÅ·.Fð$™OýÃôt1ü2þ ɸýç4Ÿ óéûÏœ÷[×wjÁÌ‘IÆÍ•¿ï‰m³ìØ…K»FÒýÿ~Σȼ€M“W¿4´ÓÿòÅã+½rÎZv=ß+j@„b³aÃ-…o®~(¬¦Kú}Í2n݈‘–TAð…n¿–*å.¹Ï7Œ_r¼Wÿwþò…Ã+ÙÊaG¨©¨ëY„„B³ÔýsŠ%éý?YüÖIïK1 N{pì³ÇŠEý[˜Y{LY3Í2îìɰbqڃ㜾+çö´3Ô·í6{qO  @’ùÈ÷&kÄÚ¹½Z˜éØt¿t¬nЙçÙd'ª CÝÊTN˜Ÿ/ª¦KÒôÜûZdܺ-*?øÂKʹKårÅ€$ã¾ïuaçÿ­›èak¤ghãÚk€›6}¡¦¡nç !gÛ¿3kÖ™7¶çmGwФß/}N”šB˜Œ°*™RÄÐtrR+‹-@h*a>Î\^ÚLÎÜÅ‚y „ÉñüÄwCÜ”ÙQj¾´šä½ý¢(ŠÕuIºiǾ–½=ÝÖ¦8øÂ+¢íúJå§ SÞ%‚ù`ûr5öq„šˆ:¯Øæ½»+Mض90·ù®ê4þ×· (‚Æ(íý4½ä1EÑW]=ØKßj4â쨸b–®± ½ú.©Õ¡¯Õ¶Ã×>MÕM¿ðŠæòWs¥ÚÝG€}¡&¡>z ˤG¸÷<î 6å¯2uô¨øyÒEqfppŽ’¥©KÇ^RBRKæ ‰Ò>$ (`é9AÔ­À\6D¨ÑP…ïOøE±Ûô´W¨¡K2´;ô³Î¾{50àü+†k¿fJ°ôšBô£ùT¹•ØÇjê¥gšŒ<|÷ÎÕ5®Îڣ܄WÖnºŸôñá¾{¢Lµ“cèx çfŸÙu9†OQ‚¸k»O&]Ësj/ÅgkþøçÖûø”ä¸OÏîÚâ-¬jŸ¡:C&ÇFGúøðÜî?FN>•ï2o‡:­¦.I×j×ß6ûâ¦íÏYnýš)VŠI×ê4©;óÎÊå…'¦&F\9÷4Â>ŽPÓPW ò*ªU¬¦kuYóOöÆõ;'È–žóÍë&Z³@»ûš­É+׌ñü›¥ªßºßHî«ã4—Å·hlÞ½aÜá޶kŸ©Êô*"#„ê %Ü0f0M^Ǫ•ûü=ã¶ÑfBÍ]’®éÖßnÝêwJ=ú:*T•¦ê¶ôßu»ÖïZ2r˜š}:cG¨‰ fMŸºc÷žì¬L(((¨®OPPð±cG07„B}?S³¸Ø˜êžURR€¤Ä„ý¾¾8s!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uuöÉÄ>>>u !ÔvìÜUùCʰ##ô©²Ÿºüž‚  à:Œ†ª?þþ§«{ ;2B?…zñw¨ão-zôøqÝDÕFZjJí4¸æØ‘jxuÛ‹¿U=}‡!B¨¡éèêÕ¦ÙìY3ë;„Ð÷iÄ^ŒÕB¿Žo:·@5AÕ‹ñž„P'üë¡×nÇ'Qc'‚úVõS PÙ{i޼WP‡1űûÜõÜÿ‰Á7„B¨náØB!$ëê¿~Üæ¢×aý‘µCÛXêièXvšw.Nøy}»?w.ìÕÂÚDÏÀ®ûâ ñB(~³È^oÀü’Í ï1³žvg¤Ëò°\}M -«¼zO!Y÷m´|Ÿ¤xáÿÍîf¯£¥©¡¥kÙnÌ(ðc.þÙŸk¬¡¥©aÕaÜ΀lIÃþL¡*5Ì,Ba¸ïÉ>~×ÂN(%œßuÎüN÷Waäþ3Þç)¥^ßcÒP5«û‹Ì«Œ Ôù¿€µž®Ç‡>»;݌٠I#ô“rtt¬¼2$$仂վ“–#ŽûoúÂÛÖ›¯ìõ2¢ç~ z[À"Èœû‹zÏòÞxú¯vº‚§—M2Iëùé¡úôïÊ ¡_VöâZi +šýWÍpÓbó>S:2ƒoEK×+x¯˜å¦A–A÷¥‹bŽz_Ü0 !ôëªü–ñ#o"ß×I%yñ9t3wÏVfzºÆvíú ïnÌIÚõÍç8Óö®æbmlÚ¬ûÜ­³ ßÏ ¿;9„~QuÛ‹k£aª–¶­.Kú®¨Éágó¤ÝŸiÔÚL¾d½šu3ÕìèB|c@臕}ãø±7‘ïì¤lë¡£ÞþÞªe± 7{SD€ îyTqŒO}-M -M -½¶ë"ùÙ‰9âÈ¡_UÝõâZi ±‚F”Y¢( ¤$" õy%)’@”oKR€úVÒ·~ùÞN*ç8÷jØc¿E] ²ïoèì6ï~ @½õÎÐŒŒÌ¬Ò/Ù±~,E„~UuÔ‹k¥qï)Ç=yŸ'=Ï¥¼|£æh¦H—W“‡¢Ï£âœO‰EÒwŠÂÒ¡Úª‹7‘oê¤å1Tm=GÌY÷ûÛgœ?þ¾˜mÔÖ>\x–…#€ÕRÔÐØÕŸÿoÑÁç1‰‘÷¶ÿ¾)Ì|ÔØærlc÷v*¡‡N‡ñ(ŠuvÍöŠ`(é3=‰HÉÌÎ)¡E„Æ7tÒ2ø!{Wï8û,,>55æÍµkáb];&]¯÷¢¡Êw»îüëO ñQoo^³ä`„ Q~.„PY[ °ìfÍ3½2ѵ…ëýü!¾§æ;²œ—ï*¿¯«©¾…ó”gÜÙŠÒÆ*í/l¹¨S3ç?^ã†5„oê¤_ÐØÌÔkëF¹·læÈíï“ÒkÇÑéÖ, ©uÚtãÈ• º¹´léÚgîQÊÆªxCB¯~î0$Ôû^Éì+}̲š2·ô)¹Ö…&Ó€¦Ùié…1+ÊoM×ôX~1tyéò”)ÒÿœfŸ|;»^FUã[:©ü„)¤k¬&üscBáØÆ=–ùõXVOÉ"„¾~!B!$ë°@!„d]ã}£q…+¡S÷_yŽ¡†U÷½¸Ö¯@ÕAƒ7v ¡Ò¸½¸.«ÿÓi©)u!TKþþ§ë0vd„^öâïPgÕÀŽ»ê*B¨±`GFH6ÕY5SW¡B;2B² ï)@!„dV!„¬Ãj!„’uX „B²«„BHÖÕñ§™˜šÕmÀ_ ÎÖF!Ô4Õe5`bj†¼Œ5úر£B!TQUX |U‹N£F~ôøqc'ÒáB5"üž‚††‡½*áÀ B5"œEˆšéÀIcgB2 «„BHÖýRÕ™¸wª·3—Ëm· €×ØÙ „B?‰­¨œã¹Uê±5LP«’$¿¡nCŽ'Š«z.õÚ–Ã ¶]ºsïæÚ6òu›ûwäS;M9=ÜmБxq…Çåam„B¨–t!¡Ün•ß±" ð?ìš¹!uøßk<Õ [Ó”õÃáÅÙqÙ4'}UÅÚnBŠDÀd6å2ýò”^ÿ{k0éÔ©)ßò•ÖF“›)s¬61èbïÓÇGâôT„ú‰4ì®dlmggggggc¢Â äõ¬líììììL™A»gôíÀår¹žC}›GU}qõ˜nm¹\.·­ç …§ã„EOçÜ%ü´­Ÿ —Ëõ\õ¶øsd*ïöÄvcý3…/çyp¹nóž¡'–÷jÃårÛõ™±ãAª@{p ëà~›'÷lÏm;tÿƒ}]‡î¿~p^¿v\®kï9GBò ÂN.Ü‘Ëåv´ûe. ÂèS+Æ÷íÈår¹Î]G­ðàQÕçSW$©üC•¬´Ó®\úT»Ñ“ϾÔFÊŠz­6!E"ò{’D!ô“k§Åd~À_SV¿6™¸ÃÿÒE¿U^9ÿþ¾ôZ:)I¾øç†§FÓ÷Ÿ¿vý’ß–)t™„B»mgçY²,æ^xýúõ½U-å>!Tºxrh Ëyëƒ×¯ŸmuU 3n¯˜æd1Ã÷Ìy¿uÝx§Ì<Yr@EŸ¸ÂwèÞË€ÿF3@uüß—¥‡NíŸo²sî¼ùÞ9Ìõ=}p¥kÒ¡•¾ø¤ˆ0ï·xï¹Ë—ý÷ΰÙ:wÇ;TŸO'Ý9ûÉtܲy.…·Î‡×ºÖh"µ¯r=WǯB¡:ÑøÕ™ùÀ÷{Äš¹½[šéX»_6V'èL@–(?9nèìêh¤­¥oѪsw}æ7„•¤Þ?ö”ÑcÅ¢þ-M¬=¦¬žfwödXÉUÑsÎWm.'Ç Ý,ìlmѲϤ9አwµ1oî=q¸EîëÀt1plíãjg¬§gÖªïÜnÅïÄ~ÛÉúwÆ]»l3¸‹Ë`7Ñý3ï‹j¹]Ó¨šçT®çêé…B!ôCÿò® 9(ŽŸðnˆÛ2+š…¯C IDATRòi]{ °:³ºwï ;¸¸uòîêl$ÿ aÚ‡d0a© ݆¡å䤖[@:CÇ^Ÿý¥-C×ÑHzVÏPÔRdjÛK÷DWÔV$Šs‹I ³_Þ¸íä£Èì’ùzœN’z~ýŸ.^Íršå®EWTäɘç˜ß¦ƒò÷QKj£]‹ú·T$ÀtÊêi>6v…@imej#EÓIŽ óS\î3ÜU…‹‰Ãÿ»u)0]ìhÌàØ k# ­×wî‚G÷Ö݉ëd_þÕ|©çh ­¥oñƒ/B¡úÒøÕP$Es\uí`/ÍŠãÿ½áñòÁÃgÏïỿÿ®K\êd—A+sP%hôÏKþ9( Èœ«çȶùäîÖÆªþÛ½æð¨:É¥zÅáço9/uQ£ÈÙõïª0õô‹œv]Ô¿c<§Qj#–ÙÕs!„Lã_)`ë;CÔ­ÀÜ*&°Ñ•Í]ûŒ›¿á€ßznέ‹á|‚NŠüúd7–®ƒ>ÄD•ÜZ'ÎÎQ¶4Uú¾Xœ)²1ÌÍTC#$¹‘Qùé3µÍçÛ½?s'#ÿþ\Ï6\.—ÛnÔñ”¢§ŸfÖý®¾³6Jë°òäí'/_½~äÛC™FUQq¬Çÿ{ãôö)tòöÎè?h}@>ÎRD¡¦¨ñ«š–×”^ŠÏÖü±ûÖûø”ä¸OÏîÚâ-Dúí8r3ðSrFFBȃÑb- M&Ðõ´é©¯ÞD§gçæó$Õ‡¥ëxŒj'ººvÓ…àø¤È‡¾+÷D™ j÷ÓüVDìý×b Šc®l; Ò#f­óùVTþ›ÓÉö:ñÙ±­CuCý¦~ÏN­6ª¢žC!Ôä4~54e×Å· Sz´aÜ€Þ}N^w!NQ_™N°˜™vÏÚÇÛ»ÿÔÓ;­Ø<ÒŒ  Ä2©EÌæá=ºvî·é] ³ìiZ]Vÿ3¿ÙÇô¾ägðæ­ÙÕ·¯9Gín.é·¾oÇN]. °ç©RrÓ^­óù6d΋Ó”ó ÏfVŸÙ¹ôéªqæNÒw|ÒQ£ÔF¼*ë9„BMOcÍç®øªt‰¥ï1}›ÇôòM4­>4¨Ò†„¼Ýè—«üzN³%7Ÿ•Y¦)9[ç7l]ùVLÓñgŸ¯f‘¦ûÛñg¿•îKµë¿Ïº–¤hÜ{•_ïU¥ÛñÕ|~™ùôôk¢Õ¦fe?G‰eêÕIóÈùëqƒú|s@šV—Õÿdo\¿c€|`é;Ù¼n¢5@ô=ÙÑ´»ý¹äÍâõ};®STÑãþ6Î3ÐW: Ä2©Å›‡÷XʽþÙíù`÷¼]É…°tZô.©çB59ĬéSwìÞ“• Õµóññ ®á;gMLÍð»zköÕ×P–ዃBu®æC³’’$%&ì÷õmW B!Ô¨°@!„dV!„¬Ãj!„’uMà³eŒ‰©Yc§ÐíØ¹«±S@¡ŸŒ{‡u5ù«†3þ|‡“–šÒ؉ „úé­[·îëj­.«‡Ãçã‡ÍÕ_„BMÎ@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@¨–òÎêÐmý;~ìeC}ï!„ÊÁjýì$)¦¸r¹ý÷}ÖÜÊ»7½½÷¦Á÷íG˜'1haÀªøY~qó¬AÛr¹\®³gßqËOF×J…4*,J„u×]M+í!„êVèçFå¿Ø³÷£¡3í]üWΧ…‰¯cÁŒkô}ZŠÿ>KÕÁT±BŸ)?0ĕ—êý–ûú>ydÇÂöŠt¢öiTX¤k¹Ïúsrke왨J…Oçµã¶™p9ƒ$ŸÙmÑK^=ï”Ìwîôó Iù•yÁÇÿÝ»k×.ž;vµéUU‹ÍË>Eûæ-ªßäQ-á{ú© "Žm}n»`Å IÜû”/gädQä¥MÓvjÃårݼÇo}þéÒ¸vcN§ó_þáÕ†Ëíºá]êÝ©ízlùðù”<Ño¨ÛðSÉQü¥õÓ~ëìÂår¹î}_@“ß%€Qsý µDQÐÁc‘f³·¯áádmnéàâ=fáâAf, óÞ\=¡w{.—ëÒcòÖib 3/—M£ËüõÃÊeõ>ïÃæí§ÝË£€ÿ~C÷ö“Žœö™1°³+—ë1zË“lDiþ™Ý¿=—Ëí:y×­³“¥?ÅûxiÃä>¸\.·G¿Y‡?~e°ý|„©ïäÍ “®¿Î!@ÿ&]»µ!ûû‚‘²v ùá'ÞÉ-Wä’iW—.¼ª7çØõ[·ïÝ¿qhIo ùêŠà²›—}L×ñ^µnˆ óû²GuŒÑØ ôý$É—}ÎË9ØÅ2çrÖûØBÊF Š#Owú-Ü4¿‘ô$ZàϞƒ¡ýf¦.»úw%|ð‰§ è•Üù oSä,­Ôè@åõ\°s‰‰Š$ùé¾%›Wžhr²9£(64G£…I…w+÷­h¦EË UzÃüPƒ¡x±ïṙÍU9|=0¯{Å´ÐX–õ5:€$óùõ;o~Êç³F¯[3ÂNž ò_ýýÇÖ'éE…y|õN ¶-éªC‡âÀ•W»Ø RsÙÎ1½»¥ÂV„ë[×ü.’Dê=·øNfX°ìV:#vÞ„ –#×.õÒ¢@ñ§{¡,î U:Ðäôíí ª4Ÿ—nnìb™v¦4Ô²îfîs>´Ïœ÷zÙ€uT§VDfJtX¦Íœ]vÖ¦ƒ0éÖö•»¦Ó•L۷ͽ—9ëôº6Œ ¹Í´ÿÎBU†Õúi‘¹Ïvý›Ùsó@c&[ÎÉ€zœ,ì¦ÎQìÉ•¾=wœZà¬L}}óVdztX¾VGCŽtÛ˜Ð\ͦ Òƒ»(ýÃ'‘ÞH6MÙiÈ('éôz m¿^L¦Ìɤà$ºñ(Ý C„ªËä‘ö MòGžÅ![G®½×i¢9-+,"[âÔyñ"75Q„ïLŸ [u§=Ù²'cÈás^ê4JTXD±X¬CüÙ÷m“°R‹nmÅËÇéèÑÁ£[o¯æš,¨: ˲›ç? { /},I<~„e?T‰&Nýð±€éÑcÞ´f …ç<”ïÕU.âÀ‚½Å“÷_ì¤YôdEÿyj39Tîƒ ¹5Þoâ„ÕúYñÃn{Ûrî {9P6·SÍ Î'µÄÑ—ÏŘö©pí]ø6™ij§-–&%ÒŒF>¸'g(ÚX¨Ð€,øpa÷®ÿn½ŽÏ/EÕ¯Æ2÷SX¾V{c¹ŠYÐTÛÎ9rgtÔë'Ož>º}hééCíVžÚÚ-ïÊÅOy)«{¶]ý¥©Ö9z…4*,’ùŸÂ µ:ÊIGvõ4–¦(J‹Lí>ZTì‰+ÉVcûZ”dNc)°8ÆÍtYL¢]{½£ò¨§w×î=:·ÔãÔ4{ýŒÈ¼OŠ 'èi8ô0Ýrí]–nP’’£™‘ÿbÿ©¨l£= ß%Ì•Óç·|÷_y—)¡EqIr384~üÛ¼fS'º¨Ñ¨ü—UlE°Tu!ÐwÓî¬n;··SgSƒ’U[˜”ÿÛ§ëtÿëŠKtà³'®ïžxèúª3Û½9U,·yÙÇüø·Yú= XÀO*l>q¨£¤° €¡¦Ê†‚7¯*?ÜQ› hfo` d­J#$•rCu«ôs'^Üü_|9¯ó­Òu*AI‚>š‚¸÷*Žå‡É%9?òtº—\a%ó¢Â ´Ü?Ÿ’§ňõ:ë³Ä‰gæLþ‡1råžUÎæš â U½fg;ê°@œÂ0uЮò'ÁR·rëcåÖgÄ€}C†ì?˜ÓŽñ>K¬ß™™ÖÞ°$ÉeÓ¨ƒ’?ïEœÂ4oVR¯P¼„÷Y*öæJüØ÷éJ¶–*%•Yÿ±P»­1Vë…§®õxtçö­K›&ï90ü ß¼æò?𠣦Gø&M£¥±M¥ewÃW^¼ÏÌ×iÀ¥½×±yÿD³2ŸdúÕ¥‹ï¸nÙõ‡wxÔôx5:Sß%ª´qP¥«Ú Z-ö?úôþ­³óø;¾g°~at(Ït¢fåƒCÕܹ‡¹³‡mv¯å¯“ª HeÙœ*J˜ú.Q¥¹‰ã‚UZY* L|“®ÙÚ-J Ž•sœ(ý3/N ÉÓëdÀ *æf€G°ºƒ³ÑψÌ~¼ã@š÷ú#'>;²Î[­ <2—Š¢HA!¿Âü(Aò»T¦©MÉ[š0ãc&¡k¥)=Ô cïÞKQ¶3S‚ŒçC5/ßÉF[Iä_xœ§ãd$’ÜE:NFœ¯¤%(œ–‡JRš[y²tù4*,Jr¢>òt[r@’Åû²GQÊ»DÊÐIEE‰ŠE%?(þÚ‰÷`â Ã XÚŽ‡ÏÝtxÏPíä×áyµœ"†~’¬ð”¹½&hj\o@_¿õ&r]Q[.åÑ“âœèˆ,1€(óC¢BkWK%š$óÑþÿbu¸Fl x±ï Œ›ë0 Ê­„Yq©ÅLGÏÁG¸ªñĈ2£r”Ì5ËáɼÐ{Ïb I øq÷Ï¿e´ö0eW°ÜæeS¼Ø÷…FŽºLŠRdÔL‡ ’œˆ`c«N§+¨³ò>Æä“@Ùú€ÑÜL¨"7T‡°²B?!^èá­Ï ÇörÐÿ<@ª¶Ñ§%ò·´ó°*Þ¹}ï­åƒš)'¿N±Ð×H‘D”—n¥ÇQPæÈ©Ê‰“CâxŽ´Ä»Û—I$š°T”h9‘9K-^ŵ«®åÉurÐf‚ 1(•maWáôH’|~áª@Û^Ý\lõ$™÷ÿÛþ_†í” -•20SËÕ46ÝôVoŒñl¦Ãºn%“_­˜ÚëGÅPv¹v¥ÛbÀ`½…‹¦GXi+˲õZX(Ñ@˜ü6U£•tL¬ª­T³_øÎÞù¦ˆÉfÐU[ŒZ5ؘ  ß¾kñôßnÙØü×`c&…1O|÷­]ZDgÒE Ï»gwP¥*U¤Ì2›oìQúx͘øõVÆlƾMÕh-MI˜©ÛÑ tÝn3¼¯ý9¸ïaS3+=Báµ>KRUn¨î³¦Oݱ{OvV&T×ÎÇÇ'((øØ±£Õ5015KKMáóñ#ÔP}ÇûrØâïs+œ¿\/\ÙsrØØs~£É¤[¯Ú~îmº˜êvÝçüµ¬‡>÷áð ö¤“Ðü7t'mþ}Å™(BËÔ¡S¿Öáÿœsð=7ßžÅÿä¿bÞöû™ º&Ž]z=Üùr ÿñáºÉdž¹ÖÿÌÃôË^d>?ò÷¡«ïãrDLu+ï‘Ó&{[+ÐD©÷¬ÝæX ÀѶqé=cÉd7 :U>rá_¯®Êž5´d/â„r{„nê7%váÕÝž*PrtÙ➦RêöÞûûál¼°Ê4ðïåÛ®ÆåЦfå1ä÷…c]´°ÖG?+‰PD°˜4 óßY°ðß9•æì ¯—ÀÄÔ,.6¦ºg•”” )1a¿¯/Vý¬¨üç+­ WŸ_ÛV±±sA¨ Âþ™ºèV‡I‚ºË¸e¿{ã„U¨ÛjÏú‰ùï.?,vt¶R“¤¼>³mÝÓ~­±@¿¶ÝôC—¦7v2«„~"d~ÔãÛÖü¯€­Û¢Çïû~ïgˆ!ôÃð¡ŸÃpÀ–‹; „Ð/g#„B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!YÇhìP=òññiìª{;v©°rãÆ’ BõgÏÞ}•ÿÔë V¿¸  àÆN¡ºäﺺ§BBB2„ꕯïÞ†ÜV¿¾G7v U+-5¥ö \sƒ7oþX:5ñq 4* …ÕB¨‘éèêÕ¦ÙìY3ë;„dV¡Æ÷M#¡:÷SÝSÀ Xàî¹"רyȤÂûcL-§?+q¿zív|5vF!„êJW?þÞžE£{´çr¹\®G¿Éÿ;ú,EH5lè‡Ðä­ºö¶SúúŸŽ8n'ËA3ñ÷‹BM\ƒ^)à<:}ÌÎ(›Ó×Ìq2¦G<¿|bË~Çã+ZÉ5dèGÐ4Üÿí^‹†’ôÇçã­GµU'ê='„B?¤ÇĉÖì~o:ãàÞ%C;µ²³¶ujßwê_ÿžiË BO,îÕ†Ëå¶ë3cǃԒqh2/ðàœ¾n\.×kôúë‰ÂÒh‚„Û[§÷íÀår¹žC}›G%H¸½}æw.—Ëuí>fýÝtIÃý„Mœ |ÿÔ­Mµ45´tl:Oÿ÷}!Püf‘½Þ€ù%­ ï1³žÀ2ûÙ¶a­ 55´¬½æŸ‰áK”¿R@æúNñ°ÖÒÐÒ4hýÛªk_~Ed΋3M´Sù´ÍE¯ÝŸ;öjam¢g`×}ñ…xi#ŠsqÅomM5´45 º,¸”"~Üæ¢ç¾ÙÛˆÖFš-‡íx“›ì;©½©–¦†]¯5²ð÷‰Bu¯áªIú³KhÎú[°Ë®f(«ËÓÈŒÛ+¦ùYÌð=sÞo]7Þ©3D ÈŒ›ÎÙç¼üèÅK»GÐýÿ~&3@æü5eõk“‰;ü/]ô[å•óïïK¯¥“@æ=ß0aÉ%ð^}ìüåó‡W²•¦þŒÑlGn¾øâmÐÓ :¾Y>â/‹jh.I=7}è†(÷­wÞ¼93qpå½ÂJ¯¥$õ´þË^Ø.»ðòÁþþ…ûÇ Ú"­¨¼×þ¡º½=ôè ŒÜFeéݰ¸¸—[¬®Oº-Tdö½ÞOÀ î½|ûúÆÎ Í( @¶Ç'²Ó¶¯¬mñfÍð£¼lµúÒã뻼â¶ÏØT\//j«ÒØI!$®eDf€¶‘|åqcIêýcO=V,êßÒÔÈÚcÊêi–qgO†KRïàôýsn{}Ûn³—ôÐ È̾·Ø#ÖÌíÝÒLßÀÚ}ü²±:Ag²Ä÷|¯ ;¯^?ÑÃÎHÏÈÆµ×7m¼kâ3¹fæ ÷t272²v¹zïÖÅH~µ­ÅIW÷Ü—±cÍà¦ÆÍ®ÜyÛàØÄ˜÷÷O¹ƒSB¨q4ä¼BÎfÜžFw>¸ät¦@Á°•×ÀESåh¬.«ÿÉÞ¸~Ç„ùÀÒw²yÝDk6hw_³5iÅê1žÛ™ªúÜ~#¹¯þ )».>¸Esóî ãŽp´í\ûLU¦MÅméu»Öï^2rXš½ÿpÆ9Rt½Û·<™0¿µù<%uÃcçôz¶Yz¶®à¼|ïÔ 3ºšn`kÛ÷ž5Ûã¶tƒ{ŽÇϘÝÕr%Kݸý¨íýS)¨n¿=ç2Î[ÝÓ9ØFî“û.päˆ^L¶âüeJËnÖ<Ó+]§JÔ[ó=5ß‘ Àöò¹¶oͼµ=7ð¥ÓjøÆŽøËB¡FAÌš>uÇî=ÙY™PPPP];Ÿ  àcÇŽV×ÀÄÔ,-5…ϯ~’:jpÒßZC‡!™z²ëÁß_kHáÇmîî'¼¸3ɸIÌYEMLZjŠŽ®^m¾§`ݺuAAÁþþ§utõ*éûÆCBBñ; Ñ/#>.ÆÎÞ±òŸz©¯—ÀÄÔ¬†JJJ”˜°ß×÷§úžôS º/^â­[ÍÍ !„š<[CueÜ{æ”ÆN!„Ð7ÀjÕ3–ÕÜ€”¹jÊfÏšÙØ) $ë°@5¦Aƒ7v !¬~uþþ§k3? ¡ÆâﺮBùúî«vÂB¨X üÊvìÜÕØ) Ô@öìÝר) ôÃjàWVÃ%ýbð¯¡w"„B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:¬B!Y‡ÕB!$ë°@!„dV!„¬Ãj!„’uX „B²«„BHÖa5€BÉ:Fc'€ê‘Oc§€PÝÛ±sW\lL…•7nl”dª?{öî«ü§^O°øÅ7v Õ%ÿÓÕ=Ú™ T¯|}÷6äî°øõ=zü¸±S@¨Zi©)µoéßÃ￯˜ø’ÌÇÛÇ»Ûêhhij˜¶î·ì\4ŸúüÄ–ám5´4u{,<Íÿ²Á7­G!ôsjూÞb¡ï±ÿíhÅ*û,)UwÌlºDñW…š ôÒ£oyû]èwŽ¾Ê£ê2¯JÈôKÓ‡®{i³ðì“—··÷Ì;4yØÎp€8áøøa›c<¶Ý~úÀo’¼ÿ´AëyðíëBý¬úJ]ÙØÆ®„­…Žœ$öà@×Á;ü6OîÙžÛvè¡X‘ áöÖé};p¹\®çEGßæI 2/ðàœ¾n\.×kôú³gf»{®ä?ä¯nnÓ–Dç,èØeuP1@•qD±ºþçÜîÙ:¹p=G®»™,Jp{ûÌî\.—ëÚ}Ìú»)ñ'F¸ôÜ&(‰Må?^èÑqÁ£üòÇlqÊ£ë [k|ý•ä½Zê^~pdø©d °L<¸Œ7ßÔÅ+\-aJ`¸ÀbÜÂQííÌ,[õ›¿¨3öE¼„ŸNízª2êï•[Y;zÍØ¶²eâÑ^|óz„B?­¦0o@}â {Ü¡{/þ¡úú¯)«_›LÜáé¢ß*¯œ_z-2ãæŸsö&º¬8zñÒî‘̳;žÕ|2JæTGº»“W˜cÜ~þôÌ­;k×ßÏ&Ì{¾aÂ’Kà½úØùËç¯d+G×õìsóbD±4bîKÿ´ƒZ)ewDFiL6ƒðÅ@¹ê™}ÉÐU‘ÖœÑ^·(äÔÊ…ã&ZÜ?=¢¾ö‡Ð÷([`)€PƒièÏÎP(]AgÐJŽIÑW];ØK³Ü%Œâ@¨z†DÙ£'E‘TMq@ D¹uUMlB¹Õàô…g³ “΄kõZjYéÌ&¯&Oçó%¥× ÊÿŒ¼"”Vdæýõ ŽÃˆýK;•Mäç Jʬz+¨ì{ÛNdzÝ<¹³*Ø[m¼ê±ëxä°©újD~r®@@œ› *†ªåo[Ÿ\ꊴ ÀR¡†Ôæ |ÁÖw2†¨[¹n-`éÚëIb_ÄJ/á?îeŒ äT䀗[,m/É‹O-&kˆSý~›Ñ>T¬ š ê,ÿÊïœÿ™þ=L+…3Ô­LØÙQé¢ZíGwz銇¦s}¦6W({à—äÆ%‰tôêï2%ðÅ@|©ž(Q±ˆRrp7¾».‰!Nù0Q±…‹û×ãeT‡°@¨5­j€¦å5¥—â³5ì¾õ>>%9îÃÓ³»¶øG éº#Ú[ý÷ÍðääÈ[»Ö_J—ލ³ôÚ´RüxæzT1EÇÝØu8’"jˆSý~='ugÝY±ìà£ðÄÔĈ€+瞥‹86ý½U_ïõ‹3ëßÕˆYŦòÖlÈÈW‰_ŸDGñB}çor[¶ª…B¡P(’ePEQÏ“T¸.úUí ®Ð4\ú6ç__üöî;®‰óø“„„!à`ƒ CA:SPÜ­€£àÞ‹¢Uqk+ZGq´J©£¥Ü{U+ò«ˆ¨¸(2TTHòû#¨Œ\Hä>ïW_}Éåîy¾÷ÜswßÜȳzÿÇé) 'Z’©3ð«Ž* Ïù}ßXäwôήìZìwÇhŠwo "ëtøl5³ë»LMû•á[µ‚7Mß_DˆŠ®µ½›—&‹0u‡­ß‘íë÷ã¤Ã< +·oçÛ‰wRë>oýÄUë¦:‡p´:œ2¥÷?á’Ê¡¬·µÃê0ÿ Á«&í.'í.®ËíD_¢9f#FvØ¿[Óc ¡ØÅ™íúŒéz5ËËÊBò×cAARlº 0}Û•5U“,—<8ÖYœtæ¾Æ _,Udn/Y°-fü=ɺõî}—¢ldç¹ãˆŸ½:!ÄdbxÄ‹ï–.´·”©Ãºëðêžj„%§ÀçJŽÙ£õà°[ƒkMd›Î8rsFõ)ÃþÞ;ú{×^šÙ†;;ðälÑ%qKƒÞOo×{Þ¯çæ}˜oüx‰åÔ¬NÅvÅùª¢S6º$dè’:aW¾Í-Vé5ÓQ‡â2 SËiÖ µGO]ÞUUÌ:ªq7^»%úçØˆø±u ¼ú'âŽá„½VM› B8FÃ~84쇺°´–ýùï²OžŸ§æu§ yV–¼H:ºë<ÏaB_ ¿.¤Ö}öbçww2JT‹ ÿá£vc—lßÌ.Ó}àD­4Þ÷ëùÑ|ãa¾ëZKzÚŸ©ã²ôdžÖÂÔrZìçÔÐ¥>Ýç™ ¨õÙsEµÜˆoòZhoÁwóÝ}žÙ´žŠ ´tQQ‘/žç*: JQQ‘UThhHfFZc•@+ÈZ²ÀAõÏÐ"ìùUÑ!|Æ ´déøžtÞð)ð†!Ý! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt§¤è  mÛ¶MÑ!4¾ÀAéiµ&nÞ¼Y!Á4Ý!¿ÖíêMÙ@ —˜xWÑ!4¦¨¨Hª’’È3€&"Ïê ´|1ׯ+:J/žçJ?³‡‡§äÎ_¸ðiá4™rº* ‚lLOß@šÙ|7¿©# -d x2]!€F×<Þ)¨Hc?᯾œëåçFNpðØŸY)çzš9g²Ì+»WLùª—ËårûœóãØ\žP¾AÐUEö)ß)Ãí¬ô´t´û§U(:h.äš ”ýwÀ{Üò?_ZOYz0â÷½¦÷,9»uOR™<ƒ /aE ðߴիk*:hVäøÜ@å³ãëƒï›Îû3dzGeB!–»õûzž2yI?ŒX¹pÏå´ÍΣVü´|¨!›ðRÿÚ°!âÚ½ìw„ÙÎzØìV~c¥Æ éáãÆŸ¸Ìùñï‡ÿÍ|§ÖÙ]4?ÕtBHyÖ¥àMAÇþÍ.%š§­\=©Gë©°4õdÀ»ÎãÜÂJ¢öáOŽÙˆÑû¹ºwvìã0`ø;꼚JRRÒ‡ëHäF~Ù[ÇR‡œyü¬DhÉwše0Y&3D($BA~´ß’°üñ‡‚{™´Q)»ã;bQ‰ðãÕ ‰rºP dÚ®;>B»æµ~µWœU,gì=ßÿßèk±7¯‡Ì Ý3*èÏU}4›Ç˜t"J È“üÎv,]WëÊÃO¤ñªO®,|S" X¤òybr…õÄñ¦mU˜ ~ArJaƒ~‘@Ù°› I¹˜P@UÑû5Ííݦ/Ù±‘›ñÄc¼ë HäLŽß}•ŒFþð­ÍÓÓ½~м–øä¿'woœ Y9iZÐãrª%´:1Ò¯ÆçUaiÚéaɤAï™:çŽP]¿<øâýÌÜœŒ‡7ŽmJ­‘•”'Gî¿ð4'//+)::µRÇB»¥=8À/LKº{÷~rOX’ýèÞÝ{Ÿ½«'A:çs U«é»ÿ4Þ¾*òVí{³b®­*É»SwèšU·WntwöWomÀýfºKBhƒÎ^LMû•á[µ‚7Mß_DˆŠ®µ½›—&«Fpö«èàÅA9ÅBÂÑëîê0ɬ¥eE× ˜+ú÷ž)CöÖ'ïïrh¥Ø¨@áäü!CÕtð¼€ÁójO7qäæŒ©Ø®8ÿèŸ&®ë"\×}ødÆDÉó«S•C8†ý½wô÷®U¯gDlÕ˜h¦~¿y4l­>m\Oå½RtÐüà)9ºC6@wÍç÷€¦|7_Ñ!вP$OE‡ÈZº¨¨ÈÏsëŸ@A¢¢"«¨ÐÐÌŒ´Æ* €V ´d;ƒ€œìùUÑ!|Æ ´déøžtÞð)ðNÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt§¤è  mÛ¶MÑ!4¾ÀAéiµ&nÞ¼Y!Á4Ý!¿ÖíêMÙ@ —˜xWÑ!4¦¨¨Hª’’È3€&"Ïê ´|1ׯ+:J/žçJ?³‡‡§äÎ_¸ðiá4™rº* ‚lLOß@šÙ|7¿©# -d x2]!€F×rß)àçFNpðØŸY©è@š»Ê¬½ý ú>­hº*НN5íèû®éj€O!×l€—{-ØÇÓÅŽËår{»¸O]z«@ Ϫ柟Áë«íÊU“âeÛ0ÁÁRWKG[Ë c¯¡Ó¶\- LµNÃ<‡[kÈ£+ßœ¡Ý~Ò•" óT¦ÿêdà´+­ ³¨IŽw xÉaó–`ZþóÚnú쒜ǷbŸæ— å@M ;ë"¾ãBÊÍßô|Â/ë]Ú1a*k›rU*O øfR0gʦ?ƒìŒ8ï²î]¿üèU©€hi9­üÅIÑÑ€ÉïÚÿe|L¦æÐ>cºt4·ìÚÏmærŸ!ú,Bx©ùÎpwær¹\»!“}£ž” !¤"=|Œý¸=çÂìËåÚ».ÚŸTXôèÐjOg.—;dvð¿¢ë éácì=vØ4Ëu “½Ã?]Êóµ²<ëÒvowG.—Ëu»âÀ·–†‰¥µµµµµµU‡ÖJ 5ƒN-57L_|âaˆ^_ÖßyiL¡PB-uK–OƒÊ¨2÷ú…§mFoÙ0m`O›Î¶_ž°xËúQí•jÝ)࿾0®g{m-Ë‹Û;Vt…Ÿ÷ߎ>Ž÷o÷eG-½ŽÍà‰Ê-K;±f×DKG[«“ãôqoø„BobwŒï%*gÉá´²º‰/³èò¤>?<ä=òåjkétšW"¯ 1ùeLu=mNᣛ øµ>T0ÌG® 9zêTTÈ<ˤí>÷ÞŸ*RþØ›ÖgõoíYb´Ógñ’M÷ºø„F†¯µÏþmmèÃ÷瘊´Cç5½^Љ9¶Ê4ÚwQø¼š5Æm™ëßaV`ÔÉëæï]¸úì˺gm–Á@Ï.ùN<)-VðoÔÿ˜Ž=5TµH[²â±4Œô8‰Wð$?'jîøíÏï¼’pûèBõˆ WŠ?\¼á==¤¼à죜ì›~'-9“' ‚ü«+\Ät\yóv|ôN××;ÆÎŽÊáþó£Þã6¥8m¿|ûöao¥ðµÕÊ©®n™­ý·Á†cíŸóêuÞÁ}Ô¿) Ù²GÑAЂü²F›~K—,ûmΠ¾C<ç,Ûz2á%OH!*VžÓÜì­M Ìzºû,u(½~9ýý{u‡¥+<í,-z¸Ím”ÿX}æŠ öVæ]‡Ïš`QŸðòý‰MÍyþ”žm˜„­çìåeuôð“ê_F¯¢C/*O\ïãÚÃÌÐÈÒiÆ÷Óôǽ®{Òfj;ŽíùîïcK!‚77£n«¸ŒùB²–©KV8†Ö›ÜJvµ2îÜÏuÊ’Ÿþ¸™S^ë]™}6ôŸÖÓ~Y7ªk[·Õ“ŒÈÇY´G­›ç Ãf¨˜»Íufß½˜\Êq.à¨Ê·!Æ÷±41ýb˜ÏöFqû®æñ²Ï쾪:1p½gwS“®cÖŒÕ%âo Õ-³)Ûš»¤¤¤z§@Sç†Ê¦£·œ–“÷^âÍ3æìš³/t¶µrþ­}›wŠI~ÿ­Ue@_”¨(éÛ«ŠU×QgëÚ˜¨1!„¥®«Î(-(ÂÍÖ^4a¶6·Ò,xœU"ÐþPqyNbFYÖ½±aÕ¢1Î-¬$:µ`¶í3¶OåÚ#w‹{õ.މºßzèB›÷ßNÅÔ’ÿLê’O¥ÓÔßnÉHøçŸoÅ]ýËÇmûÞeN/ëòq^ögÌŽK,ªÖRŬo'åˆ÷rt;ëW­K][¥,½DPžq3¥4í–£aõ@6{–ÿ.'!‹iµ¨sU¥fåÒ™sL\HbÊl´Õ…ÏSRRÒ‡ëHäFÞ¿7ÀT3ìêäÖÕÉmò, ÏÉû÷$Œ[Sî·$,|À¡à^&mTÊîøŽXTòþ‹$ƒÉb¼ÿ'ƒ0˜¬÷×2„ᇯ›BA¥@Xíßµk „LÛugÃGh×{-„¡ÙÓÓ‘µìp›öÙ‡ëŒXÝQYb-Ò—Ü,°Ô;|9¬Ã—Ã&Î[:kC_—7¼öu–rY“Qí/¡ V¯÷ÎÓ«±ú%7 a°Ø¦1•”(šG\™@w¢„©€<)îÆÑéЖ”½+ËML®°ž8ÞÁ´­ “Á/HN)¬ý`A½øÙñÉE¢³såË»÷Þ¶¶l¯VmÍ” »™”‹ Ò½ÎØê Aj·"ŽFNkïþUµ× ÄÔÒÖH–’›e} mRVP\YíüË1ìnÄOùçiÕåú²ôÿÕ¾™P³ ãÞæäáñØÚwF8F=Ú“ÌÛϪî÷ðrî¤Éðò“Å B!ÒZC* gòË/άðö =sçIjê“Ûç]·ã³ëà.m´;1Ò¯ÆçUaiÚéaÉ„QiµTÜ ÜrøNÖó´Øß6„>55¦³JµO™:çŽP]¿<øâýÌÜœŒ‡7ŽmJåQ¦b5jx›øˆ ³QCŒÙkQ“­dEâgÿ5cÌ·?<wÿñãûÿÙ2omëË‘=4ªµ¶’ÑWsú½Ý·èÇã÷3³’No^ö{6aêíÁ2p]1Nóï…ÓüÅ?ÍÊL¹sißúUáOÊ•Œ¾öê÷ê·õ&— …e)QBeø¹m%McC¥g1ÿ<É}õ&ÿ~< @äw§€¡aå`qåh¸oXN±€=Ûþ v/cÄaé¬Yu{åFwgõÖÜo¦»$„ÊúM›m1e†Ñ•Õc~Ê´éòàLK©~©i¿2|«v@ð¦éû‹Qѵ¶wóÒdQÇ11²ÃþÝš «Ï#®‘©db¶ùb`çSvxoË,¢jÔë«uG7L3e“¬3)y†Fd}»pÞ€=¼6]'­Zåøx‡E1Ûøéü~Ý•þK‡¾%DÕ ›ËÄ•mX„e0f÷™ó 鸖ÓΤßäyýbvIië~+—õž¶bÀ>¤í¸SwñZ@“c|çí¼ûÍëW„¢"Ê߈۶m[bâ݃PÍÐÁÔìÅóܲ21/–7­Šôðqã/{98Ö°ÑNÂ¥‰þ#çg-<¾ë«÷4E-MO´Õ<†!ïñOŽNϼyeŽ)Ƴ€¦òây®ž¾4ãøûû'&ÞŠŠÔÓ7¨;èûæÍ›“’` Ch123Ò¬mlëvõê=/B:˜šI(ACCƒ’ý,kOh(Žò5 +KÞ¾N=³ë<ÏÁ¿¯Öçñd`cÞùóÔ«/œºÜ{—üü¬›ßP#t€úšJã}¿žÍ7æ»Î¡µìÏ/|þÅI-]ô¢œV惼÷í˜Ú]ÿRðYûü³¶éŒ#7g4Vij}¶ÞˆoòZš/FÇçlTt@/ ¾›¯èèîóÏàsæáá©èÙ@K)ÍóYŠÙXE…††dfÈð6+|€l % ܤèädwȯŠà3†l %“ðb @ ƒÞð)è÷Ô„l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î Ð’¢€&´mÛ6E‡Ðøwe¤§Õš¸yóf…Ðtv‡üZ·«7d-\bâ]E‡Ð˜¢¢"©>JJz ÏHšThhˆ<«C6ÐòÅ\¿®è(½xž+ýÌž’g8á§…Ð\dfÈ骀²P0=}if[ðÝü¦Ž€¶ €âÉt…]Ë}§€Ÿ9ÁÁcf¥Â !„Rúàç1#ºWBHEzøû åð?±.Á˳ß}5çhrd$×l€—{-ØÇÓÅŽËår{»¸O]z«@ ÏdÆP5uÞ¿c«Om&ÁËË;Oµ;±‹štuñ³#Æ9Œý㙤̀©Ûf¿ì½ûî—HDEö)ß)Ãí¬ô´t´û§UTûHXüàå®ÝŒµµt´{¸®¿-m™ÐÈñN/9lÞ’ìQË^ÛMŸ]’óøVìÓü2¡ühf;¯5vŸ\LE晃:Lô3`5j]j6£³¼Üš×͹5£þÙ…% Ã~ÓVñÛUý^Zøäá?¼±:hYŸöœÂÌä·-÷šÔ%¿l€ÿ2>&Ssh¨Ï˜žj„bnÙµŸè^ê_6D\»—ýŽ0ÛY›ýÃÊo¬Ô¤"=|Üø‹Ã|‡<úuoÌ3A?¯M~£Yg7­Ý}1õ]»Ó7|k׆)ší\¿o{>ˆºœüªTÅzä² >ƒ Ùµª/Ϻ¼)èØ¿Ù¥DÓbà´•«'õh]ã”',M=ðã®3^ó KÓÌÉk«¿gVnää1QCý9Õ„wkõ°o/VÿÎl¹ìäÁ±†¬zK&•¹1粌FöÒú8™Ÿë×y¡þ÷BЮë7¢€ùêÒúŸÏ˜í)•dÇÈ>;ѱçôŠÖ—êÄÆ!„Ó¡?Wiá‰{EÎŽšõoŽéØ7R–À¨–  b6ø'pŽÛ9V”­ôêSYÐ’Èï; S]O›Søèæã‚Ú7º ó‘+CŽž:2Ï2i»Oà½÷'ÝŠ”?ö¦õYýÛ_{–X'íôY¼dÓ½.>¡‘ákí³[ú°ìýli‡Îkz¼sl•i´ï¢ðÿx5k(ŒÛ2×/¾Ã¬À¨“'"Ö Ìß»põÙ—5nRðsN¬ÙtÃØ{ϱ³çNFlë¨Ï®ùu[­—ßåX‘˜“\Z3MímÛ0¥(™‹ŸÜxÖÊÆZë㕊§Â2×GžŠüÙSéôê…5nÕwÇ‘Å9>Çãâã㯬ëšO›Š ·=ïÑͬrY¶D-¥Ž]+±ü2wó×¶ ;÷›¸ùRnEý‹4>[q-È/`´é·téÀ²ßæ ê;Äsβ¡Œjh' IDAT'^ò„„¢bå9ÍÍÞÚÄÀÀ¬§»ÏR‡Òë—ÓߟÞÔ–®ð´³´èá6{´Qþcõ™+&Ø[™w>k‚EA|ÂË÷÷ÕÕœçOéÙ†IØzÎ^^ÖYG?)«VµàUtèEå‰ë}\{˜Y:Íø~š^âá¸×ÕOÚüœ·¬övö¶Æº:†=¹9Õ¾¼ÀTâp8‡äžZçk±xÛÜ.jB)J&¯S_V¶1nWý: §×Âåßô410w˜îëÕ)£VÀµPÇÆPÑ5T.H{ù Ù€ð]vjAEâ¶=…¼täǾ™¿Œ½ýÁ§ä ”””Tïh ò|ÃPÙtô–Ãr’âãïÞK¼yfܽQsö…ζVοµoóŽC1ÉoªNî*Šø¢DEIßÖXU¨ºŽ:[ׯDA!,u]uFiA©€†h¶ö¢Ù³µ¹•fÁã¬ö‡ŠËs3ʲîu«qna%Ñá¼ÿ“c6bt§Ã~®®Çû8 >ÄÎXM̽xá»{!K¶§;mŠðìÀ!¤TŠ’ ©(å¶²RµÌ‹eÔ«“¦èo–¶­m›‚ä×"!6&[YIP^V)5D…!!*ƒ¶y lÇ Ý~ zpÞ切 ý{¨4¬D€O””ôázR¹‘÷ï 0Õ »:¹uur›<Ë#Èsòþ= ãÖ”û- Ëp(¸—I•²;¾#•¼¶Ád½?É1„Ád½?£2!ÂO •aµ×®U(2m× ¡M}-DÅrÆÞóýÿ¾{ózȼÐ=£‚þ\Õ§UÍy¯®n\ú™¸gõ€ª’¤)™©ÖVQZXÆ'DÒS„ˆM“I”ò”449 L!LU]]òÒÆD]T†²QWC²7íM!È@!D RyRܳãmIyÑ»²ÜÄä ë‰ãLÛª0ü‚ä”B™ß çgÇ'‰r€Ê—wï½mmÙ^­Úš)v3!)ê{‘¥inï6}ɦ°ˆÜü‹'׺xÏˈ\í{ÍÔg›W×V JVjשƒò›”—ÕnÆó³oÿW(Z†ÿ:)© VÀ„0XL"T+U|lü‚Œì ½.Ê’WL"5Kkæë'YïDù/çÁs¢eÖ®öc˜r„T@Îä— ^œYáíz<æÎ“ÔÔ'·ÏÿºnÇf×Á]Úhw2b¤_Ï«$ÂÒ´Ó;Â’pÍ»âNà–Ãw²ž§Åþ¶!ô©ñ¨1«¯eê œ;B=výòà‹÷3ss2Þ8´5*µÆ“†åÉû/$<ÍÉËËJŠŽN­Ô±Ð®~B–<]²=Åáûun„Çãñx¼ Pš’ Q³`%H¾õ¬ÚdÞí_Ž$f=O»¹Ï/$¹vÀ„¥n Ëz~ëvêË7…%%T± ߥÜÌnÍíSç ñø…iIwïÞOÎã K²Ý»{ïá³wÂ2t]ìÆ9¿|ÕþØ')‰'ý†>³š4ÁèC~w VWކû†å Qѳí¿`÷â1F–ΚU·WntwöWomÀýfºKB¨¬?IĶ˜2ÃèÊê1?å ÚtùÆ?p¦%‡T¿ÀÀÔ´_¾U; xÓôýE„¨èZÛ»yiÖ¸lÏà°_E/Ê)Ž^wW߀Iflò1AARlº 0}Û•5U“DoÖ[2!Ìv}Æt ½šåeeÁ© xòtƒ¿WÙB0ÑàÎÝ}yÀ„¯ü‰æˆ]Á]ÄÄFˆ°8éÌ}A¿XJyæ.º¶`ÀôXÑ¿÷L²‡´ö8y—C+­¡?Ù²lÑF×~oˆš©Ë·üâÓåS®6Àg†ñ·W`ðî7¯_BŠŠŠ¨æÛ¶m[bâ݃PÍÐÁÔìÅóܲ2 Æ7Šôðqã/{98Ö°wåå¡$a£çZ¥‘Ë»ª6Z™‚WçLøÓaoøcФN´Õ0†!4g/žçêéH3N¿¿bâݨ¨H=}ƒºƒ¾oÞ¼9)éÆ0„#3#ÍÚÆ¶nWÿ Þó2!¤ƒ©™„444!Ùϲö„†â7çäC­ûìÅÎïîd”6^‘‚ü‡Ú]>²=Fž€Oƒ3‰œ0u\–þظ%j9-ösjÔ"€ž>ÿl€m:ãÈÍŠŽlÁwóÝ}þÙ|Î<<< h颢"¥y> @Q¢¢"«¨ÐÐÌ Ê¦@d-YàÎ E‡ '»C~UtŸ1d-™„KZôv€O7 èÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;%EMhÛ¶mŠ ñî ÊHO«5qóæÍ  éìùµnWo"ÈZ¸ÄĻР1EEER}””ô@ž‘4©ÐÐyV‡l å‹¹~]Ñ!Pzñ›ŽúÛ©½ÿSͨ½Ì¬ñ£Iäýí‹¥ibeý•i;£"=|Œ½ç®£Á Fèõs™ä!GômRð6!|‘»—Ë8eã¹g®=Ì ,f|?M/ñpÜëŠÂœ·¬övö¶Æº:†=¹9² _ÜD „ð_œ 8ªòmȆñ},ML¿æ³}Qܾ«¢S±°ü¼‡ùÇç̽c«ÎÝÚ£ÖÍsÐa3TÌÝæ:³ï^L.­Ì>³ûªêÄÀõžÝMMºŽY0VWÌ&Výbæ¢ .ÝÌ-í'ùù,¹x"¹ê‚˜2åÕÐ$’’’êMA¡Ï 0ØmMT!„°µÌu8¢‰Lµ¶Ê¼ìR!ïÅÃ\¦éôŽUßIUÍì-8—ê(xskßæ‡b’ßT=¨2 ˆ/JrÄ”Yž“˜Q–uo¬CXµ"Œs ™CFŒîtØÏÕõ¸³c‡ÇØ«18fb&6~“|†Ê3n¦”¦Ýr4¬þ»ÇfÏò+‰^íçl- ÑÖæèvÖ¯Ú,um•²ô/'!‹iµ¨³ºh²š•Kgα:µñ_]\öCÈ…¯ªîõ¨~ý¶’Žø2mA¾’’’>\@* 7òþ½Ñs­ªOª „F‹B!!!L¥ç™JJuÎÅ‚üh¿%aùã÷2i£RvÇwÄ¢’ß.Å•)2m× ¡]û¢ÈŒ½çûÿ}-öæõy¡{Fý¹ª¦¥¸‰ÍäÞŠb «×Î{çÇéÕl áòþ¹êÓy„Â`Vß~ï71ƒÅþPSI©Në ^Ÿ]0)àµ×þkGû™·S-»éÕc»j›¸N™ðù%Hä©ùžÛ8ú6úÂì¤çUO†ñ^>Ì*¯}¬¯|ž˜\a=q¼ƒi[&ƒ_œR(ñæµ²a7’r1¡@ÌWH–¦¹½Ûô%›Â"6ró/žx\F9±Åb²D(Rüù‘²qosòðxìëOü&Î1êÑždÞ~Vuk‡—s'­¬vuÏþ÷ ¢»×œA´TYŒÊ×IòñC4€T@Îä ð 3Ÿ<úàñÓ¥Tg–~ÿ‰Üü¨§ÓÊ„ÂòŒsA‡²êÌ£¤ÕɈ‘~5>¯’KÓNïK&¯å3uΡ»~yðÅû™¹9o Ú•Ê+OŽÜ!áiN^^VRttj¥Ž…6[ìÄÆhEâ7òl€î0¢1(Ø‚ïæ+:ºC6Šäáá©èÙ@K)ÍóYŠÙXE…††dfP>0 hÉw):9Ùò«¢CøŒ!hÉ$¼XР·| ¼S@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ)):hBLÍ@ãsrtÕÐÐ „d?ËÚŠk´€TZ\h:Èh‡QhÔ4d´€Ã(´HjšÞ0¤<7Ð`Âü3“W$ŠùDoJäÙå6ÊõÁvð·£#ODM5Æþö)êíüÜk{~ >r#µP@XšF¹_Ï_=ëË6øÎP?h©@ƒ14üG¾BJï>wʮ̓µ™„0”µÍ8ŠŽŽ^êIjyÉaó–`ZþóÚnú쒜ǷbŸæ— å Àg Y3-àkñ4:t¶±±±±±±6kÃf¨ZYÛØØØØ˜±gûÒÖÖÖÖaÔâðÛ|Bˆ°4åèšñý»ÙÚÚÚvëë¶0"W3Ä–ÿxÿ ïnkkÛ÷ûÛ¥Š^£Ï–䤖ÿ2>&Ssè Ÿ1]:š[víç6s¹Ï})KÚ2ÔáÛ˜âªùJâ–:öK,%„˳.ý<´—ËåÚ›ºñï—|Љ¤<ëÒvowG.—Ëu»âÀ·Bˆ°4õ„ßÔ¡½¹\.··‹Ç²È ÅD€f×h×™àm¬ÿ´5]¾Yý¥/ùäæUß.Ó:2¢âè*¿ëæ¾¶ô5`f&%³êNA§WàNAc|m€©®§Í)|tóqA·žmXR'x{sÓÌU1–sý³R/I¿û@H„â'Æm™ë÷Øyyà²^º)g¶®Y¸ºÝáÃ+N¬ÙtÃlÕž ö¬¢¬‡ŠÙ ÂÏ3 ùÃщðÜ@ãâç]ÙuNeêŸËGvâBŒæ¬›y~Ì_7^íœ]À2îÝ×ÖDEôt:‰æVl°-‡ä>ÌhÓoéÒßmœ3è`;ó®Ýºs‡ÖC—Cu.ä] =Ç´mã¬~š Bˆ±!‚ÇÄL|y2ô¢òÄý>®BˆáŒï§]šp8îõ N9oYííìmu™DWÇЂBx…b&4Èh©@ãâe'¤—e&ŽêRm¢Iî[æWîV‡|‡ =2À¹¯ã Ãû˜¨á‹a£©/©U6½åİœ¤øø»÷ožÙ0goÔœ}¡³)†î*Ϲ—%4÷´Ñ`Ô?11£,ëÞX‡°js ™CFŒîtØÏÕõ¸³c‡ÇØ«18fb&~ÂJÈ ²ZÀµF&™]ýÿþÝ]§ö“7sF»Ä]¾zýFtÐì]»¿ =âë ®[ iú0SͰ«“[W'·É³<‚<'ïß“0aSkFõÓ±P(õÉB¡@È´]w6|„víÍ=cïùþÿF_‹½y=d^èžQA®ê£i)n"žÐ‚æ}” 4.ŽQ$ùüí|AÝÏXšûŽž½rÛÁ#voÎyTFƒÉ$B¡˜yA&²= ËÑéЖ”½«d¨¶V%%¥¢ À›ù¼T@Q6ìjÌHyXT=7 ˜ØÍ„¤\L(»¹Ííݦ/Ù±‘›ñÄã2ʉͲZÀ;‹¥;xž»Æõ5>¿œ»›ž“žó×Ï›=å•=>¸}ïÙøÿ²_¾Ì¼÷÷ß)•:tØ„¥a¤ÇÊ»•òâMþÛ—R*–fœÚ—,dB˜:.³‡q.û~óøÙógOâN})?qàÜê±ë—_¼Ÿ™›“ñðÆ‘ ­Q©¼òäˆÀýžæäåe%EG§VêXh³ÅN”W 4îЮ 42fë¾k~ÿE{ã/~÷¢¢kÓwô|M³˜ýòÊ/óÎ.eýžîë™fÎ&DÉnþ·=müfà:ÒÚ}ÿeÿ^ªŠŽÿó$ù†CÃÊÁâÊÑpß°œb!*z¶ýì^<ÆH‰îóÖO\µnªsG«ãÀ)SzÿN!ÌÖ«Ãüƒ6¯š´»œp´»¸.·cˆŸ¨i¿2|«v@ð¦éû‹Qѵ¶wóÒd1ŠÙ¯¢ƒå G¯»«oÀ$36#CÌDùµ@Ca Ö cBó' ƒ!í£vÃ@c‚Ì @óÄçó7mÚ\RZ*Ôÿ\nx4d´€Ã(4O<ogPÐ?þøöíÛz$µMÙ-à0 Í“@($„\ºtù§€€ÂÂBÉ ’Z€¦ƒl€p…æìúõë§OŸ ÜTTT$!!@R Ðt ÐÂÝ;·E þÿ7·ÿBÌÍͯ]»vèСžÜ/‹‹‹»vï)y~htx§ %ûðN@óô®¤Ä¢#Çc³ÙwïÞíß¿¿·÷·Ó§MSWW§zËïˆ4î;ø½Îßß_Ñ!Pª¨¨ „ðù|%%¥nݺ]¸pÁÅÅåzÌuk6›-ýk‡ð‰ ´dNŽŽŠ@>ŸO©¬¬d±Xl6ÛÎÎîüùóÆ ËÍÍÕÕÕe2™HäÙ@K†«©ÐÌ•””Øt±åóù¢Ë £_¿~Ç3fÌ\¯¹_õ•ªª*9@6 VYY©¤¤$J!ƒ Šˆˆ˜0a‡Ã2x°ŠŠ €¦†lŒÏç‹n°X,щÿ믿 ›={¶²²rggeee$M o€‚ñ«ù0ÑÃÃcçΫV­Ž-çñ„B¡„à!«¬F |ñÅ­ZµjÕª•——WAAÁâ%K$%UO ÑáN(˜èª@nnî7¦N:kÖ¬àààÉ“'ijh0˜L‡£¬¢òá©h Ø»@Á*++óòòF]XXèîî>{öl???%–’ƒƒƒèB6›Íf³&@K†; `ÙÙÙîîîVVVç»ï¾;qò„P(TWW×ÐÐPQQa2q°hBØÁ@ÁÆÛ½[·éÓ¦zûíÎ; -ZôèÑãû÷ïó**- spp˜¾CŸÈž…a2™>‹¹¸ 066ÖÔÔ$„ÌŸç=×ëÛk×®=xðÀeÀE@È@aØlöÌ™3”””8ŽèÉ€ž½zýòóŽëÿü3xР/í¾TUUUtŒ´€l†ÅbµjÕªúï *s8}ûöíÕ«!DUU¯È²P¤Z?9Ì`0”•••••=á)BºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вjüÜÈ û3+›¨L å—Ä-urñM(i´z½ÀOñ!˜¦ha9kôUO›4“þ åî Íoß&„x ·ãr¹}—Æ)z»5DEzøû åðHóÒLöDBˆ\³áÛK³¸\nß^ ª&•ü»Ü©wL±„¥øÙãÆþñLdžª©Óðþ[5U5uùKðêäTÇ)'óõÏ*5é[€Ÿsh¢Ë¼ I ï µ:Rc­N½« knþ½B»¤Ü4»}ŸÿüìÖ}Yvœ¼|å†/Õš(¬ZuRoèÓqE>ÿ6Q’ou BÊcƒì¼ÈFE¾57³×»Ï·üæOê¼¾u1Çld·Ö’G…hôØ$½BPQAØìŸÚ>qñÏP³Û÷+ßd¼avèÓͰº´‹Ðo«52Ú5 œW•©n?ÖîmTàÅu¿“ ŠüùÄ_r¹Ü¾nó£ŸWòî†Ï˜í)¼§;Föár¹.ëî”Ržui»·»#—Ë庌]qàÎ[‰_ïx©ùÎpwær¹\»!“}£ž” ©ºlå¹ëhð‚Ñúpí\&ù_È©¨µhõ«yâç¯Ì<8¶·k`2¯j aQìŠN>Ño…TõR•OˆàmBø"w.—;pÊÆsÏxµç&„ayÖ¥Ÿçvâr¹\ûaS7þý’/¾Ý$HÑ€b —­UË’¶ uøöõž’¸¥ÎƒýK)ƒ©Õ+Bˆ  ñ|zû¾åë=¤ê ÂÒÔ~S‡öær¹ÜÞ.Ë"3xu:R庉-³2瘷““÷±œJÑê˜âà²üò+AU¦Þ’ºóP÷ iz)U»‰– Œ˜óu?nïq¿¥ódêu_¯˜]’zÃÕ×a¨‰+SX½À髟”B¯ÎÌü’ë´òï!¤0f¡Óÿ{µ6jKÙ÷…o/Íê;-êïßÅý¹\‡Å7ßI¹Ñ÷Dÿ:Æ~Üžsá‹Göårí]íO*,zthµ§3—Ë2;øßuC‰;ö~R „~þ­_ç}݇˵2ã§Kï›]ŠCº ‡>ªí+ÍîYX³wŸÞ@q@«OZŒÔ§*iõ !ïćÙÖÑ{²QBȾ{µn”ò.ù~»-Ñb^èácþCKþZ:?,¹¼UßGwäXø‹¿²®‡raÜ–¹~ñfF<±n`þÞ…«Ï¾Rùì±\§•ÿÖ¹ÝVÁ0¹2äè©SQ!ó,“¶û~¨¹"õÐiö´°K7o^¤syÃÆ«o$_6®;?Óp€»EÞ¥ói¢ *,º{ü|š IõŠ#È»°fÑî »œ8<‘õKlݹoonš¹ê$îwðØ©cûÖztV%BñíF] €¢Å^sÓ©iëk«²êkկŊB„ÅIç’µ]Ž ”ª3ðsN¬ÙtÃØ{ϱ³çNFlë¨ÏfÔéH*ÕW§zâËT2tó]\ãÊkIDATÚ5iÛ'²+xOÿX³;Ûù‡•.Ú5viêíš_w Gêï¥ÚT¤þyZyúoWþû}‚êe™úC­Å'™¼¿ŠXw—”ÀÇ(eí0âÊd´²êg\p;áe%!¥)1© 劇7³x„”¥ßxB:÷5U–ºÒÏjßg´öÏoc´8vÛ£ããc·Û·’r£O2Q")ìMë³ú·¿ö,±NÚé³xɦ{]|B#Ã×Úgÿ¶6ôaeCÕÙЪjX „T<=–é¼>òTäÏžJ§W/ ÿ'±~h"Y}ÛWªÃ‚jÝ»ÉêÆÓÊAÊS•4C‘ûeÇÜcÁ ²gjKJ¯_NßMÛ ]8¹g;%†²É ñ½•]O“ð…QüüJÎnyϧòHÕAh7ª»Cr½uñŸ_ý#NÅ}ÏW6F†‡.Xõ•©ý}Bw%ôo߯Yý­ Œ­ìGŒvÐeP´UT X)®ð{³Ý mQÛ·cÖת [;I äÑù­ûÔÚ3©Ö¥¢0ç-«½½­±®Ž¡EÏAnN†ì:1ÕXúË–þ×kVôz¼}ÕÖM+}á⻬íeùRÔ+Í<µHwu—E3íu9L§ðz„,ýAPsqU5%ª¤Eº=Wæ#¶L–V·ÞÚÙÿ<*ò2o>Ñ>µgiüÝWüÊ—w ûYµªcËÙ÷¥lѧ·šªƒu‡¥+<í,-z¸Ím”ÿX}æŠ öVæ]‡Ïš`QŸð²Ræ­#k<Õqz-\þMOs‡é¾^2Ž~R"±ŠÈtè£Ú^Òïzõv{±ñH{t’}sËœŸ „Fë>^ÓÍ<÷„ݶäÃDÞ‹‡9ÄtbǪZI§[·¶…Ò‹_ÔX¶<'1£,ëÞX‡°js +‰Žî¿ð!uk¼¹µoóŽC1ÉoªîPPÄeAl-sŽh"S­­2/»TòV7?KßɽÓ/Χ~ÛÙª,ñØ-FïÝ5ÔõR´7ïÅÃ\¦éôŽUO©šÙ[p.Õš§<ç^–ÐÜÓFƒQsA±íV&_ U–ˆ+œš„VmàÚQv€îªåÿ]Läô™ØS§Aį sȈÑû¹ºwvìã0`ø;c5éVKbã°ô†¿ìܨu§T†o_êX; „cV½ÒÌSS=½”²ÝºB”ôl •ßÏ&S¨$¬ê‹K aÃUk!™wŠ2ût᜸žZl›r»Ärî ~™‘—âÝÈÑêÝM«ö7–³ïKÛ>57ºèC}[cÑ·z%uu¶®‰¨Ã±ÔuÕ¥¥™–!ž}€Â2êÕIS4‰¥mkÛ¦ 9+ÿõ÷þO™}‚.Dìöât‘r׫¿Û‹§Î<â׫TöÍ-7 ÈQ2¹pøÁ¿œðð–uQ¡@È´]w6|„¶TW5ùÑ~KÂòÇ îeÒF¥ìŽïˆEoâ1j”!Ö—£‰›Ÿ¥çèÖiǾ³O½ ^göÙÜUƒQ_½âÖ‹¦ÒÇ‹ÆL%ÊïbÒaPHÑ€¥wd(œrí„Q=l¡P ZçOZ»ò´¿o ¸ëÌ” ©õ ug˜±÷|ÿ£¯ÅÞ¼2/tϨ ?Wõi%]m’:˜ 8õNJ9!•ÏžV’¶µ³¢bY½bçєԙeí¥Õe)1«ZZÆþ@*Òk,þidÞ(©X8š—ý÷øÞãçí‡t6ìÒ»Mè?”§(ÛÎ2®µ=èºï×Új &ëý_ a0YïW„!ZÆÜ: #Û!]Jb¶—4»'!5ê€& ª#mB#ê‘b˜dhôš=Ë&-ü×ÿ½^„£ßÅdÄ¥TÝB©Ì»{7_³£©“0XL"TͦlØÍ„¤\L(òŰÊç‰ÉÖÇ;˜¶Ua2øÉ)…ýº+KÏq¤å›Ëgn‹W²ÙU£!õrômô…ÙIÏ«(á½|˜U^»ß)v5f¤Æ<,ÖXP|»)SHÕ€b §B¹v ÕÖª¤Dô}ƒþÛÌç¥)׎²ð²®Ý(í6ÄR"}g`išÛ»M_²),b#7ÿâ‰Çeµ–¥"¡LÁÛ¸Ÿ×žÖ˜ºÝ×)#È÷¯4±ÿHS¯˜yŽzÇ©5›lýA¢k$M²ïTe25m ò¢OžLi×Ç¶Š¡]ìxB¹¹£Eí—”ZÒ¾_g©6º”¨–°ËÈÜ!„ð³oÿWXutx”TÐÚ²}[£ú{ L‡>I ëaâ€Fq´”êèÔ€Í-7Šz}‚e8b›ò?·ËDÅÒë?¹oÅ™ ?¿›™|-tíî”cÆY«–º.ëù­Û©/ß–uΡ»~yðÅû™¹9o Ú•Ê#Dðò¢ïŒy!kÞîRÒêdÄH¿ŸWI„¥i§w„%“FOĘº}GvÎ?ðóM%‡‘_¨7¨^–~ÿ‰Üü¨§ÓÊ„ÂòŒsA‡²êÖ£ã2{ç²ï÷á1Ÿ=ö$îôÑØ—BŠv£*IÑ€b §zq–rí8_öTÿïð¹”R¡°4ã|оd!Cʵ£ê•Ïc£ ¬‡viE‘²3”'Gî¿ð4'//+)::µRÇB›]kYªã3UûAÁÍëζž±a¶Óˆ•ß;fíò=”Z+¦Þ±ó|ʧÖl2ö‰UÖX#"E2ïÔe²õ¹=ÔÓÏý[ikgÀ&*fý:äEÇä8ØÔ¹¾Ò’öýÚ‹H·Ñ¥D°„]Fö> »ýKÀ‘Ĭçi7÷ù…$ÓYMŠ(Ó¡j5rX 8 ‰?ZJwt¢ÞÜ‚âä ‘GoRv›žBîBQûbú·½ŽûÝ®J˜:ƒýv½Ù¼1pæèBÂ1´à?ËR™¢Á;»ûò€ _ùÍ{ά³_¾U; xÓôýE„¨èZÛ»yi²ðòžÜ»Ï+®¹=™ºC׬º½r£»³¿zkî7Ó]BóçsªBï;Êz£ß=¯Üm[5°^¦î°õÛ³}ý¦ºüÌncÈ9‰{ë÷:ó´vXæ´1xÕ¤Ýå„£ÝÅu¹ƒ²Ý( djŠo@±…SKµvjÝç­Ÿ¸jÝTçŽVÇS¦ôþ'\êµ»"üÜÿ]~Ùq\·ª;tRuF1ûUtðâ œb!áèuwõ ˜dÆ&D©Ö²=Ä7Ä·#ÿÆöÏ·›q`ª• !*V¬à±zÍ}›núqQ§þzww7Ï' êµÞð¢ÚTýA’Ú[¢V¯\ÖݪW¢lÚ¯3çØ¿VýÌTahX÷3!·Þôàê×iŵïשVª.å:P\{CWÛedî„BØ“§ü½jÌ–~hç]Ü W_åMG~ì-å³ÜDŠó2!¤ƒ©YFzÕ§„ìgY{BCqŒ…fŒ_¡æ4×ÛYÝZ2^V\Zû 3zJŸ 4:ÅÝ)¨ÛÐeÊxEÐÄ8EJúŠ/øÒ@wÈèîóɤºÉ†ÐþloVƒÄ†>› -Yƒ»AD—h>Ÿl@,9 )Ýdƒ‹7 ~É‹4õ¸ì xurªã”“yþvWIjÀf0Š|sk®ºjÜ »ÈO~ a4ëÏepqA_³iÇeoŽc~7bHŸË†nN˜mš¸Ë€<Èó(&ópãõ-~nAñÈ•N\.·úÈåRâ^w¶..¶´úâ¯o˜ðúä»Q}Üôü[¡ ÜD è8jÁû[-TÓeêžz›R‘0´¼ø¶’ØgêmjiF4ÿ0ÐZ3Ežú;Ä ñ.Uû‹Y°,i ÅÀíÕHpq;² 9͆<³‡¯hñ£S§Üý¸Ûâ=‘~rœò%Ý îÛÄ×-O£ƒ‹‹-­Æ¸Ý &\–¹/Ïþà³÷y¿u¿Ÿ<¹{ªÚÉà÷CÚSM—u¨{ÉÛô¦š¶¾¶ê‡»­©ª–Øgêkj©G4'„4›QäUj5ׇ–7Ä»4í/~AiÈ:ì=!29/U òÌdn¼Ã~‹¨;,]9ÎÞÊÜÆe¦·ëáõ´2)qW~÷ÏžúFÚ&R..eiÒ—,i•« È]­´è?ã5¾ñ]0¤³¡¡å@ï•îzD(azƒ†º—bdtf»AÛ¢¶þ8pÝmM]µ¤òëmê ©G4oÀæhªQäë4—Åêõ—)ÍXìdö^r‹ÕÝîREr!Ïçdn¼Ã~BQÒ·­Á›°[ëªUä” ¥Äz6êH9¸8ui:u†Â­¯äÚÄ×^e±róž?Ìev˜eR5¶›²q/3Î) Ó4Ô=Å6•D̶¦®Z«˜²ÏÔßÔÌ!RŽh.^³EžbHõúË”f,v 2,ëó2GMF~Ù€ÌÃ7pØïjãy£ª(éq§Û^ú/1Ò”ÖèizÙ‡ºoØÈèâ¶µøªùW¨Ë—ª©¥ѼšÅ(ò /SŠÛ=`1Ûš ùÝ)hša¿?uÐúÌ&å¸ÚÒ•Ö€aÂ¥ZeBGßZŸŸŸY•Ê”?»ÆJ˜Þ€¡îkyªª¥,_R䲎h^M3Eþ#±CªKÓ>âÇb§¸ýnÜy’ß~Ú$Ã~â õ šMÊÁÅ¥*­ÄK·Ê¢8Çs‹¯ßyñINnò•Í'^! ªé ê¾±†§ªZÊò©oȈæ5PÁ£È×XG1Cª)ÚGüXì·bÀ²·/9|ÁŒïÏä6úï…€Œä— 0u‡®Y嘱ÑÝyÀ1ßÇYOwi-yu¦î°õÛ'}S]œZÛyWµî©@ƒ;wv÷´€ _ 4ò§{TÏÛ‰q¯³iúhW·1süg¨ÖÄ]ÚÙtûíZòÅ3G»OXu^Å3`§¸Á¼¥*­füåÒ”,Ý*BXz_ûoŸ©{}ÝD7W¯ð¢¯½¾TUb³”Ó¥\ýê«(ë6¥,H|ÕÒ–O±xÕˆæã܆åµ÷倪Í¥n@)7´”«H¹.RöáÖ«Ãü¿®8±jÒÈ#§¯‹zRFXÒ´¸¢ÛUÿœêÜ·ÿè5·¿˜Ò»Î Xæãg$Ý{ü¢¯(ã;o¯ÀàÝo^¿"„QÍWï8ÊLÍ^<Ï-+ÃsÂÍTEjèØ W=Žü>Þˆ%ÍthÎê=/B:˜še¤§Q}ª¡¡AÉ~–µ'4¿EØ‚ ‹žú;¿³µ6y™¹q_®õ"'=õt )d-™àÝÇÖo^ÿŠGˆš‰Ã¤€F)Išô„“@ ÆÐürɾóK¤ž4…wèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;dt‡l€î вºC6@wÈèÙÝ! ;¥F,Ëßß¿Kùh´lÀÉѱ±Šyj´lààÁUÈž ;dt‡l€î вºC6@wÈèÙÝÉ à÷…Z$i‹0pgP“ÆŠ"m6‘žÖ¤q€¢à¹ºC6ðÿvía €¢h÷a²» Æ&;DÐ婺 ABüvyç4C¦šò^:5éÔ¤SN @:5éÔ¤SN @:5éÔ¤SN @:5éÔ¤SN @œEÝ ?ÕdYÔͺ[ oÔyMJ @Žg ô}?¼Wa˜vg”vå{ Tj¦ím Ø @ŠO)`7¾¤€ÝLßÿ)P©˜žŸ)`7SöO Œv³nÙn¶»ÛõRäÅ@AçÓñ°ßû7éæã|:–}Pʬ[¶¥ß”tî}Šï¿_•žIEND®B`‚src/000077500000000000000000000000001225012771600324705ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/docaudiodevices.qdoc000066400000000000000000000032431225012771600360060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example audiodevices \title Audio Devices Example \ingroup multimedia_examples \brief The Audio Devices example shows the application of the audio devices APIs This example shows how to create a simple application to list and test the configuration for the various audio devices available on the device or machine. This is done using the QtMobility Multimedia API. \image audiodevices.png */ main.cpp000066400000000000000000000042631225012771600325710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiodevices/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "audiodevices.h" int main(int argv, char **args) { QApplication app(argv, args); app.setApplicationName("Audio Device Test"); AudioTest audio; audio.show(); return app.exec(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/000077500000000000000000000000001225012771600310365ustar00rootroot00000000000000audioengine.pro000066400000000000000000000001541225012771600337700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengineTEMPLATE = subdirs # These examples contain no C++ and can simply be copied SUBDIRS = EXAMPLE_FILES = qml qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/doc/000077500000000000000000000000001225012771600316035ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/doc/src/000077500000000000000000000000001225012771600323725ustar00rootroot00000000000000audioengine.qdoc000066400000000000000000000027221225012771600354550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example audioengine \title AudioEngine Example \ingroup multimedia_examples \brief The Audio Engine example demonstrates 3D sound control using the QtAudioEngine API. \image audioengine.png */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/qml/000077500000000000000000000000001225012771600316275ustar00rootroot00000000000000audioengine.qml000066400000000000000000000131201225012771600345470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/qml/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtAudioEngine 1.0 import QtQuick 2.0 import "content" Rectangle { color:"white" id: root width: 300 height: 500 property int radius : 100 property real twoPi : Math.PI + Math.PI MyAudioEngine { id:audioEngine listener.position : Qt.vector3d(observer.x, observer.y, 0); } Item { id: circle x: root.width / 2 y: root.height / 2 property real percent: 0 SequentialAnimation on percent { id: circleAnim1 loops: Animation.Infinite running: true NumberAnimation { duration: 8000 from: 0 to: 1 } } } Item { id: holder x: circle.x - Math.sin(circle.percent * root.twoPi) * root.radius - 50 y: circle.y + Math.cos(circle.percent * root.twoPi) * root.radius + 50 } Rectangle { color:"green" id: observer width: 16 height: 16 x: circle.x - width / 2 y: circle.y - height / 2 } Rectangle { color:"red" id: starship width: 32 height: 32 x: holder.x - width / 2 y: holder.y - height / 2 } MouseArea { anchors.fill: parent onClicked: { audioEngine.sounds["effects"].play(Qt.vector3d(holder.x, holder.y, 0)); } } SoundInstance { id: shipSound engine:audioEngine sound:"shipengine" position: Qt.vector3d(holder.x, holder.y, 0) direction: { var a = (starship.rotation / 360) * root.twoPi; return Qt.vector3d(Math.sin(a), -Math.cos(a), 0); } velocity: { var speed = root.twoPi * root.radius / 4; return shipSound.direction * speed; } Component.onCompleted: shipSound.play() } //Category Volume Control Rectangle { property variant volumeCtrl: audioEngine.categories["sfx"]; id: volumeBar x: 10 y: 10 width: 280 height: 22 color: "darkgray" Rectangle { id: volumeTracker x: 0 y: 0 width: volumeBar.volumeCtrl.volume * parent.width; height: parent.height color: "lightgreen" } Text { text: " volume:" + volumeBar.volumeCtrl.volume * 100 +"%"; font.pointSize: 16; font.italic: true; color: "black" anchors.fill: parent } MouseArea { anchors.fill: parent property bool m:false onPressed: { m = true; updateVolume(mouse); } onReleased: { m = false; } onPositionChanged: { if (m) { updateVolume(mouse); } } function updateVolume(mouse) { volumeBar.volumeCtrl.volume = Math.min(1, Math.max(0, mouse.x / (volumeBar.width - 1))); } } } //Information display Item { x:10 y:32 Text { text: " [live instances] = " + audioEngine.liveInstances; font.pointSize: 14; font.italic: true; color: "black" anchors.fill: parent } } Item { x:10 y:60 Text { text: " [loading]=" + (audioEngine.loading ? "true" : "false"); font.pointSize: 16; font.italic: true; color: "black" anchors.fill: parent } } } audioengine.qmlproject000066400000000000000000000004501225012771600361400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/qmlimport QmlProject 1.1 Project { mainFile: "audioengine.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } } content/000077500000000000000000000000001225012771600332225ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/qmlMyAudioEngine.qml000066400000000000000000000071411225012771600364350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioengine/qml/content/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtAudioEngine 1.0 import QtQuick 2.0 AudioEngine { AudioCategory { name:"sfx" volume: 1 } AudioCategory { name:"music" volume: 1 } AttenuationModelInverse { name:"default" start: 20 end: 1000 rolloff: 1 } AttenuationModelLinear { name:"shipengine" start: 20 end: 180 } AudioSample { name:"fire" source: "fire-03-loop.wav" preloaded:true } AudioSample { name:"explosion" source: "explosion-02.wav" } AudioSample { name:"lava" source: "lava-bubbling-01.wav" } AudioSample { name:"water" source: "running-water-01.wav" } Sound { name:"shipengine" attenuationModel:"shipengine" category:"sfx" PlayVariation { looping:true sample:"fire" maxGain:0.9 minGain:0.8 } } Sound { name:"effects" category:"sfx" PlayVariation { sample:"lava" maxGain:1.5 minGain:1.2 maxPitch:2.0 minPitch:0.5 } PlayVariation { sample:"explosion" maxGain:1.1 minGain:0.7 maxPitch:1.5 minPitch:0.5 } PlayVariation { sample:"water" maxGain:1.5 minGain:1.2 } } dopplerFactor: 1 speedOfSound: 343.33 listener.up:"0,0,1" listener.position:"0,0,0" listener.velocity:"0,0,0" listener.direction:"0,1,0" } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/000077500000000000000000000000001225012771600307305ustar00rootroot00000000000000audioinput.cpp000066400000000000000000000314311225012771600335400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include "audioinput.h" #define PUSH_MODE_LABEL "Enable push mode" #define PULL_MODE_LABEL "Enable pull mode" #define SUSPEND_LABEL "Suspend recording" #define RESUME_LABEL "Resume recording" const int BufferSize = 4096; AudioInfo::AudioInfo(const QAudioFormat &format, QObject *parent) : QIODevice(parent) , m_format(format) , m_maxAmplitude(0) , m_level(0.0) { switch (m_format.sampleSize()) { case 8: switch (m_format.sampleType()) { case QAudioFormat::UnSignedInt: m_maxAmplitude = 255; break; case QAudioFormat::SignedInt: m_maxAmplitude = 127; break; default: break; } break; case 16: switch (m_format.sampleType()) { case QAudioFormat::UnSignedInt: m_maxAmplitude = 65535; break; case QAudioFormat::SignedInt: m_maxAmplitude = 32767; break; default: break; } break; case 32: switch (m_format.sampleType()) { case QAudioFormat::UnSignedInt: m_maxAmplitude = 0xffffffff; break; case QAudioFormat::SignedInt: m_maxAmplitude = 0x7fffffff; break; case QAudioFormat::Float: m_maxAmplitude = 0x7fffffff; // Kind of default: break; } break; default: break; } } AudioInfo::~AudioInfo() { } void AudioInfo::start() { open(QIODevice::WriteOnly); } void AudioInfo::stop() { close(); } qint64 AudioInfo::readData(char *data, qint64 maxlen) { Q_UNUSED(data) Q_UNUSED(maxlen) return 0; } qint64 AudioInfo::writeData(const char *data, qint64 len) { if (m_maxAmplitude) { Q_ASSERT(m_format.sampleSize() % 8 == 0); const int channelBytes = m_format.sampleSize() / 8; const int sampleBytes = m_format.channelCount() * channelBytes; Q_ASSERT(len % sampleBytes == 0); const int numSamples = len / sampleBytes; quint32 maxValue = 0; const unsigned char *ptr = reinterpret_cast(data); for (int i = 0; i < numSamples; ++i) { for (int j = 0; j < m_format.channelCount(); ++j) { quint32 value = 0; if (m_format.sampleSize() == 8 && m_format.sampleType() == QAudioFormat::UnSignedInt) { value = *reinterpret_cast(ptr); } else if (m_format.sampleSize() == 8 && m_format.sampleType() == QAudioFormat::SignedInt) { value = qAbs(*reinterpret_cast(ptr)); } else if (m_format.sampleSize() == 16 && m_format.sampleType() == QAudioFormat::UnSignedInt) { if (m_format.byteOrder() == QAudioFormat::LittleEndian) value = qFromLittleEndian(ptr); else value = qFromBigEndian(ptr); } else if (m_format.sampleSize() == 16 && m_format.sampleType() == QAudioFormat::SignedInt) { if (m_format.byteOrder() == QAudioFormat::LittleEndian) value = qAbs(qFromLittleEndian(ptr)); else value = qAbs(qFromBigEndian(ptr)); } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::UnSignedInt) { if (m_format.byteOrder() == QAudioFormat::LittleEndian) value = qFromLittleEndian(ptr); else value = qFromBigEndian(ptr); } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::SignedInt) { if (m_format.byteOrder() == QAudioFormat::LittleEndian) value = qAbs(qFromLittleEndian(ptr)); else value = qAbs(qFromBigEndian(ptr)); } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::Float) { value = qAbs(*reinterpret_cast(ptr) * 0x7fffffff); // assumes 0-1.0 } maxValue = qMax(value, maxValue); ptr += channelBytes; } } maxValue = qMin(maxValue, m_maxAmplitude); m_level = qreal(maxValue) / m_maxAmplitude; } emit update(); return len; } RenderArea::RenderArea(QWidget *parent) : QWidget(parent) { setBackgroundRole(QPalette::Base); setAutoFillBackground(true); m_level = 0; setMinimumHeight(30); setMinimumWidth(200); } void RenderArea::paintEvent(QPaintEvent * /* event */) { QPainter painter(this); painter.setPen(Qt::black); painter.drawRect(QRect(painter.viewport().left()+10, painter.viewport().top()+10, painter.viewport().right()-20, painter.viewport().bottom()-20)); if (m_level == 0.0) return; int pos = ((painter.viewport().right()-20)-(painter.viewport().left()+11))*m_level; painter.fillRect(painter.viewport().left()+11, painter.viewport().top()+10, pos, painter.viewport().height()-21, Qt::red); } void RenderArea::setLevel(qreal value) { m_level = value; update(); } InputTest::InputTest() : m_canvas(0) , m_modeButton(0) , m_suspendResumeButton(0) , m_deviceBox(0) , m_device(QAudioDeviceInfo::defaultInputDevice()) , m_audioInfo(0) , m_audioInput(0) , m_input(0) , m_pullMode(false) , m_buffer(BufferSize, 0) { initializeWindow(); initializeAudio(); } InputTest::~InputTest() {} void InputTest::initializeWindow() { QScopedPointer window(new QWidget); QScopedPointer layout(new QVBoxLayout); m_canvas = new RenderArea(this); layout->addWidget(m_canvas); m_deviceBox = new QComboBox(this); QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); for(int i = 0; i < devices.size(); ++i) m_deviceBox->addItem(devices.at(i).deviceName(), qVariantFromValue(devices.at(i))); connect(m_deviceBox, SIGNAL(activated(int)), SLOT(deviceChanged(int))); layout->addWidget(m_deviceBox); m_volumeSlider = new QSlider(Qt::Horizontal, this); m_volumeSlider->setRange(0, 100); m_volumeSlider->setValue(100); connect(m_volumeSlider, SIGNAL(valueChanged(int)), SLOT(sliderChanged(int))); layout->addWidget(m_volumeSlider); m_modeButton = new QPushButton(this); m_modeButton->setText(tr(PUSH_MODE_LABEL)); connect(m_modeButton, SIGNAL(clicked()), SLOT(toggleMode())); layout->addWidget(m_modeButton); m_suspendResumeButton = new QPushButton(this); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspend())); layout->addWidget(m_suspendResumeButton); window->setLayout(layout.data()); layout.take(); // ownership transferred setCentralWidget(window.data()); QWidget *const windowPtr = window.take(); // ownership transferred windowPtr->show(); } void InputTest::initializeAudio() { m_pullMode = true; m_format.setSampleRate(8000); m_format.setChannelCount(1); m_format.setSampleSize(16); m_format.setSampleType(QAudioFormat::SignedInt); m_format.setByteOrder(QAudioFormat::LittleEndian); m_format.setCodec("audio/pcm"); QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice()); if (!info.isFormatSupported(m_format)) { qWarning() << "Default format not supported - trying to use nearest"; m_format = info.nearestFormat(m_format); } m_audioInfo = new AudioInfo(m_format, this); connect(m_audioInfo, SIGNAL(update()), SLOT(refreshDisplay())); createAudioInput(); } void InputTest::createAudioInput() { m_audioInput = new QAudioInput(m_device, m_format, this); connect(m_audioInput, SIGNAL(notify()), SLOT(notified())); connect(m_audioInput, SIGNAL(stateChanged(QAudio::State)), SLOT(handleStateChanged(QAudio::State))); m_volumeSlider->setValue(m_audioInput->volume() * 100); m_audioInfo->start(); m_audioInput->start(m_audioInfo); } void InputTest::notified() { qWarning() << "bytesReady = " << m_audioInput->bytesReady() << ", " << "elapsedUSecs = " <elapsedUSecs() << ", " << "processedUSecs = "<processedUSecs(); } void InputTest::readMore() { if (!m_audioInput) return; qint64 len = m_audioInput->bytesReady(); if (len > BufferSize) len = BufferSize; qint64 l = m_input->read(m_buffer.data(), len); if (l > 0) m_audioInfo->write(m_buffer.constData(), l); } void InputTest::toggleMode() { // Change bewteen pull and push modes m_audioInput->stop(); if (m_pullMode) { m_modeButton->setText(tr(PULL_MODE_LABEL)); m_input = m_audioInput->start(); connect(m_input, SIGNAL(readyRead()), SLOT(readMore())); m_pullMode = false; } else { m_modeButton->setText(tr(PUSH_MODE_LABEL)); m_pullMode = true; m_audioInput->start(m_audioInfo); } m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } void InputTest::toggleSuspend() { // toggle suspend/resume if (m_audioInput->state() == QAudio::SuspendedState) { qWarning() << "status: Suspended, resume()"; m_audioInput->resume(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } else if (m_audioInput->state() == QAudio::ActiveState) { qWarning() << "status: Active, suspend()"; m_audioInput->suspend(); m_suspendResumeButton->setText(tr(RESUME_LABEL)); } else if (m_audioInput->state() == QAudio::StoppedState) { qWarning() << "status: Stopped, resume()"; m_audioInput->resume(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } else if (m_audioInput->state() == QAudio::IdleState) { qWarning() << "status: IdleState"; } } void InputTest::handleStateChanged(QAudio::State state) { qWarning() << "state = " << state; } void InputTest::refreshDisplay() { m_canvas->setLevel(m_audioInfo->level()); } void InputTest::deviceChanged(int index) { m_audioInfo->stop(); m_audioInput->stop(); m_audioInput->disconnect(this); delete m_audioInput; m_device = m_deviceBox->itemData(index).value(); createAudioInput(); } void InputTest::sliderChanged(int value) { if (m_audioInput) m_audioInput->setVolume(qreal(value) / 100); } audioinput.h000066400000000000000000000073041225012771600332070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOINPUT_H #define AUDIOINPUT_H #include #include #include #include #include #include #include #include #include class AudioInfo : public QIODevice { Q_OBJECT public: AudioInfo(const QAudioFormat &format, QObject *parent); ~AudioInfo(); void start(); void stop(); qreal level() const { return m_level; } qint64 readData(char *data, qint64 maxlen); qint64 writeData(const char *data, qint64 len); private: const QAudioFormat m_format; quint32 m_maxAmplitude; qreal m_level; // 0.0 <= m_level <= 1.0 signals: void update(); }; class RenderArea : public QWidget { Q_OBJECT public: RenderArea(QWidget *parent = 0); void setLevel(qreal value); protected: void paintEvent(QPaintEvent *event); private: qreal m_level; QPixmap m_pixmap; }; class InputTest : public QMainWindow { Q_OBJECT public: InputTest(); ~InputTest(); private: void initializeWindow(); void initializeAudio(); void createAudioInput(); private slots: void refreshDisplay(); void notified(); void readMore(); void toggleMode(); void toggleSuspend(); void handleStateChanged(QAudio::State state); void deviceChanged(int index); void sliderChanged(int value); private: // Owned by layout RenderArea *m_canvas; QPushButton *m_modeButton; QPushButton *m_suspendResumeButton; QComboBox *m_deviceBox; QSlider *m_volumeSlider; QAudioDeviceInfo m_device; AudioInfo *m_audioInfo; QAudioFormat m_format; QAudioInput *m_audioInput; QIODevice *m_input; bool m_pullMode; QByteArray m_buffer; }; #endif // AUDIOINPUT_H audioinput.pro000066400000000000000000000003461225012771600335570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinputTEMPLATE = app TARGET = audioinput QT += multimedia widgets HEADERS = audioinput.h SOURCES = audioinput.cpp \ main.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audioinput INSTALLS += target qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/doc/000077500000000000000000000000001225012771600314755ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600326635ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/docaudioinput-example.png000066400000000000000000000242171225012771600372110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/doc/images‰PNG  IHDRâ«{G@s pHYsÄÄ•+$tEXtDescriptionWindow Class: audioinput™$ ‡tEXtTitleaudioinput¿Ò…Ü IDATxœíyœÕ¹°ŸêîYzf…YY5¬ެA6HÐ늚4š˜êÕ/jÌ øEÔ‹â®÷û Æ%QÅ ÙAD”ud1À ì½×¹twMWïÝ3Ã4pžß¯fºÏ9õž·N½o½çœª®£àǽ³Öˆ£§mþɉ¤‰@ò2Sø®øæi_þï;_ ƒÑÈϺaUM$!Ù^°41hj‹ ÕtêTÎP=îjZ¶!D‹Ê÷©ˆ3R“çxÎÐQéêÔ%EØÅî› i'Û÷—c‚i·]æ6-p;a·âl22²é–#h—¦`2xöV”°*=‚¬&×cš.=Bš–EZ,ecÙ?\zPB9A,éѦŸ?øm˜4]ziáÒµ¼XÓ›P‡S…õ‚ýU UU•>YË_o)ULF£‘6é\V,H2ž¹ˆæ‹ÓåÒ„¢(MBr”x»M.+D #K‹²¬” å¼'Î?23Å7/!#a‡‰˜kYBëêr¹uô¿Áh )'\.BUµïÍ-[õÓÛB¶É…mrÓ_«Y쯨uë3eÖZqi. (N¢0à۩²²’“••Á5H´Q…víÛ“››u„s:Ô74P__ORR&“ §Ó‰Óá ½MÒÓÓ1™LÍýb)ÛQ1†òÑäE$\÷0Ltƒ ÓBÑÐétR__Om]&“ £ÑˆËéÄátÒÆÇ≈ìúúzL&“ξÒÒÓݲýœ&btóÓ»¾¡¡Ñvìv;é^Ù&SÈèZ^£²µÜη»~Âtì´—´oc(xàÀ† †ÓéDQýæ-äý¬( 6¬_Onnn€¬€›ÝÎñŠ Š;t ¸¸8 ¿ººšòòròóóIMI !”Æ@Q‚¦…Ô‚^0b‰Šá¢šº&7Êò¾yºÞ‚o¦·|0ƒ G ;aÈjuÅ6«•cÇŽQPXHû¼Ž© üä(Š;l{ÊX='ࢋ/FQl6›®ë¤( iiitëÖ²={(,,$Õlv7–GŽWG-ÂùQ˜4ÝþAÒ¼4-ʲZžú• 2|ÓýËûçùj,–8#cÔÎƃ•BÐ`±pôèQºuëÒÌf3;w¦¬¬Œ¢¢"Ì©©šÃ„rHᵯ£Gé~á…aí«¤¤„Ý»wSXP@jÙxd[<¶û³Ÿý,¤ìôôt.¼è"vîÜ2˜ ê RB Å„<h0t[Ñ‹¹,?°ƒÁ€Ñ'=œN'‡¦[I7TÕ‰ÍfÅn·ápصÍn·a³Yq¹œtîÒ…C‡át8ÂÊ f4Í´'Âui~Ü»—1£Gkß;_ÐIÛGx.^ÁtïÔ±Âc¸ønáŽÇ{1ôÝ‚U].^zñÅ3î„àî2>|˜ .è tîì¶§3x]>8N¬É‡×v»w/AUÔÔT•]SSË夤¤$¬l¯ïEôEQP|Ðã”yY<ºôÏ:tU!8uêæ´4„*°4XqØ!7«ÅŠ$§¤PYY© ¸#F…iMuÐPé›î?©âéAxjñ'ŸÈÒ9œßrÂwów4‡Ótq\Þ².Uåå—_ žj_Ùq8¡‚ÊÊJ’““c³¤$· ø¶mhXyòdHûÚ±}GPÙ)))œ:uJìA¢aå©S¤§§k²ÿòè£<òÈ#X-îzì6;OLŸÎ½“§h²Íf³&;‘Ñ`ÀápðÓ:‡K3™¹©×MÌÝ1‡}ûöa³Ù - .—‹ªª*òÛµ£¡¡‡Ãqkhh ??ŸªÓ§q¹\º†÷?!ѦéÒC9¨'ýîßÿŽ+¯¼’aÆñàÿ‰Ã™Oœ8ÁСCµ²»wïfÜØ«59ÿúç?4p ¿üÅ8>ø`ž®Žñ¿ü…¹,˜Ïχ eØÐ!üú׿âÄÉš³xËÙ¬Vº—tã‰éÓ¹ó·w0jÔH¾Ù¼›ÍF÷’nüõ¯ÿÅÿðÆÿò|³iÁñŠ  ¨ÉÛµ{7W_u%Ï<ý46› 7ÝÈ]wþ6¬† Æâ„àž!¯ªª¢}NŽfû÷¶VwÞëëëÙ·oŸfyùùTUU¹gØCœ7—ËEÕéÓä忨׼÷ß熮ãµ×^ ´¯‚ªªªtöåO0Û:mÛ·oç¯SÿŠÅbáÉ'Ÿ`åÊ•<ñÔSšìÂÂÂÛõ'²#»wí¢¸¸›Ý®uEÓMiL9•j{5ÅÅÅlß¾]×è¡N¨ªª4X,`4„t‡ÃξýûÒìvƒ‚¥¡UU#Ž‹šÃ}ÓŸ{îyV­^ͦ͛IIIeÁ€QÎS^¡ñfü¡ƒ™1ã¿ùbÉ–|¹”ªSUAõŸóà€¡òüÒuÇјîȾ緮¶–wÞù'Y™YL˜p3N§ƒ ÒÐP¯³·ùh-ÓX§7Í |e¼?ï:uêÈO? ''›E}LR²ÉϾ|'©õv+ðΊëõ¶Ûmüí±i¬]»–¥Ë–ñãe<òП°Ú¬!dûû„Í…Ün»ïÝ»7GŽÁì¹}àvÄ:E¡´ ”òòrúz®nÃðTD¦b0œœÂ©Sîþ¸ÿxðÐÁƒiªªrêÔ)R’“1(ý¤„΄. ß4]Y¡++B”ÂÝìСŠ¢ÐÐÐÀ§Ÿ}ª§ÌŒLêêê8]]°zõj­1––²aÃF¬6BÀŠå+ô í©gРA¬[·–'N"¼ûî{üüçÃõ1HtôÇårñÑG‹Ø°a=ƒN;‘•™åÖ±ª !«V­ÒDî);»Ãá6 Ÿ¥;o^“ñIž˜.ü壑ääd ÔÕÕrèà¿yûw:d(ïÏ›ÏÑ#åÔÔÔèl 99ƒÑ¨Ù~õ%@öo&M¤cÇ)/ÇápPqì™Y™üþ÷wÈVCL¶ûÚ믱ù›oøèãÅäåå±hÑGìÝ¿Ÿ—_zQ/;)Å` ”ë9Ÿ!S…ÔÔTºwïÎÚÚEÌÚ=“²¯+¨ü¡EQH1¦PRR‚ËåÂfóùÕ†Aï Ú¶mËÖ­[2x05Õ§#©@Zf&«7®¥ÿ€ùÈ¿±7Ýçj¬¬N†ß•uĈ‘,˜?ŸI“&’ž–Æo;ŒFýË£L¸ùfºtíBaa¡–WÔ¡÷ß?·Ü2ÅÈÌÌÔò«ñ·Çç¦o@QŠ;tàÕW_Õ•õ½vj]KŸÿB222ر}¯ÍžÅbaÖ¬¿ƒç1®Gÿò(7{t,((ðU€‰“&1fô( y÷½÷?X°)yB`4ÈÈÈ`ëwß1hà@Ív;û÷íå7ߤl÷nêëë´ÝÒ23Yóõ:\z)FŸÛd²Æû:°o_Àa-/×É^½q-ýú÷wÛWˆ‹žf»ß~Ë!C¨©>Í!Cxè¡G°[­;RNVv6Ÿ,þ„/¿\‚Ãn'-3“UëWÓ÷’Ktzû£Ü8c©˜0¢—w ôÉo¾ù†QcÆ ‡Å÷Üö])¯÷ÚÀ¿6¿Á—‹7²ùÙ館¬äرcTU&==ÓUUôíÛ×§†ÀºkkkÙSV†ªº(,, ¾®>¤‚mÒÓ9t¸œ”ÔT.ºè"Ú¶mÝcl>yq=Êæ“žššêþÝ3sê}lÊëƒA» y×òFß¼T³«Õ ¸Ÿõ5yž«Bàôt1RRS±Y­ (¤¤¤hû+ŠBRRv»›ÍF¿KúRöã^m ït:µn³ÑhÔôž}ív{€Žv»=ÀƒšdSà¶Ý»wc·Û((ÈÊRSS¹øâ‹iÛ¶m |ŸzkjkÙ³gN§#jûJJNvÛW›6‡ë#¿Ö#[ (,, ''‹ÅÂÉ'´ò999ddfròøq.Çh4rá…jzû²ú€ƒ÷WíÂ{öõ‘ÂoZº’Ãey—òòþ‡HR²yûÿ¼‹ËåâèÑ£ôêÕ UUùrÉ\zi©ßQ„Ÿ3šÍf òóÙ±s'V«•nݺRS]£»éiJJ¢mÛ ~,+ÃétrÁ`6›µ†ÑE5ŒvÞ¼`Qп¼_ôO÷:Œ›€ßD‡_¾wR"V‹Eûì 3×êB§‡÷.ïg@»­âÓåjœò÷Ïs8tJ„ì‡s°HùAòÌf3ìØ¾‹ÅÞ~ü—ËE—.]t6à/Û›î+;’}•••áp8èÙ³'fï×Ožo^Ù;wîÄb±`0dWž:…Ýá¤l¯û¶^=4½d{õñm,á7â Š¢«tâ…Nµ™QEQ°X,ÔÔÔâr¹øü³O4x°û18]J€l“ÉHAAªªrèð!>þøôëG^~{ ŠU¨T?Ϊ•«èÛ·/Ý»—PPïy8·ñªªøÕÒX³2ÝçÙLÿtÍ!C¤ûå¢=BçSièü€2>­-„þ"âO˜Ì””döíßpÁðS&Š,2S„N žPTŸg2),(@U]üûßùä“Ïè×·o€ ¬Y½š¾}/¡S§Näc4e }eÚxËd¤ ?ÕåäàÁC,þøúµ¯•ôéÛ—’’näç{z%~ ¿:ܶ›*Tþû ´˜ýûëd«¨`åŠôêÝ›®].¢ ?“ÉFvcDoWG»ÿDã})!iii,[¶”Áƒk}4[àŒEEî[999ÔÔÔ°uë6,V æT3ÅÅÅŒ5’¼¼<²23Ix¯¾u ÿÏGŸtmáã¤út÷ÇàéÁò|s½‡äk—}Ê7+ ¬3†sT«%Ð Cû`h‡ L _6àŽ±ˆ>Ïèµ´tr=6°íû°X¬˜Í©3rÔhòóòÈÌÌÐÿ,.„z?èì+××¾¬˜SS)..bÄH·}efdFå„^Œ&…¤§¥‘“›CmM [¶lÅbµšj¦¸¨Ë/¿œ¼¼<222´aG8LÞjÜÝý©.,,bÅòåÚøGSËÓåS€´´4ôÐ4‚NÒxÒü΋Ñh$ÛÓŸ¶ÛltíÒ—Ë…Ñh$--”ÔTŒF#Eñ J²ô±7 êOQ@ýéî}‚§"/`¿ uy/ ~ÉJ€⟠M¨ö 2I©´L¸|¿nªÑhrÛ@F6›.]ºàRU ééé¤$'c4=·B”òüeá¬3§¥iå#=Øâkdr%´ÄÐecqFß<üó¢Ø'¦¼2¦¼ ù@à1D¹ˆû4#¥·@dŒ6/ØLv¼NèŸçû§`ÎQ^ˆó¢ÙXO–…ª7xçµ1 jFŠfÍ£Ì ç@ð<¿ý‚æ)£%‡s´NÚl4CT Z6^çl¢“55/â>aœ0\[F[6`ôtæM"‘4+©~·J¢û%¯D"iQ¤#J$ €Ö5máù‰D⃿¿Éˆ(‘$Ò%’ÖÄ=Žè}rFöO%’3ƒþi5“>£ô‘HÎCü]S‰$ðü1¶YÓ :wi!u$’³Ÿÿt b¯¿yÝNFD‰$Ž(‘$Á~i)‘HZœ “5Ò%’ÖÅç7éŽÉ™¢ÑßÜ?·“ÏšJ$­€|ÖT"I@¤#J$ €œ5•HZ…cÄ– šeÚ$’³…–œÐlQG9+97hé "LjI o_H$­€¼}!‘$ rÖT"i„ˆI Q"I¤#J$ @‹ÏšÊ›úI B?Dô:b˼JQÞÌ—HB!ßâ&‘$Ò%’@:¢D’HG”HéˆIàó¦o9Ã)‘œ)¼þ&ßô-‘$Ò%’@:¢D’ÄõªŒhV»‘H$Ñ##¢D’˜Àó¤©gG>¤-‘´ µ3ú×qÿL™<™ÚÚZJ.¼Xþ—ÿÏ™ÿV‹•ÚÚÚ¸¶I'ÆÝKTnœ±Tܸ󋏬ÀîöLCdßü×»ï2ùž{èsI¶lþ:®Š%’DdáÂ…\ýõqíkµZyëí·¹íÖ[#–UU€ÍI|°¦ÌwŒûÏ ¾Ù´Qþ|JrNpéeƒ<öÿOcÙO+«‹[|•^zÙ 6m\¯‰$aØ´q=ªª"„ªE«XiJPjÒúˆ_oøJFDÉ9ÁÀÁC=ö|f"¢?MŠˆeÃWkã®\"I6|µ6"b|/^¿nŒˆ’s‚!Æ{ìùLED}Ù¸_¹/„`Ȱá¬[³*¶%’dÝšU!#b¿~ýBî·uëVísl“5žÿžïM#®]½RFDÉ9ÁÏ/é±ç@‡úöÛoéß¿À>ß~û­®l«~ùHÖ¬ZwåI¢°fÕ „DP‡Ú²e  Ð}÷/×LŽ›!«V,‹{`+‘$#FaÕŠe!BÚôæÍ›)--eóæÍAËÄ:F´X,@  {¯i¬ª»•_¹|iì;J$ ÆÊåKÝŽ$‚GD/›6m ™‹#64Xضí{D‡@»¦Ë—.‘QrN0úŠ«Üö&"F"G4›ÍôíÛ‡u©@'kF_q˾ü¢)"$’„`Ù—_DÃÑjcÄ/¿øLFDÉ9Á•WsÛóŠˆKƒ§kêþÉT“"â•WcÉçŸ6E„D’,ùüÓ3Ý]Ó¾Z×ÔÞ×)Æ6a#„àóOsÕØ_ ªªü/ÿŸÿ½1ž-Öú¾å•g,7 »í-$''Gâý…þcÆDï¹ÉYÀ’%_rÕUWƵïÒeË¢~]Fuu5Û¾ÿ: âãMãëšz+ZºlY<»K$ ‹ÁhˆÛ®cygÙl¦oŸ¾ìª˜5­_á鑵¾.M%¶ch¦ÉšØ+nmÓœ±ãÆi)ŠÁÐlÇ "S¤ü3MÂè#¹ÞÄùDÜ]S!âÛUklB¸ßGb2™´Íh0hù#GŒ`Μ9üfâo;v=ôv»]Ëñ¥3f —]vÿqíµ|µn–‡|½q#ãÇgÈàÁüå/bµZóx—û:zô(S¦LaÈàÁŒ1‚Ù³g‡ÔyäˆÌš5‹I“&qíµ×Èíׯ'NœÐ¾Ïxz/¿ü²öý…ç_`øðË2dcÇŽcÛ¶mš¾ß}·•ÿ¸öZJKKŽ5˜ï¾÷.ãÇgàÀÌ|f&GŽáöÛï ´´”ßýî.jkkµòeeeLœ4‘rõÕWñá‡jy;vìàún`èСLž<™šÚ-ÅÒ>‰¶5åb÷ë½Îx¶lЂnÀîÝ{˜óú>úhååå|úÉ'ZþÏ.îÁ¼yóX¿~=·ÿö·<ôðÃX,mßå+VðöÛoóù_p¸ü³fÍj¬ÛS¯ËåâÞ{ï¥[×n¬X¹’wß{O>YÌÒ¥KCê´k×.^{í5æÏ_@CCƒ^®ß9ðôòBðÝwÛX²ä .œÏÚµk™3çuòòò4¹Ë–-cÎܹ|öùgìÙ³[w¬ÁôXµro¿ý6Ì›ÇÇ‹?æ‘GfêÔ©¬X±›ÝÁ¼yóBàp8¸÷¾û6d(ëÖ­ã™gfòÌ3O³uëV>ø×^s «W¯fÒ¤‰|öÙgñ·OnÑûŽÞß|"bì~·öAÇÚ@O=õ#FŽÔ¶Ù³gëòo™p3ƒƒÁÀe/cמ=ZþèÑ£ÈÈÈà—¿øYYÙ”•ý¨í;iÒohÓ¦ éééÜõÛ;Y²äK! !ؾ}åååÜ3ùL&íÚµãæ›'°tYpC¸é¦›0 (ŠÂ„ ·èäœÏyBšš‚ÅjáÇ÷âp8ÈËË£}ûöÚ~·ßq™™™dge3rä(ݱÓcâĉ´iÓ†¢âbúõ»„KKK¹à‚N˜ÍfÆŒMÙ÷äÏ÷ßoÃÒ`áö;î@QzôèÁرãøâóÏùþûmX­6n»í6ú÷ÀàÁƒânŸDÜbðÏW7ô§LžÂˆ‘#µïmÚ¤ëŽ!-½ö=59•êªjíû‚… ø`Þ|ª«Oc49qâ õZ~^û<ísû¼‰DStÔº¦"Æ1¢gßdÓîÀjµj›Ífó™Pá?ðöc]]))É ª*6làà¡CZy€·ß~‹ššjkk™ûÆŒ3&@vÏ^=i›‘Á¬Y³°X,¨ªÊO?ýÄŽ;‚ê ðö[ïP]]MMM sæÎÕɽðÂî|½ñkTUåÈ‘#¬]³F;/{÷ícûöí8NÌf3©©©¨ª+ⱆÒ÷ÿüs®s={ôDUUÖ­]‹ªª>|˜µk×j:ÇÚ>‰¶Åâˆþþv^=ôýøôé<>}ºö½{÷î¼óÎ;Úw]7ÏgZ½gÏŒ¸|&ÜBAA>]»u£k×®žÆt—>ürî¸ãvNœ8ÉðáùóÎßt!Eá¥_ä¹çžeìØ±¨ªJ§Nøãþ²-GÉwÜÁÉ“rå&éIDATrÿó™þøß˜¿`>ùùùî§þ=:Õ××óÔSOqôÈ ýûõãÎ; [úk(tãRü#¢û£ÑÈsÏ>ËŒ§Ÿfddfrÿý÷Ó§o_ž~úižzò)æ¼ñ™ :T“Oûœ½èG¹qÆRqýÐîôɪ M›¶EüëÝwùÝ]wQ]]Ý"*JÜŒ7ŽW^y…nݺµ¶*’(p¹\,X¸Ûn½5bÙººZ~¨Î`Áº½çÓñìÄ7êJ›V™¬ñöë%-ˆx$>ÍàˆñÝŠWê–åãÅ‹ÙÎg ±MÖøŽ¯Ï³ûˆIK"ï#J$g9q9b×.]Ü÷´Fnn}$’³–eË—ÓµK—¸öë-nÞ·T-[¾<®J%’s‘XÞkê7D”+K$­ƒÞßäÚI Q"I¤#J$ €tD‰$Ž(‘$Ò%’@:¢D’HG”H¹b°DÒLȃ%’ YV ޹b°DH,+û#%‘$ò‡ÁI3!,‘$òåQI #âyÀ³3ŸÅh2òÀ´¶*ñ×õÊ+¯ä…^ gÏž­¬YËÒjñlqÄ-[¾á¹çžc×î=$™L””t㤴´´µU‹q­¬ë¯ëäÉS(,,8+to 2"†¡¡¡)Sîåw¿ÿÿûl Û¶m#Éd:+ô×ˆâµø^œN'&S“NmT„¬ÇO×ñãéN>›Úû sÎ\´§ÓAff3fü7½{÷fô¨QL¸å6lØÀéÓUôìÙ“iÓ#99€ŠŠ ž|òI¾Ý²…””n½í6îºë.FůóV­^ÅÉ•ôêÕ“'Ÿ|R3ì]»v1uÚ4*Žã’K.¡]»vdee…lóÑ£FqÛ¯~Íòå˰Y­,X¸0lýGŽeÆŒÿfË–- FŒ¸œéÓŸ`ïÞ½<ñäìÙ½‡ìì,î¾û\{íµ!뉤ë¸qcyöÙçèÑ£GÄãÞ¹s'S§MãxE…NÖý÷ßß\&Ñb4ËjPñVœè[‡ŽÉÉÎfêÔi‡9PÆÿXbYy7ÔŠ¾W¿%ô Å‘VÖ º;vüÀ›o¾Éó燭ßét2eÊd:uêÄòåËY±b7Üp“Vw¨ƒÕ®:½#÷<À7ÜÈš5k¸óÎ;ùâ‹/Âw‚mÒCl)))üãÍ––Æ“O>ŨQ£¸ûî»)//éˆÚª"òÊ»¡Vô´ú-„^¡8Òʺ¡ `Â-·b4ÂÖ¿ý‡¨¬¬ä¾ûî#99£ÑHŸ>½µºC­ø¬ž¨tõùmÛ†ªªL˜p3BúôéáCÃw¢mñr^LÖwà¿þë/TVVòØcñشǘýÚl­Œþx¯â‘VÞ µ¢o4«ß†Z¡8Òʺ¡ð]8\ýÇOœ ?¿£Ñ /ÜŠ¿Þï¾õD««ð™¼ uܧ*OѾ};Ý~ùyy;QhGljÅ­ENN×_=O<ñ„¦SVÞ µ¢o4«ßŠ«öFZY7¾òÂÕÿý÷ßSq¼§Ó©E6/áVü ¦w´ºk°ãÎÉâĉ“ºý***èØ¡ãYakMÑ1gÇŠÁ‡fîÜ78tè v»ƒÿÍüùó¹øâ‹›eåÝP+úFZýB¯ÚieÝhVõ W=ÈÍÎæÕW^Åjµb·ÛùÎÓ- ·âoÐz¢ÐÕwŸ°Çݳ ðþûóPU•ï¶mcýúõg­Éˆ†´ô4öíÛËüùPYYIzz:¥¥¥<ð`ãê¹MYy7ÔŠ¾Ñ¬~«ëûLùư+ë†ÂW^¸úEá¹ç_`æÌ™\qŘL&†Nï^½Â®øLïhuõÝ'ÜqÏxú¦OœY³þ?}úôaô˜Ñ(嬰µ¦àY1¸„^§ÈÈÈŒ¸“\1Ø\Ñ·åyôϦÿÜtóM­­JDbY1¸¦Æí;Ûk²Xø•\1¸ÉøNBHšÎöíÛ騱#™™™|³e 6näžÉ÷œmÜj³¦gà ýE䊾ÍË{äá‡Æét‘‘ÅŸý3EEÅgEË1b+!Wôm~® ׌¿F—v¶´o“Q‰CÀÙtQ"9ÄãŠçñ€ÑŸCIG”Hš†Éàãˆ&%6‡’+K$ijb°÷Ø7®ˆ(W –H‰ç½¦IŠODLRbŸ‘’+K$MÇÛ55¸¿´ª.Éy‹QñqD®VUF"9_ÑEĤ'k$Ió`òLÖ¸»¦qŒ%IÓ1|1Þûˆ‰$~,‹vëÐ¥#J$g‹ÅÂÛ·ã´[#Z²k*‘œIÌf3}z÷FÜ{rÒ¯±·²ZÉù…Åb!55•£§ä¦Q~}•øÕ¥™ø½ÚD"‘4#‹³Ù¬uKûôîÍ{ßÙxþîŠûö…Qa;ä3ÜIËàu>›Í†Ùl¦w¯^|uP¥mŠûi-N}c°8ƒ:§P”™D›ù¸DÒœX­VœJ2姬?`!#ÅÀßn®€#zùã«+ʼn:ç™×R"9OÈM7ò÷{Gé|ïûsTk´ïîIEND®B`‚qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/doc/src/000077500000000000000000000000001225012771600322645ustar00rootroot00000000000000audioinput.qdoc000066400000000000000000000033671225012771600352470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example audioinput \title Audio Input Example \ingroup multimedia_examples \brief The Audio Input Example shows the use of the QAudioInput class. The example demonstrates the basic use cases of the QAudioInput class. \image audioinput-example.png Qt provides the QAudioInput class to enable audio functionality within a standard application user interface. This example calculates the maximum linear value of the input audio from the microphone and displays the output. */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audioinput/main.cpp000066400000000000000000000042601225012771600323620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "audioinput.h" int main(int argv, char **args) { QApplication app(argv, args); app.setApplicationName("Audio Input Test"); InputTest input; input.show(); return app.exec(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/000077500000000000000000000000001225012771600311315ustar00rootroot00000000000000audiooutput.cpp000066400000000000000000000260201225012771600341400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include "audiooutput.h" #define PUSH_MODE_LABEL "Enable push mode" #define PULL_MODE_LABEL "Enable pull mode" #define SUSPEND_LABEL "Suspend playback" #define RESUME_LABEL "Resume playback" #define VOLUME_LABEL "Volume:" const int DurationSeconds = 1; const int ToneSampleRateHz = 600; const int DataSampleRateHz = 44100; const int BufferSize = 32768; Generator::Generator(const QAudioFormat &format, qint64 durationUs, int sampleRate, QObject *parent) : QIODevice(parent) , m_pos(0) { generateData(format, durationUs, sampleRate); } Generator::~Generator() { } void Generator::start() { open(QIODevice::ReadOnly); } void Generator::stop() { m_pos = 0; close(); } void Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate) { const int channelBytes = format.sampleSize() / 8; const int sampleBytes = format.channelCount() * channelBytes; qint64 length = (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)) * durationUs / 100000; Q_ASSERT(length % sampleBytes == 0); Q_UNUSED(sampleBytes) // suppress warning in release builds m_buffer.resize(length); unsigned char *ptr = reinterpret_cast(m_buffer.data()); int sampleIndex = 0; while (length) { const qreal x = qSin(2 * M_PI * sampleRate * qreal(sampleIndex % format.sampleRate()) / format.sampleRate()); for (int i=0; i((1.0 + x) / 2 * 255); *reinterpret_cast(ptr) = value; } else if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::SignedInt) { const qint8 value = static_cast(x * 127); *reinterpret_cast(ptr) = value; } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::UnSignedInt) { quint16 value = static_cast((1.0 + x) / 2 * 65535); if (format.byteOrder() == QAudioFormat::LittleEndian) qToLittleEndian(value, ptr); else qToBigEndian(value, ptr); } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::SignedInt) { qint16 value = static_cast(x * 32767); if (format.byteOrder() == QAudioFormat::LittleEndian) qToLittleEndian(value, ptr); else qToBigEndian(value, ptr); } ptr += channelBytes; length -= channelBytes; } ++sampleIndex; } } qint64 Generator::readData(char *data, qint64 len) { qint64 total = 0; while (len - total > 0) { const qint64 chunk = qMin((m_buffer.size() - m_pos), len - total); memcpy(data + total, m_buffer.constData() + m_pos, chunk); m_pos = (m_pos + chunk) % m_buffer.size(); total += chunk; } return total; } qint64 Generator::writeData(const char *data, qint64 len) { Q_UNUSED(data); Q_UNUSED(len); return 0; } qint64 Generator::bytesAvailable() const { return m_buffer.size() + QIODevice::bytesAvailable(); } AudioTest::AudioTest() : m_pullTimer(new QTimer(this)) , m_modeButton(0) , m_suspendResumeButton(0) , m_deviceBox(0) , m_device(QAudioDeviceInfo::defaultOutputDevice()) , m_generator(0) , m_audioOutput(0) , m_output(0) , m_buffer(BufferSize, 0) { initializeWindow(); initializeAudio(); } void AudioTest::initializeWindow() { QScopedPointer window(new QWidget); QScopedPointer layout(new QVBoxLayout); m_deviceBox = new QComboBox(this); foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) m_deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); connect(m_deviceBox,SIGNAL(activated(int)),SLOT(deviceChanged(int))); layout->addWidget(m_deviceBox); m_modeButton = new QPushButton(this); m_modeButton->setText(tr(PUSH_MODE_LABEL)); connect(m_modeButton, SIGNAL(clicked()), SLOT(toggleMode())); layout->addWidget(m_modeButton); m_suspendResumeButton = new QPushButton(this); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume())); layout->addWidget(m_suspendResumeButton); QHBoxLayout *volumeBox = new QHBoxLayout; m_volumeLabel = new QLabel; m_volumeLabel->setText(tr(VOLUME_LABEL)); m_volumeSlider = new QSlider(Qt::Horizontal); m_volumeSlider->setMinimum(0); m_volumeSlider->setMaximum(100); m_volumeSlider->setSingleStep(10); connect(m_volumeSlider, SIGNAL(valueChanged(int)), this, SLOT(volumeChanged(int))); volumeBox->addWidget(m_volumeLabel); volumeBox->addWidget(m_volumeSlider); layout->addLayout(volumeBox); window->setLayout(layout.data()); layout.take(); // ownership transferred setCentralWidget(window.data()); QWidget *const windowPtr = window.take(); // ownership transferred windowPtr->show(); } void AudioTest::initializeAudio() { connect(m_pullTimer, SIGNAL(timeout()), SLOT(pullTimerExpired())); m_pullMode = true; m_format.setSampleRate(DataSampleRateHz); m_format.setChannelCount(1); m_format.setSampleSize(16); m_format.setCodec("audio/pcm"); m_format.setByteOrder(QAudioFormat::LittleEndian); m_format.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(m_format)) { qWarning() << "Default format not supported - trying to use nearest"; m_format = info.nearestFormat(m_format); } m_generator = new Generator(m_format, DurationSeconds*1000000, ToneSampleRateHz, this); createAudioOutput(); } void AudioTest::createAudioOutput() { delete m_audioOutput; m_audioOutput = 0; m_audioOutput = new QAudioOutput(m_device, m_format, this); connect(m_audioOutput, SIGNAL(notify()), SLOT(notified())); connect(m_audioOutput, SIGNAL(stateChanged(QAudio::State)), SLOT(handleStateChanged(QAudio::State))); m_generator->start(); m_audioOutput->start(m_generator); m_volumeSlider->setValue(int(m_audioOutput->volume()*100.0f)); } AudioTest::~AudioTest() { } void AudioTest::deviceChanged(int index) { m_pullTimer->stop(); m_generator->stop(); m_audioOutput->stop(); m_audioOutput->disconnect(this); m_device = m_deviceBox->itemData(index).value(); createAudioOutput(); } void AudioTest::volumeChanged(int value) { if (m_audioOutput) m_audioOutput->setVolume(qreal(value/100.0f)); } void AudioTest::notified() { qWarning() << "bytesFree = " << m_audioOutput->bytesFree() << ", " << "elapsedUSecs = " << m_audioOutput->elapsedUSecs() << ", " << "processedUSecs = " << m_audioOutput->processedUSecs(); } void AudioTest::pullTimerExpired() { if (m_audioOutput && m_audioOutput->state() != QAudio::StoppedState) { int chunks = m_audioOutput->bytesFree()/m_audioOutput->periodSize(); while (chunks) { const qint64 len = m_generator->read(m_buffer.data(), m_audioOutput->periodSize()); if (len) m_output->write(m_buffer.data(), len); if (len != m_audioOutput->periodSize()) break; --chunks; } } } void AudioTest::toggleMode() { m_pullTimer->stop(); m_audioOutput->stop(); if (m_pullMode) { m_modeButton->setText(tr(PULL_MODE_LABEL)); m_output = m_audioOutput->start(); m_pullMode = false; m_pullTimer->start(20); } else { m_modeButton->setText(tr(PUSH_MODE_LABEL)); m_pullMode = true; m_audioOutput->start(m_generator); } m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } void AudioTest::toggleSuspendResume() { if (m_audioOutput->state() == QAudio::SuspendedState) { qWarning() << "status: Suspended, resume()"; m_audioOutput->resume(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } else if (m_audioOutput->state() == QAudio::ActiveState) { qWarning() << "status: Active, suspend()"; m_audioOutput->suspend(); m_suspendResumeButton->setText(tr(RESUME_LABEL)); } else if (m_audioOutput->state() == QAudio::StoppedState) { qWarning() << "status: Stopped, resume()"; m_audioOutput->resume(); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); } else if (m_audioOutput->state() == QAudio::IdleState) { qWarning() << "status: IdleState"; } } void AudioTest::handleStateChanged(QAudio::State state) { qWarning() << "state = " << state; } audiooutput.h000066400000000000000000000070701225012771600336110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOOUTPUT_H #define AUDIOOUTPUT_H #include #include #include #include #include #include #include #include #include #include #include class Generator : public QIODevice { Q_OBJECT public: Generator(const QAudioFormat &format, qint64 durationUs, int sampleRate, QObject *parent); ~Generator(); void start(); void stop(); qint64 readData(char *data, qint64 maxlen); qint64 writeData(const char *data, qint64 len); qint64 bytesAvailable() const; private: void generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate); private: qint64 m_pos; QByteArray m_buffer; }; class AudioTest : public QMainWindow { Q_OBJECT public: AudioTest(); ~AudioTest(); private: void initializeWindow(); void initializeAudio(); void createAudioOutput(); private: QTimer *m_pullTimer; // Owned by layout QPushButton *m_modeButton; QPushButton *m_suspendResumeButton; QComboBox *m_deviceBox; QLabel *m_volumeLabel; QSlider *m_volumeSlider; QAudioDeviceInfo m_device; Generator *m_generator; QAudioOutput *m_audioOutput; QIODevice *m_output; // not owned QAudioFormat m_format; bool m_pullMode; QByteArray m_buffer; private slots: void notified(); void pullTimerExpired(); void toggleMode(); void toggleSuspendResume(); void handleStateChanged(QAudio::State state); void deviceChanged(int index); void volumeChanged(int); }; #endif // AUDIOOUTPUT_H audiooutput.pro000066400000000000000000000003521225012771600341560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutputTEMPLATE = app TARGET = audiooutput QT += multimedia widgets HEADERS = audiooutput.h SOURCES = audiooutput.cpp \ main.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiooutput INSTALLS += target qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/doc/000077500000000000000000000000001225012771600316765ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600330645ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/docaudiooutput-example.png000077500000000000000000000272761225012771600376260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/doc/images‰PNG  IHDRØŠÈf„sRGB®ÎégAMA± üa pHYsÃÃÇo¨d.SIDATx^íytŽç•ÿfÎÌ™™÷æeÞ¼óò’É; $/‚Ml/a0Æà•$2q^ /Á ‹ãÅX^cLÄFÞƒŒ7Œe°¼Ë‹d­¶$KÖnk³­Å’å}#¿ù}««úÖíÛ}o÷½WB²Kç|Õ[uUuu}ºº~)ëÖ­£¥K—Òo¼AÓ§O§'Ÿ|’¾}ý F¦ LXÆG'N¤´´4zë­·hÉ’%”‚¯¾ú*M:Uèuÿr#½›¾ŒÎ\¸œ4>™Œb—Á).'7]ºü%ü×tåÊ•^ÓŸÞþs¯¥õî&ôZZÉ.ßßs']ºò¥`쀡 &Ð /¼@óçϧ”yóæ ¸¾þß …KÞ§c]穤¡›rªO$¬½U‡’Œ/——–:mí«é¤x•[Ãq¹ÉNG¥¹Lôq}A´›Ãﮄ:lí:ÔNPv…¥í(o§ã'ÏÓ#S©ýä9ª?v2˜Žsx[ݼÞM‡c¨µë,Í™÷uŸ½3l¬¸püHµ]M ë-5³Z„VQ«T;/O­¤.ÖIV·¹…þ“Ÿ­¤N!Ž“ÕÁjcµ²Ž q>XRÈW=çñxq!½ëvj?uA0vÀXR¥(˵pñrª=~&a¨Pi^yLNˆòj; Ê·ÕÅëþ¥Îg¹ÓLH>pí9BV™ì­î`(;hC¦´ëPCÖAÙMj'ƒ逵1`uASáE €Í~}AÒ‹ûÓoÆQkYÕ­úØÖa^oX ­ fV ë«u¥Ö ©.^&"ÄÓ¹ÖÒ V«•uœ÷e5³YÈÏV½ÔÑü<õS 0uÁXR–,%55U˜6Зè/º°LlMd¨\ ª<®L P]° ¡zKE¶Nòzl©óâYpZqKæù÷#\oèàC²¤{`c)«–]aÁf[2Í‚)ÀY\ ù„ €Í|u~Ró‚ €-øÕ£t¬¤„ªV,ªeÕ±¼œŽ°Xͬ–ŒetŒÕ*Õ±rZJ]>„pŽp؇8ÔÆje•jÉXN¬Ö‘–S=«ŽUÍ:š³—FÞþ“0ÀP÷Á˜2d¥Üpà ¢ýXÒp2!À”ÕRÍ?, •ªŒ ¦âÃ'i?tÄÒ¡naj£éçÓUv*®È¥J+Þ%òTE|NÑaõCÒÉPZСŒÔ`h°jš1h;Y;¸É¨šˆÇ¹âW5wF¨š÷ÅR ‡j‰­£'NÓŒ9oЉîs®ák9Ž×,¦GFýÆ—ç¸é§µ uµQùÒ…tˆU-[Hµ¬:Öáå ©Aª…—ÐqVëò¿P;«ƒuBêOÏM ˶qÌk?Ž!ÄÕÊqc}ŸÓ`5Jáe=ï¯eUCœ§JVã®lzä¶[#K` l¥À”µw_ˆhÖ±f!«¥Y,ÙìS– JA¥ÃTÊ@•5Z:Øt*†Æ!œçC*x—¥œF•px!õƒ€­Ø† 0´=ò-[4-ÈZñ 6*•Z:¸|·QùoUð1_jàpBíB‡45·Ÿ¢Ó^£L߯¯.¿댧’ÓƒZ8­7Ç £æ¼}Tö—tU.UµpAµ¬:ÖV«‰Õ²ðM:Æ:Îj]8ß–3_Ø^ðÿžÐéØgÅ…8›YH£q§ÇªgÕ²ªYÈK…T9ò²}+ ¿uP`02` l ÀÐc¨ðç+Õ$tÂe5¡œ`Á:¡¢* ÊªŠæStj9E8î:/ÆñÇ«r>7~Éy½¥6XPüØ(Ë&@ƒ5ã&µeɬŽë¹LÆ Ç;©ðP°°,¬ôV‹©*#Ôl«˜×ëž )/ͦ£Ý„m7¬¸šãqh?oæ´^{ègtd÷.*x-ŠXŬý¬ÒyiT6o&•³Í{…ªY5¬ú7^¡Ã¬FV“Ð j‘šÿû§]arÂ…p8§™…8â„êXH§š—•¬Š7fÒAVÙëit€µŸU̪ý"“¼ùÆÀÀ˜òØË3çP<ÊX¿• øyCX-®P,i­`©T• UÕQKÕÇ 3©ýŽ%ÂûŠ;že%ÇŸNñy,õƒ !…õÅ ~`„e YÏ¢ø1B§K.ƒfC&:?Ú- Æ€Õ·tоƒG(W ëÑ”W~„‚©Ã7PmS;ýñÅYÔÒv’òyÛM:`^MEU©q<¿‚ãqQms;½öÀOépöÊK{Q¨€UÄÚ?ûE*™=]¨œuhÎtªbÕÌNu¬#¬©&^*½ñ»?D@¦çÇUXu>âBœPÄé ½ V)«„u`Ö‹TÌ*d峪3×Ó7ý 1Àró (šòò )¿°ˆò Šh¯«°€roùQQ‰”ÕX°ÊZ)¨jªî}AL-C¦TÃëñÊ‚5ù€W<ð)þ± a)¬o ׯƒfAvRtô ódžLv|Ø€q±¦©ö”Ô íÖdí«Ó^Þ*õVsSUc=7}&5µv¹Ç9€æäÉ“BXÏ-«S¬ã*|5§5÷ÞÛ¨ž›[9/NÚÇÊg¾<™Š_žDûYe¬ò“è«ê•ITêg–j८7žø°<ª|b¿N¸'tâtÒEúż^ôÒd*`å±rY•ë×Ð}7|/1ÀÎ]¼Lñ€í)o‡KZ.eµà`?Mu¼¬o=+T×z&†riÚ×Rhêv„³ÖSfäú8/V¼*?ÉYVÛ°…@SÁ’¡Ã¦˜!Cgz6Ñ‚gZ¼_C§Ç.n*¶v[,·¤––¬ßEK>eaéпÿá_¨ü¿å°Ë?ÛMï;µa7í,ÖßËùb­a!ûæÍ¥ÿÝI 0¼ùÞº­„F¾°ŠFÏXIcggÐÏç­ Ô?ñKé£Géâ…óaúÉ“ËĶeÁš#›…Ü$Ä/º\€êpÖÆ 9ÅÇêÃdA5 ßÿv4¨3gĘð¡dýh°e–VÔ²j§i÷Ã)å5´“l¬¦b·hBÊ¡™¨zÅ;3¦=ƒíÙ_Mï­ÝIï­ÙI‹¤Ä¶TÐç¢Åë²Ii ¯+mÏ+§qOò±ùúé ú„…<漚F·þÍJ °/%`øs&=½h=³ôSzîõôÇ•«|ÖbfwfÈg.e­¿s0m¼k0eÝõ#Úz÷Í”ý³›i×=7S+UÀ*Ò”öÐC.=onÛ§Î+”qíãå^V6k§³å®›i§‹ô‘µœŸÕ,äÊ厘[ÿö?'Ø©3ç„{qE ›óÝ÷ê[4ôÍù4ü×lÀ.°Åºpþœ°\Ãß}Ͷ`9 ˜ì~WÏ^Vó°–Òä ›¢ô0-)`¹4Vi,Km³•: ë¶}.}Móàpº×- VGK†¥Ð}+j-HËÖÒývܜƃkhŸ8âØZÊÇX;¾ðí°^v|Ã9¯œçÿ¾—g‹ªåuÀWK‹y{È ~N\Z¾žË:%:;, f½+ËçE¼³,˜Õ›ØÊ]¾CùlÏ~ŽkÝ.Jg½·–—¡"577ûÂ.åJï@Øž_Aýîy*©n’PìᥥåR8¿ººÚ—vùg|®‹v¢Éh"~¸œV¹VÞ­f­a­à6Êz}ÁÊbmce³v³ö»ò†ý„ ú =ôc[Î| ‹5âž_l«ó 9Ž6È|!ÈgÞŸÐÿ×ÿˆ0ü‚ž>{^X°¡óߤ‡þü:=²h.^6“]ñ’ìÒÅpÀÔ3žÁ",˜XÎ [1@±%ʃe’MD'`;`åæÐFýNíÓ)‹¶}çÃÇÌ~1áV –ªnÛlŽg6ejǬŽ °{€ít†÷…è®W€©®zÕ‹øÈ/C9ÅÕôáç…´<3Ÿ–m°´<³@è}‡>àímä}RòRiÅç¤kWq-ÿýd:X{”>âcaú¢>ŠCó9nÚ½¿Ž¦}ÿŸ¨lÝ*útüHZÏÚÀÚÈÊzœõë‘´µcÂÊfíaåþvåýö*úíp*zb8íg•øÐ—0؇8 Ä íý÷´[¦·—[9}äcç'SæoıT°ì=ú¿ÿûëÁÓGˆ+ÀÐô™>›Æ¼ÿ ýâ£è±U“­&¢l:;;\ã.jÑDÜ:‡!Nï•°%ãJ˜ùÊ×l+"šˆªI¨5ó?’€ÙÏjú3˜ÖDÍH£=Ó©}®Çb†çCØË9¢Ù 0a±Ø‚°šcÜ–MD<ƒ…:9¬÷axþÂ1¦:9Ô»041øïÁÆ=ù,í.(§u;RÆæôqVH›KxŸ»Vò~¥Ox]hK©Ð*§¶ò>VNÉš0q:Uò¨‘Õ¼¡me´šµ& Ê-m i7~‡mÜ@_<56±²&ZÚöô¯i+›µû™Ç)÷¹Ç)UøÜx*š4žüq<•@“ÇÓA*s ƒ}8ñ N¨@¦ƒô.ÒG^ •·­“Ÿ¦¼•+éÁë¾MmÜÂ_ŽhƒÜ=_4;?¿P€ZšF~ø2ý2c_óGúõúg`¶.œ?OÝÝün¤«Sö"ºwrìùaºšrDÌ¡©èbçÊ«ž¥¬&7Ëžz.’Ï_ú3—},ì,ÔeoušhMDÕowVȦžØÖ×(tjpÚS·Y¯6ˆNŽÙ¡a=WÁbmО³p",7sx}ï ë¹ëÞjøý_7í²;9¬Dõ €éïÁÔ`v¸ý,Íz{½8ûM~éÛBsªimv%­ÙyÈÖZ^÷ÒºìC¤ëSÞÚU)´Þ¡ÂC-ôä³3¨ºñ­ß]IŸyªŠUц ÚÃá5U¶ÐKƒ¾OU[²hÛÔghÛ´ghÇ´§){úÓ´›µ÷ŧù½Wæ—ž¦¢—ŸæwR©ä•‰T6s"•§=%T™ö{ªJ@å|.â)›ù•p¼8"!+]¤¿—ó‚\F½³^~tŒ ˜™+`nß6=wÞÿ`­h&:åìì™3VÖ‰žÝôxÙŠQëgXðØ’Ö¡^ïȘ1'¬+>VLv,v'G®z¯æÒÉÑE/š‹2OÿT†÷lè9,]+;4†ÓâRù\5Të´º–rÕËr;DÅ3t6M~@†—ÍÍ{i’<öì&«‹>ô¬KŒ ïÀäP)|®ËVZÝHýMžñí)'zÏŸ;G§OŸ¢“l½`ÁNŸê€é/šË0H—ÁÅ) Y•|G$Frˆîz4¿"«+<æqmtˆ>RÄk=ÚèktˆjöÕZ£E£>ÂFuhã'qíÍ"†KiÖËÅ!?õQï¿ðÉÊvlëAÁq¨•ª;èµE+é1~>ºoÄ/=uÿˆTò^XûÑ0îµtÓC¼?iÍq±Æ_ÿôÐwBþݤá×}ƒ¹îŸè‘ë¿I#¾÷MùýoÑÈ|›FýàŸiô¿²nøá¦å£7~—ýáuR×ÓÏx=¯kº)´>†÷Å1Ç>ìÍqŒºñ:yÃwiÄ¿~‡átf ÿþ·é¡ïýzðúoÑPÎôëߣ7Çá1›TT‡ïû"?¼SöXÄh€½c,⬹¯Ólþvh†#ÜÂåŸØC¥0Z¡´ñ$²r2®|¡áRîâîäRù£_ôî¤}²Ökè=t\p³ÏU^ãp½b© ‘r6 Õ§+ÒzYŸ«Xpm;È€•µÑæÒVÑ»ˆfïÑÎs¬óÂwH~tœÃEˆŸóðYŒ›ð SlíÐÛTx~é¯rZ®°¾ ¿€ír?lì¡K6 a¹¬‘Ö²%?QAÓpm)kpe•´ÒŽGhïWB˜,‹ðJ[N%€ª´­¢®í¼-ÄéBH_—s*l«iì¥øÛú@}¥íw©O£t]ÿ:<êºü¸U|w'dʇ a}[°X‘Š97äaYâÃBVa=›Qù”ú° ¡‰$¾ã‚U“cÕûx?-QçÅ÷y‰½SߟÉîõhß•éß©ŽŒÐ'*r`¯nµ¸üÔç)¨¸\ÃEt •>gÀ>ß/¥Á¶‰×à ‹šÖ“À“ ù…K… –3¼/Ð\ l±êyÐãILï9QS`°*>S0døÞÉþ’™µÑ-m}tiY5|'ï‡Îó‚|)Æ Yùˆ%•gµ û2Úãkg5‚xÇe5´¦ #5¤ÕÂÌøzY4 …Õ±¬‘® ä-Y8Ý’ù±f–Ì@&fQóõ æ—\eÉÔ»5Ó“ŸÔÄ66ù!¦õ1¦œ>}@ï}Òo¥_Œ|h Íš+Ä9÷‡=§‡üÁI˜äÝjð®>:Âbá=—œEJK5 aµÐ,T–KÁ§š 4Ñ\”–Ì«ÙØ;MF«ÙÄšõŠ%äC=ØdL:`ˆlj1kËMÎ2µ—xÖƒ+¡–ÖD4qMbãs5/,‰ CجVÖ'üN9gË`!—©áìiêätuÖg'¡& xÆâ&”š1Jtb°ÕØ*›ƒ¢I¨ƒ%›…™ÅÇH—›²fNÈ`ýtÐܞ͢5Ö,þç²à¡œÍWs±!K*`Î_4ѶeØdeÓ+¤N4'…ä”A§Só9}šŠß‚Ãÿ‰º(¶´¹ UEpþJ[sjXs¢ù‡ ºRÏ=¨Ü耰-–ìÈËÖlC‘”[hú³™ì±!ãm2¬#ý 9›ŒnÑ:@‚X²D!Ã}ñZ<—% 073뼨½|¡:p¢ò&0Á©ß櫲"v^ïöKéKh"šð B¿ìª'Nï@°¬” P±è M<ùlhtk¥àúŒƒh­G­™ìaôó\æ Ypk–ˆ%ó Y’­™/ÀÚÏQ ¿s ¤Þ‡š9Œ›üœ4Œ•ÎYßjâ°®êàý5ò¶›x¿ÒþˆT ”ZRƒ–­Oqܾ…£K"¾?³>ä´¿Yó8W|Þ£§a§ÊË‚¥ÔÀënjäýò¸fgÙ¸nÛeë~ÿ½êE¢û}×™€õŒÄõ¢'âeñˆñO™20uÀ£€7ÈbZ0X-À¥&61Kk‚#Sz#`%b|¬nz˜©HæÇ$v0€«c¬nÖX®ù…ý µ—‘Ìf,XÖ_€á2çó f~¯v듌ëS€9ùS®sÓ«¡N0X2*àÕ‡mÁCS\ž=ôI; `°«Žd\ŸmÁ´I`éÌ…+º»"Ǫq'ÄW³æ=˜,•ðjŽŒ€k嘲»Äj΃&ž¿:u.8`Ô‘?“+öLÊǺ’Ú§únépŽ}<Ÿfr¥PžNÍ̧ü™ƒ4o,ƒhf¾GZ2M„Çy©)béš7ßù‘iÙùM¥ ýúÔzF*á®=ƒRS<‰ðòxDyyíw\¯3ïÎ2×ò§Ê¾®ùÕî—8Ž{ ËÙíZ“t¯gòýQ÷95Ù‡äm‡yòq´°œå0°¢¸Q©`W¾Œp€ÑÀAz‘©öövjϳËú-YiìcØN¡Ô Fí×ÏuG†GENÍðH aò¬Ê‘Çë²Ò‹ü8ãôŸðüæv¤ví„ýƒfæÙû·¸±.aE¾\®AÄò‹VŽÎkAXG¥IÜ**­ù »žhå¯âqM—¯7,ÿQîµ^ôûäȧ³œãÝvƒÌ-® €§ÓKÌ” Øå+ðpqöB0Àα £ššªÙ2•œJ[°n+ƤŒ¡tuÌÆm¿[½! ×´œy@Úiê—¼ùÍk^øz®±†¶LH§nÑ®[–Aú ´1éö±ô1)4&]æÉy]±ÊÑyÜ«Tþ<Ž{æ·F+3ŽáTå »>·xeêç^{^¯^‡’³®CªŸáq£.i"‚§‡0ìË¿Ò î ÑuîbpÀ„÷Í`›uôjŸZ¦¦=Œó¸3$›¥W{·ðZz›µ ª›#óæs¿óšD~FSº~¼ŽtNåtû­ítmŸ³™¦”×ãV^±ÊÑ­|œe®çå=:="_îùE>µ²v½Ç}Hô^{]o´´8†:á~¬ë Xqòs™™²»Â'ùAM×îÇÒD<{ö,UVVReÖ0` ea]hß°½H?†}hJ– £ÎÑÏÅ:WÈE.qfM@)H#"-Ä—ESÈôTqSáUœ|ÌŽGä1”ŸÈøµkPç^$¯O]'/U:*Ïz絩2r½†åè,¯8äõãzLÉŠž_§~_ì{¨]£¾Ï-݈{éã^»Ö4cå) ÇQ—ƒX0°âäL…Þƒñ°x^ÔôE32UQQA›&3škX¾a“7ñ~ulÀdÚ„õ…£Â]Èb?ÎUÇ9ÌÂQV<&o²×Åö¨QV8Gøˆ4ŽÐB%ó±i2Ã)ógÇãÈküa×5ŠÚq«4ÂÓ©¨ØD“ôP“$TÈ®É;¿>ÊÑ.c΋[9Øù³ò1j¡žÏÈrA^ô²±ËHåÓíz£•¿~ÌǽõF»÷Ö}ûj0°âä'ìE3&ItNäƒKÐ~†ý3½;’RF¾ß¹ñ¦ÙCç}>馘×òîÈùnœe4ß(Û›&ÑççùÉoÜ÷Õ-Í~p¯Q—ƒX0°âä'bâQçüßèn ÒDD¦JKK}ëú¯ûz'À¹AÒéý°™ôüM|m#Þñ(‹whDJ/]ï;#Ø‚ÞDÏgF»/±òëÿžz•u»×A+N~’ØéÓ§©¤¤ÄÈ”A¿¯¨ËA,X†¡ýâeîþýûLôÛ:€:Œºäs•lœ6þ|jnn&ÐodÊ ¿ÖÔaÔeÔi?Óñ0øÆ ò †ŒÌš5KPo¦ 0S&ôç:€:Œºì.„Q€9z>ƒ)ÇsAó›!ÎÇg& |jaÊ·wËWL‡Ì0Ý«£¬wo”£–·0Y`N—©°þyà ¨½{ßÜK0Ó óýœa õ†Öf@2 õ`0€õ`áš_öÞmŽõÅò6€ÀŒëÁ:`ëÁÂí‹¿¨&O½kUã s øì«nª™ŸÞ¼dîÏ/™ƒÎK¯^4ƒg/¼g/b6w1BA3óÓ›ùèûë|ô*ßAç¥×SÜ(Ð\S,Àβ`f~z3mvŸ6;è¼ô!ÀÎ £¤CX(@;l ˜™ŸÞÖßCþƒÌK˜ÅâÈ0¨‚ëfÁ˜™ŸÞÌÍßßý™Õ׌YÉff,À,È\ Á…Àñfz±z·Ë”wrË;!À4ÈÜC©xss¾æÿJÓõšg½·ç_ïÍôz3­^¬? &!‹Lƒ+^ fÏOß‹óˆës½^Ç<ê3â&q.{¿ó´'«¼z3½ÞL+Yåã#ž ³úF45†¢¶3Î&"21ÿ¹×¼æ}a¿Û<úñäË+ždÅï7O½™^o¦å÷ú“.^ÀÀŒjýaé &X¼ó†%çyÍ¿.÷‡;&°æÅsÇÛVOÎ/§Rªí°Bß/çé›Ç]×ç`ˆCÎÝï9Ÿ¾#/Ú|ðnù¶ËבNjæñ·fø ó ;ºðš‹^ù ˆum=4×|OÔ™DÓ!‹L•`˜r¸®®®ÿhûtž[Ÿ>Ž×N§írÿØÅòZµö;¯ ûÇ.¦:~ Mßn…ß>çrWñˆóÓØ”±´XðÎøqÔ!nœã «¶EøPœ‹Çʰ|=Qó­§#Òù¶¯y Å!®×(®A‹ÛΗkëGu"È´ÙzÑÉO`§xâÑdæ5¡~ŸÜïËy„ÃiΉå„B„q8»ˆxÖs8ˆÈ‹tÀ°ÌáLÇãøqÐâñr´ ;©Ðø­{9ºˆæÄ!Öµ9œdôɺ ó˜,ÀÀ”=u¶`q¼Cæ¢MªßçŽùu¼ ;ƒðã„B9‡ˆá¤"¬<"ò"0,u8Óp ÐØ…›“ /G^$¼]xÅíU† 8gø*ëI<€§Š ØŽòvŠ0ÛD&à·Gô°ü:^psN¡;pÄ#œGÀñƒ½?Üy„ëu9óËa‡m;t€Ã v^±Äáx#šsO^Ž.<dèÎ=zú~õBüAæ¥WMD°ftÈ<CÀDûª&ì+ÝG°ì¤a±Ãæ˜@9¤ˆpB¡7“”Ý¡3-§£ƒˆ¼„L¸;¬€C‹Ðó£p&át Ë9†3z¾uçÊ ƒæÄ!ÌqF¬kûŠœ8ÄS'L‡,0V"€%ä"¨Sƒ«-üç“è¦(N’ê€áj+»$^OyéLg(*`Ûãl"uÑûŽwdÐcyÎ|ž{ž2¯'}¸¬£”q¼€_€!`¼€ÆùEwÄñƒnÁ7 ² ¦Ø€µMo@§ýÝñGPÇ6`ÌŠ“Ÿè€l£Æ€€ÆáCuø òÔñC`ÌŒ™;`ÄÚ`Æ„™£?ÏǼuü fÀŽ?fE¦Á/`æÛ¤ä~›dʳï—'&†BkÌè…vî²m¹TÀ MDSú~e0÷(ù÷È ˜‚ì3*Å ,µlø fn^òož)Ó¾_¦ ¬8ù‰ ØÖ²6qRÐyM…èûÂÜ£äÞ#˜Ñ!ó  `ɽ ¦R_½å©¦C˜ËvõVzòï­0ÅÌÌYoœB$¡ÄØó f*_*ßµ`1``FoºZ0R:b:9 d²˜u€€˜`si«8)h/¢ñ®bFsôçÑñzW+`Fg( °n~¦"`<€ï*ƻʵê]E¦C¦ìÍ 0WVÌxW1Îú»ó‡x½«00£ø±ŠL‡KÖ¬‰h¼«Àú;`ñzW+`F‡Ì0¨ÄÒá83ÞUŒw•kÑ» XQÜ(ÈÜ“pmJ°k¡kÖ\cò_Øö•2Çù3 2´#SÐìL ^Dåì+õrÒ‹^8zå:ƒx0 V/§xÏKv}äÞÅØÁŒ™+`*ЦÇã¬ßyWQÞ6^V¥R`O->7²êã°`È\_öœ3oéc,ß_cÒ©ÆÓS‰¯&5šg7Ï#Ñ<•°³†-ʉ›÷?^XÜ<Àˆ8‘/ËKú˜“îðƒ0Ê3Œ½®¹wBÞ¼òäôôÒ<ªèõ"ÀÀ ˜;Š£îs—ô‘` ®Dû*=c$'mx5ñã©á<¼šT{xFQGüz*qó\Ë ‹ðì2¦n®¶<Ý8§N¡Ñéò]Ž‹ðêúýx’ÑâHŸÊ¾ÄF§÷/;/0‰¦CØI¦M˜8i½â¬ßyWQFà EyîÐ=©pE[$÷ )¦P–¯&Ê3Š—ç§×“0/,ì%%Ëò*c§©{‰æ…Eæo–Î|ë×Ç? ”g–˜žaœy'†t‘æùF‹clÇÝ ÞP’í'çÊ‚)ÀÀ˜²Ç"žŽD¼«X€ ƒ,0®O㬯|Ócòqõ~¯Õ×î-&†``F‡,0e¹ðÓ‚£T°‰Ø×.ÜäÇ@Öu€0£Cæ˜×Àb·×7ϤÑ÷$``F‡, °.~ë¬Ã%;¬“ÃT†¾_Ì=Jþ=€1+`F‡ LÙ#9`2­Í7€™Ê˜üÊx5–© Ìèy†€kó[Œ3ÓF›f²:¬E&eÅ"S– p­aU›&¢©`>*ØÕh•‚\+`ì(È"S– ×äÀ‚² {í6'mÀ˜2WÀ\¬Õ0c½ŒõòU``FñcØ™KöA€5½ˆÆ2]»–Éï½€1+ŠY3êE”€©@«öÀü° wmC¨3:d€©ƒX"pYS7½±è#1à×È”©îuŒ€00؉Ómúð“}Í´³¼J»©êè)ª„Z¢ë·Ô©fÞǪ02eÐêê¢[]•õ8V}`Œ€0£C¦Dñ†n wÓ— |°Š~’ÛL+5eä4SFN} íµô‘¦{šúpOc¤vó>ÖF¦ úP@r©³ª>ëu\Õ{0À„Θ;`,)°•2zôhºî_n/–\:`±àB&bfà2?0}± õ<d`FA–ÀÔwÜA)&L¦láâåTP×f½2ø$ÛrIë¥Sí.c½ \}.ä)¨³!“­9aÉ´–C` L=øàƒ”2mÚ4JMM¥¯ÿÃ7ÄÐÿF .Ó44€ôU@’‘¯ EZ1 28Þ;`,ÝsÏ=ã•2wî\‚wu@ê`ÚÞM_FÜußyæ"€øÍÈ”©Ž:Àl€°fÀ\?þ8=õÔS”òöÛoSZZš€ì¿ø 6L22e`ê@°:pûí·Ó< ,àš2e ýôöhb£j"IEND®B`‚qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/doc/src/000077500000000000000000000000001225012771600324655ustar00rootroot00000000000000audiooutput.qdoc000066400000000000000000000033611225012771600356430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example audiooutput \title Audio Output Example \ingroup multimedia_examples \brief The Audio Output Example show the use of the QAudioOutput API. The example demonstrates the basic use cases of the QAudioOutput class. \image audiooutput-example.png This example provides a tone generator to supply continuous audio playback. The first button allows pause and resume of the playback, and the second button allows toggling between push and pull modes of operation. */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiooutput/main.cpp000066400000000000000000000042661225012771600325710ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "audiooutput.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setApplicationName("Audio Output Test"); AudioTest audio; audio.show(); return app.exec(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/000077500000000000000000000000001225012771600313765ustar00rootroot00000000000000audiorecorder.cpp000066400000000000000000000237571225012771600346700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include "audiorecorder.h" #if defined(Q_WS_MAEMO_6) #include "ui_audiorecorder_small.h" #else #include "ui_audiorecorder.h" #endif static qreal getPeakValue(const QAudioFormat &format); static qreal getBufferLevel(const QAudioBuffer &buffer); template static qreal getBufferLevel(const T *buffer, int samples); AudioRecorder::AudioRecorder(QWidget *parent) : QMainWindow(parent), ui(new Ui::AudioRecorder), outputLocationSet(false) { ui->setupUi(this); audioRecorder = new QAudioRecorder(this); probe = new QAudioProbe; connect(probe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer))); probe->setSource(audioRecorder); //audio devices ui->audioDeviceBox->addItem(tr("Default"), QVariant(QString())); foreach (const QString &device, audioRecorder->audioInputs()) { ui->audioDeviceBox->addItem(device, QVariant(device)); } //audio codecs ui->audioCodecBox->addItem(tr("Default"), QVariant(QString())); foreach (const QString &codecName, audioRecorder->supportedAudioCodecs()) { ui->audioCodecBox->addItem(codecName, QVariant(codecName)); } //containers ui->containerBox->addItem(tr("Default"), QVariant(QString())); foreach (const QString &containerName, audioRecorder->supportedContainers()) { ui->containerBox->addItem(containerName, QVariant(containerName)); } //sample rate: ui->sampleRateBox->addItem(tr("Default"), QVariant(0)); foreach (int sampleRate, audioRecorder->supportedAudioSampleRates()) { ui->sampleRateBox->addItem(QString::number(sampleRate), QVariant( sampleRate)); } ui->qualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); ui->qualitySlider->setValue(int(QMultimedia::NormalQuality)); //bitrates: ui->bitrateBox->addItem(QString("Default"), QVariant(0)); ui->bitrateBox->addItem(QString("32000"), QVariant(32000)); ui->bitrateBox->addItem(QString("64000"), QVariant(64000)); ui->bitrateBox->addItem(QString("96000"), QVariant(96000)); ui->bitrateBox->addItem(QString("128000"), QVariant(128000)); connect(audioRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateProgress(qint64))); connect(audioRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateState(QMediaRecorder::State))); connect(audioRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayErrorMessage())); } AudioRecorder::~AudioRecorder() { delete audioRecorder; delete probe; } void AudioRecorder::updateProgress(qint64 duration) { if (audioRecorder->error() != QMediaRecorder::NoError || duration < 2000) return; ui->statusbar->showMessage(tr("Recorded %1 sec").arg(duration / 1000)); } void AudioRecorder::updateState(QMediaRecorder::State state) { QString statusMessage; switch (state) { case QMediaRecorder::RecordingState: ui->recordButton->setText(tr("Stop")); ui->pauseButton->setText(tr("Pause")); if (audioRecorder->outputLocation().isEmpty()) statusMessage = tr("Recording"); else statusMessage = tr("Recording to %1").arg( audioRecorder->outputLocation().toString()); break; case QMediaRecorder::PausedState: ui->recordButton->setText(tr("Stop")); ui->pauseButton->setText(tr("Resume")); statusMessage = tr("Paused"); break; case QMediaRecorder::StoppedState: ui->recordButton->setText(tr("Record")); ui->pauseButton->setText(tr("Pause")); statusMessage = tr("Stopped"); } ui->pauseButton->setEnabled(state != QMediaRecorder::StoppedState); if (audioRecorder->error() == QMediaRecorder::NoError) ui->statusbar->showMessage(statusMessage); } static QVariant boxValue(const QComboBox *box) { int idx = box->currentIndex(); if (idx == -1) return QVariant(); return box->itemData(idx); } void AudioRecorder::toggleRecord() { if (audioRecorder->state() == QMediaRecorder::StoppedState) { audioRecorder->setAudioInput(boxValue(ui->audioDeviceBox).toString()); QAudioEncoderSettings settings; settings.setCodec(boxValue(ui->audioCodecBox).toString()); settings.setSampleRate(boxValue(ui->sampleRateBox).toInt()); settings.setBitRate(boxValue(ui->bitrateBox).toInt()); settings.setQuality(QMultimedia::EncodingQuality(ui->qualitySlider->value())); settings.setEncodingMode(ui->constantQualityRadioButton->isChecked() ? QMultimedia::ConstantQualityEncoding : QMultimedia::ConstantBitRateEncoding); QString container = boxValue(ui->containerBox).toString(); audioRecorder->setEncodingSettings(settings, QVideoEncoderSettings(), container); audioRecorder->record(); } else { audioRecorder->stop(); } } void AudioRecorder::togglePause() { if (audioRecorder->state() != QMediaRecorder::PausedState) audioRecorder->pause(); else audioRecorder->record(); } void AudioRecorder::setOutputLocation() { QString fileName = QFileDialog::getSaveFileName(); audioRecorder->setOutputLocation(QUrl(fileName)); outputLocationSet = true; } void AudioRecorder::displayErrorMessage() { ui->statusbar->showMessage(audioRecorder->errorString()); } // This function returns the maximum possible sample value for a given audio format qreal getPeakValue(const QAudioFormat& format) { // Note: Only the most common sample formats are supported if (!format.isValid()) return 0.0; if (format.codec() != "audio/pcm") return 0.0; switch (format.sampleType()) { case QAudioFormat::Unknown: break; case QAudioFormat::Float: if (format.sampleSize() != 32) // other sample formats are not supported return 0.0; return 1.00003; case QAudioFormat::SignedInt: if (format.sampleSize() == 32) return 2147483648.0; if (format.sampleSize() == 16) return 32768.0; if (format.sampleSize() == 8) return 128.0; break; case QAudioFormat::UnSignedInt: // Unsigned formats are not supported in this example break; } return 0.0; } qreal getBufferLevel(const QAudioBuffer& buffer) { if (!buffer.format().isValid() || buffer.format().byteOrder() != QAudioFormat::LittleEndian) return 0.0; if (buffer.format().codec() != "audio/pcm") return 0.0; qreal peak_value = getPeakValue(buffer.format()); if (qFuzzyCompare(peak_value, 0.0)) return 0.0; switch (buffer.format().sampleType()) { case QAudioFormat::Unknown: case QAudioFormat::UnSignedInt: break; case QAudioFormat::Float: if (buffer.format().sampleSize() == 32) return getBufferLevel(buffer.constData(), buffer.sampleCount()) / peak_value; break; case QAudioFormat::SignedInt: if (buffer.format().sampleSize() == 32) return getBufferLevel(buffer.constData(), buffer.sampleCount()) / peak_value; if (buffer.format().sampleSize() == 16) return getBufferLevel(buffer.constData(), buffer.sampleCount()) / peak_value; if (buffer.format().sampleSize() == 8) return getBufferLevel(buffer.constData(), buffer.sampleCount()) / peak_value; break; } return 0.0; } template qreal getBufferLevel(const T *buffer, int samples) { qreal max_value = 0.0; for (int i = 0; i < samples; ++i) { qreal value = qAbs(qreal(buffer[i])); if (value > max_value) max_value = value; } return max_value; } void AudioRecorder::processBuffer(const QAudioBuffer& buffer) { qreal level = getBufferLevel(buffer); ui->audioLevel->setLevel(level); } audiorecorder.h000066400000000000000000000053571225012771600343310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIORECORDER_H #define AUDIORECORDER_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class AudioRecorder; } class QAudioRecorder; class QAudioProbe; class QAudioBuffer; QT_END_NAMESPACE class AudioRecorder : public QMainWindow { Q_OBJECT public: AudioRecorder(QWidget *parent = 0); ~AudioRecorder(); public slots: void processBuffer(const QAudioBuffer&); private slots: void setOutputLocation(); void togglePause(); void toggleRecord(); void updateState(QMediaRecorder::State); void updateProgress(qint64 pos); void displayErrorMessage(); private: Ui::AudioRecorder *ui; QAudioRecorder *audioRecorder; QAudioProbe *probe; bool outputLocationSet; }; #endif // AUDIORECORDER_H audiorecorder.pro000066400000000000000000000006121225012771600346670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorderTEMPLATE = app TARGET = audiorecorder QT += multimedia win32:INCLUDEPATH += $$PWD HEADERS = \ audiorecorder.h \ qaudiolevel.h SOURCES = \ main.cpp \ audiorecorder.cpp \ qaudiolevel.cpp maemo*: { FORMS += audiorecorder_small.ui }else { FORMS += audiorecorder.ui } target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiorecorder INSTALLS += target QT+=widgets audiorecorder.ui000066400000000000000000000154201225012771600345070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder AudioRecorder 0 0 297 374 MainWindow Input Device: Audio Codec: File Container: Sample rate: Encoding Mode: Constant Quality: true Qt::Horizontal QSizePolicy::Fixed 40 20 Qt::Horizontal Constant Bitrate: Qt::Horizontal QSizePolicy::Fixed 40 20 false Output... Record false Pause Audio Level: constantQualityRadioButton toggled(bool) qualitySlider setEnabled(bool) 113 197 115 223 constantBitrateRadioButton toggled(bool) bitrateBox setEnabled(bool) 173 259 190 291 outputButton clicked() AudioRecorder setOutputLocation() 46 340 6 302 recordButton clicked() AudioRecorder toggleRecord() 191 340 113 317 pauseButton clicked() AudioRecorder togglePause() 252 334 258 346 setOutputLocation() toggleRecord() togglePause() audiorecorder_small.ui000066400000000000000000000171071225012771600357030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder AudioRecorder 0 0 420 346 MainWindow Qt::ClickFocus true 0 0 398 275 Input Device: Audio Codec: File Container: Sample rate: Quality: true Bitrate: 1 0 Qt::Horizontal false 1 0 Qt::Vertical 20 29 Output... Record false Pause constantQualityRadioButton toggled(bool) qualitySlider setEnabled(bool) 113 197 115 223 constantBitrateRadioButton toggled(bool) bitrateBox setEnabled(bool) 173 259 190 291 outputButton clicked() AudioRecorder setOutputLocation() 46 340 6 302 recordButton clicked() AudioRecorder toggleRecord() 191 340 113 317 pauseButton clicked() AudioRecorder togglePause() 252 334 258 346 setOutputLocation() toggleRecord() togglePause() qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/doc/000077500000000000000000000000001225012771600321435ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600333315ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/docaudiorecorder.png000066400000000000000000000670641225012771600367030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/doc/images‰PNG  IHDR¬‘9,‡ß pHYs × að·’FtEXtTitleMainWindowŸ{­ IDATxœìw\×úÿ?»Ò‰(`E¹Q)"EŒ1Å–¨1EåšêOÆ£bÐ ‰æ«¢¨)бÝ\ãÕ ±c0$QAQAP°‚ 1" "mv~ÀŽ;[g ->ï×ë¼væÌsžóÌììùìœ3sFàþÖT¦‡»+æø&úzu‡™™†L&ƒ¾ô.¡XبÒM‚Έ[à>©ƒ³ÿ}’#ZÎ>1 ˜¦ŽÁÔ0Ïö¨Ùï£>Âf·)а*PF(B @*­AÊ•l¬Þu7³oAðÎçë˜Ía¡]›6¨¨¬„T"£opõ?xS–>"À×–W\|ýP¿N{]>ùøQÓèªäè²ÑÐpó,›&ñÃCŒøØ5¨°ñ"¾b¥ËŽ@ÔÛ47?m”Ú+>6jítÙð,í'Ÿúة؛¨~}|6„@s ØX[£¨¤S×þ‚ãg.2ý}ÜP]U¥¿P=ó\÷aXiý|(Mbk€`i´ÓSÔÔÚhñ3Bhô¶á_&-Cl5¢ÏÕRˆ•V»·1@Œ ,M;>u6[Û&,9–VV8yé&¥OJ™ÚšZÔÖÔ¨J¥RÜÌÎf 99:¢]»vê<¢¸¸ùÂÝÝæææ¼ƒ©©©Ayy9**+aaa333ÔH¥H$°µµ…­­-ÌÌÌTêž_ÁjP›ætuÔH1©µ7P”Kü3×SÐtÖÕbÅÇ—)cRkgŠ+'#lô±S±ÕSXämeyy9,,,ÐÊÌ 555J$°Ql+ !¶®¨€¹B;\-o‡mlTÛažHë}WÖû673ƒ´¦’êjØØØ¨oã•033ƒ°•‚ÒÒFR-QkTXXqI ,,,ÿý7^êÓGÅyee%Î_¸€6mÚ K—.èо½Î`‰pqqA›¶mU¶—”” ïþ}8::ÂÂÂy#ÒÝw å×T¢ÕXÝ‚lTìA´øøâkñÕCŒô;ƒáÓÀ«)Ã÷ÊK§o¾õ7'±2ÐF­¨Z{žÂÆÈdH$xTP€Î;£M›6JU2(--E^^^][inþ¬­ÔQ¿b;ÜÅÅE­ï’’ÜÏÍUm‡u ÷ý¨¾o«¡ÏÍÍ…£ƒƒNß–„–bÀÅ‹aaQŽ+W®`À€Z}É©©©A^^ÜÜ\!“Õ ºº I5¤R ›$’jTWW¡¶¶®®®õ1ÔÈgGL†?^½«à鯥ÿ@9ݺ|i±‘Ûñõ§ËNääȱeDŠINŽ\jü± €££dž7 1)úÓ) ¢¡õ|ãc§ÆÖ`¹|‘‡F»æö[Ð=„­F*E^^º»vçÕVvWn+5Å[ßÅhT;¬½}»¹éôÍ0 „º*¶©.Å ŒDW¡´´5µµ8z¥»x˜Ÿ›ÙÙ¸v-!cý!,+Õù%2 ƒââb¼ð `d *+ª •H5¦ªÊº«?+kkC—Àª©ðÙbCØó±ãóãâk×Ü~¨ú þ:uáðÁƒÛM›~@'‘ÇN. Š áã"¾_~¹/²srÀ0 ÐÙ¹òóó†ÁÍ›7ôJ?Ðèà ԉ’’8ñ¾eŒ*]ç-/òE6íšÛo@‹F{vŒL†ââbXÛØèÕVZZYél+åí°­†vX\,VëÛšG;¬Î÷ÂÏ#±6:šãóÇ-?bÖ¬YÏ|ÛØèôÍ –:Á“´Ù?m{ ²¼OËž@,£¶VŠ3gÎàÄñc=†—W_´ní³ÒtÊË5jkk!‹áر#*** •Ju¦ŠŠ 899Õ×]+?*ÏÖõ´Õ#®ÈšÍV/AÒàK_¡ásu¤ËNÎÛ¶BVo'•H÷KœÎúÔÝHĹšR¨gØk¯áÌ™d@|ü1…BüöÛq0’““0bä`êÿ™ªˆ‹–T·K¶+Km(Å­—@ÉË𩯭’θµùSú.ÔÚi8_ÕúRÎ2‘>vjíõøÃͶ•:°måÇÕ¶‘ò|µm¥šÔù–§ß~û }û¾„¨¶Ã"‘ŠoMq;)´ñ³fÍ¡ƒ³>R©Û·mÃ?nAXhë[$A\R¢â[1v¡âAT>”6~´zÕ#ßÇ¡¯¡¤¨b±…‹ñàn6ž–•âIY‚ú÷ €´ó+VßÒzòÊd2TVV­„*—ˆR©ÅÅE*yI5„B*++¹47”h5‚­VûÆ-¾v&¼BR'úÚõêÕ `ìÛ¿Ã^ÆaÐIä„N"'ø÷öÉ €N"'0D"'¬]»îèÙÓ{÷îÅÐ!C‘œœ 0 Ž=ŠéÓg >>œœŒ×_À³nE‘“#Ö­] w7ÖP×MþJ¿—Ñ­ë‹øú«¯Ø˜/_¾ŒÁƒ¡Kgg <YY™uûâëƒüü|œ:u "'Gœ:yùùùðöêùL˜”Äâ%*ºˆ¯¢-Ÿ˜WyØe×LÅJÙV&“¡B©­\·n-¦~2ååOÙö1òóX¾l©Æ¶R] šÚá'0þ|D}õ5V¯Z…Çén‡•P·£“#:Œ#‡cÚԩض}<„ýë_\ßßœ¶ WXꦅ٨¶ØÙÙÁ¿O_ÔT•¡•¬n ®  Ý]»+–ck£z¨­­EMm-jkeH¤*)6v ž>-Wɯ­•A*•ª*{3"“Š–žÿ8õùWj‘Ña§-§¡U¯)S¦`ã†õ`?nÙ‚ &ª”)|\„G…Ø´y3/úB¥ž¶öö¸rõ6ý° Ë—-Eß—_FFzŠÅb\ºt ŸÍ™ƒô‹QZZŠœìlôö÷g¯˜ä¾Ú¶mËñ†AXX(¦MŸŽ7³Ñ©S'Ö~ΜÏ0þ£ñ¸uûÆ4Ÿ}ö†¯o/ܽ{±›7cΜ¹Ø²e îܹ OOOÞ"£îŠK¯²ºÊð}l›Áù«ï9®R§Œ+ ®­¬­©á´•+W~ƒªª*Ì™3OŸ–cñ_ çÖm¬Y¯¶­ÔCmm-j”|;v ŸGFbßþý˜4q"bc·`õê58|ä×wMÖ+¬ºöÛÆ‹Åuw›¿÷î{8á`ís²³ñÁ‡ÂÜÜï½ÿ>²oÞôòë… 'pçÎm|‰[·rðû‰ßÑÃÓSõ¸è{Å¥î»àSÖPAÓ%Tj¾cS 4Ù`£¶^ÈT|h+?ßÛÁêê*:|ÕÕÕ;v4nݺ£ÇŽ¡¶¶F¥­äܱªƒ:ßÿý7ââöÁ«gOäädÃËÛ [~ü¹¹÷¸¾Ê«ÛùÊmxìæMØùŸØ»÷ü~â7¬Zý*m<ÚxuG+XJBôw„eÅRüùÇȽv¶¶¶põ €S›VÖV"ÿáìŒÝ¨p Ô ¶B¡–––(.®ëUî‹Í½Ÿ«’'«|´´´„P¨á>‘F ƒ>¶JqhÅTW[jìøúS´ãóãU±ÕC¼TL 2†Á´éÓ±cçNL™<åY7B}™¯¿þ 1ë7à^î}üw×.¨È•7úŠ]'C†Á–-±œâ'ÀQ¨ßÍÝÿÛý3ª*+±ûç]l¾«›þ·ûgTVTàç]»àîá0 |¼}°åÇ-xÿƒ “ÉðþbË[àáá¡r\tžSÊÇNqÓGДëÑe¯áül¡Òu~ê#@|EM­o¦ËV(‚ÓV–””àáÇ8tøœœD8Ç…xRZÊi+-ÛJ51¨k‡ç…†¡gOOܽ{R©?x€žžžøbÑbþí0¡@K¥¸÷í߇Ÿþ¿8/o//¡ðqUÊÍþì3L™ü1¼zz"ãbú³z?Õ0xðH$ <B¡AA¯röAñS9íÚuؼy3¼¼zâ￲ù11ë±}Çxx¸ã¿»þ‹õë7€àíã0 Þ{ï}À{ï½F&Cã4úÊK‡¨ñªWW=|¯¦m³ÔÙšR¨ävêÂááO]]~õ±eÛÊôtN[)..BÞý\üñç_ÈÿûJÄbÍm¥¾ïÞ¾…[ÙÙœ¶÷~î=ܼqý™ï 4¶ÃLý¾È}_Thã::âÀ¡Ã°¶²ÄÝÛ·!•JpøðQtéÜ™õ}¾Þ·Pî[Mì‚ÒÒ¦ºªJ1‹ý ‹ÐúÖä§?Âæeðzã3¼6j àîÝ{øþ«)¸v¯–––xɯ;æE.€¹­ŸZ_ (++Ã7Á€Hä„ò§šï,|ÁÖ÷óÀÌÜ °kÝZ£­JEÐðp§¡¶jVu>‚k ­j_[ívúøš²¶Õ¸™‡+++¨{ØÝÒÊ ÕÕuç²™™Zµª›‘¥¦¦fff¨®®†¥¥%çSîÝÂÒ’ú®s vhùºDRÍÖcaa ‰¤šýT΄033ƒ@ @mm-ZµjUŸ/€™™9ÛeRS#}V‡¹jR©ôÙ•øü±Ò`Áð²R¿EkYÝöϲLm«ÁRM†zä]³ÎJÍ›Œ²êÚÊë7n ¶¶–w[ina´~AÞVªÿÆå¾FvØÌ îh­Ð3jÊÊÊp£¾Ë[$r‚ƒƒ#ÊŸ–£ à[®]ûöhß¾=>x€ûyÐʬÜÝë}«:…¥•ZE~þùR•‡µäýzŒ þ~OŸ¤¢ß`^ #lB´mÛÒZ%ÒÐÉÉmí*q÷¾¼ý^QëK±q ë477OŸ>…Hä„êªjÔÔÔ@&“A&“AتZ·¶ÃÍìT”—£k×n°ok¯õRT¡R•:Mbkà‚úÚ›ÄÖ@;¶|f¾Ðakˆ½º2555jË(žÇ2YÝ®üœ’Ï•©ü)¯_>ÐËœÁjùº"òuMù ÃÔ:×ÖÕÍæƒÍ¯­­å\ð©«S¥SÇ©^h¸J1i}ìùÚÙuÇ×Îh[}ìµØ=k+ïãéÓ§pÒÑVVVV¢k×®hÛÖB¿+eßüÚázßJíð3}a| Ø6ÞÊÊÅEEßÕÕÕH¤¸™ƒòzßömÛB ¡+ÓÌÜLƒ`€@€ÜÛ9È?ó Êe¶è9r3ÌÍ€T˜Yººyãñ­$<.}€²JlwоS´µo¯â xÖð…BØØØÀÊÊ Ož<ÁéÓIhß®=Úµ³‡µ•,,ÌQTT„¿þü "‘®®®99ÕÍa(ÐðO^MüŠušÌVÁ^g}„H_{#„¦¡ÄËdö:Êh-Ç£¬Á~›½…ˆSØãÛàë(c{}b1Ò§Z{}º÷ôñ­Ã/P×VZ×·•eOÊpêtÚ·kÇi+‹‹‹qòÏ¿àììŒnÝ»C$ÁLÛÐI=¡6ÖÖúµÃ"‘Ê\²Êb%ûY_†Ó§“ÐAƒo'‘®Ý»Cää„VrßjŽ™¹¥%%L§KðEcç«ÑÄûè÷’ZÉn£Fè žÍÆ~áÂYüÿ øäóÑ¡£HÃâ CMM žbÅ×·Pî[‡/þ‚èßèóð§ìKy&_Cýh³Z pR¦¡ÉDö¼ÊšêŠJOúÂ׫QÝ{ZóóÜTW\˚Ⱦ¡EÇ$u!Tê«~v3‰^çOßr4Îønè-%ßú쳕µø¿‘K~«>¡Ã£$¼EJÙO]aÝq)ìƒb½&±W<à _„Ú2J¶tŸ|ú–Ñb¯RF‡­Vûú2êN7¶Œº“QÝ¿5å²ÚNbåõö§µ0­¦ÀÐø ‰¡®¸´–5a™†îÂ3´Œ¾cTœ2úØ èc¯Ç¹¥ó]ZFœ§*WizúÒÿ’j„Æ`ô¾š…p)Øë.%[@‹¨¨+£T‡Æ2ú’1Òj¯G­õ(”ÓT–ãC׉®ô£3ô'f”Ð@cŠŸ±W\:}4´@é¨Cm9CKs*}íMpîšB¨Låϰw›Rh”ü™ÂW³.…2ËésE¤¥œVaQ¶çS—)LK9NYS^QòãÒÔýÑÔ°/¦¾âÒéÓÐ+¶&îº3Y]z|G-E¨Ä—‘þTËÂÒRÑÄðúŠÕ ¦P† è7öªÇpFÃŒ¤þ3‘TWsÖù<…KAMŽ nbP‚ ‚hÈ5ÊL9ƒ ‚ šʺ$Ÿ£ B!‚ mpµ‰Æ°‚ ˆ AÑ"0èÎf‚ ¢ù¡¬Mt…EA´ ›é‚hq$%%!''§©Ã â9ÇÕÕAAA•%Áz‹Õ¤ÉÓ›:‚ þÄÅíEHÈ8ƒÊnߺ -ê|ÈÉÉÁ{NDYÙS¼è"¢Oú¤Oú4곪² eeO J£Þkpo ¤¤„©¬¨`3¬¬­MÕNÍ„;vàÝ& §G7\κÙÔáÑÂ9x`?Þ~gŒAe«ª*qôð~Lœ8Q·me%»lckC]‚Ï—2¯ƒadMA-”^>=êÚ0·%ÆÌªD‚õœÀ0 zùô@ú¥kM A-”ôK× “1`d d2ħIËÞÞb±ØàŠ{{{vÙÚÚŽŽŽèÝ»7>øà :´AêkÎÇäbÆUÎÉÒíÅNì²µµ5:vt€o/Œ ‡ààÁÕqøðAD-ûnßýÛ¸ b5•/‚ Ã߯'.f\Ð4ó϶¸+,}EAn[]]G!99 .Ä¡C‡°aƆ ³ùÁ0ð÷뉴ô+œì[w$ áü¹|µÇãbå7kô®få×ËñæáX_­éNj¹¯î]Ù¸ ‚h<ÒÒ¯€a6u òÀÒÒ...pqqÁÛo¿×^{ {÷îŸq†Ýš©Žæ|uÅH½˜©Òï,_777ƒ³³3F‹áÃGàß!ïàÀ¯qz¬>z”¿Þ½d¬LÑ'ÅDãèïS׎4ÑVýmíŒBÒ{{{ÄÅÅaàÀprr‚‹‹ &L˜€Çsl¶oߎ€€888 wïÞøùçŸUühò¯ü)O†`ccƒ `×®]œüøøx 0ŽŽŽðõõÅO?ý Nˆºwï®VÄb1\]]!‹Uâ‰Ç AƒàääÖŸ®úÔí»Ñ0 ý}Tþ)®Ë“•µ5f6q¿ìáäÿ~"oŽOnøêËØ»g7g»k·.`nÝ]Øe†aPXXˆ//„wO7ôíã‡%_.BEE…J9夘/Õµ[€k·.lRW–%J¦OÒ.ƒaÀH?z4\œd²ç°bbb°jÕ*äææââÅ‹hݺ5æÎ˱ٸq#bcc‘——‡-[¶`õêÕ8räï:ä‚!‹Ùd(ýúõCff&»ž˜˜ˆ™3g"""¹¹¹Ø½{76lØ€cÇŽÁÞÞo¾ù&vîÜ©âgÇŽ5j”а$$$ <<K–,Á½{÷pðàA$''óª¯!`œ»p ²úÁRù€©âºbò胫W¯²ë§Nþ…ˆˆPÌš53®â‡M[» '~cmndßÜȾ‡Ù÷ØüwÞ __?œO½Œ_CYYV¯Z©3Å|ù²rŠõP¢D©aSŸßºeFu›[wIÑN?Áâb2ÁÚ¶múöí tèÐ_}õþüóOŽÍš5k bÍš5X¿~½©BЋ¶mÛ¢¬¬Œ]ŽŽÆÆ1jÔ(XZZÂËË ±±±X±b`Ú´iزe ¤R)[F*•bË–-˜6mšŠÿ5kÖ`íÚµ†¥¥%ºuë†M›6ñ®OŽÉº}ûôRù—£éž>}Ê®ÿðý·øzÅ* öÌÍÍáîÑk¢c°>&Z§Ï“§SðÎè±°°°€ƒƒ#–,ý ÇãéŒC1_Ó2%J”/¥œÏÃ0£ú¼~ó®Ú¦çúÍ»*¶†b²1,777ÎzÛ¶mQ¡ð@2¼òÊ+*ëYYY¦ A/Äb1Ú´iîgdd`üøñ*vBa¦{zzÂÕÕDHHàÀpssƒ§§§J¹ÌÌL 0@cýºê35 €³ç.BÓ–2b±vv­ÙíYW21{–ª0 …B­>‹ŠŠ°.z’’NãñãBÔÖÖª-§)M64†EO¿¾þõí£ö7xíÆmxzt㬛ò·j²×‹ã¨Á5ÖÆÙ³gáããîËd2äååÁÖÖVc™iÓ¦!::š¬~øóçÏ7¨~>õ™†A¿¾þ8“’¦”­þø¦¦žGÏžìvF&CêÅLØØØ¨qÍh\›7nîؾó¿‰:ÁÒÒ555ðõöàØiò¡É¦¡Î ‚ 4s&%­N¬ ùJéêõ[èÙ£;®^¿¥ÖFŸß.Ç”iä¹Ïœ9£²îííÍ®[[[£¤¤„csó&w*!@`tcUQQÿû¿ÿã\áøùù!##Ck¹áÇ£¨¨çÎCJJ Äb1^ýuµ¶>>>8}ú´F_|ê3% €¤3©œ¾d@ýØQyy¾ûvÆŒù7›×ÓËY™™:û¸•}¦¥¥b^h\\^„¹¹d2çRÎr쬬ê¾wÅrò¹ÆÔù¨­•5y>%JÏ[zååÈd ûà°¦”u5Gã6cÚïF¬ùóç#-- R©©©©ÇìÙ³ÙíƒÆâÅ‹QTT©TŠóçÏcÊ”)"‘IIIzï´D"Áýû÷ñ¿ÿýÁÁÁèÛ·/ÆŒyvËvdd$/^Œ . ºº8yò$ç¶w¡PˆO>ùßÿ=¾ÿþ{|òÉ'»ðBCCŠS§NA"‘àöíÛ˜>ýÙlé|êL{—`Ð+*ýÈòe‰D‚òpðÀ~Œ y~~½1|ÄìöY³>ÃêU+‘‘~‘7ål2fLŸ¢Ñ'Ã0p÷è-±? ¤¤U••øóÏD,ŒœÏ±{¥V¯Z‰ââbH¥R¤§§!"|.ÇFqÙÁÁçϧ@&“5yŸ>%JÏS:|¡nªcXú$CiÔç°>ýôS|òÉ'¸ÿ>œŽ·Þz‹Ý¾nÝ:„‡‡ÃÏω˜3g>ùäÖfÉ’%˜6mòóóÁ0ŒÎ›ä ¾••áïï•+WbÈ!»"** QQQHKKƒL&C`` GP`üøñXµjàÛo¿ÕXïðáÃ!•JñÅ_àÆprrâtò­ÏT0N%ƒr²WÝØ£¥¥:tèooD,XˆþA¯rl_êû2ÂæG`Ãúhdf^†LÆÀ××&MVñ©¸¾jõZ|µ Û·mÃ0èÚµæÎ Ç¢… X»/—,ÃWQË0âõAH$èÞÝ“>ž‚Ï„Cݸ՜yaˆ\ŽÂÂ0 ƒËY7Lz¬‚PÏ€ ¾8•t`d*¿{¾#X‚’’¦¢¼œÍ°V3Fa šû´EÿdvìØÑc߃Ÿ¯'NžNiêp‚háÄ;Š#ß0¨lmPu8% IDATm-Nþ™Àk¶vÅ7‰ØÒlíÏ:kÔ¿‚ žo‚ô«kG´ÜtÑ`='0 ƒàýðÇ_gtA¨á¿Îpnº0„1†EÝMOâŸI÷;A T׎4í\‚Ä?†a0dP}Ò'}Ò§ÁŸ¿ÿq Ó˜s ri´›.ˆ¦#)) 999ì×Ô¡ñà÷ß0tèk•MK= WWWé´U¾éBPR"V¬FšyhTä¢EÑ”ð+¨¬x¦M¶¶¶$XADóDY°h ‹ ‚h`A-,‚ ¢E`V÷"®¦ƒ ‚ ¸(jºÂ"‚ Z$XAD‹€æ|N ç°‚hèó–2$XÏr±š4yºnc‚ ÄÅíEHÈ8݆jؾu$Z$XÏ999xïÉ(+{ÚÔ¡ñ ª²ÊàödÔ[cqäÐ>,B3ÆN:I!ǘöĘvˆë9‚^-B„)hª×‹˜É«'þÙ0Œá/\#‚P¤ñ^àȵ5ú «¬¬ ÞÞÞ¸téÚ´ic¬K{{{öÅŠËÆ’˜˜ˆØØX¤¥¥¡´´íÚµCß¾}ññÇ#88Ø(ߦŒÓÔ(Ÿ(Ý^ìÄ.[[[£cGøøöÂØqlP‡DÔ²/ñøq!àöÝ¿ X)VSù"ÂxšbˆÁhÁÚ·o† sssìß¿“&M2E\ ÆŠ+€ÈÈHlÞ¼¶¶¶ÈÊÊBLL FÝlÅÆh4ô9ߺó ‘HPPðçÏ¥à먥8+¿Y£w5+¿^Ž6ýÿ€ÀújMwRË}uïêÌÆMDãÓbǰvíÚ…Å‹ÃÌÌ _~ùeƒ –)„ä?þ@||`óÞ{ï=üú믨­­ÕË×úõë±fÍÀÂÂˆŽŽÖh¿iÓ&DGG#00èÓ§¢££ñÃ?h­§´´mÛ¶Õÿ|bŽŽŽÆÆ1jÔ(XZZÂËË ±±±X±bk³fͬ]»ÁÁÁ°´´D·nݰiÓ&Ž“Œ«iø—£éž>}Ê®ÿðý·øzÅ* öÌÍÍáîÑk¢c°>&Z§Ï“§SðÎè±°°°€ƒƒ#–,ý ÇãéŒC1_Ó2%J”?ս僛wýæ]µMÏõ›wUˈYÝØ†þˆöíÛ³yíÛ·GŸ>}ðûï¿ãõ×_çí+++ ¯¼ò 'Oy]‘k×®©<%„+W®h­§M›6(--åÄl¨>1gdd¨½R ŸýOÈÌÌÄ€´Æc ta)#‹agךݞu%³gMS± …*>×‹ŠŠ°.z’’NãñãBöÏŒr9Mqh²¡1,‚h:ê„Gõ7xíÆmxztã¬ó[UÖ&ƒ»wíÚ…C‡aÿþý*Û¤R©VÁ2Fa! gΜÁ›o¾Ù(õÉd2äååÁÖÖ¶QêÓŠ†6š¾‹ÔÔóèáÙ“ÝÎÈdH½˜ >×ÃæÍ†›»¶ïü/D¢N°´´DMM |½=8vš|h²iªsˆ ùMêƒW¯ßBÏÝqõú-½Ú>Ô%X\\Œ¿þú wïÞ…X,æ¤ÜÜ\œ:u ÅÅÅêžï)))ᔿyó&gÝÛÛgΜáä)¯+âéé‰äädN^rr2¼¼¼´Æ=uêT¬^½UUUj·ËïäãŸOÌ~~~ÈÈÈГNŸ>­ÕÆÈǰÔäÉd ÊË+ðÝ·0f̿ټž^ÞÈÊÌTk¯ÍgZZ*æ…FÀÅåE˜›[@&cp.å,ÇÎʪîQ,'ŸY^_@€ÚZ™ÎX(Q¢Ô0‰Ñ±=ëjŽæ²-X¿üò ^{í5µ ·nÝÇÇ/¿üâ vû¬YŸaõª•ÈH¿ÈîKÊÙd̘>E£O†aàîÑ[b@II ª*+ñ矉X9Ÿc÷Jÿ ¬^µÅÅÅõßG"Âçrl—qþ| d2Y“÷åS¢ô\&¥ß¹¾ÉP êܵkÛ¸«ãÃ?Ä¢E‹0mÚ4¬[·áááðóóƒD"‡‡æÌ™ƒO>ù„µûí·ñäÉ|üñÇxøð!ºté‚9sæ 44T­ÿwß}˜:u*îß¿.]º`Þ¼yZxñbôë×›7oÆŒ3ðäÉv¦‹ðöÏ'æ"** QQQHKKƒL&C`` fÏžÍÚ >R©_|ñnܸ'''ÌŸ?_ç~苦1,/7€¥¥:tèooD,XˆþA¯rì_êû2ÂæG`Ãúhdf^†LÆÀ××&MVñ«¸¾jõZ|µ Û·mÃ0èÚµæÎ Ç¢… X»/—,ÃWQË0âõAH$èÞÝ“>ž‚Ï„Cݸ՜yaˆ\ŽÂÂ0 ƒËYÜG)‚h`™Úö„WQ#K ‹™ò§Ï¦‰·}áƒÍ“;v`ôØ÷PZZÚÔ¡ñ þØQŒù†AekkkqòÏLœ8Q§­¢6½Ðúš­ýy˜6Ar-7]4$4[ûsÃÔ xAK‹­h9гKA˜¦i߇EüÓ1öî‚ #Ú,B+®®®8øë^ökêP‚øP]]ŠòrƒÊ¦¥ž…«««Aeëï,c3l_hm#¢y“””Ä>ŒKÑT¸ººªL}§ Emz¡uk,‚ ¢y¢,XF½‹ ‚  ,‚ ¢E`öz‚ ‚hH”µ‰®°‚ ˆ AÑ" Á"‚ Zôàðs=‡EDs@Ÿç°”¡ÉoŸäb5iòtÝÆA:ˆ‹Û‹qº Õ°}ë&à)Z4ùísGNNÞûp"ÊÊžê6&‚ÐAUe•Áíɨ·ÆâÈ¡}]e‘`='Ðä·A˜ cÚšü–à½^„ S@¯!z#A¦¢ñ^àÈÅ`Á²··W›/‹Ùíê–%11±±±HKKCii)Úµk‡¾}ûâã?Fpp°Iê0Sî¯)Q>Qº½Ø‰]¶¶¶FÇŽðñí…±!ã<Ø :>ˆ¨e_âñãBÀí»°R¬¦òE„ñ4ŃQWXÝ(¯X± ˆŒŒÄæÍ›akk‹¬¬,ÄÄÄ`ôèÑ&§¹ŠŽÁhès¾uç@"‘  àΟKÁ×QKq<þ(V~³FïjV~½?lúþõ՚ûêÞÕ™› ˆÆç7†eêÆþ?þ@|||þòü‡·ß£W=åïwï/SôIãqÑt4ÕVƒÍt¡©Ëâãã1`À8::Â××?ýô“N±±±ˆˆˆàˆ•"óæÍc—·oß888Àßß;wîT‰-..„““\\\0aÂ<~ü˜»½½=›)((@XXD"ÜÝÝŽÊÊJµû®«.¾ÇDîgèСpvvFûöíÕÖ§‘úDŠ©.[5ßÊÚ³?›‹¸_öpò?‘€7G ‡§G7 |õeìݳ›³Ýµ[0 ·î.ì2Ã0(,,Ä—‹»§úöñÃ’/¡¢¢B¥œrRÌ—ÇêÚ­ Àµ[6©+K‰¥†K0¶¼4úÔL‰‰‰˜9s&"""››‹Ý»wcÆ 8vì˜Ör©©©è×O÷+Þ÷ìÙƒ˜˜ÄÆÆ"//›7oFtt4âââ8v111XµjrssqñâE´nÝsçÎðì I,³I‘àà`âÎ;8yò$ÊÊʰtéR1i«KŸc²fͬX±wïÞEQQ‘Îc¡@V?P*S0UΓ'ÿ€>¸zõ*»~êä_ˆˆŬYsp1ã*~Ø´±±›p"á7ÖæFö=Àì{¸‘}Íç­‘ðõõÃùÔËøõà1”••aõª•:ãPÌ—/+סX%J”)1ªynÝ]4&E;cK ‹™²'OØŒÖvv¼ zÓÅÈ‘#1sæLŒ5Š-“žžŽÙ³g#))Ic};vÄÇaf¦½sРAX´h†Êæ8qß|ó ÙxÎ;wwwÖ¦¤¤^^^xðàJ̺xúô)qýúuµû®«.>ÇÄÞÞ‰‰‰ð÷÷ç“";vì@ȸQ^^ÁÉïáþ"®ß¼«¶Lmm |½{àʵºéœ>ú`&LšŒaÃ^gm²².cQd>Î˧œòòr mN'Ÿ×ZF1_Ó2AÏÑ#‡ðƨ·Tò{¸¿¨’§ü[•J%ø=á(&Nœ¨³Em²kc×ø7]ddd`üøñ*ùB¡ö‹½6mÚ ´´”Ó¦Žk×®©MèÃRF,Ãή5»=ëJ&fÏš¦6FeŠëEEEX½ II§ñøq!çxñ“ÒdCcXÑtÔuí©þ¯Ý¸ OnœuSþVý9,™L†¼¼<ØÚÚêU. gΜÁ›o¾i’8Aå&OžŒž={âСCèܹ3¬¬¬ •Jáàà`p]|I«V­ Š€Æ»5]ž§¦žGÏžìvF&CêÅLØØØèô¡¸6o6ÜÜ=°}ç!u‚¥¥%jjjàëíÁ±ÓäC“1Ý AÍ]{W¯ßBÏÝqõú-½Ú>4º`ùùù!##ýû÷׫ÜÔ©S±lÙ2 6Líë֭üyóàéé‰ääd 2„Ý–œœ ///½ê`FElRRR°wï^N Úº2ù`è1Ñù–2êò*++ñÝ·0uê v{O/odef"°ÏK:ëRô™––Šï7m…¥¥%»í\ÊYŽ••5JJJ`g׆-wëVŽŠ/ù²@ @m­Ìà?A‡®‡³®æhÜn‚›.…Ô°DFFbñâŸp᪫«QQQ“'ObÜ8í3ÿ2Æ È#€'Ož@*•"==&LÀòåËÓ§OGxx8RSS!•J‘ššŠððp̘1C¯8E"’’’T®——Ö­[±XŒªª*?~\oßÊzLä˜â.A‰D‚òpðÀ~Œ y~~½1|ÄìöY³>ÃêU+‘‘~‘1ål2fLŸ¢Ñ'Ã0p÷è-±? ¤¤U••øóÏD,ŒœÏ±{¥V¯Z‰âââúï4 ás96ŠËŽ8>2™¬Éï–¢Dé¹LJ¿s}Njô+¬"** QQQHKKƒL&C`` fÏž­³ìâŋѯ_?lÞ¼3fÌÀ“'OØ™.8x÷ÝwQQQ©S§âþýûèÒ¥ æÍ›‡½â\²d ¦M›†üü|0 ÃŽ×mݺáááX¿~=€ºñ©¥K—%ZƾhÃòñª_³´´B‡àí탈 Ñ?èUŽýK}_FØülXÌÌËÉøúúb¤É*~×W­^‹¯£–aû¶-`]»vÃÜyáX´pk÷å’eø*jF¼>‰Ý»»bÒÇSðù‚p¨·š3/ ‘ ÂQXX†ap9ë†ÉŽA<`djÛ^Eõ,.õw –²­ºeˆ;vìÀè±ï¡´´T·1A„âň‘oT¶¶¶'ÿLày—à³6Ë軉–…1ÿl‚ ä0ZnºhHH°žFû )A_ZÜlíD˃ž]"Â0ô>,¢!Ñÿî‚  Ñž`ZquuÅÁ_÷" P÷\ŒAº¨®®FEy¹AeÓRÏÂÕÕÕ ²t—àsBRRrrrš: ‚ žs\]]U¦ÏÓ„ò]‚$XAD³DY°ýõ"Aaf@cñADsƒ£ML¼À‘ ‚ ‹ ‚h˜5Ö,íA¡\m¢+,‚ ¢E@?'ÐsXA4ôyK¬ç¹XMš<½©C!â@\Ü^„„ð{Á¬2Û·nƒD‹ë9 ''ï}8eeO›:‚ þTUVÜžŒzk,ŽÚG‚Eh†&¿%ÂTÓžÐä·/èõ"A˜z½Ñ Ð  ‚0-îŽ2™ Û¶mÞ={pýúuTUUA$!((&L@ß¾} ÊÔØÛÛC,7uMŽò‰ÒíÅNì²µµ5:vt€o/Œ ‡ààÁÕqøðAD-ûnßýÛð€•b5•/‚ Œ§)† ¬ˆˆ<|ø«W¯F=  ‘››‹“'ObáÂ…HLL4eœ-šf!˜úœoÝyH$((x„óçRðuÔR?Š•ß¬Ñ»š•_/Ç›~„@`}µ¦;©å¾ºwufã&¢ñiqcX?ÿü3²³³akkËæ¹ººÂÕÕ“'O68 ¢a` ~ KžgnngggŒ3ÇÀ¿CÞÁ_ãðö;côªçÑ£|øõîÝ ãeŠ>i<Ž šŽ¦Ã2x¦‹víÚ!%%…—mAA ‰àîîŽððpTVV²Ûííí‡ÁƒC$Õ5œ£GãÚµkøý÷ßñú믣S§NpvvÆøñãñøñcNÙíÛ·# èÝ»7~þùg­ñÄÇÇcÀ€ptt„¯¯/~úé'û qèСpvvFûöíy퟽½=û)OúÆ¢\Æ êÿ)¦ºlÕ|+kkÌþl.â~ÙÃÉÿýDÞ5žÝ0ðÕ—±wÏnÎv×n]À0 ܺ»°Ë à°°_.^ïžnèÛÇK¾\„ŠŠ •rÊI1_«k·.×n]ؤ®,%J”.ÁØò"D]Ýlâ˺uë0uêT¼ñÆøê«¯°gÏ3)#00wîÜÁÉ“'QVV†¥K—rlÖ®]‹+VàÞ½{ÈÌÌD×®]ñÆo`Ù²eXºt)îܹƒÌÌLtìØ¡¡¡œ²7nDll,òòò°eˬ^½GŽQKbb"fΜ‰ˆˆäææb÷îÝØ°aŽ;¦sŸ×¬Yƒ+VàîÝ»(**âµò®@±XÌ&SÄ¢/ Yý@©LaÀT9OžüúàêÕ«ìú©“!""³fÍÁÅŒ«øaÓVÄÆn‰„ßX›Ù÷7²ïáFö=6ÿ·FÂ××çS/ã׃ÇPVV†Õ«VêŒC1_¾¬\‡b=”(Qj¤Ä¨æ¹uwјíô,EmbÄÅÅLii kЦ-ÿóøë¯¿péÒ%dggãÔ©SèÑ£¶lÙ‘H¤±ÜÓ§Oˆëׯ¨»‚8{ö,zôèÁÚ””” k×®HII‡‡'ßÛÛyyylÙ}ûöaðàg7 $&&â›o¾Á‰'X¹PŒ93gÎĨQ£XûôôtÌž=IIIc¶··Gbb"üýýuuû§n ËÐXôeÇŽ÷!ÊË+8ù=Ü_Äõ›wÕ–©­­¯w\¹V÷'䣯a¤É6ìuÖ&+ë2EFààáã¼|Ê)//Çð×átòy­eó5-Ñø=roŒzK%¿‡û‹*yÊ¿U©T‚ߎbâĉ:ë)-yÖn¶iÛÖ¸ÛÚmll0räHŒ9@ÝÀý_|Ù³g#..PXXˆåË—#11¨­­…ÜÞHEQ€¶mÛÜÝÝUòËËË9y¯¼òŠÊzVV–Ú˜3220~üx•|åxÔÑ«W/•<¾ûgêXôE×–2b±vv­ÙíYW21{Ö4;¡P¨âCq½¨¨ë¢W!)é4?.ä>cRšlh ‹ šŽº®=Õß൷áéѳnÊߪIŸÃ²°°À’%Kн{w6oòäÉèÙ³':„Î;ÃÊÊ R©œ²@­OMù†"“É——ǹY„/­ZµRÉ㻦ŽEo4ôkº/é¬KÑgZZ*¾ß´–––ì¶s)g9vVVÖ())]¶Ü­[9*¾ä˵µ2“ÿ™!‚ºκš£q»q7]È÷ßaÆáøñ㨨¨@UURRRðñÇcÚ´g]G^^^X·nÄb1ªªªpüøq̘1Ãà€Õ1þ|¤¥¥A*•"55ááá˜={¶ZÛÈÈH,^¼.\@uu5***pòäIŒgØÌÃ|öO$!))Iå‹âKcÜ%(‘HðàAØq!oÃϯ7†xƒÝ>kÖgX½j%2Ò/²±¦œMÆŒéS4údî=°%ö””” ª²þ™ˆ…‘ó9v¯ôÂêU+Q\\ ©TŠôô4D„ÏåØ(.;88âüùÈd²&¿[Š¥ç2)ýÎõM†bðÖo¿ý†ÿüç?ìÄVVVðôôÄ”)Sðᇲv[·nExx8Ö¯_pssÃÒ¥KM*ZŸ~ú)>ùäÜ¿ÎÎÎÇ[o©ÀÀ…¨¨(¤¥¥A&“!00P£Àé‚Ïþ-Y²Ó¦MC~~>†aoÀ0u,ÚÐ4†åãå°´´B‡àí탈 Ñ?èUŽýK}_FØülXÌÌËÉøúúb¤É*~×W­^‹¯£–aû¶-`]»vÃÜyáX´pk÷å’eø*jF¼>‰Ý»»bÒÇSðù‚p¨·š3/ ‘ ÂQXX†ap9ë†ÉŽA<`djÛ^E,£îl4‹Y$š9;vìÀè±ï¡´´´©C!â@ü±£1ò ƒÊÖÖÖâäŸ — Ѳ0æŸ A„FËM ÖsÃh$%‚àK‹›­½¹@Ýü¡g—‚0 ½‹hHŒ½;‡ ‚ňö„‹ÐŠ««+þºýš:‚ þTWW£BiÆ!¾¤¥ž…«««Ae[ü]‚?’’’4NNLÑX¸ºº"((ˆ—­ò]‚$XAD³Då¶vùËAÑœPÖ&ÓO NA AÑ" Á"‚ Z$XAD‹€‹ ‚h`A-,‚ ¢E@‚EA´H°‚ ˆAýä·4ÓAÑÜ`8Ëf@33AÍ em¢.A‚ ¢EÐà‚eoo¯15ci¬¸ìíí1nÜ8­6ãÆ3Y<ÍéxAB£¼À‘^c¯ž¬¬,dffÂÇÇGe[ff&²²²š *‚ ˆæ u *јâ†µkתÝðððF‹… ¢¹Ó,ËÞÞqqq8p œœœàââ‚ &àñãÇ»øøx 4NNNðññÁO?ýÄÙ¾}ûvøûûÃÁÁþþþعs§J]»víBïÞ½áàà€€€lß¾]%}ãÚ±czõêÅñɧ nüøñÈÈÈ@vv6'?;;—. î1> IDAT]ÂøñãUʘbºc9`À8::Â××WåX* ‚ ˆ¦¦YÄÄÄ`ÕªUÈÍÍÅÅ‹ѺukÌ;—Ýž€ððp,Y²÷îÝÃÁƒ‘œœÌnß³gbbb‹¼¼Ž93gÎĨQ£X›ôôtÌž=IIIc&‚hLÄÅEì²};{Ã+)) 999j·Mœ8ñ™?…Wööö(..†@ PÉ——‰D¸}û6¬­­ÕúprrÂÝ»waeeÅæUVV¢k×®ÈÏÏg}ܹsGŦS§NKW\šêUô©iŸåÛãââpöìYDGG#44ýû÷ÇØ±cy×¥ï>vêÔ •••*1 …B©ä+³cÇ6AêpuuEPP/[eÁ2h¦ ¹X) “±(‹Bs¡1â3f ¾ûî;ddd ##kÖ¬iÐúd2òòò`kkkPyS~ïA<_Èÿðò-®64†ej±âƒNŸ>­q»§§'gL ’““áååÅ®{{{ãÌ™3åu}ñööFJJ 'Oy]B¡¡¡¡3f BCC!ªÿZLµ~~~ÈÈÈÐ+F‚ S0qâD½sºuÓ_ÈSs%44¡¡¡8uê$ nß¾éÓ§³Û§OŸŽððp¤¦¦B*•"55ááá˜1ckóé§ŸbþüùHKKcmÂÂÂŒŠkæÌ™Gzz:¤R)ÒÓÓ1þ|½ý¼ù書}û6g\ISícdd$/^Œ . ºº8yò¤ÊƒÌt— AM G›˜FzpXSçÏ3OLJT*Å_|7nÀÉɉ# ï¾û.***0uêTÜ¿]ºtÁ¼yóÂÚ¼ýöÛxòä >þøc<|ø]ºtÁœ9sjð¾3¥¥¥˜0aòóóÑ¥K̘1‹-2ا&LµDTT¢¢¢––™L†ÀÀ@Ìž=Ûä1A˜ Aqq1£8°Õ®}…vìØAãZ¸té>ùäœ?¾©C!‚hvðÕâ¢gϼ¶k×®ù<‡Õ’™6mnݺ…ššdffbîܹøè£š:,‚ ˆÒ%øO'88ãÆCnn.D">úè#|úé§MAÄ? ,ðþûïãý÷ßoê0‚ þÑP— AÑ" Á"‚ ZfuO7ã°‚ ˆçÌtAAмg¸ ‚ žOµ‰]aA-,‚ ¢E@‚EA´H°‚ ˆ AÑ" Á"‚ Z$XAD‹ ~ò[z‹ ‚hnÐLAD „‹ ‚h˜¡©™‚ ˆæ‡²6ÑAÑ" Á"‚ Z$XAD³¦¼¼ AÑŒ©¬¬DVÖ<}ú´ñ+??éééHOOG~~¾Þåñî»ïÂÕÕ;v„‡‡þßÿûøë¯¿Ll c÷îÝ6lœáììŒaÆáçŸn°úìííÕ.A˜ kkkøúúà…^?8ÜðH¥RìÛ· Ã@$nܸ@€1cÆÀÜÜ\§+V !!‘‘‘ؼy3lmm‘••…˜˜Œ=b±¸¡wƒÅÞÞ¾AëÓ×hh(.\¸€¥K—âå—_†@ @JJ –.]ŠÔÔT¬]»¶ÁbU¦¡ AÏ2™ @#Ít!•J±uëV„„„ k×®œm·nݶmÛ0yòd˜™iÖÏ?þøñññ8q⬬¬ØüÞ½{cçÎX·n]ƒÅßÜ9vì’““ñÇÀÖÖ–Í|xƒÅ@E„éa껳Ю}ûÆéÜ·oBBB ‰°`ÁtîÜ;wFdd$:wîŒÑ£Gcß¾}Z}ÄÆÆ"""‚#VŠÌ›7]Þ¾};üýýáààìܹ“ckoo¸¸8 8NNNpqqÁ„ ðøñcÖææÍ›ø÷¿ÿ 8::"88û÷ïgËË?åI‘‚‚„……A$ÁÝÝááᨬ¬ä]¿.ÿÊlÛ¶ ,àˆ•[[[|þùçØ¶m§~uè»êÊjŠ}Ĉ8zô¨J¹¢¢"tíÚb±˜º ‚PA±K°Á+??µµµø×¿þ…%K– ::ùùùÈÏÏÇêÕ«±|ùrtíÚR©=Òè'55ýúõÓYßž={ƒØØXäååaóæÍˆŽŽF\\Ç.&&«V­Bnn..^¼ˆÖ­[cîܹìö>ú¯½ö®\¹‚û÷ï#::ðìjB,³I‘àà`âÎ;8yò$ÊÊʰtéRÞõëò¯Lzz:^}õUÛƒ‚‚žž®Õ‡:øì‡2šbÇ÷߯b¿sçN¼ùæ›$VAhDÞ%((.*bŠŠ Ù ::ê,¼cÇLœ8‘WEééé‹Å5j\\\TDI$áîÝ»8|ø0Ú·o???µ~:v숇jí6€AƒaÑ¢E:t(›wâÄ |óÍ7HLLP÷ïÿܹspwwgmJJJàåå…œœœžžÎŽ·)£Ï8ÍÓ§Oˆëׯó®_ÿºŽT*E§NPXX¨Õ·®:Õí‡Ü^Ó²"ƒ BLL zõꨩ©A¯^½°gÏx{{óÚW‚ Z>|5äqá#TVVâòåL 8BuÓ_0 8EÃ0`48Z·ËiÓ¦ JKKuÖuíÚ5qò‚‚‚påÊNž››g½mÛ¶¨¨¨`×'OžŒ",, »wïÆßÿ­³n(,,ÄìٳѳgOtèÐöööèÒ¥ +|ëׇ6mÚh±X¬¶»P|÷CæÍ›Ç¹Ê:|ø0\\\H¬‚P ÃVVÖðñi¤.A‘H„üü|0 ƒ>úHeûøñãÁ0 >|¨ñjpæÌ“Å%´nÿúë¯ñËÿoïÎã¢*÷?€fXbqQMI!Ee 4Ž›WëçmW‹2m±,®Öíš$j¥™–·kÚK3[Ì­E»¥áV‚+Џ‹àÊŽìÃ2Ìœß8Gf˜aXf|ޯ׼ÎyÎsž3ó}ï<ÏyæÌ¶mðööFLL BCC±jÕ*£õFDDÀÙÙ;wîÄÍ›7‘ŸŸììl±Kkêþ"((‡2¸>66ýúõ«·ŽÚL=ކ˜8q".\¸ ~aíÚµ˜9s¦ÙõQÛàèè ¾8ìéé ¹\Ž””,X°ÿüç?áåå…®]»bþüùxçwœœ {{{xxŽœ9s&–/_Žòòr½ëµ³ûö틸¸8uqqqðóókpÛýýý1gÎlذÀ²eËÄuÚžamÚ©ä …Bœ Ûà}ª_Ÿˆˆ,[¶LoM©TbÙ²e—9::¢  @§\RR’Îÿ9Cm—ÉdxõÕWñå—_"11©©©˜8q¢IuµÈ,Áððpñ“zTT’““qåʼ÷Þ{HKKî]»tN¨úŒ=cÇŽÅ#<‚?þøEEEP©THHHÀôéÓ±hÑ"À¬Y³‰øøx¨T*ÄÇÇ#22³gÏnp›8¥R‰ÒÒR?ü0†ŽñãÇcÿþýP*•(++ÃÁƒ1~üxtìØÓ¦MË5 ,@^^T*Ž?Ž^x¡ÉŽ£¾¶Ož<ÀªU«ðÜsÏé\wãÄ "ª,//OÈ˽{]¢‹{ÓNºÐªªªÂ¶mÛPYY OOO@VVìíí1eÊØØØ˜TÏÞ½{±víZœ:u EEEèÔ©,^sª§µ¯^½iiièÞ½;^ýuLŸ>]¬Ã”I111øôÓO{{{ 2K–,B¡lݺQQQâp§v»«W¯"22R¾ìÓ§^yåÌž=Û褄šË Õ_ŸmÛ¶aýúõ8{ö¬ØÛ=z46mÚ'''±\NN"##±ÿ~TVVÂ××sæÌÁ‹/¾höq4¤í6lÀ;#³gÏÂÝÝÝèûBD­‹©9$'ûî$½Î]º´\ÂÒÊÊÊBFF€êOâõ Rã:tøí·ßÄDk >ùä\¾|k×®µtSˆÈÌMX-r§‹š<<<˜¤ZȰaÃðïÿO>ù$bbbàââbé&áØ±cøâ‹/į&èµs{XDD$ LXDD$ w¦µsLˆˆ¬nnb‹ˆˆ$ ‹ˆˆ$ ‹ˆˆ$ ‹ˆˆ$ ‹ˆˆ$ ‹ˆˆ$ÁVïtADDÖ‡wº ""IbÂ"""Ià.ˆˆÈJ :ÏÙÃ"""Ihñ„•™™‰„„$$$ 33³ÁÛïÛ·?þ8 ºté___L›6 lúÆJ„«««ÎÃÝÝAAAX²d ***tÊIU‹%,•J…~ø@aa! qðàAlÙ²*•ʤ:–.]Šèèh<ÿüóˆGzz:~øáÈd2Lš4©™@WsŸüZ~~¾ø¸yó&6mÚ„„„DFF6Iý¦`B$¢ædÛ;Q©TX¿~=ÂÃÃѳgOu)))ذa"""`kk¸9û÷ïÇï¿ÿŽ˜˜888ˆËñõ×_cåÊ•ÍÖ~©±··Gÿþý±fÍbõêÕª“‘TµHkÇŽÇ}÷ÝAt½zõ¤I“°cÇŽzëX·næÍ›§“¬jš;w®øü«¯¾BPP84öõ×_ë”uuuÅöíÛOOOôèÑÓ§OGnn®X&)) S¦LA=àáá#FàÇ·×þÕ>jÊÎÎÆ[o½///øøø 22eee&ïßXý¦’Éd°±±ÑÙ¯±úµm3f ºuë777“ŽËX›ÿýw >8p ¾ùæ›:íeˆêÓì +33jµÞÞÞu’•öѳgO¨T*dee¬'>>C† 1º¿-[¶`ÕªUX·nnÞ¼‰µk×bÅŠؾ}»N¹U«VaÙ²eHMMÅ©S§Ð¾}{¼ñÆâúgžyãÆÃùóç‘––†+VàçŸp·§Rs®¦#F 88×®]ßþ‰ââbDEE™¼cõ£R©pá¼òÊ+?~|õÆêÿøã±téR\¿~yyy&W}uîÛ·/¿ü2æÍ›‡ÔÔTlÞ¼Ÿ}ö~ûí·µm²ÜÜ\!+3]\е[w£mܸ3fÌ0i ÈÏÏÇ„ ê-·k×.¸¹¹! @ïú.]º ##£ÞaC9r$Þ}÷]Œ3F\ƒ?üûöíPýIþرcðññËÀÏÏ·nÝxzz"!!^^^z÷ãêêjr")))App0.]ºdòþR¿¡žÉ½÷Þ‹}ûöÁÝݽN†êwuuž}ûdÖqé«süøñxùå—ub !!¯½öbcc µ*¦æô[iâsO/¯êkXÍ}k&mOÊX™útìØ………:CTú\¼x¡¡¡:ËBCCqþüye}úôÑùßÅÅJ¥Rü?""aaa˜8q"‚ƒƒ†®]»Ö»oÈÉÉÁ¢E‹°oß>dggC­VärÝά±ý7TÍD¡V«qýúu,Z´ .Äš5kT—¿¿e¦—>§OŸÆ³Ï>[g¹)ÛQÛÕâ·fòòòBff¦Áá@í###Ã`oxà>|¸ÉÚ%“Éê]¿dÉlÛ¶ ÞÞÞˆ‰‰Ahh(V­Ze´Þˆˆ8;;cçθyó&òóó‘ FÓ ý7† z÷î•+Wâ÷ß7kûÚL=.}4¸MÍGÍáF""cî$,¡Æ£iyzzB.—#%%Å`²JNN†½½=<<< Ö3sæL,_¾åååz×kg öíÛqqq:ëâââàçç×à¶ûûûcΜ9ذa8€eË–‰ëd2™Þ^áÑ£G…B!N1gØËPý UYYÙ$õ›r\†ê ÀéÓ§Ðj"" vnj‘1™ððpìܹW¯^­“¬RRR°k×.„‡‡×[ÇèÑ£1vìX<òÈ#øã?PTT•J…„„LŸ>‹-Ìš5 ‘‘‘ˆ‡J¥B||<"##1{öì·ùÀP*•(--ÅÁƒáíí-®÷òòBlll´ŸŸV®\‰üü|”——c÷îÝ Þw}õ›B£ÑàêÕ«˜;w®ÞIæÔoÊqªówÞÁ‚ pâÄ TTT@©TâÏ?ÿÄÔ©SuÊq– Õ§E¾‡egg‡_|Û¶mÃÞ½{áéé ÈÊÊ‚½½=fΜ©wª¶ `È!X»v-fÏž¢¢"têÔ ƒgð=þøãP*•˜9s&ÒÒÒн{wÌ;×hB¬í¥—^Š+{{{ 2Dg*öÂ… ñÒK/‰ÃÚkHëׯGdd$>ýôSÕת¢¢¢œ´ ÕoHÍ“½\.‡‡‡}ôQ,X° Iê7å¸ Õ†èèhDGGãäÉ“Ðh4Æk¯½fÒkADÜ™%˜™qK\ÐíÞF7jÈ,ÁÚ²²²‘‘ úy}ÀDDÔú˜šCnÝLŸ{uíÚ2=¬š<<<˜¤ˆˆ¨Á8¯˜ˆˆ$ ‹ˆˆ$ ‹ˆˆ$ ‹ˆˆ$¡EnÍDDDÔP:¹Il›ëDDD£››8$HDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’pçÖL¼Ó…!±±±HNN¶t3ˆˆ¬–B¡@hhh“×[37 @Ëÿ€£”h“Õs³,Ý"¢fµ}ûV„‡O5kÛ¯ÖÍ’´jbªGrr2žxzŠ‹K,Ý"¢fU^Vnö¹n£“ñëÎLX–&‡L‰¨Õk̹®¥Î‘LX&¥›@DÔ¬fŸë˜°¬„ ÐhØÃ"¢ÖMИ®c²"µßŒM׉Ïmmmáèè7·ÎèÝÇݺu7kׯ¥àøñÃ(/+L›1Óü×jkSÕED­›µ_þ`Â2ÆÀ¸îÂ… jµEEE¸ví:âââp+íBmðnâOÅ#L€_¿ûacSýõ¸«×Ó×ö;zz{áêõt|óõ—xvú‹MR'µ.¼†Õ 0| +åÚM€L&ƒ[/ücòìüåGädßBç.^ ÚRYŠ~}}‘™‹òòÊÆ6»í1ôº¯«Øn""-^Ãj êùÔ¡]^}K• èÛo.^¸€GÆ÷Bq‰póf*Î$žBaA0``z+|Äz¾ûf`É’Å€§Ÿ}P^^†3‰ ¸šrvvvèáÝA!°µµ·Ó–­Ißòo7­¼ÿþûâ2}ÛQÅ–ô €Á ‘ú–»uvÇÑ#qhßÞ…E¥Èȸ…#q!lÄ(øDQQ!¶mÛ—Žáêæxòéç°ù»¯ÄaFHJNÅoÿû!xxÜð³“cïÞ½¸tñ,üúŠ¢èÕIÉ©uÚQ{¹¾}h÷CD¤Ñ3Álów_,ÿäÓωϙ°¬… =¬šìììPYY‰{ìí!ΟKÄðá£0xp2³òPZZ‰‡††áø±8<úX8JJ•:Û_¾rC|þØÿMEïž÷"7¯yùEè×?¿îܰ°‘Èι]o;j/¯ù¼æ>ˆˆBÝsÉOÍÀßo¬Sô‰§f<¿4'&,#껆¥oyyy9ìíí —Ë ÜÎËÃÞ½»±wïnr2™ Ý:¢¸D÷›åÚ:ËËËq&ñ~ù)ååeb@Èd2´o焬ìÜzÛQ{¹¡çDD€vÒEÝsÃãONÖ͛tþ·Ô9„ ˘ö°r²³àêêFsg½€ùó߆ƒÃ=&Õ¡ýÿHÜ_puuÅ”©ÃËÓÐh4ˆŽŽ†­­IŸn •±ö©«DÔòª']è?7L}âYlýáL}âY½eØÃ² ¹†UUU…óçôÊË+¡Ñpqí„ÌÌ ”UTOÌ0F[gnn6žzú)TUiv+*U23ÓuÊÙØØ¢¼¼\§EE…zÛ§}Î/B‘>ƾ8>õƒë™°¬…‘–F£Ayyrr²pùâytq÷ÄàÁƒ“s‚  Ÿß@ìÙ³AƒààèFÀíÛ¹¸’tCCGê­:vtÁ©“ñpéä ¹\Žì¬Lœ:yL§œ‡§öìÙïž>ËmŸŸ‡„S'êÔ¥}îèè„7n°‡EDuT_þà,AI3t K;=ÜÆÆŽèäÖ E`€?J•e((,téâ'Gœ?wéééÜ:cÀx÷ðÂõ·t÷wg_!ƒBÒ¥sˆ‹‹ƒ í;t@HÈ :ô§X.0(I—Îá÷ÿýŒªª*tèÐ Dl25ëõàüÅÅÅ€„?Ù´/I— á÷°$OOkÒä'0°¿¯ø¿F# ªª ʲr¤gd£¸¤T§¼“s{ 1înprt ƒ²¬ ¹¹·Åº'M~âÎîªÿwvn‡ÁC†còdw8;;***ÑÇÇW,go‚áï&¢};gÈd2”×*S³Þîݽ1pÀxzt]õ[æÜå¦|µˆH¢=³Mß– Ëjè{3Ï^jP%%¥(©•ÈŒÕYQQ”kiuÊÝο{J¥ªªÓK€üejÖ{;¿Pg{"" þIÖ‚ ËNR ¢¶€wko%ø½%"jíx/ÁV€¿8LDmï%(m …¿ü´±tSˆˆšUEE”¥õ_g7ädü(Š&nQ]LXõ Pýfµf®.íÍ>×) ñ|Ùœ˜°Œ m‘7‚ˆˆê'·tˆˆˆLÁ„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’À„EDD’`VÂR(ظqc7…ˆˆZ»7šýS$fÝ­]{÷r&-""jˆÆü‰Ù?/ÂŸÝ "¢–ÄkXDD$ LXDD$ LXDD$ LXDD$ LXDD$ LXDD$ LXDD$ LXDD$ fq866ÉÉÉMÙ²bæ|;1Òö0NȘ¿Ó…6Àž‹˜eÖNIz¾Zÿ˜hŒ‘¶‰qBÆ44Fj2+a%''㉧g ¸¸ÄœÍI‚&<:¿îÜar1FÚ&Æ ÓЩÉì!AA0{s’³ÞkÆH›Ã8!có^›°„Fî˜Z?Æ™‚qB¦2¿‡Y[bî{Íi['dŒezXìÆ·)æ¼×Œ‘¶‡qBÆX$a5vǵcÇV|÷Í&$%]øøÜ§žyáá[¬M­YkûäÜë¾®âstqwǸqüyÿ‚“³³[f\¯ûºâêõtK7CƒÕ×M ¦IDAT¯Ö'5mÚ¸N|.“ËÑι}|Ñ@d2™[&-–IXüT´àßo#áÔIÌ›ÿ/‡  ÃÉ“'°ìÃ%8p Ñ‹?lP}½{vCʵ[ÍÓØ¨ßjYù'gí{¢V«qãÆu|ôÁb¼ûî||²rµ…[fœ5¿® fåqRÓÂ… ééØõë.ØÙÙÂ÷þþnYÛÐÈIš&lŠiöÆücÇŽà§Ÿ…“ÓÝO¡¡Ã´u&=6{cö`ô˜± ª·¹Å¯US2k¨Ö}ÜÚ¶Éå2ôìÙ|´#†µê6kYkœÔ–rí&@&† þ½»ñàƒâv~‘…[& ùpbþ­™î|*jéÇ÷ß}ƒ×æÌ…££SuŽŽNxuÎøþ»oÄeŠ^ÝõÖ£]®èÕ èÕ]|Ô,³ùûo1zä0ÜïÓ#ÆbÇö­zë1§~©=¤#¦‹)åöÆü‰þ†¾¾½6ìAlݲYo™ÿ{t<úÝßÃCë–Ùüý·5"÷ûôĨ¡øaówubeç/?á“&b@_ø(¼ÅuÛ·mÁȰ¡¸ß§'F†ÍßkrÛ'Ís\Úÿ5ŽN())AûvÎeeJ;‡ÍßmÄö­ßáø±ÃP©Tâ6ßnZ¯·îšË ò±ßlÙ¼ ßû~ûõg\¿vU§|ZÚ üïןðý·_á§[|å²Å_Ÿf‘;$7­ýÌ™D|´üƒû4èA,Šz¯N€é#’’oÀGá¤äz˹î |²ò3ôíç‡ ÎáÍ7æ ]»ö;îá&©_*Ìi³µOWÖ¶M­V#-õ>úp)B‡ —:ô'æÏ{K?Xް#qíj ^{íe¸¸ºb̘q€ƒö#já¿ñáG#8d22ÒñùêO>¥úZêÏ?ÿˆ/¾ø+Wý~~ýqîÜY¼ùÆ«pttÂÄGÛòßÏWcñÒ0p ?lmm!bþ؃ÿ~¾+W­Fß~~8þÞ|ã5¶[›Ö'µÕlkaA>accAðûÿ~A@P~øaØÙʱwï^\¾x~Åí½ºãJJjzµËÿ:¸}ûõGxx8Ú9;!++ ±±±ðóë‡â%2ÒoáHÜ_1 þQTTˆmÛ¶ÁÅ¥#:¹¹·Øë`®Æ¼×’ëa¡cÇ×»¸¸ ¨¨H'“Êð¦”Yøþb ¸s80 £¢ñåº5MR¿”RŠSÇGá …7úúö¸±#qöì,Š^*–Yóù°dé2Œ;vvvðñ½+V¬Â§«VÜ-óßÕˆZ´C ;;;ôèá-~ _oÜ€¨¨Åð÷€­­-±0j16n\¯Ó–?úAâ‰O|¹nNüùû êýÅVO­-Nô› ÐhÔÈËÍÁ‘ÇЧ/Ôê*‚€Ç&MÅȰaP©ÔÈÊ)€ß€@\¹’„În.uê0Twii B‚ƒ R©q#-e<:휫G•ÎKÄð°Q<8…%(.­ÄCCÃpêä 8;9Züuj–¹Cr³Û·ï€üü¸¹¹é]_ŸÚ× }L)óÀÁ:낃CpéÒÅ&«_*Ìm¿5÷¥¤k¥R‰#‡ãðî¿æ#&æL¹Ó;:wþ,^}å¥:ÛÉårñ¸.^¼€1xœÉW’2h°ÎúAƒ#éò%e}ûùÕ©ãÒ¥‹zã°Þ×µ5ÆIMï¿ÿ>@&“ÁÙÙ}|îÇØ1£QXT‚²²2œI<…Ÿº…ò²2ñ˜d2YuO);O¬§¾s†¢/¾újºÝÛ®®ááéÆ ·ÊÊ·oçaoÌnìÙ­³­L&ƒ[§Ž(.)mŽCo2y¯5$¨Ñ´|õï?GÆ#ã'è]äÈaøõ¨Ó¶ÚíÔ¾`õ•©¹\§œ Û6¤~©0'È,#¦Ò¶ÍÁÁ#GÁÒ—ã£còä©A£Aü©sprr2¸-Põ§)1$“ÉõÖaʶ֤5ÆIMÚY‚Z*U ‹‘w»‡cÿ„«k'L™ò8¼<=ààp4 ¢££akkcòùÆ? ÈÉÉBjjN'œ@ß~àãÛ¯º `þü·áàpÁ:¬™E–¶ßÒ¦<þ$>[µa#FÂÑQ÷DRV¦Äšÿ®Æës#Ŷ988¢°°:tË¥¤Tÿ”AÍO@Fïw)NÆÇCC‡‰ÿŸ8~¾¾}›¬þVÍB1bªÚm ‰•+–áܹ³ðóë~~ýqîÜ„„ 6XÇý÷÷ÅÑ£G6Rïz…¢N?†ÐaÃÅeÇC_£=p_ß¾zãÏPyɲò8©íÂ¥«z—çæfã©§Ÿ‚Z­ÁÍôl¨TUÈ̸û}9A`cc‹òòrã-**Ô)jØ ë½=Ñǧ*+Ëñͦ2dró àêê†ÌÌ ”WVO¯oK̾†¥½PÚÒÑ£Ç" 0Óžyq±‡ T*QV¦Äáñ˜öÌ z£FËŠe}€Û·oC¥R!áÔIüó­7ªáNww?v¦ÎXkô¢…8sæ4T*O#:ú=Ìx.¢Iê~}{›½ÌÚÇž-#¦‹¾å&>†˜?vC¼òêëX¾ìœN8…ŠŠŠê¡Ã#q˜ýÒÝ÷ÿ…gcQÔ=z•••¸qã:Þžÿ–¸þ™gg :ú=$&êÆÐ³ÏÎ0Ú–éÏEÔ‰¿E‹,o-Ö'úŽËÐúŽ]pêd]µgÏ&B#8À3ž{AÜ6lÄH¨ªTXþÑR¤¤$£‹»;fÍzU\?aâcP*•˜ÿÏêêÚµ^xqÆÿ}b“`mcÇ>Œâ¢"¼õædge¡k×nˆˆx ‹Þ_`µ¯kkŒ“Ú µuЃ¡¸|ñ âââ @‡2h0ýuPÜ.èA¸|ñ,~ûõ'TUU¡C‡Ž0À±‡î–é­ðŵ”$Ž=¹\ŽÎ]Ü1îoˆÓ㻸{ÀÉñœ;›ˆôô[Ü:càÀôèî…©Öy­Æ¼×²ÜÜ!ýÖMqA÷÷ÝhãÆ˜þ$Š –•²ý}qæÜeK7Ã*¨ÕjÜ¿3fÌ0©|[‰ÒÕÚãd€ŸΞO2¸ÞÞÞݼ<àì쨨¨Dn^>îíæ)ngkkƒ®^hßÎ 2™ •Èɽî÷z‰eÚ·sF—ÎàääAPZZ†ŒÌTTVŠûrvv„G78::¡¬¬ 9yù(.¶îI ‰‘´Ôëâó®Ýî•f«%µ…cl6m$F¨‘$'Æ>ÀVTTâêõ´:ËoçßMÈ*Un¤Ö½U[~ÁÝ;e— ÈÈZ–”(QR¢4ÖäVErÓÚ[Z[8FS˜û:ðõk['dŒE®a5öâ™$$^hõÇh*s^‡¶#¤‹qBÆXfÒE#wLÒÂOÎd Æ c™V#wL­c„LÁ8!SqÒ™¤-LW¦Æcœ1-ÞÃR(øå§­ böŽIZNÅB¡0¹audioCodecBox).toString()); settings.setSampleRate(boxValue(ui->sampleRateBox).toInt()); settings.setBitRate(boxValue(ui->bitrateBox).toInt()); settings.setQuality(QMultimedia::EncodingQuality(ui->qualitySlider->value())); settings.setEncodingMode(ui->constantQualityRadioButton->isChecked() ? QMultimedia::ConstantQualityEncoding : QMultimedia::ConstantBitRateEncoding); QString container = boxValue(ui->containerBox).toString(); audioRecorder->setEncodingSettings(settings, QVideoEncoderSettings(), container); audioRecorder->record(); \endcode While recording, the status bar of the application is updated with duration information from the \l{QMediaRecorder::durationChanged()}{durationChanged} signal from the \c audioRecorder object. \code ui->statusbar->showMessage(tr("Recorded %1 sec").arg(duration / 1000)); \endcode */ main.cpp000066400000000000000000000042161225012771600327520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiorecorder.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); AudioRecorder recorder; recorder.show(); return app.exec(); } qaudiolevel.cpp000066400000000000000000000050151225012771600343360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiolevel.h" #include QAudioLevel::QAudioLevel(QWidget *parent) : QWidget(parent) , m_level(0.0) { } void QAudioLevel::setLevel(qreal level) { if (m_level != level) { m_level = level; update(); } } void QAudioLevel::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // draw level qreal widthLevel = m_level * width(); painter.fillRect(0, 0, widthLevel, height(), Qt::red); // clear the rest of the control painter.fillRect(widthLevel, 0, width(), height(), Qt::black); } qaudiolevel.h000066400000000000000000000044401225012771600340040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/audiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOLEVEL_H #define QAUDIOLEVEL_H #include class QAudioLevel : public QWidget { Q_OBJECT public: explicit QAudioLevel(QWidget *parent = 0); // Using [0; 1.0] range void setLevel(qreal level); protected: void paintEvent(QPaintEvent *event); private: qreal m_level; }; #endif // QAUDIOLEVEL_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/000077500000000000000000000000001225012771600321265ustar00rootroot00000000000000declarative-radio.pro000066400000000000000000000003051225012771600361460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radioQT += qml quick multimedia SOURCES += main.cpp RESOURCES += declarative-radio.qrc EXAMPLE_FILES += view.qml target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/declarative-radio INSTALLS += target declarative-radio.qrc000066400000000000000000000001311225012771600361300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio view.qml doc/000077500000000000000000000000001225012771600326145ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radioimages/000077500000000000000000000000001225012771600340615ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/docdeclarative-radio-example.png000066400000000000000000000405361225012771600416070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/doc/images‰PNG  IHDR˜GœSZ¯ pHYs × að·’F IDATxœíÝw˜UÖð·ªÃôäÈ&À3JAT@E ¬u]Ó*æœ]Ô5¬9~»êšu×–$f‰ ""qȘœ;÷ùþ˜ÔÝÓq¦kÜ÷÷<ý0tŸ:u»ºúžª[¡•#?¿YúÕæá¦a'c°þÐëõ¸\.„J 9Ò{ÂNOyHlíaö^¼y´þ0/­ ç¿È¡nC¤Hû;éÑïI:¶®G··«|¼ß& #VUU(Š»ÝÕ›wàÉw¡`Ç.(ço~YžK? )‰‰h2›a·Ù ¡6¨åËÛÕtz·N"ÔN¾Ûszud~cƒå ãõNÇøètC)0aÅèØƒÅD"‡G\°9)ÉgîÂÂBd¤§ÃèÞnŒQF(uuubµXü­üá$$$Àáp@UUØÌfLLK†Ä'À•‘( ¾ýö[$$$Àl6cÊñLJôF, –•aèСP"â1D§(JÛó[¶lAVVL&Sóó’kQ`Üb»e/&”<Ý1TÖ 1q],Fáä iú@óŒäâP†Ÿ¼æÙ¥¢j. b|Æu¢¸tˆëäñ›PòøŒ P\, JJK1xðà }Û¶­[‘éÖ·š¿«%wiiiÈýffFF{î@ï+Ü>yófdÉeŠ‚R[[+6«ÕïŒ- ¾_²ii€Í–€†úzLÎÑ#)§7Ið~ýz44À®]U¸ô’KBª–v»{÷îŰáઠ§ßXN§Ó…íÛ¶¡o~~ÛðÛïi/Æg\$†Ê:1Ÿq‘** á›ÎÄk*Ü3­Â‰³Puw‘ò‰ûœO8qbýÄÙívìÙ»ƒ ¹o+((@ß¾}a0ì$hï7‡rîm[·6çrØ¢3}òÖ-[æ6F¡œ+€k-¦nøUUÔÖÖÂátâóÍ•°% AIi) vìÀÖ­;qöÙc¡Ö×KAUUâââ .¹É»Íî÷a1[ 0EG£ªª*´Âs 56Ì­Ç ±Áæ‰!?1a„ò¥ ž+@ŒGÛZãä 5Ö;¾u«Lܧ 2}ؼòºÏÓ£í!L4ÞGlм¡ä %WëŸ!ÆtWq ÔŽÎæ é;#‚ʪ*DGG‡Õ·EEE¡ª²2`ßÖÚoÆÆÆúÌ]]Uí3wtý¦¯>ùž»îÆ3O?í‘óµW_õ×^Ûž;&&hnµÃÂs£ÔÕ ñ³H=æF'êëP]] §ÓŽüß|¹Õ•>|âãGB_û ”ÆF¿3§Ó‰êêjdôê…¦¦&Øíö ¦¦&dff¢ºª Ngse µ;§ÛuË/hl'ŠL(_ÀN1rùé`=r…ÐᇒKÄŒ ¡Ø„[4ÄÇôyx¿‡€ðQŒ‚MNr‹ëUXB-@Ár!PŒû}ÅurÏ%¤b¼|ƈkëÛÒÒÚú¶’’Ÿ}Zëóm}[uu[ßækþ¾r·>¾úê+L˜pæÍŸ×±ßÌÊ ˜Û£Ýn}òµ×^‹óçã¹çŸƒÝnÇ›o¼×^{·Þrk[,T×ÔøÌݺ”ž ³äa@ë)çㄺ:¼ÿŸ·`u6Áé\v4Ô×¢¾ÉŠÉÇ@-÷誶AbGùÍér¹`6› ›ÅÜáõúúzÄÇÇwlKl,Ìf3\N'àvæ…ß‘¶á€q]ˆ È+ÎoÞ`q¡äñÑ&Ÿy€¹àç#¦CœŸ˜NŹYý,S÷¯³âýå»ý y˜R3¡vr!NÒtØêr\'6ˆºl~(.áÄ9].455yômÏ>û ÊËÊðìsϵ,ußܹhllÄÓÏ<À­oóqq{ë].Ì^¹`éÒ¥¸ë®»ñÐÃàÉ'ž€ËéÄÉ'ŸÜöz Ü­|õÉ™˜¿`!N?ý4lÜð+vìÜyó WZêÛs75ÌÝ6DækÑõßÃ=€1ã'Àa©‡ÎeAéÁƒ(++Cÿý[#$.ÖïÌ€æjép:átº`³Ù;<^yåU444vxÞétÁn·7WËN¬!mI†Ò–£û;çc‹0XLÀ8ï§Bˆé/ĽŠ@{¡ÆùŠ ä=–Ó¹MpȬ“`{4×› {4A×·pöVÂÙ[ %Îý¿!Ætj=öh^áÆu˜o>GÐÜ·9½ú¶G} ‹7Þx#1÷¯ÅÎ]»ñÌsÏûîÛüp:p8¹/^Œ»î¾Ÿ~ö.½ä¼òÊ«xòɧ°pÑ"ÏÜGÐ=ï>¹ººùìáÙçÍÆšµkpêi§#9) UUU¹>r»/)}ÛÂSÐa«WÑ•CâÚ&YüùçØ¹õW¤%%`ÃŽ"@IQ!Ž;ö8¤§g4çÑ)°6o4ŠÀn·Ánïxzôƒ>ˆâ⢯٭V(ŠÛF§Ÿ6{Í­-®õ<¤4Öí™PcÝâ:ÆúÎç×µ˜ö8¯ïÉZžè°7ã×ë6W¹ÜŸp_¿9•ˆ×Ë>s{çwo·ï?¸ é øßÐçí?OÐî4œX¿ñ¡¾PâBY>¢:àiŸxÉo¬¯¾Íjµ`ÁÂE8í´SqÖYDjJ>ÿâ TWWµÅxöm>–¶ åä)ÏÜÅÅÅøä“O1|Ø0ìܹÃG Ç«¯½†/¾øÜ37:ævç¯O~å_/ãý>ÀG}Œo¼"N\~Ùåm¯Û­VÀ«Ýîm}ëV Zú%÷&Hj¢ ÷ IìXòý n]ƒØØô>¥e¥(«j@iIÞzå¸ýÞÛ‡™|[E…ÑhDUU5Tv¯ ÷B¼žÓét¨ªª‚ÑEQ›·6Åg›=yÆÁolk',V<‡UBõêƒ;¬BãºÓü”WŒÏ¸–¨§ävŒñ‘«=Îý‰ŽÅÆ3Þké)Þ^ü {ùþóš,Ø=C¨ÃHA¦ :M¤ö°Ã‰ëät¤b‰ 7VQT¼ú¶šš8N,X¸3O™yó ¢¼ -Ǫ;öm¾ç¯( ŒÆ(Ü7ßr+Ø»w ¸¨ÆÅØ1c°gÏn·ÜFŸ¹ÝÛíÝ'/X¸ï½÷æ-Xˆ^½Ò0þBœvÚLôœþùí¹ F(ªÎ#·ûlT÷…æ=‹ótèÿœó¦¯ñõ»Ï"5ZÁ ·ÏÅU×\‡ýraTm°Ù±çZüøãJ(®Z¢®Ø:ñññX¿~=¢¢L°Ûl›ÅÒá¹(£k×®E||„i>ÔÕSZƒeBŽp§ ïµÜ"çþ”w\¤bZã|'.Ø|½c[û¶_~ùÅ£o«®ªÄý…ø~ÉR”¡¦ºÚ³o[·Î³oón«H{n·~sïî]صc‡G_¹¿p ¶ok˽ƻßôA§Ó!ΫONï•y "Ú…½»wÃn·aáÂÏ‘›“Óž{ÍšæÜjûÉÈ}ÝÝwÝõ€£õ61^:óF@¿íS4lY†mûêqôWc¤c¡ª*òÂMß ª®f› ®†?a8TãÀyÜ©ª ½^«Í†êšj$&%Âb±Àérù|DGGcÏÞ}HNNF^^L&“gÂP/€l‰ 5®íÏã"Ê”¡æëäÿáäÓ26’Ó†œO]*mÝ› wÚnŠõ[ø‚å užÝ¼×âþŠª(Ðëõ°Ùl¨ª®òèÛÌf3س[_×Ú·¥¤¤tèÛ¼;ê¶~Ójmë7ÍfsÐ~3)9y¹¹ûM7JKn›[î1cÇÂép¢´´N— 0 ÔQ075µåÎuËíÝf½AïU`[$ó¿Û‡†ºu˜8- c=PSEERRìNAÍÁŸÑ;Óˆ¤3öÐcÄ“:äñÖZM ÑÐЀ¬¬LX-V8¸\.¸\.¨:âãP°c'ÌMMÈÏÏGrr2TÕÇ¥;a™pcƒÆ÷ôBjÜ!* ]-á,ï'œŽ.ÌnkðåWߎ´^Yyß_n‡Ãºº:,+C}]ŠŠŠ`±X`2™ø„d¤§#!!zƒA³=”ßU¡Ñ"g¸DÃâîò<ì„Û†‘#¢{4áÄGàxH¤sv&>Pañæp8PS[‹²²2ÔÕÖ¢¨¸³¦èhd÷î„„¤§§#111¤ââÎîp ®¶6´~3„ââÝºæv×Õùmwkî@í6E› c,vâ?Ç?DN§V«MMMp:ÐétÍ•:* :ÎóþfaGùݱ~ã»P”ÂíÊ4§ aÚ°rEp>~uò„‚°§êÊðZ„öhüNÓÅØprúŒ?D…Å=^\® }[û™Ÿ!æm=™"Ü~ÓOŸ¯‡˜;XQ ^`Z…Ú©¤#÷¾sg—Û£Eá7>œŽ[ëx-Š˜ŸØHLpÚNä W¨»4äå7ihY»{Æïtèü»œWËø0 ‹¯x_}[8{-ŠB¨ýf8ó –;X‘š Lƒí ’p:ëy@üˆP· õË …Æm~@¶·.,·Ê‘x÷ÁkÅ 7Þç4áÄ{Åz¯~cƒÅûZÑ‚\“¢ø›ÎkúP¾ As™‡?+ݱGÓÕ¡µCÔ‘k]$|NN| K«s8¹ƒÄ…Òo†’'”Üá©Ð Lk–N¦ËÛŠ,X=±ÐøÆ-R8Üã}LÓåâ$6`|Ë4~ ‡¯x·ùøšW‡ÁVàsLÑÉŽ?\™K¸]'sù}%‚Ót{‘ašpów˜&œø–Ptf¯%’¹ZS3Ä9„ÑQÍÕòOK’ÎçRÜ M°bÆ<¥½”W¼:ì@… c¬[Ó|LãcŒVéø‰u° 2iüTŠ€óðY@ü¯IŠ¿i:&°6º­wá~a||xÝS^üèÄÌÅÇ_Íðw3ýW ÿ/x2HºˆÌ#ôiÄÿÿ‚Ävx¶ã]Ž—à I¸m -Wø9:ìÁ¤gdvº!DDô¿«ì`©ÇÿƒþàQgèž#"¢ÿqÞµ¤ù-Yaˆˆ(BZkŠÞû ""¢Îð®#<CDDš`!""M°À‘&X`ˆˆH,0DD¤‰ðnCDDä—xüÍ=""Ò i‚†ˆˆ4¡x/2""ê:ñ<Ã=""Ò i‚†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆHúæ{ÇðB""ê*þ¢%u""Ò iBá½Èˆˆ¨ëÜk‰€{0DD¤""Ò i‚†ˆˆ4ÁCDDš`!""Mè›ÿáyÊDDÔU¼U u""Ò i‚†ˆˆ4¡ð^dDDÔuÞµ„{0DD¤ ""Ò i‚†ˆˆ4ÁCDDšà­bˆˆ(Bx«""ê,0DD¤ ""Ò i‚†ˆˆ4¡x/2""ê:Þ‹Œˆˆº i‚†ˆˆ4ÁCDDšà­bˆˆ(Bx«""ê,0DD¤ ""Ò i‚†ˆˆ4ÁCDDš`!""Mðf—DD¼Ù%u ""ÒoCDD"s†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆH,0DD¤ ""Ò i‚÷"#"¢ˆÏë,¹CDDÚÐ7_ÚÏ]""ê*ÏZÂ=""Ò i‚†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆH,0DD¤ ""Ò„Â{‘Q×¹×AËÍ.y«""ê:Þ*†ˆˆº i‚†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆH,0DD¤ ""ÒDØÆe©ÁÁ’ƒ¨6;}ˆÀåry<ÄϽhÄހʒb”T6Ààfަ*”¬DC  — õå¥8Xc…+„÷Ñ´í ¼õưlŸÃ\þî£#Â[ìDBËúâsYFz;ͨ9XŒ’òZ4Ù½Ö’†-XüöxoUÉ!º¯…;¿yo¼ÿŠü|µˆ7¡Û||ýd&¤ wn6ÒR1òâ7°¹É-ƺsÇ¥ !1‰n„üË0¿Ú-ÎYŒÅwœÄ$¤çõAnz"sŽÇ‹‹áñÝjÚ‚·.…´Ätdçd 9eÎ}q¼šVõÃ#˜‘Ÿ„ä¬<ä¤& câøï>{À·£”‰‡®~+ê?.¤©jWâ­¶ ëO‹ðüeã 'Ý‹Ýó=Æ<ð,>»g:.Ïu‹O…é3ÇÂè3Y5~]¹M/Â}7¾&ÉSpÃÜ ðúqïbù†j\Õ/(ûÿøÏN ¾öÌ=©/LŽ»ýÜýùÑxäŸóqÿ)—"ly÷øÚ>ÿ|î*ŒËP€Œ³ðàc_cÁ)/ã¥WãåB_:®:Ø^ˆj‰GΠÜàñ­¤%Û÷¢ÜG5Ò%õÁ¼DèBÏö?GÍŽsz¯Â»ü×{ \X6TnþKÞ‡¦ø|uü$ N1øwàË…›ašþ"^¼kZ?Õ”IçàŽIç´Ç‘•—s²ÉsòšíXùíjìsecÌ”ÉÈwìÆîJ2Dº °•ïÀ¶Òú B\ÉøfÕnØ2ŽÀ´)G #Ê-‘ØPYð3ÖnÞ…Ò†(d:ǎ΄‰ÕŒ~ÇB+0u…ØWm@æà|$ºMš1¸?’jã»uU¸<7¥=¾© ;6oLéèÓ'qs‰Afn*Ô•U¨1hù>›k«aÑ¥!·w, á·%X[™ƒ™†¶¯¼~ŽŸÚw½ö~©ºy)¥X»|t£.ÄäìöojâØ“11í-¬^¹ öD€î§m7ÞŸs ®ü²Xô nÕ­¯ÛˆvîÁ;Wž„§¶º˹`©­FÊ%_â·W¦#Œ2÷?Gœ98óöÙXsÖcøû³ñÖ©)¾-ÛðÚE3pݼƒˆÏÉFlÝhÌÆùo|ƒ7.È÷ý9«&ÄÅèáh¨E½ð»2XÆßO>›nþ+o@õò»qÒiOâW% }3õ¨®JÂôSñùÂt¼²õ#œcü¦ÿ©çÍqâÓ7¶B— ¢º¸2òN,^ò(ŽM€ |vñ8\²À‚Ô¬^ˆ±–£p%âNx _ý÷FŒŠŽÀB$êB;‚”h;*ö—ÂÜö¤ î@êQ‹}{+Û¬+Š[þñGŒ9b F ÊFJ¯‘øó[ܦ‹ÆÄ›ŸÂÕé‹1ç´Ëñð˯ãå/Á)—-BúuÏàÖ Íå¤vß^TGe¢_o÷oŸ}³S»{«°ÄÎÂÄåä!ÅýÄç ?MP¾ç@‡ã5ÞœN\5?á‰Ó&ãªÕÇàµU‹pëØøö¥?½ý8Üýñøb·ÛÉú‘¸sy1ÊËË›e;±àú!ÐŽÀì bq AâÔ;pï)V|öÈ¿ü m:°å—ã¦Å ˜³`JöìÀÞÒ|t¡]ý¼ºËÏX¦ÚSgŽ‚¬¸ ‡ŸˆKïý?|´t3Š}I@Z6TWà᫞Eáäçñsñ~lß¶{—ÍAãW? Æ{²ÆøïžóðÕþìÛ[„ËîÂÀÍ/ãÑO[Þ0ôÚ…ØS^‚=[ÃæÝ%(Yóÿôî|¯?–A¿[¡˜´É8{j/ìúÏßðªJ8!0ïþ?¿ p¢©ÞÜ\`$ G^ÿÖìÇÁª oZ€¹jðþ•3qÃíGj”´Ñ˜9ëX¤íþO?0÷?ó_öž‚Y3F"Uµ± Õ„è(Ï&¢MÐ9›PovÎ&ԛЛLž¦ª 1&¶†FØ‚¼5ûþy¸~ê)xÖz%þðÎë뵉ÛT€/Þ|¯½öšÛã |òs…ï„p`ß{Wâ܇ 1ý•ÏðÈñI¡,aRòpî½A¿õÏáÁÿ–t|ݹŸú+âfÞ‹{fd5ïzr1믷àxe >\¼ÇOG…Ñw}‹Ÿ?ºSb·âãÇoÄySG ')ã¯ù»ü§3ÿ:‹väaöÝ—`DLós1C/Æ è8Ü©öÃì;.ÅðX€‚„±gaæ vmÚÛ²a•ˆ¡F"UgGíÁ}ع};Šã§áœc Ø´rcÇ‚Eô;âYd8ë…·qÛ ¸ÿØÞHLLB¯aWbíØó09I¸ÄØæ/i4Ι3 cúôBR|2†ÎÄÜ^Ã¥9…Xøö÷(4bÕ}§àô§*0{á^T”ã`U!œ[§N›¹?5P`Œ‰†Þi…Å븆ÃbS5!&JTbM:8¬Vxœlì²ÁluAxxLöãÍË/Á¼œ‡ðÍâp\Šñè ¸IvìØáöX×ÎÎô™²fù½øãœ/‘wßgxã¾!ŽADu#æžeÀ?zŸÌÕ´;ŠlÈ:îhjú` J1£hW±Û^²· :ç1Ìÿ¥µ عêÜwJ6½t1Î|ð'ŸÓ5(D•1ý²bÜ[ˆÞýz£ÃˆVt6úeºp1$ 5A»ÅÚrV¤{?½z§ kÀ(ŒŸx Ž™8]RK]}Ð ¢ÃUȧ)+éÓñÄE(Ùö#¾XøVíØ‹ï.CI]éåÿÌ›ÄÁ?(M¥%¨Ö͘?o ’fÞ€¿ŒMj.Lj"Æ]q=f$nÁ‚ù›a˜›‹[9ö—¹ob:PYtæ„\ä%«@TúeÇÂ\ZŠZ÷Íצì¯Òúf#.à›ÊÁÌËOþëûqóËàïUEõ^L oضý_øÓ¹/ á¼·ñÉ=ãÏ›|HÇi÷Þ€#wý ¼úÄm!+ E`i0{nL¨zÔæÏ(”ãå:S ú}øtî¯bÇ7K°ËÇh™j0@ç0£ÉcÇKc|]9åk}h%û߯œËÞ\6;V¡ªªåå?ã©ã šè0Þ…–JRŒÅ±ÇMÂÈ\Ö~°{r/ëN IDAT¦ãì Ž2ÔàçÝ ˆÉÌD‚Àe‡Ýá‚Óf÷¼æÅiƒÍ)pØpˆy<Æ$bÅ÷í[x®½X¹l7bFMŘTÈĸIù°üú%V•¶§jØø V•e`ܤ~Îdk{CÈý–¼5{¬A]X ¤”‰[μkF?ŽÏþ9 Y¼GB§‡_¹$aÙ‹¯`m£[çۣĠlÃzìw[qlKñCQŒèÓqÏ"E£^m.\>^N:ýt;ðýòÂö wå~\RK˜ï©iÇzl·À9OCvŒ®y~5[±¦ .À¥D‡?å: èëWðÖ’-(®ªCmÙ6|þÀÙ¸øµ:œtÿ½øCËa†²EÇ___‚-ÅU¨¯¯FÉæ…øÛìËðúÞ<œ~É èÑÃ1}jª=Œû?ÞŠ›¶š­øhî#X\ÓS¦·œ5–5ל_ÿïNüsmlŽ:lzýü}I Nš3 ý0bÔEsp¼c1üëÇØÕd‡åà2<}ï;80òbÌ™üø‡¢F¡ßùo`éûg£â‘é8iî ëzBbþÏžÿg¼£ÿ ^ùÇlô6W¡ªªùQÓàNäC2þp×8®|Þ_Uƒ¶Þ_é‡3.;Æeãú§W¡Â急t)»á9ü’v*®85Çw:ÇF<9ëÜøÒWØT\ƒ&«•;ðÍc7á‰Õ :q ò}œ­|!nž%w]€;?\ƒmÛÖáã{¯Àÿí‰Gl˜ï(:wru›1ïßPåpÁQ¿ïÞ~¾ª5Âwy#:‡‹¶Úb¨‚5*9yYH4úÚšs¡©l/ «\HÌx?‡Ííµ(Þ[„º¨LôÍM ~›Ë›ÃUo„Þ­}â°Áæô#t.,£:¯|Íq*ŒF=qÂnsø¼š¢3¨çVª?â´ÁæÔÁhÔynË»ì°Ú]Pt†æ¡,÷—šÊQXXkL&ú䤸Y¿¼¸¬¨=X„âÊF & ½³3èq†¢Ài·Ã¥3ÂàÏå€zèÕZ|wÍXœºê"¬^s?Fš_³:zƒç:ârØàT 0¸=éh8ˆýEµPÓò—j6Øah[?Äi‡]tÞ/ÑábÏî]m'§$#¬Cô¿¤è‹àsÉ8ã¨\ÄI ~ûàn\vËgH¼ïG,»sTã{Dÿ{¼ Ï¢%ò§öG9ͨ©¨†YEbR'ÖÞ7 9Âg•Þ¯UaÁåý‘tÄ=ø©g|;ç0èŸJß? ±ãñ÷ß^¯8±åéc‘œvÞ*>$M‹¨NìÁX°î‘Y8÷érœððB,þÓ8ô޶¡|û˜ÿöb¸=ç¨bô‡ßÆÍc¢à°Ô£l×Z|ñî¸áøñäŸßÆ÷¯Ÿ‹\Ý¡neç¹ì)˜ñÄ‹¸d@û›PÔä'šö(80sÞz3S°7Ucÿ¦eøìÍÇqΛÏ`ò˱èîñˆ;4Í;dzÚç‡f‡ïr/63mÎnnP$ý“"§Óå{£ËaƒÕç^ïá'üã(À— 7Ã4ýE¼x× ä¶<2éÜ1霎ñ¶ l]µëv×Ô9GN‡I-³;jvoÀÚßv ¨VEÆðÉ8nLbÛö«õ¶`oC ú LDåºo±|k’†OÅ ã³Bscú…©SS[þw.¼înÜö䩘zÇո긣±è²¼ö]T[¶ü¸ëö4 .<ŽŸ4©Ææ—ì;±­Ô´ü!ÈŠê ·b_"ÝÔìݎΠ쟥|¶•8ÖoâJ~À7«vÖq¦M9Qa.wŸ$™‚™'y÷TM(ݾ åÆl émÇæeK±±4Gž~:F&°V`ëêæÏ$&¦LÖö>[¹öaõwËQД†QÇOÅ0]! :Úo²ƒTˆ¤A“1udKg:ól\~Ûݘwåq8÷¾‹ñÀqkñÔ1±nóÙuËV`K…‚^Ã&cÊØÜ¶Ï¿©x+vÕÆ!oP.u`ÆÁ‚](w¥ ïàÞˆSH#J¶ïAUl†å& ©x vÕÄ"oP&,¿Ã÷+=ðXüab>âÙIÏüœBÑX´»jãÑg` jþË·×!eÄ4L›S×ÓGÞaÖ?…ÂZV€í¥N¤õ€¨=Ëñýú"(yGãÄɃԵƒÚ«¨(—¿þÒöð@ûœÛåÙɱì3²Ùæ3¼MíOÉI½MbŒÏ”~C‡H~f’Dgœ#–‰ˆÔÉ××”¸ø^’7d¤ ïŸ% F½¤Nþ›üXךÁ,+o(±c/—[Î(½2r¥ov¢Õ(ð—r0À¼­ë^rÞ'_lZ-÷ŒŠ’ø)ÿ';œ-ñoÊìþÑbˆN•>úHjŒAbúŸ/oXEDıåq™ÝW®ú¶®m9YoP$nÌ]²¼6ÈrðœˆHãò¤Ÿ’#—é#‘k»<51Vògß$çN–äŒÉî{¦¼],Òð˳rjŽI¢2¥ß þ’™`’¸Á–ww·˜æMÿ™™1ÄeÊ€ÁùÒ+yœ=g¦dÅN“—öù]äRúî,I1)mttlÒwäôTEò®øJZ[\¹ôn9:Y/Æ„,é×/KâIÿO’?M^Üãj~¢ús¹,W¤œ&ïµ$9ø‘œ“ž$§¼y@D²é‘±=à¹íOÃ¥WZ¶ôÉI“ª—ì3ß–=›p9û[öáèyŸ“UÖÜ5Tté³åÓ_J™wa¦è†Ü!«-""ùõÁ#$zðyrí%½w”Ÿ&Ñ:£ä_ð®ì±wyñˆH„—ýaÒ?•þg–$Ž”7z/D‡l~t¼D%"o¶¬ãŸœ'½N”«æŒ“ŒÔ\80[ :IšxŸ¬¬éÌBj‰uÜ{-©¨(—ð ŒXdã%ª$ uΚš„‚?£Ü}–§âÖkF² & ›5 £•½ØXP~ó[ÞCRJ Ts5ª-€k÷çøpµŠn»§e†œÓq÷-ÇC]ýît¦¡˜:¹ö.ûû\@åºo±!þXÌ>)û¾_…"W‹†18aLrû¬Ô~˜}Ç¥«P0ö,ÌdÁ®M{aîdëÛÕ`ã¢÷ðÞ{íE¿T @ ˆŸ|æž“(ÐP¿òm|Z8sî¿Cbš?5i®¸f +?Á’Àµk1>üɈé·Þ€ãS›WÓÀ qÏ_F¡K£zj,’ °ÕT ÎÔ¬ú_ Æ¥\‰Ñq  aÌU¸ïÏq`ñGXU óhœ0ŠõKEص|ꇜ„3ŽŠÂ/Ë7£ Vl[ú#Êòñ}ݦ%ëoŽ Ð礳11±›·v8ªÝM£ÏÉ—„‰¸ö¶S‘­=zŸzn¬þt Š"=¯.û=ôO>¨y8óö¿`L|s?wĸç‚>عà3üÒõŽD3Á‹Á sÃüsƒÓR…½¾Á¿½¿t1ÎLî‹ÕŒÃÁ‚]¨Mѹ?9\(ùònœÅKX[£ÀhÐC§SKìG7´Ÿå¥ÆŒ~Èi¶‡“Œ¤('¬Vï30BeC}­.S"’¢ó¶](²eàØ!in1 ÒFªuv5ƒqÄñG@÷É×XUz)ú,ÿQ“ÂO‰ÃKo}ƒµg!vé8FÞ„‰™ni¢³Ñ/Óí+oH@j‚v‹]?”Ú g¼øÞ˜‘èù´@DAb^$·`r¡|{ª¤ÿÈu?ÜaJF²É‰½{óé¹t}NÞ ùè×Ëm[TMC~ß8Ô¯Úƒv ÛßWü9Üû'¢zcpßx·'âÐg`&tïíÆ¾:à˜Hð‰°."Ò™RÐÿèóðÀ§Ã5iúf v=8®ùÃ'œþN†(ÿ7þùTœû6?6}âôPPŽOΉË}lhF´S°îÀªõåˆ8C›¯PÄ‚ú&;€ö£¨ªN‚¶ëÒž†á¶ÇðíòÑgI9_7y# ˜¨^‡oX…˜Êwæ1ÈóÚ/Ôòtö@×R¨=¼O’SRNÂß܃1ÆŽç¯$e(PªPÄ »×çr:ºvšqÙ:,ßÚ„”Ó‡#KUP«ª€­6¯6ëuPá@óÛŠÂãŽFÚ³K±dõp¬ß˜„IsGbhÊôyà,]ï6qä5£áÕu÷¸kžzÎç¤ÂÕÞ„&»÷kv˜-èL±0µ6H¸ìð<éL`·;µùûÑ“õÔþIm‚ÁiFƒÙ ÏnØK“.}4¢ÝkŸ8`s¸o œ'\ªºty·È5MÑèW›/j„Y#‡£WùZ,ù­Ág¸mß/Ø\Û§_2}ãôÍ‹­qÖm­Ñ¸w°bÛëÅ?‰ÂÑ矆: :úÅ–á—µ…hßæ°cçò°?¦?FäÇÔÜɘ:°?}òo| S'õ†’4Ó'8ñÓGÿÁÒ=½0ñ¸A‘¢ˆY£F¢WůøÍÚcÆŒéðè—¢ ¦ïô‹)ÁúõEnU=¶®ÞŒºÎÎZ*ðõ#áóš˜uá1H:dÒ›¶cõoÕnX·ä74d ÖÿŽ8ãb·âë·>ÅÃ$Lcÿ©8¾×6|õÎül‰iÒ;Û²HëÏIÌ¡ƒ\» «¶Ö{¾Ô¸ «~­FâÀ¡Èrïó*ÃÚÝn×XwãçÕHäדõ°þ)qÀ0äè‹°n]±×A 6¬=5{ºo5Yö`íF÷¹ ü¶n/=Ü3®‡ ¿À86âÉY§àÆ—¾Â¦â4Y-h¬Üo» O¬v`ЉS¯’¦]‹+Ç•âõknÁ»[j`w9ao,ƺþecÖ ôÝ…Åï/G™Ý‡yæýõ.|ZjhÞjŠKñ¬ÿe=~þi%¾úà9Ü8c8Æ]÷=bÎz/ÿ¥?TJŸ30gfÖ>qžX^ ‹Ã‚Òeãú'×"ù”9˜Õ§e2Äñ“³°gÑÇØ>Ççëd⨩ý°û“O°1n˜uÙ‰h+Ù  è÷㣹Ï`e¹ {V>y3žßŽÓ.u‹ë)“þI?|6.?Nå_‹§–¢Îj…¥þV<} æ~ãÄÑ—ÌÆ(÷SÒVüðØ=xw{μwîùoŽºØ+®§ û,2ûVyý¢q’›h½ªŠªª¢(ªèLrÔÕïËK{¨£ès¹mr¦D)ªèFÑ):‰Î½ å4@³lx~¦äE)¢MbÔGK¿3þ&\Ð_Òþð²ì‘昕· ‘¸±‹ÇÉ%ïÈiÉérö¥~Ïf°®»WFTÑét¢ÓéDoŒ–¸Ô<1íRyláv©wyMP³J=9WLŠ"z½^Å$¹'?*«¼N,ûd¶d*zéõ×m§ÛZ×ß/GDé$yú¿d[ÞªyJfÜ ò²û=®yvr’ ¼î[©´œ<'"Ò¸ìé¯ú?ýõéceÀußu˜‡«b¹<|J¾ÄªŠè¢¢ÅdЉΘ$ýf¾ ¿µ,cWù·rçÄTÑCƒÑ(ѹ'É}žÂiÊ”Tµu™ëÅ#‰™e™·Ëë«JÄû¬QëîäŠÑÉ¢WTÑëUQtÉrÄœeG M6<4V¢‘ Sÿ±SZoégI/Å(ƒnZ* m±Ùôèx‰íƒ,s?µ¦æs¹¤w‚L{q·xì­ÂYöá艟“ˆHÓ¶·ä’QÉ¢‡"ª^/ª¢ˆ>y”üùµMng%9ä׿!¦A—ÈC7M’T½A zUcoùã?I]€üáˆè²?Lú'gùy๭(¢èô¢SQ£seÚ½_I‰Û hͧ)Ÿ$÷>>[ÄèÅ`Љ¢ÄÉð¿|({»xªx$ÖqwÞg‘)åR\t ­àŒuD‡"¤(íÛ¸¬¨=X„âÊF & ½³3åk‡ÈsÅ~ì+³ :µ7²ÒãatÛàt6•cÿþ*HJ.úôŠâ°ÁŽ–ÝYâ´Ã.º¶ÿ·<Ù<¬7Âïí…\XíˆPTèôzèuj½[Ì…ØwÐSFä¥EwÜÅs9`µ;¡ê0´@‹v›¢7Âè>(írÀêè x>mƒS1´OßÂ×rö¹ìÀe‡Õæ‚jŒò¹ üÍ£¥Á°×–`_QlQÉÈÊÎD²Ék»Wì¨=°%¶DäôÉ„õó?aä…%¸oËw¸*ÏGJpÚa±·œº ¨ÍïÛ×½–<ØQW¼j¤ÞùèècÌÅe‡Õî‚jp{¯mŸC îMwÚas©0tnó8ív¸tþ×—°–}8zâçÔÆ‰Æ²ýØ_ÖÄe /·btž¯o|pŽúÏT|·ñŒ·ÀÞR3â³ó‘¹±1M–}OïŸÚƒa«)¾âjØ©ÈÎËB¢Ñs]¨üt6†^ZƒG6ËRÊQx JZôI5uy´."븛ß6nhû»wvNò«QHÌê‡Ä¬ ˆNë´Üèbz¡ïà^íOèpßãSttØTt0ƒ ¨zDE…ûöTD§õõÛV¿y Q>Ú£êåc÷UÕ»~ðK5 *À¥Ôç¡ÀØ{ûO ˜;¸íà¹] ¡Å:LºpO)2 ¡÷@ ШDyØò÷ùê è¸j(ÐŒ!ñETOüœÚè›ÞCBç2&å`PR饞Þ?µØ”ƒI9A#UE.6ùƒ{ÜÀ¤_=øü":ä¿·ûS÷éüEœfÃ4àj¬@I­ñiHèÉ;©'/ûpDús²×–¢ÜÔôDDiTg~/Ë^+Άr”Ö¹4ùîõÜ!2úŸ¢Æ¦!;6xZ‘þœ ‰™è݃Oƒý_ ‹ë‘— "#""M°À‘&X`ˆˆH,0DD¤ ""Ò i‚†ˆˆ4ÁCDDš`!""M°À‘&BºUŒˆ@Ñòw |ވ˾{pÙ:\ö‡ŽÖ÷{ ù^d¼ñÜ¡ÃeèpÙ:\ö‡?‘‘&X`ˆˆH,0DD¤ ""Ò i‚†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆH,0DD¤ ""Ò i‚†ˆˆ4ÁCDDš`!""M°À‘&X`ˆˆH,0DD¤ ""Ò iB‘CÝ""ú½êr¹u3ˆˆèwÆ ìOøIDATårAu¹œ‡ºDDô;ãt9¡ ÷`ˆˆ(ÂZö`X`ˆˆ(²\.T‡“CdDDY.'÷`ˆˆH"#""Mð ?i‚{0DDq— ªÓé8Ôm!"¢ß ³ÙŒ-[·¢®®ªÍÁ=""ŠŒèèhŒ>z£ z§ËUUÚ^ümã†CØ4"":œ566"666§ êŽë¡nÆ´566bGê‚*X8JFDDà^TZ‡Çt¦X,,¨‚.yüÉì´G!%& ‰.tJð¤DDDƒ)ÉÉ0˜bà`Uw·×¢ð@)þعùëš ]™IEND®B`‚src/000077500000000000000000000000001225012771600334035ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/docdeclarative-radio.qdoc000066400000000000000000000027771225012771600376470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example declarative-radio \title Declarative Radio Example \brief Demonstrates the radio functionality \ingroup multimedia_examples This examples uses the Qt Multimedia Radio QML type to list the available channels on the FM frequency. */ main.cpp000066400000000000000000000044101225012771600334760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int argc, char ** argv) { QGuiApplication app(argc, argv); QQuickView view; view.setSource(QUrl("qrc:view.qml")); view.show(); return app.exec(); } view.qml000066400000000000000000000131261225012771600335370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/declarative-radio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { width: 400; height: 300; Radio { id: radio band: Radio.FM } Column { anchors.fill: parent anchors.margins: 5 spacing: 5 Row { Text { id: freq width: 150 height: 200 verticalAlignment: Text.AlignVCenter text: "" + radio.frequency / 1000 + " kHz" } Text { id: sig width: 200 height: 200 verticalAlignment: Text.AlignVCenter text: (radio.availability == Radio.Available ? "No Signal " : "No Radio Found") } } Row { spacing: 5 Rectangle { width: 350 height: 10 color: "black" Rectangle { width: 5 height: 10 color: "red" y: 0 x: (parent.width - 5) * ((radio.frequency - radio.minimumFrequency) / (radio.maximumFrequency - radio.minimumFrequency)) } } } Row { spacing: 5 Rectangle { id: scanDownButton border.color: "black" border.width: 1 radius: 2 width: 90 height: 40 Text { anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "Scan Down" } MouseArea { anchors.fill: parent onClicked: radio.scanDown(); } } Rectangle { id: freqDownButton border.color: "black" border.width: 1 radius: 2 width: 90 height: 40 Text { anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "Freq Down" } MouseArea { anchors.fill: parent onClicked: radio.tuneDown(); } } Rectangle { id: freqUpButton border.color: "black" border.width: 1 radius: 2 width: 90 height: 40 Text { anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "Freq Up" } MouseArea { anchors.fill: parent onClicked: radio.tuneUp(); } } Rectangle { id: scanUpButton border.color: "black" border.width: 1 radius: 2 width: 90 height: 40 Text { anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "Scan Up" } MouseArea { anchors.fill: parent onClicked: radio.scanUp(); } } } } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/multimedia.pro000066400000000000000000000006661225012771600314330ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += audiodecoder # These examples all need widgets for now (using creator templates that use widgets) qtHaveModule(widgets) { SUBDIRS += \ radio \ spectrum \ audiorecorder \ audiodevices \ audioinput \ audiooutput \ } qtHaveModule(gui):qtHaveModule(qml) { SUBDIRS += \ declarative-radio \ video } config_openal: SUBDIRS += audioengine qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/radio/000077500000000000000000000000001225012771600276455ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/radio/main.cpp000066400000000000000000000041711225012771600313000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "radio.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); Radio radio; radio.show(); return app.exec(); }; qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/radio/radio.cpp000066400000000000000000000116001225012771600314450ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "radio.h" Radio::Radio() { radio = new QRadioTuner; connect(radio, SIGNAL(error(QRadioTuner::Error)), this, SLOT(error(QRadioTuner::Error))); if (radio->isBandSupported(QRadioTuner::FM)) radio->setBand(QRadioTuner::FM); QWidget *window = new QWidget; QVBoxLayout *layout = new QVBoxLayout; QHBoxLayout *buttonBar = new QHBoxLayout; QHBoxLayout *topBar = new QHBoxLayout; layout->addLayout(topBar); freq = new QLabel; freq->setText(QString("%1 kHz").arg(radio->frequency()/1000)); topBar->addWidget(freq); connect(radio, SIGNAL(frequencyChanged(int)), SLOT(freqChanged(int))); signal = new QLabel; if (radio->isAvailable()) signal->setText(tr("No Signal")); else signal->setText(tr("No radio found")); topBar->addWidget(signal); connect(radio, SIGNAL(signalStrengthChanged(int)), SLOT(signalChanged(int))); volumeSlider = new QSlider(Qt::Vertical,this); volumeSlider->setRange(0, 100); volumeSlider->setValue(50); connect(volumeSlider, SIGNAL(valueChanged(int)), SLOT(updateVolume(int))); topBar->addWidget(volumeSlider); layout->addLayout(buttonBar); searchLeft = new QPushButton; searchLeft->setText(tr("scan Down")); connect(searchLeft, SIGNAL(clicked()), SLOT(searchDown())); buttonBar->addWidget(searchLeft); left = new QPushButton; left->setText(tr("Freq Down")); connect(left, SIGNAL(clicked()), SLOT(freqDown())); buttonBar->addWidget(left); right = new QPushButton; connect(right, SIGNAL(clicked()), SLOT(freqUp())); right->setText(tr("Freq Up")); buttonBar->addWidget(right); searchRight = new QPushButton; searchRight->setText(tr("scan Up")); connect(searchRight, SIGNAL(clicked()), SLOT(searchUp())); buttonBar->addWidget(searchRight); window->setLayout(layout); setCentralWidget(window); window->show(); radio->start(); } Radio::~Radio() { } void Radio::freqUp() { int f = radio->frequency(); f += radio->frequencyStep(QRadioTuner::FM); radio->setFrequency(f); } void Radio::freqDown() { int f = radio->frequency(); f -= radio->frequencyStep(QRadioTuner::FM); radio->setFrequency(f); } void Radio::searchUp() { radio->searchForward(); } void Radio::searchDown() { radio->searchBackward(); } void Radio::freqChanged(int) { freq->setText(QString("%1 kHz").arg(radio->frequency()/1000)); } void Radio::signalChanged(int) { if(radio->signalStrength() > 25) signal->setText(tr("Got Signal")); else signal->setText(tr("No Signal")); } void Radio::updateVolume(int v) { radio->setVolume(v); } void Radio::error(QRadioTuner::Error error) { const QMetaObject *metaObj = radio->metaObject(); QMetaEnum errorEnum = metaObj->enumerator(metaObj->indexOfEnumerator("Error")); qWarning().nospace() << "Warning: Example application received error QRadioTuner::" << errorEnum.valueToKey(error); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/radio/radio.h000066400000000000000000000050661225012771600311230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef RADIO_H #define RADIO_H #include #include class Radio : public QMainWindow { Q_OBJECT public: Radio(); ~Radio(); public slots: void freqUp(); void freqDown(); void searchUp(); void searchDown(); void freqChanged(int f); void signalChanged(int s); void updateVolume(int v); void error(QRadioTuner::Error error); private: QLabel *freq; QLabel *signal; QPushButton *left; QPushButton *right; QPushButton *searchLeft; QPushButton *searchRight; QSlider *volumeSlider; QRadioTuner *radio; }; #endif // RADIO_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/radio/radio.pro000066400000000000000000000003131225012771600314620ustar00rootroot00000000000000TEMPLATE = app TARGET = radio QT += multimedia HEADERS = \ radio.h SOURCES = \ main.cpp \ radio.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/radio INSTALLS += target QT+=widgets qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/000077500000000000000000000000001225012771600304115ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/000077500000000000000000000000001225012771600321615ustar00rootroot00000000000000fftreal/000077500000000000000000000000001225012771600335255ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdpartyArray.h000066400000000000000000000041461225012771600347610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** Array.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (Array_HEADER_INCLUDED) #define Array_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template class Array { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef T DataType; Array (); inline const DataType & operator [] (long pos) const; inline DataType & operator [] (long pos); static inline long size (); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: DataType _data_arr [LEN]; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: Array (const Array &other); Array & operator = (const Array &other); bool operator == (const Array &other); bool operator != (const Array &other); }; // class Array #include "Array.hpp" #endif // Array_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ Array.hpp000066400000000000000000000042031225012771600353130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** Array.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (Array_CURRENT_CODEHEADER) #error Recursive inclusion of Array code header. #endif #define Array_CURRENT_CODEHEADER #if ! defined (Array_CODEHEADER_INCLUDED) #define Array_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template Array ::Array () { // Nothing } template const typename Array ::DataType & Array ::operator [] (long pos) const { assert (pos >= 0); assert (pos < LEN); return (_data_arr [pos]); } template typename Array ::DataType & Array ::operator [] (long pos) { assert (pos >= 0); assert (pos < LEN); return (_data_arr [pos]); } template long Array ::size () { return (LEN); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // Array_CODEHEADER_INCLUDED #undef Array_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ DynArray.h000066400000000000000000000043411225012771600354310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** DynArray.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (DynArray_HEADER_INCLUDED) #define DynArray_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template class DynArray { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef T DataType; DynArray (); explicit DynArray (long size); ~DynArray (); inline long size () const; inline void resize (long size); inline const DataType & operator [] (long pos) const; inline DataType & operator [] (long pos); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: DataType * _data_ptr; long _len; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: DynArray (const DynArray &other); DynArray & operator = (const DynArray &other); bool operator == (const DynArray &other); bool operator != (const DynArray &other); }; // class DynArray #include "DynArray.hpp" #endif // DynArray_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ DynArray.hpp000066400000000000000000000052631225012771600357750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** DynArray.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (DynArray_CURRENT_CODEHEADER) #error Recursive inclusion of DynArray code header. #endif #define DynArray_CURRENT_CODEHEADER #if ! defined (DynArray_CODEHEADER_INCLUDED) #define DynArray_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template DynArray ::DynArray () : _data_ptr (0) , _len (0) { // Nothing } template DynArray ::DynArray (long size) : _data_ptr (0) , _len (0) { assert (size >= 0); if (size > 0) { _data_ptr = new DataType [size]; _len = size; } } template DynArray ::~DynArray () { delete [] _data_ptr; _data_ptr = 0; _len = 0; } template long DynArray ::size () const { return (_len); } template void DynArray ::resize (long size) { assert (size >= 0); if (size > 0) { DataType * old_data_ptr = _data_ptr; DataType * tmp_data_ptr = new DataType [size]; _data_ptr = tmp_data_ptr; _len = size; delete [] old_data_ptr; } } template const typename DynArray ::DataType & DynArray ::operator [] (long pos) const { assert (pos >= 0); assert (pos < _len); return (_data_ptr [pos]); } template typename DynArray ::DataType & DynArray ::operator [] (long pos) { assert (pos >= 0); assert (pos < _len); return (_data_ptr [pos]); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // DynArray_CODEHEADER_INCLUDED #undef DynArray_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTReal.dsp000066400000000000000000000143551225012771600354700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal# Microsoft Developer Studio Project File - Name="FFTReal" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=FFTReal - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "FFTReal.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "FFTReal.mak" CFG="FFTReal - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "FFTReal - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "FFTReal - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "FFTReal - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /GR /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "FFTReal - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /G6 /MTd /W3 /Gm /GR /GX /Zi /Od /Gf /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "FFTReal - Win32 Release" # Name "FFTReal - Win32 Debug" # Begin Group "Library" # PROP Default_Filter "" # Begin Source File SOURCE=.\Array.h # End Source File # Begin Source File SOURCE=.\Array.hpp # End Source File # Begin Source File SOURCE=.\def.h # End Source File # Begin Source File SOURCE=.\DynArray.h # End Source File # Begin Source File SOURCE=.\DynArray.hpp # End Source File # Begin Source File SOURCE=.\FFTReal.h # End Source File # Begin Source File SOURCE=.\FFTReal.hpp # End Source File # Begin Source File SOURCE=.\FFTRealFixLen.h # End Source File # Begin Source File SOURCE=.\FFTRealFixLen.hpp # End Source File # Begin Source File SOURCE=.\FFTRealFixLenParam.h # End Source File # Begin Source File SOURCE=.\FFTRealPassDirect.h # End Source File # Begin Source File SOURCE=.\FFTRealPassDirect.hpp # End Source File # Begin Source File SOURCE=.\FFTRealPassInverse.h # End Source File # Begin Source File SOURCE=.\FFTRealPassInverse.hpp # End Source File # Begin Source File SOURCE=.\FFTRealSelect.h # End Source File # Begin Source File SOURCE=.\FFTRealSelect.hpp # End Source File # Begin Source File SOURCE=.\FFTRealUseTrigo.h # End Source File # Begin Source File SOURCE=.\FFTRealUseTrigo.hpp # End Source File # Begin Source File SOURCE=.\OscSinCos.h # End Source File # Begin Source File SOURCE=.\OscSinCos.hpp # End Source File # End Group # Begin Group "Test" # PROP Default_Filter "" # Begin Group "stopwatch" # PROP Default_Filter "" # Begin Source File SOURCE=.\stopwatch\ClockCycleCounter.cpp # End Source File # Begin Source File SOURCE=.\stopwatch\ClockCycleCounter.h # End Source File # Begin Source File SOURCE=.\stopwatch\ClockCycleCounter.hpp # End Source File # Begin Source File SOURCE=.\stopwatch\def.h # End Source File # Begin Source File SOURCE=.\stopwatch\fnc.h # End Source File # Begin Source File SOURCE=.\stopwatch\fnc.hpp # End Source File # Begin Source File SOURCE=.\stopwatch\Int64.h # End Source File # Begin Source File SOURCE=.\stopwatch\StopWatch.cpp # End Source File # Begin Source File SOURCE=.\stopwatch\StopWatch.h # End Source File # Begin Source File SOURCE=.\stopwatch\StopWatch.hpp # End Source File # End Group # Begin Source File SOURCE=.\test.cpp # End Source File # Begin Source File SOURCE=.\test_fnc.h # End Source File # Begin Source File SOURCE=.\test_fnc.hpp # End Source File # Begin Source File SOURCE=.\test_settings.h # End Source File # Begin Source File SOURCE=.\TestAccuracy.h # End Source File # Begin Source File SOURCE=.\TestAccuracy.hpp # End Source File # Begin Source File SOURCE=.\TestHelperFixLen.h # End Source File # Begin Source File SOURCE=.\TestHelperFixLen.hpp # End Source File # Begin Source File SOURCE=.\TestHelperNormal.h # End Source File # Begin Source File SOURCE=.\TestHelperNormal.hpp # End Source File # Begin Source File SOURCE=.\TestSpeed.h # End Source File # Begin Source File SOURCE=.\TestSpeed.hpp # End Source File # Begin Source File SOURCE=.\TestWhiteNoiseGen.h # End Source File # Begin Source File SOURCE=.\TestWhiteNoiseGen.hpp # End Source File # End Group # End Target # End Project FFTReal.dsw000066400000000000000000000007741225012771600354770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "FFTReal"=.\FFTReal.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### FFTReal.h000066400000000000000000000100121225012771600351130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTReal.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTReal_HEADER_INCLUDED) #define FFTReal_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "DynArray.h" #include "OscSinCos.h" template class FFTReal { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: enum { MAX_BIT_DEPTH = 30 }; // So length can be represented as long int typedef DT DataType; explicit FFTReal (long length); virtual ~FFTReal () {} long get_length () const; void do_fft (DataType f [], const DataType x []) const; void do_ifft (const DataType f [], DataType x []) const; void rescale (DataType x []) const; DataType * use_buffer () const; /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: // Over this bit depth, we use direct calculation for sin/cos enum { TRIGO_BD_LIMIT = 12 }; typedef OscSinCos OscType; void init_br_lut (); void init_trigo_lut (); void init_trigo_osc (); FORCEINLINE const long * get_br_ptr () const; FORCEINLINE const DataType * get_trigo_ptr (int level) const; FORCEINLINE long get_trigo_level_index (int level) const; inline void compute_fft_general (DataType f [], const DataType x []) const; inline void compute_direct_pass_1_2 (DataType df [], const DataType x []) const; inline void compute_direct_pass_3 (DataType df [], const DataType sf []) const; inline void compute_direct_pass_n (DataType df [], const DataType sf [], int pass) const; inline void compute_direct_pass_n_lut (DataType df [], const DataType sf [], int pass) const; inline void compute_direct_pass_n_osc (DataType df [], const DataType sf [], int pass) const; inline void compute_ifft_general (const DataType f [], DataType x []) const; inline void compute_inverse_pass_n (DataType df [], const DataType sf [], int pass) const; inline void compute_inverse_pass_n_osc (DataType df [], const DataType sf [], int pass) const; inline void compute_inverse_pass_n_lut (DataType df [], const DataType sf [], int pass) const; inline void compute_inverse_pass_3 (DataType df [], const DataType sf []) const; inline void compute_inverse_pass_1_2 (DataType x [], const DataType sf []) const; const long _length; const int _nbr_bits; DynArray _br_lut; DynArray _trigo_lut; mutable DynArray _buffer; mutable DynArray _trigo_osc; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTReal (); FFTReal (const FFTReal &other); FFTReal & operator = (const FFTReal &other); bool operator == (const FFTReal &other); bool operator != (const FFTReal &other); }; // class FFTReal #include "FFTReal.hpp" #endif // FFTReal_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTReal.hpp000066400000000000000000000477421225012771600354770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTReal.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTReal_CURRENT_CODEHEADER) #error Recursive inclusion of FFTReal code header. #endif #define FFTReal_CURRENT_CODEHEADER #if ! defined (FFTReal_CODEHEADER_INCLUDED) #define FFTReal_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include #include static inline bool FFTReal_is_pow2 (long x) { assert (x > 0); return ((x & -x) == x); } static inline int FFTReal_get_next_pow2 (long x) { --x; int p = 0; while ((x & ~0xFFFFL) != 0) { p += 16; x >>= 16; } while ((x & ~0xFL) != 0) { p += 4; x >>= 4; } while (x > 0) { ++p; x >>= 1; } return (p); } /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /* ============================================================================== Name: ctor Input parameters: - length: length of the array on which we want to do a FFT. Range: power of 2 only, > 0. Throws: std::bad_alloc ============================================================================== */ template FFTReal
::FFTReal (long length) : _length (length) , _nbr_bits (FFTReal_get_next_pow2 (length)) , _br_lut () , _trigo_lut () , _buffer (length) , _trigo_osc () { assert (FFTReal_is_pow2 (length)); assert (_nbr_bits <= MAX_BIT_DEPTH); init_br_lut (); init_trigo_lut (); init_trigo_osc (); } /* ============================================================================== Name: get_length Description: Returns the number of points processed by this FFT object. Returns: The number of points, power of 2, > 0. Throws: Nothing ============================================================================== */ template long FFTReal
::get_length () const { return (_length); } /* ============================================================================== Name: do_fft Description: Compute the FFT of the array. Input parameters: - x: pointer on the source array (time). Output parameters: - f: pointer on the destination array (frequencies). f [0...length(x)/2] = real values, f [length(x)/2+1...length(x)-1] = negative imaginary values of coefficents 1...length(x)/2-1. Throws: Nothing ============================================================================== */ template void FFTReal
::do_fft (DataType f [], const DataType x []) const { assert (f != 0); assert (f != use_buffer ()); assert (x != 0); assert (x != use_buffer ()); assert (x != f); // General case if (_nbr_bits > 2) { compute_fft_general (f, x); } // 4-point FFT else if (_nbr_bits == 2) { f [1] = x [0] - x [2]; f [3] = x [1] - x [3]; const DataType b_0 = x [0] + x [2]; const DataType b_2 = x [1] + x [3]; f [0] = b_0 + b_2; f [2] = b_0 - b_2; } // 2-point FFT else if (_nbr_bits == 1) { f [0] = x [0] + x [1]; f [1] = x [0] - x [1]; } // 1-point FFT else { f [0] = x [0]; } } /* ============================================================================== Name: do_ifft Description: Compute the inverse FFT of the array. Note that data must be post-scaled: IFFT (FFT (x)) = x * length (x). Input parameters: - f: pointer on the source array (frequencies). f [0...length(x)/2] = real values f [length(x)/2+1...length(x)-1] = negative imaginary values of coefficents 1...length(x)/2-1. Output parameters: - x: pointer on the destination array (time). Throws: Nothing ============================================================================== */ template void FFTReal
::do_ifft (const DataType f [], DataType x []) const { assert (f != 0); assert (f != use_buffer ()); assert (x != 0); assert (x != use_buffer ()); assert (x != f); // General case if (_nbr_bits > 2) { compute_ifft_general (f, x); } // 4-point IFFT else if (_nbr_bits == 2) { const DataType b_0 = f [0] + f [2]; const DataType b_2 = f [0] - f [2]; x [0] = b_0 + f [1] * 2; x [2] = b_0 - f [1] * 2; x [1] = b_2 + f [3] * 2; x [3] = b_2 - f [3] * 2; } // 2-point IFFT else if (_nbr_bits == 1) { x [0] = f [0] + f [1]; x [1] = f [0] - f [1]; } // 1-point IFFT else { x [0] = f [0]; } } /* ============================================================================== Name: rescale Description: Scale an array by divide each element by its length. This function should be called after FFT + IFFT. Input parameters: - x: pointer on array to rescale (time or frequency). Throws: Nothing ============================================================================== */ template void FFTReal
::rescale (DataType x []) const { const DataType mul = DataType (1.0 / _length); if (_length < 4) { long i = _length - 1; do { x [i] *= mul; --i; } while (i >= 0); } else { assert ((_length & 3) == 0); // Could be optimized with SIMD instruction sets (needs alignment check) long i = _length - 4; do { x [i + 0] *= mul; x [i + 1] *= mul; x [i + 2] *= mul; x [i + 3] *= mul; i -= 4; } while (i >= 0); } } /* ============================================================================== Name: use_buffer Description: Access the internal buffer, whose length is the FFT one. Buffer content will be erased at each do_fft() / do_ifft() call! This buffer cannot be used as: - source for FFT or IFFT done with this object - destination for FFT or IFFT done with this object Returns: Buffer start address Throws: Nothing ============================================================================== */ template typename FFTReal
::DataType * FFTReal
::use_buffer () const { return (&_buffer [0]); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void FFTReal
::init_br_lut () { const long length = 1L << _nbr_bits; _br_lut.resize (length); _br_lut [0] = 0; long br_index = 0; for (long cnt = 1; cnt < length; ++cnt) { // ++br_index (bit reversed) long bit = length >> 1; while (((br_index ^= bit) & bit) == 0) { bit >>= 1; } _br_lut [cnt] = br_index; } } template void FFTReal
::init_trigo_lut () { using namespace std; if (_nbr_bits > 3) { const long total_len = (1L << (_nbr_bits - 1)) - 4; _trigo_lut.resize (total_len); for (int level = 3; level < _nbr_bits; ++level) { const long level_len = 1L << (level - 1); DataType * const level_ptr = &_trigo_lut [get_trigo_level_index (level)]; const double mul = PI / (level_len << 1); for (long i = 0; i < level_len; ++ i) { level_ptr [i] = static_cast (cos (i * mul)); } } } } template void FFTReal
::init_trigo_osc () { const int nbr_osc = _nbr_bits - TRIGO_BD_LIMIT; if (nbr_osc > 0) { _trigo_osc.resize (nbr_osc); for (int osc_cnt = 0; osc_cnt < nbr_osc; ++osc_cnt) { OscType & osc = _trigo_osc [osc_cnt]; const long len = 1L << (TRIGO_BD_LIMIT + osc_cnt); const double mul = (0.5 * PI) / len; osc.set_step (mul); } } } template const long * FFTReal
::get_br_ptr () const { return (&_br_lut [0]); } template const typename FFTReal
::DataType * FFTReal
::get_trigo_ptr (int level) const { assert (level >= 3); return (&_trigo_lut [get_trigo_level_index (level)]); } template long FFTReal
::get_trigo_level_index (int level) const { assert (level >= 3); return ((1L << (level - 1)) - 4); } // Transform in several passes template void FFTReal
::compute_fft_general (DataType f [], const DataType x []) const { assert (f != 0); assert (f != use_buffer ()); assert (x != 0); assert (x != use_buffer ()); assert (x != f); DataType * sf; DataType * df; if ((_nbr_bits & 1) != 0) { df = use_buffer (); sf = f; } else { df = f; sf = use_buffer (); } compute_direct_pass_1_2 (df, x); compute_direct_pass_3 (sf, df); for (int pass = 3; pass < _nbr_bits; ++ pass) { compute_direct_pass_n (df, sf, pass); DataType * const temp_ptr = df; df = sf; sf = temp_ptr; } } template void FFTReal
::compute_direct_pass_1_2 (DataType df [], const DataType x []) const { assert (df != 0); assert (x != 0); assert (df != x); const long * const bit_rev_lut_ptr = get_br_ptr (); long coef_index = 0; do { const long rev_index_0 = bit_rev_lut_ptr [coef_index]; const long rev_index_1 = bit_rev_lut_ptr [coef_index + 1]; const long rev_index_2 = bit_rev_lut_ptr [coef_index + 2]; const long rev_index_3 = bit_rev_lut_ptr [coef_index + 3]; DataType * const df2 = df + coef_index; df2 [1] = x [rev_index_0] - x [rev_index_1]; df2 [3] = x [rev_index_2] - x [rev_index_3]; const DataType sf_0 = x [rev_index_0] + x [rev_index_1]; const DataType sf_2 = x [rev_index_2] + x [rev_index_3]; df2 [0] = sf_0 + sf_2; df2 [2] = sf_0 - sf_2; coef_index += 4; } while (coef_index < _length); } template void FFTReal
::compute_direct_pass_3 (DataType df [], const DataType sf []) const { assert (df != 0); assert (sf != 0); assert (df != sf); const DataType sqrt2_2 = DataType (SQRT2 * 0.5); long coef_index = 0; do { DataType v; df [coef_index] = sf [coef_index] + sf [coef_index + 4]; df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4]; df [coef_index + 2] = sf [coef_index + 2]; df [coef_index + 6] = sf [coef_index + 6]; v = (sf [coef_index + 5] - sf [coef_index + 7]) * sqrt2_2; df [coef_index + 1] = sf [coef_index + 1] + v; df [coef_index + 3] = sf [coef_index + 1] - v; v = (sf [coef_index + 5] + sf [coef_index + 7]) * sqrt2_2; df [coef_index + 5] = v + sf [coef_index + 3]; df [coef_index + 7] = v - sf [coef_index + 3]; coef_index += 8; } while (coef_index < _length); } template void FFTReal
::compute_direct_pass_n (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass >= 3); assert (pass < _nbr_bits); if (pass <= TRIGO_BD_LIMIT) { compute_direct_pass_n_lut (df, sf, pass); } else { compute_direct_pass_n_osc (df, sf, pass); } } template void FFTReal
::compute_direct_pass_n_lut (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass >= 3); assert (pass < _nbr_bits); const long nbr_coef = 1 << pass; const long h_nbr_coef = nbr_coef >> 1; const long d_nbr_coef = nbr_coef << 1; long coef_index = 0; const DataType * const cos_ptr = get_trigo_ptr (pass); do { const DataType * const sf1r = sf + coef_index; const DataType * const sf2r = sf1r + nbr_coef; DataType * const dfr = df + coef_index; DataType * const dfi = dfr + nbr_coef; // Extreme coefficients are always real dfr [0] = sf1r [0] + sf2r [0]; dfi [0] = sf1r [0] - sf2r [0]; // dfr [nbr_coef] = dfr [h_nbr_coef] = sf1r [h_nbr_coef]; dfi [h_nbr_coef] = sf2r [h_nbr_coef]; // Others are conjugate complex numbers const DataType * const sf1i = sf1r + h_nbr_coef; const DataType * const sf2i = sf1i + nbr_coef; for (long i = 1; i < h_nbr_coef; ++ i) { const DataType c = cos_ptr [i]; // cos (i*PI/nbr_coef); const DataType s = cos_ptr [h_nbr_coef - i]; // sin (i*PI/nbr_coef); DataType v; v = sf2r [i] * c - sf2i [i] * s; dfr [i] = sf1r [i] + v; dfi [-i] = sf1r [i] - v; // dfr [nbr_coef - i] = v = sf2r [i] * s + sf2i [i] * c; dfi [i] = v + sf1i [i]; dfi [nbr_coef - i] = v - sf1i [i]; } coef_index += d_nbr_coef; } while (coef_index < _length); } template void FFTReal
::compute_direct_pass_n_osc (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass > TRIGO_BD_LIMIT); assert (pass < _nbr_bits); const long nbr_coef = 1 << pass; const long h_nbr_coef = nbr_coef >> 1; const long d_nbr_coef = nbr_coef << 1; long coef_index = 0; OscType & osc = _trigo_osc [pass - (TRIGO_BD_LIMIT + 1)]; do { const DataType * const sf1r = sf + coef_index; const DataType * const sf2r = sf1r + nbr_coef; DataType * const dfr = df + coef_index; DataType * const dfi = dfr + nbr_coef; osc.clear_buffers (); // Extreme coefficients are always real dfr [0] = sf1r [0] + sf2r [0]; dfi [0] = sf1r [0] - sf2r [0]; // dfr [nbr_coef] = dfr [h_nbr_coef] = sf1r [h_nbr_coef]; dfi [h_nbr_coef] = sf2r [h_nbr_coef]; // Others are conjugate complex numbers const DataType * const sf1i = sf1r + h_nbr_coef; const DataType * const sf2i = sf1i + nbr_coef; for (long i = 1; i < h_nbr_coef; ++ i) { osc.step (); const DataType c = osc.get_cos (); const DataType s = osc.get_sin (); DataType v; v = sf2r [i] * c - sf2i [i] * s; dfr [i] = sf1r [i] + v; dfi [-i] = sf1r [i] - v; // dfr [nbr_coef - i] = v = sf2r [i] * s + sf2i [i] * c; dfi [i] = v + sf1i [i]; dfi [nbr_coef - i] = v - sf1i [i]; } coef_index += d_nbr_coef; } while (coef_index < _length); } // Transform in several pass template void FFTReal
::compute_ifft_general (const DataType f [], DataType x []) const { assert (f != 0); assert (f != use_buffer ()); assert (x != 0); assert (x != use_buffer ()); assert (x != f); DataType * sf = const_cast (f); DataType * df; DataType * df_temp; if (_nbr_bits & 1) { df = use_buffer (); df_temp = x; } else { df = x; df_temp = use_buffer (); } for (int pass = _nbr_bits - 1; pass >= 3; -- pass) { compute_inverse_pass_n (df, sf, pass); if (pass < _nbr_bits - 1) { DataType * const temp_ptr = df; df = sf; sf = temp_ptr; } else { sf = df; df = df_temp; } } compute_inverse_pass_3 (df, sf); compute_inverse_pass_1_2 (x, df); } template void FFTReal
::compute_inverse_pass_n (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass >= 3); assert (pass < _nbr_bits); if (pass <= TRIGO_BD_LIMIT) { compute_inverse_pass_n_lut (df, sf, pass); } else { compute_inverse_pass_n_osc (df, sf, pass); } } template void FFTReal
::compute_inverse_pass_n_lut (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass >= 3); assert (pass < _nbr_bits); const long nbr_coef = 1 << pass; const long h_nbr_coef = nbr_coef >> 1; const long d_nbr_coef = nbr_coef << 1; long coef_index = 0; const DataType * const cos_ptr = get_trigo_ptr (pass); do { const DataType * const sfr = sf + coef_index; const DataType * const sfi = sfr + nbr_coef; DataType * const df1r = df + coef_index; DataType * const df2r = df1r + nbr_coef; // Extreme coefficients are always real df1r [0] = sfr [0] + sfi [0]; // + sfr [nbr_coef] df2r [0] = sfr [0] - sfi [0]; // - sfr [nbr_coef] df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2; df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2; // Others are conjugate complex numbers DataType * const df1i = df1r + h_nbr_coef; DataType * const df2i = df1i + nbr_coef; for (long i = 1; i < h_nbr_coef; ++ i) { df1r [i] = sfr [i] + sfi [-i]; // + sfr [nbr_coef - i] df1i [i] = sfi [i] - sfi [nbr_coef - i]; const DataType c = cos_ptr [i]; // cos (i*PI/nbr_coef); const DataType s = cos_ptr [h_nbr_coef - i]; // sin (i*PI/nbr_coef); const DataType vr = sfr [i] - sfi [-i]; // - sfr [nbr_coef - i] const DataType vi = sfi [i] + sfi [nbr_coef - i]; df2r [i] = vr * c + vi * s; df2i [i] = vi * c - vr * s; } coef_index += d_nbr_coef; } while (coef_index < _length); } template void FFTReal
::compute_inverse_pass_n_osc (DataType df [], const DataType sf [], int pass) const { assert (df != 0); assert (sf != 0); assert (df != sf); assert (pass > TRIGO_BD_LIMIT); assert (pass < _nbr_bits); const long nbr_coef = 1 << pass; const long h_nbr_coef = nbr_coef >> 1; const long d_nbr_coef = nbr_coef << 1; long coef_index = 0; OscType & osc = _trigo_osc [pass - (TRIGO_BD_LIMIT + 1)]; do { const DataType * const sfr = sf + coef_index; const DataType * const sfi = sfr + nbr_coef; DataType * const df1r = df + coef_index; DataType * const df2r = df1r + nbr_coef; osc.clear_buffers (); // Extreme coefficients are always real df1r [0] = sfr [0] + sfi [0]; // + sfr [nbr_coef] df2r [0] = sfr [0] - sfi [0]; // - sfr [nbr_coef] df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2; df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2; // Others are conjugate complex numbers DataType * const df1i = df1r + h_nbr_coef; DataType * const df2i = df1i + nbr_coef; for (long i = 1; i < h_nbr_coef; ++ i) { df1r [i] = sfr [i] + sfi [-i]; // + sfr [nbr_coef - i] df1i [i] = sfi [i] - sfi [nbr_coef - i]; osc.step (); const DataType c = osc.get_cos (); const DataType s = osc.get_sin (); const DataType vr = sfr [i] - sfi [-i]; // - sfr [nbr_coef - i] const DataType vi = sfi [i] + sfi [nbr_coef - i]; df2r [i] = vr * c + vi * s; df2i [i] = vi * c - vr * s; } coef_index += d_nbr_coef; } while (coef_index < _length); } template void FFTReal
::compute_inverse_pass_3 (DataType df [], const DataType sf []) const { assert (df != 0); assert (sf != 0); assert (df != sf); const DataType sqrt2_2 = DataType (SQRT2 * 0.5); long coef_index = 0; do { df [coef_index] = sf [coef_index] + sf [coef_index + 4]; df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4]; df [coef_index + 2] = sf [coef_index + 2] * 2; df [coef_index + 6] = sf [coef_index + 6] * 2; df [coef_index + 1] = sf [coef_index + 1] + sf [coef_index + 3]; df [coef_index + 3] = sf [coef_index + 5] - sf [coef_index + 7]; const DataType vr = sf [coef_index + 1] - sf [coef_index + 3]; const DataType vi = sf [coef_index + 5] + sf [coef_index + 7]; df [coef_index + 5] = (vr + vi) * sqrt2_2; df [coef_index + 7] = (vi - vr) * sqrt2_2; coef_index += 8; } while (coef_index < _length); } template void FFTReal
::compute_inverse_pass_1_2 (DataType x [], const DataType sf []) const { assert (x != 0); assert (sf != 0); assert (x != sf); const long * bit_rev_lut_ptr = get_br_ptr (); const DataType * sf2 = sf; long coef_index = 0; do { { const DataType b_0 = sf2 [0] + sf2 [2]; const DataType b_2 = sf2 [0] - sf2 [2]; const DataType b_1 = sf2 [1] * 2; const DataType b_3 = sf2 [3] * 2; x [bit_rev_lut_ptr [0]] = b_0 + b_1; x [bit_rev_lut_ptr [1]] = b_0 - b_1; x [bit_rev_lut_ptr [2]] = b_2 + b_3; x [bit_rev_lut_ptr [3]] = b_2 - b_3; } { const DataType b_0 = sf2 [4] + sf2 [6]; const DataType b_2 = sf2 [4] - sf2 [6]; const DataType b_1 = sf2 [5] * 2; const DataType b_3 = sf2 [7] * 2; x [bit_rev_lut_ptr [4]] = b_0 + b_1; x [bit_rev_lut_ptr [5]] = b_0 - b_1; x [bit_rev_lut_ptr [6]] = b_2 + b_3; x [bit_rev_lut_ptr [7]] = b_2 - b_3; } sf2 += 8; coef_index += 8; bit_rev_lut_ptr += 8; } while (coef_index < _length); } #endif // FFTReal_CODEHEADER_INCLUDED #undef FFTReal_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealFixLen.h000066400000000000000000000065641225012771600362420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealFixLen.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealFixLen_HEADER_INCLUDED) #define FFTRealFixLen_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "Array.h" #include "DynArray.h" #include "FFTRealFixLenParam.h" #include "OscSinCos.h" template class FFTRealFixLen { typedef int CompileTimeCheck1 [(LL2 >= 0) ? 1 : -1]; typedef int CompileTimeCheck2 [(LL2 <= 30) ? 1 : -1]; /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef FFTRealFixLenParam::DataType DataType; typedef OscSinCos OscType; enum { FFT_LEN_L2 = LL2 }; enum { FFT_LEN = 1 << FFT_LEN_L2 }; FFTRealFixLen (); inline long get_length () const; void do_fft (DataType f [], const DataType x []); void do_ifft (const DataType f [], DataType x []); void rescale (DataType x []) const; /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: enum { TRIGO_BD_LIMIT = FFTRealFixLenParam::TRIGO_BD_LIMIT }; enum { BR_ARR_SIZE_L2 = ((FFT_LEN_L2 - 3) < 0) ? 0 : (FFT_LEN_L2 - 2) }; enum { BR_ARR_SIZE = 1 << BR_ARR_SIZE_L2 }; enum { TRIGO_BD = ((FFT_LEN_L2 - TRIGO_BD_LIMIT) < 0) ? (int)FFT_LEN_L2 : (int)TRIGO_BD_LIMIT }; enum { TRIGO_TABLE_ARR_SIZE_L2 = (LL2 < 4) ? 0 : (TRIGO_BD - 2) }; enum { TRIGO_TABLE_ARR_SIZE = 1 << TRIGO_TABLE_ARR_SIZE_L2 }; enum { NBR_TRIGO_OSC = FFT_LEN_L2 - TRIGO_BD }; enum { TRIGO_OSC_ARR_SIZE = (NBR_TRIGO_OSC > 0) ? NBR_TRIGO_OSC : 1 }; void build_br_lut (); void build_trigo_lut (); void build_trigo_osc (); DynArray _buffer; DynArray _br_data; DynArray _trigo_data; Array _trigo_osc; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTRealFixLen (const FFTRealFixLen &other); FFTRealFixLen& operator = (const FFTRealFixLen &other); bool operator == (const FFTRealFixLen &other); bool operator != (const FFTRealFixLen &other); }; // class FFTRealFixLen #include "FFTRealFixLen.hpp" #endif // FFTRealFixLen_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealFixLen.hpp000066400000000000000000000137321225012771600365750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealFixLen.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTRealFixLen_CURRENT_CODEHEADER) #error Recursive inclusion of FFTRealFixLen code header. #endif #define FFTRealFixLen_CURRENT_CODEHEADER #if ! defined (FFTRealFixLen_CODEHEADER_INCLUDED) #define FFTRealFixLen_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "FFTRealPassDirect.h" #include "FFTRealPassInverse.h" #include "FFTRealSelect.h" #include #include namespace std { } /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template FFTRealFixLen ::FFTRealFixLen () : _buffer (FFT_LEN) , _br_data (BR_ARR_SIZE) , _trigo_data (TRIGO_TABLE_ARR_SIZE) , _trigo_osc () { build_br_lut (); build_trigo_lut (); build_trigo_osc (); } template long FFTRealFixLen ::get_length () const { return (FFT_LEN); } // General case template void FFTRealFixLen ::do_fft (DataType f [], const DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); assert (FFT_LEN_L2 >= 3); // Do the transform in several passes const DataType * cos_ptr = &_trigo_data [0]; const long * br_ptr = &_br_data [0]; FFTRealPassDirect ::process ( FFT_LEN, f, &_buffer [0], x, cos_ptr, TRIGO_TABLE_ARR_SIZE, br_ptr, &_trigo_osc [0] ); } // 4-point FFT template <> void FFTRealFixLen <2>::do_fft (DataType f [], const DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); f [1] = x [0] - x [2]; f [3] = x [1] - x [3]; const DataType b_0 = x [0] + x [2]; const DataType b_2 = x [1] + x [3]; f [0] = b_0 + b_2; f [2] = b_0 - b_2; } // 2-point FFT template <> void FFTRealFixLen <1>::do_fft (DataType f [], const DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); f [0] = x [0] + x [1]; f [1] = x [0] - x [1]; } // 1-point FFT template <> void FFTRealFixLen <0>::do_fft (DataType f [], const DataType x []) { assert (f != 0); assert (x != 0); f [0] = x [0]; } // General case template void FFTRealFixLen ::do_ifft (const DataType f [], DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); assert (FFT_LEN_L2 >= 3); // Do the transform in several passes DataType * s_ptr = FFTRealSelect ::sel_bin (&_buffer [0], x); DataType * d_ptr = FFTRealSelect ::sel_bin (x, &_buffer [0]); const DataType * cos_ptr = &_trigo_data [0]; const long * br_ptr = &_br_data [0]; FFTRealPassInverse ::process ( FFT_LEN, d_ptr, s_ptr, f, cos_ptr, TRIGO_TABLE_ARR_SIZE, br_ptr, &_trigo_osc [0] ); } // 4-point IFFT template <> void FFTRealFixLen <2>::do_ifft (const DataType f [], DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); const DataType b_0 = f [0] + f [2]; const DataType b_2 = f [0] - f [2]; x [0] = b_0 + f [1] * 2; x [2] = b_0 - f [1] * 2; x [1] = b_2 + f [3] * 2; x [3] = b_2 - f [3] * 2; } // 2-point IFFT template <> void FFTRealFixLen <1>::do_ifft (const DataType f [], DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); x [0] = f [0] + f [1]; x [1] = f [0] - f [1]; } // 1-point IFFT template <> void FFTRealFixLen <0>::do_ifft (const DataType f [], DataType x []) { assert (f != 0); assert (x != 0); assert (x != f); x [0] = f [0]; } template void FFTRealFixLen ::rescale (DataType x []) const { assert (x != 0); const DataType mul = DataType (1.0 / FFT_LEN); if (FFT_LEN < 4) { long i = FFT_LEN - 1; do { x [i] *= mul; --i; } while (i >= 0); } else { assert ((FFT_LEN & 3) == 0); // Could be optimized with SIMD instruction sets (needs alignment check) long i = FFT_LEN - 4; do { x [i + 0] *= mul; x [i + 1] *= mul; x [i + 2] *= mul; x [i + 3] *= mul; i -= 4; } while (i >= 0); } } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void FFTRealFixLen ::build_br_lut () { _br_data [0] = 0; for (long cnt = 1; cnt < BR_ARR_SIZE; ++cnt) { long index = cnt << 2; long br_index = 0; int bit_cnt = FFT_LEN_L2; do { br_index <<= 1; br_index += (index & 1); index >>= 1; -- bit_cnt; } while (bit_cnt > 0); _br_data [cnt] = br_index; } } template void FFTRealFixLen ::build_trigo_lut () { const double mul = (0.5 * PI) / TRIGO_TABLE_ARR_SIZE; for (long i = 0; i < TRIGO_TABLE_ARR_SIZE; ++ i) { using namespace std; _trigo_data [i] = DataType (cos (i * mul)); } } template void FFTRealFixLen ::build_trigo_osc () { for (int i = 0; i < NBR_TRIGO_OSC; ++i) { OscType & osc = _trigo_osc [i]; const long len = static_cast (TRIGO_TABLE_ARR_SIZE) << (i + 1); const double mul = (0.5 * PI) / len; osc.set_step (mul); } } #endif // FFTRealFixLen_CODEHEADER_INCLUDED #undef FFTRealFixLen_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealFixLenParam.h000066400000000000000000000045111225012771600372110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealFixLenParam.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealFixLenParam_HEADER_INCLUDED) #define FFTRealFixLenParam_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ class FFTRealFixLenParam { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: // Over this bit depth, we use direct calculation for sin/cos enum { TRIGO_BD_LIMIT = 12 }; typedef float DataType; /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: #if 0 // To avoid GCC warning: // All member functions in class 'FFTRealFixLenParam' are private FFTRealFixLenParam (); ~FFTRealFixLenParam (); FFTRealFixLenParam (const FFTRealFixLenParam &other); FFTRealFixLenParam & operator = (const FFTRealFixLenParam &other); bool operator == (const FFTRealFixLenParam &other); bool operator != (const FFTRealFixLenParam &other); #endif }; // class FFTRealFixLenParam //#include "FFTRealFixLenParam.hpp" #endif // FFTRealFixLenParam_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealPassDirect.h000066400000000000000000000047151225012771600371120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealPassDirect.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealPassDirect_HEADER_INCLUDED) #define FFTRealPassDirect_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "FFTRealFixLenParam.h" #include "OscSinCos.h" template class FFTRealPassDirect { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef FFTRealFixLenParam::DataType DataType; typedef OscSinCos OscType; FORCEINLINE static void process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTRealPassDirect (); ~FFTRealPassDirect (); FFTRealPassDirect (const FFTRealPassDirect &other); FFTRealPassDirect & operator = (const FFTRealPassDirect &other); bool operator == (const FFTRealPassDirect &other); bool operator != (const FFTRealPassDirect &other); }; // class FFTRealPassDirect #include "FFTRealPassDirect.hpp" #endif // FFTRealPassDirect_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealPassDirect.hpp000066400000000000000000000132031225012771600374420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealPassDirect.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTRealPassDirect_CURRENT_CODEHEADER) #error Recursive inclusion of FFTRealPassDirect code header. #endif #define FFTRealPassDirect_CURRENT_CODEHEADER #if ! defined (FFTRealPassDirect_CODEHEADER_INCLUDED) #define FFTRealPassDirect_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "FFTRealUseTrigo.h" /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template <> void FFTRealPassDirect <1>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // First and second pass at once const long qlen = len >> 2; long coef_index = 0; do { // To do: unroll the loop (2x). const long ri_0 = br_ptr [coef_index >> 2]; const long ri_1 = ri_0 + 2 * qlen; // bit_rev_lut_ptr [coef_index + 1]; const long ri_2 = ri_0 + 1 * qlen; // bit_rev_lut_ptr [coef_index + 2]; const long ri_3 = ri_0 + 3 * qlen; // bit_rev_lut_ptr [coef_index + 3]; DataType * const df2 = dest_ptr + coef_index; df2 [1] = x_ptr [ri_0] - x_ptr [ri_1]; df2 [3] = x_ptr [ri_2] - x_ptr [ri_3]; const DataType sf_0 = x_ptr [ri_0] + x_ptr [ri_1]; const DataType sf_2 = x_ptr [ri_2] + x_ptr [ri_3]; df2 [0] = sf_0 + sf_2; df2 [2] = sf_0 - sf_2; coef_index += 4; } while (coef_index < len); } template <> void FFTRealPassDirect <2>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // Executes "previous" passes first. Inverts source and destination buffers FFTRealPassDirect <1>::process ( len, src_ptr, dest_ptr, x_ptr, cos_ptr, cos_len, br_ptr, osc_list ); // Third pass const DataType sqrt2_2 = DataType (SQRT2 * 0.5); long coef_index = 0; do { dest_ptr [coef_index ] = src_ptr [coef_index] + src_ptr [coef_index + 4]; dest_ptr [coef_index + 4] = src_ptr [coef_index] - src_ptr [coef_index + 4]; dest_ptr [coef_index + 2] = src_ptr [coef_index + 2]; dest_ptr [coef_index + 6] = src_ptr [coef_index + 6]; DataType v; v = (src_ptr [coef_index + 5] - src_ptr [coef_index + 7]) * sqrt2_2; dest_ptr [coef_index + 1] = src_ptr [coef_index + 1] + v; dest_ptr [coef_index + 3] = src_ptr [coef_index + 1] - v; v = (src_ptr [coef_index + 5] + src_ptr [coef_index + 7]) * sqrt2_2; dest_ptr [coef_index + 5] = v + src_ptr [coef_index + 3]; dest_ptr [coef_index + 7] = v - src_ptr [coef_index + 3]; coef_index += 8; } while (coef_index < len); } template void FFTRealPassDirect ::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // Executes "previous" passes first. Inverts source and destination buffers FFTRealPassDirect ::process ( len, src_ptr, dest_ptr, x_ptr, cos_ptr, cos_len, br_ptr, osc_list ); const long dist = 1L << (PASS - 1); const long c1_r = 0; const long c1_i = dist; const long c2_r = dist * 2; const long c2_i = dist * 3; const long cend = dist * 4; const long table_step = cos_len >> (PASS - 1); enum { TRIGO_OSC = PASS - FFTRealFixLenParam::TRIGO_BD_LIMIT }; enum { TRIGO_DIRECT = (TRIGO_OSC >= 0) ? 1 : 0 }; long coef_index = 0; do { const DataType * const sf = src_ptr + coef_index; DataType * const df = dest_ptr + coef_index; // Extreme coefficients are always real df [c1_r] = sf [c1_r] + sf [c2_r]; df [c2_r] = sf [c1_r] - sf [c2_r]; df [c1_i] = sf [c1_i]; df [c2_i] = sf [c2_i]; FFTRealUseTrigo ::prepare (osc_list [TRIGO_OSC]); // Others are conjugate complex numbers for (long i = 1; i < dist; ++ i) { DataType c; DataType s; FFTRealUseTrigo ::iterate ( osc_list [TRIGO_OSC], c, s, cos_ptr, i * table_step, (dist - i) * table_step ); const DataType sf_r_i = sf [c1_r + i]; const DataType sf_i_i = sf [c1_i + i]; const DataType v1 = sf [c2_r + i] * c - sf [c2_i + i] * s; df [c1_r + i] = sf_r_i + v1; df [c2_r - i] = sf_r_i - v1; const DataType v2 = sf [c2_r + i] * s + sf [c2_i + i] * c; df [c2_r + i] = v2 + sf_i_i; df [cend - i] = v2 - sf_i_i; } coef_index += cend; } while (coef_index < len); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // FFTRealPassDirect_CODEHEADER_INCLUDED #undef FFTRealPassDirect_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealPassInverse.h000066400000000000000000000055241225012771600373120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealPassInverse.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealPassInverse_HEADER_INCLUDED) #define FFTRealPassInverse_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "FFTRealFixLenParam.h" #include "OscSinCos.h" template class FFTRealPassInverse { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef FFTRealFixLenParam::DataType DataType; typedef OscSinCos OscType; FORCEINLINE static void process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType f_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []); FORCEINLINE static void process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []); FORCEINLINE static void process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTRealPassInverse (); ~FFTRealPassInverse (); FFTRealPassInverse (const FFTRealPassInverse &other); FFTRealPassInverse & operator = (const FFTRealPassInverse &other); bool operator == (const FFTRealPassInverse &other); bool operator != (const FFTRealPassInverse &other); }; // class FFTRealPassInverse #include "FFTRealPassInverse.hpp" #endif // FFTRealPassInverse_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealPassInverse.hpp000066400000000000000000000142441225012771600376510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealPassInverse.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTRealPassInverse_CURRENT_CODEHEADER) #error Recursive inclusion of FFTRealPassInverse code header. #endif #define FFTRealPassInverse_CURRENT_CODEHEADER #if ! defined (FFTRealPassInverse_CODEHEADER_INCLUDED) #define FFTRealPassInverse_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "FFTRealUseTrigo.h" /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void FFTRealPassInverse ::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType f_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { process_internal ( len, dest_ptr, f_ptr, cos_ptr, cos_len, br_ptr, osc_list ); FFTRealPassInverse ::process_rec ( len, src_ptr, dest_ptr, cos_ptr, cos_len, br_ptr, osc_list ); } template void FFTRealPassInverse ::process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { process_internal ( len, dest_ptr, src_ptr, cos_ptr, cos_len, br_ptr, osc_list ); FFTRealPassInverse ::process_rec ( len, src_ptr, dest_ptr, cos_ptr, cos_len, br_ptr, osc_list ); } template <> void FFTRealPassInverse <0>::process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // Stops recursion } template void FFTRealPassInverse ::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { const long dist = 1L << (PASS - 1); const long c1_r = 0; const long c1_i = dist; const long c2_r = dist * 2; const long c2_i = dist * 3; const long cend = dist * 4; const long table_step = cos_len >> (PASS - 1); enum { TRIGO_OSC = PASS - FFTRealFixLenParam::TRIGO_BD_LIMIT }; enum { TRIGO_DIRECT = (TRIGO_OSC >= 0) ? 1 : 0 }; long coef_index = 0; do { const DataType * const sf = src_ptr + coef_index; DataType * const df = dest_ptr + coef_index; // Extreme coefficients are always real df [c1_r] = sf [c1_r] + sf [c2_r]; df [c2_r] = sf [c1_r] - sf [c2_r]; df [c1_i] = sf [c1_i] * 2; df [c2_i] = sf [c2_i] * 2; FFTRealUseTrigo ::prepare (osc_list [TRIGO_OSC]); // Others are conjugate complex numbers for (long i = 1; i < dist; ++ i) { df [c1_r + i] = sf [c1_r + i] + sf [c2_r - i]; df [c1_i + i] = sf [c2_r + i] - sf [cend - i]; DataType c; DataType s; FFTRealUseTrigo ::iterate ( osc_list [TRIGO_OSC], c, s, cos_ptr, i * table_step, (dist - i) * table_step ); const DataType vr = sf [c1_r + i] - sf [c2_r - i]; const DataType vi = sf [c2_r + i] + sf [cend - i]; df [c2_r + i] = vr * c + vi * s; df [c2_i + i] = vi * c - vr * s; } coef_index += cend; } while (coef_index < len); } template <> void FFTRealPassInverse <2>::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // Antepenultimate pass const DataType sqrt2_2 = DataType (SQRT2 * 0.5); long coef_index = 0; do { dest_ptr [coef_index ] = src_ptr [coef_index] + src_ptr [coef_index + 4]; dest_ptr [coef_index + 4] = src_ptr [coef_index] - src_ptr [coef_index + 4]; dest_ptr [coef_index + 2] = src_ptr [coef_index + 2] * 2; dest_ptr [coef_index + 6] = src_ptr [coef_index + 6] * 2; dest_ptr [coef_index + 1] = src_ptr [coef_index + 1] + src_ptr [coef_index + 3]; dest_ptr [coef_index + 3] = src_ptr [coef_index + 5] - src_ptr [coef_index + 7]; const DataType vr = src_ptr [coef_index + 1] - src_ptr [coef_index + 3]; const DataType vi = src_ptr [coef_index + 5] + src_ptr [coef_index + 7]; dest_ptr [coef_index + 5] = (vr + vi) * sqrt2_2; dest_ptr [coef_index + 7] = (vi - vr) * sqrt2_2; coef_index += 8; } while (coef_index < len); } template <> void FFTRealPassInverse <1>::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []) { // Penultimate and last pass at once const long qlen = len >> 2; long coef_index = 0; do { const long ri_0 = br_ptr [coef_index >> 2]; const DataType b_0 = src_ptr [coef_index ] + src_ptr [coef_index + 2]; const DataType b_2 = src_ptr [coef_index ] - src_ptr [coef_index + 2]; const DataType b_1 = src_ptr [coef_index + 1] * 2; const DataType b_3 = src_ptr [coef_index + 3] * 2; dest_ptr [ri_0 ] = b_0 + b_1; dest_ptr [ri_0 + 2 * qlen] = b_0 - b_1; dest_ptr [ri_0 + 1 * qlen] = b_2 + b_3; dest_ptr [ri_0 + 3 * qlen] = b_2 - b_3; coef_index += 4; } while (coef_index < len); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // FFTRealPassInverse_CODEHEADER_INCLUDED #undef FFTRealPassInverse_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealSelect.h000066400000000000000000000036001225012771600362600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealSelect.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealSelect_HEADER_INCLUDED) #define FFTRealSelect_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" template class FFTRealSelect { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: FORCEINLINE static float * sel_bin (float *e_ptr, float *o_ptr); /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTRealSelect (); ~FFTRealSelect (); FFTRealSelect (const FFTRealSelect &other); FFTRealSelect& operator = (const FFTRealSelect &other); bool operator == (const FFTRealSelect &other); bool operator != (const FFTRealSelect &other); }; // class FFTRealSelect #include "FFTRealSelect.hpp" #endif // FFTRealSelect_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealSelect.hpp000066400000000000000000000031711225012771600366230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealSelect.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTRealSelect_CURRENT_CODEHEADER) #error Recursive inclusion of FFTRealSelect code header. #endif #define FFTRealSelect_CURRENT_CODEHEADER #if ! defined (FFTRealSelect_CODEHEADER_INCLUDED) #define FFTRealSelect_CODEHEADER_INCLUDED /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template float * FFTRealSelect

::sel_bin (float *e_ptr, float *o_ptr) { return (o_ptr); } template <> float * FFTRealSelect <0>::sel_bin (float *e_ptr, float *o_ptr) { return (e_ptr); } #endif // FFTRealSelect_CODEHEADER_INCLUDED #undef FFTRealSelect_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealUseTrigo.h000066400000000000000000000047621225012771600366140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealUseTrigo.h Copyright (c) 2005 Laurent de Soras Template parameters: - ALGO: algorithm choice. 0 = table, other = oscillator --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (FFTRealUseTrigo_HEADER_INCLUDED) #define FFTRealUseTrigo_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "FFTRealFixLenParam.h" #include "OscSinCos.h" template class FFTRealUseTrigo { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef FFTRealFixLenParam::DataType DataType; typedef OscSinCos OscType; FORCEINLINE static void prepare (OscType &osc); FORCEINLINE static void iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: FFTRealUseTrigo (); ~FFTRealUseTrigo (); FFTRealUseTrigo (const FFTRealUseTrigo &other); FFTRealUseTrigo & operator = (const FFTRealUseTrigo &other); bool operator == (const FFTRealUseTrigo &other); bool operator != (const FFTRealUseTrigo &other); }; // class FFTRealUseTrigo #include "FFTRealUseTrigo.hpp" #endif // FFTRealUseTrigo_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ FFTRealUseTrigo.hpp000066400000000000000000000044311225012771600371450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** FFTRealUseTrigo.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (FFTRealUseTrigo_CURRENT_CODEHEADER) #error Recursive inclusion of FFTRealUseTrigo code header. #endif #define FFTRealUseTrigo_CURRENT_CODEHEADER #if ! defined (FFTRealUseTrigo_CODEHEADER_INCLUDED) #define FFTRealUseTrigo_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "OscSinCos.h" /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void FFTRealUseTrigo ::prepare (OscType &osc) { osc.clear_buffers (); } template <> void FFTRealUseTrigo <0>::prepare (OscType &osc) { // Nothing } template void FFTRealUseTrigo ::iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s) { osc.step (); c = osc.get_cos (); s = osc.get_sin (); } template <> void FFTRealUseTrigo <0>::iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s) { c = cos_ptr [index_c]; s = cos_ptr [index_s]; } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // FFTRealUseTrigo_CODEHEADER_INCLUDED #undef FFTRealUseTrigo_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ OscSinCos.h000066400000000000000000000046271225012771600355520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** OscSinCos.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (OscSinCos_HEADER_INCLUDED) #define OscSinCos_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" template class OscSinCos { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef T DataType; OscSinCos (); FORCEINLINE void set_step (double angle_rad); FORCEINLINE DataType get_cos () const; FORCEINLINE DataType get_sin () const; FORCEINLINE void step (); FORCEINLINE void clear_buffers (); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: DataType _pos_cos; // Current phase expressed with sin and cos. [-1 ; 1] DataType _pos_sin; // - DataType _step_cos; // Phase increment per step, [-1 ; 1] DataType _step_sin; // - /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: OscSinCos (const OscSinCos &other); OscSinCos & operator = (const OscSinCos &other); bool operator == (const OscSinCos &other); bool operator != (const OscSinCos &other); }; // class OscSinCos #include "OscSinCos.hpp" #endif // OscSinCos_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ OscSinCos.hpp000066400000000000000000000051201225012771600360770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** OscSinCos.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (OscSinCos_CURRENT_CODEHEADER) #error Recursive inclusion of OscSinCos code header. #endif #define OscSinCos_CURRENT_CODEHEADER #if ! defined (OscSinCos_CODEHEADER_INCLUDED) #define OscSinCos_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include namespace std { } /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template OscSinCos ::OscSinCos () : _pos_cos (1) , _pos_sin (0) , _step_cos (1) , _step_sin (0) { // Nothing } template void OscSinCos ::set_step (double angle_rad) { using namespace std; _step_cos = static_cast (cos (angle_rad)); _step_sin = static_cast (sin (angle_rad)); } template typename OscSinCos ::DataType OscSinCos ::get_cos () const { return (_pos_cos); } template typename OscSinCos ::DataType OscSinCos ::get_sin () const { return (_pos_sin); } template void OscSinCos ::step () { const DataType old_cos = _pos_cos; const DataType old_sin = _pos_sin; _pos_cos = old_cos * _step_cos - old_sin * _step_sin; _pos_sin = old_cos * _step_sin + old_sin * _step_cos; } template void OscSinCos ::clear_buffers () { _pos_cos = static_cast (1); _pos_sin = static_cast (0); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // OscSinCos_CODEHEADER_INCLUDED #undef OscSinCos_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestAccuracy.h000066400000000000000000000060531225012771600362740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestAccuracy.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (TestAccuracy_HEADER_INCLUDED) #define TestAccuracy_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template class TestAccuracy { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef typename FO::DataType DataType; typedef long double BigFloat; // To get maximum accuracy during intermediate calculations static int perform_test_single_object (FO &fft); static int perform_test_d (FO &fft, const char *class_name_0); static int perform_test_i (FO &fft, const char *class_name_0); static int perform_test_di (FO &fft, const char *class_name_0); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: enum { NBR_ACC_TESTS = 10 * 1000 * 1000 }; enum { MAX_NBR_TESTS = 10000 }; static void compute_tf (DataType s [], const DataType x [], long length); static void compute_itf (DataType x [], const DataType s [], long length); static int compare_vect_display (const DataType x_ptr [], const DataType y_ptr [], long len, BigFloat &max_err_rel); static BigFloat compute_power (const DataType x_ptr [], long len); static BigFloat compute_power (const DataType x_ptr [], const DataType y_ptr [], long len); static void compare_vect (const DataType x_ptr [], const DataType y_ptr [], BigFloat &power, long &max_err_pos, long len); /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: TestAccuracy (); ~TestAccuracy (); TestAccuracy (const TestAccuracy &other); TestAccuracy & operator = (const TestAccuracy &other); bool operator == (const TestAccuracy &other); bool operator != (const TestAccuracy &other); }; // class TestAccuracy #include "TestAccuracy.hpp" #endif // TestAccuracy_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestAccuracy.hpp000066400000000000000000000243201225012771600366310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestAccuracy.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (TestAccuracy_CURRENT_CODEHEADER) #error Recursive inclusion of TestAccuracy code header. #endif #define TestAccuracy_CURRENT_CODEHEADER #if ! defined (TestAccuracy_CODEHEADER_INCLUDED) #define TestAccuracy_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "test_fnc.h" #include "TestWhiteNoiseGen.h" #include #include #include #include static const double TestAccuracy_LN10 = 2.3025850929940456840179914546844; /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template int TestAccuracy ::perform_test_single_object (FO &fft) { assert (&fft != 0); using namespace std; int ret_val = 0; const std::type_info & ti = typeid (fft); const char * class_name_0 = ti.name (); if (ret_val == 0) { ret_val = perform_test_d (fft, class_name_0); } if (ret_val == 0) { ret_val = perform_test_i (fft, class_name_0); } if (ret_val == 0) { ret_val = perform_test_di (fft, class_name_0); } if (ret_val == 0) { printf ("\n"); } return (ret_val); } template int TestAccuracy ::perform_test_d (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); using namespace std; int ret_val = 0; const long len = fft.get_length (); const long nbr_tests = limit ( NBR_ACC_TESTS / len / len, 1L, static_cast (MAX_NBR_TESTS) ); printf ("Testing %s::do_fft () [%ld samples]... ", class_name_0, len); fflush (stdout); TestWhiteNoiseGen noise; std::vector x (len); std::vector s1 (len); std::vector s2 (len); BigFloat err_avg = 0; for (long test = 0; test < nbr_tests && ret_val == 0; ++ test) { noise.generate (&x [0], len); fft.do_fft (&s1 [0], &x [0]); compute_tf (&s2 [0], &x [0], len); BigFloat max_err; compare_vect_display (&s1 [0], &s2 [0], len, max_err); err_avg += max_err; } err_avg /= NBR_ACC_TESTS; printf ("done.\n"); printf ( "Average maximum error: %.6f %% (%f dB)\n", static_cast (err_avg * 100), static_cast ((20 / TestAccuracy_LN10) * log (err_avg)) ); return (ret_val); } template int TestAccuracy ::perform_test_i (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); using namespace std; int ret_val = 0; const long len = fft.get_length (); const long nbr_tests = limit ( NBR_ACC_TESTS / len / len, 10L, static_cast (MAX_NBR_TESTS) ); printf ("Testing %s::do_ifft () [%ld samples]... ", class_name_0, len); fflush (stdout); TestWhiteNoiseGen noise; std::vector s (len); std::vector x1 (len); std::vector x2 (len); BigFloat err_avg = 0; for (long test = 0; test < nbr_tests && ret_val == 0; ++ test) { noise.generate (&s [0], len); fft.do_ifft (&s [0], &x1 [0]); compute_itf (&x2 [0], &s [0], len); BigFloat max_err; compare_vect_display (&x1 [0], &x2 [0], len, max_err); err_avg += max_err; } err_avg /= NBR_ACC_TESTS; printf ("done.\n"); printf ( "Average maximum error: %.6f %% (%f dB)\n", static_cast (err_avg * 100), static_cast ((20 / TestAccuracy_LN10) * log (err_avg)) ); return (ret_val); } template int TestAccuracy ::perform_test_di (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); using namespace std; int ret_val = 0; const long len = fft.get_length (); const long nbr_tests = limit ( NBR_ACC_TESTS / len / len, 1L, static_cast (MAX_NBR_TESTS) ); printf ( "Testing %s::do_fft () / do_ifft () / rescale () [%ld samples]... ", class_name_0, len ); fflush (stdout); TestWhiteNoiseGen noise; std::vector x (len); std::vector s (len); std::vector y (len); BigFloat err_avg = 0; for (long test = 0; test < nbr_tests && ret_val == 0; ++ test) { noise.generate (&x [0], len); fft.do_fft (&s [0], &x [0]); fft.do_ifft (&s [0], &y [0]); fft.rescale (&y [0]); BigFloat max_err; compare_vect_display (&x [0], &y [0], len, max_err); err_avg += max_err; } err_avg /= NBR_ACC_TESTS; printf ("done.\n"); printf ( "Average maximum error: %.6f %% (%f dB)\n", static_cast (err_avg * 100), static_cast ((20 / TestAccuracy_LN10) * log (err_avg)) ); return (ret_val); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ // Positive transform template void TestAccuracy ::compute_tf (DataType s [], const DataType x [], long length) { assert (s != 0); assert (x != 0); assert (length >= 2); assert ((length & 1) == 0); const long nbr_bins = length >> 1; // DC and Nyquist BigFloat dc = 0; BigFloat ny = 0; for (long pos = 0; pos < length; pos += 2) { const BigFloat even = x [pos ]; const BigFloat odd = x [pos + 1]; dc += even + odd; ny += even - odd; } s [0 ] = static_cast (dc); s [nbr_bins] = static_cast (ny); // Regular bins for (long bin = 1; bin < nbr_bins; ++ bin) { BigFloat sum_r = 0; BigFloat sum_i = 0; const BigFloat m = bin * static_cast (2 * PI) / length; for (long pos = 0; pos < length; ++pos) { using namespace std; const BigFloat phase = pos * m; const BigFloat e_r = cos (phase); const BigFloat e_i = sin (phase); sum_r += x [pos] * e_r; sum_i += x [pos] * e_i; } s [ bin] = static_cast (sum_r); s [nbr_bins + bin] = static_cast (sum_i); } } // Negative transform template void TestAccuracy ::compute_itf (DataType x [], const DataType s [], long length) { assert (s != 0); assert (x != 0); assert (length >= 2); assert ((length & 1) == 0); const long nbr_bins = length >> 1; // DC and Nyquist BigFloat dc = s [0 ]; BigFloat ny = s [nbr_bins]; // Regular bins for (long pos = 0; pos < length; ++pos) { BigFloat sum = dc + ny * (1 - 2 * (pos & 1)); const BigFloat m = pos * static_cast (-2 * PI) / length; for (long bin = 1; bin < nbr_bins; ++ bin) { using namespace std; const BigFloat phase = bin * m; const BigFloat e_r = cos (phase); const BigFloat e_i = sin (phase); sum += 2 * ( e_r * s [bin ] - e_i * s [bin + nbr_bins]); } x [pos] = static_cast (sum); } } template int TestAccuracy ::compare_vect_display (const DataType x_ptr [], const DataType y_ptr [], long len, BigFloat &max_err_rel) { assert (x_ptr != 0); assert (y_ptr != 0); assert (len > 0); assert (&max_err_rel != 0); using namespace std; int ret_val = 0; BigFloat power = compute_power (&x_ptr [0], &y_ptr [0], len); BigFloat power_dif; long max_err_pos; compare_vect (&x_ptr [0], &y_ptr [0], power_dif, max_err_pos, len); if (power == 0) { power = power_dif; } const BigFloat power_err_rel = power_dif / power; BigFloat max_err = 0; max_err_rel = 0; if (max_err_pos >= 0) { max_err = y_ptr [max_err_pos] - x_ptr [max_err_pos]; max_err_rel = 2 * fabs (max_err) / ( fabs (y_ptr [max_err_pos]) + fabs (x_ptr [max_err_pos])); } if (power_err_rel > 0.001) { printf ("Power error : %f (%.6f %%)\n", static_cast (power_err_rel), static_cast (power_err_rel * 100) ); if (max_err_pos >= 0) { printf ( "Maximum error: %f - %f = %f (%f)\n", static_cast (y_ptr [max_err_pos]), static_cast (x_ptr [max_err_pos]), static_cast (max_err), static_cast (max_err_pos) ); } } return (ret_val); } template typename TestAccuracy ::BigFloat TestAccuracy ::compute_power (const DataType x_ptr [], long len) { assert (x_ptr != 0); assert (len > 0); BigFloat power = 0; for (long pos = 0; pos < len; ++pos) { const BigFloat val = x_ptr [pos]; power += val * val; } using namespace std; power = sqrt (power) / len; return (power); } template typename TestAccuracy ::BigFloat TestAccuracy ::compute_power (const DataType x_ptr [], const DataType y_ptr [], long len) { assert (x_ptr != 0); assert (y_ptr != 0); assert (len > 0); return ((compute_power (x_ptr, len) + compute_power (y_ptr, len)) * 0.5); } template void TestAccuracy ::compare_vect (const DataType x_ptr [], const DataType y_ptr [], BigFloat &power, long &max_err_pos, long len) { assert (x_ptr != 0); assert (y_ptr != 0); assert (len > 0); assert (&power != 0); assert (&max_err_pos != 0); power = 0; BigFloat max_dif2 = 0; max_err_pos = -1; for (long pos = 0; pos < len; ++pos) { const BigFloat x = x_ptr [pos]; const BigFloat y = y_ptr [pos]; const BigFloat dif = y - x; const BigFloat dif2 = dif * dif; power += dif2; if (dif2 > max_dif2) { max_err_pos = pos; max_dif2 = dif2; } } using namespace std; power = sqrt (power) / len; } #endif // TestAccuracy_CODEHEADER_INCLUDED #undef TestAccuracy_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestHelperFixLen.h000066400000000000000000000043741225012771600370730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestHelperFixLen.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (TestHelperFixLen_HEADER_INCLUDED) #define TestHelperFixLen_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "FFTRealFixLen.h" template class TestHelperFixLen { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef FFTRealFixLen FftType; static void perform_test_accuracy (int &ret_val); static void perform_test_speed (int &ret_val); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: TestHelperFixLen (); ~TestHelperFixLen (); TestHelperFixLen (const TestHelperFixLen &other); TestHelperFixLen & operator = (const TestHelperFixLen &other); bool operator == (const TestHelperFixLen &other); bool operator != (const TestHelperFixLen &other); }; // class TestHelperFixLen #include "TestHelperFixLen.hpp" #endif // TestHelperFixLen_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestHelperFixLen.hpp000066400000000000000000000044251225012771600374300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestHelperFixLen.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (TestHelperFixLen_CURRENT_CODEHEADER) #error Recursive inclusion of TestHelperFixLen code header. #endif #define TestHelperFixLen_CURRENT_CODEHEADER #if ! defined (TestHelperFixLen_CODEHEADER_INCLUDED) #define TestHelperFixLen_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "test_settings.h" #include "TestAccuracy.h" #if defined (test_settings_SPEED_TEST_ENABLED) #include "TestSpeed.h" #endif /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void TestHelperFixLen ::perform_test_accuracy (int &ret_val) { if (ret_val == 0) { FftType fft; ret_val = TestAccuracy ::perform_test_single_object (fft); } } template void TestHelperFixLen ::perform_test_speed (int &ret_val) { #if defined (test_settings_SPEED_TEST_ENABLED) if (ret_val == 0) { FftType fft; ret_val = TestSpeed ::perform_test_single_object (fft); } #endif } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // TestHelperFixLen_CODEHEADER_INCLUDED #undef TestHelperFixLen_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestHelperNormal.h000066400000000000000000000044171225012771600371340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestHelperNormal.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (TestHelperNormal_HEADER_INCLUDED) #define TestHelperNormal_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "FFTReal.h" template class TestHelperNormal { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef DT DataType; typedef FFTReal FftType; static void perform_test_accuracy (int &ret_val); static void perform_test_speed (int &ret_val); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: TestHelperNormal (); ~TestHelperNormal (); TestHelperNormal (const TestHelperNormal &other); TestHelperNormal & operator = (const TestHelperNormal &other); bool operator == (const TestHelperNormal &other); bool operator != (const TestHelperNormal &other); }; // class TestHelperNormal #include "TestHelperNormal.hpp" #endif // TestHelperNormal_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestHelperNormal.hpp000066400000000000000000000052471225012771600374760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestHelperNormal.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (TestHelperNormal_CURRENT_CODEHEADER) #error Recursive inclusion of TestHelperNormal code header. #endif #define TestHelperNormal_CURRENT_CODEHEADER #if ! defined (TestHelperNormal_CODEHEADER_INCLUDED) #define TestHelperNormal_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "test_settings.h" #include "TestAccuracy.h" #if defined (test_settings_SPEED_TEST_ENABLED) #include "TestSpeed.h" #endif /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template void TestHelperNormal

::perform_test_accuracy (int &ret_val) { const int len_arr [] = { 1, 2, 3, 4, 7, 8, 10, 12 }; const int nbr_len = sizeof (len_arr) / sizeof (len_arr [0]); for (int k = 0; k < nbr_len && ret_val == 0; ++k) { const long len = 1L << (len_arr [k]); FftType fft (len); ret_val = TestAccuracy ::perform_test_single_object (fft); } } template void TestHelperNormal
::perform_test_speed (int &ret_val) { #if defined (test_settings_SPEED_TEST_ENABLED) const int len_arr [] = { 1, 2, 3, 4, 7, 8, 10, 12, 14, 16, 18, 20, 22 }; const int nbr_len = sizeof (len_arr) / sizeof (len_arr [0]); for (int k = 0; k < nbr_len && ret_val == 0; ++k) { const long len = 1L << (len_arr [k]); FftType fft (len); ret_val = TestSpeed ::perform_test_single_object (fft); } #endif } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // TestHelperNormal_CODEHEADER_INCLUDED #undef TestHelperNormal_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestSpeed.h000066400000000000000000000045471225012771600356100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestSpeed.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (TestSpeed_HEADER_INCLUDED) #define TestSpeed_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template class TestSpeed { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef typename FO::DataType DataType; static int perform_test_single_object (FO &fft); static int perform_test_d (FO &fft, const char *class_name_0); static int perform_test_i (FO &fft, const char *class_name_0); static int perform_test_di (FO &fft, const char *class_name_0); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: enum { NBR_SPD_TESTS = 10 * 1000 * 1000 }; enum { MAX_NBR_TESTS = 10000 }; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: TestSpeed (); ~TestSpeed (); TestSpeed (const TestSpeed &other); TestSpeed & operator = (const TestSpeed &other); bool operator == (const TestSpeed &other); bool operator != (const TestSpeed &other); }; // class TestSpeed #include "TestSpeed.hpp" #endif // TestSpeed_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestSpeed.hpp000066400000000000000000000114161225012771600361410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestSpeed.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (TestSpeed_CURRENT_CODEHEADER) #error Recursive inclusion of TestSpeed code header. #endif #define TestSpeed_CURRENT_CODEHEADER #if ! defined (TestSpeed_CODEHEADER_INCLUDED) #define TestSpeed_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "test_fnc.h" #include "stopwatch/StopWatch.h" #include "TestWhiteNoiseGen.h" #include #include /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template int TestSpeed ::perform_test_single_object (FO &fft) { assert (&fft != 0); int ret_val = 0; const std::type_info & ti = typeid (fft); const char * class_name_0 = ti.name (); if (ret_val == 0) { perform_test_d (fft, class_name_0); } if (ret_val == 0) { perform_test_i (fft, class_name_0); } if (ret_val == 0) { perform_test_di (fft, class_name_0); } if (ret_val == 0) { printf ("\n"); } return (ret_val); } template int TestSpeed ::perform_test_d (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); const long len = fft.get_length (); const long nbr_tests = limit ( static_cast (NBR_SPD_TESTS / len / len), 1L, static_cast (MAX_NBR_TESTS) ); TestWhiteNoiseGen noise; std::vector x (len, 0); std::vector s (len); noise.generate (&x [0], len); printf ( "%s::do_fft () speed test [%ld samples]... ", class_name_0, len ); fflush (stdout); stopwatch::StopWatch chrono; chrono.start (); for (long test = 0; test < nbr_tests; ++ test) { fft.do_fft (&s [0], &x [0]); chrono.stop_lap (); } printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); return (0); } template int TestSpeed ::perform_test_i (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); const long len = fft.get_length (); const long nbr_tests = limit ( static_cast (NBR_SPD_TESTS / len / len), 1L, static_cast (MAX_NBR_TESTS) ); TestWhiteNoiseGen noise; std::vector x (len); std::vector s (len, 0); noise.generate (&s [0], len); printf ( "%s::do_ifft () speed test [%ld samples]... ", class_name_0, len ); fflush (stdout); stopwatch::StopWatch chrono; chrono.start (); for (long test = 0; test < nbr_tests; ++ test) { fft.do_ifft (&s [0], &x [0]); chrono.stop_lap (); } printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); return (0); } template int TestSpeed ::perform_test_di (FO &fft, const char *class_name_0) { assert (&fft != 0); assert (class_name_0 != 0); const long len = fft.get_length (); const long nbr_tests = limit ( static_cast (NBR_SPD_TESTS / len / len), 1L, static_cast (MAX_NBR_TESTS) ); TestWhiteNoiseGen noise; std::vector x (len, 0); std::vector s (len); std::vector y (len); noise.generate (&x [0], len); printf ( "%s::do_fft () / do_ifft () / rescale () speed test [%ld samples]... ", class_name_0, len ); fflush (stdout); stopwatch::StopWatch chrono; chrono.start (); for (long test = 0; test < nbr_tests; ++ test) { fft.do_fft (&s [0], &x [0]); fft.do_ifft (&s [0], &y [0]); fft.rescale (&y [0]); chrono.stop_lap (); } printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); return (0); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // TestSpeed_CODEHEADER_INCLUDED #undef TestSpeed_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestWhiteNoiseGen.h000066400000000000000000000043571225012771600372570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestWhiteNoiseGen.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (TestWhiteNoiseGen_HEADER_INCLUDED) #define TestWhiteNoiseGen_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template class TestWhiteNoiseGen { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: typedef DT DataType; TestWhiteNoiseGen (); virtual ~TestWhiteNoiseGen () {} void generate (DataType data_ptr [], long len); /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: typedef unsigned long StateType; StateType _rand_state; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: TestWhiteNoiseGen (const TestWhiteNoiseGen &other); TestWhiteNoiseGen & operator = (const TestWhiteNoiseGen &other); bool operator == (const TestWhiteNoiseGen &other); bool operator != (const TestWhiteNoiseGen &other); }; // class TestWhiteNoiseGen #include "TestWhiteNoiseGen.hpp" #endif // TestWhiteNoiseGen_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ TestWhiteNoiseGen.hpp000066400000000000000000000044611225012771600376130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** TestWhiteNoiseGen.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (TestWhiteNoiseGen_CURRENT_CODEHEADER) #error Recursive inclusion of TestWhiteNoiseGen code header. #endif #define TestWhiteNoiseGen_CURRENT_CODEHEADER #if ! defined (TestWhiteNoiseGen_CODEHEADER_INCLUDED) #define TestWhiteNoiseGen_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template TestWhiteNoiseGen
::TestWhiteNoiseGen () : _rand_state (0) { _rand_state = reinterpret_cast (this); } template void TestWhiteNoiseGen
::generate (DataType data_ptr [], long len) { assert (data_ptr != 0); assert (len > 0); const DataType one = static_cast (1); const DataType mul = one / static_cast (0x80000000UL); long pos = 0; do { const DataType x = static_cast (_rand_state & 0xFFFFFFFFUL); data_ptr [pos] = x * mul - one; _rand_state = _rand_state * 1234567UL + 890123UL; ++ pos; } while (pos < len); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #endif // TestWhiteNoiseGen_CODEHEADER_INCLUDED #undef TestWhiteNoiseGen_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ bwins/000077500000000000000000000000001225012771600346475ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealfftrealu.def000066400000000000000000000004431225012771600371400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/bwinsEXPORTS ??0FFTRealWrapper@@QAE@XZ @ 1 NONAME ; FFTRealWrapper::FFTRealWrapper(void) ??1FFTRealWrapper@@QAE@XZ @ 2 NONAME ; FFTRealWrapper::~FFTRealWrapper(void) ?calculateFFT@FFTRealWrapper@@QAEXQAMQBM@Z @ 3 NONAME ; void FFTRealWrapper::calculateFFT(float * const, float const * const) def.h000066400000000000000000000027641225012771600344450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** def.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (def_HEADER_INCLUDED) #define def_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ const double PI = 3.1415926535897932384626433832795; const double SQRT2 = 1.41421356237309514547462185873883; #if defined (_MSC_VER) #define FORCEINLINE __forceinline #else #define FORCEINLINE inline #endif #endif // def_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ eabi/000077500000000000000000000000001225012771600344255ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealfftrealu.def000066400000000000000000000003151225012771600367140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/eabiEXPORTS _ZN14FFTRealWrapper12calculateFFTEPfPKf @ 1 NONAME _ZN14FFTRealWrapperC1Ev @ 2 NONAME _ZN14FFTRealWrapperC2Ev @ 3 NONAME _ZN14FFTRealWrapperD1Ev @ 4 NONAME _ZN14FFTRealWrapperD2Ev @ 5 NONAME fftreal.pas000066400000000000000000000417571225012771600356730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal(***************************************************************************** DIGITAL SIGNAL PROCESSING TOOLS Version 1.03, 2001/06/15 (c) 1999 - Laurent de Soras FFTReal.h Fourier transformation of real number arrays. Portable ISO C++ ------------------------------------------------------------------------------ LEGAL Source code may be freely used for any purpose, including commercial applications. Programs must display in their "About" dialog-box (or documentation) a text telling they use these routines by Laurent de Soras. Modified source code can be distributed, but modifications must be clearly indicated. CONTACT Laurent de Soras 92 avenue Albert 1er 92500 Rueil-Malmaison France ldesoras@club-internet.fr ------------------------------------------------------------------------------ Translation to ObjectPascal by : Frederic Vanmol frederic@axiworld.be *****************************************************************************) unit FFTReal; interface uses Windows; (* Change this typedef to use a different floating point type in your FFTs (i.e. float, double or long double). *) type pflt_t = ^flt_t; flt_t = single; pflt_array = ^flt_array; flt_array = array[0..0] of flt_t; plongarray = ^longarray; longarray = array[0..0] of longint; const sizeof_flt : longint = SizeOf(flt_t); type // Bit reversed look-up table nested class TBitReversedLUT = class private _ptr : plongint; public constructor Create(const nbr_bits: integer); destructor Destroy; override; function get_ptr: plongint; end; // Trigonometric look-up table nested class TTrigoLUT = class private _ptr : pflt_t; public constructor Create(const nbr_bits: integer); destructor Destroy; override; function get_ptr(const level: integer): pflt_t; end; TFFTReal = class private _bit_rev_lut : TBitReversedLUT; _trigo_lut : TTrigoLUT; _sqrt2_2 : flt_t; _length : longint; _nbr_bits : integer; _buffer_ptr : pflt_t; public constructor Create(const length: longint); destructor Destroy; override; procedure do_fft(f: pflt_array; const x: pflt_array); procedure do_ifft(const f: pflt_array; x: pflt_array); procedure rescale(x: pflt_array); end; implementation uses Math; { TBitReversedLUT } constructor TBitReversedLUT.Create(const nbr_bits: integer); var length : longint; cnt : longint; br_index : longint; bit : longint; begin inherited Create; length := 1 shl nbr_bits; GetMem(_ptr, length*SizeOf(longint)); br_index := 0; plongarray(_ptr)^[0] := 0; for cnt := 1 to length-1 do begin // ++br_index (bit reversed) bit := length shr 1; br_index := br_index xor bit; while br_index and bit = 0 do begin bit := bit shr 1; br_index := br_index xor bit; end; plongarray(_ptr)^[cnt] := br_index; end; end; destructor TBitReversedLUT.Destroy; begin FreeMem(_ptr); _ptr := nil; inherited; end; function TBitReversedLUT.get_ptr: plongint; begin Result := _ptr; end; { TTrigLUT } constructor TTrigoLUT.Create(const nbr_bits: integer); var total_len : longint; PI : double; level : integer; level_len : longint; level_ptr : pflt_array; mul : double; i : longint; begin inherited Create; _ptr := nil; if (nbr_bits > 3) then begin total_len := (1 shl (nbr_bits - 1)) - 4; GetMem(_ptr, total_len * sizeof_flt); PI := ArcTan(1) * 4; for level := 3 to nbr_bits-1 do begin level_len := 1 shl (level - 1); level_ptr := pointer(get_ptr(level)); mul := PI / (level_len shl 1); for i := 0 to level_len-1 do level_ptr^[i] := cos(i * mul); end; end; end; destructor TTrigoLUT.Destroy; begin FreeMem(_ptr); _ptr := nil; inherited; end; function TTrigoLUT.get_ptr(const level: integer): pflt_t; var tempp : pflt_t; begin tempp := _ptr; inc(tempp, (1 shl (level-1)) - 4); Result := tempp; end; { TFFTReal } constructor TFFTReal.Create(const length: longint); begin inherited Create; _length := length; _nbr_bits := Floor(Ln(length) / Ln(2) + 0.5); _bit_rev_lut := TBitReversedLUT.Create(Floor(Ln(length) / Ln(2) + 0.5)); _trigo_lut := TTrigoLUT.Create(Floor(Ln(length) / Ln(2) + 0.05)); _sqrt2_2 := Sqrt(2) * 0.5; _buffer_ptr := nil; if _nbr_bits > 2 then GetMem(_buffer_ptr, _length * sizeof_flt); end; destructor TFFTReal.Destroy; begin if _buffer_ptr <> nil then begin FreeMem(_buffer_ptr); _buffer_ptr := nil; end; _bit_rev_lut.Free; _bit_rev_lut := nil; _trigo_lut.Free; _trigo_lut := nil; inherited; end; (*==========================================================================*/ /* Name: do_fft */ /* Description: Compute the FFT of the array. */ /* Input parameters: */ /* - x: pointer on the source array (time). */ /* Output parameters: */ /* - f: pointer on the destination array (frequencies). */ /* f [0...length(x)/2] = real values, */ /* f [length(x)/2+1...length(x)-1] = imaginary values of */ /* coefficents 1...length(x)/2-1. */ /*==========================================================================*) procedure TFFTReal.do_fft(f: pflt_array; const x: pflt_array); var sf, df : pflt_array; pass : integer; nbr_coef : longint; h_nbr_coef : longint; d_nbr_coef : longint; coef_index : longint; bit_rev_lut_ptr : plongarray; rev_index_0 : longint; rev_index_1 : longint; rev_index_2 : longint; rev_index_3 : longint; df2 : pflt_array; n1, n2, n3 : integer; sf_0, sf_2 : flt_t; sqrt2_2 : flt_t; v : flt_t; cos_ptr : pflt_array; i : longint; sf1r, sf2r : pflt_array; dfr, dfi : pflt_array; sf1i, sf2i : pflt_array; c, s : flt_t; temp_ptr : pflt_array; b_0, b_2 : flt_t; begin n1 := 1; n2 := 2; n3 := 3; (*______________________________________________ * * General case *______________________________________________ *) if _nbr_bits > 2 then begin if _nbr_bits and 1 <> 0 then begin df := pointer(_buffer_ptr); sf := f; end else begin df := f; sf := pointer(_buffer_ptr); end; // // Do the transformation in several passes // // First and second pass at once bit_rev_lut_ptr := pointer(_bit_rev_lut.get_ptr); coef_index := 0; repeat rev_index_0 := bit_rev_lut_ptr^[coef_index]; rev_index_1 := bit_rev_lut_ptr^[coef_index + 1]; rev_index_2 := bit_rev_lut_ptr^[coef_index + 2]; rev_index_3 := bit_rev_lut_ptr^[coef_index + 3]; df2 := pointer(longint(df) + (coef_index*sizeof_flt)); df2^[n1] := x^[rev_index_0] - x^[rev_index_1]; df2^[n3] := x^[rev_index_2] - x^[rev_index_3]; sf_0 := x^[rev_index_0] + x^[rev_index_1]; sf_2 := x^[rev_index_2] + x^[rev_index_3]; df2^[0] := sf_0 + sf_2; df2^[n2] := sf_0 - sf_2; inc(coef_index, 4); until (coef_index >= _length); // Third pass coef_index := 0; sqrt2_2 := _sqrt2_2; repeat sf^[coef_index] := df^[coef_index] + df^[coef_index + 4]; sf^[coef_index + 4] := df^[coef_index] - df^[coef_index + 4]; sf^[coef_index + 2] := df^[coef_index + 2]; sf^[coef_index + 6] := df^[coef_index + 6]; v := (df [coef_index + 5] - df^[coef_index + 7]) * sqrt2_2; sf^[coef_index + 1] := df^[coef_index + 1] + v; sf^[coef_index + 3] := df^[coef_index + 1] - v; v := (df^[coef_index + 5] + df^[coef_index + 7]) * sqrt2_2; sf [coef_index + 5] := v + df^[coef_index + 3]; sf [coef_index + 7] := v - df^[coef_index + 3]; inc(coef_index, 8); until (coef_index >= _length); // Next pass for pass := 3 to _nbr_bits-1 do begin coef_index := 0; nbr_coef := 1 shl pass; h_nbr_coef := nbr_coef shr 1; d_nbr_coef := nbr_coef shl 1; cos_ptr := pointer(_trigo_lut.get_ptr(pass)); repeat sf1r := pointer(longint(sf) + (coef_index * sizeof_flt)); sf2r := pointer(longint(sf1r) + (nbr_coef * sizeof_flt)); dfr := pointer(longint(df) + (coef_index * sizeof_flt)); dfi := pointer(longint(dfr) + (nbr_coef * sizeof_flt)); // Extreme coefficients are always real dfr^[0] := sf1r^[0] + sf2r^[0]; dfi^[0] := sf1r^[0] - sf2r^[0]; // dfr [nbr_coef] = dfr^[h_nbr_coef] := sf1r^[h_nbr_coef]; dfi^[h_nbr_coef] := sf2r^[h_nbr_coef]; // Others are conjugate complex numbers sf1i := pointer(longint(sf1r) + (h_nbr_coef * sizeof_flt)); sf2i := pointer(longint(sf1i) + (nbr_coef * sizeof_flt)); for i := 1 to h_nbr_coef-1 do begin c := cos_ptr^[i]; // cos (i*PI/nbr_coef); s := cos_ptr^[h_nbr_coef - i]; // sin (i*PI/nbr_coef); v := sf2r^[i] * c - sf2i^[i] * s; dfr^[i] := sf1r^[i] + v; dfi^[-i] := sf1r^[i] - v; // dfr [nbr_coef - i] = v := sf2r^[i] * s + sf2i^[i] * c; dfi^[i] := v + sf1i^[i]; dfi^[nbr_coef - i] := v - sf1i^[i]; end; inc(coef_index, d_nbr_coef); until (coef_index >= _length); // Prepare to the next pass temp_ptr := df; df := sf; sf := temp_ptr; end; end (*______________________________________________ * * Special cases *______________________________________________ *) // 4-point FFT else if _nbr_bits = 2 then begin f^[n1] := x^[0] - x^[n2]; f^[n3] := x^[n1] - x^[n3]; b_0 := x^[0] + x^[n2]; b_2 := x^[n1] + x^[n3]; f^[0] := b_0 + b_2; f^[n2] := b_0 - b_2; end // 2-point FFT else if _nbr_bits = 1 then begin f^[0] := x^[0] + x^[n1]; f^[n1] := x^[0] - x^[n1]; end // 1-point FFT else f^[0] := x^[0]; end; (*==========================================================================*/ /* Name: do_ifft */ /* Description: Compute the inverse FFT of the array. Notice that */ /* IFFT (FFT (x)) = x * length (x). Data must be */ /* post-scaled. */ /* Input parameters: */ /* - f: pointer on the source array (frequencies). */ /* f [0...length(x)/2] = real values, */ /* f [length(x)/2+1...length(x)-1] = imaginary values of */ /* coefficents 1...length(x)/2-1. */ /* Output parameters: */ /* - x: pointer on the destination array (time). */ /*==========================================================================*) procedure TFFTReal.do_ifft(const f: pflt_array; x: pflt_array); var n1, n2, n3 : integer; n4, n5, n6, n7 : integer; sf, df, df_temp : pflt_array; pass : integer; nbr_coef : longint; h_nbr_coef : longint; d_nbr_coef : longint; coef_index : longint; cos_ptr : pflt_array; i : longint; sfr, sfi : pflt_array; df1r, df2r : pflt_array; df1i, df2i : pflt_array; c, s, vr, vi : flt_t; temp_ptr : pflt_array; sqrt2_2 : flt_t; bit_rev_lut_ptr : plongarray; sf2 : pflt_array; b_0, b_1, b_2, b_3 : flt_t; begin n1 := 1; n2 := 2; n3 := 3; n4 := 4; n5 := 5; n6 := 6; n7 := 7; (*______________________________________________ * * General case *______________________________________________ *) if _nbr_bits > 2 then begin sf := f; if _nbr_bits and 1 <> 0 then begin df := pointer(_buffer_ptr); df_temp := x; end else begin df := x; df_temp := pointer(_buffer_ptr); end; // Do the transformation in several pass // First pass for pass := _nbr_bits-1 downto 3 do begin coef_index := 0; nbr_coef := 1 shl pass; h_nbr_coef := nbr_coef shr 1; d_nbr_coef := nbr_coef shl 1; cos_ptr := pointer(_trigo_lut.get_ptr(pass)); repeat sfr := pointer(longint(sf) + (coef_index*sizeof_flt)); sfi := pointer(longint(sfr) + (nbr_coef*sizeof_flt)); df1r := pointer(longint(df) + (coef_index*sizeof_flt)); df2r := pointer(longint(df1r) + (nbr_coef*sizeof_flt)); // Extreme coefficients are always real df1r^[0] := sfr^[0] + sfi^[0]; // + sfr [nbr_coef] df2r^[0] := sfr^[0] - sfi^[0]; // - sfr [nbr_coef] df1r^[h_nbr_coef] := sfr^[h_nbr_coef] * 2; df2r^[h_nbr_coef] := sfi^[h_nbr_coef] * 2; // Others are conjugate complex numbers df1i := pointer(longint(df1r) + (h_nbr_coef*sizeof_flt)); df2i := pointer(longint(df1i) + (nbr_coef*sizeof_flt)); for i := 1 to h_nbr_coef-1 do begin df1r^[i] := sfr^[i] + sfi^[-i]; // + sfr [nbr_coef - i] df1i^[i] := sfi^[i] - sfi^[nbr_coef - i]; c := cos_ptr^[i]; // cos (i*PI/nbr_coef); s := cos_ptr^[h_nbr_coef - i]; // sin (i*PI/nbr_coef); vr := sfr^[i] - sfi^[-i]; // - sfr [nbr_coef - i] vi := sfi^[i] + sfi^[nbr_coef - i]; df2r^[i] := vr * c + vi * s; df2i^[i] := vi * c - vr * s; end; inc(coef_index, d_nbr_coef); until (coef_index >= _length); // Prepare to the next pass if (pass < _nbr_bits - 1) then begin temp_ptr := df; df := sf; sf := temp_ptr; end else begin sf := df; df := df_temp; end end; // Antepenultimate pass sqrt2_2 := _sqrt2_2; coef_index := 0; repeat df^[coef_index] := sf^[coef_index] + sf^[coef_index + 4]; df^[coef_index + 4] := sf^[coef_index] - sf^[coef_index + 4]; df^[coef_index + 2] := sf^[coef_index + 2] * 2; df^[coef_index + 6] := sf^[coef_index + 6] * 2; df^[coef_index + 1] := sf^[coef_index + 1] + sf^[coef_index + 3]; df^[coef_index + 3] := sf^[coef_index + 5] - sf^[coef_index + 7]; vr := sf^[coef_index + 1] - sf^[coef_index + 3]; vi := sf^[coef_index + 5] + sf^[coef_index + 7]; df^[coef_index + 5] := (vr + vi) * sqrt2_2; df^[coef_index + 7] := (vi - vr) * sqrt2_2; inc(coef_index, 8); until (coef_index >= _length); // Penultimate and last pass at once coef_index := 0; bit_rev_lut_ptr := pointer(_bit_rev_lut.get_ptr); sf2 := df; repeat b_0 := sf2^[0] + sf2^[n2]; b_2 := sf2^[0] - sf2^[n2]; b_1 := sf2^[n1] * 2; b_3 := sf2^[n3] * 2; x^[bit_rev_lut_ptr^[0]] := b_0 + b_1; x^[bit_rev_lut_ptr^[n1]] := b_0 - b_1; x^[bit_rev_lut_ptr^[n2]] := b_2 + b_3; x^[bit_rev_lut_ptr^[n3]] := b_2 - b_3; b_0 := sf2^[n4] + sf2^[n6]; b_2 := sf2^[n4] - sf2^[n6]; b_1 := sf2^[n5] * 2; b_3 := sf2^[n7] * 2; x^[bit_rev_lut_ptr^[n4]] := b_0 + b_1; x^[bit_rev_lut_ptr^[n5]] := b_0 - b_1; x^[bit_rev_lut_ptr^[n6]] := b_2 + b_3; x^[bit_rev_lut_ptr^[n7]] := b_2 - b_3; inc(sf2, 8); inc(coef_index, 8); inc(bit_rev_lut_ptr, 8); until (coef_index >= _length); end (*______________________________________________ * * Special cases *______________________________________________ *) // 4-point IFFT else if _nbr_bits = 2 then begin b_0 := f^[0] + f [n2]; b_2 := f^[0] - f [n2]; x^[0] := b_0 + f [n1] * 2; x^[n2] := b_0 - f [n1] * 2; x^[n1] := b_2 + f [n3] * 2; x^[n3] := b_2 - f [n3] * 2; end // 2-point IFFT else if _nbr_bits = 1 then begin x^[0] := f^[0] + f^[n1]; x^[n1] := f^[0] - f^[n1]; end // 1-point IFFT else x^[0] := f^[0]; end; (*==========================================================================*/ /* Name: rescale */ /* Description: Scale an array by divide each element by its length. */ /* This function should be called after FFT + IFFT. */ /* Input/Output parameters: */ /* - x: pointer on array to rescale (time or frequency). */ /*==========================================================================*) procedure TFFTReal.rescale(x: pflt_array); var mul : flt_t; i : longint; begin mul := 1.0 / _length; i := _length - 1; repeat x^[i] := x^[i] * mul; dec(i); until (i < 0); end; end. fftreal.pro000066400000000000000000000021061225012771600356710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealinclude(../../spectrum.pri) static: error(This library cannot be built for static linkage) TEMPLATE = lib TARGET = fftreal # FFTReal HEADERS += Array.h \ Array.hpp \ DynArray.h \ DynArray.hpp \ FFTRealFixLen.h \ FFTRealFixLen.hpp \ FFTRealFixLenParam.h \ FFTRealPassDirect.h \ FFTRealPassDirect.hpp \ FFTRealPassInverse.h \ FFTRealPassInverse.hpp \ FFTRealSelect.h \ FFTRealSelect.hpp \ FFTRealUseTrigo.h \ FFTRealUseTrigo.hpp \ OscSinCos.h \ OscSinCos.hpp \ def.h # Wrapper used to export the required instantiation of the FFTRealFixLen template HEADERS += fftreal_wrapper.h SOURCES += fftreal_wrapper.cpp DEFINES += FFTREAL_LIBRARY macx { CONFIG += lib_bundle } else { DESTDIR = ../..$${spectrum_build_dir} } EXAMPLE_FILES = bwins/fftreal.def eabi/fftreal.def readme.txt license.txt target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/spectrum INSTALLS += target fftreal_wrapper.cpp000066400000000000000000000032031225012771600374120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/*************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Lesser General Public License as ** published by the Free Software Foundation, either version 2.1. 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 ** . ** ***************************************************************************/ #include "fftreal_wrapper.h" // FFTReal code generates quite a lot of 'unused parameter' compiler warnings, // which we suppress here in order to get a clean build output. #if defined Q_CC_MSVC # pragma warning(disable:4100) #elif defined Q_CC_GNU # pragma GCC diagnostic ignored "-Wunused-parameter" #elif defined Q_CC_MWERKS # pragma warning off (10182) #endif #include "FFTRealFixLen.h" class FFTRealWrapperPrivate { public: FFTRealFixLen m_fft; }; FFTRealWrapper::FFTRealWrapper() : m_private(new FFTRealWrapperPrivate) { } FFTRealWrapper::~FFTRealWrapper() { delete m_private; } void FFTRealWrapper::calculateFFT(DataType in[], const DataType out[]) { m_private->m_fft.do_fft(in, out); } fftreal_wrapper.h000066400000000000000000000036711225012771600370700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/*************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Lesser General Public License as ** published by the Free Software Foundation, either version 2.1. 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 ** . ** ***************************************************************************/ #ifndef FFTREAL_WRAPPER_H #define FFTREAL_WRAPPER_H #include #if defined(FFTREAL_LIBRARY) # define FFTREAL_EXPORT Q_DECL_EXPORT #else # define FFTREAL_EXPORT Q_DECL_IMPORT #endif class FFTRealWrapperPrivate; // Each pass of the FFT processes 2^X samples, where X is the // number below. static const int FFTLengthPowerOfTwo = 12; /** * Wrapper around the FFTRealFixLen template provided by the FFTReal * library * * This class instantiates a single instance of FFTRealFixLen, using * FFTLengthPowerOfTwo as the template parameter. It then exposes * FFTRealFixLen::do_fft via the calculateFFT * function, thereby allowing an application to dynamically link * against the FFTReal implementation. * * See http://ldesoras.free.fr/prod.html */ class FFTREAL_EXPORT FFTRealWrapper { public: FFTRealWrapper(); ~FFTRealWrapper(); typedef float DataType; void calculateFFT(DataType in[], const DataType out[]); private: FFTRealWrapperPrivate* m_private; }; #endif // FFTREAL_WRAPPER_H license.txt000066400000000000000000000575061225012771600357250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS readme.txt000066400000000000000000000220351225012771600355250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal============================================================================== FFTReal Version 2.00, 2005/10/18 Fourier transformation (FFT, IFFT) library specialised for real data Portable ISO C++ (c) Laurent de Soras Object Pascal port (c) Frederic Vanmol ============================================================================== 1. Legal -------- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Check the file license.txt to get full information about the license. 2. Content ---------- FFTReal is a library to compute Discrete Fourier Transforms (DFT) with the FFT algorithm (Fast Fourier Transform) on arrays of real numbers. It can also compute the inverse transform. You should find in this package a lot of files ; some of them are of interest: - readme.txt: you are reading it - FFTReal.h: FFT, length fixed at run-time - FFTRealFixLen.h: FFT, length fixed at compile-time - FFTReal.pas: Pascal implementation (working but not up-to-date) - stopwatch directory 3. Using FFTReal ---------------- Important - if you were using older versions of FFTReal (up to 1.03), some things have changed. FFTReal is now a template. Therefore use FFTReal or FFTReal in your code depending on the application datatype. The flt_t typedef has been removed. You have two ways to use FFTReal. In the first way, the FFT has its length fixed at run-time, when the object is instanciated. It means that you have not to know the length when you write the code. This is the usual way of proceeding. 3.1 FFTReal - Length fixed at run-time -------------------------------------- Just instanciate one time a FFTReal object. Specify the data type you want as template parameter (only floating point: float, double, long double or custom type). The constructor precompute a lot of things, so it may be a bit long. The parameter is the number of points used for the next FFTs. It must be a power of 2: #include "FFTReal.h" ... long len = 1024; ... FFTReal fft_object (len); // 1024-point FFT object constructed. Then you can use this object to compute as many FFTs and IFFTs as you want. They will be computed very quickly because a lot of work has been done in the object construction. float x [1024]; float f [1024]; ... fft_object.do_fft (f, x); // x (real) --FFT---> f (complex) ... fft_object.do_ifft (f, x); // f (complex) --IFFT--> x (real) fft_object.rescale (x); // Post-scaling should be done after FFT+IFFT ... x [] and f [] are floating point number arrays. x [] is the real number sequence which we want to compute the FFT. f [] is the result, in the "frequency" domain. f has the same number of elements as x [], but f [] elements are complex numbers. The routine uses some FFT properties to optimize memory and to reduce calculations: the transformaton of a real number sequence is a conjugate complex number sequence: F [k] = F [-k]*. 3.2 FFTRealFixLen - Length fixed at compile-time ------------------------------------------------ This class is significantly faster than the previous one, giving a speed gain between 50 and 100 %. The template parameter is the base-2 logarithm of the FFT length. The datatype is float; it can be changed by modifying the DataType typedef in FFTRealFixLenParam.h. As FFTReal class, it supports only floating-point types or equivalent. To instanciate the object, just proceed as below: #include "FFTRealFixLen.h" ... FFTRealFixLen <10> fft_object; // 1024-point (2^10) FFT object constructed. Use is similar as the one of FFTReal. 3.3 Data organisation --------------------- Mathematically speaking, the formulas below show what does FFTReal: do_fft() : f(k) = sum (p = 0, N-1, x(p) * exp (+j*2*pi*k*p/N)) do_ifft(): x(k) = sum (p = 0, N-1, f(p) * exp (-j*2*pi*k*p/N)) Where j is the square root of -1. The formulas differ only by the sign of the exponential. When the sign is positive, the transform is called positive. Common formulas for Fourier transform are negative for the direct tranform and positive for the inverse one. However in these formulas, f is an array of complex numbers and doesn't correspound exactly to the f[] array taken as function parameter. The following table shows how the f[] sequence is mapped onto the usable FFT coefficients (called bins): FFTReal output | Positive FFT equiv. | Negative FFT equiv. ---------------+-----------------------+----------------------- f [0] | Real (bin 0) | Real (bin 0) f [...] | Real (bin ...) | Real (bin ...) f [length/2] | Real (bin length/2) | Real (bin length/2) f [length/2+1] | Imag (bin 1) | -Imag (bin 1) f [...] | Imag (bin ...) | -Imag (bin ...) f [length-1] | Imag (bin length/2-1) | -Imag (bin length/2-1) And FFT bins are distributed in f [] as above: | | Positive FFT | Negative FFT Bin | Real part | imaginary part | imaginary part ------------+----------------+-----------------+--------------- 0 | f [0] | 0 | 0 1 | f [1] | f [length/2+1] | -f [length/2+1] ... | f [...], | f [...] | -f [...] length/2-1 | f [length/2-1] | f [length-1] | -f [length-1] length/2 | f [length/2] | 0 | 0 length/2+1 | f [length/2-1] | -f [length-1] | f [length-1] ... | f [...] | -f [...] | f [...] length-1 | f [1] | -f [length/2+1] | f [length/2+1] f [] coefficients have the same layout for FFT and IFFT functions. You may notice that scaling must be done if you want to retrieve x after FFT and IFFT. Actually, IFFT (FFT (x)) = x * length(x). This is a not a problem because most of the applications don't care about absolute values. Thus, the operation requires less calculation. If you want to use the FFT and IFFT to transform a signal, you have to apply post- (or pre-) processing yourself. Multiplying or dividing floating point numbers by a power of 2 doesn't generate extra computation noise. 4. Compilation and testing -------------------------- Drop the following files into your project or makefile: Array.* def.h DynArray.* FFTReal*.cpp FFTReal*.h* OscSinCos.* Other files are for testing purpose only, do not include them if you just need to use the library ; they are not needed to use FFTReal in your own programs. FFTReal may be compiled in two versions: release and debug. Debug version has checks that could slow down the code. Define NDEBUG to set the Release mode. For example, the command line to compile the test bench on GCC would look like: Debug mode: g++ -Wall -o fftreal_debug.exe *.cpp stopwatch/*.cpp Release mode: g++ -Wall -o fftreal_release.exe -DNDEBUG -O3 *.cpp stopwatch/*.cpp It may be tricky to compile the test bench because the speed tests use the stopwatch sub-library, which is not that cross-platform. If you encounter any problem that you cannot easily fix while compiling it, edit the file test_settings.h and un-define the speed test macro. Remove the stopwatch directory from your source file list, too. If it's not done by default, you should activate the exception handling of your compiler to get the class memory-leak-safe. Thus, when a memory allocation fails (in the constructor), an exception is thrown and the entire object is safely destructed. It reduces the permanent error checking overhead in the client code. Also, the test bench requires Run-Time Type Information (RTTI) to be enabled in order to display the names of the tested classes - sometimes mangled, depending on the compiler. The test bench may take a long time to compile, especially in Release mode, because a lot of recursive templates are instanciated. 5. History ---------- v2.00 (2005.10.18) - Turned FFTReal class into template (data type as parameter) - Added FFTRealFixLen - Trigonometric tables are size-limited in order to preserve cache memory; over a given size, sin/cos functions are computed on the fly. - Better test bench for accuracy and speed v1.03 (2001.06.15) - Thanks to Frederic Vanmol for the Pascal port (works with Delphi). - Documentation improvement v1.02 (2001.03.25) - sqrt() is now precomputed when the object FFTReal is constructed, resulting in speed impovement for small size FFT. v1.01 (2000) - Small modifications, I don't remember what. v1.00 (1999.08.14) - First version released stopwatch/000077500000000000000000000000001225012771600355415ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealClockCycleCounter.cpp000066400000000000000000000155601225012771600416270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** ClockCycleCounter.cpp Copyright (c) 2003 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (_MSC_VER) #pragma warning (1 : 4130) // "'operator' : logical operation on address of string constant" #pragma warning (1 : 4223) // "nonstandard extension used : non-lvalue array converted to pointer" #pragma warning (1 : 4705) // "statement has no effect" #pragma warning (1 : 4706) // "assignment within conditional expression" #pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information" #pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)" #pragma warning (4 : 4355) // "'this' : used in base member initializer list" #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "ClockCycleCounter.h" #include namespace stopwatch { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /* ============================================================================== Name: ctor Description: The first object constructed initialise global data. This first construction may be a bit slow. Throws: Nothing ============================================================================== */ ClockCycleCounter::ClockCycleCounter () : _start_time (0) , _state (0) , _best_score (-1) { if (! _init_flag) { // Should be executed in this order compute_clk_mul (); compute_measure_time_total (); compute_measure_time_lap (); // Restores object state _start_time = 0; _state = 0; _best_score = -1; _init_flag = true; } } /* ============================================================================== Name: get_time_total Description: Gives the time elapsed between the latest stop_lap() and start() calls. Returns: The duration, in clock cycles. Throws: Nothing ============================================================================== */ Int64 ClockCycleCounter::get_time_total () const { const Int64 duration = _state - _start_time; assert (duration >= 0); const Int64 t = max ( duration - _measure_time_total, static_cast (0) ); return (t * _clk_mul); } /* ============================================================================== Name: get_time_best_lap Description: Gives the smallest time between two consecutive stop_lap() or between the stop_lap() and start(). The value is reset by a call to start(). Call this function only after a stop_lap(). The time is amputed from the duration of the stop_lap() call itself. Returns: The smallest duration, in clock cycles. Throws: Nothing ============================================================================== */ Int64 ClockCycleCounter::get_time_best_lap () const { assert (_best_score >= 0); const Int64 t1 = max ( _best_score - _measure_time_lap, static_cast (0) ); const Int64 t = min (t1, get_time_total ()); return (t * _clk_mul); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #if defined (__MACOS__) static inline double stopwatch_ClockCycleCounter_get_time_s () { const Nanoseconds ns = AbsoluteToNanoseconds (UpTime ()); return (ns.hi * 4294967296e-9 + ns.lo * 1e-9); } #endif // __MACOS__ /* ============================================================================== Name: compute_clk_mul Description: This function, only for PowerPC/MacOS computers, computes the multiplier required to deduce clock cycles from the internal counter. Throws: Nothing ============================================================================== */ void ClockCycleCounter::compute_clk_mul () { assert (! _init_flag); #if defined (__MACOS__) long clk_speed_mhz = CurrentProcessorSpeed (); const Int64 clk_speed = static_cast (clk_speed_mhz) * (1000L*1000L); const double start_time_s = stopwatch_ClockCycleCounter_get_time_s (); start (); const double duration = 0.01; // Seconds while (stopwatch_ClockCycleCounter_get_time_s () - start_time_s < duration) { continue; } const double stop_time_s = stopwatch_ClockCycleCounter_get_time_s (); stop (); const double diff_time_s = stop_time_s - start_time_s; const double nbr_cycles = diff_time_s * static_cast (clk_speed); const Int64 diff_time_c = _state - _start_time; const double clk_mul = nbr_cycles / static_cast (diff_time_c); _clk_mul = round_int (clk_mul); #endif // __MACOS__ } void ClockCycleCounter::compute_measure_time_total () { start (); spend_time (); Int64 best_result = 0x7FFFFFFFL; // Should be enough long nbr_tests = 100; for (long cnt = 0; cnt < nbr_tests; ++cnt) { start (); stop_lap (); const Int64 duration = _state - _start_time; best_result = min (best_result, duration); } _measure_time_total = best_result; } /* ============================================================================== Name: compute_measure_time_lap Description: Computes the duration of one stop_lap() call and store it. It will be used later to get the real duration of the measured operation (by substracting the measurement duration). Throws: Nothing ============================================================================== */ void ClockCycleCounter::compute_measure_time_lap () { start (); spend_time (); long nbr_tests = 10; for (long cnt = 0; cnt < nbr_tests; ++cnt) { stop_lap (); stop_lap (); stop_lap (); stop_lap (); } _measure_time_lap = _best_score; } void ClockCycleCounter::spend_time () { const Int64 nbr_clocks = 500; // Number of clock cycles to spend const Int64 start = read_clock_counter (); Int64 current; do { current = read_clock_counter (); } while ((current - start) * _clk_mul < nbr_clocks); } Int64 ClockCycleCounter::_measure_time_total = 0; Int64 ClockCycleCounter::_measure_time_lap = 0; int ClockCycleCounter::_clk_mul = 1; bool ClockCycleCounter::_init_flag = false; } // namespace stopwatch /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ ClockCycleCounter.h000066400000000000000000000055431225012771600412740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** ClockCycleCounter.h Copyright (c) 2003 Laurent de Soras Instrumentation class, for accurate time interval measurement. You may have to modify the implementation to adapt it to your system and/or compiler. --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (stopwatch_ClockCycleCounter_HEADER_INCLUDED) #define stopwatch_ClockCycleCounter_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "def.h" #include "Int64.h" namespace stopwatch { class ClockCycleCounter { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: ClockCycleCounter (); stopwatch_FORCEINLINE void start (); stopwatch_FORCEINLINE void stop_lap (); Int64 get_time_total () const; Int64 get_time_best_lap () const; /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: void compute_clk_mul (); void compute_measure_time_total (); void compute_measure_time_lap (); static void spend_time (); static stopwatch_FORCEINLINE Int64 read_clock_counter (); Int64 _start_time; Int64 _state; Int64 _best_score; static Int64 _measure_time_total; static Int64 _measure_time_lap; static int _clk_mul; static bool _init_flag; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: ClockCycleCounter (const ClockCycleCounter &other); ClockCycleCounter & operator = (const ClockCycleCounter &other); bool operator == (const ClockCycleCounter &other); bool operator != (const ClockCycleCounter &other); }; // class ClockCycleCounter } // namespace stopwatch #include "ClockCycleCounter.hpp" #endif // stopwatch_ClockCycleCounter_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ ClockCycleCounter.hpp000066400000000000000000000067561225012771600416430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** ClockCycleCounter.hpp Copyright (c) 2003 Laurent de Soras Please complete the definitions according to your compiler/architecture. It's not a big deal if it's not possible to get the clock count... --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (stopwatch_ClockCycleCounter_CURRENT_CODEHEADER) #error Recursive inclusion of ClockCycleCounter code header. #endif #define stopwatch_ClockCycleCounter_CURRENT_CODEHEADER #if ! defined (stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED) #define stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "fnc.h" #include namespace stopwatch { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /* ============================================================================== Name: start Description: Starts the counter. Throws: Nothing ============================================================================== */ void ClockCycleCounter::start () { _best_score = (static_cast (1) << (sizeof (Int64) * CHAR_BIT - 2)); const Int64 start_clock = read_clock_counter (); _start_time = start_clock; _state = start_clock - _best_score; } /* ============================================================================== Name: stop_lap Description: Captures the current time and updates the smallest duration between two consecutive calls to stop_lap() or the latest start(). start() must have been called at least once before calling this function. Throws: Nothing ============================================================================== */ void ClockCycleCounter::stop_lap () { const Int64 end_clock = read_clock_counter (); _best_score = min (end_clock - _state, _best_score); _state = end_clock; } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ Int64 ClockCycleCounter::read_clock_counter () { register Int64 clock_cnt; #if defined (_MSC_VER) __asm { lea edi, clock_cnt rdtsc mov [edi ], eax mov [edi + 4], edx } #elif defined (__GNUC__) && defined (__i386__) __asm__ __volatile__ ("rdtsc" : "=A" (clock_cnt)); #elif (__MWERKS__) && defined (__POWERPC__) asm { loop: mftbu clock_cnt@hiword mftb clock_cnt@loword mftbu r5 cmpw clock_cnt@hiword,r5 bne loop } #endif return (clock_cnt); } } // namespace stopwatch #endif // stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED #undef stopwatch_ClockCycleCounter_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ Int64.h000066400000000000000000000031561225012771600366230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** Int64.h Copyright (c) 2003 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (stopwatch_Int64_HEADER_INCLUDED) #define stopwatch_Int64_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ namespace stopwatch { #if defined (_MSC_VER) typedef __int64 Int64; #elif defined (__MWERKS__) || defined (__GNUC__) typedef long long Int64; #elif defined (__BEOS__) typedef int64 Int64; #else #error No 64-bit integer type defined for this compiler ! #endif } // namespace stopwatch #endif // stopwatch_Int64_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ StopWatch.cpp000066400000000000000000000050401225012771600401600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** StopWatch.cpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (_MSC_VER) #pragma warning (1 : 4130) // "'operator' : logical operation on address of string constant" #pragma warning (1 : 4223) // "nonstandard extension used : non-lvalue array converted to pointer" #pragma warning (1 : 4705) // "statement has no effect" #pragma warning (1 : 4706) // "assignment within conditional expression" #pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information" #pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)" #pragma warning (4 : 4355) // "'this' : used in base member initializer list" #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "StopWatch.h" #include namespace stopwatch { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ StopWatch::StopWatch () : _ccc () , _nbr_laps (0) { // Nothing } double StopWatch::get_time_total (Int64 nbr_op) const { assert (_nbr_laps > 0); assert (nbr_op > 0); return ( static_cast (_ccc.get_time_total ()) / (static_cast (nbr_op) * static_cast (_nbr_laps)) ); } double StopWatch::get_time_best_lap (Int64 nbr_op) const { assert (nbr_op > 0); return ( static_cast (_ccc.get_time_best_lap ()) / static_cast (nbr_op) ); } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ } // namespace stopwatch /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ StopWatch.h000066400000000000000000000045731225012771600376370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** StopWatch.h Copyright (c) 2005 Laurent de Soras Utility class based on ClockCycleCounter to measure the unit time of a repeated operation. --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (stopwatch_StopWatch_HEADER_INCLUDED) #define stopwatch_StopWatch_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "ClockCycleCounter.h" namespace stopwatch { class StopWatch { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ public: StopWatch (); stopwatch_FORCEINLINE void start (); stopwatch_FORCEINLINE void stop_lap (); double get_time_total (Int64 nbr_op) const; double get_time_best_lap (Int64 nbr_op) const; /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ protected: /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: ClockCycleCounter _ccc; Int64 _nbr_laps; /*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ private: StopWatch (const StopWatch &other); StopWatch & operator = (const StopWatch &other); bool operator == (const StopWatch &other); bool operator != (const StopWatch &other); }; // class StopWatch } // namespace stopwatch #include "StopWatch.hpp" #endif // stopwatch_StopWatch_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ StopWatch.hpp000066400000000000000000000035701225012771600401730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** StopWatch.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (stopwatch_StopWatch_CURRENT_CODEHEADER) #error Recursive inclusion of StopWatch code header. #endif #define stopwatch_StopWatch_CURRENT_CODEHEADER #if ! defined (stopwatch_StopWatch_CODEHEADER_INCLUDED) #define stopwatch_StopWatch_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ namespace stopwatch { /*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ void StopWatch::start () { _nbr_laps = 0; _ccc.start (); } void StopWatch::stop_lap () { _ccc.stop_lap (); ++ _nbr_laps; } /*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ } // namespace stopwatch #endif // stopwatch_StopWatch_CODEHEADER_INCLUDED #undef stopwatch_StopWatch_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ def.h000066400000000000000000000027521225012771600364560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** def.h Copyright (c) 2003 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (stopwatch_def_HEADER_INCLUDED) #define stopwatch_def_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ namespace stopwatch { #if defined (_MSC_VER) #define stopwatch_FORCEINLINE __forceinline #else #define stopwatch_FORCEINLINE inline #endif } // namespace stopwatch #endif // stopwatch_def_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ fnc.h000066400000000000000000000030001225012771600364510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** fnc.h Copyright (c) 2003 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (stopwatch_fnc_HEADER_INCLUDED) #define stopwatch_fnc_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ namespace stopwatch { template inline T min (T a, T b); template inline T max (T a, T b); inline int round_int (double x); } // namespace rsp #include "fnc.hpp" #endif // stopwatch_fnc_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ fnc.hpp000066400000000000000000000034121225012771600370200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/stopwatch/***************************************************************************** fnc.hpp Copyright (c) 2003 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (stopwatch_fnc_CURRENT_CODEHEADER) #error Recursive inclusion of fnc code header. #endif #define stopwatch_fnc_CURRENT_CODEHEADER #if ! defined (stopwatch_fnc_CODEHEADER_INCLUDED) #define stopwatch_fnc_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include #include namespace std {} namespace stopwatch { template inline T min (T a, T b) { return ((a < b) ? a : b); } template inline T max (T a, T b) { return ((b < a) ? a : b); } int round_int (double x) { using namespace std; return (static_cast (floor (x + 0.5))); } } // namespace stopwatch #endif // stopwatch_fnc_CODEHEADER_INCLUDED #undef stopwatch_fnc_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ test.cpp000066400000000000000000000144471225012771600352220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** test.cpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (_MSC_VER) #pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information" #pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)" #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ #include "test_settings.h" #include "TestHelperFixLen.h" #include "TestHelperNormal.h" #if defined (_MSC_VER) #include #include #endif // _MSC_VER #include #include #include #define TEST_ /*\\\ FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ static int TEST_perform_test_accuracy_all (); static int TEST_perform_test_speed_all (); static void TEST_prog_init (); static void TEST_prog_end (); int main (int argc, char *argv []) { using namespace std; int ret_val = 0; TEST_prog_init (); try { if (ret_val == 0) { ret_val = TEST_perform_test_accuracy_all (); } if (ret_val == 0) { ret_val = TEST_perform_test_speed_all (); } } catch (std::exception &e) { printf ("\n*** main(): Exception (std::exception) : %s\n", e.what ()); ret_val = -1; } catch (...) { printf ("\n*** main(): Undefined exception\n"); ret_val = -1; } TEST_prog_end (); return (ret_val); } int TEST_perform_test_accuracy_all () { int ret_val = 0; TestHelperNormal ::perform_test_accuracy (ret_val); TestHelperNormal ::perform_test_accuracy (ret_val); TestHelperFixLen < 1>::perform_test_accuracy (ret_val); TestHelperFixLen < 2>::perform_test_accuracy (ret_val); TestHelperFixLen < 3>::perform_test_accuracy (ret_val); TestHelperFixLen < 4>::perform_test_accuracy (ret_val); TestHelperFixLen < 7>::perform_test_accuracy (ret_val); TestHelperFixLen < 8>::perform_test_accuracy (ret_val); TestHelperFixLen <10>::perform_test_accuracy (ret_val); TestHelperFixLen <12>::perform_test_accuracy (ret_val); TestHelperFixLen <13>::perform_test_accuracy (ret_val); return (ret_val); } int TEST_perform_test_speed_all () { int ret_val = 0; #if defined (test_settings_SPEED_TEST_ENABLED) TestHelperNormal ::perform_test_speed (ret_val); TestHelperNormal ::perform_test_speed (ret_val); TestHelperFixLen < 1>::perform_test_speed (ret_val); TestHelperFixLen < 2>::perform_test_speed (ret_val); TestHelperFixLen < 3>::perform_test_speed (ret_val); TestHelperFixLen < 4>::perform_test_speed (ret_val); TestHelperFixLen < 7>::perform_test_speed (ret_val); TestHelperFixLen < 8>::perform_test_speed (ret_val); TestHelperFixLen <10>::perform_test_speed (ret_val); TestHelperFixLen <12>::perform_test_speed (ret_val); TestHelperFixLen <14>::perform_test_speed (ret_val); TestHelperFixLen <16>::perform_test_speed (ret_val); TestHelperFixLen <20>::perform_test_speed (ret_val); #endif return (ret_val); } #if defined (_MSC_VER) static int __cdecl TEST_new_handler_cb (size_t dummy) { throw std::bad_alloc (); return (0); } #endif // _MSC_VER #if defined (_MSC_VER) && ! defined (NDEBUG) static int __cdecl TEST_debug_alloc_hook_cb (int alloc_type, void *user_data_ptr, size_t size, int block_type, long request_nbr, const unsigned char *filename_0, int line_nbr) { if (block_type != _CRT_BLOCK) // Ignore CRT blocks to prevent infinite recursion { switch (alloc_type) { case _HOOK_ALLOC: case _HOOK_REALLOC: case _HOOK_FREE: // Put some debug code here break; default: assert (false); // Undefined allocation type break; } } return (1); } #endif #if defined (_MSC_VER) && ! defined (NDEBUG) static int __cdecl TEST_debug_report_hook_cb (int report_type, char *user_msg_0, int *ret_val_ptr) { *ret_val_ptr = 0; // 1 to override the CRT default reporting mode switch (report_type) { case _CRT_WARN: case _CRT_ERROR: case _CRT_ASSERT: // Put some debug code here break; } return (*ret_val_ptr); } #endif static void TEST_prog_init () { #if defined (_MSC_VER) ::_set_new_handler (::TEST_new_handler_cb); #endif // _MSC_VER #if defined (_MSC_VER) && ! defined (NDEBUG) { const int mode = (1 * _CRTDBG_MODE_DEBUG) | (1 * _CRTDBG_MODE_WNDW); ::_CrtSetReportMode (_CRT_WARN, mode); ::_CrtSetReportMode (_CRT_ERROR, mode); ::_CrtSetReportMode (_CRT_ASSERT, mode); const int old_flags = ::_CrtSetDbgFlag (_CRTDBG_REPORT_FLAG); ::_CrtSetDbgFlag ( old_flags | (1 * _CRTDBG_LEAK_CHECK_DF) | (1 * _CRTDBG_CHECK_ALWAYS_DF)); ::_CrtSetBreakAlloc (-1); // Specify here a memory bloc number ::_CrtSetAllocHook (TEST_debug_alloc_hook_cb); ::_CrtSetReportHook (TEST_debug_report_hook_cb); // Speed up I/O but breaks C stdio compatibility // std::cout.sync_with_stdio (false); // std::cin.sync_with_stdio (false); // std::cerr.sync_with_stdio (false); // std::clog.sync_with_stdio (false); } #endif // _MSC_VER, NDEBUG } static void TEST_prog_end () { #if defined (_MSC_VER) && ! defined (NDEBUG) { const int mode = (1 * _CRTDBG_MODE_DEBUG) | (0 * _CRTDBG_MODE_WNDW); ::_CrtSetReportMode (_CRT_WARN, mode); ::_CrtSetReportMode (_CRT_ERROR, mode); ::_CrtSetReportMode (_CRT_ASSERT, mode); ::_CrtMemState mem_state; ::_CrtMemCheckpoint (&mem_state); ::_CrtMemDumpStatistics (&mem_state); } #endif // _MSC_VER, NDEBUG } /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ test_fnc.h000066400000000000000000000026271225012771600355120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** test_fnc.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (test_fnc_HEADER_INCLUDED) #define test_fnc_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template inline T limit (const T &x, const T &inf, const T &sup); #include "test_fnc.hpp" #endif // test_fnc_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ test_fnc.hpp000066400000000000000000000030341225012771600360430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** test_fnc.hpp Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if defined (test_fnc_CURRENT_CODEHEADER) #error Recursive inclusion of test_fnc code header. #endif #define test_fnc_CURRENT_CODEHEADER #if ! defined (test_fnc_CODEHEADER_INCLUDED) #define test_fnc_CODEHEADER_INCLUDED /*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ template T limit (const T &x, const T &inf, const T &sup) { assert (! (sup < inf)); return ((x < inf) ? inf : ((sup < x) ? sup : x)); } #endif // test_fnc_CODEHEADER_INCLUDED #undef test_fnc_CURRENT_CODEHEADER /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ test_settings.h000066400000000000000000000025211225012771600365750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftreal/***************************************************************************** test_settings.h Copyright (c) 2005 Laurent de Soras --- Legal stuff --- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *Tab=3***********************************************************************/ #if ! defined (test_settings_HEADER_INCLUDED) #define test_settings_HEADER_INCLUDED #if defined (_MSC_VER) #pragma once #pragma warning (4 : 4250) // "Inherits via dominance." #endif // #undef this label to avoid speed test compilation. #define test_settings_SPEED_TEST_ENABLED #endif // test_settings_HEADER_INCLUDED /*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ testapp.dpr000066400000000000000000000067311225012771600357230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/3rdparty/fftrealprogram testapp; {$APPTYPE CONSOLE} uses SysUtils, fftreal in 'fftreal.pas', Math, Windows; var nbr_points : longint; x, f : pflt_array; fft : TFFTReal; i : longint; PI : double; areal, img : double; f_abs : double; buffer_size : longint; nbr_tests : longint; time0, time1, time2 : int64; timereso : int64; offset : longint; t0, t1 : double; nbr_s_chn : longint; tempp1, tempp2 : pflt_array; begin (*______________________________________________ * * Exactness test *______________________________________________ *) WriteLn('Accuracy test:'); WriteLn; nbr_points := 16; // Power of 2 GetMem(x, nbr_points * sizeof_flt); GetMem(f, nbr_points * sizeof_flt); fft := TFFTReal.Create(nbr_points); // FFT object initialized here // Test signal PI := ArcTan(1) * 4; for i := 0 to nbr_points-1 do begin x^[i] := -1 + sin (3*2*PI*i/nbr_points) + cos (5*2*PI*i/nbr_points) * 2 - sin (7*2*PI*i/nbr_points) * 3 + cos (8*2*PI*i/nbr_points) * 5; end; // Compute FFT and IFFT fft.do_fft(f, x); fft.do_ifft(f, x); fft.rescale(x); // Display the result WriteLn('FFT:'); for i := 0 to nbr_points div 2 do begin areal := f^[i]; if (i > 0) and (i < nbr_points div 2) then img := f^[i + nbr_points div 2] else img := 0; f_abs := Sqrt(areal * areal + img * img); WriteLn(Format('%5d: %12.6f %12.6f (%12.6f)', [i, areal, img, f_abs])); end; WriteLn; WriteLn('IFFT:'); for i := 0 to nbr_points-1 do WriteLn(Format('%5d: %f', [i, x^[i]])); WriteLn; FreeMem(x); FreeMem(f); fft.Free; (*______________________________________________ * * Speed test *______________________________________________ *) WriteLn('Speed test:'); WriteLn('Please wait...'); WriteLn; nbr_points := 1024; // Power of 2 buffer_size := 256*nbr_points; // Number of flt_t (float or double) nbr_tests := 10000; assert(nbr_points <= buffer_size); GetMem(x, buffer_size * sizeof_flt); GetMem(f, buffer_size * sizeof_flt); fft := TFFTReal.Create(nbr_points); // FFT object initialized here // Test signal: noise for i := 0 to nbr_points-1 do x^[i] := Random($7fff) - ($7fff shr 1); // timing QueryPerformanceFrequency(timereso); QueryPerformanceCounter(time0); for i := 0 to nbr_tests-1 do begin offset := (i * nbr_points) and (buffer_size - 1); tempp1 := f; inc(tempp1, offset); tempp2 := x; inc(tempp2, offset); fft.do_fft(tempp1, tempp2); end; QueryPerformanceCounter(time1); for i := 0 to nbr_tests-1 do begin offset := (i * nbr_points) and (buffer_size - 1); tempp1 := f; inc(tempp1, offset); tempp2 := x; inc(tempp2, offset); fft.do_ifft(tempp1, tempp2); fft.rescale(x); end; QueryPerformanceCounter(time2); t0 := ((time1-time0) / timereso) / nbr_tests; t1 := ((time2-time1) / timereso) / nbr_tests; WriteLn(Format('%d-points FFT : %.0f us.', [nbr_points, t0 * 1000000])); WriteLn(Format('%d-points IFFT + scaling: %.0f us.', [nbr_points, t1 * 1000000])); nbr_s_chn := Floor(nbr_points / ((t0 + t1) * 44100 * 2)); WriteLn(Format('Peak performance: FFT+IFFT on %d mono channels at 44.1 KHz (with overlapping)', [nbr_s_chn])); WriteLn; FreeMem(x); FreeMem(f); fft.Free; WriteLn('Press [Return] key to terminate...'); ReadLn; end. qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/README.txt000066400000000000000000000121671225012771600321160ustar00rootroot00000000000000Spectrum analyser demo app ========================== Introduction ------------ This application is a demo which uses the Qt Multimedia APIs to capture and play back PCM audio. While either recording or playback is ongoing, the application performs real-time level and frequency spectrum analysis, displaying the results in its main window. Acknowledgments --------------- The application uses the FFTReal v2.00 library by Laurent de Soras to perform frequency analysis of the audio signal. For further information, see the project home page: http://ldesoras.free.fr/prod.html Quick start ----------- Play generated tone 1. Select 'Play generated tone' from the mode menu 2. Ensure that the 'Frequency sweep' box is checked 3. Press 'OK' 4. Press the play button You should hear a rising tone, and see progressively higher frequencies indicated by the spectrograph. Record and playback 1. Select 'Record and play back audio' from the mode menu 2. Press the record button, and speak into the microphone 3. Wait until the buffer is full (shown as a full blue bar in the top widget) 4. Press play, and wait until playback of the buffer is complete Play file 1. Select 'Play file' from the mode menu 2. Select a WAV file 3. Press the play button You should hear the first few seconds of the file being played. The waveform, spectrograph and level meter should be updated as the file is played. Things to play with ------------------- Try repeating the 'Play generated tone' sequence using different window functions. These can be selected from the settings dialog - launch it by pressing the spanner icon. The window function is applied to the audio signal before performing the frequency analysis; different windows should have a visible effect on the resulting frequency spectrum. Try clicking on one of the spectrograph bars while the tone is being played. The frequency range for that bar will be displayed at the top of the application window. Troubleshooting --------------- If either recording or playback do not work, you may need to select a different input / output audio device. This can be done in the settings dialog - launch it by pressing the spanner icon. If that doesn't work, there may be a problem either in the application or in Qt. Report a bug in the usual way. Application interface --------------------- The main window of the application contains the following widgets, starting at the top: Message box This shows various messages during execution, such as the current audio format. Progress bar / waveform display - While recording or playback is ongoing, the audio waveform is displayed, sliding from right to left. - Superimposed on the waveform, the amount of data currently in the buffer is showed as a blue bar. When recording, this blue bar fills up from left to right; when playing, the bar gets consumed from left to right. - A green window shows which part of the buffer has most recently been analysed. This window should be close to the 'leading edge' of recording or playback, i.e. the most recently recorded / played data, although it will lag slightly depending on the performance of the machine on which the application is running. Frequency spectrograph (on the left) The spectrograph shows 10 bars, each representing a frequency range. The frequency range of each bar is displayed in the message box when the bar is clicked. The height of the bar shows the maximum amplitude of freqencies within its range. Level meter (on the right) The current peak audio level is shown as a pink bar; the current RMS level is shown as a red bar. The 'high water mark' during a recent period is shown as a thin red line. Button panel - The mode menu allows switching between the three operation modes - 'Play generated tone', 'Record and play back' and 'Play file'. - The record button starts or resumes audio capture from the current input device. - The pause button suspends either capture or recording. - The play button starts or resumes audio playback to the current output device. - The settings button launches the settings dialog. Hacking ------- If you want to hack the application, here are some pointers to get started. The spectrum.pri file contains several macros which you can enable by uncommenting: - LOG_FOO Enable logging from class Foo via qDebug() - DUMP_FOO Dump data from class Foo to the file system e.g. DUMP_SPECTRUMANALYSER writes files containing the raw FFT input and output. Be aware that this can generate a *lot* of data and may slow the app down considerably. - DISABLE_FOO Disable specified functionality If you don't like the combination of the waveform and progress bar in a single widget, separate them by commenting out SUPERIMPOSE_PROGRESS_ON_WAVEFORM. The spectrum.h file defines a number of parameters which can be played with. These control things such as the number of audio samples analysed per FFT calculation, the range and number of bands displayed by the spectrograph, and so on. The part of the application which interacts with Qt Multimedia is in the Engine class. Some ideas for enhancements to the app are listed in TODO.txt. Feel free to start work on any of them :) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/TODO.txt000066400000000000000000000017251225012771600317240ustar00rootroot00000000000000TODO list for spectrum analyser =============================== Bug fixes --------- New features ------------ * Wrap user-visible strings in tr() * Allow user to set frequency range There should be some constraints on this, e.g. - Maximum frequency must not be greater than Nyquist frequency - Range is divisible by number of bars? * Add more visualizers other than bar spectrogram e.g. Funky OpenGL visualizers, particle effects etc Non-functional stuff -------------------- * Improve robustness of QComboBox -> enum mapping At the moment, SettingsDialog relies on casting the combobox item index directly to the enumerated type. This is clearly a bit fragile... * For functions which take or return qint64 values, make a clear distinction between duration (microseconds) and length (bytes). A sensible convention would be that the default is bytes - i.e. microseconds must be indicated by adding a Us suffix, where not already obvious from the function name. qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/000077500000000000000000000000001225012771600311715ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/app.pro000066400000000000000000000046231225012771600325000ustar00rootroot00000000000000include(../spectrum.pri) static: error(This application cannot be statically linked to the fftreal library) TEMPLATE = app TARGET = spectrum QT += multimedia widgets SOURCES += main.cpp \ engine.cpp \ frequencyspectrum.cpp \ levelmeter.cpp \ mainwidget.cpp \ progressbar.cpp \ settingsdialog.cpp \ spectrograph.cpp \ spectrumanalyser.cpp \ tonegenerator.cpp \ tonegeneratordialog.cpp \ utils.cpp \ waveform.cpp \ wavfile.cpp HEADERS += engine.h \ frequencyspectrum.h \ levelmeter.h \ mainwidget.h \ progressbar.h \ settingsdialog.h \ spectrograph.h \ spectrum.h \ spectrumanalyser.h \ tonegenerator.h \ tonegeneratordialog.h \ utils.h \ waveform.h \ wavfile.h fftreal_dir = ../3rdparty/fftreal INCLUDEPATH += $${fftreal_dir} RESOURCES = spectrum.qrc # Dynamic linkage against FFTReal DLL !contains(DEFINES, DISABLE_FFT) { macx { # Link to fftreal framework LIBS += -F$${fftreal_dir} LIBS += -framework fftreal } else { LIBS += -L..$${spectrum_build_dir} LIBS += -lfftreal } } target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/spectrum INSTALLS += target # Deployment DESTDIR = ..$${spectrum_build_dir} macx { !contains(DEFINES, DISABLE_FFT) { # Relocate fftreal.framework into spectrum.app bundle framework_dir = ../spectrum.app/Contents/Frameworks framework_name = fftreal.framework/Versions/1/fftreal QMAKE_POST_LINK = \ mkdir -p $${framework_dir} &&\ rm -rf $${framework_dir}/fftreal.framework &&\ cp -R $${fftreal_dir}/fftreal.framework $${framework_dir} &&\ install_name_tool -id @executable_path/../Frameworks/$${framework_name} \ $${framework_dir}/$${framework_name} &&\ install_name_tool -change $${framework_name} \ @executable_path/../Frameworks/$${framework_name} \ ../spectrum.app/Contents/MacOS/spectrum } } else { linux-g++*: { # Provide relative path from application to fftreal library QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN } } engine.cpp000066400000000000000000000624711225012771600330750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "engine.h" #include "tonegenerator.h" #include "utils.h" #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- // Constants //----------------------------------------------------------------------------- const qint64 BufferDurationUs = 10 * 1000000; const int NotifyIntervalMs = 100; // Size of the level calculation window in microseconds const int LevelWindowUs = 0.1 * 1000000; //----------------------------------------------------------------------------- // Constructor and destructor //----------------------------------------------------------------------------- Engine::Engine(QObject *parent) : QObject(parent) , m_mode(QAudio::AudioInput) , m_state(QAudio::StoppedState) , m_generateTone(false) , m_file(0) , m_analysisFile(0) , m_availableAudioInputDevices (QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) , m_audioInputDevice(QAudioDeviceInfo::defaultInputDevice()) , m_audioInput(0) , m_audioInputIODevice(0) , m_recordPosition(0) , m_availableAudioOutputDevices (QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) , m_audioOutputDevice(QAudioDeviceInfo::defaultOutputDevice()) , m_audioOutput(0) , m_playPosition(0) , m_bufferPosition(0) , m_bufferLength(0) , m_dataLength(0) , m_levelBufferLength(0) , m_rmsLevel(0.0) , m_peakLevel(0.0) , m_spectrumBufferLength(0) , m_spectrumAnalyser() , m_spectrumPosition(0) , m_count(0) { qRegisterMetaType("FrequencySpectrum"); qRegisterMetaType("WindowFunction"); CHECKED_CONNECT(&m_spectrumAnalyser, SIGNAL(spectrumChanged(FrequencySpectrum)), this, SLOT(spectrumChanged(FrequencySpectrum))); initialize(); #ifdef DUMP_DATA createOutputDir(); #endif #ifdef DUMP_SPECTRUM m_spectrumAnalyser.setOutputPath(outputPath()); #endif } Engine::~Engine() { } //----------------------------------------------------------------------------- // Public functions //----------------------------------------------------------------------------- bool Engine::loadFile(const QString &fileName) { reset(); bool result = false; Q_ASSERT(!m_generateTone); Q_ASSERT(!m_file); Q_ASSERT(!fileName.isEmpty()); m_file = new WavFile(this); if (m_file->open(fileName)) { if (isPCMS16LE(m_file->fileFormat())) { result = initialize(); } else { emit errorMessage(tr("Audio format not supported"), formatToString(m_file->fileFormat())); } } else { emit errorMessage(tr("Could not open file"), fileName); } if (result) { m_analysisFile = new WavFile(this); m_analysisFile->open(fileName); } return result; } bool Engine::generateTone(const Tone &tone) { reset(); Q_ASSERT(!m_generateTone); Q_ASSERT(!m_file); m_generateTone = true; m_tone = tone; ENGINE_DEBUG << "Engine::generateTone" << "startFreq" << m_tone.startFreq << "endFreq" << m_tone.endFreq << "amp" << m_tone.amplitude; return initialize(); } bool Engine::generateSweptTone(qreal amplitude) { Q_ASSERT(!m_generateTone); Q_ASSERT(!m_file); m_generateTone = true; m_tone.startFreq = 1; m_tone.endFreq = 0; m_tone.amplitude = amplitude; ENGINE_DEBUG << "Engine::generateSweptTone" << "startFreq" << m_tone.startFreq << "amp" << m_tone.amplitude; return initialize(); } bool Engine::initializeRecord() { reset(); ENGINE_DEBUG << "Engine::initializeRecord"; Q_ASSERT(!m_generateTone); Q_ASSERT(!m_file); m_generateTone = false; m_tone = SweptTone(); return initialize(); } qint64 Engine::bufferLength() const { return m_file ? m_file->size() : m_bufferLength; } void Engine::setWindowFunction(WindowFunction type) { m_spectrumAnalyser.setWindowFunction(type); } //----------------------------------------------------------------------------- // Public slots //----------------------------------------------------------------------------- void Engine::startRecording() { if (m_audioInput) { if (QAudio::AudioInput == m_mode && QAudio::SuspendedState == m_state) { m_audioInput->resume(); } else { m_spectrumAnalyser.cancelCalculation(); spectrumChanged(0, 0, FrequencySpectrum()); m_buffer.fill(0); setRecordPosition(0, true); stopPlayback(); m_mode = QAudio::AudioInput; CHECKED_CONNECT(m_audioInput, SIGNAL(stateChanged(QAudio::State)), this, SLOT(audioStateChanged(QAudio::State))); CHECKED_CONNECT(m_audioInput, SIGNAL(notify()), this, SLOT(audioNotify())); m_count = 0; m_dataLength = 0; emit dataLengthChanged(0); m_audioInputIODevice = m_audioInput->start(); CHECKED_CONNECT(m_audioInputIODevice, SIGNAL(readyRead()), this, SLOT(audioDataReady())); } } } void Engine::startPlayback() { if (m_audioOutput) { if (QAudio::AudioOutput == m_mode && QAudio::SuspendedState == m_state) { #ifdef Q_OS_WIN // The Windows backend seems to internally go back into ActiveState // while still returning SuspendedState, so to ensure that it doesn't // ignore the resume() call, we first re-suspend m_audioOutput->suspend(); #endif m_audioOutput->resume(); } else { m_spectrumAnalyser.cancelCalculation(); spectrumChanged(0, 0, FrequencySpectrum()); setPlayPosition(0, true); stopRecording(); m_mode = QAudio::AudioOutput; CHECKED_CONNECT(m_audioOutput, SIGNAL(stateChanged(QAudio::State)), this, SLOT(audioStateChanged(QAudio::State))); CHECKED_CONNECT(m_audioOutput, SIGNAL(notify()), this, SLOT(audioNotify())); m_count = 0; if (m_file) { m_file->seek(0); m_bufferPosition = 0; m_dataLength = 0; m_audioOutput->start(m_file); } else { m_audioOutputIODevice.close(); m_audioOutputIODevice.setBuffer(&m_buffer); m_audioOutputIODevice.open(QIODevice::ReadOnly); m_audioOutput->start(&m_audioOutputIODevice); } } } } void Engine::suspend() { if (QAudio::ActiveState == m_state || QAudio::IdleState == m_state) { switch (m_mode) { case QAudio::AudioInput: m_audioInput->suspend(); break; case QAudio::AudioOutput: m_audioOutput->suspend(); break; } } } void Engine::setAudioInputDevice(const QAudioDeviceInfo &device) { if (device.deviceName() != m_audioInputDevice.deviceName()) { m_audioInputDevice = device; initialize(); } } void Engine::setAudioOutputDevice(const QAudioDeviceInfo &device) { if (device.deviceName() != m_audioOutputDevice.deviceName()) { m_audioOutputDevice = device; initialize(); } } //----------------------------------------------------------------------------- // Private slots //----------------------------------------------------------------------------- void Engine::audioNotify() { switch (m_mode) { case QAudio::AudioInput: { const qint64 recordPosition = qMin(m_bufferLength, audioLength(m_format, m_audioInput->processedUSecs())); setRecordPosition(recordPosition); const qint64 levelPosition = m_dataLength - m_levelBufferLength; if (levelPosition >= 0) calculateLevel(levelPosition, m_levelBufferLength); if (m_dataLength >= m_spectrumBufferLength) { const qint64 spectrumPosition = m_dataLength - m_spectrumBufferLength; calculateSpectrum(spectrumPosition); } emit bufferChanged(0, m_dataLength, m_buffer); } break; case QAudio::AudioOutput: { const qint64 playPosition = audioLength(m_format, m_audioOutput->processedUSecs()); setPlayPosition(qMin(bufferLength(), playPosition)); const qint64 levelPosition = playPosition - m_levelBufferLength; const qint64 spectrumPosition = playPosition - m_spectrumBufferLength; if (m_file) { if (levelPosition > m_bufferPosition || spectrumPosition > m_bufferPosition || qMax(m_levelBufferLength, m_spectrumBufferLength) > m_dataLength) { m_bufferPosition = 0; m_dataLength = 0; // Data needs to be read into m_buffer in order to be analysed const qint64 readPos = qMax(qint64(0), qMin(levelPosition, spectrumPosition)); const qint64 readEnd = qMin(m_analysisFile->size(), qMax(levelPosition + m_levelBufferLength, spectrumPosition + m_spectrumBufferLength)); const qint64 readLen = readEnd - readPos + audioLength(m_format, WaveformWindowDuration); qDebug() << "Engine::audioNotify [1]" << "analysisFileSize" << m_analysisFile->size() << "readPos" << readPos << "readLen" << readLen; if (m_analysisFile->seek(readPos + m_analysisFile->headerLength())) { m_buffer.resize(readLen); m_bufferPosition = readPos; m_dataLength = m_analysisFile->read(m_buffer.data(), readLen); qDebug() << "Engine::audioNotify [2]" << "bufferPosition" << m_bufferPosition << "dataLength" << m_dataLength; } else { qDebug() << "Engine::audioNotify [2]" << "file seek error"; } emit bufferChanged(m_bufferPosition, m_dataLength, m_buffer); } } else { if (playPosition >= m_dataLength) stopPlayback(); } if (levelPosition >= 0 && levelPosition + m_levelBufferLength < m_bufferPosition + m_dataLength) calculateLevel(levelPosition, m_levelBufferLength); if (spectrumPosition >= 0 && spectrumPosition + m_spectrumBufferLength < m_bufferPosition + m_dataLength) calculateSpectrum(spectrumPosition); } break; } } void Engine::audioStateChanged(QAudio::State state) { ENGINE_DEBUG << "Engine::audioStateChanged from" << m_state << "to" << state; if (QAudio::IdleState == state && m_file && m_file->pos() == m_file->size()) { stopPlayback(); } else { if (QAudio::StoppedState == state) { // Check error QAudio::Error error = QAudio::NoError; switch (m_mode) { case QAudio::AudioInput: error = m_audioInput->error(); break; case QAudio::AudioOutput: error = m_audioOutput->error(); break; } if (QAudio::NoError != error) { reset(); return; } } setState(state); } } void Engine::audioDataReady() { Q_ASSERT(0 == m_bufferPosition); const qint64 bytesReady = m_audioInput->bytesReady(); const qint64 bytesSpace = m_buffer.size() - m_dataLength; const qint64 bytesToRead = qMin(bytesReady, bytesSpace); const qint64 bytesRead = m_audioInputIODevice->read( m_buffer.data() + m_dataLength, bytesToRead); if (bytesRead) { m_dataLength += bytesRead; emit dataLengthChanged(dataLength()); } if (m_buffer.size() == m_dataLength) stopRecording(); } void Engine::spectrumChanged(const FrequencySpectrum &spectrum) { ENGINE_DEBUG << "Engine::spectrumChanged" << "pos" << m_spectrumPosition; emit spectrumChanged(m_spectrumPosition, m_spectrumBufferLength, spectrum); } //----------------------------------------------------------------------------- // Private functions //----------------------------------------------------------------------------- void Engine::resetAudioDevices() { delete m_audioInput; m_audioInput = 0; m_audioInputIODevice = 0; setRecordPosition(0); delete m_audioOutput; m_audioOutput = 0; setPlayPosition(0); m_spectrumPosition = 0; setLevel(0.0, 0.0, 0); } void Engine::reset() { stopRecording(); stopPlayback(); setState(QAudio::AudioInput, QAudio::StoppedState); setFormat(QAudioFormat()); m_generateTone = false; delete m_file; m_file = 0; delete m_analysisFile; m_analysisFile = 0; m_buffer.clear(); m_bufferPosition = 0; m_bufferLength = 0; m_dataLength = 0; emit dataLengthChanged(0); resetAudioDevices(); } bool Engine::initialize() { bool result = false; QAudioFormat format = m_format; if (selectFormat()) { if (m_format != format) { resetAudioDevices(); if (m_file) { emit bufferLengthChanged(bufferLength()); emit dataLengthChanged(dataLength()); emit bufferChanged(0, 0, m_buffer); setRecordPosition(bufferLength()); result = true; } else { m_bufferLength = audioLength(m_format, BufferDurationUs); m_buffer.resize(m_bufferLength); m_buffer.fill(0); emit bufferLengthChanged(bufferLength()); if (m_generateTone) { if (0 == m_tone.endFreq) { const qreal nyquist = nyquistFrequency(m_format); m_tone.endFreq = qMin(qreal(SpectrumHighFreq), nyquist); } // Call function defined in utils.h, at global scope ::generateTone(m_tone, m_format, m_buffer); m_dataLength = m_bufferLength; emit dataLengthChanged(dataLength()); emit bufferChanged(0, m_dataLength, m_buffer); setRecordPosition(m_bufferLength); result = true; } else { emit bufferChanged(0, 0, m_buffer); m_audioInput = new QAudioInput(m_audioInputDevice, m_format, this); m_audioInput->setNotifyInterval(NotifyIntervalMs); result = true; } } m_audioOutput = new QAudioOutput(m_audioOutputDevice, m_format, this); m_audioOutput->setNotifyInterval(NotifyIntervalMs); } } else { if (m_file) emit errorMessage(tr("Audio format not supported"), formatToString(m_format)); else if (m_generateTone) emit errorMessage(tr("No suitable format found"), ""); else emit errorMessage(tr("No common input / output format found"), ""); } ENGINE_DEBUG << "Engine::initialize" << "m_bufferLength" << m_bufferLength; ENGINE_DEBUG << "Engine::initialize" << "m_dataLength" << m_dataLength; ENGINE_DEBUG << "Engine::initialize" << "format" << m_format; return result; } bool Engine::selectFormat() { bool foundSupportedFormat = false; if (m_file || QAudioFormat() != m_format) { QAudioFormat format = m_format; if (m_file) // Header is read from the WAV file; just need to check whether // it is supported by the audio output device format = m_file->fileFormat(); if (m_audioOutputDevice.isFormatSupported(format)) { setFormat(format); foundSupportedFormat = true; } } else { QList sampleRatesList; #ifdef Q_OS_WIN // The Windows audio backend does not correctly report format support // (see QTBUG-9100). Furthermore, although the audio subsystem captures // at 11025Hz, the resulting audio is corrupted. sampleRatesList += 8000; #endif if (!m_generateTone) sampleRatesList += m_audioInputDevice.supportedSampleRates(); sampleRatesList += m_audioOutputDevice.supportedSampleRates(); sampleRatesList = sampleRatesList.toSet().toList(); // remove duplicates qSort(sampleRatesList); ENGINE_DEBUG << "Engine::initialize frequenciesList" << sampleRatesList; QList channelsList; channelsList += m_audioInputDevice.supportedChannelCounts(); channelsList += m_audioOutputDevice.supportedChannelCounts(); channelsList = channelsList.toSet().toList(); qSort(channelsList); ENGINE_DEBUG << "Engine::initialize channelsList" << channelsList; QAudioFormat format; format.setByteOrder(QAudioFormat::LittleEndian); format.setCodec("audio/pcm"); format.setSampleSize(16); format.setSampleType(QAudioFormat::SignedInt); int sampleRate, channels; foreach (sampleRate, sampleRatesList) { if (foundSupportedFormat) break; format.setSampleRate(sampleRate); foreach (channels, channelsList) { format.setChannelCount(channels); const bool inputSupport = m_generateTone || m_audioInputDevice.isFormatSupported(format); const bool outputSupport = m_audioOutputDevice.isFormatSupported(format); ENGINE_DEBUG << "Engine::initialize checking " << format << "input" << inputSupport << "output" << outputSupport; if (inputSupport && outputSupport) { foundSupportedFormat = true; break; } } } if (!foundSupportedFormat) format = QAudioFormat(); setFormat(format); } return foundSupportedFormat; } void Engine::stopRecording() { if (m_audioInput) { m_audioInput->stop(); QCoreApplication::instance()->processEvents(); m_audioInput->disconnect(); } m_audioInputIODevice = 0; #ifdef DUMP_AUDIO dumpData(); #endif } void Engine::stopPlayback() { if (m_audioOutput) { m_audioOutput->stop(); QCoreApplication::instance()->processEvents(); m_audioOutput->disconnect(); setPlayPosition(0); } } void Engine::setState(QAudio::State state) { const bool changed = (m_state != state); m_state = state; if (changed) emit stateChanged(m_mode, m_state); } void Engine::setState(QAudio::Mode mode, QAudio::State state) { const bool changed = (m_mode != mode || m_state != state); m_mode = mode; m_state = state; if (changed) emit stateChanged(m_mode, m_state); } void Engine::setRecordPosition(qint64 position, bool forceEmit) { const bool changed = (m_recordPosition != position); m_recordPosition = position; if (changed || forceEmit) emit recordPositionChanged(m_recordPosition); } void Engine::setPlayPosition(qint64 position, bool forceEmit) { const bool changed = (m_playPosition != position); m_playPosition = position; if (changed || forceEmit) emit playPositionChanged(m_playPosition); } void Engine::calculateLevel(qint64 position, qint64 length) { #ifdef DISABLE_LEVEL Q_UNUSED(position) Q_UNUSED(length) #else Q_ASSERT(position + length <= m_bufferPosition + m_dataLength); qreal peakLevel = 0.0; qreal sum = 0.0; const char *ptr = m_buffer.constData() + position - m_bufferPosition; const char *const end = ptr + length; while (ptr < end) { const qint16 value = *reinterpret_cast(ptr); const qreal fracValue = pcmToReal(value); peakLevel = qMax(peakLevel, fracValue); sum += fracValue * fracValue; ptr += 2; } const int numSamples = length / 2; qreal rmsLevel = sqrt(sum / numSamples); rmsLevel = qMax(qreal(0.0), rmsLevel); rmsLevel = qMin(qreal(1.0), rmsLevel); setLevel(rmsLevel, peakLevel, numSamples); ENGINE_DEBUG << "Engine::calculateLevel" << "pos" << position << "len" << length << "rms" << rmsLevel << "peak" << peakLevel; #endif } void Engine::calculateSpectrum(qint64 position) { #ifdef DISABLE_SPECTRUM Q_UNUSED(position) #else Q_ASSERT(position + m_spectrumBufferLength <= m_bufferPosition + m_dataLength); Q_ASSERT(0 == m_spectrumBufferLength % 2); // constraint of FFT algorithm // QThread::currentThread is marked 'for internal use only', but // we're only using it for debug output here, so it's probably OK :) ENGINE_DEBUG << "Engine::calculateSpectrum" << QThread::currentThread() << "count" << m_count << "pos" << position << "len" << m_spectrumBufferLength << "spectrumAnalyser.isReady" << m_spectrumAnalyser.isReady(); if (m_spectrumAnalyser.isReady()) { m_spectrumBuffer = QByteArray::fromRawData(m_buffer.constData() + position - m_bufferPosition, m_spectrumBufferLength); m_spectrumPosition = position; m_spectrumAnalyser.calculate(m_spectrumBuffer, m_format); } #endif } void Engine::setFormat(const QAudioFormat &format) { const bool changed = (format != m_format); m_format = format; m_levelBufferLength = audioLength(m_format, LevelWindowUs); m_spectrumBufferLength = SpectrumLengthSamples * (m_format.sampleSize() / 8) * m_format.channelCount(); if (changed) emit formatChanged(m_format); } void Engine::setLevel(qreal rmsLevel, qreal peakLevel, int numSamples) { m_rmsLevel = rmsLevel; m_peakLevel = peakLevel; emit levelChanged(m_rmsLevel, m_peakLevel, numSamples); } #ifdef DUMP_DATA void Engine::createOutputDir() { m_outputDir.setPath("output"); // Ensure output directory exists and is empty if (m_outputDir.exists()) { const QStringList files = m_outputDir.entryList(QDir::Files); QString file; foreach (file, files) m_outputDir.remove(file); } else { QDir::current().mkdir("output"); } } #endif // DUMP_DATA #ifdef DUMP_AUDIO void Engine::dumpData() { const QString txtFileName = m_outputDir.filePath("data.txt"); QFile txtFile(txtFileName); txtFile.open(QFile::WriteOnly | QFile::Text); QTextStream stream(&txtFile); const qint16 *ptr = reinterpret_cast(m_buffer.constData()); const int numSamples = m_dataLength / (2 * m_format.channels()); for (int i=0; i #include #include #include #include #include #include #ifdef DUMP_CAPTURED_AUDIO #define DUMP_DATA #endif #ifdef DUMP_SPECTRUM #define DUMP_DATA #endif class FrequencySpectrum; QT_BEGIN_NAMESPACE class QAudioInput; class QAudioOutput; QT_END_NAMESPACE /** * This class interfaces with the Qt Multimedia audio classes, and also with * the SpectrumAnalyser class. Its role is to manage the capture and playback * of audio data, meanwhile performing real-time analysis of the audio level * and frequency spectrum. */ class Engine : public QObject { Q_OBJECT public: explicit Engine(QObject *parent = 0); ~Engine(); const QList &availableAudioInputDevices() const { return m_availableAudioInputDevices; } const QList &availableAudioOutputDevices() const { return m_availableAudioOutputDevices; } QAudio::Mode mode() const { return m_mode; } QAudio::State state() const { return m_state; } /** * \return Current audio format * \note May be QAudioFormat() if engine is not initialized */ const QAudioFormat& format() const { return m_format; } /** * Stop any ongoing recording or playback, and reset to ground state. */ void reset(); /** * Load data from WAV file */ bool loadFile(const QString &fileName); /** * Generate tone */ bool generateTone(const Tone &tone); /** * Generate tone */ bool generateSweptTone(qreal amplitude); /** * Initialize for recording */ bool initializeRecord(); /** * Position of the audio input device. * \return Position in bytes. */ qint64 recordPosition() const { return m_recordPosition; } /** * RMS level of the most recently processed set of audio samples. * \return Level in range (0.0, 1.0) */ qreal rmsLevel() const { return m_rmsLevel; } /** * Peak level of the most recently processed set of audio samples. * \return Level in range (0.0, 1.0) */ qreal peakLevel() const { return m_peakLevel; } /** * Position of the audio output device. * \return Position in bytes. */ qint64 playPosition() const { return m_playPosition; } /** * Length of the internal engine buffer. * \return Buffer length in bytes. */ qint64 bufferLength() const; /** * Amount of data held in the buffer. * \return Data length in bytes. */ qint64 dataLength() const { return m_dataLength; } /** * Set window function applied to audio data before spectral analysis. */ void setWindowFunction(WindowFunction type); public slots: void startRecording(); void startPlayback(); void suspend(); void setAudioInputDevice(const QAudioDeviceInfo &device); void setAudioOutputDevice(const QAudioDeviceInfo &device); signals: void stateChanged(QAudio::Mode mode, QAudio::State state); /** * Informational message for non-modal display */ void infoMessage(const QString &message, int durationMs); /** * Error message for modal display */ void errorMessage(const QString &heading, const QString &detail); /** * Format of audio data has changed */ void formatChanged(const QAudioFormat &format); /** * Length of buffer has changed. * \param duration Duration in microseconds */ void bufferLengthChanged(qint64 duration); /** * Amount of data in buffer has changed. * \param Length of data in bytes */ void dataLengthChanged(qint64 duration); /** * Position of the audio input device has changed. * \param position Position in bytes */ void recordPositionChanged(qint64 position); /** * Position of the audio output device has changed. * \param position Position in bytes */ void playPositionChanged(qint64 position); /** * Level changed * \param rmsLevel RMS level in range 0.0 - 1.0 * \param peakLevel Peak level in range 0.0 - 1.0 * \param numSamples Number of audio samples analyzed */ void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples); /** * Spectrum has changed. * \param position Position of start of window in bytes * \param length Length of window in bytes * \param spectrum Resulting frequency spectrum */ void spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); /** * Buffer containing audio data has changed. * \param position Position of start of buffer in bytes * \param buffer Buffer */ void bufferChanged(qint64 position, qint64 length, const QByteArray &buffer); private slots: void audioNotify(); void audioStateChanged(QAudio::State state); void audioDataReady(); void spectrumChanged(const FrequencySpectrum &spectrum); private: void resetAudioDevices(); bool initialize(); bool selectFormat(); void stopRecording(); void stopPlayback(); void setState(QAudio::State state); void setState(QAudio::Mode mode, QAudio::State state); void setFormat(const QAudioFormat &format); void setRecordPosition(qint64 position, bool forceEmit = false); void setPlayPosition(qint64 position, bool forceEmit = false); void calculateLevel(qint64 position, qint64 length); void calculateSpectrum(qint64 position); void setLevel(qreal rmsLevel, qreal peakLevel, int numSamples); #ifdef DUMP_DATA void createOutputDir(); QString outputPath() const { return m_outputDir.path(); } #endif #ifdef DUMP_CAPTURED_AUDIO void dumpData(); #endif private: QAudio::Mode m_mode; QAudio::State m_state; bool m_generateTone; SweptTone m_tone; WavFile* m_file; // We need a second file handle via which to read data into m_buffer // for analysis WavFile* m_analysisFile; QAudioFormat m_format; const QList m_availableAudioInputDevices; QAudioDeviceInfo m_audioInputDevice; QAudioInput* m_audioInput; QIODevice* m_audioInputIODevice; qint64 m_recordPosition; const QList m_availableAudioOutputDevices; QAudioDeviceInfo m_audioOutputDevice; QAudioOutput* m_audioOutput; qint64 m_playPosition; QBuffer m_audioOutputIODevice; QByteArray m_buffer; qint64 m_bufferPosition; qint64 m_bufferLength; qint64 m_dataLength; int m_levelBufferLength; qreal m_rmsLevel; qreal m_peakLevel; int m_spectrumBufferLength; QByteArray m_spectrumBuffer; SpectrumAnalyser m_spectrumAnalyser; qint64 m_spectrumPosition; int m_count; #ifdef DUMP_DATA QDir m_outputDir; #endif }; #endif // ENGINE_H frequencyspectrum.cpp000066400000000000000000000055271225012771600354130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "frequencyspectrum.h" FrequencySpectrum::FrequencySpectrum(int numPoints) : m_elements(numPoints) { } void FrequencySpectrum::reset() { iterator i = begin(); for ( ; i != end(); ++i) *i = Element(); } int FrequencySpectrum::count() const { return m_elements.count(); } FrequencySpectrum::Element &FrequencySpectrum::operator[](int index) { return m_elements[index]; } const FrequencySpectrum::Element &FrequencySpectrum::operator[](int index) const { return m_elements[index]; } FrequencySpectrum::iterator FrequencySpectrum::begin() { return m_elements.begin(); } FrequencySpectrum::iterator FrequencySpectrum::end() { return m_elements.end(); } FrequencySpectrum::const_iterator FrequencySpectrum::begin() const { return m_elements.begin(); } FrequencySpectrum::const_iterator FrequencySpectrum::end() const { return m_elements.end(); } frequencyspectrum.h000066400000000000000000000062301225012771600350500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef FREQUENCYSPECTRUM_H #define FREQUENCYSPECTRUM_H #include /** * Represents a frequency spectrum as a series of elements, each of which * consists of a frequency, an amplitude and a phase. */ class FrequencySpectrum { public: FrequencySpectrum(int numPoints = 0); struct Element { Element() : frequency(0.0), amplitude(0.0), phase(0.0), clipped(false) { } /** * Frequency in Hertz */ qreal frequency; /** * Amplitude in range [0.0, 1.0] */ qreal amplitude; /** * Phase in range [0.0, 2*PI] */ qreal phase; /** * Indicates whether value has been clipped during spectrum analysis */ bool clipped; }; typedef QVector::iterator iterator; typedef QVector::const_iterator const_iterator; void reset(); int count() const; Element& operator[](int index); const Element& operator[](int index) const; iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; private: QVector m_elements; }; #endif // FREQUENCYSPECTRUM_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/images/000077500000000000000000000000001225012771600324365ustar00rootroot00000000000000record.png000066400000000000000000000012361225012771600343450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/images‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ/PzhËIDATXÃÝ—¿nAÆ{g!KIqà#ûHëÂPQ¸tát¡ã5(¯ÀH Hˆ(Œ ùÂ!¤;ÿtÎPx ˆÛݳ‘%Fú Ÿw¿ùnfngV‰«4[Éf‘RʉÔ%ª%çívûÇïV«õËÿµZjµJ¹\f<ÓétPJÙ‹‘\dkŽÿDö|2ùÊ`0 MSz½ž5·ˆØÕÀß^&{ž¦)‡‡ñ}Ÿf³I·ÛµN2…J)Åt*ˆ€_RjÔ@/K€ ¢Ñp˜<ÚÙáòÖ–1VÒTðK*6Ks"æD»Àöh8ŠÖ××̵`Uи!ЗYäóÐ×k•JÅèÃ\(3ç·b çb½§aP2Ä?®èÐGA ÷$ò3=Ž'¡R‰«óßElj.ç£8œ+¸¢fä0 —p܇EÔ—( ^D@P0÷N<+oÇyE-—'OÀAÞ÷ë`‘ær-Q@TTÀî‚"Œ^N—J€m¤`îgûg\źá¢ÍÈØmÿe;¶yA«©ø},Ï«'U6õX $¯£wá™åŒdýOÂÑ7Ø8m7’¿p1yú¤g5¢[ x _Fà{à)ˆ'pj Ê'àM‡îpÿÞ]ö_½t¾Ø]LÏ›9ô<˜~Øãæ­âNgÂÏGÂãg/¸zí:gÏm¸}EX¥`‘«×ÂEøßߎ¿Sø~#DŠxÄIEND®B`‚settings.png000066400000000000000000000071011225012771600347240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/images‰PNG  IHDR szzô MiCCPPhotoshop ICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû%ÒŸ3bKGDÿÿÿ ½§“ pHYs  šœtIMEÚ)5Ë IuIDATXÃÅ—_h[eÆßw¾d­vl¨[tÄ¥nÆ5 Ýd‹e­ íìa;DÙœ ˆ7o½ôÎ݈Ã;ÿ\¢óB26ª¬¨CEm ¤¶elµص4viÚäœï{½HZÖ5‰5=ÑsrxÞçyŸó¼ï«Þxïˆð?>æÖD BPJ­®€Àú/‚Rº®ŒEdYQKhÆ‹ü'’+¥‘Ê-ãqÎr{ã¶lº­5#cƒË˜ß¬€)'ËZ%NÜÓÂ㻟#vg3?ýv–߯Tt• ·¿ŽŽ]OÓÑÚMÄDùò»¹8ܧ+Ãè0ÍÕm"êÀ:ËŸÓWÐJ{.,ûºœ¸p ˆDÖáiƒHQÎôQ´2DL”C½BrëÃõmï/`]€çœsl½»…—Ÿ=ާ=<íqáâõkÖšg:_e]¤qÉéÎYš75 ||î-¦2ãá+ "B÷£½Ä7'qâPJ•ІùüýŸq}f¼lÈ™µ§šæÐ¾^RÍmX ”"›ËðIßÛh¥Éd§°Ö¯ø™›51GϾ^v$ÒXÍe8qæM²¹™¨ªš1¦VpO{ìèåÁm{±¶ÈÜ œúêr ³hí­Î;µ€Ögÿ#Ï“º¯ k‹Ìý ÏÉ3ÇÊ-Ô´½ÀîTR2œˆãóþw™úëÚª™×Ô?(°?}”ôC‚B)ñ>í;Îøäª†=ÂT“Ú9»4>XÚwöÐÞÚMPrµˆpî‡LLŽ kÜ#L5“ím}Š–D?(Ëß yï.ë—F®ãô·ï3<6Xó*+™p[Ãzw½Î–»¶M¦ŠƒdQ­4}?ždøê Z¯-LM¹`9üÄkÄîH,±'¥x-þçüÀ)~úï_nU tî9B<öƒCç™ÏgÙØ´‰‰=8±¥"-—F/„^¶€¡+?3úǯ\¾v …¦à/ðRÏ1â±$  T¨û£¹uaœ¸> Æ‹¥É™1â±$" Px^xS\—ÛZUi‹±.`ãúÍlï,\©Ì™“õ;Lͨ•æÉöI5·1E5ò…§¿ù —‘¬¸†ë“ÍÍ0;7ˆcn~–³ßÄìÜt(ÇËbv¨j·áⲡn~M©z(PùŠQ„ ø8qudÅÌXQ€®ãqZŽØßÊ·yZRkä™IEND®B`‚levelmeter.cpp000066400000000000000000000107011225012771600337610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "levelmeter.h" #include #include #include #include // Constants const int RedrawInterval = 100; // ms const qreal PeakDecayRate = 0.001; const int PeakHoldLevelDuration = 2000; // ms LevelMeter::LevelMeter(QWidget *parent) : QWidget(parent) , m_rmsLevel(0.0) , m_peakLevel(0.0) , m_decayedPeakLevel(0.0) , m_peakDecayRate(PeakDecayRate) , m_peakHoldLevel(0.0) , m_redrawTimer(new QTimer(this)) , m_rmsColor(Qt::red) , m_peakColor(255, 200, 200, 255) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); setMinimumWidth(30); connect(m_redrawTimer, SIGNAL(timeout()), this, SLOT(redrawTimerExpired())); m_redrawTimer->start(RedrawInterval); } LevelMeter::~LevelMeter() { } void LevelMeter::reset() { m_rmsLevel = 0.0; m_peakLevel = 0.0; update(); } void LevelMeter::levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples) { // Smooth the RMS signal const qreal smooth = pow(qreal(0.9), static_cast(numSamples) / 256); // TODO: remove this magic number m_rmsLevel = (m_rmsLevel * smooth) + (rmsLevel * (1.0 - smooth)); if (peakLevel > m_decayedPeakLevel) { m_peakLevel = peakLevel; m_decayedPeakLevel = peakLevel; m_peakLevelChanged.start(); } if (peakLevel > m_peakHoldLevel) { m_peakHoldLevel = peakLevel; m_peakHoldLevelChanged.start(); } update(); } void LevelMeter::redrawTimerExpired() { // Decay the peak signal const int elapsedMs = m_peakLevelChanged.elapsed(); const qreal decayAmount = m_peakDecayRate * elapsedMs; if (decayAmount < m_peakLevel) m_decayedPeakLevel = m_peakLevel - decayAmount; else m_decayedPeakLevel = 0.0; // Check whether to clear the peak hold level if (m_peakHoldLevelChanged.elapsed() > PeakHoldLevelDuration) m_peakHoldLevel = 0.0; update(); } void LevelMeter::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); painter.fillRect(rect(), Qt::black); QRect bar = rect(); bar.setTop(rect().top() + (1.0 - m_peakHoldLevel) * rect().height()); bar.setBottom(bar.top() + 5); painter.fillRect(bar, m_rmsColor); bar.setBottom(rect().bottom()); bar.setTop(rect().top() + (1.0 - m_decayedPeakLevel) * rect().height()); painter.fillRect(bar, m_peakColor); bar.setTop(rect().top() + (1.0 - m_rmsLevel) * rect().height()); painter.fillRect(bar, m_rmsColor); } levelmeter.h000066400000000000000000000067171225012771600334420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef LEVELMETER_H #define LEVELMETER_H #include #include /** * Widget which displays a vertical audio level meter, indicating the * RMS and peak levels of the window of audio samples most recently analyzed * by the Engine. */ class LevelMeter : public QWidget { Q_OBJECT public: explicit LevelMeter(QWidget *parent = 0); ~LevelMeter(); void paintEvent(QPaintEvent *event); public slots: void reset(); void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples); private slots: void redrawTimerExpired(); private: /** * Height of RMS level bar. * Range 0.0 - 1.0. */ qreal m_rmsLevel; /** * Most recent peak level. * Range 0.0 - 1.0. */ qreal m_peakLevel; /** * Height of peak level bar. * This is calculated by decaying m_peakLevel depending on the * elapsed time since m_peakLevelChanged, and the value of m_decayRate. */ qreal m_decayedPeakLevel; /** * Time at which m_peakLevel was last changed. */ QTime m_peakLevelChanged; /** * Rate at which peak level bar decays. * Expressed in level units / millisecond. */ qreal m_peakDecayRate; /** * High watermark of peak level. * Range 0.0 - 1.0. */ qreal m_peakHoldLevel; /** * Time at which m_peakHoldLevel was last changed. */ QTime m_peakHoldLevelChanged; QTimer *m_redrawTimer; QColor m_rmsColor; QColor m_peakColor; }; #endif // LEVELMETER_H main.cpp000066400000000000000000000042731225012771600325500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "mainwidget.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setApplicationName("Qt Multimedia spectrum analyzer"); MainWidget w; w.show(); return app.exec(); } mainwidget.cpp000066400000000000000000000356121225012771600337550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "engine.h" #include "levelmeter.h" #include "mainwidget.h" #include "waveform.h" #include "progressbar.h" #include "settingsdialog.h" #include "spectrograph.h" #include "tonegeneratordialog.h" #include "utils.h" #include #include #include #include #include #include #include #include #include const int NullTimerId = -1; MainWidget::MainWidget(QWidget *parent) : QWidget(parent) , m_mode(NoMode) , m_engine(new Engine(this)) #ifndef DISABLE_WAVEFORM , m_waveform(new Waveform(this)) #endif , m_progressBar(new ProgressBar(this)) , m_spectrograph(new Spectrograph(this)) , m_levelMeter(new LevelMeter(this)) , m_modeButton(new QPushButton(this)) , m_recordButton(new QPushButton(this)) , m_pauseButton(new QPushButton(this)) , m_playButton(new QPushButton(this)) , m_settingsButton(new QPushButton(this)) , m_infoMessage(new QLabel(tr("Select a mode to begin"), this)) , m_infoMessageTimerId(NullTimerId) , m_settingsDialog(new SettingsDialog( m_engine->availableAudioInputDevices(), m_engine->availableAudioOutputDevices(), this)) , m_toneGeneratorDialog(new ToneGeneratorDialog(this)) , m_modeMenu(new QMenu(this)) , m_loadFileAction(0) , m_generateToneAction(0) , m_recordAction(0) { m_spectrograph->setParams(SpectrumNumBands, SpectrumLowFreq, SpectrumHighFreq); createUi(); connectUi(); } MainWidget::~MainWidget() { } //----------------------------------------------------------------------------- // Public slots //----------------------------------------------------------------------------- void MainWidget::stateChanged(QAudio::Mode mode, QAudio::State state) { Q_UNUSED(mode); updateButtonStates(); if (QAudio::ActiveState != state && QAudio::SuspendedState != state) { m_levelMeter->reset(); m_spectrograph->reset(); } } void MainWidget::formatChanged(const QAudioFormat &format) { infoMessage(formatToString(format), NullMessageTimeout); #ifndef DISABLE_WAVEFORM if (QAudioFormat() != format) { m_waveform->initialize(format, WaveformTileLength, WaveformWindowDuration); } #endif } void MainWidget::spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum) { m_progressBar->windowChanged(position, length); m_spectrograph->spectrumChanged(spectrum); } void MainWidget::infoMessage(const QString &message, int timeoutMs) { m_infoMessage->setText(message); if (NullTimerId != m_infoMessageTimerId) { killTimer(m_infoMessageTimerId); m_infoMessageTimerId = NullTimerId; } if (NullMessageTimeout != timeoutMs) m_infoMessageTimerId = startTimer(timeoutMs); } void MainWidget::errorMessage(const QString &heading, const QString &detail) { QMessageBox::warning(this, heading, detail, QMessageBox::Close); } void MainWidget::timerEvent(QTimerEvent *event) { Q_ASSERT(event->timerId() == m_infoMessageTimerId); Q_UNUSED(event) // suppress warnings in release builds killTimer(m_infoMessageTimerId); m_infoMessageTimerId = NullTimerId; m_infoMessage->setText(""); } void MainWidget::audioPositionChanged(qint64 position) { #ifndef DISABLE_WAVEFORM m_waveform->audioPositionChanged(position); #else Q_UNUSED(position) #endif } void MainWidget::bufferLengthChanged(qint64 length) { m_progressBar->bufferLengthChanged(length); } //----------------------------------------------------------------------------- // Private slots //----------------------------------------------------------------------------- void MainWidget::showFileDialog() { const QString dir; const QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open WAV file"), dir, "*.wav"); if (fileNames.count()) { reset(); setMode(LoadFileMode); m_engine->loadFile(fileNames.front()); updateButtonStates(); } else { updateModeMenu(); } } void MainWidget::showSettingsDialog() { m_settingsDialog->exec(); if (m_settingsDialog->result() == QDialog::Accepted) { m_engine->setAudioInputDevice(m_settingsDialog->inputDevice()); m_engine->setAudioOutputDevice(m_settingsDialog->outputDevice()); m_engine->setWindowFunction(m_settingsDialog->windowFunction()); } } void MainWidget::showToneGeneratorDialog() { m_toneGeneratorDialog->exec(); if (m_toneGeneratorDialog->result() == QDialog::Accepted) { reset(); setMode(GenerateToneMode); const qreal amplitude = m_toneGeneratorDialog->amplitude(); if (m_toneGeneratorDialog->isFrequencySweepEnabled()) { m_engine->generateSweptTone(amplitude); } else { const qreal frequency = m_toneGeneratorDialog->frequency(); const Tone tone(frequency, amplitude); m_engine->generateTone(tone); updateButtonStates(); } } else { updateModeMenu(); } } void MainWidget::initializeRecord() { reset(); setMode(RecordMode); if (m_engine->initializeRecord()) updateButtonStates(); } //----------------------------------------------------------------------------- // Private functions //----------------------------------------------------------------------------- void MainWidget::createUi() { createMenus(); setWindowTitle(tr("Spectrum Analyser")); QVBoxLayout *windowLayout = new QVBoxLayout(this); m_infoMessage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); m_infoMessage->setAlignment(Qt::AlignHCenter); windowLayout->addWidget(m_infoMessage); #ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM QScopedPointer waveformLayout(new QHBoxLayout); waveformLayout->addWidget(m_progressBar); m_progressBar->setMinimumHeight(m_waveform->minimumHeight()); waveformLayout->setMargin(0); m_waveform->setLayout(waveformLayout.data()); waveformLayout.take(); windowLayout->addWidget(m_waveform); #else #ifndef DISABLE_WAVEFORM windowLayout->addWidget(m_waveform); #endif // DISABLE_WAVEFORM windowLayout->addWidget(m_progressBar); #endif // SUPERIMPOSE_PROGRESS_ON_WAVEFORM // Spectrograph and level meter QScopedPointer analysisLayout(new QHBoxLayout); analysisLayout->addWidget(m_spectrograph); analysisLayout->addWidget(m_levelMeter); windowLayout->addLayout(analysisLayout.data()); analysisLayout.take(); // Button panel const QSize buttonSize(30, 30); m_modeButton->setText(tr("Mode")); m_recordIcon = QIcon(":/images/record.png"); m_recordButton->setIcon(m_recordIcon); m_recordButton->setEnabled(false); m_recordButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_recordButton->setMinimumSize(buttonSize); m_pauseIcon = style()->standardIcon(QStyle::SP_MediaPause); m_pauseButton->setIcon(m_pauseIcon); m_pauseButton->setEnabled(false); m_pauseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_pauseButton->setMinimumSize(buttonSize); m_playIcon = style()->standardIcon(QStyle::SP_MediaPlay); m_playButton->setIcon(m_playIcon); m_playButton->setEnabled(false); m_playButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_playButton->setMinimumSize(buttonSize); m_settingsIcon = QIcon(":/images/settings.png"); m_settingsButton->setIcon(m_settingsIcon); m_settingsButton->setEnabled(true); m_settingsButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_settingsButton->setMinimumSize(buttonSize); QScopedPointer buttonPanelLayout(new QHBoxLayout); buttonPanelLayout->addStretch(); buttonPanelLayout->addWidget(m_modeButton); buttonPanelLayout->addWidget(m_recordButton); buttonPanelLayout->addWidget(m_pauseButton); buttonPanelLayout->addWidget(m_playButton); buttonPanelLayout->addWidget(m_settingsButton); QWidget *buttonPanel = new QWidget(this); buttonPanel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); buttonPanel->setLayout(buttonPanelLayout.data()); buttonPanelLayout.take(); // ownership transferred to buttonPanel QScopedPointer bottomPaneLayout(new QHBoxLayout); bottomPaneLayout->addWidget(buttonPanel); windowLayout->addLayout(bottomPaneLayout.data()); bottomPaneLayout.take(); // ownership transferred to windowLayout // Apply layout setLayout(windowLayout); } void MainWidget::connectUi() { CHECKED_CONNECT(m_recordButton, SIGNAL(clicked()), m_engine, SLOT(startRecording())); CHECKED_CONNECT(m_pauseButton, SIGNAL(clicked()), m_engine, SLOT(suspend())); CHECKED_CONNECT(m_playButton, SIGNAL(clicked()), m_engine, SLOT(startPlayback())); CHECKED_CONNECT(m_settingsButton, SIGNAL(clicked()), this, SLOT(showSettingsDialog())); CHECKED_CONNECT(m_engine, SIGNAL(stateChanged(QAudio::Mode,QAudio::State)), this, SLOT(stateChanged(QAudio::Mode,QAudio::State))); CHECKED_CONNECT(m_engine, SIGNAL(formatChanged(const QAudioFormat &)), this, SLOT(formatChanged(const QAudioFormat &))); m_progressBar->bufferLengthChanged(m_engine->bufferLength()); CHECKED_CONNECT(m_engine, SIGNAL(bufferLengthChanged(qint64)), this, SLOT(bufferLengthChanged(qint64))); CHECKED_CONNECT(m_engine, SIGNAL(dataLengthChanged(qint64)), this, SLOT(updateButtonStates())); CHECKED_CONNECT(m_engine, SIGNAL(recordPositionChanged(qint64)), m_progressBar, SLOT(recordPositionChanged(qint64))); CHECKED_CONNECT(m_engine, SIGNAL(playPositionChanged(qint64)), m_progressBar, SLOT(playPositionChanged(qint64))); CHECKED_CONNECT(m_engine, SIGNAL(recordPositionChanged(qint64)), this, SLOT(audioPositionChanged(qint64))); CHECKED_CONNECT(m_engine, SIGNAL(playPositionChanged(qint64)), this, SLOT(audioPositionChanged(qint64))); CHECKED_CONNECT(m_engine, SIGNAL(levelChanged(qreal, qreal, int)), m_levelMeter, SLOT(levelChanged(qreal, qreal, int))); CHECKED_CONNECT(m_engine, SIGNAL(spectrumChanged(qint64, qint64, const FrequencySpectrum &)), this, SLOT(spectrumChanged(qint64, qint64, const FrequencySpectrum &))); CHECKED_CONNECT(m_engine, SIGNAL(infoMessage(QString, int)), this, SLOT(infoMessage(QString, int))); CHECKED_CONNECT(m_engine, SIGNAL(errorMessage(QString, QString)), this, SLOT(errorMessage(QString, QString))); CHECKED_CONNECT(m_spectrograph, SIGNAL(infoMessage(QString, int)), this, SLOT(infoMessage(QString, int))); #ifndef DISABLE_WAVEFORM CHECKED_CONNECT(m_engine, SIGNAL(bufferChanged(qint64, qint64, const QByteArray &)), m_waveform, SLOT(bufferChanged(qint64, qint64, const QByteArray &))); #endif } void MainWidget::createMenus() { m_modeButton->setMenu(m_modeMenu); m_generateToneAction = m_modeMenu->addAction(tr("Play generated tone")); m_recordAction = m_modeMenu->addAction(tr("Record and play back")); m_loadFileAction = m_modeMenu->addAction(tr("Play file")); m_loadFileAction->setCheckable(true); m_generateToneAction->setCheckable(true); m_recordAction->setCheckable(true); connect(m_loadFileAction, SIGNAL(triggered(bool)), this, SLOT(showFileDialog())); connect(m_generateToneAction, SIGNAL(triggered(bool)), this, SLOT(showToneGeneratorDialog())); connect(m_recordAction, SIGNAL(triggered(bool)), this, SLOT(initializeRecord())); } void MainWidget::updateButtonStates() { const bool recordEnabled = ((QAudio::AudioOutput == m_engine->mode() || (QAudio::ActiveState != m_engine->state() && QAudio::IdleState != m_engine->state())) && RecordMode == m_mode); m_recordButton->setEnabled(recordEnabled); const bool pauseEnabled = (QAudio::ActiveState == m_engine->state() || QAudio::IdleState == m_engine->state()); m_pauseButton->setEnabled(pauseEnabled); const bool playEnabled = (/*m_engine->dataLength() &&*/ (QAudio::AudioOutput != m_engine->mode() || (QAudio::ActiveState != m_engine->state() && QAudio::IdleState != m_engine->state()))); m_playButton->setEnabled(playEnabled); } void MainWidget::reset() { #ifndef DISABLE_WAVEFORM m_waveform->reset(); #endif m_engine->reset(); m_levelMeter->reset(); m_spectrograph->reset(); m_progressBar->reset(); } void MainWidget::setMode(Mode mode) { m_mode = mode; updateModeMenu(); } void MainWidget::updateModeMenu() { m_loadFileAction->setChecked(LoadFileMode == m_mode); m_generateToneAction->setChecked(GenerateToneMode == m_mode); m_recordAction->setChecked(RecordMode == m_mode); } mainwidget.h000066400000000000000000000110271225012771600334140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWIDGET_H #define MAINWIDGET_H #include #include #include class Engine; class FrequencySpectrum; class LevelMeter; class ProgressBar; class SettingsDialog; class Spectrograph; class ToneGeneratorDialog; class Waveform; QT_BEGIN_NAMESPACE class QAction; class QAudioFormat; class QLabel; class QMenu; class QPushButton; QT_END_NAMESPACE /** * Main application widget, responsible for connecting the various UI * elements to the Engine. */ class MainWidget : public QWidget { Q_OBJECT public: explicit MainWidget(QWidget *parent = 0); ~MainWidget(); // QObject void timerEvent(QTimerEvent *event); public slots: void stateChanged(QAudio::Mode mode, QAudio::State state); void formatChanged(const QAudioFormat &format); void spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); void infoMessage(const QString &message, int timeoutMs); void errorMessage(const QString &heading, const QString &detail); void audioPositionChanged(qint64 position); void bufferLengthChanged(qint64 length); private slots: void showFileDialog(); void showSettingsDialog(); void showToneGeneratorDialog(); void initializeRecord(); void updateModeMenu(); void updateButtonStates(); private: void createUi(); void createMenus(); void connectUi(); void reset(); enum Mode { NoMode, RecordMode, GenerateToneMode, LoadFileMode }; void setMode(Mode mode); private: Mode m_mode; Engine* m_engine; #ifndef DISABLE_WAVEFORM Waveform* m_waveform; #endif ProgressBar* m_progressBar; Spectrograph* m_spectrograph; LevelMeter* m_levelMeter; QPushButton* m_modeButton; QPushButton* m_recordButton; QIcon m_recordIcon; QPushButton* m_pauseButton; QIcon m_pauseIcon; QPushButton* m_playButton; QIcon m_playIcon; QPushButton* m_settingsButton; QIcon m_settingsIcon; QLabel* m_infoMessage; int m_infoMessageTimerId; SettingsDialog* m_settingsDialog; ToneGeneratorDialog* m_toneGeneratorDialog; QMenu* m_modeMenu; QAction* m_loadFileAction; QAction* m_generateToneAction; QAction* m_recordAction; }; #endif // MAINWIDGET_H progressbar.cpp000066400000000000000000000107071225012771600341540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "progressbar.h" #include "spectrum.h" #include ProgressBar::ProgressBar(QWidget *parent) : QWidget(parent) , m_bufferLength(0) , m_recordPosition(0) , m_playPosition(0) , m_windowPosition(0) , m_windowLength(0) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); setMinimumHeight(30); #ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM setAutoFillBackground(false); #endif } ProgressBar::~ProgressBar() { } void ProgressBar::reset() { m_bufferLength = 0; m_recordPosition = 0; m_playPosition = 0; m_windowPosition = 0; m_windowLength = 0; update(); } void ProgressBar::paintEvent(QPaintEvent * /*event*/) { QPainter painter(this); QColor bufferColor(0, 0, 255); QColor windowColor(0, 255, 0); #ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM bufferColor.setAlphaF(0.5); windowColor.setAlphaF(0.5); #else painter.fillRect(rect(), Qt::black); #endif if (m_bufferLength) { QRect bar = rect(); const qreal play = qreal(m_playPosition) / m_bufferLength; bar.setLeft(rect().left() + play * rect().width()); const qreal record = qreal(m_recordPosition) / m_bufferLength; bar.setRight(rect().left() + record * rect().width()); painter.fillRect(bar, bufferColor); QRect window = rect(); const qreal windowLeft = qreal(m_windowPosition) / m_bufferLength; window.setLeft(rect().left() + windowLeft * rect().width()); const qreal windowWidth = qreal(m_windowLength) / m_bufferLength; window.setWidth(windowWidth * rect().width()); painter.fillRect(window, windowColor); } } void ProgressBar::bufferLengthChanged(qint64 bufferSize) { m_bufferLength = bufferSize; m_recordPosition = 0; m_playPosition = 0; m_windowPosition = 0; m_windowLength = 0; repaint(); } void ProgressBar::recordPositionChanged(qint64 recordPosition) { Q_ASSERT(recordPosition >= 0); Q_ASSERT(recordPosition <= m_bufferLength); m_recordPosition = recordPosition; repaint(); } void ProgressBar::playPositionChanged(qint64 playPosition) { Q_ASSERT(playPosition >= 0); Q_ASSERT(playPosition <= m_bufferLength); m_playPosition = playPosition; repaint(); } void ProgressBar::windowChanged(qint64 position, qint64 length) { Q_ASSERT(position >= 0); Q_ASSERT(position <= m_bufferLength); Q_ASSERT(position + length <= m_bufferLength); m_windowPosition = position; m_windowLength = length; repaint(); } progressbar.h000066400000000000000000000053541225012771600336230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PROGRESSBAR_H #define PROGRESSBAR_H #include /** * Widget which displays a the current fill state of the Engine's internal * buffer, and the current play/record position within that buffer. */ class ProgressBar : public QWidget { Q_OBJECT public: explicit ProgressBar(QWidget *parent = 0); ~ProgressBar(); void reset(); void paintEvent(QPaintEvent *event); public slots: void bufferLengthChanged(qint64 length); void recordPositionChanged(qint64 recordPosition); void playPositionChanged(qint64 playPosition); void windowChanged(qint64 position, qint64 length); private: qint64 m_bufferLength; qint64 m_recordPosition; qint64 m_playPosition; qint64 m_windowPosition; qint64 m_windowLength; }; #endif // PROGRESSBAR_H settingsdialog.cpp000066400000000000000000000140461225012771600346430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include #include #include SettingsDialog::SettingsDialog( const QList &availableInputDevices, const QList &availableOutputDevices, QWidget *parent) : QDialog(parent) , m_windowFunction(DefaultWindowFunction) , m_inputDeviceComboBox(new QComboBox(this)) , m_outputDeviceComboBox(new QComboBox(this)) , m_windowFunctionComboBox(new QComboBox(this)) { QVBoxLayout *dialogLayout = new QVBoxLayout(this); // Populate combo boxes QAudioDeviceInfo device; foreach (device, availableInputDevices) m_inputDeviceComboBox->addItem(device.deviceName(), QVariant::fromValue(device)); foreach (device, availableOutputDevices) m_outputDeviceComboBox->addItem(device.deviceName(), QVariant::fromValue(device)); m_windowFunctionComboBox->addItem(tr("None"), QVariant::fromValue(int(NoWindow))); m_windowFunctionComboBox->addItem("Hann", QVariant::fromValue(int(HannWindow))); m_windowFunctionComboBox->setCurrentIndex(m_windowFunction); // Initialize default devices if (!availableInputDevices.empty()) m_inputDevice = availableInputDevices.front(); if (!availableOutputDevices.empty()) m_outputDevice = availableOutputDevices.front(); // Add widgets to layout QScopedPointer inputDeviceLayout(new QHBoxLayout); QLabel *inputDeviceLabel = new QLabel(tr("Input device"), this); inputDeviceLayout->addWidget(inputDeviceLabel); inputDeviceLayout->addWidget(m_inputDeviceComboBox); dialogLayout->addLayout(inputDeviceLayout.data()); inputDeviceLayout.take(); // ownership transferred to dialogLayout QScopedPointer outputDeviceLayout(new QHBoxLayout); QLabel *outputDeviceLabel = new QLabel(tr("Output device"), this); outputDeviceLayout->addWidget(outputDeviceLabel); outputDeviceLayout->addWidget(m_outputDeviceComboBox); dialogLayout->addLayout(outputDeviceLayout.data()); outputDeviceLayout.take(); // ownership transferred to dialogLayout QScopedPointer windowFunctionLayout(new QHBoxLayout); QLabel *windowFunctionLabel = new QLabel(tr("Window function"), this); windowFunctionLayout->addWidget(windowFunctionLabel); windowFunctionLayout->addWidget(m_windowFunctionComboBox); dialogLayout->addLayout(windowFunctionLayout.data()); windowFunctionLayout.take(); // ownership transferred to dialogLayout // Connect CHECKED_CONNECT(m_inputDeviceComboBox, SIGNAL(activated(int)), this, SLOT(inputDeviceChanged(int))); CHECKED_CONNECT(m_outputDeviceComboBox, SIGNAL(activated(int)), this, SLOT(outputDeviceChanged(int))); CHECKED_CONNECT(m_windowFunctionComboBox, SIGNAL(activated(int)), this, SLOT(windowFunctionChanged(int))); // Add standard buttons to layout QDialogButtonBox *buttonBox = new QDialogButtonBox(this); buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); dialogLayout->addWidget(buttonBox); // Connect standard buttons CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(accept())); CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); setLayout(dialogLayout); } SettingsDialog::~SettingsDialog() { } void SettingsDialog::windowFunctionChanged(int index) { m_windowFunction = static_cast( m_windowFunctionComboBox->itemData(index).value()); } void SettingsDialog::inputDeviceChanged(int index) { m_inputDevice = m_inputDeviceComboBox->itemData(index).value(); } void SettingsDialog::outputDeviceChanged(int index) { m_outputDevice = m_outputDeviceComboBox->itemData(index).value(); } settingsdialog.h000066400000000000000000000062721225012771600343120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include "spectrum.h" #include #include QT_BEGIN_NAMESPACE class QComboBox; class QCheckBox; class QSlider; class QSpinBox; class QGridLayout; QT_END_NAMESPACE /** * Dialog used to control settings such as the audio input / output device * and the windowing function. */ class SettingsDialog : public QDialog { Q_OBJECT public: SettingsDialog(const QList &availableInputDevices, const QList &availableOutputDevices, QWidget *parent = 0); ~SettingsDialog(); WindowFunction windowFunction() const { return m_windowFunction; } const QAudioDeviceInfo &inputDevice() const { return m_inputDevice; } const QAudioDeviceInfo &outputDevice() const { return m_outputDevice; } private slots: void windowFunctionChanged(int index); void inputDeviceChanged(int index); void outputDeviceChanged(int index); private: WindowFunction m_windowFunction; QAudioDeviceInfo m_inputDevice; QAudioDeviceInfo m_outputDevice; QComboBox *m_inputDeviceComboBox; QComboBox *m_outputDeviceComboBox; QComboBox *m_windowFunctionComboBox; }; #endif // SETTINGSDIALOG_H spectrograph.cpp000066400000000000000000000174371225012771600343330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "spectrograph.h" #include #include #include #include const int NullTimerId = -1; const int NullIndex = -1; const int BarSelectionInterval = 2000; Spectrograph::Spectrograph(QWidget *parent) : QWidget(parent) , m_barSelected(NullIndex) , m_timerId(NullTimerId) , m_lowFreq(0.0) , m_highFreq(0.0) { setMinimumHeight(100); } Spectrograph::~Spectrograph() { } void Spectrograph::setParams(int numBars, qreal lowFreq, qreal highFreq) { Q_ASSERT(numBars > 0); Q_ASSERT(highFreq > lowFreq); m_bars.resize(numBars); m_lowFreq = lowFreq; m_highFreq = highFreq; updateBars(); } void Spectrograph::timerEvent(QTimerEvent *event) { Q_ASSERT(event->timerId() == m_timerId); Q_UNUSED(event) // suppress warnings in release builds killTimer(m_timerId); m_timerId = NullTimerId; m_barSelected = NullIndex; update(); } void Spectrograph::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); painter.fillRect(rect(), Qt::black); const int numBars = m_bars.count(); // Highlight region of selected bar if (m_barSelected != NullIndex && numBars) { QRect regionRect = rect(); regionRect.setLeft(m_barSelected * rect().width() / numBars); regionRect.setWidth(rect().width() / numBars); QColor regionColor(202, 202, 64); painter.setBrush(Qt::DiagCrossPattern); painter.fillRect(regionRect, regionColor); painter.setBrush(Qt::NoBrush); } QColor barColor(51, 204, 102); QColor clipColor(255, 255, 0); // Draw the outline const QColor gridColor = barColor.darker(); QPen gridPen(gridColor); painter.setPen(gridPen); painter.drawLine(rect().topLeft(), rect().topRight()); painter.drawLine(rect().topRight(), rect().bottomRight()); painter.drawLine(rect().bottomRight(), rect().bottomLeft()); painter.drawLine(rect().bottomLeft(), rect().topLeft()); QVector dashes; dashes << 2 << 2; gridPen.setDashPattern(dashes); painter.setPen(gridPen); // Draw vertical lines between bars if (numBars) { const int numHorizontalSections = numBars; QLine line(rect().topLeft(), rect().bottomLeft()); for (int i=1; i= 0.0 && value <= 1.0); QRect bar = rect(); bar.setLeft(rect().left() + leftPaddingWidth + (i * (gapWidth + barWidth))); bar.setWidth(barWidth); bar.setTop(rect().top() + gapWidth + (1.0 - value) * barHeight); bar.setBottom(rect().bottom() - gapWidth); QColor color = barColor; if (m_bars[i].clipped) color = clipColor; painter.fillRect(bar, color); } } } void Spectrograph::mousePressEvent(QMouseEvent *event) { const QPoint pos = event->pos(); const int index = m_bars.count() * (pos.x() - rect().left()) / rect().width(); selectBar(index); } void Spectrograph::reset() { m_spectrum.reset(); spectrumChanged(m_spectrum); } void Spectrograph::spectrumChanged(const FrequencySpectrum &spectrum) { m_spectrum = spectrum; updateBars(); } int Spectrograph::barIndex(qreal frequency) const { Q_ASSERT(frequency >= m_lowFreq && frequency < m_highFreq); const qreal bandWidth = (m_highFreq - m_lowFreq) / m_bars.count(); const int index = (frequency - m_lowFreq) / bandWidth; if (index <0 || index >= m_bars.count()) Q_ASSERT(false); return index; } QPair Spectrograph::barRange(int index) const { Q_ASSERT(index >= 0 && index < m_bars.count()); const qreal bandWidth = (m_highFreq - m_lowFreq) / m_bars.count(); return QPair(index * bandWidth, (index+1) * bandWidth); } void Spectrograph::updateBars() { m_bars.fill(Bar()); FrequencySpectrum::const_iterator i = m_spectrum.begin(); const FrequencySpectrum::const_iterator end = m_spectrum.end(); for ( ; i != end; ++i) { const FrequencySpectrum::Element e = *i; if (e.frequency >= m_lowFreq && e.frequency < m_highFreq) { Bar &bar = m_bars[barIndex(e.frequency)]; bar.value = qMax(bar.value, e.amplitude); bar.clipped |= e.clipped; } } update(); } void Spectrograph::selectBar(int index) { const QPair frequencyRange = barRange(index); const QString message = QString("%1 - %2 Hz") .arg(frequencyRange.first) .arg(frequencyRange.second); emit infoMessage(message, BarSelectionInterval); if (NullTimerId != m_timerId) killTimer(m_timerId); m_timerId = startTimer(BarSelectionInterval); m_barSelected = index; update(); } spectrograph.h000066400000000000000000000063411225012771600337700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SPECTROGRAPH_H #define SPECTROGRAPH_H #include "frequencyspectrum.h" #include /** * Widget which displays a spectrograph showing the frequency spectrum * of the window of audio samples most recently analyzed by the Engine. */ class Spectrograph : public QWidget { Q_OBJECT public: explicit Spectrograph(QWidget *parent = 0); ~Spectrograph(); void setParams(int numBars, qreal lowFreq, qreal highFreq); // QObject void timerEvent(QTimerEvent *event); // QWidget void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); signals: void infoMessage(const QString &message, int intervalMs); public slots: void reset(); void spectrumChanged(const FrequencySpectrum &spectrum); private: int barIndex(qreal frequency) const; QPair barRange(int barIndex) const; void updateBars(); void selectBar(int index); private: struct Bar { Bar() : value(0.0), clipped(false) { } qreal value; bool clipped; }; QVector m_bars; int m_barSelected; int m_timerId; qreal m_lowFreq; qreal m_highFreq; FrequencySpectrum m_spectrum; }; #endif // SPECTROGRAPH_H spectrum.h000066400000000000000000000122661225012771600331340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SPECTRUM_H #define SPECTRUM_H #include #include "utils.h" #include "fftreal_wrapper.h" // For FFTLengthPowerOfTwo //----------------------------------------------------------------------------- // Constants //----------------------------------------------------------------------------- // Number of audio samples used to calculate the frequency spectrum const int SpectrumLengthSamples = PowerOfTwo::Result; // Number of bands in the frequency spectrum const int SpectrumNumBands = 10; // Lower bound of first band in the spectrum const qreal SpectrumLowFreq = 0.0; // Hz // Upper band of last band in the spectrum const qreal SpectrumHighFreq = 1000.0; // Hz // Waveform window size in microseconds const qint64 WaveformWindowDuration = 500 * 1000; // Length of waveform tiles in bytes // Ideally, these would match the QAudio*::bufferSize(), but that isn't // available until some time after QAudio*::start() has been called, and we // need this value in order to initialize the waveform display. // We therefore just choose a sensible value. const int WaveformTileLength = 4096; // Fudge factor used to calculate the spectrum bar heights const qreal SpectrumAnalyserMultiplier = 0.15; // Disable message timeout const int NullMessageTimeout = -1; //----------------------------------------------------------------------------- // Types and data structures //----------------------------------------------------------------------------- enum WindowFunction { NoWindow, HannWindow }; const WindowFunction DefaultWindowFunction = HannWindow; struct Tone { Tone(qreal freq = 0.0, qreal amp = 0.0) : frequency(freq), amplitude(amp) { } // Start and end frequencies for swept tone generation qreal frequency; // Amplitude in range [0.0, 1.0] qreal amplitude; }; struct SweptTone { SweptTone(qreal start = 0.0, qreal end = 0.0, qreal amp = 0.0) : startFreq(start), endFreq(end), amplitude(amp) { Q_ASSERT(end >= start); } SweptTone(const Tone &tone) : startFreq(tone.frequency), endFreq(tone.frequency), amplitude(tone.amplitude) { } // Start and end frequencies for swept tone generation qreal startFreq; qreal endFreq; // Amplitude in range [0.0, 1.0] qreal amplitude; }; //----------------------------------------------------------------------------- // Macros //----------------------------------------------------------------------------- // Macro which connects a signal to a slot, and which causes application to // abort if the connection fails. This is intended to catch programming errors // such as mis-typing a signal or slot name. It is necessary to write our own // macro to do this - the following idiom // Q_ASSERT(connect(source, signal, receiver, slot)); // will not work because Q_ASSERT compiles to a no-op in release builds. #define CHECKED_CONNECT(source, signal, receiver, slot) \ if (!connect(source, signal, receiver, slot)) \ qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); // Handle some dependencies between macros defined in the .pro file #ifdef DISABLE_WAVEFORM #undef SUPERIMPOSE_PROGRESS_ON_WAVEFORM #endif #endif // SPECTRUM_H spectrum.qrc000066400000000000000000000002131225012771600334570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app images/record.png images/settings.png spectrumanalyser.cpp000066400000000000000000000224071225012771600352240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "spectrumanalyser.h" #include "utils.h" #include "fftreal_wrapper.h" #include #include #include #include SpectrumAnalyserThread::SpectrumAnalyserThread(QObject *parent) : QObject(parent) #ifndef DISABLE_FFT , m_fft(new FFTRealWrapper) #endif , m_numSamples(SpectrumLengthSamples) , m_windowFunction(DefaultWindowFunction) , m_window(SpectrumLengthSamples, 0.0) , m_input(SpectrumLengthSamples, 0.0) , m_output(SpectrumLengthSamples, 0.0) , m_spectrum(SpectrumLengthSamples) #ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD , m_thread(new QThread(this)) #endif { #ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD // moveToThread() cannot be called on a QObject with a parent setParent(0); moveToThread(m_thread); m_thread->start(); #endif calculateWindow(); } SpectrumAnalyserThread::~SpectrumAnalyserThread() { #ifndef DISABLE_FFT delete m_fft; #endif } void SpectrumAnalyserThread::setWindowFunction(WindowFunction type) { m_windowFunction = type; calculateWindow(); } void SpectrumAnalyserThread::calculateWindow() { for (int i=0; i(ptr); // Scale down to range [-1.0, 1.0] const DataType realSample = pcmToReal(pcmSample); const DataType windowedSample = realSample * m_window[i]; m_input[i] = windowedSample; ptr += bytesPerSample; } // Calculate the FFT m_fft->calculateFFT(m_output.data(), m_input.data()); // Analyze output to obtain amplitude and phase for each frequency for (int i=2; i<=m_numSamples/2; ++i) { // Calculate frequency of this complex sample m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples); const qreal real = m_output[i]; qreal imag = 0.0; if (i>0 && i 1.0); amplitude = qMax(qreal(0.0), amplitude); amplitude = qMin(qreal(1.0), amplitude); m_spectrum[i].amplitude = amplitude; } #endif emit calculationComplete(m_spectrum); } //============================================================================= // SpectrumAnalyser //============================================================================= SpectrumAnalyser::SpectrumAnalyser(QObject *parent) : QObject(parent) , m_thread(new SpectrumAnalyserThread(this)) , m_state(Idle) #ifdef DUMP_SPECTRUMANALYSER , m_count(0) #endif { CHECKED_CONNECT(m_thread, SIGNAL(calculationComplete(FrequencySpectrum)), this, SLOT(calculationComplete(FrequencySpectrum))); } SpectrumAnalyser::~SpectrumAnalyser() { } #ifdef DUMP_SPECTRUMANALYSER void SpectrumAnalyser::setOutputPath(const QString &outputDir) { m_outputDir.setPath(outputDir); m_textFile.setFileName(m_outputDir.filePath("spectrum.txt")); m_textFile.open(QIODevice::WriteOnly | QIODevice::Text); m_textStream.setDevice(&m_textFile); } #endif //----------------------------------------------------------------------------- // Public functions //----------------------------------------------------------------------------- void SpectrumAnalyser::setWindowFunction(WindowFunction type) { const bool b = QMetaObject::invokeMethod(m_thread, "setWindowFunction", Qt::AutoConnection, Q_ARG(WindowFunction, type)); Q_ASSERT(b); Q_UNUSED(b) // suppress warnings in release builds } void SpectrumAnalyser::calculate(const QByteArray &buffer, const QAudioFormat &format) { // QThread::currentThread is marked 'for internal use only', but // we're only using it for debug output here, so it's probably OK :) SPECTRUMANALYSER_DEBUG << "SpectrumAnalyser::calculate" << QThread::currentThread() << "state" << m_state; if (isReady()) { Q_ASSERT(isPCMS16LE(format)); const int bytesPerSample = format.sampleSize() * format.channelCount() / 8; #ifdef DUMP_SPECTRUMANALYSER m_count++; const QString pcmFileName = m_outputDir.filePath(QString("spectrum_%1.pcm").arg(m_count, 4, 10, QChar('0'))); QFile pcmFile(pcmFileName); pcmFile.open(QIODevice::WriteOnly); const int bufferLength = m_numSamples * bytesPerSample; pcmFile.write(buffer, bufferLength); m_textStream << "TimeDomain " << m_count << "\n"; const qint16* input = reinterpret_cast(buffer); for (int i=0; ifrequency << "\t" << x->amplitude<< "\t" << x->phase << "\n"; #endif } } bool SpectrumAnalyser::isReady() const { return (Idle == m_state); } void SpectrumAnalyser::cancelCalculation() { if (Busy == m_state) m_state = Cancelled; } //----------------------------------------------------------------------------- // Private slots //----------------------------------------------------------------------------- void SpectrumAnalyser::calculationComplete(const FrequencySpectrum &spectrum) { Q_ASSERT(Idle != m_state); if (Busy == m_state) emit spectrumChanged(spectrum); m_state = Idle; } spectrumanalyser.h000066400000000000000000000125461225012771600346740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SPECTRUMANALYSER_H #define SPECTRUMANALYSER_H #include #include #include #ifdef DUMP_SPECTRUMANALYSER #include #include #include #endif #include "frequencyspectrum.h" #include "spectrum.h" #ifndef DISABLE_FFT #include "FFTRealFixLenParam.h" #endif QT_FORWARD_DECLARE_CLASS(QAudioFormat) QT_FORWARD_DECLARE_CLASS(QThread) class FFTRealWrapper; class SpectrumAnalyserThreadPrivate; /** * Implementation of the spectrum analysis which can be run in a * separate thread. */ class SpectrumAnalyserThread : public QObject { Q_OBJECT public: SpectrumAnalyserThread(QObject *parent); ~SpectrumAnalyserThread(); public slots: void setWindowFunction(WindowFunction type); void calculateSpectrum(const QByteArray &buffer, int inputFrequency, int bytesPerSample); signals: void calculationComplete(const FrequencySpectrum &spectrum); private: void calculateWindow(); private: #ifndef DISABLE_FFT FFTRealWrapper* m_fft; #endif const int m_numSamples; WindowFunction m_windowFunction; #ifdef DISABLE_FFT typedef qreal DataType; #else typedef FFTRealFixLenParam::DataType DataType; #endif QVector m_window; QVector m_input; QVector m_output; FrequencySpectrum m_spectrum; #ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD QThread* m_thread; #endif }; /** * Class which performs frequency spectrum analysis on a window of * audio samples, provided to it by the Engine. */ class SpectrumAnalyser : public QObject { Q_OBJECT public: SpectrumAnalyser(QObject *parent = 0); ~SpectrumAnalyser(); #ifdef DUMP_SPECTRUMANALYSER void setOutputPath(const QString &outputPath); #endif public: /* * Set the windowing function which is applied before calculating the FFT */ void setWindowFunction(WindowFunction type); /* * Calculate a frequency spectrum * * \param buffer Audio data * \param format Format of audio data * * Frequency spectrum is calculated asynchronously. The result is returned * via the spectrumChanged signal. * * An ongoing calculation can be cancelled by calling cancelCalculation(). * */ void calculate(const QByteArray &buffer, const QAudioFormat &format); /* * Check whether the object is ready to perform another calculation */ bool isReady() const; /* * Cancel an ongoing calculation * * Note that cancelling is asynchronous. */ void cancelCalculation(); signals: void spectrumChanged(const FrequencySpectrum &spectrum); private slots: void calculationComplete(const FrequencySpectrum &spectrum); private: void calculateWindow(); private: SpectrumAnalyserThread* m_thread; enum State { Idle, Busy, Cancelled }; State m_state; #ifdef DUMP_SPECTRUMANALYSER QDir m_outputDir; int m_count; QFile m_textFile; QTextStream m_textStream; #endif }; #endif // SPECTRUMANALYSER_H tonegenerator.cpp000066400000000000000000000067571225012771600345110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "spectrum.h" #include "utils.h" #include #include #include #include void generateTone(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer) { Q_ASSERT(isPCMS16LE(format)); const int channelBytes = format.sampleSize() / 8; const int sampleBytes = format.channelCount() * channelBytes; int length = buffer.size(); const int numSamples = buffer.size() / sampleBytes; Q_ASSERT(length % sampleBytes == 0); Q_UNUSED(sampleBytes) // suppress warning in release builds unsigned char *ptr = reinterpret_cast(buffer.data()); qreal phase = 0.0; const qreal d = 2 * M_PI / format.sampleRate(); // We can't generate a zero-frequency sine wave const qreal startFreq = tone.startFreq ? tone.startFreq : 1.0; // Amount by which phase increases on each sample qreal phaseStep = d * startFreq; // Amount by which phaseStep increases on each sample // If this is non-zero, the output is a frequency-swept tone const qreal phaseStepStep = d * (tone.endFreq - startFreq) / numSamples; while (length) { const qreal x = tone.amplitude * qSin(phase); const qint16 value = realToPcm(x); for (int i=0; i(value, ptr); ptr += channelBytes; length -= channelBytes; } phase += phaseStep; while (phase > 2 * M_PI) phase -= 2 * M_PI; phaseStep += phaseStepStep; } } tonegenerator.h000066400000000000000000000044111225012771600341370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TONEGENERATOR_H #define TONEGENERATOR_H #include #include "spectrum.h" QT_BEGIN_NAMESPACE class QAudioFormat; class QByteArray; QT_END_NAMESPACE /** * Generate a sine wave */ void generateTone(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer); #endif // TONEGENERATOR_H tonegeneratordialog.cpp000066400000000000000000000135301225012771600356540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "tonegeneratordialog.h" #include #include #include #include #include #include #include #include const int ToneGeneratorFreqMin = 1; const int ToneGeneratorFreqMax = 1000; const int ToneGeneratorFreqDefault = 440; const int ToneGeneratorAmplitudeDefault = 75; ToneGeneratorDialog::ToneGeneratorDialog(QWidget *parent) : QDialog(parent) , m_toneGeneratorSweepCheckBox(new QCheckBox(tr("Frequency sweep"), this)) , m_frequencySweepEnabled(true) , m_toneGeneratorControl(new QWidget(this)) , m_toneGeneratorFrequencyControl(new QWidget(this)) , m_frequencySlider(new QSlider(Qt::Horizontal, this)) , m_frequencySpinBox(new QSpinBox(this)) , m_frequency(ToneGeneratorFreqDefault) , m_amplitudeSlider(new QSlider(Qt::Horizontal, this)) { QVBoxLayout *dialogLayout = new QVBoxLayout(this); m_toneGeneratorSweepCheckBox->setChecked(true); // Configure tone generator controls m_frequencySlider->setRange(ToneGeneratorFreqMin, ToneGeneratorFreqMax); m_frequencySlider->setValue(ToneGeneratorFreqDefault); m_frequencySpinBox->setRange(ToneGeneratorFreqMin, ToneGeneratorFreqMax); m_frequencySpinBox->setValue(ToneGeneratorFreqDefault); m_amplitudeSlider->setRange(0, 100); m_amplitudeSlider->setValue(ToneGeneratorAmplitudeDefault); // Add widgets to layout QGridLayout *frequencyControlLayout = new QGridLayout; QLabel *frequencyLabel = new QLabel(tr("Frequency (Hz)"), this); frequencyControlLayout->addWidget(frequencyLabel, 0, 0, 2, 1); frequencyControlLayout->addWidget(m_frequencySlider, 0, 1); frequencyControlLayout->addWidget(m_frequencySpinBox, 1, 1); m_toneGeneratorFrequencyControl->setLayout(frequencyControlLayout); m_toneGeneratorFrequencyControl->setEnabled(false); QGridLayout *toneGeneratorLayout = new QGridLayout; QLabel *amplitudeLabel = new QLabel(tr("Amplitude"), this); toneGeneratorLayout->addWidget(m_toneGeneratorSweepCheckBox, 0, 1); toneGeneratorLayout->addWidget(m_toneGeneratorFrequencyControl, 1, 0, 1, 2); toneGeneratorLayout->addWidget(amplitudeLabel, 2, 0); toneGeneratorLayout->addWidget(m_amplitudeSlider, 2, 1); m_toneGeneratorControl->setLayout(toneGeneratorLayout); m_toneGeneratorControl->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); dialogLayout->addWidget(m_toneGeneratorControl); // Connect CHECKED_CONNECT(m_toneGeneratorSweepCheckBox, SIGNAL(toggled(bool)), this, SLOT(frequencySweepEnabled(bool))); CHECKED_CONNECT(m_frequencySlider, SIGNAL(valueChanged(int)), m_frequencySpinBox, SLOT(setValue(int))); CHECKED_CONNECT(m_frequencySpinBox, SIGNAL(valueChanged(int)), m_frequencySlider, SLOT(setValue(int))); // Add standard buttons to layout QDialogButtonBox *buttonBox = new QDialogButtonBox(this); buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); dialogLayout->addWidget(buttonBox); // Connect standard buttons CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(accept())); CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); setLayout(dialogLayout); } ToneGeneratorDialog::~ToneGeneratorDialog() { } bool ToneGeneratorDialog::isFrequencySweepEnabled() const { return m_toneGeneratorSweepCheckBox->isChecked(); } qreal ToneGeneratorDialog::frequency() const { return qreal(m_frequencySlider->value()); } qreal ToneGeneratorDialog::amplitude() const { return qreal(m_amplitudeSlider->value()) / 100.0; } void ToneGeneratorDialog::frequencySweepEnabled(bool enabled) { m_frequencySweepEnabled = enabled; m_toneGeneratorFrequencyControl->setEnabled(!enabled); } tonegeneratordialog.h000066400000000000000000000055771225012771600353350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TONEGENERATORDIALOG_H #define TONEGENERATORDIALOG_H #include "spectrum.h" #include #include QT_BEGIN_NAMESPACE class QCheckBox; class QSlider; class QSpinBox; class QGridLayout; QT_END_NAMESPACE /** * Dialog which controls the parameters of the tone generator. */ class ToneGeneratorDialog : public QDialog { Q_OBJECT public: explicit ToneGeneratorDialog(QWidget *parent = 0); ~ToneGeneratorDialog(); bool isFrequencySweepEnabled() const; qreal frequency() const; qreal amplitude() const; private slots: void frequencySweepEnabled(bool enabled); private: QCheckBox *m_toneGeneratorSweepCheckBox; bool m_frequencySweepEnabled; QWidget *m_toneGeneratorControl; QWidget *m_toneGeneratorFrequencyControl; QSlider *m_frequencySlider; QSpinBox *m_frequencySpinBox; qreal m_frequency; QSlider *m_amplitudeSlider; }; #endif // TONEGENERATORDIALOG_H utils.cpp000066400000000000000000000111541225012771600327600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "utils.h" qint64 audioDuration(const QAudioFormat &format, qint64 bytes) { return (bytes * 1000000) / (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)); } qint64 audioLength(const QAudioFormat &format, qint64 microSeconds) { qint64 result = (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)) * microSeconds / 1000000; result -= result % (format.channelCount() * format.sampleSize()); return result; } qreal nyquistFrequency(const QAudioFormat &format) { return format.sampleRate() / 2; } QString formatToString(const QAudioFormat &format) { QString result; if (QAudioFormat() != format) { if (format.codec() == "audio/pcm") { Q_ASSERT(format.sampleType() == QAudioFormat::SignedInt); const QString formatEndian = (format.byteOrder() == QAudioFormat::LittleEndian) ? QString("LE") : QString("BE"); QString formatType; switch (format.sampleType()) { case QAudioFormat::SignedInt: formatType = "signed"; break; case QAudioFormat::UnSignedInt: formatType = "unsigned"; break; case QAudioFormat::Float: formatType = "float"; break; case QAudioFormat::Unknown: formatType = "unknown"; break; } QString formatChannels = QString("%1 channels").arg(format.channelCount()); switch (format.channelCount()) { case 1: formatChannels = "mono"; break; case 2: formatChannels = "stereo"; break; } result = QString("%1 Hz %2 bit %3 %4 %5") .arg(format.sampleRate()) .arg(format.sampleSize()) .arg(formatType) .arg(formatEndian) .arg(formatChannels); } else { result = format.codec(); } } return result; } bool isPCM(const QAudioFormat &format) { return (format.codec() == "audio/pcm"); } bool isPCMS16LE(const QAudioFormat &format) { return isPCM(format) && format.sampleType() == QAudioFormat::SignedInt && format.sampleSize() == 16 && format.byteOrder() == QAudioFormat::LittleEndian; } const qint16 PCMS16MaxValue = 32767; const quint16 PCMS16MaxAmplitude = 32768; // because minimum is -32768 qreal pcmToReal(qint16 pcm) { return qreal(pcm) / PCMS16MaxAmplitude; } qint16 realToPcm(qreal real) { return real * PCMS16MaxValue; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/utils.h000066400000000000000000000073401225012771600325060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef UTILS_H #define UTILS_H #include #include QT_FORWARD_DECLARE_CLASS(QAudioFormat) //----------------------------------------------------------------------------- // Miscellaneous utility functions //----------------------------------------------------------------------------- qint64 audioDuration(const QAudioFormat &format, qint64 bytes); qint64 audioLength(const QAudioFormat &format, qint64 microSeconds); QString formatToString(const QAudioFormat &format); qreal nyquistFrequency(const QAudioFormat &format); // Scale PCM value to [-1.0, 1.0] qreal pcmToReal(qint16 pcm); // Scale real value in [-1.0, 1.0] to PCM qint16 realToPcm(qreal real); // Check whether the audio format is PCM bool isPCM(const QAudioFormat &format); // Check whether the audio format is signed, little-endian, 16-bit PCM bool isPCMS16LE(const QAudioFormat &format); // Compile-time calculation of powers of two template class PowerOfTwo { public: static const int Result = PowerOfTwo::Result * 2; }; template<> class PowerOfTwo<0> { public: static const int Result = 1; }; //----------------------------------------------------------------------------- // Debug output //----------------------------------------------------------------------------- class NullDebug { public: template NullDebug& operator<<(const T&) { return *this; } }; inline NullDebug nullDebug() { return NullDebug(); } #ifdef LOG_ENGINE # define ENGINE_DEBUG qDebug() #else # define ENGINE_DEBUG nullDebug() #endif #ifdef LOG_SPECTRUMANALYSER # define SPECTRUMANALYSER_DEBUG qDebug() #else # define SPECTRUMANALYSER_DEBUG nullDebug() #endif #ifdef LOG_WAVEFORM # define WAVEFORM_DEBUG qDebug() #else # define WAVEFORM_DEBUG nullDebug() #endif #endif // UTILS_H waveform.cpp000066400000000000000000000344051225012771600334520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "waveform.h" #include "utils.h" #include #include #include //#define PAINT_EVENT_TRACE #ifdef PAINT_EVENT_TRACE # define WAVEFORM_PAINT_DEBUG qDebug() #else # define WAVEFORM_PAINT_DEBUG nullDebug() #endif Waveform::Waveform(QWidget *parent) : QWidget(parent) , m_bufferPosition(0) , m_bufferLength(0) , m_audioPosition(0) , m_active(false) , m_tileLength(0) , m_tileArrayStart(0) , m_windowPosition(0) , m_windowLength(0) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); setMinimumHeight(50); } Waveform::~Waveform() { deletePixmaps(); } void Waveform::paintEvent(QPaintEvent * /*event*/) { QPainter painter(this); painter.fillRect(rect(), Qt::black); if (m_active) { WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "windowPosition" << m_windowPosition << "windowLength" << m_windowLength; qint64 pos = m_windowPosition; const qint64 windowEnd = m_windowPosition + m_windowLength; int destLeft = 0; int destRight = 0; while (pos < windowEnd) { const TilePoint point = tilePoint(pos); WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos" << pos << "tileIndex" << point.index << "positionOffset" << point.positionOffset << "pixelOffset" << point.pixelOffset; if (point.index != NullIndex) { const Tile &tile = m_tiles[point.index]; if (tile.painted) { const qint64 sectionLength = qMin((m_tileLength - point.positionOffset), (windowEnd - pos)); Q_ASSERT(sectionLength > 0); const int sourceRight = tilePixelOffset(point.positionOffset + sectionLength); destRight = windowPixelOffset(pos - m_windowPosition + sectionLength); QRect destRect = rect(); destRect.setLeft(destLeft); destRect.setRight(destRight); QRect sourceRect(QPoint(), m_pixmapSize); sourceRect.setLeft(point.pixelOffset); sourceRect.setRight(sourceRight); WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "tileIndex" << point.index << "source" << point.pixelOffset << sourceRight << "dest" << destLeft << destRight; painter.drawPixmap(destRect, *tile.pixmap, sourceRect); destLeft = destRight; if (point.index < m_tiles.count()) { pos = tilePosition(point.index + 1); WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos ->" << pos; } else { // Reached end of tile array WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "reached end of tile array"; break; } } else { // Passed last tile which is painted WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "tile" << point.index << "not painted"; break; } } else { // pos is past end of tile array WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos" << pos << "past end of tile array"; break; } } WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "final pos" << pos << "final x" << destRight; } } void Waveform::resizeEvent(QResizeEvent *event) { if (event->size() != event->oldSize()) createPixmaps(event->size()); } void Waveform::initialize(const QAudioFormat &format, qint64 audioBufferSize, qint64 windowDurationUs) { WAVEFORM_DEBUG << "Waveform::initialize" << "audioBufferSize" << audioBufferSize << "windowDurationUs" << windowDurationUs; reset(); m_format = format; // Calculate tile size m_tileLength = audioBufferSize; // Calculate window size m_windowLength = audioLength(m_format, windowDurationUs); // Calculate number of tiles required int nTiles; if (m_tileLength > m_windowLength) { nTiles = 2; } else { nTiles = m_windowLength / m_tileLength + 1; if (m_windowLength % m_tileLength) ++nTiles; } WAVEFORM_DEBUG << "Waveform::initialize" << "tileLength" << m_tileLength << "windowLength" << m_windowLength << "nTiles" << nTiles; m_pixmaps.fill(0, nTiles); m_tiles.resize(nTiles); createPixmaps(rect().size()); m_active = true; } void Waveform::reset() { WAVEFORM_DEBUG << "Waveform::reset"; m_bufferPosition = 0; m_buffer = QByteArray(); m_audioPosition = 0; m_format = QAudioFormat(); m_active = false; deletePixmaps(); m_tiles.clear(); m_tileLength = 0; m_tileArrayStart = 0; m_windowPosition = 0; m_windowLength = 0; } void Waveform::bufferChanged(qint64 position, qint64 length, const QByteArray &buffer) { WAVEFORM_DEBUG << "Waveform::bufferChanged" << "audioPosition" << m_audioPosition << "bufferPosition" << position << "bufferLength" << length; m_bufferPosition = position; m_bufferLength = length; m_buffer = buffer; paintTiles(); } void Waveform::audioPositionChanged(qint64 position) { WAVEFORM_DEBUG << "Waveform::audioPositionChanged" << "audioPosition" << position << "bufferPosition" << m_bufferPosition << "bufferLength" << m_bufferLength; if (position >= m_bufferPosition) { if (position + m_windowLength > m_bufferPosition + m_bufferLength) position = qMax(qint64(0), m_bufferPosition + m_bufferLength - m_windowLength); m_audioPosition = position; setWindowPosition(position); } } void Waveform::deletePixmaps() { QPixmap *pixmap; foreach (pixmap, m_pixmaps) delete pixmap; m_pixmaps.clear(); } void Waveform::createPixmaps(const QSize &widgetSize) { m_pixmapSize = widgetSize; m_pixmapSize.setWidth(qreal(widgetSize.width()) * m_tileLength / m_windowLength); WAVEFORM_DEBUG << "Waveform::createPixmaps" << "widgetSize" << widgetSize << "pixmapSize" << m_pixmapSize; Q_ASSERT(m_tiles.count() == m_pixmaps.count()); // (Re)create pixmaps for (int i=0; i= oldPosition) && (m_windowPosition - m_tileArrayStart < (m_tiles.count() * m_tileLength))) { // Work out how many tiles need to be shuffled const qint64 offset = m_windowPosition - m_tileArrayStart; const int nTiles = offset / m_tileLength; shuffleTiles(nTiles); } else { resetTiles(m_windowPosition); } if (!paintTiles() && m_windowPosition != oldPosition) update(); } qint64 Waveform::tilePosition(int index) const { return m_tileArrayStart + index * m_tileLength; } Waveform::TilePoint Waveform::tilePoint(qint64 position) const { TilePoint result; if (position >= m_tileArrayStart) { const qint64 tileArrayEnd = m_tileArrayStart + m_tiles.count() * m_tileLength; if (position < tileArrayEnd) { const qint64 offsetIntoTileArray = position - m_tileArrayStart; result.index = offsetIntoTileArray / m_tileLength; Q_ASSERT(result.index >= 0 && result.index <= m_tiles.count()); result.positionOffset = offsetIntoTileArray % m_tileLength; result.pixelOffset = tilePixelOffset(result.positionOffset); Q_ASSERT(result.pixelOffset >= 0 && result.pixelOffset <= m_pixmapSize.width()); } } return result; } int Waveform::tilePixelOffset(qint64 positionOffset) const { Q_ASSERT(positionOffset >= 0 && positionOffset <= m_tileLength); const int result = (qreal(positionOffset) / m_tileLength) * m_pixmapSize.width(); return result; } int Waveform::windowPixelOffset(qint64 positionOffset) const { Q_ASSERT(positionOffset >= 0 && positionOffset <= m_windowLength); const int result = (qreal(positionOffset) / m_windowLength) * rect().width(); return result; } bool Waveform::paintTiles() { WAVEFORM_DEBUG << "Waveform::paintTiles"; bool updateRequired = false; for (int i=0; i= tileEnd) { paintTile(i); updateRequired = true; } } } if (updateRequired) update(); return updateRequired; } void Waveform::paintTile(int index) { const qint64 tileStart = m_tileArrayStart + index * m_tileLength; WAVEFORM_DEBUG << "Waveform::paintTile" << "index" << index << "bufferPosition" << m_bufferPosition << "bufferLength" << m_bufferLength << "start" << tileStart << "end" << tileStart + m_tileLength; Q_ASSERT(m_bufferPosition <= tileStart); Q_ASSERT(m_bufferPosition + m_bufferLength >= tileStart + m_tileLength); Tile &tile = m_tiles[index]; Q_ASSERT(!tile.painted); const qint16* base = reinterpret_cast(m_buffer.constData()); const qint16* buffer = base + ((tileStart - m_bufferPosition) / 2); const int numSamples = m_tileLength / (2 * m_format.channelCount()); QPainter painter(tile.pixmap); painter.fillRect(tile.pixmap->rect(), Qt::black); QPen pen(Qt::white); painter.setPen(pen); // Calculate initial PCM value qint16 previousPcmValue = 0; if (buffer > base) previousPcmValue = *(buffer - m_format.channelCount()); // Calculate initial point const qreal previousRealValue = pcmToReal(previousPcmValue); const int originY = ((previousRealValue + 1.0) / 2) * m_pixmapSize.height(); const QPoint origin(0, originY); QLine line(origin, origin); for (int i=0; i(ptr) - m_buffer.constData(); Q_ASSERT(offset >= 0); Q_ASSERT(offset < m_bufferLength); Q_UNUSED(offset); const qint16 pcmValue = *ptr; const qreal realValue = pcmToReal(pcmValue); const int x = tilePixelOffset(i * 2 * m_format.channelCount()); const int y = ((realValue + 1.0) / 2) * m_pixmapSize.height(); line.setP2(QPoint(x, y)); painter.drawLine(line); line.setP1(line.p2()); } tile.painted = true; } void Waveform::shuffleTiles(int n) { WAVEFORM_DEBUG << "Waveform::shuffleTiles" << "n" << n; while (n--) { Tile tile = m_tiles.first(); tile.painted = false; m_tiles.erase(m_tiles.begin()); m_tiles += tile; m_tileArrayStart += m_tileLength; } WAVEFORM_DEBUG << "Waveform::shuffleTiles" << "tileArrayStart" << m_tileArrayStart; } void Waveform::resetTiles(qint64 newStartPos) { WAVEFORM_DEBUG << "Waveform::resetTiles" << "newStartPos" << newStartPos; QVector::iterator i = m_tiles.begin(); for ( ; i != m_tiles.end(); ++i) i->painted = false; m_tileArrayStart = newStartPos; } waveform.h000066400000000000000000000140141225012771600331110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WAVEFORM_H #define WAVEFORM_H #include #include #include #include /** * Widget which displays a section of the audio waveform. * * The waveform is rendered on a set of QPixmaps which form a group of tiles * whose extent covers the widget. As the audio position is updated, these * tiles are scrolled from left to right; when the left-most tile scrolls * outside the widget, it is moved to the right end of the tile array and * painted with the next section of the waveform. */ class Waveform : public QWidget { Q_OBJECT public: explicit Waveform(QWidget *parent = 0); ~Waveform(); // QWidget void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); void initialize(const QAudioFormat &format, qint64 audioBufferSize, qint64 windowDurationUs); void reset(); void setAutoUpdatePosition(bool enabled); public slots: void bufferChanged(qint64 position, qint64 length, const QByteArray &buffer); void audioPositionChanged(qint64 position); private: static const int NullIndex = -1; void deletePixmaps(); /* * (Re)create all pixmaps, repaint and update the display. * Triggers an update(); */ void createPixmaps(const QSize &newSize); /* * Update window position. * Triggers an update(). */ void setWindowPosition(qint64 position); /* * Base position of tile */ qint64 tilePosition(int index) const; /* * Structure which identifies a point within a given * tile. */ struct TilePoint { TilePoint(int idx = 0, qint64 pos = 0, qint64 pix = 0) : index(idx), positionOffset(pos), pixelOffset(pix) { } // Index of tile int index; // Number of bytes from start of tile qint64 positionOffset; // Number of pixels from left of corresponding pixmap int pixelOffset; }; /* * Convert position in m_buffer into a tile index and an offset in pixels * into the corresponding pixmap. * * \param position Offset into m_buffer, in bytes * If position is outside the tile array, index is NullIndex and * offset is zero. */ TilePoint tilePoint(qint64 position) const; /* * Convert offset in bytes into a tile into an offset in pixels * within that tile. */ int tilePixelOffset(qint64 positionOffset) const; /* * Convert offset in bytes into the window into an offset in pixels * within the widget rect(). */ int windowPixelOffset(qint64 positionOffset) const; /* * Paint all tiles which can be painted. * \return true iff update() was called */ bool paintTiles(); /* * Paint the specified tile * * \pre Sufficient data is available to completely paint the tile, i.e. * m_dataLength is greater than the upper bound of the tile. */ void paintTile(int index); /* * Move the first n tiles to the end of the array, and mark them as not * painted. */ void shuffleTiles(int n); /* * Reset tile array */ void resetTiles(qint64 newStartPos); private: qint64 m_bufferPosition; qint64 m_bufferLength; QByteArray m_buffer; qint64 m_audioPosition; QAudioFormat m_format; bool m_active; QSize m_pixmapSize; QVector m_pixmaps; struct Tile { // Pointer into parent m_pixmaps array QPixmap* pixmap; // Flag indicating whether this tile has been painted bool painted; }; QVector m_tiles; // Length of audio data in bytes depicted by each tile qint64 m_tileLength; // Position in bytes of the first tile, relative to m_buffer qint64 m_tileArrayStart; qint64 m_windowPosition; qint64 m_windowLength; }; #endif // WAVEFORM_H wavfile.cpp000066400000000000000000000120151225012771600332520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include "utils.h" #include "wavfile.h" struct chunk { char id[4]; quint32 size; }; struct RIFFHeader { chunk descriptor; // "RIFF" char type[4]; // "WAVE" }; struct WAVEHeader { chunk descriptor; quint16 audioFormat; quint16 numChannels; quint32 sampleRate; quint32 byteRate; quint16 blockAlign; quint16 bitsPerSample; }; struct DATAHeader { chunk descriptor; }; struct CombinedHeader { RIFFHeader riff; WAVEHeader wave; }; WavFile::WavFile(QObject *parent) : QFile(parent) , m_headerLength(0) { } bool WavFile::open(const QString &fileName) { close(); setFileName(fileName); return QFile::open(QIODevice::ReadOnly) && readHeader(); } const QAudioFormat &WavFile::fileFormat() const { return m_fileFormat; } qint64 WavFile::headerLength() const { return m_headerLength; } bool WavFile::readHeader() { seek(0); CombinedHeader header; bool result = read(reinterpret_cast(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader); if (result) { if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0 || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0) && memcmp(&header.riff.type, "WAVE", 4) == 0 && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0 && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0)) { // Read off remaining header information DATAHeader dataHeader; if (qFromLittleEndian(header.wave.descriptor.size) > sizeof(WAVEHeader)) { // Extended data available quint16 extraFormatBytes; if (peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16)) return false; const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian(extraFormatBytes); if (read(throwAwayBytes).size() != throwAwayBytes) return false; } if (read((char*)&dataHeader, sizeof(DATAHeader)) != sizeof(DATAHeader)) return false; // Establish format if (memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0) m_fileFormat.setByteOrder(QAudioFormat::LittleEndian); else m_fileFormat.setByteOrder(QAudioFormat::BigEndian); int bps = qFromLittleEndian(header.wave.bitsPerSample); m_fileFormat.setChannelCount(qFromLittleEndian(header.wave.numChannels)); m_fileFormat.setCodec("audio/pcm"); m_fileFormat.setSampleRate(qFromLittleEndian(header.wave.sampleRate)); m_fileFormat.setSampleSize(qFromLittleEndian(header.wave.bitsPerSample)); m_fileFormat.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt); } else { result = false; } } m_headerLength = pos(); return result; } wavfile.h000066400000000000000000000046001225012771600327200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/app/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WAVFILE_H #define WAVFILE_H #include #include #include class WavFile : public QFile { public: WavFile(QObject *parent = 0); using QFile::open; bool open(const QString &fileName); const QAudioFormat &fileFormat() const; qint64 headerLength() const; private: bool readHeader(); private: QAudioFormat m_fileFormat; qint64 m_headerLength; }; #endif // WAVFILE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/doc/000077500000000000000000000000001225012771600311565ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/doc/images/000077500000000000000000000000001225012771600324235ustar00rootroot00000000000000spectrum-demo.png000066400000000000000000000244041225012771600356420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/doc/images‰PNG  IHDR-ÿ¤b€~sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ  ¶¤yòtEXtCommentCreated with GIMPW IDATxÚíyxUÖÿ¿U, $ ÙÀ²«hŒÈÎëâ60Î8:£3îˆïèl‚:ãö"¿AEÙÅ \A((¨,‚@ÈÒ Y:Ý]¿?ÒÕ©®®Nz_¿Ÿçɽ:}ëÖ÷žsî­Û‚¡¡^!„„ "›€BÑ"„Š!„P´!-B¡hBE‹BÑ"„Š!„P´!-B¡hBE‹lÚ´ååŸGåwÿþûï±bÅJvŠ '6|ºûöïwúzMM îøÍllܸÐÔÔ„¯¶mƒ$y¶)ˆÚ^0ùî»=ظi;A˜î_`sy9Ö­]‡êêjdegcÊäÉ?~œíõ¶¶6¼úÚlÛ¶ PZZŠ›nšŽø¸8Û{víÚ¥K—âÄÉ“èÝ»7¦ßx#† ì– ™#GŽàƒÜÁƒÛ½öŸÿ<‡“UUxâ¯ÿëñ÷ݳg<ý ~ÿ»;1bć×þùg|ðÁ‡¨Ø»ƒÿoÑË'>>99½‘šš øöÛoñÒÿ-Ä’×^…N§óÚ^¨ÒÕù€>üK–¼îð|ZZ^|áy* E«k¶ý5.|Óo¼ýû—`OEþ»x1zôèÒÒ  _^„]»vá–Y³ I,~åU´˜3g6 ²²ó,ÀŒÄôéÓñÙÆÏðÔüùxò‰¿"77×%àÔ©SxçÝw±iÓf˜L&Í÷”—ŽW^}£GÆôo@Zš’$A·—ššŠÇæÎõ™ÿ¾¶lyø!ˆbg¢C5¡huÏ·ß~‹~ýúbʔɀ¢¢"|ùåW¨Ø[ÒÒ QSSƒ­[·â¶ÛnÅE47·à•W_Åu×ýX÷þÐëõ˜3{6t:€»ïù#ÞÿàÜ~Ûm.Ùð„`ÞãŽ×í·Ý†±c/qx~ÅÊUhn>ƒ?ßw/žüÛß5#„ÿ.^ŒG}E…….ùpðàA<ðÀƒ8qò$ÒÒÒpÍ5Wãâ_üÐÞÞŽ™7ÏÂoçÌAYÙhÛgnš1‹W_Yì`󫯾Âê7× ºº‰‰‰˜:e ®¸ârM{ƒ¯¾¶;wî„ÑhDZZŠŠŠð§?Þøbˬ}o-ªkjÐÖÖ}ZÆO+¯¸Â&Ä---xã¥Ø¶}; I fΜ¬¬,›O;vìÀÒeËP]]ƒììlÄÇÇ{Ý÷JJJ\Š8åïPU] £ÑˆÌÌL\yÅ8pàvíÞææfœÝ¯n¿ý6ôêÕ«3¢®¨ÀŠ+qôèQ¤¤¤`ì%—ફ®´ åÒeËðõ×ßàôéÓ°X,8묳pݯóÏ?Ïf£ºº¯¿ñ¾ûnt:Î;ï\Üxà !íF´hõÌ¾Ú†ªª*ôêÕ ƒUUU˜3|ø0H¯H8pàF…ýû÷cðàÁ¶ƒAƒÎÁþý\¶¡…ÉlF{{»ÝsE=¨°¨ÿøG§ø,^ü Nžyy€õ6ààÁƒxèÁœFnÝu²={*P\\ŒK/ФÄ$”^Žüó_xâ¯ÿ‹B'‘×!C0qâ›(×ÖÖâÝ÷ÞëR´òrsF Ìf3Œ~ýúuéï'ë×£¶¶O/˜o‹ŠŽŸ8a'Z˜˜ˆ#††‚ï¾ûÛ¶mÇÈóÏÇ÷ß½{÷âoO>‚‚ëûgáѹsq´²ùùxoíZôíÛ×.•?}ê4ÖoØàUß›yó,Õ 2Çi»%&&Ú‚‚|µm† fÞêêj¬ZýfgT½|òrsñ»ßÝ A0bÄp°lùrL:éééƒv¯^¶Úk¿~ý0ç·wbÇŽ;ö|üñÇhhhÀãó³õלÜ\<ôÐÃØ¶m.¼ðBŠV08sæ ªª«qÑE£•™…½Ø‡;wbÒ¤‰ÈÉÉqÙŽß:3gÌ@ß¾ÅvÏ­\µgΜ±{®²²K–¼Ž_]{- àѱÌf3 †‚ÁƒYű_ý 6nÚ„›]LÏxvìØ ³Ùì‘ùù9r$æÏ_€ÒÒRLœ0%%g;MMóòòìÒ8WÈÍËE]]à§Ÿû˜c °¦ùù¨¬¬DYY™ÏÏïãóæÙÕ´zöÌvés)))HHH@ƒ¡3bÎÌÌ‚ÉdBss3’’’ðáCsñÅvÕ!ƒñúfüôÓO6ÑR× SRRlmóÇ——g,(*,Drr2þðE+X¼öÚkèÕ³'n½å–ŽÈëÒ©˜ûØ<¼öÚÜÿ_l'¬Á`@†õDË‘Sºõ5½^úûˆ©¡¾ÞöYWlh^\¹9ÑFJr²h™L&<ÿ‹()9—]ö?·ƒN§C\\œmA••…†ƒ[)Ùl†ÙlvŒì\H'DQÄ=wÿûöíÇ}Œy?މ'àæ™35„ÖÎý7q±q¶‰ˆØ¸ØÑzäa$&&Ú½OŽXF#ÌN&.¼¡¨¨Ð£YT¹a1w¦—ºmðñ†¸¸8˜Ì&D:a½NëÈ‘£vUll,JÎ>5§jú÷ìÚ¹Ëöž]»wC”””tnû—`Ïž [‡1›Í¨Ø»ý­Ÿuņ§¼õÖÛ¨®®ÆœÙ³½®1äää`ï¾}v‚xüøqœuV/—mìܹyyyˆÓXÊ‘”˜ c½Vw 8÷ÜýL»þz|òÉz´´´h¦™?ûçü>}léUNNŽÝŸ\K+..Âîï¾s¨A…2ÅEEØSQaŸþWT@E§©¾ƒâ";vÌ®zäÈ455¡oqqX‹VXGZÆ ÅÆM›_ü>}pôèQl./ÇØK.dggã /IJåË‘””I–/_‹FBfffGt6u*¶lÙŠ… _Ƙ1ã³Ï6¢¡¡S§NqÙ†'TUUaíºu?nÎ47ãLssGí,5Õ£ÙK§NÅ /¾ˆ5kÞ°áÃðÉ'ëÑÖÖ† ãÇ;ýLuUöìÙƒööv|±e öTTàwý^ó½…E…EËW¬@Ùè2TUÄè²2»µj§NŸÆÎ;PXX‹EÂ?ýˆøøxÄÅÅ9ˆÆäÉ“ðñ'Ÿàé§ŸÁ•W]ÙáÃ[ÜúÎýúõÃ!ƒñßů ¶®ùùhj:‹Åb›évýõxäѹø×SOaü¸ñHLLDå±Ênm>|DSŒeöíßo—Ê"šœœìu¿¾îº_ã‘Gçâù^Ä/~Q†ãÇcåÊU˜Â‡}d{þÊ+¯À¯õ+·í••Fƒ¡}ô1Þzûmäååᑇr*¬žƒíÛ·cÁÓÏÀl6#¿O<øà¶š˜š¬ÌLÜ2ëf¬~óMlÙ²gõê…AƒÙMÓ744à£?AUUbbb——‡{ÿôGèt:ÑÒëõøó}÷bùŠ•xæ™g‘œœŒ´´4!èŽ?Üu–¯X‰uëÞGSSRSS1zôh›hâñyá7–â¹çŸ‡ 5- C‡éÒîÒeËž[ôòBÛÿŸ|òo¯ÿåÏv:ûë^êY„?ßw/V¬\…§žš””L:×\}µË6ððCbÉëoà¹ç_€N§ÃˆáÃ1}úa=s¬•„ +W­ÂçåŸãßÿ~–A"3Ò"áKKK >ûl#ò ò‘Çã£>¶»‹Š  ¶~ù%Ö¼õL&²²²pùe—á—¿¼”C˜B"nMC¡hBE‹B(Z„Š!„ø·–<¤¦=Ã#„tðØF?w‰ÃS††»iB˜BE‹B(Z„Š!„tǘ1cü~ Þ0Ýs5~§oÞ¼y!ã“?}ñ×q|i×¶<±ãžדÏùû3²`3›\øoO¿;#-Tþs&dÁð)¾øë8¾A_ØòÅ÷ ä`承úŒ+bÅô0âàï‹ØŸÂ=Êò¶}i+XçVyNÝ=®'ç%PŸñ÷@AÑr3d ¦pi‰¨¿üPËWÇñ¥èúZÀ½M ƒ¡ªúã8ž~wŠ–èºV0Fÿ`~ßpk[¥xò\yz^ÕùÓŠ–*4”kNÝùÌa8в·µ©@}WWg=ñ‡¢åa#†JG§ ÎY0#Òp;çþî'J‘òw1ž¢åe‡÷÷…*b SŸ`¥°úžêc„RûzJ f)ZªänÇT”ãÊq|ÑáÃ颉„:[(öomS´"à"µuO‘]w÷ùHISýÙ¼±õ¢å‹)kuÒHéü]}`§EÞ^˜þ®Ó…SÚ(i…xtj¾yzDS©×H¨ˆ#E+‚¢"_®0Uá å¨ý•¢6'..f_®0öÈ8TÅÏW÷†{Ôõ‘V¨ž@F Ñ9XvwÞCqV ¯A‘'tmr&/ºËp=ßZ«ß7mÚä·½µ¢:ҊĥخÆc„j­Ì_Ë¢•@-,ZÑ õèº@íËiƒV ïåõÁH+$÷ æ…©‰«m싎«õCH´æÎk÷ÇQ$ò:k¸_LÑxÂi©‡/ê\¢»£Þz8,Ò;6ë-lÇPno¯?Ñ›k ;¡ÿy†‚ »âg8_ô‘r'‚+™S¸µ‰è« ?ü n‹<=9_îøçÎþdá¼up Žíé/öDZ¶!úú‚•;_¨‰CýèM—}ýý ûZ¼#ñÜŠþì¡&^¡Á = ’h…ZÊèã{½T$Þ8Êû÷GË9Т«Ù@­ŠusíLäEƒÞÜCç϶aØ>ÈÕð-eÔŒt1\‹®¡.’®|.¿#Íi~$íZtÑ VÔåéÞïÁ8ñápw´EÃáüKGá–J†¬hC¸¢µã1EŠ !4|‘JŠÁ¼8ý™.†Ê€†êEi/=P ‡•ïõÕæ¾xo(ôi1˜´¿¢®`¦…á$ ¾Øå@Ë÷`áqqyÓnžÖý±ùŸò '‚¾Ëƒ¿„+”NF0÷” GAŒ¤Ÿàb:¢åët1Ô:Iwo0vå )‹ñm\-¬ûz­–JÃÛ¨+”ÓÂP»Ì—Çô¶þ¨öñ ôÍúÝÖý±†+ä6ô4ê eÁ fÄãïHÁ_{Ë>û:ò‡"¼§Ÿ å›õ}m…äÎ¥îly£|=Ô‹ŠZI ·’ ‡ÙZ_ýj³?¢Io̺»;†§Çô÷l£§¡¯¢®˜P¾È]®p˜Ѻ# P~«íëãúën_ÙóÅ® ÞìÛŒ´ÔS CC½äê›SÓž!„Ûèáç.qxÊÐpwx§‡„BÑ"„P´!„¢E!-BH¤àÖì!!„0Ò"„Š!„¢E!-B¡hB"·n˜îßx¶!ÀmÐ|>5M õn½Yrõ¯÷çIüöGû´Oûðû_ï;ÎszâøZîè[ë´úß7'~ÃaŠ0¦÷ç…u¤Åš!$¬)Ñê}Çy´Oû´OiB"Ö´‰2XÓ"„hMY“ }Ú'Œ´!Ñ-ZÊÑ ÷çùô1íÓ>íûϾÖñÂâ ‰2XˆgÍ€öi?,ìGmzH!L !LiB˜` }Ú§}ÂH‹1°¦EH”Áš!„„rzÈ»|ÌÇ|ÌñZa÷ˆ§}ÚçñÜ#žškZ„Ö´Bm }Ú§}ÂH‹1°¦EH”Áš!„DkzÈšíÓ>a¤E‰nÑâÜ´OûáiŸ{ÄBÂâY3 }Ú ûQ›BÓCBÓCFZ„¦‡hŸöiŸ0Ò"„D ¬ie°¦E!¡œrm>æãÈx¶pxÚ§}îÏ=â !¬i±¦E!\§Eû´5ö)Z„XÓ"$Ê`M‹B¢5=dM‚öiŸ0Ò"„D·hqnÚ§ýð´Ï=â !a ñ¬Ð>퇅ý¨M !„é!!„é!#-BÓÃŒ´Oû´OiB"Ö´‰2XÓ"„PN¹Ç6óqd<[¸G<íÓ>÷ˆçñ„Ö´XÓ"„®Ó¢}Úû-B ¬ie°¦E!Ñš²&Aû´OiB¢[´¸7íÓ~xÚçñ„°„…xÖ hŸöÃÂ~Ô¦‡„ÂôÂô‘!„éaFÚ§}Ú'Œ´!kZ„D¬iBH(§‡Üc›ù82‡-Ü#žöiŸ{ÄsxBkZ¬iB×iÑ>íG}Š!„Ö´‰2XÓ"„hMY“ }Ú'Œ´!Ñ-Z܃›öi?<ísxBHXÂBíFZ„ˆ5-B¢Œp¯iÅ0„%„Dl¤E!Á†5-BE‹B(Z„BÑ"„P´!„¢E!-BE‹B(Z„BÑ"„P´!„¢E!-BE‹BA › üio7Âl2A’‚³Ë(ŠEbãâ"Ò_A! „€ú*A‚À,I€‹ínþ†Œh³áÂwOz[k+ 8U]ƒ–ÖÖ€ HLH@vÏldffBňòWDÔÖÕ¢²òÎ47ÅßIIèÓ§ÒÓÓ!I–ˆò7dD+Ø θsÒÛÛh44âäÉ“(îÛ©iiEÑaˆ[ßÝ¡CÒøŒò9I’ Iêëñã?">!z½f³9"ü àTíiüøãO0`ôz}‡¿‚ýQäþ­~¾[%IÓ–üœìo]]öïßââ"dfd:íáæoȈVw 'I¥¹ÛxaE)¾»³öp礛MfÔœ:…â¾}‘˜c[$¢| …(©|Þ.šS¿.I€`'KçHHJBqq1ŽUV"##é„›¿¢(¢òh%JJJ””£ÑI’ Š¢æy³ù«êßZ“³þ¯õ|RRJJJðÓ?";3f áoȈ–¨Óáè‘£v §üâÎHyGRÔäêH¥|M>é?:„ì¬,8¹¦ I´µµ!55F£ë…oûWëè§<–E%šPE6Ê×mŸ„Ž?Å1DA€Åú=SRSÑÒÚj’ˆðW Ðëõ0™L°X:ù_¥ŸvþZ,]^Ô®ôyµ¨èõz!E¿!#Z$46594œ¬ö‹ÅáËËm¤¦‘ê¨Jý¹M”í¡×ëÑØÔÉEû’µ&§C9òP<'ÉmîdàP>'Û³‹¥£¤²!æî´G8ø+ ã‚E‹ÅñxOw‘vW›lGmKö×b±tY7C*=4›Í §þ¿²”J 5+ytSFXòcù9Qa6›»=éJ# ›È„$A„ŽçݬŸS¦e’ÿZ/ýuE°âb0jèe8pôkœ¨ùÑ!ŠòÖßÐ-ED%‹—At%Zo¿ý6Ö¯_¹sç";;Ûáõ÷Þ{ë֭ÓO>Ùí檀º–ÖU1Tî rºEº»¢d±Ø €`­å¨kˆ€ýò€Æ¦&T=ŠÚÚZ@FFúäç#%9Ùî²›ùUGIŠôÖ•¢«'þ¾øÒK0™L¶öùýïX´hš››!t11¸ó·¿õ­¿ª¾¬® ©ûµü|ll,Nœ8%K– ¼¼sæÌÁ¨Q£ºÆ•¿$Ivµa—úƒ›þºr®füÏ£¨:}Ç«ÙDNé›Wþ†Z¤¥ü¿Vc)GAPWW“É„5kÖàöÛo·³W__?þÐÐн^V¢å,5Vôò ÷$Ò²  µíLejN·ß|ƒÆÆFÛs'OžDee%Î=狼}(jÁ}äowšé·üuÖw»+ÈkQSSƒ5kÖ`ûöí˜1cƧ)zêÞÈÛU»n_ &\0Cû]ŒÃÇ÷à½ò…h56ÛezêÒ§þ†Ìì¡2ÒRÎ ªk]ÊNÓÔÔ„¤¤$Lž<Ï>û,Ž;†œœlذ½zõÂ!Cðî»ïÂ`0Ø¢¤µk×¢¬¬ S§N 0µµµxçw0pà@>|‡ÂìÙ³màÀ±qãF›_|ñ$IÂÌ™3mÓºº:¬_¿W]u•ßRgõú,­©bWf_”mh·HWeSIm]]·~Êi—³b¼| õñá½@½ô·«e¡ þ[,9r ,€ÉdÂĉ5#-å æžà¸î¯3ÿÆ_pFô‡ã5?à­ÏÃliw(M©#-Oý éÙC9Çw6»ÑÜÜŒ„„äçç£_¿~6ÑØºu+n¸áH’„„„455Áb±àäÉ“hiiAII‰’’¼õÖ[hiiÁñãÇÅÅÅšÌb± ²²gΜÁý÷ßo÷šÙl¶ùäÏQ9ƒ¨\·¥ûnG yÆO‚+ž÷vâ@™¦IªtLRûâg½îkEMV9ÛMé;¹ŸÏ¢(¢OŸ>˜5kFítÐRŠòØ‚ýu¸n% .>÷œ?pNž>ŒÕŸ> ³¥Ýé5î­¿!7{( ”:ÒÒ*Æ›L&˜L&ÄÇÇw(ýøñX¸p!t:ÒÓÓ1xð`X,$$$ ¹¹ÙΦúâVø&ÚSIDATF)ò}F£Ñá¶ ÙN‡¬¬,Ìš5˱qbb¼ qµ¦¸•K´j\·a®¬ˆW¦ÅýzP¹;;jº^ª“'»´›ž‘ÀùbHyÛ!ëAÜ\ïž¿Úñ“kÏ{ë¯VmHʹš‚eeea̘1¸õÖ[m5-­L).Zƒ¿¯ü•ŸOí‘ÂÞƒ Oí‰ÒA—¢¦îVoxÆö–noý ÉHK=íª ¹Ó477bcca±XP\\Œ¼¼ýôS”——£©© ÈËËCVV–­N6gμÿþûxçw`2™ ×ë1yòd¯½ËÙ-U!^9»èNMK€õ~= ,’-âèáUZÚ9s™‘‘‰‘#/ÀÏ?ÿŒ:ka>==9¹¹ÖÅ¥Bçe‘lé›ÕòY_,®/.u×_"XÇÓ-Í-HHH€ 0»åúÐ_g" <jñ1èÕ«ÆŽ‹o¼:ÎiÁ^}ß­²-÷ 9úöF´ÔþÊÇÞ¼c ÉIz “ÆÀØÞêV`â­¿!'Z®®ÕÊÍÍÅßÿþ÷n·Ë¸úê«.þ²²2”••9Q1aÂL˜0Á©¨deeaÆŒ.|½‰´ÔB¥ž6VF¦nÝÆc+¦J¶Ù2;‘ÔÕ“““Þé¬SÚŠåÖÿ‹ÊÜœ=tÕß›¦O·Ødf̘a{^§Z˜ë+µŠÙêÔKýïøñã1nÜ8[¹ÁÙ¶:N·sQš»åwü•)ÌŒ‹G\CÇvaûÞ\x¬7þ†„h °_#âÊšN­Y%­Ûwœ­õqù†iÛE¨ÜA5w&t>g_g³+‰h·å2”­­Ú׸s«—;ˆ[þÆÄè“äà¯òùÎöó­¿Z™VꥬÉKe\™ÕÚ:F«¨îI¤Õ•¿J¡9|¼ϯºÇ]»:ðøÂß™=Ô ™ÕÓºZQ•+“…Zk‚ÔÅwuÛ8ìáÊì¡­ÃØTAqq[wðTØê˜”:Eĩتn·éTκb›d·Vć¿‚FäÒÕ줳´ÏYä­eKP­%s¨‡úÈ_Ç`ÁµídÔ}ÚCF´ä‚§ÉúQZ'ÔY ©¢ÕÝw×2¹h*ÁµN$ÈïµÍì[‹ÏòE* ‡¢0$Ø/sVÙ•ïßë,l r[€Ã~UnÝ{þº°£®ÖëÝ­#Óº}Gùº³ wn˜îÎßë/~X³Ææì3Z°×þ†L¤%u¬:}ú4ÒÓÓí6¶s¶•G¤ÒÕ~øÎ¦‹å¶9uêÒõúnFL°F%‚ @T£¾5j±¥™ºÎ‚Òôã¹,4¢"“scö0ŒüíjÛâ®>ïÊk݉…'›B†›¿!!Zf‹C‡ ÅÖ­_bèСÈÌÌtºw v9 5så6Ó§Oc÷îݸè¢QÝžxÑzd KDÁ:3& ?ÑYä±­pidUn‰,ÀúK7Et¤,¨»²ïz8ù+Y£4y[å…©¼‡T- Îúµ'¿2ò4—n„¯¿!#Z³ù€ßî@m]]Tíï-¢("#=£F•"¿O>L¦ö.„PDll,ŒÆ6Äèb:§ô­¿%(A²mÃb-$u T?Í¥x,ª Ù‚ tˆä E@¬ÉWÇ;ÛÚZ×ednþBôii8uê222œÞWç¬6«õÓ[Ý=¯î 2555Ч¥E–¿ž††z¿„8:] t:Ñ6Ú7j‚’³Ù³ÙÔå{ÛF´´¶¢©© ))©ˆ‹sº܃ÐбÃ9ùAÁÖ¶V4‘ÄÄç?ÖfþŠ:*++ÝÊœýþVãʦʥ9òî“—1þ†œh‘œµ@m4™P_[‡vS{P~=6&ééHJêÑednþ@LL,Ž=´¬A޼Gœ;ùç/E+JÑét#j°~©ÛZtuuD ?c¬þ"àYƒyG²¿-BHD#² !-B¡hBE‹BÑ"„Š!„P´!-B¡hBE‹BÑ"„Š!„P´!-B¡hBE‹BÑ"„Š!„P´!áÍÿlŸ; ÷V‘IEND®B`‚qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/doc/src/000077500000000000000000000000001225012771600317455ustar00rootroot00000000000000spectrum.qdoc000066400000000000000000000053431225012771600344050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example spectrum \title Spectrum Example \ingroup multimedia_examples \brief The Spectrum Example uses a combination multimedia APIs to process microphone input. The Spectrum Analyzer example shows how the \l{Qt Multimedia} module can be used to record and then play back an audio stream. \image spectrum-demo.png Because Qt Multimedia allows the application to access the raw audio stream, the data can either be inspected or modified by the application. The Spectrum Analyzer example displays three pieces of information while audio is being either captured or played back: \list \li Information about the raw audio stream, shown in the uppermost widget: \list \li The amount of data currently in the buffer, shown in blue \li The segment of data which was most recently analysed to compute the frequency spectrum, shown in green \li The raw audio waveform, shown in white and scrolling from right to left \endlist \li A representation of the frequency spectrum, shown at the lower left \li The current RMS level of the audio stream, and the recent 'high watermark' level, shown at the lower right \endlist Spectrum analysis is performed by calculating the Fast Fourier Transform (FFT) of a segment of audio data. An open-source library, \l{http://ldesoras.free.fr/prod.html}{FFTReal}, against which the application is dynamically linked, is used to compute the transform. */ spectrum.pri000066400000000000000000000027141225012771600327140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectrum# The following macros allow certain features and debugging output # to be disabled / enabled at compile time. # Debug output from spectrum calculation DEFINES += LOG_SPECTRUMANALYSER # Debug output from waveform generation #DEFINES += LOG_WAVEFORM # Debug output from engine DEFINES += LOG_ENGINE # Dump input data to spectrum analyer, plus artefact data files #DEFINES += DUMP_SPECTRUMANALYSER # Dump captured audio data #DEFINES += DUMP_CAPTURED_AUDIO # Disable calculation of level #DEFINES += DISABLE_LEVEL # Disable calculation of frequency spectrum # If this macro is defined, the FFTReal DLL will not be built #DEFINES += DISABLE_FFT static: DEFINES += DISABLE_FFT # Disables rendering of the waveform #DEFINES += DISABLE_WAVEFORM # If defined, superimpose the progress bar on the waveform DEFINES += SUPERIMPOSE_PROGRESS_ON_WAVEFORM # Perform spectrum analysis calculation in a separate thread DEFINES += SPECTRUM_ANALYSER_SEPARATE_THREAD # Suppress warnings about strncpy potentially being unsafe, emitted by MSVC win32: DEFINES += _CRT_SECURE_NO_WARNINGS win32 { # spectrum_build_dir is defined with a leading slash so that it can # be used in contexts such as # ..$${spectrum_build_dir} # without the result having a trailing slash where spectrum_build_dir # is undefined. build_pass { CONFIG(release, release|debug): spectrum_build_dir = /release CONFIG(debug, release|debug): spectrum_build_dir = /debug } } spectrum.pro000066400000000000000000000003211225012771600327120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/spectruminclude(spectrum.pri) TEMPLATE = subdirs # Ensure that library is built before application CONFIG += ordered !contains(DEFINES, DISABLE_FFT): SUBDIRS += 3rdparty/fftreal SUBDIRS += app TARGET = spectrum qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/000077500000000000000000000000001225012771600276555ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/000077500000000000000000000000001225012771600304225ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images/000077500000000000000000000000001225012771600316675ustar00rootroot00000000000000qmlvideo-menu.png000066400000000000000000001760461225012771600351160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœìy^U™ÿ¿çœ»¾kw§ÓÙÈJBB‚È„U‰AdwTœ:È¢ˆŠNcQ5Š–¢¨È .3›È6È6("Ìš ŽÃ2B†Å¬Nw¿ëÝÎòûãé¾4!o‰é$}>e¥Þ~ûö}Ï}åÜï}v†yËa±X,‹eçÂÇ{‹Åb±LD¬[,‹Å2X¶X,‹e°l±X,Ë8`Øb±X,–qÀ °Åb±X,ã€`‹Åb±XƧão’¶(—UœºÂËšmø‚*C’Bx„€”HSp]0¶Óm±X,–=D£rÁôú?ˆÉ“Bßk¾üŠ7c†Ê´‚çÅb–eZ9®N å–«œ‰d`‹;©/Kh—#sÁ9\Ì M‘¥à¾¥vÐ:pÇã@)d8´‚ã!K'N!*¡¯Z-¸Á6OÃ:5âð ~Rk2/4IÒ3eJmh³Ö™ãò¢àY–%I¢µB¸®Ë9’[,‹Åògá‚f£Žv{¯…‹6Õ“þ-•}×û  ç*MÅð<'(h­À¤ÃuÄéÔE‹7>û,ïíå2nƒ Õj ŠÀ¹_ƒ PZ¦q³c ÅB¡eYš¦J)ιã8BÆXd ¤q¿Ú=yËÆðyþ'÷Úk¯©S§:®ûšãµÞ1f±X,– cFgr¨Þxjõsß»ú·ßuà…ÓgEaZ#‰áûA©·›hE(ˆ³â”rRo³ à;¼=°¡:©R{þ™‚Ó8ñ¸“þöŒÓ9äI½ÝB8 ¥a;&í‰ñ1ç1&I’þþþõë×ÿówþù–¿ Å)|ÒÜrÏt£QW©‘¦S¶UG ±ô+ådýà2ˆ¸·È{ðÇ{ϵMX(Ð!Yš2ÆÇ1ƼfA‹Åb±¼A ¸VJ¦’XxÞoŸ\ýÿÎüÈêÕO; ŽŽŸD)¤FBi¤m/ðS(© •r\ßÒŠÁVøöƒoºêÛ3fÌ(IªFC•Áq;ø ‰cß÷Á˜VŠ‹«ZI)œlÍ‹]~Ò––†!áOÛ+©7lÛÖí,À¾¦#¤Ã׬ZùàÌ)“%)óÇÑZK)…ŽpF¿¸m›Ø‹Åb±ü)D’ùÒv»z:nñ زaé§žºâÉÍbÚ VÒ(x>3™I¯\L‡j¼TÕí–¶~Δê}?ùÑÌÙ{{‚ƒ$I`Œïû‚3šíb ¹f23Ƹ®ËÀ¤’®Iáx/oØ|È‘]ÏzüDØvòWgæÒº#å¦5/<ÿÌÞsçÔ†ëÕ®ž×/?“Y–e…°°C.Ìb±X,’)€‘:˸ë*¥Ÿ|jõA} ¸Ï‹=Æ«hÃa8 ‘&h†V\îëiô¯Å¦_øý{Ï›®X˜»d ¥æ0œsÃwL®R’&Œ1!„௠*3`xhKWwõ…ÿ{qÁ>K¼i RÑ §“mó<Ë²Ä \5Ø|ÿûNÚ{î4hYíêI<ñj¬Wk­”ò\×s„1;(½Ûb±X,®u’$N !˜“9X¼téñËZùøo‡‡‡Ý¾²aŽi6á¸^©œ6· Xr»+M›%§Ÿõ·sfNEÚ~(¥6Æ8˜ãÊÀ¨•x.¥ cÆŒ±Ló®îIÈZóçM?íý'ßõЯýî¾$N!¶ý¹X©Àáõ¡ÁóÎ>£$ C¸LŽýÎ9ç#?Ú$hËÎDJé8N’$œs×u“$ñ}@–eÆÏó$I’—ÉÅq€Z­V­VÛív¡PÐZóÑÜ:¡”’Þáœ+¥„ÆƘÖZkí8N³Ù,•Jô'ôçišzžGÿ 3§i꺮1†þ*?•1fì'Réý-“_HEaÒ‘Q‰QБY–i­é`Z¤R*I’B¡¯^c„´rZ^þ5*¥´Ö®ëÒÚív†tCIÓ”Nn±ì4˜aÁÀ<ÈÀüûs>ôÓ;ÿ£¼ðF-ÏÂJ%ª ¥\0¿bb©¶:I}àœ3NÓÌaî$8ÎØ´$Á¤Iâû~¾‹i+  NÛGJéº.Ýò¿§ÝJo²Qµbä#rùSiÛ ‰q¸;çc?úÑÏ*=se ¶}Ý9sŠ1­5Œ™?>º0+³–]JDp]×uÝF£‘K…뺌±$Iø¾Ï9o·Û¹P¥iZ­Vä*;44$¥ÌO˜‹:!Dš¦Œ±f³Ç1íÆR©”e™”ÒÇ1Ïójµý«µ&y#A¥A¥”R i-­5}:œ”;Š")¥ïûô4M †¡çy”xA £‹¥câ8¦ó !èÓ•R¤ýô)ô¢T*µZ-:@J™ÿ ]—çyQ ÆØæÍ›c¾ï«ÕµÀbys,\¸®+¥$%“R‚1!„ÑšÊb•RŒ±™3gº®»™¢-S*•hó !â8Ž¢ˆ¶j±X¤§ív»Mû‚î$I’ä7œ|ozÊw]Àœ9s` c¬“úb{캴ogÏ™CodYfí\Ë.B½^眓X.—´Z-J)ReÔ.& C’:Š˜RÒ>ìîîv'MS²MéxÍfiy©T"Ýj6›d"ÓS0½ÙjµHÔËå2ç<Š¢Z­ |Î…³ÑhÐç¦iJ{^JY(êõz»Ý.•Jô'ô¡ôÐÓÓ£”j4qçrž¦©Öš®@ŽãdYFg¦‡z!„RŠÞäœ(‹t õ  {PEô½…aH·›îînZ9-Ûbw¦Ïšj÷äy`L)rüRS !´ÖFÊÙ³goÿøà =ôйsç.^¼øÚk¯¥âV«Õn·9çyxæÌ™ïyÏ{({ãÚk¯½çž{T*•Nç—RRi®m•¥”Bçõt`2=Ïhíz]’uIYv’$Y»ví‚ È|<묳.¾øâîînR2?c ySûúú( @©T"ËsN.YƘëºY–=úè£GqEz¤”ÝÝÝ<òȘ¢ïû+V¬8öØcIœh;A@J €”¯Õjå¡ V«U«ÕV¯^½ÿþûk­¯¾úêgŸ}–~[­V›Íf¹\®Õjä^NÓTáû>ɹçy$ÕŒ±«¯¾úW¿ú€ü1‚®%ìü¦°~ýzY–‘|6›MÆØ¤I“hµŒ±v»MYcRJz>X¹rå¯ýë?üát™ù‘¢sìÊbÙù8Žc¤D–$3:%*aLbçÛóÕAÇñ–-[¾ô¥/=ýôÓëÖ­[µjÕgœ``` X,‹ÅááaR_)åé§Ÿþ­o}‹vÍ}÷Ý·fÍš(ж“ ¥GmT.D–¦ 7ÕŸæ\,ËïVÖ²XÆ—ï}ï{>úè÷¿ÿý}ìc×\sM±XÌ ¸V«•$ eó¸òÊ+.\¸hÑ¢¿û»¿ËõŒb¢ív›ž—c+V¬8òÈ#H)©¿Û#=òÈ#Ç<½Î²ì¡‡š>}úÌ™3Ï<óL:e0Q*Çðð0¥u<÷ÜsGuT’$W]uÕ}÷ÝwÅW,]ºô{ßû€0 o¹å–ƒ:hÑ¢Eçž{nî¾òÊ+çÏŸÿ–·¼åØc}úé§I}/¼ðÂã?þšk®É-xÍfóðÃ_¹råé§Ÿ>wîÜeË–MŸ>ýÜsÏ=ì°ÃŽ=öØçŸž¬óiÓ¦ýú׿>âˆ#/^üþ÷¿€çydþÆqüå/¹··wÚ´itiaJ))¶óÿŸµX¶ é*cp]cŒ”’9ŽÑŽ“G…•2®ûGz]AP*•è™›j ŠÅâwÜÑ××÷ÜsÏ(—˳fͺä’K®¿þúžžž… c¾ûÝïÞ~ûí_|ñ;ßùÎï|ç;N>öÓÉ=þÇDsÞòmÿoÑñÁüÃÁC­2c”1&ËF^X,»sæÌ¹ì²Ëèõå—_¾`ÁÒŒY³fýÓ?ýYÀ¿ùÍo¦M›600EÑ>ûìsà 7Äq,¥\²dÉ?ÿó?Ó߯qÜjµ>ó™ÏÜwß}›6m2ÆPñ9çœsçw&IB?cÎ;ï¼[o½•xì±Çz{{7nÜhŒY¼xñ5×\CÇÌ;÷ºë®“R¶ÛmcŒ”ò£ýèÏ~ö3JÆ^¼xñç?ÿyc -uÕªUS¦LY¿~½”ráÂ…ßýîw•R÷ÜsO¡PhµZƘþþ~Zá‚ .½ôR)%ÕYQÖ-¬Z­.^¼xppÐsÔQGÍš5ë¿þ뿌1GqÄG?úÑ8ŽiUÓ§O§Sõôô\}õÕt~­õŠ+¦M›öõ¯}Á‚tÚ$IÌÈ~·Xv ²¼ÈgÂ÷=žïsßûìõv¶÷±˜·œïsæ#fQN’Ì•¤²ãi²Ì3wîÜ/~ñ‹ftQ©Þ²eËÞ÷¾÷%Iòï|g¯½ö¢_]qÅ}}}ô·{ï½÷—¾ô¥?¶P§‰6ÆeŒ óߎ½í¤³ÛsAÓóoÞäÙ&aYv(9¯h·ÛTíEQ©Tj6›äþ×ý׃:hÒ¤IAœrÊ)ßûÞ÷|ßBÌ›7ïÐCÅhÆSW_}õÒ¥Kûúúr§îm·Ý¶lÙ2ÊÑ$É]wÝE©^Ƙ«¯¾úmo{Û”)S”R'Ÿ|ò 7Ü@+9à€fÍš%„ ?³”òž{îÙÿýɬ̫{)ûãšk®9ì°Ãººº„ï{ßûn½õÖ,Ëžþùžžz”žN)eÝ]–]!ŒTä'‰1†ì`h)aŒ+hã¹×éìòåœ\\…B* ²,£¸Õ 7Üpûí·¯X±â _øÂÝwßMoŽÍyn·ÛÔB`û+Ýjãl?‘Âjªe·DÑÕÕE-#Œ1Œ1’±B¡@i­V‹1öØc|ðÁ’$™={6™¡Y–Ýu×]ûï¿–eT°f͚ŋ÷ôôcȽ¼~ýú9sæ”Ëe*jÒZoÚ´iöìÙ3fÌ :Ÿ'žxâÀ̲,˲E‹mܸ‘¢ÂwÞyçQGE»Z)5888cÆŒiÓ¦µZ-*"Äh8Yk½zõê%K–„aØßß¿`Á‚µk×ú¾ÿ®w½kíÚµ—\rÉË/¿L»×CQç4M)úKyË­VËqÊ#Ë«~»»»É½Fiš’½»»;ŽcÏófÏž=<<Ül61ƒƒƒ÷Þ{ïÅ_,„Ø´i©x–eÔd«‚ ‹ew‡jý¥”—]vÙ’%K¦NúÉO~’\>{íµ×ßÿýß}ôѧžzêâÅ‹éy—ö¥E£ò ¥‚}ȵì–0Æ6lØ@åC<ÏÛ°a½Ž¢ˆ’)H¿öµ¯ÝrË-Tc°÷Þ{·Z­r¹Le¯t*¥ÔÝwß}â‰'’ôº®+„¸ýöÛO<ñıµ¼wß}÷»ßýnz.β¬Ùl^zé¥wÞyg__ßÀÀÀüùó©²6oYÕh4ÊåòøÃ“O>™1V,1\×õ}ŸLáçž{î—¿üå¯ýëZ­Öl6=ôÐ-[¶ì»ï¾«W¯~ï{ß{íµ×~ó›ßüЇ>dŒ ÃpÒ¤Ižçå30Z×»iÓ&2ëé{ظq#-[kM_å[i­É(/ Ï<ó ¥™œþùgu–1¦X,öôôä_j1¶3ÿ?µXþÒ8ŽÓßßà3ŸùÌ?üÃ?Ю¡'ø7~ñ‹_¼üòË/ºè"Ú)Œ1ÎyÔ?Ž1Öjµòžw;f=;êDË΄ʊ¨$€üu£Ñ˜2eJ³Ù®T*A|á _¸è¢‹Æ6zl·Ûd€’` !n¹å–k¯½ÖCÆ.çüª«®"‡0u”tçꫯ¾ù曕Rô·a^vÙe^xaÞu @Ô4‡1V.—1·Þzë7ÞH-¨òC)%Éÿ’%K?üð¯|å+cOj­÷Ýwß§žzêÞ{ï}Ï{Þ3eÊ”cŽ9&I’uëÖ «@«Õ¢V_…B¡X,Òå„aH½ôh ôq”›M÷”8޵Öûí·€5kÖüÇüEÂÆÐÐ- Ãz½¾Z ‹e7%I’¾¾¾b±8RÑ4êŽ0uêÔOúÓÕjõsŸûÜ7ÞHϸt¯( µZ-jz³×c]ЖÝιïûëׯ§Ê×õëדU«UÚ*ä˜Ý{ï½ï½÷^ŒÚÒN+ Ôk‚$jxxxãÆûî»ožð?88¸aÆŋSÄ@­V[¿~ý’%KH®8ç .¼ÿþûcÈÓK £"(Š"ÓyæÏŸ_,©¿Gš¦ä70444sæÌßÿþ÷dŽS›:d xžwÜqǽõ­o}üñÇ(¥¦L™jHh­é&BU¿6l _Ùºuë\×͆öööÒçRûÌ¡¡¡ V®\9gΜ,Ë^yå•Å‹W*•ýöÛï«_ýê–-[,XðÀ¨T*I’l§åžÅ²;Bw€Í›7A@ÿySÓ›8ŽW¯^}å•W¾ð ÿùŸÿ¹råJÚh*¦¶ôMjGaز["¥Œã¸¯¯Ò‰ûúú(½€Ö:ŽãF£‘$É¿øÅ+V<üðÃyV‘RªÙlžvÚiO<ñ™Å?ÿùÏ—-[FîV:ÃC=tâ‰'’”RÙ‡~øøã§Öä¶:묳~øáG}4‚z½NÍŸ‡††>õ©Oýìg?£ÝûÈ#œtÒIä°¢'î·¿ýídÈèîî>ÿüóïºë®ßüæ7t@†a¶Ûí¾¾>Y–½øâ‹Tˆ{G­‡aÞòmÿ†;ž®§/=iT“~ÖZÓ™õÙËŸ åMä#Ãè½I9yódr#“>åÇçÓú²,£BaŒNl6› ,X·nu󠔚yòÉ'ï´ Ù 9ÚHÇu]ʽڲe‹­ëµìúP …ÉQ†”RŠ9Ð2KàºHh-¼±\©h Î9Œ³•K–= jíºîX¯òXk•d˜s¾}ïzóÇzww>t ÔýƒJ­9kÙ- Ú?4¯Œ<=íÁÍÅÉs½YûI¯ªãFúÅrÒlCµ‚¾½âM›'O«lþíC›^|ªoÖ\ÅÜüI™:MbÌ´†¿0RnŒq8Û¸vÝ´Y 0e¡Ó;W¶Û<º£œõo˜4{¸»âÑÿÑœiÇÛmh±ì¦¸®›¦i†Tc@ÂÇ1u¸, œóz½¾ýƹúÖjµ8Žc4p\ s¼X,R¸šÂ½ÛMj±Œ;4H@EZkR_)åÿøeʦW^B¹b¸ã•ºŸ]ý¿ÇòÆincŒ ¶rGÿ…ð=üïó/,_¾ü™ß?Ï*Ýî”i­M›R©ÓñqHɃ‚Nb¸®Ã¥|ñ9ÙûN:þS9mþüùÓfÎ9ÌŒ_ª§Åb±Xöt¦¸`ÁÁŸ¯\ùƒ›oûéCFm%z§+·Ãh¥À8c0JAJhÍŸxÏ)'ôï>|øÛ­–ËÐ’9F;( B)¼Ö¡½qíÚ^x៮ý÷;~r/Úpæ.’ÚA–‰ Tq¼ß8MœRY6"@zª²µ%X–ühã#WKpûdm±X,–7‹4œBy…Œ¼Ø”»Û­#ÈdŒÉAk(­=¹Q)¥â6Ú-ÀFØAÅxŒ±W…ÏóHøƒ)SãVêõÎpŠ“Úƒ5@8åP¶šp·ý¹‹z©W j·Û‘çy×”(jUjŒ¡v¸Ô߇ÊìèP‹Åb±¼„WHâ¶Ébæ8L8PL+·ÝH;K9ÇØàî¨)œùÓTðS”ã9¾ë0)¥f;&+ïK÷îÐìÝ=Ì/µÛ Cð±:ý::ZÀF1Î…¯µBƒ§à‡ÛØ4„ €çAkh=âÖ¶Q¥Åb±XÞ ŠÂ¶2S އ°ŒhxÛÇo+Ê3‰Fà{¾-Ó(†LÁ v¡Hš*„€ÖÈ2r†WzJQœeí†Á÷ãF%ÜhͶ­Ýs·ù‹Àód«m´AÁ¸À´Ri+†ë1Ïœ¥IhCsË´­Q²X,Ë›ÁYªâ‚ä1:%åÁÐ<$ÊcŒ¹¤TQ¤’Æ@¸ÌõÏÕjÇtSžg´T0€10€Ìó’f[î „ãꨅ$ñ ¡ì`wtAg©‚ë‚;*as=£3D‘(ùZI•*pçÜh%ã̦bY,‹åÍàžr™Q’1æpfŒQPÚèŽReÌ«ÒKñà‘F Œa.w]€”©NÛ2ÖðvP%ž’Ð FCƒqÎFÞLScŽ‘R!ð¼,U : °LR§P`ÌdQ­ \ÏCwOÖn‘õÍ\7ŸÎ)™í4k±X,–7AÖhÂu¹T c w¾Z˜´GÐY€}™¹Zfø¿·üÕ¢ÿèº93û5¤?YªuÖ†1Fpas°,‹ÅòfPh6t©Ê90Ð?ir_­ïÀAhM‚p&ÈöÍ‹‘vg: 0÷„j¸µ—=Ù\µjUOß”®j‰Ù™ –‰R*qÏ9O’Ä÷ý,Ë\×m4år9?RkmÌHÇqò?WêU’ÅbK–e´¿¨£3€z½Þßßÿ–Œy…MšgR‚ƒi &vwî,§Ú8pÊ)§L™2¥§Zâ°êk™èäꛦ)ß÷¸®«”"õ•Rj­pÎ…išæê+¥BXõµX:áº.çœsžÇw+•ÊôéÓO:áxî8Ü‚ ß-FÚíãžÕh·[:ýƒ•R€”6Îk™èÐ}sNÒ Žc)¥”@Eô[)¥RªÕj‘`t €ÌömµX¶… îæÏ¸ …ÂGÎü[-S¥306òD»G´æè,ÀƤé!‡B_Êq½Ë›Â£”˜àJ)Çq覆!Ý5ÈØ-‹$ÀqpÝ‘Ân]I˶ÈR9çŒ1¥”1FkýöÃC£Î  ¥”)Œa޳RçÌh@wOêâÐ0pÄ`ñ[,o Î9w1z³(‹uM'IR(’$ ‚ Ùl&I²aÃ$Ϲ5<Ö,¶X,9cR]×B0Æ´ÖÕJ0çL%)ŒáÜÙž~í&t¾%µÖà‚F g™ e²ó–f±ì’äÕwŽã?ñćrHooïa‡öå/ùè£P*•:è ûï¿ßCLjìõ‹Ë_ÚYZkò3ŽãЮà€Ö`ƃíÌ(ÜMØ^–†12IÍŒ†6¢ÓXa‹eb06 c¬ÝnÿÛ¿ýÛìÙ³~ó›ß,\¸pŸ}öI’@«ÕZ³f ÉmÜÊ²Ì °ÅÒ cL¾eÆì ˜,MÈ çZ©=Úíû®p`”RFó<™c>[&4Bàf³™ÿøØc-]º”R«N=õÔk¯½6Ou®T*4°„1†!)¥[,`ŒÑ¶¢m2"ÃZ‹¨Ý†–Üaœs(…Ý?”ÓùF 3Ì/–À88c‚[Ø2ÁIÓ”žÐ+• ¥VýË¿üË“O>ùÍo~ó+_ùÊW\1cÆŒùóç“-ŽcÊÉr]Wk}ûí·/]ºtÆŒ\pA«Õ@†²MжX¶ cŒ²±À(?DPЩ4†3ÈÝÞ“dŸÄ-–7€çyy‹ªD:ýôÓ8à€ /¼ð’K.ùÌg>óñ¼··—¬ä®®.Ïó¶lÙàñÇÿô§?}ûí·>ðÀ7ÜpC£Ñ`ŒÍš5ëæ›oEÑØ¸—ÅbÙã±l±¼”RY–Q’1eÊ”f³™W% …õë×gYÖjµÚí6ç|Ò¤IQ}ÿûßÛÛÞ6oÞ<'œpƒ>X.—=Ï;äCÊå²”2 C›m±L(lL×byc8Ž“ËmEa ­u’$®ëº®ëyžçyŽã$IBâºzõ꣎:ŠšV.Z´èú믧3Ü~ûíù™Ó4µ}²,–‰ƒ`‹å °•‘JyU“'O¦I¥a’ “ÐRA0ç\)µqãÆ›o¾ùá‡n·Û===ÇwœÖ:Ë2Ï󨕇1Æ&gY, +ÀË€úòh­)W“1V«Õ\×MÓ”úÈgYæû>™ÈžçQѰ1fÚ´i'tÒE]Dch–E‘)+o§e±X&vÃ[,oJËk‡aÇ1yž•R¤Í$¥qS’bîܹO?ý4ù¨ilCÇAШޑìæqº2‹Å²³±./‹å‘7PJ%Iây^–eQQñb”̬µ.‹žçµÛmçŸþ-·Üò /Ђ Š¢~ðƒ+W®¤Ò&«¾Ë„¢³3î £M–ÂhdIj{A[&8µZsNM%•R¾ï7›Í®®.ªåÕZ“cÔVVJQ»Ê#<òºë®;ãŒ3ÞñŽwxàïxÇ;xž÷ÔSO=óÌ3I’0ÆòNôËÄd«&qTn µ†jƒ•DˆZÌ€†6pw{’aÞòmÿFÁãÍô¥ß™¬!¥Ì0×fiZ&:Íf³T* PîÐÐPww7F½ÊôÛ,Ë(ÿ@’$îmµZÅb‘£F¹\Î;\Z,–|¢ö«o™6s'æüUd Æ0@‚qݼt~;ã Îa˜2pÓ Ïñ]𛤣̸6™â~Q VæÌ©`Ã:1w–Š30†ÑN%J)“$HSØ ‹Åb±¼ÂI0qͯ”’úâ¤gÚ´Áþ~¸ÞÖ&/çŒ1³›çau`ǃÜ2$zú8w²áaûz[­ºÃB)%²l$M溎ãdI²Sn±X,–=ŒZ"úº•ÌЮ³BAp.Û ¸ –óÎÓ¯vôvX+ ¥à®¥Rè FC»‚š¿#Ã(„`»÷÷`±X,–q¦âðz³!\Î=_J ÎÏè6ùœŒÄ€±Û§@c{IXŒz^Æ@k€1¦ ÍeÓa „í¢g±X,– €-ˆÚJ ÅV#G:d)wNÂ1íç0`$À\mýÜ1’îþY×a±X,Ën—#>ð±ÃGFúÆ;I/±,hÎÀÀ3` %¯QþÜf¶•Åb±X&&ݦ2g  í?Ö0äÏ4ÎÏbèŒ<È'T¼zÀ˜x³—d±X,Ë.1!^'‚#5ÊŒAð1ŠÛ9TÝY€sÅÎeœ”\1*‚~í‚`ë€-‹Å2àã^6¹>rÒGm¶$~Û±€#YÕˆæ,£3š­<àÜ °Åb±X&zLÎS.‘Æ€9¯¾þü$,¦è1W®#„Ð=,£6¸1ðvÄeY,‹Å²«3Fû`r†( ¥! ˜1‚3–t¨Óýã1`2s wœ8¨QÈwë0c³ -‹Å2`c<¾cB´Ü›¤¥$´Ò à ÃÀXe®`‚“Àg¦ÊeQJC€½`±X,– ˶ N=© ¸h ghKÍý”qtn—ÙÙ€aŽ€ÏA9λ}ã‹Åb±Xþ2p &`<Å ½½<¬ŽÅ»ÌqÀ4˜æ¡ë.s ÷€Ö_‹Åb±üEІ3¸,t!(Æ;êlç_P–µó¸‚ÖÛ1¥-‹Åb™ÈpÃ` ˜ä¡¡€`ŒQŽïè‚ÖZ‚i×0¡ŒÖP àÖ¶X,‹åõ¥¡´PÆ ­;™º-`£a$—àvä‘Åb±X,ÛF*0%”‡àè<´¸sg¥à0¸„ÉÀ4cœ[¶X,‹e›(͇˜—ð\¾¡ÅXkî8Â`€‘à†sάÿÙb±X,–ma´fŒQî¸Ã™ØÞ”„ΰœPE-Lò᤾0¾Ršˆ´#$8"‰$e^àû~œ¥àœclÚuüèlÅ[,‹ÅÒ‘¼[¤4A¡×êà R:=eGð’4L(t´d" ”Jàq-2ĉàEÕaVŸРë/D-e~hÚíÒÔ)R+£o`ÕªI c†cl‡kƘ¶ã-‹ÅòÇ™„×ÖàƒÅšèª„Ÿ%iR«ƒ ¤)¼p\Ö9n\uʉT±´âØ nA1D©À˜œqfuÖÔZƒZÛð³Åb±Xþ”c¯[@h(]U³Þ’(•™ã eŠn¹9.ë7VpC?Óšõô˜Zq0ÕŒæ£ÅN£°al;ql‹Åb±X^…Ø¿.i©R7m#¥ÉDO’’žj¥±1ãÕäqܸ‰´Ô;©9Ðv³Ü3©T(oøß5ízË© Ñ ŒF8±‘áÃ6l±X,–?ÎXE; °^éåÂ^û.NÒfmX……BßÔöÀ°ƒbÀoñ‹æÀgάÙ/ýìf±ø¾cÞõ·øÀ_Ÿ¼œ1Æg£ß ÛÞ0 ‹Åb±X^ƒyÍk£¡)¦ùÐÿûÿ~ËOþûÁ¤QßûÄw­éßÔÞ²a€t|<¬ ó–oóB¹Êka/j!( Zï°,hކ†åKk÷Ÿ¿à›_úÒ_½ Й–Œ1>šmŒaŒ,`ë‚¶X,˟ˆN™1³z¸ÜãÿýðŠ .ºè™ukyß$wj_¢ÔÒ5n ¹.eA#Ö&"-*±í,èñ`È@êdíÆ)¿ÿÍãåb(³¶ã»0þ¶·úk±X,–?…2¥X’Dq!,Öÿêˆw¼ÒjTæÍ®3 ¾ƒæÙ¿A?´µ~³·îÅŸú-B†C©ïxôÝú -–×ÇqZ­V±X4ÆdYæy^»Ý. ô/€f³Y*•’$ñý¸Ë 1¬àV¡À îC÷ÝñÖÅom–ìz2.ë¿âZLjj|ïûgΘ:>Ç¿§‹e÷$‚F£‘eY±XfŒyžW«Õ …B­V ÑêÆR©dŒ±êk™à8Ì1J(Å©}}§¿ÿ4ÝŽÑŽÇk=ã&ÀkgŸù‘r¡4ò{MºšÅbùS(—Ëß*‹”RÕj5MÓjµÊk6›QȲm;Á,– E¾Š~xæÏÀ–a$Çþ¥?Î44Þvð!¤Ì¨ šYG³ÅòF0ÆH)=Ï µ–R !Ð;Q•J¥0 馣ԸÝh,–]ãº.¨,û«ýöG¦|gÜû¬”2Žã%K–\zé¥RJ_ûÚ×æÎ›ec,Ë2ÇqšÍæ·¿ýíxàÒK/=öØc¯¼òÊn¸aòäÉsæÌáÜfYX&4 :€D Áyd²‘Œ[hÆnH‹e"˲sÎ9çòË/ùå—ëõúð¡}hÕªU“'O¾òÊ+Ç ‚ MSÏóÇQJyž%v:Ž£µ.•JÿøÇ/^|ÑEýô§?ýô§?ýáøcûØìÙ³Æx_ŸÅby+ÀË.D¹\>ñÄ)]ùŒ3ÎØ²e˲eË´ÖGyäÊ•+K¹ÙlHÓ4/óP(cI’¸®EQ’$Õj€”²\. ٰŲKaØbÙ…hµZÕjµ»»Ààà`WW€8ŽK¥R–eZkê=I †a¥RÉK~›Í&ÁRÊüx¾ï !jµÚ¸^™ÅbÙ+ÀË.„ÖÚ÷}ê.ÙÕÕU*•šÍf¡Ph6›4ÑÅu]¥T¥Ri·Û¤”d‡a˜¦©Ö: CÇqÒ4íêêâœS ι"ŽÇ­åžÅby=6ëØbÙ…ð}? C ë6›Í¡¡!ÒàR©ÔjµÈðm6›Œ1­µRÊ“$#}äƒ ¹M’$MSÆFª+”R¤Ù4¶Áb±ì"X¶Xv!8ç/½ô%UcÊå2ùŸÓ4MÓ€”r¯½öÚ¸qc©TÐl6{zz”Räm¦b$ß÷9çCCCèTišnÞ¼YJéØJ?‹e—Áº -–]ˆF£1oÞ<Š×vuuQ]/€,˦OŸN…FK—.ýÝï~§µ^¿~ýM7ÝÔl6…Ô‘ƒdX)ÕÓÓC'LÓ”²±ŠÅ¢U_‹e—bü†1ÓQÊÀK‘ÁöªµLh„Íf³Z­J)†"÷0gYÆ9×Zík_[·nÝ~ûíwÖYgýà? iHRJšE€1vá…^uÕUtÐùçŸïû~«Õ²EÀK3M= $ܸ4ÈsÊÅîñZüåÛü…P®òZØË‡¤Z_© ŽÆŽjÛe4~ñ+Ó†ËR¸ž "d¡pwÌù-–Ý­5ÍWȲÌuÝv»](¢(ò}pp°··Õ+¥cœsúÑCA_ ¨ÕjÕj•~¤0¹£-– K¬Ó@{F#óà!ƒ,¬à°¿‚çí˜à’ á*•ÀãHµ‰H‹Jl»Ëò¸=³LÁ0hšÀ éÍqìÉi±ì"£˜’œ …ÂæÍ›Ã0¤ äš&¹•RrΓ$ñ*ÂÚhcŒ¯(ÿ# IDATÖÚ.~ÿ>tÑ%—lnÕÝY3Ú.÷©'ÇÎgüØu³áŠ…G.|öÇ?ûëÓN;eÙÑç|ä#Gw„à00$¹#Âkõ×b±X, †s€)z c4Œá¸÷Çÿuõ7Üõ_÷#Mö>ñ]k6n@ÔBw7äøäaŸ Z™bwW«#dZ©v•ÙðìóˆRghËèÊ™¿ ŒåÍ:,‹ÅbÙ`£V›¿”ÕVð§.šßöDmh~LžïÀQÙ»‹ º y:Xª]q–4¯·bþlW!..c#g­aÌÈÆ-‹Åò'óºÈe±&SñÿÙ{ó8»êúþÿõù|ÎvÏÝæÎL’É6 1!P ‚š°C‚"ʦֈŵµX}Tû-B­VÚÖ¥Õ¸Ö*?[i,‹*ôÁ*TA H ™,³ÝõlŸå÷Ç{æ2hR“8róyþ‘ǹgÎ=çsn÷¾Î{ÇpÁ/¡Vs„+Ç›žá©ÈÇÀËM€8Ë2 ­ÍXå¢ò•IGMv“'—=WcŒ1+À‹ÅbÙÌ4饦4ôo»’‚s(‰‘ôõ›$ó…à™Ê«>/7nš˜Dú•²ÛSMâ4k6†R+Ài0€1ÃÀ´`‹Åb±üv e_ýšÙÆ„@£é÷÷³°èpÑÚ±3-„Rw€BËÌ1 «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çFÛ°Åb±Xö¾IAÌé2œ –’±:´â¾Ð“ÈÐS@NMZókÄ‘ep]£5SQÄ<Ï£”šüÈÒÝçãÁ‹Åb±ì Zƒl¶®ŽÔV]kp®£ÈñNØF‹ÅbÙ¦+êôFJM”Ç/™HÒV}BÂpö@gdy,3ÇpÑi C8‡ò«[ok‹çŸ¾î/ºèŒWŸÊ㌳ç›P2ØV”‹ÅbÙ3Ì ¶†¦˜æ·Üù¥o~ã»wÞž4Cç¬Û´c{gt Ò|<¬ùµ¢táh`|Bþê¹£[rÝ5לqÚɀδdŒÑøRLMgc`v’Åb±XöŒçûPvàrŒßùƒ{þì½ïýÙ–çøì>w`v¢Ô éÚ^¶¢ÌO€!©“ç¶ÍøÅC”‹G³›±PV-‹Å²'ìF¦K’( 山Ɗ5'nn7+‹i0 îÎÌu”^Ðp ¶îô¶<}ûOFÁáAê;ÞîôÝú -Æ)%cL©zJ)zIÐKòå¶P‹å@#1,t«P`¡{ÇÝtôò£[‡#†ÐHrYO~ŵޗ×/~Ý çÏ/8>ÇËïiÀbÙ?hµZZk×uÇéVP$IBê+¥”Rê©®pÚ¶‡³Xö‡9F)å 80{öë/¸Pwbtâ¼Ö“›;«¿uý%å°4¹‹½ ]Íb9)•JB)eš¦jªAïû¤µŽã8ŽÃ9'=žn[,–=!Ë&½ÁE¿°þâ7`tIn°òàLCãåÇ­ eFeÐÌ:š-=ä^ö<¯«Ä¤|¾Qý‚tG,Ëb`\×À•e+Ž< ™òÝ$ýþÉM€eœÂóE¹ c¸#à,G‡¸Å²¿ „`Œ‘ùë8Žçyèß4MÛívÇ8ç¤Í‹eO1š¹ Ò(ấZ †¹<7OR~œ¦àiªa&—aÝÏ–ƒž®¦R%ÞöíÛÿñÿñ˜cŽI’D)åy^±X,—ËNçšk®9î¸ãr]¬År`¢!cð\8"Š¢¼’›óÀCÁáš1É$g)­WÍrPC–n–eäaž3gβeËV®\éû¾¢ëvÃÐó¼N'§!jË g RÆ…y¢åŒ•Öî=¹%—«Õ:×µ)Ñœžc¡-P˜ €1fݺugžy&†i¿Öšìc›m±ì8Çe,Õq 0”ª•f§Ëzr³€ëQ™†æ "Ôœi¤8rËF³X^LH;»©UQ½ýío?ùä“» V]tÑÛÞö¶Ï|æ3óæÍìfD_uÕU‹-:餓¶nÝJ{($|ã7 ]vÙeÝÔ­‰‰‰k¯½öˆ#Ž8äC>ö±½ø·i±ìW0èTç ÉfÒÈk=Öâ´Xr€ |Çi·ÛÅb±P(œrÊ)7ÜpƒëºI’ø¾Ûm·}ùË_>çœsFGG7lØ@¶ï§?ýéÏþóÏ=÷\§ÓyéK_Ún·É2þÉO~rÙe—=þøãµZm```ÅŠo~ó›•Rÿû¿ÿû©O}êÑGÕZ/X°`ÅŠgœqFÞ·n±X&±yÇKžtàuëÖ5ýèG¾ï?ùä“õzýÈ#P©TzzzcFã¾ûî[»v­Ö: ÃsÏ=wîܹœs×u?ÿùϯY³¦V«)¥Þò–·|ó›ßB!>øÁžyæ™årYkýçþçŸúÔ§r½W‹Åò¬[,9 µ&os±XEQooúÈ#¸í¶Û–/_>wî\­õøøx£ÑÐZW*•»ï¾{ppÀóçϯ×댱V«õƒüàè£nµZœó#Ž8â‘G!—õ“O>9oÞ<­5ió¦M›r½i‹Åò¬ ÚbÉÆgqSEGguÖ<Ðn·üñãŽ;Îu]Îyooo§ÓI’Äó¼R©T*•¤iÖZJAÿÇ>ö±›nº©\.OLL¬[·NÑét‚ ‚€N^©Têõz®7m±X^€µ€-–àœSÅ‘”Òãû~’$'žxâ¿ÿû¿‹ÅÿüÏÿ\»v-ç|||<Š¢¾¾¾B¡ µ¥”+Ïó …B·3eEW]uÕöØcŸþô§„aX(²,£2GÎù‚ ò½k‹Å2+ÀKÎPØqœãŽ;®ÕjÝwß}O>ùä‰'žÀó¼4MµÖ”5}ôÑG×ëõz½.¥|òÉ'“$À|àÒ4¥\-²’ nÙ²…ÜÑO=õÔÂ… óºG‹Åò›X¶Xr «©4õHk-„êëë»òÊ+׬Y3wîÜ(ŠŠÅbµZçœ3ÆÎ=÷Ü 6л¾ûÝï†a˜¦)cì#ùÈM7ÝôðÃcZV—”òï|ç7¿ùM¥”Öú[ßúÖúõës¼e‹Åòkä7ŒAøð8˜†ŒR^Š vº‹å €sN¡YäF¦í“O>ù'?ùÉš5kZ­9ã8®T*Œ1ïxÇ;^óš×¬\¹òÕ¯~õõ×_Ÿ$ ½qùòå_ùÊW®¸âŠ¡¡¡uëÖÑÛÇY³fÍUW]µjժŋ¿÷½ïµ5H–ƒœVšzH¸qi甋µ¼ÖðøÔ]þA(Wym,ðá©ÂW*ƒ£1Sm»ŒÆÝ÷™ö\–Âõ4`!+wfÎo±˜´Z-ò!SÇ«F£A¬µîNÞ¶mÛÀÀ@–e”ÉEáäññq*XêžÊ£µ6Æ0ÆÈ†Îç–,–ýƒX§öŒFæÁC%X¡‚—­€çÍ̸äB¸J%ð8Rà¹D¤E%vÝe97 ˜e †AÓ†©ãö÷ÁrpÓn·I}©¦S ÒQqÎGGGé°®ëzžç8Ép­V#‰ít:4N˜1&„p‡&,ÑaËA çæL)Ÿ2¬PD’Û ‚ÜØpŠZip¹5-5ÅbÑ“eɰRŠ6 …€þþ~ZkJ¿j48çdæÒ©M¦sfY–¦)ÙÁyݗŲ¿Ð=­¡µÉdP*ç¾–&8`T« Às<&³ç ºĘ́‚ˆ²¨ÆÇÇig7`ìû“ƒÄÉÀeŒ¹®+¥¤<,)eÇJ)2”c9Ž]³Xö44 ` µçI£,qýò?ï=¹ p*ß½çîÕFkRJ›“m±ø¾EQEZk2…J©Z­ Óét:’^ß÷»óƒ»ÓÈ) Àqœ hˆ!Ff´ÅrÐâ€ÃŒ <ú8ÚêàsA”‹þíKãí&Y¾®p¬ƒÌrC#~ …B¡Pàœ+¥šÍ¦”’¬^¥T†a ƒØ›JáœÇqL®i:O’$TéDp.·c±ìW0Ú@`¤ó¹¯~}5Íss¾ægsº‚—ÂoßòщñVÒ×ê¯å`' Ãv»$ Es…år™²¨hðu¦öÎô–4M¥”Œ± <Ï3ÆNû¾ßuV6 ËbR2ȧ7?ó•¯-¨UáäŠÍ­ )‹Ê^ÐÜôÌ<Çèž»f÷÷Ê¬ãø®Q>Ûå§a:,‹Å²ƒ]êHÆ"Hã:ÁøxséKW6\áÏh ÇŸ™ ïeR~à A Žjq뎱“Ï>ûýèi§œ£SÝáàBÀL ¯Íß´X,Ëž ´f`|J„µÑTï ßøý;ÞûÁîl7ÜÁù—ƒûù¬3?vÝl¢Žb¸ä„¥?¿åÖ3.¼ðÜ“O{Û%—œtæÁa`8Hr'…×ê¯Åb±XöÃ9À(/ÑÀ c8¾wËî«_ùöoDš ³nÓ¶aDmÔjùäaåç‚V¦XëiïØ™Vª=Ee†þKD©3>:µ2Fæ/c`Ýf‹Åb±üh€MYmfZüRV{Yè,;¬ã‰úøü ˜5'žÁ1Š :”<kÕž8Kš‚7:MqØ!®B\\ Æ&=ÎZØɗ6Äb±X,{ÎoD.‹u™ güj5G¸r¼éžŠ| ¼ÜXp€³,“ÐÚŒÕQ.*?P™t”‡©qåÔ߇^2+À‹ÅbÙÌ4é¥pôo»’‚s(‰‘ôõ›$ó…à™JsZgnÜ40‰ô+e·§šÄiÖl ¥V †Ó`c†i+À‹Åbùíʾú5³1FÓïïgaÑᢵcgZ¥îùô¨É/ «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çÔ/Ëb±X,–ßUÀSsº gB„¥d¬­¸ï#ô$2ôÐÉi™ù\@–ÁuÖ`LE›j 0ù‘¤»Ïǃ-‹ÅbÙ´Ùl]!¤t]ZƒsEŽçAkLµq}ñÉÏ®§Ì/˜N§40Gje4âÑV­šDÁ0f8¨qÏ”3mE[,‹å·c`&Ewºýf ,nÖEO¥øY’&õ¸@šÂ;È\ÐU§œH{A;ŽÍØ(Š”BÆÀŒàŒ3Ãh¼5³eŒ1¶X,Ë  Ø4ºû5” ªÕhK”ÊÌñ„2E·\Ï©Gn¬4$àüLkÖÛkêuÆuÀT'0ºë1˜²€-C²X,ËbŒ™Ì%z•†é)M&z{•”<ðT;É«ÓSnÜBZêïkì@§Uîí+…åá'6um§>9ôÔ6â°X,Ë>0]Q§7âhTj¢.8|ÉD’¶êª†³:##€Èc™9Æ€‹NkdÂ9tð_Ýz[«X<ÿôu|ÑEg¼úTÆgœ=ß„’Á¶¢´X,Ëža^°m44Å4ï¸åÎ/}óß½óö¤Ù:gݦÛ;£ÛPæãaͯ¥ GãòWÏuؒ뮹æŒÓNt¦%c¬;FÍÃYÀÖm±X,–=áù>”]¸Üãwþàž?{ï{¶å9>»Ï˜h5Cº¶—­(ó`È@êä¹ms ~ñÐåbÆÂìf,”Õ_‹Åb±ì »‘)Å’$ŠÃByl¬±b͉›ÛÍÊâCLƒ»3sÝ¥4¨­;½-OßþÓ‡Qp`8dúŽ·;}·>hËH’$¾ïȲŒs>Ý»ÓjµJ¥€N§†!€8Žƒ ˜©KS'W!€±±±ÞÞ^)¥ãä÷•·Xò&1,t«P`¡{ÇÝtôò£[‡#†ÐHrYO~ŵޗ×/~Ý çÏ/8>dz? –?4|߯×ëZk×u…œs¥€4MK¥’”2I’0 ³,«×ë3¨¾äsB(¥¢("õe¶§åàÆaŽQ @9(Ìžýú .Ô8¯õä&ÀÆêo]I9,Mîb/HW³XþȲ¬Z­rÎÓt²ß»BJéyžRJkMö±¢Z­ÎàucdûvmnÎ9í±Xf²lÒ\ô ë/~F'äÖ +?Î44^~Ü*RfTͬ£Ùò‡…ëºêõºçy:B!DwÞYÆRÎX73U7Ïó}¿Ùlvo‹å ÅÀÐW’*ËVy2å;»I<úý“›Ë8…ç‹rÆpGÀXŽq‹å÷B«ÕP­V1išR¬—1Öét², ‚€16>>@1ƒZÆX’$´‘¦©ëºZënøÙb9H1š¹ Ò(ấZ †¹<7ÏP~œ¦àiªa&—aÝÏ–?8J¥Òèè(¦F\øÃ>á„ÆÆÆÂ0t]÷ÙgŸP«Õ>ðqÄ]çØïN»Ýö}_Jùž÷¼gÅŠApÎI’-–ƒ i4ƒçÂQåµÜ˜’׌iL&9K9c?@Ëþ@Ç===´íûþ¢E‹–-[ÖÛÛÛn·,\¸@EµZs>ƒj±X̲,˲ î¶ÛíLò²XD8c0Ú0.È-g¬´vÖ“×…Ë”râ:ÓÐF€gk$,XA@©ÈôòüóÏß°aCš¦Óµ°P(pÎ'&&f0IÊãºn¡P í4MI’gêüˈÀqOu0”ª•¼Ö“›×£:2 ÍD¨9ÓHpØ$ËI7əꮸâŠW¼â²,K’ä’K.yÓ›Þô¹Ï}nÙ²e ,ð<*‚þò/ÿò˜cŽ9ᄞ}öYÊÀj4þýßÿ}hhèÐCý‹¿ø‹8Ž1•TõáxhhhñâÅúЇº×ê^š–A//¿üò+Vüñ=ö%ZX¶lÙC=´xñâ /¼Àk_ûÚÕ«W {ì±Û·oÇTŽØßüÍßÌ›7oåÊ•7ÞxãÐÐJFk0v,Šå€…A§48`€L6“F^ë±§Å2xž'¥Bc8çkÖ¬ùÊW¾2>>^«Õ|ÿûß¿öÚkׯ_¿}ûö/|á T€tóÍ7oذabbBJ¹`Á‚Y³f¥iZ©T~ò“ŸüéŸþéã?Þ××·hÑ¢ \~ùåRÊûï¿ÿãÿøæÍ›1 .<餓V­Zåû¾çyI’pÎ]×¥\ën¸áÆo$M]¶lÙÄÄí×Z¿îu¯»ñÆW®\ àë_ÿzívû‚ .øÛ¿ýÛ«¯¾º¯¯ïÖ[oýØÇ>¶mÛ¶žžž tÅÛb±Ì86+Òb™²,ëvº8õÔSÇÇÇŸ}öÙ8ŽùË_ŽŒŒœþùÀäŒR!cì[ßúÖyçÀqœõë×sÎɸüò—¿|ÒI'õõõxó›ßüÃþÐqœ ®½öÚ³Ï>»P(„aøªW½êºë®ó}¿Ýn+¥|ßw]·Ñh¤iªµþÖ·¾uî¹çÆq¬”:çœs¨ Gš¦žç­]»våÊ•išcÈ .¥|õ«_ýãÿ˜ ‘o¹å–µk×öôôh­O?ýô¼>L‹å`À °Å23P}!ç<˲¾¾¾‡~8‚»îºkpp0 Ãz½nŒñ}_)å8ν÷Þ»|ùrÊÆ:òÈ#7oÞLææ]wݵ|ùrRÊb±xÿý÷c”R¿üå/—/_ž$I’$Gyä“O>©”*‹Bˆz½ R©!þÄO,]ºÔó88@qß}÷Q£éíÛ·Ó‘t‰V«U.—1Íf³X,h4I’¤iÚn·ñ‹_\}õÕ>øà’%K>øÁ~æ3Ÿ¡câ8¦¥ådY,–ßÖm±ÌÝ:"cÌÊ•+ƽ÷ÞÛh4Ž<òHß÷³,+‹===4ƒaõêÕ<òß÷þóŸS.•ëºsçνûî»=Ï+—ËŒ1ò*c?üðG}”.ñØc-_¾\k­”:ôÐC{{{çÌ™³lÙ2ºúÊ•+Ÿzê)ºÐÈÈ"oÛ¶­¿¿ŸNX«Õ¾ûÝï.\¸pÉ’%õzsÞ×××étZ­Ö1Ç3<û–[n¡\å7v3|à¸ýöÛüã'IBrKžä /¼ðÎ;ïl·ÛI’üà?¸ð i¾B–eaR4€(ŠÎ=÷Üo|ã###¾ïûÛߦV—ccc˜ª#:þøãGGG£(ªV«ßþö·›Íf†¥R镯|åM7Ý$„HÓô?øA^Ÿ§År0ß0áÃã`2J9x)2Øi-–)%çœú-w:°SO=õ¶Ûn{å+_I-®¨4y•GGGßö¶·]tÑE/{ÙËÎ9çœë®»®[_»bÅŠ 6\|ñÅ'œpš5kN;í4ZëuëÖ]uÕUK—.zßûÞwÚi§‘Ø“ÛSöw¡P¸ôÒK/¸à‚—¿üå§Ÿ~ú5×\CéÍ4‘’¥¼êU¯:æ˜cV¬XqòÉ'ÿýßÿ}· ×ÛßþöU«V-_¾üU¯zÕI'D~ij$Bm¥©§æ‹ûéZ,3C+M= $ܸ4ÈsÊÅZ^ëaX|ê.ÿ ”«¼6øð€T á+•Áј©¶]FãîûL{.Káz0ˆ„;3ç·X^D”Rœó(ŠhÜeSêmÿæ[²,sGJI&lÇžçqÎ[­V©T@r>11ÑÓÓE)7)%mÐÎ]®gúè…îaY–‘•<}I´SJ©µ&'9ª`¾êª«n½õÖÿøÇŽã»›FÏø§g±¼8Ä: ´g422(Á ¼lvõ ݸäB¸J%ð8Rà¹D¤E%vϘÛw‰e †AÓ£´¦9öä´X~¨´—fýȲŒj„xž×jµ”Rív›Òš&&&¢("ï±ëºa&IÒu_wŽìΞžc )h’$”5Míw§¾t’N§ÓÍg¦vó¤÷I’P¶€v»M’ì8ç¼X,Ò‘µZM)õo|ãì³Ï¦ò$*S¦µY Ør€Â¹€9Sʧ +‘ä–íŸ[´+œ€‘RzðÀàrkþZHȦô}¿Óé8ŽC—Ó4åœû¾Om±XTJ5›Íîx¿N§†!“ÑŒ)15Ð û8‚®âÒíÜÝz¨Žˆr» …5­ô}ŸdØqc -©»xxxÖ¬Y¯~õ«GGGGFFŽ:ê¨K/½J‘Ѽ;ƒÞb90èZZCÃd2(•ã)#ðE&7f‚Fµš¢Vò&3Ö¶xžGž^rA €+¦ô•šOuÅSn^­5½… bR_òNS!/ ÝòÜéVòÿ1݈4’,]ß÷[­V´Q*•èœ$öBˆ®®S²ØÍ7߬”RJÑùÉ5íû>¹µ­ Úrࢡa8©¥ÃyÒh K\ß‹Ó8—õäö]Jà»÷üϽÚÐ/ ¤”ö›mù Žã(в,3ÆdYF¹Qžç !’$¡T&cL­V£2!äø%ÁVJ¹®ËëJÝÄÄm—›ÜÝ¿u;wî$É4ÆK)Iþ©µV×Ô&‡vEä?—Rº®K’¯µ¦çL œ ÓyÆ?4‹åEÀ‡4xôp´Un.èÜ$Ï \Üðo_o7éÛì ÇÚ¿– ÓR€–|Å®ëRˆ—:6“ Ò´†® W)5{ölR\Qi­éêä,¥TJõôô¤iJ!áî¼#rïn=ÍfsÖ¬YT§DKŠ¢ˆ¬jò'ÓcA×IN'$˸!&=î7;SÓBi¿ÅrÀÁh€5’Îç¾úeôÕ4Ïí2?›Ó¼~û–ïŒNŒ·’6¸V-*ä&½@C<Ï£—Åb‘ ÍnÚ3OÊG2‰©ÁÀd%Ó aÇqèàî©<Ï#ýVJý±Ør¹¬µît:4( SNiU5x IDATÚîŽ8¤.´òR©D&/¦lq×u9çiš’‰L½61M‰-–¥dOo~æ+_ÿZP«ÂÉ/9·2¤,*{AsÓ3óÿ¡{îšÝß+³Žã»Fùl—Ÿ†uzY,‹e0»Ô‘ŒEÆu‚ññæÒ—®l¸ÂŸ?Ð0Î ÝÜË2¤üžd A Žjq뎱“Ï>ûýèi§œ£SÝáàBÀL ïļ,‹ÅbÒšñ)ÖF“wÇ.¾ñûw¼÷ƒÜÙn¸ƒó;.÷‘SP%?vÝl¢Žb¸ä„¥?¿åÖ3.¼ðÜ“O{Û%—œtæÁa`8Hr'…×ê¯Åb±XöÃ9Àmà c8¾wËî«_ùöoDš ³nÓ¶aDmÔjùäaåç‚V¦XëiïØ™Vª=Ee†þKD©3>:µ2Fæ/c`È©NËb±X,`SV›™¿”Õ^úËëx¢>>?f͉ëõ»ðâ‚%OÇAµ'Î’¦àNSvˆ«—‚±I³Ö0fò¥­|°X,Ëžó‘Ëb]¦ÃY¿„ZÍ®oz†§â kÄ!8ÀY–IhmÆê(•¨L:Ê@ ß©d‚^2+À‹ÅbÙÌ4饢yú·]IÁ9”ÄÈúúM’ùBðLí¶žï÷LnÜ40‰ô+e·§šÄiÖl ¥žœ»b`À4À˜a`Ú °Åb±X~;†²¯~Ílc B ÑôûûYXt¸híØ™B©;ÀnÛªÿ^É/ «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çÔ/Ëb±X,–ßu‘£ æt΄KÉXZqßGèIdè) “Ó2ó¹,c „É2æº*Ëà8J)ÆØäGî>¶X,‹eOÐd³uu„È2Çq 5„ÐqìA¾ú’Ÿ<ÚáA¨£¨8»GjÅÀ£ÑV.#qa3SSϦĘiÛ(Úb±X,¿3©¬ÓõÕ„,i5DO%,Y’ÆõŽI’kı—ä&À%Â8Q¶ÚmŒ¢·•’QŠÁg†Q[]jŒÇc6l±X,–=@°it÷¦UXP­Fsb¥2w<¡L(Šõœ:qä&ÀÚ0©´Sp•ÊÐßVKpé*Ä!Ó]Á”ll’Åb±XöcÌd.Ñ ¨ÔM•)j5%%ó]ÙNccòêô”›wöT;;·#KªµÞ‚WØöÄ&ÕIl#‹Åb±ü.LWÔé8•šS).XvØD’¶ê*(fD££€Èc™9Æ€KngÇgèC7ýÇÆzœwÚÚKׯ?õì“cœqö|JÛŠÒb±X,{†yÁ¶ÑÐÓ¼ý;w|é›ßøî·§­æâ³×>µc{4¶…i>ÖüZQ:†+Ã&êê™-G¶äÚ«¯^{ú)€Î´œ>Šœf—20;Éb±X,{Æó}(»p¹Æo¿ã®ËÞ÷¾ŸoyŽÏéwf'ZAÍ®íe+ÊüXÆ!wÒ-Ûk©zâÁûkÕ²Ñ ÆL°ëã­þZ,‹eOØL)–DíN©X­¯Xsâ³VuèÐÓ†Í3ø@éÀÉ6o›ŸüÁOvÊ W‰«ÇÛ¾[´e?¦Ýn‹Eišº®ËÓZsΕRB­µ”Òó<ÚÇqìæAs7$Iâû>ßó¼îF÷T´ÑétÂ0”R:ŽCÿÒÛ•RJ)zãÞBa…ÆÆÆz{{§ŸÙb9€H +ù5(ð¢wçÆÿïèåG7Ï1„F’Ëzò+®u¼l¼~ñë.X8~Áñ8žýJ[TŠÅ¢ÖzbbÂó<ƘRŠsnŒQJaJ,¥”RÊ}P_¤¾$¢FC)EØÂ,Ë„aE‘ã8išvÿ$¥Bì›ú’ïN¡”Š¢ˆÔ—ÙÞ8–‡9F)å 80{öë/¸Pwbtâ¼Ö“›;«¿uý%å°4¹‹½ ]Íb9€H’„sÞÓÓ£µŽã¸Ûÿ}ºì‘ šß¡ ŽäÜ÷}!缫µÊåòô#É`%¤œ¬q$‘Þ+ctªnfç|úÉ-–‹î· èÖ_üŒN Qy-&?Î44^~Ü*RfTͬ£Ùr`âû~ÇêõzœóññqÔIFÑ5 …}iûÞétÛ÷ý4M£(¢SEQDÇÄq,¥¤¤‘´$×ué€nnãžÓ}\`Œù¾ßl6ɯ¾·`±äŽ¡¯T–­8ò(dÊÏ© r`§ð|Q.Ãî¸ËÑ!n±üNcȱ\«ÕH,kµZ’$d} !Ç™˜˜h·Ûûvþ0 iCJE‘çy…BAJ™¦iµZÐn·»žíV«5<<Œ)u×`ÝË•1–$ mPx›ÂØûvKÎÍ\i”pÝR­Ã\ž›G'?NSpŽ4Õ0“˰îgË‹Rêÿý¿ÿwì±ÇfYFX¾ï{ž÷þ÷¿ñâÅI’ôôô‹Å‘‘‘};?éú¦M›V­Zµpá“N:éúë¯ùË_ I’W¼âúЇ(÷ê¯xÅÆ1$À]y¼ßívÛ÷})å{Þóž+VqO’l±¨hH£Á<Žè~A^|r`xH"8\3¦1™ä,å^Ǩ,–ýÇqŽ:ê¨Õ«W“ƒ‹œ´”ü¼`Á‚ <Ï#íïï'Ïð^!„ÃpbbâCúÐ1ÇóÔSOÝzë­CCCkÖ¬!¡)•JtäÖ­[7mÚDr«§æxfY¶\,³,˲lÁ‚¤»ÓMm‹åÀ‚3© ãB<Ñr¦Jk÷e=y]¸\­€ëLC ž­m°˜h­/¸à‚þç&q-•JQqÎÇiµZQ1ÆÂ0¤„©}HH¦7–J¥Çü˜cŽáœ‡axÞyç}üã§<)ß÷Ûí6]¨Z­V*Îy–eŒ1Š K)÷-ìº.Á“¦)IòÞžÇbÙpÀ8.ãà©ÎÀ†Rµ’×zràzTG¦¡¹‚5g©›ÜaÙ¯1Ƽë]ï:þøãée’$ò'ò–·¼å_þå_ƒ £óýïÿá‡~Ê)§<óÌ3¥R‰Tqà 7,Y²dþüùW\qù¾È\þèG?ºdÉ’Ã;ì#ù¦ò§Hꨆ8Š¢üã>øàûßÿþ«®ºê‹_übooïÒ¥K©RˆÄžlScL–eQ¹®û’—¼äž{î9ÿüó9æ˜3Î8cëÖ­—_~ùË^ö²Ã?ü¹çžë^â£ý衇ºxñâO|âRJD¦µþ«¿ú«Å‹Ÿ~úé=ö˜ëº´T×u¿öµ¯-]ºtÑ¢Eïz×»´Ö´ß ³e?‡A§48`€L6“F^뱧Ų(¥Î<óÌ/~ñ‹(ù?þã?þå_þåÜsÏÿÒ—¾DM*n¼ñÆ/}éKcccŒ±ÞÞÞžžRÐ_üâ—^zé³Ï>[«ÕªÕêñÇÑE !6nÜøw÷wÛ¶m‹¢hÞ¼yÇü©§ž ÀuÝnç ×ußóž÷Üpà ¯ý민òÊN§366ö¯ÿú¯»\§ÖšÌÖ,ËÖ¯_ÿ³ŸýÌóÊW¾òŒ3Îø§ú§ë®»î5¯yÍ{Þóž¯~õ«Œ±;ï¼ó#ùÈÄÄÄsÏ=÷Ò—¾tÉ’%gžyf³Ù¼÷Þ{?õ©O5›Mƒƒƒ===ŽãlÛ¶mddäòË/üñÇgÍšµtéÒO~ò“ï|ç;…Ýtk‹Å²'ØlF‹e/pgõêÕI’<ôÐCAlݺuçΧžzªã8žçQ™¯1æ;ßùκuë¨îèï|'™³…Bá _øÂÙgŸA³Ù|÷»ß}à 7(¥Ò4ýÌg>sÉ%—8ŽÓ××÷–·¼åóŸÿ<¦•eY6>>î8cìÉ'Ÿ¤Ìä0 kVsÇI’¼ímo ‚€1væ™gnݺuõêÕžçüñÃÃÃŽã8Žó‰O|âo|#…«Ï=÷Ü 6$IR©T>ñ‰O¼á o S½öµ¯­×ë®ë |ìc;묳¨òø¬³Îºí¶Ûèáw)q¶XB¬[,{Gÿá‡~Çw0Æn¿ýöÅ‹×jµF£ANfÎ9cìG?úÑš5kèø… Ξ=»ÕjeYv÷Ýw¿ä%/) år¹§§ç±Çó<ÏuÝ_üâ³fÍ"[¾|ùwÞ C*[r]·V«I)“$Y´hu¹¢Ž»[$ebA0kÖ¬N§CÛJ©¾¾¾B¡066V*•FFFÈ[~Ï=÷Ì™3‡R¦=ôÐû￟oýïÿþï¼yódYvÜqÇi­›ÍfÇO?ýôìٳ鄫V­úéOš$Éøøx7áËb±ì Öm±ì5«V­º÷Þ{lܸqíÚµ*•ŠëºÝžÉ®ë6 ZkÇq¥(7 6|ë[ß* ¾ï¯X±‚Ž!ãrbb"MÓ0 ‹ÅâÄÄD¹\œ5kV–eI’PȶÝnW*•,ËȨÝÝ É!Üh4Œ1…B¡P(¤iZ.—»%cÃÃÃëíëë«V«­V«P(ôôôP…1ÇTÌ£ë–J%ÆØæÍ›Ÿxâ‰|póæÍ…BaõêÕjµÚ‹ðÉ[,HX¶XöšL°víÚ+¯¼ÀøÃø‡ ?¥iJm·Û$¢###ýýýÔ €RªV«½ño¼úê«t:Rk!ĬY³*•JOO€§žzjΜ9´ýè£2ÆÈÿœe™ëºQŽŽRªÙ©»„úEW*•F£A†µçyÃÃÃä7¦–sçÎBPár÷aûöí¾ï;Ž£”j4ÔH¤;}1ÇñÀÀÀùçŸÉ%—Ìš5 @«Õ¢•Ðýþ¾>z‹åë‚¶Xö sžp ۶m»õÖ[ëõú+^ñ ZëÞÞ^¥”ÖºT*…aøÀô÷÷k­·oßN“„Ë–-Û´iSš¦$Ò]3gÎwÜ‘eY»Ý–R’L¶Z­yóæ•ËååË—¿ä%/¡'Î9¥:w»]î’R©D'w§ÙlFQ”$ɬY³vîÜIÉY­V«ÝnS•ÑÐÐÐ#<<ìºîm·Ý6gΜ8Ž …ŸÿùŸó›ß|üñÇéôlA'ü½ÿX,@ä7ŒAøð8˜†ŒR^Š vÊŠe¿†ºA%IrÖYg}ï{ß;í´ÓH}©?3+pçÒK/=餓^ùÊW¾îu¯»üòË]×BDQtì±ÇÞ|óÍçŸþªU«þèþèÜsÏ¥æ‘k×®½ì²ËV¯^=44ô7ó7Ý.211žç%IBSI€ÉMIÔ¤£I’‹˜Š—èÈR©Çq³Ù¤fÎÍf“r»ŠÅ"Gt]÷¸ãŽ{×»Þuúé§^qŧv¥Ô»ßýîóÎ;ïä“O^»ví5×\£”¢‘ëV­úâ¿øú׿þøã?öØc/¾øbÊ ³=¢-û9­4õ4 pãÒ Ï)sK_`X|ê.ÿ ”«¼6øð€T á+•Áј©¶]FãîûL{.Káz0ˆ„-%´t'û¶Z­R©D¢Èñ«µN’„Ò²~³:V)%„˜þv²8µÖ­V«R© Aav3­è]t­îžî”Àf³ùk P;:áoQ0Æì2«kÈRN€›Í&µ¶&§ ÁÔ³ÑhÐ%v¹‹eÿ!Öi =£‘yðA V¨àe+°OÓ²w7\W©G <—ˆ´¨Ä®{ÔäöÄÊ2à©ppò ŸcON‹eOȲŒ”‡,¥$+“œÌ¾ïÓœóB¡à8£(^K­¯8çäÊ`Œ)•J”⤵ïûÅb‘ÒÓl6Ɇ.•J'&u¤á€q—Ëeê˜A‰`Ò4•RV*²Ú•R”QEÞiR_²ªéqt·+ê4÷—ò¿â8.‹”Ì¢Ýn“¨T*t_V}-û9œ;˜3¥|ʰBInÜr`W8Àh`¸—[óײ_CN`ÏóH>©îå”ÙDÖ!©&©¹¦;Ué5lŒQJÑh?)Ø=[Çqw;Z(¥HIÛÈb&a&—2€$Ih¹\N’¤;¯—Fvu—Ìq)e×F'£–TÜ÷ýîc9´ã8ÖZÓ²=Ï㜷Z-ÒòN§C1lÏó¨ÚŠž<^¬ÿ‹åw +zZCk“É ”Ûƒc~°à€Q­&Ïñ˜Ì¶Ñ±ìïPý‰ iijš¦4˜ÚWÅqLÚL5µa&IB£~m(¹s4›M ²R/å!Ó :2Žã®Ç8I +¥¨Twtt´[˜DúM+ᜋEŠ»®ë8ë$êq“O==8çÝÀ0M¤û¢nfu†RJj´I&;u¢~‘þ,–}ECÃRKpž4Èן!ÿóÞ“›§ðÝ{þç^m´À!¥´)–ý’+×uÉCKRª”¢&”¨a$™¤d/’Jîh!Dš¦VJÑü"’Ør¹LNf2²©çÜCç¡s¶Ûm*a"1¦÷v:jµJ&,Í` ê^2µ Z^’$´BzI"¹¥ìNÇ15ö¢~Ԥ裣£t;Ýl)e½^'‡ö‹ôß`±ì8  Á¸ðÀ£€£­>´@¹¸áß¾4Þn’åë dž€-û9Žã»µÑhÐÀALM¢Iõ$TI’PB…Šã8¦–N‡Ê)c¹\.w}×<¦+ƘRŠÎLv'y§‹Å"¹Ûív÷Š7Ó¦g~‘‚’›B¼¾ï»®ÛjµÈØ¥FÓ¤ÓÝIGJ)j9%iSô—Ö××€ eŠ;ŽS­V»X,û- €6X#é|î«_F_MóÜœ¯ùÙœ®à¥ðÛ·|gtb¼•´ÀµúkÙßé–U*2+»‹)¥$‰¥ædŒvÿ%%#m&¿.¦‚¸$œÓuwú|!:†.D‘ãb±HrKžm”EJLáÞB¡@éTä¯NÓ´;W˜œÛ$Õ´MRM¹]år™lâ,˨ït÷îèB¤»¾ïK)é¯QY/´å€FgB>½ù™¯|ýkA­ '¿PlneHYTö‚æ¦gæ9þC÷Ü5»¿WfÇwòÙ.?  ¶X,Ë` v©#‹ ëããÍ¥/]Ùp…? a$œÝvuÝ;ö² )¿'ÖBƒ£Zܺcìä³ÏþÄG?zÚ)'ÂèTw8¸‚0S»û¶ó‹Åb±<Òšñ)ÖFÓÜO¸pøÆïßñÞ~pg»áÎï¸ܧž/>ù °ëfuÃ%',ýù-·žqá…çž|ÚÛ.¹ä¤3×ÃA’;)¼V-‹Å²'ΦhÆ0hÃñ½[þûs_ýÊ·ÿ{#Òdèœu›¶ #j£VƒÌ'+?´2ÅZO{Ç6È´Rí)*3üó_"JñÑ©•12ë6ë°X,‹åÿ@lÊj3Óâ—²ÚËB`ÙaOÔÇÇàÁ¬9q½>c>P\СäéX#¨öÄYÒ¼ÑiŠÃqââR06éqÖÆL¾46l±X,–=æ7"—źL†³~ µš#\9Þô OE>^n,8ÀY–IhmÆê(•¨L:Ê@uŠÝ¦zŒ1fØb±X,{€™&½T#@ÿ¶+)8‡’A_¿I2_ž©4§uæ&ÀMÓó‘H¿Rv{ªIœfÍÂPj`0 0f˜¶l±X,–ߎ¡ì«_3Ûƒh4ýþ~.Z;v¦…PêPÈc™9&aõ…hF¬THM)%…J%ͤb ŒÆ>åæÜØQ£‹ÅbÙ¨Û+1§Ëp&DXJÆêЊû>BO"CO|–™Ÿ!L–1×UI Ç¡¦óМOê.¹l’Åb±¼˜èppa ˜ËÀLc sWk@JðbÞ+~!»KÖuUª¸ž+;3†©ž©:›€Å™v\QPœC¥€‚'•iCïºÝt~<ÚáA¨£¨8»GjÅÀ£ÑV.#qa3ÔSž^cÚ6жX,–3Ù$1ƒQ0 F€ùŒpcFª8KRÁŒë iFs^ñž!yQ’E ´TÅ"ó=“¥ÈRff¦GÌjÈÚŠMÀI_–`ÌGÏ~–]b!Œa«ÝÆØ(z{P)¥¸œqf˜1†ò°0™„•×J-‹åàB8 QŒÆxâ4 Œ áÁ¸€„BüÀðSÎÎüLIæ—…ï5Û­xûóænoÏL%RZèÀq¯G¦1¢4K0¼XöØÏX&•v ®RúûÑj .]…8dš\Ð@×}ol’Åb±¼X(! %‚iæ@ûw´#Dš2yžÇKLk©Ô„3ÔÊq†0»Ñ‹­(øàYå@ÌTQòìðÓ(ÏÐHàØG;’îœÌ p€53µ=•ãwßþó'žxbÛ¶aX ü0Ž­Q,;Éþ"Ükã"S®ë?ýÌæïßõÃÍ;¶¡V…ï°t7&ê^bœa®zJbv«ÝÐØ9k¾|É¡á‘KææÆž]¯3? Xº›·ó§Ÿ|ð§/\´¤Ì|K]tv]-e±ì$IBsé³,ãœO÷Ö´Z­R© Óé„a Žck¿ç(¥„´Öœsº\–eŽãdYæy)¥ã8t!×u]×m·ÛÅb1Ë2×u©žžsÞ=ŒN«”¢·[,¿•–Š " Z7¸ª ¸ý©çž¾ý?š[¶ÍÜÜ‚<0à™VœÃeÙ¶ýóÿöµÈ¼¯G›™2,¥ e”â,W¢à‡çœ—ݶ±31¾’Õv$ÍÌ/•d?fzn~Ž{ÇËÆë¿î‚…óç€ãå¶Xö ß÷ëõºÖÚu]!ç\) MÓR©$¥L’$ Ã,ËêõúÞª/€®ú¦iJ—ຮÖÚó¼F£¡µ&Y¢( CzÒ/‹J)Çq¢(âœsÎÓ4íª¯”RaÕײç¸ÂUÚ€s¿³uGãçîØ:ü\Þëú]aŒÑWLQ.—-ZÎwg.ïÛ¨|v²~ÇúMøñŸyùêAu«I‹ð¢$€éNš›;«¿uý%å°4µôÝFÎ-–ý„,˪Õ*)íBH)=ÏSJi­I2…ÕjuÎOåœs:€8Ž¥”N@¥RaŒ‘9[(tU–²% … 2¡_BJÙ]ü¾Ýµå`C@+ÉÀn"yïƒ÷m}ô¡fµò^×ïŠ1†snŒáŒ•J¥#<Sߎ™¡ÛSkºœ‘2‰ã_=&Ì[´ÅH—yé8½šç(À™†ÆË[@Êl*¡Ý&;[ök\×P¯×É $]ì>Swçw‘e,÷þ»mŒ!“ºûTN¦m±X¤¦4Zk!D’$´ RJ2‹é€8ŽÓ4¥%ÅqÜ]3­êw½ËÁƒv9À¤Rímã?~ügã;ÃJ­’÷º~W”” Z+¥8Ø!ƒƒˆcÌè¤c ©/ù¢` ¤äþüïï…KZÅRËQíy©NóûBÊ8…ç‹rÆpGÀØ~–Én±ü­V @µZ5ƤiJ±^ÆX§Óɲ,ÆØøø8!D×<Ýs8ç]'ý.‹Ý?Ñ™1¥©ddw:Šøj­Ûív¾ïcÊ>îZÃÓÍb‹åÿÀ@9@Ö‰wlß±9‰ç5/ÈgdÐ BŽ"F*)ey¦úoL¿ÀTûdιœƒóB¡mq]GÍ=¤®ã^ærŶA–óà4çHS 3YCfÝÏ–ýžR©4::Š©‘Õþð‡O8ᄱ±±0 ]×}öÙgÔjµ|àGqľ¹|»¿Žã?øàƒ'žxâ¬Y³Î;ïDÈ97ZS’¥S`ÚwdF`Ssü´Öš²±ƒ–a9þÕc}åŠô\­U‚¬Ä•›—)EÅu¦¡oï]vË‹IBúÞ8ÿüó7lئéô„çB¡À9Ÿ˜˜Ø—¯‚ÞE¾nzyï½÷®ZµÊqœ â8ö}_Jéû~ÇdãRê5¥\’/ºR©pγ,£Ì,RJ¶ì!šZÿ ÁEºc‹Ójïd¢†| ˜¾#¦À „P3š‡õë¬5Œ)öôŽm}`bxŽ1*($ÚdÀ,âܾõ¨ŽLCsjÎ4R*¯õX,Óé&9Ó7ö²Ë.[½z5**¸ä’KþøÿxÆ K—.]°`çy»}ßûÞwôÑG¯Y³fË–-t†F£à†nX´hÑ!‡rå•WRbñ‘|dhhhñâÅúЇhYÒN§ú§ú§Gyäꫯ~ÿûߟ¦éÊ•+¯¿þzòQ_{íµK–,1Æts°)𬔢ó!>þñ/^¼øØc=å”Süqztøô§?ýGôG‡~øM7Ý`ppðá‡üÿÙ{ó ˪ûÎów¶»ß·çžYYTÅR¨(,@4PÚ, ËK²5m„»í±vh"l‡…™PÌL´;,™MŒ<îh…„P·=î6–Œ-@¬b;EíY•™•ËÛßÝÎ:xSÝS…Rj$£÷‰ŒŠÌ÷nžwò¼ÊüÞ߾妛n²Üyçóóó;wîüßø hµZv3_ýêW/¾øâ­[·þú¯ÿ:ôû}ؽ{÷“O>ùñ|çÎû÷ï_[[ýd”}ýÏ> ã»þd˜·cŒ9ßðØz„•‘e@’0ŽTCHÐì4óT¡¤¡š8 ˆ´™É˜i IaN6GÊ„9÷ ®ƒØ1!gY†h› éø¹³Âà:QLHæ3ŠU¾"I*4aà’Y¥@mÊÜ ­$º@aB°Ã2%4„hã~40ˆR–2`• 3$X”zî¨X“=À=`mpRÈ]0 ¸MPxˆŒµRvÚ=`Œ¥`L"F·‚·¼wÆéè5WWÁEHç#‹sĈs`%Í&6SJ¯½öÚ¿üË¿ìõz¥R‰Rzß}÷}þóŸ¿ùæ›WWWo¿ýv[¶{ÿý÷ñ‹_L’Dk=666??Ÿçy©TzüñÇû·ûСCFcÛ¶mÓÓÓ¿ó;¿cŒyúé§o»í¶……˜››»îºë®¼òJ›re+‰cRÊßüÍßü‹¿ø‹_ù•_¹å–[”RY–­¯¯B²,{“J§z½žçùÝwß}Ë-·¬¯¯Û!¶¹ÇÝwßý™Ï|桇Ú»w¯ã8Ýn7Š¢~ðƒwÜqÇ 7Ü/½ôÒ'?ùÉ×^{mrrrffæ«_ýêÇ?þñ,Ë^zé¥?ú£?zàvíÚµsçÎ?û³?ûÔ§>%„H’ä£ýè½÷Þ;99ùó?ÿóò'rë­·ú¾ÏCÙ&!ÿ½o#~²ÐŠRw Œclà „ó(uÆä¹¢ÂÒŠ ÀTJî$! é ¥ ËEQdIÞ.‡B0BJƒT”:¡´ã¢º‘Tˆ–TË;JÍ"ìQc¯_ÈÏ]‚ªŒ Å‘Ëç×øàÜ÷ne>] LDؤÌsÐ9ö¥ „ª4¢E~ ㆖¹&/8¥2ï…ÀLìÏ$JÑ·opA|„’4!G.©#Î5a­­yà 7´Z­………¢(>¼¶¶öÁ~px¥-Û½ýöÛo¾ùfû-ŸúÔ§Ò4µþá;î¸ãºë®«×ëð±}ìá‡vÇuÝÏ}îsïÿûƒ ‚àÆoüüç?o}ËÖ¬´­¯8çåry}ýõF»V€§§§Àó<[uNz½žçy cccÖ=~æÌ[õo|ãÀ—_~¹­¤BI)¯¿þz«¾J©/|á ùÈG&''…¿ú«¿úWõWEQø¾Çw\uÕU»ví€_ø…_¸ï¾ûl+.BÈM7Ý´mÛ6Ïó<øðÃW*×u­Ç{sl#þy¡%£î@K1ëa¢ /ƒ6•Ú"egd‘Šœ(N4Ï1tƒ WôE:Xäù)žž‘EOsµòEç„  2)¥ ÉKÕ¶)2T8ÚR ..‡;?¦N&Ìi¦vºÌal€ŒV@K,£bmö|û™"N憉êd |ä‚&)fȵ>‚ÅÈO!+@æ‡)Ó¦èjx5ð³ÝKÄ%jÊö†==# xĈscõÉöÜ›œœ|öÙg/¾øâGyd~~> ÃN§®ëZËòСCûöí³Í#§§§{½žà‡~øƒü Õ¹0 Ÿ~úiëæ=räÈÇ>ö±,ËB_|ñW¿úU[òDZ5 !¶ÜÈ*™mlÉBØn—oRglÝ?÷s?÷™Ï|æŸøÄW¾ò•ÉÉIÛœò›ßü¦5¦•RƘR©¤”Ú±c¼ÑMóÙgŸ½öÚkÓ4u]wëÖ­û·ëºn¯×{àÞóž÷Ø—¾ð ï¾ûn»1cL¥Ri·ÛÕjÕ÷ý¡¿ÞÈûZrŽxKa\„°QZæ Špmî•»N//øë‹[4¯"`ÀVÂòJ­!¦®M Y*ràI½¹êž>>•ôÆý°lÈ €@ 23Œ”çê‰Éôò+žÌ3cÀNÖë;k§ç›+ãEoÌ =É™ú䫈$F"#ãöªè‰è|‚‡âÝ¿°½HÐ=_ï!¯F"ÈW›”‘“»•‰ÿñW§ ]ÜyçŠÐuWOþÚ¿òÜúóí¸¡+rwõ¨:újräØšÁci±±Dñ‘qlž¤UVË|ÿûß×]wÝ|óÍßþö·ßýîwgYV©TJ¥R’$V¤“$™œœÌóœÒh4lÿHcŒçy·ÝvÛ]wÝU.—9çï{ßûl U»Ýö}ßfHY9'„pÎçææfgg—––Â0üØÜ–š£É ÓÅB³%%ìªA³ÖhŽ7x" žÇ@.ûAøÊâK³wý-Âδ-^²·8øÄ¿Õ|åñ*K ðˆçÀ*G–eaº®«”ºñÆoºé¦Á`ðè£~ñ‹_´´Ûmk†Ú˜ñúúz¹\VJ5›MƘÍCö}ÿÖ[oý½ßû=ιïûJ)Ûfrnn®ÝnÛHs·Ûݲe‹]çÞ{ï­V«Y–Yó—ÒétZ­Ö°ú¨^¯Ûÿ7ɲ¶ºÞív¯¸âŠ{î¹çÎ;ïüÄ'>177wðàA[F…1n6›•JeX­dwÇqE_øÂ>ô¡MLLØ™f³Y¯×…·ÜrËüÁØv]„ß­V«AØ›•0 ÏÞcldþþ4ƒ¨…C ! D†GTª]ÏËóÎ|‘¸…ad°*X]_à¼HyZVJÎO&¦*횦ÊÁ€À1&W(§HhŽ5(Š“Ø¿²PœC'ÍûH:T"¦¤hžqDáÇAÅy¯Çft\îŸoŸJ§ÍÕt¶æïÛ7y⿞‚î ¦°îШþ3W'Š71xÙƒ…z©h®‹V{%ÉÆ½ lLø`°ë™[K'^ËôÆÚeîLGŒ8/g+Üþýû“$ùÎw¾c»^xž'„ð\.K)…—^zé±cÇcl³ ­'yjjê‘Gq]7Žc„ëºVJwïÞýüóÏÛ—xá…öìÙcŒB\tÑEóóó»wïÞ±cÇ`0°¾è8Žƒ  ”FQd;PRJOœ8q¾w:Á`P.—µÖžçÝtÓMû÷ïôÑG`vvö±Ç€z½n³¦)¥VÑ­SýÒK/}ôÑG'''B6¿Ì°¯¼òÊ'žxÞ°˜Ba¦ijeØæ§iÚívmÚófö¸ñÏB2Ó !¨¨N½ÕV[Ç÷9ÄuÀõ=æc"/ («K1†Ø6¥wgÝËÛg¶ä)8ŒS¦zš †À¡Êhª8FF÷Ä™nVH9î¸úádT+J㯄ãߪ`ˆ ÅU¯—6»=Ž™ ««çÛg}|Oìï@.¾¨2>IùF2‘¬øQ{ëÇ—cxûl–e­Vëþûï?ßþ=Ï‹¢H¿ÑþÔ©Sǿꪫ„Ÿýìgïºë®#GŽEa•2MSÛ\ÚÇ¿õ[¿uçwÚX5¥Ôqι1æÓŸþôßýÝß=õÔSv£½]°¡èašïûµZÍš-ˆ²w*?·jÄO0 ‘Ì„q^ž:ìGý•Ãû}MáÓBöÒ¼È !L*ÑšÀ ù>ŽV¢*q…œeM”i¤Á` @c¢(E„¸(#„8©"…ÒÀ¹W yw[¶¾«Ý$HN{îö4"È¡³TíN:õóí³y"çIuáh–$kµ1ש4@"Çáû®t’žZ|y²Ùê¸5S»Ò¶ÒÆã¨— ý€6Þ¶õ•Âc“H^°áó9ßÊä X€—@пN¤Øœ•B À$ŠuѦkEK‚ØÐ‡ 4  $À¦Î·ñSˆÍ²]!mÄTñ®w½ëþûï¿ñƇMžûý¾ã8Zëv»ýk¿ökùÈG®ºêª|à·Ýv›uMcÞö¶·}éK_úÈG>rÝu×½ãïx×»ÞeMÃ÷¾÷½ø‡xÙe—íÝ»÷ÓŸþô;ßùNxcÌC–eŽã؃A©T*—˃ÁcüÇüÇ‹‹‹—^zéÍ7ßüå/Y)Å9·Û³ûÌó܆ŸàK_úÒþýû¯¾úêƒ~ô£}÷»ßÍ»úê«?ûÙÏ^}õÕW]uÕ×¾ö5ë"Úú­Vëꫯ¾ýöÛ?ô¡øÿ½ØŽàÕZK)=Ï˲ÌÎf°‹ÀMž»Ýn¹\βÌ÷}ι]Ê~b„7²‘áÊ]›`<|!›hmŸ²ÿ·:¼Æ&<çyî8Ž1ƶʲ¯bÿµq\»U»ó³S¥l[ÛâþœÕé4M=ϳ±mJé0RîûþpÏËËËÖC „°g5ñÏ )ú_þígÑepr¡r lCëhÌ)TàûQ/ÚžtÃ+®»·{fïâ‰é~j¨C´v”ä„%‰º«Î¶=Gv8´vºrä¹½JVœÀ tËÅ . ‚ó€UÓ®fáé—´Õ¥>—¬,óÔ¬¿ôŽõã—õÕR8žÒ ×]+UZ˜ÃôŽ…Æ”,r8ôÔÞ”Â(ϳÐa ÍÜÏþëÿÌN)&~÷—[+ËSÿåqyÓǧ^*ÝsoxãÍI‰˜oÝŸ^vEo×ÌÜ¿ÿw¨(w0þà_õ.Âý÷èd0·óÂêîÏD%ýõÿ8•¨ cƒ±@*×Fh Šežpñ}þõÿYuóz Tˆó&a™ÜÓ̉@SâRfŠ©›‹Í™É¬‡# }×…UÚ#ÀÞØ¬ ŠЀ"ä0ÈèÑ`Ã? 6|kå!„Š¥ã8vèPžç¡ z½žã8¶@Èu]«|6ߊ26)%cÌNR¶‡´Æ´*û 1Æ*™}é$IªÕê0oÙæp 3›li¯"Žc«ÁZk„µJm" / ¶Ý!¥t(œY–Ù°í¬iU“s-=[Ýkƒ¾Ö£~ö)ÙÞ{SSSÊ)ÛKdø¢#~Úðay¯äªˆ½hrËÚ‘ï^”u0!ƒÐ‰rS1*œ@‚"s0!:e³;ŽM_p:éŒ>6V¨®Ð"ÙcXy@±ÊH XîÚR°vè½}Ñ‹ýòÌw&v>IžrÆ ›Í#ª4Ö®ùÅo]7ï¸I7l.••„ ÅD¼ÞÚ°7Æ…)Ì()$Âiÿô÷ŸÜyéþ#ãßÛ1™=ø ¿Ö"Ú0  (ºÿ¢µ .29t0Ìå9ééÞ«“ÚqUlÝÐùœ_€¢ ‘ç€: 0 Tû!ßË µH!8!> AI‚ h£¿¨™FFÀ ƒ QþLj+”R«j¶ÞÆÆe=ϳE>a*¥¬‹øìﵡ×a(­5cÌzŒ}ß·[UûI’$AX³²ÛíÚY VmâtQö&À ª½'°Ö-Äql­UûÒÖØ¶‰¶–·õMy{(¥†òo#ßI’DQdŸµëÛ-cÂ0AÙ› [âlû£ ÏÊF‚äo؈ŸH:ÝQD7iÌIÛµöR±5‡l7æÞ¢˜É²J.92 TéÀ(g|¼½ãÀ‹ýNøêãWã‡c/çY7WL Ò%…VJ`â(ô[²ÙqrB¤zæíϱm¯-©'+þøÎo­žI¾}çeŒæ³[[µJÙ¹àŬ󎂃1c Œ•Ñ€@² rLâpèÅ©Ÿ¹ªý+7Õð wâ„ÔYˆ™¤ÀØ!hüý§.|æ;³«ý<®²Ù [û¬]°7¼ý T¼¶¡ó9¯Ú¤¢Ñ@1PH(0‘mÊ‹!@iÍñp¢ú@$"1} |C‚ d€2ƒs³úΈŸj!¶—ÅЯkµÊú–Àj!ÄÊ´Z-;+Ð*™Õ9+Kv(‚íÕ<,ü…³:NÛOìƒv5k([9„7¨6k` [@[ul6›Zk«ÓvH¶ÏBl¶¶ý¡†–º]Ä.>L•J’„s>ô¢clW°ÉbV×áÁÃÃÉÄö™†ÑÄŸbü8õˆKA}ºµ|tZä>6ÕA'Ä€¼¸òÊ]!<1(Q,kck[/û~¿Y?öÂÞ"wYÄy:‘õË^y3F ÐFS¥ f’WðªñJãëáØ!žT‹~hÈ lDuk‡¥¾(â<?ñòÎçÙÕÖvx¥c̳]ç @Ø@ Xjt›ƒ—¿7¦HÿÙ'Doà‰cÈhl ƒ Fý¸wdpºç>½,>ù}ôèÔÌé·_¹áðùë€qF @RP¦ÁÀ^ë¼ß²!R ¹ÿз¾û¾Ýè0¡ ;h£¾c0@ÈÑlá?<Ã>SƘ¡RÚ¢ °IRgÇnkµç¼ÛíŽYŸ­•%¥”•«aYŽéÚ±¾Ãem„X1¬£µ Ÿ}ßït:6?Ùª¸ÕT[ då1Re(/Ï š^œ"7¡ƒ‘3×wºqÐè º‹ªhôš†R Æ`Œ&Zé'O‚ï#„›Dî«`*°>ìäÓß{æÐR±ì‹€RŒ6 !´VFª Bh@¾9ñÊä }ò‹>òÊØ†Žç¼ì°*‡¤̱)|J]*?ô{@÷«Áƒÿ·7¼óí^¥Ž4– 7ø»ÊHc„2ˆaê€@ÌëÉY#FüÀDQdÓ”l«çáãŽã «¯V´¬à€Ã0TV;:ÐêÖpt T«Õa×ÚˆÃë‡~]7µ+W*kmWÓÃXõ°ç”Õr°ža;šÐ¾Â&REQ„ªT*Bˆ¡ó™1V…ÖÚ~imk+ŸVËíÅîv„^Û°÷Ð9Ï9·Áoëxÿ¾I#~²ÁžH Ùí’g¿u}Òï{1çÙTÊç®»v¡—ÐV‹õºçœâ–ëœ ý3/>¿WðˆE\*“gÆ÷RÏw’f„\£” „JYhèPâ"T*× %JTNEáŠë$v UJº ß;ÙíTI/ïÎ0×§´ &¨Ô19‚„Ö ƒ—^z (Ñtš3\åbè\Xª -·„Ò˜BëE@mÇC…l‘‰òJÆ(ê9y ‘e7j9¯£,&¢K5>^Ë·LPßãÔ…}µÎõ†¼Áb4NtéËÜñÕ}—ÍsÝØ¯+,U&Æf‚éYOa¨ƒö9GžêˆÿD†©ÂŽãXÃÔ†c•R¡(І)¾Ã9€c+N¡³SŸìRCݲNÃ/ÏÎN²ÁW„ÐÐBäyDZ½°Q[» Uh›ùeEÎfcÙE„6ýØú™mÊ•½8Š"{Wa_ÅF¦miïð>cØœÞÈG³¦ùÐó<´Ômеëºgg†Û°9o¤mÿ(ß®?¡H-T±ƒÖO·Ž]Õײt‰‹^lCîKƒ¥éõ“³™ Q”Äõn¥Òg¬/ΗƊ$´‡¥î®™Je%ÉÆ ’@‚…¤Ö\­‘Ì;e¡ÀEqX{ÄÕÁú™:¥èÍÆ¤Ñ|ÅhIumÐ;ÁDÝNè0vêÉñãÇÁ!ZkÐýª{@ò{X¥%ºuÎÁÛžð.nt¡t¡5ƘV\a5ëÌBo1ÇÈ`!‹z&h/.ìؘš‚N<ÀŒ`@XÉVOïì·ÒBf~ؽb‡31Ë»ÝÕÕÃxñ˜ÛZuþzÓjlSд½÷Ÿ¿ùw¿gÛÌL–”â6V2hÔ8ušÕ±[¶Ÿœ›}­Q+ï‚9T¦óÔ!ÏÁ÷ ÃëhÔ|sÄ?‡: b À# @AÄ~rö#¯kÕYÿs "Ã/íRC|×?ûâá‚èìø #Œ…lø,Åôë bÀöqF^¿€ B {] ò]ÿì‹)¦ÿýÌ·nÆŸýóÚgêü¿ç@`¸Ÿá®Îþ©]ænð×zÄŽEi)‘DîuûŒì1oÐÈÓ=?€A§Lj‡2¡ódÐs£²$þ¢Og´Æ ÏüJØÍ:,ài’jÅ%A©ØÇ(è%‘k_ÿd\Q¯=öîÞá +Ó"®¾ZägÔê5Ú}­6÷7“ófPL__”j.¦s)?<¹e•mŸüÏì^(°{üL®M¸®Fìð±ã>ñdF\‡Brç°yÜôÑ£Œó6ª4 F23¬Šùa´^Bãsýø5à»4±œÕZ ³±êÔByvéÊkÎôWw?õô€ó\:'"4P’+ÞGÌ£åÉþÚ"8ýêô+¼]+üÍ¿y1ëJ?jä™ô\OðÿyI²Æ–-}D–Nœü»¿¿çÝ7\¿en3´1 XºÏa(uW*ß;‰žáÝjcußåË.ŸkÔ¯Å^ØZºÕ0B@ñ¨)ψ#F¼Ž¡È(p°1^¢0¼H FüMYßH–¤¨ÈBˆJˆñ|ü¶ƒ`Œ1v@E<-uÖÌúÑã09>EmÐìôãJ³TÎÆÆBÆXéÊ;²Ì/’Édm{{mLµ€ –¼­QدOÝyaPÚ,/L¯ŸœD.cŽ=zï¬--³ÓN©ÔYY®mít×;픹¡ÂR‰’ÔƒYL IDATDFUʳa8•¦.p„ò㉤7±÷úçwˆ¾Ð˜ i…‚¡R›‚^Ð#Í'^|ñÅS§— ¡ !… ø>ñ\µÂ«;ÖúƒB¶¦Á  À>"Ú(ÝN(¯BZë¢P¬ÆÞb¿54ã4®´ôëA¦m’ò?¹!D&(¸¡S Kåé`ÏþüCÎòB׋I.šÔu”tMžoV÷h‘qPšDeŸA»¥É¡ã'8ùõtƒDªº d#ˆ 8°µuàÚ ÿæ?¿’óJf:˜O&4=-Š‘zĈ#Þ î !Aò¦ßî}íó` ”ãˆéb“b º  )X“Ze@$(Í)@guR"ÈB )S¨×#&b @Üž½10€aW€ÈP¬@qÅ Rp˜…”QH­Ò"¯Ý,à( ”ÆÝ/ ¨!…î' | $sãZ¿Nm Ð^4iÇWÀWU¨ ¿Á,h-5¨»ŽQ(NPç¢]iû¹ã߃©Ý$Jú#"©CH´Sžäy²9o@žBÁ€s`4š›#uO&çî—}¾RBæ%ZùFÕ±ö"€8ÁœPý4Wi,Ü\‘öJÆd2û*1ýˆ#Fü´ÁòÂQޝÄÖkÖJw)!ü”·Àc¸Øœž*®ë2Y–½.´Æ‚ B¨0Ôh ÆÕÒWÂÕŠ¢ÒËH×´¢µÎ)*a(ƒ\'—*–ÊU†€öÁ0„¤RŽóB:¥9™²£GŒ1âÍŽR4Ôy².E—sLc(…:íƒnÊúY:Na³´Ò"îƒ^Œ€* ht<F*DÕ×,\Íx–pB@.€œcÏEf€4å’AêH  ûpZiìé´Zƒ4u‚€#ƒT9nP«§Ó Ç! S0ö„F‚ËÌ¥È<R÷JUi‚B!ωë Üë”8= §!àvh­A!Ð  ðÐ!‚L` ½ú4—€—ŒºZ9*c Îp¨WƒSР\#(¨™NÒÀ„g9h‰K%—PžæÄŒÜ ÈÒtAŠ>8óy« ~.€By‡#ÆHÁ‹yÞé€)„s ³¢‡ ¯ ÞX•fzF…@j®Ó˽3GÖjå½­d GcY&ŒlBÅuhž7ÛÌõlNœâQ¢ €–Àb.VF1vÞr…ópÞàæÄÆaRP¤p¢®?yèès»÷_tøX®!A%m83dT1bĈob!êk&M……%W÷Z…z{ÚlŽ”ñJ)FÅL¸Œ'ÒôlÔ4ƒ^¯Ž3†™­Bœ6Z#Z#ˆIspŸ:®1Æ#Œ–˜%ˆ¨Ë¹ôŒ*ŒÀh¤ë9<ç!‚\f”‚Bki¤²(@iPBâ8A$2¦’c§n@Ü7¸`¼(¨ö»k`$âúXˆ¾–šGd=ÐÂk8y±±zw ªOpC‚'¥ééžþûZ_­-´&È ìùZhÎ òj ¡ó¹‚Aô‘ãæMT¡@kpˆãº¼“çƒ6´IÙ'ñVŸÆUfFÈ ×%¾Ê´”P”LAÖ¦qŒÁçN|W IˆQZ‚ÁÔ‰ÀPÅÂJ{7fJ€¾Àyè¸ë¯LÄÿâ(3û Ò3Du1bĈ£s£•a€ÐFk®uþƸ½L&Àƒ`Ì=õK¿èLn9‘qƒºY:~ÿ=½•uÕn1“x‚‹|øã\dD;=èNÍ_ðêeûÛ/[uÐÜâéSÏþÃÔâ²—º4çÓºèo› ®¹ÆÌŽç¥ Þ‡šƒì[w³#‹Ò-m+ÚÇÁñ‘ž!x øñ§™ü毯,´Ëßø‹9'\-œ“Pžú­ntVvÿË_[®Ìø¿þ-ë·èDùâÿá_~·\*ŒÛÈe:O–Äw/}÷Hœ«|£ç@!c Û7ç í)µ,4 è”zçˆ ×‰MU…‚ÐóKœçq!€‚ ‘€à!øB®8Ph)4@ÐÓÄŸƒDÊ„€J`¤,ú €ãƒsî;2œ¸¦¯¤Ö!w¦6FXk Ædã0­ô›ÌI:7B!£h ˜ƒ)ÃJa©´.ê'y¿àªÑ F˜õO“8bqkZAäbýD!` "@—‘Ó7™D0¡ZˆjF™RXçÎÊÖžŸB›F”¹˜;\Më$2bĈoM”Òˆ3ÂÔÏy Þ°‘wnˆ àƒ–€Œ&uü$ðf cõ•Sî#ílçv6·séÈÑ~Aú°¶ Wb15¤Ð0 9=¿¸ãßøz*ÖC§R}ñ»tÇE‡·ï{m±_Mó* .é ^j[…\ö²îÜÃ,S¯ýžëÆn© ¸áFƒBtÎÀqYà*“b¤ËåâÀÛ—ú+ º hJ¹Ç˜(½íêµ8»í61¡D˜£„ŒrºÞIÁiC;àùÔ–r~®qôD³PË1¢€ÑŒŒÖ¶·-hºQ6 !Ø\¤©`9˜ÔÖÐg 45ê‚Ȥ~EE/Ó"ÏP´Ä˜„ÄÏQƒ#Ï`DA L.™¬¬xUÈ@ö^§ÈU q4ÉUÞôâÊ9÷“ Xû-û„ÈxªðÀÍ OŒ1bĈŸ*h*œ´ã+QøD‘E–ô‡ÝMJ𔕠„Î nc*Òƒ¸j£òšXÛ•,öÌÃ?œÉI©®=¤{/0Vª|Ñów»Þü|½3XÌE_âjPWJVÙ®úé{'SõŠ‘¹¡ÐÀ0¸=Êæñ,>ƒ£1iè`|Ð9 º€x»YÖéCa ­Ÿˆ¶n_+Ï&I¤ $¯õwíB­e! *P“õRc"IR ~0†ÓlÜl½ßk÷Š­{›òœs—Ñž÷œ"Æ06R1Æ”Ê\€ ¶lÌ[Æ‹\7‚rŒ!²’sì'uè¸Z*ùµ“Ð[cÝ Z1¹'ôƒIHM¶Ò$…£ž(€®¤-’½Õ D%m°8yÞ:·Ì#aõ¸ÏOei P‘‹ÈMºƒ1bĈ·(ÜG’„ÉO úGÀ€8Ñ—'›4 ÀH0>€˜( € ÒZvV: «”+Õ£ F·+m‘  2'kÈͳ3Ý´ ž(åý$"sE¶&hý…%pº’wÁ@†jK¾JMV漟EwPôV ’âzUç"ëuiX’:A(Z:Ž¢Y~é•ÙòƒÓ™:‚TeÿUy$gjáRtŠ»U­{„x°„Œ1‚ІKl(bÀp¥eX) x÷9~iW–·Šþ ðùìpñ>w~«ÄšÉñÕÅò3«Ÿ8Þ)Jn}¼Ð]‘Ÿ“2SÉÉlùøä¼ÿ 쿤2;èY.DV^]*¥ýªbV:7VÆæB¯RåírouîôñJ§9~…²s 0•D'öèïþoÿæ÷>NKžë(BånÖ0‰#FŒxk¢•dØãݶSùóËü>FµDu¸G›²¾K•‚\@AŒ™ë¢êÚráÒ XåHµ®{ßéGÒÙ?ÜåUåÒb½Q!ŒÆúˆùIr誫ۓ1l™ŸÑz¦\©¥Ý•>ðts)ÜZÞÆM94†ã5eQ —ùeÇcøÕ+ÞÞ¹ï;=;ñ¡“ëY®H‚uš°Ú˜ÌФW ½ðÔÌ ï<?³âô˜·å½åûï\™Ÿ¬•ý1e„é¬r?Äz‘§KŒŸ†´òü88m0KŸ¢¯Ï²Çc’ۉߘP½A-Ïø2`Œ½)‡0ÑŒ^{Üyî¿öÚõ‰ÉÕm¬^÷η–<÷ É”p‰æKõKõmIñõlnnßÎÒ;œ¬¼~ •âE´¢Z„I‚yÞ»±þÞ}o¯FU¤Ò è4&UmòL®K¾3•½sî§P0dzÁxMäaŒê€GŒ1âÍ@ˆ‚ÇhwŽI€\"¢fs:a9(TH”Lêh¬E¾<>Ó](O®m_È”wâèN#.&°4=Ýî6#‚¸çA@Ç•—qD&ùÕ}—­Íw=YŸ~Q›âøËo“‚ÐJ7ÏZ„”c§9óµ_mœšÜšTòÒ_úÅݯ}ñÇÚK'zÑ–Ó Éj‹DnÁS‘#O¨}W¢—n>5qÅeý3+pâpiË\&HbL ƒ¡”d¡K¢È×W&äå—-z~qô˜–`ƒÓ¯ßHiClò³1†`¬7z΀P08Ï„(:‰ËŒªÀƒC7¾´úÀ%—öw\(žûn«µ’ Üú¤ 2o&|%Ù>¹ãºÿ¢Q_j® µv5vˆÚìrYgI:µKƒö „2HüÑxð#FŒx3@\GƒçT¢^3âÒ04Ùæ´"&¨Œ©Ca éZšª“«—\ãFº›êî ùö½c»íÕI/Ä$h¹L+HzÝÈ脺µÕå1Jûm'•ŸýFZLièúÞµý"3‘,̸ÁeàUƒ{Ú9é‹hþŽ£'ï¿DË)7ô÷îš©W>pçןY\]£ œqI€Ø)$æòä¡ã]WŸ~ù©÷\yåãÿé¡T«­Š/$€ÜÂTå¬àÛ/(ÿO¸Î‘)û‚¯—Ÿx ^8N!0°Á$_  A# Xré;¡+”"©68PÏugDá(?ÍL¢¤ãxSMÿ^ÚÝ£NÅ[ë]P.ø *­keˆ{YOƒÆï{ÿÏúc&1Ku"2§Æ××N(=S{u™w4?ÞhÈþÚTº˜&^cæ¦Ù=å²Ü¿Ž…/ƒ:w–ÆM¾”n`$AÔ¡D›4ÍcÄO,Ãñïv|=Ø)÷Ýn·\.€oËí†S¶ðYa¥Ôpý?)%!!4|õ¢(cœsÏó´ÖcÎ9¥c¬”âœû¾išAI’„áæôùûÐZÛMJ)ÇÎ9!d£çp>„Œ1ÈóÜó¼³9ÃQ–eöÐFü¨! ‘¡@h.B'”‹´‡a“ ·§µTJÝfQ@‘ØóÄ·°¢«q47¿µ·ïòÖ™Õo{Ú×*Z1é,6AÞᎳ„,ë숣¥2>OcDÖ׈´1Xß²ì‡ h­ÕÐ Brq»QXö„ú 5¥€6Ä$Aj°íÌá½ÝVL‚3nù Nñ<'ÈØ_FÎyc¬ÉÀõ(2ƒz5Š¢…|ò0]‹²^üÜóùÜe'Ÿ»¼·6‰Éæ¤äxË`Ud¨µöOüêêª1†1Öï÷­ygÿ”GQäyžã8¡$I¬^þ`X+'ÖÈN’Ä÷}­õPÀ’$ét:”R»«ÄV}Ûí6BÈ÷}ιU¾ Ös¾ï‡a8 <ÏÛÄýØ“±?>Bè.§i*„ð<!Ôn·í÷þxïQFl"’¾bØq⶘Ë)Å`˜än‘9Íc{@Õ‚˜kÒ/„ÁRâAÒÖd}" ¢vQÔÉ„½žô«ë‘Wî­­U‚±f®/óÉ"w 9 äÄä–3”:Õ àÌõ°L· b&tD‘ÐŒºÔõõ10 ”vYÒ>³ŒŠHjgœ°<6· ²HI¨~R,ÓaN¤eˆha!êQÆ¢ô¶š•bfÂï¯gª¿}£ç°i,UÏà6øPM6g ‰w_È>ôah&­ÿtç‹­•±°¼ ÒÌ\)‹x1C¼õL¬ŠQLŒÑÝ{Ä ÉÏ,…­•šÔõ4Â\Kerç‰û¶}ïá=KÇ·ãÏ_þžk*+Rw7kÿ#ÞJØ?îJ)Üýæ7¿yÅW@ÇÖG1N’äsŸûÜ\pâÄ Œq†Ö0ýÁ^cüÌ3ϼóïܹsçõ×_Žã´Z-X__ðR©E±}ûö[n¹Åq!ÄÞ½{o½õÖjµ §Nrçǘ„¥”²rÛëõn»í¶ƒÚ°ôf­¶vE‘e¼© :ÆØ©S§ Z­Þzë­{÷îYÀo˜Þ‰ÕU”yÊt½x½1»²e÷juÛß×·=PÙòÄ Mš«ÁˆbƘFìºòñ­W܃Üe¥Æ„¨·;•^{ëÄ…ÿw©ñòØ–#ÕíOz½¹<'ò'âi{a ~y‹NiQŒEìa:;U ªµ”Zcǃ•ÐãV(Ž=—@‘ðNoÐnBP@* 4ÈÝ2Ö9n*W! ‚ö«a¾ïºÕür¸¼¦}üÿaïÍÃì¬Ê|ÑwMß¼§Ú5©ÊœL€¼mDÅV[±mq¸M?J·}ñôÜ}E´ïíVÒ\õŠ€âp´[ AH2'•JªRÓž¿qM÷EvsN'ôOîUšý{xx*»Ö^ßZ«ªöo½ïû{ß÷WhÆp¶À=`±ã“&‚tbÉZgãù.ªõÿõè°>GB ÂB2Bµî·lš…µ$à 8ú‡wf4-Oq£gŠSf«´¬•À¤©—Ð4«ôA%÷ÆÖ=SЦ¦.<]Â^µh+œBÆùl´Ç6l0L$R)åû¾ã8ÅbqllLJiì-3æWSÛÞyç‹-úÉO~ÂCU*•®®®$Iº»» Š"×uÇBñW±X4Ï_«šb¶œÏç-Z´zõj#+ûÂáÿ.xà‘‘‘Í›7¿Ìü­V+s,q—J¥¶Ï ƒÿ zX)%E&eƒØ³¦—Ï‚‚YJ”&­ 1{^íD7Fš…J æÔ1P¥°( ˆë-üÀú…+·çËǨ%Íá¹qgv¾!­ /.õhÎ}·tdáú&E¶å51N(qNìúßD-S…³TH­1$m'XšMM'I@¯¬² \ LÚª?izs3 la`-/œ<Ú\[yÇyÈ*5ÂYoâ`¼ó¹ÕÛw²Ù° ö‰3:‡³FÀ˜ô¨´Ê±IÂú§.ûOP„…wýE#*lpUâä(Ÿ {¨U;Ö¢Ÿ•A6V°‡Eð£Þ¥¿pPé—? ÅeM:¹A!Kû1šw½¥ÌO¡0‡â®¤Á´ÜcYDG#4¥>›:‘^é01à0 s¹œ Apã7þÎïüŽ¡@Û¶M¦ç¼ÙlNMM@Û#Úl6}ßÿÕÔ¶‡~Ë[Þ"¥tGJÙÕÕEQûÐN¤iµZÆl;ŸÛ3˜1¿´s(¥ozÓ›ÞøÆ7ÀÙLK) ƒ~ýë_ß´iÓ¦M›^& ©}×uBµZ­CÀÿa §)ËYV)W©rÒðfâxŽpmŒä„å4åõÌ3ÏÜqÇó7#¥½óÎ;MþÌßýÝß­]»Ö,ؘ•F®Õßߟ$‰qü~úÓŸ^µjÕyç·víÚ£Gš¨ç=÷Ü3<<¼qãÆ‡~XJ¹hÑ¢ŸýìgK—.}÷»ßmýo|cÁ‚‹/~ï{ß Q™õ|ík_[¾|ùèè¨yÝÄ_—-[¶uëÖ·¿ýí ,X¿~}Em‘³¡Æ$I(¥wß}wk×®5žƒ <÷Üs7ÞxãÈÈȆ Z­V–eþð‡¯ºê*“H-¥|ÛÛÞö®w½ËLõå/ùÜsϻ馛@k­µ^¾|ùO<±zõên¸á/þâ/yä‘Ï|æ3ëׯÿêW¿Úh4àþûï_¸páèèèG?úQsP†kÿàþàüóÏ¿üòË>ÜaßßdNxj l+ï:Ã’Hé(K£&µ8¥4ÕÊð)å£(+éT*ÞÙÂˬ…½MQÅã:‘ôlÏÙGu³)`ÕP޶íæ¡å\2𢯙NQ¡5߯EA[±oz5”dB*KðÁDBlïŽi3ÑC"È5¢²B] ±‰Êb›Y 3©Sˆ­Ju_ÄSD$@%' æÊ¤÷P(œJ´„ØÚæƒ år‘cÅ@ʬF:„rðRhœñú¬]o‘îÓ¤eÓ˜Èxé–Î#^íQ`9ŽÓ0Õ³2>)X]k²ÊÅV=jfÅ£,x²»÷XsÆîOHÏ1;eî Öy)-É´pJ6"ˆZ¾Î{µ°>Ó¨Ï8öýžTvR_0Ù)/ÍôugóæÍ_øÂ´ÖÆnÛºuëM7ÝtÝu×ÍÌÌüÃ?üƒÉ/úÁ~ðÍo~s||<‚ÑÑQÛ¶MŽçž{îÖ[o}úé§GGG—/_þÅ/~ñ]ïzWÏ<óÌí·ß^­V]×íééÙ°aÃe—]f¢ËZkcLÛ¶}Ûm·}å+_¹å–[ÞùÎwBúúú8çæ»ÍfS)E)5ïjKÆÇÇ=Ïó}ÿþûïÿË¿üËÇ—ËÿÚJå{ßûÞïýÞïíÙ³§¯¯RŠò}ÿæ›o¾ï¾û6nÜØl6>üGôG{öìA­]»ö®»îºùæ›kµÚÄÄÄÍ7ß¼k×®áááåË—ãßxó›ßl²{o¸á†­[·–Ëå+®¸âÿø?ûÙÏrÎM.2œ4:o¼ñÆ,Ëî¸ãÓÍuÝ7¿ùÍÛ·o/‹—^zéÇ?þñÏ~ö³—\rÉ]wÝ•e™ù)<òÈ#_þò—¥”Ï>ûìÇ?þñ^x¡\./[¶ìsŸûÜûÞ÷>£G{ï{ßûÐC­Y³î¿ÿþn¸á¯þꯌËýÉ'Ÿüà?¸wïÞîîî… ~ä#ÁûÛß¾çž{ªÕªbtt´T*™øÂ¯á·­ƒ~Ad)" #šh†©$‚'¾ !$¥$(Ñ@8Â\ F©M €•RZK”ëO‘– áÔ­jrLd¾àµ2Œ‰ÖZªLk ˆ%™ë3LšRÊ,U”HËŸ"k´Ï/IAAc‚½ Ç4ð$Ê’ˆ{§é½¦   …–¢ ¹À1 ßrdìGˆ$2Á2Qà@5YAàP' ZZiìG5 ÈÅŽTâÌJŸµK%E ‚´â"KTW~t~fÜrw]Ϻ(DR¾d0x ð"ÎRÇ®l¾¼ðîÎPg¶q¬Üše}e¥â\`¼± '=º‰ótÖÇY…ت•N ´*qΩŒŒ¤ý]ƒТ¥¬9z¶ÖßÁ+ †ÿÚªZcä]vÙeJ©íÛ·#„vìØqâĉ .¸€âû¾eYŒ±$I|ðÁ믿>‚(Š Y …0 ïºë®M›6ŽŽÀu×]wÿý÷çr9„Ðßÿýßà‚€Rúæ7¿ùóŸÿ¼)Œ1BˆÂÄ2MêQ¹\N’äøñãí4_“L)5âç¶Î«\.gYÇñÌÌÌðð°¹Fçüþûï¿úê«.\èû¾‘(sÎ7lذnÝ:ÈårŸþô§/¼ðBιëºï|ç;ï»ï>(‹wÞyç»Þõ®‘‘ŒñÕW_ýµ¯}íÅï¿ãï(—ËJ©k®¹fË–- ”ò<諒?I6!$Š¢ë¯¿¾X, !®¹æšçŸ¾Õj½á oBìÛ·vïÞ]­V/¾øbBÈW¾ò•k¯½Öìúo|ãøCãŠàœ¿æ5¯Y¾|9h­JN οúÕ¯nÞ¼Ù\>Þóž÷lٲŤMßwß}o{ÛÛ€ò¾÷½ïWËÏîàÿDYS@Œp†1j1ËFR•ÅÌË¥¶—Ú®²lL%àðÍ߯Р5Šp%•’óV¥'Kl„4ÁϺ¢° @Ú…*ÁŽVDJ®5GH"„X¼ÚLWk¾·èt4MºãØ–Ú²=?N8b¡"•0Jê³¥úL”ºÔ_=ÝúU6.ÂXĶ)ˆ €$4pøi* žÒq¨ Ì¡n²ªÕ-ÛJj‡ÓÖ$è ÌVéßÏ¢ ¤d\&Ô“Ä•ýKÕ·”>øŸK7Ývà¿ãù÷Üþøåo9â÷æE¸’^¯k6š¼Ìs˃¾[ôÃ4ö‰ÑMß^÷[÷­ÚüȪ×=°âuwœûà±Ä¶¼ÂЮ‹ßô‹ ×n[òš\òoxþg›+õŽ­õwðŠC;­¶\ÛÓÓ³jÕª'žx¶nݺråÊ‘‘¥Ôüü¼‘ÝAðè£.[¶ c‹/6Nlß÷wîܹhÑ"CE+V¬8v옔²Ñh<ýôÓ½½½æ£lllß¾}mµù¿aÖ4M}ߟ5)ÈI’ „ŒÃÙu]ÃmmëÍ”Ýp]×(°^ûÚ×¾ð ·ß~{­V³,«Ùl2Æžzê©«®ºªÕjqΓ$!„4+V´'Ù¶mÛ’%KÌíahhèèÑ£&·xÛ¶mF¦µÞ¸qãîÝ»cœóžžÛ¶Í-Á²¬ùùy³þ8ŽBm¿ºeYãþþ~ß÷9çãõë×OMMQJ …Âøøx.—ËçóÆ«Ì9â‰'V®\iVõÔSOuuu ¥ÔúõëwïÞ¦iEã+¯¼ÒdyEQd²¿šÍ¦ÙÈ–-[Î9瓚éûþ3Ï“gŒQqÝRê8ë¦9©î¡ÐÉDz•¢¾5ŠbãŸÜ°aÃÎ;ƶmÛ.¾øbSJÉ÷ý™™™žžcu !L©ÈvÝã©©©ûî»ïÉ'Ÿl4¥RiãÆ„|>']ÜQuuuÕëu“Ý»fÍšñññ®®®8ާ§§€R:88h³===sssJ)Ã7iššå•“!›'N˜«Ã9çœsäÈ‘·¾õ­ƒƒƒ_üâû·Ò4=qâD.—SÆËȧµÖÍfÓúç>÷¹‡~¸··7 ÃK/½Ô,Ò¶í{î¹gË–-RÊ(ŠŒü[JÙjµ!žç™[³ ÆØŠ+L(·T*ýâ¿0!êz½Þl6MÖÖìììÀÀœŒ1›ÊÌ]tÑc=ö|`ëÖ­6l0&9çÿôOÿ´gÏžýû÷#„^÷º×i­=Ïs]wÏž=æäMeì8Žs¹\†Žã8Žó™Ï|æ;ßùN¡PȲìÚk¯B$IR,ëÞœÆèèh§ôo,<Œ!Ô¢®DÊ•ÄÄF6&ŒùAUJ- e¶A`Å (b; ©cl Êl,•ÙH:‰ð@ î+Z^ìå3!í¨ÕM¨Ô B›Û¶PR .‘|2åM®ûl—º…9®žä˜ETÚYêÖ¦m­±jvˆ¤tÊõ§Mâ ´T õ0UH¦€ ø¯Æ "d[€Spu«F :]^&攪g‘8åKÀ1œa­ì³—†”žÚ À*5g¡ÔcÙ®'¬d=Bg’ 5ø|¨$¬?7<^­Ùa†ýž$®‰Lör}”8u8Íf¦‡YÁòŠ]yW+Ìy*èAÛé΢î(²71É’n¥ŠÔêð«„­µIé¡”*½êª«>úÑÞ}÷Ýßýîwï¼óÎ$I 7OOO÷ööÀÌÌŒçy”Ò0 ¥”†\µÖW]uÕ'>ñ BH½^Ïår†lÛ^´hQš¦ŽãDQdrв,ûÚ×¾6<<œ$‰±­[­V³Ù4V±D Ûðœçy/­mR¤ …B¡P0+ìééyúé§¿ûÝï¾å-oéëëÛ¼y³ã8år¹Ý!499i|ÝæZ@)ýÓ?ýÓ}ìc†t)owÛm·ýÉŸü‰±ÑM©/ÏóŒ¨ÊÐgš¦J©0 Bÿò/ÿbÛ¶"Žc&„$Ib²»»Û(²,«×ëžçyžÇñW\ññ\ký£ý蓟ü$c¬ÕjaŒÿðÿðÖ[o5ê3sÕ€6…›p;çܼnŒl×u?ñ‰O|ìc3 *L5oÛ¶«Õj–e¾ï›$±4M;ìû ž¶˜UuºEA¤A˜%²ì¨™S‚Œj‹*`­µ¦ c"à1PZÉT ®UDUÉó\ZD ×q–…MEqmG© 4PÐHJ!U„‚¢¹ÞÒð f;õÙî¨ZtŽY.…¥¶Ê(°iËtª¦kÓ5O·jæ÷'Z‹¨€ ®KÝB¸¬CÚ(”«nnèļ߆¹¸«'“­‹¸|ÁÏ©}ˆÒtÆ-†qtfçvÖØ/£ÔÑhH8¸To¼$ñºöwé\tÁ ÏïÙù¬ï¼óž}öÙ0 Ý&IÒßßoYVÇÆ ^³fÍÏþs“औjk¼ÇÆÆ¶oßn¦ò—qA›ƒ2ëyÞìì¬1Iãý¥u©fggMDÖ÷ý¶oÛöèè¨1ë]×½ì²ËŽ?þýïrròòË/7gxÁlݺ•1fꎀֺÑh,\¸0 C­µ©çl²›L7$ÆØÀÀÀã?~ûí·Û¶mØ×݆ öìÙ„C‡!„Ú”:øMƒ››ðüÙ®®(ðü¸§¦ 9 lбРêÅîf±Üð¼ µ[”f'ö®µV£U"'3ºé{­\ –žR£¶’¼gz¢wâÅ4( 4͈’ ¶áúпò?‡,;6ê“0;òƠGs6-ך¤ÐCFWwÊ?·(i»è…§CîÔyºý}ùM×X\ן~Ôš›)€j€H4G‹b?¾þú.©†î¹ç DŒyð¶ßa}G1Œ .›AG7&E¿|ªÏ ƒwfáY‹Gµ†ŽC@p\$ëOìX÷Ïÿ¸àÁ;†ü|•áú;Þ/­8¢ê14@xT‡Ags›•¬«T]±nGo÷Ü ŒLíºJd <ãuí–²(‡pb¾æµ‡´ªlÿq゚-ó;Ü9\Òó ÏÖú;xeÁ$Ê1)4 ¥ûó?ÿóU«VïåKuRA¼ûÝïþ¾0;; >ú¨)J…1þЇ>ôÀ»å–[î¿ÿ~©5œ755eîƘ¾í¶Û¾õ­o=ÿüóæ‰fÎùŸýÙŸ=øàƒ;vì€\.gÄÌŒ±z½nfgg.\˜e™±¿á%)UY–-Z´¨Ñh˜í›g™57îîn3Ãàà ïû_úÒ—Î9çœr¹¬µ¶mûw÷w~øá;wšŸ‹±°}ߟœœ4…ÆŒV΄̵n¿ýöGyä‰'ž0¡n`ŒY–õú׿þG?úÑää$<öØcm½ƒß@,_£K¢¾‘ù®ž9ÛÕº¦4§È&,ÒZ§‘ߘ™=pîø¶Íû¿v×OÞ4ºdn`$+\†Š:ËQ„KÝñèâ&¯,=´}d÷Ï¢¹Þ^ohAêçb–®µÀ )B˜Rìù¤Pb·ïèó«ö>Û…­ƒÃK¦óî âåþEFå\yÿЪǘ3µçÉ{¶Æuêç]ó•Ó­¿Q9ØÓ7946OiK&!‚,JÜxýÌ®ç˳]ÝUÀŒXý¸ZÌÄ—oηæO«²>{Bˆ%ÜÌúàÿqèïo…ʤ`ä Ä@!Z#Bê´å[9Â.H¤y D2‡j­EœBOB'6¾ÿ–_„Yã›ßZ˜ RŠÈq,¨œžýóO|Úβ¡eöŸ~du†b žÅÑWûÄÁ G*Èa630t¬otïî_\h7iñ¾n¹lÝ3'&arïe‚Ƨ\N‘¯EòÑ¿’þ PTc H¢³öîà7Æœe™iécŒ9ÏóFmæ6ŒbFšœWóz»A¯‰Y]’Éß=ÝMU 3 í)Ͳ̘†íÇ9Žcܹp²Ú"œÔ‘™!£U6ü×l6=Ï3ÓÎÍ͵#ÐÆm²{Û#b+Ë2oµZžçß» »šv®ëRJAi.fÂjµZ,8I“deNÉMàÜ÷}³ÓEÊìôß•B„ah|Îíí˜$Œq«Õ²,Ë„íÛ+7“˜3E6M¥L(Á(´ÏÂïGÿ4¤)Dè?ÿÝŸi­ `%\&ø4"#šŸÓaŸNùú+ÔœYzdÏÂTÚs¢(sŒÇy!¢UD¹VK¯½ú¿D-tð—ç ±„Ú“k׿•ú/¶]J‚ªN)uèâ+·‰ÈÛ»} òPÇSI„<Ë•1\ù­ƒ£Oý| —ÁhÃ¥ûƘ=úÖ†Œ¨€Ñ¥/ô.˜Ø÷ôUóuÛÉUYÚuîæoŸšÜw©B ÈŒH[9?ÿ«°»2KÿñÍ.oK¼î¯ßK“z  N¿[»ám©9!V}ñ GÁ-y¼xóì=0“~ïÞà)æX¤Úø­·N3ßþÞCåZføQÆXcÌ‘L”æ ¨d±Ãm|ûŸÁß|¶d'åÔç(ågï·™» fˆøˆâqSð–“-Ím®ŽÓ—„S " ­B(ÅY–ú›e™V/þ#„y†ƒÁóù¼1FÕ²,Ïó ´ýÀ`„Ó&  &¡ˆb<ɧ„a_)¥áE£+¶,ËP—=aŒ*û¥‹Ì²Ì<×ä/‚A™går9c^k­Û5¥Íâ nVhJoËØXœA»Í¢Q}sÎ̈́ƧÝn¼hZ*•ÌH¥T»’ xÃI ´ïûÕjÕqŠ~©O˜sÞjµŒÍ,£}wñ<ÏHÞÌ©šµµ-Ú6§šs0ïŠãØØåŒ1£3òéÿµßŽþ¿B–`ža%‰VD«+ €È,%±Ò™‚‘„2D "@PÑ*¥TL3, ©°Î•ŠÅâ\¹§â{Ô‚.Â0`&ù‚¨9'³ µÖ€´eYF¯'%P%±JJîº6¡ !µld»JI*¥PZ1¥O™ç¦)&ÂRjE)Jˆ9ÄÒécA‡ç¬ïÒR¸L€°Î»€†óÝõiÓ€‰,O§’ » %ÞZiêJ%À©äglݽv„ˆ"¤5p ° 8ૌ$'âU—V¼îÖÑC9ˆz €"¥4H)¹H-‹!Lk©Êâø™RáLJíBKG0EŽÒ4B¹žèWiÝÚÁ`›É|m"£¦G/œôÜšBÍÿúÇ|’Mªz½nŠMšñmCÖÐáËXÀ„f³i¼ÊÆ=>77'ã¾F¥lú†S Òh£Ò4m»¯ÀuÝvö°©[‰2ãM› vÕæFN…16w‹$I„&ôk$Äí=?|š¦FÃEÇÆ´ób«Õj_VÚ}Žóù¼9ÀR©d’˜³,3ŒkffŒA@ ÃÐŒŒ¢È¸ jµšïûæôÚ‚mãÍn÷ŸPJ™Õš¼dc(› ‚‘yÿÚ[&wð2œii!`á¶/Dk‰Ì¢\Ù@§™{ #®¹«%ê]² I/®.†t±–.VúÌǪ5T›(&Mî:L§e!¨]¨¤xZk‰ùƒUZkB±ãXBrÐ4B¿ØOŵ”Òi9R *d†°ÒŠj’{–­”Œ´â”"¥Ê*³œ+ùôÏØÚMI¡€d–8ÎÜ’•dïŽtv’!+×ê%¼àˆãCj@ÚÞ,usj±é)'ƒ__!ÆeZÉZ pÇñ™U€(Z¼çªë–w=úhùžï+È*­4›MË¢¶Í8OBZ®ˆÌ&,RZZj¥JØ ±ް6‰e–E5œqû§þcÃx_øÖ¸ ßzi ÕаÖÚ´&4e=ŒƒÚ|î ÌÄM%ý2uÛ™µ–e™Ü¤¾¾>³c;º®küÀÆPn ¸Lðزù|Þ0´¢]øÉ˜¹¦«„RÊkÇíæ‰†ÏÚ×c˜RJýÒø®É J’Äu]ótc ›lŸZ­f¶éy^ûæaNÉl@~þX)¸“a-Áö¨’TJ–uôè‘ó—/e%„`LžÑÚ•º i­@»%J1BH¦2 #K+ŠQºÓ´ƒÿ& h’eµ÷ÒòI†Q̺Ö:Š"“@ìû¾!0cÀµÃœ/¹V«"9%cFÖdØË¨²»l0uIDATã86)­³³³===&¿ö¥Ó¶C¡Qi­ µ;ÏsÖ|RJ3&i;¨l¸Ê[6±^³Yc¯»®k:/™ýš@¬q§Â39¸pòFblkã30acs¥0k6¹Rf*ó.ó™ˆzé½ÄúfæbaîæõöÏ¢÷c©ÃÉÊ*`¢ÑÆÔ®T*½½½¦G§Öo,Œ×k@Xi- D2UÅ¢µÈ©ÖÕ}=½Ï÷¯zavvYíøXRš›‘Ö¸ÈÜf£¿äO¯ØPÃ…ŸR? ì‘Ê¡‘¹¹£¶hx% ¶+)•”„ZZk.RŒ¿ØÂKb„Lë3jžI£:$ÒÈUJaªµ"ˆÄ m )B4B˜"ÄÆÇ'€Q`˜·rn~úø~lYÁÿýЛ¯.M<ÛuñE­ïÿóx+ê-tõrÑ€8[QL(Òk/ÚÑ»d@V' ûvª°€MœY;ѳØkLƒ”`[®mµ’LãÙáa}ñÅAöÿóN$•á`ÌmÍKÒ…”Ê0PºcÇŽÕcÃ&ÞC)©², € ò…¬`l!„ ò¤äZYŒ±D…J †-L RÂi‚¼‘ËåLy CZÆ:4fh¡Ph+{ì¨]e©ímP MšH'œŒh¾ÌsbÈè§ÚTjŒK˲zzzŒ˜ÈØÁ† ' 2ÃI’1‘ !m¾i7Pj_Â0l¶Û‘c³qcÔš7šù}ÿ?é¡à%­™LÄ×”¼hŸ@ûéæ cmk­ÍÛõ·Ûå>Œ¡lŒlóÁ5åGÌ¥Ái¯ñ@´•kms©T2>v)eooo›¡;•°~c¡5×À ­¹Ö¦¾ ÆóÔb,Ñ’É4çæ’žÞ…¾iïÝQ²¥Gý&e,ŒÁ"È÷``0ya÷lkæ?eÐ*ü W˜õÙyJ–ü¾ÿ¦¢a­µIÕüEQ!B!)•@øÅ (h"„bž#â&¥i–R`MR­ˆ à•§»vî­ ¥2L¥®!æi&ìvÒKÝ _«²¦Ø÷‚çy®Ä‰TÐŒ·šyËQyzýøãkªz¦ø«Çº,>º`™÷O_-«3tÊž5t–q'W€æ±#ZÖÏÝ8¶á‚.ÛÝw÷§ëI\°†“ÖÜ>à‹Ý¹¼9‰'„"¨×ëFMkEA‚0ÆÛR¥™v® Q†ó@”‚Ž(£ƒ ó±n¾fŒÙ¶mè³í#5vg{¼ìû¾‰›H¤)×l¥m2»ö”0¾eãO6R#ã§5E3LœÕ˜ª¦P³±öÚ÷3³IRj§'µ³µÝQØ$4J3q\ιÉkjÛ£í]Æ(/ RJ#™6™Wí³¡aã0Ï5IÏæÆ`–gôSæ¬Ì­^ÒD\×5éÂæ•vNf›afŒqò›ÉBf6ã67GÝVrµóªÍ´öý…Ò\k¡4WZj€B¶i£â9)h¾ogß9?@têÐÖ<Ö­diN'‹ŠA9ßUuJÛ'÷nˆšÁ‰Ã=s6÷Ö.ÐdÖèo+õ(¥½˜•€1Ö •Z˶:^k Ôü*"Bĸx4,¹@Dˆãôà‘q‚Br:ŠT¡/j52й=[íeçM=ýØqZŽ5[=‘í µ(¶•Hã"LÍŽ%q4¾ðÄO³gþ»72dmÜ4q¦çö²°²i€“žm¥œ®!‰SIÄ&Lá\QÃÆË÷V¥ø/w­‚VY#{Ü$ŽÓ¯¢,õ'^È‹ÿ×oþ¼ ~k @Ž Å¼9—㬂ÊaŶœ:ÄkâÓˆÐòêÌf'æhZ:MR®Ôf…OV„pjaj‚pØuNÌ3—Z2$m„;ó«Œ0P0(@€@6×MÀKnnŽå´¿øwŽÚê\õ¯¶Gþ[PLÛzq¼ȵݗ®§=¡ÍlóÏöÌ‘—>¢= öTí‘Bˆ™°ý¢c9fñÐ"„P`QëÅÝ©ÿaÙækè*v½ø-óÝö´fýÿvUíí·ßÛ>™6ÚSµFµ^:ÀµO²ìÉ‘ùyœYŸ·þ—aIEJ$…õ&£;L%§î7 D¯åWd”S"oçODÉ2¯»Z¯ûX;*‹ òÖè2[¡Õ[~Öçê(u”FZ¹éœô«•ñs6ájÅ }'‹8ö:•ç³ïúÃC]€ós­J_¹+lÕ›qE©n;WmÌç»Tõ‘ Ð‡æ—!o[n`úÄxÁ=…~AÍNŠR>bš“,ÈÇA7·½^#Ö„‹§j­oýèA®3ÔÝ *'Ã‚Ê rQ)ÎÄOžž|tÛæXªR½…yŸÆœ€Ì’d0ï§%+à‚êùY^î?AÐåEOé& ‘VH)Ð >mløì© ³^pkª)uº+yk䉆¤ àqê"RäYá$ø„à’ã—Ãù¬ÔçÅáÈüDóï?|ÓMÌÏeÈ_ŒRÑ×-™ö“ùy–sÈö­¨N,êÂ0íè òø(Š](FÑ Ëur9M+ yÜ‘rQ ÜbŒcm8ã†tÐA¯*Xš" ÁÂZ·²<-‚ÎÒ(eäÔNŠòŒgš;$+£$ƱCbæé’]˜°Q7%Mw€LÇwúýdGÉ ™6EVKc³€ÉHıëôº|‘çnñ™0ö¯Yî®E-Ï£]á”Åð9¹^ÞHc –Óto­P?«§”´d˜§wœJ¬æZs”uQTÃJÑz™b%ŽæsµÉXbkïáñŸlyjöØQÔW(u—+ãsAWAgŠGÒ¶ÛA¨]$‘ízÂåŒÓ¸éÕ«®ÆÚLNœÈ|’ãÉ8õÀ_”…Êrq G3[œYqƳFÀg§9еÆHç>G!Ï÷7š)Ès»8ó‹^®vtÈ&óýYõð6(YÁÀª­»žX¹këþãÒ·×ôº…2D-U0:LüÝJ{“#å¾þ¡çv‹ 4›¥ª>ïçK…z|jVNfyÎ¥ÕêLÁbG€dGÇÑAtð²P1 <Ìœb9çDò¡¬…¹:µÃÐ<Ò FkJÀöliS­y63èb•xë/;ØÕÊáA›œs™=ãìrÞ­×"B$±²f:ßSÂáül.Ÿ'š–», ªÇí¸>Vf‹¾—ï:ŒdweÚʬVÎ/…-6<:Xèz6£…!§w¤Fõ‚Ö\«ÉRís}•ùØö›A÷Dz"8[¨7jéS[<ùóCö7%q¡«¤eV©UiwI$s:%Jˆ$©pЀ¸L¢˜PH¹Åt©»äù–Šf@²,­» µ9\²{RÝÎ×umÏȇÂÂÆŒkõŸr9ŠÉ–ÊIÓ ´|Ê¢ AÊ%RvtÐA/ –¤–´\ÉÇ.žÍGrîFY†ÓS[Àï¿UJNÒâ O ¿÷7 ƒƒû'øÐ2Îf¼Rf[ÃËàÆs±$q±Pš©Ô‹…ÑV£ëÞ/m«·rÅs8Q}_rùÄûÞÈâ–=støÉg[³qz'±+òT®…d•òVÁcŽNß1Þ|MÿØ;þXÚ>;´»o˽–·“•)ŽorWÝŸÕ×üèÇzõùóÿ»!×N~ñÔm+â]Aÿ¨FNXkÄqb6žŒ¦Žã°¥€0ÕH"dW^Á³>.ò 1ˆ Û8Ó#ë¯8²ä|ÇõŠˆZ‡‡¶?[Ûõ\R¯Ž€fÞËÖ‚f„h¬M-h­õiEXp‚Y+ùü4¸Â…¼VÍ ¬j¡ÒBJ‰©ÕeY…¨‘æ ~szÒÎ;Y2]XZ‰T\·À’n­Ã„íâ!Øùá,u5ÄÄÅ2•)ÐÛ[êýåA1À À+±m)˜}Bµ0„ ,uÛÿ‰îüÇnG÷%nqBä+é ƒ:xUAÒÓœ„¿ûáñÏ,ôG±¢&Sç¹ìÁF£¢3^îËi õŠÒ˜¨TZ¥ KfýdÙ<¹,K¨Ý’ÍåÚž‚4µ‹½iC0¿,U¢øŒ•×,íåz*¡íôHÅD˜åCDv>$Y_TM T ŠËà Òñ϶çŠÅ1mMV祟/…I€5B !*Ñ 0qÊZÐgÏNIBÈcËîË꤂¹ù¤yR§¬$R"Ò ÐjJÖMxªtk$óÙ€21GjVpÎjâ¦iäim’'€<ðÛͧ- ¨@­¶E鄬Ä.œÆ§ìqESÑBÚ •­°ÇeJÊ„êÄ€;è ƒ^ˆ*‰•Ä2À•™å: ÚàieÇ4á`%óÕ”[y^)˲,Ú¤$&¯ °V=Hý¡°Ÿ UI‡°D¾Êâf&èa/`‘Þ<…Ü0¨ð$äGÒp¹…ºìÞciópëè\ZD­‘¨ÕtÜA!‡¸£uäEsuÀb+MmÁy¬-®1ÙIî ƒ:x9 棦bB™Ÿ·U£’Ú¾#°£N“Q#¹ –KT>CÀµ,KD·‡Ê•ÉÜcàŒb]PX&qH¶(ˆ“€æ@ ¡Sê9a’¹^W'¸*¡tD  N,2i‘MÙÍo%Žk÷,I™Ò³*æ%RÏë4µ;qê\4@fÁ@·Î¡˜´†’J}þ' ûœr4š˜QŒ±H”–4!ÁöA‰G1²yÌÁAÀˆŠ¥@³™Á"@{e%æuÎiÆOž$= ‹¿6Ž(õ ôÜ™ž3U¢ŠÅ*œs½~…O¤0ÃÄåÔ~"I €µ&ØÂ )mrxÔ©ic<ØUMIä@Å1“ù|RHÀ ¤ÀqÔgD©&85-Uµ¡Ù˜ÕÖÀH&g¨€„T PœpâØóë<}Úù$<êTVÓ Ek‹Ea‚ ê ÷:.è:è ƒ—ƒ–J‡åü9Õl_#^½M’Ù„ÓUÿµ„T¦&´Ç–$~p/@¬ày ÇÏR @8*ÌN€±È;\ÅÀb` ƒ ‚ð4pÈuI ²Õ  làÚHÀƒ„'€€ë´â*ã @~’–|„@˜* 4`XhÀ`1ˆ§Á)2 PlEPà­‚€)`@:T>RtÅp,|7€$M@aÐH ÐÖ@r» õ%u}À_»û‘rµD,P ÓQV­¦âd' h„Ö„"†4 (œFĄЙɯ¸*á ŒmQ"9WYJù© þeÑœi-ëÍ-Aqmj_STŽAA3ÌR•Pyj‹¹ƒ:è !ŠäiªÄ¼öà„/½Z½¶Äè•QŒÌTNý·Tk³µ*J QøÌêCèÓi¡0…@(¥@!Ð4@F\°ŽF1Mx EÌÑ(¤;JÔõ5¯S:‡E`±eR P¸Òf€>Ý Hë3síêH[ŽÃ|›+™Eǧٗ8ÓF(ŠÏD:ß{œVäÖšÑDôY±ì:è ƒW<¤“aiÁ¼ô¼Eóimˆ·ZÌE)…$sìS¿Ž]h…²e;AÁriEY-†ü™>àÔ†(K /Ö|R ”€ÀQ÷èÁ¸5$ð1mR¤¨–M .8HqÖª•—®Mö=$HЀ@#àJJÁ§=þ3lÄäu¢(Êj ”9õ}-•*ƒðÔo8ÓV lâ¬<×;¶7Nç‚C(cN–¦iG„ÕAtðràh–$ +dd¡Ø¾¥ÈÀ¾B44üÔ<â`lW;®”:iÕ©Á¶Üž|œ6ÎlþÓ¡$‘Ì `@ÄÒ_ºÆªÎæ¨+9x"Õ„¥gk!¨gó°5q tm'ú@ZƒP (ÐaëÔDˆNOͧD”U€ È3Sˆãx¾QRÙêÔóH}†%$‘’znh½ß!ð®&¤ µŸà$=³y:è ƒ^e`ðæD f§æÉèb½óxÄЂèÄ…WÆç'A§Y&hÁ¾gçâÓT*ÐY,8Ágf˜iuj‹Se” 4( €!@HgȰw oÿ^­)€:G(hà‚Ö» «ó3lAß@®wªYó2¡] ´)OgêžF~zËb˜&ækÔr×·ñÜÕk†zO9üL[¦qÝ âßýàå=ÁÅêQ˜úðº£Áê ƒ:xYð¬f‘"`Ð(94õÝ•ç~‹òK4I<üÊ(%ÈO²œ˜<¾s÷ ÏïÝÏÌA!sžB¤@ٙͯOc(B (e"0}qÃéã2™J°à˜ ßên‹¼:Ñã©oî¿»,Ú#ÚT²§+‡â\læß<ØùúÛ›?ÿz8ºHüdQÆ£Êú1,uàþì‚ ¸bbeËi žòVf‹ŠãÝë­¯¾¸yôìèøøtxò PQÚeLãŒ1ÒÆËžòJhšG £jc§ýÉÝáúþã²Ð£¿wOŸí ^–ˆËw»¢·ÈìnMÏÓ­nÝ“{×÷õ|ãà‰4îßVUE°ñxŒf+[+(Ü›ýšücHIæs˜aggëÜ+Çm4© Ã!¦û¼9P;~·€Çqœ“Y;zÅf³7A=¬Ï®\Ø>»u닟¥ñ÷ýÃ'ßÿ£?òßñçΟ !€f£{“öD¼2ŽYÓ4—/_~þùçóc¿ùÿÝaãa>÷Ú­³¯4Å-i-Âñ–·[ÀŽã8΃ Äu¸½5¿umwn|éóÿî;ÿþû_ÿW¯zÕ«67Fí7–1Ý“Ý6óy]× R½U-9‡Ø}é+Þñž'¯M:DFýÊÇš[ûoëº;Žã8$iº{¼µ«“q]¡½ùµ×<¼ó¿þ«?|üÕ¯¯™¡i˜Õu˜(­ñŸBoÑv¹3³”²äd-bõô…+ßþ®ïÙÏLõãa“a–׌ãì8Žã<ˆ$ƒÓfë¡3ã+_³‹_þÛ/þ¿¯Ý£BÃ¥˜€œ•aÌl|o’°š¶!¢BàCAeön^ßÙÝ~êK_~Ó7ÿ;é‘7ätÎÒ¤9v¯vÇqLfSJ\ÙÞ¿|ÙÚæGÿÙ½ö›^‰nÉš; 1‚É`r¯þ ªT§H¦0!hy“ Ù°³{]óÆ×¿ê‡èIt“ªŽèŽW_¼˜$,~ºÓ¨£ªŠuv3" (Mîê::΃€Ù=Ê¢tçî‰6‘V›ªæîÖÕŸú‘VŠ”ÎãªyÉ fD¤ªmÛƒ½½½ !0³ù|>ö5»Óé´®ëÂd2ÙØØ˜ÏçƒÁÀµk×ʧêºnÛ¶ª*"¨*çf£Æâé?ý?üÃïß>ûÚ& ªãŸ'àüÍDs›»YžM; ê´™º[Õ‰‡rœŽp ùǹkˆÙR€À¬5³Ç{,Æx‡0/`æÁ`°¿¿¿³³ ëºÂÕ«WÏŸ??§Ó©ªnnnŽF%‡ bŒmÛÎçósçΕ—e¨ù|^×53Ïf³áp`@J Àk^óš¢÷½öÇÉXF:³!ƒFÈŠÚº¨ºå8âQǹŸ BÒr~õ«_ @õ’‡¦iÚ¶M)mmmM§ÓÑhTU€óçϘÏçUUÅEDU™@a6› ‡C3‹1S8ç<wwwcŒ7nÜ8sæÌp84KŽ!úÚ×½€ˆ€pü¬àä/ÁöÔ¢:ë³óÉ ªÇó *09߸ÚqîÌ ’û\¦œ«*jfÀñÉV9纮ëºÎ9FŇÜ4M]×Åc4³ýýýÝÝÝå‡Ãá­[·Þýîw¿ÿýïÿð‡? €ˆvwwËÏœ9sóæÍÑhTU½¤šj©nš´Ö=|bnæzÙæfíÍé¼Åõ@_f5Þ|Ò¡磻 ç~ˆ,wH!¥T2º®‹©^·ýßøÆ+W®œ={v0<üðÃò'R×uQªšR23UÝÝÝ-"cìºn:îìì\½zµë:"R¼Ùu]w]×u]QëœÛ+f}ÓKAÅXóÜ8±Ï®VEð+›Á ì¾bôÿãGÏlùâI‡rœŽ_ÿ/^sÚ‡à8Nˆ–å@fwªô1þê¯þê/üÂ/Ìçó÷¾÷½?ó3?óÉO~@×u)¥”RÎ9ÆØ4MUU9çÁ`pëÖ­ííí2òp8,Fs°hvÉá*^ërB×¶™5„u‹@œX€©YÅœ·t&óñ­kt=ÈÕQH¡=¾Ù´ã8Žã¼˜R—P+å¬UUÝAsÎóùÀp8|÷»ßýñÀx<þÀ>ðùÏ~<Ÿ9sæ÷ÿ÷ßô¦7ˆ1~ìcûßùUýÈG>ò?ðÛÛÛ%~üWõWßú­ßúÇüÇO>ùd —LéÕ•Ì Õãñ=8¼6{vI­CÄ4ØÌ…I˜·Ã¼sÒ¡ÇqçEc"+Ó\<Ã%ú+bqMïåápX¼Çãñ8¥ôØcݼysww÷ŸøDŒQUßóž÷üöoÿöG?úєҟýÙŸýüÏÿüÕ«Wwww‰È̺®kš†ˆž|òÉ|àO>ùdÓ4ƒÁ@UK¦45][¥ @ˆfE†×ÿÉ“°BBóèoÀÛYub-*éº6x´ã8ŽórB&BÓ\-ÅhXßîjÿ¡‡RÕgŸ}öSŸúÔG>ò‘ý-ÙΪú½ßû½Ÿüä'U•ˆ>ö±ýàþ`):šL&u]—é_üÅ_œL&¿ñ¿QJK¨˜™›¦©ëTÊ“–ˆÈú]yê²ã8Žó AUUúЇÞð†7¼ýíoë[ßú}ß÷}˶“É„™UõæÍ›¥áÆg>ó™w¾óׯ_°±±cÜßßê©§>ò‘|⟠!„3.µIEËO„ °ã8Žó Áööö‡>ô¡/ùËãñø³Ÿýì/ýÒ/ÇÿøÇ¿ç{¾ç]ïz×oÿöoÇsΪBØßß?{ölÛ¶¥yÖh4ºpá3¿å-o0Nçóùl6+ƒÇã“ °ã8Žó ÁÕ«WÏž=[ÀüàÿèþÀ§?ýéŸû¹Ÿû½ßû½¿ø‹¿øéŸþifÆÌ9çÒÓªª*f®ªj<Û·}ÛûÞ÷¾~ðƒMÓØÜ܇ãñx0lnnžôx\€ÇqœoŠ-»¹¹Y,×K—.øô§?ýÄO¼ùÍoN)•žV%Sú;¿ó;?÷¹Ï¸|ùr©AJ)=þøã¿ök¿ö§ú§þç>JxccCUK"؉pvÇq¾!xôÑGoÞ¼ `0|âŸøå_þe=öØ3Ï<3ŸÏ›¦ùÜç>÷Ì3ÏlmmøñÿñO}êS/^|Å+^¡ªTõÆoyË[>üáøÃžÍf1Æñxœsfæb.Ÿ`Çqç‚7nüîïþîÙ³gŸxâ‰ïþîïþÙŸýÙ7n¼ÿýïûÛßþŽw¼ã‡~è‡~â'~âìٳŮ}ßûÞ÷+¿ò+o{ÛÛÞùÎwþÖoý–™Ñh4šL&ýèG?ûÙÏþú¯ÿúþþþææfJID&“/ HxÝ{N|Acð6T«ÜþÂvi³›´ìMr¿ûüçÿåkOûÇY`1È2™?ý9“}š1­-Dê›^•ßKÊ’É\~.7Ûßß/v0€Òd€™‰H©&¢Ò²dl-zc©˜˜ ˆ7ë×|kÃÛ°ã»q¸ì8Žã<¤0C`¤Ñ|ÖUFs+OÛ– "9gYiY:ö¸]½´n{`ÇqçD `¶f« íþ/þ`°µ3Þ»cdæeÜ· ëE¸WpLfû{ ü‹?øï«ó]¿±á`íö/õ9Žã8ÎKªUƒÉ!ÕÃÝG~ÿ¿ù—ÿǧÿ¿ÍíÝ’!EDªº4|‹üÒ€áÖÖ¿ù7ù?ÿoÑ¢ž_»¾{þ̺Í]€ÇqœÞÜl/=ÿð«knîÍ‘°uþ§~æçŸöÂd2)qßÕÜfºCqÒ=bÒ¢iº+.|à?ùO53$l¼î›o^º²öø_êrÇqœ—Nùá‡/=óUlmÇjóÌ_î ÿð½ÿèÒ¥K¥-- ß—Á]Wø›/>õþÁ?øÜß|!ìž«}lré Fë¶?ùzÀŽã8Žs? ª³Õ&ˆk‰ñð›?{]ßð-ßòßÿþÙ?ý‰w~×;v¶¶ ™"V؉W <vh_|ýÛ¿ýÍßûƒù?ý/˜"¾öÛE£Ü¸67d>Åï· °ã8Žó` "‘•—!€(yüü³¿üþä_c: P˜ T÷f¿D ÂÒ¤®*ä ÕÁÃÀbõø«b=Ê×÷€@dУj½ÄØqÇy0aÆjp·è±YW?jYP·Ø²XÅ:E‚圕îMVé ]Z|”eŠ£{|ýr8s–êÍét# ¼ªÓ·áì8Žã<Àê³ADÌÖU]Cs;›çy0BŸxÁ¢5»TBPÕÜu˜ ˆ¶}ílÞ5“Fˆ¸m®ªu ìì8Žã<°õ5C±ƒKÒ ¶œÛù& F¨(„)w÷¦G¨jé:tZ´ŸÅxëú1"VH)pÉ>º¶ÚÞœwÇ/Æàì8Žã<˜˜aiþ .æ°40£Ä)Õrnµæ¹¢ZÛãdH† L¡ f0õo¶-¢h9 :p@Uu­`M” °ã8ŽóÀr{u¯´‘:i-+rFŒaTëKô¤HÛRŒc‘{33t]Ü=hnghpHáYʳ*OÂrÇqþ.qD}îè4Úìº"ê I *9ã^US Žh×B)qª-V¹™¡mcÔ"’›!®K† °ã8Žó rì2GD]Ó1D!íÁŸî]ë)Õ"оËê€lݬϼöNXŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§€ °ã8Žãœ.ÀŽã8Žs ¸;Žã8Î)àì8Žã8§@<íplŒ;²@HŒ€TÔZ˜Õ'gNJDÊÏ~p3ƒ,_®þ‰–Û¬ŽS+á8TõøsZó~wüû@3Á˜f˜A˜c0`Ú¶EŒÌ¬" žþŽ6”S:øY~i;T¨PØt‚TA2RZ>Ó~{‘£ƒ”ÍèøëUü+ß>òêöÇrçñïÀêɰ5ÓúC:žÃ²åÙj0ë45Tc!0xa„”Í$C Là¦~(3d` -ÞˆÀÇy±¸;w‡–G‘(•±Á˜ó‰†I¶x0ƒ¥èÒáÇú:AÕ5D k„ÙÖ-?>Å[fˆõ/9€¨"7ó¹ªVõn„¶m% YÓ‘ñŠ«‰DœŽsea›±1™·$KˆHQ:ë´ÓÇçRð^„¯n¿ŽÇ?"lݧøx§ZÙþÐM,‚¸æ0ysN±f¿¶n‚u .§Al0³a÷*Ƕ„ËË~*Xþªf©â2T:k¯‚ã¼ \€»ÃÌ —ªÌ"˜õ¤¬Ô[¼ úÇßmB[¶aâ#[:^÷H\÷þ -°æ¡r EÀŒ(s}››Ú½‹hll`sÌÈe|-‡¾ü©Ry§üÜA3*kÍ"TÀíêÉ~Ý'?­`Õ)z!C­›è˜žTzÊ¾ŽŒbë& kw¸Ç¬Ù-Nãbñs&Àl\ïcy ÅÆ-£Ç3˜Úš Ì0eRE¹të<(Žópvî B ÀHlÄŒŒ5É”“™ô wÛÚ/þD˜âêf+Çs¼ð¯“ãp¢ã´¸0 €)Twã¹ñÕ±™mï@ ešîípÉ^\0Z„D×\X{ü8!o»Šôôˆ_<¥^©Ž¦µŸT€×j¢>4°œ¦,®@F#q—X7"o×q8šÍ ¬aË0Ê’B$eˆvM;çñX›†¸\i41ëLCm´1g²;úçθ;w…BÙZ#S"#Šb´îA©‹òž¥ ¹lב01!À R\¹†ÀSb2ÔE²b¬s $9‹‚8Dç,ÙÆGb‡ËǽÊñJ+—ùb%µ•Ldb,JVJ&63‡ºùøásß”M÷§ÝîîY™Ýú–7¿ñŸþØ?Ù»öÌt|á«OiÛmºœ»v ÒX×"wLÄ%‹f3³qͦjÊô0³š6&×§q  wûß»výæ0âÚµë`®ªAa’[ \Õ¬6ŸÎ´f5@ÙÌÌF¦ãÖä­^†å-Zï×]ΖŠÎÌÌÜ'3­8´‹ì©­\-B×M?ޱ-î‹ZŽDDˆ¨„¬\sÓbå/K¨Ë.BÉ”jAC¥™w)p; ]Â:„:/ÿö8÷ “Å–/ʰH™S°@‹'~ïŠæÅÇʾ=œif·¿ùB躜RŒ1š-\¾øµoxLUÙèüîÎù³?ù#?ù–×?~ùùçºñ¸OÛ¶Í]×ÎZÍ¢6]朳ˆ0³j.Þâ^Ϭ”PŠYSè˜+ÞÀp0¨66‡ãGþÒ³ÏïMöç­Æ*‡ùtˆêÁpÎbF Ä zéËSWýÿXqüÞáj›-k½—§üuŽó º¿â«/WïH¶—‰*Ȍ͊G¡L¦ˆ‡),ú/I‚eáNŠÌ÷Í4k:ih2Ë{ûYPgCqT°Ü+3[Û¥Äq^.ÀÎ}™õ…1ŃˆR냙뀙K˜*'ÕN¤à2ȲÈçðÈ/Fs"©ˆš¥df©ª&“É[¿ùMïþοÿO~ðû+´7.qlyŠ +³þËC‰8ªÅªH1 r`V+ˆP™™j†³1[i½Ò¡‹ÓN›,û³<žY¨@1iîD$¬ž— °s׸;÷KãF [J"ÕµŠ!1E6¦ "0ØÁÓ™uaz;\šùâÔ@J‰ˆLµ¯1Æ£ªŽ6ÎŽÛïÛ¾ýçîƒók—÷/_öKOOoއ"Ö4Ö¶šU¥3ëC±DBè­®¬«V €2›žˆ˜M%˜LÕŒ3UR¤ÁÎfø¦ÇëT=õúÞd¢Jj”ÛL\RÕŒ@Ö÷¯8”;þ’±4IËË#žj¾øT®Wê°oÈÉ|ì}\Ý&X(ysÆÄFĘˆ9Å@!„Ä ©j'ÄÌT5™š±Ì,ÇZ3M[j3wbaTyÑ€‹ˆ˜ÁÌF'n•é8·ãìÜX±izõEÉn!$FŠ”"WLÅM"¹øœÍ¤Ï}¶¾ùÐ+Ì“ŽŠ”°qÓ`0¨ë:›ÙîÖ+¾çß÷Oüã¾uñF·¿ñé ÛÕÎ…és2:CiÈ©Q!b‚HU¡f¢ *ÉÊl¥ë0õÉSÄåÀ¦ÅEM(R>›Ï_yfçÌæö™­KO={áò=ƒ±ÌMÕ´lÌ+‰â/“@¬&U‘.[Z^ù@¥UIø¢^ÏÌÜã‡=r㈈),÷µº³LÄF Sc Ì‘94€V¾Z %³œe‘‹À`bŠïºÉ–ÕöÆ¢±hêl>G3³BƬ}3í{u!oD\€û¨·_©O´!¢‘RJ)²)˜Y€¨”°\I‰æÒåàeùÐÒuù⎦ÌRJÃÁ0¥Dj¨ëú}ÿÑøS?ùcÌÒÌnííݬ9~泟ê®™wjª0 fdÆ‚’BK ØÌDì ™(¤> Ì …9µŒnFb„@DbQšÍAÝvRE¼ù5¯;sæÜ—žùÚ3—/MÚ6‚¤Ëœf[ßÄñž²¼°G²šm¥L+ÕGå¢CÞc;¨B>d:y-—b9àjÚíIXÚ(ö ÏfÄĶ˜Ø©ÁHÍåÒOÙˆÔÈÌr6U̬E3×+âÈ,˜j,°ö®r .¾Î]âìÜ,j¡tD(îLfÒÅóNU`#k:&-f_Ÿ6 ,*ƒ—¬jðIS±RJÒåÈ!¥ÄUÝÝÞyôÑGßùïýøìêåÊÚkW¿úüÓ_øÊS_ÜÜÎçS´BfAMMYa0R!“œÛ.çLD3‘*LTM ¦0´h„.ƒÂ¦  !õ=$BŠyÒÎçmÔ¯¢…—xùΑ_Jýî¢}ÊAø–n«˜ZUô#ê‹EçµÂjzQMÌL”‘XXCßþDJF{f°2'235ƒ’DŒ ìí IDAT,w$‚†2,L@L¤‘9¥Vf&;Æ.wœ °sŸÀG,Š…K¢–E,+©…ÀM§]§eѦ£/Å\DŽïÍ5‘ƒ±–’R ?þøO<1½ñ\¢üÜÓûÌÿíµçŸ0žÞTX’þh‚aë-`)ä3—ÞR¥w†ÂŒ`Å%«Fj”êÒ4QÄQ#31³Éd²µµ5lLfSSyäüYÁëðô•qµ¦¬$°’…t÷§ÿuéö+2Y®‰éÒm”ô¥…ð.dlÑäwluætÄŽ„(EK! „@˜eå'.-AKÌ,[V… DHÅrFîTD…%D2%#5 S áã…ßqî`çe…í¨i¶pe–'«.Sš %:‡,YJ!)Ñ\rg¹-]x‰ÌÈRbî;å—:ãÛŽ·ÛÁ}b”©1™™Ñ¢Þ—‰™Æ˜Dº:&2~øá‡ÞöÄ[«:X3¸øÜn|íiïQ£mC†Jˆ‚(¥ÔÌç© ‘Ãþþ¾hιc檪&¢Y¥œ§õÞvæÒÖ$l µ¦£Eý«™‘ DˆUÝt™™«A @ÛîñÍíW½õ[ÿÕ_þå…+W%+×£Äi6›Ñ ÆFOÖe·ÇbKã­Ž>:Š™šs·È;ãòN@¤aæb¿˜ËàPÒÃÍT`B(9TȺð¦k¯}¤¦&÷³""‰*TEDÅh)"Ž&fƒ–FWÒ¶Y&¤8TdœEJ1Kîf]+b!¤Veå:² cfÑ.„ m+¦à¬ŒHA¼~¥ ÇyA¸;÷;¦P¨ôKµ–j¥{3ÓbI‚¥³”ȪªÚÜØ–N ƒw½ë]š›°½óÙÏ}öÚÅ/ݺüt·w³ !râ@\mÛ2Q»¢ñÌ<Šê(L²‰ˆØAQ‚Í \ˆ)˜™þK–>Y½e™åSË:Ÿ¢ao{Ë›yøÖ¾òÕ+{ãÁF¢HÓé|¸f冗ãr±o3#&%ôuÏ § }Ä!ÆhF0 *©d–ÜꣶËYÔrRÅÌ)Ef´ÌÜ(w bHé¤vP%elªfP3-ŽŒ¨Od#`¥œÚŒˆØˆ™Á0Ž ¦Å"KŽó¢qvî lea¸åïf†ÀX!3S1²{gy,› ²)ˆJd̬ª]ÛîîœÑNßñŽono5{¹¹q óµ]2KÕ[!†:U¡“¦Ñ^j˜j!„:&3ËÒ™™ôõÍPUSˆiŒ€ „ €BýòˆK….ýÌ,±ª3Ë"}·T¼>´µ½9]¸pñâåë:Ôu=ÍVrÑ^nJùV„+®iZú‡}·$R:^•uÉÌ$[ñN‘™”!¡¸:VãÄE’ëT¼"€³!`’¥‹Ä!PŒ˜C% f”EKU’)ÃÈ™˜KPÐJjX Y™†LÜ íÜ.ÀÎ}Ç¡„)#²™˜ÁX‹ýd|¯ž}Ö7‹FÊ‹ŽWƒ:©jÎù5ßôšÇ_÷¦›ŸÞÝÚ¼yíFÌm }‰²‰ˆtÍ´™Xªš¦!"é²™Ñ"TYžøPB‹j‘áœsßÏK‹<1Q§‡\è´\QX²·›\²?K©:»1:»9ºÕ4ÕæF5ª /K$øvŽUßå_W£§«Îí¢ÑýKÒÒŸ£t£@éÓýbX1û÷¡èöPZ“d3%²¢¾ÅmÍÌ*l–ÕX´¤°Šª€Å'ÑWI•"m˜Y$e"bV"]ièõ²\Tçï,.ÀÎ}-zãHýnÉZ”Ü+&꽫s-K(jiMÄàÀïŒ6´±¹ùö·?!Í­@°v6J¼wùâþµË³ÙeäȬÖNÛý4Úîº.rRë mÓ¨j\ÊªŠ ÇDu,"ZUKÙA‰ÎÁ!"ɇzY/ßOfš»W?Ÿ)üߟÿWqXÕ³¶9-ߨ×s{q^ äh›s¿ÄFé(¥ZÅuálV"ú†h´ÞçQ.…HWºžS(P³\U±ªc˜¸¯nS)g¨¢3+µl}:S0Ë0+-=8€Ô@FP†••0ÌHÈLóú¥<çáìÜ/ ø-ßT"Pßÿ¦F«Ù´÷h§}çCq B¢e«Õw}×wmíìÌ'ãa=¹q­N÷®]™Œ÷MsªTU¡ŽuŽ­0ƒB–%çÌD"’sîº~:AÌ!$c’¼årɯ‚™™hf%"ăåÿ 2š™™”õjm)Ìe9€œ3mŒ¯ä‡"¾ m®b¬9¶÷( 뤬.˜¸JùëjÞòÒ±ŒR# 0ÂÒêE߬ÔVÍßU²i3XÍ2,((ÇXÕ#ÇÌZ&@`1µ@0™Á Xä„FdLˆŒÀ0+R\ê†=úëÜ\€û Z)kQ0-ÞI‚¡äÚ½ p/ú~„À1Æ:†€G}ô‘G^Ý4·hïÖäÆÍÉÍë³é«s×pc2…«˜(GfŽÄ9´¶PMUM)–W}V’AUmš&„@!.V$42²P2ƒœ·+ëÉB‰‹ÏœÙ Äœ›ÆBխ͇ÎíÎD¦³f0´kÖ?~©9ä½X™K·­²p¤ó6SÔGß‹ƒÃL‰[&s±ª”ùÈ¡År¤ÆÑ@ª$Y,jL\×™iµ=KL­w­”À©Aa0@Ç*2‘ÁÀ Q6íMÞr ”¯.å8'Äع/°•+®å5)Fa·{öäcZ” fNJÛçsgÎ~Çw¼cïúÅí­ Ï>g͸ïW1UUT‹˜CèÍ–Ë*”s6PÛ¶]ÛèºN»ÜæÜ©öÏ}ŽÚ¬9ç®ëRJ1V`RÕ’t@³®ÃqÅ?«z¼š­fºÎçy0=öè#—nì]îBUU÷äâ¼n?r¬Èð‘ðíòDD%ý (ZØ;íAÌ¥EÌL¥Ô³ H¡¬H9«©°cLƒ:Ï3ImÅÀ^L_J®J-LL‰ R¨öaÈJöWÈ8ô-³ °s7¸;w‰¡¬„´„;Ad+I@‡M–ëõÀ¬uËÖÜwl¹,ø‚-›)X†qi‹df}Ó¢¼äÈñõ{ײ˜poèông6#Œ‰£fTA¬)ØÛßþ¦n|eÀáÆWŸŸ\¹:›L#qŽñê›iPK')Èš®©¸Ê™S´NÅBh%ÏæS0ϵ7VêºNaÄј´w»rc’”ÐfU  ”RP–FÔ¸´ìP:È…`ËØ*AÈ`‚,ê°Ñfmd|ím>üµ§žÚ¨Y¢¥–ÔL‚’¼El ;&ëÞ²ô—³Xêq(ݰELf¥¯2©Š6ý–`ÂÁJJý½¦Mîúü,0%.QX.ß²Å7&2·ŠÜÍ£4Ô5Ũ5Q¥¢NçZEF´¶bšIn)(š˜†Ì)ç,Ú2 BTK“ÜTLu·R܈4$ f eMóœMç3„9 ªŠì«!9w… °s±*ÕËÐáÂDº«WÔçmÛ‘”eácJš33ÇTò|ÞÕ)îlmmG¹íÆÓ½ÉþjêÎ]7›NC‰©•µq f}ñ(©™"Š1V1‘‘D„8(ÁJà×\ÆžKí)3#pQ¬åYw]ïR.ð²C§™¨öý¿Ddgk{ïÖÍæÀŒ^ؼ±Ú\Ðe%ä•¡ÒO–—}Ù²œ‹ªš®½ã‡ÌÐ~ p)gâ` éïï5š… d¥Q¥ c0å ªAab¤V|à‹k 2b Dª—žÛËIÈcpî `ç¾`5U§¹PÞòGK„׎³æ},Lk%¢¾Ý ]'¢8µÚÞÞ~üñǬ˳ýñÍ›7§ã ³´]×4×®\­ë:ç\ܼ]× ‰‰g“iíííM§ÓTU“ùl:ŸÁ¸Íˆ…uZÜžd„Pt¨–úÔX}9õÊ´tœ( ®„W™K¥ĤŠ)0w’{ô‘‹ói#JͰ}WdìåH:6Oj™]Ì⥠c¥eÇ‘Az©[L›–ï¯~ –°1@)pŠ#Bf³RC®FP“&°é TÙ(Vܶ&¦‘eãŒ`R4•®(ƒ­›w]IÆ×ÞÉBDör¬úèü]Æع¿ "ôù±¬}c¢cn,Œ•òª¬¶¤ ÆÌ,0Š9˜GõàìîÎööö• —Ú¶O¦³É¤k[6”NΓÉ$ç¬"V2™EI”Ë:ƒ¢ $¤ŠœµkÅubYMI È*fs ÒEüФ¯t!¢‹/–¬&$ÝAR—„ËújÐC²j~衇†Ï?¿7¾¸^Țݡ†ç%âØ<)ºÕ ÌJ€.…î0ýfÖg­÷o„âu1r V‘R11ˆG¨È ÅHŠ*€9%ºÕê4w"œ 1‡ÓÒùCDZ¦hV–žä¬%‹Á¥ÿ6ºýëÜ.ÀÎ}Áâ‰|žCÔwx°|D㸔#ã,?°úþ¢Ð -faIíI‘SJ‘œ9òhcB˜Œoí]¾VÚe4MS*zSJ)¥ÙlVFN©7UcŒ&*Ö-T%(A³Î›n2›SªšÜ©*ˆŒ(«1ÚÒðÉ,,ÌÁÈ™#s$.®™Qßв)÷égd*KZ™g(qm×[£Ñó·öb°‹'[tTìõì¥ [.e‘ØesÊU§4^Ü)9$Û‹_iѲÌÀz?v_R¼HiR¤B(…~!G3d…uÖi7Š‘5oT‰•êá(FŠIæÊ2ÍEÐÁD¤eQLÍ NtRVbwB¤Æ¡¸Î¨Uy ع+\€û‚#6Ó"FˆUÝíCƒ‹Mî0ÎÒQyÛŸËsiCÕJÆDTUÕÆ`HÐ[·nu]×4MÓ48bÎ"Ydo:î ‘¸°©ªš LMÔ¸ƒv¢YlA©ü‘˜h4moŒRJ¥|H`­äN…—&  L˜Bä:źbP¬+ËBÓ@S´ÀBŒœ*‚Õ4(ÔÔ6ê;.‚ TJŠaLb% ‹ÚœHBh%5êÏÅ`¢ÅWC22Ô©’¶;·»3¬ëY—i±å‚—C3BKqíÍÓÛ„öàŽ,Dôö©3—Iˆx §…ÍË}[oS§hu ‰…¬H5K¹³À X…°YUyh&˜ÌÛYÛu©1fP%j9².¾r¢d&Êò…ýwGÄ”¡P d!x’s7¸;÷«.èå;·ov ÀkøxÃà€E÷"¥>Â̶FCU­ëjk{c4äœs×D‚ ƒ)¤hfmîrÎeUÁ6w•d"ÕN%åœED47Mc†ñd2™M; Óv>khÎv*`R°˜í®ë̬ïRl!¨ªvmqD7 Dˆ«™™bXNJÈ52SÕ¦ÉL•I'\W“é8Ö3ëÛk¾ìô«ÍVó¤n¿#K_4¯&—aeîµ8W+K3ôý™‹Ç¾ÿü"¡ˆ¬•™LJÖû«¬D¡Š‘ë¨åÈ‘÷'Óɸ›5AC *-8ªÅ¾ØÌª 3ÓbY«Š‰˜‘ °s·¸;w…J¹ˆ™¢Ôp¨‚¬¯9)›­X´Ÿ=$±–ûç,,²šXFÛÿ•A%u©ÀË'u#•QSÝNf5×£ªÞŸî[¤xÂÄÝeíÐ5͹‹1¦”°(1*—ZnÌò^sÉË{Q)+-Îy(…€H@ ^GAÊ‹Û"w¢b &¢´Ìž ýú)Ö1Æ…í ¡É:ŸOÄ8ÆJöóÎÛç[›avãfëËW¯ªmmlòÕ+ª‰u1%ÕpòûrÄ«¿jû±w¿®¹ji‘G6b‹1X ÞÛ)e²¬Ö™ˆšP_µA%¶PÖ.4+M¦ÉBg’•UÙ8DXH©ŠT(gžZž7 ˜© ŒˆŒA0‚²Å½vœ—`çž±ê‚>öý>~¨tu‘wE½÷Ôxñwá#¼¼X³8T!ÄÙ ¹í„Íl2™M'³lh›Ü4ÒuBaav-bÀE:Û†‰-„R,ë‘©›6mÓ4j±ù¬5#Ž’;å@}ä2±*…2¾”PÎIЋþ¢Iè©@]QcCY“¯¸LÄŒL Fªfj@äpþìÙúkÏÍ®Iuby9r—Þc¢C.å•+¼L”hñrc³¾gd`c”Õ)€âD[uP5[½‘eüH`æÿŸ½wí‘$K®ÄŽ™]÷ˆÈÌzt÷ÌPÛ¤¸K@-$ýÿ¿ AÔ‹RÄ.äNsúQUY™î÷š}°ë‘Y™Õê" ¬6Š™‘î>~®™;f*"ÁˆPw8é"ņAE ˜⠷cóûˆ÷ÎÆH%œ‰-s !p“†gJä[fzÃçÀFÀ>—”ùáŸ~_¼«ÿ¼4ïžÁÞÎÁ‹öÓG¯L!ðh6X-ó<·ÖÖ€“”Ëi‹„i]Fg’ª5÷cƒ‘ÿE3u~š«ˆ‰tÓH“¬_.㌢HN1;ÃiÆØ =<™™‡¤_„»¦‚H).j*úâÅ‹Ý0J—3–þÒ¿$¾{T»]Âß'šw?‚uƒÕ*+¯”ªˆR”A‡K‘ªEw³NlŒ>/r݈ýD€0Jd€½aÃ?6ÞðIq"G´ªPE\Ù„œWåðÃG³¤Z6£B„i}¬)P :ÎT¬mH% óù´¯ÓÊv")â!á$•A|GßAq¸Oó<Ï6)ÙÜ›S(l¢bƒL-Üa“.Œ•@Z,}6ïñÛóÕÍÍéþXtˆ`C½ h±··ïçæTos… fm4)*cöÀ·æ(ƒÙÎTˆˆŒÌ†‚¦!)tV ˆ ÜÐÀâ¢T SÕ€Û½ˆ¨e`ÀE#*9Çá8á}T^¼:ÞO§éôêú0ÌÓ gé2– ?I)ë |<ˆ‚¢ý"‰lÍÙ§DôÒÿª|Á—™¥[§»»{‹#)KAAED¥ˆˆ‹ª6S Ž•§w§»AÕD†" ‰ðÌ ›ˆ¨@hÞòc‘á4Ÿ(j’6cØLå ¡AÌ”:‰ÖpHñè)ŽÌ9Ç¥>c–/sù7¿¼œ¾a€7|œkƒ®åIÝ=™—tëYxÕÿÞU¾O϶ûžL´Júì ׉0‚’yÛ|Ä“NŒ®ÃÉ̳uç­¬±Â[EÍ0MÓ[÷¢vµ¿ž¦i(ƒê$½»TÉ‘K»ÑJ)&â^smáÙÈk*P¥˜*pQ5±ˆè]=Ë ¤en.!}õ²ŽHSÓ[$.º–UÇQ‡ÃAµÝî°GÀk°Œ–X–¤Y7®òX‡Ut¡ZgbXŽÄPÑ>·X>v9ÔzÚã²I @ÀKç•€;ŸH1TH‰ðuÚq^—›)ÖYÂëå~$»ãZ&§Q’tïâ/fëõ† ÿ °ð†Ï‚˺ 0¨¤$€.–îúäXÜ)¸¨–¬÷"=c&ü£½þJR„Ã%/0ÄA‡ àFÄÐÛ’á‹;ÇÄÌ^¾¼þí—_‰7!^¼x1ìÆÚZ)'Î."E¤FÈÔ\ÄÊnÊ(†q÷û±”òæ‡B—â°HSôqòyиÈîŠH)…€˜ÈúùƒgM6ô^ã!óÉkûéûSåõÍñpuª¹¬‰GgR†®þ]©—Ë ïl­ëç>ŸpV9k¬.s×&Jˆª¬œ‹¢tY&è é #³ñ˱$ <{O.ÙøË»Bú‚IA"U‘®(s‹æ’ÎYa„=óžam”½á3`#à Ÿkµò2F!©ç'\ôØw-+öàUWFކû"às‹”ˆŒælf† 1)¥ä v5³qÜ×Z«·ˆháµÏOânØø~,77W¬3=^¼ºy)¯þðÍ7ªæÑ.>QÉl0+„¸Ç<×Ûã)ÞzD¼¼¾aPÄ…RKSˆC?WÎ$‹Y0/j±èÅiÆçBáöÍ-çøâæE¹y5©üá‡LeÇÜafƒ×]Í1¯G~y¶Ï+ÁÏÿ¥a»;MêRê¾¼]&Ÿ¯9¨Ò“ ‚HY7¦PæúL¬ä§³ÿ‘$¥¦O§äl+J…R=j¹z!F͆¨Ç†b6ü‹`#à ŸÚãNYŸÚgq²²[Ê?ÿÈÃy닺LVHâq²º´ œu3ñ( IDATðÐ"6Œ»a‡hîN‘Ó<ëT«we´ôö ùؾþËß½zqel¿yýêO¿þoUõïþîîç*j¾SD°¿‰˜ëTOG½Ã8PºûËë/ŒpP\(!¡ð˜#³ÜC)EÄÌŠ™™¹ûš—>s‘¾ÇîAhˆ¤ Úü?ÿõê«ß|õ»ßÞNÿéïÿþ÷¿ÿý7ü§.BŽÅC*º¹|œV•,§`KïɧϿÚå@¤ ŽŒGœ·¬ÌÀûbNÐ@Ð¥ÛeZŸ½¾LyZ¤éÑõyb*,”ˆü!"jˆC£ü2)ø† Ÿoø?³`æƒ,1‚TY3ë8¯Ê:ÔA„2Ó 0‰h—ÆÕ¹KýÀÝåâgÑLu@Á4Ø&ûôeI#í,{«©Ÿäû/oc7|l¼á“ð(¸ék§ÌòLïKCqT!6:c¡ §3‡¨<ãÍËåzÉÍ"R1C:¶–MfØ`Æ'."õÔ®vŠð÷wïv>NÇ»ÝnwwT7×ý+Êét*ãðg_q³W”›¿úïÿêË_üþþAaÿô‡?êhÈq†2¨˜í÷ûýÕœÆqЍ‡·êI§Ów&ªª.Ñ@Žj¥ µÂBE4* €¥ˆ Peé!u6U«§ J4Ö¹û}sþö‹/êÝûCÁÛ78ªî®oæ†ÿéù÷oþ¯ÿàwó=óˆišŠ‰ÙÅqº°gc÷UE†Ÿ¥dÆ›\é“Ñ#QLùJe$Q ç‹•ì܉cékr £Vdƒ9(ªb•jÊïíË$í %ªŠ£ä\›Ó/BÍ(Ï»6H Š"DQ[œ¦µyÐ݇‚bz}5ŠHªœÆA‡ÃW¯¿xùâç6Žã<ÏÓñx:"B´¬ßB„E5Ñü4Ý×Z§i2ˆ»ç\„ ÔPJ²‚.Ä6ÏsÑX£IUU-¢£@¡B‡+MDº ("¥ÕØívó<שNÓ÷sÝ^|ñÅWWãq: 0“@ÐLT‚=UûáI^ŠDU´`p,Ó&ú¨(Il.Î×±øV\¦6(xÂ΢_› ÑY:_.^X°ÓáZÚ „„DÞ3ÑéùŽ_¶`3¼Úð¯oøuÀ ÓÈ3Æë+jݪ¢WEÒnŒg:ëN}Ä%û¢3 —쥚“`N§OU³@)#còxšÌ "r0u÷Ú*€¼*vwûâ°?ì&œŽ§Óé4M  r¼’ŒeТÕIzF]Q[Ë„²;…¤ETkmP“Üvãhfƒ•RJÎ{ÐüO!ZÌÌ´Pá5¿”‡8"ª:XaÁ0 µÖh§ˆ˜¦éøþîºáÕë/wûáýýmªµ"ˆˆs¿Ðƒïe‘õ’€²o꺹Š‹ERŒî—¹zG ^XŒFZBŠ0··AO“œç>ºây]cÇ€Ëî{¤Ëï’Ÿ?–qÆπ7|ä¡-p>:?Øà2S}‘º–&œ)„–豩,œþ³7°d×c;Q’¤Gü/6SRAÈ¡µ]©öW»¡vÞZ3´iº?ÞW”‰Ýû7o~óòÕáæ¥)Nujs­Õ±xMˆé0 {ÐJ)Õ©²ßòð¢ykÍë¹/+Â}nTÝã°Ûí‡QUwÃÞô}Šdq:‰* $…aÞ…G8„±sëm¶•RZkóݽ¿{÷í·ß^]íþéÛ9XA¸7€®<{K]–¹j×/Uš÷kÝ·ìD¤ôJ„­×$¨2t w½tÚŽµõG…sdäÚ[°,øüqÙ¥¶#¨È‹+ˆ„Ì,xZ,Oýn9kÀ6løÅFÀ~¬ÅÄÇ"`å…g}{æTó±Ž H”.üOâ‰ìâò0WÈâ@Ù·¢hÀI2DE 9Î^lî>ì†W×7WãP¬Gzø\Ù0î°w/®®ÿäw¿ùÝo¾üê‹/‹Ø»¹FDÔfËà„t?ÎYIó0­K MݯG¦š%˜™m’Ål†Ã¸†ÁÌé{èÖ—«ñE°»L‘Že¥#:·ª¡šá‘‹—ˆ†"Ô ”RÆq¤ž‘&¤W–)ªÏÜ;ùM¶¾Þ ÿ°ð†OÂ%~¼ô»n%B,^W§- a.?h,‰èŸò¹—¿.E>‘´ìœ‹òÝPPUè¤Y“ˆýnøòõËëa<žÞN8yDQ{q-777‡Ãá‹W¯ÿòßþÙW¯¿Ü»·on÷÷J”Röû}ˆíDZŒ£EA=ÙP̠Ţy§ä9ö•žÏ&jf¾Ù,Ò ÃXIB"fc’\”t†BH Ÿ¡ ØM–aq6ƒl­ÇqªÓétúÝÕoÜ„µæf£»(Å‘mHkº¢_s<ý äÍ£Õ¥ßj‰…Ñwö]Þ¥RA®á,³l‹Šµ¦«v¦ù¯²{è¬HbÖl#_꾈ž* ˆòa@>~ÛôSþå±ð†OÅš¥|Ðit1ðòQö´á9  py$’ùÕÞ!ó“2ÐñÃ?¥î:":û!)½Õ"\èEUÖb?Ú7WW¥Pç©Îv‡ýn·»¹¹QÕq¿{ýâåXŒÞîïîN§{3+¥ìvûºÛí†Ý®¶)¢ˆ©H)ƒê¸Ë#I?A-)Ík³e,qkÍÝ‘T¥ì+ÅHšÆ5ƒÑ„е9[@Õ%2u/šÙ BÒÝ…±ä–kܦÃ4Õ²q:¹ §S5(-EXi)ùûÃkšW0ä"}˜@jVôs]Å ½P‚œê¬çN³^#nõ)ø<_^J.f y5ÚŽ%€Vô~b@³Éª/DÖ%×Jvyš€Ÿõ‚Þ°á3`#à ¿2}?|}ùÁ×ÇýʾkÔK’?¹÷÷Á§¬?(!š±uo„dOkn/…š@Ee7”C)>¼^zräêêj¿ßOÓ¤j»±˜j8à¡Hÿh¸{)C)e,%ØD³¯&TËP†$WwW"JÏH¯îµ¶Z+#²^KÏ„j?ÖŒžÅ¬ÕÅ´›QÞ̆f I!r/E³”|Ån·‹7Ï3¡fƒ»‡î9½8g.æG>V'=ºvXr ÒúF²/ R:gò¹W[ù ð¿äƒ¤+óÆÛcYYú….o¤n¦"gæ^\ÒΧj¹¸)þ’Ë·¯ïõ[zÿl¼á“@jDSºHUkª A8¥0Â#…ØœC hËœõI ‚²æý5™j`-ˆfò8Hºˆt‹`ô\¦æ4ûÅ‘Ê R< Ëø[IC ¡ˆœ<Õhq}8´ùý¿û‹ÿÁû¦ª÷ß]]Õ}ÇqgECGe­:¦ãî W/Nß½?Þ×ùm»Zï÷Z¤µt·?¸;`J…ø©5•2 ûˆÓˆ˜á{±, KÑÑ‹ˆyš‹emS³»GP*¨ûY€¢Ã`»j‘AÞnEÆÕLÆRÊ€h'¶»—/¿|w{¯®!b£}õ›ÿû8Œ»ã}\¿zù~ª§ ¿ŸçVKŸž«˜^VÙu¥QbU,UZ͉GW´ gEÄÔDºÚ3sÞc^§œ§+V¨ÚÊ­é)6 ëØAA.˜r•¹ÿny%"Ñï{|àyÏxä=IÒÃ3µyƒ'ѪÚ#æÅÍÍD¦zu0‹ÑÐÄ*¤¦ZaÆOÀFÀ~äSùâgÔÝPAe$wž=…–პ–_á0bÝí“ûï3 f¦ã¸Ûív»»—_œê<ͳˆ@¬9[:·Ü{‹È±=¹röî^k¤èxuÇ]†á¾Í×W2Ž;RnookŠe¿Ÿ‘:,,«ŠŒ€M]•ö@[.bÂÕ\„¢¤.3E „Ð$K„àõË×oßÞªêÕÕõ0 ßüñ»oÿøíë—¯†ý>ïïï¦ÆÖ¢µ©6ìvÙWü£çöÈÊS|ÍïºîH½^ •âB‰`æ¤#upÐ _ZÿµºˆˆÄÚ‡ôÔ••þ¾”¤ø$Ûõp÷¡YÇšP¼ÜlÝù/#åËôãÇy}ÝÒÌdv»Ý0 J¾}w”aØï‡ÃaÕé­}ó3ØÜÅ£¡Ša”ãýüF`»Ý8 Ã8î25‡qh­™Òá5&NuR³áœK]r•i]È—ú ÉPg O¨‘¡“ ¶‚¢ É‘d=M>×ñpõîÍÛ««›«ýÞ`¯n^™™¨-G!+¼ Ôgœ)ä¢e(Ëzmº_!=¢)0‹÷ï"ªàê)è!l¸G¬º®³À‹—_Ù°8¥!g8wYtøüðæY§X>;¸îy]ë|ü~xôJ¾ÅÔTý<yÆOÆFÀ>²´löLpÒ‰œùïòÙÚ 2ËG.=‚ñÁ\þz±Ãjí‹ã”ˆìL¥©ö€Éýåë¯D*¥”aâÓÜjé©o%Š@†¢„Ù°¿úÂ̆a·Ûíö»ƒÙ0Omš&Û—wïÞ×ZMøâúf?îZk§Ó}D½d…õP­[@fY”Ë©U‘Qà (àH-›ÀAx]¥5¼F´ï¿ÿaÇyjÕ½VoîÃ0”2~óÝ·™ö-…Ú£ð§ÏçåÕ¸ü¹Ud .’¶*ù¯ÈØÈrzàÚ1¬¡$}A ¡H@œK=øòlˆÎÍÛy½”½_9g'-RíêôrŸ«…HO—«þèm¶_?3[×—ㆠ?oø•±6ò@µ´ß¨œùöÁ[ž š…¿r.´þuIGžC¨‘7¯¿431uP‚^ÛÔNÇã$2'PTuvf0-Ã0 ‡d@FQ-»ñ°±ß_Ù Q㈣Gå`©W®°©Î\Fû‰Hޝˆ´È­Q¤\ ‚L–KŠÈ.öÔ¿ ÔÀðê-ÀêÇéîß|ýõ8îÿÓïÿ~wu}ýâÕÿúÿŸû‡æJŠ3™gÚGŸ^™~A¢ ¡ý_5 À„Ìò-¼µ$àˆHÅwO8£®Ég,A6€ij˯P•Õ™d·7¥+ôÒtš‰€WM\IJ—1ô“7Ï/>™»¾(»lØð °ð†_kNŒò}/O@ž¹÷qºø—…OÖ€ÉÇþ\—Û«¨%»…ˆH)ÅJ™OÓ°MŠ"RÔ†aÇ‘M¢ÂL ãXv$\8Žc¸—RÔ””"ªwzÜ•ÑL£Õvº¿KßJ]¥2Y½ž™T =¨¶&KT…(àpHs6FƒªTl(&Z½N î¬Á«ýXOóíñds½zñòë¯¿Žˆ¿ÿýïç†"á(4fÖç?Ï]ÕÅ‹j)â'I%Ó!{”óŒˆhµÿÐç/Óy~ïù? §SžÅË-w#w$‰X%ôitöŸ` úSÂ_.âíË×R5°ùYnø°ð†O£°2ÿ_Umi&Êäáå¬Dû Y¾ÌCþ2¬ïåó9ë»KæSJ)£™ªaÔirwñ˜OÇ:½‰7IÓåR†pÀh6€¶ÛÆqŒhI®ÓtwwGµ÷ïßÍuªušæ{š–ìSj­o™ñ®ˆ¤+Å’|~ðèW£–ÅЈp¶Æ9bvz%FŠçæDk-ŽÓ½”áÅ«—wóLòë?ý³Pýÿæof1P !Ü‚A?6œ`É^õúÓdo¿.><w7(E#Ò$šªªÃàÓd‚k›,¢»¡Ä8ºÓfU0¨2"D,橎óÝýí<Ÿ€ú<Ïóäüöww·jafÅö€žŽU¯÷9ŒÁÝ“J)©zò˜—è0‰YH©ÎÖpr/ŒŒ†é2W÷¨un§6ßÿÓ7¿ûúO{sóþxlŒÿðþÿÛ_ÿíõs9¶ÖØ+1ÏÕäY*¹d_ò¬Éz´°É+9>reIönã Z—L„ôí U,íL‹ˆïb¨p~Ì’0à’«ïܧ-…È3}E™¸Î]%é^.z>Äs+¿%I“ËçÏÕ† ?oø4¸S©Z Fs#%]Ÿƒ@ÎîUéÊ,Óí(Ó˜)éîùph—!‘ô¦H[~%#Øk¹"YsìnùtF!èµö§ðÃk_Ìmžè;(«ÆOe§90Ÿ¾ÿþ{¯íO~óÛRìý| ûÝ~p‰Ó^¼¡V¡X«÷cÓ`³q8ÕÓ÷ox|ÿ÷ߵÖ&²”RtˆêZ1˜ïŠŽãXŽÉRJ‘yž1 ƒ¦x€0բ꜆a¬>Õ:…h Ñ+ÃÁSDÇ]s›#œz:#š3^¾|­j÷÷9üõ_ÿÇü/ß|ùúå÷µ W»Z«Ü! OèÕV¾år<bë'ä3 jk2L3‰­MÇÓm¸PZzgñðÚèqûæí|šàô÷÷§„jmͤœæ)Š~÷î;ýãoß¼{÷îjpAʇTÈnZ¸BÃeÖ½D¤‰Õš2Í T "!êÍQ½Í­¹{›«HÈ ‡ÃÞÌšjmˆo¾ýã—þÅ»wïþöïþÓ›Ûû··ï)ÐØ]Ê@ sÅOöõâbI$ÿv²R$3˜=ÐÁ=؉@­'œ—Υȷ/ú²eKvG´õWÍå”![Ì™®Þ½øç%N–(\–_΃©/ºNd­hi·oâ*Û°á°ð†OBç6"ÇÊv‹Â‡R×`Æ<”þ”§ÙºcYµ:KX¼²¯¾õ××$cž¢¶ûwogµzšH ˆð@ÀD¡Èä~?ßýpûÎE¾¿¿û§7ßûý›ynº¿vŸJx¾q,Eit'YtQ\#ó´Þ‡5¨8HoT‹I±|ÅDu¯³7ÔÚjugˆ<Ähu¶Z}®eÐ×/^~ýõ×ÿùþá~>½=Ý·"6ŽÞ‚tàÜ”£!àå\]ü t­ò%'Šõ³÷nqÈT³ÉÉeZ¸Ï_XwÎî'y¾„銭â`P"DŠ™k´îU—v¥<Þ¢ÊHWjU’F A:–Ê’ßîË õ`H ˆ!’€õçRÿ† °ð†O‚ªŠûtšPÅ£âºåp¬†Ï| OìçÁ¯ü0Ä] øƒÕÀƒŸU…ˆL­Šðþþ~Oa5Èæó4µÖêi*¢™ü|÷æÍñîžN¥ÖÙ+0×v{WQßܾ›EÞïïçŠqT-G©5DBÌl(¢ w_‹¾—]ªj¹œQˆÙš[è\}®îduzÀ!ƒZKSåÚ¦Z§»{5Ùïw¯^¿žçùÿû»¿;1†ëÃt:Í^9Z)Ë8IÿE²®.Ùwá,aˆ»·Ö ~Ý>çûš™ž‡-öûD×K„À¸æ‚Ïý»’–Ñ™®È˜Xè"ö\28¤×›³ˆ+DΆìá-àÂ4¶Dù8©¼¶%³%€éhºµ!møDl¼á××à| £3ß% /Hß^ººÏmý‘¾ÌË 3.èüÃ/#àÇÛ°Ÿ± ˆˆ"s«ÞÞÞ¢Œþö‡ïZk A÷unàß}:(R¦ê5xw:ýpû.§S…¼½{߇ë«yns«ƒf›bCÑRLÄ/j™ëÙË8๜ÑðnÙ¹Q½ªòTë\›‹6§C‚8ÕP‹˜¦©Î3É—7/ûÛ¯v7W·÷÷ÿø‡·8À‡á~®ZlÜí铈€¦šz®œiòCÄC‹ÊµóæC ÓžUî™áX²Ö U_ÈÑuyEˆ>ÙãrÏX8ÞDD%"+Ò "­9~\TÕ{“‰C‹#BµX·ÏõäÒD•f­ ] º.êT>&ß°áǰð†_ë“.yïáëÏ‹ŸŸ™šþñHŽ_ßKÜu޼—T"ŸÜO­ÞŠšðíí;ìWf§zjó\J¬´¹Õ½ìœt¦WèÂÆpU޵NM¤Ue Í£UaVÔŠ¨I§-!äó>¦(}2ýˆÚ{éq)9æ“–K³˜E|‚vƶWA{óþVjãn7ìŠO4-ó\ÝÍ›»¿½½=N±ÓÜdbœ¼Ê0zuªìv» 5\¢^•¡†µý0šhѵÙU¹jy¬áPÆAÃ2 S DE ¢ 4¢‘sõÓ<…3ŒªŒÐb»«ƒ eªsE|óÍ7‡Ãa®óXÃ=|®§»y|a}L}Ïý®ÓyŸ;óËÿ®Xix%ÔÖ K·.§>¢ê•}×ÌsˆKг8½$2ò ‘ 0„¨JPM($!à‰®ó…¾s-z®su™€~!XjÀ}I'@)E`#‹ ÁRªè¦€ÞðéØxïƒKnã¹ó17/ìûHý‰ŸûÀ¶Eh\ôÑ>æl0³bFç4MwÁ¾|ýUkó8–b D ŸÛ4ߟöÇ㜚Sf¡bÕC`Ã0´ÖÚ<¡ÕÃည]vØ쫪BP´E÷ž¼LÉÇñÒ8"Ãb‘ TD€ˆh­ÍSm (ªV ÀÁÊË—/×תrssóý÷ßW¯"²ßïç©¢4î…‘¹~†ž=9Ï‹°25½æk×^[A"‹¶XP†béuç= ‹n=]6È&VrXª ƒ°ïGâãeا¾›.i†i›ó­òà’ˆˆZ`´J‰RJêµ6!ô†OÄFÀ> !!$ª,€‹„†“"iПÕ4ÍÈ‹9e cßže|æQæ}j›Ž'f¶ßï÷ûýûûS&HÅT ás­K,µJšóàKr©™9`!ËçýB¿–™çôiÉ(«›@QÅ[»»»{w¬-îæÓÔäë IDATªªLó,Áý0P FU~x÷¶zƒ•ˆ GhD Ö `µÀ|pŠÒ òâL~<;!+«²ÏAZöölgNnç¶1ŠÃqicEz÷iä`ŒlJ /¦S®•ccw‰-,Ùt®D\ÞË—•|Ý=ëß¼¬\¬·ëú f‰DÁþ)ù·M‚µá“°ð†Ï‚‡‰Uþòö;߇ußó»ûnCö1ˆ‚Õ†ñ3—“6<ÄFÀ> . x%Z\ðbÖe×4òÇöˆPD%¯zá×yçXªzùJ2„ªFvã0 ]ùº¨´²¹–ýzØú°¯ID<‚8H ,£â×à ¨j2Þ @ˆôüòªè{ëíªòHÅ-9zØ›û›Ûwzª­1\„‚l^m2Ýkã0ì÷(v7ŸÞßÝ}óOßÎ-Z«"6 ƒˆx°N¢4S2$ÛrŒ¤„g:÷Ç»[×äóú•“¹ÏLwAy=`^tH·/8 U%Ð@¶ê† #¨% ¤ƒD2¡.î/"™ÓáÝèrñe“‹”ÃrWœk½køû1ÐUTÞG8áOÖ˜7lø‰ØxÃgÁB¿—tûËU‹LI©9WX.(êñד?PÕÖNe´W¯nvc™¦i®<ç{5ž‹6*-2rz¼ª,ŸÔ!Å&ó©RZ€bªxâ0H&7;i à"Õœ=¯ljT\BCl §6¿¹}/°ãÜæ T ¥ˆˆ¶êí~œ^ÔfÅg¿w÷þÛï¾»=žÌ†T\©ˆÓnÚƒª5bÉ3¯8ŸÑõôþÔ+”«“¾ˆ‰|eÙͲîꪩe9tqŠ‘"JIž"ê™!w¥:B).Ñ—H‹¦€D¡äbH”ËœàäSQÁ3#–Kk¬åà.àúIX2Ò !hŽ,ÍÇS_oØð£ØxÃçí1×`”]*õa ú¹Ç½ÈÒå+ÙcºL~ØPt™KÄãæ¨üÿ‘3Æq,Eïîîæy.¥\ðfÐze0óÆb­ÙPÆÝÎl˜Ýs wÚø®_öée˜ÿ§}Ò/€èóƒTÄ–AñÑOWcToqw<ÞO'BïOmšÝÊX.:sg¸Os¼?ÕÉ1·úæÝ»ï~x Øn·có"EÌT¦#ÆÁ.#T¹¸<ÿg£Oá3 ¶6 å)w_²ùçu»³+·g…K5aE<“¡( ¡!!¡Q Æâ¢FmUïEPƒ¸ˆDÏeHt²ø5ò{­YŠ5 ""ÙŽ´6V‰,žÕËćælîj†Û6|6ÞðYÀ‹Ö¬«šö§¦ @"yqyŒÀ5òx«ê¹uå"ìŽ5ˆržgop÷•µÓkJ”"¢¢)›j­™(Õ.“Ø3•qP-f&ÅŠbiì•‹ðâíœGž»èË èg×·¬_ÊÝçyžj½;ÞŸ¦‰2Ls­ ¡l@€Î!.÷ǹÝÞŸê<×J˜ mᥔÝnwšgÉ®\v¸GkmñÂ$û´£µ­ëG®oÎdÌÍÜ‘mÜ]¼õi'OçÆª Ñ4ál›Õ¯—,ÊvR(9,É PP aK]XÄó˜ÃU =7þ õ²VêË °+d¬KCY:Á2µ-"¤´ðÆ\£PðìeÆŸ‚€7|.\RìBK?{'ËÜUýàñþ‘üó£´»—AEäx¼Ë<¯™q±û'»÷’¨¤kžç± a4#µÓÃ’TU)¥Œ»Dk­YF\gmá=¶‚°†Èë±EWx¯1¾¬L²…Ï­Muž¦é8×b@Š©™„{s L‘³ïïOwww§VË8è0w­Ekm_†q[„;ePÖ9gÔ×T%÷s‘ör ñ‘ëryvÉ3¿>‡Ë ´Fຟ<Ã"B:DAh&>‚è©Qí²,’950ÖDH_L…ª¥P€™|‡ñ©…ç“Ë›³{¡P×u›,J:UÕX3éyžK•€7|6ÞðI ©* f8@ŠLåegHÖ7$ͳÓôQ›I¿|åüô÷nÞ/Y *€hnÖØ¥øGSm±„ÝiU$Òk¯êª¦RDDdŸ ä Fصή`û®ýwò—&Z[k­–qh Qµy#Z ˆ9ªs?eƒ ³B 'ஞû6íÉ^@ÉITÂŽA%¹g>ë8Žãž­•RFJ•G†U2L(˜b&EQXÙvÔ±4EƒËn‹Fsz‹ÝÞ¾Ýívåjb6õ'¿V9N³„†SÅ©ºs…D(*\J¹½PÍÈÑ9Ëy]+ˆ2ÖT*$;¸2ÿÁ-   sƒ¥ @ )Ô C4ªÒÊŠ „éól\NÌAâî Õ;¶ÚÄT¢"Z0¤)‹7:a:¨jФsÇQUƒ€™…ÀÝéRÄ€ø`ÜçVÛ^ŠèÝÔ„výÃûÙ_ï [ xÃ/ÇFÀ>+’“Ãgjæ*?]=‡§*»?ázÄ#1Ïs¡í K(³ô³²=éfeÃXJÚD¤é?B0 ÃnhN…ŠíªÁJ‘+’슱5º¯íò0¸”UEƒÉpˆ¦ì¨ÏÚs÷ÖÚ<Ï™¦){|½¡I Ù»—Ö:I6gÒ“M®q<SÎ}8òKMÓ±Ô\š„zˆÀTCѦT3üñ3üA£ÑòûúÆE‡•9øG(ed°V^…0ûk/J¶ËOýtÃçÿú6‚³a8+ÃyƒñHÏ-‹ÖMºXŒá"ww¡T£BUafrá(ªª„jŸ½I 7|"6ÞðùððñÄߟ >“éKºû0Íøáö"ˆ áƒ*p‡ 9‘©?öóÙ]J¹½½ÅõͰ;`5j!°ÛíÜÉR¼Qtˆ€ªÎì­i"AÂs;ÓTm'¿Q@É:¢Z’*¡ÖšD4@’„kk­µhŒ¹Õ<'j¢©¼X÷ýÈ#ô‘Ü”C˜jÅÝÝÝ~¿¿¾¾>ó<·:õ¥@„{Nrw=ŸOØÙ˜â9\Êëp¹6:'éþMÂÓT€‰ˆ¯Ý¹€„CNZï’쌺ØóÅI ˆ d‘ªõ4>‹¨îžrS €¤ð ½¶óèLĆ!‹»ÒN"³r:1zA´‡àcó =)È vîoKAoøl¼á3aå×´’ԵĈ_ľʺ—iê'9øñ¯Â ¼È”슞Gá}n"àNw¾{÷n,Ãõ¸t$^[k T6w§î•T±Ô8åv 7iÐH à‹RJŽÖ¿¦„XMÍ,ú»5„2=!™;‘ßW !¶Ö°œ9[pc,ƒˆ9Z̧‰j¥¨un!!ÙI±\ÅG"Áìzþºœ^Úxžþëåu¼´´Œ „!B•Z?o ^ŸºOJ”¹N̸ٲ :£XQÑ€#„9ú)ûÙˆRz5ù,Ó[ï.æ°‡>C]nŒHß«\Iää†mÒ†OÄFÀ>téAÑåWÈâÞ÷¡"éI¬›=Úx剷’§EQ´˜jDxm$ŠH)C¶ì‰ "¢ÖŠ`E&¨"aÆ%ŽÝíHëÑ -®j§³ …3±î% t5Vg ©=›6¢ÅZ s€½;IÄA•ôjÎ^%Ä’â¦ë2­^åÁºdµÖZëñxÌ­®÷oQfsU˜àkÀ‰ îüH"zÍÛgw/É3_&}ÂeO00“ÍLWÎ@ä\A%E4¡ôB€=lRZ%xçé Ê%ï ‚,"óÃSHˆ¤¥AÒZ!†7Õº(TUz“%ÁîF¶ƒC™E_]Ç·úï†OÃFÀ>.ë¾X‡ áÓ Àçí‚\J ÚL‡ÁŠZk9ï€TÔ½‹ÈeŽ^§Sá.&êAU 4o‡Ýžì#›§L© Ìëœîý5¤[UZÒHLç B²Ü+Ò7ÔÖæŒP!ÑÎÕ3¤< ¹t=-KÏSž) »ªfÙ¥;»a8Ñç<˜ˆt_.µÎ‘dbü²³( x —]°‡¿EM.þHÂLD4x.늘¢yË×t¦® ¢"9cq…ÌŒ …˜¨úÌI„KöŸëi]³áé\F¨¦ö+H´Ö„pÏNé…”Ê 6ÞðÉØxÃçÄEì ࢙ègîæ§u{\ÆÇkd“¿–>ŒWº”Fƒd«ž ”)÷Љ|!à`vìx4“ˆÈA ðåÕÕUD´î‘àFj)¥¹žV’Ãw!ffÁX5‚¡ÌŽØ.8æò'åKJ«fYgÖ>>¥²|ÉÅçYHÎó\k½ºº2³’#ó8¢Ûqš> Q‘´ðzÖ•RDÎ5…oøl >ŒØÎ¿<¹þÈÎ~,Yý¸¥d%‘vlÞ¼a¸Øùý˜Ù8–œ‰Ä%t(A:øÅ_ì÷{U=N‡Tfã("­ìZkµÖì¾m-ÌÌ‹¯nˆ½ß×IL4Y/ÏFD,V\ë×"rÆQ*­<"(ªE5Ô]eÚé…‘ÅJ™¦iÕRµ<¦ˆq‡a†a¨ÅÌ¡P3Š«*îS“Ÿ–†Úç®ÈƒdõrÚg­—YIg*¿T L$çn¤Ïöú½Ö†,Kެ ðÎÊ$:›ÊÅ© ©³»7ÅãÌ…Ï#£^.¿ˆÕ¼ŒÙ“œÇ5ÓÈÅ_uÆŸ‰€7| t¡ö ˆRœ‚hrnIƒc’„/ŽЪ’+kÊÙ"CÅÒPYDz!•‚ÓŒ¶z —íÇ@#)ª­zÔaÄá°³šéÖïZ‰ 4М ŒC)¦ôÍ=8O8fye^Û~Ü×Z÷ûwûaµ›êÌÁt7®nn¦Ów?¼ÅÔÊ`fv<5È F Í~r:…4IŸ&dâT¤B¦d¬„ÃÃ Š û³4©Í}ð`jAôÞïi(©qÝ%ª‰@U…©B ªD;V@öãaš¦æÎˆ7ïÞß¼|í¨ZŠ ELU1Šû0ŽÙ DÐ<\ESóEG ÕÒµ1¸ŒKÊùOdŽÜ]Êý ŠìƒN¯kDð\ÒÍÈY3õ.!³FQÂD¨Ñ…µh¦""qÖLùhDvT¯Îàû€f € Ì=b>º‰ˆ•®_P†„t9[T0Z6ˆK)„{¿9뚦:@0ÕyΤ#üÜüúÿ£Úð_ 6Þð¯ Oæ¨×*(ºcу×/£´t"¼ÕÀÌŠšD׬ªŠ‚ªèh:Oy£G)š±ooSémÄeؙٸ?\_*î~œ[im_v*³¸76CvcïrénÉýP#ÒN‘K¡™k¢3VÅÙÔ¸J¶1-ßd÷óJåp.E‘¹iŽ’¨­E„ƒlRkyžX¬*…\gQô0S–µRW)Ÿ³Àº›åÇ®_ƺ™k>Wˆ^Íl £t'/D0§mô0™ÊÅP¥7&Ç#­òc=Aï1Bï rЏ…¯k»5¾_÷¶&DdU6sÁ€gwÙò®œu¨úñ“±aÃDZð†Ï‚5­*OI¢J¶î¡?þ÷}¹üÓ;IXŠmèBå€2˜©ÞùŒ2ð8Ï“Ïq²Ã0³ÈÇt÷®ÒîýÛßý™™ls§išŽ:ö72U’œ¥)ì4ÕZkm(š âtÕÈ$p‚c²o’GçYHuЦåa¹‘dºçH%Fô¡Ë92ûÿÙ{·I’ä\ì3sÈ̪îéÙÙÝÙ].y(’:Ä‘DÎ$è|•tô×ôô$H$àƒ½AÂ!Q\.÷6÷¾UUfF¸›}zpÈȬ̾Luo¹þm£¦*22ÂÃ#6>7³ÏÌBÑîæì@©·œöû½®£g÷l÷`žÖ‰ªfÁ9@ÈT#,µÈ*_ôL—}‹ÓWç,,ÈÜZ¸JÀQ kôU&]{ùN RP¤0`ùÓn÷ŸQÔ@Rag)¹=sp%àeJÌ„<û¹q`úã… én`­® ±pÃCиáýbi²,­ÛsF̹œ¢ƒ)HJä‹M±‹w¥Hi K*ª‚„PɵД]ÌÍŒSn Üáp !„}ßw]'2Îf«LÕ9º®“ûõšÙö·ûÝíΆ}Ú Ãv—(NfÉà§Š„ ÐÞ`®pAP y2CëåUÇ:JíNei¢q^:SË„ÂT¬ÁË©¤gC_9Ó cæv¿»ŠWžK£jr«DLsX­h@wOËñ§^‡DçSµû$oRU3›­aÎ2èC$X&ÝÖ|@xmTUc®Û\éõA• ‚.p”:c‹uÌqÞÅYóì- ¸3ÅÝf0ãÅ>‡ oFÀ ï§ —c¸gá$ÄÄÁ³õ|éÈ'‡:Ú“&P„¢ˆ!hH•.¡ÓñYàŽìPñ AUÌl†GW‡1ÌDd»Ý«Æ<Œ_~õôÙÓ¯=å»ÛÛo¾ù†Ú ˆdav–%Â.$mÂ|j_Vž‚HPˆd:¥ž²OMjQSkhÕs[‚È¢¢³+Õ½6¦(AL°UU¢¨ˆÑÝsŽ\jJŽÖ „M¡q(GÝ! :©ì Ÿ-É·•-UZå礅ÖÉqðJšL·øþïËÇ ,GA¡Ò$”K*-ËŠú­ÒôbydŸ.ϵxK%sÏ€-ü-g¡¡á€Þ–޾y Þ˜_ç¯sJ6•syñzåQGá*ˆU-}ÜÌŠ¥Åɧ]âw˜L":̨4‹?^¾âKŽÝn÷õ×_üìoþìÙ3»ßÞÞæ)ë7tQ%:XŒæ}>²Øæ0z-Z)Õ>tA®µ¤ ³ÈÅ&÷øTчê'Ö gO^_”Ô¨ˆÊ•.D³Eƒ)™‹N@iÆ2MS³6»ªëøb¨2÷¥^Æì1–E pµŒEtºÅvL{..^2­O¨÷äÏùòIÎ1‰@‘Å;uºpŽ)àÞ£¸´zï}Zã¸8Âa½ÒÐð­Ñ¸á½àÄ^𹝸Êý-îU;ðžÁ|üÅW ˆŠH§!Æ8»{cÀ2{ ‹òÆÙ! Æ8G KSÞœ3·xþüù¿þëõõÓg¿ùì‹/ž>2ºUVë ]œHYG‡ïÍ,jèºÐ­ú¹‘ðT±J iT‰¥/4Ë}ìxŒÃuó±ÊÑH*6/= ¥ùÒLûÒœ‚Ð÷}qLÜfît/EBYìÑnŸ'ùXV%© íÑ­A‰»Á§È+P„²-i,•¥®¯¯ËŠá;è°ßï“å§OŸþêã×OŸ½öO>þ(^?\Lb\­ÔÕsölÌ6»qLÊSô»ÛYÀ5s0‰‚P«Wy-(Q yaÔ U»À\-™ÙTq”Ù¨.V3gÕC!ÆX´`)¥œ-gø¤iŽ¡°Ô“œ(3”È"•›g³óÂM-~ÞRs²rî‘€Œ`1¸Q<åe)å¢RNè¥?` (푪ë»Fõ½±ï×½2„P8P5„RÞ*‚º÷]oAaX(nh€ÕL²4!Ô˜êIÁ<;˜¨NRc0«…ÈÆ®r#ù.cPtëœö, ®Qö#=L ‹ @'cÓ¦®FÔ)½…Ì05M8FªåšLè¥l«|É…GÀàqÆH‰ ¨Óm«*N(Y¿å±åÃ3?Bã´p)µJŠ UŒ¹ZÆõŸ>• ÅcN@„h¤æ^è¥ov;E„Ð"t‘€ŒRÉ¥¡á[¡pÃ0¿¹ðË+T²Çß}…)³Üí ˜}L&á™S|¶%$)sGbáñGOú¾f aÊ`$‚®F÷¯¾zú›/ŸîÆÜ­ûg·#,ס“nÕ¯W‘¾1ÄÉä¶§Š0Öâɳѿ0Ëî{×RÌɺ˜X Ç6ܼ֙KT–TUwÄ€Íja$‹<Ÿ%gÖf½³»øÌ]8^© Žvû‡Ÿ,çýôCw(jbR¸Š:æñTï±(A½ô¼Ôirp—-J1àÄe~<Ág¯ô4²þ&OiC÷@#à†a~ÝcáГË}RO\ˆ¯åà‰KÔ"¯g÷¥×‘ )ÓòÔ39O±O˜•^=EqqgÒÌ!¾ŠñÇ?xòôùKKYql¿CÞŽ×j±NÀ‡48†>:&Ar'¢µ‹Q¯ú•ÔªÔs·Á:0Å=^LÑC‡õÍk–«“é’2F³Ã±¹î¯¯¯óî6{‰j€ (0Cè‹*íÞÜ΢e¹ïæO¥t5ö’÷$§_Š š˜Ò¹ç»² â\j,‰ab_BÚt¦jZß÷*“³×…Ë?ešR)öq™Þit“Ÿ×røt†jéäT¢ÒÓÊIõBVTCápÃC!S$ìM¨qþÊ=GôEQô!èv2[N-à%fÎPE  šÙó›Ûõzýèj³ZÑÆ,mVëU¿ù“?ùÁÕz4»Ùí‡lö˜·û¡‹«»­FÄ«°î7ëÍ&t½‘#-[‘Pz †(}»^UáÙbì‚èlŸÕUËåee_¯…HŽìÍzaÄqã…“_&¿}PdÁõf³îû§/SJ)Síꇠ*ôÚe Ôœ^ÌX±t· ÅD®‰ÔE;-MÜÁ’%‚ ج֖òÝÝÝFúø*Î6&Ú>žÝ¥‘½p!~èl™Á+Ë#«¾zyKAéz|'ŒH¤tR”ÏBÃ$+N¯â<%iQtXË”r^sú.«°ë0Èy)Yæ¡pðäâ‘:oSÀå#ihx4nx(–NÝׄ×ÞÞ½l¢ÔWß«Jü³çwþîÁ²,ÿX;óv·Òï¡þtUJ ^©=§Ö$í‚èIŽmXLÃR—ÅPïüM4öåò¤z*ªÂ pÃѸáA!ˆ”Ü_._¬f³Ëîè½VÚÿÜ'ÈKp˜R8÷£¤4½‰E8§› ,³‹2-çìn!„œÓÉ‘Ëi³ƒ„– Q€¿y¹{9¼üôÏþÌÌc»aØgúóçÏo_>~öÍËq°»m*fÙÝÝmìôEÚ’bfÉéFhP‰ªjEͫʘ´‹åÅ=€èç"@¨ƒ„MŠ3™’•Ì r0pKym™"®PVY\e`ÇÄC^…FÀ ßiȬÍÀ× V—99óžKvYÇ5x|FUÝn·6Wî.îÅÂ+­Wì4ôasÕõ«MׯŸ>¿Ùé*ö9ç”ÝÌBJÎ9-e3³ÒdG'f•Òÿ·æ! Iˆ;‚@HÏfc‚в3•Ì&t…‹sÖHG•¢kppt§ƒ¡ô¹Wé»èàû}2Ên·'‘½þ¾d^I-ÿtÖ+PU Ÿv[îpä‹^ÄË9?—…{ ’P„€NC¢Aj‰NÀ›»z”©œ3I·)˜o¥Î7'ìtQ‹ƒÊ*·¦vµ½¯Ì¢28!q~*P ‘–h´KŽYƒs™…ÔÐð@4nx/X2Ž^ÙoûòÒ)S³´¢—b§œ–ØŸ°Ô]Ïl1Åù^ƒBÆåU¾Ûí~üÃOËö®ëÜ­ë:wÿ'?ùt†°îDuýøQ쯾üêÙË›Û<Œ)¥qÈc6ËLfpg¶¸fHFwz-y ¥t *þh õH%i)¥a‚X©ÔA2¥Dw‚ŠCAµëº¾ëGv:tLAt½^Ãàîûýž²MÂ(LF­`nO<³fñÐNë©¥0§)-‹˜û3yL{P¥ä¾´d2c¡ºc„ ¡"AÕ9<­œ¥U-3✲– Ÿ'q–Laà€"ê’ñNÍhVÁ•8}ÙM¢ÈÁº.ÄNU5ûÐkŒ™q"û&Âjx87¼Ü7•æWüÃüj “ðjIîçS‡+¹ îäDUÕqŸ®®®J–mˆ19¨ŠÈOô£í°Õ(™Þ­7®Lã°W#Ì„kËD…XÉzu‘ósF=éd A¡„„Jò .?K|·Ž!ʪïû¾OCRPr¥œÂ ªÚ÷}ÎDÎYB)¨u´h™üÏ•áÊlüü“'yr&Ï“ßi?Ûu‡¥'Ú¶0j!Hi<Åê…\D½4ŽýÉRç£,.<%´_Í[B  "âžÝmzHÕXÖ¢œ.¥¥t¡c#T&ƒûÒYÞ €Þ –†ïQDáÞžå¿ç£{µ"ãÒ®­oâ¸øŠ—]ˆxˆ]í@S‰P ÁÍt9¤Y4䩞ŠþcHž}üñOò÷_~ñ8èÇ}½ê¯¯6‰\­¯úVHÊW±S €þø‡iØîýù³]\wÃhcÆz½v—lºŠ„;E%)µHUM)¹›åä‘Ò¯6d’ÔTåzØï!ä1iÊX‰${t†G×ñêñã$¼ÙÝg'T„XÊU­¸¢éB¥Ñ^1w§H¥j¦ÇæÙÌL„wÏýÑß²¹Zobß™HJƒÆ°bp÷œ³Ðû.®×ëë«uß÷Ÿó"¥”söã…W¨“éGª¿³lšÊ¬Ç[êdÏÉÁܽ I2¸=TÖÄfžóDE„æã8¦4(ñé#ô1>ZwW›µy1 »´<‰ô‚¨]BHFÒn·ËÙr®É²“•ˆ@T¥´]RWÏïŒF¦ÄàÃïª5 7õ¼ó$¶R™9g·¢×¦;¬Ôñ\Ò…kl¹È§V %âpÿÎgCù½ì<ö’€çB^‚+‡sÉ9×Aïûuv5"gdzD@t54|[4nx_ø \HŽpÌñ=•€0ë°–h,¿Ëq’ÌÙØg¿Ù«~¼Þ¬ú®ëºÐ}ô}cîV}èã8îSJ–™Rº¾¾ÞïÇìÈ†Ñ Ú©fUuªq–òºÃŒî.èšàTN*$ÝR±ycДÒ0ìÄúþ÷>~RZ…>PÕÆý>§mÊú *]ˆ1ƨæÜÝÜŽã8Ž^ A×¥…Ôœ"*4@Ã:¥8a÷#ßÇ⃫yj‰QÖC‡=Kù/8ituÐHw s‡ËU€"¢"^ÖWåð…[‹T9qˆÉ$ËRLùQËξ'’±V: /RfWU’¹™dC6J™“ˆ¾-7¼|( ¸¤êr’áXv¾3–±²OJ |~³íºîúúúêêj½YíŸP‰¡ë:«aèºnµÚ¬ú¸Û¥1Û˜ !„.îjÆ’0˜ª×ÒÙ÷#]ñ<6§Á÷ q6›U'èV«~½›ëÛœ3`E8¢»—0¬sλý¸ß»Æb_8±/ ŠQ x³$ÑÝù®xƉž«”à”9\: h éÆ@SD’Uþ-f‹\£)j)Ð f# $èp/4ì"µ¦Øg‡:7ò+U£ø·§ŠÐz»‘ÂÍXÊv(ý\½’††·A#à†÷‚ß2ïΈ1 jíÿ& ¥4ÕiÒêôûAŒÉK™ö©‹1¹ÜìÆÍvÈθê×ëõ­ ´+ÊdKã~@æJ{呟™&f–““´ÌœÊûÜsò²‘¹–Tdmi@ÒÜ]B ¢.h½^uýjµZ­:½…ðìî¿þêvëQV›ëœSN¥Ð³—žÙ³Ä©ü¤”$&AU‚3c©©UÚ÷½»[PfôÈÌ)B9™êŽÍ{г$TÂB¦dôR&º¤iKMRªJ‡Ènùo%ÙLJ¦—)L ÌOå’‰EøBøÅw^ÒÀŒ‘aHê½Uoz˜"úMÝð 4nx/8‘½üÖ ªœŠ —-œRzJ«×%ûŠˆ;C^Ód%lŽQÝ¥|·ÛŽã¨6ãþvuµé"`ãÍ‹—Ï¿þf÷òV²»¨™åì)¥q Ç<Ž#‰aKJ®»§T{(©£Ô5”¾Î,¹ª‰•ˆ½^­7}ß‹póø£}¶ç/oþþóÏ>¿ñô=,ïwîH38¼ÈŒU+÷Ì|#Ré¨ô*"j0s‡¸¾3x‘ŒTýÞ'T%‚ÒCi L«Ò(JÂ)n€¸³dPH™<Éó×¥$ —Ô,NR, ¨†,]ŽY£y¾ûî“ï¸\ˆq!R§ 2„pѱøõ…¾^‰FÀ ïKÂûí ú Íã”Àª¢2—–X8Æ—nç)_´0ä û.¸áæn{»½ûÞ“GwÛ籃à1)ûÝÝööÎ3û¸=«*`¥ñÑ<ž³P©•ýiµ±,ŒÈ¤çœB¨Ù¯%·ëBÎytÞî‡o^¼¸Ýyôëàîn‡hm(–JMTÏ=0ÿ"D¢híIPà„Ë»ô@Ï‹ŸeÒ𒀋mZ¶(¤V锪˜«¾‚Ú÷i6s!¢¨ö­”ôÜ"ÿ.»‡ $5ˆEtâþ“™K®®i‡é‘T¡bfÔN a½³Š‰‡ßÝ´5ü.¢pÃàîs mz½8*,¼tG'¯ª`­R߃‡6·õíÊ Õ]|j,)?«YT"Õ&NŠPGF)ÊOU™¸–$CJDä4R%¡p)76^_én·ûæ›oö7ەƧžoooÿöo~¶ê6_~þÍÝí>*Ÿ=}éˆi›¸sWæÝn¦lnîžÜ¡Šdõl£ ŠÉê ôHQ˜¼L9×L*pï‰we’ý·Ÿ1fÆ1¸Ò\¹¬P I „zé3X:C±5sË¥¦bÎ#)Aåµ¶%äT\ Õ… Kˆ)èv̪ˆÃMCÐ,L–× E¬\—ª‡X–AÄÍ’Yšƒè‚󠪬ū»Î²§”D:’f–ò–Õ¶õX\Ö5 ¯Z*~•|5UD ]<`2Bò»™®†ßm4nxg(É<"‘îkàwh%Ï6Í9YH**K)ïvÃêÍËã°íûþ«¯¾úüןõÝf{³ßíUÜÞÞ:ânoÛ]BÐÝn·Oc,®é”ÍŒœ40[ˆmЏ„½;)F|¾O* Uh‰œ!QœÈÅ`-W àBy/ k÷*!€;¨Sa(Lê£ßŠ”è>6‘ ŠèIsiG‘ƒ{·ÈÖDP¼Îî,ö{QH ˜†…‡ƒEñUBû¥yE5mg­›N­;°f­Uó\J{ 8ýCIþ‘£pûÁ¬ˆ™ÿ¼O«<ªÔÿ^^iÇNfLI)gv[æ>\à¥ã8¾¼¹ËãðèÑ•¥ ÚþöF,éŽÎ<¡ëÝZSe$„¾ ¨a ¨j¦WÊ4QK[ 5aöîƒ{6KWS' ÷"c&‘¥’%Ž5^ðØá¢ÎNÈÑkïcµ"4í½W”8qGWþ›Ú.¹CÄ%€=p]ÒI©ÈYËzWËÕ­Ê,jmÔ˜„ÕyoE'Þ7<slõþ+j){Y²àd¦¼¾$þz[#[d6×HÇl·˜Sº»ÛÝm7]|þõ7»»ý0ädòâùMìÖÏonc‡Ñ†!…‡ý>ÛèÒ圇lîµÝ¯gæœû0ºqO& ;Ê6çåD8¤8ÉáP•X™ÁÆT†L)=À¡Àî­CaÊ弄¨ˆv¤Kr3«–¯ŠBÅÞ?ŸLl(±Ôš\›¦Eõ¨×z""jw–,çI ÕXÑ C«Î2èÙkÆÊW­–æn%7Þ7¼3Ì.h¹¬}ßðS\šË¼Tó÷5:mU1’‚L‡£”dÁ_}sws»éâ7_=öiÍn·; éîvßuL£íÇÔuÝ8ìÜ= ÝV$¹0r´œ<›rŸÓÎ0HÞ[Þ€ ŽT)M”.ñƒ›¸’o1§ÊV3d±[a2-÷"¨ÕL³‘¤º{µü^ße÷Á¨’+[0MAý¼ÔÚÀ$†ªë3U@fG…’’Ó!gŒ„ˆŠÕ0¥9Z»‡cIÍ*ÏÀR=U?©¸Jü¨nîi·ò¸Xs@7¼'4nx78qAãœÕ{äõ}?^½#Éñ‚€ßúl ñâÔ"âINÉÔnbÊf`ö;JÌjWÖª*âAT!Qƒ Í!Uë[† š²n%í€-aÀHl hÄu¥Dn-Õ•qØè‡jÍsáJ¿À¾¨V#¢¨N¦^)Z‘Íé(æx¥"÷w™ü: óÁ ­½B…YúÞ—'¥8Ÿ ]’´ì³ß½ˆüè ƒ7Lµ5«µ#ÉhÍÌ.L¬Õ1`ªOÑ¢=×¥¤ð Zw6¸áÝ£pÃpÉ})ò:Õ~ïAµƒ~Ú°îlˆúäëõs­c¶ÌùéÓy?HJ)ãåí.të—»1Ñ}»Ý›!Üï÷«.¤4~gšsÎÉL‚1` G·q£û€D ÀYëC‰"Y.™;JÝÑ+æD)¶XÕ+:¿–Ѫ2 Êœp¦dóA”µ‡ð½ ±&ë¶ÎíB+wT¥-â ¥h-íNw+ÅÖEaàÜCpÎ,ÂÔƒ0z±†…,yà5!ZQ³„S4D@>Go}Þ 7¼œ ú–í5[æ˜=Þéy9‘gÕ×ð¼µýjtÑ iméœsÚßü׉lT‘lاUX˜™eš³eaΠ²6ùiYeÉAsÐÛ )˜ º.ˆAÌ‚!Ф’Äë…* p‹RJ CåÎK¼°ðåJMrTÌŽvS­I_ÆßR ¸Lø\Ek¬û¢(¡Ú©ÏB ýÎ NE·̪Úõ±³l¥Áëú£˜tRg^ŽÎÉvŸÕ|ï}j~÷иáApwc*>ÅCÂÉù–ÜË7þŽ‹-ó>vÔenqÌpD‡ ý¥¶105¤cÉ3F:dìTqÍ+ ;TáfB ‰~3R€ÿóg÷éÇŸ|Üm°RÒíÓ›17Û»´uXaŸi±'îö)=Å­Sº’Á!ˆ p1#ÍTeÓ‰)sf„€ ‚Œ!ÃS¨Å$]°ô†®¦ÂLXx#0kß`% áVN+h§À8¦Ñƒ›ÀmèÙ¡Q„N³VyºË›r”Vt²Ï¼gÙ-gTAX¨eœ#h H'¨¥†ˆ°:Ž*IsuÀý\R“·f> iµZ… %*,…°Ctˆ 8©€–gJXŸ–ƒ »DX‡EAЙ‘-Q;EzSG7<€„¥ z¡­ùÀCZ¾«Êæ\KñéA?''üòó»—/vµÉ‘MDŒ¾].ì;QËtÈ Ø;cêª148À„B‘b`•j‹Tõœ]!ZópꌪjZᙢ(Š#(I™ÒÎS_vŽc;ovö¬(ž¦ù©ÿ}Ý}¬]ŽŒWøÃïoäTÅÅ U‹ÃY¤Ì*X¶N&²=ã»>\þ¼qö‚Ì‹ò®ÜqN™G³ò €jíâ°ðâ¶£ÊyÞ 7¼È8ÄÙ¾žƒ‹÷ÃÒoyœ2šú¯Ô[°#ò­ß`¿t¢"p XEñì!$¨«'HÙ ö^ºÂXµBb B0‘jPST)"š½ÖóÚÿ§ $¢æ :UŽT üÑò\–3ÉBö$U¤¸ éâXdì\˜Šz„#-ñ¼Ã%ãøì>˜Ø«»Z½JPZ™Õ¿NˆÀ¥&Ÿ./f&–©Ið2QƒbjSË…¥3•ÌŒÚg‰P Òæ9”š5\ŸðY"ÝÐð4nx¦@ãQ~Ñ¢¢ÑÛaɾó;ô[Œ‡ÓïßšÎe*Q<¿J”Ü tŸ\Ö½–V9 â®ðrꬒDe‹¿·ê}8éЈœMUTÀZR‘ @9ËÔf+ÀôSæÄå¨ÊñÉìÍNéå§…ŽfÊSÕ’sœs©ë ò¨/ÒP˜=̘ÌaQ ™s¿á ž†å”Îct‡“—R¨€£†‡K°ÂÅK Íòõe‰Óû×ëîZû̾$C UÅF3ç=ŸW-óGóéJ£ÈÍümxWhÜðÀ}ê}'˜õ3'âš×Ÿ*óÎ?DUãèc!Å$’2³#Eܤ„‚Y‘EJ# V…\¾¸ÝK•¥©ë­aª† …€ƒpG±é«'Ë«—ôày>vÌžpÝ pŠxiY1HZPÚPÚÑÏdyA;]L&ýKIŸÄŒ –T,` '(U5åt•êSYžèØÂ–åšÅUM_ìP'êÄ;}öy;1¦¡f´tfxÿZþ†ähÜð Ìo(Ö.ªÕvûÖ±à²ïòõz0Ê·öÃq°L5ÀŒbª£Ã1Š;)¨¢ª¢« ÷{¥0b•Õ–{Zt¼ôÒwJ %Jé¹A0Åf‚ƒNè>?žuÉbÁÇÕ>Ù‹¢*D8–J•Cû±ŠŠS‡Á‚(µ„Ua=/|dÇþ곿¹¬ËŸ Õ  )"É ˜*nBD!ÐI4Ü£ÞùzÝ9p1½Ü•Å]-iÁRˉU¥^ýÔyA+€ H®\ ;³WCÃ[£pÃ;Àä*mŒo™µñpô‘Õ2§ óµ/åô£¥+vJ0É ‰"FÔ|s†J/™3ªèº(³èV'ߦ”¿‚»å z©RÜ&ªç°D}²t˸f?ìÜFpI½ó<¸ûì7V­ZqQ•’ÈäN@¨*NPàB*Õÿ|iÙr²Ê !”-^ˆs:é}‰Ö¬nã÷Á -V= ­ëRYƒâPY|}v¿/Õg¯}‘*W9‚¨–[È9UIµ?Y¥Çƒcñì&S¼çbm­€½«R ¿«hÜð , ¯üç[ ¡ß‰úþ§—èiHø ÏPŒ°ù-¿Y #“ÁÕz½Ñ¢1ëTÜ%¢O½…Q-èJŸ•«`Ö<ŸP„Z·(°&(m €rjTJ€°˜î“ˆ/Y¢Ë@瑺úÅk(ÔRZ a#à‚¹Dô± +fvBõì^-Ô“é)ù5Í ââ>ÅW•¥%(1) J€èõžŒáÄ·,"Ak1,Îf¿‘dЮ,P–cTÑlû“‹*¿$EDý[®,΢pÃPŠ/ÊBr\ ‘…ítlÅùøæÜílزß''ÑP =ºÂ“‹„¾ïižò.ª\]o,å#3cÕ-sq`A)…((iF>1%9ÿ…©”c=Z*v›« „‚Ì’Örç¹±•*BÐQÅ]TqwNaZ:Í "h5m*a,2à©*Œ¤ˆeÖ^ô╪DDr²23X(†D$¥zÀÉ”¹„Á‘„"„–&„ (H¬zKý”›# c@Q*„¸ ÆèîÅò^жfËõôù EÅF JAi.]ç°èùÔBÍ IDATÃQÛ'€^P’‚DÕ¦‚VÆ‘B•H ÌE¤<s‡!@¢ªŽ;R! ÆzS`Î,–Ò¶Ù­ @ùˆákOjñpåq„¦…nx7|Hð•=q”"ËßUü½5^ÚCóÁßÐ’~sã[&&©lªËUgÇÀ›;Ò‹õÒÞzoheQ"ÇÙ±$».š™QÍ_!™RŽÝùcë,dV¿m­\*XˆF¦Í:eïàðÑyð2~|VV]¯za ë\“yZ~Õãûd˜jõ(È4c¤âîÔ:]§Ãbò#L_Uu!Ž›FOÏÑó3„)Y©ìÕh·á pÃÆÞ±Ÿó$t‡…}\‹û.Ô­¯>>yô2åëÂ×3Õ•¿¦‘‰ÒŽ•Aé_DDxé>3“,ìE’ZNvÆ…ëóeÎv§V«¾t ÀDÒSC‚óW'¡¨€ªÁéÂ!$—”‰) 4•é:gvºÅËèïl Ÿ\,¦ÕÒ<¼9›Ç © Š .奭bé'èt•à ®G‰F"PRBf¡³zµ1i¤g^>9_´W>sm ß €>$^k¡.ßw'äQ^šî§¨”ÊR‹^Ͼo;˜Å0EÛŒª²*¯æé•½8à[‹¯Ï[À¥ Áýíf>³Âìõ%‘s.ÆßŒ‚*/ð/*qg9]1/ŠPúB³6ÉšÎ`òD †*~ìb¬cZ.Lg›EàÇëª{v°»‹ &¢”I+ÕÅ T¸H¡ ´’ºj™B-J„«êä=©Ã&Ï?9…xUÕ›ÜðNѸáƒa~ǽ‚ùäX9uö»2™e%ú­FRNöšÁ}¥HލP ®ËÍ,"÷_åÓ»þ,Ü¡z†iQj6:Žš©ºû- ¾qLª£L–1C1Fg>=ô4n™— Åà$Ó•æ·‘I)øQB퀧>Àɱ¨2×Är 3Ó ÌÌÌÜá*B‡ ”œTnÕ–%…7h(T¹R¤ä[ÉT$M޳²Ë7Vmøm£pÇÁC,ÔòºTQà{sý-¿\âïÅžoç‚®i¼$Ju©Âæ ºÔ@Ýð›^äÙ!Jˆ ]ä ¹TSr¹ò(S‚†Šç9¥ìN!àu(Ý2”5£WXÏ€BÝî%'‡Õ}ÿ‡Egïqáý€B8Ô²>:Èœ/4Ù¯êîª÷¬Óûk*3 ]¨@í–PgëÄÌŠéàß>^~-Ÿœ²qwN÷¦…nx'hÜðÁp?Òöê}–½”ñŸ^„KßæÉ;téÒ|“ñ¼~Ÿò?©" \8KçS—ˆì«¯–§˜ƒË•“”#Û·\¿;-ä'óQºhVÒÏž4”H6@Õ`,u.!BgiRTÚ%y†S/)Å"²˜økžåé»4•*oŒQï/>fö*SX^½-Õ9D `õõâ $`s<Ø*GW8ÛÉTîÚñ}‘©Vóáë‹ñà°€U-1þ‘„)i$8u¥)önɼ:½ K?'ÏÆa3añ¼Íõwþ(5üî¢pðeî‘V9:÷!"ÙÝ–!¶Å¯ËÊUI,G»Ý»-õÀ˜¾Â ÌphD×!*IMéì8Sš{°x˜D;¤ÙY{< ,ÝaD`Ý?SP*ZÕÌe*A5ˆÀ‚†IÙëBw‚ž^/uˆ#z†Î4¨tŽÑ 1P؉€ 8€ ±å #`ÀAâ Ã\P£|r6šE5 ¨R –ÝZ¦Ò¡Ç/ #U!¬Ý‹â4ú$2;L}³Ëásó¬eÓBU^>ÍcAéïìâ~DqxPTE]K¾”r_,\õ»nÕ­z邤YJœœ$Ì¢SCöYÉ@)õ@gVVé§Û~Ð=Çîk5dwIß³î×bŸ0‡††·F#à†!U(58Â@˳£[÷g÷WæCè¦ò‡Å +}öÀÂêìþÙ΋,œÏåTÜó¯SîÐ$è @€àTwQ¹j9$¼‡£þËb¦Õ—Z÷)#1Sœów¹XÁÄ r4«.VÊ”_T³ŒÂâw‚¥ŠÖp?õxº`¨Rä(ÿ ~~÷áBôùbg¡RpcÏŽ[•q–2)6_ÂU?uA C6• N$(j(ƒ¹ºÃs âyödŸvåü'÷%ÆàY¢‡öë~µÙ[DÚ_¸€††×£pÃЉ $xXƒ’E 50 Ô¶ïÈ';Ž£ªa2éÂ6k•Ag€Λ*o» î. ­Ïç­«ö—úD:9$ 87yÎ8 0)¦îãm§ÿÒJÄ.ɸ/çÒ´]Ú_Î} r8ÎñU¿àr¦ §¼c?M=æ+Ï{ð|o· B@é90`¸:ô¯×µ54\B#à†‡Á 4HÜ0ö*ÁX]xo¿+ øÑÇîE”Iž)Èùü÷Òx.YfW?ùgç÷×óTKœÍ"©ûcp Ë3ý‰Ÿ?þ\›óäP¯ëœV|Þ¾ŒÑN1ãóÌiÌˣ͇ºàP8ê’´Ä¥ý/ï¹m-/6Lóp2÷ksMáçpÿàóþ÷eMA¸'3 1¬yè•Ãöü44¼7<Zór‚Ä EP#]¸¬öyWš¤Ý8bÖ /Þ¼¼Àœ}·y«ñ\Ú¾×ç?àÂ5½4¹ ¡Îây‡…$wq"• æbÏõó3ê÷RÏû&)ÑÇCª[ª“¥Âeº`ÃÇõÑ%Ì—V^†ðÚâ~üþw¦Ç’†Ou‘®v~~܇£#. É ÒhðŒè¿eêyC7<Õ¥B•€榪ûtÞz)Ýèmº¾¼U5”´Ñ’ dç-Ýa8»½˜þti˜ë—ç·ût½',OXdIÀõ|ÓŸyQ–BAÚ™yÑãr¨ ¾T}"ä=ž‡:×¼àQ0ɛ烔#¼­«ù"MœLT>>Ý4WnË…ÂaAp(ýE6æ‰Gú³Kùda„‰}¹‡]¾ª††7B#à†¡œ-­Ìݳ¸)Bèßï£åp¯ïˆC7¡p©ÄÔª;/ »D`~‰€Óø–=Oü^ôºì:4o_ŒóDe|‰À.,D.[¢‹£y_‘K–4ó±èk.guÁÕÿöð…ØêÙû+5é0¤=/Ì䣡,ƹ<æ,Ó?9‘﫾\¦r”(Oÿ»Ë3køÝC#à†¤{QÕ ŠRv‰xÞ4„ÚD®6¤«9 zÁtåÅñœ' »@lš?>»]¦|”“°bðGžÏ)¦hrg’©‹(É:%ogjùîa¶''q½®cOÃlÞ]â…SS\–ÛOc¢¼¸Q=*ë17/†wY_Œ_àë`ñÄ9QþœUÙ‡¡N±Þƒš¹p]RÜ»‘e‡¸Xp,¥«åaçß%Þ1É}"IEÔZ%ކ pÃCUÐ&UŽD'ä’óŽ@ƒ"”âȉÅPó‹/úË%©Îó¢'5 >9¿ýí}”…d˸.Ïâ·|ñOÃ= Ò›ÆqÈéż*à«|—TâÞnwÈÚ=¹„W_Ñiú1€íÑG‡ã„ùêˆzgû6<MAÐÐÐÐÐÐðи¡¡¡¡¡á pCCCCCÃ@#à††††††€FÀ €>744444|¼}pøEÔOóÖ =GÛ¢íT?zÃkhhhhø­Ã†ø{»ÈXkã–á ‘ ²ZÉþýÞù‡ŸÇõ£6)ÃÌÁ€[ŸÝÿí øæ÷ýê{èn¥tm»Ž|®ï¬Ý€†††† þØîÆè…ÀT`ãä4ô:A—ݾ¥\(õú»†ÕfÞåýsð]×…ÇÈWi¸Âú|¡ž·'àõ'"ž¹ßA¶yÌãN=»Û‡½¡¡¡¡á;ŸXN€Kíhc¢%£ƒŽ~Ün\:Ñ5û·¬‘þã3\mú~L˾ó˜Å†€ ÍJ¿ ¯~mcßWýú“Ç«¸Ò/Äí|Ã󆆆††XHwtÈ`)Á"ÐAW° ‰AÄ$!Z´¢àÍØ´ÿ±ßÝŒO ŒX¯¥„xe9绨½=Ë¢¡ÿÈÆGž}ÄþføŒÜ]]¯^ÿ݆†ðøÁ‡@CÃûG܇N öЇõÇ1¬²4‘ÆqTæ>P%Û»´½»~ô'zÄß „ýWÔknþÄ¥Ûct{ÎîKô; ?<»ÿ·hÆðSxc´aÌãͰ¸žÆGOVûÛ¿ùÐ#þn }±ÝuÏžm¾üæ£Ï¾\ñU÷ònmöèÒîoOÀÃÃ`Ýýˆ^úõO‡Q_¾øÞ¸þ4†††ï :dCìúõcŒqܾ ñ›« ÿÉte9æQžÿ2þ«ÿ]?ÿ¹ mº«ï»üë=àïºá?ÏñçO~ôÙþÛOÿôüG?~ôw~ù³|ÏS­àÿâíÎWxùUüd—³OðÙ~øÏþŸg?ƒ\ýô ¿¡á»Ôµt ¿×nãu¾Ù!=ýƒ?íþùð“_þ_Oÿþïÿþë/¿DìW«uJÉ¡ëÜÏ÷Éþ]»/…×b|ŸáÏ>ù4ýù¿ÿäßúw~øßÿŸœÝÿí ¸¡¡¡¡á7ö?¿zòŸmo¿Þ\íwϾüþO¾ú‹¿øÓ¿úËϾþ¢¥›¾fÒuªêîÌ"ýz½^¯ÿËÿfüßþ—íógÿB¾÷åp“V›?Òÿ!þ“€ïýчrCCCCÃwëï=Ú}¹C¸‹±Óþ7ÿíý_ýÏÿÓÿ˜v×i”=´ï6D ""$á€"$Ÿ?ýÅ¿øÿÓ_}ñyN-<³ü°½•¢lhhhh8° è7ÉFû÷þùG¿øÛ/n¿èîn[®Ñë ÀÝážó°ßÿü¯3€ßû£_3wÒgŒÏ4|â:6nhhhh8omõxÕui³ò?ø£øWùWWþ)šûùM0Ù¾*H˜éê§ÿë_þË?ø§·×n£}„à}?ú¨€Žñèñ°½IûáÿÍë/~õ«þêÑö¹@›ÿù @‚„ˆ„ !@"›Íf÷뮋ö“?|áûO¤S“Ï‘7nhhhh8‚¨c4áõþIþò×9…wÐü¡Çõ TGt…Tïîž®ðû¿ùÛî§ÿä–ã&€)=‡^7nhhhh8ÇgX=|²ºþõîé÷w_ý²ßl/•4nX@¤0Ýé^¬ax¾z¼ÿù_ÿñG¹ïÜm@z$Ñ74444cÀ0ìÂ~üÅ—¿Aüøz|þ4®_¼…}‹ì³â‘¾þø“§¿ù—Ï?ûiëÍàLÀ)»6¡ ÇuÅÌëÝŸÿ?t·ºýß¿Ëwßö0²þ ¶E¾¿ºÚ`«À®»zá þâ ô!k0ÇÍÿ5äk¸­ÌÖ;\îž^û¤$®<¬ûç²é D·E~¾ ×xþ)ô÷°ú ø¦Ûÿ»”ðˆ£Ø c‡Ht—cØãÇq“—`Â*kÿ#<¿úh=ô›^ÝüaÀðô*ýY°á¿€lῇaÐøó¸2ø÷aÁGÀ Šðÿ³w_A¶×Øÿ_Úñäs:wßî›ó.pA‚ )’CФ(ŠÊ’f”f,ÉöŒíòƒ=S×”ÆSe—K®‘,•¬4¤4¤(&0S$!‚ñâ7‡ÎÝ'‡¿äθÊU¸´›”¹Õ/ýpê¬ý‡µ¿´ûN2Žd$ø ¼­“ ÎÀ´]S‡KˆI¿‡ZÐ…B¡P(ü¿³*deOÇ—25*Ížˆ%ç„„Öì£&@G€‹ÌÓv†êS¼¼iÆ:™ñ îR]Ÿp¾¤ «¥Ê-¸ wŠhßRI"ÜŠ6„7‘sê×-FŠ}ÖÆGàpÚ¤ø‚x½(¹¼rSZòU4Aâúõ¥D®uõé(áZjo¶šæ7Ž_ϲ,á³–FÕ°õ›ÌQ,C~!@Îîi|Š\( …ׯˆ9M¡z>¥£‰YÚÀߊF sbš1®+âÑК±¸éVR›®1§šæN4ˆUêƒ- ³ 8%„YK`Æ„öÁ¥°ó\Ù$]¯LWG½²iŸ†í“Úy‡×òä‚Ìó'”vãAIPup›]l3i—[JÑ Z¸¼+üº•¹¯Òöb¢N霨FÑN•7Úª?›–.)3‚Àu‡Ê‡Ž ÛsAì" …Bá5QÝwxx}^XñïÏÒv}yõŽ7ø-¸s/í¬•¿öy¶{¥NgùXÿä|ÿ!¿T¹õÐÝ)½xaxé‚§³n8Ç#Cf-ƒR„(êÝs\ÙG”+Ö½qøÛõ×o<šd36]2üy0U©ÖŸ0¾9¾v¹ÿ•/4Fý3pn½bœŽgÞ÷ãã>ó±Že)5åhÔ &DT埿Qõ'¿s‘ Ê~é¿ò›­î0]n˜LìúõK—ž-_ºHaöÜ«´HÀ…B¡PxM w6ÑJëÎb=i- ~þ×µ{ÛO|ýÖÆ»@yw{Ôø h]ËÓÝë³Ï<Ääñz÷ßì-oJ‘Ý<ÿ­­˜ä¼´¢ÔÐH ¥¡RðäÄiö†{ë£öÊ¿ÿ·½ÞX¿ý½ý÷|_øËÊËR¬¼ÈvîxÏϰé¥agãZ%8`£æ¨ÝAùèê+Æ)óÁô|V;ÌŸy¼wk£â†³:í±ªda}ËõV9¡@…—J:K5.\ùÖ©O~:†8Vvï¹/þñŸâ_úÜä™'Zà{+V$àB¡P(¼68`;ýa^›©¿ã}­îpí£Ëö1ÖzÖukð(hCJ¦Fl{”º›4[‰M>X©Ï¿ç}îñ#ÍÍë^b­Í 5c€Ñj´²¯55Ýÿ³ßJÑ?ôÄWÉl%>~²·¹[Þ:hê.¿<ýô£õÎ]ù¯e©®¸[âî4^½M fcs£zgînÜÚèf£D‹Ò|lþáÏWËá­ÑX¸âL–^v0 Ø%Kê”-¶¯¿éƒK¦ÙŠ@^¹åÑwQœ‚. …Âkƒx¾·H(%Þ­Úlvþ9)“CáÌ~=º+™„mBhe{pÇ4´™‘qv%ÎÊG67•TÝ©©®ÂU«.k™‚hÆ)¨ËEÍ*ѪÕÛ›;0Ë$‹c7衃%‹1|_Æõ‹z›kU+Ä–Ç£DE“4Û¹]˜³óûj¥åh NŸ^\ZT ëÊá¨:—/.ѬèÆ(È\™±cf-qSâôYˆíq§i&ÎÁ#™[¾]v¿­" …Báµ!y²[XÙ·<3Õš{ñ9 ÛŒâ/ÀSw /ƒ°)¨¥LØ\syªG-ä'jþ“‡Ã]EüE* Œ1H$Œï²ÚLsY&P4›‰'QWet´#ð½ËJ_¸N/7[¥ f*0»· sku jáåçežfs ,2—rÀ9÷`¸¹Úé^_ÑJºKªË:U qa‘ûbqÖ÷jÛ›»-Œßº×á¹ý´ö "A5e†ZXk­†al¯ßñÚÒ œ€VÀhýÿ(V( …ï?r¥CyLN-btåÅ3'ƒ}'oÛWÚÚ¹üÜ“Gžybƒ•NëQÛŸ'cÏ£uˆeL®ßwG•[ñÌê6<ßÒ±µ€­Q#u8RHÓß¾xëÌ©Yl`xF:t½9³xùù0(T¾“³.l+#@ÏQÖÉ“\F¬ ܦš¦ßn¡4  )ø‰ŸMn<Ûlë¡ìÝ'éà _=*–˜6Zvµ(ylÐU9Ñ„:¹Üîcvð¾™§Îw3q foÃsûÌ“ÿx›Ør“sc]XË`“½}ÃklÀ2Ôa„0 X³Ç‘( …«Ê'3Å@6›‹ãæ !/ÕŸ~<üÓñî=ôлT²póR•TÚInFpšÔÝoÚQk>zÛÏõ6nˆo~~Þm‰lh‰glªt’€ˆÞµ‹½•ñÞ÷o?úÉzFn¾ï§ƒÄl]½r6Ö¤ { ”MKÒ§¤µ¾¶wkw?Ôùü'ÝwýtiõF4ºFqk-`@) µ!EèmM†Á©‡ž¾ÞÛÜyê3Lìm‚zûlòÿTR‹€SB5£ŒQ‘çý=ØkŒÙc–©mnunµ²6³Vƒ{¯wh…B¡ðCÍä.¬‚k‚ FéÚ†ÚZ«aTybŒ#÷]]98ãÅ ÷*D@·2®§òÝÞñ»Ý‡>°úÒeñÔ—ÀíeëõªM6€ „GߘЎõÍÞ΋ üÈÛžüocJ5t¿ôpõâ…¦FÜîºÑmyUF"k‰l?÷ØÓç®×÷5–WÔ£_Rýnh @å„Pmèé3ñò‘ØrY·1yé‰yAx%6K{úÚÛ&`Â|À€hkS˜±Õ¹ÒFQÀNïíÁ^c*íƒ ò%hK)#–Ú×;°B¡Pø!'q¬Ih5Ϫ[[k[›F-0ìnbißÄ/o'£9”#8ƒ¼·vh©ò?wãÚ-|ño¢^ nŒzÒ8a.Ñy Eº|dîÌi÷Ò•­'ÿö`fÅ÷%øù0Íìõë 3#Œöh¶«²ye'¨ãÚó ÷>8ü™:C²hõF×Ä%FamK–Â^~bù‰¯žçCÏMŽŸÚ=zzçð¹™?ø·çP½í9¯WtÛCXV)k@àPZ¥¢Iø4á3„΀à믵…úª]”bœâZîqø …B¡ð*sœ ÌXíÉ4tÅ4˜fX‡‡t\kÔˆà9D#1žZ:ÚþÙ_OŸ}B}á/jIÒ@©:tQðˆo §”Ãäà)h÷Mo:ØhFó×ÕÍI”ÉãO|éP¿Û;qÇì:vÓ=J¸T#Â5­Nwtñ¹iË&O=–ŽÆ.h…;ÄP €XKµõG›ýµ!ýöNvýë¹û%Q[Y=ý¦=ïÏ~—{À943Š‚¸.5ÂXkáF{~¶×Ô «fA¬IA(PÂ* …×W´ ›Œ'[A™R®LÎ4i9¡JFnÒ¯°F[+’3ï{ÿ3}sé+Ÿ< à¾,öZ~º]ç~PÆ2 N¸ËÔ$‚lm£ÍªwëüéQrËeËã(9¼ðΚ³Êxïm/–¸³Ä¹dYË Ào>þØô—VG«þ,§ÌB+@ÀrE™æ¡! uAMíÍ+KƒÁ…ƒwÞ|ú…½]¾mæ~ ¤FžÂÄ„säZgBí¹!ÆkбPmʈ¡Dm‰¥ F¾Þ‘ …Â7• ¸fÜî ×jÄP/`NTSÕÓ}9 ¦,eš,.'Jÿßý¡4þNlD§m¸³ÙÆq4»°Då9òLsÇ+UÇ;¸ß×*æ Ê¥FÅ«^_ÈU´]„{;„ecåJ*{ hQÂÌÚ²[""h¥mnŒ¡DÀRhii5£©"dNR&+L¿äî}|n›€UÎa4uU£®ççéì¬-Wµ#ôÊüm¯R½.2“M&vÐsûÝÒÎv°½åôB&ܽ¯B …BáÕCyll€DETÂŲ'9‰ÇC¶¤yÚÝ1¥²È¢*üŽ7 âÒäl¶{E4@ÔqI×¹k³Í€Í_Ó=BDK8^NJÐŽÖúòKëwÝå`8 çüH¯w7=‡Þy«#Qiœ†ÞcM Õ-‰³qö·¨v±U5jáé,߆Ó¥3c5ƒe°’P]/ÍÊh‚p ìC†rkÂÛ»1ì-ïp˜ð@£ T«^Tž?4îÅ qèçÇëå•Qw¯/®›«1ÄXíŽñAVë46g—׿ûöÍmÝro]íuF>ãÓy!m1lØS"ys.ú¯wÄ…B¡ðCAE“ÒôâdÒú _¾+ùñŸš<úÈNwmîÇÞ{Ä+O<Ë#’AROg èËA¢å²lÂyîabäÀê®FTúo~÷J4¨üÙÿîEQÑ—/•?Ø{ûûù“_‰š¾÷ŽŸue6zùE…œ©§ò}­y·s3+µzŽ™qXŸè]ß´dIªXA âVJç°aÄŽônõ¼[c|‹h«¬ß£äeÐy£]./—F3ÎÒTT~£»!®ZRîüJyMšó·š+;÷?äFý“ß|ú2°·™7!ŒZå:áñê츽g\ŸY¿ïžQW}îáq2¢~uœë„ºóÆt_£Ÿê{Ôú–1åöj­}µužd•ÙþÑS•ù±êSÏ%7žð—0!XW“mnÏYg‚âxt¡P(|4­5òcã› _ÿ\tì®É;¶¼¼,ž}ôÔcÏ^î´¡Q6†²^§qÇñÃgî{¤©Œè<¸qiêÛ߬l^õ9~ãÒ êW8­ g[éîÖö䋟Þûæá/ݽ"cóæcÑÕkÇ‘ÏäÝu¡ýã¿L:ÝuKtÉ?ò«ÿ]©º|éá?z ß‹ý(Ï´Ê-Œç<¬/ ÚÙ°'…r°T–v`h^>> IDAT30R©, ±8ÇV9°Ô÷æ=çÔ\>xŽû¬¥ó}Û[åÕKìÖ%Þß\Dmo †Ão¦¶¦uÒƒõKÎòd÷ù¥»ôwEÏ}=]» ÎÐÐQ T2dÎ:ãå,mæYÂj™NrH î À€B8Tî虓£öîÀ ÷±rYgc8!áÆê1ºðÜ,˜Nz} ïâ­À¿N‹ ±dL)´M ò/1Åosø—K‘xÒ¥ÿâ_áßüNÝM›Y(I&9cLEnèd$ñ¤:?žŸÿJmíÚK°$ Zi&ic“:®×À~À¦É~èIJ>õú< 2äk}!ØðÁ·`ç£:Õñ ‘ǰ¶8]( ß®;“Å7r¹.áx"h9¼ªÔ˜òV®¸µ× 3ÑX ¦’çJLÃs™”Ü…I@%<ðòÞH@\ xÖF€ÞÇ¢Ê=ÑÎõUhìPõ¨®Ž£D‰ŠïxÕ8i#Àš:Ù€!p]á”òu…1¤ÒXDZןWˇŸÜdöÒe˜¬II ØKPœŽ. …ï‹lÔ£A™ _+XêÉ(‘ä9¸q2žƒubÁ™†°JIbˆ™J@Ú2/(i]•£2Æâ÷YXS¶km¨@•a$÷”štP]ç.t´Ïfu ô‡k‰S¯²Ö$‰ºrR*ÔOÜ`bd])c´UJY+a "$FÕá;̉´NÀ¨D!—`%ëyò!’yyÞlÚ³ U¸0“Ä1 H&°·Vnr WQîæC€é™Å´Ù¨|íK·êûI“!S¨¹^¦ƒ2òÜ8?x'˜l§ÔɱZFæÒ±#¾úÈKü•jXßÞlhg 2€· Y,A …Â÷…¹>K’ÀC˜i`Ú„W´¬æyÚ…µVÀîe–ƒP¥!Rš& $™ðÒX ¤òLÓ‡[­Bõ¶=ÿTš5Na§ˆ7Ë3މ‘QÛJ“&\›8I^ka-@A)(çŒ1mCNÁKµŒp,ã©–¡‰Ê3“dp¬SªJWSHm)/ U*¯h•#ÛEà¹îT:´ã= ‡%ÔÉ1HZMæ—òÉhu²YcU±æ6f™=oõQêúÓ~Ò÷àü€5c0Õ|’Â@ ‡ó6Ô¤¸"o—dêÏ/c{gp EöÖÊ©P(þL¬&YåÃ÷]/²¤›ç“$Í1d`!ñ3›ŒÁ9ˆšP¥ ²-WÝJ(•5Ê"!P5žÓÂkf q,b«+––‘í¤ô)H Û€“X»™vagüà@¢¯¥ÃAÏ™"& •LI‰{ûñÒöŽŽåYLƒ:n+Ôú‚šL£r9ÍúÔ=ãswݪ.wºoØ}ãSS—/Gy%²~)Çê»êÜñ{ÿÆ1ĵwmw6¿öùæÕ|UéÆ<ÈMèÿ¢µ Æýõÿ±=Z÷þÃÿ1W›³Ž¬"¨Lü >¸ãgþÑêüáþÿú¯ÓIÖ«û?øO^,INå¬çcûøßßzA§zì­ !ÖþÇ×B-çÜZkŒ¹íia7DjA}kÈw5ápfM2GÃM£¤Îr0Îa ¤‚µÛК;!Ü@E,-ß ò4ò-r0m‰†ã@Ik»0 B=é+9ðD¹Æ©*Uyy:gÜp˜D/9õù<¿>‰ÆŽ÷†\~·Ê\J)×u€R¥¨·çcô…B¡PxU"´¥=`âØ>ó„˜|…ŒÖUuçÚøÀÏïÿüÕ‹ª¦rC¸4,dcJàVAŽœµ÷?XÝÞh|êãUîšãw’ýÇ[ä£Ç_¼:„C‡×oÞxáéÃ;«^øôoÇOþbóS~âü•íWÈØ,rfVºËû—¶ú Lx3•kDOµæ.:Vjwl)\™È¸?¸U*•6o8_ýäëLËNß=¼çôùÒ¥«9 ö4„c`-(!Ž#Œù®IŠ\é ¿‰xúHPÚߘö9"¡3Ë8\€P0î„!òRWõ‡j2‚Vn¹•t§éXAŒ¬‘ž_#ÜS"46ËÀ(+Wœ0”Y–tÚ*±ÀñÊM²©rÉtnFb.—k·”Ȳ,=cSyZì …ÂëÌZirc%ƒËY°Ðí J»›û3¿¾}}ùëŸ'&:pâ%ÇÝ È³í*( 41ˆ”èÉ;F3Sx䑸×úƒðÙoΤ™QdÛoù2÷vo•õÛ&HÇ÷Lw“ì;²Si ÊCXpZ­Áé;Äúõ‰Ã«ãxƒ'¨ÖÓ8#d–W*zr b~Ð!½oËÑž/¹RB¬ ¡°V !´Öß™>¾¢¸}“úUߟ†$µ 5AXIF³z”XÃ]§ÌݪSš Ë‚·d_+ñÕ8z:ïîèŒV«e λ[œ¹&Mar×-ÁY䘩Uæ šy¯eòÀÍÀ5Ê×c‹ÐR{S—¨t)éºóW&£‹È_,µFjóÄw{40Å !ö¬„H¡P(üP’R‚s k¡„I`8t ιµTIk-åÜûÊwG­µ`”P B(¥Œ1J9cŒ P'¨Á €$É0G¥R‰ÓÛö‰'TŠîfcwݹçMÚ䮲ב•Ï>À†m¾q³Êµ|#—)CÝ(I)ˆ8¥”B Ùó +'ß)mE¡ÐFrAµ6 ·ï¸*«mÅåfûì›Õ¡3áfš¬þÉoÝ«ä _ƒ3Z<Ž{ô—VáqE,¯_s¿ý }þ›7†#W´¦$Or½ÉüÃZeY4€Úõçãü¦Z`&êL¶ÊaFµ‹/šóÏÙÝMªZ¹{ÿÛÝ£w¥AiîåçJÏ<.ûÝ•«ßå]b)µÖ‚B¸¥ö¬“D¡P(üð±qÂ*l¨eâUÊó£D!rY5FffÛ3‹Î3OKņ–vÍÂYDi¼&¨Ée»Óe'4Üä¦KÂ<ôÊackíªÇ½$#¶lÌUô‚`z:óò´ž?=úÈmç`Šæ“ȵF=ÿXóÁöŸ|´>Î×Ë•ýGOW¿ü—['VN¤fÇ« í&Qì>1zKu«˜ºŠ¬Ül¹Õª¹øB‹ø»{=bÄ PJ)”Ê !ÆʸAöŠœñî³3‡ôûÞ{O’$~l{õ–PrVÉ› ~KˆÙÏÕýv:èvÛ3+·ö-Ó·¾ëÇKŸþú¸ì.¤l§«Z]8]☖£èdæ™çwž}TÐòA¥ešË,aZ»`”ð%ñQ;ýé?²ƒøÖOþª~ï? ÿø·ÆŽó–œÞ¼Í/L !„1©r °Vƒ kIQвP(^gn‰Ð\#¡˜ØQ:AÜ™ÚW1‰=Ú9}¯N²¹—Ÿ9jâ² n‘ò¶Mç!˜%#¨*i.<_oÖºïÿ@ø·Ÿ‹×§ïN/|ë@Ü£Ò³fMEÂ/{B_Ÿ?ºóæw;ãIøw_®¡½b8B!&\ß¼¬Ïtí‰{vžÿFõ ÈÍ{ýJíØá‰¤c‹)€”ÒØG£VÞ¯u·RÓgßynté¥=0X®¤é´ÇÝÝ!…%¶´õô¹_=sv|ø4ž~jÔÛM@/U—È b£²ª]kÕ»;2Oé$u-(ç>gŽÖ 2ñÒœ®OÍn|øß=uN¥ßøäæýgÇÞñØöõÍ\·ÇcŒ)¥!ßùÇê¢t¡P(¼Î˜Ô8ƒ`%N Ìnkïƒ?×h¸#$Ýù?û}=iG¨eL/ët±é—«Juåd.k]y¦Îéµwÿhù?ÿ—̬ŒþW^¸~uåá4‘ž×~ý¿ß©„2™LM²ÁïþÏ»NéhŠWNÀ@‰É®›©KÏ5ï|Û­—ÿîÞûÞ|ó/>ÑcìàX^©¸n6ª‚åÀ“¹Üxü›ÿêV–%'MRýÚçn^ÏP·™·Þ £*W¾J¹Ã9Q:¹m¢ UèÊ#ø#{iÂO¡ÞNĆË̃5Ôd%"ˆ¦·À$s&fh~MîÈVKæÆC0qJ]ìÖั„Y¶AD0”ƒ‘#P#ÆÐ É·„·„¤Ì*³qïòoØpei«ß@¹ë(´o°ÀÜuˆüõÕÛoëŠ M<銲չÈÜ´™…zø]–¬ …B¡ð} ó1„b€uVʵÊ:ñüïýv›”LJ—Nœ=7ü§ÿ>úÇínwNó”d&ÕA¸kÈæÎ-\{Ï;[/oÛ/ÿáµÑ;oyoÖéGùÁQw˺c,ýö¿^ðœî‰£+ï|éWþ‡Þ§ÿ [½]1e§]t7&ìÜó—:Oá¿üOw·Î\{yÕÑc«§T’BÄ :±í(ž¹øyö‰Å‰\s¸{à@ûÕNu>ýç§c²·R”{ßMë‹õÓd²tó¼Õ;Ò ë’êTÝëP"(V`k&à ÝÒ Û-¯f±aATä#ÍD œ¹„ïT§îó€ØvšÓU%9èƒ^Òô²ðèììþ$– ÀŒKÓÔó=_( …ׯ0,‰#©c UdtÑNî¿|aøåÏ´µ%ïx9(Å äK„´\°—P¿r„W6]uÜè3ÝÍÆVFû?ÿ0¬´rj«gàÝ ç˜J§º¡ýõ§ŸxéÑÏëª;}òî›· HÚtT*{3 “t{0Ø^˜ôO|ã›W‘U¬A¹Lëõ*@èÜÌÌ¥©xgØË|¢O}ãÈ#=³rhÿé‡.îyöúgñoÏÞ}gw gO>ø ã/¼­í»ô˜}âBƸ • ¡''œQg.Ûé?‡j3=ÿئcf®pÆ! †{©Js×íŒlxn(Qã ›Œ2òÃrM˜O ´J@YE¥R©¨ªQ( ï¨(¯âp‘ŲDòò¥˜;[½Ýz4aau2îh°&¥Öä×­= æ"G2èÃÛ>zxzûfÏ)Í8Ù0§no’'Ü{ö›Þž!—²iRk†ýãþåtï[¸}• îšÄ‰Æ=ê8ÆÿÜ'¯?æMH™‚@e*‰TZ¸åJ6Hã12bü„‘"¡õòË‹û} {ë•°çœßš’|cj©=úüDz±¥ïÿÑêß}~u2×Û™Je º Çf–Î.õ~ì}gnÞh?÷T¦¥DªD8+Õ%9è±6èXd)ÎÞ?uòÌ,uæ¯^ؼðt÷ò VªÐ çi)§~'ÞV žµ ÀH’$-?(p¡P(üýãf°ÒJ’#¡pƒRXÊGƹÊ,âáLð©ZcJñþ$°0È{5ϽßÚ ·¸ãLÕîØ<šaŸB6ÖV†ƒMbV›°Fݺ[dÎuËešWõp0è[ߥS‚"µ†“k^[Vþ(’¶çûSõRHIY—Õ]Â$Eɬµ ³ëüý\ Sï4þÿnï3àÙ}3 a©O~¢mœÓÒIþüÏÿ/¿ýÆÓwÝúò'RÄ ŸMçõÄ¡Þùå‹ïþñ©ÑXþSù 7ò„*Éh›t\ùÞ!‡6¢ŽÿÙoÛ¬,S²xö÷ܵøó¿rúáôž?OÓg|7’ë0!Ða€ÑZR ‹âro¡P(ü½âVY¬Ë[D04‹9è¹¥wg©h.¿²û·ãñpZóÄݯG%·´ê±ê ¡š¨<úöÓ7NÝ‘¹¥-ÐcˆOöw¿<³®^„ÞÒd·fùSÔ´TΚËlvqßåg»·‹‡;N»w1·"T“˜7E#lìnÅ´”“qÞ ‚SR2 „HÛãâ7’èq·âdQj­-×ö£­d¼•ð.teg°ÆhHøÅoÕÆ;þÏÎìWá­¹8œ·=Oh¡@,tƘÕ0Œ1)%À¾—mìB¡P(¼~²ö „Ç2­z›,.¸Bdk[º4ƒ»ïšóKîÚ5ë•Êá”;êg~³OMúáß“Â[LÓôùçòÓw{è=û*˜¿óÖ·h'`O>Ê'½z°24IºÿèT§Üël¯™œ8«»“àùgíWŒÇëxU22§¦“T¥#[…? ^Öj-7=â†n¸œõ…4œ k’áÃFiÖK‹ßö­¯^|ò{lFø=$`fS•ʨÝOG>œ“rõÀx°[š•ÂQÖ©§‘t¾¡Ç=–Ä+Ÿýø¥Qt*T4 IÀ$²æ8I@ ˜†¯…ß#0TkÂYÞ\MÙ:p˜~ã+ÆŒÚY)rqÆø/tÊOËÜódœìµõD¡P(^ºN¹k¬Ôé2ñªöø‰Ùå•Zyª7omÜš|êÏùͨh ¸ÛRã‘A”g™Ë8€d7†ç®¯›Ï~Ú;û†¿ü©¼lÐü‹?¼Eó¬Ò·#`ñ®{Üz½/Õv”wvêŸû­ÕMƒÛ«Òq?pÎꨧ“ $åºN)X Õ÷üA&þÔ)ÔÀõgƽÊÌé«¿þP]óÝÁF–öÈ•íñî³·Kð·³çLSw‡%ÇÍ&9oV•#Æ[;ïBÁh&ŽÜù·ýÔ@MÔ‡þM›sá\/RkfHJÓK“Î ¤Î>“E¹¤·*“¹óÁZ#IÏ#?¬UÝfjÒõ½ZƒˆÁ‹ôÈ~k`4c¹BLòlq«·P(þ¾©ò¿íø~sO¹Û¤‘Sm_xêêÍç¦$«$¦µø3Ö¯³…†¿øðà¶}¬œÉtÏ8Í(¢ ¹ÍE]ŸÿÙŸ<ÙÝ"˜9 Ñ—×Q>xõíøÆÌþ&õgoÙ¼J“Òÿî5ã,ÈH€9>+q~Qåqb+(_‚nìiö¼~k !30þ€[ƒaêL}n2ÐÛ©jHˆÒéã©ËÔGÿT˜ybgžŽFp ‚O’Kpà5ZFî‚mI3´ÙŽS> ÂøP—IÐ9Lù°R¹÷ñXjoH,óH7LˆëïË¥Fº5·oæZ·ŠAe¯ñ …BáU¦R†˜Aù‡–„Sh ƒJ(G”Q‚r‰ô ÆM§6uÃ÷Ig7Ñ's:û_‰ð¬`uJ$òKq²*š~îš4Âx¶GõØ’jeDòœà*N&XJ<ø3z˜@Èä‘®NùîJºsKp4jG2^yû5ÇW‚O‘dÆÎÁŽ”e ~[¥7o\U oÿ¡£yֻʉ>qz[½í¬º¸·[Ï…B¡PxÕQQ#‚’J oN®¢ÖiÆ}îûÄáyåã]˜È«»2T(Œ’©d~È}’fÛJÞ„ ¨‘1£sÐsrHLRrý»À=™+Æ`F”`.ºAÙ‚ƒs05-׬ݳ„‡pÖ¡7ˆ“AäÉxKÊ-^ͽÚmëD’`@ån… £ìÀªÖƒÈ=KÞ×:RIG †ÁôUßðýŠðªu˜ÙtØ‚šaâµß&´2î¤*ÑçœôÇÏÃxwßwÈŽW^~¶ ÁÝj¨Çº4}µ7šTÊ÷FUëæ×˜[Gh5æ·ÖÇ2‹Y8üÕ6=‰_øÈž~ãHµ—EQôbÜåÙÙ#?ú3§œõÕÚc_1z–wãîêÍÑ‹/tßûÁã•qïxçéöÆúK߬ÂA÷Ö¹P( ¯.c.Y&|iÄ•Zí€L]Ò™†ÊÁ-€¤@–ÚƒµÄh£aSˆÌ¯ «Ž¤ä:Ô¦ÎZTÌòºÉu;ËúTÌ£€ ÖJ¥ 2á¸Á»²ÁdTæw1K6`v!ÆŽé¼C˜ãñ}I@•l¨áËp_1~«ÖtZÖ¢.¡"AX™€ÙÐ…íCuÁ´§4¯zeÄý˜UµV“¤>h+ „žh¼rߦÛÚs¶¥çÖ®Ô>þ§sïþ ÷³¿y‘¹i÷VïC¿)w`EÖa ¾Rjiyò3¿£Ò¡ùŽ:ÃI6Øñ?û´sÒêÈ€ óF™>*m»<“{S-hl4ŽÇ×Öpãz÷Â7ÆÊëiÜm""îTöµ­<øS«ïþ -ߨèÿú¬ë-gü[0{~é( …«ˆ÷©|D©Ô¶Ë(+iÔ¸Ó€6–2m]X.HIqØ4Ǭ¤`¬V9¨!ÜñTF“N zá„ûU•N›ÌæºaÁqÇQÄBf*‹ àPêe㯠™s—ªñ$VáÔ…Ém4ˆgm”èóà´§ÅÂût¼þŠñ;­©¼À–™›h–BjkŒµ@ž*¸p8¬”“i¬¼Ôדœº-ã2?d†ô³´ÏŠ–žÕ¯q!êÝÍ綺[ýþi¨è2Ç);0cÁêšK#6W>þ'*eYDt‰ßcKS x*ë4Ž {ÙïÿOµ§a¬äêcî!¯•«ËYÄ9ÛÎdYç+¨­k÷&S]VYÉ¢T‘£ÿ?Û¨»¥ÊxÒÛE¹éK_ …BáÕ¦z.Àm»ˤ¥²™æõ s‰N&2R0 Áõ¨¤¬æÎÕh¤¤ç8­Æ FyVS²îÿºåÛ0€™FžÃñ ¨À9sc¨1™S[Î'W(˳‘SFzp'ŽGòÔ@•Kálª3•li\¦_1þ|ì"Í`¬&ÜË`3Ç©e½ˆæ)÷ý\ä(AæQîV…TmÈa9 >”§”Æ {K©{?„Õ»œgi8E@#¿¡¼–'#áض‘Ìu”±ÊPÇLŒ³AÇš89@z¹¨4¹œTRÚ(é‘„ñÁx&N7òÑ CKßkB¦lL ü GìEéf©q\£“ ÆÕ¿'› @–÷¡P(^eÞ:¼m“­s›‘œ˜QDBêN3R (%:M¥wX(P²+i~bçIDAT–†à-'Fh†L•ùžÉûÕ’ã•äº6ü×<„Ô·ZK+5¬Ü£ŒX5B¾­ºsH^²äª8’ HÛ G޳9T¹Oòä•ôø“ëƒíýLà?Í-ö3ãQ:ÊÞ¥oxìKZ .Â@ŽˆœȺpXnh¤J¨r¥ŸºcôöwÍ¿üBö—5IGë¢ò5oÉÚOd*qV¦ÿÙo<ŸH‡Ð#AsGßp0}õºûÉ?w°ÇÚ›…B¡Pxu13>xTOÏ¥§Nûí-ç _ìM¢él-€æé.¼á»ígÙÔìÀñ&ž‡­—_»nžx²kºu§¹3Pêz¹I?øË¢6c¸;Y»iŸûVéÚùY3!p{Ô-)¡)„«µ5iN^› ßöàé²Òd—žÙøÚ—‡Ã²„«á¶Xä²Ý™Z¨ßÿyàôšç8/?uèkŸ¬dØ|Åø§æÊo~_ Íðë_à½í2¡‘Õ)R c[‹äþäœÒÿèC— Ü°i~á³æ§âû–NvÚôÖõ|õZÿÉoNH²ÑÛÓ¸í½Gp)ÛÜ7[©\½ÐÿòÇ“„nùÎ5­,j‡–½|Ò[]Ã×>cl|Ö:“·¼ë¹s÷Ò^oýƵZ 8qD‘¶Ô^HÂõw½wáÈ¡Ò`§3ÚŒ¢x·Äß3d'“G9Ý_mÍ wj¹¼ÌÆÓõô‹ (m@UuÚÊdò=¼B …BáUôî÷{óKHÓn³­µxÒírÉ6]‡öò(!6PÃékO—ŸéôÓIR)Uúàù;îZ/¼à@{y2\8 ~ñŸ¼éù';|x›°Ò[ß;ýЛ%ô­+/’JuyœõaX(D(e„<©Ì•î¹÷d9xþ㿳ä—Koý©ñÛ~Ì|ñcÇ¡·ïFÚ;ìÌ<{×[SÇ ÿòwMÀ˾ÿô¯¿ø¿÷Ê÷t‡Ý«s ¡ubJC¤ZaV8ÆTA}áܬ´R­*ЩE“ËÂoo\œûÂ'†&e^}çÜÛçÞâuû£Í+­½N÷~ )ºÓlwâ(iެY¿çÒ­Œôìu÷›ÉÈ­4žÿzå‹¶eý/><%hýµZ­V{}Úk€g‰1Î1ÆtÅíClÑ-êU`Ò¬³òlÜhÜz)&ú¸Q>‹º^ì+< iXcJÛ‰Ò:Ý\ðü̘}£†Çý`cU„]·ƒß÷´›þÀ<~ê§õƒïmçykg5~ê+«›Ùl*9 /ÎÓª5}ÔÈtqfé‘öÓýéç¾µ]ÒJVÐ%Iö‡ÖÊi­ˆv ”PZâ6­DJÚ{çÅÙ…šl\ŸŒ¯¼@ìH¦oôjµZ­ö:bÌ×`0N)eŒ‚s0¦2š„º(*8C"G\â²%á³ß÷áÎÖjãÙo 'oÛó;Ï<¹srèC{ÿŸNQ½ðà#›~D¿ûÄ!SŒ‘0T†J_NXíyt,s°Eرq„ÏY͸5ºD@eGö‡eÎP(«Rð¦ÕZÂjx,œ# Î Á¸ ”t®>»pߣ›¼C|ûÏÝ™WÓüÐKßOï;{Lš=xçÂãqŸ8™ðsýq±pD=ôð¶TêÙo #ˆs#›_˜˜sþßæ²r¬Ý¤;7yø³¿üßùgÚ š.° —¢îðãÛi»´þ¾ò¹¯÷¶æÂ¹e F˜Lz:·ð´³ÆÀÄJ#ŒÝvºÑú}H)²2>u_çgÞ;9óëéÿøãÑåo3´úµZ­V{=c@4ˆ!ÔpÁ ,Ñ•a±2å. ™ 3Õvhž{¨zèQ0rìs]É hÐØ(ÆóE6ýÌw×ß÷¡Åûßš+Påƒ?ýä±k/ä|Eëôí ß¡ Ö€XpnŒ$„Â)GqmJPÃXhlá¬ä´Wb(•b‚B˜÷œ¤p„2j­U‹Ûå­¬MØô7¾|ý}¿äí]ê<üÈø±/­ÆÉ’ct8°æŒí0NŽïzáÐÛš.ù,_¹òü`2 ÜïiûÃÇÞÎÁ/ñLGÌT{½†Ì§áz“‘Õ£½ngøÝ÷¹Ç.é!Ð{òýÏüN%Ý_ühüž÷_{ê{æò¥Ù@Y†ÔЍ©YN¥„kB)¡ÌQæn÷±iqL ã]ü›ô6?ø‹Ñé³þ¨ßßéÕ‘jµZíÎÒ Ì1Ê,¥ÔB0&ŒáðsîEªôà OÓçïoxåâ§þèj¹§“ù†â´“üØÉÃgïë=}ùòŸ_TêЇþÎú;ß³]¦'nín¢õud Є8ç,œãž/å¾'縅®œm2êI9b<´Zî—2¼W8h ’²Àç甫˜Ç¬%04CõÓ«/éŸJÅÛK“+Ï’vçÕ~Bˆ#%$"tÕðòåðñ¯¼%ÇÀØ™ó‡N]ýȯÌýÏÿ<¥Éè@«vðSЦ]f=)Sí’ðÖú•YRžétKe*TÀKòüÍ5óÉßyéä9ºxlÄ‘n"< Ú¢]U:g'à„XkµÖJݶµ¤,} ïÏJp¶»iéÆ'öÖ®¿V«Õj¯+ʱZWUUY¥àc ¦¨"rÒ-ÙyßGoF½?üݼœò»ÝLn[ö´?³tä?ºþ…Ç–Ç2*ò•/|úÜÌœ{èìbƒÂ›„0Ê:íœçR*Îâpçœ#„U•dŒ9 JyQd”ø°pÎBx²TV;8n- Ì+E2’´º“‘nt{i±/<{á)uüÜîSߘ€ž•I»Ý[ˆ|AC§l³#vÖçÓ4W¿ö…Ñw¿œ;‘œ}ׯÛWZÅPS¼5ãÄ-¢§Ýø0üÑPFD¬¹h².K6>DK»‘Œö21õü•ÍÇFβL«‘åí@ÒçaûNOÉŒÓć´Î.|°ã©Iƒ°ÑXápÑ2y ¨(@î•“q3Õäè~6 ñ%O9pýµZ­V{]Ù"è#lpL¶˜ ¹?¨ «¡òaLÝ_û…ÅaýûߛϦF² &˜ÈÁ“oïïx(—!ÖámkÒïõììÙ'²R"j bFŽg$RPœðA1hÅÉj#H Œïñ<§“+Šñ*ïÀVÌö‹ùn§$…ÕíâKttšEýAÞõ’´@Bh‘Äe¾ #Æ£ý8Œ¬lÂ&*[üÎwð‰OÌ~ý{بBQQÛ‡^€Y•ùl”LÖúe8ÛsV¨Á[Ñv—¯—NË–ŽtÝÀô؉ž”@ÉØnØh÷ÂîSF·˜ç ´jøŒóXfU‹íV#,å°ÆÑÌé‚:/‚ÃT($[Ö¬Ãr¢˜s¥{1 ˆ#W}Ÿ¶ršÌszØäè£Ñ¡^jwÒ6êîÍÏO§™ô;—\­V«Õ^W, <îUVZT°UIC#B´Ã"ÒîbùÔª'ô“_žØ¬‚—"@HCNÅíX*]% ¶„Õ2#Ÿb$îÎWù, Šá )~‚U]¨­²Ù¤í-œ-®NCÇγS ·¬ß$›Uo<ÜW^ àBŒDuÖÊÕ¥#éÞ¶T! Ô„Á²¨)´ƒRÊóá7cpîœáQ T ošº#å¤U±¶ÏMíÈ‹d~l;ì‚QÆ~e×SòÌA×íÀÌÌbcjЇIÃe<ˆŠ•嘚øùg¤Ô…ߎA©õµ¼†b¤«[‚?ÛM¦e:=0´Š[s°*ö‡‚öíŸÇè(ó W=AÚüTÞoä“HQ2Û›Ó»³(­©è+LÉ€<„G޶•Ñ/<”ùîX«Õjµ7Œ «¬ò·yK˜Ù7l!;ŒaÆ+Ù09~šË<¼þÌ<¤ipÖê!np¦Á~PVU¹±aZS‰žäÈÂÀk·§|kqkuÛ‘+ž~‹5.:wÁV&œ›ñ¯\.8_Žîsíù¢ÓdÖìÂT÷Þ;÷–ûý4«v·}I·Z­V«Õ^_­Yáä¾u·ZÍykÇ:íG1aÓY4eÇ‹‡Åx”ÍÎÌðxÝwm¨€Yø¤´QNÒ*Ãú7˜ûù_ͤIØðmïÍ-‹«Ï®Ïa¾oòò7ÿ~ø›ÿ@p6(öÀYsk[^zI¾çlyîkvÏÿd1)×û;ÓÅ~Ÿ&ë0Åsßyfu{÷ý?8òË8,ÿÖ¯Þwk½··Ø¥Ô’NYk_nAáh…KSÝeæi˜ ^€@€ú¢2%{ bDÉG~eny­Ñ¤m¹Õ +½‡Þcî£K“±ÿÌw¼n>MÌì½çƇŽ÷’¨âd´¹½~õüñ'û,:¶îè(îî>øˆœjeØPÿzÿûÇ^x¦X}ѱ©¶*K(Éšª(s%Fýž6£ žÇ_ÿ5ºx´èoØ™™—üûÈÇ×¢ÖÆsO›'¿<#{+ñÂæÉûÒ“yc‹»[VÎ}û›;O?Þ½ÃdzËéÛ6ϪÕjµÚàç~õÆÑ•…b\xá×Ú-üÖ'æ*Û¸pñů~&ÉM*|§]ÕZþí¿g 6ŽÙ’,ׂ&z›ö‹­íîŽU1uñ¢Ýì½ûÝòcÿ´¨,6..þé§Ëë×RÑ<©³÷W³¬.$%Iâbì?ñäú}ºù‘_«´ñvÖÎöÓ›EyUÌΩ›?¹ç}úþ/|æ{oÿ™ò·ÿñ½{à .\øæco/é8u0€U„€j-ekk&í[ Ƙß@EˆáºâñLGø±,ZŒ:³<ò*uìþGo®Ü†Q ,X¿ÞzúÉþ…§åh°ŒFz u;p;–}õó"ßO`,÷(poЈW(×uÅ0ÅnðåÏøZ:AlQ&L‚E|Ê JãÏAWÞ~2·Ê€NÍ"½-ÿOþÝlYù6—¼s“`ѨeJ#ðót<ñyñûÇ4+œ*è*òÔ±°³TèÞAë¯ÕjµÚëë³ÿáA• ᜦtƒÐ@W³þ´–7÷_?錉 iKôþaã8á²Òj˜@$"i›ïØÿþƒŸ”$+í°¥]–¨üˆó 2ó­È?öÿù DS¤»å¨cþÂúêÍý­Ö—þ{æø˜CY„  æWjæ…Л+Æ[UJ¿ðù¥?q"\TôŠŸx˜¬@c$`A»4=à8†ƒßnìåUÞaH©E•ûàch΢ߺ eØr¬|‚ê¤ }YmÀ)?d•JµçzÉE†`§·4ÌENš™ßX‘¥„ƒhx*/Hƒ1®µî°|×òxº¶ðšeiáEçzeöP1ܶuG­V«ÕÞù8Eà!¤n0!Hà8¤\I(óaL!̃` ‚’•,£Nõh‚·e9€Ý¯L\ÙÇz¬Á‹4ó=ÏŸº$‰r#šòÈ;Þ¡bÍɉ6y#êfýŽæžf©ç-È} d º18¿èi„S…¹R©ªcª)™JœR¥,°Jjü™ýµMÀcĊБÂp'J¹Ã§f„èE²·ß[­D©CUq1šms~¤í=„ëð»iu˜=к<€‹ãðwiU¸áTÀ¿iÉ«m0 šF8äÉHg &¸IÜ2Š@ÊMB,¤óo¡è‘CÚµN:¹)™„‹A¡ú.h3èÜ ã)i©acWn°fÛ¥ ß?ΩÊzk¬»läÁ.>×jµZíuTà–2e3gœ…ìÃùˆ"”+aØ,äSÎÙl i™ü›ÐÍcÊ®—2[5<öt1㇡,†.8„cs~^}ÌyÕw“Å|¼s¥­#jPerÕk.WÕ¬¯]Á"ü]JǶo¼éÒÚ’Zä;mrx7,ïtä(SEŒÖ9çJ‡Š¸È¹nsÇ‚,—à¦2Aƒ”vU§7àâx:J75 2UJø÷çÅS [tv詟*'”ÅGŒ{ú ËFpè³Y/Œf­Úþõô½OýÃGÿD)/O´x¹UæãOöãÅ 8EÆ'~ë_]ùýß}_^ Q1ðƒµ «Õjµ¿r”Gãëbpêãÿäûÿö·§ ^Œ¦ïÉåìç Ô€—°FÇ?þ¯¯~ê_¾¿¯º’px /ä˜Yo8´Eyƒÿà娹W˜7SŸë²ò•-`=î54Ë:€kµZíUy&¡Ì¤;C'ŸT¯aôöŠŠ!¼Õ¼à¥J!8#%4°zH8…qÞ.²vca'ð¦)¥„¼<©øM’¸ÿ:Ó˜ZÞËÆMƒ 6"P}§ËªÕjµ»žNu+÷ûtjiâ‹6J€Ö¯¿¯ášÓ+ý"m•@ƒÒÜRb9ÌÄ" Ö‰tØ=q_à,±Ö:ka-ðƒw_à•߇´ÇÏŠþNƒ$Ð¥exsþ3Q«Õjo¨Ò™¦%Õ°>Á+­@=.ê;Ÿ¯aNœó{MÐPKÇ(§”:­yà«*]»Ifç§òbZØ¿ `B)œ{3°‘pã…C‹ë”x”¢H wº¬Z­V»ë0ƒª·×˜Yh³!¬®_`^#Wå0ÃÙ…¹Õ[ν¼“ŸcN!œ#4€ôwµ ÍÙê•ãW€Wö¢É›êƳ¥Ê»Û[0–B(œ¢žžT«Õj?Šå %ïm5e†³)XeåÁ¦Í×þ: æ¤)gvw¨u ž-‰m-9Q‹¤ÏHÃC|øhº½:BÜN`‘¿Lß7I ‹¸<{>ìÌìôˆ*›Q×µ¤ºÓ¥ÕjµÚÝÍ1°ŠVN&²•ãåæ-Ï9Rb}-‚Vuöd¸;»Û§R j‡B`š‚hâB"|”€(‹’Þ¸\Þs" ‚@ñʱg÷ò´EzðéIwHÒæ÷žžÙZeÄ©8£Þ4õ×jµÚcÈ„¯œ°½msöü¼ðà…õwÀ¯Q£INœê®ß€Õ¹±®„gªÒýÙú ón=þ•µkBxmcŒU–Ê„¾ëŽ †ÂÁz Ä#VQŒó?{æêe¹}݇mÃcÐ9@ "؃õê¬Õjµ¿rÔ–ÏVÊÇh‚˜œ8vâA>¹uñùÀ(2­!3pM#aºÓßn—Gï¹çê%·}½›À·0c8Þ½m/7Go{dº×ë}í‹=”s9žËM9y¢û?Ñ««ô:üiOt+iQìòéü­/üÄÛþ—?[ßï37iÂK˜cSXÀÖçjµZíÕx\U©†ˆEÜTÅ>òµÅåðü¹#ë×·××6ö·G€çG cBëJkÍu}¼x•<úìÍý½Ð§àÇÌ—Æ`hrÛF¿œZLŽŸÝoz¶È«ý[‹;×–{›þÝõ=|l–¹ͬ?+­,WÙÔõKbõšÍ8à|Јy„ÐRÛ Z$ºÓ%×jµÚ]M¡¤ã4 lU èÓó3­Óg¶8Fóáž¼y¥¿·‘—´âÙ¡ÉîtÉw…WË#“€6™ÂGÚN Û¸mû>äÞ€FÓK‹I<µ¾tdwnÞ“%î»»n" m¯(ÅdØö’mow‡æ™ëe@!ÔX'+ pXRQ«Õj¯†hÎ}¡¬F™Âó¼¸Yeööx+iwéâ2—T³=¢´Ù$­f@óz xµ<ò( !™ÃDÃú0þí߀•‰çužíÛ¾Áqê¨,GQ(rÿ}¢ÁŸ¬([X’¯‚ ÎR(ÍàsP—ÃV'"¦Ä7ÆäwºäZ­V»»9P K Œ†s > ŸûeeQŒ`2Ï੪‚Kê³5À«äQ`@(\[‚""ІÑÞm˜Ž+@ÎãÀêaÔvæË|¯ù?Ò«“þ.¡§M@ä ˜†L@J „% % gœ3âîÚB¯Õjµ»Ž. ¨ð< g¤†vQ6JµÎÀ”A© (x,üˆfwÝñÜ;â¶y¤`á œõ)ñN“Û03.ß§Á EK×Äô0ôæÆW›˜yƒŸèG DÛŠB2h êàkˆ¬–¨ œnXMasÜ¿Ó%×jµÚÝMçÄ (åVBcDI‰tŒhæ•ÎÄÜ9 ÃHÜe‡sï”Ûæ™…S€eÎ «£{û-h£?*U S2ÎMè oU¶º»öú­¶Ô§\8bÖ°Úghç)šhêA5 ,ÄÄ eU%wºäZ­V»«1™ÂÀ°€ÖHÊmò²R„Ö…Ö8 jA ¡šØºÁðjyT• å0ªW^`ÿ/íÅ'R¼ÚCÑIEND®B`‚qmlvideofx-camera-glow.png000066400000000000000000007512541225012771600367060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœì½iÐmÙYö<ïZ{Ÿs¾éÎ=¨[Ýj I4š˜„0ƒ‹ABvLP2üHüË¡’)§Š”+?’årWªlWB Û v(° T\Äà Œ63(B’ZRw«ïØ÷Þï;ß9{¯õ>ù±ÖÞgŸo¸-¡&vq³ttûœýí½ößáy‡E’x˜JçÝ_úÏ~ôÇþË“Ñ%8ßÙyËÓoø…ßünþ{†7|ïwè³ø‡wvóÞòú½õNsä9ædÈÑÌ,ì²w]ȯMöÆŽ×rÔõY|Žé ©_{‹¼6u½¢%EW˜¥‚!˜înB¤EÚªïHMfF2¥ÀÝ¡ €4•+eÊDŠp¨<]X åg’K'ó;ëµÜÊÅR¹@kz¹³¾¥P ‚•æIrwI2Éœ XSÙ";‘ $)Á„e‰Ò÷Ò*p¡‰af‘.Ï9»ËhfæÙ¡5PF!(Ì2œX>ô¢¢c†Î ÂØá@fÑáf‰„]á€x‹CÖ\¿xáS×öòîž¿nßýŠ·|ÅÎ…G²ðžozß{ßûþ¿ù?ýìüÒ‡C÷úŸþé¿õ¯ýÀûÑÌ~ù×ÿ¯Ï½t}ÿÂ¥EòêèoùÊŸþû¿p¡Å_ù±Ÿø‹ý/ÿéëjg¡{óî`ýÉÎnçîfÎG‚Á($OkWg,ŠÁ`tPDNÇe„Ëà—A&ƒ2(Ñ3zõ‰Ékk 7$‚X˜vÍ;ÃáÜ<'$¿Ôv1ˆ¯GþS¡ÿ†¼x'zïñ:Ëxlvãjxy¾ÿò#<þöæ=:þÊîuîæ;³Ôay°Ò…£Ù*©ë¾Ë34MÜéЮó^ÓŸ¹¿Ì(  $©|‡œ@*‹›?™¦ëmø«¹Ì $•Ÿ« ’4B}‡”ÊE³RÕ°nµE߯·H<±ïj3¼L€K Š€G'IyYÇC/Ê{‡k'‹Cå6Ðëm#­4¯\Û¯ŠÈugn¿×,–~©6`XK}7LÐfÿº;Y7§¦ÖT'@°2Š’ÖÿTÇZœœÁZ71½!ùæJiO¹Á?÷‡¿Ò34)$ö&å³Îºq5üÉ*ñ_vþ%”²ÔÜBêytØ…ÄѼùMϾøÜ玻—Õc¾;Cw<,ôa{B¡• ²°UøÖ][e\ŽØ¬ZÇö+/{ƒ§V3 ¿hGÆ\ø.?uó”,zŸ9lBm×;¾wl¼»gƒ$™àÈ­K#mB| Ū£$ (‚ˆ”Á% ¯›Ú   œoúU‡¥¼¢’JHÊ“`¥À¥ì! 9çœ]â¼ikHæœ-*„ÀÐÂ%©ëR·NhZ²@²‹&3ds£È2–KÛ$3œHÍVéo… !3™,˜ýؼc´eÇð®GFÀáz7Ä>,.ÆôÁùú‡os¬óìÓHטa8ÈZ½¼ºzŒ¹¯v¾û_[üÅÇš¿óàû†õ/}UÓíùkî„õ í'÷WoÈ|‰aÚ‹éx§ëW!ï/ÞŸÍa|{M×µ†/¦B¾G ãÌJP ÷¥Pþg@‘æLÄ &œÄÉý2yã«£xŒœæÄÞ—+÷(ôw @Ó ÑËGAÂücì?¶üžÿã³ïýà£?ùmWÿÎl禎¿Âg´ç8?^ƒõl½¾Ã°sæºrYò#ÿ8‹‰Ï‡u"2mUsN1l˜  >eÀ#O*ÿíLe«²[òäþØpßñK¹ðÀrBƒý2tÖ£ê÷ÙÞ’BÎzpsÑÌÜ+Ìd“¡>![ÔñÜ®jÞó¦rœ õõÄÞ…q,ÑE‹¢ÉBOe*v•&1.kz†qÆ0 1B”“æ01l³ÑÊ2ý^[µmœ*ÿ’ȸvhBù÷ôR>Û~ˉ2m†»Ü=¥”RÂYõÁ¯@Q^N[p&„có3|¹ü-CÙŒ]õSJbå^FFÐHžõ–­.;†_„#BÊp]pšËäÑ Œðõñ²_w;;‹ãããÔ¹’ä̪ë³CB¿ê–k`L‚¤@ @CkHÀu ÚÆ`IšYCoèc7)½¹ö«Ž‚ƒîžŠ/gaçy)/2’Gx6¤ÿ ê?…®É$¹î÷€cã"ê2¸Ñ2BZ6é>V«6;üîNÆA6¨…üs}ø_¯×_ùÄñâÍw¥wwoÌ=ãø­Ñ,­”i:óSÖ6­`—äžÜÓ0 ¶Á³ìW,¶ý+îè*ÿrbá„ÓÔæíÛ¯ÚnöéEµÙª_ ©mPd:RT¹È^ƒ¢ég~¦}™~œ,½LåC'¶ ˦1'þ:P0£È2?”(ÑUÆùÄŸ©Œ¥®“SåðOXyè4` ™Ë àßÿÛyß·ÝF{y±kûWÔõÇÁš6쯡͚F.¶LЭ·|l¾6)åFš!´f!±x ‘4å0ÐL*'Õ4•µl*Ãjk;I4Q¬ûÓŠ¾†B’‹Š9s##Ÿ2(ƒ*ŠB§T6e´£’Šp6}Õ5÷qßuÄ ´bÄ•ª…Ž…Ur €eº§¬ÌŽŒN@ÊÜ@Ï6 ÎBs=iM…äcÖMÕI­hÅ•3:Yl$ÁÜQñÀù™f­z¦ÜÁûÝùº[¶3kÛ˜{gïd ¬ÂÕëu¿^9 ¡™+Äì -ZklÅFÁŠî†@‚yé54D!@vôV¦ƒ fHR–8£ Ÿçx¬Ø¿›ëÿxíêŒ-Ù€M…ì˔ϺòeáNÛ”Å!,yºhÞ6j ÷^Zï¾tôO¢ÛÿæW]ùèìþc~ÿÉnñrœßnÛùùK«ª¼‚c3!êDÙU­”~ ÷›2ņNT/¢Dñï«èè6¦ºQ‘Ï^´ä6${FTŒ•/ž+1 Î\Ó÷ôŒ2šE6Æàaã²D CEJ84žnÒÓsQ`³Š©£,Mï+)Ëlüë¦Z#r}cTå²8Ï@³i'u¹Ž0xRXÖ°B®òÐ1`2Hƒ‹ ròuÍùå| v°§ž¹0ofðdÞ)CÄ@ß=»{ä!‡Ôƒ2¢ØÐÚ£#`Ó(Vœ”™•m‹öU\ˆTþà¡Û.™üÐ1àR6(§²#‘º{ý´wN˜?ùôåýýýœûc9m-W’‚¤&¨p2 -0–°N‚`›}Yר°&í8¯øy7ŒW©íßCï4±ÍœQ/ÁÒÖ0$H&å)4ív}Ý)¤hÓ•á†òÞ ˜×j] ‘«®ì›˜t¨ÔK¤.—¤ËHˆ€Sd—®¹=HÅ=d£8ñ= -,W81àV\D«k¶P)VvÀMžsŸ}MS×/ ¸çI&„ÐÄ{!„ †œ³gˆ¡©:hfà½÷2wW† Î Ò!‡Tmt"y<Ë$T W‘Õ8F&šbZgººg‘~Dx¯/nç~þJ+ð.$x þÙCˆ! Û-"Ãn©Çʲ² ¿Ÿ#|uUÞ÷OßE> Bë룽æ×_xÿµ{íµ7þ'ù½¸~M>¼Âü²Ú³••aNóSŵ)«ÀFÕûÒK.+Î2¡ÜEÃÉ[”sÎRË ßnù—‚Nyð™\'6éñ~«–s/XGŸéR5EO7Wm¶ãĶ©“2”`$ÔkâH4`NÌÌ=OkgªÆ¿•ÝFUÙƒÁ«Ø•Ë¿c=ÓÞéü9>ÝòÿŸ?¥GγØ ´h²²Y¾¥@÷ÉŸûèöÛSÖ{¿õ±ÿ«oÚ¿ó±ìÞŒ·/µqflŒ½¤#Éœ²²GqÕ4/ywöĪeŸßñf±“»µ§ E3@} ‚11 E6'E—p±«+1ƒ¬ì p7²†J¹÷eÕ“e«¦ïV&“€A"0#@@K`ˆ¸;ÏÔº”éNde–`*¡Ù™Ü èD&¨—z Õ¡t)Ñ3‘BFÄXÞè î†Ö‘ …%V_eeÒzR0cÓ«¢' Yi,$s§Ðňâ›ZÌŠ':fÊck),(„bŒªfW'J–CÊ\®Ь­±›“­–×ãún³ðy¾PnÕ®WØ[ï·Öîÿ±ëòò®Ý[=utõãíúéZ¹85—š•xSÛ~7Ò #«fLÀð:ªéă¶j QŒ™=ÍÂÍ3!å>e’K½¤vN@5å_ó\LejUÝöˆ{EÞ€mÕV…è‹ÄHºAÆLI9ôŸ£$ ¾Ž!x49á‰mªÖ»€¬ê×?¾tð3/qVÄöŠ53„A8)|‘…›: ‚ªG@ËB†J X½ð €±©ì›¥ÅUùÍmãt¡/n'$A©äùš¢ (úÖØ4zÄ۸Ѯ¿<8ºŒKÕA6ríL¡G— À }°ÁÕÖÛ¸ý¯†E®¼©,_‚2 "Nd)ÒXí!²†Ð¥|¼u:"®”‡Žã”RXt¢÷ý·þé¾ÿ/ÌšôÆG¾ûé§þÞ>7o­µ…^RvÕ'Cˆ¦„‘ÎAA>f1€>x/îâHr·22˜™”3€"ù²#CÐtÚ†ý7¾br‘§L*C9/ÔØ‹#*PhÀÆ¥ÿ–U'ªx†X±@²RDu°°•ÈÈ(zdm)Ò‹àOC(ýúêñ(€Ää(ý¬æê-Ö6OU¬]5JÈØ!Q ½µÖb_¶ºÁMð €ffR&¹»ØïWyg»³¹Éc`$r×õô€ÜçܯVy½jq°X,æóyßXcÕ%¶Ýá2€3«R;ô/ƒV_G^C‡``AÝ *!Z²`NJès†éÙ¼þ7Vžs dâêùú¥Ã#GkÌÂÍßø3¿}ç·¾j×½´×o4ÇòÿjÙ=o&O£©eümðÁÛ{8]¬ Ù¼î¼úGä“ã Oueœ°€žÛ‰"Öu¨˜í,‚ôˆZWY~žPÐ_‘ËœF›†ë[Um¾Ëʶ¯Lûœö€B©f‡J:¹s¢Ó2 íŒù}@¿N×ÿŠ|ieSºžÙÕ¯®»Å½Fþtu2C °€ƒòSÕ¼C^9ãùâ '¸) ™E¿êï@ ä;ž;`uw›”‡Žo¬‚—ÐQIÀ:íÿÊ?ûå&z¬‰×¾íÙG>õ«Ÿ¥]’+yï9ÃÝ£1’}Ï, w÷HÈÑÓŽÌàE$4¤du±¹Ó·–WÁˆAAu¸i»>C`ʇ§j/¸çÚŸ3Áu/(쇕Ë&f kð—ôàX©þÂq ^Âe±iSùfdȹìøÂY0 %(·nËÊjk²!m8\+ —¤ÌbØ®}‹I˜ë‹ ©0UÈqŠøÕG² 4lˆ¼qņí(Â\;)бH@RMÞäêÝý`ïÒò~Úiv/,vû£#æå!'W˜µqѶ6kºÃ¥)ÏcCe‘6g\Û .õ2º¹”=g‡T Òe¯­RrгZ‰Ì²âHZHTné9€fë¸å•ЦE|ý:܇_ž fR|µ(Yƒv}¼ÞŸþßéÍûŸÿ®×?óS]sx¹ßÛ^o>Æí 7eÏÀ ™â4G<éÜD@Ð z來sÌÆE61äd˜¾ê îƒèªÑ¥‘$!?cä^‹£˜æ)’^r{U»ÈpæZA¡~™¾eÆ×®ŸãM†“‡ºYÂþDÈ6Þ_Å3†­TDòŸfÚ²ÍÚ£ÍÏÞÉâ†3jÀ›¡xÕ èÑf¿µ`rü)ó÷ou<"-ˆ}ÃnŠ ÔÂgD Í€ °D ¨ú±d 2ðXÒÊáDrd–Öä!>šíWaH®ÐʇŽcꈠXC]÷±þøçoÁn(íÉðµoû?<øÕp3îÌAV)äpƒ‘rÉ—€Þ,yŽðýºJ4ªjlë S7.Œn“‚ Ër'LGå¨&qܲ© ¾*î´M8ìZ ™3s2µ)§£ãet ³vA²ë“·h›°e@ŸÜR!tBfé{ Òéð¢óR%l¤Œ{<ÒA„¬Þ<[EKÆ,Áâ[‰±òùB°5¹ÈÈÔ+8 }‘¥ƒ€£U~íŠýo_ÿ¡O<ú«Ïc°µUL3‹Ë€m‹Xoß|šOË”ûV l gE^h6ú"TžaF éÝFÞ6RüqgV澤Brl˜ä2£cÌ9¨õc”ÎÉúG&Wl/ccF~v‚O­>Áó ëÅFÌ­¨ó å~Ãó†©#‰Š3CÚr~áàáqjÐ8ÞRʼnW—ÿœ®üÕ, €rU[| öÍAß¼C˜ tû°ÏB"B” Ï<Þv‰O`:t¥"ÒHUÈ—v€H\r\ÖH+áëg”‡Ž¸ 0(a…AŠÇ_¸{ÏýÒÁÓ:ì¾öíß¼sõ¯ñÅl‘pÙ¸QÊÁÁ(:%ó×m“ò½Œ†è‹Ñæ˜ cQ]ª$"ÁˆšW¡êµ—€£j9SºÜê×9t®øê¦”Ü“¹D‰ ËÂ+I+ +PÓdj4ö” 9õ©°Á¿Æ àUœ'Áf%n( rPß5š¾0pœÝ€&ÉzIi¨±Ò(Fà %mÈØP£Á\bÉÔ!@%!Š»s1c›¤ºØÙ¡„@e_¯Wfó®‹ë^MÓtëܺ´XÌwfsÏÝîö=€ÙlÖÌæ‚¥”2z“5ÕÇMî XSyZ1ÃPÒsâÇ““0É這sï9ÑB†)Ç€G¸œ(ÁèrÿŠ^»_d‘-¯øî-¶XÞ\îýÆï~×µÿ~}¶(æä«ÎVPÏrY‘çÓe;0щÏ+'ÝIA:IÜ+&„ªþnZ~b‹m´Oâ\ä^BçGC¹×üo%b'Ôœuy€ª,s®­žžUNè—#ô³ùyü;l¦2%4²`¾TkÛb‡†r¸¾%»”lóf|N(î'ÿ¦N³’ägèÎðÔ1>üt—Ð8òèýÔ7 ß{ÔàˆN {|Ð;†\ð7e07Ü«4^yÃé%ñž¸ _Þï¼þ€V>\åtº†’07ËçoÚ?ø_~„Íxõ‰·6W®e$x™º0Ȱ°,G(ÐŽõaÖÅfmç,{ Õ̃CqPÕ™MF)”eQÙÕJŽèÍA ÀÔŠYÜK2ª×wHR^œø”7•¥0$¸/y»2-Q%åW(=•gD°AdÉÐÈü¬â[œnÝ ‰ åÉjDwHH,§˜ˆ@ÕW5•CÑÆ!s˜ÃJ> g‡2£¿5”¥wfE #J2œ”Oê¤Ciˆö òYIÁç"™Ýò²[÷œ±Ý[&‹v½îs—é€,¥|tÜ÷ž,ܺq½?^&y˜ÍÙÆÞsÎ9-<(Ãs1@P(£;K¬‹—Ä Å©ž¬AΞ0rÐËŸ#hìr"ùÂqÍð¡îôÐC)Ü^=Áº½0ƒr!Ø¿ó{nöó>´ƒÃGƒ™yN9 ´ƒ[VÝ_ˆÊÍ—ºûBUïÎ-› dq Ü 'xÌtÅN5Ë/uxÊòóªO»…<æ7¬D#W9C9ÁÿÎd‡gÞâžáºKYðâí@Ê §ÓþlÚO‚ãD¡*>QØÏ¸ØnØšDž¸~º©§pj%œ}óµxe¨µJƒ …?ýk×rá©ÈÀº[‘'d²£3ܧ݅ÝY!çsðÞ-Év‰·ï¡.? •>kŽËÚYãâ?ú™ßo;ÀüÊïÞ½°»I†Œs` ™²µkk:wÄÑ „KÚ¤CpOB6xÉ_4KcÌÙÝåŽòÙ°” Ÿ È@a •fÛ¤O:ñ™VU7«35£X{È¡ &ÐPHà-¨„' þY' ,ey‘²<»;”ä®ÞÕ9›48t%(™Bó œòÔÒG•9ÕÃ;Ï)ûxÿPåÁ£ PsEaÒ÷É|c ¶‹¦`Ž™YÓú[^{êdó WVBÜ]d,¶í¼m©ÇѲëÅÅÁ%RfÚYÜÙaÓö®œs¡Gwó eʃ1"ÇA}VˆF\&M,’ŒðÈDÀ3Ä Ážv<‘CIøÙ˜-s†÷_2#9¯Ð/_‡àÁÖ-°¼·ºò›·¿®mç*‹fSrÁ9xNÙªsz} $,_Ç0Üá'0þ<¯~)|Žä*¿exžr”*æ·xÏ©í6}üÌ2$÷®2®#{uˆÝÊùU…ïSü’ä˜êD 1*ëÛ"æéz¦í)¯–zu¢æç=5ŒÞI'wÀ IDAT¶Z$‰"LŒßk´Ô+ÕP.Nóýñ^ŽÉ–ÇI:¿LeKÅ»ª1ÿé1DZ½$^ML߯†Lš¸,Üî: ¦H0Õ¬IB,­Áp¨š‰ÀÁb³*ã·Ç s”mÐà™Þ_–°z¾Ï7ÃvªýæK—ßôŽ7ìïÄ|Ü'èmoŒO_½ðá±{û/ö·Viǹòbã ÉÜwßµœ¥Îl%÷ÁÈ’6­X:‘Ý¥[ÌûŒÐÝLç³n?,oó“iõ·êÙ ¯$¬÷_­ý²Ö!üñk™ÍÕ¾¨‹óþº¬8ʉ5‚³Ü_r‘qÔÞFJk·)þ,¯¶ÉêVþZªÊV…ÂA7ªÙ¤‹HK±-ï•Còl#3(¦ ‡ENØTí¯°_ÂÆ´I¢A¬ßǸ¹¤ ‰J]rÓ•S@8¤¹€fä+1HNwaÅ®ä2ƒȬؒ†ì¢®u‘ìke*»D1ìœHæUÏ uÜJfÎã¶>Ž5ÐO²&Ô#Çœ‘EnP"I«©®$©:/2ŽQeÅšS$S‹ÁàÏ]Æsc8`idÎ.©™¡@Qof‰Ï.Â2«ù*° ¾Ões¼ŠL§óó[,+7@iÏí¶BúVÙ1 åB—`Ñ(g5Í<¯W]ÜÙËÍïëÞ³Ð:ãÀšèùáî,\Y¯ è;áØ_ÄjoÖ^í:'´ØÑÑòÅÅüµÇézÈß$~Òóর ­ØÛü‡ŽOʶ¹ßf³¦™õñã¿ùoz.F{æ©Ç{lïSŸ^BA6 —¢y¿Î"2‘ îj CCëë¥?TµX¨ŠM¦ŒÛ~Ù$MŒfFÕS2jª*N$Ì5´v´äžë½0 Ðc RѺò°]xz0 ¨I ®ÓÅ€ÊmÈnÜ~'²ÜÑÄ ¨èå†Q..»1+BCö\ €‚sx©MÜ9Ø©F:R á(Y{X}Òd5d6ÆóÆçšQ4‚./ç®g—9ë™ÄÌò$W Ŷ—.]:88X,ÒN7¿ºá›ÞõuWÞó wŸ¼òÌÎü¢˜`ó°Æ2O<ñDÓ4XéÂîNÓ´Hk’0!—œÙ‡,^e¢mp¥@cIÀ1$X\UsBPàÙ=e!@{˜²W§¨)D)fKÈÖ§ƒõ4ê©RáI¥g£Æm!<;ù>dáæ’˜ãÃÁeéäæ¼#·P¨ºÒ1›ä(ùhIÖ€ !JØÖôk ‚k‡äužKÛùe ön˜W\#>72Ïsê­NãÄ`BLP¶ßK¬v­â#3Æh:ð 'Ó?îÒ^íŽnÜëC®ø Ö]•ºý½æ^¿òõÌš]w_÷÷vv®ÍÍí[¿?Û{‹X¿Ø,vúu´ì÷/¿öþíCÄP–öŠ/ÅÃÈ€ë©Âp\õìè°Ôr³ŸúŸ?ü£ï¼Ýàò•ýöàb/ݧæMhè}"af%óƘO²§ÖDïዌc`fqì^­)$BY^î }È¿C+GñÕÓÉÛ‰T)`-TOÿ-þ½‹•厊Å;]¢¢Êž,°ó°Jf(è›"Ðk‚ ya¦;•I>ŠaÇŽ~Éî›Ã FÑÞÌhR9èÇJ„±™–ÜÝåø=+b‘ ¯’4FU•ú­¤±dÉ RÎo QV3ø¥~Æ\aèlnVÓ !9úÜÇHMÓ\¾réÊ•+³ùrŸšÐ^Þ½˜îýܯ}ø¹ßü½Ã^˜_ݹ¼;ÿoÿ»ÿfÕwm³3›ÍúuׯÖ!4«ûGÚi`t/@€Y*¹Æ´ Dµ[—@” dBµJ–¥Ð@ë]» {ÐåW/nòìbÞ"¬ˆç ˜uý#+ǹîPf^ŹfÝb'ð† ©œêMÿ‰Áÿ¶å»<µnÂS7PÂÔ*<åÁlˆ^êïK´údTk?Nï¯ÊJ'·’ÃÉ5­J™Á’ߪdƒŒÃ …³MZÆí34اÎSS ㌊çpH©ì\NÆ )ŸUÏÆF[¯Œ-0Õé«'èBDMo3D×ôæ}%Ÿ5ÁÅÿgÞHÛ2ÍÐä£7æ¾¢_å¦É-pÔ7 ÌïÞEs'Æ×e>GÄr¹^.3Ú+ëÃc`½³x@ï÷ÁK«À ¹ iÜêÑù›ô¡cÀÃ*q§²€P íÎ>ü‹Ëµ—‚_n­üñY ÷³»Ø˜…¬>ÐC½,[&,¸D­Ëà3Aó>Ï ­:ÊIw(ë«"3#4%í~ei‰”$ÜÉ’ÑbƒO Èy<¤¬dœ¬Ñù¼9ÖÈ¢)°œµ`cbU&Ve|ãy2€ãýÕ; CÓÈÿ–Ìw( “2 0Î Àêge÷{ÉÑg´B \åŒ °pFy=x< B€1’¹„Ж|ó£:B8˜‹Æl5{`¡¨ž2¬*#*ouÇÓ_I¹ËGo¼÷Ôõml.^<ès·»¿scyïîòðõW/àßÿÔ¿ûo¬‰ÍnêÑwi6›-fóFÞ¹ÈP<Ô]îLEáÖˆ(G¿¼’ED¨PI †SF=Äxn<øcWDذ & íóA/µçÜ>h`À6ø`<òmq>›Ê-v¸õà¤ZãÆþ´rÏȃOð­8½8Öcõœð’áqàŒ «0 sšjÀ檈Cõ'¶õû²%Æí®ž‘–kÊžO¶ã•Ê`‹ÝºòŠ ç£ªS98” ìƒ =„ ÞàU©ÞîãºP|éC•¶Rÿýñ”:…ÎF‡à©ÐÝ}÷7Çûw¯ì_¬/į´ÇÇÙ >ÁºöÀºÛkÀçÍc©;ºpéÎÛÞ6¿óò­/áÆýþp‰xˆ¼_³Bñ-A&cóIàÞÇ16´þÌW\»¸‡;Ç]ŸDkh€’…fžD°ž:&Vô^jún6k£ *Ü%ÓÊñ<¾Y|ÃÄHr÷ä–}*°â”ƒ©eHöX¢CYÿ†ºÏ=›f\ÏÎ!G•´‰;¬Àº½¾÷•I)ê¬& ÜKw,ž‡³Ðm4ÝmoÔ>'ŽÐ` ¡pGIM岬‘ö”À eT§-öœÝA§pªÄƒ1»CÅ<‡ä•SŠâ4€-f(#‹L©»{ïÎÝ»wv÷÷®ßºÙ>óú[H¿ö;¿õ»÷olž½xí`>ï0^Cø¶ïyoßûá½£r$Ãñò84 KºeC–œée¹Ky=+‘,iU™ÆmƒË–l¶ˆï ’ú¯ZùbFIJ<ê[ãò;·[c²ˆZsµ7ƒ¡ªÉ5çp•¬¶R$NXÚ&5ÌÆ1 $›‚Št™R0O`Òò%l!§e&ØôȲ‚Ü ¸ÍD;­>žY^‘õnÁ¿[õüÑ9Û–v«a}Žs°ÝØSCQp§NàågѨ‚’}¹ ¿ˆ2/ß$zr÷ÎO}øÑ· ¨g~þgñçø£w·+Ï7G¯]¯íQwÿ°Ù}]t;>ºùôþ½¿ü×_ÿ}?â‘ü‹þçÿõÏ>çÑförtÕ]<γÀ:ÌÊh »þ¸…-SGíþ?ý'Ͼíhâ³o}ó]8úìz¹VÓ´9@Þ—P‚ ä¤uàqÔ*©‡‡œ¶™Û$%“jJÁq M¸ïh•¯”3”J–d²¤J¯ÇÿÊXÎß³šuv°ž·p5úCTÌ5Äë aI}yþBɆt%£r…ûƹ¬$ˆ “d$ÃÁLPVõ¯Öðöìy€ßkwrM…礊“Æv,IåÌ?€0È­’IVv²”\¬çÞq“¿:°ô%8ðÇl¦à»Ã×° ÷šóÙ@¥Ï£¡z´óˆoòKŒ‰Æ`zRá”븀*vT#݆tTÃ3’@¯ç Ÿæjî'.’ÔèÌ:Õ¹ÇP‚¥É¶ÝÞx‚†Z«v_ŒIßA™‡Ç«X°u*ѤJGà–ð%”ò’mœ¸¼ëìûË ýàóŒêÄi¡aì×p󸆹®¹òí|UâÕ)[™>&OÿÜÍ¿ök>1?^]üà¬ý'¾ê?þ‘ã/<ÿ8›Â":tè¾¶?²úã™÷~'è›ßýW¿ûû~êoÏö€^H@ªés‘N¶`»òÛ~ö­€ÂWÍ»ž~êÑÏßxéî±ÅØ¢ ©ë!Gp&2E­©žÊŽˆ£%•b®&Þ!¨¨8õ¹&eyr8­![ ¥§Ï5“Àh ËP2¾rÕºs§ ^öÕñRvz MKL­Åz]‚vH¤¼ñ&Ý@UUÊ)ôBÐ!LÃvÇÝk‡XÉ2 ¥=¾VñS"½¤ø<³›‚@2^›‡"v—TÏ%eYZ=¹ÁYÔa£'‰¢Tôl˜KJBŒG÷î½øâ‹;;;ýüç^Ó÷W^ûÔz½Î×oÞ¾õÒÍ/¼™Þ¸µzÞö̱ˆá`÷`6›¡ 1£Ý]à° *™¶œp¥šŒl,¥#|îYr`mŒŽ#[’ä9CrÖ]è&ñø+Lü—WÜ:hV2™Ú ¶Íõ¹a}ÎýST£üwJ²Ëå?ÓÛª$9ác¸Ý 5zHAº ö ËܶÝúx½ümK;´30€~€”Nt*Ð6j°oø–xòÎRRX1AÔL’ȉ`Ìj0†ÜÈgi˜^yð>==ç1U§³AâyEÉIµ#Å^7Þ¿Å8ǩ̞ŠÒª¢ì«Ä¯ÊëÅ'ú¼`¬W³ø&IVUÈ ÛƒeÊ‹îòŽxéýß·wa±ø¡^?NŠa‘rf^û‹_ù–þGþ“¯üŽ8Ê=q¼ëz ìí¬¡Ð\Êiõ`t(‡Ò>0”î¡Kı)ý̺ËÙßëï¯|ñ›¿õ[è‘:4¯]¹2oZÈÌ‚ÅP¢ŠÀŒIòG— bÂ0³ƒa0é5°ÑÇÜ"4ãÏâ<þ)yÍq‘äi _®¸'Wιwå¬ôÅ9Kj³[*3c«m8ÿÙÌšs`LèQ~åœO¤ÂàxÖ·lüBˆÅXŽ)Uyh¼_c0‹$G‘Ä !‚„•ß%ËIIZ‹ãYÆ­$R2 ¬õSÒl†@ ©$Jã!«îž¼a†®ëîÞ½Ó¶í;wrÎGGGÌ~eÿÊξuÙ’ïÙ|/Ìg!ª÷î8ÃÕ÷}JÉûË£Š{.ù°M°![È´å5qA28Q›2xZñà<›{Í)ºûEMü—SØC"y<jâ½™ËÎ\äÆTO3'®|PΦ²gÈ6É·j2 @ÅÙ˜åø-/×uÞÇätUÏ8ÓËgeZM~®6ŸˆuÄ:`eZƒ•ÏÒX>ÇÁV«ˆã eÐ2ê8ÔO2”O>«LŸ&¾(ÑîH|ñŌ甤°œ]‚è雟_Ê<┈ðàÂꤲõ!U€ X&m~þ1IE)ßdA÷﬎ÓåfçåÜ"]Þm¿åÛnüì/<ÕÌRÊ·a1ø¾Ü^ÿäþÃÿèmúáàÚ Í­nö"wŽ>õÜòþá§{ä<ÿ]0%JIñ =zè4àšox@VÆñ™ñRŸî8–Ç|ñ3øöïÅxÃú7¼õ_ÿÿÉÇ›t§õ]çÌ›+ëîÐ"º¼IÞ¤^ùhÍ;>Û áÒ:ôÀM Eì¬Ñ›ß›¹­Q]±x†Œ r^ÃN œèªþWf¤‚ÁMÊŽRæ2órº;º7†\rGò YôÎ h%1ƒ=<®&²¬•ÈÓäU#ÙPOÀJ€Ã<Í€†ÍбíIÁ£$cÈÞ•;í_¾|ûîËØ )·û³—WGf!ÙÀɳr¦ÁZ8E ÐUÎörÂ9Ÿd–…qî“sþ™Ë8r”C‰ÊU@ Åùùàh†,ѳɳĵ…[»9GòR»sC³Ø;¸·É./ï<¢öþz–³ƒæÎõøÔ®ÝZ]êW÷o.VW:,ÛýæŠæŸ¿ëþþìkîçôé^V—°·ßßy®qoq­7Ãq:ê®X\6‹çåR¼Ô‡GR>œ­ªæ’ !®ótç©`½àî1³q¶²®uÃ"öÍ[ʲóÂ%sæ_{‰o2{¤Ï2fk¸ÐϱøW“󀿜ýâN4³E?[âðÚc;ïìR¶ç‚=…SœURfC0$ÑÌh$»n…’ò%(„c–»#ZëyMm)éÖÅù‰š+µœ FL’¼*`e6£‹¢Uâ³ÈdÉrn0ú-r?~ÏMšhÍ5êƒêYÀdG‰^rÌCŒ§«ÂÅn’îƒ!³Æ¥$÷ ÿÚ T#¶®¹cÞçYŸ‡›UMqÛ äÝÙ:™§É@5¤âö ØÜ=çLkP ZeìÆ Sµe~RyhCê! ÃS\Å‚nå 1Ôó¹ëIêðZñÁ¬gcHJ)%åÈyÅu*Î;Ã`Õ÷:ù\³Ø¥ J†Oþ€ÖýŽ÷¼ág~æ‘7?s>KK.Úkßò¾ÛïýàŸúÜ*ÍR~ñê¥ø_ýÕý|ðÅ”oò-„§úˆOÜÂ~àcÿÌóp|Ÿ Zh!Ìa=ÑsÌówVyèð¦lÔå;rÌÚþ¸ûìg>ñú×qïòûð•oýêÅâ祼^÷ )6™u)Á‘ýɇlŽîÙ\1—pŒº÷€ê:8Éë<\<³iÕ Ö×Aö[\ (UB–”3dŠîƒeÇi×Dn¨IAÀˆ%H•SŸ¬Sm½f¿Bq?ÐìP/>»æ€`W¯^ºyxðöâÅõ:¯ðòóݽã’Z«Dù3@3³—ìNÍÐUsQG3 Ô< RpÐ唉æp(ö ‚2fƒëÉ’†K«NÀ¬œW#ƒÝ,æ¹Mž1#CTlƒXÓîGÜãòØÔK½áF§‹º”rsÈ‹ìr> é°á£»oݾ¼ÛîÛÑqP{ÍÞìÂñ¬»}|óàîã:½¦›½yÿ‰gú´Ÿm§½z{±þLX}av×ó‹³£+ásíý>€zZ«–àÚò’‚!¢ø¤ÉaÙBÆçÁ}率ƒžGǘuÙWé³@/A×eô»`ÆúUÃ¥¢l‰—/ßúÌãoýe¸Ö7[ 6÷[¡µÅ1~#Ìyc’ óëkb ÷Œ6Æ,؈@#&Ðû´ç42à’È‚ä(EIa<o‡Kêm äu©‡ÁcÞGx¼>&pŽ$±ð‡M2Å‘ûbŒâú0¼6ò$ÌLV|û­0`3«yY…0(bcýgŽÿùÊnñíb„I¼ÃÖ¸óø+”Z/&è7ÏrýóS6õe$Öd´BuÄøW­,ßùÉ=÷ï»ûKÿü—ùöí2»ïû&þäÏïÿ{?øÉõÑÞÿð“O|ÏŸ†ßÝ;ÊÝÎ>ÿâ‹O~ï7äÖ˯µù§ŽWØY¼sÙÝ&TN¼ñK®8 ðgÞ÷xáó»¿òÏ~ü{¿ãÏÚüî[ÞúõóÝ«=[ˆ18,4J}ɯQì‘p¹½³)—7õ ‹ÌÀÀ`"RŠffJJPµ£*™P6‰2o€YñÄ–„oÄ3KÔ— ÎjÈŒ„ìÙ á `™@;éúE׬luH€šhîŸm]ñ®õÞê’èZYu|v䦟 ¢,n˜“œ9Å ÁXY“BÍuü,&S¦2 ðy!ë€íàuW ‚Ãñÿ Y5V?>¼C½´ìG&‹èù Ã…žýÑe}µûí˜ùF[áà‹|)‡IòZJ¸ÿ‰Ï_øžïþà¯üÎ×Ê:8ÂaQ¾ç[Ç“_yˆ7¾í¢ –òt’ƸpéöïÿÎ?ùÜ3÷Fìi<>·XlÃuMWºh?ôú vx|y0©½CXUX.|Ý,™ÐXñËïýýïøÑÚ򪃮‰j²—´`I)ÌHCSGa"¢NãEAàHÖEZ6b:RT^˜¹ëVO"¤=¡ÁÌ2C„Ì:u¬°²[œ»s@{ÝŒÜþ(ƒ¸uÙ›ÎöU€IM{ú±!fÚ¬æz´®Ü*f¹Qj&0¤uAÐ~ã±Ã­ÙÌÌp}¨/;ßQ!Ì’‰V$ ¨Q@Þ¹²©P3.F‹ýJéÌ·]œ/œs¥/ W–Î{)<‹ˆˆ]ffv^|YUQV®ðι;eˆ„¸çœó¾¹C¶$ˆ™œäô° Ý"ѳxñ•ó*ÇâÇä<\J0À–[Eoì5"Ä#ÇÕtmrm<™ãZJLw66«+×®Nëxû=¯~áÚöù·½ë÷¼výÌ­w]ˆMÉe{¥¾x…v÷/n¿àCäÊo·WÞtæØ»¿õ›Þ|ßw‡äv÷µtçÛôÄbïÅIµyÜJjÓÌÛtBÛË:¤LÁ”¨K¥›Ù–ªš Qƒi`¨ÀœÑÕñº¦±/)”:uh<:óØŸ^üèW£dëf ¨Ù&Š/•”ÖGB‹d¨‹ðð«ŸY[‹3·±¤› /0´ÙÎÿé&=G«sžOUC›Ó6Kž‘$©ªF†Â¥/ J⮃|•ØK?æ Hæ-˜u²Jf¤û¾÷ ’Ä=a’¨7¸@’£XLJãÏèÀØzíñÕƒ‰¨éIØ}aA—ù[{M."™#aM)0ʤF2fgà™.ò IDATü¼úKt«ïºFFÃ8kjô"ÅuâY«Øy ÐüýäÓ¡/Û=Àüë!s‰ceé_öà&ÎúpÓ7ÿ‹6nžövòt47äãçÞõµÿÂûo}ý}còæ)ðÛ¾árA…Kg€ü“M¸ãñçùGÿÆSŸùäýÊûÐã£êäbñ¬óµ€Ìâ¸!Ð}“ë~±¿ÞÿuåÒ¹^ )æ=fú‡ñshîÔRï¸ëîÇ¿2[„®v;lÌ1·¤·DFQ¨&ÒÖÄÌ#ˆs˜AJNŽ­€̺¼Ìa!øîåÀ.ÆJ>&›’LœYEÃ46¨BIA]­i·Dèùù;ÓJ7…Z:0ÎâÃâBNaâL Ê®Š2ÈÈȈÈ4‹Ñ6 ð¶~¢Ù¹D‹å$ÊC·ÞòMoÿÚ3·ÞzûÝçî:»îœ«Š²(ÊÂùÒyï½™MŽ‹ˆxW£r4B9BQˆCC(e}d€=š9Pað6h'ägTôÉ}ÒÜôWj%A:³;ÈÙÀ ´€K Ø)KÇ#B’ ´U80ÀÑ`zþ"‡òÍwÜ}â ÷}íñýæ Ó]¼ðt|þªag±ÃûsÏH»=»²CñªÔ—.^X\ÛÝÕö“W¦u›NÜq×Ù»oŸž»=¬¯ï.çŸÂg© d¥y[‡Tm¹7)ÅbªS Д Ý·\;ÏZz­<éÂâ¼næ!4çîùÌìS¯µ^Cþ aDÌ€Í/Î*ajmê°žêz"¸÷5V}ýÞÚåÆªƒé±2bǶí2‚Ö÷å æ3újÀ\—Óå"„Ạ̀ш1Æ&&Ö0)'ÏÞû”hØôW/”#4ÝõÿÏõÔÙˆñÙËÉÀ˜œËJ8ä×öõ¸×›ć"Ï0Ì7 oþTg÷f¢ópYÄ\ß­º\‹˜%G.²ˆÆeR«¼HñÍQpt ~Ó'£ó}ôq¯—¦¿ý•Çf¯¼ÓÝA6ʼnVÄ x`:®”D¾ˆSþ%à#xg[›·^¹ö»®øú¸h?ûéÇäÂûýÞ³ˆŠj^À™›î¢Z[£òÜù+úw~à¹=²ö€Ñé[N^ºüÈÚÖælÇÁõí©oó¢·óe ÀC˳ü¼bÓpáËHAÛ‰/÷—×îßÉÀ_ÿ†ð±Ýý‹ŠÆÌˆE|é4F1òTc%4ž"[Ò(Ñ\A…¸ä)ʾ$(æ>¹MÒJ&¸Ïâä˜pÆÄœ5εLWaíÔ:¸ëM¤€ËMS3Lfµs”îöA'„~àw#·ºÞX}jÃD P¦ó'ëT3 +UóþlZy¿&òàÙÓ÷‡èoþ'?„ÓÇá9… "ã!RŽN±²ÔÌR3t‹Y`dDÎV»ú(™ ¼ÉǺz.ë¿ Z”— ŸE.B_€À S¤¬6# (+(B£ã¦t¤SŒö1 Ûû/<ñ©?õÙO?}þ9ûoœ<~l†ó³éÓ/–W—RÈÂ%Þ]¸êì+Çw­OÎÜzö¶{?7¿ý­ïNÎ_ØÏÙ1.Í«åü;þ'á©G6íäÚ‰Ñ ów÷öšå~jÚ‚[OóØFMDtGªR 1ƤÁ,ŒÔÌRPóUƒ²%Ñ$•6R»}ì±S“w¨ ^j«4¢ßAkë©™âá7ýòh]—ؘù °Éu#ÿz•€U»œ )ù”’ {–vÚºm[Y/ †EÕeh™µPø‚² )€ÕÊ"23YEG¢.b¦€ë«Ne˜WrDÍV BŒÒJÛƒÕ/”Vbc$,ã>¬Úûž¹–,w–È¥v¶À`üJ""µ.ÈÁ0ÀeQ¬Ü¡ïÇ5Ü̪E~ôÈf¹YNþXì+êc/Ó^Fš/.y³ÔæuvÒõoÁ@:Ê2ø’§‡0u¶¯mNÖß2Ÿî@üúú±ÈËë?ú[üÖ[Ïrïµa½Àä„âù þÝßø‘O>þ +ç±Yz¹ëÒåÏr1žï{ F6=¬ôpäø2`ësÀ«!hªdR¤Ð¶u W<ýôïÜsî;¼ý­où¥_üÕçÎ?o–ȉiyÒâRæ'¨Y†pà”b Ð²"ìX()’†œÑD¢ Wƒ3y “˜ˆ(3¡­O2­Ôuw9`ë’„8k-âì…YƒæÍÕHÜÇä¬OY­ÌþÑ7’‘™(ÌŒ™Á3ÚG‰(3M`‚±Ö{³cR½ímïø›?úwqË©k—€€L×1!sªã^íax€¥ŽäÒ«×0 ÄÔ’‘!1¢ÃØCº‚°ƒ0C·Ç¦Œ‹ŒÏ3žµùÒò¢.fêêÏ×À'NÔac·­®5T_­=êr÷ã®8¹õ¼ì¾ñëüªswþØ/}æCïýÝS“cãµæ“OìÔó=Ža­ˆ#ß°)½Ûn5¥”R¢¡É†ªª66«n-)¶¶`m&À˜Óf1Ñ5Â+k{RÀ‚xŒ_¢þÿeª-i<£ÅíÇÂë¾êwUn߯{O±«(~­üwËÌÌr»€ÈfÆ`(XKBêÄ9¿LÁQ¡Èž[Ò@Ê*)è¡d˜– õ½úw¾lžótXôÔ£ï®÷îãÃWÊboí¶çmý÷×ݼmkº³[9_I¹{u» çœÎ|c”Œ#4PEBK *¸É©ýjòüóÆÅd¦Li=.âS¼ÂÅ6~ºÀŸ¤ö­Zp·€6ärjs¦ÒYmîXÁKŽ`Ö¬“‰ÜÎÂ-TÆ5((ÂíïÇå~èÕ¿{Ï«~»]ŸÇÉØO“Þ‹ýµƒ&Ó™U ÃŸ½·¨jTHaf1jŒIœß8~<ÆhFuÆ©DÄ{oIA.—¡·2‡Õ«}H9_£ã@Â}ª¢3X]FM(ê¸TLÛÕMau¸é¾ahÁ.¬ 2ˆŽóŒµLƒ&t w¡Élp©1‘’@ê:€ɸï¢/‚¼ÐzoÁsï’rê·îÃ$ZŠ1öuÀ]»SâNŽŽ@†”{t› u𷯹¾ ŠdPL»> ùŸ€tVE¾Ô?ïD Â’%Ø­÷è H ô\èž­éÝ´ºbH$¯ÈNó_:7L7¼$Í!hÌáè.ÐäQ.±¬b¸óôÖÅÿã_¿öß|Ñ5gR W(¶Ý[m»5^[¾ëþÿyß›~üGfχ…ù%–êsRlh«P"$Ó`ÜÂŒY€p$ÙðÑÃr€¤Ñ.jLç£õÊ€Óg¶T÷Ì¢ó'’4•ºwvam8¡ÃD@LŒYêçO';íõ»ºPNªvhŸ–=ˆ gctçéŒß£{‡ å6tüîât‡æ²!uCtU'`  ·¨3‹ûŒ–tk)§#ÃL`¹ëŒ£åpe<:=—¥—Ë%ûÅÞÛ°õOþ—_ß-tlô¯þï÷ÿä¿øçO~äOM\hÀÉQ¬ç¼†xsÂæúÚÈ1œg'‚TšÙ‚šÇ«%‰UÉOདÅ´Ûš¦D³:p0ö\Ä'ªç¼:¥6h›$’pKUe(S$j­ˆÄMJó:.‚QdÏÕÌQãHÉ ˜3P0 É‚6m&B f‰™Yî¹çëãñöîå'žzL<Å:~îü³çÏŸ¿ÚL‹R>÷üùüѾáu¯9~Ë™Ï>qñ–Ó›k›%+‰¸®›¦ ‰A!.[#(›qO_QD,¢iµ(¨¬&¾QÝ„:´¡[O6Oå‡áÿGZN¹ýA¨ß¡¸fÑQ¿ÀÙí±y²I§LÕ°©X€gyLƨBh×cÔž3ì6ˆg³ûßô[¾îƒ¥Û\no91ªB®—p£÷gŽ"œQ0"fvÎQ'—FÜc éÇQÔßáŠýêÁ©9r{¦!—yÈŸ&»ù½þ•Ëcè9ç2båöl`îŠe ÀI"˜»n 7ߢ­#¬ú©/2¬«[ϯüPéÊÝ®FªœàëÞÌy&=¨«YÍþèØMÚ§z™~ù—rÜ }èZó~1¢ÅÏÿâ›ßðµ—ªx†JÝ[n¯U§žzrR–åm·³/8¦E»¬¿ëû¶Nœ©¾ýë?S7§‹±kç¿Skm´ð¨àGßÍW¸j@$€M†°__øÔçN¿¦áá‡_=žPÝî‹[`É;RŒ ¹@ŸÀ†I2,F˜˜V°’ˆ‚€;…)P?;ó‰ Lª†¬8˜•, ¾‡ÀÊH†1Ø]×lu'6ð¨Ñ1ƒ3Ù9íòÎÆ½Æ¬Ð³úÔZ'œ?Ì#¥Žc¥`¦,p‘»÷ˆÀD‰‰ÅRÉœ4JÂZŽO]­—·×\58ðÖæØ[Z•†ïx×·ï›ÿûç¯Îžü¼ínÓž1e]^š!"ûu]¢{“µsÒ9ŶIÖª¦Ö¸òâ‚ÅZÛ6¦MW%µÉ(˜#«ZSsû,i«1$Xò¤æDœg?šgõi–³&ÌÉyê8 ûÓk³ÙÞ[Þö&_VÉ0ŸÏ•prë¤#¿ß.wêy¹>ÙžîU›³«®˜YjCá«cŒ¨ÖÊ”R˜-˜!ΈI‰ ªb ÊÙRƒÂCR4)M(—ÖnX³Ï£G¥ú)šo°}µ[šµÈÑ×—ÄÍ,uÆš-05ÕÌ`Рû„ÖùÍDwšrʈ'¸ï©×¼áwÞõùtùí~âˆ+MÛÎÊlÑe{.Ûy9o;3oÜl)k~‘ˆtU¼YKfÐ%íd\Ž þeÛå\‡+Ã8ã þîT½GÙ'_‡÷0q'íªÆÌN‡o$Q 64Y1²›t:Xi?\Õƒ¼›}Іã3†÷ÛB¿9dgúèÇ9ü‚Бª®0 M$²^äDÝ×êNE:pþºTiWtäÓ–µ<~|C~úçïÿÖoCÓDÏÇåÙµ‘ÿø'¯ýÿéù6¹ÿë7ï¼ýÌ•1ÎùûÍg¿æmwþÆï¿ã»¿ñÃÓÅ1`ûÄ-ïܾü4è,åfiP+‘ûù wC’H¡Éb=ŸùÄÓ'¾:!o|ý›ï¼ãŽéþ³–h5®6ÚFsL«­tE8-\€2)ÆL5qÍp13S’Y¾¦ëS׋Ór¿¶³‹™©Ò}ôg@Q¸¾ÑAFkéúÔWW¿tÝúÌô%HNÏYC™2»3 }d©«4¤m¸w‚`ÔÔu|g̒͢cç”›ü’AIAñê®Â1õê¶ÌãÞ„_óø·§í¢ûÉ©ÓëßûýßýOö§w¬‹×²Š‹‰&#Jš@Ì"ÞK]·¢)ÖµA-˜‹±Rõvr6±ÖDmR’+\0^(7'i$…çRŒ©pp¦m¹:1rÒ¾\ČȫÍã#™·³å|f)Œ d`c&²dÖ Q³QƒÀ“šj–&N (>õ©GŸý³gÏžýÿÖ÷onnR#ìϦ!ÎæÓ¥Fºxñ‡ùȳž™6;/\þü™c§æóy* ÆÓfÊì"¨‰‰1@Ê9íÝ‘LÕ¼!ÎÌ”ëvцeïjßJš»vÝé”GŸÁÆOÄå ?¬´ÖNÉÌ'+Sb1fÀ”ö3†¨8$6ÌÇá`I¤É-[Ë“'Ÿ}ë»Þ?ž$Ý=mØ+Öê„ÓGžKêªØ;:ÐAà䀛µ"ŸDDnÆA‹@<àÇÍ’=Â>Ês¥Ã\9ÏpæêØN|±è CgèºXë Ð`¦Ü5&¦¬ç­ªÉR’ለlwç=-ƒ0Àü‘ÏG†°=ÑAÙ¨e7=/ùŽ´Õó´WsÀ«—>øcŒWþoEO¾;xŠtÈhÂ~ðôèk+€Âö¶6ÓÏÿÒíßñm¥KjÈȦ?³xÏvñ?æþÆw<ùëÿî?zÅÉ+Ø;µqü•¦üÖ·_þ—ïûêy÷*Ç·/·$÷šíÂÄ:Gâ¥ìůð0² ²ä“&kZ}ô/žþ%>{úî»ï|ð©'^ˆæ%À+û3S՚ݜãZ™M kpS‚@ƹ*a %Ó®?ÈÍ’?yX Æ]'yfzwIvA®;ƒz¹%:X^d0f‰3p6:‰Ž}Ò,«NDhˆ‰,'†ò*ÃÀb1 ˆRÖ¨бÍsëÇöŽÏs¸4q¿·÷Ø÷ü½_}ÕýÿMõÈ?ú‰ÿa4Þ, Ù¼m¥Íš…5.s±tÊ6iIDrձɮ ¦QÛ¦ ¶ qT–†èÙ‘GQrd×&iµhš´1Y›¬¯ét±ß.)Ödi¼ÏQs ê:g$M) é2.]&¯“QUסmš°='Tsº»õ¶€UTSÛF/$ÂN„bÒÏ>õ¹ßúÍßþú¯ûºsçÎ9¸ývºŒí¥«—œì½pþš&÷ä“O~ôÏ>ôÔçžhã2ÙÚ¸¥I¸m£ˆ0»¬Ùë„ÀDF)%356æÜ¥ÑÅCXÎ…4%‚°â;Žfe{šFÇOÛèKò™Øþ·€#L€õ•Ø^ #0Ã)<“µµ6ÂênS~ý¼â5¿±qòB{åÍqhô–RÛ¨¸æh‚~w¶×¡Î +ÌÞ/ÌW½o4D­/»í=¼ë›7Ž£<࣎\¼þýÈpù‹œÿE<à•SvGZŸHÂʧŒ²Ã Íf]« ;J:¥Ëøöš²îõrÎø:k½ ˜™q÷›œÿFèþ}%˜Ñ±¥oþ=˜M+ø:°Ç‡g2„ÒVÍš\;ø"&Ç—pP¸9KtÓ± '~ñß¼ý­ïØqÉA¼µ‹/\ÛþÑw_xüq®•ë'ä•ßþÖßû½?z×Ù3 ´lã¬ð'¾ë»—¿ø+üØ>: ×,Ý6CÈÜ ÀV¤n>¾À݈¹M<Œ…M¡sÃ'žz˜2Gâûïyøþè£K+X$hì¸Ä 3µ,~aFsvqC4¦42„Nж[‰:2È„Lq ê}ßìþº°+`ׯ 2¤>|PrGj”…©z©u#°åREr'^ ’|Ôf„ÜÜ<ß@6ñ‰²&eãYŒ$/ê,¾OÒëS"©K9_^ÞÝ[¸3#Wîß¼}ôª»ç'é¡{^S‹ˆ´ÙÞb7ÅZD’FB‚& гé¡@U°xÒ³Ž)"Ä€Æi®Ž&5&xÇHnQŒÜÚæ¨mÛ½ýtmoFI /§ibQL D-@¾ôE•–M 'k£qYŽ’b±œa^Fb«ÁÚØrË"Ac M¡QA¥xÇ ƒ˜=ñÔ~ægÿÙûß÷«gNœJHulüzµ?ÖËó)ó¥îììÔõìòù"¨¹Ô¶©mÛj4JÉȬ(ªcé]L r•Œ"%€LŠ@Q«ª#öÞ5Ë¥sÎT-Ip6)É;€©­©xŒGaò8æßúo9TJ²4AKCª [Šº]24q¶¬å™òî>|Ïï=sâÊݱwÕ—ÔºõýV‹°¼U\dÙNíšHÇ—9„¾G‡ ¯ƒäÕ‡wÿa[¿é:]õw_Nø¨ô‘ã‹ÀLC4²\ÀˆÌN8EC”5‹Í%Å!tøÖ_Ü}ÌrÓÃ=¯|”¨çOå„íA¤ípÀÕÇ=€{ £¼å<ƒ ñè5R PÊ),B_÷ñ×çw蛟öRÕ÷S¯»÷Á‹cº „¸ £½ïþÎ?yä“owîÍfzŽøü“O®½ëm¿õ{þ®ÉÚ•µ”Ö„'ßü]ì=ò3ÿhmúiàXç!Á+=go:¾À݈ ¬F–b@Ü>õü íüé¢!”½úáªOçµyRŠf)»–6@-4â—Œ–„‘a¢(,×ÿf^h$(™² ˆ }çWë;ñYV­LvãV °Ôgj»ÐñêDf”G³ÿÊDš%,‰Œ³4ræIÙ1L­›É`dºZØp¯ã’+¨CuåoD…„ lI9$UbJr«¸óHg?[¬¹ç–¯½s?ùÃÓõú‡à=œý‹Oo_ÞÊúhk·™)XM-¤¾¹Bƒ ÔÚ…‚AUÁj¾P >*+JÒ²Q["csÊ2ùãί³›kœÖ¨–â¹\/6t‹‰¬pF—°r¾,ŠÊ/[)«è’#ç"¬^«IU0E%N)Z«ILGN’xm œõÆaÒQ‡¸{áüµ‹Ÿ¿tlm’B GTI“â|w2Y¿¶Ó(èøÖd­jÃ2•¨º#^œ—¤MY”•§éBD&O”™Xj 1‚šÒBˆ™=“Å ï™]ÔXÐŒõ¤Ñz(ö}(qKŽõ³\þªþwn¾“–? éÃ\Ýç"ÝËÆ©&ƒzÔZ-¶Øfíxëä³çîûàÝ÷ô¶S¾´;c{|'¿ø8°”úQ»âÑçy1î,†Ã±áþY–ŠÍ‡±0[‚ ƒ“uu G¦ û§A7{ó¦Çç8ÿèÌwÉÙ®.$nòRZ7`ëûA]g6‘vêcÔ×U2åÞSÈÊ Y '‡ç /£ìK4¨+LFÇ]ï]ó×¾i~ÛÆÀ ÀIa¿½‡w¾óÿ|êñ×NªÝy}×úÆútÿ1¡[ ò™g÷Þñ5ðù& l{˜nã¯zýR#PΠܗ祌Cà+|0\.ÜÈ}ºS‚)áÂþÞó_øäÝ÷¾ì_uï}UéíLYŠ/—½ÅJ°¾,@ K%PdsÈÌ:º :J+›™fJL|œ;ï*d!·—7 g“1c>€^ëvø*Cé0dÎÚ0 IDATòZÉe:FNPi×»?¿©›P®$–®qciL”5|LºÉÛ5¬åÌ&#íOBɈYž‘)ÖÇÕn]“⎑ۓfΣ‚bús?ûÏv?‰m¤Kƒ\Ši0íK³¾‘¼—B@@I͉c „ÌdÁ¤ ¤ÖpTÓ˜à!ÅhÉ¥Æb­qa±a‘r"ë[»<#Rçá Œ¤ ²”q:&ë¦iÍlo^/óÞ+Ú(Ä m«qɉ¼‘@À²d0„ÄuÝ‘½s^ŠZQ”~¹ÜmæÁ4Uã*4:àÍ鱊"˜f;sF1’bûòÞÒ_Æ"¹”‚EXSðŽ£%ÇÂäDÄ ©Óÿâv¦1…Ö4 );O‰d_‹kÊŠŸ6TÊóXÀî½¶ù>²;Q¿CÚ7E·!&×÷6ªÝñÙúìØîxèß[Ûޘ얶Û¸LŸ7/¨nÝpåÂ^ó óÈM.¢X{¦p»9yy0åè%¶ÔU·lu®Þ4õø"ã¨ðKnèׇXÿ’p4¥ëƒç+ç·ŽÆÜ­ô2òT5¤ÄªîRR„«¯û਱ÉÞ¡Aºrx'cðJHùàk|:tð$,CÝpÿûRî®etý3Vâ"G÷!þ2zªøw~íÙw}Ýí°³õìBO|ï·¿÷©ÇoŽÏë+À¢Ñíɺ›O/'ÊÑkŸ|jùmoÿõ÷ÿÆ7Þ{‡a}ͱý^=[þ9ð.Èg‡Ü¿"Äqx,Yî=I1à«Bh‘ÌÅHÌ–07¹zïýéüÿøGQNOž}è–ÛÎ=ó„¸q;n'Ï¢,Ê22¥¤”idm†€hRÁUÎW\Œ¬„ŒM¤Ñ"(Õ¤$*d‰ÍÈ3{á  ±uÞT f’RR5Ê ‚™ÅÐtRˆÐ÷Ÿïìa¢ÌùÔ^ED‘›pæHTî†GÚ5‹!¨¹¿PNŒs´¨lðä$…’Á™óeJ)t½ ÌD#ÅÔøu,Õm”Bû ¡˜Oe²þ ¿úŸ¿nç¶Ë}á/þðã}úÉâøÉV·÷-b>‡wZ/¡(˜5P’ŠÒ¸]ŸØ&q Ö¬¢Tºaâ„}™Hç),-°CY‚\a¿[¶‹ÝJÃÙõ ó«ç±9/¸”¶žÖ)”õU7­b1ßݳ…K |ÉRreR¹Üt˶µqÒD¼˜MT9ϱ,J#WŽÊ ’Zš;Õ¶q$¹³+Á¨°ÂØ,EUå#!™Íü,|LuŠ5™«‰ÀÊž<{6bÜn“ZØ2JB»Nȳ] Ň5¥ÎEb ø¿ó_þOqIëq-T -D4€± Ô­,ÅNŠc³ÖÚ‰)TvCbë:ëu{°XÎaç…Ì”ìÀ×ÑÜæ¯‡“ƒí‰|NcXÊLNH!\çç—’õ=`faCĘù@²t~¢:OF&&ØLG³D–‹,7žèºöÔÈÔßT­o¥T»Æžš.Å{3‹1š%q$A‰°±p‚‘ˆRÀ`rI†ÜÜd¥È§3®‰ŽÌ¡‘ÈÁ¿æ¯\§%Q×½$á„gn˜¨ :„pž»þª¦ìÒ ×}²š ] /ê¸ :(ȵ°Ú;ZöT LÝy:—º¿´æúfcAîÅ™ù¡z] à%‡)À #7c+)#ì×Pop¢ÑTƒÚŸù¹ £[O~ÿß¾ýÑGö~îþôG9LªÉ¥z©@Ñ.ж›¡ÛM ˜}êS~ß»ÿô'þþ«|àäû~á‰ú/>ºÅ`ÛÒ øñ.§û Ï%^&9Òäø²`7Ï‹›Àà`èš@[ +?ðáó?1¹¢vJ&8vò–ÑÚÅEÜ+$6éˆ ‘Í Ô©Ì%9ö)êAóº@ i¯)ß}Ú2 yÔ=°ÜWMìÁßPê$ÐÿÒƒº¨Ðʽ÷m·W/Ú­I&0ÈH)74â¼uj§ã“ d‚8'¤-ÅcLPå®ÍðÉüé'þÝ eC§Š?ø*|s©í•ž«w÷¦;ûH°V‘³Ù–`êNÕV5Z£ª›À ÛÆb=bejc4fEU¬\•æ½…­z¹Z?Û÷óE!ð">Q¹Øk#9GÂæ|)¢‚ÁùÔìkÛͱD)j“‚²0(•×Àjh„ 45­6Mp¤ å»%SV5i‘œLAS«n KM‚ÕûËÀ“Ó·1'‹0$ƒ)iT„˜Ç&;]°N5„h1dJ O"B¯fß{]YxQÕ† ' X³ã¢JªÕXÍP'$b 18@½”%ûÅÎ|”¥/ÅËŒ±ñ+ÚÈ«°—ùëöO;˜„^åu9ݼwã0Œ]ç#®†¦­Ï–Y§ì„ض]¿?åŽ~}àƒÎÝÉožC5Vê Ð|ªLS Í’-×I3ÊP3M]“¥Cîòp~îYÄ—Éúì.†õ’!Úˆ(%ÕT»’'æ®kvÿ­^åøå þ|O|î›p…6ÜäcÅ[’ô/gÐê½8¸7X'‡¸Zݼåîcý'¤ Æõ·v(ü%™•Rg@D à¡.,þ‡ÿÕ…Ÿú¯ÿ¬ 5p«Ã­ TϯâÀ°[ÉgþùS?ø=U¥dÜ¢!°1’{I¤’ÖG¥kš˜b“¢µ”{^NÈ\b¶€Vñ*\,j9‚88ñ$Xò©PUæX”RR‡“@³ÜKAMá"NXlæÖNv.ÔóДRŒÑ³7C˜\áÅ9öbKTeFD¼8ñ,Ììýéá7Ë´yô“&Dĉ’¦”È—õlwük¿fKîï9kS(·­¹ƒi°²Å'‹y™˜lØ»™ºÖCÃü`3SU¢°*ß8 eÔpÓyc h¯ÂRl¯ƒ¨îe(¬Yjè=|€‡¶©É@>Lûü’s*…,7å#r ¿‚XDDÄâ9/["ÎÖ@÷2·út}´V Á,QJËeÝ6]‘3Jfç„4w´¥#9Á7šÂQòìÚëÇÁCÈ[ËKa°õâÒ`†õü«•_¤Ïp VÕ÷Ï«9lêœ@µËlG/; ñ—Æ d]¦-u´ bX5àh›Ícº…Ò݌옿ÈÌ ÊZtad:¼9–ϳÞ>–“ûóŒ¸ra†t˜S¨ CTÁJÐW¸ƒÑ>XÐ9…@Ë¡¤4tsÜH·5ú¡2½CoyÓ;?øû¹¸óB‹®Nó`Fõ¼‚’"HÀæÄ”­ï؉¶çâ íÒ$ÖU¦ö»_„!{EúöüÓœ‰eÀy/HGx«>Êu.ÈèÛ›w7Y ªjš¿kbPÊ›ûA`ï€-Ò¯óàÙÁ‰(":”ktÿÚÉÛ* m;vK6/òú^õÜxôè§ŸÒÔĶ ]üMËj\üÈ^\"Ö’sé‚@%êÖ©Ó4*d\ÑxäÆUQT0Ö”ÚÙNY"™ÛÚÜi}4F#vRUÞ±ó( $"EéàM×"’2ÄKÅâàJʪrÕ¾zbÇT‚‰¤i„79â¬LBNÄs€†)ÅlŠï%‹=™™ÃÄTÌ (œs…÷̲šw>ORª)ƨ™J‹IÌLÄ9X§RžäžÏ  ÆD”°ÌÝÔìÿ.Ta©ÇH%U¤”|5Zì]Åoÿº.Ó… Ï;o„‰ëz9Ûg4¬4ÿæI7…:á…þÍ®¯ÑA“ZYeHv“ €¤m·TXÊmÛ©w¤r2¥o¼×ÉÞ:±øáä«Ûú†_'¢Á4ÉÌÌ ("bv "â®»‘—U¨>ä›ä‡ð-šÜW­×¾NfÉ4„ýýéÞî<„´²’ †Î˹‰"‹„¹÷Êzé+rºVˆú½nø9®ƒðÕÛ[}så Cãz—àK¾‡îOaÑÐà@ J 9ÐJ†KէОe;CDѶw`%è©“®Õº\þ"~éĪڭ뫳ÝX#ÞP BÉj­avÔ}}0únHX1Û¬°¦ûGËí” ä6}âƒxøkÞƒä¾îÍïøçÇ~®Mq¾Ä¸àLJYw½"nh"[)ƒÁ(°FBÊVg·[uÎj/Û×Wu..qW!|Ä„œ%p_,4@õ¿ÿvŸßD¼ŒïÜ…­û§•>hDäqÞ.ê6R‹Ú%Ú8yòdQ“Uã½å^ÝqÅCoøªIYÜ{ß}ûûû;;;óÅ” “ÉøÄÖÖÆÆÆ-[kådMF##rŒ‘YƒÕõÚ©ÓådT­M\Y8çÆ"ÞˆRäÒEa5ïÖÖÖFkÛðâ{1FWJ­°wac¥¤–«D"AsŠK 2Z`„C N#$ ÀF …¥ÜÆ–e8D° 0 š³NŠÖúþ ¨Bƒ6)EUmƒ¦Û&†4¶)µšµxùZ°¤1ÆBjCAc2³åüŠªÆ~´mÛ¶mŒ1Æ"E !…&„B›RŒ)Ú¬­×J^ìišN§Ëf9OãeScøW=à¸"Xq`ô’ê~·@ÀSs8W°»Þ×éŒ ÉGwèËÌùxÇžzouø3;^J.ÎÇøBVà¶,݆®`*qÊa|f'9²~º|Ø ™ŒÙfwÝ’Ö9eX5ªE3Mm¨mhú ‘:àÍ÷fL 2Ë29+$¬Õ¸}¯$uð+àúwVÇQÁï¾8çP2ƒôÞÀ€Á=¿Èip ièÉ–‹(zÒÖÑwúW¹ál'Xõÿ=ÛÔh)h[Àj ,qo£m²Kq1ù[ÚFBlA³î®z—,«£sí2……/©ŽŠ4òþl°!*Æ#fàm%ÓúeÀ‡›}0ÐoAX5Šk¿ý+_xø­—`·­M°1Úô¢ëk#kæÖ³ õL±hà@eähÚ’!" w)Ö„lL)ROKàÁ}ìîÇͶ>èÔsSW7 ê6>È‹Z«–éjkèÕ:v½S|ø ž8w%ÊüˆA(+G’u‘2å¢àJ€4Kmk‰ À­A(R뱿œ^¸|em¼þ-oÇüØ£Ê; XÊ’ë%·ØÀ-Ф–‰Æì ª iA®S}K9££ÐZz\#‚ëb{&]؃@&$›æ sÎ"À,¦™§MŠK Ú´’%k¡5iZ,‰(¥”qN )¥âîÕ+YI#ÁY͘Œ0߯5QŒbŒ)%µh–¦Ói× ÖRJ)„ 9ÚRÔÕT£j$‹j±Ü?tX‹¤fÖ¶Ýæžýà¡SJhÌ̢Ũ)Ęýó¤ÛÓ½[Om-cö!$­Íæ㜸¼éü9€n9¨bîÔ3w Òk/÷¾lïx†Òaøbpǘˆòy8Æ€š«°š{4Q†^æ€wn‰ˆIyËþHaf_”cf9‚H§EÞÓ>£¯sn0 ˆˆL‰ˆ{+Œ¬°®¯ev¤* ©UsÎåk K˜c²\L8Ô*½è Pwãr¾éñGív3¶9M13ãN/ËÈë QïUCêºäôÁ?­°©¯“ŸìL±óPù'¦&ͼ;Ùp1¬ÃcuÕÙ Åf8ùp¡“#¹q8£`ÈÂE R39##Rb5eP§LD@›jT;š2‹1&=Ýb¼¾Ûîï.fw®n.›î»_ Þ•í¼–B¼ïºi`m›Úpm9[,–×¶÷¯]Û­—- ²Tpm E³&…EbŒ4ulXF!ÄØ†”LU-ZЦªEQ“ª¶m£š"%‹1&ÌCM» McH!„ÐÄ÷v‹1ZˆÒ& )XX"‰¶0N)Õu“’ÁXˆ4¡Ž é6ÛNú›ZÚØ”5!ÌH‰PIcì·WÊ ûÈm']ODŒÜÒuElC¾£ûYÃhØòúg33·è(ó¡úŸ5 ]ÝÞÀ.„è¬tìˆ=VrŸ«¿»hz%Êè;H!jv;x°ö’Å}ûÿçh†›\MÊŠË7/úRfט¹shˆˆ¯‹“­žø`Yø€©×šfæÜ}$/"#22‚ õiM‘£KÙfÏ8 Qö+ ¨ i‚Y•3ZŸàxdf†N’½§Œ èÛ­Ì›-a»Þn^Iºß|ÉÛ _ôéj_ž‡¹zÝÕS]ü„¦#¤¼úãí W×íºãÛÙpj=Éå‹3¨ëW¾rqM@R~§¯!€ôœÁå # ï+-Úù.l KúÿØ{·^[²ë<ìûƘUkíË9§OŸ¾°Ù¤¨‹e](JŠ,X±EÅŽüœçü€<ä!yLþ@’×\€ q9@%€$ر™r HÖÍ”(Š»ÙM6ûÜö^«ªæ#cÎZµ÷Ù§E4ë¤xzsíµ×ªU«jÖüæøÆ7¾q¾CÑéñóèfÑÖS ‡á£X¾yX˜ÝߨŸ î>{ò xdØmøºñKˆ¯’?sï<ÎW€_ÜRó<á½µ"ô;°÷¿<p(üsŸ}gˆ'O?£|_Žo‰6vŠÒÈ }®nJ£Er5œBÖLø`éÚuÙNË:™nn¿VÂÛ†s¶éú¶m¸‰Áëm¶M(ô¬±ofzadzD<íæABÉùx”û¡r\f*j˜<*gï?yòÁ³o}|†§Çëë'WOŸ>ýÏÿÓÿ̆òýÿ!€yòÅ*á;)ZÎËo]\Àõû?Åæ5+@k¬W‚#`@Á\ì;þìñôüÙÓ¯^?¿zúôùáÙáúùõó'ϯŸmž?üöW#âp<>»>§ÅÌëâµV«ã²,Ót°:Rts[âØ¢Æ^©cXø€à<‘dzTŽZT«î2ó%l®Ë²äÈ8PI!(Y´# p±º8Õ«Nj)eÑë0¸I¸ÐéžJZ¯eJ™0Ðê¿ÙÚ°ÃÌ̬ýI€U¿×€Ë³^¨6•±ðêêPJz!Ê0ìö~>•:Õu˜µ‘ÐÆCÖ}fi #²*ެµŠHV»DD®<€´ÕBâ´HrbÍÕÞÞjHv»Í›5lZÇäv+eÀ]p†æ+o¼bð‹…˜ -»ýNy_*…,"›D4,‘RJ²Îl„è@ ™Rþìf­m^sû—–Mc wϲ¥n^²‘/áeôäc^ïͶ ñ—DU=Úº Ã=}ðòj7?qµq&£YéÝú¨öEOÔ´{û*±V7¿¾¶×ü6—u{§º²ïÑ&§>5t„ƒÿÔ9Jü0ð6Zµe€~Åêq_ämÂîž__Tœ„Óici°ü%àãóK?^wÇjËá¡âÜüë@‰X€o€¿ |Ž‚·güÉÇ÷j°·f\mMV…1‚3xV ŽzÅó©ìÎìý¯ü…Ÿåóç?ûo}î­ÿbøÎx?®ƒ,(F‡0l3ö³/ã³ã8_‰^FY†]ðÑP¿5ŽW>/4QîLÂ8›Gá˜J%Ýr’K E""ª+ ˆ\›;S<4"ÛzÐÜk¦ÀÂ5"×áiÅ‚jÈ.¨Énç}UÍè "˜™9¦Ã–CZˆ…å硆ˆ8±HÌQ÷5Á&³­fQJQ؃ÇÕß|rø \¡àaì¾<ÚùÕÓ¯éÕGð¯|õc•³ùpõûøGÿÚOýìßüÅû©¢ÎóÃÝ8ÄhÄÑbG+ ¹Š æœ^²9CæPx çcîýëŽJxw,ÓñjšŽøáGu^®ž={ò®?®‡ëçÓáøm9ÎW̰c½zr=Ï>W»>L‡ú­qvŸ®|žæ F ·¸šÔmÁ<£.a~å0‡ƒ•ËÙÙEÏ¬ÒæÅçÉêŒZãZCó7+€ &sE]ñ%¤D' ÑhúÜ Œâ„ã˜)ÿB²; h“Ý=yS ?n‹G×鸆zOôp]xä1¾=Å™è);ÛVx$H—¹…›M¢'šò¯r+QN3é0´6…Û €7YC:!ʼn\­'-IMJ…îC¹'J/žÀ/!Ù4à ё£&} !¼A\ÎþöB°@ë@¢Þ½û8¸Þˆ«¥‹ÿ)ø÷¡;ž“|õeí/_M€Þ“ a !¬_‚$DÄb0”ÿë7~ÿ~ÁögÞ}ç/½ù©ïÿÊÇ)3µ«éI 4 B"hp ¨ “ô P¶Tóíãj7ùú¸­)ÑB—n›™¶'_TI@Ánx‰h–¾]S+à¹NϘ–Úí^‚bhýºO«Ýö¡o†ZTœ0„xdÅH["3ÌG;,uúæûßð#ßýôgŸNÓýÞï©¿ø·ÿÿò¿ù¯þ§_úŸ¾ÿ¯qùúk"ËóÁÊØsiö»óóýn?ˆÈ[çoî.ÏÏ/ÏÊ~j!Éÿà›ß©už—ã|8®Ÿ__?‡yžŽQçe:L1W¸ÇbµÖãÎçã"1.S JPŽÓRîï—e¶å^•¢ CÜá:¸U­Van ,ÂQ;xuŠçÌL¸„™IÀ=Ú2*'E´–è™K d B$RðDë¨ÂH3}8œÙŸ)¯%ª×~õOì…ˆ¬tÛ4º““zùÖ¥L€¹lIhÚ‚Y¾f·ALÚ||ë7@zBe’™ÐHis2ɤ±âåe y×?­€Jªô´±J¾¾•Þn^Ã58V…ˆµHš&j%)ºKéÅÖ-ïr3ÿšŸž²»Øœmq÷5¼~‰Mô¤d$³+ãö"mîê•ËÍA€Þ¨Ó¶‹ÓåLO¾S˜Û}·“½k* §Y#¦˜àîð­E[>ˆny 4ßtRhéªÕjôÖ`[s"Ò/9ßÓ-l„ãCÈ(ÿô¤~«/Ñ@Ü®è[¹›r¯öýà\ðˆÍÂãîÝü9Žý/Ô–ø–zTkÓ2¯ú`€=7Ûëð¿ýêïþ­?yëþç~à/áŸ}ô»SXSKEJ¡b@HF Ws¯ˆ ò,8bXBjÖö†qc€žø%¬â—Ó3 •_6BoYÅ0š3U‘]`Ñ…x¡k ²Ó=g 9É÷"~»¶izpÕ#B•ð´œõ‚4§ Nñìéñ;ÏVçëï{ës?ò™Ï|}>~V º«™†‹Û²#¢Ö9j…@JÉ#8 Þ|tÿÝ7ƺӱ ;rp¯Ë2-ó±Ö „’OêSaˆ/Ç€‘„Šík•ÚØW¡Ë@)‡kú¢f¥ˆ-ƒhöb~~¸F¼.€X¸ÕQ½HVfIÓlˆÅ”Sînáîž=…#/Ø:Uš63…œîú‰ÖÌ.{&ß‘í¬"‚´¾géi;pë ¦Jâ®\Ýv®åÍ+^b ("ÞóF’TTlø4_ߥ´b÷fzƒѹêd­û7ù]tMrg©eókÃT@T)ª…BRr§Iì¼Àƒ¶}–NŽDDK°ûœ¬‰vÜ”Üm×(Ø€S>è‡aº€ët³„þÅ|j+ò‹èfÚÜ¡ M`O7¶›þH-º†×6Wù?IÑÈ„[Ý>qÚ¤÷KÞê;µ³–´’–i/¢ÆÖ…{]X£‚rT8±åQþåmT‹^O¹q¢ëKÚP¾<ï¶5ùêi"nSÀÀPpºóõ¯,çv¢nÐø±X ÿK—ßþÚ·Á3Bø ?qñO~ïc„bÝ× IDATj¶b:6,÷ "¡æ8Dìé Ù!FÈL™@f~„0 ¤Þ ž>÷” !¹)´½{kzC!|›Å?Ûý“ëÔ BÕ=ù¢æÔhŽúð 2,›´Í¨,“ÂF+Eˆ8aE‹ëÆXгº»Y ç©ó³'•¯¿ûöOþøO¾~vùä£÷¾ýèkÏõé“çWOž^rwq~þôú°D-2Že<,æ^áÜ}Nû çzv¾¿à~ï RG{È‚gná½M€EHdý-Ý5f8kåN•³dsÖi^¨KÌuÑÝ\ƒ”–+¦y¹¤h8ˆ=†áb,gEJZ#Ìjڀі)˜.“n§šH:‚ ï*¥Èä"Öh)[b4ܽ¥Ó´×Qµá'²Ö¡¶¹¾³ôžê­†qÓîf*.ÇͺüCb[gP ‹Lñ½n}mnxžŸr}Iz OodÂÏ*²Êç7ˆ[@=4U U”"šQ/±}Á*„Î÷ª6â:õ¼@"Tíɾ2! ¥9lQ @Ko¶\jDd—ŽÕ'¤µeZϱˆNst€n‰„´Ž?MQ§ vB ⮩;Ý„’¥H…ÆéºŒÝÜüæ´Óe륆uÚi´ި-ÚÈl£¡Í!Üö0íÆoì|=€îÛ‰4TÏ¥Ò‘ú÷|ï´Ò¾ìÒ°ßñ§w¾üeUV/³N±›Šg^Šà^yNdÊX!¡·ŸÖV¯‰ÐÃuÄ×>qüS×"ûý™Ïïþë¿KŽ"Ìé›8Ã@-tf”gˆ3ÆYx •P 1˜7^.ˆ“ûÁM¸ýsC ”îS 2+ʼ…"5 É¥¦']x²%¢mVóYœèØtèð²¾u°9ר2ˆ¬œA@ ¥”aPÞÛ½ùàSo|îÓþäêˆåϼóë¿þÏóýû÷!³ùúÊb9+g –9”…Ph"£@‰"!¯•{<¸wÿ¾aAÝËpŽÝ.tѧËRç˜C ô@çyY,,šäÆà5 bi…ÙN)‘2Fp9m>‚ ‡’ÙùšEFYºÀ° dk ·H(u³êu^ŽË2ÛR½‚•ÜuÂd$᪤€ DNFE”PløÉät¨“¤G#C“¨ó5•p#~1‚iƒê…;>á/õÜÞ+ŸÝÍytI†l"o›?½¸ç[{¸°·d?–;6QMVQæò@†åÎ8¹n‘€•ëG%úko×-¤÷ú«[ê§•IºÌf¾[2ë€ÛuòõŠ!3çI  /€zø»1÷ç&pÛHþ<‰‰•Ûꤶûæ ß¶üìz©ÛïJAKÜ`ÝŠ¤A‡êˆŒDoìg=?"ÿß@OKé“b ]ïhá/yþj:Öúþ&<,|Y·çW€7†,‘.TNê»>¢BÀ 8Çéú½ø›ÿÇ/ÿôßúU©M¥å©Z©l8¿Àb p⊺…u$¯Ndìˬ3' :Ië}™ŸÁßÚÎb½@qK ÜÔ*ë­. 6Ö›²^2$ÝÆ'#à@:‹DïŽuAÓ³NÜX7‹ë¦0hSˆa«ãPŸ+%Nœ!›P -1>áÂ{?hXÞôõŸ0T¾7›îèñVp=éègŸt wíèÎgE$Â'òÞ˜JDΚ…z›åðz›§¦¬±ÒÙŒP¥¢ÕÁ!e…‚ÝÈ}™X—éƒ>äTŸ={öðâµëž=4ëŒ;U ™–Å`sÔ³r¾ÔI`*QTá¤ëÅîÁùùýów^;ãâì²XXcAD+²ƒT#­Öyñã\çÙ–Å.Æ3 ˆ°¥Ö™‘í›PƦhæp¥Û²ÔéhÕ|suQ<¼ZT3P“9Ìi•`‰‹Pô£‡@;¦t7åÍü½R›iíÒ’ .D0ã,—ðdüÚœÑ9F 2Ö¤i´ø7/=fœˆá6ð%¸ì5Z—z$5i3Û¶š¤õíÛ+0ßø÷r`ÖBB…L÷m,TÛRÐìdr9i°np¨Ja‘Œt¡QˆHáK¸ùl”PMýtb7›$¼SзŽ?Ñ·9¾ÐÈ0c¹Û`éw¯ÝÈëæE226ÊÐ> ܶ˜]…W ”–oó‘JzGߵÅD˜¶{8é\Ðú Ûhu;Td•›Ýa…yÖ_HGmi„ÁmîM¾Ç,Õiì\KT˜ÙA­A#ƒBG0s¥YVÇ;*é·ì¤¿eÓ…a“×½½i±ûþ³ø.`æ ¨¯ªC„  n>¯‚9S—®ªm9 vÿ”&BÉÃØ*®ó¦mÓ‡Õ4 ’B*ˆŒ˜ðøßÎïcb Ÿ^Û_àÙ¼»Âý‡÷ƒþäù“U›-‰±FD8lñpÁHó"¯íy&Tã2»-‹{]®¯®çº‰–Ejõðq(ûq`½~ŽQk…×hÁ«ãóëyqÑ€Îæâ$ EÏ–¢Ãp1Œ{…xp™­Ýédºöˆ3;lu…D¸ÓÉ#·fŽ)k–dI`€DX-|ÈöÈ‘·¯%`I‹0<º'ó:vf ½mÜ ìÀÌ8ßgl‘f &Í÷4:…lqñö#Ú{_@Y~"'^ D¨$•ÚL9z| €{÷v8TE€•‚FSAˆ‚ÞîPQ¨jn¸QÇ}±Ô–5ÛÆæ&Ý~‘í™\ŸÙ~…„Uç‰öº“Ðjp¾®ÖN“ϾÖÖ^Àæ{J¥|¡÷]û}îXx å·½¥‹×¯ùâqÞÚÌ,³Ùm5Òõkæ'±Þv0ÔœyåÎdpXUÄJÕ N‰ÒCä©Ð¨óÀ6‘$“eŸ”Š˜1©»Nm#Â4˜JÙ@x…LÉÞÜÂ#p^Á@€tE¯Q—€¨&3@™zÅ@ Í"%¡´0)­˜ÂUSå"j°¸©Çe¾Ï˯¯!˜‰wm÷òÞÌoüá7~ø¯¾ûº_”2.¯óãØ•ó݇»*{µËe­Eço߇¸¨”!xÆ¥‡¯ñÝ·<øXÇëê;©ËPçâ³Æ²›¬Nó|p ePA3¬xåD_\fÕt©³{wV!µ¢^ÅX;ÙßÛpœq¨8¹ÛàA§†Ž¢šü›¸•¹.QC"TÊ2[½jö} S:7„…YÐu€Äà" ·ˆÓ ”`ñȾ°$C¥ºå"K\  !QË•ˆH@BZ¸!9U ¨¡ ᄹ#bg‹MPeÔju?H¥ 'šôÆD94uÝfm(ë-BT†Ð;ú¶Ål ¸„k"½å+WõqpŒÒ xHP+H#„,”lýÄTL­d>Yb¥ åi®P ¥¨¨ˆ¸PU¥”d›µ4ÎÄÌôPjôÆaýî);o‘n¨x=Y¤\5Pàæ­ýf+²íZx(U¤DÀƒ.€E0Kº,†H¡ ” H3³ÊضdI‘GöšdúCF„í8Ñ@µLCÛjœž»yrOËë—p]Ý…½éE"u ªA˜r0:"ȳEÑ3Ú=í+½?q24+ÆetwC€*ª`ÖFx f½“$‰H3÷*Ø÷LF_6üY­Þþœ³ÿM€ïúr/”—}ôÝo8%“}Ìâì—Ï+À}[W”¡ÈKŠÐö$+š«m­óp¯}~ükãþ'.öWígîïÿ÷—Qkkm:F`Ð~+H’‹i÷Lr Ø™2ï“©4ïËã&mãÁ#¤ @šb*R]˜ž‚Ñ:rÄ:GCÒA«ÝÞ9"ë¥K©S.;+Dh¹'?êŒü#¬…ešö– ÉáÎ\~Sâ»*Ht‚îô<ÉA´E ©Ž2 :e7ŽgûqÓR3é«üÏ9Ìatpq!)gg»{Ø /5¢.V îfˆ%"۞ƭSE„»Õ¤[DÕ„)‡ª‡;ÅÉT…„9XÄn î‡a¿ ¡ÍVçEû2 ¦5ù F œ85f’ìŠHȬWóL(…ÚOx^6–8: y Trgˆhv6SÃ.ôð®z!Äóm½~·Í~ëÏõÉlM„5ÆmRœêm\…ùÂvãIœž 'Ïç uMýf¨ä4[LO̶¢vó¬À&×›éÛö@ÒÒ¹±ÓÊÖ´1ý\5N––›ƒ½‘Œ\v¥š¹>¿yY^wïÛöÜöý2Ӝۘ2ße½¤ ë§Üä‰aÎΞÓÍ©dj·¼Åºgö#óÓí 0gOÜNß·ýŸ›ÞzÁ‹¯ï!5гé$­!G;Ò?ë¨þ‚m¯&¯)q  ŽÐOˆ gãù·0æŸ|éøâ_û÷ÿÜOþÑ÷ÿèÜ|‰hů€bP…Å}Y¦tÐF`G)ô†#“‚…( J£ Ž€@ d£zB¯µ0Œ-ú²@à~â!‰ <óÌ}þê ™÷uÔµ¹Ýæm$éD×”@ØŒv„ ,PsªKxpß›:XMu Dµ^ÿ—ÙiHö²õ¢.µÖiв+²Ê8”²»ØŸ#ÅDA2 Õ9KàÞnÿðõ×ï=z€ËýÅxIrqs©¡Hƒ÷°y‘¢su÷A”nu©b€Ô1ˆ€—*Ó8Æ´µ.Ì‘ìf5‹ëãa¾šhØé°,±œG<í1wx¸GdBX(VLáð€GXNz*$ˆ¡M’}²î•@ï°œ‰Jððl~ÑÏj!ÞØÈéáÁ€¦ –M‹éH±¦H²)¹6BÙuêìïTs£ÍOÚ²#Ò¼·xUú¬¦“íoYý“˜K®," ²þM;K/Mõ”²ï‡4JY$›o˜*ªTÕ"J‰¬¡¨2  B4i%’|X_°ó¶±~ýv+¶[àz«ô¬p*ÿS‰¹žm£6÷¾ãt­ñuAM‚^:_%F­ö8¬Ž.°[¡ýå@*;j/¸Xk„úa{Ÿ^Ö5Ô0íãBZÜœwãÜ`Eôv>¶¸{"´·Ë‚íwÙœbä4e¯¿šœ›ô~U1l´ §Õ¡¢ù×Ôãò¿ÿÏÿð‹_tö‚7߸,RI‰"³ÁÝ  J³»Šœ ‡#8"v)=.ÒÂ-k ›ËTD„‚a² YO7?¨4Þ)+‰rÔ éÕ³íV¯«k3ô*Älól§w¦¨HÇoQH ÔÕH P†€ûží˜{3ãa ¹Ál,ℇéXs룊ºÒe:ÌÏ–);Î{ —÷.èJ\ô¼Å";èý³‹G.lÀ¨÷¶ÄÔ5RbVu±:*4‚VÅ\KBß"ÙXÞw°’ý[MÌ9yqƒ{„eA­!Œi±:ÍÇëce!MŒ$‚ЬÚBš°Ä€‚T»7 …ÆUî#²/„"H¡Š’.YŠ‚^pÙ0ɽÛ&ŽV)G÷ºÎö-KŒÌ8䌄’¸™§ò7£¢›7ÃMÐݦlïÔØš[õ’'ÙǺ¿Ž+‘³úBwiz*žºg¤œl°Ò+ª $8§:¡—sAD¤d®—L峈Dà „KHE{¬P*Ml¥"ä)] Ž$ÒO'æ–ºê´ÀL¾¡ rÂBô¸³]š6ÍäJÓžFGLµšGêçOðŠZÎ- á½oi[êœpî&bqSPtãâv‹Z¬õ»-{Ù–ÓHi\uw‡^ásÝùæ86è»~îé×~R-gŒHa¾×ãö—y¶W€»+T’y) 9mÞà ¨Ëù~àrÀ‚§ÿ÷¯LÐ÷1?â€7Þ8‡Lp-ðˆ°j•w)! uÄ"1Q+Â|Q_ ¤å$‘®4m\¶?ÝEưt¿Öõžmé´S²¡ñR)!ð@âx¤'%Áâ úͦCA )PÐa]´§¥(JÁJ*¼:*n$!ˆ^"Ò‰±qÔ©F*E—[Ü 7ÕDß|Þa™wÎãé‹ñMCx¹AAwÙÝmªÙÌ_ܲ;¤»Û†¯€¯6Àš$ ,Ô­'؈°¼kÝn\ºj¨{náyC«ðæ¯/Ûd­ ŽíräÏà•"ZÿÚ.¬íG’CÈà˜¤ÿ¼MþUß^AÞ”Ó!Ñ7íŽ_ÔŠ!<[â>Ÿ?þÒ—¾ô…¿¾ÓçâÇ>õÖ~x8.®B55,ˆ DÃA8Â:)éÝ¥/B¡;áá6®¦™ãtr©Ð•Ëe²’mt’ÓÊhÛÛ:Ëá#°+`  pFá h)E)ÒýZ¦-t %„@Ò-îÝ#ƒæ˜'j:1¸W“B_(ÒjÑ7QÝ—êÇ:O²è8ì†AI˜…ÑÅl™ˆ+ ”aWÎ.φˑƒC|(i§\Í—:OÓtع’e„T)Ù7Ô¢ãf”(°:8ÝÝLÌa€ºÑCliG¨``Y0W;˜Íˆb =<ÌÜ`ˆê šÂðhJukuO:£Åƒd«Mñ ƒé0F@à–Ó—?~†ËQ~èÑ»ïÍׯ=>œ—}}³È^Ïêáúé­K®.g¹¸<{íÑy¹Wt7žÝc”åÓ>®?^p%÷–×Χ}è<œÃ¹”gW»}¸ãÙ0€ÃÂëÀÁüùøtœ0‚‹–2ÊnÝΖECÑEü“«‰Hø°Ì!C”eÙ¹®Kø ¯,—ÃNÂiá•>3&¡3t|¬^èÃh{KÈìÅvTaŠí#3òá4shN’Í+:Fñƒu§bFXXˆooÕeMÅ¢eLZ€Ùpºp ÜÒÊŠR©mšË Ì(Gª¢RjsÀ€D‹“¤ªwJ|û½óÏ‰Ž E#î0Ð fßU¢Õôƒ®¡Š’™ZP(%×wRDdÈu\ñ.%YªÃ0 ­¬¨}®Ñ)EWU§¼Y œ¦WíÀÀpìJ£Ê×Û~¤°ï+vÊ="FÝl±%•î™àu°’Né"áª)ig¡Œ!8[„µWñ1`×ÝhðʨtWj2 u]²]÷¬fÄØˆ`*ý@hEEœT¢ ÀQ=æ#• 0$1AƒõØ4ûeæ3"õÏ"š<[E‘MåÇ\KFÔ¾hØ®Q+ ôì+·®vn‡Ùa·W€7’«\WúÍÔ¬y¸d¤ÝÎ1M3蘖˜¿ö'Îû‡Dè¿ü£?òþÃ_{:ÏJE)£œ-v˜@8[Ù]ˆ˜köZ÷tÈáafÁ,«—t¦c+!Q0‹¤˜­›Š"LB¥;œV×lÑq©PgAì ÷ÀKèŽbãDB$D](J ±ÃDVG‹@^Ý Ï„Ù¦MB¾+¡?tu8üñ׎Ã÷½ñf}ëíó+yüøÒåO…3Ã"< QÃhî‚9¨éFn IDATëpߢ!E´”‡R´œÃ…àlïíÏéQi¨JX0‚ v2Þ¿¸|ðàÁÙn¯,T‰ÃtœŽ×˜mŒÂB-CÐ';¬N^ƒ2Ô%‚ó<Û²DA­Ó`J¥f@s«uX ˆ´£M s €„RI¨5}J„Ed–5s¾\ùƒÚW£>¦¢UµDòh+ý(Šòww²ùæÄ#ù’Ó}ÁœhýuUØúY9]·—½Ìا­:Ýܶ5r;¢=}îw1G®Só‹[ÂbCÇ.HîáðZϼ:^¡/KN[ËÆGÛ:àõíÍrËïþYÛÌÝé~ÂÖè»C?}WÖ7UÇw;¯\SÓäûq‹Ÿ~1Î]ý°âæ37ÞÒÓùwn-†í{t¹ÿfl°qô$J?¾ÓÏ#6¿Ã­¡õŠl¯§Z(GksÛ¸»©Pø%”†%äðÇÿ|þ›äOðW~æ¯þ·û¿WëÑ"ÀP¢ÖÊ!<* FPÔE‚.œä(:"®ÂÌ– k«ödæ>É,´'@át2}k=ÒÍANŒUƒ%æ1Ï-.!sê(¢ªÓnÏìÃT퉼.a>Û!«Å…³Uw ø>ÌÅ¢JÝ•B` ž?ÿÖ9d8»ü¡w>ýþ…Ô}”ïÞÆÎÔ„R®‡R\Pc æò]1µiIB¨ø¾è~Ôe§e‚ªÃÞ]xtïž f› aX À¼¼Ø?|íµ‡rÔˆðZ…f^6]Ç¥œ•¡ Ä‡ëÉø¬c²j‹Ïó\­:(³iÈQa©p³¥Ö9´¨¢±ÿÕÓCYêä¢ÅÒUæi ‹rÚXg«\Êé ¼ÀéúÂÐX¸gûó¦ÂùÎ-° ‘<$"NÝÓÆ/cÇFØÐÏ-HaÄ—ð†p^_pë•7>IS¬,§(ZdvÌmq*(k „B¶f¾$Rˆ/ƒh42ùd¸ÑâZ UÂRÒ|CTåÔjPU×ø»Å—ßmp•PZs³pË8ÜÜÜ=sÀÖSÁfÖGÔðˆT»Gæ•X;+x®ïéA¿ùY9RÂ?ñ3}£X3j}Ùv"¿«Í‰–C–&ÅÜù&(=a0púÄ´„;1á}^kAÖȧÅ6ÒÄ krí»]ýÛ^I¾èÏAÓÇØÍaPÔª_„Nnצõ½¯é?þÕ_þâVÄ~äÇ??î/¬~B›gŠ…yìB< 53¡F™ÃÍe&è^d C˜EúaiDiý” ‚€‡‘°U¢%ˆºœÚ`µ€BòZ¨µŽÁ{à%dP­Êk‰g,ލ„§*·.eZÄãªÎa Pk­áT*Ìá”°DÂ:°~Õ¿sù:dùƒßûÝ'_óéµ3B>E\k¡àñˆ ™"ìXGs*Ù‰S'ÐË=–2c·CY¦8@}šuÁÃ{÷Š`òcñE=ʃýÙ[o¼ùèÑ£û—÷–¨“WÌ뼣΄³Ãà“ù±VÙÍ®SŽœ 3o>ŠŽ¡;–ð4׳€œ©D*| pÑAéF‡:e&ƒÂpŒrde¯ËÍ l$½ßÆÞ5Ad?¤ÖucÍ#ZXm¶žB2T[[-¤–k3 ÷Vw¾7FsËÆÝÀèh·;’lm áÒÊy{#N2m_ Àý—[i]'£Y»‘LÛL¹‘ìÝF®=Nmœ;–žwTŠ*K)E4²¸ítkÆ@ÏlqéðÜ3ÄþJVŸ’ø7ÎØí²fO#"Âx-ÂïP|+¼>NVôò„lĈl%ò~RFy–AuCžÂ]ö£Na/ÑöµPþº~«MbL7oÜåXY·ÞÒ ¸Y1,qz~ûâ<š&IÙì«%›e哉ö\ü¤uåé$÷3ÿ °Î7¶W€oа€½›´ÃYê QÜà2&ì~é¿û_üùÿ(¯½öÆÃ×㇕ƒ/ ûùþâ S„ èn„;¢‚Nƒp2!J¦˜#Ô¹ô€»Å"@×]´âÓH_‹-Ÿs{ E@dA¦r&ÅU‰£ðȨáÓRëRau¨±³(Ž©›VK–9‘FqD  œ'¨q<ÊqúèñÇ_«ÏîïÇùìì¼ÆgeÞïÎbT<¸r†ùR•b5¼šycÌîê׊ƒ+0èÏt´jW*Ë=”ˆÀÍxpyÿí‡ß~ç­î »qYBà!aó2Ï×Ë1á ‹-K­N´¨Ãá^ÍÔŒ$0 »âŠî¾,^u1« »ÄKDÎæiö)îáh®›LOlRè”,½¥Ó€LoN”l.(Ù‡ƒAtdAÊ݈Õ}©ÅÒêrÜjŸ° }cUÕܵ·T©·Æt›ËÖ)6£ÙÌâ:âm+[ίýt%í&´•µuz®·™„ÜÐ6ßÊ‹HZn¶cðúó´%è'ͬÍð9í«J)¥È ê]]•\ZzW-ê‹è«ª€¯¨-g.›³·]­¼°ÖI@ À ‰¿)®Lƒ¿½ù¸†W7ïà’ËÏðh±@t¤õÿuÊ¡@ƒÿ‹Ò&F½±õ;ñd}|UOW¸=9gÝÜÜ”ÝÉæ|®yÝpÛk¡- ¸©kZ×+¯ÔöJpš3Ev$ÌIj+Î[´ó:4 ¦WU œÁõW¾ùŽãm…ösßÿ[¿ÿõÃAŠ"ê2ŽãÕD †ƒŒðê®BXUI‚#E)ˆª T$‘™Rº4yv‰õ€1<×Ïâ(†Ó¼Ö3ÓDˆ¡€!UxxRô tV3[¬Ö:ÃR_J¹  !%4"ª UqŒ¬‘,C]v“ìËù‡O?.U¯‹~æ3oƒ Ã|,Ó´Ïïß»,å¼NÇ‚]Qxøó+ÎNº{u÷8á¯A«Ë´ë‚ZvBñ¡WÓ£àÛ=zôúÙåEEÔÃt¨Ç9*f_êá8_› _æyñEŠît03¸Û²à¸DJ%ñ^ÄKx­ó„$Ü+ÝÒÞ#e5pÄ­8h8à&Îê”\LD„Ѩ éŽ §¢‘ÈsR›¦Œð ¹W¥eš6HÛI‡„ˆ¬49M’[$¾3ÎqÞWs96?áY¾]ö‘ Q„ÝÒª*7¶V7#à:Wn +Ö—ù²ÇF µârëÒËÖ©·”5êí¢ªÓZJQU‹H)ÉGé½ üd5ÁOaTëÊPœÅxŽéX­PßÿøƒOÿÜü-?ù…ŸþG¿þ;>\tœ§«€³ é.½¸‡WP)QU‘ºbQ¨{ˆ#§ãÔêD¤ÏCædÑ çPƒafŸY3ƒâá8s?Ù-*1©NªKÙ-q7xÕÅé¢Jq‘ðš÷gõp÷j•Éf_Ef¦êfSµ8Î>T~úSŸ-?øC?üüñ·¿9~û‰=~ïüüS;q•Ã<Ʋ¯ƒ-X&½vèNX @"Óâç0ž90/¤ì­ŽY| S÷18`¸wïþ£GÎ_{àu™§yšÝª/KÌéÀ2W†û²ø\ÝFb}ªnË»„»÷v)ß ›Fq Ï+Äq5|É^¢;Ô®ë}ÏàѸ¢vr:¶oÑiЧ8xn7añ'© m“…½ó­è¿}D„OÐyêëÞ^Ñß” žÄõéÈ¢lŒ¨¢Ý~Âeá˜:úÞ:èí3mÈå8ìÿjµ• X_F²ˆNj»qô¦mn£ß_Aþ¯ “QmwD¥¸YZ“„—<-,rñ„Wôj® —x÷~ïkÿà—ßþ;ÿîîýü_ÿ¹‡¯ï/.|ðûç—Ëñg¥¸D d'zŸ8ÍC<¨çsè %qOôˆáˆ)0s&è””‰,Á˜<ÔX0 « ¤ ŠTë8žùiâqY×á#e_Ë¢x¾žœ•CÄr8^,‘+ò*ÔA )ªO§ã0”¡ €XQ#"¸P¼,Šè@ ÷ˆšu“÷÷ç{Æ›ûñï¿ÿ“?øo~øµ¯Ö:~|³§óãŸy4~㣫?xO~ì3ßÞù[×z¹è[ ûÞZ>˜–ù,–§ÿ/{o×+[–e9çÚ;âœs?²2+«2³ëû«Ûýánº Û%l0F ,!xá͵xEBBþ¼ò†àac0²Q#¡–¡1í¶w—Û.×WfUefeæý8çDìµæ<̵vì8÷Þìj?fæRêæ‰8;âDì½ökÎ9æØsº~ãÑíÑ—¶Èí“ã±=^^»øÌ\.Ú߉YÔ}Ù¿ñÙÏÞ{åÞ¼“ùd÷ ]_ãæ†áWÓlW¥Æ²´ãÓûï¹ù\uªv_we¾:Æñƒ'ï_/;:cq°ÅÅ…\\á‡ãn)`¸Ñ‚`Uu- `»ŒÏcñêt°arÍY,B!ÂÓ¢"Òˆ’ž²×Æri{'”Z«–ÓÔ¼îËÝ™±‰HºS’Je®€ƒ™§‹Q´pÈT´V•œÍ–ˆÔ¤ ÅÝÃ{`×¢ 4Ñ"&kâMx¨ª•""î®S³â`@mGõÚT LÜFŠB*!ÞWÛì SÕáµp”(Pˆˆ„!!ªb–‚!™Q)“T;<®!¯j—))`…Söy†šØ¤SÿÕ8¾h¨ª™n4ŸEóTNï¹Ý h—UO& îŒ9L{ÔÛ¹¸< Uå[kQÒPˆN¢†·ð%£_ ÂÅîê‘öÜ”@Lª¶,âM¡&…¡Îuj£J)¸(a…ivf°‹Ë®æ¢#Ñâ’q*@k3.ÀáÍÁ…Í “„0Åx4Ä(ÅЃŽèß4ÆNEò„t“ŒtËô ÁM›}/ÃJ@t#‡”@ƒC`¦ƒãÆîÏÕ›Ë!0Žz É0÷”qK»HX¦/j¼úhŽ¿pômäÖ) ~{ÈŸ#Æ£[ü¿û{å?¨ ;¯S×/»~÷•ǽ¾&¯N¬¹œó ù!C6é„í'YÏüú†Ï>³2>f$èOx;zXWô…4*AÖq,Ðÿíïþð¯àðžêüÚë‡÷vó¥€.¦©É,”Ò×("$¹ÌÑ‚Q@œžI-¦‡]gW ¤ô$‰¥$eÖPWÕßb¢$œáC––è´/ ŠM¹Df| Ù!0jcן‹`„"Mñôéa?_ýƒø¿ü…/þ“ï|ÿ;õèúЄ—/= ìôâþÅKŸÖ(vXöÓüþ}ð¶ý ïÍõØ>8À1–Cãá©×ƒ”‹i¶Pˆ &!©â\n¯O®ßçáaúêÃOÿ—¿øÎC{xÿ7\~ðOþàûOÞ®…>Ø_ Ärк@XMè³êÅn* »Iï]î¯\ìîpa­ø1¼µÅÝ4¢…!w.Í#¸ø(ÔlNw)4¡âΈd7²¤;¥P¨6ÁZhZ ©Aa 6®ö´wtg8š3”&;cÔæ&X6a¦¢SÈZ8lW „È,°^Æ{&¤èKn÷[t7š®Çk¢}?&§Žä*—ˆó¨·mœÍsë™pA7dX¿$Ö ôÎ[e· …… H—eî0yŽÁI[…L(sÀçY3î:Ì,µ6¶ªýßro^r"^é`A«ªèÝv£g#àõg‘“êòßrˆ¨§ÂkÝÆh:êèá•62àÎæ½¸á”èÜö;%g”ˆ„J&"bÓtúx#Ó°¦Ò%éÔÔ=Ä7ǘ0ë¹·B§DI@ºÎ %>dìU³."¤GôÔò³!ïxùóCÔuO³An={ŸÞ¶Ô¯Ntn`ží?«ÈÿÑŸð:dð³r0+FÔz”œ´‚^·òàÑq÷OÿáßÿÚ¯~~öç¾úê+÷nn«1JD ©8”Z,@!”aSªªg9‘@Ç]Á“ C7]¡¨zW)Æ=Ù·’„ˆ””S X¨x0š‹çžLÍáÕfXE–C"µpHÑÓ¶4’Á¡¢Åö¶‘W^}õÕÏ~&ÀþøÇéxÚ®â•W.ËNÞúÔþÞd_yxÿ¼ôÏ/Ž¿koßN/Û+åÞúΣòt˜îí/ß~p¬–#ÍááµVUÝM³ˆ‰Ôý}}ðÒîþƒÝþŽZap¯šI$MDLn Іzh£.®Â)Ø.æ"‘æ?J1uG°×± OÆ­š¤¨%HtM]ÐÌ$á“YC¸Fœ$÷Æž ÷kjˆŠ„PDb()kï» ¨¤âFš4/Üè;ÙQ0^m`¬w"¢:jf›^aÙXŽRŸpwÕYeV='zQUJšœà<éR–ÂÐ"*%7 3 •3e«"ªªÞ \”¡&9d%Ÿ?†ØÕ©úÛ| Æk1bh1ÓUÛy}‡þeÇ_ÙF·?娆†ëN…çL+_5­ò¡;ã¤OéáŒÄ‚÷œõ6ŽÌë"jˆRÁXM¨ÖÈz¼ŒçGÐ;ZÒ¾¬K¡f¿[ª½dÚ¬¿”«öVâôf;²$¤÷4X¸n]4&ÓDº®‡ÿ‚$©MdÜX6„À’7¼rПð:î$lH¡H Fº°L»Ëc«OÚíîýîoÿÎ×~ù?vè—¿òµo|å‹ßú½·Ÿz5³¯gÄ9”@µU«“È,¶S©SIšô*ÖFòq»'©“¥VœÊ^ŠSˆEˣ„&Ñ(¤jéN艾é«ýM‡'kÚ«DÖœBØí²•È])åx}ÜÍÓo¼~s¼=ÔãõíµM¥ÕåQ{ú†ˆ:>Xn«”wž>z÷Í7Rn~™Ú§äR!·ü4 `Þj,ñà¶¶©ÕÕÝu*óî2³ —÷ö^¾·¿7éðæ áKó¥ùуj¦QH¶­VNÇå¶µ#$D›š£¨”2ûâAwz8%iÍT*f–«£©Í6Qi&2 i¢ì¦»ÝwOˆ^ÿc() &ëž´§« 1D!Ù&©¥6†fºqeÚc úJŸÁéâb5k¤˜¦K–dˆY­‰¾ÍÜèo’k}w"â™´a§¸'òðùÄ“ô÷MôíæcÀcßjhO@-@ž‹0ßeO$¬ÑJtà5¥¼Ÿý¾«öäö=× Ç¨w;Ö_mÒžëiÞh$c`Nfh›odWû:Z†»Wä£XcdÏß9o?̪#N…Ø~ÇõôAŠŽÁ¢Ã6-‰§"=»ì¼´'št†Å¦+[º×ï3Ò1/?eÚ{Fþ$ãÎ×\7›_õBÉúä8Rù/íñ oF—IÛæÅð¢Ü¿mÍäøÉ-of}øûÿïþe¹ràÕWÞøS?ûõïý?ž‹h•)y*rP©Â&œ  b0R—&ÉQvƒÇpÁé·ÁPëá¼e‰ÔêÜÁ¼ÝWmwÙì.9}ÆÒ<È¢éF@I²´|äMA¤ùL)ewYvE{óÍï‡ÝÞTW»×ßøÂçï¿öþ»?xöôá½w/ħ^ýÜgîý›»Ï}ÿvyôΛï<0TƒŸvTñ4vQ¡é¼Ûïw—¢pL2íl·W›î7‡êæq<­šÓt? XocYžÖ«ÇOn#–iVQÎ(E‹ §/yúIo.. 6‰è;úomŠíÊB§4 #oQuÕ‰@t‘ PUBMŽ‘ŽTÈZ?2SуM`BÆ0¹À Hz·ÆZ[³_'ˆ0‘n "*T òreäÉrnE”$Ú¬ L®›8ØÉÞÒ¹SEƒ*³ yÞ³B$dãØ´‰¤ 6Æ]ÄJ–®G[œ53ËÒµÿ"#àM/ïIÄJ-¶‡™Ù4M§^a3½ÛŒtÎ5ëû  ŸPa{ZîDº$½›Vžúz“Ý¢FD4kA7¢’-Ø‚5‰wÑ(-=Wâ<‘nV{xvgê׉ĪnKŠ Q×ÙÂÄà± 0#àÄóFNLWèÓ IéØPL¶Ÿ'Ï^tUMk–;»œrgwÇö$oŸìå­QÑ^¯VDŒ…¨'¢?žã#qoH8ØXA@0ÕP´¨a|ëÍw€™€b÷Æë¯íK™UŽ¢• :‡x[Ç@•%|!›{ñF dq- ¦qlœáeDd¾ö­Gtz‚]ð¿ç˜Ø»z2 x¦»Ç%"<õ¹8R±"*eÄFá“{ …¤ßêýËÝ›ßûîûïÿäöxØ_]úíòèúöS/=¸}ZËÑ.xÏ~úñK¿ÿ“Çó;æÿæÞß{z£//‡—¾ðËLå%–ð©zù^†t¦*¥L;ì.¦ý'j”Àtt ÆÍMuH MrSÊbKÚ(k0çÃæÖl,¢éçæ5t/^ÃM)1oG(Ó÷—€k¸{mG’^ƒ8Öv¬î•€ ¬FDt­#¾£{ IDATTÅ`ªÃAf¯…jS\+“zãz¡C>Ɉ~æÛ Ú-VTÍ3ëò”m]ÓeCcɤOŠ.Þ×ë@¹ê…¸öo”³ÞT¡2‰tRÎy4ªšàœ-è`6jÔÃlCDÄz&:­­¨N*½F{G K K7âVcÄ ^­ùg1Ëk0ÂÞ!„./H]n‘f…‡ža~'Çjc®ÿÖV#RþìtÒÑÂQöÂÞÑkÜ·ÊŽF¨K"…¥Ç1ØöÎ;[D“00>ÂæAòÎÞϧ×mß]‹î€¬Æh7’¢ªQÛyüÚßÁì…‘1Éu·ntÖ=6¥ëíñ؈Ìðã‡ÃC A*¤ƒ„Ðu0r*$á™lDQH¹å ôØ|DßoïÛ¯âê¿Ý×ÿ¤’¿ú ö¯êÕ?¸`s+^ÁC4† š™í›/êïîÛƒ¥]º|“hyǸkðî” Å©GkM¬Pwž 'îÂEÃ)JT‚&^*lų&IdÒT`Õ-ÌŠÒ¢Š*çÉÔ‚<\bJlMÔg ì Ç£¢ï¬ ˜;9Èa÷ÊîÉͪp¹ ‰2Û¡.÷ãþÒ>õ¦\_¾ñÆg¿ÿø;÷Úwùƒù‰anÓÍþÓæ/±´ù½÷o÷õ5}ò­]Í®ªê~7éë7î¯~mW¬~mQa\Ìòô°xã`.óK‚Òkäm­‡c\c©Ú&ÅÕ$W) )õ¶‰‡ðÚ±iÊÌcELU09Ði¿`ÊÖš\íožz;õ N¥‹`ÞÍê-Bº• [ÜF¸x ƒb²’zÅN4wŸB' J¸g¼Q ³BBÅ"U‘¢¨ƒ?£íÃLçRÑà(€MÖ¦#‹£ NP…Ô¾4×JU˜©•BjY˜Xº¦•¥¡l.‹ÅŒ³È RdF† … "AM+YS)4ËðÉ@î$E-L†ädƒÕ”ª1íD”fì&”N²áM”¾¿P“Ò}ÍDfbÆ¢î"bjS™¬¨¦‹&¡¦*´Á¹î»DǺ{´Ä>›’µ¨] …jRTyÐ!†Þ¹½†´p!<М‚ˆ© |m9B¸z Ø"Ì]òp¡+ƒ‘ˆ‰’íºt Î%nSM€2h!J²»½ ŠÈ"ô47g›5™”@0è),Î&*ªCYÇö¢f»¡Ð”rAˆ0Úº£ÂvçQJöF¢š)w÷IwwNZHˆ@~-¦—¹›M"¢TÁ)bÞ0ZpЦE tˆP3@2XtNÔMèa]èæ#8>†üì(ÀHWÈâð„¡f×î‰ãA®¢=zTÿþïüþ¯ý¦ÝþË_ýSŽY¬Dkªšu?Á‰Y«MÙ‰$½ÇNºìÍóÇi#¹ÝÅç£=~}÷]ÖØ™¹ÑɹY°Tˆ”Ýœ‚¹q0$z6iÞ÷®22~–9ëÌ®+"DÑiÚï¦Ý\æÝn·›çýTv;›¨å mðK’¬¡Æ²Óù–…P˜IQÛ•ùbº,E¦R¦i±9£¨Ó´+Sm“Ê&UÑj ¯bM´˜Î¥h&të %jHgÐ3TX j¨ZWˆqsÈz8éUDnʤwc-Z„—dVQÇ_ÑXÖúN?í,˜qUBm÷þ=fDRäžñ÷}á  5F}A5SÇ™Œ Ici‘óM"÷xó {“É:Ot­õJW…“‘Lî9Ý4×váæó¡ƒÝ6‘î8@WžsN«ž¤NJœ^9ØÎý%ãMî¶?“>ݦ4E$‚=»I°H¾cÎvŸÏMœWüÎØp'8¾3V;¬Qô®éÌã±,œßÚëÍž‰ñPD„d|Ü\ò¬¢KEŠ@E"_¢2Xögµ²Ò×G©ùE B ý…I è!õæÛÀ´‡³›Î3¦ÕÙßù‰ý"6õÇm| ¸t™IžtWÞ‘yF§ö÷@ƒ@_Ñ€ž~|]þúÿøýéo§y÷ùÏÿlÙ¿Œ˜¸dÖ.õœE†×¯’ ²A‚tQ ”à "wñçRU¹©¾©2(µ)ë@"…á³ZÔ TYë‚ À½o˜IÑ–YUfJSQ©Ì¥¤¥ª-`é«ä)¢™Ôæ2M§i ÛY);ÛÏ:O:ïÊ´›K™D5oôp¯Þ-éÍu^v{î­ÖYfMÊý‹û)£dƒ,¥q¡x™ö*Q!ÐXç±¶Ûê‡Ó&  (Œ „"à*b:1è-¼y8 €‘Žím»*S2¢×¥{#0kÙ“Jj¶ŒEÔLQÌŠA5:|dÛ ‚&ÉèB¬”2ïÊ,Aá‘(A›¬H±P¡™è,V*A%Q—º`ÑñV¤©Ôy'{¸ÔÅýÒY· î]܃g¸ØÜ½¹WÂCjI÷JmõööæöööØj ¶ÀeÜz[T%ÌàBv#£mÕ› h¢æ !@±¤,Ó­zÑ‚’îLV8Ï¥˜D«Þ|µ¡Ê X1ԳσcW“Ú*+"‡ H²“;# £¶¯)‹˜ÌÔ!HÞ‹ªƒ)*±Š×ë +•«„Qú~*õ¡(h•ÐܘI8Õ8¦É^Yˆa¡}•µBÌ©j"koËiùÞ®çφ¶ëO¥w KwE×~ß[QU>[ú.œ\ú›ôˆùì3Ü]ÜxÎÁ ‰Áp'èeÁÈçZxÙñtuû`xt"•ç;øF‡ßˆðMœ¥å=yã€7À´œÖ|UŸôÜ‘ÄE•‘’wzR ²o"¤g’vò¡:ñ7k ¶'§/è ¹=[ _Û7YÑÔ#[í2\Y§ GBèn\ûBþ$ð1às¿@2J¿Ï»NSÙxiÑè·ÿè”wýÉŽûÝÏþâ¯ý?ÿ÷›õñ1J ´ áp'¤Þ­¸£,wþÐûÙ×í­*‚Š\#Q†H¬ƒÎîW*`*s§eKU§i²])óä`w`2³0K;BDSj±’Ã̱¦æjJ±Rf(3cféV“b¶hæ­031ðê²\˜¦5÷r¸ýÞýKh§é:H+%háÑj£z[Ž·×7‡ÛÃM8 &Pc56•,-šÅzê–yx[Úâ!¹Ä·ƒ¨ˆ [u6`¢†»{m~P…(¼¶ãñ8IA.‹DŒ¦¨„7K_Hô&”B±”4謭`1ˆJ™É ÒËv)r碟ç÷ÎXÅÐ-¢%?ØÖA) 5$ FjÿÃuaèå;Ë€·®–:¤žÇ r[#hšuô•g†jÞ•3=²ÐÐSغýÛ†¥ê Ñ"R2í¼r!”ç` ‡Tçö™ñï)§›²§|SOcdšÏYÛ‡kh›Ò.£U `·)î„ëÃäTÓ#uè˳;àvHKîÉ*Ä+w]E!ÁÞ³ "ÂÕô™åUâ4 ,?|ÝÀ9@vˆí ªž$×ÁÍ.¥¬‡m¼ÑW®èš¸VÕp?{òFô'ã¹ãcÀ)3¹i7ꃃŠ5ËV:ña¡ÛFaAġ߮>×€?÷Í?ÿ¿üßzôöwh½eL½N… #¨ ¬"R…œzÁUžMA¿h„›ŠÎzþ¶ï •Ã\IhÊÖM'TM‹éTÊn¶yÒ©$U´Ùâ˜-°â¦!ós#j¬"§P¸'§#ÚÖv°×ŒÙؼ$ŽÙØ\ƥ̥ŽþCŽ#8¶ú”õ¥ÕVªDbµb€2š 5Ÿc ýzjcÝdlcÙ»çH„.ëTÛx 9|8Ns½ãLF¡kÄê£Ýèliú€ÿ˜ñ1`ò{ ,cƒÖ¶ç#£´q‹kpÑEš~ûwþÚW~å_Ì¿ø‹?÷Úë/ýàê²iéSUU•â¢.R–žÞ9ŸÿÏ}òúäz±ïás/Mí` iºŠ[u%[isØH"f¦eù÷Ðmx öõ]Ñ Äî@ ÛÈx dô~[²'Š;»{îN=¹ç™çVŸÏŽæ†ù|þ»$[¥ŒtIr«u ¥(Ç_Fß§¥.; Á†0Q%5ó-2ºÖÕ ßH{ù4—d{ 'ô]/ýööÙ6röÍ}=à¾>Y×8a}þþiÆÇ€¹ï &¢ 4Ì—h@Ë¥ j-Ø@à ¨ Ëbp´Tp9Ï×ôö?ü÷üG¿yý¸îezøù׿buûa‘+åE=:QÕ‚›ãÊLJ5o“UúÌÝÔ§f]‚`ônâ /à™j W„Šx†$J 5‚ ¡ŠÔæŽÒÊÓ½\Û«Ÿ3 Ýòí凟¿ú‚¼i»¸@µãÁ÷ó½ºðÑD©ªŠi²BDkÍQÛÁî…ÁYZÓʸ(ôÛëÛ9ÝMå2Ò‰ªÊ‚0‚ k«lThÚ?-ËA!*“TƒZL€Øµ¸µ9—õ"œ“½ÖÀÊÒRµ€"æGÒfûB Ó•€2&-']Ê‘ é‘[›Ól,p1œdCöøm¬ˆ‰õ\aTº+Ñ€ µÌOÞŠ£¹ YD¬¤íUDÜzójm²8Hì‹Y…»"Þ6)eB"¡´jö !  zvZU´ñ«(qCE%5¦Í”™D6˜Šª–¡¿±ëvIª’ÒW鿥›–B,Ú_B|€w!òžAËVD3ùh‰ÊÌzm©ºSh0–žL–ÝJ"!Iu–¥yMr–jJ]y/éÒéðD÷^—‡tlˆ´ŠˆðÊh@„¦½UÅTÀpa€¯®á."EJ J‹Æh¤àR…Z†k•¢iމÜ4¨SØ“öGÍÊ.€±û'úJÕë$Ó.eNöþàÈ\÷š¸žûùÌLZ"f ÂS;~¤ê"Þ€3}M€Ñšƒ*2IúÅ(E¢ÊLÛé6pKª ðnúÑ?~Ñ8Þ€LŠÒ#3aøô ¸ìˆcð©ºì½E[¾°Ç»øáz~xeo×÷ßøòíüÊ·õúRFÊŽPËÄ0Qs:v–¦´,ÒºfmÊ×€¨Ç—}Cê£\å}Sûš 1øÒÛ'Ïûð2p™¦i¿ßÛž¦“ú¡M …»©@¢-KD4u¥¨YH¨bôMЧ- »O¦–‰ÙpЕL¡€Ã¥ÝÔz(ÁÉ´˜Bã<´ )%ǺÄíáp °ÖZ¡›'! ®QÕ]–£Ä,„†™NÌÎ ÔHs¯™58D ‹È$Pͦ—¤! 7d DZ>t£rÑÊFèqœ´Îó̇ªƒ0$†ÎRHà,V5è2«µÂê`ólppçzm‡v2κX%çÅ×®»Ô'ˆPE$zÊZg@ÎÈϼÿ&í¼Eº ª&EËÔV5ñí‘'mªÍX£Þ «×¶"Ež“÷~öÍ·ÑXž·ž#åùÃÍ™ã¹öŸÏbÙ«’õqº 5÷ßæÆOð¹#m Ý{¿9z ÊŸ¹Ä2ZøOŒ0ªѵÂu¨Už&M†§:*6L:‰*û:Æ+º“ôº=}˜þÃŒ_0ß¶3åÎw^²Æ¾ë›ž=óÌñdª›Ÿ„²×Ð™ä ”.?²ãî£t¹s$¼<;æg\OE`Ö\fÀ¸~puéËO¾û{ßúâŸý‡Óô¿þÍÿîg¾ü蟽‹áâ‹TŽtPI…XP íOG8Ò "yKøYOƒ"Go4ÉõE¼ÚxeWINhÇH 1WF˜Ù<—‹‹ÝÅ¥ªYâhj¥\Ì“GkZ¡¶ $›f¬H‰ÖKeDO4*HÒ›0„ ¬ˆ£xe4Ò>’ÛGÍz¨h"*P Q·éƧÛhXרK„ÕÃõ-ø\´uw3e‰£Õª¸"ÓÜÀÔÔJƒ„ê^:l€Sq•&¥•Pcˆ8U€‰ÐÜÜ„{*/T¤„“{¸C ][(átª:ÖÐm™I~ ÒSP”tM¥¼Òu*šÀlç6™çuÙzÑz½=ù븟€$²p†ü u¸ÊàØªzš'ëË;:çø×“ÌU)Yˆí@)©á<þ‰äNî…à¤ümx4þ®ÏçCÑϘ+ô¿w¶­ltßg\á© úvlŽQš=¡/²ß—Ï@r¬úÏÂ{†Yañžy)çÓ’óÕ¼_D°\gI¨D0ébëWéyç~pö5†R™}“ qTA0é%ËDŒŸéÏàuA‘grÈÏëNhû-6»Õg*(Û4Ïæ%ë™ûcÿâG{|À}È 4¸£Cê4D“›vd;vÞ–`Þc2 }æ½ë÷.Ðþæ_ûŸÿÓ_úõËû_üÜ×ï=xco5TÍàP0Z¸7ÚTÃJˆ0U EéÆjò9„«„úØù@ö0f•÷C8…Ù°lmÙ™À ž f=¾ÚU»•kØïìb¿k +£´âlÙ<¥š‰’¬-ÜSb•ÑgúWFc,éÑ<.s µ˜KÀ *¢e’G nŽ2í9ßµc}zc-âp È4OG[4 Í|áñà­µBÂl¨7 ‚8º7b9V¿U3¨ºP"DB¸“Ž3ù_ˆ:0Ùv­é а4¸³(”R8Z®ó5Ïœ/G£'ÉÐLwC²—O‹ ‘s]£NåÅ«V¤`¦(@IÂ: R³âî Y'êú¾w¦Ú¬Ìi¿%ãÿ4Pú¢±nG[;ûä;€¾ÇâÉêc4>à1©¥¢êlÞG¸âÓÞ®`ì<&/!/_ØÚ?pϪðQ¡ªvo÷òÙý4·ÊÖÚ16•("ÓTÜÙ› R Je˜(=k¾‘–Ý@}•@5"$“oxÑý…uýÅ&…E•ŠfEËdûý¬:‹²E-E÷3c1ã|}<‚ U+Êp´†êAQ±­]¼+ ÕR ¿s™Pv˜wÇë§éaÓ–ÚŽË™ "¼*“]ÈÃñX½ºûlóíã뛺´ðV£ÝV…j…£™iXFl¬ 1ÈêZÖÞB)¥ÌZ&ª©g¶Óè^ JJ@4L"%€”rì,eB’»º‰lÖÍ>¹°d°&µ„¤¸“ɉ^}ƒ *x^y•®«p7•÷áC{ åhŠ UҾʳ3|Ù7c wçtGØnæÄ1ÕB>?+ÐôQ0ˆÈÀMÍnÝÎ{N$†™uÅ+ÝF¿ç-¢:z“t4 mcß\‘ù¼CvºÓÚ¦Ç5¥Ÿú$y.B¢ÛËeɖ΀k‹Œ€Ý¹FƉ› Û*}Õ{…ÝIúP»Ê‡k¼~°³ÄwÇ’>Fü;¾R?ÿC¨2óʉLd òÅÀÉÆ&¡í¡)U¨šÍàÚ“b£?-ÁÕ‘Û’u¹øPHÛF´?MBx ‘×ÃÆm2Þð§ÃëõåÛø§¿>2ãîc†´Y¦ -ÜõbÖ<}ç²[pqr˜æxã³¾þÕýç??ÿùí/ó_ÿKû‡_lq‰¢t}û÷^{éë_ùâ—ÞyïÖß¹n×·ÕÁ&jª…!T¡£I8-ÂM‰Iv}I“ RÄ&p‚n.l|!¯ÔŸ³â D†§ˆ©ªçùòòrÞïDÌI÷ª†y.µšv“Þ rä™él­²ºsØE=TÕD\,(Í#ª/eÂtùÁå/;Ѿ›]"¶t)]‰*b:—i¹>òýÛéšs šÎÓ\µ5 µ&*:Qƒæ*Vö˜vvÄÑÊb"º0<(6+!R C¤iø"¤AýS IDATf’F§‘t–iV[ Ji M‡ „°ó\¶¼.cšøš6¿‘’”ôà$D"å v’eÉëaÝ;áO°Ü¬ÕÉ5<ÍöqO àÃh+A)ûqýLNF ˜£ùh‹‚=¢U•MÔªf*%ÃæŒm{<œÍZ½ÊÛk½:Ltˆ9›Y‘“&eÚžÏdÉ$ëPXWyp‰á_+ºA7*u½d¾©ÐžD›#.ED´hwjÀ½7*3ìNwﺬ!wzòáZÔÇTú9ßðæy²ª´ev¡‘ˆõúfw·€pgL+³ŸŸËäºZ4{™AF2ìZ>¯,Ϥ ·jwŠ&Ï‚4Oç` ÷6½Ÿ÷ä‡bÿGr|À}ìLÚf‘yÆýËË/|þµ/~áã/Ö?ý/ÿÚ×õÏ¡|øü%ˆ[´§˜îS÷TðdoËßúÛÿõ·þÙïüÂÏÿü÷Þz¿êÛíÝŸ<º®Q»ÖUdÁhˆ 0M†á®@ÄÇ®èËT]UU0,; ^4«‡l—ŠERtEäl³ifó<ïv“X·;n ˆ¤Ë*Ó$EÅ)V$ÍÂÑ Ø E±ÞüŠPE¢/›ciËÒZÐ)¡f_øÌîâñþe¿S·‡'×7‡åè&ÅæýÎÄ&›ëq‘÷žê“ƒáJ+9i3ÜÀêËRªÑ¼±ºC¼¨Z_!‹…¬µV›ËT`S˪º¨7ºS¼¡5ÖŠ²GÇÈ”;¥ŠÐ_ ¥«NžŒ\q¶1÷$³D·I—lL%L•)«Üå5ôf70ANÞ¹› )ìüðYÚ/'™Ô ` ÅÀñ&£Dˆ%/ ?óâw–sÒSp˜@ ¦Ðþí E̱!*÷dêݨWäÔû;Ð÷Ï¢fÆ_ÓŠ(²©AÞ·85®$„È´À ±g09útóÌÉöùž‘>à¶ú å12êÊπߟ‚Ɔ^wÀ‚”¡·±¾ SÈ;QI¦¡¢ IHÍÛ| œ«VN³•Çû‹øO>›Mê‹ÑÏy‡©í6÷þèÜ>9¾þð^»yº/Ë~¶W_ýôW¿ò³¿ðUÿü—¾ñK¿ò_ûù_½øÌ¡FáqYŠ™À¨¥¯˜–zXr= ýñ%êŒRñ?ýíßú›ãwÿ÷ßúíëßù?ûå¯<•ú½wþ1âÆ¦©.i®ªû ´JãÍÜ>h¼ª|Yñ~øÓð#8I)‚†VÎm)«!r` gHÃ… D3› +¥ÆpÔz«ª4÷R›ƒ¡!•ÙpQärÖi6ÌÅg›kchyt¨Ü]øÄËOÙáöÉÞD÷ àЇ¶hu9o‰£¨€“7ñAUHÅõ“½–Øð÷üð¥‡ï¼ýÚ—¾ü/}æÓËËå«?s{o'Ÿy¨/Éû˜¼üÑõ>óxjzO‡"°iß09ÃëÓZ¤>Š»²÷j1ØÕõuÝíw³^p1Çbfe7Ii×Ç^vj‚©µìK’¢u*ði͹Ô8ý¸D„JÙßàzænòI\ºcqÔÛã~·›g™Ñ$¦2U¶Ûã!އ¤­‰’î#’‰C™ “ºAÓ©@¤Å¨E\¢"©\†0…Zfˆ,"*3ˆp©¼íÓq?º&CE0eÛ¹ UÂÃó<«váZTaUf(MB¥¦’”`'ÔEé(à$™?vˆÔ‚ݼ«OQ; ÒÐë/`w6Té09 L»„ä@eª„ËAmg**ÅDUXŠª…锑²©Xþk2©†Êì“î0PÊ$›Àn Ù»U™$±é'€ÅéÓÅdž‹3"XzÉ5"k[éˆ^äÍ…ÞUág4„Ã’9ÉÐÊrA0öõÀÃcãöiŠšá›ÂÓyÔ“.³*¡BSª4Ðj )tCº2YT¦°‚&j u°cJW„¨@œS! dÍŒPœtǨQhräCt#CC×-ZYÖTù —Њ›¡£¢J'ɽ÷6q¢«iV€EnzO|”Y“ã-< fTDµÕl GžõmÅ{ÿ£4>v <}ísóoü…Ÿÿæ¯ÿÚ¿ÿïý»_øÆÏA&°àæ4Õ JÞ#LódhÀp?'2† ìƒn~üÖ¿ÿíï½ùý·Þzë‡?úñ;óÅþ/þ¥{ÚïòØ‹ùb™[]€ãqYXvÀD#³º€S¥·j04BVãaFI²Ï&)dfÒà"€1Â9S÷P[ý úm ìþ½ë6Ix™¦ižçTÕ°›æiš…æŽºtVNf¨kJÛݵËÎzÆ…-""vû}&QÛññõ…–Ï¿úÚ—_{ýSá›O_ºØƒ×Çå'q3©}çüß½6Óiš¦p·±ÛU‰ˆ ªÍZ&„xrx‹Ù¤Â!%˜+X0¢nVÀBJ¸ Ûº\\I¶ˆ ;‚ªJéÎ…=p Ò)òç Øè͆ƒA*á«àÒ:iÖ ‘T¡8‘E³¬ØÛ™”ó-}aÁƒ†3ØËüwS\óu£Ì`&%o]ú·!ˆŠöÂ`ß 0rõ¶ž‘ñ1ºýæ&Õ×ÝQÖÏ韅ÅÍÏ'\”ÍP-¥2©aTv‡æ³$Q C «Ä«Ö†Œ³ýCüЊ`ÏÖöë¡àܯFî™bã©àCƹÿ-Šž½‹M²uOß=¾¡ÏƒrÝCó~Ò–*$Õ@€àC„ïÀˆô¥€¦ uªC'#!RÖ…MÜùÌYýgÏŒ~wŽìKRLÈgX%#¹õ9>>øÖqalIóo¼àZ½¨óœƒé’>ÇÁ·øcÀ÷~ó?û¯þóßü/Á!‹ìöt‘ýE'£:–ÖZ ˆ¨ét¸¾~ëGï~ïûo}÷{?xë­·ÞyïÛÃÍõò¸Ž·77777·7G-öÊkŸyý³¯.m8?~|<£†4@Ën·;F”d`‘áaJ ›ŠÙ„ÐhF•NÅè”™uùØf!"Mé …¸‚¾¤“ª‹(¨A ÂaBi§ì¢ª–Rv»ÝÅÅÕnO«R®î]í/Šíj]¼äR™)Ä@ÆgKSù¦°ìô%ÑÔZÀ¡Þþäƒ]Ãk>õòþê|ë÷¾ãO§V”öÊËßüWþÕýÁ·/½QÚÎf/a4IH³§K{r}¬.5$«§íÌ Þ€\*’N¯ ‡{x°¨@Ul^‘45@J⪙™M†)43͘ÀM]ÑH ¸0=]\»’¹MV²=tÃ2fD@MÏëíª'žNoúÐâX¡€Ò×Éß_¹;KÖeW²°¿úä jEÿöÞdI’-É;ªzÍÜcÈ9ëÕ«U=€ H7šDœ !)À– ìø¤·$ȯá†~)dCl²ì¦{¨®ª~S¾÷rŒÌìª.ôš¹EdduA„V¶IH¦‡‡»™»Ùµ{®ª=Ç J¡sT-»jßHU é’<ËL®3ÉY\n&GÍID`sˆœ‰åNÕŠ˜I@ͤ1þÚ:¦¢V–ÞßEŸÒT±ô+¯ÐKÖ\ÖX4BYu²©o$ §esÌ`y‡í<'†ï F.¾¿á F³¼“\mh=ו‘5Ï«¢$`´à[BÛ‚/²P>tÙ( FÆôÑ<·€vÒ,ªÐð²ñ÷NÊw•¼Í7SífLS-š§LZC[*d~ÔÙ |Iï7—ÌæÎ|;Í.3k]ÑÎW•¬ªèßöÑðþçgQÆB°=¿$0¥ Çéí7_ÿô‹/þôóÏÿêå7¯wï¦i”·ßÈ8ÖëÝp}=\ïö»Ãa˜FwõZG’0QCéºxùr8tåáÕÕÛÏ?ûbw½'!Ô®ØFËÊø"Œ P^JH/RS}>"l.ð1´î,x ”FÏ™4pI‹=;¾U­µå†o›+dŒ¥¦;ÿ±%“o3ÂŽ;õÚy“ì: ›3Óm‰ HwBIɦ”ÒÐ;G9Õ@¤D¦L` ]²Ösù±cË©ÈË߆CfŽ3é-¡mM7IaëK—Û(¹ ³È^9ÍÕöü²Xbë92GÌó‚i‰eÓA“¨¸w B@Írõ ŒqëWqûèx{9 ÓaÛu‡xûÅ—Ÿ}þâëýñðÙW_½úú§‡Ý›×¯¿xùêË«·×Ó^á[áy·y†»ðŒ¥²¡QÆ»ýnòd¤à8b<ûà ])ŽÓõðç}K0'éY”(¡Ä”­/ Ðk®×!™Ð:¯Ë=߉ÖÈù›"`—V6E®ŽÁÃE½9#@³"’¨“÷-Jéû~ûðñã¦NÃÙ¶{p¾ŧ±”~•,á©f¶9Ã…f%ž‰ÄœC´nÓ«joåÂú–NÍÓøÉˆóýqøüîàãðõ×_ë×ûÝñpÓm7Ô(bs³²\Ý\OS-¥+ÖUÊÖLL÷áN5m”sQ¨îÐ`ÔpH6&Í-ÎlòF|bVZ4z-„\èK§PšN?I¦ CŠ9æ€9elŒêŒÖ\”«1344i‡Šf5Usµ˜p¬WTëgnÿ*m&Ÿ­ˆuî•”•õIOZöÜ[9ó EÒ@— ¨@¤”¢\'~ —H÷½í'u±–_‘JÏŠ¢ÈJ·¡Œê"¢·xÑ) –®‚‚™‰A±»€7Ÿ±%Õ ã^™án9‡$¬ÔHµ³ðkŽF½òÕv A—ÿ›soLÞRÐéИÍêaIiÏ2íJO%ØlsR¬9åÞèNän¶5Éf5ØXÞ B\̤óJ¬R k$& FJYæs ;SÙƒËH (È€¼?å•'6\«Ôæ]¶ 㟧5ÔŠˆõ@¼½ÅrÚ¤%¢ññ¡/>Bž¢û/þËÿúíë—Çý¡”²Ž5¼ãÕ·³þóè|´iT¯º{÷ˆ®Œ©VŸ"ê»Ý^Šh1U„O>ŽáÉQë¨ E¤X¸#EÔc"Ó))#/!œ­²’ôÚ=™Ž¯ëyy {(¦Â£øz„{Ü0tçÝ_–ÃÏÏjoãcŽW}õí¹ÊY_ÞÖ#\Ü©ÅbªUõêæfÚbf>BñêÓaïîV±°1¢Z©:ûì mæ¦ÉÙÒe‘UIAÏ~Ý’õ÷Ù**‚(ÙD­$D5»- M×àÕD?Ï…‚&F‰fˆÀÀÌšø#ɶtš£Þeš-[[HœªÈm²P…’”­ìVH»²žs— ähæÔæ,˜ z!훩¤±ÎÊÿrñ’YNònÜŒç Xf‰J‘¢*fùX  UÍÕZêXÄfÅIÁ-(æÕµï,y"Í’$3xJé«vRi5æ¤gd²'"µ#ß“–dCÑÛÉôýmd«XE·r?÷ÎÛOpÔ\´¸÷çâµF„j ò‹ß —¡5Š`A¨JC;„‡f èÉD#œP]¡ïþŠÈÜÜ®ÐÜ·Ð\6pä<á|Pñjù“@‚D®‡N€?Z¹½—e„£†ïßjöµ}Sú…bå¿¢ÛGÀuÒ?øŸÿo?Ž íºnòº;Î/Ï7åÌ݇©N5*#ˆh>PœQµÖq˜ê@¯ÒUbœF?ŽâQÔU E§ˆaš¬GÙöFÓͯVš© %8¢^€Èá(‚èJYnÎåÃëÜÇYgЇ(gàX§=ë‘e%´Q¡Ù ÁÔ&5¨ÊR.¥>ì÷ý#œoÍ)jî2bæS,³ è"4H~Á¬Šˆu̾RÔµÞÕñšÓæòœßô¡AUw«†&ž½ã0˜é4@ˆèqwï®PÝHŸjÒ}8ö¥ C 0"!Ö4^\ƒé}+J¦gM«ª6]älu D´ˆ°”¾H!ƒ*ЍÊÑÃfh5ŠJˆÄÍ4·–}ÉDDdhä赨ª¥¦€G»T-a —9™Å)Û„µê Ãj2š›Nò^Ú¬ªª|šÁ™X¹žH Éþ(,õUª°MEQù#e0 Y‡¹K¡·=Vª¡ý›>HÊ´µ,"f’©fky¡,(·Ì3„:w-KɵÉnŸŠõ¶z²Ýí*d‘Íí¨¡odG/æ!$Ncš¦|ã"î"¬oœÍvY^½s߉ˆÏíFù§·Þâöž¹(,¨ ƒ¨¤‘Óà‰Ü#\ÛÊ9„ˆY7’‚â-넸@é ßsÆZ zy$Ä•8U‹cîNÔ¤ O•\樷¶æ‘ûò7>?^‹ÄÙ..–ÐY×ÎdIò?¦í£à~£¿¸|pvõöúf?v›þx¸!ú; רÆØU›}ÔhJN`HøT=åû3ŒÕ€Œ>ùPMUµl{#vq p¬•㈮k͵´Ô¶ŒÅ,È©š‰ø¬ÂjœœÏs…®À†Òƒ L˜vAPABCPšzÇÌ—`š¤I’°’Qu­µtºé‹GXH (WÓPÒ9tŽ1s6l“„G_ÊÔu}ß[ß ûØ¡>Ù”ïŒÖ½>–—SLJá჋iØ»F)š>JµÖiš2>¨µ{0Ì ¬•ðéÅùöú憖Qa{v>ÕƒÀ€rZÈK˜FèíªnÒuZ¯9_2"| NÁ!Ü¡ç@OÓ–ò–'Ò‹ˆAªHžOfƒ À”¦@„³Ó@Œ•«›æPAæï`šì*ÐPH]EäXòêîèDT „eøHdCy ¥Ô–‚¦ ZÍK¾Z‘=»+àk%¯·N:5š‰j̤ùdr5»ÀUl­¦2g$·ïk;Ns§/ˆÅÒÚ[ˆ™¾œÕIzÊm‚S+ê9³”=Oέ¶Ýåt-ÚˆWîi~‘Þ(1Öx?2†Ç*H¬b=QÓe À ‡á¤'ºå«?âe› Q¶"Á¢È¶ ƒÔ¼=ïìaàùüI`¬rö ‘}ƒ35áý-”lÒ Ìä[ðœ¤kR)m$' Êvû7Ûí£à?œF?Ø×_|Ùõüd{þg_¿'ëgo¦íiE©ˆŽ´’–‰WrD¸OT…†mD?X1LSœKDÔ ‚óR Z])¨ÇP›úžA„ˆJÕñházFŸÄ+á“8F؈è"MÉ$ÐnK@D¦gÇÀwJÝ2®+^k¹îí!Eéý8ï;Ñ©ô×ð‰÷b¦Z&ëÐwÝ™õvzxÖ=û˃¿½6gL9N»ÑÇØ\°{»uã(.Šz¼ ¯Šc)%¢Þu*”(о;cXˆŽ^·ç›ÃW»ñpc|úÕ“úÃѾ.¨—Oöoß\v›uý¹ye/§Ýcu˜ú®¾x9¼õ›¡Ô7Wß(QÇ}è‡q¿±±ºûç¡!PCoE\Q}š¦pUímLjJ¥xQºúÐNG5¨ :XÉ ƒl)5ºZe"€P +¸Y¡]zJ&fLR¬®éL£—©D?IÓ C¥`bãRk¦ì rB–}¶<œ¬Áº)%""ÌNßbª vYVìÔz•F¨7(ŽÔ"VT YÐ#•m±¸(U¦› ÄÀÁ=:CL(}_c²Îrù°ÆÝeÁgÝY†°*j+b¦¦æóóMr‹JjÝÎ^ƒY"0Ñ"­ )€ÆCˆ8@»?æïã´æà¢´äz#ZÜ)€š”)*ç %Àuw!L• °Õ‡[ r“€Þ0› p>p¶'yø¢ö1K;³Õç Ÿ–6¹–:ORöä‘9-X&³š‚ @¥’JeÁ¤`“DCJ¸(ŒË¢œ‡‚fe‘UŽÆÐ…õ$€hK¢É²›¤D"µiikÊ/yƸŒsáÜÖUÑÉÜ[•º ¦HL ó*Ó+1/òÛ£H+ëDôz8i¤2W_tìW â0Â!ˆ_ÝNà€GÓ/ß¼.ÃñÝ·/ß–þ°-‡«·»Ã/%$9IöÝæ½Ëv5³g V G÷ÑÅ;ÓR¤#Òຠä6Ùr¡þƒ¢ºöË÷iI)Ê6;¹{¾+2-ÒPÀ‰‘Z•4UëÆã¡2´+Yª;‹(àf¬Óq§±Ö‰ã0Õ‘¬Nw´L8ˆEsGù.¿%nãíJHl’¯†a&wvZnFÈ ‹³ÆÄ˜H‡Ýx<°NUM34©S0Ôe¤z6V…3)DÚä>E¸"è»’fAž!%)L½&P3’œ©îEΤ²$›åëwÌyÒ÷Sm)ÏÖÙÓ(>œT .‰8~0ܹsMOWÿ=¥*.šAD‚†H@+Øú¡aš £ÑÂtÔ8™Z5‘æu:Ü’ ÎCß5åÕ÷ÆŒÊéùS'ïímɵ´¿X{k>·wIXíA¶¯®% ÔiʳsÅ—LkÈ[,eΨµ|ä:uœ¯o ¼z¯^²~×ú_¬#àÛ+ÖÞ˜×I.íþX°œäÉCkz‘9éÕ¾¹ôf¯‡å¼çåcÌt‡Õø} wÇù:r]ïSþºÎlÅòÊìϳ`ü‚Šî;ëô>øŽ_Íí£àkwãÔÕ)úî8Å!ÂkÝ Ó¸ip2{T},¤¢Í¬Ñ^lÓõ}éúþm)Ûêºcì' ‡ˆ©u#*!RÚmÒ ±M a!¥S=S݈–€ƒÎX 0cpvµ©„DŠF/42hGâ êb’ lGÙ”âÁ!±®¤âî‰Scf¦ÅvøÆ¡ú8ñx¨>MBµ13%—¥îºëátÃç¹’¢Ù+ÜæGN‹‚NÄ6¹ïÓ~wàÄ^ûãX&íI+HIKÔãáf8ìŒÁ‰Œ™IŒÀ …s,X ˆ  J"fED:ÀÍ‚NRBÔÐnÐH°†3j°z³Im>ÌÂÅ¥Àšó­`ž3³&'™C ˆ)8Ué,ó)S £ø‡WíªÚl gz -Y;Mç&@É#@„¢®ŒŠš”³ÎUÄD­QÂ#ROC„‡WU•EMyQ¶Êô±ÝÓ œÌ˜¥H¼td…8ÿÍŸUýX5m åÄk_ê½Iœq«ßzu¶¹~æ„©fs¡©T%ˆŠ̲©ŒH!ŽV$^£©¯€–-êLK†¯¥¤c‘–Œ9FNZÀü˜s»Ñò©‹…Ä•p¨¶g0kNÌlîåTÈ2ör4ž`O%z#TçbiuVO'lÑå”®Ës…ɵ0µP ܆ÃÜ"BÛ t¾G2 þ DJ²÷ÉY6+?É/Š\ß[7ü ÿªoì¶ØöÓÕ›îÑ%wG?q~.ÆÒ÷órUaJiÙX›"„ZúÍv{~~vvus<ë.ºMßÇt¬;Ý0‚¹øšÐ`!R(KëH'Ò«ŠPQ§ðêÎÕíHÎv7lañrt@/¥¥à(~Heã 7…{Ñ“ƒ :‘TßoN¢b®Y"3;ûã¡VD Î`/]QKXkuÄ€Àû  €»¾‰BÔHV‹ÓºN´ ÈX1 ÃxœèÞ‰Š«x¸•RT¡ÆÒÙá°›öÇ®§  (œÙ»Ì*CB&]@¨AÄEHÑÎJŠa‰ˆ+C4–×U :RTÙMì9‘¥u*™é dg¢uI(òÖôTÅ-g@(’>„@ÊÙ\è~púÑd·Ä “RJ+q+×í¬æ N“‹€x;(Ì5{†-ÈT·)ªfNÐý¥ ¯`U]¤S·Ò̘ï€UgÿßE:c6îýPœpžŠW¹|l1Ö}ãx*ý¬ƒE]òB$MêDÆJMefRX#îa;ŸâÚ÷4â6ß/Q/™}½Í®— Ê.¯Á*ä]‘Õ7’yDe1XçÔØüZÀŸ±&Ûš[…žFT¨v]£o;l›ÖrBÁ-N°<¡ùüá³KX粈0nÓµno²ÂØØ^"Æ»=Në×˽?6)¬€'øÃ§ÏÿÞïýýßùíß,W»?ùògÿÛŸüq¼Ì,׿€B4T@…ÂJR› Pú²=ïÏDíãlCUò&†¨„E7ÍGÒ)ª&®ió‘Jf'˜jø”¢´Èþx(²^Ùç ØC{µ ðI '&½¨MÇcí%i1Vëû¤™d“O¢¯ˆ†ýñxtw¦ÉÁÈÄ»ƒM‘3˜½ rÖ¤ÄíØÌºM/h£ðd³1Bº²Që‚âCÆñˆÉ;²S+ƒGQQ!3Ûï÷]¤b+ IDAT‡ÃÁ¬ÔÑÉ-1 Ùyê¡jtÐÑ>$¦ŒtU-ÍÚ²©éä‡nî^é$)3‘»u•*…I(tžvçŸy“¬¸A™ôx¡ ©MeA¬¥ýH Ô_¸¤'[oÉœ~/57ùùì=ÍîÌ4(b[ˆI¤öEZR *¡"ŠY®ºYæ;U…ÀŒ&&³àÚÌóšm íÙnáôí×ß¶\}—;ãy>§¾£9ò’h½g±@Z‚â虞¯"‚¬'Cž‚ÕÖœ Š'¿jÙíLuÊ{~p{Ó€u5"‰ÜË0™/{/ ÜæbM*"5¦æœ(1[(¦b%IÉYF†IK ™•´úíU–÷7€³È/|õ­NÊTÿzHh)Ó“Di@¨óMvÿ¦¨ lÛGÀœê¿ûÿíÿê?ÿOç·³Ûíÿ賿øÏþù?ÿâå¿ê±æèW-Yª¨f22¹;:ºŒ!SÈöñµÈT#¡J-ZUQÜ’o2÷â'Å@E[„EúD ŒˆzDMô¦·:ß D²u’Ô‘)p ÐItÔCĤfª—´W—ÝÃŽçã4Æè^ÃÔ̤fì@eSЯܾ2‡i8æõ8Ž*C-tŒs~³eG%!¨zJ…‹ˆH¶±š™”Öà)"¦JŠWz%U`ÐN]cÇýn÷FöãX-—ô>)tw3îŽĦ DÑÁi5„8µ³)BAÁ¬¾¤²¹(+¸5ÂÓO5åúƒd¬f)ÊpPˆBQ Ò_1—Û htfÈ­É´}}TJÆ&ó«óÙÂr~‚TÁ zw6H½å#‚Zë‚$ÍR¨!5•H¨–Ca$ *•TT‹ IË9½0ÒÂi ¨ëxyd³‹ ™±$¥E¡Qh•ÛñÍûðrÐ:™ïŽ ]"Q¼×†;Û-`~˜E3î¾¾ i¹J)fÊ™¿DÀ÷p^n2G~6É¿ÆZp4÷9_ÓõÞ´ºÙ”¨bYÎÊj\pî& ×9k­«ªý}ƒj~r>ùK-æ¥ð~< iÈœ ^~BäÎàüEVÁ²®m7RŸÄ”°î|…_°ç_íí£à'Ýæ?ùgÿìßÿ¿£ÀfSþá³óŸüÓÿàøË/?ûò+C8yª}È®³RB ƒ“Çn˜\ö´‚£Ç8LãAÃ{± w]*„Ñssw*‰©úHRÄœæXÛ}`Ù©O5×2ìUE:ÑŽÑ‹¨‡Çäfåáfû‰.ìùƒþòxüöí«Z§0Ñ®+SNÄb³Ÿ;ÉÉëq Üà½IWŒðÊêÄȱzdå/a¤üJ!çtç¨&03äÓ=¦:M”ݦX‘ãx¸Ù½»·º÷:…àÓ‚n8úqph_ã°)!•´š&+n3,Eë;e2†æ.S@ÄŠ©{q fМBp /tyh,P@©ñ•¾±®ñ`ùÖž²ÔA§„À²¯&f [Ÿ>¤ádVæØ> œÉwRÓjN¹GÍ„tFÉ4†‰úØ>ÅBr} S…áS4FƒöX¡c x 5@ïÜø0Ùê$б~¼Fß%ï¡Åz¶eóŒ_ÂÈvÎ=ydÍ„ŠL_ÜÈ$™C\Ä‚nµÞ Àue»Ð8%8ÐRÐ'>u4ÍÝGùIštåâ°tkA°¬¤–׋‰Ü¥ªºûRZcMbpû÷$¼ÜÆH®ÏB@œòË+—;s^W5ôÍKïoë°]p»aOIæurKUsËETÕðûïEÒ3Ø`Sôæ®Ðå=ÛòExg©ûql ðOÿ£ÿPGD˜ÿ£ôïý‹ÿæ¿Ûve oʧhŒƒˆÑML EtR¡s+1îŽf¢ê4— tƒI êk£XxÐÓö†Lî ’^cr´'è‚‚¦jR‰äã·dÖ|¯hf=3½X#-nrÙݹÜnž”óŸ•z¾=¿}ýîå0`ïÄKˆBl^á¦ËJ­uÇËκ4&ê:É®c§öä²m+ÿ{Nãé¶™ jó×eë("]_ÄdšÆýþfªƒ KŒ¡ µ*áB-29E Õà„˜‹Šhb €I% UÑ.Ô"áÎê¬*ú"ªpD„f5’²Ud=*åDfžÔÜÙL&csÅU¨Œ{È)KìÈÌfr–3616¬å´Dp‘|›¥F›h~*v¬×&Äz¹ˆ¨i)¡Ùï ŸÛ¼™ÔjÉê¡0Ó2ËS h§Vx76MÚêYЗì?¿ýóþ‹×™gœæÓ¿~F½s’9ÓÈ\£Ú4-v¼hkIuYˆWË;CnÑšpÍõåûpëbr_jD,¼|’hI²¤I¸R17ð$),/÷íª´Määi·z B(IÏö-Ò }_D8MÓ ÃT—s’‘›:àá£y¢¦i)“4rsÚø9ª@6EÍ£-?Oú¬FUÏäw("Á¤7Ó‚NÀ²[œ k4À Ó“€ìÆp_ŠoÁÙ®]nMëóp+¿ºÚ2>H̑Ɗq'Váû!µ4¾=s/ðYù6ö/¶Bó›Zí9Ýv fó\™ /tqE¶îX¤@UL­­J*\-;ˆNËézÎ¥ßÒlng­ÛÑïÙÞ?c:]Ë3*â-¬ Ãç’Œ#‚A&†x“=E±·ú…xû×Ó_OßñvÌ„L÷˜óà-ºzUÄ]ßÚ$uþ. ¶Êr~½åXlÞÃrŽÖÁkÄ{nÒHŽÞ˜q;âŒSøÞlÊíwßï¼à–Üû»å­Âð]Òh{ðãœ>çú×&Œ~e·€_ÿé‹?øpõõÏ~ïwcªûÿóþðù_ÿ÷ë·»snÒÀÜxr²TtpV{ÉzUªO+Jð’›Rk7±ÉZÉ×ìß\A¢ Ý£E7õ¼3Á¦³óR.·Û‡Û‹‡g¶ýæÓÏ|ò,möêÓ ½Ü\ ûýEüÖŸïUÿüÛ×cp FÂÇë:½<îkì\&¡§Ñ:Q´ˆKÔüì°1d?RÆý4yõªï‡±0ɵªš«ÚEAd^îkV€N£æhBëtªUMζ5‰:q¬îtÒ“RE\xÇcšVþ8ÞŒupLi Uˆ‘îÁ¨'»Ö`í£äMñ„@ Nä&?º·iœÑèÑhRÏE·D "Ê|Û7ÙÂDßÛkö;ÓÙû;00SœÖR«ˆÝæ˜Án0S¹2K?æ‡âÀX²»”[«¦ösÀ$œ J„0#tmÃX²~l"È¢ýœã1UsizUªª(fªè’ßfbZÒÛâô#*Ú*²z^x•eņÕ4=ÃÌ­¼¶ EOåN6_ˆ„ÓY"@P"R2ì®§Ö\žú€Ãïr¸¢u“ŸÕ²Ñ2«oG¶“‹gpòØ–‹¸Þ°zqàµÅV»ƒæîàVRå Û¨žYKõ‰2ó³¸~ôÅ3Q“™Ã%<5ì/— ]= ZYeªoIœ6½›ªXVKZûÎv7¥ü×móÉ>‡7¿Ü{u¶€»/n^þùgÿíýËßÿµ¨Ço?ÿµ;‹ §1²q3sí.^—*ˆ©³K’ÏiZUE 6߉ˆE& ¯5{üûÒIjËEPÄ6}ßu/íÁÙöÙãGß{úì{OŸ~çÑ“g——Û~óÓÞÞ¯?¿~yãøâÕ˯_Ø8ýèÓï_üý¿'gÛcÔ›ÊIÑ©!S×»ƒˆP”€¥‹A:˜Rhµ±ò0TÖã8D­±ß¯7»íEgÖXDzZ‹“dœLîH!Úšš2nJÓ{Jt}_}a_¢S‘Lc§Z ™X‹–JŽ^G¯•A8ãnˆÁ5h"E¢%Ü,*’•6‰à‰Æ}DTQŠQ4„Œð†/!9!:„"N¨vœ[^”‚lºÌ<¢HÉxˆ9ÁXc pŽf–Ôâ`¾3ºx‘9ÄI¾ƒ¾§7ä—‹PS§e‰‰ZÐ?+X-€fÌ çI)›þÄ,-o(AHH¨P–*Ù­¥”N;"¨ ›#àUMYr˜6GKi¢”K¹wy°žú×sôŒ¾÷ùì#àlÚ,R Iõ —ˆ”TJ@çýœØ~ú+gŽUë.W`é-p‘j–Ù;cg´ñ9ÃÏmô]=ƒÕ¯ò$Ÿd¬Ñ®Û’XZ¶yMÙdY*(P“åO2Ó•gm˜8a2ö£U;‹áVÌ*Ë2è=Ùµõ^Éùñz uÊ߼ߒÉm>Ð’£¶_üú_Éí£à³o®ò³î;þóŸüe‰úlóøë¯¾}ðð“q@`á¸dh›ï;ž‰²š´ŒÏ<ˆl6[wŸ¦ÉݽּõAöµqUú¾ðàÁóçÏ?ùä“G={x¶¹8ß>yØ=8;ö|[?w‡úîåëý‹/>ÿü³ºÛõ»¡¼ºúíg?øÇÏþΛáðn®§:¨Ö}Š”hE _)Ù×»Ìó#cˆWN£Oã8Lu¹ß}€J¯æQŸYËÕâ(-$ŽŒ€ÕD ª…PWPe³ÙLÓ¤[a×Fqç8†;)pwE„xHTÖ“ˆX)zðÞqRTzÕ¾”±GQìLT…UUK Âe%% „5£§  ¬Ñ²dr·ÅA¨iQzÌ @KZêH³91D¥•soO©K·Œ¥õ¤w863qt ûÖ3ˆHÌ3ok3Ë-‹« ·yþÓ’ ^%ÃUuS:Yz ˆh : "Jâ´BèmÈÒú¸¬ˆUÕäa‰Ð i®`¢ vjQSË„Nz:dœßT%©hNsw^^Íÿk i-¹¹à©œ;t³×ÍŽKùVJÙ‘ïšóǾdŽï¢/IÌjSw§7`…·Ûx¸ä&æÅPË\/7ÈrY0iª,«¯kRZF‚ºTmEBrDž>jŽ­¶Ä—Ôz4iÝîÔÙ2¸»ÿÓuøp.ú— @ÿ¿ RçÜP'§LÀGµ}t¬¯¾<¯Ã›W×òÐJ•áj×…o®aÙòI3è‚tÔ•í6æÉ=u®˜ qëýÇ)fSíûÍùùyß÷K·=;{ðøÑÓçÏ?{úèé“ËG·Ûíñi¦ñåÍþ›7_}ùÍ‹/¿ýêå»Wûãî÷~ÖãåÍõ~ªçgö£O?ýÝßù­ïÿø{öå—_¾½ÚMI°ÖÑ«†G„t)ƒ˜œŒˆÌ:OwšTaÐ#¦ˆZªZÔ ÄØÔÞ‹ SªðŠRš`º`H³=my­œQBa"©F¡R6Ý4 uS&¢DÀ+k„SÌ]èÚ‰™Q0Ô)àgç[©C/®/*¥ÓRL 5\M{’tswº«â€Ù¾«„²åÅ™•oætɈ–Xâ 6“$Î%'U[®=ƒ¸6 —™r™Tt©RÝÆ3\q }sì &¢‹ap빕ÈU)*fF åGU:U­!ŠxHÓ=(¦d&¢˜Z±bRDÑÎË„ß|³£9«¿I¶O=–\Äe$¬‹Vþ˜GÂÝè¾ð÷ôÌ z“gŽXê¾!ápR|Š@„F8#éP5V}ºw"à9~Oñê½_çãæg 2m6›æVj¥‘ž],é”ݸòi)¡ÄĹô—µw9h‰È[m¦«ÍCPWgÏ!*ŒÖ³ÎôúU‚ê„dËÕ9[Ü·ë«¶Ÿ 1buoÕ’ïÕë1°îÞ4V™5”%dÿ¸0ø£`?|ûôÑöó—/äâiëÛ7WÏ?ýäÝpƒ:O”¤ bnƒ-s¬ˆ0Ee’åºDëÀápìûþü|»ÝnÏÎÎ>|øøñã‹‹‹¿ý›¿¶9Ûn.Îí|SÁ·û›¿¸úêæ«ÝOÿô›áæ¸ÿözÿíßîºazý¡Ùwߎ›‹sûîãi+Ý“ßý7~ôø‡ßý y÷ýéO>{ñíat¨ ÷`˜Â<Ûl ¦©Çì:©@@S¦„€G­œFŽ¥ ÄJ)½Y—?=Ðcšèë’]ŒÕ‚Ûw/îàié»ZG º" OÓT+ê!Å[( ï{QLÓ›Íf?ŽupN];Åà ÇéXÐÃK‚¦!æätT£ sž¢¥P„F8Ni? h@¡2ù4Ì +ÍX’¾Ó|/Tœdx¹}q—óp'Â;=hþw·%2^#–ˆ(ÔžyŬ±ˆ¬O·»>ô¢z8æ%€Ö¨‚€†hˆH¨:@jÞØ:‡¹jÒÚdn×[Ê9UÒD‹šjöYK Šˆ6u­V$Î$÷ú ¬!v'X?s§†º®:ço$‰¾ÊN÷\g!ÂS×Ùg'†{8n°{«+¼–&âh? IO“GˆX2% #n †œ°3šÒ\ýmeáìQfD¶‡Å\T^T³¸ÚÙ2ræ ›'´cjša¾½c•ª½„ËÚè„ÇäœöyoytçN˜wnö;+­;’õùþ?„Ò탡ÉšÉXÿ#ƒß€_½ùüë—_ôOŸŒÆ}}ôèÑÅÅÅÅÅÅÇÏÏϯ| }óêúÕáåîê«Wß~õêÛ·WïÿôºXµ­—KÙ<Þœ?¾Øžo¶Wÿø¬lÎ>}þü“ϺîÁåùÍþúÏÿò'?ùì‹7¯¯ØÓ63Ù«C5ˆŠšÍÚsdÀ+Q’U–´:…OáÓ±ãPkp„Ã>øn·ë72맯säžÄY{Íœ€”´E°it’ÅÀT«O „rêÅœbª©ˆÔZS£àfØíê!")…<¦Aª:4Úœ>ƒ  F…‘¥ÍPÈŠSy·õ©¨>JQf+æøÃÁ Ê‘ÚQ·ê^§ ¼»9ýºÊ㜧6Œu!És[O…<*+äoïõêÑ.œ«*¬>Ûܲ¤.j­Ï¸é!¨)@á*s˜ &VJ1È)ü ]áUgðÝ1p}ï<(q€R¢ýê¾Sæ(v —„7YP'Ý]Ö€ºØýzÍäóIrÒHZÔ=pã¢E’6""×ÛÑS›«/óÞÖž^úÅsytúó"aÆYÔ.×|:Q-o$ñ‹‘hÎÉ °%ü•†Ò·€ðÎm»¾.ï_µÛ‹ªÓàÇ}òüÓ§Ïž=Ùžm^œ×pª¼<ÿô/¾üâů_¿üö³7µVs \4DÔ±r@`Ê"”U-,e#¦ CY%*é(*gg›~(xuýîÙ£‡:N”ºÝvÃþêìüÒúnò:PÜ:¢cö¹†”Òl‡B‚ÄX둨bZÃCõèN+Çb“–Òu‡ëé²ßâ¸ï|è8ì»§¬^l{V¶qèÆlû>pmÓÙ£íæzw¬èL{†oRÌÝ»:…qèL­W 'DeíÆ¨U4Љ6'çD°„k0¨(¥¢Ùæ@x©=Q5* h„x%©Vú¾[üesÏE HÀ,„ôè;Cª_…¤vW…Q¤9(H¤§ÐDÒ:”’Ä¥€¬`@{ &‹PÕB#‹Cœ¹TÈŠ€hjÎÁN5)ªjH»Ÿ*Ý ®†¶=*<¼[È8Ütõ;ηÄ>Ê#7ü•Ç#ë*ÑÄ“TÄ`E`NYUSí²ÔÞVCs>?f0Sx¬M¨q1™ébP”éOE$\-¨ ²z—XL鱈ðââ±6¿œßUáÚš˜IFH„FèŽHwzdC²$¯hì&(…ÈhÊðËa$h*Žf AQ΀!uÚ°g»J0ŠÖ ÜaR 5”‰YH\ÜmrŠš0ÓÔ,‚B Ý<ˆ’lÛ]hžQ²‰ÆÒ9)ðÑ×¢(Ëz ´©>™f3å ‹càÌ—o¹y™JUÙhô 1HVÕI´òTcj ƒَ• Ø¥Wx®éðÖ:•$¸²ô%K[kÞçyø¡<ö¯ÀöÑ0«3j”îʨ¤Õg…‘ {EÄÌõ€2êÀ-ìº-ö‡n¾÷OnϧÝîêõ›®’¢;ßÕòææÝá³/ÿäÿyyóöí´{ÇãÁ'­E&·]-#7Q\\|òìñÙåÅö?~þɳçÏŸ>~öøâòÜÌjL»›ãÕ›w_|ñí×_¿úöÕ›««««›wÇãq˜bfwaÃÍü«÷¼HÆ+SW€1zl‚NŠ Ná]¢cZ/ðeލÌÌÃKµˆ–´{ŤuŽvÅò¼Éc¬Äa†iš|rVGÌž»×Zl·[¯)eàA­Lu† ‚ µ1ËUœ4Ué6Ëö‡V9UÐ*&–þÀJ œÁ6ógÅ/y3p$‰(ý˜9Ãd²“Àâdä A8™6Ì(m§É"I`±¦R‚—d/Öþ ŠÂ[Ü|—2OªÙ¢h¸¨Ûb­ê¬PÕ–å„@ E &"V (ÍrC’x–;43šÍ~"+b3>PêËÅê‘'À=½ž·Þ› öö–¦áœaß­¾ù%Eùôù壇ç—]×uÚ•ˆ8 Ç/¾üêÛo¿yõæõËW»ëë›×o®¯¯wÓX+[Õ9§žÆÑÌC¦À‡r=EÐe;¿G“Ók B)¢ „Ó"W±Ü3ùn‘fõšóÒ2À33ÓMʾ3Séû^Dº®;z焆ã0C* ÕGeªˆ»ÓHòüâ^»ˆYZ§&ˆFdßgÞòÅ!5<`ìU˜H©„Kwèô°æp'„I¦iiÙ0Õ-T´jèXÝH„@†¾S )h3…®g#‘V’ %yM¤„"Òˆ“P‰%}žCYt¬­ÀÊc˜jø IDATÄ€\îè‚N€Ìv2h“ÒŠYXUMUMÌ$fÝtEB6Š (LRlÚµº–Dx`f~éŒåe.ôfºˆšè:øà­¬c›X›ÙÏí\#9Óšç_F8÷õ¶~\Ì|Š€IÖf/ØZpÙ’Ãøúe§\tFÒ nÚAº#æð:+»žEåç.&Óõè´w ªHîvž3Ò¡ë¹kÎyFfá3¬qæXܹIOѤ0CÃüÏfh\èÖ­4Š´2™mŒ.z‘Ëq—™o9X{»¬_p€Oïʲ‹ÎôÀ NLaH&îÝî¬îl÷f¿?ªí£àœä$nÖZnÂ=rùßõ¥ïûóóóívû©Èå£Çž??{úøüù³ËgϺ‡¬ôøü/ßM7ZýÁÙ™»_½»úÓŸ_]]í÷ûýø‡ßýþ§?þÁŸòÉÕÍßýòÅΧjäÅåÙ“'¶Î]|ôºÇãÕÕÛ7W/_¿zóæÝÛ7ï^¾yýîÝõ~œ¼²Væ„ky3«åíÆYC¸¥tî”ßV߸ˆ˜ªf­,Hg|ô©ÒkÑN^‡ih2zlѺe¢¾ˆ@NP$"Ò|u,ï®"ؘÐ6ɮۘmT Å´+ÃXÕµ§uŤ㨆ˆ:MÓäÞ÷ý0ÞDu!H_š]g©eI;8†PŒTHöé2H w‘”ä GD[‹<»Ê’rº0ˆ2œmÎQ³g¤Rs‘“Š–·†Ü]ªGM‚5„Šôm­-@»&áe¤'Óbä€! 5H- Ó•4¡© wrw¸Õ@"y%Ø~UUMSFÙ­c-w‘v[¹¤0!"4œ¤Â#õut² oQKô]Bë€xùwñ—õ)º3Ï&¬.Ï3×.lI”¹X{i™¤€—eè|ˆ9¢#`’Áì =‡É,rÂ25P\âñYl‰:q÷1n—>ÿ”ó½xæ›4›—½ÚXt.Ó¶¤,M)´BÊLùÒ–¡ÎäAÉ_O‡¾=lÖƒD–^»}ñð~ØO>²zÀ#¦¨†æC×÷ýã'Ÿ?úüùógÏž>zôè;.»³­ *oÃçׯ_üü/^_¿;ÿÉ_ýæý7>ý^=L?ßÿì͸9í{ÄÁ§ocüüæÝþÕŸ?~üðûë?þÍ_ÿä“çÿÎo|Çq¨2Tÿöúêë—/_¾~»{ñúp8¼yw}}}3NQ¯œ¦Î…Õ›&/!Ôœ2Z­©Ö¾—êY&м]ÓP·2†:ùq OwaÚ=µPûÒe=+˜“!@䨙H¨šJ(I…ôÅ^º>"´Ø–½ª*!¥ìއq;)ÝÙ¦DZNƒ:B0¹ÓÓÃ8L^#¼ºUÓã0$U«`Ú¤Š˜ªÃE$HdxÙ [aˆtMŽV¡œõ‚„AO•àÓ ÙL&´€á­ŸŒ÷Ä÷ø)yÎ=ÑÇ ³HY Dö-ùµ¶ȶ©V^%åM”©.™G‘Û‡æÌˆá<ãËêOyL¬Ì¯%.BÕtµŠÄ‘]EKBU£R-¥.ôû€+ßeP­GVŸóvþó o˜"bžÁß³émžs<|à†’r‹AÝÎÉL„^˜soqëÂϤ7½-–S‡Dî¹ð¼>áï/&–'ÉS^`ù0}û®\Ÿ¨vºfÂÔ-O%ÚÈP¦õ|ŠÓ‹Y¤õdkªoŸ.Àéä%WÕXÑïE$YÜw޹ºšwX$“@ëCn…i™¤Gøœ©^ÚçäöžOüÄÞƒ¸òñå¢?>>F§”`à>ko7[.\|ï‡ßûñ¯ýèÙ³'›M÷îqܯ¿þöõ7¯_¾øæÍ‹Wûë:þÉïþ¿û뿾Ýlþè_ýñŸýÕO¿=\ï;½Â0’×ǽM‡Í¡œïv/v»Ÿ~ýõÅÅÅ'ߥYÇÐÝÁ_¿¹yõêúíÕþ8Ô~„3¦Ñ§éÿeïÍb%˲밵÷9÷FÄ{/ç¬yèªî.6%š©‰ƒMP´dÊ x<}ÐÌÿQú0K¶d[†B$òeAþ‘D€“ H&(@¦-K°HÓnP"›ìêf»ºº««*+³rxSDÜ{ö^þØçܸñÞË"í?wöAæCÄ;ßsÏ:{ïµ× "P££!®@×ǰ˜#Ž[ÚT´Æ·fÝ+¯W8Štð ·âÜKÉ©[ôRï¢ÎdÅ5…ècÞ§šÜ#RD­ºët­ŠUÞ%±±R§T7zIè×§çëõÍ`ÎY­`ÇØ)eGMÉ IY2’ABGÝ"L%"ÆK…»ºj”*‘¨BnETk i˜•Eªeƒ©ã]Ï]J”(ÿ ¹*É!4»€.q+4‡µ)X( 9 "‰tq…478X3§ûV…$*wWHÔ‹®¥q/<Á:ž7®ß›+ÂB‡0¦XªáK £©0 nÎbÞÐN•ªš tb‚#g…‡¶FؾŠ=”½0ˆ_âó_wèXQsÏeMŠ»¹W×t”õmທVd>é#ÝèÄ®¶Ñ„ˆu+zæçòÍqœVù Ý;y‡Õ€£?Ôwg|ñº&Á^5Äz”¹î/=ÊXŒÊuóì)4”¸&2R⨴þK/ûîpoÉîÙU¡¯]Ù¥ý /[Àu:å#µ÷Ÿ Y}ÎÃUäm6{à²U€Öͧxiµg¤=sl‰è‘û ƒ°+’’(¡Ú¾<:¼vûæÁÃm?üÚ½ÓÓã/ß»z|2œœq=èPSÿé—^ùÔk¯ï~‹ñ‹_úÕßüÂ{~PT\µ€ýâú0¬Ëù8H±ìɃÇJ¼½Úôý2i·ýü|¶H9ç>ÑœU•$4©ªÓ)%§¤šRfQÀJ)ƒ™Võ‘ÕpËÑœ&¼ó&"#û`<&C±°o5u¹_šQþȇ3hZX%õˆ⪠‹è¨Ìœs5Jå4À“‚^Tµ”â‚N=ÑÔ=A¶ëa\—®ëIJ€¡eÜq+}¿4QI&E±‰/IL6¥Ê_„QzvAöºn…C*ÅEH­†¨À K"&pÄüÝ¡Ä`Q÷HÅÄ•’Ô‰âžfvj´¸lí@G0‚¥¥`Ñ4"¾átƒÇã’œr-„¢@¤LÁ3@:˜DcZqxÌb€jÎG+ì­Qm"L§Ðž®é¾d'Ò%¸V«!kê›»’5QxÒ 2턾sœºàPM¬äƒ¶rõÐ63±Õ¹æŒŽ´3jY9Öö8:¥¹Î,à°b®ë<¡­»­°Å×)Q]!ã;¥ mÅÍL*vSÞv›3x«ÓP3“ÐLúøÉ|jm°Žæ3”û­õ¦ }ƒ_%Ú|²®FA¤ß‹RÔ¡Nuª¦ä&š8ÝvÌ$Çw¹ËW¶Þº­y)Üžª8CYÕ\pTH(SºˆX-J±»{¼[ŸáEŸ|›Ϻô3Øž9΋~±Z¬–5pa²H£ºç¦ d¤>ùèÑÇ_úÒß{ï½¶‡«R®wÝÁá =Ðå²ýÍ×?÷íßþ`}òµwÞýÂ~ýÉÙÉâèÀÖ›2Ž}ß›q¡½ö½Û8œmžœ­—H«¾;[wîƒÙÚ½R|A öªê¤n6B3Bt9ëÜl=ê:¨.û,èŽÇóè«¡a ¹èvÆþëç4÷â,Fu ýdG+Å‹›¹mËX\%AWФbfZé:Í·Ä›Yb¨œ‚Q• ˜$»HŒ²èPÌ Å¡èÌFiB†,¥L}·.C†ñ¡”¨_ (,9iâêU´€Óq×@IW¨GÍr’baEA÷\ëÙÕÜ„Û1ôŽ`1B“F!CQ€æœÆN£$Ì \ݱ¨6ÃL'AÁ ÕÌñè"LÆÜp{”§®¯?Œý“3aËp{O¦ ¦Bíá4#²Ï9 SØ?„Y´‡¯'ˆŒûW£²;ßÆÌ¥<Ã’ ?&›I÷ªî®vË&XÑ8vzæU®·ÅÚÌæ‚Ìš¿[Ûl:í×­ð4 xÀ>°LìîsnÓ…@ãöä«[;‚3 ‰Nnv-»=ìrßEdg(ëÜ)XÕ@AÀ 2—¨CXó–(nuªÉjbVë´ö­&Ì7=ÇÖý®v}?€ça`™žctÂDÚtL‘4Ý©Z»iW–C/8öw¾ª¿=ƒí™àã×o¼ùëw~+éÚÑÑ ÃÃÓÃtpžÇlçãvsvòp9†íjå¦ë²M¢*ËC0ptwŒYû”ÉÑG‡«(œãvÐLÕ æ ÌàfÛƒ®K@䜙8ŽcÙ¬;öÇÓ!éx†ñz ÜlWYjjŒ‹ WY*Î’A@EÉÈâ@J½¨EƳþpy>†é¯Ú/M];ëV"]_<­ŽVêggë«Ã»bÅ–G>Ø ô¥vÛããÕQ:Hr|~vçÎs²-ÓA'nÛ”Êh§¥”®Ë* ‡$IšG`=º•“‚•žÌ¶Fˆ¨³ï»¾[Ð}Ø+EÕ»N Ò¤S*Q†ÐóÖ£œQ¦‹Ô,UFp¦Õ‡ H* PR•ÔÁ2•jT˜À³š•¤ÊÐÅ é¦`'‘]Jè³#™ÙXŠ ’H‡q£9§Ü› Ìé®ð…H—¼”"&¹SÑ+([ÀÒB՘̲‹ÐŠÂ:+t.t[|@—ÙužÅ hƒž‹çÉØ!o±Xv™Û®×­«:ŸððMt˜ª=‚{-2â/(áziÓÁÚË Ö+8èß͇©]GªñçÕ§[΃M;™ðÙÝ[íBÐzA«ª¬|;u ²e”TÄÖh,*º¸¸ LAˆ¸ÂD¨»â+œfœ,{2ÕÓ%͉eÐŒD±zÊtzMñ’™D!½ˆ0nE\EU=ÉeeÌ”NÕƒråÞT†pr©JQלSÜRDT$rÛ ¡š#)0X”npwíqQÓ—\Ó‚>M* Z?Œ t㈻×9t ǸVJ½‰"]Ž G#lZˆšiÌ/ÚóÏ]êÌ@‘í.ö‚¯x„{žä0öåj¾ŸêgnÒ’$Üv ¿lù»sÈlë]}ÜFÆ¡D¦ðLÌç óiÄ®4$Þï2mdÖg~Û&"¬•“ŠOíY Ú?i?„±ˆÉˆ}ˆì¬ÛßY›?ÁùUL}`ZغÄS÷ß^¥ÙžÂÀúÄÝ|s¶g€¯½ú“³ãñô„&v2,†ì¼¶ìŠ–uÙØp¿{tãÚ̓W^ûÌ«o¼õæ­×V«U×uãhggg?~üo|ãÞ½{_»÷Ññññ°-)¥”’Yx(ãÅŽ2¯1ŠU¾¸§ì8ué[ÉïoÎ~àöïZùë·}üèüñxOŠ#‡s×<,êúá¼0 ’ŒE*5-¸ÞSËBO)jf>Š%wwŠ›ƒG7ºˆ;Õ­”Ò•ðI‘„ÈÌ”àdPGRÉ)õ€ä´à(BMÝRºe×÷›íëóox) orKrrW‘>/œâsXT””²@T­Žn‘fR‰J.º„G½`B´GbÎ=ªa ºfÈúWÛD«ÄqŒ£pV¦VîácÞ§Lkg h%¨¾ —e@ÁêôZ mê—0qá§tÓ¶seÎ}¸ƒc. ª ¢BŸ WU=„HÉ\Gm÷`-«ª$õa‰ÂhÀ ¢)¥R¦~Ã(â;=Íyk½¤¤&E¹[DKê›nI·qœZM=ÚAc|.xs€§º¿Óžmßžó˜îþÎs“«Žë-ýºá”7rÀEžŸÃîÃlµù¯í3. ôüWiš†¦¶ã0èÃ[pÑq\el•MØž¸‰¬ïNÓʸ¢µ'?§_û<ïЗ;­Ê«MŒ¸(i1àšTt ZO—ñ-~&šö'›ó¾°gòj±<¶5L¨ ¹?=[¯‡ííE¾~ýÚ°>{üäã<üè£ÇǧëóíÙÙùùÙæÔ†a4¨PÔèNHU¥Yc9FÓ^ž6Æçrz²8Â÷êõéµÏüFwÒ½øÊÛ¿ò…œ189Мî­V—Æš¬|á­Žbùð" mûT¬¸¹ÒœC±p‰%ŠÒQŠÑ‹ ³BRµ&zT !š’vnèS ¨)'írî×gç}/Ûa=Ž£[9è{dx1˜Ý2]rB)2 (£¸ hATў܈[µ‹D$¥ô STUr Á]—½FSUE‘ZäO4f$SRM£Ç`¤y›ÆGÕç=»oÞ2©¡\‘ОMhåˆÚpù‘e†¾‚F…Œqg§‘+8ת¨ 5É`Z'ÑÑ)³œOUßôtU„Z$É]—$EZ!"%ÌÇ’D\&.ˆHt˜MæZbÜ¥éó|­ìî±m‹çh‡ß·%53xÀÜ[™3¦t=hÖ)þØâçSNQÛì2Žº;<¡*¯PÐpý’í>ßÜ›ez €wðɹÇ>P]x[/4‘Vî¹~ ™‹ýY©ïÕ<=ŽÝ4QHj}Ê 7u¼¯¼x¸O4ÐyUNã…k™a*ž¶§Ù݈~ÕNÕ«Fú|'—æßüí™àǾòp¹X±wäƒÃC”Ž õœ®];t÷”d³¾ñþ‡'gÇËåòÁßXŸoŸ<9>99+#‰ÒC-%×^i:ØDþZ©Ôéì̬=6i>ýâ-;>¾+éÞoüæ?ûƒä#¼ý\¯¡"Ô6áY›v"3Ñÿ¥ãbPªOYÿ!ËWh°1ø¢6š™z’Ĥ’H†šAþ‡&„½ÛŒë.@híÐîžs¶±$HÖ®ÓLš¸iÊ8 ½NÐ5§SÆq\¸§ÔMW¤ªP¥a Ïj &‘f諚¥š ÁH¾UuohGb?YVÓáÝ]Ÿ[нÀR•€ê03e™Å @gåktšEP‚Dú°ÐòV/Jë6µ#Õg­ ¥jAp,Óšš„*Òl¡‰D)%îYŸ3à¥y4C|8šWˆŠ]Õ…‚ù»CåéλbëõÆNË'Ë ›Ñb±3Hž¤9b‚|šà0¥ü¶ýb›ä 1‘§êg…UÕ ±7?è…]³%à)̆óû6u› Øú”kT¡r¼DC{„\Õ²+°6m‡ûQ§_w"¼²; |6‘¾Øæˆ¸7ž\5˜füOkNò›5 ûÿ¡=süÞG¦®ËžéZ’l5%(ºUVíIÇñôlsrrâ_+Î2lÖf4£×k"ň±˜¨æ)ƒH¢ÆŒIXwã?ƒÁ¢W÷×zúh{øÙî~î­þ³Ï¯§]S-Í ©Þ×äP$Öì Ú¦ÏÅ Ú ‰Ù¢­®K ”š;X¨fRŒÅ9Z³JMÕLZQXÌ|0‰t³Ñ`/6ä$fE…½¦¾Ë(£¦ÈrLëqTYž—uUª;Jl…X¤Núì]òqu‹Lè.ǨšIZˆPe¤U0¨Šá¨´jqºLž<ŠÓSËÿ”&JPÇèVáGæ.hìt'&ð‹%(¥eb€‘®jöº„’‘"<Òm·™Œ¡4½…ò”QKYTªB³>‰´ÖaN]€¡ÑhLY‚ââ¼5 Ÿ„*•0<3ÔE×¥”„RÌà§6“…!®¢5¦{áz/Œ•sÈiê‰1xÙÅ,æjHOÅò²\Äv0öÂꬫ º•;¼ ™Ž[›A4là*)iŒü$¬ù×iƽO.ZÀóÛ5¿?ÚÛ.Eu:ôp:çqáK­’NB¥ p´Lôø{ü—]ÐWbä•×ra@¸|SO»ûüDÅÊoâöÌð»ï¾³X-“g3ŽêEÆ>w¶Ýž­ÏRÊ4”m)¥x͇2–~µ¨CCózÕ]ÛQ$#Œf^KçÆ5<Ÿ;‘£XêmòÂk÷î½û¿Ø‡'_}í…ðËÿש,d±à°å¤ìª\œ.d¾+U­*?í§é5¡ÊL]2…‘ó‚T îj…VÄ3E3µ+ÅÜÆe鼌¶o¨8ÖÔ$ˆ² JKáè^ÈR U wU,TW]¶2欴_œo­Ë²7¦]ÏL÷RŠEÌ;Qï3U\@ŒJ!Fˆ¤,†âU?ÙéP•‘ÁÆŒs0x•6‹ § ÀJœ.-ð×^~¡\‡Y)SmƒE(;ï ©i®3ªÕrÔ¤Þø¬0'àÛasŒÃ"ÁÓÊ´‚WJ€¨{hH’'È¢@ ª¤ê‰Üùú ;EÂeî`ÐæX»~N²ŽÊB3óba´ë2ë0“Ý÷M * 2ÉÎ(Ü3€p Ò."ëþð:î{/¹ ¥:œ/`§[#ÓUŒæ<¾äÜŽ­Œ‘’tñ×äébQXà îRsŒö^¢½Kã iç¯á%Þ“Äš |¶ÉeÜQØH’*ç¡瓱ë`Bt§¶!¢“4$‹>¿³\«/úDÖ_/.¾¢ÍÝòÓ…ÏãéÒ.·°ïç+DgŸFNΗ?{í™à·ß~{½9ït1¸œú8 ÃAê†GÇçºt(R*Ñå‹ÀÙzܑȑGh×-§ç•5Ï %»S5:“Iþ“)¼3·}c8{üäÉÛ/~ùøÃôáV¾ø[§Àñb<"v‡ ¯ª´@ÃvýøRïeC öhÌΨ‡F²§dØg‚l6XñZ¦w¢ÞD©¥Ù™O_ sÒ£SSÈIq‘t™½ä¼ 9£QéJʶtg18Ä[ñ£YEÄs—úNŽ×C\nR]I¡'³MÊ $Âjj5=ª)fFn5ïWc ³SÔ >‘"†(£4V³ê¾å—¬µs< ÷–—£³¼)ð*!WÒRÂó Ðáp•\¹ÐBªÌXZ;ž3š&Ñ4Ø‘µªɬjáЭOV'‘¬œ2™Š•RŠ) á)í"v 1vpa ”KCçE>ëosX¹ë 7²ÉU.h:ª7":6ÜÝ\ÜÌ€çGn?YÀûSxßѽûUœ¾‡8%j ‹Cô_øú;qžÎW›®÷ sòÑÜîî“êY„,.ì<¿X¹ˆSᇫ“€?ù®ü ³1ç ßÝÙî«\qf?íˆÏT{æøƒ·ï?y´Ý”ÓEß§ÑWHçÃÙâ=î<Î¥,NŽzŽoWãÝåjõ!¾¾ 0ç)»/m;F±€ú94ïq(â¨NN‰*¤ëeÓiõa¢eÈùÙiñëtË Å0(·2*f¯Á9d7 O9F%¨*iã8š±ï’ðA 91ž¬EvQKTC'¹sU çÛÍÙètïKé—èz(6gɆEÎJlŠ­V½*ì|=Úñr¹\¯×]·8/E†áÚ2me³ñSÙÞÂB´ƒÑÝŠBr>;Ë'eÌ׻ðõWÞ|ðуÓñ¼œ<¦cq-%M[/yuðd³¹)Ø&–ÒuyÜÛ‘]·tOgç´ž‘W¬žÕ…P§lGAVd2#Qtëepr´.w¤øWˆÔRMšjHÕ<Š'Çž*)[ ’5c~•ÝEdÄ‚t/š—`ƒW|Œ\#ÒȤsDŠC`Ñsñ1‹u9CÅ<óÜ÷‚Æ·» ^ B$H¤ep #-w¥óÔ•ìô’¶ìŒ\$.| *R§HÊäÅGQïS’m/’•¨ÓÔM%Zú^ò“,Pd.OCñ°sãBw¢ÏFpVéd—|ª>cDs÷¯H Lo˜ê¤’ËvÚvß=YØðH†s’4ñ&!¨J$ Ÿä¥1ø€Xu›NBÏÒÝfáÙØ!hXÆ‹¡j…MoK@C©Wêd“ÍàÍ宄Tïݽ”R_p¤Ž>¡".ÕQat£tsæZ8à «S‘KU,Dj‚ÈÊ«³­ˆhJŽäY]Uµ1K¤ŽXDñQEªR,É(•˜ÝcMÜŠáË.¢i'uòÒžtLÇÍÆ‰£Crã IDAT·ù¢J’Z¼$:Éά-MPN$ŠpJíNŒ»H퓤+pX„à1š]Ö²þfhÏ›íx>ŒeðÂT\‘†2:€#|,륦ۧ§–vðvM¾~ýºœ÷€2‰™˜D9ö^Ò¶uצ»,—øþ óÄù£‹ûঠi Rð¯X£¿{’”K,è`k0² BB—¨õê´¶šH’jý"+ñ¦Dº(i¿;73+ÅJ)WÍ9÷#·€ jáØ^6Ϩ$K 6Ç‚£Õ ÛO½ñ굃]êßúì§¿þÕw¿øÅ·Ç$‹±”2 Ã0 fÖEM½jtFÜ/O¨´ÕµÝcà’àÖÚdʼn{9“{¾²§Î®“¦àv³úgA’%ŒþÉ–Q M¦vêÛÓ¡âEÀ®ÄMmÚ°š#Öt§JÕRÊlSQ¨SfJXÕÔ™„ š&íT›å*˜€ÍaòZ¿jT@sS ”"¥DfÛæ²Ó¼œ¦‘¡‚U›ö¨7œ¹Uç «cU k'9Yë^‘§ ÀÜÂJÛ=úšVdma«ÜóÓ˜ŸÏü˜.äÊg>í§}Þë3ó`¶äÂ.Ùb<õ´'Ϊ%âµgÌXWóÚÓÞiÏ—TãñÊ+¨ë~vôš(Ž3¼´&bÄwË?Ù쬑—KÖð…u.Þ´ùy¶u8#ñ‘ü +Ú3À4pdxC*¤×ô¹{¾îûk¯Þø£Û×Ζۇ'§ÿpsrç\ï)T”š)‰¶=TMbuòXrB_Ä ÚÚ…÷íÂò u€ƒƒÓÉÎJ0ž\io/ Âå+:ŽãÜŸƒö’˜FÒA‚ %S2è’D…›¬)È8p–RhE”šsêRi?¨#o)EerN)%•œs)Q7M¥=Ñ•®PŠH‚&­r?$%a³>[.ºoëÓ7nÜ‚ùááµíúøÞG‡åѨ’#.7Žãf³ñ±Hå0‡š‚¦fo ½³\H‹ÄHŠ;,îxˆU >E~Î¥ÁwºámÀô5«ˆ0‰•I^‹ $eÈÅH‡¨GSíàL"Ök¾6‘è.Nó³9 L²ÒÎ0Z}~Á˜°âƒÖ&ˆ{HhKÔ†WÁ¦y·j÷jš5Zß$ Úí=f«óÔ5ÌMÐ+›oµO>Ç4mªo]½õqÔ6Á ‰,¸JRh|uÛ½5qç…_çP{%6ÏÝC_<%@Ì”\Ÿ‰öÌp–Ü3¨H& bÅ|£ëWÿ©Ï}æû¯?÷oýžß†³¯Ÿ<þ¿ôþλïÇ9ý¼S(5A4‰•As-ØÞÒâÑzû^Ìlwàýþ¹{«’r ûT„’K8aÀš—ÊšK¸# ÚL;L¡-U@¨‰ V,KÚA ’%wµÄŸÍʶøè")«¤ÔÅéð*ªN5sgŠ¢GÒ›8ñÀRÜ•žHƒ¢‰)*žÃ©Š¬éÍW_å…ç_~ùåÏþó¯¿þò“'ž{þΓ³ÇšЇ¾Õv»Ç1‰vYË Ÿ¯”9U…€`ÊDV’ a1`'{W[ut›³ÓàÅ“£É<G²Fuß&å˱—iðõÈÑVzáÊ~ŘÁÔç$`ÁžÓP’JÙ¥8Mså% †fÕI=x’ZhÐ$UEøÙ¡B¸HT( ډ0…‰Ѩ*µÊJ»pޱûý–³yÞÌöy9ä” 4 bøô­nÿïEˆëNÚúñk=ÛÐÝtCž _çO}:« «íãq•šj§Ô6lŒk‘ïŒàùîg_´+6 ˜v¯f\oz¼Þ•s×Bûû>†èT\ZÞ=-lÝ{‡—lžópŽâPoÏó2óù©­îs† ³Íw]âÊ­ÚcõýÎõ­¶×ž9.,Q>ÐÍl!zúÝG‡?ümoþЛŸÿïN¯\{ë _ýÓG[þOïýÏ÷åk›±0[¿K½2iÚŽ¶ãß`gûÆ»|åq¯T_‘‘‚u¹)!²/ñŸÄdi×UÊiŠ6½¢”áúò(5§”E³P`f6Ž^JЬàL9‡eVD9Ž#ÔÝÉà…*¨Íµ^¬¦PW¡;-QÄ…,$·®ßÂ+~x´z÷½¯ ¥üÁïûþ¯¼óoÇ¢æ ’”⥸Y—$¥TF—ÈÉ¡2æét5è†á*P‹ŠjðËš?«ñÙÚôòï*—Ï!G"¢„áôßeßbç¾bЙôŸÔá$¦ªÒ\’Ò|ÍQbM%4È¢9¼„"NšDp¡£J #쬢*Y•@JÉфР”E³ªc ¤K2\!B­î ˆÅqk¬4é¤ý;ëK"“<ýè?öÀ‰O`ºU TSËmáð!Õà w‰¶dMIÇî¸~%O~ eîúÞƒÐJ¯à‰·šBV[ì¤î\ÐÑ+ѵ ³½k¿oÌO~º«¨D‚꾂*THñ9áù+ö3õê)U©–åhè:óÇÍÇ¥ùÿïb«s˜Ÿ¿ ˜¿/OEèoYÀÀ³Àb ïˆíÑW”;À–ôGÒÁá¿ú‡~ç›·»›v÷¥þÅÃÿä×>ÿþúÞÉzóÄÖ¦ ÄÌRÅCœ¸q;j>hã]‡žÍO¤‹‹¹Sˆâ&Ò²SÚ;µ¦ÝN£P¸±Iæ.%Õ,J  •)¤2t©O}/ÉÅŠc;ØXJÝFÂD:w7EAÄÃ×ZK£…k[URHƒÊ.ÁV$†K„˜®Á‹‰H×u·ï>ÿÊ믙?ñ—þâŸüÿá‹/êþǧ?Î×[éSF|t‹E‚ˆÃÌàÎZÒ ‘ å.nbáW†sXEÕE*{9R6f#Ýt¯~H°A&ƒ$ÆAÒ1¸jdÀR!‚*±Õæ2!žëóÒQDįPû;˜*HU‰>ÌßPö"G3’ÉÀfD‹› Pª’jÈyŸ´ÁC†«FJ BEòÖ*T·Ž¤Ñ1Rê)"QÝ9‘bf·@èûUâº8©ìy}÷^`·ÚQ« º©dO6®7m) úpõT·_«=ÛĶâtþ6ðåSÂUÌ]µ¢i©10°™­üí,`w—™«¼î»4›vSf©É3PÆ„^ªó9ÛÛNm‚©-h‚Y!¬+:ÎA[D$69eaìâeW´éj±?ša悾z/,¼¼ü[-Ú3À®F-â¢)[57/ÝÆáj?ðn?|]N‡o¼ó»o¾ùïýÈ÷þø_ýðñûPxÝËa*a8¢6Õ7Ç,Ùf.ußÝ 4$èC”Zw¼ÎÎ)³ýL[Å-‚®K¡2Í…YÝu.’˜Uº,²Õ$)/DÝÌËvÀ¦°½¸2ìV†’€™¹™")¥NS”³-Á)qi"•Q R¨!¨ª}ß½ñéÏŒŽº— ,‰[_Ê÷¤k¸µx¨G×ò«‹ïwß^+ÿöÿÝÿýÿð+‹÷ßãzá^6[',U5†Zò¦µ.ënðš÷ï¹5<ûœŒ"j¨n$QqFiw AÀŒ«9gwO 9çår¹X,º®‘³ÓS’¥”j¨ŠjÊ™8íS&••Ø\ ,†2“0]¥8,¡×ƒWdaNéäFUNª)¼I2ëHªšs¾yë6¡ÿÍ÷Wæ§îÝÞÿéŸý[_þÊ×—«›iѳpRc¦ŒÖÂ=šTI!.ÉQ !DP¥ªÊ¤.Üæá(tQ…hä>¸4:DÙ€9fÄלAzV}ZD |œÊ_ö6ZI<Øq ùË,œÖ<˜Ó77вÆ(L€T%«¬de2W?¢²Á˜ŽbLD6’dÙ!Í8(^ì8—1# Ô˜GgqÏ4Ó`0ÁÝu?Xî“Úes®Ö{%WÌÿ¸_\Íx5 «J)zû /÷Ã(³â}KTš”F-,°ÃÑ=ž?ñú"\"xÇ:ÚêXƒÔ¦m)pG å'¦Rœ#jÏkgR"m×g/¸ìÀæÀ¹_`6§v<÷z”ßÎPœ®4üh´/­ƒOuðìJ‡»€ÿÞèôô£¸·„³ üW[±Ÿ°·+-ãoµhÏ—õ6wj#Ü©’®'í̳Gg[ØxÇmòƒ%VXÞâ§òóodyç&N¹)#8&œ9\5ÛU%‹*’Ôœ9ÀwQCÑ)¿"X«5“QB?Q ‚m˜£F!tÐZ8§ª¨KÕÿP…qGܼqó¥^=::¸us¹XúéÙ£ÓóÃûtr¸ÿÕår >ûÖk¹¬Öùý÷×®½ùsÿãŸû•¿÷‹/}×GO¾ÎÍÐåE'ˆB—ƒéÆ’. Ql›zØzk.YrÙRS¯z.HRôNB(iHY‹dž^{–¸W£4ç[%Å9À¢ŸúÀ| (Μ³jhyºJ’› ²ˆS g<¯DKš³Í â)+I3¯ÁR‘Hím9¦ 3Hq rYÇôÈmD±¤ªC\»¤½È¤º‹ Š.[¦æ‚¢‰9Kbç[3e%+2¢;R †T¨ÛC¿§€ý¢_¬8ú¸×ãPÖËeG-΃t`[_¤NG7ßÈbABEÃK>™÷tŸß/²U_ˆrƒ(£>/›†„ÇìG'‡Äèeö¨Êr¨ömià]Ь\)%wK!U8J1ó“§7Šò:Ÿëe¼Ö¢Åh·lX·ª+‰2°ÉŒHsÈ; m®¤eÄl‘”[’ 2agdx¶‚…CÆœ$Û,0‡ÅéOH4€"TÝmFxžÂ&T3Ô•j‰ni¥4vÀ7ͽRèÒ“Nº°«ë´©dd,I„-h hˆª'»ÂÀqNi®l!Œ µfè¡U}ñà ¶˜.÷f$ê‘êc'}ÊîÓúÄjþ:€œ0|«ð7M+S(Õ"ó`n͇gwßýÊW?ú…7žÿÁÅ«wOñõ#¿uþpýð~WƤ¸×LS‘𦰑ܢÿ¤ÊãÙÍÄ1¹ì|HJI5p³ÀU4³Z™Úgëõ6gÍ9»!J^”w½¦¥Ü¹{ãõO=ýúµE'ÅÖæ£fšã`ëóó¾ëRJNt]/æ5T÷B+Åé.03¯v ¨ q>áI5Â`Fsˆ E#W“$aî1³¶p§œH朋¨9÷o¼ñ¦dý™Ÿú;âÇþäçÿñ/ýò/ýª»ßò•Gž¥+Æ`ÄqÍ šI‡ bj£ª9ÑjPmfë°Dæî¬~œˆ†ÄãdæV²MØÍ®&›ôYC°~*$<©.å)}•¨5 !Õ§·s!N‡¾Ðæ–÷ô՛ϳº¿'ã’¹ZVíŠÅ­sáâ™f[ÝT„llÜZ¤o»Ý Љ˜jB͹[!™$ífq]xi·”¾Ó§;™L:£td$ ‡aMoÂT{©GUCtà™s>­_MÜÓ¹m÷‹ÊäÃÓñ¢,ó }›Á:wþn^¸¢Ëmvá‚Zk²Ý¥2ºí u]Øp~ç‡{%3ZÍ1»´pF5ël±ë©ÿMý_D ”}ñ®½›3!÷ ç}u~9ŸÔBCvýæ{˜}þùê}^ñý,õÿÿ¶g€S .mðÒ…kâ‰ú_ë¶æ×¿úò_ü+ø‘õÝ·þðÂk8Æ/üÂúÞ‡Ë2ÜHÝã&µqÎD¯˜é‘AR]µ¥ ì÷Bv}›…‰¦9e†¬šSv/¥”p,¯V«^è‡a8==[—µ(»Ü»û0)òÒK/¼õm¯?ÿܵÇÞûðqD‹®­žþî0 OorÎP)eÌ}–UJqŽ£•RÜME­¢€+“Ef‘)è(B'©V¤Œ6†ƒŠ¦È6w¡˜x7ŸŸon¿p{•l‡ñôôì­Oî­×¾ýôÉÿéü_ÿoÿç/þÄOüç¿ú+_Z­VÇ'Ý}áµqý yžÝ|4&Z Ù“ÐQèB–"–$˜°ͼ YÄ´€š"Ëꎫ¦˜ªÖ¨^=äÍÇ÷ÙÐChV€xUôñ(³ÚFŠûŸ °ÌG^Ì”K¾Ü˜Á¨ˆƒ©æP{‚RÂj©nwˆ;‚”N =9  ¢Z¤„”"¦H#½˜‰ô xXr_Ù%õÊ…­Àâ&"#}¤'³vÚõ’ÑÆô9¤MÍwÉBEýÜÝ&ÿ–»÷–¤gQßw„ÕéMwC3”'Eè8iNA V¿·Ï8,`ñ‹8z€/ĉ9s#ã²Wù"“ %v©õŸó –9˜íýmî";ß2÷ŽÕN2~šû¤Îÿæ§ã/€ôî ñH¨‹T‰Ö©[N73JcGßÄ Œ§uv§ýÔFLåÔr&³‰f»ÙÏ~š+ºN"æü35GLßiIÖ‚‡ðŸYá_|ïÑÿíßï?–ÿõÝx÷á½7ýçíñã¹J`Îðiªi$B²ì¦šRJe6ÐÌ-$ÍÉÝc‚ª{ͪrëðˆ¤‹w}xíðÆkýj)ÂÍf†âî¶ÙlKTµë¤ïW/¿üâ‹/ÝÙ¬ß{ÿ+½ÿqN«·}üÔ¯­×Ûwß½ïNº tí5™¨‰$ÐlG+£PE)!¡Y™MaIˆ@áPÆ\ÅifÒ©¤, š@©B É‹³¸û8–œ3 ›q3–ááÿÿ{¿O£7¿ãÛ¾ç_ÿð§~ú'Ÿ¼‡ßÿ{?w|þÁÙÉ©73/#,/îEè¢Ònc ÝþÎl,)…!J26WþjK鉧Zë₎Zޱì ‹€HOÑ iL£!jQ)Ñz˜º¨RÅUáÁK©5Ó¬zÒ^gkåÞ.XskC¢(!+#:ÓX$ QßéôDRÔã³(Et´­; bÇã‘,BЄHò˜!ˆvØVµ[ÄÅG7‹žÞŠ7Ó˜žvnçÙµTHƒÆ€qwGÐÇIñú"4Wü”ê»so€W'AµÐ…Uœ®p)Ï‘u­ b/¯FAšÿ4·§çËãs¸{ëc«#þ›@ó ªê0øãå²g&;ø ;»]ÁìB°+§Á9¯`¾U¥†ì/$/Îó„âðð'SIç4—jgµï¿™®÷wÚñšU¸ÝÝÆÈU¬gâSÝÄvnõœ#°;çjÀÇ¥ˆ|²“à›¦=sŒÑaÔ¶%@=‡»ðöù/¹ù'Ëüí߸õ…¯ýbzø÷×Ãw}iÕçAFFp1%…{‚dQ„z°U%„û½<»ÙlÃAš»¤š§å«£Õµë‡Ï?ÿü‹/¾pëÎm÷òþûï}ãß8==I)­V«RÊz½5ƒª_»vøâË/½ðâsîþÑýUÕÌ=z”ó°Z}öö› ­tõE­N©ªOéÅ«û8¥B"CRئ¤ <EyIUHê ID›ÊÀEœ}·<Ûl“oæR>úèßÿgþó³ã¿þ×þÊ¿ò/ÿkïýßÞ?.ëåõ£Ã7V|pï ­‚¸¬!ˆYŠÛ81§Ü"ÿ mtU0%-¥º»h}KgçxÃuBÍX«0ÃÁRÊ•Ý!8=ÓW6rÖÌÙµú"s-8h€Re².ú÷滽ðU¢R5Idíj³ PÉ}-Ý<8ð?Æ) ’J¢&Â5*iˆ]4¥”¶ã˜D²&Q‘œ³¦I¹-0¯3”ùL0a€wéCõäêdBÜiQ¨J¼!W—²fôVO5¹W.pn‰ ¦ HÞ<Õ!qÚ„¥f9aÆÎ]ò_à«[³¤ÑøÐäÎfå €g4L}bhª®¯é.ûo/ží^@½ŒlÒ\A÷kçˆJ?ti¥YÏÇ–ùƒ31IH…b0½jêyaÛô¾ìš¾ÔÂ4ÝÄ ü[Ää°ª 2y†.ê•»æÚ3ÀUxN…ðL(1BNÁAºÄtïàÚòáñ¿ùÞýÛ·±Î¸.7| Ù@6!w›;t"µ`«2xq™½¾­Fa¼¨¤Ä>§££ƒëׯ_¿q´\.ŽîÞ½{óÆRÊ“'NNNÎO׫ÅÁÑ›~øáǶ›Qfèû¼\._|éÎGð¹ïøáƒ3 lÜùZ#© •!I’:J!ÄÜa°©¢)Aw$F‚/\hðPEŠÊ0% Õ”bÛŽA©Îª šcÖ]`Iµ/£§Nú¥JKüáú§»ÿâÏÿøŸýóù§~òg¯½Ô¯dÏWËëÏ?w¶>V¥ˆ«K¡û¸ÊèJQ¤$¹S/)‰3«¸"'‘ ¤¨ŸÀ(«PÍQÞ^¨…!q ‰DðX WCš¯ŠÃ»—Ì#»)n¥*燦¼D0ÆÝ1)*Ì1`RÅâÓÌŠÛ°vÌ)ÝôI+£»ÅE©ê!P@r§…B$QIÈIªÂA5x1$œ>BTd•ÑZ«X#AØkÒîŽøn’ñ´YE˜¼¤Q´nDÌr^…d˜Á@àk“£šçÅRXEƒŽ ¡§¦ºGcŽþû;èûœóbÙ­nݾqçÎÍ[·o¬V+½y}»^ùÝ/¿÷î{ëÓõí·_yéåW^|õÞã·›ñÉãó”d±XvV«Õõë7oÝ>p–÷=~´.c·Èéðhyóæõ×_­”òøñcwO©kÎÏÐö­IF(îdI¥ú3-ä/, E8Š×4_÷R;QÉ íUCc6ÌêäŽq(‹ÅªïlyÔ泯ÿ±ß\¾÷µ·ÿôŸú³çÛã _†ùwü®Û‹.ûx°>=”HD4Çq 9-R†PµOÂ.g1ï418âSÏ=IHóÎ/RE÷R…(¨í­V¿zD‰êïfq,ÔpÅ(Z‰Y¬=¦®Q‡›°ÛT¹#UMCêÜËwñ¸š8™2ñM%¹Í§IˆuíÀ¥ ¡š‰¢¤•|€¤$¢pb2èÇîÅD’"/^艤9((šíSœðüôw.SÔ‰H0¾týH­qkngoU†€s*Ò°o7!°“îQ‚0×l¥ Ÿ8tO#a]±q8^Ñæ+\àúu'\\‘’¥Rðœ‘,HLAgžÆ–+÷Þþ÷—O=fN¼Ú 7NgAbÊÀê8³‹´ÓÂátÝLŸƒÂRØXâÍ*­±ùYu¯§õá&'4õê ÎZíÒ5½mîmžíöâ‰]q /Æ„¿©Ú3À†J›‡AA©õYåS'ù·'׈Ï&ü]•ï~;D®Oü”Ø*,©+¬¸)èµØRæœ*„˜E5¢CgÉן{þöÝçn^»~Ëpþx}üö—íÁýûOž>wóÎïý=¿ïÓ¯¿¹~²þÚ»ïþêoþ£'OŽ—ËþæÍ›ãh?>:¼þÜÝnݾþàþ“¯¾óÞÙiyõ•7_}ù…;wž{þ†˜?zôhÇ”–$‹‡³5 'ºKñ-JbéàBsÒD=åPåO+ÔÔm¤ed ´–¨þYQj)žsÞŽ›Å¢ÿ®øžýÑ÷üìáöçþ£ûþÂ_þ?þ™Ï¼õåßüjÎe±X¬º›£AÊ ^mS)ED»n! ©í¤Ä[] °Å™ fŽpYG£¨: Ú5e†u\‡§± )p#„qVQ¦—á@UkÛ] mòq\ˆÇ͸¢o 3—bÀÓO*öÀÀ$ʦéè+% ZƒÜ`ö*UH¡ewøè‘Šêª$“-×&fM‚(!›4I⺌ZXÌÌÔic¡Ÿ¢¿û$¬jMvqÞú” IDATzÃÎ I¡x€F8’'Ôktˆà§¸ wÌ&†åî;ÍI´q+ov蹨­~ðÐ;"ÓWÙÿºûUËXÙ²vI#.mRŸÔ¾|±ãÍà§nÕðu‚› ‰/W!®w¯y)¦¹Å„Ò:Ú \akV©ÍOª1½g®j{þÜ­Ýz·’Cìyî|ÞßìŒò«÷4¾Ö7E{æø\†NJê,sévÃðîj€Á ªCŸ$üFæÁØ¿w 'ãð°l© #*9`PBŠIµ’–ݲëº,"·]×u}pãH®]»víæuéòÃÓó'ǧ‘ëׯ¾|ókï~|ïÞ½[7þÐüÁϼñêv½~òñƒñôø«ßÿàý‡ïxf\)2³÷ÆÒ§…PhnƒSŠw3ûÒ Û*ŦjšFŒ5¢“’HRsh§‹>Ëe.Ûóa3¦,ËÅAß© Û[‡‡'>ºvtçÎç¾ï>•ôÕwîýìõçÞ\ÿk_–ì¹;éü9 Þåc5Çe·ÚœoºÜ/–@ñ´-Ý&/ µŠ>ŽcºÖ˪_Ä9`5ꢢ bƒ‹HN“.bÚ0x©~9M=„>I¤-«¨½ó @aIšSA ŠA  ¸Ó€”:Š[0¶’ ºAMÄh¡K µ#(p¨ 0lîLa%1‰P“G7‹¨)‹Ùjœ7˜Ê,Ä–a DLiJÉ¢€Âd=œu"º@$ŠQ ”eßÑ98³ )”ÊB}Õ'`<è cÞl°I*›T„]ИdW-GC·I*”TJy ÏfDË˪‚¸@¯¤åеS`žµž.Bl‚à ÁíˆQ (î²àI­T¹î–+uZ›¬…Èb x„«Üh•p*u>…€¬Þ”wxÇ’Rv"—{0¤ Š‚Hubà•Zk[Ák½4D9ݼ”Òà^Ë L…tŠ.ETÙ‘Ü„¥T(Dò¤ª9%É;íg‘ ]¼D4¡’"22⯓gE½¯6;'_1M\šrn¸t€ @MÕÛO!!®Á´RÒ31cç\jŽŽûh•ãÜÚtÆ ž½NàÐBEªÚr‹áÚ2ªƒ˜ À]¿Y«?ƒÜ&൓6ÕV&¯tœ3ÒQά|DtŠmÁ9plàE”î,£æcbRŒ·#2œ/ºÃƒÃ£åòzß÷©ëÂV8X@U×›áñ““‡<:~¢ª7Ž_zé•çŸþîÝ»fö•¯¼óþûïß»wïøxsttpûÎÓÍv(6”±ëû[·n=¸ÿðÃG½þêk¯¾úrŸÓÛ_~çøÑÃ`hr‰vKñMb&‚81q‹“‡41“àAssyͰLUÙ»¥+û» ð¥–zi€¦„åg!F´ïÏB]fçvÖ¶ _Ôã^~\~°@Ń»SéÜülC+9F+*^äŸVéÊ­S.ö@ ,7kýú¡ß/k-âÒí#›ƒHêE6¸Á´™ñ MPâÜÕcÚ £°U–Ý/+ª›€Ù# GŠút€HQüMJØ<”Ť‡w¥Í¯ZËÔ#hÏEõ½£c¤ÖWi7~s…w]ÛF˜h¬õ°>à©ï—€‹iø4)òIÑœÓѸsv›ðm«y&2› "b ¸Œ\D ”D„-UåÄ»íþó§;麔z‘C³š™M*Ç»»i­ÌÇã=™òüÉ/ýÒ/½øÁç}ßÏóøð‹Ÿþô§¯¾ùÀf3<ÿäE7l¾}{Ë):r¿Ù¾~óö³g/ö›íË/^þìg?ûæ›o’ˆ»ßßß&6ývsÓõCV->º›HˆxWaÞÅ#3s¢®á<sT`"ÚÙY)ž‹§Bfâè%Y‡œsq+äèd³I9çÝ–~òŸwþCðáoüïo>û«Ÿüßý{ ]¦Dä}Ÿ üTfK˜s"OJd(æf& î ‹ˆtÉgg;„Èàp1¹»€„X¢yðå¤óxªM›ŽZÔ¼RóèˆàÌ—]N,„”*¢1mR¸„šßŠ0ÒÖ!6A4s°Ð:ÀV w—¸»©ÖɳÉš-DËCj= Ýáhr\€{‰yä cãn¬í —(¦lvDÜ­éUXà(jfg³e/+ôµs—=â€kÝmóeÙÏù^´V lëYë*í«…Z¬y¹2îç&ïîBÝ-FŒ­ªø€Û&iõÞ++ûñÓ>~ˆý[]ä3„6ÁÊú ;ww@…»qTr¯6_¯s ¼^%¯É\ 9pÁ‹˜™œ‹[ç䞬ZE®är¦%•ð¾ÐÖΆàúÄWqòu(8*;ˆA¡ŽVS$ækÖ² 5%2´ÃçpsH-ˆÒV©×¿vv©M&¾¯nî²|tµ{Xž:­üW8‘“8³F„ À­Ã@ÙaNQÂñ:®}ܪ†­»[Äqr£ yÊ|䔺~è¥c7·bóIK‰5eÔÌú®»¹Ú=½ÙOÓ8—\Šæ‚¹Ø<ç¢n†)Ï»Íöêj÷äñõ§/ž=~tí%¿|ùòñõ«W¯^}s`·ëŸ={q}õ(¥t8Ýßx~Ç©LûÍþÛ×o¶ÃæÍï5žæY‹pòÓ\@i·ß1³¤ )Ì]ÝŠ*\{³ø"/¯áŸQB¸ÚV˜YœM^¥ïcJ]sdj×"Ò¢ARµÒ=öbèŸþÙf#ýúïÿ¿ó^þÝ¿óŸþàG3Ÿ²–q<Þ\_Ãm×Ö([›1›Y6 np°{Šf$ïB–"Lr„p¶š.€w¶æó§6V û­¿Z£¯c¥`õp©á5©eYa×STÂD]µFð<Ú^h)ËüGX¹ ,&¦zØ"†ôGÌf&B®®®Æ:Vu@ØÜ'N)m·ÛÍfóégÏ®®®ö7×]×™Y)å4Ž··÷ß½~}œóý”‹RânÙ2]§ôr˜ŽwÇy²ÍºâÓý(l©ÛüäÓëØ ‘ÇÛÛûÃá0Ïó·“NÓT¦BÎÃæj·ÙoûA$uÝ\Êxÿöp<"ru}³ÙlÜýþöx%ff–ÄÌ1ñYÔúB(ÏDèËm¨?ÄÇø7,ô:1º»4 \ÎÑ¡ü´¬²O¸–‘0QðwÙko]&DKX¸E†ã/Q Zx®Ýò£jà_~Žù­hÍàš[23©Üëðòj7:=y¯Ú¿L @¸…=‰™ZtœÈÌ$èJ`&¦Áh¹Ò˜8£XM  ¼Ä@kÌYëYåÚï±VÕê\¶|vsÏxá¢ÕìêƒÈ`¦ïø&y¶&;œ‚+·ÞNs¾ùÇÿP੾¹ÌN¾»nsˆ›.Ç;zÎï>pÕ\v½üɘăyÐúŽ€Ò ¦–:‹ˆ¶;o9ÿå6ÅŸ+²éá)¿wqˆ:Òù¨ÍªœŒŸÓØë³£}‡–ÚÃ;‹ú°pL#Õ3°gÖÕåÿ#ò{°|t¼ízJýn³yúøÉÍÍÍf³AþÅ˯Çãëׯooo‰èæææéóO>ÿÑ/ëñ ±x¿IÝXP´Œ§rš0§DÌù0õã4ÏýÐó\J™¦)çÀaéEäù@æj¥ÓS<êÛ.„“¤”Ôižçœ‹ºé4-Èär îXr’”ºm·tŽ‹aªÐœóñx$!UIÔ9;O:™¹j†q3O?È» «¿R‡îj†¬ê‚Î{³ ay»k)ùþøm—v®=˜ÿÇÿáû+yÂW_¿Ün÷ûͶ"ORêû¾—|ªÂ,®ÒZ¦TenW`i#M*wg:X–4Õ¾ò±Ðòêî‚n™[‰<"¥wKu;çà³ÃY#ˆ]ÁªnŠ–=®¯Ù2YÄÁ´ïß5v¨²µ—4祇gˆ& Ãl 9Õ’u4ykr©I m*|·* @B”ÓQk©Û͆™÷b¥¬¸hŽÖXú.‡Šå€ßÅNCÂò§–—E°õ¾ÀY¿â]¬]sçfKçø[„驦xWÇiX¯øÎ¦BÂxð¾âVä’[ ·¶» v—a\«Ûb}[Q¨Öw½¼í‚RlÁ‚ †° Ť ³3<‚#—™WBØYhe{Z5\|eš<r÷¦*¶xÃÁb¥…²L¹ˆfQeìÈKYTTyhr˜—ÎÝl^ ,Qƒê«¦PAT†©©ë*Æ»~^"ZLDM8â![g rîîTCÐXN/xX—lçñƒ­€§å› – A®Ê®€ö›Z¸µ†Þ‡oß¼÷ûõ_ÏkÿbÔ$kóŠ"œ‰Ä5œ{! U±'ÞS}µõ½;Ôà…ÐÇžP6cfx‚¸›'pß$ü¢ëcÛýÃÛ§íBàÏ–³“°÷ ‚ö¨dD³ ‚Ó9a§³æ¬Q NÙJJl}ëkeD3ÍÍpw: ‰|ËGÀÏŸ?/óLŽÍf³»¾ê†þ3a0Ý\ݸ{ιÌùxwÏÌn–sþö4«YÖ2æyçéx:¦<–Ã<’p’MJ E0§”zDM-w"°™™å<Ìœ÷ý&u çyš¦»y.SÉfi˜ˆJ1"êû~Øt]׉°³`ÇC×u›Í¦ïû¥Ý!b/%ÇÃx,†ˆC:;‚ÎÁ TÜØñî4„V¼±.7GÄ?MÍÜ-º¾¸G­Ç®ÍJ.÷»áÀi.ÿþoÿEbþû?ýÝÓTعïd;p'0'P¢$Hª…¼dcr'äY­„Ä"˜ðAzÔ“ ž=˜:Íl5Döoñzk-4Ÿ–ˆÌm½;º ÐÑÊù#)" ?ÞsëED¼FõÝ[TŸ™Õ5¦¸ZRo Eõa12¢ÝP‡¸9˜F #K)É®!ˆHNrŽPšY¢"[Åü/ ‘°§½æCƒ›Cëû²àµgÙPçÈ­Aw}‰ÞûÍCȤS3k_,%u§V×ÈTiÀï^|"2ó»xð³)ƒóÙ4ˆ…t¾k«8¢ÕFâpyévBoAîs'x!WG‰–~701ê`D!q!¢` K×"¯ƒ­´Ò="Å®V×ðŸb±ªhûY+&Î=Îs1´Æwÿ°uõàÂ.r!xwñÈ ™,ä#÷ÿåå£à/_~¥¹$æãv·ŸÆa¨Kœä«/¾ŒŽª0ƒ9ÔÊœ§iRˤªY´ßa€n(SVSõ¬FÊw IDAT0 ëzàfZÆ’—¡ÆÛMZ~Ó4åRæy.êÖ+õ}r‚ˆ§RÊ<Ïftuuu}½ß_m÷Ûí°é:wýäù§~¥”Óét8ŽÇã<ϯ¾ýú4·iVNÝfÛ÷©æ2–K æmuxNM©@õú‰‘„n•‡J¾8ε cèãÇÏÒ ÓŸüÓ¿é„oÞ|ñÝ«\6C·ÛýÀ̉¨cfJ&Ü3'AaNÔ2`‰„uI‹bcv¢¨™q3k|Z‹n L=5Ž€1`ÉÔ6 ¦³]ndVgÝ(òi¶Kpx.}ÙV§D+ϸÍ)vA¯¢Îa믱§mŒdýýÁ|Z•>ÆðÐæ:hϹT—àĶûšzÆ9ÔÝŠO,QrÓ "*EiUíágÿÛávnwa|XÄ«›žßÙ²y0·>ü¦1“q|¾x½ÜÂùÍ¥ÔåúïO¦ž]Þ¸¤¼–¯·s±Ê%4®?®¿lï©%šëuˆVŸ x—ÞÁVÀCß°æiš{ø†‹ƒ Q™CÐZ\EƒÀ™\Bª.Šð@Ì Ý05³Ð½f)`tæ ]Z$VÌ@;ÎøèZC ›mažÛù®7z†Éª·è¢4áŽõõ¯3!S³ìª@Ìgêõê^ 9ò÷aùèxws­9£˜ª¾}ýÝ8Ž“Âé1$ ј“ƒÌU÷;"SÇp"î˜ÓõµXVÑ‚)—išŠfäy¢–.Š!I)M§“™y®ñQ\]í·W{ÖÓv»O)™»Hç„·onÇãÍÍãO?ýôÅ‹gÛMŸ’ ”2ŸŽ÷¿øòç§ÓéíÛ····ã8èû¾ëº|òì0æa* ’˜æÓß’â eÈPö¾Øþ;]ÕæKÂêP'b·ˆ S˜Uਸv‘²»™ÓÒð¨-²«Aàˆ’¸Vò}Öpö•;ìî`…$Z%þºØ³ïšAï9¯0êí`¹Îq´Ú =¤ÍÖ«ÿáüÐïÙòÑðoþñßÊÓ¬ÓLYÃL‹LêÝx;ô}ÇâjäèD:Iìøê8‰PêD¢ó%âÜÓ᪮&¦tšòátœçY¡jÇ”srwÕºý$½k‘b¸?‡#qºyüôñãÇŸ²ßï÷œºyžÍIU_¾|9kÎcŽñz8æñ0ÏãÛ7¯¿ýö»n»Ùï÷?þÁ~¸Ùl¢¨ÃÝo^¤ »’³˜{mT K’ªÇ|œR2­¢Õ$hU„Z5ž®Ï93kkòJDDüèÑÍücÇ«ãøíÍö³Ã|w8¼Ý\?ÇY5ºÅOED¸j:{î®æ¹-´¢&­èÖ-ÃnY¬3Åa,GµÌ€¥øò¯Ÿdç脈uEŸÝú›ð:>ö´6ìÛôÊðsö5ð3±¿3ƒ/?¸€Úmºž‹n?[º61…\ÁÙ—&‹.t!2!&ˆ¸:ÃÁdÑ]Jˆ¢™M¡`€…ø0s̶ffÁ 𨉯„€÷zÀ¨îZ‹Y‡ošÕ+à\/uÓ+޵´*wž9çq¯¹1Ç\%µE»ûb/UÏü^Xt«µ8Cï¹ò¸ž#¯7ûÞcxß ÖpQÛÙ²^Ün"Â*×^3¾±k»èдþ«ˆ¸ GÔœª}Æê39ÜYÉÙàLãb½5ô¾QwyÔ–÷"Ò`hYŒ(œÍôeT?X} ¢¾„Ô>°Ôd“p´Q·sƒÂ÷ä€ÿøû³üö¿ýoüÏÿËÿq}ýÉašsJÈ“u´éz$P÷LÕGìL“3/Åò¬ªª–ÝÕÝ÷Ï—^sʦ§y:M³g‹d9RJCê¨*Ñt?æ¯^Ýýâ+#âÇ}þƒÏžÜüð“']¿q÷Woî^¿y ÆÕÕÕ“G×?¿ûR† ›uEyßoŸ¿øõßú­” (”³Oóaš¦¹œo¦B“R¿}4l7‡ÃÝ4çãávÓ ØÙE¸KÑÚo¼‘‰"¬–PU–l ª“+¢vSÁ¬Gñ mX¼+Ϊ³fSPJýŸüµ¿þþ»ÿæ½í‘Oo†B:c»y¤ÔÈ¥›,ÍÒ Œ«#ÍîМيû Rôd;¨M9OWWWÓqÊ9‡–º%ÀAT[¨¹yÖB†$;áÁÝÍg÷( „VªY‰N0wpqÀmLÕÍ]¨yä2 -‹o^Óxî^¬/ž×Ð\LjÅ«€UDÚÆ¼äh¥¦MLެ æfÌÊœˆÈÔ´8l둄䀇\(Øwœ¨€DZ¯s&f†ÀÍJÓ|Úbpóâj^À.‰ÀÌ‚‚n>yߦšÄ-ÏN®)±æd‚EðÀs÷'[`/ãI–9=û…L ,>2»¹ªº×:¢ˆ‘ª˜W²-þ]Ö­p1UG­¢h¬ –ל'ãDíÂGîà*Ñ\5[½Iç{ÿê1È*ˆ1ĺ2Ä`‘‡¹ \‹1³³ƒá^4ʤIdÌNìÆ¸z™M;KTYʤj0Oa·¿Þ»¾£©Øý1©ú4åy$"ž™Dˆªð 9w$q&3ª¢`Áa4…º³¨·p¹ÕÚ´ÈhŒh¨Ief‰»zQ=b"„¤ˆ²=#™:R'€¼€L%n–DÓ$gmZÏg®Ö,ü4*V$1Œ‰D˜cðzdJsA!FÂ&—¢9_{5|tü›ìÿÕÿò¿ûê«ÿ3mI&‰  ebM@'FxÎî„ýãkI¤£êäÃîf Ùt¾Û ýfÿøº{DLyê$˜çy:Çãñt8œN§¯^ýÁœqw²ÙxuóüÅ'Ïž¿¸¾ÚüÎïüîÏñ‹/^Þã—~åG¿úã_ïº.ç<ô›ñ4ÝÞÞ?º¾ùôÓì† `%çÛñ®Ìy>ÞžîOÇãx8M§œ‹)ô ý~{ýd·Û©[.S)…‘K*i35P ±TÂÅ¥š”SwB2Wˆ[Wé8uµžÊ`2óu*qˆçZ ö·vf=Èe-j ‚µ»v±µÚŠ/Õh’¶T×í_Dÿ/v9˜ý)šD˜„Á F#” "°!"ý®ëܶSöÚe¯’ˆЪÜ<ž²‹ + »Ý~»é´Û÷ò<'"¢ÓÉUË<Ùœ‹†+!3wíQ«U]Ïï¤fùÏÂÝ÷Ú´’‚ €°vœ£CÕÂËH^Ìt9ú©*8°ÜÁ0{)TT—Y¥Ñ¬–~t؈،þþý]>:Þl®înO§ãüx}ÿ])óv¸bëˆ \““‰Pê8õÂL¯¿y…(Ãs*¥Ìó˜ËTJ>h_rÎSB„H:N¦=«ªÎs)36zñìù‹/öûýoüæŸøú՛鋯o·÷GþæÕñtH‰ùÅ‹_ûñOž<{Á)ÝNw÷Ç/¿ü²ë+·ß}û&OåþÑýÕÕ3O§ãét:å¹ÌyÇyœrÎGÏ#Û&Ûl6›mÿêÛoÇã©ä¼v" 8«âB-ˆµy‘…kÔ¦ 1-Û!X Mœ`g:3§Ôÿàù'€&Ãßø_šŒoï¿eL›Í 5¨¡ ‘‰ :2rÏb1I1i¨YqS‘…Yꈼ%‘ªVDYÕt„Ü3sÌ•¶jL/UÏc¢‹éÅbÒD­è! ÖZz |áöK€¡–l^uOº°>„ÁÌÔôyâ)Ú5T.¶™1§8MbwL _ã‚´‰›}Š(šJÕû)µo´Ú…Щt!; -êF$FTÓ‚ª~!h‘hšìÁ ÇCë¤Î´h–° êÅwoRË‹+lK)ƒWNÌÒÃ,*æJ Å· àˆ»Þõùðêi){ÿ½S«]zPïGC©^åúÇ Xd2cOAä¦.ÖDëâ¨Pm»åÔjGúÄièéºÝnÇLZÊ<èJžç9Çy:!«¸Q”Й8Ák›e“ÀpUZ†+`­ôRæÖm<-æ&Ç™šçjÖ5.B=TŠœn+¹i‡UÕïvsáÐZW/S½£±";Y0ÊœÜa̵ŸÄ÷ÔÓýÐòÑðïþ?G?íÒ–éÐwièw‚.%œÈ;¡í¦Ûí6ÛÝÐ÷)ª’ô)õ"Bäìd=™»;‘ ^ÌsE5éS°‘õÿú½ßyûöðöö Ò?{þü‡?üáÓg7ÃÐz³0Ïù›/^~ñò«Ói:³æâNeÖÃÝ1O囯¿›ó˜sguwb¸ˆ„ –$J‰%õ›M/ðû»»iš`º¹Ú–ysr‡šƒÌÜS’€.jD  qrw¸šÓÊs3Iµ;7%wƒg5bfþåÏÂÚ'Áïÿž’oß¼êwûZÏJ$SÀŬ(¸xQ+^æ<`n}|¥$—ƒŒ¸&ÃÔ¡1Y‹$b¹¤Û´ÐW‹£¹8ÔºX§†ŽmG|Îz Ü zîÓ? •m›ßÊ ‰2% ¡*ÌcÒvx„–›¬P”´2vO\ŠèQÝ. ],¯Qbö(ã=r "ãhgíîÑ‘ÚyE¥8AÌr¸GáGVá‹÷e Ïý\? ÀËkàf²¸GN¨] Њ‚°¬²Úò¢WÄæ*“mTƒÍ—iÂŽOµxÆKùÌÚƒ§‹S`Ü"RR™Íê^éov"^û+K=Tóš·õÐ(‹×µ°/L‹V2"D½m6É&á”Ä ’Dâ]Q·BÅÜŠÏežNó<§{J•èhfZB¾qjDÎpèU«{±csªœ»µŽQ­.xƒc°=0W½e|—‹ªÎÖÆIl#ESÄ\Ç{u‘‰þ°°Ç÷sùèøË/_NcþîÍíXt³åÍfx;½Ývשƒu}J’Œ“M³iÉÇSfNIº®º®ë:I0³èÄŽ8%fƒ°:qCDf¦¥LÓôõ«o¿üò˯¿þú¾”œÕÌNó7/¿üöõ7Dþ»Ç»Ó8Fkúœ³Çq¼½= ýP,œéPö@ß÷ýfK;4ª£±€™„ÁŒýþzΚRb†ÎÓnè§Ñ ®˜b@µÆ‹ñEÇ+– ZMKìÈÝ“³Q"Su›@8ýðÓŸ°÷`<ÛþsN÷'Á£ÍðÈm¢Ä"”’¸ë$õ©K ÀÜàj–‹º{úpõ½0|õX6Nd¹z‘p4Â/µœðDólj yWZ.b’K†LZŽ|Aß¶ÖC ]#÷» ‡ $<<uÁz^RLz=jªö¤·B•‡B%çk‚0PšoQ¯E &â~ëòÜú÷ôµo·80KýÌ¥syŽÀ¯<È5€ÕþÑ«zîøh­¾Ä-z5ZTÂQÅ$jjKe㨣±9Á+cˆS &wØY»tùÙ{=`,¸ëç_®×²r öh¹º( –HËsÕš®xäf‹á¸ìw5Àh!jÕ§,â0 [ºÆ­“ ©Ã˜ˆ%õÜu]b&¢ÄÒ%îÀ®y:ó<ËyÎ'›FšgÏS.³ª§s{£Ã®¨i½¡K«-ymd%åÕÏw4šÕíØš“0 $ÈQÙÎç®™uஞµˆf×ÑP%Bˆe#alŽÖ‰ä£Y>:žçùt:ÝßßËn¿›çÑ íŸæ”Rê{éúât{œìͽær*G3h¡h?8¨ù¦„€Y˜ŽÜ4¨jΙ‚‡L{ÌâsÑÓ©óé8îõtòœ­d7GQWCÑh€Eæ¨ÚT*„kzUß—¨>EtI®UCáI7 Pk1½\ÿå³4ª–Wvw%BU£è'µ®ßû(–€ïïoïw›Ív{}Å¢w›!¥äT¦ótG-es9MžËwã­;ÌÐêœDÈj‘¦‹Šb¡$$|8¼J©òS-œÕ’óóÏ>)y&5r0LÝ©ëSß1xÇ^Òn·ëº.uâîÇã‘Y·›ûþîxp§”’Açy‚¹cé;é;IIâé7?œŽî.»Íöúj÷£|>Nß~óšÔ}5šÏ4Us©èR_ëõ!da­ij)6‹ö²ÌàN,Ú! ]÷+¿ú#ã“ø/þ…þOßþÁÝø ²I›«¢'b“®ŽJà´b–؈(›²Î®ÚÊ¢*Ê.‘OW„Ë~Kª¼ØJÍîÑ^YWAÃ\|»Q„¤†Ójÿ8Z…Rcï×| Ì‹èÇz8½ßí]-î®j€‚àÚ2Q°áÌê”XEH  ®æ@+ã/à!“à\2£ îTÀLÿ›J•„­z/$îêÑ l:Aû(l63w¨z©”ZÄÓ¥ÌÃdV@÷E*…¸Ùí}Y… —cÔò\_L´®ý²§¯¿€ë%rŽF‘ì^%V«Öèv—0·ÝÑú@{‹ê¯vßßÛ–€UâP-Qg ȃêȰ. WfÀMú[5M¾tˆŽ×¢¶Ò‰ 43É: ² ½ô}ŸRÚ8\óÞæÇ:Íã8Žã8ϳßÞšj9Mzšlœ1eÊZïëÙΨ'ŒˆL4dÈÂ;7*ATµ¤ÛÝáQ%À#½±õå=¯èÙµ„1¢BÎÍÙŽHOHè ¡ïõòÑð~¿'Â0ô»Ý¦èôôÙÍn¸~ûúž8OYÓ|:ŽÓ”=;‰}"ba®' òŒ6 6‘ªÎj>)P}æ b ©‹&KÚËv“d?lD(k) káÝîªïS"Y+b¨êñþn³ÛöCÇ#óŒLÒÅÍ*"ÃfÓ§íÀÌ:ΧөL³qÏL"Òui†G]í®ïÒíé4©›™©›† PI ;.¢Z…¬¨hÓ(âj€ˆ8( CRJŸþð©Ó·ßÝþßüè«W?=_‘¤a³ƒvK !‡¨1Y"”RˆÄ-Bs%^:ëÚ^¦K4Às0¼„ªTXßV ªŽ'7Ç•Uë|ºF_ÔÈ#9Ydb,œÜÜòÜç+úv>Œa„‚Ø Y=.Ôû\ ¦Ö©ÜT È€¡®óÅzˆÓq áe­‘Ù%J@CãjY˜Gu ^e‘| D¸dŽ ¢@¦ Óˆ4š9TUIϰ»W&D(þÁ¬º-€¹yïYÅÝÔœ À¥ÙkÈ;\\z`èœ7'WwŽí„Oç5ûþã|†ßýåùcÍñ‡føâ¿šy Ú/ o¨~œY¨—¦™7368¾y7À uQuÀˆË‘µ€‰8¹° †ˆ0¢$!é†í~Ç ½ú”çY ¾{SÆ9ßçûc¾;úqò\¨ØxºÀµaªÞD¼bYãn¼_ l#çK^9JÍVõÜë_k‹ñ,—G8T¥K>wwû |×÷wùèø÷ÿÑÏÿÙßúè2lÇ)ÙÞ¾}u<ÞŸŽG¯5þI½3Oy³ÛÑiIx»ÝªÛápºA§JÅHsV7 õÒsêú~³Ýö]gfšËqtÛžÇâc9TGÀÜÝg3‹ð<Ï¥DlØ…ó5èêêêÙ³gÇãñt:Yž„™vÛÔ%2×·‡<ÃÕ»RÒ(eÒ8Ï7•ájxòùӯ﾿|Ž3u"D¬ªZÔ£Q„ãÌ02³$Ö¥Ô§@)Vf3íÜý(‰´ÛænèY:ºy´ùò÷¿þµÏ?»î-ñ‹ÿæoÿµ?÷Ù_>~ýÕý·×i÷ åÆ< ÙlöÃq&O…·DI‘oïݦ›5s"é¹çÝ ûñ¾hñ¾Û–9'IîN鬄ñ¹šáì7ÙBߨÌÐRª\©¨áLXÝI–Àu3½-É9·ºzu¦¢Fg»ÕH6PóÏÁUª¾@Ñy^Dj8Y J….¨!hœr‡×øÜÖ«0=œÔÈ(1˜:$wÀÜ Îð°õK:ß# "ÊMQ«2Œ£?;Ñ&¥kבsÚîºÓë7¼ 0­Ä•ˆHmž%#âèj‹ÈÁòžÓFUÍr0ºWSó’¼N5áÁà¤hˆ 4„àiÉt]\C‡’yëxqͰÈ!9á ˆ éÈ[ ½ÅF=âJ#½[Ž ßzÓ„‚ùf%¬® §Úm’D¢<-bJ5‚+L@p÷Ü …™dF ¡NÐQáBÎì\ýLr†‡èuìb*YÑ1;Ü:O©‘H w'QqG2Éö¢™õni·ûÜsñiò)ûñT§éþ˜OÇÓ©³\t,:gžÔÈ FÜ%6'uqÈa©'JÕ&„Eä/ÀÔ] @âH¾“SHæ´X6—~°')š+ºUó“JØú\Ë$!ƪ´²`¾× üÑð_½<ܳ—Ã|8¥”Óéàjç˜'XXB¥HD’¤¨¬påNDûý>Ï“‚²! wt}7 Ýn»M)1Ñ¢ñ8qøö-;8ç#AÝÆÌJ™Ãägæ®K,4ô»® ðÙöÇcwww<ŽöôIdžÇÓqÊFÜäp8í?{öøæ\§ÓøâùÓ»··šË"•µ<í,ª7™RŠÆÑú˜P/ËÅf­I7‡CÍKI ˜“ˆ¤¡O©‡ûÏ~ú’zóæÍ4MÄN(•Õ ¨›šÉ… ÜËìp·wr…-³æ)[62HdÆL½¸šª¦FÓ@›è#Dz~’[õÅ€8þ«,éxå72_I‘†îcãì÷\,“Ÿw®ç9 º¥HqI'ªæì¹T² :xP¶!ç®J•–Š+Õô#Õl- YQÀˆ¼R´ÀxÖ‘›>bÅ"8¨XcZU5Í:ÏõÉÕ 0`§.!±q>Kg,ã4Nëë³Ü…y¨%¸ñŒˆršªèjêž±ÙÚoØá €5"‹@‡­x•¾8ªwj„Úñ”¦¨ÕLœø¡×0æê°Ë¾ü¾•Ä,Wãq¯ ¨Õåî"ÔMªÍðÀ¾Xѽ "o!îKϘ/—– !†T:Ø!$ÍĶïsäzÓMWý4ë”»Ó“2Íóñ”ïG=MzÊ:Ζ 0[Vrwõ¾.ˆÆRpì+üq+Ù j¨™Ôp I ¸x|„FŠèc=µ˜È.†Ù{¯íǰ|tü{¿ûw_½y«F§l¹˜»—MÇØcê¥ëS×I×u"ÔKRÕRæ¾OÛív:"w×é8÷œ6»n¸z´í·÷Çñþp<Í#Ìò8í·›!ueŸ?yúrûRÃ0¨^x々RÌM)¥®ëJ)ñ×QOn gfpG½tõ‚¤´aêÄÝmœK.®îL "^ÊïüͯºÅ^~ùÕAïåÚ šRŽ©ÂgWë„­+¤ –¨ÝHBUšÒ¡RÒ@")g$gÐ0°ÔG9ÎóiVÄ´N•5ÆÕuJÞê>ùœpD)ó*ÔT,AÖàVVŽ;¹LA¯D 2¸‹,„öõ”ÇÕ>£{ø´FNDIÀ"p/sU+ ‹ IDAT:唣3ñ™&W£ÂGàj“ž‹ëVÖº ,"Hëéø}ÑXëkÌi?ލù"ÇÅ ‰½^tx€œ­±æâH¨Ï >ãýÙRAczÓâô3£‰™PÍ/–¾Fï\äõ3õðj´-Ç„’X˜™vn£€Ê@Ì`‘ˆä ,Ul‰®àÂí4¼9t“­ŽàÎtpNÛï[D¼8ÇÒµLê…v5¸Öë õ`ΰ ÝݼsXzL]”8S.²‰•L¤)Rff3B)ˆÞU•›MG¢ ±i5h}t¯öYÕm]‡¦ !hˆ Žr‚zu$ÖŸ鯸) º¾ÝŽÄ þù¢ÌÀ!mÕ·9ÑüøåÀÕdluˆ g(ŠÒ;n41Ô{¿I~ØBJ#xïdŒü ´mKRQéݨ*vgÓªª4†õz=Ÿ¯bŒmÑ4Á,³¡@lcg솙,Og#îDùM5&íXë¦Í•Ái½nš¦™N§³Ùl2™\¾DËå|9?kêE]¯vv÷§³ñtg¶^×!´{û;‡‡ûªiww¶·¿“%yº® ùiéÁØŒrvØàE1sˆ8bÎÕ-¸!YÒ”4ÀB„F”RìVcXäèÃ’%œœÄû´çÅ)1ÄEéœPzç|夫˜QÕ3K£2sQÙ_gsNˆSJ†Ž$'¢h™™Ï+× îŽB7y9™$&#ÊâYÑ 2˜tŒp7ÂÆ¡íc†ès§·—¤q¾ÒŽ„ÌN+guN ·o*`¹ú³·¤¡K¯UdªÛ´Ãà;<8÷ŒÎ!½ànà,OÜ{èmY œ%}µ‹‘)A $äÖ fM“Çél·jx£œ[¤Ã‰È3³Œ¾4` ІýÑóŒÂÆß¥Á‡ÞÌ6zµŠÍܦ‡N#0q–œ$fͨ²u™r¨uÓ ÁK·‘ü—áæˆÖŸíã?€’ Ê5óô…)ù­œƒ­Éƒí¿›YŽð›YW³78÷çó‰:ç•92Ò U¥,z›å–ADB[ù@È Kˆ(gHts²ÞÕ.òœ…s×4÷^Ç–˜¤ð®(܈Y­ŒªÑÊ2…ØÖM»®ëõºY¬ÚÕ:4-ަª“šäH:‘c‰ÉP®g´ì- Ó#FWß­dè%J s2ÿ€?Ëîîn(sÉ"ÂαJ åNÔ‘ò´­»Ý½'¢ÎëÍjΑYbUºª*FãbT”fº\׋³Åº® Õ>Ôw“™Ž "³sÎ9'¾ç8¥Ú&g`ÅžA ë$‚\¼Zµ1.Ty2ÁÁÁîdäs^/æ÷îÝp<šíM¦³Ñ¸ÚÝßÙÙ›Ívg«z9šŒö÷êvݶqûé\Ã:´ØÔÔ`Rˆ+Ö¨Z":Ÿ_:2 Ñ"R² Ö¶É(jI3ˆa¹_×'mÝ$ò¥+«¢ˆÉÀTŽªª, ’qQKÅBÌ`2&cR *‡„ fŽX@SHJ9õÜИf]¢,寪¹™"QGùæ Þ˜IÛ\΄DÍ‹R'(ÈÆ9p•+„sÖ`ò†EDdà-1ä.áÊÜ{œÙyÊ+„h© í÷M&ýïóm0T|¶õÚùÁýn2k ¢M‘öµÑèDE6;I‘ˆŠ¢È­O!ìŽ×¤ýP~ID$%UiO~t?%8ï³ñ,\1È ç!³%N”Gaî¸ÎÇÎåû­/ÙêcÏ0Ã9 VH:Ç€;‹ „ Ó«?7ÛÕ|ŠúžmkÝu×íõ7ßpî:ÚUçîNF`êú-nùý›Ëü°ÌŽXÒ\6Ü!R²¾¤ }Ì@îb ™RŽr²b›ó&0g^âQ ú¼ê8ô®÷E맦¢ɘؘ¸…€ Ì)»ÏÆ& ¯2Ú'U‰É·¡jÚ°®ÃªŽMË{g±i›ºn׫Դ1„UMóM/eq0íë|axk)õWœ€<Ñ1äÃúù" S°Ç|\—OWã²MÌEY¦ÕP8aJqðzûCfnMSLP+Ë™©ªWzª¢ò€®×Ëu“V«f]GÍÏMOe]ÿÝ*w£!†©&5³Ô†­ÍwxÈFPˆœiuç”Rlãr¾Œm1çùÒ¥ƒ´;=9›-çóŲ ãÚûêš]¾vY OŽö÷GÓÑéÉ1¶¦í”33´öî¯s.w6lšf½˜çöÒ›”Q@È™“‰ØL<¨ò~o<5ŽBØ=>¹cJ ?*&U1jS$pUŽË²ô,•“ÂËH|00ˆØ±±(Ы›„–,² kcf(½/ý*J«!MlØ[çâ™óqyN´VQ„ˆÅ<‘H®ÊáÄ0+¶Ø¿mëæ<Ì8™ L&”–I—g9Y€\G-i—h- 5‹Yü‹‘²wÃöÙ7Ýf“ÛcCÞJm-Œ‰|®o&6 [hÓpznÃÐå< ÉGùcâ8²}÷î·i‰ñîÌBíš˱l©mm[ÓþülÕU`gxÔ¢¨k‰\ÊÅì˜;èíeUP óº…súð£x«lèë|\ùx£œànü€;EÏ~Ez$BŸÞ5$¯å¼ë°ÙôÖ+ Ì̘¡dlÜvêµ?yqš™™w A°!Kneš‡“Ü]¿GÆys!º¦öÔ¹ *ÆÔu ƒ²’û<¡€±%@ ^l&–œhåÂdÔDÄT^¾Ô4M³X­–Ëf±hÖë¶®cœ ª“…¤1INý2˜† ÷™u!|êìØ° ÒÏõ6áÿÉY>q<‰ˆE¼—¦Y«™P2Ͱg9áB{ùrUªÛضmU”ÓÝ©/çó‚cÙßÙKc›ÏOOÎÖM2xâ‚(‰s9ZU…8g9¹¶¦œ‡‘}¼”ÚRJ1¤îWÀ$Wš±ÉÖ½íLÑ GÇ÷Feµ¿»»··7Ûݛ͛źi£Ý^¬–Ñâõ§ž<¸´O³Ýkן¸ýÞq.sŠ1ª3e<“†;pŒ±®kLU•BjØŒbPU]§9@•¯üh쥘UÕ.O\ºÔkæŒÏæÇœ”•;)ÖI•à½/¥t„’]é¨"Š­æL#3RBZ×Í|¹¾rxEƒVU5òMFãÙlBhÐtžºj&!¼÷Þ{ó]±r~n™¹ÃéõÙ€£Û ^pžÀBŽÙ9b@³T­ÚÒ 6ò¬ÆjPË.oŽ&´ÒU:¹,ÈÕÿ$¥di–®£Ã,šh„EÊšÁ Ô—å A50€Æi•Ô€‰ˆh®5Œ×)Aê{ÎÑý¡4+åä>Î%a-VËÒ[ÝbLg3¤BVDã™ôÙ¿[®*Ä.Ý,OÚ†š`6j/u²åmâ)juØÀÌ=!Þ0!Ë˯“(íw@7}‘Á]êYâp Í\' l¡ŸR ÐE[,ô#8¨m¼ãíËà¤Ï(J€Âœ!W#¢gƒŒ,5…Ì“°còâ½3V“*©•ÙØ7³Xסib]ÇWwŽcbÝ­‘,©ºœ–÷x ÙÌ Yá£+ãKf‚sçûŽãåcº|âx:+-.Šõjé}t0Kb­“…+H\“‚nbl›H¨¯_½6ª¦GG''''•w‡‡ûãqå(6õr±ŠëUH±ðl€*çÆ¦b‘Ô„ˆŒ5K©- )¥ÖR®Ó€¨{DPÎÊLDJL­x)È‹Ú&j¹H\j«RÔå|­õîlvõêäªNš:\¿>nSt¥ãÂ?÷™ÏÀÓ“7®~ê37nÝ=Z¯×u]Q5”œsEQì“6¤»÷E!4^œÔ¡^®gMJ`/¸ô®@U”c/LØ™•û{—wÆ»—v¯\¿òÔ¥ýƒgo<ó…ϾM¥7¼8sš¶© 6yg)œBŠqY!¹¢¨Öí’Ê4Ú™¢¬&ÅØ´ÖÄ6•Õôî»·/ïîú ŸûÒßû¢÷>¦6… ŽÆeU–ÞϪ,”cL1¿Ñ”R){ç ' ¦É4šíŠ6G I5&3 &¤³&d.¼Ž1º¾KSnžØYìÄ+#$"B»HfÑÚ¸†f¾HY±Â`±Jfš²º“+È,:&6³Ä¹"G¡‘L±4ØT²Öƒ’åßÔÔè5è`Ø ‘,±æY™@[¯sÜ6úQšól2]žÂÌ-ºÊ·1¦.j€€µ !¨,Kˆ‹Z¯ê°;ÝaFá¸iV«zg'ìÍv«ñ B½n‹Åµk×Þ|óÍW¾ñ_yå•kO}æÕW_}ãõe#¨!d2™Œ§^|yyq¸nÚ¶­ ÎSut_-JØ¿rðô{û»;;;W.îïîN/ìÍö/=ùÄõgnܘø‚cœÅ¦¾ù…§Ûx|ïèƒ]ºâüx:»z÷ìØK5M¼/ȬôUå $efE"¢¢(€¶iš[ï¼Ó¶íK/½êBDb1¶ŽxQâØ•ãlIsâtã”’ÙqvÌŒ;ZN©—D4$…æ o3[Ç`ý2ÔƒX.—!M=@ªšY­ 3ƒ’ªö¥ªFÆ‘¢r·+M°îq2B‚%tòŠ;½· 3ÓÄfÈÛʽCöRöh;ÕÉÜ×4$XYêïU§¹wæ}òààu€°@cé1VóS0rÿÆ£xä;¨’662¸A‘󂜗Á!Ûvtl«ëÀ…5±qnγ½æÆrǺ_ttíGìO·õG~±õ+"úI²{>büËðÚ‘ºWû¡¶ÿȳ„ísÛ|Ø\xó7zŠY†ˆ.^€a…Í»íLïÍN ‘LŒØv`ó×vöcÓêr…u›Öëvµ^/Wu³jêBC mkmDVÍ3¬t¥%%)rT"O9ºZyiÃΟ=ÆOrÿ/Ÿ8žM*ÇfÇM@LReB4!„Ð4MÓ¤iyùpO\¹®W«z=O.íí•^b»uÓ6!%SebôzI¤¤)EôÂ…D¨ª‚tº(ˆˆÔŒa€¸8q¼3“©©•e•cuiëRCŒ5„¦ðríÊÎdT1ìƒÛw˜ùððpw6«œ„õj½Z¶ëšò 1;'¨"å„]2÷€qîœÍœ ”•(­ðÎÌ:¡ò3mêÒ±/|ŠÚ®Wp^ªÂ¹2ÅÈLÎ1u–«¶mc÷“Â>ýÙÏdêí¾õ§—÷/=óô ݺuëþíÛ;ãñ³Ï>ûâ‹/>ÿÜ‹W¯^-¦üàät²³{ý©§ëz½Xž}pë­ùéé½¾ÿÒÍ›_ùÊËO=s-…¶^ÕgÇŽLîžœœŸž¼ûþûoþøGŽïÞpçíwßþWÿä¿zíû?`¹1_¯TžL¨šMæóuYL¦“™÷>´q2™LƳs„=æè 9öQSlâdgäÈ™™ ÈXØç^ñ,¹èHD„HRJ™‚VŽÈÏ´š™9æ¬u°ZŸæ¡ÑUe|{*\_´“²¾’‘ïŸxêOÈÌêvpvìDÒØÈuÊDäØb!bÓ ÿ‰<íRµ¤UîC1)¹ddÊE's]5Y.SŠm2Ë]yBG§;ÒKŒ€™ˆ‘Ó:or#꼤…EX¯œXéÝÙ"¬—gVòÞîÁéé½Q¾¥âÔ†œŽ´…”„áa<¿m¸s‡º¬®!vó-¶qëÿa%¢ºG?Î…ä,êëøÿF$¾àÎ~ôßÏÚß0ò°Ÿ›ß>êÛŒÂã —E.üËÚT=®ö»´½iبO=±¿2Æ€ÁÃV»o‡º:Q#K§â9_&8GÞ{&g/©ò1Vq¦mËuZ¬ãb­Ë:­›Ô†ÕòÌ¢iL“”ñ܌٣£ô½^Hû^]›½ø8/Ÿ8><Ü'’¶ ¯Dj V«¶KZ–þàà`w6­WËû÷ï«ÈÁÞîÁÞ®'´«u½^¶ë¦­Û䪔R›bJ)· @eU`A¯ãÓu¨!×Õwf{šyj˜‘–Ö3‡4LkU+O“ñ¨(Š-„Ì¢R]·—w÷ ±Y¯ë¦ñÞ\Úß;(¼?:¹åÒe‚ìîìüò/ÿâ‹/|j2š~ï»ßyç­·öÙÏ~öË_þòåË—Ex¾89{ûøx¾0ð«ßþÞÙbñä—'ãQE£££“K—.UUõû¿ÿ{¿ÿ­ß=º{/ÕíÛ·o¿c‹eCäb”“³¥øb<*^|çs‹åÂÅèîŸ.m}­@B+N‰Ù—{iBÚ¶UÅh¼\Õ}çÎh0sIL$ëÅ’ÙAM ñ0²”2Có²‰HUcДR“ZY—¨ìˆľk}Or2ËA¦Ð„!ú•.Ïí2sxN”ÊÌØeÊ:y®FDuL]”ªY —f1vÊÒõïµÌNUJF *f,†¨& «5f§Ø:A¥\A«ÕdíózlcIR¤.Q6~[¯T€Ô© ö‚V£²*Ë‘÷•§‘=õôÕçž{æå¯õÊäéÝÿñ¿ °À‘X46vÞc U·°çqlçÃ~á  ç=à «w!ÈI²¤Æ£·ú˜Ml¶Õš÷£—G®ó¸0ÿçg˜mÄ8òM"“˜áW#ñÐe`¡·%BϹê]ç¢Áu´!,×.Q— ¶Q€1ô+Þ—k?™""•yÜÖ”Œ«:½8‰ªÌ"ÕÁÖ­­š¸ªµ îô~Œ)4mlCjbªÛÔ&Ég hËÛËZcJ\žýiÿ‰ ;—OOvv“ÚbÙ¸@!Õ†äÅ…óÞÙ™ì¸}÷^l›¢(n\»\VÞ´=[,ëåJcŠÊ×6I-&K˜!â˜D‰]Y˜%©F5Ógásš³ŸE„,oI³¥fæÌ1™™’ŽÊ¾(Šrì‹¢R–Ū9=[Ô‹eM´0žT—÷Ç“YQTι{wDM§§ó¿ñÆjµúêÏýÜòlý½Wø[¿õÛ_ýêWÿÑ/þâ />GDoüøÇ¯~ï¯^{íµãwî™p“´iÃÕë×þ‹õ/>ûéçCÜ9q\¶mûúkýŸþìOÜ»_9Öá©÷C«¾˜ŽGû,•‘3pŒº»wu:ÝýƒßyûÓŸÿÌÍ/Þ|éæO—•œÜ7Ïï¼ÿÖhì~ã_þ,]ºze¾Xšx3uN‚±%hÊM’sž™‰‘¢‘#š‘YJÚ@®-B×ÀN,U.BßÒ.æÆ…M‹Ì$ôW<§í”U¥ª)ÅNŒYœ°€ú”ZÛ.uMV¡oþÇ蛳ù,”iôdÖ++$Ç}Ó†4#pé(ëü3Áàrú©šƒ1L: D9T›Ø ¿îÿåÃHNuU@¾,I)YŒ$RUÕþÕËÓÑØv§“z½šÏç_ü™ŸþÚ×¾ö¥ðò~ù$þ§ÿÁ-ø¬4&hØÐY·–¼ü¥/ÒxŸ~þë?g˜ÿöoÿÇ×ßüþ¨˜ì\MwªU³øàÁ{íö½»GóÓãÓSÉ’–))1;! nÖÌZˆS2a’úê˜ l:1Bßeq( 32b‚01‡zÞ“5b—Kbˆ›º5&0",¥hf…‰u)ÐÙ3î©¿ìQåZáìRƒ4Å5åh±)¬Wˆl™÷€AêK¹ë² 6Ve3*aÜÑlîkZÉbˆ2¿Ì9’m·¤€5Çä`¹$%sé’•/0Tì&¾Ì¼È~ôæ­·ßyþÅç^úÂKÿàë?Ÿ`VЭïxm®©.NOlµ´Š«¦£Ð·ØÎ\Ý”Ÿ›/ûç¨÷€/ÐËÛNQ¶Ò[t¿œsÀÀBzÄ ñ—¿qyÜO~¡†iD–à‚A[›"«?b¨mÞ†ùþíö·8pãœBÝtË|ì Û‡Së4›ÍŒÔ œ‹a Y"3µ¤¦ä‹"¥¤1501$îщæ¤*ý IÚdëˆ6êéi Íz½¬WËz½l𵦠ªayž!@ž×~l—O¿ýÖË©¤š×ͺ$a7Uªæâ|½Z5+^:¸riÊVŸ?¸ýàÄ¢Qâ´V3s̱ĚV£ò ëpÀbŒ))Nà8 3%ÒĤ Öš@…ø‘+̬Ikâ¤+_BRøêøøøòÕ+ÞûºivfUi¹°Ë÷î>XE pOì^½þâÌ»éûï¼{ëÎwî^úð™'¯ì0¼ÿþ{§§Ë÷ß¿³··÷ä×wwgïÞzs6ÛûÊW¾òÌóÏîì—ãòðò¥½YŒqç ,½c2¡išwÞ}ïõüp~²¦öý“7ŸZ_¹¶{íä~Xœƒbˆï-W«ÂÝ«ëf±XÅ6¬ÖóÕâDµý™/½êâÎÙŸ¾i«?û‹ßÿëïÍO–ï^N_øþŸ¾ñ½?ùÎî~uçî´\5מ¿rïøäìôXSp%[b¢¦ìjíûœ'µ¨f(\RÖDJD,™X@!*ƒ<˜ˆÁÔ°µH°XÖמHJ’¥&ªB8—=(‘„@bfч¤ ½cç„€”BjÍež™ ‰³Gaçsßz%@`–¥Yòñ%R¡Dh¡ s f¦šÕ0ˆH˜151 ˆ-’š¥dlC GäMÉ¢R.OŠ)ÿºI–‚*ÌX|&¸ Jl®¢bÌÒÝÿ ®Ïž¹ôÌÛßÿA=?{úú“ÿô7~ÝïMí믤ÿö_‡)ŒfÕÑñ(à¬,vëº!ŒF®(ª ½1ªJžÌŲժÀC8¡û€zÊz  ;iÃï3½É]Ú.iBG‡!~¹åõjGtÈ î:ó,YʺÓÒá^´„ mb³«ÙÃÓ‹¤f|ºý—á}n©‚¬k5ñ0 Ë4ë~CÝÁw/ÝWýDı³^j^{Q"Rlj ž¼3b%1.¸¦"Þû\êͽ€ƒóßB(<µ(TêQBk’Òdz øÀï¿óÞ­·ïFˆçÒ¥”dT-¢î—~4ïïï£j\Ÿœ>¸w"\‚^XœgGÊ”´QÓÝè×8!&ÕQ̪±eÙusL"RŠgfRƒ+ÀÆÌ•sÌRUãÐ&‚Œªj:Ý9;;KªIãhTÑb±øàƒTx|xûµ÷ç{—¿ô37÷vVë“÷ß»óÞ»?(˲(ÜhT¶m=_ž&Õd2!Âí;ÖÍzgo/±‚©( 0UUá„ȬY/ŽN>¼s÷ÃÛwë…Qÿäþüܺ~ýúd2Š©14eU,›·4¹f•Bˬ.sÎííîÞºõögn¼üÄ•'<.¦·ïÞÿ£?þNcÈîL'•ÀîÞùpwoï©gžÿìÍϯVÇ¥¿UøJ) ¥ÜƒÀ Ÿ\U5†„”l©ÍŒÉÚw´‡0Äʬ2‘Läò%-G!›'ÍöÈ;—(!i¶n]ÿZîzºwáW ª &Çd)*“e#R‹öÔˆ“°† 5Y'ËÄè$5,~$˜¦N³ÏEnAº‘4³\Œœ3´ˆ¹A¦½cŒÄ$ä ’ŒÈ²Š½eÈÜІz=ÅÜÖÐ2ÒÎB0Y'™7z>\šØÐÉg s¡Œ‰@QóÓëlgÉK–s’Š`PîTO@–Ž"SÕâÉÉɤ%XC9ªÊɸmÛýèGßíõ¿úÒç~=´G''‹ESIE^¬‡€Ñ1«CL›&©YúH»˜gÛIç?‡ 9µŒ¸×•¼0H·æ>]„Þî„l'ÙæU{â:_Šá‚Ðy(Úžöm]¦ŸÔö?<]ØBôÎ}˜ˆÞë¦Ìô’0;f"qY¸m«ð÷½Ý$[JÞçf ›-ö¼uÿäoyà®D9Gd]g2²®“W·‰Ü1 :÷[Jt Ø]÷kÒø‘òvfÖúœÿÁ”¬æu"ª‡óè<:FJ-ßüñMÃúÄð ÏŸÏçMÓˆA@ž%²2HX„]–I‹ÉZKjÑ671q‚¨Xsò‚„úX$‘&äÌr^W•✨µÚØþlºjpûîÉ^5 HÌÎKq÷þ]UÍ*Í ]-‚‚˲$_ºr8žËåÙ‡žÖu­-««» )…[µáäìtÙÖUUùh1µžâRˆó£“åz­ª±M«ùb½Z1 â,Kt‘[>xbSJÎñl6‹±/–³§¦ÓÉt×+_TFhÇåêÎúô ^úìç¼_xáS¿òÊÓw|pÕyå4·Qê°–ûÔ¹•}go#C@=Êåjc€ Nalœ`F5óÈÑ“˜ff±wva€ 0ƒš³Á¤ªª‰¸óž}—8Öe¿ô±fXWUÍm@²4Bî•cB™èÓÁ ç…ˆÙ2 mHYÍ1„Vµbr³=8ç/‹QUŽ''''oÿøéX#Æè½ËxeóÜ52¥DDÛý€˜¶Ý{”+µY¸¿ˆ]É2ºKx.<™Bˆ{O;´Åc{Ííó¸]V¾Kꑨ?¬óØ×~úbý_T»*ÄŽˆµaLöy{„¶m›ƒ&°gq”5Æ·‚ñÛh½µçÛáv`PIžjt|9õÉVùÁ22ÆŒÌåæm½k› ¹|g“ewXº:ù¬ãÑŸPç,g‚è+´oæºå6GK]óHåÄTˆ”Ó"$‘‡˜þ€?6ËÓ×®Ãl¾˜ƒEãÒ‹¶šZÐòìH ASŒ‘ˆ„s¯n+½ ÄF”@1¥´ÑŽ1³3ŒÌT:ŸAW˜$ܵ·i9 3³s“IåólB°ÊñÞά=ZÔMˆš˜EUëfÕ¶±,KöØÝ›UUÕ4Æ´³³ÓF>›½ûþ;I›ýý½Ý݃õ*¬×õjµ4¢¢ª¦Ó0?›?X`â.^¸þäsϾpåÊU}ë['GGMÓ˜ÙÞÞtg_è0¶mS‡6"D Zø¶m™1«*bs.<}ã©7nT—åú“×÷«ÒÇÕ¨,¼—ªªž}ú2b]•îÞƒ;û—~í×þé“W^žLC¨š&ŒÊñ|yÂUü·¿õ¿ç/ÿC )ƘE3Ì–’Æ`ÔÕ¡^¸^Î9U…ZŽ‚æu² Ì–k-ú5ÑE¶dS³ñtIMCghÓÌ+±õ– ·k̬Ù%Aç6 ª0Õ.ÓY‡ ‘¢9(™‰õ^ðã=(C0syª±íxY×'f;õI²ºàûf„PDCy¨KªSS×ócÓ6¦”rùb¡98¸ttç®sœ`Än<™ŒÓ8¤Ú{Ÿ;^däØlèáí>òJõ õèÙµìí>Ò¹ŸüäÎåÃk>rœÞ#·óÿzϸ¯Õ`©—^²íq.€îöV½ÃMõ¸ Á@A_ØÐ0l~¿¦´^¯ëu çÀ‚œ†(LN æNG¯+óåaãÄÐMUû)ÚCõNÜâŽÕØÌ¬hÈÕ'"d²wZÈ€›³{¢ƒ °Têµaо熊 ð@Œ;át3Ë.4{j-ßïͰ1 ý‰`Ü¿ÿÓÆX(ÅQ&Á…Q‚‰Å‹ˆ§h–R6ê ”Íi%b°ˆë;³öçÌyJ`cb†;&2”¾2ïK罩6õ"4 ´}öéë¾’¶mr—8M½šÇÙî~Q¸Õâl:›GÑîýû÷+V¡^ÖëÓ³õ᥽Ð"´ Ÿ¾q­Y¯ÎÎóåªðÊæŠÂƒ©r£ùérgºW¯š?üðÝwßÞÙÙyùgúêÕ«å˜Rˆó³“{·ïÜ¿wrt2?Ÿ®×Z” FYÉî~uõêÕÏ|ús/¿üåÏ}îsŸþÙç®î]cx `”€Ï“z¡7׫ӣ“¿õ~ç7~ý_¼ôü 1’C“š«Æ<ö#vÆ—@áåŸú…—oþÇ÷~ø{)fpÊEÑjQcyݶGì¹Sç#æD} †^ù]2sVÁêê&øB]×÷œVÅÆÆÌ Öµ‹²”mSŒÁ̈ˆD f0êˆ6ëE—3ÕŠ\+ Ú4ƒTÒCæ¥O6tDY7¼óccºöðkl]=rÆî}Œ¼%tíM(ó~)j¬çÇ|$"㪊16!ä™åüèŒbj\×J’› ç¹ÎFK ¬ëžG4øPe7Žo²wtðEv·_©aè¼'ë)âÁ§Î#îC|;æ Å…‰Ëæ·Âuë‰Ù‡7}¡«ÒÖ]úˆ“0¸ªÔ ø7ö°Å¼´m;_ò™“±—‰³‚ˆ˜Üã<à ›\᜷0ä| Ûê’Èò•ãÍD„ºÓÕS*ÝÍÜq1Ä–»Jæ”sßFƒ Y¨¦»‘¹( œÜiþ¡Ÿßd»Á½_n`UEGA±!ï¼Å˜÷%~LÝ_|x4™€ˆ”@ª\!ÉWä,u…©€qP)“%˜åôGvÌæÍH<»Ò‹°0*' /jlp fö,ÄŽÀDc7U…²˜Ùr½^-FÞíï\:œŸµg'÷½cˆP³^«Uµ,eY¯SJǧ'UQÝ¿wDðwOnªÑ¥+ן¸òÄ[o½ ÌYâõ'âl)îß?:=[ŠøÉ^YŒ¼÷ÍzuçöƒÛ·ï>xp·ïË_úÅ_øúµk×0Ƈï½ÿú_[­VG' 0Mf;åÄ,µÓéø‰ëW¾øÅ/|ó›ßü…_ø¥Ã½Ë ¤– 8)qÍW„òÁþé÷ðÚw?ø`uõꕯí§¼S Tå*S[õü$™M¦{Ï>yã¾ößþÍß-YTS%c!RF2ŠÛŽ Ð™1UæÜm°1™¦d*©ƒî»wåVohºÎ¬ä¥í {ðrp¥LygTP5$$Ù§&8¨ª©3ÀHº™ê桳^ämöè3éÐݽËÑE} æá3Ö‚qn2Òù;F0%’\Â56#&Ö<ÏæýdßåÀ`KHìœó…¦@&¤(PÎÛSa_8f2F‚€9P #…)˜E8·*%TìØ;öds¬NÈ3» ÊdBð fq”%+5¡UCLÚ¶-À—.]úÔ‹/Läìƒ;ÇgggE1!çÙL½ã[ïøÄõ+Ëå² ÍÑÑÑd<Ïç×®=5_—eU×mÝZJ8<¸2_}xrz¯Õi9š\¾äîÞ½¿X¬—太ªjRMÖëåÉÉIŒé‰+—Ÿ|âZŒíÞøëßþÉDqxpõÞ³ùÙ‡‹:Îvö®]»vóæKÿäW_yå•o‚½U†Ôùá½KÚ¶ƒ´ê¦ûož¡„Ök[­Š¶©öüÄc¼Þ ¾é<Ž-GüÜ_:*%÷#·| ˆ$O‡ŒcîÀhL¤”¶N¦©·ÎxérѬ’“žóÌ$OOA¬ˆÎyFITSN`$„7P$¢çl–Ý1µí’†Æ›U¨¦ãЂdŸ‰¼S2SõˆÐ‹pr,BæŒLrf¢ëZаcç;'",(RG1µªq:Ùª©ÙÉÂÚ˜Úùé‚£>sýò'/#Ö÷o¿v·Þy÷ÝcOâ<•EŠl“k‡VU_xêZ]×Óë³éäÒÁáÉÉé37n”Þ½ü…¯]žÌvøÅëŸkÚÚÓÞѽ£v¤‡{~<MÆU½jÔ(2iéç'wJW–ãY{–Bâr<:¼xáòóßoþí_|÷Õ´¨ª2ŶPYýôË¡¬ž7ŒªËwJ—R¼›I 8–(LDaêHZMùŽ~°Vˆ–ÌÌÄ\ŒÄçþ@1[n>Ä0¨q‚)a’=ÊhªDQ äH$+I ³g@-™B§=|’™Vhž„a¬ MdÑrWâ.8—•%™@”RÊrà™ÈÒJÙ»ïZGP2‹É°á.6ï`D”ÓRSnÌLžÈÌ̈Lm eéÁ¤ˆÆH@œÆÅÂË8I“´•¢t®ZÖq”Yh çýˆõµªIÑé—÷9l9.žг{Ë[C¾Ë!\[hÓ£ëk‰¼™YJf1ÏLBD­­G|Û/éœû8P¸] 3%2SEB>[ÝöÝCÒGsªT×Ó¢¶Öå;.{cf]§Û6Ÿó즮¥—{£„Æià ” •°J1:}—OKEFˆ)AJ©Q252Ož¡¬‰«ND²î‹‘#f².©JDˆ#‘1³sì‹P OyÔ„Ö‹øq• p5r)Ys|º\.™ìùçn¼pãÙ¦^½õî­ûwîǸX´õh6›îíŽf;­¦F#±h4!—4,«TAس`ÝÔkFd.ËÕ¸ÖxºjíYm³ÙèìtamJÑvww/«‘/ËÂïœžžÖëõÝ{ÞøÑ[Ï=óijÏ=]·ñÿè¯~çwþèOÿø;ãñìå/}ù+_ùÊ/ÿò/ÿßÿGÀ¤më£oÿÙþæïþßß}õÛó»Ò4a½ â«Õª®ªª®WUUýÚOßüñ»´ÆÏ~ææ;ï¼ûÃ÷n]º6Ƥ8ùp]ß?½ôÿ±÷fÁ’e×uØÞû wÈéõªºº«çn Ñ© 0È„¤$[&E‘’¦$‡þ‘ÿùGa‡>øãË!["EÑÁ€©à Ä`’€Ð˜‡n ôT]sÕ«WoÈñæ½gØÛçÞ|YÝ ùÇÝ:YùêåË;äɳÎ^{íµ7îeOD%`Á ” ™9‚„Ð(%H01Qê.D„H²ÚÎ'ž6ƒ‚].,¢bŒ""Â!#h« P1¤u\!‚Ôu“’­Ò[©G†‘Uö D"‹àT†¨’ˆ)2 ’ ˆH§S" ­V‘8b»‡ŒJ¦º#j;ÉÕO’»RB‘,Ë»ÐD%WêÄ?S{¡²Òg¥p$Ò©ãfRݧ™ “Ë5JZT‘‘шŸ˜xçhšFqå® c…Uq-g kÁŸ´}.:ò?m˜¼ûQ@ûÚwh‘Úr¤ÎTܶ‰€(a/ÛN‘~;xý­(J'}kK¤R|&‘á®Ó~}h{öˆí,#VÈɪ.šÛyÂ,ÛÒ3!IÚÇ1z‰>vÓa=~Æ @ DN…uŠ3•6‘^J½\ÔGGGyfÊÜlŒ) œô%)NE¥”ó vR"BRˆ 6M@„–ˆ4#‚ˆ¢NwÃi—*€bhßH3 ³0Šj›‹ "r[."†T›âí4\Ø~^|¯³ ¯o”¿^[ Iÿ†oñ¦o9·Z4xZe tÌ $CA`…Ò©u„Œ!e´ÒI‰r1¤5i­‚&"B£I+±Š”°€ hò ”žÍ—ʘ¢7h¸Aç¾÷ìÞÙÝíQŒñâ+×®]»MhÄ  1Yž BŒÑÕ÷>²6kšfYÏò|©µ®šºiÓïOÆÇ¡®Š,ôz‚Ú;XÎê3»»ó­7C{çzea–Õ¸©&UU‹Öô«ªzæ+߸téâæÖp:÷uí¾ÿWÏ?öèãŸøØ_ûñŸøÀ§>õ©¼ÈB =ËÉ ?üÖ>÷'Ï<óÕ+×ös7+¥ŒRö•Y=õ(ë—/ÿðZ½¨þ³¿ýk6<5?øÜ_üé'ù¿ëÃïûÌ¿ùÚW¿òfé´ÆÄÄg¶Îkm‰HH+Ä’.L*Â5ªí;Ø~ZÈOÅYÔy%@‘–ÎÔ[”[„¸$PAšˆ6RºÌ!}É»÷N 4I@BÝÕ‡ˆœVe´ Ú!£é„Ø™ IDATFDT” ™ÚÝ|W‹Ì©Um Á+{mÚ•=I’ÿpð°r]:UØ ·Ê‘"´­o"¨¶UyàU4–l>Ú;³jŸ“Î !á.¤ LšÐÏ4^B„ºv(dœóQœÞçõE3À]ø§0ÆÒ)¶×¸áðš×¿áóÕQZv±`€¶“¼ ­j®VÅÌð#Î:ÓcY«Qfòo ž’ÕÞÚÔ©tžÞ,»>Ðõ€øÛî‘«÷aZ)”Byœ ш§¶VtDF"‹€Feµ¦,7™¢ž5¹Í”21Ö®Z,nß¼5èåÛ[Æ(ÃV#" »à1Æ ­m7%Ì€ªðÆÂÈŒ!‡£÷¡ !R D™ª¥|A…¢5*% #§}¦ ®R"@é–©6Q H;?_ƒ»«ý®=¦I]` -u/w²¼I£Þõñ–àÞ¨GÄi2%¢€Ì6ªmÑJ¶†”TÏ—Ï’mHk0Ö*… Y£€!TÞXCD,”—}¬fÍb±x×c>ñÎdz\½ôÊ /½tñÊ•;M­7Gz;gfïý¼nBX@”à}ð~Ás©_Uõb±QÔ~¼½1ÚºpŸ5f6]Ü9/j)Ë¡Î3EY`—ø'ÔȪÅÔÕ‹ÈQÚ²˜×_½¾|~f\óÀƒ}àýOâã?óÑþ jiÜ8³'ÏýðÙÏþÉg¿øϼøýËì2M£É³‚É 1*‘§óYÑψhyß÷Oÿ÷ÿÝ?S Nê;ÿíÿðOï÷?ýë÷ïœÁ#BìdË¢[nE^D¤UÛñ цk\à*Ą߄MºœHMzâJň»ô%,”Ówk×6Bl· ¸7r@X,u]ë¦òºÑÒÞ“õ» ÐR‘«Èæ5¿MhØ¢TªuKˆµ…8‰«W«óéHî(Òne`•OÅSz'!è˜Ãx%9(ÈëOøn&ÿôÌ hu©«_µNdwgvQ¸F†%‚€@@¢’|u±Ý«Óuh$M%¿¬²¡¾TdúE^X³˜O§ÓéåË—u^ ‡ÃaQÚP¢£!pTJ¥ØÀbôÞ7M3›Í›ÆW WUËzé|hb Ì!‰¿º‘¢O)y®”ÊŒÉó¬_öz½žµvc4HÇ2¤X’õ½i÷”Ò/Ý<鸟õÍÙÝHüÚX’·jgQ’ªñp5­ÿcü&ÖlÙf,É YŒ&m”‰Z¡ÕÉ.¥5YíZ++F&¥”&RJǘð@ aK =ƒÚ .HgÓñáäøöÃÜ÷‰ŸÿÙ3ç6žùòW¾þgoޜج7l].–~1_rˆÎ¹èB #ï½÷Q‚ m²¼°[Ûƒ÷¾ÿ©ŸúÐÿÄ;yèû7ÏlBŒW/]µ6ŸÏ«ããyã¢!U–yoÐׯ4uœC`ä(Ædy^.›f±lUÑëoeùáÁ­ ç¶P¨–ÇÿöÓ¿ó™ÏV=Ÿ —K¬æÈ"y/pÆh•.³KRJ·¦Ñ7F½³;£ûÏï]¿q糟ÿü·¿õŒÕúɧÞ=]ðÕ[û/¼øê™í{‡£þf¶å¢›ÌgnY³óÂÁš"DˆQ¦ó9Œ6·ööö²¢÷ê˯ìlž¹~åúÁþ>@D­ÞùÞ÷¼põÒ«Ïœ¿0jöüþ­ƒjê¥ÑÕÔävgäfzʸºRªnïEäþ¹ûÐgŸùúw_¸çÓÉÏýüÏþoÿÇ?úÕßxð=O=ùÓü©LgûèG (p!„e=u®2Õ‘-aà:ø±$DNØâÓ ã%‰Mº51*Ä´iN ÖάXcD"фʑF­Q`!¬bµÄ*§ ¡ò$¼b )ØQ„±káÐò“"B!å…¤¥: 8,RDˆ"B¨gî#tìè:Ì€Ýë[¯4E„ˆÑ·iNæVg›Ž«TѡߪªX Q…°Nîµn!éxID+ïN{%àRLCš ™!t è:@ªŽÛǤ‘éÊy#òê DíÍ€xwd¹þÍKyj­u‚áôþ¤)mbŒR®D˜¹ˆ·éè, «d-¬ã"¢:,PÉœ:k <½®õ!B"ÞÀ””—Æ(­A%¡/33ÇJR½rò‰D¥T‰˜$˜„ƒ€SàƒL¥‹ÔWg‹ˆÀˆµ@$&ä „rµ˜åY–]æE¯WŒ†½eÓ‹ÑŸÌ›”)HPjŒ±Vk­uÞSHBà¼÷uµ\.—1FmmÞ+GÃáp4õú…µzÙÔÝvßÃà÷ÿ÷ã7þ›÷>ùÞ_ýåpßù ï}ÿSàµ÷ðêåëÓÅøÎÑÁl@È•b‡tTÈÌ‘™Ó2ŒŒˆBX*ãœkš&Ù·¥"8@DNÖ”ò¾ŠØ§^¼‚ I(µéuºé¿ ­Ú1@&E¼´}%¢AP‘—‰ŽNœVRŽ )‚02 1$€—aJ›$ìÀ´¡SÊ(Ì.`É öÁœw̪_:*—¸·ÒHÄn¥CDR”º¥ûïRdO R릶蓈k˜g\%w¬” 1ˆóí;¯ùÈšw1Ü­quÁ·‡[?4€ÿ",X[šÛì#&fN2è± ±ð© zµ¦¨Vÿ“.PDV½žSO%mWÚ×áÁÊ:m…í_’RÚ“gÊhÄÄgÈôx±ZAD’  Ä‚Pi!ƒÂžYÇàD&§×ÒS‘Q-ZkbÑYD-¦³­ÑVa³^¯7ömf¼ï3Ä^›¦©ªy]×K×À²Ýø ÌŒ1Fé$îSJçEOkË"Hh•Ñy¶˜Wõ‚ R«i­µV†ˆƒA:1ö¾ñÍr¹\zï§Gw¼÷'n<›ÍŠ¢ØŽ666ʲ̲L’9e¢ˆEq™_Ÿ$wÍ­xêöÈý¦Ï ¿å8ªY´³Ìˆµ™slŒ1Æ8Wå¬I+К‘@H‹2HP+@XµVýZ)Å ¢É5iE,‘£0 òQ\€±óÛ[çNn~»¹5úÅO~ôᩦáÏ|é³/~çàäÄgyžRÓÅΕ¦,G2Y)(öÎ=ðä“O 6Ë… ‡ÂËÁféýlrtrãÒí—ŠË÷=´C®ºsõøÒ¥Ëß}ö¯nìVÇ·ï<öè“ïûÀÓÇÇã_|Yk½Ñ\ŸLܲW–Á/}нüì… ÛgvãéüèÄ•Óyvýæþ3_z¡ÊKyl¯¤‡Ïì(‹¦Zøù¸ C)yFáÕ\3ãL©$ú<³Á×Ú.&[Å­¡~êxêu?VÕÂÅcM»=ú_2àáÉü¿ø‘x´¸±Ý;pË[ßyæÿÊT¿g˱?œÎç$Úë<65²,‰¸[ÛV¨Htc”Ê4ùèƒçˆÀ¦! ÇT5ÄEGdÒl-i©}í¸ë•02uÆÞQD|p°B@`‘¸h¤Å’$«&"S×& `d@v¡3Ù€v-IÆ{4è÷zý€C``HÅHVTˆ®n|ÓDƒJÆí2Ôf£¢:lÅAI’D€A„N­gX[Š8œ:.A¾‰1dvXL €Ö:F 5ƒÑ".ýmbÂW˜u²H¢$-$L- ͘^™.|׈_T5 ŠŇ ‘jUåÈ"9rŒAbfF@jëxZ/á´1F‚nJ ¬”fN.v¨Z†\Ú¬U:1+"È(¥Å{FSú1ZeŒÍ‹²ŸZk\ïcÈT?ye7MÃ̤™C ã@V›å`”÷Gäãòø`Vçj@5±95H³6K÷E(­ e¬¨ÌLg¦W¶Fy™½u³f#Ǹ=/«¦Y.9‚1†É™ Ë2Ï¢oªªšÔõb±hꚣM=_¶½~è”XÉÓ<ém刨µÎó²(Š|¸aûÂÎLSÕ³I5›T“Él6‰Õ"n ÝææfQfÆ`ÃB1`J EDD%XYÝŸk;9dæ„â@Œ„¤*l •&dÆFïD­¬ÄÞdã-À 2+¦qK€`(Š¢Ø·¹cQ¤‘QP"IÔ@ÐXE¢(5S¨ ‘¯”B‘Ø{`±h"ýýý£ƒë|ê}ÿÉ'?nwGßýÜ·^|ñZœÉ,5Îy–ºiïlnnž»çì}μüÊóÇ㹦þ¹s{O<ñÄõ—ëªru#̵÷‘a¶¬¿õì_]¾rýïs®Î3sxûàd:S¶xûïînÞ9øêW¿jLcLj²½½½¬«zéŠ~osk«?ÚØØØhªåÑÑÑ|>ím !Bq2™¾òÊ«ƒ‘=wß–5ÅC=”õz êH¦ä)nFï}5_,"puµ†­w½ë©/|á Ü{¯À¦šÝ¹µ»1(•žýæWÿÙ?õᇟø­ßþ½[7>õ×?ùÉOüì ‡?õ“¿ðÃþÃ+/^xøá(ÜÄ) @¨”"hûžF„(,^ +%Šb*kë$–¶åQa„Æ E…Z%mL*À`€)å µR«d>¤I¥¾@*$…Úæ†‰»[E¨È8€¢î›´ž€Â*PUó¦iêº@" öráY‚µµ1m¸›2¾]@ ºJYXKÇRr¥É?Û¶ ʼ>R­bP¡û­¼6T]¸æ¡(EÈwG–«£¬õ¾¹{hAŽ ˆ8AvX…ðcp—F]s‹l%Z‚J³ZiYrâN EÒÕµ¨”ZFÝæò[…¥"PZ딹H"ÇtÆ«4"Ž!§;•Åá´]#¢%¨(1p¦•/2ÍDˆ:ɹå.TŒþ®Û’s!´*ª¦i±,K“›(œ•Y™­²JÔÚZk—Þk­µÖ†ˆˆ¼«/‹Ã“ªªëÚQžçEQ–e™ç9k,1wc_Z…ɲ,ÏË”c&á¬,¬)3»˜Ofµ«Oâ¢^Ìêjss´±9 ‚Q0:×ÖºÐtŒ…HŒ«j1¸;eÐÖÅø¸r#XUø{ϧ·f•H^O<¼¹Æ[€Á«žîc œå€c™gQ*%BR •hƒ6#Ò@ˆÒ¨ £DzŒ²ä¸$¿d®ƒG/Y©>þÉŸ}ûß»8þÚ}æ/^yõhZ ‘ŠZiï|`?Øý­¿ýŸ¾ç©'MÆñÅþ×¾öÍÆé^Q^½|å?|å‹óeuÏ=÷œ;wn|t<ØÜ>söüÕ«W¦Ó—ÿüÛƒ~™gF¾ãï¾qsÿh¼|àÁÇGƒþ‹/¼týúÍ,+ˆ€cô‹jñЃnloõúýYµ¼råÊøh¬ImnnFï3,æÍ ?¼8?þއ{ÛC›÷Q«ØD\Šä}œº¥Wbc®…c^þé÷½çüÙs›ÃѰ×O'ÃBÝ{Ï™û÷ί@ÿúWÿbûY^ þó¿ñgËzX @8<¸<*¿‡‚¾ iÍ!0èn½ S„ˆÆ "ib"TÄì¹ãK[‘T"6FÊê,ÓFDjï{!ÁÈÂm4@”|š@PN$KÌ"’µíÕ@4¦¾VWÐiÀœög½k(baB‘[U­sDœÔGí ´UhT+¡R§ù×U‚H™õt5¬9-×YwWÏWÿ“5¡£<`H Ö„Zë.5ˆ-£Û½ƒY]IbÚVœ8¬ðêQýˆHEÄ®þJDXBsî²Ô‘´éöЩ£W)Fda…ˆê´_2¢AfÀ¶8û5ùȶ¦-U†­ ³ˆZÚ¿k¿ˆ(Ø%VSzêTŒ&˜# µjfŽÂ„š¦ž1G` nI$ÇœŒ’;~•@©6$$áäÑ2 1:ç³ùl:õÎåYVz£wuwQfZe¶È¬ÕZ’%¤t>N§Óý;GûûûÇÇÇ"Rý­­|0ôz½,3ÖZ­µ5=è 7vƒ™óYBb¹«ù²šÌgÉú£—«<+r[”ýBk½X,\]L'óz>[Î&‹až[­µRFë”ÈJ²p*P·ú´Í(® ±ë“$Ô}tP×M;ÅR…¤öOoZEô[€™†£-©ºž›L+…Î9ÈŒBDM¨ µB¤4’7š™{,è¢c–Q˜]t W5Ñ9Ž ;Cp*†écnýø‡~ ˆ¿úío?óµç¦stè12[¤0à“Ÿü…ò_ÿWo{è¡ùâèɧ®‹gžùÎb6i–ËûÎ_¸|õÒË/¼xtpgks§7Ü>ß<8ÚÝÝÝ‚þ“O¼ãÖkW/_Ö¦ø©}¸jªk7®OOŽF£Q*6ÆTÕ¼,ó§Ÿ~úü¹ó_}õ‡/¼@F_¸ðÀÛ}l9›ÕM³ Á* @·Žö§ÕÌf…ë…ÝáÞ#ܧB¼}¸˜ß©&7Ƈ™‹>Ë©ZLƒÞÇ~îg/^¼ô¯ÇEß–çîÝn¼‰.3™¸ðØ}JÕ{ãÉáÆh0ì—åÞÕK7fÇs‰€I Ù<³eÙ!KÒ¬‘6FåV-N§d€L •“©”InA„ˆŒÉR‘s.FˆMµLŸ?"*…J)@â$qG ôk×ÔuÝ8g”$BÈ*%º´hWöÓUFD‚¬ªƒpü\µp.zïµÛEo@eª§D£t¦ ¥""x#TÃdZ«CŸ>QxZ³À_›QK¯ ÝþF(¥¬Å „•ôëÚ«Õ­Ö1¶µ=@Üu ®Œgõþ«'êG¹ö¶½í@’7ûm$Ûžù*OµÅ§ ‰VD4˜Ôi–°mÞ ‚H»v‘Ó&‹™9h¤”ˆØ2™"Ô)½‘:Ëe¥0²D‰Âì:ýs²:aêúS‰tÆœ@$Ä,Mh0Ô „„£Ri>ÄÖ ¥½H¥(iô4’BBE„Bâ|>?99™L&Þ{£”1¦´Y­ëZÕч胋•„¨”ÊûVb³h–'“éþ­;‡Ç³EœßÛ z;;;››E™pÊRí­¸«:®spOÛ°r6Ç“Él>Ÿ;ç&“ùD¦ÖÚáæÖhkck´¬ªÅb1™ƒÁîîî``\MÓ˜,?½?©X9Äõ}äêž3ºîóM;¤vêî’AXXuzé7ëxë°Õg·KŸß>ðAœÎsm‘A•Ö€B0)ÿØ6…hØ×Þ‡€L„6 9šÚÏ€÷«kná Á»†zÓ“ƒìÉ{Ïœ= @W¯îO&KçA÷,¢ŠUcÜmü½_ûµGz$ö{½Ç{äìÞö|:½zåÒp´½¹¹yfgwØ,—ËW^ye4¿pÿÙ³gïö‹‘2øž÷¼ó±Gxî¹ïìŸ=®v“ýƒƒ3Nµ"d«”ˆ4Ëz6žœMNÆ£ÍaÙïC„2WšT]×ÁyI¥ç̱®ëãñôÖíƒÃ;'£ÑÆh¸yï¹í,ËŠ"7V‰D"²Ö*¥ªÚŸnˆHIÔd­Öý²ÜÙÜZ,³Ù¢ªª£;ÕbQ×õdz¢4n¶†£Ñp4ÒÇãñ|>Ÿ/ê^ß †Ôë÷£aÒH¦Ïj¥;#¢fY¯s9«'aUø— »» \a‹7œ?o³â«M IDATÖñÖ` ƒQÏdE€Ùññ¡`´Y@Æ$&áh<‹Hˆâjï–D@ðQdÙøÚ5D$ºê\Ð!jfa‰ Æxfç\fG¡iÇ.õ¿2ÚÆàóyQ>pÿG>ô!þ?ç·ùïþ­^^|ä§?øo=ÿÒ 7ýÍ—^xñþï¥,”½íííù|¾˜ «v6âíõ¼Þ¿}ýO>µ¬gW®\~ù•ä½<ËGGGÆdÃáp6›íîîîîn_¼xññΊ¼‰qÿàöÁíCï\¡­Qv°QHÈ‚FïÝœ½óa2«&†¡_”Œ÷K*Md7ŸWÓ£jì›vÎï;îûú³?ýì?ø{ÿø£?ÿÉpûè(+ò­ßýÝ7ìyàáǾùýoÿîÿò—Õlú•g¾tÏÞè«_ÿ÷óÙ¢?Pþ¥/Ý>į Ú µ¦NH)o­µ )Ú$Ô#‰Ü4Ê‹Õû@gIFD ˆ™íÏ«½€FE6˲²È² Y\Óøº©üÒ{9" €$WDB ˆ µ«NW§¨iE¨$ 0²Ä€!6é X+T€Y¦S ôr¹<>>Þßßm˲ŒQˆÈؼQ‘=û a1kNNNnïß9:{ǽÁhw{gooos˜¥ý\!J$"V*o»c¾Ž´@ˆE¬2E/”½ÍaÓ4ÍV¿?ŸÏŽÇãñáíÛ‹élscw0mmmZkó¼\VÍød çÎÑîîN"-’ON‘¹urÍ­‘»Gû‘LZY ÂÝÆ("XÙ”I×ÕêÍ:Þz ñòìö™ÒÞûJ¬gÓ #â²v£„,‚è…Ç(ì›$0{ޱñ‘=Ç \Ëœ/MÄ ¢Y„CãgÎlžÝ=Rhe§Ój¹˜#kP"ÏHQE ÑÉ7¾ñõŸþÈûÎßwæÜ¹3Ã~yçÎ8³}Wûï|çÙÇ}lk{ƒ9-fYnÎloýà×—ËêÇÞÿþWo]~õx,²^p¢KsíÆu­ÍÌp27ÎeE¾I[yžܹsãÖÍ;GÇu]kÔÍŠ<ŒtÙËÀ꣣£¦‰:# >VwfæmºØ võÁ~ŒMñüæ°¿·óÔSïøÈOÿäO<ñäcï¼}g¼·{¡iä·þͧëÓÿëWþò‡ ƒk/|ùﳽѹo|3ç‘oê³;;¿úë¿BìJ÷­o?7™/À–ÁÅ&zç•–(à%:@Ä X$Ä胰›x2š:ï½÷ÂLQ$D›­/¹,%'Kå˜!*!˜Lg,CÀ¶hE0‰°˜™´ÖÆ« Aˆm‡äøQ’ue·Îv%/)€£Ðœz¯ûI)£„Y€‚g×pN *Õº §Epýõ)r]gíÒ#ÝÅï¥teê–jS¼!°Ž ¢» Êk8PÓV¦"&I¬aR’” wå˜ÓŸ¬P„t{ð”²}í÷ª=ÐèÞºJ–w%+mט.,“®"E@D –é ÕÊ¡»iæS¤¾âÚ¢ð7- ýÖà¦æÅ|«¸pft~~x§>™rãÍ$V"A € DÇìN‚VJ ÆÀMãBŒ¬”âÚ ¨¥i"ÇÖB"er£!¢«‚͵5…÷VˆœW³9ˆ*˲^.^zñÅÇžxÛoþæo‚n.^¹|ÙZsï=Û!¥T¿ì]ºtéÆMý¾§ßýØ£…O<ñöíaùïÿü+ý¬ŸQ>ÏC`ŒÆªòúÕƒl”moïxïg³E¯×€ƒƒƒ^¯|ùå—oÝÞOçʨ,ËØ·‰Æ¦YöŠBÛüøP|hlQ’V ØÏû…-jçŽæMõ¶·?ú7ÿÆ'æCî•÷/Üd`KÀ3Îqfìÿô?þÏK8D´ƒ|xÿ}Û^xäíOý¸Úø¹Ý½ü±‡û¹$C›ªZ?ûùÏ_¼xùx2ÑM—y‰Q @­"Ç}@!ÐÖ5Êh #CVˆÈD«X#i@`‰0NŸgë…A:9<¯€D´DˆÎ9^‹¶:[,\*Ü!BB"¥”ÖÁ3K2à >xÆ """ #FÁ”T]ÕRkà m±p—Óº[Ôø&FÈ”bf ÁXl*§”¢ÎÏ Mªh¹¨_ó&é‘Ô]Ú+è0•_“nW:£^ÿbD  FfD­5¢²¢¬ÿ†ô*6}mý¿ï¯ˆØU(‘0`ÛŽjÍ2*í]º¶ m²ZDÚø>Eî©Wsb>D"¢rÞËz½Þp0ÈHk$Y.*…4?>Þ{ç@$Ïs«ô°×ïõz%EÀ1ÆÅ|^×u]×bôA#0B–eƒÁ@%ó*HYVšpäv{ÖræS.“˜!2 Ñ.A"²DQ€Q9í•Z©›Hú'] 2ó|>¿³{ÿÌöΙ]“÷uŒZ! cDSW/ªz6¯êÚõ‹r{{{gw»Ì-çbÃfFPÆd)@O[YË|'ʤqËĉDî6]F)TV”gf4ìoO¶ŽNîOÇãÅòxЇ[e^¸¼YT³ùtvG«^Žb3…¢”Q-툨©—ësàtÞÆv¶0´Yä kí]¢­'…ÄšZÿ¿o9jpùàxûÖÍþÜiöîLĺÅm× Ö}m÷•kBôÊ- OXÛ©f8çšùD/côZ«‚(p$²²ÀÑÑ’t±8Ò¶˜â0 ¿yÏåk7F%EˆËå Þ¼uéÿðßýMóK=Z²È—Ÿùâg>ó'›-ãÉ`c¯nMQUÕ­[·ŽÇŸúÔ_ÿÓÏüÁèÆµ·=ñø«¯ÜøÎ—¿Œ”•E¿j¢ôz½Ú-³2¯ëZ‘,Ë~¿?Î"ûªZ̎ƪ—”µº·Y¥6F‘Æ;ãi]-³2ÊÆÍµöM(èÕÛ׬é=øÀ#?ö]8÷6½¬A¹éÐnIô¨L«-Xi yéò7±+õ“µGŽ `„ùbÖôœ _øÜ3—^9´¥2fˆˆÌ%"¦&Ž1Æ, mÒm8+ *Rdµ))‡$)aff³?ZNf¾rŠXÔ¢j ZÔj9©mnªÊçy¶¨—•÷¦.LJ˜™á0Ÿ/¦1ÔÚØ°ls ¤ÔÜ”£&Š Â‘5™à‘ó¬â!4ˆP+ óYe4c|Ýä™vÎä!:m5†HQá}©2›à|>ôGÑ9Ð9Š‘}HbŒŒ¸qe–½³š™eÕ0)¹ÞØØ˜W ï}žç|ˆPûÄNkeÇ(J©i5!£8 0ô†›‹ÅB| ¥Ø5Z ÐÄhól¹X !Š‚D) dhU²Ãl 4SˆÊSí-DO+Z{%Ìfö1©bWº*ö™‰4‘M@Dbu¢Ž›¦YVsñ!a0 "Œ@DIY«µÎŠ¢ñÞÇ與tž3š¹­ª<‹1™[ÖÓEe cÞ3Ì¡ªÆ•‘²g›f©”Mé†B l´í•ý㲋xñµ‘¨™CpMÓ£Iõ )s$ MÓŒÇÓébn ˜9&­t‚/Dè0‰ªD„ &Ž?F¦DRj ‘Ud!V€¨a¬ãáÍã—ÔE›ç{gw ËDi–¡ÌòzZͧ³éѤÌzÜÿÈæÆP‘ô!K "(–ˆ Ö(ËàTKiPWØ "¢´‚´KÀNÞγ )ÛöŠþÆ`¸1èO&“Û‡ÇÍryPß´6GYž7.ܼ}l­ÞÚÚ1º§H£  樴»#à´»ãΡS­–äò‰6ú´ÑÃÈQ süý€ß$C)stxrëöþd<{ä‘GÞõî;Ÿù³/—ýÍž€„ÀÞ×Ëzᜠµ®—ÒÄš‚Ò1zbFd``ÏÅb™g×®]«ª*å ßþödz³œjçL–)CèMaËK—oÿËÿý_î _xè‘MæÕW_½téÚææ^¯ÜñN¿ëPqùÈÃ>÷Ü÷þïÏA[û+¿òk_ùÊ—^xéÕÑæÖ­ý;'“IãcŽÑç¹mgc­5Šˆ´Ö©¿ºˆTË€´²ƒÁh÷ÌÎÖö†µ9ܾs§ªÝ|Võ7²Á¨¿YÚ":þÁ7¾þãçÞóÇ2AØÈl®8Ž ìÉôð¹gŸ¿zýöÇ?þK{gîKo é0·õÝM–Š¢€Ù“‚þP7‹ÃOú÷¿üÅϔʌ1Éi™ˆ´i«>„Ú2•j=W™#("ƒ€Â@ š€wú›V[;@Îy:žM§s›qf‰è‘%ÆFp@à¢Æ%¸ù´Ž!ÚÌ*¤ `3ÍÌV+fvu‚c¢"@ŠÚ "ðì"({ä—­pˆˆ’gWŒÒ4Þ’J­o‚ó.ˆÑbðÆ wŽÐ*¥ŠÜßW/æM–"LZ•¥1Võ"es$ 1pk‚Ê”&#@Jl¢I0ÆèC´Ö‡ÃÙdj2ÝyuEBAÁd¹ˆ±É²z¹°Š@Y¥ÆJå°A…à«"˘9²[.¨ëZD ëê³æDÍÐÕì"¢0 ³)fN%ºÎHDné8Df æÉLÃ̈mA)ÑZ@ªh÷­g›±VJ…È1JÚs C ˆJ"×uˆÑEQ)“ò»¶È)¢ Ž–ŒT€Ð4M’ÍæTh›‘g%cš¦™ÍféK¤”ÚØØjœkšÆ·þaA),3üªIÆé»íHÖGjwŒ˜JžP0Ù©v‡DDbŒu]ÇceÍÎþî`0è—™sXˆ(™Î«ùtj­ÝÝÝÝÙÝê%kbï#%n>†0‹DPÒ!uA'xïánµ|ûc'¤"ʲlcc#˲¼78>>><>žÍf¤Ç–¿y bEz4¥5)$Poθõÿ»ñ–`988¼”óõ›·Þõî'?üaúö³ß½srëð(xGÈ^"×ˉD1®æ¥fb)² 0Ž¢°QÀйÑ 2« l]ËK/^Òõäèé÷½óì¹íW¯\Éj×”ºt>îìîóZTvíæÑÅW®4M³³µ=ìÝsϹ6¶øëß~öž3ç¯ÝxñöñáÓxÿ³õý?øÃ?ùàüdºtõr6[ˆÒ‚ÐøZ[CˆN¼£R¡*‹ÕÊj¥Êž±Jknl…¤ÀEXºæö;ãÉñÑááÆö†wQ™Âf½Üöýt\5Ëk÷ Ì·¿øÍæxöÀ#÷Ýwás¸¿ppðì‹Ï_¿±åÊW^º1>vn¡þ‹¿ÿOJ›5þ’JT,Q«„E\ ׯ^ýË?ÿË?ø£?¾ôʃ¤ §z|”È>&†d®›’®‚%5Ž&TVì(ò1Bä\eEV:ªª&e‰ˆÓš2_ÎŒ1 û,ËP)£¹wf‚[,æ@¨)¼2.Ò¨6,ˆ z/631F L–©×ô³ž!crÒZ»à‰(ËŠ8CdŒU1zå59iÖØeÕ"£H$jâ|‰D\,–êåÊh›Uª¼,÷Ç ÉæŠ¬µ&³ÎóÒ5¹Î±×ë!bà˜]îM­ (‘EëÄ%JŒ’eùd<`¥UÓÔy¯ˆÂ˺êé¼v^•¡Y Q ^"7)'ºê€$ vЫ®ÂZD"¯²Ë˜Ø×T抈º QbŽmeWJX'ËeÈŽC]×®iD$9c‡ìÍ ‰òV"¹‰A”ÒI< ™Í†›£²,ûE‰¨€eåu\×õl6q®v¾&ÒÂÈÌÖæ½2O»À¦iBÎ9 "_{cŒsn2™Ðh´9D$7ªªO&“çëÆ5‘RŒá.`íɵäCLBr¤TÜœ”n"Iÿ‘˜"zï'“I]žÙÙ*ó=T¤´5M½˜N§³ébcccoows4ÔZ£0`@dæ”"Oܶ$U>@&ÝÇÕyÞ•=áµô‘1&7¹( ¥ÔÉdÒ4Þ‡¦©}áÖÍ%G2&ÓDƒ^_F`dYEÕëIÜ”~ãúÍèþÈñ–`ò>^»~û‡ÿ{ocyvÞ‡}ßÙþÛÝom]U½MÏLϾ‘â*JÅh ÇŽ’—,ˆ DŽNb(¡p=ú!z0ìHAŠå,’EI4EJ¢’3œééYzzïÚ«nÝõ¿žíËùUÝ$­W?ht·ªºê®ÿó;ß÷ý–[÷>ýééµ§¯üØ}j<9xëÖÌ5"B`žt©=YÁ: ž<ïœ÷Ö¡óÌ:$B!Àcè¢qàLpZ ‘P{;û·Þzçú/ Åì Ÿþö›ß–Qœçe»Ýde¥=ñµµ‹“ùìÊúÕß»yaóò ßâx¸š|í¿qtxðôõ§¿ûÝ·:íÞ3ןýïüQ­µ`pÿþÝX%Q’vz”ç91‘$‰q¦Ö =Ÿ³„ˆB2ÉX¬­ ¼†ÐÇi2C‰ÃãQ;mGQÌ™Ôï¼#ôþ'o~ïÆÆ…áöÅ Q,g³Ù|>0:üèÖÝÑɼ.üèDÿOÿïã¾yqûêS/¯‘Ó¦,Š|2›Ž'ù|ÞTõÌW4QBì=|t÷νº¶80VkãÕ,èh5•)€@Y:3šp Ì1àLHÉç5Zë1ƒ8N‘1E*NʲHˆÇŠÈD÷e“*É%·ºÉ’–sè½³Ö†92Kb«oT\d ™`®cÑ9DD FÍ"ðy¡8]!˜Öº®kä‚<·6Úze”ÊY^Ù† ëœY4‰µZiQÕ¦îÆi%‘jò,=à±Èc6¶¶À[;ŸNE•"W*M£…‚1ÐZÂ…‹W£V¦+OöʲÔÚrŽBk—ãÛÙT÷z½•A_H6™œNfSëH%qY9€ƒÕ&JbÆX’ehL(d —`Dn‰¯KZÖy÷B7íÎ1‘…zQJE‘RŠˆš¦ÑZÚV˜x:Œ¡"Š¢V¿MDA-æ-9b±À[KD\É,Ë’4 ~&ød´ A°h9"r¡ê¢$ë8`§ÓSJzO(ЫªÈs]Õ•ÖÚY’2bLéɃ÷¾jê¢(ò<þVÖi"²Ökm…PÃáj§ÝeŒYëeT„‡ZV99 ä¼`Ò‘ƒóÑû¹® ƒx*0Î?œq†áEvîû œÖ@„Œq@pŽÊ²ÞÙÙ[]]Ͳ¬Ûnq!Ø¢(yé½o·Û½nGHÎgœ)g!Îy<¯€‰X°¶€%Æû `tFË¢%nùðŒ!¸Ô0&„ðä†ý~’Äýéìðøøää´¢ÊySWn2™%qK¥”âœ!xçŒxˆã¯Ö¯3Lȃ£ƒ÷ß¿÷Ý·nüüÅŸúòO~áæÍoß:°ÕÔyMœ@8kùê'>øà]Î1ŠÔxrrù©«ý~²·'ës¥Ô·¾õ­ºÖív{ØïVUã4‰"Ù4Ü{cL*(BE)x«)ëµE‘%)ã`­Õº^ÌÇä¥TÅ/¿ø<[Ìò2ÏnZiÜëõz½NÖRÀùѤ|xpï›ß¹]×¶,*"Üí3Æ\ãµ¶RÆÇÇ'_ùê?ϲLÿöB ÉCë­6ÞZokwœpÆ.fMÕx!™óà¹%OÞ ;?•£×!tBuÞ óÄç ŽÞdLr•f-EQ4ž/È7’‹4M£XJ)(Ž#¥”ä) ã4uÆcmC!"7&ԲђÄ+X'MeEUQæó9¨DalnÁ"r 樂i«­dÚn3o‹ñdÑhΑs5x«"Ž„ÝnmmÃKäÜ‘ÕÞÙF×Ö9’,jÉXµ:™R¢®ëÅb~ýúuku+÷wv÷=0C “)ÆJ&‘¨êâÂ… ×_x£Ø;¾ÿ჎Ž< !XçcIGq|åò•õáb6yñÅço¼ûÞ£Ãcm=1)0*9z"ç9çIÖÉoš¦)›p† ä ŒÑ.°Ä¤’$Ic³iND¡‹O„d0¶Ü©ƒqÐê8ç$#.œBœ1ˆ(WJEJxÞ9Τ”vÉJóˆ¾ î%a÷—R !3'±u¡ äèL÷…ÖkjYÛÔÆq ¸”íVuc¬7ÎZçv Îâbn>ïëóõÃýùçúø°'çòätqóÆíï~÷íÁ þâ~죦œ•';c î9( ¡g |†’;æ&„Wd,'d½@dž‘&-tÅ£“i7KÿÑ?ü­ÿrýï®\Zÿüg|´wtÿ·ß{û®©Mœv“'‡GñÁýGœËýÃ#)ùÉѨ,KÓØý½Óngutp¤«Úë¦ÛIÍZ/–0Îs$ÓU»¥ZYŸˆ*“³Um¬m8çÖj.”ÖZ:Wׯ:Ýv<è¶¢XpŽm™—óÙb<9"Â4b/mÄq,—R´Zéç·¾L¾iH IDATÇq>Ÿß»woçÁþèxTW^©Øùj±hd+É8™U…'˜”U¥g4œe`«@D|¥7<=98=…ž$V6 €µäiZÜ'ø1¬ e˜à-…ºHž ~°€%JÀ ¤­VeuãâSQYÕI”nloͧ'eYùBJ äâ8¶Ž¬ó"NÛkívX–¥DY+®¦Áʺˆ*UMÓ0Æ6·¶V·/-fSàØ]ínãEDÑŠ;UÕÌËS盦š£7ƒµÕaox°wÒ4†«´7™UÊ‘'ÐÚΦ‹IžtÛuÑŒæùz”ª¬«’V§ÛÊÖ_R‚ySOOO÷NW†½µÁ`us>[”µó ûý­µÍKIkÐ믌òƒÓÃÝéÉ^UçRJ%¸·¶ÓJÇÇ£8ë¬m_EFJIƘ±µv<Ÿ]“Ouz`â£Û÷dzòÂöµµ­ËSSu «÷¾ÇI“MU9.ȱª¨öœ©$íð˜Ð##€Ô7MÓhÝÀcïtÎIš>@†òwiUæ¿/o' ƒ•R,$ðÞ×MYHÙ4M$yàH3ƤD%cB\!ä]®”EÎK³,Š"ƘràâX(ç-9E¢*yY–V+I’(I„P„à—£U2ŽP‰QNkçɳ¬Ýå©DO@‚@*o…j[$Î9!”ѦÓé|ž;çj_†±Éò·<[ölx O–’ôxŒˆ Bì†/Ñ0ˆ³‰0/fÓéü`ï ÛíFq*¥ªµ5žúí,‹©8COà­uVDn­%pDÏBš9C´¸l-Ñ™· yÿäÃ~ò_€ FçÍçóç%¥tÎYgx¬"9PœóVšbtrz2šL&³ùüðdE‰â‰ê¦ÿræÁ°÷/r2ý˺>~ŒˆÈ[Y'_L?ºu÷OÿäÏWVâíg~쳟ûäÝ[;·oîÚ¸’`1œC‰HŒqBŽÞ8D†¬ FäBáÇ’36.Šûàþî›ß}ûÿ£ßü»¿ú_y¤®?{ý™gÞï.‚„Íó{wî6Æ2n;;{ÞØÙt6›—ÃÕ5yç£;kkk[›ãÑi–n>õÔ%r¡=ÒN£ïòùt‘×i’v²lt:#Öd­¤®QE’1–Ä©R¾ÝêF’‹ÙlrœSc "Ö•Íš•uacóÚSW.]yzûò¥µ kÛ—¶.]Þî㦩?xÿÆ7¾þµ·Úo=ºÏæÓ;žÑNH·¨ëã‰*^]½0_LcPLŠÐ!$|lµX9g‘*£™âY–TUÕø†„GB  ¼p­a„f†·Ê‡Q¥ sçE Kž9W×:°dçMQìííI­ VU”8ïsý~Ÿ¬QB.ò™ÛÃý£ÎÊÊ…ËW™1£ñ8âØŽ".ðÂÖöÖÖ–õ¾(ÆÙ“Ód¬3zÔ÷ï9g·67Ö¶Wz­~švªRz£*{ª|¥‰ñ´óh<»p}s¥µ«>`„ˆLùÑx§¼Wk+CßDz¶[[ÛŒ@)¹½½½—§­,N$ŽºU±8˜Œ:mÛjuö÷/_¾ºy᢭Þpk^9ëÄåkÏ®® ÷ïÅÇ»w:­¬Óé3óÙdëÒÕN·•¦i`Õ:çÆ“ÓÃÃÃýcbh¬½°µÝë¯<×_:kyã»Ý´ë[,ŠX Iœycc .OGS.…PqÒꢔ°qÞ8¯„/ŠÂZsNŸJ ÎQ©eÈÀÒª¬©) wƒâyc–1!> áˆ¥“R6Uœ0ãPxnÉ{qRJ¥Tš¦Bk­³¶È«8Ž")½÷ ˆsÎzomÓ´Z­$Iy­cµÖz'PᲬÄsJsš¦I/ -_L O䜵¶Òux‚UY×u=ÎC'#çœç™ÃÐAE?]ßOÂú—/ò<¤#.1øŒ’f­AÆùYS:ÀãÜi³('''í½v»ÛéõúA²¯ƒdÖZ à­vÎù(Rn\àPE<çiî©Bà½÷ÈXÀ×ÇíIãöØQ2<˜ðµ®9—ˆèÈx푳0’pR"’Öµ®ôl6›dn»—¦-yv—?HÂú« >†lɰȡµ‰H—¿÷ûzõÊÖç>õÆ_{ñ£Þ¹sãÖÝû£&¸åÖyAã@ E0R!-0Ì%ÆnçŒAÄ+o‰9L[h«­õÕÿßûw~áþÍgž½Ì‚3³ªrd·¶z×®]kwú·îîðDMÉó^'ÉóÜ[ÌK„‘Šäú°Kd¨WWZœ!:À3eâNkȸaÙNwœ/¶‡L×{/e/ýÁZ­´ÝnG‘d %fmÕ맃aÖj'—ŸÞÚÞ|v{í€4Œ£Bžù‰õËŸþÌÞ|÷ÍÉüd4=~÷Ý7Þzóƒ÷îM§º×ï•‘‚y_Iá´@A@ÖØFJJÉÓ£#4ÄHèÒ ŒˆH8SxîËØ ˆ‚é6"‚µç{#rgs# ÒZ‹’;¢Æšn7e›Ü½{{¿ñðüÕËëòX0y¯WWz¯¾v%ëwã8uÑ ø;ÿ×?»|íâµg·¹«ì¢ÓI²­­ÍÍÍN¿W4:Š¢ýÊÄBþÓ²ßN6>ó¹Ï¾ýö[+׺\‰vÖ׳n'Ëó’<»paët”ÌæG«YëåkOU¶ÔõÉÅ‹Y·Ý/¦åôx÷þÎDÆÑ«Ÿxã©—¯÷i^xþÙ«.ˆè¨n½µø™ëºÝîÑîáï¿s¸s=󩟹²ººVÍN.]º4žŒ¶7/0!9å1OƇ{I’œŽOžzêÚÂÕ6)a$ãnmh~´7ºýžñîêÕç+[^/ ;h !z„¥À’>"F"’RZÄÆY†F’SÖ45p¦’8ÎR.#”Jq¡BV±àÞ{ë”2²vˆn9 c<°<"ã ‘!ãH 3Nž 9ȼ³¬!°&–¬•ÄÞØãÃQ;Û¯ŠFÆâÌ04Ì8g­ódÈë²öÞpÎ9–ek€O~NôD‰ØÒÇÄ?‹Á ï QÞœ‡y„ƒE Ú RL GF„Úp"\gq–DQ”Æý$‰¸ÀPXÔEiãX¶ïƒ9 ⨧ý$^rž$Ñ`ÐÛ¸°võÊÅgž¹¶¹¹±ÚZà@Á ÊsÄÕ‚³˜¬ òS©˜á¨ 2k²m|êåŸâ‘ú·àÞÃïüþW¾úÍ?ûΣ‡ûGÇMÓÔu9?^ð¬ã˜Ž!¢Üs%ã8.ŒiŒ1ç^¾suæDad ¼ ñœ¹ü!œ—×'œèõVÿô'?ó¥Ÿýr^.†kë/½øZ,cÁÆš3%På‹êâövtíª÷þøèèÂ¥í®¿põêÅél¼¹±Jä¢H:o'óæøàH±øò¥kYÖ6.n^ýÄŸåé4[‰OG£½ñÎíƒÛÆS^"R_úò¿ÛJ[í´7ìôVW¶.]ÌŸºö<">xxçÖ{÷>ØY,Š‹/òè=xCIÚQü¿÷{puÝ´Ò¬*ô[ßykxñ¥´vv$¢·f>çóÉ©â÷ïÞ¿÷àþ£½GBI`XæÕúÆæêʆ^ÔùâÑÝÛû=#¤Œ¢d6Ï«z±·wà,mo_¼|ùò3Ï^Ëóéx<®«À® /ô;mK0/+!#I)£?ù“?!,åy^H•œžN"XZcj)¥¹öV#!XWÆ;D´Öæyn­åR@¦bƘˆX¿tí°Ö.òŠs-Dƒ‚‡ü&xEäÎe¬"¥TгZÛÔumkëyÜ*P Æ9ã"Ø:.›Þ`­­ªªiÏ—ÀægEc¦§ã²*/ʲôÀÐií—IôdŒ ·=Ç7S¨‚½WhJ3ƈyï½=‹ 3c€Ç9O¶ÜÏÉ\‘ÝVÛ­y²xtt¤ër>™æÝvÚ뇮€'†ü)9?{9—ÝÏ©ðÇ€ ‰lÈ€l¾÷Þíîï~òõž»võÊæÖGŒkmŒ‹T†`Ù€'\ƃ#:³êG œ< ƒÚ毼ú©¿ù7ÿC™eàáû_~ëWÿÛ¿·uñÒý·åõ7^ûï¿ÿÞdòÁzoØ\Ñ““ÑÃý 8ŒA’DÝnkãÂZ𯗷/¹FWyžÇãÙtaµqÆAÜUd,âD´»­µµáæææ`°²¶ñô+/½òÒõ×pQV ˆ£Ç¶æËô6BL Slp”W;µ»ZpºL®ð8…ZËPò+—_ý[¿ôòßú%ûá­÷þÙ?ýo~óÏgÓÂl_zã9Ga´¯µ±BÑTçé1!.ldôX7¹lK-w*ú¾KñÉÞûsW‡ üߨ¸ØjµÞ|çÍïÝx'ŠÓ•á:ËbŠ¢DÉ”£\D‚ɺ¬òEùŸ®˜/Þ}ûÝñä8öû]àLëæÚå­u­¤5ìŽONue¬q­´ýÛð­,É®]yyãG6‡ÃÕ¬Õ©­.æ'f“i>«.¬l&qAܹuÿ¿ñõ_üÅ_¼võ¥µ_XkµZUUÍçó;wî(¥v÷>ü'¿ü3‹rÑ4Õ×¾úÕŸù©Ÿ~öÙgÓö¥(‰wööwL޽k”Dç«•þÊÅ‹ãvºyióíwoôW6ž½öÌñáÉtVMç#I6‹“Ùt1\]»téJU›éì¨Õêôºƒ¦Ñ£ÑIyœÅ,I’,±‹Ùø1ËZýÁZ’¶Ò¬Åéùij/uþÁ·›qS•ÍLW ™©IîŠHH¥”G4ÞyÆQpWÖZ€œkkm^„w¤Äç\%1":òäFΑõÖ×Z»ÆZ+„p66¦–22RGQ”¨8Š"]›²,‹ÉZ­µ–Á”@dNŠe*NØâ{KkMœÎA%$ …’Â9çÉqΣ(j¬qäCc-ø`úHäµiÊ Ë½JÊ( 7yDDçHk­›‚h)µÎc<çÒ9.!F€ÈÏéfÀ8`‚1GŽˆ1Á8´”M‡ûÒ‡“… 'd<9<#@ú>jR}ôDd½sUut|<+ò8N·[™â‚hmëªÑº‡Þ1ÎçËX°p@9­üÙYÏ<Ëœ"væ…å!“ù3^Ùù̘ˆ=™½ ó<¨ŠóV«E1çÒ˜f4M§ÓÖ¨•űˆççÔ08ohŸýùÇçnÆØÇýq`DÔÁ^°ÝÛ8™ÞŸÞ–åæÊÚ°Û@Ö4ÖØ,IG]ÖÀ`©vÁOXrDBàÀQ0`˜¶’+W.u}øû¿ök¿ñÿðó_øâ•«×¾òGö«ï¿ŽŸé¹§Ÿ~º¨ê“Ñ)yVµ‚sl·³4‹¥äqÂ×÷Ý/ŠEYdsdŒEàia6®t6. W×[ký§®]~饮n]–ð4·º)•TY8k{y2õètÿîý›·>º¹ðpïäþáÁä`o>Ÿøª„²h¬µŒ1¬W¶.¬^º´vå©õíKƒÁFë鮼þ‰Wù ¯\î~ñK¯ö»øáûwïßÛÝ^¿Ê#CUÕT¥ÎK;]Tó¼4Þ ¢`‚sÎÎ&^y²,piiú€ä!?›>®o1ì†t&B…3ïžÅbñàÁƒÕÍõÏ~ús?òéÏzÀ¢ªç󜭵V2ŠdLDw?º½ûp·¶MÝN¦¶/¼òÒ«›ëÕó|V…µ¶×îfI:ŸŽwwï14Î6{ÿúßøqÉ…«ít<ÚÛ?2q ¹ã݃£ƒÃùt´¿/ïÜýpûâæçô³¿ðoÿ %Ó;w>ÚÛÙuÞE¾X,F£cÝäÝÎÊ­îllm$iëÇâ‹ív÷µW^:>CV´·€ç¼&:Kîà¸;ƒÌðÓec–!c¬6ZÏ­µÞ¸±ué˪ ÁRFQ”ÁÎÏl4¾¯>#CŸ,!ù1£'"ËîsT¦p¸ø¡2u ¥Œa’$«ký¢XmšÊ3™LýN’¦IÜ$Zú}øsåôÛ2â_ÚÐ…¿h}ìØjg¯+]75aÔëõªÆÍË:XÝ!’sÆ™fÙ’q`ƒa*µÔ€â‚1æ¬gˆ à È8G†èg³y+² ùú¯mm­?xpäŸúñŸýén¯sp¼÷ÑGMîÞ”õÑáÉÅ‹›Y+‚õúm!Øl~:NŽwwO1œA«õ;ÝAo¸µuqc}ó/\ßØØ¸råêúÚV¢º1ƒ„]7Èq<'s²ÿèÞ·¿ýÞ{ïž–í"o¦“j6­3çu¾(«ªÚ›‘³ Dœ¥8V²Í»™hµ²µ¡ÛX[W"™×§ï¼?}sÞü¾?nntžîê+¯?ÕnAStÚîÊå~¯LJJ)]ÕãÑDIÌ:m¡d¥+_y!p@DOälèR¹êΊ›ð¾|ßÙÿ Ç‚°IqÎýYf0ñÝï¾uïÁýÍ‹[Y»µÈ‹ÑxZTu>:Íó¼×ëõ;ݪªö뺾zõš®ÍÁþ~]×7oÞ4NO¥TÖjéÂ$±bóÙ¤jªyžƒ0“éÑøŸœ¬ †®¶‹YN„ž Ô¦ÖMc­-ŠŠ¨ú_Ó+++­4ëõzöÊŸüé×ïÞ½-¥ŒbÎkšz<ìžh­wv®n¬K~£˜w>ºûþÍ÷>|÷~Ó4O=óôÆóÏÅê…Å|rçÖ»“Ù¸½;wï®no7ÎÍóüøxôÑ­>|ˆ‹ùt|*¥$çò²4žœœTUS›ùææv§Í¶¶¶ONŽßþÞw…bΛ¦lÀgÜZŸ¥uˆ\fíöß~óßú ÏF§§J%‡%†½<9o¸diÇY–­uʲ,yY–Þ9ïÀo­‹RÞ Ddœ)¥Z­r6v¹¶qÖHHà­ÓÞª(òÞŸÓ†•Rà1I’ÅéÈB.A ›ó2ˆ(HŠÉŸ÷T©È:çÉ¡0— ó@H 8Ç(²Ö¹3?“H9ç$g äb¡ Qzï‰1æ½uއøH©¢Ð”,Øš±Ð$ç ÷Þ{k wÎx è92 C‚!(ñlÜ‚Eœ#GD„e,$ây…µÖjC9q –±º®*Ûh]×ä„®4cL)EQ’DŒÃùµKt_mŸ¼¾ž¸½”!", ÏHDÀ1Œ~‰È;癥p(B~ ~%"d‹±Rk«ƒº*NO'‹ù|Qäín'Jb`!ÕÙò×ñ/ºü?VëcÀ!ʃé?0ç\p@Š[Ñî(¯jí´Ç¼sä-C|€ˆÃWlnr‰Ì-÷Î{kà£[·%j?ý¯ù§þgç·ÿÏoÝúúŸíw¿º88ÚϦI’\ÜÜ~íW_~ñ•Íõ^+çµ M=O&³ÃÃÃÊI%xœÈH ÅE¯Ó½våÚåËW¯<}ÍCÞ*©#õ¼¼;=8¸ùÞoûÛ7Þywçd6-›šfÖx\2‰‡-Ö{áZ›³8Žº­tØiƒ•ÍÁ`0Xgq2ONŽÊ²ÄˆŽNNƳýK¯îï~8½/˜NÒ8‰[R ŒŸ=z°3:8BÁ˪™¥ÑöÙk×1åýNß;s|tT,YÚ–LŸŒÆŒóûj];çd$œsY‡ÝT7ë´²všÅQ”̸H÷ï?ÚÛÝEàÈ™ˆ\¸˜ÏÆÞ9mT£K ÷î;ßóÖ]¾òôîÃ{³ñ)óÚBÖ³$)zwçAU›×d4JOÿÅ}ýsŸýôáîñ|>Ú¼°õ©O¾‘çyÇö ‡‡‡·ìÚµŠÄÓWŸrãÑèý·oÜ|ïír:-N›f©èBTÚ8òBEN§Ûí–E= Ò4yðð‘™/¦Q;ÊóœŒ7Îú"ÆTšóºYô{-:[u] !{Ã.´RW>ÈD@À‰K.Re­–±Ö’×Z{ëcqCo­%k€£8/ã¼×Þ[" 9ãœó0b´Ö2HÀsaÄjŒ÷^ dŒOÎ…ù³!j—9-Q#œ#€'y™ è˜g^km¼kŒfŒ¥išFq^¶Tz ` ॒ÞûØ'„àL€÷\›&¤ Á”sÆ{ÏãbI>àÀ9çÏc¬BœqŽB0!9‡äØyÿ™–ò£åîC~<<†¶ö2á1ér ç­#§AIÆYg½˜N’X%Iì-òˆs&…(8CzòÅïŸÔž£òùnHOØV/ÅáÚ\f}±@¿â´„^oÝya gþˆ÷^›Z‘fñp8¨ªæt4™.æÝºŸeçÈGBz±äc‹»çëcÀBr"(¢Vê#£7×מ»v•·úß?OjÝ RGD†#YΘàŒKZšº :@À ¬Ã¥Ã-’%2Þv:ÙÛoßüõ_ÿõ_ù•ÿ˜¯ó£¿þ ?ðsM]Àí{·?ºs;ËÚÏ>}ýâÆ%µÀ—ÀÀX°u]7œËºÒ¢³.ãà­¯mS3àqÒ@p%,° z|¸÷ð£ßôèÑááÁƒnÝ~prRh[Ó×Õ…¦áØžh]WUåÉĉëZÕV»“ªîÊ`Ø[[[éõ³8auY4/ßù½Q¹hžÌ2Ù__»´±~}c°–ˆ“õA¯?ì¥i<Ó¬=Ÿç§§“µjVy>7EnŒŸœ–{G£²ÊÃI’#ë½wà}0ªÙYtùã й1.íq1ø ;k¥”¡â!¢`YÕjµKBVåÕìä8“*Š“¨µ²²nM}éÒvÝä'‡GµRYÒ²Ún]½4™Ïdœ b$" Ökoš¦òij$Ig<¬®l_Ü|¦?‚}·ÓÂãƒ\È‚œ@`Žvbä*™žpeiŸ&Q«Lò˜È9é”RmmE³Éxûâ•~»?ì®6¹Vm¯oï<º×t”à§§§q”®¯]ØØº²sp”³õMïLSšõÞP±Æ@]µÕ8µÖ:KÖÚ|>GkkkƒÁ…4M¥ÓÓSctEÆøv»e-ä’,qdZ[OÌ{ÔGž¿ò2` Óm9ë9ÇY>oG ¡Ç=c½iL]72jªñ¤(ŠF[`BÅJrÁ‘1m k­ ¡ôÞåy¶aã4rˆb‰ˆŒ8ÃûÒäviÅaƒï£·¤µN2Æ™ôsBI ãŒ,…¯—]ëPdQ°á…ÓØ2}ÒÚªª¼õá6Mã4xïC®s$•qZJæ¢N›º®ƒ¥†uõ’m랤pŽJ)ÆÀû¥ÃÔy E°‘ñgv#@O–q¯òä} 8àò.€‚´€¼@Žà YyDï=BPè…Ë<‚G€xï™#HÖUyqppÀ9‡BI)#¥b¼·ç5ÆV$âgßy¼²Çs\+$ç¿ù›¿yóÝï¼üÊõ×ßxé¥W_ò@-î'‹ùÞÃê|²ÒS¶8}t{F–˜„Õµ~K1k z’I"¥ !¼¿«>™í> ŒÐ;»³EéA1fˆÜééI’dRˆ»·>ÌgÓ­õµÓzÚ ¬µRF±ŠOŽ"Å…PJÆ'''eY€”rãÂÚ´Ö—WÖVC§Í½;wNŽ­"!ÙŸýÙ×9kEu]Wש2kÝ.Á\Â[mÁ5Ö‘©MÅëù<"†˜$‰ä Èy².MSï=X¯ª*cŒq6Ž ‹"Å' ŒXEYÒŠA•eÏMÓä6×Z‡ºl Â3T*iÖjw2`P×åÎÝ»¡â<d.;«l Áq:ÜöÞ×UCœyŽžˆs®¤dÖ–ÚxÅÏÑ:4TCö‘à&$<3BO›3Æ€s&¥b‰€¾ªï½1Æ‹¸¤5xïk|\àãÈ|h9>Át>xDÞÑ’ÉxÆ4& Ö¦³:µÉäŒ 8Yä¼Ñõb:“Œ:Y+MÓ–’ËàшÎþ ƒÕ“÷çÙyãì6–88·ìX…ª<ð0€"ž¿/çKk-$GDOKÉÓ4Ͳlw²ŸçyUUAI¢M¼÷p6S²(ÿ+þË¿<åZ×qÔõ.êu²ÑáÑO~ñgž{ö*ùΧ÷®¤íIÞÔu-/ªÂ PRÅ*e(É: šÐ! iÐ+Δ„3`wØÒð^YøY==ºñ½7oÿöïün¶¯lö^¹|eumóöí{G‡ãõM©øäôt2=e”w:ƒ$n!SI­®õ†ë$åC1œ/¦Áö¸/ôƒ“ý£É£;÷¼¡ªt‹™žÏЦqœIaÓY8eã ‘G]qctkò²}¾?¼Ðx9ˆ¶%he"{{—.v˜Ñ°óÞí[‹¦1¶‡QL‚AÒNx†‘‘ó.Èÿ½õÄB‰ DDŽ>žZ7Ž€»\zïš$JÉ:kMšÈ´Û^ß^3È•¦ß£áã¼®êÅbqxð.CUæ«Ui<¨Õ͋ݵîTO&û3 ·ÿèa+ËÒÎpee%o*&…HcÒÖ5šÏæ76Mµ8Ù½MD••7ßÛñ¶Jµ[ki§K\xࣣãU¥b&ŠÑdw^Ñb±XÌödÚê¬u¼L⤽¾¶ÆŒ;Ü?Øßoâ^§0æÎÃÛ£ý8Žg³ÙÃÇÜMƒÁGï=Ø?¾zõêµd»×©,¼såîƒöÐ{p¸C <Œ£Ô¶Üæ•kÛW®ÄqüÁ»ïN&“º®E¯s:›+ÕèÊMOg‹ùÄêæhïP­v^{ýQÒyþ¹WVÞ~ç›ßøã“ƒ^Ëhã¯\~Ößÿ¶É›•Õ6ÐB¢ITâÐgY›<ŽÇ“j¬ØÆ•zQXÇ”RRH"ÇT[Œ¦œUäMÝxŽRJkµ5…`àJÆ9Gɸ` % :ƒÁ@¨+‡‡û:Xê£EpŽ÷ž¤è‰îyWõý˜øHî‚dN{OV †t/‹šs)YâÈs äHÌ4vAœ8H²Îιƒ1&k·8J¥”àÖu]’ot£çˆhi7*l¦& ­5‘DÄ0>1¥5ZÛÆxëóàÈhÐN2äŒcH`­å’#@âgƒ`Ȥ†ÁŒ<#D$Àc¡AKï=!0Æçó¹±e’ÆÝaom}5Ib%$"ïEHÅ$F.œ*‚ñ A( ž°~7Éœi…Ÿ`~€ å$8/+£8#ï"pÎÀ1yåÕˆHž¢ˆÓHÅ\B4:·[i¯³ ÌY`Ê©å †¼—"âœkmÊ¢P©r€p–<ø$IË:ÿW ÿ ×Ç€‹qí¶JÓøƒ÷¿÷Ó?õ#_úÉϱ˜ßüã·>¸}ïðø´öÂj5&8gµÁHÏ{‡ä<¢Œ#`èƒen€ kt@dÈ`5õué‹¢4¾Ô‡Óúôö;÷ï?Ø=XGq›ÝøÞÛv!b¯­ˆš££“ª4F[lábQ,3¥â$Išª.ËÒ{ß[¾öÉO¼üê+²•¢ó_ÿïïx„Éd’çy¿ß§¨5Wuž¦ª=è=í™/ýìÏ>÷â‹ó¼~ï·ÿðwÿùÝ>ˆ…(ËÂYÝív§‹¼È®<ÿÒO|é'•Š[qúû¿÷ÿ£ûL2ºœÛ|: ›k«IÔß98úÂó¯ÿÿÑ//Šòꥭ?üýÿçÖíÊÑa]×V !rÁUš¦QÜB¤Åb¡µ¾zõêñxüÊ+¯ôzÝn÷x¯Ã˜¯m¥œ‹v+nµ6–zI®ª¼*f3Øm·&Ç8O fÊdàÔÆ¢wŒÐX?賬MÆRQÖy1·Úzo£(uÎUÆzïA~*¥¬<CÆ8óž¬õä zÔË´ÝàtŸq’¦­vÚnuašªn  'ç9,“€a™r?uÎÍf3ïøÙQŒ‘Gƒž´³ˆœúÿÉ{³fÛ®ëFµlv.n'3Îe]•ãÑSOÿØOþôßxä‰AˆÓéôæ;×ïÞ¾ëŒ GDF>üÄ#ˆºx0ÞÚüÙ¿û ÿÙßû/‰møä'?ÙTõ«ßq9›M%’ºœËòÂ`ëB´ù‡~ôÇ{âÉ«W¯=üÄã_}øú«ß‰1t^¤ëº:·½=u»ø[Ÿÿ¹K>b\ö¯¿øÅßþíÿ»üÆ×z2}Ú¦¡ASðj–åÆ@1çxàrÛwƒ"Ï2kŒ!cC]‡ºm¹J¶øì,Áöä—.gnpawïxÿ®e`Ô|¿èF°u]«ªqÜ·¡h=›@dœ±…±ÞûCš£ 1ƨÖ9çZccŒ‹eí{A¶–"€‰1D0fÕŽ=C¸ÓÓSï½tUU¶ybô= "éBÀHD˜AµXömçûØ4MŒ9’j”ÎK¤T•Ù& "æyePU‹¦®¸šµé•Ð äRÜoQyž—e™U»•»õ »u¯15ÎIô‡ˆ`8ɰÏc¶ª"2`HbL@ fvÎõÁ¯ü&“áU’lËsߪÉj I¢ÞesqÖ|IÁ‚„€˜úÊÙbÑÏg‹ »!Gƒ¬D,²2N_=Oš¶×³Œ±÷ÿÀJr±~g {67|îUâJ3 ˆëpIU«”NZC`DLÑ)m[Ïf³j¹]äfFcXÉ "’bT â£"VM`&ˆ"ÖfÁ÷Þ{° Aàýx|àX#Xk«êØ·Çï¿ø_úO~`ñìWÿìÙ¯ÿÕ;·<€1™ÂŠf1f¥u&"Ätc0¤ÀH9‹„ ¥M9 tΑ Gãñ¤jú ;›<òXéxQ-—uð=Óüð-›åÆelÉ) °Fí²ñ5d2ë,qŒÒ‡¶÷ýx"€Áå!fÐgªd8[œL³å݃Ãù²Lʽ‡.î^Üýð§>|qïçww/.Ã윦o}窟Öó›GÓ›ÇÕ¢®c;í›Y»ìŽØ2;¦¬,ËSêc7¿=°Ylû€[ûË©²Ù…WŸ¯ÇÏü›õeÑŽóî­7omm =²× Q@V²Ž•üz‡°Šü%%MÀçvÜgªA@A*AbA4šŒ/Þwé'úg^xá…oüå·'ÃÑã>ö‰O~ªªš7ß|3x‰SY&Û&úãh4šÏçeY†¶v¶ËÉ(/?üàÞåKÿͯþýßýÿ÷‘G]6õb¹ÜÞØ<™MsëB%ãñ¸ÈÖÚzäéL ïÿýÞÅûG)C·,1zW¸¾­Ž†ã-Ûr4š\¼xIG›B˜¬ª¶ëÄZ›1°†v9ëªy±µ½xôÄÓÿìg?û¹Ï¾ï»“ùb¸µ¹¸þv¼ïµ ]º<Ï‚ôÄ ª“í£ÃÃGyh>Ÿž߸u›$B ïÛÚµ®n,$jáô¸¾´{qûÂÞ|:{õû/^»úÖr¾`0Є €¨©»¨ZbÑVMßîçÙÂ×÷¾ È ‹‚ú¾CDiÛ6ô^U›j)Àh§ Ì"A£FŒg󻨪MÓ´m{ppÐcA)HÑ ªÄ>9´q"'’:Z±\mÈ„d¥V Â(g_DtÎEÉó†SF”ÐSìbc5`Ê£¶žd´ûÈedoß¹³¼þNµèÛ¦/J‡ :{êš:`„>„~—J ^]æÀ Ĩ>Ä wO|€e–UèZa0—çY–OÂîæÎãOÞÿ‰ýÈh0ÞÞÞ¼tßÞÆÆ8’XµZ5²ìdÿäè«W®½ó¶1}{RË¢P™Û¼‰á¸n}_N6½†N‚ö#¢’c) ³é{©O{;,fºzð¿ýï¿üàåË>ÖÄùüÁìß=i_äÈŠ²GAHÆî )­á]•nšïsËÓêƒJ´1‰ù !$“£dø°¿¿ÿꫯ¾öÚk¹u³ÙìË÷ôãck^á¥j>ï— ‰‰ú¦|Œ'''ÓétYWÅp°7(Š¢˜L&_øÂ¢ßûîwS¹yx|4(J"êÛv¹\NÆ›QáµW^ÿ³?þ“~èW~þj¾ñÕ¯^yóõ¾k—³YS-ËAžwóæM!;ÙŠwoÝ|ã•W\Y|ﯞóõ—Û¶mšÖä¤÷¾ïû®ë¸éÛ>~ãkÏ5M÷ôÇ⥗^¼úæÕÓÃSUðÞ‹Pð¾#D„ªZ bPi|øýßÿý§>òäááá[o\‰]çCß÷)}¢]PU4lØU³£¿zþ;6sˆxxxB(ËÜ0öÒ$ƒ@ô>ø¼3]䨡®zUH¶P€‚x¿2Ü€•TXCA|ŒQ@"¨¨‰*&c ŒïªóÝDDLöËЧ$IZ[0!‘ɘÇH ¢ÄÀÖ˜:Ù´!##YÃL¾íp­Ž!$´&¢á`œžŽU5YhQ«Pá³r6!.;—ÞÑ'æùÌj•/¢š¼`}¿Š=¦• $àQäu„OzËD¤DÄdÖåzìHW_N—=!⪃„*aÓ÷ÐýœFI!1Þ«;¨ï3.æÕõëׇãr0̶³-‘dú¸ª€ÏãzÚmàkÇÉÕqž`‡5õ}ö%€w¥*$øEÕ´!J§CÞ‡tbÓ9ì:ß6>„ˆIê‚H1†tÑu~6›žÌf³ºÞç”(/&@ÞŸå/| ¸¿°7üÄÇ~âþæý¡yâ»ßxî¾ôß|îµÙ¢'2.Ï€œö}ô¤g$Åò¢F‘bcP1jPE<†µ÷¾©¤*Ê2ôÒƒ`f‡§ãìtº1î\ºPn7/íÍçGÓÓã7—!ø¾ï[߆Ö+Š‚µ×_;`B4 ‰ý¶y–åùÖæƒãò¡ËÃ|”—3f£bTžŒ “í0'k…%ôÕrqãðî­jÿðh~tÒ6fK8›5¾·™³ÕÕzч&ZSD ÜØ03CðÁwêEuêrRKvÖäÚô€ºš ‡ýÉ£ŒþçòO«¶äƒyuø…/þÎlº,ò1(‰ï¢ Š˜D@PˆÖþv€Š?ô³B4H„Q Š3&ϲ¶nn¼s}÷G?õ©OýÍÏ~öàÎÝï¿ðâ;×®Y^dyQ–§³ñ,ÊL<¶M§³, !īŲªªª®ŸùòŸ"ÓÖhòÆË¯¾ýú™Ëó<ó²(³üúõ›a2ÙœŸþË/~ṯ?Ë™³àÞ|ýãýƒ®Z‚‚µÖØlº¬}ÛN¶ úÚ /¼ü½·/lÌNîAŒI Uò>)3#rß÷uµüÆWŸ=¼sû ÿâÿ‰1ö]mËÖø¨D h˜úNŒ1l\Û¶ÇwnÞ¼±i“Í”\& …E$*ZtÎåÕ¼ºuû:2 BÁ±a´½ÃÍ­ v ÈJn«Q¢aBˆ^ÐZËDdˆ€3—@èýйUµÆXk‘Äé¢xß "¦ø£Ìâ ‰„dfÌÖÖfQ”Ñ’]‰ž@˜}Œ!˲d‹’¼þ‘T…I˜XZ$D–ˆ Ú»®‹Œ1v³A ¥!]bDéVúdõœP'Ë2t+õyþ™bT¿Šb"g-$+¯u€€®‘am˜DÏfê’¢À$kÌW0Ü«σëÚªò Wýš4€÷,;’U«¦"D ÆØûããã[·nïîîŽÆE™ ®ÅVg«÷ÿ®TijCè=¼ú…ëtnG|ï³·öD$ëF;%—@I5 … uÝvmEØDõ˺=>>=<<<=µm‹ˆ„V×Ûám¢ç_Èûéøà0µ¿üË?ûK¿ø7Ÿzê‘›o¾üÅßù—/|÷Í›ï,™'Ž• JP‘à5ˆ˜\WÅEESRù cƒd”95n¬q¨é=)’!çØyïûÖÕ3zéõóYwac|qgsc<Ø)F[£ÍK[»áòP$ª‘ Ñ«*¡"¢HddKLˆ@ ³"/†EaG¦ÈÜ0§ £ô¡›‡f!}3;˜Íd®á‰H]×ûGûG'‡§ËªëBkMÙ÷¡™«3p¶ “,“A.Èuˆ>xÐĽ8ƒ–­ {ï».´­×åæ–ãy߆zTšvq(}üÿê—r{Qm Ðü«ýÅ££»1êrQ=üÐã7o]‘Q€’‹¡DEe&9·¨*¬ã–å‡ðL D}×kˆÅ`X¸ìôèø¯žÿμÓñx|ioOBÜÛÙU‘å|á;_×µHà‚ €1䃌iåuÙVMn]á2UŸüáïý»o=÷õkW®.§³ÌåEžÇ­sÓÙ¬ê— 8ÈͲYÞ¼zõàîu}ì3ë µ6ËŠ‘W‚ÐÂåô¤i:”z±l—CËùpœV+ï½h—pE›r4¨«Å¸Ìo^»’Ùˆ0uhÝX=A…39ôÁ×ÚUË%õÇËÃyu0Ýå°ØØ¹` ÜF°ÄÖd–sÁ÷½† ª6LT¸b<eY!É#—°[ž4 '3lzlß-ûnÞĦkë·Cºê˶ñ¡ßD߆}fÙ±ôS qÇ‘!ÑnÚV޲²éù¤í|PË6SµŸ›ÂraÑr4œLþ@° w‡ƒ‰¨ïêåÆdÒ-tg2þ_þ§ Jˆ¶îŸùÊ——ÕÌûxqïþÃӕÖ·1¤Ù¢•Ÿ'®ôÏ ÷nþ³!à{ `pÎED"ʲ̋“ÅìèèèÕ«7ʲd$ƒ4s—ïß¾ÃmllŒ'EßU¡ëƒNƈ,\T‹¥A*‹bssÓ‡p²˜‰7okç}à¡Ðõª:_.²,NƦÉBò¼ÜœlŒGƒ>4A}ÐÎA~zrú8ŒhbÛ—ËŠ]æÛ0ØÍ&££q6o»zàxcc<¯»D~Gyj@6]›A¹9 Šrs4>><)³¼­›ŸþÄ'ß9¸ž¸ÔMgÏ7™8‘8æ}ß¶m»³³ëòáý÷?pt:÷ PL äØΕü²š kQGã­ñ–ãLƒÞ:|'AOA@-1%w"&Ë-€”ü#Lj­kºŽˆÀÚBXw‚cŒHÁ˜Ì9ÛܰCäè;ßõ}Ýž˜ˆx¡†V|1„Þ·mÛô=¢MvÃ1ÆU†|b­µ5jSv®JÑGß+D‡è“…4'~¸c£Ö²÷½c“—ÅæöVfÝb±lš¦îZ +æ9±ÐDäœË²,ÉñÒkKœF™YWü¹÷¾ëºwA/œùEܱÅ$8M®Ê+¬%2ˆJ ¬˜ `í ú¬¦|Ïq°Ï|ú€¼ï4btrrrýúÍÉÆÖp0Þ¸ß[ëR?8ð¹^ï=z`íE÷®ý®m7~€»D%JL9;?¹±kÈ×3òÙ“XßÇå¢Z,]·‘gÆ÷îáþþþÝ»wÛ¶Ïó|{{k{{{2™0£–à  IDATsÜú•’ Š`¹çŸõ~:>p A/^xø—¿ûÅ/üîþ»¯Ý=j‚¶ÊSÓRJà(zghPt(Y‘.6Q‘G/‚žÐE4A0 GQ-ƒG­8‡¹öÐÖ•—((s¿€º:lO—Åèd¾(r3ÈutóÕÒ!Ù‹&#“‘qÌ„,ÀXàv<”›™˜FuÒÈbÑÍb3RÁjQuË–@å¡ñ9ºd Èø˜už|p¡Ò…’jä cUM몷ɶÍ,Zc²"‘(ˆD£QŽ|l›\Õ1x^"*²ü± ðµÁŠ&„:Zì5V¡Û¾´òÒNÆã½ »Æ˜¨H™ FõG>ü¡¾“kW®•åæËе£A9ŸÇ“r¨Å0,— ídsc·ÜÝ §'‡G‡ûÑWÆfÆfÄÖc¶CXUU¼+‡›{—·/ìÝOÃÅòôö­·û£»¾mëèýx8*‹Iá²ãã£zQ66O«úÓŸýœ(f=øÚK/ì_»Æ Ô÷ /–uemŽF'wÛ¦™línÝ÷ÀÓýäp¼yrüö+/¼ñæ+Wc]#÷½TMˆÙ¤t…êÉñ’ç0ÙxôGb0ÜZ,«.çaáý­ïçÆe¹«ëPw}>rM×gÎ1Ç®« ñîîná²ét:j !„¨h[«H^µÐeG@ŽÝÅû.íììžLO¯]»v<ÝGD%Eg ×Û^U³,ëºn8^¾¼WÅááá¼¾S÷¾ƒÊ’$A^´ª%DõB`ØfJ mïÛe½Xâ)ùDœ{ß™à­cê[Oyî°´1Œ'ãÍÜÎæÓYÓ4ºîݪ¦LQìc蛄¢c/ú¾ïÛ&ô­Š¨c5*‘"[“ÆùV²ßu‡•R_“Q @Š 0Æ s{R&Ä! :5 ʨQU£¨ I‚,RÄsAIšò”’{.’2 † ˆh8³Æöܾsck{ä{ƒÁ Ë­÷!ÆhŒA䂾ÛárõÃU##Z FJï( FU£¼j<¯ü«!ùº[©˜Á¨$.]IÛλ¬ðÞqTEÁ¢tuÓYgŒ¡ûyµ¨š¦2«ªƒÃýÛ·î, U½xqwooosss0dYfŒó>&#Ú%V|¢/|˜³o~åÙ/é÷žýês·î.½¢:D’^Å+‘ ö€FRr.Z%eŒ*±€Ñ`D9 òˆ@4X„Ð{c’bF" %¨ñ}\„ªZÄ)Ç Õ0¨’!tDÌlаŒnåñÈw‡uÓõêÕÄ`º ú ۦLV¹´YƒK6 A¼ ‘jŒ5J@U!‹Â"A)!’qÄDQ½D• I…hѲAf‡y>=˜Š!"Fv¿ök¿.¹Ñ[ûׯ\yëèè¨ë*‹†¦]êéìʪ#¶ÒS¦*@`5¾˜îyHU26_TKkÝÎÞîÆÖö¢Z¶M;ÚÜ9lÞkwhf¢Zu «Ù¼9‚F›[@Å0½€º®ëº>:™N糬,.ßÿàÃÛ{£Ñˆ\þý¾Wކ†u:.ªN´Q릙͗MÝOÆ|iPþø=­Á¿ùÚKÓÙIh}–e}”“£ƒA™UÕ¢È,Yêú &<õÐ#ŸùÜçðÉéÉáW¿ú§ú'ÿþôø Ì³èý|~Úˆ>þÈ#ùÔG~îþîh¸±¬ö‡ÅWçÇÕ­kWºj¡sYI §ÓãÝ‹—\^nní~ì£Oö±zùå7‹bpߥKwë#"€û$àY.k”CH’™Ìºd…ˆg“¯éìáº$hÌœ ÏóD/]fDX• E­¨ÕPÍ‘€UQE4DUeV” A4¨FQvY AÙ#ƒ¢ˆFG(½¨"jŒ,äÈs᪂„”c˜À‘5†p‘ùÖ÷mPå(ÒÆÎK0l¸ŒˆCO¬cg2kÈäEQ5 1$Ó|D5"@Š1¨Še@õ¬d#`Œ¬WK‚*JX½x¤ªP/*šCä,1£Ífe‘û¾ò±Þ—¿ðóÿ鯿E€ `öÏþÉk¯¼¶˜õÎf@ ‚mˆfgöž[JÒn:uÑŸ°2çµZ™á´L÷mçòŒ8Ëc[NÕr¼¹qÿpȨ̀óÙ[7›®nlŒ&c³ÖÙÁÞ…K[[;Õbf-wÒGªªêºÕÌd[[[Y1Œ†ãÍO~îo†“­ñä£ÿô²®ûf9Ÿ)Ša01F4åî}—}„ÑpûÁ'=œMŸxüñbX,êå;W¯°ARQ³“Å`< w W”cwù‘GŸøÈG†“­?þÊW?ù“ûäg>{ëÎõo>÷ïs!wL<›Íe>ÙÜØÚ»ðУ™<ûÖ׿þë|ý¥ÞÊ2Eï½5”ûÖïììš";896œýØG?6Íÿá?þ'¿û…> ³ÌfŽXÙê»VâÌ MS÷uÛ7|Y˜ £±1¡(;Ûþ$.ß×uMD6ÏU !5,“jF×!gVÌðîå»mÛÔŒáº>99Iî]Ófnz¡ÕÊ›ÔðÁ7ÖÚdµ‘f“R±,Æc×úˆ „ c1dLêƒg1Æ¡qV"(¢a«ª¨´–Ó#(‚"Dˆ1Vóå¡γe×uռѰï¤]D"Y‰1:)fY^–9ÔuUUUôézdZÉ|Jг\ @Lo'iyèÌÃ|í(µ·1+ÅØy¯`€ˆX%UuQQˆ…ÎÕxzNs´>óçG€îÉ’Ó3"hß…ããcÌÞ}{L6ÏJk-(­ñqeáù®…pÕè¡T'/Ød”sö‰Ÿ=ì ƒ™9 ••œJU@…-žQÐpnmÕ\@5–êfyëVo-j–e;;;{{{£ÑÈ9÷ƒ òÈñྋ¯¼~õÛ'efÀ’Wìú^€KCˆÈ2(©bß 1cÊ4 @輪B∪Ld(‰™œqÖ2Fˆ!z/~@ÄŒh#Y5윀ºD@ƒD!Fqf!ºnÖ¶uƒ¢e–eì$x”²0ˆµ¡ñ!FÌ(ÔÚ5m ©j  B*ŠÀ¨^0!`"gLFh˜Y5ôØËº+$"Ú’ˆ€^ ŠŠ( F%P†hH$¶ó|k¸¬—qgû¾ÿþ¿ûG]+YNuµÿìŸÿé­·U˜D}U4?(šÀ¼ïÞƒ¯þ?5…‰4‚¨®¦3™y:ªj9ǨÄÙÞ¥KrçvÓˤ£Á DðÇ-uKìƒ4MÓ,:_Úl²½Ñ·ÝÑÑQÓ7ª±}Ô•6má£Ñ(ÏóM¦Ë>ð¡ý±¾õ£¼¼¸{¡o¼sõàöõ,7™HœMç^ec{{0ܸpiï‘=þ½ï¿1Ø—ƒ¼ «¶éç-3#´¤ëº^V gåãåðâ¥Ë[;;Ÿþ©Ï?ûìΆ‹Ò’ÚLFâb±¨ªŠK2cHV‹(f=Ÿ³ú¬Uµiš.5•ÒDV¤+¿)DE$R ` ÊI’m­¡ 1ƘB„ÒSÊVµ_± &µmÛú®ëÚ¶&€5œ¿ 1¹ÛÜÜÜØØ€(‡‡‡mã1å# hT *ˆÀL”|>R0Ÿ*$H‚ßÄå®&n¬ 4%"ªIË’èVäuü×»Ú±ç â³³˜.„@@žÙ ‘ˆÖU{||rãÆ-*ËádâVƒU"ºžúÁTbÒ•(5{D•àÌíù¬¢=›ÚJ;äî«öµ®$ iPêì)B}çE ÏóÑh` ÷}oL9·¶7wvv666Òw‰èûUlõÃŽ»,OÑä©ï{4VMfijô±#r‚ŒJ!"˜Œˆ˜Ø !22¦˜Ra«4z0ÈÌìØ0aÕZQõ1ª1dÐcI¼¢D0!r ½¨Uõ£h”Øjoš¶Y@*yf¬ÄèŒ)ó2/²‚Ž*y9ÐeSG ³YÀ"pÆV\æ±µ–± ³¢†ÀûhW*)M6S*bŠb@f6NѪB2LfÓãܪeû™Ï|ö©< ñkÏ=óío??=m¬ÉcÔ¶«Ó¢{¶™=cºV,½‡hBÔdkG ŒabVDÈó‘ŽŽïøá§žüH9nÙ"Ï󣓛¹iµØÞÙŒG}ßçƒqSÕÒÕËéé²®|_#ªHl|´Äyž·m{ãÆ —ÅÅË÷=öØc>ü˜zõû/¦ÅÔd3ÔË*Ë2U<:<=:™&Ö•}ßî?úiKüò /Þ¼y{1_ªµyVÖUJι٢yù¥/Þ÷À`4¾°uéµ×_~öÏþèåW^ˆ¾s™±è¢‹)<þxÿn9 'ã[7nüοømWb5û굺šd\ÙD D_d¥ÝÜl;pëÅמýÊÑÑ‘°Á+¯¼yëæÛ¡k€ˆÝh·_|ìþÇÇ“Ñd4<<¸ûÖÕ7Þ¹þ¥qßÖŸ†Ö­ºÌZkUµ±mƒƒ k¹oè}Ó4ÉÇ1Ò5£¸¦¦„v2(ƒ F !Š,€Ð"Fñkߨ³‹ Y<ê:* m‰ Š÷ADˆX„CD­µ6Ë”©‹mˆ‘ Â9 Á5˜hD6ÄŒ hÙ"¤wùI­]5DaµÛ°Ö:ç Šµ™µY4E‰5RˆE¼Ißkˆ1õsDDÄØÕëy;p"1ˆø¶m}‚(EX…ª áÙd´®°Îþy½é÷¤ÓFD A£"“aèû°˜7WÞz;ȳ‘)Ë‘àÝgì½ ¢¤9®¦TuÍð¯´Ðg¬+¿j$¢Uu­¨ª¢rŽ)YÕåÉ€¬®[U-Ër2cD`2™looonƒs.Mr§~½OµV?ôøÀ00[c\TrÎf>,I0Wb@Šˆ¨‰_bŒÑ€Dˆ@ɨHŒ "¨ H¤ÊQI”8ªz 1F„XX㬩ÂB˜ †à¨²i‚´}'½A$"•äN= ˆi(óyNEc×j}è£×ë¶FÃ$ª}½ô1DŽ€˜Ø1Å¢ˆ")‚0ú@‘õWÞo²¶J@0ËŒ€¬²Ùœac4‚úˆª–¡Ï3þÿWA8Nç‡_~æOnÝ9Š1–[U»ð}«@€ÿAB “f€“¹’&ú1­“ª" D«]Ž®ÜŽrñ¡n›·ÞxSU?ôćŸØzŠw†mŒsãëL»ˆ­ÓrhsÎãq5=Ü?¸sûê•7fÓ$@1˜_ƒ]×ÃõëןùÃ/Ý~âG¤÷ß|îëW^}>›…® 032[òÑ÷²œWo¾úzèý£þP[5W^¿rëÆMk-+‰"5Gdˆ}„àïÜyæ¾ôü7¿5N–Õüàîz9Šý²ëв†.Ëw@µžÏCïƒèkïØáX¤f4Û.däú®‰¾—Ð7M}rzTäEßKVÐ÷¯=ÿükßýå™t5xpì&ãÉ7 wŸÜ¾ôÄÅ»|ߥ"㾩?6=zí•—®¼ñš‚««eCMxÌœ—–=ø¾OzcL‘|ÉÌ5®J4T‰bÛ¶PƒÁ ŒQ|Û…à• "ƒ„1#h‘ºjÀsÆ7¦J:‚°A" “cB`Ø·R fk­xEÄ&ãWUÈ̘ÂÚnÁŒˆÊ "Xk@ÎÊ_=ç‘Ù‡V¼ï‹™ª¤½µls«šF¹ "‚úL¾ª;ftÎdÎ13Áª;ŽÒužñLŸåTUb§ê¢·Þ{‰1 ¬Š@„°¾æß=\{ž‚NÇùîïšã‰z¾"‚ìïãŠbÀÌvwƒÂZGižça˜’c¯jA(¤àžRúüý+ªg÷´ÒÙ8ûá*ÚuÝr¹¬ë–ˆÊ2/E–e™Ë·¶v&“ͼ@f"Hcçk“VøƒÀˆhM&D† BTÇ"I"’’!U%C@1` „’D“^Œ(û€ªê‰@E´ >Fµã”T1Fµ#¨TÒYqLì‰Ñ0:‚¨Ð-Zk FFE ½¢UÀZæÎ0;$#ÞǦï».è2äe$@ž¢bЋ®0*$“Ýp B¾ ^Á ªïB1€ ¶^™Ð$—=ACH¤^4ª‰ª Yû¶ÈRÿÿÜßþħ?Ù7+é[ßþê·ž>!Œ†ÅœAEÔ0õgªs§]USWu-ပ]-¯7ÙiP˜ˆ@«ª)ÊaQ%Sµœ=÷ì3/|ç/76Æ8#b¡®ë¾ïÓSˆÈMÛ¶!ô}Ó–ƒ"Ïl³¬œs=bèú3G¤¬°mÛ¾ùæ›7oýö ˆˆo½ïZKìFc&è£t]×÷= 朕®lg‹ï~ý[ùž•# –•6Æ›@ÚÇ^QËAÁ¨ËétÑÎó<;Û¿{óêUE "}–›½½ àûÈÌóEc2SŽãb ªD®i{¶9.ËŠñ`ŒJõláûZcg º²ÁÙt‘Y›ç¹q¹-Š¬Ã¡QÎÑH‡ìv|ôé¿ñá§fûÂ8ö]5›ŽF>ùäÅom߸þv;eqœ¿"yž³qáÈRiòRHEdÆ2s J›¡3qo¤ôÒ+ˆsNC$çœ${ "|õ¡Kˆ1ú>¦¶B–eIê•@¥oÉ$PCb´ i˜y‘[G€ ÿ…‰PE¼÷>. “¯¢ ›Dâ\÷ha… &ý¥jVnY!úùâ”’q¹(*`ˆ8ñ!‚u™¢'«)¢•¿ž›óQM*CSeˆ¤«0DAò jE‰U4åX¬^äyæîAà½öj"¢ieý±ºPI$jhýÑáÔÚëBØ»¸; ²ÌžïéžGJ&R€¸’b¤*!'…Æ=c¬³ÇëjzÕ• ]©®Bg¬†ˆ/Ëåòää$Íó2»yžOÆ[™+ŒñiÆÌé»ô,røƒt|X ’*¶mÅ»`4ÌOÚ&B€Ô Aa@‰ª€(† © aÄHA "1%¡¿DôAú ¡qíçG†@£ï:Bt &XõˆdÁÂŽÀ)¾†5€(€ zD¶Æ2«h\TKßž7qQ…£Œ R‘U™Ô9Ûr'ˆA‘™˜”…1`"&f Ž$¢>2¨m#0$`QBFKC+">Š“1dHŒLC7:]}ôáíßú­ßÔй²h»“?{æß¹y¹–cྈ Q䇟~UM ú#BÊNKúDDQäáp,ÄÊ Z”ÙÉ!ß=Z»"9"HM6™³£¢ ƒ,³®mۮ뙹é:B*Š‚ëºFyYx‰¾® ±ËÊÑÑÑÑÆd̬Q¼ ,—µa·œW1ÄÑ`¸·s¡ë:Oõ ¢8è²BšÐ ÕÒ‹ïËFe±¹¹©ª!êåK›¦O†J±ï»¨ÒÇèmD6å`rt¸ßuÝ`g×7­³¹3å[¹x‰1¦bˆò¬Î, ÖXBSäYÆ]טœ‡y1Ê‚DBn¼5ºðÀÖåÇߺòíkWßêªeixXØ‹[¶Ì¯Ý¸>¦Š¸ðœÁÉdÂÆÅºJØ£ªIRnÖÖŒÌ,¸b#ˆWtoL¥š©*ZkE$†`­ƒJº5¯>pñ&`Ȳ,-Ͱî(§‘\uf³ÕjEUPCâ¥úÖܯ3V4cIU  H,œUERÑèSæAt¬Z¶«¡ä”òkVÝD Aú¾! 1ùЈ€DŠ`˜,x߇àT$ö} ÉNë ­Ø"Z™™G)r![-€ j$"–䬷²•Nû T¥ÕÍñž0†¿öBÄ®ë’K'‚Q$"!`€ „‹Åî0#'î.ægÙÉïé1Ÿmq’,§÷‚ÈŒg¸¨ç$ÐïÙRŸInôVÉ]²®ëù|Žˆyž'ŸWf.Š"Ë2MN {fR–eÙ¾ß÷÷ñÁ`U5PÇ:/v0˜#‘æ.SŒB˜ÆR]F]–\YØfŽ¢ßŠì\—Ø1¶T»®‰°0ûh-“R×¶œ ˆ¦Qã¬ÎFËé&dòKÃ&*ö!ˆ™œ « Õ{4&g0; @ö]lÔvd Y´¦ŽZ)ý!è‰%µµTÐcˆ& „Ìqç!Ý*ù€# €v¨€ˆÄ†Æ…µ.}m‡||t0qCì1N.§>þ£?þñŸBªÂ‹¯½òí¿2;ɳ,χ°¨o „虀%DBDËieeþ«  †d_ @Q Dò]]–E¤(Ø»|˜çÎ{ï;?,‰‡°¹}QBØ)'û·„bÐû>±Ac )VU59W”ù <<=ɲb‚ˆL šgn0v­ÎgÍÞÞÅï°m› a㾪Zäƒ|ssS¯T£qQ Ó…d0 [Óã9¶Ý}»÷m_ØZÔ3SšŒ7µe1Ìm~tp<Œpˆ2ƒ5“;:„ ²ˆ4?wËj\Š—DÔ{r4½ï¾û¼÷¦Ü1\œÜΪrŸ,ç³eUò§–¬„Ø4ÝîîÅyÝ™íû._î;Ô³Åk/Íübk´u:m—ǽÍrTÊþN¢y·õ“?òØO>ùáö΋Ïá½u<Ï6÷>ò‰Ï>ù±Ï¨—×^|i«ÜÜ?ºYèrï‹ÌE…­m꩚WŒ4FQTé£Ï cè)uJª—nvz:o›&†à¬æãr¹t…A/«Ä¤´Â²µ¶ÈêºîúV¬èJî[rêC’!Fñ¡Èrƒ6v= %u–o»Ø{X§&øÐ†5Æ{ï\6!£(‹Ö›‚jkmLþ ì%ÇT%B1('[“ ;¦Èl Dl»úôèøèè°j–!Õ¨à 0Sb/iL5d"hMͪ¤\BIê­ªõU Bb Êûºj³(l¢ñ½( ÔCÚ²3³ž•¤"Å&í'­…f*°’IeHdØD‰-«ˆ"0F ]˜O¯¶mßÔí… †£"Ïó,[ñÿ¸îˆ÷‰ÈóºØ•¤+§¼iÈr½‰1Æ@TE!b=ZU‚Ab¥€4k«›w«v”“ád<ØpÆ94êCl—ÖÚØƒ U"X²ªº γBI–% üƒˆÿÇ€qu¡3QD²l4Eúˆ¢,×ÂÀäÔÔö-* *aÊ%ÔÐ 0JDO ¨!@ŒHæÿcï̓mËλ°oXkï}Æ;¼ùu·º%46²QŒ °ªcKÁ‰ „28®„¤$¤Báà$•Jø‡)JBAâ2àŠ b9²e !«-©¥Vw¿î7Ow>ÃÞ{­oÈkŸóîkI•ÿP{ÿqû¼ÛçÝwÏÖo}ß÷ØÈ‘™“38»y§=ªaˆ„l ÙÔD-ew'suW5ðÀ¤Þ‹Šc‘B¨*t2JF‘ª¦t’>§VœÙ40U¡o{$Eptq7Q3Í^ì TsE2CÎêbà‹U¤g!7'DÆëqRÞiªêU×µo~ðCúÃàßGÀ¾_ÖMóÓÿçß}tïLÜU—ɲ@m°åÅæÛ}þ¦Ÿ6Øäú…dçÂàʬno>×ó/Tóù½{ÎÖítïR5޽%]¥’w†I²æ\Ǧ™LWë³eÛùÉ1UõhD»»{;Óù[·]§±ªvvæ%l(Wþ IDATéìì¤ïûû÷NßùÎwv]:<>™ÏöW}Æèמ—·^׫ã‘T±>><ºÿðÎ:­xwwWÄÆõ¸ŽÍééb\^xáhš³Ó㣣“õjyzzŠûu ÜŸ=>šíît]×'i×ëw¿ÿ×ßñ|]×TíÜxí+‡ÕÌGMcÝ4 O¨[­ƒ;žŸŽç;¿é»þÕgž{¶næoÞxõðàþãûwÜýÒ…ýÝTÇùøú¸¦õrq¸Îï~ñ}þþï¿zåÒ?ø»ÿÏ‹ßö¯}÷õç^üõß~ñÚó‹Uÿ•/|AÔ³éõËæ´7¸1gׯ\½:¹ôàö«=:9:èºNC¡CÎÉ%[Û¶1„Ñx2¿°wáâåÑlŠ*·oß¾sûöz½Îiå»³uaÚÇc¬bŒ\*í 7ÌXØV?œ C¬cæäPB™ÝvM‰(D*)Šª:iUU!T¥Š*åZɺ(?<Ƙs50_¯ëår¼»3žM›X™YêÖ©X‹uˆ =m0Á €†TZ|€‘6Ä%Wr´‚•ŠŒè `°É<@D%º»—ç| ÃÓ6UÛúò«g±å1+›Œ!:жå,õ}¿\"¢+¸™,‹«×.Íf³ù|^fðççâÛ“ O‡ŸP1¶§WMAC´¡™eb&¦€`Œ¤à§‹Åýû÷OOOc Óé¤T½!óö_0Ú°ºàüçÝvÙáéjûõxû0"JÎ’“+ ¨5@+óÉÂqذ‡”Q €UÐÍÜÔ1;G¯À3Ö„Ähf€X&ÉŒ! ̇LÅÐL@‘Cd,Æx)Ô®FÖZ/ª1SÐd Ô!‘stgàHíºÈÌÝ S65„=TôˆÆà€D&eU !Á›Y-©‹¹neÕ%AõЙœ}èƒßô[¾çñðóŸÿùý£Þ¿µÞ@Ö¬2$§kJý \…²Å.(Œ[ÿrÊ}åÊ•*6«ËWžYžYÖÃÅÊ+>}|x||¬Ùªª²,îXR’FM„Ë®mOÏÞ|óæÞÞÞóÏ<ß4c›šˆHÖœsßw}ß1ó|>¿ØÌÌìÖí;cÕŒ{Á÷¾øm¿æ=ï½pùBZµOïܼf1Òåý »ÍtçÚµkW§'‹Ç7ÍøûàÞÿþëùÎ/¿ô¹³ã³Ó£ãvÝÇ<BU×ûóýýýUÛ&÷Çßÿ‘¼r횘ŠáÁáUí×K\…ë¦8æ?óÌ3£zÚ¶ýñÑÙ;ßóþ?ðM/}þ ßû¯ í–;{{÷n½qððQ]×u5q⇋åþÎxTWã†_xÇsßüM8=:}p÷Í?þã?þú›·×I?ûK/¿ò¥/Þ~í+n½‘Ú3æeTÔ ïÓtw÷/ί¿‹e™ûöäè u½EbftH)!ƒ‰ƒZ]×!Vu¬öööö/]ëÎŽ–ë6'íÜ„ˆÔMº¶p]×0$ KíP`™y±™Qß !JFbÀÈ ÷kâ„9ô–7ôZ.—UÕ¸o欥‘^–Ê„Vz§(9­V«Ô÷i>Ÿç¾ïÖKØ:6ovŽÃ6 ˆŒ½ÀÍ×¹¡Ý½˜5áÁŠqqÁSòB"!Œ­ñ.£$ eÀìP˜‡ð4éi‹¾Oþ¡s.­[²ô¶B-þ¥‹k&}ß›I—SÎy±Xeé.\¸àîÓétˆÇ@ô§åIÝýiÓx‚µåmRøz.w’ˆ”ƒ‰ºYß÷>¼}ïîºígÓéîîî|>ŸL&D@8„I¨ºÓSáÊç?õ¿ÀÊñs¼ØÌLÝÝTsJ)ˈ"RC€²1!¹£)º±;³hVgtF.-7b  nhª®³S ˆÌ¬j.JèhÁUÜ …@Àž3€×j!«ˆx‡¬)ƒÀ:‡š†P‡0[Üèó*¤ ™ƒ–g£dJ¸›@‰/ÆXnn!¢8 3³sÀ8§÷N M5V¡Wí ƒñøÊNõƒùp]5`9Ôò±ô¿=ÑE£>'éM —ÐLÙiChÜÁ`@„àhÛ†žƒ‰‚ù@15ÑRL4“ñxïR× BuéÂÅÃÅéJÚ+»û·oÝZ/WóÑ„9Ha0åX§þþý‡ªÚ¦üŽçßyÿî½G­×«®ëˆ 0†&ãq†®jFßñßÉ¡zõ;³ÝKß÷‘ßuû΃ýýËÕEœÍv$Ûjµ5±©'©OVÛÝ[w¯^¹Þ4£f<ùÀû^üöoÿÎ/|þåúC¿c±XLf;ê°^­ÊOD,ó"¬Æ³ùÞl:™í¾ó=ïY®×7Þ|ã;¿ý»F“±ŠÈZ²„ºS]­OZ¹’4?r£”¬išgŸ}ÇÉéª×±®F£QÓŒs»Ì}’F‰H0¬÷ww’Sê»Ší»¿óï}á¿ñÉG?úO>ùéO.Nîß={t×ÇüÔ§|©í hûîl¹>88jyÚ¶«bᢪ‡œ$לM<8`;;;{pïþjµ¢8?=k8T˜$31ðmoSDJÂ@çî9¥r}]  ¸>!™¡º“›@Û'+Á8e-~bJŒˆˆ}ßócw_¯×"clšf;¤,>Ï¥‰Í ˜Jý•snWëv½–fšRÊ9›(0 !"ŠÕ€Á´5(OÛt¡s_Ë­ ^Žá2"8¢’ #o@È9 šœ*ÜXxÀ9¿‹-úâ&Öw‹RæáP„[Q”=ΖÆ4(€ ×ëuUUwîÞ_·}Ÿdooo6›VTìŸÇ¿í&é«Ëñá·"wÈf`V¼ÊSèLÚÕòðàøÎƒ‡«Õª©Çû;»Óét2WD03(­Ç­<ìüú¼–½-Áo;~ÒòP3(Œ‰"¨ÜpÕÝÌ\Ð …Ç‘s¿™Ž gPD¢P{Ḃ£²‚‰g6qèUÈ!r`f®2RpCCRud§HŒؘ7ÔDDœL÷œÄ™,4•»(8ç²1ZUkÆäuˆÄÁLÐÑÀÌA­ä’=ÙJ››9¸BE†æàæ ÐxݯŠ!VDÔŒŽSŽMøÐ¯{ñwþàB]w²lßüÔ§?qv¶&¸€dÔÌÁ ‰È]a[/øÓ-èò¸–Uµlº‘¬ä‡ö”PöæEØ4Íh4™Lfúз\¹þ܃;‹eÿÊ—Ašw¾ç]˶;;yýøø”E¤\&øƒƒ£Ý‹(ðõgž›M§¿ð‰O^úЕÇT]Á™¹OíÑ‘ºãj±í—Ëu×%p2oýÖßpíÚ3åþÉÿò?ÿSïßË9ƒ™žœ¬RêÚv5é¬mÛnÝïîíÇ/_¹òü /,–ëÕj±^¯,VAûn½^©K.¿òàUŠ¡¯=ûLUUßýë¿í»¾û{>ý‹ŸìÖkp'4T—.µ}Ÿ«fµjޝ^½N7oÞ<<|ü]¿é7¾zë[o¾qÿî½”R •JRII|´;îV'ë–“Å×¾üÅ}ôïKû½¿ö=/üýï|üþ·n¼ÈúÓ_B^GgIy]1…ÔËáÑãWVK{ónôåÉÉI–žØ À6Vü¥ÞL)>z|t|Ê1 ïdéSêJ«²ô?ÞÒo‡§+`÷'ôoTƒŽ·ÆÍÁF†PT ÁÕa#NÅâ IˆL„ €æ&àÎiUž«Š‘@Ý@Ñ ,«šÊÀ{rv`¦Ü`ÔÌб"ƒˆ “…¨¨¼ü´4ˆª¦é¥3B1FŽ Ð Xj!c¯š*M œ<z &ªbYÕØÕH,ŽêBÿddBw lÈŒU,ûwW3uuwY§Ñ8ŽhÜ-³ªÃ×ËyØù‘÷?0ˆÔÔ£¿ð—ÿÚ—¾x£kA)xé9—eÍÁpÈE-‹–?U#"<%F,{y$ʨŒšæìtùüóïü–oýõÿì3Ÿû›ãoU^üÐ7ÿ–ïùm¯ñs1ÆÕjµ>:-ýÏXWp´·txp²\‰Ûl¾õêõåªmÆÓ,ÚvIDÜrN")»ZêúîñÝz<©è3Of{ýjyíÒÅ?ó_ÿWÓIýÙOýüíÛoäÔb€,}—p4›wÝšïÞ½}pp°·á‹/þŸüÄûßÿâç>ó鯼ò…Óã—Ü玙™b¼îV9÷£ºÉG‡çoþïŸûì/áÝÛwÞ|íõõâ U8²º©¨šµ‹(X.ñ<ýÃÏÝÿóáôÚ3ד¦û·oß»y“œQÄÎŽÁeÍDa|çÖ›?ñ¿üÕ¿÷·jZãÁb}óõÒu˜“I?ib¨"x5í—…ÍL)%ïóãÓ“jʪO,“ÔKב0°«0Ë9w]'¶rñSfæ€h&š4ki—|[Ü”dCfns*[+xZð+VËêÅ錈C ’-_~ÎöG`(!U([´Ñt:]­|H’Áœ¹ä“‰!x.›Âz¹ò,‹Ó%äÜ羀ȴd Ã9(*_«Miù–°ÓPš3šÒ³ ˜»#9”†‚ªt¨Ù’ˆºƒ :€ï<ü”ëæçÿø§ÁýÜû·ekJÊÌŒ` Lö.^t÷”óúèèt¹<]./œÇã«÷‹8»¸²à¹¶ÿùßžt›3C@T²¶mß¶íáÑÉb±¸ÿèÑáÉ1ÍæóýÝù¸i&“IÓTu]‡HJ”²™›?iòÃ[>Ý“o¹¿jà·)Wq‰'#' AÁœ7w3a$tOÅŽ††  ;„‘˜ÜEk5rˆˆ=¸3s$ge'òè&©Ê†`„™]ÙÉY %K’\°$iILhX|d1’ÑŠ;tctwuµP&‘l)[ˆŒÌƦP5Á |@IcÂÀ!Dr01ôâ#∫Àä¡SCO¹ø®}óG~à÷µ];jª¾=úÙêäÔêz‡(,E:É¢ŽHlŽÈ[a¡o0JÔnõ޲ܔÕvÑcF±n®\½>M^õµw<ûÌïù·~h¼3ùÙ_ø¹_~é³·oßî×+— &B`§µ}ª˜9T)%‘û÷ïgõ0æ1PˆSœ\¹àYŽ?º¸»_~îÓ¿ø—ÿ»?ûþº×^{ù3¿øÉÇï6#""qIæÚ˼‰)%Ë=6M]WüÕ¿öW^xá…$é¯Ý½ùf×/Ü@и®8V–s5ªú¾P>|ðñúO¿ðÒKD$¢ëÅB Ñh”M-IÕD8‘HRíG³úþÃ7o¼ñ2âñ¤Þ™ÌE¤]÷ãéDÁ—]ëýºëºé|Jß?;HÚXÄ:Ÿ5BŒ£ñxºêÚ”54¡]H‘{©j`¬À€<‹Q¢#8"z©kÉ4©–2h3Úd"³LhddfdÀ!Ad5)2ªÁD¥bŽ€ëõ¶œ‚ÍjŽˆU@r‘bÐêX×u¨#Ú ‰:?˜$"5…Rì2sAÙB×*}颧ÚZ\Yê¼ÓÜ'13Š!¹ZÛ¶ÌLà!„q3Ú´{ pKÞ çzÎoàTŒtȹ YÜ@=‡P1Dè$.jPk´$jîBNè€è‰\ù|!èƒèv3÷=·jºm\æíBˆCïl]×­V«ë/\)gf¹\¶m{||\ZÓíâ´„"”8„ž+Ïà[`x³JÞ®íS’®Kg§Ë³³Åáñáªk×m?™Î§ÓéþîÎl6›ŒÆ£éxTÕ!:) s9#çŸý¯ùúü;~µþ9Ô7ôK`¥aMACD7  ™‘él±pÄ>¬)Næ®âä#GTB wT¨ÕL@‘@¨ª,¢Šº» e̓˜Ð™ EÔ:GM2rB"2ЮïU˜Ð¡Hy†=i°© WyaLèU¤(1…ˆ E:wSMê9PääDââê*ÙMÔÝ)2bÝ祋»:;û† bÇúèè,õ:›ìÆ <§Ë»»¿ó·ÿVóØ4°îÿOÿãt|–s\¯Ót*IrVQ·TV²¯s˜ùÆY¶,èͳ]m·Ë·»éK_zö½ï}öÙgßõì 5ÓKÿü3?óÓÿàå/}^ON û$701°Ê¡[¬›9'±½½½oú¦o¾xñÒ«_y˜FÕ¸¢‘ä¾ µ‹K¶ÃãQŒ‘º=zx|túÒ_Íf9­ÛåétÒpˆ}ßÏæs§(ê}¿‘éîl:™Þ¾s“B•–Ë—>ÿË’ô©©ã¥Ëܽ5ròÉhtr|vao7%É9÷«eÎ*Y'Óf´¿Odãñ¸Ó¼êS3št«nqr\7ͥ˫IëH¼ç}FGé%rUÅf:Û©G㓳ÓQ-K8;N“É$L'º\]Ü݇ùÚV(Ö„Z;S'sF.ívíaû@‘2 bÅ¡A­ªªOÃÜ@݈9"3õ"~®ñ‹@ìDRÊ1 æ˜"3#€vmêû¾\í„´‰,ØjC9 ƒ™Ky»ÆŠ›QP¡b΃}#nÔ«D¤–UBVaY«êÙÙYÎ=Ôu½eD‡bŒ!²rîÕV"R¦ÅxrÑ6 ’gD×tî÷tw3)„BÜ}U ˆHHÄO¾ î9Û¦n`Åñ5NÉ@œv7B#ÄM»û<ÊnëÝí~e[”›Ú0YÞNK OÍŸb¨jÖÒÒÀ¾ï'“É|>ßÝÝ=::Z,9çœók'G³Ùl:–:¸›¦¡Í€w÷®KªÚµ}ÛömÛ/ÎÖGGG''gYS—ûXU.]Ü™ÍÇUlšf6Vã&3“û“½1É&•êÿß2þ s¼íØ=×uè´ïTr2ONXM¤BíÓ˜˜É%õVÄ]jsD Œ`*¢Àc_+¹ZV©«š;Ð3iq6®ÆÑ\]DMݛ欔”Üê`u³´”uVÃìm¬˜cŒ“*¶™SäÐY·ò„5ŠgS±,F£:C•5Œp'P0wqçº*?“˜‡«´‹Ã¨à ֬ª!TuÓ Epæ123¨‰˜3S딄¸©ëšÐ™mÁèPq™Úº+F&ðÄ\òˆÙÌA4÷=ÄØ«‰A@d'RsÕä`nàîHÜÅRV-Ê`@ð`%(·è$ÜQë@¶6™Yd"w'EÉɽ‡§»Ùm›Ü0Vl¢„‰˜(8äM8"‚oဃ 9,Â%t¤º0(Ô°ÒÐ0p ¨*QvшD™!i{¸hßìŒâîõËU³wao~¶\žœ.‹¾ ØýLJtxB(-ýªªªŠ«ªªë3›yé1¸¡ôk뺴X¬NO«Õºï³™QÅ;;;;;;óùt2Çãñ¤áºª«N€*¤PŒJ€Í Œû6HŒèˆu䀙€ÌzøzCøÉ·ðÐEÆÀ«+¢HÌ@ÝМËbÄʰ˜ ‘c窊äà–±ä“–½qäÆDúÜ’¦="H¨+²ìn¢¹pO8Ô!45¨ª¨æ®s5¢*P¨QÏØ=UÀ3˜˜:…6‰8²‹¤Üõí’È ÝPÁ†!™HJ  Çc w ‘+§:Œ@ÉÝÑ Ðáñ㓦¥^ûÔ¶g«Ý½½øÃ4ž €ýÄOüÄ«¯¼ºX ;íî쟮lŒaáþÿÚÒ~u?mó×!0×Uå¢Yeg6¿påòþþþ݃{_þÒ/½që ŠMŒ‘²ž™+sJi½^§Ô-—KÑ4NˆØÌ$©ªo{ß»¼Ûš¾Ón±ê—ë““ã¶[Äȹk‹yŒ‘°*†âÕg®TÈ­z»Z»ûjµ*¥Àš°FÈn¥% Ì‘ÙSJ"hî^F0ѵðažºŽ›×Y†Xw/öúD䎂@ & 8”jô©åý^вí|±ÔUÌB`Š;;“Ñh²Z­Bˆ³ÙÌ —Ëe–,"04«º"V£Ñd‹” k×m»êû•™ D°M÷‹J­/Ï‚fsQ¢ YbŒ­¬‘ †™«™¸«;›Àà€Q³CªYDM ) ˜˜ ™ 3š™J€¨|í)ñö#• TÈäˆ1p©n‘¼ÞvÌT ) ;DÂHPY“QŽ hhìî.ÌÜÐHÝÝ‘! š«¨fpd ä Igž{ÂÄAH VtBhŠˆW\gÌ®šTU\€¸† ¡j°¨tEMÌ‘‚b˜ªQv Ô­í:“TוU3ãB ÀDÅ!”‘‰©x"š¡ 0sG1w0wDMwÚu?nfÉ;nøCúÐïý=¿óÁÑýò?¾Zöªu”³ºw9ß4Û¾øzÑ×àˆÙ WEĽ û¯]‰1¾ctíñáÑÉrñèñM¹E¦£ñb‘lo°¹…0…._º²XuW/]ÞÛ¿úê«Ýj9ó­Û¯Í/ï$IéññÙâôÌÀ§Óét>î æ¢_<8|ähîÖõBxüðhww÷ʕ˄°^î_¸~ØÞ«›i=™ŽÇÓ;·oÞ»s“À몢éôÙçž{ß‹ß|ïÁ£+W¯ÿ³O}fRwvöt½D0—”‹PÒT]áððˆ™ XU8”ƒñèð°]µî¨’G£Ñ…ý]÷YˆT.»F¢€ˆnˆÈDôðÞÝ”’öIúÄÍhw¾Sñ´g€Îd—§"±|ê’MÄ&‰ô­×±€e 't‡¤¢ý¢†y Ö„@+Œ<“ÝQUû> dwçð$#Ê€¿išýýK»»»¦p||LööörÎ>~ôx™RÊ)•>93W!QÇ“Ét<š‚ÙÉɉŠõ}ŸD’tå—·!éˆ2©õ…üfFbÊš$gˈRö1îê®æÉA\«Áq‚"3Çb5MެגÇj„ˆ«õZÕÜÑ%‰@þ!¢:àùîñù¯àÁ}OänѨd•Ú *FDɈ˜¦·; ¢¹†”Cß’.6К<+X!o9²»™£ã£Ãƒf2ÞßߟíÌg³Ù$Æù|."]—Û¶].—«ÕªmÛ"Í‘âL’“µ¯o>Ž´ˆÈˆBU×£f2™Lšf4Ù«›¦™L&ãñ(ÆH4È@†—¶<=VûWmûÎ/ ô72 ¿íœÐÉ ˜„²ºH–ཹQ© JI³ˆ…£[nÃ"vË)£ª`™ò¸3"º"XˆÀä&ê9¯TæJŠû¹ ¨`î¼5QsŠD¸F –aT±‹hé’PŒ±E"Õ˜LÌÉɓբ©&ŒDD¡Ä¬˜CUÔ@‘@³d%7±6µ Z‘ IDAT€"tpt PñlžV)­´ Õl<þ7¾ÿÃûûûëv1á?üèOß»ó<¬f³Ù­;7ë1ãkÝÑñïyeß[¡ØË{ßúàÕ\¹¹$5õXÕóý ó½6õÑëý ãé#žž¢JêÓYNÝÀº¥*DD`W3Ñu»‘åâôÞ­7Þs×K—öÏN^ãMhÆ4›í̦³º®Hú¼^·)%3MH>›îÄ:t]·Z‹ˆÛ·þÆoýÖß0›Í®^½ŒnܸñåÏžÝxåÕ½ÝÝw¿ûÝï|[Ÿ½qxö¾÷ðý¿öÅïMÞ¸qsg¶ÿÒ/½t÷Þ}ðÔuk³ªªT±)VD—&—˜ÙR×¥”\‹:]—‹ÓB6h=I¬˜ÍtÑ®}a©HÜ€dÝ:€©®–KUå*ÖmÝö݈ÌM‹˜‰hg&)*! ¶ˆ$I‰±0ž‹ÀÛÌJ%TJÉA@Rb í6}-«e£UüÍ :•b®00X‚eR„˜±®'ˆHJû‰Ì@²rC01ƒõªG‘œ$›ž‘æ!€»!@Ir×A¼´¡ Ñ=[ ëpS¢¸Î1‚ÛFgëC­>ÝYÅFã9ˆºˆ zd43$`" Xv-Fñ)c'/†!;9[±‘6$$Æ"G·BQ¢B«ÆaÀ;œRØ‹[Upù_ÛÅЀÔËL¦t­Q!‹ܹ{gw:™Ïæ!”‡gRMšfw6+•néÓt]·^÷ÅS,§¡ÿQv6ˆ}qu‹wÛd2«ë:6^Xoƒ8”}Ø6ÐpkUB<éXøö®ûê ø»"~0@¹¨‘ÀD²õÙ1“)R@p({cr2çáÞwG0'`.©¡à%£ ÑQ1VUŒèæªJê @ÌàŽŽ>¸·©@ ÄâMÁà!„:RƒÌÄE]Ka"Ø ɻΪ¦r³¾ï˜12‹ ’Ô@U‡²»(œFÂ&X]$廫êäÀˆ‘³ !bêe>ß×>×1^ÚÝÿ÷~ôGt4ªs~üÓ?ýÓo¾ñÀ#1º"bßiÉ[…§=~… ø«—¤r˜(ÇPþ.…cM'³j÷ñ‡9Iàêúåç®\¸Ú¯ÖLJG„XÏF:ODóœÙèr±.áç ˆXúþl˜Ѱ †ŽV@‰­l÷7k«10–1ãæ!A T—A—bänæ†Àîi#¥R1u1‡ÁY¸Œç7ZÞ¢t*«[·nŹ𭘂ˆ´m›5o¹Íå7w3;8:<9[D>BÄœsîW)%U- D„nd¥`„Mº€#"Ó‰¤xsºûFqúÔ éî¢â E Oh)¥aB¼e»"t B  Ëœq€ò§Nd7D`¦âeè€Nd¤`%Ÿl8É´E¤‚ÏÛÔ¤'ðöf€H¼)’‹íVòGËe{ïÞýù|g6›ÅŠšÕÆ7´\e)™ÙW®T9—K¤[Ý—™¤B–.Œ¼éÅM4ápÿ”F?É7Úý‹¤zëÀåOG> 0ý ÊyþêãíÀ–Ý8`¹H0 3TU…È¥‡މ™J×Ä7¡# èÀD\USRU5䎣36⢦î è-×aRQ0U7CÃÀ\qMMOÙUʈÈÝÜÎÖºQh88{BŽn˜,3ö‡š§Šâ(FsSñŠX*æ& )š;Pk2I ®"V>‚Zˆ¬ÝzŒ 莃—³;œž^˜ïöËÕüöß+ûèÏü½W¾ôåv÷÷ÁãÇv泓ÓS'&P30§!«õ‰ÒÏŸúÏæ›_e>—Dg͘H €ÖëNÕ_¸þÜ'?þ©»wïL¦£çŸ~ogWŠžÅ=zTv<ƒ»÷m*¾KF¨ª7oÞD°«W¯v}Nbn1r“DÖ]{xp–“º¹¢"âjµºuëÍñxZÅ1R@?ö'ÿôïúÁßëÉ!2I–:Ö|ß;ÿïù½Ÿþ…Ÿ¿ùú«¯¿ö£_¹|ñòÕëóÉtoïÿGìÙgŸýØÇ>vvt¸\œÜ»u7Tશ^+'f>x|Ò4MŒlª"Clfâº9W¥–6ym—7”×Á'¡¼V±H`àDŒT0‚b6÷¡‚¥²uDDb¨ÔR™óf·TJÃbðû5ÍÅ*KãP5"ð†ê^¾–vô¶ôÙ¢B‰ýá’®ãC+()Ô‹ö¨ìœªªADU5u"êsÓíöÊÀRÕщ¸¨ñ@K­·ù7ÿ.nR¥}ÀWw0wŒm˜›:ÄÂ``„bO^üÔUTe½îsΈœ¥/'¬ª"ŒÂæW3TUéŇ õk‡ +!q•™Ü)·ìÀJÀf@„¶¹~å£aY®Ê 1+¦­¼9Ïå9B’}Ý u‹©TÇb IŽNÎîß¿¿¿¿·3ŸŽ›Q]G³bâà €L0jªº !T4<默eYÐ--Ø´ˆì”âöwó )œãuŸƒj(?áI£éWøú@at¤BÁs2D#r6ôÀ‘9ªZÎâÌ hT¢ØM¬Ð"И#9DBBóTn/ 3r¥Ôª×LHª¹G‰b‰i€Òß«ˆjòNAÍÄ\†Öxç’:UDŠÊ˜„®½HËäM\ÌÙƒ„ˆ#‚†0¹gD ±nó’œÌ "/k&‘“A‡ìJ¦ÜÜØöö.=|ÇæSû&k¡ .0¸ray£9ƺáÑ82qÝDð"#âél4žDD$Hƒ@a½^«¶¦JK8Ò°äœU "dtŠV6CØoÞiŽÜ l˜ÙÐùÝÏ9s›§–6("w34NbŠHu` ããÓ;wîìîÌÆãq ‰Á¼‡›aÃQOE‰Y ×1P¯aù¼y„ýœ›$!–æÇvÄ»mØ<5 –§‡¾ÛS¤›·Ÿë¢ýªøç 6ró’à¡”Xb@àœ%u½Tf1FWÃàˆ›j‚ ‹Ç29]†PXÄe[GÌ‘SòÜ;8T!0j¶Ü®:«˜ê€ÐÔ\]úÅÒMƒ!0:¡¹fK-TÑŒÍAÔ’XSÅðÈDÛ¶“”8B•z•.U“‹ƒi”{Q`Pî æÆ€ì€eø †`jŽÅE‘#:züx>›=xôà·þæïÝ»v H?÷s?û•/¿Òu)';<~éRÿ©Oýýå[þð¢§Q]Wu U-ë.}úSŸ¼ríê¾ðËUS«¤QU?~ð˜ 4‡¹÷æ³2"®×­{qF uÍÌ ±š•4­hfj™ª*z.‘¸Ãü²ð\TõXµ®ªºOM¬ÐÜ“LÆc0ï]‹Uޏ óòëDû3HOIµcŒx®) ›°n¾CDÅݰ5¥`Ô¡í\$IK·YÁÙ†±¨¨l7ƒeQ!åžxë;¡¥ÿh&u]«ª«šo]'lí"Ò𠀓ç¡”xÀ*6UUW/¶„ˆâf–È‹¿ÈÐ-F$v3w() Æ\UUhšj:iÌ\³€»WˆˆR¿""Æ Ùrέ9ò׺ÏË‹rQˆÈ· å„VF£PDñeTU:SÃö [¶0l,²7-ñM,11€*1£A‘1AÛ¶<|øpw6G×P5PË¥bŠ‚Ã† ÍÔ½ï¨ôŸqhÂ- "Ú€4 26Ü“.®kZ­—Ë®çX‹©Ö®&hÎèî&Žè¨5 ¾E™™CDMIÐÌSàÀ²v±¦ª¢>-DälÙÿÂÏ?¨âd˜NeK)¥$fVõËB†è hh9Ô"‰`’›ZÔWë~B…Fî€H! ³—¨<¢ºõë>¥4y8éçtœìk—*‘bq%‘rË(tNã2æ†Å¥‘n}ÛÔ±ÄÈ·mÛu]™pT!Ú@p¡t9€j>_Km¿ªIûä…› ÍÐ43¢‘¸dtˆ ¸X˜#bëS¦,|ÒCnû€ÔÄÊLDÍRJ1FÉ=Ù2@êØzwD½ SŸ2†vsPUázÇÌÔÜÁ‰™!äœ5k8Š¡¦€–ƒSEŽ®*™\6xb—0ÈœÔ ´`³Â0GD ÌAƒ˜‰a¬8rŸñö‡ÓÑtgn£bÅ'äHÀÀdÕI+ Þ)³²KÔDÙõ&¸‰M°F“¢S 1ÛêÜÕv(6˜’¨p;JŒ8hpøšUmòPÃk³;jÏZ€Á-þ_ŠÃa æ‡ÚËZÁ< `þÚàíÀ`†hfÈÙcDˆ D+È@HÌû,"–ÕUT ‡dÜD¹¤€’ƒw†É¼aÄŠ3€Q„9µ‰˜”±hÁ0‡èªQäbëSÖØ&$r“œ • \E]]ÑT=€*½<70A7SwC¦@¡3s× €<0g‹ødÃGQr !xßçv±Â0ÚíÿÛà7¿ë¿yaw+xÇÇþñO¾üÅûfV,Ì|ˆ‘AwG64„¢RÑ­Ü¢Ôγª2#bïíÈÌSçÜs†úàÇÐÍÀEݬ:U™‘‘™±bï½öÚwîu«åÞÁJD6›M×6˜âyî>š›C§‘´]$&*š†[PÀmPU·Ü,V #‚™ö}2…;»;‹B@µmËÒ†`Xp¡]èšÃ— ˜lBb"âR0EõfØv÷ÖÍÕ¦¥æ¿Ã`Ö§”ˆ(„ж]ÝCUl®w3KÛͦœ«CžIb+3s5µ+ä›MZÍWÍ©BÂE’ûD¢‚¯”2­*Up4MCëž5Z­@&õ)ùÅ.û!JØ„s&´6繤š&+)S8™Š„JÏfšXÁcäѤ#úS‡'“©Sñz¥oιáôMšY£“&ˆrÎ#/ÅÖë5y~°·<:Üÿèg>a8›«™‹9’fH™¬ »»K6&[ù¢x“PvÎsqË®Ñönì'O~òêþÝ%pzFº¶Óã¾a¢¦ÝlS¿vP˜LÕìÆ¯Óµ}Ù\¸%G €:#ò-øû¡`""¦^vƒ i…b`u+œ‰Q=Ò±U-fžÆ² #„T½(3³08ÆK¡‹€i67ˆ)+‘)™F0gs1—ÀgÍ5'b¡°Z#dSÍj(NAž= ƒÙÌašaF9Gg7Bñ’-;r7!HÕ¸3 sšLÅ-' bë'ª’3#š©oéùOýçÿå!ÈBös?ÿ·ß|óT 1‡˜úÔ÷½šJæ$jTEϺP%‚ªƒŽˆª­R§e&ݯ/½RÌwîÜq÷½½½—^z©ºS¾{~~>âÍÎê‘|Ú†ù2U†ˆê·¹XÖwßz߲ݹsxøÜaÒ-Gnv™ 3Øô%¸âììLÙîÝyîSŸüL”èîçgîññÙ_øÏ>ß,c.X®Ú ðWþʽñÛ¿¹>=¹wt(ÃæýóÓ{Ï¿xp÷N·Xt¼6ÀàÙÇ„µZKˆ¼«,!w#Bhduÿ.Ý—ßùÚ/Îï¿øB»XnúíñéY¥)_œÔÁ“ŽlÄÂ|zá—úˆ—¡÷ŒÌÒpX²Dww+®[xY¯ß@­ÈgYµÖ d¦€˜—¸{vf¡988@XcË¡in¶€/cü527}w®àµŸÜØœD dR8PŽ¡&e9WNÔ¥IÝLu6+NÇç* uýÄSA-š~õlOܽI¨ØofàÑ”'umìXDÕLÇåbï ºõÛußoàÆ FI%¥‹t±‘\Š9nÂ0hÒlÙ•]ˆNÆ‘4ÒtݲZÞn×¶µ¬:±–&'¹ˆ™Aá®6é³ÂÍLÉ/‡”v­—'X·w^w‡¡®ÒF—r) 1ˆr*Z=z¼¿Ú»óòý°¿ÇmthÌ#sOpcrr˜²j$ î©eæ†QÚ—ì®%—a‹ý¯; “~çÔmv0ß|«Yš’= "±Øä÷Tmx 4×Û³ôŠ feÀ«í÷ÇYýž6æHPia°y%2”RPœªGÌajLIN‰ÉIDH‚±!0‡È¤`3;‘Á€¸;¹Ã’&ÓLÆfPÀ‹1 äPÀÜM9(‘›y²)˜@šØ™×ðmÍZ'b!jch%´Xv-š3R3uT,'Õ‚Bì.c4 M`'"%˜ˆHRQ"±nÑ©ïSî³;5¥[–mûGþØÇ¿ísÿvê7|ï _ú©ßú7/ÖÆ¡!YmHEU…%„ žC¡áµ.Ή¼V¶¹LR˜Cõ¯zͨFe  SxüøqJéå—_~á…êÄÑvÍ0 "Uv§ŒHM£4N 0æU(`ô”¶æ–íüô,…O}úÕý£ý“³ŽÉf r*“§î¾ 6ÆØ.ºÍ¦_ìÜ9Úœ_¼ÿðáã/¿þÿñ?ýë?þ¯|úSã×ß|+¸|ðîC~ú¯~⣯hñþC¾÷ü}iâÓããíÉ{FpbãÑiÌ vº8ßH wëû>¥Ô4í£ûGGÏUIÞØ6ëõúñ“ã‹õ™ª:ÑrqÉ ­ìVwè0t¨É©Õé{@‚KãàJ!&4졹³—ËPJY mÛvMìDb³$=oVé‘oÒñÉ“¶mjhd½9{6üVƒ©ó¶Óü!jÖ 3ï|˜bÏ6ª26N9çJ¯üì>§Š¸#ZLÚ„ª,hL¥mG}Œ!+[ÆÌ¨±áZQtr·à*Ð)kÊ)'3\æLDMŒÌ´Ø[-–«¬´Þä ÝjÿHáZPÌe /¦f–‹¦(]×uwÛåâb½éK–®áJ Uw3÷ìÄ`¸ivE6¦6®V{‹Å¢¤TuÁ iv`Ô…i H¶RݳNN R"01Ä®^t êK•§×ݯ¹;PÑW«£”Â¥pb2ó³‹ÍÃGŽÞzyiqÿ™ÛÈ\)ƒ¤Lcx j!¸ Ä)”’jf]ñ³s¼$]¹îã³0'Yw‹ÞrŸíRhdY9^ôfûfk¢Å€®!á ìCæ\þÀ¾Òȸ‚§ÃY-¥bVœÍ£4,T´T½‚Þ¶î΂@â Su,r)õY‚Šƒµzø8 D£†A椖 ì´.ÉP` ¶@'PJ !,»¹9»f†\¬×•3RK˜*³;qÛpäÃ@ÕIDn®–²‹‹KÃÂì%;wQHˆ(#.&lDTg68»º™ ñ«yñø‡Hñ¿ÿÌßz÷ÝFËåÞJSÎ)%«S UuDݧø¸–T×§Ù},*7;NE.§ìÙ %"8žþùOúÓ¯¼òò{ï½÷èÑ#ÃÐ,B)¥s÷êÍ«c>åFV@Íî^㬇wŸaµZu±[.—ÛíöwÞÙ¦­OóÞ ÀuNéÕWî=×¶±ëÀ.Ög>zë­¯Û™ä[>ñèÝoþæo­>úí3ÃÝ£îìøƒ÷ªº\î ð>=9==ÆPWIn"ÌuUAì8<8ˆQB¥€bXqJi8??~rrp´ÿ‡?÷¹ƒÃêýrvþd¼E!z+–¤M®ØCõµƒƒ·aÒ¶¶+éÉɱæ2ô=3ÇeÓ„¶KæpïÞá–\– lûóóó‹‹‹•[/½è¸Á.zÅž;ÐV6ðÄÇñɽo·L4$¨y½ÌêÖ§áÒá#Á3çZãyTÌ@Î¥.˜ª,¥"ª<6¸”—òÝ®*‰«ÑÄñH¯²ˆ!´M×uK.(ÊÌmÓtÉ´é¥Û¦œ’©šª«)²YuòÃÌJ1KJõ`p5T¶»•RŠzÒ’cÎCÎ1Æ4)zîÖÙ­Fp¥5Ápuƒ™ÌÉ)üš¡x À·Íl•ÄU1Ø€šåìffýf«Å¹mÛšÛùÅxßXFއ«½eך¹¦Dœ˜ˆ­²hÒåK=QKÜ8G§À¡m›Å‚‚Ÿõ–10D«Ksw!ß’¦õôñÃ}Á:£[˜™åŒ6"·ìû›¯i|¥IéÈ5ló€á©, ÓÙÍ ”!¹+‡A«í›³™Y ÄË3ˆ˜ƒqð¢ELAdâæ7›(ÆQdAMÓÊÞX Óbŕɘ§š„© D ¨1å¾0 Rrqqó’³ÂáH¡º ìBð’LÔ’)("0EÀX¼/ÆD&2†—Èœ@±pp3OfN q¶CŸ†!“sÓPq³\JÆù·>ùïÿÉÌ8|ÿ ¿öS¿ü¿rv~²ÜÿÖv¿9;9M¥¯âD¬(ܘ0yëq} îŽÕÊ1:T!à4•še÷*. •¼X,ÌìáÇ_ÿú×>|h®f¦Á²òxiL5AÛ6Ó¼0‡„‰™ïÜq»ÙÃàÅŸ¹ŽçŽ]kªE[ƒÔä("Þù¡Uò9DÆëîî;ì\wT5¨wÚ9TÚM IDATï¾QSc"à$\ÌÍÝͽ7  ó~“\KÆ´‰6Ę×… j°ˆX‰ÕmÈýùfÝä²Þö¹Xp"g-=L…-@„ˆDB¥ñœµOÛõ&Í^r±ÌBˆóå›hÛœ†’KŽL@pUã™*I»o}d†¯×þºk3ȵ ÃÀæLÉKÊZJ÷ðñƒÃïÝížo™¹¨»‚«º+!ˆÙJ»e:ÞoÖZžXz }èö”©Ñ»6,>wãu·Éÿì]®ö)ûÍ€ttïÉ_úï!MÏ}BÛncƒ‹3,š¿ÿMך÷p¶Ùœ÷xÿ¯¿ƒprг[#Ø>v2%(³K$1²Œ¼“ Sã™­sƒ ‚ƒKI m˜›&ô®*¢PÛ"'“È‘[¨©[*Î ëÝ“ I»ÐÂàZ÷O$™@ÊÖ" FjävEÑ"]Ã8†‚Ü‹€ƒÄ< V4g-Ä –IAö‘ÉCÐhólÁZAƒj)³T‚n.±”b!¨ª•²·lïß¿ÿç~àOgÊ.~áâý·7²Ún?òÚ0 ŨÉ0BÌʦ‘ @ÝáÎ2i!ìLÐÂQ}$ïøŽ,€ª ¼^¯/.´mÛW_}µ[´µûxÝÆÒIcüLKšbu®9,OOž?}z²·Ø;;»X¬>úѵËnsº©ûÙÅ`"Úëív{~rº=?³”Ÿ†ç®ëYï6'ggt1,Û°-ë'OŸ@Ê£Çýj¹¾>K½®ÏÎYîHG›•F¤TiS svDiRêSî„à!¥’í7çMÓ\Ÿç!?yÊŒTòr¹Ü ›é|/…'Ý=@ŸE_ž"Ž¡éÚ¶mÉ‘û!§´:ê–Ëe×µfFÄ ¡Yu:€œÔ6‹&¶e{³ ZE0Í¡°‘9c€–âD$ÂD6åñðx[ßÐJªe@‰¦´=7"ñê)á PÙG2’{­QUbªV‹ˆ“Ñ,ÄX)íã%½âœ¿"˜©š˜‚ ¨Ê6¦’M•IàyèÏ ‡ÈxÙ¢aXÊ}? ÛÁDæ."]Ó6‘¸iˆëbÃÆ…’ÔRÎÛᘈBˆM›T<ÄNd1÷m×ÁÈ¡÷õEê³\Øá¦Lêsâò|BÓ­[×#÷b¾vTÕ¢ýò›SšiÎ< ,€)Ÿ¾ÿþû/ܽ»·Z쯘ÉA̬^`&E ±diÎÈ·ê_zúÁ£‹·ò“ þà¬}ÿxï"-ß:8¿ñº«Ó̶2—qŒo¾OÞÉ[üoà@14 ±ø°ÝfósµW‡Õèpw…oÿhüÌ+w¿åãøê§¿ùfïOnüþ‡€#öÈ c%“h©º"äd,ˆÁ-çÁY Âî^ÔkPµiš³þ¢jSÂ=kÉI)[¡/ƒæArn…•‚6ÑcÇ˧€bÕ Ânf¾Š &ɪC2%&A@‰ƒ+YÓ½êq‘ªž £ùPÀ-E(JbÊe°âí¢i3ªüK-æ…D žŠEŽÜ·’úÁÜ^záþ·}Û·~ßü8ƒóÝßxóg~õÿúJ?œ.>š¼Ùø6 CÖÊÍuwfîºn[JzQ€®%U5¬f^.oH+¬`‡ER7†aX¯×)¥RRÛ¶Ëå²¶Ã0W’3©ª–zÜÀÌT/cj©ÖýlK>~r²¹Ø’ʃ÷Êc;Ej'%¦]"q½#ÎN/¶ÛmÚœŸ¤TV«Õƒõ{/Ü}a¸ØzQ °P ©zœwç§.b»Œ1®Ï/t»%öÖ8ñlÜӹÛ@D¥+‚›–‹ós¸Æ¦q泓ӳ“Sø¤D°q%6/#„Cî5§T²™uMÛ4Mà8l.š6¶1º{N%§R“V.Ò6æ%3¢PÛ¶Õµ;hîHæEÉ|u0+P]jOŽÅŒÍÔ ;L¹÷Ù¶ÞnBMb6U50Iý0;LêóDDBœ4ù® Ö”oZÝ*#„«àËþÊ’™99aôT; ÀM»Ø[ì-:&¸ÜĆB"‰Ä.RÇn}\_eÍ$í¢ÛÛÛs'5vBÉÊFŠ‘Ð0 ±ƒK±!—¾œ´]\.VGG‡‹¶Ëeð’%pÉ à’G6ÄÃ6 H½“Wžy½WëpÏC1oÓtš×^± ½SY"Ê9qˆ Q%Y„aÁONNÞoÂý;wî>wе$‡°‘‰[ˆ{¢ ³“’þµ÷Þ{ç铇Mð&z¡زk—§é¶ù¶þϸD_z kaíªGF10 È…‘d¸Õˆü¦j_k/à8<Ëå—O×øÊû‡{ø7ÿPücß‹¿ñ¿Þøý4[ø:d©jÓuÐnHIâ°ZtT<”Â)‘RwzRL“— 1Æ.*4g9‰,†¤E¤¡¶sÉ€äãf{à%«S3J눙ù%în7ιíb ó¡lB:iœ›‹‹uhè`¹ÐÒë°Rad_ÅгyâØÇÈbJ~‘¶¢,¨‰ÁZC,Z.VÏ¥Q>Ý=ÿæïÜÿä§=úy.Û(È‹ÀûÐ0±›Àƒ89FV;éÒ­Õ20‘º9R iÔ͈ê’ÌàNP÷&PŒÜ6"l%'x戨‘Æ()q¶X8`#w”ØÔ'<£ƒ€˜³‚†(Ô6!0™³‚ yA“‘zô,¹r—BALÚu¼TÍä9VÍsi¢²9;3 „"Ànä¼h6W5ÁYÔ©¨ðÖãVVÍÒJ>æ½X€ŒR|UWv ë8»‘Á¹2`D¤TmÞ*}0+â¾cåì¶2I=Œä^Ó¨XlwjPcémÛ^›²ëF²LÄ"V½d A!Œ êæf¨â_B1Œæµ \¯…L¢ý˜ÊhŒoyvM×÷6}«ƒMÕ†à^cÁ~í¢ãwÎYCñÒÅ=~~%µw\VñBÆÎ}åîD¼{¢q $L3g‰óè­ÈJDikÔ¦63+“£xhPË4 ¾­ãP>ßn×úc0U'*°!‹Ak k¯^ßË…‚iKÓªz)E ÄchHª;€d§Ù­{C ãƒ0çiW¿4;Ï”O´QT<˜ÙÙÙÙ»ï¾{p¸Ú_.â ÷Ú¶uAZgoòÿòÙ¿ú•òÚ»}Ú°ÜtØ?hc»fÙϹìxííæþ«øìËÃÿó6{JÇV‡€e$6јÄâV\Mä(.•ÀNÄÑÉk´VتÎ*ˆbC¦`R6/Î.ìNÎ aVfs1°»‡À1Æj ›©¨!'íVBÓ `ž‡d 6ÄÙ¨ ®)ÁE5u¡õâdÊ ’&sª¹}b$L‘ØkõD8ÃÙmL`&®²é¦®ó~·ÔB§ý©Dyù£¯üÀü !½ýµ¯~ñ‹¿~q±m–KsßôÃz[6[÷Ñ/é㉙K©ŽW”ˆ@5ÁÙù²Úk†"…Ãu«e-ˆØK©3áuò].èi?Á #úަ®šŠ™;YÁ5š>v€®ÁálÈŽ;j&Ì/'¬ªz,î€N(¥sŒ–„ÝÇrÕÛ\ 26!ë<Ó4=žJžjþt]·X,úálbçía¸žO£3peZe>¥iºR65ELj˜,ÒD‰Á¬¦MÃw˜‰§TÂlrE ƒx²àuàQž¬\1û¶ðﺺc&\àú*t)б xó ìÚ±ªT»™af?°˜¦Tã´êsjfsáùµ–(ðú,Í…¿hL+˜ã&s¼ U§úך& › ñù€8˜Ù9*HÄ ‚1S#ÌöQ¸ÂÀƨ’/7c/ëè {å¬È;Ãt.#¹s)åéÓ§o¿õÎáÞþb±wšü(óÙË‹ö$ÿ½îÁ_û ›££%úß›” g=ÿmõþ Þýâ¯á{¿»í!o[I+þ0º T“CMQJ65Í‚ Ä0«E±ÝÝÍÌÌÈÁäD¨¤[¢±ÄnVu!x2XιÁ¨X««ÚH ¦„˜+¹3±Ó3ÁRJÚ"¡Œie‡³˜D¨$×Ú:í8xõg;ÔÆBDŠÄB䓹RÈE¤>ñ!‰Á˜ÌU²îw{öÓááRBùžïù‡GP@¶ÿÿø{¯¿öÆz£ÝÞAŸ¶½öÛt-˜:O]Óº;ÈÜKõÞš9€(3à]ž2wua‹HÓ41Ƴ‹í쮩àN"h™Vîã¼<65¸Wí'ªˆˆ²æi²¾rÉirN{›,ˆ²ñ é‰FƒÛºê2ù¨c½\ŸkÑ(ÀƒšAS¡K¦`p íµ›¯Žƒ„¨ÖR5³¦¡Z–5—ëuRkÖ Ñõ‘÷Øùeîî"Ò¶mÙŒ2V=è“k4CdÞ›™) ®pãt—•v €ëåBjçù©Y×>gÍúÃׯy>åÛø xDÅ5H›à“/ëðìð¥e¶{,f¸;)9³»óô+–‘®íî\3ŽìÒ^‘&ßÀåØNÃîÕ=®Ai¼@óš`::¡±:h@ÕX6ÕÝNί £êl,.䮆±ê9ªv#O”gº…”D£QïáéªÍ’sVS=nJID˜±Ýn>|t¸¿¿··cK„8‡Í×Î]ôû„á–äÝ?h»m~R†ži† ¨ÎÿZëVÝ56 ‹¸Aœà`bášÃ,‚YfKU‹H™<–VËúNl2ŸWK5Yƒù1°0„ªùͳˢ†à/‡ýȵ6{ìæoŒÖ(]±¼wxÞ¾ À—.èùóúS"‚p]QÏæy5|§Õ»û\ö€ÆúŸ\O|þþt_Vl$"`fÚí- ˜uMinãJÛç`ú5v@MÝ­&:›Ùb#;‘œ0 Ú<3ž;À|I—Æš§‰ÄW[u‹@ëõúý<÷ÜsûûwVýbÑ•×ìÅ/¬û{«—žlÞYŸ7áw![}ÈÛîm@;NŽ5J‡¦ÿÊ;Íw}vó…/oAíò`½=ÿ0›Á¬Öë ð@D¡¸ÔQŒŒ˜„˜ƒ Ø`–aZM¡º…ùÐgS´BBbf³KÈ­§ÀL®Ù,;± ¦¦h_Š !³¸i…)UƒÍˆŒ.B,dI£ê¬­“œ2¡Yðâœ,F¢šL¥‰#¬b2³£3¦ÊD2B•³©k©ä6/ÑWÏ­†¼6Ãç¿ÿÏ}ü•üÂ/üâïüÎëM‰ír;ô)õVbÃä°Ù`f À‹ºˆÁaªiͤ¸tUÍLD!Ž|«œÍ*“ªÆH˜J¢ÎÄ%w‡„ñCŒ!ÙÚ̧ݎvÇø¹Nq¯ÝÙ€›ì¾Ýí›MÒʳãîê¹BÜÝêtHpÞѯ;œØOWgÿ±Š«{Î×%ôFÓÓ­²)£Uafª—Þw"@&—ožÔ€vÑ—ˆ(F÷2b=á)oK)Ò)s¡àîU’ŸÍSÊ(l‰ˆ ÀàZ`xÒ)rdröòH¹­f•UmV¾´Ô™ÑXÜׯâֳþ;·|~+l× 4ÏnãÎoro¨’‡ueJ£HŒ3ൔèH›ª‹¼êàÁ|9ÐΉŒ–n¥¡M0\wW˜x|äbîäZåGX`êäÒ|ß]1«~ ‚S­ÛMääl^*ôRkv7bè!‹©¤c}C;Ûºû ÌÄÌfʼn9¥òäÉ“ï=Üß;\†åbéEÏ÷iï­“mðuÔî÷Îmü Öd¿ßÛ³·:•Æïi|øÆÓÍ¿xK¾¿ÉçüáKCB ¿©Õ<|3…˜Qj‚.³³y!8y†ì¦„à3ÀU•ÌK±4¡m8d !³“øhŽº»Kˆ&²(p·Á”]‰ƒ… N f³’JnÅÎ$ †/½kiÿŒÎHD\\îQ"8$F! g˜A1Ó,Sîd@"r¶].c¦üÉO¼ò—ÿÇÿÁj9º„Ÿþ;?ýþÇY±l:³žû{Ë£Õ~·¼W±Ê̪8þˆ.$ ›ñ07qgnwJ§MèḚ̈TJéû~èûR OxÙ-ZÚÑÙŸfF+“×KF“w|n•„ˆñ À5Hœ¯à×e«‰þÌ4sžÃ–õGÖ¢ew'«ù£cR/ CɧYS“dK38ŽÔj«áÁR»©ŸD$1bÊ­¥™‹»o‡¡†ewõú4W£EóçÛ\Üj>‘YÉÙ‡a @¤FææîÅÜÑh4P);3Ç(-sÒFx®Ï:)VƒëcýÈ €>Ëz»W¬2ó¥‹âª‘z[Ú ü™)hòà>{±êM¶kÏÛ»¨w'ÀAkÐN­¸Ë´P¨´w`¼F'`\X\ºXæãjuJŒwµ_=/Ÿˆ¯¦Cð@`s…³TßC•™ïÚPûO Dµ.£“¹°y¢@}?õ¥fÀÝ ÀV¯À4†—ÁÈëbîpUH…‡RJÛþáÃG‡‡‡û/.ž·ƒ÷Ÿk»­?zøÁjHïG½×­.ò-×ñ€›Ö÷õÕ;O§ëÖË÷ûÓ½¸wâY·ì-?„œŽîÚª9õ²X-‰].¬ýÅ‚\C ÔHÖžJïeKYÚH Å“ ¶·ßºú6{*ÊH H1 7¨Ph©d‘í¢‹Ì…†ó¸èñ¾XCѹIE‹Ä£Ø‘kß÷ÉtÐ Š4”i»%K „ˆ˜¬$½(Ô³«@‚ƒ`ÆPX¯) ¾1fæRTʼn n ö£HVtÑt¡kr.¹%ëix¬/í¿üŸü‰?C8°òð+¿ò×¾þúpqf«EÓ_œ¶íâ[?ó‡>ú±W^zé%„¤aîÎ d–SÞ ´)¥¡ÏÛm:~zzzzÎV«ÕÑASqºŠß–Rªš`njÃúâÁ[ï¼ûÎ;–SìUí7p2GUš+b¸ÙÕ¦6ÆJë´2ÕùÍ$⌫Iã~ í¶ó•Ø\  €ÁL3¹ñrì`Æù¨õÕ¸À(kìu¦™v[WBuãÜ@)š7çDÔ„˜ÍL„‰œÙ‰lÌ®‘`²Q³ˆÈc±R)µR†ì΀¦"Â,âTÜ®n–¬@І+Œ£„°í×C˜c±£<ÎÑ)^Æò¯,kæ^²2{×ŦiJ)ÃÐKlæ¸Ó¸ú¢ t]Hd¿ÉQìnT\v§)ÿ{2Qƒ¹;^n®~óyÿL;xçZ î2sùRÑŸßÝ«Æl‰s(¨yƨ•ôØ+îzͯ«ËM@'VE5‰l›“¹kL†'ÊB=UŸ|Ò l*@PiV@-¿A3Õ°Ž€`VÉYÎ^y&02#Ä ÎUÎ¥Z”j5¡y‘åãfNìDVŸÖ‹íæõ¯}—{Ïnïù²øíûŸ¹Û’,.ÂÉY¦¦L»©OÊ´AWÜó¶ë;Þ×ÞîtxÛµkºãÍö»ËïÞø£¡×Åbu~~zx¸Ÿ•-ï÷½„&™¶«ƒ²^kŒwr¿ Ë¡ €úrÙm6=€år¹Ùô#8õ#ÝDD DάêfâBN©a…’͘‰ÎEIÌœ‹W‘ù:¡ *Ä#YR@<ÆâÈ(;¹¸PÏâä ã–¤-ù³ßùÉûy5g•xüËÿìýË_ãôä¼iš’}³íË¥yxïÞ=áXe +mÒQJImìRJ9—¾Og«‹ó½s€Û¶½ûÂaŒ±mÛBµ€sÎf–BfóÔçëm¿M9YÓî5 lŠ5^*7OL›íùî|7·Û\;¾Ê+ÁZ³²ûùü×E ê¤0uœ¼áLóÍ’{µ”N³ž»k Lª›)iå40B *_îAÝÝ ÎsNË<3p7‡‘ûü̺+`P3ˆØ­š}ˆšiµ±ìʪc”NžÞÍv¿_âåôç« H»?›Zà¶m« •ˆ¨æYÚy×hÞMOÚÝÝ2aÕå,0›VZ;a»XK ¹ÃSÝD/ æÿ}þGd“‹vŽ%WîÆþ\â÷4úÏž—OyêDW®ìµýL¦íô¾,DqãHÜòùím´Å§ß{¼+ä¯ùDf¾…µ.¼ï{wï½÷Þ:"¢•}ÊdàÚtÕÃäSZÓµÝÎcµÙ4Ý¢¡ìËöàüQ6lïß‹j-U:~zxÑʪYÒ0ÿ3³á±:fŸgÆp§ùXw­i \qnF»ºCöy]RG-Ýy$ç 7-ÜwÍôqc>ÎõWš4ߥ6v„AvÇórárÕÞÅ÷q$o1Ù§q¸¹Õ{Lvc!'ø˜påõ1b}¥‡¸º Ý}.ªì—¿ý¶…pPJᩊâõ>ìxv?™·l’µËa¯ýDLG^Þ¹û‘wžÿèyÛ`y¿lÏ»ßøÒÚÓ·äÍËwr¿Ç¼øö?þsÿÕÇ=ø'¾úÛOý_žþÖW€Ü¸5ÄgÛÌ ®ÆŽ—>‚ïüÜsßúÖ-óÛ¯½ðó?ûÆÖ·ѯ_-§_ký¿ú±×ÿ?yþê§?±Öw¾úåüÅ_xéƒþ¡3®L\#FG²þ¾ïÿ–¼9þ™¿ui?›@l„“ùo?yq.ã¯ÿ6 "ä/þèÇö>ò–^žôoM~ý‹'¯õ¤‹÷úrsÑ…ÛÚ‡€Ç;’Aä£<ì¤â4M|×'!ñà carÀ‹éüĺk±LN¹XVW*ÌÜ4 ¥¤ªZ«¶in. &´ ‚öe› EªÒ6DâB^4¸0‚ø6Àq ÄI„!ÕX¹‹Ua aØV¬BfÆ\ŒáfÆâDàš3«pbbyn¯ûÎïúöç{þ°ôÅ/üÓõå/?zr^ ÒPJ)Ê9¿ñú×Bäå²K%¹ª\s]ÚI4³êú33U¯Ò’ëa³[ìe~J·6ÀÐFa£” qc}J9åËñßi·A™\×|‹R\ý|ž%ÍÓµãŽle’;¨¹QNT 4Ï€Á—¯N>¥-aŠÔa´f3}Ç?ITÓÁ/]Ò—ÃtÅŸ7¨©3õ$0â¿®Ôoò*Ç|]c&Áé5tŸ;혼—\è9ìú‚€GAŒºüªk¬Ý¯ÍCúØŸõ“^ùÎuž•°®ß'4'†^ÍËxÅ蓯‹4"€2¹]à«p9®·//Ül _é)™=ʾ¥ù¤¯6’ž}Êgº¥8A-oy㞦®awÃ.W »ê“Õ_2Ãíe×§Çè2@uD?zô¨mßÛl6\Jäà0U½¶^ò+Yó'—o÷º¾|íùíY|ñÅôÙï:9;?9{ü±ßúÒr¹wxñô|µ8Jö¤Ûò‰ï8ÿ¶oïÞ~ëûþæýUÞüîïþ–ïÿþ—/Ö¿õÖçͪյ· ÅLhŠn‰ñGÿèݽŸüÜOâø)þÌ¿ñçÿ"ýø­†ô©_y¥çT¸«®Ms3MZó L]‘CˆkV vew\—×ìªZ&. A]8Á•4­™e’pbÃT4—ÆÃó}f˜ÙýRŠrÄ`gÖéøWZåUqþÿÈ{óhÍ®ê>ð·÷9÷ÞozCÍUšÑBÌ(„ȘØÛŒ;x›à)îî¬tâ´ÝËY¤»Ýídµc›,X±íÌd,Œ„0H Ä D!¡*•TÓ«ª7|óÎÙ»ÿ8÷Þw¿ï½W*9vÂZ9«Ö«÷}ïÞsÏtÏ>û·÷þmçØØß´a—#‰.âæ8ûp•㈫©›! BcpÊSKdeÝd€†ÖÌ–Íx[ x'Z à9 8 ØUÜnUEÓ>=/ÒK¤„Rpëy¢.;ùkélÖø†*T”yÉ$p¹5Ú37hª*5¥WݵJ©‡gÏž :&v)\M;pPÏÉÝú‰Öh–ŸNÚdüàâ«Vl2=ýÍ? í£yá9bŠYsS>‰Ðœ¼ïîZ&Ç}÷¹üúäêkpî&ÓÌ 2ÆÀ ‘‰à‡—\‚럱ø{¿¿¾vZZ}õ³Å«^·gaϹ"ëö' >u뀊Cû“S¦…õµôÏ¿ð‹û/¾ôÜ‘‡B¤¾`R Ù5=VάÆá%·à£K“"Žm–_÷æ=q´:a´¸;f-v­6(™äŠåΕký#Ÿ¼ýÄ¡§t/ ¾y÷nÁú3¶}ùP;QGâ V8# Šbš€½h!jÅÛ@@ìE%¯À{õÞ0³5±²u’Å"6:õQX¦ØR1!†"Uï "[Š/„H)‚8çDᔈãÈ…ó¹:bKÊäX½ ÇxqÌÆ-¼:â"Ï=‘ ‘†l¸ªJ,QɉçI½z2‘HY-¼Ž ÇÊ&ŽØª’^÷Œ·Ýö˜ítxæ»ß}àèÚJ–8Ž'“ ‘c¢n·=™ŒG.‚ÂD.\ñ×W¯_ {‡BíW5Z€"‰"¨Wõi¡ê]}ï< ÇóLR¡D‘ÝŠ‰‘ÈiÑÊp¢Í+Ãÿv6V'¾—´h^àJSo%ÔòçàZ’ !6IÐt7±@ ”D’(•&Áͯ:?P£&(G!§m8ÔàH‰˜ÊN•¶“šX£|h -iô}Н¤\íUë[ ˆ !p¨jîìÌLÖ6›] xâÚùxn¾j¬{þ)åørÛ¶zzÓ…ª)çŸTkÃ3ihýhTXãXe…Êóºo >7ånýKƒ!«ÔŒË¼ƒ"$•nª)—zðß-Ýž1Lµ/y£þÆitɨ†ÇK –ÔÎá£÷>ÍÓ~¿? еµÞbÇÑ,ÉÜÂÞákPL%¢½ Çí¥S{e|‡Ï<~¼µn÷p0ͽFÞ'í¸•$ûF©;’˜×¸ü¯€ýÕ³P½úšö׿<ž¤ÃäyæÊù"¶¸ú©àèÌúÚAG'S½ìä£gzËéóoÆÝŸÞú‹¯Äd¸<L—–sDãÉcžÏ\ù´¥#ôUHœóÁ¸v».öù‰ç<ï¢ÏÝyòÜ:%¹ŒwíÁåW·†g¡,X1 §Fà, • Šƒñ¥WÂÚµ|GÄbûò?œöê¼/ˆ1bÈj[‹Hœ×j¨óÎÁÄžœ´” [V/Ù85, §pÎÃâHUœÏ'ñ¤ðĆ™ƒx2Äd¬Ë½+s蚸•páÄ9WˆZGÄäÉ80¬µ€AErha(0ë{xa«A¤’ı÷^½*„@ ab"ÍÙC¾0ª‰Ä@!$ozÓBYƒñÙ?ø½ß9}|m2ÖR4ŒbFEãñ8 šs¢€÷(]{X*(ÏäiZŽ,•<ª…¡?^ç\ɹw|^XKªäŃØX#Æ¢ØÜ šÛ·Èö´syST×w5¸¼gK Ö…ý¼Â‰4]#½hh A‘$[,>¬Š*+C0Ð2pDà˘’`›¤rk§Y#Ç⽨@KZ ÔÛŒƒ_ ÔԽв Z: ¤ åZä6žVA;Ût%ÞñÊ0¡ÖÚ¦ò„ê¤5wo³#À¼ æ¼ w·*qyd)ej½£Þë©á¶YUŒ1sjþ+ÍÀ›Ún²f[½ ·^0×Í9 xÛ"Þé¹;:aÏ٧Ξ´µÌiÛõÑyØïsY–M§Ób0È’ÝVŒ¡,B;ÖÏÒ!]œNÓ¥Ý'w-î:wÂy×kï@'{ÀY§)»Ñ Ï3gÌ.–WòÛiiLã#Îáñ“8¸¿3XH±ú”#ˆŠaÿÞÆÆ¨q² ²æ³BޝŒ¯¸Ÿúèà˜„uÿÚà8ìpm¸ô:Ivî,]ÜeÛGB¤0ªŽ"~2H²ÉžcœxÊ'ŸþôîÝwq«ÝšdgŸwcûÌ™ÃSË»/ɱ£å4ëÛéFdZm³gxvÐiMÙù'é}>\¡c0åѪH¿Ç¨Èl €DYÁR¡y@¶Ã‚÷èp²PÎ$_^ìõW§ídÁ!^\ÊD£î®Ø{‘™‚´˜Aö çÁƒ½mY“°hVHÚí¦Ó±X»˜DÝÌMŒŽ[-±q:ôk™ˆ —º Ä;§½î$ËhÅ L\–˜$ÊR"MÀ™ 4ÑELÈ¥ÈÉhæ²hqL\¤d£8iqß9“´’gYæFq;÷…sÞC)6ÖZ&…S'xÏX‹'’´–º³'º2üþçßø#oû-EaòµÑʉ;î¸ç¡Ó«íÝ­qªjc1†òt[6ã,§$1Ef™•L)nŒx¯EpÁµÌ!ø•†ˆr Y<•\Yź"5l Æ+µ!¢EÈéæQI,T«DYsŸÕŠw)lé%ÈZÝR¼ç)8c®©™•ʾ2»JÖ¨5ËðìÒï‹‘•v_f@C$& ¤I™›*Æ—¼'dl8_Hé\Å!¯mì”´àÒ=Õ€•H›Spff¢±@%`­5 Ê*( •¨Òó˜UD-ˆ•LLœ02 ëj¥ò^¢Fº{®„(²D„ÐeC–ˆÈ°§¬Œ«õj â¸âФòCc6ë1Ÿ›b@„ » àz ‘î°dØÆ-¨¯~újNË1 Ösåb 0eWVb%Pî¶®7Eø’ËÓ¹× ŠkdZáAŠà8@‰¥ˆ {o:Y‚Òü e¬tväfæÍ* ç| ;ž/;„ QeSW ªTQ׸jýÏxh[c¼ñž8 ”‰ ¹,±2×Lûí鯯™Œ; ÚK­FÌŒÊÛ®tô¾)š›g‰Aëñ{€S³¼ŸÎœ^yÊeûzÏýZgÙ1¯>|=z…¶O˜^{2Ú}zýìe/'ý¥âSÏÆ3îûÒ9•³`?Q["q‘òÅ£ñìÝdàùQ•^œíb^oµÇãi˜fE¿µ˜µL&K°ƒ¼@–ÚN÷4¥¬¡U6›F@7¡ÅýŸ<¹÷¯oüØÏïúÒIO nxñîÿòžÏzÖ›¸ )LíºN7v W ͳt2ͦÃl2òE6ò'§Ó¢¿žn \Q€$±6²m–Qâ%gbL,ª–‰“Ñ„-cL—ŒüQT¸ âRñÄo\Èó 2b¶ 85Âä½²/ â‹Dp†,˜ΧâÙûòUw®Ž*'ÖpÔSò^³išgyd“«ívËÅÛ~òíÓ|ªì’8ù£?zÿw>byVŒÇž:ÛC¾B Õ™bÁè+å¦Þø*Ûc}…3;È…­7û-…æ7ñÍ/ŸäCæ+i|sžŠâ7@Ú¹ª¤T.SÛ®wÒ/dg³bVA…ác֒ךs;u îÐpßœg šVÛZbæ¹[Ã5ó}­÷TH&‡ÃV%8Ç5Uá¹ÒT‘·³‰ÎôQmÞ«³ê\%3u8˜j¬…nÕÈ«€¨ª™;„P¥šo —šiç¶^ÐA¾Ÿ·æ5õ™a¹àסѤr:ñ¼ˆE1Õi:žPd³^}K£k;´'ï8W ., Kñú‰¥£ùIª—_m/¿ÆµÐ9uæ€Óq¯sàÌcãŽ=sÕ³¿Åýn¯ÿ‚—a}ôÀ}_&c;°c¤á‰ÀlÅK§)  ƒ¼/ P€‘¢@§ 79Ž#ÐUé¶»ãp~cC¬Q•MŠþpʼpìH¾~/}5>{þº7¶y¸?Ü@ðÀ-Ñ'Ã’t\6i_~Å®ÞÛýõÖÆ¹wÎe†d‘a— 8¯Ü^ޝ~fõª«í'þrº±Q ra¼P‰®yfqèYËÆH¾óUäé^Š70OýþeGlzθi…`™ì{ ‚˜i½“[p ²0Æ;ÝP,ý³ÿéß@¥ÈÓ¨Ct4õ–B¸|—„7Û¸‡H#¼lá\qȽúeR¬œ>vßý_yðÁîºïÔÑ#<~t4ܘŒ$RÞµ°¿ÛY^ÉV|áÊdbªeö4¢È@ÉXbˤª&¼$ )£#[ÁAI+3”À&¤¥ç½ÑÈ2™@}ˆ´!be&à ÑÂçZ(ÄòDR"ÎuB¯»kؼé-o¦8ñ:‰‰ß÷¾÷{ìÄh⧘DÄgÄAQ*ƒ,Ë㈨¯˜´òöäréf}5M$õ¿ÖÌš¥@+›_µõl²ì¨7©?6ÞÌ;mž6u>4Ò…iÒRR•-n¶S¡Msm& H÷ÁYg­§EÀ\³% Ú^·µaˆ²Ò}çw”ýUÇghž¶½ €*õ.Ìe[ª¼„ GõÇð·fm•X­˜+@¨ÖRø“ Øv鮼™ìH0#Iš¡ÀÛê÷uö½Ð­~/åbATe" x:sc¬6#sªë2gBõP?KÁØXEU+gˆ>vÀZÙDÊq !ßUò¥ù>EA©D¶Ã8VœÍöl’­#TæÑH«[„!(Í=>/&ãq4°&jõÚ‹uưÚtžÚs›ðf<õ£‘xi/._4näÅÃí¥slãïgö»vç<´vÂÿοºoXà%¯>ýSïºìÿúÇÃ6Z_£ å%SØ99Ì-ÜyY 8ˆàÓÇ/ý üØOáC@7ÑçÝ`'u>7l ÍŒ¡Â婇¡Ë¼>f ¾¿÷òWó[n(“¥£ß]Uj•ÒÀsÇ qxð®å¯~yyc¸h['®{Æê³^€«¯ŸüÁ¿?àéÌŽx³ì(€ÖXž¿ÇRB¶ ªt!x3dÝÉ-¼/†#c%Ïs¤¸ÿž¯äÅÃuäMl:ÎòÂâòâR·Ý¶þ™1(†ØÿÔxÅe¯¸å±×»ãŽO}ò¯?vÿ}_9yìäp#›ôûÃõÖžîb¯ŽˆÓÜil8ÍŠ8b >¦ZfØ{…aV gq¯ªª9‰U"æˆ%“±0ŒªzBd˜¬-T)Ž­aëœP%…„ÅÊ0 ¶†,GÆ©‹Ôv:ÆòõO¿áío;@1ù4ÝsÏ=ƒñ„mÔ[nE6^]ª÷Z…RªŠªÖ¯t´ÙT5ªÝS›Û♸I­ñ‰@+±P±µl»½Îɉm¯ù{.ZËQl¾´S~tié¸.|^ˆ{ûŠÐØ‚ëžÖ"¹Yž [.™ÓwP©k¡ð6ê,U™¬†™‰‚àá:íìQ ¤æ‚ÙÒ°ÍŸh°9y†ù.Û?§Óo~ÙÐ\7Ö$ͳr”ˆ¸Zùa.5¼Zá?•uóìÒš5ŽÔOÜláÖÎÏök® µûWR×ÔÞ /Z¦¥äâ®F£(ŠÉdbâbqqý·Îþöò0ŸÁe½VcöþáÕOÛõ«ÿóuëÿ͇VíYNÛc à%ÚP0[P nù¡“ìN¦÷}qẠ¾ð7ýÉ(*ã>Lðj˜â’Ž?½:òÆQŠ{ïJVOgo~çÉ^¸÷î{žÔxï,€5lë‘0Ã'«cÿ— q€ŠÐòó¬ºdð•{½ãS÷ßÿ±G?zt¥×3W¼ ¬ž½S7ÍÒéx’ŽÓ"Ë/º*yÊSžrã oºåæ[žóì’öx)bä²þª[oyÕ­/M÷}åÞ»¿ðÕ»ïºïÁo|{€Âg)‹÷®Pï`¯™1̆ pRˆ°Q)<1…—بŒ7ä!*¢QSD°ÞhäÕÂ{),C˜(ädeòLˆ"c C¡`(“‚4J§…+º]ëýt:M_ûÿÔít!†¸øàþìÛßùΉÓIÜÊ&Ó"Y?^%„ôsa,`å F« dÞUQ¡€Ñ€ ÍÁìnÛÀÛ™l›ð¶š 5 Ñm¡¹mêß„.›Ï)³ËâÂ¥xɸÔXaáöÍ›j—«P ~_²s«–\ Û?¥Ö€ƒJTkÀÁDË•~Ö”‘MÅw³QRz\]² á–OÜNòÍIãŒUË$®²!…4y@ ôâ¨âH1õõ\ð?ò IDATúÆÏEìlBµ³g8%OÅæÇªgÖÎàf­æ&›Q‚ÚêÖŽoÕê¶Y:³’›µ=yî–¦ÈD©úÏà› {C«Ë µ¡ÃÏJt)«ì0e«‚FŒ²þMH©jêÖÃC¥‚¦Â Ï"TùNRøÂ‡Ù`0hÞ·ŽÞÖB\À˜N{WžŽ¢v<™LȦlàótÁP§pà)™µ}ýúúôZ™Åd²fà¿ñàc×]ßúÚ¤ÈDN—m+! ôо%pU/»]êoä-z¬S„aÞÿV÷ȃݿúÄ•Ðv¸ô)/Ü;4Xô¨ ‘€R¶"Ä'œ`cÒa¬}ásþ[ãìq§HÆ#`ŒqβмՉ… züÖåÚçž»ûž'wâ9Í¢…#v00d‚ûsÂÒ%¨ÒRaQ‚ŒwØàÆÓŸxûOll¬ßtÓÏü¾ïû¡×þèUW^sÝuÏèDiÔŠmÛ0#“|°ÑßXNFÓo~tccíÛ|ë?¿ë½?zöš«®~ãÞúêWý£g?çé€B¸×ÙûÒ[^óÒ[~ðð·¾u÷Ý_þÌ]w>öÈÑÓ?6êru*Äq+é&.Ÿ’‹ªS(Œ(ƱƒWᇠF@ĘLIóo ¬‹‰=<©9{ï½všBI…\/â%¤‘TM˺¬ˆÛ¦p“^ðü7¿é P€hµêöO||0t:‰1,Ÿ*i¯× ×P¹\iø±9 R2Nx”i€½³¡*@})„«]¬ÜA« (ë2‰!€ÕG¥Ü€š{qýM3eoø²)f/~rëg®ÚúËm¡oaEóDQ÷m«6¯Mé ÔÛ[ÉZ5‹ÓÞ[•ÔJ% ò— ÉžŒ|;½v¾lUI·Jʹ6„[*†¬R/Ô*Yê6xÉܳš¸ lÖzØU5 '¦Ð©™cÇ,?×ȹ+·ö\UµA¥9WÕæ¬„ô…ê{nˆ¶®ÒÊdSÖ?«¡ÖÍ(ÛVNÍ1oÖ?ß)š·ê×õ”è‡ÌºYh€±œH Ä_ZkEd:™¬­­Q«Õª#Ð*ÇÀíëjlÜŠÆé`!¶Ef:Ýq¼èÍêòîV6Xè$O3'F÷Fñ@qµwؽçàxtøâ‹1ÞHǪ¾#<®(#>}W^Öî.ôÇC@Ñëaq©{ÿC£B- Ô¡Õ]œŒÏ"Ú[LwÃ]‡PD'9 Aǘ˜Õ{¸ÂðªE(68Bêò“ÇÛQ”ÃeÆÄeRKŠƒíÌô7r6@ÔõÙ4Š}œ/Yî«{ÒÁÜ; àÄqÊã6ö,áÀ^:´÷,S¯ã]òdŸñ[|“)Vû²²šŸ<ƒÓç°¶ÜÑqrItð/?ú…¤íß¿¿•t¼WæT8 (\Âr`7Üezæ÷Á \>bNG“õ¯ß÷ÕýÅ^ÿ–ÿç¢ÝW¼îµ¯ãßrÉW«sdùÚëŸyíõ×ýäϾý³ŸùÔ§o¿ýÛßxàè±ÇN­n¤âؘBUÉ€ HABÄd#âÈkC¼A¡‘!VñÞ©O®tEçÁüQ1FEU½¢ìq 5ž\»ÛždÓlŒ—½ìû/½ôŸf&¶ŸýÔß>üàÚÚ°ãõµ$î¶[ݵ¾)çw'.ÊõRi¢jêÍ¢ÚþUëmk* 7UØqÉVûàƒÏMÍ`Çu²CÙ*€uû¨ÿ\Gº…ÿëö¨¹Ù™f7 µòªÝ¶ÌÉ`©Tçšf¹>ްU€ìœH NqUZßR>ÏC©*sß4kÞúqëy¨ž $#ÌR#cË5Ú6sz¨/ŠcãgãÆ-OÜ*‰wú}æôÖü’¶_ªe~¨™z¶@ÍÍ2÷йK¶jÀ%%es4ïÓÖúK¶¦&^zPjÀ˜™—íêØ¹xï%ä51•ZZä£Ñ¨ÝngYÇqí–_KǭŹöd8Ô|:š¬\zÙUKK»Eömœ‘Ξ‰òêñG{p—j«¿±1Ü8½¸ï`kÄg9¿(wƒ¼"/C€ÈVcÑií]·qáÓž8é,Œ¢¶<~8v"Ú¾XâN.2h ·Æþ@kù±tƒ±;žyy÷é—Œ§#=ö˜ÿÚ×èÔÑ÷½[±Aä.ãšK“k/µW^6>²‚GOhzæºgÒ¡¶°ÇÛUçÐ1­± ÅW_õ4OàsCEjb¬ Hó,À&‚IˆcpËXImõ÷îyñ5/½ù-jp×gÿô#¾ýÖ—¿ä’K¼ë]?ýú×ýEK("ñíÛnýáÛ^þÒÁÆwîøÜ'?ü±OÝûÕ£ý®žS$ƵŒÓ4Žà‹é4ÆËq26Ö·ÁR¨¤û¨…x˜¬ÈÈ"³SUu…ÏÝ0¦8"Ñ–rD‰²@f%³â'Á6òõ21 ‘Ì´sä œ›§]Ùþ§?ÿ«(º&q™ûòíû«ÉZJ…ã$ÓBRÑqLÁ&¤éB¡ª`ˆ2X‰¼ƒHˆC¬¿5PU_¸’S–IƒHШÜʤÊÉCl«-A+\.ä;w[­Äøö 1Û#`‚`¨ „ Ü”×—Jw-@yFC¯_æ‚-½]êí‹íT•Ä—€<‘{@]]G€þ+õCY IllDDE.¾(Ȅ侒Ù0„QY "&åÀzB‰ˆ)"%&…xÑ\Õ;R >ÆjIU¤瀔“:(–Qž¬\0Ðk¹%+‰³ä¢Ô3•¡H¥% U£\Mc0‚ª¶2Ë…ú°!âXmÄì@JÌ¢d‰@$†<{£&<DžJgxÅ&_74E`“Ó›Dµ¢cV-íë)qõ™†*#ˆB”" _ƒÏ *{FTá’‹; Æ¤€µ„ÍU „DÄÊí¶÷…ãÃçYüòoòh‚÷ýNNù¾LâG¾5zì…«?ö#Éÿ0k홾æÍ½ï>~îñcŒ[F§0Ž\¼?ÙXÏ÷»¾xÿÁ‹—?|ûCÓœ@ó”–ã™±à¢ôöÒäÊ%zʰ¼ølŒ]BplƓ֮.²I~ðâ|Ï¥¸é%è¯øÚ·VÎnm[,Ä3E¹¦ð ï[ŸNÛáþâ¢ßBýñ‰~NlCÅ™ wšùoTV; asz`N=˜áp¶g9~Æ•½×½xý³w¯<~ƶ—eCu @M†´Ôгç;zäáÕÕ³+gN G£•“Çògk£¤ÕJzíÎB»µ°gÏžv'Ù¿o×e—]|àÐþ¸Ý%‡¾âeoyÅm¯Ÿ'î¼óoÿàwÿôÝ¿ø¿¿ò¶ÿ—þާ?ãÅ@$½äÚ×¾öÙ¯ý¡_¹ëKw~âo>qøë_{äøñ•þú¹Q>ÑVÔuçSÚÓÙ5™ŽÆã1:Qœ´âˆçI%6Vö¤Ì–¡ðjÙzc”¡e–uõbˆØF¨æL†‹,ÕEQôö·ÿl«ÓñýèÇ¿ûð#çÖy¢"ÏsI8:ËFuNG)« T«Ò¼r' o^Ñiæ=•´ÉO€¡my„2¨r JTáÂnß‘ iî²9Œ­ 7¨$ ª~“)BU=‘-;LXª*!¶¥Ì7L0ÕQ•ãJ„Ê¢Zb  ¹A!µWp¼/ÃŽBÓDARç!¥¸ þÆu/˜C"ª¢ýK£¥…&ÏBèŸn†ÌÙEåi*¾”Ul*ŸY[QJ¹M¸µñóÂçhÛùjêÇ篤©Âטöy–J÷nµÏ5©Ñ*­Õåz±Ùìÿú2GgV?â‰6nÝbùÞ¶äyND“Éd8F†’$ NÑZURÿ Åè2d¹Èyíô:󙋯]q\ù =¼°ºÆiV(¯«rVä«g#-¢=×|çg~Ý%³rjå¯>~üèCPµ†ÑŠíéã­tjòl¢:l–ã#(~è5í·¾í^tïÝ“;?©Y†VOÇ—IgéÈ‹^í¯.Ò)¸ïÌw¬}÷hk6°P{½ÕNu-J¬Í“4˜Å‘;p¯#íäÒa?N³³Å†{ŸõòSW? ]ä sâÄñ‡ÔG¿³6XK@ORf‘‚‹L r0&É”pÕ%xÞÕ'¿~?>§²rn2B Ô~/• †©›´$+¼z¿¾šß?^;rtÏÁËVîÜF¬6'Ž X}âöÛ¿qß½>rääñÇó<ŽÇãÉ‹®WODÖ2G±5I+é%­®hÆF’D——¢Cí~ú3ŸzÃÏ»öéOO¶í·¾tß«^ñêQ¾ñþ?þÄ;Þùÿië~þg~ù­oxg”,iŠ“›nzåM/¾5ŸÏýá{×éãgÖN¯7&:Í¢(JGCk’Å^Ç9Wi’wí´-gÎX£Ì…ÁÂUSªì%D xx/ž櫓ª^EPñ‘iņ=?å²ËÞùŽw!iÁûég>u×Ñc'ư‚Ý–Ƙ86^¶G8¤rîÎÏ$¥/ÑV|þ³yO7·­Ú^éÁÕvð$0"a“ÆÙ ”âÊPCçõJm˜¥‰×ÖîQ¥²Rï ”üDå(±™2Þ·4º¡K;(¡UL&T5ÈÏJã)3Ký&pQ©„lD‰HKqRVn¥ªÍU0psV% ¾‹Êµí Ü)&dÑ™ŸÒÚÚ!"cŒµVœË³¢L Âõ¹ª’t¥R¶)ƒ«6nþ žŽš¯1;çÌs54ŸÛ°éKãØ§€†·­Òô@[|ßë‡RuàÓÍ .Ûfªxª&Ò3׋fmÔœÇ (Õ„†OBÄÁíîüµnÒ 5wªzñEQŒF#cLdÈZÅ‘ˆ°1[÷"Oúí$ét½ënœÛ3Yßoy·º‰N9Í¢YROãÑR:N¾óÈîýÅCýñ†‡SB«eãxaП ÓüOÿ(ObxmS2Yl†ç¦þ‡ 0e[x·Û#£hÌís”íUs|0ÀGÞ}ä?w<ðlÔD…ìÄÓeŸ¹ýøÊ*$u–3HdŒ+I²Øn|äC/,A »wõG£ÿô{+\ ‰•5f¶Qw<νKÀ£ÅRoñ™×¶ï>¼rôI·3̦¹ó3ü÷˜þ ,y¤Þ ü ÃZ*|4µ£~gÏÅ7Ýpâ#ŸJ¢^Ωdi w˜}î³wþÕG?“Q%çÜ4ËÓžÝ Âq|S0–ûf^ø¦}ñ „úNñ¾áÇ̽3Øæüõ;l;—ŠXcó @¥¤9 "RÁPËDT¥1±0Ôr«Êòº³)‚UÑ*·1‰ÈTÒŠAá«TJ>j 0bÿ=j†=  IE1à QB`çg C”´äå T4>°yÌÎ"V²˜EDá«¶:?Uë9­’åÕ’ÿ‚G}KyBÝ—*CßN·—¿4þÓF„Ò܃æjåß`êf4£–ëcUuòÐ:Œªt‘ÖÚr][EÊʹ¤£*±ÆC/l†§TSFR±Iï8ÖçÑæØAßͲl0tZq·Û ‹Hd£æ-õ†Ðíì&'g ê“fâMÉe¾Õ[†-ÈSgêu}/ì¤NöD¤ŽÎ¥™KÓ>г ²4ËÓIJU ïÀ&!tlk%Ë ¾Ýi÷2Šñ@ Ž 3§n˜È´™MVDÃm»)г+ðÈŒ 1Ô²žOX&3:Q®ÿ˜±V õ¦Å0¤“ŒG­q¼†ìÉBЪ!À(Rr€c^¼þÚñ m=òÈ!î¬!¦0A´“$MŸœŠý]ú½¹§ÜÇ©r4¦4±îÄ©Ñ5áоìÌ à{ ‚÷Ð…³'§+'§½Î‚ËŠÑ$W€mw"Sc(I’(RõÈs/ž™óV[‡ýñ i+ŽZI«óJ ÎLŽ=~ï7îºïŠËÝüâ[oºñ¶Å}—Ñ^›oyñm·¼øgÏž~Ï{þãkäu»––ßõÎwýè›ßležûœÞô‚úiÿýüãÏÝýùï~ûëgÎŽWVÖG#EÆ´“^óx<2**P'J #Ì`k|æ„HÔx &Ž#G“<÷¾<­«ª÷Âd Sb;W]}ù;ÞñEb[V|ÿ/?þáÁ†+lb*ò<è<åÏ´j­ù54ªÍ«f%\Ø·ÖMô÷fÙP!Ìè» (oñ,ž½k µÖІ9]¡FÂþZChÙ¬„° ï@ˆQ…ù¶Tˆar £Ä¤BZ&g*õëŠZŒªBLª¤,Rr‡¦PidÙŠi°, p ïnîðácÈ ls@iR6ªª÷¾( f&ÏÎ9Õª‹ë#šl âª-¿R¥9ìÛªk•ܽ ;œÆLD„Š‹±$„*P"nÚ¹zêõø”¾›Ã%Û6AnjÒQÉ…n>ú¡ösͨŸÛXÎó ÛKš¦ãñx2™ÄÖ4iΚÒ€5ð.òy²ÀQšt&vitzÔ¿‚‰T¬÷-@زòTì$÷+S>‹ £ÝÈîs:7-Äq7ŠÝx2@hT¸©BÒ”‘Ìt4Yge0‰iâ}ZŒÁh·9M7T@vÇüÊQ‹T:,©MÄ»1[Dœ° Š D­8q…ËZíd<ìy-Èjƒ.ë0ÚÌ…wÛK÷ó0(Š0-\¶ÿUWnÜu¯®SE7nKîI!NvØ7þû•¸Å¦#´ x8d'»ü†¬­ÃhJ‚N»3qùoüú¿¾óŽ»ëÈxTŒ§žM;n/™¨KF½R!>+ŠN̽_¿óßýÛwöTæ„–+PÈ[CÐB (_ž…ÙdS$"bÔYu6ã™›v\(½PºY)¸'­ ¶,–JÂ<]~Ü‚òU?wb¼ zƒ€|µõ‚…Ùfr¬:VÛg±É¦þ±Tª"p¥3—*I” !6‹hé5ª^Ä+…áQEE§O\úÇk£ÄD–acLÄlW%cˆ ˆKpÁ¨’²Á€Qf"CÌ kÈŽŒ‰Œ±–¬5QÄ6¢(∬Fÿ Y$xßS¯·6‰ÅIEÄÖ°a2LL0LᣒfkLý¯’«†ÀPÒÀ¤‚’x)|ኂÆc ¨T­ÁCÚ4£§Ìó&¦Î޵›K¢¹ã‡?l&’ÜÕ©0˜òCU]ƒÙªªŠˆÂ*i>"@ƒ3^ÉäUþDHZµ*dk®ìåð† Š2g´…ÉWPàûÐj…Öt'ç–ýRl4ªÜÐ¥"ÏÕ‹¼³þ<ƒ‡7° k(ŠÖŸs#}áS¶ ±êÅP•š€a²ÖÆ‘¢(@Ðhì¡Ú4]e£íNDZøN6éNË“Ñ^Š×‰”42H Y&ULcÍžùµ¯Ž´ÃÒvâЦq yš{Ÿ®ƒ˜;^Úâ‡Dn¡uMžuQt€¢ÕòÌ‘÷8×ôb¸" /äµiÒ¦Ýn*e/^|¡† Á‹z§ªõ„H|¡¤®È Z„¶ŠŠ÷ÞAÕ+RŽÒ í0렃 €[_‰;ÿÆ „¡Â¶M”ƒÁ®eÌû£>úùÔNaÑí,D¹LÓ±…í..®6ž½÷“ \¤ŒÔ6Š· Ì¥V0—ì¹5Ëv€‚ò|:˜öÇÙPÕÇÝ–±fšÒ<[Þµàsçòsy{Õ("ŠyªùdœJžu[ÑR»ëO}ìô¹VüN‹&Óå“'|ñîÿpÙÕïûþ—ü賞uãO}¨ÍL/½åûo|ñs76V>òÁ?ûéŸùÇí…¥_yׯýÈ«_Ç Í„Úæ–›ü–›ßús?»ö¥/åCüПþœõÙâÞ]«>wy¡…c†ª¨Ÿ‚ÄF!ü.‚‰XE¼+Ô)TØÀˆàReå§]yÍO¼õ­€ôº­Õµ•O}úããIŸ±WT &t5ÁpE‘ÓíŽàÿïO ¶…j¥O5Ï˪ŠÖ¡¯°¾òs…•Qãè½Y æÕ¦FÙþâùòèPêšç;66Õß (•™vÓ‹»2×–JëŒl¨°C_ýRa˦ ±ÞtÂ"lâ¸Õju:í8ŽÞ{/âTu˜Ž†1~µ’+¼'f† Âet²AÞq€¥µòtõ2V1ÆŽ,ql¢ÈÄjŒáMû_ÀKƒœ5×¹œÃ‰0”¬ eL0 DÂ6佇ÈÔ†OAÕ€B€TSÿš×µžhBþ+!èzÑÒì7!ú¾ ×ÕB«äÈ¥ž§ ´e颹«÷eë÷M}Q·~9[m³kçË€)©XHëiÝÑâüôÜ5Ç0©êt:]__ [kÁûl>UClö2󔺈Õ,´£]I¼8™Æ*D,\ÚO`Ë­dïéBÎB™2M½?YHzÃl”°&ÄY7éEÁ†x¨0´8’S3"j9I-¯ÙØF­Ö`…á;çWwZW¦e|á­´ ïs0ò\H­å¶ÐP5Hl<É2 O}(³¶"›K†£¢ç´þ„ƒÙ,Æ@Þ3€ÄÒrkðÈé%NÆ9Œ±£ÁD"éh`º]™ŒžÔþ¡K 0ì (Š"däCl\Öê.;1‡"³{ÿòîw¼ó×âí¿vòì©ÿóÿø­ŸzËÛßòÆüÿÛ¿/ŠÂ{¯C"C1—-(H|ê=³&ƒ£ B$šPfC­‡@–Lœa˜™m ™Šá®Ôʉ˜‰™Õ³© €@Ó&"Y‘…yoÊfgJÀ¥AÄ–‰È«rM€Õ˜ëðßjÛV0o[fŽ;ßR«×Äuu®Ûö‰›ýj-šõo ˜×ÛÙ…G•»ø… ê[›Ý¸éIXx6Ï3ëx<(Êyžƒvw»]Åõ÷á®­q싞Ï{DíˆÛ¹óÃ|z2á‹\‘z—‘)x¯L‰IZƒÕ‰[Y _ á^¡k‡™#é$ó£ƒlƒwÚ˜N¥gtBi…¦Xrp:æ`®§Ó Ó ¢¨årg)ñp;Åéú ¸¬€ôRÍìr"Æ€ DàÕÆ€a"‰£<£¬Á‡(´Z,{rÓd¡Ed’ÂÛy»?ž^üÂøóïIÝÄyñåò(sz™Œ¢Žæ9ଵûmÒOÇchÄI!™q@›@<‹‰²ælàzÝÞ4ó¹ŸÂ–Fº(Š ‘s^¼Ë  bá·ZHóa¨Sò.EÈinØìf†s+Ýݘ¬RzvêHrN‡o˜É»~ˆÿú‹”±ÚÓhJhÆÎ;›ŽŸ1uZ6Ê…ÚŒ,'ºÈÚQB;5ÆÙc¡ÖgDÄQlS)üÐi»ÅŠx<¶íVÏÄ´zîѳ¬nL?ôø?üɧ>㪾ü¥Ïùþ›zûý¦•ì¹øàïüîú÷¿ûÞ}ô#ïúåßt昌(ÞU˜L½AC¡ˆåSQ.©¯ „LB ç©ÄÁ €'uAÎRkKÍâC|d%UKrù€ÐÒf¨Fu½øæ ŒJ;©7²¹vÎÅqlŒ‘QV§aU)¥>Qˆò4%±¦’ÂbQÕ’(Ô€`¸0YG•­nKá…m& *Aà`°aXƒ €zSù*RW´Š§2F|˜°gfk ³¢H 'A¢×‰tB±µq~Nàz_ÏIýsNªÌøT±¾´Ý8eÖ 3nj˺VÌ af«$HâŽkÊyøƒ*ȃ@Áó\… !£hn8{iÅžfJ§¼¤!•7—± @¨äÚÔÊ ^RÀkuªdWIHh\ŽŠßÉ!ôKrT’(yëöšrP¢`RURUâ×€­1JOycˆ¼„g0+‰‚„¼QR…a£ Üép”EkCáhii)IçœË3kmdê'îLŒCêÓNwcaב…n÷º=tøé·¾/&»DR`ï}޽õÙÍ·~³whÝ.a×òbkq4žÈ×ï}áS HfãÓ£”˜Ú6‘ÂÇ`!|»/½hí oÇã¥ýóÞ«Y{ì¢Â^²Ô½õ5ýKžšRŸ:5þÌŸñ‘Ó t”'&ŸîúÖ8xvÞþòÿêÏÇßß[:2gd k§ÎŒ|º÷¿c`ãéÿÇiîб ?ý‹ÜMÒ…=½qáÒé$Û ûÿ¶óÕû¦i6ù»¤#ôÞkIû 0{ïÍÎçÿ||…‰Ž›ŽËÓ“nd[ñeÆÐ8=¸°©Â¹úaBd¬µpG k¬õÞÅq’çy‘ (óÊüina—ŒG’Nh«g…ãd,>d£›¬äâ¸=^MˆúÛ7ÔCÞ{T Cœs0(\Q…sÎ'ÞKp UµdTêƒê`XÀVa†!²d%¨xç½/ˆ”QAÄù"pšæÃÉ´=ŒÏYw<–#GOÞïC—|à³]tó-×Ýúª×'´¯¿†…Åèõ?ü†}íkVVŽüö¿þ?ûsïþ‰Ÿ~Û¿ú_·Üc´!ûö,îû…wôŸüÓ³ïyß¿½ïž¯ßõù‡Ï­¸Au¹«ÃÜHb à ‡¬»Ü^Úµì2M&…c8g’N+ŠÇãáK^róµO¿žZ hzïý÷<üÝo÷×7ÔqîÄpóþÄ0ìŒ ‹JA©ÄmóÊ'Ô?j•âü?*S=w|ÍuÞfLö»m™<»Ã $PpH·Aù ™×EŠ< (D9w¤dÁ´Çº9‚D4™L:N’$‹‹‹îËó<ÏsSuP[k'pÉ‹pwmõ Æ$$UòfÅ&VšõÙ0“*Ä{'"T䙇բÏÙ9eq®téªqæV 5ðjTˆe˜£&}w=˜t‡s³3³Þ6…Ùö£A8êNå‚”fåÚ<\«¤•­|îw³R½õs~gycs<›ÑÉ€VÚ¶PAâÜtvqj…3ù†a›h3\¹ÎR¥ 4¨~Ž€U\ÛLÊ©mÆ*¼3"UÉó|:ÚáÐÚaÁw‡Nt•ø´·ÿÜÕ×JÜ9·~jàYj_oŒñÞgYÊœŠõd3¬å¿ºÿï=œ 3É=œO‹{÷œ‹º,+@0â‰$6fí¥¯²©uX5¼×¥çà“K.·?õ é>?"IvË+ð¶_â÷þ¾œ8æT¬w&ƒ¯dg£õèÊkŠ}Kéz>” lÛY>"j÷Ϻ$šŒbçUQ¤þÿgíÍãm;ªrÑoŒª9çZk¯½÷Ù§ÉIr’iè» H¢\úFôaåªpQ®ÏûxÞ'*bƒ>¼ ÷¢*Ø>¤5”ÖÐ…&„HHrºœnŸÝ­n6U5Æû£æœ{í69\êw~û¬nÖ¬Y³f1¾1Æ7†l{§Oã­o 9­<\ýxwåO-ãŽ#»­ m›‰ãS`-Ðíî¾wfã.…îÜl5—……t?ñÙ­Ç6 nyš‚²NQN >å$8®ŠèO$bb#̬fìEƒññá@ff ©eô‹¢°IZVe–ÒnQN¢U™'&Ù…}“D„$‰c(›¤išeY–eÂÆ›慠€Xêj@MJ6%c¸¨†©Ž!!§ê 9$†ˆÉ9WøH!Eß.”¾/ïyj[f`»fbÊ5¼±º“! *J â~¿—v2ÎLÖëºaŒ‚³e‰\›”eYEáœCÃÁëœse^¦6Ýj#2³¤M Æ5 q“ïS´IZ¶]Äh«Q„ ÄA…¶kñ,!lö FDz›y  "¼¶È§€ÙVxï.ó¶Ö9nÞÞC‡e{Š& §7¶3ª7¬Šé~6> ª€@I¹æ´ª¥”€ jZÖ­-×É´ÑÞ¦35±VªÓxjÆZ¡ÛJýV$Åm­þ|:õ`Óu5 ,òzÕÎëf6qàì¶'0³6AøñîVU5Ér–e3Ý,I’õ@=‘ÖŠ‰ :·|j¨»xrràИ’$@¬5H£¢Œå™þ¡b‚I5+H£™å‹g‹E&ë½0CÅ̰†’ BºçWÜwP[i)€ÉªPÎ5W=i°:èüû'²î.s|â#ü‡û‡>§ˆ`ÁË"Û±D¾M eX˜™ž¿úGŠ|@ÀHèü’îLBø¡'b¾'åZ¨fa’•‹+˜@’.Náÿ¸®{Í«óC ‡Ü|®j 5&*<ÄÆ0 :Ý U>H9^cƒ=Y&vv0œ¥:1¦ûĘKD!TD¾tjI ²¬Ð¬ÍˆŒ¯\D Ã–'²¤GàÉ`¢T„ FÎ+‹I¯Ó,Ülf*§§5ì˜w¥01$-KÉ€‚‰,©>ø‚÷¾¢Jœ'« vÎÁJ@T);0ÁXa£šBHi Ò3” ¶®R61ëÇÑ•ÊlŒ/r'¥dÌ6³l¡pveàŽÞxæèâè‹ßúÒÛß÷'W>â/|á˯zÔ3:è8õôÏ»æϹæÌâ©ßúí_ûåW¿ìOßòÆç?ÿ%y1;›îIz×üÜ{ÑOÜþ‰ë®ýÜg¾øñ»a<\+ŠÂ°â‹*•Wh’°!›äEQ¸ò?þì{æÓ”$Ü|Ó×®ÿÂg——VH8s 'cEp @v© `«s«Õ±7nX»Žz_Ð)Q ~M„F§¯Ù¯jY³s‡ pdÕV€c*7÷ú©gíô £1I;sØNÿrÃ$ìt@¨¦ªe´Ñ_"B†{½Þüž=&ILÂý~ßeph;%Åü~w´<ÏdYf­UÕžµ¨X4CkÙVùñ:viGˆdVªjÅÄäRF¤i¼Ù–£©…ZCºJpêE]g“ ÙIuc³ž‘½Å"2»ãtoÒQÍíØíVôÞí¹F[‡ÖA…»híb¨K„i›2=k/¨¿Ý…«‹7(¼A׌ݬÿ]¿vjâÖ¤‘µ[‡¸áÿ­¯§êmO‘ Äô* ˜k’Wyì³QË¢ÛIDŠ¢ ËÝn·ì÷¬µÖÔ‰I Ì‘^ÿ2—_xìÖ… ]kò4]ÎÍ‘ý0–ÒÌ*Så¼!xYžW0< &ñI9ÙUTCbl<$à.¾úÉøê§ñˆJ(Ës•ÀûIöž7¸ëXéAñÀÏ OÝ~ðÞ—Ÿfx ,²€½)<ææøÄô€G”þ(T³²'X˜¯ÿØ™wŽ'åxv«ƒ¹™N¤ä`Õd¯å°6^ûÎmù¡ËN`g{a§fE Þ‰ˆ8˜CUm¯ÜÊI°A’Ë&e>)0'5˜¤c¬ˆˆx ° .ÂÚ†§IR:‡”;•Ž‚–¬)SÆH™RˆzÓ]쥓ÁÚ cÏÞ½vyx&xd)w:g«qÆ”ŽVdÖ”Åü.Qg"*Îз®U¿é˜‘8ÔBNlA*ʆMÜìBjlÄZPÛ cm1ˆxc 'T”ÁAaÕš;͹Ȳn6›V¥®”“¹C½[OÙUs༅ÃÇnøÌ§¿yõUïºòáxÖ ~id“ôÎ?pÞ;ßùžáè~û ÿ÷+^rï7þÑÅ+^‘f„*ɲû?ï'ïõÔç=õò·_{íÇ>ò¥/_/ê²NšØÙÙyõYÉe>bŒÎÎö_ð‚çõú]ÀÊÏþs‡v*È󼪬¦:­ào6ÿ›m‹õ€Ýûß´õ·=ì¼'F+@A¤SÞÜ]lšM'=Wu§K REË­Aª³J ¬cŒIXSyç qN]YÄÞL³åÅžË Á‹C-Ë2Ïsïý0Ôr(îà xØUMµ¨f¹.ŠH"¢AÄ×Ì Ü£lȨIˆM°™"¨y5›0SkS6ñ;ÝÊ)¬µÁ®‰ˆ¶+û2}»·¶]p”m<ýbêÀiŠi;xÐÒ¬Ø-Öyóm\+B01Ä»öÑ2Õ™Ö¢ˆI:Í…aãcµ]ŸëßRM{ÖÈÑæ—Au.¹F €bqZ"IL}ËŽˆÌN ïµiÞPÅ(Z^­3 5f++ï2éÇLÌ …ˆDrÊ™nÆÌ½NF-Îv{žÒ»*wRe”uæ“”‹§†1}Ô=É­~ ºK}»/oC£±ÍUÅ,ß:·ÊÍÏ¸ŽøR®åâ.Ò˜ZÏ50#ëïwQ7%ÚÊh"­šÁÈŽISžš­+vúÅÄ(»1µG!`v‘À"ÂÛ)!„<χÃa’$‰©#ç¡jÜ…Å„s'™KUP9ÉŒdõ¶éáœó$Öt3Î ß¹<×ÃhhÝÄ `˜L†yB€RÀ•Ÿ€ýyâ‘Ç¿ÿF4fœ‡M)ß«X.1ºë.¿ÔXe“ ”a‚ì¼ûÜuÓMXÁuÀ€e–—ƒMùúëô©?m¿üï¤ÆuS\yõü?¿{íòK.™ßO£|”®ê$ ?¸9Û]­rÞßO.¿tîð÷öªÜ9å»G-,!&Ã,Œ1AÕÀ:ì@š²—½²·Ðë­.ŸNûžbtW¸ŠôñL°"fÌôícçïuy5.C'Kó2q!^±óņy&ëamö»×'_¹nyùìèü‹×ýXÿS/à‡>ð­oËõ»ŽóU¡µ×þNÝnþúÍÈúá?qôůÄ{ßV哇ƒnÜv˜lÈÂ8‹X\EbÊ•8窪bï+K\CÐÆ ³qN$DDÕ ©@”˜Ùª’j údJU+çá-±5–ˆ`„ ˜ª(gœãª¨D<fÌd,e¾V•E–BMÿÌR÷È—ÜòÅSGN}ì¼ê‘ù¥_ùµ?l†;“$u¿úºß}å«_ÿWïyëÞ½³¿ýú×¾êU¿_® ö‰?ü£÷}Ðå—ÿÃeý×ï½åÛG\Y%ârNíÂ\omuíÐy{_þ²—Ø¿€bõcþÇ¿ö WZñ§ÄêC©Ò MSèîæjzÉÜljìfkb]œ´ø3Ú=vúØV¹Þ¶“õÞ´ÑåªumŠmO¯K´j{n]²îj‘oÝËZ¾µ CYIêRB$jHˆ1†¬Q6lL‡† ÓËâ) ÕL“µ+\Õ¦ú¨jL²ÖNª¢†j¼¶4‰WÇ,u´6)*]·®YU¬P/Ê¢ŽA@É2•‚6r€O­ bL{k·jÓvó Mª¨1:cÕÊQjZüpS ÁÖLß‘øÅ¶¿Ÿ:êžAÐM:Í´€œ~6‡ŒÕŽRQe84!¢Ïº.þrJîo«Ê‘ÆtÃI9Â8SÃ^ŸÿÖã»QG°iàèÚ2Öu³6®¢úÉ…)IˆÛÊ¢SÓÅÑeÂM„uÐV5Ðp÷ ,Ëáp˜¦i'Mb±B¨fY×9£aAýD‚Ϭ9ÓŸ­´‰âQc²4ÉBÁ«ËÕ#Ÿ¸òJÙWɉ“g¿ú%÷½[– ÏÔ+ýëÖ¬ X<üQý3§Æ7}£“&ãdfÍ2òí)ürE“ÿ¸WýŸòÌç¸k?Ä–ñ£ÏuÆâ›_ƒ VÀ?-âð5S'aæöۊǬ¸‡=öðÍ7àÑÁ‰Ó¸ý{xÀƒ×œz‰>LÝ ó=$ð®ÀùåÑ“µbéúÏ/µQl÷¼ÙÕ AlÌoaŠùö+·~y?ý«˜ívC~2À–ã½QèöxaaîÂKVή,ÝuA-ÀÁ·ÆŒI%ÈpPŒ1„ 8sxß/½âWo}ðU¸ãvLò¥üIO›g”ï{ÏQëî]Uîcÿx×5¿tñ¡û;qÇ7&Åö—¬A…D¡Ñ5]?N&N’$MSRfE’e6Éœ¯¥¥ U1b 1;ç$!$Ä 3KÍÀËNÆ•÷  @ † Êsλ„̼ ƒñD½ùžå“e¼J 44»²:ña%IýÌ8»ùë'öÌÍò£ßùö·~ã~½èQOxð+~áç&¸Ò‡q¯Ÿ]sÍ«~é^ó‡ÿÏîµ'ýÊW?¶gáé^õ¼ƒþò¯üʽ/½÷{ßóþn¸e8ªúó4 ²”™p¯K.zÑ‹_„àeí³Ÿþ·ÅÓ«dsÐh~m¸»KßéløÙ÷»´ߦ£·`ZµßÜI“â±EØXÛf‹VQCm̱6Ãß RÞVú7ÄE±”wáÚj ¡(ˬtƘDƒä“&­¨±\k‹v2Žg ´–þɆi¡‰sq5’Á,…zf†±lŒ2G&."¹àLŒ\€hM;ц+oº|6ë¾Ãz+gÆÎóÐÊ×6:ò3lº#m»[‹öž˜¼?¨Öî]»5žúM-:£{K¥á~ÓXìp‡&1R¡¹.³¹´´e¹‰OJ#tëoד‘¶éy“É‹8}Uµë (íÀ17ý›¸>%"3{¼÷¤!MÓ^'KÓTD’ÇÓnß&+àQpÎÚYáÓ¹›”å|—«"A «˜ÁÚäØÑÓ_üÌýþáÿÑ݃§=ÿéÙ{þe²züð©àmýdbõ%Ì/àA»à#[@Rx$3‹.H2Kº:›¯­áïߺ÷Ç_¦úƒ³šôVW‹÷¿ŽŸVÀ‚'Æ"äPÔwÊ¢7ãw$Àø«ŸÇãŸ[}çó÷zü“½÷ïÖ £²k'aqÐc ÈYéÂCúº?H íMÜ}áÙòb0²Sµ‡še…@ÈDêE L¢Þí¼1¿òy&+Fº½Ž?YäL‡,Ô qYgO>4ssÙhx ~â×—>þ‘îS~ÌîK´cF•YD˜Ézãž‘¦¾ÌA&P$y%ŒŠ—’òâ0<6;“N¨B7ïÁ^6?œ2êæŠ¹Ã#;{AY¿ïýqæŽ.Pl;NÕÌS *:lá¼0•W—qVx7›ÌÆkIbY8aC 4!cÒ^ÖóÞW¹·¦Ç$ÆŠMZ…ª ^Uêù>wÒšÊQ•È$s>IV÷Iª‰+º¥’’5ðÖà J²Y’u¬êH(O8±Ú .T3´˜˜k:g¯}÷HyË×òë?xüù/zês^ö2”…ídóÚßÿo/ü//ü3žõ¬§¾óÞð.Cû`fžýôßÿ¡—½î·ÞpÃ׿eoËöЪ¬¬<ð‚‡¼â¥¯ £bv.øò'N®”Hƶg‹ª4d6qC¤lˆÑ$&ŠVX2¢1œDiÀ 5† $"$!&ÖjË:ˤÐV7¼yã–H_×ø¨6I¸HrJD-ks”7Ó”ÃÖ¡˜fÑ(I•UYƒ:ÔÆ­!ŠFØõâ E›•n˶+œ´y±M&¥©­Ln‡qs Ñγ!à]ßzã°D|7K“$Y]ˆ±y骪*Ë2±P M&%á$UÅ ¨0´­ ¡QfkŒ!bQa6¦2Líó€uÜÁ@7M8±1 š¬zï‘a“0°ÐÔzBÖ¦""ÒÀ&^KmNÅ  ¡I[jË ÔÅ9¸6•V%ï¥,]ÚI¦ _©ˆDMÞöfØC[lÓ>´“ìA "b£Z§ERFñQ%ŠRƒÄûÛˆº¶øDL#w„êtÎC”P»U¡l#صöDD˜8–£–ƒë7ï8Ô\R™¶‰ÒFc½^ÛÄ* Èi¢uT?)ˆŒY^8.HEˆ•$ã%1àr*?š‚©£K™©‰‹þ¶`Œ¡šA¼I¥V!X‰¡ bKD c‚òp0Nlfm:77gm2ߙϫ*éuDÙ{“ØyTû¨ê÷{³¢ÎšcU«äé¼¹ýè•ò:µfÌ8¼ë-xÃÒ€¥£WŒìmÌ ~‘Ÿ²©PÕe>ûéûOß±tÛ÷`’ÕDi°¢“º=7š°Z1Ã=û¬>õ§¿{ì¼ÿ«tTN^ö¢óüå§þöïqæ0¼ Åi$KÈz<v‘—ýý¦XXÍ‘Ýõ½ÎÚñµŸûÍ#gÏvîú^eHÃDç·ÁP1k“Õ•ž8š~þÝaµæz¤>éi|Ù#‹zû\¾C±‡ÚÝ(;÷¼¥™‡‡„UP>˜œPÅ#·T¬™›¿•GŤàÐïíÍ–›š½$”ç"ê,›‰DÄÛí1y¥c¦ƒ0Ùcd„¼ðóºkK6³ƒ®133]š¬% 0ÎwQ4wj*$"ÖØÒ—‚ ˜ID|¨|¨œ+Ë2!Xkžà˜AâÒ$f2 Â{ >Fz† ¯#§puôIY•yQEYæUUd63d%W®,‚/>1Ë%k!>®$?¬F·½ís_ùÂÿñ›âéÏú‡÷¿& ntéùnüÊçöî¹ß3žùã_þÚG0Ë}/~ÒÛþô-O~ÂcFç ÂyÝžó’óÌ3òG!½~¶°¶tçWo¸ñäÉEïAHTØ;q.ø ¢¤XO'ê˜!ÐH[ÈÍ‹[m òVvSÛd»ìþãid²=Ñî7rw#lS?º±Õpî–ìš»mÓði;€].ßž6ÞÓhÖø@Á“w¼:Qï}¨› ¡ Á‰xQ/êƒT!ø4³išZËÆ3EQÔ7ŽÅX~išgxýò¥¡ŒˆŸˆhÔl÷D€lûoSk'pÛKž¾#í·~µõ÷Ó÷è\ïÈNmSoßGÏ Ím&çÜcøšÁl=Wþp†ºõ­â;]oê„ ¶ÿâ'5ä¾›%¿ùT5„P¸j2™LòÒ9§ª+£#ãñXª}Z^’à"£öT°·„°TÖÌ&tÂÞÑPÏÜuìÄÍwÍÀüo IDATÿw$!T]„‹n¿¥wù}ûjÎÔ¤8’®ÇÚC‹½‡Ö>ü/ËðP×s~ÿü̾^ÖÍ'Z ¯>é µü»3+KÜhïûþâìüÜÜåWÀ˜ªæŒ‚…¢ªð¿rÂÌe†àWÖΞØï'W|úS…sâ¼é¦³³33ÎOF•Ó}{÷g ÕòðD¤ÛMoúÂÌûß1¹è"<ùéƒ{:]MÛ1*ì\[å•´Wæ¥M'©M¼ÈÓŸsŸ¿WŠâŽÙ…tnÁ”~èaÔç>f€‘µ0¦*]€"µìÂl{ðƒ±o¾õ%Š.ÍŒ1]ÒbT˜dfy49±<ÄCž€ñÝnª1Ò²ô$TÓ4­ªBÄÀ&¬¢‚Hà'ÞN¬1$3˜‚‚,³…(‰(¼Øà¡V —qG³‚‰ƒ0@ŒÄÄDb€‰F#lâ0,¬D!X”£A.k«g‡£ê¯ÞõîOú³Ï}þs~ø©O¡]#¯}Í<ôaï~áO¾ì¯Þý‡?ò„_P*Ο{Àoþ×ל åOþó3óâg\Î[?Û1ÿòOoýæß^]©Œá´ئXm •lA !\»¶j"áȬ,ºy2·çm7‘] åiÁ¶¡“»ÛF踱Ûϧ,òöņô*ÚèÜétmÔ¤½îd™Ec¦`!Ôá|!˜š»_ƒ ²vøÈA‡Üü™ò¡ÖQÖVÕ72••@ë Oñ÷†“õÔ7‰Ç¿uÐV·ÂÆ¡éMÒtú5µ·¬ø†Û7}ÈV‘ÜÞ;Úâ‘ÝÉ ¶ûr˜º•›=›‡±åÃõÝð¶¥ ÚÏ6Áæ[ƒòvÇÕÛþ㥉xjÉÒP~PýPØærÖõ USLÔ&õNšp숃“0XÚyÜ)Ëpš0núˆHÐx.ð`×TEVPd)óx8v:cÌÞ}ýIÁYo²6XK ʪCØ“Ù9Cs4÷ËÎ.Ï‹²¬<|o_ç1½ì_\K¹æi†0v¯–¦7Óa £QîÌâÀÉ+_ý€-ª=9o»igé‚ÑÌoüÎ×þëm7~ V»3ý¼÷fl:À]óóKÝ~Ûñ+î7ÿåO¯!DPXÀ;f7c1^µ“5éde^âc:;¿guT‚*òPUAŽñ…›L&#„. ~y´6:«g1ß½(à °}±‡ÚL3¤¶ªºA–B¡ù‘p⮥oÞ\0ÊÇ!nP4ñiÕò€Ià*Ÿ“’‰€Ì±ðôgÞëä±#_ÿò²Á\(„•VFÅžÙ.4Gz6w’ó.¿Ïâ·Åw÷Hnnr¥8ít’|”RF°œ Jd‰Jp^Y˜:‰T‰I¨BˆTÓÌ"ªÁ +ˆI A ’ÀÆK¡$ÆX2Ibʼ2Ä)›,1 ˆU¦Yš$Ô¹\Hˆ»ýB©cºëÄÒwž¸í¶Û޹ýè·¾ô¥/êØÛéáYÿéåWÝpÅÃî÷œwüyù¼§½ ýÑ<òw~çõ~ð¦É™âÕ¯ùõ d»ZŽO~å†/¬¬NJl§òpNƒ¨±œ¦iåc-PGQnâç©ÑFU( ñaÖ:)«Áx¿¯•²Ý}ÙØÓºåºSÔq5MªuèC]•f½#R]OˆÐw-´´ÞoÛ½r“ße­q©á‚€ÝQ`ŽFP *1¶Š˜¡)Eþ%†(qˆèh홪£Qk+¢ÍÍqL<"ZYCÙuj&¦õÂïÓ2Øc$²h3‡xE¦oÄö×µÝ,é”órÚ©ÜÞÍM.59­¯·»óÁî4mô¡¶ÿ­ú6Þè:l MeúzwZ!Ûžq›¡NÉ`´žFÝ+®y¢è›‡rÍçg0^C‘%Rl6LuŒ˜Ð@0Q ÁÎ ë¿½Š ×#ñ ¢Û¦#U«ø¼ªF£Q·Û5ư¿H‘¦‰$´Úëº*¸‚øŽ8VaWuòI5M£ñ0_«ªÂ¤g&9¼¨ŸëŸ7^Yì$:žT°£Ñ@— ´ÿ¥ëF_úÄdÿþ[rïÇCtté_kï*ÿî/n[ ¼ÌÒÂçƒÂ`mFYH 8Pôó$ ÇFDppÿŒ/]QjšuòÒ/¯öʳ”÷ìƒIJ–g= N&R@43é*'H‚óÅñýâ\åÑ ‚¶¶_V°MzEÈAp¹3Æ([†á‰¡¦|H™…U I ˆ%"• 𨔠;H(+¯B!µÖªa(4ÄfX/Á‡Ðé÷Ôyq¡ »a¶‰!Ïœ¯Jrèp7¥Ô—UY¹RÍdéìL§?œ¬ Ž.^rѾ›n¹ý ¿ÿ§?ÿêå§>å°Û׿ê?ø¦ç?ýšëÿãÁ÷é>6ã=Ï}âÝÿÀ½YcGã³×éúã'F.(ˆ!,Q…ư0¸UY¡5)Z¤šß€Ç©ê”ºìrnêÞú±Ûµ­;lÄÁ¶ÿ1B ¤¢¶¨kBÔšVió.Ö¯EUcùäö+º;º6@h?:eÍlós¦€Æv!R&U0³8O¤5OLPÔw ­+Д`ަ$£-e¯ZG¨E¹ª‘#3ÔÚÌ”·~£,N5xßDMkK‚¸ÃøwŠyÞVR[½gJO‹ÿ­‡Ç žB\Úß쀔ìjaLÝÊ]‹î A×”ËÓgÜèÙd o†nOLËꌋV6Ò¾UjÀïZãÙ¥Mi‹ö׬ã(ÕÚj×ÈÁ+€‰e¨€h3ï0¢í”ªoI)&@ßâ¥l +çÜx<¨w×ù½l?QÑí!íŒSkËÊhµyå;¥Ó¼@éöÔévæ»3ý$ÞxàüñžC¸úÉXÜtÇmÈŒK—~æU˜íïù³7®–eTK÷‘—¬‡Õ☜GbÑÃÊ È:—eùÅëÏ<àÊã{>ÿ¯#MÊg¾`¶÷ìwnÔ2Y D]@"„nw†Ì˜ Jp®Z²ÙR+Ué+$3ÝÙQî:Ý ‹'ò=³ý´“†ö_œÿسÍé³á†¯ä;ÍÏNí&€ÁH¸½çOî÷€ýýç·ï_Ø{feÜŸÍWV'FnYe6³A@ÑËò\™ÊË®8yåçFýàTQ!ÉPâ8$=wâ®û\õ„êE¿3Þÿ•ëÎÞü¥½£0¤îQ솴s i3ƒÙU¡3;SM‚©z¢„ˆ%€É¦I‚–e 5¬²UA a£€˜ ìJH`‚Æ¢‰Õ @ÖZËlX½Š«’5Œ$PTˆÀi Íœ¤IRíÚ~’¸¢˜ëJsúÎ3£Êü?zk?øÃžÞéOóÈ—þöîü™—þòg?ûqªö#9p¿/c_üÀ'îüîÒ`yœf="£*Ä0Ì>„ Þ ŽQÛÁˆª»Fì€Ú­Û²·‡FÓj¿¯DÄlwKh,kç~}Gž2i×´­§PUl7*"šæpŽ‚Y7rO÷©;ø­ i,’æðXôѧ.½¿7è^zΜºð[7žøê§Àa_¯7OzZ™Dž>6AÌ¢anã öÌÞDz¬{b\ VG0Ébi€ ùRÿº¿=ö —?î÷ÒSù-2ÌÿæÍ8³`Þ»ÆR(1\ÜÏçǽœQ)­µ^´ê<沃ôòµeï+ ïeÇg{{Êñ‡?z`:¯Â—½ï|åоp[^\:7ƒð&€é97éÑÞKºlzË/ý8¿Ü›±Õð€ÚÅ+Õ{èÃ/ûçßtó7†i’Tn-1ó.¬UUìÉ:§Ÿø ô²ÑÛß4)¥ŸÌÚªX Ã¥G³Ìc²÷{7–Gn¼weof?NgýÔò×nX¨Šs«~ 4±$mVU!±)qB¤Æ$‰Í ZO¤°¬*!ñBV jŒ¡Ä‚M­¨‚§ ||zL„rCiP©œ‰œ•KL$2v%‰$dÒ4Q…qpªIHkMªŽ'#ñenÓéÍæ£Ü$ýÕ•Áì잢*WkºàÌJ>cŠ7üîïþÚo ~ø)/ð /ÿÍïÜtÛ+þóóßñžÏ’d„ÌãèÊhñã»þŽ[–fRÄ0Y|JÌAœH0iO šEMµÎ5¬Å¡Ži¬ÇøŸj ‹"ªþd—‰Þ$ ïOžÞ¦ï‰žîv‡Ö¿ÝxöZžÕ×vŽy{Z›˜Ô„_ÝŸßF¾Œ ¬B*µ-m-^0¦MSk¬0Û$I˜ˆD‚Ë Õš Sf£ ©jš¦dM<£Méhf8KÍž˜YB´ªåú¢¦ÄÛnT£lÄ©£¶Õ™¶•”»`›Ïq÷bûžÜ©m©íqGxNm§¤^m>*­½ùÛ›Ú5WWdŽŒª—]qƒ¸,#Ô1s§Ñoy±˜dç¤"#äëGXUDœ÷\UX¸yTàÌ7&ÃÅK†ƒ ‹ÕƒMÆ‹÷Gz”ÓÌfÝÙ¹,I”ÝÃ_ïùv7áðÿ¾ó;>¸Ž=„0$,XIä/Þv§ztÒÙJ‡Á80-RϬæw"ìûË· ƃ¬Û™ŸT&Jðí·âö[¿ç1 LÈ öx¬ZÌ—z€µJ¨€9QàoûšÌÍõ×#ïRc*=Å)ÆyríGŽô¤t ’ñ¤ÿ®·Ý@ÒI¨rV²‰/ɦ>=JîÜ4ÇsÀš-+3<[úa^ð\"© E¨úP`øÅOÏÜ𙌈Œ@¾×]üùW¥7Ý>þ¡3ƒrÒUÛëäUWøþ"ýû_vÉçŸüÛÿ5%# F惮q, WFH–+¹°ÊnFÙ#t^ž±ï¶Û—2=PÒÙs¿¼„¹þB#©žZ=Ûï'¾˜ ¥ 9{îQj¡à-\ÒÁ â4K6U™‡à¼œg;ïe¶7‹Â©+³4 ÞÃM’$ –Èd.Iä6xRϘºìØË¡c$ p±M¨Ûc‘ È‘&ÖtݨÒ$/|èÏ$¡Ê™égƒ|YŒ.g—o9ñ–?üó«öø™} èÚ7þÏ·\ù¨Ç¼ñ÷~û¿ÿ毻r51xß;ÿæ;7}%ŸŒ˜÷Q:Ì'Î{fÊH•RùFsg"V"%‰:»URÂÆ(Hh 2!‚›:ÒR ¢0 Ö¶Z;5>Î@qÿxš’ˆ¨P|ˆ§EQ|á5 !²' J± hˆ†YÜ"Ù¼” DdÉÄü¤vXFj ñq‹åaj|QàBmäÕ€äz%¶¸ËX[Ëf Äàši!!(¬£`”ˆƒæQîbfÛ䔄‚Zk²þ\(+£ðAœóM‚!uÿÞµ($’ÚÃç|ȉˆáƒsD« CFÀ*V¡!@”&³Ä¼e³­¤rÖZGp"E£ðAUÉûà%(6GÅÇÆ~C–Aûmðµ7ZÍÑÈ­9ŠyJ¦&†Sk´.Òý¦hË-·Av›Ï»ƒÈ¨j?kT6Ö}±iëW 4¬±x×ú±ªXÏkŠÃÔ••ƒˆØWë#‰¾_%‰y´‘èú'm¢zdÅjJÕ%ÀÒÔm€Y¿.šî1 fÓêPq‘L{½–ˆ5(ÉPí ˆ¢˜™M½|kîÀXÂu*ê•Ó›2M BD·#OÔ°IÉ¥„¢Û%X,QتÑ@Ç2½AžKªl=Áwì¬Ï±vV3Zîuçï:uœ†äìdraÕ=c“d3¶×³ÖÚn7ítzΫFaÑ(¡ò„‰éZ›cl›W´cý‹•ÉÈtºY™O ¬Eâh…(É%%›ä¨ Àˆˆî$ªI7!ÑJ±Ÿì¢Ö†Eb÷ƒ•/©1(9^¹CÕÊ]½­òÙŠ!{’tRUUéT(¹Ó™UµíŠÝ½³îa>w+U¦„^wÑp@fÝÕ²…«Â˜<ââw9ÖÖœ#»ÓÔ\9;ì§0]¿¶v%z³§ïû°¹“ÇÝ©cS œ_Ðë£*œÀ%¦cÒ¼¨N B@fé)OÅÚÉþñoO‹çuho) ¦ª)Ij4(«’‡V‰ ÏY…‚å¿bm9%§Sq.Dd­U£E ŽA±nWdÅV6IÍa"f5̤1¸Z‚ ÊLJHPâŒÓ„SR ä"Vf#£qnXï<|ìõ¯ÿ7ýÙ[!:Œßñgo¿æ§_¼röè¥÷¹8?ö‘kOžZ4Öæù8é2‘m•\‘Àf‚I/ë·@tw×íº Y#k­7ª)¨m=©i H4)çfƒi}´ë…qê›ÑB^Mq4nªQˆfxÜvjÎE­ƒE#_½-J¬†¾_G5)jÕº®çgÔ—:ÊÔлh#¥ãtÔ’9DG­g˜/Q C¦™UƒhŒµöÆ?§˜hÞDEµØõº›4ðw A¯aË(-Œ1–cŒ%¯4°Â(ëf«‚jÒxHÌFjíï²tä«„*ÚÍ ¸ y}+˜žÃžžUj8ÿ‰ˆIR—›õX­iZ˜§‡±ÞÿÇNæf}7Ðøÿ›D*„º0)­WÃhníT‹aªªâë…€:²¿hŸòyß“·¾RÄйFÈA!ëThñoKg±K?Û|²eÆê¯jŒºæîX‡w6ÈwèÎÄδó—´há ¨6ô^ñ1N´m»r´d’~7‰Yê „œ«¼Êg‹qjÀ!T“ji’¯ÙDæ÷ôÛO“îl¡Ûí0ŠÆ7kŒ5Ö”U ˆ÷…÷ x&IÓÔ{OdŒ±!¸`µ“03OJªA쪪•-ë=TUB§—:E¾Cª./6N ïüjƒð[²Ö« ¹ŠD iT9$3ý!„­…¬E7`´}ÿ;´sÀeqòàÜy«ƒÖ»†g|—‹™£¢_ùA|”‚U&h·“1c2Ùc’r& Ç À%òe?·ÇôWßûgƒ¼Ê\UÎÎv×Nf:sÌíÛ?/–ÅY¨µÄ.”.Çåí½ëèòEοô!‡öȧ?z$wýÆ_v`$hp^”¢!Ä*1>1@€À‹g˜õÒ'ÆŒƒ” ‘Y¨ªˆ Ñ¿ Žl«>lÉkÔ@„DYŒe8L8–h— &ÌY ÞWl–XDêKX"ÛEb`%>nÔžA˃ñ\/;½¸üñë>uÕ_þí‹öš~Ç>áêǽä%Ïýè‡>úŸOýDΞ]Í'b¬í̤•÷‘›A¡ª¢¼€€ko¤”ª=G • #"jš$Ÿ¸¥Hý%'ÍžØFPFè4AMxD iŸö†±i³Ó펣S¯¢¤y] à(h¹NA¥-=.Üjô0ðx@kv×; ϵúO¤Z×ATUÃFÕFÊ\j73  šp5fa‘o¢GëÓ5 ²!Lm_âƒÆO’nÃd£õÚiCÐæØ–TA *Ä̆9Fés¤¢<åÉÉ…‚(`TI!UV´ø „$A ©×ÔQ$Ƙ4M7h#S۽ǖ­ÍZi½“ÍÁ¬*¼^¹Í-`fÑV”|¿ÞÝ­5ªuÊBu#¿ÌÔAñ/TÖk:5iuѸl …&pÓzÆ–f­õª1Ö¬^ZT÷²>EíªØ)l‘jØi‡¦b&Z¦žÀ–“ëµ_#8¤ØäÕ†•5Y\¬u§Íïcv½ØXcü¶†uA\GНû86ÙúÄW~È”å£J…ú,ˆOŒ-äÔ©å¥d˜õgæûÝ^bæ²Nºoï¾Ê4™éuú©í«E©¬“]P…9 `Ûg|‚[ ˜‚¨‰%©#»é|žg+I¦Nȇ1¬t²nQæ'Ý´—íxwÖcmG0Þĵž²õÁ{k8MfCPïH±¦ƒÐéÎŒÇ<ÛO‡Ãª;_ºq~``¸ëCr®«ûœðìþòE¿˜ÏÏŸ°o&ÃÙŸíÞtöôÇÿuÿ·ŒPæ"¬TI)è¼k9ÇÙ2•Rç˥㊼W²H³ü!Wõ.À^ZLªE ‹¬|ú¸ýà?z7\ž¡ ÆEö£?µÜAÏ?ùÝ+>ô—Ãgl'5£0:W±Æ¸Í)MVù±$(4Ä}"JL9<±´RI…EcaP"&0‰Ñ–a­& ÄŠ$1©±ÐR‰¢!8eReï™Sxïƒ(ij…cUfÅ_!D«>ˆø²Ð?ÿ_ñ´{ö¡ Céçõ¯;|Ç÷>qíçÊ2;SVªqÖK\…¦v¬ ò±€7q¥Hhcmï(M‰XU¢±Wb°tÉ™FiF³‘Ö¤”¼Î2°n$oqøQý“(VãÆ!M¨*ÐèܼŽÙÅSF¬±§›Íª@Ü”[1oí¥ˆì5Tä:ޱ*D:l×ë;HmôC +˜MÔ¤Þý©ÉÛ!"e6¦FVY´ÒÚ¼hrK¬!À˜:9‡š©¯åÖÔܲÅŒ‘¨5ˆ÷U§Ñ%V‚PôûÖ³¶6õÚD d@Æ¥U"&`"“0(Kƒ[÷…o”‘fÛϹaó'.¢uË“šxòVrL¿ÝÚç=ݸ´!ÿŽï‚"VuªÕ¿uéÛÈ.iÏÞÂ-hÔDl4Ó£ m1­é¯˜ ¶k šâò«¥/Á‡CR v¤N© [/Ëc깈’jSSšjIˆö­h+Ÿc0WM¦ŠH[#ˆo§¦:Þ©ùoX/›¨f"”ˆjUs:"qúömx½ Ðíu¬R›Ùd2^ñê:æ  EI‡»}kEƒLFa~îˆ÷ãzñWllB>žŒÊyfÎòUÈÛ„T9xƒÇ»“•lmç,€W×ðÖ?j^Ö©¤²zAf¥(º1QšPª¬C:ÑÑéË>ùÏ·Ï€Ñåt5”pnîoß5˜M÷97“¤¥¯ª÷üÙ@<+ E–öü$iGŧ•«*:97Ÿ½çOæJ? [õ»ßuÅ|‘¬ T‡ˆNœÓøBPˆÉ’!‚åDYÕSL Œa)¬†ˆ¶ò (GöFQAÈTƒ‚™X6Îq!5]K†¡! *`QÈh Æíˆ%æ Ó7Û4>f£‰‰”¥(Kˆ•8 Óéøª´Ê‹g–gÒî;þçÛÿÛï¾Á$)€'=éI߸áÖ#«§Wóq§×a+e5å8 IDAT(EêoU ‘Öq¶ªµÌ z`ª %6i–õ–ZoVá7™ªDíãv_ãfÄú÷Ýö¨:M¥ÝþÚ¿íŽË¬kþÚcÓ†žMRKôx Íá:U’¡VÞ›µ.hlÿI’Æ^â-h¬KÓôÆr5åˆÂZñB‘øš•À0qK8‰7„˜×%}#lH• G€óy-€c‰õ6*{#ÑÁ”Ä3Ä«jºè(ÏÄaSÔx4 ©j¢¶ö´ ©².B"jÄû21³’R˜Âk·´u¹qç âƒç£ôþ"‘ÍR¶y»½w`'ƒxçxyj¾ŸÖõOëåÒ½×ȸF Ni@jÔŒµSƒ)æµ5ÊÔ…Ç Ûv4J*â×o )–(0Ûë\ÿ»k›^œ­ú²IdO¿O]|N£ &ªs¦¨ŸÛ ¯õË©UÃzž¸Éôg¡×±C&ÃdD1~žÁL¬ÌSÏô½KùPåW‹Éª,TzbNmjåÍýþl'é)—e¥l®ßÙ7ß_è¤âÂË(OÓ_%¾LUçí:•·W.œ&6ˆ¯ À{'€,K ¨þÚÞ4زì*ûÖZ{Ÿs‡7äX™Y•U¥ªÒ@I kD@Í µAXm #ÚvwÓ¸±#ŒíˆwtøípÛŽh¡nDwÐ Z IˆAX€A„B€f©T“ª²*3+óå›î½gØ{¯å{ŸóîËÊ”IGô‰Š¬÷î»÷Üsö9g ßúÖ·6ÝÅE¸Ôµ¨lhP-A@g`" –€„‰ß6㮿<(ŒÝb“´É0ƒ O„8ÂÔ’ßØžîît)*¨ª§¡ëBŠM²1Ÿtq'’%1Ûdt‰{Ü¡¸í×€ýƒm¸b´Jb¡cÀO'³°ÚmÑ¡öÜõË ,WX®2EÙ߸ LYnûÄöÁÞÁ~=%TÌè§ËÄK?‡Î»Õ ´9Ù“ÉÒ,:¤Ä¸o³vû‡Oû¨°u—o=‰áljƒ& ÎI,"dµi$S#«¥œ9b6 ]‚sô­Jš¨ðg˜ ˆj1¦“S"SÕD)õš’I‚öj$±À9v¦Â*&½fª¬æ…½0QJ‰¡Y®… «ˆz/ÎIJ‹ÅêÓþ™|^MxÁ‹æóùdZ5aéë 8J]ÒDkåIcö¹RUUÉ”`Âæ€<—”#©rJA—t¡ymÐw 3JjØy †·%˜¥òœSùëóœî‘¥‹ìÍû­§ÁÔ£¸ñœ]þôØø¼±Þ§Iéü’ ¢(HÈ´_ó¿Ã{QžÊÉÌcOC>Sñ^J)Ç`„XL^ÖgãW)¥’©šæ¢ LI¡ cÔ’‘0á¨3g8Ú‘zzÌpI ‘1ýü¥Vг>e.Æ(Á” •’²šÁ˜X„ÅUDdEæ²X"2K1F¹Mb*4äzøUª Fbñ³’ѸôM¹æØ‚5Ä%Å»ŒwÕMvñvþJJÕw­9ŽŠz„ý×#k´Gêx¨òœÖå£×o#n‡Ôº„ɦ c°0ÜÒ·æ4¥Ëåºàn&µåßsÖ›ÿËÈKÀ›÷-µq–IÞÁ¸&G‰Y¿W>ÊcÀgV–7ÌÄŒ;3+Àt™^ܨê=r×NØÒÈ;;ídºÁž¦ö°3jW+¦4ñ}Uõ®^…éæ b[­BfZÄÔõ¡q^v A˜Ïê¾_„hÎ×ì§ýj)"€¤”˜b×iBÓ& ºT³9ݶñuR@'@ ý>1þܸ<õ󸺳3&cÊVÉ2€TLBd’kµùöƒOj”Pj%‰4³¥C³º3A ™U+©‡Y2²ÊQM–zë\ÎáÌHŒB”g—%¨0QêƒFõıª6Ü1i‚R©”ÙXÃj2ßÅæÆtggçÅ¿¤}·šNÏ^¿¶åÊÕ¤­s¶lÕ(‚Œ‡äo€ˆ½™ŠÌÙbä,&g“Ð86ÅrÌ@"ƒµâªXˆ‘ )eE!0³ÈëÅQ2zÌBd¾t¹σ³,3V˜J^H8>O†Æÿ"xP1ƒñ8È4ïѨ["óØ4äcfs*Ç™›2ò±@å7µ¬È в3b‚Š˜‹&Eéå šLIIUS^ J”˜ÖHLG°`Yð2EªXÕ’•JÉ–0|F5Œ`\@~2cKtQtŒlô°÷"2ñÍIBž',œ˜èh.ïMeptëù«Hr$DZf)­PÏÿ÷¦Øëo²©ÝÆR–ÃÁ‘'EÊ ýÑ 8Ò´40˃2 LJ4ƪÙQèåãÁ—¥H·Î€õ¨®Lƒp 5‘|+¯å£Àè oÚʧãÀÀz¨Šµ´8_—ñÇx ŽMZºÙ—œ?®c\UF| q •¥Êˆ€¬õã¥ßñçíÍgï{·OÚÃß}ýêü>öT0Y®ºi]7ñ†ø«w?`/åÖ½/xnëDÜÜvî…·¯=ëV“¾™¤´_oîž»Ø~ÓClÝŸfÕé§Ûû“ÛSO@@Ýʃ”YBà™(j Æù»ñúï¸|ïÅ­íísŸýÜãÿƒ´ÚG<¼hpÓêz»š_8súuo²‹/~º®ðÄ_Ýÿ‡®[úÚ-×ÿĦëR,>ö¹~m£ª–Q‘úZCÜÚè~èïž«sïï—4`kÎ?ö¾ióâ—Vû¸x× n\Óg.Ýxú±îÏ>Þvxâ–û¿Ývç0±ëùÉ/4Ÿøm,÷pêôÁ¿÷à?ÿÇøW?³ãWr¸ëv¯¹½w÷ÆN"£©¿pˆg·'x÷_Ý_ |Jâ°8¸ÐÙqõAßÀ×mõº7¬Nœ —Ÿ]†@í$)õÍ*üÀ»d¾™>ôs˜òÖw¿«ù;ï~à_ÿËÖ–Í’  ›œ£TM!t=‚u>y&eÍ* 2ˆNTÍTÉ8?a¦ "³¹@;ÌG   Äy@Z£¨ˆÑÜp׫EK¬Ñb/¨“³©&XTö"ÌšB§A8ó `¦¢y³ù´Øj¹X-÷ï¾ëÂË_þòÔ·Õ´î›æ±GŸjšU´è<ÈS2ƒúL1Kf¤ i"Ñ”€ÜÐ’…*Ò"›As_}V«ƒQLatÀ%0bæ¨6ŽÊ4]d#¢!Wë´d¶™ë$c)íf0MÓ3Xòë`µÌ"gS»öq7 còòÛIŠUh,3ž¬Ô\q:ND$D©ÙÅ@ö\|?3K ɶ¿ïûd-ƒ"Æ&ØW›õzŽ5ZL?Œe4…ªŽÆ­Œè04œo‚P©?`8T`L.³]4¬ªl`#"R#ÇPfb64†28)ÛYfu,ÞMjéº-‹Hå=ù›&°yÊ£aÇãLw.š‰G2†SÃ9æ´nòmf¶­oz;ÈW-§µ(í 5K£¢½-ŸÉ±aP4d±XÓùÛ“ÒÞtœ·e×Xvê É”ÌU2’ 7sþÛQ›ÑM»AºiÑòëë  ùoé€qäƒÀûu<®çpg´eݬµBC ÕEK%_[“›¶7½õÜ…{cÓß8{~÷Úµë7žoÎ|5ïÓ^Š=a»Ý;ýÄç¶Ÿü,j_;sîÕë¯Ã²nN5»[6œ?8y®è¥ÝÕgÞø³ÿÛRºö®>÷o¿øÑ~æñÇ[ 'Έšœsûv¾W¿ö›NT×ßû¯®Ï·þÖ»ªïù>üÖ¯¤¶»6ßìÚÃédcùš·,§“ÍÿÌk¼õû?úÓ_ÿ—ÿâÖ×q±{ö"¸ÊÏÜÙ”@`âÁUuíĹxXAÁ@³ÔjþÕ§þêÄG>¸›+³í·½/ÿVÿÌ3¸ôè×o¹óo°Ý9 ÚøÚA|ê@ ?³3ûÕ÷/þÁEþ¾ÿXé=I‘ªÚ_yN”àí6ÏV˜¿ò»úêløõŸƒééÉæN{èIóeIOTÞ5«M7¹¡^ñê½MÔ¾oö`:s«. áE/—¼4½çÁÞóY÷ÁÿêŸì<üÚƒ/|z~§Ó'T[®%¹*ö4¯«ZûØS[ñ,ÅÞM¤6£®ÕñÕ¤s‡¾®SÇt"ÎÁRXÒ -s%y7©\@ßyyßÚl:©šö,Zê˜O'ܵÆÁñ$öÎ"üD˜SLLnbŒâ«ÞzǬ:ÇV š`",•©©:¸ßØô“ÉìÌÝçøÇ~\&>!<þøï~òOC¼K-–MwªªªÄ>"¢ÕÔ‡BäaVS14yì/<£‚1—üÌ‚í1;&Ǩ ¦P Õ(; &f‰"Ï|5®¤Øž%‚N”`˜v§Ö›õ1ƒâX2®žƒ/¹-JŠ–©"ZÉ pyدªšEµh*q› J Òˆ³b×t=oÞôep¯F33 "24>÷Ï(3s’º®ðlº1›NCŸ›U[O#ªd"^ò¸UíAž ÙGñH¢VlLQ¥Ä9PS&’lg ,a ÇƘc‰â\¬0»” °DYÿÒ\ˆ©nÁ̃›'U f6Ü<%ScvÕd¾1ÛœÍ6¦Uí:¶Éµ^ôP²J€¤ì¼õ‹›­éXßö(+IÂåʉæªëº¦iœ«†* ŠÉ¶â¥°–0Ñ€vÄãŽö¸~Þœæòs‘r®€Í`ʦœÐÝæÇp‡ /4œj‘â\¨È¸¯—ËUÎb€ oJå½£ì¼i j©RJÉyÍTî'+žR‰ :b–£Ò¼º‘r ¿„bÉ4ÁÔ,9Êf £‹…p<:ÔÁä64;?äbéâËn 4èÏkʸ`YÇDm÷‰X5²™£ªWKÈÝ"AðøsF³×»ò’ø‡¶g“¨WÍv+é쥧ҳ—®lÔ .ø}ê7_óê·ö¥¯¹ë©§ž81{u»æ¾óW¨ûʧþüâŠÃ¯|ðêOüC¼æ5îé'bpUuÛŽó‡^´|ÕÃ7~ö_¯v;ì^Áo½oó'ÿ›­¯}óŸÿŒ[6$à_ˆoùæŸýßWýæõƒÃüæÁ?úïñÒ—ÛW?{Š¥ïÓŠØ‹ëR“zkù ß÷’½|Ë…÷ð©eàº>ÝNŠxë;q¢Âׯ“Là§Xîžðnï m[FW·Ë½{þø·ž»ëï…oÿÎɯ>N°;«ŠÞ±N>ºþè³ðº3šLÍÞ¬ž5BšÌº.dˆÓzyïƒþ³ŸB ï´ Sà ïõí)È Ž¾®øÕßfþ‰þßÍ“¬V+0‘ؽ¢Y¢ïCßvè»xú4î´æ ‚‰‘€)gN9Q‹1ã”’©Q™<fª–”˜Ô,·øgjjÞ3ç„JyÞç "v⣦¬ÖžR É R‰LÕbŒfæ]•…SBJ0SRU%£ b™ölجÝ÷¾ý핯¤}üO>õìrц`’FMpnÂ*Ec2»pS¨&2’EPÏÈ a°) ÓQ͘‘cálî Ãsxì‰(¥4o4Ô€”⨽œÃö²Ju]ÆäI.ln£})oeÛJäȺj0&òCµš–IájCŠX•ÝlгA"ûŒI!X²Œå”­ªJ˜Ù‹ÏÙjßG3Ç]‡Ì«Òá[W˜œ¯C[€Ø'!e°@`lœGrp×g•޳ªŸOs†5UïïÄAª¦ÑRLH) è Íáìè«ëéÆtZO&~VWï*ïÃ<×ì‚ѽ=Ôµ±nuX3©ë¶û&¯<¦hZ bï}UUŽeZOn ·×9Dz<jíb€VQžZÏD³3#Ê‚-(ªœ­Uþ–_z»LZdâX °qÅGfb¡Ë¯s ޲(M• õeÍLjyàv¹O­ G"%Û*‰{žbXncÈ ˆ!•ZÊá–_Ÿ‡1Üò×#?YžQ:N Vx~ù¶3²®Ö1×ñçÇ}ªÙUH4Ü?ùjÖxi/«=:žO¶Uwo,*Ž“Ùùºâ½Å¢¹¨ûÕæòÔ™­.nÞ<+ŠÔß3Û8xêÙ«÷žŸkŒ‘Ò /<±ñÙ³ ¢Ãƒ&¯DÛ¶Ë¥Üu€">¾‹1 ï€¶I«%ÎÇcŸUˆA• µŽzPoñò:Î\ÜX»ÅT<×_8ë¯] [Ôwhz̽´ fm·¾é“¸j“Mny³}ƒíÎ!è–û—æóS}Ü ¶œœ9$],÷O:ú~, úš9¾è[pþžêCï Pïæ!.·œCÔ˜Zj1Q´óHí™WÇrV§ÏºÝë¦Þ«! “ªÒ ÷/›%BÀ…ÞD±X´çÏ;ⱄñ7Ýrê@ÄÆUœ&5uÂì+ïÁ–@ç„HÔÌ391cS ¹Ç$13•þ$SV5.vÜH“!šJž©«D•)q¯ªAM!Á”BBDCJ½÷ 19LˆaŒÜb¨ 3AJÚ)êÙü'? & ÞØ¹ü±?øÔÎõ"_×â}˜Në(iâê .3{ HÅý‘t0œ‡gL‰‘À$ƒœ0ç.öeýŠ*öȤ+>'›§­Ù–*R¤A΢d¨] %…‚¡È=ˆfÕ”(7Ùº ±ÈæsFyþ&ŒXr<ªèƒ" u]qÖÐÅbYHÉ ¤25 †›Èlh|TS.V°¡ïûœ:çæ5g?Íì2(ïÇM}Fæ –T-šÙö¬¢\ÙÈJ~&áÍÉ]kòÂ6:¶LxQ¦Q*e¿Ä0³”’FK)Ñ©¨Éà˜FÏìRßî.Ï] ÊJd!Åm>spg@í«, Ò÷mŠÝ° ÇHI#ºîu(’ˆ0»„¨ëº®ë®ÿF!ñ:Ô™ÏKžçbQ’ã4:ãuÇœ8GFf9†7##½L"#7y \ ¥ñOÃm4šäõ—Kul!†Þ/¢’QçW’iFƒÌÌÇø1QJ¹l¨DÆŠâ€s)=÷àêÑÍ›‡Ö^³±´;ÎÐD€ãŽvø9–¦ùáBŒsD4ôçÓp&H´Üµž0ÔÂCmý~ÐF¤ªšÔUu£c1²¾õÕ|J.ÖÒ³sݪa› ΛöÊ|ZµM8µ}ߪ±DWÛ6Ćùñd˜ÕõrAç.À¬:±õâ+;ÀSãù8ç5èùóhš¦mKüµZµûûýÝwÃ1%kY¦çÏc¹ìB@R\ßÚâç/TUmMjÖ@š«ôÚ3²u¦Õ·þø'vÌ:¶¯|C¸wzçú•_Òç+!>˜B;ˆaã”kv÷¡ÉLÝ ñÎj¢w쀗ûgev­OWC7ߨê¾ß=±<€þæªïËpÀHák‡—ž{fz°§b„AˆÊýT,%ßp˜ö_û¦Õ|)±«|°@€p•ÔŰWϬk`æ3×2F,u{{;è.èÎN`'˜˜¥7#S‚9V2‘¾ ÉT2‘3X‚Y‚…TâåtgÁ`41ŒÌy^=§Õ‚ÕÈR{a3N‰RÐLê""g„c6ÿ¬dV1H .¦Zj…lJ`†6¶æ¿ü[@Š>ý‰O\zúzå7e{j`ç­ò›0«6]µ‘ó|@I@œé6¦’fËuS°€Ù˜Œ©F–ƒ2gf`!fö•€¡Ég¾0ŠáÝôd4%‹¡ØæÜy¬\Ižˆ—|x( &J“ÊàÒ”@J£tQ¡t•zžó3ʸ„çmÚU.E\ܼ |¶ °¨É’™ºê†* Ìò,À!@`f2Š1º¦ev±&>«§•{)O|#¢H…ž–ÇöšjÒd–ö› Dœ J)%…)‹1uÍ€, `¨eZMrŸ1ò¹–1…‰œ™YŠ9*¢ÌEWMD·˜Y´¹µA¦@¬]=ŸMªºžL+ï…ÈÐN·Ÿx6­,„¨fÞ¹Y=="U—Ò†í:˜?ÜùiÐ…ª†˜Y”à¶Û±§Õ5™®3žP@×çÿ D%“£ŠG~Þâ:+~msGs‘×O : ú^ùE†€â!¯=6¼a\j7Ð C—|¦>¨"ãsj†¬Â†Ë#[0hG‘ˆ$F%Ë]ÅånÌAsn~,‹¥ÅÑ Ýztüc`p›@ä&|ÄŽ.ÝVjɃcVQi‰f3³t<ó¿¹<­O6½KMTUrÄ"+{l»~°ªîn07Ž|êÓbùØ}<½·³µ{ù~¯‡ÔI=?8”Óêþл€&]žO¸²»{u¹ —eèÈèè77yw÷b»úÕ*:SEíAˆ©9yrk¹8HÃý¨êº&Í79êaL:´Vçþ‚Àtrc·}ô«õþ¶|ò/ਲ¸÷ÒWm}ô—®Ü{/¢Þ0›n¯šýé´¢Õ¢gö#ëî|‚“Ûwé‹!¦;¤ÿÿư˜W. –¡·Í“«ïù¡ÉÓN¿öÕ݈)ˆ%3~zá".>ˆ_ûY(Åfæªeì3 צ„±í׿ýòò_ø,¼›ºª "`áÔW¨–‡E°‰„~ûÖ ÓÿÇf&"JÆ‚1™ÊCJ Æ1YQ²²kJL #hÊ$¦hIU…@Â0fHÊó¼Ì,,Qƒ”`†¤¨4&DS °ts @-òAãr™ü¥³»${4[jsVM¼Æ0ÝÜ;@¡ö™¿øô•çvÛÎ’öFðª)RìbŠŒ&·I…Bl ò'¶ÈŽ¢f†9S"›Ã¨Ôvœ3]"¢<Ûd­K²ÅF£ƒ,Þ7{¾®kS²1phc!m­)@hRÈ3æK›MF S.q÷1,Ñx±ls<@h)CÐ UTVͬ[…ÂkPШšÌR5=•>«JƒyÕašanXÊLfU]Ùp0ÉF  E^qÆÀ¼cd­j×`‚0±›Ônp½jH¹‰¤N33I©’î3)93K)Y ªyÔ,ˆH5– ±Fƒ S2ôÑU¨ëzVW“ºbµ.Ë Ñd:uÎU¡KÕœµ^wÀ|ÕzÎ:ú`"J”ÙãcìÚbìÔ4&q·†¤Ê>Ÿ—9¥dÏPúwo±3S¤;澬uÌü¦MûpÓa̰vlG©¯ / ý±%غî‡õ_ß?€HåϯȰtjÀÀ¡,ˆFØè€1ô£+L†õ)ÚÎC‰E‘›Žßn×.uœûu´Z…ë<\ÙALØ3¹µ’Ó1„ž—ö˜‰&Ф!ƒ:ÏTUT)m;? ë9jN&y’æò­ozñ•§Î^úÚù¶íüìFíO^úZWÍvßð¶ëïýeØ´yÅwàÁ/üìÿq‰ýiM70æX$ª›VÄ' ™‰p‘^êº^,&J±ÇtÃbÑûÂñ7˜`B샶_ùìôeo~îe¯Á—?á^õú~ÿ`ùµ¯àÁ‡Nuñ;À*ÎqÍwmNvöšé…3¾õÍ_^†g?ó @Ïž»åúßn»c<Ùnö®NxÙ{áKWßþÝX.ø·?¸»· `Iˆ{2ÝK¿EB—¾öHWWÖ©¥8«ªUŒÆ˜$´õLúftãÜÅæUoÂoÿü©„¦«D¦áz÷€mB=«êýp( Ì…rÇ›&5Š$»¾ªj EAPU™ÈˆÁ”TÀÂ0–\Ž$5Jɘ(ÄHÄTIˆ•™É‰†6aP0X‚&"AØÌ$gf¯cD¡dªjž*çÕ¹œUx_™f,«)É®¤i%¨“_ͺ>ÔU ïV«“wb ÌvDŒI=‡ú` (kÆñÔ"™;—ó‹¬ýlLFœˆ0é”Y@^Á  À<ñù!(KC¥v=ù%"’!ûÔ4BÐÙAä U*_°Ë€ÁP‚@8»vSÉ0“ì¢ìÄå*þÉSgo AÇéVtí'P ÛTêš-»’ôfvQ¸¾mêÙ çˆAÌIcŒuE9çSU(Ìr]—z(ÐÙa6k¡Æ ge|‚±˜0 gwŽêLI5ªª³—"˜’£²œ[e„\-™qîVÀÈ1ò85E©ïQ5™u]ß÷1u!¥ýƒƒƒº»HaF'Û™omWâxyÐh»î#×Ûº?§ÜTBV”KÕmX¾c§øúÞ°žŠÝäA×îcÇP$¥ÊTQ5övZ"c?îͧc#Ga”p)ñÐøúüK7göVJJCKغÎÀôÑÛ I¢8H³£u(ÆG²ˆÆ•±¨(Ä%;jÕ=¶‡áEºU;€<ކ?õ&QnOàœAyDåÙC½ˆÉú¥©Ü'ëpH¹[(‰°9'Uå&ªVÑÛiLÓÅ|*ÝÞÖÔŸ¼çE½’Ÿ»êjê IDATýâ S?¿Î“§šÅ…W¶ÏÜ#Óûžý©zê »q÷Ù‡~îŸ?vý*v^Oø$ñ=BWçÊ·kJ$b))Àe@UE@XE¥„‘Œ"Yx…Õ éŒúK$ýáÿï{7žûbý–ï‘_ùð¡ÕÄ'ƒVm7u”B{ßkÿú?}fÛ]Ü_µ7Üþ4îíÈ|zuu‡ãqïØ· T>¸D§Ïã-ß/”|ÏÏ|-'9â(*`Ö˜Tñ—𣟰„MYš—)‰Y¨@mêVÇX¼â Ó¯_ùjç'm¦`©2:°q I²@vÖlóÎ5MÂ۴ç}ƒ-1á|´Þs €3Þ“’:W™‘öMjß´½@XD"’ Š’˜z¡ü`äÉ=–Ǻ›)R &.wú2„XcAH’Ua‰È¥”œsUU©jÒ˜Žà"CÄÆjœ@Èj4=4ZŠ•ÄÕ¦ á{.Þ{îü݇Ë>&©§(iåf©ãÉf•)¶ùÑJÄJ0¦zb~Èdó h qoD¤™̆´"¢£P¸(!ÙÍÃd’œù³u*4ñ M¥ h–úaA 3ÑXOÆ0fc¶¬ÿ íËð"´K”‹ÄÜ4ÁÜè€s†]U“㦧Œ<\ì#›ä«T"‡>ÅP–Ó!"Qdr &nMÌLÖ 43dÝ “‚;f™ªq<:K2Ý.åÎf1&öScnedë».SÂ̲|‘æ¹È4?â’v‹@ŒKÛ•"¯i‰wš®Óq“ÊO&u-"f)¥ [Ñ…­ú™=muwoÏ&ÝJý”†¾d'aÑH¨~ nY"BRh.  ,ƒçm·sÀInÏËnÆQŽÜ’±gv¾iN.ûÛÕ€û!;òÇ·fY›¥›ß_TX×òuÇÔõ*r¬WjŠD΀Aàø§ª1·Ú™ˆÌ ùúZ‰ 2ITQíd؉aÍ…–”o±cë<þóõ^áaгåiKƒf”vä`UE5Rå½gç˜!Bâ²ý:Jˆ6L¼ó9ÇU帞ÂóÆìtL‡³Ù„“wõÁý-^ðB%{è¿|ÉÅs÷>è¶0M™pß=§î¾§;\Nþ_`¿ÅÛÞñØ÷¾¿ûþÍë{ó¦þ¤®5»˜ƒÛvYUPíÁ@2…Š ï"Ã¥Ô‹ÃjµrâÕ@ $fÄ3¹Ê-gÂNS¯F`gàðÄ—Û­×½ÉÂJ¿úט8 iOÊÜ®ü,êòëà÷>p×¢ [›Ý«ÿ£É7¿âÆC/¼ëßýâå;m‹½cL€OÔ›OüøOÒ“¤üâS„{È=£E,Jf`I[§ôO>RMæi¹e@šÐz7 1p5å~‘¦8wâÞg¾ù5þgþÙ&×Ïõ­ä„Ì© <&“À]µ8\V•¸ô0sÓ4\ð†;Øòhz+#̲‚«cD²DÎ;1³”’bö!¦D š˜R²Ī){¬LMUV§šÊ¸¼¤Š”#©#ö”ȱ‘"2Y‚&€`I½«BDä\•R蛾]n'«Š&N¹J%ìA-F }"A» Óß{ÿ}}ß·mk¨ª‰ïûNc¢IÝ7±·åZ¥1AT"‰W{dÌ䈄³3Û žHŒœEC´¨•LÐÛÇF~RÕ>ŘRî¿ÉbUÖu¹F;²” Á,AªUÜ!3ë%ÀJ¤yšR„&ÂW†¤Ôz0Çì 5sôÜèà‡6$7ÚÇÑ[QŠ-­™Ò¡<,ƒVaü‡O5iY&ï†hfŽ=¥”‡Òž’çû ÊF©ë&V!‚ä&™°ÚÕ<£ÐXˆŒ™8V=²ÂÙÓXµcäi}D(†‘ˆ’†< ƒrƒ©qáÑŒí1f\<"ˆ`Þ³%t]ß¶™`e°t¸°áûU‡­¬L¡¨u¡__®áa±,£6úàñ=оt™SÊ0™ó±oÞ†Ô|ýI´bP†ÿ îÊÑÞôN€¤Ü] –ÃÊŒíÝ » ’OÍñÑŒœ’®I¾k¢4dÀ7/QŠ£Ú6 %fS3sÀˆ©ä…œéM_AD¤¢£ fJPØ‘¦&åÚQùâ5E­#/šè¸÷Íÿö…•rlWtÞ˜kK¹!ÂÌ µƒKɆéÙ£m mE–ÔBŒ!¦žÈÏf3?›xФÝ]êó÷þÕo¹¼Ü©?ðo¬Å¹sg¦*7–û1½O¨½÷©>ñWøþï:\®Únë÷ýàŸüÓ=üŠKûÃ+©Åû—F?­V˜1@ðÑŠ#è{qÁz",—ÍÆªsRÕ!‹‹ÕRØÁvK_ÉlÆ.8ô¤‰êUšˆ6Æ”Ä]?\¨Ü‰6f>îC\däÉ{©<ËõåÞÉz ‹Ë__^}dëìhýÊ×~ÏôìÏ<}åFZÎ×â´æHÝôuo»Ý òŸ3+RÕ#»Ü¹Z"é„\Ž·Y”1éÉYK¾¹¿íHÜ*¯§yÉãð2yĉ`ŠL†Q×b aØbþºÑ²N’(iv„Z2Q1ÊdlÀXÕ£4`€$"D>Û03¢rʃŠyMa99R"㉯3ôÝ[¶˜„|9¦‰X]´E¡Ì¼A‚€ìÑd¤EàL³Ñ0à çÎÌœV– !ª: ÛL€g½ƒì¢,L‰ˆ5EV•Ôú˜MÛˆghÚ…4d¦F%QS ¬S G”Ø{ !¨¢ªªét."}ß·MOŠv¹8! ®«`“i;ícWË`Áé^Qà®\- k¶ '…\\˜™æ½WU3œÖMóð¤^ó Å’êX9hŽÊkÉœÑ1‡7nšz 0`L”2‘`)Œ¡Aª%ßÀì*2ä¦õ¼b‰aÖ ‚Ï¡YRëcª×3þá T“eª ÐÜ9ëP—÷Xy<Ê jé­5B,½H ¢jÍäûê×CFŒ TGÅÛc™.0ÁØù¶w¼‰î¹ç¾3gN==îÊÍi|öúµÉ¬:lºélFjÙ%Ó£š9ç¼÷ËÃEvÀÝÊî0ÁÇÐx]NDDCÆ0ÆÔƒ’Næs£46(¡”@ÁdpCÍ%‹‹ÁBʿȷ,µUpé»ýuåJþ•JË^Þ:NâR¢ü¥ †ÀfŒ¬êL&lLêZ‰™}=º‡ü½JVi*ðTÉ8ó 1ärWtýqgeæ1—1‚`IC 7„îcÎQîCÏ2èÿr6jfæªzÝ™Yèȼ膮U+ó8HZŠËõr.¥cüC!„¤q6kê¤ABècp*,RO'ˆá¨,¸6 ¡XXæ €[Q,.CË  ¹›|Íõ®Ÿ¯ "Ÿ´^€TK,% Fj½)aM{üØæÖ•Ç ™yMƒ‰} fD1š‰agO’Ñ›‰!1M0„2ë+PÌ™f<Üö›¡ÑáÔTKñCaθ$½LU<Þ÷<þŒcló|ŠfcÿU>ëñ®b ó¶lHþ„ˆ™Æôú¦À…Hq¦"Ù@üN¬efÃpuòµ÷*"ÌðY¦”ÔDDU& ò‘Î Þ„Ý­-7Ä­ev'OLSÝ6M»X]žU$mÞÿÂçú¸÷Øç'Ú\˜úëNÄÕ¢s~±›¬JNšÃÅj¶Us?âôw#º®ÙpÚWÝé ÝÕç–èÑu§&8Ó¦gáöMqãÚäÁ¬¦r±¹±ç°A´sîÔ™?ùÄuö!Äëè±<œäB%,¶íÒÏ6ª$èÚ:Ææ%/Û\,É& ÖWÆ(1FNžE:œ.›Ú‹JÁ¡KQ æ[×y$î©Ù—; Þ»âÛU8w—^¹~Í,žºuÍ“Ošó§Rؽ£ã÷p¢œµ•AšÅøPWÌYÖ>UWRXn©b&‘\´UF /«¢rR|°#5ƒz/lИ̢0 3 ))Á¼0HSÒ¤ì  àÜ~kɬž$3S€I ‚YJ}j¤[võÌ©¥?ýÔŸ¾íïŒJÂxøá—}é³8=[-nlžvÏ]ï66ÙˆBò 1³Q¨ªR  †ÉR‚º’@ h–ϪËz™žKƒR]¯)ãf2”Ä ™Ó¥\Ôö)çßyxßt{ž/„U·lÑÇH?׆wÅšFž×Ú`7p>íŸÉ€:eV·•,IE dŽ)Ü¢–,ß•‰Š”¿ªL/ÖÜ‹œ‰†±ª¦ƒuV*bÄÌ©_ ™œdp4‹¨˜Où˜3ä.וּž”Ë+©j!âbÑFY>Ôž²àInV±2« šÖú\3!ˆÖ8h)¥¶í—Ëe¿ŠFÄÎõÖ9á ¼D˜XŒšh ºÄZ¬Püäÿeão ˜®9Ñ"‘ã2|àÑ÷:Æ$†8T4G¤z"òîÖ:­±©©Ôà×`y»)ýåÜ?P°“!vÄÝm†%¬I~fÇ9Ü!–¹l9ˆ, D”dæjèÔWÂuå UUp=ƯãÍÆÌµë˜V^Mëéæ|[äPu¹5Ý ÏNϧ/}ù¾øgwž¹{V§T7û«K}XVtÎÂjºu¢ªæM»úî»—Ë?¶ˆÚÝØ˜!†ùÓŸ¯Òj º6õ›!]ó´×Åùt£ Müòö¿ówÝuñÒ3_Ãædqþ>,v7ùëë”NÂŒýâ«_¼ñß./x!¾ôèî½»?¸Çé¡pÎÇÔ1G5ÀÀTí/]C tñ@ª&¶ZeÑwb&œ `á'T;›‹=ÔÒå@¿äðîÜ•ÇwªÌxÇØÑµ‹÷aïFç0_4 'îâI?q§½öVË%¶¦÷¶áé½½Ãí v2O±S°Îû´œÎÃüí‡È®þúûu¹¯ª÷&ˆ-€“ —ýü }Ô…2 ³k—Õ§ð÷ÿá«þ¯ŸûKS¼óïâñ+—Ÿx ÑNÝ™Ιiçœqa))H)eR‹ˆ°$M1P2a¢d)™1C¼0ƒ‰DÕ4©K·¯E瘙bèSJL5 ©*Èg:+&8™¥¨«º,£®…É9&륲R+5fΣŠS\‰ç©ˆëúþ¯>û×}×TõVßãüþ§—¿äµþð‡Ÿ½üôç¿øW¯xÕý7v»Õ‚曲X,Bõdâ½oûn¹\Ƨ³©Å”ú€dÌ$•wu%•‡±6¯W1ìÒ† ·!¦LäˆËD[a[ެ‰ÖdQ.9NFݰb?`& â®@ÎçÊVùÔ‘E©ë¼h4lÙuÕäl“2›±q õ´Hx«ùR3”œsZiL5ŽÒß¼JD]—±íd–8*ý¸mEÄD’U©5‘‚̬•@˜‘šh¦PmÎ$g!¥ß3‡J14X‹ÖÖ*æóe('£¡k¥;ÆCGÆ`Í,óÈd™ "¹:K“jOú½ \מä„äh ï¸ÀÃÏ‚A§°„>Ù1¬ÍÇofÔëÇ3žˆZWìu¾ Gý¦%ój±å|sTkùè1Gr”ðAy˜g0ž€ Ã¥•æâÁPf]µƒC"è~ýøªÓ¢GÑ!ˆ¬ÇzT1pÂZ':t¸K³vÚú:£’½ÚúÖ~ÈéÕpú¤4P(h ¾3³7÷¼27`WTÐ{ 8B&ä¨ÄŒirsÇŠY=­ýlR±lÖ¾·ºf¿~ðcË߯ÆÄ¹4YÔÔŸ™Ôµè`ïg)-W aÆòÀOå~¿á´¹›æ«¦›Örj'M½ÖSyòëËzÓë·žú¥_…«ñÝo9{îüÖïÿÎc;û-æËæïÿwبùÿüŸ÷V{srrùJó¥/.¿ÿøÈ/n-šƒ×¾>·ÜßÚNN4íÞ×–_~üƵ7ü ®¿Ìx׿öÚµO_}flS T€`e¸êìæ¦*]Ð÷[;›øZBÏâ ~u衞VSjÓÕÉÖâþñoÅÎNúü_Þšñ ¶;vÀRÃÚS÷Ü×þôÿºÙ…½ÉFX®.X\~ã/ÿŸ.‚wX6‡N°½õ’çžÙÉ+Ë*æâ`JèºnîÏ9,Äj…¯|ŠÚ¤TU½Åþ¦'ˆïû¤LüæbuùC¿pò;ßõ—ïþÏä®Ó/þÒ_?ó{hf“»úôÂ¥üg¶C% i%£¨p\`˜Í^9¥”’ÊT)RÒ [™ g!b52Ò¢äŒl2¤ÄÉ9/Vz‰ÆÆV²¡ÍÓMª#6ç˜ÑfÙ⬗fjCÊ|~’ ]¿l»æs_øòïüöGÞñŽ­Ü˜½ým?ø¦ïúÞ_zß¿=}öÔ×{â÷ß{¸Ÿj‰‡‡‡MÓˆs"R‡¾®ëcÚÜöB0ïýd>›mnTÓɉɔ‡™ ÀQ牺ù˜$ ´Ðz& ¦œ‰FJ#ÄMDy`”<¯³[ Vf±få ÂÏÊ"ÉUyÃ*Z>˜3§RÛÎî¥`C±Òò$@€CR"rYêGÕRn›Ñsæ§ãÜ:„‹4P¦Õ”+  òóù™©%Õ˜Õ¥]Yœ4:àœÑ&ï¡e„&ËkEDËn—”ó±dFXÆ G÷èÆÌ¬eÉ#²,›ZÎJ“”è!ŸŽó‡™s­Á‹÷óÙÆtVº¤¦¡'iÿë0sÎ1S-SnXTÎY·°ÙíCÇ Ô ‚ÓR¯%ÝLÚÊÿ“BåÍÓCj˜¿±d´åƒFrÓc=þJqM$’Á()å븖5®}ÌּрÜfz =È"ÀÊéÈÁ—÷çSH¾ì9Ï §Á ¿>"¼ C{ŽB"¢á9ºÙAæ™7}i¾3G¤J°’SXÐPÊàÐ@õÐ[í,:î$Gå åèYÃP&¢yê'†éÆÆÌoÍ+¦ÉÚÞÕ¬´v{Œ¶î»ðéÓ§æ¡ 'Î>w¾‹/ù–»’ʳÏ>ýÅO¼¼ò\[o†Ù¤}óßy<úG»Æ±­öúðÈxî§”æû;ç®<1»øàgÿ‹ÿÕWžÐüÚcÏ< Ká´aß MÓ1-" úØ._÷]ô£ÿ¸†+Ÿyß¿iq¿ž¡ÝûöjãOÓâžÿÂ3oû­Ÿø©‡®ïn÷Ú“¿ö èÁÉm̅¨OÆþîÆjÕolЪ1滛XBÀ| •ÛlÛ©È2¦ž)v‹S/{ý‹/ʼn³RÏN}íËxüËÝ_|òúÁ¢þ΂^¶gþ=›ŠÇáVˆ¦Žc£­þÈÄ„yu¸Ä{ÿíWÛˆgD€Á+ ö-~óC—ú½pB #s³6Æ«‹ÅÆ{þù! d_sß©ú…8ìÆÝßø¨¯úiè:8jÄNéfÀš4„S¬Ì `!™! M¦ª)õÌFlR‹Æ¨f ‹ÂŒaŽÛÞjǤl –APÕ—1kWU 55³$"Þ˜`Žˆ šP†·‘ ô°è¨H PÒ2^%°i~œ ™I䨧ЫÝd÷Æê}ïûå»ïº÷µ¯yƒ¡ÛÜÜÚ„ÿ¯ê§«ÚõÝG?ÿ¹¯Üsþfµ’jh–K"òuµ±9uÎ=ué"ªªÊ×u=ݘOf3WW¹·5éÐ-4 Z“I!›ãz4ß”É4§ë–PTô’E¹"ûAJH…õí y8Ò;’Ó@#ì§€Ða­ ƒ¹¡0)Yšœ7"Ë£ç "J¥ä 3©iLš’ª’ZŸ{”íh`;‰“*KSY>­Âôʸ# ~\S Ùó9Ëo\:– '®Š?PË”Ó|v©ê°–ÓÙ9ó‘ Yÿ7ä€Ã,O©" <³¹?ê3ǤN¸®ëétZב"Öü¿Ü½í¯eÙY'ö{žg­µ÷9÷Ö½U]ÕÕmw·Û€mìÌf°  1 Ò ™QPFÊ·D‘’ùå/ˆ)Š¢(fÐäàѠ!ˆ—C‚2 ¶‘°°±Ý~m·ÝÝÕUu_ÎËÞk­çyòaí}î¹·êb:RÀf©u{×>û¬½ö:ç¬ßzÞ~¿ñì€ºó Ž ‹EOì]Ñ-,†ÇËDª"j¼-ðI@»:ÚÙ Ñ<·-®}á«h¸âÁ¦ãf‹NŸlS¢’tÌÕ·Œ«IXsæ»w!Ì&æ•Q¡yYøЦÒPb€ç"[jõÿD­žìdNDwÛÅÆ§Ì "‘°ãÔ¸ `™Y,&ÎnáîKû’ÝB¸T‡½kj…fƒuçv˜Ùv~­V­ýÐvï€ZólãîºâÙ%>þé¹Å>œ:¸qã Þ8 Üà0pœ©av£m£øÈ¿~ÇáábØnƒ<$¥ðCžœÞªÊãÇ>|÷ôþS1уÓÕxöæ×|Ä7nÝݬüù7ݺqÈŽpÿAyé3ïù?þÅïëx¸¨usÜ !`––ÿô=…ÐQ::ËçqÙ=ûò+_øõ_ô_էצšEø÷Ê =÷OñK¿pv˜>?fuºG@d³¦EáWf˜ ÷ïãWþÏÏo7­ºZ+`¤'çgøµ_8G:¯†£§pþ þáÿô C. sœb×…aÄᡬ×x]íuðâÖ½õÃsPAßcXo•œ£„åâxØêÙæUà·$®Æ¼a,YÖu]ξ=©©cësT+@êéªën ãÆZϽ9žë*ôGiØl"žgœ9î-oÜÙ¬¾*8|½ã7â 2‘¡d)‰=¬‚€Y`ÈYUÍ«;˜i±Xøv[½ñlUV†“"âCt-nˆàêUI+8†ÎÌò°­"‘]Ä6ªnên,D"ªÑAP' $Cp „„©! À"H!„¸Ùž0 @¡Wµ?øÈïÿü?ûÇô‡ú/þ›ÿÚ7'´¼EÎÿéÏü,¡•÷ܼu|v†õæ|6)¥ƒ´ sÌ,IX¤n‘º#„sÎCÉ_{°š&j&€~Øz‘ÝPrº,0™£Yx“×µÉìeA`˜ø±3g'2,`ÞÝ·;îª' “›w& Þ‰Î6æJ¦9Ùj&íã €'ç¶ »ÀH“Î厪SJ—7naoŽ 3¸($Äí4† }§äm¹ààÝY¨ìî#Íy°m=%†ý ´Wî<]äÍYT.pj˜+å4D-‹ ÐÔÙ©…ŸgC¼îâ¯óõÌÌ9g‰±‹1ÆDB›ù.ÜX`–©,xV’$aÿ¦»ãŠÔ2Ív™G4QU\ru^±ŠpÙ‹À‘vó ³J“öù6«îÂ;Ò²å÷Qd`¥Ù_½¤X¼ìç>ÇD¹©}&ž1à¢h~’€y*ºWl÷iaÊI¦ùïT foÙì”nÿ4Ÿ3éö\÷ÍGeÒÚß0Sfî>ÄvßZg²€çYµÙç?}ÿ§ù™ë€¯L£ÎÑ_š eÀÎ¥=i&^„±91X.–]X.8×xЃwÃÛß褣Quàn»XÞJ1®Ö_ŽÔÝ}f±Úæ.ܱø•2<ñ\_Y¦Nú»¥ƒ.ôÆ­'»[OÝ`¼.‡u.ËdÁXÙièuIœ 6ÛÐg:ܪò¹<ä!±(®ý£°` IDAT‹>vCy…™ƒßµa 8sèÖ^¹yüü8œ¯ 8®8‹VfÎÍÁâ ("n®ËÅbs6‚,F0u%»yfŽy(}¥¾ãlüÀg'Ö¥@ùà´žÞXÞ¶ñÉQÏ^*V› ½NøuðjÀ­>‰:–Â]’1ß e|ñÁfí@·8ZÁâjÅ ÁJa&*u,u–y|5GÀ°¾u;?<Ù‚F×ÿDî‹oQ”À+Ï gÊ_.õS@Ÿ°L«óíë{`b!aˆ‘Dº”ã"/h )U'g£5 èIªÞLU™`V«AÍ@¤"g5në/iÖPŠj´Aj5b46%fAp27W1C8À"…ÃÅ’Œ¦í¸fg”'‰PvwƒGbœC8´Ö›œØNœÿÖ¿þW¿÷;¿õK¿øsÿí÷ßà§ÿ3fyòöíÿê¿üÏÿÆ·¿éãòG_~qûÒK/™U';<<¼qttvvvïÞ+fàÈ]×õ]ÏÌÛ<®¶›m[쓜áÝ‚>»g cç‚DÖ .ûVæ!›IºË>mÎI9xV%Ú•£DIîn³ŒÏ«‘Ö)9¥ynÝ'ßÁ`Õ™8pó.’»Wƒy°fÛv&erÞ` &&i¥ÊÞ`r3n¨Å[žy Š3·ð.¥ezþ0åè4ë-4éF"²ÐœÆ (G ÌLZh–;dæ] (ó!€¦!!BÌ@·˜î×pi^ˆ—tD4ÕX37Ôp"¨ˆ„p‘›º‹ßO`o!a!ˆHér9 ‡/}çîj!òáÁÁ"X¾c¸ø±$¢‰ùAš7Ÿ|úAGξ?òb·óVðÞö‹Â…i‰Ð;QÉb»ª1»X¯X„€æÝƒûœ ÝðI R'‚“šÓ¢}É[.‚^òìšG¾ó"aŸŒÈB{ÙÝ3ú²ÃX¦IȦTDš³ëiÝçß|[ýñîÜn¢jžwRC±Éƒk¡Ë[šbð»¬þ<˜7 ó}yÚ°N,&« ‹1J`!Æ‚\zaÏÙ‡¸\ö]-Ã"k#öYhfN÷#îžé lC·à‘_¶pº²Ïü~ì:†îfAðzZ098ðõv“ÓI½þ+o^H÷E[€êb?5>•@xsä Õ ¢‡¨:0œP© eú¤³c"Z3¬AkB»øÀɨd':·‘ˆj^·/ÑC8ÙÐ ðÆÅÔlz¥óíõ¶«òñ†¯Úx®½”FË%J`ln_]>}b×¥>¦0ZÝh©''©»QF¸t‹›u(ãz»¾Ð׺N(Ç2º˜vÚ¸Ù¬Cì£WbÀ\‰Gvi'‹¤`¤Ûqm¦‹ÅÂ݇l¤ÆLz5ª®#A‰ëg^å-¢‹¬ïªYï˜ØØlQWŽÜ÷rÈr¦CŽmYG¯mý1¼|¶ú‡ÿøç|à?…þèî{~ø¼÷GÿA9}ùßþÎoÿò¯üÊýÉŸ9}ù+ë—￲¼±xÃí7ð2ib9¹VWã2§ÕƒÕàS-·,“ÉáVGpxˆØ/z¥J® Âq2³ m (P-Psg!È­©Ø—=°„`Âj¦ªÛá<ú@)` ¢aE$L‘¹a ˆÈ“€IÜ½Ö p ©:¹Ø<0‹‘ÀˆU `u‘0A¬^KÏ!"Ã!Nì$…Ö˜C\»l&ww¨p ! „Á‚(E¤Ð6¥ÐuϬ„HD:Ù2s`ID½É¢¢W ‹œH8„BÛò×BbZ:fÁBt–ºè‚VW †E¿\¤náLfv›npB$0 Lf®‹óNBÇ)²˜™¥‹RÔ;Û|>üÚ?ëM¾å-·xOÄ;¯ùýD7ér›q"ÏÙÂmÍu"o"˜=™;mJt¿“‹•e^I&dšò€Ü œ†9k}ÎÇlîÿÌ÷€Yv{‚};ÛâœäuÙå»3ø¯¼dV‰šVVCbs`§Þìš»Kl¡àr$Øq)–¼k"—h«wÛ‹]vÀíév|!{‘u\là.P°½º(Ë+ÕþViÌk¾m³wuö]_¹Ë1¯>ž|ǃ§7VË×WÏs~õaxŒ¡^ú94P ŠQÔ²Än䆻@p»ÒKKyÞÙ‰^õJ ÚžŸô|³ýÍþI΋£9)Übf©¶®DRl#"Z¸GD@m%ÃéH›z6ሟ7Å „ó¹÷ÿèÿÞßÿ™·¼ã-ÇwIîÄtðÞü¡_ÿõßúøŸ|ú‰£Å;Þú¦÷¼ç»ßùÇÏ<óÔrÑ ã°0[t‹CÞêL˜]¦ "rlãÀÌ…ED„ÉÛ9vOÏTM”Xz I$Þ,Ìglæ3C˜9‘è@5Õ)~&ñ™Ý0é188¦lÕÝç L±Øû°/€G´Î€4­3'óLK" 3RµQ)ÜP hMË¡j&žÚ qyY± ØY'¨´°ð¼ÔQ“p7 0*ÃçT&€*`ž‡£z@‘"ÚØ©æ EtPPj~rP‡Y+Ѷ~¶´f-]ˆYPç«D œÜc<¤`oùÖoWåîâéáð¹íéö ÏÇ… €L)¸ì˜d"w1à}f 0®ZœÓêAu>ÞE"[Q~ÔŸIt¡Rx ÛYˆvC­¶W†ÛÛ ìÌû¡r„—áÊZ!ùD¡ê®Žê®­¾ùÊÝÔFi¸gÿù¬Z® h»{ÛAîð4{{ŒË0¶ßíî<{xô<Fvû´ùÖ{D`ƒˆÜ}Â]9Ùr(_}öæÍ_>LËQnJ/h?»Hš{<ú^d @ ÓZ‹•¬í‘cŒ»J¹é¡ï8øæo×àQ¦%LeØI/¾Šïx®þ?÷¾Ùw"ÂÜ©lÞòÆåKg«ÔÔß ¨JcѱæbU­ZÍš…‚‹€˜œ4ᮋÙu³²ZŒÁ½r6»CMÔ*]j­U½su5ƒÃQª.W@@î¦Õݘ٠Dn@6MAbŒÑZKÖZŠÖdÑ#ƒHÍj+AfâÆŒ@à`bQ—ÔTßl¶ùÅó—ó7ó3ŸùÌ÷ÿ­ïþÉŸúñïûáŸóúO?ûþ÷¿ÿÿø¨ùFÏïzçÛß÷îwß|ú,@?°¹_‚¬è¶¥ú ñLM¸-ãÀüÛŒd‚¶$»Ã©¥=–..R# °½B"df¢¦À-%¨bÚE¡@£(n88ý¢Û &plË;Áfó꫆b»mjèeÓÛÉ',L°óÅ´ &À»¼ç¼ðùUÕjf1¥é¤\¦H?ŽŽŽ²d2ƒØ“wŸ˜gಭéeHDL¢u,>gÑMÿ‹ïÝÿ¼ùB¿öòÃc÷÷4zL<[·­„ïRÏ øw”2»ÄòGا÷›ÐãÅL½}åw5Q™„»ö®ºèG.¬ÞKöå57nn›+þdÌÓ¾ó\±)ý‚«zz(ºìŠß0]ÔhM.ý ÷x?9WÒþ¦÷f 7F~9”§ ^ú–'ÇÏ}UHú”Êì¥}ì6b¿‡ý“íé#Û0 Ã0˜YKJØ·€ÿ·ëð(áG  [Ýâ /|ïÛÖˆLj!ûä7KÓjk€Ÿ¼½ùÔ‹`BñìuZ˲nÎ7›ÍfÜn§¢WŒB—¬ÔR+‘…d4,;´ ‹7胼‘"H`8‚Ìk!¦È‘ pË9‹‘#¹[ubw+FDm÷éˆLB$dMc­Ð“,옅ÍÜÝ”˜ƒ¹¹zu2‰Ìœ Ñœ·c%«Ô[d½ÙüÙ§?SÆuŸèûÞû3)t€~à'~ü×~õW?û©O<÷Æ'¿÷»Þq󿛡u8¿ß0‚qϰSGr 0›=¢ŠÚ¤RSˆ7…ZS{f3#;„Zµ€h‚‰¹ÙxBë†ÕhU+_Ú¬RíÝ›ŠûTÝ[kUÕç•$˜¤"©€G§±¢˜ö>»UµšÇRF«Õ­’/òªÛbçJÙÅÁ‰h—ï}YuÔ:‹P+qaœåF®æÕQ !äZk£ƒ63(j.µÖ|>޾þ ñæÍ›w°Áf¹ö9⊷Ö-ÉÎ"Üð^Ñcø1í‚´}Fˆ‰bx\lµYØ;ÞSï¹êƒmçOê>óXM`sÍÚN×­fFÁà ÀSiú€ý²É81·L#™nx\/Ýw“öaxçxx,¤íÎ?ê[Þjþ;ØaÇôûØ+仨›îm®Œ“COƒV.ÏUþìÝ»S<F¤¹çÉïn6§£_´ýáÑüók‹ZËv;l·Ã8æ–Rßø:ö_§v…5ŠQñpŽŠWîÝÞ¶¾yÀ«²cÆ7—ó¹5 ùÖa_}xñ«c4T ÄÂ6oOÎOÆqT-!’‹Rð®$vc[J¬Xp°­§c¤Á¬ ÄMT/„èMNƉ9ÆØ‘ב$ĜŲÕ:º“Trg7o‚A„‰ÓŸº^Ø­Ô­óª0–Z€‚²Û®è–„Í«[5g'mälŒ I N~²*[^?ysñàáúcýÓÿë7þÍOüôO¨nŸyÃ3o~ó›>ô;¿ýüsÏ>ûÖoA¶û÷^üƒ?úðfܼáégcìêØöú”Jê®äFÕÈ”šÄ€™km (3ã!»°w¡ ò‚I—p € giö¿ºû°>!¢(!Æ.JðjyÇq¼ytd`%®Ž¬µÖ «îº©Ä‚–ñ«ª9çR´;êØ/”×LUÛÊHË7¸U³™˜¢•Çn×£ªæZTæÁ)±1\U©Z¶’€ª–RrÎ;ÙW c)eÈcιº] Ôj9çq(µª{“M¤;ë3H,’FNѶú¨V´Þ¹An†\–:e˜º-eQkuPo² Á)¸Ó@+­c.kóLŽù@M‹Y©®FNBtÐßTÕRÛÁµTTµêË#Ê©t "¥”ÑGßøÖ×ñèâ§³¿Œrj<¥ÐN”¶S훑ifVòëï‚Fq°Y n‡;;Éá´‹ Ïfå<ªÇôß| »ê €'ü5á3»N˜è±&8tw½p‹Ð¥ë7¸{Ó$lª$„ëÌ ×±_nû5óÙ¾Wº¢¹x·hï†Z§*öËóæ ’GWx"J$c0öò\îŸ;zòÕ7=uþÉ/q#\±Ç®ºLö:!"3oŸ©ª®×ëÕj5 ƒ»3K#ŠÙeÕ]Áï¿ní< ÎHHÙÕÆìç«üÉ/ã]ß!üæ|¼ý=Ú_ñcüÅ[×áo¾¥¼xc9,ÊÀ¶ ‚eØŽ›ÆyÔª®Cb>G!Ô…ç càà]´Î×*ýöI9Œ9«¶À¨¸5]Ý c2v­pf ‚iTf6®æ…ÌœS¶JDß²:,Q$ÙÍ´Vs8»„(fOZÍ Õìâs…(UEõ²ó’ZUwg âà.¬Ï6|(O=óä°*/½úàþÃ35þ_ùå÷½ïûû[ °zßÿâ/üü—¾ü…Ík¯-ïÜ‹Ã/¿üê‡?üáÒŠIœBUw‡¨""ÝUÕK¸™:JÓU/®¤¸¹“P 1×óæ Z¥ @æÖIÊ:ªV!0H<ª¹i›ÍT]‘Ì)ô‹‡gçë“||p« áůÞ/¿ûÁ}ôßûð“?ùïzç;_xá…{÷î=ûûo-îÞùŽõú?û©·g¥§ 쯠 0"gò8 ¶¹FcP€wªðânð‡]¥fE®œ59 Èç$afM'ÇÃ(8² qdYoªK!Î…3# ‚øø¤% ì&m,×Z ’ˆÈ Ì!Ƹڌ‘¥#‰`w¯µZŠé9ÿIH©[.RßuÈœ‹zÑŠ×X¢r Ʊ¸ë²ã¾“ÕksbˆD¨ïû®ëVk %& ½³Ô¢ªñ*spG-VŠºS ]á¥zd÷ ©r”ÜÑØO•m[iDoñ 1¯ŽQmK¯¹uä‹È1¥Äpó±jc 1pà`aÜŽ%»z`ê²ÝgfiÛäDÞäC&iE&G0W831ƒÏóúέ#;ƒŽN¾zªc‰üx×±Íäš;¼lØ2=Bm_9û/²—/ça5±ÖÃt&}§Æ_M—J‡ ;K®¡Ñ®Ï]¢ùååhÎhÇYÐ3 .#î>ˆîþ¶DLˆ»`.ˆÜ/r ö;ÙùWÚ çmÏóôøæs±ï£ãyÔˆœƒ¾ÄÔ/cÞnBêDîyÉEïsvç$Ÿ†Ü’°®¯õÌÛC,+*?×ßþ®·ù?±ÙŽVt×çîA®ŒäÒéZ)ºÝŒëÕv»‰¨K‰SH)5 ø›Vþ?·ëð(P¥* €ÒZÿÉ?O?ûå>‰Ï¿|¤aÉü ¬s‚/gý_õ³\ja1X)ˆÿ/£ë¤_>ÿCßùù_ý·xø°3*¡¯u@6D«^Ü-±D¤1­u³®›Ã›ÏJ¾_ƳÞÇ>bA¸‹Os¾ÇÒ«{ˆ5¤ÎcHªáF)ëÔ•pDË"ÑRx‘R:_m„¬ëãP³‰¦“Ö›s0…æÌ ¡D>–ñlw!’À!ˆX©ã˜q0r#lÁE¬”2–ÄÄ)kM´ˆ¼°8r¬«õ=Œ8¸q`*鯑äá4¶X,nÏþ݇>øÞ¼¯Tçtü?øú¿üŸûèžÇÃíæöOüôôáOý‹O}ΜòA÷°¬×cýéç?û¥óóó²ú.v]t5«•îÉi»Ð¶amÂÍuµÙœçó‡Ûó³ºÉÑ%¥Ò‡ƒÅ- ©xt,B"…ˆÉsY“ÀHDK×ǾÑÚëÅ£k™°Æ|òo?óÖ¯|ø#gc½¹¸õ¬tg§¯=¤á/óy¾n«5 â††oÁù°Ã÷¾µÿŽoýü/ÿßxx‡6u0€ Æ €T•[&=¹ÑiÄ`â"‰¹–-ª…ì¶D”| uÕ¥Z¨¯õßT܂֨N]:`Q¢è–`I:ahÎp™uŽ8¼J²$¡9QK)L¤ªZôþr[¨(«38Vš`4ëHn`¡P¥¢”sv³ «êPò±Ð—>ÿ¹ñ䤻ù!¾ó{þ¦‡ôáý‡ùÙÿdÑ¡"~ë›ßzëÖé«t½¼ê:Ÿ2s`æ›Íêü\YªÒf‹B•ÈÁA jÆa§¢|ˆ€DÌàudm(¦Ù„8I–4jQ«­ì[/0C§ÁÄ-x>@Y[\‡E†K2’‘A‚K"î¢xS pªÅÌl!næ%šM³¶ØñÍŽº ÁÓB^ÙŸ²kÓRdŽ]L!FlAœ¿¶5¸U¯…l ² 3¨ ƒC5_Ÿ«ÆUϵ0;äÎq²ˆÜù`Ú‹U6¶RµŽ…ÊXM’x· ‰:B˜Y©6‚kL•ÀìÄØ<¹÷î:fÔ²šwé{F”T¢8‰“%*^\ЦƒTJ!×$5ÆÆ#æÌã6+±5tØÑ313ƒýñÙEøóïô}.{›¯ð•s~çÉl7÷Ç\¿o,^OõG»+¯X·íÛ¹{i:Ø»~ÿ.²× >ÖÃ*ÌÞ8Õf°Üà+xöuÛcmÜ«›¡½ó»{=zñã§š®NÎ|ñEšíþåK£P*»¹['ñîbùÝÏ<{»Çƒ×Æ“Ó\-ª³q”%„ÓöÆ–wÙFÁÌ¿v¾ÙlÖ«õ¸Þb,ó‚ÓAw˜ÂY”Ø!E Aƒ`"`Y¤ã^1lP‡F >Éx}cáÎuíµÉyçIDATõâÑõT”_<ýêö“xdzøC9ùÊÃÕgï-°$Yý%>Î×owõÉWy<¿ÓámÏ.Ÿ{ã¢ØÙg¾¼þç¿Í “ÖÒö¢Q¤Œ Djô ÀÜÁ˜S&¥ëó¸ÎDÊæ}†/,Fc-Z©6 FÐôp§(y½¯Å Br§D ›•±êV³±š{®LqˆiÙ'vC‡R¶®#L«°3‰y¨jÐfO .CUëŠ1ö}ß§BØà«)¢ RÕ*tðÊ–U•¥…GÜÕŒpQžEñG& 7Éãý…¸ï)ï^TѬ·|±Ü·tVâkBz×ÒÜ?æÜ¥©ñe›ïâ.þx€ß‡L\Ê?zŒ}¹{’ý;¶cÞåˆ]T¾ê¬&ô¸ª¡öÏ+uº»¶›äý¿xNÀìË3Ïã¤ýÜæéî a¿±ý{ï_¾|ïô+/o^~h¯ùƒ 5¸dÚÎ4ÁÕ6WªXdµ!ê}J±ïn,o‰qt„¦¹ 9Ÿ®Ê !¤^k-ê"ÁÔ¾Iøõâѵ|¼~åþðÊC¿}ßúÌømo¬ï~Ëù2ààûþÒæ/Ò^µ¡ˆœÖîK¯m?öéÍWïa!²¤ °Z‹š‚bd°LÛyn9›jz¤ q¶bê’Å@®T·(zÄ1Jrdi"ÅMÄ{‰ãXyÒf‘@³¢\¸cWw«ä §ZÔ‰¼¶¯&¸QÛYu¯ƒ9 1ÇØ‘–ìãݨꮤ•¨º‰Alʾ""ÀŠê¶a+Q˜¶³7Bƒá#€ó³“üîï¾ëG~”ÌïÞ}ã{~äG~é_þü'>úñoûöï!ø[ßôϿ食}ú+Û¼´"‹PZr¼À D‹.¥HÙ%I ÔÃÄݽ˜Ö:.˜ƒ3t.@4C5YpˆPLLD 0²ªF‘.P œX–b•Í êçäUMÍhµ­Õ¨³¬JV̘µÄÀ "¯BƒÃ¬äA³::X ¨æL‰Ã¢K‡ËBz³è„UuØ–ÊYÀ,Q)ˆYŸº¦) àÝ ¦â.DQR×3{"”V~]„˜TµæuµmŠ„@…´_Þ!ŽV<—e„‰œ¼jP!g¡.2Y*ä&dL]×¥ÔŰ€6²Ð¤©ƒ$‘ΔJÑZ+¹± v„ìžÙ\ØÌÕªÆVWr7¸s-äÎNcǼñL‘{ËasÕR(ª+@ˆED\®pQµ6-ú÷ò…Zмė—öLÉk,Ôëâ|»Ä\»ÈcÀ×”ý\À¸¼!Ø yÉÎrnÿÛåÜú%HÞÝ¥IÜ_±€½å6cF˜Ù’7µÏ0?uÌÉY´}ĽbÈ>Ör½~_Ó®XüWv!˜ßn—Ïì.˜†y‘ë6o¼ˆ àB£åjÛ[Xäòú³º|íÎs÷Ÿ}Óý99à|cQû¾<×ry­u³]m6›õùÉéééÉÙŠˆoÄÃ#^.jŒV#¥à1QJ˜DÀpæ'‚>ý„Ýr0ÆÑTs €Ã–×ÍÀ7T{½xt-¿ŠbnÇß5üA„:ƒ²üË¿ÄÇùúíMz|†ñº  ..Ìøí‘Sµ:ÕèѧnV%`ÒÑ#€F­^)º$AÅKÍ+ÑQ²jb*@£j ‰¥èè°Rs¨š9ð"±g³Q™˜ ^su&Ê€ØÙajjÀHR˜'ÁÛ¶„ÕZk­!„äUªR®– \›V.ùèjŒ(Aj!%GÖA €›ižó3C—FÕ;·Ž>ùñO`µŽG·*ìß÷Ãÿèçþ·?ûä ȱXÞ>~þMÏÞ½}·{ékaµm3­¦:–ösŠ1D$µ¸Ô›¦äÀḦ̊ˆD”Q*×êж&¨–Qnt]:QW­…‹õ"1Ȱá²Õ<š’מCßG©Æúp¶¢‘ȱ)QÌ” V6¸ •6Fp6Pt†GxGÞÃÔrŸµHM·âc`£(±'ŠfªC±Æ”ÂÈàÀ!†‰1†Ð¹õƒ–RjuÒꪨÙ“ÓBJ¢Ñì°ëªz6Œ ÇØ‘% ä!/˜Iâ¸lLYN k*ÍZ튀™àݘ覼V•¶$ÕÅ£8 K¯æ9ל·¶VÛÅCu Þªœ@<Å(ÒWwÍ¥”ÑÔÍ­ŠLš´ÍóL æ…ÙÙdØ3Í[ý.ƒZfòÞ[/·K^gB ]:ØÍCü뺠i¯a.<}Œ+˜fr{¿øKwñKwäé.¹y‰Èñøöç@æuí±oá=Kwðî`ÏðÝûÞÅ~ X}÷ÏËÛ,öGŒo"*n£+3R Ì=¨PQq}bÁÇšž±­„7!žt)¥¡ÿd)ų7…õzýÊ+¯Ü¿ÿ _|a½^çªGGGO=õÔñ­›)õD$Üw]·\.]—RŠ2M骮þ÷ô?¯7 0AóuIåßpíõâÑõ.èlÐ¥ã à\·!õ'× üU´¯¤ÁØ pËVq@(ŽÁrÓ†L}ŸsÖb c eD¡ð¢N‘8,½Œ¤ÀHB©cæ”LcrOîO ™ÀLF M±OÝ[­9 æ¡“Nɪf¢@ÄJ$Šaw¢¹Tš£Æ& àæC†»k«1„ΉX©‚<B3dŒ½@9&„$ÉCáÚ•Ò‘A‰„Ø $Æha!‹ÃÏé‹üûÿþ»üDöž¿õãÛßþ§ᥗ>óÌ[¾Güø[¿åÙ»wûƒÃ~µ21„ªµš!B¡[öì\G‡e3gAŠSßÌûjÕȆ•%GiÍeÛ¶’Ä®+(‰ÊXu;PµŽ„„HÂDŽZÀË-“pv1‹N]ç)U $н"JÛ‚mÖj~çèÈMŠ“eT3wsVa­T·Ñ¥ s11+9ìÕj©ÅI‰¼ €x>4桊©#„­±Å%J}‡ÈUÍ@†d19"ó E²¸‘m"qf†±1;`N†aëZjÍ…ÜÇ' @T݈Œ¸˜Š-¨P¨Â@ÎäÒ „É̪Vr+€ Q½X%mT.,Ál=ö}ŸbïUDZh1U¸ÓQ§V¨‰BaŸ±ùô,2ïÍ8Üùn¯z¼çöã+woíÒ¨¾_éêê8wßxºÅt|]Ý-ÜáàÉ÷;{·›ª× sûÀwM?ôHÔùÚ¡î÷Ñ—5|¯<àþ»þÜ€ô>]øÅ[-ÂJ£=€;‘D×X_Î÷Ì Õ#ñBâAX¦`ôÆUCó:ä\êƒõö+'«WÖW–A»Ã¾¿#O>%OÚ!gvwIÛNºC[¢OH2OáS7ÞÜ* Cų@5Œ×?Â7P{½xt=`!× Ü }ÜT99^÷Æîÿç–G:nU%¬›,Lvº"IÑ–ù×rî•È@ÕXÜ)“€cŒ‹Å°R+ÊCõjÌ]âè ÒV¹Âa0'6w#!°™X˜ÍXMá'w÷LbÉ%5Å&™c`ÔÆrÉ êbêB°X]+ÜÌBŒÌܜƤn6°ˆ¡¥ÉÜ5‘¹kMà&Êè²…N6‘ÅÝ•9¤¦V A‡GÖ›¸9ÿõkßý#ï—”Þpû‰÷¾çÝøûôŸ}â™·|TÞú–7ß½»<>\l©¬š€ll>ÙŒ)„NЉ3ÂúÍ@fì D½¢šx ΙՠÕZª8S죙´1ö€„H {n`z$ñ§qH˜ýÏÜ.¸zýµ–ßã1`Ï´ýóßþuÚ£.ôÖÛ´˜“œ/Qn\…»“»ãb:ûä/,Nw×\ä]‡…û|yÃqé‚+ÖêUóýú{ICÒÝ—S©uMÃ-… N”QŠ+¡*¶ÕÞ }uS2$]âE(”k,Õƒ«êv;><;}åþ+¯œ¾v–Ïê".‡·nÝ:¾}S2òHD"¢Q‘jŒ„Ìà¶IÛœí+ ¤CÍ­Òý›G¤áuâѵL–hã ,0…È%PY$ ×lqÿŠZãaÍÚ2½(„ BÎUse€$xˆ¦°R·CÞ²©šhâ`äÝ –Ç‘‹±›qχK,ªÜ“ì†RËV œª±»#¸š¡%ýºU3H+Rê-Š»{aN’r)Žº1ª&·àMª,2X)Õ*ˆ˜YÝŒ ŠÑáäh|!­R¦‘Y²Ž`ÿosײÛTCýš;7M ¨B±áÿ?¨kvD-Ò¦IîŒ_,nMÓ •ÞŽ5š•ÏØ>>‰`4Ì$™êžAÂ…8 ›všùv{ûyU¯¯¯2‡íûw—›ÍþëÍ4 áÓÇ‹ &†¡Û¡™«šªk?*]ˆÈîǽð,TD@‘ÞͲ¡fÝ4‘Ë2bN¦c(²õ†Ánܱö;sèm¯ Ij]44÷¸+%SÝBwtDGŸJªUJØõÖÈÃASËôQ4A3ŒDX¿¬!ƒW6‚0%ë4¹;° {"–L‡m¿_ ‹e1!C#AŠœ^VªšÑ¸à«a$y^ QaÌô¦y°=È(uúA“VÁà±3íÞ°hL†Éç­°ÄAœHAÁn= Ò!k!Óè6ë‰# ·ƒÄHñ¨Lš €ÜÈ ! ZJ:yT„ÉÚä‚À @„Gvó(y\ƒ‹˜G¦ÞÓ€=âÌV<âã|@¿Ç_ŸñÖ^ž¿Ö–ÿÁNÒJ8AM™Y¡ªTÝRÀ…/Ì<®ð"¡rf§B50T]bê[•®$2žÈ0³%@IU=ŠP!ÔPVâ0nvýjªJ쪅ƔˆÁÀ0Px4 ÔWw ÊŽ ý'jšõ×OñÈxoäʶݡ$‚á8I6Nmv;í^§½º¼¼²²â„öö‡£¼»¸´º¶ž¦)ÀqÚNÓ”md­¬<øàƒþ¡=ðÉOîíFÖv:­V’ž… û‹\f Z¸Vœìítã˜Å›v²?ìŸ^Xï_;ÚjÇÿæwkÏ@œ¬ÒP¾ëµ_·xíá¥íF»{­S­n‡’$óÞ ¬!$™Ë–°µÛw¶wPØç¾ø¥§.ÜÜZê¶z­þáÎ;ÞúËÅÖγo¹ÕŽùá~·ˆ8j@±R¤d•˜Y™”@e?qø[ö’#"CÌ̦#¨zvPKdT8Œ;3ˆ?¾fñ@ÕØ•d¤5ªÓò8“ÕªÔtNDÞ•ôè'Œ»ªU%/5 bí­Þ|bo{7–ŸÿÐï=ºÈŠ¥v²3h'é®à­¯øGý½k¸¢Cƒ¼o;í½½N{±ÍIq”§& Q4ì¶Š\Å“õÝkk›˜†õ¬ä²ýªý¡ç˜J®û)¼ c<ëw´üÉ TÓ?Êž){£¾ËK]‰ˆÔý&.ë³á¯«Úßìdâtöb"qÚ(õ5Ìvêøx 7ø’ˆHÉa„eꮪNVÕpKͦšü Á½yçâ/=þ€¨mCu CäçÒáÿ׋ý|7à¿~áñW¿XĪŠñÔc"Uƒ1ÚqU%Y„³Ùت2s`Ná5­Cç3¸)ºÄ$’wKsv•Mdnž sC¤â" :F«Þ¥œ'†£ªÃH«W( ×èKTõ­2«4«7’•ˆªQ¨&ª²øÂ“’‘Q€K²dš· ÁÔÍëSx)…VpÝ-ÌlŒ±Ö’rEÎS§Óév»Ýn×Ú8m·Ó´Ø»A·ÛMÓÔZÛä¡YŠ<GYÑ?8X[\Ö‘ïÚ„üèz×p¿ÿœÖù~â¡7þõ-´%>Ý[|Ý ^¸¸w¸¹õÈ¥Ç>5\HõÔ…TL!àÂÇIêý,Wi'Wv·MÚµíůûêW?ôø¥•õ•••¥w¿ç]—>ùW=Á¹ ·Æ™;º¾»ÜmuãεëW:)H@ P ­1ŸÁºî«æÁ0Æõ‰‡ãÆ”ã)"Õ01©óÀlÄPQ%Ñ…ÕåÑhäŽúçÏŸýï¾ø+·óþÀC;{×RøÑ¨»Ü{BŽ^òû?¹p„w|Å7lpíöV[®îLW‡‡ù5¿—µ¬¬¶Íòb”›‚h$ÖF6np.÷ƒEqÙÎÉ÷*'lITea-ç@ß’óžÊkP šÇÍõq×Í’tsÚ6§êÔLoRøÜyÑäÀ´x1Uíì÷º4AºãÉ–Žë|o.›mdUóÜv}Á–€§KIL xh@ &@™‚®é5À`b™ÈT(LÄŒQ}!` À59â¤éwJ½ ²'¢~6%Ê&xÏÎêÆÏzöPÀ&ˆÜD_"C ˜¨VŨ<¨âITW2®³lCóù¢¦è-e6áE@†’2 L„0ÕAÍב ˜xM…’!#¤ ¢Ðf°QU(cŒ51ÖÆQDiÒJÓ´Ýî&I’¶Ûqœ‚ÉZ› k­1µZVòÝáÁZ·cœv“Äô–-Ç—®\=uîì_/ñ}×WðëÞûK»‹­^Òé8éw†ÿë¾÷ѾñÒƒí½Ç•鿥5Z=ûèáðTÈ‹¢ðy‘iIœþàð@ÓÞí÷=ç–{žyíhðü—½yþ¶_zËÁÕk­Q¿§é(7YÑ3±ÖAÞFBŠ0bš„J’>Ž®šä1 ãéð³+M.ÇKk|¥z°TÕZ[iQ¨0F™Ù ˆ‰˜¢PR…òQ‹ír§×î7蜉ÏÞõ<Ùoýäo·F8öF8è´øò?ú¥gÞþÜ×ì÷â˧¯^ºôôåÓº¿õ¡GZkK#CY1,¼(8ѤÅ6µÆ(eǽQI\åœ)õW¢ÙãZbz?i\&ñl|| ÒÊ#“Šlý·É7&*aƼ2¥§6ÿŽ•„F ÚùÔ•ÍÆOAøl{š×?©Rñ_n8®†œ x"e+àEE!JP*y›Žÿ”<Ê€?XU R©Ô%’:GÍ-)’BmASl\È–+4'A¡¤wT¾ {TUÉŒ)hÀĵ͙Å’ˆ\±®^–‰HÊ2˜ C &"_™Ê¡ ¢±bʺOt;T¹z[•ЬªCP.uk RÕŠ´*¬0Fƒ¶M¨{²”ÄdÈLôÃØòD-­ñÎIž»ápèœËc>R‚µ±+†‡‡‡Y–9ç´aÃß\\Íwöû‡Ã…N£ø (¢Íõ‹ùhùQúGø»„”ZèûÃtø¯Ãî ÿàýg‡×ÏÞ²ž½éúõ«ˆ(-²³ Q[2ðBýQq@E‘F´¶zçÏ^ØØh­mÜ|SL1ýìOü”ßÞ>ÕéÝvúÔÁöîáöõ¥¤Ýëuò,;ŽZnáP(H‰‰‰ADD'™ìš"&¹ðß¼LPàä#êSM .7îb¢ ‚R*8¶^#+ÙÊÈuŒ…Ò¯·_¸ö¢»_û®Ÿ¹ãpU‘%gw||ù_¼ý¦þå‹_}/š¾Ûsù…ó7å{ûE’‚]hgâ²,ó¤*BlT¹Ñv̾ÈÜ×<©7*ðæ†„t\§ÍżæÙ1ÈÍӀр·)¾Q—ãÆúä‡Î¯A4@l°~M1TAe¦ž~Ö¿ºñø†`(CK}È æD`… )“ª¨ª€XYƒu/ÜZÚZ€@CRš +‚U=1DbâyLÈ”ªQcÆgTjlx !ð1f¥¹Ô<%h—®_eP©³™CÁ ‘–°J)A9e¥–ª` "ˆMÐdƒfoxÂt +ϼÅýå¿þÌÿöbªßûç¿õDœmÁf‘ÑÅ®~ǽãÁ÷}éËOg4ŠýnLݾ+²Q+J‰YÀQgšâ,ÅUã&_ •Ä~2i˜M!4c D)¨rðhЃ)8BrŒÝkJO.sñ­/À<žpäcì„:©ÂÆñ“ž>·ýMMzÜ ýÂôõWn<¤t8…€ ‚¢*Ðòã'”@Lð5€¡t+« @*•Z,M²å¬ DšNâf™Ñ€1ÆùZžŸ«Tf’`À%©ˆʪSÒtezªƒ°Â5ÒÐ'D•Ó43@ª€ ˆGB !¥`6ªÞvÂê¨ ýDûQ@© ‡™Ç!ð "µ±RPzËû4\! ô-Uo^}'O`b¶à†šK£ºˆ8çs^É{/"yž™+„XèhË.Ë²à˜ ED¼÷iÔVõ{Þ .z‹?õö_—4ÞTrDÀàðŸ~åknº²»üð£ƒlÚñ~Úï,¬wÍR(^í ?Ü:Øêö"ï¶Ñn^ìg}ÛíÝyÏ3OßzKwi¹»¼nãhÅtÿ·ø·n¬i·º¢ÙîŽQXbky”N Ël,.fC¥ât4XݧÉ}¶L‘Êç¤Ô®\”ÈZÓ?¨)/Š÷SaƒÁ&£Š–^¥á“ŠáÐr„È FÅá°Oä;½öê©å‹×®ßµ¹ú;87Hþ_ó ÷¿cvä‡4‚ï>Ù·ô·O›ä_=ï•÷.ÒéîÞå'rOùhT£V«+…hmq™…} ¬`SøÐÏRôL ßÖY æ²§Z¦fýìHÍ‚[Ý·sSžBI³žº’“ú¸#õõA÷ºRCLÌŒýÜ8å`ÖR• °G)›‚B$#IÜW«‡Z¢ÒØ"À« ÂÒÚé[þ-½¿¨%úêÙµúAÁŽM〮©2˪ðeƒµæy é¸Ft)mãbÇ“Á+˜‚mØT󥋀‰É€ÙcL&¨¯Ý½(#<(ºf«m”ñõ!KJS• ˜ªÈ÷siÄ–`¶ÍU1`ÈŽ_“ÆpR03‘±’²ÐØk%UQX#Þ«1b˜TUáI9˜@PB7¹á•áÑÆ™Ól]}ëo¿Ç¶Ì.à³Ü$í´È¾åµ_w¾(Š?ý³ÅÈš¥tÅ(\w1wh»¢8Ì:ŽKÒîâÚF÷t ž÷E§}öΧßsßsº Gëg6þúþû÷ï|îm·ÅÃíÚ$é÷ûg×7ûƒÃQ–GÖDlX<Ä3³U+µm&Œä1õ_§ÔýVRT}b’†gµU©¤[6ÆŒ£y¹”ð<Ðå^×{Í3i·;eÂààà`ko³»ú飭• §‡—·÷áßú¼W:˜W}øCXM; Ù¨=â;ç]o÷ÿþë¿¥ŸÒëKñÑ Ø.Äi^¨3\yNf G}ÓV›ÌK1“Ê㨠„QÉî^™`•” ÁŸ=¯§/ÎÂj=¯ç^\[†êj›¶¢æ³Â_ï'Ž× $X&Ð`)³Âý6Ï~‘ã.kÖŒ§Àܾ Ë À¥$ æZY†dPùYk›'æ›´ôûR®`¸&7¢ Û)*Æ"ÇpÓJ£ŽÖvkåjÎQ~B_Uï1ÈÇË…U½ª2Ûª¶Æ 21‘µÖDQ%6Ž˜9­ƒ;J(}Àâ‹FÏŒ‹÷®jI„.ð*ª$"N„ìÛLD…fÁ|¬ù\a-—«˜3ì@ƒ] ¨P%Ó,WãTƒÉDÄ\Gà­Ü0³?寚b+¼²ðÿð j1°p™‡e8ã3ÿm/{ÉíWv¶>ü§wÝqöÓ—½öÏœ&#¯y>è.ZÍú>·‘¶†×œiEÛÛ[´¶|Ïóžsîö;œGžÉmçoÿãûÿüO~ï}±—x˜/²±6’ÑheiqïÚ–1¦E¬JYžÄÖ3ì$n{˜Ô„ø9b& Ê0±¥.Ç1úÏU÷U Ýš½Nž­ ²ÒÑÊØ$žQž‘%®Ãwƒ&• †ÌÖçš Î³<!…!’i$.é åŠF¤¾6©}†¥OÇ„-QS ÷µŠ@G Ñ1>À@ÊMr°‚”•ùe¨”à@BðÚš£.ìÖ€arçWAÛÇEfÜpU!‡–à¦PU!2DY…‡ˆ¨­V¤Žnd’n”î Þüü×¾îo÷-tGG1–5ÊZƒƒÃ›FøÇïú•óíøÇ^ô W5C–¯Š•£lÖ67._¿¶yöÌöµë‹½Nž;4úvŒ…Õ»4_ª|`vD}¼ñšcdê7Ážã4×Ù ¦jkô'š§ «ÔÖ¯0j•ÖxoTvOnÒäXÏYÓü9.Uã4ý|yÑ8= ¬RDåæàÚ"À–`6X?AÊá3À{\…°z…'8ZìB[ð÷CÁ%PŒ&O–€¥Z³S†QHƒ2„{”ç+‘­ªÊü@p¸ â°5ô×€¾Í)8˘õŒ'@½`°úÝpö̲ªÙï%†US·IÄ¡u%'ÒwðÈÀ²°ø²¾"вwÞ Œ1­VoóÔúm·¯>ý,-jÑ'cJPêÕ{Pcm¥¡Lh£@•ITD Äš ‹ˆzñ:ÎÔ3·ÞOArøžçYˆ ¼¼ˆŒ=c¢4M“¸€³–íµEÍòòr–e‘Ú•••ýýý3çÎ>üðÃ+§ÖûÖœ¹åB´¿ÿCoú¹¡Ng«ß‡I¶.´;ß÷†7\|ßï´ö;ZäœDdŒ2ŒñJ^Å bæ|ä… ÇñÀÉîp(‘íllÜù¬ç®nžJ:‹‹¬fÔ¼é§v¡ÝZ‹ã”yo|°F”š 1&Ð^ˆª­q¸&3TÂÌç׊w23­öIy7MjÞãÊëW6l ò…¨Sé0ªìÞªö_Oº vþŸç|ã«ÉkïMm‡]u8âÕöâõQŸ¼{ì(Ý»ñv˜oÿÚ¯¿)7¹øt1=Ú?Xìu}‘-/vv®oµ»K*:vV•*<Æ‘û“ó7ÀZˆ.!OüÒ¤ÞÈ/Væ§óª½§ ˜ã4¶o”è²9Ó\«MÆR+Ý©¡[WOŸø§ØÎìñãÓÖQ©5œO¾É4Ôdü7%ë@“ ýÄ@γ¼˜p`CµEè1:΀ 1$!ÄЈRô …x <ð(d?TœÀ`— òaÂÇ=¿üÑè„VÞpLDJ‚!òA…`‚™uFlT¶$Eó I9«J–Ì'”)ÕdNKæÊ¼óÄáñ¨d„Ò× 74¡IÖ6+fŽÏ’ÛóמçqÈ@Ô)©µ†Ó4Y\JVW±ÐCšº„˜,‘U!¡°6Z@Ü«:N8Y1‰Âû„¿µ%* Ù ¼€¯­ R_\Fƒ¾ë›è+"£Ñ 'ZeŠ\TÔ1Á£áÅ̆#"JœwÎå…&§–ˆ¿våÔ©S{ýÁæ¹›œÏN;··wðMÿ仜]\èGGfáe_rç—,-î|ð׊AÄ^FYÒŠ$I™™LDÖJXV®êE¦(œ³ŠÄIv¨neíÔmwݽyþ‚€WÖÓ4ÝßÝ}ËÏþ\›ùÂÆf²½‰qä}DlÙ¨"¶0̬`U¨2!¤WiÉj"¡ jù<–)áo®8¨M™<Î ³**L ‚T½ «1†@T —k}™HGæ—¾gñ&D.~t÷íÏzÕ÷üù;¯/ò!S¾{8"Nº‹Y>ÌŠ|WñÝïù•{É«'K’¬¦­½k×l;õ ¯¯¯FÒT"›jÜ\e®Öt«Æ—H4n¡Vv[ 4ç£á/«Òéþ©¾Ìâ©LXTå¦ Á_³¢|XÒ<2;SeŠqÜžÙzj`î5'/¢û Š@1‘e!ð½óà}pŸ"Q`èƒ`a¬ªÚÀ= ËØ‘à. ®–i¸`kˆj°„eÁÁש¼rN¹áõ|)™‚„Tɬ%™6‰ Ø„\Q‚°1ª RõZC°V&èrÂÕgÒðRÓ;MÚ«gu_Ìc¦53šàM ©z¦n™ª°\/ÅÚÄàRÃà}CÕÁJEVUÉŠ,b«±UæÜ9cŒ¶l-)B¬dIÄ•™0‘À¯`KU_…¸ªª œªª{&UòJÂ"¢ãu,ÚçrUõžëãŒC¤,¥-€¬‰½÷"Á<`ˆˆ‘êJ«£ª;;;‹KK+›ë×®]ë./ª ?ÿィ•ö(N£NRì•øŽ¯z¹âñÎõ-ÚÛÞ\ïÙ !Óíb0)È <ëxˆQ4=<8ÊâhíÜù›nÚÚÙ3Ü]Xˆã"¿øÿcìå¶³§Üþn·(˜”à ‘a†*iˆM)ʼW¢àÊâ ·LÐSr^HŽ5AFÅã½W D0LdU4L ô&Áb¨gúvóÖ»ŽòÑÃÙVÔâ ¶ó#Ïõ–þËýε®±”fÙ€¯jòDRÀÄÿæÞ‹ÿý[¾óú^XÙqÛÃÇ0ˆ),ýCi7Ó@“<ùšãY­pj¾7ËlÊX”yE§å˜ðEhZu0°µo¸¡L‘̦“ÈÂ0q¼2:%QGtǾðÌÓqœ3å³4Póä Oj _KúÅ Á›!(°B@~¥Ž[}BNàR~ò _]pP¥(ðc¤WU:Pj‘¬τ䀀Þºv\+o<fR¦ÚhÃDÂDBMÓM³Ô«tÊYQb°“µ–“jŒtŒ º{Ÿ¤u'z(ÁJÎå´3•äPÖ@ ;Ø ˜8‰Áeö‹ðâTYì¨aHá2Wd>Ïò¬?*ŒºÂÄIšh”¶ÉX†‚&.8¡á‘e*ÐkdÕWžI½È ŸU½@Èk¹ÊH+=ºäL"*Lš¤A,“„^ƒB¨”º·B”²)…†3_Ù¾º°°Àq´s°Çqwiùðð°×ë=ëY_lÝ •À}o½œç7ÿƒ£^"‰³£Üç^|lýÖó1hè}¢äÎ{ HX 0¥­áptàFKëwÜóÌõ³g ѵS§‰HD~þgþFÛ7V[Eæ‹×¹Ùˆ‚PA’` ¦þY«LmÓtR«ÂŸÇrœŒÊER]3¡GŽЩ´éÄ!QW’§1Ö ðál=×B–Ö+FüW÷øÎ,ÆæÃf÷®=ûtmÿô}¯üÖ¿úÍÝöÛnœg[Vã•ÕÅË×/%0À?yÓÿèþ§«;ûGÛ[ ‹]q“SwV•lþ¤r¥ŸrˆkTÔlA«%‹Táq¸«rÓXþúJgÍ ˜^›µÍ2ЦpÜ#šêÄS)ÇéÖS•heùø\)µä y%éÁzE‚È¡#FP… ”^áʵf$ª¥yA0‹ák¾ IDATš «¾€š-°¨> Ô!¹È ÷ÿÿ<¯Á0F¥k=õ+z0‘X"0u(g”÷ž*P(™]…Г¤ÖÀÅð_urÂ\?®)ºÖ76¿×eê`Èx0žÞ'ΔžÆàñÙ»‹JÑLN<ƒ 3©øl˜íû­øÐûÃáQ«Ó]^Ý\²d8uZ&•ŽwSéñ—‡gO¬ýDÁ¨^†Ô$ ñRuÖxd8RåÒxúU™EP:ä•Èûrm±*Α©Y^ˆÄ=wáü•+WMd––W···Ónï…/ù2/Þ´"WP»ÝêúâïÿþÇüÁ‡ýø©ž^yðáS«+q¯µqöÂÃ_>{úœC-3„ ‘‚½¨(„h)2_Dfsó–³·ß¾±y¶Ó^t^â8îtZ?ñcÿ÷εkO;µ‘JáûGk½ÎpP0ˆIœ¨’óŽ(¬‹%¨²ÁâUí$¥ý]€ÞÙR7ž²¸fÙ5N„¿õ²º ¼¬ÒÉi˜ Öag£»p˜<÷JqqvòÁW«µó¬ÓI~þޝúýñ_eG£nÃÁ…Ë£ ZíÕa±›-/~Û[~b ø¯}ízÒ]¾.IÌɹY/h¾¬Žcƒd?ÔÐ~Ó¤p%W9YëÎ9J«ªæ÷ÛT ›]7Û«Dä½4Ó;7­º¾ ª~NÛg9UKÍR›Ï•yK–§¾ŒO=‰"=·(ÈïÓ]eYž£ˆ”†4 4ƒ)!H´Ôt…/9 o%‚“zi… †úUð£ÀuUt .uôøxê¹Y¾@Ê,­Ôt0UМWZ)ÁäDƒ²š­|êA³!»õS披s멞?§<Åן©yN˧#/™ˆH&â$ZIòÙ¨¿»½såòµí+{{;Ãᡈ‡U²$$B.óeh-4GX•UhøBõÇ{¯â¡¢*"Þ©WòãÔןB\á|^¸Âùðq^Â'÷.| ¯a€šN½ÞByàÁOµ:m'~wo/IÛwÞ}—@m¹¼ kúƒ>ßöMß¼wñ¢Ù=X v.=pá†çªÇ|¦˜R]ç,—hð³ù]=Õ¶YÞõTøÏ#[çTÏ ©§|Ö…F ®‚œW@;€#´Œv,ÑX¤%¾-nAýŠºMu§áo"ô€¡Gè…ï]B7Øé@*s XÀnDÀ¼ö@Œ=A&6ÇîjÙ<ó´ó7_ð¢ÌäÅA¥ór°ª’¨"bk­¨z¨çjé€yâr)#‰ àÊЩ¥Y©Z\F†PAPf‘–ê€Iýƒ¨Ì>Oe” HQ"’–“)Hûõ¢£æl¡àr1±3Bä°§kø„HzŠ@dE 6a5Ãlˆ˜ˆ•#3˜°âÒ0Y&#Î~u; ››íµµ!™Ýþ‘ :I«»ÐKÛ©1†”X˜=+Eª¬r_À€ Ȉá°Ó,•}Æ`£Ìê=•êB©í†—T'á 1—lFBÈWõÞ•~L£dˆ92Ĭ¤B¢ê]îuqiåð¨ïĵÚ-2dcsØßowÖ‹QÞ¶± ‡/}ñ‹8F!"ä±°$‡ÙM°ÿêk¾nýñÇ7û;ÙÁCQw€ha¨Bi Æ)P²râYëÉäN }ÞÇñ—¼ð…wÜ}÷õkÛ+k KKi§÷žþîƒÿH/ww­¬´û[¸V··ï‹6òꊂ”¬±6Š˜ÉiÞò°(u_%"bV¶Âu‘¨ÜA(0ÕŠêµæLÜ\´Z»üµÌìÄ¡R¶úK3“%°÷2œ0ˆ%¸ÈJZA¢ªÆ3« Æ%Hðp¹ýoéÓV&âzcP —0…¼ÌL\q9Rf2*J€5Ö°TÄ ©P9%ËkªBmÃŒŽ°xªOÛ­‘äÆÒõäT&oظçÞµ3qtuÏ‘tÄ«‹ù(ѵ»êß÷éÎÝw/™<7ê ç}ò.2yžGdŽbÍ ÒœÔ‘¤©gô#W°Š }d„ Gª¦Ú&mÈèa‰:R1$LÁMF†É°R)ü‡ù];ÃJ:s¸Ž˜ÀP"ø°]83…È^VS;„±D Èà§ ·Pñ*L¨¬ôx Š Ía€˜M°R9À¦~(ì=Í"fckØ¡º¹ÌDĤÑßýËým§‘-B(…|¦ ÞXT"@ ÚUÀdç*¿Ä H„à4A Iœ²wÞ¶»Ú~ù&P(ÚõP;Š£Uçz@Òj÷Q,%Ñyñ+ŒÕv{¥(òVz[†¾‘óDGª#`DšýM¸«Ç™,n8tMiõ“çÇÙ%Á˜:7xJgfˆ‰©7dÂû[?®„ÇJÒ!¯‰œ'Ú"<'·›/7%ëy­œÐ &Ð<žË'iTª\WQ‘1–ƒöE­V«ëÅ'q{a!iµM“±%w9Q€­gzù_up®]KM‘¼»Eè%¨ˆSˆˆ«Ò˜,,,\½z•ˆn»ý–Ç{,Ïó(Šz½ÅÃýQ«Õº÷Y÷…–D‰…:Ånç`3I¿öy/àlÏgû>þ©•^QäœXf;±¹›2 ÃlÙ„€l˜ybŠ¢\å°//½à/Xߨ|äÑÇŸ~çÝ¢œ¶»ùÈG>ö§ÒÃþbgÑ‚ÔyUaƒV«E#/êC~g Ž'”ÛÝcL½NŠ¿½BDuVNTöí±Â„ ²«Èh:g!UA'Ôbký¬þÙüRSÂT'ÁhžÚ¶sÀLw:Б¡«±ÛåüN³ú}gžó ~ôƒþz¾šÆÛ»=pÖNòbdÿ_ïz{âüw¾êU›Hô`  o‘'|Äjê-B*³0±Â1‡µ¬ '<ºe®ÕÒTmZÞ oêQ/T§š`9Ñ9óÉ­A65ÿiΩ©[ŽŸµ‰xêøÄ¦¨uÛ¦8ÌS¡[¢§@1ŸÓ¯åýë…qÀªŒÀùšjÞëFÅH²„£ŽˆdÅA»½ž¶¢í¿JºÏвáå¨Õ.²¢?(z+7îÁšRöŸjpºÜplŒa®»5¶LY#DÊ"Rí3_‘`0_xsÇL$¤˜fòÇNÀæúo9m&yX“4¹¿z‚MɪSÜG>•ãH|bòp©)Wj÷Lêš6ÕL2ÖÆív×,/s·ëUÛÝ^wa)JZàÊÐŒñìœEwB©©ÌVæ·y¢1'X±Põ¦W)“¥žtxx¸¸¸Øét>ñ×,----®ìïï«Ðj·{÷Ý—t;£Ñ(êtŠƒAdZ2(~ðÛ¿ý艋§ ¶øØFš¬®t76Î\ºv%Ž º!%!(XØxr¡š90åä®;ï9{îf/X^íå…œ:sæñ'.½÷÷ßç¶öÎ,-otzÖIX'…#¦;¨ææõþuž+½=iWO•©n†Ô‰(è>(¹–ÎH”kcŽÝå¦I±õ÷z9Í×mTU ?8ûK/8AE)ìV$U¨pIuãåømobPÑòRôFƒ—ðrqêöݽüSÙ¾§Z«û ê¶¶Žo|ç;ÿù×}ãÆÒrËÚÇ®]ên®äƒvF:Žä/÷ ÆxñPF¤°ZúL0èxujHåmjU 1ïá¬Ö FXÇ?1M;sƒ0¸±²hZ‚©¯œîYô­{ú8Q]mUgstÆkÊ t5K™'´êsT&5éêiýë×ÓÅÛ‹‘"ý"j!Ý?ÚG´kí¯€¤° ²ÁÀ#^ÍŽ†@ÖnPÈ!hy”HàÅÙ ÷îñë†`"Ãl‰ÆIKCÜ8lB õ6¥eU%Ø@,J5a50 Ä‘hØcx¾È?ž#ZÑîñ‹çÂz@£C"hƒú°6蕚?©þ^g²œšQLa7Bµ5Eóéå •ž‰2i»@X d¸Õi§««)Á“âØ¦)Œȇ=ب4KΑ|gŒUóË]›U…ác=T¨\€AZ¦ Ö°ZS'®¶„Ð2Ö6ðèØP«<üð÷ÞzëÖÖÖ`0tÎtï½÷€ÊÌÅÑÐÚx%j¿öU¯h]~Â]»²uxeÅÁÞõVÚÛÚÙ¢^'rä ±¨lS›àÕD-qþ ™Õ•³çÏÜu×3¶w––OŸ>7ööÿà÷ß{ù‰Ç¿hcm¥»eEѶŒeÆ0 I L¿LÄ*DÄ¥¿¢Ú°¹Äs‰§îíy\õ3(5ËžøÛ¨CU¡UB7ª–„G‹T$ªÄü¤|TRi$j-j¬vOª×ÒØ| ÕD‘°¶ŸAT¦ÅâJ¢¡ªÎÃvlúÕ·c»_:Êî^^ùg‹Ïùç÷¿×¯,|jÿz»¨ÑÞp€vŠQ†ˆòÈþÛ_ÿåÿþ«_³Ônceá¨(Ó™¢~|W²²ȃ@Jjyv£µ¢º·+µ˜k`«BxÊ4#•žÝìºú1Ïå÷M‘}öÞ&©P££š—çï¤\×Ö¤ÌÚS6eÉ;N«žâÙk>g¥ä‡Tš6Çí9oòýç¿Èî_ûÄýÙ¢½“# ‡^È@ ÎãÎw2@Òè”Ëû‹Ë»÷Þ›îîm_¿Šë×{ÅÑö¾Wçé«ÂŸ¼;Ê „ A™êl)õfò5m´Ú«+u,A—»|†ŒÎ°ÆÄhj*ÀI¼oÖøJXd"Pú2=r¹Õ\é´#Ô„È¡¢ê¿5b?Õ*¶º†©f&IùÓKµ™˜ŒAšÆÝ…V¯g[-S†¥À+I™Ö¤ñúÇõÀØ|||{šÍ¨Û áÍ¿¡áÒg,ÖÀ°µÖZ»¿¿¿¾¾¾µµÕét~ñ‹¿ìž{ž'Q«• ŽMÚ†×%ð7¼ä%7>xà¯íÑnÇç7Yïu:Ý…ž»ºy†ØÝWÁ¾\š@¢ð^=QÁ< N[í•3go¹ã6Jlœ,¯®^67Oÿá{ß÷‘}øÌÊâZœ$E1Øß ûÆ“ªó õ>¸7LŒÄC<Ípº§Â¤¦ˆ'ÒáÝÎrÕ¹·7 ÇQòÉeî-Sx0aá˜\6S#4PR‹‡*Á‡ä:†•Ê•‡Êýà,oi‘ùbE¸ÝNw—‰bzvßüð³^ïÐbšY×^èÅ dŽmŒ!K¦™~üÝÿùÇçÃN«È¥5"µ,–52°F,{CÞc8&ÇÆ1 ³‚e0ƒ90 OÏÙrIw9gPåÕ S¸ÜE4l3Î ÃSRÈq}Ø<~¸—ž×*zêgóJšWšgÑ ÌÙé?ûó„úO~¯¿Y‘j…R).…Ϲîîï¾ñ·~¯ó‡¼åçÞv'Òïwyõ‘$^-Š#@÷óëQ§Ûj-ú[g{Wò?Üò®?H?pÿÆO¿emcñ1ÀDÉ^X¢ð€ {WjÌürãp{[ÿ®ÆjÔ©6þ0k¥Âá jµAC€IUX2Ïh3Å,š «þÒ ,¬.¦æGá/QiæUÛÏ«ü˜ )ΰÅФPa³†ªZjI5£Jœ#"§âK?Ââ 8ïÃŽ †aì“0ý <=iA5Q$DÔTB2ˆ˜m0f0[c¢úKÙá!¦ƒK‡u€df^]]µ6ʲâ¾ûž]ä>Žâý¬Œ2S6Ù|ÿ7¿þ´Ž®ýå6»éRdb2—¿æaGÂÅÛû{NÕ‡õ¾úªÀCG‡¶QÙkEÖ·fõ¦›Î]¸m©»2(†§ÏžiuzËË«ýËû?òá­vÓÓ‹=ÊrͲˆÐJb6(Ђŧ6‚*+LˆMR [Uss…XÝO¹œ™(äÜ U@Æ«'éä:Ÿ‹¦'\\ '`pèö`x¨ywÓö8ÞIðÉö ™ :ÂSc 5öižFš:E‘0Í2Ì_¹ƒ ¹[‰Ûqï±s…twÎù¢PqPoTXĨ'ïXëDK•MŠ„!¥)«òM›¶UšTXá6Õ«:¹âhj!ÓÔ¼Ã$ÿ™­ç8ú™Âàæ]SÜŒš{MNÓÉ0\×ɸ³ÏQ‘êoÅc@)^¸N1XoScïk_ŸûéV/>r~hCJJß"¬w>ãòþÈæW¼ºoâ>†‘ NC£no!ƒšhTyõ×U‘¼Ç–€gg,U^ %žË¤¨LiÜ8);§y"5$÷æsù¢èN±ž&~vâ,éO-Uœºr¦Êõ…á7ØÔ§Æ„D!N}!¾"ŸnêŒ`î‹?iûOî¢qÜÔeÆÐ`0X[[{îs_@D‘ W´Òˆ¶9þÎð?öþÿÒ-†çz±ì^YZêikïÐ#J9j³Q!¹wËj©ûªª¨¶’öh˜Œv¡·~ÓÙ…•ÕÈD”k»×&¢$IÞýîwú‡½VêGýXTs¹wY1#kmÅ’ZfÕ©%©3wžÛçs6]ŸššÝOJ Ÿ{êEU+CCÝ2¯Ð_ùåÑЭDí=_Á­tâá—~Ùõw¾ç|”8çwÀÖHO…o=wÛÿü=÷~ãŒh×DÛyr™ÚýO?:xÏ».à}úQ<ȃtj-òœrãa™‘1d|K@DŽc%/Dš‰ªz‚’ƒÈ˜dh ÄÊAŒ¶%ÑÂ"V( A$ʽæËENB cIAêË=€ª^ ‘‰šÍ«T3ç©Ôá&´_Þ‹:ÖQTU±bOá,‹Vb– Ô—™cÂÒfP½ºWG0Ð1ˆX‰V@™82’ÅðFâ¼p”Ùb lȰ9ø`¯.Ùq˜W")"ª«l ätœ?(\+ªêÂKQš¨NR`¬©'v¸_D@¦×ímmm%íÖ0/ [/ž­•öŽî½õ鉱Q¡P£w׺ç¦Ó_~û¹Öãë¸ë” ¥µ ®06ê´Ûdãœr…gYV˜vE$¾p™ ÁD”;¹–Fƒ8µQçO¿÷ÜÍ7Û8탛o¹àÅIûO?ø'=ø±N,§ºí¬H£"äÃA<‰ƒ¨a=06Ç()Žƒo•°\Æ™±*)DKa(de¬·åHQ*1RnÉSŠÚ¹Õ„P+” "rž™•Y‰=*¹”¨2Ôæ(ì—Q¥4±ìˆº†\ÊŠˆS¶á‰x©²[‰Dõ6ÔÕFY‚ôÁ¿fûi;ÂЌԺm ‘Óž‰v}þý¿ùkÿì›þáÒî ÍÄ‹/_:½²9¸¾ÇFˆU”úE2q’Dlȉp¤ª¢¢(7Ø(i—G’0²d eþÑÄ€,È€šA[°B6*5Ör³¦ì®ªa5‡@¨60—Æ;E˜ÚP¯‚»@å’)"Lªuá¤0ªªÕ~rÌc+`@5ÔièÔ7öZ-/h0%6À8XLJ!Ër!*˜0¬þI`ì©—jq‰4þÀÙÇ¿âïÝöŸþÓÆ·@7 V¼þ¥/Ýùõ÷l¾æeG.qþòÚ²ý¡ë½ê5—;ùm˜ó…ŧ¶ñªWâGžÖJÍð`@ˆ¡-E .ññûÎÞ€¬õFƒ“±‚S’¦†„L §¨W5ªhäz¤Z\ Qˆþ”cr)´³æøÔì:‡N-õ›û^~:¼¾Ú_¥6r„éZí>vl¶©º§2ç†9DÍèJn¼5Õ’/ªm’EDã¤fˆDdŒÑÒ1æ*&^êFÁ×Î %€€Ú\×5F܈»¾ác ˆŠ¢èõz‡ƒ~§ýÁ Žã~¿ÿœ{Ÿ¥dBš9b†˜_ú¬û.,´W-›þ¼#…) Ql‰ƒûP „2îΨªsâÅÌJQ¯â•r'·ßñô¥å%;{û÷=óÙ‡‡‡ë§7|ðO|üã>-./Ådà2€%©¨'€Ö%nGÖ*P$B^Õ«WöÕÈA@ub¶±Æ¯u¿ªz¤ÊÊD$;m€…€hìç qồ±R‹‰é@DT”AØ@BC¤eŠÐ2X·%cC–XÕ³1Œ‰™y4Êa@– 1‚QÚ‰ŠD6 TWÂRåIÆDRgfEXF_ªÕÿê]šE&çü„vÎP =Ðvíåê-ɾó®þì'>ügÅ~Á(º}·r8è,¬^̯ïp±0@ßãGÞò §’èõ_õÕGz¡µ,ƒÌÓhØ'Ž–;í™2¯wáL2¸°5¦ç1€É%ü:yUÙ=?‹2ÛKõÏ0Ô¼LKÏÎ8ééÌê m¨×MÛÃìXè1þÛÖ€-ƒg?ø‰G_ýÒýßûÓ§-o|¤?S@ç¥/¤·þfï[¿áÁ¬ßý™·žýšÿztºÓíû|•’Ç/_>÷ò}x{ï&N?=¡Ýzö ßFÉ0ŸÒco8¦Ò!Áï+ó¢ƒFP&(—gÙ«S V&»ÒPO¨Y–¢gIðá_XB:}qu˘‰49Eí¬7UUU›bQ½Smú-gr]jÅE¦ZT“M¬béED‰êeE× Ë ñÞ‡NsÎåy^…EQí éÂîI""âµÚÑ… % |m°Ì M=@õ{Ø7çÅH<ŽŽŽWV;εëÛEáŸÿüçK`˜[]ߪ c[ßÿÝÿ|œfKŽö"ñYo"P¤1ƒ-WKhXË< Í1yæÌÉP1ÊòÍÓ§×ÖO?ë§»xó…[œó ˇ££~ìþG~h9‰Vþ_öÞ4Ø–¬:ûÖÚ;3Ïx‡÷î{÷ 5QTÅ,Bb.¡( P l †¶¬°ÝRcY²Úr;:m©ÑÝ–Ã!¹ÃÈÝHÝ–D##KjÙ„Z ¢˜)¨*j|ó}w8÷ 9í½–ìyò¯(ÑàpDõŽ7ÎÍ›'3ÏÉû[ë[k}k0 ¢„ó‰MêD¡jµ y1 OÞûjJ¼R,8c"¢¡Í–_;ÅÙí‰ SPZ$…}‚ɦ`Zy:œ‹`쉈ÀAjº1ÇM+ÔhŠ…™æÝrBª¶ÎY];>”zqž¼c3Wí4ˆÑA¢ÔQQ…6¢Kˆhí6{{ÇY¡ÚÔÜGÞ¤y˜Ú¶Ñmepóâ1”‘$ˆjZˆssñL¤0ÆØ…»i|â‘ÙîùµÓwòÎÛ_àŸøä§)ÇܶãIïìï&+ãz6eD%•Ã䱺|ßG?ôwÞô6»3___Ümõû}+èYcÁå"·Öö³¾kz>éâ2²¸ d·¶ðr.4¢³>´ûvíu=Jow>ŠŽ‡öQÕ¥úVgqÓNmX÷D‡nY{Ò£'ºóÁë 7ðëˆÉ7®GÏMýì/?véÍßÿð¡Wš1ØÁb‘Þü†Áð^ÀÀK_uÅ 0Ùm¡ ˜R IDATàÒÕ›Þþ=ÿöчït˜~0¸m±Ø† Þ¼6æÃ!öCãéÀa(|ë7,§o;§ã"d Ih,O"øPvÚ„d‚¬š)€­Y¿¿&MᆠÆá÷ x$íBÙlèwì=ô@ƃEC씪â²C !2nÒØßÎ(!¸‚¨Â  ¥ƒx³ƒXCιµ!"u]EQU÷R…Ç7<®Þûº®,"µsN´V *`ÊüRX”4÷¡ýWŒîŸá††±BÙS\½úñýÕù›oºçžï©*ͽñx2Ë}YCÙB~égþóÉ#ŸÙ»¶ØÝÑÙ“Oú)lBI&I «ˆjTР§DÄ`fö^¬†…9÷XˆÐþÊèäÆéÛïxÎÅ‹[››7¯®œ,ÊÅêêúÇ?öчþJ¢þÜÚé¾j½ÈY”È8ŠØBÑ–FmÙ“ÑÎXNJ2<-K%(%À0± )uæ3[cŒQÓHú¥½x§鯱ŒX}IÌ‘€ëäéÔîÀfšYxß~Û¢LØÇ5é¢áWØ?ñ"â„Å›Œ,”½H5ADB6ˆ{ç}¸ãÐXÏD¤RÅ+a]Nxn Á°}Yø×±Ò´Cik+`¦˜ÁÕÄæô +ašðIÉÜÎô޳›^¼°yrã‹Þ{î|ùßþÒÇYý^=÷g7°½cöç'†ã«õ4Kú¾ª0È.Mó_ù—ï{Ï[þ£ª˜§iZ{éõûã´'óE™—£•,MÓ²,Í‘‡÷àãÌËßÊP v~¼3U„ÎÃþÇ¡•¡ÝØ…êCW¥ª-îž=xÀ­ÜÚCá˜ñu#›o4Žo[ó•Â=Wíü¾OÝöúWÞÿ¾÷Ÿûæg‘s>Ñ„j~Õ·_K)µþ 0Cò`Yß|ÿþ‰·<ô¥Ï<[xr¢ßÛX,±‰¸Ðã®iÞpÃ3Æó~½?Þÿï ƒ‰û™+©6‰µÊ å˜`Ó°Lr IVXH p8Q!ÌĈP•kº#tÆ OQì»§ihíü>ú€©ƒ½Ñö¤f5:ø.Y&ž9ðBËE‡?ˆBmÁ04ˆHAû(ÁëõàL ø†×«kkÖZj:èjຬ÷ …¸FéÚ«Ë éô·h_;=ðg뙡ÙÑ#º9!5”Ô—e¹¶zb¾¨+ÿcïþqï0óét2™f«ëåþbu8ú/ßõîâÂédÂ{׳bNä{Yb­- žØ$ÖCD€C!)•PxM¥ÐÌÕ9 IvËÍ7¿íQp’Æ+6ëõ­ÙÚÚºï¾OæÓ½ÍÕ•ÕÄb¾HT{½^í½QgÁ ±Ubâ m 2Ö+Ô‹×ôĭ˵3ÃZ›&&ÉL–°MÙØ4ÌjŠ~%‘œ .$ àr cýÔ~Ï¥Ìá|ÌÀ&|dË>äX«ª!Ûb¤ªZu‹Ù¼˜ÏáÜ0ɆYšYK £Æ!`QxçEUÞš¥W 1Qj °–DÕ¨zv¤3ÍOæiµ H™BȦiðKJQ@cÄÉÃùµs§ÜîôŽs7?>ÝÚX[]¿2ùŸžwÏßþô¿ªÖ2ì\ÙἚïTEVÃ'jjØ});ŒðÇ¿û·¾ç-·×f³™8-½ëgéÚêjš$Î(i¯SÛECµ¡ µƒÁ­Üðí‡>cg-Ï}÷ã·;Ó Z>Eün}ߣs£EË>ÌS;˶w ÌžÜwüÇ d1ÖWÏmíü?6}[T|Îÿì».½ÿî<»²'èÍSXÕµéz£e·]Ü’ŸþáÇ?y_L€þæé«×î­¯Îv-lÓ˜$ÌÝ'ÿ–ŸvÜzÀ¡fWR¯í¿—qŽXŸr—,$F]&¤y˜6!SššÜg|S=:µ;oŒ{"¤—]ÆšÆÍD%±4µ7èL_ ¨ßT"3!ªg"#ÄŠ)¬Ì!98çܘLQƒ³­ý ñpê•ED üà$IÒ4]Y]3Ö‚B“ÞP-"µøÚ‰s®»<”eà¨}3‚c]yÀ»Ýa¸r"âÄ×Ëï• ^¬µ×¯_W6¿ø ·ßÌf‹étÞë[_I9™¦àœ=§W/™ë—t²#Õ°XkaM­â”‰ÉšÔiY×ð] 1ˆ½s^EA^0wuî< WF«ë7ÝrÓÆ™ÍKW¯=ïù/¾>™xuý~ö±¿øÈtwoÀ¼š¤”çZ,†é ËzûÓùÀ«d”HÄ‹¸¦ð¼ö–¬µ6ég&ÍL–š~f’´ªÏdÉ6 lBÆ€-€ÊÕá^»hÉ4¹€QNC–žFÝ0¶q1{ï—•ëMfû¡U¯néh£q㨼&¾Å`WÊ®s»ÓI1›g†GY¿—¤–a{ý•ÑxÐëY°:/Þ‹srO¢ðˆj ž)í°Ÿ¾É ŠØá-×rô#¨ª™HñŽíæ8ž‚·vŠÞÙ]ñœ••ùã[7ŸYßZL)“[óê¿{Í›î£ÿÇb%™M§ëé`Q-<ˆp-‰Â¦ƒ9Ó^úëøƒŸûŸ;wºØÝ_Lç)¥£áXË2Ïó,ëãÉ)híxÀ@ªËYØ®-ûÞ¬_‚>ôµ´ ÝVµ]: Q˜Cíµè’˜;ÀfS‡šÖަ}×9ÆøÓ~£ïék7  ·wV‡ão›Owa’ñxícÿ.ùîoþ«?ýóWœ;Ë<©êqŠáI%¸‹—’{¿ã㟹ÿ¹6›»2OÌ­W¯=Àé`¾Ÿ`Ú8}•Oñ´àØ­ˆ)м­=Ô4h8O(±¨šµP ±g `¾«ÝerŠHXK´åõÚCžGd hªãDKeÆ R ab¢`ãôÕ¦mLÈc¦ ϧD‡ÏÚÁôST‹’áêš\ÓÉiíÖÀY–Á&0DJBÄL"ä½Ílø²ÔG$½Ý¸®°÷>pt¸›€½÷€÷µøÚ;Iªpµ¼íí?Úï'³Ùb8ÏçyQ¹á`°’ŽÛW¿ï[_>}øKÙìz_ÊB3„ `˜MfL€z0(l‡¸Ö(­Œú.=ú WD5hÓ7! Y†·äk,ÚY ÌHŠààR2úßÅÝ+é>GÚðÏišÖ@ ° G²öuÈÊaÃ̪Ë4®CʱÌ,ËX¼ñÞsðÛDÆ«ÔÞ‘wF„¼#Ï"âŠE]»úÁŸdFž×Â’×?9š_ŸùéâøÙ_xìŸX-óV©ä¹M`Œcc¬MÓ¤2®ªct€ýƒæ¡–™¡Â¡@—MW×Nœ»é¼W§Ð^?Uïë³g7ë½ÿtwwc´Þ3IÏš!^\U—BœØÜÏ­šÔ˜Ä&ÙpÔ[_ÉÖ×’a¿è'Ö¦I’›Z1ñUî«Ê€ ¶†“¾@h™!3`‰ÓRø"|‡üv˜°uíÑ/ ‰ûaE³æˆÙÂEèâ›Ûï#ð*Aª¤!)±ôjúƒñ`8vuU–u‘»ª†ˆ¦šfE¯?Iت2Ã[â¾s–4–{cHÙxöZr¨QSŒ„슈£ªÍ!°Æ˜4wš7x^¨±(ßLÁŠæ<¤WróÌËåÝd<.†Ù Ïf³}³–ûÖååÆ5÷k/|ï|þß<8ÌK¢áŒj/½Õùlê\µÂƒž“ýòák—.ÓÁ™¾ ¨6U.[W{u:ê÷еãµµµÓƒõILÅZª„!RçÜÜ9_; 2ƒ“Š 1{À©zïB]0Š$& $‚Ö NÑYÛuœÓ­BD\ÚcJïkéÅóq`H&T”©äˆÈ2“µiÚÓÑ REÐ/,”ê…“*ëYØA5¼"B¢ç3µ¢©«O½°s,š‡ L`Uå¨áUUkÇDIÂV Ð袃±Ü!ÞÀCVX•Ô™)äØë4œ'À‰žQ¡bQ²Q?­•¸´B6u/ØçÿùEßþ3Ÿúã’š†ë›óÝ'æ¤@-‰Ÿî’ÔÔë]¬‹úÿÉñ¦·Ý:ÜH‹éñ‚‰ÂÚð€ç£¨»—G͸ªªpO:Y8óAGþ$åh tttDd9òž«oÙ\¿òÞÿýEw×[žñÿâ—îßÙÝ}þ žkö¯§i&ZM\¾2o<çüxss¸vÒ{OÖ5žáÔCÕCÌ“ÉÜcŒM³ï}UUιÊi+”2Äܤ¯ÕnihjHÈQˆo˯º*# ¿]“¨‹o{øÎ¿êºŽ3A‰£iÚÔ¹Š¡Òpê^¯‘@»Óιîúª1¯“¬ñÆ‹UI½öD^F±$ M;”`Ëê´o,H«žÕ1Kmà‰„°R’"TOE6 pç¾Íµñ^Û¬ˆvòSçwÙ³ØÛ_•9g(q“É]+ƒïß<ûÁ+h?Ðâ$JD&(•YbÙc’¦…ƒƒjæR˜¨Á3ñe@b„”+WÈd˜± ‹O¼±Î㢉[Š0È:$¤ÇÞê kó[™ j„˜HcH;êGß1˜ž¢Éêæ‰b2}æÚÚ•½í•´œÏÞ}ö…\Þ»¹°åÏò9ª9Û>ï÷úù,çao'¥ŸÿÀûþñ½;»>ëúC‘H\z¬ ä©r¨>¢y(@á"6 kÝîhf2ÑEoŸ\ ÷è8®Öryy-Ðry»kB¼¼ã¤õ«ñÿþƒÄUÕx/T¤ôåßþà«_ñš]ë-¤F¢Õâäåퟸ÷Òý÷`'oÜßozŇ?üÑן=SB²ÊÍÒää÷}þÛp×O¾ã³ÓzGý³Áª¨˜x2þOCX ‚wAt1±8`—2²ñ¨ÃJ Ž¥XB¦<<? b>.ÜaHfVZÍÍ{IETŽ7(ÐȾ µ63¸5oãѼDŽ5 `ú˜'ªÒ¬¿UUZ“4d‚J„>Ê-)­ß$^¹¨õ}õË „%”6ß¿¨JHL‹È!NTˆéWá§yÝEë³UÕ9wòäÉ«W¶¼×wüÈõûýøàèõ¯úÓÿõ뇣­Q ò#ÃÃïú¾+?ùóOþáhú` 0 |¨Tm!ãØñ´àvDÍ[,kÝ„XÀ`R'KS’.C8¨ûE…•bÖAMGŒƒÀNvHŒå4!ŠÏ#Ø!âƒXæD¤àŽãKíë µ¨P¯`b}¡rP„#LnUU `MjVáðñ9¬ªÑ nÌqGÍ¥HìÒø…„¾ª¸Áƒd2ÚXnÓœŽvl=èø¶ì¨WÈqJX¾ù‰:ý!h,ræÜÙÏ|ö³gΜûö×½!Í’Ÿçyâ¦á–….Ô&Él£}àªôÕ-|Ñ¢ÚŽÚ-Ýßi/z¢í Šø§‡[,‡cú¸O“¯ @•@ÆDAHD7L‰¨(“1ÆPÈ‹È=\_ Å|" ªAZk^Px4ñHU%Å`h™ ¬ cˆYAFEÄf‡mˆÀx2á° ªY´pRÔ¾4¾4’(»·þ IDATÊT+R¦¸ÃÍBO‰²t!ÒÏLÕÆÂîàA¼¤~-‹Å¢?Ê®ïïŸêÃbÐío¯¾íìLžõ/úüCRí0µ3N¼Áp˜íÎöé`>+*ÂÄÚ_ý³?þG¯ù®pÌöyC0‡ÚÒü'FÂÝ;r€™Yšìô.°´t—è{#4ÅßœóÕnx«åêžèpìëC[¨ÃQCG! æè4„Ä‹^6?¿r3pØ0œlOp÷Ý¿õÐý/ööæÅ­ã•ñtÿ‹†NØ/=2yÍ·~ä#ÿÎd ¬LWÓ•Á‹¿9dsÔ¡€É4žÜ¤xÚpø2Š_@щì"î`B¤Þ‹†àKª Ç$ýØÐˆˆ(äV'AMˆp‹Î|mOîGËkÈÝ ÇMîCÃÑ£)AE=`4Òq´uÑm#¼ëP'9àd/Ô.ŸÜ½†öã K/7NmX7äÈPUuGbÀúÄÅ˧ÎlîîOFkÃÙÞ6Ãb>O{IUÔeY’ºwýð;±µ³÷È#7Sra¶=¯²âòÖ5kíwÞyñò¥ÑhÐ*tzU _Q{åªp*Ná‰xç\Öž8} D·?ûÎi^>ë…/.ÖS)†ª¢Z̧Iš¾úu¯1%¢ WʺDšjšN«¼®çIb­Gžç»»»×®o]¿~}wwwž/꺶&m×ÙVÝSUú¶ï½ˆ8ñêù–îh Q›¥ÜÞýðÂKÍÌhw –$!ölè`px&ÉÑ‚0i€†ˆµ "ò¬–š&Á1ɉˆ($®³áÔZf6?½j8D{ïÅ{çœ:/"Ûå<È%†Ã6Ø¢Y]€²ª µw¡Üoݯ©.F÷25ªFè–y0AÁ ×€«ª¢£®Õ.Í}_N€ð(¨êvN¸^ƒ›7··'§Ò‘+Ý|¥7{âÑ{6oÚñ?xàcWXె¤Ö²t˜Ìr6TÖå .ÊbÁú°ÌŽ> úFÎ9<Ýܨ¸†ŽéOzu½ä§À_Ãøª‹Ò±ûBâîºôu¿Â¯6ªŽü¡?|äõ¯½ z¶˜]*ÜÉ·¾éwºÿ&à逸lÇv>½ œÌú/zð¡ü¯þ£÷ÿÉwÜy³b¼‡rí“.fù_¯‡y!`rð\7O;f'™±ÞœXÔ5¼$l+©1¤¢ …GcXu M’©úÚ‹°)©:aøPùõ€W aÞPÈBŠ¡½aÈj„ÑÐ~ܸÕéWBÐT¿%Y¯Y­$vQ$”t{É…‰ÈÕ…a «OX+YD •’KÙ7mÕAék(7b6¤¤°H!fÃ" Ø,“Š0SB$Ü$»ªª¼Š_“&Ì1 b*«½÷•¨8‡xSÔ G$!Ϲýàæ:ç|]giÊ¢EU'–gù‚™{Öj0›,~øíï( 7®ÌæûÀga¬züÒþô©éþC[»Øé¹•¢^S:°l’+{{éÊZÍÜÈÕNká$E/©EgeÁ«¦ØÞ_¡ÁZ6š”õë|<Þ•·?}×K_òüS:eÎO‰‘™ªö=Vïk¢’Inºí,‹W'•s%ÔSj‘W{ÓÝíýýýG~(ÏóE‘{•$IØÚ¤ßã46­"%ÕÀj蹪J Ö¢©ïD¨¬éÄÝ5HK¶Ù,æz„¸e"ö]«†.‰~v‰ˆîíš¶«¯ÚýëÆ-cæ^gÿpêðT-…ŠvFHs RAÊ}fN؆ˆNi!¢µy®ªâ¼sΕUUUe]‹÷é  ´Èå  ç¼zQ›@5ñ‰mm;q¥÷®+ÕuZú¬®ÇžV”ûJ)xâ O^ ®M¬HQÕLkõ ÏÆ0+‰—ÚKéÒy¬˜—i/©PR³ ׯ¾4;á\• ûµ–{=^ó‚Q/^òrFˆâHßÿñ÷ÿË—üÀºMVêºÒÚ1—†ëÚ'ÆP£%U%qªªd¼÷†ˆAƘ ùY×uˆ‡;¢ƒ…”í>¾aJÚU%Ì+îìÓ}—TÚjѽc /sSTHèteA»V]÷PÖZ¤ÐŽ[í¾ö¡°ÈCÉÎX3rk„]å’(¬‚§”ƒ PõO~ãRÿÜÆÛä¦ÏÞ7ù_ûÂ_Ýw0ì ¯¹iµH«È*n— úùÏ?÷m÷þå/þýç=÷®ß{ß—ÿÇÿõó sH/ÛêO"©ànµ²zÔsîÍ$¨Ÿ~üTÆi X~)fB3!›-YØF –Š£±!R3ϸõ}ÃJÍ*CE 1]4ŽLÍÊÕªÊ+ä h*ŠMÔö"$¬I›Rýp€ˆÐ†Ã>€Q¥@‡ª¥à® ±„Ö„í7Ó5®¥ñôà@¢ˆ–¾Eë×j§¢F)Ùý³ã[kCteee±X„‡³Ù ”¼åÍ?0 ¸é|–$ TU-Þ@ý{~ú§¯ßÿå‘èê + .kŸQ&æ §lacnЬ*,›^¿ß_Mó¢Ú›N=qoÐßÙÙÛX9IN€=±êŠÅÚéÓ¯í«¾é%/7Ö:EQžØ¦ÌÖXËÓý}"bcl’0)U®ª¾öÊ4N·¶¶¯_¿¾³½7™L¦ÓiQ”ë'V„ÁÖF ‡¤tÆëºÑ´<èXP'»•ÚHgó7Ž[þ‚ëÙ#b3³ª¶´6:€ªÍ‡î~˃Þ>Ø)î„X‡öOÑ0Ñpì03÷Ò>BÞ¯—X‡æ½ˆ\¾rEDœªccMb)%­½ÔÞAT…Ad8IBI²P’jâ´rEå|YOªš¼›>ÀH0•¹´ô#9¬44É>'²‰œ\?õÑé•öÒ{ïýë¤ÃlPÙ=”7òW§x÷ç?ø»Þ|y@ý’h˜í^¸|ûíwLö®·÷«y¡è(|!žý€ïH»ÜNŠ#Ç9æ÷’‘zjãØ¿ªŒãf 5Up7Øùä ‡”(ïãÊì€j@bëü…ÿý/\úÕÿúU]ç,ÎyP1¿nû7Gò4\(xöÙ¿~èoþbU~S…;zƒa±x”톀¡ˆ:£2€dM¹ãiÀ]9Vî°%¨±8%ÔQ“ÝÂLE¡·­\b”•D#6kCÚ¨<ÞÕFÏœ?û}¯yÕ­Ï{®³\Ô ç™9ôŒHUW¾ÌN=ç\Uäu]û²’¢¨óÂUõ—øòtžO&“Ùb^;[Û'…ó Ò$ n¬%‰Åá‡'dwÍÕNÐ!ÞàÎÄ^îF‡%ão „º{,£Àív"2&¡†$ïÀ1“R÷8íkCú}(1˜ƒ+L¦àÀ`›æø™‰ _$‚šuæÌ骪ò<_,‹Å¢Ê‹Y¾pέ¬¬¨a–„D! Ê9q^,Bƒ³:1©ak™RVIleHa=lP»$ØPÚÏ‘ 6Ü@{¥CV£k$£Ÿ›íÜ5>)ùôý¯~ë›ÿü_­Áì úÈa›Móê>ñ{¿ý-?pe#OÏzÁs.~þþ‰U K‰ƒ˜Û!ö€vЉ;,È¡3,pœÖyËáÏÒ>Èí‹CÇïα¯:ŽÎÕîao À_ס òªácz‚ƒC=¨—€ô C¢¹ó§ÉßΨ]M®03¨§"|(×5»ÀrÓÀlìÏk Àfû¨gðg90…!U¤ð=hú à £é8‡ƒ^/ZÖ.$Ÿ„©¯À˜ˆDCÒJøßRûDª=”•ÂBààåÆzÃYŠ©OH«Á{QhL £eבOˆ%¢P¼)!#†Añà &3Wì‰-jèm_¹úÞ—Þó£_þMý²›öÄõ³¾ýOþâ÷ýµo}ÜÍû·™?1©r_Ii-OwökÉ0Ø2[ebŠ’qÒKú¾(=§f<^­‰¦‹ù+¿û»_þÚ×öÏœzb²]û YVä1g½¾s®( ïª~š¥iš‹Ýíí+ÓíÝëÛ—.\¾~åj13(KÓñú ïk["Gê¼uU”uåjÓ³!ÜÚR¥šÏØ®ŒË~”]LuÒ|Ùá¦4·&¤t¡4Þ²7þŠ@k–n©¦„¹1ìb‹­f^Q´c"¸ sOs;-w¸É9`˜—ˆÝ¾×BOÝÐò€U‘“á$K{ƒþ˜ù¤H §w÷®çy>LÓY½¨JïBÈh”õÅyϕԬâ¥/¢.#ò°–ÓZKFæ‘(,Ð2 Ôx‚’W If„Ày¡™µíË|­wŠèâãOÌÖ’çß~çÊÅɉiµHûeG!ôÀúclae°ë®Œñkþà/¾âžþùõù×±Úï>Ÿo,ƒL “|h "ÿQ}òÑ>‰8‚©8âwŸâ'?à“oüFa°2ÀAèJ!@$¬S¥` $ t-€,Ã¥T^¯Äé°Ÿœ®JS» °S;å-@Ú¿­Ê}í°H2*œÀ÷“äl­Ÿ„_zŒÃfàmܨ/ðÓ€ÛpC× Äqó@U=Ôªª4êQl[u2T•™bŠ`–Ø(&jË T£eóTp¸3DÌ °Š,*"Zw ˆˆ¢î2s³àNT̉1`uvŽ i\ê4h-H’¬×ëY“‘›¡ôN\-PÒèf[P 䇀e–y‰²xA›C™ºœ 5™ ­óJÍ !"$*ˆ¶•GbpKeonnîîîÑþþ~¯7X,òé4‡bue}o ²ØßÝ5`¿(~ñgþÎôÏd³½Ç½¼žè`ûùW/]µƒ>³ekÛªR&R‹towš GçÏîÌó ³éK_õê7ÿÇo÷+£iY^+¦vec&³yíýh0ÜŸîõûý^?],ÜÎdo:^¹råÊ•k®<Q£lÙ¬­­äœsÞWªçw´D8ÉRÛÏʺÍ©ÂWÆŠ %åŽá,¬-=Cè“|ãB˜á‘„lÿ«ÑVC“„ÕîÉ/60+èvñ÷€ GÉîö ´ #ä™Ù†y­ÙÚfùŽ8úÃ4Ì1¨‘IRàü¹»Ê²œÏóÙdº··¿·³;™Ló<Ÿå3Ue1¬21Ã3©–,,ê=”Uœ©œ&*,p*=CâG ê¡qégNU«z6ÍÒÍõ“ó}ñs_¬Ÿqþ·Ÿÿ½?øÅÿ³¼aŒM:%7œâ=ǧNÎ/mcm”ªožƒ¦=CsŠvK¸½‡Ð«û {¾M)ú£íÆeÎÿöï̸Ú‘G/£9þŸ;^ç_]ôoüú†€CžYlh怒èß1ž©ú Õ’¤(E™Ÿ2\šá^UM¥šÌ« P Mš à Ö*ÿ%«½d%_ìæ¹Àí×ëê¤[@JšjÅE‡@Û7ÊÀÂÓ€©qyq Z2„<C9ÈÆ$,¢9bc` iI“° õ”®Sˆ“¼õW%£âˆ@]ÓªÁ1eÃÖ2³ª®‰ˆxñ¹ˆà`ì™(}¨21©Hì9§£D`ˉ%"õpµwDÄlÊÌ¡Y“ ÎbA¨uf‘Jp $xþÚÄ|¥£z(ñCãDEbA5‚Ʋĺé$aÑ‘#„qáÂ…S§N™²¨“$¹çžï²†ÈdÊ&ÉY™Ï³4AéåçÿÛÇ|d½Ü>·>ÞÝc"©];³ùØ¥ÇO ÖÄ$!H• ðÜÔ1§½›Ö'ùâñýÉ ¾íÛ~òÞ·Œn½ùúõëóz^ûz0VU}íÚµµõ“çÏž¸v}{8ìÕu5™L/]º|á‰K×w¶Ë²‘«kR»ºt¨½wR©¯Ôâ)3ªêÎ9Rf޲4ö¯4aŠfG3ý¾ú&"K¬ÕîüEa󣌃ÜRÐA;ô(“.]Ú.Ђƒt`ž6Ýý;Üîo–è ¨±¶“ÐÅÌÁߥË'“Æ„Ä1b!ã%³1¾®òYbÌ©õµÓ'7êÚíÏûû³Å¢xüч겪óBÊÚ{1JÆ$L„¼"BcÈ’WO ‰'µmˆÚ$n÷ÃøÐ7žw§Çü¼ûÈ]Ït^oœþåç¾ü=_ø«coŸz7õîÄpe7Ÿ¢ìÍüÞÜý®‡u÷¬, ÐöV£íXu¥‹Ž½Â#‡m½[=ÀínÇä(ô5GŽ·]¬m÷9„ÓO2á¿¶A’ê•„–Ùü{ì¿•’Ûl0œá}¡E5߃æ€aã¬)÷fÚˆE+È-[8$ÛZ_Ék*‘^?I27\ ¢¾Pïñ„§O@%K_¨8ö:ŸŽü7âМSniÀîüŒ™Vt£[Ý’† ô 9Ê­•«–? h/!9ªªµ,%Ùº«¡1&Tx…„ä ˆ@˜5dƒ*ÊLð>.¹ä §D(뺬ëÒ•Ì6 uÍÖ˜ÔH©Jê52ñ¦ý¤íÃé;úV­«*e4™ð­eÛ°vÜåè%I„VÕ,˦Óé|ž¯®¬¿êUwCá\ÐL²ÎWùlÀ¹:ï^¹†Rl5ÝÙݦªÒ,™–¥GZUAÞQD”HÞ Qž{?/óg½ø…¯¹çžµ»ž»põc“m÷+¿0ýÁÞ|nÀ·œ;;›ç=öX¿ßð¡.]ºtéòÕ²t¢ä•lÚëõÕôª¯V¡m"N|* ÒÝrÏ1ưI¨Öº®Ëʉ+É„ôP¨— í`ÃåI'jÛé¶ôƒízÀÝÑÍNF‡‚î¢&:®jà2Û×Úñ˜»û€82ÕÌÉf¯Ìdº”m 7ÚÑ­÷lˆ½ÏZ›ˆË¬ZÜPÂÆEU÷{ªäEE=3ÇãÁhì7Ÿœìîm]º²}yk±·_•µ…Kˆ3¢ØË„°{õ¤*9j;&1ª^LJÇø‰ÍX¯ä¢)nu÷÷ç[ÌOœxL÷î•÷Üè ¨±3Û°åËÔá ú­?½û9&Ý•a¹¼HãFÃÕEÙcgËQÕƒü±({ìöCoqôFGèî$‹…Ywè]‡øëÝñ…H ú¤PÊz'° ÄÄSš‡½ëAW˜7 ¢~>[, 8,§ƒŒ¥€ú`w0’¢(Äe…óu¾n0ðò`Ukà"èsÀ5XlVxìØë{Ú0'+œf™5~Qª³ÂýЧÖ Q6"¤dÁ^”• ¦V¤Î;‚fPÆðâ÷H¸§¾„8ò* 2Ê*T5tEGlîâã‘€@¶ÕÖj4(¬ñà §à‰jÕ¨Éç"ÆZkRc0+ÃØÆÞéL’çÔ[¥±íI䇙ˆÀ‘t k¬µÖÒ4UK“j^–eYKN6'+N3CƒÁÈ3U+ÆXC$Î1à™44të™J5MôFŽm±‰ˆK†*ʆØBb,K]Ù4…10PUïáœÔµ§}=ÅŽ4ê…¼$vPæSï‘ØTØUUå]ÅÌãñèÚµíñhý;¿ãMP ƒÐžOLa P8 ÍêÙ·¿ñ§Qôÿ‹9å7õVM^çÓÙé³—¦Z[+Ez®tÃ^ÝO*U[éZ6²°‹Åbü’—½ü•¯ºãe/E¯·˜ÏjÑõ«}G½”˜Ñ[©½›;,*ÿèƒ~ñ _(ƒ»ÊÖöŒ÷žUºª÷ó*÷*•’ÄC<2¶"âʪ1D˜”°ŠC“ä›Y1Èî¬@â%pFÏ…‚5„2ZdõQÃ<€hHKŒNf2ÚN ̾Ó\¶ùWÀQs,ûFSú~{C!PC±SÈM 6©]z·D­XÈ-•³¬‰CÕ·>7–f(1÷иƒ`"&2€× `Ã`ˆZõ GêÓº·¶¶y~¼ážé¦ÓéåkW/\¸pýúõ‘õlÖïeÆI=Ÿ{ÍÉ袲3ïJ×K)(÷äÕ2Lmz+¶?ƒ®¥½™)«ÓÈ´þÃÏxÕ[þó5ƒ9ê$Gµ7‚!B¨µ&p÷GÞ÷ÙW¾éâeß{kãIõø:ҺꋛpF!&V1•+† ¦“Ç nŽxÓ…9U %Óˆ}ئ¦'+9„°¨V < ÅX“½pÓŸ8ÞF]G2É ‡È[ë–46"9,Û˜"è°Š‘¬)†*3Ã{ñž‘üqYˆàÚTЦ†¨„‚è/™ÎCof½ Ø Œ*y8„ñZM|+ëá~ØñðšXt’«Â÷þÿ²÷¦±¶d×yØ·ÖÞUu†{î½oìnöÀf“æ ‰’¢D’£Ñ’b’25™”Dj0(JÇPd‰¬È0 ÄHò'ŽaHþX Ä `8Žg‚lj¬XMZ"›)v¿î7ÜñÜsNUí½Öʽ«Ná>6% ˆø¼ñp_:Uujص¾5~Ëë+  8‡;S\  î:%î‰`ç\Y–Ú$ÇŽsɳ¤}Ä&y6|ö4HÀØðõÁ·Í|B$ñ70vûõ½ÏG ÈN§µ˜íMIíÄíÀ.ɃÃÔÔ ñö®ë?œbÏDªäJb1eATqÁ‰Æ¦iœsäØùB´mc ¦FÞ{N!ãTÔdël¬þô:¿ ËD†]˵_ÃÝ{®;CLû·NUÛ¶©ëz4‰Äû^饗>¼¿Z­îÝ;»{÷éÅÕrµjʲlšFD&“‘+i~±šÌ/ä'>ø[!üÎ'ÿ鳓*ÖíÕüb »ý¦»/?xõèé§fÓÉbuaÇU£ZnM…ôÞ£³¿ú+>øÃ¼ó5߀ƒtQ_]ÆZDˆÈ{ß4í«¯¾úéOæôÑIIþé§Ÿ~íâÔÌÝýrû?Q¨²jbº†™IWÜÜl¦·ô¥¾AÂ&sÊÁf2¦” ÞÃ,cÝÿ\?vvw9Ç€Ý:gÊåð­ãÎÎË)ó>íË}q²t;`î.p8†*‚ë|ÚÙ=Ë€1›jf¢FdÎ&.Æ.üQá‹QuëøÆb±¸xðÚù£³‹GM¬§EU«²`“9’Š4¢%¸ò€ª1[NéGªw°®^oëÁˆ(ÿò7¿çg~íWfn<·æ%>þüdîΛkrqð«ößpw¯Æ«Ñùâ_ܶw¸£/ ðUä‘Ö¤]f9¯‘SϤô›ñÒeênÈœÇO¶ë†ÙFk„]³›äÙ‰Á<ï‹8h¶NjW7ÑûÒ~o§úƇIa0Åð}ø_u\$±Ú¿=ö0üvÖzQ^` ¬@u':¯=Ÿ'€Ë²œN§!.‘+ˆ™J•Æ ·}5ìZ®Yç}MŒÄ=5#¥‚…ÔUW3Ä& ÖÔUϬïnØ;¢A‡fÝ–RŒX%32rÑäü—Ä‚lDœj“Ì,¡@€ÑºVãœÒˈ51:g¤YnbHj‡™ÅCÕq1ª&ÄFD&ÑHTÍ”˜ºkTä9ó fQ×ýe£jTM ýÕw󢑈HWœÖÏç—ÇÇÇ‹Å<„ð /¼üòËDtëÖ­ÃÃã¦ï{ß{R»…¢pD´\Ön 0æ«%àW:¹® IDATÞq4›â7ÇU½xx@…™,¥vR’éÉk¯<÷Ù‹ÒéªöV4—áèÆíþð¾ý½l9«š`ŽaÞ WEɹ÷³j½jÿùÇóÓ/¶a:ݼyóâìâÕ{÷ŠÃiºœžÅ:] iÎgUƒŠ™ˆDú `öEâôö{¦Î‰×ƒ%öapN’D&SÓÉ6@ë•[è;Úýû8-{î{åa.û–3¯··¼ˆˆ¼§,jøÑu³ ¼OyßÖå8#3K½ˆc Z©MªÑáô mÛùÁäüøììðäêô²¹Z.ÃÊÞû¢;Ò¶YEõ 缇I=“"·Ìé}Á×Xð;cõU-þyqu Õgã)*_^ÏLø—þ÷_ý/ßÿã/-­~~â.O^W«.Ãèö­°ZkNC"ìIí»hS½öÁäpaˆ‚»“mwlíþ˜ÑO¼­{[bxLë:µØ`eòé|ÉäÔ_â 'f]Oæ5%(î2|-xò޵Ÿ[_BNØ*ȨٻýÀã²:>Ÿ?|øà“¿õi#TUUUU]7«Õ D·îÞ9™_ÄÛ¶ÝRÞY©IÒiL "ªJ(6-àu^ëãÇ–I±…¯ù˜…l—7ODƒ¾ÜS_õ¦dÿïs5ï"ß’·¶qÎ1¨ÝìUfÇÌR0-àA%RÚ=›é]’WrAï!úè.p €c ãˆa6gÆ0‘sDŽS¤# ¥@Dt|ûÖÁáÑíÛw.OÎÎ<:t²º¼jBSãÒ£­ÛZ¬$c#0e ZSz¸ëÛÐ÷ë¤.üž,òùÙÙ[ŸýO¾æ{~üchPâ6Q{ÝsoŽöïýíÿú;¨ŽW§ó×nŒZý“³ã@ÇÙ3œ½÷,3ßÙN$x/j„ÐÁÔŒ÷ý\½fGÊÉÜïµóÀóû‡ïÅ`¶ÿÁ¬É™HVAGŒ (§xeïætÍùÐ 9f8d3ã¹s\^;ž<ž·n]\.}ûJšÓÓóã£[³goáìü©Ù |ãæ·ÿÀûßñÇ¿EC W-W³ñh>_\¼ôÜ =ú§ÿ÷ÿóÚk¯M&“r<2Õ¶‰mÛš¡ªª¦iO/ÎC¶x£u„>ù2s~{n+ÙOÁtØ®ëØ;?cÚV‡ßQ¹G&ì`¥!¸æ- Ô')ç#SGpÖ×]®[œ¾u]p?ŠÞÿœK{óa©w1åðúLèO×[äéz¹÷N%iÞU*§Õ”5y«JD\xr50ƒ‰ Odäê¨rìoÞºsûþk¯ŸIˆ äùN…‘”ÝÎâ6¥á¿äzÚàa ›1ï¶m˲$"ÎŽ?ö±½ó_ñÉOþÖbÑÞ¥FóùÜ97.çWw<šÍëó/8߬΂œŸœèó·ŸaiÊIyÿôá[w.N/+y–·Þú¶w¼ý¿ñûß‹¯~»@Í9 Ö.šWžœ><>:?=½uç©·¾õççç+Yzï ¥Ð¶¢˜¶!´ûèoÿ7™øj¦’ÒÝa0†y¼×›Ò_TÓʬ´fšƒ ®`tD0mðÛ¶­Þ½Ì›cw{¦µÛ™‡1`Þ^¼³€;”ݰԷ]–L~Ì>y”g¹¯L©,MD,Šš WðȪÕbÉeQX Æ<Åá]ÇÓ£ãŸýl ë;vF±ÕºT)˜Ä¸ràˆ%Õ&&Þœ¹a ¢ËG§vãfu¾|á |~‰yá$È|~yâM/¼^¶òʬzëúWÔÖ‡£³U›æ õ“)aS…¶4ùÎQ=þ¿U®BQ .ö>ôŒ'§ñ/þò/þ÷ßûï|âþ¾áøÎ«ç¨,ûÙ’‘3Åw2{¼!7ßsÌëÀõ0 7Î;ïÑ9öh!½“yàëê¿%¢Ä\DÈK²3þ À5p °ie3Ÿƒ ¼ß3Á_â)™•™¡ÈûK¦õ× ùÀÎÛx\••w.y„#À”´–{´_‘Tꢹ"©07ô4n–‘¤à2¥>£éÈLŒ5;Tï~ÖN°}˜ÈM{·xØ9{tÈ!½3)0ÆD"ÚcADˆ-Æxyy9ŸÏS,³¿ç|4%q]Ïl]˜E#8€µ»'f¡L¬¦©œ&š,±õöoxŸ0<cí ;aØÃ‡gGGGuÝVUƒ¹¯ÿúoJÏA5”¥3XÝÔ€…#¶VeL\ÎWc¥šCqP¼þèáÑS§ÍëÞžzê©Åå":{þmïøÀÏüøšw]8û1iÔËÅÈÍòµùÙ«Wgÿͽù¹çÿÈ»Þ>?Ÿß{t"f~vpU¯˜YD ÆÎ­V«óË‹F¤U«Å’´_Ià2sê”›nFf#XÊ-ˆè;èàöÆGE<È;íû“°x€™¸ëˆÐUÜv’Ëúßf#ïZº»ë¹ÃNN›ÂÊDœS¯ÀÌ®³€]rF×=)Ÿd÷»ýI^wÈÖ €Ô3ÊLkd€ 1F5#¢¢(‚Љ¨ˆ™ù²Ôض1ãéÑ!‚Í/—ËËã›7®V+]¬ÄJï’Ym¶äØÏF1ضõ(êl¸GÖÜ–bõÒñçNÞôÌ­7Ÿ5n¡×eA·G®Z€ûàÿð·~á{>òÊùÉÝ££“¦±¨rš²cÓ,§€YŸ¤E{qx߸w7.9ÌLÃ5×öñltI;Nï^Ž`f|Ë÷_ÒÔ?š"qž@î'1]“lui97]0€áõBÈ¿à4<µDa:ÇÓ«y˜Lçó“ÂC(8å½ •DrÁ®óH­‚-’¢4åF2 ž‚‚³N0£Îcc]á/€¯U³T[g 5xˆœ7&¦"”ØHI•TÌ,%˜Ù;çœw¥2‹Cª.a §” øÒ«šF¡( ç\Û„zq2¯/›¦‰ÖˆE1ƒsáɳ/œŠ:çÊ$Pé=™.-”LÉÇBh­!xu`qb’´u”Ô_¢Æ$0S*ŠäD4ÅV´8éÈ@UN›&zuu1›^ÍëƒéäêªF¡#?‹«è«jCX€ìðçôÇâ½Ïx}%蹋‘tâFÖ¸ /U3¯GîàðMÏÜñýúGâ wEVc­¼"ŠUuryy~rzqqÑÖõ7~õ×­š0Ÿ/–Mm¤¡mVM«!4«%Dƒ„e-1F0QÔúê ]aÕ–¯æs±ˆ)Ò…¥šçuØ"7NICÏÛZä9¤\?€)2ÔÒ¤QëÑ®×o†HÜ¡ZWƒÔ”ƒ<âeªÒ5Fo€imÑî·†“­šx¯z4õÌÉ¡3D÷nÇý@žÈŽ·.Šˆé*:îjî¾;rJ¦àNSv«"—XJÙÁÔëË`b%Ž U]QMU9"*$„&6~ä§·gS¯ŽpÕ6mœ—âg¾Ô²X„EéŠh>¨'6*”½³—Q˜KÕÿ¦f‡ÑãÀûE«¥»µÿøëßÿ~ízp$ÕÜH1ŽOW++çÂZb†˜£Å ÄŸåñ=^‚•ã3ǺAÛ:G±âÇñÊÉ¥[2“„ljCÎðt£’nÍÝêûõš%5¾+è2K¤AFÒÇ8D0Îô´ÝœLžÕ@‰;'ßPÚb›²Ù]žÿ9-²ÂÕ'g 27“ÃÌ×Oƒ¶¬ì.Iê:ÅèzWÕþÖ|Š„Þ™ú˜‹xâØ9W°+ËrTVΑ©¹¬¶îÜèÍ|6ëjÕ Û)¬)ã&y¡95Ã:'«·a· Ýz£]æ€Ü¯—ÐçbË M¹÷Q’µà„ÖD©Û*’fN0Jb;ˆ±Q2ŽD›&´m%ŠˆDÓž²!—<yïÇÕØ³+½MB€DÅÚæKäÒÑÖÞ€þ<‰¨òbÓVæ¬ýϪê½?;?)K||ãôôü»ß÷Æãé*.êÕêxt$póÅΕá§–?ÿ)nj D¡”<ûbpäÞù®¯üÄ¿øt¬Æwo/%øÃ?™¦ŒóÕrùèÑ£G…î>óôëî7M¨ëzÕÔMÒßä*H8+’ÄT»âåÍp^³NŠx,ö ÚuG¼v)›”·8µ¡¡!Øï¾…ây³‡¸ß‘™ï€ŒÁŒîqÛÕŒáq†Ü—õì˜×Ô•CNåF[I¼{]Ã+0°–{„á§õ=Do»#`Ã:ìhØ™¡ÊÌÆ5÷EQŒ&ã8·X$VÇl¹ HÖëaÓ#”£*Ö-‹ÄÕäÛž}Ûß{õe)´Ò,VİxofŽIjY<9Ì#?ûK¿ðWÞ÷Á§kö7Ç'gg1Æ›ÓÙ¤:X-õ|éGåÐâ´¬¸nl}»žŸ=þõ7j{{ëï*6'ícŽ?¼4xë_Ùw"ÚÈ/÷ñ$°÷<žTÓƒª(]l…¹W[rf’ºž‘bæ’æMHuÀ}¦U¿hy²ÌVJÍIÉÁë3I‰aÄPˆ&ÈÁéæ»úŸä~Nr6;“KÝy9a¸NNqŸ¦0%äR ±6„eS×u­,1XTÓRNlDΗ¥ !”eyx8›Ž'…sóùÅr¹¼:;iêPŽš&ɤ¸¿c×pQ6 ¯È¸kkô罈Åtµj¾û} Âǧ§çA¯ê¹@áÅ­£'¯¾úÌrîê¥ ­‹QŒÌXÉàL8|üš!Ц¿©˜8Y²œ]úD›ÉP6ˆšñ5AÑ­®©ýNNt/Èu(ŽÁë€ëAýËi:ÒéìM_ñ.<÷ ¦“e½üÜ'^¾sçλßýîhzÿäÑ^}%ŠŒ'“Ó‡WMMhcŒA¢ˆDÕ £æz£dþÊFîØžÑ§ÈlðÖØ=Cû ýÍY©*½3É@›ÙÎýö}Ô¶ÿ6×Ñæî”ëxêã¸GVÞ¶€÷g>Ã!ùœSíoÀp›eÁ›Ü\­o 1Ðú+Bß>Ñú[×A¥×9¥N²÷ò=ï·ál¢sBb#¢®cáÃx:.§¼¼°Hf.XVTh£ÒåÕ¤ø™0œ8°íFåx°óU…&´§çï¸ý–{éë~ý³¿qt÷©Óe³X,«b$¡.™Z³‘¹…Òüòò¨ÛÏL?óÚâäM·¦Ÿ»8MK¦ózÑ„XLfU1¦`ASa#òEöH×g÷mͽtªÖ-[—dŠÍûß™ÄÛ/;Þ@&Ç\ª [;|‰`‰.~} Ê.Æe¹‚FÕáÁØ9#Jò€a\=ã©­‰ØS6õ¼ž¦É/-0£döBÅ J–£ g,l”{.`­æP€Sc`K=zS’Wš¹)öB$P"8òÄLÞ‘÷pD®( cdÛZÉ ¸ÜÏXÔcg· Á(*³‚:ïŸw€E•¸\Jl/‰b³X,Œ e%È.¹Ü73/°ëHøb|||¼X,Dä=ïùÞ[7oœœœFåééiQùГéÑrQ¹jâòþgë¥+gê… ;8fOç§ozê¹O½öúúßügxË›/OOµ©œž¼ãïÓUÛ´!QQW‹ÅÃÓm›ä‚®›¦mcÕtj[a™¯+|iƒÛ}sl]æµsoŸÛy€IþÓ ´i4÷â8ª0æÔëD`&çRrp}2¥ûÇ b£ÜÐÒò2¹­’ß®®×˜çqNi&G„ÍÊàë˜4Öds4p­¸ÿ \’[›t[wûšg‘¼7‰\(Sº‚ÙZeïܸ(F•_lA<¯*ž6 ;RYg³¦÷wøCùåUfb£¢lcUEÖGçô™žûOž>¸Ä²LÄ€#†ÉÄÍ…w·nÑÅ9^[xOúïü­ÿõO|¤=?«—õ¬òãÙ¨Q\ÕM Ç.…*0øÅõr? ·f:{ºD¡Z3´M·Øø1³;è¾ûÕÎÌßÐÚûmR?¿ж‘¡ÍŒêãqe?ù¡}Öé¼>·P“¥¶?Ì–:Ê;}îÅ·\JxóW½ wïÌÞ;;½ûÌÓoÛ;p‹‹‹óùåb±X5uŒÑ/B1&×sèȹ6Œû&IeöX ø‹Åá¶$Ô}‡ªã'èØý{ ó–ÓA:×ñ:»iæ}‡æ)ïïzäØmY愻¬æžüÙ³3Þ¦æè~b}>Öõ^“„µ-¯¿˜(<…†?é-K™pé ÍÎ$M/l÷¯³™YÈ̬tåt4^U1Zt†ÒÕfpBEw^ŠŽõuóù¦ÿi¼wÎçççÅááÑí›W§§³éäÏý[ïÿ/~õï£ñ…Y]7S.‚4 \ZíM•ùìâ>fÀlzóÞêäó³§‹âÙ£[\XCI¸»‡Jí«,Ú½Ÿ¶éÞPäzÖ$®2åûÖÞšðDŒ}ÃLÒ}MŸÐÅú'Ö_ÁîsÏß~Y£ðÀfÆDeé&ãÊD¦©KõîsÎüŠÔ™Æ’á2{{ºnƒyÏô—ˆŒRQ2(wß[¶Qþ˜EÄÓ›ó·X{ów½ef`&öŽœweáË* Gß½B¤d¤” MCv4Q°–:Š„˜²ŸÅ˵˜…¯Š¢pž˜YLÓ4Ø‘sÎ1—£QQ˜|§3l„v¬ó6§°.öÅ€s낞 º+CZ\-bÀG?úo›‘ˆM§³Åb^U…*°žœ<¸QÞôu{öðóþô ÊUxNôdš²iîŸøÛ·ÿìô³÷>ÔÙá;¿òÝââJ<¯V«ùrQ×u!¶!†Ð6Msä7äVù¬B»è+bjZ…Џ°i^ÐfzK¿ÁÖÇ!£‹±åÖôpÌLp  : êÿ?öé,êÐreç\Šl¤Mºë,å!dvx½NfæAdWeEë$,btY^›è»à-‚{ÓgóÛ­wö°m‚ÐpõÆfffSóŒ.|@†‚¸1sÎÇcŒ›ù*4QÌ»º ¨ÜΑ¬M·áÈLíÈU*±(Šel§ãIð´ ÍKuõ<ðñÕ ¯f.5ˆ¥àM³ß={¦Ã[OÝxŽÿÆoþ£ïÇ¿vãé7óÕ¢¶qQV#§ˆi^¦™6ààcï¶f]¾û¶}¶çL@ïíϱ-îÒ–ýœïÿò5õCû‘~³£ëÖØzú_Þã‰àôt½§²,˜™’Ü!RJeÁ¶5ḋJ =ª}ý_ªÍNGvÞL(ìÂŒ ÚCyzM(Û‹dâ—!#‘d£8u>ÊÈ’Áç)ç45oóžS¶ªJÆFFÌJj'Ú²åŠøhÚJÌiE"bUm:š÷^54!„R¯âÄDm™Úб)AÌ ¶ØPl`ëfÂðÐ|èCªk#PU‹EUUMÓ¤ xÇþá*–íZ¢=“2íFÙY‘I>ï¼éùÕh‚ª8ăƒ J!ørt±8oêº!ªÄ›¦©—«f¹j¤i›Ø4MÚµ!†LneŠá%¿‚aòï¯f«b/úîŠØ4Pˆ,·–ë«x‰PÚHÖ¥}£?TÚyœ+v;œ6O Í{bÀp›»÷m£sÄ)›ºË©fvÌùÜtxžÈâ~{(I{ã²x 0À†Ý e6ª™ÉÚÿ3óðÁ#*ËRÊÒ‘‡™0Ï Ïð;O5CÖðqˆµ ³Ù჋ ¡¥›L¼÷ãGçý®ïù‹ÿËß_0òíªõ©Jv† ˜?z8Þ^½¸_NÆ‡ËøëË3úÔÿ{܆ýæ­ÑttÙ®ÐÈ¡›†NA²5Ÿ´u¾&5{k*®]gúoÝíÁMK±^Ú=È›êÖñ“ô [?´5+žœñİy5Œ¼«¼Þ>_ö­©³Z’ìÃÆÐÜYÛ–Hœ³¹™|­ÑT)“_J'òa$èߢuLw ñr†RXbÃÆôw²7 ·š‹Èd2išf¹\ŽF#ÇÅùù¹sÅ>ðÅb1™LÒqF£3‹ˆ/«vÕLgî/.Ï`ѳihÛ¶mcðe1;8•U½\ÍŽÊQ5¾}|óé§nÝžÎfíjeª±iæóy²ûÛnôuG½¼+=êRŸ7Ïyx3zAƒM`BéîÄØºQ» ½e8ö¨ö“—7«}†ÃûÔO£(Š´ÐÏ™þãpýÖWopô§±÷«M;¸¿nxO®3‰¶îdo·¾êß3K³Úl]€nÃrí]6¾M{xJénwÈqd´lu×ÐtÖä*;”ž>þëôO¶%ØÀ­jÖlR Ç-?•V¿÷ÿø…·Ë õÃJ/ßrtxYïZv½:ä¡ÎØÇê`oÝ·­ÈË×m¼õ ßø¿<ÆgCÍPålz0¯.¦Jä‰sþ2iÒÁ$K^K㜩j[b=¡”’mÀ]®ý»šë™€äsîpVMAéåï*wH•T»&€’·(ŠbT9çX…TS³&P¦2ÅÌH4ÆBh46£DÍÑLó)›•ˆTÉ<,óÜ8Ñ'šK Àý¬^3BÎâNwÏrPto~ÿÞ6¡©ë¥hWãÓÓÓÙáñrÙ¬–ÍjµJò.]þ|>P–ePö®øð÷}ÿóÇ7V~ûâôµYÑŒK9Ç…W3ŠðB^´Íw}ï÷ÐñÁe»<¾ûŒ ,†ùâjÕ†ºu]7MSw£iš¦i:À 1¶©/rrÏo8Ë<š´™äÒË Ú—üb×w@Ú‚ä~¡G¬á6Ìl›õ¾ýWž7Зˆr\vüúe»¦évQ“™SNÀžía æ‡Ç§M›~¸Œu Lœ˜5€53Q/ˆi“_B;¥sx“÷üEƆNMìð£OÔ $VÓì…Þ„a ™÷ÞW¥« ï‚׫s6F ÑÔôÛr‡4êd€'JéùÌ*ÅÍãß=?{颺Ñ⬸¥wX{O¶Ç Åq ùSüɉÞ]£‘[PU]^^8>>N·2„ ‘G3P}ÿõ¢]ÏÊ“Å@äܨ¬E¯V5 nß¼\6£Û7¿æÛ¾5ŽÊ¥ `ä°j–1FQM} Óh£7|·,à­óïÖP0 ×`GÖô…vÆ^»öKq»¦v °Z¢Ã5×Y«»{õæoo+ïÁ~0œ#ïÙ9Jÿz^­ëÌßÁ‰§Ú¥Ä ã¶îÛÖ­³Á¸îu^/+uÕ2ëyÛdûQjž«ë¹›À¹½&à _–¥÷Lì‹àhéyåLÙŒscÊ]J“Ò;ý¹õkêùêÙñÑèÖìo|ÛaLðÚå)P\+°˜„‡ò§~õï´ù€£ZŠÛSí²vkïØ»Ùð>oÍíþø[ öF~ýñ_mað8ž8 ˜-#déüñìp6zb‚A HïdZ(ïô°03ô<â›é9Ÿ j §"§‰º2%†èÛQNiÌmthãh\/Èà8 Ê$+]‚^‚$‚> Gd]9ÁÐÑšíÑÔ1m–ØÈY_KP6¿t§ÖùÙ”`¦Q5âœÞ;maƵÎÝÝ0›Íffvvv¶¨WÏ=ûüç¿ðÊx4SEÞûÔ(Àd2Y.—ÇwŸùÐ{ÿø[fáw?S¯ÎMXÍUl5EY¹ÑôàøÕ‡÷¿ó»ß[;gEyçöá2Ôa±ª¯~TÌ‹¶CÜM©Ïª*Eâðæ¨˜®]ÎÛ0øÜýÿXÑ×Ë©­¿¼¯à^iµ‹Ð–ñLœJ|)el÷ÝÑ÷¼™1ÈçnYÄ.5*ìmX´ÙуßÝv/¯çç5:GÚ›Wú¥±ýÒ>sª{»lˆ¾¹Ž@îa°ÁIMì¨À” 0 ²Ü°sÎ{"rÌêݪ¤BÝ$hEdLÊ.UH(A6™)¹ y¢3ÜÓ™—-qIŸºzým‡Ï]Ú+| ®Ee›Iå—«Õ57fÓÕ2ܘœ-¢ßÆìÇ¡sκðPGד›(õlï½¥MÒu9 ýú´°i„`ïîÕ½X[Ÿ2{Ñ5ž8  8™LÆã±Ëu“J€™rpÖŽ ˆYr±¦F}±Ê–âf µ¨[03íò™;“7¡ïÚ‘«jJJ¬”ýÜbP¨¦½¢›@81#ø²(ʲUeYn…÷¶ìª$V´ ‹¤â_S5œsÌžr¤D$I Á nÝ]ˆiNŠIÈ*j’®ETÅ4ˆ˜*DSç Ûg_]]}á _(Ëò…^X,“ñÁ‡?ü#¦˜L&EQ”e eÀŽF#çÌœ¿øüçåôa{yR7ss|ãæmG Ânt0#ïÏ®®øøè«¿ëÛ´¬æ«•€h\V"²XÕóÕ2¾éoBßlòJc [U¿»g>¼¢!$o<ýÜ¢Ôã-à~—-Ôn¹×Öì×ÓÀ¼õíî_7ˆ’<Ì»Æ73³£­Ä`·Çv?œmÊ0¿ußúÝwïð¨ƒòs±.ô UUÊF.ÂZÇJ[wÿ†CDrkNS±Ô”á˜æ9¾)¨eަ ~ýøÀë@nÏ.²%sˆhæÇ÷ÎNªê¸ú›ßúALq÷ðÆc„•ŒÝÑ2–@\Ùüêß.…¤á PìÁì1Üχëfìu{ ÇpÍýÅá…ïŽ!ëñGûòOž ‚Z"KUUU”ŽÙ¥†zf¤¦¢¦J*j)œj #JÄV–‚M`‚*íf‹$"…AaLÓbšp›¶/©S‚¡£³îP!qa¦ý ”ªA]Jweï}Y–UUUã‘w¥1qf&"Î9ÉV BTZÍÎU!QRU¶‚=;GÞRËD&Î飩¿! "0–®–q–5ƒI%ÇI`‰ˆKêðïÂ`y<'®¥û¯?¨ëö©§Ÿ»¼X, 3 !ÑÁÁÁr¹ëD÷ 3[,ç1ƺnL§Óoþæo°\Öé)L&3[­V ùʲ|ë[^”Õª‚j½¼<}øðáýãäà°mÛbTùªœ/®ˆýÑÍ[ßþž÷,H=ztãÆ­ÙÁA½\}öÓŸŠMbTÕ>óy»ÒËÞMÃÈ,YÀ¶é´|»ýôi3óyG·6Æ6÷_íZºÃ5ýfý~ð¯p®_Þ î&söº€îVÁ6oÃpÚ±³‡uÍùs÷ Ð:®±ãóìoò®›W½ž÷EÿŸu¿w&@ú9‘NÍÊüŽSŸÍäÝV·¡"íAš­Gÿùó“»ãÙª]â}®æé¯Åˆ׌òÒ.pYª«uV»÷ýòûèòòNu8¼'[7jïØÕ&‡ÛïJ³ásÜ;™‡ã1<Ü~w÷-P1ø‰³€ƒ±PÁ _ñU‚éôèðüjamy"cUV¨3À*&dJJ©+Z ªJ.qm¨¨‰­ƒ€‘Œ!ÊJfÂ&@$„¥iÇ«ÚM3%˜4 B„¢2ˆ&¸z½Þ1Ø;Wz•TT²ùÑtä¼WÕÖM­Â„ °Ö”P¨Ä6èJ´…µÞ‡ôÚ8egÃ9*KïKgµ…’#Q0 ’]îH¢4˜ñAáÔ{!;f.˜,f7]©Î+kˆ D…MìØ¤ ,ì fŽœóóó‹ÃÃãó³KçàŠ¢i¤Dý²V0&V¯Ð¶hãøk}qöÊg‚-ª #[­Üh¤£ÑÕ²>MÎ./ÊQ5º{¤ÓÙíÞ²,ŽZz=JU¼ººòÓé"F`–Mۆ؊µV4ˆ6!Æ(]–DÉŠRÒP„SÌž¡È‰²LIÈ}QÓ´A¦.vÄEâì%"âNÕs‰[¤c­à¡ç91[wŒþ8<È^^›¡Ýþé_ðœå…ι’]&ÓðŽéæqrÙ$:vEá2as*V2fsÎ8W÷rú5ãB)e3³ë[%àzô¥.Áúl®:’%LsÙ¿›šRr èX™†w¸ƒ^#綪 ¶ô~™ –Xiؤ­U¡&ŠÜ[ÌD„œE•`E£¨˜¢’X¢#afEPKåiqOÞ|Ù–žHY‚H-®t f8G0'ŒA1gOöﻑÑÍɱ[¶ÅÃÅý{ok§åW½kô£®‚y‡FA…·’AT¬d$qN˜ÉhÞ¶îæá|q~Øàþó³gï]†ƒ’Å–óãÉG_..'“Q»ÊM»{e(ùuÈ4OÁî¼"b‚SßNsÍ\¶vWtm»“®ŽÁ ÐÓ"¹#g¿*W±k.#N ‰“æcڵ͘á3{—˜)H@mr fQˆx|ªÅÚñÄYÀËåêÑ£G¯ß?{åÕ“{÷îÍçs3F£Ñ¨(Š¡‘‘\ïA²œÀ•dI¿¥n¦çt¿³¾±f¦‰Ous ¥2¤lïb­Ã23:‹J7-""白s…s…w¥w¥s…÷ezåŒ L]žÔú|RÐ:Z§«2œ’XÙ“g¢D ãˆ8‰olHtä-%:È Äx­‰’Çr¹L,Wgggüàň¦ “ɤm¡áÈ]^Jhó?÷s?æ—Zg*m+|UšçE½šÎçóùtvçN¯®Þûý߇Éääôt6›1s_bÔ„6 ­Þ-£6¯êÐoa×ݵk om°eCÐŽ!»õ-)c¸ûu‡[nEŽ·ÂÀ×E”·€+Æ|Ý ¯ë1cxo‡·z˺Ý]¿5önÐW´om™&ÃpÇᬑDMš'Gï@6À(¥ƒôŽßœÞAèS÷úzúÝ¡¡= ËåÕâéÙ@vúÚýwѵN¸:䲫M+Žj÷X®jÚó+"ðWñV·ŽäjñÔÑÑñdÒ4UÎ/B+WËá ÿ=<…áǽ7ÿñÙ駇»ïž Dè—zü?ì㉳€O}æåÏÇÛ66u{q17³ƒƒƒÒ•‹ÅBB,c¥™!±NæÀ lÈÈaL”‚É0%ITˆjd©¡¥†Á‚Äï3°z»`pט«ÇZ¤v¿ÆÄ”É#ó´%P¢½ìÌ ç§Š‘²ðÞ«jˆ`ïR––R2&:qз“8F ÷¾`ç]Â`&"F¢À¤ ÖJ´¨ÞSî!š³(rVÍDìÕŒ4…Γ ÛÏFUUÌ ¸Ð.Š¢ôŽV«&„àfŒ.cQbDìJ`ɲO/cëÐؘà45ʰu6·u‰ñ´¯ÀfZ”͔жӀ8.Ÿó“ûÚoúü?ù¥ 1H` D!EP<0M.Û†G³±s¯_œºä¯$>yíþl4jMP¸b2™”•¶ˆõÖ=üƒèOo ‰6îÿ…ðë¾¥ÍÒíëÎgýCù/ÇñäðÉÅg?û¹ch£ˆp®(˲ò•ª®WÈÚŸ¨*D]â:Ï<«Ù#’ì`+) ‰iÇó  ã‡î‹ž ’g!€ýµ¬5;î5çukaUUÊ¡2…Á ×3S²W _…+¼ªú`Î9ö.…~­3¯k^U53 ²÷Þ³K½nˆ\v©‰TLÍÜçØ8Ǫ:´¬£ $"M1³Žì@ÌÜ€>JWÙ—W yylÇ(qžF£QUN ®ª¸i‚ˆ8<:šŸ_Xláæ405-¯(,C½4m[PZ­qéF£ek7§1†+ѯÿ®ïZz¾rúÔsÏ/—˺®ÛD$„°ªëĶ1ȺÚ`¹ÊЫ4ð÷'ÕgO^ uI­Cز6ú…,ì°Ì™lmó¦Û¥M„~\ñÒ®LŽ|j€Ä.39‡Ì½>N¿ìv¢Ñýå-i#*‘Ý$ÈÛUs¾áÑo¼u3ûû6”Δš”Pæ´¥Â4õÝœl’ D1Ln7¥TjÖýhb<¶äh®›W°!œ‰ð”9x4jU^ÙÈ@ÎRcJ½O¶®«_Mª²ÄÍ›7§e\–—.f‚Ÿú7ßûg>ñ$FiZ(šz™}ḟ‡Õâb©ÀÁô`%!6?ºùúÅùo<¼÷‹oùÙtR·VÇf2–âÊæý£Aý1m*…[ƒ™;¯›æ¹ñû‡Iê˜Ý¶žìïó°HÇÀftuµLµ:mÛE!"EQŒŠÑr¹lšF»3Ã¥èivA¦0Jífš,dâÌœÂ:ØVË~9ë3ŸmD ÿU%Ƙ˜™MÄÊ9!9sU"ÄÎ9rìœsEN^UtE–Ž•I™zó4¾ªš^E—Í_„!Ä&D‘LJ…Œ˜\á DSG©Û½à½O`,"É$GN52Kl)ßC[¤óò)̨išóóù|ø'ap\Hôëóe[teG·îüä~dtrQ®Î½±¾05À\5)Æ ]\4áèÆñœp÷¥·àøhþÊ+ϱ;],šÐöèÛ4Ͳ©ã`lƒñ î›nR_ ŒÀÐ;Ôè1ðNu|"‚v•‰l³`¿Ëp»MŒÜàaÑ~ 8Í‘ À®`"åóš; { Úsàìöè1ÿÍgœÿ¢3öJÒ! í~µw9iÀž_=y†÷ßÖ®æ=)ëªj5…ˆ˜¥æ"¢ ©Xž¹<ÍU"ѲÇ&{¤,ǃÈ@ÎGÄ:ê˜ÈÌ"ÔFrT#],)úw ¿´‹Õ¼,F«Ø^.—½ºšÿ‘gnÚå—¨[પ®êÕüb € óÅåx<ަ‹ù…Wÿùÿù?ÿµ~¤ùÌ«c?+Ï/Φ4ª£$‰¾…Áø=!Ür§q¿‘ã_ l:“~ÿ¸þ‡t:{bï¸`W8.äCˆÚÔ+ƒÉ(cp†™ôB2±QÊs À"™ ¥\m†˜ÿä½[ÌmYv4Ƙs­}ùï眪sê”»«ÛÝm»Ëv° Ý!ؑ݀#;&¶ (Ä<àØÄ(䆕‡…[¢ <$("XB E1B€„±`Ç€ŒLBì¶»ËU]ÕUçö_÷m]惇1ç\s¯½ÿSÕö“ëŸÚúÿµ×ž{íµæs|sÜ}=™9O€ •ÃIU×u÷îÝ;<<4{°Š@áê•ý¼,4o×\9ˆOOO'7©nnV$"Î÷RÕôÝ:´Ýùù|:“ö=X_°$pÐÕ³ÃÙg€Î7L¾øýß·QlV˃ƒƒn±Ú´Mß÷mÛ®Ö›¶m;ÌܶmF܆C"–ç9 IªI&NSµge+Ï”ŒiÄ_`‡%7.ãóˆ°£jN{KNæÛ%`B+Zéâ%Mãë¤/ œ¯éœÓ$1côË‹0Ÿ¸|XØ1“Ç"’mû|¤ŸhUÈi²øæ&*n`ÍäfWbVfVé9¨©£);faŽ«]‚Úž;â11ú΅δÜȪ$Q ,RMí¶™mvü¼YnŽª™à½‡¡¥Åêópüßܬ:<œéjcûzð€‡g§-‡õbѵ«šE kÞøÍnýû?:Z­ÃT9tž®·v‡f3*ÇwÌÒùÁ†PLÈšé’Œ0i7S®‚ÑG&´QÒß-$¾so6ˆŠp×uDB@Ä®i %UU„™QT)eZ@‹†A¢œz‹·`ICùhF0T¶ÏB"Ñikä"˜˜»ìpgpC,&$± X“7ÄUDjÀX@ÍR`;ç'“iå|åiâ+G0›TóéÌ9RÕ“““££#ËWeÍîÖ™åAr‚€3gìC÷/þá9ôÐ6KœN¦m·šÎ›Íep|0¿^ó;ïüÖwΧËË4ë ÌÚ»Éìh6—zrs³˜¾r ›~¹i~ð‡ÿà"tï>ñé×ßèoÖæüÜtmÓ4–ÖRä(4½Í*J‰FAASXêvÛƒ½å IDATËó[Š£M}ìñ¡o“ÿÝ}_æ=N¸‘3jîyüh5i¯ [vù¼’W,Dö[Ë÷d¢ýh-0ì€-êRUDÊÇ[;$ÑrŸ7P#H1Ñ’î8Êœ‹…DS=stÖÒTìOÍÙ°ˆSPÄ`¹hTEH‘EPl‹>ô݇ ÷²X­xsðð~íâÉùs>®ï÷üo|éGÿæ/ü7­n©WPОƒ¢àz½nCëçÞ5Y=€°®+øÿÃßþÜ÷ýXÕt×W7þ•“:d?hwG7°w$©hJªÊ@#È„ßúÂö¿¼}”>³vç¸m®j¯Ízå]åÀ÷M§Ê›®S$UEŽêXH Á£²³(P *ÜJ‹è@=ÀT9ö =HèɉŠH”U‡PIÑW.Ë…ˆ)Ú¡ë;UTrဢ HJÚÛ2rNzÑ pRMQ]׳Ùl6™N&“ùd*mÛB…Ðz  } ß(´¬ŒØtýºm:¶B›jÙ½æèÍÎæ‘¼¯k?ñT9qè|E§gg¯Ü¿w0›9$D­‘ÝÁÁÁÑñ9§¬`A¨@H‚QßÅ AE¥;<8^.×Õ÷Þ{ï<|t¿»>‘@Š$Þû¦]€wºK¬¡QhÖüþü_–wßÇ›¯të®AÒEègÇ÷ºªºv¾šV_þÊ{o>úÎN»ÙÑ1Lgn6¹ùú¦ m¿Y…®ï{æ^@š¶ëÚ Š]·f¶Ô&¡àÎPš¶ã†„P™3Ó1hŒ¼>9I%[¤c´Ù›5´Œ‹ ¨YÁlÊJEPGÌsΜђø”s:§WÙJÁWæzù$yHÞÑdÁºàä|Û0¡· dóp&Kt¬B\!D'ˆ„ø ^£®5Ió†L ä5ç5M›Xå¡„ò8ÈñKq£cûÏ,-j9éâE#¾Ž¸P`€yî÷!Öš•UzQa‘BP „>¦±LwŠ*ÈŠ-#pHx†àªª«åIh^c­T+ðÐ à„¡êµs ¢7‹„@x ³K•7ƒ+œMæªÚjWã—.®þälã6À7íëpòu·`××zè:ä5óv €x~P?l¦ýéäl× Áá @$õKÂUYÎÇé ¹æ °¡¥­#ƒqÜ-q‹×tÖ•Äm‚Å"«( f¿[hªZ!‰ˆ;õÎõ¡·a|ù†ïwo»sœEÓ/!ª(‹ J³eRŒÄŒÉª*1޳—¡*ª€©¬€0¤³ù‰˜?4C.J7§Y 4ˆ§Ã~²kuŠöò_"2ÎxÛófq-¿Í7P,’AëØ‡Þ~£ªªÉd2ŸÏ=9"ð(PO'Î׈¨fÕ5]-¥’ Õ„;ï{"_Uîùóg÷ïßoÛ~¹ìonnL°°„ÏMÓTžú^”®Ÿ??ìšõͬÖîpöôÉÓ³Ww€ê}^-n&Ó)t¡ÿÑ?øC¾®®®®Ü¿¢]ß·mÛu!•ì­úQÛwyÀ˃QÂ2(U¿ÝVîâ Î6|´+}îܱü»“ÒyPA§b ör–ö ¥Š¤Â0ìœ3'¬]8‰ìŽG&Þ¢ òa#¤·—Æ+ûŒ$àRßÿ–' ®ÅHÆÙ½@D…UTTÔ¶kìšQyPT'a7“€0V»®fú0:· BópDu.AU pèŒ[€ÞþÜy™ ú1D¼Ðö_úäçþÖ³·î¯fO»5xyiŠ®¤yë¾ûÌ{çW«öüêÓo|êIs>Ùš¨-®òá÷³}v¸Ç5Øuâ}l[FâõÞ»zɯ|üÚKÄ‘ ]Áþ–šÉ¼Ô•€HŽÄAE@Ð!:Ûä›ÿX®ûúbfsiFDsV² ´I±†Š„ˆœ’ újÒ ŽÔ†Î9«Á+1”kfÄÅÊõ“Wgvl±±˜ò™ôDä¯+_×õt2™MëÉÄW•Å’jgØ“Áó•ÏÏÏ›¦©*÷âÅ‹ÐËÑÑÉrÑüÌÏüÌÍÍÍ|>ŸL&ªjŠbèƒÌæóãÓW~ìýØ\_Ÿs³<9<Ü0‹«µ®V•ýæW¾úðáÃjR·¾ð½¿¯¾¸¸8>8¼¹¹Ù´Mú.ôVü¸ï{éCA‡Á`IêÇ‘^ÚF0p4­åŽ jtœûØÉÛR?~£­¢ý¯ÝL“»µJ‡äm·šòYmÞ‰G£±Ko·ñýr`wé§”\wIk¯!i˜AbAÖü6ɯ”àDsoÙ6‚DÅsyñ )G6‹Æ(#eQFèö;€^¡—mo¼‹CŸJÂÈh„ˆíaýG> kîú&8%E‡þ%bß=œÀ¿÷KÿíãÓGK”ozåñÍ;Oo¸-q{ä{_H€1·(H<“o/sÅx)Ýÿ¢”eË^ö– RÙ}ê’„v»ÁζàcÙ€¹«éE0’Xü ›tíäà}aÕˆ £×•šÓstýMiÙ£›( FA@0B¬ýväÝO9@T ÖTR Šå÷4®jè‹ á–\²´ к¬,tÑ=ט¯#{sÃÓaÌ#D”PQEEû˜U<(5·ç¡$0°È[o½õèÑcóušÏç"áË¿þ•£££ëëk0(¢[ÌÌÎU=ãæâæ»Þü=Õ‹ éÚÍysyåÜáƒW.כαª6}ûþó§ÿäïÿ^òôð¯ËÄoB§,dµX¢JÁv6¹ä‘ tbÔY Úó[î]Š‚H«iOÆ7 ß9 Øä“\sµß2—>Œ…HE-´d€$Éœ³Èê³jH9‚`&ŸXñ#•“ø7*&<%_!b®È˪œj?¤›4Ì- ÎB ܰ|„üÝ‹Ï"¯Í„©f^Ãÿk/fV  ”ØÂu`¸þhÐTõñãozòäÉùùó¦Yw]w||:›üôOÿñãããù|Þu$MûëBÛÍŽîmn–×|€ÝPh6ï©^‰6DaR-úîž¼þMŸÅ›åò{¿ôýËÐö¨óÉ”7­C  –ýÊÊæºÞDfN£qq¿Ê«¤„—ÓdÚwò¶6ê¼ ºåG»~'m$ “wäÝPÉJï{”òÙo±a&b¢à| b$V5dpc–û³Ù\4zXÿÙ7¿ŽÝa]°ÂË,ŸXOkhôOÿòß¹¿t‡_™œ¼xÿÉîOظ¹´½²¨jòk>¸•Ú“Œ{Û«”ƒ_ž#â—³ÿñnwN6¯DLõ|‚¡/ ÇÙ×Ò/æ"hq&Ú ÃePD –åJD0H”¤³ë°F'£È`•“OŠ#rÞ#zTíYU•AP@UU2mÆRɦ35÷–²•lK¬‚9ˆ‚w$k×¼ ‘²5“~ÉÐ{Åè÷J1ãµ%¶d "25it4‹6ì‚÷!3Ïç‡ÏŸ?ŸLªã“î ¼zq~}rzÊý˜+"u][¦ªù» ³Ãƒg¿õµGÓj½jòöן<|èçsñ5œ__ûé´žÌ6ÍÓG_™Ÿm8œ?½8ªæíjÓ¯›Mæ„ÁQéÌ¢,!ìãXðFÍ o4Èåöe—wìÐÒ>ëï¶ F @·åZ“D÷«Žw8Åé^Ðñå9ÚŸZ`+ &lïê€,·€·pµm¢‚}x¼ÛbÏÁ”¸Ç6¬IÃ<"Ú<ì%Äf"g޹«ò5l»íz‚èBïh§9ž Â` hc±—ãg¢ª=#z«ñ£VžÙ!BÁöÞÊ b”‘‡xK¦Fž2ñA]×7Ëåsè¿§¿ N«i %Òmˆ7¹w֟߯ŽÏõæ7>9û“ОLëEMï䑗dlÛ3SÛÄ9LS‘höC§»œÇÌ”´ˆ(gôs»o?ÊÏ}lÚSAç…+"Ì=ï´r]¢W*"œ3ïlUVUóÛ]!÷}Š_QµØ¦Ø,ù†¤’^;À °OÛ\¾-G·1<{ ã;*J»‚%2*=Çüj öt%S+"N&“››óG~öìÙOüÄ»¾¼Y.—›Í†R~çbäÍZñí·ß>>:h7ͳ'O§‡ǯ>¼\,òÅfÓ©®šöáã×Þ}ÿëÓéôÍ7ß\­×ðõbQUˆ4M#¦|Ž*èfPDó-ušô–öÑ)j z÷±Ý“ûÆû£¶ŒÄŒ½CG£ù­jE»Óšïj¸·”#ŠÒmøü(#3"ÅÝ6"Îm£Å%;tÚŠ‰RF¤ÝrýmÈ Àжp(/”‡äÒé[ú÷©-á2ÃUçåT«æÕùŸøždAZíœOo»H{s­à—7ÐÁŸüïþëÓŽ.Ï/Äi7>â|‘Š’Â ”V@ÙK£»ÕœÝ~ôTµ2jöÂ"iYþ¹²Fîß9 8„°ZÞT@B몪cV” ˜tÜHTU5¹.[ÎYT&D%^Æ?‰9:Š¢NüD$( F5€Ã½*æÎ9pÑö‰ lÛmR_c·ê7àæèÑj|QLB‰µWOj¯Ò ùÀ „®òÜl•<±ö ½p+Ü*´m;X _sœ&D$ï\EèQPjò«ž¡¢ÚyH[iæP׫ªGqŠ”ÄüØÈ®)˜ÕŒd}ß·asvv6?:¼¹¼ñ¾>9:ç”*}Ýt:mšf2©º¾þÒ_þkÿð~eâ\Õ40óæ¦;=uÝüFDÞ?qyyùGôǾüÿˆküî?ôÃkpW¼¸|¼j×KèzÄvÕô]×÷½Hzèzíq¢apçKŠ‚S„!Š¥(Äè:”™c&"€SÆfË{ësë ¨Àó)w4H¢Y !A@äIÉš#:ãO¨¸…» \=}Ô¡€`S';2«A~ôˆ„æÅŸåc¨Í?O•’÷*¨qÒ‘µR¦ªØ öNe!Τte*œz¢uÐB œ‰l`EO¬pÆÐƒ´CaE’7¥9rD”h j0ªÀ Ì:j²¥A‡D ˆ"¾“^D‚Øí¡0¤bæ¾€ÀµŸRE«nUQÃ-µýÄ!:o–)"Л6˜EQ”TÑ CfÏk›¢.ðÍD>ó¤ûÀyppÚÀÕ¼ò«Žo£ª§õ¬s-œõx9Ñ÷gµ •ÂF‚·‰ÂlqN‰xÛžœA.’·BNcÏÒ0…Ùš˜²Ú›MÓ¾ª›Âcö7«W9/ˆ±Hp²²[ !$'0ïv/ Èú]ÝîsÛpÓ‰0+Š " ›Ë‰9:«& svœ\\DU*DR SñQfUùsšµoª jÊ=S}RÜZ:«Yõ¡èRUÓA#šo¡a¥¶¢%Ca²äßÍ{Ï’oŽöÝåØg°¡”<}$¸Ø/”‹¹!õæææêêæ[>ó-/^\¼xñâääàúj³Ù´í{Ýl6‚¨ðd½ØÜ?9î/Ÿm֠ܳ\^\Ÿ<888Ô_¾8<<¼Y-sªê}­ª«Õjvx°X,‚ðr¹!$g+-tb"þÂv¸u§i0Ë3ÃôíØ¢vÇg4Œhíó/óG¥Xº%wÆÍÖ ¶ŠT9›UþõR:!—S¤ÅE""OVé(þ¨C’mǪÝǵÛ>½õ[i¨J H9žyœMÖ*05ÙmI•“" ¢¶ËK œOÆåw¥ç½'w?ëUЂJzÖ">BR½¹RŠjPôÌ€d%LÁ|)LÍ£é©v´ù¸R<9=!ò•ûœ£Bß9š°îÇDX€NÉ¿›o?:]T7È&0d.±ç·öÎÝèäˆæ‹n{OÇ+ìR”êp¾¼¸ÈV²M+¸ÅVýqmw€»žÛÆ)(8ì{sG"ǽu @Uu ;YÑ<°ÐÖ½¨)›ÀvµÄ̤êbi•˜ŽCPA­ú ªRŽ·C@ÞEæêÌXkåQ ª±2’šO”/ÕA%O±›apy~„Z”¢¨ 6%ú–¿h/–0dÇUUUgóYßóƒ¾öµ¯­×ÍÏþ¹Ÿm6½sȬ7×kˆ&4EĪvÜ„Ùñ'Ο\Ô¼é6/ÈWO¦äÜôèø„V«Õùùù÷|þÍóóó ò¹Ï|v6›u]×ôÝoÚÆ¹ªiQ-k~(ÃÍw[ž‰£w ¯DÜÒâbô‰Ã[йéìXöIc-ô–Ý7úW¡sQz6(yœ5—Jq º˜jÌuÎy$B“C' '2¡ s•…1ýì6ÝŽ¨yyÏLP8g}(k‚9âÁÑÙ^Ê ÛQL:äÉj1”$jÞ‰¤ÛQ¿CƒTÄaȺ0E9¢"vÂT“Ÿ¼&ÍQœB,}¶í®‘/^÷Ütýûë“/>úy~í »-—‰(Í‹eðp“¿ø‹ûïüпú•¯ÿæë÷Ù/ï|cÿ…(Õ;Ú;ƒ½Qá¯WRíª&ß”l€Ëü ýâÇ£Ý9®D°ïEÕQ…€ “s–ýÌ$TŒ.$¦(ˆ`,*¢ IÇ% ÀB1#:€P¬Xk‘e$Æ`E¨œŸM¦à¡ö¬×ëÍfÓ1«CJ–Q؇£{Å òç`Ÿ÷V ÀåÉL¸´.¸ÕHuÈœµT;ž5ÆžÖ릪ªóó˓Ó{g¯4›^êzê\µ\. ®}ôUnüä¿òoNº…¶+7TÉåfs£ÕäÁéÁéñ³åâ­·ßQÕ7ßüŽ÷ÞúŠ‚üÀ?ýϸºZ^_!PzD×4MDUû¾üÊ»¡¯È* “u‹ì;šÖ­*Ê nÁ$ºòdíT¢wŸW3‘ó¦ÎNXà/«DßBö‰®œsš®æRÅÀ$cy=Œs#ŒZ‰¾/Áé]ˆÝưÜ’î3÷ÅòŠÉÚÚ'Åí ­‹AlÝßÑDv]r‹L¬ˆª@Pä¡J?8ü°E±#¢ Sçƒëƒ*):gb±fcGÖ4íè~ójûz% îP&䛿ëç¿þ?M7Ú9§²?Äú륛;öÚÞ¬ž8úÚ‹Ÿýì·5W×ß’àí.nïÚ÷ö/:ì7o—| ·Ü©ö\< $@±âîf»sì!¨2+÷ÂŒ˜V?@ôA°j$`Á½¢VEQMøeVâÑÂdv¤ÁÐeŒˆHBFB´TS‡‡óùÜ]__~Ñ4kò®Šî¹ÉökÆIÙñVÈÌt·°-’æþe‡± EDD2¬£¡–ˆ‰#¢&GsÞ]]Ý:<þ©Ÿúé®íÀ{ß4í^TÁ{_×ÓõºY­º·¾òkË«§÷¤À–«úð¨žO<|°jšMÛoÚþOŸtôD¶ôÃà TÊâ¯BöôÏ‘Ù&‡d(ÊýÀª!YO(¦t’c†‡¿·Y…­>«ˆX~óñbS‘‚ˆxï;!'ä"‚T *­8™[ â¶x„|ÝÔõ‹%Î'íbñhúêw1ýXd_ó‡sYÞ8@ÿöÕs8™ý‡¿ðóíŸúѺÊû»øXï¥ÛšŒ}Ð;–\woû%M‹Mí˾^f£üpºûض;ÀÌ}Z =3ª€ˆšêpå=ZLÑl©%DE̬&;ƒ*(’w¤@ž<¡8¬„kï½w•óÞ!¬Û¦é;^-;‹0&”Å!\ø® Óª^­6 +Š‚ô€GGè8Š/H¬™‰Ù¹# -×Û66Ç“”+öl;¥ž[p[^Ù~@2 åo• DÎÏÏç³Ã®ëº¶'¢Éd²Ù´U…ˆ>pPº®Û¦¨ÎNl6çGs7®¹n»#?õ“ªö«««wÞýZUUo¼ñ©§OŸž}×÷|OÓµ-¢É¨¢¸^,Aû,)‡ázaÞã`e­Äf¸EWÂUɘ¶ñuóš ¸b¿xf‡>ˆ@€æ¤L–˜W)•¢0$¤l÷ÝJ?i©&ûlZF’}–£‡Ýó{ÛË1Xn©ïk‘9»ÀŒFf% @/Á(mDZ}¬ÃP‡"Ö(÷×}a¥ XRÞïÜ!0¨¨2Kt¬ˆžÃ=çŸGÄ ÀˆBŽ‚j ˆNØCå¬^‹" $°Ï½€NŽº&t=V^føÇ¿ãKúÝ_ܬÂ~‰3´˜ú*4Ðz‚›öf‡]]^·§»DßÜm´;´ƒ•tG­\8ù¸`;cº2•âÞ%s§Úàè¡Ó÷ÈP½ˆˆ2¨iADI£VA…E,s(#"(¢XÊSDW9OÎUj¯Žªj iRUu]Õ¾òñ½gOür!!y‡0¨.oV‡‡‡óÉ4„дíÁU•ÕØ( îWè ‡¢ Æ/FLgƒGçGÊõ¹ ·[ܹä›Y†(bwœsÞÕ‹Åâpv0Mº¦ßlÚº®»~HîÓ4ˆ»öèÏýÙ?ÿ›oÿ„ÍÕå9®»¶ï§³Ó{Gï=»xçݯÍf³Ï}îs_ýÿþÑÙÙÙ¾ð…Ã㣫ç"²i¹¼¼ò]×Þæ{eºî½M’x/<ïˆû?2Ö—îý?´¥ïjtaEA´j®ì3ÒXdÙ9‡THÌ:N$if`Û(D£Â7~“{ io‡Ñ£iÚ Ž¶;#Î0Òi À† ¦‚†”èXe_Ý‘q‡ëì;)""¤"Âñ†â_–då,¶ˆ˜ª³(ªˆ b/2…*>8 ZŒ,J̰;\ϖׯVµx‚¹ûàú⻦÷7Ük/·T]qß÷mWkëê@ªslI·”RÖ(y'è-²ïˆnóFüÃhaÓmµöî¢À´!á™ãÉ IDATn ø w ƒï{ª4(1¶m3­'!píHZ–Ðëòˆƒb ,Rm3 àœsUUUUýºv~ê«ÚWUUU“šê ½sà¦ÓÚ{¯ªÎQUU}h×ë5:R@‡®ò®6Å`ß#:¼Þ¬nÖkBFbš‘i·Ä!÷ØvPmàp­Ü¨ÌYBÜrϼ¤>0 !U,¨à$† "+[€+XÍPu•ó“*Ö&pTMÀ¹ Ð ôJ¬Ž‘pZÕÌLèj É#‘ª†¿EÄ*-77=î^t?õ“ÿ™\ÓuM5;ì›eí1­¼¶Ÿ¯._l.ç‹s^n¼›ÝÈçZë·~û›Ï/Ö,o‚Àkgg$ò¹ÏÛwücß1½vµn~ëÝ÷¦³yÇÒô]5„…¥í‡>°¥¾$rm»•Õ/s^@[šxBâhIä ÿk˜ƒ›nŠeÃRHŒÌ‘íæâçÀ9pÎ 9pžÈ{±Ô.!¢¯ª]4ÕΑw¾¬9HDè”ÌoLQÅ‚äÐ\§ÍþÌ”´Ëâ„£¿VÇÆ`{ ú- ŰØ·Á*8gzI+[Q„XP5 ‰)Ñ{€XÄÃ*-˜l ¨Jª©TJtu컲PÕ·‡x´¬¨Q}mE YXU£#¥ýA±è>PDVAPVeË „1Ü›Ž*¸gfœ9iš¾]LçÝ'Ò‰ «¡šBÅ¥ç¼GçT€%¨e~Eê´„˜œ!òUB˜LåróbÎ&îéI§mðàù–š„¸ÞbЃ`Û®°Ãïþ…ÿê¿ÿÒþ@wï~ù«Çáµ0}t£ÝÌm¼bˆE,»­†ª†APFLÆc¥”§b(wÚýZ"zÜJ~78‚ÄÛKÏšözI÷f_ñ¾òɆ¥qÊEBNÎCDÀÀÌãȤ;À}hC×¢ 2‡àB@–ŽrP+ezÊü47«’ë½?ž=¨ÈUÎWfŠs޼S²…3oäUÕ¶mMQ<ºëfé , /YMÀmùUÜHT‰óßöhà- ¶•W£ŸÈ*ë± |xxøìÙ3Âf³Y³ÞxO!„~ÓÜ»wïòâºNV«”E™›¦Q„j:a‘£“ãç×7ËåŽ6›Í·}Û·Ý{pßy¯ˆ}ßÛ³çªG¼“Œ°”sFw>< ¤ÔƒÅ n—%ÕÈÏ^ÊДê"C’ £Õgy‡‡hÊ/[º¼h!Ý–mïè¶?Jþ]H¦+É£— ÝÞk}|Û`é;–Þ © H „ê¢`‘¢-]ªŸZM¼án]×&ûÖuí½¯k%À Èöq`;}B4ƒ±*a/¼n›ÅzµX¯6]k +D‹eµ¾K§ÈM Cù†ÄsP©¦¬–»èøÑ[‰ #;×Ofp±çàT¡™Kªêz½><<íZ€¶éEd>?¾ºº‹‹ çá`6½Y6«åò÷žþÇé?™„VXš¦"ðÕôäpvr´l6<}Jè^{ý± 4ËNAáÖj„·¶¿òý/ÿåø ^´ç¦~§0 5¶ÜþeÆt1·ù7€ÂÊL³9Ñy€1ÄB¢™ÞFWÓmhGDr˜œÿ-8_ô~äßÕíÎp=;¬f‡Ú¦ª®ëz2;œÜ¿Ï ·ôgA’[øˆ˜w + 6÷„žÃ¦ïºÐKЦY¯V«¶m»®mšf±¼^­V¡í:Q¹få´& V@°ÂÆI4Ò½ ú´n)æ¶+v÷Æ=~ãTÐÉ ;ú›±¸d¬#èþ–1…|G‰›ÒO¶@™w…×È€0'ÖÐHh4–qËbÀåEpËz+Æ£€aÌ|6?lî¶{œrï6S9îH6Ñ-1ƒ"˜Or,¾‰1#I͘åcJ›$2Ä\ëJ"*«Ânœn¦®|¾Lv–®¿_ÞÝ'—±Â™Œ“*u§!IÀ*‚ já¾0_ªÊ'Iw؇@kˆRˆ’å°—£|}}ýª¿ç{yrsžïM6•~bïÝ2+·µ_GW-¦Z­Ö•R@dfƒGìì¹µ°×¦“ÙìµuÛ¨ƒÎ¹òýl#Ü½Í GÊLº·,|,Û`Fb$Qb ÈÊ=»®‡Ž'í¦Özæ‰\EÞA‚[Ö Û¦[öâÐõ¡íB߇Ú®[·MÛw‹ëeÓ¬7›M×u!ô!„®o†8]B³VQ6™SGTý*¡Äb¬[[ȸPUÁ‘xÛ?zË,©<™¯\rí¾æÎvW²Ó!·‹‹ ?©&n¶Z®‡×½öÁ“¯N¯¯€J¢ø§þ?õüé³Ï}úS‹·uÕ®ÉùÞ»Oó§ºÐ¯—«›ëkªü«¯=jCßqrxÒq·iÃjÓN'¾ïû®ërîI{Ó=„˜0 2-ùÖ ã¶ŸË‡)ü2×€dâÂB;Í¡:oõÌùUœwÉÐKIËD™ô–LãtÓ{nr—'æ9•ª†Øe½e•¨†]‹]™…aß¶Æ%fU%±$*€Iß}¬lvDc¡íäðĪª8¶õÆ_)ÃvK:Fèòë»>Y¨RnÔâ³äõUøze’´m…”³ž¨2*¥ªÌJ†ìÚ ;!«(¾•I®Æ|üÊ7=Þ<[»ewòÊ+G$ë«+>™üµßû#øïÿÝ¡Èí6?üÏÏ¿úÏÝûäñzÑ8Xb˜ÀÔ£E’G "šAt`Üò™ÂT.çIKÔ0˜`òš‚í\ÐPðü¤åªš,“Ö[Ž’¾cà;À«M³Z·Ú‡vÓT-a+¸ìÂbu9›ÍŽŽŽf³YUUÆãBÌ Éš¶Àö¶]\ömÛ­6]Ûv]·iše»Ù´m·éwÉÚXF/"C5®Ì @UpHkÌØ„QUFôÙ¨’%AQ6ü¶ÐvutÙÌO‡·;‘‚»W+/»^¯ÿý¿ø…¦ÊH¾rþƒ'TUµ^60;8X/7]×ýÕ¿úW~òÇÿ÷UÚ®S è¿þ‰››…›¶:“|)Ì´`ÃTÊåºmzÏâc9¤_?vZœÂ佦™õýL¡ á‹‹ÙËçt·µ—íöÿ½/üþáÓ«^LWIà;97òº\ %ˆ–3ž(èFEFÞó•_]d÷ÓÑ ÜÁvçXB»Z߈¨ uÒJzîðZ'u]׋ƒããcƒáétZUUÛnº®kšÆx}–ºt½éû¾mÛÍfÓ4MËÐJè[JyðÓ‚bTŒN-q‚X!aˆþ+=“9è8ªdB€…DH”PÉ)9A°L,Úî™Û¾ô.¨0(8bŽ2lØ]Qµ'¹?¥º¶(„àx2ó^ ^H%HËꂪv]ï*ÏA‰0(ô›>´¾‚JgÄè™e6õmÛˆúÙ´Û4Âk¨ žŸüçÿÅßš¸Éêùs\ól6_©à|òÙoý–÷Ÿ={ÿé­ªš7ßüø5O€§'÷7}'}@i{à Ìzîz枃•ÏQq ˆ`iR®‹™R`p&{ˆDU] ˆI´ÙØY-ˆpÒÇ‘6ùGçìo)ÔJba–O’ˆ%o|"TˆB´Á/Ø1b,뫪DTU•Ó$`X^_´DÌ"Ùi\Ù“hØIŒ0Òe´Øa ._ªL© š¸Y1€rP -á% k —•ý‘HªÚ«Eõ¢¢¡‚ `ÌM§šBŒâõQ‰l¤½‘tµLëdò½¨ª2±ªje´ªLq”‚uà„UEÉOQøz³šÌf³f±Xël¾ñ+G<ÑÆSå\ d0ŸO´L‘fvΊʙÌÂMµ:ì=vZ½º‘·W:Q¨§î&p%§uu²êßñB8×°ÙËß¾»ÖOñüâA£}ÛAC«=‡.ƒ¨¨©å+ 7D‡Û¬È[uŠ8õŠŠb„‹ˆ  ÷@Ú6œ¶µÂ`ÀP‘•H94Ðʪ¢I·¤åú´;ÀYB2ÛSPK“$ý"8×6›n½j7«ùüÚ0´mÛ4MÛ¶]×w]W¥mxß÷¹žˆxH.Æ©¢©­½ˆ ÷† "q©¡²€  QLJ˜öEàíÕH[Ë{Ò]‰ç%göŠGvò׊9~•Ê— 6›MÓtÞSUù¦ilM1³œN]×30t7«gOžpßÎæ—a¹Yó¤¾ttpt¸øêWonn˜ùìì¬ áôÁ½º®Íèâò’™A¹lÆrGÁ'åø¤ËË|°g¾;ëGÒ’Óíž/ggw²Fmïdìí6Üd‰”-Üh$¯ä·#1(ìmù£ÌCU5Yv‡oå©[# €³±@õ¶@Þ˜óJỦZ$§±ÜÓß„ÚtºôX,o{øŠÄ5k[L{ 3 £¤*‰…c¸3!Ø–W ÚÛN_ @]£Ë$/úr ¡' ´¡©pÊÐ]­[+6.}ëLp ⩽ZM]í«4¡3N?šM›œLPÑÐÜô^B'RĤ½œ\o;#²…©yîèŽi¡ï÷‡X]HADzf  ôM×®6ëëÅÍt:µÀß®_‡º®Ë¼Þ°Ö‡Á&EmQ‡C*†’D+ؾڜ*̪dL3*lsð—\1jv …§C¾ÎhÁ;Öá+ˆÈ7{wžùËß-ÙŸª¾òÊ+D‚xo¶"šL&mÛ¶MGdr=xüøý÷ß_-–°8g„>Lôþ+ªªº¸¸¸¸¸€³û÷V«Õá§>éœ"zúô©ˆHè9ˆ–ÀÊ¢,Dvÿfvñx`ˆ6Z/A¸r@†Ù×í%ðia¾;'·ì¸»Ê©ÁMÀHøÎ3XÞÆh¾°p+I«ì£Û¼÷ü½ Xå±H´êE/bõ­G»"UM (³¥U£¢‚”a? ¥ÍíÑ 7Úx„!Ç—D¨IŽ.HoY+‡»Ñ¢ À)cHJ’³Ê`ŸRˆ«FYD°@z qŽv”¯ªr_’çè»Ýì—ÃÆyHà¤1]Ù^’ß#ʃ“Ù×/±gæà[˜Õ“²¿yâ0©69&âˆü¡ 6+æ–b'ã·l©3Zå­°5K1T’F·>a|vº[©8îÇu(@7q"–K 3HÃÑ>‡ˆJˆàÔª +’u.½”ín)ÅË-¢ðˆá¾*ò °ôؽ¥ç´Te’X—¢\l%æ½ýöÛÞ{K’AD9ů\èy6«‚N~üüx»XÍ&õâ¢ÀjRw@^{ýf¹Z,׋ł|ýÊ+¯¬×kï½"03ÕÕõõõìø8t!„Á gº%N@4ï%þ;²lÝB'»°÷‡4—†àbãÙmô-á–¶[:‰e·á‚dEìØ8«nƒ®~4ñ·ºHŠéLy¿5j°µé̹â_x)‹@ÊÎÁV“(Ï[¨dÒlÀöö•õ ûÈ‚³Ɖѷ(iÚu[»^>x~vÑ^tªb%¼É+b@Avª)¾ÀªDÚÚõ•¥ù’äFäôS_üÒ?øû· ˜ÕPq<à­é9Â/]¼ûOLf ›>Ž*Gƒ8>ü„‰#J.©¼|Þ’ÂËK%Œ”ó1õZÊŸà|A»ÚKèócÜîƒF ªÔT”4„Áý]„Cà¶íÀlRÄéÛß*n 7œ¢Ïœ«T‡„´ˆ è€@Eƒ´ ƒš‰bå" )XT,7}V¡Z·Û›uÈÄóÃŽ¼Ëú!‹S–'Dsþèh CUdVKתŠl{bÀ À€AÁ^?÷s?×ua2©Ú¶'"‹‹öÞ×µ ý¦mzQ<;»÷ÖÏ& ùbµï…ðñ'¾éùù‹¦iºžf“×?v„Jí¦ª‡©ª„ A50°Ä—%0ºEP²ã|U …Ú×p˜K€¡l®S4:O9ùäè ¸­)¾5Ž€Š0îW‰ÃŽÎY·ÕÑåùуkÞåx–o÷Ò!”È”*âÉþ›?*o/Ë­œ wk´Ø o÷ÞIºÍLQÑíÄ;{‚ñø”Ô²{R˜ÅìÝTaÕƒó€*¸vHT,LÝ)ŠP¾µ÷|ÿ_¸÷0l:˜j¦=»Õ&*HBü7þÿño~ñGü|â½£ÖÒNÉK &Ë+=ýèàZ$¶Ãl/³˜l@ˆÉ«ãTl¤ÛÙòBÒk›¡ S²qc†™ù@qKwƒï­³ ©°3¬ (‡00µb#_Õ^‘”P¢Ì§AXI )ûÚf#h OËBWä‚3C"¢‹®üŠ€ŠJQNTsr%07!µ¬~[11% ì vxÒìì¯KF¿@Vx¸ˆ$u´ ƒ&"uc¶ÿ>~ž¯@DΡåíZ¯7U…¡S|ë+_íÛ¶»¾â¶Y6-NdvtöÊ«¿úî»W7×–åÕW_Uaç\=Àr½BÄÖò?‡q±¹3-Ça—¥bÁxvÛþþ·sŠÌMv°vp:çtŸ8KDè §|É—µsžˆiªrõ$«¯ÛâoÉëG9¢Ÿ½oGð¶{>“Á€EtKU“ç(ÆÑTÐEÔRV¾¾OAð@h›à­œÏÃ]–²u\®/“€mbáØÈ–ñ H’sâPX€)e„±á5-4E£N9„²³ гûâ²Apµw­t"ˆ0©ª¾½5XV`Šÿ°iëé,`Û³T@èœ&¯õ’؃—Ä–oÌ÷¶¨ó.dÄIt‡íÜv‡¹Ã¨O<3^vóvç² U4e‚ADËt‘‰ ´ïû’P2”^J´ÎNXÌ!S¤-@{ëTÄRJîàÌ)LÅKYcùªª’-ü"Ì&7`¾¥á}Ëó·u­ŠÌhTÍr‹–Y_Ø6³dæ!Ìe—D‘æó)3w]Ì\×ÓÍfc»Édâ&}ϵ¯î øôÞÙåjqrz:™Ï6›Íûï?™N§óùa]׳ùg³™€^]]¹Ê·m+ €CÌ1ç33ËvÔÊÀX·µkP@È^4Õ"áÀÖl^ÙÊÑ+0xËF;tN4ÒE»ˆ²ùÆJI:_ªœ <éùXU¶@w4¡åqùwïGùÊ£}Þ¨åþ€Ó· ¬îp‹³‡ü €o±é‚•òUÕm',‡-±E¡:ûVI´FçN£û—Ü1Å$EÍ ˆ ‹2Xº Ce1òCuàA€X„UB&"[pDGF‚` ßIBÜ6PÍêIÛtˆ@ |»¸`?m§›úe¿æ¾UÅùñq×4öt™ØÒ7L¯d>Ì~bbcšÙm#¶³ûh{[&ÎÑóÂKëã×îg§ vÉ€jd`âTf¦qM»±‹‘ XKs.â¾ï­f°u³¯DŠOucrJPU6?&$ AË „Ššoo¸ÏRüÝ+Ãö‚¡oy~ï_;ˆ1…Õyĸ3ÃÂíOóG›M£ D0™L›¦Ùl6BËEc&ËÚùëósh[߇×>ýÉÅWß:::€ŽÃOŸž´¡?œ¨jUU"²X,ˆ¨o[`ìÿ<gŠ;Œ|ÇoY¡ IÀyŽF#“§$ Û%àea€Û­%ofG]Q~±ÔIï½ršÔBO÷¹@çA(ǘ·œbF_’Ÿ&”…¶Î#Ž`Yd‘Ô€SbAÇ[°hßÂ~/è¬WÖmÀ É ;°l?Ò6Çϳ´ýMÎX ƒX+Á™=‡ˆZ4A-r-Ž“¥mæ6AnÇÇ3ðзë9ø š¾ëz [%Å Ðbµ9l®–Ó“ÊÍ`¹Ö¦Ë7ƒ)~wDØ£ör+ßæÇÙý."RâÃêSED.¾®;Š™»Óî+aÓm¼s AÁÁš½ƒÀ‚ÜœÉ.ˆ؇€Dh‡Ð9' !ôLJ‡Óét:"âf³¹¹‘зÂ`)¯,#®Õ~3r쀘‘ =Ç\¸Ú3£€ÒÊiEdáÃ"ì*5]5*Z`BÍA%CåB˜Dèœ#UõÞ³¢yt3@’’шHPeDu7‹©VеRŽˆXµ7ƒ0 ùì«ØwëãããÍf³ZÞx‡³ùòfÑ“Kk Ú¶Å«K€`2?¹wt×ׇ?kW܇§ï¿Ï“êÞ£‡×‹›¾Ù öç¼ù퟽:¿øæO½±X­ÁÕÌý“žyÚÀÀ¦gUe`A1+;"†ÌŽA°ïL3‘rÕJŠvõ · SŠEÁA–9ˆˆD¤Ô—¤…Éâž‹v‘*g™#§“DDqˆDà}:G ¤ ’tÎ.«XF-ß•ˆs"fÆ#U`¶œV€ã] ¾\÷7QBf Ëç%TÉœ‡,å1ð ’“Afò1;ß[\šZU^«Eú!ÞsÕÞ ƒâ!bµ}†›+VÍw ûÀª :”´ Â"€Lh #kbP•´LÜ IDAT”¢Ód|²ŸV*¬f‰UQbHEP!§m$8__Ÿ>8›€[]ßÌ*?9:è«98©«ž¨cá^¨¢Ê9K‡Ñ­[p.:Ì)X3ôÌDä*"ŸX3|ÕmþBÿø?÷¯g5tM5¡¦—)Q{Kh¬‡‚^ÖLJ÷t-×7ÏÎÎVDè1…Ø"Jô ,ÍÓåuDL·nj8adfÀ-'íMŽLxfu²óFmœUS˜¾E 6ao¿c”^RÃâw}»s lÙmU-Œ(Ø*5£¢ª8$Û¦k W?==}ôè3¿÷Þ{çççÌ\UUh{ë•Ù’Yw„™­˜€%ÕRõ·èpTIs"hD4«^þTRMÀœ zïu>ô#ØVɾ´Ï 5BRUý›¦;>>~öôųgÏñ¯ÿõÿô¶ë¢o–«ø‘~uqmsv|òÖÓ÷Ñ×Õl6cæÕj%"ιÓÓÓ>tªZ×õÿÏÞ›õZ–dçaߊˆ=œs5´º%v7'¦I0-KdCß$z²ÿŸmÀ6m@„ÌWÁ†mH†MÂ4DÒt«»ª©îê¡rºyï=gkùaEÄŽ=œ›YÍ6,Öí@Ö­}ö‰s¬/Ökyï麮ª-ÒÏÜQ¤Î1´ã<ÍÜ(æ±Z2yïLt>™¹K ’Í^gô s¶H z·þá¹÷yfóÃB¨8 BAåÊ‘I†;È­>(£¶i€…!Bñ­õ8Y x®"[/.JI»f&L^:•©UùrüÑ‚QN ñBà\Ì©}9[.¼¼TdÈ2¨Åªˆ{!žœ“b’ƒ^hÒ%È¥ AŠ,=›»²¨¯¯~íÛß®~ð…xòªš%î}8g¾0 @ìu¨þ“þ_þOÿñ?ùÑN¾>Ö¯üиŠçA3ãôéAmUÚº§é$:­äòWRÈð1¿Isî6Ÿh±¹t¿Â`»•#“g1Xƒ°…$õIÀDF(Äu6%šäFžÖÚ¶mUI/Ûé[&%’Ø{Ï8C6²!kfÀ6µ3Æu+^M¶TmL¼×Às;m¬vV›j}ŒÅyá*‘Ir„ÁÂ"Ò4÷Q©øq8\œî::§¥ï îú°ï^½îûáoÿ{ë;ö§}ß»]sýìé0 ¯^½ !غ~úôéÝñ@ÛÖÃ04Mu:˜"¨ªßä@faJ'@e³ãݳl”GfÕqJ"´é#°¡2WŒÌ:ã2ƒˆä ‹ß|>ÀÆD‡L _ÏWþÖÎ}ójç 3Û 8yf×3¡]ørêü9JkÔÙ0!ÃYþUTÐLÀ-" ™>Ýγ™Ú™5^*S<Öƒu1'5n¼†<_N5– ©‘RJäÖ÷eíqS§üú×{o+G…{2FZx‰Õ‹ËRÄY#Ä#- BÙÌÄ"&Ù ËiøÆ¹¿S×ëwpj½Ž@ƒšÃé‡×x1ž®¾öÑñ»?¹~öaÏC¶­¤d%Jóö>Mý-•‰û`¾Ò¶~5 æB„3­[Ceþi;|u^m¦GÀ$ȳ„\Œ3ê&y¥ƒª‚$b ÷´˜ÕèêåË—jxõöí[]Iã8J±33ÕT¢7³µSüœ(fIô+îp"‰ºdN ÓfwÐ(\RcÈÌÜÅÚŠ¤oʵŽbÿ”ÙD星’BQô€“r çê¾ï‡Ã?}Ù4Ín·¿»»;\í7Û®ò$ "#‚ï÷»{Wÿò·¿ùÁ4Íntv¿ß?yòäÔu¯nÞ0Á9·?ÆÐ[KMÓŒã¨üqAr$0à²Ù%l7`~_Ä’IÈiiQµx^–#Ó·¥tšÎ¦‡0x´9ÿFw8¿O<>Ï:;Íþ\Ž’ÇŠÃLa\.Èôí “Ãä‹H À¢°î)ÒÑê3Gõ.%¨.s.jIP:ÚQÎY1ç¿%Jιì*ŠogoÖC1`°xïk'd"rväAÄIâb9Iõ9¹lTùwvŒWξÌo%õ··‡æ£ñè-L¼¶©Æ3Ç[È¡q÷ýÐ4à¾n/Âo“Ýn©Ú0T–­m"³5S,cmì*Ûb/ªX—³qÄgïYz„ S ½%j Iàl„ôâ€pd‚X˜„˜HåYïèåË—ªÔeäýÙûñù$¨Õ*=UÎI ú¸Ñà-(•â¨N+êóÀßYrþ6“í µ6’‘y†aèý~çx†a¸¹¹½¿=žã€ tyq}w{s¼»}úñ'¿õ[¿õ¿ÿ‹ÿE¬­ªêâò²n›ÛW¯îïïs»‹CUU××—WD¼÷Æ8ò^…a‚äë7Ñzy=†IJiªrÀ"ã8rÍDD ŒBKHA¨³Vg´qâÉi  ¡F€.ä1•5uU@@Õn7Oa‰,Î]úŽœŒÁö¸º _4잺ŸØºbŠu§èŠ2‹•°x@^ÌqïÌŽòRÜFÆå·åŠÊ.¦!ûØøÑ0Œ0±D‚ !€-EßòÊYĈ3ˆø L¬‚g†0û®su]ëÊSèMÄzJDQî£ËT’íL^µâƒÌW§&‘@”ƒÅ‘ÕM:Ï£)R¥ÅÇJ"ZbÃz`¤lçTKƒp lŒ1§Ó©mw]÷#cÜÇü€"‡A¯oo˜‹‹‹ßüÍßxóöõÿù¯þ¤g/TÑ¨ŽÆÙ'Ož8çO(š‰âþþÞà ®O3!Ø¢j"Êä#FIMÖ­-_¦q[žoEÍ6Y¦™<¹,­œ‘6ÎáG¼¯™þÆ+%Y²,jî±(—×)˜ÄSØÁÌÂNWìʤÙ“z†›é€)jmò}9äxA(Ã[`‰0rÃ8 ¢p¼^ù³b1¦ÝPè ™9Á;¥NM}›>oÁýûrÀ"Á{]‚¬ ¶€D/r;ç) ùò[,!êÇŽ«!ì 9–a½\ <Ù]¾>u5>j¯¿x*þÕsyH–×'ìXiùmÑžíM‘_ù·%…Á|s½g’_ðcHz,!µõ†¾2ºA1GÛ¢hØc$Òˆ¸ªTMDÑ *%". t|@Ô»Ä{/ ªÛ 3ê!’/ö LÒëiYO:æb‰/©aÑ€™÷†ùWSž\þzÃäo5L«n¼xeD¯!°÷^eÕ?úÑ@ÑÝóF"ˆàâêê¯ÿ¯ðá³ßÿ§ÿ´g?,óáp!Ä`S"LØZA`溮_¼ø"’çí¤÷•èf…ž²PЧšKŠ:1èó/I½ù.žKèPË1¤ÈÌ­©§1?Ë1¯ç%»ž ¬Õ^f¦%‡”eù&Âá,gþv ÀÉb©$[”‚A2ÂÒ¼ ù—µgŽ~ÀÙE]qÒÒ/BÞ‰ZHA˜Ìt}7ífa,;Wu†ùܪyÎÜAÉò’ ÀÚ)õ§A°…lªŠ™92DÐp "õ.+*K¶¶”¹:PèúŽ D8ô½ 1Ñfªoï=Œrû?_ÞïÞÜ› vG5Þž8àô¼ô½œ«f›XæW˜ÊlDÄs†XRÒœÅÒåBYV¯¡ñ•O€u¦˜É½®föÑЂX]¶N×ôAï/0³¶Ö†º®S‡Mºæ²eJ<=Fk‹Xs`–Àé²™ÉÊF(i(Ñ<@ T(Wp™–1ûùòÐú@¢)´¢š13ëVéûžY®¯¯_¿~m­½¹¹ù½ÿö¿óÙr²Umçñ×ÿæßüþ÷¿ÿ¯þäOž}ø< ½š¦a‘)ÜE]©÷J¥ŒÖÚÛÛ[•4p…ÞD—#¸rIs¢² y”D‰Åû¹è»àE‘ƒN1òX<—oÎLÖ²ä"m«-Ô˜eV…Ãc«ÒA„Ì8‹šg\ó ŸBˆ#;«2X–ÂL9™`¾¹¦BÒÛ ½’¿3¤ƒ`Þa1O@Y>J#y¨MÖ‚6¹®”+üü4PW—#3 5O†y¾$ü$À‘!ë+rð,Ô‡]8ÙÝÞŽkl€„ÀçÖíäi ×—‚þÑü×ö÷þ‰±ÃÉû-±–¼ëîúÛÅjŸ–«ˆÌysÝæ<9[®%æyd,ð£`ËŽ=YkMe=3,9źZ3¤ÕϬ¡[+G”«§LVà¬06 j°$ÌC2éH’G$Ù ŒHÕÔ"€wd+cœ!kC"A$X ÎxƒALËÄALkÈYf20d`+cEÌ8øbȸt%µ²VéHlŽuÆšÆQMãåKã¬ïíffîõb±sµ÷`ªª²¦bf&©ªÊ³·ÖÜÝÝív»—/_:2Cw|`üIÆ¡çÿðïü½Ÿ¾øâý—ÿÛáúÉ›Û;r¶Úµ´ßûáþþt¼;íšýÇ~rssûKßü†«[Ϧø'_¼jvûÛÛ[?õ›"ìDDD¼H`3ÑÖI^Á¬œ"’2^UÅ,BA}kLPÌ2¤>H åà¦ê£3Š=ÕüM¹ýU¾þ»¸;”9àfs¡†(£G+‡‘¿Õ¾cÎÕå 4´Q>g{‰—xð@™8Ý’= X ,ÒS(À6}#|†m(.ÛáÂD$ºh•,ÉP*l}è§ß*CI&$ÄAB☉B$DÌ, tÆ•ˆèè’ˆ:Ø öù‘&=^ï}b ‘ºËaÁcŒ­Œù(Ÿ†s4Œ£3b…œ³fdƒª$´d1•±dŽ@D¾2–¡Á[@£ÞpaÒNPˆH?†«‘þÇ¿õç_ü7a çØ0^;ãnOè+¼¶àËPM¶ÕY&VûP$‘ƒ>Xª=„p4ƒÐc ?Ò¹vuÔÓÏžâú «!§ÀAfŒÄÔe–|—ÄZ;Ï>|…AùÑpIæÊã‡èÁJ#ºÑ`™Ha¦’ʼneb©±›$9Jd‹‘ õIN%a¯ÜFˆº’=Êä©<ë§£<¯NåKgn@yV]¼ÌXb­5†š¦©k"ÒØç¢¼Ù¸§×äãÜøxóæÍŸÿùŸñÅ÷÷÷ÆÅxòê†Þ{¯ðfŒÑHJÌlÔ‰Á0èÜ…$ªÙ$JD“;0ƒSŽÀíÚl§ŽáÂzNùþrЇ}¬8æsÏål®ó¬ß¯Çv³_‹ÕHó)F~_" ES†P80k°ë<ãZT!8À©åNÉ-sz\iUJ”cÀ"åkEÃÌ‚ÿ 7 ~TQO‰ˆ™ë|Ë–çqV¬‘9Ì ìæ’—Ùbî¦>Æñ˜ùo׳¶˜\l)#ÌJ¾TZ,§yaÁ!²;ñ |Ÿ=óD©Sz™¾’9 ~®‘_áôèX5Håu{]—×HÔÇåÈL¤Â$‰;fÑ@‚™ˆwÏ K¥Æ2MY8¼4Ež‰P–àw†µŠÆ\91É+òdêB&jnƒEx­õY'*8¶Àhš†ÈŽãØ´B䋈èïØ–"îîî¾óïœN§¾ïwn¯µÔuÍÌ}ß{ïw»]UUã8Zk½÷•kGŠZ(5š°N„qî\3»ýáv&24“že"µ>­sÐk@ÝLØBô²U¹=&¹Œ^çÁ hQ`!ç­\`1}éˆ%=¥ˆaÑ[{%Îåç¬XTš&ót€ePE²aóÌå{plŒl\O¸ØìÀ !áäœçËf»8€°…Ó&æ"ŽÙ;ÐEæ8´ ÀùêÒÃE­Óyl›Ùåe¯c€!#3Wb[ežÛn´§\~¬ù¯vzt,,ž%4dd:Côî/¢™"Ç{Iêògfkc&A¤,jú¹4OPÔT×n)‹¤À‚Ñ0DÖ ˆhWÉ9·E²*ÉDxâ2ˆ›’ªÿS|ö›7CYN]»¶mEÈ{¯[ËZ“flÊC)©‹NÝéêêªë:ýaUUMÓ0ó0 "âœÛív Àã8jcTãÞ4MAj'f@æHɉtâ!êó^é:®Ñ·üÉ"O™D„héóù)XY¾…âö/Q„(¶CTâB]'XØœ¹×ÒI¨¬bÀE])©, ÉV1ÑE!Ç9" &—XËnæ¿‹—›"ч6³ÄKT1C:”ä2sÛhÒò꼈!˜¹G6Šî8Xľ †×¸â;6€ð}ÒÙ•¶µx S¿"¿£üriE87”KË¿§âYæ’Bðy'#_Åôè8§iÐÕeÔ bø0]‹]Qóe'+ìÉ «>—Œ/Q"ˆîRK!Ø‚ýu)•¬0æd…st¶5§4ÃàÉmæè"…cA’ÈZ{8¬µ}?j""c,æTõ}Ø9燀µöâââ'?ùÉ8Ž®©Û¶mšFͯTUu8îîî²~T³ô«’‚ç½LÅ-£’ä‡ò€Ÿ³#L[vγ{ºë´ÆãŒ° h<‡Ê œ(Q6“ݲG‹Ñ.?æsŽ.á"½ŒòŠçJ¨€‡# ¹ ÀBKMDùqÝÇü8¿‘ÑwN¨è˹a¡ó×ã&É.:º§Z-åöà|L)\•™äQÜ«Ä^@¢Šd3-RÉSãÏ–¦JERM𠣬‰ÈŒcÎ?\Œù¢À5›¤ÎC9h«ûÁ_ùôèXŒˆ&VS&è°¨¡U¼uËê+Z—7ä¢FôTÿéUVV á3Mjã(_ËÄW –«m4ÚX$0“¿™åÍI.ÅÑA!¨¥Š.ú´‰$ÚMûGIðŒÄc~E¢0ÆåMw»]×uÇãñt:£7&ªÑUO´¦zç’bØ8Ž&ˆŠ kjŒ1mÛ:çTþLDιý~¯Hïœ+= ÃsÊ ™“ìÙŒ¯0xñþ\*&ëQÊu•¸Ž9úb •7Ó9¼ÉÖ.Ùˆ,ç/¹ÌE;}”UÊßæg9`a”ž­”–Pò¯’ŸURÖ¢ëœæ5®š±Àe±SE$èØ2sÀRˆ”×c¸9°›ZuŠÔ@f&“Z‰Ìyíb½„mˆy ¼ ¬tÁœ] ³¦3«äÝ‹ö˦w¨W›é\®õÉRækO}¬¸<¯àÿ§ÓÆ¿ éÑp©CÅŠ P 6DPYtàBŸ:W– °5EZLJj¨Ð¡¦KW꺮ªŠËëj›[R¶3CøÂ¼6ë«rƒ}½÷$„è4>È“©­Úfgé7çÚÎR¼Å¶m‡3ßÝݽ~ýºë:‚ò¾ª/Ÿt9‹QÚL>ÇqTŸÏÎ9:&}ßç¸xu]k°©º®‡Þ3³^÷ÇPé·p4ÉEvˆ½ɲGïŸC1q'[x¶îrùf“ʬè>¸° Ìõr2a3÷õ! –Ö§„u_J¤Üìf`3#¬Àô”•ïõ23„’²wQEˆ÷tg]ºV«EkÏ }?ùš^ðÙ0*Wí/˜ÙÔÕófù¬>ºµy©œ|w(÷½øQÊ3Ÿ4eÅ¿ôˆS4¬ ">Î}ã3éžÙž£ÍµAsE) Ñ“˜ê‡ÖÀö{,ÉN|ˆîw‘0XÛ`Ö9Q(×µ¤±Ãô4/eQçZøÕN€©H(é îiô¯€÷éjïÒÏ>/–`ùwQ…ÒÖ fûý^Q‡™û1ÊVëßÅÏËJ5•ä²ø QŠ«:§q¦w7.JO mÛÞݽ½½½½½½eæ¶Ù¯¥lùŠ*€µ–1Gç\UU’L ÇqÔAÐ<:JÖZ‘Q]@‹ˆ÷Þ¹º :YjZ79õ]ÌïõN ÂWáì"#þ„#’›·EKr¿ò¯¬°¢à¦¸b. fަ¢+«Ä#ÌL s!¼Åçy’yB¼F%I¸›dCœ~¢.>u.Ì1 .û.qó‘e®/·ZmQš,Ù°‚ŽéÍ´UYÄÌò<6Ahs=àç TRl–Y’ê$¿¡h¹Mô.€ }ŠÉz\n8-£ J‘Mž‰L’®†È¡6º7U8§¶3†èØu­m*c BDÆVLð!Pbæ¼÷žG"bFÔ‡«>üàéÓëËÃEíÌ0tCß÷LD4 ÃÛ·oïîîDÄÚʹª©]]»¦v•u•uÎT–œ%cDH„42«r€1T±°¯¢õÀœ›¸g(GkkÝTÎ:"b`à ½P{ÏÄWYëöûî½úpóæ~èÙPŒ,¢^5¥ªêÓé4ö£z&†è¬›DN„Ç![k«ê¹Þí..vÃÐ/CÏζ‡ý¥s¦m«>øà³Ï>#Øoª®ë®,©,LQW¨òåI%Ó—5‹o8ž»Èp:ë€hvBy¶(Åý-˜À"™èÆTâÅp q¶ê^”‚E!xÌ'*k+@ç7Fü‘.ËådLÜ—”Ý’ç–ë)ÍÚÛ2ØP¼‰<@*kH1‡$À Í$Ç`?áSÞ_¹ƒ‹ª„±r™KN°laökå<æWv6Ÿ]v™ÞP¹,VÙ‘`ª‘ž0çT1¶•‚!ÜžŽ0×|ÿöÄ—m/§=gk¾ -6Ñ }Ëuæ—,dÌ_&éŒÌJZ½ùê§GÀ)f#°¤eLñ^fü‡¸LÉj  Žmêf·Ûív»¦iêCÝTõ¾ÙµMSUU`ÜïqwwúCc¼œ=¤‡ý~¿Û7·7o›¦ÆîÉõ»}£ˆ›OEu]ãx8<¿½½†¡ržiDÄZkŒ0‘€§¶‹ðù~¡ >™²,¶û”¾–ì·žÊAÞ쪈P¦­È?éüxîu’9Öå7åÄåJøY´|Ñw)NZÃâÛ¼$JpÊË€£UÁÄz–ˆ²æ€ËÌ3ìY¼&“ü9çŸ/9àT@ùÛ-¸dæRK¶Ä Ð]´mQ_‰ŸX½\¶!½4ÆŸÕëOè;ÛŒKs =Ò™áà<ónÄ©¦a`¬àœ{ƦÞõ|D'0ÖŽ¦nœ·$Scòú!"5Çäd ‡•'c1™5òéçœÏECúÌ,ùZ^£Š7z=F¯âì÷ûÃápqqѶ­mmSÕ« Qáîþt<ß¼ys<ž†a@¡ä¨ªj·Û=öÁõõµ:xR6®ª*7 )‰vósN%±6ÉÞ¤dkô.÷4£o–Ÿ—ƒPR¥r@kr Qó IDATõꑵvõ€¡_ã˜ùTcL?u]_\\xïonnœŽ]qõ`™Œµ*mî†n·Û={öì¯ÿÒ/ Á3 ƒZ¢‰HUUÃ0\^^Gï½³uß÷ÖÚÜÓM®¢†2ÑÝ%ÍŊήÖÃô\]™'ÿ¶”F¬³-ª‹ ifš·eíW ›X(à°È¹Íc”Ýœ¿œzM3øTlYE)Ø(E‘n½À«Ú7˜lÙLçò þ’ö~~¾ZOåÃé\k×ÙR¦¿: ijHŸ=ײ 2רIAYf³IDd`ˆù7šúi œ¡óJî[9+žmu<«Ýíý¡­òy8KPâG‰Ëš‹ªÕ惗þ$fÊïŸACK<ý¸,HÞí§ï«”¯µl!è-\½/tuu±Ûí......”÷mšÆ9Wí+"Fw:Çׯ߼|ùòÕë×ã”ýU µÖîv»«««ž?»¼¼hwµ!GD0ÖV‘ÉK7*;³‹AC°F ‰!&Ï fÇ3£Y1%å– ãí¥'Šõhè±ãòò²mÛ¬ýmÛFDÖr`P_.?ÿüsir6X ¬%€ooošªªk÷k¿ö+Ï?ùø‡?úœ™õ’6Û97Žãååå©ÓÀèºÉxrǸcû z·2öY`^~)KñZÆW”%<,-˜òL¶3ôQ^ÙZ«LÛÕÕÕ³gÏ.»ªªx”1„d¼?Cà»anooO§S6Ë\ïâ(ÍÌ!DWù^Ò½…B‹§{ÀKðlLÒÎ×뺾ººzúôiUUªýUg I&Éœ""0³²Èwrç½ßï÷dàœ®®qðæ`îNÝoþÆoüô§?ýú׿NUÔ4«.\Û©Î7.//_½~¡äìt:Íø35£‘’"“ÛI<+-e¶¹Ëéeî8fùyCÂ\YÒUMùð±X&Z"tXLŠöÎZ“)x.€Ôà²ËjÕœ )Xê¥o,¤ƒTù2§°ÀDÄs^9מ¶‚™M”Vzâ¸n£\™"àqŒ@°´»Î«]w€Êf’X›8+‘—»LŠ:µè/æÅ.XÿQy˜›÷t6>[’’b¦Ó£~JbéTŒžžÈï|ðõÿâÅ÷+„‘ÌÒÍw¹®¬ã¾ï¦:ì<îë¦q~­Ã(3[X"RßTêV7z,Xí‚_¤ŸWz|œ¸ $C_ݪió³:"¾¼¼Üív×—*ŒÕËEZ½}ûÖãÛ×7/_¼xýúõ©†à™ÙZ§³$õÞÅÅÅõõ5…02óàyðã8†ã©ïºÎ'E•µªxva£_R®fØKjTR,šÎ .‹z QUU———Ƙ®ë†aо/XgÇшmšætº¸¸øñ,ŒqðdJÛ eªªÊúÕ_ýÕüàMÓÜ÷zVTJ㛦Ñz•?ÖªušF€QK·èѽ^&d«¥­3ºHôû­-dÞîäDó}Ç33òÊ«Ec¶élxè»Ù»âyZåRÑh€(VŽ>gÇ‹÷)úïÀV4`Ø“Ê ,¿bþwpª#s³柨t ôY´,ßj.åsY¯¨ôu^ø4›…wŽÍ/˜YÌäo~’ž¯“¢T]a`‰,Ì·.¯!py€AŒÚö}°»Ý8vŽc¨,ŠkiS ‹ •¨xF6ÒέúÿzÁ€Éˆþ³DÖ:)[k‰àœ«ë¦ªªªªêªmš¦ª*³slÑó0޾q•s®†îtzq÷ææõ›W/^ïC°•«wÍó'ÏÚ¶e–››ïýóç=}rå,uì»ãÝñxTžR7ë5õzkÝTÎÁXvŒ«‰ìäA#®Ù`A ì6U‚Ò¼@’¤ˆÒ)ca¬ñžÕŒË:GÆÏ!ÆÀ³ <êÝ«òn&[¹ÃåÅó>¼¼¾:Çî$"ÄÕ-늌 ­œ鯮në¡Â4Z ¥·oß|ðÁÓ§Ï®Ÿ=ÚÚ?ý×ÿ÷ÕÓ'ý..vÇ›—0ÁVð<’q/^¾©šúô²kê]ÕÔ !kÆàY„ƒò¬‰†%ÀX 㸠1‰‚ˆ Fý¨ëO"HŠGkÄ$+30sí*ç$$2ˆÿ¤÷}I0øÑc…UF" gÂzÙSDåÊò`ºÇ•[¨Ux?de4+¢Z$Ì#)"ç´o/¾–þºP ´å|0t€DXÄ« ¶!IÆT`›þMå,€<ÛlÌ þ™d$lHDÆ$ y…$"˜ˆ²^H ±‰ÈD¡Ix$Dn’!ÐðÃŽüèg@ QcF. ¤uY°ˆ/"¨mˆˆ0‚!Ñ`!™þ 9ϧÚ9X3p9KìÌha@#À"L ‚3°$ï\Mb¡ ºW,‘Ä]bìôãQøIOìl}Ù¶· œÈŸ·v>xq&ô½%ËZƒŽÖèýr•sD ¬@<«qšÁÌ`btÚg‰‰tlÕM4‰gím@]§…‘Þï³$ þ#H€ÕUr™ê—JMŒ!k­s•Š[ëªU0–"gì½?N·oßÞÞÞ~qóêxw¼» £ÐÖu³Û5»Vcõèå™¶mÛ¶‘Óét÷òöx<¾}ûöx<ªSÐJõ’Ï"å–G—n>$ßΉ&&£‰Ù™½àð( ¢s½‹“¾>(¯yyIÉ7ßΕ—]¿O_â ¿®b³äMÑÂÛäLâòçú`Š¥ô"¯„/µÙåu3Êlå½ÞòߥåEÁ&–¿Ý|YfÎ/i¥vÕZ&Ž56nªW÷w… '½tÔõ®îï–õ.$ç97kÓó¼GÌœ ¸–bîÊÕB«kHAùZ вÔôÓÒÅÔ—O4©®H?ç¿åX¥®ÌF IE=œù}Š_¤Ÿ!=: 1eÕ°ùp8¨sí ú¾€@)þ ã8ŽÝýñþþþt<žN§®ë|?0‰¹ªÞ7íápØ_^´‡½kꃈhÐ\éûþþþþx<ÞݽUì²d4F¦°°0ÙÉò«4W^|ÌÛ˜¦åžé#mÜ’âäþj!Ù|,2¦28±æWç×××ûý^{Z€ô„ÁåÞËiQééã?†á‡?üüÃ>ìÆápu©úNep1ê£ãã?>®®'â[x ¡¹]•dV©8—¶x˜ÐWd‹¥PЖ5æÎ.à°L¹©Æžc™ˆxrt…üœžë‘øwiµ×ÓQ>?ÀË€#Œ%ƒ¦iªèÿL0ƒõP̦i= Ì“3,Í,Xä¤âöù ¥KpMÓ¸h±v¦ð,ŠM™%Z-†r^fÉš¨#Aº2÷;øPRðÿ ½×Éq+É|ÍÐç÷Z_ù~õÛÙIq3Ûf†÷Y½'=:Vö÷p8\^^êM"òÞ+¦&*!„qêrð½²°§ã±ï{ñÑPÙã*[WÕ¾Ýí÷ûý~ß4­­Ü8tHknÇ·oßö}ßuÝ8ö™z¢p ¡1û Ðdç>°7‰ºwG”×eËíX¡EÆ`“¼i†½t[ ÃÕ«F6áV Ä|w•Dd“3Æ>£›¬kóÉ'Ÿüà?xöì)õ}߆½¤p¿Ì¬îÀ<þü³Ï>+ë*«–9~H¾¦B‚Ç¢4f•œO‹¡˜hóüv÷Ã0xÒ¢ò¸²Î¶U㪶ª÷M»ÛíÚ¶uMÍ„q•ý0Žã8vzwÖ‚”ÈåÝXÐ%ÑIÞ›¦á•çôH¦Ý""Ú VeK¢IE™ªRUÌÓ’õhÒ¶­Ú$ëµ(½]“MvƒÉÌ9´Ò’Hß_···Ÿ~úé¯üò/ßÞÝù×^ýd²¶Ð{qq±îÎ4)Àyê`ÞáËŽ'Ò)ïBßfJš›ß,§f ^™Ùˆ™ž'¿’&67Ï>§kc3*_DaœXK!²^·óofq ´ Àªs-{T”³Í—}3-DÙÊ»–Óô["èr —½XM@ÙñòÍ:æËl3çÃKeÑ;ffHÐ%0-›Å§”ó±pZädÞ'xðÔ¯-ùù üð¸NÉ£`©Ìhׯqìûa†q‡Þ«c¦Á÷’¸Ãª¶DT»ªij]e]cY£÷½„1x Y¯Aˆh|Hޤ˔áÐa«¦V ²ÔÐyÍöyÎ×9”6¥;ûkµè*e—XD”¬šB‰|UUé¡DÕÕã8j@" Á—¤sÚT©ƒ&踙†üã{ïÇq¼¬H‡bA‡×‡z™{ŽÜz˜‰  ‹2c'ÑEyý™½KçJZ¬=ÒŸ— *=¯Ñ\œ“’a¶”¡*×-Ül|ùPÌÚxn4ž¿ ²ÔÂÊ>•Љ©ÌUæ¼ØŠvbÿ¸~€÷Ð@¾ú<ˆåòËÞ•c²xŸŸÏrÀEËÁud›Çs^hY5§{Àqݘâ…3:à³IK ‚ ÿø|ö³…”ŸÖ{óƒf©Œ–Œl™ù¯ü‹ô>éѰjvÕéRÖ;2s×ú¾ïº>úcJÑʬ‹,Hm]UUÎX½èarœtãð€ÐÊû+”Qá4ŒÝñ¤÷†à…à4°9‰«¢'&5N¶Ö(SÒÒ©uRUÕr„Úh2= ƒ¬õ=*Æ-\RI=Éå#á¶±•)|8/8¤²¨ü·Måãm™ ÅIÜcb`7VôU«²¾ÌN©(š€˜²4`&‰ÕŠˆ< ÀÎÙo}ë[§·wÎZfþí_ùqfGkgÝÏN§iâ€Lž¡6lPüG4p)<ûžÛÂ2©„—¢ÝÅàk)<7ž,¤ å4•œ+'0qâLy+ÿD‹y/×É|.–)¯¹Ù"Éž¹Ò Iæ® cˆÄÁ/¸¢ø7µsŧ¢,$ÅÄà$cfHWW²w2©Q%vC$Z\)–ŸóP¦ãœr.Z›³MMš }œ¾Z0ëó‘_‡Æz81M ì!ÄP’jëá "€!#êíU>óòœôü}žçôÖ¨û;é±Ã‘ÇÖ8ðYï°‹ÆÓ\üž]{ÏT®íu?ߺþJ¤GÀ‘è¤x´0ÄÂ0‘Û"%{¥(àH ³÷¸§Bº¥¸Î“‚VXKjÄ$âÉéÚ²DX"µ®€Uß[Y œá?ÿÅŠòbE82Ÿ£;”n:©šYuºÊë­åÌßßßßk|_Õ¦Ûùv#âõF Õ0ô8ÆUÌ·u7ÓЇoûÛ5Ygíw¿ûÝ'OžüäÕ‹ÃÅE¾[¬ Võð8Ž…ÌÖd«l"â䫹ljìj9ë†|Ýbsç—•Ë4+Úy„)9ËÌx& h3ëW e™) eø)3”£Wž-rž÷àóRèòï$­gÎÂÒ *>óÒueê¯l¿7 ¦Ä\ ¡ì«¹¬…9†#ÔJ9ʯˆÍ?µGDDôX‰thàTû¢I뮿ZxùÀ¯O³©§0L{3Î8åæ4]z*$µ~Öh%–ˆ­´T’ס °µ9Røî‹ß Áy/sÛQˆåh/Æ»Ýhø ´mb7£Xcï“Öåç-6“6ã_ª¶¿zéѰúªª¤m104rP¸D¾¼>x VÕx9"P†Fe‰¡ŽÖ+¾ú1ñÐ(M®ˆˆªZEdÉZÁ¸Ì3×bÅfa²J’ hI›æèN´}ÕÞÚþªªú¾WÇԙɣdë¨DŠ$º4/Ùù³µ–½lr*šnnn>|ò¬mÛ¾ïÿìÏþìÍýíßýÚ׎cŸ93cÌñxåµýÎ9ï½sŽâ!}I„d~+®¥ÌY2µåËü¦ö<’”ýÇÌ@?g‚üŽn¯¢57ó,Z…‰c8×od¦.]ªË.Ái•³èã6Kòd)ñöœ‰>*æFÑË¢£¤ëÝ(_Å,å@‹›ìÎܤJ ˆoÖ°6æGÀ²–zóºd‚QTÃI¥ÀqiåŸG‘„B°UÝ÷á/n_HèxÀp0ÞÔäj²¯œÇ¿·ÎÝò¡TQ)VËo±ÀJ`~Ï´ØD³¢Š…DÉPü|ñ¯fzŒÌÌÖØH˔ѱ&ûþÀ<Ùg!³þ<ó‘UeË%«€d­»„d­­«F?ª6Qo©¯+k+"rm£ÖÈ”üaå*2d–k÷Ü‚N7¨óÂ@€µV†HzT¬ Èàw<³tª×&ǪKSïí8zˆ >Üßßc†ax@eCôGt½¿8ì÷¯_¿>uÛ5:ÎÙ⺪*õF© K%mUU)/ÆaÑÙcQ¸ä‚¾ÈJ漦°"²¸éQ<Ÿe—œÓݶÔNDÊž+-íä1Ÿe*äÏ‹7¤’º•­-™ÈYóV¿]?,zýð{fˆza&Ä…”0o“æ©:+sà,Ë_ç/K;—s=¹|èËI@@²cŽF×:¾<e8²±)`8)È“Z’g-˜¦ ÈY×ÏìAM0èP;°!À>7`cWp¸\_e9?’$_Ÿ5¦…6X-¼b§’¿Ž•7Æ$§ö=w ÙÀ¦„­|“ÅÅ¥ðCD8K_a处ö13‚Šˆ0²v@¾—³åãW&UùçïÇó¼X ±¿ó2=¯|G§÷Û:à9ðM)ĸS0`¨Ùå€KäcR›d‘d„%[ÂíüÛt ID&#,SÜ .­Û¶›¸è¸¦¬ãÌù‘H&wÐåà33`×3$æhzMYæ+•ø:fˆ¶ÞlÈsOÂMK–Ó~@Õ‹*`_WoØJ÷Ÿýíÿèb׺¡ÎÝ’Óg™½#åÈ3§otjð¥¹à5¼â}c¿\¹_•ôèøp8\__ï›V£áÞB0ó••÷êñØ©Wd…¨ÃáðôéÓ«««º‰ŒQáöööÕ«Wwwwê:ªmÛËËCÓìh: ÂBð> ƒ†aè}¡;Ir׬®ª*œ‘Þlê®”!„i¥ª‘‚øæm@Éç 0mÛÞ¼z{<5pAÑdó,FdЇ6 C×uÄTÙ*„ðᇎã(|vCY‹àAD———}ß»ªª“7PI@›å±z.‘ \K†~êZz3 W´UžX%QS™FIXÕÉ.C´2Â*y¯òd„‘ÀœR MoJD_mÙ°Ÿ \ŽaÙ°…µóô|Æs–œ/•ß1â4h@-–i€ED9ò +è­“Gο¶‚æ”ë„ÎÈÊ2×ëJßNGéó'!ͤn°âŒLr£çã€)ü°Lz߉ѶB0#Õð R$ÀÄ2BË=:òø»ßþñÅ|oö—Û?XõbsÉ\\ôóJÅŠN;ëç^Ç¿ÝéÑpS›÷ßùuÜÞ¼mš¦ÏÁ5µãY•µã8ÞßߟN§Ñ÷,–L¥Q ž?þìÙ³ý~_[£Ð5Žcmï»±;‡¾ï:?Ž’L1Cã8ÃÀ†ÆqìºNÅ­Êó…?2sUÕOž<¹¸Ü«4„¬=KúÌÌì)Å%Z"ë×~ˆáÜ#_•6¨%S1ŒkµC‚à,`ç* qÎ\]„£‹ FL IDATu­ÆbÌ\UËh ˆ„Å ‚1QÕͧ°¯÷AøØ ¶©‡›[f68k¬aÉUµÔMÕw×OößýÞ÷~ç?ø;ÖÐéþx8\½ß=¹jÜEeÚÚ5Ýñ<, d¤nœräÆTÌ›…ÉS$ÁÃÒtÑ«5"Ì$vå¾JóÑáJšãìwB£=²%½Ÿ&ÃD`ˆÑ 5J%C xÍUÄZk2]‰æ¼ h,Y@X˜ØT™gŒ™ôEó²ë+}cÈÉ\U—M¢ãüÛòYæˆËœ—Ô„v"<3õÒFªÅ²™ü‘•> Iª ½KŸB@$ú)OëÈA-Uï«MK¾–_›`3v›•U‹ìp¼­ÿ ѨëR{baÈXkb%^½ƒˆŒ¾GäbÊo²s¨ˆ!c‰È1±Hï@A ‰áäð?Js½#ØaÈßY‚5ÂDFȽ~,¶qñZ³J3„ AýÔBˆØ¨‹4aÐMª¾9\|ãáàýÞyñí þ R½rØ^ ·5l€|þÅP÷îÒ’ß\Y2Voœsœ³DXúc̘ˆŒ*P4³‰°2î‰O ñ¼àˆ`íäË6þ ¢hþm ]îUqþx éÑðååån·#Þï÷c𞃭+“ðY•²ã8*FZkÕq´zVYh×uªøTXÕœ4ü‘5•µw!HŠ£îûS¾_›5ÍÌ\· ?¨-Ôu’qJ¦}±yù¤¯Kyb &‘, Z¶8Û–Ä.3©Êv»ª2Æ”1ws΢Il&ÿ‹vzYs›B ƒ'`¿ßß…þòòò“O>qÎ]\\XkÇqdçÜn·ÓÍNN†a̳S^æITx!B›µêÜÉ=upˆ•Ù¨ˆñ W´È™G yfùLÓ,DeðäO”ˆ †ÌFœ` Ù{¼ÏèÝ´0&g[²J‹ŽHºQ3Lºí=]‰XÊ2E¤ Ì7›š­Ì@ŒÛ=™D%Ñ´ZÛgÁíÔ,çô†¦¦&ƒyA ÀÓT®šmù"Óbl×i±§$mÉÅôå“÷/%1,B[øRÕÿéGã¹iêÓéTÕ àÎ])z(ë…‘Š ÊŸWNdÖß&³g±D×2žÇ™ S× `ÇའMðâYåɬúöíÛÛÛÛ®ëü0ÖuÝÔ»Ãþ²möÂtw{ !ø0(›8Žãñx|{ìFïYÆÓ‰…ާ^DÔ8‰ƒ0s7ö\ÜeÊbã¦[I¦pº„Lq j("^‚I°—÷°ˆÀN~bO ¢Ý} ;¼K!ð”3©\Û¶UU©EØ\ï LúæÉuc,3«5¹,ÒïJu]?þ\D>ùä“W¯^}ëÛ¿ò¯?û´ïO•ÛÑáp°Ö‰1À9— q(bW$H–<¤(¤ÄeKžÉš@1yƤ˜å@åç¨eÏæÐ©% €Ôƒ%» alù·¼ûYv‡i›À•ó¿´h?ÒJ+žß”3[¢T†¨ò/ I98’M­æS#"XåO+%O»@˜3¬ÿKꉬ'Î'¢¯š[¯,'íšóGJ²{Êçʵl¬íÙÒJ"u=< å ¾Q"-„˜ ˜g$?_F÷¦Øä«\•;[U0oO'c é~%óNèY^<'ÛeäõŸ·l[HHq sÞé‡äÆ ÛÒœ(+•Ë6?¾ôèø§/¾øÞgŸ9Œ~¿ßá.G¨¼e†ûûû»»;µ«r†²&Rmƒ5Z)ë›®ë4C˜]×1Ã{¯è €œ‘d:T^1"/7M£7€¡€g"Åɼ¯¶_2<êÙAÒOŠŒW¢_Ùø0² KÔ׈Yb©ª¦Þí«Cl …9'²¤Æ¢à=3ÞàØÎ¤Ý®éNý0 ík~þùçûÃáÓ¿øó'OžèF=\ìvε»zG…Þº®'“¨ù`õœ˜©0 eíOÍ;#¤-;"ó<™Âë ”¿H%x,°¶,*+•K`&²Ñ§w¶€-˜ƒ÷`ÙêÝú¡ìï"CîÅÔ÷ø¼tv!‘C-’5õ½½½½¾¾>û7oÞ¼zõFeûßûÞ÷¾ù­¿á½¯ëšRp*¢>µM2),élæo6håœÎŸóC.jL¶W“²,$©(ó(’€KB6g‘ÚS“PP·”ñ¨d§¸¿4©ÜS´2 …ï¾ÍÞ-RVä—@’û{€7Æj#2å_Ьã{š¾-ËÏ ù½¤£ÀÂK?jüÍ•8J¶Œ°ŒHôm'˜¢`$\I%¬nÖAl3|Dùæ.$_Y.³-–b:Är’cÅëI„|{Jl –ÆÚüúÇØwâT…óîÖçg›b.¶7¦X½p<“Y‰3ÔÒ*ŸLbËŒçºÒ^;·Þ¦[yåFÐy\Œä#DàGÀ’܉¤ÇZ ˜ýþ¢ÄżBß™¹ƒèø·ªr”éTq´1FŽ<Ž~=3±ò Æ˜¶­Ôe`c†páåCWva #V\E®]?™| WYôœ˜ês ¨duSY;Xk­IN- Yk]S«z(Ü0•ƒF¤mâÈs™!c(£ïDCÏ©¨Çãð‡ø‡ÿðüýÓéd­ "ûýþ×ýW¿ûÝOû¾ýúµˆœN÷Ÿ~öÝ_ûõo«“j¦˜‰o9­¹ü‰;)°yÑ£¢sœÎç}ÊÙ¶mžËŸHbÂM:r«ˆˆD™Ö@T¤é'˜Ö^¹Þ)‚^æŸ[C•µH’¸”?)!pÖ‹¹ñTþ›½•¡X·"kdžRC±™a-•ÛF[°0GÎlÃkúm਀tqÖSŸÚ•ŸõÀ¹R°A…°>Åê¤Ìwªó‘\&EûG1¢W±ÄdŽbL°@üÛîøÏÿø_â2IA¾ï©‹ÙŸ`ˆ1ó- öYB3?‹rË‘%ÆÖz›•¹úhÍì+"ZœTIzŒLΆaìüh•ÿkš¦iŒ3%‡Š´ç›ö¢4QΤÁ•µzƒ™ÄZ] µsh›ÊšèÌ2[™]Û ÑvµœlleŒu®ªëZṪpwOýpò²êjR@ò"  Nn+ÔŸ{Fß W®V§ÿ;pÛº¾§®ZÛ„0š |¹ß]__îklFëlmME°ÖTÖT:2@¼!5+%6ØíÚáöÖ’4m5„Óïþ£ßýƒßÿ:sW‚ªÚ€ÿâ?1¶2fÌ}ôѧŸýÅïþî?øgÿìŽÇ#x¼»yS×õ¿ùôóŸþµÿç³?ýú7>…aè?øàƒ7ÿ/{osÛ–1末ÙÝßž{ÚÛÔmªÊ¾·RåÂ…b+‘b)<øË +â…$CQ„„BPxÀˆ‹CEBŒ;‰±,—M•›à®êV¹êÖ=÷žö?·›ÕÍfð0æš{í½ÿÿÜ2- 0°¡5öj+PQµ+éIRçÀZ;ÝÛ-S–‰¤ÌÙ¾ ‘0§(Y¿¡ˆl½<˜ÞŒ¤Ó÷3>éë²½o8 ž*ˆªMÔ…€J©<Ï˲̲LTyßÿ#Àø'lê^°VY€!–À狱ìœG6BÓé´nš‡v]wrrúÖ[oÇã'ON>ý©ïªëz2™u]—X©Q©<Ïe¬¼¦fѼÓ¢ÉÕþó,_¥à^yü¶¶”Èüú¢Årؤ§“23T5ÒsL–®5¼h‚/ðYï6¬5øý¶û’6v/!÷3üs÷„[û‡‹ûÖ~Ü‘ äØá1[v”­Îny×Üä'\{Å3嵚·®!fkˆ®lÈ@€ Á3+fgäjÅQbvÎe™‘ÃÐT1h„€F7h!HùEè©^s‘å§‹K‘&ÛŲÍ×Z|Åœٮ†%xÀ?˜î7u;|¾»# ¬¥îÊU–í‘ì§™ï]×2â<ˆÃ¾Y[÷0<íÖôxAÚ ÀÈA!`¦Ë¼(Ë’ʲDD•E¥õ\‘‚qaMÒ»5i¢ŠÓ+7Iµ•?›¦!¢ÅbÁ} —hØÉ —-õ…’BO4‘L@k/ 3²Y`À•ȼæ"êñDúj-éötD`À+¤"7ãÑ¨È 2xëv½tÏoZë®ëì¿Ó_1QQ£2wÞ?|øpoÿðüüü7Þ¸{÷å_ýÕ_ûÁüÁÅbQÅÁÁ^]×é-ŠBîŸÈ‰wõ3DrÂѤbnãÊÖ­2³àèÀÒ»µ.ÇÃx½½¾ôä—aŠ7J}©`ø(~½)û(÷ÝK—K;ý5Ôª[¥d·VØ¡Áyë„ß!ІkLÓ×*ljÒ»ïÚVO¯û6 ˆ8䏸nÖÒHWE°—"Û3\uð•MƇ )MÑ6Êòû“‘Q®Z€sd½²£/²`aÔåÎ9„ ØsèË%1pÏPjsÖTÀ0ÖÅÜuÀ €¦­Ø”õ wPu €‡jœYní|©'fØ‘­ñOÒ^°M$ ˜d@BO&À} ]âڌ뒼E‚Ð0ÀàÆ,YÈB%'sî_DAÌ[–eeY#ˆcí2–=Øt¦¦×>-‹£"OÀ–5íADcŒ\Q8³æ®ë™Æc…È}‚‡ïÕSÁ`q¡‰ÔœPm»W(f õÄJÃJoo}0‡adPêZ<'­u–‰ò¬ív—¼¸½©Qõïp´+¥{å.ÇFCkÃ;wÚ¦:=;óÞïïïWU#ãÇÇÇo¼ùºwA¸©E·6Æ8ûËÌÞ{¥°WåIÂÎ{¯µ=T" ™w†+Ëfˆ8ç0Äq˜,q}^F=”†5£S:UZ× ü*-|iÿúözl/æî]ÅÅq‡CcØÓGƒ°{3Ó v™†êw÷ÕÀ WLŒOØ> NÅÍ=»gÛòIÃ5ÇÇÞŒ›_íÞÞÖ…®l×}‹ˆñ‰+$­±!gG‡G“1¸–Cçªòm¬íºÎvv¬08 zw6"zfžz^LDTülŒ0Dµ’¯MI0J;ea–¶v{¥vÊF3Ïnxÿ©ƒP¸'‰AšŸ<¦~aÛÌÉÝä{Æñ+‡Á'Õð|'þ1n/OFål26ÆY–ç93+$`/ t༑ןVOèqKðLåÅâõ†E"NÕj%¼÷B; #ö«°À­(sMÓt¶“?% ú)»V€úˆR½ÀA$ Á^/Œ eLkTcQV4£Ð"+ÀLQa2£ˆb¤càè6‹ÿ7^Œ!0Cº¨ØÛ)Ö¾¾;çÎË‹³o½÷ÞÞÞÞd2á~ðàòb>›ÍV«Õl6ÓZ¯ª¥Øó'“‰xÅY®µîã‹7 €ž 8-²TºâÝæ¡A  çØ,ôa`i€w™™©?†™ÕŽ8n$9 výÛŠæ5¶8ÞDßçïžû'=1Eìî`¬v!7ƒ°¾“ÏëÚuÈ·Eu¹ –Û^bkÜp` Ú8`@*¹ædêçMÁK.[ µµ‘¼òžëÌ”³Ét6+µÊ΀¸éºårµXΗËå2³Î9ç­õ>h@EJ‘Fvµg&`…¤YìÑ„X°+Ó8Ðmç@¬[V”vU‡¦›v]![gÛÅò¹êWùÃÝ[¦iB0PQ ´)3*Ï 0ʘÉd¶_މƒo»¶Z]\\Ìçóúñ£¶mëUåë6pÐ L„„À. " ÄH&´A}£:Ý) 5-]Ï««¶ Â'3ÅèUç°àyUeùF`8m¤7ԋ܈€è}ŒÎZK?ÐVRêöL|ñuA€ (¸ÿÉæµ®×úU뺞}<Û À¤ Ó”ì]N*±² ­ä´>}sHÚh3]¸oiU•,Ë@)•›¬ªªº®½÷]ÓÚ¶ëš¶És*ò,Ë’÷W"5˜Y\È¢%§ÀlèåDÔ¸ánš¦ª*çœT3”³c¬o•R €ƒ)2ál‚#¢,7B?â½uÎ!1`@b$&²±¡Rmh]k_:ËÌÆ˜wÞyçK¿ò¥ëAð~á~á'ÿÆ_uÿììL逞û9-™Ü†co¯Ç`f׉žÞ UÿÜ׸͛1†òPÔRôǹ½p,Ù;8 šÁ×¾NÁÖB¦ŒÁ{sZCë(è4G“Â*3L"Ÿ‹,ϲ,Ë2)òÓ¶m]×]×qS ‡µ!TbΕÃÃ,d眄k¡Ò uBUU­V+k­i™Y”ãº] ÇO¦X ©ëääQžιh=Æl€E*-…ÞoÀžè÷¯¼òÊ—àVJÁ/þâ¯üû?ùï9çæóyÞ9çáÞ½{Y–-‹'OŸŸŸ>zô¨ª–`”s.ËŠÅba­Û›dY¦5O&÷€‹EUU"TUSXr| Ð« χaØ\&¶÷øLa­ú§‘ÁÅÕ•œ¢£?€E†¦Aa¸­›v*vžWìņ zýÕðöxЈÔsðukÿþ¶æ«Æú×0apz7‡~;¼Ðm·w ßÁݽIó'V»äÁ0G©A£­”Ѥ•mPQ €H@e92 r}s4^^ÎÏNžžV—‹ºªººáÎ#Œµ1…>Í- ý΃0 !8Ø>?N‰€ðwßyy94©VN{,ÆÁvÏŸöÐWä…>üpcZ¦™¶Sjt=å6h×#ëQÛÄhƒFa8ôYb/N{ᘌ.Æ#ßY­ ËQi­Õ ­êg›¬˜ëÉÇ€b•TVÂy¡Õö…8Ff ¢,Ó!Re‘1¹÷Þäz4)Û¶´"†ÖvDØu­÷ŽØ(Á±gF;ç$Åu+ ÍF£ÑD‘îZg­].—Ì콟ÏçJ©¢(q>Ÿ+­|Ò{fö޽÷ Tf”ÉH•¤5ªŒÒXWìP&Và13cåÈ#tÀГötïÃËóìòÒ•eᜳ¶“"]Ûƒ1F!µ]‹€š¬u@”g'û{ËÕe³Z./Võ~ûÆŸ¸}ûî;øå/9xõôÉåüþ7àÏýé¯|å+óÓË|TNÆEÓÌ«†Ë2G!ñd:šLGb´—!]ž_Öu]U•ÌÀH!Ä$ ¤+Ìœô@굈|Aë¦Ú[ž@õ–dfŒLû¢¹õ׈è9H@ %ºgfî Ô®l 3¶àg÷[hx[Ë+í¬vòßu!r2å§Š¾ÿµÑ8Ú®“ágÍØ• œ™Sôu víÿŒE«¢ª$aǾ?8b¤*¨HŠé¶1ºŠ¢å>‚n Ê AÊC#¢FLo¢\ÚoY³ã{M^)!vPxñœs$¶1î)ºú2Ϥbê3* È>X9ÕþtZ7ŒÛÕÒ†0ŒÒ¥)JS(eP)22?T>Ò¹ûl:yé¥G«ª¹¸<òäôÑ“ÅÙEœ³Þ:ö6hBÌqäV¶`¶þpÎ4ô(λö:¶õ.×%<-`ül~6ÍVeöªšžw7q©ïë‰Çf1ô:'Kr1‚çÀN^  Qù§ÀéE ˜9¸A¶Eo|ö€. ;Å/Pi^Är‘R­µ€}®œ"``ï>¶zñ ÀQ™—aüŸh½¨m+%£±Òg:Õp#. @àLCŒÉZë,Ëò<—áyUK¸¯èÇZëÙlvttT5+k­÷ÑËØÇZk&|•xco]Ò§±O:´Ö ¯BHÔ#Y^)Ý’ $”’\+O8wµ˜Œ‘(2Ñõ+éPa: E1ï¼'¥Øk­´ól- ßF)Î IDAT¢>*ŠâÕW_ýÍßøÊgÞù<ÙÓ§O/.ΦÓéÞÞÞ7B?|ë­·~îç~îììì3Ÿý,Î"å…n[ël½eBDµŽ뺖À·®ëDÜqm›II ±hŠYgÞÛ$?mYÛ†(˜>‡Ky€À²cú† í-¿k²îG~­U§Ïísn~›nlw6î¶kv‹çî#ÌïÃýÃoyèÁÝqâ$xÌqh˜ÓuûY[ÒÆðÒI ~Î<¿ ¼i<À#{cFo°t„ú•døód¬ÒZ³R¬(( ™A!BÀ@ I3* J™É²l4W«Õã‡OVó…]zŸé”÷ÖµUÛ8@Y®5¸ØCÛ=GÖFµu…Ø×Õ(Ï‹KI2Ž}€Þø †8D©h½ŽE!RêCg30õ:kÏÜ&À<œ<<0TlÏÏ~ã Áñº)÷1n/(ƒRJ&`’§DI@D"DŠ•ˆpCMIaó“Γ´«´øJÒŽ÷¾hZDœL&ÀyžÞ½{·µMÓ4MÓyï½ ñµ'­óÌ“eY¦MÁ¶Ýjµªëº³]Šô‘0«žëÃ÷fmMDJ™>ò<ßÛÛ»wïîþþžÖŠcDèåWyÁ’iÄ€€5ˆJHëRßÅë Zë£ããÓgÏ”R€$ARˆè¼S ´Ê23Z.ÏG£ÑÓ§Ooܸ1þÂ_þK~øáééééééhTüÙ?ûg^ýõܾug2ž>;9=9yVeQÁãÐRÅ‘32©’ʲ”Ð-±öKüyèâŸRpb½úÓ\¥%Õ{»5†Xxåʾ;Ù˜cB DÖ3J“!oØžo¼1ө–ÍtpK»“¯[Ê®reÆó§hêæ.*¿âx[ïìÿ”õ½×€‡'L§Zûˇ?ܺ] Ý‚É­«§Ã®ë¤¾Gbcœ"‰v.'݈ ™ÒÆÒJåd´a£¼’Ü2…B %öšH•*3Ó¢È÷f®k'G'Ož>}øpyqÙYGž ‘R/jh»Æyß5E@WçˆÀýö~®i0„L`3Òu/ðIwz>Øï¡·ë"QR”¥Ç’âµã4îŸlšÀR£ÐzlB2¤ã·ÐWf•ýú¸¶€12^Q¢o$$5 ñß@VI@º€·æ 7u—a®03cÄw[Ng⸕l¢¢(ŽŽŽ˜TUµ\Vu]·M'ez‰t9ǃœs-©h$Ô$u˲”(ëH¼E.3…üD8/‹b”çyYfBytttxxhŒ¯sßm̓z¥,AåcÅ}1QC§Ó©¤NýÐýпøEÛuÔ‹i­wÞCfhµZÉÎ×_ý­7?}ÿýG'OŸ^œŸ·Mm­}ùå—?óÎÛo½õÆãƒÂüÈ|ýë_olç=Pµj¦Ó©ÉÂK$‹¡sž™SvVAØ·]´ü×sÎZë:+›þÅõ£¼FïÜÅ<Üð7•ÖŽgî•ì¤j_ÀýÊ4œ<[ëÔÕ+Ú¶&qÐ^«dìŽ@º죾“;wtýá %ð[ÇIm~›ÞÚNòGÚ™$ÔßçCòÖ l]exÌðÕMÏ‚"g5 ¤w‡´l¸ŸãÁ}P„€ …ÉŒ1LˆZQf × ”F ÂÜŽ:x #*PDFë0º1šŽŽ§Ç§Ÿœ?}Z].¼uüîÅ3V°þ F{=3cçëàßúj/Û2/l[§“Sn•á^èf&dæT Cþë?úGŸÆjcl‘yp\ø•s Rá¤|³t©@(îùMÔ¤_´öÂp|yDnMo’Qk4 4 /( €J|…2“‡ÇÃú­Ž+lúª÷+Ø! Ép_eÙþþ¾1f<]\\œžžÏçóºj„ã˜|<‹¥Z*9k›¦©ëúÙÅùr¹´ÖN&“ããã½½=!˜4 k•)¥ŒÉd¿6‘w³,Ër”û`ï|r` %Ä¥gCÂef!öafäXÈ3$þKkýúËo~ñ‹_„^us=ód’/5€>ØÛÿìg?÷ïüµû¯üëñËÿ×ï~í›ß ²,§Óñg?û™Ï~îíÉdB*,–Íü¹ïÿä§ÞúÚ׿qzz*Ê´÷ÜvmŸ¼!I·¨1ˆ@ZBÒj²·/æè®•4mÔ¶»}ª'!mËG›Ö”! §Ê0+-а³¦$X‚MXM33 ³†k}º‡täpÏ`ú}„q%jÀšjaS>ôá†L4ˆ¨Ò@m@ã@*‚÷–¨WíîÁWp4ïð•ØÉÑå̽m,U3êËöFfÌLD 5Qrß‘T!Œñ ˆ²MÁ)PRP‘B¦” ¶^eÀ†ª<:|ù`ï¥;wÏ?~úàѳÇOªùüüÅÿµr£2v¶°Þ?×'¾çÆ+uõÍ Øz¶,"2‹î‹(±ŠBÎòPúº€ÐûkC*-ÍÈ ?ÙLy^ª—œx­vXÒFotÙ¤šùðǾ!¢Ôï ä©/ +Á%[è Œ©˜'Ò€‡áòËP¿|¬¢Jõ]kÀ©î}ݶ.ýš.®YÏ®ëºÕª¶Öje”Rãñx4šÌfY–)¥ÀfFQìÞûàþééi×u7nÜxíµ×ŽG£Q–eyAJ¹©Ë¤µÑZ¶ØëdÂøÁ›y2ýXõ/ 8fÏlƒ ÂäÃŒ}’+åy¾.¨Œw’ƒ÷!„ÌdËekŒ±–/./áÇ~ìÇ~æ¿ûž<>»ûʽ¦iž>yd­}íÕ—»¦ö…9ØßËËb1_½ýö§nܺñ¿ÿoÿGÛÖ‡ÇG‹ùJé ¼Œ¹Ð‡%¾í­wP¹Ê föŽË®sÎ' ±íº.¹Ï½÷Îu0’]-9ý9D©- †€·Tº4 p³1Gr¾á¥‡ÆØá4ÞºÐpçÿ»—bÀiçÎêÙ›ˆ7ÍÏ阴µõíîÒ¼Õ©þHÜüs£¿W^qk_ÀÃk‰È«µ†¾ÀW*ì‚ïñà`Ä$¤2mˆ(ÓZRù°FBÏ iT–&ÏQ+•e4)DÌž<3" “ÇÀŒP†{U–! °*³[“Ñäèh|´òôéûÎ3¹`'ƒÀ€.U@ÜmYÂéÂM«n5ÎójÕ™ýQ`Ÿ!æT‡)Õí¶ŸŠÀ"Ë2ƒ„7ïx÷ãoúOLÛƒ™/s<È ¿‘%Ü+R„`OEùq­ºpM{á8†í*¥B*ÍK zË%ë?!n0÷å´Òr/Ë¥ó.©PRâW8?Ò Å,k½aqOâo­]­V]×5M³¬UU!âd21:+Šb2™ŒF“rR£Lm†ªª.//O/ÏÛ¶q.?>>ºuëæññq¯éÊ¥ûV ¹€Þ1)äÓ!:@Qª¶Å|Ñ€™-ƒdÇlãÒ¥@ A%å$£Ii͉( ªÔ9çF崮瓉zóÍ7›¦9>>⬮ë,ËòÜœŸŸÖM5²¹1¦,³Õj>ç/nO¦ÅééyžÁgÙ(ü±P¯Ë3궉wˆ•Á\QƬa”\ò®oÞûÕjÁÌ~³¥ug¨Þ%$Þšir°Ô –¼2샶`'æ=¯É:zrÍ+tÖ4Q¼í|u’tíÒ=ħ­³mÁ$ïÈ%éà°Ãœ•F,A‘Ó¤‡Úþ¿8&C#nzßÓnhÏ >Øu*°VZ)Èðp™‰5™èæU,ßfÚÈë$±“«¶‚^à.ó¢( i“gR €<3G†5@ "UÉP ‚L»|Ð;mtñÒÁ­Q>¾õ’)LÓ81Ü$|}óÌÇãý7Æn©T‡V¯*f €Àb&b–„¢è\ˆC§(ZÀ¼‹»e`Å!DpMOtVâÈ|ì7Cé0ͨµ„ÚŸ!Ä ¿QÅüÅi/G€uj/3+¥xÀRÅr&qÐ}üŸ¬Ã·=pÓ´²‚ ¦Š3²ç™bYåbÛ¶uÎÕEÄ¢(BB(±Z­V«UÝVÌœçÅx<žŒ§EQE‘ç¥'[(ÅÀ‰J¬ÜbKT—!æK"Më':¤5"JÜ–4¤õR;7f)‘d 3{F±ËQZì°Oxef„fÁDzÀ!¸@ ‚ç¶mp¹ôggg²®É€ìííÇåªZVÕòà`ê=´íM˜½óa2Íe1NuÄúÌ ~“@jЉä•Bè," {‰tDÎ<2,Cµ8„ж­<ëa ä!>mM¶$ÄP>Å­&r œé°Ýî^wÉ×̸:ýéJâ9-ð0:l÷–¶{¨ÞÆrô±ìæ†'rx?WvóÊ“?§S»P<ûÙÒ)Ì9¨‘”RFe‘ §`M*„À}ñ8Ú Z) ¢Ôu–! L#°`0* f©MŠ ƒ ˆ,ÜWMg1ºÈ¥ÎYÔ“ñ¬ÌÚÎgd52ƒwàÁªbÚk_=co×Ûà½ýY>8»QL«9‹YÛuR "0„À¬{…ˆƒDX21® HlÊ7ë瞆z n¯™Aëg×O×}{áX#äZ!’bc”B@êW=BBÝרBÈDS‰¡UÑÖJ¤¢¤ŸJ‘€<ËdufÆ®sBûì\`F¥L–D$<”Âý$þÚ”4™L¼÷çççDÔ¶m×uåx4§Ó©$Øè€ Z!@èõÏÁ_-/úÑh<ÊK Bð¶fßê™™cPD)±ˆtÛ¶DTdZ!gŠ}蚺­«yÓÚÑ(k;®j›—Î3øà¬ Ѳ8¡Ä2´‘:½™‹ævùwÿþñ·þ£ŸbÀLHƒ6&€…ž[˜NËÿôoÿçóoþ‡ÿåõ÷ÊÙlu±4ã|´¿yvþå/ÿÞÿÈ­,ËFfßõ›¿ù¥ïý¾ï½}ûöý”Ÿm;aûâ^¥æT˜Ïˆ,©¯øê ¼çk Öý†Ø?”Ñj`¸gÒvb«p.HžX´|¸†wZAGÛ"câZCD`/k_ÜÉÑ §ÁÙàQÌ8fï‚w  l9Gzá)wz rq„ßs?[¤dTêä•+ň5´“ä‰z„Ìmðˆ€úlZßGçÉŠE½ £mBŒ´í¯!W€ØÅuPâ£ì“›@$ˆ†ã €¨ˆ~ì;ïœ DýLâ-rc ÷ñzÈxCDÀ*Õ“NÑ¿”"Ð6XÊŠ@Bµ_LnÞ8ôm7;xIkcFš !¢aÒàƒcf%ãÃæEmF¬ jjðîpz°hš „K6èÑú$_ÚÊ ¶ V¬LŽ>øÎæYÞu]1UU•;xð+¿Ò~øøÝ'—\ß/Ù¾«Ù?¯.Ú¦Y­V¾³R˜CpΡ<âžwÅÞ%бÌL„¨"´Þ¡R1ZÔ n$030KE2É1±$U™cþñ:†Zi™$qî!öÅiØõn/ hácÞ^8E˜ž„^Ì"/f[å\GD“rD‡„ã ³«ªêÙ³góù²k‘BÄ|ݬ”ÂàëÃjµjªÊZ§”7x€ UiÌ<™Lž>},£ŒÖMÝ! µ÷çó¹·¡ëºôÅÿ凸/†šºÍtþìÙYµhž>}|çöÍïýÂgGåËŠüÅÅ嫯½,ÑÑ_þ­ß­ªZ‘IÃŽ½µVÊBÈWrCë4YùòøÚ3uEh’)ò!P%}|DbçBo–ffnšeÝ¡f*Ç>x4=:O&oþ ×é†y9n—+$ÒJËÙªÕ f9äÚLöfí¼+³ñ[ßýi\¸æÑYæGMUW‹eÓ4ÎZßÙ®i=‚µ-"’¢™ïgf D 'D`ð9Ô²€÷^Þ>ašÏLd%”N‰C`ðÔ·žôuþcß^8VJ‰›pˆ§H¤P01‰^@a´Z¡–÷*Xm¶ý2×;w;ï­÷6„`mÛ¶uÓTy+7ÈR’eÙx<.ËRk­òBÌ੨Àd2Éó\ŠÛ÷Ú•K~Jì]‰©ßr¹¼¼¼¼¼¼t.d™ÕÊXkM¦‰@)ÍÌ<÷7xþ(„ µ>˜M•R{ûmÛžž=üðÁåå‚6Es¨µÊr H1ÅÚáJdbq']Aà€ˆÞûÉd²w8[œÍõF›¢(æËœŸ]€”kdpÎÿÀü«ßúÖ·¾úÍo–å¸0U]×]Óžœ?¿qûÎ7îß¿¶æ@°®Ì‹ÕrÉÓé´éZÛuóÓ³‡ÿç?½ý‰OÀ÷íb^WyÐ*¿µ§êJ»q1:kmÛÕuݬª¶m«ù\€Y4ã½Áµ€I2qQp”YÈ=é©0bªJÔ²1úÈãj‘ÆòªTº°½p,o¡F Z)ä]%™U(fgEª'ù¥^Ë„Ty{•ìÔšòÜdY6e™+¥œCdJë²L×u­3Þ{a6nÛVBäSrfäD9¶¶eF`[×-„à"÷?öööø· ¬”FE–µ­&B Úª]^.ëªQJê0$ðÞ„ñx쎃1eQ D¼‚>, ³@Ñ;w¤€/¡;yv’ç¹u]ð<M`µZìÍFï¿ÿÁ¾ð…¯~õÝ¥OOOES¹ÿ¾s¡©Ve™/ªËg''! ëš‹ËÕååbÿhœeYQ1Í)„è F ;A:Ïi×C½)’¹ Z—rÆT\‡%ÆJ)Œªö¦×·„Êb”¶Þqòâ÷ZòîOÒ¥®.#¸5æ©ÑfFY‚Ã0H‚J-=¾ç€zºN&åôóáxò‘>Ð'&÷KoB_ò:Ê.€ˆ dÊöÕ¸m'õI%#v°Y^“$¾¤õyùb Šf!D%ÌÌër½ϱwŠ4©Ñh¤”Rb…Ö:QÕÄáBè)õ¨.€(±Q pxãøäôÙh2!£çUíuvïõ71C¸Þ êœc€²,C¶,:³ÜÌ¿ùÇÜ4{û3“gÀþruF¶Ñ™a£u‘ëÀ¹e'¬p¶««ªª–‹Åj±ìêÆ¶ë:o[%jн   ë*±&q_sPä -Îãd9' òŠp 3ûú»ž;æóöÂ0¢"ÒJ¡V ŒÎ¼÷¤@ÈjzÝW‘,åd‹(%{ Yk»ÖŠÎJ}²¯¼äY–YßÉþ,Ë'Ä››¼Pˆ(+Ú{/)Iòæ‹jkòŒúˆÌÜuÝr¹”ú r|ˆDÑò‚ 8P–™™=ƒ´¿I)­µ1ÞYo;g­ ¯~üÇüŸý³òýÿÊ÷ýÁüá£''>$"EùjÙœ>»¼sûæd2É´¹qãFð|çέo¿÷•ËËÅ|u0÷÷÷§ÓiLŒ–qhÀCððö6c‡óK6h³úаké0ìõ¹«0€á ׸•€0i›ÖiTè∸5·7¿ºVËßà8ú«Oµ{¹Ô5ÂXÁ@R[@ÁZÓÝ(NÑ×¼AK¸^‚6ž‘VÀDt%Çy(: O"GŸBRð30‰ç]ü˜){+ÐóÀ†½6C"µÖ“ÉDhÞÉhÔŠCˆn„4ÃBÿ8% ©ÿ¶jj4šÚàF““Ûßõvðb ëÉ3™Ååg{ç‚.‹üp¼]ÎÄ ³ÂÌfÍjÕÛÜTás[(çʽiÙuãªvMÛÕM½ªVËe[ÕíòÂZÛ5­ïlÁ† TA‹ c$”“a°žWÑãç†ä¶è«…È­½p ŠP+­´1 u¦Ñ{%­1HR£"Å}°A–¢hiDäˆ1ä5¥uŠû¶( ¬„MA%@+8*ûeÅvm{þ%±Z‡>ÖFµDnšFŒÛ¡O*í“%†ñA<{ïäE BE"!¦4ÆÄZ FDVšˆFãboïÀ#RY–GG7t·ï´Î˜ (… !Ó •.Šb\–DŠ}ÒH2,ëL$èWÞ,ÏOŸ=»}üÒhTÔUóìôÙt2/¨èôä znN­éülyxxØÕ7¿[©wÏÎ.Š“3­3Ûñ—~ã·þåésãÉèO}æ3ŸúÔ§¬µÖû/}é7Û®zø°.Šâòòrooo< ‘l!³8U“ø пö´I Ÿ@ȆušÖ°EÌ];gÅ ÚCRøRM¼`_UuY¢ƒsÑ W©¿Òhpld:føU§¾ïjÀòçV•¤à|²ê‹6:ù6)®%'׿b›ø)!~¢'­ˆüf~sºÄðþ‡w®”î„TCi—,òJð=0_!~É DX‡Aøa–e³ÙLø_·E79?z!é¼ÔûщÁ…0ÙŸœœœfdNÎ/>”U»ÆÓ²EDRÝ()¾!q/% ­º%æè®ë¤|"j­QJ!LFcá|.Š2Ë2Ýç5ÊB–çùÑÁÞl¶/¥„ÆãÉÝ»w÷fûˆÊ˜Ü9‚Óš@“²Ö`E: 0#I8XˆbÁPÝdæ¶m÷÷÷ëºþéŸþé¿õÿ'ãÑx±\dY€÷&+°ijìc‘ŠÒ¼ýÝŸöž‹|òàÑ“ºm›¦ù£?úš¯kS˜7Þxãpÿ€PåY9g£Qv±lV«•ÔZX­Vûûû²f¦H¸2LÂŽ Üi&ôµWä/¦¯†šÜšKYVù(ßôÜ4ç[<>‚&…(.û¢§„ì®f_HÀ“®˜xëÐ^ ÀéñÁt·¶‡S´ ¨ÅÌ(êz؈^“Ó© IDAT~Z_’ÓÒWä|5l¢r:A1 šÊ„ÑÎ÷¾¤À!„X^†XJ`‡Î3D ’^‚=~5üõŽmfé,"ÎçsSä«Ë¥íÂëo¾ñÁ£'Ph¯~îr+¤Uh½1f¹\d¿ÿ»ÿ¼¾øsmÆã‰:_¯V™VZë¦*GS81!± €e¦¸•Ÿë:>˜Ù¶«ªª^®ªåª®ª¶ª­µM;‡À€À>ˆ€1šœ˜=€ðg…5Íó¦Í)Á2 ¬£ý_Èöâ0¸ÃýI[7ZÁ(/BF:˲Ž}¿¸ÜŒL‹É£ÆÙ4µ­·]×ԭ툉:g…KR2zú¦i€q4š(¥êºöÞ£2yæ À˜boz µ^­VÕ²nëÆR–çyfr$PU¿6…¦Eg}×Zg}QûûûãñX阆Զí|>?;; é]–eYVhMY¦g{ãÙl2MööŽŽŽF£‘\ 3%BdȲìðð°(òÂK/ÝÈJðŽÑ"úà”â,×ÖÚjÕœ^\¶%B)s„0±F¦‰3R«åj¶×ZÇY!#t¶EÔÙ"ä Ü»÷ɇïåÃGÿôŸùü˯½lÿÞïÿá·Þÿö{ïû¾QÇãŸûŸþçýÑMfy>ºyãÖÃ¥sÁù¶îÎÜùjÞ\N–Óét|8Îó2Ó%²Â@ʇÎ{ 1̇¡°Ì Á†XiŠD…toeÄ€=»4‚Jå~@ê¹1GE gºèëÞ3¬ƒ¹`„½Æ¶¹øtàIAÿóž¹\qd8l[«¤Z%4•®I0`™åëc‚‘¹æ½×DÜ^'FäRáÁ6ˆ¥RÇÃC3xcôÚ1u$ôtÄ}ð3`\Ó@‰Å;ê°”¤(çRÝkC4I÷æB<¢°?3³³’.!Åhy×,úA !RÚ’ò̹îÞ­úŒ8/Œ*KÖŠ|ëCˆHC âQÎ;ç|åx¼\­f³ýÖÙÅbÁ¨±^¬:ëïÝu¦è ½6ˆÁC‡ ‡>»d°äi¦ÕܽdWmž€jËtÍs RKÆ’ðä2K•_‰HsÁä™pRB ¥¨Xkab­ëº¶®jÁà¶>¯o´U]-®mÁId†rÊz©Åq X‘RŠ*y ÌlCˆ²H”?8ù€Ó<ñ ZïAAŒÞ¹+Gô‹ÀR­3ˌѹ1cIp9 i‰Ñ˜Tv’ÔÛ¶mU5uù#%ôchCN‰1Cý8„gEàI{†`CÓÙªªÙbS–eY„Þ—õæÄ™•ÜÆ£ÑèæÍ›‡GÖÚÅbqvv&GB ‘%Ô:Šétzx¸ëö££ƒ½½½Éd2›íçy.žl"R¤µèC=‹¢Èsã½ËÉÞ=H¤Åá-Õ IAáòbBXÖMSwÎÙÀ.„:@dfžÏç7nÜ8=y6MÀój¹€½ýýùÅå•ÏÅ{~å•WÎ/.Ž‹r|ï•—?xðèçþçëÅüüüü·ûwoß¾ûÎ;ï¼rï5xûÖÝON¤¼` µ!,—ËÕje–f2™íMG儲¼Ï—`­ÔP+J÷™«¸‘œ¸ò4¥¬ÛÚuÕWxÀþ‡Ã›ÇžZï9²üÖO®6ˆHúQ…¨Æ­+ÛÇPê¸f$„ }ÅC5èìw¨^üIµ-ªËAwÖ–ƒtÎáo2fož5\wÚ+Fl8é†3p¸ýœ~õkþö帷so:fæä•d$’×|¤uY–ù¨Ì²Lì^¡õì[cLV °mš¦i4R–e~øaÓ4sãñøÖíÛçóKçœÖºnºûï¿÷¹Ïü©¦s—ËÕç¾ÿû€rÍí5’‘Fhyi«ÑhrÙÍà J.X±ÛfbQPQ¤C@z&¿À‘—3¢P€!&Å„* ô²\ç6ŠÉtҶιl±j릮ª¶Z¹¦µmÛ6ïlç<"3…,³“NC+G¡›p‘¾»€¼8í…`ap5Jk­2­‰Œ1€Ö9 È9Nɯ|]UÕr¹œÏ—Î9 –Úˆíó‚Ú¶eªj¼÷Öz­µDKcjC]ëmçI)UÕ]ÝZF剈P€xj säQ``H;z“þÚ¢ÒÇZ÷gNJ³<>JU˜`çí33#m1\öÂÎNM<9L„¼0 C‰Ô"Þ›<Ç£ÑHl`¨Œç`JCD]×Yë²,ÏLþÞ{ï½ûî»À˜Œ.çó£›·¬µuÕÑx6úüç?òôtïàðÖþL&“媺V|h¹(²òËjeV*ÿÛ¿öëíªÂ\ËÈŠeûQk2ÆB„ BôÀ #£qì´ó!µom»ºi꺫VÕrU-mÝHÉTo;oØc`‚˃–gÇ °Ž—OäF),# Œ„!Äh5Nƒ_{A˜MÐZi¢Àzm™”ò †™­õ!„¦i‹Å|>_.+¢ÓÔ¶µdèŠÅOÒ„Bdt]×ÎEÆfQV”Rdt×9Ý´Áè¼³s‘ó"³Ö¶ .d³¡.@J=º¸¸xøðárµX.—'''Ož<¹¸¸pÎ ¾Îf“ýýÃÛ·îܽûòÍ›7Žoí'¥1â“W÷:'X)OŒÚhí±i¼k- äy‚ϲ,3YâÏ À¬µ""ÀÀì"’”â«uk­RÊZ[–åÁÁwîÙ³gÏy.ÕÊe¹yóÍ7>|øÇüõ;wî•y~ÿƒ÷¾ð…/<|øð—~é—B¿ök¿¾··ttÔµ~2›c&“‰”Lv6ô¡Ú¡®ëjÙS™å{ûÓ£ÃÙx\¢)´ÖB‘=¼[ï’ªˆ@±Ì î.ÄÐsØ› wõ:þ‘-i‡Ñò¡uŒÆ nøõê—È=Éî’”àïäZÿ_Z¾ÉAïÖBØ•*évcÚü;:7¯99ô^sî˜08^{¨aÃŒ7á6<Ô×€‘6–üëÆQŽ!$‰¦T*&.*@lš¸äyþøñãwß}w±XL&“£ƒÃ,ËNNN?9±¿ó;o¾õ©ƒ£CfìŒ1Y‘/Vw¾ÈÍår™']µºæ€”š¯V€‚×üx6Y&Æ®À€½ç™ )*½Ñ 1+9ÄØ0 R—Æ‚$Q²Š2+±fö!/‹ÌrÛ¬uM×Ö«zUÙ¦mVUUUÕbÙU•·Žƒcç½Wà™$¡ ûHp좣6.ÿ´“†ãþ±ö¿pœeYY–È@„€È’E`4êÞ‚§±mmðþüò|>_Š+u ˜¹iš¦iR!‰U.F“HÇáXòzA"~Km»à<+"AkG H!(r‘—£ë¬µBK)/¹ÄX)¥æóyUUE™w]WU•ÔJšN§ÓéôÎ[‡‡ÇwïÜ»uëÖÁÁÁxRd™VŒQýêƒ()Ðb±ô!EÊô9‘¤”r^ˆAsÌäañëzfïИ5ž >±Øß¸qã[ßúÖ­[·ˆC(G£¦ª¯|.¯½öÎÅŃ'Ïf“›7o¼÷Þû/ݺ3žM›fõçÿü>xðàÛïÝŸÍf]×}pÿAUUmèò<ßßß?88jÛvµ¬c´š8zÇ]ݬªÅåų²Ìo¼tG}QC‚FYÆ“,©8Ãz“´ƒ[Úíp7jZ©a¼Ûx É"@¨ÈhDt¾K—xoa6Ud)BR:z¯P‘"òÃ8ê]uð;l[šôGŽ”™-p8øD¸"Ò×)B¯0ûG{l«"¤`à{Þ½«^3‹Ê¶üe—MŽºÙ@†]ÏÄà<3+£%ýA`2žYkÿø[ß~ÿý÷­µ/ݺs||l]KDãéì^^|pÿÁ[ŸÄ²w]×µöìürïðh±jþÚ¿û×W­©‰yu °ZÕÓé^Ûu]W[†½qÑ®VÜÇ`‹()Áðb1çø;¦áb*U`Fb(å’$ðÍÄ¥ƒTcfV¬Á£BRD¹ÑEžËñ^ç½çEÛ¬ªÕbÞT•mÛ´mS¹¶k­gïAllRXÌN>pO„Í ½ñ' 8àS…çkÇàcÐ^86Æ”e©™EÖZ†óÞWMSžžV«F´XYõ꺭ë:WU•T”W1$‡˜š2”¤V·N!MÁA PÎ,… ÅÌ%¥Ú¶FÄD§…ˆBòÜ´‘ 1ÏóétzxxxëÖ­ÃÃÃ7Þxuoïàððx2žæE–eZi`Š ¦¥žœ BP¤Ñ LZe²_köÞYk³¬È²,è•BkSzA ­bpk+«\"„pppððáÃ;wîUUõS?õS÷ïüºª®3AgÏÎ.Fe‰È]×~ò“o~õ«ïN'AùÑhòWÿê_ù™Ÿùï«j<…À ÞÚ¸˜ŽF“ýýýý½Ãh¥°Ë®sMe»¶©ë&°kj]–ùbÙ”e9™L&“Éh4ÕD2¼‡éÔ©G8½ùiå—îÁf\O„¨nmA]‚ÀçÏÏ¤È µµV^˜^äS„$1®Hœ¼gƒhÀJ)ê«G„a„óŸ´]Øýz>ü– ø ŠômV5|…–GÙ!¿K·±0$»%E#k1°)n °i‚N Æé"¢ǃÓý~Ò›:bâŸayçšUÕ41f4™”yѵN1Œ÷÷NOO¿öõ¯ß¿¿^yíUxÿƒû>2>ýÉïº\¬ÈdMÓxï‹"#•W«Z™Ñ¯þúoìïtÁÏóëÞ—½éèrY-ª%?Îôý?ü¿Ïž|x<EÎsè“Üvž;Jvß÷D]Š„7ˆÓX!Ĭ;" CŒ¸ÉŒÀеÈî&Ïi;™N÷CÛÚº©VËêrÑÖõÙj!¾9´N­óÞŸõeCe¸ûFdFÆM x˜òõ±k/"çyn”N¬´ÖŒÉ¯¦B¶éêåêòì|µZÕU+ bÛ¶UUµ­­ªªë©*(ú.÷^áÅbW@INØÛÛ›Íf6Ô™)F£©VYÛÚªZv¶AÒJêõiK1q"ÅaÉ™›¦~þ|Þl6»sçÎ'>ñ‰›7oÞ¾}c4š”å¸'úˆï^@¤¤²NðÀ H$õÈÅBn­ÀÑhá¿«–Ë%bµ¿w8“sÂ"Ÿò¨/A‘0 }彯ªj<Ÿœœ(¥ÆÅE{öW¿JÚÚä“I¶ª.óãG¿ç³Ÿ{ô艥.„îèxï_ûË?ôßüƒÿöîÝ—Û¶-мíƒÔêºN§ÓÉÞt:Íó¼´e]·K]S°®í¬sÎ9uyñ4ÏóyY !¨ qY–:3ƘXbypÿNÊ8PFì•ØSE¦?'«m önWL¹ØsÎ:)ŠE¤Ek'³Ù,91âw¼˜/% ~­¢cÕ0 > û¯»Ÿk÷o¦)§mâ¤ðÔ ïvóS– Ðrˆ1o+ôî`n03o“7··v®÷DÏäFŒ3CO¦™Ê5kÿöÞìײôº[ëöt¦;WuuUw³ÙÝâ$’2)™’-ʲؤÄ"8 À„ù’~ÏSò(€â„vÈÈ“"GŠ,SšM‰ÉvO¬êîïp†=~ÃZyX{ï»ï­*ÆÉc—7 çž:÷œ}ö÷íõ[Ãoý–xiÑ{j”¶ÖÎó¢mªÝn×4÷¾eð­G†û÷ï÷»ßýäÁƒ£££ù|þñýO”RGGGsï7›Íz³ûѽ»BçÜ[,W«UW­·ÕÖdóõf³¿:x²>g¥ŒµÑ?» ©ÜÖ€`fyèZß…èÜáþ»J£…¡ú‹€êòêMd€4èºÖ ü¡b ^y8ÂI#0 èŒÚpŒ¨4Cìãã5 aÀH±k³z¾Ø[yï³í¦m[ñQœsÁù®ë0;ˆÒûSrtE›§Ë8ŸÂã…`1O‰±ˆDZ£Fe­e$ѦEçÚÝnwqqÁÌ2¤š¦kÛ6"¢Íf#ÿ%Ic"äó>HAH"•ÕjuóæÍããcÄ¢˜ÏŠn7åÙù“ª*cŒ.xcŒnÈ Ž#Ú%®ëZk½X,äS´ÖY–Íçó£££[·n½üòËJ‘Øeè‹dŸ"¢éËr¬dV˜@C˜Y°\&@Ôʲ,c¤,-æó¹Œó‹‘¬µÆôùçB„:+Q‚ GŒq·Û%Æ µ­ª*&ÒÖÆçpU7wî¼±Ý|bŒ!r''GëóÓY–ã,/Ë2ÄîÖ­›ãoüõ?û³?WÊ0ÇÝn'mcRp]Èó\÷Ó—m–ÌfÅb“fç§][ÖumL*åá¦iäêÉ<Œùr‘$‰ÄÄãÂ)¥hHi"‹ƒÞ[=aoŽ_œˆ”¾×Ñî >Ø E‚@I¤uRj6›Éê‹Ó$IÕô#¶Æbp_/0f=3zúôž>ž÷W><»¬ðzj}pŸÀWÿqÎÔ-V áÚ›?ï];áéIôþŠ€MF<‰¤%ù®kÛ–™³$UJ?x蚪:??7  kœÕæß7Æ7M›ñóŸûâÍ›7Ya×5ÛíöÃ÷><=;ÂZëm9tõÁá‰t·Ÿo΋ÙrWmÉÓó"`0iš²ïÚr-‘b¹„¢†¡Æô3€Œc¹L­ŒÂËÔz¿Ï´á F”!jˆÄÌ‘`˜%YÔ¤Bb‘ z%}ct‘. 8o𦩶»ªªº¦mÛ¶kç\(k"bñǪüˆ¹rn/¿pœªd¾ŒäŒQƘ‚0~m" 4hšn½^ßÿäÁÙÙY”X›XÍœs®«\×¶2V“\ß}‹Lì´Ñiª™yfÖÖZ“e6ϳÕÞüæÍwîÜ™Ïç}‘5„,IŒ†µµmÛ² Zkïâv»Ýí*"ÒÚ(¥P‘ÒÌ!tsÎ1TèC[h›ç ÄÐÆÐ& Ñ5Åj‰@1´2‘µR†U@ûæVLJ"ò†úl9§i²\.“9ffó°zTwm·j)Fc­M•s.F×[yfäÈ!„ŽcŒÚfSè…1(Dff¥” Þ9¬~ý?ûOã7~C!޶x>Ÿ—e) µR†×Ûmªbž¦¹M6Û*_ÚAa爜ßÊúë_mÛö‡?|W)£rëb´J­š¶öÞWh­³E>+ H”¾}ë'>ø }üèÔ9׹ГŽM]· 3Ïf‹,Ë‹…Ä_ Qkì<Tcfçù¨Ôt²ƒR ‘L€äÐäèõ.(ȇja÷ €}™-€«€alÆà#ƒ™œˆ]ë?:m·¿¿¿¿¿/g›Øìøà‰ËͶÚí´Ö³ÙLÛ"Ñ4Ó¢aÂ. µížu6 ׿Xÿ˜ž! f2}†å€0MÈ÷q*kfFbD%D Â+cþ¼AÍ£ÀˆbÅpX_J]ò(N‚<*ÍõQë0÷ÐÅ{IK­{o2B$gÇÈE»‹@!hpÑ#+M èCšÎ·ìQhêÚµ6JϳôæÉ‘æöxoÎ!|ðÞû>¹£âáËwnÍçó÷ÞûàΫ·æg~†B‰6ƦÙÞßñåfýɃOÖ·NNN”á\åÛM¶ôó_ûº*ò]U(£MŒÏƒÖ*éˆ#­?øþì\¥fG:%£(­‘(0³°Ö‚vˆ íu "¥ @ˆÀ„ Ç]ÔÇÆÍ‰Z3Eˆ”^È´b`͘\ŽÕij³b•8ï½wM[–eÓ4\º¦iªrËM‹ÁC$&ŠÖ*Љ—wQ(£2CEøÓv¼p,ÝôŠÙe¬PDê¹SJŪªÖëõn·ëº.„C殓v¾¶¯õÆ0꼋ÔTžç1F›¦J>%Ë Qð^•øÑ’Ç®ªÊ{ÏÌB͵¥s©®k© ¡î9®4 "”´³ä«À;'ÍH›Í¦(Š$Kå­äÓ/}ÝQø¾×žéŸ 2 M‡{ZkA+)i·m›+e”Â4um@ÔDÜ4ÍúbÛu^­®l¦ù=R ! \ `B€@Rs•—9çúXœÒ„Úf>Ÿîšz—fÅÁÁAç™Ø[kµFÍtûöíÏþóÌê¾õÇ 1#2a?±±õN“ö[j·X,äd$Ó~qqæ½—rì®>;;3Ƭ×ë,ËŠ¢Ç0Ëu – ;æ ¤ÎÚ_È!:*LÁ$Ø•×ㄛϹÉ1*7©að3 °-'/-à# ;çD¬TÚIåK€älFiŽIŠBÁˆ“ŸtõLÆûñqä9®Í¹"ôÓ‘úµpöy¹P%Rˆˆ¿¡o‰&! Cˆ£bv+ã­€9ŠLJ©è):G>r$\Ý•kBÓ!sŽCÔ Y›®iÛºYÎf³åry~~~pp 5æyþÅ/~1Ÿeßþö·¿ô¥/¿õÖ[Ûí6MsÉ…̼Z­nß¾ýÞ{ïÍçóÅbqqq¡(ß|°Þ†±iæ‹”»Ýs/›VZ@˜gz³ÙÄz÷òñ­Í¦Û#Å ”öBÍÃ^–øq»xê ‹w-QÐ')™°ŸæHºw{P6SO¡@­”eet’eòYZÌœs¾íº¦-ªE[Õ¡m\ÓÊ(ˆB™D'—ôHf ¦O+ú…`©+c”6h4ˆèUˆ¤µv]-™çº®ûÁD]#)¾¶m›¦+¾0ìT ;ŽÅš$&Þ£hYt]·^¯Ñ{?*G á9„`&I¢••ʮֺm»¶mmªGô !(¥ò<—* ØŠÑ9w~~~qq±Z­´5̈…‰ˆ X¡ÍcÕK8¡F¥ur¤ *6i"ñŸ´?ÙŒ1À\×Íf³=}r~vºÙl*×Iƒ2¶¾½zÏI<Ì, ù,ËD±(åÝ®€4M¥ƒK…™9F8ؿӔw]{¾¾(æ‹È ’$aŽH|ëÖ­q6[þÑ·þ8a ˆ£\c×ùun›$…$œg³Ô˜$‰‘Ô…¨©Œ%öHÖ¢,KÙyžÒ¾2BC½Dæà2x±ao8ý‰“™Är\é)JÉó#ÀKG¸d„s'C8ä[ÈVÒív+o8 Ç›Yfβlt;䳞–r¼vüÄågôøÅŸÆÎÿÇÕ·UÏ–»z>0cŸ6`fQq牲wwp€~ö÷ûÇ{!ùÖ‡ÆGO1FçÛº­רÀJ) ‘9»åùË/¿|ppPÕ»ÕjµXÌnݺe­ýîw¿sûöíÛ·o‘8pUU€sNè–'''RT"¢ÙlæêfWÖ›]iSm”-w;È’´óí3¯’PŠÓ" µc 7ï¼¼Ý툦"0IW#"ɘEæÈJ‹€‹B8|“••ÝK—öŠ{ $w‚€ R±W„LjY!sÏvŽÀ ¬Vˆ Ps’¤i!(ÞwMë›ÚWMW•õ®ìš–b,²‰`50(üiå_À ÀZ£M €Rš„vd´P*R¡ªªóósQ·CO"’°É9‡ˆb 5ÖD”eÙÞêàÆÉK«ÕÊ9çɇ@Ãt#dæ²,e ¯¼"¦œsÛªBÄ¡JO#ù\) E±Z­V«U’˜ÑFKmx³Ùìv;P(EP­¯ !)5ŒPÕÀ #h­½b¡„^ 0YƒZŠÒå"Ïw]÷äôôþ'>|¼Ùì‚ÌØ¶m]·„=Ó‡&JRÌ9fYÖuʲV‹ÅâsŸûÜŸý_oÃ0Eg4šD>Xk‚ UãÓl¶Ìlëœée1Ø{ßyW¬ŠƒÃ½,ËoܸñèÑŒD{-b3ÐÛMÙ5ƨÍf³ẌHÎv E6«m[ñZäZÓ/”R ôæy^E’$ijÇ+6Úg*3ËÀ;ص㷖?™â–ÔÎ= L¹2â!eY&•õQú{³ÙH ¡ª*‰wy dk­Ó¤—LiÛ– càHBÎ'€±¡.Oì*ÐN÷ÉcÆñ+ŒßëǺÏGõg·üòhú‡Ž£ÑÛ™¾rü©&#FÆAXTP¯| "Ä1F\ð­s!„Î;×v¡íhÁ¹® >¤ÚTˆÖƒÊ"ÀÁÁÁ¾ðDœ/>[×õjµ8<<üßùúæ7¿¹Ý–eYžœœl·¥÷>˲à<¢®ªm’dy>ËóÙnWœœ3À½†Ç?&>ž~§ŸŒÿÌpè²ÆËØ¿=_m7’=6ü¹ ;êO#Rdf‰çâRâƒaòÁwŽœ¥Á‹ãGÊŒÖZsŒ@¬û7Š„¨ jH\Ìg˽Õf³‰D!FÃÛöÝm¹û…Ÿÿ«²LRÕZ.—mÛ*IJ,•Râýçyî½üøñ?ýÃ?úá{ïï-ggUMʆà·[×\ÅÞœšj†œ05M·»*µÉX¸eféYÛ_§–™9KŠY !&~Í軎àÚS¹ä±… —tèžÇ,~’ (+€Jc¯$Ãq”MaV‘•1©RQ™Ó fsŽTù®ØÛëã„Þ±S ÖëÓx¼pŒ ´F¥ C£§4P컌v»]Û¶8óãISfžç7nܸ}ûv–eŸ"âÅÅ…t°HÂV"5¤Ž)Æèº ‰ë‘È#f]:Iöâ"î‚1ÈœmfÉÜŠÑïµ$Q¤¾ q°>u]ŸBA÷4µÆ˜Éüvna QD*RìÃë$IµÖãÜR ùCŒMÓìv;Ž$MÌJÃb9»qãXÚ”k™cšÚº»$‰ðØ+ÉlŒ‘|» O’¾ßñÕW_]¯×òzAù«ÐuÀÐÔô«ÿþôÉÇï½ñ…/?¼ßTURäDQkYÅLÌ>÷¹ÏýÑ·þ”ˆB$cí8Bp q»ÝÞ¾} bôÒ‚5B¬Ø¾ù|.Üïªj®µ“õûdû°Ë²HºrÓá„βLMÆ<ŒbUÃäè¨ý#ãä€Q3areÅG`USnÇú®øâÞÉî%¢ÖñÅBÞGfì…ˆ¸oà5à+þÓðë%fOƒàñ×ÁÏÃ!¸†¥ü±°=<‚}?uj°ðcüãš©p2≇q³Â*ì>ÈžŒÎ{MÑùÐv^í1E+Ð@l4¦‰AÄèƒ0ÊúÐÖ Ñh¥µRЇBÏr¹ìºf¿i«ïÿûßüæ7—ËåÇ|rrÓ9·^¯÷öö¤0/›ÍÅ7¼÷J™4ÍI¾÷½ï}õ§¾öOÿôÛÛŠ´bi7ŠÂs/\]nu€ïýÅw–¹=[ŸÙ$yéÎíûïß+æ³~ЈOâ0·[`-ÉŠ ûëŒÏ»°Óði˜( Ð/1" ó…bÝç¥:ŽÂ¬5ÐÜIÒqZbÔA¡Ÿ&µ¹šeaØt,`¯Õ§4~ñ¸gßh"RƒñGVJI­µ,ÒiZK.¤.øÊ+¯¼ù曳Ù,Ë?jšÎ9™¾ ëºÕÚfY¦­M…¼£‡(‚dDº,Ëõz-¡³˜i §ÄÖ‡˜!I’Õl!è;dâ ôó¯ñrâ¬÷¾ª*PÈÌEQä¹@Â`©Øÿ D¨*ÍõÞç±°JCdF"öóó* ï–VJ©(v6zðJÑv{.åÛ'OÎD ÌZ=:Rr΃g“Òc"ù)Á¢,ÖHí§'ÆhŒ’Þ'¡FËÚcf³Ù0-GOÃ`ä|f®?ígh€\ϬÂÄ>{G¾MD6Æ|ƒ`L?\d˜ "§Ãe$Ú/BŸŽ~6 ë*ú^Á4fÅABäYoòcïç¾çðxšÀ¿³øô ȧ #†ž‹ÐÅ.Æ÷ÞçE5–|†ÁG }ï`‰þCb­ Ht‘gÉ{¯‚R¬¢Ñ"ZgMÒT+Ø`DĽ½½²Tðî»ï óììl6›1óÅÅ…ˆÿÔum­ßT*÷¯¿þ:žžfYvp|ò?þOÿsš¥¾õÙ|ÆÌ]UZTáy¡ârž>ùäþÎ0%êñG÷žÜ?=H§§§JõÄTR`ÒZkîkÁr»*‰€d*^ñ«˜¯*aL1t?•„‡œ>^þ!ÈjIú÷½? „/-Ÿ¥Ap˜Hk!Q#¢ÖØi ’¥‹ 21£'½Ú<ŽÕº¶^Ï[¼$ ô<¾JOôa0(Óû2/l6iH¦†(@`Ð<ìOß…Ž#3FáSùÇ À£èw9À™™Bˆm1"r`M–@­õòàpuxd²<¢2i²t¸)wλ<ÏÓùfq§ºžJ­k6»5j]Ìç{«(åBX¯×M×µÎ%‰U˜½ÂŠ2:ÉÒ"M–uUn·Û²Ü–Õ®iš½Ö:ËС³yQdY’s­M{¾«ÈôŒ‚†• H)¥B¢®mc©M²,[ÌVg˜µÂÕ<¥7“$µ&—÷1VÅèuÉ÷î†ízS–eÛPi’¥!¶Z_Ò}GT"Hm.ñý«w^ƒ~Ô„…‚ñoÿâïÿ￟Íò#5./Ц®%GKÒ@>O2ç6uS¡™ÅHJ)« !0mxo?ŸçPº.ÛF©Õj]ÏE׺f×I€xzzúå/@}üñÇuU¹ÇõÑÑh­Å>J¿f.„€Ö&Þ{¥h±8è•1uÎuïºNÌ”„àòÒ0KJ^Üú­1ÆšTÒÑyzG$VŠÆúñˆ£08ˆc^a¬+eú¡p Æ}¥=@² ‘êÃG=è³™Úó!xí™þÇÜß„•sùø :04 —ŽÂåàä8ö÷žüªz±&–ï=Þ¡ŸÆd4¸w•g¥‡ûÎÐãØ’q4™÷ÞxŠ1 ƒ’™¥ôND:„¢(˜9„`ú™Êdµ±Z)¥f‹ý|6;=?+‘Æ$1)hfVȆÁ·VújûøôbLSÍ1|ð/ÞùæÏýYG–yëÕJÖôÆã>[cЦ¦9ëÞÿч¯}öõøþÑò÷þÞn·»ýÅŸ@@(wì¿u²Žž–8…ÅlQ×MáÂ?øÍÿúƒG…í£óÅl® ß_’šT.šÜzãÆ+òTf©Íò-ë!Ûoó4Æ(rÖ•ˆõLG ¦rȲ y“^ʃEÃH)Å ˆ¥dÎCYHK7÷ƒ•ûR‚Õ×&SËXPp)fY¦Iň1Hûqôÿª éSu`ß×?V2N‡˜00‡:œlbf.ËRrJ£L•t}ŒB†UUI¾1IIK ]y·Û‰Ô”Hø&I"©Î½eǩؗÇ6MS×¥Äå!!ÓÄèšX0¢PD#°™DÓÀˆ{ë†c¤%YVIÀ I¬""àl6ó.Z›ieû4)«HDÒ MŒ1 4¢ÖÊjÓGù—6·¿W”Ø;Ñ«‚€Ó|’¦iç}UU#,Éœ¨'Ožl6›ƒƒƒù|¾^¯¿ûÝï8çŽÓ4mšF¾‘R +ÈÌ#\¤²dÝ“$¦i*å|fPƒš˜¶Ö““Xë7åFÑû¨µî°W.t‰3Òj±ÒZÓ_ùµÏÅã1Á5F?ÚËb­(pQ5<… “êîÓÿ_íûøòªáû¦‰éG-gÛ¨ñy¾š¸–w­D9â hMD:ÙÀ,Ïù0Ô.ç†ÅÉ¡göÍ{D2D«ÈŒ,±LóéåÞE­u]×ÌìÚË~ñà: 9:" V«,·Ö^œ·m[—%5MsóæÍÝngŒ¡<¬†ù%rA²,]¯×I’<|ø#ýú¯ÿú½{÷ž¾’ãÕ€år¹Ùlò‚|ˆqÏŒY™gî70ŸR¤}ÎñÂ0#²B$Œ½2@O¦ÐjtjeØpdJj×u?~iÛºªª„Ç;Ò’µÖÂèkKï ív»²¬..T×µâ¦iÂLÞ;"R*’–QùÐuN¯7É' þc$],4ÚëÑHaèhÍû/¢•ðhb$f ä¤ –§ bÂb}F–Aƒ‰ÖØÇ[Ãxo¬ëv³Þ•eEDiš3*c’<§+X—þrß×$—®Ûjÿ×~í×þÁoþÅ|Vïj¥5tm†ÙláÚîìüâ§¾þÓï¾ó+³b†Ø«ß)Àˆ àÍ7Þøàƒ»yžwí®,K¡z1óz½fæù|¾Ùl¾ýíoÅüöíÛ¾~ò䉺eEf³™1¦ë¡£{ï…O'ƒ{  #ïc?ž™EðÔÛt¥4GáCÁ€8´ GßVXÖeˆzã8Qžø'.èaDÕÀçÂ鯗ˆË—8=µgSã6Z=˜ä®§ÿ ?†¯Ý>ÏI…J6Ý<©P<ý–#¯pÜE=Іv $cC`ëüJ>Q@—bÏ÷äý-#DRZ'ÚQ žeùÑáÑlžZkE‡ˆ}yH9H&©®kŽˆó¾©‰ƒb0ˆ 0Qصí£î¼üò·þðŸ½öÚkÞ{km!KóuÆ“AĪ®÷>þó?ÿÒ¾èœ{ÿý^¾s{œ‰ùô!ìÍf"7ŸÏv›‹ßþ­ÿîµW^=;;‹¾»}û¶FÅÑc¢§á$%&fD2ðÎm·»*O³år¹Z­fEaÒDk­…i Xi=¿ìéÁCÙ—ÕØuF¬,1#1J¯q/ª}Y'¾—XÚ§÷^ü´ÒŸs¼p €Ã<.ØkQIlšfÖZB! 2ÆXcl¨…­ išÇ¯×k1ˆeY€XÞc/¥¤õn·“Þ_Åæår) Z!„1)9ÛÈ‘cpÎ5]™ŒV!ƺiš¶ ’Œ1B&2FÍf³$IĨÑÐHzÍ4|.­×zçœk]'鸃½Ã¢˜ï­LßzbôF+æ(d‰hÍÌ]×=zøäñã'ÛmÉŒI’€ÒÆHíOv¢õs#ÆøR@e_Ú™€¡ÞUÀ ñ¨Ñ*Fîº&F²VïÊØøxçÖvwÞ2@Ðõ«_ýƒÿóŸ‘GcLì¼R*8 ½Úív§kšæîÝ»mÛîïï?zôHÌ<´ô4MӶΘÄZÛ¶.ÒÚ2c’¤ÎµÜ§”%•Gƒ¡ïu¯b$ɧ…½SƒÓÔ+#3Dbñý´¦;D7eMì­gð(Å5:X½6 6ײ úÊŸ+…ä)$ŒONi7Óå§jÒ0Aô§a[ñ¥U°ô7Ë?aèwkóãã¦ÝŒü‰)?ìíØ‡Ú’2R ™‰4Ã8õ ÒcÇ—øÄ‡‡‡65ˆèƒ4Í ÒÖXqµ#"‡¦îš²Ï¬4MC®SJ%Æhk´B@ !¸®Âr[¹Ö?yröoüÜn·;ØÛÆ^|"?±!ÇÇ7>üðýo}ë[o½õÖÞÞžMÓÎó+Ÿ}ëyµ^ïœ\ÁÅr¯*·LTïv@£úðíÒM[!Cô¬µ™Íz cM’¥óåBNc»Ý —³©êóݦ¬«m¹›ÏçÇGI’d61ÆôÚUJ)=u˜®VÜ噃‡å–.!I5# }CÓÜÆtÿHo<…Á‘Ÿ=|âÓz¼pÜϺBÍ‘A!“J’4ɲ$+´¶‘@3¢ÖVk/YhaµŒEVï#"æynŒ]IcÌr¹Ì‹‚™ƒÏÏÏÅVJåy*•©•R™1FkÔ™Àû ã­Õiš!¢ó]Œ>i^B­¥î8—÷‘2$EpÀ¢18Ž‘·ÝZ‚Sî›VᲩ«ªªêZÎÿµW½ô _L¼ç\.„ˆ`‰Àû€DaWn>øàîÇ«²!&¥ 0GAY˜XùɃž +÷ÿha/6çûûûMUÿÝÿð?ø­ßú­E±¨ë˜3 ]Üûo¾õ“ñýïÝ:.ÆH_1rÏÃ[o¼™$IUvÖ˜Y1t!£;ç…¼FD'''!ЃŠ¢¨ë²ikíþþ>ˆOsïÞ=É=ˆ¾˜4JI;ÙÔzÂ0SRR#²Dy ™)FÍ<03÷Óî˜YDí§†¸GîËÓÿ‘uæ\Ååš¾`Œª‡XüÊ_]‰’¯.Ðt™ú›âÇðÓè W¡wúŒâKè Ì,ºÄÌ,,e¢>öš§Ø»†rÌHAgf¦^øŒ™uߥ„ 2##ÖŽßNÚ´äô²,Ûß߉&뺖„ÇH)'f òÞË„y£4"veXCKs$¦‘šª6J¿ýÏ¿óÙϼÞTõj±,ëj>ŸO¯íôB­w[uóæÍ¿ús?›¤éº¬³ùJ ùðYÇ,³UëÔn»€S& çÛº®šî|½m|˜åÅÞÞÞl6Ë’€XÔÇ¡•~‰‘™EӇɾÔ+s@„¿jLðÓ£9†µ ïÝNŸœ;çP¢ MAD0–Цy6ÐÚÒЧDƒ"‡4K‡ñáá1DÞm·¨”Mßõ³ÇÓ4­B)‰×^{Ëí>" DH„A`ooo–kØ)¥¬6ÌŒÄq·-‘££#1µÀÌëõúôôT)•¦éáᡵöwÞõ>fY¨ÏÎΈÀûØ4Ö¬&]C0ÌfðÞ+­P™¡h†Ú 6Ø ±š€Fã`;«›—ã ÆšiæÆ Âx=Q©jüuñˆ"j(cLýºŒòµ ¸7WЗ™T˜þ:>&º4 W0x [MÑt`n ó¤¾{ ¶ýôÍÇ(ÔHýÐCàž¸ˆ<º WÎS±ÍR¹m–êĶޭw[)»8çb$T†™ÛNŠ eŒ¢óÞuʈ® äYÊ̘ƒ &ŠA£ªwõÙã3"úù¿ö D`mÚv>Mrž8pã÷ ¿û»¿ûïüÛÿÆb±xøð±ÎæŸÿÂO¶ÄWél—GÛz¥€@¡±ä:׺;7öØw_þò—׉µ-*QBäÍf“åyŸ|nºXÆa_a–ÏúžõÄf‹YîºÎûîÁãGËÙŸÏÏ„‘ ÒºéP¥ÀÏÖ|–;(ÒJÖ™QÿëÿòyªŽŽŠ¢`ŽÐº.M­sN¶}×uÍp8ç|ín«*¥µ–lóbµÌ%±ïCüéÅy]×Ò÷/LˆÌØgžÌ˜(ô•ŸL@Eý¢È+€hœjuµ&B—ÞÉ•ýù¯øÓ}Š 0 –9âÕÙ4Y­VûûûÛ²"™£§ŒÝ&½Ìã × cc?FIÈÊ‚7r'Œ”˜H¹í…D .: ²GƒÚ` %±ÜÛ™¡ä,.ªT4G¶dȽï$“۾ݵ}°¢P¤nÀZQ‚óóóÞ„‰²³ žl16Vyï..μҋLÎ9Ðý0ÇkìÖ‰-vräm‰H`¾jJfncSU8ï\’¦®•YËý ï£6 ÓýF}»q¨¬ÑêøøøÑ£³õÅ8’¶Ê{'iÿ—^zéG?º÷þûïík?}óæÍû÷ïo6’È],ÛíöáÇççç‹Åb±XQ–e‡‡‡’™ÐZWUµÝÖÃ…•¾¥eu”Šc=UiÂÖÑ (öc áËôé„Uä|/ #äL.㘽Ÿ¾æTËáé’wkî5¸;›¯0ƒ;¢l÷ô“Ó_¯.zßò4¾9Á«Öc1‚ÇëÉC<ÞMãùŠ]C"qJ 5’ÚÑ RJµHrÏȉ(¥„¤ýÒ‰UÖdY¶—,“\ØI¢¤-jhÞ{­ˆX’¸€‰)¥È!̧F+`…@¼÷iÂOž<9ØÛÇ¡µ¡çñ™ëÕw¹ÿøÿo¿øóÅ{_Yݺÿö7³#‘y®Ébæ$Í\×i­ÚÎ.r ,|’$‘)P”7Ë ¹ª’—–é#ÞûÓõ¦©ê®ë’$Ù_®–Ëå|ˆ+ê²Úívëõ:³ÉjµÚ[®ò<^. Yåkܧ4õó‘úˆ8:dpƒ9\ö¦_Y÷gç¬?µ‡¾â¿Ç׿þ“?ûsßЀSPy¬•F››¥”s¾©[ïCžŠÁu-GÎÓ,µ™w¾©GNi4ê\è:"ƒã Qb3d4IŒTÌ2¡SE¢Î¹ªk›®kº|ð!8`Xg&DÐ E»¸(ò,OÒÔæERi:³y‘æ³Y’å¨u€Ðź‹M躦©š¦’óèünÊÊŘ"Ëh[cP)fêœkÚ¦sÞ‡Ð9ç¼o}ÛEç‚着*›Êµ¾‰@£}O4Â8R 1 í%Q IDAT?IDôhèâŒ1:ï•÷!FB¥bÇ7Ž?þèãâO«^a1d©u®Éù/üµ¿Þº–¢ÏòÜ»N'‰6Ú³;::üƒ?üCç¼ó>Í’ª.Ñ` Ñ]yS×û{«ßÿ`1Ÿ¿ñÙÏ~òø£ª)­6Y–§6£ mhâ{¾£ZkŽŽ÷÷÷V«åááAU•ÏÏʺ~ýŸHÓÂw!:ʳy¹.Užîª6D0IÎh4êÐäy†ý¨cÖZY«•¥@!&‰1V+Ú¨4µÚ(@NòLBi­­QFƒB0Ê"*€ ™€I-QFk°R H€‘Y ü@d- ‘R`VÀRxf‘y6Ü?¯˜ )·Ì!0‡±g18qZY!+ äPÂÚHL„Z)k ²±&Ilj±&±Æ¤Iš¥Y–Ö&ˆJטD-XÅàAêÏ2 ^ó‰ Ö¨€â Ee•b”`ßZk“Dà #0&)(e´)fóÅ|‘$)r b–[mæY‘hœ_fÅçß|ë«_úòÞñþ½{wOÏO‹™Õ:t´ô絈vëÞ1e­Ñ€¶ÊXКA³VJ£Iµ±xxtø_üü›o½ÙºVi”q@J‡HÆØÍv7›ÍðGwïý¥/}e>ŸE`3Ÿ5€çïþÇù¢pÁ?Ï S?7YYüGïþÅ<³ZI ÊZò€‰M€A¡1Úcm’¦YžçE1_,–«Õ"É—³yfò¡kÚà¼5vVÌŠù<ÉR¥•ó¾®kç½ÖÚX[¤™(I L}ff­¤£—˜™)R CºŸ Ê‘(É´Vï½÷чè}ð>¸ñŸó÷.Fùç‰Ï)Ikt$JÓ‘ÖmÛ gøüüü_û›ëwÞùàƒ¢ŠY–±ç²,gùüðè ©ÛíÅVæ#Ý»wOjê«Õê­·ÞúÊW¾Òÿþû^œŸ¯–û«Õ*Fb¤bµèb#Ó’Ã5ºÛ¶‘b„œü˜sãÏÞƒËÈx\…cì.G4N¯[?ˆÇc<*<8$‚Q‡Ÿˆ†!ªè¥ü€'Qòô}Æ@d,Þ#â r¥‹ B¼R–ð›æ³ÙPŸ–ïÕo­kÃÆ÷™’ŦÉ \+0Ìc@Ÿ©\ɾÍ1ɳ$IjçÀ "¢¶m1{‹eÚ¦iv›­4žÝ¸qãøø˜™ïÞ½k­½qã…°õˆu“kÒ÷Û(Õ—û *V @* Ä—ÍÜÆ˜”òÙìüô4˲®ëŽoß>»ß9÷þûïí+û«ÕŠªºv»Ý&sÅ|Ñì¶ð¬c¾·W^¬cp‰M@pγÝÅiQÌŸùzŽ}Ú •11µ–ˆf6oÛv6›åy¾Ûí¼÷ëõz»ÝÝ8I’dooO)u(É€®ëb1Kβ &½ãÌÜxÇüN¥·)vӌȸùýs"éH—Ï_ÍÒØiFä™ûi:^8–cXmÉf)DfÂ3+4I’$©µVc\[‰ž¢Ðæ‰Q_×tÎ)lä ­µ"<Bˆ‘$I´f£„]É¢ç\p.‚FÐÀlL2æ™4*mê<ÏDBVšŽÄ M’ÄfiðÔ4-pC=S‘P±õ™['.3‡ØK¾©¡oúí¥8ÀˆÁ@}Ôpµ • ¯¼ D .Ó¤p%!y¥ú5~Vß±ƒ½v sîðäx½ÞŒ^‚$ñ䯌1y¡Þ{÷ýϾv§ÛUE–Sמž_œ¼tÛ…fooooo¯n'IR5µ¤þ\èF—ˆˆ>ùä“W_}µªª}’&¹'_–¥k}šæE>{ý³¯½û£wʲM’®ëÞ{ï½³³³Åbq°Ú;[,gY~rtÊ€VÛíV)Ô¡ï÷-ŠDqIöõ+€ˆÂ¼C h*…ˆ–­sWÆ8^>¶WJ†ãψá»T+BV0ô‡èqn.Á¥‘,:EhùÊ9c¸tž`|æiö>L3‡¿" ˆæ À ‡Õï+Á˱~Ip›¦'ÙH;ü'(eû„4@paÔ߆&MDËå2Æh•^.—{«Uš¦ˆ¨¶Í\Û…¤g¡mÛº®ó4{õÕW·ëõý?âÄg 7]ýº´Ö"ë^?„´„ÿrA$‘ApéUœŸžœœóúì¬<;#¢ßþíßþÕ_ýÕy±¸ûѽÃ'«½ýÏüÄ—Ñ»à»Ýó°¦\¯ËeWW1¸w¾ÿg³"¾Ûß߯ªfšÑ½\#aB1õÖMi$S‰ç°ív;™aÚ¶íééél6›Ežç¼·W×µsîììÌZ F'E.êë—KÖ lÿ …˱žÓû=Ø©O3)mP¼öÊþàË×àÕÖöOåñ‚0ÁÙh†\Ó¸.4M[–õÙéÅ“‡ÚºN­Jäf–þQII%‰Éb6°¨‚ŒaPJ&F)eÓQ‹ìª0Qb$De´…Qcl!1(†WNI+#ikeÞNnL¢”AÔÌ)ç™À )Ò"5)sÔ”á‰È|žãn·«ªÊ9ÇÐÂ`ÍŸbÀò 8T[# (Ó_ވȽ:Xßg2Ü™€bœt ö3¹ý”ÔÿägY5óÙRÛD×ҵœ1s»Ò}á‹_;{|£_. çÝÉK·6çg&±³ùü+_ùÊãGÿ¤(2ç·¡³³ÙìâââwÞyóÍ7oÞ¼ÅÈ»õ¦,뺪=zr|||çå[?õS_{ûí·«ª"‚,+ºÎ?|ø¸,ë'÷7Mœ'¢åªxýÏ”eɨî~øÁG}ä½õÕW/..š¦™Ïçç. ¡—ÅqˆÌ ”6flÙ!·óóì€J®·ñôApÔÌ,&^¢ç€/IL.©OC¹|Îˉªãå…+fqšÆ€Ñ$VýÚ‹/{m‡›H|AiÊJ)À¾ò0þÕåyj­/™ÖܻÓý)³tFf™ ~×ZÛ™9’oèSä‰É&ÉþÁêÖÍ—Œ1›Í¦Ül·Û­Ðà÷öö¬µÒivxxxœ#ó‡!h­g³2·uãÙɬ=Å€€¨&„sfÉ- Ò'ĬX<]Ñ®*¥V«U[–MÓìíí=~üøí·ßþå_þe¥T]ׯ¼òÊÎugkç-k¥ó<ÒþÓGVÌvÛí,1Á"„¶õà·ë&ËŠ+¸;"¹„º®³,;8:|òɃñeSJ7…„¾ùú«À¾ÜVÙlupX—°ú¹¿üÿãŸüžÑ‰Y’[E»ÝÎZ»\îݽ{÷õϼñ'ò'·oß¾yçåB‘f³Y½]oš¦yòäÉ~ðƒ÷ßû;]×½ûî»›Í&MÓù|.g^îʪmîÞ½ÛywçµWWûK@Ê²ä­·Þ !|ôÑGr’ÖÚÍf³ÝnÕÐ&n% e(%¦›‰H’of`™N­"Fç'W›.×È p”uI½²ØåÍvýd·µRÎ…Ù¹ðÒK/£?_9âhË>÷Å¿ôþ÷¿óÚ›¯¯V«'Ÿœ @ôþ•WnÏ‹¼ª*¦€ŒI’•Ý.Iç\Y–‡‡‡]×ÍçóO>ùä¢,oܸ±Z¬¬M¸ëº‹‹‹GüéŸ|óUÛtaV,àôôty°×ÍÌ}rïzfbzͧÏ_Æ¢ÏÂï‘{µ#D ܳÁåó‡qŸ ¶2³x½÷x—ö³Q³HyZÌçóùr¶X,䲟ŸŸo6é@[,f`Œ2F¥©EÄœTäÌ뺖OÙn·?øÁ¶»uSÕgggÛõ&zßT5DJÓ´ëÅЗ¦Ô¥‡Á21™#!#hdшe¹§”Ñ㪥y¾¹¸XðþóÎ;¿ôK¿t~zš¦iÓÕ³ùBKÑs>+bç9Æçd™ L<Ÿe‹Ô>|tÿâÜuÎÍçËq9x’Ò˜ÒéûõS=û}ºÍ„T%½ÑÛíöüìl»ÝžŸŸk­­Òiš6»®©ê ÀÔ&Y’¥¥‰û1ÌJæù@œŽÑ>I6]’#‡ó„‰þ‹\jkúâÂ4 Ÿ^ ~áX±F½q!Ž16U]—M[wJ)kT!Œ'c` ¥ˆÏ¨µ“ž%NÓT¡¨ø&ÆÉP± “@bˆŽYSüØ{³X˲ó<ì_Óž÷™îT·†®©GN¢¤–)‘l EÒ$aY"Äb?Å‚cǰ`% ˆVô!ä±-Û"IV,[BJ¢Dµ9™b‹d졺†{ëNgÞóóðï³ï¹·ªIé1]ZUçî»ï>{Zëû‡ïÿþuøð€ðV2àÄ÷ý0 }?ls¼¾ïya€f>FáÚ„„„ǘ`T`cBPÒÁa‰0^Q]÷ûýtwwG)%U[5ŸÏ†‰ËFvÎîž8×F9­uv•ýµÊ^ZÛ¹b‹NJ©=­ :ejw–RQËÆ8 Î5R–eÉ<ÑhuåÊ•«»»¿ù›¿Ùª‹¬dü(¥„y¦QÄÁ`c´89IâpëòeÐë|¥7o^_.³<¯£ÄÖ:Žc­5ÊO¾ñÆ?ôC?ÄûúË/€‘ÊZ[–%ç|8ª¦zñÅûý~UUZk4túýþÖÖ–=ØeeQÔU]”i6UQæË?:olltËÙ`0À:o- ¶^?88@­­­­­­-îyeYVU…Ò•Ök h#hº;†ÏN¬b³ç­}ÐVÍaÚ‚³Ö2MÀ9êZrãÎP¼ír¼z(gêNa•œætÏ0ˆî9v "!¤Ó!Nþš´§Õqþœs@ÚËñH'=x€-;]¸×ñWkkÁs`œn¤s. CÏóF[›ÖÚEžáPÖ$ýžb¹œ£äœïû(ƒ2ÈÓé4‚$Š777qM&“étšË2/ê²’R‚µç'IRUUÓž #”¯"áÄ:ŒuÌ%Ž8â(YÅP»ÎK>gÝ TM“¦éWžþîÝ»?úc?VW!…Þ‚( †¢*Kê÷V0åÌ5fÿÞ›õl|2/Gý¾4:Œ")Ï”wÉn]ð>Цg+ÅÑÙµ„¨®7ŸÎªª2NqΩƒ¦¬t#e>ÔAEç9mAhI+‰°†ªgOÉXµ~zݯȪóÕù_=”³u6Eòv(w×k­çI’ ‡CŒ».‹ªª|ß—ºGqA¯ªFÊ­]|}=!°ß+cœRji‹ã”8g4i€pkmÚ[±C)國A×8 ‚ Žã =ÏÂGÜ5+.\݉]Ûˆ‡È"Äj(¥_™·¢ßï%I XQ³Ùl6›! /‹²,ÝbiׄŠÜ)Ù#Ëë d…«»[wšJ<7—Œ9ÍñtƒAÎ9–¾„=’ã^úÔcWë·~«Sö@>ªsÎj@³[[×þ—òSç'þv`­Ò–p!¸/¥|úé§ïܹ·ÌkÙ8£ *‘ !|ŸO§SJéíÛ·?ö±Iÿ[¯Ý½{—sn”°Bâ¼+×ÃÐ ¤”wîÜI’dggçÚS÷’XxÞ½»·§ÓñöÖ†/<©k”CYoŒ?ƒÇ{ìðþQ¯×C6ižçHr‰ãxg0j¤6¶ÒÕ+  uð[#%¬j¾Ï/d²^`\²+©KzÀq¬“m=.ú¡tåþR»¶ ®? BO=òu¦;[Û€Û³"ºséZY<®³^^Ë‚f§u½”‚ù PÐ>h8….ª¼U{6VV5°µöÞ½{Ø”³i|¥Çã1ÂÆ|>W´Öbº÷™gž1Æ$QŒât'‡G'''³Ù̬ª*NYèû¾ðÒ4mÊêäè¨këQ1 ¤ÕܲÖQ²J®v¯ºÅ׸ª*¥”ð½N—&Ïó^xA)õñ\I‰­>„eYª² £Fßd]~›Ê*“&þd|¼;ìqfY¦ÁÛQ Ï“› ê¬8Ý>XžKW=ZÖ-ž0 qÝ ý`2™ˬ®k£tSÕÖZFhè‚q‹ö•$-³žÒvX¯¤Xÿ°î‘ŸùÕérj}´l=Ü“R “’~;G€•R‚2Æ©ÖVpf´uà"?ØØ¦iœe™”Zk]×e–e’8­jIrÁxwÎ ž :;ÐZšÖáœsN8e„pŠþ.!Üg:+R¥S{I„0ÅÛÙ§@ Ä#„ j¦œp Ä Ú.ŸÚQ¢iÛ€8p”£nžÓNÆ!å4Ic>Äóy<Æyžzál¶aLí¬ÓVk­-Ëó\YeˆSÄ8f€jê•¢çP}‰€kYitëmº&.ßö!£FK­µSRPb¤ÚÚÚ’U]ó÷ê§þÅ?ÿ¥ÅtJ N€Rט‚8-óâÿ¥õ_ÿÿöúÆF½˜x®!Œz{î¯|è?üög 8&cPõ —y™eÙîöÖ;÷òå\Öå;Þqéððµ88‡ÇŒùucªªiî½¾µµuãæåÃÃCቌ”j^ã¥Æê}èC?üÃ?ú¿ñUUíϨߣ$ˆÝ¢*sÎ9£pçö­ã0¼|ùrS—£þèë/üñåË—7†ý᨟öbß÷ë¦lÊ‚”„QØ4 á,I’û÷ï£(›2¡l‚’Š ‹¾ð½ÂÅ%:Œ€sŒ1N(á8Xõm4Ö9v_W ¢–mÃ¥Î\ÃÊÂD·(¯Ã°µ–àŒrFžZÇi›ÅZ0Vky^÷u¶M5PŒÓÚUÙ•µ9=è@RJ± ÍóýÀ÷Œ1e™ K¥2vM6IÓþ`€,§±ÖŽÇã“êd>žGqZ×u­ V[Sc7Ò^¯×KãÈ9§”Ê‹l1;8ÜÏKBˆiT?ŽÂ0 <ß÷}ê Ð’{¬tÚ㥨³ÌY†÷„3b\Ks Á:î8ã\eöÞ7ß|óÊc]³Žcööö_¿õê>ðÞpÄÉr6¢ˆW™îmmm]Œc¯($XÓ¡_UMÆe™cXØó¸TÚƒ¦¬7øòó°³³YdyàñÊšK»ïíÝÂ`ÝzëÌhj;£íô¡ Ž8e´¶gdXŒ³Ä:!8Ôú†ŒF¾ï½ñÉÉIÙÔÕEQ²ÖÄ‹( ¾85¶±ÖjgÛ¶Å‚ÁÊ0Y·ÅéYC¡ûÜ*aAKÿìlô.ð¤ÁYÛjsüyúí1V¨p*øG¡” Ïó|/FX2T×uÓ¨Y‘a’)_`ÖÖ€VDVYäv0ÞÒ(£”z«fs~äÑ•BúzXÁH§®EÖ¸©äl<çÔ"0üèÎz0ä ×´‹-cs'¥t·”û¾0&ÔZ*eL”r­¬uÚZ­TSKB)&w𕧈`G ·=Õ³9Åî&[wþ|:K¹cÜoõÑÑÑp8üøÇ?ù+ÿæ_'I/[.£éxõR¥TžeÈýûÇÛ;»ãñ8‰Oè2ËD3N¸ ÖZ«ŠÝ÷¢(šN§Hà|饗žáÏ0*ýÑ»ßýî““ÉíÛwûƒÞññ!vV~ßû~àÎ;Α×_= Ãå|ñ»Ÿùì7FƒáëãIU”Qq΃j'5Êó²®%êHëFÇãÅbEºDι§žz*ð#c :‹q9ç<Ï ú‡X—9 677«ª€²,˺„VóÒZkñÝsÎqÖº/'všµŒ0F|Â%k¼âîYøÂ#«2ñŽå$„à^«rºší:Û=hXóWÚW½•L1Fkç¾÷øXÛ´÷êàxØÎäœWUé•݉"bÔ9‹ÅÍôâìRŽÇãÝÝ]¨ªj¹\¢Ò¥tggÇP[–eš$W®\¹rñ²£)û÷÷‹Åñññääd>ŸËºYEž˜çyˆ1FÕ ž˜à\hÍ0 q@žSû–›ªa!ŒqÇãñ·¾õÚ{{àèÖÖ–#äG~äG&“IÅe¶L’$ÏóFVÛ[Ûc ú&IgµR& ý²ÌWV(¥ …¦¨£8üâç÷±Ç;>:h«)[,IœZ{&@ÒYTë䬽Ϸ´¥‘2ÔÐõß üÑêV'W9Œ» ¦¦sk¦óŠIåYQM§Ów½ë=_úÏäyAYVžÇëª ƒRj´ÂoªæþÁÑýƒ½w=u¯ŠbûÒ•¿ú±þú¯þ{ÁÃw¼ë÷ïß½{׋n%çy7ï}ö}‹Å¢®eÓ4ûûwîܹqãÆ×òLŸ4|饗Ã0'QEÑ綾.^lêº( Ì>j¥fU%­½páÂÕ«×z½ ìc˲šMQ˜ÄQª”ꥃ« =ìïï×ê¥4M=ÏÛÞÞNÓØ9S™Örcc£®ë,ˇ„iš !xÕÖ{`ktI›¦¹tñBEëï.Ë|V\²êKñRéέU+fî¨sN¯Rõ²iwcŒaYkôbR¹€"¶ŒF©#ÀÀQÜŸR H*≠,LȺ—cB¶­˜gBxqœA€“® L‚Ãw[Œc¢(šTrk-*9gY†±ý 8óî¼qçuõúøäd>Ÿk­ecšs4‡Ã(Šª¢œÍfår¸®êÆ9'°¼s®ˆ D¥ØìÁQâ,¥T;bP×Öۀ¡ÜÂï÷‡Ï¼ã][[[ÊhŒð{4xó¥—¯_} ˆ],QÚnn-—¹Ö ÉóÔµìîIže£Ñh>Ÿ@UUÌAì‹o|õ&Ç'‚²­áb±˜Íf›£ ßÝšr¬YE8%;ã zÆë†ò:»µ(K¢ ÃðÒ¥Køž Õ³ìý~ßÒ¶Twõí¡ö  `§×ew~ËÛ“dõÆ#ÀgVA¡€+TëݵÞ8çøhŒ{Xø¸2'»|mwœ¶+Y½ß˜Qs-äw+àú¿°ÇÇÏn¡Õ™zÐS 6gºÓ¬Ûö½ïÌÒ.¬­,&o…1ÖF«0޵µìFƒ”‡¶ª ÆiV£Ä@ t|;ÄoY8gÃPîü8õ€ÏÙȶmèä0‰Ž®Æ‹Å" bº­ OïeâÂhtxx ¾ªªŽcÿïxÏtzü«¿òËýØn_¹œÏ&Vª«W.-–ÍÑÑÑåË—•Rã“ ~o†ËåòÞ½{^”>ýôÓ[[;UUlmm}ó›ß|ùå—ßõ®w ^¹r)Óo¾ù&¥t<K)g_ÿú×wvvžx≲,¿õ­o¥i:›Í”R‡‡‡žç]¼x‘Rš$IY–EU ûUU¶yؽpa6N§Ó,k+£pÅ?<<ÔZkÈ»ÆÅ1Iô&³]o€ªª0ÊŠŽHç tJi£X‡Ap.‚$I’$ñD€àT–%F2Ú3㜱§}ˆ1G+ ãÛ°zÏ»4¾ZÝW;¯EG”¡ÀØH·â£;…|þu‘Q|KqùFñ |õñ’]ŸÄqŒ^–R*Ë24G¢(§‰…×ȃÃÀ «´‘j|t,›¦iš@xi’ÔÌÅqœÆI†žç©FNÊr:‚iÀ´]21LÖipÒY–‚íÄ·,Pâ±Î‚3«r`çuŒõ½ˆ‹ ‚€rFçUI\ØÝØØ€4"eîùœ16/v/ß B^×$IäyRµ#B0¬ ÎZ PfÍfš8U3ƲŬöÆB˜ð<皇šéŒò%×Í_»V¦¼>ãë6´[©¥¢ *gYk†ONNz½^’$§œÐs2 ë®Åª„üÁ®{ð«Õä0?:ãQ`+ø$ª8×zÖ¶@È9gÎRJ9VStè g:Õ¬0VQJ)¡ _P€Ól·³;2‚uÕ_B!Ê8;µp7Fà ¨ã¿X½NÖn·Æ` ¾s€Xk%PV¹VÖ9¦•Ã%l¹œ[gîî¬ÙmO=p§eH„´¥ιN¥Ö"« 9SZ¿ݽÂl.Ó@©ïÆôæÍ›ùb©•ªªª®*pùÒå½ýûHQ4žG¦‹å_ûë?üÂÕ÷E4J†Þ÷ÿûþï_ý€ðÃÃÃÇ\poooÏ÷}´î !÷îÝqÎdY—.]zç;ß}÷îݯ}íßÿ¾÷7M­”ÔZ]½ú˜Öë[r¬×’Ò‚'žxBiç¹гi]×÷ïï—eÕÆ„çxYWRÊ0 £0lšf:™$I %„UUãy¥\kÛ4j6[`Õ2ïôTVu1 ’$áœûA„ž®Rªª*$TEÑš)¾é:¼ÖZDÖÍr¹ÌóR5ÒèE=μ8Žñ ²]—¡oB°Œ¢cã¡çcbkÚU ®]É⢌zI¾ï;i©à[ñ2X……Q$ C«ÂÜ!ÚˆßƘº®›¦q–ÄqÇâ´Ö áVVJ¤qΛ¦9>>F oœ,a&IÒ½Z·„úÙ\$¨ §¥*Ë2_.R>£–pÊ<Ïc„0­ÙˆÓ6!MHk‚s¤ë‡ÛFBx^XkÑ€a’Lߛݾ3 À‘ƒã“óé_JšZûž „äy PPT¤²Æ&I”ç5pÆøëßÛºœÍ'£Ñ¨È«$I†£²¬µ1u]{âLn~‘ùnzœƒÝÜ\çé¼d|Fq£)´¼ÿÃá#êë–ÙúL`KÇ__Ïœö¹ß>Rãà¥`ÕBz•,9ý=°g-.F«º ‡íÏŒ6„ áÓuŽXCÚ@œ«jI¢ÎŠŸþëNÜ»P-!D¯,Öu4%„p꺲N±A¯¢ûÖ˜2„J±½öê-w”2°Ö Xc%¥ ¥Tªq+)+cŒÑÖž,BZŸRêœuú C§hÄÀšµW·F奸tb„¸×ëõ&'ã4Šziº³¹õÙÏ~V)Řõý`o€£Ù|†ÑcWÏNîÿ¥¿ü!Y/ËåBxþþWþƒÏñd²¬ªb?Š¢ÇüÞ½{u]>ñÄwïÞýØ'?ñ /dÙB?ð£0H†"Çè[ʱ]J‰ý¬Ðï7d•76¦'G£ë7£RþìÏýœ´ŽRh+%“®šˆ4M#óæÍ7n|ó›¯TeèWU/)Õ<ùäãóùük_ûêææfÓT;;;qtëÖ­´ß³Öþç/~áÚµkÇ㓦i|R B°^/IÓó‘yž[êõûý"ÏeFé'nÞ|ç3ïg‹ªª±óù¢id’$iÚK’t:;ÁJbuªëz6›I)¹ðÑç[.—ËåÒ9‡iòÛ·oA0ƒa0"ô:Q_…‘Ö: #TeaŒ¡WÝ…|¥”Y]æyÞ¤*…¤°¢(TYcÎ)ÝJM)í|h½êôVRÁ92Š»ò'cLY–ÓéTJ‰'‰1!Déº[©1xœ¦i66úJ5óùLð!rΫÒà…£½«ñ‘ ý3:™bBÈÁÁ!Rš¥”ÎJ©ÇQ–UZk9e¯ _?£¢uçå{Œ‹@ÌæÎ9gÁ0¨#+¢¿;¥l€]…J“$ñüÐ#mÀk)¥U]S£TÇÅÁÁåkï¨,ákÝ@†UUa‰Ö€zž«¤pa”,ó²,=Ÿ©%pxxˆÏ½¬¼uœs²>ïÖÌÜó+Ìúì<ãîÇVÎgº»Œï¾Ÿ›››˜)Šb:‡C\ð–t¥ÏçV²烷ßq‡·÷xäˆ#ÄQÖöYsÄ¢ÚMË%£!”A9tÝŠìâxÒhÔÐpÀ!Ž€zZ³`¬³`,X ëô‡‰Ë| °U¥#ÔÒy®g! õtÏýûV-öÂ!(„:k‘Ó©å,á‚ÖM3ŸO§Óélv@ˆ¢Ä6unŒ£ÄpÖKE+l à1Xå vU‚SË…t‰t F°¿cN¹Ê( ˜e â„ûž¥$Hâms®Èr Ö(¦½ç~ð¿øÅ/ªL"ûWkÕô—‹8BKçüÞ&Èâðàhgs£–òÇ~ìGþÅ¿üå¤×ŸŸlolÚZ¾ô'ò®gž:/‹ESÉÃûG£­Ço\/Ëz±X>­ªÅ;ÙÓO?}åÊu€{B„RÊû÷§ßõžïþKïÿà—¿üe¤kÍÇÓ&/…J‚Rº©Ÿ2Æ¢°ýÚ“ÇÇÇ‹éÔ9ç%iQ‹Åbï¾ùÒW¿²µµE)MÓóʈv¾ïÇq¼µµå‰Ag5%FÖÚêz0ô†ýáp8\,·oßžL&V[° ˬ)«ùdÚIêc·»íímH¢“%ëÒ[ƒsV;æPâ” N9§„ ? I©^.œRf,ˆƒÁ0Ž{‚g,A êêˆ(åUUÍçó¢(„½~Ç!çÜ9å¬%@}Î aZkKÀó„±|8êÍçóe6Sº¶Öb×Á Ðn€UÎåàà@k‹InJ=çŒÑÔhÇ}¯VÎ ðý$ŽTVq/ œsF)Ú Å2³Ú”uíœCTN™Öº,ËÑΨ„ï;£«¢àÆ()mÓXCc(e¤%÷Xk#á+¥(u\p¥ 8Â9wÜk“«Ô8Î9ó(kjY ÁŠ¢ða UR¦››õb ZKYö6–y)B´jp’TU…+./Öš†2 š;+Ôòùßÿ^Àµ“ÚóŒ²É`ÃRVKEYÉ4ºVÖMçîàÖˆ+³Þ8Ç9íª¼¬µÒ:âÀA«+ „‚uÖÊœÖhp³$é]ºtEJ½XdHq˜L&Ø@¬ûê®üé|¨™P²æ “UÔS}T²ê£i­•,RqPB[Ùš·/@?z|vÒ† ;h\ÿ¥”óõç©.®meÇ[!¤ýÑž9Nw|z–$Õ}¥à€)ÅC8ºÆõ_]ؾ-ãXßùÜp+^öX,‡‡‡ûûû(¸×hŒÑ Œ#ç½m¸/ÀyËwí[]+¼Fþ¥”ñ}¿ßë ‡Ã¤×—R.fs­õáýƒº®Ó4}ß³ß÷_¾ðGÊhƒYêÅ"ŠãNÎ:Œû÷o½¸{íÚ½×^»ró‰g¿ç½¿öë¿ñ­7Þ¼rñÒôd ÖìììK-?ð¼öÚ­¦iŽŽzéÉœHç™Ì¦_ùÊW¶··¯_¿NÙßß¿ÿ~Q/¿üò;ßùΧžzªiš¢(nÞ¼9ŸÏONNŠºÞÚÚZ,_ýêWã8¾zõêæææ‡>ô¡W_~åÖ­[ÇÇÇ0 `ooÿÖ­7EàcN”ÒûEáùL Óëõ.^¼¨µ¹sçθž¢»‰ÄÀ’â–夀bv¶q–ÏÕ•4fÚÝ4MY–‡'ÇuU@QÆ6>Bø^†¡çùœµÝâD(šº–R!Äjm³,+Ê2ñZÒ v’h‰‡žÇYPWR6º*ã9FËå"ÏóÜA‹žçQÊsç¼×ë)i²e‘e›1ªÜÈŠ¯úºã»±"äûÆ4]Í›uÑ™'! ˆRÊY‹YsYÕ’8眠Œâ ‰^çPÎÑRF#?°¨ß†£ÑÐ1Zׯ:g¤”•lÀX,ÎÁxœ„ƒ^ß÷ýº*—Ë%»N·‹´%¶fÕÖVªOhI Ç[)5›Í¶/\ Þ¹³½½}r¸¿õÔÓ'wïy)ìî^³ý~²XdÝÄ?Ÿ •zss0?™ÿÂÏÿo8o\¿ReÆ]ôk}Uéú<ž[²Œ?¹³dºõ•(¬zx8²6‰-¬:ká {ž‡BËå\J‰r¶HÔzÐ=·À…íwœÕV{ð8‚güÈðCñ X0Ø›ZzõZõõÊœ ½žwÊv^GDÆ[fSç×®~ „Pp|Í6íÆ³ÇÿŽpûPÂ=T!„Ox¶í©@«ª™N§GGG“ÉLIcŒëz+…`g ƒsx}ڬϔöVü,×ÊØŸRBœµŽJ)RvXÛÀq0À:ÕÈ“Ã#ê`0ÔM Iš !fÓiY”1kL”¦e–ŽþÞwýѧ~ù—ôÇÿ›^ïlmz¾`Œ£RýáÉá1²´Öyžk­£(Á²–´ß{ùå—÷öö8çý~¿ßïBÞ|óͲ,ï÷~/ C,€ùú׿~íÚµw¿ûÝãÙl>Ÿommá¯&“É×¾öµÝÝÝë7ŸXæå"+¤”Ö9ÆX¯û¾¿Ìæ¥)ßZë¢(¢Øw6oš&MÓ­­mçœVź'“ vzž×…ûÀÀºÕår‰b!DÓ4U]£€%¶¬©–u£ªšsîy•ïûBx”R ˆ œ1 >cɪ®«¦Î@a"ä ¨2%p0bŒ æÙlD#B{^@)Å.ÚYõ}49ç0>-f­Ã¤r›‘iRœc»Yß÷1*x+ç(᜗Yžç9:kZk«´¢@Á’„( Ó4Å{šÆÖjkm½^Op¾\.7Gº‘1„:c a” îù>0šFqEœ–j>UE^—c¬ã1µF0m#ΔRÔd5Ö:.ã|<7Móì³ÏƒÙdÒ륽^Ï9·õØÕòèÄ Ã_þwÿ–0Ëev~n®Õ2>›Ì=]WG]¾ìé4L` ÃjO¯OÌs«BoG8·\p +Qkâœ]¯i²k²žçõûý .4M…LF£&8:~‹8íǰîŸw'ZýlS©·ýxäø­Æ9A÷Jµ²˜rÄúŸŸ¾Ùgø†é ºÒÜwζû¶Ô&À(.õË|9³,{ÿsϽð y–¡©B8cÁA¹,ÑÆåùø.gô“Ÿük?ÿóÿô'ÿÇ¿÷úÏ&Sî ­u£Tǽ¤wtt$1 G4MƒBÍý~¿× ;;ïß¿?N‘]2‡ƒ cÌ«¯¾š$ÉÁÁÁîîîñññáááµ›7{½Þh4Ç/¿ü2î~û·ûÊåë“ÉD)CSJbìÎ÷ÃK½ÉÌH<Æ›À[.—”p,1ºr%GJQUUÂc³Ù¬,Ko5 Æ`ÁtžçGGGØ1MÓ,+ÚNsÀ¤¶ª–ZYB¹ÇZZM]7RªÖåŒ`Ö€”Ò؈"Qì¼é !€çÜB©º®éªÞ)ž"Ã'+\¡¼mÖÉnÞ¼ž¦i]–Óé´È¥”Ò9³œÎ!€qâû~ÒOPìÉX‹öJVdÕ2·R1B|!œ„œ–çâ°Ô2rÊ:î Jéî¥ óùŸÔr¹!Äl6GE£þí§?õÿÑÏX€0 ¤”δÍ3`•:í¼L]©€À_ÿÄ_½÷æí £89:¾~óZ]ËnêuŒô,í3«Y%_×?<ÈnÂí ˶-j§d›!Ej=‚M)ãx4M&'yž/—Ë,Ë666:!Þ¶õÑjAè Œb·µêpL¦”X»Ö*©ý‹5ôÅ6¿Ê·ÏxÔ‘VM[œ;mKÒÂqÝç´*çù‡k£Ès ô Uáôqhë ØJ“Xg´oõoç’’³çq%²VòDŒì9ç)ËâððøÞ½{“ÉD6 «~qFŸaeÛµÎêÝuÀ™ëz¸M°²m­µ`¬X~H)Ó;™L!HJâ„"V0Ömïl¿ç=ïùâóÏã½îõú‹Å"ðü Næ³ g°¹óؽÛß ÿ§ÿ§ÿù³¿ûÙ^/‘²ö}>_FQyVöÒA¹WâÜë<£]žç³Ù,N{”ÒÑh„srrR×õæææx<FûØÇnݺ•$Éx< ³Ùì7ÞHÓ´ßï?ùä“ι[·n ÆØ½ý»Hi¶]ýq¾˜ÌÆ£a?I’7n„a8™LîÞ½«µÃ0/IÀ|>ϲœR*íœ#Ú!שs±LKP†ÑÎÎ…k×ÂÍW_}µªª²¬¬ ”3â@jŃÀgžðo´FˆBj•µ†sƘ'Q§V›2Ëó¼Pè;†áiŒ•œd]×½tE1E™e9^£RŠ1Ñ.ñ–h£”Òø>p>¨ëFJY¥1¶ÙÐZõû}ì;NÑò „äE[Ǚǹ¢”ù¾‚`¸ÙJ~â[„¬ì ¢Ð·ÖbY c ‹µÐíVJåy^—åd2)²CÄFš0 çÆ*쀋Mæ-K£e?J677σ¶Ù&ƒx+ÀÀ:B­³ZqͶi7ceYnnnbd%I’ÅbÁ9ß¼~Ýò_þëö~æg)B ,kœ0d-¼ w;cLðÑ¿üœÏ((5=>ÞÞFw—óÌ ü‡.\ØÁÝŒ;Ÿ~Øu:(¶S €3ÚVÜåP°¦H0 º’ûX?7üQk³¾2¬ÿöÔ×^}—µ–¯Ž‘ñÈð9hìÿ¹ú­þö­¸¶á¼àFûžÿÛÖ´dt¥/ëNÓÉ„¸³GèŽshÏÒ[ჰÖy1eYŸœœ,™”µÆjeÛ àUKms6~õmîÌú ÁýŽøA´ìYŒO2ÆÇ9çĺº®‰J! ýƒ£ÃÍ­Í¿òáÿþg?+¸X,¨ XÏfI/-–¸sçÞ÷~ÏwÝß¿÷ßÿþÆ‘OúÓ•Tqš”Eå1JÉZÑ€h­”RB˜ ˆ„Ç(óYÃò<¢Qgwww4Xk=Ï»{÷îÉÉÉ3Ï<ãœÛÞÞÞßßïõzû‡‡eY6MóôÓOä#ùµ_ûµù|þøãolµ¥5Ë岪*.¨uºª‹ƒƒ²×ëA¦)!£¸×ëaK¾4M ¡Y–i­“$)«VîB zx‘ 7¹µµ…n1Ñ0],ÆFh’$诤À=ÏcœTUµXÌ‘óL)L&MUGª 4ÑÀÿùÏ¿ô­W{ƒÑ|™…^Ø‹z³ÉÄ Á¡”Rj!„EQú±Ö–e¹X,Â0ÜÝݽzõêd2±êºB|á _¸råÊÎÎÎÎÎÎáá¡4WðÏ}îs»»»(t|çΤyž7ö67‡(OƒÿY¸ IDATQ–%!–_.—·nÝZ,A §,Ë JcŒïûý~?Žãªl8ç\Ð.×€E5m³wG•2Rîá ;G”Ò“Ù\P†>ŠRZAxž7èƒÁp8”ª><<8<<,«¼¬T¥š|™qÊÁXÏó˜ð…ïQΨn’$±ÖŽÇãÙlæVÍ‹¦Ó¹9mã v·sŽEÑh4J’T)urrrr2)Šb<ž€iæž1í†(Šò¼PJÏf³²¬¡Œqk­³„Î8C2 1ÆZ ”Ea­M’„ÂÛÞÞN’DVõ$_*¥dUB´RyžSJ‰uV½ÞàêÕ«[££££¦’ýÃËGMOGˆ’²*rœ¹cÃÁpöue^LfÓº*¥”Vkg `È6bŒ Œäwoþc=Öá.!„‡‡¯½ö•¯|åüäOyL0Áœ³eQúŽë’ø£»Â¹“½ûïxæé2/ª²Ü»{÷îÝ»×nÞ°+E”s“«3ĘÚg ô‡¦Ö—‹Õ°„P –1†Z_ÖžÉÑdÄsÃ0 â(0±‚=l\º--m¿c•‚é‚Û°Â]ºR²töm¹gÆŸ0†Xí™Ô/œf=ÏDt»î,’uHߢ‰‚=+¬qêÑ‚bkgŽsˆéÂH:èt¥·þïC¿ñ;:¬J©Å";:::>:ÉóÜC)wºm½°Ò-:´sÎîßÒYÖN¯‘,eØü|íµo|ãŸøÄ'Â^j¬¶”3 Ël îÌrs' à 0Æ|ïî=œãu]¿þêkÀèÓïxf}â¯OÆssÿÜrtnXÇÅõs°+ŠkÏ +1VR!Èrè¾… )¥ØÙ¬ûÎánwuݽH„Ä:Ü­F»~ž­¶øöëØÛ`><é ÂÑhóÒ¥¿ð›¿ù³¬üüçÿèoý­¿ùÔÓO|Ï?ø‹¿ø‹¯¿öÚ“7ëöïÏf³ÅlRߢrýÊÞ·.]ºtáÂ…K—.i­ë¢>::òccU…u]7Ú/›Ú÷}ÊÙx:Ίlc8¢”>ñäÝK—”¶ß|é•;wîøQìY-B0Îiǽ^‚f9ªyè…J)í´¢1M]4œTÂ7¯½ñú­Ûoâêf­"¦ÔèeEsl- €ÂÂ÷ýñÒJcÆ‹¹'Â@xw®X¨Ec´µ”R®µÔZ5Rk·XäÚ¾bœµÖV²¶œZª´Õ–ÆPeŠfI«¶ûBš¦ t¯× àMÖ“ç¹µ¹”Õtª‚ ÈKJ)â“6æµ×_å•WŽO)¥Aèç¾ï÷!Ƙ$J“4žLÇùbÉkšúà`Jñ£°– ±qùr/IswîÝvΩFÖeÞKR_'¬¬ê†8Æ©Œ”kï;;(ËÚÔbŸÆZßóJiú§ÐË¿úÂ×>ôÑOÌ5¨Õt°Ú.FFPMšpÔg´ï{†éFâç¶ŽýÈr<¯1ÍÞýû$ðâQ°½¹µµÕ"Ä-ßó!RÊn¢­ƒ!ÄM!´åFYCpþcX V”LçÀBP¼žRJ(qÄYk3Î9E,÷¹sÎ(㇞ÖZÖµ¬Ž/ôE]×E¶0ªaÄ9ç”#‚sáfµ)¥†6œF#kʲ¬ªJ)åqŽa›(I’$ážÀ×€Ñ@)…7ŒRÎQÖ¼5÷Üs¿ÿ™ÏB½x¾(€´¹iÌG>þÉ/á/['Çã_ø…_ø‰¿û÷„&q\Õuèù z¢eY2Æâ8Æ@.ÜZk©m«tÅZ]×wïÞwÿ=ïyµ°X,~çw~ç»ÞûîïyßþÎÿ·?õ©O}æ3ŸÙŽ.^¼Ø{bïîmÀš×[·nM§S!Ä{ßûÞ»û÷óÌhjE€¥IÜï÷s֓ɤ,KÊH„ZëétÆ9é¥—ŠªŽ61Ö·˜MŒ–xßN…~XWœ ”3ÆPÀY¢yž÷xc×b$Š"Tl£Æ`ă¼*KLìQJ=!ܪ18çȈ§)fsÖöPªŒnšFP… Jfvý­Q[£þ*Ѷ”À³ªëz:åyn×:êH©¦Ó)v²ÂUûääDk=›Í¼µ9u,ëzÇÓï|ã7UÝH)U#±HWÉ›dPìä˜-–óù•'ã.\8Ø¿úÇ Fyž£uÇ8w¤”Èà㛈8çŒ1ïomm„I,•ùò—¿ðì÷ýëÈõë×Þz>‚XRe¶6. û‘®kç‘ÎMTJÙ¢ÇñÞÞÖÖVÀE(<¼cÚJ©[UJÀƒ)§³\§µÄÖz:i-šõ@¤ºó(¡­ûkí©”{@¹qDjÛ(£-PÊ%Î9i ÊaòFJÙ4u]c´ ÉÑ ˜ÐZpB/ð±1v’¦¡ ÖZ!¨RHËæ¨yû T>rL@°õ~k é|{|=·å¡@Þ-7o2z«£=è»ö¼Ž‡€×ãW8Ïçóùáá!†4=—›qmÒCŽé6ia-ÀÞ‘Dº +¬ò=(§‡¥«OÇóü²,›¦F'ÊÚžÄVÚÙe‘G~eÙæh#ê¥e–e I†ÃÍét ÄFq$8ýÞø‹/þÉ—®\¹ úÿôçþ׿ÿ“ÿ`´µÍ9Í‹ª* Ä-@ II°JMÃU¦í%…}å²eÕëõó<ó}ñòË/eö™ßýÜG?úÑׯ½{{wöîß»xñâ>ða6›Ý¾}{ss‚ xå•Wîß¿¿½»C)ÅÂ'k-æÌ<ÏKÓ>ç^UUV›<Ï%‡ÃáÞÞÞÉd'=&|,ѱÖ"q¿˜M’d4õz½(éaƒ¦ÃÃCl(äû>þ ~ZþÄøø„qÚ‹jüQy‰ÊÆ­çÅf+ŽÁ™uEc~ÿsŸûðG?R4j´µcÜ)ä¡SÒK_¤¡p^Ú ¬ç´1Ä`ó©õôdÌÛn„Üë§½(‰9:µ¨àÄè‡.d Pqò>¸‚¹Ñý`¯j Û!¯æ¬[µ¦¦Ì#TáJ»²’yQ¤ CÏ9ÝÐ9'›&/‹¼(¦ÓEUUY–¡YøHm”µZë<«Œ³žç͇y¿ßOÃeÂðZk)£(Ø·´øÿ==^E’1dKÜ*Øë‚vþß ƒÝ[z¨?½“ýÀ_ýÙ<`²Öh}}¾I©æ³åññx±È´²„0t;¤l/Ç9@Mœ5jXÀ§¶4<ܼL®­2Ê+÷«ªšÍf„"¯V4 RU•” ²L;žg˦iœseYRJoß½óÔSO½øâ‹¶¬Ül:‚Q*ò¢@àßõ¾[¯¿äù ŸþÒ?û?~âø»WoܼxÄ ðãÒ‰x“¦©4Ò9°\KsÎQk™ç{œ{a á—eI¼øâ‹W/_ÿíÿøŸêºNã¤ßïçE1™Ï~ÿÿàýßýìÆÆæz±L—­W_}5ÏsÆ2°š¦ÁJ¤Þp ëk“^¼½}! 㣃CcÜÅ‹ó²,ŠhÛ˜Y+©DÛNÃ5MƒE èàî^º‚\­étŠÝñ&ã*†©bÜ‚†E8(óc˜Pèè¾ès£b‰”]@ŸXçƒ(ˆèk­ÍŠ" Ã^šbý¶¦×ëmnnʺ9:::<H@ý~Ÿ^pkk+‚s¶IüŸN§Y–€çyžç&IEQ³]¹re{{ûì™gž1Æ´Z-Çõ-ð<ÏÊɹU†@¤ K‹lÝׯ_?ê("f4Qþ´”²œP3›Í°Œô!Nvîܹ“ã~š¦“ÉDe¹µV áyw8†Æê\Yk}×ÛÚÚÚÞÞÞ>qww÷©§žº~ý:¤©ÔÖ´ÊhÁ8E~µ¢¦ïz*ËIc†2Ï•2Ï)ƒœ­”2Š"*úäûšRÑÏÛlôÞKÁ˜ÝÝÝ¥P[š8ZKS s5“öñ^c‡„ž4M·¶¶Œ1&WBˆÑh”¦i•/D.Ûo¿}kkëèúáG?úÑ¨ÕØØØh6›Ï>ûìë^÷º£ë‡I:ÛÙÙ!£kˆmÊrÝ~uÉ¢ ÛÅ!Ù?z󛎎66Ï:Nhº½Þ`0X¹Ñ(†à Øêv: _%If"’Ò/Ñ ¬µ:WûûûívûüùóAÔh4# ’ˆr}°U}cÒ¦«S\®âe™²Ót£úB,”ÒZ+pD¦µMÓ<Ž“4Í£¥Ã¬1yšMÆã~¿Üï&ãL+@Çu½F£Ñh4¢(¢r–®ëB®126Œ§“ápx2Îf3B7@p0È€YÄ(óødÀ¢ZX¤/þºÂä»h¥Yâ‘KG°†ã‹‹xAº¼IUxáÌ*†k~ççxå:SdŒHýõƒ£ãã“Yœ eœKƒÖZUž¼t-@½Â1àù+Óï0ÏÙ p÷HAUôIaAI’ˆÌZK¯HiÒÛ˜#'“I¯×cŒM§Ó3gÎŒÇã×Ã?üÐy?cÌŽVy»ÕLse2gú~è‡~õßýÒ×|åkÏo]ØþÏ¿ÿ;ßôÞ"dÐét¶¶¶â8&è"ÏóÆã±ô ×o™‰€–eY&„3›Í¢("r¯µj4ZÙY’üÍßüM x6Ç9{ÇÖäd´¿¿Oîíápxxxh­mu;a3£bÃe}_©u>žX­´ÎÃ0´Vsûûû~úACº¾ïû½^Ï÷Á³@\”UlŒ¡tÌGýøx<®*ø’¦›$‰øPñ< ¥|gg'žLÓ4B0×5ư"=ŒS˜L ïÌ“$9>>v¤7 4ƒ`#K¶ÄË \ráûþÉñqž¦ãxœ¦i–gˆ¨MnŒ‘owšÌ"y K8©×ž—¦i³Ù¨ÃDÓzÐZ…aHº8¡`zžçû>e‹µZ­ 5Åó<,c»&“Ét4¶ÖŽCÏóîºë®ÉøÄ÷ýçÜzEt´¸a4;ÍÖ¨5™LFG}ÇqÈÓÆ9ãÀ-¾`Àð%È€©UÜ·ˆhfÖÛ™ëv›ú:^gÕY÷ýf•éú—åk™..&¿/ýTžPØ¢)Ngggçøø˜+çœÐù©daUŠÝÓFo¤0Ê…A’µm…]ÀæA%U")Ut'6Lþh‹,@¥|ZýâRD­&ç\:ÎfÒsONN¬µL_ý _ÿgÿåý^ઉšŽcÇó9w„/¯ô¿ç{¾ç/ÿ¿ež°#±¹uáÝ¿ý~â_þ%¥¯TÊ¢-0éÝhe£(˜Œ!ä`0ºpá|š&B²\ç^$I‚w[m“«ñhÜ wÜqG¯×£üHÒD­µÍfó`ÿT=Ê÷m·ºQ£¥µ~âé'”Êcƒaÿdpì8Ž`òÈ#›››¾ïonn‡Ã³gÏöû}¥ÔÆÆ"’¶ª”j4dA’$ív{³·AvÚt–ŒFšœ¸†LP¦GxVëèèèÖ[oít:yžïììP©`DÜ;8<99ñ<¯Óé„ah­%kEUk*†GÑ[ÒuÀb Í…ëº, ci:«’;É}KubÞiFD"¦(˜”Ò(=™LŒÒRÊf³é9®Ódä§hm’Œ1%­ 2)çy>™L1˧X ÔçœÎfÓ[.ßþì³Ï²w»]RýóYJ>iJ,&›­ã8äo4K’$i4BˆÇ{¬Ý Œƒf³yçw‚Åk×®‘Km6›ý~_rÁ“R’ €´=zZ·ÖjZ­¢´ëöz½Ûn»í ÿðuZëVw†ãäyÀa Ç8·¹øžÇÁZШ³,é#ãZçL ˆ¬ˆ DŽÖÚY–f'Š;²Ûíöz½(à\"Š…]Y}¢]­-,ilÑ]}Ê‘Äʪ’HÍ9gˆ`­QJç¹µ6ÍfÓiìûÃY<›ÆY’Æ›Íf«Óîmnvz]ŠL_(Ñx(Ñr)cŒ¥(L°^Øn6›U?  ÀGóÂÔƒ¿ä0"Z@Áp‚¢¥a‡ /50ÎøêhCX\÷KLz¡0ÆìšP,¢ ¬”µ«mC|Ì”0–°0¡³¹ü[žìš©DΙD@cÐ0¦f;Ï ”2ˆ¨UÈ$³­f™o)Ði0ÅSP[k-0‚‘ÅÑr,Ë,¢-£g£sD4Zk•X“9RF §Û »Ý "pÕ ™:7¹B’Ðm,eü»R¦Zž×Þ ˆì†ž«”jøžÅ4ˆZ‡ûNŽ“ €ËYfse@J7Óö®/ûºGypû|C¢ºïËn}ì¯Ï¼õÍo|Ïh嘆y.Íáé$N±³É4k­µÚŒ£„„\ÅÒáÚdŒcžç.@2™rÎ7Ú$a¤ºðk’Û¯Rô¯\¹âyÞaÿXk-Þï÷Ólæ.Å HÉdv¤¬ïû®ëöz[[çòLÛÈ"÷¼4õÒ4=:<éôyðÏþú±G\×5ÆgͲL0„ÇÇÇdZ XªV¯ˆ] {{{£ÑHí¢BWTe±ŒŒkèÐCE×Ó4eœ;¾†¡]°È9'†ˆ˜"ÅÔq•iÇå³Y"˜cSmLœNâ,MÊ€ÆØæÖ¹4MShPÌd6Õ‰Rj6ÓA¸ÒÉ•æF£ÓÜhµZiš5›-×õ€¬ÓJ©Édzpp „àPxLyµ•´õ'ÏrÁx§Õ¦ƒíím f–f¾ïo]ضÚ%Ó8š4§Ýj]×GD@ЈÆŒ±Ü(†ÐnµF'ƒf#Ç,ð)ÝL©Û/]::Üýæ7~Ýg?{uë¶íÎÆ†ëŸå‚n¨´ÕZg.èÜ@Gº*Ë%0<äS,`ÌãŽ_ÒDWæ`r@0©6.©¶žïËÙ,}ê™gÃf«ÑjQ³€.`l™šµÖ¬†OÀá9"Pô¤SÈ:'Z§mÌÅ…`œW>#a…-‘fQÀ%r¡³|’¤#.lÔ Q¤ñÎîÌ(íyÞF§Õ,ÙœMa@FDä’,ÔÀ,ZŠ&+ª{œ¹¾ÇQú¾ @rŽZ .´1/a½[Á8žóœõÿ®ú‰O|b<çiV¤Él™F5‚n§ÝëõÚí6%@“öy||uZú Æó¤ãº®Ûš!›%iffIÌ‘ñyÍ+ZE>}–˜©Ÿä ܹ|y[)•Î(ÃTc6‹I'Ç99ƒ)Ikm´aŒ¹®Ë)ÈËw šC’ÇCáWç·¶¦Ó)yLgI’Æ„ÁÉ`q‡2ƘÅf+²ÖŽÇãétšmGäFŸ9Óµ¹½téÂÁÁÞ÷ß3<9zÇ?ýgÂm¸þY@°©Þ30 ÀsÀZlDa<™ óóçÎÑ~Z’×±ÞXC$ѬUJQàÂþþ~·Û•Rv:°ÑÀbÎ/­å+à±àTzä º¶éê*õœ‚•áô”jRh²h± !À"ùæ›Í&e !Œ1¤<œ& |1p®–˜eæ4ayµ/E|z™®:aí‘üÊjn•ç¼sEÓ—.¿ÁùŒ!ø×OY÷¬Ó}#Zv|||pp0O)m€[k¬…rÛÏw#_(ÑHÏ]Ú ¡XÕ¦eŒ¡F[­ÀhÆÀÜsÐs~ [­ˆÂˆèªñ8KÒIš[DdŠÄö¥ïQµ²çÎó|–Í8çQ#ÊÓìþûï衇fqlÐêÄ‚ïûVcà:ßô¦7?ò±?kµ›\Àðäúÿòoþ§ùS?û3?÷³¿üïì,™r«£f‡r“È#¸±±E­ƒƒ? J¢³PªDjÄ2\¶ˆªGœQ² Æ#ªäºn£ÑRnllt»]ª98N )eˆReª ¤*v] /jD|DiH”´£mªQ<4Ï´5¹VGGG×÷È~||<›ÆFéT›¥™r§Õj™V«ÝŠ\×ëv{Dó\!Âl6FX¹8ç ?h4I¦…¹JÓ8Qi†¶Ÿ,ÕúŸ $w ©¢Óé‘€| Bz®ëzŽ hLžçñdzrr¢­ª˜.–I¨ŽãÄqLùÍTûˆ!AÐn·_ùŠW\¿~êR¶ã8;;;Ä0Dô¤#<áºn<™Ò[ñ*“3¤7LÈ’Eã<ɳL«Íó[£ñøòö…Y<ù?ñãçÏž¹ó%o˜LÇí3·KaŽÆ³0ôs­\כŠ2ˆ^àÅ“YÃsU–_8»Ùð\ÐÙÒ–)y0 +RþÀ£50°¾RšÙd2ÙÛÛ£-ŽëV+¤òžH) ®©SË*Ái¾ 5g0ÅXk çœ1a­2 äÜ ðÛÝèõzaznà:‚ ?•»·0¤¯a¢§U”âÈ),è6þ’cÀ«Ù'®þ÷´f|=x.Ä-žPg§O«$Á%î[,ÇõÝ~žx´?•Rãñ¸ßœª"³Öh]â%!§„ú›j•ÌQ§)A)CÚ½(©ÂCuæ Q3‹Œ12u*¥¬Ö–3b½a¶ÛmÏóHËǽ^ï`w¯Óécï»ï¾|0Ï2²gYˆJg½vëU¯ùê÷½÷ÿyíkî ‚Àsÿáçöñâ_üÄO<ñ[ïþíG}ò%/½s< Æ[Q{<žÄq|öìÙq2*çnÎt‰ã–B ”gEø1ÌÓ[KcB’gãñ¸ˆ–’‘Æãq»Ýît:¤RO&“~¿?ã8f H‡f%ü2cÌ÷ý$É™µ…I#­–ã8Î`tB̉¬¦Ó)y7¾|xøìµkÄe¥”žãh­·ÀT"†i=ã\rþ™Ï|æÚµk„‹B–òÔj­«•Gª°q\cÌp<–’3‹Z[É“‚*+¸Ä; ÷;l$Ôƒ›¬µa£¹±±Ñët­µÃ““½½½8ŽG£²Ò$ÐhTøÃŒ1ÏóƒÁd4v]÷òåË›½¹®Ÿ|òI)å… ¤”dr/VGk©‡\0–kÌÓLey]©o0À¥£ÑcúƒeM»ÑÞ>³‘dÙÙ­3Ž#âÇ~¬×îôz½ý£ýo”†ÑxvîÜÙƒƒC0BÌkY¹‘¨¸x§¥ßW^U5¢wŒ1cìl6ë÷ûý~2™T^f­­RÊä7²v#\ŒEÄ…&‰¯ÂX*2AÑ@Fc:’–¾‰4…o©”Òyg…Ń àœ“þçºîÎÎÎ™ÞÆh4j·Û*Ëï}Í«|ðAZk+Žàãxj¾ãŸ~÷þ§ÿxþüù¨Ù|ïÿù÷ÿçßÿÝ·¼å-ïü‘ùßûëW¯¦ÉäÌæfÙ¢;N¯×£ÃDøFÃIåˆ% ’ø±ëúJ©Á``kheÐê4I5¬VKŨHá†IŠ‚™‰“qÎ)-Ë228›NfÇG'äÏ.œô Úí.a× "¥Kér.·¶zBÆÐ¨Lëœ3*áAÐ-ÃÚUÇyž“btnû,ù>âxVA\!"‚Èóü`o:ΦÓ<ÏÁbEÒ•?[ARËt:ÝÝÝ%iŒŒ(Ó锹/Üu×µk×(‘ÚCzØt:õ\I˜Se{£‹×·†Dmä j™™Î]וLP§V³cÐŽF£î•[.ÿ›ÿñ_]ßÙkFQžk&|ø#½Þæp8ô}—¸oÔô§Ó˜+²xæ9.ªüŽKU7£pt2࿤}|È2Æ(ãž“ÍÅÖP´ iº½_TBdŒÌF£ZoÖZà ÐЧysïV[N+š+œ7¥Ôt2ë÷ûI’Hé6FؤbÕ®ëyž%³5Ø»ºt^§§Å…²­%)/Èö¥È€ÙJOÉó32ßø×J×\Á}×äé °îYÅ]oÒ Se¤iz||¼··×ï÷Ó4 ¸DÔZ]i®Ë¦¡çls~Yè¶ÖjD#„ Bœçàû>cl6›_»víèèh<O&m9" ˜'/U “-ë±pMì$KóN³5™L(é¶Óé ƒ—¿âžO<òˆëº„VïúAǰ·üU¯ý†Ý½§'“i–§­Vôßø?üðk_ûÚ·½ígŸÙý½ßÿO~ü/_n©ˆ1‘ÉjB!"#o+E)sÎã+G£>›ˆ¨óH‘€"ôš1Çqf³Ùþþþþþ>U½¥¸•fÔ‚ ×ëÑ›’‘ Ïó~@=©òeÉÖ= ˵ÁhÜ8çŽà׎|ß'Ko1†B嶨ã!¥t]m-2¦­ ‡¥H˜À2293аµ–!Nœ¦©ßjiSR怌sžf³v»}öìYòV’AXñ™'?3É ŽˆdŽv]÷èèÈZk”FÄÀóZ­•4öCX)If$u%IÒétŒ1®ãnllœ={Ö¢ßïïîî>ýä“dÙ&÷-AIsÎÑjk- ãÂó„ÓŒüµEJ}%亞7žN\×ív»ÊÎ9X¸|ë•ïø'o{Õ+¿ìwÞýÛ¯ýʯRʳ\ÜóªûIЉ°™Ê=Ïñ|g2šyŽË9OòŒÊï¾rEÏfë ûÃn·3ËÒú–©ï@´¨#k€qFr@µœòLJ)‡„'L+ Á¹Æ¹Šïžbüe[º„ sŒ&n­ìt2;99Lj,Š¢fÔv]W Pd»ñ²A‰3J>à%c{µS–úV’ŽÒ%÷¢ü‚l«Ùçôéóoðï:ámIW^ú^ßõ_ÙZô:ð|-„”´···»»;¡@úeU’.q_kMeA­$ÙçdƧMÐ`lfl† „äÒé€È…ÜËR£Õl4Œé/M)|Å€«·¨p<È⊈d¡íÛÛÛGGG–AwsãÞ{ïý«¿ú+øo··989‘®»µ}ë'?ùWÛÛ[ÈÙ™s[gNúŸüôãwÝyg÷•wožùî÷¼÷ò©½;_òÒ½ëÆBžçyž[;Ó®Ó,’á*Yªžµ$fQ¼1½Ne µ˜ŽožæÅ‘áb_³Ùìv»œó»ïö’$Çd©VJ Á¤tœÀ!EJku2h„yžOúǶ,Ÿ@Ú9qhú®µ&Ä fô3ÏìAàû>'…^Ji9`YúÚj“çšYT¹é?ýYz}Œ1Á‘ÞÜ \c”RÙÉɱ1†@°ó<—®Ÿç¹RZ ·Xá ¤peÃsÇs\×u}×åœgIJÈY–ÑZœsâh·Û­V‹1¶¿¿Ÿ% º}ß§j ˆH‘Atœ[Äd.+³{´J³Ô¸Pã¥>¶··¿üË¿ü­o}ë¹3½ßþÍÿðÀ?~K·ÝÉ-ö.Üâ5›È? Óé„sÈr•å*ôƒ$Í$8Œƒ'áâ™s&Ëšhx2‚0×µ¨«EŽˆŒˆ2 Á¸Òâ¡H^¹³ÙŒàÁ;åh !­`lõ#§LÐX_صMm8—eõ^;‹Ó~ÿdoo?MÓ0 777;=‘„3`1º ±Êã]Ž©´ä%–ü‚ç¸KíKŽßT»1÷}ÎKVž¿tp‰?ŸKnªÍó|:ƒáp˜e™”2M²B×±dàÆZ+QñÝ…^•qšK·0pª!¢1JëÜZ àÁ8ÆÀ>õÔµf³éºîd2§iškm+X‚Ãçœ|Ô´ÒÔbDå)3Ïs)e¯×ë÷ûTLþd0ð{å+_ùÄO0œœð,×Bð»_vß³;ŸFÔ®ã¼äŽ—¾÷½ï‹B·ÛݸpñÜÿÕ·Nâäßþ¯¿0™Ž•Ê£f”RPÂ\sÎë‰Î5jÅ .+°Zù)¥5IœJ-)¥Úíveœ¨¨"šDš¦GGG¤)ž¢ëIÂÑímtX‰’h­Ç3ŠT"™ þh­3• )¢VªBèÖjm¬µ¨D Æ8pFÙÃI’Tfö‚C£!,„`ÖÚÂBêX,¢å#<ä9çl<^¯ÂÇȃKÀÝn×ó¼,Ëâ8¦µš-ÇqB’$ƒ~?Ïs£´µ6S) «rÎ;Ýà©¡4˜ZW”Eµ+Â0Ô©*5*’qNoJÁJÕü€e)¶š Q)õò—¿üíoû…óÛQýþïýÎ›ßø†Àó8g[ço±“i ÒIã 0˘ÏIšpp8gp~ëlèyf–ÃNOY3šŒÃ@®´Ê¢eÈ‘•ÙÕF£X Z4’Ìi¬¥‰¦¡PJµZ-¦^MjÎî%‘zIÀ2¸šŽÖZåf6›F#‚Y ðÓî5›MÏóIfLô@k²Ä9çfŽUaPY4Ò£çðB¿¢vÓ ˜ÆŽ eÓâZIây]^“¿þnŽk#"g.&…§µV¹ò}§J`„š+TŸ®;Dÿæ… «Ÿé“#.‚—2@@˱2v1F27n‘0^gÛ€¦îŽ­!.çûV'3ma5Ä"Ís!„ÎóþõÃÃÝëñxj,³È¥ãi­¹@á5‹LH@1†B0ƸµU’ƒE[”1…rcò–§–FRgZ€’É(ˆz½^y’çÙ`6PÐx.ó=ι2òFG˜¦ÍK¼‚&Ö‹ˆ“ÉÄ÷]ŠljG â[íF˜Å3Çs¯Ü~ÛÓO?=LÀõ<ËÀŒ6ÀÕ…‹w]ßÚ÷d–ÄoøÆ¯ÿåÿ<ðÀ2ñZ­Æl6ùŸÿÕÿ'ò'üà¯>¹E‘ÛŒ\×=>>æÀ2•…ž§”àœsáÐv0 ¯ŠXp i¥ñÁ áœ G@®óbH w\¿)Ýʧ[èÀæƒ `§i:Ikf4¾ï“†G†ÇN;ªˆ—-v1M³Ê’ONÐ*aÉVzM [frýj9-íB0V¦z3&Êõïç\– Êdn£“8/h4»u·´"jÕi ¬7MÓ4ŸeGº\9EhH‰ˆŽ3gN’¹Õ¾#f¬¡ÊxŽ˜£j¶– p…°B2.c•p‹JïÖ2kmŽÈ(,7Äϰ@ÿ ®Îód6›ßÚzã7½á oxC2›ÍæÕ«WßøÍß8%N»ÝØé´Lƒ8‰ãV³ã«„€—Éþ_Y2À,Íl!ãrG²jíÕ “r'·êàèhggg82Çõ¶šNÔèD•wYîr™e\2Î9”™T’/âb²+€:Qåœ'§j& Q³=LZ— Åý/¿e*Ì© ‰ãtN»Ý®²nVYú\0+}ŠT­\×ÍUþœ×ÖÛ:áæ }¼»q&S&͵µÖ cŒd™2\Ô$ˆzm„z+ ÔBÌ©Ôì– 2êÓ@k«µyš¸Ëêfç5îÎWO™µ €!2(Ën *egYÚ?ôãñ$™eYªñ<͈:ÓÖC[ðl­ cfEÊ ò’jAK®²HY”R6 JÌ'ó¦AV)|Õ"æœ31·ñ9 €gB"¤ÂAP*šŽãt»ÝB(c€Iµ:LRŠ?ÚÜÜ|ä‘GFÃažea£1‹g– † ¾ïû¾ï—ÿ÷ÿMë¼×‘ßýÝßûó?ÿó?õS?¥”½|ë“Ñðþû¿ò+¾â«þÏßøíáp¸»³g­m4¾ƒ4M-'Œ1ƬÕäàd9/U]aú77  Ú*h‹v0ZÖ¢µPa`X‡ó*À‹nGÃ’iDkµR‰µFë,M)m©¶ªa¯OY„ €¹óõY-¹%RK?eZ-Ïtm.-Zpæx¥Hy2„™å…A´L¢ ÷®=[õ°,ð§­µn°°Œ=…dsþ]ÿBQÙˆÈêö[ÄÊ׸´J©¤R%˜Ú²@rÔŒ(ŸÌT°a<ßvÛ-Ífó¿ûÉŸTJíîînmžù³?ÿÈ«^õª\ÍÎnm7{çÀP Á¹ ÄDc *ÉÁ£iÚh4<)Ñ"jD­µÃ¸±¬¿xÇwL§Ó£~¿ÑhœŒ‡­V+‘²k-ˆÀs<+Äà$›¹®nµ$1~ÏuNÆÓöÆ™F»=ŠgýѸÝênnª¶iÎrgŠ´5XɨèLaFD¢l8Z–1¤ýȳ<ͲœòŽúýÁ0Kcì¶+·¶Z-?j1dzŒ41”àœq@f‘1Âyfˆ(ÖbkV‡¼dÊø¾†ÞdšÅ³I1‰Ö¬ó¡ù…±¸òÇq(}QJ9X wP”v}ÞmY½{ÎF+»Ñhµ ¾ú«¿úxÕ}_þ<¯­üwr<ôÙý÷…1E¶ç‚Ö<صˆW+'Xâ¾Pú6VÜùÊ;WioK ‘¯](ëÌ2ót¦…óZ4³i2ަә.]W:N2‹‰[[Ô¢D&å<= "LjE>þi‡‹AgXyŽÐ?€êûRÁ"cŒ……,ªÃ¤‹T7'¸ ònReV‚n^Ò+L Α}9Àd2ÙÞÞ&eúÓŸþ4Ågz¡—Ƴ ðTž‡Ã¯ýš¯i¶[`L<‹=Ï»víÚÖÖ–ïûÒó÷÷Ïž?Ÿ*•$Iÿø„zâû!Ù“<+œÐ–Uª°"Ë6·qVíYaF-†¨U. þ.Õ˜HîÔ—Ó|ÅBMiúc*›kÕMêóRoPVõ©ž[q&m4Œê|Â]±ÍÜ„XñTk-…7¡š º›çøK“^îé}´`BªuÀ˜%M¨‡­8æƒÆkb\=§F‰à®ëž;wvt28{öl’$V«ýúÆæ¦ÉrÑðÿø=ïÙ<»5‰§€<ÉÒF³}tt´µÑ+°6ÉE Ã@:u:2“1À†a’$›››;;;”VGŽ’'žxâOþèx<>::*ÃŒ‹‚Qç;/^|Å+^qûí·A@n—f³©M2™Ä”¬ ȃ ðý Ie3âU´8ÂZ¯”¸êS ú‚¥ÌMsäžeªˆTP–1F¡Î”뺾ïsY‚¸ÒC’)0•Ç Ö²Š±-­.ŸyvïêgžD.‚ a­u„Ty bѵ¼jm|!Ž 6W ê[øÑG?þ»¿û»=ôUc£-@¨«ßwM»iL¢"@¡ƒÿøÿø×}Ý×5›Í4_‹?^ou"òwrüÊm—o»õ¶Y:BÐj¦Uä»^uòó™$YsªÔ¿Ô}õóùbðÔ\x¯Ÿëª6¬nhWø\€E©³g2•«$MÓ8N’x–çJ›ŸYÈ2o¡p»(ÖÖêwGT§BÍÅ ‹°©”]J'ø~HFѺÈZ›)…eäm•VAl•,Ϭô’Ò9„ÈH¿Jô1ÆÐeãñøüùóãñ˜ˆÝ`0ˆš^Ç¢µífkww÷5÷¾æÜ¹s €qO=ùä¥K—ˆc,X×uŠ¥IŽˆ®ëŽ“ cŒsi­µ¦Š%¾œs_(õ`ÈTa˜ªï^rY)ßnµ/§2QTw£QrJŒû%±Iåf¾ÆÊ OÏ`ŹScZ5t6kW«M¯WS©­©Íl=ÐÆŠ:æ%ò³¶ª~ù\’;µÌo@©ÖmXDdl^Žš=Zåi¥¦#"¥„µZ-fßh$ÓiO=õA;qÎÿð½ï¿å–Kׯ_g‚û¦³É… NöI•äíæÅý%wBÜÓl6­µ¾d­¦ NƘýýý?ÿó?ÿë¿þëN§óÒ{¿¬×ëmoo¢8ÁŒ$Ir´»¿³³sõêÕ8Žï¹çž×½îu.\Ȳ̗Üq\m/ª›h­™˜c_TIqÁ’(F«‚ÕblºŒˆy–j]|çE€+„àr¾IëKËšœ•Â&”€¾ˆˆl…Ö X¹Š§q²sp˜å6ÍóŒ•Ö8Žˆf –°š~ nž|æÙ«ŸùŒeN†À¬ïH­r`n†Î¾ŽK.*¹jt&Ž“ .þÜÏýÜ£>:›ÍX§¹ò}×µ›fÀÔ-²(¾ë]ï:wîœã8ív;ÉfëP¿°ú¾*šô‹qü¶+·œ?ž\#Y–Qf$ ŸîóÒåõãF­Ö *¾¼4°ü†å4ã_ÇaÍ‚>QYÞìp< ‡³,·Ö¢6V´V:NÉðH_)TQó…/ŽƒÁSÔ j0Ô쨈Hé)ÔDÙ8çQؤJÄ;«ï‡ÖZÕV«‹^ÝjûÒüÀ…1fccãððÊ9Žsx¸Go‡È¨*QšæÖÚ­3›÷Üsb<»®; (¾‰Éóœ<ýžï[ƒI~2î+¥T®‘sÉ‹²Çõ`>çÁf ²X%©,i$$qÃâÂ`Œqá¬sÁfª ¥ œZ„§ætþ z?ë‚Î:úÀaÞç…;ŸÂþ-^W?ÝÖÐLëý‘\ÔO{ÎV§{ {VÌq`êÎoÉÀó<“¢èZQìíìø¾ï7£££K—/èCBH'ÇAèYkg³€ív»Âu¦ƒI–„ô&€•>w'÷ IDATÖHÉLK0±‡ƒO}êSï~÷»_ùÊW¾ãï kP·ÛÕiV_ÕìgÓV«%¥$=ûè舂¿÷»¿ë¥/}i·»a­m5;ív›ºÀ¸)c;L}HI¼8=­Õ vÑ­Ò„Ð?…žPÆ Oõl.ÄÔö»#j´¯dÀ`VeI€XÀ¹0Ïîî?õÌŽp<é:³x‚Zei6Z§'÷‹À/•4„ú5Í““Îùµk×ÞùÎw’+áf™)|n ˜Ê{Åqü¾÷½¯ÕjQð…pVà@)2Ô/§/UjÁùøm·\ºpáBK©µãº“ñ8Š¢ ™è´æTaq@éûäe¡ÙÓýAD‚t‚€Œ“É$¢qžç$Iì8ÎÞÞÞwÜqppÐŒÂëׯë·|+Õý¦*:¶/ÐãFk!ešdä陦“¢f_J2DÑa‚þ€ÒAö7îr?Ë5 –¨ÿ.K$˜Zft}¸æ#¦:ma^ìœÖ q=útaå|=W«”1VÊ¥¥»2í Ì{^=å"y˜oáÔWoÇJôÒ[/í»Úù+($ÙŒÖ^EF‰6|¯Ùl6[-º&ÏóB(Ÿ%J©ápxñÖ[Œ1úЇü0ÇRº¤%\?wîÜt:àyž‡¡[@”[‹ˆTÎËC.Z3iš’{ooïþß? <ðÀwÞ9;É£T#²ŠO¬!%»S˜ÖÇïþ¿~ó®»îúú¯ÿú[n¹Çq£Ñ8{朵6ð%qQbí•>Uy}%T³@Ð7§ÇÍsÝ"MÎ24ªêxœsN†k,;ÉXtˆˆ%å*B^p —AÕŸY÷Ãk;»¹¶ÐÕn†œCž-ôü‹Æ/–LÐlîˆØjµßð†7!|ßãøfùéMGAK)«Ç8ŽC™àŒ±µaj‹m¾aþŽ|ÀI+‘^%„°50+ÙŠ ©ºô°ô“©Õª'‚Už<§Dç¾®Š\2ÆliâclÙqÍD®›`côiÉÔZK9‚ GD­”Rš!Ë*î[9€­.V+ôØÓBD­ÎêüƒŽPx‘iŠ:[ÒÿꜵÞy¨™C—ØRžçu–PýÊ#8$Î9qb*l`4ž½xÎó¼üãJ©ó/<³ûLq<={öÌ{ß÷ž×¿þõyžû¾×ëv¯>þéÛn½¢”ò’úð–#,–˜qÁ¤ùŠÃc¶2M3Ƙà]â7 ÊKåöö÷÷1Š"ÁLš¦‚óV«uË¥ËívÛq]ÐæÉkO]¹rò<÷|ßhmŒq=€[ 5j­©ÔÖ:žÍÈdÖB¡¸à¥e¨’WH)!'Nõšx iéÕ°t°­£Kÿ®“‡«…ê>KÏ]:î~å<ýëé¶ÔŸ5ï²°À–)ú¬¾jŠÖDý«%QÈmFÄ4-×ucI’€ÃÀX!D†v;Š"GHD4ý ȳÌu]*•A¡ ®çQŠÇ#ÂYk¥”yž¿ñoÔÚrÖÞ4= ë…Óªx ZUªee΀ªÊ¬‰³^·‘Öµ%ò½ÄQN3ŒßJ `‰/‘iÆ TÔÁWUY!MIŸBˆn·K°…ãñ8 ]×uÇã1">ižzùÝ/£W8sæÌg?ûÙííí°ÑPyî¸.h¥˜¸Â¼ÅIá–áÖZ)£”B, 8çiž×MètkNÜjˆèKVvj:–‡ñ´¸8 Ï÷0.B/µ:¶Q}´o^pŸ¯“uDm©WõEU} ¤à>D$0Î9Mf@ :Tî0ôƒ ¢(j„¡ÊÌvƘ)wGÇgΞ‡Œ±f³¹»»{||œçyiš;§®Xkã\–.•¹añí’4¹|ùòÕ«W_r×ÝGGGïÿûÃ0|Ë[ÞrSƒvã6ßþö·ÿú¯þÚoüÆoü³w¼ãøø¸ÝnÓhTšª-Yü+%a-ÃþœïøÂj/2àHcl!M¥r¦s ûÁZk×E™ÖÛóaÆë4^¶ú·S…¸ë÷YºŸçó8çJÝËìÒÞ.LX¬*ÀR\%J d*»KˆÇ”£‰TôÐÚ­­­ëRÊG}ô®»îj·Û®ëh­ûý~Q="ŽÃF#žNÃ(ª¿µ#‹ú¬~$I2N“$#lËÒ•ZVÇ%…²:m)¤Æ„Vˆ2uF¾Nr_çÅËOßgéòzÞ-«µ•7¿Ac§’4nÌø—¸oÕ뀪KÑ ‘O—VøJ)ß÷©’ÒÙsgªQ5ƈô4ËTa:6¦Ûí~ö‰'.]ºÃápooo0@£Ñ¨¤ªôBZQŽ”Äàký\:ß÷¯_¿~åÊ•ýýý«W¯>úè£?ù“?¹¹¹y³@ ëšÖºÓé0ƾå[¾å—~é—þôOÿô¾ûîkµZY–‘ä¥ü åÞ¹Á¨VmÝrºY¹üÅö<Û‹ øÒˆÇ@-= J·­ØiÉ÷m¶º±Zõ¡m®v~¥y¬»CýVÕ%ZêoJ]1àÓ×…¡šZ=ºJYEr %Ñå}^?Ü—R‡ãK—o}æék¾ïúêg^qÏ=ÍV£Óé´Ûín·Ûlµ†ƒA§ÛŲ‡æÎoƘ#„E®ãä<Ït–e³Yš¦)•‡“œq^äzYk54B,ã0WÚúcK–¼¥9==Sl \§°+µÒ•œ˜-úþ?7•h‰¸ßø&uF]²Y¬;b¢˜evDQtæÌªìä¸2ާ£ñA†!†Úñnþì³Ï^¹reooïâ¥KõðÄñGE h%c˜à Ї0.€ÖæÅwdEŸ­”r2™8Žó[¿õ[?ò£?Öëõ üç£Ñbβ¬×ë}û·ûoüú¯¿üå/ŸL&QàÓ‰²p5Í×i׫Åpœ¾aã*ÿÈ‹íóÒ^dÀ/V/ÞIÜ·ªiŒÏwàsRÏ›b½Õ ëš—ð~UÌógÀõç"¢E”oGM'ØÅt¬9ÿ(£IŠú …"ÎY/Iñ¥J)¥sá©§žâœïîî^¸tq÷Ù×u?þØc/œ»|Ë-“Ѩ×ë…a8¦ªÃy5PCVÄ1@ ˜UÇó°•_¡ZyóÏ{[⾌±,Ë<Ï« ‡„êJñ]šª>6|X²E !­Riš‚Q|rrrÛí·G£ .üɇ?<¸~Ï=÷Ü{ï½ïyÏ{Þö¶·å‚’L%ªÒ’«G­Ww8½–&·²[<™éÅö9´𠪱Òû[–Ò+U*x®¹!t]:ñMrßÓ;³2>ŸÖxn°×‘õŠÔïy6P=K^=)—£-*ÒišJ×¹pñòþî^«Ó;<<>{îüp8Ì2uxxøôÓOß{ï½Q³™gY³ÙœÍf¤Ö .ŠD¯â¡€€湂Ìó×iGF³Õ  ª]cMÁŒ¥ô°Öªþ×å¤:^BȪsè¥w/ÿyî`7\eÁ^ZÕ‚YR†>‡¶NY¿A'OG¿³2K‡œ”™Ójµ¶ÏmÑñápÇq…lõÔÓŸma3jA G­@àû ¡ßïApë­·æYEÑG>òbiT‘ÔkªFL†Á9‰€œjE[¤"Œ$š€Yð”k­£(ºvíÚã?þ]ßõ]t³&$øshŒ1Ïó¦Ó)U{ë[ßúÎw¾óMoz“ïHø«¤OXœµ¥é[ZB§×Ãß¾Ÿ+¿¨LS{‘¿@šÅ²²µ„2¿÷Xj0Å–{Îåÿ®"÷õÏJCÄu0˜yÄ+lÖZ´ÅàTý!1Å2Æn¹rëñáQ³ÝFa*¥ƒµöŸøÄË^ö2×uÓ4mDÑh8ô9gã¬f ´ÖJÁ™À"±›1Î8®tÜ&¦iš¦)9/ W%.°– KõÓi WÙñ†¾ö:†ó)/–‘Þ•¿ÿtx][yÕ nÂj¹Å•Æ9—žGÑÎFƒd²(Š:Î3O?åy^§ÓéõzTAg³Y»Ùò}ß÷}L+eB)u–“¥„Bó>ð„aèy/9ªÙ¡46­T¡S«8S\RLµA\÷LÓô‘Gyõ«_MoÚívŽŽ(Lìo߈ûRúF§Ó‰§Óûî»ïÃþð[ÿñ[8çY–‘t²ny,ÍÂJµx夼È8?¿íEüiu;g~PS+bÎ9Ç›‰C¼Á®;­ŒVj [ô<¹\§¬cÀÖÎï •ÿÕÚ˜ Ë.ÔØFªÒ¢b9"ÑÜ"?ØZÊ×êv»qkÏ‹ã˜Ð¤”ãñøcûØ+^ñŠÍ3g²4õNIÉ&U[:(,\°¢Î1ˆªpiA:ŽsttôÐCýÀ?ÿ¡,Ëš­U­¾Y°þu€_HÇãØó¼×¿þõïz×»¾åÍßLÛŸp5›§E·úŸ£­]Ô>gËÇ‹íí¦°޵Ц/q á(•J±ïxºý}9n1Ï2GHò )£¥#s¥*è»·já’æ„µZ+ô¯ ~©GQÖû¶Ž­{äÑ’s^«œî¼ô#1A(pûêALõ\ÑH¾ÄÒêØ³D,,ë ¢öù7Ƙó¨à…ˆÜåþÔú]p)@„¢Ànày@Y¤Œ *U‹ˆÆX ª®2Ï< GÀ!ÀÃf{2™<þÙ§@8ÍfÓ‘2Èr£´’йZc¸€È…»÷d‘ª rD0e÷wÂÀ ØèIÓ´€éÎsš#k-ºv4œ—0xÖ"ã$R,χ9De5P`µª3ìJZ9ÅëHUý€Õ>‚ˆ?”æc «),êL ”½ÖÏšF^ûÅÅŠ“‘~BD”‚!£HÎ¥,Êûôz=Çq¦Óé ÜjµzíV¿ßß}æ!l4£È“Ìf´þÏmm5‚Hå¹É £JµL p`¢Óëíì?óÌ3³ÙŒ;2­„ëÒ€,Sž”A €»^Päóq.ó@)å&q´ÀhcŒ±Ü˜þhêGíÞÆ™f³™¦)EMÃç©q‚I«Q1ãº>âìÖùV»ûècÿÚ¯ýÚããcƘçy9¹Ì]Wë¼¾ŠÁ^ @ KKûš+.­è0@›°Lƒmxí4ͬQž+)@4š!(¹Æâ²¦ÿæTü5æ´r;bNË*¥,3Ö bž×Tf¼æþk¾/ðqƒàAžç'“‘ú&M­±ÀY,ºB:`2=3`Ñ`ÀÔê©¿iL‘¶D½' Ì^¯· úï[+t…$›-Bp¶°€žÇVYö}ÄhÍŠ%ƒ?uç›Û“B¬è.viˆ1–+])@]/\²¿Ž¿¯cÀœ/üŠ¥åÙ~Á3ýnô|)¨kUìÉ1ƒÁÀ÷ýf³™çùÃ?Üjµîºë®v«Ç1Ùù¡ FUJ9žË朊!*_#ØQ1Ñn·ÛëõŒ1³Ùl2™Ìf3”ÜÔ/q7OË.K çˆäË*» *›Ÿ¹¤d¯ì'!µUm["»îœtÔgI‘ªwwåý«òˆõþ ¢µÈ9UÙ+Š|ßgÀŒ5T÷Mr‘eY–¦EQ†Qq!H¬€V«Õˆ¢t{žÇ¤ÔYvrr’eYEÝÍͽƒýÃÃÃ8ޱ–#k­5ÊR^Åè±Òå\Ãj`m¬YO7`Œcžyæ™K—.t 1†¾Ëß¾!b½²$õðÒ¥KO?ýôk^óšÙlÆ¢(Bk1-Ï[ŠŸ¨fG¬YŸ°ÈX‹p€̦!gà`ÆäyŽ8J)×1€ÕŒY®IƒÌ쑱GÆ!!$‚±Öf9çи©ñùB·ÉxbBEÑÅó³YVÄÃ3Ö„ÙmŽKÀ¥o™ÍÔºá¹iŒˆ„]Çqš¦½^ÏZ;üÐ{î‹ÿ4D0ƲÂ^Ī]ck…—o ðU­Ð€k–œâF뮫!…-òàçå}ÎF{>Ërr5fY^1,²5èÑ%á«WÄçÀ€«-] … ë¦î³^ã_ÝŸum½ä´.ÿ˜×¥Rz ÂX¨ÒQÆãñ§>õ©»ï|‰”2j6 Ï2¥TØhHÇQZaéΪ›¯•®*ÿH)ÿöÞ3X²ô: ;ç 7v÷Ëiòîl°Xd+’ešKØEز™S*ŠUÅr•IºD³\*ºXüÁ’PvY"lI4W&-@Xpìb±i6aÓìNž—ûuºé Ç?¾îÛ·û½;‹‡ öLWÏí~·¿ûÅ“C«ÕrEèR]8¢3"””XL–ªb®J¢ÕœÏÃ;'Ü ”„ ›JB"b ‰ˆ mÉ8§„€†?]c3çy^n›j¤ÙÂÜ «€ÛÞ ¸HŠÄMu¯×K“Ä‘Þf«¥Š¢Ûí:û‚3è€ó—&¥ÑUØåœ[¥œìë²à•ü 9ko”åŠFê.ÝJ™Ã¼<ÅAŒ´qqDôüóÏ¿ç=ïñ}ßÅþº€òÞë:0Ƹ‚`e…·ÝvÛ·ž}²ÛíÎÏÏ !¶··çææfçç‹$Rº'9ÿ¼!§X-8_A AÆ"1´ŒXêãÀãRr9ƒ$p 4®êö*A çf><ƒ¥Ñ ¿½Tǯœ:uj{{Û¤¬10r|IÐíR0Êñœ:ŽÒ}pÚ¡ p«Õêv»0b]Ó4u&[#Q½Ù@Ji­u!€¥§>|N%u^Ý×všT_êpwÝoKL=•áÁùB»ÔŒÕþa—ìa ^Uj‘DˆˆÈkTR‡$ÀT{ð+×à1ö¬je­µFƒˆz½"ÎÏÏ'I²½½ý<²V«µ¶avºý<Ï e¢(ÂIM@¥ÿuÅ3†©!ÊTéû6(eg0v6ËqÁ2GãPÂ~9zÜðš1¹_´EÄbd›¨ P?ÿÎ8ê(ûPÅCŽ‹KU½*xÍ2úQäN¢3©:ë;çœÁ˜ðWE7àP:78a Õjù¾oIÓ4MSÆX³ÙŒ¢ˆˆ²4B ’ÔÕ=óÈÔòOå²Ö!âRÓ>Õìx¡+ýß§ÝyeðÚÃRäÍÓqÙ»êD!gý~‘ Ïó8Š¢(rlJ™t¥JäGXæÓ ½^/Ïó¸Õ,:²j#çÜ—’n)»Ì—S¼fuøSóŸeÙSO=õo|cww·ÑhÄqÜív“$¹^*h×”eY™ëÆ…ÕýÃÿá¿»í–[ÛíöÒÒY«”šm¶3W%ÀåØkÏua¹'-CEŠˆ2n´Ñ C¶°Ö2ŽÒC.`6kzz8FÜ÷g]ám¨È*œsÂôPóóZƒ'}Ç·i­}ü¹(k!+½c¬("0TyŒx»5uµ¿ƒgÇqì&(Žãßú­ßr î•)^Õ€^/`€q'IBDN=å°¨©ƒ[vŸëïðªÎ–6ùýøþ|X‰œ³±÷lõÚ*Úe‡eᚸžà ΋cꡈx½lÀ‡%ÀõkW‡†£4’9Z+¥tá¤Î•Ô £333E¡³,㜗ܛө©*v÷d_æaïGIJy×}ÏG^µPɧ¥G+LJ`u§Ö2}y‘ÊÒU;‰õZß{SWç¶\šV“Ï‹Õî65oŽŠK1.$PZX‰Høžã]œÕ-ð}Dt!Ú%²†‘¯2"REØr-H)}ßï ú8JŠbGáòB̽¼ŽÙÏÐì—}ÝuE¿ø‹¿Øï÷»Öï÷“$9}úôÞÞ„÷û«)eÎ(îJGÜxãMŸù?þÏ 6×7¤”¾ô\çÈ«Ú\¨ÆT$P8åR9p!ƒ+m÷„T· ¸¬ú[¬ F$[qÖ>ZÓÇÃá ƒØD¬*)<ÜÔ¼ÆàôívûÌ™3ù“OæZC£B>Ý$ée°¾g/ÁÕ-Øë@·VZøN$`§. §OŸvÁmËËËß-Ø—ž+Ò>d´ó|xt÷)â®=3v Ï–¿z¥û§rH\×+­¬cÇìTéVb·aåÁ!¢¬µ=Üþµ%à©{®A€-Ù×ÎëE€×.E‡¦]0eQA4 '9y^P&úϲ †çyœU‘ÕÖê,3n×Q‰bÊô¥)¡* ÔÍÏU.A)SÎFIã‰È¨Hù¯4iPYõcÙ%­Ç|É%”×Uª?¼®M 2á&VŽ…¬Æ‘@ #)kí KWÄQ…C…Q¹T'î'vðÝh6ûý¾#„XQÀZUS¥ÂˆS¹žTI«¦ú=Õç©AÄ'žxâ¾ûîsê¨F£á4ä¥âÕƒQ½^/Žc§§ùÄÞóŽw¼cwwwuy…sÞÝë8/6£ò25G•ã±uš0™PÆ( Â3aصÐÉ ï£o/öº¶Ýí„Öwô•ݨ ?z±Ñ>¸¡´nË!Ï\ã’=:uê7—cÃçY–í^¹R¢”¦§ttL¾ÃÇåêÊ‚æðÂfç™—3Ú9°CKÀžçåyî >ó™ÏÄqì,|wØ€oºñôòòòÛpl£Bcâµ€iÿîú*è:ÛI¯;pù7\FÜ ¢ÉG„W%à:/èÃà*«ÞV§‚®³Õ‡W½¶˜s¬zД?w$* â(\b?¥”ïûJ™N§ãœw`4œ¢(>òáTIZ©ºD8ع‰FyŒË8’¿aÒ #q¹f\ÓÍŽ.†¤×‘¢²,GšgS2¥{\]|ª©”ÊŽ á9„îâM÷PÝ£áöCÍz3Q£b,I#1ƈ´Öyžçy®”JòÌ9¬yBÑîÎŽ1fuu5Iß÷=ß·Æôz½4M]†¬û¾ò•2FGéˆHžç¹³_²)ÖZÉÜs% IDAT½’_öü 5ÅîLñInqé—~©ßﯬ¬8ÿvÏ¿® ¸M†ažçq;MÌ{Þ÷¾ßü—ÿrvv6Ïs2–1!"ÎÍ4àäÆ;îpܳiÄe`,.!/ ÒK½oÝÿÕ+W®tZ;Á-Ò—B¥¹±Êò﫚j¸5¸–¡„¨×ëu:„=vÁ£7— ØÅÓ{ž—¦é½÷Þ«Ó!'€s~fºJßßÀ³ë3 xÏÛå‡~~÷lçÐX©úý§TÎ#²U†±z ÿF}¯t„2Ë2 0ÆD¾Ð:'0S¹¯(ypÁUu¿+Ê:޲“ª+ XC‡«Ú s;™©0Y®ò¬È•vF;î°Hi« Cˆhé€õ"û M1 >HÂL!.ŸR.U7?¢ÆÒÀÁ‚š55ém €A¹{Ëf8G€\@Î'áqC v—¯n;ÆÞ*Úâîz·v`5÷×ýâÕ†ïœÞÏ÷}ÏóœaØÅ)5£ø‚àûïþ» ýNg0¬9¢Éäyø ’äÂó}°tpšï5(ëÜ6vÌ¢B™“ð|ßw%„G€f«ÕítvvvNœ8ˆ®J•2E¿Óét:Ë«kÝNçÑÇÎ8v°ªn-}­Ë‡î‡zSÈá ˲›o¾ùìÙ³Guv®ÝÝÝÅÅÅë%[kKí£ ºzõ*-//;ŽGÎà 5ÌVÕ®[kY%ÇxUÓ®µf¸àÙÏ.]:»ýä‹z{óÍe‰}óÁ”Wü(…Ô3/.¾ikëqì’Ò©ä BÁûþ.ƒRܤ‘ÃKYz¡Zúr ©^}ðßAÊ÷ÒÆVnÁî¯o¨æþ‰QTˆÖáTô‡…k˜JBÉÖ0ÆÖ76ÖVWµÖŸûË¿X˜›ï{ßÛ˜™t»V°FÜÈòÌh݈g™CÁ÷ b#öÃÅ ¸¤‰0iw í¬].{FE333am¯\¾,„XYYÉó<ŠãÙ¹¹+—/Ÿ_X0Òó^xñ%gnÍιŒ`Žu:Xæäläûáz`Ç.¼üòËùÈG\Ù¥ªÝ«­µs†5Æ8gÒ ž{î¹›o¾FÚéªEœYf´U…–Âxç“Uº÷›B„'©_@#€Gygý¡§ô³Ó< ß,öM Søgì‘óÜEoéÜv$ø"4 ¶­PÏ ¾oN(Ù’ÁwØy.LÚUÉ$ì³ùíÇ ûU.Tƒ°`’ºWm¨‡W]ù< 5‘-¯ä”ômÂa O©ó‡¡‚AÄqLDk+K[[[*/¤ðµ¡øÆ‰'Ž;Æ$kïµggg™ ’G„¡£Á‡zîßbp&v™0hT5¤( g=m4‹‹‹ÈX¿×ÛÜÜ^ZZj¶ZÖ˜<Ïû½ç|ee¥(²4ËŸ|òÉ4+öööŽ?‰œ Éei¨v “µÖ]·î׋FA°ººúðÃsGsîj _—ÆFÅ9·ÖºìâGŽyà~áŸüc÷Wgž, 0ÓZEátûÖSßÉ‘ÛMÓG“Mýü¥™½LÏIȯ[IãïpèWäpù‘Çà?˜=·ÁRŸ90ˆÙ[*èï6˜BNqç\la!cë¤TÓš«j¤«æÀÇÕ9g9ÇÝýªïÃŽ«ö'8Á7Œo{ ð5l¢# 1´):i8˲F£á/ø;[ÛˆØ ®^½º±±qÇ;î‚ ÝnúýÇOµYšJ)-MÛ–FÃýÞ1œø[U‚n±Óíöû}ÆØÊÊJ†Y–¹¬·Gu5J?2WíñÉ'ÏpÎÓ¬ð}ee-W…Nušä+Ë‹lTF*qMu> × Œ17ß|ó`0¸xñâÚÚÚìììÖÖVE×KCãê €¢(Šf³ùì³Ï‘ÓÒ;'Œò°#¢ÖÖ(¹ËníXÉÒ$=% +0žÅÂÂÅNûÜöÕµ½þ¬Å=¸>•$þvCéÕQ{b`^ÚŠ[Ž™Ç»t­'Ë[ð&†ÒŠã¼[+Ô÷AvÊ¿&IË~Iwêçå5Gvàk›×&H¿Þ( ¸Æý0Z‡Âœ`Á„gXÜlÍÎÎÇq3͊ݽ‡zèÌ™3FcuuµÓí\½z5C.„­ÀuÔL~7‚µÖÙz…J©^¯×n·à»´´äjR¹Ò{333~)÷öö¶··Ã0ÔZ?ÿüóßúÖ·˜6Ôh4”2Úš,-fço½ãvß…ðˆPkëL4Œ )_ó˜–¢(ïºë®/|á sssý~Ÿê=¿pŸÊd^AüÙŸýÙÝwßí¯ÊÛœ¸T›9fÝù“ã¤'w{y­µ!`›^Ú%†(òëæÂý·JŽ&C àðì%ïm72) Í @½E€¿Ë ä í(U¡Ó?ÃTå>ÓN•´”×¥Ë@ n÷Te‘êõ~€Iñz?=¾^0ÅÔκ~^£ÿ¯ÊçA`]vI²®ÊBÜlxž×étî¿ÿþx Õj­­­©¢ØÚܬRßk“ü×ˈ\/ȲÌQPJ¹òPY–…a833ãò ¤iEQ«Õâœúý‹.¸"<ðÀc=ív›q®µNÓÔ]\\{½^Q.~7ðe»ÝÎó¼ÕjÍÍÏ@2äyÞlδZ­§Ÿ~z{{»ÑhH)Ûíöìì¬ÒZÑœ™•RªÂ$YVWdý^ÉAÒÈ+ÕZ+jÊçÕ-Äa‰·Ó ///Ÿ>}ú _øÂ'?ùÉ ®c5$—ŽÍ%ÀbŒ=øàƒ§NZXXpû*¹Eˆ#Ã8JÕ^šN8Óà  iѵڻÒé˜Âç6^MM·`Sû¤‚) ¢3XDëY§!{¤Lš@#:´l ¢FH€7Ú`Èåw !¯““Á½ ‘{ ?V š ð;ƒW#q."sÆX­µd Ѱà ë!cÔ” ;¼Ÿ<ÆDh-”¯r~¦^û#€¯ªêÚ©FŒC‹å €¿®ÔIûÂó ‹ GŽa`¬J‹lÍ4f¾üÕ¯}óñ3{ƒ„a¢tAÏÎùæüâÒÜ¢ó4’…¾ }Yd}ä@h-CÚ‚FL ðø·9Þñ©¨ýÞ}Óˆâî^G0þ£Ÿ¸ç¾/}¹ßíõ:]ŽÌ¹L–ùMRú’±ûS™ÁÊ‘OÎy/ë7Zq¡s/çÏ¿|ß}_úéŸú‰,ਮTé-¥¬üp9±lŒ1@Àða¨4cŒ3†¤}8P—nÒf}Q£ÎÍ´çà+î‹Â·(—Lpm)Ì5 ÃÖ4[Qv»0=ߟ+ìÎ^¶"4~bq¹0A0Û±:½–3iKÉ¥`EQ réÇ…á] ã¦Q« |-7…œËûó^Ô!Ë O63uìša=kgEXŸ®‘7¤`ï2Þëä7n@iµKöB3:š©yËg=¯¸Ñùíœ.‡33…mh3ˆ} lŒ°"šÁÛ‰ˆ ãw™^§«pìïíÁޝm.úÅw‚²\(2pÕ4Ñ¥†~ ^py Ý1Ïó,fn{Å–… ® `¥À€Ã€.5à™3g>÷¹ÏÝÿý®žØæææîînEƒAOë"Ë"Ã9ºdÆž'\ö•BÙÈw½R:\_ÀŠÍ¢$].-­…”Œs%¥rus·¶¶î¼óÎS§N­¯¯Ÿ;w.Š¢›o½5M’n§#|²ôâ•Ë_øë/º]dW'ØÅd¿Ñ㞆n¸Ak½¸¸øã?þã¿ñ¿‘$‰3Ð.,,äyNDq»œ¸A½Küüü< $ídY"ºý–[]~étüÑýÑ?þ¹ŸÛØØXXX¨k§dKâtÑeìâ·É@vìØêêªÑÚZÛn·ã¸QÅ™3O:—+O(e™L£œUι¹NÞÅ× Fý···?úÑž;wýì§?ýi? Ö××ã8v‰\1I§L>° ß÷Ã0t¤Ñ•ÑZ?òÈ#7Þx£1æÿú£?>~üøí·ß>77·±±§Ê( p¹(Ø(£¸öŠõ÷úʵ¥Ü—ÚóQ°T)R9SšMqcŠ{DŠï0™°p9`³½Áß¾èÄÞŠNæ}˜óæu!^‚ä":ÞóÂ<ÏŒê¡ Y¯w^ú»Íf Õ¬*ÄzD3Sž5Ü“Í,ëxœ-ÌåÝ*jü¸S3 ˆ¹—ô^dt‘qxª°½½,^Øñ¹¿»¥2Úͳ¥…µ»G3HÃè¼±»Ü€…¥Fç|/ïw5?‡&ÀAàgiŽˆE>Lf­uµ¯ß‚×ʼzއu²/c¬í×½| J }ØÁ¡ ò<ׯ"I–?÷‹Ͽxv0|üû>d­-Š"Žc¬Á¥'óQ®rc gœ!£7Ðw¼ö¹ a‘µEQ´ff€èòåËN\ZZ6EqñÜù[︣ÅLÈ|¤iªÑœ¿xQkíÉ`gg‘·fæ„™VNÿ•,Wߎèu†ùùyDtÎÛžç}âŸøÝßýÝ?þã?þ™ô³žç…aØét²,[]]µÖ¦im­½ÅÅEg w%@JYÿôéÓdìgÿÍï÷ûý_ý•_1Æl­o´º©ÀI§B#"îñ²(Eu—^/' =˜“a¯5ÓY<Ò[ì ¿k±¤ŒÌÍœ¿xN½ô­Ù|°ÞXÞ:yû‹KkÖjÓïÂÆúÞzÕÏ“;›³sšäør7LòwÈ» °íGËVÅd¶OœôÖŽodƒ…ÇŸ:¸ŸÆöo};§,ýÖcí$Ÿ“Qäù6íe^d"Üz+¶æzÝ/ „üØ»?øÀÌÌ—‰¯öuj³¨Û™Ý¸(|ø\‘Ú#æÐxäbGA·ÛuîoaöלÍ)Ÿ ¾=mä[ ôÂYBÄ0 ²,‹¢hiiIk½½½$I†÷íëaFQtìØ±V«¥Ec­µ¾ç@š¥ZëF£€œqK–Õäè~£Gºåj¾C¥”VªÑl2Æ676 ÑhAÐét._¾|ÓÍ7Ÿ¸á”µfc{kíÈôô³ßò#¿?dYÇvõÈÑ ˆH+ëû>N:1 µÜoà˜­u¯×k4Q92üéOúþà~çw~ç~á\‰­8Ž/]ºäB­êçÎÎÄqÎ$¢@D^hK ZMsô˜\½©ÿÍ¿^Tiÿ~äã÷ð/ßá,þ&äwõÕKÍèHÚaq39y3έ<Û»zk]?NV™+—Ï/ö.GÄæ!Js³« ½¶Ü>yr‹í"?mYJ;¿tîåGnܺòÁÍ6[9:ÐêÏïúèÞvÏ<Î{hì0¾\+³»»[Ö©>l;oƒº©»†"hJù<¼ùÚ®OûTÐß«^·¯78Á+…ðÜ÷½AÆMkíËç/ZkgæÚívsq!MÓõ­õ-Wñøñãq÷ý¹Ù¹°¢`$ 7õuPei”‹MÑÞÝ]___ZZš™™q„dyeÅy8#cIš>ÿ O?ó (¥X‘-¯¬ !¬ÏóŠB;­€RyIw'÷&CA.8ÐU•v"æìììOþäOþ¿þg¿ò+¿ò3?ó3·Þzk¯×;}úôÆÆ†³jØÎì쬑×××}ßãxooï‰'žøÃ?üì]ï|ç'>ñ km3ŠÓ4MúY“°½ UÏ §kq©ªAŒÒD¿29tz=#HË5Ckr-±¸ñ¦¶…½Í‹7î\¼ƒD/š[gÂWÅv¿ÿüå‹ç/¥³Ë…`¼³#rÄÍwÕ!"!©\qfæçÌÂbòÿý<³"À“g NÞÖY8r6Ó§¬Zð™×·Ú9bzä”ö|cÙÕöÞ@óÀ~ ƉzÈ.ž¼1ê´ónÞÒøaWíÔO®÷{ÍA·¯v…YïmuçO>ýø^ª_>×û›/·ïYƒ·½Ï=±˜š×˜ “IO|ýë_¿ûî»]MÄ×:³Ì[P‚#À¥òùÚ7¿¥‚~cáÀªvˆÈwÞ°ÍfÓ•Ûsƒ\QsùHढ4MŸé|¯×[^hfkÙÌÌLøDDÎ3ëMvT9Ñ!wçËkïî®­­‘« åyç|g{‹%•³ ÛGN¤ÎF7ø E½´À(ï ‚`m-|±¹[PÓ€Œ-­èµ#`{Ç$/â¸)ýÌ·àÙ£;™ß7{K'Ã矻°×îÌ­Rçë[ó¨  Œ¶Äé+_ùÊ>ðWßÞyU¼¯58ßEW÷·¬Ê`­Å·´ÐoJp¨ªý'ŽÂ1ÝòËU#`Ú6 =?ô½º² IšDaôFo87DTJ%I¢µv&OW.>Š"Gž~úi—ª"œmõƒ“'O !’$áBkó¢àœ'IâÊž§iîü÷´šKË( a²å7™JGkýôÓO;v¬ßïƒF£!„h·ÛFãÖ[oýÕ_ýÕ{ï½÷—ù—?ô¡}ðƒ\]]­`öööcaîîî~þóŸøá‡ï¼óÎ_ÿõ_Ÿiîììxžažç’‹0 ­µuø¿ê`UnB×O—MO ¦•u\ãubí”)Ȳ,³” ©šó¶Ñ”Ò³{WÞÝo{#WÒÛ33Ÿ¯m&û-/Ïu7{Vë®w"¢Ig´‰Ô’œI(PÀz"\ƒ»\·€;ºŽ@Y(¢H…Õú«ßxêÖ¿øÊýÐÅ3G²bÄÁMî€1ã_w@^Ý÷Bdh Ár œ¬áPðàÀû%— 9U\ZkHÛ*¢,=š¦Pg lÔ®+×SÞ HJD€U'©1!äâàd4ŒÉ,Ï8çRHm´K×GD`‰Œ‹’!jc”¶‡ƒ#X¥N3N¤Ý(cœWW42Y¦Ä‹:'SÄòT»ú*åÙ>¸Ž¦©áÐÕøñÔÀ¸¾÷h>§¸ Ë´»§CD^ÓÿýNCÃvHW¿,ÿ¤­­ù«|XÊ¿ºï¥˜Ê³1Ôº-V#@à £$GBft!EéCZåR0î·¬µ^ØDÄõ­ö¥«[. Ú]ï¸- CWŒsî”ÒJ+Á82¦•R­9çC«Im€s°Ã£}M¾L+m¤Ê™¢`ÐÛm4GÚ<¢!r0†s¡”:{öìí·ßnŒñ}ßqŠ2Šú™"Šã¸9?”tÀ‰æ, j‚ hXKHL0NÖ&€Œ X£mja˜X €€cH p”}0JÖ}àŠ+RSÁšŸØöåö˜L‘^A .{2ûhó‹ I–2ÁÀZq)Ç4Éâ(ø?ý³W®\ùú׿þ‡ðûI’¼çýï[XXpNàQ)¥ºÝî`0¸xåò…—Ï=÷ÜsƘ÷¾û=ÿâ_ü/+Ë˃ÁÀ*ÝŒbpêzÆ ¹ì„$‡Ý#·c‡±DÀÜ>%Ë,cƒLÒ‹|.4‚õHz½ÞÀXR"wAú5¸¿Ø—zŠ\UüYÊ”Gérª-`JÊo@Ä*)ÇÄxÇœMÍv¨Ë´e˃=$½ÃóÏ*íWe˜Ñ‘»æšD¦êx2¢¬£kª¼`#7Q´€`ÍØ!¨J€G»‡ªb‡û! V7 ðñÇʸ‰YBKÈ ã\HF Ö·öŒÙI’$IWgyyÙ÷"C¹¶\reµ&íDí0À,KÁR(¢n·ÝšŸ€¼È}1BÜ“ tæIÏÚÌh <¯ÛÙiÍÌXcâæ,ôºÝV«•ei†ý~¯³Û^X=š¦Åm·¿­ÓíEñø™§j}õØq!ùùer3œWíjdÀu¥DШ^ÞôJU²ã@u{»õ·v4š4Ptð¾2†Ü‚L yôÛ‰óBDb¤íŸZG±O >äÃhhIu#uXT–{\H)£ <}ê†Å¹ùÝýw1_úÊ}Ï=ó­/ñ¯777³,ó}ff&Žã¥¥¥[n¹åî|t~fVJéKÏæÊCNöàjfnÒH(@æú_rY‰# "1²ÖX•& #nazBZ2D¤0 cÑ‘ÑF1På¶Ìä« IDAT“l¼«hÏÓñ,z)§L¡Á´PE–$à{‘X²¨”ÉsÃù0 ­×ëÚº‰92oŽ¿ýÙ½Í;^>Ÿqî‘\H`bßk¨"Éú]íyŒ£.«[O0|[{§»u1ºí½Wžøjp×Ç’öN£ßÇ<Ó>!a(µådqkkã‰g~òÉfÂüH®5<ðŸ]ö°§¡j °*bÀ%r—»mW'À è' 1„/>ôàç¿þà¡Ùë-€Ô@Éqv°Wáoþ¯ÿóʬïKÎ9C9ÏóDo§d‡«’bY(m< oƒ¥˜›kÝ4í¤÷cùÜL©juÎyš¦ÛÛÛ_ýÆß\¾|õê•ͼ°Dåy^dGK9E}KïÊ 0LIÀ’_‰à¾ <$£™'êõkIê0ÒÁ?°ãˆhVéU-0˜X©²·v,FO¼kšÐ”ÐŒ>˜4áÃÞØ>ç²ly²ŸÃ Î2ÍÅ0©YW^~ä)@)å1üÏÿé?ÆÅ‹ÑL³9Hqg`ermTk¾ À÷k@Ja‹ $ç6ÏZ­ÖŠû[[[çÏŸ?räÈgþÕ¿þµ_ûµG~üãû0Î‚à“Ÿü¤çykkk—.]*ŠÂ÷}cŽ’4‘mo="Žh)ShY8hÓZ£ª‹5žáQ÷\îhJˆ¬™jǽcÍy1ú`Õ"ÛWm FÚ¦ême;VÎ ^"zž‡£ðV·² áG‘ÔZ÷¶v÷Ö·öÖ·ž;óÔŸÓg _〠-ìÔðœ–Ê'ÇQºãSÌP "c.%÷<¯ÙlY[»å–›î¸õ¶“§Ž·Z-Ë}©4 @d…%emÎFx•&O ÕPÎ…6*–€w)@éS·f* .¾ÐGð$÷9·V¥‚å­†XZG>úЋ/lýÕŸéÏÝûr?{B†:Sz‰ó-³Šï P´béó¹­Á&üɽ0aòcÉ2ÈçàOïåbFd]oaµ÷Ïß¿öËgÛmÛ˜™SѶgïý´5ÜäÂÓqC(e’~I¹x#{鉭/}®ó¡ç›w|西øü_/ÝÆ~÷OíÕsð±Ù:¢þý¿ûš±,Åüá5õÇþ{ø¡¸“tgìñûm»MÈûNC-Ô`` X@Ð\§#TÖ`óišZ°`$—`ÀZõFY»" œ˜`Ä8à Æ­{kÝ“L nŒâè­$sXJ à˜ž(:¾®¨\ö£o L%9¯ý¨’b°zœóD°Ö"C!°¯²N{;ËûýþÞ`Ð#œË‘†0ú`„UV®z¯0òc c™­Ò%"ªS1M©²«xÿä b|hlÇc¬>Âr3ºÇ‘1¨«û%é Å0l¼ ªïn–ËK*«*Ř«y ÈNLåSJ ºC”ަ#¢AÚUŒxâ¼\>¦D4.@˜µVèýWŸüTš¦?ö‘ •ÅqÄ+€.·Ö׺ÿ>­Š­í­™™Vøfò‰c ÉÊ¥”>Ÿ?ûÜM7Ý"…`œÿ½þäÌÌŒÖ:ôƒF£ñOÿÙ/#â?úù–ie™BóÂKçÃ0”œ_\ÜÚî¢КŒ±Ö2GŽ ”Û‚Ö™W:!Ø8Ƚ—½bfÊ82œgk+¬‘)¢ š&Àî‚•ÒJ•U‘ƫÊ<«‰º.ÏWµ"â%>Ç'Np.„`ˆŽóænÕ¬5i®F)<cžç5¼À•‡BK¹ð<"2Iæê(ð`Œº'x5õ¿"€«8Fˆœ˜F„HP”õì¶ÕÇÙÀk…ž$âA‹ñBƒ0¨X¡‘4G 2<0÷ž ¹ÅäR„Öhe YXô6›¡œÑÚeÉ("2ýn®Šôño¾·OŸÑÆOýÒÌ¿ýýÎÎÆ,àž ·t  5€MúZ B‚R Œ¹ÊAJN`²‘˜èûàÅG¡· AÈú{ùÑcðìË{Ú€R@P(­ Õi+ @…V˜°!<üµÆmïëýÄÏ-çô¥³=PÀ¸ïyª(4Ë4x2<÷xøå/ò¬?wÇÛÛï|?½qïÿþ7+€µÉ¶„Z¬™.k‰¹4€ ´A2T–Ö@Ј³$9Ôƒ¯¸tÖ–À’±ÖX²@ÀklŠB°V«a­Í ÅZEV©Ü÷CðÜîxWEøIB;-㺠cL‰¯«ˆ›jTa“ŠœÊµ5ˆÈ!‘5ªôºÛ›ëëë»»»ƒÁ@z‘£v®Ï¼¢²«âŽÒ¹c?m}d%žü~ZµUÓÿ!Ž ¤£S3ã®ëlÀ„¯H™'0Ø1R«^°±ª”d?¸}6ÒMOsQÜ+¿¯>¥: “lMQC€Ë ¡jkUMŽŒîû¶_µCvªw§e̺òì–cȸô|1àrss³ÙЉl«ÕÚÚÚhÌ,nl^5ùÍøÈ±›~ä¿9ù_ÿØO{ž(Š,ÍSSÏ-Ÿ%„çyž”Ò÷Ã+W®ü·?ýó½^¯17ͦ¿½¹ÂO3µ²²rõêU†™ùÝÝÝ£G¶ÛmWLð¥ó—VˆÈeA$d\Šá`Ĭ b$›œÞáØÙ¤ãwIö؈p:άœ\IlßJÀ©p6M8‡ÏŃMœ³©FÜGAÓ*·^…ÊœèïšÝœpÎã`¿ëbýÖª(¤äÜÿ¬qi´›(ŽãΠw`†ûgØ[gHrÚyr)ב17ùIdFgiÚÞÝÞÙÚNŽ `É‚%)X CD€–M§Hª`IánŸ@ßqqa› ÏXR–P . *K“~Ñjxæ¡[¾õôÞOýsþï‡/ü‡=ŽP¤2 ™%Ò tî+ÀJU`"¡—g ŒŠc$dn» ÞqKôoÿU@D™n…yï Hô@VE±Çy˜¥…RHàq¦¤(ü@2€ سw} ó؃ÀxS©B)%=ô‹˜í+«¢&o÷û†_„ÇôU’ÿƒë¾ó.zôÌÓP µ˜ØP¬|À@oÐõ¡*ë ߥ@÷;oT2Ö¸;Ì=¯4€Æ¡½ºÎ¦8 œs¦%íbï\UQ§*•åžv:½Š¼XbêƒuM«¸ë*®ÓÅWŸU}J¡5ŒÈ§«³vucýâåKª Îý °€ÒZÒZ+­ŒQ eUMQÐý¥¢#µåp+ˆ¾ÚIk'¾©üiʵҎúp°† –׈ÆvL€©ÚO§QÍ0ÂØ˜g‘Ft²¯u«¶š“éðax°VYýijŠJo¬iÅ&M X#(Ueÿc8ÕÍ1Q§ñð]cà ·ä<õPz®,Ä IµÖiÒ¿ë®»ž}öYι֦՚;þÒÚÚZR ¶ˆÄz{†F=žÒÁÏU…ZŸë÷û­0š_;†Aãòå«QÜÚÚÙ ‚ Óëßró-—/_ž[\Lò\ø~–e.[ÓÞÞ"¦iº´´”$IQdnˆ¬ã\Rb§,få¾AK@¤­ªöd<Û•õš$ö@',„¡ñ•h¸î·fÒ‡`LÈ÷©¾Ý»ÒêÀï™5ÕFÊï5M4[®{ÕR€.R‹s^(U­²å²}yœ*SJ‘'¤ô=Ò¦×ïomoGÍxÿbAu£V4Ïc“"GÔŒ yÆqŒŒcJëíöÙ—_ ¢P[só-oG㥂!B0DUoó)ÔWa–Ø€ ¦ ©Ñoǽ~[pO1D`ˆ!ÇHr³›=™æ{[ÛòÒKÉÍ'Nþe‘1|•gž€‘À hïÐ Ç‚,Í 0‚ú¾¿½•y2Öf°º6/qþSÿäD]ò@pÓ•ã­àÔ;ïøêßœyè+é !GÄPãÌ¢ÚÙÆ~ºW~H|íA…d€@S@J!€Å"É2ˆ¡…Twì³O°ý}Çzžùvæd ×PA3K` 42 ¸ä(Q«¢@dBUiÈXk¶Õévõàëx@H–£ €\ù“¤FeÔš ãFž§>(m¥'´Í¹ðaRÜ"2vïã¤eeü“æ­¦e&¨º*¬¥¡œ=ýQúžókEDeÒ~’íîuwÚ­Í=¥ YA0t•ò}_Vä¦JËKp_VIû®Ä©º{Ɔç)™ì@Ù–J}ûP(¯fx¯L]ºŽ0€•wŠ¢%KÀ£-M ÙXÁê<¨¦†YfYžä¢y©«Ÿh†Ѱ³Ä`èpN@È9Mæàu’ŸÝ3êþH®`GfGÝ3UÊͬÕÎBÉ „h†MÎy7W–—²¬Bîµ»GÖN yý^×dÅÜLãV³?´÷º³ÍÖÄxFó*ÀvwwçæææZíN»ÝŠÂn·³¸´HD®”B³ÙÜÝÝ™™ñ}ßó}ÆØììl·Û圻9"²¦R ÉŒq%}ÀZKhå¼3GAÑ1 #›ëä¶!«ˆƯªàdž7¸–†+ET¾&99Äñ_Nü¤|÷½°ÊàŽW¡B˜«î”VÚ"bÖ2Ƥçyˆ®Î1ç\xžã¹1™V¦È#/ôcZ©A‘JÆs­iÐïøÄÒd¸q°<†å9爈0¬Õφå2COd{ýÁÆÎnk~w~g‡ DÃqH„`ÑU5§¦®\)Y;oØ®&OÞZÊŠBfIËóÐ÷}ÎyQè<ˉ€,Z K󘙿Ƞ[ Òó æµB ¦¥œL|!wwÒ;ïhı$P·ÍV+~ò©uO† 鿺÷©§ûé@«Lú-hwÔ/ü¢Þ¹|þÿûÂùAÀg’q«”(,oóJž›‚!O ‘RˆÈϬ?àžd@rÎ8*é*ÆA!4l\=¤øØ×L^ 3°²ˆkKla‘:r¬%) c 0F,¿FÞG®3è=¤°Û¡õm}uK¯oÃN4NÇ Œ ÍóAšj­¥Ç¡\›ˆ3`BÙ¡3QUÁî÷[ Fˆ4º€Émè˜îêÏ÷ÔóBùÑíª•1Æi²»×ÞÜÞÚÚÙ6šqÆQB^h¥Œ!ͳ֖ưª¼5…öY Fϵ¥(2.!p i5b'iüøçÕg•-Ô9aÕµoëT÷C ˧»ØR5=ìÃè¶šmH“m¹Lh§¬á(¬ÅW– Œ&¬…q- D@vt¿kjØ¿a³Œ! L”fÄÊ´X£Ýb¸¾Žî@²ˆ\X X£s­ó =Ÿiu½ù¹å$É%“EZ"ìg;³­ÈÆ"Ï“ÀÖ7¯(‚¹¥yHÒ‰á ç"'I’tm(™Rjeqîüùó0ØÜÜ\XX°JGQd ð( ˜ä)ÍÎÎzRÑâÂ|·ÛBX*[RÚh·¯'£ «Ï‚­nÑÊù­ž¥Ðhº‚0¢½vl&4•õ*_vrC Ÿ díÁ6à\ìlÅÉN52¼Æ1¦QI(·•¸'‰H[ Æ""Y2Eîû¾µVi](ÃÒ¡B(*,G²V“%ËpgÝA_L£ñAsìǘîŽ4(cþßyŽ6¶äZkn¬e¼0v·Û»xuûÁâܲ”Þ\0kk‘¬#3e²)OM K֢޻ÀÕLa(ŒU‘I¥¢ c Y¡uÒ“Œ1­m§×¹²yV yjmù[Ï_öä®a¹å(5äÈ­õú:E¶°83¸¸ÃÆq,¥¼xIh¯îlè¹ÁÞ¦„·Éù§{/BÏ1õ‘µÌØÌM‚&ÒÇ—ßyþÊÅÖ9ÆFHÏ#kC`(¡îÀä9EÚö³\!ÍÛF_S1JjÈ^Ø4—žµÎ,5 HzQaØn`³``V‚Ù ÙƒùÂÓðŽ“ñíÇiŸÎ_0?ŽW÷„°ZkDäB µÎAJ©÷Õ+}}`Ű-ÐæØ]œ½óÖâÔñìbÛ>ÿ2dÉšÄõ¬Gæ´ß¶ 2KˆyžG>%g@¨@¥(ŽÎ:1¦ràÙè€Mm±‘š` q×Ú:)r¿Èêþ³Ü0d¤MÓìÊúÖ•õ¬ K9Ù¡ !¥V)`˾Tè1 Y"dKZȆ¶HV┉¾“¤o#Ý´-§ì+eÒ™¢¸ 9aëuš6&ÀÕ‹akî_eQôä2•×U~`Ñ”„[>Œ$l‰8€‹áf@DÆ‘9 Ÿ ›a¼Ô‘"c‘q^Z(Ç„àœ;e²«ž¤µÎ²,ŽãÁ`ÆÄq ƒÁã(â0¬ Kmኣk¹ô>˵ÂÄ ŠEÁ9ÂÈFQ@D”§L mcšˆˆº°Òoqéõë›;LøI¦fMRÚ“ÒS²hš¬ô$Y9 @’õ„‡Fø Cd z($"@@fÝÖq´bhÁÅJ >€­x5”ªÔáü»G³q)o€*#ËǶä*ø#g·5u‡äh3T˜cbN%Ž%W7„ a¡w Ye{‘¡k¼dü€qNZãPï2²p‘!ŸqЖˆ$ãÀ8¸M"eIÅñ¢Œ ³”k5Ñ0|«{€$ñЄ¶PDäû~6È._¸üL<7NÍ,R ƒ¸. à,/tStåõ@Ð-/xgfkv;ðb°óJ\fR6͆b)¼ãG»^˜n^Y¹ý¦èÝïßͨ÷ìsZ°J2œúÿÓÿÖd½Ïüæªysg/<{¥ÿÿ%ýå?¤ÿ°yáB§Û ™ï©œmC&c A$@Û§Mû˜]‚¡¯bY7Ð}„ÂØ.·šÀ XÓ9á–NVEºc„ÒrZàÑŽN +A HzÞj ú}æÏ¶—NÀñƒÁÕ«'¿ùäKõ˜þ`` CYP†À˜½õ¬Kžè-«#¾;ƒËúEÐVHÈj®Î3¹JÑ®<–Rêªn·ZP /µÙ¥½½o¼3 ÿ·?òw:_:suã 0‚UaÐJÑ îqÎxš¦`,0ô<@—N=%B‡ŠÜ0R Sû¼ˆ,ÂÉ`0’ì8¢Eä8äø H¥”Â× EÀ~¯0zkgûêzàÇKýh•‘õ™ð<Ád€ÅÁ¹ŽëÉ™²–qæû>Y±»U.›e°` j…†”ççÑ -­4gf›oÿ¾Çy¸ýµ/™/ýÇî…‹ó¢(è ôž@yáe–g Ò})£ÿ«Ï™þpÏÏBã“wîû|‘¦ÀY”ç3à_ÔHC|/ÛÛ™WÙÙƒµÄÍ8ÞÛ‰zmðA…ŸÐ”±Ðh@38‘ve‘ï€Ç!íÌ¿íã§ßÜ.ÑjwÛOÙ}òá—Ò^ x8gdÁ¬ULå–€5pîç„pú¼ç¦+gƒÖ½Ì6µNú`—S6ܵ‚¹øŽÒJ¿j0¹–\ÎÄq:HèÿgïMŸ$Ë®:Ásîö6ßb_22r­ÌÚ´ ¤ÒR* MƒŠ0ÔÐ1¢G#0 ƒoŒaúzf c c˜¡ÛŒ¶Q÷Œ ‡HBj •$´”–Rí•U¹gdÆêûÛî:ž»‡G„¿Ìt‘ÕXaÏŸßwßÝÎ9¿³“ÝNþì‹ù•+gzËEL Û%ýLJ2£5ƒ8Ë{qŒa΀uœ‰,W½^\(Å®-6ÁÙCá.Ãc#ünÊö…-Á@ËzÆ!Di›¦Ùn³½·×JÓÔÑZþ;ÖZg÷·¿(º‡äú‚Á“"(h#Œß#K6RI²ø2Û*Ùe–7ª©~0ÜÈ• LŽÓ-j¬îÿp4%°w°–û膡@0‚á#,L€P¯|Æ|Y8J)µ3¾`a"bžçƨZ½‚ˆÖZÁ}!D’¤­Ö^Tu¾xhQ[—Pãœ+âSóèJ²?%ÂÑçÒŠÞvò~)݈€n· à ¥bøôÂM”=a)a”°ÂÝ„bË3yíúF£jýêR¾fªT@–e¹6Q)°5Yà6NJí1žçtãºò„µ¦êx €E«]œª|ÓuZÀÆŸû¹§žþÜ7¿ówR@·^ñã̀ĩÿðÑŽÏÁ¸ Ö$Et¶ôüXÕaL¹£v9Ñ}M/êxNj„hcH’[Èá¿üç—»½¼ŒOucùÙO^ÛÚ›ii÷ŽDû^Ôï¶?ù×¢*€Ùz£ÝíþÙÿѤ„à±Öe 6[]oö¿]6@‰ù§eœjÓ1Ô+µ7Ü|õ¥­ËàÀ‹Â^žJmP0–s^œMEö»B1ª×ëît…ˆïÕäVíê6JA¯ÕöZíKârå õ¿ù,ô «…$–Uà{\uºýW.^mT‚F­Z /¬2á…2rä*ÃÔmcšÜ©³D.åÀe™8J6´Î¥i²Ûlommíîíuºý,˧Šsˆ+¼î‹#ì î;ú[@jÎ9pEÝÏ®$|K–$2/;¸?¹,Ú¡ûGÿîkذ1 &QetTCb‚/"Z‡0‰K•º³ø0îý>ñÀs(ü W£C Ø9'8+ÌyBp!xÁƒ ï$k‰¦hÌ~,!D«¼€ ÓL@µjP¯…­æ®ïû]–$„jYkÛ{Û…Ê‹ˆ•@Xkãn =ÏK²„3BÏ’¸¯;aX Ãpyi>—zm RŠœZJ c`­#àu–:°Î€uÎ1B3ÌA¡AB,!€ Šø–áø”p4Œá‚ûŽcÅ8Ÿ‡«ƒ¢\°l7jȹé‡-øÊ`RÆ bç"¨éJ™Á¤õ_–g<1ÈøWdìYã_¹’vŽ–n ºÉÏ-LmaD;ˆàÈ3 GÔÀÂB)±à´5!„€3Ò¢’Vx›»{n¿ç[ÑS†åã¸ô³ìÜs dh­ˆ{Å"ký$ßð˜Ç}Ÿ‚°FXIó³>"%Ižõ2Kt»êõª±¤ßï¤Ê‹¢J*ck0adCÑ[`ˆ“3–·€öÀAܰ—ŠåÃhB¸p¯m<°“‹^ °½b´Eœg6÷(qÆvû©à Y+z¯³Á™od‚´‘È6Å8X „BwöÒéSQ:Wq‡@R{èþ¸›ù/®° y/ëàà´ à[ÔZðü ¥·;jË®ÜÍW·¿¡l#9ç¥Ü‹¼ º²ºöè»sÎA-s·bXÜJ)9zš8ç X‰¾»òëÜ䢬Ÿ¬Dr,³ gj2Ãf8Yµkÿ@ÎgWâÔ0áÑDAÁ9çÆâGÇÈùcôUÑ΄GŒÅ‰êÿ¾B6Âxäp¿ŒtǸ=WŒÚ 訌T°jcL’$išÎ5½^occãÂ… ¯¾úêææfÇ…yx~~>Š"NÈÙsçy䑵µ5cLT«&IbŒñý€1–çyž)k-÷qüt.úCQÊŽ.Ž<ØÑ™ai#´|0cºþàEHY–É%Ã÷/ÚB¡\t#[ãØõá/öi_hv%ïd)Ó…ž?ñ8ró&3BŠäèEÀ’> ðd {•@âeûÇ5i·¿7­SÃ_!À¾Év”0ǂѠ¯\ÍO¨¨?|U"Ú1H-GÎJüvËÞ‚ ^ßjË¡Šl•’@sQåo”`N¸æÂB¡)<ûèã§Nß¿ÌÉB §›Ad2é ^q˜¤ùnšØj4O)ÍbÉ¢Ë>;Ž SyK&3>y‹ð¥¤ß€þ,!`ÌUÊÂZ¿Ÿ…•†ó8ÜOFS£3îikˆQeÉí(l8ËdN 2&”6qÌtš.V­ï<ó¥ëWoi à<0Æò¾4“|±kå:‘Ÿ¯/ÌuŸüZ/Ò4Aj àAàÈú† IDAT–eœJ¥7(f­çy>øàÙ³gkµZšgwxÔkC{\UW(TiʼnÔz·ÛÏSDëÿýß|ú‰÷ÿ¼8¹œ6· !3~D4÷:q¿W ¥T k<æÛ¤‰¨lÑßÍf§ÒMVY£•Ͳ¬Çiš+£GYrþ*ƒó0 ‡7þ)mìïmŠ+LÖ€•*[X“0“7*-ÑÆç¡¢ “%î²çN ã-­8œŒdšÐѯÊŽA³c÷?1Zb]ÅÓ9Ãn8pX ˆhÆŠ:±¼•[·nÌÏÏ{èt:ÖÚJ¥Âˆ“Yü±ÿ‰ .dYöðÃÿÈ»ÞY­V…•J…s¾¹¹Y€RÏ>ûìïýÏÿ6‚·½ímo÷;fggð’%=­l•Ð3Ææ¶‹H†™Qªšµhôþá‹ûâXcÇ¢Û =¼ Â>è‚&#ÄNŽ’…â¬ûŸ÷eü:Œ¾æÒ]ÂÑþç˃K.—“âqKÑm„ãÑg3yÓ•jƇRÁÝûœçã÷—jZû™ª€Ã¦ƒ­ƒ¯,ØqDdDT„–äFé~šùYãœ#¶D°.=È0:‡%å”ñYk™¾³®0Á8k ôÎ!:#ß ‰ÝÊU®Ý^…S ~ªsÉÑU2³ƒ¬Uñ×>›Ë›~(}ö;;»YÞ«Ïœ©U¼4½Ô‰[^9ÐÆZ P粯t–¤íä}­]n4ñ87¬Í)GιÃ0“ŠñœpA ®ÌT) ¢e›á£ïøÉçëß|éù j«[Yn”ÏK 1„r ˆö)=¹Üéw #S–ƒ(¬riÓ,fÀ¢Zm¯ÛI °²²röìÙååå<ÏËm„¯-­ÄÊPÕQyV¥–Šš.$¹phgèåí~+îmBæõ»>:ê‡ÐSt1¢\DQE*¥Ì¥Nóã´UŠC§0ÅÑ¡{êAÕ°l·víù‡bá:á¬uX(X…á†8ßÀ Ë9i´GÄÿ"¼Š3T ~9^náàý“9óDhŸ§R/̓ÉîG4¶~0`[:ž“°=茳¯ôŒã. Œþ}>”CûðSG«‚‚]y¾?‘çÊÀ–6ø›ç9B‘éldòp€°´0¯”’YúçüæÍ›ŸûÜç¾ð…/<öî÷üÒ/~àüùóι^¯G)-â.ò<¿ÿü}išöz½3?ûþ_úżòÊ+_ûÚ×þ×ÿåß¾ë]ïzïüè±cÇ wJI£%"eT d)‘È8Ž”rk­³vè1_ù Žãº0–‰l©=à%–$f±0ôpÆÂ“°Às@Z½o¶CÜ [pl‹¿£D”eêï¡+#äæÐ.¸<þUÙÆ/ÓŒËÚ)#$Ú)WЇ÷ï?GÖDÚ˜›kØmB@P™bõë3Ö.€ ª¯Y+s­Œ Ääs¾ 3€Î‚1Ú¡a4P†£Sýl›N1"BâƒãÖ€1NWŸë¶•¦¶Ö˜‘J#I(OƒÐ ‰Õ=:œw&Žtž%i»V wzO6–g©©T+sƒG{L×QêÈ#À9÷½*cLJY«RJZ§„à2ËcÄú2c3*â"J©s{ÆåΆˆ^U³,ñ¨¶süøFÞÖÞMomlBÐQA+‰Ý(ŸÌ Ä€R°Œ!à1løÝ‹›uâÅ(eýn ÀX›õ»4Š\ÊJ½^_[[«Õjyž7›M?üþÔæ¹öC_sA‘5Ó6ÑÀrãyQo{ãDåø•×Ãõ¹G*U)›©ª+=á{^XVÊÅmyžW«UçÜg>ó™¿þë¿>sæÌïÿþï ‚ÖÚYãpcßïW»:tç÷Æ€'ðZ­²ù0 µY–8g<àPGyâ³5mâíô{Òçç´¶ÔßT錦ڶ8ñÐÖÁV I[PíuŒm‚Ý‚³¨qO\9Í!Íæ„`1 1¤„W”Èù‹nüô¿øg·^P°¥+ʼn%A`¹~ ²Üç,Ïs ¬ÖF)M)c¬P‚™à…BL‘@¡Bçì>C=`3&”ެTgxòé®`Lü,Ë™Oûý4Ës „0ÆcŽŠÎhù’øAæzH#)NSºãK¼šËaöI¼ä}˪¦9PFݸ]ö±½òòËþð‡£ ˆãž%aÇQu»]ß÷€æÅš¥Ûïýø˜Æº2@ÁÂw•8érBt>! 9ÐÑUY8xq¦tÀÆR¬9Ï÷3glÃsYøœÛ­pâH>8ð6‡ÅîÃý>°ýÇØ<)qÆ,göûòøCH Ru ·Ò`iFÇ.Âh äiTxm4û¡P6#„ˆÐ$2Kë,ô M™ã㋆kÆ–Í»m¡]”©©DÂó/_m¬ÿZóFô̳2O(³‡vF©$ðñ3ñ*Ü©î#oñþö¯òg^!&°˜M A£_Ls„ch¹ÉÒ fòDJª™÷î6ûè\%ªç©²*çHDØë4ÑY•ñ­ƒÔ £F"z¢"u–+Of¡1´MF¸ŒRE§FX*[ȶ©ð¬:Qž§N î­2ÑÌôe*`Žº;yÞµÑZkÒhe´¶Zk‹ZÑ!RJÜ ÞCUHƒLèÆ~ùÌšARR0 ˆE®æCÑ¢0æE9f‚š¬•Žn?—G‹ÞýqÎكѯÓ÷‹F§OA£I9¹ßq²”R…ÚQ¬:ÏóÚív†`mžçø‡(„øßøJ¥EQ«Õòýpª~ÎYJ©ßþíßþó?ÿó?ú£?úõ_ÿõ¢óÝn7Š¢‚ñ_QÔ}ô[{@h8ðR–ºÝ7¾¾8ÿ‰‘µ– ‰A¬©ÖÆi %U˜ÊHã¾›Ÿé¬ÉÝ€Tó˜=¤8iZÔÚ¤6¦–HÝÛ~ù¾«/D{7E®†U?Ë«I̬Ñà÷)sH¬1Jk°€Î2«i„§“äâ£?û¢Þì£c›?ÙK¶l>ã(#faãj÷ÒK¢ÓoÔØ*êù¾ßÊRàâ(c”kŒå"1i´pl×v2ÝÏ3ǬOˆvi°¸z#Š:6‰TÊŒˆâ\µ{Ýè…¯¼»¯¶<ž¿zùùŸþHÿ¼taêq&€ûÊcAP®ëäº^ŸøÝ$½ÙIwH y#ÙÉŸ§ÆxÔu*­9µè ±tƒR*u7ÉZ¹L!Ìg !((8ðƒŒ pDKOÅ‹*§y€™!"ÑH–‘z¼qÝ®¨~ÇA3n-¤%G\8Sš€zäÑWœ2€’‘¡—1Æ9Bxžçû~¾ï‹±\¬J©"“mš¦EÁó,ËŠäéãGÏ艣Å:'}G:`x;Îò¢²ëãi.F5q 8׆¡µöþଵ¿üË¿¼ººj†y¦¦íga÷ò3«í’ÄåݾÛëoÿJcþET”ÌäÖj‡ °à‘¤¶~æ¢ï7+^͘À¦gç—¶™ ùN¿—vÚÕ<_ÝK\»Ý±:Ü£Ì9È‚Ág$CCÀ­ž{P‚cFÍPaB$ÇO_ñDæóªµ€fŽq$6smü¬›5þþKT¦ÇΞZèÔŽP¤HuŒ…:H|ÿ«\¢u 8«ú—SÓº¿¬eÆEFEOI"eèxÏb3ëÖQü™Ð«qàÐ%ó:ŸŠ–¨^c¢iµ‘)èÌYs6Îó޵1`Gx±h­P&ÕzÝDlVÇ3I/!t¯>‹‚‡Í2—<`…ÛA$)q‘âᳬ`Ï”Ò.Èó¼…vÎÌ8ÏótŒ³#7‰=¦Ëîÿaq¿”²Xîðº†ñƒDG§u"ß½#ÃáÏP¤¿h4ý~ÿOÿôO£(úð‡?\­V÷ööêõúÖÖVN§þ!¤ÓéÀPÃþßùBÈG?úÑ$IFéT|k­%ÙH`"?åm¯Ó?j*–ñˆ/ìI†žÃäUvˆ0&[ÚºzzïêCÝÝUD΂mëT¡á(iø¤•”Ù~g+Én9¯‘Ì‘³BÔ¦ûµ  (@E9甡µ”\ûá·gσ:аj%5#o&¹u²½ÄÝœð¢ 2ÖN»ªô1Áf=^£”+µÉ,¥œ’Œ 4îíTOÞ¿U«{œÌ!‹va±9SÓv ¶…Râ3¦´¶¹ÝIÓcŠò¾4/o¬?péÉ!·!b-h­8k­R„˜’” U`q.¬¢ÔV§içÅÙH 3Wgw@ùÖPVÙf^µOmè3ªÓyÔËFÎô;$éBˆ JæÄ‘žÃž’Dgçnf~séÄ«+'nÍÌßò‚®ÊµÌºsÊâ^·ÕTýňi4¸ð{*s ½J½Ì3`ˆœp§$Nªð3ZFEì Â0,bÏóŠpÌBEPJeYÇq¿ßÏó<Ïs)å(™Ñ¾ª}0¢n‹ÕŒsë¡5Å,$l޾º‹„̯ÓSrG€‚Ž.³Cd­-$¼‹.–Ùç>÷¹'žx¢Ñht:Z­V|û=kÀµZÍZ[äÌùÀ>péÒ¥¿ýÛ¿-²_.mÓ?Þáñ±„&Þ6m?_§L:4Ñ0¬R<Î}Þs”ŒÜ“A}ÛŠçItÅúÜ#YjœJçCœhåfê+•Ji_šMä{Aµ‹b£“~‹1îÀX'‘"EëÀ$º§ÞðŠÕá­W×ã~øËoDèsß>ø¦:Ä †ÖV´ÔK+é‰S-Jºßø/ïÇeI¬ŒqB0.lÕ³½L#xNs*`fnoõÔ^®Xçæ:cB„n~δÛÝ[7œ³Á»úìãÍ›´Åæ–Ú§l½õÝ­«ýWž§e¹ß 7«‚»%EÔB‘µÃ¼É8ƃ)9àEYðiçqv3RfŒ±C£¬ºì+rT:ð Wg)éæ,ôìB±7·¼ŽBÿ€Ð8øVPqæñ.YÑS)œŸ;οøÅS§N8qÂóçW¯›ÇÈÌäòRY@©²aFPEÁ7ˆÌK‚”SÊ)EDG€â­ -êyI1Šqè(%„Qêxzà•0rT.(M4¥”sÂ9u Çàš|"?¦œŽWkm®d&s©•5ˆÀ ïÔa>œ’øÔáo§šøï—ÊR¾]§3oÞ÷Pƒ®¬ý²ñ))›èJ Œ:bEƒiKÖ芆Ÿ'Rá{ìy^¿ÛŸý«¿øË7?ü†Z9‡œ{ÎA–IÆÄ°ã¥ƒ3zè!¥\ÖùÂg,¬WkÎØùÙ¹‡|è‹_ø»_ýþM–eÜ÷cÊšñÌPãMA“žëp¿Ø¥-DÖqºÍ¸¥²u[¶NʳŒÑ:·¤FÞOp9… 0˜å’oK¡ò; "kì¡©h™£ux(ö¿d9ß>AÇÑž¸až€C¯a5~"uÆi-Q<òMŽ9˜P;gFî4£²#JÙ}ëÞP‘pÎ ˆŒÕÍf'¬ÌôéóºNy@ª9Hß±È[$Ü*E”UbÆÛn>Úïqî“W^©ÞÚ}åÑŸº¶væô•—V8•±Ég*'›ñ³"’x ýÕõ~šÆ[[Ç«Ñ3ÕüX¨"qCö¢¨Zë™>¶ëµYµ•²Ìî néöÏuç⻟ÈïãWžÿÊ{9ŽÁÅDI!VˤìGáR«sÁMÇØÛZ«Ü”ýâßæ=·wumvƨ¬_©ìÕEìyKÎÜêXvãÕµWŸ]pœ:äßzñÙ÷þœ÷ðvþWÿ޶§NÄ1%=˜.Æh–Éã'c#«;[ Dmg§™äfq®rüxÕÑfn3äŠèLÉÀOëqb·z—˜ë.Î'irRªf/Ýf§öºIê*~€“U­7LNµ¢•J•2ŒebûRªÌYk`v³äjÄW‰]Jä…`Q%ùä•È<†F+cF²6fä35¢1Œ±FžØÎø®‡‹-˜BÓ˜‡®XYž "•´pu•Ÿ+ ‰ŸnñRï7nŒ)¢†ößýÛ`øy7ôƒ† –÷ç{éç!®¦äd*c ÓÚÇçbä£^Ø0î²Ï¥iZ©TŠŸ·Z­§Ÿ~úCú"j= iúgögqçyN¡çL‡¨\³·ãÌ÷¬þN‹`Y†—Û¶`ŸÖŸ±LP˜¶ÿ·¡Ñ?ÐçÛ ‚GéŽý<4Geb;çB1Ž8B'Ü ‘‘RöšŒyM I·Ý«Ôo.îiâÌü¬73'z»Íõõ7© eŒ:ã\žg5éKµÍ‘^ç†ÊÖ÷®ÞßÛ ‚Š@¯EÉÂÌÒ^Ú»y‹ÌÎÝØzêÜ›ž]>}⛟­8#woTk”æýÔµ¨â7;¾7»Må‚!×,¡¾Xt6oõ_°æj¯Y Bí@ç²'¬¡”Zc¬ÖŒR(¯^m8+®]k­Ý¿ÊIøÝgŸéöö„­‚«1¦²¼ßé&¡—GÁü‰ /È ª™|åÙ¯ÀÎõ¡ß˜çûv?õÙéqLEÎAQ €£drüüvÜkí ß ¯ˆÐ’XlözÙ¥‡Ï;ÕXÙlÞØÚÙØ¸uå¤çÖ žXÖÙ¬2-Ï[ðèzÍW*ÄÙ¦!×>‡yZ§µõ}‰2Á•…V¯bƒçB;ïÁbmö…™Y¼zålS¶ý‰ý̲,@ÆΕRTkêû>cœ1NƒcSŒqDbKúøÉ4žÌÎ÷ƒ‘ñ¯ Æ)¥´ó°°ÑŽZã†a±€`ÝÆcʹ°Nï™;§ÕŒð ÂéĉâÈm þiÝÇocÍ9:tˆH&¥lÄ"Ãó$ªT*…çqþÜsÏB~øán·{û"“È}èín7øðƒ¶Ûí+—.ßwþ\>+RÆHJD‘23öÖE¾è©5à’ŒNXªÉ•(eo]R}莚â]¶_6ÚÓ2à‰í8W èL»™ºîøs¥”@@©ySJIƒþPÐþñϳZÒj6´‚`("£íÞµ7¿+üÄ'žm„ï%s_è]?~œìv®ýõ§¿Ë‚5©ú>,“λš¦LðW€tUR é"²K¢bîôsËo=ù¹O¦_þ–LXÍ_[è¹MóŸþ$¼µ±’Ãך—é«‚ Õz õ¾6:ÆÑD¥‹µ™NOçýè×ÿßÿv®‹ý:1‰>vìXš¦œ²<Ï}.ŠcT»ÉzMíô„…¸@¤‹¼Óœs%ó/|¯Fµ˜(› ‰#N> Mè(UvÿmzZrýv¡¨£ñ1¤Âëòèõñe|¨§Uœµ?êÆm4þ x)€ÑŽÑõ£í]e‡ûÝq6MÓãÇÖZ­Ö /¾¸µ³ÁÖÎ6)±!Ý«ƒžræ¶ww¾õݧÿ§ßý]Îùns1ÆéþQpô½qYw'ž×ަfœ%³Vš;±\ô:ôˆÁÈ” eë°lÿN«1OéD6%”gN`kf~í©÷ÿrãSŸòSèABEÝ©lò¾Ssˆ€Š2ͨ£@å¶9óüo>õ´u„Òo€1/åºÇ9Œ#† £”Z—+Í"!ÎsVXó ð¶Vˆð Î"DÔ&C¢·ý®ò}Ÿ ¢Mf ¡®Šhe­ËjŸb¸g•ìª|9ç¤q“úÿí<Ÿaá¦s1èçÖ¬ëXˆ}^Éd"õ'#ú67}þ«_š•p‰»3š=¥¥çÑgP¿kM—èÛ îiz'¬´¤¬¬Ã±•÷üÄC¢"yXâe—-Iu)âõµÓ7¿1þàoô¶n°îÞ¿\{Ï«üHzñÅS?þ¾ ªI¬çú­%ëò…¥u i,_"U¢ðͨÍé·º¥“ü3?²3K[F𳝝Ço{`]Ÿèª3^ûÇ¢jV Û;1qAH§*ÌË$ áþ»—gÍZÆ•åÙÙãgÖÖÖò<÷¸Èó<ÞPE=Œ§·9a¦Ü0q–ºašÉŸ3"!Ä÷DÁ–òú ç\.cÿX°NnöS÷±³?,_újE±”IÇÉ‚/÷,g¡àJP;cŒ±Öç1ˆÖj@M¹C¢­ÓœùÖ0k(8N)%ÔY—Z—)5›»Ý^“€cŒYã´¶@™ 9ÀÀ‰‡`Œ õ²Ô+=a)¥F ç€2ë[ãç¡Ò*ÓªLC4'ö_9˘t 8 3ÎRÑâpR»3Î2´sŽ_¦0£@sÎ’~_fôú_ìjE$‚œìÌ[FS3`@ä”ZË ÎÄý¥ Zè©ÝJÐK’VDN"PáÑ«Du®uæA`âúÊò¹õ3·n]_ùÖ} ù¬ÏßòÞ—g½¯|ŽÉ^¥·G|ÿ“'ÅÞÞu›Wï{äFØ8ñݧ^”JUª³œ.+Ø:};7_ ýt5+ªDÈF…8ÃÒD áOPJ˜Íµ1e™çy$#ˆ˜¦i t” ”A4÷Š¢(rÎi­ó<§”.WZëÌ ÒªÃHµç%-ÝÕ†3}Mû.Ó1à"ÉÝ3àq9Œ 5²›ãáïRžøï!ˆõÐm#î>þ¾[›–:D\XX¨T*a^¾|yvvÖó¼qMôhOîžÊžë3êœÛÞÞö}yy ‰°U&þðPt©Ìi±ô}ï‘sÖ´×ÇAn+E°î¬Ã`§dÀß³·ÿ]·?™¦eÀJ©È󴃢kCøž‡Iz}ž !RÐÆZ@ÁB÷˜p]Dé,1E°è,w (­ÕXãJ9@NáC*H(“Êô˜ a$²¾aŒRx¹Î9AAí6g‚j×g¡L+Zf^e‹ ãÔLw‚-Ú<‰¬M³àÕïúínÛ_Ìâ ‰^P’ÜêðN§ât›TÓ .ïož}Æg³W^ZOo»|árÕÊmšX%i»Õ¯.ð7<þRTÙÉtŠžç³›W/>}6‰;ã:Ò„ˆG)¥aB1Ë2¨ Ò¤0/¡”1”¢s蜵4›{H…W³³– 2J5!¦P§è `Cá=ê@š•IRwyΈé7§cÀ£þa´+I|qgâFº##<<¿ÎL¸xÐygüì.cäÓ2`Âèµk×V––»ÝîÉ“'www;AÒ§j§ŒÊî×ÖH)···œsA´··fggGÏ=*b]Gçñnž{¯ð´4ª3qhËÙའË|¼\ Ò3=Ý›vÊæ+ÉTÀ¬¾ïûVƘ&Ê_#«”QÏ |/DÊ(…™´¹‹Š$Ž!Pˆˆ•™&”pO Ec”Ñ–€'Xd¯2£ÑFù·(%3Mn¹P„Xc¥sÈ(³Î)i‚ù'„ C­0—˜fÄè¶€†Lµ2]dÝÚµNÄ=±³±ìóÖD~i%0Hãrg‘ UÊ'ªI–ù¾o@Ñ·ÎË¥ *±±BçÖøŽ2c-Xë+é!¶¦ÿ©pT!ijñþë_j_Ÿ´ru¶±d­V’$ê•<ñŒŽ‘ëÖÍÕom÷˜¿™=sšeËIz“†{ê\%ôå§Ö”:edàÄu/ôãxù›OÎúþŒêÖ mW*¢­»6@ïzð§¾Ä8ü$‡ns)Ml­îå9•)U>qAôÓXXD*F~O”RzEÎHc 0§”"nÓ6)•àmô©mo”@Q¸°C*²N¦ir(ïyÑÿÒÄ SBЯ5>ÄGÿ–1æQÊÏC½4%Õ·JR„ÂPô>4n·.²€R§¡Cnt0Ò2¤¤ */;à¸'¬µq{žwìØ±—_~ùܹsÖÚ£Þõ·ogZ*<.^¼xþüù"ij@eFí¡‡xŽÃS·¢ï¯<ÞùAÿKÇs ÊpYÊÌé©2zmâ*n.uQo&U©r–±Ð”Ø€~ÒÙ®ÊRb£-†Th¶i”µ– aà<«©5 G"¬Ë4é3”£³U`´¯õyÕédͦEATõµUišA@¨E4!„ 7skë+ÖBmi»Z¡IwUÙÔo\ôòÝa®«Mž§±1€gÌ/ˆ]´ £``]Nù§]ªJ¬$´¸ëyZf¾ ÓsÊt‚@õã „¨w{±Ë_c 8îiºvÛ¨ÔZ¹§™×éîÔfI«Ñ 9‰ì†Ý^sy-È:çB6o¶ÛáÖ•ã´~MøýÎv˜óó[©Ú0’3 e¢(2â§àìÖµ*¯¯XÚ”šÊ4™­žìµ Duê•0$µ¤DÚ¬²²›ìU&¨ïûDšL*:,~žI™è¤ˆÿá}£û‘N†"ï•$^Ä ÍZcÀ:°ÎË9/B•`˜È­¸­Ü–9¹ýqoØñn¿Ö4+7¥3ñzÙoÍôšÁÄy¿£sÜ¡><°Æ †qB4Ëxk¥™˜JªŒã(ŠºíŽµöïxÇŸüñW«UBˆ–“ã¿§e˜å*Ê«¶n Ƀ¦Êp©fšùˆ¦1)QakbóÖ­Óªól›¿µX©å*Ý]z½*ã\ç†T‡p«Ö×·"—eª±ŒôTK–WV•Ìê ­5u»ÝñxüÈ#<õÔSgÏž­ øðn…M’äÙgŸ=}út‘ ¸Ûí¯çéQ>`¨t?MÓjܘ’×µçï ¢„:‚±ªô ±¬2Lµþµ«a­fM½j¿êÛðîŒgí¸!€Ö:Š¢,M›¢éº.h‰&Ÿcs‹Ÿ_6ÆÍÖ˜ÃÑxo4Übp¢ÓØH’£u2òúº•í ²ŠˆðÞ} åq&Îôö·FÃÔˆýÍÍá©Ûòƒ7|ýÍç½wÛ'ŽuÓQ´}yœæW™—[‹œy’HY«]Ö7}îzþ¯OXTw½GÝûžàù'îÞ?Àî±gû×o÷ÖŸ;ýÞ7¥¾üuß…“÷=~ÿþØ_üÅÃKñ†Ñ»ÇNr{ðÒ“~ =2V‘ajdœÆµÎñ7ÍØK"Wg,J:[êÒóo=¿™ŽnomJ¡þºð6d‘\•Z}U§‚ç__º§|s·wß7¾~_Ì»wœëuÇŒØêŽÐ¡à‹ï|íîƒÝs àA>²Nã‡qpÿñ-¦(OÜHxÇDs×kñ_:û¹¿|ø¹'¾'Ê"„3J¹F­5¼5!F&n»p:¯½ç½ª½þõßêg/¶¡ÕÜí©Q²n¯ ÅRÐÑ2'%ƒP™ãÙ°¯Z- ‘tµÕ.I®È2VÇŽ& ’çdŠ/R³ç3P¾‚n Žº‚ÅŠL…S{Zƹ@dÅZ.c,+DŽÈ“C.?Šbó…ÙQ ¦:à³P¼‘1Áy‘:Y2VTNKá îp& …/º®[l7J)Ç)@«_jn`ç n–yÐÊg‹EuãÎÎ}M@FÅÁ80\`qÌý\zeŠ£¬gîà5@Vûž'cc•tøG?öÑ/íË£xT:¤AÀ9OÓÔ÷ý2eÈ"ÔÍÏÂZµ°x‚ °9B$yò·ßøÛôÿ(ŠGǶ6÷ÂÀC°bÊv:ŽSnW§10\zبûŽ·¸ŽÔ-BõÙ’ë·jy lùa¡<ˆ°< Ù¥‡Z~h³ô@‚ÕŽÊz¯%Þ˜;ªm®uå­µÅÜ#"ÇqŠàr_¦ÉrÜ.^c/<ûþ/|ö{s™8¦µë\úi~ÀnÀ†Y|b¸»?¤xœŸzâs?ÜØØ>}ú-IÛ.Ò6ï8gv÷Â…³=ãõ“÷>ûtËówÏœéIæd8¶™t\i¹©Kž·‰™·Öyú;®?û:]¤ï}êñàÄÉþúñ'}çÄPÉ™-sæôðå'¶öîÞMáé§ÏŠFtçÙ×XÚ%‚pÁ8ž«).Ï«A·Áö¾ëLwëÉÔ(•>h½Ë€ôþ¿&ìr¹Öä#ft ÂÓW3J»‡;{g?÷ï¤Âÿ ðøj>Hð$`ëIÏpþjsz;¬»4Ûׯ1'x{œcèI'ën(ξô¬{¸sú¾ãzèø‘¯j'™@j“ªÜX“çʦÈ!ŸÄaddÀ°D†sㆮ=ÿìçßËFëÍv¤“¶Õ¬»{Ûç‚Æòd ßýP.þbrW™2"2v¹ÚIµ^B IDAT³NR¬ T T#Ðlò‰êËë©©ßØÕö¨Ì·%Ôß;(¿T^¿u¨U¡“ã¸HJ˜¦éÆÆÆG>ò‘?øƒ?ø§ÿíÿ°±±qxx8 ò<ßÜÜL’åÁVo …† Ùlƒýýý ÇqÒ4ýìg?ûÈ#œLDÂõ×ß~î¶W^2íÍõ|ÅMo(° ìÊ·‡ Ó¬y L÷ž…l6~Ó†[[<æ¿ÌS\šÙ Å2çqMü:°5õZå•`ÕÞ®Z~æ{U¶Eë"vիͧK¾ï§iÇq†Y–mnn~âŸøÝßýÝ_ú¥_*¸ûƒƒƒ³gÏ^ºt©ÛíªšìXu ¥ì÷ûívûýþÖÖÖ•+W}ôÑüÈGï¸ãŽ(в,cŒ±Q]×½QÕ¢ÚÞ=IqUXuµV§wubÏÕrDTÞ¥`âµk¶–p®º§»Ú{WµÎeȰ s^Z8Nÿ_ £Å~c Ü'n9FÚŒ1¨RXÂüäš™Ðd-FþÖO£’Ã;)½Ã­µ“D͵ÍLè³û{Oi-Çjìù™Ê×Û {ÕõN”/UYæ:¼ÑÒ4{BJžgHf™ Bn(V¹”úä©T91—1äZƒmø!0žY“!úl²·‚Œ1&1(ðíW7N<ðÆ[[*“kknsý`÷µ;„—…ëcÄ.¡Yr³ƒÍNS“k³d ·/5µí­ŠgVÄÁb»®ŸÙT 0¢/À7<c”Öš BDÆ™1°„Y7ÏZ&–nxÐÙ¸|î¾aoçÜÕ7Nez!ñæÎ¥Ð&o¼ïC—¾øy´wοïªã²g¾´Ö`gCÈ1Æ "£ŒQ\`šÄ.2Ã8*‡fMˆ1‚Üõ!‰ $aLÆA®4‘aŒq.ìtGÀæmcdžì¥×$[gÓ+Ïuo¿k/N“ƒ=¯½îCÎ8…ȘYë6½ëû¼x?öÁoGŸûב§\]iœßA(Ê äÉ&‡½Ûï{óDF>ó¸ÐÖ¸26ëIÞQù^4 ®P÷¶d¬ÞûáÑÜµè ±FN1$P‘NÈŸ%° 8‘-Hg3ö<ºòvãÍ×å(Jî¼ðuÛmÇ'ÎDž9 òòÊ]˜ÂwD]=/æ÷Ä*gª|žˆ¬AÔ5yÅuWJ¸r[4rysœ‹FùãÝSÍ=¾ùÊÿèí#óäÎó_¼,yÍýÑöã5¾Ì%WÊò s™i"K–i3fܳ™‹à K gØÆW‘›L€ ˜©¹Ìˆ‘#NL\¡˜z-l^í8šìµ7OßyþBr™»M}óe04ÍMnA´š$‡Sý©w÷Þù–ëÛGþæÏà…Ç!‚·Uü-VAƒ?Á]çáöû£ƒ÷<÷u¶w˜ú]«ò†tUžnÇinac0jäZž:wJ鄨0XËÇ›XvÝÄç˜3æcˆÄ-°DÀÐaˆ6ï fs »ûÝ–ÃÑø{™zãö{¾ùÚ3/´Ví«îÛ§‚žkNMv‹ØX®ër΋°DDij4cïpSXyg™…Wy¥D[eê$¡Ú·Ö«^——¯!ÀïGÿÎ÷âùÊ64µ~¢“ÌWÖÚâësÎÇã±âç~îç~ï÷~ï·~ë·>ùÉOú¾ïyÞ$OÃ*P¸· !®^½ú™Ï|†1ö‹¿ø‹D4 ‘¥0mEÄÂ@šÕ¨FÍm&Ú‘ZUê;ç[w¼<÷¢¹HXåãuú ¾²&fU]öjë[®™`i²¿k§_Ÿ€1˜Æú­ø€¥P3n·È,‘!BkÉZí Ö³F†ÁÆñÃÖÆØfÝWŸ_smÈálœËÁ÷ÍÖ‰$UkOé=¯^üÐ?|ãGOù¶ÃÝÞÆ“ìpÉ…ÍŒ@‚[mˆHH†È•|×¥”3tŒŽžÖ{–22¡"ÎbÎá(0DHË*`ÐZ˸ÐÈ­pí•׎ÝvO|ûùmW/·ÈñÁXiŒf('zÿêÖóÿW \ΟùÚW¾ï#ðž÷Þ÷/þùË«óêé òÈ?¶Þÿ±OÂà@¾ð…3ýäzgck âQçä©PÁ3Š"Òá0Êe‡öó/˜ÁmYæî ›m%Yí<çFø,‘±ÖXRÆƒŠƒ´H¬ÔÚ1&Ñ¢±À’\{Æggâì²ë¾¸;xnÓ_÷à®vWí|'ˆn!\×…‰2!xœó,_-Û̪ˆ¬ŠÐgž5v^Ö¶,T'Ôàº=àºvÞ˜Üz=ïÌkæKã£÷êæ"m•åI§Ó‡i𮝝†W¾ïSn=ÏûùŸÿùßøßøõ_ÿõŸþéŸÎóüÁRÊÁ`°½½ýè£;vìSŸú”ëºY–Ùf³YPôBæœignP[çNͱꊮÔÌwOez3Õôü|®!Àµ°bà‘ºúêûûߵõRa¹*ÚBXš!ÀÕ@Ãr¥¯?Âg¶©ÇÒþÆ™olÞµ—ö·^ò^7Ï’íçé ›ÝÞ>®Û^?è>ûø}IJëÂÞñü—œþƒñÖ¹í±>wxø–k×KçÜ("0…[cNFȉZ+c ³B)¥unm“s$2ÈH 䵯Ca-6‚!5A/Š•ðûi|û0V×/ž:}ç_\{î{ýõ¦¯„‡d…Õ†¸±š8˜4õÓ᱘?í9É Ïœ¸¾}íŸþ×ùxâË« óÊXXHþËŸm\ÛW¯?u®:ØŽSs\9ßl­=”Æ=F·çîã¬1ÊõûöUOÈFó\Ë{k82ÔzÅZȳֳ¡çùÆ@§~¨ZÃX:Biu2õúÖ9f@€Œ 0Ç•ô¢Ý–„Ý× ‰ka¶¹áöØc¿ý¯þ3gÎüÄOüÄZN,69/ò»©Ü(¥Àê‚‚cBÓ¬‚Q:þô§?}ùòåüã?ò#?"„‡RJí0²\p@²Á²y318b¼l1§ ÖâÐÎï%—SqîÊä|:?‹`ljhk4(L/˜cÚ_¯¼j¦U³6e•¢¢:®m_bD zÖ[¡,Ãì’˜çóšžò®Æù,[7&™l!‚[5|2”^檳µxö9|ñ…ÿΰml'<õõ†ÈíõÛw{ý-ï.—=©]//3qboxƒ¥¾×¹c]=ñ-„Eí‡þ“`øØ§AØgð£~+iz-PÂhû3[ׯÀÙ{Ò°¡óþ‡4íö£$½Ìà˜Ýá„#·ÉÓáfÆ.ž:ôü`{ïT÷L<ºè0HE¨˜ã‘eÚ wñ‰OÜwß}ŸÿüçåW~åƒx䡇ºû®{­µ½þ°ð2ò‚Pp*ÂcZ­"¾öÚkÏ<óÌ—¿öÕ~ô£?ùO>yòäÉ<ÏÇQâ¸~üyiVˆMq·è.)ŒˆT“_™ñ›Çˆ®¾ÅV¬¢ âÎnj÷\—Ý ³zùªÆ¥ni Vi³½UâŠ%x+Œ;U¯W5I3£·Ì&ëöæùœd_¡Œ/'ðeH׉ˆ;…<Ÿì;pdŒsnçœqÖTwÓËW‚69™Œ‘'Ð  ˜ï¸<Øã¦MÖYÛì!Ùþöé< Ñ ¥ ·>_s°mYÛŒûAƒÑî˜æã6VÚܺÒí‹ 6…s›„à\Ó¢°?¸|Q=ô`«ÉÏFû®Î³Î1ŽêŒN(,¶6¿ öï Ãt£®¡6G«".GGêÄé“­¿Ú¾â‡ëgN{^c¸·Í8®8ÓÞ»<áó&gã6ºMÑðãÈ’ÆŽow®wNìÅÃæ`¯Ad|ßò“1äùÎú‰¤?n¡ÍO5.sG=O¥œ¡`\YPHÈ™àya²Þ=­@¦ˆÐÌÓœ€<Ñ5&ÉŒ–ÈxaØÐQ¢×áx/¿vÉî ï< ;;c€Õ¶ŠV&À;ð !ûÜ“WÎlrÞsÊßz>lï»þÞÎUKûéýß7|à{è›_qýµWO×Ûœ7ž;v†‰€iýàq LþäßàζX[ÛˆÕëíV~xMŽ®}?×tŠY¡#$:Ín[çîÅ‹ýîËï½wíµ×ÁŠkdÏÙˆv¾ÜÆôAÍŸ\ÚÎ8['p å›+ˆ`Œ z‡wœ9 š ²Fr΄!U:†%U$#k–K~T3Ðs{Nt¢ «ÒÐÖ°©°Ë€`FÛôïüCøÉ¯}õí/ýY¾sýŠÓ¹>Ž€)ü\xÁ¿úí'Á‚páŸýòyr^9~§ÿæð/´…Íû8—çžÎû‹$OÌ&ÀÞŸü_𣟜;ï úé_jýɼ²ßgà|LÊEžÇ й‡ýßþ{'€Øÿü?}J  á»Òj#]ÏË3Ý ]€ù5Õ$=3s”jÜ6ØüÌ.[´¸V ÜL•÷J©~¿ßëõ¾ô•ǯ^½zíÚN’¥‚;BC@DÒƘ`÷;ÁøÔ ‚•Ú§ê¾Î\Ÿ[ óÅ&•–NÉåÒë³ÜñŒ$º¸ø êfê¾7a½ðŠó裗ß|ò ¿»á}¾gÆ‚Á_þáWã.wŒUƒ¿úÿà¡÷œ?ènåühöøß|e ÿÔ !ù³ûÀû#üÓpýÿŒþÓsNÞþ’d?µ÷¹Gqß¾e-pƹ0¹Ò ¸cµüË_Ï< Ʀ\bœ Dˆ ¨Iç] «« ×öƽ!x†@‰ËXËuù(ëC²ÝãG{€‰@ª¿Þ:3N†æñÝÃ74lqh¨<'2¢$MS°àué)8é4iŒµ*•bÙ_7\·˜’B‚Öà9Òu„ÊR&ObŽÇ8wX‰jŒïÀârDSëY™É3OÍYNI‘1FJ‰\®Üἃ®½½ƒƒ°Õð³,A$Î!lxAA³Ùô=ÐNò훕¤èÈWO×X ×’á:£¤ÄÍqyzÁ",J5 `³·¼kk˜jê¤åœ~U š© jÚÏlIt‹2ªl "€ÒXl®yu°˜ªjʳ,ˈh}½[l !‚ Ø“¨dpþIDATß¹¶¶¶&„“$ ç¢Õjåy¾¿w¨)?wö”çy£ÑH)åû¾µv8žÿð‡Æã±RÊu]!D‘©˜KÇy)µ@D]³w.gý’Ë»j!hׄ@ZZ¬´v(lJwÝúª±"&\^ž×\¿Eâò§±ªÚþò¼H®P;:a5Œ¦žŸ£ö/³RFDKóçä–]2iÀÖØÄX}K[BDT &¯rÈ-sÏA)†"òÊw©Ž—‘I‡–s«SrgÞl£ã5‘ƒ+d2>Íò-×¢Þc-/\×&œ­­+¥2mΜ4¶ëy¦‚$p@"¨t¬áÎa4¸“9Î뉅x! 2J¨­ã  ¦sŠG½$œ¶é¾ÈG×Þ`”ưpýeÈ„ \i×Å<æ`´ã0G¶â(aBiË8HvW¦ß`Ñ<×K²ÂC/ºñëVCB<ã·Úk8ΘµëéPJ㘔¯sF*TÖ¶kpíž0îÅQ`;à+È¢þ躇ä†þñ(}»áo .ƒ„þø€(纱×ä¹ëÈLƒÒ !HPe,Œ„QŽpóš ŒY D€¶¢…%RJ)¥tž¶[!XCHJ))™!SQ  þÀ¦VÖspÊ‹f9Í£Ÿ4ùY’I˜¨ -2@£µÒ¹‚ÀJGllv×:Vœ¥i’!XDr¾¹¹ÙjµºkkžçZ*¢y¤ÓÌà:÷¡ÄTâç¹sîUG?j$×*g]EXud¸Öúº¦Í‹*Óéùr£¹))œïç3šŒ£ö°¢ýé­PbÈ @Aø{:—“¢|„ÁQ{f†½2«0…›fEˆ|½Û±â8öçûïEãñØZ{êÄqˆã˜1vöô©Á°·±Þ–R@A}‹/yž/‡jcª'yÍžwUZ}\×ä±®#À…„:u)ÖcÉÔ¹!Õ`Uçwn–gˆ³°ÜZÛR>GM'nQŠ`’œ¦"Na9çqÊXW= ¥Ûe+q ƒ ¦ÎŠ{ÙøÜÔÝàÆë´¬U–[ÈIjc 7ÚZIŒØ²ÈnE ɰ ™±šuf»&«t·62kí¸Ò‹ÀGÜÙUiØÜ܉ú¹fï+•g™ú]AÝëœÚ8DG« €\½Å1(ÐuùàAï•€(Db5‘WÈT×µæ˜O™Ö€¢€ìŒ!" ˆHBš@ ¬ÍÆQ ¬Õà‚ŸØ$5`à‰LïsÙàItÂk_‹ÓK`€å.Ðfs¹žÈ=wpšÂœ'ð*sYÆÍELd"‹CÒq3ÔÒwýX?kˆ"°üçQJjMpH#‰Â &FÉh­´hf­P¨ ’è­A@Œ€¹Ì@Œ ‰p„  `b€˜rÀ D ¤`¯œÆˆ¦ 3ZNLñF MAl@„RDÜÂØb”udCœRÀq`Ú€e ‚lBìÓgTkÛÉl®$Œ‰ €`lr(ÅÛ ÀÎXoÞµ}w‚N®‰"3„ÌZÚèi~pn¡8±ÖZb3š;™®…k…«ád—¿wÕÔëL8*ÌÍ-ñ  ,P(]ë`‘. ì€GHp¸œ'Ø“/>«Q˜Ü,ŒÚfB²LûWÓÆ;ì,ôj5TJWÆÍÅsXV1uüX¤Åj¬šK:Ž•¿PYGs d‘Ušž/'´‹?'ô©ìL÷>€ Q“¦io0¸º³³³³3 Yšj…žçyž'„h† ß÷†ïûŽãü±”ÀJÆ+âþëb‰N-N¬.¶ÀlÁóG‚:#¬Òø«:>ˆ¸jR“‚á+‘OI€sÇigÖxàÇÙÁ™Îñ½¡´FÀÅ­PnkŒI’(ŠGq“±¾ï9ÒsgÕæÿ!C =Â%Š(pà—wá3úoöVNsó]œ1×ðø®“Áöpì  5‘ Ö"r –HMr‘-Ò`N‚Y¬º§>/O7±.²@•TŠ@ÞšÝnw½³¶\OÓ\å&Ïó8Žã8ÎÂÌaHNÁL0V¥ß3Š©…7–„g©dS‡¦ë=ÍŠ§%ÇYŸ¨›RbÄ#Ï*nd þ‘G-ZVÏ­KSýÑ‘J°ìbm$¦åÖËŒÍÖ€LÊ h²Ý?)øÎÈá;†wüº#ߢè\›´£VRŸžTþÞ´|Œ•¬G7 Á7¨¿Üt3Ƥiš$I‘,ÒXSPš"”Øx<.*t„t]7 à  ­U³Ùô}_ž+äD8f¼Ü)ë/gË”˜MÎd­MÜ"*óíF{É%%®ó¾Áç#¢‚§/UÊ ¹ "5ð¸ÆËg©í«) =eM¡œ(zT¸˜gY6è÷G£Q–eR én.»)wø÷êè‘P6‚,pEb¸°¾ÿž$ÃB€[ŽÖ¿ûÁh°ÍõøåËÀå¤ $¸Ð¢‹EPG*47E`<"¶Ø¿AKÀæçú‡bn¢aŠz\E•Ñqœv³³¶Öm…­á0ÖJ%QZÆ‹¶®SÖ€Œa…'­¶°ô¿Ä ª[TKÎÉ÷‹Àk¬Í-›Dñ“€Í¢]èTÅ·t¸t•xQù &cU]2‰ºö×! ª%8Ǻi*ªÑêW«âÓê ˆ¦;¿•A]6ƒúËn•C|‡ 5ŒiEÅHÖÔW‡çÉÖ5`µïuƒò‹Ÿ~©ôL›ŒÅZ­%`Ȇ„À¡EÖPkmAo uk–eQ’&Y> ˆ»WHÃë››¾ë†a†aàù®ëº²È+‹ V¼‚æYk‹8=HeËŠ@cÀ˜]ÚþE§ÿâk z”…ÓŽ—ÉÈ Á€¸CwYïÕ›=þ&#·ÝTùQ:Âb4ÆãqE£~?Ë2‹$=× |éy’ ^½üG¨§G€Bâ$F áú^'½'ê„l¬ªùáÿý¢¾(òµ†§)½|Õ%È,h!%¡%‹À#KD„%›OD–ˆ!Z nafǨJƒëT‚´°›{ãfÎãë’\iÃPAÐí¬u»ÝÁ`”d*™Bš¦ÊsµÖŒ#rÆÃÙ {\й͵ª."U{U-e3¤ˆ¦ÛÞu#P¯d`*WÓÎHö?ÈêܬM„¾@Èç°ó\#qvôŽ:Uã/[ú§.í⿲0ÌXlçò;«\/EÞ¹ W…»SKcßU¨]8ttw–öܪø{ã%Y® 2OháP×étƒ pG)•¦i¡‹J’$Š¢ÂV+Š¢8ŽG£ÑÁÁc,¼¶ã;n£Ñhµ›V»Óé´›¡çyß(j.ì¹J£âbf²›Cë-D(¼-–.çEªŒµ;'7ê1MaŠIí"`~‡uε·ž:Ñ`'&âëçùh4 qçY¾„͆çEB$$¨Íšõ÷ jè‘ 89›å ó—.Áà_~¦ šEîÿ~€ëÂûîR—÷ S e@"™ND°Æ a¡xA@"@d€¦“}Â¥¯³ªƒ*~¿)û2'Ãå%çA®­­mnlöÍaßj=G£QÔh…®ã»2à 8- ž;ùjì?[ 60EdSÓƒªäJ•¿‹„§;FÕViØ‘ú±ú—ÍÝ,JêsÏMUÐU´ÆÌÎr KUÞ<­e¼zåè+[uÄýL‘€ ›q/Z^×κٵjùòu«ï£TkŸ›íG?WÛ«®kg™a~‚-ø§çuFX4%ÌKõ:K–çóó±e År!ïZC®ãu:B.Ô¶Y– ‡Ã<Ï£ †ÓQ”¤Q: ööœ0ð;N·Ó ‚ ÕìaU‚ B”9í jÀBñW ¨Ø:PµÁ´´³«¢è£Å;‹¦¸¢¤Á ·tóþÖÖ+Ÿw¯ös3F;QY½Fãñ8Ë2Á¹t°Ùh4RJDbœK½9ëï)ÔÐ#¸²(r Ö½—ÞtðÇñ+_/U%E s˜î»˜ë¹÷œI>ý@Ë /° ÍԔћèK© ¬Š!Á1@"*Rþ•ˆµÌ57Pµ-[7 Àå¨.dŒ1æI' ›­f§ÑhŒÇqšdùŠœ T:ŒZ;WOÑT¶@-&«Ò†9d´´¢Æž‚8ÝÀ zQ~*VϽúÆATqAÁX›Ï¸JN¿úàœ{RY gÝŠ3XH¶Q­¼8)Í}'„vÙª)5.Kê©%`7Q!Öµ§i¸¦¥W[ÂóéË“š1¯måM¿Ñ<¡ŸÑX”?gò"c·8[–´³Z¦ŠåZ"@àŽtßñ=`’gzoOáû~!»®Ë97Æ„­¦ÖZ)Uì aEãQš§ñx<Ž¢ñx4ì÷û‡À÷ý0h¶Z­µµµ0 _&Îk¼‡èès-tùh2–¼æ×E1á¹årÅ®mÜÖ\_»ÿ.ï¯öÇh-j€Â¥ÀE¡ïºÅàx²‰;%û;p~ÿA=¨1E ŒÌoýç\=ó¼µÓ2"`ìPE¹ä Wó#üVƒðS«À@dDÄÀu¹Üöá÷¼õÇŸ‡^ϵ¨„§u ¹i‘Ö9X GJiIƒÖÀPq`Ä8AÀ¢ƈ1©ß=”ñi¸£Š¾Ñj ç:)Oűc“¸Ö—gü𛊶° ˆ†eßwn/£üÉ'éP2ÎfÃpc­«ÒìêµË…íE–eý~¿Óét:V«å8 2DÁ˜p]ô¼fj­³ ¥Ôx<î÷ûƒÁ`4 ‡Ã(Š’hœçùîîî`0ðÝnonnv»ÝÎÚ†ã8¾çN¨ G”RÙÀJ uNtëP]ãs5”•bñ 0™F×á…‘PÓã÷Ÿ>å8âÅ\õÞ¼ðöõݤßwˆ\á;RJæ6Ü1ç™ÄL€Ã-ç9"cY°´Áunl¾#}+„çÌu$R*§ï2ºS«Ò£zG鋃«ÉKpßiø‡‚Tõ¯ôƯïù »ss8f6wY6ÚpážÓÁ™“¾²Ã×.Eÿæs÷€KÇèIºÉ¹Ê&¾`É0fŒ!0ÀÀ$¦+Léî³Ö2,üL&·ØÂ$.NJ•fSЂiR u¨¿Ðç¼Ùlv»ÝÝæþp,º~^ïÑz[Þ}*»ó¤þà]£@@øÈ·­3·»ö› 8h÷íý䛯ÄW÷ Ë€ó…«µ2Ö‚’ã`æ$`@‹¶P³REGóTvqÚÌ‹¿Óì=å•KÀsÒgU|$²DÈ Ãpmm­Ù å¾Ls(,0 SÌ<Ï]ãqy”1bQð­a~çêü˜kò„€J¤Ê­²ØR\^¿)]Ÿ÷ry§Pg\V箳xuú þÿö®m·qäˆVu7¯âÍ’e{_òùÎù‚¼È7äe±Èí+ÙÑ’(“⥻+MÒ%ÎØ^ìÎ àz¹M6©nVÕ©ªS¿dò«Ëõ~™v#UCÅ @¦ µÖŒ!ç|6›!" A „ØívÏÏÏ&áyµZ-—KcAà8ŽÁÏQIi²MYpEóù¼,ËÅb‘çyš¦išfYV–åf³Ùn·»tEÑOwqèysž]«oWÚûï{b0Ü-òŒ¤_^bˆÆæs@jURCZÊýóófwøy½ø÷Îa*ôâã«’À™Ç,Šóógç‚1“YFk,úË 'çÊíò¿ÿóùÇŸ@¸ X6·8ªª·â_KÞª&ðLp ûsõµø—Š`ÍÿüÞΗåw*Π:* cyšDuv*fK-»jö‹ˆQ 4ë– µÆÖ»¥ûO—ñµ¼XvÝøáÞ~Ç}!#$Ó.žÙŽÃY†®kŸ+a(z,¥´ˆ®Xï OxÀ·ýÑ)MiOb"†–e±Ži»âw¾U.Aøþugª q †±%¥,˲؟Òÿ­žW»D ÝÔ³BËôçËó"úäX?óüþ?‚Û–åZÂaŒ1ˆ/ona1ÑO½&õ‡¿þåoü“’í/Ù@›Êÿ]È[õÑ4í.•O0'u.D¹‡óou/¯’ÿÚ¥f” ªš³‚BCPêÚä:Û®[×µj´͘h‹ß ˜‘á6 ´F}^c)7Gö z Ó9ÐñHŒ1ÏóÂpA~~VRš”K#u];žG4Ž{µ'0^]zÃm.÷h{ <Ú‹y2äÐen¥ÞküË‹Þ6\úÏ·BÐSY?¯Iaºxݼbükâ‹òMÉíMwõÍÕ"ï+C™ "RJõTL£ã º«Íf³Ûíò<ϲ¬(Š,ËÖëu’$www‹Å"Š"ÏvL±¯¹"çÜÐ#Ûžçû¾!ÌšÏç÷÷÷Ûíöp8³,Ïs“±•ÒûûûóÓcUUŽçšdéÑíL•Û}&KnèZ-®”"Ýæé(çi(U…kUYºÙ¦Ûô|*¥>QfNFax!管Ñ-@p·,ƒÃ !ÓóëM pÕ&¬“$ðgùƒS:˜iŽXèýÔ}}SòV}4­€¤ ¦4p×*$?då·f‰Ô8L–¦‡rn!0€š@ƒc y£ˆAS›„¥•Rˆ-­”a3ÊÏä4ŽT–$ ·ôP±¾üu¢ìäŠhºSÀŠ1¨‰4·mAríö[Ù¼ˆQÀRJ[ˆ=;.ݾõ9žÆpÎ×ÇS¶ÈÕøÉõñJ(~tšTÀ¨m,ÈÆA+  êF`ãÙP¾'üðë €JkSìÁ˜EêZªZ2ä‚„¥UÝÙ}ÚÄ€‘<§-D½ô_êciÙaÔìv¶°¾µÉ?£€áÊ †Î>åÜø*05ˆ³ÙÌØJ)y)D|tBè‚ÖSôðºx™5vãÖh ¥ûã«ðÅÉßÃFNþã—‰ñ÷“×crî±¼j¶òuåÆòÀÛ´¯×:øÝ°t¸ÕKLŠwÿÍmÛ ÃX)âÜ)µÖ†2ºiCªÜ4 H)Ñ´ë6Q[sED"d(¸eqf)IJR’TD¤•€s~:‚!"2ÁÏ}iÍ¿Gn‚mD€ØVï˜Ð°"NéjM%y#P%Oë—œJ¶Ú¢Aljâö ‘k-´2}Ù4ã„HB{XqÒDÛMî8`7•.Mfs‘‚w´®ÿ*òV}ôlkÚÐ:~IEND®B`‚qmlvideofx-effects-menu.png000066400000000000000000005163711225012771600370700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœì½yeÙY'ö}眻¾ý½Ü3«²õÞ]­–¤QKj¡n„´H‚<Ža pá˜1ãÁƒ00fØ$$$Y¨Ajõ¾TWUWuí•™•™o¿ï®çÿñÝ{òæËÌRw«‘„\'*²ÞrßÙÏ÷ûöƒ¿ù[¿Á9ï÷ûA¼üòËçÎF®ëÎÍÍ;vìðáÃóóóN§ÕjU*D¬×ëa2Æ\ׯXÇ‚Y µÖZ "½ ‘>1o9ç ”BD!„Ö:Ë2­5cLI’L&“,Ëc–e !QkÍ9§Ò4U é'–e1ÆLÍY"¥”œs˲¤”Q)¥èµ"ŽcÛ¶cI’h­Çãñx<䜧i:™L Õju:ß÷/]¹üÒK/mnnnll\»vÞjµŽ=º¸¸X©Têõz­V[YYyá…>ó™Ï|ôÿtccCk-„PJÙ¶ý¦7½é{¿÷{xÇÛ–——ÇɲÌó¼,Ëz½^’$ÃþÈq¥­‚”rnnn0<ûü3çÏŸ—RÎÎÎ*¥ÆãqµZ]\\|Ó›ÞtèÐ!ÆØööö¤(œóAo8^|ñÅ3gÎüÞïýͼ"Ë2Çqâ8®Õj?ó3?óÐC}æ3Ÿùüç?%áìììÃ?üž÷¼çÚµkÝn7Š¢$Iâ8N’daaáØ±c+++—.] ‚Àu]DœL&ívûðáÃçÏŸ‡ˆèyžÅí•••çž{î—ù—ÿäOþ„æG)ÐhÖƒ!"|ä#ùЇ>ôØc=öØc/¿üò•+W¤”Žã:tèÝï~÷»ßýî,ËΜ9³¹¹EçܶmË²æææjµZµZ¥Õ÷}Ÿs.¥)e–eI’„aÇ1M¸Ââ"I)¥”2‚~¿Ÿ¦©ÂqšÛ¶mÛæœk­•R´´ÖI’€ã8–e€í:´“é«8Žc¶mGQD»”vo–eY–@µZÕZƒñx\©TšÍ¦çyŽã4›M!DE›››ÃáÖ%˲n·K;j0¤iÊ9÷}ßó¼CoœyàÞﮀ}õ⩹ÙÊÜâB$ÁjQ8>}ϼ8sù¥ÃëÏŸ‚õíqw³†¶Åýõ¶W]™ßpW4säÂÂá«ÿšÂnÕºEgV8lÏEî¢1¯ö‚¡MEš¦ˆèº.Û¶…¨8`~62¡óc ´BÐIF“cþæG[°|bH)eqÞ£$’JI)•R™VJ©LI¥T’$Y–¥*_Ó(Žiz¡R*Ë2µ»È4˲,MÓ4M•R¦ÛœsÆý¥ôZ+ESJéRIÒ¼Ps´¤”ʹ‡Âfœ#Á¤`À™M 8c DÍb••É!z™”eêGõk­™DÇh*c4Ïf‘†@U1ô! ÇŒ%Îb"›®ëû¾ïyÚÕÕºgúPîjaê,·%eÎ×·˜$äÌê|Ý‹¯¦hDLÓ4Š&iš*ªÊó\ªÊqÜjµê{U:’–Fh!³ d0ÔZ+cIš‚IG©†LÉ4MJ.„4?t< è”GM–æ“úÀc˜I©µbˆ\pPI™J)njF¥ítDˆ„AY–I)©i¥”å:–eÑ 'ESJÙn·=Ï“Rzž¢V«i­Ã0¬T*qšríÚµÑhÁöööüüüÂÂ!±eYˆ˜$ Ím‚,˘àåY~aÞš ¤µ¦z `úkæ‹N ?³üÔœÁiz-,A³It“Æl¶5'¥4D™v¡!´¥㥔æT›CN?§·tf¨•8ŽiÞ͈̇åeŽ¢h0lnn^¿~]A“NóEQš¦æR ˆhYV½^÷}¿Óé0ÆÚívQÀÉàœGQ4¨*Û¶+• ´Z-š ª™ÆE}βìñÇŸ››€Z­f%¢Z­2Æ&“Éx<Žã˜ÆkN)Í0uf€sNKOãL&avZ3aƒB¡Â“™ô‡pÛí·-//F£áp8 ƒAˆHXèû¾ëº„”´Y€kÛv³Ù4ËJû!Iúk(í%i™f‰d–e9ŽCõ’Dól.  YJÎy†¤BsH;Älõœª2fN>ÕL¨ˆ4'ô-ý<˲8ŽiiˆÏPJ !\×­×ëËƒ3~k掻_¹¶ñÒåÞâá#WÏÜõ;ÿž~A¾xfJä %¸6€3IR¥+½‰Ý_cÏ< §~ìØÌ¡¥·|Ëwb6ÿwq¶Qm7,Ö ‚´Õñe|Wæ<›e["R4Eæ- ì‚“ƒÊuØޅˆÈ-. @Í´’Rõ VJq!Ò4%ÂmVÊL¬R* &BäXBG•Öxˆ½Œ%*d0ç´Ç SßR&mä6rÆr¦,œ94¨€sÂ Š—çÁ¼pJ”Át^k E‡ ¼•‡IDÒHJ)ÐŒ>äE‡óãÉr©Ãó*e¶±ï±žcYu–3 €ó¥,Øœ3o‰éÂ"fYæºvš¦ÈòúǦ>X–íû¾çVH"’aÌ  Ì"ˆ¡Ö:šs.Ò4QZ€™’I’ØÖÎpÊØaJ@Žã"OG»Ø·‰R $2&8³•R™”ÒfPÌ*¥´ÊA!Ð>¤ §-ˆÄñp‡ˆ§”²Õj¦C'ÀuÝF£‘$IµZ%Ap4†câÓgff†Ãa³³³´$aT«\ÚRôí¾E—Øgš‘).F—„i¢„úPoÎy’Ä4¿4Bó+ÚâDS¨rÂøòÏË ‰Åô‚ÅuÝ2@š_• ¢¤ˆèyžmÛ„dô“,ËF£Ñ¥K—¢(ò}Ÿž¡æ¤”¾[1`$ UR­V9B{ÅH]ƒÁ}ß×ZÛ¶½¶¶6 „Fƒ$<Çqn¹å–+W®,..^ºt‰¦Žö„eYÀ³³³óóó¾ï×Õ¹¹9Ïó¢(Š¢ˆ¶,É—´|$h–7Y¥R!´ h‡œó™öl¯×;sæÌ… ˆñ,I1ŽJjañC‡I)/_¾L}¿ß'ø©×ëKKK Ífs}}Ý4¶mW«Uß÷©‡Fx¥åPJ¥ijø-"„jŒ1ÏqÍÀ Ñ óÌQ$ZëJä>?TŒ#â8·„aæè'†ú˜‡ ûL{æ5¼,±®ëú¾AÇaA@Õú¾OÛÀ²¬Z­Öétâôíä©?õÂÅÎÂ1›ßõ¿ü+ïczY%‹£,¨Z¶‹¡T`0‹} `*v4(€z»§_¬\9þð¥“'îyÇ#ÿ4àµËazÖkÅýÍy§ò¼eY¶m÷CJ‚®QБ|5лëV0Ó€ˆ¨Í¡F oŠJ3ÆP+s¢‚9•9Z"ΆV3ß“žG›‡6¡a¼h£6Œ%¢T`]È´Ž´÷¤”È‘1dP¬2rÎG)¡àKʬLßÊsb$`ꌡu“("êA­›¡‘Ø”Sd!‘ö-CAÜ!QvÇq*•ŠmÛÕF•ˆž¶eYBØ4ÏiÎGîZ­5²¼/#+µ«µ&FVüw¦ŸfÏ¿ò§‰áq•R;,7QþÐs\‰Lƒb3YJ+Ѐ 1VÀ¯aÖ l¡RJNwD>Ú+¥,! Nn§’27` }(„µZÍqD¬Õj÷Þ{ï‘#GNŸ>ýÒK/]½z•ÑQõz=B¸z½nÛöÌÌL½^wÇ÷}Û²Ó,µ…cÆ9…óSLA’=`Ì!†U¤×„$£¡”zllxZëL¥F|Œã˜$!DÅ«²Â–¬ ‰\)åº.á(iàͦ'*@îº.*•åOÑCzaYY‚©ÌÏÏF£íím¥1tZëáp¸±±1 ŒÚ€æœsÜáh FQäy^½Q_XX¨V«AŒÇcã(Š®^½†!á I½9êëŒsÞn·ïºë®íííK—.:u*Çq ‡˜$É©S§ÇyðÁ‘‰ãaT“°HÇ~2™¸†ˆÄŠÓä¤iJ¨V¯×•R§OŸ~þùç xh0Ƅœ8­Tý{î¹guuÕó¼J¥B$©×ëÑÌ0ÆÚí6"noow»]Úi$Èb! ™˜ ½ôš:ftªÀDò±R©T«Õ0 ¥”A˜F±.Œ Zk£&X✫±&±•Ø,sŠˆ{3[ŰRФÛ8ŽIõ]hhÚ`žç‘æ#˲ ’$ñ<&„¸X k/Úli;þ÷Ÿ­?úÙ^cÐçà-ÖîO@Ç©í‘ðŠ°¤ÉTÏB:È2)û] s€WaíÊd{xå·þÍò[Þå?òׯÛËÛŽUHç¨LˤÍ|•‹†°¿Ä³—&æ4® PŒ¡.$iš7]HQ r‚`ÌX¬0 í¶K©k¾ÊtjȈ*ìA†¶ÐVg…º ç#ô°!P´¥ÍÞ@ÐA’Ä®5Q¦r‰ Ô3×pf… xŠôÅp]—ÖÝlxVhË ¤ qfÕ(¨É$4ò"kÄ,6›Íf³éû~ÅBä³wЊܸìàæòéÝÍý<{µlÈ&RAC‰~±e9ÿaóDiÐ9ûÂ!ç<+…”R!Óù.Ú52ÜN¡/”ðÏ ¢A(R+Ô@ƒR¢.ÌÕ…®^£ÖZ«¼ÆÐl?·RJÔ¹NEæNC¦3æ…ÖZŒF#"úÄÂ=zôî»ï&Eåµk×Î;wþüùK—.u»]2ÏÎÎ’•«ÓéT«U)¥Lwj™+1:É)Åè÷hö‰ªy‚¦kZ—”¢ª°Öä"£k=$9tm;­¨”2Š¢Éd"¥$s—.$-D,\1R,tÚeó16AÓ éWJœ EÂñãÇ æ'“‰á7'“ÉÚÚ9ÚÐÃÄÒ !Ò8+DÆüT$Y¬µn6›dß5Ž›››“É„Ü‘æææšÍæÜÜclëú6ùU«Õûî»ïìÙ³ažþ<ªj.‰SxãßøÍßü͵Z Óó<ÎùÌÌL§Ó©×ëÐjµH4$›+ÁmµZít:Íf³Óé˜HB°*„]ÂWZwâƒc¶°Hì`Œ‘^š@‘Ö‹ä{Ú“É$Š"R¤çl8cµZ­ÙlV*ä¬ÙlÒê“›’‘cÈÀœgCFËû™(&½¥Öi $ú¬¬µ6^D£…#vy´qüWñÎÏ}1¶+ΰl1µÒ »DГ,“¡†(‚¡ UîK®¹E @¢#`íÊf}f&7â(ûܧä¨{çwÿ7/wA;fÞÓrðÔZ‹`Ô*Ç)Jg^gZÒ>!èUÅWRïÀdÞVȹ¾Kj0²Ašú dIŠ%>ØL²Q¤O£‚6S1 •‡OgŒ Ʋœ=â9c¨Á4ŒN«-”š0¯‰‚¹®[©T*•ŠñtËöS Ò– šM? Œ;ŽÑÖ’ìA§lÒä¯$÷ö´ÚéòÄZÅB†­.WB«0i_¶ÐÁÌŠblÀŒYn)Ð ‰òø®/ÓLÉÜ" …Ó ’Ñ»…½Ý6ßÒ‡AŽM—„= Z#jÅ´FÐ ™FdˆÈT–SUag%e4§*–[3•R¤°4ÄŠ$C–Äeû "$8öû}Ò®®®ÖjµÛn»íöÛoá…žzê©sçÎk? ®_¿N¯†çy䤪åÎ./³$AIÉLÛ« Ìæ¯/hâXáÛLo#4 »TI¿ß‡‚Ã%« ߊ'H"´ ‰ÈI9$ŒÚ¶M¢jPòÁ¡oI:$œÈ:iDkµA)ëfÅqìûþáÇÇÀ1V¯×·¶¶è9( –´HAø¾ÏÛÞìú¾?µÖ¶mk­ƒ  Žg3ÆH2&¹Z­’š¦i†Ä0{%¥¤×ãñØuÝÕÕÕ÷¼ç=RJÏóNž´‘r—{Î5dZçL¶rÆ€1&e®qÑj—40TJ3Æ´RX¨îAióˆO2ZCÎ9I,Zk v à­µPE$€ëºÃápmm-I’v»]­VÛí69âöûýÁ`Ðív`8Ú¶=‰;£ Çq³ ‹¤ ¯00¶½ò91Ëi6„R;¶kc—b…š‚ 4{ÄOQC¶mO¢@FfBhÔŒ|´Öa&IBµÑ¤@¡É$ö„¶‚Ù^ÆÓÌuF:'Ô©Õjív›˜ÆI3QU*•ǃÂF£±¸¸¸¶¶¶½½Ýï÷qyy9N#¢æô<©ÖµÖ×®¬Q°Š”’ºƒÁÂÂÂÒÊb’$¾ï“cóÌÌ MQ­V£®’ºx2™æV)U«ÕÈß§Ùl¾ùÍoŽã¸Z­ÎÎΞ:uêÊ•+Y–Q„”ò¹çž{áÅç9rôèÑ[n¹Å¶mrŽ'*  ýª8áMNEãñ˜”«§Nº|ù²*<³€š°l±¼¼Lüìì,…uU*¢þ$¸SŒÙx<&y”ÌP8µ‘àK«Ã#áUkMÓNÌ ±ÕÄQã0"’NÜ›!vÆY¦¬ò%uw§Óq]—…XÀ 4cŒúàû~î¾[è«©9æ”’¤jBñÑhD›‡Z¬T*f¡ä#¦”"Ç=ÒRþê/uNžœÄÑ<¯¤è—¿‘$õ0¶4dD'™e)%Rkœ—9øu@9(€ä èÁ ³ü0MÆi²ˆ¹g^ÿñç}÷¿l€ð ¢Iäœ#ŠI<» w·ÒOkPJ™Ð#˱v C#X³¡)r…õšŠ±±Â9ˆZge3mÉ~¿Ã n•æ¯)X¸+¨“e Ddh\½rOìD˽%^Ÿþ–ÃÞTa¿P%•¸*|vTá`…µÊO’:Š1f4çdu7CN³hﺘI5ø:µ|ˆÆ½€XÜõK(xÓl†} d"ÎRJVØu“$Ôá\gš8ã¦_eŒ˺Ö žK K‰L#¤i*øi”2›5µ4d¡“;G£ÕÌt²À ‘å¬UÀ%/hØëMÃŒµ$­/‚lÍ~Û™ßbѵÖ"š„Z*¥T¿Û³…JƒÒÁhLxî9îòâÒñ£ÇÆÃÑÛé÷ûÈnõûýÍÍMŠlQ\ÕŸi~†f^TÉ~…"Zf‚ÉÉd2??? |߇"³Ùl‚RØ iG'“‰eYi–›ã0Î9VXÀÂ3(”ˆ çÎú…ÆqœÉd’¦édY–Řð}»Ýn7›íÉ$\_¿°¹±¥2ÆÞ¬·\×]XX˜››ó}? ÃÉ8Œ&±Êô¥ —:ôÆ÷Í´g;vùòå—^zéìÙ³¤zrGJ©%d‰=Çwm" áÒÒ4u]wss“zKíÎÏÏ//¶;­™¥…e’»Ýnš¦U¿6è ׯm´Ûíz½>77GT:Î}÷Ýçûþêêê}÷Ý÷ÜsÏ=÷Üs} Bˆ$IΞ9wùâ•3§^ZZZZZZZ]]Õ¼ŠoYŽe9¶pFƒq½ZSJe*cÀ³¢I<fÚ³q_ºpùÉ'Ÿúüç?? hžmÛ¦CeYÖâüâL{¶Óš9´|øØ±c¤“ßÜØºzùÚüüüÜÜœ"‚¸»µ¹¾¾ÑxH© ^m4M‹Û‚YI”¶Ûí8L¢IL=÷<¯^møne;$¡YH©ƒ Œ¢„´ú“q@¸^­Vççç[­1IeR’¦ép8ìv»ÃáÐqœ£Gv:^¯wéÒ%â™ÆãIE«ÑÖ8 ×öc‘Š$2U“qH¬®ïVP3-s=µ¹Êt‚qÏñ“(Ìêw·———}ßw,×±ÜZ¥> 0Ͷ³ˆÉ¤>3ÛnR™¹ãcüå_Z`ßfÕ!+·eGãã£~ÂÖYßfl=ÍûÚÛ°Åu=ð…Q ‹XO(ØX)%)ÆMH+t}$õ­‹çyÄ’Ð`¼ ÈPk]­V ßï÷z=“õ…¾m4ä€F*k2–’›Y{FFúùùyDǵZ|×ÉŽtE4'´ú$R7›ríú³Êê)ÄA0søØ·½ø%ïÓ¿UÐ’ DIA¯iƒªyv‚e5y *O7##Pë;þ˜ý®F}¶+È|Ý ×&hnƒï #…^¬“ ’¦]€$ ,M£Oý§sÇçïÎpeåè¢íã(<'õ¨æôt♓R>¹ì™Géý ® Êœèò ÈRsZ¥TRi¥Aª(“.t‹y{i0=¶[HÂÈʲJ’r©2@­´ŠCæòÜÏ…iELcþ ÓŒíx>S=“IȳŒæCL@‘Li®4ËrWÒ1ÚLzif#ãJ[€²šç(„ T ˜"K‘eÈ‚ëûËöYš 9J#"'C¯¦q'CˆRŠ3‡+.2äZÓWpc|¶ÿçŽ,S¼ØÎ²×®õÕé¾ó|  ð¹Þ­«0E¡vøÈÐV`I­µ–RÇ)”eBDíèÄ’Ì·jÀG@­)'Ì$1­ì4ÕY Y&”V•,3 »úó(΢´åy íV¯×ã¶=ï8ÏñSŸþÄ£Û/ në4î™$" c½LmX@ Æ¡No50 €Œ¤„« @iPLK !_…l™§O>öÅͧžþ•w~DZ7¾å½ƒõh¶ swÅÿò_þ“:™LVWWgffHv ðÙl¶Z­µµµ/}éK'OžÜÜÜìÄÅ´ÛíùùùÕÕÕ'N,,,´mÒ rifw‡öŽl_„&¹öðögÖu]¥ç|0*Àî„,ˆèº.AQXrh"íqÎO9qoP2’å8gÚ‹Ü:äÝC$¸| ˆ’’ÖW—Ìøôm™± í(±äddp‚œzŒ'æ@R·’v çO2"’†À,M©\Â0$¿tJheÂ=G£ÑÔ‘£bR;™vÇ©V«Û½.ÙÎãZk- ä|1n+•Š”r<caw0ÆR0„aH^Kº‹K´…ŒÌ$fþ ô{„é¶á®Â8b¥\³¦‚qvEËMÝ0ëE¼>\F$‹¨9ª–žzÅ C;%P3û¡ÐF2(…¡“9ð ¤E§†LˆDQMbGÌÚ¢™á¶r6þÿ¾øw—þë¿ÿh4Ýn—ÂÛúýþ/üÂ/̬V~ø{þûc³3ë۲ʇaµ1Æão½ö»Uåü^õÛàŠ;\m½Ñw6ôŠØÌ²z@¬O­V# Î…ŒšNíªíÓÈ¿¾–,-.‡ãzu>J·Ì<›Åùê|n€t¸Ì%€Úíða¾-”&X|ßzÈ;L—2 䣧µŽyµrgïQýe¡°Ì Ou ŒU@¶R"qXÈ„‰Ì`·‘¯oOiÜ ¸«{;SûÒ+JÄñjËÎ4m•ÏQù@aÉË}jªoPóÞ‚{­â ^&qf€\ìälPEÆÇqÒ8a:÷zb ݸm+¥¤VJ)©µÆ<ÇîñB§2•’ýá@kù/ÿÕOÿÆoüÆ©Sg~àŸ<<êx‡·*6§•hXõÅt h”ƒ`ƒvldP\ƒP  ®*‚B¦A€%†iæØâ‰D~ ô©ÚêÕo{ÿû;3·uT¯×=Ïs„eY±]Žã²¨Ñ.a¥Hv,FÇ™=zôèp8̲,ÉrŽ)Žcò¹ÝÞÞn6›ÐÈwç¾ cèíƒRå]NpÎÆK/½D?"a–e‘7/ì¦z¹ëŒu„¤d"e¾Vš±*¹}B‘µÃX É<@’1.X„÷‘ \‚á¬u‘8‰j6º)J4f&ÖøQ,Š™c§ÔZ“K‰ÅäõC\íIFxC„ž¢ƒhAÇã1 ßXb†L!p†äþãñxkk«Õi@’$Q&µÖäUÏ9·]ÇL&Éú†’±Šô(@¾N$_œa#È#Z ­Œ¤bˆ©yMã2N|P"%Y–1@-U&•ÙN¤®ŒÓ˜œŠY‘²ƒàiŒºä|@ËJ®.å7%bÑh4L[†‡ m@ÛOïŽZ6²ŒÎŽé1¸4d!SéòÂâ s+tlþÑ}öé/=óß÷Cÿèþ·ÌÔgFÃQÊ0îW-ËŠT+«4}ÖßX«x¨˜”ý­ }þ¹¥Ûy°Õq{ƒµòÌzïðLÇéÆàÙ7Î}ùú >?Jt/­7F­NÂ4M}§’ŽùxçGnMcÉÒ8ËÊdt‡ž@ÿ"ÄûJ̈¨Êá"…×3dQ¼ cÙ’ &- Q‘SªÖZNDf³çífroåŒ1¥v$9̽mÉѹè¨ÎkÎßÊ&¥”R+%T!¡""/é{ѳÁ„Ö:•ZkÍuž“Î¥T:Ï\„˜+˜µÖ ÈsoQÓþZßç¿”ôcgtÖ¿š°¡ô†¥,xìî(c;ÑB†ãÉv4—D'™T\i]¬ jÀR4ºÎR`Z£ÚØÁ³033?ØÚžÄ!°3ÛŽ»›Vÿøþð¨×¬:qþ¡áä6­l°'2°7A#€.´æ )ø%† 4MI` ¨@wr4dÄÒðRÙa° ³ªg7_]ü£O쯾ïCG´{0l–Y>Ðз(Zk’¢H›››[^^îv»ãI@F~(–e­­­u:Z¥^­V‰ÌéV—¼± €asÞ¦x@úK˜±¸¸Øn·I°CDŠÙ- ¾Ú¨nJôÎÀu¾ü¼i‹0Ì|eš&a“ñ‘$"ÍXÄðh%Ñ­ÌÜÀ§3Âo]ˆÈfºx)[ž.…êRd¤.bm@iÂyI¸7ž·„Ê4É$ý›‡“$ADŠŸ&œ0HO ß⥑2‚1!ùdÊœ{Må¤r×E®1ZrRƒÂ3œ¦Ël Bk ¦1Õ±ÖšX,ÙðLj³X¬äEOfu#Œn€iDÍó´š´îÆî  O Š ‡"Q IÑ EH õ-Ï9SpZ¬ð¼PJ‘&†v¾1@ð"QšI1MZk€,S£~xÑç Cþ‰®Âoÿîÿê'õ”T ÑÜü E ¡5DñšWc;G™ô+«ç¾ø¹Ï~òÿúØÙ««Çnû±GÞº°Ð:¶úÖíõKü±þð¾ï؃Çž ‚Ñ_~üÏ>÷¹ÏÝÿýüà‘¥ÕšýçýÔ'?ùÉ_ùw¿Œ<Ú\ZZZ˜ÈmÍG –`‡âó 4|À ãÞÇnäç|J|g}w­v$o³¾Xjd€Pj@©”°-]¤åÚÕU£n,­äéCö)£I0‰£Å¥y&àå—_n·Ûúçvñü°~d?p'Àε†,BÐ:Y„\Æ-þa@Ll’–€²x`H¹œ¿Ö ‡žß&0Yjxs1ll_úÓ gNÕï¹9C΃u¦•ÖJkaf‡•rž$›Ñh¤”òP>¹E=ÌÞ!YÆ9“»%æc޹»µ­A# ÒÀ´¦zòí‘÷â}©ÿæo’$ˆ @K•Ÿh¤Ø˜‚4àÈÈ‘žsÆË§¶Jð©!—Í^ÕùiFyšö+{ùƒüsé”÷øÞ‡ .Ty_¾\ÑÿA¿EÌåX]8WÓ[Á9‚ ©Iyåð!aUÁÝÞ·]Û²íÖV¯+!«6›£(ýìß<èBú^`·[ ¥B’·‡ÒÐ$` ˜&RƒäÒ¨´&`VJAº3jM†àƒð9€E€V×¼S©Ïž>óü›OÜ‘“Î@櫤™ñ(ª²¬°%òA>/J)r ZXXcRuŽÇcºiàúõë[[[­FÛó<ŠÚ4SE¾‹Å(M_yîÌk² Q*à8ŽyqKŒáX¡QX䈆’÷©Ç¬bùs)w%0…²M‘K@`L kH6u1UNøA-’Oµ*¬¬È=´†Ð˜c3(ä6»Ñîª"›’a,L,–yŒfžúoª%œ6pbDÀV«E~d²H™Évl(©Ñ–ïû–eõ‡ƒ²ÀJÅØDõîtä4ŸZkZ>ãÅë÷ûÆ6 ¥èFZVò1ëËöƨc¦9Uò’ÝÞÞÆ"Ey™$g+(i¡©P¤5æmjÝĪ•{h:lö¡*RĨ"‹.T¬0…ˆ"µ8 Ù˜8ƒIhKnOú—×/2VYY¸©ÅJ+ ¶¹#gçç³ ƒíáDV›iÊWÔ!d99ÿôoÏÜ­î}ç7©ðùÿî‡*ûÿŸ~á‡n½3ÕùÃo~ñÏ?¦¥ïV&BˆÞðÜ»¿õ›þâ/þb_ñk–ã8ãíù¥£ï¨ˆ7*¶ êj–êñ`Ýu¦ Y>ál·r¦òT)3+ºð fíHÀ¬¬5=@´IŠûBÌŠÓÏ­te))`¹ó²t/KYO–ßEQÀFÎ7 0(Ý(“ähª„ÁÄXXÊ]5‡}Ï|îêd‰H¾:ð4ô§IíÎÝQj˘FÏ)â\.üUæÛb¨Ë «™ UÊA†EPcÌ.åÖ.wJ{„]ºû¯{¿?˜›ë 'ʲœC‡lmŽ¢`´ â]Ürt)©DÕ¯g*ìG]Æ… •Î%]­4Ș } sÓe t¡úñp!Ðç˜íÛ.À¤&Ôñ„W¶ú×Q9Ë|É«&`2jžR;qñF ûyÖ¯oЭj$ù‘·g½^¯Ùl&IB7îAÁƪ’Ϭny¦°Ï@±ª”ì‰Ô€Œk­†Æ•ñJ@KÍåÑ]…g9†ÂMõW‰k®ë’lG‰¢°¤VEú1#îL<–Buéâ&V2´—¤ù‰Ñ¦Rµ¾ïSP)É©„a¦?å.ÑØÓÒÅJ¼Hàllᦇ¼ö‚€•ÏêÂæšÊŒœ¤P@š¦¯\–ÅiDF=@¦zCžrH'áÏ\[Dì ¥c$IÝ€.—G™IV»Üp7…ˆiœ˜ÏË‹K&Ãm@¡Ú1*îòó4´µL3q¬°e”ÿêR%Ó[Vä!/Ssã“UÞ¦iÆXœDõæ\ŠãQÚ³r/CÅ›ë^kµclsm”eY§3Çñd¨·æÏa6n÷oÃÖ—þòfùÎê·gá“ipôØ|ö¹ßú oé…s‡b¤ýµdfÑOS¸z±ÿ“?þÞþá§â@HÁ¯_ëž;óÌ?ûþŸœŒ®»õMÏ “ø²c× êåS©µÎÇñA*hÓÁ»ù•ºü–ª jïºG{h…ÖšgÀ2d»DjÈöï#ƒ3±[!9Ô ¡Px2dyî”´c{Ìÿ³”‘k‡b¨Qð"´&µÒJ+sË…â€+¥hºcj——òNÿr²“¤N ŠñÕ°™©bøHÔôáÝÅÝšQã@«šçƒtâ µÌÓÂ#dˆ€Z)˲ì\Ȉ¨¨¯,Ñ_ÎAœͰÊûŠÅœPƒ©Ü¿?U¿‘k¹BˆS'_Z˜]¾ryËõ:QX•YâØ#t0Iœñ$Ð`5”Tt5R8b#ÂXƒ¤$l.t“B±€ tîüOf¶¸•D˞ͫË<8[!ðB‹ µ– Å$ Ç‘Ze™äœ[ŽÊl´½Õét’8eŒUjU–%µª5êó³ 2UgÏž­úµf½uîܹ4ÎΞ9Gaã4"5Ý$ ÇAŽ”ÔŠÎí-%Ga¨R™œyž§”ò}ßøéÒÍ ùšî¶+ïý Í\§ùÜTb0ŒÞæ‰Á &—°ßè i0„¸Ì7PýDjêÌbs&~›D%UJJ§J©°u¡â6ºPc¾Ýëã65^Ãfª"ÂjJ o&A)9˳J 2ÍY(n P…–¬Üûe‰Y/â~Ê3ÏŠ,(¬dÓå¥P±òòíÕØï³Ä¥œ>&bOj•«‹ í–á-Ä·r™`ñ²Ê„ ±©éÝ[Ê›vAén€²Æ¥ü¼m»£ñ•V«¥â•¸¿!x¯ÒˆÚÂÖ›ùÈG”RµZí×ýׇ׆ȱ¡ê}/®^fGï¹£ºd;/N¤Úîñ•õ3ÏâåëÙ¬²¸û[ ~ûZ÷…ÖÒOž<9¿ôÐCˆ8;;ûñüû¿ÿû766îºë.BkãÝFÝxm“p³Ü,ÿÐÊnɾ8ýÁæ¦ÛxCIË’6@Z¸ƒñ¬žG¤P.˜LâÉD‚݉Ç!@ì{‹ª`+JÀp)O%ä$BCauÚkþ—Rеµ5â¯mÛ®Õjãñxvv–’ÝSf5]èNIµH©†¥”333tIðêêêÛÞö6DFäÑSе^º"»Ü6+©¾ŠûS¿~H¹!å.•Qyêá©O¦ˆ2c1õØ«êÕ¾õè=®7¨v_ày Ó^Fß× fÿàÊÞ5Ý— Ù«W˜‘ÍÃõz}ccöm©²v»MAÒtô666¤”Íf³×ë%IBqÛ—/_–RƒfÓ»pþ’öÑ£GÉ3uuõ¯þêãÝn÷ìÙ³?ò#?BéH777777Ïœ9óGÁRÎa’€“$â5Ùo–›åVɽÊ1÷mÞ9­‡y2xëÛÅhpýÔ3qCÜÎ,CR!fÀ»Î’n  \k!K‚F«wÏ=n¯¿½¹››µt<1¨EKÁNHXŽƒFí„…¿ˆ09³,ó}ÿèÑ£t¿B£Ñ J=H.¸–ÕjU)DZçy“ÉäøñãGŽÙØ\'3*+A,êÑrŒ.²ÐéÒu¼{1ïë°àWÌ<\&Ó_ɸªG—Ü|^‰¼ï3_vûÖ³oß¾Q˾ìÔ Êßi~¢JY·´Öï|ç;?þñúÓŸ~óýo圓 9ÕÏÎÎÒVtóX–ewß}÷Õ«WÇãq§Ó±,uáÂ…ååe!,D–eÙ¡C‡Ç{â‰'èæö,ËŽ;æûþ¾ðÆØÊÊÊT·YéfÖ›åfùF/Àt*ЬŸ+•ÞïvþÄ›õÑ?û(üØœìY窊£1€ vŒÆVåˆP, ¶VkÃý«ÇÞÿ=€0÷ןT?ö½—®öæ-§ŸÆ•¢Ê“E>}ÌäP30töeÏ@ÄÉd²±±qþüù3gΜ>}zkkKJÙjµæææ(O2ÝWC9 ) B¥R¹å–[Nœ8‘¦)en"  Ãîb£ .èW&Ø”N»ñlÒ…Ã*…ošg¿ÊÅ´~n¹\öþ|/¤¤:¾A%7îØÞ_I%7Pɾ†b†ð ;ÿÕ/{ë+ìðÞßR…SaQSÀ¼–ÅåÖˆè8ÎÃ?¼¸¸ø±}l}}=I’Ï|æ3.\ ìoƒÁ R©‰gmmͶí‡zèüùóôG”¦éïýîïsn}à‘ï‡RÊ4Íæ—„¿û»¿{üøqÏóÈ‘ÞqœO|â+++¤î"Ðå¥ôŸ¯yn–›åPAP;ÿèêA­QÃ?ù {ÿ›/û° QúGÆÿþ7ï\XvÕö"J€ð$¤Ázm-ÎEÿço}ÿûÀƒÔ…­‡¿•=üþzœ4¨J€LCf…š4‘&wQÑjµ(Åu]ʹÑï÷)ëd»Ý>räH«ÕšŸŸ7wÆ!2Â`‚í;Óéôû}ß÷)"Å\í ‹ÛÝ-Ë*DRÄ$(4±:Tdq?RYý5§é{¥º)t ¡ËoqOî‘©J`êòÕŠû Áû~{ƒŸ—ÿD‹oØ{‡ö-Ãrð×xÐZèÂ4C|'Rw:÷¾÷½Ï<óÌÏýÜÏeYöàƒþÔOýÔoþæo¦iZ©TÂ0\__BÌÌÌ„axÿý÷ÿÄOüľð…øÃwÞqË;ÞñŽ·¾õ­ãq`YNRÊãÇ?ó쳫««Œ1 ¨»ï¾û^xá…cÇŽ`²Œ@¡¬úúežn–›åõ+ €å‚iîüÎ4ÚõI&½¤í3ØøÎ÷Wž÷Á\3-¸—I‰Ò¨iX»ý®ôÇÿÇÛßóH S„°¢ô"xP­ÕcÐÜjI´† ¡”€È˜(‰¿”' HùüËÿÛ/ïå~¿¿ººJj.J®´´´täÈ‘N§Ã9F[[[ 8å{ÒZƒ»ï¾³,‹Óˆ">eq_ c̘ɓ‹ɶ„¨óäÀ„ÓiéVs×u¿ã;¾ãW~åWÊÓvMÿJ öÂéå*]$%AjßcƒFS?¡iÙ›‹`¯øXþÄ@xù[£ÛŸªç v÷Žn_`0_­04ÕC(ÉаP½¾ÂÖ^hêuyêö­áÕögJn.·>µRS²oyž€îÛHÓ´Õjmnn*¥766· ÅUt@ºÝn§Ó!%Q†¤U¦“Õl6GÃn«ÕÙXßv—s+McÎçÜrD¯×£< Y–¹®; F–¦J)º;ËD¬!âAa'¯_9ˆ±Ûåÿµïî}%å õ}µõtj^asSõìÝ“úàTRßEpkÖËAtl¿rÀùeReã\eÞû/>´¾9¼pê†?(ýÊü–-µì'®yón_÷p…ãÇ¿8ó¾÷m„a ¬&„Ÿ%ñ±÷§ÿgëÃ?¬,Í^’ʲXý¥ øß²væÂ*Ôž„è0¤šóóR^®@ÖÀý—®WŒ IDAT­ÚÖ}äj6›Y–)ZkÎ…mÛãñXLâ8ãœ9rd{{ûÞ{NpλÝn·Û ÃðÂËç'ãàØ±c‹‹‹õj͵0Žê²ãì ··¡”²¸vÍq2‚RDN‚¶e1­%"¾’ÈKÁ š¡ ®¶@&l.£Kß|¿: L*‰ÉdB©Ò’³¿^ÂV™°–nŠ@›±7zw{G‚k`r ¢ÊMOõd ÀÊÏ—ÃUËu–Ãs÷­sßQOmô2ä„£S…•’¿—_ún¼ín\ÏA_Ý õníšqí•ÑËEÛÖüvª‡Sk7õz/CPžÉrO(S·mÛAú~U+ôÇ&”/ͤ¤ž€È}¿*¥Fä¶Í cßÑxT©zJ£%lÁPdI•J*±m¡Ôj ¥rïër~±Ÿ ×ë|Lo€W û–R÷öß'æj¿éÞìqJmx½ê¹Y^ß2‰'­Z=Žƒ0žxv˜Í4˜ptUú p->ùž·ÿÃ?œ»í蔓Mгgßñ-Ý?úøüºeN&×fZâþmí»>°–e‹–Ü~8ðÒ6|×#§Î\¸Åsy8BœCÍ)Û¦”’ÄâÚó*to%GâœÅq”¦‰ ;ݾÐn·)$]l7G£Qëëëœó™™Ïó„mÙ€)…Q:Û{Ñ“Êá7rÁÃâÙ~¿O^'AX–5??ýúu“-áë§ì+áí+\¾’ª¦ãõëæ—)_–þ¾’öýü&%z%¿Ö6–›åfù,žçÇc!t»ÝÞ¸6L’Dq#;Ëä¾³§.>ò-ƒO}ñ–Öܳ¾}B3¨|ËøŸÿ¬öCßs6ª¿öŸ—¿ýÛ@+Õ@&t®¬­­¼ïío÷1÷å0ß»o’n5j€}8õ2ˆ‚n\I’„ið}ÿüùóµZÍuÝÅÅÅjµÚëõ(Óäõë× ÑhTë5º.—R6š$|–%ŒÄCnœ”Þ¤ã™bþæùà´¡„çÜqœÉ$Š¢ˆn5_^^¦”ÈålˆSåkû*9u¡š¾Ag^—ŽMI{7øüª¹©¯n,)¾ò²·K7ÁxßbT&»Víï¿Ñ)!þf¹Y¾ñŠ"ÊRÆ”IÕ®TÀV‰‡<½íôÅk|×£üÉx X&Â#ßæWþøpÿÛ×9DÜ9ª"}¸¶±ò=ïÿü…—oÉ` }ÿÈd² \j€üÚرìàE¬®®R¤?]‡µ¶¶¶¹¹I÷X–533S¯×IjŽãx4)Д^ßä»WEm(L¡æF¿,Ë”²¨~ss2bI)•È,˲…E?i4[[[­V+ CÊøAºè¯7’±®öšá†ª½ÚKxð|ºßõ÷­a¯žö+TÄ•Gq[ðÚêÿÆ+{¹øª¸Þ\‚›åÿ…|‰¤LºÝn²ùùù«W·ãÝ.%ø¹(»S‹àɧŽ<ôÀ‹¿ýKoº³LZÚ”½ýÝ×m´…\ƒõRœzñ ûg8{ê™Û‚j{îÌdr^X*S¶Ì@k Ä™¸c¬Äݯ1ÆØìììâââÊÊÊÒÒÒìì,ÅøApþüù(ŠÇiµZív›$cJ¯o ¸ WWPÌ¥ ð}Ÿ.7$GksA (¥Lœªîš››;wîÝcOðÿUYµ×¡ìµÂ±cêõ >|]ú³¯ÄS†á¯¤Ñ²Õvgªþ›å òÕÅ2÷ýUkôf¹Y¾Ê…RÖP:ýÇüÖ[o¢E¨öý×j,)øka/¨Ä=ó\åø¡k›=ßÂN`£Ðº9êCW38ruÿù÷]zâÉ0¥Üù¹™0z²ÚRY*ò0$-¤e”ÞørçgÄŒé"B!áëüü|§ÓB ‡Ã^¯·µµÕívG£ÝG •JÅqD4·®rÆ2ã¹C°mÛÃ4LxLo ’MP]Eeÿ¡ðâ·¿ýíó7ƒÅ5ï7H•§(ß ¼¯Ä¹W/ È:7øäÆ”qïè¨Ýƒ>7½Ú·Ú¿’½ÄÝì›D¿\öáWg~n¼%n–›å `‘î üñ'NX–¥uZîûo»[«ÔþQ6éOjÍæßýmóá7=vm ÀbØ I5B¥£…“®_³þñ{žúÂçç„#B‹Ïm\?Ãl?Z1è@Ýž´SÔ.Ð-¿¦;ïÆãqÇA,--Ýzë­þKw§'I2‡Ãáp8Ç”ºR©xžGà4ÛñOÎ5€ óÜei¸R©r›ØÜ­k®½3±:>ø ïûO?ýt·Û¥°`< |•×µ<Ò²õw_жƒ§¨íkîÿAèþÊQ^'Ùô vç ¶àf¡òeù°¿ïvo¢ïÍò \L:¹G}´Óéœ8qŒYPÐFuàÁ¨A¸¹îž¾üì  ž…šÃ˜A/ƒ«O>±qõe¯^q²XØÖ¬† €uÇn¢j$”ˆCæÉ°J6`ó¢üš ‡Ãn·»¶¶¶¾¾¾±±áyÞÊÊÊÿÇÞ›GÛv•õ‚ß7çjwwú{Ïm’{¹i ‹/Ò$(¡QT©ÂQ¢…K*J ñ9†cðÔú£Þ£ª(l0ò„¡¡+K ”JÞ!aHHG¸ÉmO³û½š9çW|kÍ3÷Ú{Ÿœsr’x¾qÇû¬½ö\sÍæû}ý¼ôÒK—KjµZQ±¯—OÌEÄZ­Öh4ø°÷4MGÉÈÝÏÅXå“8,Ë:†˜­El¹y. „X^^~Ýë^wë­·*¥ºÝ®ÍÊxòÐT¶åkSuʯ.ºj2«©‹‹‹Û·¶ÁÛÓ,JîCï>=퉫×ë}êSŸºá†Ž;–e™ï…_vò_°âA‘ïZ~à“?xý¿{öÜ"h¸¿î/S·¡:‹>Ô_ö²ƒùÛ“Ýá—"5ËÛšÖ§ÃÁ‡N”6gSI¬Ÿª7"¢ùA³VPqúz¦ò¸^;Ú¨7çZEÕëõ¸R´”RH©sµ±¶9ŠÇÍ2!ʃî™J–aˆº™Kö)Lå¢í¿»mß&ß×ÎQåæJ›è÷DNÂŒ$™De;hîÓ+ÌÅÛ~…RY…\F<.U N-q·‡DfÆì—Ë»ò—)¸ãf¯Tn˜5ŒÚÝZ Ì}Ù ÂUæI € PFéLhK색Hz¹!"¤A€!0FИ ­»š‰^nI¡YÈÃ(@”±%é0ÈÇ—Ø\\Ù¡õbüÎâe´Kc4ŽsÏâ2ˆ•„ xÜÅÆËSñÛ­Á,:EÇLµýKð¬! )Þ ²º¨\ãH É¯îT³µ\!ؾÎDÆN,Ýú¼kEe²Ü=>ëA³f·»fÝ®Ìÿqaz;±l»G†·~î¶FD¾^à‡2Âò¼¾Ñh˜eÙ_ý×OýÍß]óÜKßùÎwæitúôw8pöÁÔž¾0†¾`Z‘ïcþч¯¿î‡ÎEjCÓ­7¢•ûî­‡axä¨ð¡ô0%¯}ãÂÒjô#ÿÝÝIz0¨y€Ç³Áçà‘@Áº‰ *ÄLâ”ÇÖ`NÛe–4…Ýn—¯|@¯-­u³Þ°œ‹ç²Tõ¶X/8Vs]ÀƒRSADÂ-ˆrGöÀív›ÛZëßÿýß¿óÎ;ÿÃøŸÿü篽öÚë®»îàÁƒI’(¥ÆñãÇÛí¶}=W;©†mßVq/¢#ùÚ+Ì=ç1‘RA`Ç„Gƒ-í®PÂÄQi•J^“rQXµÌÅݺîxÚo]`vá¿;ñvA[ÝÕÜ~UIk® ”5íJ°²…‹=V?à#¥Ý—ÂR ²ƒfû`Ù–ûR¶3ÜMŠM(*=,€°äÖ»—úý>‡hñÓ{½Þ³žõ¬¿ø‹¿øÛ¿ýÛï|ç;üà/\¸À©J5ÆÚp¹Ð>ÈZ‰]`s=Œ›…]-œ}ÕÆ˜,ËÜÎ<Xª•|?§8Ûo-êðâà**»šbö‚sÕß ;°CÇ¢O9ÂÚšÇmƒŒîÝÿí •%n‡ˆûißÈ!pó¼+P ¥ÚJŽ2ÊŽnŠÖ¶áû¾Åf;,üÕäÚ°n‹ Y2zâ¡}—âu„oñžGKÇÛO~/¥:äJ,-˜A,aTÖÛ¤—„¿uS÷F§D˜+“gdÈCQ Œ"L¥^@”9® ¡škÐ(–ç´§†ù¡!6L0ˆ×rô6‡‰'‘¤g„Ô¾g„$_H¤ÕvÊ +;Â4Ürïœ:$ÆV²%íaGfò÷ѹVSÇÍj,îÄMöÇ¿À™wñWÞ¥¼bÜ‹öY•øû ëýÙê!":R²ÛDTFO½^*ŠÆ˜A3&ÈeMÛÁ«}ÖÌ)Þ]mð™³ÙÚ;é!@Y¸Œ4_„i"—1†KV°}teeåšk®yù+_õœçžCyÁ¦…¤t)‹X“Z"zqóiƒìÖ ‚€vUFoÕÌÀ Ô5_WÖ49Ç­Ø‹XjÌÂCæþA0ç²Ïâ‚Ò\,·^¯sFÓ›ßüf$(£î¯ÜW²2¯…¾“7?ó\‹4®E”»çû~­Vó}?MÓáp˜e™Å0î-óî$IŸ¬qŸ+Žck`!MS¶+P©. !Â0¬×ëQ5›MQÛ ®CbgdT³ eÙ:ëâœ{MåÉÊÖôMDVó¶ƒÃ¬SºY@D[þ­*×Î}ƒRì0ÆpA· Ñâ¢ýÀãÆ­!"GÝ'IÂåÁ¹°š=7Úžš5‰¾.këö;Ãá“èì RJ_Œ÷<þüR<¼Zx¬X äà¸ê_qÙN.ìJø3¯%—ÜÛÜ­1•G€RÝ<×½^ÚïåY¶ÈÔ–J€Ìc$Èd''Šu¼,;ËÁ©„’õôØ&,ë@{ÆÀ¨F ( ¤ ÄZƒuŠj& Š€€B÷qöE\ˆr*žÅ1§JEÀ¾[û­ûÁ]Ÿ4áÔǃˆyi²v± °dè8NléAn¡tÈ!tì18ŽÖå¶Ýº|ˆ$L #ŒÖ⢯õýoõ¹ î€å MÔ8—Ý®ò‚¯ÌKeX܉Yø;£†ö,23€U¥™;ng¦Þ/|ÏC!QøB"" $ DJ»óh_JEYcÌâÊrgs¨Œ1y6<ßm.Ô8x÷Ù.–•1ˆ¨<¬×@€÷|øÿyñ /Ùô´&Ÿ²áÒ™õŸÿ±Óßþ¶Ø›Ëß¾óò¹áþáŸ^qh5fªøK¯}ÝèÃÿ÷3ßö–oôò ÒW§$çó9K¶«èèP®vÏ$3Wbc)Ÿ‚ã@%”ÚQp™Nd1±3]8$ëøDT°EFËÇ“$i4 TFc8¶ÛíùùùN§Ã¬Á vgÂ]Êà0Grô]ûtÛ“J,•!8éÒÜ«Yb©»Û=f9 ÿŠá“5¯‰0 y °©T‹5)nÍË6|«ûB©zÚG@éf›C…)#Âì;Â8G³ãSùme·¸¦;P|å$;ÈÖòœ¦©X¨âfËzsEûÖîò(¶b‰ô“‹ HPnò$Oìšda‚…'=é ¨„Qd´$\7 1H;_lÿíÄñ2°ËÉÝù•5æî.k±vQÖg\„v0ÉA£\™4Si6J2¥y"" ÁÀH5ƒ¾6 E-–~Hz ë"íP„Áu_æa€A d@ÒË )Þz,•n͵Èþ**}„[uL#»XxØ,j`åÒrü­Û ‘"£ŒVzëÌoDén^!ˆ·ž&À aˆˆ<)ìBáóPnuƒ²Ül¦¶lBÜ’ âÚóÖêK@†Œ!$¢,Ï*3RL³Ø#·¢'£· ðP ׎B ¡¢ÃvEÙ X¶è´Oc&÷1šùe¶‹Öhl “+¾èé@è¾ãNHψS[wKr‚ÙAX F )„@ÐÀ cÆä6DHÓ4Š¢z\g;M2f¡œ>í{µ ¹–½^¯Ûí6âË ³ –w¶Ždø?ø+®9[Ã#€ s‘åq'…{Íïüú‹=ïv€¹´wÅ#÷ÞÛxÅ‹þîîxE½q¡ê†õW½öìÛ~]þçÿµÑíÝ0‡°•†D@ G›ER~OJÇqš¦\ƒ¯AÀeDpÜPÉŒJÏŸf*Ö4€Ã˜˜X2µe9lž+6ÃòeM „ÐÀ¦i\!Džçsss¶÷®†'ËÃišHeQ§¢Q¹ÿÛ P¨æeÂë©Ü+hgß+Žc;&nSVëâ’#¾ï3^®¯¯ci»¶zmžç^*]æÓaƒ ýˆÇ‡›QÊNÿÜl1£ÑV&9R³í¹ý‰½Ù¾¾e¦ŒAså5Û`ŪagÍ,Òéòð+–çø¨Jc þÁ Ç¥Z쳬jRÝÜ—â%j³$'Œ‹{εb°ô ¢Î·ŒÕlþåîq…Jù¶|Lû wÉ™ÒíÂÃË[±ÌZ¬1†áÙîI+Te:PDÒ ju#F¾ñ„"´×%4„ñPê\×uî³$U}_èÅùJk eäw1<ˆ€H®¦ë>bóÂ@Î’H!²óÂ6ì¢ÿ‚ŒaQƒ-P€Óç—%nmF&Hx…³²_fœ^È£GIpç ·æÑŒUí]XZ‡^—,–µ,Ë£ak¾Õië!@–e +­f³yú»mŠ1@¥¥ýäóGZ—œX–Â_ïÀË^vË}ß>YÚƒäX³Õìu¿%ñHy÷ƒ—¼ð _øÒûó ¨½¹ U{ 5!€&òø<`p0Ër9†$ë媖 GQÄìÀêÖncMšv4]Vî~àµkÙ¨»â@+ͨƒãêWǽ^ËMsy†>µ ZÓVPm\_ˆ+ñÙþ[‘ÄnHÛ -ŠÉƒãB‚‹èv@¸Ž&ÛryµÖ,[ØQ­Õj‚d1žÛác:L™¯ÂÏ•R&º0qOÂË€°ô˜ ËŽŒ;8eí V–rY’½Á”1wnk®øÅŸïYž°¶z®6jÍDƒÁ€1ØF±U´C(AÔŽóä»c+Ð!²’]ÁN1žM¥»×Þf×'ÿYž¸µ†­jë6b»dA½²2“$‘NüC¯ÿeÊJé¼?4 ‰‘ôŒïü<‘hMGއaj¤Æ¾eêëÔÒ¸&ŸL Q€iÉù”Ë:‰-³sD:§ ÒÔÖF€}—Út¯Y™ÌÝæ"'2Ùý`ë‡n lHríIå·ÆþÜ]féî‹vB–ð&ÉJêv¸b™}Ëí÷ƒ ðî>â Û<·‚ͳs4«µÊ¼L~û¨÷\\¢qzÔûÑ“€ô€2@†LÁdôxêM»Ý‚ Ùl2«a¿Ñh´{ÝZÜÑÏ“¼ÑXI’sçÏŸ¯G׎Øró;ðçÿæÁW¼ô(С¤:QK?þ#·Þ÷í£‹ƒäÀ05ëõ¦7èX ã“÷Þ7zõ‹?ýñϾòŠKšmHç¿úItÀ+@Þ\ˆC@¡¦àxFŒåÆÜ[occ£Õj !8v¦<7ØDQÄ\Ò‚IôŒ1ˆ€¥€Æh/(Q€H%l!H‹^\Oƒ92`‘ÑúQèG>† $iš*ÊY d_,Û”Ò€–R D&Íed†¨T1Ó·cõW;Ov—òö3eÝŠÚÄZ‹ÝrŒåñÒ=Â÷ýÑhÄŠÛ“T¬†!ã±e߆ǠÎ&SDîQ–äˆ*Š"xFQ2L¢f³‰ŽÑKc¸E ¥,F‚+ƒ#"¢qsõ0~Gî!f¼t#θÛ2J¡É€V(…ïù 0×Jç™}ºË‘Oqæ–ƒ à`4~œ-ÉÂÖ~¢kɰ0Ìýç›É 8—RPè…™ÌØÖ XlŽÂ°Åò¥'Q(CÒ“õ¹&(¥’$q…»*l]6«Ç[Ë]H.x¸‚ŽU]!‰Qœ×·É¬”R&çZ@BD˜÷/DQÇMcê¼1˲}³d .ê¾~-¦ýü«Œ˜«=wt̘Ö@'‘ÊQ×0êôÉ1¢.d!=3440ºä¹l­ £!’>HY$»c$€D¹uÿ8ùRX LA €ˆ9•Ê&rãThiÁ ’ ù¡Äo- æÀç¡i£š$!2 Ë»Á"" ( 9ˆõ0°sÁÒŠŒ ¥p竜t4V*"P‡; 1D­J† ‘”Ž÷¡äªü=º~M"Òd ú~ˆŽbï<.vŠ6fš|ÅŒëH°%8¢!Î6´› !¿"ž D¤ ï5ÿ0ËFcÛz‹é.‰YÇj¦zŠO ðaTZ{úyzE!ÒÁÈä DVm)’Îtš*!DäÂZkäRç¹Î#!Œ;yÏoÕOœkŸ2íxA1L³ÿüGâÃË?ù³G¿qgçx×—ï<Pêç’‘²a~•õ4 úæ7¯yãýË»ïY×øMÀ܆`Ó.ÝXÏóâÓ*Mh¨Ó4­Õjt¡ ßó˜pî¯ãcMr²x‰H€ä+ÆÉDª¬W´´ßZ‹Û׎2ŽˆDE¶G’ ª\M;Š"ÎBÎÒ"n–µR6röûý8¬¹,Ïö}~àX¡íæ´ZˆÕù°,(a×kqVq™1ÍK–²9xÜ8šœL!F5L„eZǸqØK¡Àc(3°-;vÕ8QFic,’Ù7uՏЅå\º IDAT JK€eñ¶¿­Ôbƒ®mX?ÿÉìLâVÚ•Þeãå† ±ã•„HD‡U"‚ -­ÎÅW O/¦yŽ-ÊΈvòn Ù´*‰<Ï JQ€Èà1¡­î»^“Ñd •ˉ៣›z—ÅAiæeå.©ñ ²-&9#\x&Ï6¬œbi#r´DüÏÝ;…)®4z[bÑeÎÅÒ›A„iéŽÛJD8Ჩ¸Œ]~e7ÛM[ÓEt¥ ŸöY–©´¼X^^ 34†úý~=œ‹ã0IÏ€P 0"ÈËGÏùýß:ýÿËW²<8ìÁa ˜ Ö@Ø4Nî k™¢ÿ;î{Ë뿉Z6:šÁåQ­ž ¿ 0Ÿk0ôD ÔÐ$mš$2×"bûˆÂ$IÂnWáxLÙér"`íVá†×ZµirLÑ©øPÄ%91ÒÆ…–ÙînÚÀl¥T¿ßç]­ù&w†S¤<Ï«×ëõz=OÕT¶È^FËpíW¶ât€Àâ„EPDŒãØbÿ–*sI(‹+Vváa´AR6B¿Êó|4¹¦0ãX}mø® ®P<8YIŒsÖêªÅDd£êXváWJYƒ9wÛ®{`ö–²èI;2¬ÉÊ  k²z?¥ijûoÊQ¬ßÊ-Í ÜŸßΠ±jØ…‡N-0!DÅŒa ÌCú“q§BišO½^•CÊ?kadíOàŒ-†>•"¸q"âF-I’Þ AÄõ˜…éµµ5!Ã0ª Fý¨^ž§q (€4` "@1PŒ8Túêr€MòÏ !#Ê 0YWŠÒ„ s´&—»ƒ /ìBÞ‡t !¯/d©|¯•ë¶ewàðyðø•†9ØÇަ lv:=Y°‹£-k’*LÓó<,­.܉ÄðÐjµ\튈ø8‡N·Í¼/öXƒÍÍÍF­Éñ88‘dlG©X÷UåQN–¡oñ©R¸¶ú”©«líä¡ ÃM‹ü[ëöck•B†m lƒ§lвÅK—ï8 Éê‘)ÁÙö¬3sO’Ä¿;ÍŒôvf-Cé³ý´)íüÊ^qœsa-`EÊ•™¸YkÑN@¯ÅTWJ³Ú° H¥·•Ä.‹´¼Õ‚9™Çˆ×# ¢üDYòsYnã+~e—1ÙÖØƒà.3-àß®.+ÙÂãà Îe‹Ö­k׆)#F£Qš'äd|±hEQà…6 Ê£*79ä  Odr)‚Qš³(7yš¥à M‰ÊµÊr- xÊÛê¿»g½Ž°»[ól† Œ[õPÉ #äÛën.¾`&ÜÀ|”‹äØa6qóx:“e,ÖJ'œ¬qD°µs…cŽ­ÎŽ¬Š‰âM•¾Ù¥BŽf`ªmÙò·ç[C91•I´³ãŽ€½Á—|/*Ñ×9"â,_ûÔF`"Z¢r?:"”â¸|÷‡¤qŽ °­ zÃ8޹”§}ò`6 ‚`”¤q-Z=x8$Jé!E¡ 0¡ÏDß„ì UDT´j(\â,">Ç»j€†9€?ò@EQ;IÖúí Ð0ÂÃ,x°ú+ƒ|`æ'»º Ã`¢”,2N|µ²€€­š“#8uÜ¡´ÆmÞf…ÙD)*Óã‚0‡ZkÆÝáp8 ò¼p ³Öhe ‚`4™²p„÷ä.PwCZÔ„ñ’ÎV‘e(¯Õ ËêWœðÊ»¢ŒÈeS¡)c©¬õÕ”¶\6\óBö"[Œ„ñ0(DLÓÔjKÜ7{¬²UÅÀ ¾µj§h¶fé·i5K«Ûq°¦~¯¬ -¥4@.YVÅ ¥‚Cùج”ªÕj.·µÏòÊŠ.T ¦,@my–*£½ß.Y»!=éQ°öPZVl—ÖšcÁ€ëº°òm7UÑ5+l×°(­ nÚ:ñ<žn&"–bŸ I³™Ö¦tØó¯¸ºj£Ñˆ¢È¨1ت×jRJŸ4h/ QÝ‹èøBÊÐÃ< E&¾"ýé WÌ@`-ªêoñ¦àVqr»×Œ1èI lkUÍ#ïŽ?·/yÆE¡÷€!’U#?“,*4ly[JÜû"Vw˜ÝûÆ¢bÁD¥«ƒ`× Ì`wYÚu[a¨"(ÎÔéüK¶‹§ò[Ë´Ý%Qy.¹AŽE¤¶³r¸e3Ý<‹Ø…1‰Á® Úíg,Wýµ/¨|iÙˆqjZ“Å_r F‘Ri–k¾Ñ´¹¹zþ3¯¹âïÜÐ#hÔ àh„!\‘šLÓ9A=öd©ÌUØç±²E¤5ññl¤s¥†~ˆ‰2 cß?¤é“7…WÓ€± %¶!?sø²CÒ‰8± <ËsEiv¶Ð ¥¿P9õ†r*”9S¤óŠ[.awFMYú®"I!]È¡RHó„åY–Rb&µ¶qA8y–J©Ñh”¦)´ »5ØtLãª<ÙS‡mÏí"°r†Ý¥ÆkÂReY%pbY©tÛû-:ÚeÄ ÔÝÌÆ½¥×¶ÏàçrßD™0Í/È-sš– w+ºlƒ°˜„cá°ûÊåõàäò3|òEMcÕ%YÒNj”Ú‰ NîÞã­Â¶/¢Ë²î Û¦Üý¼µ“‡ÄÐk%öOv^X,•®V(ÓçtéØ4¥÷·À,]aK58nHþßÚL4`ÍXzÚ²,ãE›e™¦­,aî<ëõ¸¹mB•™ÜËÑhOÈ,Ëû>"åûRšTR sŽÒZЦˆ·á‘/}¨nð9G˜YÖ 4à lo+üDd ¹j–tDPyCnœª8Dä>DÈÓM”åUM‹[ e™`f‚ Èžâ€Ò Æ`Ù1ast‘³, !Rº:hD`ò±…É/« hc„ð={€Ûø€Ïª|1#-gÆÝ@›BD~;0ƘÈéž*÷»±Œ=ÜjŠ=–$8 mù¶çÏ<Œd*é,ŸD_€¢ Je‹E¾}/ûCDÔYaBA"4ÄS*±Ó_ Ñv³·I:j6y>:wîÜeǽúÕ¯úÌ_ ñŸ‘Nœ0 @¦£)RYogYÏdA–ÀÈ_Ž¥)³{€²Ñ×П‹üÖh¸9Pkyö`P[Ïr"À÷ÚÙ7Ào?ûy?b=’PîhæZcŒˆl!t¡ÔB#_L†)+ÊXžL²T–rªL€e k Sªc#B,²»´Ö Šú”ý~_JY¯×1ƒÁàÎ;ï¼ë®»î¸ãŽÓ§OcYÈ)I$á&[W+Œó/p ܘ¤­©ù¬KWp¶k‘õlã˜,¹ϵ +Ë|$;˜­z¤²v®ÏÆvÝV·ÖeP’µ[¸º>•2Œó Kî(á–ã˨´Uj "áØo·ô ½5­r<ÊÚ7û 9nÏ­õÛ¼Ž)[”ˆˆ‚¨ˆN`ù—ñÏ÷}£(Žc,M8Ü,çs»…½lSàdpA©‰qg³û “odJŒ+çM.-~MåÓZ oÌ‘i3ë²$¯p~÷ZØJp(tÚİ«±{‹Å}§"ȹl5OäÁ‘бIUZ£°/¤dÛ6ô –îâ‚;æ¾9å‡N·1dõ4&ß/*pUö]ÎÂ=K™eo0þtÍÔx¸+™&€Í¾reGû”,°³ D²èäXã³MÐÆ‰Ô³"„Ж†r1LÆIι=YÆbh…Ú©-[™hlÕøéOv^¤¬¦9•¯¹»~Z¾Wmm€íKUöå®[·)"b$ûì8pòäÉ«¯¾úúz¾ôê<¿‡šŸoÝðC×_~Õe÷Ýÿ1©_ˆ$À7èsJŠ®Áa6h¤º‚'ÓvŸÊbѨ¶Žpð×)?;Ê@fÌrû~¨zGP ©²4{£ô¿Ü{ÅÉcϸìéTõo§”Ú²«§r"ꉧLÃáØó<«7+¥|9Ý4Á§‚c v‡QÞ'æŒJåDÄÚV«Õívo»í¶O|âÂ믾úçþç9‚ˆÌpÃ0Ì’\–©·V©r×¥Ë \®êòVË(Á1ò{1ï¶Ê±]Çr¼d±ËmÉf×£œÂÎ~’$a¥–ŸbA޶mÿd²¸î•;æ•oïwßÂÞV`«Êo½ˆWÝHÅëë)+¨‰Žêoÿd´N\w_U0ƒÆ›b KYÒ¶–%9‘U΃²yeÚ9ƒA–å2ìRQ®ôJ9£2nCwSAœc•S Ý4O¬ÚíîOøî.µï(´7ÄòA‚uE£V´Åá÷Îy˜<|ɲîãá¡À†& ìÁ”Á3 P h'n/6Ž]~Æñ§¸·1y2p÷š}µ ób!›—Á™ßI²*¼›¸²8Ý\¹_‚•¥D1A„ («HÛ•n»Üœ¨]p†Ç4Qç•'Τx¢óâr w•NªPš÷ܱl¤"jÀ[˜Rú¤œ~4{ex+¯Pi ¨]Ù`œ²ÉöWˆHÓæ‘ˆP6²íöÔ©SwÞyç_â“þ‘[þ§·ÿêüÀ Uù÷|çžÕÕƒ¿ÿÿñ?q³Á@ÐÈC$$ù€VPKˆƒ†ô ?"Å¡F8mŠ?óË6k “$‰Qa¢t>ZPSé÷jõ¨¶©àkõÚè%/½±Y¿2ga\')t›~ô¯êõ:ÍÍÍ%Iò¢½hmm­Ñh FÃ8ŽkÛí6Ãm†έqlËÜÜÜ‘#G8U—ͯ¢»X£ŸÝŸr¼<=©q ØÝN§ó‘|ä3ŸùÌÏüÌϼà/pŠTWÃs›µ8ZÙ“æäÚf%UVÕ6ßVVó6wZ†åÞæò_·Éë•'N.èYOG¬J¸P‚–»îakCVÛwYðä‹oCSŸ;õ],¤Êµ¿rçSÇ$0ì¼Ã“?œ‡GmÇeå:à /ÿ9 üNC€>pÂ,˜¢Øä.+ÍêÏìõ3ãÔ G;GvçgWÏÝíụí»mÉÆÝ™jwO»<,a×ýßK;ÓXÁX­$»µw{Þðlš>Î_üo·ÿå_þåͯ{Ýßø“͹V’)äyÞ§>ý‘÷ý§~çëkÅÏìj 1,Äw§¶ãÍx_‰ !ä)¨(¨¥&Êx@ÏŠ`4L¿ r£qlée7½êä^Šôëû¾Êò $ G=gi:–ãáÚùϱ8ÃÒ0˶>¶æ±õÏjàÅ8ƒ`Â~â eZë………n·;?þñå+_yûÛß~Ùe—M]T˜ÊÙ§"ÍC;n}gÝV M}ÊÞwá¤2§;¤=üäñèÆ>íÓ>==è%/zñn¹åßo~Ýkç—5™ÍÍÍ›äÍ/xÞÿÙŸ}ðÏnùÓnïN¯¨4š®Ù«‰3}ËëÀø²O€oRBPÇ Ë¼EyéåÏü믻æ9Ï©ÕZƒQ"¤ØÂD'г~;¶=ZÕÁªªîß÷çç瀵a®l¥©Çji® Í*Ý–N~¶\(•° n¿ýö¿û»¿{Ó›ÞtÝu×i­¹õ$¹BƒK“¼xêmfñýjÛ£ï“N.Ê »:âNàs{MúI;V;!WAJ¿È“–v«ñïÓS‹”RϹöÙoûÛÿÓûþKŽ]úÌg=û’K.Éêu@=¿Pÿµ_ÿå_þ•Ÿ?{îáóçÏ(yžð“ÓÛ™ŽËÀÝPA*àŸîøJŽHÚxZ@j­ 1ˆbéýA b8ßZêŒ6·TPg‰yÖ\ÌÊ.8ù00I„ˆžç-//‹2pÔ÷}›Šê°Ðe‚“mÓê¾8mãLÍfs}}½Ùl~èCzùË_þÒ—¾4ÏóÍÍM®ã¼Éõøº¸;0g=Þ´Cãdå~ûÙµØÿ~^ªto¶ q»Wpñf'ï;i߯Rò” ‹nûôXh€ŸÞ4 æççOœ8ñš×¼æþ¯|êÓŸ½ÿ»...zAš¤Y«±¼ åÑKøz¨¸0µ§Ç"È¥:7ÅwŸ}¢šÖF*ÔÞÚ… ýnÆoMß÷Ñ£Ñæ$odXô¬>Še. jçÜUTLÆiã¤9R57t`œTWåu{`‰¡—/r)íÛn» _õªW­¯¯ !¸Ö¶û[ NÖ*ëZ›+|Ü>åQ&íbNDmì„&U7··;¶ÝReXö<8now"plóÜí5ÚY_¹£í¶¹¯DîÓ>ý›¥Ã«‡6ÖÖý0xþ^÷•¯|å£ýèßtãh4JÛéÊ•áp¸¶¶¶¸8ïyª×;+¥Ó |0Ó A¨€‚FL~î7P(D†–ý8ð³!¡Ozž@¡³<¿Î?¤²0'ÿéçè€Q [CÑU%‡Ã¡(3†Œmñpª¡„a›!ÃíW¼˜.‚2¥i†áç>÷¹—¼ä%D†a¿ß·u%+êѤŽ[aè“H¿í¬]d¢i±K2y®³îÜ!°}_hÒ½ coêo劘–çñR"·¿öébѾLöô¦ápȨ´²²rõÕWßþOÿtÓM7ÅA¸¼t0I‡d°^³|Øí„4õZ£ÛoNm'”ÓwŸ/}m´VY Ô¢Jêy®)3›ý<…,GTžÁb}yq®ÑˆÖ;Cþ!ƒ–>Ïf"Zg°)«ÆÙ„`›ójŒáÚ~Æ®ØÌÁßbÚA:Æ1ŠÐñ1[3õÆÆÆp8\^^æªZën·[«Õ¦„¯!õzýüùó¼»Ã0|ä‘GVWW—––8°1Š")åÚÚX<Þ§}Ú§UµÄ¸i¨…’ƒ™²Þ;—±²'Ûziš² ÝétŒ1¬Àqm Þ¢,›³HžçùÜÜß/Ê“ܲ‹¬ÑºÈjE{×+ìJÁ4ž¤´·ápU´I=æñ3 ï¤c“d¥oSø„uØ*%OBô§äž{qºýýô¸l9xð`·Ûít:yž7›ÍápÈ›h86›Í<ÏÏŸ?ïy^¿ß?tèн÷ÞÛl6———`mmíàÁƒçù… –––ø¨‰………<ÏßûÞ÷Öjµw¾ó›çæçjµZš+ß ³,Ëòij´°xîܹk¯½öž{î‰ãZ­Ö¹sç˜;p‰õ,ËÂ0l4D4.ú»ïÓ>=Õi6d8˜™ìÿ@D`t¹Vó.DŒ¼â”#…ÂG‰ˆ$Èã¨cÆd.M̬”â… øàW\Ñn·G£‘ïûqƒóçϯ®®=z´ßï ÎAœ?~eeVVVF£½âìÈ<ÏÃ0$"N¦ÿú׿~ìØ1ØØØð}ii)I’ Ö××=Ïcuy}}÷òEyß§:=9ÅÐ}z²"‚S¾Âr ¶øºe%©4úò÷Ð(δRJ ‡Ã$IºÝ.Ÿô×ëõÚíöúúúææ&§5¥¥%"â³xÙ"ÍO²‡Ôšò8t{ðËnx—ë}¬ÐÞÂU¬'m•Û|ûxPå‰÷ãöLS­¯OZî3i4žbJÞSÿíOÜf/bÏWWWùÔêg<ã§OŸ^^^þð‡?\«Õž÷¼ç½ç=ïB:tˆˆò<¢è‘G‘R²3¨ÕjI)Z­Ö™3gz½G‘ðN^ZZ:zôh’$ƘÑh”$ "ò1ÌaƒF£Çñ¡C‡>ô¡½÷½ï ‚`~~þüùóZë^¯×h4øv»Çq«Õºˆ¯¼Oûô´§©øÅº«vŽ™·×]S1–áÉZk%ân·ËÆçxƒA’$¶0V½^_]]=pà—£b@ÎQ!ˆH¥³Ý:tqÜ(m»nâþ¿Åøö„Yø$3A»#ÃäÆ ¹À|±4ÅÝÒ¤Öûd tºLMóuioãùø™ /\¸À»àüùóaAÐn·Ùãû~§ÓIÓ”3úÂ0FNguuõÔ©S¬+¥.\¸P«Õ¬ÔÜl6ƒÁÙ³gçææŒ1ý~yyÙh¡ z½ˆ†P0777 ƒÁÜÜÜ·¿ýíÕÕÕ$I´Öóóó¬%¯®®>ðÀ\áõСC=ôP½^¿èï¾OûôT§™üq¬¨¤kЭ0RJÈ‹B©r4†”òºÝ®1f}}}0°æ*¥ä04MÙe†áòòòáÇ–––X*oµZ\£8-˜ í–Õ\ýk&NÓƒò0>1~Ü¡)q»n`˜€áï#3¹bÇE´pî™ïþ\DÁÂ]Ó65î"öçq5A‡aEQ¯×[]]e÷ÀyžgYFDl|¾í¶Û>üá/..‡Ã·½ímÍf³V«Õjµ/|á ó7sæÌ™K/½ôGôGOž<ÉÒmGŽ™ŸŸÏó¼Ùˆ677ÿü–ëî{:íÞ%ÇŽ>ãı_ø…_`Ïî[ßúÖN§ƒˆ¿ø‹¿EÑÿñ³ªý÷ÿ÷Ÿüä'Ï;/ùË_ûÚ×^”—}ГÖ´OO6*˜'o³˳V­"Êš®F "C&3:Õ*'C@Ác§o¿ßït: ·` ½^¯Óé$IµZ¡wii騱c—]vÙñãÇëõú–¥Û9ÕÜeî¦<‹ÇËM»Z¯kB°Ë3·¥ŠfüýÅ`ø~@ï¬W¶:ß“ß`¾!.€` IDAT+óòcþ‹¾Hz½^Bˆùùy62û¾Ïñ·ÝvÛ­·Þúîw¿{uu•­Ç܇¯}íkò'ò†7¼á¦›núÄ'>ñ|à]ïz×UW]ÅaÒ.\ˆã¸ÑhŒFÝ>ÿùÏó[þû¥Å•ÿúÏ_ü/ñç·ÝvÛ /üwõzý–[nù­ßú­ n¹å–wÃ0ßšSYž GëëëlŽþÞw€•ƒ«¼êª«®¼üŠ7¼á ž¤ç¥*„€RHô@ ™2ÁÑaY;¸2¹/}¨µVF"cÈѤ@€(b¤iâýw@¬s[˜w?ƒÃ¬'ëvU™ýÉ‹X¦AÃDš¬½nívÉöÓýà¶SùI凕Uˆ+¥TlÏX;Ùámîœú§+¹7¸ÑòöN"ʲÌúQÀ±”¸µÇwÛsÌ©³­W–½¿"¸ÌZˆÈSÀqöð’0 9Ó÷î»ï¾üòËOž<Ùétêõú¹sçšÍæ_ýÕ_­¬¬Ü|óͽ^ï'ò'¿øÅ/~âŸøßù³gÏ^rÉ%l²€ ôÒ49ùÜgK/BA/xáó?÷ùÏÞ}÷·^ò¢ïóz½ÎÅì´ÖÍfóøÀÂÂÂ[ßúÖ^¯wõÕW_}õÕŸýìg_ýêWWF \3³lþÓÏ£Ýff´³;šº·éÆcÈ\ÝN»ø¤©á"5x±ÎýÝ];ž@¤HcQABJ4ÛÂ:k=O¿?7Ú#4Fƒço´7M¨$WIÞnoôû}!Äh”°õ‹îÌhÏó8D«ÛmAàq‚ÄæææÆÆWžªÕjÌÙ-DDív{8¶Ûí^¯÷Щ‡ççç~øáûï½ï¹Ï}n=®q܇‡V£Â2Ιˆ¼0„’oºîa…ìÀuµŠ1(kGo¡N‰A¸Kç0{õ&èäýS¯?®zae{o¯£ã„ŸûéD¶L ÿi×€{ÅEÐǃ¡oϬ·±%ìá¹?üðáÇxà–n9»wmms„666:Î5×\Ã]ʲìYÏzÖ—¿üeöøv:"RJåy®T $´6q-H’d˜ Nœ8q×]w1Þƒ³§8¤Ûínll\yå•ÝnWkÝh4Ž?~Çwlnn6›Í ˜GðÏ•RO»…¶Oÿ&ˆˆ8,‰J=Uk­Àˆ8¢u>£ @EY®ºÝnîÉ|”©$ïõ:¶ µRŠ]ºY–i,üµ9·ü¡(ÀXQ±©ynnneiy~~>‚N§³¶¶vþüù‡zèÔ©SÊÖúÌ™3Ýv'Ë2‰‚üœ4׳´ùHK% Ò&ÎD ÊÀiV5ÀQª&xÏsPùüdàY¾á¼f¥3O'ž]å¾ãöºþÞèQ¸"ÉMz‹·ùí6tå•W>ôÐCGýÙŸýÙßýÝßý½ßû½w¼ã«««DäyÞúúz¯×[ZZJÓ”C”8Ðï÷Ï;wÅW°ÿ˜«ß,,,䙎¢`8+ÖívÛ‚Â,€X)uöìÙn·{äÈ)åòòr·Ûm4 ½^C½²,ã]ï¶Oûô” `¥Ô6L´; ˜ CD¤´J’$AȆ©JŠò¶•½=KS(íÕºô#€ÇIGY–q²ïÜÜÜáÇ9rôðŽºâz=kkk>øàƒ>xîÂÚææf»ÝnolQ¿ßg#aP‹|ß‚ C›z$„ ñr!›m–±ã¶M"ÜcúÐ$³þþ‘p[o49YWV¨Ø9ŸÆ4UýµbGÃ¥‹ûôÊg+ Vì(bütÎ=Ó… hÆ/ýÒ/ýõ_ÿõ»ßýîŸø‰Ÿxõ«_ÍYüŽI’ÔëuÞ¡H’¤Óé,//³‡ :Î\káöÛÿë—þå«÷ÝwŸ}îÜ™g>ó™¼Ã€m½OníÓŸþôg>ó"ÊóÜ/‰Ê8óÊy£û´OO9bì°Ÿ‹ªP¤ÍŒ;{¥Oç3ˆˆ€B‰ ¥”žç¡DÚ÷ý°$[ŽC¾MµçýÅ ýE6Wä*ö±¹¹¹“'O.,,ð­ÕjœÈÖ#†^îU’$DT«Õî¸ãŽ÷¿ÿý¯{ýú§zn¡õ—ù‘¯ýëÖÌ%œ“Ê„gÏž=tèÐ7Þøú׿ž_MJ™çyš¦¬"³ðΰíyžy|·Ý>íÓJ³ÝL³úlǂ²V«¾§Ce2M¤³,‹¢¨ÕjA`#?ØÀ\€±”¬(Aà5›M*KÈÎÍÍ=IÈî)ã‰é€:˽‚Aõz]6ê:UÊË»Ý631¶`±uÙ:tDY¹Ù*Ÿ¢V«ÍÍÍ----//8pàСC‡^=¸º±±±±±Ñëõ€9}ߟŸŸ¿ôÒKŸóœçDQ4??¿´´´²²Òh4jµšïûçùh4 ý~ss³Óéôûý$I¸LSžç\÷CÍ = :Œ§÷À£iœå¹Û÷gû*–€©ÝÛakO9š"{9Ÿ'­#k¾Ü_MmáQÛÜ›I|0(¥æççï»ï¾sçÎÕëõ{î¹ç®»îzö³Ÿ$I­V»ñÆÏž=û•¯|essóK_úÒéÓ§üÇœÍάÚrìt§Ó¹îºëî¾ûîõõu¥ÔÇ?þqß÷ٳà êy‹Ñœ¥”zãß(¥¼õÖ[ï¿ÿ~cÌ™3gî¾ûn>ŒX)ÅÜÁž¹OûôÔ"—ó[´ãŠÈSi?Ù†ÏØö¡,3Eã$‘Àý'% ¯Q«såØz½Ž¡4jõÑp jµF­•®{,à Œ!„áÇþ)òšíЦ2ÁäñVÖ°Yé¹­c·ŠÛŽ[ÚÅ}£JaÕÉþT¨’7¼“ñç6¡ŽÊ%«ŽÏÒJ;\ØùÂ… sss§NúÃ?üÃN§sæÌ™_ýÕ_ýò—¿üÕ¯~õüùóq¿æ5¯yéK_Ê6¤k¯½öïxÇç>÷¹OúÓ­Vëmo{Û‰'¸ô \ˆˆõz=M†¯|å<ðлó]|ùË_ù?¼ùçn½õVDìv»Bˆ›o¾ùãÿøk_ûÚç=ïyoyË[Ž=zÅWüÆoüÆç?ÿùßýÝßUJ=zôàÁƒ¿ò+¿Â½uÜ÷ýYù‘»%³3gòÎç¥rÿ,ÚƒLö¡Ç4/{–àãxîÙˆµÛ§ÊÌ5êƒÁF½H!², <Ñ ¥*• ‹,ΰôÌèfn Ié)¥F&…Z¥£¡”H ­R• !jAŒ‘@‚!(„ЩÂ?þãdYÆÕ樂'Nœ¸òÊ+=Ïëtz0.>°­Xú[ñS¶l!mÌÌ÷`Ô/tm¶ÂKÉ_µ¨Î–m)%Û·‰H)Eh |Ñ‹_ôþïï÷}?O§O^4FàbÆ$hUÇ"\Ùþv›§Tvð“×+Xõ¨ý|Tmlòq»à©€7ùÐY츀qÅwê\LFoÀ³^·ã²V$6ÏZÞ€/ù¢ååå8Žï½÷ÞC‡qçcÇŽ=üðÜp?ù„"އ Ã0Ïó^¯Ç@«”š››ãru'NœxðÁ›Íf¯×k5ë­VëôéÓµ¸ˆƒÁhyyymmmåà2ÛœÜM å9ßyž‡C"â¤Ö§gîh‡À9‹vË ÷ÌÐwH;lrÏ>ÐþbÑî ¡TèéÀÚÔ£8MD”RþÒÿüË·~ì£$*pw®ËvvE¹Ðž^îyŸúÿþ1—"Kó¤; {Bˆ8ŽkµZ–ixè»ïn…x/‚8Žçççùt£V«%„ÈóÜÚœ]v ã³>9~ ßó¸¾<‡_'IÂû߀¦Ò7Ìf 8e|'çþAÀOå™MV1òŒ Äöû}ß÷£(ÚØØà,^x\[[òÞ£éòòòÙ³gm^¯”2Žc†sÈð<Ëc!¢-ƒ³Oûô¨´CEeÏí\,BD6Ö•RqÜP:·(c­q8;˜fV?% Æ€H„D¨Qä€Ð+ÿq£e.혔Æä…aÇq³Ù´éCZë$IÂ0‡ÇYbNä&3$ÛØ Vj9HDk퇗ìá¸hëý5Šø &¾3Š¢8Žƒ @¹¥¤º‰ŒyF¾Ï´[Í ¢ÒxV’«ÇW2¾w‚ +íp²&û9UžE³n¶rÉ6ZûNÈöí;Ï4Kî×ëZëápˆˆišr’þ… 8B²ßïÏÍͱÿ•÷ˆ1†F1ùX”¥¥¥N§†a£ÑÐZs°•ÖºG,q†‰ïûËËË£Ñh}}|°U8X½žŸŸç8gŽÌìv»|6C½^ϲljÿ÷6n;±}Ú§Çx…‡A¾ïs"PEÊgïÒÞÚGDA$ 4` B’ % ¤¤Âò$P Ã0?½#GŽÔjµz½Î54†M´O‚ viíZ[¯aåš‘•ˆ„‡Ö4¦i’$ Ã|\ —Æ­×ëqK_!¸T}Çü! ÃÇ;ø©N®5½ò„=—ÿ|Ô=)+TÄÏv»‚¾®VjÑw|î&±|çãÌæŸ(ŠXrm4ý~ŸíÀv5n·‹ˆœ,VÆeÕp8lµZZëÁ`Ðl6WWW‘Ã&8ŸØ÷}­5G;² j4W£e0æÎp$—ïû*y>½ß>íÓS”¤”y®Ø€ÊÂe¼*Z%ÛÙ!Ù6ø‡ À±öVã`¿å{Bïøñãl"côðÀ«««RÊ,ÏX+…ñ¼Mã³úi€4õõ[”Dá Ç8-gQ‚k‚f×”RŠÿfC1–Èoµ[6¡æoí ˆmò=ßáH«Z­Æ)ÂJ©,É™×pÚÛÙ”R(Á÷ý#GŽüë¿þëå—_ž›œùÅîÆþÉG»]@Êâ+Bœ[Aì V‚+´[ô¼è¾Å6¯°½qø1¾û¬ÑžÔ€a["Žc1mFŸbyy»Ý.C/[z‚ F,þ²(Ì Èdaa¡Ûí&IÂj+[1É®ÿ,¥Œ¢È÷Ã<ÏÏž=[kÄY– ‡C†y«=³òÍq|©çyìxz,Ã59Pû´OßGrËÿË¿üËÉ“'ygÙ…ô¼ )$DDÈ„‰’@ƒÅ‡¢aD¨älì.¼Å ~V[ϲ, C* JeÙ*îW`ËÝ™êæ‡iS¤ö²NÌQZZ뢢°VL)öóNÚÙsvBøwq}·s65³öéû~»Ý.ʧ›ò=È#9öê®»îúé·ü¬RÊ‹BWC÷Æ:€4i >.—†ò?.÷HD( ôäÏ^Õò\{^Ç5ߌþGNF "rˆ²Öš4HÏ3ʰe¸(«Á1w?  Pé' …”à#ç>1üsŸ4M• :Î7Þø¹Ï}îïÿñÿ}Å+^áÇ2$éH1ÿâ.v33_›MÆ{{p,±õŸ³+Cùÿ³÷®A–]WaðZ{Ÿsß}o÷cA:˜<®¯ Åç ¾.bÆ ŸB¨ÂÕ,#xnv !üJsPkPfG#VÜ>èOÅ>´Ö"ÊÐæë®4yUCósE GUÌá#CEת®LÅXûÉùC…_xf;>*Þ‚Í“Úé=\Ü?ÌOÙèßf\ä= ÎÿËkD€½þ~Ç£ñøãÿøOþÔ?ÞÜܼåe/ÛØØ`ïžëù®>’ÅH&%nnðäsœ€ÞEQµZ-;˜ ²:Zˆ"²¬ ¾F:xF[zút½6:¢7EQ½^w”F£W½êUívûž{îyç;ßùOÿé?m·Ûû»}ö—à8—ãñ8Žã'N¤iª9,MŠÂæLñÀ‰rñH> ÊKs¾KQS>Ô2œ&! D7yïóˆKçm¢R‹â"÷Þ&´ç­Z NZ@D‹¨X,Û:Ìn©´^Å9êaêËOÚ_¥X^‡×Ęw¯_ ÓAy:zÊU29ØzQ¸žâ:K¦ÿœ%‰ô_/3TËt ²O*æ0Š,Zo¬÷) ‡!¢,MRc$ôXó6tÞ§H­zã EFšó-H´2Ѝ‚`@E|[qolT:.Âå÷qleºôª¥éLêÑÛ2M(;¬ŠÚ­¢¾3RŬ´g(¥LÌf3XœÏ¼ÏUM®¯9 ™"TMEÕ~«2Œ¯"ÀA=öfO“Œá$^éUãâ Ma¯åd:}ú‰'žø÷ïþÿößþÛ<ðÀh:FZ¶$"¨ÞÅ„ïyÔ|°ˆ•¼`h~ ØnCkûR—ÁyWsüÎD˜ç"â ŠˆÒ< »ÑøB~Òœ~Ð?ZÔð‡!*Y`…ÏræÓ^¯÷å/¹Ùl¾å-oét:¿ø‹¿ø=ßó=oþž¿3™Ló²êÛ9ǢɌ镃2)±ÊP€å%RÜ@šXÊ'¬§ &D—Ô»„‹ 79SByø™Ý°\ÜJCí7(.¤¸@¨dÊ`±‚b ¶¬L P ¦j2L]m)èÅ„«'ASSÊ5· zZôTHš_Á£#"¬.,*3C½x]hæ•#» \t7,"zZ”¤ƒ÷UëDÆùÌZç]šyˆÀ¢'7ë4ê&†Ddj`œ÷@éòðJZ |ž¯.íéŽU1Þ—L¸9XrÕÛ†ç­êNš v±WìK]„*ZUÿt:-}_E¨$^‚ô BÈ‹ ¸PÍ—3 šÑP•О‘2à©mYŒYTÌäe$i®þ–0¹q’\`%I’¦éïô?øÁ>øàƒïø¿f8cvww×××Çã’õÅcé%4 @°l„äyçù\b!q¡ ´€$H@%íI§…–hÒ%QÍl´r–Qíúúú¾ð"âðÔ¯ýëï¸ãŽ|à~î/¾á¾áÞ{ï=þ¼÷žc Û ‘N#J! ’U“(ùVSJ׋|†þÊç9Ì)¿ Ö¨YãbýR: üÀNœ¤¤ÜsæB„%’¶$r™¬_+7B°Ë¥† 0ˆ]ž®M*ÑÄr·¸î°xû(³![HÓQÈ5škš-åI1¼µ˜_&%ˆkE¨kZNT@‹Êèe¢œÿX"†$—€¹“R¡0RÅɇ5Ò¿êÀQbl›šAS·©¨àfSš%E˜&žÁyŸ5jíÒùg[Íbª+Î>#<ßzŸCAUx0@[¾Lt°iõ¹+Ñ{L/%¿ëµ#ÑŽrýÖÏ“säÁ·U çJn1¤oZÖäbAÀ5½ú*;)ÝãÐâˆÈîm²²²š2çGªâÜ! 3p–Ûb‰U.ñyæMžíZ£.ñÒ1gÝ¢(Jr­gsÓýFÆ"{@31&ÖÛÖ3À„\-‚x6Mvwšµ¦k·FÆÌƒñÔB‹¥nê]¤÷ª€ƒ…= í†iäUE IDATwÃvAÒ=˜¯{òãÞ=ÏûOPià´ÈE5(`g"r. z^잦Uw‡bŒ&ox¶%VPJ)dSÕå«eª Uÿ±@Ï$Í5+å|u W9úß*H•ÄÌVC£f#\¯ÄqX?WX%ÁÏf³µµµV«Å÷’«««wß}÷k^óš¾óM,;Õëõáp¸ººú•¯|åæ›o§ˆÈYѱÂÊWKY¥í&˜ÕÀ€Ç íïòcçfã)&4u3Ê¥GAG0KV3k-Z­V‹‘CSñŽd§ Ê“³"òÝÉHi˜‹¡ ~ñÊ\(˜S=ZY¼Z­ÆQØWòÙgŸív»ÓéôÁ4Æ´ÛíÕÕÕv»ÍT“ÅG³‚@)×Åcn®ÃaÊìÔëu¦è B€%«54U3y^eî<_œ3 ™L&\?¶y.dÌËfªÀÔ‹U^Ì0P«Õ8,Ãp8ì÷û" pç;Ý;“6Ik4íf‹1>qÐ1nE¬ÛtJf9$¦â¦YæP‚¥p…¼{˜øÓt®ià!ËÀg³ ,’M‘±tÊ ˆmP²ô€ñÒÄÃyòÞų̂ Hî<å÷…„‘•Zæç2—" AãÉ›Üçmd‰ˆ€Î¦läb­õ`2à)óÖQ„ÙÁ…t½^ϲŒezĹýT  F c½É2n7Ë2J¦éh4òÞw»Ýn·+—¸DèœÈÊó9ærŸ£µÌf³$›¥.™¥SÞ“V=I’Étì½·™‰¼E³É”ˆšÍf³ÕC™Oã,2Q‹ ìG“!ÏÛx:j4NÇÆ&óóÝ‚ˆW™Ã;³À †µAÙd’&ÉÔûŒE²ZT‡œ‹b‹ïtˆ‘ðˆÄ›—Èe™ó–LòàL®×'5¬Ù,¦Zc`†íF­–ôžœ8o¯5­Í¤NPB-ÎwšÆÆ—ÍŒAƒ›TžX Eq,ñ±â—è ÀÙÁ¸ƒ;?D¥BwD²Ôe™Ë2G?°àx0Û¹ø.]%ô¢‰âž0eÒÖCš f%-?K€ °wž£3gÃ4›åi½(\•¨"Œ9†EÞÕ's7eþ‰Emæ3˜óhµZ­VK¬5Ó¦‡l6É»¥'YúÀ|ºŒEØGQ”qg¸W¢0¹O" bB¥x$"« \žò+Ë2‹å—Ðs¹„UÙ]zŽ8—£ kÑ’"EÆ:k­u ?Ÿ‘»`F­HX‚tˆæ™[OtÏõq¶‚ó¢+—_‹Ø è*O³hÜ'k‹¸Íô® rôJûÀó_ú¡F_ÁX®-\§jõ*,®Èõ¢WF…àL=t—Ä&ƒ¸ÜèUKYó¶@Íâü”Ñb™«]À•À’Ý+’#VΣeqÀ,BˆüqƧív»Ó鬬¬pj½½=k-Ó]Æøó$ ¹3±'Öª8£¢šÅ³,^ñO“è`L4W%Á|EµñœµÖbhl¢Ï¹¾aI%óª "7“R¹Ë¶“÷rD¥ y&e±Ì]á•Uß#,A²LDE¢"å•„Š+×H™‹1ýãìu¬™ ˜«aeh®„¹¤$Ì-Y\³ÙD‘Š…{ï½6«g&Wà<žFîƒ÷ÞÆÆPÂá"¢15™vÈu¶Â91åc dÍyw‰j—u¿q#΄hiDL¹ÁŽ^ Ræv¤®Zù¯{AÙÙ‰öXäuž ¶à›ÍfE6O»+Kà ͡Ry’yÒÕâÁÊr—Ü"èÝ‹ˆ¼/´ˆˆ¤†l,Xk Á^°ˆIa1B»Ð!–ìõAÁ}ù·™„ Ô/u3â½'{°ZzËù™…›W@³€+¤N]FÎ(ÿQ©¥¼TBs£¤ƒÀ)ų¬k@7Êßc/ýV}umèe0ùx­i’"ïyÒ‡#:p^µùÜ|d¡-8xflÊ:öÕTFƒ5}qóä à zOd0úèG?Ê7”+++kkk§OŸ>{öì‰'²,á4…|ÏÇ&'Óé´ßÖj5žMF¦¬R³q¸ 0Ç;:ص´Hƒå™µ»làÃxPJ2¾´hŒA8*(!OQŸÛ+…˯ÐWÁ‰t…¸ˆÅŠÇ>Ø‹Œ¼g2 V'2?rñƈOLp!§Žr9jóŠ"X³i.«(X‡Ì~oŽ2®‡õœ˜ãÄn§§[‘Å1Å4ßÊöwâbò[v–ü˜Kð¹¯Û^yï™»ÜâL¦ÂZäîi"‡9Qd®Ùà€I&ä$œUÁy*‘3Ñc‹Ô%»\ãaM~M€¹²°’sGžš^jfNT´ñÌY"ât:Ó0–hy ¬bH]âó¤&>7©sÎ9s2sófWí\~0¢œžšÜDÜ‘÷ÉBò qøæbý¯µ±hM|et7…‹bb@€Y勊’Úôlpö#Œ)”>æ¤øŒ¢ž÷ sE—Ô,}ÂØ’GA!wì¼. µRfåB€'¯y+%[H5ò¯À'ÍäF-¤„A>sMO„‘³PnÜMz_r¨ê ´`“CÈÄ(Ý-Ç¢ %à?øƒ?¨×ë½^ïäÉ“'Nœ8uêÔ¹sçÖ××[­¹'.ŠÏ?¿ÁÛºÑhœ?žíu³,³î ÀÖ¡[â4¹d *KŸùK3Ëj‚¼;°²ÖÇS,˜Ñ(ÍÁ™­ßeâê D¦÷W÷Ù¬y¥B±d:?¥Þ;© "Zœ;°9"G>ËÀYamÕxs ò \Ý-Ïç{U÷ß %šgE)e•ƒ>TE† º$-js]z@°IyÄÉÎÔtBYMKtë|¬'g^„ý¼æ4X«WùzƒY4Í F-€Jc¡ß Ò4€ÒDzñ•0ù]>¢É÷¬1h+Ø‹k>«TMì’v1w5+Ž=<꼃šRDŒ.^¼ìüÓívOŸ>}þüùsçέ®v{½^¯×\Œ‰ˆH´šs±ÉÌ­Üǀł‚"†Ÿ_ÎioW=AÜâ\¼pi! €ükTÄAA‹¢“„ü0‹’¤74>*¢!} 5 ÀÑèC"Ÿ‹3 åL·è¹?B€¥Î8޳,kÖ[6Ë­¥¹5äËl`E“Ù˜‡#ì'ÓÅÙlfrÓ\é3ä‘e0÷%ótà%"zŽHEùæa6›I"¹Êe]{‰^z~'D2bÚ̪l$#Nb|Ìœû•ÊI¶Özˆ`.y µ‘r>€'Öä¶î"ñ›\+Îá\dæµçÏp8A™ëçjkQÝæ‰7x±˜ök'7Y)ÍöÉ”ês(I@ÎE‘óœ¦>Šœw΀G²3ÏvþbJ  RÒê]QÜðK>qÂvÅ•bùÑ8P>i|"7iÝUp «^ 5¥Å°¸º-\ êÃ2 XÑ/v`ÉœäÍU9è®Î›¸võç•‹V`a3„ô£0vÁxòF8`ÍÉÞàÂÆ2Cc8ý¼ ,Ìü5ç5űE°P‰y”“3c Ì{ñ@9~»aßd2ÙÙÙÙÚÚÚÙÙ¹téÒÙ³79sæ–[n9qâ;5@’$«««”‡>oµZŒ˜¬µI6 ^ŒˆˆdŒºÅÔ;X†~¯5®6kŠ€1¦;ȉÕƒí‚ڂC+âæò¢`)æoˆ¡ Ù±I*J e3aTë½gFì€$˜ƒÔÉt×bÔétòMåçÂ"dCÒ„'Üå9‚d\“É„YõIöÞ‹ ¸Í}…3Nyû'dsc.¯€ˆ$>(æ1@˜¡aÓeÞ ,‚û<ˆÏòÓ`"ªEuNÏDKn7¼ÏD­‚ùõ„ÓÉž¡üŽßQf]†XÊö‹+¿#6Ë’­E‡ ét:¼áÅëš§3øb®gæëÞ“ÂÓÒžSN}ºçò¶Éö LWæ²(¥4ËÐùùù†\s£ñª$òžò‹–²Éua]a)•gŽÔ“å™Åuï=¿ƒ/ûPoHPÔ´ˆ(tù€™Ðc™¸ØmýUi2¬¿âÉñ.ìU^‚®22´ça t®aåü€x@‰ù_M‹Ÿhªq¸“σ%ö¹ÊŠI/¡90æ0‹±c±B ~ÑàðsŽˆ›Lm¶¹Œ„&bŒ`970 !ˆ„‚²àÕï÷ûýþ3Ïœ¹òˆx1.\¾hUZ¾ê}š¦ÕÀ{¿¾¾~çw¾ò•¯¼ÿÁï¬Eñt:]YéeY4Á``-¢÷„œ‰€å-TWczhX &B3þl#&ˆ>uiJ«½^E`EKç½oÔëF‡:F4Öz碻îºkkkkss3™¥Þe€jµÚl’ ƒÁ`À!677oºé¦sçέ\=wî\½^ïv»q@š¥qcÎËóí¬vÇÄ\ªˆs°ÖŠ?..^G4,-õz½gžyfeeå3ŸùÌ>ðÕkwÞyç›ßüæó·¼ ÓYÂÚÂÌmÃç⇚ƒ¢Os¥ ,Kn#¡Cò¬ÑkU?åW_\•¢x†Hea Ê”`¹û„E\œ"éO0FþŠÁ ~Ÿ{TƒÒïÁR¬‰:T½ª¾é!ˆ,^2©_ôKº¡'SO©¾<»<0”!ÍÒñ–¾?6hãH€«öóQû_œ®|6®Mz¾ã1¥¸õHPµo«q_•¸þˆ8ü\:_:ôˆ ùuý¾j? ºêXù<°{jÉ{Æ8FÄÉdâ½çÛº‹/~ö³Ÿýð‡?ük¿ù¾ù/ÿåk^óšÁ``ŒiÆÍ½½=Ž«¨O®€_´¾–ç¨b·$É,cÁrÌ5ç½ËC}É•™(>½÷Þå#åèÓbüñÿøÇ766žyæ™ÍÍÍÁ`0=ûö°ù++H ÙlÞzë­÷|Óë¾á¾áÔ©S/{ÙËî¿ÿþf³Ùï÷[­»sȦÜç15ÕÊ@®–çËæ ë%såäp8‡¿ñ¿ñÐCýàþàw|×wÎE"@k-_hQ§y ‰õãâ5ž½]® Ò„”/•ô3)e{p#„<èM¬KG-#Òô¦HàK]­®AÏž®Ê(«Èªƒ]UÏQç9¨GªÒ’´ôMw²8®ª¶J¹"µ^¾O–¼/ö ®?¾VPº]€*)̵!ÀWåÌIƒ¯Ù¼™Šõ½Îp•æïHó³ªÊW2XURþõ!ÑiÕºˆ|"·~|:>ù™O½ç=ïùáþá·½íÿ"¢8ª[k¯\¹ÒZ锢DAõjDP™¤d’Mëh-X×þàO“ŸŽ§8óqlçah›MvU˜ì³AÎyD¯{ÝëvvvΟ?¿µµµ½½}ùòåçŸ~gg§7D;Z«ÕØPë‰'žøüŸ¿é¦õõõõ¿õ·þÖm·ÝvæÌÆl®Òh4ГŸ;§:7 ´Ý2?Û<æ­ÈÄb´Õï÷×××ÙÄúýïÿ'?ùÉŸø‰Ÿø–où–Áh8GÇjºs6>šŠ¯ŠC—Oh1ôš05ÁÜ•ÀWA€måAX§ª Á\Z¤:”«¬KI…&ÀúMÐytÌ/9t»ºŒtÞ+»Öª êzÎaqª‹ÓÕªNX<ÒÁ<”®HqK@¢9 †*ÎÏ!ñZÐù€úÂâAeúg8¦"ôbª «@3XºÎë­‚>ä<_µX«”t+ÊU£PG%K4LË? \•ÐQEµ1œ½bPtG݇ì£oÅ‹2ïöëïûæÞJ÷Ýï~w«ÕùøZŒ»ýýÞ‰56„”†ŠÃ9ä÷SâëaÉă´yØzžÇf½Õï÷WWWçw~çßý»÷S?õS.\ &šKÉY’&IbÑ´Z­f³9š”ý¿ª„ÁP\ï€C«.¼d'ù¬"ŽT>c]2¸âÕ5hÉO¾ÕW¡AÓ¥8(¯[/ªÒ]Ë·n®tN®ªòÒ•ƒºS/þ€îž‡€Y jÐq)Ë<­@Ó«"Tͳ˜×‰2É{Ÿ¦©HÀ„–=8*4 Ž»‰;‰Ö8çööö~îÿùùò3ïøÖ7Þ¿²Ú›L&EM.j‚¡Uu/ƒÌ:òA½ñGŸýtjÌx8ÎÆ‰ ‡•Ó×9^ÍÓk’ztþüy&·h<oooïíímoí°WÒÓO?ýØcmllpÃl´e­Œ§Æ˜ 1xêÔ)n¸Õj15• }b~ÅfYb¹êU´¶¤µÖ’ƒÕÕÕ/ùË¿ýÛ¿ý£?ú£·ß~;wí<3k=®µÛm˜$É`0h¶[GZ°RÐ Ùd&·¬%`^•«"Р•¢üº¼WóŸe8 $•*8(©ï&õ·iÇ‚VÕWUC@w^×_U¾ª¶%±tž—¼bç‹ÜüZ¼[ÎZ•J®Çàè¥~½'QEt¢j ÀxpÇ“€Š¾ÿ«úó"© —”9LýUPYg…ê²JÕ\©š.‹æ ÕwÌUpÕóž«2Ž…òåëXÕÏÊ;ò#24{{{Fcmm 8;™Ó§O÷ûý·|ÿüþÝ{ï¹ÏÄ™È^U„8Ì>1Æ!@kуÆZ µ,ØZlkqT¯-ØýH„ÄyÊ9ºŽK®.Ï-¸¾¾>c[ÛÜÜÜÞÞÞÚÚºpá•+W666ž}öÙç7.îD«Õ’P»»»lºÜjµ81»ŸBî¢Ê!X5Í¡šã 1¶Ö&˜îåð߸ܱz½^kÌý}³$N§°V«µÛí´BÅQµ`­¼~h ªz]²BEB%Riù"T‹Ô¥xW±¤¥”O†ÓE\ì³ ©¤Š0•ã!î€Kë)²U“S¬Dw²ˆ8‚‚¦õ<èÙÖ3 û/ëÅú—KËW­¯«È+›h #[„ªyæX÷ý~jµZ³ÙäΓó—/mœ¿åeµ¸ñ?ÿ×<öØcßxçÝn—í™ j«2wé>Tγ¥:ZDL\6FÎ%“™ÉÀ£_\}mAFóç¬ @0O™7NÙb¹Õj­­­õz=$ÃlE¿ßþùçG£Ñ`0¸xñâ_?ýÔSO=õä“O>ñûPræWVÁM&“ñxÌ:ÎMÛétØÌJ°Á>÷|uy—0æÊ IDAT´dkm-kí{ßûÞoù–o9{öìææ&çbâ˜Ù(nÄŽ<»ØvW{7¿ì–étÊ6ÒW6·ž|òÉçŸþ™gžiÖ[ä ŽãÝÝÝz³9F £Ñ¨Ùl¶Ûí,I»jcšõFdl’$ÐÆétДĸ6+ISÄÌ7üd2ùÒ_ñû¿ÿû÷öö:­Hg)"DÆÆv~ŒS—!"2eË:-1‚Xrõ ÿ« ƒæþª6J‘„ •Ï5ÿTUuŠd#h·ø>0%+–×/—W[Ú=±Ó.Ö §N~-rú'Z “¢©¸|"&`r¨ÆKóAÓüUÕÝ­¶B×½D\53Ť<:‡÷žcJ7 æÄYëÓét†Ãa’$Ýn·ètXžçÇy¢$D@D †È‘ó®^¯sÉ'NdY¶»»»¶¶æ½¯ÕjkkkÆæžY•ep B^z¾8¤èõƒkÅ@,9×¥VÎ)/Uå«óâTñþØpÔy«._a¼VÅXT0UóYÕ®„•Ü ‚˜ Ùlúýûßø­ÿö]¿Dà<8Hê$ çC§¨ºJȲ$õ@†¢è¹‹§@É,5ãFàÚÚkSþzƒÉ£×±òUL(–ø•”VHö„àÐSæ\’$#ŸeÓÔxœ¦S&”œzUè ,æN•D,¼Ób%H²T¨/"²zÝZ›%é‰'Ö××_ùÊWcz½4 6u2ÌfÏãሢ8¹a»Ýæ|à‘íÂ9¸´÷Þ%Y’$Óétž*.]HÁ{ÈYû*ÃÓ›€/)Y:üc¶#Õ_õ â¾ÑqM‹¹/M‘:å'¸Ö%õ³p¾ÁXJ©ï1€ÅtŽÏ%™:Nš¦£ÑÈ{ßétØeã_ŠË–ò1:09SÙl6k6›Ü‡“'Ož={vgg¬µý~¿ÓépÈ—cð ŽŠ¾®áѾ&PÕÿ¯¶~Ú<0¾¤{qÎqàîRiç¨ý÷ˆÉ°÷©ËÒ,M“Äx䬿ÆZ4Æ©0éFcWVå¢6ÆDÌxCXkíÄç•×È!£±Ýn'IÒëõØK¸Þ¬M§ÓñxÌÖÔ ³Ù̢ɲŒâëa¾Žã:åÙå8Ž dY–ù”3á° œ¸y¨jÆJ׃"hèP%.)¤¨|_4(•_—p´x…)B¤iñ.ù0}(Cõv…CËT ëEÝiЫ€<$°Ô;™Lf³Y£ÑÇì20NŸ>=8Ôt:ÝÜÜÂkkkW®\©ºË¼7àkP™}0ÍrÎaT’^¯ôÏ«¾gê ¸ yG“Ç• ®{Å&@”Ä,£G¬C•hSœ‚øæÜ#ó.2Ö9Ç_±…'ß`Õ=vÌe_£Ùl6&“Il#É_ÄXŒ‰êõ¦8P³¨ÎQ·<¸8ŽY9ÆýÉm>Ý!§ìØp<ªP„#‘^ÖƒâK+<žv÷¨ ÜL¢‚_¡p³[JÌäÃåÊ'Ëéýaj«RA—vO3 Wqx¨×ë»»»q÷z="bï@Î1›Í&“ ¿ïv»l±ÈöœË»wÈv™ÙuÎýʯüÊh4úÙŸýY"â u¿÷{¿÷_ÿë=yòd’$?ÿó?¿¾¾^u|nÀ×(0…¢ôÖ·¾õ›¿ù›ñäÉ“[[[œoô\ox©TÐGUU"¼ÞpŒy`Ä"ù1ã8öH%ðÒA•·GÆdžˆb4­ZÝDñÔ#ùÌ£‰ÁXÖƒq6sµ<6á‚ Çc1C1EOçÙo$Ì$ÿ霫ÕjÀ*bþ·Õj¥.1ÆÔëuV)7›MÎ"<Ž˜TK˜èñxœ¦©÷Àg^âP²Ñv’y–}¹-“' Ôƒ1UÐÇ>GýðtHlÜ躥]šcn²‹7²°T¬,>F.V(dòëUÅßL€ÈñÁ0M»ÝîW¾ò•§žzêÛ¾íÛî¸ãŽáph­=sæÌæææc=ÖjµN:eŒaã‰c·RÑ`0X[[û¹Ÿû¹ýý}¸råJ§Óyî¹çö÷÷¿÷{¿wgg'Š¢­­­µµ5N³xnÀ×`ÅgH½3p!T®ªGÑ y_¯5NõÖ2cÒæ,¦YDœï€ãJ bÔ XE 3ÝLG!W8‹ý3#Q2¬µ™óŒ/d,ìJ|ÈM®9&u=®ñE›VM§S–³ƒ«—½Ê:gŒáÛ_A¯bÀØ–¯.8ûVú^Ô/²á )7ÒŸ Xñ[y~!«F…kò fTÎ͈SQ¢-e}´âG3|W‘Àh4ºýöÛ?õ©O}üã?wî\«ÕÚÝÝm·Û¿þë¿>No½õVVqá^¯7–ú`­eý6_ú°(pòäÉ,Ë666n¹å–½½=¶L9sæÌåË—ÅúúÜ€¯œ$ ßËÖj5ÊÒÈÄG""•Øz„Æíö©Õ5¬×“i’’$&ޝ,™d…î ÒùÔ£ñt„3$"I‡gñÚÚZÓÔ™42½¬×[è*Ë2˜ÀÊÊ ×ku”ypµ¨ÀÙÄÉZcmdãÈbdŒi¶[lÅ—^“É„c^NfcB_OëívÛÆ&¶±'o­e" œbÝÍ“®ÒHäªZ$Ø øãŒ"a(Õ—.©_Ó‘5E_ŠêÂUøž#m¬¢»mU7´¤+•‹§â-‘w´K*[‘Ž”Rœ7Muýò²jŸˆvG˜PÞØÒ=·X½¬‹î€ž½â¬ôº_yþâm¯¼ýá?ùäw?ø=Q-n¶[Ï<÷ì_ýÕ_­¯¯O&"bˆÿðþã>ÊÞÀ÷Þ{ïÛÞö6ÇùŸøÄoþæoÀ=÷ÜóÀ¼ï}ï{×»Þ•¦)`ô3?ó3ÿâ_ü‹¿ú«Ï?üðÃO<ñäúúúý÷ßÿ½ßûfvóýÃ?üÃÿößþÛ©S§þÕ¿úWιøÿál6kµZ?þã?n­}×»ÞõÎw¾óu¯{Ýÿð³`«ÕúÄ'>ñ¿ñ¿üË¿Ül6‹º‡Ãœˆbù*†òšˆûK:pÈúŠ7JÑÅ ª~Ô”–<êxu ý©ª¿ªžkÓn•?ñQçÙ¡1I’ðNš¦026"d¡Ž‹ ‚õ»  ŸXBKµz}æÜËo»u˜$Q6N²Døl4| í½74:Æ÷°‚‚¢Éd"–Ñ +œYÏ,θÒWV Kï ò´}‹ó/û€…c–žEÕœ¦)[²$!b»Ýæb>Oÿ@DpüÍ_r¨Ú@G:0Ëw!-^$5Tᚪ.i«[?*Ö.’:ý\¤¥ÕVI¨T¸e¯ªóª€G1ÖÛÛÛc·½ñxüñßõ]ßå½ÿÄ'>ñŠW¼â¶Ûn»xñâ`0èt:ˆxï½÷þÈüH½^ÿÜç>÷_þËi·Ûß÷}ß·¶¶6N?õ©Oýú¯ÿúßý»÷Ío~óŸþ韾÷½ïMÓtÿôéÓÓé¸ÛíþÚ¯ýZ»½òC?ôCwÞùÚ}ìcÿñ?þÇS§N¼ñol·Ûo|ãŸ~úéýýýV«5NÿÓúOïyÏ{ž{ýÙŸå°í­Vkss“¾r&ïÏ|æ3/ùËÛíöu¢Ž7à|­C¿qhDdÇze¾ºõÞ[@&ÀY–ñÃÜùˆ]ƒÄGˆµÄ,§r¤IÌUØŒÚÄP«ØÌ#‘‚ÈFì‰Å1¢»Ýn¯×[]]íõzìžÈ0¹¬+‘®Tù:¬ùõHµœòá§N/™~ïs¨úo;tNI1Á/n’¢UP¦ø^˸ú¡j–¨|žD†Y¬üšÃÚÚÚxÝl6766¼÷ûûûÛÛÛo}ë[ï¼óNkíwÜqûí·?üðÃD4Ož<Ùh4úý>[`p´vaÇq’$÷Ýwß§?ýiŽeŒI’äñÇ¿çž{ØnãzÌÉ ¸_PŠ· Œ­Gq=Šq­ךµz½V«Å1ÿW¯ÕêµZ³Ñh6¦Ýn7›Í8މˆ(_Ö29dÙXm ¹‚1p.b1Á¤žæW¼,U³eV«ÕZYYét:+++œ¹‰w ‡CÏlxÔã_…°œÐ.ÿ0xXGåW¢ôíª–ïBÁQÓTS÷1(ÕÔ·ôO,ð#Q_]Ã!g޲(Ãá­_ÿú×3m{òÉ'o¾ùæ³gÏv:¾¦Šãx2™4 ç\§ÓÙßßGDŽÒúÅ/~ñÞ{ïív»/^¼ùæ›ÏŸ?Ïú+öeêv»/ùËïºë®ñx|éÒ¥S§N>}z8²áñŽsnee…Ã}°ª‰Cå¼á ohµZO?ý4;+?÷ÜsDt×]wqlœpn@ªpTÀÙ:¶¢œ;wÎ97Ù„–9æWÇ|s&ÈB‹¹\‹÷ÉH?4Žë/®Er&á¬ë®×ë’’÷ð5ž&_ßBp)×où$KžœèʃÈPT溣!IT¬˜|x¤Öƒ>HŽZ.Ç1(®îUqz—ÔC4·ŠÌ²ìÇ~ìÇÞ÷¾÷9çÞþö·w:vçc!&Æ»»»·ß~ûÆÆkŒøÍþþ~Ekkk;;;gΜFì¡×ï÷Ïž=Ûïïõz=ïýc=¶¶¶Öl¶“$á[¬ìkm·Ûeßn·÷öö$%ß1×j5ÖŠ#â§?ýéÓ§O¯¯¯s"ÑB𠸇ƒÈÿ‘wÎç”Ø¢A"Oàiîì)b ACXæ‹X¶Ôbª‰ˆl€#™‹´TJ¹£q+!,Xq=ˆÈ„øJ8MSív¬QdQ™ùµU4¬jh¥D¯æEe7GêžžÿãM{À.¹?(Û'¾"ÛR‘(øRé¹´WUý<ÒH«äõRèt:I’\¹r^ÿú×ä#™ÍfwÝuW³ÙÜÜÜÔaq>ÿùÏ?ôÐCù—ÉtñܹsDÔn·www™U¢ˆ…Ôµµµýýýn·»··×lÖ···_õªWñAžLFüÕåËn8@’$‘@üs ÃZÛëõ¦Óé… žxâ‰v» ù—ùêW¿º8±7àÜÊãih)…ò°QÀa••Θm™Ìb~[DŒD‚aß!Ì/‡€ƒfJ;¹'«¶Äâ”u|EJiŒÑb7,^r)6ýà…\_%Â<ª5óÓqÁU©/Ã!¥O,3`&e |H7'q§<œ8.šÝ1*øö]-%ÛúAº­­C33f1 ¥Öf˜Ç†íímÞäDÄa§ˆ¨V«=ýôÓ7ÝtSš¦ý~ÿÔ©S?üðþÏÿùî»ïþ­ßú­ÍÍÍ~ðƒO<ñD¿ß?}ú4G¶é÷û«««;;;'Ož$¢ÝÝÝV«5yP|Óï÷WWOpx¾›ÇÜoŠõÏ’ Å{Ïîõ[[[Y–=ðÀögÆjðíííûî» ˆkò ¸7 !kZ±lÀ9ï3çÁF¤*çªÜnäR)“ë,Ë&“‰sŽýÙD™‘f‚Ù5HcÉbz,­‘†‚ŒÅ¤“´Û‰¯‹´fÎ5T%vþZ£JÀ‡/p­€”_¯6}ׄsÉ·¢2 Ràªõ,QA—*¡Œô~ž-ßÓQ¶t»]v”'¢^¯·³³Óét¦Óé™3gÆã1«yûýþã?n­}ûÛß¾¿¿Ï³ë–`mm-MÓÉdR¯×G£ÑóÏ?öìÙ~¿E'Þ¾|ùòl6;qâD–ùK—.­­­}å+ϲŒËŠ+Ä1’$aY™­±Nœ8Áq1§Óéç?ÿùýýý,Ë^ûÚ×rv𪤶7àü Qúü yð(&‘üf.$)zqÑ{ŠX@–l… ƒuÂìÍÉ&š”§vr©m ÏË¡SQZ€B(DHót®"QÁð‹Âh é3/æ¥tºØJ•ßs0´«Ô`>5›¢§‘r½‘ÏœÏ\»ÙjÔêý½ýV£iÑó|²8aQ·ÛÝßß¿å–[Ø'°ÝnéK_â@’qŸ9sÆ9÷È#üôOÿ4GÕ¸råJ»Ýæ‹¡•Ns2ÞtúL×'ã´Óm¯žèíö8è4<³~àa-ÇÛ‰ãx0° |Çw|ìc;qâĽ÷Þ»¿¿òäÉíím¾¨.‡ªùÑŠ*ÃP× Jçÿ0ª‘ª"»UŸÖ£ù³Vb•ÿz8ÿ-Ì(q9dWìðpmü}+!K-²êÔŒ§“f³y0&Bk À ¢!e®´ñýñb;óÎÆ ›¸¶‰‡4Kk¦n¢Y–Ùˆjõˆ½"Ìf™·€HóäFGŒM¿ß ý~¿ßïïçÐï÷9©QVqçÕ{½tu—o}-¶C.…³ûß@#"KTÌÈiò¿&€–BÕW¸xð;ðB>¿U Ùf‡ù—ÊÉdEûìîî®­­õûýn·ûì³Ï>úè£iš~ä#¹é¦› ×ë ‡ÃÑhôàƒcþûÿï{{{ò'²··Çük’$ãñØ{ÏF[ˆÈ'·Ûír ”ÝÝ]¨Õjãñù.9MÓ­­-.#eï¸ãŽýýý?ú£?ºõÖ[OŸ>Í[°߀ðµLD ç8™_‘£2™9á£+W®0Ž "Öhq¸+ÎØh4øºW$àzÜ(u&)*SMËO PÂÜ8Ë€•È—,ÎóuÔ œ…—Šêñè_°‡®ÃxjûZiúÚB°¬£Ñh}}ÕÎFƒuìnÄn:ž;wîïÿý¿¿»»ûþ÷¿ŸˆÞð†7|ß÷}ß?øÁöÖýŽïøŽ}èC?üðÝwß}á¦ãñxuuµÙl²K±5qo­;úý~»ÝžÍfív›Åèz½¾···¶¶–$I»Ý>uêg-cÄÙlv÷Ýwàèv»ßþíßÎ ƒÆ QAß`ïnÀKQM“½wU¾~ÒµE[ʯù$ÏâclŽˆ|ù(Š¢v»}âĉ^¯'*è(ŠÚÍŽØj‰M—sÌÎGk&‘" JW<8M×T dœsßþíßþ+¿ò+œ*\ FŽ1Å?‰è«Ê¿Àz´Æ–ª¶Š1+‚÷­ˆ—« 1È…ý¡õɺpЭg†ü˜*TÐÅUÐ¥ý fL7§ÕÅîÕD± ýk ž¹êr-ìù³Óé|éK_j·Û«««|Ê’$a¡“/z‘‰4ìììœ:uj{{»ÙlòÜØØ8sæÌþþ>+«Ùs÷Ýï~w¯×ûÉŸüÉ(Šv¶7VVºk&ŠõÖ`ÔŸÎÆ«««é,á;`áv»½µµÕét80È­·Þº¹¹9Ez~ÿûßÿè£þÂ/üÂêêêp8ìv»W®\áŒ)‡WuV…N¼Þô˜UÐpµý€ ðz« ZOQ-]‚²u¹NæEã¯UCQMFãf³é™ÈþøOýôï|ø¡¨6¿÷Ä\ ¹n°"‚^… šÀñ¯6nüïO}:3f8›M«¡Í²¬Õh¶ÛmƒÈÑ/Г3^âà²7/g˜µµµÕÕÕn·Ûét˜%ç#Äî lxÅWÊü†Í²¨` SÒÅ¥R²è!æ]”»91Ý5y~ˆ¿ÜôUuÑפ‰àÍ×úÒ)Ç·Þzë-·ÜÂ!5Lžì„ýàÛí¶1†óòòMíåË—_õªWc¦Ó鯯F³Ùì÷û<òÈÖÖ4Ï}îs›››ßú­ßÊÁ­Nž<Éw7ιíímèõz“ÉØŠB¼÷÷÷9]w³ÙðÀ'OžœL&Ífs¿ÓéoìÅçp^Lå “–}_œ€NÔ¡Å-‚>:{ö,pÜ+–8ù{±É‚\¸ágF"šã@¨=ÏxÐQÝ­œƒ#"ªÕjÓé”hîç%Qß_CÐX ÊœY«ÊW‰à¥¿£?P€_øúÃÔ<¢ýýýF£Á'ˆÍ‰ˆÄÇqÌ4’Þþþ~½^_]]}ä‘GNœ8ÑívƒÁÊÊ à}èC»»»Y–?þMozÓ… ØXÚZÈ27N£Z}ee%ÉfE'%ìCÜétÚíöh4âTKõzYNDÏ>ûì¿ù7ÿfoo/Š¢·¾õ­o|ã/_¾\¯×kµÚêêêöö6_E{ø7à¼$eYÇι(ªÇ#Vâ »~PÔ–QdTqŒÇ#Ò'3éÝW¨¬£"¼ÜãAsöDÕ³ÐÑœa©Õj£Ñ¨Õj¥iÚétدñ…ÎÍK G7ÅËKÓiÖè?Ãè|M@Õžùšp»ÜóS§Nqf@>Pãñ˜‡Á÷÷V«5XT=wî\»Ý‡qsÊÞ·½ímÞûsçÎ ƒz½ž¦ép8\]]Ýßß?{æäóÏ_Zíêt:—7¶êÍZoµwùòåV£‰ˆlGÉ mðÞF£F£ÁÙÙ¼÷ëëëÿìŸý³õõu"º|ùrE§Nʲl4 ƒS§Nq4ãMBñùÜ€ˆ¨V¯Çckc>J/N»L¿´HÃØ/ÆÉ Ü­×ŒF£ápȶГɄoY­3rÕZ8Ö?UÁ’³' ‹`TÅnÁ,”]ú#^õf±tö„uª*p^BÖ…ˆ¶¶¶Ø±>MSÞÒìÿ#nuìòËy YEÜjµ¶¶¶$ k³Ùl6›NçÒ¥KI’L&“­­-VM÷z½+W®œ?ž?áì+œ^‰k>}ú´÷~<GQ´··×l6WVV$!7ìììÜvÛmì…Ûm·moo>€Là= Åçp^4 "¾—áýϧéEP£Qº¾‚‚‚:î÷³,3€ífkšÌ­ÅQ[q-Î(›Ífõz½ÓZañ«V«±Q3ÑÀ†$’ŒIcÑoNDÏ¢@]>Kfqßu×]ŸûÜç^ñŠWpFeÆVRæDKT ?¢´"A7õ\ðC0MRƪUT³Jc¼daŠý * Ú§â tIñæ?ùòCwžŸu¤*%µÁ¹nÝòãòç2Ÿ°†#(\:ZdÔûD÷¶8íAmò¯ä!Öó@DEWf]mpA#8y¯£¿iƒa{¥<¡ÛíBž‡˜—à6<Û³ÙŒ™]vUšL&LAÙ C¢Ñq8-çÜÚÚë½çòq§Õ&B oÑ"`ŠÞ{?Ny Î9Žp ù!åtÍf“šˆh¿Ýn#"ŸnÎ¥šGÜÓë5ÿér÷ªïXÎ’.`YK]³¸ Õ·º²¯Š»|çT6PÕÓŠ÷Çñ‹ÕÔžî¨ ²ô¶,V{ Í“F›òùQ¯W½Ð¸4“«R謣,Iâ8ŽëµG>÷¹W¿úÕÝvg4Ôc À–WÄá0æýñåž®Þ,È~2^G±q³zŒS7ƒVËyÛˆbî%³IEÆ2ÆxïXËÐ> IDAT2OQÕbÌÒÔ9Gu4±wÐ!bîwKäl™8BDEä3fÕEÒ•èT<Ê2«[¼gY' q¥€~/Ÿ´Z­ñxü¦7½é—ù—ï¿ÿþ[n¹åùçŸoµZQÍf3ÎW(¾ÂK\„ƒ=WD¬º3Œ×¤çšlhBB‡¾Ø-Žý0ôŸrö 9Mð45ÒC¸ &H¥}[¢l(%ÀZßRDÅ“ 2™XŸ'X ÀU Š4¼/NˆB0ê"&*ÎUi 2ÜÓTÌÙ8i=`P¤žå.tëN80٠ιÈzDBà˜¯Häi §_܇EVï0 “4æ[¿˜Ã´tz¯RÖPIƒ ŒÅ¼ªxé\Éûüù¥ Q §Q£ST—Sü'‹I¥.¯¹ê× †—ÊF§ÛíN§SÎ$Ätúµ›MÖž^¹råÓŸþô;þ677»k«/I'˜o´ÈF‘eD‰À×#‹Ažõ̬$yÅÜb™qKì‘öÎAFù¿Ú%üÊ–™¹ò .œ>}ú³Ÿý,ûKlmm±;c¯×Óq1¯Ù—}&R°ó¸ª€À€:lÁû*l¶¯úÕò÷š'"¼)Ö ßõ̲QÚ%£+%À¤DUMª¶Nu¥Ùæ ‚SˆUIñXv,â-øV‘Xý‰îIU1]?,.ftmÒÑ4èP&1”®ˆTE‘ž|"âš#ë±1!€aìhY´âù\¡(3è£wÂYzpÑMèzàÊþT5å—ùwšÍÊç­ +‚ãB‘A,edņ&B%ƒ²ÜÕûgy /.]ºÔh48"³¤ˆX¯×ÇÓi§ÓŒ†þè£vkuuõìÙ³Ãáj/ ÃdŒA¤ªÈÏQ½^G;§¬91Ê•½ÙÔ+ 8ÿ©/–± |ã—¬qÑHP3¿AŬɯ­VëÁüÕ_ýÕ×¾öµÃáÍFX¥&y“ø–úªÙgU4›} P¿Lœ¦‚R¾j•"¸%»|I=Z–‚ ¼ 2€HNz’¡!ÂRN¶”ËCÐÕªu)RÙ€Œ}«ŠÁ"„y B‡2LQüµZN-éJÏŃ è¿dDÑÔ·Ø™«â£`x2øÌsJiDÎ|¹„]ô/çêu‘)ïX’LK;_5ª³óRà@-à3wÕáè—Qt4ãÐkE€«ØJRú ½?YF ¾-~^Z&¨ÊŽÕQc%]«µ>wËÍãñx<™' ¾_³¦Þl<ö…Ç?øÁþÔ?yûí·ß¾½³ÓjµüK—S€énH€;Ýqüe›Lï=¤ VõÞ“I#¹fìxÜÓr0Æpd¾oû¶o›L&ÿú_ÿëw¼ã·Þz«¸s±»$L§SvX,­§J¦)rjü+sˆEª¦·réxK—b»UPµ5ŠºTìɒݬà6‡:å“R¬§H뺫TÜÁºH…Ä1 z ¼‹ýUÐC(à ¥ð=RRTͺŸ“Ø¢­Gl†ÅÉ_2ÏE^œÆ…yD4€ #SÎhjGÓ`ÉEtò00\móT Ê®TŽTϱ¡R6¡m (Æ®¸IòÒHÀEž²Èë;àªõ:*×^÷¡JSµ¼ÿ/ƒµ¶Ýn³Å.£ D\éuÿýÁÿøð‡à‡ÞòÝßýÝÛÛÛ«kkƒÁ ~‰$`ž4=Ùü&ª5hò“;'ºŽXÎ\FÊúIòKX\~~)ù€Ã¶¡p$[h6›ïïý½ÝÝÝ_ú¥_úÿà¼æ5¯ádjœ¯‰ˆâ8æx{¥®"ÀUœšHÀÁ(4uÂ~Õe– 8úI±Pd‘`ÆES#XŠß«-B@}QESÂì-™Ÿ Â¢¼DcQBP­ôd . (ÜY °¤ËŠtÝŠÖ­ëÊ¥ÁlÝ:‰ÕwÌ)"KsL€=à*SµU8_S0K°T®bÊ®èCÕÝðõ_a e Wcš˜A¡‡Qt4ÿ–k®‚†2¤ÄûDÛ»hy˜I^²Žà ¼T°"äÀ`Õ8¡Àÿøð‡zè¡·¼å-o}ëÿ™e™±¶ßï7›MçÆ0]C¦t~ÆûÓaED”Í’4MÁ“AôÞ³)c—8çœÅˆm29›C¯®®²³3"Jº@Z´E2¥w{ó\Iª7üS-ªO&F»œ:í‘GùçÿüŸßtÓM·ÞzëwÜqþüùf³éœcå^U–¤*BïH‚ ¡ L@{‚b°ˆg㚫⣪(w‡ÅŽû´Œ]pGq!ŠÕ.±Êf  .”+K@6,€n]ÓPzZ!ÉPm]{ƒB”]4ÃW%À @0.ª(ôµrHßÑ»!ŸËC‘aÐVÖÌó¯Ö8Dƒ¸ŠÀƒ(íTà`›H…˯„Š»·jª>¬êÏr\¬¶”QCÄ,;ªõï5#ÀU(N"XDWÿÒ ƒOôÁ—bÚ(ï0pì… ªÅ|/ÉNG_ùÊWþìÏþìñÇŸ¹ìïxÇ}÷Ý7ŽWVV€Œ5Æ9gãŠXú!'=”ã󌢹´·ŸùügÞ’Ofý4#öãm6›&çEQ­ŽYê‰LÕ£¨à="âs—/Öâ²YâÒÌc!¢ÁlÄLM@€ÅZµÑhœ8q"Žc¶;u”ÉÂ/¨"a3 U‹20\‚]ê[­GêNaŒy衇ž|òÉG}ôâÅ‹Þûz½nÓ.PÊn€Â¿šx bѪS¶Úr W¹,Z¯²z­Úˆ’¾CŸPn0°x‚ÊŸlÝÍ…5… ê‘ç*„uU¬%`PÔ#¦É¼H²”-°f³™÷þ¦›nºpá«_ýêÿãþo]YYÙÛÞ9wî–ZÜ ï­µÑ:¾X8®A–z+˜À!"rHXTÎ*¬aöàØÄ‰µêšÃ{²Af#n¬®®Ö¢º¸cÙKÆÅé6°0RCÕJ²YPl>#î i3 ‹ˆŽÈ¹$I¦I’øÌÅhDÈ‹¢ˆ 9¥.™£NDds­¨f9ŠB’$›²ö@>ãˆÛÌ8GŒ"%™#“@c€ÙçÜ0Û4NYiÉÝf¹M’Âr¦8Ž¹Û”{aANØ@â·Åqœºd6›õûýÑh|ˆ­V‹‹ ƒÁ`À Ž6ÎÇq«Õj·Ûóï*?´\Û¤išù”q„8¿±*©Ùhg.ãùä¼j“Ñëõ:èÉ<{˜‡¼§µN§Óív#cy*ˆˆ×…;`$Ö“º,Ëø0ótɹ˜Íf£Ñˆ£6¶ÛíN§CDÌz·Ûí$IÄ„ ñÖ› 9À Öί‡“$F£ÃÕb,qü žÞÄ;˜Œû”º©Ë6'ÏÎvÛvöÆiä-NÞp÷8kœÊ»8rÆSOVŒ`Œ‰£(Š"3ŸmçŸ,dþ çsûJïÀqîáÔešIñG§^VN½÷ÞZtÎy Dt@ülŒ±x }*Dôr's†FgÍl1¶áO4c'¸KóI¼“…; èÖBB# (Úih­­GqETeÌUň˜KÙód!oøOgÂÎÌ{qXÈ4ö`8¢&Nê`òJ˜³ª@ÈÁ‡+bŒ1ÆbgßZ Ö€#ïœ#W~G®ã.h; ÀÿŸ½7¹ì*«Î]ßò½oín/ívÓØ$¬ö8Á@Â8b`”8HD0R’!D(šhø+DŠ‘à D3Hó £D#FÀo`€ŒˆIØB¶Ùl·Mwý­o»Û95Ô½õêÝûÞëïk·»ív—¬öýî;÷,uΩíÔ©šÙè©A{HáÌ«[ÂÊÞÎ9ê5ŽÇ1å¡‚ Ë¥®M¯1ªì|Ú€ÐÏku¾øµs¾ŸŒ—…Ë1½^¯Õj1`RÆgÊF•VÀUùë•)³ß÷-L}$>¥Ì‡l=7Ô¸#«÷ <ÒdÊg–¬IâóÊÀœt‡RRKp±Âš;¿•…”Æ•"(^&›0TZ"ê£t]¨=@Ê;†ëá(¡BÂx!"’‘@fÆ>"åý¦ý†4rdû ~°RŽytFE¥B&dj£j“¯ðˆÈCæÚ$I#‡pbHÐ=×2‡Öd ü¬¯)ƒ²ó ç’aŠ+¾,ËÒc±J;ªµ²êfó<ªDW¢T¨/Ö(1ÙHx'‘Ú’š‰Nª®9]°*šÌÉ|J1‹¾«(@*ó¬»S'OM´›‘÷¬,@†AŠÖ%HvαA‚ùDš¦¤pÓhéœÇ®ŠO"«ÐZË‹õª2²Tl F€ òfË6© ‘MbÕý?¬ï0ã0A( sÎÃI€ª,ÌØ¤ŸµW§}s¯råy>Ó$á¹0Æp»ŒañÆWÆÿ .*þ0ãÔÙ¯EBµ«ÜaÁ¡Ö¤ù+ªŽ o<c +îTž’z¿Eý5*€š¶{‹p0Î3>,7$6vGDÀ«±šƒ•D_C‡€ÏÕÖe\€iuVÞS%»øÈ|xÍ¢Òg¥¹eªÝJ²ÊeOS<¯Fˆ›õÔÔ©\¯@ý€Jöå)Ó»I š?Ac×7·Ãeƒ’%0…’. 7!ú“bËk?Í ³bh–Ÿ7^MáåM¹©Y1[ÌäµÕzˆ•ÐV#ò©­ Ô°ÁÀ¬U•®+°Ð2J³,`5„äÈæy’$Öó²$ÜÀïz¦|K!Ó!¬'øò *>_mï’ Ô¢ó U²h‰ÍćY°05Ç0/8c áôu D>CÒåƒ^S`š+RC¤d%¦ãªÏzq“­¢RW'‹Fÿ‰ˆ’ÖUFZþÜøžÐnù×UÖ]ªdCšæîò~¢X𪰠¦º'#eD÷ªÙ[´†×¤PzÍiœëõʤMoÔ•$e¶ÖBu‘F”òò+åÌ"9Ü)Ÿ|ó‘*ûRI@4–•Æ?9eÑî ²œô–ã2ÌÔ³,ãò,úˆò'Þz¤T¹­‰)(Š"1†Kå’÷W|ßä¤&Ëá ¦:É&"¯Td'Šë‡yš:ç<ô4srΑb¡|@eÀ £º ç;( ‘g L¦ujÍ—\²\÷•ÍÚ4Ü;äó&>g®Y µU¡ÿ€i"³@¯|˜EgI™š5­ :º{2ÀfÇ.š\”ægyYõªù/;‘‚fŸ5ŰvÊge’kŸó³,9„Š .ôí®•×MhÉ^ºzJæUJ›]&;‹g©^ͦç±j¦H)Q:N!s`HoÉ©™uÀÙMôεÖúyž‹P/Å“WçhLÁ… 9ëJ35çÒTIz<˜Ú¨Ó#q7e·jl†7‰0`Tl~Öœsªx_ÚÜt°m%}ÓýÆIDÖN¶7c©r2¦räåvÿBÀ„ÌÄÛªÉj¨„ÿÅÊ7 “$áÊõ ¿sÎæö)½¥ËäÊ&lî[ÖµôÀ<Ï+Ü$ð5LŽXYzmu{JO:)s´µ¨³:ªdŽ<ËùOQF©’ÿø_v&L’$Ë2§ŒêbN( û(¢Liäñ}ß÷©"@šø@’$D”e?0JeÖXJ%eØäç2`Üēˈ*ìªÜ |ôJ‘uÊ:ª k Ø÷|Y'Œœ“$qyNH"©è]@ÕvÐ5PJfìUð]U@˜7bs7è=U#‹óèM[¡I?}\39ŠägpBôÔÔqR¢a­«ÒOYi5‰PP-D A¯õ@¦–Ê“¬ã,NXÉšÞÖ&Å©qš8·-5øJm›LÁt`¥yüR ÖÉ Î«:µtÁÚæõ¼¶0púˆ°ÖŸæ2˜·¶ Ð3"{{Tzš¸§€:·5ÆM,jò«µÖÇìÏi«;µ%AÌsWyéÓ,/,U«ÂLù÷ÏGÄTï'TŒ&Gƒ vQÅÆP\¹Ú¹¨Rv'£úb=H%ä&I°²©Â´ìÉH°UÔ_ÑŸ@¸‚1œ“U(Ëä€ §–‚©Ü—° ƒ¬iº1†ÌiÌÊZ×¼¶Fýk…5ÙmîF)Ï~×D¹f©;,SGËR¦J1ªÌþ®ºöʨKÓTâK%ŒŠ -!‰Y)ß¶GnÚt/íB¥ÝÊ|I0¶¨ë½ÇÓ§wyšF£‘”1•ùÝ«r³È™º€1!Ïè[òÕâÁJƒg(Š‚¬uÆN9™7­1†°Ôïœc‹±¬.(M82Gª_}55ãó IˆËId¹ªÜ@rmIKˆˆ¦¾`xÕ‰©à‚ X¿‘)Öø!e—® ªVáÁùÊ%‡’\L›  M_ã‘gª$*h bñ†=à4 ņ BVišuÊN©Í×é$]H£­m:éCm{ÎüDÓ$dk‚€ÏÈ óœAÄN§Ç1SV«åû~aI’ø c.Ï€™:ˆÛ ïV¢(ªÇ”=ô"gäiá¡OU°ÃfÈÀ’àÒTä)aê|¨¦‡-;'‚<Ë}ßFNg©»tnó\;î¸ÊäÈÊ› ŵ6­ tÎY²…%g zd/ªÊõY™ŒÐDÖÚ‚  œ¥ÂYËŠ¾f«Œ¨8n[kËñ À8Çv¹òš¯°O.ïy¾ÜHœÌ"–ã¤~ÏcLèGEQ¸‚<ÏkÇvÜŠIôºÁ–X_,¬µ–ÐY* [ "Z0ÑÏóølØM'ûƒ*¦1¨«„ÜmƪóKÖ,¹Œð?ß÷£ ýÈ÷}}²0´Cç‡?ãÙô|?ðÂЀ,˜Àa…)#ó'F ßQEQØÜyh<46/¬µ®°®°E–óJà5-6jT^Ùo}}›;Ö¢ƒÀy^Ê{w“4$|ã–'N ø<SY¿ Zrìc‰ˆ6wY‘@–¤ü­ômS|Å€¦uhðCèþ›¨ älÀC2dÁ®(J‡Ž,Ë0j£9š·ýVfÙzê'q¼oñØÈó#—:Û  (Lކ0 0P“ ± ÖÅ¡†|Éj,|×Z4•=ˆ ç{£"#°Ž gW W¦4 ¥~Yq”,KDÆ÷D+ÿï,`eÑ,l.¢ ¡#ôK±Û9gÕ»¦öPö_¼^ ˜ªM €ñ+[˜–*z…ÕÝ3¨\ÿòLâPbh0áëÆ 䃛IÕ¼…VM˜ŽýÀ*[5Hy ¾”×€^ea2`|Oñ0Ÿë¡j]9É#å d$3:>•S"Ô Ⱥ”¬1Æx ¢§Ø†Ú¨Œ¶»å)DÏD¸‡Î9"ŽT%;e"͹oå ÓD°ÖrR>ã™ÈãñØãt»ÝAäœ[^^ÎÓqÕœ´LdÌœPšè@:=!. ” ×ë™,‹‚(¦^ÐašÙjµdcü Ã0O³0  (Š0 m–û¢É»•2ãÚ!Ë}8Šç”N+4¤¦#óÉK}A^EÑéÓ§WWWã8fêüƒþàØ±cyZDQAžçûûûDÔjµ–––Ø ˆ”ŒëgÇ%7}ͧ¡¤iP¦ªfWµ.”TŒºÒzí„ÕU—[äO¢Ê_‹ÊÄ-3" Ršæ³dªŽQYÁ²Ö¦y*GŒPñfcL+jÛêZª#1Pšž#T!޳"åÊåCº*H6•/•1†ƒ` :ñ§j 4ÚeÛGQÄ+Í0Z•$uÌUK;ÌDP•Â*Á– ެgûÌ‚š%ü>¢PC`í´˜5k—Ë{ÎhiLjóM©ÖË1y‰j"²T€ó­!2^Fnh­ßYC` )rcLà™<ÏÁŸ¤ÀT˾ÓÓ*k’ãdF4íÓ“%@ÓÉxF€ïCƒ†ê}AŒ4D@„J–e–õΡc¦,”8ͧQ,ï˳ÏjÉ–ë$ B®©ÔΑÀÏ÷­ê’ž8®ÍY[8kv(Üêrˆ‡û‚‹3 dšAQ`˜6­çÉdéæ¼y=õ& IO(ÿÍ{OžílÃסXJw<Ã"T6mƒFÌœ²\qÚׄå¥^’$£Áã8nE±«â µÛí¢(Ò4‡N7MÓ½½½N+ÒdyÁI¹±t¡õ<|ßx¥éKlcÀ„ù¾Ïíù¾Žü~¿¯Eu1ú:q0Ñ[È€'¤™¨W]ÓÔÚäÀ‰vÓIy¯iÙÞÞ^¯×‹ãøÛßþöu×]—çy«Õ:}úô>ÿŇzè?ÿó?wwwùf’$ý~Ÿ374Q©›s ÔðÉVgH –©QÁ(dq3Q&ew&¥Ñj<Ôž¥· ¦_#ùнv¥«NÎ̤r±o#"YþäU@dÖô|14³¦p‰æ¦ ¹¾ äÌ’ujœT±Q—¹£§¼¯5-pÓiÍ&Q™‰JéP%ÙË„©lþXqýÚ­Ü¢ŠàÈ5›ÊÁPz"•@rÒUqiØÐ’eáÔž Ä‘7}iª8 ÍÅèMdiFè{•—5UÞ¼EQôièmd ¢qà¬MWœÛ@oP¸•®úf8ÊZ~èeEjâÐæSõOæÂL­+YêœW÷°#”˜”ENUp4)¦'Î6äWyÖÛGz如ô~Ôåõçµ]SÛAµ?ít„#©vÞ¾¨{iAäˆó|v%ÑfóèÀ¼P R?MsG3ǧ̛ö¦–çÝEÉÕëé_fGžZÜÏ&>Q(úcæ][šÃamm³ò ‡ÃÕÕÕ½èEÏ{Þó^õšWCß÷mÙßßî÷×ÖÖF8š¶k¨>îpr2vÊ ajK#>%ÌRˆ•7Ïá‡?üa¬®Q¥ÒYkãvÄ<\ø9ï6;s×ï¼óN¬î8ÊlÕê TÔ˜ü ȳ0<ÞfÕo4­¬¬ð¨ÿøÿø»¿û»vÜyÁ ^pÇw\ýõÖÚ4M£(êv»M CÆ,8ª=4»:³P¡I ¥šŸ IDAThùUL¬µÏkì¦IF“ñˆ”t‡*–²VšŸü¤——bSy{1ck6‡³. è_å}'0½áMåÉÅRšpÐÚxaz^šÛ)'8œêk-6Ñ®ñ\û–fi{ÂHE´qÕå.Èó\›×@3™JWÅóòT\!4ZtÓÝi‚Šž:ç(t˜Zc=ÃÌGGEd‹®¥q‘™ngLPÐ6Ø"·™ßŠŒók ¸¬g,3œŠmïMñȯbýÕ8b«1¹l¬Ö³€Ê£b>qZ8“~Î\–µ•4µ³ä½§bnë…gçhrµ’µ¹žQ~æÛù`.V«=ÔèžÚÔÄâ\÷eòêÜ·\?0«\ÊØƒåe¯ÕÖ\üþt,ô 2`ß/#²Oë™3g¾þõ¯?ðÀçv·ßñŽw¼ä%/qöööN<¹ß¥i„^mˆæÄ‚œ=®sùQJø•oÿGâœã’"·™˜ …Vc¢¸A‘åAÄ<Ï£(²YŽ÷ÜsË•àÀ¼4[˜c˜Ê¥\ý¡Š[ùš×¼å'M÷…F[*ïfðQh‰-±¶ýˆ(Š¢½½½v»¦i«ÕúØÇ>öµ¯}íî»ï~Í«îæ³UO2…†Q7¹šžx½‹j¼”4*Ÿ¶×•†jÜ„ÌaöóÞËùt? [j²¢fçAi̵ÞzÞŒ„ g) åk])ˆQ–e~•½ƒˆø`šn­Î™ø‡iû„¶"HLå•fAçkœ¸6:­³ ¹—¦©R×Lu%I,z£€jœ^ÎÚµAÓ¡šjý,ϰ­´[k W8ßXß'²h ßA@áû9A <(òÜåú>„‹p“†ÎƒÚQ¥1Ccý艫W‚3DÒÚfÑ¿ºéôŽ2ŠæüÖ­EîÃôiv¦Zÿõ ›ÅôqulŽ÷P`m´®÷aæ"kó –œß4ÑKD>øzÊ&ëŸf3*Ÿæ,Cƒz8›žÏ"+›ˆ© ŸUýÿzÿ‡?üá·¼å-¿üË¿²´´ÔïG£Ñ±cÇÒ|F~qDtó s0y²"0AJxÿ~ë‚ 8nu‚ ˜qü…/|¡Ýnw»Ý8Ž»ÝîÚÚÚêêj»Ýnw[ív›#Ýsì=ö+ñpÝÐTùˆP]ÄñþÏm&Ž$ü/3`Ó¸Æ&IÒívÓ4][[ûó?ÿóoûÛï}ï{=š%¹s޳ÿŠ‚_ÛÍÙÒkE66*€Š¦8uKA;“Ó,5W3Œ&›Éxšë@žå,³VFî&ÕøVLªÖË÷eMTÀô™«Œe&yªî$î&)“;˜‰¯€¨ ì"+ðˆjx–^ ÞšøÑ“EÓ&})`ª`¨r¦®‘¦§FO„›¾¯"Œª>Fu¢!Ùrj½u0aÕ ôWáâ5”ðˆÏ€Ø,ÆŠ—L «¬S9㈋Â#cÁÏ|›eΑxÆ·¶@k ©Ès¢Ù&h34`àìIMmó§wƒÄ{ÑØÀi Š۸߯)@³~ýSí½îÏb®J0ªQ|ÛÈhŽå‰FýìsÞèø9Ëft  ªÁ|ðŽw¼óÔ©S/}éOEQ4š+æ/×ઋ՚sÏì¤Þ}Ðä|9œcfyöìÙ3gÎ8çÚÝÖ‘#GŽ9Òív—––VVVºÝ."¶¢¶ïûív™¡êó­&U"¹4M…BauÇQ¶¢t‘ƒ ‡ÃO|â÷Þ{o’$GŽ1ÆŒcñ+³*‘ö™Ò¼j©ª¹ckÄÌ›’#OD̲Lÿð:ÓR­W7‘ê¹8»i$€Ò°µG Vô‡©¼W¥„rÎ1Gó¸N(æwA”ü+4:Ÿ–Ð' «b{ÅÄ0 ËOvŠ›MV4×exÆ" u~ÎúdqX8ã´…%§¾oȘ,ÏoZ)/›s3œkˆ¨¼ Ò`Àµ³ØÉ›åÔCTÞ ­ÝÚGÄI€ÌR™@$œø'ëÂà8§!T^ohÐÐtý(±¦Ôõ쪶„m#"bšg²,EP3Æ8Õ=Šæˆ¸Åy¦× ÉòsE–yiòê2œ&j/@D>½õh}b¶A<'Ñ@-šcªE˜­Ø¸9¤€–ÂÅÇéÆ÷°F `}u5 ›çÿý÷Æÿíù_ög~v¸ßÌä\O·[ã£ç:G†8êꤳӊã’8&WÏÎ9ß½,ÍUh€cÁ{ ÆùÑcgj¦éáx°ººº¾¾îûþ(c(/=Eµ(äE.6g¾*0foæñ‰o‚$I¾ùÍoöºËw¿úçˆh<³1\†¤OÔjšœ. *³¶:L›k¿Ö΢¨¡ûÖ I:ºõs•!ë ¦»aÁ8Ç«•3¼Ra-ÒݹBaK5FË ³cDTFUÀHq¨ØaÙájc° Å‚­‡† Vs^æ¥iý^3iýP³3ëƒgþW{Q™éësºrg±$úSÇ–ÒG£ÑÒÒT¡é@V¬L¢ôÐ÷ý$I= ¢ !249xþgŒÁ ""<­¶0¢[-œëx1C,}_a®`f¢T„)N¨*Qá¨Ói—é=ßV‡G|ou*{ÅKgÎ#{Y—Åx‘"¢ÄœÐD¶´¸yÏw™¹’º¦Ø¤Îõ#Õ§J}P (RªŽ"lþ¹3ÌaœóHÇaö¼#›ù™a?›ú„&ó>µ×¼úmˆêQö©Ê›.&¼­‰‡rå”e§.†ƒ&:æÑÕ)W:0Žâ0²Ö¾ä%/¹ÿþûÿ¯ÿûS¯ýëmQ˜i›ÐA ¶/øÏ<Ï[Qà ÛŠ£À7^g£´ÝöSN'o|ƒ~àG¼ÛÁôÐ8@GŽÉ3þÉ“'9Ëzu}˘wîïï?þøãü>nGÝnwccciii82•áläâh# +ÿj˜ÌÇäòߎb/þÜÚÁ§>õ©Ûo¿ÝÃIoæ‹u<ÖVMkº4­øÃüp@ 9;fÞûy0¯5R(χ­¿Ù„ÆCC ¸¨&.º3—°*"º„•CƒTiük\1>———­µãñ˜ßPeË!uJÂŽÇãÑh´¼¼<³Åæ(šK·9AŠs\b0Æðµ{>â=›eÙØÏ…K¾.®x®ðº½å–[¾óïüÂ/üÂ%¬¹b=MÚcH",OdoQíf‚ï½÷nmm={vss“íÏ»»»¶p'7äB0$ã4§{{{žç?> CæÁ–H<¤l7_3`é èòs»ÝfŸ1Ïó xa>øàƒ¿þë¿NDÖZÎÿ3gü Ç¦ÒB€þª©ñ\ÜV¹ä ¸öáiîaëŸYy“ÏdÃOAj2³K °tØ!Ì”ÛPvÊØÅq0`Æv<Œã˜·Œ‘D.lÊ^µgl–¿Ø)«áÐ9×ëõÂ0ì÷ûý~¿Óé@žçA0Ûbq¥@‹’ðÔàÁ×à ‚ØbÃ0¼í¶Ûþöÿ/—vIÔ¤s,S‡yÆMœþœsÆ“lâ…hž åõ—¿üåƒÁ€]±Îž={úôé³gχÃ~ÿááp8 äþ.7DeL¾dœ:縀çyœ‘ù´Df`pñRcÆÌjö¯–HCÀüñ'NdYÆ|šmzÍ‘kã@m‚bù5LÍÃãEOÀA`1mÒÖšxQ{^Ð¥yÿÌu±&•2`Þžìv/fª›µ?q8ò]¾¢(ØͧÎ|:ãβl0ðí>}žZ›© vcþTÎýõ€Ðl¥ÝnonnEÁv¯,Ëööö–––Š"›_ͽÁ/ÏŠš×Ê5öeÁTÙqàøñãçÏŸ/CëÌñÖ>,4íÒžçyè!N…µ ud9“õø'Ožd?)¦ÛÛÛ[[[£Ñè±GßÞÞ>wîÜÎÎÎÎÎÎùóçwvv’$)Š‚8[@«Õb_I"kªD4Þ¬L2üževã’T9ÚXk™©c’$ét:T¥¤­ ^ÛŸg"HYŒ{šê=‘ ˜wÖ{Øm¿˜°jŽ»¸æyã•okËEŠû^*ü<ÙдÓ>Iõ7Ù­~¬=z”±Çª0;r8ÕÑhĺoÇ쨷e­žš¼XëO­°|ÂÜ—¨:_=<Ì[‡I’\wÝužçíììˆQ=‚§&†Æ ¿ÏL`0Žã<ÏÙ{7Ïó ÜÜ ¿‡ƒæÃFÀ»æþ­1cDô766˜E±ººº±±1³,;ybkooo8nooŸ>}úÌ™3ƒÁ`œŽ}ôÑDdZ#¾¯D$iÚ$˜€ÄÉbÖËdˆíÕÒi6q³e›d·XDÔê¯ÃLÝW Æxf¢ïâöê%×äš„¾©ï.èê¡T(˜fØMuž4Bv¥4ÝÃÎWsÙÌd²Àö÷÷www×ÖÖŒ1R¦×ë ‡CvB ðÕjQe¦–j¢ Ï“¨`Ž /6°C­EQlnn®¬¬ bš¦ug^øª+µåÚ´u]‘þ4ášdpÙ ŒTQm=x’‰)X òÖþô9¹sP>Z]]%¢¯?.yßúýþ™3gÎ;7“lüÐC=üðÃÃá°Ýn3›”ë¹úB´©bXŠâEQÇœSTRX-ŒFÃñxÌÃàÛ#|¢6oÏÏä3)ÚÌ’½.íkêÍú/XóLž:“¦ÏÔ€k,票Áb‰$Š¢åååë®»î‡?ü!ï|½¹¹É·øÒ4ËL,¼¤åÛ ò`ªn7Íüdf?ŸÈõs¯×û½ßû½#G޼ímo»þúëwvvtÆÓ§Ðe7A/èÉÌ÷×¶ÕåÁ?Û¢“$‰¢¨( ¼D® DT»™FÕå½gBy\+ÍXk»Ý.K»aEqôèÑÁ`àœ;¿½yÓM7moo÷ûýç<ç9gΜ᠃ÌzY“F•§–ªXüQñ‰/;<óÙ0»hñ–fŽ;òúè‰'n¿ýö7¿ùÍQQ¥É¢(ÊmÆyssó/þâ/¾÷½ïcî¸ãŽ·½ímÃáðýïÿòòò[ßúV΢½µµõ‘|äüùó¿ó;¿³´´”$Éþá¾á oØÝݽÿþûxà~ô£óÒ}^Åp(¼Xö½Ï4ÐQÕD“D•“Fsbf¦¾”Ó1Q-RŽbÙ[d9[Ét]Ò¼¦¼5Ž¢KÊ e6ð1óh4âØº˜ð\¸Š˜®­þÎûÔ~v³"õ×ĘÅkoŒ™J*Ð,ÜìL³áfßfö¼VxÔLëóªÕõ‹l·¸æ‹†šÄ°¸­Ñh¤O+øJK9ËËËív{ggç–[nyýë_ßn·WVVþíßþíøÀ©S§^ùÊWîìì ƒ¯}íkùÈG^ùÊWÞsÏ=ŸùÌgþê¯þŠÍÔçÏŸßØØxüñÇßóž÷üÔOýÔ{ßûÞý×ý“?ù“(Š^ûÚׂÊXìœ Ã°°Ù·¿ýí?{ß}Ïþóßýîw_wÝuçÎ[YY Ãp<¯®®r†"Š¢(MS–’$a“Ý—¿üåGyäõ¯ýÝwß½··7/ÿñ5¸²pøeuÒϧh³"LËpZ{Î8É&¬äª®$X-£Tæ9sGþ“ªhVf:¥‰´Óá¨ôK&ULÍ}ß㘕iöÀÒÊ\slW“ú»f*ý5u¹zÖ›%õ³®s&÷m®!]`Á¯Od‚nÁW0_ˆ¹8¨!¼ö² .ªÕj­®®r,N¬IDêuyyÙ9wòäI6 ½ò•¯”ê÷û¬mkö 5_•¬·f'¨*€ù¼¦E­™­Ô>‘FgŠ5MFXóÐÕÖÄ/˜¶ÌãÓóP¡m5 ×ú|É©äÌ‘.Xý~?Ë2¾°7WVVÚíöööö<€ˆ/~ñ‹»ÝîÖÖÖp8ø çy«««ÿõE/zÑÖÖÖéÓ§Ù¹š5`ŽõSÅ׿þõ;ï¼ó9ÏyÎx<æŽYkÅìl­e ¬Ò'[k;ŽçyÌ­üÇœë$™ìöꆙ’ë¼Â8.Wg 4®t¿®6h ëTÙ¨4#“?§\|QùÁbµ´4M(³š°èÍz°¶z“º~ª;¤Éw‚ŠI^¼Ñh´»»»¿¿?Y9žtTò´À/—ÊŸ‚kýPP£ìÍ]ócSCZ×õ,ÆÕÌ…² Ÿ¦Jð§jm®›ã:84‰Â‚ÊTr¨F/!ðw"ZZZb/+ùÈGžýìgßqÇƘn·;ˆhgg§×ëE±µµÕn·“$ÙÜÜÜÛÛ[__÷sæLš¦ŸúÔ§þñÿ±ÝnF£v»†áÙ³gãèú^o9ÏœÎl;NÊd­åsÜ Î;ǬWÆÂ÷úý>«Ñ+++¾ïŸ?¾ÝnQ;;;Ï@+ôU W Á|ŠƒÖ4—œG`ý4x9Ê]7ç SeSȲLbßQèGÎAQ¸ ð¹ûÁ=f}—=¡äN°ÜDÒ·MŠ9“ÐëCbV”™¯ïíïmooóõŒáp˜¦)GÑyë—x–‡ÂÚUó 3Yï%\ýOvý‹ÛÕoæµ{X|i;Ï'¦išZkùêm’$ˆÈ{â8þâ¿xìØ±_üÅ_d_-NsÇq«Õºîºë¬µ[[[Ðï÷àôéÓív›ãøœ:u* Ãííí ¶¶¶Ö×׉èܹsl@ ÃÐ3œskkkœ"åÁ¼ùæ›G£÷à`v,ànoo¯¯¯w:¢(Î;Çq98ý ëâaQžçƒÁ`0H»ñxÌÅfrÇkðt‡ÚŽÐ^p³ÔèÃJuÕƒ!@Dúhǽ^o0À©S§¾ñoœ9s&å{Y£ºJÎyÆn½õÖG}ôÌ™3a.//³À:ëööv¯×{üñǙў={âù2 IDAT–wU)"dóIÛº‰( ÃN§Ã¾™Ì³¯Á%<$\ªvk[i1¾6|©úùt’À,âÉï½ KVž5ÌkŬDÕ_Ö†³,c·çšÑï€KAX)eY6ûýþþþþ`0àØxˆ¨Sתùüì’aèi3ÙLóÏÚ\¤{3?oòø‹è!ßäáMÄ.N|­ngg‡Ov···ìÇ~ìÌ™3_þò—{½Þç>÷¹sçÎu:3gÎìì쬮®¾ð…/Ìóük_ûÚ<ðo|#Š¢Ó§OƒN§ãûþ½÷Þ»»»ûÑ~”ëýýýo}ë[I’AÀ‡DívøÄ÷u¯{Ýæææ_þå_noo{žwæÌîä+^ñŠÓ§Oö³Ÿ½á†xà?þã?¾é¦›Ò4m·Û,%p‰$Iˆ¨Óéôz=~Ï6*"bw – ®ÁU m“%Ϙ ÷Ì"WY. È:²Î9Çì13.QqAR„L3ËÈPFÆé“ö*¨Í©xXY–F£Á`Ðô™`AåàÃÍ1'ž¨ÂXˆzÞS4øû“5Ä ¤Yóà2h¨—4Q˜9¨™ë°Vƒ~¨Ù{„Á_to¼ñƽ½½~¿Ï!/øâïÚÚ³á¢(‚ ¸çž{~øáûî»Þð†7¼õ­oýä'?Ùétâ8~ä‘GÞùÎw¾ÿýïÿЇ>´²²òÒ—¾ôE/zÑã?ì uòäÉßÿýßÿüç?ÿ[¿õ[DtòäÉãÇßtÓMG×{yQÙVÜÎs›çY«Ý~ûíï{ßû>øÁþÁüAQ·Þzë¯þê¯;vìe/{ÙÞÞÞÇ?þñ}èC§NzÅ+^ñ¾ð¾ûîÛÛÛk·ÛƒÁ€£µ#"GíØÞÞ¶Ö9rdee%Ïó0 Ù‰ÚÃvòkðt ®íÕ6ùëk8à'WxP½ëœçÈ:𜫸*•nÆXú5;Âá°Ï—÷ù² "ò…„¬ÈsÃáÃôçñmÇcL»ÝŽ¢èäÉ“LÂødH:1CõF€4Mwvvø6äp<`ªŠ•g¾8mûÞõ®üå1HÆ÷ý4Mµ–=Ç! š”k',sÈ,F·¶æÙN…+è35Ñ:q­-™6ÒÅßBƒñc#d¦Ôƒ*ø¨¼ÔaØšÍ5GÁ+²V-Tןš:k KµšgÊ( Ôß«è€"«¡×]wÝùóç}ß_]]=wîôûýÕÕÕ8ŽùÚônllDQ49Â3;pÇãñx|üøñGy$ Ã÷¼ç=7Þxãoþæoò¯Üçê¾å–[NŸ>íœ[__ïïnú^çäQQ¸0ò<Å꬇ݦ–——Ã0ì÷ûƘ8ŽY—e㫼A ƒ'N|÷»ßíõz¾ïƒn·»ººšçùã?nŒ9vìØææfÜN§³- Õ|/s­—kí˜Y¦©u1­?È~Y3’þéRɸ‡íÛaá ¦ Æu¨Ž5‰Ì¥¥Ÿa.€üÆÿøŽO}êSDDó’.̯‡j¶Æù| S o~ïû ‡¾oór²Î¦™+läQ»D!ðöϲ,ôc ¶ÕjYkýÍÍM‰ˆœ,âd£!»“$IÂyL¹7< €%޵ *ZKã…¾ ¬þŽF#¾à/„›ç‰›îv»ì RNÞœì(W=,Ѐkòùa›Ö3xpÆÿd@“ÐÌlý€ã|p+Âs õûýN§c­í÷û¼›˜wßÐ][[;qâÄx}zyyyuuuww÷Jõ‡æ€ÿÙÏ~‘ÃÜ|óÍßûÞ÷z½Þêêj¯×ÛØØÃ0Š">‚²Önllt:~Ãf.¾%ì~³0ÆpHÎʇRbΉ€£×²sõh4ºí¶Û>÷_ÿŸŸþéŸîu—Ò4å«<Qþ.zÃ<ÝwÚÛ¬–lžŠ.,``òòâØÛb[å%&/¿dóԙʫ kA¹—žì­DDl õƒèŸÿùŸÿ‡ßøÍápØjµ®x·ÚJó{½G˜c÷¯ýëpìØ±n·{ôèÑÕÕÕN§sýõ׳Axee…ˆ¢(ZYY‡’˜Á €òšqu |ø´»»Ë1íøŒïBEYØþÇq†¸½½}ï½÷þŸŸø»¯~õ«?ûŠÿvuuõôéÓ«ëk0MvŸ áÖð4"pM ‰ úìyžf|9¡©’ÎÔ}/[?ký¹ éž”SÉåT‚çé¾s5à'½GW9<]6þ58ŒÇã^¯·´´ô_þ·Ûí»îº‹ïè_©þÔüäOøŠúò†sçÎ}ÿû߀ n¼ñÆ[n¹emm nºé¦¼à·ÜrËúú:°R PƹÆ*L“ v›ä@µìb­ƒHssìÿÅ×6úƒþ‰'~ô£½ë]ïú£?ú££Gn»í¶cÇŽeEÞZŸ8Y¼âŒê"` ÊÝi^ÉË·3MÄOù4Ëëò’Ãå7A/èÆ•íÃU MôŸë' .Õúyºàg}}}<ñ‹_üÜç>÷»¿û»iš=ztÿÊf÷Òl˜ÁoµZœP"!ð ?Î<Ê n–e?øÁ}ôQæÇÿæ7¿yóÍ7¿ûÝïfÛu«Õ3ÉKˆU2"ÚßßßÛÛãË l|&"Q¹‰V«%AtËúý~†§Nzãßø‰O|"Žã›nºÉ |<ÓÜÓ}›QåÛ ÓgÀ4}“Oóã+Öת3ü0óOäìöPŸÌDÅâfš /#lööŠÏãU×LÐOM˜ïëp¸ ÚÝÝ}ðÁÿéŸþéž{î¹ýöÛÉxÀ|犀èE|ä:9¾ùæ›98_ b6É!r$T¤»o>}úÑGEÄ7¿ùÍìÝëõ —û¾ÏgÃL>ø üüùóÌ€%Å "†aÈ5#"Åögæß¦cuuõ5¯yÍh0|ÿûßÿK¿ôK/ý©—ÕÆÏHª¤‡|ÅÏ3. xÞ$yóøú‚jk\í°‹çò,¶&Ë.òË ×¸ïå‡KÅhçÁý÷ßÿ÷ÿ÷wß}÷/ÿò/{žwº¬×]’Ê/„ûÒ4àïýÏÿÓp8<þüÖÖ‡©ÚÜÜ<{ö,"fé$ØñÐó¼<+Â(à/‹Üþ¿_ø|–e:(Éâ K|i<‰‘Pt2çœ N§×]îv»k+ëqgY6L‡D4‰huu5MÓOúÓŸüä'ÉÐsŸûÜ;î¸ãÄ'±Èlü ̺¯)-rsòÆÍʉˆd]Í„+æþSgjÒe¿P™ß%ø1ZXõçH#2 åW†øŠçŒã 9Çœ_¾úÅøôpR TѹsY‘kË?—±Ö^Ø4ÒJ±¦Pez;ɽ!ÌÒ.ª¼ÎôÄ[ž+ÏlVæÛ"pÎ!•V G,~Y”˜ñ½³)Ñî#ã1Œ:D´¹“7Pe½ä!³IÕ]xî­µ¹`’¥C"òô¡s?:çy^¶¬µI’H~ˆ©ÙRìS_ˆ2Æ€™í=+ûE—×›–·‡.£ëÑTƒˆŒ1Ü1&¦:Ú†¦ÎˆØî¶8f¯µv<óþ̲Œ? ðÝn³Ã9ó $à±I’°©€Å¥åsM •1#Kò2tãL÷Yø™EQäû¾ü$Œ 98šŒÔZµÚA°ô 霭µàU­¶( p%þÇiÖn· â86PÆc±TžYðúáá;çÀÈvŒîI‘•y;ø'îTym™ '3Æ„¡/äžã»ñ¾…éu(8W2~/d0ô¨"µyšîsmƘ4O$ƒ'HRnÏóÐ×u þÁ¬4öŸàÊ­†išš"İm[ç;è{ù w²Ý|´s꓆ë©ÙëÚA1îå¡u^ ‰S­mƒþ‘½ÉX˲V«½^ïØ±cív›e#DlÇ­(Ѝ:\·Ö¶Z­8Ž9ä÷xwDL’‘n*IZVx­·as…¦‚rEÙÙüЫƒÖZ[/33;àRÝ U9;…iÀÖX¦Æá<ìI+š®ò–ݤ§U#™ßxÞlÓÀ¥_DÁÉäòúi @>¬ÍlÕļØïuAŸÓ"çsOç;3qÊj´8N’ý~Ÿ·v^ADq\X;Õ¢)²R:‡Òæ`è"œùz‹én×À?þ à_4­yk\^‹Zk)º£.U)t8¿²Œ óçÌlØ„.*Ž–ƒA‰U‚8ŽÁxå}yk9ü8ÿ: ¾ØŽ¤-¾,Ǽ3Kr ‡p‘¤÷2XaÀYâ »«Òfm‘ˆ&p~±7¤¬p!9ƒ •ýác DDGÖÚ(Ž`šëðŸI–€´Æh¬Í4åÚÔ€yÞõŒ—wÐI‹ˆÈ4"Ux@$c@P]¶XnUc òÎae‚FÄÒÒÙ\¶¼U™Ë£V[w+kGše2­ÚØ“GXIÛû±p"‘kÞV±ɱ(V29˜ŸÁ¼Æ)¡RÅdÓq;ï{è1-"e®—JóCÁ3+Ò=i+Ï­ šmM„Ý14(‹ÿë¹ S×ÖW§«‚R"rP^q䈀_€Sä—Û­4Ý&X;û‡0ŽGišî÷y­ú~;†˜Yc +!ÖZŽÃÊU±²Q‰™ -”†"GD9›ïE¥ ’%óJú$ÓT&SÑùøÎ23€8Ž9¼{QQõûýÝÝÝÑhtüøqÑ{²iɪuf`j—ÒÄ$ú D¹§c¶×€µã8É“R½Bßó gZå’µM³” ¤×LЈˆ€œ´ªï ÑãÙÈìª0d“3fo24¨¸µ|È?iq„ù³"P{ÏÓ’UÁêµðÎÀ+ õÆ÷XFaÜ2S$"K…æ‹r4nó Á♕LÒ‚pS¨=Ï Ÿ Ïsîmèî<£Ú÷|BDÏïa¨N\eI–Óf®L@WìTȆ ãOIo,qAú‘Þ–¢dEÊ,€v»]æv¹£òÑóÐò€ ´Žr€Ð…êÖ‡–icÈ Ë ¬ŽusyžÎ¤,ìrIDô+Zi2`? pÚpR²pšôƒR­d{jʮ竞ˆPED4IéP¥”F< RËÐCô²¬A9å“ᙺwHÉ€©Ì©*{÷ìÄDO¼À@ ]0j ¸ö,‹‡Ô1а.M14¹3•­Ž¦5Z3Ñ€Ëz¬²Ï#¢S{™*Ew cFDWPe$ãn#:G”ÍvβnBèt‡Yy¨-*ð¼©ò¦g®©%çÞΕϰø»·»'hä³N£"03d]€ñyæÑó¼ÀxPY>²âp XP'=¤Å&hðÀZË­zž7ù¼Š¶ðÀˆhmm½®Æã±1†Åy¯òàÅJS‘™ó°‰µ6MS¶ì›¤dE2á³Ööz½ápȆÊV«Åç‹, 2‘ü¨Ûé"˜4M‡Ã!O¤<ƒ,­!¢ƒÉÂâ-YŽJS³xÓ@e@ƒÆj¦JLvÓg0¢IaRªÈå+.϶!CšñóŠiµÊ“N¹¸•$ KEb7æp?9ñ;›©Y~ç±–³dØÄÊaOÓ5ß7º¼QÚgŠ©é&TÂ[eEãqYk%º`»lË®„ëñ}?Œ (å ±ð»bÊ-E.“ÎÕB¥ËN»(qÛU–ÝÙ9¦:#'"„U²V³!šß°”#HZl”iD•4çªÛKKKÂà% hQiBÖf9æÁ"PdÎå„RCÖC"‚¼ ðŒËUžkÀ™v z`ª„¿%dŽ¿víÚÎÎŽÄ|mll¸êXE©aæù|îLI³öËí§b[ytc{(·Ò'Ö¢Xâ#6lGX…OceŒZ(é°2£T´  jÊ Y–Íçs‚(ø· ‘Äëq£ž5Šžcg'ü×®še”θÄuâÞ{€òèTbkÅ.×Ck«W*wÖUàJ7’T< €R±*Íj¿V|γ™¢º<-&bæ$M\e÷«6fÁ’œ]eE¾|Ð:X¯Û!±ñÈNÁ*RÌ*ÞD>se ¢ôT¾ õ2k§îKÆ`je± ÓÆÄX,»P„„9M Ȉ€‰€€(SQ;«%µv!°«eZ+‰ÊtÑ-º”Âí…C³þiQDÛŽ¥Ú~7ˤ=âR\°rÆÆÊ ºt»5–[§£ã×CŸ•ÜÉBû‰õ956;qm)¬tr@=š×޳½ƒÊÕçÚ‘¹¥ «ý4Æ`{äÊÛ¤(º^"Û…>ô€X…æ9Áiì/­ˆb‘i[k@¥ƒ-Oô´sý• ù?ñÁrå½!I4\Cg'²(Šn·›/²ñx,uŽg³™¤k*ØW÷3gó¹ÝAJó\ÂÈìÉùÉd⺽à’n·ú$qÞ#³ðP €Î³¬Ç€CôˆÀÄD$i ® qôÞ$IâÓ‚ÇE‰ˆ æTpÌID…¼/atJ@rÊÞXq4öºÅ•¼0O‹E–E!ÉŽ Ày¨S÷û|<Ê =ø*æ¡TŒb•á r¶-Ÿ”ð\D\rˆJ ÉÉhC·äd×Eå®Rs–4*PM=aÂV}ËÊo¨Ží]<Ø ¼$‰©ŽÅ• §{ÇJ)k¦XJ€ÉþÍ ÈqVdY6'ˆ“,Ί¢7ì‡N·ç„˜0zˆÎcâ|Æ¢Ê#²D!ƒ!]WíâÄ{«jè0ÆÓ©Ý,:$ë~ס2ó¢ [_2„ò'\[‹VQ\%8AŠ”:‡Ž%#“ˆ˜VYÒ 4"{OÎÅRu«¥Çèÿqî úí—@φIÜ ¯q¤¯q½¢—VŠ6å.ä 1#yß›q:‡Î÷h¼¶‡ŽJÖj׈œ °D¥ñŠÉ"¢Aþ„•\úÁ}e ³¯,ÖÜx,–½@yEÞ*D˜wdv%1¹ò‚mDi!yQ™9Æ@D³Åœ¹Üƒ7’4ñèÎÞsoáòåËI'M’d2™lll¨ÁÖ('”!‰ã›YÂùóX8L˜9R|æÂÓ¡7 FÓÞ IÊêRjˆ‹®ZÁ%§’vj'—Ö¢’³.»eE,ÔÕ¦\C:@£û@ËÉ•œ.ÿÇe¸–ÅCá™gž9wîÜK_úÒË—/_¿~=„ðôÓOÿÉýéã?þ'ò'—/_ Ãáp:^¹rEÏÿÀÆS! õmæ+FÃUŽVn%ý š«"×ušX—»ú²«|ÅX]6›Xe­çáÆ@2w%›Å7 „Âæä^5¾2 ÇH‹ 5 Єz-£Í™½–?4¾hõ‚êúêÒë;vœBòõoKƒb5ÊÜ%ëÆ{ŸtÊ#FIIçì„:%{ˆ$œÇú{-±ºzº…R”‚°Û˜M…—.W²SNâ•tKz4.þ®JŠŠJ¡¨V2ÓcÔXÕ5´‹®1†j½YôÚµƒÕ¾¸{Jú)å„ EäE6Kvˆi:+òIídÉ`ä±`Ê(s.ô<5ÙVuA\‹Ão [—X ! jÑ<.»™9Mºl`¹®¦—ÛU¶=*öòúVjodÛ´<^ú+[¡ ¬³€³¸ÚeL¼ˆÝš J§àêZÇ1æ–çØ·‘‰[ztÕ°~âÖX2ËÁt<!µÑªó¶1_-L!?ê0 ûšÉÁ•Ã¬È©Ýøa€åûýì°NQ{ÌœÅb8¦i*Õuvvv¾ök¿öþûïÃß´X,†Ã¡Ä°Hk;¾Úê;„:EÉ•¥7V!:"‡Lä¯]»†Éd<ž¤}Ÿx)„'ÌDœ—âðóÊ{ï% ¼F™ZJ#®Òld•¡@&MVßgcš-w8™ĪÞf…®$“÷þôéÓW¯^Íó|{{{ccãþàþÓúOýîàk¾ækÞýîwŸK’Øélf1‰1æ\`Ç #Ì+ØnÓâ³ýPþ/hY ÑNmÝ'Ç&Ó¬¾®LjðÖª§&MÚºò·«§Þ>_¾¿fÊ–®j<„–,Å’(zyÀŠç°Œá§úY†¶¬3…*h´Áý¡ž2×hÇnOp;-ªñÛÆóX†gŽAäñ²ðH“O®œî!°ºæå˜¡¶¾:‘%³eæ&R YÔú .|æ3ŸùøÇ>ú_~õ¿üØ?ÿg¯{Ýë®íîîgûì‚ óéÌà¤Y#¹"=³^«t>`ŽD]f³YÌÝÌ…2ùSK,‹<ÞÚÚ’|"-Å#m)µÃÆZ…ŠØå$NÌÆ¹jœ~hÌJQfgÒ1#Š¢¸~ýÚÙ³g/]ºtúôiçÜ>ð/|á ßùßùõ¯zPŽúÔÉ)‡±^TÛ¦í1¯Y °¿²[½ÍMš«UßɴʯnQªý £×í§Hv¸4MÐ( Kµg‡ˆ(ž»”Õ€ki/T?³ÔÙ5VJÛl¤,ë y¾ “ÁÌFvB]‰A“ú,bI¨PhTì`Û{‰XmÁHCã¹k¢[Që´‚«bŸ¥W…@N×QO|Û$Ô •ƺÛç £úQ¬çÊ•FƒóìC‘vœË Š‘!ŒÄÉ;„…±äXm3Ccl µÓÈGÄãÊçÞ­¨ˆÌ«ÏD-Ûlk¶[h’Aýyƒtm'e_-¹^΋kiËß–…·–¬¿Ü’¸¢k 5õœ_ÁIÀ¸gší¬á?ökN4lfÀÔnëçýµqê1»Ê•ܰa¹Ð+Üífíßõ5u"Q•oÕ^e\9¯ñþÁp8<}ò3Çã{NŸù¶ðö‡¿ý;þä?û3?õÓ¼úÁŸø×ÿz<›^¾zåe÷¿ü _øÂÎÆ[ff@¤U5¨ÑU~x]qùJHL1%i'Ï>*1.B7uÎͳ…ºEïzºÝ®Ì·ÀÊ"u‹…f© ‡­ì§27ÃrXå¼ ´¿êÄ•PD÷ûýË—/F£ýýý_ù•_9þüûÞ÷¾sçÎW^J3ŸÏ¥°'TG›`öÏA­h&ûµMúV5´™Ž¿á Ãàì`–j¤¾•¸ÚÖ’CûŪ¸¶£ö™E¯þåóì•ÌÊ'ûáYvxÐÚ<‡ F"blí5(ÛþÉ>9â8×=Ç5®Ë§X9f;M+,JO›Zlwöù!ôÌu[¼ä80:`ÇHåªëò/KR] µ°£]9Îmÿ†àYû=„¼§üuo¶WªÞosTïßÚÂëáFK7­¦‡£ãê¸aÝøoŒnCš\¿~}>ýÔú‡ø‡¿íÛ¿ãúø évòbÁÆáZFo1»*6HÍñòl{+ƒ#ä1L#ýŸÿáæÁ'`ÐéCpU.IYs·›Ñ`0»à¤Ðá|>/o×ÁÖqÔiÚ2Á†`c*­§Ñ5TÀ¯´¥5¹‰ïÉ'Ÿüä'?ùßñ£ÑÈ›‚‹wá& ±—¸åg¾mÐlú¹!Zô¹ÐI[FÞ(ƒ8®ùÞ)ÔÁ­—m‡ôkåîcÍwá.¦ÓéÎÎÎ5ºú®w½ë7~ã7Þð¦7‡NšçyHÊ  MU‘$Y(¶Ò@#<­‘ÈË™‹”€”(f„‚Ô£†Påµ8[@*üÀ|>+ƒ)И ¨Äµ -Öh»†Ðœê1¡•Áús+Îå¯ñ±··÷ú׿>ñ©÷~>Ÿ7‚nîÂa%­Ó–Ö½ÓжÈï¥í·°Zš5[×YŠGÕMÚCÍ£c„;%}µ÷gµ}ïÂ]x¾ÁÉ“'xàG}ôÿðßö¾•ò, c`ðe^³ó<ÏT+pýø,GrèzïÙ瘉vÀï)iŸl*üHÄl6 zÙ¸µ2-ƒ¶ÐU«Y kܳ«¦°<$ðiep’$Y–=þøãïïý=y¹L[º¹ªØwáAƒ~VZNX=6<±·ÔÊ\鈾Qhh·ß(4›‹ÊA”‡åàÚZÄ7 wmß»ðILêuºˆøæ7¿ùŸøÄÞü¦áæF6ŸÊ X…qÈ׎[VlÕµ†Dë—š/¹™‘hˆè½ !$àP0!‚C&ä¨àÈ„E¤ècáœ#f.˜G_;*LÄŠ‚[U÷ª-Œu†6«áÍnÿD•Ÿxâ‰oûáwdY&A°Zé.Ü(´ýÏ+Ÿß h›³íÕW¼®K6Ç8žc½¶µ[ÏCœ·º_xnÎÿ»pn?È>ÝÛÛF¯xÅ+>ùG¾ wá+bŒÃáðòå˽N?MÓÁ`píÚµ­;Åd¢ï ¥XSº8Ë "­7®ˆ1„ÐM{a0 ;¹EÀO|ÊŽcN‹Å¢ßï;‡ãéA§—âÑ<–wÖ ûµ]"Ѫ)¶Bµ¶©‹mÛ§5%èláIe[ùþÊSü#Î×øpڮцcCÿ×úKÿÌš$]o£> ¯‚¶j_ãICÿSTØ7Û/蟪¤bC÷ÎÊñhùqjeYÆÌrÝÈx<€ßú­ßzâ‰'þÉ?ù'Î9)VÇUÕôÑh´»»+Eªó<— ¯än5a(N‡¼÷ÿ쟾ÿe/»ÿßûC‘(q8îííI©mç\AJ7sUªóàà`ggGÊoooïïï{ïeÇÉퟷ)¼ã<ß:h ŒÏl%…!²ODk©úð™–…5LÁÈ›çñásMiÌV¥*¬Nõ¾á|ñc‚ãé×§‚{¾$€"_ ½|1ƒP¯Ï³âSí³[£Ê&IÒMå”ϯøê—eìf“YÂ8.æóù|<gÓ‚b^ãñ8/Š´Ó‘TãBÊÜ"2@’¦Á^À`…<׿ÕäÛö+WÒW–/´–Övq”­õ↶ø¹ih·s«¹äm«ˆÀMÃm€Ø!pŒñ'ò'üñÑh„ˆI’¼ò•¯|Ç;ÞñÒ—¾ôìÙ³W®\9þ¼È¹“'Ož?~ccc2™HêÝl6;yò$ìííÉ…Q‹Åb08ç®\¹rîܹ'žx¢?HœóÌ<›Í²,ÛÜ-³«W¯‡Ã~¿¿»»ëœ›N§r)“èãι“'OÊ ½^ï™gžÙÜÜÔ#677EÌ{ïƒAQ+çõB„Ûà¨øŠåc_i@DìJã!„€.AÆ\‚Ý¢(6F£ùb‘Å"˲ýñÁh8ïÈ5êÌì ’œ(‡†m¡Ÿw»Ýýý}¹‡x2™L§Ó3gÎ<óÌ3r•eÙh4ºråÊÆÆ†è)ŠbggG¼Öâ‚~qdÞÐ&Z×Âqdåó¯øb-ÉRèÞÅ#{‹"ñ! )&HD}нœ+Íf³ýýýét*U±D*×.´·¥(íŒæ«¼Â™ ‡ñ}+›­ãNKn®LA~ñ=aj ZÕ³8"ãhÛÊ ýéÁáËýÜᦫŸ'€ˆ£Ñh4½ô¥/ÇûûûâU~ê©§bŒ<òÈoÿöoŸ8qâg~æg&“ɯýÚ¯}æ3Ÿù7ÿæß\¸pa8þÜÏýÜ“O>ù³?û³yžw:K—.ýÒ/ýÒ—¾ô¥ápøõ_ÿõÿøÿã‹/ŽFÝÍÍ­Ñh$ÊõÎpëÉ'¿ôñü¯ÿú¯?ÿùÏßÿý>øà7C º> IDATó7Ÿ={öÉ'Ÿüà?xõêÕíííýÑÍóü—ù—OŸ>½¿¿ÿôÓOÿöoÿö£>zß}÷½õ­oýÖoýÖÁ`0 ¦ÓéÆß±AÃ>ÆfΧ[ÑË]xÞB¹\9tE¸‘`¢€˜$i7$DÔKÒ~Ú‘£)ƒ5›Í‚µÌ,Ëf¨,·:ˆ.l«jÔ\ÇæZ®Z#€íöUë-zŸÝíÃÜm‡•.è¶Ék_xÁyæoz¨mÎÕæk–ÙÝ)RQ2^ªž‡*:‹Å¢(ŠÝÝ݃ƒ9ÜÝÜܔ뷷·¿é›¾éÂ… _úÒ—DÄ>ôÐCŸþô§yä‘w¿ûÝŸýìg{ì±÷¿ÿýºuáÂ…ŸþéŸ~Ík^óÞ÷¾7˲ÿñßÜÜüöoÿöýýý’ýýýÍÍí$Iz½ÞéÓ§_õªW½å-oùº¯ûºüã?ÿó?êÔ©n·û‹¿ø‹øÀ677ßûÞ÷¦ic¼téÒÁÁÁ¿ü—ÿò-oyË£>úÅ/~ñÇüÇ766¾ó;¿óË_þòæææmDí-]Ý ÏPÛ¹uºï hß06géÖõž#{ï ‚Ø YŒP]­† Õ(׉¤ ‹Å¢––d«ŠÕzô«™ÁZ¬KN•”ĔͫÀ¾ ñ™Û%¥¿nþn;´wéþð9þöÁÍxݬ£¢Û +Iú!ÉÕܽ^™ƒÁ‰'‹Å•+WF£Ñt:=}ú´DDËþºï¾û^ûÚ×þÁüÁ… >õ©O½êU¯zà$lê#ùHŒñ~à^þò—Ÿ:uêë¾îë{ì±¢(F£‘Üï= ¼÷W®\€×½îu÷Þ{ïþþþ7|Ã7¼þõ¯ÿÄ'>!.èk×®]»víĉ'Ož”UK’ä‘GyÉK^òýßÿý³ÙìÔ©S¯~õ«÷w÷âÅ‹2¶Û†Ø[ MtŒ$Ô Íe¸Õp\㿠ϬOÐ;r™ˆ¨¨Ìb‰çHÓ´Ûí¦i*çMÝn·ßï»u -êA¯¾lêrB mŠç«ÂêŽU®g@}å@{m,ÚÚÏsØö!ÊbSúš=#·šNcðÉÑ~Á¾†UHšž¾«êCõKïuê‡PG…ü\Ö ªuÑ]js…­µú\n²ÓÄz°žýºŒS¨Ía¿ÒÛìç&Qïi˜Ú´þ*û•@­{|WNêèäag}HÕšÙlB”ÜÍÍÍO}êSúЇ677_ùÊWnmm?>I’ÑhT…¤…Þõ®w}ô£ýÆoüÆ—½ìeuõå/Ξ=ËÌØ,u®]»vî«î¹zõš\¬æœ#*Ó÷§ÓéöööSO=UÅÞÞžsN‚¢¥°k’$ˆ8ŸÏÿæoþf4Ý{ï½ãñøÄ‰—.]ºçž{@>ÜqFo‰ü¦[8ÊkÏÚ¾mǾlo“kä”Û ­|ý^ûýu^ׯ-ð´ª_Ëc…Ï,f{~ZMŒ$.b’m$F"Okê˜ÏëÖºù£ ©1‰ˆÈxd€HÌÈ9`®ø3cP¢QcªÜ Û?Ûw°*k`e•žÛYÉóçÕÊ­Ct[P¯Bp£`•¨ÇpAÝ,»ãÜóè°Nò‚êÊìÄýÑ~ôcûXš¦§NzàÞóž÷ìîîN&“íííN§sþüù<Ï%ÔyssSµ|ðÁñx< $t‹™ë·~ëw~çw¶¶¶¾üå/ommEñÔSOíœ:uJò Çãq’úá°ÿÇüÇûØÇž~úéÉd‚ˆçλzõêÆÆÆööö`0Øæýý}‰¦Îóü£ýè£>*ºxžçÞûÙlæ½—Ïw…/¸³œáá…²¹ž‡À̰”}P~0”sÉ¥KÅZ,Ûº;l5%¹¾ŒVµÎ&Õd°<äe’ `Õ§T`x~­}cG©x;öŽVZëÆÓÞçv` ÕìØ‡º²ëöØïZõ¬‡Ü7^8.|§8£šoûÛ¿ÿû¿8JúAžç§N:þ|¯×ë÷û'Ožáwúôéétú‘|dkkë¿ÿ÷ÿþ÷ÿþߟÏçÃáPRÞþö·¿ë]ïÚÝÝFÛÛÛY–%I²·ò<ïõzÃáò“Ÿü¥_ú¥7¿ùÍï{ßû677ê§~êâÅ‹/ùË?ÿùÏË>N§yžß{ï½—.]zòÉ'‰è»¿û»~øá¢(¬•œ¦é!§B/t½nü7J']vÇepc+ Üñ‘¿ø`)ïÌ•€Xé3;½"XA.†5ñب ðÆXµð5\ÁóÁ\kÏ«=Í[ Íè(®°CFhÇyK‡}DhÁ~m8²Ú/+É޶帰»»;ŸÏ™ùé§Ÿ¾råJ·ÛͲl<ommyïŸ~úiÙtW®\™ÍfŸþô§ÿöoÿöð?÷¹Ïýáþá|>ϲìôéÓišž?^⤈hÿÉ'ŸÜÛÛK’äúõëιù|.é†?þx¿ßÿÞïýÞÝÝÝûx≯úª¯’š”çΛÏç×®]“£è^¯÷¹Ï}n:fY6ŸÏ{½Þ™3gæóùb±#«»ð¬Ð6]îì`vÂ!ã9¢Þÿ¢^ÇÞ‘J:ë'FD‰ÀÒ£F'áTmhH…†nƒ!´Ö²1I;8ûÂó–± ŸKûGl\emC×±j~>Þq¶ÁÚܱáS[*Wãåu?|!Â|>?wî\§ÓÉóü¾ûîÛÙÙÇ"CƒÁ ßïK t¯×€Gyäá‡~ðÁßö¶·ý×ÿú_wvvÀ9wæÌ™Ç|{{{±XˆmúŠW¼Bª½Im€ýýýýýý{î¹g<KÕèÏ~ö³išž>}úòåËÌ윻víšhØ"_ò’—<õÔSˆxâÄ D¼víÚùóçÕ}g±÷Üá¶)pw\îÞ4ܨ pŽ f(ˆ•pè$ID /ÝÈ Òl«ò×u¸!›Û‹ÚhÐöø|^õÆtnÝP.ƒ#i¼ÜÌ·Ú€úúÚÁà* [™ÐÇÎ(o#n@žçÓéTÎbg³Ù… ñïü¿Óét&“Éb±pÎI½‹$I>üá_¼xñMozÓl6{ÃÞ°X,~ý×]ÿ}ß÷}!„õ¯þÕÅ‹¯^½Šˆ¿÷{¿'‰‚ÞûË—/Ïf³Á` yÀ_øÂ.^¼ˆˆúЇ†Ã!‰9›$É™3g˜y4íïïgYÖëõÞõ®wÍçóŸÿùŸÿ«¿ú«ÂÅ‹U[¿Sx{¡@ƒ!Üq>Ö0ŽÎ¯žW³xq@CzŠ(qÎ¥iÚétD•¾\òµ`w]Cég©e{-cq« YPU‹ÆºÅ-ûéŽ! ùV+ÎGA¯:4åVÖJÙ|+`eë¦ÀÆÉÁu‡GƒXÁDÀçpo;lnnÊ ®s®ÛínooÀ¿øE EffÉÊóüàààãÿø·|Ë· ‡Ã­­­ÅbñÖ·¾õüÿñ¦7½éž{îùš¯ùš÷½ï}¿ÿû¿ÿÁ~P⥿ök¿ö5¯yM0O:5'“ÉÆæÆC=4™L~â'~âĉo}ë[ßýîwÿ»÷ïÄPÞßßûÛßþs?÷s?ôC?ôÕ_ýÕ?üðK_úÒ×¾öµ?ò#?ò±}ì~á.^¼HDo~ó›ßóž÷¤izíÚ5©DýâƒãÝË Â>Æ–on0ë><ëïªVÇ \FPs n'ï“$I˜ªÚSzãåy./¹ê5ȲL²ä«òDï}’$zË^CÂê¥ÈÕ¡2aŒ1æå †£㈸X,¦Ó©ôóÞùÎwþÇÿø¥h­„dßhÚLƒæ¬±µòýu) Óm¥%wHûG!}Á™: Ú”õ$·EÔÊ.x¥=ÚçMƒíÎÕËz+]5ë„ÛÏ2*M7jŒvbtx:G?ÇÈY¬rӠж!äÝëõBóùd×Hðóh4"¢¢(ºÝ®Ô›óÞO§SqR‰},ûe6›íìììïïonnJfÑ`0È󼈳ápTäÀŒ÷ûÝëׯ÷z½ƒƒƒÑh’t¸±±!›½ßï?óÌ3£ÑHR×&“‰Ü°téÒ¥³gÏÎçó¢(¤îôÎÎÎl6[‰„£(¬ÏÉ ¥ÿŽ(d‡¬lûs›íÎ]IÏ7*¶Ÿõ}[*Øö»®FœÝ³n“ÃyÑó™‘Ëûÿý‘ôw×e¶» 6Ì¡èbˆY¤$}ìÿû,$Ý"+º.,0&è8èE‚Cç@´í$é8ç²E.—›0ŒÞZWŒ„¸Ê;òˆEKι¢(¸ª ¤^V•:d”ˆˆä™#Eð‰€È…w¾›v˜9[,˜È£+b^Db¤¢(|Ròéx¶½½=N?jÑJ¾'…UDÖþ¿=Œgµ_mË.Ú¿µrKå®±€ÛMÙçÏqŸØHx0r·qØ|8Y)}Ó´í4ðÓ–|+Ç u?¼¨n–&á³*RmUCèg‚ˆˆÝn—™5¥G4’,ˆÃ!WÇB¢ÿ…˜¹ßïKGr¬[~î&ólÖíw‹l޶ˆ(8ž¨ˆvŽ ‰i2›&4Fî÷‡1Š®œxŸ,92Ãx<6 (Ò´›ç ßÜÜœL&2æc·ÛN§ëÐusûî¦A²TGÏ:^I™Gœ{Û,ѦV*+áâÍÒ¡[sÉ<Îë0 •ßõ†ZC\—övƒí0$!Ç€~ss}‡£óÎåq†eøQæ²_³¤ëÐáœËYêÓ‚³ËO`±Xœ9sf:Ê -;;;ׯ_OÓt=*nÔT“çÀJVŠÞ[Ǩœ®”¾ÇÕø!ÐP5Žmžr¼JzCzŽ$qs`¯ÛÜó]¸UÀëhž;Ü;õöï Ûµäæ¥žÔgíõzׯ_O¬ó¬8Ûm:­³Ìƒš­Péò`âT­®,ÅÚQ®B#žêVf›_K|G;bK;Ôho¹&÷â€ç!–,ol|€c`me÷¸ðpH;·Î|¿ ñ¶X,Y!E1·"Ióqo™H§z³‘[É;ph¶Ò!­7t·U©Ý¬`Õí·(ŠÁ`pîܹ¿ù›¿™L&[[[2âcÄ‚Ocä·ŽÝËdˆãm¼!}oèWðfzC67ÔGh-ô ^S¸ ‡€¥ÒçB±·” Ç5…c l”$½OúÓ÷ß¿=úÚí¤J_½{7„P+ÄÑxUå"Tkie07µþÐÎP%nchJF7¤/dY¶¹¹ù–·¼åþÏÿ)MÓô‹Áy ލ“ˆ5u$ë¾ÞïQàYê¹A[ù½!X7fK! œÒNc`í °òÍ•ãç²T·÷¸Šç B^L°Òü8F1ÆFDÁú@­öŸnc¾ÕóRX7Û RWUR {챿ûwÿîÆÆÆ|>oK¨†ì»¥ }É5¾"]–eRŠre=vɺ•Sr±¥U¥+§¿ú“$IbŒo|ãƒÁŸýÙŸ]¾|ä&¥cfv¬”¯Épi ¨âÓ€›ÿáp+ö•^@i‘pÓøG£Çßoè’Ù:n·g7x÷]xB[¡I’Á``µ&sÈ˼dÛµŒgi°Vr¥(²rÀ¦01/#À­¬Rc¨ñ¼ ÜŠ •pÈ«-9+Ë%ADSÌÆVI£ü]ÿy¡Ú1T§æ1F–Ççòs•Í ‘¿JÁ&YhYY¥ ›9Æ•˜ït:ÍÝnqn‘#ýZF-ຳkÿo¥£ým£GŒ^n<×%{÷ò<%ZªMÉ4ðé½·Ä£«æªòpšà.%ûÐ’Švmñ)hòkO03cIÙ‘#a$ vL®Ó0Ê))¨ð)\ă8X}‘Ãê„«+­ãm\RѺ¤,¤Fk%ÝÆ?P¢JïP§»‚v„í–õ¯+‡ºNZn4¨3P}ÎìþjônÉu9µ–Öêó£5 ô!‚otQâV+|ëúXuZ²©’Þhâ 7#_£Ñìj‹-¥ü¾Úâ¬)@¦¹NW¤UžçÏ<óÌã?þ¥/}iwïàý£ôÆ7¾Qª¬{ï766ä}eê|FÇÐ (ê—ãñ ‹"õéðÓù»Ä'àÄ\®cXz|‘™;޽4áÌ™3˼z ,¿A‹-,—øç¢(þìO?û¹Ï}îÏÿüÏ/_¾œ$I¯×“»Í5°M=ŠòA,0¿ú(ôI#¤È9窫GîE._`—$‰x&Ù˜¤`„·•ŽyÌ W~â1ˆàT°\¡Øè×"D…›»ÊÕ¯û_–@}ÂÖ½&_Áø–‰(Ïsõ[èóÆq@cTₖ¢:6"K«0zD” ÃÉd¢#± –ºÆŠm¨„®ºý±R,,2Á0VûPQ¡v°vd÷¿øríZ)¨)_E ÊÿY–ÉmY–AU´Y‘Ï•¢ö1š4q¹ÚOÔ2Áªþ W `ÌJoZƒ=IûUõ òìØyt .RŽ{€ÃÌó±ïoα›Qô."çyô>ô´h[‡hV b‰v=ý±¿Bã&)fæk‰¨€:Vå¯~ ž ¯ †Ú‹‚’$QÍLYÊ’qÕkÁÚ½Vü:ì$U+îÀõê:KÔvJƟ׻ÕÕtØÌÚÃÊÆ„¡?ADI7ʲŒ™OŸ>ýÊW¾òe/{ÙC=´½½=s'OìŒ'Ó½½½­ùo¹®À±NVxSØ9G+pP"S¶µnòö…ÆkÌk=XkºñìC2‚’)÷û}‹Å‚ˆ666œsûûûoxÃzè!¹?Çãñ•+W®_¿.L6I’N§ÓívER #S‹Vͤwi¶!ƒ 7èÊżžÍfbÐtÓ^¯× RTE#Æ;N[$ ¢ ÁÊ„€òP–Ë‘ÈÔ‹…ðk˜Ò^×<Cj€Zñ)âJ&‹•9hõYréKž¨`©)½Ègf–Ë0‹EŒq2™ìííÍçsiš‡Ã“'OE!#å¬×ëu:N§#KÐÀƒláQUTV‰J¡ZšLS±‡”r«ÖEO• Z?¤i*XR³Õ²rŪtZÅ|>— Bä\¡%0g 2Ef©AV5œÅs£rBš/‘ªÊ.ei²,›Ïçóù\°JDBxÒ,Ép9x äqÁÑsqÒ%§ÓÎ`«Ë›''É`óŽƒ@EFÈ¡ë)k° %•67Y¹ë®lºq,s`æÜ0P®¬ å˲ùJÆÝvŠ44ÛKc^m¶-®± :ùà1?ÑxVaR&!MÀж¬iQ³ÙÄ6»FsTœp*€•U«®€u/‚Ý/‰ëúnœgfˆM‡\ÖYÆ“ƒ¶ó’H¬w'4XIØüS]p(=‹l™„¦óÙÆÖ&]ºzµ×ë<}j>Ÿ#¯ {D¤ã«„%#kp­u¨åŠ£¢ê{m"^vV²³¦fÚøÚâÊY„ŠD>ů^»,×%Š?P„ÁÙ³gƒKT®•@’$³ÙLØ«2¾’ Š.©&…ÇæHi%¯Nq²"Ÿe‹ñl*]p眈ÀY–)‹·KXZ–¸´Õ¤Ž1Ê!w·ÛEa6›I©/‹vË©…AË>—)«x&¢4MåÊt¨Èz| ’LyéÑ© òÞ‹ðƒF=n”Óôñxœe™^~%ûl{)åÌs0øâ–"å“jŸT ³q_ÌÐííí³gÏîííeYV@”+TÅŠI“ç¹ÄÊ+EýŒ1‚cu¡ËË"7†›BµÖ¿jUoaŽÿ•õë:Y†Õ:çÀl ÷1ú*Z2I’~¿_Ö׌ñêÕ«m!D#¿UóãTZ€<ÏŦŸg áàÌÜétÒ4aœ·\^fm×Q$Ÿ˜bb «4ít:'NœØÞÞvÎ]¿~}2™H˜.ˆu8™L”qXûÛR ›’od<ÿòŽLA 6&© L¶Î]™š6hÕKx¥^‚–t¡~.¯K±úY I·Ÿ­¬T„RÅñ>I¹OPI]r «b5‰HÂþÕѭꜹȼÞ3¦ô0w‹àȾH.0YI$ŒÀˆì‘90ÇžcðŽjg„ŠmŠÕ¶Eëé]wt»ÆbÓ»Û9oÿ„DPÆ”;ëlׇ`0VØN;Á 0],V¸vÁXähb˱®Ìa»X·Œ—Û¡p¾îí?¢3¬RÞLa)>Øxïr ÞJv­²\YÛZ{0[›³Ùìúþ^A‚só<ßÝ»~bgkº;t;³ÙìÊÅk'NœHÒdo|ÐõIC5)é™zƒ†q9‹ºnJD°oAÓœ«E¾•úÔŸ³}m¿5c`ªÑ·¾¦GÎâ“¡HEQˆù5›Í¶¶¶Bׯ_ϲ,I’ ‰Ò""yäžóƒƒ¬«ºRZ¤ÓKeæbÕ1³Xlûûû"Õ£%#)°ÆX—g<•$@D‘pjÛÙm¬X‚Ëä¯ò¤dÄE®‚_üœòÿ½÷ÞË-5ª‚$‘¡+ïK­ìƒƒƒ<Ï“N*DD1ŽeóéLĘH_uX©f Š M 8¹/ÆØív·¶¶Š¢xâ‰'`2™L&“£8Ÿe ׯ_—AµôP@¥¦å†µîª{f·¶’„]—X]D­¼‰«s\YS¢¥ãKþ—9ê4™Yü±Jç°ã”v”¬/]—žªL$Û;T†»øìy„. V0£Ø–=Þûíím²üDZsÓ¶Œ÷¾—I—Bî‹nšú¼˜…ÁÁlÁx>£<Ëc‘GˆÌ€Dθjë¼ø0‡XøÙ±E—îtE‘‚}Ù%`fë9¶} Ùs£p®sª‰¶i—@?ƒe‚F2iT<Ô—3'`tn¬ûŸu:”çP1 åcãœo8iqm:P‘[åX‰MŽ,Ñh¥¾ªJ¤¼K‘㜓´InùçÖ þrP ‚|ÃÍVÿ` ÈF *tWOIæ*8@f(¸.Ê-å':Mh•íN¿.‹4Må^m½T>I’K—.9ç&“Ižç'Ož€ .œ8qBœL–„J’X“vµŽþ×A‰·º\¬|?€0ÐX¶J¢ppå/lBKÊç‚Ôˆ/gˆTÇP&Ï(Œx”Û Š¢˜-¦‹Å‚™÷'û>õû“}.x0 û£N§ÃÄ^GäŠxö¼÷ƒÁ ÛíD»ÙbŒ>qàBâSfŽ1‹9¡C—/ŠéxÖëõôœÕ.€èÐCŒä{i'Ú#zãO. Ü€¢~*6 BD7/ÑÒ]&›ÖcÀ*ÏÇUN†n$+_)rA“N¹a7 “vbŒN§×ëIÜl6˲,æYð>í÷ÄÈöEŒ ô•% Ê#'‘cˆ\dˆ· éœBV,z½3‡Ô÷^z}W _Q€Dîv:~¿/®9EÃNWGÐ¥Ø<«÷Ì)¬ H.¾õ&êX߈(í&PŦ‰AIÑ#zçJ§‚žØå‹BÍ2î/~*ËÅUUޞغ3såyÌ<"úDtSF€8r®,ª¡,AŒ‘¨ÈóEŒ…La0è ‡ýù|Ž>Ë.Õ¦"bH"èÁä‚Ðað>‰!¥ÌHâ³QB¹áâtÄH'“Ѹ}&×çýÅ^çÔeòH£ÃÄ-RÎ .°p‰Ì½½šÔá"”7À0¨) àam“ÞKÎXPT &"E"¦ÀXâ Ñ£cŒdsc¼+Y}ÙKéÓfžDÝdXe08\2e¤¸µÅ¤w£CçPÆVE±1zï½ó«©!/ƒBÀ Ä08Î;ÏåU¬HþGD戈=S̳”1ì""{ïa]Ôã$U­rÀ̽PÔVä$Âl‰) ®"z•<fŠ1Ï—yä5?kV ñCÌ]pKã[ðz§;Hw+3Gˆ¶]¥ ïÓê3Wd…,âTE¬l9èÉj!³Ó ¢¬HjlP?¯1EÑC³¬X8ç’4I]BDy‘%¡“çùlºèv»Ù¢(Š¢×d‹!.SØõ«‡å“Ú¹ýÎ,gŒ#öBÊcÆ}7⌠ žS‰råÏ ñGÔívÁ9_é‘Áû<Æ ú©:Tiè&J÷JúXÅ8ºÖP.ª½½½étÚK{r,¼^ÈWL"q;Ïf3)nb¹³¨Î9*˜MÞºNGmÓ†p-bn52¨s¹mEé*(çHFCUÇÃÊéÚUñÌh"–Õ ·6·Àb¯¼µC½X ÒN¢¢ƒ÷^®k !HÔ¥@¡Óé8çÄ;m—XÎ†ÅÆ•Öä S´±Ëu5Õ>&"çJo¼Ý‚¨2ª·éI¼¥E…âÖžrAu@M0³’–¯l5#ÄF”îÏΜ "ÇeËJ*}e±Ä‡Á¦Ê‹M^`\ÚÖº(P©S\vpu ½»»;‰¨ÛíÊI¿X±ÓùB~‚ Þ{L@„½uNêÜe:lêՍůŒ!¤ÞS@Sßé'½NÒÍó¢<´#Ž‘cä‚‘LÉ]‰ h>W*]½Cm ú&Uùîh‚ˆ¨¨Gá ëdç|£—†¯²´Íõ瀉ä‰Z¸Ë3H{T™ÌQ²å”•^¸º? Q|ËÎ0[ ‡à‰rŠ ì€sŠ@ŽªÛWeƳXä#Sia;‡Lì ¼ªU&å’Ò…DÒ£wˆ²Ü‚Ekb"#“ãÚöAZVbh¬TCD•³ÌW`]A‚D¤z5YmG­…’,a9k;šôÒFd6V Tÿ×¢»µIßjß¹eÔ˜­iêQC’(ë\è@•M å˜U¶¤¤Ý¶‡ª»!ËÀŠ×3#S©NxCÀä]LZ—زɶP| Ç+Š"(§PcWyV¬‚b îhlcgBlàÈP"7FñîÆçó"‡ÃÔ—ö®H‘Á` Íf3 .ït:'Ož¼º{EĆ&\Ê91òò”N„· rÑàD”PÞé|"$«‰Î%ƒ—°)A‘˜eˆXP®‚ÁrÒ†ëŒ*OuÌ«ë/œ;RøxaÀòâ"+„¥ \þÏX¥Ó,¹2zå!83‚ë2`'íÊ jÄÍ ÍÝW±ó,'F`ì¬ã5ŸCfµTJ^aR0¹$³å†€@€%n*ËRVÑy"ŠÀÄ,â²ÄvŒ•úÁì†ÀˆÎ{ßIµYgjÑ×ä}i©×0ªïÓ-M +«Ô„mÐbí8ÀÒ›´§¶P¹Ž˜ØõRF1Ï3ntûù|>O˜9MÓA¯/¾¾{]x‚÷^M…½½½uyT7æ•$IŒ€\dv¾‡€ÎIU™Ò©‚cçB]Ђ–è©Â¤„e³“3{a¸Îa):¸.Æ+ÂZŽÛPÚç|¬‹ õî¼ßÓé”™w¶NŒF#ˆB›››ò«ÉdRZ!‰(ò@xÜÁÞª…óN¨†FsµÃ•ÅĪԥ¯b Ô<%sô«O¬ V¤‹ìUô2G®í½=T3P Xq˜å™î†ü¿1Ü,}­y.iÐ¥BPäBdX,Ê hr­Œ—³OɉÝEŒæ^¯Gæ ]‚œsƒÞP@±!âÐæûªB`™².+W’ÛA9‘‹b,JfŽ:cÁD$hŠŽ«Ô×]."—¬D½ÑÄÆE1N‹¢'Š]>¬§šdE]ÕØ¢– É‡©"ÏË…“øAÁgžç‘AÜD’x¬Ö¢Ì6/ãæ„&mR¸Õ]¼÷©Gø£sÁ¥¡ƒ8Ë3šÃ|‘gyž‡œEœÇ˜ƒO10å–ߨ ëÿë°ã0s„å®·œ4+²åo-“¶ëŽ­ò“lì!Ù‹läúrœ¾á|nz¤É8`TlënÕ=îêò@;ÒÔy‚ŽªS›ˆÏ$Nl†:Ó#Z:´,_uæØŽlñT\J퉛¥-ä¯Þ# §©46÷uF¢I ÷Ë¡¤´ñ‰à¨XzzÀTƒ`Àúr”¼:šR‘5úášÂ·¤\íúæzÜûr±¨IA‡²R!€x€ˆ‰I”¹kW¯v»Ýш™‹Åd<–ÝtêÔ)Õ׋ªÚšOmz.êYV–ÉWR¹,H!°ðsLp¥Î¥HóUM7ÎDtê|ËØ}ªäîMf§E¨è¼Jß誨Hºï„ް`e,¨é—ªTZ! ^¯w0ÙW«K…¥$ÌÈDD™¥ÊÁ.ñ2²ÓD¨—FI§ŒññUþ«i7íilŽÝB˜/O­U-B‚wð¸tí*àÊÃëçÍ0H2q‹žÄÌ—RDd§È×4 âRFD›ë•B­*…ô.Ù±Âô‡Ã¡H'I"‘\ò²˜qyžû#1ÝdTT•ïÀºóÖ›èqªŽ ””¥¿­²Uh ˆ‡Y–X¨1¤ÞWYOJœ–fÄRÑüoÀTùº½©:"*6$];“ù#AÄ‚rÕ{и•b¥@u‚€ˆyžÇ˜«ë«8öN§3žÎ„ (‹£| „$hSˆÐWyn…©Ö©q’$%“n·H‚ëô3—¸4ñi’$I ê0fœGü·õW“Ov_¾[õsÉhéŠ,‰YÈÓýÿì½ieGy(øår¶»×­ê®êE[Kj©%ÚHÈà@fÁb‡¬@ÁÆ?lü¶_€qØmïƒÇÃL`F›ÅãÇø&0F< µ£ÞUêêêZïrÎ=[fÎ¼g¹]Õj­è‹ŽŽSçæÉ“™'óÛ— Þ]_3#!ŒÞçzÍÇ[ˆ2St(%À¦ ½8»"ʲ-+×8§XÒŽénưš_S cÊxÊ$ ¶ø6ݹš¨?ÆÚm"·>ãþ…y¬T¦¦Bº2…Å™ßB(§A¡ÖFI $Ï$`–åÀsJÔVœ=(:¶(›Z=üUZ‡â|-ºµÎ“[§œƒ+2?"®›ù‚Í­Ü–ÀÏQ«ÕDædêp˵ll6 3Æ!Aáœ×j5LrW5éþ¦g—ˆ(W/û2”T S’ÛÔG6³mJQ)š«)B$JÑH‘ Жl%•”i2Š#®gE ƒž¶>zßLº9úí1v<„iŒu ¯Á9 ´£ßŽ˜di´êX¡’EÍ"q%™7¿ž7²êcWø'·Ç±7`$‚Ð3Fø¹2¸WØ2 ƒÙ2‡eÌ-Žc“™BØ”žõ!$„¸Ž+tìrÆI¥i GQa ±Ì”±RJÏÛrÄE—1N=f *ŠqãâO¨ÆÔoׂ,Ë|qÝâ8F?CSe‚Ì86BÒBmÞb¨³]1m©”õS“&.½ Bˆ8UZk¤2 2bÐ~Í÷ £c¾BoN•n‘wÌV$³|h@Òöf‰ôF%„ÄñVjIK)‘ŽêÏJü”Œl-š"BÏ,ášþ@" ÂÖÃïöTFQ$EQ%™Y&qLˆe1ÁH:æ/%¡’! %Ma’>™hÊphùñ4Ω١Δ”»OHi8•B;®L·$B|Lšh·” éºÆÎhÎjƘBæ½59Èñ¤Æ*ÙÄÜf (•Yâsúø«mÛ Æ?* 2˘8ÞQBP©8‰fg¥d"@ûƒk+E¢?ßć ¨ò%(ÝQ"¡”R ÉʨRÄÐÉk’?þS¥æIÁ×*Jm…u¿Ô8”€†W+Pã„Ò‚B!©-:Ï©ÎXšÛ9¬*Ž-³£*kë)ºu0Áp¨JríÚ¶B3¶R”…æ‹8N•Rlì«C´`ຮ>ÂÚ{w8æ¼ßÍks'ëÄ,q7¢Y£X¤Š ÒtccÃMÁfÌe<Û¤ž³iE, ê±§™³®Æ9VEÿ„æÕÔ¶.-VË,Mš9™)Ú̀LE4•R3í.¥tssók_ûÚ#<òýïÿ‰'ž@^Ûxu×Üš„pjá¼t˜Ìí—ËáÒý%ËÍ}-\ŸDÄæ}ÝË‚hµ(ƒ³C4Í,ÐZµEé–·¡¦Ö€ñÄšÄB_sjéMY,J©V-ê9" Ð]ÓxÍëh½v†¦ŸE,Þ·¹ƒÊ7e¸BÌ«¬Ü¶Ýj+ûÎÍdC¿§¦²(2}ŸÛL‹¹ø+ª‹‘XšKŠë† OTF8M-ÇuŒ?Š–Ôµ–™ 4dH˜Èõ­U‹­od:­(6<êÈÓH)S©6£òÿ·,K˜;>K)£×M#ôh)¥Ô”+H¶¨qwàñ¦HùÑ'Ä»f†Ìmø¢ATd©HW¹’&¹ý©ž‰msô¸&uo²úŒëý¬ ŒÜ0Lć€Ë+ÉÖ¦57îY³óÏât˜Úúˆ·RJS34Èã1èMnQs3ãÇÚʨe¾=N·Ü‹”±†Ýi~7ãPEiãÜL·¾Å–IqbîRŒ}÷À %„™U£¢TõRäÓ–;,(Jð'nü0Ù§,Ö{07çø“vLÝÞªÈ\& ‰e’Ý»w¿ä%/¹òÊ+_zÓMFƒâû~Eèꄼbœ»hë-øeѤž‰ó ˆ$ @%âp´tú4ïù6¥.“¼Y3rfcÈБF˜J©-›“¹ÛL!dŠ ¤ŠØÜ4¹YUAîëj¡* Ãz½.„ˆ£c<¾ô¥/ýõ_ÿµçyW]uÕÏÿüÏïÝ»W;cBmÅ@’Ô~YîSrÕ¡”’YÔ”üôRpjå¶¾N¿7w€sgUoz™–#,6™kIo,kÆÖT1S†Z ߬2‰_e©†9çédM<¤”l²ø„Ì<¡r¹g±1…­°"bˆ˜*³³jQŸe¬$I=™ô?71/ïõ{·X%²Åè!ñ,k‡2Hã¸+µA€!C‘&»s@»8Ný}õ,ÆŒ©Ìïóìý Ç͉\NÇ”Áq:9Öx’Ë <@ÆÝ‚A½ôŸø+D,u$$~“8›Šö\:Ç­æé ‹¥k³í>±ô9Iâ '¢‘ÞK¹ sß’I|W&7óÖÌöªþ.ãGDy IýõVï“I›èVo Ì¡‡;eLM5Ñ]™çbbA¶2ôe¤È8eú8o XÆ9*2~Ú¥ûß,ÎA »{n^`œ—Ü4³#™šêë8ÝÂlO‰ UóÖSt"!‰þ‰QKN*ÿ!34@0£øÍä/ßdNN-7}!ÓòL^ŒÛèjƒª¬ÅÅÅïÿûŸûÜçþæóŸÿÙŸýÙ×½îu»víÚØØ€L•X\ÉÜôs×c¿õq6 ½9 á\¨T¤a¸ºº –O¥t™”ž…ª(òj¢RÊ62ß„Q J()”$©Lt¦ÃñÒg<ĪhhÔ£Å#LmÑð»wïv,µydR5±µŽ²d’*“¢«¢kƒNñ¸¸¸Øív)¥£ÑèÓŸþô¿ÿû¿¿á oxÕ«^¥{.b„"èå>j˜#T“Ìliûªû9Þ¿Øgɨ-´HC+¦† ʸu(ƒÒÅQ“’qsO妖c)Î:_sÝŠ=Cq_U@ IÎÈçô§¿÷¬Í¤œàôuƒœußMrˆ»ô]¹þMì?ÖRpL2ePóè;³_¨:•þ)†×N*w”Îí½S:/^Yp0X³qF€åô§Œ'צôñªño—>à»ß»ûSŸúÔÛÞö¶_xÏ/¥iÊ-gœÃXlc@0HÝf!AÇß’ˆ)F‹ûØ]w%Ô’¸$Š&œ2×v<Dz=×vmnY`±:³15½ëz¶mS2NeÈÑ‹D©1ÿŽ^!¾ï«L_‡Ž©ÚÆ‹qÜjj¥iš2’ª¹šØâeZ õd ¤”AìÞ½óUýÝßýÝ<ðÞ÷¾÷â‹/Îa¨³nj(ïôã•ú!‡¯5VÍѳóµ}UÁÜnŽYÔƒE\oÞ¯¡É0Uµ,*ɶµ &lgeιÍsk잯óz~ƒy<‹G5SpÑ:úÔ繇úßù¿ú«¿Êï¼óNDJ®ë’Ì' ¬ŒÜ¦Õ ésiÿÜâD%@¡AP‘H!€p!‰©@¦Bˆ(‰çÀhè*k{^ÍqÎÆÎb\‡½bÈŠëºq÷û}ÈrJÐ̳‰bÛ6³Ç®¡:êUj©Ûœˆ Q±iñÅŸL1ΤÊ333qß{ï½_ùÊW~åW~åÊ+¯D¿9“6”.-8:î”*T %9ÈdŠ(s^(qéQ) ʺ±&‡E–¹”Nï%i0¦IH^…õ$'˜ƒ 5ÝT)¼ØæYz­vº>Ï?ùã U‡Wƒf£‹Œ¯nP¼n¼ïvÆóœƒù]»[­ÖwÞù‘ÿòß^üâ_qÅ¡½{çŸ8Ýjµr2Î7¡[NsB™™ØÍ¢æÊH™2A„€+¯B$DJB MÓ¤”’¤”rF(e6`×ñ<ϳ¬qšŽ³X€†ÃaE(£¡`„hLm6›H)]˵m[‡Y›“Ïn’:1tq4sò"„´Ûmß÷gffþöoÿö¶Ûn»é¦›z½^¿ßGGè"T!£Ê¾OFÑT%_B=/¨sÊQ)ÕF[jQµªŸ\ãÒ·ið“)ßQƒLZ^«F››òyÞ“ó>½Ó^ ÄÏ]P[)Ó]õ\LiódÆó\‡f³yÍÕ/ºãŽ;þøý£/þ/­¬¬7²lN&ÃÓ„i³T!ÌIWÉË Ç"I)pJ(%„¡@(gð˜D[´ObR: "‹ÔHR‘JÁyæíûþÆÆF¿ß—YUTa=Å ®@GM̤ã@”œHzW ¦eŠ¿¦b“e…ÐÙõë_ÿº”ò­o}ëÊÊ clvvVç 2»…ó´ùŠ}êï´MâtV {¾L‘jæè>Hú¾žT©øUüӼν¥ÈFÐÉ(,Ýø™¢y¹õ9|Ï9§¸Âç&?å ðœs[æ0˜Úž’ìüâ½)ãyNƒcÙBˆ~¿Õ¡Cûöíûÿþñ¿ßòšW7 L’ƒmÆg3»Fk)£îÙTgq—RÀ°j…É(§Ü’RQJ ”QFtY%©$H"d+ãL¥’±m»|eeeuuu0 TŠ’n­VCҫ˾jwj4K)1òšL$dÃ;  UYÑ4®˪¸®û/ÿò/7ß|³ŽÁÜX¹%.•íJß²ÍoV*êµÿm¾÷|mkçnšcЄ'çÀ©2€²óVœTNÞ…j W$ü;š×vÚçæXÚ&·>j2À3O~‚¶ÿù+ AôOUð&G“krÖ…Åg‹§SÙâ§Ì+ǯø`«Õš››ó}ÿôéÓívÛ¶íÑh4xªöï¿àÌòº”²Óîôúiš6•••‹/¾xqqÑó¼Ã‡øàƒßýîwo¾ùfBH£Ñ@½Ñêêªçy «««½^onnîÌ™3ív{ssÕ?aÎÌ̬­­=òÈ#¶m/,,œ9s¦V«­¬¬!†Ãa fff67†BDBˆÁz/I"¬Ç¢ÇvìØ1ÇqPtö}+´¨¬ òÙ½^¯Ñh`ÜA’$gΜq]·Ùlú¾ßjµÆ•(ECÒ bÐ3Uçâü~šTЕ@‰R/†RJ)I3ßPJqB)Ä©r|ʈa”~§œÛ”r$Ÿq[–ÇñÆÆÈ0 Qíû>úLÕjµf³ÙîΠ}kùÔ’Tryy ÂݘuI;45HM\‘²"À¤n/¤”B‰qAV)uQ¦ÒX¦R(ꫯÒuZ(Š\lYþ]¦<=Œý+2 Utq;lŠÊú¬üÄv$NR¦Þ/’á*ö¹txÏuœ>;;‹ÞI(¶¢Ÿ?nãùùy˲Ž;ö–·¼~øá»îº ǹýöÛo¸á†ápˆ²ï¿øÅo|ã£Ñh0¼ï}ï»îºëÞÿþ÷û¾ßétn½õÖz½þ±}¬Ýn×ëõï~÷»ŸùÌg–NŸdŒ¿ôÆWüʯü/Q˜H)[­Ö>ðw¾ó=öØ¿þ뿞:uê®»îúú׿þ‰O|bïÞ½ùÈGVWW¿õ­o}éK_Z\\œ™™i4aÞpà ¿ú«¿Š.c§Núìg?{÷Ýww»Ý7½éM?ñ?±°° õÕ„Ì ð ¯øÓ ÏõýyΰMôaNAIPŠ(B aTI% ‚ÅàEJR ” !„Š¢„0P S™!€µÎVôoŒã5WRÊ tËB]S£Ñ˜ŸŸŸ››[ÝX?|øðâââÑÇßvÛmýͤi t\wåZäÁmÛVJ£@4ʾh—ғѪ„p"£­3HlGQ©É˜¾("ˆâ1‰_)U(•ðÎ/”ªâ`Î*Ö—B¥›,d½Í©•’áªÆUbýy‘韆Op^ ×ë¡Jõ·xíº.2¼Ng}}ÙÓ“'O~øÃ¾ãŽ;Þò–·üÅ_üÅÇ?þñw¿ûÝ7ÝtSßüæ7?ûÙÏþÖoýÖc¾ï !þìÏþìøÀE]ô|`÷îÝ–e---=ñÄþç~óÍ7ÿÎþOGŽýoÿõcÝîÜÛßö³µZ-M“Ñhôå/ùĉ¯{Ýë8àûþË_þòÅÅÅ{ï½·×ëíÞ½û oxÃ+_ùJ¤¾_ûÚ×îºë®Ë/¿mÆËËËïÿû_þò—á _¸÷Þ{?ô¡¹®ûÊW¾R)eY–ã8¶m?Ó‹ý¼Ï0P`”%ÀB)UŠH©ˆ”‰ @¨qõØ0 $˲˜mQÅ1a¥”’7 T/3Ææææ`\FØ­£ Ún·Ñ1rqqñ»ß¹ûžïÿÏ#GŽ?~üôéÓ7ß|sÇŒ±T¤*MÇ©Õê˜?‹1†Å1••Êܯ¦¦ij1É”:†˜R!Ä`0`Œ¹®k&ߨö‡‚¼k’á\N¥)ŠP5Y†³Š~›DB0÷Þé4%xØÓ›•žu{M˜ÍŸðMª`Ä=«¦ºtfÿÓUXÅ_§ Ð¥zïmZŠ–¾ºôuS4˜¸1†)x!q·{÷îáp8??‡å“Ÿü䥗^úÚ×¾6Žã;ï¼óþûïÿ‡ø‡W½êUµZí{ßûÞÁƒ¯¿þúµµµf³‰¼µZ £€0#: Êù—977wÇwÔûÐW]~Åe_ùÚ?¿úµ¯q¸Ó¬Õ¹b<ðÀüÁt»]Ô6ab ×u9ç¾ï3Æ0˜x8~õ«_uçÖ[o ‚@ññ|~~þ]ïz—Rêꫯ¾öÚk¿ð…/¼úÕ¯ÆØ‡µµ5Îy½^× ž$ìTÏô$%°³ÒÒ O*,DOœÛq;Z)—`If)ŠB‚U¶‚‚´8‘Ê$%D¹¶=JÊó(2ª|ÇN€¨Zéýªu  „ŒÛèÐ(Ô@º©J†æð@ÿŠ÷V%’b"qlKI“ˆI¨H…R”'‰U³j¥\‚J„ 4¢*pÝ€JƾMB„cz T£_Æ8N_@³Ù ‚àðáÃßúÖ·Ö××9òè£Þûƒ{VWW“8€^¯‡>\q×ëuÌé¡É-JØÒ¨EˆÀ8Cd)¥B(ìpœ`k{ò_)²ø×mÊ‘ú‘sFèO3œu^9zV\ÛÒÅ©Ò0oó½ÏØÑw9‡èº.:â‚ 'c»ÝN’äþûï‚ছnj6›+++KKK¯xÅ+Ðãºî¡C‡xàÇ{lÿþýõz}4=ñÄ{öìéõzhôé÷ûx¾0kòÊ?þø®]»ð¤8ž»oß¾£ÇOBÆžœïß¿¿Óé åÖnŒ„´a)å7¿ùÍG}ô×~í×°šeY…Œzé0 „œM$²Øú|Ê;?"å·+¶ !„‘*åpÏk jõ ï¥qĤW|T‡_¢¾§È‘KA(±¤’RÆ%QDQ`Ü —Ü&Œ[ §£TE‚qãÙ „ñ7Û¶ø¾†á©S§Ž?þðÃ?øàƒ>úèñãÇ766ƬB“ã çgÇZ•Ù´ã´véÒ´(SÆ‹ÂRÆq‚>Ø9Ñd§R3­fÔÄÃUŽóÕÿWe¶ªêáÙF¨Ìå­º£Á$ÆçF±žfYá<¾W=¹p‹(Špw¹®Ûét!›››Žã?~ü³ŸýìÂÂÂ+^ñŠ~¿¿´´Ä9Ç¢¤ƒÁ Ùlv:tŸVJÝvÛmï{ßûlÛ~Ç;ÞÑétPlE‡ä8޵÷ÖÆÆF\pPJ‡Ã!ŠÝAtš¼977§O¥ö²ÄjÛv«ÕBrþÅ/~ñŠ+®¸á†(¥£Ñèĉ+++×\s j¿0#^’$˜¦cuuÅqìùɬö9ÃN%æàÜÀRHP’¥UÀ•¢ |+&¡Š2%,Ê8µ‰T"I#^õêüø ¨ u ^eœ+)EH˜ÄÀ(·-"yé³D–÷&qŽNáÿT BH%)ŠI H‡ÅP’(2νERI”ä‰j¤*³r‡J)N±, £ò1=äúúú©S§Ž9~úôé'N9räÁ|xmmͲ¬×¾öµ·Ýv›Þ¨j¢”¶Ûm,ކøA8pàÿð?÷¹ÏýÆoüÆÛßþö;ï¼s}} F£‘b}}s~æÌ™~¿ÿíoûî»ïVIìÔ¼D !ÄÊÊJ·ÝEA\§¢CY2%9 æœãßX^^~Ï{ÞE‘bvvv}}1öÀ¼ûÝÃý•RÃá³w%IbYF%MYí'/Úg¸ SßJ@RJ˜”Œ ,F™’$"JP"%ĉhBJ ðyRA+Ù(½_µO"‘º®+eE4N’(ô¸æ8<•CóaãåûŠÛ,÷–1©’„1F$0Bj O (¥±/$gÒf)cB—´Ašíl 7¾hôˆÌô8Vš¦˜9Oñøã?ú裧—Ž;öÃþðÈ‘#xb1;ªcN«Õj5›M´2Ú¶­‰®I€¡ dÆp›ÑÉÄËØ€s[J‰ ü¹éŸw t² dîÿ"l‡€=K §|Î)ªÌôé?Ÿ@¯Œy½Ó‰£ËB¿ß·m»Óé:tèïxG·Û­×똵Ó%Æ×ÙÙY”}¥”¾ïïÚµË÷ý+®¸âøÀg>ó™/ùË–e½ñoD‡ÄZ­æ8ÎÂÂ&˜¬Õjo|ã_ÿú×'£mwgüQä8Žg{›këH)ñøà\På…,²R Ó;ñ‹_|éK_z饗"X__ïõzœó[n¹åÖ[ou]óYb^k CB4›MÒSð)^€§ vÊÐŒq! „P ᤊ(±,`œœ›;–í1êm.(SùŒ/ŽÎÓøË5‘Uã·‰t€F2¢W”\²§í$¾Ml¦üÜRLGàcS‹ÊËR*B¨%0Þæ’YTJ „­«Ø(uÂÄVJÐtÓŠ7œtÍŽwËšIæWJq¥Rß0 чseeåÔ©SËËg}ôÑG}2]¢¼š{É%—ÌÏÏïÚµ«Ñh aFî2‹†a4 SJñð›˜]Ji[vΚ‘g†"µÊ’Å›é8vÊpo>«Xÿ”»¨B4Ûìöiƒ³ª¾«™#69\ì§ô½EÎ÷©¦Ü;}ïYš yÜ)ƒ…Â¥v&„`ìì±cÇ®¹æšáp8÷îÝ{õÕW[–…þƧNºð 777G£ÑÂÂFî¡äú3?ó3KKK?úÑÞøÆ7j÷رcóóó”Ò /¼PJùøã{ž×iÔýp$„ð|xyy¹ÛjR‹û¾o9Þììl½VöúƒÁ`va®øÑñB±±±ñå/ùÕ¯~õe—]Yú­Á`Ðï÷çææŽ=zêÔ©ÙÙY×uQï]«Õ666°„(Êß(^?ýða~z f‰%™”J"¤>U#ðÁæêñ ]²•~ûôóc­À’õÙ€ÏÖN½©¥””1ˆcéºã{¾úÕ°w’ {bx…ëŒ ¦¹Á(Å-Š(!ÀñØz¹.•„rÍ ¾Ò «ûêÿvÉîîž½´>{mcá`s–C EJSTà¾ï‡ÃÓ§OŸ>}ºßﯬ¬Üwß}÷ÝwßÈÑ™1¶k׮ݻw_qŸøÀE»víB‹&‘÷}Ž0í€&œzJ:ÛŽ:r厕ç QŽ¢H3ì:yÖŽ–Þ\&ý,9[™ü5G†§ÛGŸ ‚¯†)ˆÉ¤Ázv²P^PëœÉdÈŠë½÷YUãŸo¶£OŒ‡VI’(¥ÐÑ÷ý8ŽçææÐsز¬Ÿú©Ÿ:}úôç>÷¹w¾óÿ÷úôé÷¾÷½QÍÌÌ9rdffÆuÝï|ç;GýÅ_üEÇqúýþÞ½{-ËZ\\œeŒ½ë]ïzÿûßÿùÏþ-ozãžýûÂ0<}fu~~^&’HU«Õ´ ÕÎ8$IÚív¿ßÿêW¿Šªf˲°ôáææ&&޾ýöÛ?ò‘|êSŸzÓ›ÞtÁlnnžU ó¥äF¥ou·úÕ¥³È1=&ÇP:ª*ñn›ˆX·ß¦c|•ÂÃÌêÁÌÌ cluu³E6›Mt¡ÂsqðàÁ÷¼ç=ŸøÄ'¾ò•¯ìß¿ÿ—ù—:äy^¯×ûÞ÷¾÷íoSZ¾õ­o}ÉK^‚Y—ßô¦7}üã×»ÞuÍ5×ÜvÛm¼üòËï÷~ïÿñ÷~WJÕ¨w.¾øÀoþ§ß"T­®žI %„Aà8JÞŒ1 DWûï¿?Š¢?þã?ÞÜÜô<277÷»¿û»Žã\zé¥üà?ýéOÿÉŸüÉh4²,ë5¯yÍ\°ÿ~Lö޳ØéyÜ)L±˜T&f¯Ï7ÊOÝ4 AÊËdzû4dßmü© Ìe±„s‡aÂ(—RRe…6]³bÅ”Ñê-[ÿ¶ÙÿÞ÷þë[oyíå×_u½öÜð‮º°:ùèG?º´´tß}÷;v ¥XÆØÌÌŒÑív:tàÀô{DS.æ…ÃÙp¬'Š%•4’ÂTHr8eÚÓ4Â4‡® 0!³‚¼þõ¯Ç<:SüNü‰gGýLçĉP³‹c˜~œ¶O€‹pÖõ!…,˜P vSôÓ×Ó\=bøÜAƲT­ON™|ÖñL™ævš‹é÷nSU…nJAÌÍÍ8q¢Ûí¶Ûm¬ø‹auI’`àoÇý~~~ 34›MŒ#š››[^^ö¡d\{ލú1ˆ. CÇqPŠRÜÎ5+å  @ºF@êé&E@Eïè?;2$즟¸DYs1qÉ%$ 8Æøb”v»½°°p饗8pàš—¼h×®]ûöí£”nllt:t×B§*ðÕoÜQ{›ñD€›’AÓž9Ò[çJ¸” YY6èY™‡”`Œ>}zÏž=jj6§spÎÍÀ ·t²ü«G+©–8º¼˜ )Ý“Ð%Gµ á»wïÆZ¿è©ä`qqGŸ$ `tËŒ¢¨^¯×ëuÎùÌÌ Ähý2íÏ*3M'Q¬¹Í×B8§Úl’($ÛW_}õ¾ðM›aç^Í;m¾ Ô²K&f™¿– ‹æS;zo)è# 鬄³ØÉ”÷nç©és)ì3(4I/LÅbXC›!‰ Fc4¡b™N­ìA9Co1V ½:W Š­„¤‚+++®ëâÑè¿Ìâ£Â0iÔét-îx5§×ÛPJ¡}M9iš¢ n8޳ººª#»^¯#‡ 'ƘçyzR–eyžšixª?Á ð ¥4)£aCÚOlöÜ(aÔzŽP_ЪS ¼öÚka*F­º_E³…”xT•šàË5ÁÒÇHæzÄß+›|©I5â„…i HÅ_óšŸt]·ÙlBÐg¬Ýn[–uúŒ…ùw¤”hÙªÕjÐj4ñú /©vÏ튢©2Ú‡Ò PE†ê2ÈrÐk«ŠÂ4jk4ëCø¶ŸyëßþÝß|ç»ß¾é¦›6zë³³³ÃÍh^#[!0ç‰HDeÙ$L .³%ƒ2‰3I’"¥/2MEŠR¤m¨QDl«mfŒm%õ6÷AîZs$Ũٱ¯]™#U©Ø¿¢ì¥›H ¦(Ƶ6”ùTuU¨"ÄqÊôšÎû‡­ÊÐPˆV†aBÿ©Õ^)3[¥{È]ë]aöiv’»oJ*E.Ê×uqƒ!“×l6•Ršh™SÖÊ«áp(eÚ¶­D° ¾{k5ë‚©¡ô‰HÊX‰$)±KlnÙÔ‚8•ëÃ>eT)ŘE ¥,‹%‰ ”+JAÆF W+I B¨Ì$0ï®ïÇRâŽBR1^<¨HÌ ª4^¨ ¦šm¬`¬Áä·¨2KOÓ:‘„-¿}“÷’ªÂY‰•ßÓ-|BQí¥÷l¼¯421Ÿ±CV Pî\%Dqê2¨4œ»"®- çûô¡]ýõX£Ô³êæªéÿ-‡‰¢2âMsH³ˆIõ*%KUñyÄ0HõsѳҠR0(®9l’y´å^mj Šý˜?æÿÒȼ¡W H55èðsµ¡:N®¸hxƒYKZRB&õš ?Š2€LÖ¶Ò•rýQ§9˜Ü?`p¬9ÊjrÛ™¸ÉÖ·™T9š@î:Y@Lƒ”@gK’bREˆR •P2V‚ ª(¥@(( d9i㌔iR`8®³ z°56Y7Y ©ØžÁžÞ~ •¸\§ÂxO0µ^qÿH%¡°I Ú6˽‚Ï1_¡_”†©É‘èÿñg\bB(…_AU³(¥ *¾»¢ªt¿UÍ˰9KS¿Ù³Uê„Èá½P”–“Àg»çgüøhJŸi_Õ[ß½ñ„²¡e«yIüp´)ahZ³ùTÕÛ ÙïÉXžbt]*…£T RpËcŒPb‡¡L“',òí4vöB4“8hÔ»Q @Ji«[ï÷‡–ÛX_ZýÆ¿~ãç~î=QŸ¸5Ç>ƒrß…$¦¡Ò¤Eb¢H@h,†d†ADèzÝÏjuŸP‘Õ?#gf¨tÒ(Q¢á’KRÖ‘“ {Œ«—öO)¥„ê©2 1G¾Il§ÓÙ³gÏž={Çqk²íBß÷±MÇgN/¯¬¬DQäûþ7Þ¨3ðQÎî"5Õ’(Êc60s§D=³š½!N>~rvvöú믿å–[~û·ûþè:ŽJòÌX§M&òM’Lì+F ær±"Ÿ<®%ãÜS¦¤h>¢Soâ"hÁ·øö"–ÃÑ*³”Ã$=ÈTÈL麟܀s>[uðPí‘»I¦&ÕTʤ¬Ü²r#AHåÄŒŠ [\%iTÓªZF ²:µdé{K;É-¯ æ:”b´Ò¹”ήL>ÉÄÝi,˜ œ2!A*…AN¡œPAAF(¡p¢$§TUHfUáCæ¼ô{ !I\^Õ® x–!›3­ò9¨ÚUU‹” Ž“Ä)ªê—¿¡øeq`¶Í¡ìËÆq…„ç”;%Åaùxl{«8Aᔌsç>¥@sÝd¦Q¹-?”‘çÖµÆÜL·ÖmÇ­%IÊ 7ßnlÔòq¦I\ðýA­áºÌ³šµX>ôÈ`èÖžJüzÝ€À÷ ƒápIÑ(‰-§F]{OÔA†­OØÃ½ÍĶmËr€X´åÚ^ûíZ«×?1Ó2+"ƒ¡j5;¾‹Oœiïª;qüðáÅ—ÝxK»ÉD 5wÂ’­50H gn³ãÃ(%b.Lk¬æ3Œ2KY\ÚíÙ3à «ÑÁ|§›.¯lÔkÌáÂæ4MæEZã„4Ü+ãêÌ›JWiš&i"™$Š/..bž<Îy£Ñ‚0‹c|z‘¡* ÃõÕµ^¯·¹¹©”ºòÊ+mÛVJù¾Ï,nzW!1ÖZ_T8CV\fiëMLª%È~¿A»Ý¾ãŽ;c¿þë¿~ûí·¿ò7¡1Œ³-ݦ!¡&ijñϪ-žC‹¥„ÍCÍöèSg*Eñ>N\óZ É•—ÐHß$œæHPuOÊä¤vÖ¯Ëui,jÑMÒžôn5×d’tiû\3}'Œ"ó¾JØæðôS¹ †& §BÈMßO‘ñ2G•[Éâµù)K¡f¦;É­€¹nÅ_‹`Þ/#í„NÄ$‰ %\@%B‚Š€"Žª$¦iá©ò^ÖESÌñ£ÓuÅB”ÏÂÜW¥3Êݬ"$U«Dˆ(í¹Ú+»|´†?÷"!¶0N\UÿQTŽq«Úkn2·ÓŠ,`î¢8þÒûUP•¬jœœr¥ÃÑææf- h܈\A9%“&<¥¢”RÞYŽ×ŽÒA·q…‘c'|‘¼äâ Õv­]÷6.üÁ·ìÑæÅPë,_wÓ²7sÒ"‘ÒÍåõïíøëѹ]!ØžëR¦Ï‹“”('¾œè쯽èÚ} î£Ð8õ£ËŽYõ£{ìúÅMö²»ÿã+'Žýèà—Üð’W1ûxË^þ ûèÜc'Ê÷¤ëFû.Jå YœŒz„Õç,‰¥#›Ìî»p$TïÈc{Sߦq÷ÐM?|éÞLjØ$#”ôW÷.=Þ:sÊ.ï·[åûA)%•”blœ% a6K"Áu.I¤‘XÓ4I ýª„A ãÇ1ºn’L4ÄkµšP&·žgeÄ`¨LîV™ŠØ<êJ)J)fïó<ïäÉ“µZííoûµ×^ûÑ~ôÞ}Ï¡C‡®»îº}ûöúZ–çyZÝm‚ɳãìô[ª0¯9sÓ›¨ ­›hK'Á'†W)•Cdz„h$6q–\ÕöìRBHÊt¹f'€«x\«2!£P$-g%À¹›XÞlƒÿk#t³˜j’ÑÒ8·P0‰Å4Á†É 0…(o=¶ªõ)"D=mM0¿š¹†S ßkéÍwùiH° U©4‰y$ë 8—„RÁ© ’S«8`¥T””KfŽçêõGÀ?Â)a<òÒ»Å"+c(SQ*¥hEOÕ¸¼zfR1/Ua»-ªúñ[Ø6/.> GK,§|¾"¹"Ø®WÜÿSø³|!ž³B…*˜¨ Û¹±nå°ÝtãQÀšÍfmfÆî¹ ÎEš¯çƒs©b¸ƒþѦ}€«Ý—]Q{é-ý'NYZ¼àÔݯ¬ÕZÃþšWS0ìwûÁl\þEÜ]\¸hiße^qòðBœB¢’föS%SI0ÛÎ- ^rcmD¾ÿ¯›xû~ë–7ÍþOºç;jYþç†}ëË^qè¢}—F!4ëW^=Ïêß®»”šÕc3—Zˆ•Ù]Aâ†Ñæf²³È#Ì‹F!³T­}zvÏã‰LàáKâ„uvüþŸ<}¼;­×f×gçÝ ôêá‰vM WJAfrB€!G ³7cT¢ã8”R˱Q‰ÿmýf³‰ñ ˜¯NçsÆì¨€UJép£œ»s‘(š{])%„èv»½^/‚N§ƒÁÔ{÷îýÔ§>õOÿôO?üðÇþÿ½×ë5›M̲½¹¹éÚ^»‘¬±I€UbâDó‘âbi4dÞ×bF$ofòOLW„Ú{´ #àFÏ U÷/³¢­z´úˆ’,Ô,G‰áT¼ÐCE)<ǦBªŠ®œ“›ò6½^õ‘–b™*„‚y!û^Ú‹AçoÑë`.…é@P$x¦V`º·¼^½R/qóšN&n3Ûh¬8Ã6_úéõÛM²­¯M÷4鱚àŽ$)¥#K¢¼ v†‘LEд5Gê%Ô•J€™r¨mn ÝOc¡Óé¨É}LÄ¡—Èài*¼C3›hn•äw«$ÀU$¾<Ξ[ydA2Žü_’F`ì œUØe9³ªlÆr‚?֣ЀåUÇgƒŠé…¼€1}?Œ’Ð%¬3³ï[¯ÿÉæÿ›áüŒ$8`°AÆ •¿X2AÉ)ÚMgæÕoä÷þGðwwmœ9ÞwgŽ{nÇ€çv`nÖ›0 7™¸t»è’ô oãþï{K½MAp¨Òuf Bk¸Íúಃ½Ù=Oÿ?tññ¥ùÖå{ö¯|ÝÆñå‡g^}`ßm çÚWÆ£¾ÃæÌzÍÛ³Ñ{Hˆ=¹“¨¿‚H‡+j÷ÚÝ5o ˆl©Sؼٽð!ê,¥Ãf4ìðÆc+ƒAÀdž‘;ìJÒŽˆ¢ýWöºÝd‰ª* 4~b%‰>A|~~}/±…뺘¦.JƉîÐE“d¹4½>écHÃI [:[|© Ë ƒáÇ‹ÄI/¹#}ßß·oŸïû˜“6Žã+®¸âôéÓoxÃÞüæ7B’$‰¢ˆây^­VK¢TûQcHoPE¬ÇYBƒâºà…Fë"䬰ú:”‰\ ¤iº¼¼<G£`ÜH£Ñð<ýÌ5!Ô8W[Äã8Æl'ˆ¾×××õBÙ¶­ý×L'>ŽíMÉ•Næ¶mëćzð$Kå]Ílé;*“ì+¶˜-·Ž#£æx´±l=¼"ÉÄá"àMÂBát´±Ãl0\‡V b˜r”&Péd•Ršaʵ±'SÍéÎ5–Rê¼Qæx Ò5&rú'eh†t¨r!z÷®ˆ^=¡nJc‘K¯ï;kæ73š«º”R7"5¡W#6lirŽxU`R=¼¢Û<Ž9•3puÏ)r"'L-ú¢ŠWøx¡%â©R*Mw&ë•áP2ö*1È¡>YU6à(-×0˜ØÛúf;9ÂO³üùÅÆPM€«>eªÊMš9—åhpÕ¹f.·RŒÈÿ¹wv°ôp+œò(%¾¥¶4yæyO’ò~b©f»2ÖòÁk'OW¿ê%Í7 “@R©" )€â”8 ¸]wë>KùU6)Sj³ClQë8LÖRÒT²ù²îô®¾fsßg67^gш.éC¯¼ùG\œ>z0HüFƒ=q|³ÛÚg9O¼èZ÷á^wË5jµ›ÞÖ>$­$$ÑhvWf–ö‡ ¥²ê½V‡7:þpsA’X  \W&Ѭ )X¢1Ë„Ëgý+»vm»1‚‹Ê?ؤb2Œ1Np£¡®ë"j¾žAV¬ÍRÑ,ËâA¤¨ÚRJaæH3Ó¤–Z4&†ã1´^J©n·»ººÚl6)¥A,,, ƒv»MpÌ3 ¥ DQíë4Þ:ŒiG0šÕ@ÔÛº¨ÂÅk0A#D$lņˆý±nò(xÓ†ŒóJIÁõ Ãд…«ÉxÐ0 ƒ ÐDMò4+‡Œ´Gó4‰#•ÊIK÷áÊkÜtUC[Cé.)R,ìö¬É÷s¸>50(5|àE²Å0i¦p}òá"àYeh­ªÁñ£c ²,¦Û뺚£Ÿþ©ÝïÁ@C`H¢$SèûæÏ‘pRÜ?$Ë?ƒ¥ÉgäV-8zÿ›d÷æNÇM¢”â-ÛŠ¨ƒäœzŒ€pƒÐ!õ‡±G“¦“0ƈH #$Ó@èžñÏ"jNJeLá–¢…3 cÇ n­¼Ðz‡z}̽ b°JU¥«$W¨°ÁWy Ëjžcëãã(!%!„‘ÌUB !…”²’°U8£I!23®-!$Œ"½ýˆAøaÒh¢·JURŽ«Î5Q¹Í?ó‡ƒÙz‹ÛXIȾ-ººìÖûO¾ØáW Û.¤Bg<Ž"ÆÔZô£ÙÝ vÒH­Ã”„–w…¢õ0¨…Ãe·-¶åZŒÖS·ãáÐv(án#LEàZ»zƒ{æ»/nªË¯j‡éÝõ>QO¢¼.JíÑp=Ãîž°Ñ⛽8J†ž·îÍ„Ijgt.zˆÚƒ>qZuÏ›ë öŽ"ÎÝMF•’m—^î‘ÑhcfÊ×s|'Ya¥§œ5ë-×uQè¬7aqÎÓ–¥¥ŠÚŒ»º‚Ælk³Bähäs·Ù¬+€Úõ4U’&Š&JÊTÛ¥ŠPBˆ¢Je*HÊÆæFP@)U â$N’„sjÕfýX(¥¨Óé@Řo“+¥”T2‘ŠRF§vJP1• )gìÔè$ 2¶"!´ø–ÊŽdÚN¥fÁ4ˆËP=ŽÄé™mÛ­V‹r2Š{dq›Y–Å,šÊ$ŒG@U£Ñ¢FQ€t% C!ÖvDY_)˜E JI­æ5Z­†…БZ[ÌÆlÃRJ¸Ÿ„þxa³Ù!ÑNOšÉñ+p‚È?I9aéÉQ¬‰•NžÂ ‘*ÃÜ”c„sjYÜòjû€á”—ˆXW ˜EÓ4UDzuwÌÊ0à6cMD<ŠR*•I* ‚0@VƒR TJ£º$~hF²rÔR*…ÿÆŒ‚I-4Í`5§¬)P%ÑibðŽi.BfQÆ8Ï—ãÄݧ—“Rd}XÆØÿ˜_ÉtìÍ„68ñé±ÚLê ë”ÍóÆÉEâµV”Õ‘§†x1q™'DŠëŠEEœ®RŠ!”I·ÆÉ'„™0W€’Fn½6› $@2z¥¶aµeÚÈí+U!úå¢Íž&×®"‘œRŠêñ+ R†°‹ b\O“‹KD¢”ÈpŒ¸+OŠÊF•a| ¸NÖ¥· îRSbãI@Äͳ§”ÊT!tø–þ c>+NhfršÀõ[KFÌP®œO†îr&ÉO£´îÕÈ¢ ¤6MÓ"K@úÔšFì*¥?l´.dvÇ‚•pE^8+Ú{ÿù–éþméð•‹Çö¥IÍ©§BIB™ømòÑêéÖÞ‡þöÞ,Ʋä:;'"îúÖܳ²ö­öÊfw“)Q¢IjƆ ñ|h`l‰^àA `ÿHÃ$Ч>üIü‚ÂÈ30Ç$e )’›l.Ý­®ê®®êZs©Ü^¾ín±D¾›7_æËÊê&%Q¨Táå}÷Å{âÄÙãœHÌAše-ëm„Q=h«·å7ˆsO+úQ.™¶¾ùž'_ìÝ_h¶¾ðVf•ÖòTÏL÷N}àʵïý«œL{nkø"8áö+""0²h m8ï²æ0ËžyõÛ—>ø _Û^þäŠÃô奻wþþd8õê%î5/IåÐBßã>‡y“×½°Xµ~¸ºþ¼jïµÍ­†Æ¬µÈ‹@4 yéÖ”ï¥3†¢Ñh¸j´cßZÆH#<Æ=LŒDôc©ÕZë–î…¹D,2š”mÈ”+Í1´»š~¹hVi§ã—SäJyZ—Iaåîò‚Ѻ—¬Á±Ë^Î@1F–£eHgêr/’ZÒ:íOÀ‘Ñ3Æ\ªÛµZ6¤zÝÉ6kmµ“„#h' ËóKåÍeW‰ªƒÑ%¸hÅfgg›Íf­Vs¢ZJé‚ô`±ô¥ãȈdŒÕ›»uÇÔwP»Š‚ë IDAT÷.e¶óØf‰“½S¡P±¶ixr “û8oÅ1ëpâŒx{¥UÆÑ1ÊH'hžÝu(Š‚FÙd®¹ÙA>Ë%àœ{£ãOX‰>€QºÀ%ò‰¨dd%Ë£„± Æ“¼F«¶Çtœö¶ë€Á½8SUTu *Þêõº»Í‰CŽµÖ &€83BŸž`¡Ó´Fã  ûsŒøËñ-Ù±‡–Ó#ï’ÀƾÅýî«1ú©:HaŒË?:ŸŽgŒÍ¼¼^:J¶°‹v»» Kt× ]¡“ê˜ÆžlÅùžÇ¨ºcx.Í€IÓVd­µ.y¸eŒ‘±ÆälìÎ1½yÒ€cP Œ*8ä«CG=‚URÛvùžyº…-î†SËÓóÞ jùVíí«öñ'7Î<¹¦™\»sª( «#%kg/R·³~þ™w.>y¿»Ú{û{çzÝK$¢Àϵʘ´Œq¥3²ÊP?)Ò¸Îbl·€hü,ŠÈóNYHvÇ—/›->ûÍ啨'×¼Vûs·ÃØüðoZ…½Ïq®DEóžð˜eŽ;ï²)d¸h6›ÎÆr2£ÌÑ lh­´D Ag  ÊZÀ9ל¤”‰Ï´Î™‡\£1`5‘2» 1ˆÂê•Û[k£ÁhØuó’fÚpÉ,Yª°3w„|ÏõÊöâg YÍDˆ%#­qrŸ¡AY>ËÙU02\g,ƒÄ»¤yPÇ?%Q½ÁZëdX™E£ÆPN@R¥8V ”ޱ†aèŠý:ÙÇq³ÙŒ¢Èušrå…]ÞÅ;}”s+5ÆX‘æU¾Y²ûªËº¤ gZ•S‚Yåå8î¼ÙA¶Î‚qcšv“°¤“pŽÚÊ+WÑEy½í¾£êêÝDA1ªYj­ug7ç<Ïí(WÈ¡Ô9«®òê<Ë®\c™nvTŠÈV¼C4¹V¶WIÆ)Q‡ˆ¶½eòc $îY畺JaÁó‚r>U-‡1vŸææ9‰±ÚÎ.w§©¨VÕߎé—UšÛ'P¥œ‡”ûF«þÉ&$%MÌTQ#ªûw cå‡*ñCÅgÄJ¡XÞÀCB¨ ñ˜oqðJõøeùÐjå¢òÎÝÏfß¹öƒ¯Y^wS]2¬ô¼981vÿ‰ƒCç<†¥CÇqŠW‰ó½e² !˜&ãÇzë[´¶2°tí•õ~á{A}pIxVÄ…µúôƒÇ羕÷ãþÝ_ûn³?¤¥‹Ø—+Ý^#f¾µyäGÆ#&ToÐZhÖkÙPóÃ;A´4«‹€5$B2}âFs¶s囿Xä§(W^Çóœs.ÀZ­M!e¨CÖxd¹Åîêµó—_¼‚Å鹓½{×—²¬VGßZitÆ<`ä¡åsó›?x?Ío¤aâÞÕ'ºk§¦.uÓÇq÷O=#@s˹ïû!„ÊSH¾pfV«Õj6›î°ë‘’4Ð( *Áˆ’cÌt0Ï‘ûhjþ¢à@ˆX°À q.,p(¹çú«–„1¨õ^k3k9qÏò.Le“ÂÈ t•z‘pPK ·€Æ2OäȆÁ.%ÑHŸuã”Zq€Ùýìñ*¥–$hGÅ« FqÍ’S—öœ«Cà¾rÙIè2˜G£sµb™K³r¹Z®Ð˜‹'Iâ‚£aºiPe™ÏÒnFDmí7LKœW·M©”ÁÔÒ†.w졸ŒsWY3pUÞQî=½df7U‡¢,Éèuönõþ1æRÝö¥ÛÜŽ\Öeˆ´*-`? «r-U9½ª¸­VbšÄ¤ª ˜®N¯$!ku)€ôÝõš0Äý”Ý…ØŸ|T´û ”`P†ãÚôy&¯ÁÞIt À}ÁxØ/u`·Ù¾,‘ ÜKÕÀùè){pèüá8¬ÂÑòì LZ£CÅm¹LErUi(gb­u=mªz]È>zlòUD•YåÕAÊ?K² Àa˜ •UçY)Ÿˆ£Ô–±iS¥<ßI”¸_ÓÚÅ ZƘ%dŒÙrMÎÖ.¹b‰RG„†-‡~á,ÚÞÞ¼2mæC»E6jÓ,ñá¤6­ÍÍ+‘ìýOóç¾sáñ[ϺûÖë­å;ORä·§›º7ÐZ‹@èœ@0kâõ5˜›Z?lÑt»yB¥ëÖ)1 6ËNŸ¹;Xf =Ñî4|FÝ.drsϳççȘçêªZ½Íì<€µÐÏ7žC¸5wæuÏ.no7˜j2î#³d5GÈÁbºþÔwÿßÅ¡œoÎv›Soœ{úû퓃WþúŽg5”kD£pg• D³ÙtÉ¥DTE™c\ÐÑ"TDh”wºƒŽúT(ÃvÛ³0Ÿ€,Zˬ!SV>#Æ]á’cŽÒV÷Ì‘*¦²Àý ×}ìúØ ºg TŠsHŒÀ‘ ¦÷‘”­äaUwæžyJûެÐ(7²TåÊY•O¯²§Ò^ñ˜àœ—Þ’ÍU¥‹õ–q¶ c,‚8Ž£(BÄ~¿¿±±Ñëõ\tÙ%i­Ýá+°xp@p®ûªÝãþ,«—¯_îö1ÌTw²ƒrW» —kQU\ÈåàPáÑÚªêi"µ±ÓÒ”¶oÿÚèj"z‰7;êª]úð]ä»Ôcª2*R•H€Ì’wƸ䤊QÕ¬x¬è+%Jí(±n÷EFI:UR$ÚW*²Ê¸]æ%~$XÉ0$Q9ï…ÔôåôˆÓcŒAkÑ¢%B[IuÄý<Ñ àa©ÜÕe=&IÄãüöàÏÇÔ…ã;¶Æþ,QAKõN'98çd±T©aTJ݃âpÑNH ûsL¨^?T¡™ôÖäBõˆ®ôfuXçÒ+{åLòT í›´È•ßâ.ž´¬ûÔ ™.R)™-<%ëQÈÂ0Lõ Q×§ã(ëO×Z>XÕ,ìÍ 2wÞ™nO­Þ~kvóÝøÃŸZ}ò™¢·“J4[Ûݺhy`P䈞@]ëuúÔ¥'?˜ÈaèÍ®ßÍk 2¥©7رÏ\¸Ùª±[W~Úôg 5ƒŒËÆÂ|gy*Y(™JpråÖZ™à‘Èó±úî™ùÓ+«7/'EÛ€ ƸF$wÌ‹ÐFÁ4ÙééEËxtõ;OåýúSëœ<­î­™±…ÞÝY”bÆð2´¤Qk­…³zwvvò<‡N§ÕjÕrÆ‘qË€-XÆ™µvpï†#Ö8ŽýtG!´Bð‘ ÂVˆ˜R ¥d#ˆ0ìw€8RPZUwþ.³€]fÄÜS`Ä#[yÕ¤4æd: €¡_"¢ÜucL`7ÕT¡«™Y0Êfª’X)h¿}F?3g(u\˜ˆ\;>*ï\š€Æ'e]L×µµè÷ûÃá1æBžîŒu­VÛ­:B¬Ü-eùLPFVåGÕ¶®Ê³r;1¶O£¯¢h\‡5¦Ì‡/G(™[þ°Py‰(7[7N‘íêTIvc£¸HÉJŸ-Ò‚À½‹o. ZJéÐX*Né"4JþÃýZŒµJœT]ÙU¦Ã€W)%™çí%• í/¨ÕSδ]ªÛ;ŽR+r–y`Ðꊂúˆ(w½/` #f£u•’÷½…Ù§ï–s6f_ÎÄÁ…>t´CÆÈÚÅ“Ø$KkŒMõ0†Ÿ½¥„ýä]ÒÉa’’*&æÁ'ŒQ‚‹)— Ì¨Ž°Þ\ôÝçíÆÝœ,»¹Üet˜3 3‡âmÒŸÇAoI<»z Ìc9WY¾Õ€@NªPy潓a ¥LymКñLR1ä¼9P*7•„¼óæã¬G† Y2È€YK™·W—ƒwßjÑüˆ™|f.L“¸Ù ŒòÀ¿ŸÅå—î1ÿÆÀ ¼ `©`þ`ñÄSý^Öí¨4—ÚrÆ­µž [6p:ëŸãõwoÝlià«7=„ ¤#f,*°ÕÞN1¦Aiˆäæj;Ïß>ñĹ·öñ*®Ê­M´+P¨rÄ«¯¾êzn»M8 kCxAÄ<¿È•‡Jp%Ä\;ï%§(35FŒˆB¦£Âc28O ­A)´–p"aŒ0Æp^ ‰" 'Ž€Ìg¥xØlŒ1Î1.UK³‘V¹§UAŠOè¢ÔdtPååGC Ñ»XKZŠœªGûݼU-w‘“0ª«\Ýo4òBШ0ˆ‹õšÑ¡&— †¡+l‚ˆa¶Ûmw6¬( ßó«Û`ÏàÃ}¹Qå*˜ÊTÕÝî0ÃF‡‚ØèÔU è²­luƒ•`ÀÇ.ºÁÓ<côî[ív(u~ZÇ’¼@¸3¾n„²•}y@®xî ‘+ÕYŠÞ]óZk‡ÀRÎí‰ÚÇR à1ÆêðAÖãpÕsè¾r¸d¸¥{<—…Ccù•3SÆpåéûbi•¹¹¥¡Ý¦nîˆàÎ,6GGˆÁ0Sª&à~K¨ª(TñP•cl·\å1´Ká•®D“„Jìù¸“޽M²äª´7†½ò†*>«Û*¡„}›¥\kidõ}ËÇU_«*̬Ý[Ùª:è/ã>UOÏØNÙ½Nή Œ±²ÒVÉXJ–[^¡‘!qß«ÞY} bî•ù3"kaþqä¯`@pŸHG!¦ÙN2Íb1ÔàñÍé¥õ¬›Ê‹~-8½³0j÷ó,6Ó3aÄDàEyº™e,hp†>÷|$˜0ÒÌÔg$Ì€šnÎQ}xûm/KxÛ[Ïß¿g|¿ÓÛ©“W›šŠ.\تóæÚrVä¶È¹ÕBðÀ÷|s€~®2‰Â Y̤öVnŸË•bA®u_é!AHÄ”¥Eaá‚OçÔÖŠso5Où ¥än£ƒî%£¬ `t„UƒÖZ‹W^y%Ïó(Š\£Pç…ŽãX£öë1ôö8 f$g[—N—)<7|ÇïjHQ 1äN=ñFäÒWÙ1ÆÜr 1žwàÈÑû©¥SÜõjz½û­¥.+dœ›EâgE´¢e/.¶”­çÞæÐ×ÛÍÂ.Cß =CÍ¡Õw˜šf±5ûº•„^ÌU†kÈ)·Í¡„XÂØ†Ëg)?cE{­î¾¿¦q9‡ƒü±:ŸC™Î¡P½+&]yܨœ¿û0iOº>¶á/ÆJ€Žçr¬¾Î¤û'½ò¨8ƸùØõ1z€Š¼,/î2 ý6h9Ú¤óDÕøÝ=a0À5 †ÀíÁâ “Þe<ìýÇ#ðCýöaçó@z›Ø$º*ÌC®×ð&Ó:ªÙŒÁÃ*.†ì¡Ã£¸²Í™“¯üÒ§[ù—QºgÜW@ ò0ÁA®ò…Ù™Õõ·ZÓðKÿú4Öà›u¯»QûÅ“|ëo¦¾ø;œînu;Ë?ýÒÙ7x5ÙþÊü¹tésׯÛÿï«kË7¿S‹.ùu­;ÿæwŒ6Ùþ÷¦»¾ù‹¶ê ËQöDjÿãË?Ó.úþìÿ\{ûÛ sÛK‹g§Ïßš%sQC!ÓDó/ÆöY¯ñ°V*[áNþâÁ̺‚•JسAÔÓµ«:ý)θ턵ǵM¿ ›/Y~…³8†øâÔÂæª`µkSüæ™ËáíÛ§n-kDV»M*!"GƳÖÏô¶Ua`£ÍAlYw;ùN¶åu<Ï36”ýn7æ ±7ï]I—{××¼ëk"MnÕ1j’© ¿ì\ž‘u&ìóÌìùlqt>Ì™,¬}¬Ê¶Ñ›ùùùN§†áÜÜ\’$¯¿þúòò²bjjê¹çžkµZÕb+žùÜŽo'49xX`ö½ãù8x’b7©ÚX?ærØ( L’røó'Ϊ+ÛÌ2^ËÞ«Z¤z½ õ–ÿ̰3­UÚ‚þÜÙ›OýÞâôŒ½ûÚË…¬ò§;Àkalkõí§Ÿ„89½ß_Û–y«·uò…'jÏ]š®5Å0»Û N?qþv’ö?õ‰–-æü¸!Ï k-~³È½°r«5Ó<÷á—šI±õú;ÿw°º°´xþÌ™'λpëÖ•FãLg«½r§éfUªÈ{h·°±j ‰– /r0Zø"ã""ò“ôŒ$ªùaœÛv¿3œúÒé'Ͼpšóö­ÛgÖïD÷ÞVïpVW°ð²Œ1@²ÖZÎ](ßÅË)à Y{ö¥@p¯.¼fX³^ EÞj NNp×»¾â__±R6-vm‹û'‚9é9ãµ —ÂˆÑØJŽ«ä&Tjø¨&å˜U¢ƒ!wV¼;—ü×ý×055åZº®îh¬«íà#€×‰Ö°¬è-¯lèÁÖÊ­ö‡>ÊçN<.V² ® çmâxÙ&uŒš¶ÀJ—w¼~¨>øÛ#¸µ²ÕAÿÀGŒAU»ÿ]p¡\Ü4ÂPÕ±°’9ö²“Æ©â¹zÏ$Æ:ižïÇÚ˜ôÜ1T àIŠTuË„IxÀI˜»/"r ÷‹ÚOçG àãßÿ°0I@NšÐãaçsÝŽ}u4…ü¨0šqú‡ýûâ¨ßCOŠOÆÃápš¦œc–e*ËÚŒù¾Ÿ«ÔL(Ò]äû¨±Ÿ¾¶6<Ên¯nltÂH¼˜  êäEÍ,7I/7 ¾ó­{õº¦ì§Ó|›P‹•8§\wõÝS¯½¢¤ä:«{ÂæÅf¦ ï6¾õ½_$È ¨,µÙ¥6ó§ÛstïîÖÖúJÒÏ|Ï‹Â&Úú•7tšž«¼ø>Ó-®Þ–"d`ÌP&aDÁ`&ZFæ&ëm«’Aï^‹ÓÿxEamxåM«ò9ó|£uFn* È3€ˆ¨}P`¸-Tšæ`A{F)#þåÏ~Júšj0ŒñÆJ_czñÛßÞèí@/¶¦A’FU<‘¶ê.›—1æÌY»?G©\·{Ë:e¬ÅŽ2ƒ ‚*=½–(Ïóééi­õ7¿ùÍÕÕÕ—_~ùÔ©S½^Ï…]ÚŽK3¶Ö^2q¢ŠdXl*Œ‰w|«[ÙsºÑ>3mY&m !RÐ n'âƒl’åG•ÑA8b*Ç Ä£ÍÍò[IÛÅ›µH“c6U±‡¸wpÅVgÒdŽ ‡âylð ¤1ìMT?j|èªíÛºˆ0ê]V`l4¹þDlW\ÐD{¡\€@`&¹ '½Îþþûㄪp¨Bp<¬…]}¯ã6sH Æ÷cç¿ËÇ=¬¥>qü÷QÀ¤úˆBqä¹þxèûœ¸cŒñÄá0âáhŒ½ I2´Vs¡ü@0ÞЪÑÛÁf°¡Ñk¶J6Îv6 É‚zÀÃ>á¾Õ±µµFí1E¹– |zÂ×" ²\/ßËBœµl½^ÜÖÆd[½‚ßh<õìSƒ[·îܹ{÷[ßø«Oþ¿Њ-¯¦­Ö+ýC ¥ÊR«ÿ¬Epô8úۃܜïÏJ§ @E0ͳtãÊß«:¦k®çˆbý|£IPÛ¡µc©O2IÇàa-ËIP.Ê¡Ï=tªkT¥|8°5àØre&Ä€‰ü$Ä€vœI‚aÒ8ïÁ®[Âd…õáˆIÀ'Ä€虀ãÑÌûÄOùˆ ò±BZ"ÒZ§EªÃ*uÆŸ;A}OÔ­:¯!¯–axoñ1̺'9‡~·&‘˜×žóò8¼$’µœóÅËUB”Ƶ!©i£Q™·EA-ngIÓÔþS4µô¥¬Åa;žórÙÓö^>¨Ÿ?w9 ý¼öƒ[7ß<{þRÜ•W¦Š{ˆJ¶Ð`fI ÑrÙókžL+ˆ‘KôR€Ñ ‚ûŒ!Ú)¥I™.ã˜'A²Qkµö‚*XÓÌ’ÖVê<+À€5”ç 2ÇAÛãÈ E£=h×;Ëww®^kE´(ãYkï²,UE=µ†Á&Ö—oe­ã˜Uúó@…f°§é;£í?=Y^)•ócÃáðÕW_}úé§çææƒÄŽ / ¢çya6í|È=á1® ™åInT‘i–ÙÎí;×çç'‚¥‚An¡‹¢Ðæð¼{”t˜•3fr=ÐÌ} ã8(~ÆDoU¾V¥ìAKwLñ *Œe·>ÐâyX fLráNBéCÉé#îy?‚dlTñ@T—¦ü\Mè;˜Üw4LÄÃmc0pàrË J\ÅóÃ2î‡VŽïS?>Àø£s¹O;á˜Öt{„Áðþ¡z>¾ú©Ö”i£Ó+œƒï‡ZN‡Æ€Ѳå ÞÒŠ) ¾×ÈSÑÛQQXð<ì¶ü€#R^¤a&©T;mO4ÁÄ‚Yìè,·*ÒfÈüA=Ë€qí­Aò„(¦dä™ÑùÑPÑ–6ÛFª×›O}à‰ko¿9=7=5=›É ¨Î³ü_0Æ€!ÍX!<—|îiI3­5Ö(+e×# £iR"O·“l+¬±°ÖòÃȸ¶Œ® Çh©`/hÄç­«‹b½»6ScÝ-4Š{fxûÎuºukK§÷ꞬÝUTÈÛ¡–N¥<3Ê¥_9áêXÌÁ§‡ ¨„ÝôX¥ìƒßz½ÞÖÖ–µöòåËNGÑl6“$qB×idZë,ËŠ¢˜^?Ï6‡}òxDqToôí0%7ºƒÍõîÒ⢨ }PÎ)Ÿ‰}‚¤Äc‡”š£Š§b’Ê|ü ¸Y_Te©¶ÚÃÐð#ÉÄF: <á‘çy =„)`¨ëíâ6Ѻ6é°ÈyàMùÞÙDެɅÅ@ ªË,,Š XúÖ$a-‹›ZÉLIˆÙéúcÁö溒zéÄÙ×ïl®lÇQ‹!³°o?îm^F¹µ€ä¾ L¬e×F´Â«óȯ£mäàCR&CŠ ÙíЛ/™÷`±Qo IDAT¢(ˆ»ˆ8òsì–%"Î#îøEÉ{!‘[e¤JwT²9ìGüF–om®·²¼×@/Õ’èN`¥•b ^èÕÃÀuOrÇ1Ý ¸~·%ÒK6DDeyÜ_aµTc””ç¹buuõ¹çžÛÞÞ.!!¢kY•bŠD”’fŒM{çhPÆ Ér^gAw¨6·‡E–ñPúœ)¼-¾PʧOʬnHzÿ¹¼ *Úô¡juyÅV*@¥]Ęø,÷ÏÓ‡ŠMvèøŒJ€ àƒ›¼*TÂñ-ã1$ŒarþªG?åÇ¡(À~|Rʑͨ¹EùU•Î àc>wØÈ%îî=ÝZ €@fÌ ‘^ðî?><ô±«ý0F¥ïá‡c0¦–>¬ opÏÇüÕIhžØ§ÕaËÏŒ1ŽÌj›e™,Š&c )&:«fÝ:pŸÓ;qC{¾Í²®$ÎÉË]‹ÚZkc–fÖfB0 ™úV†Z[!ß«q!9…T4†]OúA-š— Ó~ÆçŽÜý^+F2Fkm`n„B„a†­0 ÝRq®|„*´‹J !öÒkï^±o\y.b «ûµ`)‡¾±I`èç?ñvÖx'°gÛ~‹h-—vmåä›oN娬­nrµ‡˜ã¬/x{¸Sãþ`.Â3 æÏæ.3œùê#¦.xío+1À>Ÿj—?~ëS¿¸r{eíô™·ÿî‰~±(í¸P&1æÜÈl§פ1üé7eg~ù»æº©w#¼`R¦j뼿ôñÿêË®^yåg ¶c3û¯oZúû™é ý^Î`xù\ïï0ûÖí¨¯Ò¨`Œ1✄ J?r« Ådè ò+ ¨…"Žã8Š|¥k·{…¤QPª .oÙUXÄý|aÄ­ ,)¥È˜È† ¸‘xA0 ˆ" Ë„eœ÷PŸ°ªe@€eŒºdCuc OÕ»~Øä|)B *Ï3h#)±}Ïï³PŠ}Þ.tv4…ÔÕøþáöçéŒ}U½þA¢Sà=CU†ªÞåyÇq–eNmãØÕzK’dzzºßïk­]™Ò^¯EÑÃN)Ë2WØÎÅk1‚4M'SyàÇX,®æNí<ÿb`8ìlÈœ|<ϳÆJ™[“¡‰ ✠î=ûÆ›ñ`«Ž¬ÕdsÅ€­]"Fäd…!(L"‚|fŸ}ñõíôú•'Þ½ò\Ô´†ß Of&€©ætçùO¿rómúá—^üÖ÷ÿÓïÿgŸûø›¯½êïl RCch6´5Œ#™ÚÜ™{k7n0™Y9cyhñ¾Mã¥S«µfO˶Õ!÷§¼@#“Ôìë_ý„b]K}?þîó?·ž|í‰[+5€¼<ïSV7BDæ×cwE2ç<¡/Z­V3n3 7 áÇql|„ž£H¡SÆÝù×u+>dÇ}Â0ÒZ[« œ‘®¬…‚ÙÈA håÀ ‘oU“ñÌ€´Ö \ UZ¾RMáG‚+ ¬ÑôI™Èz"Yè0 Bßc¼!<’*ϲT)5)&Q‡ ¹1 ?žÄ“±ñuDO²Øª¿ªâù'E Ÿ?nüÿ˜`l-ZÌGÙµZÍS«ÕÂ0ÜØØpæo’$õzݵ¾peA‰( Ã$IÊSÇ„F£Q…óœóápA³Ù̲(¬àü!¬é|ÈzÛ­{ï´rÙϺ85ÇÛ-Ÿ3g 'Æ-ãÀ,Z®Ú2õ?í×Y%»šwü kÍ¢‚@yD ô ¬NŸÜ ï]»$óY¿µÊÅÙšz±7¼NÝÐ[ŸøØR/¼ùý'¦Ï;ß”ßýúü'ÿÛ·ç—Ö{[ F6X­+©ËÍ @T˜ÓÈ9†ÁôùWºï<à¬ÎZÌ¿Àì©ó·/çfÊÃìŒð6€ mFkÁt?é·o´¦Î$§ÎšnG¬(c7¦ÒI0.p’²( O3!„aAÀY¨t Š¢@‡!FDb¯M‡ÀNn»Õ¸£û¿·³ADœ!"€ûGÜ\æY0ÄwÐÏÕ‘‹W‰qÒ¾Ìkªð”R9‚·ù”G' ê+ºÇX€<ÄŒà…TÃdÀAOLyQ¿ÞÊà'UOÕ÷[~ûcbúG [®Í1]½sÌùü“ ?q²¶ c’u’”=¸Äåò•.w×õ¤ÙlAà<ÌŒ±~¿_¯×KS¸Ûíº|‹‡çÎÎ"ÖjµÁ`àZi¥iZ=þ÷Á?$ÅÛað+ÎnÞ›-ŠšÇ3.¶ƒ«Z¿äóp·’#— £µÖ²[h°¢n…?L´Ð³!ž MžØ;L0£-@ÀhLáü"^yõâÊÍÅ ¢hº9H¶,m"þoÚеÞÎ)ˆ “õ½àñ<Û|±5sƒãœÑ1c]kŒ¦}¥ñCÙÛ˜ž?wçþÊ“YîYÍ™çÏ-tÚÍAÞiðß°z˜XÈá”~góœ`ÝOÒðÒ“×¾ÕtiÂPIÍqñD)%çRSY–¦)Ó„G8ªfe÷Jº1Dƹ«`U=¯B£"ìίå®;9ßšâF3­¸UŒà1kmsö¦Ñq‘ùY!Ñx"†l 󀉀É42Y{y£µáÅ[ÀB™´Ø`§Î<íù9‘©ùÑ=cÀhÕ¨Ù*È„ýNÔ] ¦:“ÖÞe¬Œðx26üxl¯£]ʇLãÐßV½Ð?òIþ#Â$üü½àAâ9ú3¶²yžÏÎÎ:3"àœ×ëõ¢(þÃø×®]û£?ú£8Ž»ÝîÔÔÔÃ&µZ-‡ú§:;;û[¿õ[­V‹ˆYÀàH^Cûᆔk̆¼ú¸•j¥qhQÊ(dÖ³Áo7OÔ뽡L4u™¯âصÝÏî ެկ¢Ç`àa³iƒ¨;,²ÅS§†ò¾a«3õèDÓÝÛß¹8û”µ­°€D亡2Cg/×@Þ`kª9ÇO]Z~ó•…0^'Õ:yá-S´{ë3ÍSW)¿„ºÎqï<-äy\!ú~H¾_ú\í¨›œ1†ñÀÃ\ëݶ1yiCL8)[vÁÜ5vi¯M*U:¢¸o]6²À®,3l¬#g÷’¨Þ›šÌŸÈ[Ó™dÝû±•ÓƒîÜöý©A¯i¤@^·è]ðƒž6y1ßëMÏn¶çïó ×h5zÛý33%‡!Ÿ ÂX+ÒE»×ï>ùb÷ÜÖ‰påúâ·™Öª9Û/ÌQÆA™ÊäZãŒ]/?ÃM½¿=4ä` ÆŸ ÇžíO®AÐü=èbÉxøƒ?øƒwÞygqqQ)Õn·?úÑþò/ÿò`0h·Ûý~¿( cŒK›r¡Ü‡MšÛÙÙ Ã0Žc7fÇišJ)߃1ýÁ{†Vð¸Ê)³+ZžGÃÜnÕ¼ÈÓÚc,’ÇODoÞ^ÏŒŠClc™"f§%ÖL‘zÆ*M&hB´>Ø®%þ؇®N/(/¼óZýÚÕÛ ‹íÅùÚÆÎÚ¹üÄ̔Ăf§êyvÃÊŸ g¾»zÿ¤¶H<1†ê@& Ñ•×ÈŠÕ·Ÿ9óáïØ¿{2ˆ;PÔ3jãÝ%“×j¸ÎjVs"JòðåååF£ñ™Ï|ÆmºápX¯×Ëf½Ç‡z½îr'ã8n·ÛZkƘ ?ìPà¼g0•ž2£8àyW’í’0ÆÜÁDî‰Hp_e8èé§öþé Aº×ë—oóµ»KyÑš^<‹¸eŒE¦gi¢ÂqÃÊâù[×_kßxÍ^øîã?eëÜ9-Õ†7\ûÁó?ÿ/ßyþÃßÿáß=9{þ¹m&¢µ{³Ê"ˆ®‘†‹ghÌPxLjfÀÊÍ•hnàŸzâVrÿìÒùÛý¤¾z/:y¾k9iu†H $°@ºåé¹Éâ(âñ^Wîyý¼y*|Þl&"ƒœ÷<ð^¯Ç~ c[¨@EÁI έµÀöŽÁZ:Žï$nÙPÁÙÔyžÓ¨Ê•cCɰð˜ÏY$q&¬!™²<Ù¸ùógž\›¿°7·ƒ:˒Ъ:i0ÞS–ZÂKkÓkqkØ]>ëõè?öÒöÙ‹Ao½³½¼Päè×Ö[óv˜­ln„w¯ŸöüÓaÐjÎv¼@FS7 8< « {LÿO~“ÁîâXŽõîxÿHpÄ*êí8vºÝîåË—‡Ã¡ïû¿ò+¿òÕ¯~õK_úÒ‹/¾Çq†kkkõz]k]¯×¥”î ÂCÍ3Ïóf³9 ’$Éó¼(ŠV«•¦é?îü¦> ¢ŸxLp¿GlG©SÒzFkÁ‘sÏvÓ•å­¿}å"ÇÁÅóùÙ zæ9/ðòk7TfŒOŒÈ2n‘ƒ”9qDÖÀÕo<}oíù™ ;·^¼p&mMwº÷o‡¬9 ÖzÛÞë_ù©g?zmé7~pé#~мûÆ7>Øí…ʸ7Ô&à64ÖfHqžzÌëçY]ÙÍÕ'.ðÆwþýÏ,]üÆÍwßÚ6çž_·ÌWé)`C`™U6ž»÷/þí7†I¿Q“«7³~÷ôæ²z’•!]¬Ô|, (|æûµÚÔÔTÃĺ¹ôE+lGaMZ݈3A“3&5™›Q 1Œú€RJ™f©¶JkÍ=V¨œsnÈD¡Ui)¼Ø‡0Ii ­ÇâÓõö í¥dz¦³rµ®SM¯ ºmÊ D¶·OÍë™úìÕÛ§Ã3[Zª­»ç› ß?w®?X­Y¶Îõ¹¥…WšÑÜý•Ùø¤-¸w›ôr†w®_øœQüBÚB€ô0Ì‘ûaNÔ㜱ô½ÃaÇjõ+±k—CÙQËŠjˆ¾4yåéc"¹z±joqÛÞCó‰Cá8ÒkÒõj&ÝX)Mxm= ?“ÖwÒ{•±Øƒ SuÌIŠT aöû}—{•$ÉéÓ§{½žs;õ«_ýüç?òäÉ?ù“?Éó<Š¢Ï~ö³¿ó;¿óå/ùõ×_OÓôå—_þÌg>“ç9"‚±ÿîßýïÿãÿð¿|ío¾qåÊ•Õû+ŸüäÏýwÿý¿e,,ŠÂ÷}—uUž_Zu:Ï}îso¼ñÆéÓ§Ÿ}öÙßüÍß$¢Iþ@5 ³ô0¼Ç}øq븇&¼§‡N:ïû~›:ìÚ¬ä…Xa‹8‰N& DÒ@”JŠÃ…<É1hpVø^ €<¿ ¶Ç4"÷‹þõåˆN^}³»±Öá“ß[z,^¾þ¯Mºž{¦Ùj%Ûs[ÉwÎ\œlÈBÞošÓ=ÛñgZØBÙÔéæü £ßŠN®ëõ‹s'¯=þÑwnÞœ_¾ó3ùÿü_ÿÛÿºôüÏ~ãk_?É’ ¨çÉtPtkª¤ãxKjÀ:Ë‹…­»ìÄ©Ö/üƾ¿ÜzëJ½Qò$ˆ[CßëIäpŸE¢¿òì÷þ Jæ7”›§?Ô¹üÂô׿0“´¶pgË‚&Ë4@Î D¬ _Ô¦Z Íd¤Â]WµÙÐZ+¥Êv¿Œ1Ïó<Ï+ëMb`DߪðüPzQ¿È!íµŠ§ŠÄÚn²ÓˆšwÃúÝ"%Á‚) žfÊ©aº&ÁNe0Æ‘5 ¥ä‰ chü³ÔeRD†ˆÆ˜0ô=ïá̘ bV*<‚08¸^ÕëÕ?ßÏøÇgÒ|`DHUëàŸåœó8ޱÓé8±Ë®ˆ¢è…^xþùç}ßϲÌ=«(Š?þã?~á…þðÿðWõW_ýõÏ}îsÎ/åªÑýÙŸýÙÉ“'ÿ÷ÿw÷w¿ò•¯|á _€2Ÿƒ±ê·ŸýìgO:õÅ/~ñ×~í×^}õÕ/}éKiš¾7ì=‚Gp4 ¶gòasx7ªõ˜ß#PJ2Æd–LdжÎ[Z ¥‡–¶½`Ûð;µ¸QtŸÜVà"ñN­ÁŒU…½L¿Gv°¹¤táÕ7USúT³Ñª×[ýÍÙ<™‰ÚƒÆt²½ÖŠÚ×Nœ¿“'Ñò[Òîlw}éæ›—ú½©Å¥&2©TÁ9gȵ2Öj@Ãõ4³ræ“ݾ?½|»ÖÛi‡z‚Gð ¾x%no„a\ô¦Tº¨‹˜ ça/ï •aÊÂW‘Ž‚8ö§Š‹Ã^†þw1ØŠZëÊ»*eq1˜#jQË cŒ´™FÃãlÞßöx<}§>½½¾B*¯ÏÍÍDö©“'B­†;-¿q/¨™4™‰[ÁÒé°LéTA„Zk@²Vš<&͵*›eI|ëæ¯·nE–¢Väy‘åFvqÑ÷Ï!…œY”çÒÇc~&ð©*€¡ÂLŒ1.›Ê”2MÓápÈÜÁ2— \Pθu ”*ŠBJé2ŸM\Šq''Ò3º¨1±åÇ+BXÐ5NâÌ¥áÌ|‘t§Ö—§ ]CkA3ó}ßýÐÕÆsiŸÆÎ;=³¹¾‘ †ï¥à<¶×Î :'@µTçQ$æZMMµæâp†Ñl‘4‡Ý(é{EF™Sg¨Ù‚<ÓˆdÕbÚ½xmÎ|Ž¡MÎs A­Oä :‹áô òšÍz­^kik,Èý¨¦º³¶²¢Óù¿Ô¨· _Ï`½Ÿ®eÉ4– @¶›Þä|Q– ’ }懒û¢(æ“þœÔS¡h “(z~h¿Á±Á9#u{#)6 Þ×´™çËYqÇõÚÌXmÿœVJi­òÝï÷{½žàœ3Ü­¶¡”Ö¸›»¥*Ù¥”J©]/Cgû:#ØåjQXËÑ ÁâºHb9Xðé“?X8‡Y­ß:½³Åˆ¯“#‹:A0£ ÑÈû½kj3dL€%¾Û¯Ðeʱ}¨ÒŽæa âžKû3àŸŒy#~ÀÕœ:Îø?=Ô¡Ó8â¶’nËÏI’|ûÛßþÛ¿ýÛ4Mc¿ýÛ¿}á­µïû.ë <Ï+ŠÂÅn]iI÷²ÍfÓ³½½}òäIr£¢(fffvzç—vL\Y"r[ukkK)åjcÍÍÍíìì\¼xñÆo¼ñÆóÏ?ÿ°¨{àÐ^ÈÀ ˆçÚv´±ëin8›ío ýšõ£¼^K‰ ™PËÐæÞÊ ËùYKêôSYÔkwë„V,UÝú(e·~@œÕw6Ο¾ðzu¶<™Da{ÈxX ¦µ¶ÒÜ?aј-Ë^ó⦛?ÛÀÁ‰ˆõ­Yk„ï…ÖZ)sϹàÚ ÔK…¥¼ mFmCŽò »ÓÜÜŸüŠ çÏÌœYV4uë­¹NÍ/Åw—7¢V~öé»'Ÿˆ’¿¯E­ksçÚVzõ cd+à‘2] È2 Ï‹e©–PÛ.à—}n dAÍ¢P™,ò|úÌ÷ÛÙÍ—Óá¶’ÛíéZ8ugñB‘(½¼9dìÒ®¶m¬ö3¥TA…RŠc ƒ6¸;®äÌóK¹1."åY¥Yív{é@vuÞ€tMC"` Ì´ç÷NœÝ\<ÛSý÷nœ¡€ #5æi5³§œá›¥ÃºÇ¥”^À”R†i%ë3‘çÑ3|*i¹°J'"ô¬’ÀlxÎø~XuGŠ?ùÉOþú¯ÿºïûNgaa¡ßï—½DÁ#øÑB>lÕë|fqíòd­y‡Q µ×(5¿ôÛww6o¿³´|³^ª>½uúâÊìâ6g1óÄöòÉÍåÆöúÔÎê"òf}Fù·Ô`‰Qìc;1†…Ãa¿uëí“§Ïö?ôñumýÕ[§¯¿>+M¶ºIç#s§nÝ¿sÉ*¼ôÄÒÅ_1ǶfçÒ|õ|?õHOYð,j.,‘’’ü b™Ì„~C E–gL{½@\–é²¢<¨ƒµtpîôã?œ9w?ŽêßýþëûçV®_J: ¯“ÙÍt é® ¡&mÐUþ2J)i¥ÛÔ¢×ëqæ1_ßÇVœpuö‡ºUy\….ÝÂfe±-Mh%­W§.ÝBöØ[_Ϊ'8¿VŸN,)7‰@ dN²5¥T–©˜ÇRJ/RJÍ 1Ÿ[BDYh 4šÐÆ`XKʾ”»}ÓÄÁû<Ú‹×þÓGrôÿ³÷fA–i™àïëÙî~cÉÈ=S™ZKR©TÔÖU0¬mÖc†1X<ŒÙðÂ0f<ò0`6fŒÁã<´ñ2 m=KO3ÕtCµ  U%TZRJ)S¹DFdFÄÝïÙ|ëéqoD–$ ¹¥I7î=ÇŸßÿÿÿþÍÝWV[}ÐYû¾퇳ÀüíàWáö¤n]äùÚµkW¯^ýÙŸýÙ?ú£?úùŸÿyp[QÖuí·€vÚÍçscL’$UUF#Jé©S§œì¬gŒ1¥t8Þ»w¯×ë9$vÉ×cl}}½,˲,µÖyž'IR–¥”²Ûí–õGüQû»oÙú}U4n¾]V£Íª XýçÕwô·ˆöæ>û*÷¥/­¹¿Ÿ¶ô"á¨l„Ô³Á w²hžŒ®;’¥Á¸Š÷¬¥âO7_ýx,7†làçüôéÓ;;;?ó3?Óétþàþ ÕjcÜú]—BdYæHáê­´Ö7nܸtéRQq°­N»¬«º®“8ë´º¯ïÚéÍó „pÒîâUUUEQtöü¹ÿôç/±ˆF,¦„0ZTÿh6ˆ^¥ðû¹Å¬°Š6xUê„P<ú–Ç1æ÷ñRÀ d²Æ}þ¾‹BÂA¾O¹xß-“•IAIdjjLqB¡ÛêMæZ˜®Šç4zz†vH£xC ‹ª:A–b[šª@ CaÚ•™¦-–4j«g¤xFUÛžˆ_Ÿà›X£â|ÜÞ5|4m~C–ŸjàO:7ñë4êDÅÛrß g•eç¦b“©’mÒlíÙ\ñX±‹ˆmkHœZ!óyr¶×PjNÙ”Ø49‡Z«Lœ§ñ;'ÆÏ4«î·âxXÏŸ=cÃ/U¸?.“Úœ¾?•¯¿Q0Ë«Zk± 6`%¨J×#Þ¨+¨Õh-jVÕÑ8b)ežç£Ñh8N&“¼„ªªªª*Š¢ªª²,Ý…n™;ãÌÕ†Ø`U{G˜Ì ½eØu 7«zR‰,6‘mõº­®ÄéÛsñš¶“ù|¾{ÿ¶¿0ÛïrfÁ°ÉÞy„’S—…¨áœ>Û¬Ôþ›oìäåœEYL.MF1~~­ÓBfÆPÑ_›R…Ä45fï8Öüþ™¼škKJûüÕjKÊâ¡ï#Zh!…*)\­÷·|hQ”Òn·[ÅOüÄOloo¿òÊ+Ƙn·«”šÍfI’cîÞ½‹1vEΣÑèÿðƒÁ—¾ô¥v»=›Í8猱~¿ëÖ­ßÿýß·ÖþÜÏýœÛE+<9Ôm­õ+¿ò+Fãw÷wïܹÓï÷ƒÁõë× !ÿ™fë£öO´ ½§Ñˆ°’F†pK-æåd>çeIEˆ:C|L’QU”®,"ˆ6Í%”UR6¤¬ôxR”e¦1H;GaL0Æ€´6BJ©eÉzߘ‰ïJ[Hû®à…¨öº¨÷çS#«>Ag0NK=)a;´®ÂñK¼Š”­•™ -”$J"ÆÚ”“Ú<Ð(g¬Em%ÂŒ(—ÒT²E»œž›ºÃìAÓ—àWUµ.*Q YŠz–çy•K#-2t>Ÿ‹ÒÅ£qͬRVJi„üº#÷Á•\Ea­ui*³8ìÐZ›ç9"¬—ñÍ$J8ŸÅÍa–íôÜl°©M†c6Þ“bºµ…?÷#gÑÚÿñõýÅbt.ËæemFÃxó<%„Yþ§çž¾{íõ›O6ºÉÞôÕbôT,·ªêÛžzsx_sXÛ³‘ÊúFÕ$Ø\Þ Ý½µÏªzµ+Aôþö#üÇÒN2YBàù‡ö^è¨ßo„«Óú}û?ÖòÛ¬/õüAûw…QeY¶Z-¥Ô§?ýé¯|å+ßüæ7Ÿ|òɲ,1ÆišcšÍfEëëë×®]ûÕ_ýÕ(Š®^½úk¿ök/¼ðBžçY–)U7W_}õ~áD­>óÙOýú¯ÿúùóç]¶xßå’Μ9Ã;wîÜ/ÿò/ùË_þ½ßû½´ÛíÏ}îsW®\ù []~Ô>ja#`+¥RJ"‚pE<ãTia§„rŒ˜1Øj«5€&ÆpDk„±5Ô“)«¥„˜„_b,²ÖVÕ\è¢5¡‚¥ÚˆØ %€ÐÖ c6m¤!N°(ºJЍu›0iëþ©ø cL¦7•e.JÕu‹ÇÉå]wÜU´OqA cRbœ€ÖãIÉ‘!9€)ó*7ÓF\çsÄ"Ê9³XUz¯1`•¥= pY ”âÅ"`%ˆr¤ˆ<)f0!(Åqlè`0@EQÄXäŒe¥”¢6Ö­[B¹ÚË4M­µnh—s £…)_¯%ÃPBUqçÁc³¶½—E¯ç…ÏsS_žüÙ…½[g)ºûø'ïªÑš5²×cQÔEvû³Ÿš>÷¥7)lìð¯þÙìÉ3Io#J‰Q¹R›ßþ‹§Ÿ~qrñÅ[ºfóÑÙ÷^ߘM»$š,ñÁC͈>Ìê^„–§'Œ%¾Ÿþqµ“Hä_öƒâÊæÚê‡àÕ?íâ8N8Ê‚J¿ó;¿ãdj?MÓÍÍÍßþíߎ¢H)•eÙ/ýÒ/¹M(g³BèæÍ›W¯^ýÕ_ýUÎùx"øüAŸ‹J’Dk$I–eãñøÔ©S{{{t›ÍfǃÁ Õj¥iÚh4F§ÓÇëëëUUÍçs·>8Iw8ŠÛÓ&I»¶¶6ŸÏ…{{{Œ1¥Ôx<Žã¸Óéc\àZ)åRKbðÿÛß÷+œ$ÿH÷wÒ2~ÁÂ\뉔•6„àˆPÄ(ç‘5È*0šIµ$Æ0Œ8" m¡tN¨aQJ WUÂpšñ¬kY m # G\W²œL&ͨ«´5FJ !`AIi@¥Ñåñä@+Ùi³¨EkQJU0cÛ³¦œNê$îpÜ\ï^ifJ ¿!¤ ÇÅùŒì!ÀRÕ˜R‚BæRÍxÚO‰­æX¨çœsÃX©+fª›]•b"ñ>Šl»g­h^ÎfÅ6ˆ o û-è0Æyž3ÐŒ6\‰RJ ©dI;',ù0Ii»y…ãQÖ¬U‘QÆX4¥ºL0>'£7Uµ³S½~sðêRh²¡«¸ÿŽ,²zzJñÂX… 2C¦äá†!!C|hÁX’´Š@'=÷Œ¡£éÞGÞÿaª˜Uûà}ÖË|жÄÞSüp‘gß\9…+užL&ÖÚýý}k­Û‹ÃÜl69çÛÛÛqcŒïܹE‘«ùê÷û³ÙÌÝÕï÷ÝF³4‰÷öî»=¥]TÙ‰­ÛÎÝÉoQÍfÓű²,CÇãBе¿M³²´dHâ!O¬MQ 4ŽZÓÒZ"P”YF5£Š`‰q…¨¬¥Ô¢&˜±J–J ËÁî¼ÓmÅã2¯’8k¦ kÖ(¥€ZôµJW4Æ0Û[ï®%˜£ù&£ M÷£(3åF¡w#Öˆ£f–ÉáäÛ¾Íé%Sg˜{´üÖ5fâöÚT麘u‰nR*¦¢Ê–ýõÂjTäJZ÷úÏ4ž‘Tʘ¼P籩f”Q§1(:,q‡²¨EnER)!•@Êj)KÚn·fI’` )F™ÖZ–¥Ôf €­µ®øÙ¥¯À­5ÖÚUptZgjÃ1Š ªÒîö¹+÷ŸŽîªÆ·³úŸÝ|ïí[7ÒñÞ“§6×Pt,®f]›©l‘¨›¶';w&igï±ߺp9Ý|ïÝÆWwnݼÓí­Q‚j©™n×Ãü‰xãìé¡EÃɈß~ãù½ýµl«·ðÁQx™Kì÷9‘ðX?øXñŸR;6šºZŸõ_`d߯½ÿLð5#BÓ$,6ô…ÙË9çÜí銫ã8BÄq<ûý¾ÓEQ(¥¶¶¶~ë·~ËZë`¸( ¥ÖÚ(вÿßø8jÄq:Ï!§OŸ®ªÊ•@;Ù”Rºø–«©¶ÖJ)[­Öt:½{÷n£ÑèõzóùG»Q~Ô>|3èZÖ¾€úëù$¹uÝìïUu)Ò¬mq•dÓþFÞÛȳæ˜EsBÅöµ'ò¢1>häó†(ˆÖ£(÷zäÓÿÕ=F#„ãé”ìÜ…ûÛó"G­‘ècd ˔ڪ(QY_üÔWûk-FÓm´}ÛÓ¦‘gAn6úïæƒ˜ÙæÕ+¶µ¥/>•}ì±³/%.Éá¹#¡÷ˆJììÒå=…f7¾Çª¢Ë2†âJëˆ#µw^øl1$ï|/®k̘~î“¢»ù¿•ÛWºÍ»£ako·1:8ŸË‘`c F(Žã4M1P3ÈÒJ S+0Òµ¥Æ‹,Æ8ŠX‚ µTJ™O§š2—‘r&³‹h¹Ê.Ÿóë.ByyGFIf =ÒwÏ wOíLç]Êÿüôs?=øÞ7ãƒÛÏ™|c}31#''¡ ý+¿“$w_þ¿PÓâ¹›þØ?_»{sh!VUÙu0äó?mŒ‡<(fü¨}Ô>hûôç:ŠŽâæêéd.dBP§‘õk3”UmCâT=ˆÀXY+#õ ?þÝÙ˜z½šw•4œO77õ¥Çõøæ 7n¿eÉèñ§.Ÿ;½&‹ñîÎaªM À a˜µ!›¤¸¿ž$øÜ«_×€Ë+ÏÕ¬ùæ·ØÁ`ÐÝØÞß=}öòιKoŬõ—ÿ^]{£ýÌÿ°ÿ™Ÿzý¥?û"]v Ô§v5ßx­SL·±µê š8“æAÒ¹Y²¹Ð¦‹÷8q““Æss_¿ý½Ï~ãËÓRqZÉ|‹¥´&E¥'QÒæñ…YÙ¼7œí–£‚ÙyéÿútÔ¾õÄsƒJÜ C¬sæ¢HÉðµ÷zSõ_üÖ_tÖÚâÊ…UË´Á@'–äiÂMžö׿úÄcÛ×®·Ó­éü¹oÿEk]túßædc\ñ(žQº¿µeß»öü×Û*Mn]{:åäÒ¥»P÷ ek«ë¨&Ø°Šœšç C;Ï\z¬½y½D”—IïÕÒì|êK·XMpŽò '“®P™W(ιÇê;[¯¼ôLTŸyîY‚íî|25RQt8”Òˆñˆñ8jÅi‹Ç çŽ[ë‡w’¬Âqþ¢ 3á[û1„WâÅ!}áôÙGz¢á\¬Îïjó§™ÜÅ‘Õáínä'åP—rÆKc‰yìþ{?pÔœ2 Ø‚Å@ÆZKññK{ý¼/ê¤v 8þXyt‡ËýØeú¸Ïö¤y±ÕÏ5z!åþ^í'd*ÿšžnÇ©šãYk‰!@úÏáü;ì“Þkõ~áx|ÃðäÖ8ޱx¨ñ”RιUÇçÞö]Œ0ç‘[§”BǬ_Š=%"r:K®}¿ª'[ª.1FfÓkŸÅ´Rx—Ff:«òJØý«½ƒÁäzÔÞ¢Ÿ°9kcŒÑŠsÎ9wûœOÆ…#ÍY‚qÑé6öŠ8oñd­ß™O·ïïÜ{°¿÷ñ¸<¯*L“$3,2#l!ÂHY bXœ‰éþÖÚ…·éí˜ØÜˆõrtêâVaª®0‘BëTD‰5bV ¢¬3ÚÙ}÷`<¥E$å%K WØH0F‹ý‚B”Ò,N¨Eu–5Ó,ÆÎ(@‹Öum4!@Ã|n<ÅÝm®„Ò圠,KF¸1&MS·IÁ“Rb“k•ª”.¬U˜`J‰APM;î„®e%3 µ.N!è 4”RRÊ­QF*„PʃŒ’h}}Sª›{ûw×£æ™3§,zSTL+j)Áˆh…¤´Æ˜ªÎ #žÿB©à<¶‚Æ”RU*¬­)4ê4À«à±Äß®+çn:vÄ1Æøý±á(tiP¡¤= ´¬§<ºøñ{»]úÆëz¼8¾ìæ: >IQ.]ï»r^—Óø8ØÉáXB¹#½–èÎýzmÆžý±’È?Vñ=zBW¿ñ•I¨WAޝûÒSÌiêcŸëC»K ¯ZU”ž8ÇÄ `°–êýÇMñ±×»ývðÑÕÏh±B^Ž§ÃŠawìkúÏp^mEQPeµæ°P­c̘sÀV›V<‚„’Ôh¬”AqÆ1b2–¨ÍŒž+c¥,­¡YºYÏ÷)1A·}¾i.– Êå;íÆž™^6"Òº6&®«SӪߒÜ@mÞ¹+(À+ cDsgùc„BÌœ{=ã ©Ñc!” µjAQN:|3fiinilj‚jÊRŸyêõb³½ r~¾¶H›h>…¶Ö㵨¹Žc5ß§ëñ0klÞwÞš6Z)¤@ „<χƒ2N ¬÷"~pj«ñNŠ*Ê‘ÆÌ§£ùtjžyæY„RPU8Nç’€€1Ì*$A1EF0Ü~sãÔS·w¶» g½®nt§®=f(ꎌÝ46±¸Ö™*Ž£I¡Y1µUUMÆèîn>«oU;Ð´Æ „ܲPJE”‚¡ æ­±!ª”ŠÒ„1&k9N…Bˆj6‹ëÚU]ú4¤Öº,K¤µ6Žã½½½n·ëª+•RŒS‹eÑèJ B¤:ÿlÞÙŒÇäàAC¨ E-L)BBUZB´ªŒD)¥v8˜=‘µI«õô3½òÝW9ƒ§^Ô5£(–ºÔZÏÊ|:)´fBæg!zÖç”[„H)­%J)¡«FÌBy[Õ,KýÀ"ë.öy5wFÍ*ò-1zØÉ’Òw¿zÙ£ÎÃ^R~$þ÷D¿FhiðÀ»bðYkÁÚ%Ø‚)Þ×xñ8×\*zÕL óâKüóè—š¶Ë¤û“ž„ãÖûÜ“^dõ8KÏÉÇÊ…ÏÚ8ùr·;-rBˆ¾Ç~[:>Yåÿ· lõÕÌÑCA›Ô"™]$9çP¤%1'¤6,q:,Š¢$¡œóÚB*̦Rö Ø8µ [Wê’NDÝo<ÿùì½7¶vo^OjÞŸwâÍÑvÔÄÛŸøâƒW_îgÙyÏXôÊWÏíåE÷"ªö,Ƙ ‚£ˆaF o4ZØ,í^ו* =*Ê‘ d³ÑÈË·n¾{{có…çŸvœOj\`c¬(L€ †tŒ "'šÐ{ï^í?>Ü8;¼÷VëêS· ¡ÆE1Â,Å(2vfA§ÍÊ«és›§o´Ï¿ƒìù{o>F°õçv»‰!„$QÌ9l#Æ PIiÄ8"DX…-P·¬(Š"¡Å´ª0ÆŒ1‰±Ö:ŽãF£ÑívÀ­÷/ŠB ]…1æÁƒ½^okkë0È M!(AºVƱŒ“ùåçwwÞÙ¼{­YkCÒ‘Ò16ãs£ ¡ØZ­µ´Ö`Œ­„H%&ÍôL>—[gøé3ëÍΙ—ÿê«?ôSmj´u”¡”§3Å­Åœs„ÌjèÏq?OH­µ2‚aŒJ’ÄàªVÖ…€¼‘ëUÆR()K¾îÃ%—ÀõÐe¤Ç3¨«Ã õ…ÿÓ.’¦há’º8sEKxébË^À|¼Žªi¯VMØaèWÙ…ÕïÞÑ;dŒ1?’°Ÿc·¶ ‹>¹Pg…U!KÚÊéŽúðŠ)$Wx>æ‡àðÏUíÎT¨+}d"œA8Y†À¼úšK~4®(ÖZ‡°EñÌNO¨ˆý8×í‡|Gqå}6ÇOŸÖǹìs–æh©Ä!v†òV/z·%¬°ÊI¡éÕ'ºÖŽ…ߟK×ËÀà-:ôÛOÜÁ‹¨À ób­­ª L.D¡T,D­‰&8¶´®Ä¡€ekxÐe6:}5?ûü­û÷Ÿ}ï ÄÂé IDATúš.cÖhrGÙö^–ýÄçªxãZÂ.X3yý/¯¶»ó¨¿þÎÛ—z½7@kÔu-•ÕZ—em4VbnjÅ0Š“‚³oüÕËgŸ–qÒ¾zõ1m$' c% %`4¶Va À!Lqbãq5ª:ÆÐ7;ÿÔ[³{âüÅÉko¯ÍJ´ÉÀX‹ŽŒšb[%gþô§5mþÅÁàÞµ¿½û½s{wY®v”:¬†óDŒ#„45­˜+F)Œ1ÂØhmŒ¡³Ù¬ÙhK)Ý1gu]{‚6›ÍN§ƒ1®ëÚ•eÎf³|V¸5‹÷ïßßÜÜ4Æ$IBWq‡có¼Óßë¬ìïóÝÛ[“ýf¶.BZ$1‘VX©¨T®”FqæÜvB(ˆ¹É²Öƒ»[§Ÿ^WÅ<_6U¹{¿©Þè‚ÑšÑ(Š@Ê:…vÃ8çQT×µa#ËyDñ‘œ«—´ÕЙûÞ9‘®’‹RêR_>~ê‚ÃmÂÐÃ勉,^sÙ£°®¿Ìa¡•+j ‘ÃZ`ŸÇ ßÈ+÷¥`0Õ?Ú‡¸]\­ùª‡áç<œt ÂÈ¡²çÑ Ï¹ûpT§8HðÂpÉó~D1EXxÀKlìÿ<éñBÐpÂñØÏÏ'=×gôÀQEhï ¿ ­Ì%RÀÑ™ ™üÈk°n8ì“ò$®¶+ÿÁs&,²]ã“øó¤F)•Rðv»Í;˜CY–š¨ʦ ÙÚ`‚’”×BX’4+™£H3š‰‚a2:weré) öñoüu\ÍívÕáÙ ŒTý~ræ¼ÜÙ®¿ûÍǰ¼úùqóÊǼòÕÇöæ³ÓW¿¡§ënF%ZicLE 1ÆÄ Ùl5Ì,¡$Ú?¸÷Æå0l=cië‰'ŸïÍÖþxœÅ[QŒ@Z͸‘È‚6D ‹À(D2Ƙ©‘±ÂâQܜܿžy²uññ(»»÷NcI¢•¡ÖÃLÕ˜"qp÷Å·ß:=ΣÁèí8¹õÄÓû§Î—üG§ö]¸ÞB)uqrcŒ"ºÙ Z²ªªÀXïQk­O»J?Î9Ž"ý‹¢¨Ùl:aËó|2™óÒIþ|>Ç.PÉ9GÀ,„¬ÁŠ€á餳>Ø<3ø·ÿúªäI\ÓÍ‹®€›ãzf-ÃÇì'¡~.žßÖKìrÀø„gN*þ: €—JÂq†|åéðèê÷cÆsBN¨Ú¥€B’Úƒr©-U}CÀ'Kráû96mWŒ¼G@;Í …ׄ"ÞòAsç'==”8:}¨ USeÛ½3õÏ4ýwÿ.žõrZ³ÌÚŽ®`ŸËÇÚ­i烃ûä+ÿáBU<é¡(É)îªJo=v½ÿ4¼òjïÿüW|Î"Jý|Zäöì‡?µøõÿån¶šçgƒéŸ¿4þï~ öÓ—_ÿö襲9!i%ÍÆ†•–è¨qú¶öOþd<©^ÏÒÊ;šMú[yš¾ØÙ¸üÄÕÓ<þZuʺJãn™—“iKIŒÆm2€‰Æ˜ÊhƬNÓþzûÉáP î®m]þÊîë_˜ŽÖ³xÀb« ±Ö"ŒÆ)æ“aVO'ùß|åÜÎ;“/ýÜíçpøõ¯¯;Ù„…ÎtGˆZ5«zèËC!tss}m½wæÜƒÔ0K”’ÍV&¦iÒîZ‹šÍ¶1¦ÍÍÍwÞy§(*ÀhžÏÁÚšÑd\‰zkkKJ©ÉÁdõzÏcòÓ?ùî{£×¾üotE¸2Ô>Ø™w»3¥«Ùcmã]>þAÎïÌgÇ5Õ¾™¾„Që ¾q÷n¯y™ª­j/‹ž'§.ÊOÿÀ/|êÔM\´7ý¡}{w¼%I£EÖœ@;ù16a0OýÅ_üÿëη‡C9áI¯ñV«åöò!!â¶Øã¸ÕjÍf³Éd’e™«÷¾uë–1fkk«ßïsÎçó¹GJ§¬9çÓéôÎ;e]dYÇ1c¬Ùl6›McÌl6sÕãóùÜ­Ëvr8™L£ƒétÚh4úý¾ÛSÐuî\m§â¥”ûûûãñcÜH›gΜIÓÔÅ*BîˆuȲÌIæp8ìv»®z‚DZ³!&“‰1¦Ûícj)O–,«¢(DUSJã8æ1ÛØØˆ¢ÈGéìƒ(ŠÚÝÎÁÁÁ|>wÇжÛm÷ÓÅó—ö÷÷ÝHœ¹æ€SÄ óùÜ-¥—P´¸Óé4<Ï)¥išº£éÑbñ"B¨(ŠÁ`0˲4 ‘]ì7MÓn·Ûl6ûý¾¿{}·«TEI”fY¦µv‹×ݹž `ø…¼N+¹2~çß—e9›Íò<BDQ”eY–en·HJiQÓéÔU6:»GJé‹ÀµUÎ,p½y K µ­×ŒÞ¨ áÜ¿‡|´X^[]Pã„U¸JÉ1ÿê+³ûÏ^,PÒ¬ŒµÐyÓ°ÂA,TÖBI)¥– c3N)k1µ¬–L×4±ŒRÆÁ ##c@òˆ ¾ T¡¡³duYk5X ‹u«*´±Öe#)&Œ1Š9,ysÕLî 6'þ°È\ø/À*í@ÔÍ»ÇWefx³Ò!®3…}Ãq&EG–>;/Çq]x±ëAJ©Ñ!øùޙܒÈ/ÒõF°”ÒǼJ0óÌæ~åNWx®v¬î·N"œàÑáÒ ‡ÐÎÎ#„¸Ìšã­5èÃGHb˜²ÆÄÿSŠÐƒ·šõé‚ÖˆÕF.cùícûLõ?ö‰¯!ÖÒaí¢(:ÈfHd¥ÛíFQä²>fÁ"qsÎŽŽãXÔ›­ö€aj¬Þ¸0ª‹d÷­gŠqF³WµÈdÞÄØZc6•5Ý,ú©µJO­Š¶ß5g³” U^å³´%й?جë„4Þ5$Ýß×g§q<ÞÛ¯QÙÞ`˜âM]w93ȉÿ<´Ç1B€¼Ó€WR€Žã½„øŸPõú/6[ð:ţ㒽ɂæàäPÀÐúkïrùçzà=]§‹CŸÃ7¸¼vá´á`Õ^„²œ/„L°ú!MÐrF /vXôýØ£n¨{ƘSRá4ÁQ_<¤’Ç?çîDQävÉÀ‹ÆØÙU~ÊÂ}˜GD‹ å…þ’þ­ÅÂI÷ŒŠØáþ+0X°n¦ÑQ_yu¢íQ@ý[6kV'/=%| `8üìoñƒBö{#‡ˆŽJp~Žž!x–^6Cvó~ÒB²Ã‰X0Å{,]JDøçÃ%Ó¿²1z鮥 –Hçú1A%JøèÕI iƒ¬“ç.?ªðóÒë,u²4Ñ š1mkŽÌàÃTSÊœ¡&‡óÖÖVtÄ[Õ6ñ[IrA”ñùÇo' ±}ótJè’T—µUiı‰ ÎÀÓQ'ýjÐŽ›Mf΃±Å¤5Úœµ'Þh^)«5¡‡414bU¾6ô6ßcr#Fý(mBÊIßÊ.ev^Î1dªnp&šiszЫõ°Ýðx¶jEB„µcŒµ–(Bae‘Â(ÃãŒTdbrªŠÀeQ˜r«×Œ“8¿¹û0ç(ÂJ PgpÕ«„Ðbs UjÃPM´BE3&ˆ@–Ó,Ëz½Þ¼,Úív«ÕjµZZë˜sÊ¥t4qÎ{½ÆØmíh1n6›FÃùÝnwxÏÎp^ªÆëvT ùƒsI2¦¸o)…!6›íY!­Òy§«b2,Fwl½“¡Ë³}ÊžØ&É7ߣíf²y†M'{›Ó1ôzÄÎ ÷Ÿo¼ÖêÜ+sI¹^ëïåz¼³ÛÕ2A ya9‰`Œì‘aBÎs4r&…CJ)µþÙE®Ñßë 'Ì7ã`‰-^,<¬v‹¢(Š<®»9 Ø†#ñ°ç: £»¡Dyh ÅÉ.ì_oÌ:Pôbì7 t~‰C‘PÅùžàP¿8Ù?×ÝîãÃÌ·µn$d±ˆ\jé” [GîœJ©¬•µÖAµw>ü¼˜EšÙ}¯µFÂÑzÂ"LêYlüp5óB/)Üp ¶rt>ÜÇ!äü`7¶p1ÒáôÙäµ' _lp¬Ú W¶x^RåèhŽ`ÀZKpôÅCÕì󪫠ø!ÚQ“e±è?”¦Ð÷}ÄS–…¼`9p†3„é$9YÂ!DÉ!c @ hƒŒ5Æ,m1…™]·¡ÄIcÅy÷?9fö?¡` 97VV;ãÅ?ÏŸa´Ù'3bòP*—¦ðl‚Ò/×~xc„Hï-4þ¬µþa6hhñ\8j¢`Êr) L+ A ©´DVXèt6Ÿ¯õÖ¶­©wÞîÌóùÇo)2丫D‡Ð!BãñDž¹ŒÏn$“?£ø•s§7³d}>lTj„×'ƒ‹YÿÁª®#0VXVÕ•—.É{×G ¬míGä|5iV¢Dqž–9.ŠÝFgGÀØh­[exs:Œ´à3@ÒXA"8Ò†’ÈÜ ,!‘ÑZ#Œ5Ê"d(c9!5A!+dÍùœPõàö6ÖONîeºRIcxþLÖh<ñö6Bè¡=çõ›ÖÚZäæÓÆ­’[îtÄt:ÝíÆ… ¾Åˆó cY–Àùóç1EQØ€»Ý®+vʨÝÂ…åZ3eKkøè~Ó”ç97¦¸’4`z‡‘îþ½îÚ{úÅmÄáÚË阊ʌdÅ4»ôTÎÒ餿Õì×û{¢– ŽQï`g“}òf«3ßH Ôi õàà¬/ÀÚP`Bý…ÆØb tÑBcÐ9°XóSׇñ!^»ý½NGA ÓÉ¡çrƘíâcd±xÿPƒsäB þ( tÔ™3AwI«†ê€,vñ¢kËu\o> *„Ћ³#C¼÷¯ ’Dh,»w÷6µ]¤Äc.¬MqPê•‚{kι$÷§Û[(¥s“;vFƒ¯/[*Bñã1‹<4 Ì…°æh"Íx…Ê(œjž&¡â^\ÜÏͬ㟪ª}u0ÀøÆsΆEQ !£x‚Q)%d†Ô”e#ÄT] LŠfÒ3ð c-AG·†cj¢išò½}Ñ;G×»µ”½o®õúUýæƒÁ¶†s]o®É§¿pM™ä­o??rM†Ó9ìÜ9Ó:õïGÛ_H²yûì·'³Oî?c5¤ýíÁ=­ =‹æ§›€*@i«ƒª Å4±š3N´Ñ cŠ1U(£ºÖ2ƪ`„((Iò‰¡»,ÛF,³f³ÌOšÞåè9U«*Ÿô6¦W^˜?þøæx\~ã/ BS?^ù g ꇯÚZVƒ¥½^oooïæí[[O^¼(„RJ`—¼yó¦ËP:0!N%õz½µµ5‡(yžkKf£O‹ÎÚ¶eyóÌ{Ÿ<÷:$s¨ÏÐx2™ŒêÉÀ›³aÙ¦®  wA‘~çò|^”zûu|åéÎÙ ¨*a>‹oÜŒ†ã1K1Æ=)âápúÇÿû•ÿððS?T`snxðÅ·þ*ÞÝn_xö;Zô|ÜÆ«iüŒÁƒ(9öî‘ÇQ‡^îv¬^ž½íÝAÿ“W@NØüâ ÿ ´XCì1ÀuBŽ–Ôzíà-Óp=`øæ½·Ð‘uvµßq°t-Še<„{‰]Òeþ¹vá¶z|:4\ªÚ-uOñ$u=»ì”+^síRÙ£q¿Ðuð£õXh#AÁ¾n°‚7!ÝPðw-QÕ‡(C´ó¹WºlŒq¶…_ìÁ:N‡Ð‡•wJ‘À€8ª=° °*ô•a«p°"ÜE84 V» ‘•Òù༵Ö×U–`}hè Çì¹Ó{Až¼!«šÃ9ò‚÷}Èù‡_..#€°c XkrÕ“ˆ"0ÀZmB`,@öaÕ7²@1b‘°Ô ŽÖ<{¤ôt¶Aüìt€Ð¡<ºz/RTŽ+È¢åP·`B07Má0Bø¡nuH!½¢¿1‹ÕƒÇ ÈÑÈsøSˆ¾ï=ä[„1F½ÇÊZûÌç_G¶b$mt‡RªlmØæ¼òµÏJ£Òî»R©¸7þøOþÇNãJ©ÞEê´&“bH®¿Ö,  è콕’'Ÿùâ‹»Q´=¾¿yãZ6¼ÿybÖ¦Åín£Z)©ŒR¨2x:Ãp=Ýúé¾p?ëŒî¿÷ã·Þx*G/óvYÞÿѳûêÞ[Ÿ}ûk?u驽§^ØÉºû;o§ý¿`è>FˆRbAjƒ`°`”µãqZÌÁ ‰²–`Dó,í$ñäYQÑ(ê'OLäç¶>ö7"ýÞÕS¶uÿ~ûλp÷–mwž–Õ¶SŽÇœáN)µˆZe¥”F)m2º¢Öˆž;wîÛßþî7æåüsÏ?UµÖÈa9ÌÁÁÁƒºÝ.çÜUú`ŒÖœó~¿ßétœs3[¦¡ñhÿÌ×þ¸ÉPE›e¥#Î,Å™£-YkŒ*+£í¾@¼*úéZ·Ù¿5ÔþÞà eaB”ëõ´“dsiEÁ#¶·ÇJ£7^ƒ¯ âÛ¤–jtgYm¡×P¨<#ŽÜpÂ9¥‡å&hÖZï³:mëÀkI׳7- !οô°áëqèbû~¯›\Ö0UjøhhIQßvÑ`÷«»w©d×ßèAÔSÆ÷J8N¤—¨ÐÃöwù‹ÝqÇqì˜l.rLv¦˜·Zªêð¸x²8$£ªª%ïß#e¨VÐQO×íéRÕë»G½JòÔsíØÅ¬xQÛâm2X”ƸóêëéGjÿ\lJJ)üÐÓµ‹å€áá ±ðéþeC¿'œ>ï(ò*€«X Øâ´á!¨[cŽä2Iìým8ȇ̀ƒ„ý*ë,ãñêKC:r¯±[cŒ5FY‹ybŠiaW!ÿx>t»9º§›ç(8:#!Ä<œ&7¼ˆ$áÅÅPHÃćW ÞòóÜ+^8:ºT×mÉÚöÔóÿ]â+tÔíÑpkðPÿ,ÝŽ_ÀKOñæÑÒo¼ôã cl WÊpÒǘäóºÙnU¹Ð*½ö­+Ö(šìêÙ•ª~Jè*kbíù03½^lRÕðÕ?ÞŠÓ+ʰ03DFi#Uyo£µRz–ÄL‹SRNjyç¥?­"ÒŠ[U-l9Ž’«1™ æÎ½[ ª¢ïÜâ×þú KÖ-Kô!kÖ„,Bcn l0ÑEeöv⺖R)@Ü(D PÊ«ªì§óƒu”F“J8Øø«—.þõßä{»²Ó¹& ×4ÆwïÝÑjàC/Ör¨»ä¡vÒÖÖJ²´RÓ(ŠÊ²¼}û¶4Ò«k-!$Ïóáp8(¥®ìÖ¹Ìqš¦îLïÝÝÝáÁ8i'À4Bíù IQm`SÒ·Œ¦„6%Tq·¶Õl2¯ÒÍÎÓ ÷çóª61Šª¬Õ–¢ƒPkVŽD5[§€î†;V3FEEyAÅæ<î‚EQ³Õ·i 5lÈ6¬2ŒrŽö èã·Æ„ˆG2¥8¨ ý'OYäç<R~X”hEU>KŠ[꘣¥°ÂP$Ì"êŠ/¶t2‹i¯\`a€z‰Þæ¥Ñãª]Pà˜ «è_8¬%¦‡µH®Ö ϳµ–1¦æÊß\Ÿn¦`á>ÒÅVJ¡¾ƒJà ÅÁ8~lŽ,žÎNzR‡î2]qO½îóèèf,VïÁâ$mG._å5»ÇHÇ]R ¯Ôÿòf!ðøk ëÈl`I8Ôw £Œ•„µÌ5ÆZ¼xG¸‡3kÁZW¦´¾KóâU°Á€C‘%@]‰ë¾2>z¾؇'‘8kj¥Ýþú{`atz[\ÛcBÐáŸ^.à(/ýi¶²×!~‡,ên1J[0Æ‚sÐ]ÌCJz&·G}â%r…:Ž*·PZC‚„œI‚ÕwǾ :jø&*èìÿ ^C'Ä9K)FZa­5æ{ÖÍê¢:€h\ëÚ¨Š ˜ ˆJFÖÆ˜¶”fkBUDÙ=Kwʲµuæ“ób8½Ýoô›ììd2É«Û ¦íÍsbö$¨qœÝ!Xƒƒ´(ã­3ÏNFb:˲Ç®Ñõd$¬­»K¤‹EÉEWUBØy–ìàž5%)´ÁG¸µ`AcZk‘N‰ã#®ŒµÖbÄ;›Dç3¹ ,ot¹d1!·o'»ÓQwól3:?ß'jÓºµ )Dy—À³–R ‘é0’RæÂLõ›˜Îçó<Ï÷ööš¦µ6Žc´¨GÏçƒÁÀhíJSJaBŒÖ°8dØéâ8Ž«ªzí»Oþá™¶‘:E™T¢”t>ŠqœéTXÕU#Žc òÖö­Ë·TÕ&úr%ïÆ±¨ä~3a›ë—··ß1„BšÙzÜÝ”*ŸO¥Â y*“öƒÉx‘2Æf61Iãpph=„ÒhíCñ ”‚ÑÖoš± ÖÚZãêu½~téÏ#܈‡¯û·óJ)]„¨W«˜ÊŒCèŽ{æ.á'×Ú—¦<ìÄÿº4˜% ²ŠGL©Ð „£Ç1Á®ÜÞ§žt! º0?8Xé±úÄPé„î‚ Ø˜þÌbm¯‘ )†¼eàÞÅ›2p¨_ºæao”R¡jOyÿ_Œ±Fá$T—¾"Á»V®ù·]dÊé̈´FZ ! ÖîÐ ‹"µ#j,‚cÔîßa ä롌„S¶ú9Ä`?éNé£0BãÙÃó§5!F(!ÄZc-@´p•clÐâ´f@!ƒÀ ‡;Q ¡È,}³$æhž+|»²¹ÅÎ#‚ŒÂ³Z¬ÿ¶+¹:w!—>£ Ê ŽzÀaPÄw>q §­µÆ…ú†òÄÖZ ‰TS‹i°±h¦ˆaÓã‰Í'=YÀ|ž#–^è S)ajy§Ócb¾aKKH'áÏÜ>ø‹õîY¶UISTÓZÎÚQ›Ø³£â!–ÕBNóÂ&i‘d¦œ\¸9ÿV¿{¶§µÈ«|'á1%ÁúÁàí^§i ¡±Mzû$îÍ…ªËF'«ŒJaÌbÌ 1Q”·”H„ÔqŒ0âÆHc ž•ûŒä(¦šî)Ó)ªb2¹yóî6ØÇ½=ïâ„¶ÓŎ˜e™…w0¶^G…*Z™’IÁ©–R–eYäf¦ç6ñz. ZwwffCf»§†tW$'UaŒBæÓYD5€•QÄúý.€)˼,óv‹b>¿óç_~ip3 S¦ +kft…Ha¡žNÇîðÑ(bÆ(kmÒ–ÓƒÓ iØ%JéJ¥1WìÜj7ÚFóIž¦8•”éFÛœíñã8®æ¤ÇO·IÓÖ¡‰ZTr6™—yEe„#‹)fÖÌþ¿¶Þìç’츋ˆsNîwû¶Ú»ºÈ¦šjÑÃ!i.’‡Fà A°%Ã~׳aûY†øE‚ Fhc ‰’LÒPI‘-²Ù{7»kùÖ»åÍåœᇸ™u«Å‹BáÖW÷æ—yòd,¿øÅ/ÜtáO®Ü{S?ãyÕøXd¤È¼µ 3´mh¬MÚ¶×g@ók­ŽÚÐQŒcÏœúT“õçY–‰—îæÙt¦ëÿ£. IDAT®ìøtiã¬>f˜óX“Ħ»mãLRov–\ž›g’¾õe^%6å "’¦©z‹ñlG´m«,0â©¥Ô ç\Û¶z¶ÀÒîà}12ÉÒ(LÖ„ÀƸºnÊr’e3ô}0Æq®é›6u›§E œºŒƒìv»¢(¶Û­ÙZ[UUÛ¶yZ4u[æÕ´šé…ø.$65Æl·[mVfÖ~š‘Ö’5`çØA} Ôj]–ƒ8“TŤÈJK…$ðÞ‡‘Â34ÀÅ£6µ–xÇDvœê“¦©ªw©ú˜}ƃÖLý!ŒÁÄPMgf`FcÉ´úO`£ý©zã Ÿxs4h¦jucD×MáØIB÷±ŒDí,âĵÑcs“/£í§¡8Šg§aâ9ôÀÁ 8ƒÎ %Øÿ± Œ"  šýoѵ=Œr°VŒc8Dö!ö} $‚tÁ÷1!#xŽ$@È‚,4xJ‹{7‡–ý±A€™uÀ‘³6%›0¦h*›Rj !J ¥Æd–R#؈þ.0¤ †Ð!ÔkA@f ,I¬#JXã…[=pLLo`{‹¤5fd‘Ç?]èúØ "@‹`€‘%Kè I ’§Iê,ŸT$6Dƒl)x”@Гx=I‡ÜBl!vÈÞ€GaK”%&Oõ‹ú“O6F &Išç…µN“c¬ˆ‘õ½þA¤:tÑb$(à B›&ÈÙ@¤ñ‰5àP4M (-rG©ÍÁoó"/²,¹¾{>YßîNc\c¢K†$úfüãÙç¹3”lE6}§Ñ†[ûfâ\ϱe¿ÎÓÖÆ—0æ™,RëgÅ}io¥ ±³UÏ?䚦Œ(` Vå<0\æøš1>$¼“e„´ÞeìV‹ü>z#QHܵm°çl’Ÿr(Áä7+èCÉ‘r[8Ú„ÀÎ寤‘; †¬Q¢Ï"³˜m’Qëq×·&&ƒ‰/1Ü6%'Ù-Bh—ÕÕu+™)‹kð3¬{¹ŽK;Y }œÛÒ&. ÛÄ‘5@È «Íz»«›öC¶U.G’¼s*gë¦yÒµ»fc}]oºöÙ³‹N›«š»ÕUE [•Y~þä)X^¬±Ib“,hú«µv|_]]QÓ4¯¿þzÓ4/½ôÒ½{÷Ô3uAµ¡Ô3sUU‡8°ÚÍÂb±¸ººŠ1ªVÆf³éû¾ëºì8ŸÍfˆ¸ÙlT2“ˆÊ²¬ëZƒ¾®ëš¦Q­táéÚÁÜ“ìBvVViÎ!ªñUØP]ã^j ˲ãHsU†Ã ÷0Á‚aBœjSt]§)àl6€"/¶õV ¨*BÌf³››":;;Ëóüêê*„0ŸÏ///Í@6ÖEP Pí…T†lR?0™Lš¦¹ººRíïCÜB“ª¶m™¹išcv»]Œ±®kµ­#ý¸iöºfZÊ !L§S]“««+µÂι¢(˜YÇ6+AIÕIóp‰q¯ñ«ì “Œª!H²“uï; öqBaìóÉØÆ03Š @€úažß5}™9JÐ7@‚¨Ô®(£B $´&0O>œÍl‘žûx„}V¦>‡ùâ>hcf‘ڹŠÇÈwƬô,ZG X3™ñ˜6q‚°§t!Daï}›z_!J€¬% k/Ø3032ìûŽ™³4EDb0Qh눳†Å1ûd!Dáè9X²h #°°èßû´›€Ìs|(œ㙣@`A0b€Ú˜°OiQ$J´Q"ˆƒ=Oà"Í.7Û.¶ñÓÍy!æfçNg§ñæ @…‘_H£!`ÖE7ø¼y_"Ãþ³ˆ ‚^Cî'@DÖBøþ& Œ ÆçÜ{½¨7XDzß8—$ižñ '1Dl–ažiš®V«Ýn7N}èþy*¥)ûã‹ˆŠ” …t !b’¤EQŒtœ1§Ú‡ †È"#E }ÛEеùw…çºÙÕ'˜pˆ6‹Ò;Üíš Ñàn°ñ_¼ü©ÚIº]®Ô@øÐÍ’<Ï­¥<ÏUti·Ûm6›¦iž={¦h¹\¾ùæ› Y?xð`2™Ü¬®­µê\Õ¥iªþ[Mؘ ¨Ù½¼¼<>>^­V777·nÝJÓt³ÙXkÿþïÿ^]¯Î!ÆýÀç^C]wÍfÔWuýöŽÞ9›ýõ÷ÿü mÂåMVM`?rÎÝœcîcT˨ö]ÝOß÷›Íf´æŠ²ª/Tw®JLDcLóD¯t»Ýªk\¯×Y–…~Ÿ¤ŽÒKº€Î9 ”Ö¤QKY–×××:ªëº²,yè©ÕÒ@Y–šÈjÍu·ÛéYÉ$jx©xSUUιº®Õƒj®£YøˆÖjªÞ1ÏsX$z7‰èææ¦ïûétzçÎýâv»Õ¬n6›©OMÓ´®k v»ÝÑÑ‘÷^OXý}Y–]×i.Cµm[•ÖÒߨõŽõz]…*‹Á0˜V¯Ñ9§É´n¡‘7½›rÀ«õ¶F¯ïõféï=ìîU/{¡ë“9B|ú%FhªM¬-Nk–/' Àµ9h ÃL hFˆE¡—Ž©sÝçhòÄ×1©æ7¦T!ÿx·®œÌ­Ýx× ,&mÓwæ¹æð!̨ È¡–êhñÇ^$ÖgQ;\Ÿ± S³Š~ãÚ*b†Žÿ1R ‰ãꔺ¡1O3"’‰¨w2J†áC;•½L4Yƒˆ:‚´Y~zd¾ÿ›¯¬¿ÿ÷ß»ºî6s¥sãºî+€çå¤OxÖq­dH]â0Ø8•‡wðpxŸ¸³ú¦,˶mw»Ï£££ÓÓÓÉdò©O}jWo&“IðÝòæj2™Ü½sëúú:ÉÒ¾O€9ìùe‡upka`$¢<+Ó¨bˆ2”2Çè ’ÀÈ™Œ`dñ!øÞÅÕ–Ëíåææ:éJQC´Ýv½ömׯmßVir« åç?Eý>‡Øîg^­y5fYVY–e*ŒµZ­.//Õ kí*I’Ífsqq¡ QÅØØÃih¤h«Ç€®ë”í³ÙL“££#M...¾óïÜ:½}rrr÷îÝétªù¢ºŠ¶mÕÆyÿœDfŒ±’+øÜ¯~áë¿øK¯þZk’x‹ÒMßçe¡Î’™×뵦ÚY–yï³,Sß ®HŸž¿zMDÔ$OƒpÃ\D©tª_Ô¾Ûí¬µ‰M5\`fM˜”wmŒiÛVJý–措ˆ¢0Ãd2Ñ(D Öjµ:>>Ž1ªLŠÃô¡U‹¦ššËåòþýûú]5»¬0ód2AÄ›››q÷—e©™·ŠMê ØAÄQ×\½¦®€æÊiš.—K½ûEQE¡~´iš1Äq`uð£'ÓóAľï5•ס[ /—Ë$Iû‘—®0)"æyú8bGsƃd‰r†}ébÂж®ßÕ÷ã€1í¡­ý¨†zº’ê¿ÕÁ°*"ê%Œ;ŽØè9ÔCÇ)èjAx=U‹ÕþYNÏ¥£ùÉü">–¦OB{JC\t»¼Ãíí…,cIÏÛQF£¦ÅèZÆã± dÏÌ$ˆ,<ç*Ž11FÌ ”½ÑMšƒæÔnÙ i­EC"Â:ÄMöü©xà}ÕT:Îç&[>ɳӿ³!Qgf£ää 5qX(eæÌfãý73£¡ÃŽ¿+†¢ñ´QžØz¯³,ƒÁÙ7—™mšŒ;™GF‚´?áÕtµÍÀÇ»½a„ÈÎ9Æ× ‡˜úBBÎúx å è3S­.6ÿ÷íæ1}í¯Þë“c?cÜáxÚ?cÝpkŽ, x‘Š1®Ïá®°þóx|©ïÐü­mÛëëëgÏž½ûüäÇ_þò—‹"¡££yÛ¶Ïž=Y,»ægéDz 7Þ‹>xFF 2Yš@ž—$ _Ï„G¦² ° $dæãv»ƒ×í>xzµºZ/‚‰ÎÚĶݪj꜃ŠŸ®ï¿òÊòÛ?-7â|ðyž/‹;wî â|Zg¹\^]]©™ÓUVC¬JDôäÉ{M×è i„ª‹뺮Ó4]Èéé©&[ð½ï}ïÉ“'_üâ'åt±XŒJ=¢æ£úFÿë9 dÒZBqºXìââh¶«¯]î¤ëBŠÄªª°ºív[U•^È´jœ¡†5¾(ø ‰&@jâFβŒ!zïw»F¯š¤Qô{+³ÝnÕÌÑ ÕÍÌê!Tø³,K]ŽÖ‹½LÔFZ‰ch©µþÒ,ËÎÎÎ4ÈÐã]­EQÜÜÜhÕ“^$1éwa` éó¯¹òxÎEQè%ÜÜÜh6¯k%"ëõzÄ9ʲ\.—ê/‹ÖdNƒw}CDš›ªªfÕêŒuUÉîcdÅ®õêBJ áA”jt®ªÎ¦e…ªªF›2Fz™ºªˆ¨Ó5Ó¾8¨—èk´M8äÍ{VŰ«yøxtj1þÐÑŽ°öØãtx|2cM÷u ©Ÿf.Û_£O|¿NgÅiëKßÞ, ¼!Æ4æ1¶\‡If•‡uèðˆÈ%åèobŒÂ‚ŒD˜‚£H°¯£“ÎF÷ö EI½ˆȽ‘Ac Y4J×—f¢ìÍ›€ï#"îbE” …Í"F1h0Ä€ÌìC3ðüˆ`h/wnˆt‡»ÿ¹qðϼ>4í06‘‘Ðì=yrÀ‰Ügº$‚‚Î"3½Hœ&‰lŒÝû郤Ç&/hŽî?Ø 1:Œ]ìÖ€Þ{k-¨`³QS$6ݸ٠" "!ÓaEdTƒÌGoÄ@€c0¢/àfÕ,%F$B/A½G€! „¬¸®0  !à¶ñYÅGwŽ_qÛ›×~¡ùû öa·»É‹)ü³T†€òˆö@÷ü¸Ôxð‚cè0h†[ˆT{ÇÃŽïÝÁPçÜÙÙÙÉÉ 3¿ûî»ßþö·ïÞ½ûÕ¯~UŸýÉd²ÛíÐeð³^–ž\_zÌu½¯7c„œI ²"v4´¥ÄùL/^ÚhIãyß.–?~çbYw™ëĹÙÌB g³Å»&·î~°|rñƒ=xiöÆÉ¬yú¡ó½žzUU·ÏΠª ]¯º®·Û­fâÆ€}ýîß¿¯éïÍÍÍG:–3‹¢(Ër:æy>,D¤n{ Ðv»]UU]×ýà?¸¸¸xðàÁíÛ·IŠ¢X¯×0ðVÒ4Uœ°m[ÅfGÚZ{¾\Î>ýé—OïÜ-§²Y»Η×ÎæêzÕïÖu­‡Ò{¼ÝnUts½^3s]×Þûªª”(^…‚·ºÛô'Óé~;Öu­t$—ZŸiPðhÛ¶mÛª˜4M£õìét*"Šäy®(±Þ~5îççç'''êÆtAÔ¡>yòÄszzz}}­Yò¡î¼BµÌçó§OŸê8±bZ…ž|Ó4yž«—RÀSÇMQ]×·nÝzúô©b•ºPê 7›ÍÙÙÙõõµ¦õyžßºu uƃ¦PY–i%¾iBò¶Ö&š¦1Æh-|̱ä`œðˆãA4úi½¡cÛZ»Þ\g„’g‰ËlÇW²K³äÁwÞî©þþ/¿¶¨'}¶HSUUç.\ûÜ ¦™­µí Ù­Q#HŒYžëúì½äP×üi½²o7€–ã¸,úIC"ØûCø|õˆ”Ï K™ë°ÏÌ€E+d´ã78#"È{>Çþùà5Á²j$R#D/q¿tc0ä¦YÁ‡™A†dÑX3&¦ñ „á»çµ=9À¢Ç®Q\­ÖoÚí¸Æ M˜ó¢ŒCãp4ƒ&ÃÍõuQç\ÞŻŭïÎŽ?K‹2"Êè«XD¤çÒYór´‚$"Q@d/£ "=¯éê²ûªü!{6¢€1¤Ò¡pØ ¿åâºî4ö?ûž“·Þzë?ýÃ÷ñ1Ï«Õj•ç¹¼X2_]ÑYÆA_™{ßc¬uˆLbÀ ¡1“ªêû^o×Ú'"^^^&I¢‚—ZMT}qqѶí+¯¼RUÕ?üÃ?üÕ_ýÕÙÉ­¯}íkgggÖÚ·ß~ûG?ú‘º‰c<>>¾sçŽ媪Ìâèô_¾‚—›éݲ~ã­/üâ¿ü¿ó­£ò(ÏóÑŸþéŸþñÿq×u¿ò+¿òõ¯ýÉ“'üñ¾ðf~çwš¦yüø±>OŸ>mšæÕW_=;;[­Vš´mû™Ï|æÑ£GÓé´®ë÷ß·ÛžžÎÓ'Ož|õ«_“›?û³?ûè£þçÿéùÆ7¾BøêW¿:ŸÏÿò/ÿ’™=zô­o}ëÿð_ýõ¢(~ý×ýw~çw¾öµ¯©STx¹iš7ß|S1ç¿þ뿞L&¿ýÛ¿cüàƒnnn^ýõ²,_~ùå×^{íÁƒ'''"¢ã‰þäOþ¾ô¥/}ùË_žN§?øÁþèþèý÷ßÿ­ßú­_ýÕ_ýö·¿ýýïÿã?þîw¿ë½øðaŒñÖ­[¿ñ¿ADßøÆ7D¤ïû“““;wî|æ3ŸùÇüÇßû½ß»¼¼œÏçðð•¯|¥( ïýïÿþïÿÑý‘Ö†÷w÷w÷w‰h:þÍßüÍùùù—¾ô¥£££·ß~;ÏóG1ó[o½¥ÀæüãÏ~ö³Æ˜?ü°ªªù|¾Z­¦ÓéÑÑÑøÃo~ó›ßýîw?þøc›˜W_}5˲óós8;;Óß{ïÎý£££ããã<Ïõ¦«Û›ÏçÇÇÇêÑ?üðÃÍfS–eUUÓét¹\ö}¯AÉ\+;ƒˆf³™Vf×)žêtû¾¯ëz½^ká@mÓ©Øùùù~ô#…s4øX¯×*¢~zzZUÕb±¨ªJg9¨!®ªJMªF »Ýn»Ýzïµ»OãËù|ÎÌ{0¡õžèáý»·÷£öÝgOpþ¿þï'€?üß~³jõ[¸|dÏÚv™Pî‹ ã¡ãS–>úhµZ)¸rçÎ¥Y0óo¼±\.ïјXÌ_[ ÝÁ\ …R•¾pyy¹ÙlöÖj˜­©p×(DD“Ùtü¡Âú¼çE!"i’,fó“ÅÑt:­Ê2MÓºn€…¬1H"‡¾½ï|;Á£:·ˆ4ÍnÄ{GCLD×Ûúf½:??¿¾¾ÞÖµ÷¾{”KºFŠšc&Óýú™Ùþvd™v¬V+D<99Ñc(˜çùt:­ªj¤ë€÷^‹qÐëq>ûÙÏêfúýX§Íf£ªGëõú°ííö­—=ztûöíÝnw}}=öeŒ;Y‘¼³E5N‰hµYÞÜÜœŸ_„fÕDÃAD³Ÿ†¢!µb–išv]´¥÷-›¯×>¼'~zúþõõÓÿð­nÒno6cÚʲ„cdÞS|ø@øÏ9G˜*1½ïc¦ž„F&ãèu¯fYfÌÞ­Ž¸¦aT²…¼øØ{ëÃM®[®iW§gw¼ô(„ðáOO&“Ùl¶Ù6Þ÷?Ó›$sÙò.YƒdA†+ZACÊN%"¥×¨CôÂLÖLjLˆÆæGsúÂgûuïbw'Ûl]ƪÞÙÙÙâSÛ‡·oßýôÃGßûøÝÞ|óK_ÿ·G¿ðJ÷ýï–Ó *Êêøø8±.)Íl2ýøê)òx0tfYvrtªœÂd2‡…iYQ¹EzçÚ¶].—yžÇ/..òÿùÏŸžž6M³Ýnà'?ùÉd2¹{÷®>ëÕJsPkíÅÅEŒQ¯ñ¥—^Rrš¦zXÍ>µb¡»PÍ–>ÛëõZ—BMÀHÑšÍfÞ{½ÍÎ9=1áÓZ¸^¾Zóétº^¯Ë²ÔÇCWXwØX^¯×ãq`½^k¶jŒyöì™ú~DœN§Ì<›ÍôŸºGŸ>}š$É|>W´\×MçCðÁ/¿ürÓ4ï½÷Þ¿øÅ$IÞ{ï½ÉdòàÁƒÍf£´ˆh¹\êÉèÁ@ùw÷ïß×üµ(Š““4ððáCDTÏ1™L4É~ã7îß¿ˆ§§§Š7àÐWª/34rŒ9®Î.TíÃ9·Ùl6›~^×d4—úh)ºn‰A"ªªêîÝ»³ÙŒ™f¿¹¹ÑÔ ]g]×á E—e™JfWÑè´dмôà F˜âÏMÓ„Zª×1†ëÍÙÓneŸÍcû©ŸxØÕioÉÑ :pmØ…ÞdëTHÄ ÉňÙÑl¶ÛnÏ›&Écœã»¤ªšívà QÃÌÌ©µ,’!еeãbÆ›][ä£l}ÜúèœCƒ‘aÛ·Ñ"¦ÖJšbšš$Ak{ýºµ˜¦¨ÀCÛvmœ‰1& £6DÎ:“¤AY@€IbL>@ã÷…g´dÄXDæ}Û—  !²ÕÛÞƒÙE郱`,³oÊhCØ´1€E4ìS$í®ŽŠX$G]f$¡Mß?ÞÞ0s(ždlÊ$Í Eg£³ûðèìèæ¿yÙÜP¸þžüøüÍŸþé_Ý­ëä£Ë—Šªé·Ïd󏻿ë¦( ‰ŒM½+²¼(ŠªªŠÙ­&U𦛖ç§G;ïÁ•R—Í””$Éžš[÷šÚGNšGw²]S¯×ýñ™wΡ5uÛ$IBÎ&y–Uy‘/²tƒ Þ€¤‹ùmcLYuþB ÎrkR“fWuíò<­¦Ÿýâgþõ·²¾þè§ñÞ¬3öÎô¬í»££yš'ÖÚ£“… §yâR $ËõMÓí&³êÙÅSAîCG×ë5".×7wîÜÉËìþK÷V›e”pqq±këËë éC·Ýmb]×mß4ÝbH×u×××'''MÓl6+"‰Ú<Bß4õn·Ýî6›z ‚Üt»][“ź٦y2™LšnçcŸdîòúâþýûE•×›m’ØËËóõzÙuÝl6 !L§U9)ò2{òì±µöνÛï½÷Þühf­u©íC$IæÈb`¯}ŸmßLç“óËgh`½Zëõê'£›˜ËËKï}V¤z„À¾š–»¶ö±_oW>ö³rzusÙuFZiê&“²iêÍfµÛmääìx×Ö61Y‘’ÅgOÕ…§YzqqÞöÍÍêúÞ½{Iæ€äòê2Éœ=¸ÔF ó£ÙdVåy~ÿþ}…Ü«ªRwqqquu•éÑÉB¯K°`á$sy™E OÏŸdYv|zT7Ûº®mbêz£wÎL&eU:lx>ŸG u³ !èe.×ËÍfƒˆeYÏëºö]ÿèÑ£»ïz²}8:š÷}ûÓŸ.˲4û¾-Š   ±‰)(’$I2ׇnS¯bºÙ£ˆW)D„m²˜d.É\Óì’$©¦eº«ë«¶m³,;šMß¼~jš‹—­ðŠ#þš‹D ô–a;¿Z.Qó¬IDATŸ­ÉÍ çPª¥'QË6b¤óa×N³"Ï2XÚ>4=ÄV;Üù,’Eä>”àÈRìc‡ìÛ®C2°o÷²Hiêz¤¦ïêºÂ&qQ$†à9ædÓ$Õ–cŒA“ ImâTE„º žI0“ÚA ! aÛ6†«Ôpnz›vôÞ ºDBà¾1U’c€™}×G”0k#ŒA0¤ ¼BÆwè½5˜XÓ¢dd ­w,‘ˆ(Æ$ĉ±Y’zïû¦å2;9¾¥CÞ’$EDgaëÍ8cš¹|»ÝÖ7k¦Édb\bÊÂ!ˆïÛ¾ÝúmG3|û¦i8Ä2/Š,oÛVX”ëJDa³Á¦5mÈ"Z[ˆy¬Òr±X,Ò4 aü“"š,k›. œ.K ,Jصޤ,Ic™ YãÌ¢šv]×7½µ6¥$ÆcH‹$’+Ë´^Ý8‚$!ïƒqŽ±Î‘÷8Ùårœuÿí2ýÛÿá—WßÿîÑO>Ø]]§>Φĭ‰[h¬=#c¼Ö#ÅÛ@òhÄZK” B¼MhV=ʪ*«4McÜÓ÷ˆ„Ùƒ-"pÞžäHLéžè‚cßïI&™Šµ` QöiU×5''¥1T×5ùP…€k;öi¥1®Â#µe,?ø¶þ“(múBz^›€hŒ1„„(6K+Sۙݎ7ï§ihZŸ”.2ÕÞÓdZN'¯ü«¯\þð½3ù"›Tg×uò´g§öòòR¹¬ Vh‚UÅÿ¹õj›ÿÅŽ®Î>\Ífo¿_¡ÚmEõ¡°Iš¦UYMªÉ­»Ùz½>?¿Ž­X© 7ßùôOçU¿˜ø,3¹3Æ@Œ›ÐnŒ“*‹Î¹Ð´Æ˜4 ‘»ó”|-‡–‘)BI®2ÉĦ“´.ìÚ q’8¹šf;%5ÓWÖkn_š nnàè¨ù¹»7ŸûÔ‡ÿð“ßÿð(+wÛ}?nžçižkMT…#FÛ§í:šj(ä¨]­šš4M£@Üb±8;;cf%*•<ýŒæâʉ×ÌR‹Ç:¨ˆ´Ø©D!-Æòƒ÷¾ëºív;ŸÏsÛíVÉØZ„îšVÑ­ËËKÍ“Š¢˜ÏçÊ VWňn™A2óç‘–Oà-p@…PfûÑÑ~ÖEQJ΂ezÑåU,DImzắ”Ÿ¥™ýb±ÐЬ.š1¦,ËÉdr}}MD“ÉD@”Õ5N˲|øð¡rå”n½\.W«Õ{ァ؉â~Y–)‹Þ 9::šÏçMÓœŸŸŸŸ˜ƒÎ ]§ÓéõòF@I’D·sîøøX)x T(šBh›æææFÊ×Zïl6SŸªÅõ±Ø<âúC].uÀš‘ÈÐRb½k:`ŠŽ/mìÆýX$VßÂÏK•¬5h¡ÏÉ´‡XŸ.ŽÖ«´t½Ï6†m0VÁá@éÝÕŸëÖqàqÊìÓ«3Ãç\–$z2ÆÙ§>Y•F ]×ÄBÛõMëó^(%"ƒ$"À/Œ%Ð{-ÚJZÔ£*âx— ^iš¦¾W ûÐ÷íXê“¡Z”ç9ËÈ_%$ƒÄÌ›íVkÕZíÓ'4ÆxëäTÛ›¦"iûÐ÷}½Ùú®c <·6Z†§a´]¯GNŸÞ ;È쨽Rë4âŽÚô¡Ï¯Þuö} êøGz¦ ­S<ô/ÁOjÕ;«Òù8¼„BÁ"—Yúó÷^F0¯ïbH\¿ªÛ>„–CH-b–Çy<ÌŒŒ©ïÈY#†„$ncÜjyê×)Ü/º"‘däÏ+¾"f÷|ïiÙ ™°1Š÷`­M͵EkŒa`mfäH1'k Œ 6Wè\>æ‰cÇ@ÐK†‰‰¨mûqçë¢éïrƒö8â X782h,è(L SŠ­•·ù,]#/o¤MAxÿVòùGÅÏzóOpïI ÄÐ7MÝ4`»ÛÙËË˪ª´@¥7l6›ýWÉÉK¯]ÿ›ÝåqgåwÿÏÿ°¸l·o|øÒÑTØ‚-ÊrÑ¥iZM&³ùÜ&f~4 œ6MCv%ó10ä‘;ë¦d’j2eæõzÝõ&I’ŠeY™æy¶‘,«ÈMû"½+YyRÍnÏŽb2™$“Sfç:XQž&eB¸Oû;á£O?äûGö峋ëªáÓºŸ_ôäÁgáòéy£Àølªæz½¾¾¾Þl6JîPYKY#Év,èýÕ;›Ínݺ¥µþDÑì'?ß÷½òÅôQðxð¦iÔ"+Eørúl«>ƽ{÷Œ1 )‘¶KµI£aÁv»Uwttttt¤2*ú¡-Fyž«” Èü¸‡ÔèeúuG:ñõõuß÷·oßÖM©Gƒa © c'˜ÙŒQ´²5™LDDZF&¢¢(4ˆñÞ«™S¼·ï{%K+¥<ÆXÅf³Ñ˜´(Š—^zi±Xh§Ùññ1, -’) ?¶›ÍFÁ^ tÅ”îg­]¯×Ñ”œÕ\jõD] Þ>"ÒBlš¦ZQÛn·çççÖÚù|®e`PëY×µzÜ“““ù|Þö.µ† º’Ú~Í/J=¨ß'9`ñ ‚C©V Ô|Ç,¦Ö"cØ+QÂ<ÉÁ{¸NãÍѱµº9›¦Q™ª¡’·—%у°ÚÑ!b3­Dºôóý¨ÝŸä…°ÍÐø \ý"Ë™"%cŒÕŠc‘gmßø¾í}è¤éê&–½$ѳ'…ÆF þ1Ú¡¤ƒ(ð`dïhCcŒqØü{«*ŒZ†ìýžjŽäŒ ½GÙÏ-Å‘Ë30°”°©Ïï¸ë´Ê Fc¹\ÂÐ%¼_}ÒµEÃ4Ϻ®Ÿ>}j‡&o¨øÀaÜ620É5zÓÒ¯ÖG4RtÎ%.Ń2öÍÍ–ÆZßëm,Þ{Á}[3Š8ù©]Š1Ú4ɳTØ#Gk »,%´Æ˜…P8%ÁF·('÷_®ÿ»Eõñ“Íãóîéµÿð)Ÿ/Ýλ>Pn@Ð ‡Èˆ(˜s ` ê}7ˆXd)QŠèÀX"Ùƒ+1BúÍÆ±û‡1 3cŒˆˆVBŸ$£| JLq"6Ë5Œ}ÌyôûÊTŒ‘cDƒ ,YR&*c$º°W²AA$íF—>DÃÆX$"çŒÅŒú_‚ùOìÅ/o·'¹9šƒ©êX¼~ÓIÚ®! û뾵ʥžL&šˆTUuzzzzzÊŸ;9]ÚŸ/›÷.ÚþïLzúkŸwÿöKÏn¿R…šcs~n³,™ÍÊÓÓ"9òÞû÷߯W«øs?‡nÉ&Æ?¤¦™}æ3ˆèœmÛ.]¯‹ÍFfƧO'·n?}útûOÿä üܣض.ËRçÔúÄ¿ýÛÍ[o<úû•¯è#ÑüÓ?cBUu]÷ÁÉãö'ïÎßz|kÃw%ùéÕ“®Þnàæ8« éK—¾ùÎ{×××u³›N§.MÔµœŸŸëp'õ”×××ËåR)]r0“†&Nš}•ý¨/ÕZ=¨–x n()Z:ë!Öʥґ̾IσUϤO/©Ga“=÷Jk­žGEµÝš–©Ï>´Èz]#ÇoLF–¦Zþ•nÆÍWš_*CG ¨zùY–ívÍl6Ój/Æ„¸,Ke\k*Æ~IÜ:ì|ZD4(áaš'§)²ØA Þnu𦠿<”¥®¶µV%Ôè8À0ÆàµÛ‡|{UW Os9H’ðÐŒ4>B{˜(d²Ûu}“ç¹(ò$ï!F1FƒñGc<3;²cè_,eYæý&+“/½úèôÖ½ÿøÿüÙÿõÿ¸ÿM¿ô_>¼sçν{÷Ž///‹¢85§w&|^¾ýöÛßüOß¼¹¹ù×Iý¥ã/]^^¾ýñÛ"ü¹;év»Uv¨"` \äœßÜܼýÎÛŸ’O=L¾þþëñ¿8==ýoîýš*(Í’™÷<üû7ÿîoþæo¾ÌÍ/?¨4ãüö{ßM’$Ïóívûõ'¯ýàÃü;ïöWý6IìQÛ<\œÜ®¦ßyò!1HŒ?¾^.·Û­M’º®ŽËåR (©^¯×£¢¤>–Ÿ?Ô6˜‘¹§­.Úa£¨¸ÂÅê ÔU‹ˆÒey CŽ–WßïŸAP3MgõÖs³Öª!`f¥Ž- d0Rv8p<Õx K¤Ö8@ÙFzÊ-§¡Gy%" IùEÔVsSåvŽþ^%K»®S/«ÎXS¢Ñ¾˜¡­HuF“$Y.—z&ˆ8NÕ&žžž¾úê« ‰Ñ;ï¼syy©Àd2Qù]OÍ}u)”v  A×´2¨k"¢†)ÉÒ1›«AÚøq}}ýøñãÕj¥Ürí¬‹>\__ëwuy‹¢˜L&§1‘úu”¥•)=’BËcš5Æyý ­¿¢úrΕe™¦ÛÖÙ\*™ˆk¶J$‚Ã[cŒì¼ŸÙ=«"Öõšù9:´Zò0evtc<ˆŠŒ~.MS ­¼÷ÎZ­VÐÐÖÏÕ‘™Ei,ö}“€Q[EÓ4µÆ‹ѳ´ç>u”Š1jpaD„,î=9è熡q1I`‰!‘³DŒ1‰sb­®N–eh÷sˆUi%t½nx?(ú)ÛuÄø™¡c* ¢çc@BŒ`8š¨! †°ú$Æ-¯á{¢aîf³¡)|ŒF€D£½O@Y‚ûÈ£¨&yž²zªæE!”ç‹Cè²”¹·€Ü[6Ö…À!øÎ÷ˆäŒ!h¢—£Òe®¸cM$ÓÖ-ïzjbص7G?7­ÊÞéÓÛ½H\]×ÊUdæÝn‡‰N§úð*£^­\ÛÒ&ê•êš÷ÍÞûêo¡øYùŽZ-ý¯=ÎÁlÓýÓ§Ø!"*ƒu1Mú‰‚y"bÅê 7}wè€y(Ò…vŸ«ž¸Y®":p)ìãž—¯¾²¿Ïè{ðÖG«e½½'0-ïtWÐuýÞËŠ45{¬n@3`m„x6Giùó÷¤âê·ÞÚ>û`7ÏÏ~áçóÍѽ—^yíäµÓÓÓgò¬(ŠãÅñÙô,#:Æj3áüʲ³uC )Š2;1ÕêòY^U†m©º•Ì¹Íæ¢}²tgñÌMËÞÄËÚ¤ó;öÓWþjÖ/¦ÝT‚çþSîhîÓ*-ºIk Ê’Îù5ÿhv±>†²¸Þ…®;—®§¾uQ-õ¦®/—7ëõúzy“ÅÓgO!ìë%zïW«•>ðÄ¡Á^|™A„YÿwlUsL«ªòÞ«¹ÔŸê-4¿;î #TŒŒˆF¹DûbK;*0ðFž†Öêñ0ôÎŽŸQ~¿ƒOOOÇT²T«ÔfhÝÖ§e¬µãojÐØØ¦¡ŒäèèhvV,z±XÌf³± C ¢>ØúĪ͒A3¨®ë®iõB´­w3I’j:S½:k­Ê\+Ø0¦ƒeYÎçs‚=â ,5jóù܃ÔѪÅ×E³ÃH õ²ŠÖê^ñÛ±9>ü2”‡­µ6Ï¥¨ú>3”`†Ö#s¯jpP•ge"ÉÞÚ½`á “yôø ¢EöaLGûõ<ŸÐÜ™Yõxuo€jËÐø‘ ÖŠjè"ëSäöâúŠ™iߺ‰8Ôw­CãÈ9c ‰HÓµËõJ"”•nÛ5-°sôaÌõ%€÷¾™Çcêx‘â°\Ûv_óÖ‚=·0ôÃhÌ”eY{$SÆEƒQýŒ††»Ç3—ŒðÉ'nt ¿æ¬åœü¢Þ¯Å Êcª7FÕtPçnšZ$:gtªs‰DÐùý(Ìô`v¸÷ÞÇ@D„¤Í©ï‰¨>5TeIðp蚦ë= ‚‰½,ä„h}ùuËB4,Á¡$zï'\²p€¹l’N˜ywÌŒÝ^OXÚØ’§cô‘b•'³*›O²IIeb’.tŽ·à/Á´Ö w1öl4,(hÅH×sÏÌ”›PbÅzï1ì+,"’Q¶ õmŸ»´ªª"É–»eý¬–pÅ ÒD3H‡ç Q" #T°0 ƒ€ACB„„ˆíÊ öÌ›ЈˆçïÄŸ®ÜΛ[æ$ŸºÝõusqµ^nò4Ó*€÷>p4h$2D¶4ô›ª«Ð¬%MÓâ<øÊÃÙüõ˾qñ“º€úë{qgçÉüþÑ­Oß9>>©+RŸÆõöbg»ä$/²È^ùåM\s…ÕíÙvï]~ø°|8™N¸ñ¡»Hß_ÅõÇõùK²êrÞÚŽ§f-õµ_qmãWëսɽX@rœs!ãÆtÁðš·Æ¹Âe{Ý^€:19%Y-õ“Éääç>}÷å‡òæ‡ó£Eú¶ïn6ëg§§§O? }›ç¹ê…긅§³æÑ¸ŒÙ•æ²£ŸP省)ê'ÔëS­æX-/ Ãd£*= …ÅV« B<Ô\uø:û1rÒ@rtÆú-%Ö•e©x¯>Õú]¢¶š  ¨MSFÅÀ5sÕŸïŒTw¨ú‹´º^¯µ‡JíšFºÎ£ð™ òx#ÞuÝl6SüY†âº–ÒÕÝê·ôàZ`Vߦ<,µ‰ÚÅ«ü8uoš×–e9›Í|–«&öññ±:ຮûƒÝPò= "š7ë}ßl6©Kô&ŽfWxVä#^b=TÔ%ÕËÊņ‡vÉ1$ÒL]DúaÓê9çØ÷¦â¡5‰ÙR`œ2·o¯ôà9t$}8P½/ˆ6ãð‰qÜ{r0âZ¿;Âzc¬ ÇÑME¨n>£ˆhg¶T¶óýþ°BDda€ }pdmbÐGî¼omŸöíŸfºìÀB/ª BÜ ¢ Ë>n á%ƒHo¤0dÐ"ðœe£wdÄœöl2žD¬1ˆ…¹ï:™FŸ*ƒ23D©Ž£C‚@Η‚"í`íˆ*w_ïxƒ’$ Ë2†š+k>Þ;ï}ÛÒsuŽáä‰È¥Å7À?nBÝçcHƒwÎ%Ö±·1zêCdè|ˆh¬/8$Ðl#ßÃj6Dñ­A_H›áÊô“Ј‘$¡%Bè|ûu½Õ¨7@ØQÛQÇÀó–.;Óu¦OLãl6i}³ƒõ–Ÿ‘“`bÈ0p‹m]0,´%Fîº##bqF©"ðÄ=–iûØ{㱎5wŒ9F1G/q+»¤LË,É"í­_hŸóŸuWã®oÇLü|ä³M- X¤h#ˆ1öг÷¼Ý¹U}‹“»Çww³“wí{ïûÎvܯD,Ù³„ ÉJžç ëeYö>6Öû‡µÀO®æïmïHuÅ” %>-¡š»rjË­Mã¨óò”nº(9Lóã$;J2®°4ÉäfÝ|øñõÉ­—§‹ #öQÐNB_ï:ºYûÕ6î:Z×¼ÚÆÖÛ–×lÛlJÕ,i"¸R0õô‹Å½²<"ƒX:7cæ’*¯ò4C4¡÷Û«’LÓùém|IŽÎN™9€lwõÍj9N7›MSo49ÖlÏú½j¯ÇŽÏ8èûŒpÍh”ͫ°}ýy’$eYÒÊæÈª A(NŸ:­ïÚï:¾F¯¯Ï˜n\;ÌwRÐ[É“öà¥.Vßh™S»½ù¨fà6â0ÝÏSa1=Õ1¥as½L]5ÈИ¶‰èêêJ¥²´#œ¹(]jâ %¤ûMØé驵öêêJ-…–~™¹išétªžRUU'''!„[·nݹsçøøØ z™1F…¿ÔÅj¯ÍÊ×—Wê¤5c…À4‡V¡®dn­ÖD¤c 4Š"¢Ýn·ñk­Ã$sEÛÐP?h²ê:ë £«11óò1ÇÕ'\kœ©ÿÐ[©Ñ[#Y&ij(3™q¡7Æ«…]áÈ1ìb= wñ`³ŒU£rç À!îŠCduŒÒÜ "Ƽ'5XúsÅŸäÐߨÁV9™ì/JÈãÌuØmWIb]–:g!2FH’$ͳ‘É¥Óì ¢Äý°/cŒ xïÓÍÌÑ3t~Ë å ™ˆQ,k³Ñg-û Û­7c®ì»~×÷Ù$ñ1ÆCÒñ™}]È^ý{|Žt<{8íú@é.UøÍ]ãfr½)ŠÂš„™ét?ˆàˆ9öd(«‹îÒ<ÏuÏèÿº´ÐeŸÔ»‚Ks…”¦êh“Dcb•EjÛVbð18cÇ[#÷}¿Ù5Bb  öÀ[—Í®kZ'˜A‘„„Ct›l "„h¥Jp Pô öØ"e#ö­´Â1rÇ¶È —à3éSéSÇ]ä.Ý}ADç0&d­Äˆm‹]Ú¡sÆZdæÐcà‰‰ˆ¼§¾§1—ÈsR …È­õ5Z›MÒìꪉ1ôM'!e¿—ªNS}‚h€„ %°Û÷· D£5”~ë"ñÀÆDƒÃókƒ ìL‚I ›33ëìâi{ÉÌqxö9DpHÿ?á>F{‹Ö^ñIEND®B`‚qmlvideofx-source-menu.png000066400000000000000000007664141225012771600367560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœÜ½Y¬dYv¶÷9çqc~ñâ 9gͬêbõ@u˦Ħ› ‚eB0´`X0`éÓþ²š€ 0,ìÚ–!È!ÃI  ÚT7M°[ìîbuMY••U™Y™ù2ß/æ¸Ó9Û+îy7³2›]„ôá¾HŸÏ§Zë¢(–Ë%õûýÁ`$Éý½üññññááá£Gðàý~ÿúõë»»»Íf³Óé´ÛíK—.ݸqã;ßùÎïý“ß?<<cŒs. Ã/ùË¿ök¿öóõß½xñbEeY6²,ÏÎÎò<ŸŽgQ9ç0 ÖÚ­­­Édòîûïܽ{×Z;sóù¼Õjíîî~ùË_¾|ù²RêôôtYZëÉÙt6›}øá‡·nÝúßùŒ¼1¦,Ë(в,k·Û¿ñ¿ñK¿ôKßùÎwþäOþ$ÍWÃáð—ù—¿ùÍo>zôh4¥išçy–eyžïìì<÷Üs—.]ºÿþb±ˆã˜™—ËåÆÆÆ•+WîÞ½;N™¹Ñh:¼téÒ{ï½÷[¿õ[¿û»¿‹ñqÎu{ÉdÊL¿ù›¿ùë¿þë?øÁ~ðƒܹsgooÏZEÑåË—¿ño|ãß(ËòÖ­[ÇÇÇišj­Ã0 ‚`kk«Ýn·Z-Ì~’$Zkk-Yk˲Ìó|µZeY†7ÆÚäyn­µÖ.‹ñx\…1&Š" H†aj­EÄ9y‘<ω(Š¢ ˆ(Œ#H2þ+Ë2¥T†išBJ!½eY–eID­VKD&“É|>o6›½^¯ÑhDQÔëõŒ1išO§SÌKY–£Ñ5™LŠ¢ÐZ'IÒh4.qóçßøÕ&…ïÝÜ6·vwRKAw‘®æÝæ[n>øøÊÁ½îû7éàt>:nsèä`£Ñº´½ðZºyíÓ+›É#Ç£Vð¢”Áj¾1ëÆ,ëÖÙb- EQÌÇ1ÖN†Æ""M¼^›†‘æõ²&Gâ˜$/18þïziµXGÖZ[­÷4O­sÖZç\)Î9W:ëœËó¼,Ë­ç4Í2 /)vΕeé?lQ–eYEQÎ9ÛZk¥þâ^‹s¸1çœÔ޼X¸$ÁZë Y7Ø„JkVd”5Š´ ¡ÁH+¥˜Y)m–¹²®î¼Ò+­­k?œ_D”1Ðc ¥ÆÙ#3ãp*Åâqü³deµÇI’$FRÝê4ü=Ôo‰ÅøsÖ¯eXA3¯ç·$ÖÊ+êõ¼W}žC˜˜¹(Š4]EAìpªF#Æ©¢(nµZI£…%+â€UHʰҬH±ˆ¸•RyQLËU–B¥³EQ(¶\€,O:õ§Æ‚Åxâ”RŠKkEœbÖF‡ÄÎÚÂZifvÎAÒ™Ù0ƒÊ²´ÖâÒι Ž‚ €ÒÀŒCGAaZk766†µ¶Ñh‘i·Û"²Z­šÍf–e^§Ï² ÏëW)F·‡ÐZcêñ¼ËårµZ ú›«Õ  n‡6Ê–n2žÑ˯¼|ñâÅÙl6N'“Éd2Y,Ì ,L’$Žc %„•ˆð°aöz=?­‡<Ïñ×k.È@Úe¥"UQá<^%aœ½ÂŪÀú©ÔZ/ oBB0†/êk­ª”_ù83PŸ™1&ø_ü¼,Ë,Ë05°3œsƘ8Ž;ÎÅø?žNn%ýÍŸùÂó{?~p¶{åÚÃ[¯ý£¿Ooß°Þš¬,k²–ˆâ(Zæ…“æÙ2ï«wÞNMÔyî¹Í˾öïý —Ûÿ:+[Ý@õ‹¢?HlöZ½[–%–-”†È"ÖÓcpò¬ã íÆç0ýf0³´­µg­C{€sÚ˜¢( ¸ýLùuέKcÖX‚¥Šy‡ ñYæšòLDJkȘ`Ü[¡lÈ:P&d­”b­\ I«U0óZ1“Óõqð/¢šfð7/"Tݰ‡·úcBIz¦áœ#QøPW7¼^žjÍ:f€ƒÈö‰ªŒibf¿¨Y¨²MÙ‰RŠÅùí˜üª\£%“·l0›k™l4 <BoxAP={ æšRª°T|óÙ³Ö±f¥XQ5ˬµ2š­¥Ê.©k°º~«‰gÀ¸¯ë–i í«ûGmZkdc˜r«ØÀ:„f¢¨Ùl†aØê¶ ôŒ ƒ 0&Ä8k;ò±©Vçx_GV\WDÀ¬ªŸð¹cÃß§—ùŸüÈŠÜÛ¸Î9¦s›£2ŠÕj XûŸœ(!ÍZWÌÌ&RJ)bÊӬ´³J)­Öö™ŸŒ¶'Oª$H»ÿŽ0“)"Á/“°(ª+bÂÀ)&ÅxÃkYb—;œŽ:/~(°LL¯×‹ã¸ßï—e¹½½½»»Ûét>ùä“ýýýñxœe3/—ËÓÓÓýýý8Ž{½žÖºÙlöûý~¿õ\…ا<¤×Èò/´fœÿ„¦(Š,Ë0ñS¿® 5˜Yç"$X’§Ä $/ ò,¡µ¡wÀÿf³`o>Ÿúë*¥¢(j·ÛÃápÿðÀû¸<¨‡aÇ1L6­5Ì—^¯×n·ëÏ…ŸEqvv_üÛAÄqŒ‘‰‚'„DÈ;ÎK/½EÑx<†³Á97›Íà®D€NãÁ`Ðív±Ûíö… &“É;wF£‘§’@çÜÞÞÞ»ï¾û…/|¡Ûí‘ Q€‰St–eišz>dvÄhµZ-—Ën·EÑýû÷ßyçýý}ܸ)39+DtéÒ¥­­­Õj5›Í:Î¥K—‹Ô%8ŸÖz:ÂÙàoà †ZkEQ§Ó†Lz–€ïc´YÈË}³Ù„…ö ÃV‰ãX*÷5VcEF#i5ý—ë߇•†KxÞì'z±XÀ ï×?ÆOºZ­`K­V+xp­<Ïá`ït:ýF “wVéÕ­+—ï÷ÿ׿§§å’h‹hA¤( Y8ωìŠòfAý€Ï(O¥œ´ºñ¢ˆŠ”Åœ¦/~ï»éGï þÃÿ|ùê_:\-š—žï+æfÝ ñÞ³sdZ¿z\…æ¨ëµÇtœªˆˆ]kŒ•geY‚ûZgÏ]níŠðLÑ€W‘8`¡ºÊ£ë¿àß=öCU{:©™õîY9Gb™„\ 5[Ò%ܦ–™IÈ«)\¢¦ö 8Û A¬é8s¿rüøïCŠ„ µÞ‡™çù|¶ô&2A·Ûí°ÒÚë×ãÚ5AT„j(pS§k.+—¡"òËÇU‚à'÷œÄž8‡°¸Æ‚ðº( Åùš&:k%'–IW“ïøÛ¨{êrX¿DýÃF[VBNÑÚÈrâHˆ3“Rª‚_o¬{ØbçœxK‘Ï)Ÿ7Ís1•%w~’º5à|hŒ1ív;Š"fn·Ûo¼ñƵk×>úè£?þøáÇpD§izvv„ët:annnv:(Š’$ ƒ°(‹ÐDþ9ŸÀù'&‡/øpˆ7ñxŽ‚@)îØÇðD¤t…§Y–ycš–ªbÉR1rç\ÇÀQxð^è¡áqPqœ;ª;Ä‹  Ʊ½½=›ÍNOOs0èDd:N&ï6À—µÖšÏ­ˆ`š¦F£Óíììì´Z­Åb1ŸÏÆiš>|øpµZWÀzר/¥Özccãµ×^;==½ÿþÍ›7‹EEÞBÌóüæÍ›Q}ýë_gM ã«Õ P ²ˆe¿\.AטÆPƒSP­Óé8ç>úè£÷ßÀPJ™@çYÑl%¯¿þúÕ«WF³Ù„J:;;ÃÈ(¥666˜ùôôt4AÒ@d¹¢žãa‰Ћ׸1ïSCå1s³ÙlµZ«ÕÊZ»X,¼¤K\ï,i­Ý\@[afùUëÍ‹Š`çØm–ep}WšÖh4àù(Ër±XäyÞh40 °bñ€q¸ª §‹Åÿôßt¾ûG;º­h¬©±è«ñ’$+„$2&×MØ µ… ©Ø&V¥µã‘e¤"Ò­Ý]Úß[žN÷þáß¿øµ_LþÆv~z1P§™[aÕ5`]µùÿZSCz:ãù¬N\ë¸JC)ÅR1iŒ›T,JÑZ!ø0–ªCçJ@=æÔõÿUJáÕˆ«âA^·@ÔUåî"ZÛò™°WPi/L"LŒ]ZF¹5£bÒ•ö\{8Ë*ü„ê‡Æˆãóî^UÞrϤ¢ƒUï FHh–, Ö`,öz½^¯—$É"]T±½gÍÈ?Îñ‰×ÖÃû¸õãñìó°W›X#pASM̲µýêÜ ÉÚ|QĤXk]ÖÀÂZëXÉZŠ{:Ü>¾TÃ?ˆ¡Yq,B$ä\É,U¸ºòÕ ‹ˆ¸õy”b/~n­µ,kŸŠ­Â†üÍø"bf³”>Løëׯá _€£òÑ£G·oß¾{÷îýû÷G£@¡âápˆ(×`0hµZÖZ[œ/ÔºUâ}’OX(Þ¿‡Ñ‡V…z¢*¦ëZjNQWEkÖ”1¼ ÞÛŽµÖ¦iº\.­µwIÅ´˜¹JÅ(¸òi×Ï>Øì†•*Õïœó8GÂóÏ?˜_.—ÞÞ\.—ûûûH´Á—aÒcЬ¬(ãz *ò2‘^¯‡ø®OÜ8>>^.—HGÚÚÚêõz[[[J©“£SäµZ­/}éKŸ|òÉjµúàƒqã×ÀÉÉÉG}ôÒK/õ½4M‹" ØÝI„xsÞ¿ŠeƒÛ,%IòàÁƒ·ß~ûîÝ»T¹p¹<+ˆè‹_üâW¿úÕv» Èl4ZëÍÍÍÁ`Ðétˆ¨ßïƒ"æ ¸mµZƒÁ ×ë ÐD`W‘]à+æÖ0X)š´C)¿4@ó~yX.—išÂ‘¾6Õj·Û½^¯Ùl²V½^³4%Ïc à׳W£uy†ÆÄ[\ê®,">+:Ú3Sf‡Ïÿöÿê? ›Ñtœ(wél5‚BSÊ2©Ò®„Ò”¦1µtbµhY™‚„Hˆ92´¿wÜÙÜ\Í»YZþñÚÙèÕ_ýÛw»$‹ó°Ž7Ïñkð#SŒ{†Ëñ Mç_—b!'€^Wý—•s˜\_«‚a浿škn0Ä ýù=”yÁ5;زw¤?qx´ÿ2¡úããÁ•RFiÃjmiÃZ)"bò„Faµ†FQíþ54XÇÍf³ÙlúL·òiNAˆÎìï`< ¼·Ü«ì3H³xåEöÙû!"qç ]Ø šhÀTÓÕõ“`ž€´?÷ÀÂ,«ÃÇ€• *ÜrD$Ž¡y’8±Eéì:"IUÒ=Ã%# Ÿ½mÿ¿øp±Xx‹MjdOH„YœaÅJ˜3+W®ƒ)Įг­ñÃN­£™Î98,½²3Ä£q.{ÛÝ@A€8ŽÇcø ¯^½Ún·_~ùåW^yåÆ?úÑnß¾ Ó~2™áu·Ûm4HR{.åu ŒjNfˆW˜ý_O/0pªÊmÆ[Ÿ ²‹“ŒÇcª,\DM |› &´a‚šË ÃTuµZP-ÿ v µh»Ý”R7Ó4˲$I®\¹2Ÿ.”RNçää†ËQ°Ä$-‹$I”R§Ç£$Iæó¹ˆ„a("‹Åb2™DP)f ŠÜjµ@R‹¢X­V0˜`^Ykñz>ŸÇq|õêÕo~ó›ÖÚF£ñÁx¯iàÐßýîww.l_¾|ùâÅ‹;;;àÜ~L (€./ 0P0žH+0Æœ½õÖÞyçÓÓSª<xRbºzíÊÏýÜϽð 0SúýþÆÆÆ£G666šÍæææfY–ðØF#Ÿ*åÍ©,Ë‹E·ÛìÁ,€Ôh4V«•(©rú”R‹Ù¼n­c¬pàœð®ƒâÃÍvU@×9·X,t`+aŒÁàÃt;;;óyמ¦à©‹¢˜L&³ÙL)…“E1}’kyXq0ø oF#ü•¿û_½û.»àÚr± •„æR‘•IÔp:"­Š%-Ê’(Pz'.KþÀÚ[ô I/‹‹Ë²¼ÛNN¦D \ÑïÝIðzÿééˆ>u'CÔ‘X)%r¾$Ÿ…¾ô4^â#J¬è<©g=·§¥Æ~œsNÖ·äÿW×’€¼ªÅÚôÞ2U¥Yxmó„.ffUÓ³þ‰ê¦Ào5³b¥µVzÁJ)ÅJÈ⡪£Ê/ÓåŸCB-mÊ›ìÎ9ÖžC+g\Yÿø¡-Ï•¡×ŸH ©Æ u=nA¨Ÿ:_šÏÏuø·y±·ÚÍ‹È1`y<‚þ“Ú¬]ÐÖ"ò.è0 ªd(-"Zéúœ:ç;Qx,RJ9v\Å’­µ–Å’ÔÎu9©Û õ{6¬äAZ§Ük-TЬ±r¥H)eíÚã"î±,hRìœ(¥Ä9®\÷ä4v’÷j­ÁXDÅ(NãªJ€8ާÓéþþ~žç­Vkcc‰¸ãñx2™ŒF#"šN§aÎçsXg(‰¢È¨À›HRe…‘íÕ׉ŸN/ÎÇ®}\JUn @<{°§p¡0 —éBª €Í¢³ "«Õ*Ïsœ ƒB•'æ DÁ‹—Ït@¸Î³s N»ÝÞØØ€ñ¡”›IÓ´Ùl^¹r…w»ÝÝÝÝýýýÓÓÓñxÌÌ/^ÌŠÚ߇k]Díí£XÅZ‹²®Éd²³³sáÒnžçI’ ±yssCÔn·q«p/—Kxnsívù>½^ï+_ùJ–e­Vk8Þ¼ysoo¯,KTøXkß{ï½¾íÚµëׯ¿øâ‹a"9Z@*ÿªpà'MÓù|çêáááÍ›7Ÿƒ"@URˆ/fG)ò*"v+0«aá³U •ëÍ+;Ÿ,SwùÂÝ= â8ƤÀ\,¤”Â=$I²Nß­üÕ¸œ7SF`­«ŠÏf3®Øl6ýR-GÌ9‡Ä=x)ûï >ø`™¥ÛºET$w¢¤›çU•Г*œ3E0/4%TÈE%9•‘ÕŠÉdRɪÈçE¾KÌTÆ·>4ÿÛß}îWÿ‹;Ÿ¥4¡Î±Ùü8Æóô>îô!çœ/= ¢àü 4Ò3ÏìAè uÏUô‡©*9WWõ0m-~n Ti•þ¯?¸F¸“ª´SfVìS½Ö™Ø¹œ‡¢ëw [ëeo®Š_¸šKÜU9;®J°ç*ÚÍLõoÂ¥”òžsDÝý#eúÙyñƒêñõ‰écöùëÄòc¿¤Ê6ý1ÂðÔ ÊÙZ«ª¸nž¯ u´6D¤•À2î%-¥”¬‹U6×––•0Eaô¹é ”º™õÄÔ 2‚•;ŸÏg³ά$?`ǬÖ,®àZ4}6 ™‰…WOWE¶^ÞÎÇ·št1ér%Ö9çÆ£³Ð䄜,fsày#Š/î^xþúsóél/ŒÆã1kEDÀ­ñx|||ŒÊ1DDXª&ôÞqGUÞ©—?/v~vÁÓýáˆÚí¦ˆˆØ¢(W«Ål6!¢<™ÚˆàSeæ$IÂp©K]ºÂD¦Ók‹ˆ6*i6‘CkÅyDaVä…-©rnƒt‡Ã,ËîÞ½{ttxF´5dy°=xð`kkëË_þòîîîÁÁÁ½{÷nÜ»ýÎÞÞžRÊ‘¢“ÝjµpÈkšÌÆãébÒ°mO´æF£‘§™"¾víÚ ¿Ñl$w/œžÕ5™L”R“Éäää¤Óéllôz½^«Õ*˲,óÍͯ}í/5›KW.~ùç¾ôÎ;ï¼ýöÛ=²Î’"'NKðÉ­Ûwoúá›—.]ºtéÒÕ«Wi­u£ÑM¤ÙŒG“Á`À¢²Uîܨs-ËòþýûßûÞ÷¾ÿýï?xð .î˜Ó­íË/ úÛí×_=I’£££‡öNON:­öÎÖv†e^ŒNNïܹ³\.Ï&cXKÈWÝœÏç[[[*8íAFÁÔ=i4¨k”Ü-–Ëå’™›Íf·ÛÛ.ŠÂŠó²ªŠ¨s’$W¯^…ÇâÑ£Gãñøììl4>fw:À?fg«&"X„ÞvL’Ä9g‹2ÏsG6ÔÆjc‹òìt´Ñë—yñüóÏŸŸDA¸Ñëflõå°×¸àìª_‹¶í?û¿^øƒ?Hˆ^f&· æèùù„˜I1YWR@\PPR&–¬R¤ˆ2ÒBb´sbˆlQr¤¸ÁDåj»C"Ž&£ëohð{_ø•¿ýæ½›+ÖGàj«/VÎD-±KPÇBfÅ¥“Pˆ„,1­ãwN‡Ê¯S¯Vœôƒˆ)V¬"©@…&MÊ*k-Bn²ÕÄÞ&X3K£•(rŽ„sâœÒë±n¬‡a¨•òÞX0"]-¸ã-K ¼)Þ.gf­5«u>°sN³Y+¢Õ2ÓZG‘‚®”‚Ó‚‚À{A¼¿ÑZ»J$Šâ€™Ë²TJ3+ç,1ùëz´PJ‘RaA -âõ}®kÆ(&¥5W9.pä23Q\–¥8ñÌÏUÇ~Ÿ&"A°~زpD¤Œa¯¨×³ÆÀ0"RÏò@‹Xzœk®{@«ÕÚ*1<‘eYæi!sID0Žó"M³ål6a¢04RÚ²”Àb²¶`¥™Ø9B oUæYžGQ U ^ª|^¹·]Ée•“ ¸ÝëÍOzq<#žÝþàOÿÕŸ}û»«±SÔ¡(Ìó)ñâüaøñ¿ëÄhEb‰‰@-mŸÄ SI올ˆ%i¥—ƒÖƒ¯}åç¿þ‹3ÜYÎÒVFAš¦ÝV»ÑhuR”J¤X¬¢(2~ÕI•wçÉ"X]³ÙÜÞÞî÷ûgggEQ ­Z ~¼åriŒý$寯Oo x ÔÏ.®åeëŸ/ªÛ5¶*pÂa‚ù\ð?û’Ð'Ì ?ø\C˜0œùÉP=Ýn×97™L|r´ðÖÖÖp8¼víÚÆÆÆÙÙÙl6;;;›N§(ë%J’äâÅ‹qgYvppíÐl6­µ¨B3“V«ÕétàÿDth:NÆp8l6Ðk8o···/\¸°Z­nß½ƒ–0®‘\m­m6’V«Gž¥Óé¼üòËA"Û9I’7nÜ»wo1_bñ÷àà`ÿ½÷Þ{õÕWßxãW^yeµZõz½íííf³9rĘQ¤»X,‹ÅÉÉÉÛo¿ýgög÷ï߇Å3RÌ^xá… .ôûý8ŽçóùéééééiY–HŠAá¼ IDATH’d4=zôèäääìì &¸2ÚàE‚=fÁ©¼Êø~EÖZhñDeUªĘ̈ã‚íQXóðºPçó9ˆ8nÓ:âÖƒÇ8ƒŸ\tÞ˜N§Úçóy‘çpG»Jº }JN³™“;‹øÒþÞlëÂ¥¨sôö÷¯ç_ÄOWoÿæŽ÷ÐxñKC¿ÕW?›gKîHIóÙ5mrì÷+WkÍ$ʧe Zž „®þ,ÍRÏΪӲÇËÓ<ØT­_®µPµ¤¤'¸ 7ë?ï¸Õµ×§®•!Aê0Œ:Pž‡<ñÛ§ÝOëágê © Zü¾Au¶kÍ ùÏŸ?ó‹ˆÂ0Îó܈‰ãhéŠÕbb²wøGßþ—ß=ýxJôò ûú27«UFÄ$‰‘& ˆ4‘a2DJSo…‘åd3"ké!‘#rBN‰²L%IöÊ‹ºxëß?þÑÛÿó/üÏ}ñkmr0!"Q‰"ÒÏãÞ|ƒÓŒˆhì÷ûW®\9<<œÏçÌ<žNð¿yžO&P±F£Ñl´êͪü•œOG¬9¾êëÁ/u©<Ò°juUÒçÏ€Ÿ{¯#.dªIОåãm³¸¢×X4‚ÜÞ¤Jï’ª 3Ãß‹§ëB‰H»ÝFužç§§§óù|<F#ŒÛh4ºÿþÆÆÆ… ¶¶¶^}õU Ÿ«Êpñ¼ÝnõB[[[ιíímd—eyppp||lŒÙØØÈV)ÀØÇ1’ÝæËÅr¹Ä‡ˆXkW«U7<þÍf3®R‡šÍf𦻻»®ês÷îÝÕ2õÖ|±X|òÉ'Èÿºxñâ`0HÓY$¼nja¬µóù|:Îf³?þøÍ7ß|÷Ýw—óuœØ[Hq¿üòËÏ=÷ÜÖÖØçÞÞÞÉÉÉl6{ÀÔìíí}úé§óù|2™8ç‚($¢(Š677···{® #µÁ‡ðᆸ( ü…;7 ­5¼Ù˜MŒÆbµ†ó®cÔ_Ý¿_) Æý#M¸¼ÍŽG)ߺª÷‚Þ ¢¨Õj9çJk½i´FnöF7Wò¢¥ÖºNafò­ËŸ<¸ðo[9?ºwñ‡Xü;¿ò.»ÀåÅ,ndó •ÞöüŒ™•8E°ÐŸ«=Dž³ÏggS;ç¼ØŸ”@DT]“𝏮ֽëØU¥¼þ©c0ŽõCÕ4~ýàg'ûø1¡Š@‡ø?U¥GëZÇPëÇ›Ô.ADþþÔÞ ©Ïšª²–¼?ÀUlT2«úTÈOP˜þġؔ¶4ŠXYv%.?|ï½?ø?þÁìì2Ñ×5ýåÑlKœuƒÎn±L‰˜$$1…$QHÄBm"C¤…àf°D9‘%zDì@‚9¦Ò‘%¢@¦E.{1·?Ìç7ÿä;ÿºÕ 6_™Œ´âªÔ^D‰AD ZCÕ*Ù¹J‰¢h8^¿~}:–e™—F$Ë2äÜžžžöz=i¯ãôì\pyÜ‘òÔÃ/?+ª–ºe«zWëŸÇqF"2ŸÏ×í`‚=^Kr¬[£ÐïОª sfY ›ÍfËåÎgT”2ód2ÙÛÛ;888==ÅÑài:¢(Öó /¼ñÆð3F#äÙúd]\»Ýn§ÓɲìòåËHƒŠGC«8Žíšõ•8Iš¦ ÍI’ôz½4MW«àÑÓN« Fú%•çyéìt:EåÒK/½„’žO>ùd>]``Êc¦Ó)Èè‹/¾ˆhësÏ=71yžäàýÞßß¿qãÆ­[·–‹fÍUåž"²µµõÕ¯~ugg 5åeYâÆ0¼Ÿ~ú)d4J‚Ú"ºŸ$Ép8 (z&"S„Z­ù8Jx‘Á UجÕjyýØíva£dY–æY–eËåBÄžçó¹ª\—10TøÀ»Ýn«ÕBíNŽÜ ¼õÕDÐËå²ÝnO§Ó££#fîu»ívµ7Y–!Ž ¾uË9vš^ÜŸM†;CÑËÛÞ}óR4Š'«Zþææ[¿ôËy󸓴ç«ýÁæ¥2çÖ¤¼ (J¡g°7¬ýÊ}*¨`éÙgNUäÔãv"b+Ÿ*W9ºë‹)f­þ!øvî ¯ÙúO袺3¬~<õçÞçŒ>Ÿ9èù.ØÿÖ3'€ä§†5³^§¶­_ˆˆf¦Zj*ÆY–™Ê´RYW9ŸóæÏ}í´ÖŠ9+V¤¨ÙˆGÇGÿò÷ÿéì¬×Š~Ië_Ÿ._R`EÅTQxLÂD†´Ñ$†H‘å‘"Q$(L*‰ bG2X{¤©„áMDD®°E;¶l5žÓf÷þïoÿóoýÍ_¿&áz!€{îÚ#êœC#®ÆAºæÖÖÖÅ‹G£Ñ|¹@ÊTgûûûƒÁu·pëy8¯£/=N|¥æw¢Z°úYW^èÏÚ¿x v[gÀu’G•"ð왪Ê×¢êˆr "¬ÂÏé«cpò¢(Æãñb±h4"²\.ã8‡I’AeX çOȈƒÇ.îår9РÛHˆm6›I’\¾xéôô™Að9w:ÝÝÝf»…þ'GGG@_¤%g«´(ŠÃÃÃápˆ`*>ïö{ †J©ápT‚àæ¸Kų߽{÷áÇÇÇÇJ)p¸V«$³ÖN§Ó{÷îݸqã­·ÞBç 8¥Š¢mmm½øâ‹Ï?ÿüÖÖæp8Ä“Âa /ñáááh4ÚÚÚ‚s ÀFD¨—E>à|>Ïó< C¸чË×PÂfʲ ~{ôÙš5áE/Šâàà`±X¨ÅòŒûD²¢ªòÌý4ÂÌNmjt•¹ ï4di؈‹ÃçŸçùÙÙÙÙÙY³Ù_ãx¸µµX,Úív³ÙœÏçx€:ýéäŸE v ûÃ?~eºê™Ñ¿e6&˜Ží'ï\ßýë7 {E)*æW’Ö¡Øf®i%ò~«„^gò¬³dý¤z:}>‡¡‡L©*mð‰®œÖª–_êœ+‹Âë[5kóT«ÞU©LòxµEƒŸPMþÃgÝzÝ©ª‰PU·÷ÌyÐÕÒµ„gÀõq«Û.ôSŠÄuÃè\H*—V"UqÆ,Ë26q)¥Ø9Äž?/ôâpN4+QDJˆÄåýOîž|ò)kžý<Ñ«D[d´¡2eÉwiÍq«\€Á`Kl«/LQ( \½’i#ÙX,«üB·±•ÑáéýßÿôÖÍÎë?ÃZ±VÀ`)ʼn8ã¥PÕz ÷Â¥³Ù ñ°áp¸±±1_.\U| ±··7ႆÇòÜlñÉŸ±û³n~ì'•˜rýlõu‹¸´'´Æº­h-&OµR%E†; *ƒ3Ã)ŠþVG'ÇÎ9_Ä„€†>¡çÊËŸãñxssóÚµkÛÛÛÈÕÉöZÃ+îÙlvxxDZoYŒôàn·»µ9D8s>Ÿ6›Íétº½»:c|GD–óE–eCÂþÀäåZaAA´Ûíçž{Nk݈’?üðøø˜ˆLDI’€O¿ÿþûÌ<ßxã øÒçóùÁÁÁ;w€¾·oßvVX2‡‘Ò’ýÒK/GÂ:9;;;99ƒ\­V( Ãpkkkcc7iŒYe©{<1ŽÈàƒá`@`<Ã{Ül6­{&IÒn·|ã8NÞ•› ÞoªÚ²C)„aˆð³ï‚ ²ëCÈ~o6›H}G—<ϹJÑDSItK ¢°„„§Óé!”n6¶w¯ìì?œQðüí÷^‹£0Íî3]ù ¨›Ÿü°*#Rï}çëÿþô8Ú –£ÆF/{òÙ:ÌÌâø LëåX‡óe^µRª’œùÏ¥˜þ J)mÌ:Ñ7 ÖP‡…o«ªÊ,ãZÕ5€ äÈ7¶Us©xðg4ÉÓ¯þã'tŽjQ•y KÔVÍ=Ð[™ww€Â+þ”NÈ 6÷ßq™ÞZâªeci"Â’&rJ)®µìøÉÍZ$Š#ɳÅdñɷɆdÿ©WHí’•…¥UHy[‡S‰%.ˆ âœÈ Ym"KDÄNÀ순#0!"ËDȃ£Æ|±zh—¨ŸeE¿àÜ}tëý¯üìϬ…A+"²3V "»0çm­½⋞íììÌsÄÒæó9v8:::99éuú¨ ®7¾§Z𬾠¼‰í驪šM>šþ¨[Oþ„øÅ$гn½ÃFäK>Öj¤:ꈲ¥¢êìoòøøx0 „ytr €÷\­×ëùbbøcUÕó9I@¢˜È]BH:‚karÜv¯×C™l¯×ƒA}pp€ÔÁÕjuppppp$Éd2™-æ×¯_¿xñb§ÓÁ> ι$I&gc@¾#ºZB_´‚’B/è(ˆî>¡~TÔáäyþÖ[o!s*Ïó¬H?üð÷Þzëý÷ß¿}û6úlà(˲qáÂ…/|á ׯ_o·Û€c :y13¼ëЉ8'Lœµ,Ö=,}Ýn p¦jv]r0dY6NNNF£e‹H»ÙÂt KÛ|…axùêðZ\º²,t—ªÅ ¸©ˆÀ ôI¡Is’$ˆ"ÃjA¾˜ÖzÐߨÙÙÙÁÔQ'†í.–Ë¥Ï3‘i6ƒhù•°qçÆ_[އIçó*šÏ{ˆ+HµŽïoÜ}e÷Åÿ—i`¢©â&›óê¾ú*c+ÀÔóe¸n^ÿçø«ºKå¦ú±4Fªì\ßS]Çk5²îxd×Ñ"C¬‰Ù þY¥×ÐÛˆ‘窊[õiùì½É3Mð:×÷Çݧ{¼’ØK…O‰‡*@DOÀVJ9:7Yê÷óã®úÿçÃÛÓ^ç†ÑžW~û¹ðÆÓZ»§çúý„×µ.m¦$`Òn<ºwÝL~Q‘©³BdZI§t«q:R:'rLŽØÉšé‰²k`úú2-ù.kD$ä€d ÞYÈm&aL´l÷|®›'ã#f–ªgÀ’°`èú:QãšË£†ýyޱ«Âfè)LpÙQ-ñŠˆ¼[æ³ì-A/Í8g}ù3¾‹'DŸ«ŠUwÌÖ!Îà¯^wLI-œ ~u *3™L€ˆNçõ×_Gi“ïÖ¹»»ÛëõŠ¢8>>~ÿý÷A€Tµ9#èlYí77™L€¾0p(æq3P*×ívÑšãáÇ÷ïß‚ŸÑd2ÁfA«ÕJ˜z½îawwVK¿ßŸOgpØ"¦à %›í€ªÚDç\·ÛmDI§Ó‰ãøOÿôOW«ý%p“ZëG}ë[ß:;;;>>îö;o¾ù&Òž³4'¢ 4E^‚ ¶Ûí¯|å+×®]ÛÝÝÝÚÚÚÝÝNÇhWÙl6‘TŒš`„ØÑ㢬Ú5[kÛªí·2tÕ® [˜Ä[X?€´£££ããc¤Ë)¥¢(ÚÜ`ü±UÔééét:í÷û”àNàѧz{{¦œØØïYZÐݶÚJ 6«²£qçRíq„ð¹µÖ(í1Ô˜Îfèδ±±Áx|cx)ùÃÿó¢u²JçªÙ“å_LáüćMH‘Pã“·w.¿–ŽNƒaY¤;A¼ªkCªÀCžnŸ~úOÖ«{¾äŸùs¯TÕ¼BkM•ëX‹ˆ«ˆ5¦6™­vóUã¾`B˪t›?ÓÏë/¬Öý × 1Uc…{[ë7{¾»ŒWVJ©§ºšù§×íÄÊúÃjW†'h’÷69ç¤^Dû9mEÑM’rY¤ij‚hÐëÎ'i^D-[æQ8ãˆó<š/K"¡ ë¬ÃDŠÖÅFŠˆ™æB–áf'k²KBËZdÆ‘(HX¶Ü$:ÑAžNï5BÝ"âÌ®‹³“®òŸEÄ’˜eºŠ¢ÈŠ+K«µ¢°°åìôd0äY¡”j¶[Dd‚ÀŠkw;;[»é2Û[ìµ’6‹JÓtµH?¹uÛãÈ:²››› yЛΑ§\•#Zaº1ª´¥f(#$…͙لºaË彎áGÓÿ¢(Œ ™µµ+cÂNg½ý09fâ"+—²Šã¸Û^ï^—S¡Ôºh™:Åa¤µž¤“ÕbYd9 ±PQØ ™uš¦Qçy©”i·Û_þâ¡D´Z­&“ÉÞý‡öö…Ýh4ºwï^𦛛›ˆ&‡Ã"+£(j%í^§?M>xtïÞý Â8X§Å–%ù=úý¾Tã  YEιׯýìÙÙÙñéɽ÷ONN|ÞÇj± ´éw{¶(“xÝ=ãÂÎEk-œŸTÙ=̼XÌf­Ùññ1Ð&Ž1&‰›€±²,oݺurrG‚­z=*¥Pêý½ï}ïæÍ›[;ÃÃÃò°Ä¤µ²ÖÓb¹hw[?óÚ+¯¼úòp8|þùç¯^½ŠÚöÁÀÀȸ|9Á¦@J)kÃ8ŠeéˆZ¬ª766ðM°Ø@¯}ÂÖZEºÌíälzz<²R"o|:º*|ž$I¿?H’Ęp6›c‚ ²VÆãéææV§Õm&Íù|n­3*M¤Hõ»ištÛ=Án "dÉee¿…ÑQAQ‹ÙR]–N©.Ç k—Ëå,[åËÅJ,…qL¤æ‹Õááááááh| JÁåË—/]¹A»ÛÙÝ [í­E_¿ÿhztüRÚºO«-·¢gQ°ˆO—aŸœh^õƒò  (hª’Iš¤}Ü[½¸2ãBÚ”ŒÂY;£à©ç bU¤{A3ï¿0›76[m±Y)w\¾!iÊóœD¢ RByž³ÓÌ\uãC1õZŸ2+®Õ…Vi“l­µä„He+XTh¡RÈ 2Q¨se¹ä‹|•eEQØ(ŠÍ" "’»ui_^9uñ6ÍBFi4ÓWÚ„&0JG&hÆ 4=…# R¢0.Ë’iÍÀbæHË*·®D·¥¬ Šïb£\râØ‰ˆ YÅa†¡B+$¬‚(V¬ØÒy)Ž˜”Vf­ÙoÖÄäœp‘{×|…@‰°"¥¬â5l+ÅZiUØó¸rýÐÏÂ#]šÀ§ú”´\iÖµ TlÿÃÌœ)!+š‰gK!GŠÑïë<VDÖþØÏΙ5=~Xât¹7(²œœcÊ¢0Jʲ4Î6㜣a¼ûu'Ĩ¨vð=°Lµ»2à´^k½µµ…XãÑÑѧŸ~ŠÇŒãx¾œEqzz Ù‚¹ÑhtZÝ8Ž/]º„L"„‡•RA¶nƒ®eY^¸pO!"Qu»Ý0 ‘ðŒLi$cß!Ôdcû]måœC{ fÖ:°U‡¤¥ÀÛ™e+PC„™Az½žRf{{ÛïI|ûöí££#ÐMx|ö 0éôìdµZIE$œsx­4_½z{*`Ÿ¥ÔÆÆFºÜÇ`âThjD$c ¬+Œp†ív½JºÝ®ÏÌÂÕ1ª`è}ÐÓ4_•e yª„ jšÑ™AkÄJ\Õ(~lþAIÁSÁûñ^eçœoõÁðâäÝ'RëÎã])h‰—nزÞívÁ³“$‰¢èdlÙ(ÍÊ n?<¤"ß& É¥äOUpË¢O9©’ÖË)uÄ–hJ©ˆyþ”•YGËAJ–‚ÙSÏS”-¢A‘–÷P«»Å¦ 8SXÍâ\.V )ÑŠŒÆ:õ‹‹I³skç2¹_YëœdCμ‡Z)qd F ©j ò\Y–ÄF+g4“6š&­H„I)­Ù9¡êZÄœ;ëX¬¢‚\j áÐÍN± ƒ0i0¾“¥%I!./‹¢Úÿ•™…×[Î-ò,µE&¶«X­;^‰³dµ8¶JÖéßÄJØD±Ó*'ç\é¬b[h[3‰ŽD3…B®,]IŽ•8&Ç$šD³(áµïü) ."R*VŠ´fǤ;&Q¤0O¼gu(³!´ Rû«xÝxŽÃD¢KçD*ÃO„ˆ•TIޤDØÁöb"yz«K§žtõã(É•ä ±b‹’œSä•bó²,˲(‹Ò®šE‘JD¬" 4¡“%fm2gsg gs±¥Xç\¶Ýî¦iº\ÎmQ¬µ.²l:›ì^º4™ØUZvÛ+T# ã8NÝŠža¸„›ùâxZè’hàRRù¦HÞnÓ"uY¤‚¦s.+¦I2ŒÁèôFÔzM”­öƒFRdÅbY´7.ÏFsÒ‘!1DŠÈ ±²ê3)ÉÐZæààÕ@Wí  pŸXkQ¢ê;è¢-%j+Á±Ê²Dh»ÝÞÜÜ"eªÝi¼÷†ˆœ³¾ËOšX­V½Nÿðð0MÓ .À¹×ívïß¿“‰ÒXªePû6t.žÓ0°4¨P¿%oxÿ$ ]ûí‚=`µ ïl0\¾|ysssµH»ÝîÕ«W»Ý.Ú3˯\»ŒÔ°<ϱÇTžç;;;ãv»=›ÍDäÁƒ¸¨ÿÙÙòœ!£¨xFôWDööö>þøcdý<|¸/"Ýnå.µ-Õ2À$ô§L’¤Õêôû}t¯tåy~||ì;Z OX*·¤¯8ÒF‘-×Pì¬ìîînnnÆq< Œ1'''Dô /Ìf3´1AÙnš¦q£€ù]G nàåH_­Vv.±\­â‹Ôjãn½)‰xÊŸP1ìµ00nƒ ÚÞXª°Rᤖ=T[‡a{pÀ-D­9¶ ÉDÝRÇôΣGM§ÓÍÍM"šL&0¤Âäò¦¶abúí«''KÊŠ˜)¶ùùFu,,¬Y•"d„µìŒ„,QƒôJ3U;ãiKV+*[O?M舚èð`Üll•ù‰¸€uÛÉqQbG“Œˆ˜IkíÄògX|­y3[®AÑwÞP,ŠI¬cG"¬˜5±ˆb ˜É iÖ´îÏGÎY*,ªVN]÷RŠsè²K`‘5qd1F‰è ÐZ3Ž¢ ™Äv³ßë0s`”b1šó<Œ¢È[i"‚æ˜Î96¬eœQÁšE¬UY­5¶d€®ffEì”8vŽiR a£ÕH’$P9|Æè 0"o•f­”Ö¬aOaµîÃðX Œ¼[ÀkA˜™;çžl•+ôÉÃk{Q„„ˆUUÂåí$"bìÛAäìºu«Ô,çœRšY*¢Lð‘‹ÑÓ÷wgzºá&ŠB¢5Á3F£™)·ŽI+­XÕús9)¬Ë­Ë‰KG¥8)Ä‘VJm” ´Í–J¦´eš-'Qu“¦µ6Ë–TR£ÑØlEÑF°IVu/‹ã øÄ}ãXÇÝŠÔ ‰EРx2ŸPpfÌ5+D.&CËe¶\Z Ù|E”%]"*ÜŒ¸ŸæDÅèSYͬP-¼ÂÇ>¬µfp"2ŸÏ‡Ã!šÝƒ JÕé&³Ù D„6A`×ÉlŒH0bcˆPnmm ‡Û¨}ô'¡5ŸX— »ˆ€Ð<¸·÷üóÏŸ½óÎ;ý~¨°½½}||Œ;yõ¥™Yéñª$U«>ò¦h4žÇZUU?sµå-lPLqؾեsîʵËH&¢²,777/^¼¸¹¹ÙˆøqQ8à0ðñ4MG£ÑÑÑ/MÓ£££?þXk  ÷¢h0Àqç¹ßÆx6›Ý»wïÞ½{È [­2X3 µÈý‘ ÐÞ:AØ XÛí6qK—/_†#aggg<ß¹s­¿1Jçæ3úÀð9÷%"¥ù¥—^º|ùr¿ß¢(MÓƒƒÀ^7Ñ¥%[EQ$IÒívá~AªttÀU£Ñh·Û£ñ)>ÉóÉ ’mÕwÅUMžÇÓõ6G(²Âb÷ ŸQˆóc~Ó4…S(."ˆ÷ã-Ui2>ÙÊ?¸«m=ëœYw/ªzH²Ç‘L޽¢ÑpcïÑ ­VKD`xåy¾é,òegYPbfSêi¢§«[" ‹¤8-£¶)].ÃË0ÝÈ_u’…j_ÓÆ\ÊV8ÏÊv“g‹ ¦ôéMµlFSPN³â¤¡CµŠ†g, A)E,²$Â$DÌë­ÇA™ ³Œ>7ç×¢ˆY ¢ ÒòŠÈY¥±Heè8ç2kƒ(jˆL–y)l…£(/ÊÔº9LÁ"l-[§X+Ʊsʦ f6ÖÆÎbËÂX\Xm­âLži­›L* âŠÀŒKk´ZÁ·j­²%—…µ¶(V\–º(TÕȳieÝ’Y‰/‚bޱ"1ŽCgâbgòŠ<Öd™.KSažsQ(kµ;b)µ°Ö.Sjíÿ•óV§C[ö>ȵ²RJ)Õ #zÚQ>Ã,ëÞÈNkÖZ<ÞŸáÉ +ÇTÙ;âU–Õ5çùåéêžñy¹š›fÔ•â IDAT4¥²Äy”µ*lQ%¢­åŠÉ(EJÉÖ ÛÖ*( q–Yœ8Eމfó•¥Êó ,ÙZ_<iS.—Ë¢€[Ô#éj¶˜oo ç+uztÔív.\ ô“ÓÓS£.•kåÅk_úùh\Ñùä/ÿ3›Ý|'ëšWT@«•&ëX“%©<ì¨|”¹8Ø)óE·öúëñÙøôøŽÛÅ|IfNÔ$¢µºdñÍDt­ý§Ôz;®ëS L’äúõëhùÔívá?\­Vggg`'ø1Ü­Èzðv¶pðUb·Wt?@Û¾N§Óï÷ÑsÑçY­©0è.´X,ýÍ·Þz È:™LÜÿèÑ£>øàã?¾qãÆh4BOtñû K-3‚j6æ¹³EDD”xžç€(Um0ç­`'¨¿w'‚£)I’0 ˆ‘»‹Ò”0 G'g ë8-*˲7ßú!r¬PdŒ>ØOt%Ô¸š~t»]l‰Td0ÝÞ¿ñ­o}«ßïgY¶¿¿:çœÖ!±(+ë-öÈ—cy£[E®ë£€¾§D·Ûçóè[E…MY–âà¤"æuáõh4úö·¿Ä¸¸E¤ÙlvZ]¤wDcÜ`@xÃ¥¨ö{`M>ømkûìbS _5¸ÖbÕ>Ð8¿­6ƒj6›š jÁJ—Ë¥ÖŻȂö_F—rïëÖÕ.–€sH Ô N*†´ïMÅSäiæ¡Ý£oE“Ùõ\k÷Q:Ҧ̋°ÃS!fa›V%ñ੊Œlo*ûdw¨œ2‘¢å¨èü·ò"šÈ¯%YF”,¤/f1.¦”^'>zúy¢ÙJìJ,•ü¿üi‘EЏ(lÔX÷°¤àq…IôX™oMáV…³Š@¿8^W ¯ÝãU@^ûÛªAX¬~0};"²RRùßÚ2£ÊÔvÕ6‚Zë8 }‰U)µEQ”……•ÉñÆ:ÅÆU•ÄuÍXTˆn«*ù+-r®2Ãuµ1šÖ:dã…¹ž@Í«k¢‰ˆ+®Ôè/Y>œáÀ[—>YæÏê,Vc Oh|ÿ:³<¶{UÅ0ŒŸ˜ôêWÏ~yºo×¹V)‚AY–‰6~fýÃ2³r¶ÛjJKi±'fY–¬•ÄóÝ¿øÑ›,çÈ-ÅåÐdp8î\q¸ûüp£Ÿv1›ušA³Ù§ë‚ݵ'š«·t©yöÿhûg¿B,×ÿéïÑßùO>8›ïªÁÃ`q9KçD!…‹|6š×ŒS«ÅÉÕöôøíçþúDL[ÿêÿqç×îÿì½y´eWU/<çZ»;ý9·­[MªÒTBLG !@$"#~êê‡!øŽñþP‡ïCè'CE†ÀSà) ¼ jÀi"‰!ú’TUI¥ªnïéÏn×üþ˜{¯»ÎÞçÞT…éVÝqÇ®}÷^{µó7×lOnÎÛn; €ÇÉbÿà4Ĺyj,ŽÄ,|¯×;vì‡28çœs8O­V[^^ÖTL˜™3Yd­›´Ÿ?b#RUƒÁ¨Õjù¾Ï˜Í‡K×u“$Ò…ªÙ_E€ìv»ÍfóÔ©Sý~ÿÀ‡¾õÖ[[­Ö¥—^ú–·¼e~~ž¥‘œlÄ×±…5ÉÄŽ2í“WMsŠ.]Èñ´‰ú„D¾¾©1^)U«Ô!Ûÿ”ŸÃÐr$K\ï5»Ãˆ¾¾¾Îî³|cu„7¹0üª3ŠkËO™\´,‹ õwµûÄÍ}ÈÈÁÁÑ S±kƒ/v`ãqcÑ+¿hK›*‹R©2ŸÈÕL‚»)´kËšWb>ì²ð™[ÎkX)e [/¦ÅB¤$@ÈTOèb’usrEÁÖM=e¬RÑã 2'õ$IdNU‡+á9]oûu/–ŽP¾Ñ‹â Ré»voOF;pe™$¬tìDZDà+!m ÅÁSì!”‚°@(@¨4B‘–²±¤Z©Í3¥:ÔI y#‚¬E6DÔYŒˆˆ-±xx£Qvxñó•,^ê`Y"V1k­)Q‘ÞwVªË¨9¤¢f$ Så5'Á£(L¿4ΘÚNjJ´/y¥ý"½Î” æ[8΋#"ma›0S|–'sJf¤H¡1¨£¤Ä”©ÌH{ìà[ÌÇd ¥I¦ÚÅ@RDIHˆR€EÝ6³;‚M´c°D’$ A,¤íÚipJÎ2 |AJеȑ ÈEëüóœ{ö¾(ù™»îüòŸ~àÃ{/Üÿ³¯ã©SíXô÷ìÙsl¥‡¨¶4Á)§)ú0NJáTYÀòÏütµQ*ÝôÊ•QL–,ÅI‚I  F°ø´‹£ßxÇӮЉFE P‚j­I»•À€€Cv€qÚajJD"Ël1ršv»Íñã8^]]m·Û¾ï8p`zzºÕjqL`P)iK²ÂŒˆ3sÓKKK,|æ(»,Üîtz, dqq½^Ÿžžn4å²§”b84‘,ŽƒJ¥²k×®^¯÷OÿôO¾ïßrË-×^{-- ÃíWu~c ®Xðö3& ,0äÆ'F2Ä$óvÐ,•ƒ&â LI»ÝŽÈâ‰ó®æ“ŸŽÑÑ„aèS >ÁW*7ÍÍH,xh1)# Ÿ#Ëf¡}†£"N3”ÀÀ]Ê‚I9Nª÷µ³ˆJ©R©äû¡ÌGB†ÌÖèAã³#wg0êCð¼EÙ¨8Š¢jµ: :OŠÊ’OpašõSj;&“5Ñó’Œ'¹bì´m›mÈufÒ¡²Œä3ü.É׫ Íès¶òÓ4Zó¡f§ÀÜåZ¨ù¼Á` —„Fh!ŠÔ]ó<ŽWÒfÕ<þÌ. µ/€M‰=pf}4ŠÛþ£¶Ø?‘…Ês¢ÄV*PÞ’šs*4jap3Œ÷õåy«ÖýžŠEìX£r\W"œì†ÉÕ$n&Q•Do×\}­©¨ìZ{Z&¢Ô –£mDÄ8ÙÊalŽƒ BØâ/!5V(¶¢9*"NTN ¥ÇI½+Ó‰¦PöÖWY‹jëp)H "Y ¤À,@ efÿƒQŸ×ª¥•P:§Q’ŠjØËˆq¥Œâ@O_ff”ÊÌ9úeι$ÑJ!ne}ðãÈäáŒÃºfÔÒCpöÌd@•”`Òíü_·sWK`+„È@ŒÅM1"«D[x˜Fv"Š c=õ´ oc„•á>)R)B$…Â|ÌÕôC$, ‰ÄXQ"À±ä 0‹ÅŠ%p(¢ ”R K"bB*!Di[×?÷êVkÏ?ù7ûѼèE¯­V*Çz¸^{Q·GI&‚ÖBuñ·ÿÛÿoÿsª^n'=KZSgtÍóû·~þ¬—¾ty4ÚQ“ª«àœ½ç¾õmöÏý‚RT•öñPvmQ?ú~þ³‹ìï>ðÏ ÀÒØˆœ³9›Ü1 ‡¼æºk ¥Ø³°Û¶íË.¹tvfF GQàíÍÍá`hIY.•Ë¥r¥\ñÊžH@^É«Ö*^É“–t=ÇsJ•rÅu\R Ës=KZlù EJ…AÐítßWI2è¢8âø|^dìv»-P®­­íÙ³çðáßûÜç~ÿ÷÷îݬEШ ³ «Z5in‹{[ŸŠôc¼gR(PHaÙ–´,¨H…Q(¤H—%³µ‰RQmp1(ÒV›Š”"ÅýãÐqlDZ0I!,˲9ô^Æ¥’"™&nr’DY–­ýÑ¥´,Ë––%¤$€D)b^…ãz–´˜0û•n`(¿"-˲mEdÉ1 F&i  $ZÒ’R ¤@%$¥”B" (mË–ÂBKÚìþh[¶@ J ­ø'"3sUY”P0Ðn‹(¦xÂ’–Bš8RŒ›Ô€i•IGJ™Ä‰ÞÏh¸öëê¡ÖÛ€ ÉGnNEf §)›•@# (PZRH)¤€Ôsâ0&¼)Øa£0òœ@Ø‘H”+$a‰i’ âB¥¯‚‘Û”I,+2AFVŒ•DȇUòl m ~Ù#¥Döb®©Zв|×F¥B‚HTßFaZì\Ë$H‰Æ°­ÌÖ®ÊJv­GÀôY•fUÝ*è Žx€ 9É‚h!H‰$RÓjéM‚Ah¡´¥-Q Ò²…Ô×zŠM‹ÿ‡ „àø¼’ýn‘Ï_-áKP™!š@ $©=Ÿ™uI?ÜB2³€BàÖj¼ûa6¦×ˆüŒÓ®±‚,ÿ#ÒLòÀ‡éðAV±æ5(ûá•Ëó—þ&iËeöÃÿ¥‰?üVñ‡ïóÈXR" )%Ó)6ÐB´3A(°PZ(Iñ\¦õ "4 l ¤ Öºë™K¢d~~ßÅó™Oýƒ‹Ö…çïþÂnïo4Q¼S7hBTÙOÒÃû?«{ý‹¦gç}7IÛ©í?wóÐ53ŸøH'Nê –gšÑ{þ¢ùÚ×-ª¸îÅë"Y;¶î¼ü%ß9räÜ’gÅÃS ¦„²¶ ¤-)‘ >W¯ùϺá§P)ŠÓlV…Aà[Ìѳ€qjjJ§Þs]—Ï ƒ¥¥%)åÌÌL©T²]‡ãåêÄ êL¹œ ]f9ÒõAåïœ!.õŽwÝÁhš£ý±V˜c$yž×Ùìzž÷È#|ñ‹_|Ýë^W­VÃ0ä €æî5™&4Š&»c\Õi”-$Ø" ©á€I÷5*&q¦&«Y³Ì˜ž°e±ó]-æÚÒnfZ„Ü·Ròhv2Y7gVó[¹nžé@á¤bVn~B€ ~z²r•çZ’ã¨ôænNl§®MK'>¬Æ#@Á˜í1¿›oÃøë[* SÅë&7U1ç¶SŸž„’?ÐŒßüÑ)¹iÊÏš±Ì~p§¸¿~tŠtl¥ V«ÝtÓM·ÞzûÅ—,8޳S”¹áåß~ðÑW\×¹í?¶æ¾Uv.!•ë®Æýcíõ¯ýv0¨~àc{^òb þB¥:HÂitO,.î}ésï^oïÞÑ‘åÒåÃh=«‘ÀØÌæ3¯­8˪&Êåò±cÇØ7taa¡Z­rºžÁ`°²²F£Z¯±õd©ÄS!!ûƒv:ÕÕÕõõõµµ5XÏN&Z9ô­V‹+á •J¥Ùl®­¬K)ï»ï¾¥¥¥n¸å‡ú`g"«&š1@÷0‡ÙÛÌØdÓ„¿>ñaeFI®9 «uÒú_M@Só:W‰Èl/µq²ÚÞð[[»ˆB:küv·F©x¡áÍäÉTæ_›ëTs£”ëQñ‹úŽýUwmLÉh|Ô\-¹¦êqËuVdµÚi4bë[Z.Œ,×é9*zÊ“)À$;ÃÒv}ÿ¡,&Ù€sûå{ÛÆï¶÷×, )+•Ê ¯{Á­Ÿüâ#GÀ¶*€‘Œ.8òè©W¼ü+Ÿú׫e D  ]„W¼¸\ùÔO€+Ÿ»$Á—îP•¤ §–÷¾ö§¿üÈу1t’rùÀp¸2!Þe,7ÉTõ¸M±öïߟ‚",..®®®r+Û¶gff8¥«”’³÷€@'³ø×É¿ˆ(‰G2*•Jq÷ûýZV8±.;äð·|ßO(f…Y§ÓiµZûöík6›SSSµÚJ·Û}ðÁ¯¾újà´¯šš›4Œ3–ÖÛiBi’Ë♣XÐSiÊ«Š„R§^0ö°ylÒ…ïh(H5ˆVfµuˆ7?¤‰5"j‘;d¡BrçHn·IèuŠò…¿Â~&¦Èz皣\9XÊÁ°É ˜*U,ðCEêoN¢yÓœ¦ÚiÊÌö˜Ú ó¯ÂÈG[„(¸q’|…ˆt·síÔ– ºZna¬@k1IÉÛa²1Ë“UˆD…H˜òf?ä¬÷£þ¯ÙÙÜ̸àäwXLÜÍzñ£ÃQ; @Eð¼k¯}ð;_Kˆ´ßQ®Xò;~|Yƒ{¾qà…W?ð7ÿ°ûŠó1Ž›lŒÄs_°â c%»ú`?Dû8!~ù•ß~ð›(Ñ5Uòf†Ãc–­bå`œê'²L…šÒ²À’?*„°fggÓÿ'J1èõÙ#èØ±cœÐã$XYá0*‹‡¾¥¢³R`f„Ðîžõz½Ûí²‹Q»ÝfßÐ4¯Q’$ëëëKKKanÞÁÌ’ãÛðñÄ˹åñZèG^­P TdYÒsœ$Š9ÓÕ¶ÏC{Л¹V©×^•P]]òŽ<ö­Š{Iu¶dcGB_@A÷žÿ,yÅ3¯¢J!|§bï§®Øäºëf?ú¹ù^x‡g?ÝVQ»ƒá@aè€G E œVL"‰ˆ–g;µre@†Â£R¥¼·Z©5깞ӹ§QĤäÜGý~ßó<è˜ÐP‘eY€EQ”„¹d{nìr(D™Ä!¦777=Ï+¹e[:”œJ"åÚ^)´»›³³³ÂB–B÷»ƒJ¥¢bÒk©¸+0“ǚȷ% Íñ¿"‹¤anN>HJ¦ÕVÅ­BDzÓ3.d—Ùü€]…°Òè¯)e×Ñs!Ó‡ª$‰$n“]QLˆ“¤½`O8(AQ¥ñr ÊÎ[&fxoò(R`έ "BJs†s†4r‘„-C0slÉÐj˜_á›ÚXé@Œ™Ï  ¦ß"ÌòÉj¥»):6’Ò ’@($“u`¶ ×OM›íÔ¼”!'¾Y -¾ãyÇ Ãpzzzee¥Õj Î>Ùjµúý>K}¤”œ|Ð4¾ã˜b£ÑH¢ˆ“¨V©÷z½r¹†¡%‘Täºîêêf­Ú´­R¿?¨ÕªíÎF¥R"Û G Äq vìˆÈÿ_÷wkëÁ›ÞüvK:n¥Üënx¶Gª´¼µµõJ¹Ǫ\öV×–gfaè7êe¶²tG)¡”"J’(vä|'ü_ä"„ØÜÜl4ˆØëõšÍæp8DHC ÔëõN§ãûþÜÜÜÊÊJ¥\›¸O·Éª·m™Èu+z=Œ±;â`Z¿›óž{ˤgÖÐ3,gZÿöêù-QÉDF¡ð¡|V†'·§ÛÕö_ÅĸTR²ºåénÐFaI¬'´šF§J—@Jâ” îF^5ßZúàß^zÝ‹–¬`Wâ‚ g+X·ê †­ruôÂëì¿ÿø¡·½¾"’=‚¨¥ÔqéÔU¨H& Ä € Œ¡t”I$ø®©$Ë«“·ã¸˜+ƒ®BÇ\ÔW3u "RDÄøYª¬”b­ÑhÄv[|˜ÖY*•Š)P5!S—ÇÝ0¹×·»Ø®}ß<¥iô5éµn^ŠÐrËÚÍÀf¡éòlÁÛàtöÕÄsÛižäÀàÇ} <µ iúB&rç ÌR°ˆÛ´ÀÂì8¦“V›gž`н¦q¡Œ¶~ÒÔ¯o7f Ú&nuuU)uûí·ßvÛmƒÁ`~~~Ïž=7ß|3[µ¸xþÁ§=rì$y(¥X__/W¼8V~8PQRX¶cY–k»®0‰“R®­­”<‡÷×C=ðô§?}4 :õJÕŸŸéÚÓÓ­µµ¥ùùyÛ¶———“$Ñ =Yåºîææ&ËÀYgT¯×Ëå2¬­­íÚµ }ßo4£ÑÈuÝÅÅE!D½^ßØØ¨×ëÉv¡4¿ë’[ZøŒjƒI¢é—ö2 }@Õ!$Û–pøþ<óW/{ñ.tUg´^õf¿ýpÅuÝ={…íˆ8†#ÿg^ÝšÞå½äùúÁ¼S¶„ƒuj@ÀATH\‘;À€ÅúZxÍ„†µÂÝn—)¦™¯—w,SO>h÷VJP)Åûf#ž IDATáY=ú±_“Êb!qÄ`Í1¢ëdJZsÛðe;b ãb/8.¢ÔhQ¶ ½bÜ·DWRn¹÷˜õO´–ÒOæÚ FÖ§æ°à¸ÏÄ!2ÛföÎ`óá8Y,Hê Íïòc*! ´š Bå›j°Im)ó3žÃæ0RÆê˜ãoþ.nŒ\Tâß¶í·¿ýíÍfóæ›o>xðà±cÇþäOþäÍo~ó{ÞóDt]w82[¹k×®ååevÕBp’Ê~¿Ï¹Fâ8®T*kkkœb²Ùl²»üÁƒç|çèCÍÆôúÚÆîÝ{ÃȯU§OÔgæìŠkƒùñpè'¶®’ þʯüÊúFØlMŸ\\®V«¤¢^·£bºì²+Ž?î8ŽW²ÚíuˆrÅÝl¯•J%Öõp¼NÕ5;;Ëñ ÙlÑÆÆïzöé¯T*I’T*"bÃÌ~¿ßl6ƒÇçÙØØ`Ö>Ù&[Ιsf± Û ›«Ð¼ÈUþãòC\pKÀ²½ ‰¡ðÀT]¾÷ý¼ø§ÀyÄñh¡Z²¿ñÍ[Þx2L¬¿þÜY{w­–á€íB7xèÙÏ=ë³ÿví˯ÿZoØXŸž»n}å;`ÍX,‚F °TUaxÿëÕhq hàÌ ½q3ó£:*²RÊu]3º>ÔòÁWƒ–îßëôÙ——Ã>#"g…«V« Lt€…{ü]vüÕ±|ùCðÝMH0é¬þoÀư¹Qv⑹مµõ•™™™~ÏÂÄV¢„ë”j׆ᨭ?qðüËîýæC»÷žÓÈqì’; £“'O:Ž…HÍVm4x%Û÷‡FÍ9ã$‹ \×µm›ƒ·ó)v×®]¥RéüóÏ?zô(û8@f=§”ZYY9ûì³¹_ì1Úí6 xŠŒ}¶›Üâ¾(ç‹”abå?.?”e z8µ ;&9Ôi5’÷tïKʵðA–¬Rï£Ãß|óÒ¿ÿ§ °øÊ—>ü™~ÙÙ3«Ð™­OGJ<çš•ÿõñg½þÆ#JN­¯„(l ˆ‘b€$K1’ú|æH«T*q GÞfŽãpz`$´rNJÉ©ô@+ÿ¸hmlbBÌgèápÈ™…|߯T*lеwïÞÑhĆЬW#Tý~_¿»?Ù˜å¸W5Élt"§\„^8-gnNÝȬ q\X ã\dÁC´|>wnSJ¡•7„6ÊMüÊÎÏ=“;ÿqÈlƒ~«ø¡âG͇um¦ø]ßÔêX³U)<›)˜-~+×È\S‹]Ë}QÖs&ŸØZ®ù•0 ¿ñop¶l¥ÔÔÔÔÒÒR«Õ:ûì³xà>&IòðozÓ›~øá?üÃ?Œ¢è¢‹.úõ_ÿõ™™Î6Öh4Ž9rçw~þóŸ_XXxÞóž÷¾#Û ƒw¼ão{ÛÛŽ=úáýu“JÄõ׿è%?õÒ¹ù¿ßI‚в-Ûu‰è±}çð]ÿÇh4öüÁþñòêz¹f¿ý–[nù[¾óð±Ïßö/I’\~ÅOüÜÏýì×îüÊg>óé ]yå•¿ü†7°_¾âÖ[oýÚ×¾Æé4®¿þú—¾ô¥¬èµ,«×ëÝ~ûíÿò/ÿÒét:týõ׿ÿýïßûÞ·´´tÑEÝÿýI’|àX__ï÷ûÏþóßþö·Apüøñz­¹Ãš|Âe;Œ4iÔ¯OdõŠk ,ˆþa/˜!.eÉz8xä#·^óœk7­ÄMápzqcý—o<õÀ`í̀zž7;;Ûï÷ÙCRYmMS­VÍÃÄqÌ®Jšær|J`é(¤ÂùkùdÌ)r9¤%eb^¾…wÞyç+_qc’$S3{Hš„u".’쉬q4ãÎWh ÙF*kzÓ>ËŒ…¨Û)„P*1¿»õ›Æl—Š}É¥IhÌΚ’ë`®§ANO¨Å Ÿvs @ªM6 ³#L 3zZìÙ¥òF%\ÌšrÌ}׬¹¸–Ð8‡ ét:ŸúÔ§:ôÌg>“=àmÛv]÷®»î:~üøUW]U«ÕlÛþêW¿zÏ=÷ìÝ»÷çþççææî¸ãß÷÷íÛǪÓ#GŽüéŸþ©mÛïz×»<ø¾÷½¯Ñh\yå•‹‹‹•JåžoÜ{øð}ûÜþçÛT]xá…óóó¼£_ö²—ÝxãçŸþûßÿ~˲öïßÏj¦»ï¾ûŸøÄÓŸþô›o¾9I’?ÿó?GÄ«¯¾z4­¯¯7›Í·¾õ­Ï{ÞóÞö¶·8pàöÛoøá‡÷íÛ×h4¶ñb€­¸¯Í?™wpû2ù»îpâÓ×ÛðvõŸNžX Ù[Û1§{rxÂ<)å 04<L5]ÞÎ;o»^ H"yŠÔ§ÿñÃ!ùñF J uÕMÿþ».¼ö'7f+»0 !ˆœv/¿á_¿þÍËb¼O)7 /D±¾¹Nÿô¿êÏ%{£dǨªO[Äþ½w‹ | „+ lôQ Pˆ/ÔkÑ¡ë_¬Í‰(3a»fɇ`NµËç úœZ©T<Ïs]×ó<ÎÚ«µ¼£Ñh4ñùU”99+ãkµZmµZSSSF£Z­2âv»]ÊaYÖ¾}ûÎ9çœÙÙYN‰ÈÙ÷­դB†£íÄ9Þur“m"Pñp–£Î˜…²â¼„æ_ÍÃ.?¬ŸÔµé ùIIÎ]Èzt.ºaÂ(8IN®2?àâ9{âàû;ñ™ÜW&®r³ æt!܆tnÊÌIÑ/‘{âŸpAs}9ÍwÌV™³E? sÞÅqÜn·Ù•Ž3Z>ú裾ï[–533³°°ððÃW*Öª.--]ýõûöí»êª«ÊåòW¾ò•R©´°°@DŸÿüçƒÁoþæoº®{Þyç]}õÕÿöoÿ¶¸¸Øjµˆhueý±ÇN¾á oسwמ½sÏzöåûÎÚuÇ—n«ÕËF¥Ùªºž5v77×i÷î]Ãáãä°õu¯×[ßX}Ýë^'drÞÁý]|ÞÇÿþcoý_B\zéå »ö>öØcƒÁ`yyÎ=÷ÜÝ»w{ž·wïÞË.»ìÔ©Sår9‚v»ýÙÏ~Vñæ7¿yffæŠ+®`“L˲Î;ï¼F£ñÞ÷¾·ÕjÝpà Žãx¬sí³oïõg˜ ©öÀòeW”U\×HÝÙ9Í› ÓaÛ¶çy:š“6ÖÂB–1žm²ÀY+wsËWf…Ó§nHÏÌÌpRaŽjE º‰hvvvß¾}333ÍfsffF©ywàÎM,&d>ά kÍÞ™Oj&ƒÑ×)èæ@Љ:z24ˆælŒ™šˆ¾»Y¼Gæt M*hê}Oï£T`hœÛ€qn ‡ÁP`··Cs·cV´MƒršZî;¸OMMI){½žëºËËËœ½˜EDO{ÚÓÊåòææ&<ãÏh·ÛëëëQõz½¯ýë—_~¹Rªßïû¾_«Õ×777“$±,÷ŠË¯ä˃AOHš›› Â´(Œ‚ÑhhY¢Ù¬×j•8‰Ö7Öxœ;oá…Ý»Î9çli¡eÃÂîÙ^¯}á…O zžWöGÁôôìÉ“'9ÛJEQ‡}¨J¥Ò‰'‘ó¬,--]|ñÅÝn·ßïÛ¶½gÏžJ¥†áÑ£GÇ9räÈyçÇÜF©TÚ³gO'NœPOu#ãµÈÌ!¹œQ%w÷aøG¦¤žHYÜ9 þõÓÇР¿¿Ú¯zÉ_û½S ¨G*µ N–ã¤î¸—>ü홟ºæ3=æ;9µ6õÿüb¥?º‚Ÿ&S(aDá0q×4X¶,ËbÿW)%›h*¥8K –À&#©ÏÄ9_Ñ‚øN„’KØDI¹ìY–eÛÒóß÷×ÖÖ|臎:½¶ãÙ¥ŠwÁ…ç7–ê>úh£ÖFI¤lÛÃ0VQ½^_ZZªT*¹QÌqL.Õ¸#,l/—X%@YÆÞT( $`KÌž$ Z(¤ ¥P!²æ´ftýDE‘%%H?xN‰kN MÏ "_A(¡R@,¬.&@ã¨]¤ ±JuÒ©=Ý L½¡r(hŠšÑ8˜Ã% iŽÌçMF!Çmà¤ãi:VŠ@ Ú¶ƒ†$@Á±ÍQÍ}2Y"«fsó®ÿªº¾ãì‰.ô»ü3¼Ø “ Êå28 Š˜nXc’}uÐíb¤(À˜3îaÎË|Ò¼¯”b‘5G3(•J,1èƒíAÀó¼™™ðÃDÄ¡Ø@ÌÜx4I/;q÷æýi.‚âþׯëL«oM_ŠmË‘ЪâI*U(Xl‚±7Äxô«\›5pš#­qÓ¡%'Úw_ŠÍ6Ûfîja_ÌQOÂs?—dÜ^¿»ó͉ëD]#:c<ðªÕjQ fUÙyo8ÆqÌZöbgäÇqÂ0ä#2;ÜK)}ßðÁßüæ7€ëºƒÁ€Á¬Z­ú¾?u¼ð}Ÿzd æîouauu•ˆšÍæÊÚzÇ›››ÓSSBÛ¶Â0dûäÑh433Ãa_{½ÞÔÔG¹ùÒ—¾tÇw¬®®öz½(Šöïßïû~¿ßo40uÇwïÞ}üøñG}”\«Õn¿ýö¯}ík+++ÍfSçh‰ãØr( /|¾¯y£IËjò¼ƒÙ4®†09ªëé¬IJ)8£’2lÿËËwI²x»EoÛ²â•b_BØOÃ5' P* £Ñ%ÿã§þŸß¹+Œ|€ÝìNýÁd!–3¥; ‚èëîoÿÂ+î÷D9í á<¯\ñ‡4£„ -áÄñPùmpj$BHŒ½€ˆV†Lí4‚ Ÿ©p¼0ÙFm¥ƺgA4¿åº.óS|tp]·\.3@†,¦c=ô‚¹¹¹É‡ nÇëЙfÜrÜúïf ™ÝÌÑ&õÙË s(L¶Z½È‚–èõIT»Ê¨ñ¹:u“ôoCÔ;>Æ0<œk Ž‹IÌöçä„Åé3)u±þí¾«kË]<îŸrckVËm`•õú¼MšÍf¹\^__oµZëëëApP‹Ç{,Žãf³É,­á¸­¬3f D¥”Â÷ý뮻zEÇžçmllH)=ÏB„aÈZ6DDÛ¶Yb,„iÜ*Íf³Ûïq u¢V«1+†!Úó¼$ËÆÝjµØ¯w4=ôÐCûØÇžõ¬gýÚ¯ýšmÛï}ï{9®Èââb§Óa 0333ÈÊÔÔÔÜÜóƒÁà%/yÉM7Ý$„‚ I6i·Û¹y1—Gnfw˜ÜÜ3ÅåaÎWqZÍ‹‰Ÿ(ޜؼïç²ÝÙnƒ›»&mnœ¿8•'6)Râ( J–“ Lâ˜ÂØF @€€$cÀ ‹0Š“9LÎl’½$„ô(„Tã-qOµ·,gºƒ –Û…¨Á4€OV_HàØV=JÚÊ:dÒ‹¡‘é ï.ÝgaxkhRÅȪÐVHl´¢U2ü”J.„a¨“Çaf–™Ýâ8fÒS9§ÚétX ÎðÏyÍíQ¤ÝEJj. ±Å´Ílrýb<ÒoñÍŽð‰Ç`:öuFÃ\Ye)ôúY,“ÏQ]YtOs°c„‰ŸÈ7û)ÝQŦê“nî¯Ì¸è·&2Û‘€"èê²IÍ=ÉצªÒÅ“q¼Y\ó‚C ß{ï½¼\Ã0ÜØØpçÑGm6›lEÕn·Ûív«Õbé(Š‰è‚ .à“%pª1–½×jµjµº¶¶K†ûý¾@!D¯× hà.Ý ‚ƒÁÔÌìòê*{ô²€£qdv»ÝžŸŸ üà÷îÝ{ÓM7)¥F£ÑîÝ»ïºë®Z­633ãºn·Ûm·Ûý~vvvee…s¨°á˜eY'Nœ€åååF£ÁkûèÑ£û÷ïŒFç "¢Ó_“'Ç1Ø\3zp SRL¨Ÿ eÿ>)æšÇíYÓ© ð ÿuœûîž#˱ƒ~Åñ\Û!ù£c¹®k‘t HBJJ‡!\´ cZ‡xÈœ˜FšT|úå¯4Œì‘±çµ}­ßvªm%, ý-מDÕðsä‘tÈ|„ˆˆk8ØAÛCmgÇQSY8Dd 1±I3WΙ€™©çøvlÌ¢“1ôû})e£Ñà˜;BÏóXRmò¿©2Õ06¯u“&–ÓYæÞžÈ£a=«‹¶ÖÉ}.w¡Í¸r6Y¹bö1×Ye›wLaâý'¶”OsÄ&ZÇèaÔí)on¨Íf›_É=i~Z×IÛHÂÁõÜJÐ׿¹ðÊ4Õç\.»ì²Z­vß}÷ÅqÌ6ƒ‡Ž¢èСCžçq`ŠJ¥bÛvŒÓ>øàìì¬Rê‘G±mûª«®úâ¿(¥lµZ¬‚1fMMMéجdµm{zzz»ÕËÞƒRÊÁ`ÀöÌK•x"†Ã!û.{ž·¼¼¼¶¶–eq§¦¦Ž9ÂѸ„Íf3Š¢••¥ÔÞ½{;HOMMEQÔív÷îÝ{âÄ Žÿ,„`~âÀ£ }‹3«0·àŸðz+^o÷äÄ2ñÝ H.ޤ(„æŠIB‹ÿ5û¯‡'e^TÙ…Rm×iN·‚ + ƒ Je ð|‚rµ'ËÂ*WÊØÖ¹@e€0ý¡ÈòF#§t`:Š€¡í†`)€’m/û8@GXe»$]û/î>·¦ ~Ž6¦I|);ü±ìË<®1ú²ž8 ÃÁ`0‡Ã!•è ZƒËj!f¢GYѦÙ+‰CTr¬év»½ººzâĉv»Íòg˲´!X®U&±ÖßåO«Ç³ŽžX¶{%‡^&Òl·±uÛL¢?±r½sDç$§YÏÁ°É寑>×þ33-ÅqÈY‰'´Û¡onü‹}ÙšëqüˆP³ÚÜ0ª,^&"*¥Øµ÷]ïz×7¿ùÍ8Žï»ï¾¿üË¿œ™™yÙË^&¥ä$ž¬1ÙØØð}ÿþèñ—~é—*•Êôô´eYW]uU©TzÏ{Þsøða/..òä²€:Š¢(ŠØ€7ÝÈ8VæšÍ^Cüѹ¹¹n·Ë¯°T‰ÅÚëëëlÏáû>ï÷z½~èС|ðÁŒ¢èCúP«Õêv»³³³ì¡pÝu×mnnÞvÛm‹‹‹wß}÷p8ä1›Þô¦n·ûîw¿ûþûžž™™ùÆ7¾Á-É fn`s÷¸ë*×Y9rõçþ4]&B/ìài¶çû§ä–ýCºÃøIº³‰Ï×›fPfAªEÐ%·¬áÄu]ö5ò}?ŠÒ„ÁAè?€ŽˆI®Ï÷ýžêsl<ÈNN¬QCÖdÒh6ÓBEaxêHywXæžTCM Àd ,ô ƒ®VGÕ  ýè-Ø ~Efm;`¹¾&­ ò9}ªwšÅìÎDàÏQ@Í4€‹æÃ;ì·‰Òô¼3ñ]4¤ úù$‹h–{‹Õ1z–uXÖv»}Ë-·ÜvÛmùÈGþøÿxÏž=W^yå«^õ*öGb¶r}}ýá‡>uêÔòòò\ðš×¼æŠ+®XZZb óÙgŸý»¿û»ÿ‰ðƒùÉOv»]!D­V»é¦›Ö×׿üå/á _xö³Ÿ}èСN§ƒˆÓÓÓ½^Ïó¼w¾ó·Þzë>ðßû½ß«T*W^y峞õ¬¹¹¹QLœ/sб``±C¡qÌ0gÓ¼æ¬_8®ÔÀqÑtnyà6ˆ’kên¹9>¹Qøü“N@NçDù>[TZ¥†ïG`Ù BÉ—]¼ç¾NÞw« g" Ò>‚$ –]…ÃpÐH!“² – Ú}Ê‚E`¼•ÂÁ^§hi €P©¯dÛnÜëœÄDÈ8 ·7 ¾ ððÁK÷Ÿ}îs´‹ ¬qãÇþö£­V+öI¸îºë†Ã!"²0/Â0TYà¡ÍÍMMmõ)ˆJn™©€eYì’EÑh4²mÉ2dö¡¬ÕjóÖ+—Øö’ˆúýþp8 ‚À÷}J Žã›o¾ù¯þê¯ÅK¥›•RA¸ FBuÈ8 v Éá¾VÛÆšSqÂL  Ÿ8sõðÁN[A«ñ¬ &A7Ùm5žÙwë7n¥øÝZm*&g5¸6í’_¦"ý; !eõÀV7szh]fÔ¸!˜ÈÂFšÜŒÉâ(¥tÎ>™%dԵѸ@¯Ý);#b6dæ:Ž«Ûsm3ÏÍÏ ~XK~LêŸÓµëáäHm"s|çµÁ"\ÖÈú¾???¿²²R¯×Yr‹ˆÌ\¾õ­o}Æ3žñêW¿š­ ùÈòýqj¿( ƒÁÜܰΘAw4ðÇQ†™ŸbÇ!„8R¶í’Š1‰] ÍM´Ý0޼j%VDˆží¾ï8NüuR©ÄY"xCñ©ºÑhðY™·-S„J¥ÂÆØìtÄ)ž8NÖïüÎïp¬ÍV«¥”bënŽ===Í‘¼’q˜4W¨ÞwhxÌõ|:Ш7¬ù¬,¦zn·štÀ|%¦Ø\ØÅ½œ+§ <¹V~=g l´Í8oW*DŽÓû47ž|±’ž¯3mçi²Ö¸ ]Ï>ôÜEÖÊ,I8,•šÃaPªU†qûÙßûï¹ó®o}ä]¿ê¹^Ap ð\ jh?ÅP]ˆ‚"5P0DH¤.n1 ¨ô¿4 °Y®*ß÷U\H$T€ã \ pŸ]ÞŒ†Ÿ¨”G7½å†s/~} —øp«2·Fß÷•R–%¤ŠKH$pmGúç¹"bWvÙßQQ‹k¥Rɲ¬j½’ú†ƒÑQŠX%DÆ"º®Ëã(¥d㬠ÖÖÖlת×ëÝn—({•ÕÕUÇK£t1[ ”btŒ ÍÔ$QDŠã0ŽQæ€!°q±^v„챃–ˆŠˆHÆãøçB€ˆB¤g#MÔ5±&#sƒ0â9óIÑ(!…%-j™™X ZÌn"™0\z¸J)aü‰ßQJ¡Ì€t{·²6[ª1D’‘‚„” ÄV^#$"Nó›~(ÍȘnÌ|pY¢®ñXŽQ£Oe IDAT;RëàJesH©ŸT†]›ÈÌuáO˜äFƒÎЩù•¹üjÆ…²ÌģшkæXår™Yð†aȘº¹¹Ùl69ó.ó²J)¶à@Zˆ¢V©£PQ«Ôã0©W¡éï2ÅÔ¢‚€+’tE!)Ûµ“8´ -²T ‘Ð’VBI )}T–,‚æ±Q´ÊÜ”€aX¼B$q BŒ‚@ZÖý>xÁp@ž{î¹çøñãozÓ›8d‡”r4Ia—¼ $1¹N©ßÖª HÈ$Ü&¹Lô|™¼Tî"÷€9ËæEn€ÂIØI朖|ØÁÔLQ(Ro^ "A1ÅæWvØ&ä`~4Í„SEä8³#¬IÓ²š¿†bÃrÂ] ´d”ÜG_瀹ؘܧsdPï_=z¹W“Ä;õÔ©(Š«®¶7fæªÎT¿]|Å?÷¿ñsÿxGûèÿDØ»«~i§ëÀ³a’G-âc36¿@Ò{ì³€¸è:_DÁFõœéë^üª… Ÿ©ÜnÄcFŽãPœ„ahIÆ‘¥ålæùÆ0ð 0•‘Yf$!k›8ÅgäàDĀʀÍð£¥y¦ÁcëzYNDçž{n|>žjN³¡)û³jJíXSp†LE[²h¦¶yig!V³¹t÷Ñx€ï¨q"“Y6‘UKDs9FÛü´((¶õf“LýXuý!ó£fóÌ…›ÃíWŽÌfÉQ¢¬%[ýEƒ×fQáv•€±üÌ–O¤È9.As9 å¥kº±Áø”+?ýAÐ5t:Z­ÇñÊÊ ÃZ[[›ššâÝ1±ò"5)ÎÈi6ã»/ ®ºåwÝu×g?ûÙGyÄsœË/¿ü/xÁÓŸþtNÁ‚3­?×5|j"§Y¶ÃN€4øpn#œ¶ý(”Óœ¯ÓdôÞ9Åp¦S „ úU¯\«ÕVWWƒ p§=]õœŸÞ·ç’ÿøò—îüòKo€èà(ˆ q·©i›ôš>ˆÎ‚0´¦äYç]xù3ŸqÑ%—”ËõÁÈRh Ã,}@dK(ú aÞ±m»ÕjiZ6 |ß÷}Ÿí­ˆˆÅ×®ëV*m·Å²hmœŽù’qMW<ÏCÄééén·;??ÏÕÚ¶ÆAœ¸aBÊTi'@YÀSwK†Äuë˜Ïq„fW0Öœ·pÖî dˆÔi #5j9v\M6EëìæFü “r%F–bþ´æoLÄÒ+Û„·ôºò"÷ðD0ÐEŽß1®Á¬µÝ~qüÄZó¢øuÝìB&ëÓ-Ð:?FÊééi}²´,k4±»EŽ~±£/0»ëX}d±˜¦’¥Risss~~žåÞÃ~O·›ë×:BÈ55’ˆ(sÕ¡ìØªÁ)­dLZ¼5£¹E¦7*­†Ò­A§Ë[€šm`'Ð\´–Ô\pf×Ô¸ ·~@_hõ3ŒGÓ_TãVc[“2o°õÊX¿¶[X…M˜CÊÜŸLÖÓÍ`Ž›®<‡sú¦ÙóaÝqÝaX\›Ïç`u¼‘ù’ëìv¥X ¯v!ÄÆÆF³Ùd‹è‰ 3aĺѕ Áý˜ljâÊ}2‹¼#„àX"Ü£õõuÖ U*•$IŒ·«$‡[;cð“Øøíj+¶”Æ™?0Öä‚VÏ?…ãþ„JqÓMüï“[žÄqÈUuúìŽù mn¦D•ËeÔô»ÃQ«Õ “ØqËÁî¨/”]®ì›-ô±%KõÚT{t ¼;XÛ0šÃAÞ1‹’««ýnÊ®95Û¶•JF£Í"}cZm™[ˆ8ôc†„ÀáôrÊÍY!œ¬ð}Acš}Oi¯_Ì4y–eéœK,‚f,áã/°3F©TšŸŸ¿ÿþûÆúúºy‚$ô‡ˆ0I5©.6IÅàJmQ^¾Há Áìïãη>éªq¥il„¢4'LÊT¬×‡&¸P€^sÊM£!ß`&:âx1›Z|&aIÖè ¸x,Óã “¾EãæÖú7ŒõWßGÚ+ý f ×͛Û$/º³¹eúEaå´ ¹AþNä\©×ëÀfÆìÎ.¥d=q±ý¹a1?7ÑXfœoyJ K\´(‹ˆ’$±,«Q«q¦NƒçyµZÍ…;ÔV68Cç™–í÷²¾Ÿ_À™SMßócú™–ܾƒ§@a±‘™Ø’Ü+;ÐXsä'²;æÈ›¿wn†.q{ŽE‘íº_þ—Û¦çf£(ŠcÏó*R"`Øwì(ôWOn>PkÖ`E“Ö®Ùï‡ñŒ]rìpHhº–%P$a‚]Ùê Ñ~‹¡Z’©¥`f¼Ô/sø*ÌŒ=ÏcáŸÌ´Ù0fGj×uµÙ°VúòË,—‡¨dø‰ã¸Õj=÷¹ÏýÐ_}øÚk¯EDV­ )rRåt°mßËÕ¦¤$ŽS£ù–BÓÁÜRÐ B‹éµ.y»•­ßÊ 3MÀΙ¯›bje8Séí„™ ²- d˜D²ÇÚ–}ͤ8¹ÅmöÄrÕŽAY¾FÜŸ€¬@c ª{§2÷­Ün×/--È= Í©hûÖ½âö¦B4´Ü"É.J)ŽÍú¶T:uêG¿Ê­1=›¹QÍýÎátzž,ëõz: ©æ‡„NG‹©J¥›eµÛmÏ-?n9ú[\'ßËB†d«ˆX¹ 2ßúÞ7õ4ËÒ+&”žfcΈà>¦|™¤5ƒ3ï,Ó„ˆîø÷/=ýÊCRʘ F‰­@P¨F‚b¯d—ë²Ñjt6«çÚ¶Zë·±íXÝX#L¢A…0U™™jT«Þzg¸Õeƒ¥FX°Né—RÚ!X‹a•R ÏÀñiÙöÊL ÄnÇaßÿÔ@×»1ae-KÛ¶-Ëb7$!Äh4ºúê«?ñ÷Ÿ¼÷Þ{/¿ôŠ©©)""T9WúÅ­ä9JÁ*X)¥RùœðLµ ó¢0]ÛFfT0H¡&µ9EÃ98 B?ΚÔÖ|Ë„ 'æŠÔ_19Žd¢gJöÕ[<þV®`•Ó¤†D”;@lU’)&q\ˆªxlQe1M\1§ »~ ’LsÄrëƉæD žØkó¿¹AÛf@¶.ˆ(IΆÄ+YáºnµZå< fÑkÉœ 2ÊvÏó$ ¡RJ‰3ó Ù¶pú&Ž[§‡CijHîv»DÔl6›Íæv'à"ž™Ôìã“‹ÛÕ¶º¨ÚHk˜OnSŸ”’[Åûß}ý¹ñÁE†4Îï>. k*jÚçRAÒ6ñC§Ó~ ˜ò}ÿ+_¿SÚö¹ç'„€„šu7ŒvÙ®F‘vGÉJ©ê8`¬RÈVrO6¶²ìxâýù™Æòòâ éUj¥]s³Õj-…'k—îLè°K–fØuĬ„¶Ä¡&p2LòM–'s´wFkH’¤Z­r.r¶0LyùèÌì6îB ‡Ã©©©o¼ñøÀÓοpcc£Ñh„qãGn^ I6y „Hsi5¦Í„Ÿâú0qAÏýpBù\x”r¹ŠK“&ý0GUý.Ï_†XH®'„ØÎŸµØåí¶îã¢ÎÎ…ÆU˜æîÊUh6@ƒPnRÈ!ä>š—2¾e>“ŸJ04`ÌõwÓßÜ»QU«Õv»Í›*Žã~¿ïd©r „ŸÛÌ÷¬0újeóÁJ©jµÊ9”jµ'<æ[RLÁq)v0ºú¿ßãnš…Æ¹Æâ_áûû\,ß?ãyšÏ #’œù6Üá[a [´»ÿýwûÌ«¯››ëø + 1JúBˆz]¢Š($!oÕ±Ã" œÌáªd20÷K~°ª¨ùŽUŸ›Ä+º³Ú_TJ)_ýÚW x¥Rgíß¿±¹á•®éÔ€FaœDÒ–- ”"…%x¬fÓA6ÂBxÎ?Á!…AeKǵ»½®ã:ƒá)iY‰RŠ”’›ˆ–mP¢EdÙ–í8(3+GQhÛ»Ò!‚in<°Ž@‹pµRXY@ ¥–¤$Ž“(’B +"ÿ] a;çA "MðÉn—ì®ËM“(N¢0 IZ2ŠCEI¥Z ûÒ’Š’(ޤ%…D%¤B?Q X¶DŠ`Ù–¢‰ÓŠ¢•¨²!EÊõØô¥°„á4 £Ã‰Œ´FYŒ6ã×F‹”Ù'êô!I˜Rt^!¨£|SÌCF P÷+Œ!QZÂqmiIȶòÑŒ¶’®#!„ª3”!¶K~â» ª«eÕ›o·ºÓT¥S>… *…“J€ø TÓB”„–k£%b¥)m›y[@´‡¥¤e¡Ò²%! Aˆ„BiŠ€!@ε­H% Hä€"ÝwD Ï"(•(•È´í„ €þM*¶\ )„”Ò’BÊôH HR@öCx1¥@‘…”/fB„ôwöJT @R  ( !‘íQ°ù„Á+ó"aÞÑrùR¤…@a¡¤Þ ¹”B)Ê\çQœ$BŠ4AîøOÌ£ÌNþÜ$æ/Ó-Æ{R‚"JXRH:,ðýÄvl¾DiI!ÿWZV6yÄ»5ýtêU”èŸ0û"ò”s=(tcÒÅL RE”À¬³)M…æ~é<Ó 2’ˆUÙ–e[!€%¥%%Tlëî{ïýË~Ô›™»æ†—8µÖÆF·VihIB€@ÄkBX<§BòÒÒ?¨@ÿ¦Éã S ”@B$I†£Dã9ÿ?{okKrÖ ~_DdæÙÏ=w¿ïÞû¶ªrUy¡Ê´7M4¨5ÇB3 ÒȘMüƒ„@pÆ„ÔÆƒ%„F¬–LY „dž mO··Â¼”Û¸êÕÛワýœÌŒˆoþø2âÄYî«Wåjèž!t]>/OžÈÈX¾ýû}ÍR\­Uêq$Ò¬—ÈX’(E¥<Í뵆ΠÓã"£—ˆ¹pewÁå=‘Acš›¦9SmŽGc"ÎoçSBy¢¸ö*;Õ˜+F#þJk-Q0à {å¹7DÌó‚#Rà­äð7~)km¯×cÔ”J¥’¦#~¯ñxLDùäöö6cõñ«ú2OâyJIR©TXk÷9µL)%£iŸ4“TBD‘RìÕ“Rr 9μªV«£ÑÈË+äªV0Ï` ÃÃ+@œÄ¡«ƒŸÂ^C¯qe6X0¼H¼<{D”$eïZÕ,öáñKy,Ãáp(%*¥xù¬Bb8'ØÅœ˜ÇéI¿¯¨áΑö<Ïo5æ…^¬ÁÀMÎUœ¥+MÏÐZ#Nò§Yôa®Ó9÷ËÄ›„óÂý˜Eñ"¦iš$I¶Ná‰å­å õ|…™:8HHcL£ÑÈÓùȯKÜ?y=˜ŸÅAÂÞ ë-á$øÉá'¢nó §”b— º2 3^ï/OTihÁj=B;Ö6OkÑòñðDu¼YêÄIDJ)ƒz ¢T(…†‚Ì Ü¿ÀóPB°Í&B$HÊ$Û04R„׉,å–÷Šçaää~ª@BAó†HÀ,˜$‹yóÄ®’”ý<{ˆ4Yk-QV“­*F´çÖ3¯vb‰ª‚‘2¡µ¶DÞä>!ÇD÷ïßû›¿ù›/ùË‚ï|ûÛ7vwON“j­ÅÝn[-žûµyëߎ¹ÉÓØ»ZHuˆ%UÔçÕ("±ˆH‚Ó2æÉRJöÂú½äƱdzÄZš ʕӴN6»Ý.Sù8޹Ðo¹\æ÷aþÄЫ°Þi:}Wš¦Nç±ÇûÝßýÝ¿þø_=ÿüóÏ<óÌáá!k ¬Õ±Ò้Å5M™#òðúý¾Öš£c㞉»”2çKKKÌÑ™p¡\.³|xxHDårY»Æß”RµZ ÎÎκÝ6+IìdV½´´T)UýŽc¥–)2F#_!KÛœ'°\.óË2Çòé=\´Ž Óé„\‡3FŒ)4|6òHØ ɘk>²çœ*É@(^jó9ÇZgì2`ó,ÅòÔ×­šèľȼµÖK$Ö—âçjZZkË5kYV«V«ìtì÷û‡‡‡ý~¿˜F®p2F#®‚ÇK69í§ÑhÔj5!c6 ‡C>ŸËËˣш¯óü4 ‰ŠE0ççåcá’E1aZæNÀ‰I’0n9c)3ë%¢jµZ«Õ¸O–³,¥Cë’Ôù•Ù´ã#*xòó<çû«J¥µå¦ÀZÝf#ÐÉj:«ÿÏgS€ç¾éµ‘Ðå^Ò«5t§nZ$Iù¨¨0ãŒê…!P !rú=‰¶1E¼7N…A)öÇÙOAî%9Ëb1[° ‰<‘òv€ Ñ ÔãßémK…ô¯¤ŸÏÐ;vtZؤTJÙifÌS­µfèVž‘ç?ÏóÕ<-FÄΧ‰Â0,RBØÓ$Ý™‘\LÐIÌNòO.Ò˜3kø cŒÉµ1FBA=¼Epš}.ȧg;œ£9…·¢_>”›³ÖF¥ 4`;AŒb‚zèxz¹?QƼ/W.bÀøì« "F¢Xw` <Ö9'Ú° ßl6wvv6¹þº«^{ôzªó³^'Š¢,˲ñp}um4ÎŽÿ¢6#R„_ù)B's³mò#L‡ùíç­hÀiHäìœQu»]­5W1©€(Š˜®U*2….nG"2T$ y‡®1†«“rn³p¦×À(•”;,„PkYgþ±²²R.•Ûö;ßùNp¶V¯ç%I¹|˜‡ÃáéééÙÙÙp8|ä±ëQ}ík_»sçÎ`08???::ºuëÖ`0ØÝÝ}òÉ'www•RL(…O>þZN;†@󈢨\­$I²¿¿rrò™Ï|†“’­µ­V«R©¬­­U*•J¥rùòe)å7¾úÕ¯ðG£ÑþþþùùùêêêõëןzÃÓÛjµ–––ˆ¨Óéôz=kíþþ>+ýQ±¡¸V«Ý½‡£x–——yNØ$Ûh,1u¨×ë—.]º|ùòòòrE/¼ðK?ívûÞ½{‡‡‡išFQtzz|ttÄ•0._¾üè£2§\^ZaÁ‚M|€YE(>»˜7f³©”êv»÷ïß¿ÿþùù9-h6›«««+++Ì5 .%¾Ø3ïþçxœqÉ >xÝn÷Æ/¼ðÂßþíç”RW®\ÙÞÞ¾råÊ“O>yéÒ¥¯~õ«ŒE\«Õ¶··/]ºÄ‹þì³ÏÞ»w§h8îïï !677ßö¶·]¾|™Ajµš”òþýû‡‡‡KKKggg·nݤÇñîöå8ŽÆÚÚÚòòr­Vca±V«…ôˆœÁ†—Œ‹‹t:~¿Ï[±^¯///¯­­I)oß¾}zzªµ^[[ÛÜÜÜÞÞ®T*ãñ˜ nžœœŒ³cG !šÍæúúúÆÆF³Ùä32ƒA¯×;;;;==íõzH°üšÇß°¹±¾Ý¤s´ØHÏ¿Vûñÿeìÿù“?Ý)5:•ƒæ¡Š«ÍT ¢F)^HJ¬ í„d‘pÄ\PŠˆ—ŒAE¼=ÍóN!c¦Ü [Ñ´ÖÇ£sÔ$Çç†ýbÞØóÂ-MÓažÚsÛkü’"O¼¼ªˆ1Z–W8|„×Ek ²0±Ðï::sh73f–Ëå2©eŸÂsž¦i–ç¡«‹©Ùp8ìv™ôgJ%/2r+JÑŒ†£Ñ(Ë8c³€7(Å 8꼇ø[c ¢nµZ¼!šÍæx<>;?«T*ÞYË›ÆÿÐS •íU·¥¥%¯¡j­»Ý®µöììŒÑ4½ ×Ç=yÇÛÃY¥öÆdíÐí™S²äÅ\ŠMÄZëf³éo`] à|ö³Ÿåš9L¦9—cgg‡w*{”YáÓZ/--Å¥¨ßï'I²´´´¿¿ÏxÜ-ˆÐ9•yÛ½å-oFN‡5ûr¹<ˆ(ÏÓ££#$"Ž2¦¥R‰¹"²¶Ê±è¼›6Ë2&МóͶk¦M,îñ|2Dë¥J™W¥itîp¥â<ϹÊÞêêj±Ägg\/·/ LN§ÑhŒÇãÓÓÓƒƒ®jÐëõ”Rívûôô´ÝnóÁãÈ|¦˜BˆV«•$ÉÊÊÊÚÚšRŠÐf³Y¯×¹ÿ~¿Ï³”¦éÍ›7YLLÓ” ±„ÄÜ…Õ_f3L‰ØgϺ/¿TÇÕjuccƒ9·×í”RI’,//7 öSø}ÅÚ3ÆûeXfç4¹B¿ÇÇÇGGG½^O’[›´Ò2 i¬ 3ÔÃÕn•ì(ç§ Ï!ϲі¨çeÌd¦hbnsT ×d-ÃñB@á´C4hA R¥’B%‰¬T2)¥”QXk3­3fÀ•#L@ ¥BeÑfd5ËÙ:x:P¹bÉÆãf‚®6}mRmŒT$&ðvž£5ìJ,& ²5Êm"¤D©HEÖÚÌØŒ ßëó6‹¢(ÖÆâlÔçË,àÆq\ª))@…8æãñxœåQ%¹Žãœ~8ê÷6ðJ¶bhL$ga’µ@ˆVˆ\©☠‚¤„ R."çBL—óSòѰ±µ='[Û·fœçÅ)“JhKÆyâ`£÷Ç IDAT¹'?·6)•”2'ˆ#¶ˆJe…H¥"©%­MšflSô»¨´397ÒëÙJH”J©UÔÕFJIcÀQáò@<î5L؇£ñ`œŽÇ©N„ÖFçÚ#¤¤0"æ¹2¶„BÇÖF(Qh”˜öéy’$I¥†ˆã4͇c¦çGGµZM›ììô´\.7›MÒf8ÅñE˜Ï‹ÛE° p ÂoÉ5˜ö…ˆ8¶¾©R"uŽÖ’ÖŠÙÒééé$Á@Jfiš²‚˜$Éêêê¥K—Z­V«¹ÌêN½^®VPnÙyÉâ*Sa¦q^+ç]ëÍb¦7A E,Ãòy(—ÊåR†ƒA¥Ráþ¹N‹WgggÖùƒ£(*—ËÕj•I½^oµZ½^o<÷z=¶ò ¹†KÐ¥R©Ñh,--Õj5®×æm2ÖZvÊz±šk¤³">ÒàìÕ<E¢äxÌ$ûìììððPbá®ît:÷ïß___ê©§yä‘<ϯ\¹Òjµ´Öq³œX*• iïFÝÛÛk·Û\“®\®Ï*£ç3£¢èôô´Ûí*¥êõúåË—™It»m#È¥ôúý¾¢œT<f:¿`¥Rá®xsš¦ý~?Š$k¼¬µZ Ööz=ž¯£0abõ˜ñó¤ñd¬¨f³Éºx’$;;;/¾ø›Óy¶Y®Fggg'''§§§ççç¬að[0;d=óþíím^Gž™ÍÍMÞ¢—.]b‰ž·úññ±¯˜™Ž2Þ“Ãá5ò^¯Ç»eii‰ ò¼î¼sXæ ù\­V›Íæòòr³Ùd1Ÿ£ ^¯³>-„`; S±R©Ôl6-î°R©°IÀcƱ éÕ_v£l”–A‚ *¥Žé òŠõ2é ÀÔKS‘²•F±*剨ÇdíùËËšˆZk«9ð(ÊkŠ–r)HHD$T¢’JR©5–ÀYª¬É]x³@$)QJlQÄX™ldŒ±ynCÈR"b¹,³,Óš„ȤŒ“¤B$â8ÇÖZ®¡ä£xÑBÆa´…·¨·ÉôL”ýJ,¢Û”’‘ÒCÖjmóÜCBZ El–â,&›[j$¬& #„¤D5 ýöVJñC Vn(¥JI)QI$ ‘ %HI©„#¶+¢BÉ ô[Ž“yd¡9]P ÀZƒR ¡l¤ŒM!²aÉ€Ÿ4°Ïþ(&ÍÖ‹ÈUåɲÌ2ÚêÜXCe¤&¡QóMq"r^L–ædH Aˆ$㨠@2KM¿wAlÖÚZ!D,À*¡¤Bƒ9_VHQ¢1VçÆF¤"¡T€ëq2òaš$ÉRµa­ ½³Îòò2#±×+ÕN§CÚ4KB]Xnò¢FsŽ^Ýó¾Ð´€.4ÄÛW bÚm3kR£s²d›šûý~§Óav+¥d Òëõ:«Y•Jeee¥Õj­­¬ïìì<ñÄW®\aÌÏކÌYñœ•ûô:¢p̃Á V«1䬷!ó ´ÛíÕÕÕZ­6-YÂXÃŽj¾‡yù`0`î˳À (SÏ~¿/#ÁêÇòxÉšõª~¿ÏüÌK²¬”ð`˜ÚZçÊbÒÉÏUJ1ÇÙ·Í1>I’¬¯¯¯¯¯W«UÆÞÝÝ-—Ëív{вÆÃóÉÌ•yÃúúz³Ù$ç]n·ÛÖZK.!ÇŒ¼Ýnk­ëõºŒó¥`82b6[Š¼ÙŸ/D³ÙdÌÌ R©0—Õ™aÛ° ™!m5¡m ÀŽF#æL¬rŒ“$^qnìe'º 5„¬³˜ÅvÖeùMYÀªT*¦'¥dÛò½{÷^xáv‹,//_¹r…§”ÞØè­”jµZkkk<òÈææ&¯/=KWœÃÊ"×ÁÁKTišî¿ ûþÈñ~ãþp‡„‡­mìM÷~2Þllnõå !.c‰‡ƒ¼ ·\.×ëu.ŒeY§Ó9:::<îv»lçG°pPZZ»^_>hF;'ê õÑÕRå?uuó¿äújÿð¹ïl´¾ïÖj'ÉH÷F©®¥4.Œ¥BrÆ#"´Q"Q’Öøl,—@ˆ’‚ fÚÄq•0. Yƒ(HÖæ¹9 IÄR) Ä¢6‡éÄ#BAˆBãÆKÁ•¶ípˆZÇdK#²ã<£ñÈh“L‚-Ù"q€Ð‚‹ÁBø¤a‘DQ¤’DHe³™'Ë2;Î$kÖq’Ä‚ˆ„±:2F)ER Ä ‘²@£Q¦‹BÏƒÑæ±Ô騂•B) ’21% ÑÛÜ¢ÍEfL6²<H@Œ*:zlA‡am,­5cm@¡¤hu ”'yÊo¬ŠkÀ˜k­µIS›ÑŽ%d–¬Ñ 2-­åˆa`ÉH šB/!*Y° '‰&ÍÚŒ'IÌÖÚ¼? ¢˜(RH’#+-Y#.ð‰&å`Ð`´T1p®‘ÉÉæˆ8ž/ìGd Ü´»¼“ŽF`ÉæI’D¥ʹɵ¢$c¡´µçã®hTÎF}ÈíæÖæÑщŒ’zké¼×©•9 ’PLDkmIE+ÀÞUŽÿRfãIöGÈt)ϘX—šÈãÞ Ï&ÆÑh̦)%3`/Üí¶¹·8Žñ‡~äóëÖÜ/±¡B“®8O ëy¬1¯¬¬´Ûmö¾#ç§q'.À¶v s\­V³Ö¾øâ‹Ý~g4@«<Óq±R)U£(âÂé$IZ­‡,°öÌæöð•ËeÞØ£À‡Ê: tta<±ÆmsÞÌP©T¸ÖÂh4‹þfïtŒ¢ˆ××ZKÆ‘Ä""AÛ‰Z¬ ”òÂÞc]cÞÌó?ÎFlÌð̃»c³U*êx¹º^;ÕÏ]ÒM‘>õ«þöM¯9l.­Þ—êåÓ*åíA‹j=ê£s ø ¤«Ÿ=ís¥iS§wEqÉ[­˜B9eˆüžÁ %Ú6!!P²"QDø¸âÂ|ç=C5|êêĆÊîs,˜ysúÉäØ&ÞØì.E€Xä_ -¹0lhSÄ.™)uÍ3$ ÂmÂ!‘BoãgéV!"Ê)+e8Õ/«i³˜'qmîŘ²>54–†ûÁÂ$Æol"â®p]øŸ½ÊÅŒÙg-ÍýðßöE¶›t‰|¼ƃ!›îÆy–Ýl6¯^»¶»»»qýêRsùüü¼Óï_¹zýüüü¬ÝÝÙÙ§}>z~*ŠÉÒ†…ƒÎ®04ççV€õ/ÞQœÞÙëõ|F†w_fYf°(øË”™DZâ_r­¬¬4›Íµ•Õ¥¥¥8Ž;ÎÉÉÉÑÑÑíÛ·ïÞ½›­µæ° ƒƒƒ»wïîíííììÜzñææææÆÆ“9¦JŽÇälfFëõ-fÕLï€M¦J©óóóåååÕÕUÉþÔ§>õ;¿ó;•Jå±ÇûþïÿþË—/³÷މš§bS¶x¦¼|Ÿ/BB«]f*3^K žD”XŠÓ´3À‚K5.îÑZ›é .„pži)ešgüs¯¾s‡•JIIx>ª lÂÍv ïOe×5ä.K˜¶&øÅyAÙÊ­ƒ¢,ý0…ò›ÏÏž‚YµtPÂEÉÊ"‰¨ÈôðSmü†æ™Dg¿õÁb>í'Žc,2D‹’Y&È2gã?[Ô ˲óóó¤»*†Ã!£‰õû}Œx$ü[éòn'67‡áB<Ö¤ùäx#0:ç 7”E"¸¿“»bË„§þž.UÄ=r=Jt5'²”‚(_p.U˜ã:DÄÈw~$EçBØæÒÆXŸd½F²ÔêÐ×›š¶Ô#_¹7*ɃV=éD«}q¾ªÚqVíšV´ÒždL˜ÀÑøE„ ¶ÈÏC±7‚ŲØ ]öMHí$!"gךhFà€œ*wú/ÆŒôûÓï E,§ÐfüÓÑa#8yb’a…855Ú¹!‘àdU†²< J>,¿{·ÅicR,Nû±A–Wx~]È€Ž?3Yx›³¼ ÿø¢f/¼]\ðÊ‹9­‹suõ§Th²|öGãñóÏ?ÿ©O}êïÿÃ<ý¿þÝSoúæ'ž~ºR«¼x÷¦Rqµ\>?>Ñ6õ;yz´ßH"׿4³¯xÂQ˜^fEÅLØôŸ¦àA ÜCåƒÙAÕl6/]º´½½½si›£®ØurrróæÍ›7ožŸŸŸŸŸÇã½½=N«XYY©–+W®\¹víÚêêj«ÕÚØØX]]-—ËLy9§‚À92™ý¯þ— ytt´¾¾.„8::J’ä÷~ï÷žyæ™øxúé§}ú«Ñ¡Yù˜?³Ì$˜ˆ0»qb80»bŠÃ¼Jk«"‚Lˆ¢fžtàYl‘sªË¨àÙ‘œ/$I%1DzA@g¹1IÕ.š0å®Â©@D%¢ÐÀ®\¹?É|ÅûC™Î÷#´ p€'Þ`2³EÈ?®z•¿Â˦ðD‰À$ò¶L2gõÕ;ò<—X(‚~u„ó˜òJñԱݢR©ZëÀOØràõîĺÌwßI¡I)]2¨pñ \ñy^"‚z!ˆ˜›¾Í×éBög; Ø "¼Ž¹)LU’Ci¨ØÒXÀÂ÷³ƒÜ7CÒçzöÌÒ ÇŠ¤bA£Zn¦£Ó³üV=&ùÈ®Q‚UÙž§5ŠtdM>š!¸¢nW4ámàY‹–&îm¨±Em3 ’UKjX°=‚ È"Gf…Gm›©{í‹g/ˆ„T˜¢|Í¿s°Y@$!¸:©kR䳈$FÈ€MD`ÁZ$BÒØ Ì6šû<žqY÷•ˆ¨³<<\ì¥`?̶ 0‡É,ΜAw0 dDÞ9ÌWÂôÓ `R`&h1:FnçSÃçâ‚ì*2òõZ`j•/0­_€üUÐF¬ô½Åq ižÇ”ËZ¹üæ§ßðÔëŸHÓô/ÿïÿ{ô‡GÇÇO¼ù_œöz»»WïÝ»S/ÕŒÐó& °8Aò@¾aÌÔÆÛ]¬µRÞôLŽ‹Ï;[äà8dqæ-¸Ò½E¼ŽpˆÄ=»ººº½½}ýúõ«—¯,//sîçPnmm=ú裷ïÞÙßß¿{÷îñññÙÙY·Û½sçÎÝ»w+¥2ÇËpÖãµkׯãq³Ùä Xë (=Ûób… ðß…+++Þ&ùû¿ÿûÏ<óÌ>ð·aÖÔkµ«’>‘Ü˰ü’|§rPš¥RÉ[ù~þŠÙ¡”RƒÆ ¤ 8‚¨]‘ *ÎlS"bw´µ–°P|™‘xë„¡B†ò±âÜ’$áVðŸsšèm¤Â!‘SP|PÅ|Ï, 1šJ¨Öƒã^þ¡ž ¡ËG ¥p¢ƒ·x¡E6O½ÀáQ,ˆˆ=Þ¾í‡ÇkÁ7°Á–…!¾“Ó½%ƒ³‰x>£(ŠU,]f*`™S¹¼üáÉ])ouô‡mrø™&"mÑg«TÍ®¿è0-˜óœ0ô ÇîZk<é„Ï‚ülDÁN #0pgC+“PžÓ¨'´$úzœÉ¤o%™—Ô ¢é5-ªJÝS:±SÆRD$DLuî_“À-ŽKàb7-°Ë dÁBD rjÞØÅhIñÍ®wW}MQ‰@‚P \Úç+MSþÉqâ-è²tJSgÑ£’C¥ì»%˜à}¹Ø$Á‡ñ ‹± že„áÁômòOÉ/KˆÒ€°¥àä®ÉŽâw·D5ƒ]\Ü‚ ]|¿B‹}ÎKÆo"¦I 3}N'Ïø±‘+ïRÂPÖ!"‹9ôEœÛ'i1×tÌø¢~.ÒŒs[ Ör½õÓAÇ•JUkÝAX¥RéxûÛ¯>rõûÅ›ƒ}òÿbÿÎõÕýäù—òG­@¯Å…S¤*b¨é@R. ½æÃ¼E–eœYã3½Y8d_fq«z½NDlÙk6›ìÖ½vå*pøV–QµZe܉+×®žŸŸïíííííìíííïï·Ûí^§»··×étø«£££½½½••• ŽFñ5`³3³¶Eƒ³s&qQ¶é‹_üâ3Ï<ó«¿ú«œË3Ûh4¼;™‹!Ù…€¯0åå‡rb•¶¹< è=ôØú,ËfC[ì]áìº~Á8‹çë/‘CÚK³Œå ã@ ù}¹ bh8r½Dʳ:^QFÎâÕ;Bæ:-áÏÆV…Cåô›†óJ½aÅèWéoÚ&éùAh/•Aæ·ßˆ˜fSš?Ô 4gÕñc.oÛ¿²÷¿z;µÖä– @±OÅk® ‚æ…9íŠqùaó0¼-ÝZësÈÁ}‡&?!Aø b"AM9.ÏE5ª­8&O§—Ç€-YDëÆ£’h”e6+¥ªµ"rÚäPÛëW/ÿò/þâ»ßûs/Š/ëû]ûGÇ—vw,e3RÿS9è.Æ žB“ʰ^BÄ8)¸µWfX!Ì€9;ƒ0G*”Ëåœ$I#ÀÞßV«µ¹¹É˜år¹cvà‘Q5›Ífž±ŠÌŒ»tûæ-vô2pÏÞÞÞ7VVVvwwWWW1ŠY1“…6Æq‡¿‡ÃßüÍß|×»Þe­MÓtccƒy°wãqM—m—AÝbÏu¼~ÌS<ÎF4W8O!P…ë:¡Œ8…Àçu¬Üh§Z!„÷s¦,9lNnBˆ¤\ò ,MG>°…·_g ÞÉhá"_|çüæ©¡Ñ•åí øn&tyÛ¾yû<ò¦WUC>Í÷øÀ.ë`ØøÎ̱.L‰5Z°ÎïE‘äM<$¶—€($ žJ)M>Ñéý„GQä¬x«x“Gtû ã§\…0Q`+æG{ë“?o!æ@¡KÆë–€…9Ïz}ÿìÔ÷Óëç?Ë Fºò¼Ü#M©U$lh1¦ì,…cI)•ÊT‰…¡•±ÈJ‘25D‰Éu¸Ÿý£(ö3²ÿáp,œO HþÀTˆN€s?äÍ ^;âÿKÍXFxQ”½Á(ŽxóC¨uD8åóóSdB|4À ÆK3@ˆ - "L³ ƾ&.öcab ˜ÜŒXxœí`²%f8Œÿ¦`x…+N„àBM7´±=L³‹ËÎBaîvÎ/p§Òä:6•ßš9÷Cbr1øJ{ü“ðW ™Ž)¸q2 cßõ/§E ?©RÆæy>è €RªZª–¥£ƒãëÛÛïøÎïúø'ÿÃàä¬Z­.o¬DÎþnBÞÛ>,)TWr3©{f‚$X°ðƒ™€õê,Êz½ž'Þpí;Έ.ýD1_DÄjµº²²²µµuéÒ¥ÍÍ£ÃCfÀ¾N‹§KKKk«k ÍÑét˜ߨyáþýûwïÞå¨iŽÛZ^^>==]__ßÜÜl4Œeȉ³Õz5oôÚáÊÊÊÇ?þq"zë[ßÊC‡è´Ÿ¥Ê/À¾LDJšNº ¦ã¾ú‚Þb'4L—Á@,âùÊMf‚dµr…:«PÞ‚ðu¥ˆÈ—ïí÷û‘k^icÍÍÒS(d]¼¹LS¿ P@;#¦‘n-´ŠûmÀS—§š7•÷Äó‡H¸ÐÞÍÌ-ó¦]Ô}?“^œ ­ þq~Õ,ÙP6š¬Z}u˜w[šªcØ‹FíÄÄeÛÄÒíá ¸¢“ ÏÎa(µªÄ-IfBÎBšg$… X”P+ÅH4…ôœräÈ:Ï?I©Â‘û©˜ ”…h ˆMD:%¿“Q  .]0 îOžÏð» S!D$3©zThóÚ„Ž^áöáx4ö{S™"æÖDDà$Eα Ÿ7?*OXÛ·P`;‡RzÒ&h-¼œˆÒÂëY6 ÂÞof=>Àœè‡Ä‚Ú¬´A„0ùIøÛ‹êà.ð™sWv"À…Bb\Ð "‹`Hép 1A)J‘`“¢¥{‡{Û[ÃÓÁÿü=ÿãgÿãçàÖÎŽŽeÉ’zH*@g¹D!QX"àš™€HªðÏòͧ•%À¢¦cAo%c9 …-¾Ê5­u:£«xéÊ¥¢D!¿û_ÿk£M£ÞhÔëRˆõµµÝÈ2Eq©TN’’R\r1Š¢¸R®H¡t®³4W2Zn-o¬ol_ÚY[[_[[o4šF³R©FQ €Z›Ûwï÷Ã,Ï{ýÁ`8§Ù`8B%!Ͳ<Í*•ÊR£‰£áˆ²,{æ™gžzê©G}”uJ£äO ¤ƒeÇi¥Ö:DltJ0Y$’BÊ¢’ J!¹¢-AQ´’ X×ò Oï”Ä$>*UE‰¢3û©³"Ž¢ÂôÇpB2p;°q¥TR*"Ès-ŤîBR¡ IDAT8Nlƒ ᢥ˜;z,ª…× nž{¼oü¦Þüâ/úWÒä…"k,Yb>µÚU¹Ài­ž‰.c2=’U/£8Žâ()%qœ¥_¥â¯¤ã±ƒdk&Zr5˜¸Z³€0IA iL{¼<ÃVR‘kXqb(”B޳Q¥Z‰“(ÍRI©D–g¥r)OóJ¹le6 j£¥R3Ák^þ¥"¤‰8wÚÕo&‰Ê¡;¡@)…T2RR)ÒÊR.ã~b]cÅÀh˜ÅB– u„íˆ ©D&"–¹M¢µFJaŒ É,K„àê° Cåh“ÄI–¦B(|™„pr…Z„Àµy €r0‰WH•ŽJ BCH ¬… ÅN·d-XK–¸joøÇÅf}VWеøC÷çGËH 0`-’ÿ3`…\É•±¡,Ø$ Ñý B‡T˜[Á£%¢„Äý+MlÁ2A9äâ¿üCÄ‹þ&ÖŽ° !ªù?pN„ù?ÏýáeîäÞ‹gÌJX ®¶Ëc6DÚ+y5A" `âÌ ßÛçD…“.ñ‚Ux™ûð¢æŸU«ÕµÕju:_ú ÑžÓ.° NÍáÔõ žnÎ…ð¿Íl€ð]f„ËùC:s}æí^’ ý—ßÂmùŸéáöžŸê™a<¸“—ÕòñIˆBB^Êú MçUÎl Qè©2®t *U±,ó#c®ž‰¸&vH²B  ƒ‚ao£(j4BˆÜÕÐ È;nÙ”Ê=²)¯^¯_¿~}mmmww÷ÚµkwîÜ9<<|þÆ ''' šØï÷ïß¿ïÞ½jµºqwcmmmmmm{sk0ŒÃV«Õh4Êåjš¦ÇÇÇ—/_¶Ö²+ºT*qÚÌì…+:CëÃë"ðc}ã œsˆæ®Ï4o”ž9ºœÀ>3É3ü#|eo÷- ßWLyì æê»¥ ¬Rž=/#æ›ç»P:ÿ²á Cî߸™•RJÅ~ÞÂ9ßÝw SìÜøgyAá"f0óîó÷` ¯ðH#ŒC:Î`0à#Ã53â8ÞÜÜäZF|§GóŒ|á`f˜Ä7ÞüÙdè.èõzq÷û}€+' À^ãâüËÜ.˜O D„ì=¦¢„ú…um/xåW‹·=˜SÎPpihZP¿ú¯—ûμь÷Íõ€·›!³Cfˆ[øCÿ¸ðéù/Ùü#®]»Ö>;W((H|•A‚`3ÉçD„näÒ¿²?¡ÁÓmQ³ù³T€Â}PÎ0?RàçDq@S½^gØ–ÇIR†EÇÏÇÂp5¦yÏÂ(Z Î×h4Z­ÖáááÒrëàààüü¼×ëqa8†E¼u÷רÙÞܺzõêöÖ¥ÝÝÝÝÝÝËÐï÷¹ž,„éÂ܇;f~…ÇH"f_A›ßUàdr6ðp„Ì §í„Ey5k†oIW+[´ Ò½Ãa„5sÑNGØÏL`8¶™aø+˜™áùšð°‘RÒÆ3`"Bøx„2\Y??¨ÝÜüs ¿Ð0ѧ…™ö]…—)¼ÁO>÷Pø¼M†ˆív›‹ç¬ûûûŒ­}||ÌaÕj9Ø*œ@º@.>¼J,Ø»·‡Ã!c¦Þºu‹Qcù+®ñP¯Öˆ¨Ùlö‹}3Ó2³ø•ü©¶é€E LAÔÌ?E›ç~G=àŽÒ¨Í¾a¿ºm†ÕÁ¢¼{›yñ—äÁ ÌÓ}ø¶ðàÌ·Ü訔˜Ü ÀòRK§™D(87,RI%ÑÛ­c’*ÄC5Ó#î]Ý£9n°ð^¢$!AJ ¤¤ÂL(P°Á= g7…âJ¥\¯—+Õ —Å>ÉKI ´Ä©#I8vuÅÆÖÖÖ•kW÷÷÷OOOONN¸†.W^:9?é÷û‡{û÷ïßßX[¿|ùòµk×vwïe\P4GZApÎC6ÏhÃe^tðŠ_Ù¹ Õ/«M?­þAÉ*6»](Yw¤g3ámáýÞ«ê{ž_¯yû|'>&¼Ç3’—;'áOl€®NNñ·…Rß2á¾—ÝφuA³".óçÖûÈÃmÎ[H#.Þ ‹BD¡Èwb­Õ©®×ëívJ¥R¯×3Æ”J¥ÕÕU`€ñÕÕU†ñBpÈaسîŒLSÌÿ«Ä©ØkcŒ©Õj\ĺÙlfY–æ9§žsnýòRëÞ½{Ãáð"£òüÌÌì™Í&€=µˆD ¬ÕÿÔ\j^v|ð?ò+ø/ÉÌþ-Üóó£ù{¦Ÿ‡aØóWæaó'â]½$™²Ö–ËÕAÚeQ^I)QL­pѩŸëƒzŠ'ΘL-‘@äÄ-ÁÑ[Á_ñKÄ0yÎÏ›B]½z•ᤔPLG„†/Ì 8, ƒˆ>9],ç5­­­uû½­­-.øØcݸqãîÝ»‡‡‡7ïÜì÷ûgggý~ßZÛ9oß¿cãÆêê*»©¸[<²—Ü÷8gÙð¯ððݰÿ°óÉCçžsT,lvŽƒcW3O`ªCÃ,,²”†íavö<³Ÿ´?9¡8üa¨¡úÝrÖÐÝ;s'ÀÄtl­õº4NË[ܼÞ2×ð†ð•à ì¯ÌÈ—óDgÆî5ìf³¡ð.%"nãúrÚ+++ý~æAÅ`2Âp¯–¢Èù <Œ}ìcûûûï~÷»Ó4õ‰‰ˆ¨µ¾yóæ‡?üá›7o¾ÿÿÀE]…39Ù*‹Šˆ@Ä ET@ ÚùMt¾ðú«rHgÿàÛæŸKsZãÿÇÚÂI~ð̇³ñ“3?·3¬tžT>xT³7Âsm²\bQ]‹Èr’:9³Új­EŽ{,ê5 %DŸ÷±ÀÁƒ( @¡% å ŠéˆO»T£Ñ`2ÿ›‘7p(À‹ œ^R ÂÑSÖ†™1ã­s°+ªc¶±±±ñØcìïïõ¾zrrrëÖ­Ó£ã4MGƒa·ÛÝßß_Zº½²²rvvÆ,À)v:lõa`~`àë É+]¤\Ô&=SŠÅzÊð¼©ëV-T1Ð}o| ([Dq:Vy†ÖÐ\óêLø |Q }Æþ "Z˜r ø¡2tö «Bä&Y»WîÉéÇDSé1EàCâä=±x{n?ÛÞ†1YŠ€@x ω—-¸’«¼ÿðÿðÉO~òîÝ»Ÿÿüç··vÞö¶·½ãïØÝÝ=;;CÄJ¥rttÄfjo¥ðiÄ3;dòÏW‰{n8²¸Ðï÷«Õª!€<Ï•J©F£Á¸rõnƒ¨y× y‘“'ÙNW¸ô¬’ ÿ‘ÛƒO¢¿Çž?óÂYØ^-Aá¡Í¼¯‹Ocõôaž2<¸“‡™Ûùž™Ø‡—rr¹ühEÚe9’± §ÎrHiÉZ—à áÿ)géýo !"!kPî3ä/¢úÝéP€>— €€ D”µV)Å ˜T!Õö¤…hÆÓà”\"]+sñ8ŽG騛©ã8¾råÊÎÎN»Ý~ä5~ík_»ýâͳ³³ÃýƒÃÃÃñxüüóÏ]žIžçµZmá)"ó Á‚ ¶E¸ÞÓ¤„/¾r N¡Ç€ÜvqÃÀûëyL¹ƒ'«þÊs,téÔˆü^}ô>oÏV10ƒÌlh’05?a·3mÆ5¿Ï²œ†þÐfa̳ =õŽDáéÙÏO8ȉÐ@“i'aa­0 1HÓúÍÌ+súÐ {B”âk½_ÿú×í×~­ÝnÿäOþä{Þóž›7n½ï}ïûò—¿üS?õSÛÛÛ½^‹5q?a'/É^•V*•8ZÞõ®w1–R.ÁÉè(V¥µ°ÍìÉœ\ð ÂÙò €ôOÊ¢BÇ_\ÈSCÊäÿ1Ý…m†}¾\Óöeñà™í´ðžW6Œ™EÑùY§ÚZÑyG‘ÉrcŒ´Š3KÃ]1Ofê)ðU;³3Å'м,F¬1@Á¥±™{À(¸o(ßð?U©TÉs£T\.W¢(¶øŒ"¹ÀT¦òlgcy†õz>-¥db"ª–+\爒(€X¯Ö¹|ýÒÚÖîæÎÁÇÇÇ{{{_ÿú×oÞ¼Y­ŸÜ¼y@“çy©TJóq$§{q9ç#GŽzGCÊ Ž=ˆ=CÉ<Ï ›!²HV‰‹ŒîÖó0¿‡&ŒŠ[e1?2R!Ï®U†vŠøæÛ$WgäK¶Š;ÁÎe ÈeÀr¥žý É™"ü˲a#L'óþcDçμ²÷}BPʯõ„Ϲæs|9um$‰娻Q8“Žˆ²ˆl2dcU.8«3p" @ ¶¡C@–¬5>“‚d'!âLÎφ1FL¬MΘÀð¢{@¡‚‹ÒR!”䔲Døçþ燇‡ï}ï{Ùã»´´ô ¿ð ïyÏ{>ö±ýèþ(c»v»Ý,ËvvvîÞ½[«ÕÐé‚RÊ() ‡Ck'¸`ÄÈä\„‡Ç¢çp8´VWjÕ4M³T×kµlÔ§<­ÖÊfDš€È ÃK«ëýî`<ÎâF5MScÌæææ½{÷F£{—ò<¯Ä iS‰)e·ÝY__/V,ONN®\¹Â•yÛŒÇãJ¥Ò>?ߨØàeÍóÓ½(ºs1T¤¸@¸Èn0/Áç6d0>x3t -ìpÁxB–@Âþ\⢃W±ÈŸ±48‹Š½à¹ó«ð`A6çjc<Î@ª‘É¡å±M¥ÉMÖ¬/Å"ÉR#Œ% cYÆrˆÏèi—!oáóÓKà4.OTPHkÍ•³KqT)J¬TÊZ+â8â ÷ñQ$•p˜P|ä850|Ušnôÿ %…ùÕ ¯p¢°? îà ˆ\ÃõòåË;;;8ýÜúJ·Ûîyl#Öž1.d‚ùZ¸]fÄœ™¯æÉL‡­ëL'3¿"¢…¾=Xdª™: ´R!ó¶—ÂÁûU`ø's¸L¡Þ.Ή¨3dqr®‚DÔðAþeý䄆ï[|ë&0d«àDÆùuÇi¹¦-TälÂþW‘Šò>>88X[[ã’_£Ñ¨R© âòòò­[·Ò4­×ëwîÜùíßþíw½ë]üà¿ð…/´Ûí7½éM?ñ?!„ØÛÛ3¤ëõúÝ»wÿìÏþìïþîïšÍæw|Çw¼ãïP":::ÚÜÜ|÷»ßýc?öc7nÜøƒ?økíÚÚÊ“¯{í»ÞõCµj#KÓR©JÜ»w§QZÊcñÞŸû·ÿê_ýwò©7^Ù½ÚîuS²ŸüÄ'þôOÿôg~ægž{î¹?þã?^ZZzÿûߟçyšfõzý#ùÈ'>ñ ¥ÔÓO?ÍbS·Û}â‰'¾ô¥/---µÛíøÃ_úÒ—vwwßô¦7½óïìõzggg\«ô¯þê¯>þñ¿xëÖã?þ-ßò-ßùíßÎ5Q¸Xu%˜ü&d³Þ U—:k ï˜þs[Ø^®´°‡©ãóµó¸ˆõ<¸…„E aÑÚ@ø™lWw[h Ç ÕD‹• ª qŸ9Y0®R'º*Ö(¥éÀÉE¬ Q€>OÓÅõf^>ô‡70o¥Ùû‰™×ëõ••kíúúz­V[[[Kʱµöää½Öƒ~€”³‰7óO„ ƒ ©‡!NÒ?¾ÁÍ4#©øþÅ ¸üÜg ´XD$—¥¾ºâH^§î{s…ïÍO]¨‡ xžõ>ÌÛùÏáa¶v 2 LnçÏ*å(fúa€ ˜æ¦xyÀûgùpq}oãÓ7á¹ÂÃ8²ð~¿|(D¹\ær#>ú(Ã×h­3ÈñÚµkŸýìg{½ÞÊÊÊêêj»Ýþå_þåïú®ïú¥_ú¥gŸ}ö#ùȇ>ô¡·¿ýí[[[(á…^øÀ>ðÄOüú¯ÿúóÏ?ÿ¾÷½¾õ_~Ûµk×öööz½ÞýÑÕëõ÷¿ÿýÍfóÿøÿø÷ŸüÄk_ûú×>ùz£u9+Íz«Õj–[=›i­Ÿ}öÙùæ·îïï'•rnóãããV«õÔSO­¬¬<ÿüó÷ïßç V*•þäOþäsŸûÜÿø?úè£ÿøÇÿò/ÿ²V«•Ëå“““ííí½½½÷¼ç=oyË[~ë·~ëÆüà‰è{¾ç{Ö×ד$yöÙg?úÑ~Û·}ÛÏÿÂ/|ô£ýßøF­öíßþíg'§Ngii)Ï â¯-æíeæ? =@FüçvQ glFxÅý„WÐUÈó^ñ½Z ؇˜°ÑŽ,Ê ‰ìÔ‘Ÿ¹~ ˆSL$¼‡f°·@n4ˆÂúh—@ã |ÙB%]-CåðËá}ZäEÓê ½ÿŒxš;¯T*¾T“tˆöårykkë‰'žxãßøøãså¦UÐt :éüfšb«s çÚÌôÍ¿ÅËjá¯fØUHúÃÏþMÃÿ.¶—Ûnæoaˆé&%–áÞò·AÀØfÚüE˜ƒ —;|¯ù6¿ óýÌÌÛÌÛLèµD¥D«$’±‘D%QfäÀ#Î-ü§¯÷ÀO™ßíÜ8‹‘«××׹ܵ¯ ¹¼¼lŒá¼;"âº×o~ó›«Õêõë׫Õê¾ð…r¹Üï÷?üá×jµŸþ韖R~Ó7}ÓÛÞö¶O|âW¯^ýÊW¾²²²Òjµ¾þõ¯ÿðÿp©T²ÖþÐýP©Túô§?­”Z^^VJ±‘9MÓ,˾÷{¿÷æÍ›\-JQ*•>÷¹Ï½å-o9::âûëõúÞÞžµvœ¥_úÊ—s£k:Jñöwü÷åj%Ó9 F§§§úЇZ­Öþà6›Í'Ÿ|rggçÓŸþt³Ùìõz'''ýèGÓ4}Ç;Þq÷îÝïþîï~ôÑG?ö±Ý¹s‡K—v»]¿F ÏÚüÑ{ÉfN–߇/÷`þÿ¼ÍÌç+¦oóëÇ枇yîü‡—ÛlPjÌ÷àJÉAlX›J%„D”ˆág ¨PðŸp9HÒI™!…á+H“Õdskøÿ9)8Þí›*¢Ð¯étO¹fb;ç œÿºÚÃl÷f#3ƒïW*•ÍÍÍëׯïîŒ…_žçì™!W˜Y­PDðÛÃÙŸÙŽ³/ghÄKö0úüϾLgÚÌ;ÿˆ™ù÷ Ë ÛÜ<÷… LL¯>÷6φ}Û‡?< Ÿ;3 ¾7Ô{öòÏ ͽù‰ "z|陡úé€z½n­ pžçœø[.—1ý~¿R©loo³'øé§Ÿ ¼«ã8ît:QŸŸsÖûòòò`0¸qãÆ•+WÀóÈ#p5nv'ommœœpXµOÁ‡J©Ë—/gYö•¯|ekk+MÓ7nŒF£7½éM/¶¿¿?666†Öú…^xÍk^óøã#"gsMRcÌêêê‹/¾Øh4–––ºÝnžç=öX·Û½ÿ>£ë·~kžç¯{Ýëø··oß–RŽÇãÑhÔh4æ7gH1g¶ë+  ÿ̃¿ñvÑiz<Ìm°È.õrçéÉ̇W0l/jS ÔùãÒpš–×ÃŽjáÃ&.H¸@D¡µæ° V¡Ò4å³d³ÖiÚÒ¸Pö#æ—4®Ì+ ãñ˜v> çB0’ßææ¦W޹…µìÃ%/\ï…÷Ïì¤Wë`{2ñ’;u† øûçwí<õ›É׳ôsÅvûp9pN. µÒ‡|©‹(`¸_:NøœYü˜yk¾Í‹qá4bàh˜m$HþctR¢ò\y†ÓœNüàBøø|"bvËl¸T*1z¹”²^¯×ëõ8Ž×ÖÖx··ÛmvµÞ¾};I’ýýý£££×¼æ5ÖÚv»½¼¼\*•ŽŽŽX$Íó|ss“yÞùùy¿ßg¦i·ÛåÐåV«U.—[­V’$KKKŸÿüç9ÔùÓŸþôÚÚÚåË—kµš”²V«eYÇñÑÑÑþáa¦õ¥óN§Ýížœ=ñÚ×¶»] 988h·Û[[[ õEëôDôÜsÏq†•RêöíÛ·oß¾~ýz’$GGGÃá°^¯§iú€Ýþ²NÙÌæ˜øÏíÁíU™´ Ñ´÷ç%Û+à—øù+îÍ¿Bh(.b˜§ë‚@.‘äë7øÏd¬¯k–¸"³pÛvÞà§P°Ò  ɪ³Tˆ,Ç^yÖÈ¡óA8Ó9múÇxª:COý옻8œ!„Ïô.ØãK—––Ø@ÍXzÀA¿Žì ár¢`Ê…7µ*3Gw† „g¸x…¹Ezð*† ;ǹµ°«ðWî?|‹pz‘\ä°+7$ÂÒrÎÈì9‰/´BÛ¹¤êp.(L`?ÿó'ÿi˜O¿IB)Ê R¾ŸP>ðŒüáû`•ý8¹g႟m€g2Ó³ï œàÎIž»ücTaj/qâìÉɉ¯Â„ˆQ±|i­=<<¬V«ìèv»ËËË\kduu•Óâ‰(Ïóçž{î3ŸùÌp8,—Ë+++ûûû+++¾ŒæÁÁK¥­Vk4ŒÇcN¬ˆÙ°×ëuÊ¥Ød”w:FãñÇ¿sçN»Ý^ÝXßßßâ‰'o’g#Ikm©T’Rf®ÕëuÎ2à‚Á`çy«Õúò—¿ü#?ò#ƆƒEDN&¢G}”*···ÏÎÎAïáÌË(Jîíù³0C(ОÄÿs»¨ÍÏÿ7ÒÕ xÉ6#K½‚aøŸøû²0;(h³')¥Ö³Q«L”T Çœ¦¹ç€0½™g4‚â¹ °€JHk­%+•®â¼ÖV`<ûÐ'ë¬<ÜÕŒ)8 ×Û?˜{I-ßÀÀàÊÑ ¢µ6˲R%aò.½¤ø¡-<ŽB(k­¯P 9ÊÔExÕPofú™!43l`áÏÑEó†«XŒÜ-ÇL±Ï[åæ÷÷CPXifE&“ðR¯?C˜ ^  7Àü‰š™¢pT4áHfvü w÷Æp¾:33|]ÑÿËÞ›ÅÈ’]bçÜ{#"ת̬õíûk‘|ÝÍn6—&‡‹À%Rš‘iý‚mÂú e@ f lÃÈ?†˜– ˆä²¬±d4¢pD‰Ã¶HªIv“½¼ýu½Ú—¬Ü—ˆ¸÷øãDܼ‘Yý^³É±=¾x¨—y×sϾL'<±+à—%2ƒ˜@;ß”¥¥%)åþþ¾å‰¨Ýns°;WAæ¬)0Yrí÷û¾ïsž™r¹üÔSO}îsŸã”UƒÁ`ee¥ÕlW«Õf³É‰k¸~Q·Ûz½^¥Réõz¾çùJ±Ìêy~«×+-ן~úéßûößyž·±±±±±ñ>õ©ñxÌòq³Ù4N²ŽJ(•Jq‹ÅÏó8å\³Ùìt:ŸøÄ'~é—~‰ù F1ŒŠÅâ½{÷Þÿþ÷ !vvv8ÓH†•J¥P(ŒF#fâÝcÊ¥Ýä墹óÿÓæGl37êm PÛOæþþ¸[fþ鈴œjq”p\aÌœ`6‹ÎÛ[wnë  …AÐ@‚@±¿±õ¡å[7 80oÇ~Žø+ßó}ŸÐN »¢@cLk!!Å:6©ôcŒAWÚ ÙáøOÜVN:ÅÈÂó<.Ò®µæ¯!¸2QÄ]æÌ}†ahÅ ÛLjÒÖŽFE$B×eÌéîÝ6Æ$%: }!Â8´hÎ]8'ñ\{˜ˆ!"J˜2JÜÓµD©„§C¤˜!ãùï›k&—RÆ&áÈ\»€ÀDÍÀ ±µi­âÁ•y:4 ›ˆ)·´Öq4Nõ)Š./\º»da £éUB" ¯(C¤u¤õ”sŸ‹Pž1F³|œŠû&u\€´â2¤ÜFH‘‡^L± ¥TDÅ1b²á6fçÌÐeYFKÅí¾‘$މÇ IDAT‰D #Öè …f³Ùï÷ ‚A48uúÔÍÛo(¥ ¥ ŒÇãHIO‡ø¾ttäûþÅ‹[­ÖÙ³gÃ0 ,%—J%¥Ôh4âmá0zû z½^©T(‹»»û•J%Ž"­Ãr¹Üë¶ R)ï~÷ O¿ýíoåÀܸqƒÂ9Ø1Ãá°P(¬¯® €N«¥£ˆŒ)V*ÑxLZû¾?Ï;çû~·Û­V«»»»ËËËZëápèyžçy—.]b^a8žÆŒ‡ÃÁ`ðÄO ‡C"ŠFÍ91 0‹^f0šËN™œ·|zag{¥Ê¯Nø°äõì‚ð.ôÎü0s”yÍE§åÿ 3ã}O$!˜†/ °ú*Á«\k*´2C·åY¥“—ïÝÌ•ŸHJc'ïƒà}ÉË4?JzF˜©Û3]þ_Ï·wp:椂µ¥—IðII€’*c($iÒþ À!€A˜eÀV"4Zð}_HLŽõ8Ã^¿R©øR JòÕ ¥Ôˆ´‰( $†„D%vvvÚí6ãcŒçyœFÀV7Jò¶7,T.—ùy¾ïs¶A²í6sI2¼9ê>œnüÄV#ž¹­î˳¸·Ž_9'¦ rŸÙÿã¶ü义œO/7ãxÛZBEŽsæ-â>Ù~iuÝhkÆmæq¸Íþ)o Í|ÅÚwÝ%ä7“ŸXHp÷ßî’e\°£@êåúØÉd6'¿i'  6ö[ä0IðpWm›”òððÐóì³Ïcîß¿¿¶¶fŒ)—Ëßüæ7‹ÅâÇ?þqNDî…Ö*Üï÷÷ööÆîîn½^GÄsçνòÊ+Ýn÷Ì™3Ìø–J%ÎvÉ–`&œì`lÕÝÝn—-DÞ­uçÎ{ýõ׿ÿýï_¹re00cW.—Ã0ìõz\ŸØsúôé¯ýë¾ïW*•ããã×^{i¹\Çׯ_ÿÞ÷¾·¿¿_¯×™¬òaq²ë«W¯~ík_«Õjår¶··Ÿyæ™íímvw³¾Ìƒ·LË`íüUÊ´üíÈœ{æ}1ƒòï?bƒÑzËyþˆm&Šø Œuò¸ó–l±œ‹[ÞÙIžÐòc¹ÈǾp²L>íÙKÎ<ŸàÔÅÚþãTYâõ×_íµ×~øÃ¾úê«7oÞÜÞÞF¾ï·Z­(ŠXUåy»t²3ˆmÝn·Óét»]öí´®¤Œw˜µ· f˜ ˜Z»Ï¥“¥9}ô¼M̠Ι¤Î}n¿…Žæ< N<ÇÙ§’¿xà¸5Ù\೉¢, ³vˆ™4Øî‰Hã¸ÜMcŒœY~ž`X‘×}!³]äDiÇ ¦©£¼f?íl­²»û²»Kv×Ù¾O9Þ"#»À,‚ê>á-º·Ã¹|†ÝR×9‹¦yn<íåååÏ|æ3AüÎïüÎ7¾ñ(Šnݺõû¿ÿûµZíg~ægz½¿Éý‹Åããã?üÃ?l6›ŸýìgÏœ9stt¤”úÅ_üEÏó^xá…ï|ç;Õjµ\.ß¾}{8*¥=Ï#¢Z­æyÞp8\ZZBÄÁ`ÀE»¹²¯‚-\.ìÆ{{{o¾ùæÓO?Ýh4Êå²ÅÀFÜb±øs?÷skkk/¼ð‚ÖúÅ_dƒÁêêê/ÿò/ïïïÿîïþîöö6"îïïïîîV«ÕZ­6?ýéO—J¥¯|å+½^ïÏþìÏ666>ñ‰O¬­­±nrÔ7?.x»0öXï„–§Áù¯ó28ïý·×NžäÛk?Iº9¾ö-Gϯ=ƒ[Ü@ƒy(÷ܺ™]aªYÁÔœd]Œ3LJBƒYP4s¸™–`N˜üco/þ©¾öµ¯q.ŽjµZ¯×WVVN:Õh4â8äÀVÞ†a8G£Q·ßs•~V繸¸È‘E¾yJxÂñ¬aû.O‘Ï IœÇvÒ\™ØÝœ¦—–´‘”$÷JCò¤b e§*hp ÞÊÆ€© ÚÎÓ.Vd+JM&c÷'Cí2@™™­; ¦~Γ¯Ódæv½Dä+RW&ãÆ\AÆQâȚ<ĤóD×4…=éD ® ß`²J wÉäTrL?L®«û²Ä ñΜѼmÌï}ÕåQ\00N‚]···/_¾üÅ/~ñOÿôOÿäOþ¤Óéh­Ÿþù}ìcõz³©.,,¼üòËŸÿüç{½Þõë׿øÅ/^»vód ǃ§žzêW~åW¾úÕ¯þæoþæx<ö}ÿúõëO¾ç)8>>术ÇÇÇårÙó¼ÝÝ]­õââb»Ý._ß“Fèáh¤ü`iiåÊ•+ô¿ý¯ÂO?ý4ËÙ,þ²¦êèè¨R© ‡Ã|à»»»/½ôÒ‹/¾ø³?û³Ÿÿüç¿ò•¯”J¥ñx¼···²²ò¿ñþçþ¥/}Ik½ººzêÔ©Ï~ö³×®]k·ÛÏ=÷Üp8ü‹¿ø‹o|ãFã×ýן~úé~¿/¥‡+++ÃÁ8sÉñ¥Gdá<0z\z“95;„˜“/¯Oñ­ñÀ¬…¼#m½ƒ?öNh™[ï~Ξ_´é/ºwóšuvÜ,ÊÕFÇq¬£$#‡;)„F€ZRœ5²A)©WÈAÀÐÍ·ç"üDü%ÊHÀxþüù —––ÆòòòéÓ§WWWK¥B©T²%Ç-lmnoeè<!–––Xºõ}ŸÕ×ìÕx«Rf¡ 8¥%ÀˆÈ¦¦ñxìj<úÓŸþíßþm–¤“cBÏx¿l¼”Þä’§'jɆ«)e†WÓÄ=ÇýŠDáZ+ÁIXaIË=&3gŠ¢D² !=•ÛÁÀ4Ar;wIr"ìJ?9¹ƒ†Nu ëd>ŽFîò-·Qð‹v+´“ Ã} fÄÄ­€9­Ä/R7%ƒ¼í6ê f¡¶ØhwòVÚ m\‰ÜŽE“W/b {3yæ*µ"ó¯V|)Jô+$„J$üG‡I‡é>ð4Øýݽ3|jãñÐ]‘H}ÈÇãñ©S§ƒ§»2Æyž·¸¸Øl6Ù€:ù:|á _øàû?ô¹Ï}®R©ôû}&ŸìP®–:Îââb§ÓaÛÍÞÞÞåË—»íž1¦X,¶ÛíJ¥Â±D´¸X=:njMúr»Õ*(ôî{ ÖWÛQ|tt|nõ ™x ðê¥J¯×c?,6-W«Õv»Íöàn· Åb±ÙlÖjµ0 ¥”GGGçÏŸF…Báøø¸Z­†aÈnÒlÆf¯L¶K);ÎÅ‹÷÷÷1õz½ÓéH)Ñ)zANãÇFÊ¥Uö³=P˜Õæ!è™:DDÔÓÔ×~]älÉüÓ:“>â¸v ppfF.qs³;ÏnS 6mÎä”Ι·Ñf )Í¿f?‹i`w>3 °˜cxÜU̳‰† ò—åWþ³/} üB4 …B¡P„QéÈ0UÂ9ŒÚ̹‘¦˜½I˜ÌF#"ûÃr¹¼°°` 1êè‡!³Ô”æ‚6ÆA ¶¶¶€ B >xúôéZmaqq‘Ualß&ͰøË"ÐÁ`À:ÒB¡P«Õ83ŽÂı PNÅd»2nµ§s«ËqGAÄR©ÔëõØ(Ón·¹JÁx<>88`0®T*gÏžÝÝ݇ËËËl|eb–A¼[cNËËÅõõõ7ß|sme}<7›Íb±ÈÔcy···¥§ë­V‹Œ1ƒb±P(d0 ¼R¹^¯k­{ÝŽ*(!ÄÎÎgc JDÍf“¾Lï …ÂÆÆÆåË—¹ðƒ‚{qp¡P8::bcÐp8€V«µ´´4 z½Þúúz† ÷ïß?wîÜh4:>>FÄ tü¨ÒÑ\…ÓãbaûuwˆÌM™ù«‹"ÞBplz!o£³·~RºèÌ(o9hæ»™yüœ¼™Ëm÷ˆ=zCÄ 6'…˜äÚ'Ðp Ä¢AÈur’ `š L+#%ì; ‰8úË !¢(â\Ífóàà Ùlîììœ:µ¶¾¾~öìYÎP*• Ã¥¥%ŽPbÂÌy<¢(êv»\(¥dUvµZ•R.Vk+++ÖˆR¹m0PšËRwcLãP*9exa—\átq‚ür5½âåü9Á4Ѳû~4LÎušL̇Ü9 ^œ#—ŸXþÃäÒYzf ë?ew§•™UdæiuïÂñ­wÉ}(Ñ“ÇKŽÿª6(CkmçvD+ew¦úw¾ž¸LÏÜswhæ(3¹»íVdH,8WÈJÞù ænÔ„ç˜åé-„h·ÛÕjuyy™é.+i˜^zž×l6www×ÖÖ|ßçPZ.FÄB$p 0G·Z-Î4¹···¸¸¸ºº: }ß_\\d™~aa9 G«Óî÷ûRªB©ñ¸Ûíòªµ6&Š´ÖL¹\–쌇µZ Ø`Ï+*‹ˆèû¾¢V«Ý¹sç©§žÚÞÞî÷û¥R‰uÔ‹‹‹—/_ÞÜÜdz<Y¦/—ËADQÄ«f)ÿôéÓìÈ}ppÀÌz«Õ’ÂËÌ¿P'?Üæ¢ËäÃ{„åÉ2=Ì#Ãóæó“!‡v¬ÿǪ mÃiƒ{ûÜéµøÎœ@öè!=qcLzÕ³9d¸7m&™Ì ’ÂM3õ˜kzqæ 0’)7  PŒ>Xx夜¬çÌ™SœúîLÚJ¥R½Ø‡q3wÇñ`0°ÙïŽ9üŸ3ã!–êËÀÎ\<'“¦Ð£4û¥A5Dd}d7ÂiÓ¸u¢SÊ`^‹LÝ­™{Z9eËÉ-C°a•XâÄ»/¥´ÅxLZ¡Ö¾cùK_’rÀìfåŽkw;wi™Ég”>ÞÚÚâlÕÌ4÷z½r¹Ì©B˜Mç©z½¾µµµ°° ”ZXXð<ý®…§pUÓfvÉá (Z<8ïλ™>]¨Ë¢í?à žÜÿ 8a&x‰ËO’Æ¿í–Áºîó æ™‰|àÇCgn]ªvþsԨɄsÏ3L^æI†rYÓKÀ ãA HåK¦´‚±«Öúø¸Õjµ>ÜÜÛÛ¢x0öûDqñÂÅ奕ŅÅr©¼¾¶~þÜ…õµSëk§JÅRà@P)WÊ¥J¯ÛÛÚÜ::<:lŒÆ£ƒÃƒÝ½Ý0’xKËKÊSÅRÁmbÈ‘RcŒ’’•$J)øWdËFòøW™v}‚Ë ëzfaÂý<&HŠ_±q׉‘ED‘”è•‘b’rÙ8E¸'YÕXɑ؀̈́çp“„C,Ü*åI©„<€’÷Y Bò`8¥Jš ‚P¢”B"0LB K¤Úg¾`É?N³Æ™7ÁÊÝŸ 4)T(¤G€‚nço¯ÍÜÌüMä†sZ¾Ã“'?ïoB*–â‘Ýþ™j*–K¥0¿ö7ýòoüÃ_ú¥ƒÎ± |Où(„!ÒÆP*•‚R’ï'Ø ¬G "ž‡@ƒ"‰%U Ɔbm (”ô_yž’‹  éy,þBšB¢òŸüÓÌbë©S§Î;wîܹ3gΜ;wnqa‘ˆ8tæF ‡Ã»wïÞ¹sçÎ;>‡,Ñ"b¹\®T*¥R©^¯Š!G>0FÍf³Ýn‡Ã~¿ßn·ûý>×+ìõz…ïûìüùå/ùÊ•+ëëëJ)m’Ø'ßóƒ (Jår¹X,FNMš¥’Íœ´ýœ¡²’hú~B'Ü GÌBG Seš²:aw™IdS£¹óɤÌ4AµŸ¥˜Ð0—$XçÞ ¸çMÐMŽä7Ó®HamÀÂqv¶ˆPÚ&L÷lßç°%wL.{NæÑQå_#'zÛš`óÏíÓþjŒáð$ÞDGÐÏ! { ùrsUИ¨[&>w™)e !¶FxÂC! [ɘQ È“Z dTÐ0ÕNÆnî™bNU3ï}˜ ³Ù ó˜ñ¯óÚ¼¹Í[ Îi;Ê ýŸÜÕ[¾pr3¹¼o»³Üf^Õw¼e”´ù–á`f*‡ìuË|>¡Ûy‡‘ûuc ×5Y_nhÄܼùßüwÿýgþý¯º¼„RJ%z˜ò÷ÂI)¡u좇ƒ”B ™j(JA˜|J‚”ŠR¢ç{A¡àùž0µa'Ä4ÿ3„ ÿ‹ÿò?¯×ëL€ÏŸ?áÂ…sçÎ]¼xñÂù‹×¯_¿víZ­VëõzNÇî,¯ÖÓív766^ýõ[·nݽ{wkk‹ÓÑ1i ‚ R©,-'zéåååÅÅEVMÇø®®jÕ@‰Kö… ~ðƒüÕ_ýÕÚÚÚÚÚ#Dc «Ç¥Zë~¿ï¾{ðÉiåÎ2²ÀhÖ~Ë’XHž,N™w«Å´«½;îLÈBp-éT§àç*ÍŒˆ‘ÀT’e…>;6¤Þ=ÉOmôÌëšÿ5™d‰®û«;¦¬žò,±ÏWÚ³Íèõ}‰(SÚ¾`P~ÉvÃ]ù8öý̯3?LVI޶D‘ ÛÈgBW~QÌØ¹t7„¶ÇÁ0JxÖ,Œ6£QÎVAçfïhCç²L?œºD“Ýø1« ç-09ØOvÿs\˜¥Ÿy-ÏâœðÂH}—¹É|7üø]w ¹K ÙͰƒ'« ……B¡\.w»ÿ륗þ‡ßûçO?ÿüÅ'~j¬©P,™H ©È1d„ÊSB @4¤Y9låT®å YJ–B NЋŠ%`%=ÒiC\eÆ/A±àÖ9["ÍîÆ(’Ÿ¬Ž–ÿäŸþcŽ£(‹Õj•ãùêõúµ«×WWW×××Ï;wáÂ…ëׯ¯¯¯sZL})9AÇãñø7ÞØÙÙÙÙÙ9::ê÷û+,¥ô|µ°°°¸¸ÈFbNîc\W´Ö\e¥uÜâ\ZFãêÕ«/¼ð·¿ýí‡>ùÔ“LÔã(ŽãØSÿJé±e.LæøíWïo©Òr„nú*!„•â\¨š —î¯îd\´>‚`Vde5K€ó’1Në0í ¤;Ä a*l)ÒygFǽHùY¹VJ)pRMÒ8¥&t.WB§¹]÷Þº›`•Ïîˆv®{—=V{ÝáDªâ¶Cà,_Í ‚&J¼*yÂD”¨šy2û™™˜»cD”ᢠÕçç€}>ÈÝ–ä[’¡•€!!ÀBÎTAgò9½%œùÍwV²KvÏ‘“ìeO$Úð–íqÉÛ#¾Ÿ¹eo¯Ÿ·Gz¹e`lÞ_í¯o{, ®™ço¹3gòXãºWf^›7¼6#§¦ðÓéüõ7¿ñ?½ð•åóžxê½²\m¶ÚÃÞ0 Ça±²v4±ÈEPÂpÌ¿2!ÒÖôÃ0‡á8 Gãñx4 £(ŒÂAÇã0Šâ8Gáp0‡ãш3úYÁÀfÎÙË’,îîï0ñãL1H‚S´³É¶ßïw»Ý­­­ÍÍÍ›7o~ÿûßo6›Ò)Éb7±^¯ß¸qãÙgŸ}æ™gžx≕µå••)%7›Í‡v»Ý‡>|øp{{›ã)­çØB¥zíÚµjµº¾¾>¿úÕ¯~ùË_6Æ”«¥O|âŸüä'Ï9ïû~Á/r2Ëb¹”A|'`öùšœë„')ºxËœ?MÂl\œb¦“K[´ÓˆØâV;®kÈd]ø¢(²ûéÉ$G‹I‹$·ËÉ´å~ð0°@骠5%*zËydè±û«1ƾŸi®-Êíi’¿ÓÆ !bl´HUè.Ù€›.7› +£LvI)8ä™É*gw1iD"rAé”Qâl½d{L&À~Ng–HðìN†”Ä‘ž$-ÏlàL{3¦…¡,Óiå™8Î9&ËXj(È"J/#xqµºRº b_R“DeÆh&Ð0 ÿ¶e0¦ îÏy˜×Gf6 Îî$ÿIÃãÙ€ç;Sâ™= IDATÑ»ï»ïäß§”·žÙ‚œ–¹,>Ïy¯=.¡rß”=y{8ƒLÜ–G¡3Ç%Ç—Â}xò¾=úÌç)¾ LðO†›››ßúÖ·¾÷½ïÝÛ~ó£ÿSªZ+-¯’Ãþ äGªÃciDÔZ9-óð‡i)¥'$0/.„P(B¡L¬ÑW …aÆq“ 9e±XäОíøkª³Kƽ½=‹èٔʹPÓ„„Ñh4â¢7ï?ØÛÛã¢ß÷îÝ»wï'ƒåm–Ëz½þÜsϽï}ï{æ}ï½páÂùóçËå2+Z‡Ãa·Û½uëÖË/¿¼µµÅäŸ9€n·»¾¾Î鸺Ùþþþßþíß~ï»ß&P^R¨^¯¯®®2ñ&"vãÕ2‚î÷ûår¹^¯ïììÔëõR©ÄuÜâ8Fãñ˜‘2÷‡I2jVŒsfÍr¹\Y(s.\Niý~_Çq¼"6þ×£´€9Y—÷pq*]>æÑhÄ  èF£¡”âÑ9M’ïûËËËÀ•¦0µ.3纈xttÔét¤”Ãþh0,..ò™¨—ËeMÉçÁ`ÀÞ)åx<æ³æ*uÂILi.Ff¾ù çñæ´*œ˜gDZ‚•"œ‚˜7œ)""rF"â„áq÷z½Ñh¤”*‹ãqÄ)Õz½ïÞx4ªÕëJ‰¥¥%æNÊå²1†ëtÀÚÚ—F`x¥í üDk].— …‚1I‘Ý………õõuf(F·ÛfHcîAk;„ÕjµZ­¶Z-D\]]íõzqqÁ")e§Ó ÕF¥Réàà€Ý ƒÁp8dþ T)///s©^»1†Ë%ñŽ1sÀ{†¡‰ Ò ÞOˆãX —Ãè¨Xº²´üCµ‹ãÕ«þBð¿¸+>ö©þ` ½{ï+‹ÝÃÍ{kµZ4ÎÌŒhÙ¡uÈl%im†$F§†ªÛl0|Ž\—…]:AÁyÝ8¼8ÒºZ­*¥X Ƭç`0°Yåm¦ÞmD°ðfo®çyqZÖÁ2±è‡‘Õj¸ª…&”ÒåäP'LcC“Öf4ÈW~"rBê!B G}ÈeÜTJ0PL³°þÆ:º– ±¡Ixw\T59‚lŽ¥ònÏ¥š¥^)-™AØX\±Ü­§ŽÁåníWÈDnç"õq‰ÍT}epH©Ë2’53y“ê;–¹1ÆP¤]‰Å¾#s¹åù³MèfA‚AÈKÃm}ßo4F£tú,çwcȱ©Ã]1à‰ô8 •¸3ɤ.BÛýÑà2ܹƒ1&#ÆÞåJ‘ƒr™jØÓçAó&E<88Ài¿…ãεF‚^¯×n·›Íæ›o¾ùƒüàå—_fY–“ÙÞK¥Ò‡ÿÞó7nÜxî¹ç.]ºÄT1N†wïÞ}ðàÁîîîæææÖÖ#ëÑh$“* R)5·¶¶¶¶¶×k­É ܸñžŸÿùŸÿèG?zñâE93kµÚÆÆG-sds·ÛÝßßßßßçgfj6ÿüóDtûöí½½½~¿Ïdrw{o<×j5¥TElPXZZZZi!ŠÅ¢p*ù0…æ"6œž‰É3&åcb–B)ÅyŽ8\JÉFýB¡ÐëõöööØüÏ”J¥»T*•Ñhôæ›o×ëu&‹‹‹W¯^½télllìïïÇq ö÷÷_}õÕ¯ýë·oßÖq,•:sæÌ{Þó®K—.]½zõ]ïz×òòòÍ›7_~ùå(ŠjµÚéÓ§ÙÿÒ¥K¥RéöíÛ¯¾úê÷¿ÿýW^yåöíÛœ -Š"Î /^¼|ùò7ž|òI.k}áÂ…ÅŪ <B~ç;ßy饗êõúÕ«W¯^½Êg}êÔ©ápxûæ-N÷Çq»ÝB\¼xñÂ… õzýöíÛGGG{{{J©jµzí‰ëï}ï{ê§~н<Ïcðcv–±Ãp8´Nˆ½N¿Ûír€q€_©Tò®œúàʪª9U­Äu}­þdpxtóÏžwþÛÿñðê©ûÕ}Ñõ#ƒ‹­&-¯ù½~zÉuª &3ŽM†á8æÔî³3Îv5c ¦Eøf1ôrj­„„x)yVR)U¨TkµZ­V‹ã˜¯6~ˆã˜8ænm8åMp(£QÖ„U«¦Ö „Ì Çq¬(ÁK|jAù…‚1†ïšeèã8FJþVYIâ?eŒa¤Iiâ³8ŽC2–èò(iNÇ&…Ž+³™¿ôÄ—aŠ@:þ.)ÖZ÷‡˜Ä-PL—l”?s铃13|ÐqPÈl¥|˜%øz"k×K†"C€Ýq]K·h:Ÿ}“«´Íh¹ÄÃö³¥âöOÌÑ2,1Âg©P´gÇ€ÇP¡?¡ñ±&"¾öD¤'Éö¥K€U0ÑöM1.:ÝCL€YVñÅö\K€ÁQºXîÁ®HÙ¢ .í€0ŽÜð ¦êRJX«Õ8EÆ¥´Ý¹sç7ÞØØØxðà—^!"Î)ÿ/þèÿÎw¾ó½ï}ïýïÿ³Ï>Ëô’oãâââ™3g8 .<3ŽVâtÓDÔï÷€ xoaaÁS­V¯\¹röìÙÅÅE¦+žçñų|s=¬a`ÙÚ‚,ç¯ît:Íf³Ûí²œ´³µËR>?ajǤbyyÙs|||ttÔívYpa½L+ä`êYÃáë%÷ûýñxÜï÷ÙÙ›«E!b·ÛÝÛÛã*WKÛÛÛJ©z½GQ¿ûÝï [[[{{{Ìî "ûÊñz¥”gΜY^^>888>>&¢ã£H)Ù¹¥”„Fk½°°P¯×kµZ¡P¨×ëpxxÈ!d|Ê\J’-,¼Q·Ûeh. œ‘cL¥R©×ë\èèèˆc»™à€RªR©<ûì³þð‡/_¾\.—wvv˜I┥÷îÝ{î¹çVWWYj___ÿ›¿ù7¡Á`ÀÊÎF£qúôé½½=cL©TZ\\ŒãøþýûÜùƒnݺutt´»»{ttGÉqŠçyqlîß¿óæÍW^yåøÀõë×/\¸€ˆúЄLü8Ðîððpgg‡y”F£ÁåÂxQa2y`^…XYYáè€V«•”ŸJÅNÆÞïz½žMÔª”*—ËKKK^µ*Á(w:õ•àÙÃAlú?<«4™ÒH ¬V"S,é‘ò|Lk¦¡PBJ¦q4búÊR"’1 ÁÞw"I¤D¢ÐD6šCDýQØŽ¥”„R)…/¤dõº‘òx0DB–J¥1`³?h¶Ú¾ïEÏSJ% ª´ö”RJuŽ÷c­)ŽÄ‚R”Òó´RC£1±Ž#‡FG‘@£d#J’P*„‚s€– Ïó„ÖD4AkCOËZ¨HG#¡Ô¡CR¢Ô¤<á‘ ¡4(µ0$ ƒR¢‰ˆ^¡èÒ.D)QJpŠ|ƒcIA”°RBšbL#ÊrÅ•hmó=I‹‰"2I-OÐZXYÙ€´f; ¤HŸñ~VÜ›ÒZ —p mÆQÅO­ÎWyj iX­Å±–ðxÅ¢Ýö×áTUв®Pk¦éºi2y÷OˆÍn·P(TªÕB¡ µ†Ñˆ‘p†áxcà È OE:6@`´&"’r¶1k>È "%8F²…òìL‘«´‘6DÚDQGQÇ4)Qí_ CI ©q\X«’Œ¬b7ÒÔÄV>@@V°ä´²²ÂˆøÊ•+O=õÔýû÷_yåöÆê÷ûqÇq,n¼ùðáÇßýîwŸyæ™}èCO>ùäúúº=ïJ¥ræÌ&‡£BLµRŒñ‹Åb£Ñ`šG,—ËœNU µÌódb̈•±!{„+›Í&g´f™x0ó¾p±*. U¯×•R\B®Z­Úw·²¼Î?Y÷EQìMÆz]ÖDzʎëX‘Ë´°Õj)¥x†BˆÕÕÕw½ë]_ýêWïß¿Çq£Ñà¯Ôjµz½¾°°@Džç>}Z)µ²²²¹¹¹¹¹Y.—í}féDJÙëõ4Ž^ïðð°ÑhŒF#ß÷G£ÓcVÚ»’ÓZ.f%„èt:œ¸\.3{Ôï÷9ï1KÿÕî™\mooìííEa¬<¹³³Óívú§º^¯_¾|hƒÆ#q 2@h@k0B‚ (”+¿P ¢qc@ˆ(Ž»­îqT©T¢(¿(‹• /ÐBÄ"ŽPFd"MŒ,•¢ÑˆÅn‘"âØ˜V«5E¤JID eÐNh'Xž„ DˆÊ~Àb1Cid$B·ÛcÙZkíû¾/¤Œe!@)Q)’R#’@€d¤¤x_€”Bù$% 16àRM!P ”„cã¨ÁYŸ‡B (,,È´,&¤ÂbÇñhâ›â¼b¥QÑxlMlèÔ2™¢Ž2•D)Í{jåá4ûÝá¨g«¾Z]·ÖZfÝøRB+§l·“ hÆ@jÀ²ä*F¡A³o?bâzÄ7(2Àê))’ 1dTZ¦6ÓR0žš ªT1BtÇQgÚU+¥J)ѵz)e¡P KË¥Ò󨾫Rõrbn¦DÎÖ¦É|“Y®–Ù®§Æ.†˜&ñu÷9Ýž„5q5Í ƒÎçjuüŸø=Ïó”T¤&c˜§`Ö œ:uê‰'žxöÙgïÝ»wóæÍ×_ýÎ;l`6Z“͇[­VëÁƒ÷îÝ{òÉ'Ïœ9S­V¹®Á™i›Í&{M'Œ JAÄ¥¥¥Ó§O///W*•¥¥%V/³ÚR#%"²W¶-bÊ6Vô1Õdu«U  …Á`°ÜXa)œ3à×ëõ³gÏ®­­QjFœĤ;À:+ËËð¾3±d€žyógϲZGYXXB,,,Œ£ÑÁÁÁÑÑÑx<^]]¢èõ×_‡ßþö·WWWëõz¥RaÒÂ.èGGG+++Ì3;wnee¥ÝnsšÁ`Àëå’õz½¾Tk·ÛÀ:çN§ÃžçÕj•³.--1‹Ãóg‘taaµÌ+DQÔh4X÷È2=ku<Ï;sæ ŸËå|UvwöàÍ7ßüú׿EÑ7ž~úéw½ë].\xðàë¬&|qq‘á›Å_>©(ŠئØn·ŽŽÆÅ‹Y›}÷îÝ7ÞxãÖ­[Íf“¥FDl4W®\9wî\­VcØÞÞ¾yóæáa³ßï÷{½;wî°!`ooçãÿø?øA&º¡ÎkçÓäÛÁäœ3ϰr˜}jµÚòòr£Ñ8::² Âì)+QVWW=Ïë÷ûÃák !"«ô™ûB°J†Ë()áq‰!Þ^æ‡8¡Tåz­×ï–¬¬­c $¢jõÆ ª:ªêm"¥Ç%i|ò5"pNjd ¨‚€ˆŒIÃ0 uLÒc|Ai6Lc Åq<CË—[J&€Œ1ß[¬VŠåÒx<Ö½(2F –|OGýv«×:Ž}ZÇFˆ8bãbì)á©ÄÆh’d´Ž H#DF›Pj¥Ì GÅ@J) hŒAFÚ\€H¦*÷4ÙU2¼ÐižBC˜`"CF"2±V <ˆQx ¤i@h» ôÓ2NØJdY$éZ7= !±Ò+ëBFD"žØ—˜U©Åb‘IÎ`0`×ëõ677>|øÊ_¾uëÖíÛ·[­ÖxĈUÔëõ÷¼ç=—/_~úé§ÏŸ?oo#ãnëADVEüÚk¯±Ç^²VÀwo‹Õù€Õ÷ú¾ßn·Ù8Š©$¯Ý* q4[‚'œ‚9aøîPšðK¤¦z3ˤGQcfÚ2UZDq]ŽŠv¯YÉÂOYî~ˆG£a±´+t³±ÐèŽ[¥FÚ Kp¦HÏE¤N7‰Ïg‚w”ÀIhÐÄgØh?Ü¡RÊ÷ýhc ”R§Î"BI¡Ñ…þ¬” ÇI8…œäšÈ5‰1T+¥Œž2Krã›ÐÒ'{áØÑÞî0X“§e´Ö~Š,;ÎÆq˜b|N2–f€™†f*œÉÞ‰Ïgw"šêI‹ÔCÒh—Í#Àv7¸+>—dò q4•ÿÕRИÂüä‰H¥2¯Ñ}Á.­M²åØÝOö“WLŸ¹Ý åØt'›“úIXݵþîÝüàß÷¾÷-7–w1HÇFû¾ï+1IH ð“0-"ÞÃdÚá¸ÏR2BC@„‚`$Òüð:ŠÃ0 Çã0 #Ô|A¬ÄÒ]»XëõFDøÚ¯òŸÑ0«×ëþÛr‚Žn·;Œ•S‚›}1(úììî´ÛmŽåe÷™V³Í5 9iå;wû¦UìXmNs#ˆé{žÂ"Gˆ«:¬FHÓ”‹€‹Ã[ÜEñp&ž Bk[²´ÇîöDUÏmRs¾1Fú ‹¤RŠcŒ‰@沘f½@'©O#Ò™›SY¾-˜òC§Ë,3ÏSÝÓÅ8œì¡•oÐѬ@оyAHBùW¢±Ž"¨X3 AD`RÎ:=DƹF)PaPˆ„£õ†œˆ#ò„Öĉ8Hà?|-x™&§Q³ ™›âBµK{(ñJ° Ã×äk ]’–Çì0M00·?ùçnÃiè>É/ÜÅîËy6s»Ü9L£\)ÁËì¤êßY͆ßLÙ N©¦]ؘÓÏì&æ$yDüi[f‹ì¾ez·Ýæ3€Ÿ<ÿyÏß"u®ýëoþõÿü{¿ÿþ}ô}üðÙËWö›G ¨Z[ˆ‘5uAº-ó ú¤{a% Ö÷„aˆ¾Bp2GÖ_&øŠÀ2ÖqjJÐZ«ápè2&Œ+Ajw¯‡WTJ˜J•p=Œp}Ïg¿ÜÀ+ŒF#.Ž´°°púôé‹/nnn¾qëuöèÙÞÞ&".-Ì™ÊåÀ†@` IDAT²Öúµ×^{øða¹\þ¾põêÕü;yãò¯åßÌ?AÇæ=óO3¾› š,kéΖˆ$Îö*ä¡\4—ÒÂ,”ó¯èäÚf"êânpœî,INH dêgî‰]H¦gû<6‘ƒqRsJBrZ~OFëv ÉÃ4!ýÓD«&R“+a[63'?«”su&m ‘;¯)âi*€ü¹çÛ„ïà¸ç-ç”ξFIžîd˜ ÎX3iÉã"îyÍ=¦¦aGtlÎ|ÁÞ»}†ó®p~žê ˜ ±ùé §Iþ¯S7÷ÚùÿW4wíÃy[úãhÏ>ýÞ'þÙ{þ«ö_+¿ksñÚ•V¯ÛkwŠ^ i"/¥å?³ü-›•ÐøW™V0$ë Èr0c$$aô¬£µGþ‡ÿÑÀÒ€UÖ™4ç9&L«CÇ!Y¯J3pJ%‘ígA)¸ÏR±Ìf¹Z­Æ 9S‰ç+¥[ÎG£‘I#©Ù¶Úl6_~ùå_ûµ_»~ýúòòr8žªz‘lߣÁ´=ïî¿K`¿äGAœd¶µåê’!Ò¿¸(Nh‰Û¿pÞ§N$]¦1ɯÓèÙžKœ„Kkm?Ö° nŽèéY¥%YO²oŽ  «åèjZ¬ÈëÖ žÚ·i,l¿ÅE#ì›ø¶þ¢˜¤ž¶‹¶ýXIÔå ] DD†&)­nÀ8¡ .K›W¥‰0eíË`Þüê €@L<‹ ‘&£‘b &Ä’ŒÛ¿mQ B`ã#ȹ b 1¤:®ü”`VsžçѨ À4„ˆ†&ßÄTË'„Ф33q÷І&yŸ0ÇÛ¹oÚí7VæV>Êè8Ý܇Bd/ûäç¼®WççÜÚ'Lòyÿû™ìÛ¬7y/ògú6ÎwvM¥ùý,Ö«•ųgÏ¿ðû_yò©§Šz£>éùÊã¸x$H½ÒøÃŒóR˜»*R˜2Ì’2ðý"ûOz¾’’ÿ±k>r %¥Oý_ûOÿq„)Y©!Ц±å´ÖLÝç‰L¬"r\,Ãk•ôtZ¹ÁF=zžW]¨²—é7¥éF£Q¡Pøã?þã_ýÕ_ýÈG>bŒiµZÀ4ÐÏÛú™ÍÞüÌ-µ2ŸgÞO—R’}Ó‘ÏѸ£X,Î!‰G: !…à„ ÒV%BG™lŒÉ,Û±1Ly^Øi»3±$c’r{ù]²ÕŽ!¥£fº.ï„®OÉᤆC´œiÌÄ¿ˆhHcî„HåˆÈùä¤Þ;M çä£ÖiJj×D ©¦!CtÑɇNÈ»‹²…ãáÖ3v/!NW’ž€ ×>© È)”ã áî 9&.—ðD…B€°Xè#B’Z9Å4³ ³ö|ÞÅ9ù:a{fÖnŸ[ÌÆ ;K€3ßÊÓªy3ˆ@d´6)¨K쾆ÀPBÞ ©BØÎßgO}F@:ÍOfƒ¸‰È@‚O]iƒˆ¤—T àTÂÆ°èÞÊ»Bˆ0s eν¼µµuxxˆˆ…Ba4½òÊ+¿ð ¿†áÒÒR«Õ*•J&ž ÄîÃìMœ¾rîfÁ#Ü~Ó^f—½ED 9NÅE4Nß6c7Íà¾óú=(3H „àÔ¹³£»ü89R,ˆ¬ÿ w¥õ„gD–ü¶€£bézBöä °ÄuÞnÛ™ C¤…à`"2d,éuÕJ½ì»àŽkåWîÖî€õLΟ¸pôföräZ÷ƒek`®'k¾M×ÈBt%Ù&'ŠM(Õº2ˆ49ÿ!-{Rïl˺üpÂ9è<³oºÛëvû¶§Ó÷=Ó¹»¥ù†©3]f2.ÒÈ,33áü‡×Zæ‚ÏäðDüŽ4/â8 û ‹õOþôÇ^úÞß}àcG‚@&¼‰€A“*š¹6_ Ó²D‚iq"éº5<•fí.©0Ítcåe‹I9b•R-¿–”dH#,L[ùƒc98²Â#1q³ØœCDô0n4¾ï¯¯¯‡a¸¾¾¾¹¹EÑ©S§¸¼Òùóçxèápè«$\†&=Êaä¯}†ªeºš‰S2wϪp3^Q™/šTp”85açƒ9s Ý+WkAi.7AÛ…œàž—;« õ–ئÑwœŽ‹&Í(ëR;ºHô¸í”a¡4Þ†}ìpèù‹jõÆèx“N^æi9^¦û&­ýÇ€'Ò3Û!¥Ù˜5Ŭƒ§² ›Zȉp7$vÝé¹8E A"„Ô!Žˆ™”<âv‰Yx-‘ÙYMÀ°—6 «gJIïF½ë}šÏÚ&(g”3€ÍíÍýúÛÀÎù¯Ð4½|až÷$*“«:³ÛK„ùÑ—ö£7w7Ì,ü6ÚãöÐŽƒÁéõõf³ù‘¿÷ü¿üÚ×ã‘øÁ HÒaðê Í¡´ò¦4½ÄŽÆÄZsð’RD鉋‰EƒD”²a¦œD‚¡ %·ÃaŠ»Mê3Å„–ˆ8ž••ÌŒõ8û‡m`ª¯¦T):«Õj½^gY™ ºq"Ž|ä#¿õ[¿uåÊ©V«£ÑˆôÔur©Ë[F5¸Ÿ3Oñ˜‘lÀ¸ó337÷` d/*ÿô<éNÌ¢ JCtÈ`;×™“‡Y`jrY¾yӦʾO_’”MDDi™B3íUëÐx™ î?ÒI•7KMó(;Lî4 plÐÖŠX „‹t[j7ˆIE!D‰Z•2ÆR¯)1X”ZMÄh°ÔDs ¡hQ4Á†ë½¦ º›€ ´Ò}úu¾ï|ïýÞë9çÈc­¹ç^{§Ïé`ÅY§N­½¾µæšÏñcÌñ°]zÚ⮀ }·ÿ[°ÑÆì,Û’ç9¡B²UŽ)(ˆu7*€–Ä…ýùÊчòæÖÖ†§Ä"æfêf¢ž˜ ‘ 9Ƙ,Ë<ÅvXEï hޝ¿¨(L±Pñqƒ»CŒ1¥,rÖqDR d@aõÞm@[äÃÒTÞ ²cØ¥ƒ¢c4:w6§CÀr­AOÑ`HJ@DÒš3 ™m‰ˆ(7D&/Ö­ °Ày@*Ât–e•Î i@JxZk$á«@gE±œ8€žD¥jªßï³Ñdž\]]Ç-r\nŽn&„ð}ÿðð#?sp."òË(Ï⸹G.AÇ̪2þgë¡2D•Os †2ćpr¬ºób_ä$˜RÊn·»¶¶¶»»Ûl6Ó$ ‚ ×ë…aÈ9?z½‡Á:sæÌx<~òÉ'O:µ²²Â8wuû©S§N ƒµµµ0 £(êt:ÃápmmmŸGA°¿¿¯”FœÔ™£ÜÔëuNwMRPnŒ1¹1q’×BUóý£ƒCé›Ü¤PóVVVâÑÄmÂ0TGšB0º33Ä­eÍ–½ð}ˆ8ª]­V³j­ñx„ááá!¹ë÷ûFcoo¯Õhpâç(ŠXgƤ@T¡g¹Vé:tÿ™•ç¤ÂëW‚óüÁ3ûâ R­ ½g‰>çCwý6T®íŽ«ŒÆ<©ÃÙÎ>¦±1ÛøÏy7¾;+Àq%g–°¬§ÏÅÁD…ꪃƒ{Æ¡Œ9å-‡•ç ‚ö)eÍÑ@-Zǰ–Ê(ئ´ ²§q–F[ÉÕÆFà`[Ê÷ø¢ÒEB,–Ù?›²ˆŽ–þui±„Þ}õÂAñ¿ ‹ n=•éGçX× » hãdp ¸húÑJ„ÆÎl?ZÙ•FÂ<(ºýr·=á@D3€tÛ¹À3ŽÏ’}WIe8—ú¸zu·Ʊö²¸ÄË~´LØt*ã€rj"bïöF£!r¼è )åÑÑË…,§J)/\¸çy¯×cíQ·Û5ÆpðDdéy0„aØëõNž<Éh’$Y[[F­V‹£êp2+N`DZ_§ýa³Ö8uêôÁ°?÷´”­V«Ñ^9ŒÇ±Ñ¾ï§8 Ã0ÊÒñdÒn6§Óéêêj6ôf f²9p,'šô=eÙ0 www Ýn7›Í8Mm°ß÷9ñÔÆÆ†ÉsNâÉù@™‰÷}?Ïf˲2¶‹ÜÞó„%7Uí"z‚ÇÈèϬ¸{§²ý—rh<ë¯ßHYäìÌ£/²ûÇ<´]o"®Ï¬?eøK^þðÍ.ÑÅÁ)¿2—”)´k ¦ÌäÇ1o*€•R5?„ü û.Дƒ£¤µÐkE -VŽó1C5?lÍdЉ³p͇n¯ž?~p)û ËÖ •ªKu±}KQžæ1˜KWfýBSùºE—óÀÒ=ŒGØE÷uSFkBk=‡¦¢,6d9mÃŽ#¦‹ƒïÀru” `¶R©-Ç…â>¢àf¬b¹2va~wY”µºq—}! [lõûý³gÏröèV«õ™Ï|æÿø³³:Nù—ù…/|áOþøã×®]“RþéŸþi¯×{ÛÛÞÆ1g¤”‡‡‡Bˆ••Mùh42Æœ:uŠÓ/*¥®\¹²¹¹Éc¯]»†ˆüÇ,¥|Ó›ÞtâÄ ÞzN§Õjõû}NìÈùJã8–Ê?}ú´¡Ô$‰ïû °^‹A§I|êÔ©<Îâ< ”gòœC»s1ß÷WVVX¿†a³ÙäÅëëëaîììØmxâÄ cÌh4bUy½ÙÜßßo6›ëëë¦ÌV¹½½]ó}fùG×™N§JúîJ›[Μ^ÒŸY¹ÙOTH\w5.>öÌzQÙn‹_¬ŽØsDçŽkíq]¾‘Á™Û579Ï9ÿÖ).ñ/¶ÀŽXá z+©¬·Ê€»ƒSY'¶þÒü­É™ˆØ¢ÕjEQÄZÜ¿ù›¿Y]]}ík_«”ÚÚÚ:wîÜt:]YYI’„áÖ÷ýÉdÂ)­:ŽâððP(äP¬½^owww}}}2™0²"âÞÞÞêêªÖz0(¥Æþþ>§…‡¼ 8~Üîá_¶w:¦Ù´à!æy®ã8mŒ‡é41[+Ýx:%¢ ´Öív»ßïomm­¯¯¯tº£ÑȵÀóÃÕÚdfMMé  ìB…çyœ8’ÿÇñÑÑÑ… XL¼xñ"›&M§ÓŸù™Ÿ Nç _ø"¾÷½ï5ÆüþïÿþW¿úÕ8ŽÃFí®»îºë®»„·ÜrËÖÖÖ{ßûÞw¾óW¯^ýÄ'>‘¦é=÷Üó?ñãñ¸Ýn¿ãïèv»?ÿó?Ûm·íììÄqÜl6µÖO=õÔ™ çÿñ¾ò÷ÿþ?~á/ö&£ý†×þèýP ć?ôá'w¯ì¾è…ßvËÙóÿù[~´ÖllíîtÛí÷¼ç=wß}÷t:ýÈG>Òívø‡øöÛoðþ>õ©Oíîî¾â¯ø¹Ÿû9¥'Ùl7Ú÷ßÿ½÷ÞûðÃ7ïýÞï}Ó›Þ4OŸ9såÊ•ßû½ßûÑýÑííí{ï½w<ðƒô<ï#ù'}ÙË^vùòå»îº«Ñh™Û,³P.™çuÏÂ3¢ã7դŭú Je-¶gñÚî>¸á3ãç¤,òLÒ±Ðæ‚§¾ñúço<¿’1YÙÀ*¡0Ô†yiá™M´pÒãÎ*,Ï.F=5™L˜Ý櫜«]xÝ 3`sÈhSÙ] ^ ¶V>³@+„@,b…ðGmLŒ1é°rêù,™”çª,¡¥óG4umƒ‹ 1ë‹[›5b"§@©œGGóFÑàŒ¹”Rg³pÇ®ÝÜâráª?Ç I,Ä´ÓZ©Çœ×c»-,”ø8çQ·8³CšŠ¼nf­rûbë©ìûãD¨ù WîëI×ëu6€`k¦S§NýýßÿýÛ~ìíˆØëõÆÁÁA·Ûýíßþíw¿ûÝNç]ïz×ÁÁA§ÓÙÚÚzõ«_ýýßÿý«««ÿÓ×Þÿþ÷¯®®ÞqÇ»»»kkk“Éäcûصk×î¾ûnöqÿÀ>ðž÷¼çÌ™3?þã?žçùÊÊÊOùÄÕ¾÷}·œ¿ôݯþžõõõ,IF£Ñg?ûÙsçÎýîïþîO<ñ[¿õ[?þxÅ¿ôK¿4ß÷¾÷Ý{ï½wÜqÇ… öööžxêÉ?øƒ?8þüþá>ôÐC÷ÜsO?øƒ?xíÚµóçÏïíí}êSŸzä‘GÞò–·´Ûmž£W¼âïxÇ;ò<¿ÿþû?ö±­­­½þõ¯ÏüªËyýÉ7n¹²>ß|À3.’²H徹ͮ{“*²òÓA×ñ”óyàÙ‚¤2§ØÂ)Þ3f³–³Sqs‡ŽˆÔx0Ìó\6Âzœ&Húžò<)Àó½œr¶ÿlÖ[L‘ýÀƒRÍÖ[ÀªcÊ Ë2öÅÄÒwˆ„R¾ï×ÊL¬dŒeVÄ"O×#QJ (Óz{Šˆr£]-te¬Â%Py6‰€BpÖ!ŽÊYp•“öÚµ)+¾‚` ªj˜k›™ã-lߥà.‹rø"p±Í”?•`ØRÊpûI›\kDI†€P ©¤’B" iJR™Í" 惄$Ánà<þDdpf«…eVv.$i£Á àø0‰@J%QÁ™†1¦Œ²ZŽ$ ñÊfå3Aá}KFmŒ¼Dáð;óuæõfíòPDa–Åíç¥hŒxû#’“.…BBÔÚä&AJ~€<>Ü`é)YZ{Õjõñx†¡*Â$ÉÞð†7~ù˽ëü•ŸþéŸ>wîœô„ôÄ$w:i<Ù8¹¾½³µ¶¶¶³w-lÔnyÁ%ÏóÒ4½ý¯üö—ß~ßg>ûŸ|÷÷tÛ+iœÕüðá¯þãoüÆot:8Ž%*åyñ4ñUxµ0I”ÖüPØé@gæ¾{ÿ*åýL²¼áöJ4ždH¯üŽWîõŽÖÚ«ÞùÚm·ßñÿ|ñ‹ÿê;^R†t–'Q|÷ï’(n½ü‚¾àÖ¿ûÜ¿¿çž{”R­VëÅ/~ñ—¾ô¥»ï¾{<×jµ~ôߘŸú©wFQtÛm·}û+^ùýÍgÞø}w×kµ,IZÆ#ÿôO¿ø‹¿Øn·7668jìwÜÁ–Ï·ß~ûÃ?üàƒ¾æ5¯18Óï‹ÈUÿ,ÝP•=»œŠ-ÛݽƒÎñ¿ûirŒ:«æM\ÖÐuÝz–UÍur %!sÑÀ[¦lé1#Nþf·mDT$/„<°ºj³àV\¶7ÝO\j–ÝÈj-”+Jè¹·N¾M™á׿æ'r¬:&˜æV…½6sß™mŒ¯<“æžç)$ S”QJi”€’ÓÐ!*ÒH4†Þ“hÇM -Ph4È!­°ˆF¢ðyû4‰”RB –tnH)å{˜g™ÖÚS Ïh¨QxžA­V«ÕÃF£Ñl6[­V³Ù´i‹fy`·TS†µâ¬‡VMm%ŒE«"÷º ‰óeé3°l7>å™ñ;7R!.ØOU:Ž”i%W;&îŸÜÓw°+-Öl[e[ä¥mÃù³ØµëŒÀõëwk£…ô½‹½¨t-+Kš¦Ìö¹¦‚îU$l*51v•Úat[n=ñ8¾Gžç'Ož|ë[ßjŒy÷»ßýWõWì)DDqsøçܹsÅb4¥iEQ³ÙBdYæyí¿üå/ç%´ívËØ|Á¹R®<þØí·ß^«Õ„ì°ËòÄSO®­­±²ïû{{{À^Oõz]‰x/ ìr| IDAT7••>]b‡@«M‰ãø‰'žØÜÜœN§õz}0´Ûmöªâ¡Rž8qb}}5ó¢ŒôΧWQ%I2Ù’ãXôÖÌ/ªã–SåÓOû¹ëwÝ;ÏI‹•ÿKãÙ¯›š…ÅJD)lûKIKT•RÐþöb)I\º¨Ž»¿øŒû¤’JIf£8c AvÒ-¢ÕK.°Ân¾œûÒ4eŸ)½˜`^ŇóÚB,CÅbiŸeùÍÅÞÒ7CYdéòÍ~çí?ݾX‘š­©û¢ûuK‘ÝA#"còņÙú] *8}9 æe–AVUZ¸Øk{ÇvM,7¹Å­Çí,.«ŠˆL‰(E”¶R•ë¼Róq”KF‚Õ÷.f.Œ¹p™E÷ß÷Ó4å8luçw¾à·|øÃþÄ'>ñÔSO½óïB ƒÍÍM¥ÔÊÊÊt:í÷ûìœÃ[½wØ‚`ww÷è舛L&L Ä]þ®Íqb§g3˲Á`°¿¿ÿ}wß•æY»ÝN’$O#2¹òÔÅ‹‡“‰ÖE4Y"Z_]ÝÙÙé¶;ìIŨODìÑÄ}aûK)G£‘RêÔ©SÙjcc£^¯ApõêÕsçÏdY«««ív{8fYÆ'¢z½>Î;—¦)»ZEe(Ð¥$rqÑÒ³P÷UÊq•Üe\¬Ê]¥8/Wø—ò ŠKìÿs¡õç.œÕ2ÿÀòY¨L:o%”Râ\ŠÀâIBD(#‹³8,+° PΟCŽYÃ!Îç°åkÊYp НJ‘7Ÿ›Yh±±.™%·DÄŠv€\¹M¸±œ Ù›³`¸`¶ú [è.gúœ8ê#÷pV™+ADÆðYlΣ%ÄÌ%  vë´` ?Äæå.à^» ^¬çFÆg±ÎòbîlxM‹ÇÊs–·lc,£&œ ¡Ç‘H^мü*ûÙ0Ñì”Úí#;Á3ú2^&I"„X]]}÷»ßý±}ìãÿøm·ÝöªW½Jaƒ;2¤>}ú/þâ/î¿ÿþ­­-Ò0O:Õét¬D­VÃÒŒŽ#ÍA™Î„JÞ‹íŸyr“$iµZ, ‡õ¦çy£h$É€Ï|ö¾ûxðë=ÙŒRmΜ9EÑÙÓg†Ã¡ôùügišò’HÓtÿ _øÂ}÷ÝG„ãñxóäiÑU²5š\XŽ(5¾þõ¯êSŸ:888<<ìv»,â3?-\=íÏgÉKwSEÕ¼Èi]§Ø‡ãž1•°R…™ÿß”qþ(’žñõܘÌóC7þ!;‰L.çÞða¢*¢ìšõ2 !1À•Æ_çÎbaÜ­p³Ý¥ã/kÛŒ1HA^R|cŒ!]XÛÊ2˯UâÙAYDMœ×vÚ`å¸ýé’¿ Üx÷¾¥JEä'†ª½SŽC5‹Ž{]Á†E´á Í¼[Ìó„ˆTáá9gt6 Q¡ÊãøÕy«o*—í‚Õ¦c*5[T¶cfÿêšÚຶڲª%j" ‚`<sëétÊ>µGGGiŸ8qâu¯{Ý<ð…/|áÛ¿ýÛùIŽÂÁβý×ýñüÎ;ïü±û±0¨ÿÉŸüÉÖÖdYÆ)8ã8ÆÒH‚›a_r4äV?W öö÷›í‡¨ô”RB~õ¡øwýÓÛ_õ¿ök¿¶º¶ñÞ÷àpoWgùÁÞ~£Õ”e.tË/ÝhltyáÂ6ª:88Z]]¦A’F6¸³ ÄÒ¿Pª²ò+?·öââ¼õU-ö-[¡%8°ÀÜHYÄH¸Iü¾Ùj¿¥ÊqMúf‘bwäŸÍ,Ø^À(¢*ë¶ôXHÉ3¢j¹þÒ-iKõŽòk5%«¨D™ÜFáss]Äè°‚ˆåӀχì 0ɰ–Y°@%+¨àÒSz]ÌøÆLy…±rAîfë©T²¸hìXѼ¹¸{N^Èy„(9a‚ª0r‚|qôp^Ð\ÄZ 9•öã¿ï¢ÔÍ Å1ÏW8W?OD`ÐÊ‹®RÝj¶Ýåöšè؃¥HäêŽk<ÿ•Åß8ކ¢^¯ol¬=öØcœ+“³)G™f«1¥ï öwBØôŒ=Ïk·Û£Ñˆ£R÷£,ËZÍV?÷¹Ï­­­½ímo릩ÎÑÁÐÙÓ§‡Ó‰í‹ë1HDÖbƒÏƒ…ívûàà`8"âæææ#ÚÝ;išJ)Æ¥[nÙÙÛý‡¯|åÔ©3~X›N§i4M’D¡œ²i<§IÁÖÖVШ» *Wîço1ü³‚ºÑh¼øÅ/þêW¿úøãŸg”)½‰ÜÑpÿ´ôÚ…{§òE€Ý¡[Ã¥CZyÞý¹øÖq¤í¸ÑXZÕqº‹A8q9ÜŽ sY©ÁÌš ÚŸ¶Bœ/b¾Øû|˶Íív›ˆ®^½Úï÷ÛíöÕ«W?ò‘ôûý;ï¼s:2 ŽÇc³$I.]ºôµ¯}í¡‡j6›Ÿþô§Ó4=qâDœz(INH ë@Dl½È¦Ý¦4u´9ßøÆ7N&“OúÓ½^www“,{ùË_~ppðè£N&“¿üË¿¤\ó.g42ó¾ÿˆ3C-^~À_ô<ïÍo~óx<þä'?yppÀ+¿üå/3ì­µæ¶Að’—¼äÉ'Ÿ|à<Ïûó?ÿóf³yæÌ™Á`°¸0ÉR:õ, ¯[žMÍ•ô,)Òq{á¸òl¾õÏ´Üà‚¹ÙJ˜\d:w£,[‚Lö_ÄžžrÞx{é0©tUØhðKL¦µfÌ7ÆÄq ²&APn2ë˜D`@ ò””RSŽ$ØÛÁÃæP꾘üåyŽJ.§™I ÉF TJc imt«ÞJóB° Ùç8ÓéÒ±Xd¥Ëñ.øDd±¥ „étzúôéýÝ=0$Qpî^"šL&õzÝ.ƒ¾àE¿ò?¼ë“ŸüäÏÿÜÏAª_þò—_¾å"J!¥ìv»¼……+++‡‡‡oxÃ}ôÑ|àaÞyço}ë[?úѢ̓[¬ð…kž\GëS‘Œí.8ŽæG¯Ï•.ÖV¹s=©Ü¹NÃ*EÓòÇ伦ç¸Úbމxe_1ŽÅ+p§¡<ù±DLÌÁþr‡l¾§ÇÝ_.)ÁùC[úVšCÅWئϿvÜIÖqy‚%MžÊs~ØLÒ,'‘&©R HO )PˆYúÃÜ ìEíö.3Zyž°¯ µMÆä¹•òA–e¬jäó ‚ `d­•xžç•â)c ²y8Iî ™rÖEQÄF""…Ï1oë´F^Tj¢ˆH¨‚‚»"ÜÉzXíë^û¾÷¾_J) ø¨™Ÿ©ël˜¢˜26$ÿ(6d9âB¬¤nk&ro¦Þ4Ž©¶+{¹…ÅaÙ¾µ?ó4«¬ï¢k%Û;X˜œ Ðáöb)ã, šº„ze6ªë £{Óòg®¶£D®bå0”Ú¯XÚÊgœvÐÜö@©$×ó±¯mýànr§U™Î­¢Å®"’XÄüâelU2îðZ¶Ã²M.3a ŸË²‚‡T³ŒË&TF£V«1¦òxê2À•¶Í|Óh4¶··kµZ£ÑFZëz½®|ÏŠÂ\y™yLoll°þieeEk=ƒ ˆs½Úlïm_ êA†4Ž/llƇƒ Óˆ³¬Ñ^Í ¢(I“èôæÉét4§žzêüùó¤ÍîîîÆÚút:õ<¥àÖý~ºÝn¯×cï£z½>™LX#= ¢(ÚÜÜŽGÝn÷‘G ÃðäÉ“·’›Úh4úý>Gàø_ív›‰ŽíÙõ1§žKŽÚ㊫,±‹Ä]ð•}qÜ箯‹[Oóüñ|sýzÚqp{Íe)=9Žþ-dANûÝwÝî»õÓuÇm±7Î7Öäzõ›<“BäZƒ þ«Ÿúé_|÷{° !}á+OJ)f9rf67n×4+¥iNžçQ2UB²mpZ¢"6›Íz½ÎÄI`à讵֊÷ “Ö_1íÈMÆ +&ŽV¥,JËL€1JxVÑg#[¡cöÂý±ÄZˆÙ?øg®s»-Yÿ–ç¹PÏïÑËâ‚pÁÀ½>îy{¿‚¾.ÌÃÂŽªœbÚm:BwƒcÄ|èJ;€ZWCÏ‚êqš[­³Ÿžµw›WÙänǽÅÿ[̾h탖¾bÎÈÝ6»"uñÌÑYû'÷­E½8>š¡‘÷”[Ëb-ó¦œ,a0´Z-vóM’„Es]fÅ^[[‹ã˜£½nnnöz=DäüÜ}æk…€Á`Ç1‹ªY–AÐl6³ÑXkÝn·A‚@0q3-à$¾ÃÉt2™ÜréÂÖSOÖëõi¯Ç–Û“ñ¸^¯ Qœ+)¸µQr0p¼n³õNîv»žçF#Ï÷/^¼hŒ RÊ(Š,e©Õj¸ãèèèìÙ³ûûû¬²~ÚUtÜϧ½Ü*­à¥qî¸~þ5ËõûûMlÀ³,Ƕÿ9ú\¦µ@RRžgy&}o:úRX”5Æ(!Q²Ç‘î‘”ËÆŠ.1w‰¯,tÒÂò±Ž †QP~ç-,­mŒ1Šó¥XßJ®H3+”tД¢yDz>–ó¼Z6A•Þè˜O‘UTÎõÇâ“@aÈÄq̚ƞÁsgv\Áe¦.í^äqË—¥ûE¡°DzZ~^)Y3þŸC{pe`ÎÙ%4‹ ›+4ׯJk+ÈT©p±òëlû í»ÎŸ*´’›éS³ÐËŒ…]!‹Õº"µ}ÝV[!»¨vĽÉõ°P8N‰ˆm¦’$‰¢h4I)ù´x›åy†!GØh6›Fc:r¼ –zƒÁ‰'z½‡w6Æxž%lc¡@–%,P²òI)U«ÕØk2™@®§É4ày2É“f¢b4 å]ºt©ß?bѲ$Žã~¿/Q´ÛíÃýNHÇq·ÛåÊ€£sôûýf³Éã™ç9§, ‚ Š¢0 ƒÁd2a©—³—cšÍæööv«Õ"¢v»Í¶f6wÅÓ.’¥«ëÙ”ÅáÞY\Ûÿ\Ê7—oX¤x0Oà²ùM/ˆÈ²‡ô”6Èz¬8މH+“ñ9À•ãræ#WtÒ÷Aiœ!±Ð®)V?j A-äè r³–NYe“NJXë"º¶BX* ż?Rñ?ZF幦´…¶?¥¬ªL‹!(8Ä …EÊûM)îØU¶÷".‚³Û±ðš‰øî…t‚Z2ADˆE°!æo\,_üt…²Ì!–™!ÓRN¢òîÀpåÉÅ&-nH·k•±âæÍâQ—¬ž;&®¢²¢n3ì…p"oTzgUèív9ƒºÊ)ùl{ìbfý-$I‰‹ rÆ0“zòäÉ(ŠNœ8±¿¿_¯×WVVÆÓIqø „°¦E,9ÖKÕëuDì÷û~½aŒ©×j¨0 ”€i"„Hò¼½²2޲ÉdÒju¢(ê´šãñ8h„ëëëišF“))¥8hœN§VGEDÓé”±–£oÖëu6cæ}<3`³K4«ß¥”ûûû|6¼µµÕl6Ã0L’ÄÝ#KÀõ¯Ýr#õTž_ºû*G¤pcÊžor³ãó\•¥Ð „Âî—o;>R@–çµZm4Çi"}o’$Öi69‚.›>SÓºL9ËPR$Y†¦O²Xb!‚2ër;ó¹?iµe†Š,{ìÅ„EÙ[PÊ¥Ô,™ú»ùÑ9©­œ‰Z¿‘ÊÊàÇ´§—Ùd©­p¢eÙÀ³?þø·}Û·1BÀóŸMeé\º8ºˆ[îu1så#´“¨f¹'2s®á|M3%"˜Eñ\Š+•²ôgåáEÜ] ±î]|÷¸ÍàþI/¸©Ø®ÁÂö®lrt2W3çn´Øe»º`¹Yì—q,¼¸Z¶ f\d†—ÕJ¬Ú±ÛÄÖ3Yš„ò8œë ¬Êfým­VcÕ1%X §ÚͲ¬ÕjL&"bÀcÞ‹%K­õd2Iò„ØÏÉxJx"I)=Ïó¢(Z[[‹&ãN§s8èñ3{ö{ž7™Lâ8î¬t9Ãñt:€0 Ó4 ðÙl²[3”lŠRªÝn_ÛÝY]]å$Áar–bÄ"Éñx<æhY\ YuýÓ®„ç¶T˜*XP¸kéŸsKe GµØ¼ßbB0"ââ•'o·Û|*„0DHĈŠfÖK1ËØ“Íþ©Lµn%à$‹•L$ 1†Àñü$")%3iiš²šKñUk­²,³V*ücaV8 4ÂÒM¦€ ÛX æDÄ‘•f¦¤Ž±•‚9–nÁišJ-ì 87ü¡—½ìe>øàÅ‹}/ˆãXJù|§3s—Ti \vK¹l{]üUÌÑ÷ ¢Àâ‚v¯çPdöS8a´+¢áŒ]Ö"âs÷y,iA|_ ê°ŒÀ]g+œJel+àWK ±¶ï8Šáb°”Òm0¾°Œí~eZÝŸVûd?Ôl6Ó4N§ˆh–ãtr0scØg‰aÛ”þ»õz…æ(Š|ßïõz½^/‚4ϬÓðÃBˆŠ1†Œ€Tç÷ßÿ¥K—²<—žbpB(Y—ôaÎXufªb Åj0 R(Áª Ñï*S¾Ú6@éyψ_ù«ÖZEQd#ÓZõs²¦ô‘²GʈÈ"©kVnæÖXr†e(yc î*«×¼@ñ….Ã؉Éóü…/|á_|òSq‡:|^g æÅ8—4Ûû >*€j×™+³þ„´ŽóRÌ™×cY`#—R3Ÿ¨ÚÈy€tV¬RíŸ*F^‹/>m¡òd·r¦À÷mHäÅa¯0Å#ãjïí“6°ûââ¬ÙoYlv9/=aWŸÃÃõµ5>‚ÚÛÛcÜÕd؆‘ÛnN­5Ÿ7‡Cן>I0‹â€-1ŽãšcƒÁÊú:*5Žâ ³4>sæL¿ßϨ8sâ­wêäæp8¼víZ«ÓN’äðð‘’/8:&Çá ƒl"„HóŒ#QcXÊgú ”Ç+++I’ììì0÷À™®¿¯Ÿöa··ä–>_a¶®óú·l¹©þ>Ÿ^l†Åªç»ϬädHk)Ežç_ýêWo»ã»Ò4õê¡.#¼ÊÒšÉRaÌlﻊmh¬N K ®&ŸXÚ$IÂïóáÛa0M ÃP)•ëâ8Ùòú[çz>‘²Ú`&ì×ËÁ7¨tꀒŒšÒ{„·%wˆˆÒT£€HGðàÇ8Aš¦*UI’pðz·{š "^ºtùñ'Ÿø¿ü¥ïþîï&I9äy–[b„ˆÂsiS5¦;šô\ÄNbÍ. Çê²Îê>>¨¶ìg|‚yøÄÒdž¯í€²Ô’¦)‚Âê+Œ6¨f­!räySXʱÒŠÈM"Mó|/^D\µh9ž vòý”aF Çw i­ ‘FâéBøAÀL’”ÒäZ–ÁD™ [›CÆ€r&š$Éêõ:Oç®5vm˜2б]¸<ΖŸ›±‚<ßãü‚J))E’$D$IÖëuÏSZk£5¡1 Óúç½q|ûíß9ŽâHDÑj´jµ?Æ'JY–^àR~;V@E }Û$˜¦‰—JDJJ…ÂWžô”‚•LŒ\­òß÷³$õ}ØyA§™²l/J=·M1NE>:æßíàÚ¸}öÃj–äZ Jé–í¼8U*‹Z!›ˆ„’þþ-oy˯ÿú¯øÃn4Ýn7Š"æåY,°^Åa­fȰ~®<޶wÃágËšsóišº„Àîd>«Ì1"²ÊÎJ-üš¦L Ý½Ä¯Ø°íá¿ÆqìR`§/>ö#§X‘ËÒ·Ë(ÐD´êV²,,¹J‹yM«a90V®Ú`ààÙ1>1pZ“]þk«Ñfe© ŽÆcËþ 8O­¬àhGÆýŠq¼Ì©´?ä8îëƒ È’Üµ´Sfœì –]³=²Cg§€!ö˜¨ !ìze0ËtºóâÖ&¯ww¾TY tÉ«Èî¶*!D­Öà ˜$‰.S€^Y’¡|LAHœ„5ðƒdezº›EõÕŽ§ê2œN“\k@РXâ‚I#Pi¨0C/cx‰#0¨ C`r$#€€‰P"‰ÄÁa© ñÀöý&É,ñB ¹V«‰€Ð L*aÎ(¢ÌGoÈ>a,V b{¼ÁJåÍH¶™"Oø{‡‘ b‘O¡ÌJ#q†¨$±x „€r‚ _­yˆt9/Cgœs²c$TqŒ,.Áá­Ñjkòå~ºÒ¡5¡Ö’Hp/Œ‘¢”¸ñH$  Qäð0KÁ€Ì€)ÊÕX`Û ¦P×j|âC$€ ÁX9íA@ž¡SC‰j@ZƒArú[ÐW- åì €ç³ó^áýOÆ!…ö‚k»{Áß~ö¾7½é‡Çãq6=!Q¢äìB•óчn¤0™’B¬”á ’Ùi·<Òð IDAT”X©”"m”*j•RhHqd€21ÈóœÐX|"r×ÙJ}ß7Θ%yLÓ LÕÀá-ùfÇloÇñx<Çlrɺ/cL£Õd9c2™¼ò•¯üÍßüÍŸýÙŸeFÏó†RŠO›ø k2[bÊB_Ûx~¢¸åNÇZ˜ç¿fÝ/Å}{¦UY¸íœì¡ ›‰ºõóO°‡ÑžÆ¹ !„àdö'–šÒBr Ñͼß~Ý…s BH3N‹­ØìZس?± ýÈóÎ$%MRË1G*œðàÌcÚŸvõÛ¡0¥e€^m§tµ˜9<˨ىvã'íPp+Ó‡¥m?I)Ûí6–Ç"¶µŒÊ–×±p"ÊÃx»`l/xÞnídÀ`0d#,~—ëTJÙøT¦µç¡f[bÏóX¦·9Fœ&ÓfF^`‚õ©“ÕÐ^= ^êŸ8œ M Ñ 2Jóšð"2¥tMDFë\Ïö Jª'¥”8³¯!9[$H`Ê=D¹1îq~™¹¹€`ШÎv#€‚* c¨0rᘿhY¡¹lKœP.Ú£}T¢Ï "äiænÁÒ*Yvä#d˜º“v|»ÝkÊsù¡Å½é¨D²›mðãlVJ°H"ÜMP «9F’F ¬DQxG"+×gñA$å„€pI–Ð#ìP€)~Ùö”XEÀâ!3]€$f=2Tðx(°Y¯¨Ç ì8£# EI ¤ÍLF/!æ‰FÑlÌ 0Qæ½ãyžl·ŸÚÝïû>ð²uÛË^z[ØjÇcY†¯p¿27X*¬?o^Ïó ÌòǸÂmqnÅÊ,” úüç?_!I µ®Õ+EYškJ='?É!‚ p"l”Yø,ËÀ`ÇÙg4öûý8ŽwwwÇã1GÞ!'Ìl½Ù`55[ìííýÂ/üÂýнùÍofGLþh³Ù4ÆðOáX~é²°’Á,…ŽÇcn¤µ»æ½'€\–°ëÞyÚlìC~’%Bš—D-8Up]ÌGª²õÛûƉ‰í® ÛxËåÙN 'èqœ&4F`ÏŠn BHœqH|úÈJ+,2#Å_aE1_û5Ï ¾Vf%¢FØ´«‚¿èB©û,od%~»ýø‚UÓ¢<§`áO—1ÃÝÒEce6F–•¹ãÌG‚#øÚwÑaÔlµœÈs*Uå3¶Ú!‹¼# <·›¢UoÙ:íb©móˆˆW‘ÉgGÎÖíÇó¼(™º=µCJ¢‘ ò³lª£T©µHBLñ'z@­íO²$«›f €>BDŠÀšB"’1¹1†„ÖªdùµÖ¥¬Iˆ¨­ºKJBÐZ“žeqpµK’‡§\ÒYnfaº-õe`ÀzM&Û„Ž;"ò/¡A!Šx±d IacË!+Áæ¹QJX! Q rˆ´¬ÜÎÜræ5Q(†Ö¥†Ck­S'»Š*ûÑ– 7iËâÊýEž‡²W6eèˆH;4Ä~‘ˆŒÉ펳ëœÿP—€]8çxŠ_žµ–89A‹Úä,ÂA}Q mìÃèZu,°þüŒPs‰,‰°`Vù:×oÍ)¬˜÷ÉÿóŸ¹ïo¿íe/û/ßööík»uÄn·›¤9‘FǙ…†›*Åà!sx³¡ ’Œ[‘œ°vfËà~àšÍf»Ý®ÕjÌw3¥5˹[~œe(‘ƒå~Œ ¬e©kbNÓ4³ÉdÒï÷{½ÞîîîÕ«WwvvÆãñÁÁg6…ZŠ6!øA& ¬olìï‡õz4ž>s浯}í÷}ß÷?žIR†a¦qáòlç’AÅZu’«ãcB§Ø-9î™^Ž_ásP]Ú [ùÌÞ·5[ÉØ]=à ¨-n{f· }~š]ñ0Ô<,Y""ˆ"cž)Õ¹¦ ëχ»žT¦©ðë-X—å(ðÁ?÷K“WÂ"µ»qÎVÀ“>c9–†K¬¬æjy. J ùèÜ6ÊI#9ŸäOR¤½úZVÛ½a7_¿°º¾×Ò>žkžÜ‹r¯™š æ!CH$‘x­ÎRR(”R’7Ó/@C¹‚J) P–e:_‚  aF|]_„À@ pp"p4C¶6–±¼2Õâ~±ãiC¥”fÁ‹@e…®i1–øn©Q-¡W^B¼hk~ènR»í¦°“[.Y„Åëëtp}qp>BÜ\—yÆ#¢”UÌæ6»æ?èHœÆô°Pb—øjŒ‹o™**pEÍ޵_±V•.×<¿r‡·d’g¸P`™(¿Xj“É„ >lmm}þóŸ衇úÚÜu×]—.^nuÚ•µ¯}íáµõ°ÖHóYNk*}|ˆ@ ÃNͰ™fÇ@¶Ë ŠscŒÎr­u¦sQžÛ¸4BˆZØð)0ÆpÍ<|˜*¥dCÄ£££~¿ODª fnÅt,…~^Ò¼*xm[0 ÒDÙ.Vx0ó‘d)+]F£Q–eQåyÊÔauuµÑhèÒÍ“>Ÿ¹ð§ùÄWJ)=Á.OBˆ,Ëx~Ó4£“ÓÛ@{Q×Óÿf#€GÿÍ÷Ö÷Ã(ÍâuXÛë÷‚@R#”±Ñåä:Íòœ4 AM¯.„ð„Tc$Í#È+”¥Ô‹R ”ižÅq *`s +ÓóâT%pcЕ!Þ¤'¨” ´1¹ÑIži­ [S„<ϳ<7eˆ9/Ù #$ ç<‹·€RJ§™«¾²Ø“$‰ÝÎ,¤i:™LjµšM0e—œ”’PZU$OºÝ<„sœ¥G%óO–î™È15‚ãUÇvƒã<«]Â@•W;D¼Î‹mâ{¦Ô~‘³Ay’ 8,ÛW0åÁ³€’ï!€2ñ†gKß´˜Sé™ò0œc)ptÝn/-÷Ãd5¬äˆ̵kÇ•JîÄeËlÕÓñ¤Ýns˜(Š:΋^ô¢Ë—/ç÷¾&Š¢Í“§···Ó4»|ùòÖÖ5åyÒ«®·þg|ÉpF ~€m¦nsP«/7Âê÷û–‚ X[[[]]­×ëë'ÖºÝn§Óa0o6›l^Äö̲´;µçˆ,µð¨¥iÊâ¯1foookkëÊ•+W¯^=<< 6\;:º‹‹Èóýñh$¤ô}ú5¯yÍwÜñ¯|»m°=z½^¿ßßÛÛc?N>iæMº kÐl6»ÝîÚÚÚÚÚ“o.¾ï'I2Ø£^¯3…m6›ëëëëëëívÛsì$ã™ÕàÊ­îxÿ³Æöh–ò"âp8t9S,¹òV«Åê}Y¦×èt:Ö¹%+SÉöûý£££(ŠööG£Ñt:µU5V«uæÌ™N§Óh4L®£(šŽ'ƒÁ`4ÕÛMŽ/Øn·WVVxѬ­­­­¬¶Z-n³_Ü#åË£££«W¯nmm±M™âò¥œøàgÿösZëz½~ñâÅ[o½õôéÓlŒÍ©y$ÙÌ>‚V«õÈ#<úè£=öXÇ<2Ì´Z­••èõzRÊsçÎI5y%{žÇõ¬ŸØ¨×ëQ=öØcœ¸pggç©§ž0Ƭ­­Ýzë­gΜ€ñxœ$I«ÑF8šfƒAžç·¼àÒúúúææf³ÙœN§[[[O=õÔáááßþߟ‹'‰Î4t}‚1HøYh®8•ÿÉGšærDP0NZõx`ÒÌL¢dM3£B¥ä‰v[J)¢Nó,NŒ1žRªîK) 'ˆ˜R6™L¾ü ƒƒƒƒñx캊…žÔZŸÂh'©—”HkæÙ4MÆÓÉx<ŽÒ$DBˆÜè(ŠÆÑTÃ,YÒÓ$Xmd¹}˜;a¦\[ü³mŒYYm3ãR¯×™"Çq< ¶®îL&“ñxÌ|ŒÕÁ´:+–ÓbÞÎÃnßXž7Y†Ø”‘;y›4v»Í;Ty¡¥Ë.ß,[nÀvß­s±xJÙ“AvÂfÊVjœL6ŽckxˆqV™StTÐj¦$J’dwwwggÇSo†Íf³Õju»]&š,Lpö0 9XGägø9::€étj•N‡ÿ T¡[µGpTJííííïï'Ùµ6MRJ6 «×ëœa—£/­®®nll¬¯¯³Ï.ûXÒÌÓ†a»ÝæydÞs}}×v½^?qâÄd2FÁ•ø8Ï¢ÑhY &"jµZü0Ûð36óD0»fm#øOÜÙ[n¹åòåËÆ˜ÃÃÃáp¸¾ºqxx¸··ÇŒc¯×ÛÞÞžN§‡½ƒ3gÎÄq|êÔ©‚Dú~­V+5˜Â„ªƒ7¡ äp«”ÉÞÄZÀ }€É’~4i¬®fB0ŒGÆdZ+DÈ'“šÖ|‚&)I£T0²†µÃ'¢DHcÀC™KüÖêHXÀK"6_Fµa†².·sÐ7‰ŽuCj4›L‡‘¦Ó\*ðƒÀó½L N“˜L¢‹ó‚@hMin $” ¥” D( ÈCDq®%‚d‘UU2ÆäÊS(Q( rêŒ #e á¶dšATB(”JlMo5Qb@F¡&Ì "&„š0G™ _I뛤€È+D––IˆØ¥ô‚–¯µ§Ù J˜/1¬,G¬7ZÛ[;N‡!Í,–‘«u@¼9CèâEGâ'¶™MÝl1 ƒ™ˆLymŒQÊ—i’KC€fÕ¶'¦ãè‰ñ“×¶v*ªé(‰»Ý._3Œqw! CÓCkÍ¢çÑÑѵk×ööö¬Ú™ˆ²,ók^§¤<‰ødn:‰|?H“¤†ZkåyyžQP«¡$I|Uxm …ÎrMùh4=88xòÉ'}ôÑ'Ÿ|r:‡cþGË3Æd:ŸL'RbGãé(7JÈt:‰ÆÍf³Ùl£Q3˜yž7£áxÔmr§Öºßï3›EéåÊCÁú^£™»·†¬D„’$©Õ«)åÚÆ:O¡U$0ß—DÓZ­6™Lööö”Rëë«›››Rʯ?z…3Á5ZÍ(ŠP é)BÐYx>ÕÌx<ÎÓ,˲ñp´}uë–\:yrØ|O÷÷vwwwwöv’,%¢v³Uó_yaP󕧺Ëöj­£É¸PA›: "Ì·Z¥ÂÚÊ:Ó2X²:SjV‹±.ass“ÑË€µz3dV&ŽcB#=Ñj´9VÔh0¼šÞ°?Š¢hmmEk}þüù . Òx{öìîî."ÊšÚè÷O5¯]»&k*Êãþd˜´ÝnO§Ó+W®ŒF£v»ÍÚþZ­vVœì©‘øù¾4å~ Fg†ÅµI­ð@âúD#¡ï‘6„ ü´j>³¶@šˆ¤P˜éšZèK(¥&‘Å"*¡¤@ †ÓÑ8 'Ó(•*`e;!|È3$¤¢z­Æ'ƒ®]$ОïR±5€P2ÒF›ÌhÔšRME›D­¡†J¡R(%*ƒ@‚4ähmrÒ"z*‚@ˆB“ì+ŸˆÀ€ÉHƒÆ  (ñÓ&q“‚—@ ßè |ÏsåoôëL!±„aÐÚƒ¦0ÐQ¡ç‘Â,ËòX+“¯6ÛƒÑ#MÕ‚@Çi elréXxXèøûÂ×½…ˆ˜e@”Rx§sADR(ÊSåó J†-&  ’êâÅ‹Ãá­‘ó<ÏÒ" Oå‡ÃíííbþêêêÚÚZ»Ýf!’ÅÄF#äðTzO&=‡Ãáx<†ò\“18‰SXYíž;wîôéÓ'OždÃænwÕÁ×¾öµíííÿøþC«Ý ‡¾ç€=¤aôêt:RÊ~¿åÊ•G}”åì$IùZ­Ÿº±°2‚ ð}ÅÁŒXÞmµZív»Ùl¶ÛÝz½N¥ë‹žY–yRÙ |ÊëÍ|¨EÜN§ÃjÉF£Á¼E’ÅÆ1_b<ð}¿Ùlã¼A DF¬:ã@¾;;;ÓéôÑÇgÉ£±öÒ“JÁ RŠÿܽmeÇU xNæýzïÕ{UÕõÑß­n¹[–-Û²„Í`{Á²g¼¬ÙÅÁóá <^AlxˆÝ 0,†6 Aìì€# ¶ec%[²-«%,$[’-KýYU]Uïû~džýqnæË›÷¾êªn yÈèè¸u_Þü8yòœ“'ÏÇtº½½Í"ç ¸|ùò /¼påÊ•tRªÁÙå†éDÄÎdLyù½½O²'`ÖFJ)766ì­D–eË ,L\ºtéÈ‘#,5Ú feLÐù@<™Lx"|b¶æ¬ÀàH¬*p¯u9‰áb²´²²Æ^}eeeiii8nmm)¥677¯]»Æ—A¥½ÂR;ØŠ`’B.‚BK1é<îmæÓã"†v 4ä "›liNÂÎæ%ÚèË)>kXÙ_IÇÖLJ¡4¤JmooonnŽû;éh ³)² 3)‹„b“RDÌ4`AD”«¼‰2Ažh&ôdœK‘y!¥ g ÕU±*P„(P’=ñ"È@"I ³¼¢¨‰HªÜž¥À9"k („ ‚ƒ(ÀH+ B Kd’+È&z:"¥€¢ R‚”M Ù 0ËÊæ^ä@ ˆB#i6xÆB#*Íyµ©P J+@¢^/F!¤ I`A *P:‘”!ED( Š–ºe!„Á¡"RNòT¡Q˳*^+ Z ˆ$D!ë´‘ ¥4"$ÁÄIDRk­)Pˆ$!p4§EÞn·[íöi{{5uZm8ØA×°OG‡ÌJ9ÓXãg¡UõL¾‰»W‚ýÑÝÚÚºråÊÆÆëŸwvvT¡ »TŒX<ˆ4Ï666®^½JZ ):täÈ‘C‡èÕÕÕC‡ñÍ%"noo_¾|yãê&߬Q§0¾jP+++ÇŽ;wîÜk^óšS§NñÍÍ‘#Çâ8~ðÁ_xá…Ç{Œ…0Vp¬†-Š¢×ë±À·¿[[[|GI’ôz½×½îôúúúêꪂu†|EºµµÁ÷—|Ø1¥Ý^`¥å7¬RfVÊÞºÌxÈÄcžÄõ­ÝoÎ"¬kt“v,#“UJH)…(°­‚ÿôw™¹noo3ßÙÙé÷ûÏ<ó Kö2’½¹z ]÷NËÜ(:‚N§Ã×W¯^%¢§Ÿ~š¹éúú:kMµÖKKKK‡–y¹-©“‹C"³-˜ »qøÄaf~|Þå2fÛ¬`g[9"jµZëë뽬»ººº²²ÂëÂú•¢(Ž=±¸¸˜¦©bssseeå–[nY^^&<ËV;;;W®\áKÓ$In¹å– :tèÐ!6¼²7Fè\…¦t:••ΡC‡‚ `åÂ… ,e³ìhçWWWY{Ìç~[Ò4]XXà[4N´ŒŒÛlúÈ7ŽA F0æ RŽ Ýét˜7¯¬¬0¿ß½¶ÍËÊw ¬$¢(µ”lÂ.:ä è'@įº­=*–#Q%0è`a¢[@@ y33A`oQ%#€(ÏpBD MT(RZ¦ƒ]ÌÓI”HD’hNŒ6¤µî§%‡+ e˜+©($­‰0A%ˆd¡€ MHšÏ¢P¢…œ‹œ8B™…. 2¶?Eäå*‚´PzšêiÊAÙ²á‹Bª"FR0Ùfš&ˆÚü/V*Ȳ¨(­ã@@(@‚Ö¤)Ô*™ 1”g…*¦é´D\\\,O“öd(% QÆã ¾j-’x[$"ЈD ŠSä'®J’!`ˆE„" š„*=Š4 Ó,Î DŒ‹É  (äH ‰€b) #'µ")C!J_ÄQ!D&=IV/K‰BD|l¦L+¤¥*B(4ªRuJE¨e¤ò€ïIg&Ì ‚@ÄIte¤1›BžA†kÒdˆ¢ôŽ#"Tšã)—술‡“Éd’MH3Ÿ H‘Z?¼rmw'IâK—IÃÉcÇóiže̹›¿.÷µ"‘eÀö¥¥ ŠJ(*!ËÓ‚R…5+³§,"Âû>ó©ápȦX|_Ëdî›Ï>ÇÆ …ÜgÆéZ—r ..v­ASápxõêÕçŸ{ÏL·Â0ìõz«ë+G]]]=zôèÙ³g×××Ù0êŽ;^ûÈ#Üwß}¿÷{¿·»³„a‘ç(„€YÎyÞÇŽ;v옢‚­[•É„,„hµZbyy™³Ž³y0ßÿ)Uéì .³7!DdÚÇFÔ¼á g[+L¾tŒå´1®¶F –1“qdbN)ãŽRö)ƒK8¾qîE=i"â;l!ŸØ²,ËUym/ÙJ%‰bϸ—°…ÎÙè‰/é§ÓéÆÆÆÆÆhÔ8 IDATÆòâ!Ž6¼²²†!‡ã_[[#,CmÇíXkÍYzØþK$!„Êõúúúâââp8däÑ&³Ã¢(Ž9rûí·k­ûý~V¤öV•ï’yMÆqœeÙÖÖ›†±ÍÁx:b©e<³WRǃÁ`2I¹æOd´úyZú2Y„/óøhβ »±•@«Õ:qâÄd2ái‹‹‹A|ó›ßOG‹‹‹L^•>{½Þ`0¸|ù2Û|Ù lQ2™LvvvF£•§"®®®òõñq<°eøÖÖ#§ 8Î ßKSa)umo\^šÒ6mè¤0V"ÿ%|Š{ß»ÉJgeG÷Wò|Ø ³QÂ¥ˆÈq3²¢LžJ­5Çš—ˆ …ÊKYP‘&)FÙtsûšÄÀ!£qò‘REæ–xk„?2ÎTŒ*Úd#ÕÆ7ŒÑŒ-¶,ESÆÅN¶“Âäwcpa®­°EÆ W)¥±´c&:7‹;A03²uɘ„Òs” 66FSA`Žʤ‰¢§ÊîèÐäˆëw`Ù*%g´ˆ|ZˆèÝõZ¢,L$Zú[óf÷œÍß2’gYÆâk}rš™’‰‹ µŽdh·­å%D„@ QæÔ@*ñãìÉ> 4¢$€B—kPÅŒâ V£ÖšB?æT9DöPBDÖÞ¡&­uÊiñJ8¾ûvü0Œ˜dY–¥E·Û}Å+Ξ:uêuoxÃá#G¾uñÒ‰S'3¥/¼pñðêZ ¼H…£‚¶­Ñ7$³4ÀîDììªñËé¤Ä™8“$ ÂRsS92 #"*rͶ&ÁéÓ§™ŽóBò©k<_xþâµk×®^½Ê"›››ÛÛÛÓé”9"/UÀED»;ýÁ`@D¤!KcÔ~¿¯ò™ÛŸÃŽ9røðáÕõÖ+²é£u’$ÛÛÛçÏŸÿÔ§>µ»³ÓYXPJy†áÑÃGî¹çž{ï½÷Ì™3ŒCÌé·¶7íü­-XQl)i‰É£´¸sE!¿@ë Ê@‚)¬5­’&°º+×ð`,c¶udXñßÕ³8…38Ûñ°‚Ïš<—¢(•Aƒ °Ižçq¡ ÌÀä?e(,ÁrSúdÓœY©E&æižÙ«&t•yž*ªEÓPˆ‚X˜èQά¬.ŠÂ†0ã‡8Žs•¹¤ÖrÊ"+Si²7»ôL§ÓöBK›ØÖpO)Å—Làxsñ3GDâ!9jÕYl/ëGdõêÝn—é”­<’vlYÏ%‰ØÀ² Fìñxl…6eh‡a•R̸}öŒÊмÓé°…AU?É\;UK3­B ‹y°E¤¤ÌB=¢ÝﺦºÞSǺ“tµ»šCM'Ó¸¼ëñ©9(dDŸá‡@A˜ç9û¢h­E(ÃÉ8tˆ¤$Žä“.Y52”#P*ïž…'˜ÓŒ‹ÛúBi’œ£Q÷ñŸqjÇŠÂö’“v‰µ45xªîùÏH„vJãïW9~P¥®ÛXöY8¸äÛ™…Ò( €œ0õÕcÓŒpHá¶`ëØ=nߣ3B0Fà`˜t…7_þ°E±G£ø§ ˜Ûk¥5 TÉ<ëÙ‡E "`¹­´†€Uß af_H×ÒxæXœRãEÁ!)­”")ÜjîC!íã$Çy¦¢(/^|ä‘GžøÇÇ>ùÉOüøû~òÔ­·nm^ Âø¶Wž{æ©§WVÖàE*îbã(å²gÔÞªÍþÜéo3æÿ9qB–e›W·úýþîîîh4bÿ ¡H?ÿüó—/]ò„„J•ùmÈ£çS >C/,,=zôÔ©S§NZ[[KÚñÂÂc6«ùýÜsÏÿÃ?üÃoýæorü 8zìØ;ßùÎy÷sŒh¦†‡&¢étÊ»xä|®UJM§Ó……ž;O2²5*t7<"ò Ø.°ý•c7Ú Œym)9GÞ:Óך1(£còn·"y%õÕ¥YY ¢<σ(¶ñ –’徭ãáÀõ‹¢ŒÊPˆ`î¶Ë ·m›¼@ÜW”ÄVÈp±'I">ÍX™º¤€­¶}¯”bfÖWsGœ†ÖF²$˜OêQ[H‚ñÊ "EZ7èRQÊr& ê™*Ð,9f g+¹ÌØ®¸!Ù(„˜fGH*#<äyΗ `âZÛÕA+0GÊ$"D#Î[£!DQh(NHÉ g!ÊR¹*Œïs ¢È‚V¬Ã•0×-©1_ØM—ƒö¨–‘Œ@C;!$*wUš¬×-*Tu†oBEÊ@"N³Œ  I:åÌ¿Ó=ò΋Î+DUBérw³ ã`í!?"¢šs°«©µQ@Nñ¾šñ{³•ª¨¬l›J•èç±C©föðGDe®î¤êüÌþß’ÒüZò`î%T$—ýˆZåÀ5¼DD–¦C— ÃIDˆ ¿G®3 4h Qð¥o¡•(©¿58D AZ÷\ˆlb¦µftUò|¹ß*r‰‚ %pôa¢|“Ò"˜i\()š¥au×1M'|ßG„yžçY)Ž|þ üþþ£·ß¿û‘{ÏÅ+[GŽ+Š™Þ΢"]DÍh ¶;#þ?êÆ°REó Ø:® "Ÿ–——‰èøÑì0£µf…ÛÕ«WÙßôâÅ‹W®\ao3¾<žN§R²z ø2©Ü¨–––ˆ¨Õj9räÌ™3§OŸ>~üøÒÒR{¡ÅD‡'8dÇW¿úUæ¾BÊ“'OþüÏÿü]wÝUd9ßä±ï«Œ„ƒÁlΈhÔ³3[sÖi:uY‹£5š9­»€N¢Ò—q‘I?êqã©j$¬™ŠI–K(Ìu½á~¨í’ØfFNÄÿ0 ÑZ£˜ØÂÌÃl›hŽeüí¡C‡È$ŠàËoö'dÔà|>sõž0Ž¿²e %÷RÀ¾VEoÖdôÜKy” { ±»;Š§Ã²T’$ yƒ{bbv\à€Ö:/ eÂ_[òáÛíW™<Ü{à„—a! ó2-„ L«üÐFóÉøÃá͇²B,WНùq¦E DTJqM2Jr»i>¶úUËéÃ0! ’ŠÂ…Hj¥”ÊE4mËqu…xw:EŒHèÁ(”$’vö‘ÀjÐ¥ëzá°7î5Q¡5`)ÍØj yÿÞÄl¨Jd+‡jâçFÆr±žWf ƒãw! hК™½”¨uQÿÊ;­µ<ꆒ`¡„R8E­ØgÓ€–ƒçl¡ˆ@~zP¦ʉ&ä%8{EÙ\ÉwSU¸-XØjšÝV~ÅJ0s ó¢È­^G›X°J©8™%¥pÛWXÉÂDĦa š@fÀ Q ”a ©´òµ¡d®Æ·­I’p”«›MSc^{¾´WtÚÑRZÈ»«`Ç,LA@†Æ]èÀø|˰4²à: @#7böšÀÆ|¶:ƒŠ¢¹,[Mk ¼³,‚q}Fì „9cÓ©XôZQ’a>/"Š8Ú! wúšÂTS'Y8Á¸NŠ¢Ì|(4¢àœœj¶ª$©@D„•Rœ'ÏsB”q QdªNõˆHa%q§…v@èNÇn„‚fV¾.j!i,“iàØú—#ɳD­¬ È lÎTe(#Ò¤9XµTÆ”62:JBY¦·œ%Ë1µÇÀŠÊ] á„¨gtÆ&:(e  %`0£·–›"¢È«Jø´7LÜmó/S:’ ¨(€ïVCPEnÚg3¨RÜIe^˜ Ik$„2Ák¡q‚³ªÌÎ$L›ýFÈ7$uAI0ê €Q¢¦ Ô \Tˆˆ$Xó¬Iˆ@ )ÈÂ$ÚJŠ$€s>˜ H™åS+c‘f¢§´Öm̯ú©÷þØoþîï?òå/ßþª;ÒÉxíÐÊ0ÀK#ëõ–¯þ«÷Þ£ð3Æqùòe`ÝEQ "ûfpà4§46ó!"¶Öá|Ü™N§lÀÅñêØ‚Éjh`©·Ì—µÇŽ;uêGeZ\\ÜØ¸ÂqØ[I±¸¸xùòåo|ãŸúÔ§¾öµ§à—ùyûÛßÎç +¡"”RòÿBˆ\eàH3@˜•Æx„ÙžU¹ÛIk-¥‰oUêë ÂÈJä S›]ì©Fgع,Uµü@9mƒ”× ëþd×[ßK"]-·Rt±sDpÍ:´®Hî¦Ñ0[ÓêùxfÚmã- !t¡,ë¢ 7%;/V=9 _~´Ð(eŽ,m\­gé~Ѩì…½WÌŰ™)žžÊ.«ÕµãqW¤ˆ@„„Z¦©˜¦B$y$òP©IÀ"À¨ªøa£®ð‹rÈ…¶…‹lû+•¤ÛKc)´’¶`wé—7àz‘5Ù·öOügf®oìù˜‹K»°*Ò¹Í^·‚GÜO\ʰO [äq÷`cÍyMyã´Êêðì³=Ù{tÌ­æµ_ïšÝÒÕÜâ‚p± ¡¡_hŽ ŽI2 )/¾þõ¯øÿúýÿô›¿)Zñ´#+ÑÖlzž'pH,9ˆäë­2n•]_!„à"ÒTŒF#DŒãHJÇ!›ˆADDì”ÌWNʸ9›)“NN›(µ`h´Õj±«I©©Cä œÚd@RUë$‰[²ëª=ÒÇãV«Åêî«W¯€‚UyÛÛÛI­¯¯¿þõ¯ŸN§½^o8†q5‚2o-Q;FÞO..zèeŸ*Á>PpÿÅÛŠóŠGÀ\ÓB•šØiÚ=iU¦d4Þnkå‡X9Á»GÞúHˆÊ£†+"èù¤¤–ªÖ«•ìÙtd{¬/ŸÛ»»Xq³›)–ëôÑ›mÐ6â5+œXÜóæÈÕ44´?¯¸£ò¢{Æjúª'5WÃï¢ Î§~çµ/mq—ÃãÇûÿš(.ž»ˆá¡ß~X…ž]ŠÃ7O4 Šù7¼Xõ­ÑØÑ Œ­±¯ƒ¶óbV’µ’ÖÑ£G=zþüùÛï¼+ŠbPÅõ?vŠÖZ#…óÑ¢TÈÏý¤Žoà½ìa‰K`/u´£ÛDDöçÑ&6k‰ÈZ±O†œ7Ð%ôî ,!«é™¹{îŽÇãcÇŽ±o(3ovÞ`‡]­õw÷wŸ>}šÃ¹‘s£C&y4Ô£ÝîNóäb·2ÿ)Ð÷âð@|PmÜ™užçŽ,ö=_"J'HºeåÈ%9"*åç)Ù³*}„,*¸‘{”“Ÿ-±dÊ~‚ÀIZnOºBE…­g¯ÇlsµK4j4NrÖFk­òÒ@€Ã$±•òp8L’„#`,//#b–e<òÈh4ºpá"fYqÏ=÷L§SÎŽÀçfÛ‘çÄΞ·¯<& µ¥j®<ûZª5'ëAK}÷ºD°$Ö®.f:j»Zà0g‡»tÇã=.„BH«Þ£ü'D3:¥Êá*T@+M?¡Ã½Üɲ ×֟ݨ ¬ƒÎe¨ œKw{áÊ¿72àF¢é²C;S~pÝßÝÖ¬-žý©Ô!™»@çYÍVO|ËÌê5ö P©ΛˆœåžCèù¶HìÂÊûÿå-ûd ó>ôæhŸçñõ:¡vYmáÐ?ñífQÿ\ã•nÊ'57¤fø6/RJUäÃáp¡Ýyýw>ðÅ/µ“Ö M[sçÅÙ¶þÍH½¸j:‹<–¶ª¨Zêƒ"4W§U?Z²QiÐXÂI¤ 5 ¡ý“Y8jãt:M’ˆ“ „a¸¼¼Ì¡ü¿ùÍo>ûì³Üιsç8x$»TÖoËÑâÜ½Ôø²Þˆy¶vç(„UòtóÅÝ´´§4í+pXØZÒì­1 Iä0iö+ÝÙ}k¹8¶ªj)À˜ýCyC)¬—Q1ÛO,Ï *ÃðJ2/ÝIyìÊârÔ]g åŶ)Ø_ÿÉ%—X_êëâÎÎmª\&Ý  !tÕ]gÖ£ùÓ%îõ)ÛU@Ò%ׄ™™ˆfzi"²‚©‡`¶}†ÞVªóxùŠ·îp½Mg÷=Èå<¢áªþ¾7Yw]ÐÍϼOêƒ!£°xõjÖ* ¥½„æ¡»*""s`%ð·?ã° UÂjuwèè0í«õ-tcÉ[$ jQUq{ÝyìÊl/¼y ãòDFd¶ÈDDºê_(L4 ;0ëMË­2pϾõAz쇽JêÛÕ›”}vÕÈî¨<>w‘f₵³l4³‘¸ähÑ¡*Üxã¯K{¼lho½ê)ÛtÐHè=6ÀÐu“lM‚ãâ9ç] ÂRm6Jh„?VEºrÛÎQ\¿ì…æŸb÷óaãçLÞ zhv©ß<¸¹-Øõj\z×NþffQ/¸çJíý¾ 5íÆF5Î/Sa¡<”qôÉdÒŽ[ªHo¬A:ÈÞðP£á.• ,c³kÞó‚•÷¸&ÎÓe¾Ç%"› •Çe‹AdÜñA#±ÿŒ ¾Újµ”Ê‹¢ˆãxccãÉ'ŸüÜç>wáÂ%ÄR(ÏsUEš¦ÝnWkÝét²¢’-d?é“ë 9c@üèpàÜ…rÉk½:¦ºõ½õ³\ƒ:÷’ßcÒ·sÙ6T%*û“mß~œËÏAѸåÜš®0çV°—Ü.ºWÎ>cVÚ…»ÿ]V Κº•ëCm\‚zãõ_›@>ˆöIÝöšqô²8*èò«ùÚûðmÇx^æíMw¹çá'Vu^µ=v«»ã\ªâ©ˆçí—·ßy*è=€àaÞdo¸PMFyQš½±"„ÈÓ ©<ï%I’eYÒé”{ÛßÙ›×ÑÄXL˜G(øM:ŽÉÖ÷Kë‚ÉLjvïwCFÐ(@" R€%ÒsI $%+‡³"kµZDÄ™…ºÝ.­­­%IráÂ…/|áá'žxâŸø;þ"²áUDBʰÝn+¥B¹SN²aqVAÃSÐ@P^è'K¥5ŠÒó @—®ä(°Ð (–v8(¹»ÇÜ%q©¹Ëóì~¶ã‘&c-œE tB€Hk¥µF’ PbÈ2븥µV¤´Ö(1(3ViDà0 „90"r\º‰3Ç’ÐŒ'yˆ™@ƒA(Pç*ËŠ´-Ú|û€Nœ÷øŽÆf›a¢„@šŒH •B1³oRJñ Eš¦Hš´æÔî ¥" ¥5Aa4KB¥ÓU¡a$³! rò;E„BŠkó²–#@)€ƒßò:R9—,Ï]•9y)ÀI§ŠV‰MˆB€Æ2(5½A5ÿsMÒˆÐíCúÐåË—³,[ZZêt:oýÞ{ÞøÆ7rŠåv»½»»Ëé¨Äq< Ãv™2š`AõZ‹ùd$ƒ(#•§ùÑÃG¶¶¶0 9£˾ìÏáÛ¦Óéââ"·¬µ‡½^ÏÞ4ydbÏN,JÌ @jN}!ÉÖD´:*âDª¦G`¢R³ëbD·™Ñœ3f²î£VgVnOs5#ªQÕê޼‘uÕ¯×ÂjæG DåÿfOAUvWÕO%†”‚TMïm‡çÝ£7HmÂe8Õ÷’H¨Ú£ý©.©ì-ªºõëÿ)’³õf=#ÆAdí®äˆøóvú~¶d7ÚG}±÷föüF„ Çdá_^9¯:HŽ@'fÚe†›õp ¬[‹+×`¦kÞ‘½Ž‚2¢Sƒ]6`—‡s2çH’dssóÒ¥KW®\yæ™gΟ?ÿÐC=ùä“nx?fØœpƲä ϰ³ó­sͺnÖ_ç¾{ÐYïC7FËЉ²d× jl•¬{2CG/Õâµ_69‘’ê©ï:V`×Ðù62``79w:Tj*wÌÞ yeÝö…ñ?vñ¶ÎVñzÈÃüº”3oîÞû¥¥¥4M9À§[\\|Ç;Þñ·Ÿü›'žxâ;¿ó;Ã0<~üø… Úíö`0XY>Äü²ÛíN†£Q6Zîöžî[­vÅq†Ó4//zd.›ƒÂÆq¼¸¸8 –——àÒ¥K 8P(ÇÃaª¿^ÆBUÝ’·jÏͪ?¨iÎ+Ü—' ×ÑuŸUÿuƒºhìMsŸÅc¢ûáâîsãêïÝf=°x#wÞhÿ­–Ò‚×(ÒÊÿ¥0¿—ÈN‹(Q–*Y)8 Ž'œe³Àådü>-¡&––ÇäÁ¬½9ëÃæææóÏ?ÿôÓOßÿý_ýêW¿õ­oYˆ9|?›_q,Lëñ‰Oœÿʣǎ{Íë^û£?öžn·{åÒån«ýÈ#Ü÷éONÓTKüï~à]ÿú­÷i±Ðî<õÔSý7üñÇWWWïºë®w½ë]Ì_îç~Ž]~æg~f<øÃ^^^þÚ×¾¶¾¾Þ¸"7À^êÒ8ª=àìUƒÙ¦žÛEýÛúÒÏëý@‚‹ÇƼ­DŽ ÙPšÎáu_Λ°'¾¸{ð6µ;óyõÍlŸ6‡üSˆÊ¨Æ€ô&ô IDAT¤4 ­µfšš˜q£‰Œo—\)¥Mt«@'/fÙn• B*Gn“ f{{ûë_ÿúç?ÿùóçÏ_¼x‘E“è8m7ÎA†oò ±Fô½8Ð)õ½]'²ÆÍîZ›LÂ8^óO6Ü8bµHeÊM*å:sëx ‚!¢š<_ᱸĈª©íOuÁ«|0·±XzSvÜ›å¸ÌÕ#^¨ç}ËÊÉve+h­£(º|ù2_äolllooô£}Å+^ñ'ò'O=õÔ‡ç·s­~ú}ÿ~iiéÓŸþôÇ>ö±ÿðŸ¾í•¯T4¡âäÉ“OüãW?üá¿õ{¿ç§~ê§.^¼ø‘|äôéÓ¯ýëë·~ëCúÐúúúOÿôOÀòòò`0¸õÖ[···Ù òºŒíÛ¤ì±FuNìíhóÐüaýÿ=8™Çw÷#²ÔS7'RoÇý¼qâp=d†ê»#ñZ¾n;–ÔwAWn<ýK(ŒQˆÒZjR¤Ö†«R™ØK»fMdž¶¶ÍˆÈw®Ì’9‡Ýt:u€˜,Ð|Cl-Wë féû´ ‡Ãk×®=ñÄ_üâ_xáf±6|?'¢€[n¹eccƒÃ}pÜjðŒœâ¡]]‚£¦øM̉]¤¯Kš7&û»5îÕkÓë^åj›…vª‘c¹¬Ô·é¾Áªi•[Ó›H½MÛÚ LÖ»±ïµ)T;z#,×ÑÄ·ÍøWí”z/D„ìÉS9$UD Œ{üä–z_ü̘?ÆãñÊÊJ†Qõûý³gϦiªµîõzôG´»»û|@åÅwÞyÛm·?~:FAxþüùsçνöµ¯ÝºvíÐáµ(n]ºz¥¿Ýÿ³?û³N§ó}ß÷}‹‹‹GŽY[[ûÓ?ýÓ;î¸ãÊ•+ív{:v»Ý(Š&“É`0è÷ûl V—?¾=Y/ì›ûšg_­â«=æèm¨-¥EïaÿƒolÖ}¦š›¢-žƒÔðÙüu§ÙøçÞã¿îûýÀù_X)áÀt¦PEQp:RŠ•RJƒÒD$666vwwÙ`’„Ø0•Y/sßÉdÂIå8Ù~æLyišrÈhû“÷ž¯/]ºôÄO<úè£.\àá2—G‰zë­·¾å-oéõzI’X×”›„Hý¨5‘Óuq7€[öߣ[ÿ@ß^·Y÷ôæJà° k¬[ÇûFVárM˃] €ã¶ä¶à…ȸ™"œâŽÜú1{=ZùÃ}éÍÂm_WËÞ+²7‰w»˜Çwݦ<âÿ‡Ãa«Õâ\l¼¹¹ùWõW›››ïxÇ;8@MQçÏŸ¿óÎ;•RÓéTJyöìÙíííápÈ!Ù/_¾LDËËËÞµÝn;vìòåË+++ëëëý~<ßvÛmq/--!"gÎóœõÛA¬­­µÛíápx ¼ì¥¾+½U˜·"îÀ|¶±Ço@O½²k,ÎÛPð~v¨‡Æ×…¤‡Ï–æxŪyÜ}wó$ýÛ¼šq_*Ÿ¥Z¯s´àé§Ÿ^\\\\\l·ÛNÇj8ùl¹)šØ@"â›ZO¬»í$¶ã:RÊgŸ}öÑGýÚ×¾FDQqCÉ;Îk^óš7¾ñ_ùÊWÂ0´¿òé¼q¶Ÿp·Vù(Ì߈¨U%ß'41NÚ‡KŽD¼wÍë–z_¶vœv¶²Åup„ ˜³±Iˆ¶kêö[‡ÆuyÏŠmÍЂÑNÐ"ßmÀå‹•éP¥[lGÞø=`6ŽšõÞmƒî¤ìŸNg4@†<ðÀ§?ýiNÿüž÷¼ç¶Ûn‡kkk?þ8"²$ÚívƒoÏÑhthiùï|çÿù¿ÿ¿ñ¿ñ?ðƒíÅn„£á`gk§ßïß}÷Ý;;;½^ˆâ8žL&_ûÚ×n»í¶Ñh4£(â»$~B,..ÎJöØ2ó@ô²—½ÇÖ¸"×mÁåônµØä.Ÿ#ç8¾÷ö¡Ådlû A{óÚú¯ždo÷‹w­cÿ×U;P'‹ßu‡ößfÑåRºRYC"’&š¬@ 67¯õûÃíí]ÎŽ°¾¾ÞëõZ­N{’¦i:Å´ÈÔ`w™N²q4îõz(A¦¢ÕIP‘‚ ( ™1°}Ðx<î÷ûyZDQ´¶¶öüóÏ?ðÀ?ü0«£³<”RæYÖé.Œ†Ã¼Èÿõ=ßý¶·½eöñxÜn·‹¢`ç¥ê*V„¯F8X:ËÊm+|•öi2LΔRª¨$ߥª¹¬Ûµ}ã"–nºSô°Y›¼ñHƒHR@¤5! ºÐZ¢I)Ù ìækw¯çȈN ,¥ &MBJ 5‹ònsí€šÑ ›”iDiÀBaÈ1ÔPå…Œ"ö–FHš”V U™7@ç*3MIešK!E¡U¡Ô AH)¤´ÜQ V–-….­ñ…‰Ý Ä*»À.iM`–‰@¢P—ŽÔB IDÖŒÜÚ! )C1£_uÏ. ê|œ`p`h¢»4.&p/ÃáððáÃBˆ»îºëG~äG¾ñoüöoÿöÙ³g³,k·Ûý~ŸÙçC=tÿý÷“ÒQç¹ê$]•C,ƒã‡×>øÞ÷ÿüùýÿñðÝ?ôöóŽ$IT–ol\ùÇ|ìïïÿFoöw Ãpwwwii©×[ vt« Ãá°ÛíN§Ó ˆ\Òéb®»§œ÷Íq¦Í¶M !@å^ ük¡Hþ›ŒtŒôÙ|¡afµ@••*‡Z•³ÀÓìº{Ÿ±CrÅYW$7¬ùxöÿœ¢+ b5š‡Ç’ë¡t޶çq3 éÒ4ñü …+qº·Q3ÿ];@°BÕ”†MÞ¶*(„J$»¬*[›du¾õ ÞÜ=è‘Vœùƒ!ʘP 9»êª€r0&Y€ŠH‚&E†ÂN²] !„J ‰ˆ:OEÅ$ålU.‘*µ ±(T®?þx·Û]\\d†“'Ož;wnii‰ï¨Ð$Q`Ëd!„bi½†˜ t:¾¸BD–¯Ye­ Ýétúýþùóç{ì±K—.•&]Bˆ<Ë€ÏÜzëwÜqæÌ™ÅÅEî‹¡3ïì»w™‹¸ÕÓ•]¶yõ_êÒØ¯¥.Å÷jºØ¶×d+›Ó?À¹øj?qû²ÈŽ5£Ûi#öï1¤úLëõ]Jg%ÊúÔJ(•3ôo›ì¨,$í¬ëÔÖm“Ÿ=ÔÄ2zv±ÜÆëÜ×þ”eÙòòòx<¾téÒÊÊÊñãÇ£(ZZZúøÇ?þ ¿ð [[[yž÷z½ïùžïùÅ_üÅÑ`·’,+®\ÞXèt&“IEçÎû¥_ú¥¿¿ÿ>óÙÏ.ôº¯ÿŽ»777o¿ýösçÎý¯?ñ“œ$TJ9™LXóÌ÷JÐï÷yËs¬õ—Tß\‡€[Ü%pÖkneïÁ{Yß&×^cSöóÆå»n›7Sn¦}tT;°TÃ¥5nÏF&w“„ÑÝq‘ñÆ\Ö¯ŽÄ`˜4/PmÔà&ßž f¨VÛÕLÑ&Sÿ<ôÐCI’´Ûmæ§OŸ¾|ùòÑ£G×ÖÖø˜­±Ð„Ô±ua&I²°°À›œý}yÏ !˜ËA§Sxî¹ç>÷¹Ï=þøã6b%±/@,Š"Ã7¼á wß}÷Ù³g9â”À:´XÊkÿôþ‡*N¸¼äº»±RA>S¼Ö©€WÓz‚yƒ·ìÉ+ÐDYe8ê–p"Æ\’3)€9[¬µ/=êÜ.ïuwP™©™oý';k—{ÚBU«= .> “ÊŽÜÞ¼¸ìÜoý9˲……X___\\LÓtiiéï|çù¯ÿïW¾ò‚/]ºtüøqxâ‰'z ]ì‹(JVVV²4 ÃòRð½÷Þ{?û¹û¿ð…/|ïÛï]hµyìîîN&¾F ãñ¸ÕjµÛíÕÕÕk×®A ”šL&“É$IÚ{Cø@ÅJ×ݹîÒØ7Є9öƒú¯{0àëöî=×÷W â õE)n§nû7@‹\j`w“ ßȱNg[#Gr½2ê;¢¬0—U7ƒº‘Á»¥Tyšÿç.Xýèìå4öÆßH¥½ú%¸ï¾ûxav:[n¹å™gžéõzËË˽^ouu5Š"¾B(¥"AE_Çc!DÇ|™Ä,“ƒïŒÇã¢(‚ ¼zõêÃ?üðÃommIàåòDxêÔ©v»EQ»ÝþÒ—¾ô| Èr¨5ŒF£@Êét E¦”*Òtu}íøñãY‘Çãvœ´Z­/~ñ‹Ï<óÌââb«ÕâSïââ¢RŠo‘'“I¿ßF‡âÍÈqo^”Òˆ´{ÔŸÇ}zö¶íu÷ï<&êqßúì^D¦[/7ß¾ ÏÊÿ`Û| uÇàµv3¥NÍê”Í}ž°cqÔ—•sÜEÁÜ׿òtçÍ\vNÞŠ¼X dKÐëõ˜Û±±Õööö£> ‡^XXX___^^ît:G=uêT·Ûm/”t·ÛeóH’$Žâ(ŠØh‹ãû°v 4ž?þïþîïž|òI"bí´ÖZ†AžeI«5LZÎë^÷ºÓ§O¯­­Ñ`0ȲÌÒ,­õ dŸ®o$tŠ…&ÿäYóþ³q_[<î[ƒýU›ô|.Y‡*«so­¨I«æ¾µ?óx08›ÇÅõ½ÔÛc„*鵿Í ªíÒʳ3Úú&¯oN÷òÛ¸KÇí|=æ]:ò¹Çzâ¹`¬ã÷ÜŒF¥¤µŽãøÔ©Sišæy~×]w±›@ívû‡ø‡ÿðÿðWõWüÇÞÛé.¤iþÂó_yÛmùd(t!¬^ùìg?ûä“Oþè{þ§étJ…zÿûßÿk¿ökûØÇÞúÖ·Þ}÷ÝJ©gŸ}viii:./////óCD¶sÔZ'I¢ÔÁp~ÞAl@Ý—iy¬××û¼®Ñ{?õ]¼Úc^¥!óÚ?h;äÈÓnkÞM}ßy} n 7Yê]ï]³^\H{šÂÓ6#$ 2F;¸ð³FàôåÿXaÒu²ãmv[æÍÍ]—ªý~8ä_ú²ÒöööÕ«WŸ}öYà¨xgÏž=tèP®²3gΜ;wîĉ‡Šãxaa#U!"Ÿ‰9›b]ÛÞ~ôÑGÏŸ?Ï6ŸXzÊ÷»GŽyõ«_}âĉåååÉḩjŽÃe3û/õ]4’Zp(æ‹K5æªpдq`®ñ—Ë•]ŽbÏ€£ Õ锦Ù'àÀ¹N_¼7D¡>$¼.QÐ0{¶p¦úAy6Óf O™ìÒ©©&¨ÚVº;«N[ÍÕ?»È€&7:'`ÏÛvíB€Œ®B;Á¼–——wvv®]»¦µæÛYˆãø½ï}ïßÿýßò“Ÿ|ßûÞ·°°ðš×¼æÇüÇ|ðÁ_ÿõ_×@A?vò ßñ© ûþöã÷}êÓZö›Þô¦ø¸ºµ™Ž'¯zÕ«Þÿþ÷ÿÍ'>ù;¿ó;ý~¿ÝnŸ={öŽ;îˆã8I’·¼å-ù—ù+¿ò+KKK?ôC?ôêW¿: ÃápEÉAÐö:ÅÛ\{ÐÜ:¸6ÕoÀç:zà àyã·ïëM½Ôôá&ÛÇš€¾GMh’*¬ ÂÛï{,åu‡Ôøì5>¯}ëß¿G 3Pò]$“û€e?h¼ÏRÇ¥ ÕjM§Sä¹¾¦µá'1˲o|ãÏ?ÿ¼Ö:iÇÇŽ;yòäÑ£G>¼¼¼Ì‡cvd²!$ã8VJF£ûï¿ÿÁ¼pႽfÏ$)Ïó•ÕÕ;î¸ãäÉ“ëëë­VkãÊUö>âð ÖKø “÷@æýúvM™^ê=f{©s‹ôîÑœª×Ÿ[ro¯í½jV®ÓNöPhÙö|ò7ë¨|㌹d±Ž8{›‹Òš1Ám§î¿hÛWZyý–Ðp0A“áè¼.\fé¹Ix3­3o/±¶}ÏÛÇÚ+xèJ5r¶³³#„¸õÖ[ù—¹Ûí¶Ûí<ÏE€ùÈG1¾}Å+^qË-·ÒÝÅ^D›ײ,‡÷Þ{ï¿ûÔeEÜØØÈŠüÈ‘#×6·î¼óÎ7þ«ïâØ–Q ƒV«Åÿo~ó›o¿ýö<ÏÙé?Ë2¥T’$/–gæ 1ö§‚¶pvÑøºûΣ¹äÄ¢ññízî‹0Ÿ¸¿bUqjÛ¿y¢l{ilÿ íxøo¡1‰’#»…OÀõÏoŒןݗóÆVí·âWi›ò$³Fœ{9aš¼ùˆ}̸‘†×?´4ÖÒ[" 8ìÔîî® ÅÌl2 Ã<Ïmæ¸rBŒG“gŸ}–OÆ|ü=~üøéÓ§WWWWVV–––’$év»Ng0\¹råó|áË_þ²RªÕj1kç9(UaXäù‰'n»í¶^¯×ívq4¥iŠæ|Ìß7ß4ôšU:7†è/Q±æòBDDáÌe \¼µ÷금 ±3éØÐqà¶ÚþFºÙ¸ m_u*V5³±kôîõëήÒ/TæHf^P;‰ºìª<w2Q=âÂØœÌhíO,j¸»ËűF˜ðK¾|½téßõ^½z•S²Ù”͕֚Ùgw<‡a´³³ƒ(»Ý^QI’.úý~¦Ä‰S'·ý8ŽA 6­ ‚€½˜x;A°±±Ñëõ´ÖN‡ˆØÓ]žx°ð2o} ZέÌz{h³vÝ:u„|IÉÅM¶_§p= ƒj‚&ìÇjú@¥‘Ûá¹Þåg/°G'¯»Ö öTAS©I++s–mOÝâ–: ,™ëœØ T-Á»þ‡ÿ~4mnnnmmÇãñx¼±±qåÊD‡å ‰(!ÏŠ@Î|j'Åt:N¯mnÿãc_å¤Ç­Vkaaammã\ºtéù ßÒZ£„\e(QjMŠŠ8ŠÓ4=yòä«^yû‰cÇ{ ÝõÕµ~¿ÏLwww·Óé\»vˆØ#I’µu(à¼ânTtˆ²=¢s@ô¾rØæ}ôn^¹Ÿ¹Î!À¡Te‡•ÓM´æ,Ë ‘Ù‰@$¥QHÎH¡5hMˆPËPêi:-³4"¥ù4Š"@PJå*ST)©Ðy BB À2n™ž½Ð@ `Ï`MDZk6¸Ó&½hÉ¡Y‡CP:ûš™2‰/›rî8 ­ÀaQ`ØXAšz„ahóƒb™VÐI)$I` yen\@ Da×  킲ÎÅMë ¥¶çò¯V<¯ÌƉšH© ½(e# ŽDÄB§wþ¶o8Éæt:m·Û í#R€(BÉ$(Š¢È ‰¶Û  t DA "Ñ’(: »"JD[ÆRREJ*I0;&´Ûí<ϵÖQ”…ø(tDAÕQ·º³\’âÖiöm3žÜ£9/²Ó0•¿–Êy¨Òe¤y¤L{-»»Ì~nÿ´‚ÿÆABÍuÖ«Ö¢š²…q1pæN3d;`ˆŽº«qÙ¦á/~/ˆPnCD4g¤œéùì>BD‰•3˜¹pÓ(øC!f½[?{¨ÂYÏQ¡¨š‘J¥÷üÝ!‘ƒO³jqAîY)E‘,tIàÖÕ#ÇNLT,¶vv ºåÛ–´‚€BÌóœ)ŒÒ:Ï‹0 @ÎìH@™@AJ ‚4(¶AÖƒ@"‚Ö…RJ ¡µÌs  è„­…vBJ 8IÇQ+ î¼óÎétº³³Óï÷YèÞÚÚâ3ñöö6¿FZ‘V؃ò,Š…Rü>MÓÝÝ]xúé§ÙÃhf÷]è™.ˆÒ4m·Û'Nœ`7Œ¥¥%¶Ï$"Ž“wéÒ¥µµµÉdòüóÏ¿â¯à»ê—·Ìã¯Þ›¥4"«‚Hxt÷,ÖmÌÅuDd.Ø8¯O"*)¬;˜ò¬æP¹r’mAi›øz¶j  nPN¯lf÷ä„Õ:Ta·TSB¸ÒVõáîsc§îŒÜ?]¨º­¡­„(£©¬µòø™ýÐîCÞO®`ä°þàímî¯|C¥ÔOÐàØÈ ¸¾¾üþæà%-¨ìŸsÙ'U o‡ÎöéþŽìřۜRïšêÒ^õaŸí¼èÅ•uæÒ±šXé~»G›öÏ=ðsŒF£¥¥C€¸³;ØÚÝaðü…K½Õ,¤2øL†2„ëu‘**÷‹ÀÙ%­Õ€bUý‰8Û_•­D>Û{!‚ÍÍMDdSÌòU°þªÓép²ÂÁ`Àüx0$Qk{{ûòåËW¯^ öZ—\.ÔJE_ýê–À²yöqbûLÎî0™Lqmmíüùóo{ÛÛ¦ÓéÚÚÚ… ºÝî¼9ì³ì%ûüÊE‹F»5Ñ9ú4¶¼ÿLVÑ丸¿Îë U$¶^4Þ¼nX¢wa‚M J§0, J^óM´ÆÅ~pµ|º¼ÁeƒŠöø€Ã®ÏBaƒÖºÕÜÊ.b!|baÿ¯/Ç›íÞöº¨UHΰóÒª]L÷ÛšÛþ·ž™ñWÙçãœÇ}ë‹ÒX¬”Soª"š}óý•o²4.úu+xøgàÁp½ƒ„{-5 Ü»Mû¼GÍy­ÇãS'N\¼x1i·û§¯¶º½í­+»»½V‡CHq*î8Žƒ RHÒš ˆ€¨µæcd}S›Ñsñ‰Õü)ïºýXcÂV«¥µŽ¢“$Y]]eK¨Nka4±Åööööööîî.ß³ó.[/³'RE(Á†ÐâYqJ–S'na/&NÇñp8LÓ”»gΜù‹¿ø‹üÁÜÚÚÚÝݽî[gEm¡Þ ·ýÜŽæíû,ÄÁT¾Þ€g„K½+TÅCmòaÔõ´P¥òeËæNÅ2¹ý n±úd—D"–:Ü:Õ(­¸5aUUë¶À2°ŒÊ‹ñð=,±J©wšˆÊé#é»’M9]I ééüÁYP”»‹èqG¯¾;É&2DäkÎç=ü¼9˜½øÅ~µÔ«íQ<À»ûÂ~åÂó%‚˜;SÓÅ^Ýy£ui‘;Î—Ž ÏÃ.[êšž}‚΃³Û~ã6ñJ§ÓÝØÚÊ´Zhµþêo?qîŽ×Lò|8ôû}fv–õ°¤”ÈÌ+ BH9I\C,Õ‡ ª{¹|8 ^|GÄ<ÏÉÑX²g f®Ùjµ‘EqìØ±<ϧÓép8ÜÙÙF×®]c¢“ç9³Òv»½´´”æS¾0æŒiÃá[ëvzív;I’^¯·´´´°°påÊÎ{ˆˆ·Þzë<À}úƸ¯7ó›¤2.÷mlÓÛ'°§Äw]ÂQoª4ð‘^z¯†Íéñ†Æëj¸ãfÀT-öM}×Õ(JÙlXP©ôó›œUî0fój*\%èîŸfñ!Ì¥þäøg»âj#æqt[ßÃUwiØÆ^)e0 BuØZk"Ôej­ *º‹[ÇaK)æY±¾\”é¹ IDATŃv8õ:óê»oêëëÕ'cC7¥y½¿èìw½ö©½÷&ý/VÙ» ¯[œiÖ?ÜÏ”m§ñBòð¿øçÿß¹ë_}—¸¹}M‘D—û¥ 4ϦY: ¥”DJJÙNZ N;N’(î¶;ív; ¯esž…¡­Ð=gîO󌳂¥¥%fÀ’Óñ†¢¨×ë%I’ç9{@’$lu•$‰RŠ•ÆÓé”߃Q·røh)eV¤LAƒ¥iʧá"SI’p(>í„W¾Z¾ýöÛŸ~úé?øƒ?øà?xîܹ—‹@ÌÁì·“Îd4ŽÓ(ˆ‡Ã¡n«V+‘¡ÈU–´ãñt”išOS)¡ƒV8õÿí¿û7~î?þãÿ|÷Ýw¿ë]ï ÃQðq<ŠBV ‚2 &{^² 6K"Í–¢ˆH¥!'`{L±)"´‰5HƉ“¥"b±§l®2¥§‹È2žceJÐZ 2 Ïs‚2*§µGû‚y$_s`¯-„Hói†Q+* J¢ñt „ÐŠÈØÇM§SÎÉèÇ1âæ•bKu¤œe£8ŽÙȼÝnÇã0Žò¼ü‰C%I2™L¤AdYÆÇ“N§q+"¢Éd¢HA ”β,‚PDlñÎé°z½k8¨(9P„Y‘ Iœ¤iš«" “‚4 R(TEQDQ¤§8.Û%¤i†!h¥•"”AžfEQ´Z­œq‘@¡&„B—©£…RÌ–rM” •âm2M§l ¹”2‰c¾Xi·Û¤ÊЪ2ŽÙ²Ýn‡Ã8Œ,’L&“ÅÅÅápDZDQ2 ¤Éxl ‡ã F(PAª"Ãi“ØšbðO6ÖtåÇÆâ½C­tRÈ«ËÛG6Zí¬õT%ñô–ù`»õMœÚ—nÉÔcAv¼ <D¥­´@DÒLÅH³H+¥‚@h­9ù£Dä­Jƒv lùÉh!ÌŠzde[ÿHÆMq²ƒƒ…FIÈŒõ;šû3~•W|ÊDþGD(+q!„4E4ʨ¤òEÇŒÝ2N!D¡´¥ˆ(ÍNDi6ñw³FJ©µRf ³ßD,±eÛh$©ý«ehlT-QJ‰ ré²ý0ÏS)¥ÑzÂh Ú0õ "Ï…„"/ÏQEQ)ù>QH J†òpà´&­5A )"J¥”@k’R€Ö:!!€…X‰·2Ñ&r€”R*‰*órf˜ñE HDÞäE*D@Z(Eˆ"±9T%V„DÓ5D(¥¦Y*àÕjeEÑï÷ÿüãóÀçL–Wï¼û;2%5"Y‘åPeÛe«Q0UL²$J!¦ÓéµÝÁ6“ˆ0 9xkm#! Q GR@Ô¤´F*dAP ` Hi­[ÐÊsU° Q^â¨? Ø læ¶kĆÚ6’õ5jÅ­8Ž™g3nµZEQ(UrædÜ&"Ʊ€ Xá¾°°Àúô\e|òves~æÔƒÁàäÉ“ßÿýßÿå/ùŸþ韾ô¥/½éMoºçž{Ž9¡ø˜gdEnÅ«¬B0ù¶¬Î²@íD2²"9ÙÝ_m.{”a 9‡ dBÃý†aÈ8Ç?,Åɳœ3•›øêMŒCV*(¥’v<™L\ZÌwð6=3W¶«f/ðLY Šã¸t´Ö|³Îpàë|v˶ŒØäO›âJ3ZëÑhd),qå$IJÖË3å!±òà 4ü!g·lu¦6«ti²§€©öÌ½ÝØC1#d,bTÔZóÒØd•½,™2&¸jWúávœˆAÊPåœ"œ ÓîU» Y–ñ"ò¶ä¦´Ö„Ç1o þ©Ûír×<#Ë6ÜvxÝm€4MÝaóx@‘¦PT(- OPB~æj¢ì¹ödS§ CQ;ƒÉ­V\L}R^þ Ú"JšTQr_!p¬B ˆBj­µÒ fF((DšfåŸhr6`„D@¨IJ‚°Ä¥q–’&2aLìtŸ]ÂrÌæ‘Z‰Àlg>”ÍÚ¼BH˼-‡FœH"¢"lHA ­myù! h”È(ÇtÀŒm4ÍøE#€bN,4áò~àè1 y?"€B¤ª—‹£¡"Nì^¹u–BH)1@PJ)`‡R#)B¢TAHjŒ‚Ph"’¥T¡ gšEæ¾H$ ! ‰ˆšÏ+ÂPuÿâޤɖä8s÷ˆÌ_.—IÑ^__F£ív   fÆNóêæóù`0(ŠâÅ‹Æés[4M“t9ø‡Ãáp·ÛXk±(‰KoŒaÓñQ¬1‘Q€ÓÒÇŽÐbDU›¦A»-ØRÉã‘ÑhtppB¸¾¾.·Ö}ooo<‡ÃÁ`p{{»^¯qn‡ÌçsÔk+ëÝÑÑÑn·ÃËàc˜,ôx<D„,ˆr[ÁJ€©Ô·AÓ09€sv”|û¶µƒËë{{Á|F.üO_ÿ²"ú÷?üýª°™½ÞŒ/ ÐnUج}h•¦‘kJ@Ì ¥ÚÝÊ0A|ëT•£Á`FÞ3ôb@ªJÚ¦ãÓ·Y1"ØÁØTÝŽñØuø€1¦yÕO<§¨~$­ ~clžTrT«$8/)«¦?<°ä¼Xú$¯ä1“?}«'Ê,lqàפâó)„à»XDgÍóž–Æb| ëÎo6ÀŸL5BÚ i\»í;?yxVQd»Ýg$½FY–ðFð"Æc¹mÛº®5tãµ63Æ0w1_îR82Ù¬ª*úPü®o.4m• Öþ¾’‚eq6ZÓUÃ@½înÕœ:c2&<˜PòÞ{¶™Æ@†œÕcæsJ4æóùôèø;¿÷c“ÙåvWÖ±Y>ªp b#”£"4«ÄÌÆy@>샲jClÅ´ô€Ù$WØZÛVÍ`0˜L&Óñd¦ñ`˜e™ErÒ„$«=MVÍBë¤=G=7´?¡éO¨ï§*ŒYd—õEÌ,|ÈÔ¡%¢¬µP–Iã¶¿úÕ¯`c꺞Ïç¯^½úîw¿ûgög£Ñn7GôæÍ»·x1!Æ< NOOÞîã´MÓ”Û ‚†ˆ’XÄŸÐj¹\Þßߣ£"0Îál6{öì^€ˆlnV«žB¸»»»¸¸È² }ßDd·ÛA;ξuwww{{[–åh4ÚÛÛûÝßýÝÏ?ÿü/ÿò/ò“Ÿüõ_ÿ5dSÛ¶UMDô'ò'þçþ;¿ó;»Ýî¿øÅçŸþå—_2óÙÙÙ§Ÿ~ +ïð‡ø‡Y–]\\üÝßýÝßüÍßüÓ?ýÓÕÕ3ÿèG?úñüãÿø{ßûúÞ,‹£££ÍnB¨ëz8Îçsç\UUÃáp·ÙBááåQÇßZ[5åÍÍÍùùùÍÍÍÅÅÅùùùh4úÎw¾ó?þüêÕ+´p.Ëò«¯¾úüóϳ,óÞ£¡Ö?þã?~ñÅ©áÏë_}öÙgŸ}öÙoýÖoýÑýQQ_}õÕ×_ýæë·UUa >`@E†ED/[,Ë^¾þh|Ó»ÝHD€pðWU-ËÚ÷íÛ·×××Ûí¼cÌt:Ýßßöì?ýéOÿù—¿ÄòñÇ¿~ý…bÞ¼yóîÝ; ùãñx<Ÿžž^\\l·ÛÆÕ¯^½*ËòèèÈóÅ_,—Ëóósf>88xýúõóçÏá"CÓ³J]׫ÕêîîÛ I¸ƒÖb³Ùh–ùêþËóÕòþã«ÿtÛŽízõ¿ü¥úïþ×ÿy³8ÖÝõð"ßÌŠA}y~·ÌóI’8Y¡³a†i„-s^D6Ûªišr·Ã,‘ïNåºÙ%kºêg<ÌñuéU-E1»~| F*ÕmÀ!Å/afQÙÖéë8¤@×4âpÈ•HbË9•0•dRJÃÄÔÁ/™îàÅ’#͵¢ 1)‰ÀYRáɆÛß߇äÅB¢‡F(ïbòhAL–¼«¾ÆiâXT\b™¦iCïJâ[Cƒ°ÖŽF£Éd‚]„ˆ¥Á0«íâ‹{Ô›¦a6)c>Ï­1¦i«²,oîïH%SEž„X•‰èhЦï¢PÏ63 c4¥rå gº½»J’ÈóÜ3Y[Éàˆ‹ˆjÁQž¨€½÷ïÎߣ\cã6'öC6Ì·Û-7íx¶'Y¶Zoëm;CxÔ{&D‡e!@_@±r€NöMÚ?¡u»Ýv»ÝÜez"ìOg£Ñh`ó¢(àQÏ‚LVæƒÏͬªÚ7mAŠŤMû;)uÑÁz÷îå“íÖ÷ƒ­Ín‰Ó%8Çué[ =QP©½÷èªôæÍ›ï}ï{i ²,ƒº…äêïòt!V8BÓð3 þ’q ×›bV¡1Tu Ûƒ’B(мv±p<7 <4eW‹ò¾a7@p€(ŽpBr#’UÁÌù «Ê¢ ÞÛÛ;99Y.—ÌŒTÃáp¹\b!Ðt=áxï˲|óæÍ«W¯ 2ƒªm{ï‹áš 'Ba8×!Éx™Ì©MNÖ¸7*6 yr ‰0 Î!––Çl6ƒ÷ÿþýûÏ?ÿüþv¹Ûí`u%tw4-§ãñA-<Of{ˆh@:§]ä\žÒçÓ­µI¸¹ª¢Ä lãáp˜elšår‰ÇaøEQL§S€=···Ûí¶mÛÅb1E¤ªª«««|­V«²,G£3C<á%OOO½÷p—1ãáDDV«Þăœ£Á`€G”e9+§uî§÷Õ*×ør³£ÝÝ‹‹+Oít>–ýC[Ë6°ßVS/¦A“µmÛ†Àª>!z{u‰€,˜<ÏÇã½lFÓ™sNÝChcT®½÷8kpûTŒ'ÖÌRžsQk)vcí¨(lÓ˜ºnšF«Ê‰sD4ȇ8\\×\R×èœÙ‡ C–çÌÌm«¦éJÞƒb<ǹTN*íy¥V©UrA!Ö„Ùˆ¨ˆö"ÂÆÜï DéâADÉTH¡ÍZ“e,LÆÆpž³µø¥Í2k­Úœ²\ñ.T^7u[–uÁæYd\͆År’å}Q›då9u‹~-©rFrû8` ÝÐÔ¥¶­zo‹b0Mö÷ÁËÙn·Ád^pµõjذɆӽ]ãZ@ÿä Æ›ôÌDÖª!ï¬#Œõ^I$Ë2É aFšªÕÀš DŒi½gcóÁ°m[mZ¯žˆ˜@Hƒa! ¢¤ƒâߢ€••H‰”$#k g9KÎ$˜ 1 ¦Š!&6F, ‘ !„ð;¿ÿ)›³\.QÏøâòÝt¶7ž˜ª©k÷@” =ÖBÒ8Ѝ6ÈBÚˆI™¼ëWP~€j†yáæC 禬†Ã¡aš€Ø`„ŒUÆë̤1¤6½J¨ybÈ$é–txú>ÃÌMSQU„e­Í²"bª‰.´In&4Û{¿ÝnñUUA>æyþìÙ³º®“Ž„Îƒãr}{“@ x0ÀCñ’ òÚ•%ÊVQžçp€pÚaK¦ˆÆb”oÓÞ{ŸÖÅ «ÀÖĤø÷²Zk˲„D†vI¶ ¤$Tr?Ûª*kÌçp8<<<„/5 ÎÎÎˆèøøx>Ÿ3óf³Ô†qÙõõõf½ýùÏ~rr2ŸÏOOOû·{:vÏjx?mÛ®V+¼6$,pr8£˜jUÝ–íz½†·ícÓ=ïýf³Y¯×Ëå[<˲ýý}¹¹¹!"ØûØ`˜7øsëõ mšÒwïÞ­V+lVØ+X`/Yk§ÓiÊ‹›N§ãé ?ƒ"‡›$o/mc¬5:C|“éœLû>‚ŠÛ¦-štüx<ÞßßFPÃ«Õ *Šbooïüü\c,ûÑ<.Ïs¸P8½x „ù±ðOlÂÍõ]¹¹¸¿¼¾¨wmCy)•(‚­ åY¶qù$¯Æʪ.N_9WcC*Q7mKD®Â‚VÌÛ,ˆÃõd2)ŠÂÚ»<ÏÇÃÑ`0ÈEÞÆÔŽm]×Ä¡nJñ$Fˆ3%OFTDE³B;£"Ä,Yf‰ú‘¦õ^;a#l„„© Þy` α5&ÏŒ1l ûJ½÷NþCÁkiÊ*ï}Û6!fT‚jPmc檮˪Êó¼L’ÜÿÁyñsµ½÷!Xk[ç³, ¤Æ;ãŒumæ2km>(Ø;¯¡qmëþ !ìvˆ "kQ¥Ž‰ÔýyÏChª:ÝvJPsÁš<ÙÉ} !ˆ!®¥iš4i­w^Cí«µöŽbèÍZ[hï6ån[î’w:ªyàjU­ª]Y–.xÞ‡”HY¼º3òYDЗWc¤ Ù Òð+Ú1-A•U9ð3)“²§àCC¤ ¾Y•¹m›ôý¨ÄùåE–e§gψh½\Çc×4ˆŽ•ey·¼»*´a`³`³º®sÛ),UUaTX“e!"5Bì…‡óê1^ç%cÙ2‰÷¾,««åRùÖ-v3C ¡O Ôœ.ÜÍN&TŽò=}K!yýéÉ-NÂIÎ(Ü#ˆcçÅH†ôê'§ñ@zVñB«ããã¢(à½íïïë€áœdkUF#}7› BÑOõ‘½É]×Ê&!UèL³”¼¨4ýE2½«.ôÝnЕû‹z¥@¥ƒÒ®'Ä <×ããc|æððpaQ(¹ÙlÖ4ÍÝÝ÷~±X¬×ëëëë«ËkœÏår¹ÝnQ÷ûòòòêêj~¸€Ã‡Y¯ªÕ®ì©’ÁX|dŽ5ÇøcüOÄ&éC1xó½½½äêÁ¼ººººº8Ÿç9^V`ü^u:BSâ¶XyžûȼSUï;n×#2"AXQÓétŠLôét UŠ  3 DŠ¡ßº®1:˜ÇÇÇMÓ\ß^·Z­^¼xqvvvqqFzò “?â1LkC!TU…¿–e ¥nŒa6»›Û·_ýê§çoª·Wæzp³WWÞæE6gï\eʹAS‹J6™ÛòÚm5ÒQ+¼÷h仫ñ^½×¢hòÜE|ë|3,y– ‘ñm뚦È2,.«’Íó<ÏlabÿJ,hÛ¶Âd [akM޳YÖ;犢ÈÊÒn·ä\c­„`rkÔ11Y¦ÜH–YÇÄÁ‡Vj×ú¦öMò  pžY×ÈÎ;×tß0#ÖHëá{yUuÞ»–½kÚ&s®#&<?¸¶VÒ®ÔS0BLa6=€y”ôX'˜Ž&^———˜õýr¹\æ6Ǔɘ­ˆ`~C¬¼(‘(‘¢501PTKU!¡6ºm—dg‰DV­ö" Éê2.€Kx;³äqB p6‰ÇNvGé²þkºy‚žƒ(P‰ ºˆÂL —eÙíííùùyUUhn1‰-ªÞ¿ÿöíÛÍfsppp||œeÙåõ|Û¶ëõzooÏuM›r™>ác… ÌX_hèÕju¿ÛípÎÖ–e X•—›†zƒ1Ã0„€ã×××···ÃáPU'“ èiÏŸ?Ï2ƒ5ÏçóùæZ¢š÷W$¡”éÌ$CŠ"*0-F„t;„ªªº½½Eg0Ä8ƒ€tË9‡p>‚mEQìïïòY–•eùþýûçÏŸ/‹/^ŒF£ªª°‚é(aoÚ-lDÄ¡á©@»c¼@†SRÖÕù»þâçÿø÷ÿáÿ½=_¯^lŽë‰w9Ý´µdâv×÷7—Ú¼öC!Zï\Q—ªÊÁgÂ^Ø1y Þ»@ÍÀ5e‰È‡º®vëÕ½ˆä6‡³Éd8Žg##4äa:nÛ<„°Ù„ª$‰öYšaL8L+@PcY– F‚/0%Š È€ñ>0k¤š8Ï!çºnóÒ¿ÈórG<°DNi m]HîA0¼÷UÝE"`NôNDÎ5@ë¢ "‚Ý•Û,Ë‚ú,dxs1ÌBb˜Ís\PÔ+üŸ9 †Vt°š,Ñ·¹—ž^×%<^ìÆ$E,Q0†Az裓Ðk¥K‰÷m]w¸ '1‚]eYÛÖ 1ZA籊SðND‚Wk- yïC@_»&8G˜¡àE‰5ªQ >bŸD]Ù§Ó²)³’MT)7â½wè%Ú’»îîvÇÌJœÛ®]n¬1fTäÅx–Ù"ÏsâPdÙG}ÄÌ××׫ßÜív%•” ;=)Ú‡¡?- µr·‚"E‹˜cö Ð777prRýKX›",„HU˜3£L¬^IYÈ3)©'¥“Âë¾EÆÚ.óOD­EŽOGØ(^r@ëÄÖ7Ð8«‹Åc(Ë2³«òa6›yïG“ñ`4¬Ûf4›Ìzï©É¬«ë¦®ñ8ˆr¸w&²FÁ~ÆxssA“ç¹w„‚¨f!Ïóœ*‰1ì\ã\c­gip!¸º.'“`pUVOB¦È!ÃÖ°ÍmÑØôàç.¦ëxuù ³¹˃Q¡Ü5’tÎA­±Ñ¤0 i ív[ÅÕռƦif“iUU{Ó¶¬ú0Ov»Ý Þß. [õ4ŒÕ>:<ªªÝÑÑb±8X­î¿ùæ«ù|0œž·¾iÛv·Û¬×ëûû{kåà`¯‹#XŒŠõv5mnDx<UU…¨!BËY–Çc"j}#–½:¯N,‹å|±¡Û[ÆÜO†ýDD®i‹,W2c·ëo7U킯šºõnº7«ÛÆk8yvúÑ'Îa©`‰5¨ªêææ†Y½oáâ„àêºÂr‹\Xä „RTàÕ)n<‡£éxrxxضmn³àüfµf%“‰XfCu[µ¾©šr½]Ïö§§g'«·åfµYž_¾ÿæíן|òÉ‹WÏß~óÆ9WíÊ«[ íž IDAT««Ïú?ýôÓ³Ógmݼ~ý´sÈJ@ÍÌœ²»eU·Õh2M†Å w¡m\͆MÓxuG'Ͻºív»«¶7ËóøüÍÿù·ÿþüާÝ î›o†ECG†¶·U5(ëm6ñÃÆ¬Çæ@Ö_U £G‹d9·ÁUmÕ†º.kÆJ 1í,ôG`öìê]½¾_c8—ÄUåC"Ê‹Ñx²×¸¶cf8ylªA ³ˆs!h Ʋ š˜´˜|ìöÖUŰ ¡¦i¶»]P ªºÝ•¥‰1­sU]sëÜz³Ùn·eÕúÀ‰¼8ßÎg™…ÈklVpÌ+%v^y µo½òl­‡YV>išÆ¹P–µHKb´Ôáp¸¿7Ï‹‚X|Ð,åz³Áyß‚oEŠ‚XËdP”‹#á¬ËHâÀŒe &3&³6„`¢MæTYI”,‹eQç.ɬÍÃûÕzWÕyž+ËfWŠÈb±¸¿¿/Ëz0x着‘ªj¼×MÝæyÎDUí¬Í&ãaã…ÚÇ m‘‡DHD2ëí(ÓÀ­RåÛ<XcZÕ,3£ÉPˆ›¦6Ï›¦]—±{P3`™)I8¸d ÚÁkûé   ªP4ÜED;€}À&Ôí®U1™ØÌ01±¨Ôä²Í£Þhc3! óÚ½×o6öž„O懞4„p0UMY×uŠ‚m6›Ýn×¶-Y#Æ´mëÚ6„ÀY—X‘óœ\a"j[%–.£,µ],#0sPOA™ÙŠq­[•• òrµ¬½k5T®ÝT%¼ÛU'ˆž_ò²©‡?yvÂlÓo’›•ñCñ:Ê=¾Òã´‡å& QÆô§§À‰D juA•Â=ÒÝ~-´/F z<ÃÕw‚Ó<¤ÉÁ£­sï’+zž}a·ÛÁäõg^{ÉÇiÎÓã4µMŒ1pÑÒƒ•»¹¹ ! Ô„IÆH‘4Õ¶-óÂ"'ðKxr #­V«årypp‹Ü4fNÞG¤áàJs>G—‰åc(Ö ­ PÁz½¡)„€–€(6› ¸èwwwÓ鯇I¿ÁTжèP²11&¡)Ø– ‡ÐãöCCà …뙸¾À*û»¤0\à3o·ÛËËKDßa>£½¾¾6ÆÃøÝÛÛ ˆ˜àõàÚŠ¥ØKcLtHRß|óÍÏ~ö³Ÿüä'ïÞÝ…l¶\ndægϬ!O°µÖ²ebï}«mç]i§ðBÝjãØ§îÉé† ˜D E HçÝfŒq±pb4mË] õsÙ]ì"•86›‹]ÃA“NáCk-R_BÞù²,C ð pO+Ô¦3ˆ5RyZ.¾²wù-ªªü”"à"¥Â1ìU¯'ÝŽÚ¢(¬íPë'â.)`Ã"‚âÑqBÃ]• ÌA ’'óß¿[ˆ…5ÒÔñãLñä´$“=a9ø®Æ½ŠÍ/©ÀÈñ¥_yŸÌdn¬ˆ–Ñp8O¬µ»°uMó­áÿÇ«/©/ECPx«$*d˜I„™÷GûιÉd²¿¿=vãÍò¾ªªÝv»Ýn±úCLpfšð,Ë“ËÄ1CÌã\G_Ý­óèMú„ø"¢ªªì·B»ë¤ßô¡ð¾-Ó¿úúû _<% 'œÀÉ7v¶Qje"[*‰uf†tƒcñG‘qªˆ`À8cmã’;òd ûGB{H{: ýÑ©úô3E<o‹ç¦ïº˜7h¡xé â²Ñ1èÜpèz½Î²Ò<©¤{‚¼ÝnÁV%¢étB‡óù|6›Áa0P×õtoÆÌÀŸñ- Xõt:5Æìv;üpŽlX6°$Š˜ôFQŽ[k'“ "ÁÊG"JÛívhu Tc¾ªª»»»,˾þúëÙlV×åùùùýýýt:===¨ ` )`p—ú–ÄL‰Í ‘GðJˆÇÀh`f9O1ŽÖ›÷F ¶ø–ëõú›o¾išf0,æÛí6˲ù|^UÕÛ·o½÷óù¼,˃ƒƒDÂä)G¤YbÈ ?v‘ª"ãœ>Œôòòò—ÿüËÀ¤!xŽ?ýíßöÿÏß²}(#cȨӦiêX†ƒÙhô©aI&Ñ“£NAtg•ˆ8HÓ4èQ–R°9V’‰Ñå®&IRu)ØÄÌHñ€ÈÃöÀJ †…1pþr‡è»K7©™tO<1„€NÒ±ª*ôoHÎÞÆuªkcU¥Ñp¸¿·¯>T»ò‰Ì|r´ÿ­×ä_¿I L=Š*KÂù‰%ò—•:ý¥ñ!ÌlYÔpnmfì /¦ãI‹n׈à\CŠzï™)IŒ´™¹ðJÿï–¬+H©BšÅÇ")þT–¥Å¢&uØ_ž'[$íì¤0úJ«ÿ~ƒ@84DÔ÷BÒ•t|Ú.)Í9…— F MoÕw4:…ï ×*!ˆêÁ‚ãÔZÛ¶.­7÷ëF.Œƒ²,½†„( L‹G!¥ÞÜÜ` &“Én³Íf¯^½ oß¾ýòË/—Ëåp8d#Ëå|edW§VŠñiìslxLBRxÝ΄äiÛùâà‡?üá'¿ó;žÈµmËUí|P’¶i¸âÚ×›“*û A-±²ÄˆÕ£|"êJí¤RÑž†°Hûû'ÏóýùAòÏ’aí½w]Ô&¤ßàA59!V桎͗Ã%e Á} —}Œ™á§ª×°™¬åôNÊ 6d,÷áÊ£ZtÅÁÀ©éÆoý þ¾Æ„݇ÛFYôD'1q>{Î…-3‹!U§äûå6ÓwE„¸c&ð/­N `CšÇiIäÆÏÌ*B"(tæUQhë¶}$Õ‰aºcÀ'Ê$ò„}\@~,·»4réUjû¯4™)ÖÝ*ÿïÃ\ŽÄ_1RÒaˆÛªæSƒEŒ²ÑÑ|B8š/ʲ\ï¶›Íf»Ý6MS×fBn(ÚñI}þ|0Üßß“Øl6“Ù4}=Ñ‹2 ª7Uçβl±X!Øßß÷Þ'BéÙÙYWgFˆ”ê²r›ÍNÉ‰š¶æš‚:G”ÑTú˜ÖòähëcdþÉñ½.OÞ{ ç¨éò8ºõu]«<$€õÁ+x$+fbtjÕÆ ªHÞãtðŸü®%?ì½$‹¤×i ïFê©£ñÃ"gfdé[ÅpRD°í±jôÁ•tè ™,r(N†mcHÕ8ßhx袓´…ˆéøö0I“‘¤¤e!RÛú2[ ÇæëËÊâeHœŸ4:f¶$ÄÄl¬±Ñ>•¬Èóéh<È‹r½ñÞg‰ŠÜ“rÎÌov}¸÷ý5µ’ W·çÃ}fbFýÀD0^U…X™Cä“’v¥-A“k«†­äDSí:¼v·Û¢.2®T<àá-‡Pú´ðªÐyØf}ƒä?Øziécß÷ɲõ?ß_ˤè¡aÓÓ$ª¾®Â³’ÒÒ­ÀKHÜàö ¸§9Ö¯Hº*>µ—šr­|Ìœ¡èˆ÷U õl±w§ß?88@I0–á{Õmöïl6;;;ƒ:„wÂMѯ„Ðj4ÉûsÃÏX¾»»;U…«º\.û±ïµ(Šù|~rr ·X,ÎÎÎHÌp8Üív/{{{gggûûû"tvvöÝï~÷Å‹ƒÁ`³Ùc@Ïó›ä&&=‘BÔÉ¿ÇĪ*Ìàâ±Aôþ S7P§N•6ÔdŠzÀ-žN§`É!l¹\¢¦GkMÃɃ–BÞ6Apw»rÆ’^ÜßߟÍf>2ã_¾|i—œ‘¶T×u³ÝÖ,š[jZã-:&ó\Ué°+áA¸?>×BlPŸ—E„±ªJÞÙ…˜%ކãr¹„ÐÇ<àýUQÙðA)¦©s±è&ŘYwîȡ孵¶È-3[›[kAr¦åR½ÉÞ©D°™£¾OVl–e™E}Y !xu3Û”ö׃öMÞ'È¡m¬°kbªÛÉЗý_&û ³¹†°±ì}Cm íW_Dˆò€ùƒÊ\Î{É Ä“[ áœc­«„–#ã¨;¹¼'¾/’­™ÿ4"‚ªîv;×´È’—|B½Èã¿éú—uÊ¿õNîÉΞ0³!rÔµ !H+FXŒ`ûu$gi¨!ç=ºw‹N´·7K*ò5P<§,+83?Élòô¨Ðǃk„ƒ 2 胪ê‚ïêARÏÛÃ`B/džb¿¯TÒ˜ÓÜ¥û@á% N?ð)m;kø„˜X ,1AvУ šæ˜7Ø™™AÄié«:Óf"”Ïx1XŸéå“…zÞt–èÓ¡?ðþJësÒÌH¯äu’}>öÃHp"uJUÅ0ÒT€×A¢ò- U½¼¼D|³Ù¼yóîèè(„°Z­Þ¼yBØÛÛCÓU–å7ß|s}}L!p¶Û-øEQ€ípšÆ“Êx%ù‹Ã†–²± TNY–WWWoß¾]­Vý)Ês;ŸÏ_¾|ùòåËéi‹Å‚ÄL&ìœÄXvÎ1wÙº0 ãQåño‰ ®W6„bи=¼X|àúúúêêêööãrÎIL"ô½^¯ëº¶yödÝC,€Ç̰] †'“ÉÑÑQžç÷÷÷ËåÒƒR£`-€‡GôÆ{¶ñJ‹_çþþ^Ug³YÛ¶Ïž=#"ch:ŸôÑGÏŸ?ŸRK¬ä±ÉmÆqë‘ *Db 3+“U ¤LÖkgÙ‰†xlòÑ“†*™é@1˜š^{&Em›¶kއqÓ'w¡n2,.*®4MË QùtÀÓñìš#= Xõ&qÁ‚FÅ=ð¼ ç IH»H|ˆ½Ù±ñðÂÉTÊó®§‹Èà[¥?.d”˜e í…¦JƲsÔ ?T%”^ôJ¸3t|,¢ÐIß1ì¸ç`&Q—;>zžçÍæA5¦Xˆ„ÇTÄN+«ù#&‰Ø8%éú"çÆZ1m]¯—«º®'£qëX®ýë_Wÿõ®ôô¾T'"õ t0‡^Ø8#/_ƒhú™±h¤,éеæ¢"Ï (†Ã!Š÷Aã®×ÔÆÇ³!„PØG5Às*¢Q{>ñèDĦüZ¢l„z šÕÌ·þ3­hÂ];Éeºì¦tûŸïé…&õ”tIÚÜ Ô…(DÌ2YÖOnë{åک˳z´o’gz„gêwŸ8»}mú­" 6ÅÛqõw?EŽ4ÐQUíû”fô !À¼…’JW¾{÷îþá^¿~]×õ×_]UÍøÃõz}yyùÕW_F£ÓÓS˜Æ&¶ÙAÑÔãããÙlÖz·Ùlð8…wwwιù|."L³Ù ² Îq¥8}òñIÀ’hØpww×>®d‚‚š/_¾<;;CÆ-dnãºFRÎ9¸é···D4QRj:¢ð$rrr< , “§ÓæIè(ÌÝÝÝÝÝž‹3cb±…DI«ë:+ò´åLt Ý™e’sêº^,èеZ­š¦ÙßßOð2ØÎ–«*œ¹º®E(›„+Zk‘#0c¹\N§Óý½ý›ÛpèB <Ï¿ÿýïNOÚ@6e‚œC™ÛºÊIÉXcŒ'õªÈ«ZzŠ÷h¯uJˆÔ‡´Ã†S,òš¬aC ½›â貯«t7/UµH莩Fcw³]2°£IYU»šÀ¾ÃÀ°ÓúŠ?iâ¾ØéÏø£ªYÑU~ît³-º:¾EV7GœYUëºf#Év¯ª Ýúš¦ оàJ»«/U“&"k,†ˆ¼qFøåÂ'á¸'vXDÜs¤äq Q{x¡öhYEQh]%!œ–RD4Ê¥þ;‘jWÄJICÅc ÞcZ6› Puêö¿¥öí0gŠÚ4BÈDJ!(3sPf% ‚f2(¬DÃ%¼ÛŸyšØ&…ˆrsŒsšü4FD4OB¬¼»Ýv1㺮½>Ts±¾3§tÿ'¶ÔCõ íñ,ˆÈÇ:ÚI5&ð:½ÆjgƘº­:èx=“RðB¤×ú Êc0 e[DŠ,ߟí]__·uã[—$øv»E‘?œàÔ©§ÀB¦­»ºÛ 2c½o‚ï #ZVdy[7åv·Y­‡Å,ßB µÎ ǃÁ¨`CÊ„[ß`8^Cë] µyfŒ m›eyç@wµÒ(z ^‰zç¼:1¢\hM&e‰ÕTmj<ÃÁ2 ]p–ŽáRTU…|·×wV²ãÓ¦iöæ«ÕŠ™ß¿oóìŸ~úÞ_œçƒbW•Y–íÏ÷î–·Wç_}ó«Ûû›áx€¹Ãáðõë×Ïž=ûÛ¿ýÛ»»;,ÿl6CåÍfsyy _óââb2™eÆRЦªÍžìMgY–¹¦ `„yïˆb焦Ó)zå¢ô”ÊÝÝÝùùùû÷ïÓÇ4üñÇßýîwS¢Ñýý½÷¾ªvËåRUáý|óÍWιÃÃCçšÙlöîÝ»Édò½ï}¯( ”bCàv¹\b6M“ÛÂ5¾µnã·£ÁxçuÙ§ˆ¼^\\üò—¿¼¸¸¸¸¸`æ³³³Él:NÏž1ó¯¾þêöþî«o¾fæápˆáýÙ^n³º¬t2~?úè£/^Ìf³õz}{{{}}}ww×4Ír¹¼ºº N9ÔÕÁÁAª·lb½Æº®†Ï rYÚ¨ÉjL›–,r‡nooonnÐ剙ѷ m-€N£®õËç/RѸ<ÖU‡âOñdú¾|ùòðððÝ»wX8c ˆ` ©5U‹³m[ØÂ~VUØ=©B8ðê(uÎm·[Àu]LF“_…ÞåEë)RV#í“Y;s‡ˆÈ‡ÍvU¦,?À˜ pNŠ­q õ=ìôò&æ)<øF¬µ­v™u]áàû®6î“ÃéœjW]“‡¸•ttE’^^G êãmSˆª{ÃÄ|›ð0ü ¶`l“3t0Ìm&JÞù¦iÉÓ´ÌÌ­««zŠÀ|ëê N ÙLÚà:ܘ;gºä"’Ù¼è5SO20Í[ªv /?7(=[©j£Môb[ Ò%˜<Ô4¸¿P rÃ0Ój¦¹¥_ïêHCAƒó)D‘Á›"ƒÛÓa%¦„cTŸO~`ê)ç?ÿê+¦ÇÿŒAñðþÍîz)< ϲÂPFιÙtZÕuã]Ó4«Íz:™lVk€pª*Jä;@ÂÊãˆzRº!<Ø›iƒöqÔþ¡åèâèI Yº³DG$S8ôÑÓ¤;íË]…&…&w2™äyŽ ¯‰­ÝC/zí½g#éAI§óÿ²z îOt¼ýõÆžãH0éÏFµpBR䀙ïîîŠØ.Á׸' ¾6Ö J¯qrròìÙ³££#¡'''§§§Óéj!Ì««+À×à• çÜ,ÄwÁ÷IùÄH¶™N§)½ÓŽ!×uûÂ{²(~@°0<`¸¤www777¦‘‰ÙÛ€@^½zu||,"eY¢{ãõõuUUwËû‹‹ pžAI“؈â£>‚ÂÆÓçóy]׃–ç9¨Ì,Ô1PL¬ëý|VDj«ªBÁ²W¯^=þ|:‚[ð3L"ij»RÀ½ò,¸íp8|ùòåt:E{ãýýýÃÃC8I ”`0la¸Hl•m 1i/ù twáØ¦inooñò¨ü×¶ÄÎ!`± šÒ¨ãþ`aKPpD¢¨Lúm\Ë´¯ž¯t “MäCÚÛýGCMz×e"@kàt¦Òó½Èò8ÐÓûù¡”z‰:‰ðäýCè*ø„òɮNjT´ssΡ^rL¤…EÆLÎ5uMDs-„°Ù<î 2ƸнÄÚp8OFY–i ”#пL¬• Ç#Ä´1âXÔy'­S" ESÌ9—ë{lvå®ú/3Çcï=õ´?û¾G6߯¯á$†ð €C/Ržä°ÄR£&²ÃRÈ á!ïŸl!ÈPc-]Tª¿¡>üàJûüÉ/ÓD­÷Þ¿?“YÍDd„ÍÈ0«j»¦Ô¦&¸Æ¸§oßõ‘IÒ_×4¶t g}$ã$Ã6ËIuaO'užæ"…+¨×ˆ&]7R‘ö ]¥+õÞ O=[;ݧÒ_©mÛív‹¸=<àd² §%Ñ2Cm,ÌÂËÝÝÝ×o¾2ÆTUu~~~yyy}}ýæÍ›»»»ÓÓÓëëëõz q z2aÀCF„r·Û]]]}ñÅ7w·p=%bAÒ yBsì~Q×õz»iÛy2ÆìííM&H"d=‰Èf³¹½½K=%S ágçbÃ!4Ä­ëz¹Z">„°X,‘€øÉ'Ÿ|úé§GGGð§ó<Ç ^ 4Øô*«°>B>BŒÇ'ÁR\ªŠ\&ˆ†Ýn‡94%”%®<6ÌHz æËt:],àŸßÜÜ, 3å@ƒ:_ÌH‰6±’WRB)/‘li󯃤[¶ÈÙÙÙòËÕ|>F_~ùå—WÿΓ5¬ÂÄLª©U(3‹í’w¡w%é^z´ç5¢YI‚<1Ä}/-5ùJ@ì IDAT»8ž&–J÷1Ƙ˜âùHz:éßË O3¹gçªmÊÒSl,PÇ%]þðI1"¢10 €!åø¥Óä\@â8•=zÓ|ŽYa‘® ­÷ŒcÛÆú²]Ž@ÞI˾ÁÌJ¦†Ä¦¼MÓ(«#ž¤“ªç]芈a°ž(ˆH]— dä6óÞ×M‰l%*ŠLÕÃhA›¦ÒžGÔnË"ýúW'ÃwM !3ÖZk„áö$d³B–n7/‘ } É G!câ6`¢o)ËõŸy%=ÕŸf&úÔç׿¤Gc|ô¯™±¹Í9ãÂ(øÙp Ì Õ …Á´ÛílÚ÷}£‰ãöM¿‘‘Œ_<.ù—iÃõ•SÀé+IÖ'].=ÂTº­éI‰r,5&‘¨=Iún2 žZ^_‰c{ßZL×è"÷͇ӟº'cÖŠ‰eá#bŸ’|TuXÚ^O¤¾ÀB°öýû÷u[¡†Ôýý=Ö:»¨ir5À1±F·sîêêªjjè³Á`0™LàoLÆš"£ E$˜yW•˜g<¶04 ´ìh42ƬV«óós¸˜‡‡‡×××eYB©8玎ŽPÏëââb6›¥N»Ý®¬;.3Ïçó££#ÄVô£#É'UÑ‚<ÅЀ$?Â|7{É­ÑÈMpG £@UGàšcP o}»'gµZÙXöÿþþ~JôšL&ÏŸ?GVÒ|ábÇÐYcÉ‚Û ÜË„b)à`W`,§§§ðPÓíëï~ÿ‹/¾ø»_ü2Ëúsû˜n Ü%E½8¦E‘‰Ñ²trqõµi÷j/2Å1•Àu š¸oŽ'EÞ9ôáQÕØtÆûºœ'_¤«ØýªB$fG}‰£âõèó± ˆWÔûà˜Ù¸.•AjŽh\2˜Ùû6i;Ücçš”F߯~$£½ñpЇšY$CÖ»rkŒÉlž q ëîÕ›W‘ˆ`é6®zREH\} àa5zï)hˆ4‰($ÞHÊm !˜žàí ¥'ÒïAþ :(I?À`™1VŒªŽFãÉdRÇž¤©ò‚Nb×öo¿{O €+ÇÌ@Ùÿ›Ñ©ŸØ(¿Á×ûv!ÅùL Kˆ4ËœeùÀf!„a–òÒ>RY–6­VÚèéŸé¡ S¾PBÌ’z !(wù &6„×jêÙ×6–:KPL_צ½ûä„KlE‡»%g´o@š$ÿ›z2%Y©OœïôÝ$¸ûï@=Ñпmº³öJ÷A]A§bŒˆ#¦ t»ÝbVácA"³¥èyP4JÓ½¸¸8??ßìÖ£Ñèìììûßÿþû÷ïE’}ÿç?ÿùéé)Æ޼Æñx|xxxqqQ–%´H,ÂÏ×ð®0"(ÚÔYe$] ¤½½½ããc51ûûû···é¼Aù؈žˆÞ¾}«‘ÇM¿Ùlîïï‹ZL!÷à2Ñt:ýøãøÃž½|ùcÇ 'M†Ì(´ÒQ—X†%%JqŒ„J‡:ŸN§ãñxooš©ÕóùüææÁæ´3aì»Ø|&•ÁŸû„uqqqyyyzzB@ÎØ°AD¦¶Q¸Ûv»½¾¾F›XXwdŽÍ‘ ›eÙ‹/þðÿ0Ÿ¶GÏ4›ÍÞ·_ã+! º0 ‹jÇX!bâ¤ÌÄò¨ÞáG¦$=öÞ’dé[“ÐR#S!„¦i`çáJfkÿÔcG u¿é;¸Ú‹Ii/AcÿŽñšþ!M÷ä߸¯}»m«SvrP%ýÕD–F!³]ÈÌÅŠ°éD‡€±“÷ê\Y'ƒ{ X¢ªNw³Ñp2n3;0ÆE–™ˆÌ¦{1ª»p–ËfË1“& €+H¯ ªÚ!Hä|ë½ßU»ÝnBÐàUµªJ瑚̶®A®jU—mÛ«ó­w!±¬ÿuü¯_¢dºÅ5±L!ŽÌz½6±°.N:Lç,–þ¥È0èo‰´Žªê{­¯"òü_Eûöµ@“SOøÿ·íûu†ÆÝÀï)tdV‚˜‚—‚å@Å£"ãýB î'÷pèU.EŸÅ´Þ>f"™^×?í]P¥°U5õ«w±Ýlнq/#!:¢[ØtYw™4Ÿ¾mžžbf›o;pÌN2Ê𳉔“´N!’8´YL Æ‹|Óä ¦N2)ï6•O’˜P/±Ž?ܾdf¤ººÙlîW÷³Ùìõë×GGG777[çæy¾X,ööö^½z5ʲ„" †ãñx±X¼~ýºi´…pÁc¤Ü‚¹}tt„öì{¢WXkMÖ†¡§‘0ƒ5‚ &Œ’ÔEQ<{öLUAGºººÊóüðð0Ïs8‹°Òp€ásïÊ.ó¯zzz kàòòòg?ûÙ»wוּˆñ‡˜< mŠ6MXhc š¤‘lDl$œCàrC©QÚ6v„¥hQae¾Ae®V«ÛÛÛ,ËÀcßl6_}õÕr¹$¢ŸýìgH°žï/°:°uRfà0‰T5‹sÈ8̲ ¹ãÓÙô÷~ï÷Ÿ³ñë½öÙg÷Ä«––˜™­‘@¢ÂʨE%J`¢Ÿ['Û””øPI¿¦CMôÈ M³gc£OØ:ÉûlÛ¶õÀ¸*×&— 8ݪC,‡ïñ$€Í$ýÚú§é}ÒWóI+w‚E‰ˆB ®§sŠ×Æâªjf}!F1èƒæðÆc´m=::„D’…GÌê}[U»B{ëªa3¶FrÉs›åÖ³Ýì Y)šûx™Õö^c1WÌ'~ ²¬W«•s纬ªív«ª£áÐ{¿]oB£Ñ(MÓÀ”t±@ ÄdT_ÍpÏ‘øõuŒ1F2rY&"E–‰²‚éQ®úí[!<]ÇôOÖ´Û~¿þûý«×¥C0 ûÚ÷7ÓÁýû¤ØHŠ ÂÁôÔ®ÄEREòôž’°Ò»úXë2E¶ú»\cYyIL¹í’¥W-ÅôÛ®d"¨ÖWÀ¶×;-›‹Õ úSébaëð¸\å—’¥u¹ïe¦§Èõ¼jH™þ¾ ½Ú©„Bèu=âèrh> {YkïïïQÄÅ}|¬Ö„)Ñß1}I—Áƒëëkøßÿþ÷!»Á«Z.—'''DÀ•н÷†åøøx4}öÙgü1tüh4"éÒvg³ÙÞÞ  ÀÎÀÄ äg}6›iŒ÷3ó`0è [F÷ÔZûìÙ³õz½¿¿ß4ÍÍÍMžç'''Y–½{÷îàà H+Óét8Þ¯–ÚˇnÛöòòòæææêêêÍ›7Ûí1ü tÐ`=tn„µm˜IË'} ’ÅæçÚkv§È3xX‰X›ŽÖÍ &“ ÔüÉÉÉíííÛ·oÏÏϽ÷Ëåòg?û™ªòÑwF£šAÚn6xÃ«Õ í(²,;::’ØŸ ö.4zŒ³wïžÍN?þøãáÞw¬îþû?øwgŸý`ö¿ÿom¢"ñ"*̬Bä;> ÊÓsC;u˜¬Ï¾¡Ü×Áýí‹ 2bß4Mã;Â-j‡!)®( ´$¢ˆ…ÇTç¾LøP¿Šˆ(«Æºˆ*Iy?‰põ tüÒ«jˆ"¨õ5,¶¶kû¦DyúV_ˆuA0¬‘` è%É—†€£Ñ´mk[cad|x´ FJBˆ,ª4™ëMW†%Üg6é æTU³^¯¡€Ë²ÜDt x³Zã”!±§çUe’ç“Ö2Àõ¯¯i:îg/Ç$MõíÚ«Ó'‘S"È‘–‰{ŠÝ¾ì®g²Qø/¤ŸŒ´÷ÿeîO=Õ›v2©!ñذh˜©ÐUE–ƒ4—J&C°Ø„è&S‘"DœDO?„z¤b»Í¨ªa;, ‘äC¼œ•eé[gX ‹kZVšŒ'UV#›åùË÷«eÝ6»ªt¡KzC€ .ž+…¤wÀ_5–Î11×-½jUUuÛÔmƒ¤^6bȲ±&8ÏJ¾umÝ4UÅDû¶~è0ß?€#[dyÓ8<”û6¨'ÃVDi±¿S¥­´Ý‹xAŸ9çÖëõõÝíÍÝ-Zý ×´†å`oÿôìäúöªjÊ/õˬ°Þ{ Êò¥é=88X¯×‹Åâêær¹\þâ¿ðÞòÉ'ëõúææŽcÛ¶‹ÅâíÛ·?øÁþê¯þêööõŠOžæƒ"Ÿ}öÙ÷ðÙýý}žç‡öèââ"ÏóÓÓSä5Îf3k-1Wu­LÛrÇF\ðMÕJfÛàbQ™±CSÕØ*èNŸð4ôÿ1™äy^Ö;¾ß¶-*ëÝp<¿¼¾zþòÅåõÕ~ðƒç/_\\]®·6²Ûí€x‹YY–½ÿÞB™÷~>ŸGFõáá!ôÓÉÉ D†•®?„÷çx<¾¾¾.²Ü°LFãÃùbk±X°>Ðý)O§Óããc"Œ†l„lv[D¸×FC©)ùå—MÓÀ|9??_­VàcC¹"Ì¿X,¶åæòúâààà³Ï> ä£Â¬…UÚÚ•Ûª­Ý° ‹‘aÛÖÛàôW_~U—Íd2A"užç•ky^ÿÖÂŽñâdöŸþþŸütòûÎyâ²®}S7LƒÁx@E½óE‘9"×Ä€7KÐ.óÒ3iS `$àF½DA…$í Bg.&ùÐ’Ìœ¶ml×eÙòÁ97°³7™23Ú¯ª°Í² Úx×wd, !ìv;&ʬ•шT·Ûmë½kMgƒàqÌl¨‘ KÖæÉ Ž6q ‡ bìp8d9öLÛMÓϮնqÁW®Ð,ËÜ ! Æ0 ujšz³Ù ö³ÍHLn3Ês¨vvN­5Þ{çš¶õh2×¶­Þ·uc„¬µÁp[7-‘Ír`ÔdWB,ƶmë[gÅ4M×]j˲Zm@@&@)V‚„©w[ŽÈ|Yn®©w Ò„Fm—FÇZb]^HòDÈGÚÿ´½K“%Ç•&vÎqˆûÈûÈwfeA4A„ZDk¬m¬2Ón²Ój~ƒþVó#4 I‹YôJ‹ëé&¬[$H‚ ¨Ê÷û¾âÞˆp÷3‹/Ü32  ZÝœk0XV>âÆõp?Ïï|Ÿ÷LYAƒ§Ü‘ %A©YU%³[Ùˆˆ ‹ä™ {U½ž/«zm­ÝTe–Í­¸z3{¸ÛšŒÃÞr¹\•k›ÙÐ*  kDD¬Øvaaù 8äº"×ÉÂs­[î” é¹»í†G©™j¨cDêg"ffÿüÏ»ïBê6IW"¡”®3 MÄD䜗dPvòA•H˜(ˆjë¡À£JÊO@ùT̡稹´up7ö¹4frþi^­{Òˆ(„§q=Žp_Y[SE(tȺºË—.ÕD2ýôËíƒé(¦DÇGàk ÜÒÅMÖ ÀÁ c¼ù_èðã§¿ÌÓ<}J…56´°>À¦Ú, Ë N¸AdBHàŠ¢¸¼¼€Ù9§J¤¤JMh±Ð€íìì Ý8Ûa2ü(ÍòN•(˲tÎßßߟžžŽF£ÿøÇ Á„ìÀ&¢ S"á„Ó‡ÃóÞ«CEºÍ9€ÒZ,777‡‡‡x¬x42Aá„Ä]c²_!„étz||ŒŒa6›]]]lö+Ád‹÷Ì<÷÷÷‡Ãaâ_Eôƒ•GOÝZLÛ‰—8—¶%b#4¹±V`øÂÕ@*¹»» d2;ŽM d~{É(Z$1QÔÆóÓÇ.&ïýÙÙYžçççç¸NokxûÝÕî«bû賓ƒQ¸wtø×Qç7& ½~/õÖ¦aÇi¤£Í[›B"B>01ˆp‰H¾/íàÒÑXëÚ„€Òlumb{èDÄ»'¾nþ y‘Ñ©0cå‰È%áôP^¼¯‹²¯SU¸™d|»¶fØ¥#¨ëP/!ÔItR%YŸØ ©…åePnù É.u°uÚŸÓt¤õ¨¬@™«ªêõzƒ^û3->6ºÅØQ0¡i/Ø‹*é6ê¤uÍ»Ä5ìœkÇRõi·  eŒ1YnŒZDH¸ñ®ñÎkRˆÝ’° {¯NŸ>Nèôïð¢iŒa#O’²O£I"®ãV_ìïÙ£ÿÿ_œšµß7éó/©*¥Ê|G~^ Ј3PÕV^ƒ>À-kçÕÍz³H"ß=EÉw?grÀÝošÎÄXžçÈ'P\íznXÞmÅ @€¨Eýžþö…ÍšÆTZïT#’§(Aa9ƒt£„~˜Ü9æ^|vêà<9‚Ëp3 ħCJ[*ŠÂ° ƒét ñ¢ëëëÕj¥Jƈ÷!Y=Œâ Êº½½ýøø¸XÍñõÉÉ ÒâäÎÃÇL&çœkÖ‹Åâôôt2™<>>B› F´`Q¹BñÕN,&â„GíØiÛ$‹¸numïîîÎÏÏïïï÷÷÷_O&“ªªööö x{{{{{ ôòîî.Ü-@FÇÇǘ?~ûömQ©œjÑiØ:"Í].—[[[èãQÂŒb³¾ØK(Ðï÷$ë„ú @XøÍÅb™¬9ç`¬qexJØî²,³,ûì³ÏÞ¼yóõ×_¿{÷B#¸Á9Ò.Õuº¡!…wqqñÛßþl$€—/ U5Æ5´ñ—Ž¿~ÕÌ¿>ù߉¬•<Ï3ïÕHÖëííMìöäjq»h6"âÙ3Q`2ÄÆ1†BP:«Äàhv»»:”–¥ãŠžì‰r•c7ª]syv4Rèã´îZÿô^Üáøìú¼ž^žk­’‡È›ªt¯œò‡îIÄ [(]-Môá­gFå ßÉóÀÌ©zÜ]“Ðé[¥z¡JÌÌ8Î_ff8QÅT(úï,ÆÓ™|yCƒhâ†vVÊ­Ëe7—h šÍ}hW¥ ÅâŸÑVß%eÀ&ŠL'Ò ép 4½á'mä¸7|û–ÅVµ[ojçU ù@J”ƒ²Ը༲0‹U’Æk¢Œ¬@ªò@ !¨²*“>ãÞ§?úú—{ÍèU¾o”èOôJ¾Œ;ZÑ-¶|›<_ˆ8O~ýM÷×Ý‘/ÂØî7_¸áôÿt±Ý9´P@ÕO¥ƒ:æN‡ÿE`‹AÜU·ÍÞ½4˜(O” DS×é÷CGñ4¡¢ðç<“ɽÞîȲ̫ë²/ÁU0swt Þ8~Ši=|½­­-;¢#Ø@âà[*ºEQ`%"'''{ñ…üÙ6jzUUµÁ`>Ÿ¯‰h>Ÿ/‹õníh4J`cX( 0¤F¬CŠ]&µÁ2J&ƒÁ`8‚%?˲³³³›››äç@,µ^¯wvv~ýë_c•àÿˆ8ðÂÞÞ^]×`óxxxÇeY‚/ ¬ápˆ45±³³3ôªïïïS<§±eLR± i“`U±òpf裓~YDè0óãã#VbAñÞ£¶ ð¦«qMîápˆ‘åËË˺®wvv€5Ö€Æ~F¨—Øê(”ôøøxqqp ’Ú´Î9ò.§Ü´qIæýÅE&ÄŒ·¶Œ1™‘b<ÞÝõtgîËÕ¼ScáÈäì1M$JAb)Ç?¸uÌñ"¹1/ÎWë"lB_à\Rì3ø®‚"LR#::9›Ð‚yŒacÄd‰ÕÇ«j]»swŸ¯>K/Z7€’vðÏ¥*Q2É#õbY–Æd)ÆzẛªÛ°KØ{‚„ÀD”º?Mq†bµÝda«‹„qxpp+ß–L²(é‘næ69±%‹ ^L‹¯ª°EnBæ©ñ±÷Ì"™•Ì23i,fø@ íäÙIIÑ­µ¹ê3œTrÀØÝÜ¿" Ï Ú᳨ JÏY·°ëãú¤ÕJ„&k–ôTÕ9äeʨ“*Éó®Y×i!ÄÉó§æ±ª®V«ƒB=¬ëw»¯‘ës1¨v‚G Zb Ú{!"c3çÖº÷ iû·1¶K†(¡“¡c !8œNÜ0³A·NxZ¬¡ª6!æîdY–fü¦SÌzE–eyBœPÍé¶Sy¯]X1eÝT>¨±ž¥QrÄŽ¸Qj”œ›ÚYHŒ1YB3‰%&$<Ø%'ø©£—ô œ¶è?ÏÇç÷ß$ëí¾’§ãXm¢XÓЪžˆR»gŒ:GçÅåB§ÞÛ}ƒîáIÙgŠÁS¸—2`Qéž!ÄÃÛTMBädV×S'Ú æ|7:î^ÊEY$|3Ë2xaý!áç#¢®¨×ë [ˆ1,‹ßéæFYÆIÓ;˜+ \ÚšT+޽ž <ŸÏÑ6qdP ÿŒŸ‡ 7|QF†›Av¸µµuss“æñ)r‘¶Q¥yejχn»kgCG$9c Ð"ËåòýÙ)¨6ˆ(ÏóétúêÕ«²,‡ÃáÎζœÉ&¨§ß½{···ù9äĘp ¹&“ :îس,Ãg(ZUñP8Ò«9ç(00ÞÈÄiŪZúÑÞÞÞt:]¯×°\øMˆ,AèL×åÑ­Ç"#9F½áäääÇ?þqY–˜Š¾¾¾F Z|”Êñ¼(øÈ‡ò>jì!„Õj…Ð ÒdÔ™(Frxòjl†¿ûöW£ÍºreEF%V=:8ì5MiØlí²YÔËÚ{¯ò¤ †¼ýg.ªJ!ˆj#Rš9ß˜Ó ²Üîœ?Ú¬WØW‰+–÷{""LäYÛ®"Q‡9ˆ;ñ½ÄI• pö¥TFL„êÚ5µ7¦J¦kìLÔYJKg"1Gê2"ÅçõÞyŽÆJZ„fPcÑ8t£BÊ­!nk×2Ôð„›‘8HB¾Q>b‚4D4ð¾®#„\W« "Òï÷ƒâ6”Uº–Óc¢ULw›NnŠuRÎeÓÀ9×l*c̺èÇc ¡(Ф–‘ÂÜã\¹^71ürÞÃ%´C¨]S5a#eÆXUi™Ñ¸"€ä™*kP€óÓ“í®÷™¦×‹þÓ_É/@¥Šþä™ïó÷êšVlœhÒv`ìÙœO×·u_]3ÝÝ‘ôäÞ[ibûâùøêšrc I ÝîFIOÙzGÐÒ}vÝpêæRç§ãÑt´ÞÒ@':Ð9m6þýßÿ=øQxaf*§Óc `.fØd’6h—´!•:‘¥áü;ç€ 5ƨóªZdùh4ÇW7×À7µËÎd­­}C‘T(Ä,ß9×­šb¦SÅX‡ÛÛ[Ôu9¦û8í“ÉWŽCY‡¤O$=ÐÐÁ¤:[2åß꺾½¾9==]¯×÷÷÷ l‰zòl6ÛÙÙ)Šb:™Îæ3 á@ÔD9G¼...f³˜l»\×ýý=$"6ñÜA»™&’§$"Ö ÆÔÄY)´Æ—ËyðÝßߟN§`âT&tÁ‹Åùùùp8ÜÞÞÞÝÝÅ £ng: @<é"Çxžçãñ8• aJ?::BÁªÌ›ÍÅ"‚ƒï÷˨^,ÌŒ¼B‰x™Ñöööþç¿üŸþ‡‡¿üúavûþîìÒm åîÞóúøU/ø•õ§Ë»Õb½†±óô,zF âI º^†)´cBœ[}ôS#FU ™´7º™+&¼›¦Au%ËóÔh4Æ&r¬ž}Œá’K ŽI OSXÿb7r¬~… ÌO ÒÚAbvmqúCŠ‘qêƒÒs©•ôa›¦¹¿¿÷O3W/M^!¢åC祪›ˆAñAØ{RÕ ”º{¦C¾+ÊÌŒ­‚<ì ‹·R¡‹{ Ýcàz1ߨ4µ1‘„4ôtŸÆC§Rè½FɉxØÞ«µ6Ã̾qDäÑʉ\ýU^äyÞ/zMÓ ƒÆÐl1ßԕɬ¾v×à5˜Ì²wÔhímê`¬‰âKDó÷¬ IDATXD:îŽï`f²‡@j~гþ³î‹‹´Î¨öÌÿ÷ßüËÞ.„ÀL"m©!ÍSœ~:ÎUž£¶¨ãh_lúô…ï¤C:üVÉGF/Ø&¸ÉÖt/‚·Ã €žË§wOå£tñt>ÓI~7]G깩ÿõ¯ g†& Œ;;;Öæý~ÿõëן|òÉîî.òfïýþáwˆŠ(ê‡4qun܆ÄJfOä*è¤& è S0gqD‘à¸BÄ~ooOD‘››èÁ9¹Æ+[[[`œ@‚Ÿšªv2•ÀS¼"<$™H,ïr¹|<î}»tÜpF꺾½½ýùÏþWþß¿[–³Ë‹·ï.Ö¥ý¿þƒ*M&“¾Ëêó|~×|°‰‚n µM ªŠ2 f*˜90÷³w8ÒÓA3”¥ÃKè bpÀMÓØ"Gh¨ÂÖÚÀ¤LžZ$4uñn6ó"ÝLIU½õ^òİ/|#mKêY•£®˜djpâ¤PU4Šq$BgÜ6ªsn³©“éÆÝœR;!~,A;jËKF$"z; »„QMÌ*ɸáômmmìîî¶%D¢®)—Ë%H°I’†Š@öN¼!¸º¢NÓ_¤™:Jäø[t|¤×·Q- ëZ™˜,ˆýtÉz†gËU]×Y¯ï}0Î×>4A%Ë­ ê)xr.H«"Á–TØ„7Ô&i­íÏ£kÏÀçú}Eæïýæ?ñõôpƒ¦¢#3럚…ºë¨°â¶D ¬ÍsZV©têžþÏå©dØ IÚ—Ô1ÓXhœ¸"@7Ñ#ÑÇù¬ª«4•ÛÔõ¤ßëåýãÃW†ÍÕÅuµ®…L½©}Œ‘¢—ç6öE–«†%8Ÿe¦®kH“v{Î$Iédâör›©ý¢·^•EQlœŸŽ'ƒ^Y®àÕ«åííí×_ýÕW_]__ßß>„P FoÕÚüþþ˜ Á®Ð½988¨7ˆŒ·Fxkß̆b¯«'ßÖ – ÛÌäêC^ô›¦ÉŒÍ†[è˜^__/ç«õjcت§"/ªª¢À¤”¶©›­ñÐdrqu> F“­ëëëàü¦\?ÜݯKœ@W7ß~ó¶è÷àƒQùÜÞÞÞÝÛ©ªêðð}âc Tù†ÃáÖ`Ô4Mfrf¶’Y™ëºîåEÁ¹ÆSPt \&ÚEgggWWW ¹,ŠÂŠ9zuòæÍ›Ùãú°©×w7·ýáT\óùþ àmðS‚looƒ{½^ƒ«Õ ÚGeYRÐÕbÙTu;)4æ6›ŒÆ†¥_ôœs†ED(è&ò9÷z= z÷÷·oÞ¼·æóvF9Ë2pv‚d½^o †G‡oß¾]-–R¯Ö›å|‘ÛŒ‚ººY¯Jõ!lùõªtuóxÿ°^•óǬ+õòb³ÙLÇ“õª¼¾¼öoÞ¼ÉóüîîZI˜]¾¼¼|¸»õꕵv:žø&looE&¤>ú¼Ý•¢Xf~¼¹üæáâû_þןÿw½ëúºº¼-ÜÿñÄú~a{ž‚ÐŬ®+WùP6ÍF€‹Zž?”Ò¿ÒöÞSŒü4ß‚è‡""(±°  êeò¤A•$ã,–LÕ=Ô66› åÆFÄæ†‚¯)8 RÇÀVU™Lžµr–!T°W“X3WZÊ’fFz&§ºvAËÚm‚±”KfŒ¡6›MUWÊVy›a6¶èåýAÖë÷û¹1&°²pÞ/LÞ·©˜ÀRûàœ7y1ÞÞ ,eYæʲ¬³þÀ=2Æ9W7ÍÆ{éõŒ1ÕrU›+›r³lõ³<·VTƒª÷ê[kC¤%'¶ZÕmDe{åºÂQZ•›,óY–cÙÍ ÊMf1$¹Í'ž·ëÛT–ØZ[5ÍýãÃÃÃÃV1íÛQU×›¦®ëš¥Þ 0å ªœXãsDMD˜Èvâf½ñV2b*Š|0°Yæ„ÕÔD*~ì„¢®f®–Ëâþ¶®*$èÛÛÛYfVó3¯«R5ˆeËb… Ä×m!pQ§"™MÚV¼ªc6Ö¨ ž´a§ª™d63ªÛŒº]Ž•AÇ’SË»BˆÌp¥–Ø(%PXã ‘w*lŒX”ÀSA+ËÛiØ®Ï !m“øômüÓûïw؆T,‹ˆÁi°"ÞµG¦•³º®ƒúÑxëÖ³;xº øïh ¿ˆañ\m$aÿ0rì)nM*ri” mBx™X4eÒÝD Á±’"‚N®–$]EÄk@Ñ_}õÕ—_~yvv6Þš „÷Þƒ.8„ðþý{HîîŠr1”¨5*µá›©àLqÐßQÕ¯àˆ#•ØNî…ë6ö³¨»‰:ˆ—Ë%¤Paƒ;üÉO?ĽªŽÇãããc"rÎíìì€j*ÜŠ)?è–R<€¬ÕòliFŒ1Ž“N«ùâêêêÝ»wëõÅíãããííí^¯W–åÙÙY–e¯^½Jª H4³,àíÖÖV]7D ËåòööZŠHPðèa 7åúþþþ;Õ‡QÞO›A#Kv†£RÆŒGa…hêŒTbƒ…0|"1ø&—Ë%pË!øldíª:›Í.//s(>#u@…)ûx<ÔE¿õzÐÑ©jâ:ì7$®µ÷þàà`w´[|äæk;.ܲÒFXƒ""-{€0«2=óëú¼¸•*^¾36ƒÌb['Ýb¤#ã@^«?0ÝÛ5 )ÅOßÁ~SÊ`ºÕŠ“¸‡Ä¶ýC‹“>EêY¦W÷º©|²6°EÓé4˲ªªXlˆ5sl`\t§ëR]\H÷ž[б¥)cÆj·2Æd.Ë\f›ÎšóP‘A’NäE[9 Öa`åwwwlõ¦nšfSWu]7ΉÐ!Œ&t\™±’qóW®Nå"¢ ÎÆÎû&v÷6UU7Íz³ uœ›Çž’<¨ s&†­ÃÊFĘLHŸIˆ‰X”àˆIP¶WfR1’!Ø8UÕàÛ!umËOlÄ/v¯ ³4"/7Ï“_*¨*à5]O!Ï›°Ésig:àOòŠŸ%zT¸‰”û¦½BÝÂNLJEõ44œî2ÕZ“ÇMGÂw4¢}g;ò#ü j­ª-v [•"€]b`àÈéQídK:{±†CðY‡ðCî ù;;;»¸¸¸½½}||\Ì—{;û‡‡‡0(ÈÕf³Ù·ß~ XÍéé©1f±XŒÇ㣣£ù|¾½½-DÄ,/ ‡t”>±VMóŒ„=”52N ÐM¡Bˆ#F0÷···w÷hT{¿ÿ¾ª*T˜1Ï^ˆíím<‚B¯a ‹¢@Ê›L!|¡µ6—E ƒd}¬µ[Ã>*ïß½ûýïqqÎît:ý³?û3,ûÕÕÕÅÅÅññ13ƒz3Ë2($?µ½½Ñ[T˜Q#™Ïç§§§è(£Ï p ˜¼³yÓ4ûûû‡‡‡ ~ÊE…A¼nÇÞ Ø—Gº7„V½^/…öÉËl$„A|6ÁÝÉ.ÛQ¸Ì™±uƒȳ@ß§Æ­ÙfUíõz³ÙLU‚Ìf …nºÎ#a/^Uå¡ñ¼=Íla'Ùp5¯Ã¼BzBh|Û±Æ Žª2([œái“v'0CFD²¼­Û{ïAáÁbÅd̬!$ÌÂJªQ€A:ŒÿÜâ¤ï$GˆÔ¤6vdÍ8ŽÔ§îLˆPêP1)3 G¹Åd:R-M>ÿÉ©j];,8SPÇxïÍ“IMkUµy+‚k"&ì‰vË‡éæºù†UfbŒj òªÆ{ë}ã½1fÓlîg£éd2™¨p|ÝÔ*J¿)×nSe,Y–¹(õF‰Ô(ÏTuDOz0›²U0$=… "릦 -L?‰ª¢© 3kŒišÕ¦E]»Î±ˆT®)êªÚl`îŒ1Ëå²—PyÞËò~ѽº×æ½A¿ÏÖF®©'¦ UÃSß·€k+©  LÄ„g‹gTUI¸%¢zÚc¤Ä(ÏðSöõ„ â×nT}zF¡³‰žŠOi+†ð'†J§ÍŸ\Ø“¸æ‹_MaB÷§)ëÆ’8'°2é=ð£”çu—€#@šˆPLP,êÄ#¹8bB¶ Zõˆh:ÝÁÛeQ +¾‰ÓoH‚‘ÍÜÝÝ]___^^œYk§ÓiUU¯^½úøã§Ó)0;Y–½}ûv0ÀøÎçó««+ŠFöþþ(Jä—èãÂ!!n°Q1Q§s®®7¡Ã WC0 ´«§„6ÆÃÃÃéééÍÍÍo¿üM§É² ~îõë×Óét<‡CÓ%"° §63Ú¨ÖZ´š3[q!"ÈÚ –Øán·©îáÛ¯¿¹»»HƒEãóóóÂÑÑQÓ4"Ìó|6›¡Ç q8`˜§½½½~¿uuuuu…î5l š²×××ggg›r­ª Àº¾¾Fo+™ö*Vn5t˜çÒOMœ.ÃN ˜ H”2Åxtà ¢4 …º=î sÛH} Çt{{ ébüæh4ÚßßÇ£lšfµZ‘ø¾ÇÇÇËËK”ëBJÁ™hêï=ºÖ¶ø¸<ÏÊëÍb±h¨Dü•ò¢l(° ¶ f¶æå‰ÆÓÏâ˜i7z–ˆ–J8 §¤§Û<½|%c§ÏµG»©¡t`•Ôiò¥Ø=}?]³û"âž+ûˆs¶¶`ØèðGØá¨$¡ºÃÌη8\)i²€:´hq{<ƒLw¿ÖX/…µÄLÑÓN³L#Áµõ÷ÑÑÑîî.n)Wë²,«U™±äyâÖu¾“EEvB„]yžüO$4m$ºÚ¬X„ÆÁ«ªÓPtå{ƒ†Æùºñ±”’²¬§»­[YOã|¨ê†Œh઩‹¢öƒ^¯_ôFƒád4l#©Q¬š,cf N9>Ðð´V"‡eõ.0ƒ1ö™¤Ç³ÖËB«l˜ž—®»#Q ,y«Q§†‘öUø“ö†crõI¶þRt¼Ü} GÚ)}HË‘ŽkèàŸ_üNúH‘iÑŸ_êi²¶«#öƒÅbá½G!Q[˜n{àT±QŠ¢è÷‹~¿ßDõl€€ j8ŠQœ¬^f{{{<o6›ÓÓS<9¤àÕ1///¿üòKTÎ!j xΫW¯p˜S\–ËîH…ÇT!vš;Ô]Çã1žž¾ÿ~>ŸßÜÜàÊ@‰Èt:ýì³Ï0M{|||{{ûþý{„8Hšñ],`uÇêY/MÁ"?F(@D8¨"‚„ ÷Ãr~ss3›Íðîè¤îííÉëñññúú:¾ççç×××0mèìª*d—ööö\T“…<4 ðàld²Ìóø2(y=<< aÑï÷A‚A: G¼R‚$Pzˆ înÀ›* §x|ƒÁtÐ\CØç£L3cr7É'gQ~XzxÐ,²«bΊ¢Ø03ƒåââaÙííýÝÝ*4øB„»ïKD‘‹ˆ:mš¦,ËÂSRmÜãhŠyq¦¨=·$"¤†ˆ±Å˜™É0aˆ!Ûà•¼‰’!–h%“ƒ„¡â=­·þÐ’0''°F‘ŒËÓdpÚù)KQA99i¨“2‹A*Ïl˜ÓÓøŠª"Öôq -€ÄFGDp·é۪ܘȖƒ>Âl6›ÏçµkR"‘VÃ{NÖîj¿X.}NŸ|íUŒb‚— ÞÝ߯ʲ\¯÷ØcÒá™a DäB¨]B(Š^Z¥´hpÀÌlò¬—È^0v1£¦jYWAEàšÆ{_‡vð24.X«!hF) U†N§Ì9ç¤Àc•M acUu±\åUS×n¹,³,Ûꯖåf8RöŒú]Ekm‘™€<=’ êCP&r^Y3³F"EÿLÔ'­°&R&bê£sò.Q}µÑö5­e·DAD¦ƒ¦n„÷§€^wwHè [m2Áô¼ÅOíóƒ×îï—|ZÝ¡™êsé1<†ô…‰Á ÅgZFbÆØ%ª¯›Íæúúúêê r¹Ð-G¡Í¦Õ`€ÏFª7 ˜Ç¸‚Ytg«ªšÍfwwwè8ß¿³³£ßï÷÷÷÷÷öö–Ë%P 9#îZ‡'"ÄÂpWyžbh Õ-hŠEAö’cŽ…›Dö”Ž“1F,Ã.‹È|>?;;CŽ´N¯×;99ùì³Ï0ösrr‚™@¥Dd4Yk`ì’"îY¸‰ãö&RÑZk‰"¸“²,¯¯¯oooçë| æb½þÑÑÑëׯó<‡lÑjµ ü1’ZpJÀÛá½F£Ñt:ýÑ~„+ÑîînÓ4h33ž>æŒ Ð^ÌüÑGáÃw¦Ó•0zíh(¦u6Qú-uŽQöOO­S‰´0 ×8==}xxŽ>K’†UÂôðÕÕÕÑÑE æ¢(nnnÞ¾}Bxýú52lUŧCžŠë‡å¤Àô‡N¯÷áúúúüüüÓŸ¹¢(šåâúú:xÛ¶Zà€›¦ñ¾Í•…žjÏ,dè™îoz¥ã™ÒÓ&a ,¤ „Å2w¸±^دD„“XM°Oc0èôúO“];…=bÕcŵëÕÓ{‰‡'âwHºn>íyßá]ImiîPý`‡Xk‹Žnôz½~˜=¢ñAQ\Ab㆞‡Ôêðs¥&UåØB¤# 4"6!Êi­w• 8àá*5 (!-•{i'{E)É"/lf}ã{½÷êA?Ã{_6•3 &[#a^)…ªiX•”ˆq Ö T5R¥µsÁ‡ >¯ÄâU5ñ*›&8ï6¯›°n|½±yƱä™ìažç¶0xdEž 1±tÆ-fJHÄrŒ±ÔwRµ´€K)¤*ÄJÜjŠm(ùbJÆAD¬É´ƒuÐ9óßp 8½R@£1kµ‰‚1"ü,ÐSÄ?æNÂÑÝjßúÑó†ÏŸþ6­då™y8ŠH–™Ä’•½óóó‹‹‹*¾ˆàprWWW°¸N:xÖ ‚\Žú”(C=<<€š®z³ÙØ<Þ¼y]¬s¼÷ûûûÇÇÇý~ÿððp2™$ª)"„y¹1®Ît8¼@ê;'“&vÀ;fád2!’^¯wpp0›Í¾û,qþ‡£Z‰ÈþðYvvvÐŒ D¢Á§Ãâ@˜ «„Å ! Ú$ö(Z ÌŒz©ˆôûEY–www˜&¢‹‹‹««+Ç ;8(zãñxog÷øøx‰5Fo?ùä“W¯^AB`l,EžçÈ}_½z…þ7\àÕÕ°Ku]#EžN§'''oÞ¼išfgg§\®DˆªÉd²··çãôw¥`²ñI¾™nu!±-˲Dm|:Zkîb5÷»»»ÇÇGlKŒHÁ§Ó) 3pŸÌ<ŸÏA‰…9ìÑh¯ §»»»‹x;Rͳ٠÷¸_ˆ¤i?ttЇá³ß/—çççDmú‹ŒÚ ÷âƒÏ‰õb!(’F¸8}0RÉÌdGW˜Ú9kؘT™Ÿ0¨{Û¨7<¯ùwÍǹ&cL„ó< {Ãð¹Ä¨Õíív¬BbqǺÉ@’Õ¡f£ê’Nèœóî™*pxšI ©Žzþi³B">‘âÐ63¶†èX5U½Ùl\ÝÒ±kúÛÖ/-BJ‚CÄ^äÇJD ç‚-òül¹`kË«õfÝTiÅj15·ƒøÎÕjX‰“ êkد$†Ä°!V–Ê¿©êÆÛ~»ž"b«:ÛT½M•eY0‚czY^+ÄÆ˜ÌÚ­¢~f™±¾å!‘Æ?‰út÷­žÃS¶¨!`Ô)<Í>µû°þâÕ"þ9m˜Îî‡Nâ¿ä•¢Õ1¶‰dfégíýQHám÷æÒ/¤·é=WZ~Šøž§¼Ü!Ðõ¿D¼ÆÒ‹"ßXooo!”ÐØë`.ì÷û÷÷è†b»²@SB øE°¯ù|ŽŒ¡,ËétỄÁà£>úÙÏ~æ½ûöí»wï àc­ÝßßÿôÓOŽŽþìÏþl{{û»ï¾C>ºX,f³ÙÍÍ÷³4)-‘gŽˆÐ«zˆíloo#å=<<ÜÛÛÛÞÞͲ …\((`Ü–D„kä…3¾Ùlwww™y±X˜Ìª*ÚÆóù¼,Ë­­­ýýýo¿ý6Y!á)7nzÔ–d¹\ÞÜÜ{lŒA¼²ª7Ì<ÇÇ[û»{EQ¬×k„2ªZÅëׯ‹¢øæ›o®¯¯Ù´rŠpi…Añs̈3`ˆñÔÆãñáááþþþ'Ÿ|òãÿîòü·¶+òû~¿Ÿ¶™ëp#HT+‚+BÒŸç¹ k(`öÎ0ÎÙOá§Q6¯ë5ç,’–Ãe"RLæ›ðÄ—ÁÜ5MƒH Ùó`0xÿþ=6§D^”Ž%Ò„}ï«®8ÃW«Õª^AŠÏG*Ç´Þ{¶&hR‰É£¶)< þ󇜌¾ÈÑRLÂDJ!è÷•¯´S‚N¶k…ÃÎÔR‹‡ØóÞI)Â0>¦+ЊF]sŒ8%¸”øø$K—JMU‡y;À/šÍò4¼“‚= Lxî›r½Z­ªu{””Ÿâƒdd?´æ)8HÚ)íÁ{ùXžAÏ 0ˆår¹Ym|ãúYÞÏrêp¡`ÓzçQyï…Ù«ÖÜ¢^ò,óÞ×1¸¬]ƒZ° ‰ˆ±6#"Ž¥ýÝŒ¥oóÜfÈõ“ÍDÍñwcE|hœs•%Ä‰íÆ·l†Rˆ“°×P¹¦®Éc‚afnjS›²®Œ1 5‚ˆ&+lf)l–çySTØ*ynó<CpŸ¬/››Ô‰oTU””(¨¶T ò¬@‚Ãh­+!ÂøyÝEŸKb¿x»á+íîÆxÒäçÕa#dˆI ©* ¡ e;Z¼Ôí…Ķ.Jy0x'ä>JУ–»5®V+±ls“÷²þ°W…÷[°³óùüæîöáááaöxÿøð0{´ÒrèÃ^£S{ss3[<‡C±Cua]•›zM¢lÈZ™L&P»²Ò4œ°^¯!hÊ̽^ïÕ«Wð²çççß}÷Ýþð‡·oß–e™ç–YCp?ûÙOÿâ/þ‚ˆ¶·'¯^]ßÞ 7yzzzwwW–åÃÃÃÝÝÝíímÂ× TTÕUUWDôð8»¸ºÄN&“ýèG¯_¿þøã'“Éöî´vÕçÿã/¾ýö["ÂÃècÍ1A{rrRÅããcQþçn­Í{Åp´ÕxgØN¦kíl6+—ëÕª´’õòþÞÎ.õÞ[1¹Í¬˜r¹ÚžL{½^.¸| –¥4>Ì—«·o¿óÞ³¼Ål5Ëó\”z}UE¸`ŒY,ÛÛÛÛ»;GGGãéäöö–„‹~ϳ¿¿oŒ‡?ùÉOæó9ˆ?ÑGÀ‚ÍÎÎŽªººéõz{;»»Û;×—WËù¢ªªj½Q¦íÝBoÐ޶vövÙè·œseYºÕÊ9ß4ͦڠ]‚˜þp°X-‹~Ïdv05l¿ð>4ÞÙ¦¹¸¸@b`®( Þ]œ»à•©vÍááá`08<>º¿¿wÁ›Ìú2dE¾Ýï ¶†"2ÝÞÎ{ Ò¬ÈïHøøä gG¯ŽN8<<\.—åï×H3{ƒ~Þ+؈װ\.iÞ+0…‚“•špDDLóï®~÷û?üã~wr0RþßÓ?XCÞ±y\mn«ÇMµ,×YM–\®=zÚ " á©}›ŠÞ­mb¢–£Ãsð"b™,#ëå h†©e"£” 1§™1B0PÛR+Ã?ùHÖë‘Ù |êBƲܺÆ×u½Yתše¬y¯Ø YKQNêBØ“åF}CÈg<3{ ºÆ7èYšHp‘Üãk"òÁõJ^ÐA£€@;Ê?›Íf4ey0L%¹… ï3c½þÞÞâ€uµqÕ¦ßË'ã1&Í„a´É',·÷Á°¦%x% Jª¾qÙ»ÕÚZ[d™õª›šÄ†Æ“ó™1µkVuÓƒ Ó<ïgbÊMKú+áUŘQQ´sMuã½O2‚݉¬¶ôÊND21yVd,¡nj%ò=™LÇãUh|Ý4ëÊ7snY–³Õb¹.í†óÌ4AËͺñ>Ë3ãýÚUž%{¦Ú9è+ÀMb°ÐT4êhTUƒ–TÕÆäÆÖYfÅÜesKlH³ 04F¬kÀì§ i/cŒ#Pf¬0­·þ؇Y#O*¢íÞ`‘Ì4M£b»*f˜ðfĤôä \ê5!”ˆÌ€³MÖî©Ódzc IDATÅw!”›MQBäUÙ˜ ÊÆ<ÍÓs䳯r±D@‰b Éïêó„úEœrÿÔ\Iþ±^òúðÙH|á,!Qp{{;›ÍPïEælÐR`ŠY,èM"ÑA©a8î 4×nPk·¾-UÜôà¾û¿þú믿¾¼¼\.—;;SD«Õêýû÷@7MsüêôRëõz>Ÿ?<<¼ÿþüüüüüüññS­€ Íf3ïBÑË«MíšV åìììôô,ϳÏ?ÿüèèèää hülmm-—K(àŽÇ㇇làPÏ\.—x"èD"@†a···aDej̺TU2Kt|SÎç‚Ç\Ðïÿûº®3c-ëò§?ýéz½þÕ¯~%"‡‡‡[[[u]¿~ýÚ3 nnnÜßßÃñàwàqQij ÅÛ<ÏAõÈŠ«Z§Y–a>xk<u3H‚0’ Žè4u6ŸÏëøBhõøøHD£Ñ¨‰²Bª-ñDÚ|äÁ`ÐD2Ⱥ®‘1WU•E}e}cñó!Q–8ŠpJU§Ó©v¡ÑkH±J>Õ#.ìÍNŽ˜sX ß•Ù!"¢¬×+×å?þã?îÿ?‡;ýËoßõÕW$DžÊjXõz]9çLlâIìþŸˆÂ3ºÙç:õÛiœ>GWuÿ–#Rº}‡XÓK¿&…ïÔ=¾)%¸È¥ƒâ4Q†Kc' ÆÄGÒàÖ¼ˆ€’S–nö©qGžOO¥u–eA™™"2­‹ý~2™@7z0 -(¯,K|ÒÔsqˆ¶[YÔTGD¢ï¡iZæZ ΰV"â›QkÌr±X.VUUçóÑV‡vm)úzøgšÉÄ. >\\U ›uÁ´hý¼ðl “AnrâÜöf½©«õjmŒ©›f¾*×Õ¦ñZnÖMÓäj¬ 6ð9a^mž´±àËØêp©Š’sÞ‰7³"ÎQ2¤–AdÆ&³lØZ›YkŒ)l–e™7ÆŠñÞ&+müB¬y2ï ·!„žµ†%·û̇ž;þ~øX]»ŒÑÝÝþá«ÝfúìŸ$“¶6Ìt}'EN`ŽõÉk©‹b{½8Òé³›Eòá tÎá ˆã" ƒ÷EÞ[ÚÁ`°¿¿/"çççoß¾½¹»M0–T…„!ÑÀ¢úÚÅâN§Sœ¨~œˆWWWð£@W_-"···H‹{½Þã|†z)îçèèèã?G#\1pŒ‘Ö»»»‡‡G×x¢¶:]WÍ/ùK¨ïíîî‚§b2™L§S@À~ò“Ÿb>ŸßÞÞª*Òë³³3kíh4Bº—÷!á·³³ƒeT¢6›Ÿ¥ªª¬µUUE=!€…Ðuµùî»ï~õ«_ýíßþíÃÃC‘µÐßã7ÇÉÍÑÙÙÚÇr)‚'ƒÎÄÁÁÁt:EÕ ¾–Å fþÉO~Ò4Íh¸5 ¾üòËóósï="çÜÖÖÖÎÎÎÑÑÑx!:SÔâ"‹8Ç®'ßÔ#xáERjØ®mg§ýi&VÄZ;`Þ £Æ»f]1¢öÕjµ©ÖÕf¶Xõò¢rKä€üR!…¶•÷€¼iÒ@¢ NUˆfÇÌžœQ À ÃlY ‘¨W›HhcX4ËZ:î°œ> "ãn4ÆxÿŒ×Å9Gß÷òí>{æqÿˆCmßî¹!Ðøl›ÚNþ9ó‹ðÃ/^¼Aú´Ý¸CU[fcÒC¤Á fFVŠ$CU¹…>nJŽSÔ9à®îîî.//ÿð‡?\\]éÃäaBD ¹Ùlf³Ä슢"ðιÉd‚·Æd‘jš.jÞÁ@P]Uë’‚Í› ±MœœÀC¶ƒõíííÍÍÍÃÃÃwß}÷í·ß^__Ã1„\ãïïîïz½H¥W¯^A#(„€ÜH%Š@eÄ€íï< rÚÙÙ Á§†É€—‚‹EÙï7É&¢Í÷p}{óÅ_|ñÅwwwMÓÔUED“ɹ8”s«Õ #[€/—K4­‘ Cð`<c’. ðÞ[[[eYîìì|ôÑG···êúèÆ˜<Ïá·ˆèðø4Ë)kÁ§Q½é;\;ú¾!ØD|@t.Tõ:j­­ÖàÛQ¾¿¿G9šøÈØWD„éj$î°VØtÁÚîìì ò³ˆõ‡ë…²aò{{{“Éäææ1ŸtÚ‡>J0iDx>Mï,çèÝþ@TeJdD‰ÄðlÑê=û†2C"–Õ+I4¶féù̽ҳœõéÇe´Œ‘C3G&_ÓVȨÃÿ¡SO_§Vâok¸{Ént݃v:sAÈ“2©µÄ¤ÄAEŸ .wzêàNÛ<¡m·¡@ÚN ­Ôކ?Õ-EЬñÞcÝGÁ¢(vvv€H Ëå6Dcÿ¸Û̦ýà?%Y•’’!6,†EˆÕõÅX1MU×›ªÉꦮAzwwWVkÌ@&`p6ŽwJœ¾Ã»'$y·Þ Õ®ýôSÔ¬Œ1¯ŽNz½H-ÒÐóÅÅÅzÝâ´AÐ8{ñÂÍ#ïÿöÛooooߟþÝßýÝwß~›gyžçM]÷ûýƒƒƒõ¯þÕÉÉÉÛ·o1ÁuttôæÍ¨ùnoo’ŘC^¿~eÙb±0ÆŒF#d~(;Ãø/X.߸ÇÇÇ<Ï?ÿüó¢(ŽŽŽP‡_­Ë&ÄÃ#‡‚ V_§Œå÷T5Y”«¶%Ú™@¥€y†Ímš@¹õz=ÝÙ>88@¢6 àò±Ô‡€Ñb`æíííõzýÛßþöêê •ËËËÙl†rØÀ&²,ëõ˜¬ qèSªûFµÕ©4hQØBsWúœ]%)Ë,W.èýýý|>¯|­šgÆŠ§ 1åå–$ˆ¸ÕýMg3U¼@8~Šo¦ókYà}‘xf‚¨S‚ÖHU+&:*Ò>Ycž:s°×©GÇ©‘€ÉFÞP‚•| Wž½Òya(;¹o{A‡4ŽoùÎlR™˜,à S–z[¸7ì"„Àûô_2ñé³3³`¤Òúâ§`+ý>ÍF~_ŠÓù)oоªªÉd‚R2”Ö‡†ÜÇÁ%ÕCx‰ë:`"P(3Q %ï=)û‚†Ð4ŠHK)76“;Ì{;Þý^–ežÔ9W»¦išªi6ô@¦öÞ{õŒæjŸ"jÀ$ï¨mm@•‰„­föâ¥a"2OÈê 3[c²,ëç c†Åžg‚C&eÚÔb”ƹÆ9U Ep‘ü´—¨»µ~ØÃÛsçõC¿ID6yþn¤¦ZċݜNH×ÝšÂùÙý ¨Õ =4±Â4'„*2 €þC˜Chƒî[÷ßFDÀõÏ|vvö«_ýjØ\UÕÝÝÀp8,ú= ˆwvv€¼h"g!ªßàþ}12¸Z­nnn˜™ô|>×3ÂT p¢Ì´Ö"L.ËŸà·*Ërww÷ääd:þâ¿(Ëò믿þÍo~ƒV+XvE…1¨|óÍ7ªzzzŠ¡&çÜ'Ÿ|òùçŸÿÕ_ýÕÍÍÍééiUUUúõ¯½ÙlŽŽŽÀüõîÝ»ÑhÑ! ¥PD].—[[cLéÀ^œýæ7¿9;;»¾½¹½½%"„ŠG‡ÿößþÛóoþÍÇ?ýøôôôþáÐ<><<|ýúõ«W¯þõ¿þ×{{{Øá ù#˜sn6›]]]¡6‹RÒ»Æs_,B\–åx<†Š0F˜Ê²¼¸¼¨ª ¼‹µ6%xv(¶#•G;6„R”½½=f~||œ-MÓ ‡CQZ,BœeÞ%„€!¢ªªP9_¯×ÃQ«z´ÙllÔÄLmK8` ©£=^rY–ˆÕ...@‹}ww‡}NJdØ<;;;C±³Ý"k³‡I/[[5•÷D6h ¯JMã<ÕD·÷÷‹ùFÈ‘H&ªJ>=;ŒBÌÒzVúÞp¹ãž»gß -3†•¼zy:Ú±Üi܆´så”Ç7M£üÄä¿E˜ÎW0q>£&»‘.•ÞB”ðÑD˜˜ÁAÂSèÐý+fÖD{NDD¹±¨–™<¬ˆ€ Mg°›r,]ÔQ?ØD²èi? ‡CcÌt:•Hö’${}§6@D@¢ qˆ©0CB@U˜ñ®¤JªL´®6[[[&³›ªZ•ej­ÝÞݹŸ= ôÄ»€ƒÛ2­ün ,°Œz’q“ŒžÊúÒÔ‹’(‘jP ””‚÷ÞI eU•,ñ W€Ê†­ ¤ÎûÚ»¦i L€”‡Í¦.Wëͦnš¦ñ-È®q.u[ûÂí›·Ž#(“ ,Ìlp×JøA‘Ê5Ìí­ò*¯ò^–[kWF’Y†n(ØâõL$xGúœ‚PzrÃlH‰?.nÏËT­-’ùåßýæ÷¾_×û¢w‹v­†ˆÔ®éÞPòÁ§>°êº•80‡Š”XÀ©"›z•á‡ÙcÓ4óù¾ Ñóóó“ãWi¤d6›…Pš>8:„Lº1×D.ˆY^`¾ž0"!ôAÜqqq,Û~äÀO¡ „ä’ˆpB !ÚÝÝ=>>>99ù‹¿ø‹¯¾ú*Á”(ÎðeY¶³³åù‡‡‡,ËV«&žÓ³@CÒMÓ¸Ú/‹¯¾ú ‘Äd2y||¼¸¸¸¾f¤†¨!5FøÔp`eYžŸŸýõ×§§§@w³ˆú°··÷×ý×ÿîßý»Ÿþô§ÿå‹ÿò7ó7ÿñ?þÇÛÛÛÃÃC$—EQ|ñÅ@;#òx||D*“››¬ ¶˜D‘£ýïœ+™«c 9$ÊB<>>6Þáo‰ 2ÔRë:„¥‚ÿïìì`sÖëõÀ¹([ÑõLÌÃÃ0_ÈÑQN?88:|6ÏÒ¾M¨1¤5iÏCãëÕ«W0(Ÿ 6CD‰Cf>Ÿƒ;z:ÝÁ&ɲ ­ôÅba­=88V_DʽŸÏ–W³Çõi1þ±[ß×óÕºÈÝÕµrTËm°ó“² }›u1›ïë%%_Õ4O˜:‡$&à Ô4çÓAB%‹¯‘Ú—™…[¯ ;ë‚G`=ŒÈOD Zü3»¯]}Éè’[OìwìI`j(8 ¢’>éV#×#œèfY–÷{6²0¢¬…ƒÿÂõš5‘ÀÉ%N´ªb(µlÒííí¡Œ1Å$Ýï8*c ˜áÅ%t,¾ªÖÁsf7®Y­Ö.8ac­ö·Öõñ.‚û¢(&“ jQøD]¿K‘I;õ8Bœ"3Ôíà€S¹Ây/D>:O4xUi͸6/郄ÀžÈ9rŽ™Œ5Y¯p/¢tÌl¼ Uլ˦ª*çüº®窪Z×U]× ÷ ¤u̘ Ú J ùjU"r¤HU…8„à˜CÔ=´b`6˜"c5u€” o÷†}ícª¦öÁÍd~(æ€ìüŸ:Ôn×z 0æ¹./u”±Óq}ö¸¹NZ®‰@ÇôÓîùé°äoB¨!ßÜÜ\^^^]]ÝÝÝæŒ¬¶··Q‚÷²ÅìÚþ~ã@R[[[MÓ\]]ÝßßÏf³ÉhŒ¦æåååã㣵vwww:Η‹íííÉd’š%`¨èå}Ô<}TÌ…%BüŽƒÝ4 ˜{½ÞÍÍM*é ÔBª¼+ê®8¥8PžOÑétz||ü‹_üâ/ÿò/a@5jpÂ6œœXk÷»ß¼±ÙÙÙÄÅÅÅ—_~yww×Ëû"2›Í JÓPÅÅÅZ¼€GÍçs0û J†JÚf³yxx@¶½Y¯ÅLyþìg?ûüóÏ¿ùæ›ÿïÿý»ówàÐÞ¬+‘›ýýýÙl†GÔvïr¹„ÇŸm¤À¦ ½Ã䪾eY¾{÷n³ÙPÐét ä3â-çÜp8$a(Bîïï«*Î,õö°ÚPð¥X lÞ{ç;›Ï¼÷ûûûÆrY–†¥”[À€–R¢<ÏIM5п$h+ÅatU-Ëòöö^OSÎðô(êà8,‹»»;D¨‹L§;¸>hTŒ1¾q}¶…ÝÝÝuSëÒmô6}T-oêùêë»ÛÞÿý–J(÷yÃ*×шŽ2Ã>¸{®Sòš!2 ¥< ÔôÒš$÷ÙÉŸoa§I$ßFõþØZëéÙnzßn¼Ž ú*R !"‚ÁyŸEªÑd¾p<÷ÈS èkÛ‚@ó^ƇˆÐ—ÁÁççä‘ÃYT¯JrX¡döB4‰~0©¬C—¦* ŠÎ«¯H~¸¼ØÕÖZ“Yeš/«åz0`ÀO¬Ií D¢ª ࡵ­¾5 •[}Ô´ÆÇDô "MÓà>½÷ðj>2.h¬¢¨jh‰·” X'bŒ°2WWðš‚X#y–÷{Yžg"œ!6ÂyžçÆölϹ~ä©¥S]®Ër³^×-Kh¨×ìyQ‚nB“¼ ‚<&Ç*"y õj!~Â\S;câN[¥Ë×?ó>¨jQô­µ^}ž}+3§©³cÌ$‘Éÿ¥»ü!ŒG•ÊzÉ"ºÊEbîn“?ÍÞ¥‰¿Mó¾p`ؾ)òÂ>Æò­×ëét º+xJÐ5c?¡_»¿¿³urr2žN꺶yvx|ôsïÆÓÉÅÙ9Š„pÀ777t:žlïî¬V«uµqÁ/VKU}œÏ ···YÀhñ·«Õêæîtµ^æ½ìpt°\.Ñ\IÀ1Œ ÕuÝË ïýzU†¦‘’¢?Àv/²|4[äœóìÁ9ÐÍMÅOô˜5?˜wîïïa _½zU×5œst}>ýôÓÏ>û,„ðöí[é{!„Ãã"ޝt2ŸÏçËY–‹ÅêñqÞ4Íl¶¸¸¸§óùr²½bC¯çåf%–ŲW·³½½¿¢(Þ¼yóÕ~ÿÅ_ü§ÿôŸŠ"³ÖnÊŠˆFíýݽíÉt4Ý=Ü×u½½½ qÛÛÛhˆHÚ9ˆÓs›yïY)3ÖÕͦ\ qp¾7诫ÍíýXóæ£Á½½yóFD¶··5Òh€Çêááˆéd29::F©úÎ ×0幜᯲͇v£Xã‚k†£­r³n¼޶úýþºÚlê Çptý1D´Z­öööˆh¹\"¢ÈŸ™ooo¿úê+cÌÎÎΧŸ~ú³ŸýìÛo¿Í² M§NØ4ÍÖÖ (2¢ ê{½ü¿2ö¦ëǶhDdV&œšlöܲdÉÖw¼½¯}σßóö>{øŽímKjõ 87IPU™÷ǪL»%ß‹6Ū¬ÌV¬Xa6 J"ÏEå‡ãÁxcà}ooowwW ñµs£õÎÁÿX_Ÿœ½;ü¿g›õÿó¿"Ñzq3-RÜdk,7±*×®ñÚÙŠü¿@¥JÓl?Ø”c &2ˆÏm-TD W(«³Q®) †TƨIdó\,غ]“3„Y¾ÌsÉ„ˆBÓ2sá|7¹yq£ªƒÁ`c:!DQW"EÉÞ£)lF! ›xgN‚iLÉõXˆ¨i£sDlΓ+Ä—â áÒUˆ‰!Q‡RLpY–òB8¨ªõrU³DR<”[ÕÀl"ÄlÈq៲”Û|>/G“U¨ËÖ†*-i¾\¯×ukm”j8ÝÞõâ‡\^¢6UKoØ~MÓD6WzÂè¤wRxr‚M íÍ¢bw±^#˜žK]¯–W‹K6N¤M]×ÄB˜_žiXÇÃf2Ѱ9™L&“ép8`æÌ]dï˜Çêô’ëÐû’¤ Wù¡k8˜6Äf±­C€<š¶s®plëÚ±ÒFKDÎQU³‹æˆÈ¨5”kc ‚GĤÁ\*ïX aæ–-TÅd]´6!Ä„*²vD1ÁÆ…!•Ç%§ãÝíÁ,Ž·öÚ‰ÛNšÑ¸û° ½„_ÿþì‘üÙW~¿õøŸœëòçù°¼ªÊQrü“&ÑPån²a‘$­•‰W·.VYÉ”n׿¿szÙZΡ»ÚžlßÊ13ÎQÆ'±Áp$·â$ù‰3³j¤$|Ö_L¤Â}  “Üu9œŒ§¦fÀÉìvü³OCP2ïÝÌbŒ®§ÓíV!ÕŸf„ä„•ˆš¦‘¤(B€—‚¹ 9ç4’¤ÆD•w^ŠªªD|–)5S‹Û€êEŒ‘‰È:Œ¡ ò–ŸKÃËøùžd Ð)Ä‘óÌæD\tf<Mš¦Y­×ëõºíz½^Õë¦iXA*F¡{e¤j"ìXºYA,yÓF2M2yØlâ|Mÿ2pܼ÷e½F&í+Äyqh8.]IDâ;ÑÖŽ§Mç>pÛ’Øõ&·‹“76ðŒ>–“Y,‰’:Ùó!ÌÇ&žc¦DmÈ£ŒuäC+½Wß‘÷ .¶ 8DГ²ÄE¯aÿñãÇa`æÅb¡¹èGÚÞÞG0÷WWWÿûß›¦988 ça„áƒÀ€ãðìïï?}ú­A€%Áé²ÑÁÁÁÎ΋ë4w°9²|­x­›ÖÌÖëõêf¹Z­BÓÁ×å¨Ìƒt í¦ª——— ˆeŒ6Í"…¿Œ1zï᪱€›››ÏŸ?ÿãÿøäÉ“ù|þáÃ4á@£csssÿÉ“'¿ÿýïÏÎÎ047®r»¾ DʶmƒÁ“'Ož>}úôñ³ápx~~¾Z­ òèÑ£ã³gO¾úê+ÌzÚÚÚzüøñ“'OöööË›æá¨*TŽրؒ‡Û#äÂìBçÜd2Á=Fë0TñA »ººB1ËåòåË—(Ôù4tÙ9‡»èG™æ ¬L”ÕQÅG/L$3Ãõb×Yªü™º¶\OÜ›ÉXÅÎÎê÷`œA¾ŠZãôjš!±Jð¯MÓ èì‘sƒÁ`ww"©oÚ„H¢Õv¶?€|»½½}í¼-jlÎ9Ëê°éxò]m»ä3~QÁo»…§Ï?$[Þ¾•É-/^ÙƒJOç>†Ñ­x$>ç¶Öû‹¤Æ*ÂÏqB“÷u½ï•ä1#Â嘦ùbm9‰ogúUUU¸(ª²Eå\Žˆ'º?MD9¹o“^kÄe IDAT‘DˆÉ‰âÔõ+»NEF ]×jµ¥Ò¬õvü€°²o9âÃìä/Â'ÀkÒ³\¯×1¶!„ºnonnnnVu]omm c?è$`н÷•wfì\IDJÆÌÊ5ˆ©Æ«jDÂ5ZÌî€{¬·üP(Uý-¥j®7²âÖG˜ycc1çØL½âÌÇc4ãÏëТZqqsêUPMQðàrôID”'wiÚz1á]Xõ“˜rÖ¬eÉ̎؉€Ú]–eYƒjäœ+€% 3;ŸâTŸ?J;›`þŽîJ^ bΧBDÔLˆŒ¨“U’ ëg7wþe¾ú¼E°REož¨¥ö|ªûgŒR §=KßdŒHrPdQ‘NeN¬÷þfc1=z„b3ïîî.—Ëj8˜Ï縒ƒƒƒÓÓSPiÌ ²hv2³ÙlŽ«ˆ€- µ„ÉdRåƒ@8bæ”LàE ö&‰Ä.‹ãããf]w=¬¢(ý¢Ò‰z!tR!ß͇0¤QØ(ú¢¢‰ù»hœÅHƒ—/_Áïæ>3`bSªÀáÂ,`Cé nþàààéÓ§³ÙìÞÎÞh4úûßÿþòåK¨‹Éé»$ØRá¶eÑ,0›ä“°A›¥$ >Õ9¨Kš}ÒJ·æ‘’¨’sEUuŠ’»äןÃ)ª:¯©6(JOB5 #hsŒɹšõz ™YÊ$ˆ©iÛÌÓ (IO;¼3®V«å² CÇ£ÙΆ™19I¸+H£¥óç !)‰yïYM"Õjj*pkb¬$iÎnv¥ù…ž wÿŸ²ÍÉg3?Ю®S6"#©¾7UAÏv¨ñÈš-ø ´ƒÔšþC‰Ñ­1‘aïD„Œ´ ÑÌ÷ÚÊñê¶J²èZ‘Âyç\U sUQVU5Lɪê˜9Š1±¼&w:îr¤‚X¡¿ÃñƒïŸÏì>‰(§¶ýÿ¥^¦›'î7·d×ëîÎVëûuë‘,Ì ¦ < æÕŒIh>¦ÉµÐÀ–'›2g]eYÍ÷*ç¸È,ŸcŒ(mooÃAŒ†Ò9Æ/ðU"‡ø¹ëI/KˆW§Ò× . >8&£(¨*&®£ß nããÇYP3;˜§Lë}òäÉ_|±³³ãœƒ·þÓŸþ„–_x#Ì3Î6]Ò€33ÇD„t?[èÂ&PÃŽ™ù«¯¾‚¦Çîö=ðËîÝ»÷àÁx/çÜ¿üËÿ¸wïÖÄÌ0Õq±XLæWÎ9X|)ØÅÃáóCšG©µ©P±:ç|Y@¦ñãÇÇÇÇ———à~ƒ€*a|Z•¸æµ‚l/îé&ª}prx¾`³/Ò+Ó#Ûž6ðd¢9ÕÆ0Ä=àŽ@†Ç½c”¨×Dtÿþý?ZbE¸Äú‰ÉÆO¥÷ííí³³3üáÈQ€PÕårÉ Îâp¸1O–Më™â-æFbàâ­‰ÄÃú$˜þ¥×çç½o§ú¿üü_³Þ‹_öSª`–¥™!à‘¦iÔîøûl»ù–:v›¬0‘“ÛiÇø×ξSd1£¨Æ]$#3eÌœe´ båŠägS<®gï})âE<³#"ƒpqL#•ðÔC’óëŒ,–;ÄØ`BþÄ…óRt#ÈÌ = `f[šC€Ø¨åãˆi~ƒv†Ö³‡‹1&v’#"Å„ƒe£ë¢(FÃÉx8Ì^…¡Y9š2›sΗNÌ,š1iTM)VŽd¦ÝýÒ§õc=9RêQzû[Ñn_™õÍ&NÍs&Ò²0Ñîl S•bŒM@Y®æš&ãÕÅyé{»ÑWLݨYŸHe¦–¦šJGXS3[3QYÖ˜Ôä½GZ<(KçÜЈ¨p~0®CS¼p0U2&fe4ˉk ‘,±©MM5´«¦¾­µäÔ6ïlN‰6õÚ­8´)zí?ƒ|<ônÁ ¿3¿?glÌœ=LFL5éÜK¥hzqr@Š{ò°‰———GGGÐ’DÛ%¼&¬Þ£GF£Q''yy‰Ò)‰ÈÉÉ %(7AQ‹Rƒ&ìuèÐŒ­ âp¹º¼¼Œ1‚–Õ-Th»Ÿu1±WBâ’PrHYþ¬ï½½½§OŸîìì@¢ù§Ÿ~:>>FËd¡WŒ9 —¨ª }Ïóx]¦9Øm’ÆU!jA‰ýáÇfÜjµÂgÂù={ö¬ªªétr}}ýâÅ ä¦ÌŒ¢5;A-¹mÛÑh&ÂØK!TÊQ9ÞVÀö'ÏžÂscxÎð—Ïž=ÛÞÞ†‹…áZà“: ž<¥ô&âO°©¦ÓéMz!,€åÅš®¶ß*æêò®€§A ÆÌY†>ÆÙäÙ€º1¨Þ£M Ñðy"7Yõææ&¼2úñPÿÆÒñÒêºVwGÌH˜±g‰8¹€Ç;?—÷ª%ØœìNOê'ÎõóW$ë”"ȈI„»ÕøéŸw>X“h ¦¹ªD E„l¸]»Û4MQv8¢mî•]鮃ïj›r‡³Rˆ!Û½•p# =0ýè?;à"ŽöÞ;WrR:ÛáÞbÐÐÆ¦nC…ÆÜ†ƒÎÐ#ßÈë¼X¯ÚÐæ•±¨ªJ)t«-‡‡‡h[ø$¬±žRf›¦w÷ ^9¦Ñ¶ÚQsn»Iq…Ëå2´¹­ª*NmP–Øçx[w—ÄÒÙdW˜Éj•¨%å4uXˆ£F!ÉËÂ=ÈDü­æT^4³Žqö‰ë%J»ŠH™¢YWàOämNp¬tqŦe¢Bœƒúæ&£Qa>¯T5ÛÒìƒçÍJU»!˜FŒ¼–oi"ŸÄ 1vP93“šiŒbdÜ ‘5ݱB6콯|…»GeYz‘²,ë8dÇ{ZÂŒ‘0d;ߤ¹^ƒ £U"wèTùŸà/Qáã¤å–K. Šöªýèìö\™\&§\Óétggg¹\¢]•Ò@_Ja)2²d¼Á{åÀ>»¼¼\­VÐÒzóæ J}¨&¢ñ×ÌÀ\Eܶíz½1“pêª$l™!ô˜´o(A"X(x}xeð$7Ö5–ž»Y×eYâ(µi`LýŽC¾RØ`0€òææ&½~ýúÍ›7ïÞ½{ûö-¡è;™L°cL@êAU¯¯¯ÿñ C|Œh‘>JS(‹Bûâýû÷óùüúj1Ÿ?^×5˜nEQ@îãôôôýû÷f†\}®ë¦žÏçÇÇÇ ?£Y(ó§`&€EãbY"~ƒîRsïacZ|† ommÁ»‹DðE-¹ˆrúelW0MPüË޽Ȁ.ð¤°1 ã§„ø9çàÿð!ðî«@ Š/H¢Å YòÍÍMUU˜)©N\ëõõ5U½¼¼ÜÜÜĬFKuærCÆ666–Ú{_9OÖLò┺!v÷Í8d ?——ôŸM•Ù§ðoßB—#›UÅMí4"·7%ü,ÿŒ‘“ÑØ#õm÷')×gç6ô'‚³»õèØx¬9ÝÁ¡îh8eé½,‡C¤• \!Ì.»¶m],?Y=MÖÃùbŒÔ«âM&“Gᤴm{~~Ž IµÃ’˜%k×A”ë9ˆÁ¦Íi±v×:¼Ú9JZ©Ï›¢(Ú&vuìV›¦ QÙ»²ô…9W8ö…'T¯‚yQeŽD¤&DÊ$v'úÑ\ Ž·(Hßò÷áRê…,¶¦Q5Àá1‘ô4âH̱^7 >ß"ü‘Î{q<Æ»´¬Û|½ì”@Ú¶é@Ô‰Ÿ9ƒÏûŠB„,ŠÊ-¬ÍbÓt› [ˆ;Æ’;ƒ0\ÞÙ*‡ÃAgo}B…Ÿóä¤|ÞÅúyÇô!圹枑g”å$‘EcD˜=Vÿ|Æ~~¾ $“ðfP@!¦ŸK²j¨•bÜM‘›S:â¶máqß½{)`3CQo 40fˆ²Õîî®$%,˜¿> ”% 7ž&l1Œ8îü°i‘6Á—xqÞû›å †sXjåÊž)#ä‘C+XDf³&¿yóæÍ›7˜vŒÝ)Ož|gïœ;:9F;,ÈŸD4 ÍdÀ$2ì×^è݉å"Í}÷áý¿þë¿B]$Ks£E. Þ+/x®ã¬jªŸáKáØ$I Ù²¤Ã…¤‰/ÄI²ÍmÓTÝŒ7â‡6×ÄíÖ¹/ØìgggÌ ›ˆÅÈQ…?F¯^½ö~\:3‹Å›‚b(ƒO^–åpXHêì꬞ïŽg`Ú%$”j@OÊvðŸTƒû^¤çü~Æ7s’-èÿ&¿ú~Hnº—TÌ:ó ¸OÛŸýó;åÿï—™R—¢uþᚤöHUExdfÜc’ÉìjƱ7_¶5ö¤¬pð‘U7Mc­d8»j3ï(&J°ªvê‰î–Á7 `dz”:ç±XZO51ìv{Ž;-)íã¦B0ÆfÆäTCÛ¶¡U ¡m[8àÑhÄR ª‘ †eYzñ"®,½óä‹ÂyÏQÈ ³#Vbb ýÕ¾uê1ÃýGÙ'xç—ª¡ˆN/jlÖeÀØÔ9lfµ(fªBIµ¨¡U%ë8†pÃÖcáL¬CA¥^ÜÜ@â0W6óÅÇ™I3Ó0hH."Z‡¶S‚c"²¦iXm]תÚÔ5ÒÜgܘá°Ã •±›ÁN”,šFSÏŽ0/VÛˆ%sÞyïTµ¨|aU/û‹ØRX×5âÄ ³˜iŒ-<Š¦ÞžìÎɸpeÛ¶lRföR Ê™Y¤ª„6L'³õ².}µ9Ý:Ñ|>‘ããcUÅDHúÁwòúf? "?»¸¸€;/Ó‡ñx Ne`X% [.—ãñx{{”¢õz=ŸÏá¥Öëõx<ËA5t£ÕÉɃG±Då Œ:‚˜ªÞÜÜLW+’ëëk"- ×4ëu³Bq7P€ÑÇàf¿ 3!pf`) 0¿³{vvvxxxzzŠ9?XÞ­­­'Ož€†e9>>~úôéx<¾¸¸¸¼¼D»ÎÎÎŽ÷eÐØ„¶ -;!á‹«Ë/lcƒ,Ò———ι_ÿú×Ð égæ“““|ÿ÷|ÿw[žžžÆÏð½{÷ Ãttttvv†Ì´á¢(fS¬sÓ4ãáh<5MÃFËõjwww¼1˜ór¹œ/®}Yð’ŽŽ°\Î9ôSyïåpkkkÿÞ}‹tu9 Æû÷î_ø‹ÒÌ<7Æ“AYiˆÍºÎ-%x4D/®Àååååå%$ÁO>>>&¢ÓÓSøT4˜åàÅ\Ú‡(µà+à×Û¶=<<|ûáýz½NƃÁ`6›=~øèñÃGßÿýééé‹/ÌìÉ“'@5ʲ\.—…óëå*¶¡Y×B\e[7ãáèù—¿šmoŇÃáÎÖöêf9¿¼ÚiŒÑ¹AÎ÷öî£B©*ÊÊIKªÑ;Ç2M$É;f—¦â(±ô”å…Xˆ½8ÇÂFlî^B,“~Cå̤(³³Œd$Äž)Ò˜JÄùõÕ²©G£Q ¢Î¶·ƒ¶õj%D®,s#‡Ë¢”"/cŒ‘¢*TƒcS–¥bwAÕêè½o=þ!cÖHmTS$»¤Ú’E‘Ö¹ˆÝÍÍO¢WÖ«¯áY`ŽE±\.¥¬Ê² J¬ž°#æ&´eU,W7FZ”Þ9·1€ç¸å àgˆÕb¤Ö4MÓ6D䪒\hCh5L¤@Xpuu…ð+¼Dhµ^®Tµð±ÂG=ƒO‚?(“ê*@ ¦iPwÓ$Ì`fÌYË šŠPh´,Köõº®oV‹Éh\ÜÛ§bD•—ÁPÙêº-‚ëöÖ¬i†mÛB.4R­f1I.–ÁÌ-ËÒ¹ŽÓ”cb¯ÊfNUÛ&ÖVÌ9'kŒ”¢ ‰2y" Bc0-gáÖTÔœs¼Æ¸FOŽ\y[Âà\,',™M ñNJ˜ÌBXOë›Õªik›Ü Ò…Úͬ-]eZ²SÖ`!ÆX˜óÎ ²l% ´n„4´¡•Ù…hªÚ†õÒE¿\ ËaU”ÃA9(ýÍœ 7v%òÆÁ`X–¥°gñMP„)3òKˆ Ú`YëÐ8ä —ê¤ÇïêGÄ”¡|é 3KŠ bàm0ˆÐQÛ¿ÙG€TÄ ƒsXJ3ƒ/öõõõÙÙAÕpwwãJrØ›)©“Éäèèh¹\B·ZE"~¢˜# ZNãÉ Bg#L Ô+B8;;›ÏçðD¡©ì™Dˆ!(µWÇc$ýmÛBª #à'Ñ^]]”‹¡¶è~R:Í zÚ>|øøñ#¢Ñ·oßÎçó§OŸN§“¦i W –Ó£G¾þúkHrž!‡>??ÿñÇ_¼xquuuxxˆY¿à©¡zŠW8§˜HLMÓŒCp PI-Ò[×5hÞι>ö€5Áú®DÝ#–£ŒF£õºëÑ/ ;„™I:V3¶_.ëöŠdŒš}~rwxµŽå˜ò6¼K‡[Ë q†(±=ð'PÁöCºœ á.IóàÍeÒljë †Ãád2Ñ6„@øGÌ~yy¹±+;>ñ®»‘|ªÚ¶1°©yº;Õ4ÇÍ}Ðz(’*îµ¾dG•R„ŸO@³'£»eKü‘¤²®ª¢_ƒUÄ2Còò¡ŸYŒX1ñeö”Ÿ§PÖÑqoû£~ö")a³€=°ð½ˆà-õñçúÂ>kâ‘oÉÒî1ƒ²M¥ÖœL÷SáNË1]¡X7WØî*òb“‹“‚©"]ƒO…ñÄNÃÓ¿¼¼äÔFe©¥O³e÷}!¬GèuC¬V«°½]VCW ÄÔµWQád8¬Ú¶e6çØ¤!šcU뤼@ÿްðŽHzc£üµ»¯n¡¢¯L•»ú¦tÊ&$íÍNQ ˆãþÁti„vÔ†{Õ¼óV‡ÌgWo bÛ¨*| 6Æz½nš¦ #L(Ä0™˜œwâŒÉT£*£¾`Z.»³´Í0_2(GR# 1ƺ­÷ädM6õp8ªªÊ»®rÑõxÀ…À2‚ÕI©Œç T–¥/ , &R‘ÞfJå !ùXf~%Ýstòi|rV3óÞ×íz±XE¥ÃœWÁß _¹Öm>ŸãÁÄ3{y:îîîŽÇãíímt•䇔•2uöâââøøx>Ÿ£ èd2yøðáÖÖÖîî.àn {@Š–å UåÃID¹äLDH^Ñ‘cÛ¥®kdó8Q™š„iÖr¹DÞ‡ q%8*0ÔÐwËÌ2Lãw¦ãñøÕ«WoÞ¼™Ïç!„ÅbñúõëÓÓcôDaŠp^(äåWWWoÂ,Å~ø!ëud“@†µÍ-¿£A7S!ôˆ»ƒAÁ„_¯×DE]±sêZ^ Ø5hgbyÇãqŒغøÏl‰Võ: K³#-‹†©Eý"ˆ8„ð…¨@çŠí*i˜NJLN·?s8Êùç çI MÓh™Ífø@ì=øÚL ³ÔxÖ4ÍùÉ)bĬC>ÜÔͽFµÐÛB)…¸‰ [”‚\‡÷%l!nǧîµ>¤ßwiÑ~~NªÝŸ³Ñ:œ)t`©]Çv?È%- »ñN ïH-8gÎYYU¼ðø2îÚX›¯.à/y_X$D?}qŒì8UÊ~0³”UŽH²Ë>ŒR‡d™”Ze‹Tû¦qm È&¤LÊÖÍ N΄Ո)„>7¤‰ãª §îXbŒõz ŠÚö(14a9Ñ@•Ç­ÂræØ)>9ß Kº–Rª >„’´ÆA­,ËÒÙ;ïœ÷|2s>DÂBpCŠÔKU‰ÕL-iq[¦ûÑÝÁÜùÅHDÔDebvN„؉ˆ “‰ v‡, Òîo9Jœy¾ûO¿7é.hµçKgf-‘¤Žÿr蔽½Y†¿_µAD”Éäv~”3‹±1×&°½ASf !4¤ªÊAÄ;Y¥ð ‡Ã¢¨°\ME…ˆ²äž¥éoYð¥_Té˜yP”"b±;Þ1vKæS —¤ \ÿ`S*¢äœ›Ñ¢(ÄóÍÍÍl64xˆL†$iÓAkÞİƒÐŽ~ðàŒ8”µc(x€?¹¿3„: „01äk0`²á³g϶¶¶Båûþý{\¥Ê"6° ¤æ»»»°Ú³Ù쫯¾ÚÝÝ=<<ÜÚÚ:<9–X¾ÌŒŒ¶I"ìH×røg\ Kh0!& r¾([ Äï“ÉF0¾>ç@]뺆@ýƒ›AO^n#Æ ½}ûöõë×H|q#9¥Îq%,郣£ðŒëÉyUQÐ`²4"û窽f|Jm‹ãñÙ¶'¥ 5®F“bnîÇ¿úê«çÏŸ?zôh{{÷ÇüøñãÎÎÎë×¯ŽˆHœ[\ßœŸŸ#㿸¸ÀÙ™5i¬üÅÅÅÑÑ0‰¢(¶¶¶ž?þ»ßýî÷¿ÿý`0899ñÞ Îzuu]J⑈g#ŽGD„+G cDÌŽ¶l´Þ6Mƒk»¾Z`€Õööv¦ðlmÍ`)PÐ$ùS×f.c?[J‹óïQª€}¤Ô-éâ‘C쮢(šž¼èÊÀN2´ƒ=9›ÍMcd!­ôÅ»wïa¹–Ë%ÔXÝ tΜ?NK_ !xý¡nWÍ|>ÿþýö†²w ª.5;ÉÄ+÷‹NÉ¥†îÁ>q®ÿıek›ÃĶmÍñp8tU§CâR›8à _–EQ´1 ÄŽI‚f ‹¤‘b0_&&jâwU0Ç"b Ü]>3ÿRŒ³Ÿ3³|ÐòºåGL‰ú£¸ÿNdE0VÁ±ÄÔ±96/„[$ef'j«µÌœèlª ò !„­X×õ°ŒÇãÙt täúò 'Ñzȧ™¾yÙ%õ7ƒ¼’1?»-¾Ô9ÿ;Çz*ÑõÍ"×M0³Ø6asƒuƒ…ŒÙ˜‘‚ 1yöâˆR4Ó!ˆ(FéÂ'lfRí ê¾7[؈ȳ°sL""ìDÄ‹EµØÍxÀ¤hJwbÞ{òs[™C·Ÿ:×›·+(l¤!jš[-ÄÕŠ®ðÃaY­Ç“ÙfËNBËåòúæfµZ­êuâ`0ˆ±k 'C8N86ÝE¨A@U˜‰o…B4¨Eu®iñ§§§H‰p r"uiÈmGÓ![$&¢˜;<Ý|«9JEš¿ è)HL £¹‚mÿN IDAThçœsÅ@{’lxxØô!õhâRñ9µ‡±VÌI\'7‚n€–M„"+ò<ØtØÐ£££ÿú¯ÿzõêÕáááùù9Ь"‚È€ õ:"4Á¤^D*¸;¸ ÈGïïï7iøhÛ›_o—‰‹PµÌ‡…a¶€D°Vxs“×pëõúôôôw¿ûý¯ýkt㜜œ ËÇ™Ï燇‡¯^½""øàÕjõòåKØè³J ô#Íf³Ñhôüùóßÿþ÷¿ûÝï Zìœ{øð!î¾óúúº`mݬV«ÃÃÃëë냃$ÁÃá°¨J˜¨¸Àùœœ4M³¹¹‰o„b3Yç—¿úկЄ–­$b),5§6ܘڄPåªë¼Ç\îÍyuÌ¡ÏíyÎÄ¥w¡Áã@ÿq‘^]A”»}òþG´sèÂ7£MŽ™Gƒ!¶z<Á³³³ëõ²C8}Ą́£/—Ëùêz­+æË»\.£ó[Bf("ré8¸4:ÐßÊIR/,63é)Åæ0U» êþúà>ösF€"h¢cWƒ=ñeÉÌP=dæ¢èúƒU:i¼l=ú.ðó@!;Ýî þÂEfÂw_y¦ÃVôïÂz¸½¦ñMœ>˜ 眑Š÷â½…‹QÚ–DÈ;×5hEŠð¾ªŠ©ÌØÞ˜ ‹Š_fžül:ECD³ZŸŸŸCÕ ×ò,‰gYRˆIá ªQ°*XÕ¶íH<.õ+w¸NŒ°Ïm4ÑØ¶õ²mÖ³ÙŒ•…K“n³1[´¶óŠù¥‚Ž³Ï·‡™õ|_®…+Iš•éþW¼óâ &±-Då;EÂÝpB&¨¬XW’ ‘0±Ç8êž7RaëèÜ,,¬¦±kpð¾ìvo"€Ê3Ý·,׫år¹ª×ðe×ÍRµc@Ê!mÛÖŽÍÀx ¨FÍ(2 £—šÌBÛ†¦+«ûóós ¨Ù¥å&(B°kˆÎrÍT”"¢½é¿”(y[à‘£Æ¦ªØ.é®aöýz½ÆŽ Ú¾À†|މ’jiŠ–ˆ@^™_Æ© g1“òqf˜¢ÙlÆÌ :!ù€<¤ˆä©õ ,½xñâ»ï¾;99a8SÃp›(Ñ·Äž†ü²™Áઠç*5¸QÞûíímU’liŠ‚bÀªýÜݧ)Ù€Ö _‹o¤ ÌöÕ«WUUýíoÿæ›oöööþð‡?TUõøñã?ýéOß÷8^¯jÈN™Àdܲõ:‘Êollìïï‡Ãû÷ïïíí-‹û·{ÿþý»wklÃz¹^ÝÔëP–尬Т°î‘Ap4?arÀ`™L˜Õ"“ö_»§ldtK²£Þáe‰Ôس0KGx¬ˆ8†Ð¶-›Õ=zqÚ£äS éäv|®¼aT•Õ"‘caÇLÌ~ÚbÞ@è¢w+#sÞyöÒ*ž‘sn4wUíÃËS3†ûhšclê¶®ëè›Y9ŠJ6Éäˆ8c¤«™iTgäÁ¬‡¥ª*ÞÐãˆÚ¸?–Dá±±¼÷b䜃èuN#ø.ˆšo®z°HÂNNNÞ¾}ûöí[@í?~Ä0† -Cüa¦NàÛCêÍEÊ í$4P‚< k ’@UxssǬi´ú Á™0Ù9ršóósL¹¹ººÂeP7‹Ž™…$ó§xrr‚ïBé§ýÞ½{PªÚÙÙÙÚÚjšæââÂ9·½½ýþýû\­×:·QÅÔ®Šú"rýªª°·‡EvEDïß¿GŠ??~ûúõëo¿ýöùóçüã777sÓéô¯ý?ëU½Z­æó9‚¤étš7.®m6›Aëþýû˜ ˆ"ú›7oÞ¾}‹ÁGóùQ3?|øð믿žN§ûxrr‚OØØØ8;;½üþƒ «Õ*\|XÕËãÓ#3›L&‹åµñ—÷öwÅó°AÕÍc1Æj8ØG± UQVE©!Æ6Œê(£!”rQ6Î97›ÍœsÀ?àƒÁÍõ2XŒ­¶urƒrØP[Å2i»Ñ9WˆÛžmZˆÇÇÇ{{{{{{7ĸŽgÏžÕu®ÓçÏŸc ª å Z­V˜úUUÕjµGÃÁ0³¬}Yܬ–Ëõj,Ãâá¦,e¹(ÖŽ¹ZŸÓJÉq¤*ÕDbMæÖ±-¥@ô«læR(¬Ñ +›±…gçD\4Õ¶±®¯“Å ³‘š‹\U©ºeګÉ¥/|ˆhP3²êúÆ ®BÀØÃÃÃõzÿ /œHd–XÁÀK}š‡#é Š"91 ÁjµšL7ÀsÓì<‹÷ïßÿå/ùî»ïþð‡?ìîîþîw¿ÛÛ݇žåt:…/ÙÂkg3Ƹ¹¹yppP–%ô7Þ¾}‹TûôôôääíIÀÐUU$á'Lu5ìòòòÇ𑇇‡ØÚØØ~p|||uu…™ÍfûûûxX[[[³Ù ã q#uzÑþþ¾ªVi:¦®®®Tucci±%â 3ƒ5£!ÊŒÍp𻫼}R.‚B¼'£Ê1iˆæ„ÙÁ§©ô‹0«,KÜÀ fœÐçC¨êjµ‘nöebAJ&Nßx<®C£ëØ–(‚Ôu Y…zïÈ‰ŠˆÄp›;&Яë×”Þ¸”®“YùS̹ÃBSÉÐîjä,ÞyGŒvÈ YÖšÖÔ{ ·T–UNF?=½l;_@?ѱ”íÒg 9¢U5C]À{_zŸ°æ47$ýQ´íÁ+ÃŽádáôÕf®×jÑ&‘᜾y²ÄM!’Û ¬(òú½‰êC”¨Ì­±±Åü!Èï9k0°!ñ qXur!½4¡s_øÍÍÍÅÇ+yœèÜš$rÛ¨j«uH-IÔk OîÐ@zŠEI ¥¨ä‚ªÀ|…:,7Öãéd²1ªÝt rÌшŒT-Fíj7lé1A@+/æ'¯\£¤T*êÚìVùóýð3/w;y)ã7ÿä•ßðÉ:ôÿ6Û‡îŽã Öœzœ¥ëWî2Xe•‚FÓ!þ£f؆c\·M]×óÅ<„°^­Ö7K ѱ°YtΣŒ -÷æWgx¥bÒb±@¡=Ž^  v˜cº\.!ˆñáÃèR-׫ããc –¨ã°Å‹²ã_„ÉÈyqÎ5ëÖ¥¾^¤exB®7¤!¯‘ª2“’»µÁŒÐDÔ’‰èììì‡~ÀŸù›¯^¾|ùàÁƒ` !3c$‘ˆ<|øð›o¾ÙÙÙ¹¸¸x÷îPñõº&#XÏ'OžÌf³ÍÍMxtÌYê4...°×;jCÛâØ´IMìêêj±X`âÐz½Æ„ À .©-"ç$‘ùVø@…åryÿþ}JÒÞoÞþ4ŸÏñêºFg3J쨣#¿¼¼üúë¯www=zÄÌ@;`î=zôøñã×?½ªëqŠôÐÕÚÜÜÄCÉd7DÀóEñÖõõ5ò~Ô ÷Á¢RC–›››>œ9çêºÎ%çÑhôæÍ”»,©ë×Íe³,ž­ö(!x™lß µ2!€˜ìÓôÀLªj’. 'bQFAñC›æùôc)¼å"„i¹¸¸ÈH x¾¨ bËÝÀv™(:"´—ìllµÕ`y²rZR½X4I¥Ö{_kUµÎ‹b@°dvhƒ53'œk„Î9—šŒ>å=áÕ/ÁÞýrΉuC˜Ù‰0YàÎqÆÔe„ƒaߨõ`ßûþ슈äQ²=@›S¹4Ó#œóÎ"^ĉ™UUÉ̪-Ó$>× ,º;r!Qnw[ɳ³.Øš®_¨ÎWŽmŸ«T¹ªÇ¥!ÓØ Æ_ºu´u^ŠÐª)#ƒ4ea_”…ˆ<þüêêª*‡?~Ì«í½¯ënlC‹[¶ýíýJvGøImfâÕ5®-Zfft”©Þ,VË›õjV‡ãÆÆF5v\D1iZŠ"Q€Kñ$Ìfb&NÄÒ›ùëzù¥Ä`¬‘VËúJ® _ ª$-‰nµòúyÊÚwðyÃÐ/aß9’£O"¹;ŸŸ·¨3b"é(ßdÉ«“1“0 ‹c1aqäʼn¸BSUŒñfµc\/W7׋f½ŽmhÛ6ÔM×igIS"ß3t9¼Þ-¢÷¾@rP Õ`è_†áÑÑÑÉÉÉñññO?ýNÃõõu ?ÓÎY‹Â›™÷9ÐææfáJðEqP‡FÒà“`Eî_Š1^]_â:AêI³nºR~$¸5"úáß¿zñchãöÎÖ³gÏž>}zpp ª“Éd6›Á9½}ûöÏþóŸÿüç““U- þÑÁÁ¦îìì ,ºµµ%"™-B¶,©ý_ÓÌíímØV®ÏÎ΀WC1 g4%Ä­¨ÈÂy˜Ùåååp8lšš H=ÑåŒÊñ¿þáÿ‚óCV}ttôæÍ< ¤eWWó“ãÓÃÃ㣣çÏŸWÅWUµ¿¿?™L ~…QKÿû?þ v>[ÓÚT/0,½a(ïîîÚ].—ÌlÛöêê ɼÎöööÁÁÁÞÞ€„óè3&"wÈe.¨*†J!Aª§®níÍŠ¡ÔAgIÁ-¤9©ða«BtÒ÷Ù9ƒ9¹¶:²—XZù»Ì¬Hz2–Æ(áöÏÏÏW«Õ£G–Ë%š³ñ8€·?xð€ªã¸ œsY?`ÿ#DØÞÞ~°{ÿ†å¼>Ó «ª^êC vÑû@C:îÆƒºÞ”fðÈ=tçÆzn¯o†ì^Dˆ€Ó=ab°e;AŽ•3ZÐ/æÏ—»dlN½œÅ:"ºV:ÜÆÛBlþ3+|EDdƒ‘EóøÀnŽ$®Á÷†\ù¤_¥˜ø¨ª(2 ¥‰¯×¶-÷Ô©nAÇ-;à|k)âaRâÂùnl€‘EÍÅc—¨¶ØlëØºÄêI¬Š¿o2™äŸ¦Ë½Ýýóóó³³³õº‹£h~â¸0xzriNbrfÝuÆB£¡ŒP\š–!D"i/‡6^/vï‹Pá]á˜Ù‰2y2d;ï$5àz³R<‰e3Ø÷è'Nuô˜1—rúøsßq»42ÝòÕñ¿8óëŸ|Žw#‰ï€4BÆiD–®Ë€Õ8ÙvG„Š )ŶQˆ°w̬dê\ð¶5MÓÖM»îøÅ§¨ŸÓјH5É‚#b^aÌSÛRÄc«@qß¿ÿæÍ›/^`˜ëÉÉÉÑÑÑ|>Ïq†OMDä½?8Ø»'++lmm ¹l×PmE†WìÜOF–æ‹nmþÒ÷ïߟžž¾yõÓÙÙÙÅÅà\CUUuÛõéþÛßþöäÉÌ6@¿Ðr¹|÷îÝ¿ÿû¿ÿøãê·»»ûàÁƒo¿ýöW¿úÕÁÁÁÆÆÆ½{÷DãœÀõf²·OêBù)ÆïÝ»ëÏç ‰<+Þˆâ\Ô‹æprÀÂoÓDN½L[;Û’ôÿæó9øÛïß¿ÿá‡.//OOOEšbè§:|<›Í°Š FUî­ã 2Ú³ÙŒˆÐAD¸r”qïÛÛÛxL§§§è"¢¢(¶··8çZö™'3´ÊDÕв‘Y(BÛ ªc§(×4Ù¢nÚrYÆV‹Òƒá¨( !6óBä5z+ .JÇÂЉH©EúDI÷󯂬fè&Õv>_˜ñx¶ÑÝEç³ogÿ’ï´ÏÀä_z'}VùÙ7óçtÿ_‰˜È§ù¼pŸˆ:³†ñÉž´‰8ÄÆ¹²,ŠaUÚÄ(ñ@ïÌó¡42]³lGÛBé)³ò†“nHç—_¼xñêÕ«/^ÀÖ ÆœL&£ÉØÌ¼÷ÐÜÜÜ7jkk¶¹¹¹··¢,jãñxsºcDáÚÌ2Ae/¨ý×mM!T‰ñ‹Åâ=^Ï?œžž"¸¸¸8;;CÙŒ@×b-Š¢®ÛzÕüðÝ fbÇÞû¿þõ¯¿ùÍoP[EbGD!„§OŸ~ýõ×=¤4Å7†÷Å…13€D`bÙºá¸rúáp$_U-vJ^0˜ß· ðaš&Á çYOæZ75– ”ÛÛÛÏž=»¾¾þÿøÓÓÓ·oß¾{÷îèè D„IJ1D†õ«¯¾B‘ FíàààñãÇÃáÊ øp”Í -Í&ÔtA @º‰Ô9ÃÅÓé± ~OD°ƒr65,Èd‚ ç2 Ù˜d• !…?,“´™%EêqnsNìë° ´µk×ôiÄ  ä¸0Ê.Íxñ=ÑJÙ ¶AÇü°úÎOp0\]]A_…ˆ÷33b/lc¤õ ¦ÓééééyÝ, ²N¹s6›)‘p§ݲµæ8kÛ–Ú‚…Ù—à²Ùn!»|/̬Ÿ™§îÊ{oþÔJ1Cýƒ;.ÛmEÖ2 g‘\ßý›.’æ‚â)U¾¤(|bp»O#3aB+oTc5bu]mØaÃ䄼6·áA—eÙ& NÐ}G§ˆšã†Ü¡„‹Ê§5Sß½÷Ü’ª0{窲l«J’;DR›¿=ÆH…óÞÒ¥ÔCª©ýpBþÄq]×N´,ËýýýÑh‚˜¸­opk0ÂmÛZRÚâ^Žž„Q¤¨Õ$²9Ó ­‹j®,,q£‘occCÐPúb8ª&Ípc<¨Jïgq±Qõ*ì/‹Â±­c’¡ÎëÉÌMlòzº$<°X,ew‹›½xø³/&¤¤àFÿç_z}¾ˆÈ% ‘\îÞÌJÌx™Qóz×Íõêï^"1"!çY„š¡vÎÌl·mº°8¥ˆÇÒ ÅD{ F6„€ÑñÌ zÿá}XÀùÅüÍ›7ßýýûï¿ÿBʉJDÃápkk ]@ƒÑp2™`h¦a‡–ár‰.¡IÒ¥DTód4JáÚØÑjµ:::z÷î|6|ÿþþþƒpäÐM„q ¯^ýx}}­JMÓŽÇöm=øfMÝbHÜæææW_}õí·ß'¼¸¸@)€nNS•Pq$¢"ÉŠâðp¯Ý…zlö`‰ 1†Ÿ ¯šL&§§§È aŸ„]ÎÈ^›d7˜d3ƒ\ ¢xV0™ûÛß¿|ùò‡~x÷î‹û÷ïß\/á ÇàâEäáã2Æ7nooãg ŒÓ{±Xd:ž°n°IªDÝÜÜÜÙÙÁ–€,IÛ¶ãñøààFa{{ûãǧ§§€Á«4ñÞ{¿¹¹yÿþ}Èû‹Òtï}“¦,À”ä7  ï XÖMèFÂU[‚”±\8Høä\®Æ„}lÒ4hØYJ$A¸Û")rDÐpyy‰5rÅbÑ›‡bA€íøØçX=ç8Þ×××õõj®V‰ ‡c»:­Êrgg¾1ÆØ4¡±Ä;UÁ>iªà”²Ã.9£Û ¸y[úýçÉeþ9ÿ#3N¼-NÞ·¿ÛCž²ÃÞ„´ìV{0ø'¯B‘÷ÖÓøï~Ù7Á;A å JLèZMRÄ9„¢D­B8ݘ휻i[IÚÒïäéZWº4To[hºî&ä'(0—eYxÁ"P'[D¨(œ8‡¼ù7¥>ì–Ô9Weî:Á•ÇD'Ìx5,v3yH{’ˆÈh4Z/ ÈÎ׫5 ¥Ð¡¿\ÙF “2‘#S"2 Ñ"5(â8Sb-J­k¥¥ëÆÍWÅd9†ÃjP ·BQ(9#ö®(ËÂ{®$;?ÜŽÅŽ—]2@¾úªÅxŒ=°„£ü ºw9Lù¥7ßnò_È}éîÐ^ú ÷ÜAÔ‹î IDATÐ Iꯈ`ϵ1p”kC)Ù‘‘mcŒäº³àAÁ…@‰1$• Eß0nøüü<ü£­ª ¸1škѰ···¿¿ÿøñcÔ8ß½{w|||ssó׿þŸï¿ÿþ?ÿó?W«úæfu»öBD´Z­^½|= æxõ7:‡I\<ºOä3Ñ_â•&PÙó<‡ÇŠ•ZKxfãW`‡©BV/¦2v›ÐÇ…²,³T!φñ¢±^‡ÞÎXãƒm«PÀ£¤Â lL.‚º8r$hªÏc$QñQH š™DyÛ™J?„‚H"onuϼ'ª0JÝån§ÑùÊÚÏ´µ^kž’ÕFo5[R#I;ív§ÙJÓt88òl1ƈ3\Hɘ­^·ûÇ2!””‰ÖÚ9Kàny§K…Ðè8xpþ?ú?ðÖ?<ªÕøÿQo®%ÚÖ#ÎQÜŒ3ç]\__½,Ë0Ô–yšŽ'¨}ê¢LÓôôøÄ”š›OgÌ“‘DŽ]ïýÉÉ ¸oÝn·Ûî@ÐJ 9èõ91]”óélØ€¨¿ÙlR• ×”R¦ é¾lÒ²,13 \ÖB—Úšm¾›Îg2Ql6؇v»Í‰­ieJ=!ê ú1W#¢$I:ï„âd|¡óBç@þ±ÛPBÿéé)¬ê|>ïõzè5šÏçÃá0UÉO~ôãXI™Ïç‚q«Íl6[,ˆl"àÑ#çÑ¥àɯËõr•$ÉfµÖÖ·Y÷҅+ïœl&ói$ ÆH°LºTܤD»]©Û\ ÕFÓE!(Q!jqÎiVQu¬`ÌyÇÈy_©ëà½X^Á­µÓjóŒ¼6Þ{㽌‹ÛŠéΨ#Dõ±ˆÓÛEç,¼&bYT¬£¨Îg q™&2åä¬+­Õd«Šr|+éÚŒG ø¼<ƒ \~EÊëõÛÍf³ÙȈªŽpÑ㘑LΛREaJ-×ÌyFÖW¢ü0Od°ã+Üm‡áÖ™qk­ó>ªÚQ˜†©”Ê…”Ò¦ºÕh¦iš(%…ÈÒ4;lÀ[Y$ÖlfÃa¿3kEuY–EqS–9èœ(çI.†/góívK’¸àÐ:ÆŠ1".¸\x+–\$R0n‰{ˈ;/¹3ÄŒ+½g^pGL]˜”kÏr/µ+e±uÒxÁµIšâ&Q<“™âRɬ¡Z­FS7U'iìz3_[zžxŵµí¤MNš’{Ç‘·B;æœ[§Òæ&£„sÁˆ3™l8GT–ï ¼Ö´K”påkïÔ@‰šB•¶ j-S0†œqÉ¥½‚Lé–—€/jú”1ÆÃàK¢ hí ¸’ßDžvÎ4U³Á¹täµµŒÜ¢,kYªÞ‰ Ç$Šö1žªøŸ–:Îv»}òäÉÏþóétúôéÓÇÿó?ÿód2!"Ød'Ƙ¬™‚¤Š€W†#ð|¼zõ*f´¢ù0»d„‹7—ðj¨ŸE.+[H&AÓ`½^ŸŸŸ#„èc¿ßú Ïó§OŸ¾~ý:–'c÷îpvvvçÎÄ’/^¼øõ¯}}}}uy Y.ÔVonn~ùË_n6›ËËËŸþô§§§§˜G»Ùl€F–/„ ðªªð3àÏ4Y" `ƒ ]¤yÆïñ4"EÞ•Åjµ"¢i»Ž££#¹"(Å‚, ¡–p+T«dÚF¾ˆíb±xýú5c =»ËåòÕ«WXvk-r\D pHV»ëëkh;£#Ësyyy||xvvÖjµà­ãäcXŸv»¦éd2©fIPßEÓQ§Ó1Æì6[¸³Ãf@,óW" É.~ÆÃ 9…°Lá­ƒ8Én·Sa¨%cl<°Úœ˜yІJ((@bööö°Ï…@¸v¿×ëM§Säý±€Òiµ€rx|| òÎbµÄ‹ûû|·Û" ^$€ïül6Û9?h om¾^ òZknA×¥Õ¥!­™ªEô®ÖU #"À±ôÃ'çñ?ëŒÙ5!Eˆ[šC¥(@>ïd6<èjÅìVšg=á`¡ƒˆ9Ïér•Iç9[öcÞ:¯½·ÆÜæ¦Ñ€xï¥ÐEHH¬M­µœKz;ƒÇ?›-¨aeœs)UŒQ ÷N÷°"/‹z&-kZ©ª|—‘„ýø.,‚BàÐ ].Ë2/ lƒ|»K’¤ÙhÀagi3.V{׸xF¨bŠTC²S•T/sžˆ [ÔBŸÛó⊵Ö8«­‘P­†–qf¼³Öç…·¤”á\&“-cLrÁ/©ÜmMÂu‹·_OžLŸ’’¥}‘4mÊm#1ò()·Î—Êm5DÎ8«µ G%ã\G«4ÏS¿Bp†ƒYk=媰ÑQb¥ò³/} ~{ïM*¨¢[Wà9T-ÛE%Í9—ߨ²¾K½÷…\ó0ƒ+îvÜzbÌsî#v í42©e±UÒÉ„ ©´ä;ã +äíÛ]8¬µÕdü xZKÑ úÍ7ßüáxüø1Cã7l¡j†3G)F'jübXBk‰¾ª’Q”ˆñ–ÈQ‚‚ 8«F£Qðˆ‰9ÐÈÍf³Ûí0zv4!…ràÕÕò¤(È€‚4dÿöööþæoþæg?ûÙ|>úÝ÷ÿôOÿô‹_üâõë×pçß}÷Ýb±xñâÅåååO~òkí`0ˆÂÔ‹ÅÂ{ü)Wö…'ÁÇpÑwü%pudº:Ìð” \´,KÌ„PÑétöFeYBÒ\YHù 1ª[ÀB#™Â¬oç\£Ññ -§Î9”!‘‚ã+ ÊJ×ùùùoûÛ$Iö‡£ËËËóóóù|iL"zóæ”GGGÆÄŸ„U‘ž±~¿P,vYðW?@0n ë‰sˆ"Y>td¨-—KC›ÍC$á&˲DÆŒ¥ÈŒŒ|>ŸsÎ<`Í…¥Ñ@MС«‚ì6>\9ðñ3ܯýýý<ÏQŸ|41Æ0þû³ßíam˲ÄFEwtrìBM‘5AcÌj±Äø#½Q^ÑZŸŸŸ·Ycc®&ë›nƒXal§ý·D‚‰Òú¤¥ÕÖrc(Žª»+ï=÷USl\l éeeš1_ãœYTR•e©]Å:ñŒÈU‘P 4c¸ýhô²êÐѺáàœKžÄu°õÙ‡Ü2&È rÌZKÎx2ø¶xEÑJ:ç¼cÎÇÙˆ `‘oâøQ’ ¥”àh ® ÎyÜ,@÷€=£Hµóµ.)gt= ‰žSj"é†ùR ëƒ%a8àëÍf³^®ˆ(Q j?£#¤:ÁÕ§ÕZµb"P0Od¥z©¤ÑhL:³ã]Bxrļ%g½õÌ{N\0¡Î‘·Æ[Çœwž„¢Üo'&¸àŠ´óÚðMáÖzÆ<õ\–«ÆV¦]Ñê5¤”‰J’Æ1cÉxéÉWŒ;Áì..$!1ªöÞK¾Ó¥%¯•¢$‘BHÆc¶´ý[F%zïS¡9“Œ8yCÞW8gú s*œÙ3™3çx AqΙ÷Ì9k8瞸£Nã½ç¢Œ•š*4 a%ûA/µýŽ4gÚƒm-3Žy'ubâ¾þÞ{/Y ˆçy>N/..ž=}Ž^Ò§OŸþá€a=+ÅÓ’e:bÓF2 PÛSA]¹î§« CÊŠ}àªÉHøXDpI’xF1­ôÞ£ r0@Ç Ö_—Ë%húúõëÅbq||üÑGeYZò÷ß¾R˜|W¯×[¯×­V )õd2éõzwîÜùä“O>ùèÓ“““Á`ð/ÿò/Ož<™L&Zkøï«««_üâgggàd5›ÍÃÃÃÒ˜ „ˆcìcp{ôv¤O4OxD"‚ h!šUv»ç :Í48 tÎÕ9‡j=ÚO§Ó)Lœó½½= U,PNʲÄXÙÅb¡Â!$ˆ0 ÐsÞÛÛùëÃ?LÓt6›}ûí·¿øÅ/^¾|ùèÑ£‹W—èsE’‡(Û{¿Z­.//ÁhµZ˜ G¸Ùl®®®&“ f3ïv;´8ÇIÆàL&“ù|Žñ¢±7Ã9×jµnŠ@¬õav:økØ®ðO¸@w0 ž”¦é²ÔqAðF,Ñ6ßAÜ=@Ü(³ÁÁËÇz0RjxM4àÁ݈@ùFg]Uû,uì˜Bk5pë]äÍFõ!„kµâDÅkíz½^nw]ÑÚ˜ëÙ6Û*S.7Ôïe ‘åeY²²ÐœySpS# òæ[Ø:¬¤ƒÈª::…ç‰H†æ]-çÜ8[Ei«VâL°[-0êÖug¿±n¡ê>9W•⬠“0*cÇ ç’3å-c¼ÕÄ,çdí[¹ltÀœIëttÀØ,Þ{L¹ùaIH›Üaüa!3$ ¹Ž¨ cXpù®n—ãÛM`i¼Ué lßÃŽÇg·Û•yáœSRbŸíÐ^ÑívAþBòU¥ÊV†•«rE«YÉoæy«a ^n›bÓhh|—õF[c&M¦ÕÛûg¿g¤dJò4å­&o6Ñã•?z¯.h…zzÍ;"JômÐY÷ .Qa;yÄÂ>¬¦$½“ï6\U/‹±lüë{qÞüLìLšëÄ{ËÍ\•³ÔL’òÀ5ëq0 øŠôÞÇ­µ¶(Š›››‹‹‹««ëÇ?~ü˜‚j¸»Û‚jÖÙÙ0ÏF£¡ªâcUTFóŒ¢ÛíÁC×RÊS…äá?àï=:LÒF&Âv¼ ž ˲ápÈ9?99‰ê½÷@Æ4A(Î{¿ \+áZ–Ëet9¸êÕj5è 1õ¶ßïðÁOž<ét:¿úÕ¯ð¡Ä œ|2™¼|ùòÁ£û¨ÿFÄ­¯ñ&á4@e$¢ÈnC^¾··‰ 4ÔN§Ó›Ê¿L$«¦‘àyžÎgN‡1_»Z­nnn@Ï.Š-=°kwîܹ{÷îÉÉ ¾Ô„‰÷8ç?þ»v¹\‚ÀŒñ‚ QÃ'!þ`ðæÍ›ÓÓÓ(înš¦77W———×××Bh™m·[\#tf³pÚƒƒƒÝn·ÞnÖëõd2Á^ßl6“Éd6›qbHÍÑ¥#¥l4óù¼Ùl¢›€sŸžÂ3¡3ýTÅeÀ}èeD&êC{It祩fâŸP‡k'h-¸Wña#"„•²‚$ õŽ^§‹»¶Š³\:ª*÷àÂû–eÙÌ1¹‰5Â<Ï›m1Ý.‹ #6Âmì&gƒ~YP’ð²,YQ8ž–ºV3猵¥½5j¦¦Èfw»øD‹àeyPs$"è÷zïjð…'¢Òèív ¬”b‚[!]ñm ±ŠšÝR´Vñqà±÷)”™êÏ þ[ê’ÈxÇ1î…œ!fóy^þÐ;ç•‹ŽJ…µ¶,«¡¹u@˜ˆ„$ç\‘gŒ±$ÉÒ4m]‡ ¡1°Z­¬w1€aœ”÷>KTÝ_ƽ¡‚üHôÍøÍÐ.Ì3B#ÖæËƒD„9ff‘XKWȘc¬ÿM®b{ãÖÚ–Zkfiä7àÖcc3Å'âÞrg˜UdðæÖ•EáKCÜ“b†3&ÅóR·úJŒzË&_5¹í7հó¤±Á¼ÇØBJ©¤JMŸu}×JN‚qâ^;kŒ)ïV¦;pø9Ó]ÍT‰]<XðâíF •‚!§E‚a§×ÅrÆ–eY†1¬Yv+Þ7v~Æ>ðµØ“JH†.m8çÌVð (×f¬s…Ñn·uä˲Žœµ[mlQ’v9WÎQIÄši³ÓYv²XnÅ‹ï“Ù&y3-ߌE^6e† Á¤ôDJ,B”œ—ƒLq‘!„äÌ{FÜ9áÕŠ…Aº‚1ïcF$‰LRιãJWаÌZñÃ(ˆHäL)ι°–E-"Á½_,Ü-C5ŽŽñ!zãœjâ'–“«eÀq¿sq«±<ºi³ñië¿Ý?ø·ƒ½‡­½·>êìIÚúß+aÞ¼yÔñæææË/¿üòË/w›Ö ëÁÁÁÇüàÁƒ³³³ƒƒƒ4L´vÎÁ⯷+$dQ‰1†øÝ†Æ|¸R¤/‰ tðޤiŠü /@™ßÂC&Š„O)uïÞ½ápé„]œsk-ò­F£q°?‡˜ÀŠbŒ ;rñåre–Ëåøz‚à`<¿zõêÅ‹¯_¿^.—<Ð…t≉:I’ããã{÷î!¹DJÓ­9¶DÅŒHDÞÁýÁpÜËËËW¯^]\\`8£ÖÚx/ÛHRÄ qYÉè ß‚±F¢‰ï†œ ¬é‡F+0ÏÏÏ«'Iø î½ÿàƒÀòˆ„äè{{{än=nh¯×[.—Ož ¢ã˜Æ]2mÔ|·‹Ÿ_¿Þ4˰Ãq—ãU$Y äÂ9§Ë2°©B:0a])¤˜Î¹ØÝŽˆv³*qÇJ8çeY bJ©R—jãè$„‰ëb­-K]X£­M…ļ±¥'2V8æŒ×Öåäš­”7ùËo/¾{²¾[V#ËÍÖ5¨5èêµ$ÁYIÞ{â\H™%Y’$™MU“ŒU-Úã ºÛ™”Žs H8½%!œr>%Î= ªjvÜ ^wÀqUY™WLîÕöáÀÞV4êX§š1F5eo¼¥,ª»EBx¼Þ{ò¾k ö>1˜ºfŒ}ËŸöóÆýï;þñÕØ˜ßí÷ÏÿÝ'ùÅN+îN| Þ./_¿™N§ß|óÍË—/˲D&$¹Ú?hi­QØC§f5,!•7“kl˜è ¸…¼›Ö*Ë2Sj!D¿Û‹™Ÿ÷~½^£/ \˜ýýýÁ`Ø0/w XÁQ!H'"”uQ„†£îÇ>6°²˜–` IDAT,³fãð🠔‚,‘b³ÙÌf3à±XG@=xœL&ËåÒ3×ê4;½JÆKk=›Í@ë]m–*•ãñx8zï¥:çúÝr_W«l9çZ6ÄçÀÚ]¯××××ÐÐÞn·ãñxµZáÌA§:î÷û}ÆXš¦'''{{{„€¿îïïÐn6›ý~ÿÕ«WHø°  Ðétž>}Úï÷>|xssóäÉ“ËËËï¿ÿ~½^Ïf3@²¸SûýýáÖŠ8‹´ 8B”º…ù¥—eùÛßþö»§ÇŒ±G}Øê´ïÝÿ`<¼|ýêùù‹óW/K£e¢úÃg4™M_¼xaŒyýúr¹\kmÉ9_)¥„PÝn·Û ¹™8Ëš‡>:88X.—‹Õr³Û:ò×ã›õvsxx¸0šÌ¦Í¬±7æyÎ<åÛ3A·Ýí`„†Ü{ø<Ÿøf³¹Z­ÆÓ‰P2SªÙn©4A«Œ#…Jªæè„Ž >"…‚@R¤öÀ+áˆöz½æT XÆ Ï³Z­d·®²,ëv»°†¨7ƒx’” Ü›rÛ¦–“Ë$~·ÌŸL¦d)%Òyá/r½Ë=1]ú $ÆrSVÁ |<Ö$U SÊ‚s®¸àœ“¼S(ƒ"„”’ÙRå5k­Â8›$ ŠYG’ãž3ï½ÑFk-g¡á-z_çU“¹d¡gÒ{ï=¯á±ÞyÆ@Z#Ò„lÆ£ÚšuŽ8 Õœ®wΑ÷‚9ηø!>“ÉŠžÆÐD¥/µÕV;k÷žãÄ8ç–qí¼É !9GÆÚ¢t&§$cL0/9gœ'òœ´µÎZ¤‰H—%SZk«˜Eø‘[»±Æ¡+’1f£-–2Iª1MIRñ(3j–ŽÙÒ ¦0ÖÚfÚ4Æ(®Xr[ôÖ;’Ív?É 9ãœË¸4¦Üä;’Ê;n‰‘óŒ'­f’¨fQ$R! c¹ã–‘ñÎ9¿c›ÅàZç fzëÔ•gOþë¿™«—MÆÚ]صf›pF–ìx•HÉlØZ\Jî…u¼È 'k6%©¥Í¬•$‰äŠ1¶£f x<‚¤õÌsržsÆ99«ÕÞ{mMUàŒU }o­%åˆ9ç«fTZ¨a¿+ëÆCã/ÕÆÌ;礪Hˆ¥võÈI‘¯T"ê‡ûáxDKDÄ­Ê>Q¥Þ‘í.®Ô›/ÿõ_ÿÿõoöá_|öûå´gYþÁ–³‰–üöÛo///¿üòËgÏžé g{zzêȇÃO?ýôÁƒ(kÁœ=}úÔ‡š .Ñ:®.TË9‘…D¼h!žüµ×ëÅ%(ºBe˜_¬/ž…Ì/aê'X0pçç瀩¡A!˜90¼"±šÏBˆ¢íÚ#˜¹[Å|>¿¼¼D&JDPß,ó‚1†3\Ë`oHD˜Õxyy‰&˜“ƒÌÛZ 9²@à½Ï‡Ã!α’ &öñññl6{ýúµsn>ŸCCó½#ï=(=~ü¸(ŠçÏŸûí·ÏŸ?ôtz|r÷î݃ƒ zBA—16_.lP^„@ßÎh4Bê†EžL&ÈéëÀ¯˜ó½{÷F£€îëëëÙl¶Zm0K> ¥Šf³Ùj5ODt&LÃ#zï¡= îÞ½;›L[­Öb±€•×qzŒ’›Í&öqFÎc d‚ù|Ž™Í¨Ñ¢Çi0 ý…?Æ'€0轇´K§Ó‰tÌLPVò5"IÔ^ðÞ»šö|ÅKH“zn]‰‡0^ô«±yò<7ÌrÇ4[-vŽëU¹X—¥¦„ÓÎ)¥¸TFÉRsÉ%3Ì#™ˆŸP¯€º2Ì«dQyj¼D¤ûV"'ŠÛ…ŸID\&± ÿKÎ͘Pèä¶ÖB‰‰ˆ ±è€‚ßúÑ¥ÅÿâcAá+f¼Vsåžê¿ŒùvšÕ¿˜¬àaÇâÔ³•&¸q’à:šEA‚ A$ˆ··]Xï˜h`§Œ1g«R· Hý„ÇÙÕ<8ÜXW™6ê§3¶Vµñט[;S:眱P«ÎMõb¤‰’ ÜîŽìÀXÅ ¢ÉTtrGÚS³ÓÙ)êvZWß=Û,§pƒDmþ…åøh¸Ð#î'ç±dÐ §(ÁdŒUíæá…¸­ÑÖ/8Kút§ód=ž?þúõëét Opssƒ; g€l»×ëݽ{Ó XA F¾Ø,0ÿ¸û‰¨ÕjÝ¿ßZûÙgŸ}üñÇι¯¾úêåË—(ñbµÓ4=;;ûì³ÏNOO³,C]ÈV›5Zƒ0}ˆú\__ƒ€;µÝn/..¬µƒÁàÎ;§§§(3[k÷öööööà6ƒÁl6ûî»ïž={†Û±X¬ÐeŽm »ÑhX«em‚R·øOc 8ɸF´ý¨0l/Àc“5(]ljC`c¡Ic±X@ÙÑ9‡AO`GG«[Ä‘6€!ÐDoO› ëõÚÿ<Ï•¨äŠp¶ˆ±ð´×Kø< ‡G¼ á8k-O…_9Íf…ß+W7뛩:8üßwN)Ùív!wÌsÁûŠ|ÙØ&šë[ØÓך¢/qaÃbŒ1ž(˜œï`­Œ±$Ì^dÒ‚øëƒA‰ñ¨ }wøÔؼ÷­­f´;ï¸sÖ…þàºMÄ7V¶»6F0Î}Ç"ëüöóë_p“…ÙATE©æB¢u5Ùêp†ÄGø£‡ú  ðϘ`ŒíÐ)—$™'ýMŒVoW)LÃäAÕ+öVÄ×ø0ôÉ†î’øÕÞ{ÇÞÒyp5úw@çJS#´E ¼¬Il¡Ë½î@gɶŸÒlé¿åm×-zßø„ÆÅñ~pÎ1†d1#¢Ì‘”’‹ÀJC@æ*PØzLj;òq$VQž1°·k·Œ1ïßÕàkiôƒ£þûºfµžõ·÷áûç ÿ©ß×ÁjÔ,¬µ»ß}÷tÍÄßüô¾Wû%ßI'iò=¾h¥èõzGGG>|ðàÁ?ú³ÑhtzzÊ9ÇwÎ!½öxùòåååå×_ýæÍ°HŒ©„¾áwaÇÓ4Ýn5Þˆ’c ³ØÜÈP7›M«Õ²ºi‰8Â5•&˜™ˆÞ°˜W¡˜;k¡, ®5çÞ0,W}[Â4ãôPò@@‰” !IdŒA›øÎ4ˆÿET_aœ-ƒ¼e…}•eŒ‘8b1yKœ43ÃKÒiƒ÷º*s½>œªR*U‰%ç¼ê·3-%r½.o³UÎÁÒ÷ÞKJ¢áΧ­&®4’³àR@êê9c ƒªdÐìiP¦ªA1}Á b-–9ï½çÁX‹á¥nûœ«˜áåªÎ¶özV; ¿4ZÀHyLJ5›ª"=9ç‚ÂT–e….#|Ï„}bm§ÕhÇc¼/¨ÝmÚT?¥fÚ¢·h|–eNO*B| ŽK|RðþG¢C†sÎŒ£·üÍ»„2ª¥zÞ{D|pÀñĪ“$""ÉÕFjrΩÓñµ†l±. _žì^wÒ=ÿêÛ#M“n£M™œÀQ§¡±0±›UXqÓ”Ö0]qažs.…ð·2ŽžÅZÒ}|Û ÛÚÿ»gÂjøGÝÆ%¢DiØ'?ŒÒèm—\?Ìû&ÜS-3ŽánSo¾]¼xuþ3sìÚ“Lº¾í3ㄜN§H Af¾ÿþ_ýÕ_}þùçýaoooo4qΛÍ&xž %ÅB,”÷äRü îÄ{!€¯Î_¢²#×±Õ’ÀÁ"¶É9×¶ìv»Î¹hÂæó9¸»s‹ÅŠÝ&ÈtQ9ƒExˆ\ Ï ‘dœœœÀø¢û›á‚À. ˜TD ¤à½Të9N_½zåœ{úôév»=:8Äü]h€ÀÈEéAÎAØÁå#Œ ggg>ÔÙívÑj…•³ CLæÀ潺ºB>í½¿ÿþÇüèÑ#kíùùùåå%â€V«uzz þíññ1<ôéñ (æÐh4âœàår Îñx ˆ6˃“‡?žÏçè ffH)Ÿ={6›Í&“ â•ápØl¶qƒ„Úœs»ÝSe¢–î0îhVÞûÍfÓn·•P'¼6l &8&C¸0ÈȇTLfluœÞX† hœÃÕI)AJA Ÿˆ´ÖØóàî!ÄŒˆ Ú¼x4€|X]…’,ðt*À†W"Œ"ŽV†ˆâú §ôÞw†ÝQc?wãË k+ÛÉ“ÉTJÒÆ–eÉ=YÁ„Țͦô*wU(dA°÷>“¡ ømº^æ5Ž:Ìèk` ž5Úbÿ‰¯<æmÿkõ~– Ðû¶RÍ“!ªS={c5òK=³gŒ1w;õ¤Ž1"rzª%‚"ÕC´*¬ç-X†rÈJ0g«Ü9GÌ9Æ|i]Ìöââ0ƬÕD„Ö&ªd—d£Ñ8<ÚƒEº¹¹™Ïç6Ì äÅ…Ï©:s&¨–VÖ³^F‘R MµÍË ˜Í¸”œˆÌ.'€¢Œ1Æ" ŽRAš1¦/Ž$y&Ó½ÁÂk;]’fÞ,ey«,VwW"Ìä¦ZfɃcÕ\©¢(´qœsά”2•*VCªmƹgÌÕW<¤œñÕ/¹þdÅg'FôvhÂÞ…ÿYwÃôßü§p=àxçˆßRïžÓåz¼^,;]%Œ'"MwîÖ{öüè£À]Þ(jéA ~:œÒßx10sHbnnntQ¢™RFÔ?°ãEÂ'1Æ´­èšØîñf#¿ŒkÄÿÅr„ë *`¸ _Œ¾Ý)QÅš…Âð°Àf‚ŸÊ{©( ¾¢??úô)çüÁƒ'''=úðÃ…Ož<A×{ÿùçŸãcŽŽ†Ã!ê wîÜÙ¬ÖÖZD è™ÎÖÊZsDDP!Àµ€ÛŒÕž†¥&"Lî~R=V˜16™L®®®pˆ¡ÐÈa·Û¡ÖÞlfQ1*z2<´Þ{`1ÍMÓTU{n´Dð²h/˵pıgðOLá…ŇE˜Zƒ0癄ùq„£«Á)"|éQAÿWÇCí?ÃýCºDJÙétˆ³ØÙ‰›‹¯ÃbâóÑí³ùf1N·f¼ËÛëÉtñææªÔÿ‹'çšI%U³ÝŠ:$¡C,äÌlg 5`˜xÉ8çܲ[„ƒM’ôëêéElk޹ ~ˆâ'ï@ÐuY7aizË^®§&1±5mK"ÒÄ+cô^³“·Á~ÌÞh5q¯#,J`‚ˆ{Ïœ%k­'˘gÌkwëÿè-ãn­µB¨,ËWRÊÁ`°¿¿rr,¥Œ²¦`†rΩšç}…,Vìtf««ð¡®a’è€ãᜃŒ3ç\°j_q.c–UãÀcœ˜`<‘ªÕ¨.\k½dþĉ¯_¾æÇwÇßü¡ïí\Q–TÞ" ·ë;>!F$¤sÎ’å tk²ÆZ²pIP)}€[ŽpÅ[V•dD41Q«.rΫ0:.r¬JFÜ›…2>ŒUÕñ&½ã¿ãËò­n˜rµT¿ÅÁÚ¾Ÿ_SäEü¢ºÛ2¡Ú ôÈâ…c@µÖJIÞ3k½ÑÎã¼N…¤·“§à LQDê¯yÇ/ÖŠú…°÷¥¿>0+x¸ÿa ˜j›»k«ts«ì÷Óퟳ5çÇš_¦¾Ç˜Õ$XcÌ|>GZóêÕ+8´ß€xŒØ ¨)(0(Œ1ˆÔ{ïÁ¦Ûn· ¼”y|"ÆÑ¸ß€gY˜ŒM«t¨dŒJƒÜׄñ^p‡,¨XÇväRH5T˜l£µF.Íf à"Š„¦Ö=ö\âëbâe"‰,V[­ „‹ØŸƒÌ¾6Za­õƒGñ4õBu«Õj¡––¦)æÅƥȠ†ADpäÈ}w»Ý‹/...NNN~ô£}øá‡'''è]þæ›ož={Öív?ûì³Ñh”$ÉÁÁÁ`0ÀD#Œ3ܺ?ÜC’­k ±ZëÕ¦ªñã½÷HÓÑ÷ %‚ò@,Y¡ü 5(Æàëñx<Š¢˜L&päÛív4:䎇låœÛÛ`rpžç£Ñ¨ßïçá`Œab#ª×u•Hƒ9ˆ4M=«àD Ìeè§D›2f"AÎ/†1Ââ`›ÅkŒÕÙ4MäcZ­– eB,ü*ôð¸yžo×›hW«ö èhIá±Z­–µK¡[ ¼ý¢( Wn6›Éb²*Ê”òýýýd8, S®V+ɸbÞØÆRZ› ¶í¦„þáêÖm‡1&ƒ}^É5ï`A¨2d6LõIDÕr#Bß3bS8xÆJÎ>‚תËõãü­º]„µ½cvÎÄsû¯ZìU7Íõ·G‹Y?±·kàß9GZÛ²0eYZ§A«¬ÁÞ>Â*a<i­Ó¤¦ÿ<ÌGç7pÁ ¿á´H'`7pJMeµ1É‘ZU÷ÇÎ9!{–H¥T"Uš*)¥ãq^R @Vu™Huô!Ï®2ã–P:ÿàþÝ7¼ UY.w¥1Ì871V{Ç×'Ï Å™#Ì_₱²6¬Ú YÝÃ%Wu¯cAœpŒêâöO°”ë;*^ …‘ñçø]pCô¶Æj¼÷cÙŸÈŒã#o ÎÁ6'®#/…ó;ÉDn¶Î“óò?ý§¿CÄÊ£o®UÜáƒ'HUÒn·1‡1'š$ —m¶phË »¸×ë!s:;;CVÌ ¶Æ§./pñÈÃÖÛ ¢8$Žû 9 øÃÀi¡ÖÆ9Y ‹È°Ë¼pÆ–yQ–%°dÒÓù,Þ'ă¼÷ÎxcL‘—œsrL‰do°¯”ÚŽŽƒAäëæy®ÄnÆ3ºs÷lßõã»wÎЫ#B›ֳݮÒt̶«ÌœcÞRš¦Þ’u.UÙv½›OóéâåëscL»ÝþéOúÅ_|ôÑGDtuuõøñcˆ‚=xðàÞ½{]êt:ôƽ€ü5¢)¥q6Ë2¡d¡Ëùr!C5" $ˆ1¡qAwP1áÏ*Ÿç}äyï—Ë%î2ê eYF˜7UIÌãÐkíÞh¦R_GGGJ©ñxLÎÇã|»Œ·Ín»cµÉ·»Áé®eµZg­wŒ3&8ò¹Fší †h­\mÖÑÅ2Æ ƒ-„àJŠD‘¨÷S•(!¡¦‰Ï‡­Aj t.öhT…tZÕ<æfÖ*s-˜ä$v›\[#¥d‚;ç ]ú‘u–“T*õÞë¢T‚K.ÊmùjúŠdÕ?æœÞ€Fðùr}Ö;;X·6¦›‰ò¨¿w]’ˆ+qusÍëÓ‘\³$/ëÍø–•1¨1¦(vÖjdlx^€ybœgŒ´ÎƒJLtŸ2Mí&´s*UÌòõzíÈãÒÈy­µ)*6¸O«DÌ9ïœGæ&ŒQ5¨h»­)£“Ž ¨÷>ﯱE0ÖÕU5|5ø~À¶*¯ê†8ºUK€Äª44I2Ä—È#N`­%çuQfYÓ{Ÿ¦Î6¬µY|RD¢\¨Œü·÷ž8ëœI)D#kµA¯7ìõ»¾sn»ÉÛ­®î[`Z‰RÆò^ ÑH³N»8Ê9¡ TAäÝ ¡Ä:Úf³‰Bj¤K’¤™5’D2Ƙ¨æƒÕSgO„ù´x$Eh»2Ætnظ/}^n|zÏþŸù W½—Û¥«j=ÑEÒeŒ?|Tl²k¶ùQ/KËòBñŽVcÕÝæÛ»ýÆscšŠ\pÎ2*Wåu#3^²£þ¿×å%/>È2§ù7Ì}ÆHó”­7+•Pš‰¢Øyk“FRMî*ñ™Èlç¾i5{Åz˜ª„'sÇW«›~¿—Z»)·-˧û§WÏY·å¢ã ~yïyÊÍÆ»ùfÊY©ES&n»ÉMY>ÚYÊW éôìÑÜæòùÖPê:i«(¿un¦Ø§:ß“Í5§ÜÔ•_#¢ì®ÕJn/o†äõ¯\so.ÇZʇ‘ ZÁè³”R6Û-€1K ¢{gw#^/‹&ËB—N,¨§Îf³n·[ìr!t<ÐÞ,8Z´®Æ¼6ÞÔØ˜U¡¸e'])RÂ^Ã{!‡ƒÁB°‰Î“ëëkLeh6›Ì6bDoX âƒŠßàAÍ·¹&¢UhqFáöþýûív{·ÛAÍé»L^¯wpp0yØTb×i‹ßDä=SJ!Ó©!°Jk-FàT///?~œ5ÓÃÃCxÙ~¿¿\.÷»ßýáÐZ§iúèÑ£‡YkQJxöìhÌH¸mèü¹‰ Åz½æaØ…6<íx®ö÷÷EлfŒa…Áîqa2ÊÞØp0 *ˆ'3ÆeE;Xf0s\ XÀïÀÚíö›‹KA4¢”º¸¸À.B•e!D#Ͱï#Bƒ}Ûéuãëfc²V? 3ƒ/ç|¾\D—àÞ ¦×ôôy­Ñ@}¯×S©Œ+¨ƒUXŽÁù@å›|5·j»Þâ.XkÁl6ÓíIS¯×;ÝûðƒÓa?kýü«ß‹”ŠÂF{ƒ"…LUŠ{àçÞû,læh+ñFä[1­ŒÞŽD…—ÖŸŽ$IÅ,E>ák@q=EïmvsDðuÔ:r†æ!jÃX“…Ñ7Ç,-‘Â× ÑøßÒ"ó,¼¤%ÉíÃŽ«†¹K’„jHï­ã·E 2~ÆXÚHšÍ¦àм—"ÉB„Ýëõ@SˆÌ>Ünh¿ ü„iÁÕÕµ}tÀˆ`ð¸áaÄ%ÚAÞä»*’L)ÕH3\‘£ÊTš ²wo¼éу2ÆlE™~ RŠ·þ˜¡F6Yý¾sÎ…hõö³ñøwL¾¹wüV˳|µîÈöææWVËHÖœs[6R±¿]gƒýÖz̸Êr*¤$.\¹%±õ.åÂJ™êÒ“k©D™¶Nì7þ|»j-‹¤›9-;­N^lvÛyKþµÌþ{®W­d”õô|ewsvrÒÜ,W¬†¬ÄMkLÆü¶(œÉ…R Oã )ÙºÝØé]·ÔeÒ~n\“t¯ßž›EÓ,Ø®¯* IDAT÷­=TM’j¾-ÇÆ ~òÞ}Ë9çŒSÈíã÷JÜ<¢”{||œ¦iÖl˜0·}A°Ôß|óMÀœØÍN¯ Mã²,c©Rk-‡ÅÁ`™Øz^ÌxããkbI Ð2˜ˆ$Ä Ô˜ìú `µá†AYâœ÷z½A¯.Â8Ëáþ^ý~Ä…[ÎWØñRJ„‡‡‡ølôãããF£­°,Ûí?ù䓳³³,Ë–óMÒ‘c‰[K‚"Ç¢(0#(jf½~ý¼â½Öp8ÂBäå˗Ƙápx÷îÝû÷ï7 °£1N`¹\Rsaº8¤'àN"ùžBë ÐøÎøp²Ðâ…Œ±0r5<Õ@ŒEAÛ2X±(3Ùï÷£¸&¾Åú öÀ˜ ÈY—eyss3N§Óiœ, 3·ÞnàííÙsΪòaDy,å&Yí5L .î²sêtœ¸K¼¶áˆE8ÀòH—©6d3†ØŠ¨È(¥­ªE28`¤ã»Í¶,KtU¡3V¾s‹Õ¦á’æÀmíµ+æÒøßÿá+òĈZ­VÆe§Ó‘¢Óé˜DveÓµeUÅ@¼EAº+©O†y›]Œ××±Dç\â]$|FÓ/¥L²´Ú9ÎÙØó.Ñ´òÖ`}ØŸ8\€R#ºø^C†óZݯtôV¿Í­m© ëÇc’Iï=ž>œ˜¬ô¿Tý¬‚ óìj2ú›} ÛŒÎ[ëÒZËHxçŒÎ]V ¢N#~rè̬$fað™ŠW²hÀ¥`:°ÛáóàÂñqÎ=¯ž\ɫС* 3ŽÇwaÆ6ò#ç„qÁ1)¥ôJ±,ÓDM-Л·8ç oΈD=°‹ µÛˆVWäý†e­ùrV®“FcÑI§k¤t±)¤PÞ»"Ÿ7Ú¶,ôrYH¿7ÚKDÙÌwý´µïyéØ+²{Œ[!X‘“ä­„µ–ùM#K¹sÍ›¤Qô‡›ñ|¹ÖËN¿»^ÝîMÊù Øž5Ú«~co6)òõ¹j ãÍ­»aîÕÞÈ ·Úm÷$õ-_3±Ul˜ëÜ–n0˜hÞÙ®…•×ÅüÞþI9¾‰Xf­mâJN\ÙSþªÕÚ”»÷nÛÛ/²Öc´ÑN;­½|õêUl3m·Û¨Ý2Æ„’&PQÀ³Öæy>¾¾©ëĽÍwn€¡Œ®1ßîTðCÚÈ×Ô¦ƒñpÔwUbrÎyvKë  ¸ —– Àø I)±Ý#” A.d]@S‘ŒúÐ(­Ò$z)˜Œ1ëåPdÔ|èv»¨ùa‚P»ÝþüóÏ›Íæõõõ“'Ov»DK”R Ñn·G£Q#ÍŒ1I’áÇrÎqX.4¡J)·Ûí³gÏ  ÷ùêÕ«—/_ŽF£ÿøÇgggÛíö7¿ù ž+­õ`0Àp* ÌÏž=ûþûﯮ®c_Œµüèu€Ç>Î L ='6´:øPbŒa,"q¤­e˜µ@ÒA¾…X üyK\ñáBÝÌyŒ1ÏÈ{=£Ãì)FwàÀ pÎË²ÄØJ°¯h;x¨H¡·›‚à€(r\*¸2F"|TJ¡…ùêQ‘‰¢Z£¤Dø>$[YÅÆ†w1–eΠ̻耽¯P„¼¹+˲ˆ]"Eò|5o·[.—¥q-ÊÚ{4Y¿öåÂm‹ïn®MIRòÁ`ÐIͽ¡à½~»T¢—uXf9b#œj)UÈe]ýÄÃD“è·bi-u7‹ˆ`¦quBÉ ¬f\J©¤ ÛÀÖ½oô…y~ ×Ödžޒ[#þ~ÿ{ËŒ½ÍAß×F Å;¯¹}%«n4ÕbŽºk÷o'ôq%ë‚…5¡,æÍõ ôÞC²»ŠßÈ[Lm¦‰Tj€Ѝ» _#^™ÐìŸßˆÇ áœsªž…w =ñ²Ök€ð>-%á…d¼Ñh4|£A²ÃyÚ1eÆY$™F`ŒQ*‰Vý3?8ùøÛ?~+ÓæáÑßn–oúû/¿ø\|ñÉ£õà·Ó7Gÿø_ÜÍÅÈ97<œþO?[ì_µ› ·»JeçÙ×ÏŸü~—ÿ(i7¹ìzí¹”¼«¶B°ùñI§Û*>ü®•ôŸ}Ý›N¶"›&tw|1l¶ÝîæS½a££ïFþõÃÏ3cm£³ýþ¯ÿ¹~’1\PÉúÞÃÜîŦ]â‰'òƪ¬Q0Þº{W3ùæü»»¥Ùgâä³ÿ¼ÿ³ïÊ5}5{ó›E»£cÅzôø—ûVßY\ïwz×_ü¥>ºsåm~ñ¼»Ü%Æ,ûÉ™ñå®Ü‘Lúí_ß§ÿò®·íúvÛœ¼é?ø¨ø‹ÿx>¹‘_ÿòìÅ“„ÑžQUûb}çxïµ;ß;4&OÞdW×MCV*•Nx}2œœž¾Þ™ü»ß}`X&¹í÷¿ýÕ£_?(J‘ _|°>ýè[–¦¯~ÿ!Ñü½û¶ÚK5P,YËdÄÐP“@^È9Wi‚G×D½÷ ªÂ«U«Êä‘»ÀªÆ]«šMìªÈg¡0_^„Õ\3ƦÓi¼Ñò !‡‡>HÞG_‹ÓÆ™ã—ȶq&è߈ó‘Ä û!TG:,”÷ž‰jGè»Ê?69¶¤žaÖÇã1Ä˲ÇŽŽŽŽàn¹Cx_}tp+ÌØ[TLÎ+.÷x<~úô)4«ázÏÏÏ1òàà€ˆÖëõÕÕÕ6ß }7Æ€Ýíœët:pÀeWJbdCDh•¡ÓÀacù€‚D-òW¸ëÆìüØCµcP@—îÜæþþt½I¬-Yv¶÷i¢¹ý½¯ÿ}fþìY]ºª²X,¨XI¡@ÁÁ€mÈ6`À°<ðØCOd0hx ¡ Oe&HÃ4%Q€"EY-3«²û?3ÿ_{ßí£;Íö`Gœïg2H¼ÿš¸'Nìfíµ×õ{^¥T8à(köÜ;že™3–ݰ”’ xìïï{ïYpƒè2dú%mÁ?åy®¶¥¬Tw늺…ÑU¦,K[™Ú¦ø­¢l´2„\,ç€/œc0OÂ5Íš²æŠSØáÐWsDubÄÄ1‡DÚh`#k½Qe½ˆH÷ÊDî¥Ê@a–ðJ­µŠµ¶¶Bl*¼ŸYß­¶;M?^ð:¼n<·›w÷ÝñvåÒ1¨®šÞtf5RÚëF)0Žþþ5jáÁô‡÷ä68Î`¾yfÃlIê·¿ßNæBOD¾$žèÐÈDlh%/|¿íÈ¿èÎÃÍÏ7Ïmžç¦r1‰;Jˆõz½Znt²Í BOA(Ÿµsñ:bóWd¡Â³ á&3üó¿â½·–í› h" l”8}316,£RŠ"@¡…ÄMºµ'IƒDëH&&*Ë(ÏUUUÖléÄáäˆ(#]ÙY–~pÿî—Ÿý›?Z.ž~“v?èä»ÎEDHÆ”'çOËrÖKÏÏÝ/–¿y&£O~9+ý`8849¢†¢(¢X9_!,w÷«Éøâ_ÿÙÑÅùÉn§w~>üÎèγ|–O£¡í.Ž^}2Ï?úðïnæÓŽLgàMið \çˆL $É|g¿9–¦+#åÑ–FìÜø¬—œo.äü"Öãio.ת{’UûåúZéo ±NìîNuÕ—îÚæE#¿Ýc|¨ƒƒ·ù7ÿ¥4u¤Ä?ÙOð\Un–`™ ¦>I­¤”OŸ>EÄ8w:SV|N¸ªÄt­ò„à. Á°ßÓ$Ô&Ù"ˆ¦™1ÀilzÂŒˆ¡ç$Žc‰µQ`Þ°éUT‰á£}SÚÄfÞµo†Ó±¤_6dz“ÉD)uûöí7npÚ꬟Ïç,Á¸¿¿¿3žð•Cn3<Ÿ/Yëùóç÷îÝûôÓOY>óã?f}Í—_~™SÏÅb¡”ŠÓˆ[™ùÝcwÅË\ªgÛ§”êv»,BÀ€õz|;é6 %[bLmׂînÔ€£Fj›q×`ÔL3Ù6ú¢Qyd'Á¹8c˜áû¼[’NÊ™ÏÄ #{‹¬Æ¢¹D2ùq#"7Có8Eh*X¤&âñmòADÌö¤¶²÷ÞûÊÕ%1²[]@ç\UÔómÂ.åÇÇdhð:lZ i%ç<z‹ª‡ÛD|ÍaqØ,zï‘ê}Îo_ak™6k-÷Œò-K;ÄkÙÙ“~ƒ‰=’Â`sãÁpCÃ’ãPƒ…‹0N •†""¿ÅüÊ@3#·Ãé¼»øÁQ£¸Pþ ³„]£îŽ­4=ì"h…-ŠÐØ"ºJ¿x!µm2¸*lÔþþ ¶Õ3»9Úy³GߺûVãéÎÉG0 /œG6Ò˜¼¤[7ß”±€sJ". »ÌaÓ„ .ÒN¯k¿ÕÚmŸlÀ·Û)>oiþš÷ŸVðOü„¤¦¶es íœÍ`ÛIðÓ‰…”¯TÐÃÊó5ó®æà~³®l´2øl•R»Ã—dnâô³áðèç?³R~óèÕW ' Eeií½G©mk®mx}yþжÔí¥¾òÍzQ/骬\IÙõ–t,vFUù¹—ߌ†‘{-Q´ûAgðtqq3–ã˧;7_=¾yøê'¿:ÊÎî$ñK•þd#ïKyM4œAhˆ/ˆ¨a·\•Zûƒ#8=-òó±€£‹ë×pg§2³£DfiÚ¹L4DîÐCc3èÏ*k.Îðh-†“YÜûeU½ú¥ûö‹,¬v ñeŽ ¬³k8VJYk‡Ã!4È$èv»Bˆ¬È¹,šeYàÊw:ÑáQÜÌ·Á¦ß—wØ ¾ÕiD0 qÀur£j n¨ÉA^š7$€ûÁI0S&8¤Éd¢„ä-€¨u)ËÙMˆæÁ)JРàa㇤¶×ëݾ}û•W^¹wïÞååeUÖBÊNçúõëýnu»xðë@cNOÏÏÎÎîß¿ÿðáÃçÏŸ?zôˆ+Ǽàœõz½7ß|“å¸/.ÏïܹSUÕóçÏg³Y¿ßßÝÝ}üø1—H•R¬ïÁ„sÛ'“ VÙíéÖ –àn¡i<çŽZЏ¼¤0%Z×`ÍÃ⇪„÷ž»ŸùHÓ´“¤Á·ä½¿œÏv^.—ap¾e«ZA‚ÏÃ’¥J©ÅbñìÙ³Ï?ÿœùíºiûF‚`ÅØUð5~lT{ EœAD­£(Šb€1¦¨Ê¶]æeáW€wEÚÌJâ׸Ì+æRp+3o¤,ËÆé(D!'¢ª*kèÒ“sΙš Ȉ/54š{ïcÂÄi¯i¸ÐOHYÂé°/°Öº²D0VYç”÷X˜šI,¡ÐC ;lZjå…ØjÇçüž‹ý|=|µ¼©X¨¤vœÎ{ïÕ¾$Ï‹Þ\^jc¶š_¾©Q¯[÷ѶwšÂUÛŸ!k[4ü‚¿š\°ý)Ííú†¯b‚`Ó~|í€#ÍT5,hþãªÚ¼2 y£Éoí>´t!dKC8äµ/ëÓ'ZÕâvppu­¼÷ÞQåý¢¸hÚBôC-ˆ‘ #„¸½¤Ð¢Â‰FÚÁÙm¹!`fRÊMIÙz¼§ä[¯»ñ ~xo&ÔàBþëÄÞ±ÞÄiT9/ˆJSæZD|xãúM·(Wöañ¨ÓÝCì9*u;ÖÏ.AÅÝAGfË2z§fyq©#¢Ëñž=ä#?éí¨ÉÍŸb:Y­û»¯>4¹IÓ—Èû€ó‡G‰ˆ Ö³išÊ½HSo ŠŠH­G‡ÙfáÏw^¿§“Åt i¤¥ë–•^¯t¯Ÿ8G&Š’ng§oÁ¸øÒM[§šWK'D¤„’ýî Iž@ÐíõвTJÙ&'‰Hª¤×uÎ!Ji¹¨dÝ–îÙ²³a­²|6› Æ~S Š¢u¶éõ%J¡úÝjó•Í,U'¡,Kë- YÙjU\iF/+«²¼â ´ª,Ë<_³±&¢b¶dÿ­”ò¾´~Ii žÉì$Ø8æ5„üX±3ž0•;8Cogð¼ù—sZkLÁ9Ç [C¦NìîN6ùºÓKÇ;£N§ƒ²b“v“k;Gwï¾vëÖG?­*ÛïËÒ”¥¹¼œ_Œ§oÌæs\¢”òÑ£G,Y|qqqÿþý÷ßÿÙ³g5Ô/<(©Þxã;wî¼ùæ›Ü-6›Í^{íîµk×&“Éz½fÌ5[ÌùÚØQ±‡SJuÓg-LÏfd¾×ë¥ÝÏ6æfY&-w»]‰Í×&'æl’¦¸ðÌ9¯ó!¹€´[UUHBËHhÇq¯ÓÆ£Ñ(MÓþ°ž‹XxóÅüââ‚IòœìòV«ôzƒ¢2BˆÉn„œÎæÌcº¸8;>>f¥h® 3çHÇQœ&ýá€küÇ1WÇÙp?´sÎVµ°hàÒ³³”-Ñï=sû ,v9\1uÍp­½q-À9ÇúGÞ{Þᵉ2[SZ % ›g¡z k’$HôGc]ÆÑAz”vJôw \$צ£ê':£UåM7§¢#ˆHI)šys¨´Ö‘lf30Š2Ò1‹ÙYG%ß,CÐB¹Á—ÖZǵ:9o­Wt„šVÙuõm ÕL¿D­u,È: dfnOË¡1Ó[Íâý'ë³wÿuòÖoür=}ÉùÉš>º{X|üãÃÞÞ§9]ó.¦Ël=µýEš úzbªÛMUG?;?» ÃÙ3д ,c5p¤!µÃq¤³'Ä+ÅŠ #P«âÛÍY±RKФ¤4\¢ÇÂD4µƒqO`"¨ uUqÇ‹Ô(;ª`¨0òËØŽî´k<ÖÛª(Üfc‹‚¼Gkq½vËe‘çÃþñyŽeYƒÖʪ¢’4×óÜ9‡y$´F¢U…’"Á€·@^ JÑ9ŸrþÇfÆ`‰(Öõ”À€–°#aÈMY–ü;J)žÑÍN+8`)eQ•<Óuù$NçÎ;wîܹÿ~ˆ˜×6Yvøââ‚©CÌ—þè£îß¿vvÆVÛTzýîôo¾ûî»ï¼óÎh4âLšˆƒÁµk‡ûûû¬õxttÄdc!D”Ô ?±é÷Þ—eyz|jx,úÈR\7oß a~€€YHmÌþf¹^ù“Êþaįëo¿;°­ö¶V<8Úgª<^¯×¬MvvvØÔ"Œ(uÁŽß³Ùl=zÄIÀz½<>>^­VQqa˜e–¹K›užsXÀÙÙ¯9› vÀÖZSn™¨!2EÄ¢ÕOÐþ)ÏŸé_ ³üˆHµÚ¸¹Ë™7W|‹o¨õv¬^8 Ó«çjWUÅœXn.×å`<”¹Vãþ^Dšì©ŽÀU ¥”Ek®ÀöEkkˆ÷ùíV-ÝAjÍÅCD@ÔZCƒHº¬oU ‰ˆçÕ""1Ÿ=¶0Rl2¶AFs´ï7dœíÅþ•†TH=_ÈÃÂiƒá{ái¶?«ýéÞ;"BÀÎCDœ {"¬§Tq]Œ°”è <¹0©áY ÙaŽ·×\›Ÿ.°Ö<)˲ª¶ÀÛ•µòX5#›~ã½w@µµ'öÍøçp³pαòšoQáš5¿Âð ë§)4:pÎZkÈ Ys™ V¶-[û¾áºwõmS²gq>ÚQÏ>ôa6ý«ì7~kðïÂ*›ŸQdUá ;vKÝ«^~åƒ7¾~ñü${òé7æÇ“~_XC:¢ªôÞ“19¸j“ϧs3Ù‹³2‰o*©+˜K]w¥ê_÷˯ìüåÞÑûÓeú䣷—«øÎ{÷Û=ÿñ¯­/sçˆP‚<½‘¤Ô¨Ó“³góróš)£Éõ{~åî~g>;ïÕÝÎrIB”õ|Eý¨\ß益¿ò×J©ÓÏ^_¬¤½½vTý¾+-|=c’í*$'Õ`0`k¥u­íÇGìï ' ¤%Qì ˆÈghÒu£Ôtb©##S誨#…ËœsVˆ#Ðz´³›$‰âþñ²d©?I^oÖœU baŠ¥É7åf ï}EUyRB¡B/°(ÊæÒoù¼‚r/¤¤B:òÆ[O µB)—å’cFNpƒ“Pwdr³]€uKøW€ß ðõ 9–ÙâF:!ÄtvúöqµZgŸ{{{»»»Ëå’»ž˜’Æ&8Š"†(‰ˆE¶µÖ<=ð“ïÀëo¼ö½ï}ïæÍ›¿ûÛÿh0œœœüüç?¿¸¸è÷û¬øaL9NG£#á¡Ëèr>cg:úÙñs 9"Š"NÈž>Æj\|;¡ÍW@ý†«f–Tìì@K0ØzvÆœ2r ȹËl:gÊB§ûûûÜ öðñƒù|~zzz~~ÎY/Ÿáüüœñmj2NVÑŠã”™‡R3(jŒ9==æA^Ng0\\\ŒÇc•8òöµ 6² ·)‡> k­­µ¨‰Á-׋¶É†›/@4Êm7ÞWìwùªºÝîþþ~M’jfˆÕ 0ªà¨ Žˆýa/˜6Þoµ÷¢A­#î8 -Ìß9‡u’Z Còí·]—ó[Ÿ>ššÔÖ{OÍÎgJ¦Lt¨;†‡Žˆ¤uûV߆bV¸©à ‚ºˆˆ-ôÚ^gߪµÝmˆ'ÚŽ[¥¨Ž` _pðX÷!Aû<‚Uš9¦rìM#£<9" Àk"€ÈyO®Á“½€¶+Å@ªBÒZ;G Â'¢z®~ñ€l•±ñDŸ¹º`! .l)¨K íuVJY¿]·° ŽlÂNà¡Á`¤”¸ß4ª­r8CýE1鯔’h\¬u¯ß_¬fÏNðô¼?_ÿô_ÿgÿ̉ó³àãùÎÎ+ß}÷`ÿk90^=y÷ýŸÈg'á­™èÌ6'·R¥7« ¤5˜)¡-e—‹Í­Ww†Ã§«&}Õ,;ýy±I–K“î8X®Q\ÌfñÅóÛçódµŽÈûÁÍÙΡÍW›Ê!¼tDΦˆ -ªªzòÑîáKOWѵ£Íg޳ug‡b"ë\)zTÞëáõûß}ù':ÝÍgG.?{üñ[—'Ép'3â¢=Ú)°ÒóxSHŒ6H‘b3ÁªôÜÌ £Mr Ñ(A8çö’ï½Çc Ós™6QDVï#Œ;²p‚L”H!%H_vW™3fíËå’Ûd]£°ÏöÑ6-Âýn`jPŠg-ˆÍ†’µÖd‘ŒñRZ£„«d)À PYª¼$P&Š•–Ý4”Ù°²ç;==e*P `³ÑMÆA-ˆÍ‡“kFgÒa›ò_Ùðc¹gæââ@h­9¬IÓ4ÀÝüšqZÆÓýŽŸ={ÆëÐét¾ñÎ×oݺõß¿kÑ IDATíoû[ßúÖíÛ·?úàã?ÿó?ÿÉO~²\.y²/ ¶¶šÏç———Ì›ÍfL§\mÖ®iBDÆxY‹X6 -ìS™¸§ O^bãÂò Æ-Saƒæ=4šŒEÓú¥Zý;;;Î9^î½f÷¦„æ2¸rqqqvvfŒyï—Ç_s‡+§¡¢ébâ`"<8)¥Rû3ljcUU-—ËgÏž1üÎvuQ|#%žc`»ðЪ€³UuÎmVÙ—n¡°¶Øâ#ð{DP@ð ŒZóÊðP N[9æÞß°’mGkJû‚k篣¾hˆ0lËêg!…N"C¸¤ç´§:gdzw ­HxðÆÕ$µ¡'ÛnGÌ"ÔBø-µElJãìݽ±Æ[ ›þUóÛÄ›Ä{ÏBØ(AÆQ=Ô¡€B÷^0:Þ*^]qðæµ ¾éöW ÆØœr8ßРݾëŒ÷ˆ‡UõQèÄD”8oÊŠU‰€3`…¼Bä%Ož(@Gu¹Wr—ˆÀ*T:ÒZçU"ÙLºŒ¢(Ž·C&ÂM€ ºö±CÌkK Žå«<3í¸¡ô„U%"ž"ÕÜþVÌ‹ ®ÞK¥2_R ÐšÔ—“ÔPÕQ)„Ž;ç w¬ ‘Øq¶{v¶9>3%¥Ãý®­ŒN®UÙ’¸sè?<õywöÇßzû+ó×ÞøäŸü·½?ýõøñ-³p‡“~¶™XE‰¬ÊU7ê*”O›£“ƒ›÷Tt2èH\•þùâro“¯ÑPÄç@zq1Y\ùø¬3¡õr´œwŠ'Ÿ®«*‘(¼ÆyÞTþl½‘îx5ýìýÛ×ï^¾ý­ùfÞ9?뺢'd,¤b‚¡"‚“¿ýù'¿¶Ì’æ­o|xó­gƒƒì—õ›Ô9}Á’„J­Ù\áÍR¡ÿŒZ³±¤5¢Grhˆ* &8:EDÌ­…RfTƒþ jYk7¾H“$êEü0 šÅfÁÓã³,c‰ÊÕj…ˆìÙ‡Çy±šòŽä-¨½Ö¤Ñ¢R‹HË$B¿Ü¢¼oÓ :¯ÈH×ÁºÐÅó‹d8°&Âp1ˆ±Üä3r¹e0À{ßïöšÏÕG®zj­G£6•*ÎGOOO{½A§Ó988˜N§¬ÄQ­ª_–¬Tuzzʈ´‚'1¿õÖ[»»»ï½÷ÞÿñÿäoÊØ/·Üñô¤ÃÃò̹Zrw~‡¥V G3‘5HV1&r¾cL·ß«šÙòÀÔ9öÁa.WI9ºœÏ0Ðöš4ùãjæ|Yúº#¯ ÃË(š©´Ëår½^?}þ„óûÉdÔíòHD,ËR똫¹ZkŽcXiœÿ„ƒ6¾YöXüdyÙC?•hF:‘÷ÔyÐ--°vfðbFEÐvHÔU ³C~ÐJ©årB`õxóp 8|hÛœ …ØÒâo¢I!ãITium‹‘Uÿäyî<Æ¢(]Yjåœ7! RW—jQ§¶Q‡>aÖ¬1Î9lS×xçjmç]=}!­‡V¨AWqf¸ªÌ5Õß¶¯¥Pý …®ÂU4õïsÀÙçkÍ*‰T&N¢â Eʈ0x±Þ.Ä^ï“æô¢ÙE÷„¨j[i¹«­µ<¦0ìü/=dÓ̰¨Ú0&q¨WÍ0McLá*Ñâ¢Bþ‹Æ~D y›÷[àNQÕ¢g¶VØN/RÔÚ*Ì©ŸE™Ò­lµÚŠ ¤-òu±!µð>-&û¢¬.ùkI·\G.Ï'•<½÷ÞÞÃ_ÐúßÁµ›ógÏg W«ü±5•ó¥”õÊX-M©..ÈQùî»o8ô㇟-²5Y'Ö>¿Ü…‰1J¦«ê,w…RZôÊÒ^ilV•JK𦔲0ÎY#¢™÷×rã«j÷ñƒÞí—Íó»ëM¹T¡„%"pèx ¨“¬ú׎‹¥úø;óÿÚw>¼q÷•Ïo•æÚ EŒÎI6zÖZ‹ÖZ«8ëåfYV=¼¼¼‡ÝBHÒ B^BὯNp&µö~]6Z²Û!"o ®.¥ïêMVUU±Ùè~}~~y|̉ïz½æ‰ôDµµ‚ªkCKñÅú2Æ45d§½VN!¢Ò*E*kya¢zfóbX¹ªò¶o„s ’¢¦<)š.g¶&i\èj4{²Ëù,j¤z©™1®µŽT]äc¿Â&Æã¡Á úæeY®V«n·ÏÃ}ƒ:¿{L{æ+ñÞ¯V«óósîëx饗Æãqžç,éüÞ{ï½÷wïÁ믿ž¦ét:ív»¯½öÚíÛ·«ª ìw±ÕE‘Š´h5_ñ"@7í„MÐŽ¸ ÁZ›ç9ûN×hD—yÑ6jìá¼÷Y‘û¦ ØÆÖØ±y ùhUUÇÏN ¥$ÅÜ,Ë>~Àº’D”¦)£ôm^4G6“É„=z%<4‰C4M¹¹ëñã‡'''ر4K_q-À4‡kX©|aФY!mB/X“ÚÖˆ­ |Û„ž7!„n† ò¶?GxlyžtÕ(³lHUU$µ2¹ppæ M³PHUûTÆ»‰í¤‹ {±§:i4à>àår©,Å=ž3³Ž£©RªîÊ{áüjOÀ·MS\V¼b¬€ÁÝzDä/ô…« ÷ÄŽ°ªóvk”¯Û—öù­ËÜz÷«º%íÀ(¤€!å…–;^4qÙj‡VäT“B< íxïAÖçtΑwm–ƒsˆ¼'ä ‘¤BKDwdmÖx[ÿ¹oj¢q/I’DÅ{‰éªÕÒÖv{`›Ìµ€!Ü>?è(Š\ÓÿMW$0ö^á°°õÀ«ÝM Œk¥‰„RŠÂ$Jçþ>­’šÐÞ·ÖÚ(¾îò…É­ó.Z[•Yä¨GÃH¼¹Óƒ^2›^ÎÊì‘Ò'‰8 Hå+×ÙF£ñåqÒÝI..žô†)‘BØ’ k¥H7Y÷þ'öÉ' Æê ÑåÍ;½Õ\ƒ°žüzc./“dtz¶zTa7Žó¨è•™'‘åyÏΖå*Š”Æe¤»§ËÏwÏOÇ“Éü—ï›gÏdµQ…õÎÖ—ÎYg¼õŽªÊùÂ:=¬¬‰Ä¤*—g^{ûןŽnü»mF®#ªßhº*î~ò“ŸpÕ·KÕ[kQÅ:N…ŽJ€Ñh4J¥v–¦Ž¬½²¨¼÷˜¦zi½“ÓµÈ-l6”oÌrY˜§«Ùlvy¹È²¼(ªÇ‰Œ‹"";¤vÁƒ-©‡:pãH¯'ISVüfrÜkdQÖ’Ô$7ü·üÿëׯs¹‘aX4±iæaø]ñúë¯ÇcvÀ÷îÝûÕ¯~uqq±³;Ùß= ƒÁàë_ÿúW¿úÕ—_~™aØ$©‘(Æ'̘—ãɼ8\™6Æ$QÜ~%ØÇql½cî.6Bl òMæÍŪªæó9Ov´ÕÀ –Î{Ï´ ŽKŠ¢àµªªj6?í4kíå|Êó¬ügØ6I’7nðp$öÚßߢ¨,˪²,OÏ#]¸}ûö+¯¼4Ÿ×ÄoG8›Íf³Ùññ1{bæ[£$ú|«Žˆl _ÛÑW·ÝÎ<€©IŒCð… !Z~=G™Ñõ¢(NNNX}0t` !˜%ba×’R ºóÞY/¤eð¶ßIC>Çp78@"X.—XÚ.h 7#¥„K’ô‡Ç·à\Ýyå"_ê*ÛÔ%@DŒ”æk± œßMÛJÃ:æéÔakÄÛ™Ó“<þŽ„m3k ÆóʇÀà½Ú^ç…Ã]%a…”×’ pÛ‡òņ$Iã8J¥Œ¬ñÎ9OV"pÓ™1¦ª ï€LºƄ"©@Ûûu͈FÓ賑EÔâà ›ø¾îaݨu´¤kæA_BÌvÒ<+ˆm¯Ñ6ú!â ƒoð"ª[æ®'ü;àøö·¡uW1¿ˆûŽê‹|‘W›‡ãÁÀfJ”’ƒãyï½YYÞTqu¨¼QåÃ Ž±|¦µÎòE•÷c‘HpÝø°*§ÖUˆRÈØÑº° #™Ÿ$GE[Ø¿ùöt8^üâo«““ŠFóN'›-’ÝÁÐR"UßÂgý´ß‰“‹Ë2߀t®¬L&”VàªÒkç³Eßâézs(úæ+œN{ƒ^LéÚV勤En(Á¸ÊçÞ Ul­S`:IçÂ-£"·®ªuƒ­ÛÌï@Ô:Æ ÖZ«þæoþ†…¢Øÿ1lØét,Ú¨‡Ð…À…+Ä\B%ÅÅë7CŒcDìv»Ël£µˆó”ún¾éE‘­º EY… P°øqÔáNJ¶’\ù“RæÕ†Á1ßè‰ZâN†V´ºÙÈ-h©uÞÏÍ®¡AnÔb%79#L qrÎuÓNH‰°Qíg’BÔ ÏaÎ-¿?ä|€¦ƒ5•¦²ÍlŽH’$‡ÝnM–^.—UUM§ÓP‰áñââ‚ÉD¯¼òÊd2yýõ׃Ájµzï½÷NNNÒ4}饗qogÿÖ­[GGGÃápoo‚n· à9ß²¨:_'{‚ÐB;¡( $ˆ®jeó‹ê«’oJ)Õï÷wvvvvvxúWg¹ÔÊy|UU§çgŒN¯ÆGC2`¾ý|Spš’Ž¥¸Ý‚Ç!߸qãÖ­[“É$Žcòdm2î÷€Íf³ÙäRÊårùôéSvÛXÑÑÑÑÁÁßøl6c}P΃¹Í:ì~¬a놯Áo-¦h$‡1Në&oÕHŸòÅl5Õ踱“`¯ÌÏ…ýÇXY–ñDù|Ά˜IˆÆrõè:^RÛô/׋`(e3žÏ{ßMbì û¸I“Nܹ=Ú_\f¨ äyî³²HÊú5©–¾,+lP·%¨ 1o&ägY¶X¯ØþJ@!„–ŠËCÁƒDí-ÈyΛëœõªn[êà>©…‚ÊÆc®™ n¯z!«k{)Øöõ´_Dd¼iûãà€+Sø¦,„jzúué‹$6Z'Þ÷Þ“ez‡Pe™{爜 ðäØÁ+¥]sűau Œ €h"º¼¼BÄqÊŸÎѪªª¶•2ÑbA›Â„v,vµƒÔ*@Ðl ¼÷›ÍÆW¶èåõñðbÍç׺á ý/l.PÊØyc¤1†%KÈZS— ¿ð¶ttÓ¨k­I>ì èÛìÚN÷nt¼É.‹âd³1ãñÎ{=ÅÁÊ~Zf…¶7:éÔø щq£nº÷üÙ±ˆðøôƒ‰ú=‘®lQU…I:¢,×U¶I»ÊÚÅôãÑð•H ?]–Ó‹“dÇ€ާ§“³áÎ JÈ7ãu‘u&Çiÿ|sÜ+ ŠbIäŒ-´óRµ.MÖ‹“;É}Ý¥³éåÎΞÍw*£››’òbY–iU9C½±¶˜ž:™YLχ×ÒNrYú‡Ëãß^.—m3²}ŽÖFƒ%[yž›ÍÆhS™úÛ¼©÷‹jõYOî];82˜šb–£¸ÑMåTºË‹Íjv0-;OfË''­ëÊbÕ€E¥RÚY¢ÄÚMU±¯²ÆðÆÒ ¬Ái¥hh·üàmKD—3’`…w•kc툌tk.žÆæäú z뎿}Äxw}4Îa$1vÿ~·ð.½~š¬>Ð ÌæÃþH6]Ø<òß¡×%àºÎ¹¼Ìº¢«"©´æáƒœùôz=Ž{îÞ½ûöÛoódîæbÌi:³¸WežçÖVZËn-Ú@Æ”Æá$)0®ïÞ½ËÜ×êoñÞGJ3V웂5•ò¶A É®J¶tO·þCP¥n­ef„Yr|Güû›UÆôCöÊ! \°ÐÖÅ»}¹^„5 ¹Ž1&IóMç̓‹LÞZ —Ñn½ý`óçva“ÍFúíq~ž(/vÅÅ· uŽeÀŸã8N£”ˆò,O¢83y¾)B5$ßËÅj=_O©”‚8V¨J*©ÌÛ~+Ä^íÊ¥o1c•èí[Ü“öÖ»àÚ©›°*êÆqêÕ°W çÁ‘SQ?ʶ¯%"g«° xÍùJ²¼ ¨//zr•Iûã ÍÃ2®SE±\rDâ¼a/ u—Ž©sD Ô Q3"\* X3}vf EI*¯éHFk˜{o&Ð*°)~óÓç„R6&q‹–›lä’²,sÎèF+0,lH|á Ðh$‹†ÀaªªB”Âaå0éÉ9¹Š”¨œt*P874n ü฾Íz¥ÝêK+œu@qt«¨6Ô9_˜ÁÃóGßÿá£_àû?¾üá?}r~Ö¿÷Ìö Ñ3úÎw:Ÿö!»å»ßϧýêÞbQÀ°ûëËå‹Ëÿú˜¯—ø¯þeì‹Q$ö׳õÑ?›}öÝÃÓ·¿u÷ü_ü{=·¥ƒÍ“¾±{ON>º½rßûÍGûo?ééþÛoO³júWqGÊ\ÚÏE.ѺJk­S¿®\÷àÉùYbÍqBã|=÷Þ!äÊDI™ úåÜÚÕ7[’Œ$öRá«å~oüñÞí_~=^̾þÉç3‹{ä-Ça<›\"NQn§Þ$±OÏÎW]ò9äói®ŠY~¡/µÖÎ'Õr>/@he¡£÷õÙÓÅýc}ÿXe›=A‚äºi*Í“REE ŽB?ÛèsºÌZTLûâÇ@TlÚh¹ò®x\ür’ÅÇ»”þö ô_>*þêñòh¾ñºüÚ«·«þÝ»‡Ï?~,{aéú2ÒIÔí`Cöá RÊ¢(æóËöîôMÏ«oä0;©FÉ"!Ú¬`¬7:« ±QîõzýL=¾Ÿ>º'’}X‡&^HÞ{/%Q½gŒ1†ŒŽ<ªï}õ[±’º§ô ézWªW×'?[=Ö÷ŸE÷Ÿùªê£8œû¢£NŽâ#¿•Ž Õ¥bÝ .š®;!„µv0è1iˆñº ãÏÄnLâò*{ÜnÚ‹›¡¹¡y…ÚʵøV7‚²YŒr(TWaîüâr¶üð£ÍåÉþ·ÿáko¿ñÖõ[Ç{ýÎ*Ï/îݯÖs##¶qsÃ.;à±k®Ü@-p±W ¸cÑõ¸›™5ób5j‹]DtÎ1Š•Ânݺµ¿¿ÿøñcïýáá!ôá}pvv–¦é+¯¼òÎ;ï|å+_9<<ì÷û‡‡‡=œN§¬;Ñï÷G£Ën/ ŽÈ WJq­E€äRkˆixU³B¸© ½÷Ëåòìììââ‚«|LË:>>þôÓO_\þÑÿûñdþYõ ôLF˸×ë‡R“/‡——ößü¿OóuZ,nîL€àñ³‡³ÿïQvòU-š*5ëv®%ƒ¾G¾_©Ôùeÿçy[ŠWdR‚Ê6æÞ :b?¾™ŠFDçËè?]U‹ °´JbB™¨¨ÊN׫2ïvNç è¦E±)ÿæ/6«çÿLèµÐ+©"ozëÌ¡°{7¢Y¶b PáÑ F`ÀI_š,+ÀƒÕΧ~ø~§Š,u)>-…ýgIçaô£³Å ºòp8îÇqFMùFjÒƒ&쥦˜ª”"*^HPئ°ìâõzÍþ#´‡_®+vƵŠÐ)ˆ®ÙýÁó#+—Eö‰«P+GraÝÉc¨ì¿=+WÕê·÷ïŒú»f »*žì]»ßWÅñŒ?4I’ÑhÄåÕªª²lè0ÁK)­õœÉ±i-Rº±4D¾ÞxïÓ8i&Ìw9WZNì>ÙªÆqÜï÷‡Ã¡÷žç t»ÝÛ·oß½{w<_\\¼ÿþû?ýéO³"gò«msîËݽ,Œuvv&¥<88¸~ýúd2QBÜ.7ž]œB3¯œ-Ñ'Ÿ|ÂʈlI…ÜŽu~~Ξ›Ó8¨Y~¤Ûí–Í xž6ˆˆ,d-$~!CñÒ5“'ø;ãñ˜ë¸ãñ˜åM€‡s`ºº Ÿo‚= ±‘µöóÏ?Fà¹PÍn›‡ „D?ä¦Á óå™f¤yøN;cB8Wß%ÚÙÙTg$½™Æ‘ñ‚œT>¡*Ÿ[вÓí*¥²Íf],À2ì÷W«•hU§˜™ U%*#ê¤GëÀ:g,HI‘ ^„Z\\٠䜦‘µ¬àái»žþ T¬/nqu¾}ðU¶,œ1ÎÚpo*§”µÁ ^qÀ$¯ ÞfÀU=,Ä9ç>"’eÈ@ˆÖûÒ{,K•t©Uüª ÷›ù¬)?qi£^ Íø€u0ð~¸šþ"’ðA¨‰ ,+Wy2J ëöíC­«EY–qÝÇE( ”J%QLah —ðŒÖV›5iíšêÕêÉÕ•çïD¥¨Ó4!H"ç«,·è«Ìf«•Ÿ/”èe´*iû[½hä- udCH’”:o¬_ åÒn_â`ãz¹ã3§È9y|z\UvÐÝÑС"Ê7ÉD€™T…,æÞÓp0’Åj‡ªq¯;!8®Lem²Yôl5L»}Ô)‰ ±[d2+ Iº 6iJJ­Ê"r¶ãW ;6iít`®ñ•×ø–Ó®1F‘÷ŽIJgÊBDT˜Òž§S(Ó(vP³ÚÊü IDATTÎ<{”îì¬,-òçT¦ýråµ1kiÀ{0øfÄxI¤±$# ËV«•uÖÇ.ÏßÿÑ/Ü@PìUQôdÇôÆ?Ÿ/ÿý'÷oþŦ¯À2+Ò€•¥í澤mkX*qœ†%àÃÀ¢£ìÕ|kRÀ÷D «„n›r>"zØöe¶ß1C@Î#’rèI¡´œÊaúÍ7~÷›ßýæäš÷Ù‘—‘RªÍMÑå@Á2œÜJ4 <ÕvÞC¨©PÃ!¢Ìä¾.BDJ7ÅÂz\hdÒ{Ë…CÆ8û/Šb4QXÆ“ѸznO¼à…RJ1GAûŽQ'éB‹ÉÂ>¦ª*©kWs"ˆ8{æ“ΠÎ!›™ÐìäÚï-løŒ©+†&/㪰Œat\öÞóRp4ÊÙžoz¦¹=ŽãÐä›NÇ@Ê…Ö¨"hØy¼s8× >OÁÏìlp C+K¾¶-NŽyÎá‘…6z–žæ>o.+H)c½íØföCŠÂÕ¶¯¡ÓM˪ EVÛˆN' ÎH=»÷ù£qÿÇïýìá““ìøµ?ÖQöÑÍ0Œ{×÷¢_ùΫ_ycÿ•ÑËé ¬iUø™òõÇ£àíø£ÈaÅ´ÀÂÆíni¯/ø6ÑtÁµ³Àm¾,å}á V©2¼ìˆh¨NMÂM¤WŸV_ÛÓú¿o_a8¡µÛBÐD¨RJ%/8`þ¿rÎ1ñ ‘ã9ë½l˜\ˆ’Qõpíu¨ßoâ$B#H¡¤µ•¡*Žcïj²´0ñÖ­N!¨”ª½ŸÃ.UzKÜ£Ö°¦/>‚úÖœ…:«A¥T§Óåd©¬Ö•’‹…ù¿ö÷ìÿøß#-a=pÅÆnÛÉ®Rpe=ëDP‚HÈ)ã+ë— Ö( @—]vûý>¹ÉJò:Õ#²z½ªâÑ#ÕÏó¤Ê;J QDe(V‹ i<òÞfæ3òQ7¾™t|æ–ÄÃ2K˼—D)¢j4Ñóç^ˆ¢4³8²Ã!B“GÎ&±Z·-4q¹”ã–†®TB¯;]¹¸$êX-U¬ÖK9¢“¨}í³Ÿ”óÅiåËÑh„6› IìC­F‚Ã@.õ@¬ÉÄþúÿðïþ]âbQ±•Û¢´DI¨ú£Õ¨wùôñìÃO†)V]ï‹<3e/óNÀ£¦‹C|A™…_Z¶8_ µ¸Ùš¢lÚÃ+Áµ½ðÀ˜•æð8±iÎ{áñ¶ÒR¥ZK@g¬u•#òÞ÷\~úàá'·_:œL&«Må|´·EI•må2Í’SØD¢é^ÆšÝ;k-©fZ¢uBˆê«¢0ÜÄ(ˆX…÷–¹÷ž³a`&wã0Ó2(gY-¡,ËËËK~—x>5:G²Ñ ŒšIÌ¡'ÅQn§ ~(x,žkˈh[ƒ‡5»ÓÜ”Øl6²Ñ¨b N~^¬èži¿:* œlRèöººÅ[ŸoD5†ØÈ}P­IY_ Dl* !Ì—M»'ÝíÅçÙíD hù)¿Ä Sâ›þWl8 y™…ÛaÇôp8äU£[ ŽÒIêûU-iÏpíP•O{1½`&S¾{Ý^Y•Óéôÿþ?þÏ÷ù'óåê/¿ñý·¾öÎoþær¢÷;‰ƒi9;ˆ/f«Ëç?úôøÿÿ"N«_å¿þ[ï^»v­×é¬×+ïýp8%ƒÍfSmÖm£ŒˆÒ¹½@ˆ]"D‚Z*ª^ "ä7Tb‡M$»gÕ’‰¨]ÿ¤/ôo w#IÍ™ëçŽSjdwÂü¬p)í̲QŒ ›ZÚ’å@ª#‹wJOBÔg#"ð'Doêû‡–E€ªéãà \øngÀõJ5—¡´†–÷ ÏW#FÉ9GŽ ZS8«Ô“÷u ™¯ Èåe=×BˆíÆÐBH$ ¸‘ @&/H) ² Ÿ+X€àÝùŸi¬… ´÷=‰ÒxëÀ“7¶ÜdÞ¯+UX2ª­S}åI6Ï…¯+ ó4ŽÓ$îGY×÷n" ’¥ý<ŠÅ2›öÒØ9“çǨ'³¯R¤c°I×éÈ9Zåj³òišëŽó™N²ÞHã^UD—gÇQôV)¥'›HÐñ’ («õé©Ý鼪dT»åJÏ–]B/ºËÎpêmø©z¨Kîb®äÈS~NØ2Þ—ÎJªTÚ_›²ïm!¤sT‚œÙrïö]áí$9ÑÏÏžÎg:ÖH]2=Š2Þñxu¯6!fcy<§y NçÇ;]W`ç¥EõÄ­>ºO\ØìIOG FsCeõ0±•Æq&+oC˜‚Óðj´>tgÀßqM[H¨öŒˆ›U¾4>hQøÿGº“y³È6…·"!ÑñByبEz!¦ÏNž\?ê qáÊËõe´ŠÕ qƒ÷ž•Qo‹Â•{ïyc3`5¼Q»ÆÃÔ†ŒÇÞ鈵½Øv‡¤‡‹‘?·ÍhElÆ m6›ÕjÅô¨~¿_Te¿ßGÄ,˰ÍàX.$ˆ^GâCÛ¦L5¬? žèÌGðˆØëõ‚„…k0s€N:"1ÖI0 mü£¨rl”¡¨iZÓZs‰š!¾xŽx‰Â²`œp›ìŽ>l¥/|þö/àUä3x>ÚK¢­!ifCR´Êåa%Û ²hÞ .â ¨ù½üÓÿò£Á"b”hæ·÷z½HG?ú£?ú£?û³?ûO~ûý7ÿÕ?½õê«ýKS¬W«ØE ¼éÒoøBÚèàöþîoýú½ù~õ³óþ?ÿóï}ï{ßÿþ÷¯]»—‹Kþ,i”[2"D ÂëÑ×ÉDõ !$ÁVº!°¨d#Ô…­  +|ñ¯µ¾ŸØ§“ˆ\>d—ˆ‚3Mþ Âzp0·QAKQ«Þöa9onđ翾2ï”\OÅš |BRýÛA)„—l²‘óQ²ÖGÓv$ÔØoiÍÕ»¬(= @RJ)$êD;çw(´¤ž·NÈ,†Hgílô½(¢a_ªH—7^ûQzÐ㪪fð¢½Gñh-Ôc%ù-v½BŠ-2€R* %®{µ’²ˆDb½•ƒîŽ¥õb±˜+iÔ•¢›Û [f›))ýÎÎþ„¦—ϵRHëë&æä°!"’B ’Ô¸3¬¡DR…7®2ÙÌlÎ×ËT~šç§Ã¼XôQg¶"zûÊWjeú:ѽXH-A%-ë7¶eĨu°U TgÆy¤”Ìš<´¦„Í<³^°’|L³UE;QÇ{°ÖZ^A…2÷óq5¬NgÇçg/ïíúØ#˜7ýxV•m>Žs5Ƀ_¤öÛÂ_Wº!ùVg³™jæÜEQ”D1ÿvøûl÷ÔZò ÝÈcØ ³Õ®š! µB¤’áãøà“‡jbûGá$!é H,4zð:!$â}À« dÍ*¡¬ñDD 'TÒ #ðÃöOÛ¤¹ÐŽˆZGÐ’MpèÃ_Cb¯°—¨%O(™¤ð·»ËØöŸ‡u“-­(l½D6ì´p,€„óñ£á ܯ‚ˆÝn7 :¡)€ó`FäU&^„¢(Æã1ýÉÿó'ø‡xíÚµßÿýß×¥sQ-Ö««:ÒuÄh*»Ð;³‹ÈºyOld„¦Š]õ7ßüÚ×ÿñï,~çþàþ—ÿíýáøƒü$–e9™LÖ›ÆÚOð–`hGJÉNŠ}XMSF4Ά{l‡ 5!™ˆšmÅ¿`|WC hÍí…7¶E€@DEÎÏøC$ﱎ/·±}þ‚¾\‹¸z3 ÷Ô”ÞA¶'1„7º­,nØ$ˆX:–ØD$pž¼uÖ{Kè¥D´HÀAàÅ eo¨ËÍä=9OQ‚÷eUzo¤H&ä¡v ÌÍ" ¢,dK&¼õ‘Ù‘%=Bn 5óŸˆ$4]Ÿ}üObﮄ׀ˆ"X(I¡AyH=A3˜Ò•ñ ·~põ±6 ;ŸZ¡Ë¨³éô’ ¯QX¿©ª"V"Ï2ªí¥ÕR?²ˆ¢¨ªB@7Æk„Ã*{Ð˨#"Ñóe|"« oMžte¾ÉÞô»ñmã¥1”)ØÌ› ¨HËCgwœØ&?R(I¸Ìz2–dJJ©j#­´q4ÈUo‚ZR$#W¡#ç°ìFRuTùÿSöfÁ–fWyàZ{ú‡3Ýs‡œ³²*«JU%Ui@Ð4ÐvØáv63D¸ý‚ÛÑýâ'<@ÓÁ ¢ÛépÛÝ¥¦²ÀŒ Aš«TU*¥2³r¸™7ïtÆÚÃê‡}þ}ö9÷Þ’´#ãÆÉÿì³ÿ=®oM{-3pªž7zÞ4F¦±¥€ċ‹_l­ ÿXøÿ3o¦$Bç¬èusæ]åc´ÿÇW>Üù9È‘¬Ö9—Ø„[án/ÉÏ»ä‹Lˆ  !"!„” –µuÆ1&Àt§Ègi":ä8A lŽê˜ãu†‰cû`‘ÜÆ5ËnVÍ´#ÞF¦cÝ.»¡u3žíB}‰qUÉvR~ (³pÀ’C!rç\åà‰Åmp"sŽm¬¢›¯ÝþïïÝ@¼X+³Ig–Œq:8éðED\æ¹ËÅqôªpÍÄÕj`úYÏOk7a­`>ÛIXZ RJB@Όֺ*1Ú㬩­ÏŠãEmDÞ4u]ÏÀ‹)ÛÛÛ[[[>ëQY–óùÜRŠ”H$W‚ ‡>¹ŽYdx]±,J¦‚äêW£sÎa¶ŒÕÇ‘’eÀe*ÂÑòκ-A+Ý‚µTU ¢&"Ë­Â2ÔxQUk„Û#VÃ/8 Å 2äÈ´m8 oäö¼K˜mÁdÛ†–,ý^†Ò8ÎëÀˆˆ9°[bíß r-#SúçÖ.¨°_t?·Dä.òÊv†ÈBSiDä(úÝsŽ,)%Yëàæ=éüV ÞgÓéÔ_FŸÍfþ†ô ·1›Í~ó7óæÍ›ÿè'þñåË—“$Ñ\3¢Ää,ELJ2»CÅÄXŽ«›•ŽÉ6 >ÜJó_üG?ù`ïáïþÞ¿yí•—ö~¾Û£<ícŒÖ[[[>ìv»‰R£Ñ(D‹Áx¤r\L´6W€… èZ†¬Õß®{«ƒÆeý‰\e‘LÉØ6Œ/ÞÅ,x!¸Õ€IX2è+`@ >8pN‹‹L Ü]TsÀÑVÙZëÈd’Yk€3ÀÍBG m<=‹9‹ Ç| ¶"¢$B†èœ!K’q.'NÆÂ"˜ŠŠ‹•u±Ž!¢§TD 1„¬ò<Š`ÒG‹äÈüœzžj‘uj%1 CÎXÎ¥RJ0…ÁV‚Í«’‰­1Ý‚ÇL" qëMøvüª¯ °ÖBþív1æ[›Y’=Üêo\zösû÷»_{åíŠ÷ŠAçɹ=ªí<öýyiš¿˜ÓuE‰àGucï¼~é[7Õx¬SYÕúQW©¦aRš¬ËG#b zÐ{âí£Íkw˜ÚÏä›ÿÓ¿»R>…½¿`yξÕÛ}ÓóÇùfÅò»õáæ«Ÿþ/²™.žLzÎñ]®·8Ë+÷PÈ$uÛo{ÿÿÛ»÷µ¿;‚oÒÆ=†×uáØæÙÞß÷ýëØÃ¯öƒ5;dÓ7½û‡¿âèÅ­Íë“qÅ`vçµñ‹_Ú~å6–ÒdeÍ#ÎIj9'p¦Ö¬©• ‰”8I'yžçYŽ ´é$ráƒJM#²„µîAõR‹œ8¤;›8ÒZ“µµ ApÛàmÁ(!Ê€Žqb\¢¹èôÀ€••ŒFäK]Æ3p¥¶ûŽÛdÔs.¥Æ”;I"%ïjmMÐ$ѵ´¾ÚÈà;µÖ!f‚TÍWrû¨°ob,‰©ð’lÝ =õm" ß2[hC Uç"Ùpð ^(KÅ"u‰ÿjy:SóùÜßÈ‚6"˜ïF¨ËOAì «Ö°ãw&H‡ÐêoÂ2Ž¡>‚òøX²Á kÛ˜ Þy‡Å±É¼ÆÞ-%'Šüž‚ $t€"IüZ­8D(4kÄ–ã7 ï‚Ú?¦Ôº …pš ¶ö_mÚJÛn°…-°Mç ­X¨Ñk~…D4NýÕ5½ˆ8›Í¼3Ú¯þê¯ÀÏýÜÏyï­ããcoÛþÎË|>?þ|cô?ý§ÿôwï÷~û·û—ù—¹àEQxO~üˆ8}üð°^°zºOm?>¡|W=l'\Ub'í¬ý`ZN6r²¾s+jl¯€[ S‡Zx[íôÞ®í7\-'9sžÃONŽkí'18«ÎÉS¶xstfÁdCÄÚžñ.a/&Š 6ï?öDÃø},µàYÆŸbŒ9㬮”kdĹ@óè¾örþè0QÉÜiÓotÊЀ¥C$†ª™Ž›öþ¿§‡[¯¿ô®o}=Ù8Ç Ý•ÙC`09÷ÑÏ}þ«›u¥‡Æ: Ì€s 9’íìÃÚ'pŒ9âÂC!Õ³ƒÙlÔ•¬±qscuÚi¤šÌJR ÚÎÒ|råqn›gn|mXÏ$䥸rx8êä½TnoÍû}që —ïÜên\šèlðô[omÜîN cÀY¯#CÚZÎ1íM7ŸøìèµçÜ6å€©Û l_yâv"+n‡ÖZæ¶„||FèJzlNæGÉíƒácó+×ì訙:ÎBpA$Áx£SÓÔu- [$\˜rYªMž ʲĤ)fDbixˆ»Ø0 ÆÇÈ›ñ üt"nŸ&XâǨ*äLb›„å»ÄgÀ8ÕT]K­5@U;22.ˆiËî“¡ÒzÞ±ª"¨u­ÀîXb"'y]L–áÈãÊ…`D­xÆˆÚØ–­o¶ùƒ18`†k/Œ:ëNx«º6:n€"?²-ˆ„¤`B–Ð[ïWì鵇U¨šÒÇ–óÑ$¼Ý1fš‰Gñº®³lq%,tŒ·³a•¿ŽY¨ìV¯¢zœ0NÁ7Œ:TfmªZ¦Î‡EjîÄ?ár]÷?mµ€âkÛ ¢Ë‹®ÍxöqTs…ž.©ÖFžû¿1á %,ÁI!Ê¡‡µ !þ¯ä*lŒ%5çÜ+x{'*¼Å9×ï÷G£c¬×ëù Ƙßú­ßâœÿÔOýTžç[[[=ê÷ûk¾`ß¶ÈDù8*àŒù~åŸýÎïüÎïþoÿú—ÿɈƘ,Ë&“‰uâW!>>ñ¶9ým•¸‚ñÅ5߃á^â*'^½„"X¯ðÆõ…àñ¢j&¤‚U¨[ã´â¦ñ ¸uÝZ-ˆíðµî5ϧ¢cü“0Q ž¬xf?,Bp ‰ç$îdü÷”vΨtÙR6óÍG·¶úŒJÄoˆl×ÚsùB1D–Èz'žŒ?“%YršMÁzJÙ’ל£u,• Ì7†ÕÅËöë_‡Ã;ß#x'ß)Êfê.TÚë=QÁŸonByty|pž§c'Ülžå››vü°2FgÎ9ËÉ¡¶J›ñ£Ís¿þðþse%áLªóGýiuÔã)#þÈ™M` °nfC!ÔÑþã"iùp^¤O=wô•¿ê§i3¦ž¦QÓ4œ7 1]–EQ0C˜È…‹?Ej:瀼i¡%1¡ñ L­ã†îÉè`È­aFs§X… s®¿}Óš¼.UY7h¥H€!›6UÂÄ€5EfË.—UoðHæÎ20;³ÉÐÌûI·`É„ au>}a˜«àöÔã¡ñàóìÆ“OuŒ”ñrœ\¦Õú+C9 Àa?¯޵å^o-ßtø™¾°•xüîQŒ¸ÿáö³1ÆZDüä'?ùòË/ÿüÏÿ|¿ß?<<ÜØØˆ½¿«"¥œN§[[[£ÑH)…Dÿðüƒßøßøô§?ýƒ?øƒ¾Zën· m6èSÛ9KÆ6àÚ¦zðŽOS¼'O>|ƒŸœ|òÆÿ=½~ 68çØj†ÂóGKË–ãî…d'&hØÛU`[óåÔ KX>ЪȾ^áÌöC'9ç¡U˜9dŒ0Ù°18ƒ TV·i!ɾmIÞ¤¦ f‡1F¢@ë´6šqR$&šî„š‘’¬Ã‡Ý+ÊñÑȧïÔºŠ!2Á¡ß³Ir0]½x}oZܵP?ç–wŽîßy±Ÿ]n¿ZM$¦‡JðùñåA‡5õ{Z²Æ€BŽÀ1ޤ9q$§Ãþ¿òÔ½—>{>Í÷H._ÅÖã½­þ•#Hw©z M—#…iႤô¦LT*¥6´7'=¡f<‘XÿpáÂ;w®]»6NµÑHð³?ý3¿ó¿ÿÞ /¼pùòå¢(|t”ÉdÏÀÚj~Û­±Gk*ߓ׵ÍëÖ÷µvàÄ’ÞÛÈ'ku5O¯ÚñËçµVœsC.V\…·ŸÜ´'ßµ6-'w":»~Kðä<9cký_ÂY=ùN–/toÁ1CÜg"X±^}Û-q²‚+/r•‚:*ši'a6Ð õÜIÉkœµÖY"UÏÐõŒîRs¾Úãûc~$¹róòk>Ë/ȸui1MµÄɸ3N7ÊѼ;<غ|À?¼Ä†¼~zñ‰‡Îâ|š“í 9OØì]øòøÁã7þúÝÙÆÑ?Zz: IDATÕ§ï_||ïÆ×»÷ò ùöÃxíYë›#Žéˆ”p wœÑ‚¥¥(u"úÙ¼-1Û' Þ_\ƒ%j¯ÃÆè‹‘~c¶€1<ªB°~ç\cj¦*̼ï­WVCK¼$í |CL>„ă>t;þLÑU%×^‹[w'¥TZà ‰ÈÛ’ã.-dTÂC¯Œõc ÆÚ c ÓNDâD®ò5±öð hè©Å¹u›ßâ€Þ.0 qYû-"VUå @EQÌf³O|âçÏŸ¿~ýºŸØÃÃCÎù¹sç|ˆ›ïª“¾þñññÕ«WïÝ»ç§ln ½þÅ‹ÿìÏþìGôG½K‡¿ù_’Ž[xƒ—†Á®aUømÜÎÉ–Oò7ø]ª ×þ tæO­³Ytpν 0œ÷ðêxOÆ]=KµëV™Åðº°=XTNoÚ3urŸä$Îb׿a­Äƒ OpÁ¬è>_Ýþ©¯H“QN2©¬VœånÃ9÷J†B©\ŠÔ6|6±O~ào.ûºHfS½w¿·ÿ 2×6ºOØúnå Ç”ó&K±ßë¡5ïý°¹ý²¹ýò³ÃË7ŸÿÞ#†úð^ßi)òƒÉ¨GУP¨¼wHÎh2Ö9ä8g³DYøfÿ~¶3UWž½5xíÒ·'óîîÝìò#ÇÉèLj´@dÒœoöYžUÏ>3ÎÒÙý»rRu3¹¼†GmæS"²È9q)%¦i·ÛÍUÒä®Ö‰¨ëšS#¼=-·HmjP¸6 øà±Æøsë1Ưý|VK¦8Ë2΄³ÔTÓ²š?ºùÑÇž{pîú½¼˜tY9Oî’+¿naèh dÑÙ|f£{OÜúê›-ì¿ã#åæ•ýÎPÍ&[ZÛîæ¤ß›+1Ó…9ºÛc{‚w²Íý,5[ïUFÆ; l)„tÄZ›,‘”NJ’Eµ1a£ˆ ÖÚ$É<øñ6¢!´žl'itŒÁ¬5—D‰Ñ7(CcÁÈ¡‹é#“°6ÊXš¦ D‰n­i­¥P>­[õ·zƒƒw²@<ñÑ¥V£¸€sd€ „°ÖVUsRÐÓ}­[ì ×: ļçDDö*€­­= øR¥bQ脵~møks…­&ü$ó§Qp_¶YGYXàµ=I«þ;ÞÍg=J’äÑ£GŸúÔ§þÅ¿øu]ïïïw»Ý¢(æóyÈïô]¿mŽŽŽòò‘\½zÕ‡¶ÞÜÜdm@ÐS§èÔ0éTŽäÔ¦Þ!N-¸*¯!ôwØgÕ£¼ã‚%"Åý?µóoHtZÁÈVAë ¦ú¬Î‡ÃÑÉ}ƒF¾“²Üü¸|‚á«ï˜[ ¿i ±$kTÇÉ$©*Sé6WÑ‚³– \9‡“q¹{ÿõϽ+•Õ¹óû×®›sÏ›oeG·îTsÇs¦µàÀX«9Ï{Ý¡TéçþèMîn×uóØ“:·÷îfÊ]/í+³©Úº2“I:ï¨ÞëuýÍ£²È¬1`9×vrÎU…drR•]íöwo\|ú7>÷ï?xéÉÏÜüÖ3‡öñ·ï9¦tqØ Xé´ËwîþÈO}f6Ÿô:ÍîÍòËŸ¿ºÿY·Æfã#åGm™@¡˜RÎp8ìÙÜt¡j”¤YÚiœée½­¤Ïk ƒ¦²íŽ6vh­k]5M“æÉÁÁÁÕÞ•£ãC£1K©PÂ$oØXË xfì%yñµ½½gw®5;çÆw^ÌÊñ¼a\çXyÎ Aˆ=µµÝy3ÙüƫɕMmo½rñ©§Í|p¿H¿¯ÆG¼¾¾såO¸ÈÇ›Á¸lr¼qéú=ÁØÞ]E­b¶ð¸æƒŒ£)(µq¡Ú«Ô6É@™©EkÀ€ÓÎ9gÈ E2ÆL!˜µ‹HRò¦i¬^Leìz6ÙIÝ#o“ ³Öí(p*’R”Ø'O;>¤×‘QÕɺHÌ£D’%¹]cŒWZo¸Fj ýÙfmì\ˆ(µòkL³TÔµæ\HÉœsÎp˜/¼ÜÛ˜vެ6 ZµA˜ð.W(bæ±vu€{±€ÈµTƒ€h´.ò€ó^ik:ŮЩÏÂI»±±à«(âõŠ—,n*LˆÏ<ø™¶ óÿç«ñC˜@"t€àsØ9KŽÌÂ1­®ë$I>ö±½ç=ïÉó766Bà4Úº2Õ>okX`íLçœóWös€Ðô`«ßÿÞw¼ãO?õ©ô“ÿ¬ö{ŒA]—œËv¥–^BÎ9ALÜg0@Æ¢“´”ü¾-¢øÌEÛ2zâi<Bì‹¶’ à´@€g\›qÎ"ø ’Î;brdDä34-T;Æ€sV†í` ø"¥v:æq! ´ÑÄÓènÞÑ"a‡`q^ÙjzÁönôã·.éúH•0Æ<ßÁ–†+¹`Lã$„XUï0)¤³§ûLð¨ûñÈÓNiÓÔYÖEâRfÚd ÒjÖˆïæ[d jëP Õ½÷³ŒëÃæÎ‡F‡/¾ûCŸ{ÓSÏ¿þÍ ”º‘nv†’Ê‹ûÇŸßܺ8w =4ÇÛ3É91_ÀÎìQóÔ•§¿ù…K“Áç’ÙûoÞxéÜã;o~÷7o}QqHžûè·*½?gW¬ÓÐû‰œIö¬ÕB«×ˆÖp›Ø¦Þ)ö³ùý‡üo~ßN/ÞþæVÞÃr¦’#Æj×Ln_éÖÛõkýííÃ鯿“.½ðúß~ü£óþëH ¸—eÁc b"v„2áà|ÿb %étqÂ=÷g-ZÆÔ:ét<)aí% oýõKxtt4ŸÏëº ~Í'¨Ò) 2ú<¹-4ÇÀæ 5·—;Ãû ^›M Ã$Í“ºæöUꀹ$I•øÔôÆš1á,E!#²Brëdf6-ÉñN§§kQUóél쨗eIQ7kÃ('2Ù4ã¢2Öº¬“u¶Ä‹iA\© Ä%çç,HfžÜ{ºoȺÕ‹ƒÑƶ©•ÿü¢CSþRP½ó0"Öu(~ðafQò"Ï8९ãMïAø­­É.Jœ¾FãCØshï¹®U"*ŠÂFW«©T_­‰ÿzŽá$Ú…Y¢H ððæÞ¶i0|;±µ;0.D;C­Á[5<Ç$/V-®áE9çýèbî*04A÷h¨¯âr„v°¥¸¾ý¢ ‚…·&„˜N§/½ôÒßÿû?ôódY£›Q Yô|‚“ÅXóÁïû¾ý»¿[e­›Æšœ!EμÔþ[¼—GÖëØÎ g8gÁjÌç¶Ûö¬qµíc,¿®úèÅÅ}wšx 3® ù[ä;gR\Ä›Í9gÉYgœÿÞP ;Wý3˜#\8¨P«¬Æ3Ñ‹H·m£ËþÛe2cˆŽ±Ó»´b¼w´ê«5ÕTè|S7pÅ9G)™R ·Ö6 — ¼E˾µ3ˆÉ¸ÌzBòã£I¦p'ƒ!?xtáòÓºÄb¦Bä2%ÓÆ'xQ©RQÍÇû;YJ*%¡.ÉœŠùKzýÝe'¾ª“/634å–ê7‚_£é…º¼;wɲ`ùÞÞë|ñ/νå{_{á‡ÿãÑ­'ïÜ\yüù çÖsĉ˜s€³¦L­–NG[Ú½W]{öM‰èîÅWÔÎv9SÅ9ç)„d½Î¥f¸[¼ü¶ºÞxP¸{»½ùñáû~`÷™÷ýÉ^|ºMÜžYð)&pl@¡CyžK‘pÄVîðù{ÀñMMO_êºö¡!¼Ï‚Âß èdd:5¶ÑnÌP9[;ƒ’  rÃëwd69¸?œumsÕ©‘ƒ$I8ÇN'kš‰s€œã—Ðëu´©@”@ª?H™sÖ€Á…v4I¤ÑÌØš1N‘Ífù—@)…<±]FŽ@)ÕeÒ‡”sm`a :4FÞìIy¸¸™eÂÃgLs‰(Ž¢-!ï$å"›¨§æ„.Ôqm¼b+8\Gf­ƒ1´>ÕÞEÖk§=9XDfŒˆü¥ ¸ÄÀJ°¡®ýumfª1R‘#±ÿVµÎVDä/¹²6(t¬oÁÖÚíc;Äζÿæ-ÖïñJxœUUö%´àœcÃ5;yX *zß“^¾tBP£Uæ)æNB›^KÄDÖZʃ÷@˜4ÿÁÒÒ`‘æÜO¯W{üÕ_ýÕîîîÕ«W½+À©„,’N–ðÝþŽXrñÜ3ÏŽïܹó¦gŸQYZ55gb‘Àk&–bØ¥q5ZG<ׄõðó3€a ü‘Úó ê¿ñµŸSªŸÀ‹+ãK4b gä×ÀáòpruìJ~§vɇ•ö;  ä Iˆ9‹<ÆÖžÞOÎØ­WÑþºÔÚiÎè…z­«3 b®RŒtfËËA8¬k;›ÍØ|žÛ.c 8wÚ!b¬ôtíHü_Ñ¿«ÝLb/•ýnšÔEÝ4 p8ÚÓJ0ÁQ¦`F(%㜛Ùtoòd”¦R&Š¥»š¢žIlLÃûýLƒ™§IÊ»­zrn¸5Ú;,ÈéA~w°SSýL‚—­Ú?¼óÔÖ¥QY4_üÓ÷ØfžàE&wŸßï¥DçAIg©a€‚¶;—G"¹¬Ô_øü·ïåÙ㜣«©,Ì|V#b§ÓACÓq㯛Ín LíüÊÝWñÃ?àú}rÎ!-NìZk3­÷jš¦h SiÑét8“µÕÚ-¢@´ÎË€G>@D¸ÀêCzêï8Dlš¢®2K”dûY‡ë:3u7WùðÜÁæ|>îÝÛ,ê G×ïlîJÝ­MMàæó¹µz>Ÿ6Mƒ9œ;óù¼¿±A ¥Ä¦˜sá¨æÆ€ ĬµŒ!hL¬–<Þ MÓ$̨ª*1ÉB!Ë7üØY'„@%¤ä‚!šVü£OøIX»Üéÿ†àñ 6²ÇÚK·¬Ê’Ux7«Eò;·ˆŸ%¢|ˆ~!(ËâÏá Äp~’<Å„>nZÇìРÿmÓlÏ„yy=XÓ]§%Ö!Ç2Z8á.º&$ðyÔê |?Lïu;Xk™XÜà ²ò&i1êø¡kN„'áo¼|1/ÂZoð "x]BXÙ¸°È«.:)¸ÊŠGU7ã}¨g²×Ã<Ý1…°p4®ïLŽÞl,Ì:Çœe}ÊNV7U¿ŸOæJ»×ÏÏ5Í•ÑdÌd6L. {ÛçWz>ÓY.:©i5V–&Œï%ÒJ5A÷ˆÉqQöœs,\I6ŸµÖ€q É˜º®gn6©&ºô¹\p!¸hmL›CCG¶Ã[žˆ.^¼xxxèãæøû‹ÞVÇeé¨+Ë»¥Óª<>'䡼ð×ßÒò×_9¿ÿH¥Ý ÃnUJmfâÍÖ»+éeÆl$Ñíöݬ,‹z0D)ež§M¡µ©]ã€XžwuU5®ª*M;Y–5†Ç²EÀŒ 4uQ™Ôç»Y-êñÌv:Ï€x‘+ŸblE³çZ-«”Ëk|. »¨„ Øú»ÈÆã?„ë+!)¡ÿ Ç¥Ø!U›6ØðÞÑpÂêBn…ƒÄN(²ìjöé“% '–üHÃéò­ÿ"aÅÃÇöf°ˆR\„üéjüŠ¥þ¿­/ú2Õ’‘çW|>¨ Î9K&¸ݶ6ZŒÂLªgÖ6¬© ÂÒ‡Ù V¿B­Ï9´rŠü,Â0!J‰AD–L¼£¢—´Y7N¿ño|èCF;;;~|gN­°EÛ=Ÿ^ÒNçøøøÉ'ŸüòW¿Â‘õ{]@ÉEX”Ð>¶¡äOäɶø×w~ØB§ÖMñOÎxv†d|Vûg•xný¡óy2ê² ÌÍÚâ'áçì „?ý9[ÛŒ3ΑakÓå«Éf–ý\=˜¡?Aõ?$"~¯úl†ó˜1W uj4ιº®ë¸1 Q)Å“.³+§>üpí­¡Û‡ÿW7}<çF)‡d¸‘ÈôáÞÞýnòlãÆEñºƒ¹JT®†d;¦N°xsB—³Aqù±½lëøðÁ ™nYL9Ú¬7©gÇZ»ÍKt|œïzõêÕë·oo™ÉÕs•ç/—îq³Ùß!×0Ö «GE1ët6o?ýæÃ^÷âlœ“ã(5$ µuZ8TjþàᲚȤ˜»ÝÞÎ¥þðxþ:gݲMæ·ZðŒLWëḔÙh6.%^áäÎ_íÕ³£ÇCþiêðÎ(Ä0ëeW×um5 ­u¢ç\àHŒ-"B4«þ„r¦Ó©sn8æyîi¢÷!¹1Å\Ö”ùx¯Ÿ‰­'Þ||áùo=xýÜÁîöÁî¶¶À{gKgI‚Òå’kKR•Èn· äUŽM/I¶··³¬SWº>š:›t;J眮kg¹@LÓL©´®µqËÍóìe5VX—"Àl6KR”Rv^»ÈjÄ5†­Qg­³V7B%™[ wh(µÞÂaCÇè(¾/^ 6æÀ bí/DyZB”H'à«@Lzس«AaU~ƒÂ–™é³ø@½ªƒ"󧻿®æßEZú'B—‚M7 ?m@2ÏOxgûù|î#ÙÕ¨#µ®“äAºà:âñ b†b' Õ% ‹»†÷žµZ ªó^v™Vk%´¶ E7ÓÂóbVú(ÐÆ˜û÷ïsν¡Áß= =<ƒCAÄ3u²g™¥g»Ýîh4:>ZSÜ1®­±Œ ŽhÁ H.«N¾ØS*­ŠÉáA-UOuªšÏê’çé°ÛíÎf0Øëž;¼óüFw«3˜+òs»ƒóûãÝ×äŒ]ÆEfäÅMë3¬µ®©ÖZsLÄt:ÅgŒ)¥$€À¤LUQµUWÚÜÜäœEñ±}Ì ‘UUuúÓ”‰ê›*qMñÂ÷tí¼vÿõ?ü÷¯iXó"1eñ¡s”°,·³Ùó¾šM«sãæž’ðÉOÞ´)hMúƒ©ù&1ü£ÿó¥ äêÜÔÜç®ùÓ?üÖT “Ž=¬ïë~ò㊉ìT"Åx/aÇ“™+{ógÿì?ØýbÂÊJ‹TQ›‘wEùé ¶ž´Ab㜰@”}Ëás8Ð2•CB¾šqZ]¨§Å‹eÁÇ LÓÔ s>©{pÔ >ÆØj›}"‡ NÇHÏÌ"Ã'k“ÔždáaU¤RÆ˜× P+ö±Ö‰Ìß÷ Ò‰W‡Ì¡¬it!bŒXÉ9&ß~zÍ"#ÞÂÑÌCµW¯Á¹¯Së*¬BX,Æ ºâ0 P!‚–Ðíе¼€ëq‡ÃBE/t×±Ön"-l|KnÏ¥DMÓ\ºt鳟ýìOþäOÑÇC³kloˆŽt˜ÉïHýèè0ÏsäìŸøÄáþÁÁÁB0^›å½ðxªcÉ VaøÔb£PI¸*ež^¨BûgJØgðYœŠsæŒç+Œ&kƒ¤Z­]pôk7F8§¼ñìXÙ§öÑ’{‹+è3§Üãûùä~àgõ'ª|Ñã¿þ«ƒÙñVÞ»páú}ß÷\üƒ?P“­9¯+$¨³XÃS÷Éñþv’Ì/?uç¿ü±­þð^9J_?(ÝôÚåw<Ø¿¿õòW6^ü‚=:_¸:y×ûÝ3ÏãN¿šÛwïvÿæ/ùî«üу/Zõ%ÖS‰¼•vŒ=üOôâÁQ"Uʧ¶/~õmïTÏ~舳­¿ý÷µÏÈj4ÒÉn]]7³ÉÖÅéGþNï¹ï“ÓQýgŸ8ºùÚ|vüñQyŽh.êÊžJÁêªH’¤)Œzþð ùËOï6Ö¨¤ãL‚jV»bC\?ýöÞ¨ç>û©wÿð_¨Ù«   cŒÀB`NÅV{ýÍü`Ô—øá¾¾9ìÚÙ—!ÏÞõî BN“wq¦÷ö·m£‹nþ\š¬JØì}ェԖ™õ UÅ´ƒˆe£º?ñï×wx¿Î\Ùpiu\9P£ë¸?Ž–\ °1e±*¦Vk˜±Æá.;@Ì;²y0ó‘¹´ÖÞ™‹"¿-hQÓƒŸ×A&kWhèmüN=-¸*žzÜŠebÖF_ñ̵ÎÏ6Š•}ê{C³k”Wc’œ¤ÑA×âÚ›Z1[Ö«ÖÕZ,$Q½f/è‡C— 2ÔuOT˜Ÿ “ïÅÚfƒHúÃ9¯šòäHÀ_oó™Ž~åW~åé§ŸžL&ÞW &‘ØšÃO¶CDß-Ë~§)«·¼ðÂSO=õÏÿù?ßè¬ÖBˆÆ¸xK/ NGß3µÍË»F¦¿-r§uÎðþ:«?p†dl( ôˆÈ`%Fz¨8æeÞP¼¡bmÑ5KàçÙžÑvRY€ˆ’,¾;Ã&mi…áX¶³ê-Úäe¦Eӈᓗ’Ý—ì^^)­rGÍ·_Ùø‰èïÛbkrø>qç›{¼¹Vo}¾ÿ&­n ™]ÚRç~€;‡ ¸4âá—¡™A²]mw{çß–%ï=¢ŽÍ;¾Cß{—Ãû|Ÿáý±iùàâùí+úø™Ýÿz2Ï·¿÷m9¹¢Î¾&ñCBO@ݶGƒÝ¯lWôÒ¥A–^>ßæÒT0>a\7)ÑQŠ•ÅLÉ\qªf·¤üW?ò#ÄŽµ©•Ú®š›ï™GÏoôÇÝüµ÷¼wûÜ¥ÁtOÙâÆÑË«¼oÿâ3_zÓ;†ÅñU'šÞ¥{Î¥D­¶Ð@G‹ˆq\¤i*X*Æó±l$ç˜g<Í`JfRÏdeUz"Øétºn]×MCišú&Ž•RŸùÌgʲ̲¬*çiv™£röä3·Ÿ~âmÿæÿ¸ùpòŸMÆRåi'ß<Ú?ÈReõ!=bõ¶«ê~2Õ»o}WÿO>åœVâVbÞrþ¹ÙßþõÃÿï¿.s£øõ‡Å½½÷àßβ¯mäö¯?Ç^zí+¿ÿÿÔ›éV  ñ67®ŸW³ûo_û㇣ºV¦ÒL«i“ëÁ ŽØ["9çÞI*æœÓZž/d£pP,3Ø6ȳOrÀÚH&Á KAŒ<ú&"qÎI®¼>Ù7î?(¥¼Ú4“Hoyåœ[íb3pøli©»†3\›:¢;¯u]ûšÞ”Ø‚²,ðÀ‡QÄ+ö}ö¶êÉdDù€p>®HQ*M| Á$ìáÊjTǾÃu]Ïçs&žYÁç+MÓn·[Î ÿß@Œœ_Íø!Eê²5 DZÏN³Ð9óŲz{¿ßgŒùÜ á-¹=ç$WôP$dûØÚÐ*?¿Â€ÇãóçÏO§Ó[·n=|øP)utt$ΰžÚy@fH0î³J xpÿþk7nþ³ÿñÊóîý½Á`¸¢æ d=h¿âqŰ-Ë%8ͦN ñ;ˆ-ÃËKDZë”ËS‡ ÀqçÌ0@ TkLRèDŠ+hlˆ­ÎQøŸ»¸pïܧæDϽÉËNøym!8oBä$ݸó´jÁ É’V ÚÑnáHïëøƒ¬µ¸"¨à Ÿ¬µÏ\q7¯†ÃËŸù‘?ö§ª¤˜'böt•;o˜Jò¢2‡c.Ku倦R&ü¯ÿêsŽsĬýªM&E]Íœ6Ýn×¢*jÓœã}§s„œ16"°}tCÃo1üKrÒ†ˆR²Ï[ýûJnÏû9®0eäœý_5)k-€¼2zŽÈ%Û$›58{/ìj"ö¼a·“è£V IDAT¹hý-˜L¦%—U]‚¨Ì'‡ù»Æói&êÙÏî ºâKºJ•€L'C–½ª’lV‘Õ ¥DG`åŒ90Î:Ru"å´ƒ¨›Ù b`ì‘ÐZëJc ºj..TU%ªª"ð®§~!=xkœ¿:è‡~hssÓ9'¥äŒŽ&3‘ŽÑL^xëõÍáø£O”%Br¥QŠ»¦îÔ“w8mªúμyKÊe¯—ÊþÎ¥£çž;þï~¦yt÷šؾO>¹WMÞta˜Y¬lñX÷üðúßü™ráöí·Ñ|çñ§>ûÜÓfúàÉŸý‡)‘  "Z¦$æÙ/ÿÔOÿ½ïß=èñÉÜåj‘jÛÅ»žzlð ÃÚk0€‡ƒMÑ&Wð§Ñ‹eAÊ9÷•tx½4ãoôÎË™?¥WüuRÎ91ò‰áR™"bª2/ûú$Áþ.s6M¸Ö‚­¶ÖÁ×Xúƒ1fZçö˜c%"ß¾à‚€êºöxcÿ-µpY–UQǪÝpªÛízÒÙ4¿;4ËF«­ñûðƒüà¿ü—ÿr0v{½²,çÅ”VïÆpÊ{W/á¿k¦úP ¹SØEÙÕ0Ò¸p·¬¶Ò³î¹âr“Ç}¶Q`çx\^ˆy)Û&ˆŒA7€q¸«@hÈ)¾T·¸âýIºU[ÕGE˜æ¸ÿ''Ù?ÉÔò:F*76y”7Ì×ilzî»íç3‹¬\ÁXÃÚh';@D\q3-Š~ûê¶8ºáuêĈÔ’pZ!šæY߯„pÆ4Œ©ù¬æÌú \ ìq"22Ip!-éÚU @Ñ—…q3[‡­Du›ÌˇYúÆÓÍ"I"ØnOÏ'½ªq,=fŒÙrlÍå>a®ka42NBi ¶*¨œ³nŸÇ8ŒÚÇÄ ’¡5ÊT pŽum³d£²7\,›kƒÞE[ÃôV]²4‘L°¢ª›FÝ0+Çì°™¡ÐR.ÜEÉX€–ªj[ئnxÓÔÓù\Us›"G³Ù¬)½>šÕ’Œ!­µkš†ÀƒÀâCH=ë¢'“Éææf–e^D(fórjúr;å;½Éþþ«á&Â=7½ÒÌ.;2v..^dÏ<!¹ôÉ¿þýŽö.v»óª¡ÃuíMÃ,n<õÖÑþ~oüð-Šm5MÝôæGûóÇž}„´ÕñsïùòþQöàöù ÓÈÃÅÁl ž²3Ášº!à®<Ï%IÌÚ²i–¾0AvÎùøS½Ä$¼,˵TÓ cłϋm6$h=f³,ãŒ;rþ³(ÍTÌ–ÉÛÛb] úXŸ.0>x‹ãðöÙüX¹ DE@‚¥G®cÛX˜ÞÈ3"~P¶ ÌœÆÃqõ÷¤Ã §U?#h†„SžºYkÁ,]¢Â¨Ñ4šE‘;=ÛîãTø -o”çy·ÛíæßÛªªûÏ*;ÍÞ¶B8ìòa¬{ìö;“ÉÄ9—eY–-¸"lµÁþðV}Ç í`äÎs°tÎ ÆE"’\ ßòp8¼uëÖÖÖVÈ|²à Ùwñœ1b qU3y²tû½ét:ˆh{{»,ëÑh4¶w6×LƒÊZðbyšˆÐ.M 1"Òj€ñئ• ݈ß÷ªý¹†WàŒ;ImÖš]‚k¡çta€ý‚Æó­û$Ç+é#QpdÎ9f-°õ¨àþ½¬«ÃÛ»¾h³b«ýwÁS¬e1œ#‡‹0 á¼,A‹áI˜pÎ9™¥V&Ê“ËJ£›Nž{"`ª*ãý4ÄK´§ï+ÃMiçei$*Ƥ©S pÙã@–LE`”Ö¡‘21Ö)Ña˜h­CžpKu5Γ\p‘k’ª1<Ñ îÊ…í™qM@Dœ¡B`“C•d”'¶©·‰ªlc*…3(&˜u뺮‹yV–ç€e‡Û×FåQïÔþ'©ÀM¤ùœ©’óŒa.É–Kû Y£ySÛ~¯¨›ÊdIÊ Ý—¿ùŠÊ3kæY*ËÙ™”!X»UD’¡Ph8SsÌYš:qxxˆ“$‘2 °a›¦vx—ç9ÍçsL³Ùlccc4-X-÷»9ç¶ife=Ê{o}ß¹)Üèu¿Öhše5½ò…O_;¾-wŒ¼9»—UåLJÖÙÐMÕûÖWÏ?÷=úú÷~>uÃ${âá×ß)1ëí”àrçÌÑý·î¥o=÷ì_=÷þ;uÑÌFoÿÆ—Îu‡™Ü)'Y8¢ž@ûþ8‹œ¬J„Ï3XÌ ®DøDí5ž€myÊxÇcç\ª²°•=„ÜD±i0ìæ5r:VT¥:ƒ΂è´9š<ÌXéϵ}nã¨ÐÆÉ rC@A8A9çnüè°Ëü0½xê‡ãØmˆÌÅ9÷¢R€"ãXô ØëKµfŒ$¤0Q¬õy ݶÚÈô®¿ŒD‘ÂÜöëâ;æ/Gyí´/„Iˆ—&Ö”@$¹B{à ½Ê!•Þá_´aàü–H’¤ªª²,© Ʋ˜kZJ¨1#è½n‚¾=ÐúTe»»»—/_.Ëò¹çž+ŠâÚµkJ©à½VÎòªgˆÀ9€•›Öke<×u=®]»ƒÁ`2>ýôÓÞ?€ƒœ $<_{‹ÿo8G´šSë, ˜" ¶& c ØuwúP"è ltk.¼‚ˆ¼¤P0L b8ìþ¿kŒ‘Ü`›Ú¸L¶â¯On‡Ž¬3Æ`Y/î*P³@î€cÞ +>G¾xÕth$ô¤it ñ|Z϶´`øØ £¯N\BS³r¦².bÊÎc–\Ó4™ÈOÝWÆl0Å”4Ý´ÏQ–uà i£g Ie  ‚` &³j ¢‘’¨9HÉûT›þÕ?kŠÕÛBåšuÁŠNª.ƒ­‰`à„àÄÈ1T{Ž×BßÙ¬š‰Âr[u•(­-}ÀÔ¸;´Æv¦“äèÁµ^gïØð·n¬uÂADâjS: (D£«Äõ«ÍŒÕFÖ&Îq‘Ÿ'I’ç9¤iêÃ`1ÆîßïníÔv V½öuôïÙ›\,Šà.LKJ ÓÇž>OÌŸÿêÂÛÛz=9G‰¼P †Íö£›nþÍ©,ßÜX×Ë/|®¬z¼yÖЋ\ž¿w,¿r½?°EÙÔóÇÇcwé±b2³6Ð`,1Æ*[g²bÜ0¥”†KÙëååt¤µtÁâÓívxǺVoÂ$¢$I(†ÍêÏg@8çœc ³™WqCKŽÅQÞ_çœ Yƒˆyèò8bg?ºº®ëº¶d (¢EŒåeê¤@\”T Á‘ʼnmt㕽>"¿µÖº(Š–~ìY–LÅV•$`Ïœ±è~‘Ÿ Oˆ}¢'×Ú1À–{bŠï/4¡¹®ë²,½9*jímžñìs8ú©mM Ù©‚ýš²Õ€Ó7îMœó$I/"oäyže™ïUc¯êv»>à—µ6‘iLj«lði¡­µÝN×DZQJ=öØc7nܸ~ýºg¼N%p¸*Ø-iîBÆÖ…h¥þÉÂ9 ¯¼òÊ /¼0™LîGí¹ÃXƒÈKqMxum6ë°ˆ1ÂF6L\Añ¸“ñŽõ{À3pøB/Çè ­bÌ%´'Ô°ÖU­ªÊƒCØñßÀyxþÉ“G]í[0pRp![°’Ð2KÀ8Gléï_$å)*hDd¸ˆÃ'¶¼qî+û¹å°¼ËOˆŠUøÖãANàEXdÚˆ±_$B:œÏsw7ˆ ¾Æ„’ò«èfޯݜœ¨j›ô¤P*MúƲ†È!ÎÎüîØzì¨`9‚é®­¤›¾`æJ× —˜ä2égÎ)g˜%²Æ:αUóWF»áàÊhtllÑX•²¢6®Õ†IQ¡™Ù¬jnªÔ“¤ÇbpÕ ÞNa~ºê Bª@ÙOòN­gpyÚµR;#ê²R*M3”pF6 åòMÎ̻݆‹ÙÖN×Xb¢¬›G¦ÚŠöÞ‚§cŒÍçs VŠ. šÔF]Š ÅUžçœ#c‹™dŒwÄõë]…§Ë^ ðÐâ ôR ®CÎSõœ17î›ÂÔÎôÒŒ ûÃÆì”ó#WÓLnn¼Y@Éû“ùqǪšñ©Äâ·ÃES•˜lLÕṜ.høRw8;´sÅ/Ú™(§6Ýl†ƒ)—T¡9Ó Ýl{uo!b‚°ÖŽÇã¼n ‰XUUcÉ–H³vM¸tÎ!²pC×S|ÿ•÷ D'³ÂùñÇÛ¿ÑKG}?½ôÙØÆã Î9Ï’…nÜÓzцãiVJ’1ÆÀ­Èš¡cÁV—€gÞŒêʹк†úIXË˲¬*j»¾âæ'0„ðÜ¿dÙ@Ê=,Å4ô'HÌ¡{¾&&Qÿó`+ PÞ°@þbUy,½ &µõÛÏ|QÌôÄ]õŠ|߰ܧB×bºh©ðKf­ÕõÑÎÎNY–ιw¾ó¿þë¿þc?öcRJŸ|ðd‰eÇx˜ˆТ/ù˜…ÖîÔv¬µ_üâèGþŽ_µÍÍÍ££#dKMFØá'<Šë´fUuQ¤ô˜7]ã\á"Úf¯=k˰q±Î#n-Þ3ñ„C¤ˆWpÝ{Ù?÷wùlëóo£¤Xžw ]åm蕘ÏXv;HÞÎwµuþp‚ˆÜ"Ââq¾´yÇ[ W}©BŸ-˜0]ñbnY-ð1à(?øHœŒ1ë*Œ|6éYÛ'až¹âum´FÄ̧tEILèÓ»ºšK1’üQ–§¶Ék#•Py1?6Æ0b’§ŒIœQ–™NiÑq¡Î:Fe–ˆù£Îƈùx6ŸŽ¹!mC÷s5´VqÞÞ+V‰Æôà®vrper<ƒoȼ‡õ÷ö%Wu±“JVÒ®FR¡1ε|G1%vöS•“¡™w [[Y֝ЩsÐéqìϦZjWóÍfŽ6!%²¨+>ÏމÃÌ=)…_,KµŸRªÐEÝ̨i´iÐÕºƒÁ@2™ecC#…´Öê²ÔÖ­0Eéh²,óâ¯ç"µÖ½Ës#ˆ; e6¼{éÊ•|Kn½”ÕïÿæW_¿Ù©ßrþÜÉ[@²šw.æÄ.w»Ûiïøp¯¼p¡9ÿø—¯>>-ŠbtøÔ«_{lôàmBé¬ûÑÿOÙ›ÆØ–_õbký‡=ž¹¦[u‡¾÷vßnw·ml6`›Ñƒˆ@F E(ðáå!ñD>ñ• H‘xIL<à0æÂàlw·iO=Üy¾5œ:u¦=ý‡•ëì]»êÞö[¥RÕ9ûì³÷XÃo­õ[÷ 3£ÑŽzæâ£KïøêíÛ[Wo<=Ÿi-ãÑÆƒƒÝÍFø6¦x‰¨°È‹˜ÈÓ:NV½¤;=Üo u¬9ôùÑÒdÒ`ö¨¼÷U±¢|ãÃp•Ë Z†Ú–f#žšíá½gŸÝD_s61Øë±&yÉNæ.Š¢Ü?At‚/·qý‰ÈÙÖˆMƒaðäµ×¤Ô1¶Áàór¹äžwrjü¼FÁ‡a¨åŠr«q»ù)–Ë%k\¬‘–YœPuG&VÌXÇÛøYO‚mf4â†êt0¾g: š§d… ø¼æZÜÝpÒº¯ÅbÝojUêë°c$l5>'*³mÁ‰¦ëAxBòÕ8D{ùU»?ÙݤÙMß^³ð$Äp|åæ·òîDRXs~³¼º óµŸ¼zDîâPšãïí]/ž0†VêÔþj6|ÚãÃØ¼ Š¢€<ïÀ Š"‡îíÊÞý­½ žKµ§Ô<³"ñ~;Š:’v­µU®»ÛfòZç¾ëòÙ9ra¹ìy§…š÷ó§ž÷®|ãÆëý3ïØÚØËåîb1tÙƒRI €¤sFHÑéêÁH÷×_ÿÜÓÜsøÂðlç+ÿôž½ñrtñ1G?o|qç…9ªôÏ=©áÓÏοíG~û¥¿ùnzÜŠ°~cû¡óë¯õóùv'"!¡Ê(–±u߈ú_#gÈ>>-òGa÷àµÏisô®£½3½í£pë6žÚOÖÂÃA×àsÇq§Ó‘ù¬(-¡'‰ª0%úRäÓåþÃýÉdúhÿ /ÊnWOÆG‰ ‘QcÌb±h6†:Ô‘D5Ÿ.â0‰ÃÄV.“ÄA<ôÓn9-Ç{½«·:w‡‡å¹‡þðKþI,Å;žks~Øß‘R‚¼ è8¯z[^|æ_†Ãñ½7~|d¹Üþ—¿ÿ¶ský­µ¯iqÙòáýÎÿ÷gï}ãæ•9\2É¡ÖZÚíÜÝ–q߸*ˆt·ßI»‰ $òà<¸ °Å܇ª_Ù)ÑÒä’lhíL¢²•‹‚¸ÈÊ8LÒ¸ã-qÚJÇÞû¢(‚ àºUk-)ä6;ZN–Õ¢p¹E#B u䌗¨Ò¸q'éFA¼˜-YÔÎf³¢(Ødi½RÊ,ËØÕ€U¥H… !Ò4Õ¡rd=¸Ç»œsUU)¡£ ¤ ²ûÅ'ð·ðG”RäÀ¯e1’ Jh-ª›±àDwQ7YZ[[ãâ¨[fnj@Õä—ì¬7{:[LÉö'™çynÊÊ['‘À[çŒ%ç% ¡°4E^f„^(´ÞW …àI ê@K%QÿH-„B”Bë0Š)µµ+»‡gqç$Jòˆ5?Þª°,f§ÐZk+ǃÌí~%*%´D%ëvÜj·‘ï

¦&Ük¬­LU”¶2üàÒqUU1öÃPÏçÓ²Ì?øÁoùå/–eÎ>17 –RE‘$IÛïl„øJ¾SýƒˆˆžÈ9òhA Í‹$Šçh6_*•ýì?|îûðãH„z^.“~º¬ŽkðNéW×¢â:˜¡Ášµ•D%I`3ÌÜ1ŸdGB4ÀÀIsZk¨¤ ´æüQ[¼xQ5±LDtèP£IòƒÔˆIHþ:âDG1Heü Û-滕±d¼Z…IŒJ‚$°0•ñDBz…Žb„–À£ÐBJ@$°šz0ÆD)„VJÖ] ùßb¨ CÞY ”#t„ JM(=*Fˆ€ÿШ%II¤)P3Ζ|å,ïbÕê^ºÊt!D©Ã ƒ8P!/æP¡ x’(”¼–´TRJ[W:±`u@ˆÍpDŽÈzýaö•WÞóÊç¿ÝHqøgiK¡ )‹ÞÑ<8˜Ïw«ƒƒÊ½¿ûÏß .<“yxw ùs—!ÉÜÕ;ïß-/ºÎù[7†©š]­)kHX„@…HÒzéåjkók—.Ü}íK84ñ~¹þµ—¿»× vþ¼×édÓ³þÂlÔï~õóù¥yÙýÚ¿túiçÒ¥»X­{¥1öà«Hi¯„×le³(€ï¼ôtoóͬ’yq׿RÒþ»?t-vilÏG1’žÂ÷Ê2{›÷óÝ¢ëï?¸ô…¿x® —Þ÷mñ²|´˜Î¼± WI)ê ÔAö¢¤Dqi¯³µ³uîü™­3kêþýû¦rYU B™'S}n¹\ª²ò˜'€Ý\ö}—Ë%÷1e¶&vtxÊ$`•qÆØÂS!ÐH…R9k’rr9ì˜îÖÕÌøªØèv#[:k”«<[4z¯J²Þ» D@ˆ"[ïÃF yï=w­ÁVН³¢­² ½sUUea…%FB7ž/,Æ3Q®˜Š}ÍR¹Ê’+"CÆÛC¤10ÛþY£Ã|]Ô߈3WW3ÖÍnÖ©pZÛ…ßb0n{ÔBhÛ&vûf|QkÃkmð”ØüÛ6ÛNOûÊÞ8í1ZJ¶uÆ)@ø”ÅÝ>¡}?ßç)¬¹“æ]_·uk|²Õ ˜ã@lóŒX‡´=ʺ³éñÕÜgÙ±PkxÆ}MÄ5ÚI5……µJÖUII’4ÉçŒfó¶€Á`ð¡}è÷ÿ÷îçþ‡íííÃÃÃ,ËŒ1Ãáp¹\òùð¯9,yoLš¦Óùl¾\ G£´Ó±ÖþÑýÑ÷|Ï÷ ×Fyžw‚^ÇDx;Æäö€ã“hy~t2DÒ>Ú˃_3Š7~gµngÞµ—h}¯h‘l´»ã5óÛNnÿÑþ`û)¨v ›é¦–ëÙ~½}ÍSÛ¤ýú©al¶m‹!ÈŸîš'Íj9ÙXãíÔ÷ §î­ucs`=J …ƒcùS£„Xd{ºŸ€ªäD+ï݉3S “Ez_ }•‚{ÊMµ¯iÍÓÄçíÃÙÔþð‡ã7~ãÎ;kkkRÊN§³±±ñæ›o>ýôÓO{o°¸··7\õûý½ý}!ÄÞÞÞ£G~ò§>™¦)§šÀðR) IDATGQ'YõŸx<¾$NIíccëm‰2N˜‰Ô2ÎÚK±™Î*€ÇEËI´˜¤Q© ©ªnßéZ­ÍÙƒo/õöõES‰iÐv¼©}~Ûf'““Û¯·õ÷±I!„‚ÄéYÀVò|{+Õ§>™ÿ$í ªÕ¿ÛU' ›,ÞãK½. A¥B¨&!µìK1óTTöA Rá*Jï–ZNM•Zå€ÎH¤‘†Î=ÒF¨òûwæÓñÙÑ%1ÝßõÞÔÄœ¤ÔµB‘—Ö8km’Jw&”„‚\e­%ÔŽ„th,ö.Œme(B‰R€hle+kæG仿y¡—ߊd°ØÞ¾øJ9ÛÄ`¤sK‰sšT"T4ÞÍ23[,Ãá¥i9qrÁ.–s.КA¬ÕbpNk ^R„a¨F%£ Mº¿1f2™pÒt:å)g•ÓÀkŒ©rÝ‹æ_"é½ó`P!‰= ©¦0¤Í³Ï}5ÞŸžÉgg¼Ð^/J› ±Jë·¶Š“°,Kç@ˆ­ñÆq*eNɸ*ŽkæÚ˱½@Yð1†8‰¤qžvQìÙ°òkŠXL3¸zÊÑ”R†*” ½ñ¶´dI‚” ÁA®¶“8XÙ³òn\ºf¿¹V‹¶ p'[$µ­ÝFˆ°GÞ8ÍÍD« S£ì]]}Øl<8Ù§[=°¥Š¨Õ„ ½{©N»mpcsˆ“I¤²Î¦n>Þ¾«æ³Ø Üò}¶¡-ð$0ÐÜF#Ë\+[LœÅ¿yº›Ì)–æ7_Š0"rz3ø#Åò=‚8ŽpžÇ!Ïs:4›NùR|Ît:=<<Ç÷ïßoPŸN§CD.\øÉŸüÉßýÝßEDæýÇ—.]ºÿ>g\ÿ«Ž0 fÓÞ ãñúúú²Èÿ¯ÿð;ŸøÑᦇI’ð Çq,þK NjÐSG³PýÛd~Áã!ÆÚ†k>{êüöèÉúhW µ•¶Ì£fu=®_ÛïÂIeÙ>óñçjn©=ðÄ¡€–âlŽöƒ<®€¡ÅLŽ-Õ~ê²Ð²ŸxÃíGnŸvêõSÖ¶¼´ö÷>>ûO|½9œQÞi pœ0ODIªÁ®™"±+ÂÛD%™XxuîÒÜýüh€Z—U•*;A¼VÎ]9~W™ùÅþú²¸¿¾±³ùôÞ­»•Òä‘"'%*ΕÄÙ¶(­µ•)¢8tΕRù0ÖVÖVÂ;á½¶£¤ £h::@Dê²ÊR)ôíoœ;sq¢U%`>N;ÃÙ|¼–Ï;,<§˜Dé]®ÒdálQeX–ËÙD_³œ•WYpiIC³Ç…-¢fð„ˆÊZ&±ÖÚ”f6›±)æó¨,™­­Y4,AªÂ°bÞßßßÞÞf­ „¢"¬”FTp1z%¡@Y\x×r°9>:’»Ê¦ö„òfˆ)"’u•”ÒÙÂ;@¥„P-keçŒò¨dXÁiû‘W-Ô­fàd¡‹”R¡Îœæ@`ãºÉ£!¢œi[Q§tñ[m×SÖ¼¯A 9Þh_Wˆ6м±ŽÐæ6×b ‚VÆì {Bû¸mÜVê¢.‡m{í5Ks{Ãc `<¾Ù褻)ZåXåòF‹Vrìãb¨=_mÕ+kj¡6HØ,¶FŽ ! ¶ÐÛvIÛ­ñÞsX]ÕUݦ·5•&"&‘jæ¢ý¤ÔòÀŠÉVé±ô¦Èа¯͈¨–S‘k+¶ʲ\,|}æribÕl)'Iò‰O|â7ÞúÃ?üßù™ŸÉ󜻞ð |;Á÷v‡õÎÓëõ'“^¯w8=ú‹¿ø‹+W®|ï|ÿl6sÎE@q‚óÎû·É,~­¾O@‡“Vã7ù ´,}]O 'aÛ¶2­¢UpÕqùÙ7ÑUÐR·|œÚP+'<©Û ƒj€„Z9ž,}†“;¥õï‰û&Á7´ö€4?urûúBòOˆµŸÚ‰Íøsâ'¶ÒWOÝÞ©óáízQ (urµhn@¿oíš”JÇàÊn9;£ƒi¼ö…ËïÚÙxñÁÍnY¢ìŽ¡L÷î °ûìñ"‹ÒI)%Æè:@&ŠL/.¿ûძ[w_ï–ÎËdb]$|¨ƒ…·^*Á"ˆå; J"§µrŽ„P@Š…PZ“ÇvâñÂ’¢‰õ¶w¬Ö Á‚ZAR­JlYê9çXržŽØx½Ô–Rj€7Hd«ò’5w£€¿ûRíꈶtx|Ã7#ÖìÛS¾ ¶dk²@…¾Õ´¸ñ ›±ò­þÙõ­È,÷^ýèáäa<-žÅä 2Î8)õˆ@èW’a$¬µ•7>ªdŸJ¡õ^ƒ Þw‚È (<(”ˆ½ÕATLŠ÷j÷ÆÓžc~¿ºpqúÕ7×ç9ni.ïC-Bog‚ ±õçø¯îzñw‘:?ý«[W¿òÔáÝ8¯öÙø–RBí'„:@D§|/ ¬Ï™BxÛÍçón§Ï¼»“ɤaÂ#¢n·; „eYÆq\Å|>ŸÍó<7ưÅÑJ2c™@¢Š‚å`mo°~°¿<¼½=Ýï¦"º*ޤ¡ŠŒ­T¨Œå8hå½'/§ªã¬GïÀ(%Ú{§4Öj%Õ^;¤·^JöbkaÍÜÎmþ N|%<Îêj»’§|nY7dåÝø…¢®vmÇ2ñ1dŒ¬k R£Ç"²ÍÞnox[“*ŸRÿÔJò­ø.µì÷Ç8餶¶Ü‰w]Ãá¬V¾&çu3en[Ä´³Ñ²D”eYžç ÂÏb‚ÑàÇîöó®î¤å†úš_¾Ñy<,\2ÄÚÄJ踚•šˆTÝð‘Þ¦/¡¨ÃŒ Q­¹Oùgι†'¼X|{X§ùº…v­ÂS €Çœµx’$ Šð]Íf³8Nññßÿûÿ[¿õ[Ÿüä'•RÝn·(Š­f@Jù`÷Ñg>ó™0Ž~ù—¦S­5jžçI’h©¾‰‡ýøšië‰Çß…oÚž¯±óZç¿Íý×ÐÈ©•Ù$O¨ËRÊÁœÝS »­k¡Þ ÍNi{[ñ·>¹ÁÒØ@<5P§ð‰¾oû#+uN'ú.C+ANš& øê†WKŽDcÿñ[ØòWÎië‹¢™ÖúF[fxýiAod °–ø‡Ø+•(AGjk0yÒ‰gή=ŒèÙ¯}Cq)¡âEY‚,ãxskg÷o¾ö½o™ÁÙwýï;Ï~yž­':¼BÕº'#uŽ ÔÞ;ïœát1ï=´Ö«(0E&„dÔZAŽH€w6ô œ—‚·(S­µ/ÑSEbu§n'gßÑ»øìȇïïxO2vÖ+"ÐBÛR(¬>غûÖ=ÜsÃÍÓÃËW`tþüVªª*_G¸–Ë¥÷ÞJ×í(gtQàIÔÕk‚Z>§É°…îjbŠn·ÛP.L§ÓE}05G³¼¤(Dô¢(‚d:ØoåóÛŠJB• m¹(ç†-¸Jl!Þ{c !À{@Јš½÷B>9?öÔö€Únô\cýaíÉeYfë®pì°>.ð1¥xj?ûš¸Qm䓞d}ŸJ€j«êS[â”h¶bû·kå 7Ži³ñ±B­ôéö‹ô˜ùÜlæÇ…W£}«6ºyÞSÙlx¬q¹²,™TZZ´RØÚŸm¶‘ íiæW´øG›”uN2ÇÚ+ml#¾ÛvýñƒêD0VÀ ñY;@µ."$nkæ¨C\aÒétÒúèv»N‡¹Vò<Fܱq8Îçó²,{½çdýÒ/ýR¿ßÿõ_ÿõƒƒƒÃÃÃN§ód±÷öG§ÓY,÷ïßÿÍßüM­õ/ÿò/sC*þÆÊ˜4MmeF£ÑQ7tjå´· >Öꉗ:µÀè±SfͪpuwöúáZ%R§–t[uZWÍþµ­âòSGs}>Úû«¹ì©„ÇöBó°O“S|â4uêN¨ÉSQêæ³§ÆŸÞF 4'¿ òv“ëÉz2D†È8nR'„ðf€‘íJ‡çÞÚ|þÏŒ»ý/ûŽjþQŠjjœ ûÑfA|ø•—¾Õä;Y–í~ã8³Þ¿¬ôÂ=ç­÷¶éôÅv>‚$pÞ¯²A¹W4yR[ãȦ=¶÷€@ íðÞ;_9_8!”VqšvÉ%ÉÚCËl:¾»¾vþõ‡×G³É)Ð9¿òšÐ ¶ò³|Ù•ÏâŸþ왿ûŒé¯_}ïwß­ž=¼T8öĵ…Mµç*ûDJ±µµ±¾1:þì`ÐKÒØZÓí¥i'é÷‡DØíöƒ J’ÎööÙ½½ƒ,+t,ól|Dáí»wzƒ~GBÉ™¹û òdfZåò}ßþ†è|ù/ÿŸ£ê(„ ï0ãXÍŽ&¾ÁîT&5yȸăBìϺRßñ¦È¦;kçÕ½ƒ¯û©R¥7³àV'A“o9\ ‹u•FÁÜQz„¥–’0¥I”jØÊyKJ Dà„¶àãn÷ ‰2é*ï’&3-MÓårÙxx²æßuòðÚÚ"FI‚¤aH-Œ«¤R W³Ìçsf,AD–nìŠqYvqB¤~DDî©ÇÒ¿)yâ°(×€ê@qA³•PÈ[o¬7:Ta€ ë ¿˜K¬;ïZk¹ ¹Óé°w(W(À1jJD²¦ÕJhá•-<¬ª* CæŽæ$€U'D[r©î2_„q`½‰’и %Äi”—JZ$%ðݪ@Už—Y§—ZoP?HÚM<¸£ÙDHA\ú¼*LÔ9ˆÃD¢Ò2¨ SYãÈ{ ©U”Ä(Ei*„}eˢʫ@#»ÌÖÚn·ËR¼Ê9†j *}Qúƒã’3(²Îã=ÃS¯µæ(oó/¿›$IFZH-¤7– þÀypÀ+%ÂP7?A ´–R+Q§ÝN§×M»(‰uô‡GÞ8«=_.Òn'Œ£Êš8•ÃaÿW~åßýØýèïþîï|æ3ŸžÏ§±˜9ˆ½…du×OˆR×yèùTæÝ±Îm×Xƒ&¨Jûp¨6ö{¿ó‡¿óú÷~ðGðßü»w;ó<¥1P(…Ôj‘g½ÑÐIœ)á%Yt,)^’ÞKâ¿-:RÀ4WdH¢sƒF–Ð7? ¨ùñàYë —¹z^$%9* @ ¥µ¨§ô ¥¾˜Œt$IG2Ð\#¥IÒípÁnÐIT‰(€@‘–N¢`HPå*KÖ’­\E‚d -Y¯„`8‰¤%Ä ÍË‚À ᤔqŒa(¢ÃPi]ƒBDq ˆBÊ0Šœ÷ œÔ zBZ %=¡“„¡t’*°¤Auª@òàp;¯Æ( Q‚ $Jpd ½ ¤ $Jà=åÈò.Ó¡B!<‘'b­KÖ9c-(¡$I¼…O–Ñ‘-}å„÷ œ$+|z!@)p!°·’¼4e©|¥]è|h½UÎ)T&Ô:PJK©„ˆQHÄÂ}ï¶ º•³2<ð®Ôñ¬¬2OäËí4½Ÿt¾qn»‡î[^yåÒ2(¼èŽå\|,P®.?7›/gU*«ôËäÂb™¿¾~å+ÂSbÎ8Rx®Èœ*œ”Q¹œçi`\:…dòug`ó)ÚŸNÂ8rËÃÅá´ê÷..‹¥‹n¨Î¤Ì"­ÄÄ%ÁÚ#*B\®:”BÌb´Ú© ôî™Òoö×F·oö>ûŸîµ;ݰ?Îæw¦)t­ðƒ…÷JŒ*_îÑ ƒ­[;»ÛÆ;RX ÜT˲(¼usŠîÝ=¬¥Zd„ºPA%0Tëëë.\ˆÒd8²bxDÔt ˜ÍfD4™7‡å;Ô0cY–óùŒÒ*³“0èË‚@¥ñÚrwä±\ë.ºk÷oÝ]7¥B: @hŒ×Ê Œ¤ #ëÉYëšõPéX÷s·œÉ0Þ2ñNw“nÚ©–»“ÉA–¯Å‰Æxw©W¨6aͼk­Í×XJ4TUY–EZW²B Tš¦£Ñh‘gý~¿×ëõz=ç\Jk¥Ôd2 ‚`4 !sæ¡g+—”Rý~?•OÍᎷ‰ŽFç®gs³wk§*o«2‰•ÖƒÞÑÁ¼Ôh—åö…î8»k Ñé‚õƒG77·Ï¦£·ä8s0O{ãliìâJôÊ¢(c’Óþh¨üÒš…'Òº´Ê<Ëýdc°ÞÀ;‡E8©(ÈfÆ–¥“®£išŠV’Ë\D»ê0È*!Š")%‹Ñ~¿xxèjÄ †Ã¡)Wp½s.Ë2¦YFUUu»]¨»/°Z²Öªà˜½©¦hø¤X“±÷ÉaõJj2fWžœ1즇a(…Ì‹|¹\RÝÙ‰k-+BYw>`¥Âk¢éxÚ`J ª†ˆƒõ^“çYN’dÐÌf3~¨‡p=Œ Ëcƒ ³mÁ?\2ÛÔe2T£>{½Þl6 ÃP Å:©Ûír¨•m 第¹s¹5/+Å@¯(HQà¼!D¿ßoGaÛ "KǤ¡B¬¢¯cä¬ÅJÓ” Ð4M¹„·p"Š¢€¡$^f<’Zë8I¸f¤Á֜تîÂÔ )ÃJ*’DZI¥TÅ|æb±(Ër}}ýgögâ'~âoþø÷þÏÿø;ÆÂ÷=þ½ç.-“µä…sXe*R÷ÄÃG`ÿ_ÿÜþÕ«±*Ÿ}çGÿÿíSiÚB˜Ò¡Fƒ5cÌ|¶H‚„-PB)TD@ž„÷^@Fa=1 Ž”¨$*ó?’ð(¹o˜ð„„ˆàkr:ßõÞó‹XknL‡1" R‹$JÐS…•"÷–<‚P‚PäÁ:/µäÓM”R*c•(•ÖP‘°h½ðN¸Òg,H-˜ò €ŽéÃjFŸ•dKÂU逡Zí-9Ï‘¬}Z$Bòè¥éÉKTZsR'D ¨„Bð×­¾=AÍoÃÏAÄ ”í(•ò–¤LdžµˆóàQ€%”îÅ"HçœÒÚ _ÙÒ£Q[9h xÆWfŸ¨48D„@!´€Š¼A ,Wú*$'êiÖójUû¬,ç$g9A¢´®òX)µ¡ü…åBnY*Y<ººøÍÜÞÎí ”2Ôe™"ˆÙÑâà™dM?{pðWŠœßY ð¹Én’—–âG{;ºw] ïÊ>úÂYWå‹ó—¯=¼®­|´uöPú³ó}¹œ¥HI™îÝê nn^¼¸÷,R<èÌ—û½å4EJ¢(‚¤…¡w|pDF*òQ*”>Z.¼{ý d7ƒðhЋoÝgG£ƒ‡ÁÁùŽg/º@_ÊŽ â1°ßDÊVIv@D伯œ­ÐxA«’ÙÙl¶8îô;O=õÔµläHš¦ÌpáÂï}–eä½TÊ1ĪµÎ²Œeø™©È§¢2n9ñʙ훧+¸–oâŒ)£8ê¦Ã»ÛÏݸÜë|îÿÍòƒ²œ1‹§\ ýí«åQ>~ñy›[¯5UJô7nLöõ¢ÑîÎhsœUE)²El«‘êÐÆÚ´Ê+Ùba×DØUR˜n·ÓSP¨iµ¨£MÍI’8çæó9“ u»ÝùrƟ垬l¼0z†!w¿éõzI’°ü uÄé3ƒÁ€9:ò<ŸÏçιápÈž¨"ŽãårY…#Ûï÷™æ¡i¾¾Özoo»Ý.;m¶ÕΈØÖáÎóUU ‡Ã4I³<;::êt:ÍóÎçó¦`´×ëqÓ6øf•À~?´¸‡HÓôèè¨×ë±€a˜ç¹bÿ`Ÿ[AsÒ*ÕQJ9¡NBf­Æð>;‚ÓéT)µ¾¾Î(“t*¥¸Ö¼ßë[k9#‰½UV«ü\mÛÔý·;Ïsö§Yè'IÂG±b:ò£(²Ö:pœ @Xk¡Õ³AÔäØŒp¬:rJÉ&/6hÒ45¦D! ŠcD<<wTJ%À£·¡É‹Ô˜ÐceœBXïýhîï~ywÿQ§u×”qÕ44]UË+{‹Gïwz÷ŸOïÜå(+ô?ÿcÙ¬L:Y®¤×¢:gÊX 5ööönܾµ¹½ùŽ‹«ÊZk„ÖºÛíÞ¸qc6›u:ö€“G)5úý>,‹øË¿^ØÜ⫵;£ ýÑàL¹¾ ‹ÃÁ¹M²¶ß?óŸŸLö¢¤?];óœÕ_zëë—õ‹Åg®^{ôâkô¾ ÏŸ©Þøô:ÿ¹¿ÎödžUQîô’ÿý¯ÞÛzAO¿þ¦K’ûïù_K7»þõµ7ÿ&½rù#¼K“$‘Rrw[¥”N¬ô·ï$·ï|áàê_ýÞŸþõþvcëÒ»Þqå©§žº|ùòx<þÒ—¾dŒùèG?ú±}l¼÷¥/})Ïó}ìcËåòêÕ«œ&óÑ~ôúõë¿õ[¿…ˆùÈG^|ñEÆ9‹¬¼sçN¿ß¿|ù2«‡×^{íOþäO‹Åûßÿþóçϯ¯¯³ìøú׿~óæÍçžöÙgŸe“µµµ­­­,ËÞ|óÍßþíß~饗¶¶¶~è‡~èŸøÄ•+WÆã1mmm-—KcLÇóùü¥—^z饗>þñÿðÿp·ÛeßúÎ;/¿üò­[·ž¹|åýïÿ3Ï<#„¸s玔òÍ7ß¼víÚh4ºråÊ`00ÆÜ¸qƒ=Ñû÷ïß¹w»ªªýýý×n^»vm2>bó#ß÷Ýßñ߈>Üß߯ªêîÝ»ð±}ìSŸúÔüÁ,‹_ø…_øñÿñ0 þôOÿ4˲N§Óív·¶¶:Îùóç‹E’$óùüÚµkÏ?ÿüw~çw²{úµ¯}m:öz½·Þzk{{ûÅ_¼zõj¯×»pî©¢(ƒÖzww÷ÓŸþôg>ó™W_}ÕѪUs†ÛÛÛï|ç;?øÁ¾÷½ï}úé§ß|óͯ~õ«·oßžL&ιÑh´µµõ¾÷½³,»~ýúx<Bt:²,Ã$ìv»Q¹ÊeYfÊUóʲ,ûý>§J±¥rpppïÞ=–¤ŒH3)UÇι££Ã(ŠŠ¢è÷ûDtãÆñx\–åt:eý­” ;;;ý~_Æ+~ª[Dó÷ñVj þ·›v¸6‰ÛV:çò<_.—`—rxî[/\ÚØ”¾eò?ýß­ÍvËïûo¼X|áWþëÅ™ ±ÿÆâȼñàáÑ8KoÿspaÝ{Ÿe‹ÅbÁ§÷~¹\Nç‹ét:ŸÏµT£56eîÞ½ÝÔô77#„â¨Óéôû}nÔØ KA0›Ínݺ5™LXÐ4ý¤OýÖ­®VX§”{ï£$fÃeØôûý*/f³"®uz<#I @ïqÆN?%"nIŽ5eŠBÇ!ÛUUqËÈÙl–eÙµ{wø‚lBQM:ŸÏÙ0âyquB~åLEgΜáÙgƒ¸Ûír^EE ÿ°Á=­å¸C‘¸0ŒØ,8::šN§B6¬¶É²LÔ £šÆk<<ËEQ@Ðaˆekó,[íü8PgtÒÉnªÎ¹•q,‡±òe6 ¶ÏœIÓTJ9䄆,ËØR x % "z»Êî6Å|IVƒ[ëÝ=ïa) #œ•ÇÍB¨•/ù®ïú²3 ­:éæLw>x`Éå¹øêg¿‡àV7ÁÃÅ^w¸wéÛ'ݵ#SʲðÎ%‹éðξ_ž‘»ýé+î­o„ïùî¯=óžA°;ytý­/„ã‡u³òÕ5-’ ª*~óÎâ(ŠR#°zýêô}ß•l\ùÇî°|xýò­o\Ü›þ³Ž¡zóãÃ+_~ðÚh¹÷îç>póÙ÷߈ºû õÙßÿ³6QªD,œ/P8­µž¼‰¥98–s\dYQçA +ÍìêƒCãsý‡{³ÏýÓ×çãXÊËß"õúŸ¾ûG6?˜vg“p÷^xø05¶«Ô¡«)èN)E¨È’1Æ[ëÈ[ïʪ*ªóçÏ¿üò«×¯__䋽ûù2+s Wa¶ƒƒƒÝÝ]vé¸S©¯1·Ñh4x•,—˰w~8z¸7¯nƒÙ?*³(ï­o]:³½¶œÛùԧɺ°ÛÛgÔ2;zëËg£Aˆw¬?¸î0Ø>seò`zóõ½jñ•¿;ØÒNÑÞa„÷¬{êþŸ`Ðé[3õx”eÄg¶. zg÷:{Œd'’]km¬Z±’ž¸1 ’$9w›ä,‹ÃÃC¶ÄƒÁÑlÂ+‰Åkƒçyβ£ÓéŒF£4M™r-ÞóùœF-‹0 G£ÑÚÚZ¯×ãñá<ÏÓ4e‡kú-ç\¯×ãÏ6d áEÁÑPÖIk«”b⤃ƒƒ,˦ÓiY–ŒN³@dËÉ_\ŸEQ¿ßoêwÙÏnÒ†‹¢à¬±n·Ûëõ‹Åp8l2œÿòÑ£GãñXJ¹¶¶¶³³söìYFe¯]»vçÎkíÎÎÎp8ì÷ûq'IòðáCkíÆÆÆ[o½ÅMÙHâDß<ϱî å½ïv»œ/ÝöHœl2È\Íbáê"RÖZ÷ûýµµ5ªé´ø`ÚH!DÚM99« OÖ“p¸Ú9Çñp8ÜÙÙáX5 )Ї‡‡ ´äe§‰ tœ&B(…õ«QbTƒAöà­_E”©NgL»Iø¢:F°B§ ˜|ƒ )åd2ÙÛÛ#*·{Ûùîî•Jî>zTÞ{óóÊÅ_f³«Óài¤ g•´Þ‰¯Þ½ßé¦Zk§Þ Z¢ ¼‘²p~–Zë®÷•à)÷ÞêÀ:±*þipž—D¡R éÁ{ð`<¡PRêÂÃ4/+/WeàXE[tˆˆ #œDÎ÷³ªB"­uG +DTH!Jçµ§Ê8ã­õÖ!¢RBJ©´fÈØ9ï €ÈYG`½%%dÈ*@[uÖÖJï½JSöAA)T*…R’÷„èëé8Obr#ðŽ\é­–X:“H,É )0Ôa7å:FšK±œÛÌJ)1Ôa·“öûQ˜ðä–žfyˆ*N¤Öšc‘— ¥TqÆq³Å0Ô…·ÞV@¼ ´ôJA¢¬‚çh @)A°zk‰ÿÕ¢BÄ0Ôit:a§£”QDΔ 5!:)I Cpè €¤D@‡†œó„ŽÐ(DÆQœZ—4º²´<³ N9GÞ“÷ô¹Ï|Ð9£µª¬Jo]B ŠÜ­o¬/«q^Ê—ÿþEW•äD–ÏòÙHèIœ¦Z¥MÝéõ#†¹ñûŸÞ—$ß)„P+i„KúàæçŽç¯}î}ƳEÆ‘€óÆÌ*1þë?ÁŸKc »PvÂølÒÁ‹$HËåB¿ñʹ£i/ór|îš+¶‰ˆÈ!9á…HBºéˆÛa‘»¼(œÑÎy­-‚îtvÆû{ÿø·Å´˜M7‚îÚÑQù¿ý s\¹Ö6:Ý0éx‹ó,÷Vº&'Zµal*¡©ÉdˆJk2““q* Ã<Ïoß¾m¼Q5m!Û‰ËåòÁƒ‡‡‡èmJ„Qˆ(ŠƒÁ`0€0 —3\d㪜è;w)Ö`(éuŸA=Oºƒþ`ÅÕ\Ȳ*Ïlo^Šäóç6“ÞH½~##5—º¿¶¾s~çË©|0Öa×ll£{ãóƒd= ·Þ–“âš*kÁØüþþ+÷ö^ÑÝoeó–ã»ÌRAj®*ÑZ¯­­­¯¯ïì쌺‰ÖšeƲæó9;N‡Ç‹5£µUUõûýápÇ1E†á™3gî޾ǥ D´¿¿ÏØ­­­µµµK—.q†3 Üét:›Í FDNÔb$áeFtäç[jlÖ ˆ8ƒAcº6*„iÏXë3\Ç1e:ãë "_‡“›ø³œùÅýõxf=^[[;88X,¬öر㲖ù|¾½½½³³³±±±X,â8ÞÛÛ›L&\]³½½ýÜsÏq˜œãçž{îÎ;Üïö­·ÞbÈ]JyöìÙf¦\‹Þ‹ËÞˆ(MSng”—¿EÑÚÚcƒY–q$~{{›S8ÐÎøíb± ¢Á`Ð$œ‘ $wÝp•K’$W!†©¹X¹ªª<Ïy©°¯Àù¢(-“É…ŠM¥3Õ°ÆÃU%žt†¦1Jâ¦qƒ«óãR%†ú¹’[k=›Í„£Ñ( Ãù|~ûömUùbâß@Ý[$‹ƒÛÓ°·9¸¸QÁ4uÒa•¸e^(È(ÐbQ^ºôôd2YÌ—A t qÆTJI(–a‘”RK-Q’  ÁxòÂqoB UÄÉ€©Œ’VIM„* ¢(ŠXJ`ëX!Ï(W±^±ªB+å½Â0‰Ò$J½%ŸPF ÒZWÖ“;cÑ“V  ¡„Rj¥!ó±-KÖyïbÄÝ(íFiÖÉreVVUéÈ{ïÉ d )$’'o¼) o+%JäP® uè­T༕Òau:Ý ˆ ŠŽœóZë £0‰£4 cVÀČš÷ž9|H)¤éÀWÂGQ"k2Ú8Žó¬,òj5b …Q˜ðà ”«ÎÞaŒQR‡AÄÆ·•VJ…QÈUÝÆ+¡BJ¾rDB€ðäyŠÉ‘·80 ¥ô€RH)¤'°¡°(ñ6žŒuV‘ÐÇ9 D$ê’H/3SU2Ò‘±ЉÝј»¯ UpTÎÎ’ëËhLb$bÌˬ¶¢Š»`R8r¸\æØ9{-Ëg³ùx½s1 .Ï&d\n\ÑÝJ³ÊîGÛm•eÆ-Фë纓‡Ý½2éÛ4Jm5Ü¿G€SÙ9³¾¦iI›‹ü\à/„Iæœ!‚FA(½Ô¶ÊõáA\V¹ÖZ¨Øy¯5*:ÐQrq6*™Ѓ`¯#‡ùøn;Ô×v+ËK{CÅK©º;—7vÿÿÒÞ¬W²,;[kgˆ9âNy3«2+«zfK4Ý X’mA=Øz1à'ÿ:¿°á7‘°-4)“4ÙMvwÍY™•™7oÜÃ9q†=,?|qö¬nÑ(2oFÄ=gŸ½×ð­o}ëXÝKà<öka£Šsuw¡R±0UUÕu}ss3]LehDñ£ªªõzC@-Ð{¯´Ž!À ”e Z ršÃþ¢nIšÈ8ç_ݡѲ2üt¼ÊVg³ý~{/ÛmgŒY,v*g¯>m¶“ͽQz®ó®ãºàÉäêíÜvñÝtµú$ËW"ëèn¦³åfûŸn÷/¾ý¶>{–ÌØÖ‡öõë×pyž£,ï½·Ñi6™]]]Íçsˆ^%j "F+…! ÄC¹X,æÊ0öØ ØÅp±<°x`©‹Åjµ‚x «si4R1|[]×È\g³Ⱥ›ÍoÃ_onnOĘL&x4€Fsp{{»ÛíÆã1\EÓ4© ´êäB0%p·ÛÙÌ…„Lk¡Ïf³qÎM§SŒåÁ¢'õââBDš¦ž–xÈHµ¯¯¯A“F‹8Sònoo1p^Dæóy¢ŽC¢ªªÝnO¼ßïA.Ë2ȃÈTŠRÃ:tS € ÜÙl†§FUŽ YÇ'ÏE‘GÂÖëõÍÍÍjµzôè ,°”ŒòÔê‡íþ6ÚÊâàWßo7€Iô0BŸ GB¡öjÝ´è8¸½½Ýl6777UU)¥f™½íŸ¿»«2ïó¾îÞŒ«Ÿfvg|/avß[ [æ\åãÑæíM²"ƽP̔њ·û}hœ¸¨D³'íˆYY26b/Xé…™´& ¢ƒ° ҹȇLÝ)©÷ì‚b"é ÊG‰“‰ÓÌÄ–+R†5S` CB #™H*ŠT°.m¶:?“ƒóÑ{e…ÍFe™ç9«˜ 5ðáµÖÚ‰óÎјÜcIeq5žµEÕ’.MB`$dH÷¤•(‰ú]8ɃV$öáк®e2Ꜵ½6Z³˜H©B™Âd½¶…2Š£‚Ÿ—&#¢h¢×Äû@Y[eˆ{ŸY™2eF&Ûܲµ]×Xa凼°ÎHL‘›Ü‰«ÉtQ1´ ûÈ^´f+ÚŠVB£QÚDÅAbï¥y™mYêܲ5dtàèI)RLì„0³$ø| FLä#¨@DZ bAÃX+cøÐuêdö¨ äµ.غulȪi Ö‡µ ïU9z¶í~.q!¬ý ­FR¾T´L!’.Uè¥i5W†'o¿}wyö{<ê%¸ªé<ßN&£¬Ÿìâ_vRÛ¢f×Ö"j“•¬ý÷_Þþëùt5ÉÎÛpßW_”ú‹(SÝ×ÿöÉÕ÷ƒû„F6_¼fë}Ïq¡ÂÆù.Æh͈‰ƒ ìV|QÎ][zGyÆ,™÷mÓwšÈÛ/(oLñár:ë¶íÛûO§ú2ù~¥·ºx£úÜêU¡ÿÞ¦jêf£N´üâ‰þ±u}fÜÁ¡ŽûPò&µ;˜ö~ýÍ·ûx鯝Ý™õuýxTlw»i]íögç&’÷!*"Š——çÆ¨ûû5H­›Í]¿­wƒŠ–ꃔEQ¹ÊŠåêp8l6»®sÈÒîï·ze¬}Ô:[ïB³ÌæÖwo™ù°Ÿkwë_}òá“Ñèú믿ÞÄÍ÷Íï‹ýW_}u·>ôžIèÍÍ[kí¾®\ð×OÏçó¬ÈµÖ«ÿ?_ö«þ|7úê‰þý¿8_¬Î¯–³¢ÌG‰®¬ˆÖëõl11Îf³ÛÛ[ïýl6»¿¿1ŽF#ÐtãÐ" g\Œ|1ÊmnL¦«Ã~_ï6»û³‹ÕÓ>|ôøJDªÃÝ~ûz·¯w™ÉooÖUU-—«ív›™ü~½ãét:ŸÏonn‡Ò&Xób\¸è2Ykooo?z2ÏŒºéÞt»ÝÂùÍf³é|rquÞû®:ìqI¬É…WèBßt‡]µ­{›R2*Æß¾|­Hc...Ðk8O$ÄÝf;™L|ï¶÷ß»g>UÄw·kŠTdùÓ>¼_ßYk«}µßïcŒHs¯®®V«U]×ûýèñãÇ———ˆi 7Qæ# ÙU¤çÓEô\Œ^ ›n­ŽÑ‹„¢È”"­Y³ã³å9a¤ñýz³ßV¯^½zôèч~DáÝ»wûý~>Ÿß¯7Wò¢@Ù[/5"ôC[çy¾Ýn'“ f"lšÎ'8ûýÞ…>ˆ¯û—ߺår gÉÌhï}ì\[ŒrBûý>µTc´5»jÇ纶í»CÛ 2@ ¥‡Ì\Åx<Æ•€ä…‰œH”»®C¯su¨ñŸ÷^Æã³ÅJMÚYá®Ã‡åÌšköÍ,rë˜W[µ(ÔÜL÷ómöÊ´…FbÑŠ \]Qj½YΙ5¤"gÊC=瓲ÙtQ“1:„H”bå(4¾Sþ(µíEY=ïÛC½)sem©¤Í¢•b¥ƒ.tfÊxŽÇ °o•RJ+!±£,&Óù(ËÑh´šÏDÄw}×´bfl¡µŽ‘²£ Ÿ0\¬µŠÙwýt4Šb•Všìx2ÛnªqÅ·¡kº¾÷½„(µDö9ÆxèUW×m}L\ú¸\.o7÷›ZïlYx’Ø÷ÆÚ¶ëˆÙXÛõ}ˆQi6gb­ŒVFCˆ™8Sd™•j|KžvêÂħó‰÷^)ÊskŒ±J{ï#et^(¢Û< !°V^†h¾\ôÞµÓ†ëTä2/œsMw Uj­ÇÅÐ]1™D-*öѦL‰¦ ¢pˆäC ¾w}€’«ˆïÁwÁ»>úh i%"b}u7ýýjFËu~Ãô‘ã{W—+ë<¼4r<&RBLœ³Î'S"¢Xå9Ù8 !Ô]kŒmÝ¥ó`ï¼÷-|h\7-‰UPš´xQ1æ–”êDܤÌBx=Ê1I,;ÄxÈèc•»3r3KÞûÐÄȯFô‡M–kVÞ{÷1ÆØ;{ýM?›½ÊÌ4“'}Ýâ…²ßtg6FsŒžÈS]ADšëqÁHèP£Š"ÒM^ÌVÞû3ë¹üƒý~ßÍ:KQõ3 š´̼ÉÇT°j{µÉ¬÷žG’í~g­s£óËRV}öù…\~Ö|ùFÚ³Œ«ë}×¾}ûÎç³f]Çn»ž¨¥™Œ‹òæõ2PÔ3Úd™É22TŠyHãжX×5h…£H|vv†CÛ¶ín·KðxL`Ÿæyž†»ùAÅ 2‰»»»ÍfSŽG=º¸¸8÷wwD¤µÞËÖ€ô[–%à‘ív;§üõ|4º?ÐJÆóY¡í|:#zvƒxwÓ4Êp¾OǼ€œÈª‘öµm›eÀR”Ž0Ç"Ïó?ü0 8 y‚|c–eëõz·Û!Mßï÷UUa>ªƒÛív³Ù =uÎéþ㣴 Š*ÄÈ€Q mš& šÌ©¢ ¶ª*"Ì‹Ásu]ƒ‚†+díiz^x¬u]#cÑÝn·ßïE3 ªôÞ{ÌY°?¨.€IgÃK)…ä^ÅT0Ÿ±nø ²F§ÏÎ΀ôg¾½½mšì˜ËËKÜ2XKÀœs³Ù,‰®”eùÍ«XO<8Ü,„»û¾G"’f˜ —A$.Cª ‚7*ô¨è㹤eLÍè`H˜A«É:êàUàN'“ kíÝ݂Ԇ " ÜOÇöSaFÁk¥]41Fac…‹Ìr*-©á…D@.Œò z€ÑÔ cŒñ(Áíß—xK’±)ZM;(<ëO5Ô\òhV1Fï\ ”ç9¦Ç+Vš1YmüÀÌÀÅ ÐP Gݵաéûž¢ˆ6ÇÒ;é£<CSÌ ‹#‰õÙívˆ«º®ÃžOïL 4Ôÿü “*g | °åØfrBh Ù/ÜK–eóùܹPWMO.-u:YƘ }ŠNô –F€cq;8qMsˆ”β ‰Dä´™‰i£u[/GãÈÆ˜»¶*éÿû•¶ß)põïùJ+€×I%ãa†„(@ÅÆ¾Õ'rÖÇì3D˜ð†”~祅‚fVú¥2ð3B  ˜Àjáɶm[õíi…%­›FiEìCŒ>DVAù¾í‚ól[Ëñ†#ëæPs˜r}0EÞòáÐL•š=ö&üý>®Ý(Ë«ÍgÆÏZ™"+ËÒ…~":ûý¾iš·oßCCl FÌãÇÏÏÏ×÷wàøív;? ~Pƒ8> bióá'(éÁC¼yóf»Ýާ“§OŸN§ÓívûÅ_¸¾WÃq,9*”(3sÛô‹0ùêÙêY¾Éo«ù¤(çó%Ü$-”༵UÀ„Ó3Àeo6Øb`¿‡Ã¡ˆ,—ËÍfŠ%³Ùìüü|·ÛákA Ãó[,Ÿ?>N_¾|Ù¶íåå%ˆc!„Íf³Ùlðý44åy^×uUU=½X­V/˜‰†ƒ |Û ò˨&âF/oJÚ6›ÍãÇq†A¥¦?ÐÄöû}bÁôÃ3SêBsTŒq³ÙÀsxï9ßÜܯªêòò7\êßXRXvlk¸j€©RÀdl¤ì›Íf>Ÿ¯V«ëëk”Q`Cô@®<¹. ÓøZªÂXd”«aRã0‰×€ki"‚=MdTXyDTø-D~,–¼6ø`8~, úšÔcÛ`µEEåív  ú±ˆüà“Oú¼\šîly]Í‚²¶‰!ñð‚¡9uÀ|¢€xš5â…Š ·äÍ“eǧâqª„K!—ˆ0«äwO1aïÝðY˜¤‡¡ÑX4¬y ¯EÄhóà?”Î6Cà(,D1ªH¾ë÷½s U'sµý4`WÓm êDD©à¢ˆ)ÉqHbÐü¥âkõ0‹ 7ÛuÝf³AŸRäÙS<‘\f²àØ0~a‚¬Ú2mx¿(ƒj(¬â!âSMÓ¬Vj::îï¶]߈§È$÷“eH"Ò÷½„£n ¾Gûp¨AJ¡Tˆ §3ÂÑç=lŒÞäç>¯©/ê®~v6¿ÙL²ò¾Û'qGJ¶÷}Ít ¿þû¼ÒÆÃ"¨“Æý$z: Ù’ÃzØ?^F8žåÄ;A‚÷àÐO~3= ¹O§æ4r2ƒ¼±µ¶ë:Ùoåý«Çëa¥…8DQiáÅyï<9G*lW<ÞT·ûû»¬{&£š‚éªÝε]ª¾äÙUãÇ¿û±ú×_EÚCcuÞ‰Èh4šÌfEQLF ohñw¿ßÓÉ€°åryuuu}}mŒA.…Ü"lR™út-pZ’Ç‚-ÀŽßn·ïÞ½ !E§uww‡#­°õcÄCç+YCÔ{ý“'?ûæþíùÕl9™Ë‘Öý¸°Ô~ FU•`47ïv;Pa‡…ÏÙl¿‹Ÿ¤^…,ËÀ|~ñâÚ^í0¯Æ÷›o¾¹»»ëºîìì ÅBDÄ8xûýµOôK@‰‚ˆ 7ÆÌà%ñ0䀈p>ãЂíC`­Ýn·(µ–ÙÁÄn·{úô) c’a ҃Ȳ ž|4$âu]+Å€12”†Ç IDATÏáâ‘ ¿}û™· ÃXbŒUU¡á*Æ,A˜h\l2QÜ8œŸTJ€‘ Á器ª >láårYˆcH|“nØsãñˆ}ªøbÙAÂÂòÆA ô”ÆŒ³t ßYâ Š`OÍ ¯®ëнs}} Œ-fvƒÐtrðÐxÌŒÆ3ïýd2ÛÜ9÷ý?þj}‡cUI¡ç˜Ôû9ÆéJM7ÅéqàÎ$OÆ­/¾/$NêØ²ŒM’jZÖfr¢ð•Œf²DÃï:š3çŽ=HÝPGwΑ¢SW¡YåYŽ}NÌ‘ œg""ã}Ûõ=Ÿþ^\0Úð|á#ù6f†¸Ür2†!=†K"ÀJ[N1 ³¨õ N‡Ê~EZR|A<>…+Áq3Ã,Î뤃“zô4ÇR€·éA—Š3X–%d”ˆ¨ª* fP ³¼Ò“JIdBAè·…eJ©†xÑÓV‡Kg¾ùøºµ™Z5Êul¿+|}¼rzxîiUù?<NO*¹ö£G$N†µÉØ¥7óC:K6×éœ"¬—ajNºª´WEäï¸Òô6="ʲÌÅã˜>Š—ˆÐE)ÅQ µÂ¨L°B¡ªô“燯߬·ëÝÒë`ÉLÛUD4™Ì¬µ”Óè›ÝßûÞæß|3ÞïáBœw@Ì®¯¯™y1›àÀ Y¯×p]t¢–puuõøñã³³3àð£ØÓiM‘ª&/3„Ü=8?`Hµm‹Fíìì ¶õý£N "6Æ8k5Ëäêìï­®o~þ×/¦Ë©1¦P ~,ìfœaò<‡ËoÛý úÞÞÞ¢‘¦ªªÅbdëùóçEQàÏ8]€[×ëõb±ÀæH)užçàív»>ø¨æCGJ$ü+@-x˜çÜn·C¥3ÙÐÄ¢ªª N_˜ J1F$âÀK³,CÛàåôqx)<ä×»®C%0Î|]×mÛ‰PUUhä…ãÔZÇ }߯×ëÍf.RÚåyýúõ>N·÷;DoáDGË2åqÓ"¢²,g³Ùd2A²ˆá ªðm ©Ãʤa½ð¸DÔ¶íb5üH,`ja„·ˆŸà€ÓªÆa¾à} Ò)FŽ{ Ebñqb5h¥±’þdZpÂ¥Ã0‡˜ˆpˆh:>}ú>þ÷ûÙÄqyì£%XN¿×+~0©t2=ð;HNP>¥ä Óó$xjï'¥UŸI ÷ƒuæ×‰cŽ“Þ4ˆ°eklòÆe\þLk"ÖÚXV,B()°P×´[ó˜°ÚÁù"€# +)¿Mø$釩§qCŠEÒñL†!ˆR 8Ê©“8ýªÓ½š¬±ó±\¢#v ¾ÐŸ:±iq$ý0  L2)”ÁœÅbÆt­up¾ª*š­å}Pä4 KÏZÐ[è¨"Y«¨ˆÏ¤¼¿¼Ú¨_å‡ÎŒÙñCš+'¡¶—È'™«œŒBÿ}ºí´¼Æ2Û­ÆÌÜ~ýúÞÇb2Ý”ÝY£ ûdq~q~uýèÉüÕŸüÙü«ïÿóÿªþX½ú\e6xÏJ-WV›åtžç¹;2\’ÐZF£éø8T@k}vv†Ò ö Šÿf˧AêLÜXÓ4÷÷÷"ïxìCk?²<Ïa›’p wG _žçëÉïÿä“ÙÅ(ËG­ŸªÌ«c¥‡uAy.Ø Å4rM™···Hz0× >í~ô#Œ‰ÌéíÛ·H™¹®ë‹‹ díà»"F6“plÄ×ð¸C2a¼÷™>~p±X¤ð ²”8ðÀšP­DÔ‚.d@¸nPÓL€¶ˆ$pÊ{Éñ'äeTœj¬[êòD&c<þ„)‰!@/óíÛ·×××pƒÐ&ûè£pûJ©fxaW 3 Á âùù¹cõ’VJ9ç^¾|‰ÖgNá Çãñb¶Ä漄O ÷ŽØxÈ/áRLsšûÂ}b)²,ÇhËVJA+h`!¨ãŒÀRƒ@7ÒdO ‡Ìœä®ÒQ‚¡i¹u]×yž³sEQX*­µúý~¿Ýî?d’÷kÀ饴J~”Nß”Â&O“|$ý;è3ÉUã b«#nHùGú6ï;>*4Û@F˱9õI;–RÊä&ú‡Ò2Âqkm<¾‡´RŠ((¥µÎ õHÄ"Á¹ˆ<‘¨ÄóJáûwì²Öš…âPOLèwŠZè$þHð¶(Â\´ŒÃùÑ K•\,Ž$OŠ1b'à %\„™ƒC=«tÁÉq*Òå´Î2ô­f“<ðÀ“³I±ˆR ¡$ž‘ L­Õ)¼O ÕÈpô V};FxèN4TB,=Œxê‹Ô ’rx?òìÃápssóâÅ‹T¢Ã.„j4VFDªªzôèQBEPBNðiòÇÎ9ïC۶ȼñC(:ç”|¨ žZSX7('c«%†*`y@åq¨HéÙ÷=|mâÐÁïbÞ3¶]Š´Ô z·Ýn±á0ñP)Žá˜¥¡ß÷òòa;¾ÞÄooá7¢† χcó¼\.Ër Y , ž/3o÷Ä(1ÆfŽÆ: 3À"в$«q8viÇÀ˜^ºÍ0D›–Of"üuvvFDÐMƒ›Ä óPÿK‰”µÀÑk„Ë2ÕÆã@ €eôÞÏçsPÛîïïÏÎΔ÷!Déûý~_õ‡ýíí¡öºàØ~·j‡2dzšTÄýŽs’“iÓß±Aé³§Ž @z 5Rèà¡f¼ ‘ bôäS’”j®øž8p¤aI +Fè ÖŠ†©ª—J§ c£¡(†S›:I¸Sß/%¦ +ÍþPËa桟í!Çå“yŠÀRò‚f!IÀ¦Ö:öó¼å}oÖÞwoü>›¼‚žp¢* L'qŸ€Ç{ KŽÿªƒo²Pº8êâ“Õââ§?rô—]u òÉ-¥ýcÄ%>I£×þÛÛßýJ=,O~zGië·±óHá°òézΗ>ŽŸÇø ŸÞ…þ7cfŽ1$ߤNÿ½ï…‰µRF#¼µy¦”š®–ãßýáÛÿóo–Æ6}(zÙèPWµY¿¾wm÷äGÏV—«ûÿùo›{åï~ïo^ÿíÿ/¾ùƒÿýq]g/oŸŽ&M_½•ý·Ý]¼kF£ƒ4õaT”€sGó+ìÑ<Ï«N–—çUçÄŒHÅxQE #S´mÛ··Û"˵Î÷‡Jk=[^*;º]¯›^ÚÐYeE(RÌL&†ÊÙ(çóÉ…UcMYµíÏ×ÖZëq±\.Þ½|ÙOÆ™ÑyÛû½ ¶Ìj[|òÓçÿœÆ•_÷ï^®ÇÒå2›ùfe6_ÎŒ1«ó%)QÌè‹Ýl¶!dŠa`yàÝÝÝ]__£ ·ßï!`ywwæ3<œ÷>)…`P¿t<™Lº®©ë}ι®®÷ÖêºîêzŸ4 o6H Yk‹iÁÌMÓEq¿½ûàƒÊqq¿¾»º¸üÅ_ÿü~}×uݸyï³9ZYnnnŒ1×××_~ùeæDò ´ žID\è1…´í›¶o²ÂîëÝ|>g­lžõÞmv[çœÉ¬0 “ͳr<Ú×UØ{·¯«óóóÛ»up>z!¢<·V›z_µ‡f{¿A²("‰½CÌ\Ž‹wïÞµ}S7Õb5·¹)ÇÅz½FÏÜGÏŸçeIÆÓÉÇßû¤,Ë¿÷üîî®s-37Ýa6›½|ùr½^c0Óæ ¿ÉmÝöÍòl±¯wu] ÇCUG4««Ë«à|n³íýRnx|hõO ÞÙÙÔNž?î½ÿâ‹/”RÁùùtFQ^}óòøž}Uæ_ÔÙlÆÌÙ p†ViÀÔŒ’SGp† ƒüÅQ 4s›Íf5Ÿ½{s£›u^ì¶Õ6¶mfJêE1Uìµå….BÐ.S://Ø’²1FïÙ‘Gçʤ]´²™µŠ9xWm6!„Øyö¢#įð|¤; òøDÏåçúº®ë‹"ï]Œ!S6ÏÞc¼gZçy®5E¥˜£¸¶SÂ#[Ä™$+sRÒºjГqÎ4fò5SÂÚfÑûÐ4–HÛLkMŠcŒ.„Ðu¬UŒÑGR&;´=3km}$­µ°"2†óÌä¹Ê:î4+&Š!t>(¥$GÎtÆÙÑŠðb±ž‘e™µÈ,©ï:Å\äy­uÛ4‡º~ws3N ›ÍFå(³*†þP'GÞGI©0êЬŒÆ,4*JD„ƘmØ+¥êý–ƒïëFzoM&Q¬6….—“åb<ç2E…¥ýþ ˜'EÑ6f-©I^æÊ¨ ƘVŽÒ§½ç´ÍÅdZëétvìDЬtæ•'¢IQ˜~\Uo5ʹ L•v;i]9”æœëò?ùoþágùç«_}}Xßå.,¬%R{å+êj´¹d­}¢¬r!„@“2$ˆN¨v•1†´©ÛŽi;)'&W19b?£W&ëÉyQL.¥{CÄ,E‚„>F!ÑJi]De˜9p%DCôÞ›ÏÇcRª©k¥”¢Œ£1ÊÄ‘ xpú”(cߌ!"‘bŒQ¥¾8_b’8¨¸³bSä=Rö ‡¸ÿ*Ï}ÓºllCTµsj:ϦßûG¿û×_^’/—Åtrùª®³¯¥½¼0ÐqÔ S£Ñè¿ûé?úa[þÑA­/_lçówŸ}5"5òý›®’Î…¨÷#“åy>O¦“éÕãb·ÛÝÜÜ…VŒLFvqpéß,&ýrêŠB—VkM!ì}»×V&E°Öú¦ÕZç™°±»É•ñ3CÚ²‰U ±²MM>Íë‘ÙiÖV2+ëYq8³ïív±ýöV{± M«UóƒÇ÷?ýøÅÿý«W_½XãCUÁÀ•e™—%Ú?Š™¡Ïmʉ¯ˆ¼ !9ª>0îËåòòò2ÓÂã=`I FF"…quZk¤V‰x…7àÀc±aØ Þ€ÆV¨@«ÇCÉó¼kZçza‘eŽF£ÅbÌ…Cd–H;â Õ3¥éõ°ù ÊÞ«Õ É ÊØ)ØLa)Ò},/°?të£åÕù ;u8@WN‹†B/hí@t…Ž*³Ùl<?{öl¹\"!F§Öv»ýòË/ß½{X¿Q?òà„6¯V+0ænnn.ÎÎO+]g³ÙÝæž†®ß,˰ ¬µgggÀ3P@åÒ{ß6Íýý=3ãù¾†Ú6|*j½Èrx“*X®„‘Â>j¥æÊK¯#[;Fï}ÔQk­Y“ć„ƒH“1šUìÅ¡–O°h,êUèÓħ™Pʨè¤öO€kü^Y>‚ nB›Í èY UEJk­å˜L“<ˆïº&ïÛ®oZWö¢r¥”FN–D1‰àÆŒ1Âä½÷(j2 AÆ=MqRƒSžç¹ëØù¾oà *"¡,KŒ,LüU´Ç÷Uå‡1ÛÞ{œÐÂÕùEß÷èÆ<ÍØÚÞ÷}_ï+×õEk­ˆÑe k$L BÁÕn‡MKC^Ž]ìʧ¸£4  ¨ x¦>U£Rf '‘NG„Sʦ÷E)z¦ž¼á8.ò?ùˆIÿü|fûmÝöÞ·ÑûLØ0e¸Wò0…3ÆÈ‘s×)k´h%JBB¥D‰Hîv9}0êF™[‚"úp’õ&~rPÑ«ÄÛAœCp“ë;ÃFk·(r *xï¨qʘòû5[[Îfef£D¤¨‘(û¨¢Rªmû´óSr/"V™´óÕI³Y¥YÒÌl´"C3Z#ŸÅË|Çqs/}hFŠ?¸Ê~÷ùèÇŸìñuìòÁ÷MS7WTæööv2™€+„„í®³ó§?¹û'‡Û³,ÌÇþ?ü/ËÛ¶úå‹§«™DCLf4/»<Ï'Óé|±0™^¬¦>æMÓ(3 R¸à#•!vÆÎ”Î&ÓYŒq·Ûu½Î²,PÁbE1Î˲÷¾j¤(&ÊÎzïi<•b|>™?š¯B6fÓ‹#YÛÑV•y6{þÚ¿üäYü`e>úpþînÒÄ‹¯»ßÞܽ|ýá~çöÍMS×Þûé|IáÝnwww‡q(0I觇Ç2!Z°¿Ø¸óùüêê SPdPÆaÀñHïïû~·ÛLY–‰¨œhp´ê„þ¤ @náÉ“''AíFR›5 €Q# \­V5¬ª*Æ8Ná À]’¬˜öÐ).çNFª¡¹yß÷ ƒ[íH ý²8ä1F­9Y.—è’AhÀ£Rj4!ˆV ÚTÂKP…)AÚôl4=}út¹\Bø/øw¸lйû1ƒ¢Aãþ/»Ý.¸c:ÂÌ0—©ÜwLµª*áÁE¨ª  Âb±3œ…`=뺆Ç=??_,mßa©‚`%Q%‰'=?ô>¼Æ'eHhœ<´Ûâ0¬©Å«mÛP„ÜŽìã{$,f–“?Ó€1Ò éÔcßV|ÂVSCŒ rL›4:d(vÆÛ g`Œ™–£Ô ¦¥kí¨(cŒ"‘2Jkm”RŠxTm߸¾íï¤éê&Œ{É‚ÖÚjÃÌÃ|êàXkh'êòé•c­'È]D¢DF¥£w¨ÚhVVß;–#xË'5o¬ð-œß´ëP>ƒÑØl64pÓŽë)•ZRù óæ ‚9hçyžSôiÛˆpÚ !ô.¢\‚HÑZ›ÙãØÇÄJAžÝº5DqÎ ÕHQ¤Š["¬™<+‹\¢ãŒf¥£-rÅFkݳ(–˜+GÞ÷x4ž~ðQýß.'¯^�éÞܹoâÍÆœí½*  ;!am™#3 —Ñ“"C¤¡‚U9‘R9³%m”’#¸…¡¯Žé¡-"Š}ôÃ"{âÀÌlÄ÷¥¢L‘¡”Bˆ°„,c+bŠ"ƒaì{ޱ N'ÒL E4“D)²Éi¢’"Qßyð,ˆY„Y)œ«Þ‡(:jmP§Ò†‹HªÿÏhñ+óî—UÕy©WÓ3Ò“:Œ~~ßËŠ³Ü·]ï}èB¨ûÖ€K=N‘ˆ`òÚÅÅEüéùÅÆüøËb1zò®íÿLçÿìwí?ýÙÛGß}i4é›SÙ|>¾¸e+çœûê«z» ?ø?¿’}/^¨¦™ÿûÌl­iÛ.ßíFûý±Ñ>F~ófzuuvvöæÍ›ê¿°Ë%ÿôyh[[yjWÿ“?Ùúéùóß1¿ÿû8Í/~¡µö“I×u_ŸÛþê‹Å§ß^íãcɾY¿îêjO÷gÅ„š~ló_þåÝÝ]Ýf³™Í3¸–››ô‡ÀSBlk¿ß#ÕÃK ýjhA¹ /pO c°¶Øñ!ŒƒNPа´ÎŽ>RäÝ™ðL~èçIŠH<ôÈ"oFŒ æBAáH&¸‘)mÅEâ¾üÀ¾NI€&gé¡cZñ¤ ˆü5ï#¨IJ©¢(‡’IxË{ŸbŒ:ÅÀí |„&žð¼ÐKDÖÚËËKÈ}\\\üä'?Ùï÷ËåòÓO?ýüóÏT(¥æó9”­p¿ýМV×õz½æ¡N¶ÝnqµXO´§cÀQÔƒ BõãñøþþþÅ‹oß¾¥3­6Hà]pûËåÒoŒqi„¾Oc|,fJvS¦B' ”x!Å?Ȳ̵MY–sì®R™Ð+"bõž¯ Î(³Ž1ˆÄA¨FˆN+s€ï´1sèjÃ븫£ˆ„è¼ø *Q‰ÌšXXeÚX…a?9â²(’âzŠ˜y\”1F Á€æaÁC #lIV#û¨"©ÜäYnŒq]¯ˆ)F{:ÐP+f”†‰c`æÈ!Ða`'‡ÓfåjÂKJx§Û±áãÐ8 j^×AÇŠˆ6›Mr®4L%mŠZ©0ç~.ŸˆF£Ñb6¡¯6-âlÌáÆÖW#Ïóâ¬`EBÑ·¯vûj‡ã¬ŒÅ÷˜,7Æ:ÊÈÒJ±ÑÖ‘é3¥T>*C׎F#E!º^iÒ.Ú¢ˆÂ™bâÂþÐZ–^þñZ߄Żç·?WÜoTl-÷Dž>%1Ï;9Ï9%áÚ¶­« ëÐ4×7~<~²÷\F'F ^»cÈwìþ@xj­-Õ¹dY´6=ýc¾¡øH9dr8t}_–âhTf9G!ˆÖbÄÅ '¥e0!«L S+"‡Ø+¥@õÊŒÍ2%BÁ˯³_¯?ýzü˯.ÖÕ¬®›æn¿ße£á.| ¬)î\o`aÀÑr¹Çe¿/ÆÙÏ~øüâêÉ¿ü—ÿêíÿø¿Ùÿ㯠“ÿì?v}}ýäÉÌÌFúâz?XŒ?ûì³?ü¿þðþþþ¿ÈêŸýìööö³WŸ‰ÄŸ^çàÁ¦®Ó%/ËXÞßßöùgËÇÏòg?ÿêçô§tqqñ_?ùg‡ÃaµZͳ¹sŽýO¿þ³?þã?þ±ù/?œ ãü7_þy–eà¸þã×?ù«åŸ~ѯû*Ë̪mž-ÏMfúú…Š$!|ûí·w›MUU&ËêºnbØl60 J)8àÝnÚ`däF‰†'íÙ)Ø\¸’·*¸ž®ZDÐ&‡‘œÉòâÏGÄ­xCÿÒYœa\›1¦Æ‚Η2ZfáÉ@q„?Cº™"z\jb¤7#÷-m‰á¢†9†"”C)xGG52`9²ÑL\Œ¤Ð’}ÑQ£¢²,ƒÒÄ 2UÅÅÅÅøC@âJ©Ï?ÿüööfµú¡3¹/–b³ÙdY†„ kZ¥HD`˜²"OÙ<î×3™Lò<¿»»ûöÛo·Ûíùù¹ˆ\\\ŒF£àüÝÝ>‹å½ù"x¥ü:Ó^“ÌYZáï8‰Ó8œƒ84x-À 4®<EÓZSÊD¦b›Êë“– I¬Ôè"9¾ËgNžȇÑ^3†øNèÐxÊ©T‘~’Døƒ#±À9k ªjèÒ‰g3ÆHQÐÇèØ¹DDŽ=²FkŠ®S‘`CòàSA‰V!šIDÔCÿñ1GáÁ%ëåNQæC ][+Æ`uŠ¢`ÚX )!ï=±â(¾ë±áqq‚àl”Ñï´,8‰™\&"ñ!‘ŽA„€aqCF‘RÊ;„ïÂ\áP§(!$ng=…²„‘Çh2-ËR+†þõ´2ÉÎÄI±-rÅ1ö†8ö&jc½Þ»ÎõÌÊ2i­4±¢œ¬Æ¶°£k£ƒÒmÝÆC¯šàíý9 ÎÎ ;IDATê¯Ó¦…¦ NwiŽªÃu]ßßßcΠƥ@›ÓSŠÛv¾¬yß½/~K‚âçãÏaµðOGœ#F“O°CfGg9›Oû)À<1rT*múîÔÇ¡HçÛc®Âïóí¼„ÃÌ–lNǸ磻g_øâßê/èÓ—ÛW²«žÍÆËÏ»5u]ô2Š9„phŽn0HÞøý*ÿøƒs±õ§ŸVo¿>,ÊËßùq¹_=yú½Ÿœÿäâââ­¼Fg˳ËÙe¡ÔOæ¡X®h<îLݨ¥ŒFãâ\O¶·oËÉDG“ÅÜ‘ºÊæVÙýþ]ûzc/Ã¥{nk/®Í'k·ž÷ËY7ÃÔ…{<ï¯Çµpù$[¶ÓÖŒT‘uÖíâßÌßíÎhÜNmo}×ÝH׫¾µ–z_×·›ûÝnw·¹/F£7oß?ÖKðìÑ« ¯†žS›•^À™áSyh·M5¼” BGæyjÒp†s:MyÓ²!”÷w¢þ8'Ó_q>Õ lÔ£Nw ÂÏ•RÙ‰þöw¬6 ½^p „Wƒj`ú¼3¥ÎÎ9 “˜L&˜Q˜A%Uj¬,µÚ“R*B@óîÐ2¡ÊàKÀ´BX4C‚_¡æ84~à(b¹êºîš7‚ 4žf–e“Ù4¥þ¸;c Ô…üÀX–x¿X,o?èÀ¨aöC2÷2Ôà±h¨Oó‰,C*Å%ü6Õ#Óá—¡Ü9F‚ò¾R µÛ<ç2šªïøHm¤CäöÝÝ:ƨHóPß5–µUБ¦k7»­« „ˆ¨kZŠB1çS®/žœs½÷1FC!·½Oq8F®ƒÖÛq†à׿õ1×05‹†¢2^Fñž¤{…û*l–à“ï<uRÐñ·ßOpþôA<¯'E í¿8eé e¨s7M-¬ÕÆ(¥F˜(E;Ž&˺/#¼RJ±Bsjçz¥Tï]®Õh4REæ]GÑ÷>ë¦ë]&|t.X2T*fã¼évmìÈ+fÅk-* ιiG‰ž|a‹i>1Â!ÆÈÝQC¢´¡UN…‚ *LÊl>)Ób:VãLgïl¬ÈÝ2“ÖlŒVJE‰]½#t6¢Å‹íccT¤ o2•1Î9öÇ ‹ˆªXª¹"Õ·}ióÉd2ÊŠÍaS¿­e/qÒˆˆ")ÿÐ1%àûÈGj%F‰$¤Y+Q`Ñ·['Š˜3éŒØ’ˆˆ‹¾ÙÚƒ;ÓWú¼œÙÃÝ]ón½Ûì˼@À9çcЬ%D ѨA° ®YKžç£ï&Ž.?¿}ù¿¾ûU=¢—ýÝ“p0‹lñÁêê“ë³³³>óyžÛQîò°«ÞL——£"Ä ¯Ýæ>ìâ„'æ{:|yûâÙøÙt6ó˜eÞ¸~v¯ê›§R…©êÊX™.ÎôNê;·=·Ûî¶O¦Oˆ²³2ŽÈ±Ñ×q+mmOþ¶½kß‘%u®K•µÔ¯§Óó|òø£gòë‹Õ²õ}Ûw÷ûÝÛwï...Þ|ûÚ÷mY–@Ýí0"¤±6Z'ü!æd\Rv…\6ù x¯ù|ÁÅ-K¸sœj˜c7âÄ“îñC˜?è¶Cïjiq¨¹¢yÎ>EN$“3Ƨ@¬Ã”ÆÄ÷Ág•zo«ÉŠªAsÜs"8˜“e %õ;«±ãñ¥P¤Xka×`ñþ”¤ôeo ‹L²Ûà7õ}wËÃ@ÌB躾 <,ØD4ƒ÷†¼z)®(¡nqvv\×õd2°(bd>ñ…@2dèX…ßÍm†‡˜Ì.Œx1*^¢b‰áeå„bOº#Ì00DžD¿O¡žµ6ºžò\¬Ult¦„zhŠDêœD¬¡HNEŸQ£¹ ñ Od|§¨ÕìFÒ¼ÕýÔ7B"Z$ËTÉÈw®ý®®õzòÕvª‹;댺ít×é>Ó52YëšíªøV)¥Egœi¥#Å–ÛŽ:¯£¨ãI”b×h¾Œ.UnH)r*öD¤P¦íCï´cæ:Ô±‹\r0Kv*9/ã|\dEPGëçÛþ3v…'8ú6íd™ÜÖA“aL`M!„žúè\¬v[_ÅìñÙãÃüü óåW®3]콃F‡RŠ¢pˆZk£Qßñxœ${Š¢øŠãܳZèWëÅ—ÕµLV4šE­2—i²°ã™W&Ë´µÑS]Ž/Ô}¤dÍyy–«¬ˆëlz¿k^¼º;¿úh¶œFæ>›©ïëC§îwn[…C§vuÜV¡u¦»hÚb¦&ó¬ dǹ£¬_.ŸŒÇD¤”f[;1zŸMÊI™ÌÚ÷®Z’l–/®gø©¬./bŒž¤:Ô÷ÛÍl6Ûï÷M½GrŒlÏ ê°×ÈÏh¨ù©¡ìÔ„Í‹œ$ˆ j˜L–,õ©›G}×¼ß\O'Ê;8cظfлD¤Ó .Ö ðÎ~r—ø¨zà'qšî¤ë,æy#5°4ñ+p›]d 0¶Rj½^ßÝÝãÅíó 2…àÆ 3ÔzjÛöââ³^¯a)Ò¤‡¦if³™¤ ˆh2™@jzãggg0ȃñ0ìY)µX,²,»»]ÃI#cNºTÈ¡»®ÃÐ@8~kmîcLÂU‡Ãaïv©g:õ…÷}ÏZ%-¬3 ª&§ p‚yÓ¾JäÔ8œÁ¨af”µ6-E!y®U¡ m}¯µÖ…]‰!ï¹ ]pı •!¡Ž¸*¤bZkJ}®,ö~ 8å[)¥à¡©—OD+ÕÉ üø3@üF[ãéôxS¢´ÖVQ‡CµÍ2c‹ÜZC!r ,Ëò²HL.b!Í,áa’’09çòc ÎëA°BNäó ‚¥ÑÖç­1Ñy©ªlЙ:Ô»þÐ÷Å´LxбRHšÎìt!Ý HXDä¢ãÓŽ¥‡ñbƒmñ+°Ô¾×£ÑÈhhtØ"œ0çdO†²º`—–e‰=ƒµùË>­Þ{›—€”fp´Y†˜}ðmÛJð.x«Mzô!ľï÷‡F¼Ï´&&Q…{ŠUô·Í¡kZ+œ)Í"™’èƒÝwdÆ$¢˜L2žyò*8öš{OѰ*TÜ·ÒJ !vÑŒJÇä éséó(6v!v>f¶–C¦Œ‘¸m¹ë|»UJ±µÚŽ1úž¡¦G¥”rNõ½J¹D©­•±DQ>ÄÖ¸š)¦y±^7!ø¾éÄçÑEfÑZ繦>cšD$BÞ‹c Š¢% JDLšY£†ÒWNkRJE­ƒæáü¯}´:c Vg:êK=ïÌòM{c ©Þ²¬þ_†ÔÅ„ã,IEND®B`‚qmlvideofx-video-edgedetection.png000066400000000000000000010425131225012771600404070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœ¼½{]Çy'ö}Ý}^÷=÷Î{€Á`†R$EбEo[ŠVÖÆv¼íή³Nmª’ÕfSµ©T*›¸jw+•Jüøc+Û•Ä^•Ê^gS¯bË,QG"%Š4 H €Á¼_÷}Î=¯îÎß9=g õÕÅb]Ü9÷œ>Ýß÷ý¾wãõß÷‡Ã¡¢\.'I"ÊDõz½(ŠÞ}÷ÝßþíßÞØØ°m;MS¥ç|lllvvöÓŸþôôô´ïûwîÜ™˜Ÿ˜˜`Œ%IR.—…RJÛ¶+¥²ÖZk-„¨×ëõzÃ0lŽ·Â0ìt:[[[ëëë½^ÏuÝF£177·°°P«Õö÷÷···Ó4ÕZ‡aX¯×gffNŸ>].—ƒ ‡ZkÛ¶=ÏûÒ—¾ô›¿ù›ïݺ ,ž&Ò¶ìjµúùÏþ—~é—Z­Ö`0¨Õjžç•J¥$I¤”QGQ¤”¢o„ˆ(¥¤wš¹ùŒˆ–e1Æ”R ”bŒY–¥µŽ¢HJI¯FsæœÓÝ´ÖŒ1×ucˆH7±mµÖ€ˆtÿ$IÒ4¥·Ð¨¤”œsšž‚sEQÇ4C˲vvvÞÿýv»½½½D)cŒ1V©T–––¦¦¦c[ë´¥R©Z­º®Ë9BxNIQ©Tö÷÷[­V§Óñû«¿ú«KKKgΜ)•JB­5킲,¥””ò;ßùÎç>÷¹­­-ZyZX¥”"ID\^^þ­ßú­_|ñË_þòW¿úÕ•••~¿¯”r]÷…Ÿÿìg?{êÔ©/ù˾ïÀþþþÚÚÚîîn£Ñøìg?û‰O|Bk=Ó4m·Û;[»ô"³³³³³³´_œs·äДèÑRJÚ/PhˆÄó¼r¹Ì9—R"" D$æJÓ”sžÆr4%IbÛ¶mÛ@ÛªJÃfùhíJ¹ÄÑŠ¢ 11RB¼úúþ×¾¾ù-gíý‰‡žd"Içuš0ï@(ñòøý´ôÝJó†ã¬FŠc2 Si¨”Òè€Ìm«Ñúi¥ÊïÈPø^çü5}OO[C,¦)6ÑcŒ$IEŒ1DnÛ6C.¥ÔcŒ ¥²ÔðË¡©Ú6ѹùžFª}ID¥”¢¿J™º®ëy%×umÛÕZûÑïû€ÊqÚ#íJ)Ûñc(xv+ÈÁ‘Y–Eüh¨7MS!Íͬ=W¦ÒLè­-Ë–“]&µRJ&Š„j"cºçœHBÁ³¯Z­×ëcµêX¥Rñ<QK•ÊTÑ:˜½0kuâ÷4íãÕÁ×SkÅ9·m‡s.SDZÖZ˜$BÓ¦]Î^Y©#3Ƶã8Ðíö××6ÖÖ6öööF£‘ãXÄ›DüœsÚ۳ϟ?wîÜB¹V¶,‹[vKßi•Ë“„äœÓsÑáQ€ç¸Ë©Øn«ZoÕ®Œ3@•h¥@jT©T1° ŽÃ8– h“0R©t=›d¬Ù¯ì̾ÓgēגìƒY)¥”’ ›pD)…ˆB¥Tš¦Â÷ý0 HFÐûtö»ívûÎ;ßþö·wvvh®4 )e»Ý®ÕjÃáp8ú¾OFišÒ¹®›mg©Ì9gŒ9ŽS.—K¥ñÞîînǾï+¥<Ï3”ËeÏóªÕªR*Žã H蓸‚€€ lÛv]·R©LOOOOOß¹sGÉÉÇñþþþíÛ·ï޽뺮çy¶mÎ4˜gM²H‹G9J)½æWELÂ…d ý©À¥RÉ#M%Ñ ùÒ}’$!˜IÓ4 C•0 G£‘ïû¾ïG£˜ˆsNëcÞâøË¿'² wGÄœ‰²ùgudžf1Í_‹sfŒEQ”¦©ëºccc¥²ø#DTùÅÝûýþw¿û]×u?õ©O!b«Õª×ëµZ¶»Z­†a(¥ÜÞÞþö·¿½¿¿o¶ƒpº87’§RJÇqªÕj©T Ãt#R8çŽã ‡Ã$Iâ8&p]×u]ß÷;ŽïûÝn·Ûí ‡CƘïûý~ßqƘ"‘1çœd±a3p,׬¡aW¥T’Ä4ÿ"i­ƒ`Dë#¥L’ÄHj'ºÔ ï[¼Yk£-P«-Üý~åúu¸q;zÿÁ(H¼²pÅ™ƒˆÎH¡>-ƒ#ö×¢ò¾àkæOEý«Âé › YS5o«p`õDAü¸F,ÐB¨éFÌ"„x.hÅ;ÄP5ä¸E÷’ÔùõÜqÇqÿ´ÖŽ£¤”¤mÛE¦»ì7¢ »?êxöø7fÐ|Œ('€±,˲]z–ZJ)Q‘ÐgiÂf­HèÕêJ¥Öh4ª•:)ÐŒÒRÉ“àq°RòDF®Ç!ûŠD­6äŒ_\­5ãÚ²,fYŽà1Úîîn§³/„06mÛŽã¤iÊ#6áœ×j5Ç+‚H)à è¹Ä2‹,?Ë“(.L@ÃI#ŽSbFÎ3"´¹`€C¿¹êóÀÓœ!CPÀ€¦T  ³§h Z À1INUœZ³Ô‚ ¤”£Ñˆ`/I’½½½[·n}ó›ß|ã7ŒYF·KÓÔ¶íjµŠˆý~¿Óé4ÇǺÝ.IišV*ÚÁ2#F£"’Ì­ÖkišÆqLíhN§V«ÕjµF£Áëv»Ãá0 Cb ’V´FFihµZ‹‹‹·oßÞÜÜ R* ­Z__¿wï™ÔžçÑ&éÃv'ý“Ø J€O$Ð"Ó?I¬xžW´€iG l ·Ch?E錒€¤†é@ßGQDÓ¦õ¡'®+¢¦QÄÌr–Sdõ¿/®Õñoˆâ‹¸~ÀxŒ‘ŠçyÞìììäääÇ•ÔFÇ$]@Ô÷ýW^yessóÎ;?õS?õôÓOÓ<ÉfŠã¸Ûí^¿~ý•W^ÉÍ&RB±ÈðŒ±Z­EQŽã4 Ïóˆ\‰ž···ÆÇÇ-ËŠã8 CÒfÊår­VcŒ ‡ÃÝÝÝ~¿? ½a’$žçI)ã8¦5'‹–fnY–eY$AˆÞh‹i’$¡ÏqÓõ†hËâ86êlQ/«Þõ¶=}ûá·¬ *ý¿ÿ¾î¹/tBðD„ ÒxGA­M°¶1jI‰JBšNôãÒU±û oòÜê=ÛÛä¬/ýóÀo,Ÿ –ë0B™ ÉYò‘òMKk¹‡9Ë|þx;r¥& ˜ÿÊ+"2f“зm›ž¥$˜ý20©µF&cšeª'CBt©>@{>>ŽhÛ–e‘`;^Ɖ©’RJ–YÀ(³+…t%-/ RY©€áÁ#Ž¬Ø‰ß™stH'­¿Öª`È\Nª§‘–PbÄ’p€‘)DŽãîKޱ~¿K›B²‹Ø‡ä9±!³X¹\®Ô,í¢ëÆþ°O&#ÇÈgš qÐa>y8ŽÉ IÈN§’#+•JEïæ¬8mDQwTJaþùè:³L ¢ù˜,Zwf ¢(¬xfÝÇqÜét666ÞxãwÞy‡ÄÐh4Û¶£(*—ËO<ñÄÇ?þñ矞1Ön·ƒ k5È>CÄz½^©T ž¼t™Ä¨Y¬0 ‡Ã!r6 hÍ6Ø"æ¬×ë–e%I²¿¿¿··çy^EN§hg@¥RB,//ß¹s§ÝnGa IÞ^¯÷àÁƒíííz½n¨ã4z¢nk4Ç"?›+¶¹ \.Ÿè‚6??ޏæqÆ­G~rºCæÑ"…ý°õYÄEs·#ÿ4DFœiì`ÎÑxwÍ*Ys#a‹÷4N¿#×!fffÎ;×ï÷Ûûº í8M•b I’\»víÎ;«««ÃáðÒ¥K“““I’$Iòî»ï~ã߸víä®(¨«f’ãããZë0 =Ïk6›•JÅq­5é|kkkgΜ᜻®Kˈˆ•JevvvllŒ"ƒÁ`4F£ J¥ÒØØX³Ù$R¤×´mKçV)޿鯅Eš%M,•))O´F–Ëe³)fécI¸×˜ »ƒ©J½ñçÿ¶úÏÿñ¨ lë… €Ø×@È) g!é«*p€”@¥EÐþg˜¶ÿ=yê·ÓÉ/Ùl­‡ÿ€´÷ã ÆJ¥Ùdô“9•à GDÈìË“u>8,㊜h±ÊAÔÈ;®ë¸®ëºçœ1œY–e!;ä)…H40DT˜ë¬˜»4PÂ1 ú`$.^@S2ŽS¥00$0MžVϨìdÞ‘HÌMCTZÊôà·ÙL³çñïOžd*>Þ.Ž#ιÖÀ9OE[–¦Š ‡sé“,`@-e¶¡Žã´Z-ŠX!j²¾ˆøã8fyL§ÛíFÑh8¦i%©%)å`0 Ó.ó<ç §0[„)ý›b^Ó(4 GÅ£¢X3†!'íÎü@æ.G`˜9G´>ðª&4 Αs‘/KJPK;n–.`™úóp8\]]}óÍ7¯]»Öï÷‹4JÞé………^xáãÿøùóç`8Z–5 Äo¶m—J%Ïó ù¹9˲¤”¾ïSÐKkmYVG@ž=Â~òfÇq¼··GrªÑh´Z­$I,Ë" $5±4…å|ߟ™™¹råÊêêêÍ›7“¤CŽhÚÍÍÍwß}÷êÕ«“““Œ1rtâ.ò†.Œ#V¤ì#”J3/RyQîØ %<Ã$—‹Üb‡‡DÍm‘UQœù!=‹È”´‚‡ã2«è;¢¥&@B(•¼7·5a„bʼn²6 ©mÛáÓÓÓO>ùä`0¯ÇaB«äyžïû„—t1…$^~ùåÁ`ðÒK/]¾|yffæìÙ³A¼úꫯ¼òÊîî.©ÉôP㉢½¶m{llLE‘çyãããFc0 ‡CRºWWWïܹÓjµˆí-˪×ë¶mŸ;wn||< C J)¥¢(✷Z­3gÎLOOS@7Ól@]˜¶r‹¿(øL„,J"C!d ÒÂz]l–—îõ8­¥:ùgÿ%þëÿ{Иh–¬É ·ëñ‰TF0 %0€%tœè6ƒ&D€’ Øç¤ôFr<üÞðjiöw\«%,?ÖíO?æ ·0þyòdP¨Èqò±€ôøùç33+™sËòé¥T!¢w¢ œ ú‰ë9–ežr\{bbbcccŸBi$È5E2 ƒXÆJ© ŒjÕ†e9k'I²”4’(2È•.ü@#¼Ä¹à0­ã°!g ¤$A)NÏCÄÜišÙ?fž$RùA¾HAË<°€É¬”ÚÙÙ¹}ûö믿Þn·éa¡à¹sçžyæ™+W®LMM™ &˲(Xëº.P¦ Y9&fIcâFÛ¶å ‹EÓt 0Â0ìv»ƒÁÀ÷ý NŸ>Ýl6§§§ÇÆÆF£-áÙ²£Ñh8V*•óçÏä#ùÚ×¾¦”ê´»Z2€ÝÝÝ{÷îíííQ´&@4td”<ÎÆbÖ¹››¤ÆåKOp]pA}”ËeÃÆÙBÁãÖ8‚s†èVD‚ä¸Ã‚BMþÔÊЈl5Rt<Ï#Ö-:Hiòa"¦/é-Ò4Î)‰zâ8¦Ì/£¢-r; ³¼ZkckµZKKK·÷îÞo·Ûd×ö]j­lj¢(Š¢×^{íÞ½{W¯^½zõêÇ>ö±8Ž_{íµ[·nAå%£Ä+s‡ÉÉÉz½®”¢ŒÂf³Ùl6)FN/H9k£Ñˆ‡ëºSSSÍfs~~ÞuÝN§C´Jþá±zsfff~~ž@Þ(MS©Ó#ª’ÙÓ¢:¢ ÁÚ_JY0·²…S´ã³!¬zÑ^åŸþø“?Û­Vg»»À`g8—‚ „Q:BŒB„ °7A–¹ÔÈT§€˜.i{Cdz ¤ºó4¨Ï³ùåMGɦÇ2Šàd•ܪžç‘žA´„¹WLk­ôƒWçöÍœ;$E†5Lk~b䈎‹È…È´¡g,Ä2€ËUUÈ e©Ô±0êÛ…ÐL(õ’4WœsÔÆ¥™ýÐÀ­‰jcAÏVyfÆ‘§ÿ ŸOEý£ø™ü½4aβÂæü¨á[þãÕ:†AÊåòÌÌÔX£IPFžAjÊoJ’¤Óé¤JkA¹\m5pXÙ"L‰“ØXS†ä>€!wV)žo1*ƹyâÅR%¨´¦´Ò:w(*e…(ƒYÀJÅ’ÊJS‹J „Ú‹ôÆ(áþ0¶··}ß¿{÷î›o¾¹±±AZ¿¸ˆ811ñôÓO?÷Üs.\h4äŽö<Ïó¼DÆRÊR©ý~Ÿ‚¥Ri0H€ÜÕI JD „¨V«œs2JHÂnmmõz=âXòÑ—J%×uÉŠ5 Y¾ï7›Í¥¥¥ÅÅEÇqîw:]̃v;;;ÛÛÛûûûœójµJÛl`ø‘F¦½A)erI°’'„þIΙbÄ×€.,`ò±˜w§%¥‡z2*6cŒ|ï½÷Š™çôs›‰Q­¬¬lnn®®®>xð@qýúuB©$I\×5‹IùÏ0;;{éÒ¥f³I© ccc­V‹òÀã8朢I׎ã¸V«MLLT«ÕV«U«Õ(ý*Ò)]ןšš'¹o¹m˜ük¦ ®ÚPD¤nÈ«Ix6j‡ùIF?nåïþÊío}c¬^Ÿèõb`v¥´…0Œw*Ü­¢rÃ\dްç Þ¬r¨sÔ*À˜Кé9-B¥Dš´üÁØþµý¿Z~€lúñ‡Î³óÌ?i}Hÿ ,ò@𦗥לYÞ"ú2Æ ÔâÅÙ×Ìà.Aˆáh¥””9ãGHîÐT=%»?0(ÎI©5\üÁë`&I3!aèy㩃RÈ4MUš)ĤؙëIyeŸ­ª”•–ZÁ “?ì–/~ÿ¨ d8¢ú“»>_ùÂúƒ.†Õò„¦Ì¯~D3 ýI’Ì7Fž9­%c¬Z­NMMqÎ;½ R¥½49M£$Mb™$Rp¤<Öb2PǤy™%:¢a˜‚`¶-$ƒ$É ^laEñÈ(jPÐ*\›bÀ ù i…3oÊb@ÄN×§:!¸”™#É[}tñ‰×4MƒÁÆÆÆÞÞÞ»ï¾{ýúu Q¨s‹-Žã………åå奥¥¹¹9ÊiªT*”S¯×)å•Je´Ö”xlòÓHÊGQD1àv·C&lE”ÒåyåÙ7›MÏó†Ã!YÃtCª’""®×ëFƒÑÛÛÛa–Ë剉‰Ó§O3Æz½^·Û%,ÙC«««÷ïß§µ®T*pXk3â”äLïb¨ ó\V²\‹þC((ºà“Ô‡³7‹÷×Z“H*Ú¦æ*3™¢.o¸Ôؾ”䙯VEš¦äB0LØ …H¿-Ì tÒ0è¶a( hUžåD!Ì¢¬ –GQ †ŒÔ rW×¹^¯»®Ûl´¦§§µÖï½÷^ÑL$z#:!‹ãøÚµk·nݪ×ë{{{4=ú+™ª⌱3gÎ\¼xqllŒ¾ñ<ϲ¬ééiòÍ â0Pv}¹\FÄZ­fYÖÔÔ•‡u:`r P`½^'"'¼Ï|,SçÍ~e”“jUÈk;xw³ŒFĤiÊ€ Ø„µÒ4ýÏþŽýÖ5àú)p€MÍ$µ\g&LAÆ ”b–iÇ|ë J¸RiÍ$­™N˜ŽR°ö/+-RMŒ:è7çÿóGɦÇ2 Ù:!:¯Õjä*—ËTFf1­Y3 iÅ(æƒhƒó4 Ǧ}!óÑ`§¯eI)" .8ça”BÁkj¸éY9UcÞ+Z¢,÷‡}°Ë›^“ 1J¥ 'T\Ó£ 3ÆŠù}Ȳ¤hÊù°,‹s” ) ÚLɬ<" ë¸ùNƒå.ÙâÊC®@dJbj!· ‡É|‰rf…´¬‚ EÂPض­AEÑH)eYgP¯×é&ƒÁ€ÂOA@ÅÓ¤ÖšE1g–m»ƒàœ aî BÄiz `é£Á²ãC¤†^o°¹¹¹³³“F±-¬8 OtA3•OÂÒZkH AayãããÓÓÓhˆd¾üGè\Ã0àÁpôÝï¼±µµµ²²‚šqÁ¢(ªT*B«×ë/¼ðÂòòò¥KË33SŽcÁ°R)¥i†Açœ|Â>$m¥Z­B©ä8ŽV*iÛ¶ãºÃÀßÞÝé÷ûÃá°Ýn¥T¹\n4•Je¼Ùjïí/--šÓRüÀs\[Xkë½^¯ÙlrλÝîÆÆÆO<dR´Ûí .üôOÿô믿¾¾¾¾½½=ø[BJy÷Þû——*µ*·‰fÒ*ÈW RJn1­•Ô© L3Ä$I£$Jd„~½^§z `9"U‰¡³ÄÄW&Tc6†šb‡YØ’£™¦‰R Ñ1º[Ñt–é=&²›ÿ‰Y–-¥LSå8^­Ö |ÛvÛI[£’J…ñhÝ~ggo»R+7 Dtœ n)š „@Ôqª¬”ÙPˆ@)ЉLÉ\£23“mnYÖh4²m{¿Ñht»]!eÑõ½^ocsƒ˜dzrf0Œ7'Â0 ‚ Z®E£ŽO &PtKÎ7ÂQ,[ “M–1y¤©Žˆç™ÛBˆÑhÄPE‘lqqqiéÂÜÜL¥R6·]+‘q©â]\P O'§Ï†¾”²R*—\o¼ÙªÕjSSS¤ÆíîîvÛ$еTÁÐw]·5Õ€$IJ¥)û”Ç«5$iJÜh òÐTw‰2‡eü‰š©T `– ¾ê4š:õY‰`)v»¿÷»?þWpdˆôlÐDH•‚¨ÀJ!Ò çÀ" ¤ŽVZ#& @ ´—1¥¦HGKƒ¨ò/T~¯¤/®¦ "šBÕ¶að ê&hÔ)P P!€’âÅ†Ú ÒÈ‘€ˆÄžƒÁ ‚gŸ}Ö÷ý È•-R¤X L Y¤ÏGç}út½^'‡°ÉLÑ_ ÙÊä$ü –2°¨xcc£Óét»ÝÝÝÝÁ`@z1U¹ÝÖ ¥¼uëV³Ùì÷ûžç]¼xqnnnñÂùv»Maé8Ž©#ÄÙ³g)цüá/^$ýæ›oI))Ç`ccãí·ßÃðâÅ‹ŽeA@)²år™Õ¾ïK’g»¨ÑR™ åp”Ëå4–E¬eyæ0AÝ ã42Þió%Q¡QW±à§Â|(˜Ëæ³Ái“%‡½@dG’‹†j™WšÑg~¸&^„,cªš7vŒ#—©Ô Ö? ’­¥RI)E‘ã8dü¾aNÇqÖ××Ûíö ?<Ji­Ã0$[ü ú£ç¹A@«Õ:{öìÔÔT1àM"¯R©Œ‘ÇsÜ$IªÕ*¹OH£BDªƒ§kGÉX)—Ë&{ ¦¶™ƒ>ì‡7V,RTŠd`¾Ç,Z å‡NÅ©("¶µÝ™þÍÿñ}€Å’—?öP½Ÿ“ýïËú÷Y< 2p´Øí=¢lò‡E'|§ݧEVêPï1;êG5Kdz;€s‚=0Ž˜?æÈi;gaÍrÿÇ¡´)((%Æ"/’% .Š¥•hZ-W3ÕS¶mOOOïîîîìì¼çž© ¦ëÍ+¿+„ÄHã®Õ*—.]ºtékMF"£Ra’”2…qSübll¬Z­Q Ùg”=gYV¹\¦N Ñíÿ;2dMÏ™‹¢D AÛ ´` †*€à4€1€ØTd+P© * 4ÓtàMκó¯ÿ­—¿õÅÅ„{r¶ Tk»¹¹I¯MtN‰'ô>O>ùä•+WNŸ>Ýh4jµšÎ£_YÛ¶MB‚mc„‘ò2ÇQJQŒvss“ä,…o[­V¥RáœÏLMoooomm=|ø0ª Y]]Ýkï·ÛíS§NÍÎÎj­oݺµ±±A¯×›˜˜ Àaüùóçc««ë¾ï§I²µµµµµuûöí[g.^¼¸¹¹yþüù©©©‰‰‰f³I¦0Ä«$IB=@Ò4ÝÛÛ3©aaú¾?35KRžB×”úD¸U¤<32€Ì­aLXƘ”‡D•Áì# Pý“HÐãÌü©²ÕyÎW17ŒÇ)·Â¹i ”Gpužmn2YÈúçyk š±‡ÉÛ"5…1VrË$tF£‘é]Çq–U>c”„Üï÷Q³ÕÕUß÷eÞ ¤àu?XRóRP­–¯\¹òÔSOÍÎÎ’nGÓֹǞúaQD|Äé[¦(.biÊÌ"÷†ã8•J…ºhÑ+½j”ÇP´±Š†,6ƒPÐÊ (ƒØ.9J',ð`wâÿøßï—ê‹£þ£DÙãRë¸ûïZÃe&|¡Ê(B6žÜoòG†ZŒ” øuì!S˜ôT^èðšÁŒ&™N ʱPËr?£|~¤”ˆÖú ìçÈv<–A¤¥T¦k&÷óÉÃ¥pØÍ§F¹”¶Bÿw‡3€I)WŠ“()¥Òya«RxØô?þF÷ÕNGäÏ‘'ôýAîc$aQg5·%5…2ä}ßç6®­­u»Ý§gJ?‰{Ú2ª€C¹5æA ж„Žª®7ŠFŒ1™Æ¿þ?üwý-·Zû÷}ÿÓ2|‚UæTäwûQ‰Ïì!hÀ…Ö´à qÀ@3ÐP¤€  ÝÊ<Ò’aE“Õ@½Zú·|~w÷Kà.ý½¿óŸ|ý+¯ƒ[?q}Õi´Ûíáp¨òþy¤¢sdvvvbbbrr’Ø&Í;êV‘iEò0•Œ2}È ¦_9êÌGÉG¥Ri|||nnnvv–r¯®\~rkkëþýû¤‘ˆÜßß¿~ýz§ÓY\\¼råÊåË—Ëåòþþ~»ÝÞØØ‡”ºEQÉF£qùòåóçχa¸½½ÝétÒ$­Ôp0x÷Ýw×ÖÖnÞ¼yáÂ…«W¯^ºtinn®T*O¶ÈÏŒyê/õ ¤FÊRJJ6Žã¸ßïGQdq›ÄqµZ˜˜À<Îzœ|‰£¤ÎJ×i­L¬VW SÒ»Aå#Dl>µ~ó8UȤI²¼hïKècÃüó„LÈÁô¤†B'HLPH3æ¸1ôÉ -8͆’¸\.¿øâ‹Fãþýûdš72Ű T”ÅÅÅK—.ÍÎÎRñ?(”ÌJ¨ì›ÅUšÅ•1Oú ,?–WÅÍS¸¡\.SRFÍîÐ5Gä |F!‚æÃ‘” g ³qóÿH+%¦Àˆ–€2¿ OYdçŸ5Ø ŒØ p5VûÛ~´½þÿýùÿû'Ÿý•ÿøÄyŠÁ`Ðëõ(krIŒG‘ÞŸÈ¢Z­V*BMS^IkG‰6ÆwošÑÓ)íy0ð¼å¤ã8sss”ÕÖjµfff¨Ø—Zn¹®Kí罹¦¶·····{½ÞÀú¾¿²²²¿¿Ÿ¦é™3g®^½º½½ýàÁƒ$I‚ h·Û´CÔ`åÔ©SAT*••••Í ­‚s‡¥¼®¯¯¿ÿþûï¼óÎÙ³g›Íæ•§ž<þüéÓ§ iÒ4¥¢”n·K·%ê÷ûÔ#‰Œï0 )5Àdè±BÆrF lú ¿ºè|;ÒÀÅa*³æãòpïÌ}zggçÁƒ;;;DfñÍ(•Jõzýüùsóó󄾄¬tˆ©R£×BLã$MSr˜ƒv»M-ÐuÞó‹sî8ÎØØX£Ñ ¥Ôñ¼þ¤¸G'óü£3c‹*}#‘±´5’0p¬ú¿úƒ-Æ`àÌ£dÊãÎVÏÊö§åÄ¿±J{ˆJ«*çýôu?ì`…>̘»d1Š¢’ GTF£ jEŒ@ÎüƒŠÏâ(þPÝ\€>ì 6<> FĬohFsfù<á°l»U‚‹!FÍ’8e@lˆR"9¢%‹”C)Æ碨äe²äÃà5þâRüàÊÍq%ÕH* ø.%ZÖj5·lSùÆîî®aÏ4M²Ôk‘4Ï‚Ôüh½x>y–jp'J"ÏñâDýáþ´„w­ç*åÙ¡/a‚ÅyÙ–£.Su­A&€ ` 5H.- Ö@¥5³P (d ´$Ï&§—Œv@,;ö%>õ¿õõ¯½üH¦ô%JH[]]ÕùÁ¤¨’ûèÖ­[ ŽãÌÏÏ»®M½„ºÝ.ضMÞ¼aà§yË=Òk€âjÔØŽj“šÍ&ð¥ð-ç¼ßï·Ûí~·GVµ”’ª’&&&Â0ìö{Ôç²\.¿÷Þ{÷ïß_^^žœœ|úé§{½ÞÚÚZd®U*)åââ"ç|aaarrò­·ÞÚÝÝÂP¦©áö~¿ãÆû÷ïOMMµZ­½íååe*ˆ"$±-óÞT*ŠIìíí•Ëe™·¿fŒQ}‹ëº¦EÀp`YrNª,ˆ¨ ‡@±b²È ¾¸¼Ê<]” ‹y]/Ñôh42%³ä· j­Ó$1q\Zج JpÚz‚m«˜G7 ‰adÞžš6åmRè3Å ª)+ÊuÝRÅëõzÐZÓÿÓ4u¬.ãÔï÷vvv’¼é·Y㵯׫:"ÿ?y±èƒIù–y6u©TJ¢,5Hwccƒ<Ò,ïFµpDFc0ü,óAô1çÁITDY|„³$Ç8ÅjÔ ÓÝ{w«{›•‚JuÞ‡;TUkNÉÁsºü¯U2¦¡ƒúñ /¤í…R)E}dM Ñ«Œ†YcZdeô¹¢^K?Éè!kß!µÖÀ4üÀðC •Þ@NäYú$¡„2óFŽçR6i„¦I¥Rk©4CD:0 `*å*?ãˬ¡R*O7C,ä@üÆ6º”ÙÍ#[üWÞǨþXÈ¥0ÞSÒÅcžíMNN’\"†B² ÉðSJeÖ3;#§§(*_–©‹qÆÞúËÕúôpðs¡dàï”Kår«Ôï‚-@vÉVT:³t´Ò 3`&ô5îæd*½(Ú›¤ëKËå‘?jG±Ufç"åÞ¸yýQë#HͯÕj“““4õ4?zìQD¼víÚäääÎÎÎÒÒÒÅ‹ç-Ëêv»ÛÛÛ$vÉ%›ªÌÀ" qÍ@YÐ$²)%Á¤ïV*:ý†üÌûûûI“ú³¿¿oYnzžwõêÕF£ABùý÷ß眯¯¯ß½{÷…^(—ËgÏž5nRÆX¿ßŸ™™›ŸŸgŒíîîNOO¿ýöÛwïÞí´Ûx¸ƒ÷ïß¿ÿ~úëëë<8uêÔùóçM5Q*•&&&çcƒAwooommÍu]º'ð™3gTtžIN~¶Te \,Oq¢Õv,Øû $ñHËC^Œò<ó¼ä‘º¸a{£'çy&ñ }¬ W­dÞ† óF‚aZPS A“EH Ds+æýšŸôÖ¶m'QJs° Ù¶-lNDBw#BSSSÔˆ´\.W*•'žxÂT°è¼Ú÷}:W±Ùl2–™Â´ìˆHI×ä$×…ƒªH!°m›ÂHDØÝÝ% z‰›ŸW*•R©T„pžŸ¼&òN&¥ˆ/‚PQ6EU?î5<„p¬R þÍAV+¥ÁÀGüK)S­†O+õGOj±`*PÃ8„Zë ІlQgkvsqÝ ÁsÎóœÅLøAîå¦ÞUxØÌ"|{,ãˆ^eÎÒy[ù(¦@[–•jÅXÖÑ™F¦ôAãŽ"@®ò¿×Yßì×6ÊåSðð:ÜÆ skÁ$—(¥8 Â`0ØÛÛ3Ò/‰B›TLO&b’$–ÍŽ¬˜™°Q.K¥Ó9؃~ª0´K ÆÝÀgc¶ÕŒãb6h­¨ŽÑ„¡‰äF¥3c49Ç €ÍHä0︛~ï6¯8–¾ì'÷¼z3L¶µ>Â+»N9<õ‘«ï¾w“¤ÞÛwAyƒÃ0ÜØØøÂ¾ðÔSOݹs瓟üd¯7HÓ´ß2ÆF£+¶ki­©(ebb‚$,e᪼]e­V#iÛv«Õ"O55ëèv»Aø¾oYÎÆÖöÊÊ Õ{‘4w]7Œ£©©©'Ÿ|ò‰'ž˜ššzðàÁ½{÷úý~†ÓÓÓ“““Õjulllrr’ÂÀAÔjÎùÖÖÖéÓsW®\¾ÿþ½{÷Þüî_nmmQx (ß{÷öÎÖî;ß»1==ýÜsÏ}âŸX^^žžcŒmoo»®»¶¶F e„U"ãa0Eµ)ö;{–eÕëõQÐë»®K€MN`™(D i*A!wç\i%5EÀr„íZF_¡e1$nt@Ï)©TÚ¶8ç­ñ$ŠûÝ^¿ßFaêüHµn·»··çÚÞ©S§ÇÑ8 [؈¨Q£K67Ù”Sª¤”*Õ®í1Æd¢@¡`YÛÎ4k•*aRµ\!†±¸H•4 ªÄ!”1¡e'¦âŸápÈóÎ!žSòœ’ÖZ0KK̪WiW«e:`±Ùl°¼åÍÀ´S&ÅŠlÛæÈˆ~ÈÈ óÂqn :$›†ÖµZ­Z­ö:] t‡ÝÝì¬_D´»9Þª×ëe¯2>>9Ñš®”j·)9Ÿd„qÉ|°Ì*F*Ú iáT±:ÖGѦt †·¯²ÂÁÐaXþÐ}‹*ÎöFÙèðÒ:ÄªÂøPå%…Œ1aY”°Ã$IÒTkœsÆ‘òx–Ê{€ D«a ‹–p€Ñ2A–°IKG1¡ØV¤'…©Ã“©Sθæ ¤\s®×(€[;sU¨´f Y#äyè¸a!µà¦v(JGRi†ÈhËà@ÃD›q†œ+¦µFŤ ÿÐV²|‹A í a ‹IMž[òʵjÙõÈ+CdiYWŽ"åY¶Ë³ð g‚g§2PO ¨¬§,çwÝ’ç–=¯j[Ž…È@’$BsMM2øG­´J‡*q‹”É EqÚ„™‘^‰*‚²€—Öh EóGDòQ óž†,Ï0×JA®ÅÇe‹ `Y–EÔ¢) È?r^¶‰9@ªQ¥Ês܉Ö8jàÈVWW÷ööb©a!5ÕZjý »ßŽGa¹^›l4]εd‰km @C'–BVÊ^"X (å Ô °À‰C‡Ž­ã4t,-¥¶,WFa,JiÝÐý'@GjÌJúÀ{oE!H¼©M+Ž=Ç A{%훞{z”lÇáèp¦·9TC?öÀfZ¨„h 9 àœY\ˆf³IÙ1•Jå™gžAÄ^¯×n·‡}ŸòÚ’7n¼ûî»J©gžyfbbb8bÞ˜&MS¡Žt};HaUy^.¡Ö011AÇ2ƨu¿ßw]W) ëëëÝn—$¬¢ÛíV*¥û÷ï¿óÎ;”øúÒK/]¸páÆDIÔ/b4õû}òIîíííîîj­«ÕêsÏ=÷ôÓO¯¬¬\¿~ýì™so½õÖ÷¿ÿýv» ynM*RÍêÉ`ª-ÉCK‘!Äææv»Ýîõzä!l6›tNÜ­[·hãß{ï½õõõçž{nnnnii‰u!¢)Þ%Œ÷}Ÿ¦½··÷½ï}¯^¯ÏÎÎ.,,<ÿÜ ï¿ÿþ[o½õÚk¯½ùæ›Ô#šŠŽLŽÒÊÊJ«««gÏž}ñ§>677×jµ(éš<™Ýn÷âÅ‹‹‹‹ããã7oÞÜØØð}Ÿ(õÁƒ”m166FFý³ìeÅÓG$Q”„FÄ«B'aZ.L•yMòƒÃ@è­É¤+¡ÀY¯ÔÂÙy˜åsD¤*÷ó2i-óCÐr.ÊÀLæ]±2OoÁm˜æM+•RÀ3MÂP‘Ê»}‘Aȇˆ¤P„›òëÌ\.—èæq»®kĵ:0½¸ Z÷ ¤…"Ãz0PþiÆ9§¢£F£Q¯6¨ÃŒmÛÈ@«ƒÌ[3Ì[üà¥x“"„§iäºN8’LT×*µ–€6#jåj Z–4KRd ¢ÍòæM,?‡£(jyZxìAúBoŒzzT¬ãÒc¨÷G~ú>Žpöâ‡{°˜‹éÿtHG„œmaqÆ92ŽÌ–cÙù}Pk­ôAÚ‡!T£÷¨Â â¼PˆÅ ÕÒ”1^„^ T’ÇäšNÓ”´ÕJ¥’·ÀäÀ,o£ «šÎ3ŸØ-38D¬V«J© ºÝn¥æ™7 ÅÐe5”,Æ•Ës_w’$ 4‚­³Û" †CF}òwwÝúù$”–%m?±½½½M⯳߽ÿ>åMðB1x»Ý~ýõ×¥”/¾øâØØ¥«Œ•«¥jµ:==M'ÒÐ ¬Qmoo'ùyA†É‚¤ó}£(ò}¿×ëQ©Òƒèð":ûì‹/¾ø¥/}é[ßúÖÇ;ùŠ!¯£ØÝÝíõz·nÝ ãÑç>÷¹ÅÅED$ NùÏóóóW¯^¥ZDì÷ûô‚N§ßï;ŽC]…©§mÛó§Î輬¥H¸*/ý2€áCzßMó³3µÖt1½uæàÊ-`ƒåÆå`Ø uæMYÞ{Ö0ñŒÌO“ÎÙé Ç/ææ©ÖtØÉÞj…PMsÈÓ.h\ l¯$‰ w¶S~rfÔª¬8í²©?®T*d.&³03îÍCÉ5EÑp8¤„Z:Jµ#®×ëõj=ÛMp¸Âa‰|0~($>ò¥”¶’ j¾×í¡¨ÂQéð¡ ”–– • ™~–‚Ìü(äPýÛÜWΞZ™ª”¨Ì»”³ÝÔ‡œþÉ /²ÑpG&PØG­Sr „Á™Å²÷2毉Π˪‡ó5<÷Šƒ8Xè÷NÌÝPƒRL+4WBAox\¡|J>¥ÏtÄä.å¢X0O/Šƒñ#3½>9Àûý~§ÓI; @H5¤UM´r3@t-»Zæ¹~L‘ˆüž™ðA@ÈZˆa†Ž3œçqïc?-½[×£ºXfŒF¤B:IÅvÅí@¹Ötûõ±Î•+n§»¿» »»Õd€‚¬h0ýu³¬éGA‘7¸^¯ÀÚÚZ«Õúå_þåW_}õë_ÿ:5 *•J”ѽ^ïÆT|æÌ™f³ÉóGC·ª 6C” D½“€,6ò-‡aHM9|߇;;;{{{Œ1Êãœ///Ÿ:uŠs~ýúÛ[[[­Vkgg§T*íïïÓ9KJ)j…Q«ÕÆÆÆjµëtp’$õz½Óé´Ûíõõõýýý•ûOŸ>½¼¼üÔSOÍÍͽôÒK¯¾úêo¼q÷î]Òi÷÷÷¯]»våÊ•çŸþÔ©S•Jå­·Þ"ë<!ÄôôôåË—©ž•^óîÝ»”@-D|ß§óË%g¥qáššW–äðQy« *#?4qbò@ò™ºÐDºh|@~¢¢y4äÛ"'(øð/ùg1PZŒAí,)Œâ¬óŽZZkzScQ–¸|Ó¢Ë͇‘YÅgaÞ‚Š¢'Ã|ôû}ß÷ÉãB-u¨#)Õkf-äfüP¢fÑÿ\„aEä8‚ÓÇ—î'$?ì8ﯻ”’±£ð(zøàqèáe’ Íí`КsžªMî°¢üxi®¤ë§y‹{,žÛXÐã£~Oé®”¨;11Æ‘qé‘l¡ÆÆ:M†LÆEÙuÂ8“ÜúÀ-Ë:êÓÓ :ž*wþøSWŸÔg¿ô'ð÷åfg8ÃZë–: ‡6Ø~<Z塨Èß;SíÿÏÿÛ¹Ÿÿ[€0ùÕ¯¨¿ÿ=\ïLYN7ñëT+œtÚÖtk #§¨ Á©S§VVV<Ï;·°xþüùåååW^yåúõë”ÁHm’$ÙÚÚúîw¿;66¶°°@Ž»DŽÑºÚ‘9Kõ„¯`›™™™™™÷<¯×ëÑyÕÝnw8V«õr¹<55¥µžŸŸŸŸŸ¿páB©T"…rooïÆ;;;T¸Œˆ7oÞ$¦Ü¹V«eÎs'Žcê µ¦£…ßþËkßÿþ÷ß{?èÉu IDATï=òHä#YZZúä'?yóæÍ·ß~ûÕW_¥s“Œyº²²òòË/7›ÍK—.=ùä“RJ2Ö»ÝîÇÉH½téPÙOÍ•è´ ²·â0)•J¦Æ‰VƒsNç:¨<_æø GBYÊ6²,‹'äLBÖ¡”ÌlДŽò…¼@óiêõsãŸúùÚÁúÀ@N% ʱ}4W rÖ‘P3Ýê©ciiiiiéüùóððÎ;ïP´U)E)à<øÞ÷¾733cYÖâââôìù ¶··766ÈÔèõzëëëô$ÏófffΟ?OÁãµµ5j¬A¦ õfŒÓYNccc®ëú¾? >úцa¸¿¿ßl6ß{ï=jP¥”¢~Ô ¤ÝnSj×u>|½^Okíû>úBˆÉÉÉ•••÷ßÿúõëÕjõÒ¥K—/_ž››{öÙg?úÑÎÏÏÿéŸþéÍ›7ÉŠˆQ¿ýöÛçÎón Ö^q3`V©ÁiõÀà¢þ¤ g-ä5Ÿ‡R¾ Ö€JãA>Q¬ÈÏq*z•h­A`óÖEEÄøê — ¦óB ”öx–HkM}òM¯YÈÎÐtJ =ºè7¿ýÑp× •7èÐy~ )rÎÉÞ0BRJ©t&ü…ï󫪎§µ¶,Îòì«bs_R@@‹šh´kA*½¸Yb°ý7~¾R÷¼ÏýâÎ(Õ‚{©”(=€ª†ÍåËÉ?ü¯—ö|™ ŒÊJÏ€•j-Í­1)# šºy¤ ?Èü¥×ºžçÑ9HI’xž·ººÚn·Ëåò3Ï<Ãû‹¿ø‹¯|å+»»»f}•R[[[o¼ñe`5ÇǨƃ´”HÕn·)ØV.—ÇÇÇgff&&&„aRQµÿ%—5öfffæææ†Öšü„ZkÂ~ÆØüüüòÒrµZ½ÿ~µZmuu•²®Ê岉 P`Ú0:ç˜* ¨ãôôô4¬®®nnn¶ÛíÕÕÕ©©©¹¹¹'Ÿ|ò×~í׿øÅ/~ç;ß!ç0r‚àæÍ›À9ÿÌg>³¼¼Œˆõz½^¯ST’:]×ëu:*ªV«Q§˲¨áC’$*Í2’LFnûÁÌ—RD#ÌO6yãT †aµ\3W’¥Â£\qcg®ª<àjœ½9Ï3D,¶5.ºXU~Ž^QåGDJÒ!ÒÇB9,Mó¬l™7P³¸]¼Ø, âšÛ“Èð91­•ã8À²eã}Éö:=¢62HʃlI '“†z’Ð_ɃMÑ_Ê(ª,G¤|qŠ ¤ ÃØýb3ƒÜæ>œó0Šm‡kµ&€ €ºÃcÔsƒEÈb`#ê8ŸÇ2b ¤?ž7"=ôëÕ?\\.s­µÉn5˘MC+ãŒ1‹ÌŸâõaŒÂžš-Ó?Œ^b–ƒôe€™Å…`òÔSO!¶ù™Ï|†ˆØRwoo¢âŸþt±±ô¾ïx¿Iìü|èªñx쌂ЦfóÎÝýx_f×?þøO<ä-jOÁí’˜i§×'!3ÇñÙdšŽ†ãñxŒÐ(4k±'nŠßtš˜$eæjµÊ–VWW!vΡËfµZ]l, ûƒNuŒca*!½~¹\î ºóõ9€´-—õK€jôÉfÎúûc㙵Vàð‰*µ œsR)-ÅÔ&ä4hb¦LLrVëìÈ’¤Y¯eÏÄ©H("ÉÖY²B© ÀDT,†83…Œ§/´T@N„ÅXA$[˔ڬò͉d’ !B‡“íÍÝÝÝÃýf«ÕéõzÐ|q\¬Õ•Ê\£±¸ØX*Ä…@ÍŒz’$§£Ü¡ /š<ðþʽŸÌ‹Ky :tŒxZ/q¡vžx‚>÷%âP»Äýe£ E CÎÖÃ…/TâQÚŸwÔš¯œ˜@†¢èy4Á^±ÖP4 BÌÒ3£ÍÿUÉSéy]Fl‹¶ÑÈ$þúÞÛcf'm!.!ÈBF…bDI’°0è™gG1ÆH¥tFUƶÀ9g¥tÄÆY"bb’"Œ£0ŽžðìªþÕH¥“Ôp’ŠYo 7J8‘¦È 8Ž9Ãü“% jŒ@DQ årq¾\ qÇa¡ £(ˆcOíPd­•lAô Éb+È…ÚåhïüjÄAGQ!.‚“R )` k"X½ìòèüº¬êÏg¬NìRçœa±éx)E M’úJ Ê…âB©YRJfbÓ±IY!™É²ëgÏ„…øúëWG£Q1.H)G£Q)T&ÛRÐöÆéD2‹•A2!Û3AÕ«:eS'ÜØÒFv¼\îÿDDÛÓW?üÞ‹¿ù›K^è‘‹ÌHÂÅ|¨õŸ?»ü}OÝ˜ÈØ…šþ§ÿºòñïÛ1f5°MRgSMךôñï}íê­Ë…Xû‚„#ÖDÛhliJÒ2I˜ñÐIF‘ a…dbLIïìììîî‚ñªÕj)¥z½Þ;w´ÖÝn÷îÝ»“É­ËÁ\¿¾¾¾»»kŒ•J”Ëeßéh8îîî¾úê«o¼ñÆÎÎú BE½óï¼páB½^Â`¥V«…CŽÓ‚2¤F£bHp)àx`ïBcÂ_Ä8wî4Äd2­®†Á,Ân‡Íf³Ûîá‰æææÎž=Ûív»ÝîíÛ·¯_¿¾½½ýÌ3Ï|øÃ~òÉ'?ö± ƒ/~ñ‹Ø‘­V«×ëmoo¿öÚkçÎ{üñÇ3J)äᦣÝi»ÛÁÆãñx<®ÕjµZmqqZ»¹×ëáÁ‰È›ožyXe$Ì&ø+3{N1›1#âó„j÷,áäÏÜh_ÏíÏŒ1 Þ|†Ö9\ gq'ÎbœEœd. $sä‚9ÍœóyDÆ5˜w鸻©sMN3ùóÞ3£Ágég›ñÍ!#ƒ¨qmf´YÌûuóš’‘ÍUVˆãO½ÈÈ?H^ÑæÅÜ ·Ø?¯ ¨†íÎVHÉ'~¨öOþ…!2q§“¿\Ì4bHžU¢b•é9¡QPÂ6ó”/œÑ±ý…ÜÛÛ¿&—«ÇÄqÑo—¥RYkm̬2ØlŽy¨§ þÅÑð¯ 9LÖüÀ§?L:ëæÃHvÆMÁ^ñÀ ƒãàoæÑž6îýÜiße)HJPNÃqv‚X rÇ’ttLf?s®˜ØÝ·vÎRÊY™88 eff,`ÇZÌ’Aù!r°¼ÄYÓ_cÌ‘DpÎ/@þÝ Ÿ¾!rt²ìÜDåryyy9I’^§+Ðÿ†,Ïâ|Î2ƒÍi8†A5ª*X6œŠœ”$Éžº £o½þÚíïýP÷¿þéåÚÒKÅð,‰¨ô¡÷‰ÿÛ•ýëÓaùßýûõïúñ`µTÚ¤!¢Íï~ÿ3ÍÎßO¨XøÖÑôÞJ¯fýÒK/T+†ëõ:Òœ£áðcÄ"ÕÚ5×·* _ûÚ×®]»†Ä'^FµZ}ðÁŸxâ‰R©´¿¿ÿÒK/aオP(,,,(¥Îž=‹¼ïÂÂØðáY"\‰òYXO¦Ýn´…8¥2#"ö–`š¦µZ .²¦è´³³ÓétÞxã•••ÕÕÕsçÎ]»víÚµkkß½{÷ùçŸá…>ùÉO~ô£­T*/¼ðÂááaÇÖÚÝÝÝ—_~ùÒ¥K>øàÜÜ‚Rjkk ZV)Û¢P(‘1f¿ÕjÍÍÍ---Õjµõõuè?ôhê÷ûØ‚qX€l‚ '£µ6ŠR» Ÿ…ŸaRxí‹<Ák÷ë`²–º£Ñ`´!Â[wÎUJ!eA`Ü]dZ߯«:Ê‘ìSNAr(“9öÜWHáCИ§Šü±÷sðß•¹!²Ls^Äàë6ÛåœU@Í&‹${s {)ͺ9aÃÀæó!hÊÅW½]"r•W'ô®¸ÇÉË#ÿói ¬@Ê1ÕÊF&gÞFëKs;žŒw…XùÆOï73q±~=jüédP´¶_­ÌÝ•¢d­…'Uä€ù'úæFþµâÎlMw¤'ü6R -Ñ¿yqq±^oŒF£N§ç?ÃÇ÷ŸžÈÊ« C±™¯YGŒ €!D§ÝÏëuÎÐ|'´eQ{à“7g3‡VB€êË2»Q"<;;äœ#)IJ¯QJ%¥R¨ìÿ³–$–*ôf“o‰÷Íߟ8àñ€’—µg…Áª…ô2‡Zf¹0àä_Gþ³™ÁÇ¡mœ¥œ„çÞ§˸Åòò²1Æ$éx<–RJbgÒ4M ã€G­V«"i¾¸T.³d-IvB:¦”O¥=«ôÁ×ooïÇÿøÓð>U!iHÓ(ô½)–>ý¨$ú¶÷ï*š¨è<¹’-ÒöÞÆüí/ݺyÙP—È‹çG£& K¤hÖÉÒ×+,Ô;;;{{{àùÓZW«Õv»Ýl6±ŸÂ0 ÇÆ˜n·«3ºNÀž‘ì¬Õj>úè·}Û·EQ„:ÝÝÝ])%À¥ïxÇ;ž|òÉùùùÍÍÍ—_~yss®-}qA@£=3%š {狽‚ ÷þþþþþ>b¶ív[k €1Ð4 £†´E¥ lùn·[.—[‡mÛ£(zôÑG×××/^¼˜$É+¯¼"2¸Ðïÿþï¿ôÒK?ò#?rñâEc ¬æ½½½W^y…ˆ._¾¿7ªT* >œ$S™%YQ›ÄYZ=ŽcÜÐý§B ¬0ì;ÔU§iJä8s±Å}”v‰Ëªõ½ÇŒ!2†gˆ@ØbÏïxWp^7È\½?åê ü‡óç3¯x(§«òÚˆ™ÕŒò²•î‰Üz ‚îLþ²þÔ–öË2ÿ˼ ñaçöÏâ£о"»=aL`œ_^Î~Ób@4eCÐn1ìÿ½ÿiéŸýc&j|sWûƇ°%-©¼ü¦î «‹;ß ¹ùÅn;ɧêóš2?òVÈ[>ºã!ú³â: q7¼dJ6 ÃÅÅÅåå•f³9™ÌÊô½ª;a0½é8açù9€B\f|#>­ÐëqAìšož(2‹SåPú„ž›Ž¥èd\½/ŒFoèÀ2Y¢tÖ:‰ˆØÞçèr¹ŒúŸÉd F"FPŠœÑ Ã1]\\Dm̹sç{ì±w¿ûÝo{ÛÛ>ÿ_ÿðÆ[[[‡‡‡«««ËËË<ðÀ{ÞóžK—.½ñÆ×®]»}û6öaC£öiaaµÞ0j^FÐm˜èíÛ·§Óéh4êõzèQ7è$Tâ¼JxÔ«4 )%êA·înO&Ô>ííí;wnccãÝï~73¿ð ¸W¹\nµZŸúÔ§Þõ®w­¬¬¬­­¡.ygg§ÛíÞ¹s§\.KIÈRw: ¤\A*vÔ°Ìâ´*«.¯T*ظ{;û)ÃÎðPÏ~¿nÄ@Æ!ð‡ææwç S×fMŠ|ÖsŒøu™œß"||œø%åröŠaLsFd!†$WØÓ+Ë>†ªÈ¯AÁ ÇDÙ›¥{2|´”"¯,µTùÿ o„ §Hdä&ÌL™Ü`f!ˆ³B’BI¥¤ÊìYXJIj«ö†5þosž|_yÚð(hPdú° œùú”4j!ÁsL–ÂC¹&¶ù û×ä\ÆðÃ숕ú:–«Ÿ¿O`ûV—ˆö÷÷9øód2é:Žã8p.›*?·¸2WIA/òi´µ¹µƒÖçtø7Ì(¹ú²ý?ºý¿syµZ%ã(†¤™çûŠËeß:pÿÃÝyö¹1Q—¨°¼´°·ÿ\¹67hk’–Xdüüõ=`ù¡B¦X,®­­)¥æççffr±ù`0†a8–––ÞûÞ÷#ý¥/}éé§ŸFw!ÄÊÊ "Ï<òªqà§.//ãja‚"~~ÜxÁù>ÀÊŒ²øæÍ›(®…‡"ƒ³BR$I‚Î0Ðæææpl ’$nµZ+++ív·888@KÁw¾óO>ùäC=ô•¯|egg0J©§Ÿ~ú‘GY[[ƒ£|áÂ…ëׯƒ9n4*}áæb “š¬#RœË0‹Ec æ Ó»Õj្Éi8¯ÀÅøw–×µ>¯™·‘áóyMŒ{ÁÀUO ‰Œ¶â„BÊ«®¼¾ñß✭íl5!œ]›ãä:!ýCp¶¼:Ls=ŒN‘Ô3×ßfUÎ&óEüܰ0Òó:Xe”)ÃuSÎðçß/Å ýŠßx]…æsاY'ùk RL“qB:¥0 óg·àï>öK¿<¢xÿû瑞ûCÖ¯Ýãµ%»´ÊNo6·*¨£\½8Ô‰ÉèÄïcd|#ÃoQ•5ŸyЧxÀBˆùù¹F£d=F‘CTÿR¼‚Q§8ÁÞA´ÖÂoC!8耼ዒ"*—J¨_XX€Å‘ <ÀV|É~𦅠€ßXå(«N¸Â3ÛŽ‰r ’²2$—õ"”YHÉ_K¥¤XXXBt›û£érÌI’Ø$¢(’,ÒHÙ~Yªñb¤•Z“4§„ ›­¹Rå;†ý6© R™ÿÊ—ƒ¿õøŸ}ö‹ï][•–d7I+!•,ÈlmŸøðŸ¼xåí:šé8Pçöö¯Ê°8ìD"AB3‘££õ?ŠR u,årùmo{[­VÛÚÚ±sEp¡u„•JE1 .^¼¸ººº½½ýÊ+¯|ñ‹_ÜÝÞ‡ZëF£ñÀ QÇñÍ›7›Í&b°Ì\(¦Ó)(‡Êåòúú:šÛƒ*ËgyÁ5v¤$Iü &Œ1ètí•·Ä !@pnHe8]QU«Õµµµf³¹»»KDД·nÝ‚”¿xñâOýÔO}õ«_ýõ_ÿõápÄ2x¡‘7zì±Ç–––nܸ\Øööv«ÕÚÝÝEæõÂ… ‹‹‹©•¾ÀV[$e9Z˜ðH` !Œ1 ßòf,DžÐ¾¾/,¯±øä­N—tÀ†é*³RZH%„|ýÕ¼ö?øcFÈÂÿ<;HÙ\V›¯²ôªs.µ3WÎf½ýÕ¤<}rÎiPÎìõ}ÊÉÜÙ4|?¸Ë´1F’ðá}¿ò΀fžÞÖò7=1¼Í¿Ê”:þéÓ¥÷~‹ß¬­[ JS:ÔÑ1 »©*-þ/ÿ¾üLóúk¹ 8nüieã·Ëåb½Äz…Ý uàƒ7¤(3Vü{?ñ\ouä=9™U~+¥$[/q<[Q¯×†ËÕëõºÍÚÁòq5sŸ)¹¬§¶´Ì²9îkÌyÒ; p‘©""(`Ð#Ã9†Ù‘‹sèOXœCžPÀt\ú/$!’*Ãï ’DÂWÀþʼnÌÐîöùƒ}$/Ž7ÿƒ—¾ ÉOÒÓ\ûÃ&sY%‘aŒýdò·Ë{ÀyÌæ¨ Vä1YrKðÎÊÌEε€ÍwâÑN¬Ò =êõ´ÈåOÌÍžrâïÄeÓ) dÇVé^±š×~èÎÿøgâïŸvTÿbF8ÿbeõùZüP½Þ diw¯s°¯u8e3Û32—úuoF³ðÍ l]¬¼È(Õ< ú„ B1èí¬µ“ɘÔú ç‰ N¹¯wѼcŠ ‡C8²°à}¸ÕÇKáBt0‚¹¹9(à~¿ßjµ¢( Ƙépèçìµoþ‰NØdO'NŽ_ñCI)IH!Ÿ²SÂ&™É8лét¡ŠŸûÏ¿û;¸d)¡¥à÷´a æì‡>´ø«ŸYþ[O=ß2I„œ­MGC':ÄÝ!""wzã¥cC×ëuwÑÏgeø8v! IDATee}}}8ŽÃb\˜N§õùZ¨ƒPI’T«Õù.¯¯¯AÐíváßýâ;wnܸçË177‡½àL`ë½þ°?@*´yp(¥$ÇóÕ¹B£|öÜ™³Pó­V+uVJY*•„…BèÞÞ^2™FAX¬VB¼Z­’ÃáºÝ.âÛPH>Ï ÂÂ4M‹Å⥷]¬Ì• ¥øìù3ŸûÜçà€&iòÚk¯noo^¼xñ‰'žøþïÿþûo?õå/ù·~ë·ZîÁÁÁp8Ü;ØÿÂ==šŒŸ|òÉG{ÇŸþ£½ÍÍmL&IšÚýýCËÆ³µµµ»» é¦iÇðÝìßÚÚ‚(æ< C©+R‹v·…hA¯×CÑð4™¦Ög1 2Î EŽl¡“äÁ¨?M¦¨²«ÍWÚÕúBc0vz]㬂¤˜Žgx2šzÃJ©Z-LjN{EâOabfî¸q© !ñ!ãJ1k^šÉ5âÆb¹à!ÃáÐZ[­‰HJPtq ^Ë´I©\ŽfÁ'Û¤”`Ûµ÷ˆ‚ÙYk…ò½!Dš&i:µÖ$næÄ !ö÷÷ÑŒR n ,¿z½[ÁGYó%Xye/'Y’ÖÒå(½ò¿ö¡ïÜÕÓQ@5uUÕ’¤V,ŸúPðë¿ö®ð£ƒÍtÄÁ˜ÒšswTXu‰c%3B2›’’)Ò)GÄfÑ;N9¥I///#–‚䊯ÊÐZ#«Š³œB½^¿|ùÁ(ж¶¶^yå•k×®íììà3ÌŒôÀ3£ÆedhÓ; ˜À´,D1>â´\ …¤ßÃݙٓF ꙟgH«(ÔZCÅ"bÙíÑL¸²ÖºP(¤iŠ –RªT*=üðÃûûûÍf³ÛíŽãV«3¾tëÖ­[·n}ìc{üñÇú§ú¹^|å•W¾ò•¯¼þúëW¯^EûÅ………ÕåX·oßFÄþæÍ› Ãñq{c vžËpüAÀ-¾sçŽ7{G¬Óéììì0³ç|±¹–tå+Ž·Ú嬯‘oŽäÕ*ÚùeôöŠAä2IœùÞÂÇd†jÎ{Æ"çyIímç¼4‡ãâ•®×U÷úù[äÍp:îdŒ§›£L³&†2˜%†aÇ]ˆ8¶Ÿ¶º‡kú^ÿõ´ˆ´¸Ç#Y^Ù?‚Ëá¹¾îÈkzfþÙÿD?ôÑâç?k;¢&§ V õh:íH;ËnÜK¨E¥ ,Mú*–#Râ‚8*©•l‹EJi&KÎ aªK/.\þåµÕ5!D§Ó zãñؘ„ˆ€áãñüÜþüãD`Ãß[/¦³š!‹T®©373Ñ|Rärþ.þ\ˆ{IBJ6BË€­sÆZa Á$˜X¹”f §Qæ&¥¦,/®sídFE F­Ûívš­ñhd­s–µ ŠÅ’'CЈ¹;òÜHÂåRÂþÈ :FNwò )%K&™ážî ä·œ³ÎWd1[DË”žÝׇCdkíf~ÙýâS®è ïe<¢-Þõh4¼«\®Š,vÍY˜MkÍ,úJ)E$¬Mù¾Ñ!ºÖ¶¸;˜YòE›ÖÒp8”Ô*¨t: o®}‰ÈU)á ÄèçåÝO¼o/6+"rÝq³/^¿VŠ¢h}C¡4v”Œ'ßóÉZc%þ®¿ñÚdº5‰óÉð¢°6Þ¯uƒ r† ÔÏ«%`µ(ÝÄq\¯×“$988ØÞÞÞÛÛ»qíú`0$¢ÑhôüóÏ ýàƒ~üû>ñíßþí@c¾úê«/¾øâööv½^üßEÑüü|EÍf³Óéܸq#G·&¢ÅÅÅååe¤uñÀQ#¯ŒŽÓØÐÃápkkËùFÒÒë‰ü)Y}­×yJ)ï\¾Oe7—1Ù¯×8`ÖÍ R&ë~ˆ³'3¨ˆ¿—ŸI>®ëª78#Z™ ::üùœÙ åÝ//e–êÆõ3£´<¡Y)ÃŒ "XzØdø€oXéQoù`€Ÿ€<Ô“7VDV—’5œ ˜Ÿ¦ÀòšþÄÅåtô3?[ýG?aÿ˧‡­¦Ô³â:ɇ‰8Ta¡*Í´$ÒÉ é 1 hà÷ˆXÇ2"e‰B%Ëc›Z²J©­þÑÆå?[>—â ⨽^×Z‹'J©$™%ð¾îä¿é‘S~ UV#.3þ)%hºÑq/*4rFŠ! |F)ƒÕgúõQ?<ûÍD’X‘`ÅŽ…µ,- ã„q¬Ô”gJ« MSçfÀ"ø|¸j+À Ш/¶ÛíƒÂ^ë°™N¦aXÃb–´Î¡}ÞÛ±Õ:!#ry !z {mç—ÅŸŽ{Wò>¯ ØWW]Í7=Y 4(|_Ý gÀd¹ž¼-•O%À}‚a†¡R g!{½^±X, ãñ¹vHKŸ²–mŠF Ê×ô«¬;Ü›n*€¢µŠö÷÷§iâÈ!ôD§“ûZÙáx<$D†Ÿ- gš˜jDWêUõ3?ÿàG>J!- ±iÆ«åBðü‹­Ÿøï·«ÿßÏœÝX9(Òù ¢Þôê{ÞöwÿðƒÿðWú£y¢fcéCÍý¬‘`fÊXíØÞ‡á]ƒûÐ913,ü†n·‹‡‡#¥Œ¢Â­[·ž{î¹+W®`£#•²¸¸¸ººúÀ¬­­-..Öj5à­|kÂn· ô?t'“Ó4…ÙâÃhMãœC)ªñ˜Y5Qh!‡œ$‰P3 ?gŸÀ~‚ i ½’”òðð°Ñh,..†:xõÕWƒÑtš‡ã~¿ûöí«W¯J<þøã—/_F ÖÖÖÖk¯½&¥¼~õÚÃ?Üh4`Ox[M&g™ˆÀ’]©T¤”H)…aF­ñx\©T €“$ét:h\±³³ã2FkDl¼r9¯OhéŒAï¢ ¼V›u6ÄÜ €órr’1¿­½ Š""›Õ¹# º_ŸÕû 'ž/i¤cƒ À™ÂÁ*Bxc2™°"È"O“‡ŠU\¾6FkäŽ<{øÈ‚X19¥?`çØ9bvJ9¡±i¥@2KpÆ5Œ´±×[AÍÍÕ´Ð¥By2)!ã¨È,´ÖJHEB¡ÅŒ5#P:%KèÕÎG­¯$å” å0kyü¿‹{¿rbßúÁ™BÜÎ+~œ)••'ùS釿¸ËŠ—dÿ†ÈãXk‰Ì Ë8Æa÷ûÃ(ŠÀ|•,ã”’t$TžC>?ð‹‹‹•ò|†$E¿ß56uÎF£éT»Õ2jkcŒ¸:g‘8âYaRÈÝÚœýù_ÝøîFÚÑ„TAúWnŽ~òïï~ñÙ€hçû¾ûÚïüÞÇ.,Pw±Z¿ÄN¾÷û¿ôkßþ£ŸxÝ©zs?ê2sgÝ`&¶D³ÌioJÇcÏOËuÀýn2Š`@‚Qã,¥ÞÙÙi6›qÆ›óÈ#œ?þÂ… ’LÓôðððîÝ»·nÝÚÚÚò4Ȉެ¬¬,//Ãöx+è_%¶!ræÈBzB€2s’$µù9„¸a=03¾‚Ã<™L`>ûÙ®¬¬ÔëuHš‰ sšÅº™è~x¬#iè÷q)2+B@zYáé4ÝÛÛCq*žj~~þâÅ‹¨—E×úr¹Üï÷÷ööÐ þ_©TB³#0uàú…ðY•RÆY8¯pŽ}@ [9Nð[A»`àó°¹  ;±È2 §¬®®BƒÌ \©Tê3gδÛíÛ·oïíí¡?±”²Ýn_»v-I’z½ŽxÉtÚœL»téÒÅ‹766öööšÍæ$+¥`ÂÃ_/ 0»Ý.$ïìì(¥Ð¸ÝnÃË?88¸råÊÁÁÁÂÂBǰ±/9+ ’|Wåø€°D‹%I‚ðN‘ËPåhexì ÚN›ñ8âdFâì¸æu — >òì5ee¥Ôh4ÉÇвSw»sBÓ{1¤Ž ,çBß6ëõdù˜ »;‚PÏ çÀW:éB0ÛÉ Ê§Ìåªó¢äMŒ7NÌܵò‚Oä<ì:øhÁkâ~bu UåK; çúÈÇè_þ#ýÿñZ¯sf<š’Œ¤ZS’ŒÙví)M,ûÎDLJIdÉ A.(î4Öo.}±T…Å^ÛŒúj2²Á,à;e™ œoüï)ç!*9Þâ÷¸_t†òBT7 0ÁOÊòŽ8h+â!îˆ]£¹§Ùäöäɸ¡ÚTZ©5ìvNã¼¶Ö 1óG3@TÖú"f)‰§J‰  PŒÂY%ëÂPk!}PBBÖIG6S’BI‚éhóS®+èl›ñÑ#ЛéÑü3RîÅX{×_f-™‰XEØîùËŒ6 ÏE¹¶›ù=Ÿ÷¥”Q¡:0ÛYw f¥$ä'¨›qÙr¹\,ÆÒaã ÏÜñû¨a­µ”ºT*ÕæëÎ9Ë.Š‚Í-é¸7¤” pψ(Ó¾ØWG-þ÷þ­—ß¾[ë$Ȧ2I Ý)}âoé¹? õ‰æ¦ýóBn]»V~êýŸýü3O•Êå„-+YúÎïÙýñŸTÿêÿ,÷ú_#Q#’ØÎz.͘ N?åŠ  `à½é3g $Úí6ìD~677»Ý.­®®¾ð RÊÅÅŇ~j‘g­õÖÖÖo¼*Š€K¥ÒÒÒÒ… ._¾|öìÙùùyð#â+6£/†Wç«Ý}¬U½Â¯uÎ j­R !n4ĉÇx÷AìííÁCMÓ´\.×j5àõÕµV«5 Ö××›Íf³Ù¯H¡T&"à˜Êåòh4ZYYiµZ{ûèî°´´tæÌ™‹/>öØcƘÁ¨? P(e­ÕZÔÿ3Œ>k-Ô£Ñ@op{mmm¥‰¢)¥¬ÕjDT¯×ã²ÅL^ûŠ\Šš ’aü™­jŽV ßï#$à}›k⋵Mmê]L‘C‚øTÆ!åmH\ÖÈS)5Khšil!Ÿ÷Ú+ÎE–Äõþ=3»¬^Ù/Âì~ZùÉP†ó ÃÐît:Íf4F^ïÊgO¸b|œ?ë4݃Pç‘dÌÁ‹¼±âÐ ýzïÏ|7,£åÁh?6ßqfµÛì?ªÚ?ù¿.ü½¿üKŸ¢/þÉô…+w›T5Q%RB§Ê¥urkÌ$‰£€„jÆ¥V¤: =]ª] â[ÉØMzzjæœÓB”¢¨›‰³ÂIñ~èK×Þôý9”3¹ˆ(Š"lÅ(ŠÐ¤Ù'0oà˜ÃXBS›Ue%ìp ²Ueb¦ì¥Xk™ˆY8ÇRJÇì˜áë9fc­¥ÙE¤•›jɘ۳:òT*§¥ ´C!;§Ò™%H%¥$h÷—,˜ˆf©_¼t)OÀ2üÌ6Õ[[m‘RJbr|²’_"çœÒ’ˆ|¹ t­9Þ–¢ŠrG2¿í)³_½wDäàøu>+„™@zã+£Ñ¨XŒëó5ÔøRfXßÇ Ã0Ž‹ž®qmm­T*8¶ÆÊ.l´™ˆ)¨^A½Ë&ë±w ׫gˆvˆ” š]úЇþŸëW+Åáä\¥Zé÷^Ub‰”zíîßó…/üÉß æIr—úsaµøÎÇÇÎEC²™Þ%'‰$f:€šô`0€wâØÜÜ\­V[_]ƒòPJÁi¨V«ãñâ™gž!"ÄñóÀ¨étº¹¹yõêÕƒƒÔ¹BÕOêâÅ‹gÏž…! •_,¡Œ1¥Ê¬ò是¡¼´åŒu!I’áx¤r ‹ždßk_)‹ª!O­¬¬cà;ÚÔY].—Ïœ93Ïœ93™Lö›Ð%ÖZ®Ì bUh·ÛûûûçÎ{ôÑGWVVövÁ¤E’Ho4›M8¯“7õõõååeÔ3ܾ}»Õj¥‰!¢ÉdbR‹< ÖÄ«|ZÈ+èK¤xÆ@„nß`<ô(68…ð€q øŽ&*èRã ª<_©¿ÇÛN5“É;’~ÍÒ ’ªË&HX¿”¦k”… …˜B]F`”·$èxXþÏ9NSÀXL$Œœs¨˜ƒ3Ÿƒ”ÒYãß8d·ëRÁAüäÈÑrlÇÌ$˜Y29GÎ’ÄF°–˜ˆg(Á"kËíS6.#„Â&×ZKÅ$X Šã £@kÍÖ9N(߂‘‚% žUôúùH!øÕ˜×Áou©ñÍ£s$™˜¼ 8qÁ™Ò%…¥Ã?¥"!'>ÏÍ‹'Bh6ë~æÝ¼Xæ\\ˆ¦Ó1(<û:3O§Óé4ÅIJ¡Óé´ß×ÒQÁ8̼Ï"(EÑx4M’d¾^+ãÃæA«=˜ŽãT„&¡4M'l˜Y e˜<šsðü—7žzrƒxu2Øž˜Æ÷׺~eƒ¨>œ¦®Yªèa¨»v}üÑüÎoüî‡/Ÿaªth:ÿìç'ƒñ3DO‘ºJD$\wptÿt·Ý)•Jk+«Æ˜ýýýÑ`ØiµÏ¬oÌÏÏ7›Í³gÏbM‘˜Ç/¼ôâÂRcaáA­õž|ÿÞÞ^£ÑPTtdK•b£Ñøíßþí—_~¹×ëmnn&I‚ãQ*•{챇zeÄBˆF£¸ïÞÞDØt:•Z¡Ë|è`.F“q·ßëö{çÏŸwÄÖÙĤ Ó4%'Ð~S)…ÿ‹-çòÞÉö‚áåùùyÜ„aØîv„BÉrµ‚á¹ ç»Ý. …}plmme~¾Z¯Ï/--x%„Ø;Ø}ùk/‘äv·õ¾÷½þn·ÛÅù/—ËÎ9D¶Q¨T*.\`fgøÖÍÛÛ›;a†A˜$ 9ALíf‡-UJÕú|cتۨ-TJÕ…ú¢s.™¤q¬àßâ"BˆtjJÅòò¢ØÙÚÃ)š¸h¦é¤7˜¢nx0ê‘‚À¸YcLÇJªÔ&$ƒ(ˆ­µŽY)w“d(Q`A>êv»ˆR@€‚} þå°?ÐZ+A&™áã„Τa#”—W{œ®½«AD³êv©Å5YApE¡™9cO¤ ” ÆÝ~gÿp¯Ókoïn¥6±l‰(Žâb4_Ÿ‹‹ÑÊÚr}¡f\ZŽKÆçXé\Ä[8ëljÓÄ$ùŒ·èuÖx àJ¥ä2ͱ³Æ†<ã8„9èHTNK)3E4S{«9í…‘5CbŠ‹…QŸ£à¢ÒO~kÿ]— ¯ÿ軯Ý8<èˆ'²ôßù4M6I’ Lx\ò¼vU¢>ÕˆˆÔ!i{†yÖ˜2 î"=uÎX›9H]çfÁ„QòöDÞòðªÔ‹È7ëÌD “'çU_’Žã0a›N'édZ,×7Î]¸paiyµ\©iy$÷a\Â’Žƒ›)*䶺ݮ¤RJ**• a4³’“dª„dëRkk¬sŒ†•LBHAB’P$¤c2Ö¸©‰´1ÉtA¤•›NS,HTˆ½ÒY¥ V“ñÔSªR¤Ã41‚¤’2.µÖTH0+)%[*1¥ â(”fyeß“&²71ZEZkfhtÍl‰Ž-¾7(IHËŽœ%ídÈðúsjªø8„ ßM B9÷»ƒ6)k­kzá4®˜Y-„¡ËÀPSg´–ÖšÉ$•Rj-™mš¦’fý '£ñPéú|M0ÙÔ¢b2IJÉBTœè©$¥e  ³Õ#"„Î9¶n<M'Á–ÛK¦naaa¾:߃©̾€æÇã(Šb—HÊáÔ¦œvzí8Œ.=piy~éÓŸ¾Ýh”GÍ~¯wPŽ—xr‘i[È ¹€I3I"ÃbLbB"ùW?·]X[øÿvã¥çº?÷/¾ögÏ'*Å¥½ÉØ…É(LfåEÍ鄈ù•WÞþÉOüéÿú<òö‡~í—_ÿ׿ð ‰5 ·‹AÏLëIºGò\\¦q÷«ÌÃ)ÅÇ€ðŠŽj 4Üè<•‘ë†axxxØëõâ8^ZZ‚tC¼þÌ™3D„¸ðŒqž§Ó)¢²m‘nݺUŒ J©……À¤BÙ€_yÊÎòó¨1€çÛ$„84¸š¡Þ’ÉŒá¶s±X„˜Ó¡2Æà“Gçc§pâÁ3…™øD\%Ä*+•ÊÒÒhx÷ø¢d‡‡‡Íf³Ýn‡ÃÃÃÃ[·n!L [tq@øwooÑèlÐxy¶jPbùÌ °0w€ŽöeÓp‹GØŽ²°>r‹€?üÎi:¡Œ•Õàš.Ãváÿlg• þHCÄÅȇƒ@Šëë|ĬÞ@Á DÁ·Rçø+¼Œ˜žËá;¼ä w÷b‚rm¼õÍÌùø3vˆï½þ^¯2}ÝÊ´qƒÐ;¬È¸ãú.Ã¤Ì ‹³¦°Øf¥R 9{‘U."“fC°ý|šÙ›ðùˆ=±9"Ù>¦¬2UG¹¨¥i:564“$™ÅÞ…ΑëªïÒ IDATäœp|¶b™^ük1ä¬ÒtVÂ>ãûuÎÑl“Ȭa 󌚙2xYHmxK]fì’Ðj°lÞ4öpšSuä(;ÇG8g½´}„|SNI67ø›]|››D.ÞNÇûdÓCò›ßžþ‰LF fr…tOëÄzŠÜPY!eþÃ޼ȟ8ëÿ gæŽÌú»øJ0uº“9eæòØ1%~äí7nÝD.™$RÊ OXÀð4DD"%b¢€œNÇïøg?µýÏÿáW“tB´¦iÍ’˜ I~Áðdx<’ƒ—ž¹þÃßûj,‹Éx#¡Kq±4ÝM#¢Iܘ›4÷Æ]GT‰ KZžêÁk5"F+~0!:N¯×[XX˜››+•JDº™Ë‚ÚLÓtii ¥ÃØšh‹ "‹;wîlooïlïVÊ%ıÑxÄçÛkµVMe˜u¤Š½h¬7Íuõ‡îFCÝל™Q;X,qTÍ’a‹Õ熙n/g½Fì#*ÇÙQ˜`ëõ:²¶wîܹ{÷îx<ÞÝÝ…?´±±±±±qþüùÅÅE¥j wwwAú‘¦éÜÜÜòòr­V ˆ‹ªŒ‹ ¿•§Ói³Ù<88X__÷±z,Ϊ߸þ¬*¥Pèà3'f*„€‘é13*=üƒåqÙÎõ•Î ÷ÂOu«Õ/n»Ý¦Œé¯ Ìs•*6‰É (q ¥rÇá]^öyCÐK_êà?æS¹0±@¤Ýshcéí™››«T*ˆpkPŸÒ5"ò–ŸÌ]\VÍâ/0‰"€ÆÌMf¥ÒxºÙú'‰·o(ß<à©4;Gt$|E6<O¦Žµ§i¨”ʸò‰ñu>íp %óì¼£oŠ1ÆÑQŠÑ97“ÈqLñ,XíM" “:A,´Ð*Z(i¬á4±ÌGYmÊÖê>ó™Ù1ÂÍî.èe Çô$©YË4#=ýó¬†È¡.Äññ ¾R™åxö‚ÿ^SïþÃey"Â:ûœà}®“ÿ«×²>E•÷p¼ÊÌ= ¾+PCAÅb‘³ÌŒZ¼n(à(ŠÂP˜ã°5)¥Ótáò¥V¿“4VÆ&ck’ô”Õ #%¦$§DŠ\L\bhì’°HJ‰ÚìJ)IÄ ô4‰ã&K´)ÝFQ-ô†)QˆtÔ£t@éš ‘ºÑ$(¬¤ãÞ¤—èõúi+¦kµr´0<•Rè"`ï*aá¢(BÜ’¥V«µÛmD„ãñøêÕ«Ï>ûì•+WîÞ½ ì´s.ŽãZ­V©Tœs¸&@q°y,„Ç£µ†Š‚¾°°P*•@ 圎×9×ï÷ç”R"‰D5 Oa²!X'Û‹E¨κLûJˆiï™AÖÃöÄ›ÆwñúÑÖ7Žc¸È€_6›M"mu«Õ‚s¼¾¾^.—ïܹsõêÕk×®mmmÁ#÷õEÌŒÄ9g…X&k÷‹{F£V«…¯@y˜ã|×Þ„ô ¥ºIb;‚Zàg„:à°V«U8gð)á…;çdæ_"æ»ÄŒ§3K q…f³Ùëõ0=Î:AEQ„À`·Û%ÇRJè3Ø 2ׂɟ:Êù|œqöúSäOõ Ã[ÍyЖ1åæ¾… Œtß"¢Á`€élK }2ðàÞ¤Ì!À̽¨¶ßÁÁ¬VµÓéŽP.V`_zA†°ˆÉ]”ÌùH²÷Œ1a˜2H@¸†á`08<<Äoˆ¡þZ­V›«ÃóöѳÙüé˜[ÆfPðlüY›= ±I’ºddÒp"'™²!ëŽ-‹3¢þz”Õ¬Ã^¯'µ"’JeÍm÷BÈbä÷!„Ï" ³R ¡rfÐë3JÀÓ‹Ý)ŸÏ&"ï|“•Ьå¼Ë›>9眱ÖÚ@*è'=½ïΛsÒYK™dó„éùu®“ÿ;J -‘à7OvÜÿRÞð¥,8l­åãÝ–øžö-þ»?ÎDd³Jn{z‰$<ìcç\¨ƒ(Šœ3^(Á¤.—Ë…BÈd,±uÇ š‰ðöF}áÒ3 Ýp\[j^¿!©Ï¢JTdáHŒˆGÄ¢(¢ËS—XÞ#2,‚¥dªR“ÐLw2±'‘¶DÎ'c›C4 "11Žl!V =3MJ¤+åpe0Ú))¦ÊäÜÅÆi«½'ÁÌðwÑwÑ9l)o³x#~d¡P€k»¶¶¶¶¶6ѲfŽ%[*•ªåJ£ÑXZZZ\\œ››(Úûy÷ChâvQ!ÆIƒö…€C+C”¹ŒO‘ˆ”R¡ŽÀd‹z2Hak­eãÓ'¾Û6~ÆnðÓé@ ã¯ðõaˆ Ý =ê÷–AE(²îÐRJ<…”ð1\cnÞ¼yûöíáp˜LS´ÙB3ËóçÏk­ÇÃÉÒÒH¡]&4qàñÿ~¿¯µ®V«ÈÇc—em9×ßõÞ|±X„£ÜíÇØÐ˜¼o™¼¿¿MŒÿ{¢™rQ{oWFò8.FxkNÞÍf1 a‰°þý~ØŸQ#û‹P‡{3­à³?ÉxŠ#Yv”)$Ê•åå ŒEß+ÚgaÍÏÏoll¬¬¬ ·U³Ù¼sçŽÍÊØ3λ Àˆ¾.„ðØZ$°ò¸ ÊÞÂ0lµZ{{{“ɤT*c‰¨V«ÕçFcaaåy¨ Ã}èTŽeÅåòâø'ÞVf:žô’TN:“±éª¾è@_…{qöW|03dz’$ív{{{Û8[.W£@{!Ž; (D^C²A”7éˆöSšXf²9\t^ïž:¥Ù¼œs3ïmfå˜gp ãØ9—êÀ×íÌ»·ès.$î A¿¥KI¦µ5Qî‡{­¯LÎû©³-š¡"DÎ Î[Õ' kŸ÷.™|!ÿt0­$ ïeA(¥¬›&IÂÖ¡®TKsó•r¥Kr$qd޶f—’j<­­¬öGÃ[W¯½ýýÑ׉¾,é"óæ\@$˜¦L“éxQÉ©*u’¤ï’î0Iˆ˜hì9`&rDÖÓk$ãçE0Õñ¨=;2-¢Ã4yƒŠ”¬IGíPt&ö¦í¿ñƒ?ø“§­ó Ñó ‹åµ/D³ÊÈým®³¦Ï_ºt©V«Ý¹s®ÑhøLê™õ t^]]][[ët:pÂ@T”¦i¿ß÷l”>² ƒ×‰ºD­!š‘(‚ßV-W!÷‘N’å¶A¤UÖÐ EýpqÀ½ D› ÿBFJÚŽŽVš¦ˆƒaþÙ±´ÖãñhxÓƒƒfît:»»»½^ïîÝ»£áxv6äìÑpÓR©táÂ…ÃÃ×^zéõ×_ºJæÀ´P-q£Ã#åŠß)3*±ólFî¯î$˜™gæ$ë 7ñ.øpø"9R®Æ‰ˆ †Á䵿¿¿··ªp)eµZ­Õj"«GZ}4•´YÑ3 šó#/hò¦46Þ‰ú+‘ÃbÈŒ Ϫ/4„†[#wP«Õ—––|d{{ûæÍ›é6# W ªÚ7ÌšÂb‹"zBç6×R¶Z-ìm!:]‚Ó`yqÔèÕj:ñ3IFú·Ã uÎùNu”Aðf;­v75rÒôG]ÕGétb­=š Öã1ƒ¿úƒ™‰8I’V«e­•Z…a“”RaÖëuˆ 5@¾|Fä"Ø.£ˆ‰¢ÈÙ©ã“4 ^…Ü3 ¢ãþœ6G â—×9Çvføz{š›ÞbšïIÍøsqâc0¹ÞÒÎG¤¿ñùøè‚7_œsÄGM‹ñ°~¶2chÈŸP¸¼8¡žΞ×ÖÞ BX뤜a?mÆÂ§*É‹k!„%r„.„³9øålMâÌ4Ḵ¾¾>ôÜã¾úâó‡·~MÚ÷"áÎ3i’Šˆ$%{NŒ’a‡xL¤¤²Åˆ´švœ‘E3 sÔÂ!hrº;N%QâÜB\‚Èô»[$$Qì’„èFÝëÞß|Ú¡WÏl†a­V#c§Ó©V«HU"Y,Ñw»B " €&k-œ]¤r)«ýYº€0\^ÜV¯th‚±÷¤Èá}pnlF…Ý€AøÊ èè08ý~0„Á‰‰ÆÙ!Ïž1f~~š ßïïííµÛíÑp,$±#äua§Ó%šŸ={öúõë6cÛ€nð»l2p­ü½lÖ?؃lgöcŽK™ …‚Ïî» îë_%2ˆßb—+¡ñºñh:ãUow[ð˜Ýï÷ñ3"®Ø ž†Œˆ`¦xSÀË/ŸÍu9S:ïps®áh>$à]C¬Ë|”Y ?ˆôpàñÞЫT*h(â!W‡‡‡ívÛexÉqCGâ8˜Œô§Õj!†3ËOùf\ƶiøÞSƘ8,,,,€µÑhxt^c± 6ÀýüƒsÏL±D4 †ÆŠñ ßO{²W˜:v8ª½AX^hZk'ã©s®Ö¨{;Òe-F|þ(‘LD€2øP-gL*«ø9üšÈ¹Åt|¿Ýgœðó‰!qçÓº\º„¿©õ@Éïm?Ï·äË㤾õMuù}®sB‹ BxžÓÎ+`üG;Ù·Ê £N¦Çz² !¤ÖèÌÈ8›˜´?ÄŃ>X,—®^ýÿ¸{“»Îólðý†3Üy¨[óÀyE‘’5Ú2ìÄöŸ… «þWÝ@ ¤Òè @ãÏ¢‘·½oœ’ ‹D~ÇNÜ–iÑEÑ")’¥b±Xó\w>ç|C/žs¾:,J²ä(Žó ò²xëÞ3|çž÷yŸ÷¾Rjgg®UCß÷Ñ™399 ¯†ü£×ëµZ-"*•JûûûRJ4;mnn–J¥©‰r’$°ƒ(¬¢ [ªÑb7¯l­][Y…êv»*N’8ö¯®®:ëæXìÖÚ½½½ùùùåååµµµ¥ÅÇëëëð”®þm²Š Ptø çf9”ÌäÈý‡FDJ™ T†&ò ÐÎá0z½ž‹Ö]ºi­ít:6ëÚrw’$û»{[[[P˜àÊÕjêù&+["41¹fM‡Ñ¹ΡæöÔ ^— PÎsÎ;l@b-_³QÃ$I?~¼½½ BÇH[µÖhÃå­×ëÖÚ¥¥¥¥¥¥7n ‚Ðív777üXkWWÖR<ƒÈó%†öø¾á"### UcïïœKn­Ýß?Øß;xøða«ÕºtñÙ‰‰‰ãÇ;vlfffll wÊ $hƒî¼°]Ós8Læ×ür©Ì™ÿyÆà;’韩¯ÆùoÎ9·Ä«T*`iH)ÇÆÆ&''µÖ¨šÇZi²LÈ#ÛeEÎÎ:ÈDdc%“l©àZkí˜nÃcŒc‡Ønn}Ìñ»KñSÓÙûà,pɱsAE¶©LÕQógˆX0KÙì "FÐø7µF}²å2“ci)¥ ¢ó4<à®Ë•ŸcN„õP"‚wÎcôäu{z÷–Â=¤ÏñW‹…©[Õ··VÛ{o7…^¯+ÓªAV0ÏÚÕRyâå J;ÙTú¶'ÞL,¸°·»ÔÄÿþ¿ýÿËÿú?Ÿ9s>±¤ q!¡;jgŒ¬åFkì¡F#àV¨‚i­Ò.IÂõu‚°¡(|³Öúa€:h½^“X\·Û]__?«ßïá _8qâZq|߇¼Šóù„ é,ܰµv{{[kÝï÷———÷öö¶··WWW»Ýî‰c'Ñ555EDøÆX­VcŒ¬»·BܘM­V à¶Í˜Òh{ØßßGÑeEX@cL©Tj6›’ "éå@0´Î /²ÞÙts0Bœba·Û½óÞÝ·Þz dÞpW޼h™=ËȶYÓö´ ¤(ë´C²³NDèÑb»Ä+À›`¼ÃsƒIŽûÛï÷÷÷÷S€·ÛÃx+°·ˆ¨\.W«Uè«ÌÍÍ¡)Üf´ ·©T&šïŠŽIÀsÔ*—ç# \@ʹg‘ÍILäã 2.Å5Dï/ØÛÛÛ ˆc0kÈØÔÔÔÙ³g›ÍæÞÞÞÞÞÞÊÊÊÝ»woÞ¼ù“ŸüCGXŽlÂ97Ö€X,'''ÇÆÆÅEú­­-´' ƒ¥¥¥÷ß¿Ûé¡»— f­í÷KýÇk+ë#=~üø3ÏþS-x\¨,2“þ[X2ÿÎD=žÓ8²YÉ\k®–=Í|°’sÀÒ¥vYÉŒ¢(âPäÕ…eôÔýr¯9çPËq… ÆX©T¢Ðž{þÒä±É~gÿ`3ŽúLbÆO¦ …BµTn4cãår™Y¦?4hãFÙøß˜ŽÍÎÍLM‡aQ+ÓN´6\iz©¡cœ#­YÂDÂL*•€«dy*èõü)ëq•QxkW‰ã˜8ó}ddS€’$Y]]#Kژͭ·Þz iñK/½T¯ÖÐÃCÕb¤à.ò…{^___ZZºuëÖƒ0º`ss³ÝnÇÃÃSSS§Nzùå—¯\¹’$ ¤9P~pÝ;q¶\¼¬¶Š ˆBúý>ßl[x1AÔëõÑ‘ _^Jýíõ–––1I˜Îqîµ2Ø”pçØI»Û{èô¥'UoD6ƒºÙlbb„ÉHË<×Tçl¥«‰:‹‡êè42`§¥‡~3À¨v÷ˆÀ¨Óéô»½ýý} èÅ* ãããSSS“““ÕjÕàE¦cåܰΉ=Sn؃+8ålwŽn‘Mʼn(×óÅrDI’ ý ga­ES¿”ýÙ8÷S§Náòöûý‡Þºuëúõë·nÝBø…ƒDû8¾¨\)?~|nnnbbbvv¶Õj!f?yò$ÏTз··Ñw´¶¶vñâÅ{÷î}ðÁív;Ž“4¾¶”$ ´YП†m_­V«õŠçyÕjÕ V‹œˆ‹fŒ1‚3‡ú¿q§,ñ$¹æÓ.øû$¹o$"¶9ó7:³ÓBú…ÀZ=Œº’WÜ 2ÆÔ*-ö k­Šʲx,“uY¹€”r3˜;###RÊJ¥²¿¿Ê²^@vívçöíÛD´¹¹ù_¾ú5 Ï€UA'†uüF@ nóþûïÿûßÿþ÷¿¿²²Òï÷U’Â*@k····¶¶nܸQ.—¯_¿~éÒ¥—_}éìÙ³'NœRºÞ¤B¡ð ¨[ƘÕÕÕ(ЦggÐ3ƒ uwwX7È_0ÐðÊÈœüR…U× Œ]\\zôèуð9˜ŠÈƒ4&ç öèZ”¹[\RŒ:FéyÞÙ³g14i8Âèäs2›#;?dž$jâ…”æÏ1×¥‹glg­µÓµ™>Þãtp| •©T*ÓÓÓÓÓÓ•J =8Ž:áì‘ÛEG t÷d柜|lqd¾ÿIÖ¨£êÒ„„b(.åtÛA ”RÖjµ¹¹9$¾<¸}ûö­[·îÞ½»²²’Øà}±½_ýü+.\8}ú4˜ÕÍf:¥R íÑBêõúøøø™3g.]ºôèÑ£>øà½÷Þ»qãFû CD\°Ð/ ÐÙÞÞ¾{÷®”²ÓéŒ<}7¨R©èL#Å÷ý!õYÖ.ˆÊNà—~Øâ§\yœæ d-YÔ°ë*•ÊÄÄviKÃ$NŒ¶ŒQè…éĪŒîÂ28àCDk-Ș¾ï±ÊMbp&…,·Æ°t&hÕœ Áé#p.ѱŸ¬m‰å*#Olx›z_n™±–T?Ë«åxš IDATý‹³ùQgz5xx164o>þzºm£É9£÷‚eD-÷»Gwø]—N ¿fzúçkÖ®íÓNDm’= ÃúÅ‚'=›ˆþAdVw-óãýA#ß“M9ûù$À©”½óîZ–Âù`:ŽùÇG1Ü1B€³*Ùàø ý”‚/êPwi¸?V6ë#aàíîm £Œbc¦£ˆ’„'±TšT88H’º`Ê$¥R©ÕjAŒ‰sx@'‡Ò²îzj­›Íæ±cÇ.]ºôüóσl³n1ÄþZ?íèÜŒ0¼Ù¡`¢!º‚‹Es 2†8Ž!•Œ ¤Ýn®b(ð'"›· ÚZ½^‡wGÕ ô´q)¶¶¶¢(ÚÚÚ:èìoooŸ9sæôéÓx|à´L¥yçuɃ8VƒöÀaèÓ¶›~ä:bŸ¶ŒŸüs@Sq÷K0œ‚ ˜žžÅs ¨Š4‘J£•±J)A"G,<<3gy󨛳?ˆ“Œ&Ø.›M°Àfœe$,Ê”">Ö?ÞMÚÜͳÆå4mÊü/A™9î·ž?5#ü´ T/ ¶'Þ? DgêÜø'Î˲CñNcˆ‹#)eG§•{üÓ’ËuIØ'+ÁîÝŸ.á»v ^-H#=Qâ$‡m“$®É#.Êm¥”ÕF3ÞìâÞ°Öh4j͆”R`ŒiŒc\p‘×lÏ/cÂ(ޤÏF›UÆiÐíkãÕësÛ'"AL&7†ˆ‰„›Ô;CŒ(Ó9ÉÃ<»Ä©(U€ÃÉ9¯×ë@&ZbHãGý!Å?úÑ’$ùò—¿|õêÕf³‰«¶³·Edƒ0©paaáÎ;ËËËÀ±­µÀŸ…äÚ@¸”#r§‹“Vfsckscëo^k]½zõÒ¥K—.>S,ñùgBR¸³³·”rttÓ„(§)B2Î×ù›i€€XÛh4úýa±X}lbbâòåË­VkeeE[P»¡YÑn·ß‰n‚oüøñcl¬V«…î”óçÏ_ºtéüùó®‘7É´÷(C‰Y®4àv¤K£U:”-uÀÃáªa({„œóF£<\.>Ãp.Ñ`ˆcáÜAÀr!Äxpp€;ëEPxö²Q y{Ä Ùcùÿ:ò€á…Î(²Žš€ÁÑ"§¯Õj¸àúñœ„²ÿåååG½ýöÛßýîwïÞ½‹2Šïû»Â×ÕëõçŸþµ×^›­×ëHdÛíöÚÚZ¯×sbm(pàòâ+6660'|ll $gÌ«T*gÏžš˜~÷ÝwïÞ½‹pS)…øï ³{°V«!ìãe)EEòb»×:ч‚?órÈÊ‘güÓ.8`­i:È™àª#‚HÜ8Îy††˜g´&«-%IÂ2+ÓXŸeåÿ¼ÁuÅÊÔÚãH9Úf3”¬MÙ]ήƂ|ì©:åÇüŠ;µ£å©äïȯº«üÑËæR^–ùãŸÃ‚ŸËÖÎç÷•óÁù ’ÿËC™|&â%·(W¥rß~$:gY“2|‚2PÍÄ‘Ž#_ð æ *Iêõ†ýŽŠIb81Ï“ZéH'žHÊ%Ò ç$8IbŒY¨vÁ¤ î´ûRO(LQúFeº*¶\¯$yÁXÃÒÑ#B0nŒQ˜‘x~£Vôúžñ0Ò‰ò¥Ç‰yÅcLúÅQlú=·P²ÅSä4~e6ÌŽˆâl œïûfggg¥”ÇŽ›šš²ÖÞ»wßh»±±Õnw÷÷ÛÆÐÒÒòÅ‹_yåµÛ·o¯¬¬ù¾ß9èªXƒ»wßëÚõwß¹Å,ú«™ŠÓ)­*QRÊgžy˜î{óõTéyÀ"ööþùŸ¿ûOÿøß_}åÕ¹¹¹óçÏŸ=111>>^®– ¥PdÃþ¸ íù‚‹lt®Öš“e‚ ! ÙD+/ð9±Jˆ‰©Öº^¯ƒÖ j:f)‚ /‚H’äý÷ßG¡wll úhûÃA»ÝN´ŠU’hÕéu;ÎÒÒœG¯×[__Ä*„¨ÕjÍfs,[H²=/àR 2dÓ^;2Z··Ì0A ýñÌ +•RÆÏó“ÖZk,1 ‹±:Ž¢½½=˜¬µýaϲ²aøáøÏÿý;7nÜX\\¤ ¶ÒZ{ž—¨¤R*_xæü•+W.]º466Z(…Õz¥R*3K;[Û{ûÕjµX( ÆK…âÄØøíÛ·7ÖÖ{®'䨨ØÌÌÌìôLc¤Y.—Á¥Çl1LíŽ0¤›¸¼F£ÝnƒÅ3==Ýh4fffΜ9sòäIÈO‹Å|}.bç‹"îÖòœ^c¡Pè÷»B²Híªèo†ï4ÆH)èZuÜÞÞ†æÚÚÚîî.0j”»Ý®;<€Ûh¾Bëòc\‡üæ£<m­Kž6ñ,Ó$ÁûÑ…gµR®lmommmAÖŠˆÜ$;gLŽàsP;@f)„xôèÑw¿ûÝ¿ù›¿ùÑ[?ÆÛpÌÆdQåjéêÕ«/¼ðÂÉ“'ÇÇÇ!MEÑÚÚš¢Ýncp+uïìì8á*w¦¸>*YÒC£Ñý‚͆šh­×××wã‰{øðá[o½¥”ºpáHIÕZµZ®Z¿Q &E,Ñínïç“Ü|ªÅ9÷}Á=Oá{I<€Gl¦rku–y3Ò9áË…!Ë9× ›XÉ1)yŽðïiìžüã`Ÿ\ôoÎ2ŸN‹Ýr ¬üWc¬eé—?y$ÿ©WzѳQ!È÷úSîçOtr)lÚ‹õ$±ÃZ‹à/Ö¥K¯`‰MŒq)}cˆ¸Äã,Óu;㉴ˆéÒîôó‰ ~Àýp¬ÕªT*ããã«ëkZ냃½^o`)1†8çšYM¶7èŠe“(_ȱæˆÕ†[* ç ŸY¢(N|ßÓš´²aÀ¢¸äé$à<»áú©‰ éy¡ý4 C ¯Eþg­ ÂOtJ$IâË´$™)6c~'°Ggñ‘ãm€áh“$ét‰hww÷‡?üáÖÖÖ;wÞ{ï½_ûµ_»zõêææ&æìÎÏϯ®®¢Ëá 6ƒ[OŸ>ý¥/}éõ×_¿pá‚çyóóóÏ>ûì{ï½·¾¾þèÑ£óˆÈó}'"šºÃ( ·oß^XXx÷Ýw?Ž´¯1R¯ÕjhåDRÒ©7l®ÚéyÞÄÄÐ]Pf@QFÂà’ ñ©×ëA}i{{Ûó¼¹¹¹Z­¶³³c­™™Y^^Æœ‰ÑÑÑsçÎÕj©^ˆc.`t,tÉl ®ÛǸP¨Ç;†þ 94še?~<!¨ ÖºëÕÆŽygg¬±ÍÍÍÝÝ]§Ç‰(­V«Á=8ÇO¹ŽQ‰@p«Ä2úâ¡õäÜIÜå­Rd‘µD;fŒÙÝÛuÞ“8ç­V Ø8„–àMñ[•J7N±¾¾~íÚµ7ÞxãŸÿù;daFgýÇÆÆ^zåů}ík/¼ð {0õ677Ûåß÷ÁŸG¤lùñãÇ.4t‹S©T@¹§LNÍÓ|T@kl||¼V«Ý¸qcii©Ûíâ– ‡Ãwß}s—µÖ—/_N{äŠÍ˜·xÒ±Q²£ ûyŒŸjAàŠ_*–KµZ­\+ç{¡à#Áá‘¶†9•zS G›Þßóð¸)­“$Qöèþç¹þ`Î9‘uN/uO^!û  }èʯ{Á9’!Ðô²ÎEðCö ¥îÿä,èÔ¥Y£µ¦» ¡¤Ê†¯SælŽÔד×eÃu}mzƒxÐAÀ™UÚ›0ËM‹®ôÀ2N±ÉñU³R¶Z­rX¨WkpÀÕzÍ0ZXZ8Xx¤”âÒ7d­àƲΠ_ zÝn<…|­uàyR’!ë“Ò“DVf, ’ù>†7¤‰/ϦµO=Æcr?[[[¨zÞ¿oo¯^¯¢!c .HbŒŒ4›Mß÷1c˜1Ø‘<á7›M¨R4 ìùùùyÊ:ëz½Þ½{÷Pº«Õðôq/t8 ç¿pH8Èz½ÞlŒJÅ d }?5†÷˜L¡Å%(ZëDik-‹ö!®’+%€Re­õäá€Êíþ¤†qÝçÿ6]·òN—åXW2›Û†¾í´ÿÈZö4á9%ÿç]ibÓ×RJ)¤µÖä´cqš‡d´\׃s´Œ5ïœAp¯ŸÎ€9ó‰¸åÂó‚°Xâ<¥h$‘ÅXf´Ñœ˜Òù{÷™à…xžW*S“•RI'*Žc? &ÆÆ‰H3½µ³×éô„ôíYËIÜi÷¸;ëÛ[…j³Þ(¡1¦ßS½ÁöÈÈ#²\ZkRÚ÷™1NË!+G?በ†i£ñŸ8qÄ™ÝÝ]!ÄÁÁÁÚÚÚöööÄÔ¤ÖºZ­"Ý”™¡c-¹Î<"ò<J7ÙU?9BæFk½±±,³ô ?ÿíßþíâââ‰'jµÚÇWVVÀÚE‡.c ß8==ýÊ+¯¼òÊ+gÏžššBŸ ? …'N<÷ÜsÏ<{ CoÞ{ï½·ß~{ks“ˆ‚0ŒCÜ Ê&¼qã’ŒñññsçÎ]¸pÁÑypRÈuÀTJ’$,]gÙÔ<ù(ïììØ„cƒê‚â…^€wd¨­­­ÍÍ­jµ:==MŠFpcõS.`´-= ò²ùAúh­Å ÅÜp7àè“ÆÀ"Ч1zÙ0îè¦Ãá#ü€i#KÆÞ¨Õj{{{y–ŸM²²ÙäD)}ÊÉ>8#e¬áìh{Ë´„LN„ú¡>‘²J¥‚ž·b±øøñclDÉqlÄJ©ÍÍMëxçZß¾}ûÁƒsssFÃAáÂaRÁ©å•W^|ñųgÏ;v ¤brB P­VËÕÊúúúÉ“'Ÿ}öÙ—_~ùÎ;7nÜø`~¾\gÝâNzt U2è÷;;;+++'Nœ9öæ;ú‹¯ƒò’Bt> 8€Ïƒx/^pΑqöûýíííõõu¥ÔÆÆÆÅ‹Ý„o K˜y799¹¿¿ËÒ’oJa–ŒÎ—ƒ2t&†½ç{ágÊòÈ€1rˆNÿåºða„+'cì bkk ÞWÑív1~£\.OLL@˜“1†c4Dz’üÃæRüD3MÂuþ9emà1Ž¢0¸ËÈGFF&''AôÛÞÞ^\\‹{ddõl|Î`0X\\ÄØÇ·ß~{mmͦ’)“ˆ¦¦¦¾ð…/|õ«_½zõ*ãôøñã••4w~*>3Š"txB€ºòþz½^¯×ÓyÃ!‹ˆ¢p#†Ã!jÀP$õ<ïÌ™3W®\yüøñûï¿OY\‚ȹ3s¥±QYdO’D†}HŸÑB«V«µZ-&8f*•J!,8z²òçb¾8Ž•N­‡²†{’{²„µZ­T,ƒÝÝÝ(謭Óm'gsœéÏÁDYOTöïŸ% eOÏi,RREÊu ÍžÒ3ÿi!°ÄcïAÀ-Åql“Cý|¤¢­qDQgŒ1Ì’Ó'p‹1fpòŸ¸¥ oÀ•Ê¥”d\ëÄ„¯Á|[ÈùñL§7ÍpÀÍJ™Œô"2¦†¡p"fíXkôÄñãRúk[ۉѱÒZk& ®Œn·Û\I¬Y¯×<ÏZÛ%â™r»à,Š!=ä¾È&7œsž:b""ÔTåïüÎïH)§§§/_¾üÅ/~ñ+_ùʻᄏ°° <Ùív·¶¶ÀÂCÁèH ŒVpIœ&ÃÔÌ4ÜÂæfñ ì‰ Àͦ=}ú4'‰¹:ô}|>Ä({XX†axüøñK—.½þúë—/_†ü!na’$øpÌ|íõz8°S§Nu:µµµçŸþÕW_}ðàÁßÿÝHV(gÓ‰ˆËô"ÆQ²¶º¾¶º~ûöí±±±íÍ­3gΜ:u ü) Úoìíí!dÙ Dã¹v[€iÀcæc„ß|põêUß÷!AÌ9ÌŽ)ÕjžÛyAk ¨Å2HÖa>hrY/®"ÀØÜ¨ò¢îëzs±}1[c¦ÀA£lÊ),£1¦V«ŽŽB8e}}ÉÊÞSSSàÙ!LA9™e¼D` 0‚Æ2ÖuYk ?¬ñÛ\¹ÓõDÖú âŒs–u³Ù4Ƭ®®.--J(‚‹½²²rçÎ7ß|óþýû+++©’š%‡^´Z­«W¯~å+_y饗ƽï/--=~üXJÙjµD6ô©^­!ø@ç® Mß÷Ah4˜"EDnÎçö"Žmoo¯T*ŽŽ^½zu{{{wwwuui¸é Ž¿=>[Ÿª³E™ ìÓZCë÷j¢˜†)‚—J%îñr¹ìs?lجá0ª!q’J·jž*ÔÊ•©©©©ÉÉ(Š6ÖÖWÖ–ÝÈg÷¥ì©EYÜfŒ¹üü|ºózÚõ¦XJW挹öbœ©b[Ôù`qÎ=!”—J%fì`0Htß]„ìi&*…ãmØÛ<‰bX{úˆÖ¬#«R*ÎLM·šõJ¥Rð˜%DÊPw¨Ð!R C_JG¨´9Úïûh ‚ †:QÑ`úA±Xà’,[ ‹s3³Ö°á0N’D[eŒ)ÊP3%ªc\Ñ–Ø©V6´eš“ÑÖJRZ âÆ ùM˾hg”ªp+Fd-3†žŒÍäo¼ÇŠˆ| öA«Õ:vìØ¹sçž¹pñþýûï¼óÎýû÷‘É0±*.RíßN»Ûiw?x°ðâ‹/<ÿüó0©££££££¾ïGIŒé@pfQÓgÛI9S@ý‹‹‹Î')¥´2Bò8Ž»Ý. À<‚Ž^{ØyL”ÝÎÐÀåÉçx?r5›±q‰ÀyF34®\vè±àÀxn^/"©©©r¹üèÑ#èú68ŽQ¥Ri48°~¿/³‰Lpê2ñœ¦Ç>Z IDAT㈠D̼t֯ɱa4YVFÂDpƒ81÷öö0·Šgê8;—Ž,..~ðÁ÷ïߟŸŸ£7.M §OŸþÜç>÷Ì3Ï4›M” ¢Š¨ tµZõ„Äat»] óá™ÖôgPjŠÛG,–†ÉÙLh?›çEÑÄÄÄÉ“'/]ºôðáÃ×Ý^«ÕÆï¯^X=Ýô«*{ý¢-„›(- & …‚_ðƒÀgêü0ÙÒZ»QÆÎ ã~ñ8ÆnM³Ùœ›žÔ†B?èö;6cä¹€&ïÚó0¦µ B}¶îX®€‡•=ãU+ši[—凌¬_È[ö©–͈&€: …$#yÈ2ºÈ- éq(´sÀ½N×äiv_—½8ØÛQã*Ym­$f91kâ ð… Æ”G]å°XgZ&àÜêÔæsNJÇøyÁGê^w°º¾Qèõ†ÉHNZÅJp¶¿¿¿²²b+”K¾J)Œ!•è0ž' ú/|N™>Æœî‚tzw>ÁZè\km×××Þ|óý×ý'ò'íƒÎs—¯ü×ÿ鿾öêçÇÇ&?Œ¢howŸsnŒÅàð(Š77·ÞÿÞÛoßø`~aþÁüó n¬otÚÝöA{g{G%ÚK–•Kåf£)¸`ÄFš#¥Rimm åOGpuƼîJ­V{ùå—_{íµK—.9súÃ&7ÔÝfÚ‡ð7žô‘J”ÑF é{^¹Tžšœ9uêÔ3Ï<Óh4ÀéÕZ{Ò×J‘5d ´˜à‚1¶²²zóæ»wîÜ}ôhiccs02ƵÑI’üä'?¿Z0"¾ï7 õ¨U*•h0ÜÚÜÚÚÜRI2Ú÷¤·¹±Q(vvv/?îuûÍfãå—_¾|ùrE‚q£µJ)D¹Tƒ€3îIÏñ1Ž’’µŒÈh“÷1ô”qÁ…'=m/ólm"*•J•Jegg3ÁNBŒŽ´jÕšVzks«×í‘¥J¹L–ÍF£Ñ@C2ìr¹ ·/Nïää$ä¦5Ùb© Rˆ$Iâa$¸(ŠqK)ŒÑn'QIP¸äƒhÀIH!q£5$¸ô¤ÏˆÃ‹#¡G Á+—Ëf}jj ÀÞÞ†\c ¸hÈnc–——ôÖßø»7Þ¿û¾ÑY(cˆ3®.”—^~ñs/¾ðÂçž¿pñ|œÄ«k«K‹vwv÷÷ö{ÝÞÄøD­ZŸ˜ŸÆÑÚúúÂÃ…å••N·Ëç‚'*‘B"î¬×ëxQ*•Ð?c3eo‹Ø±A³Q2UöÃH%‘Q±`ÆózFµ£a¬É0®õ6Veá—™ç%¶ú¾ô=éIÉ9—ĸf¤­ešqÆq<éœqÎ8Yf%1)¹ð¹ ¤zAà|¿à+÷¸ð‰Im˜6$dʵrõÂ܉S­±Ñ‚o☬.I©úÊ*m•²Ú“­Õ‰VÊXm”VZ+­•2ÚXc´ÒFk­´àB@쀘‚3N–<.$c’YNšÛ„“æÖ2Ìhn ·š[¼0ø¹ å“ ˆÄ}‚çVpÒÆ"¾‰’d˜$±Õ‰Õ‰ÑŒkι±r˜P[b\p+¹å\äcÙ0kÏGÔ>66öòË/OL,.=ô‡ÎÅ""Áò|¿P(xaÀ…`œsO ßãž,”ÂÖX«1ÒðÏ0k˜uÒö#m"«ÃSÙŠPxáI¯EQ-𧵪à¾NŠÌT„ $ñ,¥¢a4FZ)OòR–âǸd<àÂçÂç¢ ¼’ø$%¡r&Œ&2d1CÚ˜bàW‹¥ó¨Ýîx±ñ"ã‘ =OsJ¤H ^ߪN<ÐÌD†YÏ×\ûOXRQì3OZ&¬•†<Ë|KÒfqk¹µÜhAÖc$A¦è¼Au—U)Óëõ¾õ­oýÅ_üÅÄÄÄç?ÿù_ù•_ùÝßýÝ­­­»wïþéŸþ)j™ßÍ¡Š {”iOžÝŒ1ž›Í¦çy…rÉ©`Ûï÷¼ Rq_PËD¶„“uðrþì\†ä®L¤þÃ%Ó‘VZcx”ã ƒ26??÷î]TÖmVQN‹R‚°?¡ÎÊ+ eìp|µëg&­+¸|üЯz,#[â² tðTº éh}ØêŽU€T¯Ùl¿u+63p Ð)p‰”R*!öTvF¸ sŠxYiCd/}šø! •ÁÆ –Ï^¹O1™ÜÛˆ8‘çyõja FÛñ aVíí´û«´Ç³DÆ2<©@#FÂúÐã?ò“OOŸ†¸YÆõuA•K¿so{¢'ç“|¾ÍõÌüÛ÷Ï|åIM8ò†#ÿ4Æ8ЃeÂX¾È—°gÜ;‡‰qæW2îêõÌaÈÝeŸ Î8#æ «ÑYf¬$&8„Í'šœsN?íb›DŠYjÔêcãû»{Ãþ@)ELFÖØaÛ>#¢ ô»ý ù!Éã’1RÚÊOY’Åb¨”ŠcEd•JŸy­-‘RJ-//ë[ßúÖ·¾U©T^ýõ×^{íÛßþö|ð/ÿò/ÿ÷íÚ5X=4®Qø­åååï}ï{DtòäÉV«533sêÔ©cÇŽÁj¯¬¬¼øâ‹ãããÇ_ZZÚÚÚ""Ô‰u¦i oðsvvö•W^yá…žyæhÚÁ깫œ¿Öéõ|’Ëã–R 9JÇ333`¾<¥”’GCk­— îu5OøîV²\~FÙÐÜÄÅbq@}B9 ”Õ[­`cÌ`0XYYyï½÷Þyç–Á•ë?qâÄÔÔ 0 1 %“5acr†N¶Ûm€ :ÓÜf8qDW”RÄÂGÉÆuFÝ}¸æAŒ#uæ Øm`€ÞpÀŽ´¨‰ãПïr¡*BPÌ« /X*—2]µ=l R¹e£Ä$‰5Ú’5ÌXFÄ9ãäKÏ‘:•R±¥<4Þj‘"ð™àñúF:l[bd­ŒK)…%A<ËǪq6×fšwx”S}ù(‰J‘uô±'oÇw±¥Gk&ѼӵŸEßÔ¿ÓÊGQJ)ô¾;;ü¡Kkm¹“¾Êð'Á³H:ÀX| ²*ÉFí¦éÌgLpŒ¸±ÂçÜ#fˆ.cc¹VÂ'&gÖòÌCžErcÎŒý(Ò¢°”$ g¬Uo˜¹cƒN7êõ÷÷÷Έ‘e—‚³ä1ƈ˜%ÉÉFÆ2c¥e’q²šŒµÆà JžááìCÆúº%ˆ)c‰¬£cñÉá°××qr m˜!"ˇ*ö"/Šâ6‘Ôb0 ãrè[ß')™ÈbÕ‘“Ûì×—ÿí¿ýß+++>œŸŸ_ZZŠ¢9$T2(KaPšzçwÞyç?øƒ?8vìØW¿úÕ_ÿõ_ÿæ7¿ù‡ø‡×®]»víh½”u"‘Ň,///--Á%cÂ0„“K[a×p;Vщ'^}õÕK—.MNNŠÃtõö| ëvÉ‘î ™SjÚlÖ ¸Ý _ùÊWnÞ¼ùƒüàÎ;Èö\¶ ~²Âó¤V‘V¦Ýnß¿ÿÅ_䜣û‘<vDFƒÑï;99i­-W+FcrrÝ,D„­iôaÏŸ”üÎïØt§™{ø¡^rø‹Žk ”«ÀÏa@‘ÇC‡2 ÃZ­ÆÃü€ ºÙJ0 ÀÛq²ðÄø"äÜPcŒ¼åÄ ¡B ÃNÿ…{Šùš,k×á¹áê.Ø¢¬Øï:¤Ñ _ˆD´24ðt:Œ|ôè¼)Aë>cll Ó*7cà7Ü^‚aU™º*(îÀ9`yyÆP¤`;ö|X,@ž*Ð?±µÐU3ÙÈ““r'.¸p‰{ƒàÿam¥,kËF½ÀËÆMâa16惖‚‘"ëœnœ[Î[Á51ÆI N\x<­†ª AžßjÅ÷9oUËÆN£}kkÇŠô¡ž´ÚgÖr<@B[ÆLÚOn ƒ‰>½_c¹…ŸàÞeJÂË3”²\XžOê„á—Ã¥` ·¶¶`Rœ~údµÖÖf›Ò ›L:žHdò‹ý~_Á5aôP~qÆ\\\¾‡;DÕ ƒeT&l»µµõgögüÇl­ýíßþíßú­ßúæ7¿9??ÿ—ù—ÿôOÿtÿþ}¼?Åâ²…Gôþèž8)aqIc|ß¿råÊsÏ=™Ê³Kbœ­´Ùh ¼Ê©{ ØPd-³xŠ Òëõ&&&&''/^¼¸¹¹ùƒüàÖ­[ ”á–8ªá *Ã8޵2wïÞŸŸ?~ü8Ê„°×ð ν!oƒ¥ÞÜܪÙjµ”ÑBˆ¢íîîFQÔétJ¥’x2^³n¼;¬«a¹ËŸi®†zˆÏãúÀ¢» Ó«`:Ñé 6wGe¤Lþž$¯B £ '”ËåX+àÃÌÚF£Qµµµƒƒâ©8´Ã f­Ãü1 YxSÊ¢ÐË]þ„ "¥D~‰³¼¬­ä?^^^v÷Îm0 §§§ÇÇÇ¡¸b­‡‰J'%³¬µ ߨÀí|ÈÆÃŒb9ç—HçôOc#£-à"ab€£Y+‹¸­8/g¼Ü­ÄÍïaÜÛ§{(Î ×Ç•Hœ8âE\a¡ YF†sEQÇIn©$“ ·$¸äÌrÎ…µVrQ آ“œ,g¬àqeŒ2Æã¼V(5*Õr¡è 94Ê0FÌ’,ô˜2éÓo5ㇺ‡ÖZƈ[XÉ'`³¼sýÐó= ã^dAm¸Œ˜®Ošýi-ÈOû0û‹‡E;3Œ øc"ŒÌR¥YÛ,²´0[WyTJa ³êx†¥R¡T.xž§´FNÆXTƒ±Ô%“%Ç$ Ôh„žïyžä‚ôõ·Œ„'™VqûF—*ÁÔÌt§×ÖÄJ¼Þ~BÊ&F•av@|ww7ýü0¤€“ +¸ó»Ÿ’sssH£(:vìX¯×ëõz?ã………7nܿߵäR–¤rÎ]‹c¬T*}ãßøÆ7¾áyÞç>÷¹ßøßøÍßüÍGýÃ?üßÿùŸC€ ˜ù`0(—Ë`´‚i…ÑÝ—¡¾ð ¯¾úê©S§ÐÞ£³¡{ù­À|ôä?)÷På÷‡s*Fpyô ˆhrr ôÆÆÆÜÜÜìììw¾óÅÅE(­„8¸¤™‰£äúõëÏ=÷ÜùóçÝÖ<88€UBžl3Œ1_”J¥Ýý=\r¹ 2Ñöö¶ÖºZ®äOÇùZ!k Nf¥_÷„äQN‡£YÂCyÃfúVGPÍbŒA÷Éœ1}ÃÃ8züø1ŽÍƒ'Çó<ˆ=A½$IŒEªT*•z ;Äã=FC)5ˆ†ó€Ôï÷Ó‰Ë|Ÿ1†|}kÎoÙ O L²¬h9âhgNgggÁkkkvWðôwñ‹œóV«577‡Üç`À}¨øÎ3@g‚0 u6…°×íaB°›K´µsXjŒO®Õj.äÂç£=ÏeÆÎy;FD˜EŠã±0)%ígS•ø ËÔñ('LB;8 &˼B1I´/8##¥}èw³5T‰ÒÊh-Hr΄àĸ´M ¨ì‹EÉÈX²7[X"Nã¾¾ ßïF z{…äŒIâ¥+ahÄ´˜÷”­#¹š3)ŸäÄyN sÒ*ý(“6¼Þ>ÌÊ{_ú…t½X6·ƒ™a3ß½ÓpJ)eÓVReÒv2ÚËÆè9›R“Ïà()eàù^ ¥b±T✔¶‰2Vrell”aœ8#Á-#e 'kÓ‹qÎ}!¥”h\Î+,eRø·&ÖJQªVæNW¾×í­é2Ï×Q¬”²ÚNÃagÏ[*”jµ1ÉBÉw4’àŸºä7¤”µ½páB£Ñ888ØÛ;X^^~ùå—WWW766>|xïÞ½ÕÕUžÉ9ChºP( füÖ[o]»vˆž}öÙW_}õÍ7ß|ðàÁÍ›7¿óï|ç;ßqE»n·K”NªÂg:®Pþ+.]ºtñâEš9 ž¼¸Kœ!Ë;éü¦q Økè C@ئbjjjzzznnîôéÓÇÿ«¿ú«ýèGè2²ÖZfT¢5™° Ñ»ï¾ûðáÃçž{ãW‚- ÍfÍ‹ Ø€ÑŠ|Î `Œ¥TaÏ+Šy?êì2ç2d¸3uÁËðÒœ9`W †íϱHþZ±Œ/ít(µ»h”2ÆP¹D@X‚ˆà¶£(ÂXåIkð)¥z½žä¢P(Œ/¯®@ÃAO¿ßï÷ûÕjµ×é !ä×X‚2y8KTÖñdâà·ÆßÞÙÙÙÜÜÜÚÚBr>_äœÃg·Z-Êh¸4¡Î ©25é<£jk3LîdwÕqðBá°1Û»;î ›Íæææf¹\¶ÖNMMaÞ%j¨&:ºŸÍ”£º@áãÁ´ŸÏÂV‘¹fwìp¥µ~lÈ׆si¤ð=a­µ‚;êv ¶tBFMÆ0c˜µÌ7$‰q!BÏG€èyJà·ÂIá1猗RêÈ#AÌ0ƈ[F˜]“¿PÈN°ž6ÄGüÇG²{Xx¶„ààš‰'?ùSÝ£§ßI+ÿ—ÛŸØÿP„päýZk$¾D¤¶ìKb'6`³êž5)Ïô¶DÖV <é…ç¥Ù”²† ×Ö&V3ÎcÄ™aˆÛ ”èÐôñ§fÛç—¶F0’¾4dµÖƒ(f‚Œ¶"m–––‡ƒ„¤'¹§­Ü«¤ÛírûÿS÷f=’œ×µèþ†r¨Ì¬yêêªêê‰ÝǦL‰—:²&û\×`}püüü ìïüà— _¾¶,É–t’"ÙMŠÍ¡ÙÕÕU]]seVÎCLßpVDtvS¤%™|Q]ÊÊŒŒøâÛ{¯½öZl„q”8œ9Òš_s.A,¯,÷ƒv§Óôgaö!E±TX][][_›ž™>·²üìsÏ|á™§/]¾45=ézn‰Šq+ˆ‘p¸ÑWX@ÍfóæÍ›ý×ýãÿxbbâ›ßüæ_þå_BDÓqHÐfj63ôeŒýÙŸýÙüÁ\»v­\.ÒÚ¨(ŽˆYÇu,™8‰´Q‚§ó$ØCe¦ÞNcÑ(Gey6ØC™?%v™øàLx&àLDßFûù‡?ü!L­5Yf­õÁŒN’‚”–QD‰±q’DI¬ãÄÒs$#©)¸`\Âæegg§Z­®®®NOO”ÇlÆÔÔä•RFãèè¨Ýn×ëõÝÝ]hG´[­ ËôÇsÈ7§Jï{ßûÞ÷¾·¶¶öÒK/ýáþáßüÍßüøÇ?~ûí·øÃ~øá‡DÍ ÌÆ€/³´´´²²R.—tË)$…Q8 P1—ËåA/•,oXòÌu|•ç?ç!?/Ç{¨yr‡…‹âÚµksss'''åMZã;*¥ÎÎÎvvv.^Þ@­¨ u6·™NΘEÓ:}„¤T¥RÃÐééi½^ïõzDºnH˘8Ê/ öbcL†hŠCÁ-ï¶@Cå|¿ÿ™gämk-Hȇ°ïà—£ÑhÐúÏ÷ýÖY>ÜœsÈgB¹Ã]peÀ ãE¨Ôc蚇aøŸAÁ¯Ûc©HEú¤ ˼øËñØñÁÈ7aJ ¥”Ñ)ŸÚ÷þƒŸ;Ž äx¯c«Œo¸_ˆØm€<Ô‰RªÝ ˜# £‘Š aØ£8ãe€‚1¡w„(ûEWZnIK‡9­…–ëø>G "Rcyìßë ÿ<Æ‹ K–ÆÈehÅδÖdD^âÓãÓ¿ñçæû’È$ŒKã½;Rž¥õxš®ë*£ƒ( ‚ Iôp8<‰Oz­¶ÃÅüä41£JO2îIAŒsâŒ3"k5#*8Ry^ä9Šñ‚ëy¥çdŒ,XeŒ=a„ð«ÜrÏ¡éÉ©µÕóÃá Ñh„aXp½8Žm¢â0bŒ)Ò¢-JíŠ_)OÔJŽI¤cgÊXG0CŒÛܸ=¿ÔÄÉ?ù“?i6›[[[GGGONNÀµÉ[nÐÚí¶ëºçÎÃ%CÕ÷}À€W/?XuooïÞ½{¾ßÙÙ)†(å #!ôZk1¥ƒˆKY¥‚µÑh¼þúëŽã¬¬¬ÌÎήo¬­¯¯Ÿ;wn<€(­&‘I"Œ y ›/޼Pέ<dߘƨø[„[Ô¦ 9O!çš!ø‚»»»>¼rå T'óèŽÜ"_ñ¸¶'''ÇÇǽ^×l2•p¢Íý’…Öµ,³ÿ‚ölIöø‘#Ä~'³ÙAo[?ÁŽÂZxKìïï'IÒh4ŽÁc‚Ó-R 8.,,,¬¬¬ÌÏÏ_½z5ׂÆz@i*Y†õz½ÙlBañàààèèÚœ333‹‹‹Ýn·Ñh4›ÍÑ0­€¥L³(Œ€­³É¥×uÏŸ?·¶¶¶¼¼<;;»¶¶¨¦P(Ôjéî®5®j®ør'ƒ‡Ÿ¸¦d;·~Â/‹Å"òQ ßŽãܽ{7·ýÀΉëÆ|nØïO=õ”ˆ‘ïûÛÛÛýî¶NDÔh40ïû~·Û=wî\þ€ð¬¯¤íøøx8ò™äZ}n ôgï¼yî(¥”ÒB ç{¨Í>•¶Üh£VŠˆ[E†“’éÄ'˜¼‘aŒÉ rS•AKÌ’04?3 o®v»Æ‘Sð™*‰ckݶ²º=(zž3L’Þp å8”Œ81á8Ni¢Àe¥TŽÔ3¦µ&n-žzf„,«iMæÒ“=0)Q /ë鿤 ÆgŒ14nYþO"‚G¸5`ÑÖ&ÍFÒ­< úcpÞ’ïMOÛ‘y› ½ï"Ý·¡ß=ß÷µ5Q’ŒF£~8ìõ»ÝnÀ…'8‚A·\ª– ÓÕJÉw·\îH¡É2ΈÉ=×q¥Sô|·äFQd­" üÓ)ПqxÒKbò$¿°z>ŽÃ( ã8)¹c\kÅ¡æÖ!͆â¬Õr}¿âÌÏN”51­¬uY+„ŒYÃPò"á1&Äriiiiiéܹs@’÷÷÷ó‡ Örxl†Ã!Š0Ô‚Ø\°}LMNÕj5Á$à¸ëׯ¿ôÒKNçôôôèèè_þå_677a܆·‡haîúB:åÔÎÎÎæææÇ›wVVVVWWÏ;‡YÄàùÙ…¼'š·]‰VÞ Y¼ŠM6—^bYC”eÚ4äbƒ\ŒUÇñêêj­V›²þÐxšÜh4NOOQ&‚Š=äˆÙI’ ›Þn·a*üß÷ý³³34P{½žã8¤ ¢&®†È(X@óòíã‰Hœ§ùn‚°•bœ°ã8ý~ÿÎ;½^¯ÝnCÔºÝnAC-ާ”Küܹs—/_^^^ž™™Á-ÂŒ[ Z)5==1Y‡'''³¹5.Çd 9çƒÁ`0£â8n4l6›ÿøÿþÝnJ¹:žq)eÇÆÐþþÁñññ믿^.—¿úÕ¯]¿~ë´&,-˜8á #bŒyžGÜ¢ÖA4ê€UMDššš:þ¼ã8€%ФG?Úê,›ƒ\ ðýû÷G£‘ã8³³³¿ÿû¿ýúu´T<Çm ÷±Ñh`níöíÛ¯¼ò FYæD²¾¾iÕ?í4 ´·Slüó›æcóùzίµÈümœÌjOÍÌé(#RÎ9t—µ1V[ÒÖjeI›” ’gɈ|"{܈ˆÛÔÁõGÃ0ŽƒAB& ÃÅå¥R©FÇÃNoF‘§b­Œ•¢D“'cÆkLÁóç'§«niË=ÒZFÒŽçr)O:Ž£âÃÈ…á@ÔH,Ëù\ôŽI¿ýÃZ›ìÙüsª© ”JT²ÜڔݞéVü¿æøž‰ß࣠úñ.;=>Oœÿ-zmc®ëZËÂá(è‘)¥¬ç$IÒ‹‡á †qµTœ¬–¦§„[BºR%œŠÅ¢å°a%c±´?hŒAóõ× Á =‰ÄéLÖ*FÛz½ÕFD‚”QF“RF©`8"ÃîŽՕµãŽ%k‰ˉc$çY¢ùh]YË$ƒ áûþÒÒMNNBð±0Ÿ²O’¿ ‚F‘ &ñ”B… W…]ZZºqãF§Ó ‚àŸþéŸÆ;wÆ›o¾™“o)ÆûS&óÆ3I¦ô["¢V³â m^–*¨ÿòŒ­p0À,•$—kµÚ… à0==àðŒ¾Ä§t"B£Ê©V«“““—.]zóÍ7Mæ•DY¨c™mˆi°ùÃD5‰ëR[v’$ÍfsÿÊ•+ üä¢0ð{ïõz¥R‰)I¨Á`Ðjµ@ÉΉÊyÃÒü)ÊË_›¹4 …8Ž}?ÀÈÍ`8 Nÿ‡“2™]ÕÔÔ\+æææÎÎÎNOOwvvûýþÉÉ j_l^xgÏó`tˆaVóF["âB­y6i G¬0õ­T*333µZ äê¿ø‹¿@U]¯×oß¾}óæÍííí0 !¥âìËR’è$ â8þéOl¸â8Îm‘p’°áb™ð,ç\87.çF#À× J)AÅ hßa(]­V!1„Ȱ”²×ë¡ Ýh4z½^†»»»h¸Ü¸qãå—_ àNSÅð‹|ðàÁ7¾ñJ¥‚é#` ‘V5Þo4ƒÁ ®yàai󹑰øã$Äü'¶Ê±èx»”3¢³Eh¬±xL(I@Öøh;¶Ö²ÇT¢ƒ›íV8èt:š‘ÂX;73+]§qºwVgÁÈ(‡aE‰!k3B5Lßu+å‰ ÇWaDþ„ÒÚræúŽWð¥ëº¾#=×e©Kp¸ÜiªÕPfƒö¿]ô¥W€÷?¿n&³y¦OLHÛ±ñßœ¥E—œ‰‰‰ÑÄHcÆ%Zë8Rý ßkõ{?š™æÖ™`^±È…Ü’äƒÂŒ(¶”Rêø£jä7hÙD±ŒRÑH»eyi4ŒºÝabÙrcc˜µÖ$*¦¸Óë è­%–5ŒÑŒçûóc‰¬NTf¦¦ÇÙÜÜ,•JÍfsÐëOONÍÎÎb;FYCDˆÇƘ^¯×l6¡ÆZ2c,÷ÕÁë-3QâÏc 1ÿÿù§Ífóää¤Ûíþä'?yë­·Þ}÷]“1JTBD\2Ád®±%3Ÿ]"b–çÙ³\pÞëôßo~@Dðþ3Æ Ã>«¨Ýi‘_ð’$ÑÊÑôÌÔÚùõ………K—.]¼xÅ\µZ…œ/Œá@{ÆçJ)³qÖj•$‰G¼øâóû·ëyN«'nÚƒƒìû “““ƒÞÐZK† û£êD­T(ïŸí7­ãÓ£{÷7¿øÅ/ ‡¯®Ÿ¸¿D£8ŽGýAýødqnMh¬c¿XPÊXˬoÐÉtßOM:Y&§µBı’Òõýb’h¿X(VŠÝa·Óê Þ ÌC\Âó¼ÙÙÙb±8==á¢ÉÉIø)¥Z­ÎÝ»÷vwwOOO›Íf³ÙÇ»×ëä¨HcÁ ¶™NKFé³GÌ(MDœØÉÑñÑÁ!€ŠV»E?ºijnivv}‡?ÿó?G‹ýîÝ»»»»o½õÖÍ›7ŽŽ°H’Dµ:Í7Þ|ýúõëëëë®ïXk %¿:YIµu8Gí®­.WJ“Ó5Nl4YÆ¥ç3Æt¢Tœ(¥ ¥bEåra4=|øðáÇ ”MMMáaV«UhjJ)G!CÝl6ãXµZN§Áë¯ÿ< ãíí/¼ðÂ×¾ö54DŽßÿý~¿o­Å@àûï¿ÿÊ+¯¼ÿþû`cΟ?~ui¤Tõ·vŠSŽîtjÌ>™˜‚á 1J»"‰µå‰ä>31·ÌÄIžîç@æ^"Y¦¼Õžo‹€¦_]¯àd扜sé8\c­âÜ h­XkãRj"-˜•$¬áV[+­R$ÆPn['ˆ#G2’WF`Òá\éÄ’ y¢lÄÕèã­Í¢_d‰q¹07;üř…ëvv›ý¸ß Ë÷d4r²qwà8N­R™›™ŸŸ÷Ê çºä¨ˆÂ0”Œá$š„å\K=ÔÊ—RÊB¡P*ñJ%­ƒ•R“¼FwŒ1Ãa$‰”2Œ#AÜ#Ç‘BcŠ ²NL¾%¥´v„VBZæ2n”å©H ‘I›1bœkŬµ®”vŒ›’­t«ÇP«ñß3Jtü˜ßn%L9K=WΙ$¸d‚[A±¥(— ì÷T0òJE§ècHk•„Z©( ‚p„ƒ$ µU–ˆq‡YÃ,¹”N™’aä²ÜSÊfŠ]Ö2ÁƒA®È!¥L-Å0çMÌãpAD Õ'­4ã¦èxµb¹èxža޲d“BÉð Æ-ÈHGÝQ„a’ðÂ0ÑZ _habvû§‚fùØù?^~Ù%ÂJÑD£(p]7Ù²SÔZS¤=&´¶ñ Õ®çcƒ$y †çMUÏsŒ!`–äÄÜ‘Z ¥”Ë©Rvcɱ»mOêá(4ÂÆaë¬áxÒóõ¥õÛo¿³²¸tec½â:ÜqaTò½À6šËñ¹‰""nYªõ“Ï m'"DVk-¨7(1Ç#,â ¤¯Ο?eÎyN­Ê«=Pr0âyñâEÏó®\¹òï|"Yo¾ùæ‡~˜Ä o^áå´¡ÿ=6(8Òšˆâ(]µa! Qó¬Õiuc¯¿þú¹sç®]»öôÓO_¸parre1¼lŒ£²g,åñ‘ïû333Å¢?…Ÿ–6v:“““ÉÉÉv»=11‘• B'°§Ètû [ÑívÑåœcø* Ó““(ŠZ­Öþþ>&YÁÐÔ¯µÎñsžM<çp:e3@5Pãöû}ô/1„§·R©ä“f0F\^^^^^ö<CÉ[[[Fc4 [­V½^-¹ßïmgƒÓ˜@.Ja$(÷ÓÅ®mÞÃÆ SNê»Æ]–ŽÎ¥F£ÑøÅ/~[P«ÕŠÅâw¾óï~÷»¿÷{¿÷ñÇ?|ø0ÆX»Û✗J¥\k³T*ÍÎ΂c…B †¹¹¹ÉÉIÏqONNÐdÁw,™3ìŒ19„/ Ë+¼ßïã2&I‚ɨ££#Ïó:^»Ý†iq£ÑØÜÜ„uñdµöÌ3ÏH)_{íµN§³µµ…¾@·ÛÝßßcÐSÓ•µµ£~}»Ùl>íy!çårYGô©^Æ+’¼ug3þøAcR6ŸÄó÷ùÍÏæñ#¯ØIlŽãßÎOƒÃtÇr÷ã•«M‡­Öš¬M’D2n­u|Œ0¥RÑr•™E‹b9 f“Íçy´&JyõW¤(­òúæó­)?—#‡Ä eƒ¹d)~l ñ³íÈÿIcmŽˆäý¯_ ! Yÿ‰óùÖ Ðk«•çë/96ÖÐZw:wjJ2Ä%1î8ù*#Œaa3ýŒeŒÈZ´îcLp.¨yP­I,-³†Y›Ï¯‘绕òÒÒÒ0GAĈ9œ'Y`F’³V§}Ò({îbÁ‘ŒKeI@œÒZk-ÏË­µeP^tâŠø¾?== è/osãÅÄ*ÀÆ|R\G䕹mÚ¹…ªaŒ¬\½zõ¹çžûæ7¿ùñÇ¿ùæ›o¿ýööööÎýxð(cô`œ”²ý-(ì‰6koà '&&ªÕj«Ó4Æ€l|zzŠ0L,ÅÑÜÛÛ»}û6:Ê_ÿú×1?ƒ‚ ð…B!I""ÂC(„˜™™YYYÙÜÜú´…q½^_ZZ•aŒ¡)˜„:4ƨ ¥€~'p`| tç·ža1QªxžW©TÀ:v2½â|&„Æ`cÌÉÉ Â<€Fñ·®ëÎÎÎNLLÌÍÍÕj5XÌÏϰPÀȰ‚ïõRÇ{ÜV͉‰‰^/wúL39ìb“““(ÁQXäG~†øµ—1 ÍŽx¼ƒB ^ƒ,ðääDñWõWÀ766^~ùåoûÛ œs&R`¤eý~Ÿs>-Ö’µ·è7°})%.)JcÌ( °h‹ÁúÐZ›ºs¾•ÍZìÐ÷˜žžFn4CÂ0Ækð&ÛÛÛ`ê<ÿ«_ýê—¿üååååJ¥òw÷wõzN§§§SSSëëë{{{Æä17‚dëý ™RªR©Kâ×ÜêÇ7¯|÷dÙÜËæË‘5’c†óüñá·ÿ¼kII#ó}¿R. ¾#8çÜáÂRðTVò‰ðk×HÇr5sVk­ÊüyòÚÉ1šAŒ1£‘¤}¿ßÓZsbÆ“("ʰÈp^z<,ý*ûmM:å—EÛ´ûnú¦ÙºàøUHgã¯É£»Óꧬ°cüÐqhšg ù €§Í¬HaŠáQîþx Æo”RG§§žÓµŠ%JŒåR1.‰iN†Y".8³˜’\ö†”$†e \;f`CV "C)=žû¾œšªð‚ÚiÅL1ÁR9Ò^¯gŒ2J•8œ¯,.¸ŽH,9œˆ8¥#ïŒCD‘Ä *ª%Ô.И˜˜È+*dÄHí±—"„2ç _*ì°x=žá(ŠðžØsˆ²Õj U­V_|ñÅ7nÜ¿ÿ£>zëço|üñÇ{{{I¦oŒwƒº=pN¬´Üò$ƒ•••µµ5é¦ná£ÑèääùMÇZ IDATäþýû[[[ͳV~zJ©^¯3Aß÷ŽŽ®_¿~åÊP¢0Gä8ÎÄDú@šˆ.\ØÚÚú´§† A`DzÎy:ßkð›|ßÀëy^†F£^¯ïïï£8ƒRjkkëìì -F¨C\¹r%Žc˜ÉÉÉÕÕÕjµŠÊÑ =OMEQtpp€©bÔÄA€Œ3É!V/—J¥V«Õëõ0zd³10¢Q(ŒF#Œç7°®rŠMÞ™Æ3Çñôô4`½ ŽOPó2 2Uá™6¬Ñš¬Íyò"¥ÊÿP)ÕétnݺuëÖ­•••k×®­¬¬\{ú©•••¥¥¥ëׯ—J% S0^b Ü¢õ0µ8Y©T')†FF¬’8Ž{½V>ð40à™Áøyü²³löÙÉÔÔTÇðÛ¦lJ £}½^oÐë~ík_[YYùÖ·¾Õívß{ï=@PÞO=õÔÉÉ ²%ÆØÜÜÜK/MPP7qŠB•Ëeñ&çæ ÏT(ƒ¦S<) Ày’¾æ5Óç’Mb’D)GYé¹·\.–½‚;&)„ÐY½•ík*ª1r"š1ÆSJ™DYkÃn'ÿâÀ᱆AÇuG+``©@ýd0J’Dʼn”2 í¸h3‘ë}æuð/=Ø'F'²K÷[ ÃÆËZ8òœ^ÒO9<]‡Lòkž?ž&³xϳó'Þ„3îy^±PL± !ÒbOpT\£a)¢w¼ßh4ªÅòT­J#%7‚”!m2š,³Dœ3c1ÆáZã9ØÆ8cD‰Ö\r˘ΠUm-³V2Œ’ "eŒÒä:Œ*Õ²ôí¹•¥QÕÃ!cÌq¤!Ýõ…`qÁÐ÷ÜR©43]s8i"Ë™e˜2çœ1nÉZ“bnZkàÆžçåªÈy4Þ+‹aBN@sek÷÷Ck oÔÁ¨€‹Å"æ_±w///_ºté©§žÚØØxî™çÛíöÝ»wþóŸÿâ¿8<<̵,rÀÓ'V d Ðz<88ø½ÿþ­ .`h¸ÛíþÎïüÎÉÉÉöööø¯H¬p óÌà'?ùÉÎÎÎ{ï½·¸¸xùòåK—.¡’žšªÍÍÍA`A1;;{áÂ…|Šë—ív;ƒ¯Óz‚²€djj :º—:::´+rjToJ©³³3ˆ)bøòŠŽp1““““““yɲg ÷¨Æh4ª×눗ùãQ«Õfgg1ÜŒi` Ýbºë‚ÒMF昩~¿vt¹œ†a$‘Y§ø¡Zk”nÿâýF£Ñjµ†ó'¡yÜb á™Ë˜äb!>ÙØþþþáá!cléÜ"̬———ÑF)—Ë/^Ä’‡XÆ¥…P˜ÁÌÌ"ONNõz=TÌ&s!ÄeÁzÀc‚§¦R©àraâë—J¥ééé\œ JEÝN§qZo4ï¿ÿþúúúÿñÿÑýÑSO=uëÖ-8U”J¥Ë—/ðÁA‚®Õj•ùåÖáF«Î‚ X˜œœš}êü÷޼?Šò@‹êD8’ËGÒ§ã?²þc°1Vk«´MA5χ¿•Žë8ŽÖ&œ=V‡¡ÞÅÏ ‚.Ε1¦xLDƒ`DD¸§Àr€48Ž6¾VÖZë8iE[ÇqÅžçuš­Üº[k­´‚ Æ8‡©ÄcÕä'<³ øíÁôøt"°W)Ôñ:õÓnd~æxØ)Ì•¿ÍlòÀ9þ5a¯R›¨ä†lYÃQõ"çm qÌfü»"ôwFABÖÄqìúçhláZ­4’jµÚÜÜÜÆÆÆ /¼°µµõÑGݹsgkk HÁ.‡ÍÇWüh4º{÷î½{÷ŽöŸ}öÙ7nà­¦§§Q _»zýøøxssskk«^¯ç›;îîîrÎ1êzñâÅåååõõõõ‰‰‰™™ô€×ÖÖ>c‰c/±°pÛPµçhÁôô4 òãããÁ`pzzŠøÚétlfeˆr Æ*ÑĨÛínnnÖ*“ I’€¢œ› "!4 X@‚.(AºP(€cÕjµ9t3â̹'ì8èÐÓÓÓ''u”°yµ‡`qqÐ+Ø\×E3M5¬ðK1À373ÿðáÃÃÃÃápØëõ0sU(úÃAÇDäd‚ ø-Î/ .XcaŸÇ>ˆŒÌoÿ`ï ¿å‰2•/|á ¹·ÒÂÂÂòò2×03Ò Xmã(‰±ÆpœÌ$8®"ÏÃó án €@°O¡MDŽã`F®Ýn‡A`Œ9<<Üßßï½÷ªÕêŸþ韾úê«×¯_ã7Ë+z>!–e|A–sŽåëñÛ¾&›ž° íô'Å#1–ˆ‹_N¯Ïƒ.ËøÝ×Ù$ç@¨;ŸøsƲðqÍ#EQ¤¬ÁæGj\@0ÿ”qìˆ` ÆI§ÓÓ:QJ9¾Gœ)•ä·†1Æyj!éG+ÿ±’š ¿X‚¡õË1Æ™ “kQªQª•ecD’ØT­lùj§Ûou;ýáÀfó´±J˜%Ò¦ÙîîJ×ãâœ/9ç\HnŒUÖ2b–“óóóØÅªÕê`0@dõ<Ñ×S,ë3çóÔ¨Øð2ÌóApxxφ£££ÃÃÃ(Œ…äix0ÄE:5ˆfyçææ ;=;;»8¿„jÛ÷ý7n<óÌ3{{{?ÿùÏïÝ»w÷îݼ~Å"‡©%¼ÆlooßÛÜú‡ø‡—^zéÛßþö+¯¼²´´tñâÅ•åó½^ïÁƒ7oÞ|ã7>þøãN§c2ÊÖßÑÑQ½^¿yóf¥Ryùå/>÷Üs kkkÓÓÓ.\XYYù¥,èü‚ ¯±PQKa‰ˆjµÚ¹sçΟ?þÑááa»Ý>;;ƒ9b^»ÝN{ç  lfŒFÃþ¨Óéxž·ººzñâŹ¹9\OÎhB€¨ „¶Óé`… !0 „j…/j_ÔÙ9ð,¸åâœOMÍ@s.Þ4]ß÷ççç‘  &åf¢´ õqíêõÓÓS0áqzàé ú¨Z€„#:V*•r±T*•ŠÅ"Þ<2ôAÛí6R Är´ÒÃ8„‚EQ<è‡ÃáþÞÁû·?(O”›_¸p£DËËËÕ‰ z+@ð`ƒ»t6‡gE&²8 Ú'’Ì/¡†SþÕÕÌÌ v¨“““Á` â4}‡?úÑ*•Ê׿þõW^yŃ$©\._ºtI)5===33£”êâÕÕÕÎÙ1ƒÅ¿A½iÆäŽÇw¢<áe9§Osf1ά%bÌrF‚Ó/3œÿ|Î9úd)#ÄXNL’,JfÄŸã–#õûýŸüä'I’\¸p!Š"ø@Œbgg÷SV:iepèY‚ y,Æ*ªJ¥Qˆ ê<F£€lšHNMMA³¶*ÑÆ:IŸv²ŒSƒþˆŽ‡¯­­½ðÜóÖZ˜[­V£Ñ`Œ‹ENPs¾nc¸›&£ƒ…a(¥LéBJ ÂwÇF!%¥¬V«333H8„GGG{ûøŽJ©ÍÍMhŒ×jµµµµ³³3ß÷1æ> €X ƒn\¼¶ò±[ïÇC<ªŽCæ×”ÂÊ™ñjïïÒáyüíÇËÄÿÔèKD"£‰êŒ%k­edc‚sɳ!É¿…1t—òÍ1˜sN¨Q,QbÒŽ>î#úî¹ÔšÂu|Çq¤LR“•!D™K)½²¤§V­zž#Õ¾Ú÷ ŽŸÿo¡~"ú¦°1a0"kM¢ò”å³O> ù¼Éøõ?Rœ,›}âÀmBÙÄ1çÜ$j4q®ïqƒò·ÿzÔtOý:ûý¾V–KÁdbEaP«1ÖÃHä'ÏÇø†yu^•€Î(ÙDd-g:Ñd%=R>‡Ï§•ÊëHovvvyy¹ÕíAqŽÝ‰Gx^¬U§Ó+š“Ó3SÓUI®CŒ` c "IÄkµ)×u}¿855ˆl ÊfðUµÖ˜ñÍå{À‰ãxŸYîy^묽ùñ½;~Œòù)Ü#ñ†øÃ<²šNëLJ'»[gíÖY»Z­"âÎÎÎÆq<77GD³³³ss3œó££+ׯ?õÜsÏlmmœœìïïommäœã)“hŽÃt˜˜Yþ³Ÿü¯Ÿýä …ï~÷»Ï<óÌåË—ççç÷w÷Úµk[[[Nç_~ôÃÍÍ̓ƒËHHAZqÖíöÿñÿiuuuuuõ[ßúV¡PzñÅŸ~ú™íí¸sãÐ1†Ë´ÖD™Þjµˆ(‚N¯ Ú¶â¤~Ì%›Ÿyðнwï4ú9ç®t­µQwÛ½K—Ÿ~úé^¯W.Nž`§v]W™„˜…ÃݽÝ~§ÛïÑå2Æ]ŽŽŽ¶ÜÇ">99á$Récbœ„çøŽpµÒÕjµè—:Nö ^±k{Ó³ÑhdH£ù × N§sûöíf³™$úøøø¿øÅÝ»wã(âBàIXYYn6›Œ1gB~¤P($QŒr3LÂó€GJ -°å…‰Ž!¦µÆ–‡<Êy™‚l£ßï/--¡dT¼À ˜bH †*´†˜`ÒƘ(Šßüù[ï¼óÎÔÔÔ Ï½øôÓO¯¯¯ÏÎÎ...ÎÏ/â£ÅŽtnNJ©8•RƨfÓ—RöûC´Ì/_¼TôKPVAtô ¾ÖºÛí®®®Q¡P¸´q1£™©iÁø¿´ÚÀó‘8Þºu«ßïcþÇÿüÓç_|nwwwai~éÜb£Y_YYñ‹Þtm.áý‚W@·¬ÓïÍÍ–M$I)5Y(4Ãær„ž)n¹ph¬VÈ`öh$¥p]Ï÷}Ï+€h…½õe^pÇÉÑH)òmz¼’ηEßq¹%“¨Qh­¥”üq{ƒ<°ldNÀTÖñ OØ …BÂMÉçÚèR©T®L “¸¯w<)E¡à“àÜá&¦HÅÌw8c%¢(Џ!GHGHT?aZFžç…ÃQÐà„#KTt œ¹d¥Ñ$„ÜS õº#ßWRJÏqt¬CÆ$Oy©FJ‘ÉÚÛ(O”¹ï˜Dk.$‘V²Lð(&Α±©ûÖ"1Iæ/Aw9ØÚÉ™‹G6©O0f1OËm(²!´%vÒíÈ‘’‘eÂtU©T`M«Tœj„#½‚A*ŠEF OëNódLÍŠ].æz¢PôŠÅ¢5é~›—D”C§ibGŒsADŽHG­6&¢Öi³'»|L‹ˆŒæ‚§ÒÂTw\“ðÏ—´RŠ1Û GqšâSBx½Q*ÖVÊx¼ŒÔZ{ÂÁŒ»Ö–Òr‹c†Ã69Â4 vï4 ç¼Èœ”ªªLˆ8Œ„p¤Õ†Luzbv~ªÓkwis*Šã(VÏ/yþ Ýß½»†7^xÑ+ÐH‘Ëc&TòIrÎsF‰Ì<2DZÌäÏIþ€å´Ê´=QÒA bm­EcÕfXnžqpÎ(k¸=ΗW†wîÜÙÜÜ¿÷òåËà°à•Bˆ©©ÚÄÄD±X\ZZºråÊééi·Û===}ûí[ÛÛÛ<8;;ÃI¢¯€¡‘ülY6ú½ï}occc}}ýòåË_ùÊW®\¹ríÚµz½þûœ=óÌ3ï¿ÿþG}Ôl6]ŒQ% ø•><88‡·oß~øð!;/¾‰Èhk´B¦”Õó<”ª:ã誅Ô~ÆJÍÙÝóóó_úÒ—¾ñot»Ýüào¼ñ†Ê Y²Õa¥R9::Ê«Øz½ÞjµÎÎÎŽñqÝn÷ÒÆelô(Ü—––>_»v­ßïïîîÞ¿¿×ëÁQ ×ëÕ¦ªÃápfffcc#Žã?þøæÍ›>ÔÚ*¥€l§Œ1D´¿w0ѹݕ´lz£‡êº®ãxJ)pÄðzιã8^Á¥ŒÙG^ì¡Hûc0·ÀÃ3;;±Öô”Ràb8Žƒ¨ÜjµÖ××wvvö÷÷OOO?Þ¼“¢9ŽÔZ'±:=©ÿìg?ÛÞÞ^^^^]]E$ž››«V«®u8çß‚,W­VÓZ[«[­.ïæææƒQ4WÊ@ )ù0)%à¨n—––¬µÕjõììlyyyss«1&Š¢½½½·Þzë‹/¿tãÆ¹¹9­õÌÌ lµæJ)-,ùŠ…L¥‹b“º_'I¢¥ö8÷OúÙça,2ÛåùØLѯ[Ñæ¡wì{ÏüC)âÿÌ…\ ¶cMeAÜà SI¡ŠbʰAàÌJlVéØÄ"³Gd4Vü¥›ÏØ/óGRg¬i 6#QJžIÎIùDÍ—$I’8V~Ö%Ê¡åñ€ô×ó?ï°>Ç1Ya 7d‰³$3)ÏKÖÃl*sf25=Jwò”Ÿƒ%Ÿ\?¿JAœ}bb8ÿ¯É,?íÈÑÐ< ÈLÒ?Í#Q¼j­g† F&%B3²< Jâ$IÇ1dÓV.cý8J’„Œ… 0qɤfŒ1.¬µÃa ¥ë—Š…Ai…–3"ƹ$΂("Äå^ñàè0œš&¥91AÌ(Ýë1)¥ÄœL.@ ‘K–Cã&6;`nØ‹!õ0ìúýþ{g©üÈûçø/>ÒNù]K¯èÎ;žçÁÑ3}ß7Æ(3Æ þG¹8ŽÛíö3Ï<ÚêÎÎÎ;ï¼sçΔõ±PtòL<™ˆÐT†úÇ7¿ùÍçŸ~eeåÜù­õW¾ò•×^{íŸÿùŸ?¾s‡ˆ<ß‚#ÎQ½÷Þ{o¿ýö÷¿ÿýœbóÄ:Bäâþ@MAÞ6Æ€ã†×‹E|—܇ÆÂ9¼è‡ÃáöööÑÑÑöö68ê`˜KWø¾¿¶¶V«ÕŒ1}ôÑ`0@¼¬Šnn¡P¨ÕjW¯^™šœœ„.r:ä(¯¿þz’$–x‹637=11±´´T(½à«a-ƒ˜v£ÑˆµFôõ|? Cˆƒnnn‚ÃN Qgvv5J«juRJ Xib­ãIü37ŸFäÆœc $U,×u ^›Pb<É`"Õ‹¢heeåâÅ‹ûûû•ÚÄÝ»w%±""ÆÉ ‚àÞ½{÷îÝ«T*·nÝÚØØ¸víÚåË—¯íŸcǯ‡ZÛL7Š"f¥œi•he”ÒJ‘1|ÌØÃl*í—‡4ÜV×õÇ-mÌX}™ÿù¯¸œò/ÏNˆH瓱ü3"º!LYÊ”w½Xk=&ÇKY8ûÄ,GD¡È,:ÀÛÐEbŒIÅad”B8ŽGL.ˆ³˜…D”h«­!↸ç]¿ cÏ“h-iF±ŠãX1Îù Q´8?_ö‹ÌZÉ·¡D<@í‹Eœ%­2«ñ%Œ6à‰1"|ÖhÖëõ—fcùl~±E¦×Ξ©Qj!ÔAÂ?ONNZk‰R¯7¸¸Êžç•J+++ÖÚ³³³gŸ}vkkkooïôôô§?ý©ÎfZ¥ERbâL^ýõÝÝÝ7n<û쳿ÿþ÷B¡pùòeP~ô£ݾ}»ßëä©)ä!:ˆ ;?óñx|áÂ…r¹Œ’l©TšššÊ!p—rs!¸Väï6ïÝ»wzzúýïÿøø8ߪðC©TzöÙg¿ô¥/ÍÎÎB\éààVíh¸NNNÎÏÏç*›¾[€¾Ò»ï¾»»»{tt„¼½½ H‹bqqq~~~ãÒ4Ëøà… Þzë-„ƒæ¸|ùò‹/¾866fÄRlÛ®T*ùt¾R©ö{™‘‘‘UýʹËZ‰wÛ$‰ÆÆÆlßo3YóYÔŽÂp/•&)rÎ!Æ»ç ÚQ,úé~ò•:Ù‹sױǰš?²µBãZ©V(˜P&%¢(R•Z£ÛírÎSŽ+Iöó®ÕâòzÒ ¨„œŠe"zù1#‹°˜L„圣œÆ·ÅVo% Ûø ˲±Ðõ"Û‘ÂÒÂê}oMª~v@á'zšÿâ±'RJ+ÒŠ4Óƒ5 “›3®â8"ù¤Ð¡çº)yÜ›k<ôž‹çUtolæ.wóO¥9Ó êÇ'C•AIÂU,cÍi"‰//%熸ÀcJFg ¯çL8¶‡ˆ¿Ëˆ¸-l‹Û¶m3ngÄ­´çÚ¶)êø]E\‘N{™TºÐί®¯Q„RkM‚k©"%;~·Õj1 ‹JôpPDzT<©X&Ä–ˆ£»é…&œ¤¸cfÜú¾_©T–——ñz,b¬iБ¤”£££O<ñÄ;w.^¼œÇ$.ø\¤ÈÈ¡1¥%Ì\.yH vÅË´ÖÈD9ç˜9hÛöøøø¾}û¶··ßýîw¯¯¯_¹rå{ßûÞÂÂÅ2–&Æs¢h}}ýK_úÒÜÜÜC=455•ËåºÝîèèè©S§¾õÍ`Œ=E\=2!‘/äfffÀ0æœ×ëuÜ cMWœ|>)³ ãwîܹsç”R–-¤Ôap!‚0Àº…·0K·Ý÷ýóçϯ¬¬,,,T«Õ_þå_~衇^{íµÓ§Oƒyn ¯r¹üꫯ¾ë]ï:uê”뺅BÁ°[­V½.KCA#(—Ë®“A‚5<<ÌZ­¨YÝ^]—ÍMær¹\ȤñJ&Ul7þÜÃZwc}?1 NZ^óbñG «Mw%IɬŽ1¦Õ®‹;¢§E£"âLj%• dÔê´··«­ BŽYb|d¸Ø××i7—WËID]ǺRI™˜•Ô³lZ3êiÕ!J`M¢ûEÅ£Ÿz¢HR2®ÌɱeB£ømîÒßÏÊ{Û x÷M3ÇÛ>‚Ÿ11扙’Š3‰Ç¤µVŠP2H®­“ ‹EZ<Ïó¼TÜþΓ¸ÂÏ”þR šU—Ìë’ŸxÎäçš³qΙàLpÎ9ñ–'¥c\I­´VD$•dDBˆPFY/g9¶mÛ^*Åb a/›•aÄ"eŵƹ°-åí:Œ± Œ"­4ñ@FÝnw«QËf³J©òÖ¶¹° 8Wn·Ö¨;Ž“óÒÅbÑͤû„°Pv–±ˆ‰ˆ'ê\•v;`SÖbI0Ž`«îAäŸ~úéV«õâ‹/^½zõüùó@0À¡áؼKJùÖ[o…aèy^±X(‹Ð40—DDè“!" ˆŒ±L&sÿý÷‡a8??¿¼¼ G¸ººzûöísçΡ…†â4]Ä#ä4£+—/_½zõðáÃSSSp¹\î‰'ž¸}û6úVqIÙlÖ¨L$üÙƒ>8<< µÂJ¥‚"4D aa‰šІ…E$±¶¶†»‹,„@IõèÑ£'OžœÁÀf³™J¥yä‘@KòG?úÑç>÷¹3gÎ\½z5 ¢TÚ3á‚NðW‘Üc¬ŒÖˆZ ?þñ¯]»†q@ n?~\1??¿±±‘Ëåfgg:tèСju{{{ã&1ˆ*"¶° 1 3¨RRÊ\.g™ÍfÑÛ¶½¶±Z©TÐ㻽½½¶¶†)™+++Øù°Ë¨3™ æOÃf³YtL!ÐÉår…Bc €v*ãY–•Ïç«ÕêèèèÌÌÌÒÒÒúúúk70T1Œgp)¥ˆQʵµµÕ•µ³g_{ñÅOž† r}ˆÏ–––nß¾m2WΙ’ZÁmøá™ÓgVWWxàþ‘‘‘¹¹9)õ[o½Q·Û]__ÿÎw¾ó;¿ó;ð°µµõå/ù¹çžõ~ì´i½þúë###SSS“““‡>þ|…VRonn^ºtéèÑ£‡†Ú—ëº(e&éõíímˆuAŠDX«µj†i!´ÒívÛsR&\N¦äÏÉã§6›;†O' ëd“Ü›l·ÜÁïkܤ1â¨28ŽÃ\G´EÄã\‘•ìAÔí@O>å:žçåóÙb_ŸÍw„A’¸w?w'©¸­5‹UÔ™G2 "«rj¹3oÛ¤uøO§Þv ³‰|’7ü¾ã÷m/ÆÄ(‘Ú Èv¢¨ÝáíÅtÜždî°RRßõ–ä‹â%™ ƒ]m´*c(.(Üó$‘’œsÞyÔ +9çABOuW|@ÄéÞcž‘ Akk ‡ŒHqÁ9#¦µd’q'? ´ÖÂrc¤5ÓŠ3–M{œŽÔªå­N³1­¥RõfCE2ìúï[\ Úåy^D×zaE*DE^ ‹Õ ’ñ e@g(àí˜Zˆ¹¼H¦âÏòòòÉ“'K¥R¹\ùÁ~ðꫯ~ë[ÿÆ-ÖíÜbJjSM44N)å믿>´¹¹¹´´tùòåK—.m–·ˆ‘Š4‘bŒõø¡[åí¯?÷ )õûÞ÷¾}ì={ö_ÿõ_ôÊ+¤µ’rcc㳟ýìsÏ=÷ñü³ŸýìÓO?ýWõW_ýêWƒ ÈårFƒˆžÖjµ7ÞxãÍ7ßüØÇ>†á•JȇÖZp¶½¹U¯ÖnßZ8x`r¤4,wmg½µmW7ÔV$† Œ´È>v”K⊫› *?ì·SmVW–k)?R!ç\ØýãÒuÝl1gÚAUBÍB*R‘dR‘Tœq¦iF‚ñ”ëõš¯4qbZª(Šþ³=Mײ»Ýˆ¤n4Íf; B‹ ­´ {üp€¼tº°¹i‰·ÝÆÇ !àŒóH–U(–Z5ÕÃ3¢„ÆîÅ(ør¹<::šÏçÝ”ƒââøøøÙ³g£Pr±÷©›“ܾ}NÒHÝn7ÓS Î3aŠ»œs­%‹é0aVìÀ|7==}êÔ©ÅÅÅ‹/Þ¼yóå—^”£éÊE“ÌücdxÝn&Êå2dýóùüÐЪ’˜» „€„¤Š‡æšÇoF¬‡ñxcC–R¢À Ÿ´½½]©Tj•úòò2|F³Ùìëë›™™9vìØ©ÇÞ=11ñÚk¯}å+_ù¾†a½V#"!˜ÛFG‡9òàƒ?~ƒ+pt:”E9ç‘’Œ1D‘Ï£(·kµZÙlvdd×áå5@âx¤+‘Þ¥Ói ŒBˆƒoT(¤”µZ-)NA±XdŒA™»±Óéxž—r=ÆX¹\~ë­·À\ÛÜÜ$â _ZZ*—Ë:8Ýl6uOëqŠEDFãÅ_ŸÉd¦¦¦|ðÁ©éƒ "£=͘¦cZÜÜÜÜÆÆÆòòr¹\~ýì +++†Eß3Iœ={öüùóøÀžzê©?ù“?yùå—¿ô¥/½ðo°âù—9wîܧ>õ©O~ò“­Vëk_ûP¼ñ^yå•cÇŽ}ä#™žžþÁ~Ü‘†6j­V7Tµf³Y­UÉÝœ(åÛ CÎPÍŒG:òžËd½‰g;µ4óJbyâç䓨d<8 ±IñÈ/Ôõ“ÆÄ®¢]Òð„€0VþÎÇ &›Irǵ[Xc¥´(Ô7ËÕMD’q‹\KXB°Lº'—Ý £Z­Ñl´-ƹ°l˶¹ÄHi’Šä®‚tÒO°»Ü¤1h°’ÉBJiª‰”ÀKñzÍN°òÏr$Ÿ8ZVf¢%cŒbÝH­5f4°»(ô ³ÌŒ÷}g%D.:K)“”I[4edR.6&)fÛvÚëJ¥ÜžàD«…QëD½ 6Áâ\k-‡èžëÚ˜ c"0~±°´T:’Lõþ¨‰i¦I¡B©£Hpn ®´RPŒ¼çýÔDšØâ¿&×bÍV 4ÓR•Ë[ÛÛÛLëH‘VФRœu:PJÅ™pí·uÀ½² õö°ñ¸æŽ÷ðŽަ¸ÜE»:@ÄËËËËˢÚIgªµêèè¨â7ó7ÿüÏÿ¼¶”Ôüm6Fe»º´´dÒ—(Š …‚ïûÔÇÀñ‘DE;(†ù|þàÁƒÇŽ;vìØüüüøèĹsç Š +‰ÀÖÖÖ¿ÿû¿èCâœOLLh­766Z­–v-ËÊf³û÷ïg±‚?ÆÒÁá¡[¿V«Áâ`9bñ!1eŒAþsiiéêÕ«ëëëÍfsme½Ùl x÷™™™|à?üp­Qÿüç?ÿï|çúõëÛÛÛZ)ÛqcA×gŒl[ìÛ·ïÑG=yòäÁƒÁd6‚é(+8ŽÓiÔyÜtÓêêêââ¢R*ŸÏ ôõõ™Š°_à9ëëë7oÞÄ-ß÷¡EDˆQ2™L§ÓA)ÀÝöö6†%˜Ææ™FQ„&ÆX±Ð××ׇ Ùétpîܹ³¶¶‘ ÅÑ¥¸Ba XˆZHÕj5”Þ¥Ž& …ƒNNNöõõa-¥ÓiàócccÈøËåòèðØ­[·vµ•Æ‹o|ýëßýîwŸ~úé§Ÿ~úÏþìÏŽÎÝ÷òË/¿òÊ+¸’ùùù?þã?¾téÒ¯üʯ4›Í^x¡Õjáâq—Ö××ÿíßþmffæÀÅb¬oÇqÂÐ'ê ‚\ ö–%¢±f³É9¯×ªŒÓ;&ŒíJìÌ5aŒé»Ðø;ç3½ÇK¡{ %ÉXfÁrsžäþEš|=)ŸÒR’ˆ8\ÛBXŒ÷eÒy/=+äítЉf£Ý£ç°ˆ B˃㦶ªÕ­­­v³‰hÛ‰çRë„jн3à{¼?Lú“Ñ»GEÑn².ÅÅT8³_¨ƒÅžŠ0ÝKaJ÷æIìz»9ö¤FôŽ$)¤¤& ‚¬pi"2­‰¦ÃÐŒw³lÆ}Œ1,BI;¥b\€ÒD$ˆYŒëHj!)nÐî•€•Ò¤H*®‰i⚈“$͈,XJ‘Ö IœÛ–¥é&KÞ}p"Á¸%x6e L˜¬×ëkå Û²ZÝiÍ÷}¿åw%Ó;âœ÷|ÉMhv¦ˆ{æL kRÏT*…lÉœâ®P¬àåååÍÍMä£ÔÓr s¹Üã?þì³Ï6 Œ¿½~{{ÛäÁ€L£(²xoPqrWèP2«Nˆ€…ÛSÒÉd¦§§‡‡‡÷ï?räÈÍ›7ïܹóÚk¯ad år¹Ë—/çóyÀ# ‚`ii©ÓíܹsǶmL¶,«Ûí¦R)"2- °À0M8A¦ÆhƒlmmÍÏÏ_¸payy¹Ýn«HCƒBJ977÷Ì3Ïœ8qbuuõóù/¼ðÂöö6iÝW,V+¥”Œ"".MOOÏÌÌ=ztjj #áq72`–¨Í`ðÕjµ­­-Çq&&&úûûÞ,‘Þp¡:yõêUÌDBƒÙÄÄc¬T*¡¸P«Õ–––šÍ&˜Þ³ADét0/n °høæv»ÝiµÐŒÕj53ó9%œ,í8Χ>õ©¹¹¹f³ùo|ãìÙ³ˆv_›ƒ•¶¶¶–ÉdR¯¿¿mÇxL°hqFià!8–;<<<==½¼¼|éÒ¥ëׯ¯¬¬T«Uˆ¡Q¡ÓnÿÝ—¿|ùòåÇüÿý¿ÿŸ_ûµ_ûæ7¿ùüóÏ‘“çž{Nqÿý÷3Æžþù(ŠÒé´ïû­V‹ˆ.\¸ðòË/ÏÎÎÞwß}/¿ü2u:X¸·0 ¡þ py¬×ëR’°v`a!ˆÓt¼Çbîx×·qÀæ5fÿj­Ù›NpØ ;wg„"–Ž7§ÂyöÐÁ¸©qÒÂRLHF¥´0®\êL*“õRžæYáÔjNÛ—RYžV¤úû ù|^’®ÕjÕjÝÅmËö×â‚iRRÉ0Š‚Ð8ཙÐÛvíJ3ðG˜8ƒç ÛÜ„Ämû=X¢gŒ)%•RRIHCÑî¡Rï|ž=¿²wüò#!ƒ1†ìÖLUAJm2(DQx£©.a/x^/´B÷¦á-Âc0ˆ†³X/]´„àŒ!Sq¼Åˆ¢ $¥µRB@-EZ’¦DJI ¥Ì·»=O¥{§íÝ:"Q6íiIA@žë:t¨Ùju:ˆX«ÛQJqQuÂ@3b–°¢èÞcõ¤î¹Ü&ÃŽ6Õ~¸=ã€9çét½:½«‰—²ŒuVÁ{‚Y £ÓX9çívcÝî9ö¶1ÓHŒ …Âþýûzàßi—q³©Öšóp”Tœ&"ÈþQ¼‘\×…ä<Ï{ä‘GÖ××ÇÇÇÿã?þceeEJ ƒþÚk¯;vlqqqjjêÑG-‹/_h·: ëëëh>fŒµ3{6 j”h—ÒZ§ÓiˆK@~y}}}eeeuuuuu³†zâJšÇb¤‘.^¼øå/ùëßüt-dU+b _çàÁ'Nœ€Ö<(Üú}d ÅäOt¹ !0n‘çyPËd2È 1ÿÇó¼\.#¥†5XÜáÅÅEÛ¶Q¤"277·ººº²²™8û 0 o—R j[Xét:ŸÏƒò žÅââbµZ§¸‹Ôì:ÆØßüÍß 4yê©§~ë·~ëÕW_ýÞ÷¾×jµŒP æ$Hõ( û¾Ì@ zTŽ(2Ú –e …#GÒÃÃÃèY˜˜˜€äøù›DEQ†^*ÕítÎ;÷Æë¯ÿÓ³_ýýßÿýOúÓ¿ñ¿ñüóÏÿÅ_üÅÆÆ|ðSO=õðÃçr¹—_~y$Øif IDATiiIÆí§NçÌ™3 r÷õõáVC9ç’hÛ6èèNÛ×Nnpp‘™",™Ü ¤8;C^ÍNìÊ{9`JV.õt[Ýv» ¹‹}zž×jµÌiE<¿±Þ„wºË—›ƒ­ÁâÙ¦¤m%„b–ÔʬsMJQʱ"¯XèóR­\®ÖhK©™G!©l_ÎñÜvׯTëíV—'R¸Œ$o6JŒEJZë»ÛqM¸ bÖK2'†‰´“GÆw)¶]úž¹õ/‘ ½(‘Ó£´ÂÙÎ2`ñ¿&á‘°»2àwvÀÈ€u,ªˆj`~ 70¹ ®Æ¤R¶msÎB%ñ³Iö Ã…q|æëxŽëº®Å8”ã,.ZŒv“´Ö$8cš3&ã>%Íw3$ ¦Ë£ŸqÞv¤”ãñHS§Ùq\wx¸ÿà¡©J³¾Y­mÕ«²«0›DE2 ÂN³e%Ûpw±Î ¼¢³cy‚.„º¸ç úøõë×1 ÏT)uûöíF£Á8)¹wùšGË8ÉHa;† ‰lZMðâx,ŒçdÛøªŽåyq1©LQB ¤Y­V‹J¥RPë»víZ»Ý>}ú4¤’!a½¹¹933355e9âüùóÍF µºûî»+XføÐ0 ×bÅ"æ0¬ëëëwîÜ9{öìÍ›7—––F½^—‘bœ„ÅBÿÜÜÜ“O>ù¾÷½¯X,þøÇ?þÇüÇoûÛ~à‘Œ¢t&ƒðEk}ÿñãO|ðsss„¥†\‰ïûÈõÑâö5žˆ¨,‚2º¸¸EQ©TÊçûfffˆ¨ÝnÒØÚÚÊårcc#‹‹‹×®]«×ëмĔÏó‚ ¸pá¹sç*•ŠÖ:—Ëe2™R©Ä9ŸœœÀ dø­·Þºyó&‚’ ÆÖÖFry8àáááãÇOLLÌÎÎÎÎÎ>÷Üׯ_¿Ž$É1‹ÅíííÏ}îs(c§Óé¾¾¾jµJDCCC««« €X–U,gffr¹&U`ÿsÎÑ7›Mx}œÇqœ¾|Ò@5÷ïßèС¾þâüüüÖÖu;"²,ËN¥ªÕêg>ó™ÏþóO?ýôïþîï>öØcÿðÿðÊ+¯4;wîÌÎÎþÒ/ýR>Ÿÿö·¿½¸¸hD`0±¯¯oÿþý˜ÛQ(ä0‚ìT*;50Ò¯gÂZ+ÕrýýýµZ-Nq ÞÛ’Ìb–mÙL)¶Úaãì3ùJÐ'uÌó€el4 ÊcÝ"ä2°ÝÅÛJT Ý-­Øƒ*¦GÒ2tSÂöø¥ðÙaä‡YDYWìLàØÅlJp·AQ¤B+ã1ÆF­V ƒ@!˜¶…p,KÀC(¥¥T±6÷!ìµ0xÚÅÃÂ[ð3\»1}úm(Hú.Äûáx;¬5Q\/^‚Ÿø"Éï»'J{‡¤YÇú—øÕð§ŒÃÐ …2žM¯F2,Hó2“Iq©6ãœóL&SÈæ (”I¥µÖnS1Šâ0à .²'.{cštF¡x¯žÛ€$¶þŒ÷Y3 %ERi"IÚ±h 4txöˆ¼9¿º±N¶B(aqΉéPZ{j‰·SÚa1ƒßk؈‰£ z\øÚ ækËs§^¯cMƒ|äºn·ãï„“w=H"’‘2S`áNX<ˆÇÒh¬1A¤ç)®6›M8(¥šÍ&@}}}­Fë#N?üð㣣7oÞ¬V«CCCÏ=÷c¬ÙlŽ#!>uêT«Ó ‚àìÙ×ÀÊFúKDÿ†! rÌEsssóæÍ›—.]‚ÖãéÓ§7Ë[„G0¦333ûØÇ~õW•sþýïÿÙgŸ=}ú´ïûĈqîºn»Õ"¢þþþ‰‰‰w¿ûÝ'Ožœ››㜣+Lk `žótÍÎé¾ëºh«5ƒü0†ÐLD˜j°ÿDoâ}· ¸‚sÉtÙnnnBH¤¯¯¯T*µZ­™™¸RT‚1•èæÍ›Ø~A Ò DD†Ñ7p…ˆÇÆÆšAmþÒ¥KW®\®'$ꦸch­Ææù<ŸÏ¯­­!uCrppp||ÜqœíííN§ƒÎZÈ^‚g‡ìv³ƒV%”“1¤P(ä ù#GŽ\»vmsss~~žˆß|Ï®R©üéŸþéÙ³g?ýéOæ3Ÿùâ¿xöìY¨vommMOO»®{æÌ™Ë—/onn"¯,ßívçççGFF<Ï圣+#7lÛ8Ÿï²ÕmÆ[^YitÚÁtÆh?¦¤aAsÙÛŒ‰›ü¿L§Ë¸É  hc%ï1?'ñÆD›k)–¨C¯T¤„ [ûa „ÅG£Õòý‚ë:®°-×ò,Ëq8—Ž/¥²¹/e³ÝBë­u·Ûµ¸Í4å2ÙV«eq±±¶º¶`Ü÷}Èþ¡BÎc%3,qØDÇq®\¹²µµÕl63™L6 ‚ ÓéloVj•ºçy¤÷º^óh9ÄI)Õj´9‰´—ñ;L+­¥m L3eŒ”êÑÁÚÝ’”’ǰ·|Î)âñvpç"žiÛöäääøøx†™\:”ÁâââôôôáÇŸ{ʦ"yêÔ)89ƘÀX‹Že]ßu]‹‹H‡¹LQ^*Y]^«×ë¹téÒ­[·nݺå8éž05"•R©ôîw¿û™gžùèG?zîܹ/~ñ‹gΜê$¹ŽEQ·ÝqçèÑ£'Nœ˜žž.•JssGGGGS©tEŽã¥R)%‘OD–åà/ƒN'«õÐЈÊ?|ó嵕õ\&ŸÏ燆J¥Ál6[«Õ666¶¶ÊÙlúñÇ[XX¸zõêââb>Ÿ?tè"PhYض}ûöí‹/YZZÂr‡?#" ÖF‚^,@#¬^¯Ÿ>}ZÊí ˆp'Aq\YYñ}ôòN§366255©µ^YYyã7NŸ>}õêÕÍÍMEŠqÁÐ+EšÇŽ¢(ŒBbD~*ã=pòø… ºÝnq oll ¬{ÏóÊå2„¬¡aí-„Ï­V úeƒƒƒRG££££ã#ƒ¥èLMŒ–F†VWWOœ8Þh4^ýõ×_}uu5 "X‡jµÊ9å•W®]»öÑ~ôŸøÄoüÆ3ëë똑ɤ|ðÄÜÜ‘jµº´²\­V-Ë›íïïow[–#òùüàà 0ƒááát63<:¢µ®T*ÍZ=—ËñT'rS«ëõNKJeY¤9u6«, tÚIçrûSélj,È’Œ ÷V«ÕívÃ0²ÛØMãe•RB´ÖìéËD‘æÌr¦´ÖÚ7Gin[;Þ3f èÔ‹D-™í6ß»ÐÚxwK‹I¥lb­ yaG3ízÕJ¥ÛnFQ$-+cy#M‘ÅYÐidSi…‘vªm}m£Ñ¨ Kª°ËÝ U¨â½í·»a—“J¹=U>[mË~[î wü`¡â«a(¸RÊs\Dz3™ ôøêͦf,ë¦$±ŽòH¹DAdÜ LJ¡ÚµãÒz*9»^ÃmÎcÄÓü`ï¦.+/¥en¦!'A¤4ia)Ghî#²-E‚+Ò±ûú‹©j£j)¤Ô<ö¨˜Ë‹Å0 +µZ$£b¡ŸˆÀ7æžJ]­7;~è¥Z¹lAk^­ÔÃP:ŽÉ RÝâ¬7E'Ú·ãZ–•I¥”RA·+ý A¤•’¥Ò.çdÙ<ñÂÈïy É]'cÛ¶7 Ö•ïwµ#Dì8N&庶“Kgò¹\*ek¢v¨ý0 ¥e–EJ+­4S½*ÒJ)SF°î  2Y‰ç"4q;ë‡"®I£]›±Þ3Õ¤¹\‘f\3b‘’J0F©Têäñ¢(ºråJ½Ù É™m¤üÐßÛ|w,³'Âñ€?F¹·Å¡äÛ¡¥2óÐi¢HSPy»]AñLo,2$—ÀñÑH4 $Â+‡0C7î!Q e5 fh­ˆ¿Žyó¾ï‡aøÐCu:Ó§O>þøãA¬¬¬\¸páÉ'ŸB@”¹/.,åzQ<H#bÀjµŽLîöíÛ/¾øâÅ‹qaæD¬Ørâĉ|ä#>øàÉ“'¿úÕ¯~å+_¹råŠÑT©ˆÈuÝ}ûöÍÍÍ=ztrrrppp`` —Ë1Æ¢Ä| D&Å1FДÞÁ÷ƒ V3ú©cèÕ¾~ýz½^ïïï/ ããã÷äû>ЋÍÍMtþ!@ß¶^ÏóæææŠÅâOí¦œ ÷$éùÈDÜóT*E¼W¬A !¹©Òá‘AA,ΉcVlc8í d’éÝ»~Ï.6gq)Q°xîM¬ºEQE›ÛÕÒ`ËeÂö\FD’YçN* FœKÒæ©Å™w/sÒ iˆ=é=“Ÿþ0¹²ñ|Icò_9óãÁ8ãLÀ3¥A¯b¬Ç¦„‰ƒéŽb5JM;ä'&+Å DÑ1f;"¥ÐPÄ-˲¤eÛ6i¾§fLïxÃM¥üŠü' 0D±ÖS«Õ¤XU$VÈeÓ®àÜb\EZ3Šd¨”DöÕ»'ñªû9>¦\.7>2º¹¹ÙîvÈ÷=ÏëþÖÖVO ëžGò ˜½Çx_8ÝT|@Hí+É/Œf\"Z^^FÑ,!ÒqœÑÑQ0&ªÕ*RI°»ch´ ‚Ê”ÛÛÛÈ;1¸"í¹˜?X(0KÑ xõЯÀêïïÏçóïz÷©t:]¯×zè¡§Ÿ~Ø8hÞ(뎌Œäóù‰‰ €½È,V%§µû¯Ûí‚>]­VQ[¥˜p„‚74P¡»’Ë妧§9çÝn]ìGŽY^^~ñ{?¸sç‚67Ýn÷µ×^[^^<þü£> Pðã”R‘’år™s—¡¡!˜ )ØH©1­r»Q©/W½‚$9:* ‡™¬™|çØŽ—ñ²Ù¾¾tÀ”çóÅœDKº2ÆR©·\øZS"ÁBЃ!T¨V`Í[–ƒ(°!bŒŠs26NÄC¨´Ö¡a¯ìnå‡é4»˜âœ¸gñcèÛÂNàw:•Õl*×ηóùb.ë:VŠ1%¬ˆY–„Õj­ÙlK)Y¢ÁTÅDqÓ üßesY+ví/Ú‰†9­v(#ÔGšÂ’RsKŽ520t`bbh HvJiRŒBÆêÍöÆÖ¦Ô­”’ hG&BØO‘ý”‡‰d܇ùvðÏ1ÙÒZ+¦µfZ+%Iq "í‰Å|u8¹PKÎ9#ÍøÎDí˜7Ãá ¸mr° d¤£HG¡ò¼´ã8Œk×uÚ5 ÎÜó·»<B€´ü+veo…Ää8`«‰XëÊq['Ò½V$‚l&)E%ÐÏ7B •Íffg#ç¹³´äû~&•¶Lí^£&nMzbJHÖ™g‰ÖI£iJ¥ªÕªÞM ã è-Y[[›žžÆÄSÇqFFF†‡‡ßÙë¸é¥Ûí®®®B¸1NÁŠQ‚¤mÞr7úd`X<Ñ%„›¿'7´¢îÛ·¯V«­¯¯Ã%h­Ž°EúKñœQ„“HàVWW<¿ñÆ>2ˆÙøøø¯ÿú¯¿ç=ï!¢¿ýÛ¿ýþ÷¿¿²²Â q‘ 855555uðàÁÑÑQŒöÃ"¦8Áå±nâž/žLëÍ TLïDŠ  ûZ-¼ôÒK@\§¦¦Ž?Ž¹Î®ëær¹+W®”ËåááaH1çr9èdaäç|}}½ÛñÍšA[-Š¾ïƒ‡åy^øÛÛÛ0p ž`rr·ÂH{¦Ói×uÏ…gj4FEm¾Hp‰ e±X”R¢©'Ò…µ·‡fèl6›Éd*•J»Ý†ðànܨ¾¾¾ÑÑÑññqH¢ …b±œËå˵,kzzzeeåµ×^ÛÞÞ†{Èç³õzsk«R«Õ®\¹òꫯ^¿~ýýï&—µm{ll,ŸÏcè2KÌØ1.´ÁF£Ñè63,U¯×ªåh6›çÏŸ‚È!B4ãe³©TJè."'Õ ø¬ãBÜ=0‰Šð€¬µàëB›|ÈÀ0IIÛ±TK´Æ:Žg6Z V F§±'œsI ŠBƾ7[-­u§ãC„¨Úl5Âîhkxÿèx*•²Ó¢„[ÕêÖf¥ÓéH©´ Ã0Â2q6Å”ZŠKWï`X~Ê[IÆŠ{‰„o—rÖÏñÐ(0Òšk-U¤£Hûad¸KŽv`´A@Z ΑJ(XXÂô…›@ªç ¸ŽHII¬×.”–e…Á. &ã,ÞÁ{žu"jµZ/ì}hÌQZcÌu2g̶-͉q⤵‚¼#âLë'bLßÏ÷é(©òywvv¶R«nlnbº%w‹ù™ÿ'±Úf+šê/²%ˆhL3RrÝ–2-,,ÌÏÏ?ðÀCCCŒ1(?Œ½ùæ›?ñÁÏ5 èAf2™ÁÁ~dŠac„ŸÖ¬—ÿ™p;J:àÞƒ‰/Ö<6«x£ â©T E; v˜P‹0­‡=ÆÊjRÊJ¥²´´tóæÍ[·n½òÊ+È)Dðsÿ“O>ù‰O|"Š¢?ú£?úú׿2ÇÌŠ'"0Š'''÷íÛ·oß>à«1ÖÀ)j*"VÑ48‰™gó Î3¼ Hw  !Ö××!euøðáÉÉItL@Žªæ ™­Ê÷ÂÂB£ÑÈæ2û÷šBå8Ncv¨Ë™Lp7®giiɈ™Üºu âÕ¦A¶ãwqÏóùüØØ:¦Æì쬈»Ÿ1"‰sqMð¤ÌÃ5=JHCñ3åz½ñK)eµZ Ã0•Ja­ 8p T*yžwàÀ‹ÛBˆ™™™r¹\(^}õÕr¹EQ£ÑŒ·€bLU«Õ3gÎ,..ž=R*•šÍf©T‚€¡1Y)Å-ÈJ‰‘eYÝFWÚ˲æoÌ¿ñÆ‚HëñÞM§…Ò—Q¤¢( º]èœF•üʈYѺ 8Ú¸LúPKÆm‡‡#ɲ¬­Ê6 xž·¾¾Ž”Ùl}b¸p Xèét:Y'ÖZ'{ùc­â®¢#˲,äÙQ­­­µÛíùùùŒŒŒ ¬®®îß¿ØòØØ˜ëºÕjµ¿¿‰æ¥K—666VW—KÀœŒõõòÆF¹Z¯MOOã2FGGs¹!–:¾;‚¡^,å «ÃmÛÎårBdZŒ4#äñ¶ƒ ò[­f“:²ã·Û&Bd2ÐñÌ´1˲°k0Ãà18 Ð 1†'Û²‘øâF½ÅZ¶ë˜oS)e' ’ÞÝØ– ”Liâ=ÃEQ‡tE®ç4»-0 ÛA·Ò¬‡Q´º¹‘Êg·*›•v×W‘ÆÞ´,Åz«ØàÆÃý× ¨1IPáçžTÝ}(¦9ª¿Ú„A: U׿ ri‡¶BêÈ #¦·¿ê8ãÇÑq‡'gK &E%íñ|wZkÀN -âñ5 ‹œSÄù’•:Ä…aá!Ó})#’RJdùœ1KpKÚCv¨œÿ¼"%­IEÒ'ßv¼ÁÁÁÙÙÙf»}íÚ5K&¤t“cW|g¦ÅN‹ÇT:<܃cfNEñ„`ÆÔ1¤§Ñ¾óížPn}±·á@œÁÀÄk=gÃhÇâ2Æž Ë(ÐážXß7“Kcº°R ÍB›››pZ*& "U;z‚–——¯]»vþüùË—//,,@홈`ëÃ0, ÷Ýwß?øÁ“'Oþõ_ÿõsÏ=§µÆè:¨JY–A>Ÿÿð‡?ü¾÷½/“ÉÜÿýh …•A¥°*¾ Œ;Ù“A•9ÌSæq\Æ™X<$ˆ|"j·Û£££–e¥Ó饥¥ÍÍÍL&388!I³•q AlDÜ•äû¾ãÙ¡ Btüö¾¶m …ø˜F£¹ñ÷w·¹¹™J¥¦§§ Ý›¾¹¹É48þÀÌ¡é¾|sÎ4Ž õ  !x``àÃþðää$<î‘#3ÇŽ»sçN:íMLŒMOOc‚–=ö¢ Èm¦R©f»Q©TÐfÝív t:áÎ0š¦òù<Ú ‰][[[NÙ<<%Ù¶}ãÆ D-FÃ4ùt:L&O \ŒŸ;88øÔSOU«ÕË—/Ÿ={vþÆÍf³¹Y­Õ*ÕN«Ýj4U$ãã#Ž—Ë¦2Žggréâ@ß`i`~~~júàÀÐ`q ¿\.¯¯¯·["r<; Ãååe`HÙlÒ]®ë®¯nfå³…l6›N§××ׯ¬\M¥R¤´‚iÖ¨Õï»ï>NÌ–åR'¤´›¢nX­5ê!olWåÐ)¦£x)Í8ãÄ,bL“×K\¨]ot;A·ÛõÛì*/íõ!ŠB:ÌÈô g‹…Z­Ö¬7t$眘ͅmÙ™¬UÌå,íôçú29¥”ëÚÂb¾Ö~"¥Ž”ô}¿Ñnu:b6ßív›v†PßÅó„KDEœïÈ)­%cíͺëºä«v­MD>Æ n¬rK€+à¦Sù>×ê¨n·+8ÐÑRR'F\(¥O ™`Œ‘îÍ3&½3- Äxžž RZk Ö·É´ÖÕj‘GOCж»A‡„í ËWÓŒ8óèI·ÔsWòÞÍ–¼'¾¸ ‡SJÙ"A’M˜FiqFDJó¸0Õ*Í•„’·„R¢ãw›~½T4Y¡”‘gžHQJxvz¤8Òj5laå2DzF«¶9s¥$!œl¶Â3lKE¶/D”ɰt&ŸJs¥})Ûæ ‹1Æ4š´°ˆ1F,d:²DJ)’sK‘´lž/ä¼Tj°PäRW«ÕN½©ƒ(êøñJ7Èf³¾ã;¡¸—= d±808XÊårZK¥C.„&ikíy¶çØ\xÒ’–ßh6;.çê,hês]— AŒ)¥ƒn ƒ —Éj©:寮Ž8Ö½ ÛBqËÂŒ4±ˆqÆ&! ))RZ)b &Œˆ)¦#Ã<Ä´ì fe:J¹BkúmÛ²öˆûæì0ØYf­$ÿ Û=ÁÑd½=Nšm›%Ú= 0yPL!¤c ¿X,–J¥ryóžwˆ”Ò†ºi>ΰàЯø/t³D”Ü™‚ sŽ |ãê’d-ÈŸÆÚÊúúúúµk×Ξ=ûÆo,—Åì\"}衇>ô¡:uêÌ™3ßúÖ·Þ|óMÃ|‘±i6›œœœÝ¿?ø·pN*Öª¥¸rF1Ì §Ì5À¸©åìXº¸ TvX|zœ@0té àÞ¨ñ‹E80Ô Ùî±ã8˜å µN§ÓûöíðžN§Oœ8166Öh4†††&&&æææ0 ¡ÝìȘ\ 6ƒðdØgtN|ß·mËéc?|ôÀÀÐfÆB ¹£W w£Ûíb p¼‰/c ÍFcccò2•JðÆÄÄD„hŽ¢H»Ý.—ËÜN1I¢ŸªR© OMM-,,@ë»R©´[bÔnw666”J%PÞfgg›Í¦–X\\l6›kkkÙb†ûL’ÔZ·ÛmÇqJ¥’~“ˆõ,T«ÕjGÂ0ŸÍò0­»Ûv[õ(fk7À,‹¨7wÝ÷ý<çãããjXnm”+ÛÛŒs”*òÅô±ýY7ß—Ê÷å‹®g{ž£Tq«Ûí6Û-h5Z­L½Þn·Û²‹Õö»‘’¡’¸¬XSk‡¼£c‘–hHe1º#™d²‡FZ‰¸“>‰‚&‹,¦Ü³×°ÆýÐÆôá5^œÓC®AKeöŽÖ{;[xBhLë¸Ü“4Ü뀓IóÿÜ‘ø82bUZ1ŠÅ&‰1J4ƒY–e ‹'¸«&'ÙsZcy¢™4°÷×ÎÎódýö·¿å PUÕÙ3Lmíœcÿ˜Ó儤Ýnóâ8^ZZbCaccƒ»ß¹sçÁƒOž<F£á˜“¥‰HŠ‘^~ñ—f1{èÇYÁçƒÔ$•:¤x´»»Ûív_|ñE÷Oÿ/*¨ªj˜W‡ÇFGe‰˜:߈‚­pÞ¢ÀV¹feæ$= ¼ºå#ûŠÉºãÃŒ‘†VÖˆ´.óšHäÜùµ®\ï4Ú(ë5»fš¦ñ8Ÿ@3‰Êh2‡û‡Ü~ckp$CÞš¥5‘³J)­T^T¡é>3ßUÆ@ÒÄVÖAªæy‹‚6UWÁ ’“j)Ñ¿ŽÜ4ÊxB×|®€û¿5ˆŸ]‰µ ¨¸J‡§‹êdÏHé0p‹A~ÌÚ.â¢DÑŒâÙ~ÊÝ̺@Z+ âÊBB²=xsbøÅd4¥iE •«ªHÇ cz˜8ÖÍVjʲ,âIQý ˜qÐ,Ë02‘ª³aÕ\l¸zÿ ЂՄ¬c‰€«À9T,93µÇf‹‰øä½…V«ÅmôjV6'-µƒIY7‘ˆ€ÕÞxjC€ÖN3¤ˆjùæ€@ƒ&¬»£*@¥¹iRˆŸð™~Pòº¤Lk_Ûý Ø?ÈãÂ$MÑ; ΧéçnƒYžm¥”±¥-ˆPD]UT&Žc Î ¨HkÔ:/ *"gÛà«ñ¡6Æ€Žºí8W–e„ÊCÖ¹çõŒ9§r|sÊ¡ÈTج•»žržŸ¼€#D$몪²q’ÆÉÒÂbβüÞ*¡€³Æ2€ (ÝRÌ ˜Ó‹Š¢ØÝÙ •®\üøñ³gÏòyÿý÷?þøãG)ßGZ>h­½víÚw¾ó·Þzkmmí§?ýéßÿýßïîÖoÖsàÍ´f³ùꫯ²öev Æ~%´òr¹ !wÙ¡ {E´/»TæèºÁ{­…£U)Åp:ãØ©7cÙ¾^ ମ¢(¸,‡K”vÎ1…Û^Ê'Á…æú¢ÿG_#Á°Ïm’$5è23ù†g‹uÂd:âØyS™îC@þ…oÞZË9w\Ô4™LœsÝv‡·œRj<ïïï×$0QþVw$õ’zwwW²À:ÎÚÚãüü6NuFJ©ÝÝÝÉdÂ9ÍfóòåËœ† {{{Ÿ=ØÛÛ[i4sÛÛÛn\”YÃY€F£FÆCªR•¢jRæÓÍìö€KÃ!¢³ì»(TöǾÉw¢£$Iš½ÏÞƒеµkW®v»]"Ê+騥Nb­Ð‚Õ‘N1ª¬%rìWƒÆ4’¤×[èš8Ž£ºùéÁÑáñp¨ok£¡E$¢ÂZð6„ wX„ºPµÙl¶Z­4˴֙ߢsž®5§)«=]˜UØ0eǬ°„¢äP„æþœÿÿ}ÔÎ(b½+ÒOñü8pD U¤°Þ \Aëµ§­©YÈgU)Åæšlo÷e<'~9êEdü9MÓ4ËÀŸtñ€ånù³Êø€‰ÿ™ÿ™3C’°ªÈ˜@•e9Fu!’œ<'±ÃÚPsÖ‘"bOV)xN}›øF)$pÈ9ÁQùEÔÏ ô±<lˆjƒ‚›K†BÉ^{9ÉL¸H(8ø< â`0àjÝ,ˆƄíÒ0€û÷öö=z´··ÇȳRêâÅ‹7oÞ|ž¶Öp] …Hˆòô7ÎÓ@–¾Ï1ÍŶÁB`¡ÔZ@GÚÈ3;jJ)K&ÜÄ¡’àyØßßÿüóÏõ«_ýú׿þüóÏ9GŒ—ŸÿµÖkkkßûÞ÷þìÏþŒˆ>ú裟üä'Ìu%5ÄœÆåœë÷ûßøÆ7¾õ­o]»víòåËÌózÆz–ÒoN‹ %s®NT+† ¡=>æ¤<@ ó™4”'a<w»]¯83B²Æ´gše=į³®å?µÖÍíõz `'8“»’;—{Öžãõ=/:ãÞà3ƹΕQnŽJðãÔRÛ9Õù1¹!ïÁÁAåÙÂÉWTóLòÓqGÂ4M‡Ã!‘­ X®tÚÙÙ©?_Ëцë‰èìÙ³œlÈŸâî±/ÒeU½¿¿Ï5]»»»œEßjµvvv.\¸ð­o}«Ûí>yò¤‚òèé!Ǽ÷»ß¹q¡—À9Ç0™ð\UUE&Ÿ¸‰”}ÿÚÚ~ªÄëRr–•O¡Ÿ‚iÖl6v–eàÈåÑÑÑÎÎN§Ù²Ö*Ek«‘V„AjåÙO-³"‚\^XT4mzhŒ1UG>í_6-ÿ´h§ç”F­Q£C$ЪÆZ810ŠcÈÒTÍe륷§£bIáiôd4ªEsŽío42™3䂞y–9Ýÿ?­«ý7±öµ@™»¢wÜꆳµ!"|$¢¾áY€”/Vžñ‹o‰å,b]‹ÛÊRù"´aößXëà8Ž£¸®ðŽ"¥#¬*4Öåy^ä¹³PUÕh4*r‹G‘ ±=òŽ5›ÑH`Œ‰Ë|§¢ˆèt ùV•Qš>4ã $uÍof"Rd¬sNÄJk@°ÎU&âLèÇÀ |XßLUiO?‚ˆÍfó7Þxûí·WWW¯\¹ræÌNnBßã(ŽcIë•ÝÉ›5ާÙ}á†>yèÂK€Zqò!GjÏØÅßÞh4øŠÑÀrË4LÔ¤ò±ßÉa~c¦aÞZkFƒµÖZiŒk0ƒ¿‚Ù:±.ÅËY÷3ŒÆÛIyŽ"’¤÷<ÏÛí6ÿ¬Ku+Shs£S>5Ü>¨,Ëáp8 Øå?µÏì#"îu||ÌA}Ž|onnr¯åáp¸¿{0™Lúýþöööâââ×¾öµ+W®dY¦R„-¬'&OŸÞ šE©5X‚¢(TUa! µ–ªª´å´›/¼Wx"r2ðy¢$Y¦Ñh´›- 8a?I•RFgc}5K""WYCÎ9ŠÊÒ’²J)¥U„ЏÒYkmgÝnweee8 ëv‡I’ç¹ì1ArK²½§Í‘"bKŽ+L0È”–#Ï"­—ª0«€¹úØÒªŠ’wšò1Ñ©&›eÂbñKÓÌã,_ÄÝŸþg©0Zn ”爨PyDÍ…fØ%á+áSˆY?§ ž7k&5?Ø{/.ç] ð몪LSgŒŽËÒı¶®B„²r£Ñd2™­ñ-Ëe)n m .†¸µ–UU+Í1`ÏéûK 9ÍÙõ䜃N@Ú6?4»úSož¦yͲs¬µ‘ÀŒ¡¤ÔPUÜ Y³PS ˲Ĵ֣шˆšÍæÞÞžw’Ò<—%öûÝñx8Ÿ9³¾¿·'7hƒz$"ʲì?ÿó£ÿý¿ÿŸýýógÏ*eºÝþ•+×úý>½Àw*¬ãsª¾ SZ[9$•‹|\gÇùdï`RäL¦hÉó‰ó©OÖ“ ò=D*®ºuˆ*R1“ÒyFçPkmÉXk³,+'5?¢sŽ%/ ‹ª0;;;»»»÷îÝûø×¿¹ûù½ã£!Öñ”ÚCuέ¯¯¿úê«_ûÚ×¾ÿýï¿óÎ;?ýéOñ‹_XO—Á·$ÔÜ‹ðÂ… «««‹Ë Q¢-™bDÌ’ÔáŸ]È[ü/~€Õs.&;m¥-i3³éuŒkf­ªªZv–4Z­Ö³gÏúÝ…n»×H³|.L#‰7V–©4ùp4ŒÉPUUÝÅÃáqYB˜, @¡ŠT4u4-ÇrmLuÞ»Æ0Ê—Ç„°vNxº‘N‚=6ÊÔø‡¤ï±q¯}ÅÈᜫœ«ˆ*©ŽÒ˜3{ɘ:ÕvN€±•€üäÍ}ç\Elx’gÌà½_Ðé=âj@C) &åç²t[•1Eeó²(MÅqŒžg¦ú8I’ª*ŒsÖ‘SˆZEQÔn6Wz ¨!nµc¥ÑkÁ2 ©NqœZKei¬%cLž—Ö#Fr¢ÅQ›Ê5i¯ÓëõzÝv¯ÕjE:Qˆ,‹¢È“¥i‘çäœBtˆ,œ§©‡šÉ8*Š’;›EQ›¸2…Öšæyî…@Á ˜¼¹)z‘åL'Mwž=eLqï fkkÚ/ @^&ÎpÒ¨¢(j4¨‘¤¤T•—x;¢ÚÀ‚ÀËÓÊ2gðOyvþ3:uònœ!_Þ‚.¨´Ã~¤öCÄSw Ò…0Š¢^¯·ººÊ ˜•™G"bQ%ƒ™) Ë2^ž9‹84ÖDWy)Éû¼f~YÉ úR`ypŽÃq>üì³Ïîß¿Ï-ðø)Äêá†9ßþö·ß~ûí>øà½÷ÞûøãÁ+Qëq ßï_½zõìÙ³Ýn—i{1ppÕ úLbjQ+'{"˜Y`¸ dÍù4"‘ÀXgK1ó+ŽÀã"OÌ×Ó'òm øNÖ›‹<¢ˆYSfÒýBB@—i5©šqfù–pŸ@`†— φ̳ø£~®êä[ œ*°Êg*1Э”b°Z¶Ïßðp|,½ó¼BQ1UC\»Õn·»Ýî³'›à¡Ž­­­wß}÷Þ½{çλtíêk×n]¿ufl{»Ïîn?|B%‹€)ä)?œ£ÿ†Ÿå‚.{ˆÈµ^—¯\[Öÿ:!ðÁ›Úrç,x_ˆE„¸IlóUUUD1"ª8lF9IEµ,IBª¯‚„Aƨ".çVB“bê|ïnôå.à‹j`VËjñ“DQ'‘)OWðÎ9îfÏe$ SpÜpyäØðŸÜ¿EN‡±­µÒÜTk%p¥%KKVËÑZëãÑ@t'+E>Ò­VKV‹cÌ; 677oß¾ýÉ'Ÿ<|øpâƒpò,ÌeøöÛo¿ýöÛÝn÷wÞù×ý×»wïò#Hé‹(¹ëׯ߸qcyy™Ù[$™¶R j¥Ãi‘å—£;wæôqø3,¬‚€w…Cûò6®û̲¹c—€s‘R‘RŠ“ŠÑñ„3Ì A/,¥”sV͆мMP[޲}ùk«*@D6D« u.>||Á ˆØh4dÒÔL±¶uœ¯ä?Ó´!8¿Sl¾Ž Z,+¥\ýXV¤ƒõÝ|¾¥·¾oÁàð˜ó ÏóÏ>ûŒ›Oc½zõå?úã×’ÎÅÃÃò,kQx8çHRJ¾Pà>o¯ËbX>Š"f½|ùòÚêrÅI’tÛ Ñ¥s†Qô4Îpѵ›­4Ž€8@ÈW“X—ÂRGiÝiµW––ŽŽÆãq2­µrä`7VÁï¡(œÆJ˜²Ô!ÈYV³-iO.«¼¨U|ê<`eÁ·^%o6q¾žlNù9T ´ƒ†êBQ ˜rtÌ~ÃTņbíä€/TÀ2A3“óE ø¹X1"RàûËÖ±$fUB=ò~bFð¿ä)ÐãmüJ¬kv&f”JdÃ{~Þ½É ou‰™Xk2ªãÐ.ˆÐ;çT0±sß"u•àO±sNy¬O4ÖÚ¢(Ð×qE¨@'3^e$: µ¯ÜC×]ïä{ˆ8“%\ þŸšÙœ7ºÜ®X…s³£‚FI¢Õ’$1åäysšçùîî.'U±q´¶¶výúõŸýìgsŸû §°ÎEsREQ«ÑVAŽ€äúÊ+|òüPÇ£©Úzb^'Äf‡ûàààéÓ§Ì« „Ö3Ýñ~ðƒÿõ¿þW»Ý~÷Ýwö³Ÿ}öÙgDÄp¥4D´´´tùòå[·n­¯¯+ߊ$ò|áã³d w†(9¡ê˜S×*àð_lÓpçVHâvp<ïüùóÆ8D ÛØE¾‘™l5öë}åÑB´Ê!"SsõÛÐ'pÎEQ®æ2-¶®”R1&,»ùÁÅÀŠTœø~P¡,‡óüpÕXëjuúþº<£ÇÓäLIñõºÌ¡ã|ÀXÉc²ÿ¾à˜¿Kú!r¤!%Ü 4´Í¥ÅþÑÑòþþþhp\+`p,ñåÌÒìî ¯Þa¹ä<ë»èZ9 èé8Ô Z«Óc~PN“.ÁŸ,ç±h"y”R‘BDPš@'#âó KO¡*ýê™{嫨±ç]G~ÖÖR„5àĪx;–ê8+Ÿk òezCÈ!‰§uªaêÖzÏ¡L–O±æQñ‘¼M0ÏÀ(‡4´®Ô4ÍÅÉö“ÃÀçäT5DÔ€DÄœt'ACí …»Î9§T] )P"Ã3uÀ3ªËØëØUh—‚“ÌÞŠlÙ$IÆpºf]Î'™á_­õÂÂÂåË————···ÃY“ßy„ ˜]aþR.ÿ"D },¾>øLi¾gqMy½¬³EéNFÓúo¹sçÜÂB¯–˜Z3Á«ST%G}¬ïÁ®‚ªÄ“Æ)ͬÊ1 K …ˆÆ”!å¦ Sò9[ ¼¿Å°¢%£|R=[™ä›Ì°·Ö2_s{eICk½½½ýäÉVÃ,骢ˆ@×%¹•ãqJ¤g¥gÜ~ÉF9mçpi_£ÑXXXØØØX__o·[D®¥»´\^>ØßŸŒ‡“a9Žc}ÐJ³$JÉÚ,IÓ8‰Òè䜀"Ç%ÉI¢Úív·Ój5³X×ù8‡£k0=øáRª€'„ÛØ9ٱភßOõ€á9 ½ËËPûÊÜZ_ŸyÊ[¹W­”Bm 'µ!x‹}~Î郓?å Ó×ÿpÅŒ0Ý2¾øS¡¯u§‡”8q2Š"Î6¦Ž¸Wž€]øÀ“œ#¥TÅœ}™øv‡ü6&hƒ¯¬ƒgÑ©ég•ß0bF׿5X5›)&_dƒ¤ ÆÜWÈgùO-y$¨ÐcsKŒ¾Ö‚ÕôïqÀ;¦¨¹5_Œ«T"%Á{„²Oý,SÁ·O@£Ñˆ0gv:K—.]½zõÙ³gÚ§_…_ÁO5Ù™`úe©FŒ38Æ z5ÉCpôõÍ\Â➃UUq­¿>777ïß¿Ï]~YDB`(pÓ‚?þã?þÁ~°´´ôïÿþïï¼óÎ{ï½';FÀjžÞW_}õ7Þ`Âdæ›LÓtnÁ1j'÷JxÂ=žê¹Už›^QEÆVÌå´±±±»»Í燭îÉxæÌ™ãã‘èN8 w_í^µI1®Gëù>`<œH¬gz'çVR""þ<½Ÿ½fÖoXÞÂSáäà,ö.N0ú°Ì¿ì™$‰Äíæ“,2E¤v¯RAÔG\v­u»Ý£µìòòòââb¯Ó_ZZ:<<|üø1Se=}útooo8ušÅÅÖññ1•n½¿´¶¶†X«Ù/•°_:ø>¹6Œ;_­¯¯/,,¤qb5®Bi¥ZÍ&³lª0ÆŒF“Á`)]æY§Õî¶;i¶»@!XR­Ó4Mã$Nê´XE–BØÎ&?ì®âÃ;™L´Ö§ZVv¸¼bí´-]xXÜsŸRQÍÚèèªÙQçÇ ’ÖZ…ÚéÕ`\N³Z*Í}ãWQ§Üç‰ÜÿÞuàþKù|ˆŒ1…)Yà Ȅu¢Ì´Ý†a¢‚NâD,ZçœÒóÚë«wî"1ÂÏöÁd2áþÇÇ#fu!"V«|A©Ï±Öïîî‡Cç(â>’“É„ù4xG"ÕÉ_’ÐDy€EWÖÈQ”<km§ÕXX3?øÜ.o±Ê‹6 ,ítZ²ý$~áœ+KÆL5ï:ÎÎ,TV„c"ètÉgä?µoÌ?ûýþêòÚòòòh4º~ý:g9ݾ}ûáÇ­^·µ!>Ùuý–º~þRº¶Z:ˆÔÿ°òuÉ\Þ³¼¼¼´´Ôh4,"E¨œ³0Žu«ÕHÓt¢ kʪª†Çc$ÈG©3ë¨ÓhÀœ2 €HcÍGèP!Fˆ‰ŽbI6sƒL%ì ßÑ_sšJS ‡ XŽRªò:ÃÀléM0JتÄYaÑι €œÓ4AÍ3¯Øž]ª“Ô"5í:#{OS„_°²Ð¢fü3º?(ÊpçÈ‘Í_–¥˜ÂẰ®åDè9`ó—pš¦±ŽÅuÎq(N¬òsäkŸá[›³®Þiüuì+¦i':ĺÐç*‘«SUJñgsF®ÊSÈqt&˲fš¥iš4’ðÍró±ŠÃ/ ¤nÝB—ktY#bÓ{rí­³¢té„à<å|%‰æŠcEÑöövì[ãíà.8ì÷û¥®À!SZ¡IâäB(¥­¬²å8±x­li\Ušr<œc";çʼ‡UaFÇc›9pµ 1ÆìííínÝÝíÑhÄ)BIçyÙí¶_zéæ×¿þõ7nlmm½÷Þ{ï¼óÎÎÎpû):*‹ãÄ•Äí‚ÊHŸ®xLͯ3•eujL *Áq9JmÒî4––û,p‘«"T Œ¬l«Ù\jd9ª²,M^ ó*"„1åÖ×Öt‚fb@Eš¸ Q£T˜eI»Óm6;*JH‘R*V±#…® èƒú4Ï´üKg`Êö:çˆÓ8Ó8ÜEY3—ˆŒ-Feª|8æÝ^ˆ“N¡;­Ë™¢œLò¨¬ò,Ë&¶l¤Y•¤&I³8Ã4‚ˆJ(‘¦lƬ½ø¦¬™SEFÅJ+¥Á9 Š€ÀUÕI€ž.Æ™ιʼˆIk­AUUeUµªÈΔ•Ém™›27¥)K™†:CŒ#ë,U¥³¶ÌÇy>NÓ¸ßïÆiÃ0¼FÕH3¨“èàà€¯Q–9ÆŽ”"Î!Q̪ K’~¿ßH›J)kŒÒHˆ†yŸê„ƒDÜY¦ëŠ¢X¥*D+eB¢˜¢(€"¯&K‹ýÅ¥~’ÄIfÉ!:å RåŒ1ÖTιvÖØÛÛ«Æ¥²¨1BÂT%¬Çñ`0(Æ“$Ž[fÇi’¤iJè„ßI¤ŠÖH•eiÉÅq¥ ‡< gÀ£"7c®]jÑd2±UÍ Œ·8@ Š£H!VeIÎiîôã¯R{¾bžÍ„8Žoº)›=PÉÿeb¶ Ã& œ{-{1œYFtG£ã™ü½iš.,,,..>{öŒA¨ ±•UŽˆÆã1s)WUÅ@17‚­SI£H¸v¹ùˆfÍ”}8–Ón3†ªªb‡Y ‡Ã¢(RÏr§µfž#Ö@` ÷Ó…V«qáÂ…ëׯߺuk2™üêW¿zÿý÷¹A,ðòýÇq|åÊ•7nlll,--q'6Ž„ÞA)•D)»_káoŒã¸&0‚{™僎²¾²düYÀ†ð÷ÐMÔZ/..J³[Qι~¿Ïe`B%ù)Ƙ££#Éuw>nÇ€+++N‡+vʲìltij —wHx3bÑ'Y–ä ¾Ÿiˆ7g½ñ”ž3Wë?Uµ5Æpzs.I’­]Îl4ì²k­ûýþáà€½Unÿ ˪±®Ý’ôf^Sx£¯,MÑ¢ù¢ø­µäJ›µPõ˂ҥ´…i¢Ó¨fkpÃér…*"²ÆAD"X5 †ÖZE3L¢õ‹ "•D 4¤QÜj4‡,¯ÊÊY"BЄ˜WÅ`4\6-k-ð¢!@¥°¾-?ùBš*Qø²áNDXx„†Z¨k¯xD€È—†Ó%Gƒ¦.ã4· <Ê"±FãÉÛÁÕ6â4‡ŸÉ.|™ èä &tè,ÕlUˆH Ð·zA!¾!·äœ#DÍçHcÎY„ßo’©½~ïóB>þ¼Õ›+§¾¬ç7Dfƒù@SVé:1»Ñh¤iÇ:A­gY‘Ïç¡*·Á>£â3Ý5âX{®ð­RÊ""ENÞÉ^ ÛLgÅfšO€gãä˜Re2`+%OD@AFµlDvX9嘿‰y%k‰µ/“Ê=…—²ÖHwt­u³ÙäÞÀwïÞÂ^¬xùìþþ>óŠ ƒápÈâXå+¥VVVØÀçV9Ü6ÓFŸbÔšuFQÛ›;EQlmmq~Ÿ7Vլ¹=ùŒ¾Ú¤èõzKKK/½ôÒ+¯¼²¶¶öäÉ“?üðý÷߇À¾8÷HÇÜåæ›ßüæÙ³gYåÒÅÕŸåe–}/?_•ã]/“1¤D1ó“JÖŸóuèá‰’Ø ù"i9ŸŒâÆqÜétXs°æÅ¤ª8‚ÀÕY5ÕªoäœÛl6ÇYE.\¸víZY–{{{£Ñˆ]aåYˆ_²ž&ŒäœoOÇõüFTß?L'‡WŸ˜ s¸—,Mãñx8nnnæyÞh4¸,*I’V«•çùÝ»w˲\[[;:>äNˆ|Ò÷{' RþÄñ~Þ`*è¤=5&!}‚¢ËBðu¤”5ùDʼnî¥zQ7 "£€Xk U¤µ³ÖjÞ0 òÕê]ÓrÁ©öU*‰ã8Nâ8I’4IR­#®xCPˆŽÈhŒ´›­Õ…¥rT00VUVið±ùºÏcÍÈÁ¾/!·BçêLTIÛ™U_ ˆŸ§€§ :knŠL ?8ÕJ^Ÿ…¯[i$1YßG‹‘BÄ\yiš¶ÛÍV;K3­P@Úë*SU¦&èð="¥”Ò‰fM!7L³U‹bCïmršñ4YDבA¯€é„ÞÛr§(àpsÈìV¶rÏ&EO #Ö+`~€š!Ì7»vÝn÷ððÐÎÖ ³0rÎ ‡ÃÝÝÝããcÞÓ<;‹‹‹7nÜøôÓO?ûì30-È"ÉêŽF£­­­$IX‘÷z=nÌ®|Ó†µÙà¨áÒÊ¢õûlyy9Žãf³©}¿9¨„¥CÏ~Î|‚È¡·x­VB0c²õQÝ^wvvž>}ÊyX×®\¿uëÖ… ÀàŸ\ÆÇ&Û4BÆ!Ñyb° .÷rÎ…<\d®hkñþÁLò*ƒL«–ÉLbµADD`­­ÈV”2ªª*«]i¦¼³ xªÔCgÅg™—´³P•¶ª¬KÁ$бç@¤iÒ[è[rE•BY–Q7ZY·ßa0ƒùª„œ}fMÖ֤Èç¶âWÏ“Ú2ÉsC>UÊœŸ¸~Ó.¶#ŸAÞÞ܃ãS,-“Yõ ­,9SQ9rŠ@éБCTÄ s:±Sß›ª1jd=GP·òDù/‰"”T–X)å|ëÚеM“p“œ´Nž7]2$¼"ö ÿÖgPƒRŠ´¿Žß_q’ORŸÆ•¸àÀ80Øú/­«ª:]Ï&cŸ’ºrà¹Æœs„Nâ}"L€êœÙ:ÀS¿ß’ö@½^þKã)ÙfDÁz̈8}/V¨Ä\šñ4ÀÆï Ë1•/ÔaˆŒ gégŒév»½^Okç¥@ '×>|¸¿¿ÏE)¼õÛíöµk×^~ùåßÿþ÷?æapI† ƒ>ùm41iïõÑh$Mx3䔊ÑdÈq5ÎpFwîÜùôÓO˼ /Kž«Rv$Ž{÷”RÌMa­Í²lii‰Û-¬¯¯Çq|ûöí°YÀP6ôz½sçÎ?¾ßïomm½óÎ;ÛÛÛ‡‡‡I’dÍT)Å|ËœfÜn·ÛíöÊÒ*30k­9Ù˜ÿ[T¹òŸTÀ'ë¤v>Ð*Èѯ&EÃÉ‹"¶Èûë:à à!ö™DÂx'YÝ¡ò»~2™ =zÄ%#óY–=~ü˜­ŸGíììpÈ?IîºèŽ*ðÙÿ|'RäÇ‹ÂÍÖ €ƒj7+Ahê7Ÿnp:šLxoooßZÛétšÍæ /¼píÚ5c!åÁ IDATÌ'Ÿ|¢”⬫n·Ûï÷™7ƒ¡”:¸KSHÙ2w""²o͆QE\·VU•Ц|,3’(ND–qÖ%ßs‘c ©Jˆ Ë´Áº ØZ ÖB­2©2A@DÊV­b7*®Å“FÅq„ÃÃí­­F–E¿Ýli§€¨Í}ý~ÏZ£Ñó$Iûý~³ÙÔ€õlµÄBª&v DÈ«r4çy^ÙiìfçêϹ=®»HðPJʧÀ—kOÏÓÈø³TʱáED˜F±WÀ<À’#7Ï”Tïº{*_„è8F.î‡@ ‚CD.ž¢z>Aƒ×ÐÞ¦ç4–—µ,Í@}2!xš''ŽEôu<3"šøuÐ3 Õž3ÿϹ}k+cˆ=ñxÜl¥Qœi…¥sŽÈZ¬Œ+¬«,ïç(I”7ð7ŠÅ ÓÖm’‰È:«’€àÆPkšªÆö­³B:ïY enêj?†›™;¸šL&i#á‰sÎ1ð‚›??T¼Ùlöûýn·›$I³Ý‡Lpz||¼½½ýôéÓ²¨¸’U†Ü!K^´¹)Š¢Ë—/Ç+,¦×ÖÖ^yå•K—. ‡Ã{÷î}øá‡›››âñw»ÝÕÕÕ^xñºßýîw\[ÂUI°°rçTžó(Šn½ôÊââ"³¬1ëòÒÒR·Ûµd"߆kw3Ï—–<ä-û"œ+$6“õ)K’HÅòE6œõļL‚yðƒó¢‹ô!OD§}¦›){{{w?¿·¹¹¹»»[–å™3gؼÛÚÚr`‡Ãá£G>|HDׯ_o·Ûb±Jãìkž.!“³Š>BcL% Øùb¾PjÌÙ×§zŸÀ Ø?5ëx¶øO¦9ÇUUq:ôúúúêê*³¦c˜ÑFk Ql6àºã<ðh¿hDÔJžK°;Dlf q˜x•“}Ò´º«‰j`Š­HWš/ëí*o!›Ž•SŠg8@ëº*Zkí(ÖeG`¡ªìñÑpaaaie¹ßé®ô»Y) ë”F­Pihu[:‰›v>)9(Óh´Y¥:9·øAGÄõ÷“"­ÿÃ!²³†(Èõ &}ªÿôm6+ÑëóéÐó¸q†i˜×ëš©Ôz-ìˆ,9…§«c !jÈÞ6€ªCJbîæBPªdû¢°@Üß7H֚ɠ”oŸ‹8È™q{Ùö¡vÎÎiß/ÆXËþ´8²F:qš léªÊZr #­Ir C³† )ðÍA“sŽtF_ H{P)Å]®Á†¥Jòø@DàéieãÏ==gÔ  ­PÀ[„zê\ò$ÊÊñD×eLžø—yÕy1$ýØZËÁWÄqÃ;CÄÁ`0ÑSþöz½‹/~ýë_¿yóæÚÚÚíÛ·õ«_Q¢"‘,ž=Yë'Ʊ«ªj4Ãñ1ã½ZëýýýÇïíí€T…Cô Ï’¤Ô®¬¬h½Êˆ7§Œu:û÷ïÿú׿~üøñÁÁÁh4€ .¼ñÆgÏž½xñâ/~ñ æÏDšµ(КÁ&¤'¾í'Ožp?]Æ»$vr88P>¯Ç3¹•l·ÝcìÒ4]\\\XX`NAŽÌ1ÀK{ŠW~ÌЖu‘½Èqtk-+x1iù»JSëf†RŸ={öñÇsNܽ{÷ÓO?UJýîw¿‹?‹Ž=zôôéSŽÍ¿üòËl+ð$‹{-²FåÝ”ó’G„BǦú2‘;|`ÂÓ^¬øÐDÄæZ¯×ë÷ûEQ°§µî÷ûÖsFv»Ýv»ÍÙÑ$¼’åL*¬¤4’‡R$‹'œ°ÈI†2e%ÉÉà›–eÙi·ÊØvÓT«¦Nu‡âB;ˆ xñë%/:ç׉Ȓs0-C"Ë¢«ý%NŸBf:¤‘#b~ ^cðIX9®¤”ÿRrnZ îwþ|Ÿ% ‘Àå3—8iî9𩯋Õ.oãÙ`šaˆTÄcl¨ÿ0„•%2ÆRžãp'I' Î)[’1΢ÞcÈ <…™¬>"*æEABDXð"sÄš7Õ4ïDæÓ9Wç>‹c>¤ýüy ­"Y”ˆÛ¥qòôûý(Š]Y–œK5yoq"q–5¹ésniiÅ/§Žãœ½dò ;°µµupp´±±Áœ¬Ââ"¾×O?ýôÎ;W®\ ×ÕÆÆÆýÑíïïŸ9sæµ×^;{öìïÿûÑhÄ: Ùl²ž6v؆`a­}ž”eÉ~'‡î8Ÿ÷÷÷öÉsÅ´Z­¢(Þxã?ü• _Šê›ßüæ[o½õÙg¿_ZZZZZºqãF¿ß¿sçοýÛ¿}øá‡ÿõ_¿šL&KK ññÚk¯M&“_þò—ò_>´Î¢rPVek@P lå´Ö±®ÝSX\\L²8JtQå„I³ÝEÛ»[¥)œsÍfóàà`ww—%ÂîîîÎÎ#¢LŸ™$ —r5…Þ"#Øœ¼À™_ˆ%zmm ˜œ…«È´Ö\Þ-Õe|~F#̓ƒ¢qsí išN&kíÒÒÓL Í:ûþýûŸ|òÉÆÆF¯×ûÍo~óé§Ÿ²ÒÚß=¸wçþ¯—ÿ‹,]:ºzõªŽ´ŽTeËÃÁÁòò2":b¢Ï”‰¾w$òÉd¢bE 9kœªtæšDè…§BË 46ÖÑx8Zì/¬,-/////.eÍ´4EÇ (N£•µå8˜©*3º™µZ6ökÜ>KŽù©É·‹áù‡Q4%ÙæöÇàËÀ¼ «ò¼ä§kµZ¦¬ ­u^NŽGuÜG¹ Ò†)+W™ËÂ9P ÎjÖqŒN‘1¥&py>iAäÐ7'ò¢HMõ“¤’Õæµ5ÖVq—QT˜b”²gkÝ…ÉÊÊøpp/ËšÍæÂÂR·Ûã8]Hº­vªBÒJ%Z!@e,%ÜR›ÈY"é(Ž”%["²Ót<ÉŸ<ØÞ}rp8˜ãÉpœ™KZBŠÒÄ;§ê|~SÐO""!±…#´^øàB:Hˆ3®j4›ŽHkÝívÉØXéb<1Æ´Ûm‘ËÜÏͤ¬@UÚ4b„ ´… êX`‡¼W'eaTAœFišª4ã4Ò±V4CÉ #&¥5ÆY@BkmU–œÜ§ÁUà”3àÈ‘"Љ*ç ¡uÊ€£ušÆã© Ç¢£ˆƒ‰y^FQÒí,ê¸1)¬Ö.ŽcEÖZSq+‘Šq ZcÍ3«8Ž[Yëøø˜«ŒÚL15â’&™Ò"m(LÓŒó¤1ŠÕxœ—£¼ªê~É0›’çUEI'I¬#ªLqxx8 ¢€*2Ei+ç€T)EJ'I7Š8_çJ)µ°°€ˆÚÛ†EQŒŽMQŽm†;šìûfYÆf»€–Ê—‡²"aõÉûdƒÁàéÓ§ãÖ: .±pü«¿ú«8Ž?úè£ÈSޤiÊå4W¯^½téÒÁÁ^¿ß_YYɲlssóóÏ?¿wïÞýû÷ÙŸ8sæÌ›o¾ùæ›o.,,|òÉ'ÛÛÛÇÇǦ²àѹ8‰´Ö¦²Fc4ñ ó„pÀ¸Ùn´Ûíªª˜–ˆ‰ˆñðÝÝ]®“6Æq%+`v:www»Ýn–eíf‡)/8-®Õj±÷¿¼ºÄñHcL§Ói4 ¸1SÍn¥T¤¸™  =x¥'½³u¢}‚Ø’œ…Èÿ½téÒ7ƒÁãÇ…úîÝ»ûûûÛÛÛ·^}y8®®®®®®v:ç+ò^§/%±¨ˆˆ©ì81ge*²Ý4CÍuJÓ+ÔÉÒuí׎s¶öââ"IO_uºÝîââ"óuëÙZ^6Y3ô"2·ª í{$‡.ˆ ÈÝä|‰!H Scž—iN:¯ Ê›Eê"…PZH¿¨éö)cÎ7ïsm^ˆsÔº¹´ÖÚgÇ'å)ìÚóM³ Åe´““ÅYî³s)T¦ƒÇ;wîܹ³··Ç©ËŒyr„•ˆÖ××ó<¿téó6ß¿ÿ?þã?}:™Lö÷÷Y@s¬³ éXQÃÁˆÕ$“ JÿÞÁ.§a3¾Ún·y—,,,ˆÂsž~o2™˜²âô:ÆÃÉ㽄5Lʰ6ßáÒÒÇ>{½ó;~ôÑG—.]zóÍ7üãO&“>úˆó¥•R£Ñèƒ>ØÝßÙÚÚºzõêÍ›7/^¼(!a^ò¹è’©h©N‡É2ˆh/-6ʶ@E¡Gáˆ# lll¬®®ž={–M@DL’¤Ýn¯¬¬TUuæÌ™¥¥¥V«%gUdgÀ‰¼`ƒ [­†ìöÊ7ÿPJU)Pç)*Em“GðPŠò¼H —H©I¬…ê9 }¾p„‡?üSîu0ÕnG^&ã"?<r£¤îÁ/M»“qžG³Ùìt: W´·4`„ QéºöÂ!8 DåG£íííg[›GGGe™W³>ø¢»@PÏ œ…L¿ÊךÂF& *° ÛiãjiÌVª•õ¥ —™§g?âžÓ‚4¢CdŒÉ‹¼,KWÄBí ¨(ªI^•-KSšÂUJ­5â\pTi]/tUMËÏêg˜6çÛš9Œ1E1á/UJI²‚sN 8"Š¢ÈšÓë_lÐe@  ‚Œ…3uê"ÏJ+‡º( 8 Ò¸Ê8C„€N¡5 H$¿õEçrqâšb J%‘ÒF£4¥x/è³¾ØbsA•shF(É9ç81Ó­Ì"ØòþÚÁg›Â9g<k& +Š,« :@1Wk—(Š 0|„Né8Ò4eÿ@)5÷ ðôéÓ{÷îíïïs–Xgè#yišrNkýâ‹/¾úê«»»»ƒÁàðððÒ¥KOž<áÖ1‡‡‡2éìË¢§ïgõÏ¥GÖNÑ-–;œªš¦éÎÎÎøÃ¿û»¿ûË¿üË>ø€œ'ÏóÕÕÕï|ç;çÏŸ?<<\]]5Æ<|øðþýû÷ïßçb*îTõêÕ×_ýÒ¥K‡‡‡·oß~ôèc’­Vk}}ýÊ•+¯¼òÊÅ‹wwwq8 ‡CfŒbu;™LŽû‹=òñEÞÖ +++.\€Û·oË´,//¯®®:çÆã1çñ2»5Çõ‡Ç\®Êp^4MGƒíím¶±z½ólü¬½IŒ$×u6zν7"r¬¬±Gv³Iг5R¢lHÐóÿaÀ¡Õïذ!À{í¼òV /Þà ­ ²Ãh 2¼°ýk²MS¢DÊf³ÙìfÕ]SÎwx‹/îÉ›YÝ-’R, UY‘1Üá ßùÎ9Þûñx t “™™ÉÎxGœã½ow;UರÌF£Ñ§?ýéW_}’‹¢˜L&÷w÷½ï}ï¯ÿú¯ÿò/ÿò•W^ùÚ×¾¶¿¿ÏÌ(F6™Þ}÷Ýýýý~ô£/^„ª«N &,o²Gâ±^enKn%s…EmÇxOÓk=Ë2äyïììœ={Vg‚EîÜ9k-2ƒ±;d;qšÁfFç&jIrÁŠiMÆVz!Û¦þ03ÃÞ +Ïëz^»V^ç¦v.xöFsfèƒ*’G2Ôó‰Èš¬²õt¶@™Øélèµßíu»“nwÔîvz½Þæp‚.Ig7»í,/²DP&ºðƒ]!¬K1ºÚ` 8„àƒOÕ$Imï9­¼˜†PÀ³¦œs‚å€ÒôM"œŽÖí'¬“ªª¦óÅd<ŸÌóy9/g!8et§h‰8Íc_mfnµÛÞ{„˜²BÇ™”¨ ¬s“°¼·Ò\OèW!&”ËB aÅ×Z:²qÙ˪£¸edXe ܰŽl’ºB¨+KžÉzò‡b °p¹‘ŠÅéê@ÖÚ íÝ”jµ í4@Äæ±O±çÖê^®®‚÷ÌMè‡Lž“z Î{ï½_–«¡)Nmå Ä©ëZë ËË'ÀQ:¸2”:IÃív»p‰ä|{)¥ÀvA¬ïyÈ>I¬Ä³¡Õ•+W¦Óéh4:wî‚ ·oß¾víÚõë×oÞ¼y÷î]s…r`ZêH{4èÊ3gÎ|ñ‹_üò—¿ü¥/}éoÿöo)B(&öúÜç>÷¿ñ{{{J©Á ýúõk×®½ûî»·oßÞßßGŒ|ww÷ùçŸöÙg766ö÷÷ÑQ.ÏóóçÏ#yi:¾úê«ï¾û.up±P¾øyŸ@« ƒË—/_¸p‘ñx èx{{ûñÇ¿råJ¿ßFÃá‚E¾³fßç€nüää®Ûáá!P çjIÂû̲ £­”rµE¨kúI[\»öÎÉÉÉt:EêóçÏŸ?¾ÈZPí0•(³”8%²†SŸ õt%„,:ûô¢ÕZColllmm-ª=hY°·@D‡ ]'†izqq&ÀƒRv‡1+È|ôàUBW io«º^X¿ðµ7 ;÷3r¡õÐVc8ø!‡P¢@ïÒŠoµËªÊ²*˲EU–µEl )ˆív»h·ºÝn÷ä‰d£N»hõZíV^t[íN¿×ê´•æYYOnݹsgÿîñh¸¨ÊÊU•-]ÒjM֧ϼ”q¿D‹ã§u°üLZ-Gµ”éx#ï«Ô ¢µ‰^=œÞÙ…«'‹ùd6ÏçÞ:¥”2 ð“†C£Ñh2™ŒGÃÉd2›Ï§ÈpíEDÊLª0¶Úí-«­RÊÙ0+EQ´ÛE[…ÊÊ !ÔuE±Ãwªø}j®š#ëôX\ÊÆdT«XÉ@¾+A.)D!ÝpÍùbÁA)T *0yoSðNHsbà‚/Akm´6Æ´‹VQ>ÈŒ,ué1‡”g¾ÔsR¸ƒ™½wJ)$Yá*v‰N°Lܲ€°`t‚qÂÏ\“8SRQ/4ã%+I0 ªÃÃÆÿÆË=òï½÷Þþþþb±@‘?Ù„© ©¢Ð+ÈÒGGGÇÇLJ‡‡wïÞE€£££W_}uÿÖ­[©[L«lç²,¡”RƒÁàÏÿüÏŸþù¯~õ«_ÿú×Á0Z,˜3¥ÔsÏ=÷›¿ù›Ï=÷üÎÑèäÞ½{h‹tpp*õÙ³gÁyÞÙÙ `¶Óé°Vý~¿ªª[·nC±¡Z)I% Tn‚ÿ*êMœÔµk×Ð$ Ûíîíí!+fggyPÃáPhÀÓét<ϧ‹ù|>™LÆãñp8D@ïýd6F¥O"¶¯µFb´¸wZkY­õÙ½3Ò«nkkkww„ e46€ë^¯wñâŪª‚£²,üã_¿~,̸v»ýÍo~óþáþðÿðK_úÒïþîï¾òÊ+ÿüÏÿ|íúÛå¢::<žÍ^/Ëòþýû@ È3Óú˜—Ú…ô Háé Ï GA¾dSªSk½··GDEQlll˜ù¬®kTÇK9çvww[yµ»S5)›E¶¥_F—]¼$×ÀIJb²‡aR@8r¬äű)3«,CŠƒsn±('¶RÜJ˜Å¿è!ÂÓä“ h:xGì(x&(«2¥Ôp2–HS»ÝîšÇæn«ÝowÚE ¤ñþ`#k'£ã{7o½wtr¼¨ÊÊÙÚÚÚYŸàÏ©ßCü!ðõG½­û4läR½+Ïéá{/zQ&—ˆØ7…»Ó«qXo¿(‡µnQ–Ój1žÏ&³)äU¦Šm(­³çzïu5[,°÷'“Ùb1c²,›ÏfbÜ ­”Ò1Á"¢"?ju;­V«ÕÊ›6‚Y†‰n¸QÜ@2’ø€YÊŸjLÛh01¯¸‹‰Ââ,9M1P¿ßGHh<#]Ö{/ZW+RX)­Y&ëÉ…eán9 têº^,õ¢¤Øí£Ójw:Räš‚ƒMó¨5°öô!)òDkÝdF_H(cÒE²ô€E¥ ‚‡G„#H²DXqDƒK›];/~ ˆmp\ ΃A»ÝF³Øôé)î‡7nܺuk2™œ;wÎ'Ñ5JÔ6Ç}á´¡1-TÎp8<<<<<<üØÇ>vrrrïÞ½»wïÞºu nñd2ßK~í¹sç{ì±?û³?»víÚW¾ò•ŸýìgDT"©x¼gŸ}ö·û·?þñŒÀíÛ·ïܹƒŸ÷îÝ›N§Y–mnn^¾|yssÓ{†‰J©v»½½½=ψõ«§F#Ñg!’·ÁYÑÖëõ¶¶¶.]ºtåÊŸoܸJ9CÈ   Åà½ÇÚ'!„ÅbqrrÿÁדÑñp8ÄÛ¡ÈN™¾‚úfYö^ï&Èà"íìì ƒV«õØbŽ~ècÐ4©×éïîîþÖoýÖ~ô£o~󛈎+¥@öÞÿýßÿýý×ýñÿñ—¿üå/~ñ‹ÿïÿ÷ÿ¼þúëo¿ýöb^þøG¯ß¾}{ggg1+Ÿyæ™§žz „Šü¯Ó{ÂZÝ™Ÿç!­¹h£îáÎÎ.ÞjµºýžRjgg€3Hjý~_³E"KW$ŽNú¨ˆ‘]œJdO‚¨‡ØæK ¼5´ÊÍç ë ;oCY–jዼ>x½Š韲‘ųÁ{ÕÎz U`rÁWµÃCV¡Î¦(‹Ö99998:œ-*ïme˲^ éL Ÿ A”¦ãô'ïó}Ó?›K}ÀëˆJe(¼Ô§qÎ1«àÐÀ¥¨~³ZàØ±sj‰C²gzXwD_Oæ³ád<)çóª´ÖVŠØÕËTŸ:¸ckVÏçó²\hòYDωt]ÒD¤U¦ó,Ïs­YePy ^LÖ¤ž–åNB^cL°MÌÕÅ$x•p¸è”CDp3„º(£í˜Æý·:zR ¢Ñî!„àˆƒ6@Õ3;K޽mjdÁDi !Ô½²ªªJg@º÷µµV-#ëYT n!+þ§bEDHk.uJõb4ŒŒ‘(|¸ù!Ö”O‡Ï'µ }⑤ÒD‚mo"±"()^˜*0{ŠÀ|ˆ'ë‚; ¶ï"ÂØÄªÚÚÚÚÚÚzì±Ç®\¹‚¨ÉÉÉ Úá¶EðÑVÀã—.]zâ‰'Þ~ûí¯}íkwïÞŽ KS è—_~ùóŸÿüùóçÁ5;<<œÍfè |çΣ££ªª ©···³,Õëèèh2™0óÖÖÖt>ƒæÆ¿B`™µòV¿ßÇ‹&ÒgƒZQ[[[óùüÖ­[ÐsˆË¢fš¡% úþh·Ý´üCË ©'pï`mÅB‡‡‡ÈÀp¡%Z$ϲl:ž`? mAÝŽG›››ˆ2Q·Û½xñ"3æ3Ÿlû¹Ï}î‰'žøŸÿùŸW_}õúõë¸,mnn^¿~ý+_ùÊ÷¿ÿý?øƒÒ`I( IDAT?ø‹¿ø‹o}ë[ßúÖ·þíßþm2žÑx<þÞ÷¾boo £ÇzZóG¡ˆSãW3Aå+O¬dð{±òY«ªªPÁ\tkm«ÕÊM%½v©tm§¿c^8²7]¬Ð";a~Š.EJ3 ¦³ÖNëZGžœs » ¹[´ÖSþYÐ>¹¥¤êaH Ðæû%£¿,Q(×§­ûPy¬­Êj>[Ì‹Y–wúÎ9[VŠØ(uÿð0oZkÏ~2›.ÊÒï9rp¯€ÝÆÌJé`ô¡´oúF´§ø ‡OB¶+Ç=àDÔ¦ïœS!HëªåW<ÓCzLÔÖ6mNÊyikï½2™§à¢õi­­­­ê¦}u]׳Å|:N&“ñxR–óLs–eY« de.‡*”VJ1i6èr½äIÆCÑÃÚ.¹s®vÎE1›O&“I;o—eÙï÷!â\äd•­©Þ ÷"ÛÓí)Ó j'â€â4ËÉÎÕ¬5‘an:¦s TÌ[¤»)$F³CgëBY‘}¬ªÚ{vÎÞûG³ ×~_îÛÈ‚^jp~0ÚÀro·ÛƒÁ6¶Uk[gvsc«ÈZ“ÉÄ{Ÿ™¬©è­1¦Õ.ĦȻM±b*Ë0£¢Ýêôº£É8„PU•`¤H·õ1Ò  #õæ›oÞ½{4Ôù|ŽÖô!6ä¡È ‘_L,²(iNRx¦7f×Z ck!R¸›p"ŽŽþýßÿý¯þê¯nܸÁÌP±*vÚ!¦ÿë׿ðÑÿÊ•'Ï 3O꺇×o¼ûö;×nß½sgÿnY–NÇäY·ßO''£a»Û9<>ºxptr¬3S´[D„–vB3†Ù1 .^ºÐíw6·ûûû æÓÊz½Þöö¶1¦Óé<ûì³ãñ¥ûûDÔiu;Î¥‹—Ÿ~êéÍÍÍ<Ïý”+=yFDFÅ%D”ôßë«§TyY“Éyh9€.Ãá ›s“Ù¸,Ëzf]ðórqx|hL˜GGGNçðþÁ¹sçêºÞØèýïÿý_»ví×ý o½õÖ~ðïo¼ñÆíÛ·'“ lW^yå;ßùΟüÉŸüÎïüÎGž|úw~û}ç;ßyå•WŽOÞøÉ›]¾øãŸüh¶˜¾øâ‹O<ñ„2¬ ·»­²,'“‰1÷E_J ;±ÿ@ÞvI Ór›“;Š¢½XT­V§Ýnz?8ç®\~¿·¶Û²ÓRðYëe9Iqa´a"˜Y©%³4Ë ¥šÐo–¨p«)¥È7p4ÌJ2òà½okíçe^ú±Õí¬­ªùd2É4UŠ¢àé¬Ó*ædLÞ ‹Ð+ZÁû@ÁÁ±"ÚŽQ^1kåQè?8²Ž™I5 sÀ†!fÅdÔžÚ¸2+¥*WQI¦Îò<÷Eá\X ÄÄb®µÞ˜Ïá-qSx«É^ó‘4ikBÖË5MýÜÄX {ÏYSõ½a¢áACá—‚•€à›Z-¸›[K84QÀþ!1×Ü5·®‘RF§s"ÊòVóüŽæ³ÒUÎU®ÎêÐimloy£-‡Š|µ˜¦°ÖÖuÙÜÎkcŒV.E¤ÙûŠBÈ´.i1ÏLmú.šXiPã²<<¾?™Í´Ö&0±V¤Ë²±±÷Êzí®Ù+EÊâ,6dez4ŸÉ¢÷—ˆtƳzFÖu‹–Q¦¬KïÉÕ\—aTi]M³yžk­­¯Å¿ÒZ/²lrr¬”ÊŒ*ŠâþÝ;J) ‚ëð`0ØØØhåÅb2QÞS]«nWåùb1.Ër1Ÿ·àPeÚ{[Ï&³¢(Œòžjo}‘µÎì¶7»F¹àœ¢:¸…·sÞVÓà´Rªe²<ÏG£Ñt®.\¸ÀæÓ‰Öz÷ìÞÆV¯,ç¥-UF-•gY·®ëEµ˜-f ÚÌ^·s¥Ô´.óºš §Í"׊u¨Ù1󢆫*œ48M!Ô¼uÎVJ±áBiKfvžVË –µÖN“7ÌÆxre°^Çf œ°?Ö,‹|úÈ¢"›”#~%üç<0aúý>’M…’b ÏÅhÜíÛ·oß¾ý /@¹ýðÑÇ_CäO{Ò©”ƒv‡GˆÇX­"ìààà{ßûÞ7¾ñ›7o‘A”«µ:Å¥K—{ì1ÄkÑõööíÛGGGàCÁŸ†¡2ùp8df´Ö™ÍfÈ !ë#j$Ñ_x´ Zã±Ñð±sø‘¸Š]cpð_$I€S<3A)TR@;õ.]º‰‚4piïýöö6,nQÀhþóö;W¥«ñb±€‰=¥ÄøYHJyñâE” —.]:wîÜ3Ï<óâ‹}õÕW_}õÕk×®aÌáá}õ«_½víÚÓO?ýâ‹/þÑýÑÞÞÞ~ðƒýýý{÷îmmmÍf³«W¯–e ,ŒýÔM½OYáøQ<í_—C¬ºµãa‚;]©‚—_Ö˜NYÐâЧªK¢0Ê×mR…îÔe¶ÐUС2³Ž_ᦠ¿RÊÑ:?óôs®=‰YÝÈ"xµÃކT$•»ÈD×Es‚Ú×é°ÈŸ‘Ó=ulÍ)ŠS|—µ˜"³’šDéÛñ*ƒäýk #$@]ó´0OÔ’Hå½w޼GåŸàØÉÓÒƒ–Öà™éàÌçsÔ9ðÞ»Ó\ð™^Iÿ•¯”e¹XTóy9Ÿ—U…RÁBãW`¯Éd)¥ªª„éÿÒzºÇuREŪ´J)ëëtfM¬àÆ„¤œˆ(¨ˆë¨ét<õŽ»mêtѵ]gkج¢Ñh¹”ž¿?#Q ,Šˆý7Gžç³Ù .²ÄLaÍŠ‡à…ŒZ,\ çƒ÷ÁyG*(ëjÄ<(ê5<•RÊ­tQ!¦Ø­A/‘úyÒæ‡Á­“š.¦3ãÕ±ªŸŠkCÒ¿Œ‘¼¨‰ˆŒ6+^ŶÉœãñ¸Ûí"/´»÷¡\¤ô9sFhØ“b¤.–¬ Dª¤›aŠ"Œ#¡ â‡ÃáO~ò“o}ë[ßþö·eDKúé§ŸþùË—/£Zú¯Ý»wïÞ½{‡‡‡Ãáp<#æ0!¤Ïd2Aa°«‹VöXFÌ ù?"î± Úïíí!+f6›íïïÇcf†—Œ0XBÐë`Šý”îÏT"ˆœE¼Lx![[[6v^ƒŠp}á±ó@žEû‚¸„˜1(îÌ Üjµ6zýñx Z8z8"r|áÂc—/_þØÇ>öæ›oþøÇ?~ûí·ïÝ»‡ž†ÿøÿøÆoŒF£|ä#/½ôÒ‹/¾øýïÿöÝ[£ÑèÍ7ß<{ö,ØÈ`™ù¤þ³¼W8UD^–·H«µŸéZJª‡P0ÖÖXú¹,È5ɘêùzXEÂéAZ%½„ µ»&oåµ­Ì‚*›•Þ)›ZkÏÌ$UP(<ÄP½.J%Þ udU$ef…Fîé+ãðP +ià¨éì"ÖHŒx5S)ÄIŽŽ•GÓ–È—É‘âì[›((´:m^|P±˜®“ô ^Øa>0³SÊÅr{Î9åš´1"¥I¯AïçXÓ»éP+¥šäZOD¤”qÁ£’£˜ò’iÔ)ï8xfÊ´–ÂDË|k¹>3—uã5 „֌Ѯk9“c#Zf¼ÕãbC2›e™RÆ9G¡a30kbÛ¤r(­µî´ÚWy«À9:ÉÄSÁ_’À3Ä .1RC´ÉTL1ef„ðpÅb6›™Éd´X,Àfu.§Ä–J7²JÂÕk:µYíÒ㈖ÿMçîC˜z8–õü$%\±*Ò8¶,1E)(DbA{ï=hDâ7}ÊR#:&Áw<>>¾uëÖþþþ¥K—P*’WS6eâOÿ~zïù„Œ*‘|"®êµk×þó?ÿó¿ÿû¿)ænJu-à[[[/½ôÒSO=µ¹¹‰™†.Ëòøøx<#yWx*¶F†^= „g{å"2íœÛÝÝ=þüÆÆ® ð)C¨›qþüyø©wïÞEk¿ù|nL£Ñ¥ù ò`Ÿr¤Ñ¥bºždTC´HµfiK°=÷Îî"ï ùK'''Øè lï´?Óæèèȃ?aÅw»ÝÝÝ3xµ‹/^¸páwÞA±×^{­Ýn_½zõÚµkŸÿüç?ó™Ï\¼xñ3ŸùÌ÷Îܺu ö££#$LÃg‚T‚9µÜ ŠåY6Ó¦âø¹;mMûžÞç›®]0U6 ÒŠTRJÃ9çE‘µ¸U‹ªlœAìRèïm·=g ðj¿ú3 D6Ð/»<¥Ï‰/ðlk­WºvV• T&‚ůFCå‚*šÚ”Ó¼’ǵ¬Bˆý®˜YL&nú¢Ÿ!0‘¢¦5q ‘€õ ëCtpÄ xÍ{S.XË©L´ì­¾ºlxnf¬i|DM °˜óQ[ï¼­1 óù<$ñÔ,+мUí<ŸcÈ]pUYjêbÊÔ‹ ]IÖa:X¯cfr>yZ©d¹ü…Àr2Î9ï(^:P¹XäY–±D”5Š™Y©­Ñ¬¥”RPH5Æ¢Bm]ÈFÔ!N÷x׸&Jááˆ?ib5‹8DAR2ÅÌ,1—°zÈ'P%(€A´4pO¯–t4­ …A…]®‰$6ÎI(EfåÂf¸¤{CPB Á„¢êÓÞ¼yóðð…>ƒ‚´, Pá¡€ÁVóÑô½½=¬c Ò3 _Á0?>>^,¨&AJ¥Àê,Ëz½Ôs§ÓAoÄh­µ›)—ˆb“ò¦©¯/h^H<-”TLqwM.‚'‘„-b­Í[Ù"¦7  *{ŒF#xÌ̽ïC¦„c/°L7 Î3ÓPÀÌëQ³G”«Ì º%kmŒ©,Pc½#ßøß k`STU5­VÆ9&ÖØ¡ój>ŸO󢕚zB<Ž0¢XJ,¡µ×¯]½ö †Ýht ï½³Q[{Êò?5­”HPÅä2Æ7ÍfÀ÷¼qã²-D•!øÄX*b§êX32ŸOÛíÂÚª®k„q´ŽäÐ$qY\(V­ŠëÖÇ0ÁÑÖØ]qm?Њ"(`•„Ù“Õœš¼:=@‚–ñI¶BƒPÀ’@BI¨Œˆ$ïðí·ß>::×\=¨­Äé7LWUx cŠ0íÕ«W¿õ­o}÷»ßEG›T¬M÷ܹsŸýìg?ò‘ˆ5àœóùþýû‡‡‡ÈÞÁºA,¶Ýnïîîž={öÂ… P €daè!Ýv>Ÿ3óh4’ŒO³ÚQp#„€ÄÓÁ`prr‚*Ä_¡àÑ¿¯×ë é UˆÝ¡S ‰Ò\í„–â’dð[âp,…(WPÝÛÛ: è&éäf8R! ¼÷‹Ù6,’Sçy^×MO!p§¯\¹òøã?þøãÏ>ûì7~úÓŸxã7.^¼ˆ™»»»³Ù ›4 P‹Œë0¨eà*„e9ºzü\iž®4Ù·¢ÕD·ÉˆÒvß«fåšð•«ÕuêÅÜv³²$8ÂÁ{¥ÈIÍz¥TNÆCcÀB\{Ͱj²,m_µ4dO›2"¦åu\Œç ;D{ïB0 Ê·"[’&§éÅë¤6%~©'ÀÙŠ‰† °©½µ¼TP¢ÐMèçHÉô"r©¥=”Ø ‰LÎ5°aãœSj¹&é},§]ãÓ¿cÊåÇÌÆdä¸ÓjòJ$ZYUÕܹª²gÎLNf³E]—ÓÅt6Ÿ xš66‡UJ±Þ:g´n­õÎ9×Ê‹µó("Yí²NðÆânâØ9´ý šélIN„‚Ÿjcçxìñ[·n!ËøÕh)!<ÔêOÏDáa¼o»Ý*éýʼˆÝœ¬éO×–½÷AÖdº_=˧#3!ÛRÅŒÆô)E銲¤èÅB3éLÉ.°à{»ÝöÞC?¡(´Ì¥Oê•*JŽF#ç–í‘i5®ö>ßÓ¯RZDLdY6ßyçÿøÿø?ÿçÿ€0…DrX!@¡ƒÁ'>ñ‰^xáÌ™3½^Ï97™LŽQåÚz€05„9Ïœ9sîÜ9hzkk8çÄÿ Ñ Ç"X=p—Ò˜JGGGÐ%H§F„õ˜0˜©ÝC«.©tÜTRw‰gH’kEŒâ|ŽN‰T7àƒ˜1Êgžœœ f\UUn2þDÞ õ¹s°+°ÁvwwÁë­·~üãŸ9sÔ6ät>ýìG˜ùâŋ迋µpEl–‚ÉÞƒ÷+ë ºÿí÷©zSÅñ¹Ø£k6È)JÖðšªÑÆ«alßd+–óÚ‘•¥¦žÊ²ÌY¯4Qì%ÏÓ˜›|þ5ÅÀÌYÞ;UƒˆªEyÚ¤“ç_¹c”$²õRÿ E)Òë×I}Ë!Å8"˵Ö0Ì7Üîø®Þ¥ãù¡j_Ѹιà<ǰÄd-Œ-eÙzï™Ü–îçÞwíywZå øXÇ>D³2¤W( fg§ÚÙÛ>WÚr>Ÿ‰®âa­­ìb<•Ó™!fæÚ9ë3k^[õÞ‹©³õ†ƒ8A^Ä{/Õó~œ Z;ÿ4J‡œóžš&²y«È´—KnÔ±[¶¨gˆ¾Bžç@ ¥8.Ä£Ö:/tU—B©!ƒ°‘gÙ|¶°¶rÎjÍ!84uTª) ‘nXÙ‰é°Sä2ü‚ËLŽ‚N‘#²…|ÂR³I)N‘ûÖZ´P¥BÌ’€Á ¨Ñ¡µF¨¸Ž­à0F†OY–7oÞÜßßs }ˆQ›{Í%=CÖÔ*‚ 3ÈŠO5{/r‚NcU.-ì°±@9EDÁyh\›TÛw΀àÌÚÙlÆÌ£Ñè‰'žØÜÜ|óÍ7ßxã'žxâñÇ?99¹qãF]׿ò+¿Òï÷¯^½zãÆ X¸‚“ËäÊ néhzï¡}}Ry-]éúYûïÃðC1™O§íJ ñµûŠh“­Ä«.ù®É÷umUUÖu+£!6è ?ÍŸþA‡ŸXN&m•χîÄÅlÙeKy´jÉ¥†Ü«‘Åq9­ ¾°qw«A`Ìb‡SŽq¾¦®§ØN¡‰úUsG¾õðaøùƒ#cK‰ …åíõJ;#ríÄùÓúêÑ÷Mõ®²¶)Yê|Y–W’‹-©³L«eºÕÊQÆG¾ªºçÎÇ ®3*ËòèäààÞýññ‰!VJUÖºà1ãá/+Äé& Àë˜ 5,-„ @à ãÀYë.£ÁRÑ!,ÛQBÙ 1¢§bãQ,ÛÛÛÓ™ÙÙÙAø9@ψ¨¬«ÁÖæG?þ±³çÏa«\¾òø³Ï?wpï>Õm÷~õå_{âñ'77¶4›ÙdNÑ4,²&ºá½o'Á9aÞ=tMGé´¤~àiûba|`’ãù«j€7Ì2IÅ ¼„—°ž±J‹¬•F=䦩,BX¸šY1Ò`œ7¦èn•¥,P«Õb³`æ~ÞÚо ºnq˜”RÿVÇV6ƘÚ:Ï>XЇ·`ö®.rÓë¶;N»ÝÆR©ëºßíARÚ™N§@/BlŒA>8g]½ìu!µÄC¤4[kC²UÓáuɾ 3íÜ…Y§ÀÒ¬¯ÕjaTr""ç:„Pä9¶Ãb±¨kÐ’|A6Ü´ùÉ”®ª*Ïò,Ë«ªªìœ"y[ì-±§ÅßÃõ±*°ÅÏJ%’œ8™ïÝ»Y7N!åŒ1ý~ÿ¿v‹.|e­¡±ÌX+bÜtS#¢ºvÞQ–/†õÐT“…ÎÂCà+Y†2¡®çN/Ë2cš{)í}¨ÜLVHÇnµú.¬r¨^|=„À¼LImCAY¥ìb«],æ%B!f¬r Lݽ{÷èèèìÙ³&f¦‡SÈE«9E?(L×°û<Ë­µûûû·oßþ×ý××^{ k ÿE\öz½ .<óÌ3¨9›ÍÕ+5+rÜØØì¼µµ…^å0\lB üYEx_Å0-'ˆWDÔét@¬8888>>ÅQÇ”;’¿Æ2s±í¨ˆ0Ñ£"ÐSÁ'š›VÕ0=ˆp‡Wð§òšdâDФ›D†7EPRÅ™ÛiŒ&¢¢(¶··‰.²sÎ(MDˆ_lnnb‚Ö‚½lÔ^ÂâÕã}zE8MFRHf&Š™”ÖzïÏgYf½Ã.V&¡zÍF ¸¸•¢qeˆpÈMå_ø/çÔöÉÈ@1?´æ0%©DàNâ^ðŒ% ^,À›¢ÃB ©AûµRõDtʬ¡Y~8 LÅÚö1Ádmu*ÓZž_ØÔ2}ð]N+þô[ÉÉf&âÈS jŽœØäEäÁ~ŽI÷>FV¬•¤°:Û+õ#_aÿ€êõz­¼ØØØè¶ÛØw½‹/‚ƵX,Ð䔈ï!¹B@šDœ ¦üÌMÑŽ©A,)† ’¿¾á„­- V VŽù¢"Tñ¹ ”X““Éz 1ctØ9 ^|.u°a*6D +Ø@( ¾FD@påÁRÙ˜Î{LIªæy¦QØ: $!úR‚8ù$ve­5±13Çü*T ^Îtªl°«ñªƒÁàܹsçÏŸçÚu9Yö6b/¾ø"rˆ9²“RŒT†Þ¯ÆRõ¬4‘b(Xg6UU]¿~ý‡?üáw¾ó«W¯Ê;zÀÁxê©§ž}öÙóçÏgYvtt4žŽF£ÚüݹsG VH™rT¢>þ<ðaÖ¼ÀÂuÎÉëÃ#")Ë%J F8Æ€»À‡ksssooo{{Fœ‰Jd‚×vÚÚbMGV=ãôóÝME¿uK;)$ð©(?<¼ŽË# Ù]‚`sÌ#·€è¤éþÅÌ—.]B^V»Ý!€4ž*r±`÷¤w_Û k‡è†Güwí¡€?¡z£ßh_aÈk­»Ýnek`gÏžef$S½à؃Wã>©<•ÙQJ‘[y—3Iñ Åh<Úø´!J7‹ñÊ ±0ň÷33° ˜³Ö†!‚BT¯ Þ{kÖ®M‡LÐÚ[[ëC°Ì ÁÚ±2e4‚ÖÚ{AÂI– ¯ãÜú;òô\?BG*¥‚çD¿®L…€þG´Ì"ûå„ CÔù´¦€•LèJ<þa¥Ð¨})Z]yÒÁÿÌfƒÁ`{{;ľ¸Å|1E…”˜Ïç`~ EÂǵ¢($O;ZÅrÅ!xé‚‘"‹ÖÄÚ>©+)›Ácy<8!éY˱µ‰h%GEÔ -IŠJ»Ý ¶zݪM¦ˆ<ô›0 E6ÊvOpxOÞS]×øÌ{9ÇKqã‹»™Šàtƒ)³ô¨!£B, /÷–—äGÔZ÷û}kí¥K—Þyç:î¢cö}ºVÞ~ûíþð‡0¤Q|§Ó‘“ž,®kòš¦°óùÜsppð³Ÿýì•W^ùÙÏ~Bh·2€yÔ IDATÛ’B'3wæÌ™—_~ù™gž!"Ð ‡Ãáh4‚<AEÎó¼è´`=¡/ÊDh­]°6vÎ O‘ØB@þGVv¼A3„Ùl†šˆãŵ֛››ÛÛÛðÿÒ¸¬LÇ£wrºëN—@ž1õ¯8Ù…¥ »æ÷¨X+m-&-Ó*ƒ ‹ ño`GÞ{-SÔ\Ò@{ccï @¶¨Yå½Ô «¶ÅÚP²ÛqœV²ùaÔSÜwPQÃáðÝwß=88@)•û‡.xïûýþl6ËóüìÙ³í¢Í-c(S™Î©\›ªntgˆ‘9Ö™L¥"¥•òI°ŠÈ‡ø§7ÚÚ¼ËóH|¡®ën§2m("+/®”†="¸f~­MÁiþLÿLU8 8l–ù|°ÕZK¥O41‘„y)kWÄWŠâ¦³SƒKâôÕäî²ùåÌTÒÉË ÈyêCsô‘'¯”B¬NT,Å„ òßÓï»öFïS6=ðXp”ì¨ô_:f¨Ã)\,ÃáðÆwïÞEW¨÷Þ{o8¢Y}žç'''ý~Ÿ™ýM ¥ZAv %j,nÌæskmE¬Œá‹ÇÐJqÐQl±Žœ8Ù•Ø/kó—Z.–¨³I«¢&B‹ðÊSJAüù¤óŒÈôÔ¤H߈V¶tHåa¼ !øh`¥”óåj 0OIEÈÂÓMEÃeß\yG:¥ƒ—£ý×I3eä=¯Éýõ-ù¡×¡Œ”a¢‡#ô€,….¢µ.¿ÍûX«SŒÙ …“±©±Â!ê%ÏÅ9WÎæ¥Õu=™LÐ •ˆÀfÑ‘*QyeAw!®Sx&z– E‘|4$ü9Mt¹ŒƒdÓÀ9GG'­¢ã}0Æôzݼ0ÎÕÝn_ø°pš&ƒvH]L¢bãó%™»¬®œ)«2µàm¤Naj«Ul9Y%ËÐRúô0Þ‘z„ê‰u]ïíí=ñÄÃã˜k²ÆZ;@wºzõêSO=uéÒ¥­­­'Ÿ|u†åHõ.EůcÃĢݨº<Ë•R÷ïßÿÿøù—)ËE%‘¤›ÎñÇ?þñÏ~ö³çÏŸÇôÜ@è ô"ØtX|ЈÒ™­µÛ„…詈?œ`ŠQvñ ÂÀKtΡ¶¥k "¸JŒ¥ªN†z ¢—ßO+!pZUQrÎÒˆI0Ò°š¢ß–^'¬ú.)í+^,VÄ´Ô¬ÑZŽOÎËðaÁºeië©{é¸<ð¿éweö×±lÒA[û]Ť;<ÀO9999>>ÞÛÛk·ÛgΜAâ3ݺuk{{ûÌ™3h“%D%€“ì^ÜÅÆ"8ªºž[›¡F¥”f­•"ß’• YÖ<›Ì‹ ïû–CÂÂ8À“À_YŠ’hÁ¤€(±I¡7É4³‰ˆ8Qx©)V—_j‘§&&®cŒ¡lv•q m¾!g}R¢Aº_È„ú˜n—š‰?÷Ç‚q%HÈ;˜q§FaðátðÞ'ýå´=ñ°óÓgIÓ¡?ˆ$dkÛ)É/E7ŒY-(΃+ ~¤RRŠ’Ûyø± ‰³Ùl:"Lƒæ¾!,›T˜È¶Ü8<Ü- IÊPˆè¬œà“t)tÄIi{ÝŠ˜’‹sã=z¦‘s^k]¹6ì\e^J·‰£·ZpaÍèHì×Z3™v»åƒ4✠ž™•A‚¶Ž¤bÙ]ø…3–`T†e¬…™|ö«™ÑJmºã!Me0¶Ûí‹/Þ»{ÿÎ;R368<ÏíÛ·oÞ¼ùOÿôOgÏžÝÙÙùÕ_ýÕ~¿¿³³ƒ.ôgÏž HÄît:Pi*²0˜Y:GVuuppðÚk¯ýà?¸víšJ‡b1óSO=õk¿ökÏ?ÿü`0&0Œ5‰d $‰‚PÀˆàVUEªÁXD:CmC`¡gŸÄ¶C(¬(gԼ‡ê…Ú¿wuŠ ( xmóÓ©´ù%U0blqR?5¿hµóH4N°#JpHŽÏ©u):^$&ëfáA ‹ÎÈô²=Ÿ(`yÈGHœÓãnWùošŸš:áy¥÷J¹¼µŽå‘Q40Ég?ûÙ££#ˆ{”ðTJÍf³ñxŒa¡¨l8ƨBÔ1!–»‰/Þ pÖÚÅÂ. €E)úÀqÏ2*1…Ç~ôXÉj×¶)…Á/± ^¥}‚”Ò²ÄAÁ3ت’IYÓ¸kÒ3]”€ó¸f[ÑáPÀJ)tǪ(´HŸJPMëKËCôƒÌ{&óÚÂÌ]¾>}koýAððé•ÿ|â•>Oú-ŽVrˆ%Ý.Øï(„'"mâK„!êì‡CøZâ¤É~‡g ‰šóeY¢lšìÁý¦=NE ¡†–ªQbÉ’HÙO2§q)PéD‹&NE3K^h*£ jêÚ1i°Œ«ªÔ†™Ã|^j­G£VbÉ0b9†Þ*ºý~O›ÐnÌì=3+#f¯Vé£à%ñ{]Vkm]7¦.\J,ŽÔ†åØ=Ã7 {ì1@v*–E” !XÆ"¾wïÞÝ»wúÓŸcööö.\¸pùòåÇÆÓO?= Ði<ÈY,ðJÇãñÍ›7_{íµ«W¯:ë)4ŸMÌ'Á‹¿ôÒK/¼ð`âh¬6²(VºFZ”¢èà¦âh,![Zt9‘”HmB\J)˜ Þ{àp/tá•u†å ²@]—镱à”RX¾é¦MÕO*ò(Ñ+ô #kZ¬±‚ÎVªÊ9kdªeTrˆI+:µÑ¬AIŠŽ,?YâUË•M¬œ¾Wº'×F@v _ `?Ì–ˆæÚø¨XÒD ±œ P@¥Â3Ï]]éÅ9:KZkñìSf†8…Üβl6Ÿàv.¦?A/‚ûK[òÞ“óÖ5Æ€ü윃¿(M\€ÉÃà)¢ç½?::‡¢MCÈé ÇŸh‚$€¨p5 ìN[Šâ‹Då%´b­•s®ª¬Ò”eMáŽ&„GCbˆà•¡‰½ãÁ`#/T¯×ÑZ+ev¶ÏfYnȳ"MžX©n»‡×(²J…óÇyÞÂC§#"ÒZ…àˆ¬RÚ¹:µvñJ`ÍìèÝÅb‘›¢]tŽŽŽž¼òÔÁÁ"í½¯l9/gãÑ„ˆ´‰%-©1ÕSõ‘Mn­½sçÎ;w^}õU<[«ÕúÍßüÍn·{æÌ™‹/^¼xqoo¯ßÅd4…±ö_ÿùÚ÷¿ûƒ·ßºÆÄ‚°õ ã‰è¹çžûäKŸ¸ðØùÍ~Á“Ó™rÁNçWûÑÉØÕ~6™·òvQ½N¿Óê¶6¶v6÷övƒA·ß ìkWöFeY+/¹ÔlŽŽûÝ<ÏÊ€ó ‡CxϽ^o:BN¡÷Ÿèi¼o»»†ƒ¨ËÑéô´ÎˆˆHÁ²þÒøVH< ù]–&¯ú¬²†D ¼'ó(Јf(ªü 2#ÝQç †ét꽟L&H³j·ÛšUn²íÍ­^§ÛïöPÒ2„Ðn·ðDɰà¼RŠ‘µ­°ajgŰ“}‚Ü×Ðï›$::eæ‹x¥$C@Å<9_T>GCî%.(²›Tðä((~ÄØöÖ»N¯;N‹vë©§?ÒîvÚÝNVäo½õÖ½{÷Ð MŸúý>Àf‚(|DD*£™YÙÕФLÐóIÙj·Ùg½­Ád1'ªãiÁdµÛmªJ)µ•[n«Ü[)•©8ÑY”×ÚyÈSü Ub.‰n`<è¼VÊ(ÎuP6(M:øÚ×Aq»Ýε ªn›¼ÓmÊ}{Ö¤3S×Âoo\–¬I’ÓÜyBÈó¶J“¸ˆ88KžœwÞzðbŒ2ä©0YN³¯ç(3…«ðÖŠ™ëE£uàŽäynC°Ñ3&""gí,âŽë6/'ÍcÀø‹EBÓ-j¹Ë°w:Žs¡Õê*¥˜UžçAeJ©,׬‹²¦ÊΩ)j˜CY×BgÌsTat‚¯ê*ØàæµR* Á+¥Éhë=‡à;G޳&òùÚgym›Ü“b •#7±V˜cÞ¥‹£ìCp^­~ÖêÍJGÄlZÓÊ»À¤Zžü´rÞ“W-O~á‚ÖmTAg½à}iýÌÖµ‹z°³éX¹@ÆG¤M^[[2­ÞdxÜï¶··Ö…No£,ë·Þúï¬h_Þ=sãÆÚÚó/ š/œ»¸;Øõu°Ö¼è¬épÿðæÍ›?ùÉOîÞºMDÁ{ …Ϋëùb¬5{ˆ8Ï[Ãá¸ÕmYk³š¸‘*D™n Gä§€]èÊg-¬+f&ÒÞÛʼn¦_Ú(µŸNö/­š¿ÌlL³Þ0¼BMÕš´ ÇËóUĦdyAƒ/V¨:…b­Ú_ëU»O¬`¤‘íV».\‡wÔÙlVW1„ÉAÌ%ŠŽ‹µ¦@H`ö¿ñoà9÷öö._¾üä“O^¾|ykk«ßïŸ?~kkëèèèŸÿùŸô£‰ ›½ÕjÁûlµZÏ>ûìîîn·ÛÕZÛþ”öƒÀèÊ 5¾8&(›ä8­ù(i²Á²µªÜùN*)I&:Ã'ðr:‰2•bËib,¯}1½‚Jˆ]â­¦°p:ËÄ!5E<¹¤>Ç8“h5JðjÑ£©Sâ“P÷Òº”—þÉIÙÂôi×–k:‚V Þ#ÆÇÚ¨6_NÀ«ôÖ@2Æt»ÝÍÍM´§|ï½÷NNNÀ@ÉRÌ,IWã¸EµsŽuã” jb bï½J¦¯™‚fð'Ë"4‘-C„Ç·¡–ßSc%"™f&çB`jŠ^z ÞD”å…N»‘†Æé±¾á¸ ;”"ÿ—dÏÇÂkMQb¨Õ€Å#-EÄb ´Ã¨‚‚+óŽ‹§•ŒÒ]³±±Ñ¼H]—eYͰ(‘×"ˆN«Õô΋ò·Ùì²a™™ÂÒþ[«õ¡µM!«1Pï_=ù—x`±)ä¾=òúÌL´,›Ü´Òˆ9N‚X$¦•# ˆ½ !´{­V¿¥ oõ·z½3ïln¡œ&¸«ÓÙÜ9[Ûy–i”®¬kÇ<‘À_®›x fGg¦®k©$/"ø"­Ê%‡2–D¡Y!U¤ÈYºÞ”²>–”á$75oÌjWf6hwE Z…é#W«¥j%¿ ¿­*à•9ÀhräL†PêDkÝî¶‘ïííÝ¿Ýæëº.ç®l“ÚuÌ ê2%¡GüwccýöíÛ·oßþþ÷¿=þüÙ³g777g³Ùë¯¿Ž²Zë¢(f³Yˆi‚!„gžyæ¹çžÛÝÝ‹ h3zûH“t½Íó¬+P ƒr%=ƒï?„•û]%932t¸\-ï}–e0 ÐÀÌ:Ññ⺥7âXûSö¡`•r¬ÎÉùr)N Ð4” çˆ2HW 3^¢@rY¾¢äòx9‚cŠžÀG!ªm¡]ÈÓ[¯mï åG+Ý3:r.RÐûô5Y\Ÿ¤ÏAH ‰Hùž ÷~0`µh­»Ý®Ø€@ðEpC˜Y™¥é)Vˆ÷>ØÚ“Öe|åœS êIP¾©†X†L§Øvµ_–êL‡‹í sç( ZSPJkË‘wÍJó ZŽÂ#©"Œk>¬Mq3ËåCJl•$hé$Û2}£x‹Fþ¤zH›".%Ô¢œ™½’wovM«Ój°kg³™n€ní§5±V‰1&ÓËœuQÀDdÌ’Ä«U&ëŽÏ/røÕn•2› ¾\Ÿáá±áz¤¯*ôD©Ÿ£Ú1EK“%R+ÄGa…詉M87XW«ÕÒ™¢ŒvvvΟ?¬›N§åbÒJc4+×jåÓéôþýûÓé|0¸oƒE\™œgæàJ¿RÜF4<­äþ¡OÂf*n¿T¯}]Ö¢ŠAxf†¿¾RQy«¡2ííퟜœ ;öÝwn@íIvî¢#7[\¥(Ó8Gv)ÄÇ7nÞ¼É ²ŠQCfF¤'Ÿ|òÅ_„Ç 5ûEª~> ãn· 5 ©Š;Å-!ú/u‰$À€OÄÉ¿ÚÇ|1Ódp1Yd^S…§cŠ%‚I°‡tRR1—Nœ¨@‘õ*1˜Mù"%²™]XzÀa•„•®&ü ®ÉR—¯†{×Ö÷šî§Õz/§ŸMž|m“¤OE ‘[ÖÏiý”Þ݇uB“\PEn<ü!É&tÎmooomm!i)mÕ¢žN§ÀÞU[…NŸ lÍlLY2Õx­ŒRP|´ö¨´jšÈDsÒK7uº*| VJeLÞSЊH‘Rªé,´4éQÀ¡¡¢øÆ‚‘Ò'‘[È:!çëÕn’øEðšØZ›—Ó_\—XÃ*q¦›Y–™µÊtCUmrˆ=ÕM±tét¶¾¨ìÚ¾nrêÈ´Çõñ!3kµ^{nmý‚Çšñ¡ÏùÐwG· æõª&§Ï Á *`²C€=‚“‚EAZÊ…ÀÌu]ëJë BMum½g€˜T‘·Š¢èmôÛíV«mz½Îd2 uí.\åíMÛêEBÎ#ÒWÖL¡UBÂR„’êþ“.ZäüôõSV”‘ŽY„©c³tGè” )Ò˜ hzc‘VøXÄ%é›”d7I¾Y/pB§ÓÙÛÛC6÷d2ÙÞÜI>1¬˜Ôý kùjåKy0T`› Õ=bm9çºÝî /¼ðÑ~ô±Çù™ˆ²,Ãmìí,,›¢(àÙ ƒn· MŒ¬¤:6‰‚g²62¯Xm6Rüá[ûÈq€) ½²¥eÈ[§¶ˆèŒµ¹K'+@±ìÒ3Õ*‚§"Çjíâ"ˈ•˜Öt¤Œ³œ/24œe¾¼÷‚ÿ¤+í´"”Ç“_T‚(œ^¨kryMû®]6²Ó"ÉåôØÊ•RÂ~¤èÅ”FU?¼{–eÓñ =ñä°Ã´ÖPÀ:•²_"WY+ÔµVŽ5gYf8'C¡jøA!z2§kæ6ôGNM}]Ù2B ÑýM—kPl QÐÌZ±‘Ù¤¤PšlÆ,Ë2×$M Û.ðÓ$ÅRlYi­¡&ñ¨²U×,‰¥Îލ<¶Ì RØÈ¢w9bžPÀŠÅ£mÒLU£5‰ZkXÀ-·bI°P “{©XË“ˆC0®¯úåkŒ7Xÿ¿ü²0èTGpòáÃ^Œ™)P–eZ5HØlQK„è€øšØ;*o0|ÔëÈ bUQ Ö“ÈùÑìv»YVìÛC_ÛV«Ud9 x Ç£wÞy-MP‹i<ƒÒšJ$¬+`×*ö›’¨N²BÒ¡nX2q÷©e—K½VùŠqIçötÅ£ „ÒÍ’ò˘Ü2ÖDGÈh¹ÂRCÏ&…T(š9ív{{{U°[­F }è.ž Pþp8ÇÓét4M§ÓƒƒÉóIzý´Üd-X|ˆ k–e k­_zé¥/|á Ï<óÌööv¿ß§¤¶Ùx<žL&'''`3³1¦ßïoooƒ½½=У¤·”9L«:‚ã#­HPhc°Ej Æ•âo)½¶¥Ó©MÊüŠß#£´¶©Ö%¢6½>'®*'~Ij‰hZ»‘¨óÔí>-˜Ò—’Å)¦~*­†{9q|CX †­ÉåµwO_pÍ^³ ƒ}àøS")0àÈ€_&ôôÔÂ?‰¥L1ïX 0VÂF_ëÜÛ…ÑeÕ>dž==¨Ù±l4ñ-Ä:QJÕt-sñ¤$¸"4(öž(ÓJ­|+ü˱÷¹O|â зZ-HÀ¬étŠt(ï<Ï‘…< Μ9ƒì£<Ö’ J7[9¡ AïGä[&RÔ°ø¾éž ]ˆNé§t{È8ˆù/ ’èUR„%*mmm¥’zy¨ÎBH|/Ym!©’–n­ÔH «NÒéG¢U,ºÜGêþ‹ l¹]Hl‹Ó»…d‹¬)¤ .ò ´j%È áHS­pŽpúPaÔ Ø˜ †¦DKΣüBDUU™ºÖ¶ö®ª©¶ÄĶö¤OÅ€å uB’’ñ1‰¡LQO¤ÛS^3ŒUå=1¥ŒÑKƒ¦ QûÆV´¼ééy„$H¯/Sõ›ãø.D$U óMdç—YˆÃ¿p:>¿¬°\p9âïCc‚‹%>œ«ëº×``1¨ŒÓͱÄP—ñBPUU+¥›³ÖçÛíöÆÆÆ… ¦ÓÉh|Dä¥6d];t_ ",mN*Y¢÷~ooHd]×J¤1²@ÑîÕ»„“ë#=Âźk‚—ˆ”b™t¨h9Sðë °S¢DÄç>÷¨U)[ÔÅþH!ÈHáXºJ!1]×öv#Œ œÇè´†­1 ‹E]Zp ™ãc‰¨²,é£ð ¿[kïß¿ZXZxaiñ {6¬—_~ùãÿ8 O^ºt©ÕjmmmÍË™‹5.\¬žáœƒŒxÞÆÆÆææ& h䱉ÿ–6Ñz·¶ÎŠQÖì,D„P h,# àÓ)µÊ«. ìÆTºQ”>:fd ü+ß“k) WK]¦z…¤ƒ9=鬭K9$¿V°Nʈ¦çËÕ8á܉‚ñIˆWNãØí µZdIÈ¥è”J^›,ZÕÄœš¼üGÊ>óŸ#1~±XL&cŒ·cs4\¡Ñ7a‰—bÕ5ƒæ1F­¡—I+R,Qƒæñû†„•¾x:22餧ú˜lƒ™ÉZ"e´ç4ó°æ%/Aû¶¦` E0Y%uF9R7Ä•tíô§÷0韾—LhzBS€šhH /¼²sœ™Á,È!Õ¢²€ë 6Df®=ÛòM½3«Å˜Â©ÈÅ/r¬ßNír¿®eýþ’ðð€ #ªÈ;çš@{í±m1Ro••mcMnnn–ó¹R*8¿¹¹yîÜ9¬±ªªT„¸•ÒUÕ4 TJyn¢!Þ{XÀˆ6ZkA¦«ªªÓéd™ît:›››˜\‘N(œ 8v@ȇ§E!A”ÖfºH(ŠM3Ÿ€ïB°¾ä5Në²*Š‚¼ó2mŠn‹™§ÓiU-H±be­]Tå¼\@Ld:HJz9àOŒ¯°…[­V›ÛιN«Ûïnˆ¶ ±¹•x ÐUUUÍËJUˆŒ Úp8œN§8íðððääd6›UeT7,1­¼ªªÍíÁööö§?ýé—_~ùÊ•+EQlnn"­s¶˜¶ò¢ä…·îèàðÞÝý{w÷G£Ñ|>÷ä¶v6³,ÛØØ¸|åÒå+—0I½A¦sEÚû•)£uJ‘÷–(0"oL¦5/3|iQóùüøø(ÇÑÑÑt:Eh¹Ó陇Œ"Ød­¨bŠý­(LòyHàµ$‘á’rW!1}eÜH°©–ô IDATPrÌŒ&zb† 5n=Ýp\², íFÔÚºRFíV`ªl-™9Ïs ÑÉó«Ä¥ xSžU²QÅ’À°ÈWÖ4±Jø_áA~mH*T ™"DzT3ªÉ×Z+VÞ{ò¬Ù(bofE¼,s8«¦ž¸`ÂÃ~GžôÎÎü?f “É,$ ›na†žz]ÝU-Õ²ªÝX" ^ç™ÑLšB0¹Ê9.³5Ö[3MË>}AkVÊd™võ2çjÀ@Ù¤ ùà3o­§© Ά:èf£;í3[k'³…M“t–ëœÈyvŽ@ee­Ùd:o· ‰ÅP].f½¥žqPZeš<Q ^¯™€å*D¢–-!­õÑɱ1&/š~'¹‚ žQí¬§ ” ÎÎËZG7!ç:éÇÞ,Bœ Ui±\óbaŒÉf ±N0*o F3FXÚÖæ…ñ,6šVž0EEagsK칺®u¾LÏ“Ý'¿T䉸¶DìC3D®¢jiiX˪!^É!Åì‚W&ϵQ¤½ JkÏ\y\·Å î½÷Y®­÷ŠUYΘyQ.Ž÷½÷göΡ[%VD}–e:ø¬è,JÛnµóv4ykýn^(­ÃÎîV«Ïg¥snkk«ß·¶öDdò¬É£©,31Qð¡×ié çvv¶BMÀ®¥ªzÖëõʲ,Ë*nlô‹ûà­™ëºÆà{ Y¦«ja­ŠV ŲYŽ Bµ£Ð„$ ®%#æd8D·¥”µöèè-õB`(,ĶEäzn\5V*/ÚPY–1ªÔñ±®:¤³öÞ+Õz‘Dk«æå¦¥UoFdœÜ‚c‰ À.Ò2ÑïL>÷:Ÿ`JT¾bÃ!„²,¡Ì°\îÞ½ ¹ ”ºpáB–eÛÛÛÿ?koº$ɤ ª°Ã¸#ò “¬!Ù]¬))™_Õ"ýûÜ»²ÒÕ-Ò-}ìÔE“y1§_f@÷ÇgPW÷ÈLkB zF˜›Á…Þúét:ýå/ùìÙ3_pžõÅqžá|€ŸPaùÀ\Ðqáøøýyp䔉F¿EßU5*çÜ ½”–õƒ+W¤h.Í‚P'jÕ@«:±±áìª¡ÃÆ>SÉj¥ŽªcúK=–{º³u¡8qn7–ïW§J¥èȦùЮ•©‹æKB8›QÝK“x¨7™±Ñ`_[œ-ÎÆþ³^Ùµõ5•êøi¥[¬©…{«gu[ÕN†aÈ$*D1m]70,À¨AëšL&——WlŠš¶o4láIfÒpÛSUUCDQ×Ðî²÷¾ï£,-é{aqÀ|i¯bW{´l(úzO!ˆ°#N)Å<†`ðÐl|9ã4JÞ5~?ä±$p0s߯E$È-\œR:::Jc@™ÒÞ¡[Èþ‹PÛ@K€YÌÌYܧ:À!›PáŸé®!ëÕöÔAqαÛ.©e>{ÔΫ­¬Û±ÿ›œõ‰–z®a¼wð÷^äáPî@R’Ì9gh69’䤩®Ä4Cé›§ÒJ—Ú²A6Ã’z*hÈ­!ãáÒ™-–^ÝP𧓉Ê)MË1 Qß÷•¢a<ªx–Ë5 e|K1$ЪGñ®¥-c—±lÚBI bÁ€VE£`•5­bfXJ÷jÓxÓpОg¬£.¨na.„bvÎy±º'"ÄM‹Åjµ‚Òúí·ßâC×uGGGëõKüÅ_ ÀöÏž=ƒ_WDŽŽŽ˜ùêê*ç<ŸÏ]‰´åœ»®»»»»ººº½½ÕÜ+ \@ÿÑ£G'''0L+_YÆ fä½ïºµ¶ªð°ì¡=õ}/&µ7¤×<¬:lp4 Îz½öÔ{h­ì¤=EøÃù,ò@~«p""²ôP:Ðñ.—þrDå,½\Ê¥h7.»'¹÷fB{œÂ¸³@6ú§dÒɈX]ÈÞÕi”àõsIÆäUá°K¡ôÌF•±¯#Åo†×gï””¡Ü1PTñ–}U†Ö#‰HÜ,¹C®Ópêz²ÉLMpôsëZœÛúE‰³Gz@]oûÉ(a3s*3O¥yFÓƒ{»>¤5rð‚e-(wι â€$\ÌSý©ìi\NÉ5‰.8™èX 8CD¦`Ft]·é»dº½JÒên±GÀh¤‡”¯ŒKIŸ5™Ô’PŒ1¹1äí”)%A¿X…Ã묘wR:ÞKóô ƒõ¶{7ÔãIFÞ‹ûŸ§ÅéÞ©Þü“XÙŒ *rˆfþAvDS¢Â™·ñ"rRCJe©HÒGX¹£C¥ ¾ È9Qì^ÌÍ\SIh‡ƒÚPICι@G T ‹v¹\vÝ-¦×××www]×­û5RDÅ€•<½’1¬=ª¢Ä²!«€[iЋMꕤâ=:˦~† ­ë›‹QT•€b°LP|Ôk¿Á•fGÈ·J)¡ZvˆXDŽooo'“ ÁIRî5á Úx…fÒÎçs ?£‘ú“ÉvSN±Ù¬ö^–ˆþ ÔÂD<7”Ò~Å©p&þ5\#ÍVÓ®°´®c+€¢ý–½‰Î™v£§ø}]•P¥Ïö¶ºõj$U¥±—Êi2J€R—sûåËvb{O·¯l Pý¥%Q}M={/hŸ¨Vi}oôJÉ:U»žê³J¥ éCNj@åƒ `W‚¦×××€¿·á±ñ}+ç\8à*®Mãàœ§ahXMEéÄ9‡6j¡À¹l=E`¤Ò) Ž·Èû\pΙÖJ‡Û*mÙEÖªB[ ´W(S2h¶žüóðð‰àwˆÏÝÞÞ¾yó†XØõ¦0>(§X§‘K8# ûäbb1d˜xY}? ˜[/£kJ z³PðÞg'EŠhO0gõÚ‡”¶7ŸŸ·»e[Åġؘ×úAßëox€µxOØ?®”}:ç`{° ™Aö®‚B7 Ù;_˜d&Ú:ç¡ëØçªèUzö¦<• ‹®Ç¾®c"<ÆöøëÊì°Ð_e•""°è\ÚÖ‰HÛ¶UÕ(~5ÌE„J¯®.Ñ‚e/1Æ»»;O”SX²ÐýãRWcU§½å~ȪôV¼ëZ´ƒRB_²Û@Jù;+8@1š™ùüü< ­FW«‚ö“É®i°ÇÞ dÄ”Ô×/"Pó‡a p´~HÚ2zûV± ã‹J#a.\W:X„ÒLCï¯ë¬CϽ›Ûe·ŒÃ®¿n¥Ýµ½ëõŸVŸM&7J]Uö¡)ÁÒº÷F{3y8û­=š¤¢p¸ÝüpˤÔ(¥Y–¡æ”Ïöß{×гý¥=ù¨P‹i Ã0HÊØqà×k8œMôWläžCå*"ïˆjW7—œåçã:ä´ç¬wÖMÆ u)í%ŠÉ¾“Ýj"bËúõ°çQ1/®TÄ–¿zf½ƒJ­†$EÓç¶(Bd¸ÓÑÑüÓO?=??O)ÝÝÝÝÝÝál¢êa±X@óÆõu]™Ë’Øzމvyï 6L™ˆ\QlCØ„,­œÇýkK”¥öÞW Y#ÐDikôïñÀ‡GC~¾‹X7—öÈx÷ø<¤ð¿þþö,¼÷\<Þ{甯N`WJ!¼»ïxï³$$·0ùâ6“,ZçbàQ©¯E°)´ÄEA×W‘ ¥öðpîœÃ4ˆÔX§*gpôâ&Ú¤P){Tü,Í8¹u]7MBª1~_J‡{äTßÝÝÁpwww}}>´v{|vR1s-{Íe¸Ý0ïF ¬˜Ù{¨jÇpÒUÆõ8ó \¢Î9g$NC£Î ÈïÞ½CLWD´-ìNïýfµV¯;îÇip“ªg9Úæ7©sß9w»èPQÄ ì«OÁ—†y]ô¾}߆Ý8]؇>²ÝòÒR÷hˆ½e š4§…q*éí¾Ãv'#ùôAÖ8þÐô¬L%#Ûônlä:Sø½<”ÞÇžÔt¶š‡¥7ÚedVeVjMÔ¬…qëel ?M.Q ï=PÕÅ‹éý˜j«43Î$¥DŽX(‘x-뢿™A[‹™…¼ `¤Lâ HÖpÖ?‰ˆäQ?¨ è4ÞÑQyWÄÈ{êÊ9׆±{w_ºk†B-䱉íW­T=99¼¸¸8>>F(®ëºÃÃú®ÏNNàÁ‚YŒ2Š®ëB]!YDL¬A\·û!4.@N¢Q»tUëGJ÷¾ë+ï}]5MÓ´mJ)¹œs|ÎYñíSt2v§~îࢷÙ#ÀhÏ?óYÓÇ¿â½wLà@]Æ·Fÿ“–\¦ñ8ÉzgÚ1²Ç”Rʃ35¾ÀJƒ½ãAÞ䎌Äâ_Þ0Êd¸ä^(Du2P ºª!8Ÿ5v”÷•‚29àémSyïOŽ5? h[¬‚Ô ©ÛPß¶„XSÔ=“Åg÷>˜N5b k½Ry+f¢ýq¡KjÔÚ(Jäê<›¦Ol†»»»œót:h3æ¯òÝÝŠv\€û@UI¥õÚ̬Þ`•¾ÀR’ÓÐ++ <û{4p]¥2hºˆL¨…m)F—K¥ÕlìH&%r{êÞ—Éeºs0—ˆŽM´ÓŒá~y¯&›Dè±,OD“ÚÀd©h¸:Ÿ\š4¨\Š*»Fªu{°‰Ê‘^Ù¬Ó®Õn_Ð2 ½?ï:±õ´èJ‰’pñg<\m½ ¢Ê¢ÍÐqÅç©%­2™ u¦–ÏádŠŒ»¯*θû9'J¤¡ç~†÷#ƒY9ÒjñøYW“s.Æ1‰¡Cy÷DTïxMhfžÆ2Eç¼!7òŠéd{ƒ·ïW°ˆP–œ³+”9ë¡«ª yjÞû¶­ô$â,à ]œˆáëëkÀ,ô9Ïsjgö¨…vÅþ: oãß²&õE×-Üïýb)!àÉd3™Lºn¨ªêè`> ‰ßñy>¤±÷ª?9Þ+ÎíÏ¿ùÎ{xøù#×;ç˜DÍ_)ÔT#£^ûÀ!T9©ÈØY"6aI¥Ý¤Õàü¨K@fFv¨Ù3ŸÏèW;Óï ›¢dŸ[Õ5G&æ†3îýaÁÅ*›ãÐ!µþZ`V(JÝ6åeq &°Sán°F¼ô»Ê¯-›ÓŸÉÚÇÝòJ±´#ÅÉ8ôaGjY|*±¼÷@ˆ$"@MÝÞÞ^]]Ýßßã>syÈ7Fn†V;À' \«¬[£ßŒ…kdpUU1¡ŸÚUq›ä¢KD%Ö;[Óó¤Ô «Žl×V·lÊõ§J=™m¿žM…ý§¢‘Pá8HxÑ´;•=ú,Åï„Ú¨V‚nßø^øÅ™ZOgB‰°Qý“5DìR؃*Fâ’$Ùã{J€.¦žÀ‡ ZZLýœ‰Ã•H §áôjr•ò¼·(o±ž9ç$é9%#‡| ø³cÀØV´efOä˜÷;;îKè”Ó6½<çŒcfÉcᬞ>¨Y¢sŽ˜CضÃÊLPyuSTC•ª¸Ñ³ˆˆSµ öºà_wÎ1.n\¼‹¾Ä¡¹dè /ú»—/,ßçR4¿·,:1Ý>1ù 9gW"qÊjFbÈLé<Ž@!¦pÛ¶}àWªëzÒÔÃ0x“žÍFKþy{ù¾a)pç¥h‡?l/ø[ëƒíl?2sQ—gqaûTadAëQª+öÞséÅkß Ÿí¢Ñû¤&$€žbŒH}Åî¯×KEùÕ¨3+¢”7•‚ eS\l‰®t/VXôN¨­1›ðsJ©ïÖ¾&A?€T@¶M»Ê«I;ywõŽˆœ Ì>%©*×4HîûM(˜5ui8ç,’D’ÂÚ’3;°Jj«6¡'œ“Kk66–Šê­•é^•æBX/ˆ["B6]Jé‡~¸¾¾FÂóíí-3£1¾|ùm¥á@ëSptpxrˆ$¯I3…¤w¥3:UÀïjñV*é8ç p©‹FÙ«ìBm¨\L²ó!œ&"]×aáä‡ãáL¸úa:CeI¥xÃ{‡ÒV¥Dk ~p3CåJ&‰lOuÓß+•ë:èaJ ¼Xjq¢f³¤iÕLsΊ‰–Lå<—)îJM(³l¯á ÷féƒ6Àí™Kzàf³ñUPP×5´ÃétúèÑ#öî~¹¸ººB´4“öt2Ç­0®ëÀß{¦¦£.¤• ÓM"W-XŽPšêL×9>¦p+©^§èMwêÜ{ò5 ³«ÄqN<9ßÖ“jµZÅa˜Ÿ¹0k¦OÏŸ\/øýÿ|·\wUR¦œ†nÍ17óJÒ°Y-†n •™åà‚÷^’,ïÐñgÓvÚ6®rë~MDí´Lá/aæn9è¹S!RjÚŠM_ç}fGì<‡º™O¦G9¦å¤Ÿµ›år™ u›R"áP»yÕÌFñéÃ|µZÔV[‹Æ›º‚Æ yLofrL<Ä›žs‰Ì£³tˆ‘ˆR¢=t*xI’)3 ñ@DÜ­˜9ppÎõUü7 ßNßoú854È¥âû‚߇´ä žª7µj:K²úW+­ÅØÇd” ȆÊ4iFi¦ÆVÁjuõξ”ýXеÊÁÞÈf¨ÞæÊ¦6’5¸$qL§Ó'OžäœÑ‚ÐÐÃ0 |N¸t£qçPâQÎÃÀ20'ùÛ°ÛýÉDÔ CÕ6“¦ÏçŸ={öõ—÷èô4ºÍ‹WoîW›>昴ãKå¡®ªÓ&¢‘Ÿzç½wB*Ñ{¤z› Ñò)R]“‰Þ§î@VÍçóÊïýl2÷eÓG`ź|–KüyŽóùüìì¬ïûï¾û"À°Û˜9åAÏËí½wàÚ‘MÌÌ,[´"•‘ˆ5ÃpssOÛ“'O=z4›ÍNŽŽ—’éÒÏçÎmÖ«¾7iÛ\ÔPå{¤¼ ÷ü•ó'£?¥’!èi§¸tË{¾D‘˜TñRnƘ€Ûª¿Þy¶Ý…dPµyW­÷ÒØTy­/Õ_憩dfc©‰wÎüÇŒ¯óhûŽ?©”o+ìj3ïp »€Ê»ôõ.h])ý¬[HE›ÐÏDèvé¥t·ߟ·A»'Ge¼]îA`RE‚ 'ö¦VE”3nUX™Ø``uÞÞÞÞÜÜ #—Ò[WHÈÔÍf³\.5 žé¢Ù˜Ù$úXD²äBpª•úء᫔´uˆ¥‹‹‹º®1+"Rw>;;C;&ͤ]õuWvxS°±·ª{÷¡"ótw¬ Ö p^ †ë­€Ü4ŸÏ¥„ÙœsyâÖ¬X¥Ú6­?Ë…¹ø$Òûpõ¬f ¯ 7Wºr&CAN`p¨B¦ÃêÑú]ÞM€ä&øÃc¢‹¬|VcZzO¤+‰ 𜜜 Ðré BXmÖÖÁ®ïåÙgNÈIΜ%ñžéoá‡DDcýç–¢gÉ4«ëùüðøàðÉ“Ç_üâÙáÁìòþéÙÙÙW7›>fâH"ɃëaWŸX­sÎ…±¸Ž™‡Mí ¸)¤U_¤øl@À>°„=bÀ)®Cˆqâ Y’Û9(ã¶‹ÅA€Y‹sR:;;¹»»ûñÇüñÇ»»;ÈÅœs;ïc*fîMÓb;ö°ˆ@é$Àã\ {íø2™LNOªªBèš 8iæ¹,¬¿uºÚšò­ì?¥s,;ÂOÞûÀaÏô—Q-þ¤FÐkÙI rè’†VÊ[\€Š33úKnÕˆ"tA¬=Í&/X°N@ŒOV€{ÈË9©\´[ÿW `½ËŽ )F³Ü³Èñ3 y¦{}w]·¡€éšÆUÎob×u‰¶~J \Øø­:¾K-Û½¦Ý“^ˆ­ õƒ®ªÀ%éÔ9ëõý|@&B@ªëºûõz}~~þäÉ“ë2–Ë¥ŒtB};ÚeS{ƒ™G×/òU™Å9×c37"}öÊÔí ßÀýý}áèà]Æ/..\AJƒÒá8¤<$Ù)t±”Q<,7Ú#à½!&¿7i±†óÁ­@ùÈëÿäðÞWìr̪‰éOå€äSVÉ'îÞ 33BœúO2J³/±Q+€½¹upÃ9Ç´•âd„‹ZÀÞWÎùb;XÔŽ<6–™À¢&ê´#טì+Ø€Ù`-%"ÚâÍB·¦mq‘1Cõµ3Ae=Ê ñH|Õ89çöØŸ$ »Äj¨©ïW_X߸CÅ=»^¯‘ö »V³OaÈÂÖ>¾´ƒþ«±(x«0lõ‘ ‰ÑÇ©ô€,•Ìp%ç<áè¡Ą́¬8<@5ƒHÅ^fÞöÙڙƚ å¤xR_âÉtL‘¦礢Ôˆ÷Jâ=þ«¿´ÓpÅ[‚,>}[dD£ U¬D¤µ¶mÛ"µm[(ÅÚ @âÕAH¥K&+ ςˌ²F/ 8Ÿ³Aä×öׯ_ T•€ù|~pppxrˆ§(OÈÜ÷hzOîÚRÒ=²q‚Q‚°ÔlUrWRûÕfÔZÐäQ7âàà`6›ÁsˆTï=ܼy7IJ_•IRõ²ƒ—QÆY)5~œT,i…wSv?ülªÛ†¡j¶ ˜´ !92vbqLÌÄLÅ= ß¼uAè’qD«ìô&õDż®3»/°Ø9—e+ƒU@Z\ ’ÀʲT4Xáj…ÚàÆVK1ïRJRÚÙê-Ô]0>ÃÄ´'$ Œ€ÄÒõÖÙ£J¢ëbå‡ÝZ¼†3îek*)¶ƒª?™U3}ÀhCêÐjµêËÐþBWU…þP”à7t%¨‘|†/¥„äK+ÓÒéÞl5ýõé ë·oß. fF ¦m@Å=9–7ÙÕ~x¢ô—zàñû¡´’ö¥+°Ï-6ÓFPŠˆÃÆä¡­ÇR {W3\Èp@uøˆÑ!tѲU,%R‹û?,£ºadx±zDÄ Rá>WWWèÌ‘s¾¼¼dæ‹‹‹ªª–Ëe.8P­5ÙRf2IøöƒýçCùÇÉõªªÚ¶­Ö+WêãXÊ’–Ëå|>° %ÙdjèÙÆaÜl6©‹T )$ ÅèùÛDðNxLÂJ%k7çŒcâÉÊZ1_"m.¨–‡û‚%H)IL‰G'[aÝ­A6 Cຮk7ðÔ”ÁSö΂¥ç!Qì3tD¨ÝH-`7B‘÷!„¡ßIU)«KËåÀÌ'''gg'1æ›››·oß^__?z|wôz½¾¿¿oÛ8z÷‹Å{×2ç /DιÀ%n-`Ú•pê Ò÷uÎ¥!j(]I«išMŽM3i›Ùáñ 3 xR³v¦ÌP3cì¾ü$9°-°Gø'¿ø× å6ÉTüÛçîœ/!6Rìé+ÞiÝDXÂ\2Jß«¶ê«9m‚>Äl¼˜Æ›Å{£,‚¤0‡Ñ(÷ÄŽ©&"¢®ë8›ÔW;Æ0¬Àét: ºH"x’Ed:ªÖ³¯|`bÏ4Ÿ(š!¥äCuµÙl’dɤù¨1ÆÍFæó¹÷< ‘c6õ©DhàËCì½÷ŽÄUCI@Ï ¡îûM1Sbf“fz{{ÛTíÕåu×u÷w‹ûÛÅz½4ôz½†¹‰Òìãããù|~||ÜuÝóçÏÑ?QŸº®/..6›Íùùù§Ÿ~ y…=¥”h‹á%VU= ÄEE„#±'ûBwPÊCzj@ŽŽ€±utp윫\UùÚ¶tTÏ2bÚÍKJ¦dEŒ5æL P;I™œ°'v$A¸ UŒ3 ç>v}ì ŸðÓ§O™úÁÅÅ•àºsn6›!FU‡&¸Š„(sìÓÉÑéýý}åëå°Ž)J½sNȳËL}N­©]Qÿ³ *1EõkÚ¤r‡ñ+”bŠÌ|0?È”V7K°õ¡‹oÞ¼éºîõë×"·çÉÉIÌÃÛË Ipppp´hºcÊEäÑ–sÂQˆ*D}¿Y­}RWUÓV"iµZ ÃૉsÎû¨ÉöÎEfnÛ¨C}‰Lï¥K ˆîüüôøø´ëº««ËõzüÍûûû«««çÏŸ¿~ýúêúÙš^l¹VçÙ{”fqŒÙ¹P…fîUYAÙjÛä½ß0úÑ»¾Ú¬C×·7UUmú®ûæ›P7Íd~px|||u|xpt0k«º±iš˜sì{fnÚ–ˆúa°HjZMND¡"‘*·\,rÎM3A¤i2i1Єˆ½ßôýjsÙNjô&ûö­êÊÞû~è\rÞ{â<Än~0mÚ*¥TûÀYÈæ\=+Ê`Í u%|Ì©*þgÄn„‰½«êZâVŽªbADD™FÞyJ9 ¥¸¾¾¾¿¿GCIM¬#£ž«F¨Ké_C ™¶N?«áZß í*¿®ähØO##{ßUï™ E½UJ)Sf?ê^1KN6‘yŸì™ÕEã|AÃ%³pDÂ;~¿±älˆÌŒÐ àu¹«©˜98MêR¹mûƒÅÛv‹ƒæJ¸T dÌ=kðÍHΛ2bŒ.mÃ{Æ4NŸ®0x”‚Y23‘‡×Ó{ÿÉ'Ÿô}vv½|µZ}ùå—WWWß|û§wïÞ½~ý«Ré å½JvÓ­ukÏ&•4=˜zÌɤìÁ‹®9ó‹ÍÚ…ªn—÷‹Õr¹^Þ,f“¦­§3¸ÐœAøŠ1†Pó®ù8®¼ôz|ô4)éO]|1‘ÚlÂ1ö0ê‘Ñ£ªcïzeq–¡í]<ÒêûÉ™Þ{[R× ¹RܑŋìïˆåJlúÙÒ¹3ùÕȪ¢ŸRv?>[f"ŠþÞîNPy¦*? 8Y@Ú½›™ðÈXm@Ñ.±r\ß ýÞvÚ]WéÎE6£ìZH_ýÃðõ|µý“îº"] ¢ÐíH#R©ž1(àÀ`1ºO0ûrÎËõŠŠs_½Í9gx¿-ô öÏuÎM§Ó‹‹‹ù|>ºàBC»Á ]Uþ+¤¯’”%nûiع4~Pe s†‡`µZÁê…;Zoˆœããc¼æz½¾»»CŒÊ—ê^ü̦8Où)ˆ ¤9¥Îøö±ŒjÄÛÃ^Ï»Åslt2ç\×uÚH>›ÛÛÛo¿ýöüãŸÿüçÃÃÃÇcžçççGGGoüáåË—÷÷÷ØDfhWPA»QY%’ˆ ,±,ƒv#0'Ù»/TP_`÷@hõ}¿X,°Ðó`A†‚hhå±ÆäªªŸ)„P7uíi3ˆd÷á~ÀïÀDäùý8h$„ÿcŒL ¾ Œùd2I}º¾ª*öÞ9‡6æzØqŽ’¸!3‡0– #ÛSUU‘‘&õtƒœl¹˜Ê`%àa¸”tƒŒŒ®ì”’:¢Õ: ¥ÇI.hçx¢+Íò´jÜû€#3N±tŸþy×uÿ˯^¼xñÇ?þñûï¿¿¾¾FöÖz½Îc:9šß*ÐltÇbsoýò€§§ÒCÚzzÉä<ûUs¿¼»[ÜÎg³I[7íügÓÆ°ô¤(ßÐã“¢ü•C'<ŒàÆžÞgX¡`Ï‚=düI~Œ¾;1IOÊÈyÛPrï²qU™Ø4b”ƒé1Ì&Ô@õ2jxÂNl”kRªŽÔ3ÿQ[hOê)ëi÷Œx [6 I+dôÝ1zÜ(_Ãè²C@q«Êv«ô&!„Åj)&GM WQ®¤ìc g“©ˆó_QÜ(d¯ÀU0 Mò ¥Ñ½vcfµö†ÒÅ‘0o2Ú1[Hë\JUÆàãØ H÷AX6N2öþÑ£G0vëº>>>;Q;ܶµ¢ž–l°=-Tx–ìZ]£(Í,õ¨€I)ÚÎPZš«ÂËÅ<>>†®0 – †2´ ì8¬˜æ«ÈÌ»ý¤ÕL‘’°­ÓV¬Ý®ì;Ê®~ &üKÏŸ?ÿ¯ÿú¯ÿøÿ¸¼¼üôÓO‘gwqqñõ×_3óÿóÿþßß}÷]Jéüü\©ÉYVÁÂݬ6 öñxœd»þzÒÜn(Ëò2HY< ¯!Pƒ>X:D|ôLåbgæÐ„ìHœóUUU>v‘ˆè£91bÒÅÉðÐ÷è‘Àç‚ ËD)g7 ¸mÛUUù™\B¢HŠx6×ò!póºÞ‚ÚSñ:ˆш$ª5„økå¶ÔN^„cÌ]7ä(ëU·^w›M/"7lbÉêpÂ̓ åD¨ö¥W]ιï7{LÉ›ç§=:999;;{þüù›7oªªZ­Vw××Yâ0D8-Ñè†Ý£j¥½=Â_Ú9Å ¢H"œ„s?¤®ÖËÅ]SU>„Istt„ Æ£££ÃÃC™Úº ã#öëDgEFLêÄàSÆ¢'  q(;u®*lô²ºªà6òö­ *ŸßOÐ{"Íç\pŒüp"Ê”˜E5!y`Ô©µàL¨NËž…Æ ´e­‚7zï,ß§FŒ¿)ëÃ&ìœëâUªÁEãœK´oÂÚ—ç!ÓÇxç³d·kˆHìÇlo²™¨¸>TMV½ìo:™YÙ¢ª Tä%KÕ~ÐßáÖO¥øÇ&®T_+Vyz*>"•¹¿î¥Å*<"BRO*Ϊԧ”ŽŽŽ`¨¹¹7Ê·“ÉümýàÐïjMˆD$åÌ«sOy_,ÈAX ;˜;çÓVQ{Æ®·Qü]²Vj±SÂv«Z¥ÆeÎø²å_¹€‹IIfF:ñÕÕÕwß}÷oÿöomÛ>zôˆ™ONN¾þúë'OžüË¿üËŸÿüçï¾û®iš/¿ü²m[€A¾×L&UDv[‰ˆ3P‹;ìÁ¦à†Èo‡>O-¯TtñÉd‚uL ;P²l •}ü  zïäîÍù½„”JõÔ˜Ù4v»xªFÛ¶³É4¹¼¼ÔÀ„êÖc4±Œ¾ï§ÓI™¢$RŽï‰m¥0½ƒ•gRü·šáŒ¢©Õj….ª® …yïËø¨_ ºÙrË;o½&ƘÜX,k§D´£…¨ $›àŸ3.kf?Cñ_­Voß¾}ýúõr¹DP𫯾úâ‹/ªªzõêÕŸþô§~øáêêêàà ç <œóz½®CãŠá»w.î‹ìúÌukôèêI ¦ù\Ðu]#{>Ÿ-„ €­=®Á´[Þ“‹B•|ÜÞÑ DU¢|Á¾Úè×éºîíÛ·WWW8qp&Ïf³ÏŸ}&õh\’IL¦Z‹–†kp½÷Î!Û\‹ÓˆJ7{¥^"ªÜ¶%š}œhÒzÝ9âår½¸_m6]UU‰}¨ºgtC½iDv¾J)-l‡ôD¤çz½aÔ}úé§´Z­VÇ«õbµZtPå׫Õ&Rö\a5¼éa'»V¦ýœM!o61WΙÙQ1¹D$g!úœÓz½‚l»¼vÐz@ˆð7Îf3Í9‚¯X'S‡ñ2f†¥"¡³.,•Õf­Î[µzEDq’áñ¦a¤R¶6"’´Ïèq™]Ú=«{ûm?Èc1˘1Ó$tbtª€F ¢w6›¡Uò´ß½{‡V€!ãu RáKz¶]öä±”’ó>ºšŠÇ¾¯eÖ%cÌl”?u3L&“Ífsuu…æWˆ÷?~üø³Ï>›L&ùË_‹¤/jú›˜;¨\\JDTYé‹Iq Oò»Ê'¼ªž"2"2C(©XJ“\ŒíJEž9N+¬¼æ69‹¸ªªjv?iBXn5¾Â®ô& “zê«W¯Þ½{—}騚ù|þ‹_ü"WôöíÛ»»;"B&ÔçÝVÃÐC½ ¡r&زÔb0ý}ô;åjJÛ8•]×Q.|]CÞš›jyëœiw F¦Z½VCçœ-ØÎ˜€é ÑVຣ^àêêªr®ª}ÛÖ€ÖjšUÛn†> q­­±œñ‰µŸe 2«5:å,É1%ñ^2“8rÄY¶e{0?‹Ål6[-‡ƒƒ€jÁy>ÄæýÄ÷!¹~„>íq°¿WìYï â¤Ôd©ø ‰–‚åbã WY »¯ò‘‰}d¶º"ˆÊ½ÅaæàÈϧÛ$ºàªà*˜e*eõ,圫 f»†n±¸ƒÊß÷=:IHi¢âŸSJH˜\®WÞûnè=À{JBÆ$ˆi;Ö0037Û¤ÇM¿6q8ï¼'Ǿ ݰArÍëׯ¿ù|±X`§çGPc§ÓéñáÑéñÉÙÉé´¨ø¹¹¹îÕd6Åõ=šø*äaú!ä±tÛæ½Gú¤øjµÃE"bUU'''HøX–Xq¼ê6u]×uë}å¹#zåÆ { UÈY£S78•S ›U¥Ú ˜;ô-ð…Ï9ƈ`+HYúäɧŸþùùùù»wï~ÿÿýáõë×P‰ªªbï¦í ™Ûm=iëIŽ󰸹†ánqë+×Ç.SêcÏ)ç!ºà™ÃÓ¦ï|ú,ó㩾¯/ÉV8bb0zÞ ø#yvÞûËËwMU_^^~ûí·øß¿ùý‹£ƒÃÿõý¯‹‹‹¯ÿç/üñÇß½EMçË×/~ñÙÿxòäÉ/ù˧?9><9˜â‰uhT[J¥‡™ÙSЉ™…s’ÈžŠªKH)šÖ !š¶f†¡òA'ŸiŒ"CÀ, hílz·\„¸ó1Æi{0išÕj“(2»*lh[OºußT-û*o(³¤”–Ë>4ÂMer1/óPÇpÃÃtHW”IBJ‰Y¡µFù*Ž7ë ;šÕS& ⸮×¶M3©“Ë+‰w$߯7ß¼zóryß>¾¸º|Ç>L'sïÜ_|ÑN'7þÞ-Òi}tŸW“ö mú.úªáuÚô2D–ÌqèûÕÀ켟ÎZO vɱd„(3ÓÊ;’ì6«”úa˜¬sܤaç³úcUµo w‹uû¡O ®bNÝb³Äeæ!Æ!’Fµô8ôÃŽÉu=‡ÖgãÄ82ì]-µ¬â¡mÛ~³x»gÎÞSŒÝ0 óùäââôþþææŠØODU5™N!òÏ/Ž×ëõíí=ê‰û.Â=Zµ£G—dë€DW÷a_@R»!å64Ã0¸Üb+‰8ÊÎy®\r{qŽKÌ‹åý‚ˆB»ÃÅíÛêúäämÖÎŽŽ*Ç—W«U·Y4!¸Ê±•c'Ò4MÛÎbC¿]·n&-§¸º¹F^Ág‰)JŒ’9¼g8íqˆªPá{bJY²ø$qÝL†!9W߆Лâm+ç©‘ÊUžª¦ÝÉÞÊ*‰œUpŽSÊœbã]εçJ’p'ËaÝ¢_®ªZšÀ=u›ÍàzèdçgÇ“#õnæœÅKŸzOÎ97©'ˆj‰ ÄL¯ëÉÖ "‘ä*_“à›LšÎu¹…ݹ”R 7)›.°k«: N UwȦSï®z½þIŒÕc”´­ç ¥Ô„ â’ûdô/Ud\ñÅ«‡Ö›<[*½ÿ `4î H `"Ë mË Vµ÷ÑP ©ÔbÃã’Š QÈ3øº+¿Eëj+¢¿0µ!œàÕÄCp¤w ©¯ÇØ·sðnûÎÊû"ôÀù¬+IƪfÄÐ)nÀ~Ë waúÃjt% e•ZŸ}öY]×(yDçT¸ñ©4sµÁ3)^zuZÚ9[RÁdp=ÇïS¨õb«ç²²æâ-|úôéëׯŸ={öæÍ›þç¾¾¾Î9ÿú׿n&íoû[)TUõã?¾~ýúâââ`vøøñã§OŸY‰‹lê§±¼)æ—µGhÇ[ºeÓYí*醱;S6(­®äQä˜Rbq2Â&'릳煊,8öܧàI(‹º݈CU܉J:rÎÄN˜„)²0I¢ìrœ„ú†=ùU¿yuùvÑo^¼{»‰Ã²Ûô)6¡rDG‡'''!`E%É.øªª(øL2™LrNCÌ)eI9—.O¹´Ø ¾÷ÎOÞd3“°#="ÈD7¦n¨]>nGc½C9_zĤÀ®éÖ¤’òƒm€¯C¿Á`ã;õÕ¨<Õ¡bæ¾ë ÅVMÃÅ?—K£<¨>’Ìá\[UUÛN‹Åâ~4Öm» ‚àÒü¦lAœAÅâ’!Œï£ÚÃvªŒÁIŽ“>›Í®fsôÕÐ%Å[ÎCqÈÅ™·3Êm\Ò™™¥ÛµqñYh?*_ùX2 ýëÇ/³,qc(¯P–hÝTÌ[®«³‡û+Ÿ¾7œ ¯8ƒ= ò¶"#‘ v1TVò•wÍ”Tj‡ð•¡”ý8Ó³Vvcißê!/Ó½ç’3æMâhŸvĶ IDAT*Xµ¨Ü€ ¨÷÷÷8ºÐ(ÎÏÏApÐQò¡+®6=qb€©DÅ4 _!hňˆ ±62¼P7Œ8+ê¡CaÍÎôæóÞ!œ¿øyHIRÜ:U]IËñ©`³ÙÜÞÞrUXðL8çf³Ùéééùù9JfáÑ}óæÍÍÍM×u˜9"èóùµÔÓéV`,IඇŒu[© UosUUÓéÔ22ˆðbj“ô½ –«®ëõzcüÃþðòåËï¿ÿ^Dþñÿñøø¸n›_ýêWÿú¯ÿÊÌxeyúôéß}ù÷=Âä‘‚ ‰/­`Ô]IïñD‘¥^K¢ãâóö»(§ß%'~JBÞ{ŽŽÐ /)eȦ´“±U|iÀ)¥^úžüPÉ„¢'ùž9ë #BÎåàz'ÙåàÄ;éRfcŸSU‡»~ó—W/ê«æíÛ·JËÕ"07Þ9ç?}úèÑ£n½¹¼z·î:â± K¼Ë$É)EŸ©Ïeˆ Ðí=¢¡$Nr®«\Cc>ˆ°dÜTÚNg—~`É#™v¥ê1â’RÀE§ו4Ò= ¡ÞélŠRœsäX}KpZ@À»‚E£äa•Ý=LDUÕ8çˆ\ÖͪÃ1¼¾»Æ‘íéwû¾·)x¢ < |,š(„44xü‰ËÞ gccŸRêºõÝÝM@âzÓž¡·•–ßßß:ç ÿ÷9g"õ­ødÇÌäœص2ííšS/»Å‡HSù­_Ï݇“UuViÅFéO%m–Œõ²³ã»ÏµP^ú×=¬2”°ws" Ú%Z¹Î&¦]‹B+#Õ0¨ŒFu^fÆ‘C†'޲­½{Z ¦²ñšÃ¢W’¦Ô‡€Ê ¤9 úhµZ¹£~f>Ÿ#5ß{'LÓ46;Œ .Ì Àœ!–$pصmÛZw.™îž"‚pKÛ¶ ]M0Æ[ÛýVJÕ-pÆ·l7†ÿ:u̺+öÖsO#McµZQó±à™œŸŸöÙg§§§óùüÝ»w/_¾|ñâÅýý},€ÉMÓœ¡;…VTÛp¯úÔ¢¥]5P°jHÞ4x&³ùü <ãJňs®mÛ?üáÏŸ?Ï9Ïçó§OŸn6›ßüæ7wwwpÀ¼xñb¹\þâ¿xúôéo~óÄøxhˆH=d”ż´ÓõWjtÆ·©êf΢[¬É6£Pw¯dÛêµÜŠñú8zX„--ÀLL)ÉûbÀ¡ðN_1U!y/>¸Y¦uêû:TUS‡¦n'“.Ç›õ"­î›Uå«È|ÈL“ºyöìÙl6ûöÏßÜ/—™ÄWçBïBN379õš苌:´8É9ÕBÐïÇл'ñ1f€EÀ±Ä¾ê›Èäs"ï"‰ A˜¼wIùªt¼«å+…«„Î¥”K R×Dv+2¨ ”õ¡rÎi…!•VÇlìÚÍÔ&s®¡¼žÀ×x»¸½»»{÷îÐ<´1jÄí»ŒÞє؄v•B"’±­]îºnèá¸æ¦i–¡BÕZk Æa:úg³Y(‡ô¸Ç–õuĉs’yÛîI­‰²z¬•":èMö©vŸ†ÇÿyA‘ƒÊtSìš`ÄÒZÞ µTðþ²IÕñðÝÿ†¡Ïâ]w…Îs›¬ŸvqÀ­°´³QæKN-<`¢-‚4—2\uþ8ã Ð™Y~g¤¿yøJx4Ry‘όֿD„z_²#mé åZ%$B)B¤bO末‚€ ž((*õ¾Ê”g³™+¹— Ä‘K–,Ö]+­Jd›ÓþÞ÷Ý“ d´BŒ=ù-¦R_¨X¥år ®J´ =99qÎ-—ËxýúõÛ·ocŒXxæµ=”掦R—BFC¢]½Š‹E *¤í¦ó®^9Úw$SÀˆÿæ›o~øá‡çÏŸÏf³¯¾úªëºÏ>ûl>ŸÿÓ?ý½yóæòò²mÛ/¾øâ«¯¾úôÓOÑóqø@gu¥OW¶ÌÔž%½æá?íöÙü>W¡]1ý½Ý_MÑrÚ¶%gq#ý¨óƒyË5p'Ùå#D´óÙ;vÁµ ùPµ“ãóÓùÁ´ï{ÎcJùt: ’äHd]×M¨)棣£ÇÇ_¼x±IyÇÞ±d_ö^˜¼÷}L.‰ ‘òhƒ031§<ÄIzÉY2;ØUäÉSUUŽƒH"âœÒ˜€  &3 C]D•J( ×PQÔ”œòƒ@†5JÀîÆ€Ýà‘"‡FŠ]AÊË¥%6D†!'B‚K­ú~#»v•αsâ=c±-—ó¦ÑèG,MÄ‘/¶Gíÿ-#ÄF˜C:O{ܬ¿D_Gùß8}„ÕψÞÃçñ!¨‡Êe·+‘ÞK4Cƒ(D!7zՌϤ/}ëT`sÚeIùAøÊ>;”"˜tÀ‘€é`¥©zªÚ€ˆÒשª½…Àx.€·šè‹'ŽVN\ E[±aõ cÂv±Â‘£s.¸±èeô/>8Ày7ôhu´\¢X u³`hf|ðÏ#ýÝÈ€qßO?ýôüü<ç|yy¹Z­.ß¾»¹¹AfPГ'O¦Óé«çß___)¢u+|žªB uÛ,×Ç,C””sIj“BÒCrJ9>Óųw.8Ô&y"æœQì 1f¢ˆv±9SÈ‘Œz-íòÙTª*J±ìf)ØV›x;Æ@ÎQ_@J‰òÆ]»Ôú,ïG¨K%`$¦\\\<{öìòòòûï¿ÿË_þòöí[$²àR)±sN›ãîl(›z92¢‘ˆr’bÎ9õƒ÷Ò’³Äõpõ}Vpwww·\=~üøèð¤®ëÙl¦”™L<Ù5ñ™Ù{àáöΙÌsÃÌØxe>$Έ( ¹Fkp)òx÷8 ‰Œ¯A&+‡ˆ 5Ê—3eEÀjƒÆ)ìÌÉ• 2—@2o›–¨c¹\¢m'0fŽ8%*AUÃó#"ê¬Fê/tj೨ŽZA€Ð{ß¶­¤Œ† ±TòÀ{9™M3†‹ûÇìºNÀ` EÈJß=yföŠv[Ø£Ûæ½®†~Ö{²§àbŽ£8ª+c±ºGÜW½x/,ÑÙÙÙÓ§OC?üðË/º®[Ü-‘ˆC…’Hb,‹˜´8ï}Úl±pu×’w¥h*M)”‰Ñ·ì w¥é…RȘ¿c×u÷÷÷ÏŸ?ÿÓŸþ„ðÿ_|qzzšs>>>þæ›o¾ýî/···———ÞûÏ?ÿüW¿úÕ—_~yxxû„–_ªÀéœAW¹t\1Äcé¨!1Ù5Í] ÁäœYvû¸Éø,ŠãÖ´­7LJTÚ×à Äms?t´Y¯™ãŠ\UÅלìÅ€wáP²‰çœcJŽÉW¡š¶'§§ÿãóÏ¿|ö,¿½½B´<ë.Ô #-ƺŽý0à\ØHJ)§”¢`B±ÊƒsÁq%Â*Ψ葖þÁpú~Ûáâ“׿¦‚éíLe'X³^¹Ù¼;¸Äì‘}‰$," ¤îÝ6aþ}‘# Q©•[­VàQui ~qqqssƒ~á××ר¨ÔP—¾Žyâ1ºAÆÀÚ>E(§SŽBÙ‰ó䳌 )GFúïúM×o^¾ùáÍ›7çgNOOÏÎΦÓ9$1’]‰IÑ#©$U‘§œÑ|oþJnÖÙçר˜§?-ÀvÅM‘g¾>¼ñdJu_”òU¾ìqZÒº³ò×Lôã¡n¡‚ìám™9htZ)ÛV{_ï·¥¡ äœ-ŸÔ±ŽoUzàÜ™êík«n¢w.qµŒ¯ÄwÖæëûq_”úà¶®têö«N€´@ÍØZ¯×˜a( r¶ª´sn6™Rapt”rFffТËÚ=×=pØ tÙíòÚíI§Â ru³XÒI¥Ç‹r­u¾_Þ!l [ïL×Éd²Z­^¾|ùêÕ+ïýíõ–&/ÜήäPHÉâ’û BË `)5Ü6¡‰ø+ŒÒU4ý3|)»RòÀ¦C3xóæÍïÿûÿüÏ_.—h!"_ýuÎù›o¾ùËóï–ËåÛ·oùË_?{öìéÓ§···m=A¼ è(:¥´lZÁtcÁ{¢âu°ú²N2§Q ÒG‰GÖOdÇÒ¹ÝwÝô‘ï—diL¯KÝfÃ7!ˆK‰˜$¿' +ç,²M(ß!¢!§Šˆ¼Ÿ=?=ûìÉ' û³O¯Ë«««£gw0¹Ÿ†:õÃÕý=±ÐÉáÑÙÉéòþþÕ«W¤IsÞû’W8”ÆÛÁ=ާ8gp„D2QÕ's®rÓij·XqíéðÞ§X@ËitNÄÒÍ®žò1+ºÄ4 zO# +„àÙ‰H¿ÙŒ¼%g¾ô{§°ì±[D?ý)¦»%œSJ_~ùåååå‹/^¾|ùöíÛ››ðL)Î-™àRöž‹ßç<†6‡ÒVΗ$(ßDTU•"õÖíìòòòúêv6›ŸŸŸ"W1„-: ž2*Ó9AæJÞÎÇ.‚3>øB!…cýÃNvMƇ"mïbµ@삈8Ýzžý¹÷,Ù 'ÿõã½GÛÎÇ^V«¸3!°¡!O_Р¤˜ D㘈ŸK^øcJ)ÇDDÁùi;Ñã×4 :ò"Èœ¬œóúªªRN"RUm¦4 ½s®®êãÐ÷¡öﮯ‚"ûg·ڟžž>þÐ ëå =88@îÕ“'Oàä98:l&ít>«ëúþþ~±X¬×ëÅrò_DjQ_i¤qðâZ¶ôêÍk\uu5?<ˆ99çð,`¿Íçóœ³÷þèèˆ 0…¹ÜVrŽ}ŸÉgç(ù ’rÎhöÀÖ‘KSÝK*64Ö-¤k$C çM¿Ö_m–?üøˆ`ëõ:‘pAß M=™ÏNNOONN>ûäÓÏ>ûìàà`½^ÿçþç¿ÿû¿ã}Y©ãmÛ>}úøÑ£óÃÃÂsA¥HêH^îÙl†ôï”Òýý=^ xý777ºõXÛõz … Dé ,Ø® x_¹y;ƒAP5áÏßþéw¿ûÝ›7o®oo–Ëå×ÿóWMÓ|õ÷wptø»ßý|{yyyppð‹_üâ·¿ýíÑÑÑÝÝ]Ó4›~-œ}å„Ç5'nHÄèJiXoÖØ)L¼&¦äv“À\p¥÷ÕfÓ—£.ÃsÎr¢À‡ø]-®‡\¥ª ޏªf^,îºnÍ,u–Ëåry? ƒHB†A¢~Ó¯ïV·?\ÞNý}}Ïž˜B aè|ˆªcLƒ#I) ì‚ó5;`:;ñŽœ›W!ól6;ªj¿ÚÔ,Míf}Niv©6<ÍCŒ›4\w›Í¦ëú|tx"¾ùî‡o6ŽWœ6qlúYU¥ü:ÄjÃ"5·‡µ«ÛzÒÔ“Û»ëÕj5䔊®eèºÈ’¹Íyã$/†>Ífó¶ýÿY{³KŽãl8"2«ÎÚû:3=3%Ф(S¦ ™¾1lÁ¯À®¾þ¥†}#À° ÚMI LqŸál½wŸ½ª2#Þ‹¨Œ“§{H[¯]ƒ3ݧϩʌŒå‰'"ºÎÞû²ìVÕ¼ª¦Õœ;NôÐ`$çH"@Å¢ÕƒE·)¸ ¸íôi®·Í×T‡&obdŽ Ž3ƨ5¥:$uÖõVM㜇z®-é¨Àž$À³>\*À ø¹Dð Ý~W'È`["®¯íÜøàäÅñãÇŸ~ñÅ‹/F£”e`.Jíú7«ªÚ9BfŽNÝÁ"k¨éœ«B5[TÌì]›8s&DçѹÉlÐÎÊ-ª²œ–e·ÛéWU3ŸW———çÇ_<éíïÝ=::ÚØØHt¿Ô›:ÚOp±˜E1è¯%ÍÓÎh*Ð¥¡Ë ÐîþÝ^QÆ(Þ;Dèh3²ˆn9ynR “ã¢Ð1V\×±~¸Žï4¾Aïƒ5DšL'UUu»ýÖGDDt ½‡)ö¦]Œ–Ô¿êøNkÝ‘µNÌe<"XÎúŬív "@'A9@AÎQ¨ëÁ`Ðíú;ÝöOÚPÀH¿É}¾ÙRgŠ>÷̵äT©i䈨n”s®NÌ骂˜L{°Œ2¤‰¡*ÐEQ”¾°5ïf… @ICjìmVd›§ÓiLm­B*µV>˜a)2jؤàmH-{Ь'{Y–6ÂORæF2€ËNf«ney•žnç9S+Q‚•ë^è³hÙ3+Æ>™L4dg ñ‹4ÿ®×ëÝ»wO›8^^^^\\\]]é–mo¶€³áù y^ &ÄÏ9æKòsŽOäÞ'^˜¤Ž¤y„¤¨±ÅðHâ§-“œs‹ÅâÅ‹ï¿ÿþ| I¿ø‹¿xñâÅßýÝßmooÿá8==}ôèÑt:‡¯¾úê7¿ùͽ½=uüœPSª”ëLÜ‹Ú5ÆŒ¼­ÝÂÿmMÚg7Óÿö‡=ƒà,òÞ“_Šúê¾³fîu5-b½Q›¦Y,"`å öMü¥Ã’³ Ý ©¿©àÜ™° t>O‚C „TÆ_ëf1æÁdIGµ ¦ ±­=hJûLÕ¡eécjÚ4M¿ß€^¯WÍ©ëz6«",\»ëÿé8  4CÒ ìJ–ÑA›m„°[ €ëø~YLk~2ºšL& ¨Ó˜Z 6"h\!ˆB6w„íhB AjšF#WÔ–!Ð園ˆî†Hpš ÖVÊ¢`ò¤Ë+"~E~r3ƒˆ/Ÿ`s®ÊõÌËu7i$R¿°1;¹³ãL«d&ʼ·#ym”íK_lllݽ{ÿþýÓÓÓ''Ÿþù“§¯¯¯'“‘ˆ ªas¶Ëæà""¸Ô¨WkñeåÊET °´tcÝ,ˆÀÑXGq ‡ÃƒƒƒÝÝ]eÕEg±XŒÇcï[5«òÌì¼ë“ê ïLù/× 3Ïà¿yÝ6Û¹ù°uV)’”B½e}…yåCÌ®E‰¹:²¿|3Ñ + ;oßaÒímJ~苈öã7a¯"RïV—ÊÍ\½³•#`Nt\Ӟ̬*¯í±¸Mo­âVû'+…hJ°HCÔíPJã©_¦2aÊÝ¥á †JAf½÷4÷Ó¥œ,N âs,©ecÛw­(Š¢èu{£Ñȧ·vðbÊù·fWRS¶ý°j’)‘Ñ|6Ì¥*= ËŒÁ¤L+5À äsû @Ä¢(677www×××›¦9>>~öìÙÅÅÅt:U¯E+ôµ´ MglI‹Ãë»4ŒYÑ ó] s!M·š·dž–A¸”rrf°9%¿ëº¾¸¸¸¾¾>==ýàƒ¾øâ fÞÛÛ{ðàA¿ß÷Ýwö³Ÿýþ÷¿ñâÅ“'OŠ¢xõÕW_{íµû÷ïw:›Z£ÞŒ!ˆˆ‚"öu¦-©wnBe;«^¦Î4€Å¬º¡à\Êšë;™Y›˜¶‡‹–yA…[š4CZ °"ùIw»]ßÌÌÕ±®…|â÷~™ÂZùÛr¥è‰ ¤æØ„À!R”£ãš‚#D‰,¨ý Æ(®‰ »¢Ïu}}y>›Mœs…ï,â,@\ê#$@ö’|wc‰ªªrɼÅ¡áX$&*‘åŒ3W›©ŠãÑ—j€ ÀeÎc “Ò|nh^ºÅÕ€¬€8Wñzv´ÕL̸<1F̪óÅÏ•õùqz|ò­Vä50Ð$ýÞÞÞáþþÉɃçÏŸöÙ'ÇÇdzù46+<¬R{ô4…4¤áö#ÛeÏ•i®t582" BôÞO§Ó/^‡ëª ê¯·Š W*àmÙ}Ûã}E2ñ+ëz¿RžWÁ^C:n†º¬”‰„ˆ0Ó?×µb`ðz4W VåÇ^c V~Ê‹SÊ·«!KÜ×v‡™}~s’ñîr÷û)»í—,D¶Lˆ)©™SÄp©ß,Õ’U¯ª\;kÃĉôo ËZÙwÙ=cª /R§r…ÛjFô—¼ÑÁ­”œ˜W.Ù›í $ÍêÛó•ÉߟÿáKά,fmýÕ¾B¢«K®÷¦Ý­›R]¦a_ž} ûöz½ªª®®®l~T‘†—)ø¬Ü+­¢¶§Ó»±\n•SjK—/c.v&!†BcFÖXž‡$úŠŸ‹ˆæÛ*ÕŽÕ—]˜ù:˜`&Œ¥Ža›&q‚ ´ãÌÀ“ëyÉU‹…t›¦©C í5©/D@!0ÉoQÈ=1 3›'"†âƨ‡šÕ¦¬K¦=Ù{‡ŽA ° æli+ö'DÈùšØkÊðÃ|%ó2ñ|Çcªz·ˆJßP¤Â‡Ò¶½uå ]R öÒGDãIX’¸ßïß¹sg÷•W^9<Üÿä“O¾xòøäää&o_ÍeY ´û~CéßX½ŸD!è¦q¾ Dn»B„3NOOO××7ïÞ½»±±áÜr~I¡(…R7T„~óÿ#«ø¿q™’Ì-EÞHŠ3¨ˆËõ’­FI%8l5H¢7µù7zïìó%‰Ó)õ kO¢@ÌZǘ ð7L,q ¹a\í»íýù@V4fÖ‹™–1¦TM‰%ö3Í«&YÍžrVMAû42Œ³¢.Ë£ßâ7Û§Ú'r#ª!‘¥Š-7³g^­éb b|VÒ§ÿ.ªEY–7"-J­+s[k ˜E“ÉÆ©ê)õàÔ`«išÀE½ú¯»ãñx41³®˜FÐêv»ÝîæææÖö¶¢š—gç:Ãq6›1³†þ9`-Òâ-:dÆÕݺŠÔY ³8À–×¶/7Ò^ØÂJ¹Ÿœœ†¬"9JÌ5Âíë¥Ú€0 D‰s óØ,84À!Š ¶(¤´­Ð ”ì`RÕ'§gW—£ét>›ÍšzQKlB#!"2:ïÈAY¤£ÚÒÈźÑý­¨'£ŠËáóªã(9@ :JÒ¢_–!æØ;$ç<:;­1•0‰›Â·æ,aŠ˜zÀ®é IDAToè=ý¡åP ËÐÁª‘ι9?¹„·Ü¸˜ÚÖ61èiRkH3Ë{n#µ'·¹¾ñÚ7¾±³½}ÿèÞóçÏ?ôD‰óÔ*D?™Šôu/«Ü±È$AÐÊÍn\@" ,UŸØ)˜Ïççççýþp:îíí ÃÝÝÝ­Í^.í9 (‰Tð'Ç»·¯Ÿ“«#ÎÒæx™2Áä@§Ç_¦üò¥ÐÉ@+8êy«¦Ë2Á:É×ncù9¤•×mò[I}zXBå¹øÛ†VÿRg/Ó•z™©¿±‘V   I÷¡kS2¦A`UÜõ”b6ØN’ã/iž9©N—”Ð5 Y9©}¾Zˆ©ï±*#%ÚÜ_Å“†gúR——²›v°ót`ŒQù½1FK9Û¿”ðåfX²Ë–4óÑZ󣞈ÌçsMëÖu}=¾Ò«í¯§Ó©žÛñx¬6Œ™Ë²Tz¶ˆt}…ÙƒÁÖööp}™g³ÙÙÙÙÕÕ•b×1Ƶµµ~¿ocDµN‘ÀbªD2Ï1¦>”¼o]›ÆhÏnkR‡#Ÿ&æš!ŸL&šDÐ_- mÔ÷Ûßþöã?~ôèÑÕÕ|øp}cÈY‹YUªÞû*hªn)¨™Ýø“¯[ƒY(h»))0ãì²·io1óÒ–»¯ÛÕüc}ÝÛ5ý¡} –}š h‰7Xº& ¢#E<ƒŽ®ðÎ9 Bò. w“ûoZ&I)÷P„]Q´a„+Z‹k=Ê€<¹:´%Â…óݲÿŠn™'èv»eYª6×Lçd2ÑuµöÛ³³33ÏDê¦p¾©›²,ûÝ^á|§(=¹µµ5f¾¸¸X,ÚmU5 Dîõz½N·,˃½ýý½}-(ÒÖ’’ê¬Ì¨hLÖëõÌ„ëm{ïN'¢Éd2 ±ic/"EjY+R£Ô‚|á¬[B®2tS{ƒît:M®b½ººÊû[ékÿ,Õ1 ˆØétöööt8„¶3CD!Þét¦ãÉÙÉÉåååùéYSÕ£«k`Ù\ßX®íìì ‡Ãáp½×ôûÃn·+m±5Mdh§µ¶½JšÐ0D"R@ùÆëë놊[ÏSOÊŸTÍ‚ ‰1êÌ"JÝ64üýøãó›ßTÍ¢®kuðßzë­üà;;;¿ÿýï//¯?~r}=¾{xoÿÏ¿ýçG‡G³é DDuGtïTˬ­­©_ìKÕ °–ÿ"zj‡4´Ö—AJß!XÚ ÑD†& ~ñâÅÉùÉx1š…‰/€qD„06A $t.2"ô„ŘYY-J&ˆÉ—Ýy9G˜ðdÒ4 Im|;އ97Rô€ "òÅ  ’£º^4M…ŽÊ²ìQìzéb—\„Të Šï–N„™{®¯gP1@NÄ‘˜œÝü܉ƒHËÙ•6s©.Ii¥•À(1Ô¡Š];fÀ’b­µc(K_E§×ëöû~Ç•½ªJ_EžMÆj%ÙŒn4 kk›p1®ØÕÔYcöóY࢑Ehó— Û™Æè‡ë{ƒ½­;G»ÏŸ?}òüââbº¸]]7óEÇyfO§uÓõ»C•Þù|^Uµ… …s$ ±!¢Òƒ¸–*±>ì#Jl*u½˜©Žª3"òÄ…“)סžÖ‹ñ|vñôÉÇ÷ïß?88¸ÿþÎÎNáH¸€&BýæšÃMEu͋ŬèøÐÔÝ¢ohŸY8Dˆ€Ì jP*ÈÄ€!ÔNAG£ ˆ«ë8š#±ïM¬/¯«E=÷En®F—¶¹¹T:$‘Úªô¤~5æÉ£‹¢Sl®¯Aèª2W`¦~[UeÑâ°ÓéŽQ$p]×*ŠNéœÓÔƒP zòˆ€E„€ü ò‹ÝݱÅò7®Îæ ¼Îò+tûòÎL»Aª£µÆFk75žÓpJcY3i˜Òu¹áT·K™iîm4]__Çc]n—Ò{ÝnWK‰Ú„¥ka%L ËéZÈb6X2d³=„pyyi.’ÕJå¤v¬ùÂâ* 6CK‰T_k૦·É.û­ÙU^·˜5–¥TH­k«ÍnR[.VláóØ·ué%ilɨUúišqî÷ûНªnÅ”yU3¦˜›1ÕÕ° ÿ'“ɧŸ~úŸÿùŸ?~~üìè興ÿò/ÿòàààÑ£G§§§¿þõÌçóÃÃû‡wvww···u[™–ä|N\HÓ–LDí¶CÖiV œæüJƱ7ØÑ0o×¥ù•&Øp5ºT!ÔéRZ奭 ˆH%S;+<“7wSüÃ|Mn©M¬ªŠ¼TU¬A|¾IË—!Èc–¨.HY$´ÜãcÂQDâ("1 #ršÏ+®<™LªÙ¼Ža>Ÿ“€ ˆhh·vOžúÊE‰K¡¶V/©æscK˜ €+[ŒÄV¾ ËÄ,is[©F1ß&fVB·¾XñtW™SùkIÏ$«Ñ¯Rå“ -ÿ›_ô¥ +¥Ù“ Ó$9‚Ù[Ï=¤Ýn·-ØÊôpÊmµâÚíö¶··;eowg¿ªªã³§Ïž<}þÅ“Åd*"Ýn·’R}"Zk^½ínH@ËÄí D/)ñ¤‡ºà ÈéôÒÅb±³³£`a€ªâjÞPÄ¢({½y\4 ‰ŒÊ“vÑ[ÃÑYéÀøÿ|…¬Sw¾­ÛddH€)(βŪG4¦6jÕb åš CD!–¶:2¼Œ(ÚŒÅì™þHoÈ(Äœz3Y@œëÜ%ë—œlSv€ˆ¨îƒOC„Ñ%„Ð¥_Èð= =•t}y¥ºIÓc&%y‹Ã=ÔœØ`jµ:DÔétŠÒ«•Òj×~¿¯–²¦¦²È"bÜT½4+`f³Îþ•ÃcÌmmó9€eYÎf3S.¶+ù¥2­‘ååå¥N;ÖÌ7§bk]7t×××Ãìv»ÛÛÛƒÁÀ¥!½ ¯®®Æã±!sn´êWK~-j¼q?˜LŽ$HÐÖVLEh8ZÛËÅb ÙÓt€¤¤†n© ƒæ¶=zôþûïÿáøì³Ï¹×ë}ó›ß|ë­·Þyç‹‹‹Ÿÿüçüñ³g/ŽŽŽîÝ»w÷ðÎþþþöö¶æ\çÍ\n™R•FÓûMjîYc/•yýs„Í ë"¸¬28×Ô–ñ¢4ŸÃN~‘õ!7yhšæúúº,K%ÁÅ{½^î`ÅlüƒÞ¿/ÚîB!„BÓ4‚âÊË}ɘ·ð²ÚD$å9«{4«Óz1 Õ{Î ±03ÄÈ‹ÅÕÕÕùùùB;½„ !’óú•ù‡ ¢_ÍÔ¤5H,²d}Íw "‡"ß/In“ŠŠKÕb”fÞµˆfV¤àš†ˆj"ª› 1¶”\í‘ÿ ™­µ%¼¡(s1°23@Fçø3¯2¼nlGäˆ"(¢©J‚ö4{=€D¤ê_Òý ®wÍSÕQY–ÛÛÛˆ¸³¿ñàèþñýgO>ôôéÓëñ˜ÈEáÉM§Suû\*ÓðÞ{Zº’¦üiµ}¾ˆ¨±§d(±£®ëÉdrrrrpp`¥ÃÛ›;e—ê61 :tàJêùWûÚò"¬2ÿ‡WHóéo˜=¤›´’ò ¹‹£Št0 ú={RûÀªªb˜BÊgÙçˆ+ž9ĈIÍöKèˆèM"V‚`—uâÆŒõg²å²bD¤dD!‹6%ñã³RÉfpÚi1¨Ö>Gõ²j4m7¡¬?NƒÙ%VcÖäÁâ02-{dÌ,sÆ­E€VÁ½äÒÌ«-[k] «9¤Ñh¤ï ©iŽdMÿÍvêCÅl¾·}­Ï«÷oOR›7{“`£œ´œWoOqJyG5oº,Î9ƒ‚5&S(Þ¨IYr®}:³œ•öºÔbÅf0h–Z¥¤,©ƒÊ]â*Câîé|˜>øàƒ>ÐÔïŸ}çÛGGGÿðÿðíoûÅ‹?þñýë_?yòdÿðîÝ»<ØÝÞ9<<ÜÚh›BSÓòøì~`ÕSªUÐû/\ IÅS"ÏÛ-a6{J%?fc°õm†ÁY ¨œ,m$TÅ|>¿ººzñâÅýû÷mT—ºPš÷5ϤE¿KÆ~Þ¦¥!a¤¦k2šhþ¯‰.!:@àu5žNϦ£ÓÑUQ¸^Ỏ $ˆ‚uŒuÕŒ§“óós-gÍ%±ø‚b 0¨!y§ånvÀMšüEËÖ{ÓöéˆHÐ7çÞ4LD¶J0ï½GrK߯¾­O/S„Édû¼zK±ÝAs(ÿË oy0r«ŽÒåïùªÏ§.‘W]ÍQP²BVúNõ_ËNò$VÁÅ~¿W× ³4ÂB£ð766öw÷Þ;::¼óé§Ÿ>}þ|4/ m®?Ü>J‡ëܾg|ŒÉëŸ(GÿHA»‹‹‹/^ìïïß½{wgg¾†Ýân·[Š/C#u½*аýXÐ*Âÿš þê°÷äæÏrY–Ú—É’g½BJ3R³¢lý4!°ÔºÒy, g:!·&+ó;Ëõg;ɹ•RwÓÎfHfït©TÃ|Ê=}ÏR¹¤Q ŠIÙ¿ºå9åXÁ ¤LÏšé5JR[ÿ[w®[+ü:ûyþ~ûmŒQ­>­Ò¬0C¢Œß$)ˆ±#dN“a8¹Ö÷h*²¢@J£&r뫌å¢(Ö×××ÖÖ_Òð·Íu%ˆ5gǨÐè('Hðµ…n­æà -w-·=¹Ôêcj‡Kc˜KâD(ÉSç!æ+c_qvvöá‡~òÉ'þ^]]­­­}ãßxûí·>|xvvö“Ÿüäç?ÿùÉÉ ‡Ã‡¾ùæ›[›ëëëžœ&›™Ú–{”Ú¡`"Ëä.…ÉpL¬@N@}.ùA½q ôžs™·}̉s®ßïk4°¹¹ £Ñèôôt{{ûÎ;;;;u]ïììh@£>JH͹ô'F]4§G7È· ÛŠõEÔ §‚Zɱ!EŒÄUU]NFÏÎNzýþ¢©×zýÍ~­ÓéG„ºáÉ´²^iãÉXå›C`ç@k~M¼‹N[Ñ—ënÉF¸D•/Ë2n£4œqJUðl|j´dÿEBì¤=JêÃQv—B›Ž8"v «:X½n›Ò;{óß[ä/øJÕO¤¹@pÎAz^0H@³3ê 4MƒÙ¸L½ŒÉ¤¥ÖÇ ªt}zqvÞdýkU£2s™õ³g©E€ä%K68GF¨Í|´ø¾ª*ì´µµuzzþÍo¼~°u°½¾U–¡ˆÌM]u¨ë ¤ú+Z­ úŸ_ùNÙ³4iŽ{¾M˜]ê‚xOu½].ÆN]×ÞSŒ"E"sÐW@6—ZR*DQˆ¢¹V’!1m9…¡!Žý{ñ5¡dæØ´U%y–TÒÐI¡Ò²@H–êÌ $dþ²ú ÚiEÛ>Ž'Y-/&|›™-…‰YÕ“é ´ Þ§LùSsö8¹V¢Ÿ¯U"ªBXÄæ¬i†iäÒ´ƒ„Äl@‡¬^!kõ¥ªÇ¢—.I4Òžšm7» 5ÿ#gƒ‹ˆæ}u³´¥¢®§nœ& ­'‘MÉ’[fzíÁuåÕ—W¬Û§þ£9C‹«eêv»j{.//?üðÃ÷Þ{ïñãÇŸ|òÉéé鯯Æo¼ñî»ï¾ûî»ggg?úÑ>þøc-FÒ¿:jÐ!©sÆÌÝnW!hSUªµ9‰² ”°é¸r$në_»ìWÌœ/…Š¥ê‚†—èή­­Ý¹s§(ŠÙl¶½½­²×ï÷‰¨Ûí8çöööl‰r$0_g“Þ²$IùBˆÙ½ájŒfÒ¥†‰1²×u}q}õù³'óØ_^­÷{»ë››»ß]0OëZ©¹z½÷H,ÒD_ãv¾è”e§£´Y&[[]Öêvêí¬' ýÛ+ÄØÒ¡IÊÒ“Cç‰ÌÛãÖYEtÒŠ™Ø·®-´˜ 03¥tg¹ÉÊò-¿! vØíWÌlH3¦ZY ˆo^¨ššÓíÅÈA„µµ¤J)é¡®ëq…Í`¯g³Yµh’£é3Ä(UUyrÝn¯?쬭­­onnno=xðàäÅñééé‹/®®®F£¼Ì¾æbÿÒßbˆH&iD›¥Wtƒ´Úâòòz:žm ¶÷ïÜ¿{°>è{® D!Š BaøßêØa‡ô¦Q—%‚ucëiµ÷‹:@ƒ²£Ã9WäêÌv˜H芴 :A…<‘™¹iØ dò¥ö,ÚYŃJBk!ãXë9É=¶¹¡r© Éœ#fF¥k“ •aÆF¥¤‡”†WkÆNI°¹ 1•dk§ncªa À˲cÊ0gý+³afÿÕÂäÛ¤ tØË’AîÔØÀd21G)'Hk¹§ºª¶n+wÓþ¦&r×eÑ/²û”TB ìÕSjýªòÖf{(u´V÷ÅøÉº¶j§N1Ê4d“1QD$†h>‡97þcŠoœs·Yí“ ¨e@õo5Å¥»¦4ï>øàøÃ|ðùçŸF£;wî¼óÎ;ßýîw¿÷½ï…~ùË_þò—¿lš¦×ë¾ñÆù—yçÎPf€Dv©íh[*㜺’ 4TÆCNB±„·mŠþÅUfMAÁhŸÕ€ªÜªqR"3 2"’)Õ"õ\'Úææ¦4÷êì¨23þ‰AsŒ\3ˆCBŒÌ!ÆŠ% w´xÝ4ªpÀÖÝÏ)B"Òë„gMÓE‰Úqu=é–—ønD´µµµ»»{t÷ÞÕÕÕ³gÏ?~üüùs+k õRïåÎß 5hë`™Gx bŒÊ³,Æ8W¡ŽÄnsøù“ûÏîÝ»sôà^ØðàûEàɑއø§®çW\ö\’EºtʪƒYëSÉš6N±íXŒ,PV…¹‰Ü " ³´„ç\¨jpŽ3 r&äˆ{v3"â Öu·›nÒ „\õè&a"X`ÎÌÆk5Ž’´Ue7q\š¢l(„`s(ì=êOi¬rSâyÖ’âBŸ0QSµ†'gBå_±Œ}™õþM óGV¥in pXm*bð`0Tͬë`ø¡­»]7¶V]6J)Iµ”Fív©áªZ85ÀÝnWßfõãJ&7`ÓÉúŠ©•ÒWï¤iVæÛj4¡1ßK÷Ëv3˜DïV?M«Š5Þ5¯NsÃ*rÊ7yþüù‡~ø“Ÿüd:ž=zô¨Óé¼ûî»?øÁ^ýõõõõýèG¿øÅ/Ô”öûý7ß|óÛßþöÁÁAŒñüü\"d7À/¥Ôºjd}mk®ëL«)€˜õÙ·M±6 ŠÚúè M}A²1MçÔãÐm:ƒÁ`ssÓ{¯ºIy…ÃáˆÔ1ít:ãñRïë&k³Ss;Ví4 ÕuÍ ìôöþ…Y'îŠDŽ7Îo+Þ(úŽ£Hˆ±âfº˜wæu—üU¯‘·×¶·Övœ8Fªãr^™Dr¨À©’´’.éÛð˜-%Òæ³c3§UúUûàM°ç*Òn¢öií°XðQ§¹œÚÚ´æ WO\"µà—ä8oDN¦ó‡ÌJYó¿\­¿ô“Óçæ HÊ…‰,9Hh kXù`0qa°¼dµŠúTUUÑ{ß4É?&žÍf’_[ïõzDë±µ···¾¾¾½½½··÷ìÙ³³³³ñx<i|ÖØSä³ZxYš’S*=ÖE@oïòòòzúè‹/¾ÇšÆòÞ+Y’¨%X€ä†eé?[Wx;‘kŒXW0›V‘‹ªž5óY3ïöʧ§ÇÇ'§wOŽŽŽ¾öÊ+š‹¡È,8ãÄ&–eÇ…ÀQÄ·ÚXBÃÖKDæíÛŒ¤K™iŽ1êxd*4I¢’ +ÕA¶e?ÜvMiØ mø:ÉDˆ€œs¾p°ÜYÈ²ìˆØö¬à x‘ÔŸ(W²vf4s[çÖ¡âTﯢQH^Æ£J\oÔ÷Úƒ¡î•¥Q ò†÷jmQgSí”Ïb£ãµw3+ø¬b2§ÐŸ!µúJ¨VY_[[³gÌOeåC’RŠIÚê;ë3[¤Èe¡±Û-6ÛÑÊUßžœ}êßvM¤cBl^Ž­€¾ß¥~‡vçœfÚ멘L&Ö [-1*wÚD‡™«4¡ÙÔ g< KŸß#f0ŧkËÌeYŽÇmE¦„…¾_K–‹¢øãÿøñÇë>þË¿üKŒñÍ7ß|çwÞyç×_ý“O>ùÙÏ~ö‹_üb<=xð`}}ýõ×_ßÛÛì5knŸ0•ýØâ«·'iÜ¡¹ö˜áHK͉ˆˆšÔ†%&2¬r.´Ð\/5!*cˆ¨ÐôõõµòÒµAŠ:=yâßÜãùëöAÖÚÐ%c·ÛíõœŸ-að/»rÎ_sN¤A @`çP‰"æØ4´˜'“Édº6óÎŽƒµáfµy~yBpˆ±®ëA¯cÎߪ~ùeBeR¤ÿõ©ÅQ¨MW+›lBÁ…BÞDÏ9§'“`ÉçàT" 5Õæ2J†=Þ>é­MvôFøëÒÔ£ÜÖbB­ÌÆ/?ŸVíq&]¡ Þ•u]_^^γõá (Š(Ëù1ï!„:´z 2²‹÷>Jp©DRt^UUˆÜÒ*`[Ä43¤¹® ÿz¤½½ƒ½½ƒ?þøääd>Ÿ___ŸŸŸ+”E:-ZBC°œm` hÊŽ¹¡Dè M˜Ï|ŒeJ®«X Ç‘êŠÏN¯?~öôéñÑÑÑþîÞæææÚzŸ°ˆ±‰1zÉQAT„¨69.iI¦mOíJ™ !´ÅN-!uto`d-Ücâå¨[ÃMÕ¹#KiÜ\LSÚnY±AaçÐyïÉ!ADB-Á‘¥õlïÓVPF²òG{§ ‹ÆB²Uh 3”zëfJÕT·-ÂÓ¥…%VíÃCÖ1ÊÖ‹‹ !¬íbOëollhK µ¯Þ{-UŠ©±3)½È °å;ítéoUÍ™n…ŒéÊ);h{`©& ³øÉ.JµCÊ îõz ˜—eW‚¥(«þU_¾‰µI¤”†FxùZQº ƒ1,G«ùW­ÊÕ½‡j#uß5÷£R¥Â>³T9^”eìD€ŒCà½×± H¨<¨[m¹Ï^¯w~~^UU·Ûýíoûþûïw»Ýï~÷»o¿ýöŸýÙŸŒF£_ýêW¿ûÝïbŒo¿ýöÑÑÑÝ»w÷öö¶··g³Ùåå¥êsMŒ­­Ïeg2¹FWÖæ†Éõ¤bÇ\õsÖo<§¹DºteYnll”e©+¯ÝTTÚõ Õœ2 Ün>¤º£üël¯5©¡v{To+øt¹”ÛÎåòÎ#DdÁè‘s˜@›Å|>6ÖÖ•ößëõ†ëk> ´ðDP;Èfü¾Ì [Î2G_ÏŽŠ– -%Ĩiš—¶!E$@K˜Ê¶˜`YÇbG* Î¦ÃæQ ¬‚(f€ó£dúAoÌl­ ŒZjÌšHëmPª€UÖj‘s]×£ÑH –åVYuhí"%J#„Šë«4¦¨ZM‘HìtŠ^¯£õýí´7ɘ³,¦ÇVŠ©, ‹u³±±±¶¶vpppuuuvvöÑG©ôª.ÒžEêh†4`0¯—²DXe´kÂ"±cîÇ£ X¸~âb4>;»xþâäî£'¯¾úê+¯¼²³½¾·µ9èt;BĦ \tKn¡"­‰o’Û’f«½º³íkçÑ9§:ZD– ï¬U{²ÜÁ9Îç’i*JÛp^ͦʉZž„žÔ(ˆCO„Ñ%ÇÑ."ôœ±ó~« $åkKlïl êY´¤*N“ûʲŒ‰UkÕŸ(›Œ«=•(AʪÂTÇYQ¬þy‘¦îèeý¢%qt󓝯U‰¾úÉ>5d0Y1ðÄ2 ´J`±w¶r˜ßfhH­?¢M¤ÈºXècêZ % ÈÏv.Ó¦Úì0¿TàT)K"Ði«5½†ü»”–Æ„Ò+ùVC+Ý/µ¶1uÛ0\?M‚³âCeí†Í¥Óõ‡Ì|rr2ªªúì³Ï~ýë_w:¿û»¿ûÁ~°··ÇÌ}ôÑãÇŸ}ªÝèNNNÔ/ï÷û¡®4´0ë«OM ‘’¤1YMÓ0rˆHÞÉt1­cí‰|éêXŸ_¯EçâøôÉç›÷ï~íÕWvww»Ý²()2(å<¶ޝ¢SØëÌ­þÚ–YYàòd™]Ó²ˆÔäÇ!ÙÙôËRF çF&DÑâ7‚[ŒKÿ½õÇÛTC¦d%á0”: Ý@8ÂjL Æ/Æ%í[}:U+³ÙÌT›©µ”f*”jÉZNlIÕtj6ÔmôY‹A¹Ui±r^GdТ®µªQ½IŸõ²0Ö˜­¦:³šºI2Úïu‰kf.…ia;ùùÙ†UkeÙèCVc5L®½R†X±z ¿tCçó¹æÅÍ“ÐÃSÕ§â+% éJšÒÕºL»UE° JU´é H¶V)ú±f¢êº>99¹¸¸xôèQÓ4?üᎎ^ýõ7ß|s2™¼÷Þ{ï½÷^UU F­­­UUõðáCå%)¡ZWUiíºÔ¦§ÌúêfÑ*¥%O¯äš—Váóîiu¸7$3ož‡ çl6S¨Saõˆg³™ÎÏÐÁÕ˜:àS6lØžòl%Úv9Zc SXˆ_a‡s5”¿n7Å+jèPH„=ƒ€HªÅb2™¬ÍfäÑVäUU¡ö²ì–Êc(Ï%æšî¿¼Ÿ\«¨8éƒ+9[ïV—Bƒ¥5â:jÓ:""XVJ\ÉÚš-¬¥ÝÜeV2‹×oßRÌÀç˜1N S¾v^Æ£Ößßþ  !ª¶Ñƒ©ì¼&ƪªEÄLh(T\RÃBˆ!„¨¬¤\[[ÛÙÙÙÙÙzö¬örMµr“i"…… ¦ºuޝ|õ ¼÷ÃáðîÝ»_ÿúן={öèÑ£çÏŸÇã#ØçäKS× ³Ê*Û€€HÔ†h1 £@ƒT±ªD„¹®•V•\“ññÓ'Ï¿x|zzúàÁƒƒƒƒÍ-rÐív;ÚsÔp;Ú/qn€@)"BD… %Csy@D¢e*Óψȡ­ á”Ë¿"ܪESÍêG*mßåU9j ÐPSZå‰ä;zûÒ%ÜBZè©æe7WÈø,eYzª\*A6͈©äÉŒŸÞ[J/ °ôìå–8¦¢É|9 ¯¶âT—ªÌr‘*J0Ú[Lõ»ú¥!«"eæPR8Õš+¸IžÌ«ùÙeùvûíOr¡¹!@’Yh^eµX·Eº$ìª3aïÔRÊ•fLûÛ·Û›—û›,±fRÍ÷zSm’:@©¨3§ Úétzrr‚ˆ=úðÃ>|ø÷ÿ÷ûûûûûû½^ï³Ï>û§ú§Çoll¼ýöÛÛÛÛÝn÷Þ½{GGGPj+M!7iJ6%ÜîR×-Ni?»ÿ<½q)Ëjç:4—]a{ƒ.ˆ²ÔE3¹mšf2™\__+a·JÛŸRo HÎÁ]RKEŸº¶á*É3Ù`ø²+×&ùë:Ft 5ËCN@‹}b”¡šÍ³ùb±(;fЖFêg0sÛÜ?ÝØKí«ï'i—¼fVz ´vÈåûÒŠ£sdL:ô-Ø9פþtv¾ôL•R–v¸åØMЬœ_3Àö«üôˆÀªz„[Ö=ö£h¾¶×´,ªØf¬ /´]óÐ4„vôjUUµs1Æ ¶··×ÖÖzIDÕ}ayÉ·#óब7Kh¸×ëa‰z`È‘c„ªª6Ö·67¶w¶÷Žî=899ùä“O>ÿüó«Ô°Ó¥¢¨Õƶ°fbU“+œ#f`€Îáhtíu:`™Õóª^”eé<]^÷‹ŽŒÕ¢®ë³³‹ýýý½ÃƒÃ;;;;;ÎfQ8"jš+Þ²‡«ü[{iB{Ѥ¦â¦ðõÏ´yÌ1DSXV¦>(ˆÂê~1 3‚À²ÙÀê)@Og‹©k"* Ùív7Î0[C ! Z¸A©! CE4,hO{]›nâŒÃ­·ÞÄZK¶‹ŽgæN¯,:~{sK×îùÓgÙ!1`·ì4MÓéÚÀÚ…ó©[v9J˜ÌÆûç#•¤fÛ{¯]‘µM#4MS¸VQK(JK`‡>ÆHà:E³Ê9‡®}p—fiBº,»J€ªjêz¤·ÈbLàÈ;_úÒ;¿6ØôÞC_¸R[Ã÷t©”B” È€$¹gÚfw¼·Z#©óQ×õ¤®«ªº¾¾MÆój1žN˜¹,KíO©u¨:W ÃH‹‰™Y …Õó%@‡ä|Û¶W:-¿‰Ië%Vs+,‘ÛÒ)OŽ _”¾`"rzzª³~QúÿÕ_ýÕ÷¿ÿý¯}íkÃáðììì_ÿõ_úÓŸŽ®Æßzã­;wî0³§âo¾yçΦif“y¿;X¬saÍ¡óBÊ•œSé;Ë26ô7|‡D$1Fï2(¸Xöw”ppÖî jÚGSmƒ[EDŠéœiÍ•‡Cïýþþ¾U¼¼¼<>>V‹Ò-{kƒõµÍnÙ+\Y¸ÒµÍA‘ ý^•[5çJOÓU%[–åõlÔo½¹®–Ob{vj™kJ¤«&öj7îP¬„_n ‡…#òˆ€"  X!!4D„D‹ñåü²Û…H…/© ‹ëÙä<Æ8 ÖÖ¾Œ…cóªYêâ¼ 0Su‘ã|€uöIÅÚ,SGñ³³3f(Ër±XÌç1Æ0«e,cUÇ¢(Ë’³¡ït]é\§ÛmœkËб UˆuÝÝn—%DnÔלj©4D@QžuƤ¦¥„Dˆ°ty,-…Ü„ª @·¿g¢ imjh8„€¾œÇ!Ö±©'±éõ;åÚZUa¿ï,m§Ü7e½䯳©4Õ S"ôà¼Cˆ±š(³ÑÕ|Ð+ †Ý’8\__ƒD×é;,B,šÐ`mö Øw˜Q™Éù²,K ©R\äœCm'«*”E±¶¹Ù 6wvö¿ùæ›ÇÏžÿþ÷¿?>>îv»Ì<™LB„žÐyW""Ç%“Žc$ty'ȱÐ8ï)RŒ<-®çÔGç\äØˆÄZBÅEŒ•Ÿ«?1ñU3v}Z>úh{kó{ßûÞõ|Ž@eYƒAáêêJHj "€„¡`p®‘ P€'ÖŸ‘¹iŠTRÑÁ8¥xK—¨St˜9p(¨€‘À¡s¡GÈ;täÊdt‹N+€PC€Ðõ_ A`Á¡ïxlY×@­µnÁk Èì5eY4;½˜E÷•èÄ›ºVâ¢+œø¨ÃáPD” ”»ùfÔCÖÛÙlŠ6©­¨:ÅÅj/F»±ÖiMž«Þ^‘u4z! ‡CLr4€†¶´·­|5O¿õ3hÙËRо(ŠëË‘šyó!±p9¾’áu][!2¤j>Ÿ»b æÀƒ=ˆ~‹i±üf xošf4i Áõõõh4ÒJÙÂÖÆ¦Æ j_!áˈßyïKßNöÈ!tL­¾Øè0f½"(À ÁŸ±ÖëP-‹óóóÓÓÓ««+}„Á`ð×ý×<ØÙÙyñâŇ~øÑGœœÄÿöoÿV;${ïu¸wQÓéÔGV×ÛpnŽŸ›kŒö ["o«²mØ>¼€ÂeÔYýp"ÒŠ#«P·pZbÔ4–ÇcDìt:›ë[>+ÓKƒW3ÿ’•·A6uÃÒ+ŠÓb"aéo£Ú·ÿñ© ¨ C FëźeG!Ì‚ï\ä®ýWðÂ^zåaf¹ ˆmý!µŒæ §1,AÏ5¤D•½Á"K°ÂfN57Z~݈nC”HäoËž…r dfõx8Ûh眖äšDןW!1»±£J ®§îô·ŸÛ)/ù•ݰ.Î0N”ëoÕï÷7×Ö×ÖÖŽOOOŸZ,ý~ssS' ‡ÃÇÿó?ÿóÇ|zzê½ÿÚ×¾öçþçÛ[Û£‡Cµm š˜qF¿7•m»œ;…·¯œ{C—ÁJÙ£yôùgÚÏçs¥pë骪cØßßït:کθWeš_flá¥ã‚lŸÏ©lÆœQã©Zö¤5À þõÞ7ˆü¿g€@7 K±MÕÔ ôKufG†2Ü‹ÿD…eÇÇŽª$ïJm¤™"ȆBB–××ßšI£Ôµ¦5Z¸$p™)ÕKÒ L¾5æ Q—dOã²iè‰óË °Èmˆ( yY¹þ¡÷^ç0·é†ô­©b6ýÉ`¨Ï=tABÖNÿ†?ÑÞXfKnN—íu^¥KªÅœ[ëûûû××ן}ö™¸Çc-v·ç2»¥±Šd ´M‡zibÃ[IE¦žr¸Tm°÷>4µò…÷÷{½ÁÎÎÎp8ŒU½C*`p1FçØgCwœ‘fņ¹aFÎÏŽd0ØŠü ðrù¿} \wª9dJÏlˆÉÎÚ¡qÎãôÁîù ¥“Ú;嬲ªtVW¥Öšœó!TU5ŽNÎN›ÍöêêêÂÂÂâÂ<ؤdXr(ŠTƒHšª´ÎgÓqa Cºj¼ò¯×ÿðJ 0Q=Œ—èØDš™4Éw’ž¨+g,õUÄ0£îð'õ&%}<ÖÚ"&Ö q8Ç¢˜¦¾²@麥Ÿ™žçmj°@Âp$"›‰BJ J^–X¸¢š²•eIDË‘‹ðÜ0æ¾äyŽT<<~ÀZ¡)#Ë(ûˆðÓ IDAT°ÎÍÌÌò1iŸÚuÜùd2A¿)bßÁ`p¬.Ä—CÌ,¥Ù-NÐÉHéç#Œ… Tˆ}ôO'S¶Á`c…ƒðkkk¿ó;¿“eÙ`0øôÓOÎÏÏ=z4›Íf¿ß¿}ûö{ï½·¶¶¦µ~ç­w³,Cïœë÷û ³³üþòuÝ~WÀÑå_uÚø]¯=oüzˆ7ܲÑh6vx!hüm·ÛBÔàÏÏÏñW YEzQ„f³ág“±ldRt`•ý[7À±äC>Xë«ÊÅÆÖ¡ìͨ¤D5Aþ `Øë®t+EÂË&â0´”ž“õ[Ó›¶]d“N=¶¸¬md ™Ž&Ä쫘%è@â]‚õÂ$ˆè#<èñK•ÿ*f/~@LóÞ+¥ùEQ(¥šÍæÆÖzžçXºÁ`pttôðáÃgÏž!Ø]ZZòÞcBõk×p´lìÆaa@yeg)*¸× ´JÐû¬¬ù‘ù÷¯*S ±90bcƒºÛQßÇøN0ˆÈ= 뛞¦T8]œ¤­ —>OR;¸dLÕ`´‘R*(­êqÿ ú7¸ê;¤ YVÖ–•œQÌÎkz EžÉÿ Û@QÓq¬B@® ½ˆ>€))ôR4!8|FX¡ûXt¤èX#†jf=&gû>„ Kbž®°†Y×>×]J‰ æ’Éj³ œ.îçtÎïœD^ â$yïÏÏÏ_¼x È5*)®ÜIüWðšÌî¸ ’D*¬„PTƒê?I©•TÈ)EsssÃá-Ïó­­­õõu(ƒƒƒgÏžííía€lUUÆdüu2I‹‘ð•‹Y¡³-†H’ó^J‰yRÊ¢˜6Ú-|Q–Óª,*'µ> .ÎOZ­ÖòòòÆÆº'ŒQìÃqØÀÕÆÊG¯"H Â9€bF·šªôßøâw‡^-6ãÒ4+C"i’K5‹»Z8’ápx|| ø‰‹üûBˆv»}qqq~~Œ° €vpð¥—î^ a®³ÿLá«â°T²¯bÖ ¥Y²L\\bÊÃÙ!ìïŒÇãããã{÷î½xñæ½û?wÎ g~q=ã…—‹?ÿ‹/¾à¯óI&~~~aaaqqqeeåÆ×®][___]]mwZÝnœˆ¸ï“5uº>BÃàÇL§Ó““Ð:òÀAdDºÝn«Õê÷ûŒ ‘“™M;CÛ®Di!Ö¹Ùr°h²“ŽoÄ­Â5ù‡ÕGçò"ggg“Édaa7†~ km¯×ët:€´›sðN²,“¾”MGìr\Ž,KºòWô]*!‚qD±úfíÌBˆïDŸˆŠ¢¸¸¸À"fÈÔUcúý~]‹rn:‚—ƒ¡y)–JÄ–_¬¶Pµ„H¦µz¥†ÍVßeŒÉBÝP§Ôo©ü Y…ôµWîk-(©(bðÊ$yæ¦ðë~oâܧa}ˆ¨@!Êe’sþR»Gʲd‚Ö¼RÊà.§­Èd6 %¸ªŒù£(KJ*)¥—ΓxCyåz£IN²)>ÔCÏR ÆF"$©õºÂSÐA:!½µ>ÏMa<ïíí|»¨å•SPûF³7Ã‹à“”aºò¯~.8 쳈¢ªª½½½ÝÝ݃ƒƒýýý—/_–¥E½æŠ—£Œ‘É“zÙeR÷ä´Pik.Lïò"À9ŽB)uqq1ûý~»Ýî÷ç¤Ê„·²B`8´’Ê;ò@c fËߨú†ÿK¿"-¤ßôe¯Š~àJ;†@„žœœ 7ƒUä]az‘µƒÁ¶ÃÆàd.B‡¨a€¹ŸX¼ݦC$ù“ãþ/Ëta[ ¨r†“ÉäË/····wwwMšÌà„³¥š Œ­T½þꑤ#ýütÞPsìEQ”–xÄ2 U»ÝžN§Èà«»Ý.€WÞûv³Mq4‚R ‹0…’C ½*b6[“^ŒÁ¹b€±¶!Éd !´Ö¥-ðË¢(¸¸.¥:Ÿ†ô~§Ói6›€_ëPÆÑË©”R,.ÀÈÄT¥îv-u³9gáBkjl— ñ_sÐg.ï­q@P ;Á_B{hÖ Io>„ðë‚VÒðúŠÅ&S'WQS7ø´PEñ°0rRj­uSÇ>Vú…9qìXjƒ¥”0Ã|KWô¤âµ)h¾RíÊúÓZëÅezƒ`úá¼µ9¬b­ÇX¹UU¾JŠD¯ÞI)^ýkºéVrÞ1Ä~tvŒ†'62" ;U–%âÝ7nlmmmmmݹsçðððñãÇ;;;?¥È:À'4Äà:D'øÒ‰Ë»Â7ÖëO•ˆ,Ë•RUéP1 ™‚ö+Ëéññq«ÕÚØX#"îjqqÊ23¹Vιˆ ¯ ÜéBÑyþ®ÑŒ»ö& ¬¹&JDÌØ #2ÅžV ÊHk­VŠD˜–“étz1<±ÿJj8J)•R+++!„óóó½½= SBN R%d§=ç*Ûé/!û Y–Ù²ŽG£Éx4OËÂz7šŒøÿlåBÝ=©ŒÎ›,Ëtf2öû}ÉçØ3@™«D®µöø¸vÎÏÏŸ?¾½½ÎO~òD6"fHÒC«"6X$ÄàD¼F2F••%AT·çrÞ‘ “몊îÈÇÃá£áö£íO>ùÄ9×ëõ>øàƒ›7o®­­¹Ýncü€÷^é­ó"äyžiƒ™ƒÁàpÿàåÑñà⢪*©ÕÒÒRAk½²²rýúõ¹¹9¥T«Ñ¤È.Â"²¸µÛí<χÃ!dT‘5r©•§à@¬d¦2©•·Á¨ +¬„n4¬9Ö㪪t¦¤4.Xe¤É´PõøäN§ƒà¾pŒ0NpØÏÎ΄½^¯Ñh0³œû¤BrP6Eü{1 É¡ÙȆ±O¸ÛX] !âˆwO$´–J!.¥”Ðk£ÑiøÓé”1É+++kkkÀiƒbyxï}·ÛEíŸ)Øà9áíEQ{ ìꑜQY¦…Q™«¼º×íwÚÝàh!Ÿ?S®o²Ö¸½×אַ®ÎOld~úôÉ“ÁÙùdR Çc"‘åy1!fL.¥F7îtR8?•¤È×)h)¥-Ò16ÆÓÑxتªN\Ùh4¬sÎUçççív{<¸xñlw~añÎ;hýh·Û62¡ê´»:3Õ¸r¾ ä|p”TJHIBȯ©+ ŒÒ—$´T!ä+“êó%…&L¤z5Qø°NFÄà9ÙËûqr¶^ ð3˜X¬—Emd BvÎŦ1k-ÌzôèÅ‹Î9cŒMFÀ²cN2OÎzg=Q,r Zs* BUe¥ºt|’ $T•õ‡£¬ÄkÃ3ÿíßþí“O>1ƼõÖ[×®]»sçÎÍ›7¯_¿CeŒi6›“ɤÙÌ¡³àx0œ5êA9{‡ÈRJém °â./Ž‹³"à[¤õxÿ—Å×+±EËÒ€4ÅBÃÂÂD ™±–ys¾ÇÛÇbÆÛíf8, ÙÜ%ã.øyYSó"¤Q/?”àçœõúàp•øØªG »uñ/³gËȉ>"éB¡XÔˆ$²8Œ/F—ì²Ü8.ê±eÂã³úªÊ_q®kWsVA-D Ù®w1;µÂ9ÜÕȇþüûÔÖò'ðo°bC@Æ $<è÷Êv£–$#v’ådž™¢KÒ»q¤B !d¤£y”ë/"¡]¼r± N“4”`¶9àKO“KPú.^1¾!<‘÷‚I¢ šúšxœù½ €Ãù !loo?xð@J¹µµµ¹¹ÙívïÞ½ûî»ï®­­aö»Öúââ ½RJŒLïv»˜ø»°°€Ž#"r1‚V±Éäå”¶¸‡+¾|Üýä9K º]Dü:çÐÏ48zd"ëÆµ.é0IWþJ$T/Õl¥?$Ž Í²ø7¬¦iœ%ô@J”»BᣜVÚQ¼à:àY„ Ï iô=›.´ëHó‹Ë{ÏCFYÕfY¦åå°HæÃRJ™\6´odB„ÙW¿jðoKGÔÍ{$IIk} ’øÒ5ç¥sÎ)i_ÓôCº›é–]Ùeþ½ŸûÈ)‹p]Ò’@Ñ€aËØeI}µ+BÅŽÅ\(ô†#wi}¥ !O¤.go§OfóðéÓÑ,R,D^XnB4‚¬*%EðQ¶ñJžJy¹€Á#"ǧûØÍ_ÊFWD4ƒµV«,=Ýé-¥üʰXÚH ÇÍü‚t¥”RdJæ ÓZj­Œ‘Ætô½NwseíÖµk›ëŸñË';»'g§F¶'“¢Ž2%UÈf†¥[,’q)!iÜÐõÜhïl½b¾*Çã±#Ñn·OOO{½R‰+++Y–i¼÷ÁÕ$ØB [ϯht‹!P"²*ýö¡Ì‘LÐ} ‹GêüòÉ€¿ÂÓg©‚Úâm†öI§,4âNC;7›ÍÁ``ãx zR0‹”w¢â(†§‹Èu%#¤ ß‹×Z{||üóŸÿüÅ‹gggÏŸ?ÿÉþQWˆ™LЧÏ‹[ÕZ£Bùþ‡ï-..h3??¿¸¸Øh4¬µýù܈ñx 1Zçìâå@€õ™~ï'?ùÉp8<<<„7PÇÓ¤Ž0erÖÎÎÎóçÏ¥”sss·nÝzþüùÛo¿½±±ÖëõÚí6H¼A‚ˆ¨¿GÜ©"3¶—¼ÿé@F°ºOØ’¯XYÜ¿œeþg÷ <Ï]‰cŒA®U%ó€ÐðD܆ç¶ÄÖRY¤HºÉZ>Õ€¸ØÐR ;(Qެ2X2ÙúR ¸LêpÍ…ˆÂd\ŹRmCìonµZˆkAl2 €ÌÂ+AÜ##Æ—‘…±]åJNâ®ê¡¡ìˆv‡'‘Y'Ïœ3•!üº]?¿ö…õ$ѵἧX?K×Õ¥xÅ+HÕô«Š^Ά\!µ(¹lO@Ê’9Í>ï°ÿ1¨ã`s¹*’ð„¤6AI12„PùÂ{.¦^š·,Ó©º`Ç4$1î•ËEš9Š­ <Û ¹eç‚RB’÷Îä™ä³ÿzi¼£íñ> W×­uÃÌ×c.MGzv!üPÞ{ö‚Ò ¥¨µã"ŒœïŠZmÂIr^D))d L&ª©kdY{¡»8ß½yíú{ïåÁgŸ?|üèÅÎa¦ôd2ÑF–e9 Î’—$K;3æù²ôŸ”¸8RJ­k´Š X\p¶( i2à{^¾|yrr²¸¸ˆòD¾Ýëª\5‚ eYzá…­VËVŽ×•¤”’qÿMí’i}sš•ÈôØcu:–0gnàîÂBc™`üRM¦Ë{<6³!PHÃÁCtË¡0Öm$^BÄ[¥,šy%˲ $ùà3A†k4xe’”¾<›BÔ¦,‡¨4Ùˆ“uûDdCÂqN1Þ¼³[Ì_ʯaL1‘&fÝt"’ŠSÓ!Ï5œ4E¢ÓÈQðAÑï6;Ûý~ÿæÍ;;Ï1déüüüøøp:ǯ¬Ò¥N·žW>„`c_µ“uɩ›Tíš  ŽU£ÑØ\_^YZíÏ-4T£Ñh¤S__+ö—èhÆjÑLýë¿xiÖÈiB‰« ¯ÍøyòRH4~!N%"c ÀðÙ1¬÷ââ"ÄÍ ½Äëg0ÐnÐÑl`Ø3Ö‘wÂZ[V%Ó1¶úãÿxooïàà`ww÷óÏ?ùò%‚N®'á~®_¿jâ­­-t ¡nßívççç›Íf³ÝX^^ît:0‡°”ÆŒfã,MøØÃã#Ðb„€Åj8çîÞ½ûo|£ªª“““ÝÝÝýýýÿõ?ÿ¿û÷ï?~ü |N"â”8CÉŽŽŽF£ÑÞÞóÃÃâ(–——±>ÀdÁôÂ_á3#☰ð péM2ç“ym|Chœ`}Êf25i©æÅ®¥gFDØŽ›éàs¸ØkÍ o`æṮ±€¥z?•g]Jˆø2'“b¡- Íë°ÁrÈ*z».k·Û!ôÆÀôBЇHXÆú]ÅË{D=rð5ù÷œvB£~ çËÊZ;- ã$Ñ÷åjع-Ê¢(ªÊZïI‘™ÚNýT–x›ÒÅOÿÅ¥^éÏfW‰½yVJ”P†‰˜$äÀ+$}e—‰y¹ì!ÉÓú$y;kHHøZ®øBÑ–½L®B¿é4¹È®Ã…ÿ*’¨‡Ú?®ˆ¼–¤$iUâ¹ý'W)E” Ä{!I("©„†ßív‘"öõT7'# \FØî„’¶7œ…ãÜ@º.2ÔÂÑôÉl7™€ðø•TVO¦2o¨VË¢Ê9©´''Iw®òÎ ©L¯×m´ò·ßzkggçñãǶ?|¨$©‹‹‹ÑpbòK@8¾èŠ®H;!„³qFY4Ò%s!ó<Ça Y–M&“f³9œžŸ.v—VV×××[–'_–%…­r)´Ì;D!¼ü×/Và`–à¡§/b%"<ÙP§‹a8}½b ôf`\ÅT o¡Œü&È—¶ÛmHÛÂgt‘¦ Ì{»©’É)% `ggg{{{`ÿßßßÿþ÷¿š˜³³³é¤ "©D³Ù Æyž÷ûýµµ5VoÞ¼9??À‘u%4KY–Ý^ñ"6[1¼à¨s­XªtB;î•Â……¥Ôd2ÙÛÛ+˲ÙlÞ½{÷½÷ÞûÊ;ïíïï?|øðÇ?þñ÷¿ÿýgÏž‰˜5r ­&ô @¶ßÿþ÷ƒÁ‡~xçÎdD¹ÝˆÏ6^¥ùKVN>fB@Ê)é¸À¬#|ÕPË€ó¼8¬(mìe1‘Ê8Ä…õ¦³uÙûá:‚RŠg?cßÙoã ›O…Ÿ-ë†$Õ,άTÉŠ7äÕÙî² ÷Þ#¢=;;ãØ!)ózöû}´YÃ-ƒ÷r¢qÙåŠÙHÓh[Ò¹vySJåyÞjµB³Ô©‹²WVËqUÔ$ÞZë7 1ë3û›èƒW.X‚bZŽ‹étZ–U…Ek7¹”zZÞ_j±+ЕÛc}šî,]šüŠ {W,3.Bê°n«H!!íÁ¿^÷:²ìA8e¬5†$º ¼ò!`î ê,FÏ‘?Z}«âòØ6ð_Y*è’‚#8ç|Y5u.ùLK£¥V%îíõl µÖR(\‚ÒA$3­@€ ˆ8ë̲¬QåˆÿOã,èH/ÏRЇ³‘%VÉÅþx!€–¯×œ/ï}¶,'DÎ97ׂÊÂSFR:%µÑFhòDžH“ÊMË5Þ¾½´´°¶¶¶´´òlçùÞÞÁÁÁáÄ^V|(i Oß§<².R$kB£Šó&¦Q»Ý^œ ·'­ÓÓùÓÑh´´ºÔšk5 £3öêXÂ+muØé׊ôoviȇO ¡.Á*WqlÎ¥ž5µ…< CX9äâʱ”’ËÑ„CÅ_Ä *äîx’`šwB<ä#…J€|Ï(÷îïïïìì¼xñâñãÇ=úÙOΩ´tÖ{ʲüè£VVVnݺõöÛo¿ýöÛ[[[˜‰~Pô4û$ †p¼( 21°¯"€wqŽÝÅöYa#ð òH€f1Ýnweeå£>úæ7¿ùû¿ÿû>Dé÷?øÎ ЬÖZ­åññÉüccÌêê*¤Ó€IBä1 _c¬Øe©íP¢¼ELlRRßJM "øË—qlšn§ø¥@×¬ŠŽl2S½Ìû«µ>>|‰-@‰]Æþ–……šmŠåãA³álíÇ\Ûi¼WJšY£:©@±Úðçp ‡C„¶x.œÀ ÷z=pgBþùqD’Ñ6²p:z:­=wnš‡œCu¶Z-Šdȵ-«iYerjËõøopÊg.>ÂEQL§à<ÓüŒ4x¾ÚR™n“x%JNMËFêQb¤eä±J¯+öž•d@h¥~J‘¸WîUÚJ) ~©”2ù©„%CDZ¡¯ÎMç¯DÛÑguUU‘#/•µ^ˆPæ¦Êt¥+¤@8ü !È!¯àFž!û’ùÄ`WT§[´ˆãÝ xÙo³¶+›…+c—yku/ËË{ŸåRÈà|íúÄ+ås­œµžÈH-¥dêкµ¹´Ðë-t;ýÕ•ÍG·šO÷^>Њ[J¬TØDRƒ|Ô·ä]¡t³hq·h˜Fí¦ñ6L.¦gGg§§§ë[ë›×6×××µ2W|Öú[®Šk=’ò·uîôh4rÎA N&œ€AÒd‡täEY”“ɤœV»;Ï1äՖγµµ%¥ì÷û7nܸyófQÇÇÇãáĖ޼Ž\åÉ £²Ü4z ý¥•å^¿?-‹½ƒ}PhMŠ©4°J) `gZiÆ4± ‡Ãƒƒ£³³³ñxüäÉ“üò—¿ÜÞÞ¶Öj£¬uØíf³¹²²²¹¹¹¹¹ùµ¯}myyyss\ÞF\‰:Seé<¹ ¼¾´E5•£õõõ‹‹ Ø“z IDAT€ëŒÒççç8“ûûûÃáŠDLŽõz½µµ5d°z}DäËAp>xï*k”.m!­h4×o^[\^øêÇ!ðÿ_ÿÏ?þã?"+€2†¯‡È6­F“ù—UÊäy3‘çM¼Œ+Çœ½È¸pÙŒªGØ}6NH{²b +¥ô¥Ç \ÐÓrRUUekT'\`œöß‹xN)5/ä¦aT&¥Ìt®¥© ûå/~úï?}ôdá&R#°=Bˆ[·n<˳¾¾¾²²âœs–ô,©ã˜ŽACUò² F•«‡jàñ§Åô|pqz~†¬FÁ3??ïœëv»««« OAyØn·ðÕœ=âדËFgª¨¦ÖWZëLìt<Øp<“)x1y3kϵæºm4’•¶@Ûz!lË™ób8²ªgš>Ë;[oÉKr$‚Z7³¼ÕpÎÛV)­Ì_àe$DˆÖ; ¡,¥‘‚oc ¾Ñ] J²<—ÚÒA´œP6LHcŒÌÛN®ß7‘M=ŸsͲ,&ÓétZZ*cŒ†ŽHH]Yk”ä‰&H6ˆ(]¸=™t qA]GÖ3!D¦SÖ+'IHä`†Ób<¤:Óµ²&_LÇR’ðNjJamd³ªte.+5®´ä¬¢ Èhm¤”‚ úJ”k•R!TËËËF¦µÔZŠ)%Jk‘9sq̃ŠmœÈßòyĪ*¥™ô¾Ò>´s#„Õh:(ÜdŠ6B_–¾,¹$Ê`Œ‘Æx"ïk¾)eUjµ^Ù²ìv»D„“›uÚ\’‡S˜å™” øv¹—eYZ72L‹A2%œwª,‘T\˜ÒzBÕlH­Þ{¥¼Vu.JfZgÝÄ×éLBäªJN§SØ‘³ó“N§ÓjçBˆªª´T¹R†¯É¢ B®ZÁ“s¾áÅÛ[[[ om­¿÷ÖóƒÃþäÇOŸ¿WÅáÑËÒ…F£QeÞiŒF#‡©ä´Ñ$ĸ(|YæLkòÎy%í=5L‡BDìDtqQ„ÎDÍOæçûYÖM.Üðd|òtÿq··ôÖ[oVVå$ieiBpe©‚hµ›¹©KKÊhWgzˆˆà.ÂHÿºvYûggS§¥a§‰}%Ø!$ŸÑV‹t}±N§Óï÷C艢 }½œ:@ñ²Ñh 𽸸@›Ã8ϬÁN.;(ú½|öìÙ£G~úÓŸ>zôèââ‚BJyçL¦Á}xóæÍ›7o‚³Í<ËËËRJ†C7›M„_ìб«5J³ü·RÊé´À{‘sF®£ª*X< rì¬ÔŽ!“b*ÃXðC»ÝÞÚÚRJ5óÖ;w~ö³Ÿ}ï{ß;;;Cø¶a1ðƒL&“¯}íkßøÆ7²†/…j%²Rì¼SRæ§Àrxƒ*É·ÇŽÿ—#<‘ðF¡2ÊoDz¸Hàíyž_¿~}4~öÙg»»»{{{ûûû§§§ãi !F²âÔl6———×ÖÖ{½ÞÁÁÁÆÆš ld¶ºˆ£ùJ$1=R~6;];—¾†¤â¯<èMí!æi„H÷%€Z»ÍÓ©KÎî‹O¦cù˜®B8_OºÄù팬Ü—±U¨Œ«[}œppFÕóVDRD¨oã ð,­Mºé*R0â19ÈCð4uQ(“i•‡ Ú2…JÊCÖ#X‘TáÓ@âH¯kÔ᛼¢vÂ숾Iš,Åì%c&™Å˜6„j™ ñ½iøÎ/¾âÆQ’B¬ÆŸÇ¬"D‚9`ý&TÿQ]š¼MÏ×t:ö¾N:BððFK×"Ö¤XÌ#‚£ jÊ97×íÂGÍŽ‹Sß2މ"êaÔ•2A"-B&›¡ÆdsqNŒO'$ g‡‘+Êû ‚6dŒÖBIGÁzç­•RjAAuçZ “-õû·ß~gaqñÉÞî΋½_Ü¿xx,)!](Rp|„”­FCá­-k 6‰OÃÎÕèZxESbÚÈq1U“±±®°UÁ‘»_dÇgZë•••¥¥%">I)¥‰\euÎ9™k­Õ´t“ÉDJ}%# ‘Ð%þç. •‡‚Öšéš:€UIª¡.÷¢@TÔl7À9Œ¾«²,OOOñ† Ñµ4 #(„g( Û$˜.±õiSUÕÅÅÅÞÞÞóç{?ûÙÏîÝ»·½½¼×ÆØª‚õ½qãÆõë×766nß¾}ýúõååå^¯wãÆ ¦E O´¨ò#SÔר?nObmâb/Ad(­áB<’¥Ýnóœ,x‚ü^VD„( ,Õïÿþï/..¾ÿþûwîÜùû¿ÿû'Ož¸8N¯$¢³³³O>ùd2™¸`˲¬{Ýtà´ËXDIÂa¶ǧ:mâç3&bcwHR#&rðú˜—fK,n»Ý>;;{öìÙÇçÃét ²““èˆf³yëÎM¸\Œ!èv» ŒµBs ʲԲîŽct7«B~¢4͘ºq"™þ‹ÎQ°xB_cÞ*Ðe°( òÆ^+©£h–¤“÷HÆz3' ð ‘â†ùÇccZ­V§ÓAi†Gh”RFi¥’ªÓé輡ˆüL‡´”A’”Rù†AÁ:1É"P:ã-zÆ&“72ã”2B™F£Ùšk6›Í¥ÅE ü±ž\qœd*ϧeYŠ@!WYNÞ°amnŒ ®³,³©Xʤ6É+“®ViMñKŸÀ¡q¥n}¥1š$¢ÛÍùm¶©Çð Ñã gûGY°ÿ =–úì ³k˜ØïZÓºXÞæá·§ûˆA&|0ñ˜ÓéôðøXÅÙê†g±Ûíâ¬ÄÀˆ×ª˜L&“¢¨”òRVÎÖ–UW’Ï5Ÿ/»EÒïGÑMÑ‘w<gâ;PRò¸H€ xè5Ü|qÈx@[qZfš^c¥ÉOQ8[£²ÍÍÍÅÅÅ·ÞzK)õÝï~÷ÁƒUUµÛmìÑøðaQ¥-¾úÕ¯~ðÁ«««2 1ˆC„Tã°+b”†û¡|ãáz{»ØwH -©ÎÂ_OOOwvv...À)øôéÓgÏžMǬËÂÂÂõëׯ]»¶¶¶fŒYZYìõz+++óóóÖZð”c¼(Šn·[UÕÍ›7Á þšÔtáz½žHÂA66:¶Û²Bá4;>Ÿ 0~ÆÐëÙëõÖ“‘õE&sÓðu)nÈÇg^71‹aArq>°y!üWÏs„P²Æ=µº]“7Dj(• J ¡dú¥Œ.§Ð\¹xYXÙÃfs…ã_Írä™,kµZÎpà¬" ü(dEHÕçså´ ¥»q!Žr4§˜eµSúF,&{< Îbï o‘ÑZp—$()1RLqñ&ú„†|4---¡é€G—²ìÑ,  œ“”0¥¯÷Þ#—‹Ïd£®”Ò‰t¥Ç–3@(ñ⠇à MRáD<€æÐã *§™s¡,‡P;UU/Œ1•ueYÂqIƒ{¥.‡8…$Áþ;ü6¼¬ª*]ÉLi›[;µU³•e&H¤…,´ Ad$‘Çs¹‚z®Õêt»+kË×·¶ö÷÷~ñå—Ÿ¹ÿòàèèÔÞ{².Xk„´$„ä|u½6„@$Ø^¤ŠŽˆ,¹iUº ²Ì7‚2Ø`µ–-ãOOO¡sÖÖÖ¬µóóóÆ\o®ÙÌuYÒxZ§”’&kDY%ât !„x}âé×¥;œ %Ä2Á V‘ýŸÁÏ"æÍ`€ÝZkÁNl3ù¢¨5/ô·g ‡Ã2Õá£Å"Ëç?Ë2d“ʲ<>>>::zòäɽ{÷îß¿¿··Wß¿÷Óɤ;?ÿá‡^¿¾u÷îÝ»wï.--õz=˜q®€#¢~¿oIÛR'4U£Ð¤0¨øDK€ØéÈ’7xÈÁ !æZmî¹BÅö8õšaéqlBÈ(4?øƒ?¸víÚ¿üË¿|òÉ'gggD„Ò5òÉ“'ÿüÏÿ|rr2 4ƒŽ[ÆFJÜØ£Vë"‰9ø¨¶ÔòIN•5ò2r \\\¼xñâðð•…gÏžíïïã Wé÷666Ö××ÑúuëÖ-8òŸñ™µIi°›mnn.--¢ŠŒç…Å*ŠB„ºNJ _‡}—×`ŸäŸËH<™L&Å[ -SÄѳB(PpŠÁWC‘…’ér&5SoN_À‡+$)ô—~vL¤Œ™®C[[TT9] d£Ñ FÓ‡z`€‰¤R*ÒZhz=´Ä9^Ž€},¢³ó‘ñ„s­Mžk¥)2·àõççç"¶á6~¿!¤¼%…Öª Þ[k•ÐZgÞûétÌð@6“b6[ËfL$˜>6Ûì?qX™ ã]Ò†”¾¿7qj¡HjÏü1†ˆ§ÓÝŒý~£ÑˆµŸŒØû+’€hÍ“üÊ+©õË}  ™¯¯@!•œ4ÜÄ¡~—$4[Öhð² ¢À[ÐÈM•ç9æ¾t»]-´³3&*³.°®KeÕG†¥45-·’!0˜ÖÚ¶n5”qEYŒ&£lØhÍÍÍÍ5ÛŠ¤öD’ÈI-%‘ÀÏDRæ…óJÊÕå…å^o­¿t{ëúÃÇ~ùË_îìì0O¢÷¾¡ÌÔ;¢@> TK²á’Î3$y/Šx̲°eá+•ÑZNÂÏ…žCTNçææÖ–Ö×WV—û=éI!”$IÞ!Ǽ§ý¾ièà›¯ËyÀ¬|Y"ÅlNIWôìYÁâÁ·PUN5]`}™M^Øüü<ï=Ê*|+lX©Ñl¶ç¡,Ë£££ÝÝÝÝÝݧOŸŽF#]CƘÍÍͯ|å+ ½ÕÕÕÅÅELÁ !໑»Ø#k­e¡áR"+œX_)/áß S„ƒÒéttlˆTFCyAF‘É4ÆÀIo6›H}ó9äÍíÎZÑûýþ{g´g«Õúì³Ïþøã?þx~~þøðåýû÷ïÝ»wïÞ½çÏŸ#~ʲ¬r¥Š}ÆÍfsiiiqq±ÕjíììL&“k×®mnn¢ “‰Z2ì,ß3§+DÐËȉ¬ ü0dêÑ¡ͅ䣞‚R4*&øáR,Ó‰f‰E‡br’í(+&hI¸Øœ% A†hž’0Ž"·k(ƒ `ʲ,ä¹ÐD>õ“dý¨²Æ¿z™<Ç9eçig.ZãÛ¡¯1ÚeT–¢'QU•VŠhƒ qÜ=Ä£Î6ë¤ežçp‚\½BhI¼|“¬Ù9¸dÏX$%Îûk1GÍ»ÏÏ•Fi2)Çð§…ˆw¸8ì–ýlH»µ\¤ [µ³Í£”X>ÔÚÈzLÍ6ÑÆ·{"öþáS’Ö2Ð¥-I¿‡Ž›ëàAÚ„»—š I>oÞ{É_œZ­V–™ fÖ²,…Péw‰Ù1¯ì´±±åIEHSWX[–A)!Œ2Âh3y)ÚÔB„àóRz'#™Æ(­³ Ir% ’Y;—†æãõ•ÕgÏž=~üøÅ‹ûûûÃbDE°¡¶!’BI%éªõ½”Ÿ:”•ŒBð”u†CJ‰Ô¦b<Ÿž\œ¿|¹x¼¾¼²±ºº´´”·rñë£ßtÕ(D^Jvðm$ôaw†ás8º¨r#¥ÌÆLJ™çù`0À3 WÀŠ!€ x<˜g|ŒPºµ¬¹ø8AÕÂb³ûì³/¾øbggçàààüü¼*­6ê[ßúÖýÑݾ};ÏóG}ç;ßùÇÿõO¶f$ðÈë...v»Ý·®£Ée³N§Óëõ0è°‘^¯BØÝÝN§ív›"g§ˆA $p4qè–šÞ™Œ&“ üBHƒ CÜQƒü!’: :aîÉÁ`€E D2òS$õ¹Ô—MEÚFº"ž›ä.C‘ÿ)6˜7+ˆPU•PUX);3°¸dÀ@9!èõ*§Á"bˆ*Þ†§A À;&o/‹¢"©çæZYÃQˆ•ŒÚ†Åg„oj”×{‹FDÿÜ÷%õŒ£ÚÞAü7*Йm½\gºLYËWH§C„7ã`Šˆ–ç=â3Î9KФ´r•pÖ}䊹²_ø ÈŒˆÃ†‘¥ I„ʶ¿:}v|$‹PjHœs(ÀÝ„×(„(#âŒo ¿ÊŠŽC|!È ‹BM§Ó@®Ýnc¬-…0:’í³ê±èÀþÊýÃû„¥¨™\Yù ¼Ô¤eCV®œS+´š6F#—:“Š„Â˜Jj6thZTAŠ\ëàœ³Þh3Ò|§Õyû­ÅþÂòâÒáááöööõàѳǮª|$‚" þRÊஎx©×¼²Þ‘Jˆ (xo’üÄVˆUpúÆã1JÎY>7l_L†£áÙùÙË—«ë››ë K‹Jj–Í´ ɼöÔ½ùª¡¡¼5yrÊH$z„&ÓÉÅð|<ÕtZNŠjÚ_ìI)­¼ÑÊfZ^^®ªêäädggIHtÖvæçŒ1ë›k+kËï|åíþbïøøøâ⢠Ü/g`pgPF`" ŽÚ͹“““óÓ‹ñprvr¾»ó<ÓGU”h~~~yq©;×i7[NÀ«………gÏžû݈ڻÝîÉé‰5Kï=ì%XëruÖtÎIRs­泞žž6²¦mÛ ˆ¤ "“g&Ëp*€Ù‘±‘Æf4M»Ý¦oe:7y¦3#«R*¥3£„AŠ ó,gØ¡R·jŒ%²µ09·nÝjwZ:S½…ùF+ÿ×ý×ó³ !‰Á\*­«Êýä'ÿ[ë¬ß_4&ç­·ó\j­sÓðªNåùà1Ü—ˆ$)¤CêÄ_R°r:”0ðzä¸ÚívQûûû/^ìÿèG?zþüùh4ºwïÞÙÙÙt2Aèô'ü'ù—¹±±ñùçŸÿ¿ÿð?ÿéŸþéðð IRÉ¥¥Å›7oÞ¾}ûöíÛ7nÜx÷Ýw;ÎÊÊJ«Õ*#gýx<Î[k/ÎÎB„é Î/z }$‘Qɘï}³Ý˜L&‚VÚ:+„ÐR;ë¼÷¡ Ê•ÃsÝ‹³sçÜd4öÞ/,,ôû}DHF«×ë09̲ÌÛÐÈšÖÚÜ4DÖZI*8 ®ÖÑõ’J ¸)JÈ`Õ(ã$¸Ø Ÿ#ˆüD«ÕR‘€…£–étj´œ6LKˆ¬ô“ŽrÁ›q…@äsOg¶\%}n\“DYUzêCÚÂwjQ¹²(ËÑh4-ªÚí ªªÆh:€*iµZ‹‹‹óóóÍùŽ­|Qجò¼ÙlæBk­¥ Œ¶ÎM‹õ¦^§«HPð%H Ê´T‘/çææCƒÁÞ<û…2)ا>"ŒL~hAAŒ k:??ú ­5ÂPó½­¦RBIËÁ`:tÎ ‡CT/0Ý!¾x/îžð~<á/Œ+Ü4°ƒÂ0#dguâ*$µš¦‹$‚X"°ÊÕE|"B×]ˆqèTŒ«‡ãŒº#'±ñ²F£žRÀ‡$ÌöàâÑà`IÞjµîÞ½k­‡ßûÞ÷Ši™72ç‚E°Âd<¾ÿþõë×zÝyäQyS¬Š¹d. %³Þ;Κ"^ÇÞ---=yòd2™,,,H)1RâÅ‹÷îÝüøñÎÎÎÞÞž³V³°¸øÑGý?ûó›7oN§Ó¿ù›¿ùÎw¾ƒâ_«ÕOÇsss«««~øáïþîï¾óÎ;«««ÀÀq®~÷x4ƒc¯ñ…ËXᨈºJÖ\œf„N‡ ³Ûç#  ºÝùN§FUÀ%“d~º’WNŠdpÜô’Á¨wpŸ±ˆÙZÙ¤ôn9âñR9rÞZå…”’‚ˆ£‰^sqØÄ¿‘(çœs6¤#· À]׺²Ù„óÑívu«Q•N)ëlȲF£‘+ÙÙŠÍठ’øy½÷!®\CÊY±ÔÛdË+Z‰—‘³Ç&²p+¥¬-}Œ¶S••nLFQYº ƒ¢ ¹$,ó³à&~"¶:|]$¹ÃºqÂLç—¹ŠÐ\lüD,èj­Ùô¦;õú-L6îJ€¤#%‘ˆõW~jKש"嘕’dƒ˜½Ò¿úY€¾®Œœq!&ÒªªzSɃ7‘‚pÎM§%º„›Í'žJ!§ëSÃú_á}P¤‚'ï(ÔÃÑ…R7ò<›ßXÞÙyòå—_>Ý}¶wðâåË—ø@¡¹Lµþ²£K=??G5WñÙgŸýà?xøðáùùùÞÞÁÏ~ö³ªªœµDôÁüÅ_üÅïýÞïmml~ûÛßþ»¿û»þð‡DÔï÷QXXêomm}ðÁßúÖ·¾ùÍonllÀPé8.n Ÿ|vþÐ##NáÓw³ F#–%)ºêglN âyÒ=.,,ÿÕjÍaÀ¾BE(€Œí¿"Â]¤ì¦¨Áe2ø XŠ#}Љê)Å6­5 èáÁ) q*¶ÉkíÉWU%ƒVJQP!ü½‡W¬‹º­|Ú+%¥Ì²šsp3]7›M2:xáIQÏ<Î)»Î ÑIãP´ÁBá¬Å®! M Ú™oŒ7‘ÝAîd¬FY–”𣩈?gST¿ÅV”ä!C’3gâôfT¤A‰bÇYtöɤÃ^ı’ áÇ žôÊá±_»ƒ2i7ÇçèÈnË$-(¥(¡YM3uÈÒ¥VÉd96ø‘¢f!I?M¼‚#{íå°òÎW%UVR)Uºfél6­§|6& ଗNÄþ¬˜ÒxòÞ»Œ$Ôé‘­wÖ–Ö×W×·6?~üùç¾Ü~x||XUU«ÕFk yƒ†Ñ‘q0O°¥¬ypá¤WÎ:çåÅyÊIòÎ3©3srvZ÷¸6s-©´AIáIXç¤AK¨eðͽv}´˜ ƒxø¿"8ã"œ!D,"öÅÝÂùùùþþþþþþË—/ÏÏσâEX’ZkP„ÓZÃë— @Ÿ‚×¢.DÀ£Ñˆ• n>Ë28pÅŽˆ€Á¬CÜ$rY(î¢ñK$¥L0ÏxvŒtåo„ßËÁ)tÖhìIÀäsn€ˆ |±zÐÆ\€ùذBA‡ÛfÆã1ª˜+++üñd2¹ÿ‹õ¡ A)Õž› ‡=úÁ~œ¿sçbi€Òc“Rúú«)Ÿ‡÷p||ÜívG£ÑOúÓï~÷»ÛÛÛ˜ðõï?ùßD”åùÍ[·þú¯ÿúOþäO¤”Ož<ù«¿ú«þð‡hš"¢ÓÓÓ<Ï¿úÕ¯Þ¾{ëîÝ»_ýêW?üðí­-!âTü«â`vbRõÁ+ãDEz¢X9ºˆÒÇ…×p á”sN i™L&Ü%)„0¦ö,MB­EÑðÈ—’Ö,þ“ž½EÀÚ8¥.Äš+€èä£Ér˜†/BÌd¡'Ý›*½q[Å,^&„@ ~ÃÌ]!jo¤Ž0XZQU•Ò—±ˆL0É:6»7›M‹Á—‰RÃ=°¢!”UÉÏ«"¬ˆT¢ÓyEôMá×ÂX"ô”’ˆ)2EÉ– ž®ôŽ#Šèx—@£uìú£$ÖäL8;jü ØDÑsWÈ­øÅ*ÖD|$±rIAº2,9ÿá>bMÀÓ‚~г³3öû!ö">‹‰¬½ì ¤[ÃJF϶c]1©r³Z*íJ©à^Ï…LEÁxn¼“Þ•çÅp<âmbCÛR-NáŒCÒò¼Ùhc”ÔÒR(H¢Šlå]§7ÿ•ngkkëúõ­Íû›ŸñÙááaUس³3!DÊrXUU6Û˜”ªt1{Õv0ÁyïlåFT*ƒ«œï¶U–Ÿœ_ Æ“õÉ`"òŠÚ$µÖ‚H ŠˆH²¯]"-À«ÆO%`þ%4ˆŒtùRÊN§£”5Õ£G0‹SÊ766šÍ&:IÀY:_¾|éâä>b¶ØÀû¤Çd2¹š€‡Ã!Ÿ \ˆÂc@¢vø@xÁyµï`08>>F#©¢ŠãU¬Ìñ Ùñ["I+éÈNžj(J¼W6ð|ò9EiâtEJtû=x4^„ñx¼wðë~~>N{½Þ{ï½×ív_¼Ø?99\\LÆãF³IDÅtzïÞ½rZÀøa°ã•ïJUþËZ5ž>}º»»»½½ýäÉ“gÏžíîïõz½ÞŸÿùŸÿéŸþéõë×···ÿáþáÿüÛ¿5ÚT‘^k½ººúÖ[o}ôÑGë›kׯ_¿{÷îúú:r!µ ÆÖ6P»œÛä¤4^ŸþbªVÌFT¬þB’#¥„þÓ9—iƒ ÙÇmqZB$ù˜ôŒPÒ ¬b++n~ ¢m|6q4¥]¤pѶÑZFCàõLœ(ÇçÎ !(%Q"¥È¾ûŽýÈÔiöÞ[ªª* 8<E„àQÝ@:G&¹eB Rh)µ„BVJ)áÃd2F©Òà]HuQÝå–E ßôÞ‡d*×e8Ã_xTL$P–¥1ŠxgýÌÐÉ+ß¹eÿŒŸï-c(|,cn,šJ(8ø8#'êxŠÓHÕr+“”[&öøCÒ‡MÍð›BH~@|hí—––:ŠÐÈ´áY”R"[rE?50é _‘ÕôÈH93ÿ8½[ö;CR³Óeƒ·Þ…¼ &ÅWk#ƒ³Â×[#¦ïÔYòu$CBô:ó­VÙj7ŒQ$z‡IB–é–ɺÝn¯×]ZZZßX}öìÙ—_l£Ê…v8új–K„¢wuEn©nktÞ{¼ ÎUE5"|ábt®yé]áìÁËã<Ï·¶¶–––Z^7s:"C— ©„}C{’¾â±†„€"DÜ9×/ÙÝCf ì¸KKKý~ÿôôôùóç>|üøñîîîÉÉ ’lð©1Ó~~~9H?Ì! ™‹ü…©mÃÒ§ |zzz~~Î=æ!Æj­V«×ë/pii©Ûí"Ž\7RÿHôÍÍÍ! žŠ³Ã!"Å«ú—Ó_¬æð{vCÒŽÂ:? ï‚R†‹'f‰^YÊyµ9”Çãñüð~nÞ¼ùþûïmooúé§G‡‡ÓÉDH¼¿8?ÿôÓOQt¹âˆ„ŸKJ©uÝŠƒµ…ÖÇ?ÿùÏñ‹_”eùøñc ›RZþÙŸýÙÿñýë_ŸN§ßùÎwþöoÿöé“'$( Ö××Q¸uëÖ;wnß¾Ýî´³‡Y–±]J“…b­Ë–Õk—ˆTh)R„â_nðõ^Ç…^ó¹V›Ñésssìr±³)8eBRI’±bí€o)Ä€+‘—1Å‚X)…Ú°µ–á÷,Z”ìöEIù+ —±ÔùÀù¢(Ê™Ár«¤`ÿŒïÙ3®J“:á½#AZkÒ*Ë2Eb2™Øé§Y…/‘$÷T¬vs5¨xsedœÅf·Õ,0AŸÍñûÊø/Ǹ¬j¬­]1J\ÞôX½°ÌˆH4R‹Ú¬’KÃG‘Œ&Kœ¢Ä*Sâj‡$îíMbòø‰­­­N§ƒN?t¯ò©¡èŒB›ñ¾šLªŸ(föâ>¾Þ“à[½bÀÂr1*BÓkWžõ¤¢t;.ýl;5Ö°—E"ë¢*³a–ç¦ÙÊ›Í|n®ˆ¢Ù”Ü´,¼uBÐêêj37[ëׯÝÜØØØÙÙo(îsnn®r—l€‰·qu_xï²L›F.ƒ§ mßÂ…àœ›LýùÅÿÏÙ›ýÚv]uƒcÌf5{ïsö>Ííßëë¾IÀ&QH(JAhèQÕŸJâà ñŠx Š”BŸŠQ¢1¨ŠŒI¾ƒ‰íع¾¾¯osîéw³º9稇±æØóûšT-YÖ¹çì½ÖšÝhã7¦MÛÍæ Ž™·ÛÛ?8}fÃŒi0ç<öUvF ›zŸ²á$»‰±ng/ÑD4˜.1„ðÎ;ï¼óÎ;W¯^ÝÞÞÞÞÞf|üp8Â4öÌÜýgÏžíºŽ7(ý(¶ç+ËÒ9···Ç”¿¼9øA\vž´ŽõÒ„O™8R¬bu‚âH£äÄ÷UÄ«y _«Ø}ˆ’r ö¹V’'„íétÊÝ/vwwïÝ»×up^¸pᓟ\}ûí·××׿õ­o]¿~i±y¯]»F±ˆžKl)Aoбß[ ØoJïýb±ØÝݽqãÆûï¿ÿ¯ÿú¯×®]»}ûöƒæ³|òSŸx饗þÛû߃Áo¼ñ•¯|åÿøÒ—à‘K—¼÷›ëÖÚGyäüùógϞ宂EQŒVzŠlˆ¦: ÖI¸¶"ï䋤–(Æ¢üÀB1YØÓ’ì+±{BƒrÀ¦ O&+!P‹*eà ?”×…ã“t>/(DFy·TŽWUÅÅ—UUù®¯fax#¥¬ ¶ÑQ; œs{¢‰ù|n4­üWÔï©Ù×+ò’ucŒ1šÄÚIÌ{Ïð£M×yçœÒ`Œþª¢(æ‘RK¤9%nŸÌ'D¸þ˜Ý™~ÝÅBíªªDG†à„¥ai£x ¢k儦©¡BßgÅÄÊ«c:“è½ìÀ¥õ#ÌÎ/}ML<‡TQ‰Q‚G½üäJ_‰ÅWî1 :‹Tó&öÒPÆðç¹”C¬žC‘ GR!¡UD.•~éDAŒ{+¥üCBШ’B­¹G­aîªæ!T €Á‡à½Ïò˜ÈΆÁ“O°;ݬqqc2«´F`& …͘êôÙógΜ¹víÇíœï×ë~ms2ÚAV rû]»å€eyR̲L:·pÜ#ô­ñr.ÛØÚÚº~ý:–S5ˆ¸²²²¹¹yæÌ™Ó§OŸ;wn2™ öJ}‚€Û-D"uÙÄ6rž yY“êE‰ã1~dssóö÷îݻLJœ‹ÒD˜Îf³û÷6/ÃÄ )]Ò,YŽ·HÞzÀ:锉åÄ(>'|$ØëÂXèvÞâ$õ€U6€±ˆYá‰p?æéJ$™Í¸&#†Ë\1«ˆrï‰_ z¨RG$IŠU"è]¬Â$G ³Žuƒ+Þ±Œ`˜N§‹ÅÂ(-¹aé Ænú=o"r¾ïƒ¤œs•¯¬Qƒ㞥£19Ý1šÅ#:R-ºšìÚuÊ ­¬÷Ëxf`­€*}[QÛ@¸Œ¯@¢½ØlM?xÔÅÏ–·¸/®'JðD`%92¿Ƨ”>àbÆã >©WI94y®"ó±lÚDê==ö^ÞDl¦ÔIg&½ðá¾/_’ Õñ2±ÛºXW:¢IŠ¢PÆp¨ü„0$ý0ÒÈM½Xˆ-Ë{Õ÷åÝuyNºØZò4<ìý»huicQ+!â“õ±ìp9¿ì˜±Kbeˆ¨k˜2øtWU³XÔeYZCkkã•á0˲àú­¢Q5Î9sf<Ÿ?þ½÷Þ{ûí·¯_¿>›Í:¿ì¸,‡šL™ì™^6¢!ï}ÇAA £´÷þ`o—[2´ÞMsDdÎãúÆ<Îô¬iÖ'k›k¦´ö!}Éø2«£•^Ô9_æE–e]Óìí+£Y;:ç˜pЉ«ø-'üì³Ï–eyûöíï~÷»×¯_ßÛÛ«ëúÞ½{“Ʉ߿üùóW.?zåÊ•ógÏYk}ç‚ó]ÓjT¨kÚÌçÓo_« ª¾ÎGÒ–¬A9vÇ=†å$@L¼ûÜsÏåyþüóÏ?rù"»/œåMË‚·â‡ÊR¦BœZÖL¢C$쥄’§]ß®ë8ò!É0D,óºí3dª?u:ÁÄ)¥FƒQ*zR{Yž«”bd<·m f~FDÚfZkª©ê¶n¸síÖÖÖþîžQ ŒÒEÁµ«ãñÚp¸ ¼'Ä%ÇÃçˆÊƒVÊÖm›!ZeF¢A€³…æðÁ~QÚ!˜ µÞ¿¿[,V†%ÎýbÚ®ïlîÏO̺µÍlX¢Û”“h°¶mÛK@뻳ØQœÃ,!i>È5E]וe¹¶¶vúôéÉd2N¯^½úúë¯ß¹sgŸÓëëë.\8qâÄÅ‹Ï;ÇÄ“)BB»bû„ØY,Ï{Œ«àP(20 w%©¶VWW¹pBkÍ /©ƒâ…‰mãØ’ØßߟN§’ˆ·#µMø(X[XM²”×Ö¤”„nİâx;|R–À_O¹Ål1¦ªôuç{Fž»Gó"Ÿê¢(8ê¾¶¶¶¶¶Æ·Ç>úèSO=Å&HðDDLŒBxûí·ÿã?þC·Ý¢÷÷÷AÑd2yíµ×þñÿñk_ûšRêæÍ›7®ß4ÚÀOÿôOÿʯüÊoýÖo½òÊ+_þò—ÿò/ÿòàà ˲§žzjuuõòåË/¼ð™3gyä‘燇‡]ÒYV\ g‰(@ÌI VT¯EjbKÔˆ’дX¬¼]9ø†aiÈ#q‚ùÑu[ñ %GžÆå‰òŸ`š(Vñ2^—¿+Î:Ť#oZæ˜eò)Œ4I\¶n#Z–e¼9ZpÜ›ƒ@ZCPJ‘Š=ð#ª„é¢ ˜í¼xæû G#å (úŠ)@T–ºáh÷Ù±bƒÊ<Ë_½bʘˆçàNνJóBŪþ¢¬//“[¶þ J)Tý$cXVîÊ’!b×-]4Œ—ì–å1O1™VJ)Ô1íN Pl• 6"%PoICâ¦ÁyA`›™ÎUzI„@ír˜Ö²C’_7º²äyam¦”éÃ̰ìô*κÖZ›eÞD%}Ï8Ú¡c¹"òFšOg²+øJÞ2¸ïÚÂä¶ÌÇ£Ñxueuu°2*'k£Î;å±Eß‘wJ°6Ó°:Ù¶¯æ¢“W¢$¼›Ï§MÓäÖ–e™ÈIÞ!èrdBÚ¥P¤õ ebœœˆ ;’FUJAÂu#“ƒ'¬ j½ ˜QGÚ³|`™·F°?z¥ù5yDºŸ?ZûBBÞ‡I)§ÏXÄÉN‹q¬(A´¦DÐÁ+6€EûÊ„ ¢6KÚmI£ "'bmì±Ñ’óSJuIïv9Mé,ñ«†FE¶¶¶> ó¼Ëñʰ,óBR¦Òº .xœ$J)åÚŠ¼×2‹™Ê3‹¨UÕ Vv°·wP-ÚÃÃú®C盺õžB‹Å¢jÚÅb±²2O&£Ñh²¶‚‘¥$ÏsöSNžö±Ë—/Ÿ?þÙgŸ½téÒd2YYYY,üž¢ºtÒÑAN,ž‹§ÅÌÿ x:&ªä䛨‰VÇd|ˆpq[?ˆo—uÔv‰^—=¯`YC‰‰ÿ$âF¬„Ô~⬠D€—p²7ˆHÀS–†·k¡­D‰TÄXk«¸šbž6í’óÇ'ýù áQ81DKH@¸"à(® u2aœÁ’ZmÛ"j“v# ¤ñ-D´Þ^ÃeÇOyUñ[tD¿ËVGÃl²:¾ŠÑjû•kåÊ!Iy7‰eÑ(†ÖZ­-ºÎ;çP…ôÊÖ‰ê# Åõý(—-u¬Ö…¤O¥ìL€`0©­àù²s§ÏF#"oµÉs)  ¨@Ðyp‘T ¤ €ÖÊ(­2(s£4 yÛ¶n- Š¡ëˆ£˜‡ÓƒÃÃ}t!bë˜`®®êzee¥i«˜)@ç|Û:"ÈóbœƒÑèôÙ³gÏŸÛá^ŠìIK A¤RŠ+d\<Ÿ»»»ml%œõ°x [–AÚ,,¶··EáA4—Ø4‘0¸$¹•R£ÁA}ÜM™&`b ûOœŠ]ÂàúÌnÍ‘†S§N=ûì³7oÞ¼víûd<çÆ˜7ß|óé§Ÿ>{ö,—eÏçs~ô÷¿ÿýW_}õÝ×¾öµ¯M§Ók×®Oð;¿ó;?ÿó?ÿ?ög_yå•?ýÓ?ý«¿ú+ïýp8d`ÝO<ñüóÏ?úè£Ï>ûl–eìúÑ8­n IDATȱ„£Å éjŠ”©”žäté?øKÙ!ü%0Š>þ£dbq"³tOï™zV©O?#Æ"DîRuõÃ`ÂÎÌÉ–cÏ©(еµuÎâ³yê”ßÅRñk­¼BB…l+b—Øîd´ ÇÞÛØD%\`½Ýi¼÷¾ó.@”V¨OHäÜpÕ|ѹæØË‹öÞkë^ø F&D2ŠlIvH¿ FkEéÊžQJ!RF¡Uªß´½\ŠjXì~m«U;£§ '® Çü0zä˜D³àPÀ’–âÌ0L®ÙãnHìkr$f4evX–e‘´ÖŠˆ|ðÞ{Ëþ+|¥ÇS¶Y:™˜ØÁ©nî ¸Ê"™S U\íkÖ×'++¥ë<"fZ!‚BðÔÛå7Óc5E™k­X=p뀠˼(ó‚Yކå È3ð`zÈ[Å5M×uζÉÕŒ©d%>Ì g¬Õ‘¨x2™œ={öûï\}çw¦ûæÌŒí»«9¯“ΕH0›zùXºÂ3`2Ûô¾fÛº®uݼZ „Ìy‡«ãÑêê(ËÌh4R—)+ñ±xE¹2Ü%ÍŤqÞÚÚZY–ÓéôÎ;{{{0æó¹ÖZšØ0È…O`_)ude÷§ê?Ýñô Ó‘ÏAÚ3¸Øþ,Ë2i'Äp8ôäø—ÜŽˆØ÷e ªcÉ&DÿŒµ5UUµ¿¿Ï•NÞûÛ·o3þKT  ÃÙTÂ,"†‘ùu+(GQ 1Ë2ÖyZëÓ'O±Þeÿ•Ù¦F£Ñ èë%8Ö$¹ÃãÆ¬¶G£‘ÔR+¥¸UTY–W®\yæ™g¾÷½ï]»ú®€z`ww÷êÕ«W¯^å$=“/.‹ï~÷»_ýêWß}÷ÝÛwÞ»yóæÎö.× ýú¯ÿúç>÷¹§Ÿ~úOþäO^yå•¿þë¿VJEqåÊ•‹/¾ôÒKÏ=÷ÜÓO?½±±1ëºîãr‰òHÍçÔF–°œ^ñ]Žm Ñrªù ˆPÀÛ"îcªËDü3FxÝR¸'üDêh®1Õ©¢­S.$¹^ÙØ>öbˆFà4ƬsÓLÛÙŠeÉÅ­ééO”tÝA–ŒM‹€àQˆ‰â7j#ÞÿÆð±’bÜ˹e“r^ïLàc.0¶u\D³cBLŒ…H'kÛ%…ÙlVÍ€Ç Zd†!É>ò›0Š]Ƙ.™ 9n¹Xh{Ç4%<+¬Ôë?"mÈx·ü0›ò>¶.H­HѰ¬6îo«’K¬sHÜbzˆ1¥’ˆ 1§=OüñSg: ò¬Ìó2ˬR ¨¯¼r~ 쇣mø‡ F3‹bÝD7 m[ŠË—*à‹'1r+±ä7Æ Œ)ËÒ"€Õ È!ZŽ]†BXÔuÝy…¨|_ ©sÝu]^€BP µ²…-y9›±|ž-*ö”0"4fe¹?™L&“IY¥´2Fe¶m[ê\ní©Í"ËGƒáÉõÍ÷¹™út:-Œ­mÝ4ëœÎ¬(A<Ž–-¶l´¥”-vmë:\ß{¢%i£µ ‹É|Ò4ƒAh­ÐbÈFaý¡Dî0RC)µ²²Âï1›Í¦Ó)3Ri­777Ùéáh°ÄQÙf¿“£¾>ò!Ë6M²:A¢SŒ.òk¬¬¬pÙ%‹¢ðÌ%./×9.DÍ´á½2 œsõ’÷d+akkëþýû\}X×õ{7oqocö€% }0=L-tñz¹ã©Oª‡ùŸ“É£ñËÁ Îps˜é†Ã!s‰ŒF£Î÷NmUUfà|ƒäWWW¹I7œàòt:½wïÞææ&‡ïܹSÍkáã7ÜÙÙùö·¿}þüyÎÐ;çÞxã—_~ù›ßü&¼úïßjê¶›››¿û»¿ûs?÷sMÓüÑýÑ_ý_}÷î]†2}êSŸÚØØøÌg>óC?ôCO>ùäp8lÛ–1«œrf‹ä˜"Eô¥‹=!Ø:¡Xxí“䟉fŽÅ»\,'Y1¾³/i!±åùÝ”Ržœ9c!×úTå„£u¥Ò‡è¦kѤ‡.v.J••• î®(’N$ZçÛÄý±—8b!øP*J鱜Ÿë”á9gáR”=@=U,p;¿Lñ¦wæˆ:Ç„ÒïŠZÊb‹ë~¹ã=CìaJD¨,K¥À{?N§ÓCò!ËMú Ñy, hI÷±œD þx{†cÆ\ª€ÓÕ”…ã¯h+Hû¾*RkM`‚_B1ÄA'"Tlûäê1ÃQgóxeGQâQáG3IÅöŽkÃBŒ6X,Y–ñƒ8‡5 ´²¼ 4(­óýKôÈV—Ù>ö\•`eoCè‘’r¨e†!áþK@-¥ PyðÁ[¥C¾c ’ï¼sÞ»à=¢à™-Ò+”F‚^(£r ¨†ÈæÙŠY5™­¯Ïf³ýýý½ƒÃétZ×-ûB\=‘Å·UUõùPºéÚà1h¥ .>rúäÉv>ðàÁûï¿÷îÝìîîrtºôøƒàû@‰Wª°à¼ ±p1tÎUM“d ÏTžçÕ|Ö5íh4jªV)eXPºH, bëOË~ׯG£Sat‘÷ØEŽõ••c kGV'léó %x‹1ã {1»d Ňƒc,¬¥¸AðsY³jT~œ—çØ8ÉÍþ+×bC$JMnf ªªŠ[=3éÇáááîö“'°ï+á¦E]‰èT±=0"2õ’,•Ø×bâA‚%€­­-ó…œ=­ëz4y ìàrË&Ö¾ŒV“SÇ?‹I7wvvîܹSÅÚÚÚ¥K—^|ñÅ›×oíííQääcAyõêÕ7ß|óŸøÄl6{ã7^}õU®á¾{÷®óÎfæ‘Gùíßþí_þå_^,_úÒ—¾ò•¯ìíì³þ™Ï|æÂ… /¼ðÂÙ³gyä¶ÆBìpÀöœ1†"©M"rÚÙ[åòÊ#x,§\äá¢X¨cÆWÔ‰¸¢°Ù~bS« Uä^Éç÷ž]ZëÖµòL¢ˆSG¹)xËÉîuÎIJ’h‡ŠÜœÂOw¦RŠC¼ˆ²mPÒ.ayŽ ¥TlN¢{l€B2+äˆIe¥µYžçض-GbBLdBtô]6d®Ê#Íq)&­ÃÑÌ1[¢*bU‘#"¶Ìz9ݾÁ`à}WUÕl:Ïçe^ÄàðR»D !ÀÒcãáô²Ï‡¥[)Ò0Cžh—/]:|òÉÛ·o¿ùæ›W¯^Ý1Æ9×”bDÖ»¥ÕžN8ï½ U«YCç©éZÓå…1Æ6Mã=-‹ºn•RF[ÓºN uÛPì×6(¸3³kšæäæ ȲŒÉâ{<ú|~æÌ™¢(xÞ9Ý5ˆˆ5Çææ&4]ÛtmÕÄÞgÎ1ŒOB1UU±š,ËRk­3«3k‹\kºà‚ɳÁ¨xðÀµÝìpº:ZYŽ>ù#Ÿ¸ûþ="úö·¿ÍÅ‚¬á¶¶¶Þ|óõ7ÞønÛÖ/¿üò÷¾÷½·ß~ûÞ½ûDçö…^ø¥_ú¥ßüÍß|íµ×þüÏÿü/þâ/š¦=uêÔd2yì±Ç>ýéO¿ôÒK¼ôê˜Ïç¬W\Ò}ˆ|hëÆµQšˆ\Û1,ŽU±£Ì« ްÊä2ï}QÁy‰p@ä» "ÆR±h`Zìétº³³Ã¦+ÃÂy3p'Z!ò1•Î9仾¯_¯à5*2Üz…µ)@.Cê”R]×POBεÞwUSwÞB뺲,Ëá€lžn1³ƒê¦(ŠõɃ±§óD¢Á²,9§[åá´—þ.¢ýÙÈÈZ_P¶.¯½>9\Õe^è4X«¤†yPt¾mû "0‚ï9—dbõ]YæÃQîp_§>LBd¨êˆ€(2Á+ï S YÜ3´BEÞf"r]DE, ¨•Eh‰ß5,ªŒÖ™6ŠÀ·]S×µ‚6¸¶«½«Kk¬Ò®ƒ”°˜éc€€œ§>R(f‚S­¹T*H¡7ŒŠ¢è´îºnhtp}”8ˆâƒë(2Æ9í¸‹"£´ÖeÙ#„™eˆÃfιêQ¤îáô!ó­†87ÇvêR|Ç”?ËäF!°xçr—¼gruÚßße«O(8ë×uj@YieÉ;$§Qµm+’PȲÌùÞ)JMd""c­ÍZ« mƒ†eÚÔYÓu€ Q‘ö>GM­›¯0d:‡, Z·Ju€BÙ’ÍòBç]ëÛ†2«TUûZÑáÌ/5 ÁYQ@ƒ ºV4Ú0€@yÝtmÛfY–ë’×\*jµ-Ö7‡“ šNçû‡»;û»»»­F2Y£õö¢&ªqªB]® ›g*#RV«bT˜fNWEjmõD¹¹²~áô•çŸ{ë{×Þxã{ÓæóíÆ“Í³Ö»Ð¹ÌØ@šrÕB£µ¥ê¶€ÌdˆHùÐ8—wÎN©*È모æ ,ÁÎx<¦€]×-f+óéA–eFÌ=ÒŠyËU|Dmì= ±;/$3a±Ð”.*ò˳€nãÕ%ÛRSQŒ2±—õQ°>ß;±ôd—Žb,…sQˆxxxxxxÈâ ‡Ívz8–.]ù¯‡‡‡Û[;[[[{{{[[[ï½÷G’çóyÓÕ<3ì+pªŒß‡Ã,|ö³s¨(`Œˆ6"Ês+v1à쩳OÀ /¦;à(B½hÆã1[¸.v Šﺎ‡É'н«MQ®³bAÿÜsÏÝ¿ÿîÝ»Ì ÖEö’,ËÞ}÷Ý·Þzëµ×^û×}8Côc?öc¿ñ¿ñ³?û³û·ûÏÿüÏÿý¿ÿŸe™Ÿù$+E1ÉÙ¿á¸.ÆjjÈ«£°XŽÞ¤V¹˜²Ó ªbÒÇM@ÂHDˆe^ódÝ!øq‰öM]7ñÏă9£P‡È"F¤¡>0£”A0JùhU# y©¤óOL@‚nÃ$‚è#£“µ–c<:&Å»¤s”ÌpÁ¨#qÝ !÷˜k y””‹óÐP)‰ P’“†‡ó1áœr°J¤0" P,Qé\ݵZƒJi«‚†ŽhÜV–\¡(‹ut<œ™ŸÙnH˜õ&N°Ñ9§j0³™$£ù¬€"àÂÔQ|ë0hB ï”ñzîuÛ¡ÑJ{íØ›»Pa׸¦Å  ( ªª>äî½ÖºÐ"x ƒ¬)ó¹²¾í ní¢Ê<ØrÀ{¦kÚº®]Û²Óh8Ÿïx”Ši‘Jlç2SrP0÷;œúåÌ©$Ê'›#&>Í󩈽äàª~±étÊg£( èh8ŒÌš)„à© ¬E,²Ã!²›“—³Ùìö­÷···www÷öö„¿»ë:OLê6™LNœ8ÁN0GG#@;çœ'8¦€ù5÷%(Ê)RþØöö¶ŒÁ>"K•R÷ïßçb•à˜º®óó>'Ô{NJ±Ó9YK5»ì @»|ùòåË—oܸ!@\¥ã5ªªzíµ×Þ{ï=^гgÏ~ö³Ÿýüç?ÿ±}ìŸþéŸþìÏþì_þåëZãd2yúé§lõ±}ìÑG][[s±6ZkÍ¡ ŠX3Dd/!Õ£*ÖVq–Á성MÀδŠî»Èà"h0–ÍQâ_ò¤qJL ÙQã¯~øU±ĪZM׊ö ‚ˆr1à$9ê#¾+`×ö ‡h­eø‚°ƒQ Å‹…!óvL ©0(ÑNˆfDÛ£®kCk“°ônB𑜠8)I ŠÒÒZ;§£aÛ=Q äœB¤kà·²&g#IJœÞ,#/³'$:QxXqÕïä Q**^üWY/Bð›Dñk Óœô‰y†‡ž ~I‚&8Kƒd;±t‚5TëUÂÑd‡¼|ºFé´„—@ˆõBD¤”ñ(-¯¢FÀô&Þû‡q–ÊD›½@£"„NRlãQµªƒ0Ê Û‘mÔ­ B¡0×ÊÆº‘o‹.˜ÀÀ§ƒÜýCˆ<±ÖÚÌ›L«¢FmP¡EýjK&dmíµíƒ 4è¶Õu«´ÓY– ±€Tz2ÁÕƒì~~xÈ´Ç!„¦ëš®«šŒrC:P#̲L¡µ6×VוkÚ‘ò<ϳ¢Ø(ÈYrZMì‰×oÞ¹½µ»ÃÕ_e–y>ÝÞ ž¼s,‰jï¬ìf‡Ý^(@[]hmòTyÏ1ß¹¦i|×q>±ç¿M^¬QrÛc4TļÌçó®ëÖ77(66³Žw¤ÈwÁFAé¥X\øcòE޽Ô€™6½ù‰jX”n8ZLgì¼L²¸¯æu´[sr˜Ñ“±‚ïÉžËë¶m¹{±D½ÖÄÓ²¾¹ÆÙÙÕÕÕ'Np0s›‰Å vÎÕm'Œ YDTª7ØQcZ`¤s™O2·ˆèº.8bŸ›ÓÞrÆXbò³$JDE–#ö%ÅY–1äy~òäÉsçÎíííõŸ, – ÌvïÞX«ññWõW/\¸ðòË/ÿñÿñ[o}¿,ó'žxâÊ•+O=õÔÇ>öC?þø#<Ân7ÆÂ*–2Zk™0$[<`9Õ"¿ÒIÜ>uVx³dÐ]/Åà¨úáò‘z<Âú$Â×DFq.øñ Š,?È$,(ˆXP)£K"Æ¢NÊ‚}RM$`qg¬¨8`£bø‘“<95©§%ÿç(,g6ÄuIÚà} ãÒ‹"s“ Öû# Ts~ »jÒ˜µPlZXØ XU‡"u3 6FÃîÑ+.ŒÎ?µqÿÞ»ïÝl_}ÿÖ­iݨš†«g;œ†¼Ö!„V©Zkïý:¸6+\‰Áª@u@Mƒ7YÁ’Äw®ë:äš(‰ÊÈY †i{)–¾1¾FÖŒŠ8ЈÈÞ˜J¸Há›î ÙsÍœ‘³Ùlww÷úõëׯ_/Ërww—]7~yŠ(S^Žä³—™çùæ‰ ŽkÉZt‘{HÇÖ:"å˲<}úô¥K—ööö¬µ<¦iNžÜ\,'Nœ888°ÖþÂ/üÂïÿþïߺuë‹_üâ—¿üåïÿµ3gÎ\ºtéSŸúÔ'>ñ‰‹/<]DK¨”  Ž½Dض,õ6Ð’x!UÀ=B0Ï3¥´wŒÉÊÁÒXI # ýò!¢TÛCôÔÓyë‡ãŽ£È>ÂtøˆëØ`— ,©–I=¸àU$”Öš€J©œsΰ‡ˆZC¯V%t/w ±žÕÅš+Þ`Ì$‹b®Á%D~ò†ÀÌSx4ï€v¥³„ˆÂEK+„8jŒI‹Æ lIo(û-aÈZ( §'çë®5Æ 2ó¦õ´Úè1ìj­3•åX[´ˆ0xðº+”W PyPQK¤([XŹvB@ :'ʼèʺUƒ]›C 1t ðÐæuN¹t²6ØEðZTJ)oƒ‡zÛ™.+6¬¨îÀxÖMΑ ó¬ij¯êNwNy¯®TØFkÔCDe]T~0*ΖçŸÜ?¶:¸º1¹ûþƒ½½©«›€Á( tÞí5“•m¢2®wóÃÌÕNŽ[°gB µαӸ¤½U‘™Hd=ÿÆ%ƒ‡bëI³Õ4ÒEÙEºÞžëÿÆ^äÌ÷3  Q5*(Fééd‚ˆlHr[ÃÙl† A ç†C\/dsÃÚHG:S‰F¶}?гl‰0•ôÊÊŠRêäÉ“Ì05 Æk«&2´UUÅŸ¦iÚº§ à„XRU5˘å.ˆ¸º:ºråÊã?¾¾¾~öìÙ3gΜ9sæ±Ç»zõêƒö÷÷9xÎ͈è»ÀU×\›Ä ó,ËÖ××X¿²V10Û5­”3Ih”ˆ&“µ“'Ož={vww—)9G£Ñb±ØÙyÀƒýä'?¹±±ñ?ño¼ñÆ—¾ô¥¯~õ«ÛÛ»E‘=ÿüó«««/¾øâþè>ù䓃Áˆ³ ¼oDF³8KÿɺÐ%µ¶²¢‡–„÷>rYH¤WòjZkÆºŠªÖÂzã*›J”«K¨60ñ<Ä%Š=.™R!(rœßY+CÂ!,ŽNú1RsÄ{/|X„Çû½€$¡S™(,ÄŒ`Ó4nVo€XÖ1!Ñ@ø3"yŸù§ÒKV(¥²ŒÏŽEÔ^ cŒ±Ösí‘QÐ2TίÚêã=á©“åx?²,ç#.<ê÷*J,ª„¦J)e)ê÷pA*ï}×ù(ÏøúÞCÖȈwS(¡Õ2þ!Ú—…RéߣÉE66¬sMí1›noø€2óŽ tY²töÒ ™€Äÿëi€|†JB""­…Ãj§¾j T¹Þ.Úý`ÍÓ 3»ç12³.ñŒÞ/Ö÷9î©¡¢=MG[=r@¥-šQž[OÆ € €×y9À‘ ¢±¨ìˆïÐ… P‚ºè2°]Î9ظL¯´X,ºÐ©@H”keLVäåŠÒáÐ#a™kP5…à›l*ŸÂœŒÊN=Ò]|òðÅÏìnooo=˜ú–!;ìgB ~ì–Ì´îÎ'{óÉ´žìÏèàÐÝžÏl_:ì1óêY'I\±ÒÒ¨Š¢àEå[¯­­YkmžñcjÁõ°Æå´#•€]Éq†(θx<|D4§Ö%‹fccC)Õu1foo=ŪªtìpÀ`–þJ©áÊ€CÇÛaýÄXá±*ÕZÇãA1dw¹(ŠS§NqÖ¢(Þ¿{;D -®Mâ‚%F§Cã9\Ô\vÍy~&“Õ›7o~ç;ßÙØØØØØ8wîÜ£>úÒK/?ž_fggçÝwß½{÷.ÓSž%áæpÓx<æÖŠÌÅÃ&Å`0`’tÁX±ñ1¸Bmmí±ÇkÛ–ý㪪ÖÖÆ/^̲ìñÇ_]]½zõê—¾ô¥û·ÛÙÙ®2úìg?»±±ñÜsÏñQ—ÕT1óª#+™„âC,_‘HÆ4ã’RÍDÑe»Mp΂UQJùú£èžö>¢^r8«Ô |Ï'= ¥ÒŽ2°,S±„1•Œ.¶6k€¼‹ó‚xàPŠ‚«n–eÙá|&¥Éœ"áºà%W-~¤5¶i‘ãb% bè:¯LÀ¾Ø{ºï IDAT·#Mg ïÌå=xïÈ™¢ÓYD9YPò,I S'ð‹þ‡…)=*Hkm!V Sâ^+¥€z¥[·l4kÔ©¥"×üÿ|¯TšCbué+—0`—faÄ…ñõ!ô-a\ #£ÃÈÔ(ûDŽ<% *BlÕÅ çæÚ|–dæ2ˆÈœÒpÔwÿР‡bõ’Y¢’Í"ý`³JGý¢Î£0'‚Ð"Ô*THW'ÍÁmº±—íÌÂíñîaÑüÎð€¿Ö‚µ xÞ+“‘"@D3Ó\­"C8­îÚ¢ôä08F).´ýÐ . Ð18;”¶]×V{I‰J¾X”‹…sηMè:|Ђ™#?µ9( ÃQa­nêÚ¹¤œóe1„Ãç·ËN·íÊtvwçA»1b—}çççgvÇfçÂøæåíõÑêŠÕ–ò ¦}È0ô9)^nãã",¾÷ŸPq­‚P–eÓµmdQfÄ)õ8ψOÉbã¹>êm…£$öTRèI1M%²u04±9èêê*ó_. y ‹l®‹ånzÜ*ÎÆ¾÷üÄýý}.ðî*NWY_SÅd2išfoo±µìas?(áý9ØÛmIs¶¨Dµ°›ÎSôî»ïXk™Å“ñÉŒlzæ™g˜£c:®­­Ý¸qƒSÂÁ«‘qѼ:\NÃÒ„CÓÜcog·m[n‰á#5Ǧˆh0\ºt©?ê!´m{òäæ¹sç._¾üÞ{ï}ýë_ÿ›¿ù.UÊ2{ùòåÓ§OþóŸ¿|ùò… ¶··WWW···!†»ˆ"½@]ׯ¦¡æ%˜bå·($ш¢3x]„'œ“gRßÌ…ÿê(Gt*’DÆñ&RïJÒ„!o›*ÔT ˆ{ÄŸ©šZ$¯ ¦1é_Ë6мZ©ÃÍÛ˜ÇÛ{®D=`"ÒZóûðÇ(–>CD¤ò^pó!UÁ{߸ÆW•5ÊH(›Ï–òžœóàõCÈ•$6 QŠ™f1Gޏ_ý/ì'#†ôÈóÙÓ’H;Gø¯Ž•åg‘¤,—‰ðÃ÷¾äÎ2ˆ˜aH©+‰DìHÚùØ+…¼'váT_⯎QÒM(C̓1úåb©ºì n“¬#> D0 JatéÿOK=}lº  "3©'ËD ËQáÒða~ÀcîçS#(R '`j€9úÅÿóïûwïÔ‡‡Êg#0 Ûõx¦ ‘%¥ ð~¥n‰ˆÃûýžô)[&¡ˆ@)"í®«qI… |°F@¼¶æÀÔé²Êì)•9 ÆD]· ¢Ñ\Ñ…ÂmuÁµÎ;§½ÚÁ¢[_tí¼kÀ9È¡åj«4è0€"÷]滀®ó»Më©ÌË3S×µ#§íp¸²retz>ŸO§SêvªªÒ  éÝüöØ .]›Ö¯ßÜuïì©Ã~rü?ýÐú?£_té®3À@*­5û¾D”ç¹F ò¼4ÆôĘ!loïšL³ïËÝšÚHþg”]]Y€,ËN8íœëœ[Ì*ÞÖÆetWõü‘ ôÅ ´IÏ .‹…‰u(¦ºó}ðàÁd²Z×uY–“ÉjUUYf›¦á02"2œ˜Í#mMW-Z×5]Û4Mžç(íîï Fåxm•6û=EQœ>}z>Ÿ¿óÎ;ÿðÿðo|ãÖ­[­ë6OžÐhžþã?õS?õÄO;w®iks­-‡¸Ê²4±_Ëܾ䈊xƦÓiÓÕÜ”‚µ÷ã$úd²¾:k­×(ÐJk^R ­FvýT™xƒÃ<ñ&i „ˆìÃIM°P²L§S6Úx¯6Ms8ÛëRsãÉ:× D£zjhkmQ ˆ°i:k-’ !h£ 8R •V®u&3!ÍÅÍÞ+ Pè‚GD6òÄ*ÚØØhšf~8m›¦ª*Váãñ8˲étêZ_dI‘òÐu]‡nP ÛÈîË'ËÄþ†v­©¼¦Y7°v/t!ÜogO Átv¨\ë¬ÒdLp^‡649r¼´W*J)¶€iuuµ(FÁë¦UJ™€Êƒuj­µ²Ák €Yf³•ÒÞù¶kÀ“)¥T‡è4éÐzÀ¼, D캦iæ`ËF @€]^¨ñdØÍçsT@O*xpf™Î€©ÛVÖPfÉyÐØuݼnºf¡5CdÉv1ÉZMATÔX¯Éì‡*Õ—±ÊB¥•Ò€ˆès.t¢Fmµ dspê’ñškÔB‚€® €]ò<7Æ"¢FSdZºµ[¥m®‰(øàCЙe\Qalf2ºƒà½ÃàÙ6ª7\@¡sλÀÞK­Í¼Ck8ç‰Áje) ÒÊ{oìp0\++mÛhT5‡.˲ ‚γ!`(‹Œeá')Q›Üf­±ä‚3h2¯ïk¸ÜŒ^ÂÜýþÕùßýêàAF³QˆJ‘1‡é›Á“çF)ï\CÁÌ køÀ¹R0™SÀ””D€DH Pµ0µ&0O@X³bë9"òÌ—\¢k@ÎKÞ‚e'x4‚¶[+«EU•‡³l:BÛ ÆÔÎw¡%km=›å]nŒï½¼@à°ó+Vcfœs‚²iXæzm<ÜX[á4bÛvkƒÍ®ëvµS«*svne_} _û÷þ—Vfóÿþ~¸¼Z®å{‹ýGîЭ+ËþS…—°ë!(- V„À|ƒÁ ˲ñx¼±±Á½ü&ÌçÀ?‚ŒE*Ï"r1+`ö›¦áp=×õ²öÊ㪪f>Ÿ3~›õ÷ÎÎεk×÷nÞ¼yòäÉ .<ùä“=öØÆÆÆÖÖÖpX²ÿ´¿¿ïbo~ôÞÞÞl6cFCöõ···«ªbÏžƒ!–Iø]k½¾¾ÎéùªªÞ|óÍÝÝÝk×®]»víÁƒŒ™L&?üñ^xá…üã›››ü-)/ “ø­5V¬õªª8°/I/ˆ5ÇRžZ²¸é?ÅÂÅ1–=ƒI=’¤K1LÏéb¯CÖú¬V‹3–@4<¹îH†À] Uíi¬2}7 ô‰.Ÿ÷‘7 o*ÞÂ#8¬,Ë2ƒ²©x™qgg§ó-óy¥¥,¼gœq¤ˆbtÝ¡ò&NZz¾$(ú! )Æ´—_¡å•úܽ策0l¥†@‚’Kׂo" H>IG]Õ>/ >kLíô…1I/ã•}òÁ냠þÁ$]|R–®ålƒJZc€ÒKng.›aúOËHÀRºà’Ô{À¢Â£ûȬþ¶j)1Á`+–ºy®bn[ë#>.ØØ–Š0-I ?<9L€àAe¶4z+§Ý·¯ï¼õN}¸›?dQx_ 5‚¼ÃGÄ¿e_ÑѸ‡}þØa }…Ør°ÇæÿÃßS+fPPJÍçsî<èœËlΖ:C‚ø²Ö„L/Ë%Ñ( †`e4ιá`0(ËÕ••étº?›òžÑÆh¡. Úù÷·V{zðÌ#U=­šzbKUÁ$va“ÞdD}´ŠsN,V²,›W3Ìr奊És®ýeì#§‡bÑÁKÙš€ýLrI8:]$9±Æ¦Râ2›Åb1ÚqT–¥RUUìñפÀ!\Dìºî±Ç“1–e¹²²BD¬•@˜¥ëŸŠ”1¬¼ÙÅá“ü7çVÙ‹Ò± !‹~Œ%.YÖ«ÿ¦iæ³Ù ªª÷ßÿ`oÿÂ… gΜÙÚÚÊóüãÿ8g»ïÝ»3«ªb9%íåçUϳØ4 ³íps.HxïªÍ%žüÞ—MÓœ8q‚_æöíÛ¯¿þúöö6³^+¥x*üñOúÓ?üÃ?|éÒ%‰]SDÌKHM%áMŠ YÙ ÛÛÛcª™~^#6•ûÃs®S,U|[mUúWÙ«œtP1Í<\’‘IŠÁD¤µ0½0G±#¯Š‘á’’Ä[jIàRÓ¤¢DE€7"–eÉ€ ºð>Éóœ»ÿö$Ì­—ÌkÛ¶Œ|œÍfU]Íçóù|Y–IM 1 <Ë•Î+†;aUŒç å=õCâÔÅÂ2ˆ·©L Œ…w»"ðÞ[m¸Jˆ˜¸âŸq@J©pÇRHÉ{¡ÕEÁIA,Sü±}LKÁ¥€UR´sô[Ë/ªTJaž,ƒð²PõÕDD€yžZëàºtÊsùÃZk†ÕæxêD1‰ðŠò­TLÉclu`­5YfŒaE³ÍÉ‚#h|¹$»·|boÄ|ø<•cM¾°á¢Úù—ïUï\«ü"W®‚Ówƒ#›?üþ©îkVÈH­D’}žþI&_ì¼O •ñºÓ 8:åÐALñøÜ™8.~ €QJ©Î÷ä}mÛ2éòÚÚÚþþþhw÷`6],Þ“óÞ*Ýä²·ÞoÖN/½d¿_uä6Ìp±êò¦32S:^=º/ È#^]–U³`}ÀÔ’ò®}õptFÅ NLj§„¡ ‰%xlÞe–…¯€¥íxŸ·u3N™©Šÿzúôi6wØê%`´ÓÕ‚SïY–-‹ ŒI&ñŒÒÊÚšÁhEQ°kuýúõ«W¯²=1™L8‰»±±qåÊ•'žx‚i&Y÷›ÈÌ?‹œbëÊ9W5µ‹§ө´Ç±±-§6¸|9“ætGUòƒN‘.t¢9<Ë{ƒMÙ* :s±ù‹?úžH¶4dGêš Á-CâØé„ÇQÄR ¥Ç^%Æ6…܈X÷‡HÕËL®ŒÒ÷]`½K1ÀÎ çójÆyk9Œ½¥¯ÑZ‹y®ôòªˆÆ¢„RJ¡‚—?ËdíÒŒK¾6JJ]{{Ÿ³Ïà SŽŸä½¿ÿ>‡÷9ؾ¾¾Î¬ìU·äX-‚±-%9Ú~>Cøÿäcâ0¥×Ãtö1,7ï*­= #PPe‘ܽ_’L‹!—è ¹¹xÒúæ  –<¬wC¤0„0Z$jU’%ÐZ+N$¥b0‰crü$rmK!@¾ë¬5éH?8-2¾gãúðyV:³!´DûÕâ ½§¯¿7xpàOæÐ|øçC¬…I—&<œëØ âÒ¹ï_òØ ü^H rØSÃNDLJ>×sý·Ñ,c‡ÔCÚ¦oÜÎOaó]Ò[LkC¾w6 *Ô} cžY†6OœØÝݽ¿ýàà`ºX,Bš´Özc꼿uóâé'ò°-j?±¥D°Ž¨ÀBpýiLK‰$ÿ'øRˆ|¶á:A€éÍùgÑŽénKM¿TómIgñF#.Øe‹ý?–Ñ‚ôaÒµÖmÛ¾÷Þ{²Äntˆ™­5ç8yëó^—tµo«zgþ|îØH{"=˽«…šNPß “H²|óaÒó#®‡}EÄññuŒf ºôÛ|²ô ý}úuQ` ó‚bÏ`‚>À¹ÞaóÌ ˆ\þÆÀ`¥”¶G:Û‹Ø[«ˆ}9†¶HÔá÷|¸º®ËM!ƒ=¦‰SÃQ®‡í¤µ­‘ö]}çÁ¥Ê• £¦€)©¡OÆrÉ&át+ü`@>ó¡ãýˆg…\Ûó¿2ì©®ëÃ0…xxJùD‘5&dÙÿËØ›5Ivg‚îg¹Kì‘{í¨€(J¤(jºE©[6²yÐ<ôƒþæŒÕõpHm¤ & ‚ ¶Ú3³232Ö»žÅçÁ㜼™Ué –™q—s|ùüóÏ% @dàÂ)!M{ÕþãœC‚~ÞŒDš%yž_Žóù|¹\×Mã½ßòl¾Ú4Nú¸jlÝT‰Ù…|;ık}øˆÀ` ‡ãš‹®,â×y‹ÑJ×qŠ{PuåÓ“ëî|ßV· …r¯BN¸u„ta웆º®YTòñãÇÜVÔ4ÍãÇ9bàz¤÷žó[b§îÛï÷£·Ž?Ü0âì‡\„bL›q`¦asŠ)„šÏççççÞûÅba:%1&õþò—¿¼¸¸àváGÞ¹ÿþp8d£ÆÃêº~u~¶X,æó9PˆÈN—Í.$åœÛl6ÜÆ7.l !ØkrãU*è}2®‚ˆì60$þzÅ…1öªªŠ²ˆµg šJDÄ™];‡5$D ßvÍb7£ ÄšûâÜH¡ÑÐ6ï=[ŒÍD§È©°5¹h­¶^Ö]C®âcõŠ t¼÷Ç×}(ÓPô ¼ˆlpDäùY–­×k¡ ¹ùŒ¬ÁÂx£)±‰…÷FÉ;ÊÁöª=Š®•ëú•· †I[ ¤íó"çÒMÌO¡\ÏÓ4¥^Ú¦)×Û™%¨UÔW¡óJaá*#Œ†¢ ïóS‹q K…]ü¶£ëEºþV‹9@Ç "²þŠB à¶ßf®ž~;Å窹¹{V>yï% #|É<ˆ=":Øî”ÛÈ: yé !˜'½o/˹Ba[y¯Ÿè¤»­nܼ~ÀÕ’~ó-7Þ ¡„uO‰Ï. uBÆvX׎î  ùÙ1ÿo=bôÃÁ:µ•1¦«¿ßˆ¯…ËÝw½ñëÒ4qα K´Ö%§±‘u Úó(¥Sç=`D¶ ;dz5Y’îO&“ËÉäü|6›Í6EaU3E•Ô níÒÙYC”ziM«ºVÏu&zʰÑådˆÍÜ Û$CÛ_ôÖl%㧬c:˸ì4?ðGQh …@¼âµ ݃hA¢÷&ÏZgí¶ùgµZq’º\.Ùq„È 1†9œ—@ŒflN=¹=É{‡GsCD̺â·ÄÊ1;3~#ßXž („Ð:].—gggLí>>>ÞæÁ€Œrxï_½zõêÕ«óóó¶­™w}pp0 Ò4]­V§§§Ì}ç…r~~ÎodÔÁ‡¦/"âeQUÕp8dÐ`0˜ÏçCæ¸ïòò’©@ì)Û¶½¼¼d,寣‰˜—)»ðªªf—3nŽÏ+R‘€Æ¡:üJ|¦¾ChŠë*n-"òàbXsîîŲ: s|¬µŒüs%"r¾â)uVQ@qñµ,¹íuãÂ&Ãwú‹8øÃ€GQÿ­ëZv"²i–eŠÑhį_…¢7ȹ‚ÀŠÊQÓ@òõúÚȆ7)Âëó€¯ùào4yRJቈ<;à­ÝŒÖ€:Sëºn›¦mÛbµæVx•mûúXÌ•í€÷>Ž"¥1Ú–§GóNï=t•L^«¯ß8º®ýÆCùæKî>M.­^¥k–¼7 A‘sÞ9ÇŽ6ˆFó§ñ›·]C7|¬ñ[‹lÙÐ…3u"øB!õ–ƒG‡ëN%Ä»ÛòzfX.ÏóD'¼a­µl(¸&E¼ðnü{À[tÞÙf ó¯f%’ÐRÚoªÍËŽ¶„0âm˜®G·Ñw]âø–"¾¥ëƒàºÛvî­Ê#J)%ÂHÜ2ræÆ>Ï3$x˜›NÒ4Õ’X‘B!Q¸Ö€B¢'ë9«IT_qæÓïçëuaF«ÝFÈÓµøîN_ç˜øçÈø«iH> ÷ed½íâ3ÑrŠiÃëyѬ[|êÌâ ë@Ÿáš±ˆK0Æþ.L‰±ÝFç² êùÛCV:›ÍØ"h­çó9§Aìc›2CÙ1°ùŽED& ÖuEº}™ü9ì̸äWŒs.О+¦Ò ‡Ã^¯7în6›ù|Î‚ŽŸþù‹/ÎÎΪ¢ä¾j>¬µOŸ>Ïç<åA1™Lvwwù«ó<_,———ˆÈÔ_¾ØétÊ^‡Xv«Æ˜õzÍ0{žçëõÚ‡áqDT–åf³aïŽapæz½ÞßßïÖÑ!àKñ ›p°Ãfæ3p’ÇÈu³Ë@¬SAÐBi\]ëŒ.…~Sa&¯.98ìHœ†§óæ¿’lcl#Ì’—‹ ­D¢Rö7ßptå7?ÓnH}pl3»q`'Ö×¼}¾í«[c¶cÊŒ1.(’ŠäJ0±,Ë8Î=5žŒ1ZHÊs‰B$ˆˆž¶µ?6ò|ÿ¹fìœkš¥Ð*Ù›îôûýº®gõrñéÙüÅ G½É`ä°íoÚ*±Š‡¨ÌEâRZ"’R,Y§јf½^WE žÀ9¯™Ÿí < …y?Œú‹ÕÜzc½1Æ´v«õW ‡iš‚ßrke§'½ic¶“tyc_Á•裌C»›Í¦¬‹ÖúƸuQµÖ ­½÷Æ‘õÀymQý~½^ïííÇc¥ÔÞÞ·ˆp¿G‘›ÍÆ[GèË¢àA¶UQò 7Þ!bQgggD¤µæ6›DéÉd¢„4M»Z,±2Íx²,{ýétJDÌUÇû»———åa9ŽÈùÉôôþƒßþö·¿ûÝo‹¢­¥µŽˆÜz½üøãÿé=H©¥Ô}ôÑýûï¡ÎÏg—³¢(vww9³\.—©°Yg‰Vêàâ·Š ‡Ã“““{÷îqœ%±»mš†KéRœ]¼º÷à. Yo‘Ìv‡³¿ÔZ;²«ÍrµZE":gäìó˜m>È$Éò¼ÃvNô]Gf’?“€" ž¹+ã )ç³4å%2䛦9??gE‹º®çóù|>gœeY/Ëûyã­é–”çy¿?ÖZ ‘(•ĸ­¯KÌæa,DÄ£¶ÆQl•A rÞCÓ˜¢(t˜=Ç6(MSnicš%Ï&ád…C¥ùòr<½óèÁ$¢Þ oª6¦ýÁ€{‚)¥l[‹2)Öm#.ªuÛ¶¢"%ÀH Òz­ÒVi*ñj {@NJAD@¤BG²,÷ÎUe¡æ±+žHzäeÔ4I¥R-…!°mmªÆ¶­3–ˆHhì%9Ak­±¶mšª,‹ÍFJìïÙ™+ÉÒu±‰ª5ÑoyŽ¿BD‡WšØÝƒ­'v¡ $zr¼ð”$)Ñ;`ÒPûØæ¼ïD¢z½žT’,I¢½ƒ¶m©DÂRà½÷’È;ÛnOFJ j[þ#G~ tªŒÒ’¡V¢´ÊÒ4ï÷†ƒa¯ßÏ“Di­—Ëå¦\ …I¦kAPš'ï=«ÎñÊám›¦ ´ÖÍ¥xIºã’ĵÆ:Û[:œæÒ˃[¹<âÝ Öýªò‚”P‚£¨—÷FI©¤W,¸„BhgÑÂaþ(ËEÙ¾ìçûëêë,«¥}lÝ—ÞôûùѪú"½Ð5¼rh2} µ,”Öå¨h Ñ;W~"%™ÉN¯X¯ŠºØ›î•åÆŠÓÔÿH«lÑüjÚrœh yaúeÒ i5Mµï­Zð³8êg/ÕN`!I$I¨Új&ú‡Òá4¼ÚÃɸ6JÕI*늎[{à äºv}±ß›´F-[kzxQªü\ù•)ÚôN¥/P ! ¤užfÙƒoÙ»µ~öà?ݽý9O IDATtñâRŽÝ¥Q1²AL|k$WU1EvA̶Ûfi&ІɃ1…¿‘Ó@€¥Úv¤Éëó5Ùº '‚Ò¦gƒÆalðàj(s”êºöÖ*Åö´6²áKÓôÖ­[œƒÆöY.¦.ç Î3€Qåm†À¸—ë(h6eIÊ5|Þð‘èx~~A ŒyãQc„s"â¼s0cÊrs||¼ZmŒ‰½§`­?99á® 3‘Ò4=<<¼¸<… vBÎ9.‚²;äÛŽˆŒ¥DA|~@œËò­`¢ ì&‘ñƒº©cÆ‹¦´œªÎÁq¢ë°å9†KTÊ.:Ø#¶]xª GÇ®ÃJlP꺮ªj±X8çêº^­V‹Å‚ÛÏ —屦0'“É–/ÚÈÐ&„añëºHø +¿}¥ó3°+^þõO„À&cÉ.4ð²AÚž /ZFÚ Ø,6®¡õ¬®ÚËæ‹2‘ý×á½èlb5n럸À~Ëu!†¼ô«hÜ…ó6`·%­<%.N_+èp]–¥Òé iø¹û@ãà('š‘n†„ˆ@W ¤Øjl]Cþ¯­ D†TQë¦A7òÑ®¦7‘i·ÏWh)œÁ9)¼C¦ _!‚ñCnÝOQœ9,ïx!"HcvS@ÿ¦qŠ"Pë¹És0°÷BD±9ÙiÿEÜ޹|¼~àŽ·ýÙ–fï=ãFÈì0)¯¨¼øZ†ã½õÅzY½Ðé©”z¨ïÚz]lJݯDb”¤4Q#1ÉäÔ¶=™x[7oå©V=zý~Ò?,Vk^Huå‘ú=Õ·eâ7ž<ëŸÍêeµž©hh|èÞë.ýø³ÅdèI."fÎ'cžŒj2æ=?íwÆ{þ r‰î¿®kk·5WcLœ'„ ÜŽ¦áÚØ`0pÎ-‹‹ÓWëù¢)ʶ¬ óÞîxÂ)odíGäá†9‡‹Â Œ}oÐgÅ+ @"›ÔÕjµ»»{ttÄ)ƒ½>P´'WJEGÎÈ”(çÜh4 ³ j)å³gÏŠ¢ð~ÛˆAιgÏž±æ`0à =º¸<çÛËun^”<—{Ÿøô¸m×{Ï%g~@m~Œˆãñ˜ÅL¸à± ~ã9‰£ÑȇI½”óøØmÄż1MSœ< ò´ÇN|Ç&&¦A7¶½Ù]*Ñåó¦ŽÔ-dA///ù4øÂÙ“±Œèd2aúSÐùA¨$í˜øÙ0p\ ùNÅäu WºWü±) šQNñYˆ yQãQ‘ Á·1I’étº½|üàØS9w9{U×m»^W%•®L­Mä–`DoBÛäuâ$v:‚ 8‰ý¢s„@l†{œ'’$É’$O•hf5‰=}<[­V(Ô`4„0ÇÌÁ2®%uãò­3†«²T÷ô®j×û}Äë ¯ß¤ßp&7\J þn¼‹¤dKŶkK…Ïpû![˜ ml6‘‹¾Ýè!FñÒÄužAL~ pÄÁŲÑh”å À6â;[ ®…#ׯú›}pØ"I!„¸°³S…(¥W'Ï”>%±ûÈ(øm“(MJB–æÕj™kÝ4;Óål6í¥“¦ÎÔT»Î6 5Ù͇ãÆÑHÀD¦{LeTeÎ6îUŠG(•j*¯Ä0K²º^h¥}ý|™ tQmLÛ$Y/ä•9õöþf.GƒÓ|àwõ¡ÈZċ͹O€=AK µ’Cçq4Z+ô¦9trÐï#ä„uOÚÑúBNv “ùEcí¾¿SžÓþb8š 4‰{Ï›ÊÍtX¸õEwk+ “çi¢“äVú£?þ£ù­ù×§wz—[n*†±B"F¶KÈ€ÙWEï˶FuF¨2Y— ŸÜºÃÛ/Ò_ã²àó³öª–àC‡{Y–McØO8çxjì6È·’\-ã=\–åâr^¬7¦m±ƒ^_Jy°·÷ö»÷ïŽF#t¤€ûtYä9ªH²Z!ó¢‰nVþ‘ó*ÎöØ’òŽC>ÃXf2fWì~˜ÑÚµé<ˆ‚Rô¶–v||<›]]ùà¦iNNNñðððÁƒ\ ><<œÍfÜÌw2:ÎÅbADÌd"O4â<޾,KVÑb„|2™œŸŸ3¢Î©ª*¦jF#>sØÝ> ø0§vK^H¶s‘ù^1y-Ïó^Ö縇¸]o¤ ñˆ#FuáÃ|^x¼öˆ-I cìîî°ªè`0à „Ò¯[" *µñõxn72›+»&®Ô¸âÆq}i l DäÕÅÂgÎúk<ÛŠ‰|QÒh2šÆŒC3E`W°÷êl¥˜²Þdµtí>^n‘b¶‘÷Þyï„ CâjŠ h­ûi>Gƒ~šg–lÓ4EQñ3Šý÷…$iÅ;ÆÑñwÍ@‡0…oT¬£Óí^Q÷¸ñ"† øÆÎ½öÛëûúm6/¿×¶ºN‰ˆ‹Dxá­õ €A ’ˆ¬ôðc´WÈ·|¨‹ñ!COÖ²mkŽ;yEîg÷áFKû ·±{¢¾ZØO£ÀWŠ¡_)?8)e’h)®®+n¨+쥨èaj²º|6}ølrxÑëËïì?sfúÛŸï-/„RùpX~ôÛ?ø³§ÅjÝV=T¨2S•½Ë“÷–·‹bd¬­…VŽ|"”@ëivë0Û9œ‰ÑO½[³Ç0Ÿ©ÙêŒÚo™ÅNïÿw³øÑhПÞ~)†_õ¦'åÉý‹õ¬ÈzçP(DOd<r]’dë[÷ká*l…È“T«¡ñÃ|8ÂfóÁÖRôþù'ùºzÜGñûèoÿ/Ç¢g]ÍÅ·ç§{/Ž]=»~îG6œ£sFi0­M<¸wçîøhr4|p«Ppµ¯Ê-¢Ó‘ ]à1ûˆ(™ƒtFnye¨06¸‡v×ÿAlt‰èâz]t%¸Ëó<Íß™´Ã¾!2Ù*íîî&IrçÎ{÷îݹ{‡›‹ˆˆW^…ì·¢&~¬O³ïÜfK¬CÄ<Ë™aÈ«SµÎhM‘­wæ•uÅJa´2ÉùYlŒfšñx<¾uëVÛÖüOî9^¯ ïg„3JyvvöÛßþöÎ;»»»Y–ݽ{÷øø˜¸èÈ×¾Z­”R,ŠéÃäŒxÚlD˜%¥ÜÝÝ^BŽËñÓb±8;;ÛÛÛÛÙÙq¡Î…®âÜÉ0l Û•«ƒÜ]tN41|à¯ECsÃÊH­"b×$B„¼h+ðÉAÞf³aüœ¡u¾‡ƒÁ`oooŸiál×6¾Y*Z¦è†±ÓR7E×ZÅÓ»áT ÓÂÄ„;» pøË²ÔZïìì0*Na^k˜ˆ-),õ½Å¹>ߨ$I¤l· o•%§Ü ¦ØÉ‡Þhè‘õ¿¹‰Õ9ç¼5äµÖ s|äöYH!¥Öƒ^6ê FƒÁ —«DצæòS Ú¶eò- ‘ž){C%ˆ7£¼Î•%¢kb˜W÷ýÍ7ÿ?îWn¼ëõ[Ô=:Þ‹,! "B !… {äF…@¼*¸€{&¯ên¾C󖯵~ÄSŠ×aÈø ñ$Ûj¹„ökħÞ6sá›n_° ˜í›„+w@ªJ„ … €­û×Z ¼* ijEÄ$í\”ó‡·Ä;Îê¶ž¿:úͯÍt²¿^fYò¾¢6½ü`¹.Z„oYê Q&_|þ‹;Ͼþ@f“ÉÑÉ;ï4¾ýæúégï{ÜDëDpU%b\„œƒDÊt î Äv<8\ß«¤ÐñÉö.–M˜…Çï8ɈøíUÇVwŽ×—¾ RJ«Õêòr±\./// ( ƽ÷ƒQ?v¯²ÏcËîÈ[ï ò¼˜ÐÄ~¨( •耒ÊkwTìÎ7›W…EQ" )…” ™:g­1­¿V[e㮵ÎGýa?æýTëmÄPWeY² X òâþŠQ2"ú[•9ƒ‘ÄËnX)öÊøøëåáFém¥0ÝXoÝ'{ãŸÝ€²û±"œ-_‘ ò¬lÍ×zlÀ‚)¥@$ô(@ aoù£Ã~ÍõRÀ*âßÜpÀ|g{CAUUDh„iœÆD?çõ |ãÁ†Bv h"Bï©ó‘ú@<AJ)$“õ”B7Ýýûí½Âa¡ûîèá)ÈòôùíÓ¯¾—N?i›¤i…5Z£œè÷ag¿yñåíåJÔu«úEÕVÂõruWØ» /¥÷V$ÚÛZÐfw¿MËŸýãíËóÓÔª;åÝw¿›Þ­^=·ø>ÑËÁÐ Ôç§wOŸ¦½¢eû÷fýae­2V $R¤ô䜩 ÞÏGËTõ+7DŸKe½\ßX´[˜ç¿×ïï Û®æ_Ëž˜-v拾Y©Ñ¨ ›\×U|èÞûغÖ4Î ë=z-´%½<ï ¡š0®‹VAÈM9¼Íf«Õ*¶~ršË¤Óáp;ybûow«Ø ^᯳Xá-Bm¬œ<ŸÏÏÎ.f³w¸ŽÇcVwâr)ç»D4 &“ Ÿjå:Pr²·;wö'{»ûûû,cˆHöfËW6Ÿ^]V*Z@ÌõÓ<›N§ÿòË/?ýôÓÝÝÝïïìììíí]^^ÊЦՆiŒ|öööD˜¸Þëõ¸8Ç=²Ì Bܾ}{6›íììÌçóHg„¼×ëm6!Ãï|n2tÕuÝuÀñ·œƒ2bÁ7$:c6%ñ2¡c›°ƒ¾ÄUëBO-4M0{_^„‘„ÂìÉdÂjˆ|ÑÒq¦”âY¡ØÉq·v™®T ã*âf¡ñÊ–½6ª¡ûs¼ âê|>”ˆmòàHöÓƒÁ€—"òcåæõ¦î[k7`»»‰Î|ãŲJd‚o¹ð@®b $‘íö q²µÖybÚ¶Öz8ûy®Sb™9Ú6#°8 /ÑQz2Ös` ¢£¦¡£ˆ‘°'&o<]™¸$¼¿Ržêžö ×çÚýÕ WŒ9:¼7Þ1J DðÉKP’§-`ˆþf¿íªÚž&ÀVÍY©+þ¦ º¼—~íAl»³°£>Í¿å‡Ò4Íf³i èÛ¶Žd찇뾖^;ÞºPÞA >lzíÞ‘RK¥;ó{ˆÂœ"Dï¶`{Ûš ú½> ö^ f/žèçOöe"ÛÕ$˜él5:X":ší˜2-/<%SÂÛJ€ÔǨ–"ýyÛ¼”Íÿ¢4à‘„±"ÍõîÎȵÏlûß÷*³ØYÏ?Aõdçγùlr>?ßÝN§M¢Ç®úN–å*]—kÕR=˜Te¥ÍÊ•B(D#¤'çÀ› ¯Ç»›ÑEY] mc1Yìï·wî ¬ïRºuëÖÒ*U5u¿Ñ{Né𤪪§Õ{Úlç%¦ÿ*Ìû‚)^Û0½k=zå,ÔmËD¦‚Tµ÷¡¥Œ˜FDüà‹Åz½Žõ×&Ìåe›Ë¥,Æœ»jˆ +Ò.¢9€ëF0â*L®™Íf"n¸‚ý%;­étªÂ ZxÔÌSˆ£8à²%Ï)bbˆ‚tgËd¢h²Ùû2±¶µf:r‘õäääòòòôôt6›-ç‹étÊrWƒÁ`:Þ¾};MÓ¬—‹Pød­Áx7b^Ý 1F$ÉÞÞÞ»ï¾ mÛ. c¶ŠœOœžž>{öìéÓ§,îÁÙó¼XÚšn&Nû éÅWÄò‡mÛN&¾üýý}¶ïý~_kÍì6~"J)n^â$Lk«¿ÚÄãCŒÍÓ1‡@0qa0*|{ù£(ˆ<\mì¦Ä¯k£t&[±õágKÔ¬Îåç.TÈÑ":wÕÑÞµSQá*Þ5ýñ<ñúl×î¯|‡Pƒ¡˜Í$F&( ¯¼´¸ú®µænàø 54EQÌf³ù|NaÒ6çÇZëÑh”èa[µÆ kѺ· m«‰]ïrcò ÝKã1dsŽÏœkLJ(³ÝÆžc)c®àeŽ¿™ß´[mp)¥êhJóŸuÛùŸÎ8òWeÚÁ ½!—EDÿZb‡¡ôØ}^7œ\÷·ñnàuèC-YŽ-ìáõ[·½Ÿ×6…¸z]tÕ¶;5—¸Àn&$ôº{z>0CËFǘ ÓB¼rc?çÆ}xýÀë\Ø^ÿcòWÈ ™¢F_ø¶OÈÜÕ™€V¨“Á0]-'E·Þÿ¤]Ô­Ü36m 8k¥«³Þ©ýý'dKµðIÛ$š¦#QݶT¦=a¬'ÖH=Žú¾.¾¸l>i@ÿ­ZT˶]{ó½ÝÁGÖÿ W—´\”ø] m[ü‘ {i¯– ½÷äQh‚=¢WbßäÀ¸ÉÔû¶­u.Ó…1åâÅ$¿½3 ^½z’˜v’~çlQö0Ï=µÖ»DgÊÞ]=ûPïU’ ®G!úÉPáÚ á=TeÝS¹ÚÖ Ø4³“cBæ¶a–›4ÎES,J$ῲ*j‡xðàÃd}út0™öÆ}záWëËép4Ðøîíý[ûÓ[ã>3Dʲd Õ˲<:8ä^£¶n¼u»»»ý¼÷tõTëÔ9—$Y’dÞûªj–ËõÓ§ÏÏggι¢(^¾|ùé§Ÿ~ñÅ«å$^µ/“€úýþ;ï¼s÷îÝ>øàwÞ9::ÚÝÝåRëàÎý1.,8ÅÛŒ SιÝÝ] uÁ¯¾z Ï]–å'Ÿ|rppð?ýÙ_ÿõ_§:9~ñ²­›ÅbÑÖiZcÍz½LjøÁDTVJÉÄ«år9™LXùgõ°*s“Uœµ|üâäøÎIþnO ½*Öyž{r‰¯W«¦ªë²âÞ'®Âöz½ÑhÔËr%d¿ßWBªD’óN(Ô©B DÞz£ J*´P×5‘@TÆ˜í¦•à-9-!yä" ðè-ÇTgY’ @/ý ? †ý¼×Ëòa¦9‰í7†ZÁ{"·-ÊE§³·À‚'ðàP‚PHD„ÞY€4ðí:Häµ–Dä½MÓ@yoi$ ¨¥Ê’4Õ ØÖÀD¥Îø£ƒ[———GGG'''Yž7U+„X.—ˆÈÍlÛ6P"×¶µsæòò˜f;@)Iw0¡½ýçnGx«÷Åù™J[¨Sµ¶0h\®5eýÚä‚,¤[ø!’}!_µs`ËFkŸe™¢m[G H¯ú©L…÷Mˆãá`:ôzJ +Б‹¦EëÉsÑ$H!=ù¢.ˆö†=T˜eYS AåY‚ ÉS]+çd–lý+p’GdMkZë÷Þyg¼@HPHO¥1’èDð”i¦lÓD”BZk-€!…B`ðCÎ{-y¼±$ê©èˆ@BסÇÓÖmײ!¢‘§4Ôu-HPÛ¶(¥1Öë½OôhˆÀ¢VJ" ¥T"°V¢iÛ®?¶al«½ Âr£—ÉPI‚°1ŽGx‘TÊ«Ýýý,ËTšÈD{c•9ç¤RPK‰ŽŒqÂz¥¤V*W‰µÖ™íoŽ3¤–Î9é%4žhP=;a«¦@‚ï²slßZçZA Jö3$%wf{!A") -„äþò¿y›öqçáý§/¾x'›~†Énm«·¦¢’~ôÓÃæý> Y ‰‹Tެþøâä¹HÖušäI’qa]kE`Œ©­ ¤È2ˆ ¶º¨ZWKe;£[)´¥k­ÛUÑ•e¹®6‹f#„0Þ—K`línæ´[™ÚXkE«´%¨P7R‘£ôÞ'(êÊ9Æ sZë,cz¤@U!¢w¾m[±xaŠ¢9;«_½ògöì…©*(Kœçýä½üÞÑ⢪jôV`ï^6=Ú=‹âdý…Ø8_:×Rã±NÒª?XÙ°ÿ MÙ“ñæä£(Šƒ½}ÎHX$KS¼ ™?<›Í?~üÕW_½xñbµZýóÏÿ‰Û-¶}ÒnNF2*ÿÓZ»X,-ø‡ø‡<ÏYÒùáÇ~øá»ï¾Û¶-'îÄæ[–)€–,˜5Ÿ/×ëuì³$¢óóóßýîw÷îÝyòäI¿ßôè P0™Dòã‹exDœÍf -¬×kž£ ñÀwïÞÍfËå’Ÿ¾RŠÙ@‹Å‚)] þ'‰jšf½^sïuTÄdoÑØe+B£Q¬>D>NŒZl˜ÖÌw‚ê8B¨0t¨›yļ÷\Û&"#͇™>W{XØ1ƒ·*ëÝ Æn*"Fÿ Ý¡Î$>™¸0¼÷ 00<Ã,¿«²¢s\`®“øšªf¬‚³|çS·òáH$#!ìÞÞ¾­DâQííc-Ø^/÷PVþBçç(\ÛÓ!ûl]gfDOãC·BÌV¹~ÁÈñQv3?Ôjãëi’ @åëxsl˜¾€ˆ"¶«À6?OH€P¢)+´K—J7Y4[|«Uç®+vC+3ĶâJar;à×ó¼7þ“3¡ $6ù«ùÜL€Ž#€¼]oJI!xâ…B"H/¥”McºÙ°ë¨EÎ#»|vÌB+¯@z B()¤¸æo¤­ßœûÆËìÞºxáÔAtD˜Z(ýk#`»ÑÞüù¾IHÈb0¶Rù¦ÉOžªÚnÉáÞéÑÝ÷.æ’pDªâüòøh|çÓ¦O³Ÿ¬—vóøOž}zߪGÙä•i&BhŽÐƒnÖ½¾ÜÞ_­Á˜"•¾7`§u)J|:¾ÒÜsBh$e l±v$ãÉ Ú²Ç=y!ö <÷nä==×·ßýÕâÉÙ»÷‹rÕk«$+!A¢D)µ‰ñ'·ßË_½¸Ÿðû?úZ(óùÿnìWC:@,Ì <ë@g[0ÖpBðŠ®Œ5ßGvHY–5ëÂ×-xÛZj ¶JiPYß%‰Î²dùä“Ï>ûìå˗Ƙ7Rv„@ï¯íaþ"Æc ,Ëßýîw¿ùÍoò<ÿîw¿ûƒüàÛßþöýû÷?úè#&<³›lÛ¶ªÊ(I‘¦);i.`Çò¼º`ŒBöÙgßþö·>|øòåK!Äz½f/È7:3›79ƒÃŒØO&F¤ÏÎμ÷Ãá Ã\#ßl6Îx`y.¯rä‘eŹþÝ…¹˜XÄű ìèæ¸IèxÄ· ú:ÑKAð…åËá°‰ˆ)Å [.ƒB|:üÏh5b rãLâ.è~)t\ÃŒ®þÌ…¹[|Ÿ9*e~¬ÜÔÎíF.ÐűÓVÎ>¯ßë·»»ü+néæb¼”27Vö@Új¸w ”$yÚïy`0äR A{Ê[‰ wòDª,eX>QÚZKn+¹×؆µ»ÙîËàEG#)¢‹ ÒDJsô%³z† IDATµˆ˜É-ãB5!Ê©DË„|œ;FÁ# À“'Ñ‹†4·ÏI‚„ƒÎtÅnLCAÿ‡'|0‘D÷ùƧo¬!Þ{žž¼õÁ@€× åøx‚ñžðÏ­ÈuŠ>R)å,‰Í ¢¤Œs^J(¶tÔ =‘sW$Äèƒ!Ÿ#â}•ôËíÐq;”P…‰mü˜d•#z³é yÍ”! æë÷@„Ro Å.x…üͯûà·Ò¥H÷«ÞÐ: ¦-–öêÖ¼÷Çÿ¶çÖù¬$ÛGR$×/¿¾õâ‹ß÷¢OÉjçî§·ofºÚ|hÅÂRYj¡Fá”㋪­UÖGøÌ6)!•ãÊ— z‡*¿ÄµADg­Å¤‡µ §L…÷ÐzrHH¡'£eîç—ç_~ûÝ|’´g·/¾þêaUŒ†”H L‹O•Êœüï?(–Ë“ÍJ3øâãÑêänÿÞIU5Öƒõ¨uêA€B!A ¡QjÐJk yP±V¦"+Wl.Wü+… 5:Os”boò€áÜÉNBSojaD¢Ô¦½DDž A’¬÷†|«9pdrœ@ŸAÞ[ é ­L™•Ëz} «30ë¤^ʶVØ vû÷oï|+¥ªX6ÕÚ4Åâ’^>¼¿;®Šår~þ¸:;ƒ ¦8RÎ6u»ZZîÉÃñt: UU½xñBÁ *œO "û )åW_}õ“Ÿü䫯þùçOž<‰«G)e©„ÜNJÞúmb.kçœ""—ýŠ¢øÅ/~ñË_þò‡?üáÝ»wÿüÏÿü‡?üáûï¿ÏÄifNE¢›ªétº··wttÄ/óœ¹v¸ÙlNOO¿øâ‹ét:Þyç8;; ËõŠÙÚì#yž1†•1x¸ÏdòÚåååt:åz¹³4ð`ëÏßÎT;ÎÆV«¿1r ¢×áÜš? ¾1ôŽ;I­ÃýD¼rÀÔÄ„AÏaÛªÊcê;j|\…íሯGûH×ËŠð&jOtÞ7.'–À1tXñCäÕ§Å1uŸ#›4MY)“eºc©>Æ 3hÚ†éëT_‘RÖÖÉTSỏô僲*GI¢Ò4͵È ÅÀ§˜ªý~¦ûãÑáááíÛ·{Y^UÕz¹äB²ñ†óZ~ÐP ݱ©tëk=xë@9RÕ4ô{ïÎ9´ö¸Ícw"óç ‡)àˆ“Vô색£®-àϽ̈́µÙêÈÀðß:Ô¦á•ÀãŸÙ9Ák󛯇_A'KÁëÅÓ›pÌnã2à%dlsÃÑÆÓ£×Š¾Þ{ˆDtlDðÎû<—ÝOŽ'Ð n°“•z¿Õ‘è¥÷H$n‹Ô9ø9¦yÛ¼±olí 8/2Áø¼R ‚DkÑõÁÿ礬“"­›º1Iks™î_žÏZKùøÜSüžóÆ·»ëJU­¬Ëû¶)ý¯?¿û-÷å¿Ý¯æ#© "qkH¢RÛêÅ\¯–»÷¿êïŒÑY‚W—çË¢(ZCL™$罕 &ΑˆÀHÏ‘œBÎR¥ð£y{ö}I_ïÜû%µ£õ|ÇU} )$¡ðHQ!èÍù{Ÿý?ï^\L†“âèöWï|ïÜÿÐý÷ÿë.¥­õd$ž&(…P(¥%‚ $ €HñªXÉFöë¦(Ë2Ñš,% ú"ª\k-2)¥T™NiåêÒ”…)5èÒ+ j©m©µÐÖÔ4Ð:pd‚Æ#9áZ×7Ì)Oš¼òN:+¬KA[ç3N’IþäìùªÝ”¾6Ò9MVùÚËrq|yºn7”a/ï‰iV¤í+·°NzÒÃbg2™p÷­¢Nyž7UˆìÌ‹ÅÅÅÅßýÝßýíßþí'Ÿ|êBpͶƒ³“Á°_–¥³ÞYJIk³¾»ð0Hññ"æ$ *Çœÿìg?Çggg/_¾ü«¿ú«[·nÇãÕjU×%¿1: .ßÞ¿ŸÉYóùœp(Šâôôô믿æjñw¿ûݦiž={V–eœ0ÓµHVb'ÊQLða\šIdü¸1à5œr1)ù|OØ%w_ŒÜ7†Ý^cW!`håŠ0&ÒôÎxœsè·Fÿ@tÈê1Ýìš>º½kàºÏ(þp#x^6þ€p¾žNÁõD¹Ë?goı"Ü+"¥ŽY/1£-FR°3fr™cÅJDŒù±¯Õ`êMµ|9Êût¹x¬­ëÚפ”MR-”óÂÇ&¨Ñh4ì’$ñA.$pŽ~#jŽU ™sNÊ+¤·evÿ>¦qh燞Ýõm‡?°}÷àÀxGŽgGAŸ2Ö5â“bïÎô~æâQ‡¸Þ °¶ ûúè>ô«å×YQðº7ê ራŽ::šW~7,ì4Pñ™]L˜…wmu9}é!ºÊªP¬a{DðЍßõß„Sn\ãë×Þ=³á‰= þÏuÞ(y¨b‚I¢PH!»•Þîì¥*$¸>Ù±iÁ‘—i™vQ¡} ò"ÕÞJªmæ=‘ü•O†¿ìï<¬JSÎóT Ûv£²!ñè½÷R¡òÖŒ——îô™¾}¿?šl|3¬Ö6O'Rªþˆ¼›‚-Û¶Ò ÞƒPаÒ8“I J¤Q8ï½J  sí@zòÕ·¦·¾~ùõ;UÝ“>Bt’€4( ­!︑©( k'i¥¬µÇÇÇ¿ùÍoŽŸ}ZÅ_üÅ_<|ø0˲ËË«öÞQ D;GD»m}®Dj¨m“«Ü–ëÌ$8îåÍz\Íòl¬R«ú¢­½sŽ< ï (mšñÙ+<Ù7º+Ð5ãC¹Zh竲ô¹Ê«ªêEšª¢1JK•€LÊj3rVI è ’(…v,õ¿¡>h‹‡zøâù×û5Á‹—Š)Уðˆ¼$Á£…¶²_V^TµÔÚ öލ¹ðåû?<ýúÕ÷œEOdœõMmœM¬ÓFí²¤±F 5xIP+ò“Yd8(H$úºnªÚbO®S½‘¢d åÁ`_eæ¹M&ËõÌ¡6Z9!L%¤”àɉBëuK²Fa¥uIÏ{ßʤƞCM‚D–YïÛ¶ÝÔ´ªÓM›ó¥ÉAåƒi>Þ“·î4Þ{”ôoÕçÍùˆzRÊÂõæ•j×ÏÎ*«¦Õ­;ä ]–ZJ}~ÑRV\tÎ1Üg­=99©ªjÐëÏçóú§úéOúìÙ³‹‹‹ÙlÎ["Úföi­ßÿð[÷îÝ{ðàÁt:å$ëjíílgöÅ™L*þû¿ÿûO?ýôÕ«WÌ-×Zsÿ4ŸÃz½^.—ó7s||ügögwîÜáj™‚ Ã"‡„sîðð0Ë2Æ–YÄj¹\¾xñb8–eùøñã>øàÝwß­ªŠ0gKÌÜὺ»»Ëw@kÍBW ,s¢f”Æ(¬ÃçÀ©slgâ¦çˆÏó 5êlÆSÈr±ªŒFHRª®6ʶZfd=¡÷‚œÑÖZêÊ‘%ªj—>×âFJ²l‰$’B€DPK÷aªö…œ³ Zï»f·¯ö&;Ó¦vMm½ÎmŒõ.ñIÓ6=2¶I}3»,lc”#“*.ÚÅKtÀ®ªMUÖ>QsAs x¯ÄÏïípÈ™gò¤pRJ×ï)¥ÀZ‚@)á­lÕˆ³Ó™G³­í™!„Hðé$€õz}yyY·-"2Iø7ソ÷{Ÿ¾sðëõ«ù¾—e"æy~p AOýΓÉm–ýºhQ••q­OQk…ÔIUq6Ï …Q¿íüÕÙÓ§Oö³Ÿýã?þãfSò*IåýÖ!âááá£G=z´··wëÎ'‘ì&9Máü¹‡©LжíÑÑÑçŸþÏÿüÏ¿þõ¯YPóÆf€/¾øâñãÇ‹Åâ/ÿò/oß>jÛ6ú31www#¥èå˗̈öÞEyzzÚï÷½÷¿þõ¯?øàƒýý}Û¹oý{YçÜË—/Y.‡äù|k¨J€"Ä$Æéoæ[ñ?c¥“M@”‰¹/[œ¨]ÜZƒ¡¼û^64ˆÈåíè¢l¡KW¸\t æpð,N"ù„}Gä’¯…or´V[CðïÉð¾n˜(4ú¸µ†7HwF]×½,çÛÂy-SáTg$‘sŽŸÇRç³³º®¹âÛ4Ír¹ä>uo4âú!¥´­½\Îòɸ,•”òÁÛ­‡íÐvD`ç×4‚pè2ŒÁ‰¦ zg³3¦2ó•ò@ÆÉo,Ô˜EQÔÝþÁy"Ff™BðʱAª6Ö€ùKEøìhî™öCÜß+Ó¨jf‹Å‚88à(Ó„Y{RJ ±%@U gÉoÐEÊ…s6p°®‚Âíâ´W ô]÷ÌÀo<ù«ót døí½ê̺Æíˆ PDmk¡ƒ ¸0G+úõ›w[ !¥¨`rîªo8~E©êÿhº{ó¸q½ál+A )HɵáÿhYNMSKÙÍåp2NTŠb¿­ˆü±H_¹êèFæyžWîÒ¸¸\Cû{­Û=¼÷[”åù¹ö¤ µ))òN&…oÚ2I’4ÕEQ¯áWà‡£ä^>½u>¿€²Nôž§Û¶•J'©öÞJ ж©ÐYVAÞ÷@‚ª¢YÝGõ¥/ÙK†‹Õ¼?ÙÖö9 K`Á ô( Ð5•¨ÛE_—gírSì /ûÓã‹_ýh4UÊlŒ!Ó:cŒ³d…ݘºG¦m­Y­gåR7e­ ˜TwnIçIZiªUb… ì¥ˆ/±üÝòbS.³U©ŸšgÇãéˆkHÎûqÓ4M£h;ÉܱwÎyï‚å"%:·M¼‚~ìÖµmY–Ùz=ŸÏ7‹…-K×4BE´··÷è£vîÜ9kšl¹Lf³4ÏyKï¾÷ÞÅÅEûõ×ù|žÏÊ2íû÷üÃGÍdÏäÓUÖÿšw|ºPí\4‰i’^Åè¢yvüü_þå_>þøã¦i’Dc‰ m­R¬Î!üãÿøÇ?¾wï§Ó4)üà ’Àx¾¸ª²I’dYò‡?øƒ‡ï¾óþ‡ßúøãúÓŸ~òÉo€@iiËzi]5€ iZó“Ÿþ¿ÜŸþéŸÞºuk81Ô–ç¹J´õŽYé³ßïÏf3DœÏçL3Æ<þÜ9÷õ×_ÿêW¿ú“?ù“õz}zöŠ1ä"â&¢º®o=ú,N§G¼ÇÆÓ OCRaÎ.§ÂRÊ´.VUSצ*Ý”ëõf½Ú¬³Iƈ¢y¯Çó•¥VUSs5Á;&)E Ûé1Ñ—Q¢4™¦%"­S–}VRqp×8òU¯×ë‹‹ žàT»&ÍR­5”ZM&;Ãá˜Ó‹î{#é½[9ŽÉ1Ø6 ‰$¼%ï½Ä6D[f(¢hÛ¦,KãÚλ²ËþÁAoÐW‰&„MY¬6k¾Ïãñx8\^^–u‘¦i’éM¹æR”Po‰‚±âØ`;Á@sVïÉ;¿mO.Ô3’ƒO9 X7×—ï¶;¯ÆùÂÔwVi6R禠‘G!Dºr«A•«’?™‹MàIƒ2e-¥ ¨õ®¶^‘•®v ™¶{»®î¡’H€ðÆ9çк­àSk”à¨-*­5g±CöÙ9ƒˆèÉ6mô²Î9k«ÃÃÃqàœkËŠˆ4 ‹Â{+š¦öÞ ­ÀÿOÜ›ÆX–\gb眈¸ÛÛr«ÌÚ«öÎ¥EÑ")ršä2ly % K£4òH‚ÿð¶~Œ!0Pãùa¦glQúa –,=S%R-²Én±ÙÝÕÕÕ]kî/ßv—ˆ8Ç?âÝÈ›™U-¶ÆòW/ï»7nlßY¿BtL#­«ØS–ÙÁÁ¸^,Hб®¶UÍÌN–… ŸyY–M]‘b× † ½ Ù+>p yO 15Æ1“@`/!¥‚Ž™ÁyCÊã…ÅÙ„Ð(E ”&ï½ó •6©C圥½óբβL²œ$ ZEDè˜Å6ÖÉ,²$ïEaòL¥õ¬"yš˜÷€ŽYi$m€Ð¹†t’ª» üÚs¥Ý[½p»¼5Z½¸³~ùŸ£â×^þïz™eÖ$;»66g>ö¦›€RkמrŽ“í»×ÒQÉ µÒ P+è;(ÓѸšKhMÔ;IúL?­jÕ?w§±='ýÑæöÁÝ­þÆÍ$íkì_]/¶[Ž‹ïÛÞØ‚ÉöÓ¶‘>š´Py–,[VM¹€ªªêEM𧇠’¦´7níf^Ц:ÚÐëëkTÕ€®¤Ë*©¡Ù)ð•çŠÝwîþåõêûjº@v 8í§"}¢²mŒÝoäd¢žÄä¶TXßд©ÃmÔëõ¤-ÒÍ1õ-WíöµáPôJ ɟݘþùÍÅÕ üÂGz{¾àƉŸúñ|g>›5õìp|¸7ýþ¿Üºu+ßͲDk>Eqþüù}èCýèGŸ}öÙ z—eÕ˜²ÅmEëèwŒ&ë@ªðÔSO=õÔSçÏŸ‡ßþö·ç³,•3­µmÜ|¶øêW¿ªµ~î¹çžþùP8 ãææf]×!zyssóðð0$±Ôu½X,5Œ7n\¿~ýÑG Å C€•Ö:s D]Vý~?°‘„! †ñÁp\kØú5ƒ2Þ%‘Ò2u‹eWBòA`žòmµÊîTž`Ddwš+íìáÞmqÀƒý<„¤q›·*"È"ÒŸQ‡Ï¶û î#ºˆm]¼ïšŽcjYxž-–Îò®=X‚>¸$BÜœRj2™„gÅ\Üæ±DK¯ï”ÙôúeY†u¼¿!& ºw‹5Õºtuîß–ù•½É…HAf²•&ÑÎÖ 5Z\Ý`:ðZ›¬ßJyxÙÅ¢²("bQ°#DÈä= 7è Ú’J€:Q£âx^ÂX…CÀ¶^ž=R4Ÿ’·q"- ãI#„xŒpµøÊ5Ñž1«Ë¡·=R±cfö ˦1(  !¨v® /ÞhcÌR€³"•øÅ‚± œBFh+H4e‰ÒÞ:v"Þ˱pw3CXÉì={öâ½x¶ÂN¼UCXXVâ)ˆ‚žI0°hôˆpYl™Ñz¤ºuî4À©xcL"‰EÉ”!a¥PK£À¸QnÄ #v!ŸUˆªLñ,À ž„A)MJy%aw•h)³ œŠ‘Ð(c‚ C¥:…Œ)%°ðžÚúÙÉ…úpópìÔâîùGÞÚzâöÅgg÷>S•«ó}ëýºNêl°¿qí@%ïd¿R-Ä.6÷·Ÿß¬<è3WV&l‡“Ýs«Ãb«û:ËhmuëʇnÛ†&‡;ooìß½PU}“Û¼¿¨éþdç±·_¾ïÉ»O~ìkÚÜ:¼ûñWþ¯ŸÆÁö%› › PeˆñÄ›››Á6h­UÊœ²ªµÈÄ]Ù"š ƒ¸’bƒÁh4ʲìßøF.Ï MÓ(MÞq¹¨¾ùÍo"âùóç766MU`6²ðúúz¿ßßÛÛ (xçΦ©E–¥dC@ÖÍ›7?üáƒÚäœ Ò€‹ý¢r`¨¥íͲ,˲ -+F´JpÈ¢‰Q²!V\D?h˜nj3‚ò<‰¿Ðú»²Wœ®ºƒˆA^Žèc»¢ÚÚB‰ZQ¬|…Ÿ([Æ£æylÆîJH;»!'Mˆñqãã‚€(Ä»……ä ÛVŒ.|F[[[!2+xÍEdmm-Ùçe¸a±,Ë‚ 3VÍÇg4D›±µöñó—wwwócýKé¿ýõÇwž†QžR*j‡Ç«~qÎÛ¦¨ÉP&éaY¯¯¯¯¯¯ƒõõõÀ³¿¿¿½}¯®£gŸ"ÞYKäY³ ¼¡‚(Ö6gÑ´Ãå­sαó̬ÚâЈª5…Q5F‘âãP8XúP‰ˆ^ÔUXDÄÂ$8†=ˆcOD*1ä´J–YÔA_ÆíÛt>ÝÆ!VUutt4›-ʪQà¼É!D¨£Ó4QŠšÆ8g½÷!“¶­D ¡($RÀ,ˆáP#fòž™mU¢B\R¹µ5ût¢Q¡ !q !À`ZAB†åJ“G ¾d@"P •Bkë@gˆ”h"­)Itšï¼­DD“h#Z+•¤FIHôaM¤‡ngA@¤õ঴T!˜YˆÀ…ÈÌe]!¡&DaöËü°ïy—­œ,Ý/V€ÊÒ-n¾™ñwÀVöGIÛbelR¶¾sc¥œ á'µ&ÇI5O|“ëÌåÙ!«[PÿàõWRç”[dÆ0CY7åî}{÷µç€J `É q‰Ùó´;ó»^fÐ/mÿµW¶Ê꣔N“Þ$ÝüVSn>°ŸÎëÝÛC+Zk?'è“h–¹Qª.SEXYY 9»ƒÁ`±˜Õµ­ª¦ªš[·nݾ}ûÆO?ýôêêêææ&"f¥`ƬªJ!…„  ÖÎ0Ôˆ\ªQ\1¥!…&@Bæ sÍËÁ•̈ݱÑч"¼lWDuDOaX?ý~?"b¶Âç°®‚;3º¥‰hPôž…äðÿxôc›G':®I8ÀqNµ>&—fé„_…·ˆáWÜá¬@Äáp8ó<_,Ð‰Üæ6.¬ n«hÇx7DÔ¢å|qxxx÷îݪªŒ1¡r°sÎÏŽžz䉵ZîxÆ+¸î«ÃW‹~"ÖO[Æ­Ÿ[=Ç^t¶š÷® VŸžÛÚÚ aÄ2Ò««ƒÍ•µ£½íL‘ ˆ!€Vˆè@<SµJ å½ò­µUÝÀ8ž^–c"žsâ<‡²Ëb1†6$®’0WqfÚ@š@˜¥ª°i°iD„ƒÔ4n>wÎù²fP ´åX#"¦Ñ@à¼÷žÑ5X‡ø¸²,çói]5lHêT$! U¦ŒÔ (˜¢e•ÆcÊ‘®øµ(gÀŒ¼LCA‘`IO=£%"ÁMÈx Ú ×aE:ã µÙHŒ*`^z8˜•‚±'ïÐ!ƒXg³´ çj@#`µ4 «²Ÿ¬æJa30"Ê{Í ÁB΀QXˆ ÕƒkW #Š{%L„@*Od¬ÉúE–èPæ)8g´kÊžS ÅÔ"¥s»LlÆn%[ùK0+Ú'̽zžÚ² 6å ¶yÖ«T²ÇÆQ2Ðz•ý¹zÞë÷ý|ºâ%&rZ³÷tthxvôž˜]RR¹ÂÉð€OrÇöhVká-·8WÚIÒ+ÖOF9ÜÏP ñ~,.#•z+L­#XŒªzÚëSéÙî®§Cçñ^åfÞ“ÂÕ,]Íz*[5»Pi¢@õÁ(«LžT@£•ó›>©m£Õ\Fè¸V@€p(µª•qêk÷Þù7^|âKß8rÕ!Te"¬I!ædz&í‘8‰Ûr]1ïZn}NÛ¾-ÍÈØbðN8^ÉÔ…Á`ðÌw*(„kB~‘µ´ÁRÀÙQ¯×ËzùíJ¯ýàÓûý¾–oÜÅýÑпbVbe¤à ÖË.¹L€ÿ1’$K(is%ÛøÛåùÒºˆ–i˜$Iº5靈éxñøG>ó#O\}rŽeâŒt˜V×°’ÉdÜÏa{†¿.i’—,Xjéîñ좈G|eÂÐ,Ål> ]ÀŽE/ “ª‹ˆÙ8ˆæÁönÞ:åÁ„@èBÕ&MÅhù®ìmççXÕq` Š—c.=\ÿÔ Á‹{0ÄÝŸ€áwÔ9ÀÖL—a J'¥TšæI’Ôuäi1m­5"€bÏ!𡢜Lœ‹nø”§c¹ª;/«¡²J÷þÛ!ùô_¬TšÜyU¢m©ÓÂbø«"±rÝs–‹u¥’…J¬Ò Í…sÇ! 8ϧŒv¾t¾dvÈ€V F? >—¥C†ùl6F’,-¼ÓÙ`½²6uuám†Hhœ2¶©S­+ïµvýÞˆ]>›*ÏY’ì=°ŸÊP¹ðFƒN¬³€ÒS¬ßOta0j8Ÿ—ýjÜ4уºL• z8A‚¡±~lù0¡ó!åÍcàŽ.¨hÔ¤œTÿè¿ù…i;®ÔN3^×®ñ’¢Ì*˜‹¿CõƒíÙwnÜI-f¤½)šš­5&MM^uçÉ´ˆb¦osöÃgÕV ‹Ë”Û˜ûîž dáЉ›¼®ëpÐgY6ƒ6!3‡ ¡mlúdVPõÈ K‰vâëÃʹm{û%ûgž¯\Ŧ)¸qû“ý°7Š¢TYAn…Óõ²¸wfàŒ¯w#"† -é0„‰fRÕfW“rHø ™BÔ&Ì„ÏÁèÛºëιÉd2ì~t¹–Ò4è3s(/X–eÈW±Öý¥ÖÄ#ï}PpQ ;MM¸DÁ õ†/ô$Ga¨‰h0üÖŽ2„‚G‘ ;E]èLt,™ñC<†´NºB[\-I’D3´`ZÔù’¯Ø‰\"aIÄGœÝîçSðØË¨}_è`Y×tú -ûihy¥ %•NÂIXWŽ\\0áúnƒ­%ðŽ ¸,Ë»wïþþüî·^º}4™=ûþ Ÿ|þŸù7.–[ýägŽîÌÖïñwóÙß|ñ×þëÿjû—>úŸùñ¿»¹¹6N(»dŒñÎ1056CD@HH„¤ -l(„,ä<1¢g$×à)æÎ娵kžt[ÇÛ%îø¨EÆõ@'¾'$å=Æøa‘Ô´¶±6¦½"{OŒ$ N–dÅD~ÜÇqÉ-'…Y‰h!¨1°‰ ‰B!çQ1ž   !Tˆ|’¯ |Ó<Œ DHDµn¨. /Ó/sŠ€!D'¨8~‚-õ#"zÇ´'Aò@Ä"!€h‰sî)à­ëe:]rz€F1`P¡ ™]\ØU€»rŒ‚(,K@©DˆR€*–­¯AÁ{i5ÜfLµV9Hjëþ|"Þ I¡“JçM––€Ì.­«Ì5©êºšÅ'‰YSh¼D•j3§¯9oyayÛ‹JhÈuÓû>ÑýÔ¬§ªÇºrrßÓ} G‚+ÍH¾)ûÓ5ÔÙî`ãV=Y}`?=8P"H,hKPÎ ¨š‰´É{P c¥t¯´ï˜”µÃŽ˜É¨•4í5¥GÆ¥l&ŽœuZdƬ LŸ¡ÑŽõª^ÌÊÒQŸÔ°V‡Ô|—onnw¸ÎsáLi£ ™„’œ‰bÖ`P|ã±®:¹ƒÐ2Ãňé$tB˘CméòhÀ”–JZ¾þá¡£Àíqéœ{Äô+ÛÌšrª¨—õr3H¤v“Ìׇ‡Û‹ýìÒI3]>³ÅpeYº§(‚àäèèH·ÜÑaãÒççºZ8 Oàaãey $I-3‹D$MÓ­­-¥TÐ;#óIx\UUD²´Ö³Ù,º¸BþU°Izo išÕÕÕ I-!øÅCWƒþF>O³¨eíp)wãrŽÂG'K°…Ão°[–ð:aê±µÜvÁ&J‘I Ž^¸§ÂãR»Øi1\ÙwH—|KéÀmFé1ß-iëñ^wýÄeÖ}ÐÃ|ÀQEîžža½u±Dð8Š0.øð×0­Á‚‚‹ZµÔ%±{ҒØN1M4ÚÔX…"?¡ö÷¾÷½¯|å+_ûÚ×~ä?øïüØçÞ÷ì³k8žÌe%O{$®rÕµ‹+jPm@ÿãþÄúŸýÌþËo}ùÅÿá/þƒO}êSŸùÌg.\¸ÀÀUÓ8~}ïÙk­Á±GaÊ {ï"SH™Q@¤U˜¯`\]$´e¬À2& 0Ò5Šˆ°@`Cfç£ðµüe0S©Ú'â¼ç Ú|¿ål3C¨Z«™$O£BgÁ‹,k'A`OФ¤e÷‘4!z‘°)X– ‚mM½åäš4‰ +v-ɾMÍ‚%—r.¤%ƒc4¶‡ …ß,a8ÄìG¥…Ú”òÞúFR*xbÑ娢kv5B¨åÞ…”0zÂÀÐAàιEJ‡-{w‡°v°³j Š×§Ï¼¿ªaÏ‹g«=fŠR¥ühµ6iÓØ]ö)ñÀ—+ÂDʃZ¤ÃÚÚ>iQ ›¤™6 K“8[ôVWülP×{˜ÎƒG ­[Þ%U¯6™ÁûÆ·-¹ˆòesosS “C_•xxµ(ÜÍÆ9RÀÒ@$j¼×è ˆfѸq’\² ¨T5v¡q¥_ 5;rÎYWŠÔƤ {ˆSA€qGˆ¡—s´ !$ Q¨ÐàiÒÔ &àu#î­òàþÑÁh\ëTÕ¶,Ñש2¹6ƒ‰Éœ›r›­sä}KD''íÒ u¦6‰Ú ÕÁÇeM€')·eb»Ò¥´i-vQiEƒ4W:AE®ñuY5e³€Ù¼²Õ|ÃÍ/Ì_[3HÎ›ÞØ‘/ÁÓ 1e3èšÁæ´À`bêv2ZM»Ò}÷б9ˆØØ&غ‹¼˜Î¦¡†ñÎÎNiîêÓPUÕb±è÷û˨¶Ã)ø)ËyИ1ãñx<ç\ˆ î’*,“dZt4Ü…{á8þ1z¥k®ˆ8þªN²öÇ·Ž¡ñø‹øÝU â@yw‚a*Ž-óqâ_Ãz]Šv˜vîø"~G)MZE3Δœ ½V'9›ºsÝ _ˆfÉX )þZCHÐÔ—û¹i‚500w».ˆV n³ ÂV€@AZ×õ—¿üå?øƒ?¸téÒ/ÿò/_Lð&'U9XL¼†fcØß…þõƒ•Aÿ ™Õ=êõ×õN}cçÎÚ°÷ÿþø©óS_úÒ—þ»ÿþŸ6‰™Ì§iš‘ €ApÖ#¢ xb¥TPÑ¡gAÇ "zöñe¡#»4â)°j &DDøXðZ¨(+>BZ€0i•«3J)§ÀRð´Rª’`„À”àÁ#"#ÛÆ`j9×DzïwÌ, !JZœc…¢E pã*hˆšPé`ÕóÞ3°g%¡cûr, Öûx¸ÅCLD´:fre جuq¯a°{KCBÁEÅÂ"Á@N˜dé˜SJ±"òè0 zA@/ì¬ãÙ¬0àašeHkc(]Fi¢"plk_W\9Ûý ^ºûæ ü½Æý u!ê\²~n#¨Ì<ÏBÒHô?Å1Ù!Ü:žòÁ¥·d Z*aŒQ>€"!¶Šº©Ø‹HH8 !²Ø*Fá·¡Þ_Py‰T7ò+Þ?ÉRçÜÊÚêl1ÏŠN½£jÜ ÏÍçîèòÜ>òúáÝk/¿xqŽó4yp0Zž4Ï|ð[ö wçµ&ÍcopÃÁ_XÚÝú¡þTô«¯¼ôi§'4ý­¾Iù; _pÉv³\œÛ»uùæWôh—ýDÔ1 r¨&=Ûì¡ÊÐA_9S‰Œ* ¡°‰ ¥÷ÞÖuÕ4Ø¡@‹ê‚ˆØÊ&MÏ å%ñu]¡;‡.·ÕœPM´ž¬’[IµMµaÅH,¾bW­q=É¥ÿÔµ=t_9Ô•£0®x™ê$Cç(ög ±uEQE1ŸÏÃò^†ªª~ý×]D~þç>RîïïG?ý÷ÙÒ4Œ†^ø—~é—¾øÅ/þæoþæÏþìÏ2 è­¬¬y+ôÍ9—$ú÷éŽCwîÎÎ×»·‡]ÏmâïÙùŠ ãXºí¸ NM«œlÇÏ=Ù6,w¸#Њt½²Šh9óiˆY½s-ÊpfÇAÜSúÓÿÏ Ý¥$áÞÖx}s¿×ßmŽV ó¯!9¥µw∌ˆ×I9Éå'^tl¿ûµjþ·»áº­Ýצ¨z5°kÔá¾*KÉn5ÕôGöî~ïûä=yãUä‘­¦›yí|¿¿¶f Òµ“=•ŽûÛ…ypG¥—¯_<¼c_Qé *AåK³uùv¯wTÛ¢©Hû¨*†ù›ùíëï/ýûóbÿÂåÛë×^®¸¹so,ç<´iiͪ™ÉT©”R5³sNÃR‰bÑ2ÆÊ¦ž,R Xœ›!£å„A+ƒØ yE‰or_÷ÉŒ}“kÌ ˜&ÉÚ®á$èžEâîS*ßáÌÍÇSh}¶B‚SÿìÎt` ¾v¦l9’mÈ´M¼UâõÔ L£6f ÚXŇ8NõWu2™üôOÿôÚÚÚx<Ž~âw¯S­®k?@‘e¿ð ¿ðùÏþw¾øÛ?÷óÿ ßï‡Üî$-zø±:Xø.ü°³þa×GWB×÷­ùì 9%QZçgû†gJfµ‚òrÁw¥"±rÌ/tBèÒ=vÞ¨»à—’j Ó|×A·®¨Ñ¹íƒ%ŒïØÝtxÜ7iÿú¯€­?²6c§º_Á`u—Ð 4&1³€J‘qI6;¡fsôη?á«÷Më׊bå­W³õs+ƒÕ;õÂ!ÕDJ{(¼3Ó£ÞázÞxP So«†S£Uéa’— »J ;ÍLˆ¬(ñ¡ä3²ó&¨ ­ÒÚ‘×½âò;7ï­¬¥Å XkË96'˜$=5 °¡ˆÈ(-„J©$ÏzÉ`8ùfæM3›ÍC‚ih‰âi.m&I)¥NØ*}ëŠD"áW!•9í´`ÁŽ>¿ ”çy¬Z÷y $qÎ%z¹à mÉ@ûµ.l=µA†è¢clË-MËÌlŠOïú2cМLá=xÇ€t†°Îìù. žêØiXí(ñË…×Ñ/㕈èýñ箑¦û”î7'îcýT¯âˆ4Hǵ ¢…ƒˆxY^”º`ßšÚÈÁxgç\¨GÉ̽^/X>œsŸÿüçñ§~ê§Š¢Øßß___ßÝÝFÇ4Ÿ'»ú0ÍŒ´jš&ˆƒeYþç¿ôK_øÂþçö?ýÌÏþýÑh‹J…YNÓ4÷=°À¡wEß¿F‹ÜÅx83øñѧ *^~j5jmº–Õ&xÓâÔÄß^Òætxú°Sé¨Û¥å{Ð÷Ø‘¿ŸëÞÎ,ËØÃS—xÿå³pi«‘PŠ8¬ÂÿÏ&ì=¶´¿ãËKÍbó`>$Øž"ÜL{ÂkZ÷½c •¨Ô»ª0G«kå½7ÿÎdo¸7yýÚÓ½½mܼ¸:[lk÷¸¦mqâ¡ U!ÈCœÓ몘øìÆ¥gß¾óÖFcMiwW¸Ñn¡•µ*– @šZÐõ²L§Å}]ÜEÉØV¶^«+r¬M–{®+€¡ˆ´Nà r:DÔj²ºZ{o3®j¦fqõÂz#I9iš*ϳaZ8Ï»¨¦d’hLÙÖ¥õ¬‰’,- —yI·ÍbQ…Ò¶± ¶š_4 G¦{HA«†…ÑŽ:;SD‚z¬Íý~¿ßï3sÎzŠÖj§î¹nÎâ,ÉÃÁÁmpo€ÆÀŽãÐù m4*Æqñ›8¹Öº¨œÅ— ÷ïv&ÞMà„bŠ'ñµ»¤NýõûiÝÆ9uŸSkìpÌ=yöéx€ÏЃ|cgŸN¸¬‡ó驞C§öC÷n]h ¿ÕZ×uj"yïï÷~ïúõë?÷s?·¾¾¾··7+‹÷æï|—c]k]–åùóçC‰LøÉŸøã7~ã+_ùÊþè"bX31ÿa÷‰úkLë©û<ðûËíËQ:YXðÔ럽y纓BxB8‹Æª"Ëãú‰÷‘F¼÷Þj08´(ÂI×v ãáYþá @†‡|Ÿãƒ-´Çem‘®¨t…’å#ºéÊšÿš”`±:Éœd÷¼»´H!S©Ìö¼÷Þ8ñH„ À»4-MºsPý±)~乫yûþ™l0ml^¸ûöbu˜{¶–ÁZ-¬DÈÓìàÞúú…½43÷ß|ÆùL@‰Û‚ôM˜"Õ¤Qè°ò¦<ë‹> QúŒ49Ôƒõüò£Gß~ñj6؇:Ûºv×ÕÃùîùÁµCUl‹{ê>³# VRA$YæÂ?t=´-Ù'Â)o­ NcŒ«–AIñ8»t:VÏÿ­rpîµ,y91œší<ûͱ–œ»ìÝ©)³Þdë&½{I7Qk¶¶¶vÛwÓÅtEì*ûMã¹föññ€6¶öyb8%¯}‡ÅÑ(gqvæl9Y½¦¶½=:ÿöèì°] IDATœÜ[yùO/Ý{ãÚ#ÏpȈ Ä ÇëÒ{J%I^95ij*×ø–'í‰;6)Gpˆ†©>1Wʵ%i#Ø/ç/nø¶r-´Û/$óEtcL¿ßµÄ»PÊmâ¯s.úe¹!œ@r*E5jðá'Ð9€ˆˆå„Ñìø4ówã+ÀÉàó8žñp‰€ÍÿÀ…uð¤BÐ=^»GÌ©%¿S?}ߥuo~öA§Ð]N*ʧޱ ~§~xêó)xîž•ˆ8G£‘Rj±XEqýúõ/}éK?þã?ž$ÉÞÞÞÆÆ†µv2™¬¯¯GañTëÀ©¶X,Ö××_}õÕÇy4¸K²$ýûïgþÇßù­§žzêé§ŸË,°šL&“,KöˆSÆÃÆð_±ϳ+¤ûÏxew)ÂÉ•¿\Žd®ÊU Æ.]Nûº³\Ë‚å]h¥®npœÀ\hYOX†EN½Ð™?Ì}ò•C$GqådYO ¥à„´ô.ûôoº¹òf¹§ëf—ÐÐ7;Gð˜¬QèÙ!A/'‚)È3W?øõtxçü“W¿ó§&M.î­l¡›Âä T^Ä{ßÏ6›™~ü™û“ù«–ßî­È|~„Øs zv‰5^È1U5Z‡ZˆÓª.û“{×{ä£oÁŸ=šg3Tuo½9xû2Ú‘…]O„¼ðNKó®É×åA¦{›[YO_o§“ƒ4ë¿·ñÑI’hR‰¸®kNXD”Ö®½B:4¹ˆ8õîÞxÖÏ®õ2X¿ôæ…Ëþ‰Žoíæ¶JŒéeùõ­»ëi>¥úàQGF÷¦«³ÆÎÓàÖØ;“2ÒBœg–ÀNHЉHºöX¹qÁ»{Ö#Äh†ìÓ̬­¿uùÚš‡ä—NÖæ3MIóÌÜMCÎå)÷ŒAcLšfYfĈ@Ó4T–U*fË—gXÁA;‚ZZPa£ÁÙ·‘ŽŽŽ|KÁsu M“ ŸÄ:çz½^$똸‚îÞͨ‰ò—"GŠc/Kbáx„~†t 9é@%"’cÏ«÷x)70,Õè¨ñwµÂ:¥„¨g7s÷Ô€‡épKÀòÀ… ñ‰á]3`·êmw­ž9ò‚Oñ´÷.4"Õ½Nâ+œ„ÒS¯…8i^>+.œêh­çóùÊÊ µ©w¿ÿû¿¿¹¹yåÊ•àu5677ƒ gŽQ|W 8”à|â‰'n½ýN–eÃþ`meE¼ôÑG¿úÕ¯^¾|YDB²Ó² ýCZßý‰ïÞþ?<‹¸ÒñžÚâ’ˆáØª'vSžçišj*Ê,‘³;¯@HZS¢´×¾!E °êT…’Žâ¬tvñtÿôîÆyW4tVQwGœ@ú¬Þ›–«úaOýnYVdŽ×‘5€8›fý#¤"èH‘³œ" û±½ôÄÝû¯½?Ç<÷øÿó©ÏÝ|õŽû7>ÒŒ+ÐG 5…”g«‰ )åqó´¸~ã¥Ëž÷š¦B»¨e¼bžYÔMSzÃy–Ž\ž¥zÓ3=8 ‰Í>@Æž¶“óÕìêÓ¯Oï_¾øØ+e¹rïNq呱oËËU¡ j>¾oø2c1­_~Ùª½ƒýg“lí½ŽÏ2åÃZÛ4¾,ËZê.ÅDœìxÐT ºýÎÁþöÑjöTJn<¹·Áfmëü›»¯×vSë IÖ+;*ÉŽ¶/ìÞxÎÉÞæ#®÷þ2)&5 ¬Ÿ–D’ˆDF¥HHS½z®jüýñ¤'xYëd6›T[£âêcG ú·ß»w(+“dÓ¹¾s£rØE߸i‰ˆCHã¬åz6›ÙÙ¤K¢Ù=1Gm õ—‚;¹+çvɤ˜ùܹs)p:Îçó(j«êJE¥Z*ŒpÃpäyÊæ@@_×Ö¥ˆ/E'yNÈ;âƒàdð.G)¿Ç@UŠ^\¤—ŠÄËÐ9åOzÎt"È­¥»r¼Ð;¶Yè[DÊîÍ¥‡|ª¿ß™ûÇS²; |Ò÷sÜg<~JWŒè¾Z齜°CžúU·çÝóô*KRŬÃÃÃ/ùË¿ò+¿¢”:<<ì÷ûóù|6› šîÍx4ŸjãÉdØï‡[%Úxïg“ÉÊÊÊç>÷¹_ûµ_ûìg?Æwvvˆ¨×ëY[?ìV±çrÊÚù ö°¾½ËõCšø¡ i§>œý--3pÚ¼A•ø–7Ä?+¥<,ã„¥s†»Œ€¨´–è‹q¶»äNÍ/¾ë >ðû÷ÔDàQèØ’çC2=@RüWïÀ_»9¿ï0[½zv“ƒÚß!¥<B,ÈÎI‘ê<ÏñîKÿö¢¾±7¹𬂷²Ô¡¾•`Ÿ ’ xÕfFR¢ú ®<~o¾¸W¼À¾)ôÓMu×Uû»˜¨\Ït³[º7§•q°–õVø!lÐLß»[ÇÛ7ó'>üÒŸþÖ'οðG7n=~p}è¾'l—Ó^™¤¢µ¾xy1ÚüŽôî(0TnÞ½þüî[¦3kßS˜îçCQº²ójwÚL›é á"ë5M¥5"®¨`³ N³YÔuo×OÛÙ‡“ì[‡Æö1'_¯@óÜåó{Då½ÛÃüÊåq|°jôõ ›[·¿ó±ªÁÁÊ[óé›âߝлd6'cWäH8“£Íçþ½ú½×?zõ}ó~¯ôëí½ýÑÆ†–FñýÕóõ÷^Iï\nŠìUdÁæÉÚ67¦ªkë ÉE⺹dçéeTKÚpZÞ}ËQµ7sÕ|a´Î’Ô{ïKˆ½^?˲Ñhuee%O [»ð²ŠY„…ˆ´ÒÔT6AdYVÛ²—£ÁÐnØétzpp0«ªr|3H‘¼÷‘.;†ëßp8 Ý1†‰„dªÀçÙK$„Î )ÔšŒÇžQ 8ç%]ž¡{áÈ6Æ({¬ ‚ËÒÝÊËD‘‚Ž °”Y¦Hê @DSÖ:IS“&¨(pè)£ Žá*6éX¶»_Æï»Ç¨´á)È\°ñŒ ñXËLÑHJ€`É/ݪ?ˆ¨e‡ÑxL¨1X´{ŽwÅ‚èD€öL_1‹@ÈéÔ¤Øyï}HÂîÂ-´@«:Õ¢½!¸0â(}ñ‹_üô§?JT…J\qIœ00¶ÑD´ë ñ•ZykâY“‘¤È+gGƒá|èùÿó¾òñö÷÷‡«+ιÆ;Bå" ÔÇMS[¶-ó/@$©~®Çûsp]<ðrÌQJfÖ¤BEd/>ÎEçÞ¨RÀ)ABR Á±'qØ(£ˆ´Xpäko½ˆôÈ„ôþSøè'¢ BŠHB¨Ò$7:%½X,JWkTHhÁy!ôÎvG eÑr>”žLaÌÂm‡d™ç"ŒÇ3w"jîìD/ž½­5†¼g$‰ÿ)ÖÀ,ÀBäæ²;Çy îz°1¤B80ŒJ|Ó€2•krcšiC 9B|ؼ?¤¥*«œÌ§GÉPûÚ%j„<Ò˜×SÖÄß,²‹Êê«Û;ksÞ¥|U©ñÞä`Ãn?véùëߺZ­|e ?Àͺ‚ª©Ç[¤™p´X¤®¾³ruûÖ,’¬æñ]ÒÓué¼£yš\>œŒu2*²ÍÔÐÞ^3*R$AØ<—j_(µf’¸ ‚Ësytš×2XÏaÕál±¿¶µ4©8§ùLßrù7”ëÍ'6I§ý¾æÅkïç Ýb`Ѫዊ³[\þ°êݱհªï½ËUóú0»réù¿Hñ}o½<øÀûŸ¯ÁÎ7ú½Bëiy´ûøÓìël|äùÞp´š5ŸFœ÷RkËõÚíÆÌn9¹ˆh8\IÓJDšÆ-Æã9Uã©3K®ºåAâ_-%"Æbs1ÌUZC¨ê”PÜÃðÖ×ח²;¬>†î…òy±&`$—?–Á™tx‘`¸ŽÑUQWë*%Ð2KhŒÛâzpR¡Áã”:ÁCy¨rªÅÌ(f>>n¿ à]dsuqÝØ1ì…Eߨ±¢×’À¨õ D³G\–!NZ¢S(Šb6›íw¾óÏ}îs!8jðrÒÒÈ'Ã_Ã}ºÖôÎÿàÁÑžÖÙüã_øÂ¦Ói0é4FD@œ0 ³°“›BòýƒÛÃM¯ÌÌÁpÊÌÄCQÞ_þîœ2ÉÆ)#J)M Uk¾B–Ú5Á"Õ$D4ÚtïCŠ–“²šœõ â„]¹¡“&Ÿ¸Â %®òJø@ÈþäJk êT \>=J3ÒjÂï(BBˆHB ApC8)‚¿TZ¯p` Š}6I òh/@€ÚV ƒ6`Ð,ó8ØYÈÊÞC³ V6 &UåÁ7ƒLVܽk²§¼µ„a‡„(Mš%$v£lRºÖÓYz0ñ¬r³Õÿ±ÅìÖܽØôÍÕT­3{&-êµþ€›þÁ}==d4¬Uå šW†‹¥ûžNv‹~œì€wôÈ#›÷oßSJ…òcО"ÒÔ3²[Š­@ãA‘{Ö•v6=œOÒókk›ÛUýÎd,EoKœ—/•Þ{yÒñìþ½½Ô}øÌÎ?û‡[ïÿ_o^ÿä{í½·¼(x{r(ó‰^5ifš™é¯ï¦Ú 7_yêÉÁÆ9wû?oî|âîÞÄŠ•VKƒV“ êˆÖš”òÞïîî–{‡Ò'¢lÔïÇb®¡¢í`0HÓ4Ë ¥TD\j)'Ѥ»!âýo¯× õ³·£Û«$u]‡"N‘øb©L×u·ÚR8yc$ˆn‹õB{SÛºS¦ÛìÉ1T²FŠ‹Œ;©P7âJ¼­R&Vd2mmW^ÖKÐ1š,®ÝSù §ÎëS»Ï8ã?#‰ã)ø‰Jlí áÐ ¾ön…‰ð“.‘Ö X:ûÐî7§¤ØŸxAèU”–ÂG‹zœZìdYTKî-"³Ùl8†/¿ûÝïN§ÓGyÄ„?þñ¹PNf=€¹“¥Ý}¡ÎÿaYÍíL+ëJkýÂ'?ùÊ+¯<ñċŢ,ËÕÕU '2Ëc{˜æ*!!ćíþïâu÷š³kéÝ[\cñŸKY\™^Q èE‚¿€™«¦VJ)ï‚8P S<±NZ4„YÓ8çjgëºöm9“³Ð?s'S:šÖÃdPîlíî+Då·kªÁ6ú2 jñ‡¡Pz|ýŒÖµ»c•·€}j Ëfat H©Òªù¢YaRÍà!M•sÖëü0U&Y4°¶‹Í´@[-vÄi’±ÎßÑéöƹùü—Uj‡£¾uÚ˜Mgûë›F¹ å¡~WÆó  #d§H› W'¹É¹É¬­Ëɘ¥"%yºq°wØ[-Ѽ ¶l줟çìð.‹õÌÌ€¨(¤ðÞÎý¦öÂ~Qk–|0º”âÈ•G¬&£,[ Ly´xGKµ¶raaß±ê;R|7'ðO‚ϵé«Í÷48ò€Y {"¸#ä¹:+lTÿ—ýßú‰£ýÝ©qM%¼}3§úyNŽòŒ¥÷&O_;Ú îþØ…Çà±ýoè.¦hï­îß5„ÙFíí@ÜÀä{oF#“¾ùÈÓ·^ý¦¬ê:1Ì€äŠ,×j‹WVãµÍ«¯^ÿ!;Ù%¬ß~iõÉç{Ï~púçÿwëlE!è—y¯79¸··¿ÅÂ{_¤iÅv2™šˆ(Ô"-IÍ{ú'‡¬Èµ\2ÕÇBœçýªò²ð¡À>4×*bÉÞïÉÇ;ù@a眯qkgO ®›7ûåpÎÇcª+òbCY*•Êçì|ÊÉ&AñÍQê£ "Ñ‘ìži1”Müó|œÁì©[KÌ&u Ÿƒ;z`W‡M;ç‚xz½ Þ„ÉéçrÕB-ñÃɌ‰4ër„ÇG$rf–É~™üèd]Ð:$%Uµ>É‹ïAù™$‰”ò…^xúé§Çãq·Û (Û`¬ó±`ÆWã± q²3H·Ý>øàƒ_üâ…½º$ ÌÒß0âÛíi!§IÀ'Æ[Š£±Ñ Œ'4>ȧp½XB)¼®‚¤¯Þã‡Á:pNÖõ¿ƒ:›³îxXÛéý‰ð¤ÀÃõÎ)ìÔ«èG«Ó˜F:¹9†\ƒü6‘{îËðyîXÁ‘Å?d_¨3™>#ÜëŽísÿg)Ðp l]¬"a;VU~j–[!ÿ2Ë.XCÃ}#dÕo/Ä©È÷Ëñª”‚ ¯;S±¬voµ%l]¾¬^{eå`|qõʤ}ïú‹›[·]œ&1°ú^YZ‚ÕVzÆâ½ªäˆ.Yú‹ñ8«ªBÅ¥ˆ„1)`É.Z_º<Ð×vwîm,­dj-·‹F %Ü$K%“8Në<¹csîÌYTß™T-˨WŠƒqζHD+V‰#u—ÛUùˆ’Ëànïß se2¶ZwZí EY,¬os´3š¬ß×ä€DDŸ0EAq¬”rR _Û¹±Ãrêô²OÿÏãÕw¯¬GíÕ—Ÿú€øÆ¿9É1ÅXãbãì//=ð•ý·6ŸÖpc}1]ÞØ¿ðÈÞõ7T1ȸLœÛí{ƒ´u@åÛžü¡›¯ÙWŸÍRu£|¥ýþ¡nß½•­$QÚ2vk¡›]UNÊÝöòîdTlíìõw¯—¶šØ]Ÿ û/ônß¾íªCf©”FÂŲ÷z½§å:Ž—ï½ÝQ‚†I‰f³ †/}ébo Ž6Ƙ8Žý3™9Ø_ÃiôÂÉd2 l]ч'ŵ¿Å˜`}džgµ© ŠFÎaO轡±Yvp?BÓvÎ4Gs]/:,ýTÒ­=Ba–Ü8cá-0ÌRã×ÕqózDô^âAëêìÔHQÒ| eþlþž‡8E´jDÿö¦2¹9eYR]Î9xžû™ñÁåÌì™­ÀÙxó|ó(ÀÁÁ Ç÷îÝónRÊÉdǸfæfØÚ“m¥§eYæœË’t<ïíì,,.*)‡Ã¡ŒÕ79ë Ä×LáIíïÇŒ@`øª Î92ŽÁiçـÍÉÏ1pTr k)Ó9·¸ÐMãD€"r…¯ÀOØ:G6¬¬ßT™Rµ®Ø÷§ÎdÆ!ƒ@R@ ÈÌÖÇΙ#Ÿƒ9‡Z¤a¨ÔÓ#õá%HÌþǯ0Ìjƒ€yšœ¿~:X ÄìØk°‘‰˜ˆd ˆì¦óò "8¬¯ \¤*šƒöé'bdpŽcÀ‚È”f\Ž”câûóòmeçI¯WEµ¼Ð©Ìp8ØÏ«,¥µH!Úp-G&IÓªjk3jŸýÜ÷^c;翞WÊ >,…âä:êÖ¼ÿû “ÿêéÃ{—Ò¥‚Ädrx¹Ó[¶œXv$‡‘ˆcîM&ÃÁx¯·ÒM£ž„¥rÜÛAnG¸¼ÖÍóª*užç±0RÑÎîþ9md‹ñx\©A‚Ông㪛ÛÊmuPbÕ”}!÷;ݨ8H³v®ZY;uKËß_Zß<ðö½ 'kžNk2Žc°J kÒ$I|¬s·&¿¿ËA÷Á·-¿qóÚ=ñÛÿú«qëê/þò­íýÛÿá³ËeÑ-5vZŸþG?öFÿ6ýù(nïü….³+—áC?qc°ÿ§_üÜ#—e†Ý>Çf´Ck+I+þª\¶_ù³í;×»Ë2½š­.öŸ}±ºñ Ž×–Ë´/†ðGø•œÝ£ùð¥ãõõ³_þÆ_ ƫ۠ŽöBTV Þ-JúÓ/ýñ¿)·m³„ )ɹ:ɆR1Ì’¶0äðäp°Ñ94¡v¡µ6Jb¯2õ^¯áMU§RÊC¤º"²Wf6úZŵivê ç•ÒAÅ õA-ª<¸XÏ0äæ ÞÚAyë¿gÆp{è¶­kG†£{tPÝ ÐÛlx ü–9É‚¹N 0?°@Ð@nã4œÀ’Ô‰ï öì9Ìs³0Ç@;p9ÍejrrMmÔ™ÂkÔs«««Ï<óÌ'>ñ Ì67¨£qÕõ•çºdLÈÑ1c> €wwwÓ45Æ<ó§_ØßßßÝÝeÄ8Ž}@Ö©C‰§xÝœæ}â*¿I£º."gò²,O“t‰O˜¯WHM“ø”ˆ¡”R‘pÎA>­s8ƒp\õt>›Ì+/Ý]–ÖZ¦©ÑªYÄ¢¹…Äi6o;ð†55 é¿y®ý‚ΰŽWgÎSô(EÞÌ.:‘Õ€ƒÑ^?i­¬_þ¿?øT÷÷~oÑž»;Ù‰Ú€§x¡ŸÖòáÙ(š,l¼òOÿù™¸÷Zaoì‰âÁô̳“¢|áÚþkÏõ7oæ õáëçßøG?Rž}ûÑù+“ç¿m¿þ»&½%çÑN~x² bôÕϽ¾skµ»rhT¾i¢d0Ôþ§ß磲P–’Î&èN»ýŸü\{ùŠÖû/¿q].P/[¼tíóðÄþÞ`pXZ#Ø!ƒU “TM&#/”Cû}ö½³?XZ_O(Û»û}Ùê÷âÕw¼{oåâø ü¿ìïç mi¾¸< ÞŸ‹¥{¯_Þó¶§xükW÷‡9‰ûÛþ^&D_@J!„­—Í“ø ôøåIÕ¹Û·ï´²Ç,äCSýÔ?ùëk/œi?8>X ÁõmU~à‡_JãdpûÉw·„qÃ6/=ùøWµËíäŠå¸Ûsã½q½Õe±s³úÀÇ¿Ü[,žþðÙÃC›¤1—”ÉËUðÇÞ÷ê+gï\ïEtïòÅ-x°È?2[ìÆñ¾÷|ð;À}ê¿­Ú¯6a2ôS;åª-Àlñ_ý«=ue3èˆBKÅÓƒ„¼šäâÀsˆF5xªKÄ×äÉQµN4am=…ú_žDº‰‚n „:@ãôú›¶SÂ\¦= ÌÀF£«SK†yð:¢‘ºù¨¹Õç{úÌð¯ÓŽô‰„Ï! ©yW˜ö&Izó?ÌØ˜Ãó•ˆN|5ž¤„ ª‡Ç€¹ù´&uãF à FkŸ'Ò§#ÞÚÚºuëÖÃ?|÷îÝ•••<Ï›:¸I ‰È¹ÀX¼%/èVšMŠü±Ç{ôÑGåWÿ¡&! IDAT~eiii0u»Ý2ÏE#&0|§e>M@=qÅ¡áU~ìAÓê&Pó—RÊ¢(Hž,iá)¬Ù4õLáûHDÓCê‹^Ót?3ÎïŸéí§èÖ™fðª#"âYen ¦Bo^v "VF78l§ÀèÌ1ö¤º×Ddõ‘cf¸‘™ƒ«FØ?ÓŸ²^I;*†yA+o»Ì¯~«S¬Ý-÷–“|rŸ³M¨Û¾} wŸxãùë=D­oä{œt—äZ|{ù±Oì,,ʃÍåΆ ­÷í¼|uo¨Ú­ø®´â‡»Uö]v€.²JL&Ã÷¼Ëu?´\–ãI>èõºû÷nõ—–ßû”lõœ­zheö’Ó˜ïüK¹?¼úâ<:·~æùjÿ¡ÜÆÜ½ùö··'cmŒ£Ž ¥Mim)$X‡Åp0Ú«>üá·Å ‹;w#´fõÌ»ÕÜùá^«Hèùw¼;[Z‹o÷†w‡7†š—J0_zæ;+ÿò’ÔW®ß»¶t9çÉ}ÆK)'RÆÚL²V„¤U„¦Ú‚‘µ–-D2Fž†¬à°Ó^9Òùå…îŸü»/™övþgt[­àø!)o\xŒöÛŸÿËgÒø¼Ûf÷‡pí«RÙ¯q°{8 l¨ä•´{}gûÐõåg—”ÌœÓÆÆmv¢ÑOþL²y‹þüs_Tªgò‡P•›úÛo{þäßÝM»Ia'ûûîL{´³ûùg^ÐŽC,·ÃUU5JQô£viÔðßüw_ú?ÿ'·•º6É̵°öw“ò6Œ G^¦AõÚÿ§·>r#KÉ x½tè‰sÎk˜¡6z_J¹¸¸èµÊÞ6ìݪý½EQWd/xue’$žÔÈ< µ ÜÛ)}BHÆs4‘ꢪyVÏá`æ`‡ù!s{î‚94á5ù¹&JnÃ52iøbÌ~†¿}NÓî%O•ùPó"\Ç_6éTè|“„5Á2ô|î7ã‘ÂÀ¿È¯—ßÁŸ.„+5Ù—æ®ÓZ///‡Ã_|ñÚµkKKKÃáÐožã@Â]ÈgØwµT}$¡¾%H•®vwwŸ}öÙ_ÿõ_GÄÝýý$IþÆÂ®ÿ@ ¬çœ>ãÄë›LIó!f¶lÕa U¡³,B袴Ö*/cXk<4±PJ@d@fËŒb*‘®Œ³ìsÎ8+$3³çRÐ}vЦ¥‰ÉÇ©303É£j7áíÍ>Ì œIÌl¿p½ž2 s° øuò÷OÏ»ÖÔ¨¬æY£OÑ7¥È%ÀŠ™-`É …¬tÑ€(¡S:_Fˆ¢47ü%ûM!Eìà¹JH|?R)p¤ÍÉý'ܰü:ÉRòš)ɉ’•®€ P>gÇÇí=†I1n«tGØ+c¸–D+¦vr0édÙs½~Nã–¦“sQ:@%da5J(´N#p2–Ò/Û”F@Эժ³@àüºvÕX¾¬/ÆOþÄGÞµ~îð¸·}Ûþ¿ðÓ-=Ìœ^ºxç‰>DEË‹W66¢'?|aë:ªº*[Ûû‡F+füãIKÆÙ¸4[y^Åj=Ë2íva¨~ð©|ïR»ËVŸUU¥9ûÈ»¾4²?ûÀ½½a®wÏßùÈ$W¿ÝŽ<®¤B¤išeE1˲,±ÌPÎâŸýÙŸzçåuº’®udæÎöÏ5óÜyà Û=”)<šÊc6¸ÔE0øF£ÝÝÝÑhµ-9Ðkèv»gΜiµZ¾:aøܤã8β¬Ýn{-ðÊmk­/¼ˆuPúzÃNÇw[k8â0LO§æ8(œQÌÐÁ€^…{œ4éEsZÞ€ÃC¸6ÔAMs¹¡~ðÓ5™L7½f², ìjW8cŒnâb0-+!˜‰†p0§‚ÃiÚ×›¿;ª]…O|ø$ïªj Q$co3Üdoß¾Ýjµ>ùÉO^¸pÁûWû,ÇØÖá1Â+¬¸Þx€v€ß¤þM»ÛÇùÈGþë_ùoÒ4ÍÚíªªÜi¶§´Ó4÷Ûü<À§ÚŒOâà˜I‚ˆ¼OÜR9Ë2A賟Gjš„²¬ãÛíl®Óv; \û•`àJ] ÇyQ•Ú²qÖ£M05Ä ÿÍÀÌšØ/Ôì¯qp2ú6•Æ3cóuš§ÕLM6sôŠdÐ? ”wÛ­Vóø4ÞhQúá^BÍ¿î-Žv®.aû^±›dËèŠ×EF•®ÀhÇ„L„‘ˆ¥HŠ])¢²†@*Bdç ƒ¨#gɱaÖ$ÈÆÆ€5„è¤ôvv°F$) ° ú ;f „þÜ;ƒ‚”\UÕd\I•86$tœê8u@©ž,”“N§wpbÿ-°±C%H`ËT¬…ì Úq庈†ì„)ú2Û» i'ªœ”£;³ú¶á ;É“ŸZ“Î9¶ÆZplCZ>cØÖ%åCß–£Gºg¾S 2…Ru®-®oU ¶W‹ò`¢ß rµ#/ÞyãöâÆÁù·íܦ„÷6Ù*9¿wï\1AwøDkqÿ½ÿì/ͯ~ó±­7.¨„³Õ;Ày™·‹ñ¹NûµCýÒĵ5>2Ç)J“Üz½µ¶øµGßö¹Éh<¹pqïÞM¸úÜ:—ç)²Þî›$‰—=MŒã*ÖE yÕJÒ^ÜÍz*Ié³X>¸†×•­³@‡›ö<˜5øya7}fU‡ÃÖÇÚgÊG!§Iêý™¹_ ˜Ê'»Ý®¿&$ˆ÷\¿ÔÊÄþvSNiSøãÙHÓб&C³:ð&ÉCnNÝñÏ0ËÚW2Ï-DXW{A‡Ûƒ…[4aÃ]~¯Vfšš;Ì[8Ϫîa–š7Iys¤aæ„W׎ ó5Wzîûpw¡÷ööVVV²,[XXèõz›››«««^û:G‚ýèDˆï¬%àé>9šæ·ÀÞµþæÍ›$ÅÚÚš7µJ)ñ”øÚ¹¥ íï €ƒ³'+×xâõ§-œsnΫٟÄivšhô "@``çÀùä ˜z'(ïj8“ÀÛi­Ÿ-ij\Sé¶–tÀ‡ÃM=0¼Ÿ„›2RG/ªw;`ª=-˜fTšGÌŠ:¢„mÉÞʆ~h@@ƒXIb¡×žTUUBéÕxxJx[`‰(ȱ¦Â–¶š$IÑ«4ƒq`ŒM°`,[‡Ø¶B¨ ¿â@ª\ˆ”MÛØŠ¢Ý¤»oÆ«ÖZçŠzÅ%°@Œuž(%c!P"`b$"µåh4ÊRD¶\­†kˆ ²{ýõ›‡wO®†ää>»¶v‰“¨´†œVRFÎ8Á42:GÎ*ÈBFqy0ºYT…ˆH¤Ö÷g#—Zk0@Ä ÆQ$ØÕ"E`¿rƒâÖ¹s/]Yº¶­×ï­o^rëúã.Ò­VÜ^êÃüåþÊæ¹ówª’Ë o½øàpw¥µ`ŠIi´ìWfÐVzKeÒ–‹Ea|¯½q;5G#åÐõ–¡˜± Qbûö_¼ëñ÷ÚGÞû:ƒÊë¯?·<Ùï.-·«xâÑ×KK^i)„Èm®@x,L’LÉ8‹³¸…XQSm>‹FÀ.4ê#ãî,À‚àÊØÛß…šû Ñ©dÖp²ðÚ‹¼0WÎ!<ÓO83{ÆÂK´q[¦OEÆ^½BEn£tÊ~¤iÊ&¢¢¨Òè”T ¦¯$‰Œ„ ˆÈpn\éò!K‚˜°CEàØ‰Ü±!aH"°Sè$p&ÿ̱bkÝr.± ¸ä¼ÌÚQ„X!Z!H+vAÑÒ×ÊIZÙTÅ-vÑd€ÆZ•TÆDENÎ%&YgϘ ôp?kwO±µ"Z°:a¨Ä !g ÆvI(«ÇUY¥à°Õ=0×NaÜX(Ыò äþ›ìÛãMZkÁ€`8Êq¸x[—˦’Íן¼öì%ç(ÊX/Q´KÏgî\U=¨Ç<¢¤}ãåX¾º ¹åÜ‚S/;³XMº¢u/éÞ F_ÿìÛzYl¶Ð7Æ®jw“ $ËÁ¡Íݼx—]­ÈsÆ9£‹b´wá/ŸÙg–úƒ%g³hñëxî`0‡~WUeœ1ÈJ’Z^\Z€^ÖÊuaªà`uô‹÷þhîò0AÍP“HaßCI‚x-Ԟþ’GÊ@ ]ÿ½wаêèùÖpx|TL°vû¥ñÇZ\öHÒ4MâDí!¿Ì§N²674ù&É›Žˆæ‡9}åÒj’ŒæfjÎ[G›³wâÅàýYjÖÄÿËK>¬+¤øö³áÍx¾óž Š ËGJÅÐ[ßåðM`; ‘mXÛä¸!‡~B†45 Öö{Ï1øÅr'wårô/€ápØétxà›7o¾ç=ïñãjv&¼jûÜ”:s Ò§Ú€O&”Ãñ_xá…ËW®h­QP»ÝnµZ¡æÒ\û‡à°Ù fŒ#õVî ŸC€5ÖúU̽ÆXù@ð;ÁÊ™T'x¤ãqŽ«mÀA6Κz•«ªÒÆik|Ø!7lÀSu´ÏÙè]±š*èifÊÆ«›¿COŽÔ6§IÀD` æŠv3G*„Û!"R³µ²†Ø vä,‘F¢SíLê»*`ŠýY*<¿¢5Ä>Q]âYÛ“MÂn Œ­°-³ŒbŒâ4Âk­sœEÈ™'¾r.º5 –e‰Â WÊ™DpÂå"—çªñ’£Qº°³Ð­ª²3ÚïL¸¡o·Ö°c"•vîN¥ Ûu•ÄýÅíÒŒËñb,c•äD#¶e9ÉÁFq$┵9™±³“N¤”u•Î$¤3³’F—Q v±u9“ÖUL˜¸á9k †*‚¢(d¤„Üa›ƒ¾¿\’ˆP)¥c ýj`fžAŽäÚØ(.r¤­9cLœ“¼cÊó¦e5\Zo•ù]†A>:LâJ›R’‹zÛ“ ÂdµÝ‰U«—óÕ²Sf S¤ ÄWUµ]¿ÿØíñáêh/*y_d[Q¤Ð®s¹Ü={wçÞ®®–lÕu’:Jó<q]ÃÀwÕ RZë4K# ¥!"Zè.&EV:·‡©ÌŽ{{r]S3ƒ9ð˜£ÑT§½ Ï ´ÞÕE÷nñ9òísð)÷”=¨Ë%5q1ôÍÖÍG'€×{(›ÚªÐšws !¤ÐjÎÆñ67QsÜüþ8Zc­K ×xoµ°Êz~ðx‚2y/Vjd½ÀY-:4¨mØáû°Ï]†YBEQØ-ÔPq‹F6ï¹yƆg_øWUU‹‹‹ƒÁÀóä“O~æ3ŸùøÇ?çºá›P3¶À0¨FêÄ øø*ûæó¾]»~ýG?úQ©¢(úýþÁp èdïÍÓÖú4íý6šõr?Ñ¢qZšc ¸Õ|¬sN&ª±'Á§\^ߎÈxdú«Eà³ax.¦VÒ""‚ ô®L\íhÚ€ýg+¦ò3ðI6`hœ‚¹ÁåŠsŽiF1®l2—ÍV2dyžŠR2ŽNÞ$©NC‚S,Dm¡*Ç$ÉØ4†iq9)¥³''â0Õ£ý49Œ$XÍãÒÙRb#3pÚ@$cIJ°d‡R¥÷X¬uȆ¸r’!TìK[6]¼Yh2ˆ„(Q :Ì ØIëL¥Çˆ ¹¿Ù[:?éöéðn4ÜD‹×PÄ /–ôõjÐÎâU) 2w#•gi ,K·pbÿA'¥ƒ²îµ\Õ¦da6aÐÈÔéŽÕ„ÊÒZƒÅÞLî­$ÉHÄy¬ôhUØUÆÊ¸O_ E‘÷‚6– òz-’þ‡K§èR,ۋܺq.-ÖÎ}·»ö]ÉçŸýÚ¥VgB­ëv_nÞ^[Zƒ·¿ëv§7*îÝ\¹þ½s#s—’= sçĨ,qòŤ;RvmÕZzáüƒÅ¥îx &;;pûz\ä]…JDV3•ƒìñ÷>ßïÇI:¾u½¼sõ©­{i¿–ÄÀ“-O©Ã6-&… %D ™¦‘ЀƒY#ìHfžL&žU ~X羘á:gÍ–X mA½éÀ¿Y–yÃ^¿¨aŽÅFÅQ§vòZMïYæ3 ³nó!Mr“e"&IÊòø'Wµû³ïú±Ì¡…€À@Ãkº¹Ž޹ÏMî$€+4nª‰iÎ-ÔNp~z¡Ö*‡©ð-¤¹u®¨Ák×5¼ ¡Aè››k¦Q iæ7a`wBŸ]Ó ¬ÁYk‘¨y}¯ïg»Ý®ªêÊ•+Ì|ãÆõõõók€í‘Æbú˜)7vŠ·ói6àIQܺu ÖÏløóRY£µŽÓùœbÿï´0s£>m]Žßî?œ¦²ö¾RJŠbDä`ð°ê`vBÅj42;˜:aù}ož)#D§sn¤àŸ§ÖPA79¤&s#ùÌ{؈VžÓ6Á´ê7kD6ÒÔL£Këµ5äÓp°«8Èhqšåƒ}X6"!H™µâ Erl‹JW±÷ÀÞÆ~ÞVñá>,H3YÛº•æÃ6¤÷Àb)cÔ†làFçwCØ.1 Ù”€Bða«]ž¿òªê|oxí,Šƒá€Ü¨µ°¸¡£{WÞùºsîëÿþILo¼óC{ɽ¿ãq[‰.⨪WûÅÐåºBªºòä««ç¶ÇûïØÝšy¤³ç*¾ýÄÓûDÕóÿñiG¯¿ãÇÿlu%úâçã/D­–·wzçÅ£$I†“aœv“´ÇI†.ÏGã*s(¸©™ ä:À7[çnBB“.xÉ5ðHDGþAXÛq¡¶s-£[kó<‡kkkTWQ šmDôU’‚•Wˆ4QذãŦ”—¡çàáD®9HÉ®ü+š@BDÆ šÜhM¨9LåYå-4°ö8úžØ1xAS’ÌwÒ[U]GjHª©SOˆ´®<íÊY)êDb×lAE¸“ <àY¥=4è¬käÓö½ò‹k­MÓôààà‰'žøÆ7¾ññ<ìÃ9aHs­¡ª}KaHƘ_|ñòåËNgaiqoo¯ÛíêâÔzÀ'¶9âð·na[¾Enî%˜=Âs›ê¤EiékŽ@x3"’¯ „À/“eë–]¹` IU¶»ã¥Õ|´Ý¹¹îøÂÙK½^2>·¹»¹b†ºô&³@`‰h¤¤4£î‚ìD¾ñí Ë£õG_=w±£ß½waÿ[ÕÞã­…¯œ}ûó"‰^ùë$~Ì=õ¿ðµ/?}bÿt—n2n];«‡’Z©©œê Ö®)û·—‹‚e<é¯Þºöí…rï;[KËçÝs_ë_Üåëvòžò>½  Q2ØJ™íþî¨,ÀhrlIT±Œ%J(òÉ« «Z½´Ò‡¨—ÖV’¤e&‡ÉŒºÓ]Q¸è;ç7¾ÚO_}áí{¤Œ8ÿ­/<µ¼rseõ»ŠÏ0ˆzDŒËiœ‰(Úyè¡Û\í\{ñ!¯î‚}åù'#>{þÒÝÖê·mú¼5tnå‘¥õ›WŸò.ßÙ®²¯áív|öâž­ ‰Rph*‹L^ËLà £¸28$ÑÚ;,¬8, V¦,uQ™Òet– Ä(ÀõŸXm+m+Ö8 Ä@lœößX6¥.Xÿ(ËÆ㟠à´.µ.œ(Ʊêõ:>–:3aµK¢4V‰$5Ž¥Œ|¥œ4m)GQB$Jᔈ"Ç*‰U/XCƒèìåf“êu°ZkãJ dýxI ¡$’$ BA¾¨qV[£K£Kc*ËÉw ¤‘âºFÂ,åšÑµR#G&6 ZXk˜y–åtÓS?"k­÷1†F$ïîîÇEQøÔóÞjúÇIwÛ4Nj9|ÐŽ6<Ìñ˜rÏ+®¡‘Ϥ‰¯ÖZdšn0‡¾žŽ(ÙB¬¡Kã û ”ˆ,F‡¦¹ßÑùmfÙ¨HZ6‡ÃðCøÁgþü ã|æ9Ë2oš­'ëßmŸ:†- wb%`¯¦vÎc¼g “$!¢ñx yY|ù«_ùñüŸL&“^¯·¿³ Ië0Í07yΩ”LC°À¾ž²À•5…3]Nм4Ñû>@:ªúG€äsX[£c0Ž ¡%´…s¥s“²¥µV !$;á¬d”ŒPâT­åÏT„B @qä•L>¤8ÌUpKöþÐ0]¸%bðÏiþx 7\*ˆ¤‘Rþ¤@¬_ô§õ³­sÆZmØæÈšÀ "1M›M€J·eC’À®31P>ÝiÇ~6÷àú+ïùþ—?r,„pÕ’ T»¡u“J«bÒ/òþ ·ùÁAaFyû¯>÷¡N׿ü"¹1Û¬²ã ¢vrãµ[íº3Ãxéêëí¤³sþ\,¢ƒÞu†Aõ&c»ã„ƒb±ÓûÊŵÍï¿tns<¹µ7ž{zu!ë¯ÿ±c¦+޶VÏÜ[é/¾úì;ù;ïMº/|¯ƒÊll¼¦÷; S†Ê!”¼ Y#+{¶vzÉÎåÕL-üÅÐäž<¤W¬Û{û»Ÿ£Ê¢^Û!´+§/¸¨ e7ßÚÞxã;O•ñCW†ÇwiÍö¤ŠÊ˜*¶@ª?ÔÉð@J­5X¯ps>âÔµ$ŠNÜ÷(m>l yD‡íÕÛ7¿÷èÆÛžíh¥bãv WHÝ^÷¬ÓFçäp'Ÿt•Aç\·×ººÒ“ñ„±¢’nëv+¯¬)'-[ \œLîh¼ª²3X= euž“ ß°:Ò%)‚ÈÙ;lµÒ2Á9¥_èg’$J9†iú*­Y£1,ÐN3ïxÁÎÕÉ}Þ¦ÚMSBsN#ssKnln‚€pXK¡‡áš9«©'w³žÏs{+|ÆÙˆã|Éfî™Mn=¼´i–rhȲ\kÔç&ê BÍ>‡µ8q!š½û³Ù±'9|‰>+o#ž>¬I’e‘¦©WJ½ï}ïûô§?ýŸýóŸÙØØØÙÙ988 ¢•••Á` ¥´ÇÊä½yóª×V«upp°³³³²²âóM~æ3ŸyòÉ'}ÈÓxEÂ>mÿ„ : ¶*>¼2€C «-ƒh¾ÅÖþ€ML‚õ)¶˜æ)h~ SœËŽ«¾ëHN '™ùÈñÆSE×Q<ƒ>‚5B° ¤#QI“5€ÎIÕ1Î9yÊüKTšªò Î«дÓt‚À¶\¬Š¾#+D 8ˆù†¿Ö|ÇáÃ2ê‰ÎÄ¢9’+…1‰­´"ˆÒ/w­)Ï­®·†;–õ–A *ˆÎhfGÖZÐÞ FJ… :kÅY–úØ/¿#Œf£!m99"@+#AЦs²/Óƒý;çûkAEK,'¥CSõÙå¤ræÔ9ddo©zå¥ -d±t1’µ|(HÝopÞÔ¥( Ä©–ˆˆ§&w1›‰™DI k¾a¡Ø¼~þܼì\…Hšˆ2ä¬ÕjÇ{¦ÌÒÖ®(;ÈPUU«“0Q$Øê$j'‡q_·Úâr½´Ïoæãj-/çùÐU̪}+wt¹›ˆ¢•¶t™9FJE¦kíB¿ï`¡uÓºv¦‡)D IDATEBhcƒ7[k¸RWÞLâCHÀdëpÿ ÔÒ^˜ð—M‘íoBxáƒf]K¼´êC‰šwÍaL¸QáÌŒ7lhÅcçq8iFГSÆÓÔœ]®¬«©aNι׽|ý[®ü7Ôˆ›ÂZ~mv>ü7ÈÊ>³ws™š$ò´Ï] ¿žÐÏã0NJ`_ØÌ”ttGBdfBò0ñé§ŸþýßÿýÍÍMQPê÷ûW¯^½|ùòþþ¾P÷Y‡•(MÓÝÝÝ……"ÚÞÞ–RÞ½{÷Æ¿ø‹¿Øn·}l›ƒ:Í€ú&í´y; 8ÿ¡ŸÇ %cL8DÇ.I””T¼6nœvÆ1ãT÷‹ÀÀÞÉÀG(7À€Á8;uÇA÷-Žå4Ú°sGT%Üqâ“O{N¨[fÆÏ•!Æ:DB$`',³@Z³Îx"Š,Oam!P+åˆQùÐ)ô m“€(Q œ$*%¶n;8dKŠ%õF”+œpÝÅ¥j2:så Óöîp‡ZøDâÎmÞx½&ìØZö§GHˆ"á¸2•5è´6Æ$i¤–`¢˜’T[Zk„ÂYa eJF32 d… ‘\Ejˆd'ƒ3qR.­%ƒëR¦9VÉú¯O†«R âÖØAŸm‚TDùÈZmZm=žlb9ˆå ÒÐÂàþÊ5Nƒp´ÖêeF7¥Y²QÞ|ºt¤”ÎÚfõòÞï]f*ŠQGERW¤rAcÄviwˆ£΃ŒÐèb2©¬Í;ín¥-öºûC]ŒâÁ¤÷–]©ØÞK û«×Ur8>h;Ü1U¤‡k½îëºÌª…Š©J;­¹ÝI…Òz¬]&‰.»$%¢qÎa k¸éAü¶ü5¦.4ttÀ„µI[ÃüÀößè²¢:÷‚Ÿ7%FÑ´@lÐ2ÍÉaØ0èQÈp4‡Ð¡æÚõÒüüõG¶%H-ùZXG49ç|в© ]:í„Ï}pë~ÛÁ ðÖä67`O  è µ¥–q áö°Xá]o>"˜ÅঠÔìCÐ6/âÎq´ÖZ§iZéª( ¯tY^^þЇ>ô»¿û»¿ök¿ÖétªªÚÞÞ¾xñâ­[·z½ŸbÓ=­Åir8tzŒ°w°¿¼ºrûöíßýýßûÐèÁÌóÜ3XÌì{ò·ÀàÛý®þiàôwáäæ$NkmåóŸ$J©iDo uÓð\tÞuXfklY–y5­­ÒT¶ïù›ŒåoÁOœ88Éøý¦wžOA3åÅÉ"B… - ‰B[ƒN2*#‰­5Æ6LNŸR d, Aa"ZFãœs¬ØT“Š‚’-‘v}Wö¥Õ¿íXw/Ûò²sÚèÖd\ô×t»{¸ý†dÓ__nu{Ï vÿ,ê>ž."X`gtå3a1[©@›‚I±Cv`LÇJHr.7ÀBrY΀„0ŽØÉ(-PÖ‘5(¤dO¡BºèDQtóåþÆ;¯ß¸µâÌA§=Êw¾¹Õ‚tqXÇ gA™‡;hÏÊhÇ™xÿ–”JÜg¦lžTyF¯ÎõÆüYÂwDË4ÅY±qe«-íÜ]ÓýJ“¤‚c^BlUnÓàvÒ%±ÛÛÍ0Ùìˆ Ë@e™·³.ipÆŠ¡\M²!ru㥳<¡Î?¼ïn$tÎ?pÀÕ™[WÏYWD‰Ò“!'ÅD2 Ž¥Ñœe‘uO7šn±SSŸRDUCú™n>œ•;…j"ªÝ£¸¡°…šÖ7]½ˆãë„oEÄ!‹êà¢ðº&eixf“Ð3s3Çû›Ð‚КHc‘ûÍà ®Æ‹ýHê„þœF±ÑNìž^Ì yA`JË2§· ’€sAÏïžYAó$chРæ 7§ëø¹NuþœÔ¦ÝnŽ38q~ˆaJÇã±Çà÷¿ÿý¯¼tõw~çw~é—~ÉZEQY–ív[aî ™Ù#¥ÜÝÝíõz‡‡‡ŸûÜç.]ºôc?öc~¹À» x$¾_þ»äßåù§õóøÂ5÷¹uÓcNDÞZ¬”"@(N³jï5ãœ1¦4º(‹<Ï›²oS=3·âp "ž¦y~+í8³ˆˆîM—á¹IFŽ6':dD$L–2²3–œcRÖ*v ­5ÈÈX’àJ–º 0(-;)r«W˜ÙQ‘gv²”´&Ùú÷Î>Rn­ßzåRQÙÚìoÞ(!]züùW¿ûtÖn\üNQN¶®=ÅnÙÑ=+Äd½pÖ9¡”4¦ !ȸ©4%%8ÇFk£”4Æ¡$DR2:bJ1’fVÊ;e03¢pºÜF)¶n,{Ïkëïî¾vöâƒÛEi÷b¥ wˆ0›3Xå–öïíܽ.W–—úz«uøâ X=ñíûZ\Ù𰡆Y“6Aظ^›ªŠ´•/¬ß}ý›?‚ Œ&¡Æ–cAU-X(AäŨÓïˬ»·µ*ÝŽ3¹ÐKòJIŒŒ’‡‡q|¶µfªýöæk¯¯¶ûç—»[F½¾m^9ܼlZoDIaJ2Õ +,˜“8J%¡¨ªÒWƒñö€çƒU0Ф,…A¡¼`älàˆÃø›–ª:ƒ÷M¨P¹Ú—ÇÓôÝj)Y‰ˆ™™ 2KšZ”‘I©Â›Ùš …Sè~Àþ©8~ €ƒ¨p«yïÏÞx¬¹‡øŒ‰á þš&(†ÿ§ c{Fg ®P£Z˜1h—& ÜéÔaVv?ñ]nÖúø5pŒès£Á1Ò"W4öι4Ió"—R¶Z­ÝÝÝ~¿ï«küÜÏýÜoýÖoýÆoüƯþê¯úœ£ív»(NNÀû&mœçË««»»»ý¥¥ýýýûoÿ­”ò—~é—’,ÝÞÞn·Û¡ö%y—þûzþi׿Éÿ½<ÿ­ÜÒ„YÇôz¶°¶&²‘”R épZÐÈßíM¥Úšªª =o,Ê’nÍÕ‡c ÷÷2–f›ÛH§]6ýWãýÌŒa+Ò<0O‹s„À«vgœV€p†™˜ç1Ã)Õ¨*]YSËÖ8kÙYF›}) gË^5:ÁÊâê k~ok둽[kYÔ»cÕ5[¬ ÆÅ¤sîlÿÊ{žUËß…Á;î¾ò‘›ri¼¿}q}eâ=‰„³ŒÎI©\ÌÖ—rWDÎ9`-û £I’LÆ(¥$¦©Õ°–ˆHÂ18–„ªš´TRŒ:Œ¸uíܹ^Ìo—Ã×î,NrA>m‹C!"[:@½üÐÿþü¡¢o™Ñ2æñ×VÇYgéNyÁ0M·E³µ…À:~ÐÕEg›KîœËÔdõìî`7½{'íöŒsm•uuŽ\¼£˜¶®=ÜzhÐ_Ý>¯rudQÔTFqÔöd?"IVÚòîÝ{‘g.fËÉÞv¹?–)>ìò—³Î·û窭;WlN‘º¦Ís&#k°dYÖ–" ­5óT\kò RJ±D$%DQ¤*«…cÀSY9ˆSM  Zwðù§B.e¬½9¼þÖç¼lœ ‘ÁØ'ß^ʶi¶Ä!ÌRê&eoR“&‹YGJ7›§0<*{j¸D6_áêܹµ!D™Ç Y³·s$Àóy @®ù[el(u©¶—Ï=k»¯hÔ*ž“N“†ÄÊÌr?soŸ[hЬãã ß7Isˆ[b¦´Ñ¶Îµâ“{Àx<î´º?ÿó?ÿ'ò'¿ýÛ¿ý‰O|B±°°P–¥Šç“ò¿yó;PJ¹µµõéO?õ©OYkƒÕN“ÉÄ["l]ïùïÞþ¾$ã¿Åži®f膯ŒˆØZ¶%kg¥®ROã˜Ý4Ûni4ã´êIesNcŒµYjÎó ÉœÍíãSñ&“3wrOd&Âq>–ð!ÜXoÔ£Û±V8£³ä |f`6< j¯vb<¹ØêôiÐ!2’­‘R¢Àqei.©ŠN«¯y¹¿¶ £sÏw!F‰fQŽÇ:aJã|u-ßÚÞ½ýòOùø…G¿¿üð³7^o5i¯<øFµÓv(Œ­”ˆ¬1lˆHVFk]‚”ÖŠ˜À9ÇÀF[Òh-¥2Æ1£µБ@gªØbɈÐ8g˜!!Á€9ã JôíWWúg7Ï>øšÍq÷Î9Ç Rm Y†ˆ¤±$EyçÕÞæëŸ:v’ìúÙs£ —óxaï;ßÌ(>¹ÒiM6å§©g©ÖÚª=ãqÎÍ')–Ïm}÷kç”åJ§cL¥GÚHf+ã!TÙæk+Kݤ{æÚê•Éhpfëêøà`§ÊAPìX"€sf2²IW¹É¢LõòÃ_‡ÖÞõ¯¿]çt¼ŸfkO~xç죷6北a¹²8„Ñ;!ÙÒ1Wq’´¥ŒÔ1{Ü].±S…Ø!%“rlü•ÁØj>¡:ÿ°íF\«=;Œˆ>;37㦰jRC„¤ /=¿¹ºo À³Îî8Ô5óô ›A”²fÕ‚¨ÇŸS7L—Ðdt¸.ØüO*eØìÞiº¸p{hÐPËÏMN˜p¯„æÿæÜ†{±Ö^@ ÀÜðÖy“U8Nw£É£¸†o̪ʛwùïƒA»Ýö«°ººº··g­mµZÞCð~áþèþè7ó7?ùÉO@¯×ËËû‹/L’d4mnnþÁüÁÊÊʧ>õ)!„Ö»Ýîxþ¥ÛϾk|°©{QÌÖÔN6N I}3:›$w“–yý¹‹Ã×/¼ë¥ Á­k¾õuÙÍÒJ("(lis)”`(L U(¯Ævš¤˜W.™Ôï¿ò[ÒôbsIEÚ‰›â#7_¹~ïõ+l6Ò~å¶°7Ϫ”ôèÝgŸ¸VèĸTDù¤ˆtëºZ8·ŸßJ:D®ˆeeË¥ªêëè:µU>¸¨Ý7bwÚßÍw¶VñûÐùöððƒiUˆmTÛQgç`Ïj{pâ㽨êk13ÉÊ™(Žz£ÉP¥FLºÈD!I‘^hÊF"MS"šL&ù¤«]Uh%¢ªª´6BBÉØZkµ‹ã„bÆL¨©À²%Š™µ­„"’¨mÕmu­µÃñ€]’DUUø$6•h­p$I,uÁè:Q[Å’Ñ¢3ÖIÅÊé²"D©”1†I)±l]¬¢2/”M `IcŒ$”„쬔¢,s))Фs†Ù UUz¡¿ÕjUU•$‰'ÍMt„Y]÷T9õzÁrç¡<ŸGʪª„šfNf`¤†s²ÇND’H€Æ9@Ò[p½»c”TQ¤lnˆhZú‰¼ç‚eS–¹BëÒZÇm) €‰H:ç¬s(Èk˜ê¸¿ý©â²'UÁxïÿ¤j¬ "¢PäÃÄ…"§§å–MEž¹ñ—…R‰V²¬µÎ’t×:IÂë€ã4ŠÓè—ÿ«ÿò³Ÿýìÿð?þ÷O<ñÄOÿôO÷mãKÃâÂëß=„Å‘LÅdTå’ÛïïGâVü‘©ŒÞvt^䦠XLt.©Á "‚#yŸ6»9f«Þ0Oð†ƒúˆ -9؃µÞž„[»™‚`Go‰N–Ô%‹ãFgÁÙ††ÆfgÆ•I(‰„QÔþElØš#Ö*| º(ËtÏ4ÒŽj7•°}9ƒé«ëºÚSªV#û}ëlE8åõe<åáêæ³ë k3KE$ˆÁYp¢Î…º'¥Dk-cP°9flèÆ„P»Ã"£Ëâ˜2Dë+2ƒsƒ-IÄÒYá¬N¨×* C1À´È„ð!‹`˳Yk`ò޶«…¸iìãïj³JŽ…NÚñûØÛ²ýÁÚ÷¿ý>« %Æ€+ú…þB‘ .•ãW.=y8ÚoMè=¥}9ŽÌd;ío¬]ºþÂòêÂøÀ¥m)H‹¢Ê+\Z<Ü»o, ƱRÑ ·ûƒ"ªÕÍ­[qeªñÄ­”7o×:WóÂôÆrï¾·´»ƒñ¥hys÷N”T,©°wÉ&8h¡Ê }6çÕRÝ}õVvãÞ>ÎïåѽNUD¦*ô-#Þw¼¬Ÿ`¨*ÙáʃÉäŒ\J®ÞÁ3?°°–®\5$„€Î2#±€J¸%&Bm,ð²¸Wzû^còR±Î åáúP ÙŽg…Ý ^„5Ÿœ™Ãl{ÍDଵg¢3ƒRj³=98 醦¨qÒ¸\] guÑa&ýæáÚFE‘RÒk}½þ#̪_”)n}ùáèk?û[ŒÖY–ùÝòÑ~tiié«_ýê/ÿò/ÿÄÞýŽþ‹•³çïn¾‘Å¢Û;3LÌ(1º¥ïrk»«µú-+¯½üê·ž{ñk_ûÊ}àýÿéOý³³çÏ;íPs7nCå„£0.®u èÊ“%àÓ”ŽS§3×XnöÎAÞIG "ò” 3$$ÀÁr[°~×ÕØÃˆHbš+Û‡ºzó €5Ñ?Þ´™ú. óQdïÑVÄébÇhÀ:cŒ±õ&?n›8ú`ìÌŸõ"öªš¦ê@û2³Î/ºBIeŒ!‹’2EfFç+ÛZ ß[¿ç¡®|kÑ çÑ‘täðO@~YÁ2Lƒ?ŽNMUU ChÃT«W DBá™ZôÖb““¶LI¢¶9–"C9ò£öƒeŸ¹ÊóÉHEœD¢MÈÆ‚`,éÅ¢üx{³Ë’äLÌÌÝÏv÷%n¬¹VÖήîj’Í"{8ÓT÷ˆQð‰Ð<è]ÿ‚€zÐò$Œ¨W= Q€4à€Ý¢Èîj69ìbwuUeVUVfDfìw_ÎêÇãDd 9Xî=×w[>ûÌlÇCÜÙ£š..:&d#NgwT# émŠ[¶¨XN'YÕm.ÃV\÷¶Mr·(N½ö§¢ugµºUo ²Ô©Uõ´ÖÈÓUs6]ìí}IãžßPR4¥#³È÷ÆivŠ©„<ô ñm4~±o¢ÉV3ÞœNß4©/¬D´h ¬#‘¯ÓÅj2:É’±¯LÏã©*`Ö²h¥S8ÅÜHš$˧ۉþÄÂV¶ÄÙ¤r(‚ç óyœ¬V¿/% IR‘A‹@) …ÖB¥9ÈÜhMLÂ¥€µçñƒq"Ì”½ÀÚÚ~Mq:ßL“…ÌU¡¦^S¥Ëá<^(*ߌ † …g{Òz94·?¡Â/f¯w;zE²JëÉö­Õr¶]¤(Š 5iô/V+B;í4—dÄÙ‘::ZR-ö½0M{ÉlíĵÄY2¸³Ê {q<(ò¾R T¸TŽ’SiT@žç>³d=óË—U-Ü$Iø€±@tX·!ª.¿=Š"ªDg]x‘X˜câ8æÈ²l±X ¢‹ö¹¦|}m.ûr‚¦“’ŒZ»žH:/¤”,»YÁ;? J%‘ç9Ëýz½†¡,[;»KI)¥§øUo*Í ø šÅêLµf‹czþÑ£Ÿ>ýù×µº¾÷ö7ÿäOþdkk+¬E³Ù,MÓ Š¤i’òe¡Œó×â‡BÀöl­ e¸„Ý@">V(Pr!d «/•=âÈ+V«hiýZ@¤uÙH „ÌQçÑ]J\æõA%.#®–Dvæ‚)4Ö$`Ö…Vw௒—ØÛÀîĹ_/ ;¹^%­5!<©$ B$*Éž@ˆbm¡TíQ(w‹TZJ"’ÒEXÖ†¿ÅÂú³¨Q¸ÂSRBJ!%²‚E.PAÍzk=mâC·NáUfR‘’Ò <#m6©ª^. š66 D® ªùúD@@䆈ï™Lîìå¤'³çwíªæ©©ôž©H×ÂF‘HáÏüz–hÑxýùñ‘2ÐÞ»mè7ŸøéêŠÁôbXë[Ì›}Ïó‰»Bµ´Ó¢qv|û½“­½qq¸d{»G2˸¥µòéz¾Bë‘,ÅÚã'@Ç€zèe¹§“ Ë RÖ/ŠÜoäã,‹ÂF–¦9h¯ÝŠ…E¡/¼37ÇSþ\úòôœÚ·¼­[Çq6é„'½Ûi ÏÏ'aŠFûEß}ï_¼ tðÙß½>\ù«8õŸÜÚ¾wXÄïm¼þóEQ»¸x3#ªo~Ÿ|cY`,“pë§qBw'®uÓe»ÐžVJ(Ô B„ÀPx6Ÿ¼.¶EàÍò„r!’EÒ2MdÔy‘Ô½ºŸ[KIGSÛZ._å&¸iš²ÁÛl6ïܹ³½½RªÝl)¥&“ÉÅÅ+­4MYûƒ½½=!Ä£GÎÎθ"ÿܼïÁƒBˆf³Y«Õší–µv¹\žŸŸüñÇÏŸ?gY/QYkƒ àF§ûûû¬xØ)§«}ª ¸ZåCVÊy2~¾vßËž¶¬â•ÕkÁçç5:¸~±X8ÛÑÙX×:˜WcÒ4u/c¢; nK;õ\–Ë'¶0p´s¤Ü)FÃáðèèh8æyÞh4ööö¶···w·NOOŸ?~qq1ŸÏ`ww÷Î;{{{Ãáp2™7‹œN§ËåÒj#„ØÜÜÜØØøì³Ï~ô£=zôèñãÇ»·ö~ðƒ|øá‡Ãáð‡?üáøÃGM§S²·¾ó{ÿùïýÁþõ÷·wïüªÙ²ÿ…Hþ«?ŒŽÛÙèðÑ_ýÕO~öw“(îžy¦|/Y–q¯ß(Š¢()N^”²oà`Ýä3ú"ËBcU‹v}Mà*åë —^À@½ç^¹¶“à2Á…‡¥”±é %ç®( ºA›²aeuP¥r™ü(ëf»ÝæjÛãñ˜ûB€Ñ¯n·'Ê}r]–¥Š®­CQä¾ïGQT¯×›Í&‹‚år‰(V«•‚]S‰ÙÒ³ç™;s–~"’Š=àõéð}ŸK `YL›Q"Ì)m¬Ë° óíùh‡aÈò¤ÛpñZ­Q«ÕêµF½^‚ Û) ÃÈÎê5Ÿ¬@“$hzð*üî?ûeQ,„õj­3c0êÍHÐba>þè7<•hýêïEþÖö H& ç‹Å"}¨X¾î€i­5P“$ un`X{Q|_yžÏçsVÀ쫱ºjµZý~¿Ûí.—K(SQ©å^¿\.Y–q´¸ÓiñJFQÔl6YámmmyϾ‘”2ÏóZ­¶³³sûöíÑhÄÚÅÓh46771 b[lRð§tZm×JÐåˆaX«Õ8ÒÌúáhVWÍf“ï. Ãáp˜e™bµZ±cï™°(< "¯‰S¶$÷òjØ2mÊFL, „ëíˆuö¿©t eYˆ£yµc#ëWVáEQL&“4MY×Öj5þ”ùGöòëQÍ9¸¢R“ÒÐ¥RwB™ˆÀ^–°Væÿ5ÈÍ™‘žR¼\ðÛù_¼&žç5ÍÙlÆ‹É/ö}¿Ñh\œÏf³8Ž‹¢X­VÍfóµ×^‹¢H(ɾ//óà|ßßÝÞyøàA˜ç©ÕèÕGóe/Y}ËH°^lV‡Æ3¨~”˜bîá~«{Ÿ GaØh46z]>¹ÖAàƒ1„`¬)4h*ƒâ7aÐ7¸Àë&Ò•ëA!„(À®jRrŒý @ß—Aà`ÒZÈ" $?å"Ë ‚R*¨×£(¢¬ÐZÛ$°¦hXk1Ë’úÑ‚d- ä– š¬a­ÕW% ôPužyd=)r)VÖÌòŒ7’É’W_¾RË}- / ,à ëÍ À( ›ýÞ`0è÷ûaÆqgíËÈsÍf“uûñlí2$Ë+EÛ ¬•Ùbp x'`ÏI)Å݈™áU"{Wê…‰2 ËŠUW€J<Ÿtžcã¶ä"ñ9 *J²˜ÓsŒô²SËKE÷(ТE0A \'X’ͬµ–,‘-÷ª@Di““Ò$H(T @AâJ1A,ƒJ\ADÜ¿4­·.ÛI<¤”¾’ý~kk«×ëµZ-ÏóV«UÔŽ“$c¼Ê÷}>bóù<Ë‹,ËX±ÍòD ,ŠÂ˜¸Û¯µÐ2·›, ²È_À†®9ÎB¢â2ª( q£c¨Õì*éIékAk[FI‹RB‰RJ’PZP„¶LBÄêÖ œçz¡osRCPê‰ñNÑl4ã$íþQ{x¾ /ÚÊÓ]?,úƒ4ˤPY9Yuûaçì8œ®N;ƒlÖâY iFGÍί³[(õÖîi–àY?ØÛÙÛÁhXëµÔövló­é|îûG½Ö›Y3‹ó"ðýÌJû©5$½šg­h@x(¤ÀA#5ÃešéV=’" ᇑG:˜[[“¸Ïózí ¨À°–.·ó`šû©y±€|akÒóÙö‹ñ @ƒÖÓþ­]EAZZÆ™oå…Îr5N•ôA •k‰ÌÇQ4«bBÕ°„ÙÔIn¥‰ÂÁxzÑ®5k“¼Hta °5]iº~Öª=ÔI$Å"òÙL[“(ÏøÅhòNØêÔkã¯N£Æñææd<ÏuAÙjP`DVä»Mï5e‡ä§Das‘fçI1¦`š-wCu۵eMãF½A&/ŠBgÙjµ ÌbN«B¬úõMN[Šãx>Ÿ¿xñâôôt2™ôz=àÝÏ,å4M¹Lniy¬i5åOaY̯ ÃPkíyÒeYsCkÝívö™ÏçRÊÝÝÝlmmyž×h4˜øÊ~*W"ráF!;‚®ç rçŽC™º`˘î r—ç`Ê !ƪ¢î¬ÏŒ1:7N·±£¿†pËázñöàt ‡j:uÅÄ(±«£ËN†ssÝóBDžCUCY½(Ivçóù[á%­É3d¨“_Ã7¨”ò‚Ð…x¡ÄÒ±ÂÖ¡—êgUý`·ÁDÉgæ ÀÄßš)»#";²|kRJ!9P²±±1™LØtˆ¢ˆÕy«Õò¿×ëµÛmŽAðÞBÜÝ¿Sô‚N-OÒABì§©¾á­Ò•˜š¾Ÿ6|=‹ÐôvnÌF-ŒH[жÕ£(òAXš,0„Æ%Rñêƒ7)`/T’¿DåË® Ý‚”„Š$wØX‚+Î* Bc’\ !AzÒ7`¥IäÆ(´DÚK$¤ôÙÀ2&X¾:Ú#ÐZ@BA(AP^0†Œ±.–, ᇑ°@…á/4Ú2ê*bí” å9\³Æ˜l¨!P ᣠ¥ùa†J©N«9 ýA­VS(A[¡­²P÷‚Hz¡n´:F£×ëÕëõù|®e‰Ä¡®8Ž‹ÅjµZÌg@ˆVX«ÉåcNJ)iHd…Ã*¥t5ã$B´dÓ<'ò"é‰ÀJC:Î…MÒXi(³"°J[ÈWyæ!ú˜h©¼4—¨•©¤rªçÂÛùj… A¾ /+Τ­ƒÍÁœšd¿^×£™’A-7ËL ¥l¡yÖµr¡|mŠM5zÙb0Yt·›õb‹t ŠÐOêA3 ?œ„?ó©4}áA¬¥Nê^»Fß9Yýd°ù mÊp¶Ê_DA#ì46FËá/ëZw›5å N¹­¡¼-òB«-ùHLb“f¢¦º¡ <%fóˆ$l@/I,|•ÕZr1̬LÄ8O#`!j‰Ðýº¡zm¾*. ò…°`Éu0´ !wÎuÆmµ6j±ôº=«²…õZ#ØÏ¢£;#5ÜX‘®Å:÷•çy sí¡P Š¢H¤ldæÐ÷-¤æ$jvsa­Pª!„-Š‚på{kñêÓC£9f¦¡VÆcßßܲEY¶ÚÛ Þ2Y0èøÓ¹õ+ú#Š©gß·]«üSëûèa¯±ECʃ0xítµjtZçè*0¾ôDÌ3’¹ÈÌ¢vk?z¼œµÏ~-¿wÐŒ½WSû+EÊJCšÎ‡gÇÇÇ“ÉÄÃd%îK³X,...XODõc-T²‚‹¢ˆã˜]Ÿ$‹—Ë%ëH¡P¢h´šˆÈÐ"+fö™˜ìÚëõ¸ðïöööîîn»Ýfwœ=r.ˆˆRJ¾,#®l³@/Œ^Æ+Øê´Ó4õ ß |ž›³¦9>W¦D£1d- [ãñ´^¯A†ád6îõzyžO§ÓÕjåº1À|>¯×ë÷ïßg¬ÝngYƾ çHû¯k XMDd,’1¤kqíy” Q†¡—ç©Ó×p·ôÉPQhÏóTè)áeY¶ZÆŒR0#ŒJ2޵,Ö£[üÜ1×E9Ì`(x½¾ïÒŒŠ¯éx‚œÃ Âçä]k­'}àÇÁø'#(ó¹µ-¼@‘ÏM£O½pÆ$ò<'cëQMvÛ¯G_Ÿ¿ûî»Z}s{˃f³†a§Óái‡µh>mon @‰" BOª~·§”ªmnßí"2Í×™{f9[u7@› jKµ8BÀTDuº•öÎÕ¨Õ¸ »¬ÀTY›¯M ¨|å:ÃÔõê",Xoj?‡H–¥¼µeCb³†˜¯c„á–òAH_¢B‹v2+AxBg–3|„Ò÷¤”!ɳ"ÑÆ_È0ò”érÅñ¡ÖÄx‡µðl­$ZSB±®ž4‚¢( A—%Y´Ñ¾Ï—ËÕ<Ïs$$x(ó<ÇJ/Ë+êV^V”[Ã?j‘ŠmâZ­ÆÈY³ÙŒ¢ˆE¥¬ÄÔÖZ+qºZŒæcðAFÒ«©öFK)4”÷Õ*iµëƒîbµZ,«$n®šiš&‹öd2I’„ñ6G¾”ïik È=Ïó$Û$A½^ÍH ‹¢žRè­V«ÜäžçaWyl–6³y]SëÊ—BK¡10!7;¯úäö¹NoÛÃÀ<ÈÄ4´»~6÷P( 4¤(¥ Xm @Ól-æÌ²=XH ˆ=¨qتÀ× 6¹–¶DÔ„ ja@¨.¬AaBPSÞhxÔÎö \Û~eQ8cá¢ßyA8'‚&¼Nd¡™ì‹®€N  ]»SnÛUšu^ÚË5€{:yîÛRˆM"ŠZDb·–çE^tRʾ¨ ¨GEH˜aC/B_.…ð·ë€X—!‡ÁZâÒˆ_zq+«7Æ-ÄYÛ¯¼Üý­ÄªÈSólÑÊM&@ãŨ)dJFpg c £1¾RÚh©^½A#"Ê~>üwQa–ºðþ¨:1n1Jr e¯‚ì8/„ua)€ë9Ff˜oµë-…έñ¥ª×ë.¬˜ÅÙh4šÏç åh.ê ‚ ÑhœŸŸÏçóû¯ÝcŠáß0 ù$Ôj5ö†«ZD”X'ŸÀf³ÉT `Që\RâN§SvŒ’$q°j†÷¶Ö2Id2™09y6›±·Ýn·‰hµZcšÍf§ÕnµZµZ­Ýnooo³úÉóœaí8ŽŸ={–çù»ï¾Ûh4â8>;;c¸ûøøøüüœ¹fA™f|µV«±-Ï‘Ýf³éÜ;çý[kÃð2š.„pñZ6 ¨Œ­ràYJ9åÎ[e-È[ÂÈËržPâ J©ù|ά%^œ xÅøìµ;?G·Íxª¼Çø.’W% ˆ² )–,VYibè^ɯ*o¨·«›|Í‹.8´ÀZf³3!îüü¼ÓéÔj5¶êøq´MŽ2RÒï÷×{/ŠîܹÓh4F£Q(sÏÀ„ìFù¡Bˆ²²¯•‚!wpúæ*bqyr«·ÏãÞ~ ¨w[¦;W•"–éò¼æX–Xwq"tåáÊ”?¨$Ó@V¬Qw)ªP”_—ʘ€¨ {–YaL¬«.ˆ`\ÅÐõ°WŠ8Yçî‘?ˆ V¾ï‡õ³4êõ:ó­êõ:ó q“Ç’eÉ[UöBµeavÖ寔‚ Ô_)µZ­’$áÂF¡{ ¶Â[Ä5ùÑ- O€ecuÓ®Ÿ…)µ™!ð½%p"±ž‹ÄjZe‹–×Ȭ‡rš&ЬE°„@¬.]iÛýÿïá¶hõ‘@†¯|½¯^Í6¤Zä0<^^Û\ ­×‰«/¬ÍFZõjµ¯ô¤+UÐd0|msçÑÒ ~ç@&‡P8ËïUUúœf­Š3[)ø'Êe’¨-“mX,òa¥ ºlCĺ–·»(ÉAâ²EÏÚ¢w>ßZäy¶¶“7oßÒaÞÎ=Eðkµúë£Ëx>Ÿ³çÄ>+7#“ÖÚÅb‘çùx<ÎuÆb>¥¬YÙÝäW²^ëj sÀ÷ý~¿ÏA_Vi|–Ëåjµb¥ëŽ““Ú Hú¾¿¿¿ÏdEkm«Õr QóùœÃÕl lll(¥z½žÕ& CSVœ'¢ù|>›ÍjµÇGY w»Ý“““ÃÃÃ4O8B|ppðøñã4M···ûýþb¶d×oõnQNË M¦¥#»ÞÁ,†œ 6dÙTçi3l€ˆ}^׉·Ójc™^ÅÛšm©áxÈAzÖ¾¼øÖZÆáYËrxžW™CË+ì•E¹¡âÞñͲÄ)Wè[Ji¬aéȉ¼K_¡BÊŒ¦êe½Êp}í«Y«”:9;=99áÂKÁàMQ­V taÞ÷ý;[[÷ïßïnz¹Ö³å,φºx @ (¥< ­1—Í›QW;päºprÁY-î,ãK¨û Ø\©èéðük:˜ÔËV¸¢\:[É@«þPý—}© ±NÎ@¥B$"k„B”4xÆrœ€ªVã‘RòšUïúš™ÂÚ·Ùlv:z½Þéo°ÔâÁOœ 5$9Ë@Tº”^® \öxp›J)å“Ïo ¤àãÀDE"qZÖ^ÏÄ3fIåŒi^Ì¢(¤” ¶…Pl7°E;-h#™—ªy2ÙkÕϦ5?œèÄ"‰@^cýÿh£'ySÛ?qÜtj½¨n×,ÿ†‚oBëIã¯kÞ9ÃH“rF¡¨pŒ@\>ŽŠ2ÂU陨 ýžˆtºÈ âû›a–oÖê~Wu—0ïªx /"m‹¶ç½†ÁøÍ=úÕsá!¢(,[Ö@ ÖoΜ§Š ëvOäÉ™Jv{¥­p{VJØ5;ß%Œ:vïlÄ|‡Æ­sYVwb‰É®$ © _¾ÿæolܹ÷>,úÆË@䘮)¬qÖëõö÷n³†8==5ÆÌçóñxœeÙx<æO?==eïo'MSN1â¿@y>Ywzž·¹¹ÉÓpÒ™¡ÍÍM>Íf“K.ÌçsÆ™Yþr‹V·hü¹N§ÛíÖjµ­­-¾÷ããcVlNÆi­çóùöæVEiš²j_­V“Éd6›Ÿ.‹ƒƒƒçÏŸ#"‡º§Óéá‹^Øétzr| Bb†JxBRv»]VÞ°¹¹!˾Nù !vvö ´è«‘é ZCËåÒeEq|üÊJR.Å–ó– Urš;½v³ÙlµZL[c„ Õj±uâ6a¹»ˆ/kÊ×¼ª«GNˆWVc §*˜CÎ&h6›à* ^­ÏÅ*Á°êÎFqÎ _ß÷™ `Œ9===<év‡j•7»[u›ìÒÞ€ò°U·¾›–{䥔Kìe¨3Ö¨d¨2‡E’,sÝX³UX5±ttÊWÖÂÍf¸»½Q ¡"ÏfÃåt™ŒŸ³V(ÒÂZ+`}ÙÝÝ]Vc³Ùl8N§Ó³‹ÓÙlưKˉã¸Õjñ¾gU¥æp"ŒS‡¡LËADŽõ²ˆo4üót:em Þ²«Íäd!D»ÝîõzÌÄ€»wïr™¤4M™EűÉZ­Öét¸°C½^wÈgš¦ÃáððððË/¿œN§PúQ=L’|ßó|Î ´ñ*J`:;m Pi_ÝôŒ\A¥Ï1FÝ~Ï–.ÞL B.ÛFY—å"ÊBΧäç®m±¿¿ïÞ½7ß|S”‰§ŒI8ñÄóät©ÅbÇ1Cvlåp<~±Š«*KhÎZíbx¤ï÷ûõz=ô#þ»“àÎ[rʺlaÀKî5”ŹØö ÃpooÁ WhçÃÉlËårÐß0Æp`¾Óé°7Ül6[½~'ñò|¼  ˜ïlnB§íEF(¥|OADB‚4Œ1†Ðé3÷€Üwwx«?PÅ鬞úW ¬ª4¸öCõ‚ø½És}YZ¹u«ÎÍaÔ7 \g@\õ¡¥ô„ ÇvC”Xú,OŒ1Lbºv§ü¿ž‘ž°Õ‰9i&+ý•¯­ð5K…ÓTD«gœŒ†Â"°­Ï¦6ã%|öyÚŽY5³ªŸRY ymµ‰.³Où$)¹æbTËu¼ªÙí4nlL•l¬bjY IdIxGxcÛüqM1_¶k½Á7h~Z3–‘9ƒÀ©_€Â—ª Ö&’€Z ñ~±¸6:•^v‰¨&ƒ,„Ý×ï~{çö7{Ñy@A-½µ© óH(k ZxÅ ÃUÿt§_[N¬±¦L€.-ÊêÕ¯™œ×¨Ü UK*y¥¢ ³¹¹Oá·8Ë exé|B¥/,K´8µÙ~¿6œ<9Z<»8;;}qxp<¾˜O’sÍEZäy®sÃB™C8ÝnwkkëÞ½{\…c{{{÷ÖNÇ£Ñèââb<¯V+k­+ eR<‡š‘í7ÖÁžçÍçsŽïòée[ūֺÑh8W˜u0"N§SF_Çã1ö'ÙŽ IDAT”êùàà ×ëqü»ÑhpêQQdlEœñâ’‘¯ö<³f³¹±±Áy2¿|ħ7ÏÖ‰•BbT u~Y帺“ÕsK,«E²ƒëÇðââÊ6(Ïs¢«Ù¥¸¾¿?”±hþïãÇ_Íf³‡Þ½{×ó¼zÔ`Èh’$58;;áXþb±`Nõ2Á4ž¥i:™L†gÃåbÅ(óN¡‚Ò ‡ÃñxŒˆŸ}þ™ç«[·n}ó›ß|ÿý÷÷ööúý~LJ‡‡,µÙ=rÁiçÛ2¯<Ïc…]µ-œàæ||¨9}Åó¼>ø@kÍÕ'...ÎÏÏÙùF¼†ZëÓÓÓƒƒ!D·ÛmÔê\NïÞ½{»»»RJ¥|®m)¥œÏçŸ|òÉÓ§OQzb0|ðÁ~øa»Ý>99ùì³Ïž>}úçÿîß3ÀWÝà3[ž´KGª*R«ûÙ‰ ki½‰+GuÝ€@–N?ßË‹)O€5Ä‘ìóós!DÔˆ(Žã8Ž'“Ép8d£d:3Í͉'–_Òóó<çøBVŽ¢(f³ §]ZCB3¨†ájŸÝºu«×ë%ɺq°3êHàPÑî|V÷-•ظ”ÒÙ—,¸ùqsQ~ ¼8'mgg§Ûíj­ŽŽæóyPoDQäÂZo>Ÿýìã_þí¿[ÈóÜZ“B‘²€ˆ¬ª:˜•òzA‰kß_VН–Wt9l%¬kŒu ¦ú^¾q`BGf©È“ªÈËóâš0©*ò—GES²c².ò _œ\™«Qxýšn «W`Ëíãªb†c°euz·DTqñ+wº€^Y©Ær¼ÖÒÕZSµˆ{§iÕ>® R·’nªkÃ¥Òt¤ú\\aîy*`Y˜#Ölî'ùfk£ùð5ÿÇŸZX&ß!Èra̺¿ÔMOæ?îàB0Žs®Mªxµ§kn(¹º6n^q–N.•mV…ÆfUÌ=VaáÊdÈZ$ò{­Í7îÜo¶} ³lÕòBS“8Õ°Q™mû¦0õ‹x¢¦à¦öù׿¿úé/½_>ÝµÊ åY>›‰,4Ĭa@°ŸmQ‘ !…Ì|é!¢ÂE®I¢à¶ˆ’¬õ•ò}?dßCcÌS7ÜPÓCkM’Å…UvÝK”Qz*„ô#0°64å* ½Ùl–afEat†–Ô*×9`Øîoþæ›ÑÓózŸßÛóó¤‰Åùß>úñOßyço|ã¿ýÛ¿Ýj46”RrºNEÖZvbX³ëo­]Î Öuœs̘³“ËL%›š¿GQÔívïÞ½ëû~’$Ëåò믞°Ï·\.¹égñfž÷âøHk=Ï88à°6éz½ž¢0ùjµBDöH¤”Ñã˜m,Ö»Ýn·ÛírÆi"„P¾·ǰŽÉqIµÅbÁ„D Újcc3ŠêEQØ(ªÏf³åjšM–>>=z>>{vú칬Յm`‰*¬[‰ RiÀh?׺4€„Ü Ð)°KaQF^Z•GT"UXî_HPý»#å¶p¿BYÊ |A>k¬Ëh!ÄeU©3<Ï«’{r&«lV?àj#ƒ^ËHK@„€rͯ.´»Ž.…ÆJÀ@yViÒ¦@¡„±î³{íf‰H¢‹(¥ ý( j¾ H+(/ Ô …·V  ‚”OBÒó­Ö£ÑhºJA…^È ®Ñ+@¡âz«V(@D4 ¤ZƒÕÒ¯‘Ik4¡äøF£ÑÊ_.—éÒ[²½•æ1ãˆ"ê²#HQÊL¡¥¥}_ÊÜèÜmŒï‰ [¤E*sOf’ÍëùÎÂËVjØL›éì?MÚÏþèõË|ùTgYžõ0ð$i“I¨Ø «v†ÛNh ,^·’´æê4ç3UUàÚBº Ëà,zª|¿AÏÝÀ Cª•Þ<•Î0§º¯8$Œx_Ö–"`ÖE¼Q€¶ ›y‘äY} Uʰ6›¿ýƒï?èíµ=MYC%†Ýb]IÜÀŒzÑÖ}ã«Öûûý_<~\?™mb¯oM}úÁß¹ÿ>—‘bTǯ½öÚÙÙ &š±Ÿ”ç9ˆub®¨Ù 6ưºe>GÏq‘o™Ùøýö·Þg‘Äj˜œŸŸûa¦éùùùÙÙ™1†‹i(¥Þ|óÍ­­­úè#¨à½Pf12Í›ÖAej4ŒÙÞºu‹/®µf@‚3  Ìæ !8LD£Ñèèèèàààüüœãaóùüôô”-žÙlÆ<²½½½F£‘d1³ºØTr©Ò®Í³óWøLqdÚ˜Ëúb¼—Ø\(…:ŒG)uppàyÞÆÆFQ_~ùåp8l6›ÓÕdt8Ì`N'“ÔÚšž ÐZmÁ_]‚ánÑÀo<@\7§¤R»ýcãÚs¼ âþ§ º6´ÁU÷—çïA½\««@´œ¿ò:cÙ~4bbŠdÐê¼÷FïoÜkow‚ˆRc‘¬BøB­³¢¨ŒÉ#®ÃõÛ§ÉÎæÞýom}|÷þ‹éVEqx‘|ù¼±º°W6‚ðx*ð•çyB²"§(ŠB[‰ˆ… ÐúDdIY²}vÙ ¤"cñ!„Tžò|¥Tœ !H’´ÐÚX‹i¡ÄRM…I·{Þýæ[½V;$! Úè$`=Œ<€ñpxüâùáááÑÑÑãÇ_Îçs*!ADä ½çÖ`0ØÞÞö}8>}úôùóçE®Ù[bs’x‡‡‡ãñøââìÃ?üÞ÷¾w~~Î+N4’eÊ?s£\fwœ&Në²ÏϘ4ÎVe³†›Øù³?û³z½Þétg~ðàÁǵֿúìS"ÚØØ‡¬€¹¨H²JƒÁ÷¾÷½ßÿýßF?þüóÏOOOüÑ_Ìg jm ¹Æ’Lžç9÷öù‹¿ø Æü[­Öööö­[·îÞ½ûðáÃïÿû»»»~è1éš®Œ÷Ÿsؘs¦Óé³gϘùµ··÷­o}«Ýn?yúÕùùùñññ£G~üãòÉ'E®Q€DÉzŽë]8ï&“Ét:ýüóÏ ÑhìïïïîîÞíÞíÛ·ïܹÓï÷9a—K©¤q–çùÉÉÉÅÅÅÉÉIÇ<ÛårÎ*°ÛíÑt:íõz<°ºÝ.K“£££³³3.Ó]Ý÷ìÔîïïïïï¿ýöÛ[[[lèp„›+ðqå "â6Ïõzµ,?ǼlüÌ$äf³yrr H›››Qc8ÿçèùñÅÅÅp8ÔZsFõùùy«Õª7×Yd\ÁŠ%§qWœ‰57cu¦äNãU°”Nç1ÛŽ™e§§§lÐäy>â,Þhöwï´½úÁ ÙôB©<”f-©.$ÆKW*c¸Ýå¬CVŸŽÓ{MçÁUJÝ5ÕWUò¥^ÈDù¦õûºn©9éŠé-õÛ_}fÊñ¦l A£Ý 1 ȳÖZZëT$:9?Óe‡y(™{D$ƒ5•ÿëLT°‘RBW1¬k¯Ùlv||ÌÕ0Œ1Þy]z¢Öê)_Uxž”4=x1ýúùÁW‡Ïž½x~rr’ÇI =—¶¶¶¶¶¶vww···oßÝg·’<)åïüÎï|ôÑGúoþgæÍ{´àyžï«ýè/···Ûíöǃ'ϰqÀP-ówØ®¤Ý!çÛg Âä#ÇžõËþ©XA=©œÃÒ™=øãÓ“n·Ûl6F§Óáj”¾ïÿ‡¿ý{ž•«µypp€ˆo¾ýÆÞÞÞ»ï¾ûÇüÇÓéô‹/¾xüøñÑÑÑ_ÿß?~ôèÑd2á;öJ‰ˆŸ8o•årùùçŸþùç?ùi°½½½³³Óï÷ƒA·ÛµÖ.—Ë“£SX­V§§§GGGY–qM‰ñx÷ïß÷Ýw{½Þ`0øö·¿ÝëõV«ääääèèh:|öÙgOž<ùüóϱ„g³, ÃpÿáÇ;;;èN_ŽcNÝÆ²ä›5ª,=Æ£ˆˆùh¬;aÍâ.\N~ÍÚòˆ3n¾´X,¸fÙÅÅ…çyÍvc0ܺu‹9n¢B„±%áß\íMûJÝP}/–UD¬µQ½xñb4±KÊFü?­]KoÇ®ªîžÇ>È%à EÙt”`äbØ Ã'ß|õÁÀBü-ûXgŒ "£@‘’z”vÉ%wwvfº«s¨éæ,E0à>«åp¶YÛSU_=¾øóÝ;}êu: n¼ƒi&;Á4vM¸®hˆh#¥Ä/Z8l• ßd½`Œ67\¾m\m@Ù¾[<ä1ž$C¼ä·jJ4ÒÑo€ÆH€p›·öÕÜÿÚý‡²ý¥:¬Küºl}Ûæ•ûÄMb+:f!¦`F"ô ƒR˜d\·8’¢ýöŒ¨ZÞyôLH¾°Ös– ªpâr+³ÃþÒ`˜qâ½G£Il•¤árè¢)Âðÿ4õu¾ÒsÌÓ²Hë\ióyÅÀ¯$fÛtéZn@+0àà\MZm¸a)¡¶¢Ìpt€o);º*'íÚëëÒ7´,[Èÿüó?üP²5óÅÌ#ÑŪª$Þx÷îÝ~øa:Þ»wo±XXk“$‘x#£êÚýôÓO’<ÞÜÜ–+É\Êñš·oßEÑét¼÷£Ñèèèh8~ùå—‡‡‡u]ß¿ÿâ⢮kiISY;~ùå—;wî‹–t—bH¨ĬªªÛïÅ´Ä„]hRŠ’‘Fâ1ÐòúsÅl.J3Voaš$]űÌR2‚Ag³™Piš00Jh1“Éäððp4ɸ•ãããçÏŸïîîƒÛ·oûí·ßÿýîîî½{÷vww"ð9K²Ù_‡‰±ÕoÓ±rñÚêúÑÑÑÙÙ™sn8ŠgÐëõ†+=ìf=§òžöT3.´f 2¬UMlÅ!³óްa¯ÆF^IÙ¶o±1· dDçñìEÑ\F­µ—|/±Ìª ¾1#¢ c¯0-¤tˆ€#JöËPUŒSÜIó" ŸG"ïcÙÏåN`Ùí@\ÒªqŸqÅL°•ª÷‘™iÑKË罯lí½GE©R5"’­©bç>3‹›[EYUU O܃RÊÅ‚MhMSlŽ¿¿.˲\”e)t ѾF\.[ùhF•0-%Ei°‹ú¿™k԰ᒙήæLÚÖ<>¿À4]¤y?ë¬&9‚vs«˜h+pfÑ–[”9“(ÇK>Ùó ¬;Y²J¿“.o(ÂR\û~ ð ©øË]¡½>xð DFOšq€f@æÔÖiãQ1)0PÎþŒ{8À…¨sIEND®B`‚qmlvideofx-video-pagecurl.png000066400000000000000000006566761225012771600374320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœä½yÌmYV¶†½Ï9wø¦÷½¡Þ뢻°•ƒ#ˆqÀ€BcÅÄVd;‘œüäHÉŸ–%Š”ÈÿD‘âéËHvdyŠ ı…16Á€hÂ` »ººªÞ«zÓ7Ýᜳ÷^+¬söÝ÷~ß}5½ªnâ¥ÒW÷{î9{\¿5oü7ÿøØ4MUUGGGŸúÔ§Æ~|"¢ªŠQÚ°Cu]#bn^þÐ÷ñÆû䯫丿»o¾b¼ùùDtãõɤëŽMJÁþÚ|…À&‚ˆæµû!‰ªjPHöUÍWÕÜ÷÷HÇ“ãÙÁüþýûŸþÔWæë¾î«_ýôƒÛw¦Uã’Š#Ṏ)‰8 VQHövBq.tm혣¦¹Gj!àóÕê _zý—~õW?÷¹Ï==ëÚöêêj -³¯]Sûf^Oæ³ÉÁ¬©k_Íj""r1Æõz½Z¶]×¥”TzUBÛ¶1JUUÓé4Äd«·®ëj$çÜt:=<<œN§DdëùüüüÑ£Go¾õºm[Ÿ™B׫ª ¦¡ýÓ}ÎKœs6€vsv"pH„Ê !ômÛ®»¶ m»öf¶‡‘sŽ¢ØÆÌ»ÀOŒÑ^T6 %ܼÞdÏMÒßxQä KH\ß÷1Fk§-0"ò¾.{šÛ1ÝØN‚É GëÚøµ97»\Éù"ÂÌ66k“ɤª*[6bö+f¶©/÷½Ôšáœ+'1ß•»q|&uƒˆˆóþæšEŸ÷Hu]Ùøä©…mŽc2#"àf‰l˜Ýv3m_€¾û¾Š’BËÕêâêòùóç'óãÃÉÌ{ï ¢BLBˆLÈŽ„¶ß­vˆ€F±‰@Iº®[.—ëõÚ6­ýŠ‘<1{ÇÞ‘wä]UUÌLä á$ª†Bo¹Y68“ÉÄ{_UUÓ4u]Û_àƒƒƒÙlæ½ošcŒ³Ù¬iš,¸”¼Ø³»€»®»Î Ë¡ÞØü¯Õ¾’)÷¶%×&߯T÷"ÊoÌÛ³ªªrðsÃú~#ˆgdÊìÆqÎBí‹÷ûõŽì\ö‘±xDdvÀ<\3ˆêºn½^7Í´ª*WWÆÃ €í6± QDÔ7uc4©$]„PaÀ Ü(‘D´Z­€GÆÍÓˆˆ)°±/Í+¼”ÌRUTE»¦g¦Ôñ՛åI7NMœÍf÷îÝ{ðàÁíÛ·'“I bbÈø-5àÌÜ3{ïq$(„SûmþgÛ4*ÏŽÈåš–œW3›ˆpttrvvöø1]]]‰&f&U%Üìÿ¼Ú ³Z¹­‰Ã oÞ`åF*˜WÀ5Ú3Ótóõ}@›5¡Ú§3³Íž1‹q3sf1ö7k'À÷cïTÕj¹^?—dfX÷ݳ󳺮+ßxï“ Njï*P€˜”$ÇA̤PÍ’@ª©2¬N¢WWWÏž=»¸¸È`¦ªÐ!y$e_U®®\í'“ !²ñýa¥l:Jƒ9›Íœsz3çk\ ÆhÖ ZJù7oØપ2ï`CÃm¬•Í.Øè—‹ö­ ÄAhƒR]PÅq»eQ8:ßK¡<&¥ô“Å)ØžER¥p»Óæ7kÀªºÙ,ï­ ™×±¯ßWû3’ÙvojnšiUÙª½¯×LöÈÄ7ïÜŠ¹”-òW¾®B¶níï°ojÞàœbÁ7†U]pf27p)ôÛžêûþäø¨ë:Y,]׉ƌc\,Ð÷}ßÇõz}xûÔ{Ÿ©…‘RŒ Fp±N¾ßí‘-µï{HhÝœÎgãër‡Ö˘{ ãëˆHEËqÞ` ãŠÉ¨§Š Ã0æÑ³‘SU§ª6XGGG§§§'''u]g#0lKµyRË-—6o›àl©³‘0¤”œs)!³Œj\DDW5lˆÁ&—µí*„Ð‡ÎÆ„ˆ¤Üf:jÏ)…ÌËžï¼R»ÊdKåÆû½ßÌ{xß{ß/åɶAÎxl×½÷0êyÃdQ!/}Uåív–lëFÚË› Búçgg1¥”4Æx~yÑÞ½x8?>>šMˆˆH¬‰À¨À€*0¢D5Á bŠP Ì«åêéÓ§?¾¸¸0oˆ5Ò1;â¼MÑ ÿÀ98>âH:°è`Õ ÑýáìC{B×u&V³^.—gggY(gD2¶_àÒHûb.ÿ~åÐ>T5Ÿ7ìÞè1%¥ô²ºUÂd „Ù#÷Û8j%O/—tö½7?°œ ƒ¦Ó…|UUE F } .!¦rœKʼó¨ÚÕe#7ÀP E¶‘ÆEÈvÛÍ&Eå=b5OäÑ@ÌÜÕÆy,úÓŸžN›G½ñÆ—W ó3š‚ˆ!„ËËËBŒÒ¶í:ÅÙl–Ÿ#7ëû¾íBßTÜAJ )N&7ðÕRù«a%è xµ¡§DTX•Ç…ˆ˜ ymªªè†”h¥Àª`Ü—9[V”Ý€Áª&Ž/r1Æù|~|||zzzxxhBŒ±ª*CP(¼)ÌÌ ¥@”E¤²Z˜zÊéÏRʺx¶)!š_†c‘1Š÷~2™L&ÑBPMªjœ\ùöÍZ)¬LÌï³ßz‡êÚßüƒ=¼oM˜Ëö:íãf¢/‡7Îl¥dCªÅ*Éøa‚’U½˜öCHQbmŒëØw1u!<=~y±8>=¾ÿàÞ+wO'uÍ>B’”™·|è¦6!0(ˆP²ïÛ¶çw=zôäÉ“Åbaa¥xQö+¥”­V+ÓY׫®m[“®L ´¹0äefû*3¦,«™EÇB0¸±¾³CÚô§ÏaU ×FÞ2y6pGý}/ôѾu˜Ò®aÙÆ0° 8nŒ½/§ ;Ø™ÇG·uâ|s–بðX«êŽE G«Þ{QÖó‰HeO¿øæý’y€ùÅ$˜Læu][ B¶¾2ó>Á…¶Må;rýJVd&>"¯LH²¥ÏÙt¡šò¦†¶öë5 8‹\æïTU&¼{÷î|>5Ð%óiše@ÉÇîñ•E7J!³Ù ¸¬×ë¶mKËðK¡üÀÌ"í½Æ¾²}B‹0ˆ#"Z »ýÄ|ù×û¢ïÁT¾÷™ %íáÀ!hc°÷Z ¢" €Šj‰¢! ‚ÞÜ‹¯?ÏÇÝÐÑr敟qÚ˜¶…\ñ4f·ØX/òè…AXúk;NÆp6ïØ´¬ÃÃC˜Lëù|>™LÎÏÏSJëõÚLˆB½H"ÇÇdz٬ªªŒAª[.žOÖuêºÎ‚.8‡è;ç6üVDÁv7€óžˆŽ˜Ž ˆ4íàŽõâÉ“³ÙlÖ4‘…߇R'/"oF¾ÿþ­[·æó¹õ9Ûœ Œ±0&Äsk ¥ …á÷:–xï› ëh@èGŠ1ªn@ÑlÑy}@á’ɸ%"Þ{¢z2™˜¡Æ Vxãr6uÇvQß V™ù¦”t úƽg»÷Æûßgpô^ÛgâkÛöÆë!tåÓJè-) qZØš¡Xµ;èû‚¾˜DRJJfÞPMÒ÷=tT÷«EX_­—çW—Ë{ËîÎý{‡'·nMQ•m£è¤ •Ý(íDÅbõäÉ“³³33>ï›Ñ´|Ñ"1‘Š´išºFsýšŸg'îO³è<(â¨uÛ•ð®-oË“¾ÏEµÆ­IÎ9"3º …þU5ûнg瘚̌ û4lºqÉ¡nÅä=ŽD` IíÙ"ªªˆäœs&‰ƒé;cÝ„…»\Zø3yD¬koc…¤u]¾þúë†Ö¡OcÆ‘CDóõ¬×kKÀQEÉñ"K¼|ï#od# "W—W?>va¼ .Q X!)3{b"Ô}ˆnà݃^}õÕÙlFŒ"£ígä;{ÝŸœ[lz`燌7€g4Ü1³÷¾ö¼O ð†=@žˆ+_©*B%IQÙ 3UU­Z…àÛ–‰ L "UPP“„˜t´!šJJ©ïûùtê½OÛõŠ@-¦®Ä]kpß÷¦ô@¶L;W9Íšñ¸×Ì&½?Hêfßž\»2¾ýæ§0ß¼0öiÆæëÍ\øšÀžËžæ}côÞ›æ‘]q–9m%"V7øÞËí´ïEïJ²ª­àb]÷½ãºC¥ªrW‹ÒùÅåãåÕ«ŸøÄ7ãݻǷBêSEˆŽ“‚¢:ê„¡øâÃÇÿïïþîëo½ùèÉ“ƾGUt؇5VàT 5¤6®»q Sa ›}çÜtÖØ~Ž)E`"Ǿ®¦ÓÆÂ‰â õ‘wä9gJ¬V«‹‹‹õzm©JÈÄ£<`h¨£ÇF=ÔiU­È¶~“:T5HJISJ(f)Mj©ÔÙUSNp–¿œsMÓXdMèÓf ÞÔ°OåÖº¾Í®ßùå —yO44òåÙ8S”Hܘ%¤IˆHÀª]3sìzK=캮Y…nïLçì¦\!‚„Чè¡ã„Ð%}ûìì o¼ñÚ›_zóÑ£¶mûÚ¶íF !„‘]fIÆ%Ã@4æ¶m`)/§’ÅÛ•4Àê.Éýn–±üà ]CxüWø|h*6”r:Ÿ€šÄ£…• ïn)ޏ·\NÍ 1ë‹tS,È~b±Kæ/Ô¢\Éd2±u]²ŠH]×]Òà -|=&ÉmÌî)­#åöÇ"÷/7u«w`cËw<×­†!Þ°ïÍ~–ípÃâßã8À"@὿tç½ÖýÓÓS3M?}òüòòrµZÅ(DdþÃÁVÌB˜Ô›³Ò³c݊ʾND$1öUã»®[,®fÓæê²ý…ÿó§þ»¿ð?>ûâòîé÷·‹ù²ãjvÔ//¾ €À0€CpÄphÿT°uÞCêR‚·@„4)$„µúûÏßù§õ¯ýÌßüÛßüÿûÿíÿÖ›Nçrs¬íày\‹c+Rå8,EÝ èGBÄÆ±yï$Ä”TbJ’DyØÉÙÍVÆàÙN›N§}ß·m»Z'ÛrPxqvš÷²¨ÔU_RTçGN24Û}Ü™R¼ýÀÏPJ¦´™ü 0Hצ.„´l».¦Åj®Ú««ÕúνWONçMå<;TˆL.!œ-W_zûíßýÒ_øðí³g@hÂ\6ªÃÛ,ÞºcZ—a°^ÿ,#šXþäºFã³¹ÓX5‰Æ™çîCˆÿßÐ>ÎKæFìÉ¡OYq$Ú˜CKÊÀF!"Â0àe‘ë&CWiÍ•ø²6Ì8² Ęīc®|REÏŽ‘¼:Sµ£ q$aÉZ{¶ð•Jå¤çE¸3ª*iŒ"Ò£‡;sÕ„œíúñ`0"–c_®v,Ê9И¡ô¡xµWÃ`Kö sÎb~ßš?zíµ×V«•YÅÍt—×mæiŽæ3…ÉdÆuíœcÅ˾ų !pƒH¢4á¿øùŸû‹?þŸ_œ½ ð½Wçß±NpZÕŸ„åÜA+¡­*T8p¬÷  HÅ”`Aˆ ¤¿B¸ã€Étþ'~àGæçÿÉ×~í¿ÍÓ›¡öð•>³Â\§IDºek¶{‹Dû›¹º®¹nRÒÐõ=…‚EÂ#nm×ršÜ4M6—|³ã—B;ÚÙ{;ãð²^úrIU-Н”Äwn(™Èû"%PBET"„¤ @)AiÛ‘“"’}û«~½ Ë«E{o¥éwfž©šøu„°ìâÛg¯?yòÖÓ'gËå:%˜TÒ<Ž˜© Y*pQDú>ƒ³æÙÚ+£-L¦~pæ™5ô5{~^Û;rç‡_~_“")èXp†´ŸìŸ‚qóZÅœÍOoª¤Q’«|àòþz6Ïdææ4Æ?g&sôI†gS jWÂ>*E@AbCO²2¿hG¸Ç±ðÈ”Ãýì!¹²¦-?Óír`ö—q Y³jDcAÓ—Õªëaf@4ä—‚eSŸ??ïºF¥<‡YˆHÛ¶1†¤ @Ì,Î[妽£ƒ4Ms¾Z¤^€i6mÞ|í‹ý/ÿ¯gG§ó?¶Zýà:}ƒo„~±~ÞBè PpÀN•A@Â5¨ @ €z:X¤!·éåÀÑÁô³Íìëž<ù)h¾á?ý±?ûöaz|c;?¸ :sí€!åá6®gÁåza÷˜y!¯ã ©®'Óé´©›ªâÊyÇ}!JÊ“Ýi2Q™yÍ{oÁ ˆh{Ìf‘¶óÕ^ •O{WÆý•F¦øêXðQUI·D£'!©&U& B&ID–  1@ }ås!ú®_GcŒWççÏÏÎÏϜ޾}r|çÖið¼\÷o_<ÿüǯ=|øöùÙU»êCŠ}Èki¨ÅVxO36މˆŽÁ¢3l¥å ?$â±Þo¶š¨*Ñ&¡n‡é[0ˆ}•™B1zú¯)+™s‘UÅ!ÄÀªI¸J÷aÐqÇÿ¬h±ðÀ=`o¸â?4èøY¡ °¦«Usµò'‡êì²{ç­Ÿûéø“?ôc?vc;_šÌ4Ä+4qß÷«Õ*›•ʈâtv6™ô†Þ×8º‡ûòö€‘±†©ª*vƒÎ{?ŸÏ-­ÛÊëgF™§ítm_áÚfËOé:÷Ë¥x …¹ûøÁ:`<)€(ª£ª UaV‰’$aŽŽ™ÙÏ«‹…¬—«Åbq±X¾þäñý;w?ñÊòèîÝó«Ë/=yûóo½ùÆÓ'Ï/¯«6ö½Jo1VGC“€(ˆ¢Û0nãã¶7Á·`è›RòÌ9®„ˆPDŽڨYy@tŒc0Öѧ˜¶ë¤ê˜Þú¯)YÅn´÷€háâ9#q#VŠÌÖµ¨½Œ× >4M“ùFùCõݰ³åY·íÃöX;Kï”’YÎhL²ÂFHÀƒÄ¾ÊÓ9=¤¤²#ùJ¾Ž4Øu-åÜÑ`ãåªÊ€w]æûèÈšY6uxµÂN3p;N>Üò.ßX6Àƈf³™U\ïºÐ¶íåjeCVuÇ$iQTöÙ›LƒuMÍ{" r|ÕwPÕußuë‹õ?û¹_‚TÇôÝP}›wŸ «”VK žÕ»§Ǫ`ì’Bâä‡8DUfsêš~“Àâ]}ÖÁ}c]}Ò´†¿»üùüÿÌKàÌzÊ+"’+ReBÎÎÒ®™òl]¶m«ŠªÚ®®'•ó•¯y¬RfZŽ¹ß ÎQAUk¬ì+çÜÑÑÑÁá,Ãüjµνy©¦à¥ŒÛz°Þtñ%¾÷e’nÜÀZ„ß4 ’"¨i” "”º–‰”P¤„‰ˆ!bEMp®% )®b|ãÙ³/>yöÊó³Wž=»Z/Þ>{öÖ“wŸ]-V}5H‚(1É˜Ä Æ ®ù€³ÇÈj]ƒƒÂ™„£ád/OãÓŠAÈ9]&,ŽQ]!;êrly9x_¹óþ2¨è] °)RLVšÞÎü°r¡6†e¨‘àFÍЕ=ô¥C·D¦†…™º”}3æ‡Ã`‹;lm,m˜‘­-¸!s†,“”`U±¤a" !Ø B›6Œ(…ˆáZ½^#7‘0U×ìÏ$ IDATóê¦cÝûÌû§Š(鲑Dd…¨JÊöü—"ìh/$±€Íçó;wî´m«ï¼ca8¦xš¬V+d—E„ùp~4›¾à½V½SÕÑñä·>÷{䎨úÁRX=<˜Ïg«u¿ì–@Dx byØ€ @Ͳ« }aGªÇ …¡¢G8_ÅÙl½\?ïz?£¯é¤ùßüµ}íüàŠw0¸<þ¬üÊÌ}Y-FD³ƒªÅ—†¶«ªn6™Â›¦iêÚ JÙÌh°j Ô.±–%žL&ÎÓr¹ÌfÎÇ7}à~íPõº]”œÌ¶2ø€š¶°âZìú‡~ŠQ‰†·¬@?‘ vвw¦a$c‹LpžVMÓ4Sj%umxtvñtÕ½õøí6†«n}¶¸¼¸¸h×+ “D)¥"ËPÀŠºçyÉ>?; 2ÇýåØ@,¼Œ†Ó€u› <²_ÃÁ¬¨]ß<ï_aÿ’hߨ]#×ôZ:Ѝì@WÖ«J¾ŸUÛë‚¯Ýæ‹ð«ü¨Îq4Šä¨=Sj-ÁFD,> ‹[X”†òSÙ¬mW«U.Üq€!mUÂÏ÷ðXfܬÍ€ÓµÓ>ô…B.ª üNP›]ßWÿà¼7¿+ÿSAû¾7[”ªšÊ;›ÍîÞ½{¾X˜=#»áí‡]ב[ÛVžøjâ¹á|¾ï{bpäÚ¶QnŸœ=[8lúUpÉ./®àš».E †ª½C² ÂB!¡Y§QtPvAa•O•¡ Ã'ëæÑòâwx^{ýæeøÂäèVÞÙ×Nç=#*36M…hGÇ3·º©CiÓ÷ýzµ¶µnÛ,K¸–è–’„ûBmè»ØG´®Ü¤©ŒµõÝ‘]͵cB]{Ö®W«UÓ4¯VŸ˜O&c:Zßu'ª˜±ˆsìÜLUA„gGëî •lrC@ Ð9žxÏL¢ ª¥oÛãº[‘cô.i÷Æóåà –cŒÒ駘4$H®o)%×GED%TQÑ8¶,þ1ôÍc;˜ »è½ŸN§“iíœ# °ÝGhge’wȤ1ö±kEäª]ŠN&g,ükß¼ì;zsŽŠÕQÕ{ÎÈ‘R2sV”¢ 艑LàÜÍçˆ$F@E;z­Rˆè¦\†(`BUÜJª¡í2„P%žn>íg°Æ[*nu ŠŽ™Y™30GDDˆI¬Ê¬a!ŽÅv¤_«*€‚ ‰8R‡Ž˜ÀU®ªjU !‰ˆãÊyïɘ*Hˆ€  ¢ DL€"1) #”ƒ 0óWî´mk5M ï—q>Ÿ²zïQÅ4xöšRX.û£“ãé|â›úðôH*{2£¨’ŒùÁ7xFc”Ÿ÷ÞùzäŽ1ö}V ­l§Š""º ‰É±«Ø×Ž'…Ø+@€›ÜÌQÄ{„2ð7;! DT )Û{Õί; ‰ì ™*?ÍF gQ›•žÆøó,³Úrªª `æ *5¹Ò_ ªH@ èII‡ã–E„¼'Eîmá1U”•Á¹ççg= )FP"‡ÄuêήÎk¢us°ð‹ç±>˜ê|‚¢Fеb— hÝ ¼ŒX#׫´æù2¾õ¨¨“ÔIhH,ê"ÀÔCJê}“º¶wÓyò¿¡—ÿh—༓´¾¨ù´k L¦¼–GÐÎëêvß ‚N¦º\=š4_µŽï¬Û¯´¾JéwÖ«¾§ÉN fxÉ&[ßp%Ït©”ìä•|gž§¾ïŠ’ËªÈH[ÙùE ÈÌ ÃE+k²\.SJC‘Uf¶Ï‚t0"3;öÌŒ`2 9ï£÷Á¹ªï{%'EÁ¬R³ã¬¯çídͰýãp8¸Ãx,]VŒ G0ˆ5]ADÀê‰|ôjP±µ¼°£Fìx˜Jå…,1?¦ÍÏžÅæ!ÛF_H2¸?KIöÂ{ù•ŽÞYUÕÐ'"M1B dæÁ &šRQQI‰Š¶í{ø9+h)Ãi-„ÈDÞ9SnP‡9²JDŒÛyÀ ï¡&ðÇ@;½¾Þe3LµØŽ—Ù³óÄeÛÀŒº}ÃÃþ^¨ÔJóšÌ»LÇ—¼2©¨Zþ¤4W ¬&ËUùæÍ8Àê„u™­A኶@LÊYpÎM&“£££#.VÉn@Ÿ”BÜu-Ðʯ®–‹óª9i¦µ“T5‚š4%De YïÚîêv¿|r8œJ ÔßVíæþ2´ÒÕäg"Ò…ËéôN3ñÏŸýF=ÿf@·~ä'ÓÐ…å*Üúª«ç `Í:ô»ï ' 4HŠ’‚˜³ÍÊTIáWKˆC:fm˜QYDzIIRd·‘¨tì,>;O°=ÊŒþMÓTUJvÒjJÚ÷ýÅÅEÛ¶MÓäT9«=©cCS,üy@ÄDì}eÍ«ë>ÆèêÚŒÞVI†S·„Ü ¨–þ<ã6DTUUí<ĪrÎõ}b”4t DsU©­ƒ«63ý”ö0ŒnÎÒ tÓ¯àújÌÜVDñ’CO@¶û•À{i°ÄàT!dEˆ*æZ±×‰ÂpØ™_Yâû„ŠXUY£ "#7ìkr0®À!ö FƧ› üû`Øó²èFø¤âú <†£’•­sok6/ƒŽ6–ÍÚ0» ÀôþŽÛÛAßL<¦ mûkÔ*2f €¶3>eÐ7'&èèAf–F¼ŽLÏUü0Ÿ}䜫ëz2™¬–­é8ÃG!€ X‘ {ERÕd ìD ò<jÉÛçNê6båýRÊ y(v>@>D•\ß¿Sð hG¬±%aæßëÍ~¹ï½~Ñ|‹'''¶G///×];LˆY,Hàù™¯Iàt:iüÑÁ´Bff@„ë²ô‡©ÿ¶šñêòÉ“æèëB›¼OÀ2ø 4‹ ðgÎ}:)€4à`µêV«Õi·XtÓÉ}rxÒöPƒ*(8PÚT‘ýR”“kd—t×h–#óæ1H³ U‹R#*#‘¢Ó"¤€,&âððÐÎTÁ¶mW«ÕjÕÚ‰T}߇,Ù×d¢ªª”¢Vh˜ÂÐ ""r€ŒäØ¥”’KÉù:¥Ä•1ZAÁ¼¾cŒQ:UT dbD ¶@è*Ï̾©0:ˆÎ9@´´–‚EáLÊ1Ñ@ªªˆ€ Cu,xÕp¶CüKáÀȰ ‹ð±Ú0w>¡¶…p³|ç{Q‚3°‰H²…Én(稈–ª´¹Ù,W:œä& –„¦JŪƒxn|©ñjG4œ¿‰Î3 –uäÇQ#"­Þ}٠ǀ™ÝÊk*Jf½a”yÆÍp·§Fq9}¶¹L±¨É,|¿D*ý‹åZ*?ïôwç ÃÅ|bÐÒò¤„d#¤ ªi©ÄQV@ç|ªjG$³yUMfC½_‘$HƒdŸÍx 0V¸Ã7}ü$÷ßñ]îêâñoÿZw侑<¬× IACê«CêŸwÒøWb¿<:9û–oiÎΟ=yž<9‹¸¤ÉjËøß^rvðx)_ÛŠbþàVÆS½²¶d<€"ªˆ¤1S“pÄ'Ç9‚ßÄ+«Ú:ŸÏg³Ùt:5 ¸ª*Ä+U‹>Ï+5G´Zh¢÷~µj3öç¶Ùþc>irãpÚ’qóý\­Ïsþüä9³ˆfaÖ9GÞ¥> :úX \Dˆ*ŽÒX…&÷¾è~_ô.yÄŽ3léÁ½Àeûp‚˜R8¢/Ž&î-Æ÷n\àzKF5·S"ÔÑ‹4ÞFI`K Џª÷µéó´y–8ØWÉÌŠ 8TåU&$½¦±Á»TØùبd»™2ôæUcÔ˜Ò(k«ŽÅ–ßlˆ ™òýTˆ)7âÍ{o¼ñP†ôåË÷ÑXÆT±øo«û¹IiT1Ê—!¢"(AuŒ»¶nêx¸dÓ4GGG?.¡77À`G QT fo5+3\ÙtØi9yÜ2vù[mY6µß–V÷ ψ»Ë ?äOÍáÓ£ªÙx¶3•ƒxš{DDªà½ŸÍf–ä'0Ö7íûBE… g—@¨&58?VˆÐGéBP¬ËA*”`ã.ÖG̺髳³¿óOî}ëÔ¯þ©Ÿ„?÷§ólqŸNßò˯êÚ@Õ²¿ZøÙ§ÐzùôS—ÿÓ_þšúQ@¸û~VþÜô¥·Îîùú<¬ŽŠ4âz÷¹wž<>888<<ö¡µQ$ÆMh™Õ'"¶—2<~VPµäA'$ÇŽ+Ð!˜MPˆh6Îæ“Ùl6™L@i2™4Mã}í½ïÖmø\Ï€TÃ…vœÅÀÙQ€”AˆP†° ³Ý½÷MÓ˜ùÚ­éÙëõÚ…ˆ(Š)%;`Gìü&òŽˆ P+B3ˤ±²’$1ÀABPAüžÓ–>êEœ7ê ×c@DXì8Lm›™qШÆ+t4G‹¼‹KòÆö€ÂÆ Ι#?d¡{x º¹¥ÐD„wÌæ/x»fçœÉóv¶~©²Üø´—ÈÝ>™òV¶¤lm Àfö !$ R(a°Ý»Ê¢¶sn>ŸÏçsUµäÝrå|øåºƒ™¹gQRùÒë;ÄB:wÚirÚ¡˜?‘–7™]m:­7^*„¤ªÒ£ÐÛÁ€ˆÈ&± C½ã.Ý«ëèU {RDzcQs¡¸ÙŒñr)G&›ÑqŸ ä%‚1n{òE›EóÎM8fšL&—‹+µˆÑ˜°Ç~‰«¤ò<×M5‰ówáÖdêM×ÐBFµøæ¢_\Ä?ñ'›?øÞpЬÛãùl'ã›þ«_¿ýÖ}R—À=ô–oV÷ï¶å¯|õ¿ûGaàé÷ýÑÛß÷C‡ç'êÅrA@L€É°ï>h÷ùÏþÖ­[wîÜ9880ýFƒ³%Aš]Ú¾ÅQy²½dÀ6LX®cÊ„2žDœea°3 ›ÆÞ…ˆªÀÌÓéÔÂ'Vn™£ mÄM* ¡ÂóTÑ{oÕbûÐmÖª9`ÜWÙÂV×µ=ÖO½ª®×ë‹‹‹Åb‘sŽ“¤cceÅ÷Í­Fh§9ç<±©øöœÐ÷œ$Ƙ4‘ÓºSæbwÁ½ *ž¿åÎÃ{£áPm‚Ʋ´ƒ]ŽÆd»¼¯6rè0œy\w^ýî’â´¥ÁŽb‡5HÚS¼1EQU) gø¡ÚIjå)ƒÐÍãCLv¶*¡cd6¾  Ä„joPÝböø ¨ÿ^çã#£,$‹]…Ña˜m!/˜—<ŒÞ{“¼Û¶]¯×¶Ó³œýYméMÌ­5*ck7#¬„`< ‰Ð!°%§^oy)ˆì^?( †é!¨‡‹bf~;<<\.ÖX¸™yLšJÆýTD$%u³€BÛ¾ Óž¯[vq×þʵÃ1eÌAȃù'–Þ%ýhLÐY‰«Òu¡hÆK|5Ü´ÈSJù ,3]ál63×C!ö’JŸ¢öÝ’y~ZÑ|—OkŠnÿIÊ2d®Ã‹JŠÕá*¦IkJðÎðCó£ÉäOþÈãuTÇ“˜¦ À£oüæðãÿÍ7~ïg—) ¬g¢÷aóƒÃ”ýI’0‚†±b%ÀµÄ³’Ü›o¾ÙuÍ«‰Ã#¸j.ûgœwQ»üUÁNVÏ, Mú AÌ)ÕV[jfŠ1Jö ŽÕgL®Ï>is-'½ Õõ¤ª*s´a•Ùñ¸\ˆ¬ÞB6騇”VX×µˆL&“§OŸ^\\ Áe:ØÒ{çœs˜ú¢!Iƒ<¡hrÎTa¯*lø!IAIÁ²>àb|oôbÎû 9 ŒË4ÌB1,ykɾžU0€Ñ\r£oŬUl¡@zØÔ¦FäB(GÏ*iûŸ¿€ÅìËŠ  Èd* ÈÆR¶ü ä¶~¹©l†¢IV˜hû Vؼn$ÌùH̦¦±zs,³’ÞçHäµwh<Œ(_ÑÑ`ž1;([>-¿`ç}°yÔf`Œìã±0­Žuj ƒMÕ„û-LESÔ¥ï#³®û€À&·!0!Ê i_ó¬Ý¸ŠJ'‡Ô”6?JU@ÓGmý͆Æ­f›1» òϦˆ1ÚqY@©ëº®ëÅjÙ÷}·nAÆœ Ф²êúuV]”ªzÒL&ó©ˆX%çLCÄЋ4‚¢õ(Ðÿö·Ûÿú/Ý:œž§+ÇîÖ¬Zÿáï^üäOòðõú9ÐË4J÷5¯~íùçýŸúÓ":gÿ¥ž/=~á‹øÓÿÇ£Ÿ‚æ×aõ5€ 4FØ;·ß}vvfÀ³\. *€­ØÈ£¨ŠÃ ±ªˆäpHëû^@"2²&%uQŠ2ÛÂ0™Ïçæ¾=98\­ÏÎΞ?}¶^¯’s.õ4 ¨Z…U1…úNNOOUµišÛ·o7MóôéÓ²Þu^±y†oì×¾”hòÞdtC ¨1Ï‘ípÎÙï}JÉRlý‘s„ˆÄ’O" ˆÎ{DL+°yEË¡%"•Á”E€H("¤¶\u2™\]]Y½Ã£££¦iTÕW\7~¹ZͦÓu½†zÞt108"šø*Åþâù³óŒ¦8¦„„-)ÇaUþ3 Á ”˜”0—fCÄ4æ7fG;_‚ X“JÿCH€>Ãs9Ά(¨`áà8ÊÊ6¼YòÎ\…뛑œiryy)EŠ©iJcÂÞÆã.c˜Ë°— ‡´EB D3àŽùQÔÈò‰ Hѱsù[QË›ÍfvòŠª²÷ªjÿ¼srZ³÷ÈVŸ™èüò™sNq~µ<ëí·úÔß¾}ûèèÈS_×Ó.HÛZñ*²tÆS4··€‡Ýo~ïúÚ¿÷÷î~ÃW_‚Ôq…“êÎþžçÿ§ïýÈy£uLnŸ¸ÿá>øáyã}Ÿž28øÝgðßýíßùâg& ¯¯XH|‚ §&é¡SLÀŽ^×aÀ-—Ë,µ™|jà'c19;êÄô眀4¹i¹\šô$©8AÇÔÞÊÕYÒÜ…IËëáyø »é2”± ùW¿ô[’üÃ’ìŠÙ¢%s‹íiËå’,õf›ûäŸãÛyZT‡ÀÌ‘1ŸÜŽy#Qs‘OD8žG»c ÞGüpôZ•ù;ƒ…£ñ=Ò :²O4¾þU•DÄkÃUŽvù4ÛØcg©ü‘ªZ¯‡¥«ÒýÇ@ƒ\[Ÿ«i‘uF9§¨˜Í§†O“ÉäòòòÖ­[<€'Ož¬V«´'dúŽÊ\^Þ[ÓW33iá¼ÇÑṭؑ…ûÁR"CUbv3£nÞEDŽõ:ÛŠíæÊ}Yß:å¾èξݒ¹V",l:F´àþÓ“p´gd&™#%?j­3»MÑ䢪vnvîæGÜ–]ÊëDuÐÊUu±X˜‰TU‰I{I«®}vy®!ÅåzuïÖ1ù)3#{Àj!/û¹ÁêÛ~ï·_ÿì÷\ü_¿ø™“»Ÿ›Vߪ³ïùNü[?uðg~ô÷ºåü¯ý­OüÀ÷ƒ.îÏæËÔŸbýæ£G¯þàwýËgç_EÍÖ-L'߶꟎–ç÷DNU­Ìi^î§§§vÅ{?œ5&hR´ÛÚ¶½¸¸0üfæ!Rª8W²Ä*óÂÖumYð9tË2­HÛÀP`SÚ-ïLqÎvfÃ8¡23Ù%mX2²µa–-)ÐÒ]ß—á0îgHãÉ %ãÓ±˜DÂh¹Åº¿¤É€/iq—¡æ%›V¸YcË|p·yï°ôšÿ8?‹ ëü½€ùšÉk#Á胯*" yœO ‰H_jÔè—‹,/À¨4;{ïC›•)»þ¼zóïý+¯¼rëÖ­‡>~ü¸\«/…JôÍ~_ØcR¶Ý”eÜ«Uš…`ÜΪ†€ÐDÎ,SœŸ9Œ‰nÕogòœ¢Æ  É9”*Øw&ÁSŒb23"ªŠï®ðprJ’í‘ϨˆPÑ0žGCÆÄe—ÿG½rM BD‹„efã®:ªŠ%ûh›RÐufbgiäâ———ƒâW³"¤‹õ²‹a¹\^,®Žæ¬éVÍ\êÊ©J¹;ûdÍ5‡oøW¯?üìÿ³ð³ßÉ@¬j„Ï~ÿtö¾…þàw½ÍÐrýiYšÂÃw^ýÑúù/~á3.ÒtúéÕêP`°Ò•š^œƒn>Ÿ›7ƸX,Ì‘2£—moç9îû~±X\\\XÑ ïýd2±èK‹±•N¿ã­ÊhŒÌµlüsUeê¥àׯË"S¥M Ê.0t7Jºe^dïµ³1,t×&úââ¢ëºÀUEbèdݵ«ÕªëûõzíFp· rGGLJdáó{ÑñçÛøMê–¿ò«Ÿþ#ßù[?ñw|û×cŒÉ«Ç@ßõï=®°r逸ßíÂWýÖ›ôŸýÈïýö¯}ƒÐ%È­Is{µzÍy‰R©$€ › àäŽMæ²çõz}yyiËÔ‚•ˆœˆ ŽB7àjµ²ð%SmÙη‡fNJDvœ=C¶7ÊÀ¬Ñʘ·#Nêh Qœv¬&tPÈïÍ}5øN²õ؈fÚä°{ëòt:N§–‡ªª†Êå)]¨¶QÍYe0<`°!ß8¯MÓ˜ZŸF‚¡|æ‹L¸™‚üÐÿŒ¾/,” 6ÀòÎl6x)Rm‰¬ÉéÃ?w|àèç*x‡’©™ ’ |I-úòñÉd2›Í-g™5ÄcæJ c™Økµ­²Ít:½wïÞz½~íµ×Là!XŽÀKi§ŽNtkÕQq²Â–ŽX9Mxµ€m·¼Dn”³aÜï6ÙÌ 2–/¶“ûd±T))QDÄ…È­×"¹1U“C¸á,zÜŒVŠø×ï¿Þ )ê®ï¸iµ ±^ì¯>þr( .:V*¹(|4ÁÏïJyÐrc¼sydíb±X<+M’ˆHLš0Úx>|ûRqÊÔÌùtBÈD˜ö¥:9zðäù?rÕwÇUÿ;¿žþüŸyøwÿágîBh–8Õã«shæs¬?ýÖù/þã/ýò¯¬.&÷îÞ~çñ¯ÌOŽg\Äáè$TÕwÓ€oß¾ÙtÞ'mÛZMfUu®""&6­í»³³³³³³õzˆ\‰ ‹Qy€àààÀJNÚP&™Î ãò³é#"CÉÇ7LÄ UÕê›À¼åµÅ1ëi¨ RT‚],0JèÆÌˆw~qѶm’E~ŽVë`ÔŒÍ\CD\ Ńdhðsü˜˜5ÈÊ IDATÇÉËÞH;xóa;êÊrÉ÷é)ö–rÿ ¾•†RDD•L“wø.€íyþ¾ögÎX>¶Q¹ìâ¦\Ø{ßÔå D´#:‡ÿ€FÏûà}1ªªZóûš ¢,wèààÀöTl;‹ÜPG¶¦@Æüκ®-òÎ;]×½ñÆOž<±hB®ÔøR‹J±¶U3ºÀvعÝo2+Îc¢Àz½Ök“Ž£ÏXU™\þ 0hcÂ" qJ©öh'ÎÒloÛ¶µvæ-#"¤šŸ³³ž? •}·S¡²î…= [Ý™™†Äölñdæf‚ÖG(òÇОüÆRίÎ6fžN§áüiìúÐõšDÕN"†.zvÛä4нÙ?ˆDä€Òô³çG³ƒgyuìŽÿù/øïûöÿç§ÿézpŸÐE*˜*B|ë¡ÿãßû/~í·¾ÉÕËØ­=êÇ¿CÕtyéZKþMÐyýì/Ey||\×µE¾Åñø',ŠÞ î4Å®ëÚ¶=¿¼0ô%"³T<©Ò˜Öb›0#´ŒuffÉ2;'R Ežq(K»ÀÆu­Â sƒ[ZD‚„rŸä=i&n{¬îìE]×ÁXQÄÔ":>>îú>gFyï•0HŽoʶhçœà ´¢†J|Cþ&ÙwmÛå†;Ç %!³¼g dñF÷›™Ö{Ù’gAáºF= øû4ÕîË­;>Üþý¢ç\ÿLDh¹ù­H¤„D%^Æô6€M5ìì|‘ôóûˆ¬tÆÉÉÉééél63>×ëõ&ê¢à’€­®Ðááá|>'¢G=}ú4K¥ªjç ¼DÊœ®Ýò³5Ãâk޽÷Ëå2ÆF32n+¾<$_ù¶îž‰Df®´s,Ap>ŸÛ“ fˆh6›u]wzzºîڮ뢊q'f6 ø½÷t§_åÀ PÞ/cpv{çqÀ²‡nd‹”,%ÄÄņʦ__vÂ1(8OwÓ4郃õ¼^.—ËeßvV¦0ЬCÏž=;_¶a-pïpJ$1½€¹ œ/¯î?7¹:Â0òvó¯ÞøÜ¬þÖù‰Ç †AàòW~yòÖ&‡³úré**òÀÛuõõÝr®ðE@¯’BJb½pyp- ,aN&+PEDvÂb±8;;[.—ªZU•åŒó7h`:F*šqØ/[we,ßaU8rF.!y#Ã=«Íà<˜µp 0ØÒ€³ÛŠû Gò1jÀÉɉr˜GƒQ·ŸË¸%²+×FÊZdz(ÚÐ\††úï9€Gý;K&EÜ<ñÛ>ÔÍTÑûÛ{ånÉ;Ù{¤µK[Â,lÿ³T2^((¼àí7^ÄkJ°:š÷‘°Å¤˜Rkl–m6ãÙ>ƒ=vÐf¾"˜È‡¤ªª ¥nݺuzz:™LL¾\„È×Êâ(®cȦi&“Ét:}öìÙóçÏ™¹®ë¶mm_]]¹›Î:üÀTês; »£Zá 9›Íæó¹¥W8çú"/¹$" ï÷@("…¢¼Õ_f')¥vÕe Û¸œ° ËõêÿãíMc-[®ó°5Tí½Ïpïí~=¼Gò‘|œ"K14FƒeK M[ŠdGVd!@+ˆœ8ù@€ce€ 2ü#3ÿIE+ˆðP”È€dˆ² 9%‘2Jäúu÷í{ϰ÷®ªµòcUÕ©s‡÷Ød¿·Ï=÷œ½kW­ZóúÖv»Ãl*ˆó~wÏõ¤vÓjF·KðŸ¿"¶¯,"â¡Pþ¹¦óÜ£”~¹ê¶Õ ÓÜNìÿOÛêš4ž¹VÁe•"\øŽwHó<Ï8§”$ŸÙmçË'œü‰ûÀËg«‚XËG÷âhðî0Ý?íð¿ý_¿õ;þˆ®Ìð{+ÿa½pQÁŸ¥O~òÁßø»/ÿ§þ¯Áÿá1FU¹D$&`2×z‡¬þÝ€¾ç("¢‡˜´ ýÊiÔC0¾!µÂúë‰e¤¶ftr±ò*ÊÊá.šsÄLâ€÷yõbŒà+Rï¦i²=bïDdÑëõ©¿{²X,œs!&õ¾C€gvu„C‰Ñì.ДÒUï´&"°hóáyA V³Ý¯JØIoP¤T5W‹€õू畃„¶f‡j[$çˆ;PU’’ø0Íý+/è[¾ùÛïÝ»7MÓf³ÙívóNˆ·I(&L¢%Í1¤¤Îåž/¿ü¾×^{-¥ôú믿þú—lþfú˜’: µpµ_³e¾ùC–$Öõ=Å”Bêhu#˜@%AHëc$¾_ž½tvÿ!"p“P¢‹”R`ß‘jŒœóØ ‚‘ÈúŒ‹áÑ*01rˆªÎu]ϫӳa½¢Þ#“€Ö$¯Åjxí£6_ô~¿ßn·7ÆsõÙ‰¨dß»nžg)Évˆ(%EG SR­Hщœ* ’Bn±@E‰™„v}ŸBMÞˆ€– ñÁVKÉüpžs‹Ï@‹–úËÌ€‰sE.¨ªí"æ ”®ÆŽ¢ Sç?ô«Õj†£ÄB¬ð,vñ®ë`žBãáp¥V¢” !”f˜-idb¥\âv,@ ”À!‹ib? åÚTÄÜ6J"DfN"š;V‹åryvw˜vwž¼}òÆ—¾üöÛo‹&EQ”‹ KÁ.%žæ7¾üûŽ©[r„=`ÓÁÜÑvýöC zùîÿÝÿôMŸü¾7ÜôJêÁÃG»S¸;Ïw—ëý§>éöo~û_üñÍ„ú=„»"_äîTfQ$Õˆ¤*;èHç ) C-ž<Â2sæ%6§ —žÎ9ïs’QŒq¿ß?}úôÙ³gf¹Âqñ€åÕ0R•²-e\VL]pMŒJñ–¯ÜbÊ-Y¸pz©oì—=E–™Þ› ?Tˆ"¢…)§tˆªÌn)ÝmU•˜ˆq5D¤ÉÛ¬*¹Ä£†*×_\}]O`ý¿2ëçù¸²HUUR€LXdY£‚k‡-œä±Ök6v®?54Â[ÛÎ?HÌ ¥–™§0…b"2»¡_]Qe¾’õ¹ež‡²®+«QðWx‹2°dã×>"–#Ù$aäÐCq~pJ©ëº;wîܹsgš¦'Ož¼õÖ[ׯüUlâ;ŒBt.̳”XLFÊ;àLˆÈH @¦Zváœ#âÅbcœçÉž´ò“šKñ³­F›‘+‚õ›Ñ˜Ì´°,ú¥±»®–ËõÙÙÝ»wïãx¹ßï÷ûËËËÝngþ3ãN+ŠšnE̼§–$Û€”µsŽ¥NL›®êUSÏvbeÓ/Ê܆á-ÜkO—Š=`M ‹j•÷»ÊÓÚbf—•Ñ[º^IÖ¹mž”…t®™Îæ‡BG쬪…ˆ½÷«~±–Ë~%'éΰòªšDŸ<Öy Î £àn§ù|±Ôí¸GXèÒäfõ~·ÀÝ_ÿ™ïø¶?úæ_Á^ží¯‡Ÿûìªïû¼J¾£˜vó~ü¡½{ï•áÿ¹ß§—»¥|mÞþý¾[OªP*LÛxç}qFýfËšQoΙ®s¶Vtôøñãív[u.,=4lÃ*Í ¾"ŠnìÐWyº˲ à¶„àhc·$^¯“ÒÍOØîwË@%¥z°-0luSP¼RqšcŒ)d`  Ë¢,"À,M1QÂ, ñ¤Š+)Ifƒ^‘»ï¬=”WõüÌ·}åÆÁÞD„Êe °WJœT•Ío¨VúD9°]0«eCák“:(ÙµG!BkO¤tº¶Lu»[ͦf÷Ìi&¢\hÆÌÌýb‹+ëó®þ¶?‰íÔõq£:õÞ ³Z¶Ûíf³¹sçNmÖY™ääG$B´^)JD§§§>ìºîÑ£Go¾ùæf³Y,z8Îq}±: äf̥ܓ`”˜‚ª"9FT8ð dêû~¹X÷}oà1«ÕŠÙOÓ8Ž£ÉN“šÓ4µYžv3÷Vëµa¡1Q‘ЇE×§”¤Ÿ’Ë"Ÿ»ÞKæ“3M)M!7EÝl6Ûíöòòr³ÙŒã8#T'm½þÑ 7%E_ùk=R¢¹x›IÍw›|Ã1•(×4•ù¤š4cÕž¡MšN­‰‚ÆÝ5[-qˆS:“ Z—gÌ:D®¢LGÙÝpPy¥Ù;Ë!Íe­K‹5ÅçNúþl±xi½ð ãéÝ5;ФoŸ?ÛŒ{DÄ€‰àÙ~›fžw»ÃtYTVµï|æ¥SþOÿú×ýó?¼Œøqÿ¾õÂÿÚ¯?ùwþõ/ÍÉýôßýЫ¯×‹‰Xª#Ê “Ah†±MÆ@]ß-†ap.7zéºÈݹsw³Ù1"ïš;êÊn¶¿j±´ª8a擈"!«€$ )@ßÇ d‰¨Ltz:ÀýûjêÎÓ§OŸû·ÿ÷á#÷Á³§/}\…¾û{ÞúþæwþøüŽðKßš‘?¡z@€b+€ƒ½qãpÕf…’ÁOD©À=n·ÛG=~üØÚÎ󬮸—Øw«7 nºkËp+´…ÛÙ¥²7?ØZÉA‚6&{Õ?ˆ¨cç½snñ”J†¤ `8T5\a,•Í€íZ/S•»x,lÚÇ©yxغåÉnÛËGVSLç ¦l‚«åŽ)¥”Tåz¡“M»=–uzZ²Øžc>öåé,« #\åAT¶‡rÖšÛ?¦9]®d!¨#`JxÀ¦†fß‘Ýö'¹–¾n/œ»¡îüZ*· .ðs———ÛíöôôÔø šÀÔ¬úI"êºÁjož>}j¶¯9·D"\;/PW&.Myªš  T¶¸†år¹Z­}îÆˆÀÌ«ÕÊ.X6Í2KM”¡êÁ­vØJÑu™;%•”Ò(bY™¾w$§)˜7uÝ-*”ÐÉÉÉÉÉÉÝ»w÷ûýë_úƒ·ß~;Æ8°w{LdÒãa¢[0´ë<‹?+ËÅöëZݘ/nØSÛ«NK.mß÷Æ««©òðê‹ë¬ì®íOçççvAG¹ÝÅj±èûžÙà‡Lo"šç[ -ÔÑÌdŠ Z½ë ª()*x$´vÖ´™àl5ð«ïóCŸ”S„Gç¶ó~¦]O0¦ "Î h¬F°€Ý«Ãßù™ÿí{¾û{Ÿºä@xw÷^òøßø‘/æ3 ð¤?¹ÿ™ôñüîŸÿùÿûSï{eéç¸éü½ú3ûŸù¹¯ÿ ?ö—ቦ¯§Q5”H³ùÓ¨ÝöÞÁ®¢Èæd Ã)¥ý~ !X,$'è—î%Ò´è2²>VV÷”qÕáXÒ\YèÖãÑŠa½¥òÜÒœªÇ¦Šw°€m\Q0ã4— ²„(Ð3'ÐZ>蜓î`‘›F’EWyœT=]1©j4—ÜÖš«ÐÒw3_ û»ññíŒW,"Èç@D "!‚2!¨È¡= 5 Iê¸~ñ¯b>p“éå35$µÀ8/åFÔ ‰ Ð9×yòŽÔŸÛèxÍÈx×G¨Üq5]ªJ_c+éÝ*î¿ÆQ jk÷@,ànµ¢©ø±ÖëSU½¸¸8??ßív®46ÿ_+±Þ•>Ÿk\ÙÓJHy¹ìM@tDžøäääôôl½^w]‡È"J"VïÐw]œçÙâ­]7ˆÀ>ŒuÚb­š;Vñ_ïhc¼S˜c²T ç\/¥÷ÉÛ‰0Þåœs3§Äœ ËÅz1¬TuµXžœœõý˜ÆqÜívóûEWçÓ.&#0ZwD{MÁµ‘*Ô˜5ºcs©ƒÄA HФj/ˆ$׈×6À@Špµt-«þH)9-±6vÔä^\n³Ë:‰sn·ÛËeß÷‹~0~X¾U³ ËyA(‰QRß¼r`Ñ3!*BRtŽ£#°°*xÄ3ïãý›)ÓøìéV%Öaè“BREHEúšø?´døþê·|âÞXâ!šÃâÙ?ò§ÿÁ?úõïqîΦË×¾ôÙÏ®?õÇþÞÏúS«õ£u˜ÖL«ïû¡7þÂOòþ×Ö—¿ x 4åžKòNìÝÕn¾•ŽMÓ´àÇÅÅ…ªZ7û\¤dS.åF¶vþ TΞH7AG ¢¤ƒ¯£µ±ToÖcÚ¸Pn#Ж”[“¨BЙ8¯u½©X`¦I»÷Tòƒå]°AºÉ{„(š­Ñ1+@Lذ®œ²ïúaèƒë;7XðUsz®IV¹Û àš]Wã65âÅ+¡QÕyž-8Z+8kÐÇŽDõ(Z,3×µ ¬£`Ç  !¡¹±˜H*ЖE‚0{>×ëëìÄìSJ’ÀRtRÕ¢ŒÏ˜Dœ7AK®PU‘êñ9RåUѰsnœ&šçišÐÚÛÙ¹¶oõ}/»®»¼t••Õáœ{ùå—­ìüüüüüüÉ“'íiméŽåÇM®ªƒXÝÖ¡Þ¨=ÉId/F»k½ÎÇÞ±ôfcûµ¬T îPMײC€UÐ1åN ¹ hš¦ý~?†ý~¿ŸçyÜíœsC×[\í`úâm¾`þ§ˆv‡ˆJHÈDÀ`õŸL–wI H€=ã½;w“ðå¼¹¼u¿ ûÙKÙ!º ¸2²SÉÉú¦oß~àôƒ¯ÜgòŸÁ'?ùßî3ß´ηã‡ONO./~‹ñ!0ÿöçŸ}ïwýÂ/üòŸôw€ô\žu§ËoþÖ½D€~ ©È]KPR½? \'¥Ý¯–.¿5ñʈà gÉô¹ÆQ=ØXTol-§ë·´7s|qnTL·¸4C8@ÜIÓOžèæúÅšŒ‡×üXjÝÔ¥äœS*|¿øLìú†äµX,¬«*%28~ÕH0—P'ãZü½æÎ’ã=¨“¹M\ñ_[V{;,.Tè8wÅÈËeÒTCl ýú³E·nW•ž«¶åGõ€#—[•ÁD$ÍWêî«jŠÉ9GfLõý%º¢D¿«y'·äÁ]—¾ö¢¥å-;D[ÞãpeÜ&Y'bFÉ2¸œ‘§OŸšÀ6íyš&U­.è÷n˜i^Œ”ˆ,)Xø­¹±‹Â‘}‘µbPZßX-z¡]qƒå³s•üêW²Â$êEl@uš&FBÄí~ãœÒ²!ñÖÎî• 8³íøj9 ÃpïÞ½ŠëGDã8ž_<½.€¡éÎÙ†lDĪs*…d[ž®À9ÖCïäÉ~ŽÑF졌„ºÅ¯¶Êœqcûä1—V"H)¿pŽë¼÷ÝÐ:“&ÙívÓ4…iBÄ …¾ï BÕòr¸}¸™o[‘¢Z¸(a*ª$„@¹W»}~Öè0ê<%ˆ‘Ãðà^wÿòþÛo_H¿™x×ûa‰ˆ8Ô2$m,à¿ÿ·>ÿ©öUÐ÷›/ñÞŸýÁÿùsŸyà¥íø`7ÉãÕ‰Û^¾ p¯_|Óg?·ÿïùÛÿËßùŸø ÂÉ9Lw~õçÇÍþÓŸþ]h"  U{K‚+ÏËßþƒÚÃjµ:99‘7Þxã _øÂãÇç!˜Šíæ9ì÷;s±¦iFç\×wÞû~±¸s綾îß_tËÅbéØÇÜæ(Š$‘’(f¨Vvì]n‹´÷U+—’]côÞYO5ûGˆÖhòrž¦”ŒT4Æç8O3:'ª`XÕDHˆ„8,ì1# (€¨ˆŠyY[59'åSŠQSiÉâœóŽO2;ǃ÷sßùÅbpCçz 18â¡V‹%IPE@$dﺾë;8е±<yg0w+GDÍ•ùÎ1Þ46Ðñp옑˜½ós‘Gö!Iç{O€ºÎ÷¤˜B""&bÌÖ$šDSFy´MQ `…¤y]U¤õÄÝ "¯jdÎÒ:i‰É!1" 0 9—¢JÏγëœ÷Îu. Çã,SLsJJÔuÝj±\õÃàœê ÍdS+/ëh5ºZb@i¥â3I qž¦°çý8‡°Ûîö»}Š T¬ÕT&Ì`T` …Ü$“Ãí.÷v°³ÅT“^HÌ]×OÓh¦¼•-ÔxžcI»ÝöòâYJ©ï{Üíö&q«*̵ç¡"12P빚³öê Ý¢p(R•=‡p0°sïzç9×uÝbèWËþdMDžxpž§yÜÏ»)Í/Êž»Î‚¤ÄL‹Å°–wNNßí·»Ýf+IØš0"šç0î÷až!&Mœ¬·g)&@" iV¥yã4‹¨sÞ‘“$Ó8»õœçycLPE€Øyßuý°ZŸœžž-—«®ëC }?¨BŒ‰Ù-K"ž¦ÙêÂ@%†˜R%TQòN˜]ç:$â®ë½ïºnpÎ{ß1{ ‰€ˆ¢Àr±X¹?zv̳%:#ƒâƒUvGžªJxn1€"ªÀ~?>;¿÷(ö‹¥Íÿ윳ÞçÏ6Ûív·³ÒgOì˜=;"k&.ITØ‘ï¼ï|×S×»®w}×±#PL1†$e6[=7&Ñ21;$$Œ!…qžÆI’€# $ë_J"!iòΟ®Ögë“õjX-ýjá{ˆLÀ †þ‡Ž¨ã~éº%û¾¸Ùï?û¼W÷û¿ùööéSæFeà@iÚoå×¾˜†þÁdž_ø‡þÒOüã_úåûgÃê2¦È)ø0[ûõ}Š#HxôÖG~áëî‡îK÷ÒùßüÎñ_zžß}X Ã̪Ÿ…îã½ïSüÍ~ñë«ükÿöO(‚(Ú %pÕÉ`ÐQÖŒa³ÙÄhеÂv4©PJä¸ëºa±X‹¾ï2"š03ò¥ ·–ã "2Rl@æÚ£ÞÚ[7Œ$¾À’/jLµ0w3<ÌóÆauÀ-S®4J%Ök®˜ƒc&PpÈä}7P׋ÕÙòÔò$·—›yž%fXƒ˜æö궵shÙ_ý½µß•}åãŠåZï‘c™X2•^–„,¥7>oRXû¤Õ× ×¢’Ú¸¡d'PiE%"Ì>‚*!ôÓšypã¸m銜Αæ:=®}rJÿ{dk‡‡M½ì jB!·Òð×0¨DRµt´“‹. 9;zДÀÞö¼ïÅô®Üâ:UCc#¢#Z.—§wî, +²´vjÛ-Óâ!ãœJ&‹Å” ÈôùLûˆ!ª"(«¢a]8GÄ0M³Ñ^Ϋ5ËÌ0¢m2ˆH!óï¬3Mö›á¾Z­†E÷äÉ“§OŸ‘1":==Ýl.² ž°t©ªÉY™Ý•וÇRXEÄ ‰_Ûñ¯Ç Ž9Q%žšµÓ†o»NKù-ÿìºN¤”bd>Î9ÇÌ a~Ds!,—Ëêl‹¥ÛMËZJ =ù¾_ôýÂ;Ó— 9s ª µÅQX˾òþÍæ‹Ë®{õýؼþèò­·N×/v@"€Pp .ì¿ñ§þƒ/ÿÕ¿ü+sÞïàý pܾ T޲hóŸþÜýðo ´œ÷¯Îðña¹w_ØNàxA¿îÚ. IDAT§'óÓÏÆþÌãÙ4ùÕâîmûâ̱lYЈ¸Ýn-íÞ¹¹ÝåÃÌÃ0rŠ#†t¨ï®n((m†™™é˜§·hÖukë;‡×1€Ç”ªÚL`šLÁל ÄTJÈsÎN:ÂÁ¨wi‰’JBçœõX%¢åé#(£CDEètµZGVI)í÷ûgOÏ/..öÛ!tjÓ|J‹ªÜ󍤸 ‘U:¾ÎD^xJ$TÐì&MÆÈ@Ä  ²¥*ˆ8"©9‰Å}sðô>×}ëâ\áч_›mÂ&áŽKpI¡ UÐqK É:´壯2 NX~¤”rO“*€åÐ>ò “ºª_Ȩ|ÙN™ñ2fÆegèöŽŠ`irãu®HÇúóEÍ›íþ–-N)Yžóz½~饗Ürá½gïÐ1¨’c(`öа{Szæyî\²>ª!YïØ=€Œª @Q„D¸ëYX:Á`qœï‚F#WUPÚ¹]õÐxÑÙÙÙb±8=[ŸœœXløÙ³gV¥YqQ â3]Mž¯øúNµLàʾ|Õ’øHä6£úØ¥t{,.Ì,s×–cÑXd;{pHDæ)Îã8ÏsMˆÑEl/6›²ºw–¶ßï¡!ȃR¢à}¿VC¿$DUààÀ,Ê”©LÀ°Öâ>pÒèUîás_øíþTÜjqñæÛ€œs¤pš@ tº@ÜÅôÓG ÀSõoà 3džwR¾ÿ’W—|ÿbàú L)¢žŒVA#?‡[™RNÖÀR´Ûív»]ŒÑû^ ²m‹•ƒ™…†µÓ”b.ˆL¹‡’Ã&­Žˆ¸8oÓ­l´Ê{Kg–¾„Ì3Ä5LS6ŒLiåŒÒÕV°Õœm-Õpî³S@Òí[D´°n€@f\¢¢"sGÀÌ'''ëåêìììâüÙ£GBv-‚LÃz呸©Å&µôЍ‹ÿ¤_ÍÁ»mÔ ‘ øR%\Ím³ð&û-onˆ1Æ£õ€Âã¿wØÖ:ZË»åÔ–}<ÃÚfÎÌŽ¾ï̓¢Š $IN/+[v5‹þ9¬½VðW 8i¾¸=,f€–´jeýW4§+Œ©TmÚyÜï÷›Í&¥„º0LJ³-T¤²ÅvÔí¾"¨ °æ5Û+kRïn.딪v·€×r¹Ä¾³ ,2Aërh,fÓ9rh“µ§o>k·Ì4‰’ˆ&UI  L¨ª†á“40òLQ“ ò=‘­úÈ”ÔÚ•ÖÔˆÕjuçÎßÿýßgf›•µÇ° 0›¦{äéQÕÌÐoYöú@­‹èжú\£2@mø"NÓd®»*SM"Ô Bí•ù×Yƒ/Ù$[0k!E¹rÌ ²—ˆ–Ë¥€qƒØ/%¥†K;r®_ ‹apäbŒAe"y¶l‡lÑ1Õ$&˜UæéÁ½û‹õÇv»‹-?=;;}üæÿ ê€D€( =“áÿù}¤¯ bÔÇŸ‚ö€÷¨4¬=¶tüÞ@†óq|{sÞ¬{7MqΟPÿÁ4 ë~–óÛöÅÙBçD$ÕišªÔTÕ”â<Ï»Ýκv]×õ¬"äo¥¬ëÕÃlna8Ò›¢¨¿â£þ©%2¨ÇVPËžc´SÖØ‰J{%£+°YuõhU"“Ri^e¤íýn·e$‹D‘" ”¬^­V–mŸRÇ1Äi¿ßKƒùðµen‰»ÕWì†2I€—ÙÎ3ÇDDtæ^ë]YI)€u"ìØ‰Ht‘ç0#ÆTUž¿ü•ùHlånÞq< («©è"2ϹžU ¥¥”Øßp×Ûy–:)™õg´@E¹"kßõõ×>¨œªÚ‘dæišâ¼{òäɳgϬç<4À×9[ïå8,W³¶D£­Ô±;==}ðàÁ;w‹Eª•Šx0)IiA£Ù÷ù¹z5»ÊrkS˽͔´P¢ª"¡*¤” ¢Š²irV·jRžgŸ‰~L€RRð>«5±t”)Ø™d]M‡a8;;{òäÉ£G 5!•j¨­ŽVšÖҢ׬–4{hžw_ª]¡…V\§jêx*¸›W8äu-šRA’@dp4솿Užl¦ö8ާ§§‹ÅJLªú¥±$d0óúdqr²Z,’TS 1 zeRfÇ40BJæ4OSŒ²V½ó›Ý¥úoûÆæ ¿û¹åjx: Ž— §K@ÜîF€¾‡OL2'}©[-üÃyâgÀíLnñ `…dÝâµyŸBŒ;ßãÒÂû÷Mó/1¿’Ò¦`¿ò¼M¯Ý7}ÃmûâL»¤’å/%qW›¸V{S’)†Åj5,—¦¹82¬y5ülLÏTúþRîpiúÃA»i‰²ò\9_ÕýŽå@‘`UBÄ¢}‹l«JÐ:¦¨7YÀDGù&p¬ÓA9©T›¤ó'Žyá:˧BuÄÎp¥iïýéé©en¶Um¯?™¹ún¯œ"‘Ö[X*‚fØXPËö|FUÙ@N¯0ÂèÊÞå8‚HÀ®;ô•se5+RíW.xª–V§‘ס:ËŠ_Ë÷Œß9òNÕ™¾YüÞ¾tu£+Øù÷þo7E9¸Åê“V½Ü¡ÚõÅŠÞ:ÿ*€ÍÆçÜöR¬?wMn¨_¹‘Y_—/¨à)xx_Õà©ïß¿çÎr~7NZz¶¥dm$’!§ÚòÆâ]Ï´Gl2£ÚUÆÊÍw}DW€ˆèÙ¥¤¨`Ù!¢ 1EPòùü"CJI])‘ 9‘$EÓªUÕ{ßb4²óûý~†|àggg_øÂl#./Ÿ•êGD Y¨qžJ]ÜTßÚ_k`ŠUc{× ì¯|pÃSJ‚ Ýz—š{#=·2¸I½ˆ‰Ó•½÷PŠÅê†Ö§¨2Åœ[WJ¯¬ÏÉÝÓ“åjèpÞÃ^Òœb 1ä–Þ‘HçqœBU„]OëÕ0ú~ý‡¾þòûþøOÿƯþêG>*Ðv#À 0MûL¯ÎçùRægÛyP€½¨q0¢œÐ3ï ýÙàO÷»§û½@|ðv˜?ÝivȽ¤½§GÛð9€7~äGÿÃÛöÅ™o‡ša˜ç9¥$RKûh×ùåriî#WZ˜¡Â0 Æ[kaqegù¨ÀAèbÿn§bkchß©Ÿ™MK¦HTee(1UͨÀ˜¡"«ÉUôÕ Î‚¶ô9ãØí˜ö8ûnîï=2qßuCO¢¹¼2Wñ÷îÝ€g9CuG[Š–p«Y'Ë}Û»«*r‹&öžDUUl=ËåÉ2dÁÒ¬@ر04-D`bæÈ+AoÏ÷¹q\× ¡XfDªXD0B†ØVh@Sü£ª¢]‡š6‹õ)í?¹ežrœ PÙ\×¹² Æð•¸×mC_œS·ŽzöÚOþ{ñ'þÕ?/Ø‘~àeðµ¬à’âzJô2‚hÚnv;ˆ×§ Xoø8ÀÓåZÆq”Ø1…ý]†å¼ù<ÁKìŸDy#íÿ!œîþÊ_ù¯îž‰§îµävföCßuݼ½÷ 4²cç½J‚;YPŒDd*Ž`f”q´`JJ‡Þ5ÆÁ¯ð£,³©«‹œ1‰Ø9ç$edÇ„ |×¹¥óÞûå9æ ôܺ¯õЧRe«ê$ €J]æ[Ž#Àœ”ˆÐx$UáQ“€W „N ¦4aš¦Ë‹Ýùùù<ÏÕ"´œšTİI>ªÅTî¶ö‹GÚgå€)Ì£V°¥œU”•6DD0EÉ6QP¬ˆ=  P˜f9E¤7Þ wMó8JŠÞõŽ 0õð\õÌ(ˆµëÐÏód‹¶®C¹õrñOο¸x©ûñëßý±?ÿcùè'¦„ã” „ ª³æs"âjÎT{ž¯üJ%ùÞÒ+.(”;3[2"Z­aŽEM3Yšð;"’@Få\È2˜™T!&ERfDBfuÎQ&…Zä ‹·£k‘IB€žD“qJJI%§ŸŠj¥Éµ˜tý@û­ú×8NÓ4S^,–IDÌd¿2Ò<ÏièhLP¨9Ï™Hå b«o'“¸™Šªˆ€phgv}†E›!Í !"¡TGÐs :ª¾8œ½jØ‘0Ú|N¢ª¦Mì¸ÑS=xЈÞe°µ—©‡ôÁÅr% ¢àÄ(YÁdî×M¨ªàZª…cmBc–"ìi†¯Ý•È{™êá¼÷„β‚õ¸òû°l¡5A`U%²ÔÚä¸C`!ef R"2%ûŒÞUO39«ŒòÞÏSŒ1Î%æjí2TÄHÁ3·V),ÝRU3* ÅŒù"¢O/—˾ï×ë…÷nè;b”BœTDBî‚™—Ú¸a‰…Wê<Ðñ1¾Âеq!z;7>λ.ësÅZP+„•‚5níZ·§Ä=üz­êW›8^Øâ=Þ“|n ;í’‰µr5ûU óH¥4¥b jSùv…RYs.ͰsÂsûN-«`‡Ðui±(6Ð4í÷û8°ÍíñmšŒ†*¡ÔFÄ¿]¥+ë“×MPÕԞʀ¢*Pk—Eofyek^ŒUu… M5˜ˆÀ9ˆ1Æ(€¢LšTã~¿ßn÷ËÝn±ß›Í˜¶ÈÞûó5é<MšR²æ 5­šòVÀ48X– šDQ€L›Lª$bá›X3xÛ':ä¶¶:½lICQë«ÿŠÂZµÏ£ip€ Ѽö/Ï¡õ"¼·íäX£e€|úsr(1ˆA@@W*òë0`¬Þ`,­*]Dº®‹·´DK§°ê&S‘§0{ÍÕŒ$((%]`hJ2MÓ´ŸR‰IDbQÚm$s§N@6[?>>¿ú凿á㛀¸|ÿn/Iáéîwæy–™¹þìlx饓û÷?þÚk'«Õéj¹èTP"ë±åɯ‰ºør?3uÝQaŽóÀs"BW¶­ÎUÆU…©WŒÇàûf@„bã8Îólrµ&Ñ…(sI[89uB˜T‘CL$Ž(óÏ®ë’uäU%LA’·¬\Ǩ¬ˆª:Ë,1%P&BÇè æ–!ª„k¼5ÅbÀq…nξ¥ âuVh/,ä¦Ç¸€Ã0,ïëû~Ñõιyœ,YL“\·€M°©dA±âsäeÇÔ )‘åEnPa]OL3‘ë_yçÑr#ަ¢¨ˆ9G nbÓ!£½HÍ*oÐéÒ¾0 2¥ :]E/cçœ6VH½é•©j“vgQ6±ë^âì!pÁ•Fi&e§øn¨÷­-b˜Ùw‡TU[dc:ãn_ ö,nÂØ»êäÌ+P½G·­ÿñ²dzK@ª*)&«K …òåJ7‹ÃEŽ]î_9%¼ëÐCìêõ1ûc‘:ç­Ý(!Ä §¶ã¾ß\.OÖæCªÂÏ–½6±™x´S6€ ŽrYc ÁV;wÄË ;vf4“‚7hxE€b¸u¢вê¹EÕ52ÃR!Y³>3cT1®Uõ±É0‚ãÅ¿²í; hÿÀÀÒHmßßÛÅ~¥¦‰;Z ²›<ÆÖ?ØŒz(T5‰˜çÙ¬³[˜Yè`#¶?Ñ:SîU,@„¬P  (ZS¯Y§”RŒ"1åvÆc0'å•0Ä~”'ÔCcº½„W_ze«Óù“§ÿ–º>ÿÕ_ûôf·õëÎ4M*Fg¸gp¿êÓÓ3xøÀù³Þ‘h iN=.TéhO1ŠK³:v«%Ìž]l\—ΖËi'ʼn ö°”ÔåTÆÑÙ ÓˆÓ4ív;Û‰““f¶¢4IIçys2N$ÜN4åV†€”ÀÊ­$eœ’¨(h™c˜C8Å…¦„Ž™È9NIUŒovÕWl%ØMÙ¸9ñuk¬þªªÒ”!ÕÏÀ±Ìh•U?@ ›Òþ:Ž;"`о÷½w;gGâ„C_f³Ò®=¥X𱪋⺂ßrœºMˆ–9òÕ£v\™`¡QãlîE›pŠÕZÕh,J:ʼ DÉJÆQZV»#ˆ%àj!©²6i&æ]F§/l¼¯JßXZ¾ØÉ¬ìzÀ5yØj! [Æ97,VÜÁ5 ¾Õóf׌1NËi\n-‹ÐÔÓ*‰-Úƒ‡6k% 7ge· º¥ÀlEI)j" …Tî[ýãêVæ ½!Œò¢FQÜAUƒ(+ ¨ó~¹^¯×§)%Ül¼ì }!)(¤4OÑœU©À2h11cŒ”un4„”‚¨f´¾jC“¼"MŠ 5=0³‹ÉºçÕ}$òfЍ ¡wÞò™í¡ªnWÃÚ”Éjñ©åÄ(»l(eµ×÷1ª’¬sB%̼AÐò©Þã00Z“È®Y·cƒ¡Åâ!ÒœŒPf-Ê<0Kbßï÷Fù¦C_¡Ì -š•ýÚÏ0QʆŒ“$£NÇ8Å5%PbfH’bŠ!…J m01 µVó.8"¯wv¨ýbx8‡é}ïûØã¿øÅ/|~3Ï£#…ÄŒ:8pqÖÌÓvî]çNÔiDAùD-˜fˆà„I¶ÛqXø—ï¬d3^88µ“ÈŠ¬@Öµ%«VÃ¥Š×ŽA%²JLªjˆÇP4SKj€““•íGŒqÇi Õ€–&¢ WÈÀ|‡€jÅ'ŠŒìPƒŠ¥sÎH )„Ð9gmˆLóê|ß÷}NúUÑCŠ!E- ‡Ð9ŽjʭݽF[í×+\}qÅz¨J.UC-–¦]yõæ‹ÅÂb z†ë­Kö€¹¨’(´á^«Ô¢ÒP•rìÿ†ìÙ²Œ/Æa•Žpª @$¥œ6m^L%BU‰éÛŒ¢¤‡ögr€Ü^¿½…É]rl*8Í®i’ª%#Á †­·x^W,ÝÖ*·¸•T;#r*•EÌL]ozäéé©5¦5=ÒwCûDЀ•Ö¼°ªþ/‹8ôf›ÙmÌhš¦íå¦Ê 8VnÞa\W¶$©¨éª‘@ZFßìš²rýRxŒÔqtýçŒ_×íÑ¢JTq„~èOt÷~Œ™·ÓN¢QDFp~†ÕÉÚ\hˆ ±]§fY²MXÊÖËŒªc²RpÎíK™ÜA“kž«¾Ù"—¦\X8#ˆ³ÕWêk,®)•èsFj~ü©4ì²Pƒ!JDpàÚÇ6æP⣦«Bzo%ðΖš*28¶Y«x«î%{{Øý4šÒÙz= ž÷ö©ë¹4Mÿ… IDATqJ*Vº™¢JŒj çÄÀ€D´KÁ03]ÏÌSˆÓ\$4(u)¥ˆjXiDdÆŒ#Šª~µùÒ—ß~ÿû?ø`µ|s ð|õ•¿ýÆîÁ+ÓnÆm°Ž&I7Ûé"iÿ=™æ3ò›¾ÿpÂ{Þ³ (Â$G‰,&äUµã~š¢ëðÎÉ.7sœc×f[Ä89i6ÄrÊ_e5o¥ª­›[U÷ólTå½7îÆš àyŽã8†9; 5]µ ÙmŽX0C7tì\"*³¦@Â2g9¦™xÙõž]&Ê*jÁ`CŒ"ªÄ$) "![(lc½Ú„QÍõÙ®)^ß4³DZúH¡XÞ"â)3Žõrµ\.{ïçª×<ºEQÕ[ÝìÊ9yçƒÔ( "†ý~¿ë¸¢rY-kÀ0@‘ ;_júUf—̹ [ÏÕàš¼pE0TmÆuþxR´ºÓëuœsqŠÖ9ÔHYõ^½õ°'²Êu –Ëår¹<==½{÷®AâY=bLs J&Ž uWz›W¹Þu]$Œ1DƒIbSOÇÝþº‘ªÇãëÝrg=Xx•‰f×¥NK½©|üÎ{7"jD"êü°>Yß= !Œ1uçcXÊa¹ïOÎNïÝ»gÙ‹–]KßY“ÇPbó¦ëw]—RJû±ò"£ SƒZ 8/…*¤­œ‚,,oXy"Z>b*.Jc›t Mtå“-ÃTUÑCöCõsÖ½z["2ÏzËj°¨Ù3†&‰éù^Ÿ´“Ô&imù€ ‹µU`²jov[Kú¡±UDZà}ê•]Š §9Îólˆß½Ï]¢QasH)‹sNbšçɸM«R«jJi;çt÷#*`QÜ»p¶òÃù[ò(]"2à ezéìá“go¡°DT«?T&õ îéÓó8ÇÞu«Å ¡–kö޼spTnîÜn÷ŽUTÏ/ƒ&$Y.ÜÒŒ1ÇÂDQÕaÍ‚>9]™Ú2NÑV!¦Ûq{Ø€òòy—åDJA5YÝùù“”Â8ŽëõšÈ©jWÒVE B€\ªc\òæ8ct÷ž‘zBXœ¾üðáƒ{÷íXÎ1|ù­7¿ôú—7ã~·Ý†]$çcöÎ-;ÄåSŠ{EIæ‚§iáÖ‚¬ ±÷}߉ ¤¸#L)Y÷ÙÎûZ(,ŒU9­Åš@r Af6·*D”コä vB¼8ÆwÉl©a€hŽQ§)ìZ£‚ˆDZ0ÐàÛ:Ç¢B¶·| Úî­, HÔIP$ÔÛú¯§U µŠÚÀj%UuÅV:Ušb)uL@¬"’óI Æä*Û:\¶Ôœby|QbpÞ ón9瘜 ¹”4™  ɑê’[”!Ó®åýàU­µœLó~ç®ë»®sŽ|‡Þóýû÷ÏÎÎîÝ»wvvV½jDÄîˆçV¬gTqÜE 3MÞ÷Þ{!FOŽ'aÙ÷Þ÷1Fq´yv±{v)1¢¡-j„Ž8{ÝJªX"õ) :fŒ]\\ŒÓè’#•Ânšl/BŠ߈E“n…‡Hs‹ãâìÊ^ />’ýˆ‡ò¼v $V´+SHó¥´ßïyÈæKµì°Å¤¢ h92»…÷Cן½òàåû÷Þ°ç\R}étõðîéëo½¹½Ü\<{¶Ûí¦1ÌcLâv*¬¬ V‘€\ ÑûÅÂШ÷sÊX“„‚Rm„b–Y}Ìú:Ŭ’ÛcVw‡H)ß26URõ+ÕÙ^ŠXªò¯*Ñ•9Bã)µQi ®ù¯² }d3aûâúh¿Þº¯0åë3¿2š‘:gUMñÂŽ%L«¹=ÜÑ]l}j®“+í³®O£•Uu¡¤Tc甫by×gÔœJCΡJÎ×ðޭ׫³³“û÷ï›\íÚ|Çÿ¹7k’äFÒõìò+îL²Ž®Ý•}؇þÿïûFv[FZ¶¦9S,2¸ÜÃÝ̨ÁáI&›U3’(§§¹ Pè­Ÿêq5ÊÙÂédò¢å‡9+ ¼GÄË‹‹Š]íüa»{yyR„Tl4ÎÇüó/¯³sÎ öò[[å$ecª:58%Ä0õP,-@@¼óìýb½¾¹»}ÿþýz}Ñ4 "’w]×ÝÜÜŒãØƒçœõÊõòæˆÆqÒGu‚˜°úàxØ•!UUÁO¾pÄ 0ݦp¦"à«Ì üÜÓŸÿòjáqÉ+ó•#Sa*žŽòþ¡Ã— ÇìBçÓ¤Ô¼V9½$Ú’±ã¯s´ÈiÈïÈoá¸k§ž²bHQQ5ÉBŒS„9ÅRñXŽl‰WfPÈ88WMn9µ°}2EmµZ…žŸŸÍª6Ë7 ´ÂöùyŠRù¬Ñ³'@UÀÌf×*Šy³K-GÏb—®\â’§¼5²´ÈmWlÞ)%UôÞ»º²ï+öY•F^BËÃ'GĵoÖËÅj±|ws}{su{±é€Ì꺽¾}·Xþåîf·Ûßßß¾üùáþãÓÓS¿‡Ñ©8$ˆä¨ñ¾r¾bga'1iˆa3ù[ÒuÙYïD‡ÙüÉæ2$faÄd:ò8ÖYÛr_‚‡Ó“ÿZ¦¾fFåxÍ^Kqò Ónþ‚>l '1³¼Å¯Wfº‰›5&„49œ+8eO“Cí¸¯Fˆˆ½=—„ž­ƒM#Ÿ[œ­çÜ‚zjPO'SÍ7!r4k{ιÅbq{óîöîzuq=aÝ!çÁ ØžÎAn…só±œOù\#€Îwž]㫯€(¨ÈÐgD~œ‚¨ô:¼5òëŸí>5ÍTP‹ìœî/àïÎÍ %¦É+ƒ\×uÝ-ê¶]^]¿ÿþý÷ßU¾b0œ X^¬SJk[¢4e[\ùv6C#1™¬œneiç!Œª)9…š¼gQUú’èše‘Áu!M$˜EEI-¯åßWĉIa™DÍRO´?nÊ$ÁR ý†M ë4“ž'i×äù”< ÿÍëûõ!_ʹ«9᪪Ä…#XÌØ–š’ JBÄc DÕ¬^ˈ,•ƒCJÞ{fŸ°ªŠ€¯øòjÃEãn·sŽ˜)¥”b’">; Ãb±hš½‚ÎFObTx:Zá¦àdcé&ÈѺz8ËÁ³¢S3,ò0e¿K–݆g ȶĵ>==‰@Œq³¾4ï*±s¤šã¯$HÄPSÅ®öõªí®——W׫ÅUS¯féË ªªïšÛá"í®®^^>›^äœ-\þœ÷FD–Ëeœ:9?†ö/S—Gƒ‹*¹¹]OìT3UÞ/¼¿¨»ëÅâv±ºîÚUU-PEæ6M"€8…ªé6íâýíÝþð‡?úôøð^¶»íãÓîy+1JLB (£sŠ€I-T$ ) 1%5(QDDNEU¦9W¨ç™«ê0ôv+³-L{ï­s‹U%ÙÆÃŒ‡w¶’¥üƒSЇSÒÇbœyzó¿ÂlYÚ×øU´‡LîY:“69eΕ™|)9kâ‰Õœ(aK˜–3´Gt§Îõ¾åbòT¾ìrâk>Õo‰aœ½ÙñNŽŽóó?Ó;GmÛ^__ßÝÝ]]]Õumj©Lý"OÞ7oЉU8ê GPÌÒjQгŴÅqtÎqå—M]wmÕ6ιÇÇÇ}:&‹–H/W~êì!Ìdƒ%€ž°=RÐSL‰;'ô䪪jÚE³\¬//—ëÕÕÝ]·X¡ Ôu-5YÆl?ô1E5GqSUåæ½>Ì© 4“JÕ-SÒ¾‹)éÔ5hòÏO ú7„‚b§ Øs™egV~ö¢_á‡X¤qdåò+×gaŸ÷®<È0“ýï®0½5Îìõ<“3Wœ‰Ébäû¦ç¾–Üg=ÿ“M YêÉ\K¦µˆ 1$˜P‡$D´ÖÓFµ µŠYsÿrS™#D¦à‘s~‹‚ÝÞÞüüóÏ?üðÃçÏŸSÒªª†RJcŒépccl†a³¹ìÖíÕÍmÛ¶Icœ›…T1eXÍ”'ÂT²l@ª–©à4‰ýÏ–Ø|‚öÛbUóReÉK¯E×èûôÙ®a‰VObŽˆªHTÉu_´íÕ¢»^¬®Ë _µèkJª¤D€‚SDTvâ²í.¾ÿþùróþú»ççç>|üøñññy·ÛõýBHkç1!€'D €‰¼3 E íùläó©³hŸsW–R«êápØív9¦˜»,—6kyÀ²ÖŸY?9V¯p–j¯N©æëKÂ}ë”Qœ4÷œ…Ñ$–ye¡Ðócʳ‘­Õ¬¹káf̳Í^ֳحι‹Ùù o°°|«Ì¿ÒÜ«.Îлpztµˆ¬{_µmsy¹¹½»~÷þvµÜˆ@ßy2fyÛ®©êRždš×‘èËnÃ|<´|m˜›úºªÛÆ9‡¢Žø œüqæòeœ}v$h "¢óåVf7;àÏùæïÎУˆg®ëf¹\¶ËUÛu‹å²YtUSaJ) 0s]7)%EêcJCŠÕ«Õ™8—¢ZÞ_VKýXD ƒfÊaPƒ0?“%·k1nkn[?%Áö%);¤¹i#Ðoo¹^¾~”Jš„_]Ðõz_Îó?m”ËúPNâ+çV^|&Ï8Ï/>´ä!å÷Š8yš‹«A’(¢á8š.l•Ó@HÖuÃ6Ý’0¹È)©ªªëº¶m™¹Û¬&NöžöÝ<Õ&¤»®3j|yy±n:ªRŒ’’ 8BÏ!Er¸Ú,¯/¯ˆÁ²ÿœ#œª_g{cR•€s­oÀ)¥äñ¼"¿¸‚gDi‚Çnj›·ßïM*W‹VU-‡âh.¨Ö5YË£uÓ^¯—wï6«ëå¡ÖÖ²E€ €*rÈ’¦˜„°qÌ亦»Zl××÷W—ŸïÞý|ÿéÃÇÏï?ï¶{s®GЩ¦›„!’ úÚ9;r„HH8güë+eNY¿ÎiŽŽ&<ŠIüì÷{CöY,4cì0tœY¿4ÊçæQ.x¾É—.(2-ß*ä/'PÚm!ñèüÒ!ÑÂ_—棢À„˜C' erµqCšÙMv`J‹$³-Ñ<+s·ä]€Be)5•ü¦mÛ^^^ܽ»º¸XW•CRFWUU˜“5rJ–î0k'9TUi.3ËØœýrêc?.T1"jšæúúzÙ´ÎÓ~¿~~¶N‚¿xâòL²ŸÐ$•ΰÓc%sùßÝVUrn±X\^^v«µoêªëªº¶"`£µ”lb„¤’Ô 8’—”ÓÔi#ÍØ6çüŸÓêÍJ’Î~l«øÊU§J`§4¥éæ\´ù㩉”Øaöd§¥Y0€_ûŠFÑÉâÎòÉÄÀ#«×¥éÿZî¾õ¸ß}”ŽÉÌ2a•ÿ o»_ü2ÿÓ›ëöJ´} OúÓ$weÂ3BdbbÄ)àꈡâºë‹Åb±0»ÖŒ@fî–­‘ 3#RJ¢‚D5+Ù€x“Rðž?}úôùóç¾ïTBH*¨¢„À´‡!ŒIBU»Uíæ$ #r @G4«ƒlÎpœÒ¼w)‰Ë9,y9àõlXRÙ™{‹v¼ÎMÈæJpÁ×&´Èš&¢Æ;e©œ_vÕ¦ë.WÝåb±YøÔÅ‚c!hTç‘9¤QÅ|h*^Ü^ß^^¾wûóÝýO?%ãw-&Ù¡ª×•}<;Wá0FM©mº„Ðøêz±øãåíŸßÝÝ^lšÚš¼§:lÊC“Ã~jÐ Ü\b攤"áÕzõ}×õwï†0þðáóÃÃÇŸwÛ§—É¡JícŒ ”™X¢0 cO "Q!hL AQœõO‡Q%¡Š@JLÀDS’›ÂÔ»DÅ4¾ïëºs Xvn)¨ÈÿSÂlК½dP€‘A'õÜÖ‚™U'Q‘Õ ‰šÕv3cV\”BylòÎ1HLa c’„$H1Äýápè-U0)„ˆ")ƒ8K²2‘’hí-á~2³t¶¸4ÈR JGÌúLá+ÿk{œÑvt¶¤û¾|ºO)©LCã8ã64mA’9pŽ˜ëõÅÅÅÕåõb³qõ’|ëœC¢Sl|# ‚¨F"Tð‚žÝ(“œõ[öYd~=+@ê…äÄ9R"!JQPÇ”ö£÷Þ)!LÅgWwïÀùýú˜³ ù0sð© xæM¤Ì L)ªD´¾± ‘Âô?˜á (šcÀïŽë™‚ˆŠÉ05ì°¤zž¼f#j¨ë:%‰’˜¼€Š@UUÂQ«zsûîöýŸ‰+ÏmuöUÝŠâ0F°¼åc£´2€†˜† ‡aÖ¦i›ºó¾®ë–kãxxéi ÞsU;"éû~‘©ñUÛã>WEÁà88M2zÂÚ)²²G²V.€Šèܘ’Æ< ÀتZU•âT¶à\åœkçNSuÕL™n(4ÁL²•ƪjš¢`Ö¡ ×V ,5çØ0€e̪ª:@릊ÎÒÐÚvÑ4M[wŽ<1$q$#ƒ©Ñ¦™’d~Rª›D¤*Î9oØì¢D4m1£ªŽc<Æa!ÑPƒ4J€IØÕÍ8ŽS]×UêeÙV)éýý½s~¹ZÅÇ$9M² 'UΗ25ÒÜ;娒Ú£Lµšz*hÑAÅÎsåРc¬z¦¨2)Ò!ŒûóÆãÀ.-¯®@£ˆ*’UuÓøª²²¢¦i@¤®ë¶žÚ0û<òÔJËœg‰â n¥ ‹Ê]þéÿ׿ÿøáßÿ¿ÿþ[’„¾]…4)…íó¢»xÜöÿôÌõÇ z½\¶;ç!Å–Ý^{Ç®FÓèØ<çŽÈÀš`ª ¢:óõ[·W𡱙YfÆsÆö8Žy‰ËCÆäœbø¦än·OuçcR“CbDÀDmS]¬W›Õj±¨ëÚ›äøFÐòÑ È3Uη¾¢?T7›ÕÍzýðððùùñóãÓ‡§‡íËn+†o ¢Q ÉŽ‚@k‹@À:s{¯šÙ öó'-a<³þBpΙk4çôBaí!i—W²T¥'Š,NWþa¦ïR•0QqB€›~õZ‹·¢¯±ôz "l$Nv•*Idtšàsöálnåiü¦-Gy€ÆP/s@ZgC#ËÅbq}}}uuµ^mÊ^YÙOÇF ªŠI‘•Ùpö*gOÀkà ß&2 b!œ áÊ,3år™³¸åUrì~Ñ~¯Q²ÎLUU-‹åúbµY2`Åɺú@Áu%&‰ £@Hq aÃ0„@”™»M€ ä}½Y®6›U’°ÛµÛ§Ý8ö‡!’«k/ Çq”ó\Æ“y™*ç™´R`<‰ˆâJZD°ø\únU¡¤* úrØ#ªó̤¬B’´[4Î ¨2:ËóRG€o9FÜr¹´Šã’Ädí¡ìå`(0Ù/'8)FÁS^ƒ)’i»­»ª]ÔU[9b%DÏì7ËÅÍõõõåÕb±¨ØÍï7C—µöÉ¡2/šVWíþb³}¾y|Ù>ÄPe‰Ô4bDKÍÍ=ìQÒIÝz&8?kŽåyF|3ŠTÊ€3A˜ÏYËXUMñäæù·/8Bª*ªf²LlEsu×eÆoËÝbþç§ñ+q¯Œ¬ýäôuSNòøf27„PÕ¦i®®®îîî6›M×.Î\“š85W‰ 4ÆršpfÁ¶¶•º\‡rD“ DD€¤ªñå„a¡è²íRè‡aØ… ˆT‚àü¯ }³²uÀ©›xW/—ëÅjÙtK L ŠRÒÜnHL£˜ &kvËICL:ÆØSص"â ª7ÕõÕÅŸ¾ÿŽ^¶Û¿}x|¸ÿôððy ¡ª{'â0 ˵3ÞµNE)SWÛ#¡ÎVùã¢â3LMAŽ ¦òþâ¿/·ã7oMy.²ôý'`ó+’©’ÎpĬ‰Y XS’H¨$lV„y@ëº6´8Uýéþ^‹@öí›Ã/¿Zþ†>ÚäSUüRݰª¹®i¯¯®®c'R86× Ï}ßTõKSc/’:ßhˆc?D )%ïêfÑÕmS{×UM[5š’sÎÓdÙ½Õ^ʬ•¬Yãì:ºYo7wûçˆòY쀀½Ä}ø|¨¤Â"| ¼XˆªVÀ©BTˆÁW8ŸûóŸÿl>½———Ãá0Î#ÎíÛ&¾–[û/K‰2Ë`Ì~‰#ıßïÙ¡Cª+_±wˆë¶½Þ¬o.6›Õ²f7·Éüf²&t Jª “³Ú¼ Hʈm[-‰îÖËáÝíû«‹¿¸úþþpÿóÓÃvèGÑž1 ¢FQVѤ IAˆ`DDI)ÆS€$)ÄOÍ:f Þ£« IDATଈ$D4~Û¶–p&{òr½>ÆgrëL’!"Ìœ‹X UbL7¶f;jÍhOlk»OUy˜#‹å&" (@ ¬ƒVRç’«ër2YßòìË Ã—$tùÍ·Ša"2ž˜ÿZÊÂÙÒi¶]l/˜h±\]\^-Wk_Õä¼"EQ"$$ DU™ZVxµ(($p.~‡ìrÌhYg›u²›z²wg\¦ü­,ÊÎ]ß÷g9/¯ŸòÏYB:N›™«ª¶c_E@2öŽè}Å8g<$QT5è#†„IHç¸) ‡„¨ÑÆù«Åúû›»¶©úË—®»þ©íPôáù!EUó#ˆhT»·ªBRÔcVNvG)jÎÓP+Õ,Õ,`eÇ­ò„žq¼,Ñÿiñ{ ),11üTI Vù"¨‚Ѝ‚85™°–···Dô¸ß§Ÿ-Óx±X”Gf>†Æ|<9IbÆ ÄÙÇW*ÑD€€ 5Óª®;à„4!TÕ`)ÍkëU $¨Ž¸ª›®ëÚEÇ*•s1!9H`Á}~#¢”»§[º¬üwWW© ˜RŠcè"j@Ð!ŒOÛgG@ N“tÝ@!EH’BHž+òon‰ûãÿ¨ª¹ÚápØn·»Ýnì{K4ú’õT0qRj…¦Ê…9æ`}å ÁË1wMÛ²ojßyÿþöêöêêr¹jœ'UKŠÐ)(ðmÃ…s8#KߌÀ ªSY‰*À\°K^U­–àêêêêêªëºìT´‘Íß#ÌüÔ LUMÞœèì§ø‘goW*:¯læÑÙ¥™)¡ö•$qÎ]]\†aÜ=o‡Co€¦s/DøÿtFŸ¥ªq]׋ÅbÑ-¸ÑŽØ¹ ³uš¦<íb 1ìûqÂ0Æ1Ä1X7u #ÔÐÕ@ ¹Ë¦’ºòÕjY{Vå¿ÑýãC?ô cÇš9 Lr÷Í™Ýþ…§4ûŠ`’Á'Ýdqî_t¦¹¾V+ÃJæ;d­1¥dX"ÿ¸VࣳÏy\BMH H bÿ9áÊ!MYĆj`™ÀQ!såz¼µ¯Ìij¿2™2Ž£ n^U‘~?¼<>÷\¯ÉùÖÕ$2jp“ö¦ÂˆŒ¤ †C,¹öL °rÞœ”¤  "ªIˆè-„êræPêšáêbÁø½ŒCH)=ïwA’Œ{ U])%£K Q¿ÿ¾J2uª…c’î›Ã™‚c±1U5$ñý~ÿüøøòòòôô´}6ËxjS¨s½]I¯åŠg?¿½’#TMCû!ÑmxÙµ×—›ïßÝ]­6˺fT+[€©ÑÁ· Q9Vñ²!TèííID™±f¼X¬šÊÝ^¬o®6ïßßýýéùoŸ?ÿøáÃç‡Çþ°“!Ža¥ÃbŸR’eçIU“F… –äf–îœà¢Ö=Ñb'Ö€ ÄŒ<Τfù%d•œ¾`<Á+ ò(TŒ°U¥ÈÁYœÃüwâí1žw‰·S$41S"Êf="™SšfÜælJS)_“‰¡ ãß,BâÜÖ·ìr¯¹*ìU~²"#¹ºé.¯nnnß­ÖæLCrHLÌÄ È¢“†(|’#¢æÁSž[’:à«#eª@^ñ|–îÐÓ°͈tu]_\\\]]í÷{k23ÿÚDÅoáò¿û0BŸ|Þµm{}}»¹¼bWõ1ÖÌžÈ5MúCš›Û˜tÉN‹4 s§HI"‚*¨I(!&Ic€qtÒÂmçxUibýüôpˆ}LBŠ1Å(’T(šã™Èø†<šL¯U5DzuÍ:Q§DDÒh˜#š¥0þé@Y]ûÝïüËÅ b'@ I1)‚ý€Shš¾l‡"ÈÓnK Ìâ‡ûgXRSƒïº®kZ"ëvÌHÕ×à î‡~X¯×›ÍÆL[ïýåååÝÝÝöéÉ0%ö/ý0 ûýa»Ýî÷û!†£:û™3TP~‘ šQ42TdÑŠÝåfóÝÝ»ëÍzÕ´@IAMøÊÐ$ZV‹à$ÈyR„!!0s§P3ՋŲk¯..ß]_}wyùñóçí§þ¥úüôøùá1ô‡¾?Œ/I"jÇÌ(1ZK¸”x¶}ѰWT­@[œr¿ßçÖ"9áÌN… ýˆˆŠ@P±œ—ü¢bTK­\æBdP*@͌Έ„oØgs©«mS.š…˜¹6À6$"rDˆ$Xv·¡zYÇ@çœÎÉ_çJ†é×_•[¿fìv;óçgn^ú$e+|³çêº^¯××××ëõÚ²¦i—?Á ±ê$’570 ©rƒJFœßôì]1ËqГŸ|QZ«*ªZ·5Tíšæ»wïR>|Øí÷Ó5ÓÞÿOÀ:™þ(ŹnÛöbs¹\.•\?ŽÈYœˆ*ª•ÿJ 3Ô×ÃéOÖE@sß%F"`PÕ$…¢PGR±v­¯noÁ’Ûö?~þxØ=1¤0I`S0«¡§k¥:ÁëžYZgcò¯Ä©rɽÂâ8³Šl¼¶‰¿uà?;¬ J ¤0ÿPP"œ˜çÛŠÄv 1Æh²€ˆ ]ÙÖÓ$.Îe%{9{M»FÛ«±è#^^OÀŒT9oòH¢(ú @‚ S²XHÆèœsP!)øº®ëºñ9§hZ†âD%ôNC±Hí´Ck[€Ô@×uwïÞ s $¶1õ)Œ  Ã8>nŸ+ vê™–«År¹tÎäb¢7¶ØýÛ¿ý›uB5>¾^¯¿ûî»ëëëÕbÙ5íåæÂêjžŸ¶?ÿüóýý}1ÿªÅ ðz†ýáÓ¤E{¦æ{ffrˆì[´Ýå妪*FPÍZU€¤ðv–ãGöXÛBD±ºCŠa$Ï1 € €3ê8 sS‹DuÓÕͺ[¾¿ºùp¸Þ>í~^~ðÌ!ö/ãNƒ ûýÞÊr4É„$¥Ô e´?„NæÕÏ c™é2‹ÏlÈÂÙ/°]ÂP|YE•™²,xÊf>ÍÚÈe2C^Ì Pì½o|å½÷lÖ0Ñó˳Ì Veš!}C©*ÌÑñòÕàÛÅpNM°›çe´´S;ˆÌ²åªªÄWæ ].—¹z„™SŠsþ8ˆ(ÄaÚ I³ z²­¿É@9VèêâÜzš¾)„®ëÑ`q.//-ãåp˜/™ÂR¯åý?Øþ›¥ÆÙWMÓ“K‘#ª¨ˆÇçÀqp«Ž’¢åÓ!(h7gH¢#òÄŽ\Øu®õñö]HxÐø°ßÝ?=æ¢íÌôPæÞw“‘dltN ÅW¨,%¡ê„Ä2=§õëå€/Éàog3ù§ à·†¢ `@)>LU§"æ‚Ún·]×LðmP¼þY|'óœk¸u®å«ª*SlNør>ž¨ªª¶m›¦rÎ%¤“sÉ<“G ˆ5 cVŽˆÚvѶ]Óµ¢"$…49 §_¥·|¬…Þ€&Õ Z–mÛUwþŽÛf¸ûþ9Œ}’8†ŠBz‘—û ãj¹@‚¦©½"(@Œñ-CØýõ¯ýùçŸ7›áÅ×u}yyÙ-š¶m—‹u×uU]ß.º«w7)¥Sß÷OOOÏÏÏ}߇‡‡‡‡‡7ôÆš}SÃ0„D˜’T©¥®«»u½¾n/þt÷§¿|ÿçëåz Ô¹ @•¿Uå'V+>@ÞVØgb0ç´ùˆ“&ç  õˆuY´þ]{ñç~ùr?¼÷_o7¡’O/ÏñqG¡ÞÃðÄ™Rˆ¤ÀD½Š€ì·–] ªi{K.†APR ãØ§É5‘¸ç54Ý\®Æ´Ù,Aꨪn¾_?óÍÿxþ)~Jãv¯ªV µu =dµ@`Ž›:¬jWÕŽFö€Ê Dš?0:úRÝ|JǦ)“"‚b 1eÕ\X„cŠQ:vUS5Qz !8Õ à\åS€©·ÛH$Þûqúé'f}Dƒ‚„Ìì©bpÞÕˆHHš’ª¨&I1öÕ` Á©s•÷uåS¤¡GRPÇ“ÀffBßר€I rÖW¾£"*&¨'aÙ'blLbxG™¹®|íÙ#¸ºM•wŒ<öƒsŽ_ž÷¸¼n%WìÓPU“7„Svè=±ClPAQ¤&¬j¬`oßa”aÇa@4„‡!Âðøþ‡û[Õ¦Y„ªqGjÜÁ91£#M îþþ~·Ûív;ë\×õn·{~~®j×uÝzu±Z­‹…U‹;çºÅr½^_\\ì÷{ë°}uuµÝnÿúÃX‰°*ó Ãà+&ÄEÝÜ]]þáý»÷7×—«nYÕlÙR–´ S¦¢ó/ô[ã-=ôµÝ‰˜d*[B4± Z5®†äj'/ÛÝã‡O‡§§CŠ1JŒ1ˆz´U`@`Ij™Û¹:B‡©ïB ÙÊ„¯šSå)*¿„92®ÓC¾mè+ó ;@޵ó6¿‰Õ­Œ—cÍ¥e³2Ž£sl¾hœ,!'ÀÏÝH²Æ ªbúl>ÅLNÆQ-ýRP6§˜Ñ\‘K¿xóûjV}2“%¢8VœxæSJÇŽ§ KGO¹ŒH Z¦à¢¡Nä÷…Ùca3÷Þ3ñ ^‹¦´­×ëûûnCŒ–F‡DlË#Çflè«Èô¯§‡l„•ßà©'°¼ì8mUœ3E~ú駺i]³ öuÝHŒ+ǘ4š6¶ßï-ÝÆ€áÂ\[1÷››d[ƒk¨mÛ¶n&Ð|‡@Ž“B’¤¨Þ×ËnµY,7‹åø¼ EbçÐÄñÄ,{ýÖðFæÔLHÇ,-#¼Ò5U^YÞð7¬ù«RÒÿ†û|qäÝ”Óôˆ ÊIŠ*ÁÍ?rÕPvÄ©Uðô˜FiÁkÙœqvM•L ¿¸ií€s”À–£rÜ6Õ²kº¦i*W‘),`j 8$7çQ°RŒÂÌž'8 ¨"Ì,„$â¤$™«Ã˜ôÔ¸SU-ñ9óçLøÓé6D$‚¶Ã«ë Ô‹øûŸÓçô2 ‰RH/‡ƒ½¿¿oë¦òŒ ë‹y7eŪå Y,[œåG Ã`<Ë{¿Ýn?þ|yµ©ëú¡y²­¦éV«U×uWW×mÛ¶mÛ\^¦õÚ~;Žã¿þë¿>>>~üøñÇOˆ,"Ûí.ªîj½þ—?}ÿþïúã»ë‹E]æâ(±fº Ž™ù+(ª_o‘îi€0‚€¨v¿½yyúþÇ›ÿøôãßbˆbŒqPåœ#FâàÍSA3å »×uÝ{,*úó|¾ÈF±p®Ï²ê?qJK1Vrœ”RJ“Îg²ÌLÕ£‘‡½Â ^!Û-Ä­àÊÎaÊɸ޹ßÌèHg“Ó¾L9ÙªÈv>—¾ÓyÆIžåÉWUU>.ËHË6ÏOÌÊÇÔ¹*füžÛçMÖy˜\såÍ@Ù!锇‚0 ûìÈ,Û>8f´¦…6ó¦iV«Õrq1ôiè“ {&šTŽEÞÍlýo¤(Ä’ÎYßG8³"¤¹ès޶ŒãøéÓ§ºiëÅXÕmD0ÅʳâÔª$Øç±&èP$"œ#‰É9·^®6›MÓ4Uí˜ €(DQ%ôÄ]ÝtM׺ŠrW$ï¼'ošA ãtlNåe¹³ù{"šXáì";3dËýÍ÷9;§g*Ëÿ"CÎUó[ÛßóñÖ}ðˆ{ì‡&"ªœÿõ+8¥Dˆ˜rÞÆÙ©™¨kÎô¬÷Þw­_wõf±XuUçÈÏY® „€Mâ:â¨"˜È1;š*‚ÑÌSJÉYPô }Ÿ e2ì5ŽP_&#<ÂåES7·â=y؇ô4Fp%¤$£¦‡Ý3þ„ì°jªºmZïXg<öI¶Ï›åêºÎ2CUÍøòòòøt_UUSw–IÔNž½ÍO?ý¼Z­.// èË9×uÝb±8ôýíííõõõ_þ2x||üÛßþ–B\4‹ïß½ÿËþð/ß½¿Þ,=¨P£U¢ÅB˜ÒØè#À¿bœBDËsRV@pš]¢¿Z¾_¯~X¶ý~7Œ“ BP˜[刈K ¨a…eIå„E>^ö.}o ð&‡’/äœ!¾5Mü éùPYY‡ê$&™êܾ©È­Èž^×DD{ €åÀ =ŽcQ‘HY Ôã«¶u(Fág/‚sÃD•ãúØÈþm“â¹²6›Ô4÷Èx …qylA(ÀJˆÌ„DèT0ŒI5öá sD¿Ü5‡™ØO-=²gö@èøõüçu°´ëˆXUU×-_^ÛíKJɲqEÀŠdÊß~¼Úý3m Üˆ³G`™!oê²È0 Q„¼†IŠž}ídK)Ó×3ˆ'mÕbǸ\.7Wìª]Ÿ ##9"Ëf&J*s‡ ™+wiÙ¢L›’£’ù˜¯Ÿég@¡sJ%àö|‡×âJÿsbø†¢ð»œóY¶S è²|:Ök9.ð¢ ۥʞ î¬I¿Jáè3Üx;Ôå‰CDç\嫺®/WË‹U·l«Ö;&Àˆ¤¢†uˆÀHlY+’[§mÀ©<ƒH@ÍÉE€Ì¬qÊ×ã 8ï]Þk8*ÙñƒŒÖ¦I˜<À²ñ7W‡a¿Û=ƒŒ»çmˆ‰œ#‡0„ððüT}pí¢um}E3þî\“¢4«D®œŸÉàªv}ß÷~4†ë\õôô´^¯kWµmû°Ù˜ îºÎLä¤b]Ÿ˜¼ˆ òóóój±Üïû®nþå»ï¾{w{u±^Ôž$PE‘y-r5…oÿÙéœ_=Û8‡cŽ®cç¥J‚ µóïºÕû‹‹ËåâñágÔS‚¹OŽHR* èËéN@S»o˜}°ÉÓ9oÅPfyžùl—’)Ïÿx !"Éíê~q)ÎFÖUç~ÓÓ«ŠóBaÓ4¨h&h±I)¥aè-Xk©ÑÞûªªªª²&?ù¤á/˜¶E+p)ƒË%ÂB¥/—1÷̘ øOË$²@ÌÙ¢}­äæ*Æ·°§Š³Ÿ\ß¹Ê9!Çꡨ:Í?‰Y—:ò,Õº® 8>§ºdÚг¢SµÔ7šSÿÊ7ýʾàŒM;í¸ˆ(Œã¢Љ¢ˆJŒƦöµT)¥a,"[ÀFf"b«s÷@×x$jº¶îÚí¡Þ>@×TB¼X-ëEKÅLè´Ùs¹_ÌljŽE‰E‡öL9yæ U²jâ|7ž;‚dº…/Iß¼)ߺþ%õ–÷¤7bÉo 'þòSJíNí_#ì‹Â¡ŒÝÑËE…<˵ å™ED+¼5ÉÒ÷½ÑFß÷G+ÐÔú¦iÚ¶½½¾ZµÍ²í$ˆQX­avDErL0yQ\íí³zOúwL¨Þ¾¬ ãÔ€Èg #…Š9/ÑÄ­JͶ\¬3"‚’YÐ  `ÑUïo.!åLJQÈñÐ*) éóãƒû±BvIt¹Ym–kf0.¢S†¢‹s_,âù`’ØBŒ1Æív»}||ìêÖ{¿\.×ëõjµZ­VËåòêö&¥t8FhÛÅf³qνìú®©ï./»¦A @Ȩ(iJ2b@‹®2óQ:þ~ã쌘'áÔš@H€NQ´$€«zq·¾\7ÆÂ€³‚&Hª Ä„(4Có@qn3Ç'kÔ\UVåYrí’·âi^´MÜ&oáŠ×\à×3"SU“p…§÷ˆÕÓXlv}Ÿi{Yó“µDÇ®ël,nX$ZŸ½E¶°Mù+pöeµ´ÌÊÏv†MöçÄ®ÌTÕ€õK -•¦PÌ‚Ð.˜"fýÝÓ>¼d)XJÇŠÛ,€‰hDnª*‘s©Êžºì¥ŸÞZ ç” à=w]³\vót¢j:ÁVžß–ô[Õ±¯PQ)Nò5T ƒ[‹I$‰&…@VM‰U5é-þòòb>gË›Ma†xTãžOg窶©]@ýñó‡íÓc娩«Dt}}½Ñ«¶ëÐóÌ¥kÌ™ÿ…åJÌʬ¢(ÊsA6ÏÙëo2sœRÉæ]ùýkÍìþd Î>ÿæsýk„Eà¦|ñ¯?ôìóõe˜‰ ÏVšqmeFõÁ‰õMù"béx9j9z°óÞ/‹Ëõf±X¬×ëÖWŽD@“ª%ÁJ„€§0°#J‰kçíø×¾š@¢ÄŠ; ¥ä‰ÑÍ8ž]’/¿kExD&ä%œ#0@€-¿Ü4ÎUDSÃóË.JšºH!öcxxxòuãª: xr]Ûx?‹¶Æ™†XËÝn—R"tVpbï“Rúé§Ÿr{Ed¿¹¹¹¾¾þë_ÿÚ¶íÝÝÝååµ÷~®ªªbç¯.»¶©›æ0ôŸ?ßǶ[úš@ÉÍ(QsŒí·á[¿ÔÖ )Jr0)(Úÿ:…ÎÕ7ËËËåEã瓦RTÕ$<“ŠˆâÜYAð\q6“Ñ97ŒÕ™Ç&[c0ïÒ4A)loØSÂÑ7ûÒ ¬sšqyÊ.PXZ)%L‰ÈÚ6jÇÂ,ðL€h.ÒÁcfGtvYÃ쾆WVÌ÷/À9Æ\ Q(NΤ+ÈÀËtþLó˜Mšf~“9xbe¹.Ö] ˆÑ@|†ÒIu\UPöŽÂÄ•°¯RcšÇÔ{"u$ kv’RT$¬jêÕjl“ ûý>Ũ‚ ƒè·àÒÚËJ¹^F=ò²Ø•V܆3*­Ñ…€š’ejÔeÕÛ)¥ Úvœhƒ˜9Ç€±r«ËÍêê¢é§÷/Û¦rª©¼ß÷—‡—Õz½Ü¬CŠI%ÍtˆˆfIÛg&"`FœàëíJC¿9åû–[™ 5Òü¸ü¬×køÛFžLyÏ/\ö>Á<7œýðö}&Ú/íøFÖñt@.Gš©á‚%Ú )æ ˜=ÛÎ9Q¯s‰©;-0Æ„ˆ¼"ÔbÖš*a@EpŽÙ;ba!@ÇÎÊ&1" ÄÇCI¼ïˆ-›”¬ŒX ¶ô¨T!ê+Ìüé%…ÒJijñÐT«¿g‘‘~úñaû¬Ž)Ä$»ý‹x¨ë:¤ä.¼_˜Š³ärÖò ï-SÓ4Ã0Hãªã8Õ`TM¢‡—½¢<=/YÑLµ|½±ÓÕzq8ú¾—˜Tu†Ýn§ªRU5³ú†|Íì*s4¶""DS=§G‹z Êyï«êæb‘dxxü¨|åöû}ØJJL ¶zC/‡ýÞ«‘ 2`{==†¸àLüŠˆ LgH$¦˜R2´?"R&bGDlàš˜³Ó¼½ÈBñ4é¸á D‰HC5޵ó©>!¤’ˆš/aÄ€Ùk¬„*‰uФåróÇ?þ…”~üÛß_ö9< D†ñùqÛ©ïe·Eã§ÓqŸ,7ÐyßÖM×uV7TŠ:EVˆ1Ž1("9&˜Zh'™:„¶m]UÕþ%ô‡Q5VUå}Å4yk&õ‰¼c&ŸRŠA|u"ÏÁ×ã--:0ÕÞûºj›zYW­sŽG#pÛ¤Lï”›¾¨‚(9$Fœ±ADFDÃt i$çªGzµ¸në€Æ¾rnáç‚¬ÕæÏV¢€¨p4¦³NR’”¢ˆ|Ü»Ýîåå¥[,Ú¶m—‹årÙ4Í¡Öëõf½^ÖmÛ4±‹ARÅîéyge–ubù;̼jP<(©¢) ÑÄ„„É WUB•¤:»k PY±ï"tDJäæNA¡-f+8µå"Ç sßkv®îÚåz΃óB ‘Ð0–@‚€ ¢*! jR‰aŒÙÃÌÌÃ0˜S4çëŸ8¨çhC^öl8Âìôìð|à ]š›P¤œX¿Ec’%ÄÌAl L;«Om‚cõ‘÷Ö¤¦_£Åö-ÑF]÷¥ñ†ÞúbÕÎ[ V]Uˆ4n¾Òì†raÍ Ï ›Ë”´/Ú¬¿rìx¢·ÉOKŠx’×J¦üÉÑïZz0%H1Å©—ŒÞUUWíéTõk»טáÙö% âª*¦ôøü¼ÝnãD“¦Øvõj±ìǰÝnû!ìv»˜Æ‡ÏŸïîs˜ÃbmÛZ›gï½&qŠ IBŠŠè*ÏHV”ü²ßàúÿ“ö^Í‘ìHº  ‘вªŽh1mwmïþÿ³o»3Ó=G”"™L€û>xdUÑ £Ñ(2## \~þya̘Y‹T™Òbfëê³\XX0¯ŸŽî#¦”ºn?|¿j}-ôãpéoº<`аSU`Ð,Ê %@˜U%ƒ* €"dIVNjÈ¡iš§&t­÷þ¸?ìv»ÛÛÛëÝÕv»=ïvëõÚ{i!tÓÔu]£%J‰uëF/ˆB‘˜\íOˆLЂ*+†Q± ¨ª• "NÏä‚$Ö € eZ› A@‡ÝzuusíÂIÆŒJÈ€šXA4#DP+"Ô„€*1'•"Ó™Ùöb•• Š@DúRÃ刾ÂËàË__*6—«‰ˆ @€YænV֚ƚ=ƒ(ª9ƒä˜ƒ·DJE~ºª¤@‹t ù¯ˆˆà˜fÅŒˆÙåœ@2ŠŽ"p>Ÿ§11shœslÚPI,AïóùlèŒÚjÐî?K~ñ8õœ,bûç• Q¥QhäœSÌLÎy4 ÀÁËT‹%­j$Y hÎÖË„xJ /ÊWÌŽž%͵OËÚÉ9 ¨ˆä¶ED»UÇœg°yrVI’‹õ€Ddýg‡ƒ™&U=W mzî›®Ö·–".\NÈ8Ñ^@µ€Jêd)бa©D2DT5‹&QÖÿÌEH@€TAÕYŽ%ƒF† „DZ:öON‘Dñ~{Õlw¿¼ÿ°ÿôé8Œî|ŠcØïǾ·%6`œ£×××I1:ÆnGιà=»y]ÒhdŸçóiÇèæ™´u·u©¾ºÏ_ÉÆ/m‘?k-§wùsu±Šû;ÿºTÀ3ý7äÀR³Vjk|™†Ëº4B¨ö(-håcñöjù¹K…V´aoY[fnÜì8ç|‹¾i³^M)NÓ4Æé”FH0hês<öçµov¡[5í×mã7-ñ]ÐÀê™ !e0¸²"²Z›„?1–²q®V¥ÙþÿÚëU8çLÞy€»Ý¾û.{þ´ßŸ¦ÄMÇiŠÑ)ž‡>Oq&O•~øîÝ»m@€CDWAƒ¯\+ë\E@\ÈqE#ˆªÂLóv©‹µþ² j Ó4ÑéççÃf³yø|}uuµÝív»Ýf³ !l7ma5®VÓÊ<à9ÕšÀ{^5mÓxç @§<]‚ŠÅtε¡išÆ¥™Ý¡:$UQiæö^ CÍ^`°¾X¬¦9™§Ê`bÑxd ›ç×;lŽÐgÈblƒ(‰”’šQK¥ HÒÌ®šÆùÒüòÂCDZx俵ÔV×Næ|ÚËÖø&èìuŽÓ~µf2ö.!QVp€¾Õž­Ëš ž"Ƙ%š˜[Ên¡… ,¹Õjã\˜âašÒ4Í`f@qމ ÚÝõéRé–cNž]¶ZèRþ2ÛåœÌÕ [>ç¬YMŒ:Œjg¢¾Ì­­ Ì(î(/AU³ .:˜K¾Ã#°õW¹ÝjcùïazÉAUÔ0ºäRŠ2›RàîK¡¹X""C8ZÅ8æ^-´Ý?üIì•~­›5Ö .®á9]iO¹t§ˆˆ3€™àÖ˜äqÞªŠÅ$VPãeURÈ¢AŽçÓ燇8¦óÐ_w›Æ¹]Ûþ¯ÿ¦ëîùx’Ƙ†iûó4Ž•gÛ0w«2Ú¶• *’T‘‘‰™È ñ«U[ñçªÚ'k*ó¼?ZƒƒÚ¢{ïÇq\ÎÏâ ¾ékI }Í]pI¾_»yÉåÒV .Rknn6ç —}>¾ônmëZ;T-¨ÆÚænù®—÷9³ž#’sžÙå,9Ë4M&“aÁöÌÌõ@™ƒñÊE†¥P&q¶æS6 R_cÌà€Ð"]×M)ŽcRÕœE¦)eÆØ‡¸š¦Êv½aòà3HŽ„ˆ¬,Zªm3ƒå›þÃÔ¾“PðÅaLI¨ªHNÙ9^u-ÞÝÁvýÿþë_è<åCß‚gŽ9¥QD¿úÏDN2ø¿þe³BŲ/ëuëÏ"Í SDR ¹¦ëB=Zzè<›‰’S̘UTu†ççç§§§Õz½^¯›UgæææÊ¨ŒêÒõι~Ð\³êÚ¶q޲¦("cÊš²•»äœƒó]×5MÓ!:纮[…&8Ï`°Hc½Ò³H-¤þ æ5`$@´w:纮[owM»?s¯9Aé\4·DšEI³Â”gdGýnè\vŠøË%Ω¥5|‡ù–BýÖ¨‡ÓÜþåE°à |N¨šuî i_T€y]N)à4M1¶ËÛ¶]*QBoÜn–Ù3{ç‚OÀ<"LæB§(çsŸR ÁÕˆ1œTíµðê<ÔQu¤ÖŠC¶V3,ç¬QE1„vvÛh®qOI $‹%R%ynJ&U»\¯Yïúy°aÝá5™èR}±7¥^ý`U1Oóõ}ô£¦œHivP˜€ #¨§P…éfÏ»Œ:³¿þÛÛâ‹Á ¢˜åߌÓ.k[êÅF‚WB_Rù’R"ªR~Á6S¬D$©PHUM"éùiÿùÓ'(2tÕ´ïîßüíû÷»¦U„1N)çátÒqteæ 1[k1¼÷ÇóÉæ|´ÿzÏ™UµÚaˆBhÛ»›ë;8‡Ãáñññp8X¡Ôù|>5.]!“e¢¾™úù“+ËËÖJxÎ…es=aþçb\ÜÙz´ÑJdµ€"¡T~/·MÍbÔ5µ_—ÿªød|‰¯i©%´,öü"ER•qÅ«Ëü1€h®vJ‰WW;ç, „&ɪ:É4MÓèGE"t­ ~&}%+OÉ ¥¥ÌòŸµK/¿&­_2ê7=`@sÆRQ2;nêÚüíïÜ®þùˇÏOOÎ1{—sÖ,8áóñ ¿èØ*ò÷¿üµiØy¾pqÔå€ FPÁŠ `¡uQn|]<°úÄâJ2"3›¯aÑQÉšò”’Äaê÷Çý ¼ a»Ýv]wuuu}}}uuµÙlV«•÷þ8å¶m»8¹Á13xFJélYµ­kÚ®Ùn·Û”®VyÓvë<€²+{ÙD P1 S`v£TÀáLmH€Ëj|Ø­6W«Í¦íÄ ¨ˆ… ³ŠH–œÔ!)cÉŠ—~GZœHÁ\ô›⋺Ãß>êõ,Wç«o©òe~™^àÊlM…ƒ*o”Ì|FXâ¨ÕCµ·:7kDµ¨#zU@à™L;ZÉSq– ]ê\x°Ë{Ö— k˜FUøâeÈ3¸Jçõ«)ªQk{.]d¿æg4·ã"ˆ/ªzyÛ–²_.–s.¥ô|zÌ9OCJ1'ÃøB>Ÿ¹°…/'ÁL ÅÍ\ÁPiðÒJ3Ùçþ¤ ÑrŸ(¢*ü,?¡lÔ¯^g¹™µÒ•à…_¬ZNDd†<)XwQýðôðØ´+GN@C×ÞßÞ]]]åi°gχc?Ó8bŒ <+›ê×^¶"hÌ Õ(œK) ã™p6(‰œ÷ˆh·ÛÜÞÞ¾{÷Î ûýþçŸþðáƒ[À|—ûdi|,U×·<àüêþv<Ú Æ$`N÷,”÷KÉ¡ª–ieœóË< &»/‡ã@è@Éâ3qʪHè¬ò­š˜u«Ë1ºÔÙÕÒ¢B~bö‹ÿ˜öÅ—†BôÁŽÙ±á]tŽW0‘CEÍŠ1ë0 Gv©óìÙ+’$M L¨IJ¥Ïׯ·c¹ôÑš¾$ß<\Þê‚‘˜=83[€ÿøñ¯a½í“îÍ‚1嘜Š%Ÿ‡þýÇè½ß¬·ß¿½u~Õ¾ÖÁ¾ ª F=?).1[¬ð} Gµy&U•²$“¨ˆdÕ˜sÌDÌÉx~~nšæéééññ±ô{è¼÷«û·ÝzÕm7¡m˜¼w®s¡ ¼Nq$GÂä8¥ûsJiÌÔ®ºm߯O§MÛìÚöj½Y…ö~³f¤@Ø8DV UtµKŒ=®Ì<\Æ2OªL  œƒÎ‡Ýf³íV«QAk` @“($I19PaG‚˜U-Ú‹ €O. äa!¶–²¯ÚÂ/þ¢—EÑ%èÕeYLQEEUæÈà¥J gÈѬ |ÓPAZUÿ̶6”†š½ØK˜ Œ áœ# "³Õ,:1“HžƒÒ/ œ¡¤©´x¥sŠ/óYϼ}Gwñ€ËágÉI┄ Ö Î€™k©f=—¬*¿¤´•R€q9/3m/¹Ê8·afDv.4MÌ9élZ?«ØÛUˆCåãB¢¥Ê+¥Ô÷=YˆÕBôËõ½ì±?j[ŠÔżQ’$%Ó4—†ÏÙúKYKU5•híûª³ ©ÐŸyOåˆHŠÖ7HTP”²ö‡#"»Î%•õz}÷æ¾m½—dMA³®€‰@‚¹°»æwòü‰ &Q«Ä¢S:Dô¾É9cDDP´6Sµ­µ‘Xgš£UÈРzöËIøS3ÿå{_‰\c(¨J‚JHÀ€/¯„,49/GÔé,^jܸ®¸¾R£ÓYÊÉŠÇbŒªPÈÕº‚eò{!”¤`DŒh¶HL˲0ÖókÐÐBÜL¤ Ã0T·ÊÙ“:ÃùØà0œYå€ì‘ö •0$€¨’QA 3ÀBU}1¾•®e‹3ßóo•Å ¹š­×”’8³»âÕú0%}zx<|þ ¤Ê(*IRŠÓøþãû««Ý,u¿ØM×ZãÛœ³¤¬"¨ ŒËÜÕüH6§’ɱÙIg‡OU“&UA@2Ù£ˆ0RôÞ秧犅fæÝ_ŸÖ›Íææ¦[m¼oÚÐ\­¶ën…a¡w¡ñãtÊSÌ¿>Ã8vcï÷OxÂõjµ[­·w­›¶½jÛµ÷Ψãòœ8G.3l=ÙQ%#{v]Ó¶Þyddc‰W@#àP«UµÆ±šŸ¶ãˆ`î›¶ˆê,g¯þPÏŒÎZá².ú›NðE¼ I‰*X, «&CÍõu¨ˆÄDžgœMSÏUUª:Œ`"©Ðwˆ!Vº®CRU1´”C‡ˆÄ ™=—R ðìð|>T]h8šŠkŸ¥Á…ó*/SÅ6·ìœd«‰"B¤•ú#g)e3€v–P$Kó¨Nµ ˆV2ã_ª%´Üÿöú\¼D*`¶š.ÌýSJƒÓ4 HÞ{ߴιC\ýxUEœ[ OÓTÏEá|>×Ǭ+®ª¾ÑaüOŽ£yÀ5%×þUM3¦8¦eÆâeЬã”LD(ÀØ0ð¨(†g·UEe LJQº b·Z]]]¹r”º%bNhÐtónÕ2ëe˜Ä·IžRšGðYcjÑYyÌáprÎ5M·êÖ!„ŸÞÛ V^¿ï¿ÿþþþ~¿ßŸÏgk±:¯ìÂw\Z!ðRƒþ{㲟f¾E˜Ù‚/=Kõð­K•ó‰[,u'~mØ^}èÊyΗ‘z˜mµE˜­&Glÿ›Ü"úŠá 3µãü7Q`(ý8í÷û‡‡‡Ãá0ʼn‰2fȘ’qfH2‘è‰Â*´Ûugç0$¤„šA‘2XqÕÿµPmŸùn¿úb¤¡I9Ç4ehZíÃ÷oßM19ÀqÿLÀÒ8(æ1=¤üÓO?©ê]oÂlí]A“£ˆd#RèǨ`ÌZO)5n‹ˆJ ªÖ“~†ópbtÖà 5¥˜3§*ÓpÖqŒÞŸ‚S&%\eõÞ_]=ÜÜÜX‚çx}}ww ­]³ ¡Ad¢8yŠâ·W,)OÃ8Æ}JÛÐt]·žT± Í›»ûww·7›°ràZô–p@ ò”² `Æ@ˆA œàßn›€ŽDÒ r8H²SMˆ'n“&Òn3pL“±›«¹œsa{e ìæê¶Y·–U=NÖbY,b H ÂHDŒŽÐ(P•^*û؈íxØ:€ºÒÑöS͵$UÌÖS‚PQã¹ DN$(PJ‚Èm»FeÇ.ÄÓŸ§ãºë6›Í$äÒ³(ç4k&5’%r®³Ûèš&¥4¤”RãsòmB`áõzíœÛï÷}ßW;/2qMÓ4šå|>kŒªÊ+OÞ¡€²saÝâ”sàÆD‰÷¾ëë‚(ˆ@ªÙtƒƒY¡y]&‹úöDrLCŸÇÁ‚Æú@ ADrR`p޹tŸ5Ù0¥j»OçuÔ÷½¤K>~ŒÓ†æÆ‚¨†MP•ÃqhBh}Hì!æíj}{{ûðøXí•WþJ´.O"*jUmIkÔ±ð'7Öé/„1§jý€!ÏEd̼ ,ù‚;“œêZ §m ’™T’€1#hÖ„äf{‰½#n€BT÷2Ûÿúúúéóíz»i|Øt›u·jºÎ…°íVÛõæŽÞIõþ|8N"2µ«$ú¯ø „Ð><~ýüñ~»~w{}³]íX²§@씹dXD48„\ˆR õ¸^uÆPêœëKV!DAa€lÁCPè ¨Ž™êã8nvk"Z¯¡mÛÀÁæíæêvµ[›(õ«,˜°PÊ´üyïzù¹Õ£3 Å ——É”W7V®ªËfÛv L3õ¢ÏꨅýÁ¥ž¾Û2MCÔÆ0âÒèàTçîìŽ""!³"L)žú³â|ôœs ¿ŸX>i}³;Õ 9¯€ŠD΢ãHd–æ²Ô(‚Ö”!_ŽÒœs–q’+b$"ê]ÌÉû0Jb×zswýýo@ó§‡÷¶î¶ÙBSNã)ºº êôÙ¯¦>ErΙÙäQaLšAu ó”gÎ’•ˆ2Åq+»)ö{6I"¢Y5«@z€a¿?6}ÐÃvûùêʪývÛín³]ovëín}µkWëUh\+aK7ϾÛÃ0ôç±_çB˜ÒÓ0üºø¹ ßnßÞÞ¼k›6ømhWέ›ÐzçØaUIÎJ­ˆ  Ð:^¯V]ÓƒªYÐR%¨‡LÀ ‰ØšP’Å[`aÊhiN¾×ö8MÓlºM¡ëºëÝÍj·¶!¤”N§Ó0 ¿qÆê!ùBÎ~#T²G/%-ÆKØW±Xß‚ˆŽ]ÎY]˜krrÎçó™¯V+OÌΩ¨Ä¹¼§ÏHÖ IDAT´{¾nÛL^Uqš´Ð[BŠDÔ¹€ˆmÛKŒq¿ß?==½øTŸ×¶\pÎ{/P€Á:gU ²“<—aÔ„«½ªbÀDR‘ï—]U·yA|ýJÓË6«T¨ :¸<,ͼ›Í äÄ”½×n™-X4· ¨éÌ®¹m•‚Í€Eþ+;GJ¦y”ÿXÔm™©ßõÛÙWúr_ÁBæ.çä[cù¡ˆhú^]ÔŒÁ‚Kܶ¨ÀÅ^„¯)z…ZÕÖç.kZ¹_f㦜ǚ2 ¢ý~¯ªÛí¶iš››3¾½÷ë¾{ÞÆsLQ´ð«QŽqi¿ÂKö[ó¹ŸíÀ†Þ¾}ûöíÛ}ÿ¸z><žŸŸ÷{Õ>*møhYúÝ#L‹äk5é¾jèü{s ‹Ø›+=¸´ÔÜWEõÒ²ÞÛòÌÚÜÚ®›ðKÓôk7 ¸\¥EŸ•JpYw ®@T0AΊ™1E“ÀJx<Ÿ¾:c²pÍížíy±fÁF]ö<2å,ŒÀ¤¨¨€VuÊÖõ qJÓ¤y’”sÖœ¢ŠCUH RÒ ‚ËQeëè/{—¦óÃþh5oˆˆnöæ‡ir˵_þœ ãÌ,¬ËJP¡°haMJ§q‡Ãñ|š¦iJ©ïÇóù „1Æ‘*$Ø¢9@*«`ŸTÓP•†-Øyè§ã!& Þ=¬ÚÍfµZ­6»Û7ßýps÷n½Ú°Ýz½¹Þùnu³Ýl×ë$òßþÙñx|¶ˆ1Gz<î[ï¶]{½^¿Ùí¾¿»ùñÍÛ»«k Õs’¤œDd»Z7>P锜s6&"“ˆ‚Hdn"˜Ë㪶‰¦Éü˜ÕjeT$ó âk?¬ÿoŒWg¿M½vÑ|/Cdv´ A+Þ§mæ2_³O+bY433dWÔ¹ü7¦qÉ9uís*—Gâb–ªV‡ êØjrÍ67¥2 ÃÍÍÕ§ýãÿü?ŽÇãÓç‡ý~>ž†aèO§¾ï}é莢‚B)çœÙ]ÊBdÑ´ýlÒ¶Þ¤y“„Uu°=¯5*7¿“ :šˆŒª¥Šl©€2 mš¶#c¸zWöúEVIœsÕg!œ-˜™VwÑÐÂj“,þß÷=3ÏÄ¢ ¼Þ—;äËQÍ#{1Ó×Iÿ/¹Ý—bºFÎ^m×?¨<°¼î‘–`îñ ®¨y/.ÿr_”é˲ˆˆeК¦1ÿkÇxiFTC­bÎEÄ{ol—›ÛÕíÍÝpš>z|ÿë¯çóqކxÀBF„‹Œï·æ¡NÚòéà‹s ð;}êë*ÿ…Ék“`þâ%NYõ|*`¥ån©ï5Ó¼ic\°ÒòúTxj1Vp@Y-ŸX—¦šA"’Æ©êæ\XÞTu½^R-û›Ÿa˜F³uŒz‘ãäœs£;ýWç'ÉÎY×:ö j˜t’Y29Öœ¬¢EÙÍQ¼šñéû¾†Ê%åýé\çÄ<òœ3 #ïÁ(†QVÝÆù7oïÿö×~Ççã¼#Ç1笢®N¨Ý«º²º5©Ô˜È^µ]a»ÞÜßÝ÷ÝwoÞ¼Ùn·!„OïÝï÷?¿ÿðéÓ§SŽS>‡sOhµˆhù›9þ 8×]ÙŠÙ\eÉÓ`Ïl‹L ’Ò”&Pßçéø¸ÿLÌV›?ÝÞw}ušnws}Û¿¹¾¹ ë®k:·ê|ó—OOOŸŸžÏý”’&ÑÌY ô™Î¹?LÇÓx˜$†®m6k¢‰0(“(’¿¾ºÚ¬VD$)ç)JÎj¨ÄDÈl@8,-:xQj4ÓÌR)3¯`+¸2-hE&—@D‹«ÄyûÖÐ/rß:­ÕX.«©[kÓvWmÛ6ÍLë˜RRÈY@Ts©âòœA3&´JJU5¯ÂÎêR¾ÃB¶J.Ù+­Á—†i©«î\_ﮯ¯¿{ó6ç|:?þüéǧ§§>àÐ1yDRvì¼÷¾Y¯àeW–úøTºž™+l÷ÓðJcÙmä”yÁQSÅœ=ZýK%Ø À¾ƒák˜™¨µ‹ÛÕªMC…ºÒ¶>ϹÅÙovìl’cžýx*t£¨Ì9[ñÆ8r*=ì®dn`þ[âû•6þF=kúF@u©ºþøx¥õë,]biö ³ÆµD’À{bbÕ4Í Ðj­Î2Jf§&ï!‹ˆÄq²ô¹–ˆŽq›h ÉràÙk¬'ùÙÕSÕÍíj³Ù\oy»¹Ún6ûýãóÓ'fbÔEûwg¿6`±ý.Sú{– –ôRå×m‰Å†ÖE GQúåu¾4Úì]&Ls-\üB[¿0h^Þdý j H)‡ye.Àb[Îw»˜Q5þ"Œ1/ÙXùÅ4ÕKÅ—lƒõñ) *¨… ]N'E@²öªY!#Í{o*­M8£èêa]–"buç@~µÙú©éÇ¡‡þä”cšRLI4??ïýÇOO«Îw«ÍÝ›û7OïnîîW›Íz»kWÝõ›«»®k˜7ýùéx8õgÍ“Æ]NŠ“R?á©?&‘õn»Þ]ù«Ö8¾ *F``ÏDΨxGèˆÙ‘#$R °.%4½ì/[…þõõõõõõn»«æ¤ˆ0ºçæ ¶´¦—EŸ¯†.¯öÜoŒå‹ëÊÖ„B%²@“EÂÍLž¦i¶ví‰XsζDnŽ`“CÇD§Þ:PA㼺×ýÌçpkšsªíl©õ(CµAD†aø´¼»»ûÛùá‡þñ÷ÿ8ŸÏÿóÏþôÓOÏ)FMÊè0+‚gšÐ4XŠúíìÁ©$k—Ð-ÓˆKUŠ%î¥$ªÓýÒ6µ !À\|Y§·&ù°^ÜVÙ¨Üô]1SÃ-m£à.´5­×khÛv·Û]__[ø®ïûóù¸ÕÐù#›áìŸåf[ŠËú—åøÝ}¸¼,¾tpµ¤-sÎ¥Eã$ðÞ{vÔœd&—¨ñg[Í!ª,Šƒ@‰EDR6KZ­†dë>ô¥eõòÀÖ咽û¾gr]X·m¸»»Ûn×Ï›–™úišÓm%´ûÛvI}ØW¶Èruþ¬Y³|¯–XåE‡WFª•SîóõfÐ’QjË0™PoøË…–b jJ$µîöj!ybXˆ#*t]2÷ŽY|€zrb<ì)bNõ½^°`ÖïY­ùL¹±‰Œ0‹CrÄ1'Aˆ9Ù1E`UI‚ #é…½d7lÛ0âþ|´¿ÛÍÏr[}?N’¡ŸFv“=Ê©kÛ›››(ù<,Ùú[¿PÀËQ÷ýÊ¥€%€¯®®îïïß½{wàþÍ­ñil®®?}zx|zzzÚ‡>õã8:b+<µ|jJiì!È8·ùâ;7—ôÉ£˜RŠÓ òÄœ} ÌšÇ4)ÃçO“oÂçÏ?~|¿»¾½¾½¹¿¿¿¾¾}~z¿ÚnWW·Íõ JŠ}?ˆÒ95‹ñ$ßßÞ^__ÃÓ´"n‘cÌ„fÜ?> §³ª®š·ÛÑ;Ì Uˆæ†QˆŠ$@3éÚb/–maÂׂ)%M:;ÇÀÊ`šæx<ö}ŸKÇøß>fË WÄâ×_, Q K¦X5ÓŒ*ÒKû 0…2£ÔÆ,JšoÀ¢ÇeŠ_$„t‘¢«÷CDF„RÝ(ûÃác„ï÷ûóለ7ÿ×õ?üÀFûÌ0C*)`ÌªŽˆyGZp0ÕǬi§´ ŒDʦ*°ê&W“ÖbÄÐéãyÂ’3gÔć _ á""Àœ¸CƝ\ÿ8]™I‚­ˆ›fÞl6ªÚuÝf³Ùn·9çÓé´Z­^9»¿« _ÉÐßÖ_¾ñËú÷0|¡uê©7û§b…L× Gðˆ§Ãó·îd)%`n{ž¥FA´Äðm ™‘ N¸^–™û¾·ò¤Õj¨h¤1OiÇÁ1o·[Æ<ŽÃ‡ÏŸ§‚(üêDýÁ)½¬È«5ú·”qÝUyÔ…^Š‚*꿼‚Åê9^Í£å ×7½Ö‚u¤”xÁoS)ß]·ºÜ ðÞ8Gç’UD*­¥ÎvΑ\>·>ÄRUv>J¦IT”JŽ’§¡† 2 ¡z4+‹P°e&%uJyBÄói˜²ì¶WªtîGAˆ0™ãzúI²SŸ@ašçš@€ÙˆH¼÷Þ;"!dfóuB©%íšÛ¶½½ºþîþîv³YãÜU2‘Û´¼»¹}·ZÇ8ôçŸ~ùù_¿üì===}þü9·Î ê$^SÂYÉ;"ÂD’)ÉÅšˆ3Ê3:rQð€H}çT'È(¬Ót|êOû÷ιÍfswwwuuµ»¿ûþûïÞ¾}ÚæžÝÍõöÂãá8@{<ó”=;"~œöÿwúŽw-œ60×uÃÇ~>¾ÆÏ›6<× QJ)AiÓFWƤ Bºu‹¾¹ŠV ;ÏŸùùùÓÇŠuª¯™¦™Ù§â#TU¾¼JKcTTÉõ<`iœsfljÈfÎë\( ¡©KP-M‰’žƒæÐ®üjÕ¶«ZÇŽÑSßš²) 9ƘrÊ’Á¡ç-¹Ö7Ó8ö® ö¯Ÿ?·«Õj½^7¡ÈU]À^µòñiÊSÌy²ŽÜmÛšâÏ3QTá$nÈå˜~ú×ÿ ân·kšf»Ý6íö×_eL")N>$Y`È‚ªI3-¨[–QûWvÙr1–©œ—ß3ÏÃÃÃöéé°ßïŸv»Ýj»]í®ºnÂýÇócÓsÿ<õ‰žÑýtÜÿcÀ!¢ª*aÖ4¥ñÇã1“'VÀ$*9c"*ðíYÛ¬Î||Õ™|sF"êÇÃl²•#dëÓ4«zJ—N›sâ^Zv°°ä¾0cáR*^þãÅø­Fq@Ó7!„64!D–,5x;g;p>¥°0{k( ‰ „à…úáÔ÷gó*ŒOcæœ+tW“UUçÜLÎŽbÛ×üeTª6ÄM)Ïgs¯cŒ.øŠw­ƒªö}?×ó9Oì(¦œsÖÄÕ£âB"ˆæðc5rÍCÒÍJD˜ÙnŠÿt_ÃÈ"r8þë¿þëýû÷ïÞ½« æšD;ªs`sFDK‡Ú OëƒØ£ ÁÌÕø"U' V|¡mÿÝù PÀ0 6±¶²\ˆYgZYû*6ÜeûÕ{XúËMh¿ÒËϽìO&bpdd¨ÈìÛ¦ÝlZú)@’|‡ÓÐ'0ÈhÌÉNÍÛ·oÿú׿ŽãøÓ?ÿe"ÏÌÐbÇù‹û©‚M0¥” × ¢.š ÄiSm%bXØåþ¯1pkãcæcî|U¡¾’c/þ¨ð›ˆ«¯_çåaŸ½hD´˜ÿÅ[ªAÄeצª jPÙ ©€­è@ߺª/ïa)êíUÍ ¢b¸èB@ jjpæú6’vI*ªHI²ˆóA†ô†ÅÒ_R¡0w2%fß6Íî žã`èÑ·³¹“sNÙÚŒF™F}s{§M)"V›@ta–¤%;'"Ã0ž†þöé*xͳS²‹nÜ̳ñì¼÷%„еk"g6uÛ4!8ESœZj˜€324Ú·ï®7ÛÍúêv³q"(4kL˜eb7€NˆÀ™¹£cÎîåÚÀž‚EÝr{Õ¥5yc|~~~x|züøñÓ¯¿ÜÞÞînïnß¼»{÷ÃæúzÝ®üµ÷ÔìŸúc?åQ"Œç¨QI’B²$“ä,éxxTÍÄ )Ëdõj…Ãò"mchÆéÕÃÂ’¨%NµTŸFNK‹dXýUIEËXøeYð VÉüåiDD‘TE-Jñbš˜=zâ Î:G’kqžå6°!-+ʱɈìyj]ðÈ€DÎOÇó4Æ8ÆèÇÑNòÅï¯(JãwÌcA×uKY€EOÔ"Ÿu†µÄÇD$Ž#( #¹¹y—`Ž/Dg® þç¨i(9ÂßYRœäöjE$Šˆ÷ÞHõÑ–¢’{B3äœ÷CãÓä(«Qõ9FE""GÄ@LìwÎ++‡à}H³ÏQ¸ZÈl“””H $¤À µ-¿{ëTdÀBÌšÅs:¤¢šbR…eÊ}1^™N¯^PÐÞJ‹º[UéÏS<ŸŸŸžÚ_?¬v¿Ü¿ýpÿîÝî/?¬×ëõýw-7ŸäóùxœÆ8ôã1 š$MQ“õ4Ê"Qt aÈb•¯"F½Æ9FX#DkLI qyø‹l¢©¸’K­LDLˆòò ¢-"¢GS±´¨"eÆbyÔ~y¯Ž™ÎÜϳ«% “$6MÓŬ{Ìqû¾¯øÉ:ùvåbŸÍ1«bYÎÊìW+îº,pªµªöÃÌxÀŠŠ䨓C#ŠMðbQ¯ê¥Uô‡¡ÿ«8èûþbõ™s¦Rz jFó¬_ÉSUÀ²@ÞS¢’3–‚ÍvÎEûá\é;j&,§ÑàxæìšÙ[Å“‹KÅdÎbó—sTÍDÀì/µ­Y2•µ) `f Ö”ÆæÜ{O)‰É>b½^Û¼Uü»ƒÙ´µ™nJˆ@DyL¨Š&§ª¨/àõËø*^ÅÞ÷à‰™gŒŽ™9;O¤hÁsÓµ›íö‡·ïŽçóñxÐrû_>ѺýåãûÃpB+z¼½¾Ù®7>"ªsä={ÇÎ1 )’æE“Zöެ7ÌûVJ“¹©?XêǪ3d),|&Ä‘Ù]rÌUR#â’‰s)y¿¥«ì¿üמּ\‹å©'"d®¦UµŠ° ê[êÑ® £Ê¥e|¨~Ðò5j,eÑÒ&É5DÏ@È9gL3|Äz ©H^ À¹íí.ç(8OD“#CËæœ—-%àDDIº¶k}Øív«Õ*´MÛµqAÛ§ØÎDð¬ªÈ:÷SÏ€Îkì ÈŒ9«ctà­"A¬³I'¹!@JÌ­_O÷·Óñyî·œÝlR¦¨4&C¤L™ÙV ƒzvTäkÀŠHY@E0"9j˜Â»Û; Þ;$ËÁŸôÔù€Yò,^/®Õ—‹÷j!_m‚º-táf'’Æþ¼ÏéééIùõ—Ÿßïnn|þßoß¾½»{Ó6Í›»»½s?|zxx8ç8×ÿ‰ d‚¤2ª¤s"¢ÆTDED‘xDT"Œ¯žÂ6J’¤ùX‰Á_´øòÀ|Âk૪ՋvÎÌ<À×ϬoP«†¤Ô5“¿ñÁ¶™ˆhÎ1çiJ}ߟÏg‹Ï!Ûè ›ºš‡ˆ(˜Uçž'uÏûÕj•KƒzSÃóë%rõŒŒ€™·Û-ØâÌöö¥¨gIÕzvˬWï…ÝBÒEH9ª=ä–$nzñé¥ôhbfÉ´l]¬9߯—Fxv)û¹mÛ¬3\†±Èë8½|tÉÊ/õAŽQ˜À9pŒ€sT<ß¶­3PØ0—☛²”¶uàC0%Süõñ«þ¨ .!ܺtÑ ¡²:Ø¿yù¬€‰³ÎArα/¦ëÕÕÕ{ÿðôxš†”óa8ÿüéÃ1OçÏOÃ86!t¡¹»¹½¹ºb…óñdsn*ª­Ví§åùÂeÊr‡Ô…–E1’µ$ïû>N/³ìÈ ) è"šmžô4M(ª)×î2'RÔ¯—Z{D«]œã@ªð'Û×¾{õÜÁ¢.n:~¥€—ƒ* da[¿rR/Súçí†*·«Ð°ïÔ…9»léhË?ÇsEŸ,Ͼ½ÑD—S숻¦‘.4†!DfŽ1Î=îJÜ4•1___oÚ®ña»Z»&cfˆ—[-j Ørùæi %RÊ“N ÖgQUH¬+b ŒÚTcê˜8@1»«õêÇwo ©‚ÈÌê¡ ¨$@ ˆYA”š¦›7½ÌŒâæ—P1=a·]ÛyÕÓПÎC”ÜNf‰qÔ”¼HÞÔ•^®·Êá¥I>p‰ å,¥™HØ\8EÄ,2¥qÊOý8=Åá—›ûüñǼ¿}³Yu˜â”ŽO1I–¤)‚f’„ybÈOÇuéÐ13êl|°_ÈPDÌVYŽ’¾ì‘Ù´«ùAæÞŽ˜³(Ñ”_uí×q¶ÅÌ™*»°P ªË(³Œ€Ò×¹Ëùp¾¬‡Ó‹ÛmÖÌÜÌx¨hÔ?ã÷Ç£›»ÂÕ7û¦‹2üe>xAñXLiAuÁ³:r „0 ª¡"ä¬sÓp"B rŒ®zËs[ÅAœêu‰H,ÅÓ"/6†íKìåX Žã¢tÓ%“J³Ù‰UÚç*Ï©b,©kM)s2eµZu]73¤¥ IDATG­KBÑjÌæ% ¯ŠªÉú_0“÷sãÅêI)Qĉ'fVÊÄ$mK„Ž2;"Z­ÚÍfãSÕ‘ç*S ì×Mhâã7E¢á\,– UòZ·Ð,B%ûnÿŠùB’°œäÞ¨½Šg‰ÏŠ¢ÖñFõRäoïb£æ÷ÁUäÁª»[¯ÎÓðññáÇqš>??Ç>÷cÂv»}÷îÝv»Mã4ž{vç<5>t]ãȂ֦LìÕ «óJ?ÕT-¹gnš&Æhò£Vö*dRq•v»î@³Bç ƒ¶ýƼúï·ú½ÿî¨ââÕÅ.”>®¸_¾·~‡r( 0l×"½¥®×ü³÷Y¯cǧZ®­cß”·]™PD\ÿ¼´íRJš3 ¢1G2ÛyuÈžœsîj½FÄ®ëZRJŒ1Š^¦º*àœ3g½Þ]­›ÖÍÍ„DrB‡d[ˆ€ˆÍJBUt—ÒJ&&PE"d„T#hß.sß„à3™•&ºjÚ»»7 æ= DѬ‚@DžÈ¡d%rÈ6}Žp¾:*H ` UDd$ÄUîß¾bü¼þô´?Oãj0„ÎRÒ”³mnP÷rá_훪«–©ÞX®PLDU ‰”qOïßžžÏçÓaú{{{s»m»¿Ó'Ú§4œ†<Ê5Ž,QF退3eNŒÈ–³Œe{U­9ë”tQÀ6ìöR>UPý søèe´ g·9‰ˆh¶‡mcÀ\s.åhâRÍ–ÇLR\þeyWæá©ˆÕØÄœ†~z: VjéÌWJ¤¡Ú×ÖœtÎ1© ’Êü¹Fõ7'êR*í.™PU$Æ¡Îaµ”½÷ã8Úu¤TŒ˜ì›†a ºlU…,)¥£VjÌ|)®ˆ0U¸Äjâ–ˆ´ð¿aq,LÈžKÎÕÈ03?==™gf“ Þû°¾AÌ")åI4ÛCy×,¥ƒˆªÍ°¨¢wÂl/#ï÷Þ¸ç‚÷ªêinMÓ—jæ¥áe ôÛ\þõÔÔðé()jΚUSž«i‡Ó¹ÎÌòHÊ·/%tÏÌÙya&PTQ&!fvì4 zâÆyçƒgç˜×ÛÍÍý]»Û„ÿù×/Þçã§œPµ[¯º¶[­V···žùÃÓÇãþÙ>È{¿j»¶mkÀ£ÞX=õûRQ邿¥5÷ˆª¢/™oUknn>Y}K=ƒ±Dï¸ðJ‚ëõä+˜!½éKÈâ©d»zÉL^GudE„^|XÈ-鿥ζ}þê³þÐ=}õaÚw.±±ˆ‘ãÐÎ /döÞ#“ˆp`‹ÒÏçÓéÔǬ0Ó"±"TI‘±g·nZ"Ún¶]Ó¦”HAUÇqŒxA½È‚ÿÇ´]­çQÊ"jyFA3ˆ,,¥J€š³u³‰rª™ L b`Ѭà`¦À¼xÀv5mÛSxïEAœ£µµ6²-¶œk-{MU33k%YÍ ¥?97ß v`rp&UÍ" ”ØùÆ»íõÕÝÝÝîêjõø¡‰ñÌÌHyaœ.-/XFäÅù¯·j¨N›ÊY=ÀØŸA4C`®T›.Žý‡÷||øñÇ¿üøãwwwãtçhŠ{•!%U¡¬à¼Ó9N•'M sl'ÆéÕî´õ–1¾2í_• ¹m)Üâ¯0–b"1\.™dö]\ἑ$ºœœúsšÆ¯*x†YÛ‰Hœ†œó”âÐOÇÓÉø@ÌÕ«!ÖTò¯ËㄈÇñ\vŠ9¦¹ÈŠñÂf´á†iZ_µ¬ñô"›4º@¾k©n.õ²º`i˜F?,CÝ?3Y@2¦S–H€DdÇñs{½@®ù`)Úš™ÿ?ÞÞ½I’¹sw‘¯ª~ÍtÏî©;’ug'éû™ô§ÌÈ£©g¦»ºùˆàîúÃ$2«ªgvµ+X[YuVdpøÛžRæªu7-ÉBO>Œãhë@DÃ0ìv;+ÒÕÒ‘ú ™ ®ª5É£ÝtQãèUUhJ—s–3 CßuªŠ’A}«+BjÖÂl_cˆWI¿Õþ‹)Yz‡±T.3×È9ÎßÐX*ý…´8lE$ABUE%UR RM*]7€*`pÞ“3Ÿí°Ý|úá‡í›Ûrš§(úâv»íBgγ”øþþþéé©ZÛÆÍ­Zº=kgSŽXKzéGiÅ’mJn àB.!³fÉÞûšš šRŒÊbbռʯkó,ñ?{¼(Sµòþ&™.WàÙ×Ïý¶[#õùý«ûýOõæUÀ›«€ê'¶—èP,/w Цy‰8+ ¡•æ£4—/!:@ÓpÎ .¬ˆóÙîc)êPÀäŒÔc+ÿ4¢ñÞûÓ˜mÇ‘œåòMŠ ²^Á,–ÒÖ%¦¤ÅUVÒìªhÏ©sdè‚sI:oñ*‹-gkD•T5·XÉëgÙ@.Ð8-¿|¹¿YíÖísŠ^J6©IeCÎC`@RVp€}× >b·Nód¥–‡£€j·ZÇ™#ŠPÆ•\P;åLd‡MTUÅ™ì·UB¢ûW:÷ÕÁè1Ž PéðøÇñpÿù§Ï¿üñ÷¿ÿývµþýwoW›þçþéñaI¢ã8\B10G€Í–_Æ%EfM)=>Dd(½G¤$piñ­‰ˆñ>ã¿Jh8ÇÃiGP²J›õv »7ùÄÌ–BœõKøQ늀Ī»cš´t¶1o-/‘™ã¹çw¦›-¥ârbfe[’œÆ—^"BaQT)uwv¿)Í@ Ñ2;T™ã²ØË£çe´wY­V1Í5ì½Zm pTÈçg>øÂÐÅλqÚ3ÇiBuÎøþ|œT•úB¿^yr³Â‰u`•i™×ƒSUsšYâúétÚ?>)Ë jÎêòÀºÜªÒ¹bt6a7p”™  *XxrVq䉑ËyCQÈ““Àž¢`K$±øÍ 5Z%¢”Ø{úÞ»ÀIãÂ}çX£±'*™›‰y¹L̬GePðVnç}×uC×9çXõçŸ ¡áÙë@BŽ€ˆ‚s}@Xæ8„9dáyIÓÌó’RêWÁ4FÞ;ׇ~臮ë„OãyÕw!@B7˜¬FE$òäYQDB×ÏÓ´˜>ÍYñÒè»ÎÒöCåÛFò¢‚jºBð¼¥¶í`Õ÷ùô}^ BDjø¢º£^Ú¤ïÕ5·µ¢Ú¾ ÔË®Ì ¤í<›Œ°rÎw¾[­‡ízÓ÷ýªÏmú¼sˆ€rN8xmž•E×£qE'å2„—"èÙáñb¹{I¸öeŠ‹5;çiÕ¯sðÊÖ¨ª#³“L¯V«YyY‹À-qC‰q®ª7A+u­k÷kQ–o ç‘@XAâ|ÿ•—y<<ÜŸöO¿ûÝïÖëáÍíîþë—ñ4[ˆôÅûüIõ4¸v©šŸP1‰àÒ9_®Ô`VhãzÂì¹>'_MÆd€ÉïÓé´?ì÷û,€™™•,¡·=¢1ƹ´ˆiïfg‰œŽ“ àš÷ÅahLµZåUÊb™]Iá‚f¶U¥’c40:Ml‚²:ÛÈØÎe#¨¼u+*ßADÔ,±Ä,oÍ^ÀæÇR,í“e}vÂíþÞûeÎMŠN§)ƒ3 Ö¾a¶\Æ×>}údÑâ¯_î¾~ýJDói¬Éh l1V$N jÇ)%ï}åLV#›Ýi©âTêÄŒcúi*ÍuA¤8öÍÕ\Ce•ž«Ê©|F·–|P<7é"Ç'Ï5…”R¢Hs\º”Ø‹¨&aCÆ÷½›Û·o¶›¤°?„ŒJ+?ô¾?NãÓaÜâ8±? “v–6M“½,ÕÀ楨|¿0 Š%Öfÿ¤@sØ•9Q³h‰’-`DS¶HŒrê¢Õó¥%¶ú|T¡r‰x}*ä”"pôÜúìŠí©tú !X>GËã«`«r±=žU¿ ¦À™ž$bM½Œµ¿6ãVÑ‘¨®;)u2å¤[ÞF*5÷,¨à<9 E >CÙøÍzØn77Ûõ0 Õ¥ïÑYâ/`Ái°Pf@krL‘¾™Ï\¨•€ÿ\1ó›Çµ†*ìç³EÅ$ÂIçe™çÅ¢#ˆøÁÕ «NE8^PƒsNÄ`€JT:ËýÌš‹²~ƒ¾1TTÑ9G¬‚*Ë4¦eŽãÈ)þîw¿»Ùno¶ÛùxT~Uã{m•U]ÿ·Âk4j Á+•À+ÑñÖ µÙä'«-ý¨¯&‰¥³)ï1¦q§iZR´þ36›VM6;lœ¦JØG“æ@ï0 à(+4`?;KTrÍTµÏ@ É9—âT5˜çl¥µxêë·üJn¶?^Ù‘«}’Ñ ×ȺK]kÁ¢/+Ì|ÖBÚG4Äì¢÷þt:õýhuÏQõx<îv;sœžN'[|tÔ÷ýwß}·]onnnîîîžî¦iŠšyOD9&•D€z:N§Ó¼Ýv]ç1ïNß÷Ûíööö¶ëº8"šñ­¸ˆi:`ѹ ëÖ:1S\êçP±v ¸%¿Fl\xn\DŒ Œªˆ¢côÑ£G}ä”T¢p䤉%±°zEï`ç®·êI‚›9Óñ$‰ÁŸ÷¶RÅU2¼=4ÇAõÒ ò|piX«ÅPƒ¢aK¡¤ ,s"§Mé5ÊR¥ ¼´ž*Ÿ `{ñJ¼L®l.¬éßhU("@Îa×ù®óóL12"Ô¼ª6š %K£õ—ذhL[»²UdÛaº•ÌsfNæ.-~…yž ˜iáý9Šù›RJq¶O–eI1‚ªUÜ;\‡Î÷}جúõzجûõz蜳76žªàHU²V» à–†[iråéùó„ËŸ1.›1”_럯¦«ª)%öVÈÓ<Ï1-,D¯t-£åw×`éU%‹9U]CUð`ã"P¸¾øg-“p´ôlËD$Mœ†Õj÷w»í:ë§ "öÒ ò–ÌcõN`ð'ß`-g¶ÝDÊ©HgŽmëa cQ¤a¬ƒH+i®øy=ÎÚxæ™9NsU#LuóH½±t;¯dI>ÈÙGv¬96×2”Û¾s¨VxaþY›àWU[U;ÞûÞmBpëU? ݪïB@ïÈ$@\§­¤Æ«F›jÀô,o¼,`~—«·ûkû ÏÅ£6©<Äì:(SÔbmÌ z—ÄÓ2ã<Žã<¯=¿Z Öº> t}H)˜é€ 4Rª~ÝNU«fþyJ y„œãÅ("Ê "¸ê!ÍÓ×Ï¿¨Èãýp윽1ेùÙ¬®æÿb#ñË?\¸ å™·G ¦Oýð‚’ê³ñ?Jô·žUf&B³~2ز°` k_›§66½?´Ø¾v+Sœç]Æ@îˆ4»Xµd9Ú•W¶"rÄaJhh†CTߨÊà™ç”’4`C˜›ü|ά¿~x&îkBγ£ÀbÀˆØ¹Î˜²×Môj—ó~i OªöašjSUëNaÉY›ãv½^o·Û¡ëuùô!Æx¿)É<-ól bQ”UÙª2¬’ÇìØ·ª§ÍfãœIÔSÉÿä‚gÒu]õÚÖÛ çyÖËÄ4S•ì„^‘k¥ùV#bÀx™hÚ‹ Rº©}Ó<{7>ö¡ÿúo?ÿû‡ß{ïq»]{ò€10,cz:Œw‡¯‡§SšØ=Òd2ÛlMVlyëß ˆñÕmE¸›4!›³5”ûΚ=šÉ)ŸÇÖmS ¬ø’®GuETÚ,{̓¨”(PÍ™JHŽLÒ`†3#a‘DD“C V]?…Ä ³pjpršòúú{} 3}ÁhõøªC_ɰv¨f\aË +¼)e{•±·²Àî– 1ÙâKJ°ïúõz= ÃàBè|ß÷wΪ‚‚ #QAIªrKã‚Æö÷ßìTnó_oø«ÿk12 |£^u’sÂcœ§xœÆi\"'6PÊ—†ˆ8Ê™¾uÛjð£†ÄܹFÛXˆÚÍv %™Î`=ê dx[Ó Ñ;¯”3ÀÇqœMgLŒ /ÃÙüêhEfþåOT¥ä¥ÒFlýW~Úò –‰-©6«…™9%™¦é9#ÉÖ­a›µd°•åÙ”jlØìÚ9å¼Ùú®ëº0˜£‰Uj•Z kÝŠ0fž&1Ëš\˜ê[N)%>cYg ErŽ’QQU,L`ØúœkYêñ†"™¨‘6"Pf6Hakï›aªà™zqÇÛýâR‰”,cÑRu¦i2×ôút,ÝV{“ÍœªvŽHAgddQå¨Êv‹÷Å}W«*ÀT%«Ê3Ò¹ŽÓ\ ¬sĺþ¼~VㆺÚËz}éqfd ˆrn#h-ÿ×u};½zó¾ÔËVW0\fôU¾l|ªj¸˜©ëŒA“w.øŽ;`E8©á¦·»õínMèïŸïÆq”¢DÏÓ”Fß³§wä;tÔþ­×yv®[­wÛÛ®ë(ñÄÌÖ-5„à\˜?OÇÓ¾vn°shA ;'Ò0Yµ>)KòHwfPÚ«u]7/VÒÆ5~ÿýi>>οœ¾ü2>~ÿá»ïÞ¾ñ½g9Ü}þׯŸÿ»È œæ AC“ "çª"G'êòA;{­„Ù{? ÁŽ‘‰¿üòï_¾’Ò‡aH(_¿¦”–eªÙHÎ"«&r²ª—T™aÎåF^T”@ Œ  *²Ú¶D+à Dt:O¡óF®DÄÌ ¢ê¯DšýŒ)%ë¹N.·¬\fQo Õ@NYÄŠý:B $ïºõj;KŠYb!’sžr—0At¼ŒoÞ¼‘ûer¨HÎÒ¦QeáÒ Ä‘c$TÁS±Ä,"¦¦f13tÎ#¡$N™ùiZº®{ÿæ½÷~>Žã¸Œ£5bJ¥û¯•—¬û¡R ­ ½•ÈE«P€µ2³üj{R“B IDATΈQ[«wÛ=Wë~»[[Ñ´ö: ͳª.Ër8 \0»:Ò˜ ´ažjLÀbIç¥kVš$‘금%™€Zn.óG´ñ†Öëua·ÛÙ/]×íú~Y–ãñøøøøððððð`ùJûñTºg?9³s("ЍDhJ, '(+Μ´bDÄe±|¨¾‡ Î]—–Ø÷ýíí­ Þüÿ¼é:Õ'lá‹ÍÛJÖŽ¶Î‘”Öp•fA6áãñ¨Š„9š{c¬‚wÎ-¶ .K¢Á€®ë‚óˆœÏÚ3@²¶†, €¢ ¹B]¦¥®yKÙ)‹ r„YeI .ã8î÷{f>ާ§ñøt:n¿~~šÃ0œ¦é—¯w§yJÂι@¹:¿yŽZzyl_ætÙTêê8?ÕKW/Æ¢êµTªpá²z>Ã×aýÛÖŠˆJô›¢®¼ð, ,©ØÈÉfî|Î )trfv+_ÚÿªvÝ 7}²z9±â›«ßb1ežg^8“kiºœ#ïœé[X-K]O.%eFÆóÞ£­®¢wLE³Ðå"@WécTE;D½ŠüÎ/akòëJÒÿ—់z#梜‡ýÕÎv­©‘§›a€œÿ}Ž‘”6^¦‹YJ›„Ó8GIdŸYDÌhL¤jL©éÄŒ¦ü÷•pË+ŸW”V{¡æÅÏ­TL‹(Á%¬ksLÚÏÕþ!Ö³ZºĬê¯v̶5VM¡=€WB·@k{]¿VîB-ër™/´ÒWDBRJÙ’í4›n¹œÀØúÓÓ“AU÷}o(Ç777«Õª¶ðÞ§(-¯©I^}RZâœf™¦ãQYbJi4áa¶ïñxÌQ[‰ÕjC vX2¯žíyüªaW¹ƒ[sî‹©ü±®¤\‹üe|| :$í|ð»›¡ë7«õn³}||œ¦éaJ¹iãñx<>Ì1u>(KµP“'g€ÀÌ,9[Ä‚Y¯Iƃ4qç¼IÖ¼,fŽ÷«Á Ù(¹™¼i<†>mÑ\ó؛۠³ »'U¦)/cÑBÖJ»Æ`•×a…ˆã2³ fIn¸Ô÷½¥j÷>‡0pI‚=Mª,¼àØäTÅ¢‚ÙúDHª’ÅežÇcbC8-ói™‡ýã/_Öë5‡9.&º:ç-KŽ-ÄKö6¹#R=¯‰¥ß2ZKºÚm߈éV øJÕ6»Ñg—´4ÛÁ?izJ@“Ì!ðòkÖ9×ÿšËJ$cûTJãáëþêªSÃFe/Š«zÕËó,sƒµn&Ô9?„®ë:4”º”¥¯Ñ­ˆ¤…çyÖ¤F3ö¬Þ‡®ë‰àì.WY®*¤¤ÓÈ1F¡5Ó›+ÇúÅ 2#+“*ã­Ö8@qåŠ,!„yž;G]ˆPD¯ØÆåèçP”™³*•þÀeÆöKvACvšÇ1m=9okPµ,e”"‚¨Î£•£T ¢’}¡ÒÀ)ÔÈe½ Ÿ=Ny¾¡–~c´¢ëòÀä~DP-·ã…_sµ÷©R³jµÏ•è_=ªJäž?›ŽOTÒ=ZÝ :VÌÈRXU5þ2 ¦¤Š *DÙ6ϳei©ªÕ­¾yóæöööíÛ·Öº¼ºš K§ú"ê̽‡4M§ñtŒqæSZ$ñ¨ÂÌs¹ŠÙÁ™f*Íä:<ÓETU@-~fI¼P‰œ÷fCטB¥Ûvƒ°˜,ÎaíÐ'’bœÄ{Úcý"Y&çjµê†`¼ÃR™öûý~¿ž¦é0H:Ž,‘ArI1W“‚ 'Mó„ˆ)%ö>*0óñx쟞l#ιèÛí–K5íÍÍ¥:›24Ž'3‹ˆs’Z!Uc¶õÉò¼å-Qßw›Íêíö-tÓ8Í3’Skè¶«õz½[oº®ë|Èø*€)3§u‘4/Ë4/S””ŽèÌeR*óRYÌPu¦•²hг9#ç89ïC‡Óž‚WÕív»VYÛ% §!Xó .äA_ê¸ÀWJíóÙœ^]¯ÊNUr$ëÏ’Áí¨Ó¨w¨ ‡ÝÖÒµêçÎ9+ @tVoVS¢ä¥ì_ll÷:*7þö´ÏÕzfÁ(8Ìâ¿ïºcœ3FpúX–%-¼,‹¦<çÁSç 2½÷žú¾ÞðòÉ@ÁìŸdDä´à¨ªÞ{ Rº…l:¡äz\]xc•Áª:ϳիuý-H²ä `çÜ_]·ÿ±ýx¾ÊgöWx7_YÀ1Ð{‡˜sÍò® Ö~O„`¼ÛŒ§+‡Œ­K*Y3ZóñòM*Mç9Á7µ]Âë «ü:kû‚ˆä!ºÊ©íšÚ °¥Ôö¹Ø”,W¹Û‰—„}3š nûˆª´RÜ袛ּƒBOõüh¶í:ç—RµB”iœPÑ©³•«ØÎf˜®V«ÝÍMß÷&€oooÍ ]{¡wa0wE`ñÈÄs’åp:<=>N§cZŽI$-ÛØ_FµîÓLE×É.(àÂtŽh@ñëVÿ 4uVùÑÅ-JŸÇ¼Ì—ËXæ¸,#"§Dˆ)FÃ]u½ðYn©j7ôÝÐ3g„a …ÊÂÿÜ}yêŸö¥™c%].ª”óE3¨î…exeÇ9Uµð³¹ ¦˜kÀLÓÝï÷Ç㑙߾}k2øãÇ)ů_îRÊËk¨%1Uí¨š«\LÃ5›Æ9ì»aµÚX1î4Ïûýþt:MqqH«~xÿöÛ7oÞ¿³Ûm6›õÛŸæÉð<.Çãñøt<<íÇqº`ª[Ýe£$0„ PU`Ë>ȉ¯ªš„½÷qY¦qDßwÀ,}×çEb"%4üR"QVSü+…¿xðã¨ûº;Us}ñúVÖ-†u¬¹3“Â¥Æü\š¾4ZØjE$@Qe…s¤’&ÂJl&€Ká_VÅj)–b‡öí®W+EK±ÎLúZ³ˆ.„¡ï»®³z`s‰ªeT "GY–l>P°Ê½÷!¸Î‡Ò®Æ¤¯5†S"%'DN)%f5ã-ûçÖN³$Ò«¡Â-CB½<ÅÛ77å53žàë›ò€ ¢±EAA1Š4D¾–ɰ7c ä¼wˆˆ*ç0m›)o©:†þScæÆ}$Åã’2§ˆ¥ÓYë÷°»´rî5 ®W‚Ñ…Ëè¬s¨UB‹¸´7ª¿½æãBlŒÝÕ1uMßÈjem½žIz;õâ+w´6£~È—9e•øÌ1’‚÷¹¤Çx« `çÜjµÚnwoß½3l^h³€ ÕAUWê•U,b9œŽ÷÷O÷û§ÇešÓšÅÇcâT-u$uI¯“ý7µ€X"5°ê…¶Ÿó<Û«šŸÖ¼,¶2ÁŸAߨ¶BB<÷"ÉÞ}𶦮V«Û7鸞 Wn…ˆsœò´=y]‡Þé[ï÷ÎlúÚ©>Ƽ“’3ÕEÀw9´=QŽ).ˢРzÛyR‹ãþIDLÞ›öóøøx:º®‘OŸ>©Ê}zûöíÍf; ƒ­äþødxã8î÷Çû»¯÷÷‡ÃáËãçaL±'ãà³2”REÐ̘Y0*ú"¬qôH(Š^Ô9 Á{O@’›’«"ªÓª`]É’×D ¼2¨ÌUþ ¯ãDºp3Š Í‘2‡¥X¦*„¯Ýíù\•~ ˜ xÁ.†vÔæ ³Z iØÖf»5¯ˆ6€]XÍ7\ñyõò¤3 r˜SCBq^ZUÆ1G‰1ƒñ“ä@˜• ¹‹›ð1pð; f O³r#³ý² x[ksZ”“+ÏoÊÌË’#_š‚9T5‡ÿÿÀRÊ<PP…ˆ@AD_ÀÕT³±Î¹3Áxý·üææ|ÎÞË"€aqœ§ib56ˆ×ÄX‘Á¯ÑÄ«¡á’X%·jÝm_Õ&»²Šüó}^òkiýñÓÞÊB€Œ¬~%€µ¹{+ž/E;Ÿ«)Ù#§ö¡W\©½²Fzì ØßÞÞ¾yó¦ïûÍf“!i†¡YM¡®zt.à™çišžNOÇÇýñé8yaY=Ç$‰%™+êü:µÌ©™ ¢è…C¢^ MÃ-gJ‰šlöúát^*ÕÀDdÞ8°€«é…Ã0ÆÜgÚ4’:)ïÎùq&lžg«'¶e©^>UEG˜+ @ FFŒ-d®™“2+€s.Ƙ„sàVxÇÝng:“ ãøùóg"úÝ÷ßÝÞÞ2§¯_îDäéa:–ãZ™u­ë[–¥ë"r.”h½˜}üÓÏ?û>m·›Íf³ÙÌãôþÍÛ¿ù›¿ù‡¿ÿû÷ïßüøñvw‚³&3|z÷^ó<ÏûÃÝ›»»/÷ûý>þ÷ %8Ï3Õ,ô9N(€ŽDU“ˆ*`¶ˆ)9´ŠtÑå4É!²Ä”úÞДTÕzIffV9ÇÕóãvuX_îÕëŸÿòâx~”Š ¬šý Ôû¾xÿVo•ì+y‰MUÕ2mxŸ[E™ÒÖÈ G๯t£ÁØ)ûÕ9_q\ W Îó9PÏ))–mj qãs*«Ì Ö „'ƒt@È*‘Sä¬+³ :ê·½zÐU¾­„ÑD{}ßìpÐà06+ÿ×>€Èî£DEBI˜œZî78"æ“ð ý¦?-s?úã!Þ~Ú¿{»ÞxDP"ÐÈŠè” PC×*«„àÞ½{sÿ¸ïÂÊ©'ÆAý"nœyIÌ‚P M_« ¬QÌl»¥·˜‡ò¹h÷¹"V­1gî¹ ÎßüÞ8[¦ßbñµTŸÙ¬6Nx9 O„$ûSUMyͤŸ”óÜê«(¨Cq¤ÚivÆ2xŸ…¢Ø=‘DØûι½W"ϬU«qÎ;"²ˆÒ’œKÎ÷1Æ´Äívûã?ªj×õ«ífµZm·ÛÓØ:&™_T• ÷Nçy¾¸û§ú§/?ÿÌ‘aå‡KÂZ–*°,!"ùgõ­+£†Ñ7—šËRºãéTu&3F±ÄóªW¿ë:ç=%æyš'ËÀŸ¦¥DFžœ›ýµd žªþQ!™ü~ˆ19"qºÐûàB0k8-QUÍÿ&*Ó” =¨¾ëÈ3s’IDAP²ÔCUÁý|<~>¹¯nÕõ›Õúðø°Ûnû¾ŸŽ§›››õzø»ø‡ûû¯?ýô“¢ûr÷Kš—jµ˜ '¢Õj‚5.MD‚³îòœHâôÇý—§Çû¿ýÛ¿ýÃØö«>þýøÿùúG‘Å;XùÔ €z‡3$ñÖa¸ÝöïnÖ·oÖ÷OLÓÏ_>;÷÷÷§iP³ÞQ' 8‘²SV!ïM÷óÞ«âQ@cBï§ÄNáf½ºžGžP!„àC"ã—‚™Í°«3UŠØ¾cS»h´áГ÷Þ‹—i:Ù×·7»*,ËbÍ1Æñx:ŠX X,MÕ’CéŒME:ЍŠsY¢êâ\P‘”X…¼÷3gó1acÖÈ‹Üʸ~cLˆèÈ!YÂÊ…P/žç3ÎY pzס‚9\P™@HØëEˆÂÐÏ)²Dýä”W¯–Z˜É`õÞ`‘,›šû¾ŸçXº®Cç”ÑyꆰVØuÝ›7oTU–e‡(Y{ßy,1¦yž‡aMK<…nÃ*ÎuQâc𽃠@Iƒ&%PV6œ,—R⸌ÇÃ/iÙm¶777«UðŽRae‡t{»éû!%>"iš¦¯_'tøæÃí÷ïß½½Ùx€%Åm× $G¾vH#"ë7ßê=WãÊ}rVe̵\äŒBF¿Î‚n¿S(h´!‚ o§ˆ$ÓÔSJ">#‹#"Š\„„¡€"yã¹,’TTP”¬EB¶Qª)Mù/6ý>Ñ ùŸ¯¾âƒ¾Ò›ß¼¦þRÏóó;¿v¸Æ­.yæì—_¯ïxõjí~=×IÛ#÷âkJW3©¿ÔHpèç\ßýzeN‹:,Ç®¯ºVÔ;ŽãýýýÃÃÃ8Ž¢‰™%±HNq—Ò›Lš"«ìøÓý[&{µÎÐ8ͪV[ “êC«d‚K×´Þ_ãÅÛe‚ÆKš›æÔ³s·+Däp:Ú<9ÎÅ`±jFa{ŸÌ‹;J)©ÌŠ@äœOª…—CïÜØ÷ÓzŽSǹ뺛i9Ûíz·Ý¾yó¦Crï¿Ü™Ék«ÔVÕg×sg@X¦Ù:žžžæwóÛíÍjµêCÇ1õïï‘HIÀ²ã‘lV«÷úÖr;nooCè¼÷ †ÁtšŠ0ã’†êj*Ê­%±ÒØù"8«veRj³ÛµOu7í“*€Û}¿’ŽXŠjž‹j¬È¦Ö] ìæjµŸkÀl[±$.)¶ÔX<¡#"["kcxF¡ºzô_pTŽm77ÇlŃK&__ܨºò‡Ú¦Îص%N×i×ÐO½U*/³­T@UÝ¢ÚâϹV;ZITý[ªJ~ àˆR’Õ:ÔزDûJñÑ@`VcA@1û‡ì[ù]D§q™¦e^­ÔQJÂ^EЀ’f1†‚9 ìµÐ§Š*  /AIY1q´¯JÎ&Vƒç„†¡Wú rW2¸ J 9)\4±Ì‰çœú8œ»2 "¨œ«ÃTr1ÒzÕõ½ „ÑYf$¡#SZÜ ¸‡DT­Æö²oïqKˆÏoûüš–8ª0kiúâà5u„Wz.wÀ0¡¾!HÚi¨ªCj/¸b.í•õtµ×K©ÆfØmª Ú¾k¹ «ÕÚ÷1áºÚãȤ—éÅVVôððp8ìçápP0 Pe(^âš|[g•ù“a·¯­¾o=´\Z§©jÛØ§¾£ˆT×åÕR/}_ýÏÚ¨2®T3Y*CgÎ1W× ˆœÝÚì3kÊ9ÿ*ô?Û4lÚI€çª³G˜Y’"bô.ÍI¢¤(Ó’º®;N]×Ýì6üÝwÞ½Ûl6Ÿ>}:ÿï]ÿððpoLª]sï½+9öÆ%sÞáj³îB§ùáëýÚw·«ÝÝúîýfóþýÛa3 @bqš«E=!(8kƒ‡€ÎùÝÍn³Ý½¹½¹¹!r"’¢½Tò0GI,UÑlRôÀ‡ÎJÑÖÃêvwssscDØoÖ¶¶uýérà¥c¶ý°ž Ó½ÚQ’IVKèÕF±^¯;Xµ‚,Ñ/49w5ÀYžŒ­në; Ñÿ²2¸ E))™ùAôc¬<¤"ÅšdbfG®~^ÃLÐhðí³°¤­Õ|O*í˜ ô£>Å{¿Ñߦ1o¤A|Nž˜S\,ÿ7ZDÆÇ.¹Ô¯[¤™E2Z–Rþ¼î£]é}cJQ—¨FÚ,ˆèT/8C%­+æjþÏ×Ùø¢>˜K|× —×¶U_ê ­y[ɹãhìØQý6m“ÁP¤/6x†n5t¢~éÜâI¢ò9äi”Zw `!AM‘…Ü»?ù^£ê‡°ÔË^Ù-ó½Z¢vWêÙkÓÅÑ*½¯nøüqùɓ <’]í/\y)­ÛûcƒÞP);Ûme‡l“}Fó<÷C†¸Â¦SÊ™“2p•¡U˜Ü½»»3ä û\Á`œñœ?ÿ<õý•}ú•¡òtµ/6êjèKA¬óÖ<ó.ØHšSõ¼Vš²;·Þ¤ÓŠÿ føÛ0i-ä˜Y]ÀÖ°™µ2Žsh„™5‰ ˆtˆ¨ ‚cÄy€%Åù¨«Õ ”•å¸ß¯×ëõ0|øða†»»»—/_¬ãB}5ç\:°Æ›ÂÍnøýï¿Þl-WëË—/^²¬Þl·ä€Ø9‡DæuÊ z@AÁ#8" >|˜çåxgZ‡)9FÞûyaI‘Å;Xel|®•l^۲…àå¿ –E†à¹áÉå÷±¶Õ|N¾gN§¥ÆßÐê}LI2ƒ­ÎD‹Ò½Z­†.ôC7;?tþäi^Ôšõ¶‚¤U:ž¿*6yO­Kêl.c·¯]v±h/µm5Y¼4g¯¨M/Ù=¢…¶/ò)žËé–¼¸£¹Z–«Gãe¶Q«ZŠÈç”’±‰ªÿÖÔ*Kaíº®ëzkGoÕ„­òh‡a𦇇‡¯_¿ÞÝÝ}þüÙ³Æq¼^ÀWæ|~åß²Êh÷¨.`Ý;.Í‘¸‰¯¾’{Œ\òJ,!ú!žGîìf PgëÌ)m úä²¥«Ù!/˜€+ûl›:g'kA6û˜ŢݧeAçÖ]P^¦ùééñf»}÷îÝííîíÛ·«6IlÑ£%ax#¿Z­v»›Õjõ‡OþËý_?~üôÓO?ýÛ¿üÛñp8NÇýþóO?xûîÇ«ÁÔ̱²0ž. €Š `†ß}:¦q‰1ÎsLK<‰ bÀÁÉ gÈÁXlÊjÙzFÎëMÝ]•²Ôx_ín’ûZþP¹‡ àjYîš º ]*})¨8ðsz¢”’ñAåsëÀ‹:þ«ƒÙ¾ò_PúBCáWÜ þµå¨Ø88ë¢Ñe™\¤6°*ퟰ„*»UÇY¹]öß­OùÆ+hc¿Béó-L¥}ê$"VQMD ¶½³ñ1U5,{6jδ£+›§ÕÓŽ]°˜8­×Ã:X[œuA^ž|‘P®·5ÏŒj%ZªÂ ªâÍ] @S” Ähàz ˜cùSâeIv¼ó­Êk“5ƒEÿrŽú¾ú~ð]Bï“'瑈UÓUrcu½>ƒ…s‰ÜúN¯æ|5®þôep½¸ÕHêw«ê'%;.E/"V|+.ån­òŽˆPÓ¿ÛÃpåú¸¢¼ö¿W‡§~Ýf˜+qÁ@÷0 ›Íf½Þl6+¸âYvj×-¹ë§ÓéþþþîîîË—/fl‰Ì]Ìð¬>çDù¿}._¼}ÇçIå8ÍFP5ˆŸ¯Òyøü§ª&#¢6¤í[—_ªë¨’Ë”LZ¬qm-Í EDc^ ›>'ˆÂʬ‰AQE$ Çd¾„õz™çy:m6›Ýf=yxÚKŠ7onsïß¿·f¶;OOO¦c!b×u!ô›ÍæíÛ·ïÞ½ûÇÿñ?þ×ÿò¿|úýïÿøÇ?:uü×ã)===†þp8#âÖ˜œ—«€1™%, ÀÊÝf³ùøÝ÷‡ýi¿ß?<<õ}ÏKODU«¨¸P=µ¬gç}pŽ”9Îót:-Ö*±Õ½_÷¥ê—í飦جRZý¼’ŠYZÕN’™™ŠÄŠ1êéT ÜÖÔ«Þ9­7‡2«-owá’y>Û?‰}cTÿ|뵪.è–Ôá’¡µ1{@µX¢`8V"*J–úi7E̸“¨ öV5ëÔËÊɇ¯=T b¥ fŸ3³Î2k¢´çQKJD¬©¸•2ãjQbÌɑҒÒ2ÅŧÎNÓ䂎Z·olAYIÃt¬¦6œIëª\4choýMˆ,$êUYÄq¸è2³Å€™Jzâù¬ Â:÷~·ÖC·òÝâbO¾C<õŽ^ì5ˆ—Ž iRx®OtÔ¯ IDAT·~¾:×2øŠw?ÿk“õ×#ÔÞá¹Ìn"x&Ä–e– J+žëwÛ×ü¶ÇâêþúlÔÔ ›jðÝz½^¯·ëõz·Û­×ÛÝncfS×—Î }6‹k;<)•?1Ƈ‡‡ÏŸ?ßÝÝ=>>î÷ûišª2T[oÖÅÆKG‹ þÛ>s6\-{ýo}ýJWŒ eŽö I®Òl ±g#U*æ_NH)¾VËÆ©6¨qÀ½2“ÝÜY% ( zGìJé “ˆJRs5t'UŽi»i™ ¯{³ÙX"«õ™µjýðÚl6ß}÷Ý?þøŸÿçÿôã?¾½}óq&…ŸÿÓ8-óÃþéËý×$°:….ø U+ ÈŒè _CÁÀ¾”Qèöööûï¿¿»»ûüùî¸:ò2#bÒì'¤¨Þè ÖŠˆŽLÖ£²¤%Îã”eƒ®iL[)¹=2í‡/úð° ÊU#»*d³·L OdE;ã8Ê<Õ³“JoǾïÝCxT°Ml9Ö.gY2Õ9$&¾ˆÕUú’4Q©çE1\g[Ó,_WÔÿÃЮ@œíf·¾©6ÝôâÎxqöθⷕeÿÆÜªi§„¨n±Ÿ|™ÈV)Û¨jèë-¸Ùlv»Ýf³[­rªs膜CÑD´8bEÖâ»ûùçŸ?þüôôdÝÝ-3Řű ÐBÏiìÅþã7ò¯Ênä2m¤ä=_It¦ÃkÄ$©Úí–UµãìÌ´^¾Ä ‹ÎçÓ]¸þêÓ‡aâ̆ͩD€ƒ÷þÈÑ8ŠÅG@tž&rÎ#Œã¸ÄùŽ777··;ÖìYµêíÚúðááiGÂìùX­V···?~üôéÓf³ ·ÛÝßüø£&–™¿üôó²,O‡ýýÃwê†Èï‘”…U@QXÕ‘BXwý»·oß¾}»ÛíŽÇãt<¨ªçd\ÞôUÑêÚÃF^Z¡8"Ö¾¶ÈñÈ1iyÔÐF ­‡ž àº_\ÀÔÌ¥Ùu‚Å ­7«ÄyY$Ç «Ëºï{"šµ|’’$)±ÆÂ ;¼æ«-ñüG]¨–Õ "ë9tru@°pó™ ʺ”ÎHg”òvíT5%!ô¡«yšÙ” NîǂÀõâüµ4ÐËÞI&fv.x¼ï„ó¡ã¯äBåÉVX!"Ðô eiÚ ”ˆÌ óbÕh>"Nûnè§q¼JúÃâE{qþ-oo?a)Ùò’+EMíóÃ0¼x£ ` luDæ@ZõpšðȰîÂHKDÜÏñq^pè{kB’ÒBÔ¡Ë{žUïâ‡ûÇÃãýÃt:¬{ŠCàÙCèSt>Á’’Fí0äDÎØ°•ŒZÚ²:Z"rv2KõÖ•Yœ‘Ð0rIØ&@dšÖ9«ªÌ-L(9"Gà%úÎ?Ÿm˜)þÔ Ú´záÕÅE±À³W§n00*’óÊ’$‘B 1¢ÓÈ¢IY¥wCê;¿º. Ê²ÌGBNn½à¢ ÊÊ3w4¬º>viš¦yYX„Eöûý/¿ürÿõëO†¼¡‰ ¤wJ¡¢ÆÈ"BÎ ˆ"`çº×¤æoäDU‚ú-ÕÍ•³`–Ì 4Yd"¥EUÍ7”æÙºÕ&–ï\+h€UT”¡ kö™å¢"Ç´LÜnŠªºÐ‘µ[ DP´A‰Wëy‡•ÝDšd¿鎠EÉE·Ä@ÈÓ<Ê KŸÀûDØÏãižNó´OÛív·Û}÷éã»ï>üÓÿóG:ì§iŠˆêõývóßüßþð·ÿé¿óŽd™oBÿý÷?|êwŸvoÿ÷ÿãÿ|_æQî98y onu{«ÛM70ovkG..‚€Y½Ã•ÎŒ~8%Ž Ãf»¹Ù„¯†~â¸('è¼å˜P5©!Ü‚óˆ‚ ÁÍóH”=n³V‹C•1¥iÏ• %Ê–“—JVp”ìyn5Z" ªwLKZÒ UЫª‚(©#Ä4ÅÇéáàÎ ¥=Èf²žR"ïÐë"ÁwÛÕj·î7Û:õ>§Û!€ÀÌDP^«0ºœùf:Óл‚pkVæ¸8Y?MhLæRÒþ5ƒ¨OÓ4t½0v änv]ßÍ’Õw£ÅD dÊ•ÆtÄ)x¯" ì3ø‹àõäW]? CßõŽÈÄ8€¯9‰]×m6fDZâX=r¶DÃeãB(E}B{R9Ÿ—«¤ÎÊ8ñ™á;°~"Ò;ß÷½'‡ˆã8JL'^ï6ëõzž8Å'†a»Þh"¯äÐnHD¨Iª$njªÐ%VMÕÿ‘§dùÿ­ü¶LÕ—“• ŠùAÏXXFçœJNxù&ƒ C×]ßßûÐû`ºMpž‹8çE’“ ¢p#3D(âKõ À¡n[œÂV Ë!¯ÍàÌôÀê¢Cpª¨*(xŽ´ô›‚äŠ&Zðj¼†öš<ª½>è¹èªŸˆˆªXM„܇9tÞeH²­1Õµ]†! Þ{òN–ôp<˜ ­EGfõ‡œ8j^D=¿»A©Ø\½¿(¨ýíãbÍË[«ª\úáëŸZE»ý<±qæU<óýæ¶•©]­v£ÿ¾<ÏìY}f°.IÝ9¤œkBýßšb˨Š<Õ–ó ¨ ¢çC´•Üq]™Q ÍKºaXâÂ) ‚ó®[¯‘ÿá‡6O›Çý“Ìq=¬ß¼yóý÷ßÿý÷Þ9Äõçaµê7›ÍÍÍÍ—ãƒÎ§ýÁ‡Î*p‚—~ج:.Pò¹I\ ƒsÛ~µ[ov«õzXy¿¯‰iˆh¡;*àW4\÷Î<.–#c‚m>ò©%]æ…²kZ\oÒŒ«iõ¢vÎ"Aqg”¤\Áõz µZL‹iØz® î–€ŸÿlD„¿PßoX–ªÿ/soÚ$Éœ º;Žˆ<êèn²Éáhf^Ùk2“Él×ößëoìgi_ÍP<†ìâà¾@"³ªzØ-ŽF0Z3+328üöÇs-l W×÷Ûéegrð[pÕ <^ܳn–zYj7Ò*ÏÏ|™qýÒü¯T(¬=Ö "ÕŸE{Ûón©¨.òÕQºÚ(Â~Y¯è9µ2Xqr@Œ±ÖZS63Ù«½ÎòÏ3ÁFc‰»`À‰˜OÀºpéKÌd Z.cH5tcÍËfÍÚ»Û®»Yõ›®­ŸœïgÇ‹K)pµ(êDÕn9Ì )ãøC.q¹xer©ƒ1Xs¸(=ÏAÑdjQ 8Ç¥"`K e^†²k—¾N _àÜ(/˜Ғ걩^‘ÚÕµ#¡€DƒdÈY§M1V«ÍjµY­Vzx¼÷ÛÕMß÷«ÕÚw½µƒÄe §ãqžçaŽÇãétÚï÷šX«e¦È*:Î’c²¤”™êûȺ=Ô´õm¿^×_ŸšÏe ‡PŠã=ñÕù*BÓžÞʉb¼H³ª×¼¤AÔ˜ÌÕÙƒ”„(q^¦iù]ŒÞ?• 1`ÖQzëDDŒmHDr9>kb1@H“ŒaYh²}ß«¶¤Ù‘"Ò÷ýz½¢{ãœóòjsóÛøÝo÷»¯¾úÚ “PL,‚ëÜz»ÙÞnÌ;Ч=e¾š„cˆ³í^%CPŽUÁ2¢‰'¿[m6«õª[wÖ9sQ†ÐÂ9SáŠTRÎó¬<]ÊCRbVv\ À¨•veA“6qŽ#”Ä«ì…. Õˆ†©÷ÌÀ)%N/°¥ÙW‘½Â©å¹Z煮­£H5S¯9Gê2µü·à&«¼ŠÞºPõ)Œ1̱&!󓌇§›U¥ïU`¥J\lðK‡Êy¯+cŒÑÛ®ÐÖ ·‚MÉ'¥%7Â%Sl/ $£.hB¡‚¨(™Hãuà&m­>`ß÷š?M ˜™+ÑÕšP‘èWóŒes¤ã³-àʆòHVÞCÌaà$¬Lq/±\opå»m¿Úøþèzo§ÎõѦZ¸Í ‚aŒhèœÁÛJDÄ ý±¾ÖBr"¢FñÂÒÞî’ôÔ#¨ÔƒB¢ùáˆtEçö×6JîG®ùwzñú:ÁBš"¬ ïe¢°Ò…tdº¾ïúÞwuÎ:ç»Nuص_9×9c @1¦BÒÞWÃpÚíTúÆ  !ƒ ’²ÒFß÷Ú2oÇyžD¬­ù0æœpÐʶ«5h&¹ÐæÆVyn»{UÖ jÞÉÎä'{Ç%á·Ä? C ”P~ ¬i/‰R®¹!ÀP<¢WÔÄù[ßûŽ?/HÊ™·‰²W"säT0Æ5uNa³ÙXŽ}ßßßß“À·÷¿ùÍoîîîÈ’¶0ƒ)2cÑõÎ÷~ÇañDÆ!à´Û%%‡F' ”„D KB2Æ Gè uÆÚŒÁ`s>ª.‘ö‹«Þ¬‹Õ&D@ dâÍ'OTóó«ßØ"&¢œ“ÜZ´p)€ë^?e¸\ 屆“ÄÀRN«yû….”JÑ-–’H|2”ù¨~p–@——¿v,øzÔcru”ª=Ê%+Býº•Òø2³ ž ׌ô"p±W_ù«&¢jlÖ7Wèôæ0iÁR+ hZØ„·uœ"¢€1d­1–Š\¬¡kõ®V«Uç×ëu×!¤tæ]ÆäÓ·èL˪êF­;"$æœ×öÉ8Ƙl2…Ê̘-Ä9$fŽB"€ Lð<Ã5½·ë^cºïŒ ^%B ²›‰Œþ\BLTiè¢WR}mKò‹¹Àd‹O¯Ñø@ðÌÚ4N.À茫‰V3ú›«n•¡\"Ú\‰¸4‘ÕÆ0@¤@ÿÄH`l×­º®w®SÇ»µÞ¹®ÖíÅÈI2ŒYB˜¦)-!ÎË<ŒÃáxxÜGeI]oˆHc*œR"²Ö®|·½¹¹½½õÞ;k1TBÙ/ýôq_XØ+\Ÿ·uö¢¦›ŒÝsu9{ {Â(G•­Ôø±â Ö¥k³?>cTn…ˆÈ9˵áIµ{2„*gNdr)àÕ²ðµÁTÓ “:„ Æi4͘eY‚>"!RqƒÔùÕíê¦ïû/î^ÝÜÞ[×…ÞR†ab¶D+ç;ç‡aXƉ²`dˆéõý«#“AÖ€Mqɰ>¡É>sÔ, «úp&KåW†V<—Ô\,9S°HP¡V‡"jÞÏ•KY_Ô²œzØSJ(ÅX¤,f€D˜$©å#cœDÔ”‚âr»t´ÔMoÅ.4öß•ÀËMÿoW^ß+¹(OF=­mWšE¦æ#î¥öþŸ­þœJAMÝnVO9œFB ÌàRY]h8¼)¸°ªœ%mN#  C±™ÙÎv½sΑ"Ûk1€R&!È]aëCÁ™ Zð¬ÖR'@Fí2H‚$Ÿ,€³WŒËsÌÏäîFhlµHñé `­Q¿_­ºeñÓlC°”ÄE1(Æ€5È)˜ P,DƒMÙ@…¼ºÚçVú¦É©XÕ‚بEU0G97ZH)G³EÄ9¯yµüæŠø®ëÊù„X¯Ç'FE¯³e‚ÒtT@ (Ôˆ`‰ !!2Æ:g¬5ÎZï¬wÆY²Æ8kœECè¼±´!"İÌÓx<í‡a8wûÃã0—0ÖA’1ÚÇPAX´ÝäúöfµZ©k­å±AªûÔG¦K D4\UßaddäXÃw—_7¬æyjO_j’>j‹ë#â5®K¹çó°¶ פ^€³A“ï¡iµ©@ºK¦[Îó™<9¸ Kç§(îVºôvŠdt U+ "ƒœÁ%ˆhG•O rŸ+-øöÞ“³d! Xã €\9Ó¯n67Ë´Ä%¢` ) s lÇ™— Æ·Ý;µÉ N®Ç8%hŒäÖʇÃa·ÝO§iº1ØGh_LvжH÷}ç:o;o¼³72G IØ‚Dƒˆõ@"¥ ãyý=œҦŒJ 5"r« ‡IÅ'¢”¥oš³ÃÌg(nL*ptˆ(íÞÓª<ú/½”ø÷‰'°U<ÛcÀræ/_  Tß…í¼ë¼uÁZg;ïzïzk<¡‘ÕŽQ˜Sˆ‡Ý~÷þÝ0œÆqOC\°8c{ßyïW«Þ£MÚ9D"êû~³Z³%Í2Ð,Ê£.u JÜŽ5÷æ0·Kš"?s §ðTpbÎiðf³ùòË7º5!„ý~ÏÌj‡¤Ðr®ìKû»íl±¤µX\g3´S½‚ª¯·šâR/ný7X ‹ÑˆˆÖ6*•ö¸´jN)šiÆqœÇéx<þôÓOÐr¾úú5"öÖõÎJ`æ€,VpÓo¶ý0ù9ÆH’ –(§¤,•ÝaFA sôH£¿yæÌIXý䤞‘«½nÓ…1²Â|Úìé.î>.(T-ÙP‰þ%”¦±Dfa a^–h­Íi ¬UE‡ð™Ä«K ŸÏþî¯(†_º•À5Gª«Ú~— \vN³¥/'ÄÐ^¯/qYSzÈJûð%êÿñ¨£êöéO;ÃDÙýË,šôO /“9ê/ÖÃb­uCÊh Îd“WAvPݱÖZ…4Æ @JgºBDd£#‚‚tÿ8£‘BCÃ"BÔ`^!Vºµ/Åä^^¡CPNÊ€dÝC‡}äiž‡y™’ s¨^ñ à{w»ÝÞo7Ã0Ä$sŠ¬Ø§è&ãš %ßÍa™ç9fæœE† ˆb´4hN"Ǿï "v«µÎÓùU·òšY·êÖÞ{‹¹”í|Œqš 0ó4 Ó0Ž h6é0 @D!Å{ÒM ¢7–°"\rZƒXÓ ¥‰²è댑Týö¼‘@çìÜs!y5DDcŸ©@×é"0ˆȈ5âœé¼[ùUo¼w}¿½»S_qÙÇ1ňÌ).ÇÃîÝ»Ÿö»ý‡Ò²,$¼öÆ9g ‘°­ÙÎ!ØÎ«ùkœë$Ä9 “³d &^¦¹ j^$kàG õy[µFó+6¼€0ƒšú¢¼›hqÛ^at×ú•ÛlnRJ»ÝNwÇûÞZ? Ç–UÕÙ ø¤H""´ÅoÊyë¢é˜¢Ûêù2*­j´T…M.&æ'>ØöÀW9͹0œ8qDðÖ1hÖ±ACÄ6Mժ˩OZH‘y(/Óxüðá½O0Œ5ÝʧGÚOóÝjuÓ¯·}oûŽ™¿øÝ×¼ßm¶¾ïýpœE$…©ëmÿÊûM'$Á0XË1¢66&Ë(ÐLÁŸŽa8î‡áqI BZ_’#3pLHÒn+@ÛΩ™ œê.÷zÞYY)ð…µç~Àí®Õúà³óYÁý3p="ë]¿^ݬ^ï÷û8Ï$ÎC\R@9Ý–ÙQç³K!kêà¬óÞÇçyZ¯¶™I2“!Ž!.3ÁÖ«i¡Ö!3§(" "Dcmæ#³ ò c "HŠ•Œ¥ÀoÕ6!OGJ‚ˆªµ†$Kd2]o .ËT4`-ð¦rš‡8ÇID˜·Û­ž÷z~§iZõN0O Xk×ëÞÙŽÐZ"±FÐX$GŒef«»Z j#€u®ê©í1… ’!pš× bD EHaIa™çÐloî–ÃD7¬V+ïµï2XGÖ¢÷>"D`f¾»»ëûuX"y†¡ëVƴ֧ă°E@Ž"’A¬5ܤV VÕÀTåh`†a±Ö2ÇÛu’,K$úô2¤V*TÖÀÌÂB˜ÇiÆÐ{¯do>ÆU‰¨ëº›››»y ˆ#Ç(ÒacT 4e‚m4žh *‘ÔÑOC8 Úv¨wê€Ød6Ö_( }uR½:µ³ïÙ™)"áyž&‰1ÅåXÆápÐ:Z"2ÖÖgÑž0Õ¡½^¯5“ëð¸çiš&5éHHñÓÛ>;êBãã’Àù‘ëë•í¨A(nÉÍfsµYzŸ—lP*k–{lBkí<ۃõÍ×%üY{};«¯W%&÷½ $²hÈ%É‚ùÜÒ±nñ<ÏÃ8w†ÃáðþñÁvž‚òD†zKÆßnoP(ÍñäG‰qåœ}}sw³Þ¨â…ˆ¨1 DpÎ!\RlÓvy±SE€ÍWðÒZ*^útMSçÓ.àKD½µBI¹-׉1bisKtN$¢Ú˜› Ÿ”ÒétÒ£ jfé¡Ã³ò­‘²ì Í·¥ÉÓvØ”i)Ùpµºž§óg߯©²­lk—ºýúÕú³‚“‹äèéåî "ÖÆÃTÒܲ^RT¢ö⋟¸üÝFl]œY bD2Ö ,ˆ@X"§¼Î! èqåMßwÖHÆ 1šŒy¯ KH+¤+dæ|YÉ‚Kì“Æ0.1Æ\˜ „Ð÷=3G]EÕ]™žcZÆi'7Æ«Ã<}$âg ­×ëׯ_‹±~½±}·Þn~>>Äí¬[Íóbœçežçãá3§ThÞcq¾® ”ãMD}×uÆZ»Ùlµ;ÇÍÍÍýÝo^ßýõ×··[gH$ P#fV—iŒI±¿‡q÷áÇ?ÿùÏú'}šÆJÁÔÄä®ö†‹[Û4™ýRRc úÏÿbý´=P¸vŽd—ÈÑEÊ 5ÇC¿¥¯1†rRCWÐ7ª§¥½Liš¦átZÆq™Çãa÷áÇãn<õ6ê2©ÇG%úz½.ýƒW0ÏóñxœÃ2/s’œÞb@1d~Ì LU+P_Àíâ_ å¹µ\§Èª W_“Á”’1†#13 ¦”ãWâ‚Òpª¨œ´-ˆj7ñJ㥧úJçûˆPÃÚ*çÒªËeŒE€´„yœëÇ~|<ì³hÍvµæe ›d;c·ÆºW]ûneÜ8ŽÈ’R²–îïnœï½÷ÖP®â4ÖJBfˆ rb^–i®À÷Ƙ$,"Æh–4´vE·UŸ™ø¥ nFpmäЋO7W9o›rº¿hðÉ IDAT›ˆˆÒ:´š‚`V]SÉi™§ìÛ,)Egʇ”ªò‡ˆBg4cSê¦RJÄR]Û­Wû¥²a~ÓmßÏ M=^˲.è¼ Èœ!©v¥Ð«jíz½ÂDgüs‘®ëбV<Õ«Î| 1»Æ ÕÐxEˆµ« 3¤g{Ìh¦§ézëEœMh¨wÞ9cX°† !Ããfn™‹&ˆhIK]%j&¹¤´‡T’Ó^Ïã#²¹ë|J©·hL}ï-ÂÿùóŸ,€/×î¬úILqÓ0-ã”b4`éE ½ @×Ù»›[ãÜj³YÝ®ïOG÷sB8Çýé8Žã¢"¢m;£í+r6p!£ ,8¥Î{HιÛíJßW¯^ýá›ÿõÕW_~óÛ¯o·[ÀÕµ3%uã`aIQ•)Óáßÿý߇ÃÏ?ÿ콿uÕ¬T”µõz]–T5-ÖÙÖ-áf'’¾Á™ ûÆ‚©Êµ4èäW>ðÖµ ÍYÒ\ÍD¨ ®Œê—«û¨°Þó<‡Ãþñ°<vË8‰À™ÙÁe¡Hß÷ ýoŒÑÞÀ¹(<%†ì;‡k~Qð©pzi´‡¿Ê:5bË=‰ªâê'Îì@“€›Ü®jå¯p#W0ë%‹ä™)áû¥#}¡¨5²§RE+Ñë=Y‰i™æÍ`¬÷þÃîqæx\¦»õöt{3ÞܧyÁį7·Æ;³‚÷în»¬zdŽÆ˜õf“$gÄhÚ·ÉmW@D1‹ -0MÓp‰…SS"Ø$Š#>q±â¥—¾e”×,òÙ/Â¥S¡~Úª¹\Öœ/‹h²­Ç<“ÓtŽ•*ýëIÙ&Q%X}æ1e>¦^v,H–çÉHº"€Ìè^x¨—N-¸Öõ_"RßÕߨ_epî M÷eåõñ•½´úqýzóº{k~· •P]Öb/D @´¡ˆŠ09ï ZkŒÅ¾3"IM!GBÈÚWÁÆUkQú©zžf°#GOBÈD¤‘¦Ö¯y¥â%í¥cšGJ|:” ”u¿Ûíþõ_ÿõs°ªÎ¢Xh–Źyš¦qœ–9jÿ«”ÒK^neLjཽµ[¿Y­—õëåþþÍŠtøþq·ßïGE^:Ѧ1.K,*ç ÛæøÕhŒ I¼µˆÒûn½^oWë»íÍ÷¯~ÿÍW_~ùåWoî¼#ÐèÄ ôNãK>ü÷߯Ï뜫gL—¢ztµ«ÌëׯÕÄ¢¾©1*dcíCYéoš&yödÆŒ§†cÍ}¨zë4Mú¼±id«\ (LÄã¬óÖ{çV¦ÀИk1Æy^²æ1 ÇÃnY&è:­·ŠòQ—BÙŠ˜iš :å4¸eà×,~|JïÏ ×:ZùtÅq¸ å|±‚Ü2£ú"¦ÐŠ4"© ¨(Ç´M©l]€ô'Óþ‰OsûDúGβam¨Wpõò´cÄì*€$6BL "„$:ÜžöûÍv8½:†ñ8.òÜÏ›ne_wëuï­ËЇ¶o)ÒW¤$”а!£~ÚaN§S\–:J¢P8—¹”—íœëRОÅ=¯sٚϭˆ­Öá™ÿ>a´õÄ©&­mJZćºòÌ:N‡Ã¡ß<”ôû›®ëAcíù={tH<É BæJé¨3¶æâñ¹ì +³z*~LˆB,wš7DdÎë¦õÕ#ØÎª%ì«y^‘}ýi¨ú±Q”þbÇ|Äú•·ÖCdÀCX«áê· kBPõÒ‚ )ˆ¢ÀM¿\›/—=ÿúéX9Ún·Þ{çH%âè‡>Ý®ó“œÍ•<¶>D–iY–’–Zÿ‘iIîW Î!¡uÝÈúþ5„§ñ‹Ýn8)Õ‡ñÃÏ?Æç9¨ KR^0ƒ»VQ7¾[9k­%XuýÝv³Y¯_ÝßñúÍ—¯o^mûÎH"QRv ¤enêñb€ áÏiš±ï{)t£h‚U¿ëííí›7oÞ¾}«™UPÅÒ{r³Ù(”£6N†µÒ#Ù…c\rË¿Ó8h_ë®ë4±Kp·Û© Wð—Jëq¯6¨žìyv]ç{WÿŠž»™Ö}ÇqžGy>Nó<ˆµÎØLÊРÓ!fˆ£®ëÖëõÝÝ]mFöþÇŸ€pá”Â’RÊ€¡h®-˜Ï•k\½ø…£°êVcL‰«éóÒ×)×# AvÁ&8ËÎ*€SJ*Ÿí l ós£ò©Vö¿Ä °±ªë•,Zÿ’ÛÎÕ‡U튙% kH MÁõ/É4Mó0.S˜‡ùvµù²{Ûù•óèÐ"¤ …ÄIr¹s*ɨ¬½aDrb<žRˆ¶¬çÕú´ÏRušöÍühg7)¥ËacÊ\k3å¶/†<¤‚ù4ÖpõQ]‹5ÚžTétRJJ”ÌÇ+>#õûOð¥õC®Dˆ1/‹þùÉXÝßÀÈ2Z¼œ–å8MÇq˜Ãs–^ŽU@m7$ ç-€÷¾3æ¶÷Ë›×1ÆaœÇqüî»»eYÆqVüáyJñCBe.Óêæê:kÉ»Y÷÷7·›uÿÅë7ÿðÍoîo6«ÞY€ÄlD,êZ$‡A´dGPŒ€0Åqž¾ýöÛŸ~úIq 4ÅQO#hdW1ooo×ëu+}+™êP÷µ’¾^ Æh×u:‰)„æ,¡hÊ›ZÞÎÌ›ÍfY–qk[À¼š •ãÕס2¸ëº¾ë]ßû¾w¾Sú&¢øT¹~:N§ÃãÃÃn·Ó¼3í£ã‚í²„Ê¨4·×;ô}wwwww÷æÍ›ï|¿?ÜÇýñ°,KƨøõÆÓÃüñSÝžœö˜…¨¶:N)émZ/B{Ÿê§R£E™ˆX.ÛÀ]LŒËÕš°ŠIšÆvæÕ¹z®—b{1‘JmmõjTÊQ¡ pˆË4³%ä QpÚx8OݰL!Láv½Å­·ÞßâP –£¢Dëjwv‘$¢ZˆC ,Óiþðø°|ÌUã Ènû¼­5ÜnS»X³# sj?}v´ó#ôP/®›ÕªòÆœË+1•Âåú­ö·ª岿žîr+õëcÌ\”ûgiCC=tÌ Bšܦ€ˆÈ2•½)IŒq¦p:ˆ(¨Vΰ^¯_½zuww·íWXý±†ˆÈˆ%"Kϳû—üŠ«¤lסYðç“@¥èhÙK{jŠ-ë•ò×,`¹ÌhªÆ·”Øb”ˆ$u©õ” b¢JQ’!H ‚로@N‚9ë¬XŸU €Têé«Ñ_¶;ws©ó¤'Y¿dè Ð>Œ~Ý¥$ ±d»OºÆ‡W0=4­c-roií]gÈ9c ©}! έTÀ8Åw…3®¬ŽŽàfÕ1o:¾ß¦ô¦y"òÿþû÷êÚ¦)GOS‘yë齂™Ýon¾¼{}“ìÖû"ûËäÈ™Mä$ ÚAýx:ýùÇï¾ýö?¿ûñ‡‡ý. N§id¿êSJÓ0:ç´ìUÍ>s"k¢I[k;¿±ót2~µ24Ž#,s K:gm̳z•­µnµÖSj\’„Óˆ%š †ÙY4d}·ºQ2J6!¢DNÓápœÇ%¥„hÜ:kÛЯìv³ÚlÔR‡ÚÀÒ9DÇQÝã?}÷Æqœ‡!:g1±„\·=³$¢8…eŽHÂÃ2ÎÃq8‡ÃîðøöíÛÛÛÛWoî_ñêë¯ß~ûí·ß~ûíÃËXš¦EáfªSΓÒE¦I{>k¨»J‘+Û.5}^SJ1.•5\2SÑæ˜¬™ˆ²ß?°F e¯—*1©dþ\Ñ­DFÌ@¿ˆ€"š–NX[Ô(ƒ8V‰ÃÌ$6÷\f èS˜bFWcEA¸ð;¸”$7gÌénÀ ž¼$Ni©N‘…‚@ŒÚ6. ‹™÷&†…Wk—à‘0¥ù]ß?Âé‡Ó»¯^±Y­û¾¿¹¹éV=®Ð&HÖ Hâ0Kÿî°ÿñý»ïÞÿå§ÃûÄHt—‘(Ãâœ$Ÿv½ÐB€YÃs@H("‰“HdôHØFŽ3¥b:ƒ(:˜Få<ÏßúîÜÝ8 p:ÎŒ³ éVbh&ÀTHK€ã0 ãW®w xÇÓ"p"5qV~½ºÝ&æÂÓâSdmI@ ÀœD"ÜIs\}®ý£Ù?¾ëûÞv5`¤@_Ý¿Ñ @õÓÖÜó$ЮԿ,SaOÇãažç®ó77FBæ”bFôToçÒj×÷ýétUàÑù•óýn·ëœ_õ7ãñ„‰q ‹µÖû€˜µC† !u+²–)†”ÂZuh:”Ä1†Äl½sÞcŒ5ï½u¤ÇP² &>ãñ+Ù ôÖBŒˆh8‚1ÖYIèÈe—…`°æRyŃðõ—_hzWJ)LÁ9G‚¹Û-=1#d°˜ëš„ž$œÑ3ßÜÜfp€+ë1~zR QhR[=E !!áÈiJaZ–˜’±:T;þªŠz5‰ q'öŸþÑWO«kCãë¼qÖ»êú›ÍjÝùgfÀ,Qɒ⸄ŸÞ½ûËÏ?ÿðóOÚwïx<ª×WJ;tj1ê¹úë V‹k±6±ªf*Âuþ)%×ósVÊÊ‹VáªÇ©ú·5&…ˆë¾c£1ÁCÖ5ÆÚs&E¾ª7¬| ‚^yDë5¦$õ\éÅË4G q ãiØ=<þðÝ÷jÿ?ÿ×ÿ}ssóOÿôO_|ñÅ·ß~û§?ýéçŸîûu-èR0Ž£sNsõª&"­÷ûñ‡Ÿ´ì^«²gËÚ0Ï­ ZÝȱ$¨Ö%ʉ ¼›@t2™,+Ó¨®`ý®Æ­êƵj¸ô3Õ7™Aµ”“¥ä¬<<ƒUm6+uÂWŸ”&ÙOï éâüâÇð“M?ü ©2È÷ÏïÿW0bé6C˜I§Ó4,Ë”boínð¹õ6 „ðÕ뛥˜’õ$„9Xk­ÏÍË, ·Î[¸ ¥±”œC“ÕêeއýïÞýåý»wT®W…‹%ê]ï½ïüŠÐÆÀOj—[ë5_•ÓÖÍX wõœKq³@ɼÐÖÐM "V³2ÍÕL.$0„B\BÌM! 9çœ#½gÊTv¬¡sÇQ˽ ¸§._Ä^ö¿¬wèŒEEÿM<Ÿ†8ÍÃþ@Di _}õÕþð‡¯¾úêË/¿Ôs»Z­>|xŒ1*7QÓßZ»^¯Çq|*}á²ü®=|¹‘r9ê;Ww{:b®VüŒȲkJrtÑá\CM­~ú\•Óq[khKuD‘”­pcìÅý+'Òø(^ `9— @ÎFDÔegfç<"3Ç$HiЉCÔD„qš¼÷ýÁÏÃx:·Ýj³Ù¼>nïïlçÇÓ´^¯7›Õªë}g×]¯™ Ãø—‡Ç~~ÿþq¿?ô¤”Sj*k«ùtIëkmÝÕòAÔÃMæT»’•·7ÌKó·*½•ëæ7u}U`)gÒ¯´âPD:wöéBN'D œ*OPV±‘ÁÔÚ?õ]k-¾+’¬Õ«¡¢ šoK•– ,Y­V\ª“±ëº:m¢‹œ¬+5·J_̓k×!»+ŠflÉÔv›ÍFã•gÖK ©Ü 5'DÔÕüÉé&DÐ`ÍýúÝ!Ï*Z¶—óûŸ“}Áªj?c"Ê,2Äå8‡q¸[6½÷ø‰±ŠTÛ·=ÑM ‘ôÖˆ9É@ 4`©»ÈB’êÏ6Bˆ™™‚ÈaÞ=>þüðþá¸?ÍKÕ"ëÞèkïr´F+v°$ øŽTsG QcŒKˆÌ2z’ŠKŒ‘¯º¾ëñPŒ*U‡õ,é|³¢­¾È’ûzN5 !ÎË4Œã8.Ëœ·Æ9ï 5y‰õÀWŸmõ~«_©¿Ú…5ߪõH¢ß£¶¹PRDèû·ûË_þòÃ?üæ7¿yûöíÍÍÍ?üÃ?|óÍ7ÿöoÿŸ5„O¥9 4B½ÝG|bøê.TµæŠNÚ/þ2«q»ú¼ÿÊù¶•Õ^÷ñFÝ¥¢{ÕÉ_ÐmºWÏ…¨‚–‰@;ñH±€[æ^×äYIgftæM•i*š %DdðÎ! °Ä%L, 2stÎÝökDæ©ëOã0‡e?žœ÷‡Õi½^o·ÛõjÕ÷^SˆèÃþðóÃãûÇãqšÇÀƒ¶" ÅéT•Mg€žäaåÕ ±ºòšEO\Ð"yË >3¤_O“v#Ô¹”?)ŠDf@B£=E †–˜qš€œõ:·P4þúÔ9ç ]û˜\²Ö'e ¹_E#aæúf­˜x}ßÖVËØ÷=3×D™lþ¦dlÑJ¬¢]F*Ù£U6{:'¯Xk¹8±œ+\[žÉ)*1Ûƒµì§•÷uÞû¾ë¬µŠ[ÒYƒá)qvÖ¡™§|FôYI¸,`„$¸pÃr§ã0)œý¯5Ú„½ö}ísW1€êã¡sãeJÚ¯ær5EÎ7¤9¥Ó8üüþÃ?ýå§wvû㸜%—´#ur®×[]Áa˜¦j­Æ4¨ŽÙuÊ3r@gÔh"Ê9´… CQäëá(éõ%@™¯¶¾)¡‰| —€hkaÛŒ*ž³ kѽ4NZïw>l]Wmwiú3r‘O\b“zÁÚäúBhü½DäVýétš¦éÇ?þøão~󛯿þúîîî_þå_Þ¿ÿ§?ýéûï¿!è*‡§6w]–VÞ_¸T„Uu-/ž¿þjÄÒáªr¥Qa™[FÔY5rõ qi °”¸ºp;_PõDȉUå)$·ZªÿBÀR,à«¼Ô t¹rUÝAÍß&ÑÝMSH1¤¸, 9+‹–Ñ,C߯NÝiûýÎx÷z}ì7kµºú~µ^¯U¿Ÿæw»ýx 1-œbJ±&`_jÏåÜ7òr%¬\öWÐEh:ê^l±duéh=_²!v‰“@°ªÊ ¤%ä—Âr4¬e‘WÎSòø±©Ÿ±†¬µÂg ª/£,)†T\å€$`‰r‹iíWÞ´ã­¢T-¿Šøa$´ÙÚUøÃ 4¤«®†ë»z·|z)—ëëúœN§ã0 >|¸½½ýýïÿ×ÍÍÍ?ÿó?¿zõê?ÿó?cŸªƒ'‰©O7_æŸÉ²ŒJpÉ÷¯FÕŠZ‰E¥¬è,*=9Ò.Q;Axí à ÜZõ¥ÌÏs+é¾"bɈk3¢zOh;Æsc·A­}ÄââS“'¥¤ágÍ› øqÔâo–c蜢›'ã,Ï©×ݪ·Öz×uëU×uDöÈa¿L) 20ÎJŒ)ED£¹b%FΪ‹_oY^(HÅy^WRUû¬ º_4w#DúHð¯2XPAHÐÂZòN!¤ Øcš‚œŠí‘œ×W G8ÝäeIÍSJÖd+ÊYÐ"þýã£*Ü­¶Öº®«¢Ô£ž^Dô]‘—ÚçØœÓ1,»úXª¨¤¤aÅädšQ=Ò‘•9§‹A$Ô¦|æŒ[J°ôt·Þlz)“·ÕqÎüü3´«–×7ÿFR^ŠÿéIX•O]»ÔbŒ‹% D4Ó<Žqš11¸_xAйЗš~ý´š/ºóÉQBQHg®]vK)>Ìô{x|ÿþý~·›NÃ2…ØdO\©Ø»Ý*΄¼÷h}½ž™mNq‘Æ’«;Ýš\UúV•³}öj¡ÕãZ<„0-ÃqÆyŠ‘Ày2YÍh¨¸WõxWƒOŸ«T ±®În«íÜ š¦zDdálÜ*J¼ 0²¤qä&ø=MÓn·ëºî»ï~øÇüÇ?þñøÃ¼÷þóŸú¾×X8¿Ò”$—‚ÌåÞƒ†Ó³§¦œ”ϱ¹ðó ?Sö¾DríûÒ°>?œÿ-ÓN!–rÊBˆKä(’øeÔÒO×°•ACNAÔ¦lˆÆ eµß efÊÂ@¥Ê©°'ÐŽÃ~¿xxØ?ìO‡ã8Îó¶,ñÙ3û+Žº8>S¥=ÌX¢èD$’BšÄùÝéðnÜ}ã¿éŠ!§…ú$ |u»~:§Íøê –E&=ÃÆÔÜ]_=½åb@i Þ;$\bˆ†,£Lóüx<|÷Ó?¿û0ÌÓ4 ýNÓ2OAS”Èâ|/Kb1¤%äJzs’%„˜,ˆsŽ€`ƒ‘Å4uåP’¢³ã×çœv„ÖÄŠjc1‹û¾ík[‰/¥4MÃ8Ž»ÇGfö¶ëúUß÷Îu®[¡³}_ʇSN1!â¦*ØÉ˜4‹£€'dA1€¶Û-4{̬ŃÄ2cbH DÆ8g×Bó<#¢ÂìÙÓéôÿñß|óÍÛ·oÿûß+^’Öz!¢¶‘)u8ç¦툒 (øœ@ŠI·Ø·{çÄ XŠœÆLÕW ¸²™^ò\JÑ8ˆEŒ"’`i ™òä{‚A*A×”«½žÈÚR˶,½sHOE€jû†ìÓØ*¤Ì”“Båd¢÷¾vƒÉt!ÞœAIYý‰(d'4Æ€#&H †9,b€P‡p™\³¯’ÐZoMgŒ°)D‘Ôwfž°VÕ‰ìIçˆF•")%ÂséKû\¹Ç&dì=âÒæ´º¹O³1°éèÐŽ‹jøYZ`ŠË09ŒÄ@œÄ’!ër^tHZ¦øêÕ«·oßÞßßë¹^ÂT÷eYŽÇãû÷ïç—qšŽ§´ã097§¸¤HS–pjwV' CŠ,\(:ÙÊ4ˆH™c°Äâ]2q8wÇÓÞ€1%˺MÕtÝêîîîõë×›ÍF³½?À"G@´ÞYﺮÓê ×ùŠä%sXÔ:…cgGƒ€Dƃˆ˜»®óݪïû~ݯzë $±5”KG.ø$< GÀÈœË;¹I)hõ¹6 ‹™éIån[×ïë=,02 ¢ïòí–¶Qªaóå1l:äwNn`pd†Ó$â¸ÇÄB À”Â'[Àç8¢š•EÉ’ÈD&Ë õ:žN§›Û[5‚«¦ò÷ÖàÈ"€ÂC‡áññ±–üžN'E¥PÑ…ft©÷@ ×eÊ®*gª£82-‘R~Zpè~ŸM¢–¸š˜¨JhÑkÊ8Øm:ÒÙ¶{É>xº%ª0³*fR~Ñ–¤Œ@ŠÉ䢽.^bpÖ™·O‘RR‰«’ûöö–ˆnnnB0®eør8§Q‡¯Þ~ßÍ8â”®ûÌü’!%‘ª®æSPé¯}Ë5*ñï8süZQW þùÒsa3 *Ÿ.EM@…ò+j0"Ö6‘­Àcæ.2+•j7SUmLghûΘd KôޑĹ.?¬!Àyõ–¹RNý]"ªÁïJxiµ‹ð:ùµFU¨4Ò§VrÍyT 5¥d=¨ù[±zÖëµµVû§R‘øæÍ›¯¾újÇýpZ†q8‡ãiÇÓ8ìOG™ÆµïZâÑhH“•rÖ6I¤ê¯õ»Š”G;V/ "®nË6vkÜ0 ÃápPÇXß÷›Í¦ë:G&G‹Dº®ë}î)9©oWF'cD`k‰)239ë­3ÞkÐ@–( Sr¦dl²+^O?ýŒsý+ŽÌ"€1{‰kâjŒ˜´óÍü9X_d|W(ut.&Q< Ãn·ûêæFã¶•Û?«`þ· g €Á’AƒI`—ããñáááññQ}¡šx•Ï|NGÅþ-½¡È™‡cÈf ®Ü¶ ÔêŠ1rÉý1¥¿o—Û>ã^“’õªX}­­ZÒs•lõTxC“ÕUGËþ²Xp@}Æöx 'Ýîú¤:+{ õ~%‰SJûý^Ýqoß¾Ýn·U,UvöñSô©˜ éBíøÄ³*šAÑ&ÐÁÅ2Öð‚\¡[¥ ¼ôJ%ÕÍ ó4 ¦i垈(Å„OF¬µÊ1¥ÐZÀúSpŽÈœµQ Ðj†”:ç:ëDÄ97OSŒq³Zk–õ¶[i½SÞ> d0&.! t&c̱ˆuví­ëzï:ç\ç7à)Õ]0¹¼›.3"[µ.5ûÿ C­M-™=Wâ#*gC ]PÒgÅ€Ÿü¤ÀeR¢9Üd €²’¿†éó·¬þbP§È2Çýîðá݇÷ïß?<<ì÷{Eµ¬ŽÖ*z±øZ…ý%½»²’3Cl*8SJIáÓš†EU°]Y½W’ØZ«'_Øú:–ö&­% /0”§ÄÕª1åY4éâÒ (Ô™×Ã\G+ÔÛgaf€s³¿qß¿BPÞ¤€Ûu5”»ýN×K÷˾ø¼.b¯®¿ÚÊgº]º–´ô¢ÎŠO”+A«jS¾xYXpUBôO³ôzÒê5" ÊÛq!^ž‚üÓÓDd ±1ŽÈƒÆ ±¨ýÄŒb´•}†>+ e›3?-wy h«€â¹ªýâì§wóøµFŒ€À Æ$»ÃéÝ»ùùFb‡Ãi¦iš—Yµûü°…¢±¼lj–šz“\ôí ÁŒ¡Ò_jRb-Tàâš~*>¥”«bîŸ%õzÀ×tù•ó;ÍxzçKžUß9·¯Ü–‹{.»³µÓ®YWrÂöÌ h¾ê:ˆøæÍE儯g›R²öc Z#îòÅÕhœ-kþ :¼’²Uú–õyfžWò_ð¦ÊeÊ"—Óà+1S¼âß” ªª¢€gmQD¬?[Bí ë^È¥/áS Xó˲ &CB”ŒqÆ µdA²j…šVc.®ØL¥N¡smØåó~ŒžUû>i¼ô-['RRÇ;dñQQ!„U£ëVzN5ÿ¹®¡µÙIÛB- ˆS¶ý½5ÚvE(G‹uhžFŒñçÿ¢]Ñ4XVvÝfSõƒZã¤6:4 ”º¦%.•Õˆ@¶z×@ *k- Xkçyž§éáá¡s~³Ùl6›ãn_ѸÔ\Î óqšÇ ˜“õzK Yï¼÷ÖÙl…,œÖM$$RCj†cKOX¾úw5ˆ@ñëD¤¦/!N£ƒˆñð“ïÿÄõ ºDÒ Ë`ÀÊ^‰ü™²±hÁdÑ&q»ÃûÝþq?Ça* 4T÷ ðGN²jgºñú-.`ßjÐFŽY5ß ž[“ª›«R2«5¡©žIm0 lèÚÕß’ésOqý–lý¬ÍÁRhŒ‘ˆØ¸°êñ¾²ö°˜ÅÆdxNÕ”©d2/ËRSÍõÁf~ÂhÅ䥼üd:ÄKG(>§¡_~z¶Û9@¯¯¡¹òBÿû¨eÖÚ¬åGϱdc å.à` V,̬¨™Ö»§7‘„ˆ GóEÇÂÆmCD#‘5DLÄÆ`Œh,ê²ëKkŵÙ-˜3å@cЄ0ÃU° ?×óaš«óRYó§îïK×cÙ”*Òôþµ#‚+ÆTÏèÐÔ҆ ¡”àõcŒAJÀÕŸ€"Å0Õ–!P8Éÿþã?Îó¬ rš¿r<çyÞï÷Uy­î1fF{έ¶3›¦Ë=´3µw*h¶¶1¦³¹‘FÔ¦æHŠÃ¿;ì+¸GõW#¢óžS²‚ìÄDÖuÖx2œÓœCHDh4ÙV»eKM‡Æëžz¢'oôÇõÛ@„ Ew ‚’3ª…AbÎK ñsØg,<ÑßukcŒ$8ŽãétZ–%8/»¸ü½ZC†a^øá°ÿéáýûÇÝaªjY½èY€¥ühççEDNu¿3‡ÍDLæjM² QÂEºÕc«Þ8S U«ÁÑòÜ«ʤô°i$UD|©¤+˜ŠCé_b(ÒŒ«÷¡y[.EW+Ô¥@xVõ¹°õkÛ®ýŠ¢lŠHuUéºiþseõ[üBQ«^¾ÿìåp‰úr÷ânL¯ã&*qNÑ‚'ž†«¯˜ÈKðqAru“ò‹©zP½÷Ò@Á@®¶Ì?~QªŽˆ|\@"²†“E„NPëJå¡$dfÐÔxk2²’ÚæX#‘rn\]ÉŒˆDì}ês¥ôÌ:\¸ºæÿÅ]nGõ÷H„""-d¨:Dl[t—õLe´*}Hó=ç ;'`sõœ{i]õ© "çÜÝÝÝoû[U[SJ?þø£Z«ê²ÖÊ‚˜Ú.ì,•EÄ@u\Œ–éõú~… DÌl°T«wnŠÁN£êšˆ7ë5Æ£±d¼µ¾ï! “á.¦¾[c,8 D#—hý"ÂÂRÏï=´|ò‚¢6f*Eë9Žc‘äf¾}²®Ìóº¨êdÎþIfŽ"ê! !¨/©IŸþû¹ë£p„‡áôáñáÝû‡»Çãé¤9ÏóïE—઄·~Š2ò ›ÍƼ;¥JÞÖ¡gpÌyŒ"$Š¢ê¹,r_##±o°9ñ±½yóÆð~¿·‚c¿øåßK®ã/2XUã8§UÓ)ð U͚ʃ0s'ãT„˜R¢\—Õ¸¥ì~?Ìg¶ßlÛ¦iÉ(3/‹Å~ɆÛÅÕr¹\5MÓz·è<4ì e6fª•ïê¬ðÿ+ékÍQtZ°”= qGé[ G’Ú¶õ®‘qœRJÎ5MÓLÓáÕ««D»¨`YêRRBÂân84MƒAâÓö?Þo¿¦Þ÷ž!!(À&§“+zç h ææóDä½PJ³7T1%E%f„t ¥ „ÉP¢S € ™=kÒ´9„ÏŸÖ>Ü?>|=<0;G¼ìÚÆ³o ÈÚ5«èÑ(I E$efGH™ß‚hŠQ "*((¨A0½¨«Î„¨ª5«ªë8•ýnº¿_øüùþáñq³_ï‡aÌ9ÓB)š8<:Ê9™ÕÞê^ûÕ|BP‘ò¯”É64ƒ5fÀŠ# ~mµË9dæ§R£L3Ìdî11Î옙œ'gÊrÊiZä)¯®ÛKŸ¼¤™¾5-}ÿ!ñˆ”¡•†*ÔZßÅ`ÿ^Žb»”/–¯ÔÓ)H…LæaåÃH¹J­ìiýõ³>Š„*Éül•À¹¦¼_/šIÖ≡jÔR¹|·m;çœs "ªfýæZ¦¨BÁ¢xˆ‘ÈÄÔ1äF«µJTæ0«ÑsBhöÂp£ªZÞ“G‚Ã~$"ƒ°¥ Íß-ûòì”ë냔‡-µÜâlߪÖ|¶ò5!"U©ì&®˜N :jо²¡õ;µø§ ytS_0þX£8j¬–WûýþêêêææÎÀí§)ŽãÇ¡dxfÎÜN-FƒÒ츶k¦‹-ΤˆšDTG57-5ÙoÇÁÖ‡Éò¢-Åš@eã|~~¶B¬›››åry½\”å2`¾[:n¶ûQ'Ãü™{2"²oÛÆ1(DQQ’c£X;ª–`mÆœ’‚‚( hRFPBE Áƒ€Ìúßì,#%,Ññ’H³ç)–£WS===kÚ{ß.W×Þ9UýöÛ_ÿþ©.57±qdb°…BúðñAAðfuuµè¸ð-PL М+’D5¤–=2CnÚR®ëÈÙ9A%ÊÖ(¼.H’ª"ˆÎ>yf«¼B·9l><>¸xXï¶Ã°ŸÒ8©ˆ¤Óƒg‘ÿâ}y QHAª 'C2H0¸Vˆ’s q¦[¢$ŽCH"#3—Þuµ /ÛQ ¼²þe;´ÊÓŒQ UÔlUçœ0³âI ›Uµ1³:*d\Š™MÇ/‡+eHp[ÿ²/PiúÂZ˜™”KûX¶ž-ˆ[çðÏPí{½•µº#bæâþ*-ƒ™9¦?޾DÞé4q¯Ì3alÛv¹\9DôÞ#rŒ1M£e„•°ñóó³»(ìù:inh椒RÕ0N šxö•5y "fÏÌ4[KVU‡ý°~Þ˜ ],†UÒ÷}ae}ß/ kŽ>ÅÀ¹3:¡õ;!4§8“³¥4c|‚u@DˆuR+iŸìÕ,'Ғ⇀Š3z±"(’ˆÅ[!SÍ‘‘”&lòÊéFD&^ôWìÓSD&X]-ãxøý³ áÔb°µE"0?>PR )~øtƒHÝÍêúju5 Ý¢GÇÉ‘gç€ç\?r€˜Ó5 qÖÌD(ª‘Ù«/ÆüæÓ˜˜=(À$éõi7|~zzXo6Ã8’IEQí€ *Îë'פ#…‰1Ñf‚  óO˜_+ˆùLjÈ9vŽ ôè¼l·¬ðƒ+ûm퇷Ûí8"ç½o|ëÝœx5Ãä!€A•Æ…yMŽ6ÙÝú4¾ PÏîþR“;ù|1¡*)«¹¼ÊZLÚû4{¤ÏŹ]Ÿ/TŸ¿\‡—²–Á%,]^é‹r#Ê…[æêÿ‚zñr&æwÅJñª?P¿_dCavµùËò׉MLÎ<Ò ‘¸qÎ!;hH‰È‰OÄNDbŒè椛òh¯.ÚÙSÌ{š‰ Óœ´H³ ‚Vn‡ìOTÌò3 C­˜IÖT‰H"R0{2ŠbTž½ž°ä~|É\‘P«J0/û™^.Ròpk©l’Ì,6­’³0g9YuvÆÿt£<éÙÅìÁm1û¾÷¾UÕÎ;É)Ó&ƒ·Û­á~l·Ûõzm eŒÑŠ vñ³ö…šT¬ÿ9Š"æì,ƒ'²ÍñÌŒs:€•j®Hîºn³Ùô}ožªš[¶¼_Ì“l0 BŠaŠàB‡äˆ‘A­Hn·…ˆ„TA @ aF@IÑâªH€D ©¢¢ È j€¤P –̦Sô®—x·Ûw=³÷ëÍ:ŽûëÅ"ŒCœ¶¿§.â­Ü I šÛƒ”y¤¨Ÿ÷…ÿùêêj¹\6}ÃÞ-úÖ»¶í»¶õwÃΦ½wˆ@Ω‚¥Î(`ŒcŠSPUÇs—!|‰ìY=3Zù32$€ °;LŸ6ûOŸïžž¶›ía¿ûC˜Bƒ§R‘ )ƨ,Rú‚CÖj‹ke^¹eGŸˆ¯îdÛ·üÄìÙ«ó%'*l]UcŒ›Ýv³ÛÓ¨ÎyçržœW"A„(H-T§Ž^g——•þ´²<δ/Œ— eTù{µô…Ó¥«·@.äs‰êÚÊ<›C=35rË¥­ÿþ£|÷ìˆÍª7×­þõL ceŸ `òVœo}Ó°Ÿ;º·.Gęбˆ`ˆr[ÉòtYQ81ÇÏ^w÷:Z ÈÎgsÖÍœ-*©ŸHTÑ99‰y3³´­&qݱ ‘r(Ç{/•’Z‹O‹G–)#»iTUMIRJ†T_€¡â¤¦ÊPÕ±(^Dä¶¼È"øk’(¹g»ù§Ì|vRìgß÷ˆc ¢ÍˆHß÷åÃ¶ÑæFÄÝn·^¯-k³ÙL4Î*YäX•-wÄ4!µÄ;H!""$PJ¶é&§,±lßc”Ò~?4Ý\®Vt>#˦o¬Øº]×}}s;†ÄJ’ˆÐìZï$J’æL7Sˆ“˜Þ s:†¨ èAHª!AHfƒZê ÎMº9sÒe*Šf¢œÎVÎüèÇ‹Ïûq?­nÞ¾½Å¸‡¿ù׿:lïÿ°½(‹(ƃH!&Ñ:€j: »n³nûÎ5s®o½kº¾ï»®ë[îZ·ì\ï<dG„m@R˜¬é—鳄J·ú‚Ä,gkô0„ÇõæýûÏŸ?~Ú¬÷‡ía Ñ"гK‚˜’ÆÃ °ù»˜‚ùRTunF#¨ªÉòÒ@fØÛ $b爙œ#“¿"%0kî'ЦmØÙx~~Þív1”:ZGè" 0¨EµP5Y=ŒhÈ%'FÛŸÚýåQÓÏ—¹Ráïgï¤ÊÕIwÀó™üNÞw6™š/Ô_Ïó8QÈ X"2 C‘U³!…Ç9×óy9ÎÞ)æÏdsý>Ìy¹E„”÷£e7MÛ6ηèÉ!b·èföÁ#ñ”BD`6äµR¯UûŠúD@Vd¶}ç}ÉŸ˜¿aþOÈIã*XÚ¸Bu Jll’‘›F<#ŠÀÌmÓpÆs­÷±ìï‘S‰ˆHLcJ)MašÂ4Maœ»{5Þ9Z›­ÞµÆÁ¡H!"b°`ä‰Ú–”ðwÒùk”*¾3j)^Î}_ ›ùX"Xþj«t{{ûóŸÿÜxÎÓÓÓv» !aœRJ“ª† Ù‹³=¬æØ­×ܲî³IztÕÑ5Žc”dÕ¥ÊܾÞLž™MuèºÎ̹û¯w»Ýªó`¹X,º¾i:ß: À"ÅdmWD4%AQDÑÙnEì‹VUHS”;bf4l P7ñuS¢sÛéŒÿØ›÷ÛqºÅ2©üý߯uÚþóþ—¿øÅßýHX§|M4* eÖ“ fF IDAT?GD딦ý 1M‡Ó®qgï‚ó¾m{ï}ã|×ÐUßXwïåri®‹®fvglm¾ûKå" €ÇÐlTØöOëOŸ>=>>¶›q<ŒÃn÷1&&­ç !)‚%DÁúð”Åõsa»ij"‚P2:`æ#³ÐËsKNFseUëR9Ew³£5 Ãz·ÆIœs@N€ 'r „¢¨ l¬0†™Å1ã—™cJð§ßGàÙ¸$æ‘dÖb gÌí"r¹p-}ØgÆSÓöÒ]JVdr¦½©`Ä|”‹YÇqCëôU®c$wÄa8ãÑg?¨ 9  svtþ®} sZý1CÊ~-×<ÿ+ÐbÙ_ßÜ-VWMÛ¡c  ËZ1ûÃtBÓ0NÓ4N3ÌxÌZÈ»àòÙ^4ý´¬²FUU°"";•ˆŒ(®Ê~È×AʼnLæ«‚rRJû8Õ®é”û~vªM–ÁG¿t•uXÏVU“´1Æ8Nã89ç¢ËeúÙ¤ÇSTׯw%ðiësW")„Td‰ªRŽ×(³D|éRV-YkEöþ”»ˆ–À<Ï!'mRËþ¦”¬’[]]]™Vôþþ“Õ8Å)hL)¥8…ÂÓncÙ[¶8–Ò¥ªž,¬ ¥™èâYA) “Ýô‡&5%ƒì¨N³!K¹„dÝ÷‹Åâóç‡Û«å¢õ˶y{s½ºº¹¾¾½¹»U¼÷æfOs˜P¢Z»ç˜H@!IB¤ÄH9s9‰FI ˆQ)+2n„t” …m«*ÈÇj ârÙE™Æ0.úîÍ»»á9þ»ûwõçÿ㔄U߯Ê„ì}QÅ”’$ÕN5EH1Kt<°sìctܰ´L˶iÏεmk‘†¶mW«•¼±Ã¦AöŒtT­ ¹Ä½%›2ŒcØï÷ÏO›íú0ì§á0 ÃxØGÑÆwÃ0LiŽ‘(‚ˆDµDæã‚¾ÆÄKvtnåBtäÚÖ$÷¡£*GF«t8Íó²1«SF¤K)!žDãL5ÏJÙÉÙ+‚ŸÈ¸Uš“A.1ú?ñø‚,üÂWŠ,,ïœ}æ¬]n‘ _øJ}ñzÅŠÅPæYó&4ÐÊYmShŒ¸äîÁ é[ÿZæYn}‘±fý­ì…s'ÎEéq\ÉÍÕõÍÝÝ×?úæÍWoÛ~IŽ ­ú.LÓa·?aÇÃ0Žãýç2«Rä:GˆOáÞLç0ßNÀóÚ"0ÍH[*ÆôÑ.k Gayl¶’¶¶ã4Ì)¸9gÊÎÅ0M&0DÄ$±ÍÍì9ÈG¯Hgò‘˜9ù¹ôheyMvÚ½Ú¦+™·%(Žˆ¢'zIQ}Êvü'‹þÚ°ˆiMcš]жq!Ìik³ÅÏGhÞ U0…l¿ßÛ‡Û¶µgüæ›oÆq ã DÇqœ†áþùi»Ýn·[󗘉lˆ""iÖMô#b°8ÒœySzˆi„@4GoUµdTÍÆÑ2Ç„žß,Ûæóêzµ¼º¹{óõ»ñ"t]·X\y×2{uVF¨D¬³s¬R½ˆåU†åœ3o0L¹Ëv‚(s¿;ÃöŸ?OG>|ÔÔqØõ}·ûL±Åðôtßus„ÖâÇ‘ó Ÿ$Æ8Ű}þu²Á/‡*KR™Ñ\%ÆÉÖ.4ŒƒQ³s‰¦ ŽN(]ãËþ NvÒYdÅ.šcÉ·oVÞ7Ën¹X\õ}ßz"64ܦ“(WÊ;×€å^ ›Ýpÿéáþ·Ÿ×›ý8ÄiL‡ýLj‚âaXO¤ ˆŠDETT‚Jç€0kd%mÒœ–ÕΡ¹w¤ŽÁ9BBbfÇŽÙ[ž2f'yöŒY”\€ÎˆE³›Ë¢5–µOѵÎ;çyç}Ót¾mˆ‘€â”@™ Q%†h.PqÌ,àT)±WˆÉåzD»i¡›ÏÑÿ“ß7lÿrPE F™¦p8ŒÖ¡Å¹Æôk"®9Ñ9dšÖ\mi˜)»jË'13ñ3akˆ%Z‡ÕO¢r¦àu•étˆÔÀhË€&Š–£*ªID‚A™!$H@@ÞÀja˜H‚ žÙ;‡ÌIÅ16ì èUAĢؕ…š9ø‹þµö<ŒhðH‹˜Å-“Þkç3U%=”û[0s{uóöÝ×õÿè/~þ³··wÔPÒE&õãþ0ÏÏ?~Ül·‡¦ÝìvºÛl;nÃ8ã˜H&N›¸5dvnNósDÞ{«Ï ²-2(b"rˆ :)‰€ qÊݨ‚2š‚$ŒÙÕ,šÆá0){È1û’4Û¶­eó–æ.w ©ÃгðÄÔ4Œìˆ…³Câöv~¡U¦åâÎ4Æ 9§/$tŒG#RLô#åņ³ÇlˆI‰g`"=>òÇ3㘓%#,"0“·ãBÐJqJ4¤°¬ÏKÑTȵmï\2Ø‹Žk `Ÿb`€ywTŽôia3jq˜Äíê¶í»’èGÎ=>>[®Ï8N3¶`Ùv»Ýïw»Ã~J1i!eÆ.DŒ³F‰Æ\J.©G')%¢”TDuš&ç:¨¤:ŘdÚzçžÿpÿÐöÝêúzùá7W]ß4¹©´ ªzÑøårÙ÷}JiqèDušBÓó!…}œš¦é»[Ôt¨õÂ’A1##$PÊdŒ†1©Ápœ\×®V«ÆûB²¶Úˆ1¥¶oâ1ÉÛ+ Íò7¿™FYLðÙFõR zu\bi5q¡;93Õ©ù0ð¸f £v¤ªÎ …s¿y¡Ó®umÛ.ÿÔ6M×µW‹¦m=Ør8@™Æ$ÕqHOë‡ÇÇûõ“©fR]ð‡gasö˜z|}&в Ní'“£ìŽn@*ÏbB×eÀÚ^©Õÿã!?Æ’ ZÝZÉpù^çfDQ¾Êäá$ꆧèÄ_Wó3fvP?øeÔÚúéx}J—nmtx¶__ø<œåZÕ|Cå .æl¡ó³ {ïDÉ$fT%—}Äpš%„Õ8¹`ºè*/Ì´æŒxÚǦ&­BåDt½¼z{}ûÍ›¯~òîÇoßÜ:ÏAhÆÒá«Ã‡»»‡Ç§ôé#JLC’¬À‘T©m[ÖT âl HŒ‘ù„¥`Î4r†`¡RÜãJ„"){T4ÉɘÑÁìW¢õS õš)lÂiÇÒ½§öK×k¢yò0Tgòȇgø÷øÚ(Õ*X•o¬6—ñ´¢| &HxAÛ…Nþ€¹÷£Õ$çœûéO’R ´Â†áóÃýv»}\?o¶Ûí~·)%$ZtWÆ~ç rbD Á9ß"9 ’ ª $±:ÏB'¶,vb Ó4""ïÜa–ÃaÛ´˜“ç-”i½™ß\¯ ú£qÞ{ïÀ1“o›iÚÃl¿Q fß÷tˆÈ„„L )Ê”„ÂQqWIc‚$“„(H“…NQS!Ý\¯¦íøñóï„û››7¿þõ¯ þÅ1E°Þ6U½´}—ö5U1Å™Ä U@ošˆ²<±!œ…ž½-ŽFž»²Í-~½ß6¾mÛžÑQ×úÕj¹XôôثҰlSJ1ì{`JI7Ûý‡‡ÏŸ×›I_ÓVÌ…Sq›U":f‘ fS U眔3F\Ä*Q)2:öæäª£°Ë³èIy_+^!˜[×"ü¥žäÅÉ?ããõû_–Re^ðŸRÿ^|äL¦~§bQ^ŸMãL:Ѧ³g·Ïóˆlö"Šyj|¦ÝâRNa!ÔšÀ‘£K«-àZH×_Ña ¹CFtÀ €vt®–·««§¯¶7?6MÃ?hˆ¢¦9:ãUDä§¢dsé^ñú¾ hÕqdpJI$†k Tÿ¬cáõ¦xÏuzNMóe¡BŽwZw^Ι;Å ’R½\X§ÔmŸ àJêǃùBg°‡:IA8#Ô³÷ëm=Ó³káT¾þ²ÿ½G ‚ #!";bÔäçsÞòrº[MÓô³ÿâçÃ0l¶û§õó§û‡‡§çá0 B £YAsîjÞÓÃá@äRJc˜†aL2ªF…ä°) KG¿”*Ä9MD †qÜ ‡ëÅ2'mÌöeMÿ®kW«ÕÍjÕ÷ý²_¬V«®ëvε¾!ç! $$(1 (–ô1$çN–ÅXËŒ`]KЈ€ˆ@5ªMúZ¿¦" ÎŒS_êÉ™ œhÊsn÷ù^߃ú§8ÒÜq6Ãï3á#ÓÏt«Ù…^;-Ïxhù®3ù|R/µ*º8’•úò¯…jꪭºzÈ @{Ñy·ôm=+P²N¥à@C ˆìoû®m:BN)m÷»Ãn7Ž#3‡’Îíª®L…­ +â5åÏÊ{ççgù®Ã°—˜¼÷–¹£ª¦¡ÎgSN4Å"qõ´»¼I92­V$“;k . ’GSçP=Á Ò9K²bYjùñ{|mÌ}rNõþú¹Î*ö>I¹¥élÿUt˜•¼?Ähÿîa¸e * ‚¤`Ú–wäP׺”ÚÔ°Âêa”ûÇõýÃÓö0À°_›!cœÆhíSJËåJD†aÕ$Šˆ¢4r ÕIn‡*"IŠ"ã|`C8Ž;ÓŸò鰞ʈè=·mkŠÂÕbq{{{}}Ý5íÍÝ­eV¯V«¶m „cTRU(s¶§Àѱ_Øx±-ª+;jö1ý䛫_ýæ×w_ÿt÷¼ùÛ¿ý[†ÿù'aÕ®z.sN7™Û(¨S“$Êk4 N欛‚œéì³Í#âÀÔ8òÌìÙÜtõ¼7:‡œSJ»íþééÉP‹#^c……u""!*Ì«üÝž ,¡sºò‘:œ¨œüšƒŸ¨r§šPQDdš&“¾Ó47E£?ZÖÎY[’Ze¶{Mq>¨š0T1‚úÁ¿¼ïg|¼–F”ñòRe¾ççmÄŒqý=çF§!سQþtIˆ–uN:©é99^ûºØ>[ÿzF¯Î³v#ŸmA½ÝeÔŸ/‚™[ç‰(…x8WˈˆU£ÙSñYÿüžbg‡üŠqiJ—”N“¿ÊÞ]ºN9!pjˆÔ!˽*c½ß}~¸ÿõo3Mq¹\:ö®ñäÝÍ•wÜ,û…oDÏÔ´¾õM×´¡ I•¦‰™‰Ÿ¶kD&:‰aå´ÄWšz1³e)wí2`GŸ?|z|||||œÑ×K®žGv2'=ï×Tö¥{{|³wCœÁ:ŠšÎÌšæ×ž=YX§f}XýüýüÐQ%s`}ý²}uib¡Æ:§ µÛåO5mƒ‘\Ú!è@Dçv6¢š|Óªˆ†°hˆ–MÛ:k–À ª°ßËú«Í0L"²ÝÝOS|~ÞÜ~x~~Çq ‡Æq8ªePû–HP”‰˜Ø,bQ ’íŒbm"“²÷q»ßû,˜'˜†i,ý©D„™¯®®îîînoo-O<\-®Þݾy{sÛ¸VDD‘\×Ú±NI5† 2¦8Æ€Þ a¬|(ÞaŒÓf»ýù_~½ûíÇÝ~ýÿ‡'itgª–¯Ž/¢žÞì瘳õÎ亵EdM Š bmæè"¦Dˆì:‰R˜$¤ä’÷‡i*Y‘˜‹ÛRJÝ¢WUAÑaÆÃ ªÌ\÷ý-S}ùP&b­K%be²ÌŠOU¢tüJeš”ål¼\gÊõæõ} ‹/×)áÔ³Q¾BDV[‹ú‚HZ ä¹RM+Ë¯ìø—7þs$aé% øÂ‘Ër|órx»(ÔgOt¶)å #â|æpô”hi?€HxÔ&Kº_MQg7ºd×ÄVv–™Ž,¸fÇg¯Ë¯‰`; ïï?Æ©o{ß4¾ëÍŸ²Z,ßÜÝu]ëß.ڤŒ–]±ŸF•„‰È¹¥ó}Û%Ô¶mM—µaçËÚ_Öê…­˜å1 à ™y±XÜÝÝ\߬¾~ûîþþþýû÷OOOûýÞÚB;çR6ûÊ9Ít.õºÕûR»ìd9ç†a°œ¢¶»ˆ“³÷[ß:ç<çÊ¥Ò7úsA¿$*­|•Yù?jleææ9·‹?—shŠz‘ÑuNj«T ½d›þÕç"°Ø>*:&¶ÊmD$ÄÀˆs·iÏ­cÌàgл¹Ân`ÿ.%=ì§õz¿Yïöûýþ°†á׿y¿ßï×ëõ~¿/ñ…”Rˆd1`Ô#½PKO‡¨Sd`çöÛ1öŠjÑeçZç\ÿ¾_.—Ëå²i`¹ê_ݾ}{}Û·=37]Û´ýííµ‘ ã0„iJ1Hšëþ޽\ Æ)ª~õÍ›ÿ‹sûÎ5ø‹ÿçÿb‡®^V<Ñ(ðƼúk©¬y$TPEVMQ„”˜@“¨‚ùþkq±ó]Ó´ SÆ4Ø{†J<å 1Æ1LšÄL8ã8"€wŸÅ€ç§¾ð¼E´×“!¢¤ßá­¥`Í8¤Â±ƒSؼú:ÆPŒk›ï%„0Wd\@LœC#Z…‘ê©,"„sÌë‡ à¬tÏ^mèüá㢾d¹^¨cÖt&Ͼã:…Ëײ³!R+Rµl®Åá¼*#+¥`WÄt¸ú:/'V.h¯ùfõPŽk¦qmV~&àçyâô´YCð¾ñ¾mÚÖ·ÍÕõ›¨®mÇ™®â’ª&Ë%ffkLD]Ó2Òêîf†Ãá`Èäûý¾îGy¼]–Ã0PJа72¾½½îºî§?þ³››KŸüøñcÈIÑSšEQ}ôà…T.6Ž#qÚÁ|Kæ’Œ(gJ€ àÈR“š¦Q³· ” à³-ûÎñ*?¬ÏNÀG¥ÊÞ²IYRþjVZyÆâü?ÛhäcT/ë¿÷˜bôªÉ͘و$" :…‰™UœZgçÙ.ã˜Ù·Î9ôÀ!iT‰G«YIaÃÛ¶o<)DϾ_õ7«>ýèmŒ0 ÓápøÙ_üåz½þüùóÃÃÃf³Ùív»ÝnÇàbŠÑ€LšÓv»5iÓÍ•ÜRI“õ²÷~ s}y”R¦q?š¦‰éÀ€¿sßöMë¹ñÞ_]]]­®W·7}ß_]]u]gúe”$“ã›5“žw­»}~~úñOÞýò×ï?|üðío~ ðn¿ß9Qc !ÉûŒ1Y_ª3~ˆ„àècžAD`F ÅP ‚!( ";À$q¿ Þ™{SAM=´‹BK¬ÙÉnwŸ§ ¼ç0 ÅP3DàOç0$à Q£¢¢¹fASJ ˜‘ X‰ISJ£ï…¼ñØpôl¶ì1ì(y¯‹ŽÚ†]×wÕ¥Ôú¬AA•´R&?¿€ Ã0=<<=<<b@JMë½wmÛô}çÚ†É!€z`MDç) tv1TE@²R?€T9 ¨ EÕ³ë¸Å4·LŸÖ#NÓ47è¶ävÈSÁב¶æ®`0×&Iqf²gê]H*y¡»˜$|õó—8Qá囪êÎê˜sô$Íþ$Ž€ˆ¥:^Á€˜˜Ùy$©Å)§é¨93àÄù©I;˜AVñDçNvK@J…¼€¨â ÷ ‡—c ¬À€ sÈ$hŒ,Ú2M!¤”¦qvÛx{¦=úÆ5Þo÷:Œãïîï•Ýr¹Òí6± Ãv¹\.—«Õòúúš™?}úôÿð>|x~~†}ŸtJqf'Ùvûç‹þÊÓbœö3ø>ûåjõOþé?ýñŸýÙû÷ïß¿ÿñãÇÍfÓa«ªæû)©^DÄÕÀ_“Zd;DZwË=)*IdÕ”¢ªÚÑÀêœëÆñàιÆ{«^´Wå^d Ñú1€aJ0{°Ã‹sE“qK$t޽÷Æ,ïÛ¦qæðØ ‡¶maf¤2·”B¨ùµ‘–¡LÛÄŒºì¸€5”¬MûbÐX“zù+îv™QJ˜1Æ””[ç=– BTiü̯H©áîÆ8ALm×/ºÞ9§ˆÈ¤D#$×7ìN SÄ”¨éÀ7 ¬w¢(ˆ2 Ðàuïµsˆ" :ALªUÔéÍÒãÒ}×Äp½ÿé×ëçÍóóæùùñéùq³ÙŒ‡ý8 ÏÏÏÏ»”\à !€ôä‰)u½ AÇqŒ)4MÓ§“BR@aH©%M“DPD#„18gÛ´§ý™Wéë¯ÞYT¥ë:#˜Õju}}ýëßü½sÎà+š¦!gM±•"ðXî?èO¾úóÿð7ÿZôÀèˆ"eÞmÛ)Ì3@AíðÉ{iŸÄ†l£_ånP,'M2k(M9Ð’kõU""à.hl’òy(I:ó©+¤f´˜ÒÅ YgÖϼÀ å¼X€¦kíFæ/2O²œÖwžMéÒÁiPÇn”DTã4…R4Å™ÛRÎ4•‘mÓœœºòšôuAøRµ‚ײ?ŽóÉ’ …("˜nŸ=æ÷xÞ«ôDyÿ! {m Õ7• íÞÒèÍúaëñ…™œ-Zýþ‰*pjŠH )Æ8Žã4Ŧ=vï©-×$©^Òã 8yçågÎI΀`ˆˆ‘© 5±v#Ls,…0í÷û(IˆÙ;×tIå0 Ã4š&åæÓÆ\®¯¯ooo‹ÅõõõÕÕÕííí·ß~ûñãÇç|¨ÒæÝžk¢ª¦¨*fÞ=­gò°lC‰’ëÖê5gæ¢ë¡[VˆöÛå<+ÆùÑO¾Y,«Õj¹\ÚI± †ÐºžÙ¯×ßþ¿ÿq<ìbŒKÇÔ "‚ePF&MÂ7IT¥ì>‚%¸`„# ÏÙpÎN>äÏÏbx²"ePEdUL"¢ÒèŶqg"Jg‹d^28'Ü×iH²ÿ¹æ§Ò™ÙÅŠ@=#_DôM£UŠ„%}À)7¬õS¹ˬçPžÂ^§$f([€­4Ñi’š à*ôsþ¼`RÕÓ +ñ‰/$h}ò맨?üò¾_ÐÉÎ.^NÈ×°Ò÷ág39—f_/Ú™öp"ÿò rs5>5Gy%)!¨‚"31i:O$ÆJפ•c–tò±ò=YQ2á<pV¬¹ÏkŒÑ3y²ÔhH)ív»„äÛ†C )îÙ7e˰yËÌi¼\.¯¯¯ /Eäññ¹l8!{§*)i®DΑì÷ûínónzwuuÅŽ®oV¢©iýWïîÆq\¯×ær4_wJ ‘I“DI$¢™WvçHªzêÎEv4 sêœF§Î s”¨³k:7¾µ‹Ð õÔöhF®±…Ùi<³ûìφˆ¬á®ª¢Ì= ;ceåÈCö-Ù¥B#9¡ä˸¨g.L#—zݾ,€_Òù|Ä6å}ëÜ~òIUµÄR$œQäÊ´Ö½' ‡¸ IDATóÁQHÙÔ#…D&Á†Ðwݲõ׋6Äñí›7!„qØÆÃ8¬‡Ã§Ç‡Çç§>t ‘n ñˆäh`NÔª ­ê’M —ÀPY±ÖÏÈx¨æHþ݇ß^]]ÝÜÜô}oí›nooW«UK£oÞ¾ýúÿì/þåÿþ¿ýËÿõIò­3_Jm3“…ÕµŠ)VGÿõÆà—B$Ì^Eg!Œ „in”‚€*hnMÄ×+£Ê½êŸðL¿úÆ×åÌÀIç49¢ÙÉ7?5œœ·BÁÅä-d=Ÿ¢étÌkuY—‹è© eˆnÃ0 bÛ¶mçÛ¶-$"bµ´«ÎX^Úۆʸ?;ÉP±­òN‰®©ùÙªÈh™Ò÷º{%ïξX¦ñ噿úuü.±}IA¼d_"èú.g<¨vR•_çoåÍ7×…ªœ8KΨåÅ\ðäå[š_”/Î|™æË23zDFð®EO\¶ž™»®[t½°NÓ4L£éõì\R!¢0Å\+·PUܦÉÔü»»»o¾ùÆÔE†!ͨ´9<Þ8½ˆ¨&@ÆývGÌín·³XåšaMÓ4™tßl6¥^£]3@H)¡’é&¾9ÖóHΊƒ .¤r$6æ…4jÁ•(5ŽËa4Öl"°iK á‰gB²MW¿ü‰ª˜´æ*Þûû{çÜ8Žã0:çvæ±Äûx&2 ¶×gôü:k­8ž]~x´øŒP1—°³jBDfdF‡„Öº@`¯ @ȨsÆ›ñŸ}þ¹Ëz¾cË€I@ÁÌA%BbŽž ‡çççûûÇq DÔ4]Ó:Ë5«¿¥U…ßKIfï^ZƳEÃ\Êl—=ÏsyQŽUÏüLZ«ª^T¢OXa+õ§¿/8ÛÁã.Üö‡º ¿“Ï>LU¹­Íg>œ@* (¥Ý4Â3›mJÄÓh̪,Kq&zËÐS–ZJϘ @ÐýdïˆØðº óÍÕby}uY×ëõ&È,>eˆfÈ6e° ƒ\îºÎŠ|ìaW«Õ»wï¦)6Mc©ŽZ™Œs¶¿jJ ¢4 "4~ ª)„QäæææfµZ­ÌáÜuÝr¹´<¯ëëëçççÍÓFD†a”¸MÉÎGDÅX¯ØñL]@:0_´õóqÎ Ï!^&±Z‰“@ÑÕjÎÙ³:sOÞ,~s€qе/"¢é.`ë63ëÜ*ØåÔŠZ{ƒ aŽúÑÎDæ÷!×ZÜVï|ç÷ÎÇC›_Ïÿ‘ˆXëj"4vEY>£ÌÅò¨3V Îyíz¤`}FÑê H˜€ 8>ƤšTS’äÐ%œ—´mÚ®ñØ8öîÏ~ôã’5mäj©‚ëõz†§§§õãã0 *s3ï\ÉÑ¡\³T\r_Àv “·cDÔišÖëõA'jš¦išÕõb½9 4 éóÃ?üÍ¿ù7OÏŸînúWÈól/çs~$ë¢xLE[Ä <‘1´74$b­r!{<I/§ýŸÉËš† >oGÊxýRR'w©Y"ˆV4\®–ÿ8 °³5!"sùÖ˜tê>3h.ÚÇPžÈ\UûýÞrG½÷ûå=×W†ê0Ô—ÿž§ñ¥â‚¹yíW°Á˜ae™ 8J­÷¥ZÃ×Î7¼’æ4–œ×öýljü~!±¾ç¸d_$ès°A9-¹ÀÌLÜd¹eH8§_ ìú$×ÉP™×¯>æü¾Âé†Î<€Ñ!03ü“ sn±X¼½»»¹¹4„ãSJ)ÎB¥içÜ1f)bfÄáà‹EI.5bhšæ§?ýi×uF?»Ý.å¥(Ö{>/’ L‰0¾ÿÞÉ&û¾·V¤öPN3kÛ_7O›ÃáðøøøùãçÍf“‚ˆHJžÎvÄh#Æ#F}½qV6/ )±ˆ×\ʸÙL\µ41IDI‚™û„Žˆ¼W{ß I-î 9‡ÙP0íëæº§ÜÏÀjŸ‘”¼÷ sƒ–—ǸèÁÅð:•»T´sðÅq¦+ÃNëk£^áòNþ>ÙE„Ø)¥9Èlæln³žq}4çí S5+y0N‘S„”4Yç[@òÞ3R$ÃÅDrÎuM{Õõ­óË®/¡㨛ý. ããããçÏŸ6ëõá°Û­7ëõ:¢ƒ„ÂúlÙK â,`çÛgÈ|ø°^¯í+8gÅ«ˆ€¤„Ó$ÑŠÇq´Èhß÷¶GY•ÝK)¥é0ŒãøôôôùãýýýýÓÃÓÃÃÃz½8ç²§ú‘Sv0ieaêE£Ì°9œ‘Lìõ0îÇqìûÞqÃÌ]7cgš:âr{o«S#,fT„1¼ˆd™Ü4MH±¦Æò,”!ô §Êdp¾™Oâ…Cÿª„>r¼¢¾él|\Œ)¾Àók)´žÕœñCE fý;(hIÂRÍŸ A €³ù èBŒ€jB?…ˆ3{tÎ9bòÂæä·kYg¤q¿‘Ýn·~~:qÖëõÓÓ“õéÙívŠiF³íæ4:Ì¡wDCФ°Å·ÝgœÏ åžf¤qŸ|Ó‘à~÷üüø~‡Fï½SDT@Ê &ÇhYßbê‰U- *3„ í SJˆ(Ç0Šê¬ ÙiDkÚ —ùo¡•Zç œ¤ïgð:#¶ç¥*·y~.9ºË^¥6¬ì-"Ja²4–ÚX)!Ÿzé ?öëóyák²Ç±ê {'Æ(‘Ô{fÔ³ÕSÔGÔ^ó÷p}×w/§½¤=ÏÈŠHáqö™ãɯVLU/ÝWb¨? 0ç@é÷/ço¿^r5_´—µKó/£lnÍŒÎó4ED4÷£å 9vˆGå¾ðb®†œo!`Àq[«Ç?qE_£)òó/€ÇDPf&bÜuÝjyu{{ûöíõá>pîÙ'Q­¼Ø1O)ª.;^6½DI½÷}ß«êçÏmÛ~ýõ×PȨj’ÉjFÍ3­Š !Ei;J) ÃÞ|Ûª)¥puue˜ÀÖèÌôM0£&ˆAvÛíýýýo¿ýݯ~õ«÷ïß¿ÿð±0»’r¬ªtÚ=µÐÌF$D”RÔ&Íñ4û)·jÈŠÔœÏì]ôÞÏ݄ڶµ\ÜÒZ­4p+R NdöpB9hpº:ÛÙÂÙÊ€1È,‘*ôï/²ù8Ÿ(¾ö7ýB)íÙ¯"R$r¾š\:F¨ h}/Ln”"¼^tˆ 1&&J bH!$Õdú%Wp¿’˜¿¤#‡€jmÚ“X —£$"Z,wÞû¾ñ–lÿ¼ßîv»‡‡‡§§§õzm¥ÆÃ0|þüYså\zD 9•½gôY´p­¼Öß{·úév?¥ñaûüÙ‘¢&raŠÞ{v Š H8ƒ? ÏÛ?ëÎ4 K¶®å˜Ï»wq«úƼÜç¾î §âgÍú$»õ„ÆÃìë(ˆ€„tF1x±ú0] s XK+D;á¨æ癨Ø;o§Hõ0Ó4ˆÑœ¤ª)‰HZ-¯g„¶õÞ PH )ã¡LÛxŠX_OÕ„¦ªÆ|w»Ý8 ³w¨ÊŒË¾oÛ–‘»Å2'ò`šPôÞ“Cî<"’æ³!ùpÂë‰ý|2¸G”+d¦³õÏ[R€¦éÈ´KdrNI©J)lZUùBð$AçÆJ(€DÇìôšA\â)‰ Æ$1"bã<¨¨ôM/ ?å$ ÍYýÅYƵø/ÄQn—NÍ´e0yã2oe@Dð¾ADAš‚HL Ǥ1&c¼ˆ‰Ñ(Úþ¢ŠDÕ¢ 9v³¢8çóóìÛ³S@s̼"蜜‚ˆDEƒCvä<·Î9ß´ÔxòNÇÈÜõMÕ/¾úú«·?¾[Ü:m¥m›¶mœcPµ†›ÈŠÓ4ÅÖsbFr€Ã0Y(Óû¶ïûãnwHIÍ_-"}ß¿{÷.Æhu½ ^˜|Ó³9ë¢ó.FÙí!¤år‰ÈDÏ"p8Œ»ÝÎñ½÷1N)…”BÓ4 P×-ú…[výÛ»¯þügñOþñ_ßßßÿý¯~ù»ßýîÛo¿]¯×fR[³0%3bJ·Î¨>IP@"‡ÜD%I@„çÊ\‰`ëB/ÎÜïVX(IFf~Ø}BÁ8é¢[¼¹¹Ýï÷Mã›Ö­î~4ì×þMó?ýÿ#þ·ÿçßýöÃýÍÛwOÓÓä\ƒ QÓû§Ý¶%ða2üá”ÄÅ8…³(’0¥@Œž¢Â$±“üÿ"}O‘ôªš¦Ñ:jÌbaœ\Û¶ìÔŠF s·bÀ¤ÇÞÖ-cŽ&8¶®²È„ªQ„T"ô*0©"³Cf‡HÕ<‚3*:0 bö{Ï;ÒåDR²ôR@€€„HBl °Q!î±é›¦õ *ŠHœ’NB|ÇÓ÷}ß´(IHÁ'И”¢ˆêúöfÙ·û…ªþìg?3§Î~¿¿¿¿|||~~þôéÓf³AÄq?}ú´Ýnàj±˜¦)"zæãa·3OÏbÑ™a¦9Tl\ú»‡?þêÇëmxø42´eåEáÂ*ǽü¤Ó¸ôËqéýK ´0îò±y{ø“ûe…îÒ¿<¾ü­,˜w/ ¦éÁE¿.Ó.ß-ƒÓÜ«úÊåÖ/5ÜZ«5ZŸ™TαúÂÊy|§R<Ï¡²ž_½•">}mœ=é¥2°zY´Rù¿ÿ„m˜NÚ4 1’ˆÄBèsudÛ‚ˆÒ…$Á³[5 &@ÙÜã 0KB^†“q®ç¶»ÆxÄ,«×s; •R3Ü“5|¹bªêœg¤\œ•ª” ™Û2³K8¤ÓèœSTLwaf"¨"ÐÑWuo±ÈÙ”‡MÆ¢¹wwwÅG·Ýnë`Qøáp(úkYUsØ"ªé©¶,ÖlG'B2kØ9¿ZõoW«Õí›ÛûûŸÿêWßüâ¿øÍo~3M£sìýbw˜÷…ª5}ßa \Vw¢ùåe‡lñCf ?ëõº†À¥»»·}×죤§Å²{x~úË¿üG»ûÏÿÕ?û/ÿûÿúŸ­ÚžþÅûß„DÊôü«Õ4²Æý€„mÛ\5 v‹«)„iš˜YØ… 1BëHA@$ADNžZïˆ$| XÛÜ9HhçùÕCz$ø—øÙµY/Kœáùjv‘RœÐl‹X¨ýKÆÙå‘ËÉT¹’""(@M¢$¨"*¢IHL0trëŽ`RóB©ÎN¥ù6ÿsïk[–1æœk­ý>çÜsõèî*·Ýi¹c„øÃA&óa‚À$Q¢ÄK|ƒ@BH"á#˜G J”)– c9†Øø,GØ(n»m·«ª«êÞªû8¯ý^kÍ9Çàc¬5÷Ü{Ÿs«nuµâ©«£}÷^ùï§R’ކ1óǵJ•†ß{ïonn>üðçOŸjbº%(¡Vg?tB6€†$;"¢9??úÑG÷ï•ÛÕÓ6>­Û›ñ ²;HÚ‘N¢,ö‹6Ü™¶q׸›þÉô€'ê܉äŸw³}µÙÏn bOy;Â'½…A=a cû ¾¤ÁwÍœs”EcðàôÆ”H6½_: 8ß­nß‚ûiQˆ†Š¢ £jPXÐbTã ‚D‰‘E„C”ÁiÐKa¬#c”GFd1€¦/ PVnP”…±Ù2³ÚWÒI©B™À>y=ô'k5ö°LQ0ŠC[dÁ2dŒ ¨(&ãÙðõ7½ù…×ßxóµwÞyç£>zñâÅb±äÄø“j¢"Hš‰>_åÝbÓ¬jIÜ÷Ñh2ZÞ¬on>þò—¿çòò’¬a–§OŸÿÀwõko¿õh:öÛÍj<>¼ÀüÐñ,OŸ=ÿ­ßùÝõj^™Œ¸å¦-ŠÂ¹R¯mQk·ÞŠJŒ‹$Ì>ÙlÁ£]æüÜwm^;{®h#ºCnÚ]cÖÓ—^CHŸ)‹§þ½ÌL6UÛe•I©³½¿Ø¡¿ä”´È‚Ad ìU×§2H ¢€´Æ8c C† ƒ´AºD[ôé-ØI'¹¾gúÊ€*üF#fÖ¿ _ùÊWæóùf³yï½÷–Ëåb±Ðì& _Ð_ õÉêÚ@”ÂÛßõ¥Þÿzä¸Nê]3ÉT=Dlš&ß”Fu<îò±Ý%ÿh•DXAòå¤S?xo΀%¥O¹šr‘ÁêŽ?­z—üžØÒ€’†1ƪNÖãgþëÁÅ; ÞÇ7ékÖZ/Oí»çg‘¯â®õÞÅQr(afì?ç–‰=S?IŸº½'FPk¿Žˆä¥¸à@í€NPSK 3çŽí[GY–€1F`1ÆCGD«zž|¼WŸf—^~K×UÁt-×ÉZ4©Mdúˆ›Q@b¿Ê$Ðì€*?ÜÄtUN$÷‹þÅ]\t$H¨Sé›ê ˜ŽZkÉZ²&´?""¼W¢AÕ˜c਱QD‚„w÷&#[~úéQÚ[&ÆØ¯j„2ÝDìô¤4Â%í "[•seY"¢a–XLBhÛà}álAD@<ºáðÁÉÉôË_~ûùóçßüæ7ßyçgÏ/4›@zÛ•ªÉ •kÌ ´s]%®c ](Y·™Ðãïâf1™3<{~À———÷ÎN,Òÿпôàtf€£÷VPÚ†¬“Æ×~5œ|ùµ‡_xô nãÍrõ»ß|çúúÆO5vº0v»©·›º,ËA5œÏ—DT¶*J"Zê’vQiªz˜RÎ1Ó‘È;33dM_à£WÎÔ1/’“µ*ïSé‘’T Iýý Z&;«Ü…•É­&d-hqK±‚ŒdÈXÖHˆ°«ÚfÔFߢӮŠBCÙ Díȉèþýû³Ù¬mÛû÷ΓáG"×××›Íæ[ßz×wyÆ[µÙh EW FÃêƒw¿Ù¬.†„HƒkÊó€!#å9ç8ØE:²³½|„»JBÞFõ-“œ ·²áÏ6^š–¼S8öpg•Éâ¼…÷Œ”;nZ˜Œþ¨„±óh¦鳞ºÒ‚tœjâЧäªÉqÄз³!’™»¥²3ÎA&é'À` *.w²u?âmÆ ¸« âÕ"ˆ;f¿ú·µùhª ƒÉx2 pN‰àš>Mþ”cÙè3âö¤‡]sQIÏË Ç( z둈0w¦<“´ÛIÂËÅ žj€tμS "bz}_gnO†Þ‡clcà™Y=Í;©1Æ]‹Ì¢(B†¹³=bì#Â1ïõo¡©kýo²¨HáÜl:%Ä¢®Y VÚ (=àI_CJ]•777‰©§h&fÞl61J$ebŒ\ˆµ¶fçÜÇ(‰ž° ”…,¨ãÁ}×eÈ  çÇ·²À|»¨ï,”ÚGê3’tøª:? u•Ԭݭ)-TËut„Y‚ÄX’«3å¦8Ù$Ct‹!Ât¬o¥Ã¹NL½ÅN½{7Ñt:Õ’pЪüýßÿ‡ëº^.—«Õj¹\ÎçóëëëÕjµªÃ‹Ç~í{ÿÐÏÿôïmýÍÐqÓ4ƒrj1ålÀmŒ6ë+m(½ÔH,ûdú¨ÔÀÕ“ãoŸõæ#§õù7ˆ‡&èäD‰=eéŽÄʆ- ì“õüàsj¨ß«½+íÓ4Ûí6ïˆTˆã´_²9/ù‰ûÖ¤ÞûØ—í¥LºOœ8Kï!"ì4¤Þ‰ÒŸçŽOYÿÆ´EZ7"Ü!Àñ®¯ªkµ*zUUe]*÷U2*}XÃËgµ‡œ/Ý´¤‹ 6,á¸s'ìMÇT–e, ²KtQN}À³±ï”«eýÓº3€¼0]J“Ó<ÈD¨cÊnHükI""T“¯­ëÀÝŒ±ÎUд¢jØ‘8 î¤%pyméT˜b49瘰( =µdÎÅÞ€ ½±W#ÕÃ^ãÔrQDÔn·ÊeŒ1ˆ†™…Á9gŠŠ9)gP–æáÃóÓÓ{g÷îüñÇï¾ûîãÇ/..ˆh³Ùxï­±¹™MR­JÙIÿ‰Çó–˜õ¤©×Fxöìc™ ªÌ÷?þÄÉÀµíZûóDéBPY¾Á( cˆÙ{ˆu‰åêúÙ|õ»F£ÑÕõüw¿ùŽãv<zï›ùE5¸r (B ˆ1ðÖomaÎñ.(7Uæ‘ -³$w´”»õ2$×’ìDÏœ0¦ç#bìwT‘-BjÖ›ßñYF.ØbŸ¿™hŒŠ}îGGu‘Hˆ5Ö€AC±©su%qWÓ• ¡`WR5]éK¼%Ö f J•_DÄ9·œ/ˆˆf:‰È£G’MH“×—Ëåf³yÿñ ôͯÿãÚ§Oê°,Ë ¡´ê@†}nw¤g`IÿéÇÝ x×ï€9%¢ŸÄž‰;ïgàÊIJ,0ÿ »0‚þ½²g\MŸ{Ë~÷¤ñ ËuAÿÞóaL»5êA¦xï½qö»yîû’!½ú«àâûêµ1kíû(jOÖAÄ&g§dêZÿ†ÛÏ]ËÔÁ^é1@DÉÒÀpÏ z;¼)’hÊǰ”eIDª]åÒ[ ‡¾kà*}¦;æŸs5]8àî@¹ÏÝL˜b­‰º±½4;‡íÑÈùù[z’×1àìhzµFÁ잆çèö{ד¶kèº69Ó'#‘uÎ:{"ƒ0w‰‡AÏò“%)A‹’ÈÉdB}ì"æÁöi:š¦AÄ…4ØÛç\iŒÓHîLj&„|tÎEéEˆ( ¾SÙ`cM2H¤£? ™Ø÷ŠÂÎ6ÜÓͽ2Ðïa§gwÌQ°Kjb(€†±åh Ñ kQÕ(Ì‘YeGµÃ!iýV•&ÇýšáÉ+Œ»dBFijى‚bˆ¬),²¸¾Qf¬1ƒ¢<™LEäí¯|ÿúòù?ýµŸó²vKk\훊ÉIVDÂô¥^eãnßêcM:ý=áΜ£ôdÚ¯¸”ÿôªAv 4˜YoŽ03§ç*Î%¾ž²ìêŒç„FÓ·`¿k‚Ô| +r“{è[W¦¾¤Ÿ¿æïzÉ>$ËÝÒœïº!æ®öS.Ó¤=¹KNË(¥ADAºn²zYÎänÞ{çÜ ŒÇãÑ`HD¾i5ó$Ƙô³NEþ ÷ zwµAܱ®ÞfžnOÀ”'½*"ê³ïÕÁû °Ã‘òw$511`ý&&@6YtBˆ6ì°êù˜µNV@eAÄÀ1G:ÑÛÕG]›<›ì· `jb!"í¡¤¦`%gú“dâ]¢BM³«IdºND,sŒ¾§TVD µ­Wâ¨iBÌÒ4-Dñãñøí·ß>==½ÿþÇüÑG]^^~ðä=ÊõßßtƧdeíXrÂé|õ‚²r\Ñx IDAT«ÕâòòòÁ½óòË¿°^¬«ñ¨¬žÚ6x!C䄈Р‘Èd¬pX/…õƒª0†P‚4Íb¹˜LOžMç‹u½¸¾?›ýü«ŠžÞ,ç½÷Ÿ_ÝPYT‚™µ7C:ÔÊ€µ,iæëÍQ±¯lŒ°3AC¦–Àá-½pÙYúøåÇw€ ŸyˆÜR DéîÁZ߀3&´Á{/@À= Ckê>PÓ4C‘(¢¢"jÕd@Òp?íXÅ}ÓÕ¢(T@WZÍ}©Ñ¦i4¶Q›yhÇbI‹ªzº\þÌÿñbøo hÓl†åC;霣^ÑDŽwD¯•îöâªwEGË]šD21äט#·tJö§>§S©j§gàž¬M½-W8$Í qƪÎؽ»3Ë1€P¢ND¥«zÚµ—_”Ö{ÀK êÌžQbÔâ¿Ì"`m‘®g†¶UÿVg‰eæ¦iæóùÍÍM]×Î97¨ k+[ ʲ( [¦tlŒ0iÆvWkßYBƒ1ˆ&”iµ?ãºØ(g É4ì1É`ˆˆj¿Õù—Î옎A5‚ª›j‚gæªÆÊ§Þà9ÿ¶öv ì+"©…swµƒ„êÐX!³®;g[.‰€s4ŽNOOµ'63___¯Vë[ëÈØ¢»¬t”\º7_Þ!)xö˜µ@HçÞH$ ˆHÆ ŠÖED" Æ’s…±DdAc£PÓhe9¢AÒb,ÆëœÕmʒܬݩýŽ)̨SO‰n2J‰¥5¶+î¡”‰ˆ¡3ÎÙ’ŒA"Dpˆ ­±ÌFYßÖÑ‚ \¯ãjµ].6ëõvÛø– ðY1œo}57M³­kçœa.­-«¡k«²Œ1ú¦Öjá®!0cdæÊÒlVÛ¡såéiE4­ª/^\__¯×kS]/?ƒˆ˜EbÓl«¢h¶KàÅŒ#Š?99™ŒgH™›¶Al»6¶²ç*ÔJ8^[µ²Ž'e½^1³EüÒ›o¼þðÁw}é‹WWW~øæóçÏŸ;=9i6ÛÉd¶\.™ùš7㢚|ýçNš0™ŒÚv‹DN›û ÀÎJ!QêÎe3*+ñ­©<€NB´­cU ‘ÛÆÔí•1æõ“áëÿü÷2ÐÅÍâÃ>~öâ9Î&«Õʹb0: ›ºµ¶ g³o BU„ÈÁn*Ή1à\ÁÌ>CWB˜H+ó£€à[ ]G°¦@àLÐb#=.#DMDçÈ‚í´W‚Tƒ ±«„'˜ÉÄhCCDà@S"„ ‰9"²uF€5F¸ª†MÓHŒž ]ézÚ.Áb’ç¢k¨tÛv[•Ε%õ1ÜÕcÀ@…g+ñ !TH‘ÙGd³Ö4µfJ-ùbå¸@#YÂrµð¾½w~úñóç÷ÎÎýÂ|ãÿûGÍò7,¸±`†Ã2 |d$qø¬òË]·¤C:wuãý²V°o«T†³:ïÇñÒ½èzûóå²V€é½ù8`À´oAÍåÐWj#U¬ œ~SôONWvÏßQZ;ìdóÉ#x æ¡u.¥·VQýž¯1=3]™¿ë`'s±é%û›_vס@oJÜ7ÝU¸ŽÅƒÁ`Êï‰VÙiæúvÄóî zõûD58Å:ôö!éRéËübÊJð§Ý8Ø8Ü+é'R@SÚŸhÌŸFDB(Ö hs\×ÛÍvÛøVeYŠh‘¶P˜ì«}I,NqÒwifùÔ¾'"UUœœ$°\mÖ:C-‘û!Uš‰HKTª¯­)´A½FlyáÚ’Œ]Aˆ¼¦`úžˆXUÕùùùd2yðàÁÅÅÅýû÷µÖ|>×¢])3J«cŠˆù¢‚Þÿý·¾ø%f&gWÛÕx:1Úož={ÿ¿g°°P×õd6‹a¯] dv‘cˆ:øbUŒ¢ˆ "³Édø•Áw½õ¥5ð‡~xqyÝ̯% ¡]o–[Þ–®p®,˲°Î6M³©=«‹Zkº’dšJT$ƒJªŒˆjù“ýʃ"bzîä×Ì !õ–ä¦Þ!‹ìx+~õæØ´o#ĹŠN½ÿP žðJoLwIÿ™7}Ã^ Í9"ö 8Ýž˜+e¥GQzÝMxJ¦Üð\m…Lþ0û}UïZW0Çÿ%[SLKÀ}óo>Re¥ƒ ô,”8j3;µöÀþÑ즴?‡»¦÷™‡d#KTH^ü¬ éÞÑbªr½l7áÄ[ÓOˆ](œòà4‡^œ¢[a ‰@`#`$!ò²Ù.ëM<*ÄŠHUTgã©)JcL²$"¥¤'„`ɰïkY÷òP‡˜ŠªjÊ›L&úLex|†Èê÷!""߇biH>Í{oÈžž‡C• Ô`Ñ·ˆŽ£1F"3sR­¯ybZ~d<Ÿ½öÚkOžg±uI ’ý‘¦Aû;¡4'»p$ÞåÛ›/0•ƒa­3ƽ0ý€È¡ ¾ñ¾‰!DöeëÛ:x WQÍ`6>8»·‰bŒI…Ž“ˆ3Ú”Ž™@ÜÙ]Œ¢ÝÚûúe§§§J[a±ðMGÈÐt‚vì›,¥.LŠû„Vùßt:­ªª®k- ßõóf&V:²ÃÌ¡ÑÊ6J¯«ªR~<ÏÏχÃáýû÷///ßÿýÇôÑGóùÜ{Ÿú ªlgAÄår9=™Õõöf~=¬_ûêWþïý=òâ}8;›5ë­Îùdv–·ïLà‘CH~XÇT7nh5ݶûU£kcŒ§UÕf¡u³AÕÆ¸X¯^¼¸œÏ/EТ©ÊÒ•#6¦©Û¶mÉ@–Z-jóK¤3¬ &È'œ&™`˜û€;u‘ƒtzºö È·[š?íHhú`ᘥ ¨"+YŽ1 ‚1‚ôf§.66ö-/ ÁÇr!ú¹iZ‰,]›D”È}zu~Ý(9õ±KVÒdŒ‰Ì|µZŒ&㇯½±X, ˜Ë‹ëv³Ç¿ñÿ°•1 ªD¶ä†ž°¼£[æç7^•a'fÀ}9È47µéî(N ®!Ê{9ïœèK¦Š%JšsÊ Î¸¯Œæ,?gÃðŠ XY£¶ÊÒ‰ü-°O|ó­8ÞÀþ§KA‰s_Õ%‰IëÅ#Q&ímb ùÃXï­¬åÛ½>×Àã>ÌØ9wzz:›Íš¦¹ººÒJ‡’YÌ>ßi¤ÑšT¢<ƒ¨q$Ͳ99%N¿Óù±°0â>¬°ÞÊNýHfìä€ÈÌ¡õM“þµ!„ºmB±·1VE9g³Y»XaE˜:ÏÊH“¤,[ƒyË̘ƒµv6›Yk}Ó0óv»1b§~tÀ™z-PcŒQ¬á÷³Ùl<Çëºfˆ»zÚÌÖbß[Mߘ²ŠS”Þ¨å‚=zTÅl6+ËòòòÒ9wss“‚ê1¡­i„ˆc¨Ê²@ëíOÿÂO”´-ÇÆ—ãA~:º-œœF%(=@çœà$Ü=8@.œ£²†‚c"ú†ÄJW؉•øÅÁëóÅòòf¾Þlšº&ãи3±–ÐC€BÌ%"šD)%ÿ+"ÌÒ'5Á‘Š™#t-¢cÿ@W[¹ È?°ºШãÑóv×ÜB}—dôJÑûÌ,ÒiÌA„cD«>,ŠA´¨^¼Oç%}f]Çe ¥PëdDiiĽÔêt¸÷NNo–«ª¬·Ûº´Å½³“âlúKÿ÷/ü¿ù×¢_Œ‹áÍò¢0C3N 3Þ%“åãeô o7Aß9øŠ|ŸJ ø€fI©×ä_êœ;ÓkÙ]•˜ò'ЯÝ3ƒáNs¸•Ð6º¯“Oýµ—CÜçdùôn= îàz¢œBe´Ð·)MF0E •ÝRÿcŒì{|6$ý÷]Aù®Oøxª/ùïñH¡WcŠ¢8=M&X.—J+Õ²Ô‘ïÐ8€C:¶^¤Ÿ8ÛXÈÄCÕüÔu wkÀIKI?Šò[‘Èc\2äãˆ,J2 !¶ÛvµÜh·ƒÅÍ\É™îvQ•Ì)²L…®’R¨à 3sÈ  …zÆÜ…’Zk'“ÉùùyŒ±­ë¥F­K—áäÊboù"zÄe1˜Ïç‰\N§Óáp‹Å‚‘CŒ<ƒØ¾òheŠ$qJ/ÖÀp8T{‰ôIœ“ÉD4Ås¹|ôè‘jÃ××רÕr/..Æã±íÍõÕ÷ÎÿŸÿ÷ŸŒñÛš™säÜr±˜L§Ëåòôô4î‘àVDÎEØ\z€šÇÉ}3ƒ®‡HÝnsUU0òêj雺T÷fã(¦<ÝŸxmÝ^Ío®®ç«ífãÃ`0p0¢@r@(‚12Ñð>^§sÔ³’#AW¡BÔ컄b‰[” r@±îBÐþ]‡’%å•$«ž!eu‚™9" qW?7ö¹¹†¡µŽ W ˜àcð BHÝêôö”ÅNvWM=Æ()ÿwbVnÍÕ:q¾ñ¯=xXo7~»zþüñÿúSëÏÿ;ß3L·a`‡Ã3Ï[¹YÍw-*ÿÞ:îâ1¯Jò^þŠƒ…©ÜšDBèa··ÎïªëÝÊœŽ_®¹õúDñ=¥ýq|ýÁ‡O?¿Tî¨Ò½s.r8 ¬Òë[x¤¾#bòÏaW·…;SI¯§R ‰|›¾ñ¸ëµuvæ`Q/?â|b/¹øÖ_?ñÉáaY–£ÑèÑ£GDt}}}}}­uK”¦Ç¾aíÁn%¯ ´ú"褑Hôo?” `–¨j"ûh†ôe²æ¥»òës?ö`z Va¿ŽéN>`0ÆÆ9$ß´ËùJ"7íöæê*„@½ÄPU•TbHílš<æú²šê£¶\ìyj‡ƒØÅ"ôˆº=Þf’ÑZ{vv¦Ø››ív[·M'²“ó­$J:[&OŠRÕÉd2¶¡õÞÇF|Œ±m½â€s-Z=j;!¢$±iËÞ´ÆóóóÓÓÓ³³³ÓÓÓ“““Ç_]]Õu}suål‰øðäÞ?ú™Ÿ9±"À Þ“s0™Màôäúþº1i-ùaœî»˜9€G1Z¬ bŒm˜¡¶õÚ† ŸŸ‹HS××××Õ`„!ˆEY,O§¯ŸXkí7¿^–Î Cô‘EŒc¤( 1jüuɱ}P!‹tÆ@Bm5)!"DÕDQ„ « ]rî"³ò…ö.æO…n9Zé jÉ*uØ) )¦hЧæ+ˆÀb¢€ˆh…m`-3I„¡/¹oŒaˆ‘;å$…;„(;KFŒ‘¹#¡Z¬F™sß¾‰›8N‘L½Ù>ûøÃÙˆž>~çù»ÿÓdpáýÚ7r2yØÊÊibs2¾o¸¼:+ý ÌtM"RôÈ úáÀÄqLgF’én%^ùgÜ·<çüû(°tyY#ë[Gª™¢ •‚neQ·PÂÕœUkÌG²9§Ø«Ä€SðNJé;~iNñÓOù[ò‘KÊ/,ð÷'_2÷‰.Ãáðìììêêêòòr±X(¶ð~'‰|Âp`|fŒ‚Ô•€ì0ôùûDD?’X2î`XòTé;Ü?¹ƒ«¸›t°ö<&ùn@,ìÃ-Eò#¢AB4…u– Dn6[à°Ý®7«u ª8kB TÖ¥Æ"JÝ6Õd"©:?‘Ĉ1ö  çL‘ê¸å‚ìt<‰}6°ô Þ9˜Y!©Ê+gÑm£Ñ¨`€9D 1vY”"âê.P6iKÚô)qDîS8«ÖáFo½õÖééé½{÷Þÿý/^,çóÓÓÓ>~l~ûŸþz) ÐÀZÖÃѨ ÍvÛL'SaæmßÅ=I ïŽG~p;ðèáÖZYÚØB KdкÒÚ[&(‹ lV‹èƒ³öÞ½{ËÅœA$ @Zˆèˆ¿ï}O`Ø6ÍÍb³mÚȉ 'u3Ex"¢Ä½)ìɼWŽ#¿Ì€$(H„½×ßjAŒ¬€I¾ê½| ~!Bó/½<ûÒÔËU?+Ë@ެµMŒ(@,šn¤s]iÝ …«ôn­‘5Îúì^k-‹èü™9µ vië>Ó÷íÈO–CŒ>jÑàÃçóçïÿøýø_øÓÿHíÜÀ¹aÓ®MaBiFÛves“§4ó'ÕýéÇ]ílènp…‰â8×IÀÈ" ‘*ñÑtE!BãÎ8–0ˆnüVóo¾j}`UUúß\L‘»h»Ýäº8BB;ò¤7ÛÕÕÕÕr¹ŒìÉ€+Œ+ ’LŠÒcCc‘È1¬W_3™N.–CEUiEI-òCÐRà†X|ªP¡hP †^]CDÉZu ¤¿¿zv¢hP•c€ €B…Zo4•Å’|϶öõÅ4+ÝîÅ¢`k±…v™N§ÏŸ>½¸¸¸ººÒZqÚ|—™;œÛÊ`Ó‡ÀžÈ–ïÈkÏØsÎ0¬1Œˆ¤%ÔÖZkºzÝÊ%+5ŠûiBeY&K37Á3‚µÖXJR¹J+–Þ>ˆ¨­»‰º¾ÖY|‡Ñ!Î9‹HB…5S"m×è (J¬*aÝ.8Æ8p(ÆE…ˆ†Ì<˜Þ»÷ÁãÇÏŸ?O¥øRŸ‰t¬Þû‚ª&º4«ÛÁ£€3¶( !hP ZGšÕD„l9;=-ªÊ!bçCd8v®AcH ÖÍÆX,+·\Íé9‹Ei+WF ºä΂3&¢ˆHˆa—ï§—1‘K“U~®W«7¾ðæ“'OƳéëo¾FMÏ&ï}ð~KñêÙ³óañõ_ýU®7EU¡PÊÈLÀ™ÂŽœ^Ù€ð®Ðz¢?ˆx Hì@‹D­¿HzØ]”EC@ÉéÖù¦\ËD†`<œ¤0u7pÝ{c`a2bÇ¡$ª šœTzšëõz>ŸÏã ¢ @"& €•X« 8¨*Bô!0³õ ˆDÎEBFÓR‹€ÀW8´û62·;ž’ëX£€0hˆH€"AdvuW 2ƒ÷¸­cÓð¶õjeq΢±9j!JÔnÚ€5öZ|Ój[w"DBFð‘ÛHU¥õݘ9DaAah}Œµ‡ØT,kÛ–=wÎlˆ"ƒ#7u}ïÞ=Dl6ÛÉdruq9Ed!lSU6nÉ„Ùÿü7ÿöjñ›¿x ë²P*äÚAa^9‹Ž °Ÿmh®»ç› -.Ú§ƒÔ$̧ÎìÖM2öÅîÒêr†š~J²ˆíÇ òt¦—¤aÏóÖA´ƒcý »Ô¥0‰JæCWÒ2b§ +Š&éJ©jú¯ôNô|Ó”ÈÄB~ýŽŽ‚òªcUU>ÔÀ«/^h3N];$øgñÂß2ÒV$ 5?„caâÖÛó»à6ØËßÒ y™ø é,ú Gpô¢NÓµV8[¸¢(e5p…AK&rìØ¸D–AB1!°–uÔ¾xÉs‘ú$ôÎÔÃÚ™iÜÛØûŸvË—ý˜>U©Çãñl6S(Ýl6Ì;ó»ê+ЗW-V£ï-ËÒsrv®b±²Ø¾_!Ôu­qšÑfŽÔÕP´no)B{0™¾û­^{íµÅjyqyéÊâüü~Ó´Vè7—Ë_ùÕ_]/W'ãl·Ûj°‹ºJ§£ÿMfçdvÒá>œ;-­Û; ê×Ò俦mOÕd“’ªw% RD’%ÃóÆìájSßÜ,æ‹å¦õ@¦p•)œ#iê¢q… 1ÆÖ#¢µNȃ´‚Ï­ ÕhŒ½+0FåÌ";ÓÔœ@òõJ²U«Ä ˆBZÜ[GòhÃxîMÊ‚» ¥ó†ôªªz":s[çLQhènd1†¶ 1Ñ7zï ŒˆDö!F/A$jQ´étB@–¶m×ËÕÉÉIUUó››ÈÍÙô›‹ù›¯ßûÇ¿ø÷ÿúßø/+Øn¶8ÜŽÎßy|•¾‹kcg¼wB‡½ùç‹;¡2áNï¸,fÜ7§ Éa–ð«-öÕGò±É¾7aTÎ&‘z“&쓼Ví5Z’cçôµf×€vÁú&E.䛓öäà¿Çq€Þßþ¸õQ:7eÀÞûÉdrÿþ}"zöìÙóçÏ“™!*¹+½ü•Ç±Ž‚‰ÜF+s»Q:;c ì1½uébk-2š£B°=µ‚N> *ÕêÊ¡E 19kœ Óéôl2FšÖ7Þ{ߪƒÖ «½Ï0¸À= ÊrT,™¶nêÍFK¥À‹Ø·$éÿ7÷o;€ÁxŒõf[  €™ãC²H”¤’&ÝúV°9Fäƒk^΀óçt&èÄøõΔ”cƒA»žŒÞŸ½~ÿ¤iÃr½Z¬6õvím¶Íx6GóÅj³ÙÕˆ¢÷ž%4¤-¥Ë²²%ض‰"‘È醃@›VJ°ADÂŒ‚"€,‘‘A´u ˆ{€ävM0CYéT•:¥nxÊ¡×Óúî!‡éj¸Ž1*Æ^ëS«aÔŠä€dv½éDd³\M&““““ùõ÷~»ÙÄ_ãÍùu,ÍéßzçGÿ½á£õÚ¯lŽq>Æ»eó[Ç«’èÄ8{a*ö¸Úégz*1F-ÆÝÃkBéO˜gn ¾åÊ=£92cÂç2|Þ•øJ>¥‘EÊV}¨Ê'ÙPëoÀ~è ’x·‚ÛÐ÷%t܃d?éóeÀp´·ú.U_¬µÚY–ˆæóùÅÅ…:or»È]î³ |©ÐG–3¿üì$SO!SVÒCô×ݹhÝŸ£äÔ£æ`‰¸/¥í¸Ps±+ËÁlvúÚÇ秧ƒÒͯmÛÖuÓ4Mð‰³%qdE9ŒAd³\¯—‹d5ÞM\hÌÜZì¡%‰³9DÝ%vtËánOªªRײFµŸ¨"‹)§#å]%„4´û›q''''''*®‰HuÕç‘'üí9p0YAc}‘µöòú£/|á ïüþï=¼ÿ@¢¿¹¹”Õ½éäýkÿj B ¾Ù'hÚ¦²»JLÒG*pƒ³fùy¥ÍÉ¡öÑùåy€›éF z*š_“¦!}D›r$4äJºÑ½é™'gç¿ýÛ¿s}sÕl¶Ln2™-./¯ß8;ã€@D8‚¢!HDmχˆÄ‘E!› dxÊ‘QD c2´khKXUFzÆç”Pç¯b„ f‰‘™ïï•‚Ѩ{bÔ4)6h­’Oˆ>4!„m½©›zŽ}ìˆpä Å=˜£ÜÈÁ)¦zT h D$‘‰h6Öu=›Íž|´üîïzûã'¿÷çþý?ùûßø¹ ÊPÐgúÊ øÕiÜíï¾ Îø(Øz é/僢ôuöõbe?xT ïn¥¤9÷M€ûìïïÜH"õj÷©®9Ì%œJ²å»”î=Ö 鼿{Ê}¢ùæPÖ‰6‘'Èleïý¼ö!—oò)9ç¶Û­ŸƒÁb±xöìÙz½Öb­i]Ô‹&óù¸Hr‚µ·RLí2óN~X鿈]RÇ]Юß炚½^È;>¶ÞI$5!DÌÔÍô(k­+ c-²…)A & IDATÇ£ÑùÙÉxTN«¡÷šþÛh‰ï=30™v[£Àx<žŒâz¹j·m$:1õ˜BÇYƒ9Rç;î‹3pˆã¡—i¿œØÇÿÇcqÎÝ,Wóù\élêocÄнB#unÞûºíâcµ68ö™K"¢¦ m}'$I9Tê£Ñަ“ÕjõöÛo_<ýxT³rð§þíÙÔþ¼rMã-ç¬+&õv[(Àå$…“œ½Ê±)ýÍQs€ÚîüûÎzðØŠ $EÀd­7‹ÂÇèÛmŒ‘lá†Eamquñü‹o¼ö}ø{Wëæw¿ùîv}3žœN†nq³FƒÁÀ:*la©hƒ¯·ž0t$ "p„núûn¬$Ü‹ˆ0"Yaæ®mcZo”^׊1†Ø'æöÛ«Ëaˆ!öÕýBÛ†‰¡©ˆšôÌK)Û¶‰1jé…º®¹«àÔj¢®®”™©}£1¶OÔýlÛöÁùýÅb±Z­±(ŠÕ|q}qy6ùÒ{¿ÿù¿þ±÷¾ñË‘×@B¬7TÃ{·bÁwÜÄúª#a/ß&:!bïöB9bE1F•vŽá8ØM¯À}MzjrëíŸãȽ³”e³àR’šSÛ¾œ&Šˆ†Hp¯ïð2õ·( U5TVMÉ7ä`¥‰ïÊwX>‰99ç&“Él6kÛv>Ÿ/—K"²¶k.ËY)8f¾«à«Žœtæ+íÊõí×ÜÈ¥·œýä ÉŸ ÝÄÞu§<ÑIPÝOεÞÄøûƒvh c\ïWD) U'CŽ£ö= MÓx™Yƒ÷¹,*[¸ùz³Ýl¤k»»ƒ´Ä`úm‰¦C™nu m饾ªlﺰÿ¤:kØãýû÷ 5gÍOÄô½ð´^‡RÃ6°Ö˜T¬9âÌLÐ9ó4ŠMb§›vµjbQBh—Ûó{§ï~øîÉx|óâú/üÙ?c‚Ü«œp( çÛ`,ù6TÃÁóçÏï?8ÞhÎ}ç;Xu²0QVÆD²¾{¢Á„Lj¶wÍ‘Žaúd è­µ–Ž&]¿Úl1ÎeÙµ÷Ñ ¸²¨D×ÛiUþs_ûc‹ù|ùûï¼7O‹Â‰„PG`±Ö–TDÇ>t=žE$zæÔ/gŸŒ'ÓêÝ(ZÂXX@b؉ž±ÏôõÞÅÝgeƒÁ @FЄ@ˆd#‹`ˆH¬PÔ ;‘år®d²®ë› ó›÷OÎ^ÀMCÃnÿÌ|ÀwQ[î¥þ$n÷W&*¶÷„>>öQб´üí9°R5kI%Íþ¹³d…WÜO,NÈ“€Ã¸³n¹Ä}`’FÄ”Áy G'³|kDTinÓwžðù²áœˆl²–D¸ººzñâE]×Kˆ1S雷p{º×«ì=m´La$‡Ü>‘a:MÜ_Ýñsiˆ ìåî&ËÖè?DƒÞ€¤\=4HèkYp¶«2\°À¼´mšÖ×¥ÛUÞi„=JJ ¤· PoË¡£"Øé¼:Á7tšZ¶±wüŸžžªšBX.—üe­ÝÖk=ôä)× ßn·úLî–L׃@4ÆJpèJÓX×ÙByWИ€c`ï¯//þÌ¿û'K‚f³ cí|5ŸÎfëºTƒ{÷f°\.&“‘÷ÝAçºï­ê¯Ž<ž3ë…Àí‚ï±@œÀæàÉ’š=2•&S–egÛGä&i‹zÑÒË›Z#¥«²–·ÛM³TU¶U5<™Áà„É[m¶íÜ@Í]B¯]ëƒ8‡DÄ}z!eqïˆ(ÑhýedA‘Ù×ÓŸÞøBÁs·Í®,Š®öäªY%-Vgi^âd:ÒÛ¡"1ªÎZè-ÁÞ·Þÿ0Ùœ8 º¾X<Ðèj€È€åæææd6+ËRÁi6›=þàÃýÑ}òî_ç°˜ ^oëg³“àà>Ñ9ÀÍ10€&c­³NÁš™}cŒE–çºwØwÐ7¼£ûÐ}Íï ›  ›XìîÅbw½®·zšq˜l’e£ã»?܇ËîH›j-hÑs¶0ˆ"E!#5´ØÇÈ@Ÿõ””­OÐÃzQØ{$âÈuUU´Ý4!0‘ñÞoÖõzÕXSQ Hd¬!C¥¡R<Š b 8’„1B29§×é`úl.ƒpY–ÃáPÝ„IâÃ}Ie·ÏzÆ$·ôœ)©hmˆ­ñY4·%baÀ©³OÏŠ0YP{oPÚOå>”›`4MƳӓñt2]¯¶ÏŸ]´M°¦hÛv½Úžœ „‘€ú꯱ŽÑ[3Ìä,],Éa‰Gk,¤ …øõı–h‰¬±-’CÈHH oMŸŒ_V–ˆŒ!af–® €56=_YS¾ÏzMY”eQ:2‹¢јz³ñÞ¶ï»`¨$‘傌 IWÄ ‚\’X#® [¢s© ëŠîDô4Ä!ASûëç×±‰ƒÊ®o®1lD¸Á3€5`ñzßK¨Q¥ºÄz¡çjD$²¤„UD¬)¸ïå…™áz< œ…؆Ø"Iª‚äì „C—.Eh„°ÑI4Msssc­‡ÊØ&³YUU£r°^.}ÓFzè ðt8Ü^­ +Ë–Ã&ÖfT^}øÎ¿ð}?ð¯ÿË?ô`P…&$AMœ O9ÊÀȬ~ýÑh§9‡¬Ù "F 9Ù”¾O3džò$®‰ˆ¦Êt(]éáCòxªBŠoê "YMûòà%4$Ú I ;£@Å éለèª!¢g™o· ç‚3ƒ¶Fk©294Öðø¤BCMðuSo‚§("è=ùX[S-ˆ`±·[æH}¡?°»Ú[[ñZiçúæ­1«åÒ{?)&#rõv»Y-ÑQ¼^®LaãºKATÞÜ èE\Æ ”‹#RÒÉ£óQ5X¯×­øñdbŒYÞÌkÀTûm»i¬7h¬ˆøåÕƒ¯o6~~³™NNÊ¢ðÑWƒ'×§Þxú­µ“ѽiquýõüÁ/}øîO0 7EU¨ÚÛVîÎâ‡y®DêŸÉ8²i!ÿ2Ä rÓâ.—#ÿ«HÏÁLyr}[—x³…&¤Ë ë.—‹¢ùFI¦Ò¢ aálC`märתs19‘-Ä]Úeºs;AzHú AdÉ=™FèûçKø çŽx0ÇŽý˜ƒË^þ©ëšªª²–BššrïÞI]×Ú¼]ãEd8¦=NSÎÉ÷·?”µ2–,"‚é0ìoæ.D!£!3jS#4†lY–ɧ ûñ/ùæäš´: ¤,1©®³.ßeH†Ü°çNz•ä|c'‡y÷HˆQ¼³X¯«åj³TžÇ1ª)‘#2F¤À\%p:8ßK²3hÅP`rö”¶Š¢FãñXõ`•^S_¥DÿnÛ-3«Ùy¹\^^^2sQÎé3_…„ª’>þèã/½ñÅzÝ\,nÈ¡«Ìêúúû¿ú½ôÿȽÉx³ÞŽ@Û/$6­ˆöÝ·ñ¨ØÒ.9X]ŽÝiÇ^ >?ýõ Zl‰œvå\Jö•ãHØgúô–|•;w—X´…%(ÉÚ™¸SZ’j;ëH§ Ú½…1µ€£ª4Ms½Z\ÜÌE„›µ1fU¯Ú«دë­ÔÌF¢àfW½Y!V«'¥/•ÐQfqzïÜbWWÑ9'"›åêúúºi¶}Ô½ˆæH$ÖZKgó«ˆhîÝ»WUåvsÔ Æ“éèkßyüÚƒ“v{ñ+¿ö ?þçþÔ6<Û@x¥sÜ…Âî(è?Sœc2EäÿÕÏLÄûA Ø—ŒÆÌ÷ÆY:|zB²˜Y!D´I&Ed•Z±ûH7ª<›LìP¤kS˜¨ƒ¢Á‘Ak}Û¶!´u³ª›=œS¢ͱö#bÖuÀ„Òüaòµ'¤Êð'rÊãóê_-9ð ó'BTÓ4ÖZ"¢ÙlöàÁƒûç ñ|>Wã³Ê¹Æ˜ÑhäÃ1)r;ºvWÞù«Ž\XAD B" ®¥9Úü —l‘¬-œ+ªªÒœBÉRÓþ¤OÏd"rΡ2›žw&32ì3`ˆ·Tá@ÄÓMf’E€öCÀ ?q‹`<Çm]¯6›..Áa`Š"‘™ E ˧MY)üb¢ûɼSs8LÓNlµ›ˆJ`©ä¯ " BA[°DÏQg(B˜ÍfEaM͉˜»ˆf³}íÑ£ÇÏŸžÌΪÓÑÍåŃÑÉÙÙù¿ùÇþø¤Z;pð䜳®ö­d¾XÎZ Bß31%þv(yGô´ÞÜsqpÍ1•û #±ò  ÌRVûdröæ=ufî˜÷møt?c(Xš‚lÄÀM%ÌÂÄ1uEQ…ˆºÑkm½ÝÔuí½°Ù6ÛÖW•ÏÛºö¾õ·›uÈ­÷¬Fêéþ€æ‚§sQ±jÕÖZGÑEåLB¸z~uyyùâÅ [VmÛŠ`YVÖZ4–ʲΊcU ¬uËùœ™N&÷ïÍÎ ¹ÿpº)íüû~`öÕ¯ü‹WËߺ?y4_¬fÓꕎÉftwr@pÎîâÄ9£:àCé3§6õ"RílAD0€‰X[A‚ˆ°ò'Né:98Â>"%N#"!ë¡ ¨Ø9«ÄŨõ-"†Ø†Ð2‡ô¤äYÔÏDÝc AP O€ÑgÆÛ² ó-P÷•ýq¼Ÿwý]Œy‡·ˆêƒî¸1ïØyÎÚÓÔêqØnšæôô€æóù`P¾ùæ›>ÆÇ¾wqq±Z­@Ãs”?±˜…h— @Òcù·?òC$"P]{??;IoD@ˆF/ D¶¶Ð¸Íc†”v5gœDã^¼È-JóÞ‰ßñ“Â60ƒÖeñ!ÆÜ™’R%lŒã¾l½!pDìÚÇH‘˜‘ÔU#»Éí%AåÈ’/3-0±áOqOÐLQÄ †|z†…uÎØÕjµÝ6”Åy@ï|FDÍm…Þ¬g7”¥swö0ÅJ#P×õx:]Ç:6õ›¯?,‚ÿ?üÃç£a½mÀY B S¸D^n…“Ä€s¬ÜKÇ:8ëcñúVB÷:ü‰xš.è|Ì‘­µÊny?ëàs¢™ú í«ûÀ{}¯Ó51O»6E@ÈYDD(‰,ˆ Û6„XŒ2‡‚ ÄÆ‰+†C0ÀÑbÓø«ùÍz³C__Þ\†¸®7ƘjPbÛ´ÛíV#·À9§´q³Ù¤T‚ŸÌ|sscôMBXÞÌ‹E]×£«d08,Š¢êJ®"! ¹…µälQ¯êØò›÷¿|6;¿º¼©ùÿÃOüWõ¿ÿc¼> #„&¬gÓ€ú®#»u|ÇK-¾êÀ}ÜÍzÓ5wáÆñ5Ç:`Fé£È.¢ z¼€Ø‡×'Ž.½ª×å)"Àž  -µ³¸R‡º®Õ°–t‚œÇKEùÂÓWt°4è™Ö.Èv?&ߢ—làKßZ‰¸gVŒ°Þõœ¾„žŒÇã×_óõ×_€§ÏŸ?yòDu_½]»ñ‘`•¤•û 3NiÀ™)Azî "wUÚJ×§x] :€°´ó²ÏËÓ^™¾ó1ôb*A:ù{s¹*ÍÄ올ˆFi¬ÊþY¥Õ„ÈÁó¦n·M[·u=¢h«ö"޻눗PïúMG™¦ˆˆ†öj¿¬â˜'©vTŒ‹1¶íÎÒ›`OD"ÇTÕÕ9—: 3O¤ªÀ¤X&;?zä867«qUÕ‹ÅølâÌrq3™LáúòâôôŒiƒO“<>ñƒÀ«ã£9Þ±ƒÅæ×~U‚|+2"" )ÈS¤n}xEi`oeÄÌù•®§ÞcŒ¢}2 Ø¡A"!D´@F( uˆÈ [äÙs$ƒd¡Ù®Ú¦Y-—!ðf³YÞ\WÕðt:ó\k³çT Ckz‡:¬V«Íf£Vqî  ¦êFÉTÞõ\oÚùõ‚ˆ$Ķm p2™L§Óm¨‡åК’"báŒH míý…Ë©,ØŠ,¿ñõoüìÏþì_ù«ú'ò?!a` f$~…Ì`_9 ãbÒ§üï>ÏÜšãg¦/w–!ýÀ"‘"é»þ©B|ôœDI¡‡Åœ"vp%I‰™®_43ï}S{ï£"hð—1}÷BKhHu)¡>†éÎŒÀ|`¦dh¥ÜT³-ÍMeáœ+äëúÄs9xvpbZ{Äö‰Ñ­c8n6çÊ·Þzë­·Þ&¢ÇøÁ“ÍfÔ×a詪;D0D lµqêçæÆýGk<‚ºÈ]£˜è\QUEUØwÚI!»ˆŽFr’‰Ñü¥~ûüFIѤwn¢®/MWz¢Õf”"´go”t@‘½Û¦^7uÃ! [DŒÀ"¢ G†ÃÊq˜K'pJ€ˆdö¡ëå¬Åê €ÎØa5ˆ£P·¾i}ÓÖuݯ™¦ÀŒDÀZþ7&ú«œ¦®kç Š˜ k1@¨ö-)äó>¾zjBüþÒõìÐZˆ`Ìôt*šõ§Õø÷£I“7 "ŠYºà­Üî8¸OÜ™—_#·)ÓúÒ.¶`zïz`º&…¦wªìôãtAÂÊÀ¾÷ˆÚeîFöD‚ˆ® WZX&‚X熑‚0c>¾¼,J’²@®C+-µëåÅüEב–ÈF‘zÛ®·u¬ÛÍf£TB#Lc_V%åÖ§ü¨‚XUÕÉt¦9™Ö4UQTÈ&°çáÿgïMƒmËΰïûÖZ{8çÜsï}ï¾÷Ôƒº%%Œ@Á€í$6!Ʊbp%VBÊ•3Y† vAª2:8©JUŠ¸ìª˜*R•˜P&Ì£’P@€„@SK­^¿î¾ó=ãÖú¾üX{¯³öÞçÜî×zãªW÷³ÏÞk¯á[ß<8F°Ö–G“7®VçX­SŒ§Ë×¾&ûš?ÿºë¯ü™>%Øs¢_Ü8œ:çꚘßmM÷vâz,ùk[¡aë ßƇbGègå,0 BòFf`A®MÓ§@á†cIhƒêÆÕêÚ9êH;gQkããüb ˜¶êŠ£štñëb2€‘Š/ E_û(˜Çp£ÛÜy€_þ6AkZòÉç‚Z»ÉVáÙãÖmŠ qËpÎ¥izttûU¯z"Þ»wïÙgŸ½ºšÛ²Ÿ‚´e'Xz?b«@3[ÞU{ëþÛý%ˆbŒ²4MœsëuTaÃþcÒë'hycqˆ [€ÜÐ1ŠW¾Zƒ—Ílk ³2 ÐpŸ õõud­]—Õº,ʺF`?8GÀNƒ8jß7l\-lK, æáÜõ–´ù*Ýãàœ¢T££Ñhßö&^o¥7#¢Çõÿj­½žIĹºË£,KMj½ˆ"[ºƒ4;ú¯ÞòíRÙt4ZÎ/FÓéÙÅÅt:Õ:©êª*êñxìÑâÁsëuå­û¾o "éÐÝ çx#FMqÏ×ÓÅ—lÕÀð£ o$j*3Ê õÞ%­©{8ÈæðR‰ñ–]Af!qÀˆäÓ_y¬@" zŸMDyøæ~’$óùˆH_æv¹¬+WÏgÅÅe’gN¸´Ö¤‰Ò¦vÖ³ž-¼8&·e™Ïyàu'^#’¦)™$QM>¢Q–Q]U‹Å"ŸŒ‹…XÔd:[—£ FóóíMÔcÝ<ÜÏŠ’S} PÜÜSóFVQZW7nìÈåìô`z°3LhGÓÃmŽy´/|"šëï‰[ùÖ)xèvØeÛC €ÜàÄ& I€Y [`ë/‡‘2Dzéð™™­­cÄ~ò5ëÚÕ•+˺ªjçX!nÒÓăH¶òM²k‘Áía"¢MœLÜyïÈI—G¹ß£î5iH‚'š÷–­7Q%ñ1Nõvq¹\¾úÕ¯~ík_;ŽOîÞ½;ŸÏ•R ?ëË¿oÀ6°ˆÄ“ y`NXÌ,­v°GÕ¨Â~øp;`$4‰NR“¤¦ª6ù̇Ë3sW¶[ÆÌ¥øÆŸ·ø@GÀ/Q|j뉭!§þÄ&éÁz½^­VUU‘%(âÀ—JBdÄ6É_'Ij cñ8;pÛ^Ü Dãs”¦ét:5Æø ;ïßÓBSØØç\U)¶–P„h¿ %¹³““7<úÚ¿ûï¿9£W³óñþt¶^2Èl5˲Q>Õu&iYÙxÝ\[›681A”D¶»Â›CŽv<æk€ðš#ù’¸1UÌ¢I7s@ŒÁ†Ý†¡†صå›"l+ñ(B-H‚ËÚ¯‘"$ÅÎ1[£Uï´/DÏ.¢ Ør4I§½jœfYšk­ W™4=>9yê¹gWU¹(ʲ,+gƒÝAGu?ÀûB{û…Ï7™¦i’$Ö‚ÿeëf³…ö|/kíÕåLÜ< |®ABBdvÎÚD§€‚â I)£6y1kð•jW£UB.úìÑ×![dÓÞm!e¦&£scT²Z­ WLⳞ6¤dF ŽÙÕŒ*¤í`ç80^h㘴ðî¼iÎgº"mxƒ–Aˆ ¢«8Õ©-+ Õ8WÌ…­EȺ¼5Io½þ‹ãÃË­åŸýÀÿ‘ŽÉ•¨1Ï&“ü†­+¶èl•j•)T ‹rnXO'©³Õº¨§ãýÅbuãæ««ùåÉÙƒäÿóîŸýÐÛþ'Þúâé wŽR€ã6–”jB+™h€S@ Ô°—ݾ_ê Žù£]¤ñ ÓbkJÌïº?f'Ç!'G ¹•ésn°HD¾˜kó{l|¯¸aÒƒŠCÚ¼?Á!>(~¡¥XÞcÞ§Ÿo¥ÀíalµÇ#ÒxõÄ  ŒEu?ü¡! IDATŸ\Ô5­·V¼ÀX`¸ªñvc–Ëe’$ÓéTDüçW½êU¯~øaçܽ{÷|¥#e´8çpÐ34he³×ÑÅÅÛ.Š{=\íjQÏ>Ž¢¬x‰\@UUEQÔµóÀÑ 4Iµqçq,G@ññ¤TS_{TÍnrí‚wØ,µ' VYœEQ\]]!âž>Ðy’#*D`.V‹õz]ÔUm-ƒ8Wqñβ,ÏóñxœF£Ñ(ÏsouÛÈC÷Y2†¨ÞKËOK«|BÄ<ÏEÄË=WWW!ú6eˆ¼;<3§ãåríJ÷èßÎ.÷öï=ûÜÁÍ_õþkþµ¯|ìUwŠuÉe=ÞŸÂl5'£ÞÀzà ¸Ñ(Жr{Ò-J±‹Ù[Oµý²Ýj>Þ®…ÇÑ1ñlz¨w¼9Ä÷K=Zk&¾`WuÑc2bÌÜ»2pÇ€Ñ;È"RÔÕh4:9=ýžø½EU&in®®® Ù›7o=óÌ3©™féÈUÖS•N²ËËs¥ìk^ÿÈññ 7=õÔG?þñ?xϯ½íGô‡þÖ7¼eÍoXÝ9zÀÎ.gÓƒép³`ë;aÅ8ý¥qäÜûr$•"…6Ê:¯•Þ=ÌœèÖ=¦Á®¦÷ÓWm¤o•C×þÁÁ÷oSÌÙÅI‚˜„<×쩯Ô¶úµ~±Ó2tl·Záþ@qýcsÈi[©—¿4Ü ‰!¨GQ< ŠÝºuëu¯{Ý$ÏïÞ½{||<ŸÏqãÓ¤ˆ\ã ä¥RÀàQDx¯wEjBÁ6 Q êõpµ«aðïDD†&Å¢0³·ªúŠU]×Ж 6xlò‚¥ g 7`«ˆ‘Æ«“ZGé‘|2ú0éfôËÊI¦“õd4Nµ!£ub,HY×———W‹¹÷Ì÷tÛê§aO<ùTYˆ5»³Ë‹ùbQVUSçA+eŒNŸ?Èsamƒù£75Ÿ ,\Áæn7”£˜%PHˆÈÂäSÒ5Œ*2¢WŸ´QèC9‰B=añYN«u1Ÿ-÷nÖóóÕÁtr~v¦ ûÿ»ÿö …²¨JgÓ|¤Ñ, ®`4žp]?OXOç:ÕÆâÛ umÃM¹Ží48|í½qëç­´jëO»Æ_'ÅH“ÈHXk%*Ç…–ˆu,4nkCWD¹f`/s Þzóï2ÆÌçóÄdÇ/¼pûè:¾|ñù4MO.ç´”uµ®ËéÞd¹œžž^\ÝýÝßýí÷¾ïü­÷WÕW-×ß|À•rîâ`´À$§§'GG“ª®’ûsj¾ï¦{3²®_à6DÙMÛ'†bâb*ëeøh¶—w–ø¥ªªƒ{7Bf¶b¥å9Êi¨oÀ>M„>²%N}¨h]ö dÀ×=ôŸci^"˜ƒØ¬èÅ‚ûß„--P¯Ç&aCJÓ¤xM’$yä‘G¾äK¾$Ïó“““gžyf>Ÿ{K6s]–%‘NÓÔ‡À@“Oº1 n‡†øÑfgÃ$òéÍâ~[@ij,KkŒP-õ(bh¹ÆÄð®@—qb¨xâAümŽB›2¬†º`Åpáxµ.æ‹e¢NŒN hÅW³Ùº,,;!TZ‘Ö&M’,5«Ò‡WbWÂ_#½±j÷H©•wšÛºžaw>c¤¨ˆ—ÈÓ`×–%¶Önœ€ˆѶ¹wÎÎÎŽîÜ>=>9¸±Ÿ^Ÿüïß÷?$P®—©6 [•ç¹CYë„6J£xÍC.³8ã•Ȧø¿™£8¨ ‘ŠU²;)Íx”) ›¾ë§­Wâ½K0†Öš­ "G"j·é* ¼„è˜Ç@ t3"ĿƖ”áDâAÊ çAÜ?TU‘(¸uóöÕÅåt2ªÙM2½ªnìOÆW³s§\U.î~öÓü¼ï}ïùüâßù–¯ù^€«º¼8Ü¿P²ãºpéèÀV k㎎¨ €Ï/î% x‰Œ_€v¿ø%ß ‘uPº»Þ€ Ìo Ìj`”H ·Î¥¬rŽV‹år¾¨ŠŒ6FijÉVoÊØUqPø ]•uìüÜ96¢ Ï|¸Þkñ‚C÷ø¥iºX,”R=öØë_ÿúÑhôüóÏ?ýôÓËÙl½^WÎ)¥D MSrÎùí°¡÷á"à ³Wò’qxh… ú­Xéå·˜i­nè:3K+D°±ÉW0Oø) /— iXxË&H£Äl°;³ó4C“r€P¸Ê®, EäUö Ö®*m]³ BE¨H8Ïz†B–±`“ þÛ½å½v©C'á/(¿m!Ç”ìD”¦éÞÞž7o[këU»¹›ã,"*ÓçǓɨ¾ºZ•åýàä‹«•I P]˜%F#UR ‰AøàÚÊ<±~«Wt3~¤žì+‘F*hO€{È  qn^¿ß¯2haH’Y‹sN7F½mò·³–Ú4Dñý ä¨ÔE^,ñ0:ÌYÔÂÛÃõøsÜC;BëPc±®–Ë%Kutsÿ‰Oüè‘7üÞÇ>"°þðGþ¿ÿ÷Ç~øw?òÁ7}Ó×Tõ[Vë§„q<Þ«ªj¼w`Ë¢N³ûUp ‡)K×tOgHÕÂuâ>ï’w~¦6ïš¼ÌUx-€GüU¤ ¼ # z{ØÎ}#¢Édrxxøè£ÀSO=u÷îÝÙl­¤n­%Ôyž3C3`@ŠzÃCl¼X:6*ŒäKèžÿW@}¡q Í®©ñõ!Èá-ÁZ¨ÆV9¼uw6ùå5é`hŠ­µ€µ¶FBpÀ Q!)@_È\¡"¯Ñq‚¨ÀûÌŠ‹b¼o`+‡üVïì„‹×ã“Àׯ„©I×Ѓz(Ï÷ó|j¥ÔøùÍUÕIÄññõ+n1®ì]ÙÕ"¢ûãGDŸN¥‡ŽRî)F‚{³ˆØîI[¯×Ò U¤ÖòÑ\6Ú°€6RuPLÉËà3‰…®š7¼Ôÿ¢‚Ô¿Kë@ñ¾ôŽñÖ±¹nùÂÐ3ß¾}ûÑGM’äÙgŸ}òÉ'‹¢Ç‹å2ÏóQš–eÉΛÀýÒ…8Kß¹ïjûF#6åØ Ž\è<>Ç¥ÀÖåÍàf¯e‹8Ø[º¸‡­_úÅ`¹õ¶.ÌK°„›½2Ÿ…ÅY+Ž-’ˆ˜\‘!¥I!# YkÙ—ÜÆÆ­ÌúÒ–QÝ'n]}„€w±;a¤å¶µ†YB”´B'GQd!KZ]ôÞÞžÖz¶\x"ʼqœVJÏNníï/gW¿øÖÕµ¬æóéÍ©µua}e-`®‰´2Z»Úú\j½íh}…£ñPkì¤Å¯@ó•7[#´]罇ôÂg…½æÙ]WügŸõ¶œŠ´ÖÒº&ʃ#ëþ°ó¸jC?Â:@„µz¡Ï] ‡k –Ä(º§.’Hcd«Bk=»Z(e~õÝïþõ÷ÿ꯼ý?ù©ßÿã‹ÿÉÿö½@í\À 4N®Š«ýl?ËŒ—ç£fYšXùí£#º¶ÖUu>ºïÜÎ÷Ûtš 1 óeFš$pì—2°¢Ú¼ÂSšäDÛmqŸqãÎ;Êh{4ê=M}ùi΀{$_à övŽyçh]­£Fh–ˆmÆg×a:7K-¢bæõº)3œ&yš¦¾öµ÷2m¼”RÆŸmëüÇa½AE¥u#*Ê33°2:WBÍŠ¢ÜTh6Æøa«ÕêáGyäá‡5ÒSŸ~ò¹çž#„Ñh´Z¯µ6Ö:b1¤€@Ø1sBâœÒ\T‚ÒÆ*ŠH««£"^S“ˆ§ïkj-÷>—tŒ8ʉ´ADP„©Ö¤­uš¦£,oJD—U-€’""!#€"Ç GzãX¦L’Ä»õŸ»°ûÐJҭ“ʲ ƒ5ë¬-¬«( /NüW4Šˆ±@DÒ«s ¢bENªzåÓ\Xa“¨Ôèé(¿qxàö¬Öxq1³5+€œçIš#èÖ墲þ¥imÀ9G€48õÔרc£!oTŠH'‰« 8vĮ̀Q£ff[ÛškDb0R”¤\[[VéÞAZØd¶ºµ·yyYÁ<=_Ï5Ìžö7ßõn¨«š!ŸŽaV¬&éžh¼Ö€OŽ(7ûÆï¬uÎUÑj:H„Aš=~Fq‚ÂN¡¹!_ÒçÉ„ b ¤Õ-í’Dãœo]r»I4ÔÐWï•f•Þmdñ͈¨eD×®aWפÉ!œŽF~à.jul¹vhuë­„‘ý>¾mh\ËÐÈÞÞXÄ­V+m”·L%Ir~u~çèÎÙÙ…³rtsÿjv®È&©)kZ-×wî<ôâ g"˜¥cZ­ŠåY½XžýòÛüçñ§NÎ?ö­ßöÿ°°ŸÈô>@ÕîËÆŽKPíg9@åS£ ‚ Fm#A€D+ÐêóM}!ö‚öK˜k(ýb¾"‰çzD¿-fpâþCia/GÉZß_úß@¢¼Å°É— àìK8+…#ä§ï3ùÒ,`]å3¢¥i³oЪPª6'°_­x1=&¥È{•j*#™/Þˆ”ç1ãù@ZMôXøp¥§döC ãщñBXžçž)Fwîܹyó¦µöj6÷©œ°JL’$\Õ0úÂH’þ[ˆÈ É¥–Ûd2Š×3Q‰WrúB¼äæ:yN#îþlEáøÄŸC£ÈåX5 87V·¸ÿö0ŒøÔô6Î7ïTØCŽD$ DâœgZ”1i–F£ ˆ[¯ÊÕª©_8çë½FŠÄž~ø4éÙ±C¥ÂgŒ¼‘ýOžÚËGé­ÛRֳ˫¥-MšŽ“´(Š„ëw½ëÝeQ`]£ãlœÍËý½};p~ôoapñ1綘cÌjb˘âöº¾è~íÝÆ;{èìB<ŽÌºás¬ÚED_1)LS"éÓ`‚>QðB¥Þ"PkRmI"ßö÷÷‹EY–ˆ¢”º¼¸ÒZŸŸæ£ääô…<›ˆ¦ã/A0ÏG¶TYš­Å]œ;·šNÇûøo<ýôSŸþ̧~úÇ~êîsŸúæoù‹ß¿\ŸŒó€S4‚?&M‡ãÊQ¤A¼R=¤ßC1y ͧ¬qñqÆVïï}ßZß„û%ÀØcÛþ¯’ÄgÞD²5w[€æ€™ÙÇþ2s+¸7Ãïz¥±VZ5yk½£‰lÊ'øFQìïýîÂýâÊø°I¤ŠïÁX7«7ç™G£Ñ£>úš×¼æÞ½{Çgg§gËù‚™k[3BšeÐ |aõb&úso*#‹xŽÔpDmœn ÀÆO€ƒkëKž­Ç ãý ƒ“Ñl¥‡Nð÷æ‘m8`=ŒJeo¥ aäJBƒD Tbt–¥ãQ¾Gdç³¥1¦®¼o?yWYÏÄ„0æ^Y‹¾xacfÐÆs{õÏÃäÉËÏÞyø‘³ùÕÑC_^œ=ý™'ïÜ8ú?øƒ Àñ ǯyü1±¶æz</×ë”’mkOõOnP>‡+Ðe âc6%›žq ÇïÝu%¦”ÃxGÜð0Ü+^ÃxÃÈÃØ”R>­Šˆxƒ#kkQÔñ\ 0é¨úœ¥G•¾çP™ÏÏOëÚM&“4Í˲<;»ºsçŽÖYžç‹ùéjyñèC¦ëåj<:xî¹çÒ¼¼š]Ï¿øä/üÒÿÜOþ8ÃÀþóþ_Nò9ÀlUÎÇùÁªXäÙÈY2Éû#Ø:0G‰¼} 87^Ve¦—gÈ|­[Ø•ÌD^‰Ú‚ƒ–òe`|®­EÈ­ÕÊ߀­ ]$Ž‘â1„.øŸ˜Û" ‘ë²o~1µÖ؆uгkUÁ“¨ÙÔµ^ÃKÅwmÙ³ôîŒZòÀÜ8$cë­SÙ2°)7oÞ|衇&“ÉùùùÓO?=ŸÍÊÕšµÖ ☫ª¢—ž>—#Ù𗻆®]LŒöÆŽ…›Ýbw…‘„ƒã!!À†Ú–æ,Þ2î>Æ0îÙ§÷þºíB« ˆ!³…·Ä˜€ÀèTë„H#*"ŽFM¢Á ta¤‰Án²ô—ÓzPH/03ÌŒ,$€´ñØ *¥¤×<þø'žüôá­£åÕå|vykoú¯~ò­c‚³ÓÓ×<þX'"Ί'&Çñ«7FL¿k+ºoúíÍ‚ÚÖlDÔOo´Cª·]¯è=µ+qbÿECl°uÍ!NÕ&6‡}BD|ŽèÐ?tEÏ'Æ9wtt4›ÍŠ¢š]­D01ÙjY(¥Ž_˜óCÌðôô”]mŒúôó|ôýïyÏ»þÅÿ_ʼñïü§ÿN!/²” Ñ$OÏfÏÜœÞÖFØ43&KÒÏwÕôV4=Þ¼wÒŽ¡×Ã膋AY‚Oï·»7q"J,~Ýx[¼;†œ9‘¿´ßµ§žþlžµ¬”:<<¼÷ü3ûû{û“Û§eµ8<ÌN.ï>ýÔ'Þö+¿ôó?ÿ³oü {ßõÝßDP:(Re*)•uŒJßœ¾n¾¼ÚZ.¬«•qW‹ö'‡×,à¶ÝE6ÆA1ÄST=>€ïö—{% I@|–xï'1Èገ°K踾ûv¨äû¡— â±b¹‡â>‰T j“†0 @#{Â43Á­¦µ,ú)Œ¨kñ¾)Jéè¥ 8xϾÌu¸þÎ>•fh7"SêÛäÉÌh4ºuëÖþþþjµzâ‰'Ž}¸,M`]VÎ9_W"‹¡îåOç%[Läâwy'¬­d »­û6ÓI y=£NÜm/Ž6F½õûߊ©¯Áìa ç­¼EmKR^ô±Ë À"¬H%I’çyYÔu]6yQpàTõ¹o–Dšgq.5sF‰yˆ@$nÞ9Ü«Æ/¾øüÍÔd“É÷ÿÓZ,Ö áôèðêò¼(Š;wÖIBÚ¥/.g£<í» [âµ¥(²™"=ÿ!¦¾ÃSÍú\e+)½ž¬ní3€wsãÏ1rƒ<¼7(ì ‚.Ô5̨pü”؇Ÿ„Ç}@yUÕËå<˲uáXÊ‹«åââ8Mèw>üþ·½ý§ßókÿ ðËÿóÿâ›kwïðŠuµ‘Qº§ €D™ª–šÝxtÃ:«Õx½^'¦ØŸÀ“¦ãu èoWâ£!ƒÿ96‰Z¼—Ì«€½‚÷ŒÖžê—@1öhûˆˆÚb&fÄO…:Þ»Jkã=`Cøµ^Ðmª[/´i"?Â’™E:H[QÛç*‚mçóúu¸þº RnaWr€¢( Ø9H’ÄO!¥~v'''O=õÔ½{÷’$¹uë–/ æ3z,Æâ~¶¼S<À†awx=üó=zðõð#ƒ˜Ðê“¶ª q ™Åƒ.mè!ÁáL㿽¯ñ³Dä\í9ç„°ª‹º.­­œ«Œ7²&IÑ¢j€m’.mrp¾’O0–à{ €¶ÊLÿêã‹ãÃÑä0ÏþÁ?ø.©øêâôöí#·\/òÉxzppï…çoݺŒ——³Éh¯¶×©(Ã{cb/lŒš029…Ç1êjkÿ[?¯ µ ÍWØÞÃ.qˆ£ÌBmSŒ7‚¦ˆ|5oa º>ö­v›rñ_ÏHçœW šD¯×ë$iŸøäG'{æƒ|ß{~õ]¿òö_ú›ë ß÷}ßaa¶\\íOö•º¼<=8¸ @UµH’©skebTíaRÔÅl~yãàh±>›ä“á üÑlZñ58%>̽#ý ZŒñã±m0Ž€¯%þ ûo;aH×Ü¿ CG7÷ÇIü[" ObcºÄ߯Õ±,C4 ¢¦üa·õ@ÜÃ=½fz-L3&? Åóò÷¯V«F…ÅbŒIÓt<gYfR]ÅÓO?ýÜsÏù’GJ©ããã,Ë ç¥u£P¤”¢è…ñÔæA°i³P´™T¼¹ÜM|†m† èR‚®»–["÷ƪ·ž ŒDÙF\Cñ+°Û "ÃþƒR1î?@޵ÖTUãÒo­­ëMV¯Íx"æ2¼ˆºî#¯¬Å»óÕA¥Àô'èÆÑauµø®ïøÖùéÕÍýÉ­ƒ=pÕå|fò|U®´KnÞºÅUYjÜM¨ªº©~æ —…ü½½«×ã¢ÂÁ‰Õsñ^ôönˆyzW†¦ÀæÃ ÿÞö¶~¨Q$a€óx©ý,¼R-Žõûþð‡~ï÷ëgîÇþú7üö}+Â)ƒ0ÔŽÝþäp±žó)¼zµ Ø£”jë)ytüi½ÔêCHs8I!I I|á_JS_œ9!_„ΖåÚGzC/©fý= OÓTi´®òaU›´ÀÞ\C±Û.¾@ð*²‰%•¨´bï¶ð 8Vˆ£|´¿¿?N‰h¹\^ήÊjµZ­æ³3“Š3)•rU‹ˆ‹ßkmï”ÆmNy°¢D(Ðb¥|Šç5¨Ì Z“`G¨"Bß(é$ç•Ö:1¢h”dM·Ðúk"Ê4Žè­¦šZ˜A­(u"®®]’dÞõ)80KëtÝp Ô»´bšRb-[Ë–-"!! ZaôZD`BTä¼ }ª´Îà帇 £8çÆã±ˆ€c°®X,«Ñ81{Y6ÊójnfYn˜›TÏèúº„™lKŸŸðkž$ 7îàϱ7ì¢j0‚‹0ó²Zóñúbµ7ÚCD‡Ë‚«ùzõÅ¥zÓ7¾iBà X@3»šFSÐÊ€€ÔŒ&Ð`¹¤®e ð¯ IDATgx IFik-['ŽiÓŸ—FºèÄdAÿ ‚‘hSÁ!óÔù¼y¦«˜QÐy¶ç‹:T†š‰€ÐbÔßæŒÝ<ÆhT’§"Ä«Y€`YÙƒýgggóùœˆ&“ÉÙÙY’çêñ(«ª².WJa–'ëõZ÷Ö«•HÎŽ¦c[qvy5?;ýägŸúä/ýòO½ý?ów¿åk­\­VŸQp (ð%¤y’O¼AÀŽÆy;Í@¹t®}Ðp¢@ùÇ…úÂ5xW â ÊÃ@k÷ Z` ‚Óã¦,Ë<“僪3õx'~v(7á@÷H‘7s“)¦G“â@{ˆ8}Ë>k±·nóAD< óH½©õœŸ7!üã>6eœ«ëš]íŸÍòÄs$ÕZÁ(^¶·òñîô!n½z›ˆ§®ø>‘¯OEQ,—Ëõz½Z/BêM‘M¬3Wvë¾ï˜]}W“nÃMˆ]'V•B0ˆD©á7LFëåÛæuT rÈÖlmD@Ð꫱ñ%l (@ §µ×ŸšôÆŸ·Ž¡9’AÖ¿VM’ŠÛð›XÖ ëC¯(î¹7NŒÌqPSŒIb9Û·D›ål~xóÖÉÉI–euU 7§‡í/~Íááa82a˼{Íbú^äñJàN`Çê…³wØ;2[_´ë0†YGÿ´µ·ð®a‡[ûâçÞ‘GDqM toHYNç—÷HãÅå‹J©Å²¬êU’š|bžzònYM•Rl1Ál1sirxy±H´Æ‹êª¬å‰Oò3O|ê=ïýµ_ïÏ壯ûÎïþ÷¦Ó °ÖNÇ7˺øcD;H{…8v½‰‰ÍVܽµŸ]×½6ÆJ¾g=VúA§}]÷í¸å]ˆ2vaësAm"ÕæÁ‡A€ãfšáæÆ#´*Û~ôAQ¢`ðIûBÉRh½ƒÖVJ,"š”ˆ´žhŒÛúTY]bÄ\Ã62v Nô0Çä*Ü?DCiÒ˜±ëº^,«Õj½^×uíë>y\Эu[¢~û`H ¸;,·æóà¾A^Û;á(ÆZûœUI¢Û<Ûñh¯'œD$‚›¸”Eº['ºø4ÞÙˆ· ~õý)ï¢Á‘±ý /¶ŠQx*xwó ³¿Ÿïs¿â9ÆóòÄÒ=XBôK8éÕˆH¹\ß~Õ{Ç'¢„ dãÅéÙ›ÿö›oŽ 3E‘e™WŸÒµ¥Àb†2Œˆxú?»È^,õ€¶Å“ííË.PÙ¥j†m¶Þú–éá`ÂWÞfÊÁn´ Çþ.mAe‰$cf.ªéÞaYÖD”fæäøìðððégŸ}ø±ÇÖ‹µs2O—ËU]ʺ(k©/W§‰|ôƒ?ó3ÿò©§?žUî»5P½joY>Ÿ&™Ñ)@’ Pn]Ÿ?©í¾ ðV¯«‰÷ c¡ªJ|F¡+ >s’$çIh›W yM¸×¨ùÿ”j …Ñ[ðúãÁÖë/`iˆÈÂ0Á@#í&õf£÷ÃnÒƒ€—ýxÂÈUz4Œ–VH4!ùÐx%’ ³j ¤S,-q×7lÒÅ¿8ÐUÄ;("Hå”òÍ£*On«Ê— oô]~Rι`!}€TvWÛÊ”ˆx=p[IÞÖ{Ϻ†RctðTǯC®©—é{ö¢5¦†˜œó&ßä&S[¼eØD›NQ@yLPý+aýè­FNÚáþ0¤Ð¸ëÅ3ìêšÅ÷ô–Å9x_hÁ »j˜bÇY>ŸÏx4¸«“‹ÿúﻬÙײôÛ^i„‘„}ý€%¾ãü£×¶mn{ÁÙAôA4ïž…ádƒu0¦:ñq“(!TX:%ýuƒûÜDß7K‡gý[v!HÓüÙî>úø«g³ËÙéé÷~×w¯¯ŠœT–e glíz½&"Ÿ~ü¾p,vo¯ÝÁˆaò·U‘ª'Þ—Šâ±ÅãÙEª‡48¾‚ÛøãÐ˾««€´›¯ª#g{×1z’&©V.K!ÏꪲFççs2“º²O>ñéÑD)µúÅ_þ~ýýï¾÷Ì3Ëúx>ÿ®û `5Ƀ5"ÈkÇãÛ€^—3“B’ªÊÍ• Æþ'¹½ÜÃÑÐ2_2ÐqÁn–m׋I¬Š Äè 7çÜa5”µ¥5^ù‡èk:xš$ „ÐkP³,ñ±G€W{˘؇#šæYkŠ®sµ-½òÊ«¿BUàx¾¡õh°o1…h±@kN&Ì–Fj¢ºE$b·‡(#¨•ªúGš Ï‹=ÄYÃíŽEj_ £ÖP±Ü½Tþ ÏG‹I/DX£äM1 …8´0£F¡UãcÍsÈ@Ô[·]MD *f¬Ã-Þ)hɤsNµ¥&”ÚDÃo%Àt0![õ¶µ ¬R ®´âí ¸}»R¨ÃØ^æÖô0F¯g™ý縅GÎgóGzøìÞ½iž|ç[ÞUiU•6Ui£sŽˆNËâ…{÷L‚oÇ/|èCï¿ûܧ¾Y™ºpÏŒM2¾±gáÜYVÊh0€( ”.«ZkIÓQe‹D' ¾pˆâH{µêÚ½éã‘ëŸÚE€«ª  ZŒ@D¡ÒçÖ“ Þ £00"2™îgY6™Lò;;;Oÿ£o|ÓXµ&mÖR,—K›j“HT»Ü ¢ñ„·×Îê"v$Þ pTÛÍê*TÚð[oAb³tgMX¶^‡î!~î6>˜½™ní?Æ™a©¸iæ?,W ;ç‚ðäSpóæÁoþö‡>ùÉ¿ë]¿¾œö-ÿßEä<± 5*)íjµZNïhMëõ\ç#v¶H’ÄÊ…cghD8·fmi[°åŸìöÊ 0v› š¿m×ÜE'ü °‡Œ€x1Òhbýƒ,ýr%ñ[ºsçÎx<ö13£Ñ(˲,Ë’$Y­A²„È-SÜ %:“,mé%[kWëÅr¹ôtדÞÅb¡”Z¯×þT`t†Ã1öoŒið†ÛÂS÷žj×O¢$sY–xã+ÑO²uk†x‡9Þbïü Ê­µãŠˆÚx ¶¶]pr¿­=N%~ F¶Rˆ0šßì2IhÜ•ƒwG^¶˜Éû ÄJÎÐ^’;‰_Ô{;Q‡‡yÉ&›é¦NƒlSA÷è7Fp »ŽÕ+hÃ¥ bkÝǬ^øi¶\ܘN¿þ/ÿ¥‰Òõb…1ÏJä4ª½Í̾pçþþ¾'Ì[‡^X föª… áÈ+¥zkÕNd uô,K<Ç]gmóyçúlG¤ñIŒ¯ó6g+ˆÿðhsÔ6½1 ƒ«u+ÇëO|ò©Ë«“}üÃ?þo¨‘€äXàxo¬ÔrùÂx|ÀuµFʧ7.g§Ó½<ß/VÙh¢³¨žÊ“½Q¶ Ëõù(—U™%YSòOMÓ>; ÷ƒø™Y¬€ÓZ"¢dI’eYš&•ep D$ˆ Â@¤W­@ƒÒ„Ð m\Ô¶'äù½wÛr‡€IGÔÖj"ˆRW•s`-;v"Îq-P#Y×>ÍÂ,, ¨ˆU:JÓt4åyî¬üÛ¿ø5û|^ð ¦8ÈÆB›¸Š‘×¶ˆkô€¯Ë;Ê÷âñòý餪뺬–u]çy¾Z­.//ßùÎw–…QZô8›ŒÇcTFd#&H”ŒÖ¨ 㕜DŠåh•¨4[UÖV"ìœäa@A „ÂÙ‰ÿwQ&Ž4ù ÒHm÷ñÍá@23 z/€Ü¦$„EU±u`Q:OÒl”Zv•³eµ²ÖZW 0 sÌEY[§Ëºò+hšwôt¨G§wf޲CÄd¬,jfFPª)kãfBløªÐ " 3[$2h èÄI€R3J“Œ´FeŒ1Ê9‡Š¬µU]yøDDT„ˆ„‚>þW# ‚z6 blŒIó|”$Ú;–úLg"ŽYˆˆP £@ÅÎS’Á’XŸ\iÝZm¹öHÚ!bLU[…†¼ƒ±§ÿŠ,³ç** BJ‘ÈÓL´Ö:MD‘C8]VÎæy^×6Ërð7«ª£}ÿ>°^œ_¦ØE…Ã74Ìv²y´ïËiWUY–…sN)bƲ,¸^0*!S;H’ Ù¡³årþx®þõ/ÿò‡oí/‹õ²XfY6¶œ:¶Ð8IøHY“jD\ËüÐbp,ìØYg­³Nœ/ô[; °©íëz1z‡¼@‰¡ëµ:‹ØfÒmRÞ¶úŽ$iS©=ñxÛÃ:Ð?ß;,4Èלbʬµœ™ÄZ[”õ(ËëÚšÑø¹çž;:ºaë‚‘‘@D˨L#YkÓ4?>9M’d]ǧ'Oæ7~ÿ~çg~î_–ÕÕ8ÿ6ÓÚº„r€`»åñx@´I¼€WL=¶¬²ÑØã¥IòØæþ<à,1Ú¨/è!?î[Ð{²Çž69€Ý¬™EP±/ôÄŒ¶su<ŽÍm‘ »9 ]MZ["rT7Ôs>âC¯zµW5{msp:ÍôFô„Vn»f‚Ô;u«ÕÊß´¯>.ÙM§Ó,˪ª !CÁç•ö2oo Ä‚Z{ØÅ3‰ˆmÝeQ¼y¸™Kµƒã¶ÖR×;,ö€ÝÞì¸D”hl±<äœSDIfŒÒX[[ÖUiëMÉKA“‰pÉúwqô÷Û0ÒîÆSóÐ$Q&[„ ؇æQ;y{Hч­Õ@iO†‰"Q2¸^û¯ª-y ÈÅ{´•ùè1¬a}š-¦®³ÏæŒ]z7¦ IsŽA|U ¯•ÕeeST,q‡ÁP|Èý&%ÀušŒœñ •Ã‚Š‹™™tbÒuYçyzqv1ÎLFôУ|Å?žšäääD!¦Yše™µv¹\f“,,ûfM˜·À›Db_xãð,„GDÕ¸jv4s[OPójéÿˆ±eçXµŸy‡Š8<ˆ÷·$ž/ìõÆÌëj>NE„¹¸¼º¼}tk6»"¢«ã“Ãýñbv ˆêòòòá‡]¹:Ï÷ÎÎNò‘YÎN´^ýþGãï|ÛÏþìOgúŸÖJSžÀåìòpz‡Á=Ȃ䚚Ž!/>Á$©ÚÅž€én˜DŒ_6#Að4Ë×ýfAD…H[œ|svs( Òð¿z<ˆH>@*WA«6ôw?ÏóÃ[>&ÁdžÓ¨.‘Ôµ+`H€ýÀ¬m,L±êO)娆ê> …? ¡„;*å£rˆ(ø‚…N «å9ŒÖK¥¶m¾ÖÈû†ˆ ™j¸'î¼Ç5Ct¼ã”rñ: ¨& (³p#=# RJ!)RþÙ¢®*[×ìˆP!0!2 ƒìöoÝÞ¶¡áð^NÛþ*D­<•¥ ° ÷·‹#"¨/G¾¸£ÅšiÏÅú‡®¥ ~$>Sᶘ^J¤&¢»œnw›e ’<$º!¥€@gû% û !öㆆ*t4[=²Ö3>ãú3“ˆ8QuQÇ“Óoíïk¶_òºÇÇY:ÎGEQˆs>CNU”Ƙl”;×ɧ(uMkYg]TM²7<Œ"*ýBiµ©W(\ïÄÅŸe`âiŽíCCÑžå߆™n%ÏC€é~¾\^&*Y,V“ñxµ^¬Ö³ÔdFSU®÷V«¦‡W³,ɯΎÁï}÷»~â'þïýöûÞô oüöïøk™>Èoß¾9[¼8ìÈd2ªª²äOùö´ ¸G#¯Ú¬Ô¦˜€Á#<ËÌÎ *¤ø‰¬§¾ç]Þ‰±ÕZÙ×9‡Z!"#£êmΆÓJ)cLžçžúîïïF£ñx/ø¯6GÎZ1i†&HD»pç (ØÿpY誶#RY–§§§ËåRÚÒ›~Úi*¥„QÙ5ˆ ±uÅ"nÏd_WßL0 JŽ ‡Å#‡oñ`o_z7ôpŠŠ²”„aö°®®jW[±ŽˆÈ([S()á-/iæ6y@#jÚyˆx-…iõ‰ÿ½å(ˆv‰l·Øehâ¡i­(¥¼zfë¤bzÙ;Œ1%ï…h_‘Á'Èl~RDþb3nÿJÇ MÒG¥ÑÆ‘ÔNüu_’Þ§¡Ó: j° ¸nçÛÀŒŸë«UVAõûÛzWâ‰KWüõ÷W¥›ìNŸñ`2¢ºüê¯úJÍÅûÌkˆèÝ'“I–eeQªÈ_=ÚèNbŪ®˜Ùë38òQF Œ¸œØv¶k082=¨>5\‡—üOdØ z7Ë52®Š’Dƒèº®33ÎGébQ@]»ÓÓc$Îóôbvü|à½ï~Û{ßûž¯û«_ú?þ÷ßYVç:Áý‰ãÙr5ŸNÆi¦J»0Ú•õ:Köþ¸Ôßý£Öt€°p)¨’0ÒPõPC&bДÆOe£p†¨æFÏ9Ð,Üá1±¬•RD\$ Õ£—tÇãñh4òF_Óæ3“ˆÙ§&ãÕ&‹µÛVqº×‚N`ÚÝßÐ0*3ól6óNÝÞÞìïÇhÖe¾ +ß¾®u*‘â\›9Hûº ¶ÓC’ä(Û¶©ž‡"«j¼5ˆþ~YµADt¦ËÚÖuíjkHi­€Ð¬,û}‘M"n¸_ ø~ íý6B- J‰Ï÷lLªµWKlˆG³þ×V“VîÁŽZrƒ…ËÕ³CC—…Ép|D©­;˜½uETTÐn/ÚJˆ|‚NË_¯Ø¢5ÆÎÇ~˜o”ÈåÚÆYaBÔZg&ÉLb´Y-–E6Œ„|ñÉxFA¡J&i­A6|‰´"*¥ö÷÷ONNž|òIçšÚ½"¢…¨1i–š4"eš|~;‹ˆ'ZD(,àœ«j«´Ñ"RUýÅjm­MÚY7z æPy©'-A74E) xjJ£sìêÆ@NäËÓ¢ÖÍãuí¦<¢Ò("•'í†*WU¶¨|„+ûéŒF£½½½,Ë<‚©ñÕ/˜ˆèììl±XTU©µFl2]k­C€P¯)TÛ-$âëþú©5‹TÁ½æ„“$ÑI¦È³%b@ª¬#"EJ‰H)±¥­­h@°L •&PdE¯Æô\µÚ rm-íàåEЇ³;ç´21—¦‡â;ÃO7åÛbâ¤ãC¶^U¶.«ªf'" Ä:!Ä,iÄÜD ±\;æÕz­µµŽ„"’¤©³Ö—¬wÎe’8—ù,4àœ[åFYÚ˜¾Ê1Vpry™öHge±@áÕìêð`úWßðçœ]­˜Ùä“ ALªKWûa0W_ynÀŸÖØÄ¡ ü®µÖ:ë1tõÿáoãQ_OoL € }–†=m~q}Ï’xµnÄš'D̳ýÅbQ×åx<¶®Éxqq¦Lª”ªmEιÕj™åÉåå¥Pš(]×u–f³E–e³«ù‹/¾ø{¿óÐ<ˆ IDAT¶_yû/|ò‰ügßöÕ©ù^»š°ªydn@B~Ådœû‚»õ^ª*H• L•¢\yC”ž`²ÿgÔ÷· c ]æŽ[É/{Õ¦mòOJ·‰9ôæáuWê¯ ZæÔ!E çîÙØ$Iööö&“‰¬õÜ·Ð÷ãÔ±¥Ö²¨Êø½¡…{ÂHâÙÅ=ø>å$tXØF!‡Î1ªÎ[×õr¹\.—Á1 ºñw 0:m} 6ÑYiš¦&Y®uY5óUª {~ Kª¼”ÄãAˆ0EqÕqž`ûùÌ$þkšfA°Ì„1†ÿöÞ¹“¦éx«vvœ$ÙéééÖÖ–1ÆY;›L†ƒñÍ·Æãñp¸5?ûW–U¹œ/¬+î¾öʲ˜üöûß÷¾ÿÖ­W“¿ñ}GÇ×hƒ ¬'fÂ,yä½üUn&Þq“­¸æÎ^Ðé*ƒÔï-¿Þ³‚8XQÌXUz6Æ ‘zƒÁx<µRÐÉ4€§W¸ ë®×÷jT[Q¹ÀkuëžËŽ1¤1I•‡m°Ü[–åÙÙ™¸@‡×QJ)¹Qu6À¯Œü3:af„Z™^/3F¹á0=K§³‰­ê†å® þ+kÉ"Øšè”RÌk‡‰-Ë2MÓÁ` ÕfœsƘápXÕE¿ß ’€“™{½Þx<¾² [÷7¨ëz¹\VU5›M¼÷€l”VJyo‘CÖybØBZ_˜-u“ÂF1‰ÍwÁuí¢NŒÖƒÒˆ½k­Ps½ŒF…¿áËÍåà Ñ«ã `=Åàù%¸€;ß„FA3$Ò•O]×µ³µµ–¼RŠP¡øjŒóØ$ÚȽÔ§b^™Ûà‚aÒ’Èk œŸÕš½;Ì̘æ•÷LôøÕ+ÓÃþ»¿skÄÞ±u±aëóܬ¬êÚnÚÏMZVá‚«D!DLg uÜe‚Ñ™ÕpÀ7×£\•aƒqÄglBr‡_bÈ/_Þ›-ôú‰ÆD)SùªvËÔ|5 CšaQÕ2BüO–¥ƒmJ¬¬»çÅÀ¦Cåh‹C$`+q†{Ãr¯ÄùF#ÉØ<…+RBà ´Ö€9mÓ®ÓÍ@5bT8¼´æð0x9N‡Ã£”¢“»,ËÅb±\.EAÇ­ŠIctª”s£Bƒ 32#€jD)¥”2ʘ¼ßOtãuµ,UQJPDD¡3¶Íñ\´ð1q‰W*¨Îõ²@I’ÈL6zr€,˘¹ª*ç\¿ßßÙÙÙÛÛ‡p:žœœ,‹ù|.*çêÀˆHä°e_„jV¦Ý$ç« ÙjßÿXŠ—,†Þ˜­TF#*FŒß¸Câcâ¨"JÚÜõQñzp‡âë¬×G‚‡ÖîŒ/‹ßhs„IÐm©AQWˆã’ä €Ö-NàÖ¢4¯ \9ç$m€Iüë„‘l?Ü&Lw耾za}¿5ÛLið>OW.ßõýß·•g)RUÕœd¡cŒ”š–žÏ}ë0-Ãa'"¡ñ$w’o„½!üâ¹ÀÙùµs͹½yÊ:Ð.ShNˆ 5ù|¶$‚Ñh‹ÐNNišX[”å²×OΦwcþüçŸ{î¹ýÜÿûËu}ÿ‡~ð[þ—ÿé'óžX(.hY,¯¶†£¢^Ô\ö²Q– Ä—êQû*¶F¼À¨ÉF´Î…\#ƒt(ßÇůóZÔÈç–¢œhº*ßæ“é÷û[[[ÛÛÛ"ûJ…à€ˆÁNƒˆØrÄ1äCL­Öu>›¬#‡äøJéMŒváEâƒÔÐßõ3))8ʲ’Å=+…Â•Ë _K­øƒ {3GŒ1é$=å“¢*ÕµÁǯ|.u>·ÅÔ<þ’yM‚ ý‡Ãº®§Ó)ˆ9ÓZ;ŸÏGãÖz0ìîî^ºt)ÏóÅbqvvv㥗§Óéd2©ª*ѵ֒ú¸µý7#Š7Âr@ô›M¯W cV‘†"œîpPWx&¤vF屈ˆ €‘Iº6EÍ5맦}ÐÚ¼áFµ™0€îÌËð.ŠÒнóùÜëèĵB½÷Ö:ÏM¢fÉÌ•¦i¢ ¶,w“äïÜ2|Ae­6Œ›sѾê,^Ãq‹¯?¥vÓæVIôàÎí[O?ý´‚~¿ß¿}ûv¿?ØßߟNŽÊbª ½÷}¿ôÛ¿ó¯Þÿïù¦wìýõÿžŸù§ÿàd¼ekçÎSží‘+½ìèt °ÕKû¥­¬·©Î´~*ñ¨ýQ7à ›€€ – ¯9Ã(œ Ó:(¸R)¯üÖ˜>¯U¬soš¦‰éF£©V$N¿ü•Q™DõZ`ºÃhÇ Æó%àV7b#7Ô*L™¼KÐŇJ)UVEY–¢nãe¡q,ž¦yhpgföòO|—’DFãápœeIÙ²äu]E¸Jf‚‘ápqBy‘°¥\Wt£leY S­‹©ô¿iwÿòåËyžÏçó»wïÞ¸qãàààèàAY–â#†­µ"~±¤}°°z=ßg»aÎÃxc­ÚPÕ†õ èÛCÞèŸWàÚö¦Î^ˆ÷ó93u›mýÕÎד?¤…S&×¹ÄöÂ{Aß•$/¨Ö&Mó<ϳxúMošN&^­„ø;+»J0OiÇû:L‘BúšÐ‰î(EbJƒe/ã…‹ZŒ a-â®:|Lø|®c<3“Uׯ>1=›Íf@7Ÿþ“¨ø…ç?ó™Ï~âgþÙÿýßùŸÿýÿöoÌ^ì TOõ&‹[ÃÁP©ªY–mèºX¤½±¥éx¼=[ÎFý<É,RqF¿^½äGí´5Ä=lÇÀ оQª˜„6vз-®üÚ`i~Ë•#¶T¾f\"‹vw® ‡ÃÑh”eY ´qÿù@é6”ÚÓ”sÊ¿Üâq¤q5¶øF©ÔDTZ„C%sUÅt:],â "C%‚»Ìªõ™”¸ffbþ¡‚$5ƒÁ ?¤&!"›õD~Ï£V'ÇüFêÚxÀáË‹ ws-âëÃ$u¨Ïb±u‘-œã®]¿š$IY–/¿üò /¼pÿþ}}„£""ÑZ·!å²ù{n±*È›tí!#ï|ƒë–QnÕ¢ÎéP[gZ`l̲$I’ÅëÞA8ÙâÞ{$ ÜÕ ÅCÖm˜8¤^ŽHÜ¡<ˆ/r9Ûh1qÇõÄÅMomêк®Ë²,Ër¥‰Ñ:MÓL’ÇeybŒFå5‘ }šº;pX#¥>OÌÆ×'X?€1o%æßùN_-}¹Pˆ—.]:>› †cñ'üqJ 5j%®T'¬0éí¸õWm‘ gÆ8Òo#¦(Þ~Dkt,\©¢È4\ç]:[7нøöÎ÷ñlËüLzý´¶KÔõñÉýñK¿~zvøÓÿäû‘ùβšz 0˜Ì쎮øÒÍ·—TÍE– *[ sÚÝÙÛ¿ ³jér«Ö•Kz˜>B߯v[eÂR­ÕMmø^… ”UžHà }bÄ›Ç-Ä«ÄÛ=jÓZeY–çùÎÎÎ`0*³r±XœS‰×0xU$< ,Æ¤Žª7ð¸ØÊµ$î6hGóWjúïÞ¨®k© ÌmN€Î E‘Y"öÐ{P!²p?ºU‹åy“$9=9üCYø ÛijÎeºu>ϲLn “T˃ƒƒû÷ïß½{÷ôôT®‘EgæàtJDišöûýårÎÌ kó R3^#Õ/ÏØE*èxéÃòA$Û4­53_‘W"B€,Í;÷Ê_]‹ÓÜz'IåÔ‹æ9P|…ÔQ¡;ÐD¤wÐ% nLú7g¢Ô-ž5ÁR ;Ïr£µ¬ÁqKû•jjéňBëZ_^—k–¬pÏKÇý€1ÿÎ÷|W5;cWm†J©ÓÉ´?Ú>:›ôÓÆôÔp0 ±ò­Ê1Æ !ž7ˆ²ð‚*r‰g>f#búÖyÁxº:;'Œ“7Т*F¾-!«V.˃ó^üÂÏÿóÿç3Ÿýð¿ë;Oæ÷†¹¯ük&Krè-Ê“á`Ì ¼ÇDí9€ª,ùµ¦ª.R¨ööwŠjID{;C% Q¹*3ÙE[÷Qûch&2R®ˆT»Í<³TÁGJ€¼×o¨bò„Þ“`É|$ûX#(ÓšØ{bDÄÂ)èõF—/_Ùßßï÷ûãÑšmê¼%öZk4œ&1‘A:"’"®£Ò ÁZü93Óˆ ’0AX ¥¨1ô5~F©•Rk¾gÖZ$DDb¹°,ËÊÙ»÷ï=8¨¬W&U&•:P‘&cTš¤I’qU”½l›¼u–’R*Ï[ãݽÝËÀÖ»Ò;¨mi•ô3V<]Ì÷ö.ÙÊ)ƒY’0{k-9¯“"j.˜Yª))l¾¥ˆ3Òrf•RJç ½`bÌ${Wš¦âðœ¦éöö6)gŒom=õÔSO?ýt¯×»{÷îK¯¾zp絺*Êù¬\,°,•µšTR.'@›œ£¡^.ÐÕ ×ílÐÞ2pš$J©¦êaN¾åùnâL(ÅFE¹¦Ä@DÉúIªa+‘ˆ0Yɾ1×µÅ2-@‡ŸijTdæs«‰È*ëT£M”Ê’DöEËlùÈ¢¬½·Þë,K²,QÃ0µa3Â`5ÏbR, . jcˆ™+f ò-W)埥–63ŒR†Ak*Ë¢(ŠÚzm¢Öº¨-²ÒZ'JVšµ!DE”%I3É$GiT‰nö•eT¢•ï|ië4M{i&;?8yH‰Qy¯çªºPEá*ç4#Ž L«Ê'˜ úËÉɶVþß2Ò 4(¥Xç³²FÄ$ïÕu™h&°¢Í`”˜_¥‰³,1fXU•càDöä}c‘† ‰ª5öKTÖÚÀ©u§ñ~]DeõC”¯·Øìÿ4Ø+Ë2Ë… €æóyš¦ÎÕé w||¼»»{rr4‹å²ª*c x=9›õzoýÙÙYž<øØÇ>ò™ÏþËŸÿ…ÿï¯ýî¿þ©w<-êùîpäx™é±ŒgK*'e$ÀäM¯QÊ4Å^&Ç®èe€{„¾_õf˜× <3Ò[omçu:Š7b …@m>z„F)×[kÓ4Í{½,˶··www···³,sÎvXléʤ«T‹1“[·™_:¹”y1Æ'm¸'yÛáI!:~›í¢?…y“&Ç»(Šªª„q««sAWâÛ©ÖóYÊi—ב¿*¥$å5FM[7ñ0ˆ ×Ó˜uÇY^Ëiܾ5Çc뼩86 ~ñAMûæ©§žzó›ß¼··W–å7^}õÕƒƒƒz9w¶²­Ó™µ¶¬£/U•š(®Õ†í–ôj³ÅrLPñ­s(ó21Üæâ "" Ú`(â @3^¡Åâû³Šß ³Šˆ VÕ|Ãf&¢p ”:G† RQm`)Ö…rEìâ‹!°Îm¸®b ë–Ã6¹¹M’xö‰¹G"}[×effÝøŸ13£6:Ê ¢ÖmØ~W$뢂„HDNJ‰ L‹Ò£JNïÜÝ ~ø/ü€.Ê\ò*;/È‘ zí€ÖZDšdðá<Æ$"–Dã3€6ÎíŠmG˜Ø00ÙŸí|YTG£Ñh¹œ23y0ÆÅ‚™g‹ù`0¸uãV–öîM޳,³VÞžœ¼rýúõnݹýêdzò«¿ò ÿú¹ßú«íÛ–ËÆEuœe E‘¥=ƒù£Ü2Z·aü3|à&†ˆH+¨W&'"Ž2¿`¤kòµ—­,î‹ÌL­æ'MSQfnooïlmK£y]D·79h´Â¤ŽìIát%˜1&MRá†Õ]UYëç" ÝTI…çr¤SâV}$þÏÜdqâøl‡uNrÀ•€åÞ{DMmr’öLÓ#ÎrYxoÉ5¼¹³>ÏêY€bmªù6î?«Ø_ˆJOaò;ÚÞªëz6› ³ôúã¿ù-Ïlmmåy~ïÞ½›7oÞ¹sg6›9çØÖäGªì–¯À¸tîÄF‡<ù ËT‹¥[¢ ·h,›íâÇ5’ Ã×HÀ؆Bm°nAÛš¸rjm7µY×¼åw.F¦f/…q>}¡Å‰ €•ÜèœWa~išš,3¹FûS‹]Å b`dVhP™Î¨u® &í°{›§03I4› %Bë™{½Ô£³ †ßûmßfÏfy?=›œ%YÊëH&͵uÁãð hÊ6·-XFTT'c­·6ß´FXÕzćTENòa†ÃñÌs䃰|îõ qµ\Îõ•+W_øâK»»ûJi£üätº=ÞY.Êa8™Ìú½!xkLùë¿ö³¿úî_þìg?Pügûû»™gýá`\»3"¯ à‡ƒmÙ¢˜ zùCvÅ£öFikÉb …FÙšA,sMÚ9ç½÷® •/†½÷’4§³GuðÞ{n‚ÄËk0ŒF£½½=‰5ÒZKo¸.¨È Ýú&aâÈ#ßȱ'WGÆ 7^Àèw£ÂAáøyïg³™XE´Š#^:Ð+MG©EgS×µ÷:èÁÄU>'Y:Ž˜`f¦‹Ù¼tŽQ£+[„XKirA¤Al™VQî‘ùB¡ƒÁSO=õö·¿ýñǯ|áópëÖ­Éd"¢Ñ©sµR ”ÒZûH˜û2‹­6DîWˆèheÑ”RL]ÐmÞAüªXˆlTÃk¡kíVÇ& iE@1bËÂ0â§£Z%âæ(Þ=¦àñ'ðØ ÐuÞæu#n˜“‡lËøšÀtŠ=™…?­•Ø}±-h¢[/-¹¸ñ#vÈmÉ*aݺÌn“/E“óÕå h­u•óÌRر²%{{ïÁáåñ6Ì—ÿþ½k”ç¶,ŠÅr´5{G˜phÍÃÀ±»·&ãG ÍOTЭ­`”ð$žäÀµü“ßñ“ SgvÎ~Ü`6-«Êîï_:¸øÒ‹¯¾å-ÿÆ _|éÒ¥ËUµ€Åb’fæèäÖ­[¯Þ»ç§ú¿yãC?øƒïø‡ÿèïLçóí1€XÖÞ3ð 7"¨çóåx¸`ŒI_ÿD=jo„¶Šîü”ÆÌD¾E뽯«Uª¹Xβ,¾7ìK¥TfPJeY–÷ûâÈ3 ¶¶¶†Ã¡ ¯žÑ°§¢Ø%€È³&lôø”Ê8QòS6¹õƒÀÒB2ªNpìuîŸVÂJtêËâœ;99™N§UU¬.‹Oþf‡Á<·½x •H– IL:1¼‰ƒ+‘õë^¸ú‹^L¡RzíÑÄÄìÈFCD,ªòêÕ«o}ë[¯\¹ŸûÜ玫ªê÷û OWJyj˜@yƒ7zÝF‘—i À°Á3ɯJ7¼cðúQQéIÕº, "0*©õ¸ÎŠ5ïDŸïÛn’Ë0™)<â¥ä6Þ¦³ÜÌ,R¦ ¢âÓëPX“x“įQã(6©u{nƒŽÈ6¥ x…Vzkž§4!ËDxf A5vÓøõ@ “T×u½,k©¤(f úúåKv:{×|?×eš%¬ÑäyÕꃑãÆ/ ¢“Âë.NMü±_Ó¬°ò®±Yáqj]"^ÜÔÖtR‘=(î!l¥ùŒ›QÃ,õÞé,íl÷ïܾ7 ïÝ»—çp|ü ªgùØþþÙ½Û7ìÿøþ€ÒÒb¹<1Æô²@dgGóíýÌCMPÃx8€¢šô²1À£ÚÊŒ‘G>3£Û½Îk½÷Á+†¼"$VÜ$žû ä2$‰Iq5ƒX|³,„–󦔂ÆI ¥þ 2"Ÿƒ¾y_CK‚#wÌÉ iàµXax(ú†wéà·~aÆÂ[L& @’$Ï HÐOñmÊ\ˆ“$)˹páºÉ,˜c²¬GD’]¡²u]ÕÖ`,•š.´N‚¢“L7ú‰ëׯ¿ímo»víÚƒžþùW_¹MÀX&þ/D$¥e™”o'jÅ Ðë”wü[çBÿZŒl A^a…„Ç3K™@"N7ô(1ÔŸ©øgü+Dçi_b*ô¼’Ï62‡·X–¾=}°&òò— ÇC•ÔËå²,K9w€ÊµS̯@œ\)etì!(@PJP{5:€ˆÌDÜ@]—E]•uí9çC?Õã|øíïøVíÜ —\_|þ{챺æÙb9ô¸ÍÒ,¡`)"Žz‘‰„X¸½GDÕ˜ ô¡Ó¸Õ!ãºSw|¨U« Œ7aüÊ>JøpQr¯—Ýxå¦óõµk—ݶ¶žÏ§yî·Þ÷¾_ÿÜç?ñ®¿ômÿøý¯Žïݸ¶½t¥ÖI¿?ð¦\Ôù`¼½ÿì¼|Y¡VÊ$¦0ت*{YïuwÅ£ö†h«¼k°N€`Å™rlñÕ¼fSçitãNB~AcLžç¢y–$ϲ­Eöõ®©Ú+U¬¹m)Wèœ#¨$ÇJõ0ž˜Ô^4ÚÍãÎU‘%€çóyQÞû,•ð††‰^eyXïú‰÷ôc¿ûëÿê=/½üû?úoYý=熽1;¶×öŸ™.Nƃ«óêÔdÌΗù`<›Þ¶{yOC`jWÖ~¦n‡68£=joèfbâ‘ädbçšZ7‚”ˆkî5ë쨉âm*à‘õrÁÝáp8 ²,ómÑJç{j•‡Ýô7íØÎO~[×µ¤\aTdšÝ¤­®ÜàäE‹…8B§I®”bFçœÖV9竵㦔ʲŒZß+‘WZ«mC#Ò4Ç®¶ÓéT$NŽd”°:K`=5"¢Ök98剽^¯7¿õ­o}úé§g³Ù'?ùÉ7n, PÄ"WI ¡}UU)¶ä-¯ Ô¦tøÒ·2GX¯°.1Ç?y]i§nõ#/èü8âÕA› +&ÄjÝÆ/cÐÆ„ÝFŽˆbO ×÷†åçŽ_ø†0˜‡ëŸÃD£o°+¥´Y1µñÆ£(b^)å©ñ3P QiÇŽ 4Ê$¿›RŠÁÇü1¶ Ç¢Xz‡žÅÕúyöØ¥ý§Ÿ¸ZNØPžgÓb¦³ý±—_½±=Úâlìèàœ©¢ó¦EE)>„7Aw枎Æ"\€S¾ç§óYµZ蘅™t­Ö‹ ~òS©êÅÏþü{å_þÊñé‹?ú7þ½Äü#„²¢Ó<뤵Ÿ(Ì´.–åxðDÍ>IÇ D`SÖt<÷–ÊREÞfÉŒ#°ª°Ó^2~øÆÉì| IDATxÔÞÍ$¹Ñyž2¢À¤N ¥*sÎÕuU…xö YOò•ýaàâýê@r« ""“&Y–õûýáp¸³³³³³#}›šDMÊ$ç[*–#†úȼ*ß<´=WÒ¿¤ø •Jyˆ8H“&`4(ðè•BÍàm£/ŠÑ7~hõQÒUÓ'êð¢äI¨§ÒÈÚ˜,˦Óéd±èç¹Óúøððøh„išhCI Ì 5&IÂ&Qm"ë  'IbÁ‚QÎùé|1èõÇãñhÐ×HJ§„Øfîåš “:I’½ÝÙb~z6)Šªª*fåÁ8æ$͵Öu]Ky¥€Yʧ·Ô_‘'2¨DctÖË/?våÊÕ«Ï<ý¬÷þæË/½ôÒKwïÞ­ëZL†óºB­Ò6pP)ÕK3pµGTÀªöäÐ"³F6 /âÐÙèGCSâ9Õ&ž T7Ž kd­Í“ÜÓo]yÃjbbˆÀ;52£DÈ6UF"1Pl›Œâ ¡h_»ÀšÌÀŒ •ÑŒÀ~…å1q“ ÝyD†[/kf&Jsëž Ä Þ¡k$S„ä•RÑT%´•ÙØ ‘³x…Æmž@”)&É´I³,KòžN£“Ĥ 5H!1f®+ëm£k‘dãÄŒHZ³sËÚVÖÚ²ZeVADì÷†ÈŒ ‡ƒžµÕ²žåy:©hæåtbjDÔ ‚ÚY_Q…¹HïÊ‘iì˜ß˜µ Xø˜ó #lε؉„¼Vé(次åd;oÇÌ&9Hˆ{• LJ‡q¶r’êL`è9Œš°è²8 %ƒº®%üQ”o’;lggqê½_-ÑcËï-G.BažÅr<%J—Ë"Ïó'Ÿ|ò™¯ÿºÝÝÉéôôôôöíÛ÷îÝ“D´\.Á$p^<àÍ//Ýpå´¯—·õׯ®h½‚é767`ëtvÑ.=üçÙzr=¬Û#°•¨Â_ƒm‚×åøÎ+Ç-ÞÀ¯Ûâ‹å …òܺ •£€oÕæñcƒà{¥ÁlçY1”ˉ|àzåZ+"bBv<™L @FT/f™‚ܘo~û¿•VUQ/‹¼Ÿl2¾a–:DƒˆUüšá˜óºîasNp=¢´Ø—ïmµÅiÏ{J?ŸÏK"¢­­-ém9!kËÝ}RöÅç_ÞÛÛ¹sëµÏáqñ—áÅDy³©6¬bsüp¨mÝù^zNRˆR—™€Åý*F¸>Æø޷߬Šå)¥$÷HçÝ…dˆ»Mø¬µÞÚÚbÆÙl6ŸÏÃZÍ[ãÄb¹Ñã¬ÝÙÙù†·¼õMoz“õî…_|åÆéÙ,ø¶„¹J’äá>Uï{‘ÆåœÕÜ\Üsû×t¶ E=ˆÈ ™ÛÍç€÷¹½Ç×<€ãm”7ÔzÌŠ#aœaÊ·™×8J—[o þ¢‡Æ£êÌ›}ƒ™6­j‹Z*èõô aÞTT÷—©q['ï‰ëÆÄSÇã‡ÌTQΫÒ&½Aš°õ.uI]òÙÙÉCóßñý^l]ó<Ïïíïï/—eX©øgàâtf¦‡Î´óF1ƒx;»(Þ0ƒŽ„×J‡i1*U`êÂ)H¦g‚FJwvvîïînϧ§Ÿúô+E9=9»÷Þ÷þÚ>øþqÿû~êïÿÔ‹åÝA_„èÀ`=%½%ƒ×ìÉyä @—KvPÕTÌÕ¯öˆ¿6Ú ¡ßWZWš82Z¥ Î 1±Ts£Ö6N=A}8aâH$ÕZ‹ª9MS1úöz=!LI’ÄAÙ%¶>ó¿Þ-D§‹×uzçB©4"Â&Q>0³¤Ê%ï%?Fì1!?«ª 4]z§Tõ*ÛDdÚÔ*¾½( ©<dÍXýÞ¥ÃaR…D¬ ¯-ÇÁ­&@PVº-ŠB)5 Ò4ŸN§eYÎçsQ‡r£hTú¸^VÝ“¿~íÚ[¿þÍW/_™Íf/ßx寭›“é´X”$D§ýºØpÑ~xÈ÷ñTÀC1¯Ó ·*Ö/ã ˆHRY…›¿”Áwh÷ëÞ‚-èf;/ö*·®p- ®Þ(ÀEî좰ùƒÚ­"ƒÑ¦±D˜$0ÆFÙk£N‘#…ÈDÎ9 bpÞû Ê Y“l°©aPT˪,9ÏÆýÞvž}û7câmB‰ÉÒÃ{wûW/oomܿߌ:6¼E,øvf£³(›'¨3›wA« kò µ Æû5BœUÖfYzvz:§Óéîîî­[7Gcüôg>³,&ùèßóë¿Üï%ï¿ùëã>•Åkyo»®fˆzпd«9@ÂÌéc…œ(0ì<  †€A#$©ÑHG_í!M4>… Pû¬^V»©.gèƒþ¹×e´üb"b‰î]/ ‘A墶ÚÁI’ôûýÑhÔëõ¶··ƒRNÐÅG‰–%hVšx-n5†Ãx0Ó¸Ù‚ Zª2(¥VaK±µI>Ä?¥(ësOu–'B’Ÿ&“ÉÉÉÉr¹ RBGæx8E4"Øí´6vÇ´ÉG1Óˆ(NRiš"êíím A¢ a›BùÞº®ÅÛ%˲«_ö™g.íî=8|饗Ö¶N’$ÛÎ뺮ªŠ¢m¯Ûây{ø-çÌÃ8R‡Ä[×ÕÖ¯owuÙ¦/±13—qKg7ÆÜêæl03oh^wžcˆ¥(Ù™2^ÅãÁVõÛ€ˆ¬¥x`¼*d Y9=1¢jË=9øÖZç‚g™G…išÖäË¢`¢íþèÙÇÛö³DÀôl²\.ŸyúM§§§ ·ôG>rD_$$óñQ³Í ÙÜ]-¤ùÎñI„6¢™ÉyhCùcí]¹X&‰~íÖ­'Ÿ¼vrz  ¿ò¡ç~çãÿÍçŸÿ¢õ3çÿV/µ‹úhw4tp’õ ñ"ÍFu]Vå2Ëw˜?|A¿Æ›Ó‰à™¢IPxv ö³÷j¼çÌ1ª2K1jõÈ p7S¬v¨|“IžÕéu•îBz²‹”‚†[jELÎ9R nÃí^Où,-dŒ“xß­­­½½½áp(²¯œ9íû"Fåš“à·þÐs %¥³‰HŒ]¦ø¼qú(‡—àYŒÇ^,ËÐgLÍ­K…|Èe³Ùl2™H z[^oaçý Qí@b7´0K"͈$ã´h,ò<ßÝÝ-Šb±X0³nêKú#×çy~ùòåýýýgÞüõp÷îÝ—_|éþýûž‰zï³<çPQ*Êòï/n”…Ý×ýÒáëuÑqó‚X¬ í"À{ݯ/FÞI¿¸ó,Œn²ñ¦}Ý‘œÛ‚º¥ã¯gj ʪ°s:ßȾjuã« @ï=h­5 1±Jc $i“ì)õŠ9ç\UUÕÒ:ö³Åœœ¿vyï©«—®ŽûÛƒ|^”ggg’fçèè¤\ÛÛÛuU“Z«€_b7وίÜ0Õ÷ÐæÎá ÷®)·×`|ļ÷Û;ãû÷ï^|÷s¿ÿÜñÉÝ÷ÿö{Þû¾wÿÍ¿ùËj0˜õÒdY²@]Ű·}6;Üo¥é ²%A‰`ñ¤k€5°R^)xÈæg®ú^?ºs{òêm:8âÃɃãÁ²èkukø¨8ÀwM÷ïäöþÕôSÏì½re÷™ÑÞ·î>þæÇîœ{½!")“ÐxN)Ä­ÄŠjÄ»ùÜŽ‚,(®¹£Ñhgggkk«tµ0à~=¢?tHžŒ²,ã§„H]wù>F¦$I:S®©ëÚ3ÑÂax¥5ƒ·N`)d±nêÅx/ð¦Ê}YT³-£*«¥P1Ñk- ©ì½”ˆäµˆH­û0Ôæëu¾Þ{ïý*_¼,\ êø+a᫪òž%Á§ø‚Q[uœC ŽRj<?þøãO>ù$kuçö훯Ü8zp¸X,¬wh´I’³³³71þJžÑs›ðæ—¨.h©;™ñªÓpíš°.±Ô¯KðšFDŽJI^ÔÿææÁ×ÓXl¢/D`À‘icóMW\žÓçC:¼lì¯Dë^í ¯ëNÚÁ8­%ýTk|µÆ`ãû‡ Ƙ<Ë”R€U[§¹©Ü n_0,«²²u>LþÌ›¿þÙkWp1/&Ç%&û—¯Î§Sf®ËÙîöÎññ)Y— “˜žÙ7f|ã×§õâáõ®ÂØb4—8¬@Uº„ É’´³4òë˯üÁG?öܧ?ó‘ÏÿþÇf‹ûÿóà¿ì)=÷¯öÒ]€‚¸.êe?Õ¾HuÐÛªïŒ/Ý,7yí‹,IJ: \½±ãt•÷<+4 2 é=š½zv|ÿw?x÷Îk''G™V™ÑÎÔ8‚¼—ާ_Aù•?í£½ÃÜáþí,½WÓkÚN?ûMo}âô·‡ç_?þþ±k¸®kv^d¬EY4W¬3ï^¯dÖ`# n»ý<Ÿç­ííííÑhT:k‡Tr®BË—eYU•¢ Vicµ’ŽXf”Pæ,KÓ4Iä†&„‘œ+IEä˪ªêºv®ŽdcI‰iyg‹$IêºF¥¦Óé­[·ŽZòy’ö³>>=:½4rÐmýÔ€"òî*i˜ÔjºæŠueY‹²,%FdÔÞVi}L3 7k/è @ê(µ„—˜L<óA¾”b>¢ˆaL¦CçØV1Âu)ù!Àœ„â¸ë×'YãCœÝÚ äZ) Ý ÷ÃMÄNcÚ—e½‚é‘[¶5hÚ}ÀÔ¾…ìºvëQ“=ÊCŒµb0Æä½Ô$‰Ê’,ï÷ûý<ﱯ-+ |©5‚Zk“Ì$I¢È(šDk DV•Ã|Ì…÷·«ÚúL,'é0?¾õü—¯>}éÊv>È´Ò-Se«’€v1‡´rNI»7üºÚ)Ü‹z%DÆG@Îrü§æZ'ŲÚÞÞ€e1M$¶íl¶vf³åx0®ªj0è)亢²,%Õ×t:MRý¾÷½ïw~çwn¾ú«çî‡?mA!Xð¾ÐYo±õ‰Áø·?÷[Ù‡_<¾sû«=´¯é&и";Mþ`£þ£¿ð—û†7-–ý*³%ÃÄñ‘)ÌÊÖëÉZK­ŒëüxÌf†ÞáÓZÇc¥Ô ×Ÿg‘Ò¬µ/X zá°q”¸ã¢   «é3º"‰ÙYRJ"¥¹I“ëœ[ËêÛ<ÖZ€Ö’ÈÕâ·°Ö:ï¥ðÑd2™N§‹Å¢.+•%1¿"#†°™ ˆ¬%>ÏÚ¨Öì«j•a'–æË93S« 0F²ün«=Bkÿ–e¶G£Ñîîî×®cNŽŽï>¸¿\.ûš·u§*Êß„—ÌZ©BV‡·\W¼èÌŒ ÈÑЈÎ­Q´á¨ÿu±&¬Q¸ûÄO,m±ÕËf‹ùÓ]¿4Þöú5LÄÔ”þmú GL:ˆˆœ÷ÞÓ*aÈšÑ'Œ‡Îs×ç|¼ ¨Ù×F')嬮ëÁ 7ž2êtûñ³³)8£0 ’Åb–fNOïUÕâSŸþø¿øÅŸåÆïÿÈøÝÎÕJTl®5jé©©n|áìùWéèàQ¦‡· Ö1ùÁ‡?óü;àÒÕÝz¨Èê>df¥.[Ïez.Ù’“B±W)aê{½ž1fØï)! Ì´ßãHsD ù5(…_Ñ‹uB)V®¿|H2@ä…>¡øžTµ„KV¶öQ3^©éº)G„„iÄìB˜l%çÜr¹”ÜÎJ(¥@Ìo©ì UzÏÌÖ¡5Ô9ïÑ9Ö/†·¢( vÐ*Q µbBpL–Ø1‡óïÖË—žûVÔ&IGQ¾×Ñ+Äðæ˜˜-{ïÉûº®ë²²Ö4ÒvL"‘h¥7O$¢$²Åóã¹QxŠÓ9FV‰N)JJ¡Æ@41ÕF$¯“‘`+Ò¹¨Ž©5•AKʉQ+¨X)Dͨ¼gk-{ªëZä-)“ 9Å…»»»×¯_‡G^yå•ããcݦRíR†É7íHeÿÈ\ € ï« »“¦¨ÃÆ#ZýdÐ]ÙÔ@ I‚þYšŽ* Që°Ö!úç—Ûø<‡,Ž5܃aÝKY¶z8±6»ÃêÅØf”k- až#G¡ƒ½«!:\Aã H‚úÜ䣶‰6htðûåu†[¾÷Þ+бI›Z-íÖµ}4ØœLŽözyàÊþ~žd˜lík ˜V|NvhÝ ä§HÀ¼ÎjÇÓð5þkøF¢hCk}ó•{[[;䨟³åå½Çªªª HôÕ¥ÝËŸúôǼö±è£û×/~ñ çïü•Åìd0øÅòî Ÿà(ßþ ¶ÊŸÈ† @%5àWŸZž-žmoIUOÃ#_«‡¶ŽÎ/|sÝ%^¾ý‰éÙµ¾y¶×  ^mŒ$‹QAƒo…­äB£zÌȃ”‡NÓ,ËBêÁƒàñÏnÜ[ YrÁE"°j/Ž{“§ÇC{Ú§ÆÃ¹¶Î9o›žW²oŒˆišm03žûܪ.@'Æ´¶dï½TQ‚ÎÀ "1¡OT ‚<‘³ÖVU¡µ®[ 8(ÌCĶȾØ>ËÕuMÖUU%R¸h äs¢P*.ŸœœÜ¹sçôôÔ9—d¹åœóÎC›Î°¡¿:ï°ñàÖ$`%ð¹ÆÃ}~@¬Õ»ÃÚ÷›[ `Ía?6=è¨.MdD_­cüy³Û/·ñº¶¹ %âopÞ`€Æv+%3"JÁMˆP$8–Ç@.@ÕxО Ùf!kA´¹+6{Cë¬g²Ì>™± þ‰ß®ª*0J›6á63#ó°?ð¶>™§™fÉõKû¹£Aš8ïXÔéÌ ›ÜZÈJœ1"¸©¯DÔl¤s_Aà.KsìBŸñíO?õ ³Ù ‰ìh4*Šb0œM*ûcÿü>ÿ¹÷¼ç÷ÎNŸO³«í"KKàÓÁ(_Ìï †Ûƒþ¥r9‘p­7¾ÿòNsàRµÆ[ÓéÍ÷·O—£$Ep¡„ü£vn£u³] <{‰™LÊ;ÇÓµõloP[`ðh+ݤ;÷^@#˜<—PwÕ_mÉùܹ1!ˆB‡ããtÑ‹…÷QöÔønUy¥«µP(v#j"VW®ØˆdM7Æ©UÒF3£™ÙYBÚ{q½ŒOûÖY ¦BŸB³šhËÎðÂÔ9dÔ¬A£2Èž˺²Î:ò P'&VF€a®ëúàà`>ŸÏf3ÅÄÙ{Omj…ô• ò0®•{Ù·Á€×ÙŽ5¼c¼úÈRÇuÀ€Õ(K°šŸ`+í¾á×€%mW]ôýCi ï°Äíöa_…/Ã1‰Åßs·nÌèÈÖãv·Ê€ˆ$D;{l-»á Ç–÷Ò&µ;­8 ï=ÕµøÿÇûÄÕÙ(mŒqÎUEY×5{Ÿ%i¿ÌÇÔmõÌ×ûû&[L¦I?•—‘2_ž={ï­«9’ÔcJ³Ð-Cûò›â,QĆŠÀñЇi<;žÎæg{û[½o8çžûðóùÈG~ó7fñ®ï¤CÇ@¥Qi])È=€ ‡EQ8»¯`÷È,̓•(ÈiJ7'*ɼ"päß×o)ÏÂFÚ³žÍŠ;óÃÇЃ7P(0úB4Ÿ§»CD)üŽ‘7²ü”0Ýž‡D›ØªÑa‡§{¾@¦5°øma> }©œõÞ;ëÉ3*DÐÌIbÂàarKÑVðI‘“‹|àßPÆžÈ:'i§œ'·ªëTCH)¯Ëúq·AvjQ™•nL aSÕNimkO’µˆ`m´ÐÂULžÀû³³³b¹¬ª |£ñäCÔøÞøöÍ]Õ~ ?VÛ†×Ù5Ž=ÞQ@Aé•ózüÄ€ò f!6SV4So?^c›ÎÑ#âqð¶øüÄ_–±³“eJ¨6÷FdG3Ô™%nkÉ®‘?ù6WBÝV‰B˜9äZõäŽà4±„ü{rªöДÝx[‚†ˆ*ëŠÅb9_̧3k­F4Þúì³Ï\¾ u¹¥L=[Ε*­óZ EDd‰<0sm‹°%bd¥VÔÑEŸÃffÏ«„!ë稛GÞ7Ñ)`}óÖówï¿ò܇û—å³ì~òîáç®]zêl~{k¸…€DËT§Ö-A™¢˜û½@O9š•ٰ͋ÿÈÆ  A€}Œ<¸9£<›ÚY®àË­óý§­èìÒ#½¸ìúîÆÉƒ?ç³O8‰6á¸6®4í¯¦-‡tµøËV…¥‚¦4I’<_KÈÆ‘Š©ƒÁ¹p³¯ÅÂyBðmE3â¦x™ª×ždÔ«B:°Âã !±à…ˆµ³âå´’K¬3Æ„¤Ú°®U ªWêkˆ”r±Ò µvß™Ÿ¸sÇ«*⛄o¹\ΦSçœjó}¥›úçí¤yëÀ“˜n½çæé²bñ@ Lßïø'+¥t¼M‰Hû€‰(Ì•Bôîü„\«uwãêË?”O8"zÇZRÈ„äMÓ[7_¤ý“Óݭ±«‹ñÎüì]ßþN`[ÎB¿·ð5+.«¹1ƹ&r!̪ó]O8D@¬´B@OÍ-ܨšQª4‘suš)ëJ@ìј´®Öé|¾LLVUUª·ªrá|‘ætxüÚ{¯üÖûíSý$À;àþ°åùºÉ}Ð3C—hÀª`   †Ù£LŠVª4ïÁÙý½oaúçû\ÍÍÖ¢*ί‰ö¦îãâ{L^Ïø#ãᕿ6‰EºT»"韔óa¦®”ô**§MŽù©ª·|Õï™4É+[ëv<ÖÞ›>!“V˜!ä@€Ñ[7f'ý¬oóÞpyzÙóƒlx õ㵺¡ê'FùVíoX?O³k–xé_Âås‡é¼N“-"*ª£ít2™ô{ê.pxl¦ß¨õq–î.ÕÑÉél˜^Û—pP–×Lv]©õü^O*³wb_ÞJýiOóV½÷@=àx±ýg½ºkœ1Æz¨jeVÉi@mø‹æ3¸wBë=‹m4‘RJ ^!îBˆ¶ 1t “ °ò+s¦ðôðFmà=HdQÕú¤@‡àjŽ rá{£×R:-sÄ߆QPJk¢¨ƒŸ‹—ôBÞ{å•R žB"Ð]´p=13’ØÞ¼÷ä€K,Ãx•Þ{ ÷2f•)Úµ5Ì;Ósñ÷Á’Ê ¨7e€’ÚãçÎyì<¦šø1qbØ—Ö›·»²î‚uçÖ|‹ˆ’vÓT[Îö!ûó«mŒmíOåaîÈjá³Luìo6 3sûvÂ(Àv³­æ‡ÚlÁ/˜lÂ#„Ë÷áЕ•õMê Zyïyï}Öë;Tš!1ŠEµ´•g:γYüj±Á(¶ï†iÙdÿÃ>éœ&é-ë'³éT)cLz69ÝÝÝ®ªŠÙgfëäød<Ί¢ÖÚzýº.úùâÖ|1}åÆ?ü‘üæo½gÐ3ÿÝñìæÞ¨÷¯õ£öG×LÆ¥}Åá\+´ÅP9çùˆýÌVã¼gÙÛÝËùÙ,öŸ<9L \ÒÉ1—ÕÂÓŒ¼V:Ëúi?Î2cT𙤀•óGÖÏ<ÕõÉ7¬½]P2#¶y–¾ØKݲ¾W65;@C_¡Nü¸¿E”iöT{8ôÌHÈ>Wjª45ô~‚˜(Ngóê—»û=\&Ëe•™¯/+Uº“åI?×)™ižA5øòæGþ þ,Ág¤CtB®\¯Ãyj|;“$ ¥$ ´‚ؽˆ˜‹ä1Ò¶ÁºN{³Å?!C"Än8±MZŸ‹¾¬V‰AxÝ2Ð7P‡Ð!µ®7+|BBD)ZDDIˆ¤@+P A‹`£âÙĨ)¥€ÖÌê€m¦nëË¢¤þpNÐW·• ÃÓ;èØyDÃR´ Ë'çÆML² ] ‚À®¹W¦½Ñˆ:ÏmE°^p.kåÏǶ•úX†$ãYý¥ñ3’ž?J]èl¡¶À³*èmÞ‘êÖŒ»Í_Å~//ÉÌÄm¡ÌÖÅPzãv't¢ÌÃ_”wÌÔ Ãh@кª–µµJ©<ï)Dk#¯”Râ$¨”©l}6/ʺRFãª(Y>Pzk÷¯üðùbN“I<¹L↕+FÜð²á{ñÐ++HDIÂE9¿zõZUº«W/Ÿ Ck«^¶»¿Û³®êõÀ¹r:;¬êÅsÏ=÷âóz÷»ß=ÞúË?urv;KûJÓÞhðÈ8ùµÙ,íA2aœæ¸_M1TYªué­)Ýa–o½úÂp¬^;NÍŽ†“^ÓÊãÒAZ»²*mµ(‹ééÖÖY‘׋yªQ—IæòŒËeïÿgïMc-Ù®ó°µÖj8Ó»ûu¿~ýÞ#ùHQÏ-K6%EŠd±‚ ŽGÊ€$†Î$° ´ ) DNÄŽÑvœ²F@¤(TD‘¢E‘´DqzC÷ë¹ï|¦ªÚÃZù±«êÖí¾—bÛ’EoãââôésêVíÚµ¿5|ë[åÌ9‡Ä\–ËÂ\ÏÇ¢2Ù*ô ÉBxÄH{ ¥[m©üá¹ç©Ð¦óxž‰¾$"$2.G·,g>àñÊ…,/릚Œ½?–Â*ÕDÖÓzUpî²òúÓΖ ¤·{®žý>Â-ø$—ÔSÿÁ<Ï­iyXÉâî±|ìøýŽs‘û!è|Á^ÎíÆú}ŸÎBûéÉÓ`–Nþi¸oö§ÁÌÉ×ìKGúÿŠÌDä»Ñ%ŸÇ†èç¶çqK§Í™˜Ä­éƒˆÐrVc§5$¯¡mpt& gIsýî£!x0Ož[B—pѯnÇOð¢3‡À7®oi­—Ëåj^ïlÏB¬>÷êï½òê'ù=?÷Ëïùù¿ò—ÿb]ÝÎ Â~U­¶66 òÊscôb»oŽ?ÖQ¯vò¼.´ìÖpûÊÃÑÆ±ÆÑä˜ãôÓ¿+Û³÷¾öüç–ë×Þù'÷dôóõbËÐV–«jUž<ºz|PªeëgDÒ.]•åz¶Ã»WõlÕè!¬ëùÔ5PŒ`ïæ*¼ú¶Ê~žûÊû»Ï½ªÌŠaÜ<~ø–OýöÆE}š­…ËW}ˆî‘Ãzd@‚‡¬¸”—/¼Ôx¯~n+ø€ßùÕ4½òÓ^žs¢Bë½gŽûsªê+ö¢êC÷èÛÏ!8ˆÍÊ ¥­I)®¾!yrÔÛsûǸ?ÚÙôy8Õ¶Ê€€*‡µ­zÔ:xVgØ¥÷‡ùªþb‡8Ñ9œ*aµÂy“J£Rª·bŒ #ƒ°Ž1ÉßB&ìU‹‡WD‚`l›.$HD$vRÛ©—t1ÿø„xÐc©Öþ¿Z¥è6¾í}Ú‹9$‡)yµ­|iúyL!apãy8óýè\ÖÖŒHŸMç.Ö>æS_'yéʺ=úTî4ñ>ÿú|ÚÁ]/Ÿ†ÓeÀãMÔ_éÌ£üú;Û/‰aÝö“&e ŸE@ÚˆKBô}í¹ïÊ<´ð:Ã×$ÚcL–”aÖëºÿ¤÷¾ö®®œÍ³<Ï%¶‘pa ¥µEQlÍ6¬øQ–}Õ;ßNÑÇuõÌÎæüðÉ ÁÐØêoèc@;Ûáµ#â¸QÇýN·2}8Ϧ!„ãý<ÏŸyæ™Ï}îsZë¦i´žÿìÏýß¿øK?ûÛý`Y~÷ùÃÿþ¤4äER)„Éx¡!]D6߀7"¾(GÄ%IµI&ÛÜ>Ú¹rY¯ŽÇ{ûU…F½íîý;£‡÷ïO7æ@Ÿ[ÜþÖƒ‡¹«ÊÖ!„¦²Ñ>€~š¤T<ö]ͳå\ÞiLÆF¿«ž»iyu¼ñêÛ¿þ‘ ‡Y0·>^O|U3¿—Ÿ=zæY÷Ö—_}ýÕwž{ž(~gG U«Ãõjn´%ôÉQ±ûpóÊ<Èú•ß¿ê]ƒÐLwoÝù§ßþàÁE³šm®®]ɯ¿¸g·^Ù~:½îŸÞgÂ.èzî¨kè ]ŽªÝ@U_Jb ,öt‘§[U Ãpâçà4¤‹þ¥Ç¸GßDÌI —\RÝ=íéïíwx"A%"0ð±Ò.ÏfBÀý\1³ÒˆˆÃŽ.i÷4™ÑZ“R|Ù³ų¶‹Ó |Ú× ãÆxÿ_ýÌ÷§tî¼õHƒfÐëŽùv—'i®°+À½ÞRœ¤wïz0n¯np—á S ½÷†—±¿4€cŒpV4mèþâÐ_ù r‘'}QxPE3œ„þ5t-¨ëÅ›^¤ é+ˆP™ö‰K«KZë*™_}Œ§çDßôtEA]ǧ!SD›¶—p©r¯®k«‹‡önÿ¿¿þž_ùÕ_úØÇ?ò=ßó-+÷WG–êú~žçjkc`ëúXlaTå…FmòŽÞüæøâFƽիb|°}%ܹ­îßÙˆRŽJ]×±(§ûÇŸLÇó¹L…‰F„ce—hb¼'rGdYêK1T!¨P+ŽJX!N‘&û`ÆX¾2»|ïpÏ¢<‹åQ^®sÉGóõšâatQ5`œÌö.:Oº^5óñŽ7L5ßðØ¼ºr¥Úݵ±ž…S±_âŽÆ=w²æ%•*¢;8¬/]_ï\‚ííÕ²z:)µ–„54ç?¿:Üý;ü·’,e`­µBòé“ý—{îöOT¯~ž]5Eᆟväð:Èï}\l ½Ý ƒÜÞcHßo%=ìõ³>õK",–'ˆ¸Z­ªªJÆAŠHý]‘Ófõ§{w÷˜¹ £©íR¬½G£Q‘s®·ö~g?KiÔ@y8uÃÍšÑþ!~ ö:Ìé‹)TÐöë}r ]wTª·N[xüÎ5§ÎÌOÌ]ü¹à!­†Ôú‹ óŸmœ{†é|žüŒ Âìý;½aÄO4µšAýÃ’†÷uëʧÏô‘ö ÓJè3¸0HÁMŸ€ÓÊO©_ï}š¥Æ»ØŠÒD2:ÏòÖ@4˜çådRdVmÙ•ÍÝQ™‘.OæG÷ïÜšnN]ˆöµ)Hgì#œ5ã†ûC±½Ë›¸e3 *þƒø”R©ªªiš¦i–ËåjµúÈo}ègþñ?|ãΧ¿ïûþl#?ªÑWrÏZb<·ÌލŒQÅ<ß0N(kM€*İ1EX D}AnïÍñÇ;dõ6R{y^£GY^ï?‚åÚßx 懻âV9™ âh:=ØûdT¯«òšñœ‹Ï1î€ä$9aã\ €ÁZ %Dmeá*šñxjFŸ-¦ñµßŸñêë½{‹°ÿˆ¶·Ÿ±&Wv#gtà ­.:Ï,+\½Fµ*'v4õÕ‰öÎʘOBP«ýróЉ1Îo‚j¾b‹ 06ä'¼¾nâHÉáâ0¿è/œ?4“$Œ¤Äf @Bl‚"-ŠZD¶(H\)6Ú«gy±9žìÌf³²ÌIÍ»€0!ºpjU¦”xðZP$"*­¬ÒÞ{ï(=ué’j€BTZgÖæ æ•ÖJÛ¤w¯U(IEdfì<`MªmÂC­« Ýæ„¨H¡J¡ì¢(úDBѪçˆq’>(¬¹yóæ[7OŽ3«cnNæGEQ¨ˆ„(„Ò*ƒBÆd½`gîÌ\Ú¢· ˜9z+¦i:v›1&…) ÆÞ›—Al\I ÌÅ ¼÷sDd­uÎa¨”„ÀÌÊhnRº•Mè eñü\Z/içmÂÇôÕ$5Õ)7!ô&’Î&;GS!Š!4ƒþzˆ ó“ÙÂZ«Ð  BPšø/`Ãö¬!rŠ‘g>O”t¸NÏ ¤Ty«§¢[C…ÒD$‘S{cE*µ#¥ÒMç³S ­µÚ´$ 2mÕ–Ž1ºBmn…¥³¬ë&FeŒ1„”[Ó6fβ,E¹½÷«ºB€i1:YŸm€ šl.#w´Þ-ËK“Ùl4fˆ«ÕŠ3£Ê’Dê†E Ìr–°Ž"}£bD]Éҵµµ=ŸÏ3[\¹råÑ£Gù EÖê‚#¢Xq!H¬êj¹:^,>zã÷?õ‰ÿíïýcv·¿ÿû¿ñÿé8€ € ¥é"”R‚Ó†xZQ ß(þ¢±¸œ¯*|nãØ5õ•ÝÝçßúz9Ñ•ß_핯~òPÕˆõÊ'[$œ‡²>R[ÓƒƒW3Ãã .äÐ(š„lJb€Î8Å\ÖÐÔÏ¿ýîáýç´Ú=hîÚÑ‘«§«Uød¡¯U<Ê7ËÙÜ|ýèÎ…Í6Ö|`g‡‹‡ßuç•Ï~ý»ø#{±Þ±¬v¯ÇûŸžnNêU]‹­ ß`û(èŠëMZªÒxQw³i‰—~÷ÑÞ‹-ž® üL+¡áŽY¨ XÒ¶A‚€GöÄ™S¢ 1(Mʰ.ÊIQN²|¤MNÊ (%è¼ô]ØDpÐDVD!h€. -bäèB ÁsG…%"¥IY$ƒd@F‘†Dˆ9sA…ÐXbfê.íÔAhëL¥…˜ˆH ŽÀ©s jHIÖ@!xWUU A÷ÿ+]!æpà ÒzÀi OZéKéZ÷´ãÐ> ÉD°j…=Ö€×{«Ð NŸ*% sxýÁ±“Ž!>Im~Ì‹…'¬ákqxÌÓÐ¥ÖÃøü© çùÝ£uÿt`WM×›A""„ÉÃCĤ0ÓÆQaXîÚ0s’b阽F‡«šÞ¦ÄfB€º©$é@“™,ï½µ†:vqêNî{^'''‡G/¾øâÍ›7Ÿ}öÙf¾œN§#­/MgÏ]¹<Ó™q®¥Ï¬‡¡ÃÝ7öHl¾( /2Da>º»½½çfÿàÑå+»·ïÝ~á¹Öëõb±ÐÄ‹Å\!Õu}xróää胿ùëëú©q‘7qùwÿö+°üÃ$Ô½9¾øFôµB¥dYh›õÆ|Y³’ÙÆn9q—®™ÃéU£c«ý|ÿÙâ™O|å·Ç³ÛÕ‰Ÿß{öæ§‚ã]=€Å¹Ç—h7v+­òű©ëZ[dcl²œ›…b¥6vW£Ùíë/Òü8î½úui}+Ø|‹ñW/Ý¿÷¡kµ›_ÞºöÊÉUK5‘& !ˆJ"“}îÓ^ºñiŽfﵯ‰þãÚ>%ÓYVŸuÓÒ3!DÜ@ô–LÒ3.´ÖYYe)[3ÙœÅ͉+KîFD,cçâ´æs4$†"žqàÒÂ1ºÚ÷ÏŒ1HtƒDg‘ˆ )"2JÕ­£d‚>€E“AA`ê·†>ë¬Oe˜YÄmP±-·åÐo:2`Ã:çÖëõjµJÌûÀõE£Çã~žÛ9Ѥ”Ò†´1ÊhT˜„dH.më¥8)R ©­î‚3T ¤½{ôÕD>Æ6Ô{6§Hs†ïÓß‹>ì9,ÌíWœu+ábÖE‰OTRA‡Lªkû!ƒîEü‡5úKZØJ–¦7X$vÂkbmA]ËÛ4ÿ)?’ÈP`‹i‰¥ØlØ'z‘Ó%‰Ž(üñ Nï-‹~]õ¥TS»¼(óÉäÖƒ{Wž½F€ÏlîXRÏíl_ÝÞº4›f®nbô", c<“¶xìwZK=_V«Eª9¬*g­^.—"rx¸?-vÜ?0—ó“Zh¿ñ›¿ñ¡þÆÏüìßs~õ—þÒ·ŽŠ¸\ß*а™½ëðþæraNš|ëüó$,%æ¨cýŽ»¯Á;ÿÄÜ>sõð•WŸ«æEÜõJ©P´ÝxÇÉ3_ùI ¯Ô˻ݽ[ß°xx-Ûø'ñ)óc§$¬Çö¾ÀX iI4(ÂQ Ëz¶¤”ñÍPF‚L7äŽÑ{¢–?œ"¾2ÐØŠ‘}èwÔ„05 ­|ä®Cpú·®‰RB$y6M$¢z$)­Eޤëß§«[$eøº®z[9CaŽ!P"/€HŒ^ºj+èØ@érœsÉýM³ÁÌ}­3cÏRxÃInQ-¤7OS¹­™rš>>…%˜ÜzTHš²HŒ,tÊšîmŽ#¡ )Ð8¶ê»ÀІŒ{LL¹Ø3žèÐèà̰¶m×øØïþ¿ðµ8üÊÐ(ì¯k8E¨‰à?ଆWÄ¡¥zç|㟜:Å·¶åeŒÉzÓZk‡ œõ2{G3]WŒ1µU€1)h&ºã¤¹€-çy>[D°Ö*¥R º'Ì7u@ƒû‹“ñtâœóUs¹¿ë¾¡qn¬ÔuÍ•&/‚×rJžmUUÉí1>=(Z¡]-êÍÙÎÍ×n)¥ÆãñÉÑñtºuûöë[›Óßùø‡>ðkï}ßûñ›þô[ø¿àÐkt<9yc6ÛÀ$ó&yCV‘!q‘›º¡ºæFˆåÉÁD.ÆQdÅ‚1,LŽæѼ¥jLÕ¬›¥¿þ®úÚ•ru\®*›eç§œ”2ã­‡õª¨V3V5š5WcB¥¶ÿsüë¿xys÷Ï݃ýçßr0²w®¿øÒÞñù)6†• Ò!Ô{/?Ú¹þš‘ÝÅáF¬Fk¤Hm©*PŸý½úðîŸn7â½g^ÜÛzá¾}÷Ãw~ïçO©•}F ½Õnß  0ˆÐºT-°ibMÑbÌ1æ5zÄÔ·¦¾yÌÌȈHHLìÉ«Øæ Z§KP„$‚4;^H0¹{iïUˆ„ ##—•&$´@,h8" Kà¨ÓŽ9à%ìT›‚´9çÒzîèKÒ54íÕ¼÷u]'NñÃÃCôJ¿Ó‰_N릶ÂBDQ„¸+I"-p 8ƒÇ½K}zªͼß:y °eR©aI<N<ÖœúµýÁ–·Ð~Öÿvœ.¡8”]üƒŠË‡ã1sPÎŽáùøÏ4Î×Éê2Fõ³ÔÓÔ“ã® n¢ ¢(…Dvhhö‹J©ïˆÈ(¥”A Z›ñd6›mŽ&3k-"e™5Æ0óÉÉÉÑÑÑjµJ*E™í‰,z< IDATNËÒ’Âv·fßùÍïÚMPÕÑßÔ)´£A2EÏ÷†ž–ÐPuDDBƒÁƒÒtóæMcÔxRÞpw½^ýæ‡~ù·?ú‘_ø¹ô/çW¼ûÝ¥nfiTËÅÉx2C€Ùì@\ÎOÆÓmß,͛ܩ/ëÁ’#$fM žW Un1Te¬!˳•×äÃXxKHQv¬óýM“¯ëG‹£‰Í*˜ò.ÈùÎEáÉ<šß ¥°¶¨cÃùÈOÙ?p\¿ú)|þ™ïú½ßúoý×& ÿŸ½}Ó¹Ç ^Tv'Û>«÷oòd÷Á½[3ïfÄiWÌŒ¢€@vw®ì½6uè?øÌŸ?~ñŸ>(æõöSÍϳ·ß%™Y$ˆDa‘%B Ìâ°¯ÁUJ4™Ê •YVZ[h!&ˆJ¡bå)m<,È€(D‚̱ë4L@&Ô;!Jmf¢ˆ(RHJ%5i­S“ÕE"K¶H€‰|ÛÏŽêÄèè÷ýN‘ø °ÀŠ1Jä”Õ¤¬6ZµE*IiÑi‡Z.—Ëår½^'äîcË8ˆE÷ï|žqºR™Sâ6¶oË)òaò‡˜!u#F€ „‰O# }‘˜ˆ(Y£M„cpÎ >žN'c´…òq§¹xšQ>Ñž˜vÎx 2{»á"Øêc¾oÿæ““öG7†è sªÇþÞMvÄ)ÓÙ¶¼}8G«œ™‰NÓ4-O¸| •²ÖZ¥“¼ êÂzï±»—®\¹r5+Fu]¯×Õb±H=Çêºnš&5ÀöÞ?xtw{çäè Žá'ßýc{wï9i#«eÕ «écã$îD;ëϰ¿:Võùx ä}S×õööèõ×?÷›úýÏ|ö“ï{ß{ÿœsMn9JØ™¨W'—W«£Ñh&â™9/Æ`lñGµs| „´(RdÅŒÚ:aíkT:p“±ÕbùÐaµ5½æëNöŠbDÖ`ÑÈÎÓUäæxL6*m9¶6âòxóÚsÏ,n|Õôî­7D¬•Þ{ŸÌ¬ ¢Ñ:cµ©û3„ǃÆiôÚ#ÐõvL:ˆ}jYκ³CScxÉ[zªµ8D©á];¥³ Ì5 ÷eøçD„D€DbLÌ=Ð:Hè-èæ!„àb-?²?8!÷¡](œ¸¦FÄH1"³K4D´r•÷^)V«*0¬V«õºr®FƘTVÛ/àé¬÷ø“…D»žODÖH)“ã{OêõöáÑÞîæõ&¾1ç«úB¹4m%¬v”]°žGTŽÕ½3oc" F„A´èEª­É×ä…]Îg¶àíKL«„ýÕáã½8ÿÀqêŸN™ˆˆæ†Xë.·µUNÑÞ×_®ì/Uâ&åçx4ÊòÜ„œDÉ21FÐÅŽp”*10FtkÓ?zg3d™lc–€$›W]?†´Aw}RMµBrÓ·Do+½I¦À3n™t:Ã0( NÈÁÚ†o\˜¤êÜ{´¯“ĤPs:ÛTΘz¼È@‹ ßZ7©>y"Ðç‚BÒ˜ô SåVRNUÄ= Jä¾]‘1Ä„wjp+ÏŒ´qQH-í΀Yüp¯ëôØ:IcÈ!¸Œ¿!g}åþý¶–‹ëƒÿðÐèÿ9œtJ`8  b²A‰(;àS‚c–e)s ƒØIÏõ kšÆt‘'‘ˆ´6«u}ëÖíuí˜Ù›eVDŒ1ιDàOì„ÕññõCïÞP«õá~6.ÐÀxs,æ¦n‘@1fˆ@ç³ ‡ÁD¬ªêÑ£G{{{ïyÏ?øÄ'~'rõ?üÍY¸‡@k_j @^æ“Ñ!ãèM¶,ekc †•[c&Óœ€4ßìbôå<ÈJðž}ôŽÊ¼°j•8Eë̺DÅ™8È6¡©—1jwôP¾æøµ­Ù^”ã½}‹6(sâùZßù¸"…¦d½ý$³…Ö*FšMcO&›WG¬)÷¤„ =`cçañ5fòûª¼/îkËYýèQµ³ý¼ó¯ (À)¢ XÜáñ­ÉÖ¥ÊÎç¼]*_‰ú#±þóO;?ú‘ªßyP{ʳÖ[/ó‘^yu}ëpƒnÖ‡õüÞlßå¯ïU¯Ü#!¢ä9Ú‚Œ yîóÜjÍJ9­ 1dXë ÔEšè|¿õÈ@+>Q—)ˆ@"C[V«¨o&*¢–M5ÊÖW·¯_¹·µ9m\ߺruëÒ¨Y>ïÍa¬—žSįÜhò#¨•Ò¤Z²w„èšfµ\öûΫÅ<L¦Óét:µ³E¨OÖ‹Ãy³¬-šH–"Zm,Yn"fYjí§¨ Žâ™r"#eÖd1ƺ©ŒQ“iášBF:3­¬3sSkR´·”A% ¢$;€+AcŒG ®B• ƒH$‘†%)ÔJ33(e”6ÆdÚX¥Q‘uúÒ’»ö¾¸°@Hεpðô5…ÀÔæÑ#’RF¢h2=ôyàRpŸ=ñÆØÊnœ.à±úCµŠ†º þÉ)ÊóãÍÒýÒO”QµƒN}YìDÁDÄsÓÎÃcëó¬–xn„)ÌÀˆ¤Tb¤,KˆÞï¡U EÒZ)*ׇF 2%Ü]8ç9ú&Q<Æh•I1dn5RÐ…ÀÌ®öY–AH‚"³¼,˲(Š£ÈkßlL çêåz±™aµúÑÿüFŠ¥i"4 À̦Q„]æè]–eD©zx-]áܪžéQ¹!æó…QzµZ•eëh¬ep÷î¾~çîç~îþþÇ?ñÁÉxôS?õï5É^^¹Ï|Ë¿z´v‹}à-\?§¦ŸZ7óB¾¹¼ô¡ý;»ùôž;ÞB…Q+ˆ~£Ô7·w@x=?˜ìnùçÞ–1îÞºuäçžgÜhÃÍדà)£%{gí¾[Íh=¢üŽÉÊf¹[ŽæË½óÓÌ]™Ð(,ânyÿÊÕýÝ+xøèëö«ÀÓ”º$S{ˆµÎŒ²õœÝ¾ zçåúèxñ‰ûxû¾Y.kµ?Æ,¦FÙZk­ ¥Ò¦ +ms"(/âe3§bVHT)æTåñ^IécˆÒÕìbr\-ì*¯?¤Ï<¨H­®nU_÷Ž£?ñö¯„Ù1¬”~ظH*CŒÂ¢)²êœKÙÜù|Þ£oÏ£€º®1ãñ¸<*‹¢ØØØHÝZöç‡'ÕbjPF€À ¹ÊˆQA!P¬€Udð¬„AGÐÙØZkóÜfYr€Øû !x-€†4hE–ˆ@ÓT¨P „†]Ã.a€°„VØPªàSõX­¼¡ÜRm(éNµ`Ó­ñiWˆ‡:ú†ƒ>G ˆôÀ™ö˜¤A):í¨huÉÌÞ{vNP¼‹˜…題€œú7"¨n£B!:],é'¶Nðip¸­Ý¢Ç}ôv¹µug’ , Q]PÞ€ØÇf0)«"¢ó!Æè‚«ƒk¢C ¼ŽC„Ô¶ˆPE„•qÇÈò´D’.Á,!²ìǸŒNk—“”øðÞ;çcŒ¶´º,•µD4*'—/_ÞÚÚ1Æìíܺuëèу¦Zcðöö~üG~Ô"5MÕ[Cƒ#ËŠÅbáœ+Š¢,G"âœs.ŒF“õªzôè‘D˜N§ëå|kgzëÖë@Ë÷ÿü{?üá}æS¿;ë¿ù?þPÕì7aßè/ öT‘e"PG‰)ÎRæeíO’vl‘eA fÆBªý€èÙC2¯0.¸ ÌM©ÉÄ 5"â—k@¼€ NÀ  Àã$ÖÏ?6G/Ö«¼YÁ¡;|põúüÒ[Üå·ñbïjÝŒ–Ë…µR¦(ìÖî¦QÖ^ý?Üj£Y];º÷Ö£½qµ%*§½ÑåþÞ²q–PkKƒ µ=ØZžÌ8LHe¤=Â"bÔµ|vkóêë×ÔQb(öÞxfïîs › .w4_øº±…ˆB!« Ê'6¸®!DÊmIQ•óãÉÖ;n'Þðõ3®VQÆ‹“òàî¥ý»3ÈžR zÂ*€°AdëÈ>¬2<™èzñpùÆmù̽ÉáÚúØP\å¤ÇµN­Œ!¥jB… ¥rM6’ “ÀþyÜî¤Òý“cÂ×ö3§N!ÕùFéÍvÿ*. ’U–èƒwurëöÖ7}Þ˜\¥±9^„FEÉ]¸fã,„PÕURÂKŠ©¢·ßöI/YÎOŒ1£Ñ(¤'“IY–Þû£ãê^Š6ÊfÆX­‘BT€¨Æô :­*Õ]‘f)ˉµ6ÏóÔô×9—â͵ó =ghÈ02·âb $Œ!2rô1u2d‘ˆ”æ“"xA„ô6‰@ ì}tZkêkz¥Ò ‚QƒQ1+­UŒ »h°QÚšS­ïŠ%ݸ$ö”E‘…!Fd(#ûÄ>w=tØÝ:»}À<¥-è´‰$w¥RÒ¡o‚™%ÆóžBƒ´uà"‚ÂÂ)÷yÎùt¹†´S%1pú”DTFi«&šR I¬£Ïz´G#‚‚úŠ5 JXƒDÂ:Ö‚%ÆED½5ÝÊó<²\¹re{{;ÏËÉd2›mÆ÷ßxª¥ ¡Z.~òÇ~,Tëíé4zïDSý5M3SÙÒ|>oš&)¹žÏÕx\çï?¸µZž¼ïW>þËïù¥›w?ô—¿ÿ»3Ì‚ç…sÕ8y‰ç“ï¾øð]·r•V.2•Y×PªâU®mYÁhʌʌòÞG2È ‘D …ã)W¥ÿÄAHOG'›ñ,ñç­1?fWëBaA#Ï›û‡“ÇŸÊ»ÉÖÖõl½ZãúŠÉsö÷ÜÁüáÚ{¿^¯×ëuUU©”( =‚ðMŒ¾æ!„õÉQQ1Æ£‡«“pN+¥b¤R¡Òt* ]1¬ýò)•°”kEDÒ4ž#mOB†‡mÜ=nÖÈ'T/I-ˆ‰ +rÔÖ”™•y–eãñN‹Å¾Î¿1gi_ýoîÈD8àL3_ÝÐ/d;ëjR×(’¥”B­e½>Š«½Ñ³×ßúöëåíe]hºmv’Ôßi]MWçõ«GŽIW¼÷)ôîœc†º®Ó;Y–©®m0Ã=Ó´¨ö)‡˜jF=)Q uïí%ÎKʪ®±DŸM"GVþ$m¢m÷%û´¥M¯„‘½÷®i¼÷d5PšêNôÈœ¡‰Z$êôº†ÉÚ褿MÃpŒ¾ç# …=?tÉñqWú+¸³à!ÒpÉIÇÎ;gÐru¯Ïÿðy 2ìR!2P‰êÏ“;e«¾•–t¼Âá|ž®7õxßt2¡ò}ûâu¥„còØ9‰’<×Ï\Ši1‡|“Öçh4ZVëވ쯗™UÇOä® 9ϺY¾ñÆÿÍý“"AÀ+d "L,hme>_Å6@¹¹q@žšðùÇ3P)݆1b@TÊ*° xï½ßß_|ô£ýèG?öàþ£óÞ—eyéÒ¥k×®mnn~ó·|ÓK/½­(· ËÐÉØ®—GãÑÒJ_⃖$%ày P႞2ç=2×…ó¸Î˜ieÍÜLcƒ¬'‚ŒŠšàApÓ¨q6V“ Bž1‚Š5AB{¬¹P”j¼cE¹6yíkÔ3E …¡@!Z¤¼Zn‹hj¡PT<®˜WbÌù‚T”MØâ<›9 @…ÖE‹D63D%AªÖsK˜FZ ± •Š7B×¼pa]ÚsáРÈsÌ] (±´qk´:9<øØg2qZÓÐû|ˆF­2dœ#qÛú·°f2MFcc•8ª¨Ô–EäL(gxÁgkÿOÿ£S!€ŽKœ6æäI÷ÐÞÿ¾½>šêlÃèBˆ}X»jmÀ[Ê«êàw÷õ¬¼þÕjBºÞߡޜéúèø´²ºÈj*›¡' RÀGVÛh¨ø€Î³÷‚QÉ;Œ$ÌÀ\%¶n# œ:@!*"â€QHAž‘EEÁTÊlQ˜@0ii‹£01 Æp† Œˆ @P+ïÕ—u ²‰I¹F–¹7JçX™:6핲ˆv¸åWœ‚ ôÒ@{! Q{=ÆRåˆ,ˆû[£:4d@F’ÿ¸¹(Ó¢Q{VˆŒDJ«' zƒ Îð狟îiš#¡‹$-Ï9 €¯€v¢û´œ–J3‘™Û’²ÞZ¬.‰úTP¥}3›Ag_ŠHô!Tu£Êup…”R*rôœe4ÎôüøØj#‘7¦S“m=xðPÝ´gºþ¸É>è=àï}QeYW÷îß+ŠâÆ—'³k×.38…4_®ŠÜ­–ëEf6•±Á5Óé&±BË)ÿRñüÚûË) ­Zèäd>>Ü{ï{ßûþ÷ýêjµ~ç;_~ùåoz×»¶SG­u]ׇ‡‡ûûûóùüïü¿ï\óòË/ÿÅïù /¼ð¼H¨êõxüìÛeý€A3 ‘ ˆO×ö1šO²h”ܪ‘°u–‡Ä "ûÆc´1D³×Õ b`3¾çš BÖZ ±ÑJ²L;_*“iR‘%J­À1+‰ViÀ@Q…-ˆÈõÆ– OW­ëI•ÙTgå(4糩Ayˆ9°" 1‚j*Ñ&rtÂ937´DÈ8×X›Í´Í@E81¶*TôOíHØC6ÓvÁÜĦªŠÛÇ«"d rT–r µHèœ)"²Ö–e9ÊÜ0šÛÐî5ˆ\€ wJ†Ÿy|?M¬Æî_g]“)Vtƒ'O‚Ê ÊªNö–÷núõ[c]ˆJ&µd£¬¯INc$•²Œ}ÃÓ!!A†ÐÒË0 ‚DT¦–4‰Š…@R+\hûÛ§bJˆ¢Žî¡ ‰ZøÄÔÛCŒýT 2PKDbDDR§ýê‘#·@m/¦Ô¯fF–Ø*_¶b‘ ±–°ý| :;•–„A—î ”ûßí‹ÞÀêYRÒù—,ÌÂð¶]fîýôö6'äˆÂ BÝa!Iy`Š#·©àôjhœsü'BÐÀx.О?Òñ•5­/{öÏ)¥ (­{Ä£A»ëás!"šÎD‰úß®³†‘P‘sµs!ú`”*óÑÆÖÆöÆöx»‹¸à¨!jEY”eôŠ`“``!%à„ê£CИ)L1xã*ÄdùùçßÄPÆ¢}h"GN½¦ÆÎEœÂ‰ÈT¨Ö$9-2‰ÞE¿Ѥ¶ÑX€“§ší…q¤L¦Ô°zÔ,• W¡¨3t.,cФ4R æÚ¬Ê6l­Í²,³£D—§F]´!2ÃY …´Ýpëª@_|™ŽÖ1¶z°Nß%‘Øx§HmêãrYEWeŽ«úsÇ›A6ÌHÆÈ‹ª’uÛ¢ ÉVHLé½m“ÉAHœY!*'QX”R¬ÐùÐnšÂ$@ˆ(,Fv<3”6OÚÚ% #2*@BRÉUf–Ȉ)äÛGY„ Éûº-ÑI`"HÄ71EïQZ’QbB“BB$Àˆ>6iª›\H€E@‚œÖ(ï‘¶»Që±Q+2t<½w8qÑ‹ˆtËý] ž’ ÒMWËê"‚!J{±ÝbxÂníóGì,€.TÂÀ–Ìß8]“Ýzè9HDÁîº]l;ø…ª]<!žæ‡7Ôð©T' 'mx¿›±–ã¶ZW£¢œmÍF¶œŒF¹-|ãî=¼ï1îlm¹&éÀ^i}xxxy4 á4T(-›Úyï/½ôìæÆóà£gq™Õ*pdm”-¬€År5oÖu•瀄à¬ÍQÇFg@ ÄpQäà‹l vv°@j¹¿¿wóæÍþá¿ñíßö?ð?0™Ì‚窪´¶Þ…¦IšÛgn "Z«¯_¿þÜgïÝ»óÁþÆOüÄO|Çw|û÷~ï¿O™ýR"A (::´‘ Ú€^4ؼAŒd7…‡º†W‚Ô>\Bk5ÄHÀ 5KdT ¬ÐëzÅÌVÞŽYiÂ4JÚµVœ?ŽÆöÊÊ×.=Ò*=Ëä›ñΩ_@¡ÎbÀY›U1:nªós´‚µQ#ZÐ)bÍÑX¥ko96‘k-›À:Ĉ9®".£ÏµÒ>Õˆ«àÑ{ êébÐt6ŠõZÜ-¯·üò³_ýmå/üx5žHã¡  `!Õ Í(ËFšak’× FIQùÚ‚äÖ”¤|ˆ5€h•±Å`3ÎøŠ% IDAT›[“à•1°ªB£Õ8Dà,–P;&)VJ®ˆ¾£h¥ø…î[z®òXŒ¨®–¹ÝŸ×Õr¼±öá^W“³¤Q‰ˆ¡0çkŽ—Ì‡?yÿÛ¿ãòÁ‚ÍNFÉQ´î;Î"¨ô’!iS§âö–¤œ"%,!ŠÆL@00šNÇ:! ¶\b}ªI }Ñ ""'¿³ý/Ô”z¤¬ŸFf ÎË K ›½7ŠÉ‹Úî©“c 5t ¶~³€PojpìãÞ{L[v`„í—‚w‰µ "ªo y†wZ m÷aj3ÓÒRŠX@w€(JË"‹ˆV§Æpôâ¢ÐºÝ’,Lw(…¥{Œ•¹~³„3¤ÞœÒg+“@öN!ûtç:£FD4&%2½™ED¥w@° ÅGR)ÐM’æ ’M‘ DDéXÜ,E¡ëºŽÌ¹±Æ˜¤¾ÂÞÀÞ¸t­(Š}Ó4«P—ei"¦dÚ* 3óõK—æGÇ$ E¢÷··7'“]hm9hã7éµBR8éga<ÊD\–)‘Š"‘ô©L@_è Z›åza¬Ê´ Òf÷ýéÏ|ú•¿ö×Þ*DDAà(ŽL[^ñäå­ëjww÷äääÊ3×ÿƒÿð?úÀ>ðk¿ö¡×^{ð×è?óÞç6Ñ›¶o1œÓÖóKk p»C hÚ3È/x¾ÃÍ% åÕÆÎ"ÏÔ[¾ö#Þ0ŸûÜÎÑ~Ìò²•«ÝH¿PUnåö.OÌåë‡Û—ft{¾„W?öm^˜\û¬?ÁñtÓcµ^]Vò,ð£ÙæÞ;vók¿jÔóû¯]=¹ýÜþÉ!]>Úð6÷°|f÷Ò'Þú6Rãc.ÿOwðu¯~ðOÌ=Õ¼”啇›/Œ*w¿,Ç7^úÚ_Pë7~çß\ð>Nn#nHÔ±|N®ÿÉéƒÿég>ú­Ú4û3ö“E~'ð³1ÐÔ5¯‹Ã;Wn}î­8=–§³O@7M£BÑTÁä±qÎýÿì½YdÙyöÿg»[îµW¯ÓÓÓ³£ 0,`¢¸Ã\M™$#D›¶‚/–Ã…zQØa>P’ÈЋ¶D‹2MP‚,\@X‰Á`³ôÌô^]{Uîy—³ý~¸™YYÕU=Óƒ!‰!ñGGEöÍ›çžsî½ç;ÿöý,ϳ\„‡|jLóD@J”^„ÖA ¥$*÷ä­£¡sÎco­%G ,9g‘À":!ÄØTI$)©4ÜtyÕZU@!pD iÁŒ–Yt1,€­C”!‘3gìð1–´g{ÞƒMÐ:çCÇKsá}Ò"ø óyçh†&é°µü­,L³Øvo;êÝò†ãšuÒÄ.Ês‡5QzÓ&ÅÙ¾X€ï:ñ Mì¾æç­MæÛ%³FãéFÇØH¦rl‡´3k²e”V™° “[O”¥©”2R1f æçç———“ .Šb? C)…µVÖ{_¦ß !*•Š¢ÛÛ#¢J¥²»µS­VçççÂ(ð€†£AŸàûk*ižVâ €ÏMÞíôÿÕ¿ú?wvv~õW•s†á´¨ó>l­V«Ûí–õ¦Œ1ýèGÏŸ?ÿ¹Ï}î×~í×~ã7~Ñ“\özµî§Û¯ï wÈj͹å~’t²n)þ¼÷V È3Di]ÎeQkÀ…Ç¿’磫¯¯ ¶Þ/c΢½`ñÎ~Ç$ò!£ b†!`FlXiuZ+Ҳы_~Òâ釮žR¶ÿä¡ÎFœ,\¶Ï/.Üzð]7òîÒúk0nV’ìÑ?÷ì Æš‰-Æn;B¤ÜµWòõh“›¡' xÌYQY<»Q­õ²<±:‚qi óõ[ÉÚëOôdPY_9ýróìó©u«â‚“d¬µŒ‰ã½/ƒo§Ì´GV[ιÒ!3d yãÑ‚ð(˜äç’sð”Y? È-‘÷6†Žœ±¹à²t†À¨L™%oÎuž›B[mÀW Qʪ5ç™'DÎ,v¤è#YîZŸƒü‡¦”EXÛ+û9e\² Ø9ç-Ógˆ¨üËÝ!)kÜýEÓ4²wÆÞ{Pð-Èl¦ÿ}Ã_MQíÍüäî¾M¯uÒi³Šï‘~Þýù¤qÁdÆf»ú†C»»‘“¾:Vî«ý{]Ƴ\†U—^†»ïõÁöâ.=;!³ynGDÎk­½÷•8iµZÍz=rsc»(ŠZ­ÑlÎ ¡²¬Èóœ¡TÇ1dÙ(ËÝÞþpÔ‹ùÐ¥ Ë+ AÈ­ÍòbXúå+IòvÍÏ;EÂ0ÀÂgé7ó·nÞ¸ýwÿî/Ôjµ8ŽËÔ†7ù•Tóóó+++Ýn·ßï_¼xñ£ýhDÿèý/eoЫVë0<ý(Ι"gƒ^£·sfûÖêúͤ»Þó…”Òy ¯Jg3vVO ±«?Ö¿ó#À’~Omݸd†ÔËB°¢(œ… ˆ¼Ï÷Z ýÆÂÖ­óûûç÷vW÷¶k2öógÚRº€J8˜›ß¬D•Û‹;µQ÷t{¿/´k5-dAP†‚zÀ’ŠÁå«$‘š?ó°‚«Àš*ˆBZwúì5ÉSÅg,™yTç ‚‚é ¾û}Â>ÙlÅNßK Œó[ü¤Øê´²Þ‘óp’ £Ó¡`& y$E(‚ˆÂn{'ÓepDÎPð<Ï‘åÈsç¼#æ™qhC é=#‡¬,]žDQ*›Í[ãƒ0¨ã…! Æ·ÌþÓv¸$¸Eì8]ŽQÓWhÊž1]Úølv ŽCrO¬Ås²LÁãÈÁcOx pd‹óf€äXõë$™NËìäÌiùîñž¸g9¡·³Çg7(÷×,½™«¿™±;2†U:øL“4¹iïÑÕéÁÙÔ¬Ù–›ñ6v°¼e•8Y]]=½ºª”êõz­V+Žãáp¸¾¾ÞëõÂ0L’Ä9g´vƶ÷v÷v·›úå'»ôÐ9%QIÁXɘè‡ä½}Ræy#²þÏkksïüƒ_SJ•)%Þ¸æÊ=WeÔK¿ß·ÖÎÏÏF£ .üÄOü”ÖöýÇÿ¸^m–×Šãø¯«cø-HPéJ:›Û[`{í¡Qç4¡ âx’YërÎÄqØlÖ“$rÎôÝNwÿÆ×Ú“O>~ñâ\õZ.:Ó&/ÏJãXè¿Ì9ü‘n¿ÿìןÿüÿÙ/üÂ/"£]¹ÖM³!ŽR•'Þûz½n­Ýßß‚ V«E1 ª•ÆßùÙÿúùçŸÿ£?þ#mµÖ…ü¡ö— 6BU݆øV¹Qi¦AˆºðˆÈ¬-<çB0 CÍÅÎN÷J£yæÔâ‡ÉÌ÷ºÆD$u¿EKŒ ²ÜYðF$›YÏ•Â7‰<†ûÄzÅ(‰c•µ«ºtlƒ#®ø°YÔZWÍP ãzp ËПúmáMãÔ…nÖ™“Á>YZ>·i²jç´ÇãM"ït‚3¥Ã¦ë½¥ 1Ê ëg‹î1ƈìÝ{yιÏâùû¾çÕZsëÔâYê/§í…ý­`½gM¡­A† óNZÆpu¥?·LÙ0r#ilèÁø SÒqÙm,ëÕç÷¸ìJå;›ËÝÆÖÕF‘™°9DOù`Ž‹2<÷ð­3|k8Þx¥¹û+gVÛÙk5kþP GVF¾”1RåÂ#ÓoA ž" Âݯ+Žz“r·2}ï…£þìpRϧ'à8À˜1ÆÐ¾StÄ™A ÇCïa8™ýÉÝ]"¢“QºËßq¸Ç o×hf’`%?;á0ÓçÙ7åØŽ‘of'WByÙ"à '`½UÃPJIÎYk`É:—e£á°_è, Ã,KG£ÑÙ³gOŸZ!ÈÀ{-ãœPš¬Õµj³´ž{ï)¤”œ )¿ø-âwœEñOþÉÿöÿ‡ÿ AfYQ¯×;NÆå·åÌûIÀãIÏUQιJ¥â½OÓ'$bŒ ­Gÿͯü·ÿìŸý‹‡~øÔêRénÿËÞw¶£Æ‘§Af2‰V‰\EçˆÄ€yÏ´àè‰cIÈ‘a$üw KÝ´]½såR¯3ôl³²h¼«A` €DÅY(€åyP©ê¬0ÞzÐ9gy*F-}Fud{¹¹å±|Þå.–\@*ƒ¾@_A óPÜš°Ø|ýÒ¹÷]éË6©µ÷ÕEÛ¹uÖÙ„ø>HætÆ­$UÕ”Ìé0VÁüŠJäùÞN8èÊ ¼¿ù0c€FÄŒgÏ+—ÆXm! ¯=·È½Ø]8ùêéáƒO†¯äÝ}m´gXEäžcF…nõt¿±èw×5úEt‚I`²°Ñ検 òÎÊV±²ýšqÚ#çéÌÎuoí†a^rWè’æµ÷}â³·^:wåO>ÄT÷Ô7.<|óõçÌÖks¼9uª!MÓBJÝ‚N"Z92¸O2qÆØôu¢ Íøgшî?;rtßp>û«{¯ø÷7sþ,´Ìþêˆ>‡ÇaݾÓóïÀÇ^ô½ýK06„S”\%SÚΉUùˆiýȆuÚO""çKeš&ÔÓ‡‡s®„ ‚@)%¯Ô+Dä­-Ñ—1VEQaÄGi¿(²ùùæ©ÕŬȤ””dã¸ü8JÊí<±’œ[ñ_Œ1JÝ'UÏ;\¹óýö÷|Ï3ˆ|eåT»ÝNÓ|ZW&ifå­ä'„è@¥Rét:Y–U*•’Ë“ˆŒ1B¶´´rùòåßýÝßýï~õï3Æ +ùÎ(Vñ-qÄ‘EÎ/0·ŒÞ' _¯T "@\x.Ð:DV«T$²•³ƒöõ§¯×Î>ñìå}ýÖKÞzé &}0ç “N(gÍ<„ðgÔ –C[¨¨bðÒ3íjµH‡à\ÕX@ŽQ¥ ½òˆsMÎ ÎB"ïÉq$Bóžc–0jo¶–Ókçûf{m~õÒͬhllÄ«tóº8Ã(“¼Â‘çýÝ/!T“ÚÞüé—­Xkï?&‚ùûõ>°i©8š„2MIŽH ÀAg`w{0Åí®ºygÿæÖ­ýÑZ}ÎqX óœ#2ÃD¡BÆûRî»—ûEf½±Öigµq]‘q–Š ÒHûa1H^ûÚfEsiS¨ ›'”­ª¸×zà³Ù º·‘¬½Z¹ñRsûÖ|>R$îˆÚ³ÓŒÕYçâØvqßa²µµõ™Ï|æ™gž™›[ØÝÙ¿›õ}6¬òÜív›ÍfǃÁ ( kmžçJ)­u£ÞÒZüãŸø½ßû½Á` Mñ7m—s±´§ý”»qm$â¾Â­y¾Ž<€ÂS@V9“ëÏxwg{sóÚÚ+˃®vÃÚµ0éXýÆd–ñ¢0]ãQÂ8&‹k6ê¡.Æ:MT²c­ey½)y@EVW3f§Þ²’/˜8¢b¥SÛѰȪΧ[7<ý¬é:}®ßÙ­îîy^Û2ä‹áª÷V 'Pœ>Ÿ¾÷cÏ?óß{ü™çšs¼sûòÎõK*¸ï ,AdBÁ)µûX«r¬Q‚äÑcé#¡²ø+‘ EaÃC6¼ÃS¿ñ8õÎûá[ÛWŸ]M¢3}½^qïS6àiþÔ¾ôÒ5öÐC<¢åJëV{´KöõÄëü¦rËà‰1KÂjt †hшá\ê^Œ*UãbU“Ùp‡£eyŠžvŸÎ*Ï.-U·®.]zðìîî­%‡Sôž|I=ÂDCª°Ÿd²£+YÕI{@¼pHKƒñŠ{ؼq¥1ÞÏfOÏb!ÝÓÔf € ñøs§xy1ˆ™–V,71ÎyO(¤""ãÊ XæÉ#H8 &7®‚9Á„÷†¼ Kfô䀡œ8v½à<¹R;/ádò¼¿ÏÅw”EE1‘/ŠBJɹðÞ1Æÿýïü‡üûëõºsE"@h­•2˜Õw±$É*7.ÇJ†yžÃ8Æ @)EDÞg™ˆà£ý¾ßù~÷—~éïy0Ho@ðò.œ)²Œç… …*FšU™§ Ý›–P.ÎF;ÕóÆI¨ Xl( ýæþl6”†6‚`X‰V¶v_ÑFË¿ß׳,Ëús$®šîƒØÜƒÃ ß8Yï,YƘ2‚hd5ÖÍ<@³’·¢ÔV¨¤NœÀ0|¢à¢Ç±ˆÆéƒP²9 ?0>—%‰ ¬j?]þ‘³1ú°ÒRÎ2f¼CòŒ4챆Z–«ÆÈ{7 n˜;NPFÎÊ–  •Ô%•  € ˆw“`®1Û„·Þù‰Áখ9œÔŒdl< z+È{@4“8Ûo'¦ÿl¦¤•cÒ«i›&Žƒþž O5½‘Ú'&øÃÙ`°3}ÞÊ%ÃN(‰Èy×Ã.K:hkí…s0ÆwyQh­×`hïís‹K_¾ü..H0æÁk›)ñ]¥ê^¢ @> Cçmš Ã0 ¯ýëŸüä'•Rä)Ïs!"Eqe÷¾$IDÔZ'Irùòåßùßþ¹ŸûÙ(ÞLàçw²Fs²B0pΑ fÉSœù¢´{ëõÖJ5ªæy .¯WeTíw·î ûˆu¾0@˘à:• b·ÿ±¡üb(ÓŸ¦èö¶HÞjÕ.eºT†ÒµôðtžÚ@Œ0¯ï¾ö}+ïùìñý+ïïm=*¢^fÖ<œËs+_Áâ±Û×N-\øÓ3ümÝy¢·õc¹cEaÈ9ç,ë½ÏÊw3ïûz²ÊjæZêAñÓâpÅíÛùh¸¼,¬d…¹ÝÎW* ŒF™~…ÇÈäél˜_{%H䥛:=óðsï^»úÄ}ͰÖ:žÀûƒ”Í©‰ gªß”E öFwæš§m¾´Üó½uáâfÓ•ܤµÆÙ4M^¶úAõÚŸ>Öë…A ³,pB©JpP¤KFNŒ¡Ĥ`( ‚™kšzu5mŸ_IÍ~½•DGéÖÜ’íŽ~wQ%Ô‡¤¶ƒh0?·¸owÇKáaƒ§ñ.*WI`¸çÁÉ@©D•jÀ‘Õœ=0eOÓ ‰Èy cˆù’š˜€€Ï¤—LÿÁ„yö "Lz $"g2Gl˜åuuÉ„UÒ6LºŠˆ~† g|Æ<‹¥JZê¢S§IëS$a¥›ªS2ÎHøö+@ÈGëç¬ü€Pjìã±O6,eSÎ;ïýt´„@3°+NH‘4àÇ Ï a¶ññ¤L†<å?aàì`Cp· ùØ{X¸²÷TÖÅ(§ËþÏÊ©5èÊ—¤Ó% ¶'¬´É8©`an¾R©0ÆL1ÒZk9çQÌ‚0 ã8>wf¥ÛëŠ8m4c<ÍÒ8 ý –ƒïJ)å]`È€3G¾ôå/ƒG}Jc”öá“êR߯t»í8®Aàœ»xñ¢Öúöíµ¥åùZåþÊÒ}§‰’!‚ ç¬+² *¥$W!³÷gGQ …wC ›58Ñ ®hÄQ ™\ XV2AÝt6³i›s—,}‘òX˜óƒ|â—dŒ*Œ·n<Γzjý- ÕV«¡ ÚÙè¯_~á#çöî, Ù[~r˜uy%xÈe鬽zÕÞY{šá.·öÔÛݽÉcˆCð€ç™D¤ªQg[ ÙXZúúW×"Î+âBØlwvÕEŸ„A ¸ÍÕΑþáz²‘E··_>÷$EÕ·b‚.c1ú·¼;H,@áYÞ ÞãT©Îï\þ`ºuýÒí««,Ø'}*¼‡Í³—_"}qk«…É+"$׸šó>±®¦O’Èn2n4pï¥d*BÒÊ;Y¯zóJ, £žÄ‹.æî³w: Χ7ú{‚|ËùW)Ûù€X9v`Ö»Q>bBroç ÓΊ—™A¾ƒ`«R‡²š‚`ཱུÖ9猳Þ:’Áx7ˆ3ÿ“YNÛ/ÛŽÆ_¥µ>ÜñxÉáèÝ$¦Ä=³{ˆ©‚u¨…òg½_%#âdg0% ›î<¦-Ó$:lŠ÷Ó-L|œÓƒ~šM“'k¢þ–¬O'e”)·4! .¹ÙÁa(= V§6ó7ÀÝ7jgº5™ÆÇ–ºo9ÿ³¿šÜßñ¤ÍºÛ@gi½^o4‚s¥”lÐëôûýZ5Ô&çœÇQ- "J)'À!x!…¡bÀßí¯«øáhJ›¢´ÛµÛí‡~XJÙétWAäyV>Z³\Ùߎ(¥Š¢h6›NÇ{ûè£ó›/üW?ýÓïô@èLgeáE%„A"r£Qf¼‰Åý=‡ÌžueÜ ¢iÑå…騼å™ÍÝNžçЇèo(yÃ@§:ßÙûüߎ’­F…˜5¶XÒ®UGä–@Ì› Õ;½Ñu*N%•ù¤¹°3t…ΪKëŒËõ[•QŸ;±i„KÄÂ|³ÊH딃+5¦TwgµÐä|Át`,YŸ{¯=@.œ<Œ<*„ykâABÜC?Ë‹õ¤Á!õG‡ó•G£W5,£Ú®6k8Œ&«9ÀÄQ890³ÊÏs¿·ÎÑ*7wùÝé{>òú×7^<-Ôˆ«›ƒ^/®z>øÐÓÏ·_]¼úÜc!ÃJˆ;‘ªçJ†>ji¦tw7 ©wŒ¬Ì; Û½¹öš“²àŸ;å/<ÔE‹[ë2ë…ÛŠ ºs½1¿øRë¿ù.[tD²2­iࢣT®åçA¿/=Uª b°Û—®á«˜DÏììiSm·Tià3•¼,,¯­·­gc§*zg&^Õ2 g‚,LN§éW0)=ëÇZ)cÌ0§¦¼ö‡‡à,cœó3qéSvLÆḊ.°ÃÞÏ#Ö×Y žè©Ö{OÎÃ$ߦŒ/»{&Çú®õãN²Ò&;v —¦ûƒ]š÷%w™xSÒ7–³@@¼¬MsìƒXni< ÞEÔu÷OŠ—¹Û}oUø$Ó.ÎlÈJ묮dJÀ3Þ41ιRJY­„ ´ÖJÊF£±´8¿º²€J”p¯uá½åœ‡*àÈ <ä¹õÙ;¥þî_yçœÒ3f;w4¦õz=˲¥¥¥t”çy^f4L©d¿}Y[[«Õ*ÕjµÝîŽF# f­L½Óɰ8Já)¹³4Žd ø}aÕš nÃ|dæëÚôßî ®ä¾ê³KŒœaÚA*DÐë†QMð¥ÿ£n.Aþ(o<»?õÚO˜¬î9ímï|èo[ö­çÿt)Ýüåó—Ð Lµ^,œ!‹o¼¼e¾VßÇ¢å̓ÞBs1¡¹0ÒµsŸ†n>ÿãY&P µõŽ@âØª§¥q«PöÒ¾Õ8K‘â¡]ÏØkIÅ‹@90fªsYÿê|IÕ'Ñ 8{ga.î¶qkû¾ãÇ5æ`fµšèvå·Qµ[çœyäk¿ÿ{Wþðÿ~²?z9lÚXª×bñåÊúô¿ßîw7,KCQ@}=Ûk~õ‹bwQ£.0Û¿-“¦`@H‘gäyÙ‡Õ…ÑüìöÖà³ÿñÅd(Óç)Ûyð?Ї~Ü4Ï žÿêà+_Èuvj½}åÓŸþïIœvo¶·<ð\{®ê‹µo~á÷óÛ"UšTRtìD”AB³«j9|Èû’:‡ì¤ä,×]˜ºû L€“ØsJb@W}ÍòWœ¬øþPéF1{kôÚ»‚‰ÆPÁÙ3Æ:ë8È‹¦Œ“à "‚wÑ©˜~˜íÙ£6ƒ‰‰{ÜçRÑ“¢ ú éÑ݃¢»b¦NàûÍÄÆx:›³³Çfêû´PöÇŒ£¨¦Ý.ƒÉc¢Ìd£ñ2_–±‚rþ'Ç9tºƒ²Ð§”ÒS¶“¦é;;¤ç/^ªÕêööv¥Ri6›ÃáðöíÛ—.]úüç?ÿ#?úÞûN§£µ¶Ör.³,ó'P±¾Aç½___GäÍf3Iª¿ù›¿õ /”Žªw® F¶žäó‹>ó¡ï¯þëÓ‚Êv¾/Ã&w÷‡1ùèB<×XyíÇ~fE᧦±¶»ÇóGšçsdÖ_¿á¯½o®eв£ÊÂêðƒ7gû “_{þ›îëÆ·×ö!X奴·-–ÓaÖýÔ¿;¸”ëaÜÚû{ÿÕøó,­Þx–_yÞ¾òüWÈ+”í¤"[§Î=ÒûÀß2­¥¬Ÿ5¿õ%~åÅýµÿ{‘_TÉ>özŽ¡"¾ë½ã0ÏpØî.ë}é û[ýQTiF"ÎÓëZbCœ¹üToáÜðsŸúýΨY ¢¨òŸ]£ˆšñÆ<õTÀõÓW_ht÷Âø-qÐ]èK3¼HS% ü`ÍhÐUßû3ÏqÔøoOâ>ÌeÝÓÆôÎ.Úxmð‘ÿòS«gü¹uUcè{«­yÌÛ>ø±ðÖ&¿úÒyN¾ö½ºÐ!¡´ˆž˜-× ˆÝü]íŸYeÎ6e­ÙÞ5v¦^¹å:s[/´¯ñ«uõÔåǯ?òî—j7?þð‡RÞ);äbÂäÝ¡ [ð³ç?òdË7±OmWڣѤåð?ZŸx¢3D'ÉøÉBŒh\~·²Ú…Þ©ª“¤qÍcŽ ¹èxA÷«Æ¹£A[“aÚÔàÄ O+ $"(½›€åN<ùVúYü;tu;iprpü¨p‚‰‰XVÜC˜Fqß%GJ8î^Ìþ= €øý­­'7±Éc"G ìÕœ±%eLø·‘sîH“÷c»:AÉöÌ9Ï5ÁÆî²Œ1DòÞ« ²Ö;ç8çEQx꜃û­sö7L¬µQ@§Ó©V«Ac~ù—yii©R©lmm5ê-!„Ö6MÓz½^Æ^|ûBÀˆHQ©ÔÚíöêêêåË—ý×Nz‘Þ!%Í|°6ÊaþÒûíëߨÚ`WwjU=êßW;.ZCóÀþæ ì?±¶y3ổ?/ºMõå½y ê7èÑN½ºÜëŒjs7ÍÞåo]íõ0©óG¨µÿò¥/­ïß™{` ÷i‚Àûbº0p­7Fô«¨w ®h„€¢à(¸Gp@Éhõ¡§^ k­Ï}z¤C÷»ÿéYhg¾¡Tÿ]7 ÙgþgYSqˆâú 3Ü­‰ð§~‘¯­}ñOÿ¨žCm˜ ÒJ=¨Ù«_6g÷!ytÊiÞp·ú _ûâ©Î­¨ámÞ,ì¾]Žæ¾ÄòSž¾ðä«§žœûÔ§¾zûÊŽf#˜Q•¦ðà˜NX,}ÿ»®ýçë¶ãLÇSéÇùy³ë{¹¼NuÍõnÂÍ e²©‡OòŸëì_ë\³‡õÎ O®[&wIƘ9a§LÒ!Ú›§E"áÄôwš|ØìÐÍv&ª Cù»Sh±.ŸõÂÂDóÓ†JóÝ,–—8q÷.¨4Q4;Eè)÷ýìAƘ›‰âžïî)M¢œ@œ`X¦ItëÑûKǘèa ;#³õ«Õêh”1Æ*•Jš¦aF£’¹Ð9¨±)E©°×ë%!ˆHkÍ‹ã˜sn­}»|ß•{‹'eY­VsŽÂ0lïw›Íæë¯_Éó¼Ü u:ååå^oŸ16O ¼_qÎADDý~7Šd»³óòËßú‡ÿã¯yóÎšË ø ˆæ¿þ£?¯>ý{«áüöz½uÊfǰ³Q¹ "Xè<##8ÄFtÔ7ž}Ñ{düàÜkÆJˆP"+«Ø÷L Sž¾)UACè«JÖzëž+4 !8ÿ €§6C£GŠ/2NÆoˆö$þ¹¾Åžw‚‹Ði3D%#eíà„¯¸!…fþšÍ.R.sW‰‚‰/ûô‘ ézH³A¨’=Aúz%^µ¹ Û+Õ_›:ïUî÷u?ѱÄ&yÀ³‚ˆÞ&¯lÞiñì¡ü/Î6çCe»¦¸äœ«7½›\Ø|¤Â –¼û™Ý•Å÷Eîq9—i7týV5j;ûc’©QF7ƒ¸­I¬;S,ŧÎ>ýén¯JŸøM–×^1i“Ù£Úþ^¯UÃÑú#—ÏTêgž~ä=OÖU§¨Ãfr—IXiÑø ö+¿ò ?þ±¼`cÈ}ÛC/ÆìB<\`"rÎi­KFÀ²Ž ˜"?ù㟀8€™Æ\qÎkIõØùOM Dà<”éae44Z˜¢ã ¨§³£sx|´É :,ãØ]Fx8÷¬TìB !f¸­Lޗ̉µ KÀ›Úƒy˜±þM›bŒq%gû9ý<àéOÆ!N', n¢å¹Å³<û­ŸÔ›vµì¿àEÑÎÎN£Þ2Æ”ª-cLçyøê½EÄZ­V«Õ:Ž´´´T¯7&W8?¶Ÿß•·[Æ÷t4J¥”JYšÿüÏÿ¼1&Žã¥¥¥Ñ0+Š¢Õj@Yuæm¹jÈÁ`EQé`Žãø“ŸüäoüÓ_oÖçß–öÿª„@ tz=ý/ê§ú»¯Íau§è†É<ÚìØóQ‘1ÎÏÀ#XƘd±Á0í–¹×ÎdŽ ÜzoÁ'%# ½÷, œ·&¯: Ó2ì ÓV‡6¯…É8[„è †ˆÂ0ÎÌšsF²Á¸ñ»Öz°óì8 „RJ8£ Ê3ªÆsÇöß3´~(V­ Ú©¶/Nq9ôžÙ¼.âuFÍ“¸še¦ßí¯.ž†h( ¿¯y¾?æœ'ü½çÎoºÜE,¨&[¾(<¹ têVwó¬7‹LX 1ÅåB-ª¦ý癤 ¨9‡äÒ)áñoÄáï|#é¶«UUkµDw×ÄÒÆ jþj¦º9#v9 cµZøt8ü¦ì?&Ýââ2=PgËgšW¾éáE„á&ÍÐó€cÎټȀ B&3îqr†£•f†…1Çp%Š1¥ÉSºå‘Ë_ì¬ʲf <ÓüWbˆ(„*­8!¯Žs ž€w²œYk>0…ß´ww[z´\[Ê—/ì->x§QÃ0èíí¿suy{!X7–mlpŰޔOÿð?%W ÷²½w½ü¥êæ–¶žÅŽ@ï6SrÅ1 D”eºðŽˆÌ¤fò‘µXJåñ.Ñ×SpiA<(îH À–—ÑJ\x’DBˆäÒvíl©“+Y@¼Å’”à .ÿ+ü1©;Dx/|îR†hqFŒ3dŽxßrd€9&‰1æ½$¯Ðs¬>B€5 SÌ[ ã…ëÅ¢ê½CŒ‰é*„HléKÌ­8;¹î,† ÄÐáóUíµ¡m·I³îtuÔ ‡ÝJ¥y¼ ˆ3¬{ŠÐ÷ƒ@{Μ.‘9_CZCŒƒ Œ¶V§5B- bG{Œ;† “7„Ø»¯y¾Ïê.Séç¯ýÁ'a¤ªbaçù³iÚŽªiª¯%õ‡ú]ÌjsÀœ¨z‡žÉö¶|ù ?:°šWëŽä¦Kýúó?ÕK^IS&Aw¿øÍ3Ü<&î·w£†CΕ`È^5û&•ƒÍ3ŸýõZ†‚Çyá9TçvrÓSÁãó´Û–¬BÅsDRJ*ˆsÈ€‘šàôsId?¥\(—w"*)8•Rå]æï#¢¥ã< À\ʉ©@Y²{Ú¸ˆ¥”@DŒ“uÞ{ @žðheûq&aÆxÄÀ;Cž~RÕÁo¦!ÖãðPLàv::«Sdl–®´Ü‘H9 åûÑÇ11L/=Þ L|Àp€Kf±ÙAM>ÜÓÙœ¬Àúbz‹Ñ³ñ*¥T÷üªßí VV–677ç› SŒZ򮮠”â©§ÞeæY¥ðYž†aˆÀ”TÚhk­‚3ñ]«¿,±eik !TÆèV«õâ‹/>óÌ3%sEYV”ÎÇÚ?Þ‚ "”Quy^«U®]»ö|fÒáÞ¡RMª€Œ)$c DLåÜñ&V²‹Ž§Î½Õ!Š+Paqáœw–£—@ åò)ñ2‡ŒS`c (¥¬e‹ØVIZO´õQ:H€rÈÑ:M`Ãzô`{‡ÚUaPSEVÊ£83£‚K@bt\ "p2Žuídé jQ’[Wã".G–¬át†¡$çIÞ8¹ðÈÚ'ÛéH í1þzOï:׊°Qo>’ý°b¼'›¶F=†°ðŽ%Í[dN«Šµ¦Ÿ»€µ…“é|¯˜Cqåk"juںͤ²¿tÉô:†ñj>X)òzy`‘§]Õz=Ý=#y­Ó]Ã…b¤ÂúûÝæ\s ³朓#­µKÓRaÍs“û¡â‡Þ½ég¥Ô4=!òŠÒÐjÔ`8èÕkq»½÷þ§ŸJÂäÒ…ó€ŒÉGÏÐp0ˆã+á_ɃT7võæwåí•áhPIªžœÕVÉg ¾÷{?ôŸþ¿Ï¦iZ«ÕòL—wVJ™çùÛe‚βÌ9ZXX ÖÚgŸ}öðû SòÍÝmɸ|œ{_"–g_ž Þ 9ëFñ@!·s Ö2D6Ì­·Ð* J"âÞ—­ÜäÖ[oÁyrÖr()²¾ŒcŠ«Ea³QÚËRâ,b<`D•+˜1 QÛºÔçLµÊ†Ã¸×‰`WJ÷ì›, ÄÅ(×Bt‘9¹ž ªóýBûû±Óuì{J‰f V­çBˆ<÷Þfà*õ¹,ÛZáA&Ô0 *ftšÙ:á©@q_ó|&hD4O5Zûó«íæü­~_®‡‹/?Ÿô†TdËqb½QBF +·ŸøÀõ¤¾£‡±UÜ/n¯‰[7.£ó(˜¨ßhÒ#o †i­z9Œ6çO}+©Ü^]:Õl5¯ß\ýE&eÄD¶½1j-°ý(í§_}u~°äAîo×^üʹÂÚYtf©vDÈ9÷ˆQñ3]Þû2ŽF)5hïZkßûÞ÷”3àÌ`4ˆ£È{Ï8ãLXgöÛV«U«Î EŽˆJ•nÒZ¿]œÃß•{K%©@„åc¨uæ=<òÈ£Fãµ×^{ì±Çˆ¨Üü•¦¬·Ë­”* “ç¹µöÊ•—ÆåË—¥­zç gRD €ªBB޼6ÆÄêø ÂÖÂVï7šY%¬º|cz#\¡kp1Œ’^c~МïÇq[„#!ôîõÇz}5ìÕŠ¼f-&•a³±·òÁÛ(z"ðN/l­Íß¹^) ž„¥!2@"ÐÀ2R¥ª¸ô……å ZÛëõÍ5¥ Ü2éó•Ö—;;Y­6<ûðFÐü¢Ø_{úå/Ÿç­ã™¼¸²KçîXß·ú¢Ïª B¦œê`Y÷O]ØJ;‹;k m( Ü™ Û+ÿ´É£^GHÞètòbTß\‹MºÈßBð±rD™l4®=ó‘•æbwk9&Muçöƒ•ꃪ~G)ÝÏ\¡¹”’Û¤}õáßxT5oV“åA©ªpÞQ?s׆îê™D÷Ô`[$Ï>y9ïn®¼öù÷v‹kø¿?ûúöé~k±î²Å?ù…3?—Dú[Å:Ó­<ßúÄOõr}‡ÀhsÖû;ÅßÜæ\Š+M”ç¹íõ¼c,´³é£³ q 6Gf"ʲÌSE–e¥© F#v p†’®a"5ÉÆqÆÀ ‘£()OÚR£/+F—!R䉷üX Ø38r¼~X#/ã­œsfRµÜ^pÎ9c‚ój%)X~["-8Wv°nìèuÞYï¼±ä=8_V,(f©føÈÌ»u˜=rDn8èÛ‘üàƒ[z‚\Ñ”ûÎy­V[\\lÔ.tÚí8 |– ƒPQ5‰gTè‚+.¸šk-°Ñh(BÁøýóÞ•ÊÖ±ïÑwå/@|^a€µV©@kïyÏ{®_¿~öìY)Æç¬ô›¼]\ÐŒ±8Ž»Ýn£ÑxõÕWŸzê))ä0íVâämiÿ¯J «ž\jrÛï.ð¦”yèÌñvúBÊE»wÞ/²ÂS©ˆÀ±µ¹)Ô°½à«à¼·@D}èÏÄN“lÕêÄzª_­í·V²Ñæù;wÖ­×§Ï·š •-u÷¶µÉ 2ç# BÃD%ªÖ`­ðñ—¾ºé¨wñ1yþ¡ä•çM»{{n¾›î +Ï-=xƒaãÊÞðÚÅdz÷ÿÐÿûÕ/~ß±ý"«ÏoXìÊëgÒò†ˆƒØi­jýÆâ ÉxûÎ\–+Žš‹w®?WK÷ß×ÞX\<ß­œùÃÊüµaz&5ç ¤÷5ÏÂXÏCQ É½Ñ [¦0Æ9Œ#Ù¸®ÉWŸ_ýsê}&I댵ú6¡l4c" aŽùâ” Jý¿|Fâ ÿÍtÛ1«ý{¿+o·` Âr¶9çD^JNdúg~ì—éWž~úé…ù¦Ñ®ÐY’DZçˆ|J–2Ý~•^ä“.Pž#¥,}RÕ&IÂ$Vû{›/¼ðµù/+Ë;•8~§ßwÎ%°@…\Åà˜ÑÖ—x¼i}kWØÞǼÞ{ׇ¿ Aæ]\ ´1–#ÅÞT c†ž¥Îÿ?{okÙz–‰½ïû kØó>ó©éÞ[wöx=´l dH34 t7ü@­ˆµHÒ-¤NhEAê4M~µ„éFDQCÒ!@hc;ž°§;×x«NiÏ{Mß÷½o~¬}víª;Øuí`ßËytt´Ïª½×Tkíg½Óó€ïêOÞûÖ|šàh4Á3ìv/Þ?Sáò'o|pZY——¯µßùžgÏn¦£ƒ£š$mB6‰iûy¿uö¿°ûè§>½ëÂYàÆó_ŒÞóÝWÈß?é IDATn­}ÞÍþ^îIvÏom'_øóõ™kM]Y~%~ó{ùÌù'_xòݦÐHYˆ¶cqM®üàüúÙgÜá§‹/ ³8ižËàšvúO<©Š EkîFª¥0»ŸËÏ”æì±ëçáõC• |ì-üøÅóŸ|aÔ½e¼jŠ­ ™wNµÂÖï‘lî3Í¥_ÕÅÀHG»€±s~î¤Ú•LÉ|ÛϦwHzÈ"HƇIž ;M³Vék‚C®81Fs×ûr>/G.oXÇ!„n¯uxÝ…ŸNAkkL4Ë C+Ùj¬]¹u£!jª€¿iÆ×«ß˜¯¸à+Šû¿–aè=}伓W«§Ëòbàª^~§•òjvîÅñèrR N²Ù•«BåÂÉ¥uðå÷gé®¶ªÝNhŸ¨./Ý/&ï“%²kfFED¤ë4ÓéœÈµM'a8<¶6îo¬M‹‰Ö:„¡r"Â3 ”O<ñβÌÑZZ½“üFÎú)¾]°¹¹ù}ß÷}þð‡¿÷ƒß¿¾¾©4–eAtÇ_¿¨;^îÕZבîh4ê÷ûív»–´TJÆ­é#ùÈ?øÁN·Mˆ•+¾Ç\äkyæ¹`ð²ôÀÚÆ”ا6®¦.ï–yuUŒy¶‰àmãÈÄqé¦óÒϨŒç³«& PœÉ ðéaÍšF;+ŽQdÑe¢4Ö¦!`†˜½´6Б"¥`)KÂ*xe#T:8‚Ž@3Õ8Þ<×Û>PW.Ú¸4ÆTÓÖÚΑ«zÀéJ$– 49½µã¯>Y1­´­¸ÄåþVÀóôu´U­âöŒïÛI̱ü§z¹ˆ¯½C Á(¥‰Qòxv}žº0:n¶]³Q¦Í½¨ù…rÖ,²Òç ôí¸1 {˜W31Hᄹ2ªml\4›Ze•Å–Ue¯“XJKUU‘mÓʳAÙÜèšîë—{ˆ‰þæyŽÜuì/y.—#yEYÁ]¾¯ü‘—[ÿ꟫êT«zO‹Ùß;×áN,ÇŠj²\’w;Þ{W”õtÖB§óë8ËKk‘L^9®åîmA—¹2k¯!!\~¤><çÉF cÓ*0#D‰ Óùˆ„}YäóqžM y{gío}ÃûÞývŽ¢ˆBðÌ%æSò}Ý@¡ú‘ýá/}é‹£Ñ`:O&£^¯S7a-Q›’Ñ*èw™1»»»"2 ¼÷ˆˆ$ZÓÍ›7žyö©üÁ$TeUØ—™-|£,ÈUÄ…iõk€},¬=Мti#²:ÅÐ4f|î]ŽÒŒu\²b“ÚD™Vb ô ì{™•2Ȧ¥œt‰2{6Æ$I⃠@´08¼÷iš(,©ÊFÚ9W»Å@àN ´gqÌ•Àmù^Ò3 <Ÿ Âk;9°XUA¥·³lÖSvB0HBœç¡˜¤±Ïçã阣hKÅ¢ù½ž7z1Ë®²¯:Á2XQ”Æ ŠÈjX|eûVWš-Åä}%e#vŠIÖ7Ëfç°Êf¸ˆcñNn†² PŠšA¸’=ÏØâ9«#”ÍÇŠ„¥LÒÚÛ€<HµÝ:w«ÈÍ`ØDEî¹Ãå¨î.Þ]ÄwÝ–/GÏ_s»_ÿÎ|=¬ü5·òâ÷͵ÉIô*.ßSó÷Âî·.$;W——ÆÈõûñå) W°¼êä$Ò­?¾g¯^™«k ¼ô0€Û«ŠlEq!Ë2‘`­&Å>“é(M¢7<öØûÞûîw¼õ»k./‡Î!,ÊÀˆH¨™W>ɧxm¡ßïÿìÏþÃó›ê¹²FcQ ­/øúËýÅWÚ*ʲŒãÇã13÷ûý8ŽG£¢h­>ô¡ýÌÏüÌææºkýÚî~u@‰ E ÑBÛµ–Æ#%¾ìTyŒö j¼ (€o¢ÐÙǾLܘܲû™€q‘5U ‹ùhèùJ«7ÖÐÄÆÚ,˜1Ýž™ÔZÇIä½ÑõxRÝ$R`q¤\©ªôõ“9pPÁÙ8AmD ZÕ³DD¥Œ+"Ù«OŸÝ}ð†Ò³àŠVsÐèƃ^>o‘Í@4H"X'ß×ïI µ‘¸‘1ÛÁAËÄ÷œŽ½£•VF3—Ô«OæOo`ô^j½xfXjúÙEŸí ÇBƒ¨{õ¯Óå¿ñ=ûÀ›.]xìÊÙJM'Cò¬Á³ z! =–¤ “ Žâæ4ޏ¶‹ì@©ÒhôE‘€¡tUf͸ÓNTgýÙýÎ{ŒDUà¿™Oš«d³|½ä›µ¼|||Oë¿ká«F½¼Spê® áÔåûWß°<¢Uö½+z^ònÅ  þSD@¯À¾wmkõ@^’eïš [%o<ƒ!‘&¥I`žÍ\YMíF \íkoË›Þû®w?rñv 8çKϹ@•F‘6J)­”ÖÚ,û^ã3œ§¸ÖêïúÀûÞúÄÿèþ¯Ñø¸Óm•e)+z2K ™WxðRJÕ¦Î5aO&“¢(Ο??Nþõ¿ùÐÛßñÄ{ßû­Í‚!þú©¯ B}RWZ~ÿŽ& uKQæz~´&!ïí|vçýj~qtó¡˜ý¼ ›W¶†Çú7~¹w7¶ÇçÞü‰¢œ\z Ããa½@DA„­µ!8¬ëO¤EÄ9g¬ Á1{–ÒZëh@ÀÁhH·)O^€¸u E¤n]ÞV¦Ø¹°r:wÿ yƃ8¸µ ‚„Ù‹H¢v§Cwíi«ÂÎão÷¶uõÚó¥Ë.Üëy{ݾ“´L Ä¥à>ÖyL‡J!.žµÖ^e%2kW“>ó'çªy Xí>öë ûpå’¶¨fŒ#2¶ªšr'3—w{ë¡Ó †ÆÜj6vú½´ò0y'„Žó^ÜYëYFÇ·ž«…‚È7iÌòÅì(w¦d™þ&'ÿm¯2HZ!ÏWòŠº…;vã%>øµ7ý"ö]’\Ýæ½|ÏòKçúwûÖ-LjH5AòâSôò©èÕG½ïðj†ßu¼rÒhCDÌì9@=!¸ªªV£é½ŸÏ¦q«ùÆG¶JååÜU™±±"0BDS¯˜…ëTUÝrx¯ž†§ø¶EéÊÈDÓùäŸþ×ÿäçñ~ë·~óGôïuÚ½:ùõd?|­ºR£ÑØßßߨØè÷ûW¯^¢¨Ûí^¾|ùÿøÿÔš~ña4:îv{ŠtQæq”È«ý~x‚™ DETƒ²†HD:2?cqssë‹;o|j4:7º~n2RØÞÃèyÈÎeGÛn½uáÑ$àӻѠ7 oììí]±í&ïÃö“€ÂÌõ\Ÿ÷^)%R›pÝ B°Z{Ϥµ3k㢘 Ö·@!Ôˆ‚Áˆ ˆ—õL<m¨ý«gz>¿ÛgFÏ]ïd™€a£¬”Xµïû?Þwñ–iÚòèmáÞ¥N>IZ›£ò“еÁI®±È2®Ãßš€C€ˆä%”|§— L‚môm§´Ð`ôyÐ&’ë_|<î¼°õóÍsƒƒ½.HÅj¿ c«{U¦tsÆ®>ÒÂáÚÖAP3&q¡­ËK«UêÙh­ ´®6vöóꢀŠÅMÃ×Uv¼W&¼¿­Žóí¸p›¨¾)7˜|­oú»(óÅ‘â]K^|" u9©ß;wrp=xtWRDDûe¼Tå\¯RÏ ˆ"á˫컺'|çøÐ]<½¤äå…E«bEÑñ­kï|ç;ã(v®@ñD1œ%µl6 {B0"Sgž ‘¨î>Åk"ÂZÆd>úÇÿøý«õëÿîßýo÷Ç~ܘ(Žã…]]Í}Å®õ‚1¦ªªù|;;;ûûû¿ó;¿ÓlÂ/ÿò/p·Û›LÆív;Ž’WýtþÚ…€ ^ÀÕ|…¤U¨b²…° e§Ñ)76ŸìlK~îÒSë0½>¶Äìm#‰S#ݵÁó×f{?á÷Ö¶¾ØZw½ø‡XZzóÙªfôF§ì¸r#" ,Q=ÁA!ˆŽ¬/¼ÖVXS-(„I”2ÞЄæÄ“…EÍN£˜n<×ïÿjÈxpã\´)»@Ì@Z‡ H»KOn\ÿ‘y™i…gÏ Ï?r½Óé/úpÒï/a0^ïtbX‰|ÎûÂ{ï|é\Y[Äô0Wó©Lgƒi~0Êoæ²GÍý`^=ÌWìÚ¶¨zƒãÜ3›4cÀƒ+çŽoö{ýñãOŒÎÝ×ÒºœM†£ÑDÕ“0édÞêÎï=s%D¤îMvä°­¾^¦^W—¿Šô=Eº/ªÞ枯£ýjùzuçWey «\»z\wñú’¹å¤N¼È¶´tÕá/Þ9õ ¸kOî:ÃËCX¾ç®Äu6”…kskkëÂ… ]|ð=ï~Gi ¹¯r­5Wù Ø×£É>8–€HdŽ$ð2%E!ç*9ÍA¿^ÛØ9W¸¢Ýh¶ÚŸÿo~~ssó7~ã7†Ãál6«ýÍVk./·žÉd²¶¶6™LàâÅ‹ø‡øk¿ök?þø¯üÊ¿tÎyï Ý~ig³¿ H (uý—e´h\W”º¢Q•ØXÿâú#¿ÏxýÙO¿}<ì´ã×Üì¼Ui³{ÔÙúêÕ/¾s2J®?›î=óængkó³¾8Ÿ.«luÈ{"ºÇ"9ˆ„e0jm¼÷„„ˆô"D@ „Y@‘FP $ÑÄEUù¨yØÎ&<¸vvëâÓƒ›f>Þ c}ðŠC($™])Ï™æ,i–—>á©Ï™¸}i÷÷zÞ´QZ+N¼fB"ÒDQ¬1DÀìëT3¢öàChfÍ}ð|Çw¼¿Ûíjej/çl^¤MµüN€•8$ÅÈUÙúZûÒåçþí¿ýáðøG~ô~øoÿNÓn€¿Nb_>É,`Ïà*-/skäóÝ$Ù#ÞôAS4)*¶=WUí»h~ÎØ¿Œôô‘‹üÓ_:+Š5uB<9šŒ’H›(©Êýû߆·¶¦“ÄŸiu,òéþñµ‹foÿqt¡Â«àÏ«F£ W›ýµáì8ô;PD–·Ü`Ý6Ÿoo¨½›SŒæ~zA÷ìÁþÕ󽿥ɾkHN¬EñÁáñÙ¨¿_n¸¹µIÎ"²ÚYÞmµ™ƒ‡ µÚ­^¯›ØÄ¹1F+€ NØc]¾½Çà¯o0"< n ÖÖ6”2¿óÛ¿ý¡_ÿ׿ú+ÿòÑG}ÿû?Ðëõˆt«Õ ¥‘!B½x:Up!Tå|2™|ü»té¹ïüÎ÷ÿýÿÑn·W–™µ¯Ïy_ @-r  ‚ „—nºÑ |Ut©&_`H;WU–j²ÝíY™\i¸,VQ®ùl ‰ï7ÎŒs£‹ãã›®5Åýì\'m€Âv–e.›ö±l¾îŠ¡N(QUÞŸŒ»½çpþQ¤)6 ÚŤ 6’Y9cϾ\·z³×ÙÈ tn¦ìPTy3T ˆQÀ !<ç PŠ”HAi@’˜Ä¥ósãµVŠ‚Îs75ÒK# 0›73w ì³¥ç  wOçY‘àí„dÝQ¥µ¨`9UrBÀ"‚UVIIl-òåd2Îæmk:ÅPqð…Ñ*²¤Ëb4Ÿ ÊÙÑ…‡¶c«oÞhå%“†Š™ÿL’'fÃñÚÆ9¥­KJkh:>®ªrm}tñ‘y9Nf‡»ik½¯¨™.`ÑÛ̉Cè@œi%š¨Ê*Ü~DXÖqQ ³2@QD6&Œ²b.'Zµù<€»w#$BBÀ !¸Eí³¦öz ¨uíû«¡žã^TRÏ}¯æöŒ5¸2xËøxyß™µuÞÉIâE a@ZQÔÛµš öqª]`1DT÷ s½¤5!bð"i$"ÐRG”RH@š4"ÖQ/!Áb  ÈDuã¡€÷žx¡Í'9ƒº=j­·YUU‘»F#ñA<{­hc»7˜Q¦s·½VTll+Ž»eNDºr“¸Ñ$  ´Ûq–eª´™¶Úý$‰k3bÏ\$‹Ž:Eµ:ÇiûÔ)V 5ÕYc@]}€n·ÃB?÷sÿåOüäýéŸ~ø÷ÿàwó¼¸xñâÅ‹ÛÍÍ4M†1¦,Ë£££ƒƒƒÑhtéÒWŽßýîwýêÿø/¶¶¶C¨˜]ů›÷E¨û+…ˆ@xD/3ãÆUUæ gÈ‘FŠt`öe57‰ œo]|Î…Ùøæã1¬¸1W½Vst´ßkoM§7+Gëñúzfóœý0Žt¤7²ŒX ÇÞM¡²ÊbDUU LïÂý‡ûÏ· *Ïœ¿l㪼ö¨ËÖLóãÆèèè0½ɱ.wÖwÚ#q”[¾Šɉx±ˆ èHL¤PÍ”ˆ ” ìtPe¨Di´¹Â[•kƒXnBÉ•°u;[Íîyœ ﹡Ox Oz¯Œ1 ­¸òÁI½Pã $2ÙííØ*Gû7:Ï?3×öãD}/YÔšoo¶z×^2¯^¸™Ña%NûNb&Y™-#Ëe|¢ZÁ:Ÿå—ŸÿÈ¥åU<Ùîpr—Ú7p2鋲¿©{ÊʲœL&ÓéôóŸý$ÜÙ"To%m´´ÖÆ©g´p!k¬I-ëF«„MZcâ8¶Öc¬µµç®ðKûàæyî½/Š¢(ŠÚ ±nƒÒ&c¢(²6&"€š#¹Ù“†9€\½|>ŸWU•eY–eõJê½²‘ BEÆZGIÙXkÝíu–û¶µGßý´„LcÜZ?öÚ›cAžÍå+kÒ˜€9RQ7÷ÿ®nž­&“"Müd"–üÄÇFgzo ó¥ÏÃoØOJ|Ȧýƒ›/Ü’à)²³cÂ)„óŒ÷ñÁ‹¿ã=™dpkóÙ'ýÌ]WñÑìxsãü§÷/7?÷‘÷œ}øÆù‡öÓÖãóþßOTÚ‹8$ nQ[#p³IœÍ‘%– Št!캒'ƒ±vÀB\åGƒèÜÛ~ý¡¾M;£Q1–“qtp£up³cš÷vž—¬@\Lý.Ä ÿ"'^­·.]øãm‘¡w³$IHbWAålºý%à(mœWò{‘7úŒQ•ñ¾vï­ªŠÕTé5•Ìüøãó Û‡ÇÇîØq8~îüáuUS¯×^lçE»Ñ¸6ùVzVGó2+÷Æ_ú’Ê&‡C²k^0õŽçE†‘D@D¨ lA )@ 5Ì ,ªŠ3ïˆÈMž!€‚V$"UÀ !žºjÍÁX@‘:ED$B¢™÷ѪEÊ™• FíXˆPÖ¦ K.ªJ³ä±@Œka/ jç†å…_¿f›t!€÷â¼xƒˆ°*@+m£` ZêYÍ+·`}ª+ÇnA„(p)¡`_'"HHAˆ”"­”‰¬D1Æ 2f<éÄF¶ªcxÄœÃt>;Ž'ãYYÄqŒ 8Œ£E@ĵV¡(êtׯÝf«*e­ÝsÁõÓ¶RVk}x°ßL©¼* ƒßþÐoe›ñÓŸ}§+JDý\„㣔ÕU›ÄÞQ÷_›U÷Ýöðøù¼ÀOüá}Iª8©(È:rÚL6¼óÓüæW>þxåsÃ(F®6\5šFW>öÿ$q¢” „ɰÛé¥** …Ã%Q`ctD—ŸôF1FÏ{œ±h$ ²¬BÉà|åo%EQùPŠ(`$])@k]îò½[v’•ÌAë¢òúÙgèsûç¥ÛK<ÎÙë*¥m 0¹§ó¬E„j—V­ÉZXÓpM6êù“úyD¤µ{}2™8?³-›‡²rS­ƒMí`0¶º™ž2@ÍÀÀÁzIgSÜj>Hø$Ø™œ)IDATÌx²W´›iw½˜æÖÎÚ[95ŸTAhbÆ3"‘å£[Ûˆƒ8ÙÕ*1jžZC•i™æHö÷n®å7Ë(‰Ø·­"®8…µÓŠ¢ˆyi={©$@U8+ U¬l¬rE@$¤@)Pˆ¨´bbao´ ÂÄ(è+_dE‹R.30b-ލ i«¬Ö(T„šDˆ@)Ôµ?R}¢Û”R†Œ!c•5d(>®;%>|YzçBU±s‚:eôŒÈ(ŽƒøË¸œ©Eû#cÝ{_deUUUá|$"i¥•RÂLDdud´µÊÖm¡7Ò8ÍóÜUND¦£é­[·nîÝ*|ˆ›­ØX¥T¬Œˆ0©xa%‚ ¢µ±1ÆhÕLQ“YßjÏFÇ[;P|1šÞxöKŸûÄ'ªivÐO›ŽúT¨ª"zïã8VÅ €¸–ŽC@Rš”ÈÇ.@€Bd‰át~÷«P”"ðì™  Á1ÖØÚ#+#Ò­Fvr˶L!@¥¬ÊÊQ% Û,ýLDRÓX´©¾þ€Àõ Aƒ A½\ÊÕ‘÷Þjò]p‘™ZŠ=ê XO­ã¼ê”Y’¶&“©A›%é‹|Ú馓Éhc§9Ú¸9MwÏìT~:œÜˆck©åx&ö…ñÑÍÍ'Šñãà‡6½¦)”¡œÆ;¬Ïöß<]îî^îU¼;]"s¥Ý艂lÜ䟎筴§LÆñ:…Amb&Lµ[hÅR±ãQâJOJ”2Á` "Vã P曌#*j·Ö6Ö‡££ÜyÐÖ„i6G’è^SÐõ¨¡Rt¢ù¼l; ½÷u÷`]\ ÇÖvcÝÍŠMU§™ÈåYÑHbëBÅÌÄFš´$F^t sµ¯ª7x‘‚æÊÕ?¡¬|í}«<+…É€"TT@p؉ ºÝˆÈгÂçóÌ{?Ø?¾yõÆ<ˬµ"2™Ïœs‘6Æp ":Ž£Ø aݤÝívÛí¶‰çÏœ½yíjlѯÿ‹ÿþ—60L‘}ƒÒÌ=õÓdXÇI·/Õmj5%Æ@äʹ±ÊKÝ B„ª.ôr­ËBDŠ €‚ºDψˆ€÷,~Š×1ŠªŒl„)R̬@ cTJ'\™ˆÄI€\U¬*9¯Ö†”iÔ…ËŒŽZ_9oÌ7ÍíÛ € ‚EÐ!X|¥ ÝÒ—b¡R?Œ"¹/!tpW°Âhrè­OFÅ,‡±Ï¨ÓkÎ'%©DQ»7÷ny57”je³8›Í66U·ÙdŸ7LÃù0­2›6|«ÁùøáK{°™î4¬wÁϧónsl¬õÎt:°q!ÖÄã¸;O¢~Y7#@¶ ¶î¨¬IƒK*W5¬'0B=\º1mᜠ°x<±V‡í‘{º¢,жÉ'® †F¿×˜g£{;Ïü'?ŸÿðŸiÛí­‡®¼c·øÙ_™=ns]‹´-¯Â:èÊÛÝÑ«+ZÖÞ–¸,Í.#¤zI-â,Œ„}ιà=°,†'6J©(Š¢(ðD¤H+U›×!)3{Z±•]n}Rnuï]ͯý§?ù©iÕ~=Mg<-óºË¬ùZ6Fåa@ÂÄŽÇãñ ×®>óì“/¼p KG'F@ˆh­]<£ÄHh•²„Q!)$"¤B)£È*ekµN •»]»M’$‰µ)KUï@]â]BYº²,sÁyçœ/«Z$’l°ÖSI}?0CQ•ÛëkÈÕàp¯×ëÍf³z2›3ÎööözÝöáá>RÌÇqÓlæY±sö\Q:e•‰tœÆ^üù3ëÍfs>Ÿ¿üå/ *Ó)]°*\§ZÙ,+ZiÓC²¹Öä¾ûÛI|vs³ßïZk®Ý¸ú›ÿü~á/ÿ"Mb€²p3ç\+í•>ô_;£˜Sœâµ‡òpíÒ_èïü£ÿåV¯Ò\Nnæ­&¾q…*i7^Èþ§ÿä×òó3³gÈEdõüð¨¹Ýw©&kÂt>]S‡Á¼Âdi¹l~… ðÞv«H«R+½Ê/-\w4Ë-ǯ¼Ó³hÙ'¥Q‡Y)­+ï€gŠ[@Í K§%í¡F@f–°ÈÀ¥<,Ŷ¸~\:ùóÎ'_”ÅÃÔʉ: ȹn3¾m-µ$Z–zÄwÑæE„Ì×Z¼Pé P·nyÈOò½uýwqÔý~÷êÕKŠ@‰ß»uKÙ¨–{*¦t~ç‘O~ò“Ýn»Õj%I2M£;öGq«yãèšš›Ýme¢n½ÕjLç6ivžþù½½ýÉd*M“dv\¬÷û“ÉðM><úkí gÏlmo®uvÓØ<ûäç~õøgÇ7¯ͯ¶¦ÞñãŸI“æñðz§ÛŒM36A ÐixzŠS¼& u *@(¦=cÙ+ÁPT§üjÀ &sÕZÚRi­¬0êçžë·Þ4ju02vR†"ã6ã+×}ä—F]ËÖbPøÒ®™Kþ[Rà‰V,×°ú"ø +ŸB¬Åš žâ…;=šàN%ÂU^^>Ü¥¨ë”'>°•¦Š×Êêps9»¬v dä€ÞûªªªªbW7Ü/÷&B YØ:c>×>HšH-$…kAEQ4)…Dµ“<{@Å!œX0/\€ƒ¸Ê33ûàœ«ª…ã}d-+eâHkHµ7õ²Ì\ä³(6Í4Éó|2™ÄÚÎË™g™Ž†{û{gÎõÞáÑl5ã‚‹™äk›»G£þz7é¶1¨yV° ÇýêÓOö:mkÒéøæööÆx<~Ç#ïlo¾åÍͦ‡iŠ_úËOÿÒÏý‡*ÖíúÞ3ÿíõýÃñWv;}JÑR#™e½^—@—~®•õ>D&pßøÕ|ŠSœâÿWeb`Ž9)òñ™V÷JiÑ(É¿ÕûõZ…FmgnôøæN.%Ì:ßÛg÷ØT‰¶Q Ò!èœznßY¿:u³\Ñj YcƒÂ‘è]/îzO½t™1\ñ€ð2=[‡•‹n€åÃÁ¢Eùä#†Œ1g·Ú%°†Ü€žKe„À m/WÎ΋ 0ç‹¢Èçó<Ïs_ßT)ÃÉãœH¨‡„OÎ!2`½çµÁ¥e…|mPUUQU%{(j‘÷eæëÒuðuÄ\ûÀ|v$"{Ó± ²³³“ål8žÍfÚE9µZ™XëHïß¼ñø>ÿüsݵsBv×Fq">lmõÙ9—¨x0xa£­oÝxÅ?|¡µ»ÝÉ3õÔ~÷þõå¸=6ÍþóG€+Š4À Ï3E‘Ñi¯“¸r¦uD*v<&t€r6ÍÖzMeH œNéžâßþð`TQplÏTê«÷õ‹g,aÚŒNŸŸ_¨r¼oí1…åœktC“N"QÖ¢ÒFÚ…Ï{±@|ÂdwqÕËaYå]vB…›ÕðR…ŸEXx…€ï‡½›×AD„WTòeáÈ´Jè·i»ò išö»ÝLD“E`!ùµJêK­Æ€BÂà½wE™eYYÁù—Ë™¢œü #(®©–}B ®^®4*…ŠH(@@ (ìA zf¨õ³@€p¨‡Ø{"2J° `ð¨¢RZÃjR¡×ëeE¥m,H¨ôÍ›—›Í&{ã@uû8Nʲt|ð̓áð­OüN|aïÆ»Þò.£$±™‘Ü•s®¦8=ü£?üƒÏò“æ 0“ò8‰"þãì%‘#Èú)Ç—µRfÜù$±ÀgùAš4¦ÓâF;>c¢ bæ~¯ï¹BDDuJÀ§8Å·?,¸bÿ ‰¯m÷UÐEe{ÆŸð«‚qV§³h&‚ª Ò±UÁª”UäÄ'°>/§Q2:³“Ln¬DœÂK›Ø;×»$ixk.sÂËõœ/CC áÄ¡§þL=Å+/²Ø« ˜™W¿¾k+?æ+h8™`ž¹ŸïÅqÜÌœw–µ(X™Í]>(ˆˆÒ8p`_VyžYî\}­Ü–?Å•?W—s=À J)"… ¡^°Z”½™ƒ÷€¸¨+{ï½»‹¡ñ)¯P4(~Q@i­m}^]Üò¼2&Z[ßÊó|<öZÍÝí­ƒ}ntÏEµÖ[lÒï6ÝÆF§ª²Vkó»ßýù/|öàêÕßû½ÿõÒÓ_VP)æe^üóöÜÔ¡"݈ |¢š½¢dookç¾N§[ON‰ªDüd6ÍÊl{}Ûƒ0íxãhte½»ÅÀš,‚unjŒ>9K§8Å)¾­a!5(/*{©·ycw­¼´‡Þ#œ¶q¼Tå|ï‘ÞZŸt Âà*J;¨rä3Ù ó¶¬Íy´Ñ½åQõ‰[r§ ÝËÁ«¤ wÒð"´=Y²˜-^„eað"ˆ«†¯+-ÁÌ ¸HSËípmWÀrgV| GQüØ}í8m•ÀÂÝ’&‘ôºCÜÕƒ !8|f³ùl:ÏçÞ{M @mx € zñçÝga18H¤‰H+SÛ]!Éâñƒå¤ «ªÒÚÕ½M¢µ•ýÉ3J-ÊM€"Â!xï¡V¯4‘µQÅZ“Ö:ŠŒ1†ÄqŒ <ïý£>Øë4n^yîû¿ë}·Ž¯ŸÙ9·ó(›Í.=óñÙúÏ? P Ìì»’ÁýÊ/ýƒ&ŒœÌŠrnµé.Ä}(;v:ëBwx¸·¾µ¾µóHYÍ•B­t^6:P4ZØm­¨Ù¬t™_ÛÜZïn×2œ“é¤ÓZO¢€³r”FíW}Ÿâ§ø«U‰BÈv õX{ã o{$—S>´§üª`’T¿í¡7¬Ÿ‰´ Æz-ŠX«®Mx ]oênE÷íªO©ezvI¢u"ô%7°ƒÞU^]R)ÜÙ´\µ5ÅbûÂíÍÁÝuåŬï]¿W»¯W_D­vës­*M\‘ÔÁ~*½BªªZm [¦pË*÷¥Ëój>ŸÏçó¢(Ø¢EÒ¿—?wýÉ‘³sNk$äzl:xÏìEBëÚÎ(„@¨”ªjI¥¡®é.Æ—Oæ°kÉHk-ïµÖQ5“Ô¶Ö’$IÒØZÇq³™¦Xk=Ÿå^ÿàà ›Í‡G{þôÇ?ö§|ã¹ç4J›Fé½]¶§8Å)¾%¨ °h¡2A.¤½õÇì}uzpô­Þ­×*’F+}üþ¢ûàPé*¼øÄÛÞÿ½lllVŽ[qS+UŠË¹üü†?yÉñRçpÞ¨"ÉÚÊ5M¼Xã2®­WøNïôúO­‹¤ÕìO A—¥Ëó1BfX¨D©Ÿ˜‡ÕsºõÜ +åÛå>Lõ” RUTIÚ¦¸=œ—¦Ñyóü@TIê (ÒF[ŒbCjzÅZÇqEuAz1ð#ÑhÀO>õ•££Ãé|VUE–e´WŸêÀT)EzÒjµ§“¼‘¶Kç»ÝvVÖbSOL|Q)åÍ$xè÷7‹Üi­Šr¦4ûP•EÄV£]ÌË|^4lJ¨„™S3OÛ2ÊjÂ8€"бÝÞžÏòˆ¢Ép¤¯^zrï…gÿßO~´—^ù«»šNqŠS¼®1ßCâ¡ôb“=4½téϾøå¯Þ¨²9±$ÖX¥/3*pØùVïò·âŠ¢/ZYFô:Nâ´ùþŸxÿÙ^û¬N5TPæ %(r€ºòγ’xañ@˜á;Íöð¾ä5÷®\9MúlM<\ÏŽ6n7:-|±VL­›ª`E”ʘ6suåêÍݳE‘!Iåª8µÙLD$F¨„'‹ –ˆŠµî»ïòåç~øáù|ªÛÛe™‡t_GGkhâó~¬Û-sãÆ5Wù,S`‡ÙsO?·¹¾öôWþR[ n¸Î )4=ø²œu£¿{4{¡—~à4¸<Å)NñÍX´¶ Q’·>p_š¦O˧Â`’fe!ä4¸„P[+wõ[½ËßxÁÅ0©RFìË­T½í¡æ[ÙM“®N €&PDÂ/¾ó]ßóƒ?ÔÝÝ­œÄÊ$6*hiìåó޽ùËn<˜M`œáÍ¡¿5ld³%û®*lÌçóeäº\("¾âµµ^¾¶8 ŽŒQyžÝfçëNiMŠˆ¢ˆpþcþ¦“Ãk×n>åCÖµÍDã[ûã«/T{·ÂÑ1Ǻ*c¥¼?Õ`h–yÛL·Òp¶“nt.ô×ß´yî¡x»ûÁ{.4¢@ï+|ð]ßñ=?ô¼ðV”BÒ‰«×t2,²¡T³ˆÆF.H6‰';Ñh²,—¼êä]Ùi6|(ó|n¬RHu$9›Þ{ï= Ô|U×G=ñjæv™‚Öú¥ ¸ˆÇÕdÒ'÷Fg(nLÝÁS—ÞöÈ&Ã[ (dM I /XE°*ıhÉf.fUš¦ÇÇÇ£ãÁ“O>©µ&ĪªâØ®¤—*ZA©Édrv÷Œ|–g£Ýuö¥â ©³,«‡‰™ùèÆG¹¯.ʽf”jˆgÞ ë®]»uts{}mV7"à«0UŠ˜ÂgÄÊÚfðYYÌÓf î%Åh7Û T6¦Œ=±Ë=Å)NqŠoàÿkï\~¹ª0þsï­*»Êm÷tš™ ¯„ȉ³B€Hv„™‚(“‘PFštz4vwûQû8÷°(·i%½&Êø'/¬+Yº.•üùž:çû @–±[Ö± dW:\ Ã¥àôŠÌÚ¸T3ºxÓþFpMÏŠÐ]túSWÿ¤^œ¡°H9‡š4zIÆ¸Š H‰~öëß|ôÉN?úT¨AX#œu1mW¹Þº š´M):kêÊ„Ëû%胒!ïû™¿âIyvòþŸÏç¾.Ο<ÿìóé䤫cNÀ±ÙwG‹˜‰ûŠùâØ£Ô=ÑUhÓf!$Òêdš)ºªX,NnV¯gvš ¼""NÙ¡(È“Ãguòœs31Ïž}ê,>{þvȃäPדÝíäþ×ÁI5Ì•ˆ<ûç§Í¤¶ËË_Íʪ7ÿ¹2cD"ˆ@9ËyȯcÚÍŠfÐh©¶¨  ¼Ý\ÏNæ€ ½ˆˆ4“G·Ûåbvض[UU©9Y;˺Þ7Í#ßLËßÒT–#G޼’# Ì>ìD(¦Èù4gQDg`|!=Кú6b»wÀ:“¡L¡ˆ 08ÀZeöc]l@ÈJ<ýåï>ùý;ï/ 5vBYÒb;´ÌV†0´21›Ñã°¹xr¿„{Ðà"îõKÓÁ>Ú\"§óó³ëÕk£Îr¥É®–›€å8 €Ç§È9CrQOäÞÔÍA€]QŽ¿ïÕ‡/׫޸EÓw›ïÓ ru’¥ï…422ª”2’h”íæóav»Ýf³Ùl6mÛzïEävÙ¾÷øâÏú£s9†Ôµ—ý°žOê€ËCÏØ§= ªúÆZ[˜‚ÀIZF`ã‚¿)ö¾ d@pðú೜ƒµJÐåÍÕl6/í"IòÃ˪šîvÝ|þ.¨‚ª¡ÛTÓy‚X8 ÑGO¬SSG]…êr>HW™*!w¡sÎMèø øÈ‘#ÿ-(ç(PÃÄ`¨2;¼Ê` £°©´R0˜\÷¦7ü f „fK0ã P‚¨*“(ýâãßþ꣫Ggѧù¤q`ÑÜ%/7»@yÕï–ýV˜ëYc­1Öêðµ4CûéØýñÎf¹Ôw»þÖr\,ª¡o¯¾¸üÁû¼xñrÆvuÿ&¥p¿”}HMðq¿.÷PUåî¥Ñâê_/&uõüÕ {6ùËßÿú}Z }¤%ed gd(tTSíSAŠùu»<«]ܲjULbØ:k2ÇQ€GõÝÿÃ1¬÷Û²<íûuU”ªÂ–½Á6AHûÉ¥®í»²,™-ÃÅœ´Ýºž@VD0)'Ë•"mÚí¼>ýòõ˲,œïâ®v5BÕùõ´œßö›é¤!8 ý¿ßlGŽù¶B‚»rf&(AA…/À€Í™b„yÇSß6í/V‘·êûÎ]E`‚IÐ{þøçOŸÌ·«ÍÔTvihýÛÞÄX³ãŒa„ÔŽ¥ýúITU“‡•1p0„c4šCh}@ßýyp†€pffƒ»Ç«ªÄ ¢QæFÏÀÞ#ŠìÃ9”š5‰Z[YC{ßïÊiíá `òèp¹º×œ•ª±zи2bŠm„”hF«f22löUd`¿1"…´,ŠSº²˜Ž=ƒŠÔû¾*«û;å.Ñ'Àb~»]/fßân¸mªÊÁûùláÓ†XÙ2Ùh""B HÒh© 2ˆB¦UÄÍúúd~ “|oËæ|k9räm¡Ó¡ gaÇO¡Mʰ  RÍ”•E‘)VÙ½}Xt£Jª”Aİ lX!&PŠAþ7î•—éÇnb-IEND®B`‚qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/src/000077500000000000000000000000001225012771600312115ustar00rootroot00000000000000qmlvideo.qdoc000066400000000000000000000132561225012771600336310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example video/qmlvideo \title QML Video Example \ingroup multimedia_examples \brief The QML Video Example demonstrates the various manipulations (move; resize; rotate; change aspect ratio) which can be applied to QML \l{VideoOutput} items. \section1 Overview This example demonstrates the various manipulations (move; resize; rotate; change aspect ratio) which can be applied to QML \l{VideoOutput} items. It also shows how native code can be combined with QML to implement more advanced functionality - in this case, C++ code is used to calculate the QML frame rate. This value is rendered in QML in a semi-transparent item overlaid on the video content. The following image shows the application executing the video-overlay scene, which creates a dummy overlay item (just a semi-transparent \l{Rectangle}), which moves across the \l{VideoOutput} item. \image qmlvideo-overlay.png \section1 Application structure The \l{multimedia/video/qmlvideo/qml/qmlvideo/main.qml} file creates a UI which includes the following items: \list \li Two \l{multimedia/video/qmlvideo/qml/qmlvideo/Button.qml}{Button} instances, each of which displays a filename, and can be used to launch a \l{multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml}{FileBrowser} \li An exit \l{multimedia/video/qmlvideo/qml/qmlvideo/Button.qml}{Button} \li A \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneSelectionPanel.qml}{SceneSelectionPanel}, which is a flickable list displaying the available scenes \li At the lower left, an item which displays the QML repainting rate - the upper number is the instantaneous frame rate and the lower number is the average over the past second. \endlist \image qmlvideo-menu.png Each scene in the flickable list is implemented in its own QML file - for example the video-basic scene (which just displays a static \l{VideoOutput} in the center of the screen) is implemented in the \l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic.qml} file. As you can see from the code, this makes use of a type of inheritance: a \l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic} item ... \quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml \skipto import \printuntil /^\}/ ... is-a \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} ... \quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml \skipto import \printuntil contentType \dots \skipto Content \printuntil content \dots \skipto } \printuntil /^\}/ ... which is-a \l{multimedia/video/qmlvideo/qml/qmlvideo/Scene.qml}{Scene}: \quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/Scene.qml \skipto import \printuntil root \dots \skipto property QtObject content \printuntil content \dots \skipto Button \printuntil /^\}/ \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} describes the structure and behaviour of the scene, but is agnostic of the type of content which will be displayed - this is abstracted by \l{multimedia/video/qmlvideo/qml/qmlvideo/Content.qml}{Content}. This pattern allows us to define a particular use case (in this case, simply display a static piece of content), and then instantiate that use case for both video content (\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic}) and cameracontent (\l{multimedia/video/qmlvideo/qml/qmlvideo/CameraBasic.qml}{CameraBasic}). This approach is used to implement many of the other scenes - for example, "repeatedly slide the content from left to right and back again" is implemented by \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneMove.qml}{SceneMove}, on which \l{multimedia/video/qmlvideo/qml/qmlvideo/VideoMove.qml}{VideoMove} and \l{multimedia/video/qmlvideo/qml/qmlvideo/CameraMove.qml}{CameraMove} are based. Depending on the value of the contentType property in the top-level scene instance, the embedded \l{multimedia/video/qmlvideo/qml/qmlvideo/Content.qml}{Content} item creates either a \l{MediaPlayer} or a \l{Camera} item. \section1 Calculating and displaying QML painting rate \input multimedia/doc/src/examples/video-qml-paint-rate.qdocinc All that remains is to connect the afterRendering() signal of the QQuickView object to a JavaScript function, which will eventually call frequencyItem.notify(): \quotefromfile multimedia/video/qmlvideo/main.cpp \skipto QGuiApplication \printuntil ; \dots \skipto QQuickItem \printuntil ; \dots \skipto QObject::connect \printuntil SLOT(qmlFramePainted())); */ qmlvideofx.qdoc000066400000000000000000000177201225012771600341670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example video/qmlvideofx \title QML Video Shader Effects Example \ingroup multimedia_examples \brief The QML Video Shader Effects Example shows how \l {ShaderEffect} can be used to apply postprocessing effects, expressed in \c GLSL, to video and camera viewfinder content. \section1 Overview This example shows how a \l {ShaderEffectItem} can be used to apply postprocessing effects, expressed in GLSL, to QML \l {VideoOutput} items. It also shows how native code can be combined with QML to implement more advanced functionality - in this case, C++ code is used to calculate the QML frame rate. This value is rendered in QML in a semi-transparent item overlaid on the video content. Finally, this application demonstrates the use of different top-level QML files to handle different physical screen sizes. On small-screen devices, menus are by default hidden, and only appear when summoned by a gesture. Large-screen devices show a more traditional layout in which menus are displayed around the video content pane. The following screenshots show shader effects being applied. In each case, the effect is implemented using a fragment shader. Here we see an edge detection algorithm being applied to a video clip (\l{http://orange.blender.org/}{Elephant's Dream from blender.org}). \image qmlvideofx-video-edgedetection.png This image shows a page curl effect, applied to the same video clip. \image qmlvideofx-video-pagecurl.png Here we see a 'glow' effect (edge detection plus colour quantization) being applied to the camera viewfinder. \image qmlvideofx-camera-glow.png This image shows a 'lens magnification' effect applied to the viewfinder. \image qmlvideofx-camera-magnify.png The application includes many more effects than the ones shown here - look for Effect*.qml files in the list above to see the full range. \section1 Application structure Shader effects can be applied to video or viewfinder content using \l{ShaderEffectItem}, as shown in the following example, which applies a wiggly effect to the content: \code import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { width: 300 height: 300 color: "black" MediaPlayer { id: mediaPlayer source: "test.mp4" playing: true } VideoOutput { id: video anchors.fill: parent source: mediaPlayer } ShaderEffect { property variant source: ShaderEffectSource { sourceItem: video; hideSource: true } property real wiggleAmount: 0.005 anchors.fill: video fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp float wiggleAmount; void main(void) { highp vec2 wiggledTexCoord = qt_TexCoord0; wiggledTexCoord.s += sin(4.0 * 3.141592653589 * wiggledTexCoord.t) * wiggleAmount; gl_FragColor = texture2D(source, wiggledTexCoord.st); } " } } \endcode In this application, the usage of the \l{ShaderEffect} and \l{VideoOutput} types is a bit more complicated, for the following reasons: \list \li Each effect can be applied to either a \l{VideoOutput} or an \l{Image} item, so the type of the source item must be abstracted away from the effect implementation \li For some effects (such as the edge detection and glow examples shown in the screenshots above), the transformation is applied only to pixels to the left of a dividing line - this allows the effect to be easily compared with the untransformed image on the right \li Most effects have one or more parameters which can be modified by the user - these are controlled by sliders in the UI which are connected to uniform values passed into the GLSL code \endlist The abstraction of source item type is achieved by the \l{multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content}, which uses a \l{Loader} to create either a \l{MediaPlayer}, \l{Camera} or \l{Image}: \quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml \skipto import \printuntil { \dots \skipto Loader { \printuntil } \dots \skipto function openImage \printuntil "ContentImage.qml" \skipto contentLoader.item.source \printuntil path \skipto } \printuntil } \skipto function openVideo \printuntil "ContentVideo.qml" \skipto contentLoader.item.mediaSource \printuntil path \skipto } \printuntil } \skipto function openCamera \printuntil "ContentCamera.qml" \skipto } \printuntil } \skipto /^\}/ \printuntil } Each effect is implemented as a QML item which is based on the \l{multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml}{Effect}, which in turn is based on the \l{ShaderEffect}: \quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml \skipto import \printuntil /^\}/ The interface of the \l Effect allows for derived effects to specify the number of parameters which they support (and therefore the number of sliders which should be displayed), and whether a vertical dividing line should be drawn between transformed and untransformed image regions. As an example, here is the implementation of the pixelation effect. As you can see, the pixelation effect supports one parameter (which controls the pixelation granularity), and states that the divider should be displayed. \quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml \skipto import \printuntil /^\}/ The main.qml file shows a \l{multimedia/video/qmlvideofx/qml/qmlvideofx/FileOpen.qml}{FileOpen}, which allows the user to select the input source and an \l{multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSelectionPanel.qml}{EffectSelectionPanel} item, which lists each of the available shader effects. As described above, a \l{multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content} item is used to load the appropriate input and effect type. A \l{multimedia/video/qmlvideofx/qml/qmlvideofx/Divider.qml}{Divider} item draws the vertical dividing line, which can be dragged left / right by the user. Finally, a \l{multimedia/video/qmlvideofx/qml/qmlvideofx/ParameterPanel.qml}{ParameterPanel} item renders the sliders corresponding to each effect parameter. Here is the source selection menu: \image qmlvideofx-source-menu.png And here is the effect selection menu: \image qmlvideofx-effects-menu.png \section1 Calculating and displaying QML painting rate \input multimedia/doc/src/examples/video-qml-paint-rate.qdocinc All that remains is to connect the afterRendering() signal of the QQuickView object to a JavaScript function, which will eventually call frequencyItem.notify(): \quotefromfile multimedia/video/qmlvideofx/main.cpp \skipto QGuiApplication \printuntil ; \dots \skipto QQuickItem \printuntil ; \dots \skipto QObject::connect \printuntil SLOT(qmlFramePainted())); */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/000077500000000000000000000000001225012771600314755ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600326635ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideoclose.png000066400000000000000000000034071225012771600345020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images‰PNG  IHDR00Wù‡ÎIDATxÚÕšklTEÇO·Ým¶Th‹""ÃC±HHxÈ#ð‰¯èBŒ ø"ˆ¨5ø(‘€"bQ!< † ‰Ô¤¤ž5CAˆØ´ÝmwýŸ½3qîÜÙ½Ó·0Éé½»wöÞÿoΙ3sgšExÉêi™È ƒ È pvvÖÑ]€BØ*Ø«°þ¯BÜí‚m„Ýê À ØnØãÏàÏØ@X–MŽKüLÖ#Ñ„1qìHñYZ§8róWÁ.:·¸#ò¸ À‹°c}‰Â‹q2 ‚剣j¹âÔ¾S?si‡EÅQ=jç1í;þ\Û»KÔ*ö×tüÌÚbþ}œ ­ÿ„&ýÚÕ#[\9·ùÌžh„ÕÁ.þ€µ8}b¤`4¼Ûñ²8™&B!®<$Õ¹ßõîüŽ-v…œŽ°ÇÑø&lg*€2´ô¯qòЏØSâÕ#‡ïyØ[NhíÃaQ*€ªÁD%gpRôˆïç,ô5Øu‡eL*€Ú¢•ZlÊ|âÖd~uL±ßDÿe$Y‡Ÿý6%;uèf€IøEÏ•‚”¹€Å_‚ý£5à;N(ùœÔ~˜Iñ²p ­0²1 Ú ‚Ü® fX¼,<µ(ZÞµ8¦PsÉ1Ý=¢ÀäÉH í?ƒnS—J @ÒR 0¹?}™=ê©Â½µYÑòYôR CȉPÞÉ“”=~¼Óñ¢öEÈl­­vâÃaÊ-+£ì9s’:Ï£¶©SÑÜ-é¶lŽ;„²µJÁÅ‹)¼m›ë»Ž£G©uþ|Jø@dA|xÿ~Ê™9Óõ}Û’%ÕîY-< µ|hð“;Åé¹K—Rx˸ î§`ñ½ >¨‰çÒºlµoÝjZV°@€CšúÓŠ‹© ²’²qô@9B- x X|¤¼œ‚³fy~ÓÙÐ@ãÆá¨¨!´Êà æ?jõ«¨ ì¢"ϵ( šŸñ!“ø›7éïéÓ)«¦ÆsMH€:?€‰@=|}äHpâå˜ N'.›!l: þö´i¨­5Ž3Œ¤†ÐG¶?“{>bðD1q)öƉt@jùÄ`&>ÕD™GØ'!>bßñUÈ6\Æ ;å Zñgš¹ÈbŸÚŒÀnM¼ €ÅFØD aÃâGžTW;B1NŒÅ8a„@8]7̸\Ô<ð%׈üviâu€¬¼<‚–ÏO!þ7´|>ò¼œÅòËy3Ɖ )<Ñ ˆk쉶6€Ú‰7ٌҀÂuë¨híZVˆ?‹<_€<¯OÁ“+m'&bœ n®_O·pßT pÅà[ÍZ¥¡PÁܹñgÐò}ÐòÆWPr^Лà‰RxB‡hYx¹ûsoÁKõSb·+ݱ¸#8™n®:åmVÞõªÐ…úmtójÞëÔ³Ýß‘3 êÒF·Zxjót†!¤xÞ ìö¿<呸¤mvÆ¡IEND®B`‚folder.png000066400000000000000000000034611225012771600346500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images‰PNG  IHDR szzôsBIT|dˆ pHYs~~EúüŸtEXtSoftwarewww.inkscape.org›î<®IDATX…½–ilT×Çÿç¾7û>^À3Ûãï{À)¶q3€£’5‚4RM©[’,mS)R•¨”ÒH‘HÝT‡$-¥$M-R”D)1[ê”ÔÂ…€<6¶™ÅãñÌ›ÏrûÁ66fL<%íOz®î{çýî9ç¾w‰s޹Ú•ùÏ ÚZ½^­y<þ¡³g.nï¾ã{@œ= "SssåÇ?yêáeK²Ó&³r¹ðJùii†ÌfýZ¯×önA-–ôM¥eyÏ(Þßï:òù玣œó¯ðû†ºâ‚Â,Ò›äPªf¦YÔ+«4Dø`Ñ"óÆ‘ï?æ#"劕EÇÚÚì ¹¶L9@ókGF|/lÜ´Ò{úÔ…Ÿ/pñn!Ϩ7f4ÕË)ô{ ÒH`1B^¾Z«ÕòxEEþK==W÷H+)ÉÛ¼eKÓóõß(Ò-/ÎbZƒ ÅX8lQ•d[—,Éè.)ÍûMï…kÏÍ'öOˆL'«_±>ŸÎk<…½ˆs7[XÛR¦Ê_fÝõà•¡§9ç\§S‘9M'ËÉË3³Ô+pžÈ• r%ƒVo‚ÁX¡²ZÓ~V^qßÒž_ý~R@ Åc£Ñ£±òÖd @ä‚^ëa6Û°ŠÃ &$ “3¨4€&&Iª Ì2T¯È‘ùý5ØlY'ûú†^½£R0‹O ÌE«Õ¢¨¨ìÖX’$8Œú†!I„ƒ.à±xÒç@ºú<¥×ã߯өÿEÓÛˆ–x¬¨8ûç‹U•›{?ÊJ«ÐÐЈòòòyÎ&‰À9à€ÛsAɃpÄ…hâ»sAÃŽüéÔPdÚ´©Éž›—¦4™5¢Ù¬…$Eàº9†+W\¸ti«›ZÐÖö8ÒÓÓ$ÑhƒƒNŒ¸œÜÂ7‰¼¸ç¸—l6Ëk{~ýÔ6SzˆM7Î\q—¿pãýP]½ ;wþjµzÁ"ÓÄb18}8×ýpæÁާ;†cB«Á<ÿË€ 1ñãg¡Õ¹ÑúмòJ;âñùk Qa±,A,ª@p\8óu~Ú}yAˆ(«LÇÎÝë04ò)š›ëÑÙÙ™’„  ‹ÅÁÁÁ\7ýûþúæ'ž”‚ˆ <¸ÊŠ»×£«ë(¾¹¦‡#u0Îyïu‡Ë36&¥´Pª8Z6ÚðÄ“õxâÉ­8räpJ€P8ºÿý=á” ¦HËaçn;þÙý.ÚÚC(š÷^"@ˆÅàÄ z÷Øù±ÿVˆE±¡µ MK±®¥½½½óÞËH@<>Ùô 8çþÈD¬ûòC÷â€D"k6ó¿ø6žaÚÛ_N.Klª¦Jn—ïÛo¥ÖŒó!È‚øÁšÑ×w{÷îIf€ød f8ç]—.½î‰;OI©2õ£õ[¥îÅÁƒn››)Á¬ @ ê¸òåM8¯…àqM :Ï_m¡D&xxK Îö:;ÿ6#À¦èvññЋ¿Ýwô³Ã‡?äƒ> ö‡1r#‚”Úo6¡°ÛmıwÞÀ©S]&·â¤»ý<À9÷¨"¢Œ3g.þ®°0g³}C­—kLΠ7ŠÐêD¥&n`ûã-صcºº>(ʦˆÍ=L‹¸l!"êé¹úŒÍ–õËU ¥ÚXŽQ^„Þ Bn  ¤4ÝÝÝ·2@Ä@ÉŽåÉ ¢•™†ƒÕU÷¯k©!­F N„Þ(B¡`_€óº}8Œ­ÛÁÉ®·q¨ãWÒ $ƒs~Àr"2<Ù³¿¸8÷»ëíµÂÒìÅP( FÔZá®1²sô=I’¦•B’AD?ÌÏ·þª©©L_SS¹\˜ì½Æ’—çÌi†e0šcxãµ÷Ü÷$0K¤*#ÓÐQW[Xºv]5iÔ*èô"tFd²ÛE"á8þÐ~E¥9øãë'¾Y"z¥RöRYù}Ú×׊Vk&Ԛɬ(U3å9qüK8Ý8wº÷ë˜#³½ ÀºoõêJcUÕ2(“ «Ñ‰p^ÇïÛÿ·Ëï^p¦ çü€DT¶x±©£®®°rÍšjR«Ðh•0™´ðzÆé–¹‘V¥–ï«(Ïßn·×о± þ|øc?8çÿ÷‹ˆ¾g³-rËåâÄϦõÿ¿ìFŠIEND®B`‚leaves.jpg000066400000000000000000007665421225012771600346700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/imagesÿØÿàJFIF``ÿá)bExifII* † ˜¤¬(1 ´2Ài‡ÔŽNIKON CORPORATIONNIKON D40X``GIMP 2.6.102011:08:17 12:13:19(š‚º‚Â"ˆ'ˆd0221ÊÞ‘‘ò’ ú’’’ ’ ’ †’,’60‘’60’’60 0100 ÿÿ  ÿ p¢£££>¤¤¤¤F¤¤¤¤ ¤ ¤ ¤ ¤!N ú( 2007:11:03 11:25:562007:11:03 11:25:56$ ´ ASCII 3ff45ae5e8672aa7236c8d02904ecf0aR980100Üä(ìn%HHÿØÿàJFIFÿÛC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;ÿÛC  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ÿÀœÄ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?àtû™2«kù˜`)ãÜ×Ok[!w*Œ»qÖ±4ˆá°”I¸<ƒ'$b¶aÔ­%ÇxUdoºO¼,Jr~éêSÓVGc4×Ú”qªLÞs–ð>œŽ•¹)àå@QŒzUk) Ši mÝ·ò‚›¨êii’E/B@Î+ûÍ$‹K©Ÿ¨ßȲ¢ÛÎT'ÞŒž=+ŸŠ.eÎ0À?_Z³©_É{*ý†*Àåñíÿתp ­<˜çed~>Yq]°¦ã 7šRØØ¼Óìd²aª¾ Ê·'k)à{¦_3ç1¯ 'ëŠo÷†@Äí-žÝ«ªÒíc]26eTiÍô¡·Ios_v] xôÙ]"·™cŽx8L²z}*k­iví®7¤GqܧŸð«òäݪ@åKÉàõê¤qÜêZ˜¶¹6£æbd#ñ8ê}«79ï{-ØZ+Ô†Öe¿ˆo#Œ¹ÇøÓŽ’MË20¤\c ~ÖÅ µ†—äÙZ¢„#ƒüX9Îz“Y:†¢ ª#Ž=äãÌêq\qÄÎ¤š¦¬Š‚_iìZÅ­ú¢FZ$[»I$üÇÓ¶k¢{DtP§10àƒšçoåJöÂ3ÏÎÏÆ3ïN°¸Ô ݸˆî¬:sšë©K™)-NnÛšÒ¹°¹Ù}‡±Ïù槃Ãð\ÿ¦ÈX`ü€˜¨gÖma,€;Éc•È'¸Æk7Rñ¦¦Ò$VöñD cÆxïéJ«Q{ªÎßyiE=u&ñ˜#š+†Ž- m$O¶jÖ‰y5ňIOʬàãÆž·Éx†·>ð%x>õ ¶¥­ßöl*°ìAÇ<ñYIÎt½›Z¯ÈÑÁS|Ë©²¦hcišP}ïE®SUÖãþÑŠ8æy¡2l^ úú{pkkWÔÒ}:æÞœ¨@ q‚3Î3\¡±œÝþî%Ffy}sZ`hÇYÔеZªÊ'ci׉<&øXö?ãXz•³› ´À3ð|³€}‰© ´¶µ‡ËÜTʹ“'‘ß8«ZLæY`,Å@ÆõûñBŠ¡yÞëÌÝ>xÚfu––i¥EänïÍMjb¶{‚¹\’Ì@éøVÅ݃Àb·b `ŽÿäÖuÖ‰s©]GL‘ þ\ƒNUW«ÜrŒc ÅlQŽþKÀÒXE¶ ÅHÀëøQWí<'´L—–¥å.NcŸ†+IJšvKOëÌçS“Z˜0$Dó;dœ9ïZBÙ¤_ŸœŒƒÈö¬»(Z;•áiJ18ì¿ZހƑ•by$Uד‹ÐÖšØÆ±k‹f0´¨œüÌ~è÷ü«q¦Q§²´Bc™8ÇãÖ²õxâwb² ®wg¹ì*[{…‡d|÷§t§±ž°n%õkM¥Crð¼õ¬%€Çs+v†êpx«º„§„˜•`Í€˜<þ9⣞âbù+€ãóüiÆëm˜Ò» aãI5» ІÑ@±íT íT¢¶‡P³h•cܧ(Ç=êä6ÿñ/ks—Ú¿Åþ}+–­Tþó¦]ŠšÉ’"E€ À^¹Å%†®p.£>dd¸ …b00GãÅLai¬•Uv³±Áþè8ÿ:§sgko0vÜñCüÇ< ­!(Ir³:ÔínQ$ñ˦¬s³Ct¶cíšÎŸQ,ÞáZa÷˜¡9úTºÄÂKñ,QáLcC†úÕ&…ä;B)éƒÚº)Ò‚WHÎïk“çíNN€•ÉØpIúzÖœÍze”ò+!Dê‹*ÂAãh®’Ŷ;.Ò@Î+:Òå^GE©]¶dµ£É¨”FòÑÛï1ç#©­X¼7o<.d¶ì’{ŸZƒT¸··ya£|Ãw*SV4´žH’DŠ7Î\ýߥg9TåRNȉB›nÏRt´–ïÏ™pWwl÷ý+.$ s"Å€ 8äûÖµýœòÅ”»”¯ñŽð@ÏëT@†ÚxcŠ&coaîk8&¯­ÛªÔK¡p–ë 1ÄÎß}›…_Ëœô¬ë«Œª6½ÀP¬S¦+b匠¢@ÛFAùN?:̹ӧRðD¡ÿÕ¢›þõ­º“SFš*¾¤°°-È—=9ÁïW¼1y2êfŠæ8í-±ûŸorj­þ–RØÏ.rc?¦>Œ–p™d—váÂôôÿ?o%N¥7äJ59¯mµ:jëe-¨GBJ6áê;?g‡¯—UŠFh™y>½¿Jä¯T3ÈQ±ëþ£¦]J, ÙË$kÝ‚íqױީ%×¹šr”¹SÐìî.lmœ%Âüås÷¨®B+‰eLÜn8ùÈ$ûÑUʺ‚ˆ–—ÛA)ER»É=ùäqíUžæ9ŸÍ†C»œ¬ü,ðáI­ùVRž}+i3ˆÏ%Šàù­iRM¹5+Â1÷N…­a¹ÒŒ¡BÏ»%˜ôäþ5V6 8fé€Èj”‡&9!°1ë[6÷Pª–Tت0I¢\ÐÑB*jå Û«‰¥û1Ç•F-׎ÿJ|rLJg,„äsǶh½(%3¬}>÷9ëLIbC°V| ÆÚm' ½èh™¹¤O¦-¸’Ú\Ô¿Sõ­Uò¤>jº/1‚?¥rèš‚$­ ÄqáFÍ­íž1QÙ;Ü‹U¼•J’¾[£5Ç<,fÜ£;þ,q«-#(ØëòJDÛB®Ç_Ö¸•Ô.Vì-ÞYCn“,WÞ»0îƒabàq–®6K#{4——,!_<£î:cü}*ðŽ)ÉHx•+«nµnm(€nvƒÐU¬’âþ(‹¯+¸ ãqô§M%½¼,ˆ2€Ã>õ~×P²@«md€Ve^¡Åt6â¯8Ù•ï,®l[dŒëÉœg§jÛŠÊYB­³È$à‚಑õíW”½äQHoåPÁ¹“¯j²m/ZÆo³HA“åTQŒ€NpOL×ñ7I;&RN*é˜Övéqtd™d’Uë€_ÏúWI£Ûtòš3¸”çŒv®6ãLÔÛZŽ-¤…U1½OçœúsÒº­S†/.ÂyDRĸÈçÿJœ\déóEßúò'šéÙííÖåwùÔ@·¥sO,pË.¡äÊ$ß–M§œôükeõ¨]„…ˆÎ@ÏZtWöš“ýº6 Œã>™è~™®zn¥6å$ÿà›r…¶¹ô>qµ02Œ”'$Æ«ÞI$© ð+I(pvޏî?_Ò—TÒ#±¸_²—ftÀäôô¦@Ÿt±Ünc"d•túŸJêRŒ½è}Å*nÅË„›ÔÄ]$#)€yïŸÂ¨]ÅûPQŸ–3ÍhØivmx×ÊñÏ»2l)'žWñ­»ÝÖðÅ"ª˜$d‘éQR¼(É&ËeÌù–ç1ŸmªZ5¬É•ÆúzVmÄsèòǦÊ®7ÏÞ¾•µ6×ò@¶îQg9RqßôëQj¦ ÆIÑKí 3€+Zu5³Ûr*{Òæ‰†×¶ÎÇyd#ŒsE@Ú#;I³ÑŠíý×ó^§aa™ïRuV °œqœÕ{]5Þß+b[oséN¹i£™°…vŒ—UíÐÖþ…f5 k«¥Aó0Ù´àÎjç/gdE•ýã ¤¹g"ÌÏ€¼útõ«0é7on&,¡‰acδ$±–Âe˜ÆKFÄ–_J/®ã¸!T»à0èEs:²Ó‘ho§³ -íÄ’ç`ùG–¡³¿Ê­4qiPæê(Ì›±¸Æ'°îiö·Í Da”ñžhº–mBÿÏŸËòá$Äáúõ¬œå-'±¯%¤­×¹[Ïubâ-só19cF¡d²ê×39È^ tÏ­+Eu%Òí€ùùœ‘øU›9EÓµ©>dq¯ÎÉûÒ¿.¨ÑÁ>ÎßÖ„‹,Áw";<‡j‚qSRøƒK°ƒD2c›ÌYwd¹<ý3WešÛìá"`óž dqÞ°®ôÛ™ç2M(X•zsù ˆYM;Ú߉I9½L{›h® uÁ&1‘Ï"£³Ò®§Ó&¼Ÿ/#crdç®\±ŒD·,q¦ÜHÝÏ?¥A ¬¾Cù‘ƒmUú|Ýþµ×õ†©s"i$Ê:N¡e§B‘\ÛKÆBäãg3×ük·´›Ì"M̨ÚqÀ®lÙXÝê².Ã,jrÌʸÏå[[´sFWvÄn8?ç5çbÜ*j®›6ŒyUžÆœÖæá®“¦öÉãÐg úV©¢K|óGåFF0Ûyý:÷§I®‹Yîã+;T…9§55Ž«¶É!Xv*ž~¿Ö¹¡ôŸ:'•_C–»ŽîÊâ+o1X+aNÒ¤öÇZ¿ö³¦[ª\v\²•ǯ_Jvª·—šª¬g}²á¸P@çùÒ^Z-ʆlºžýkÓSRQçùâÕì‹f±w¬IÜJ‘õŠ2\y=+nÅ-¯o$ŽXÁaÈùy#¥dè°Z•‰!€Àðd;öïÖ¬_\K¥L“Æáeqã¶ã­MJmSVìiOÝ…›ÔÛh­4¡¾RŸ;<ûjO´˜ãV‘ÑKð7ÈW{w­È³†ˆ4XÄd½WÔ¯nµ{¶…¥Ø 9¡¶{“ZG §ª=VþF J÷îY¿¹¹þÔ‘²HÜåÔýå#ƒíŠ¡o©MÈŠNFvóÛ=?Õ‰'˜™'bYB³¹qü¿•S1¬Ð”‘Á!ЉçƒÅz4éÂÖbr”uC®#¸pÌîK•<j+cH±’K/ÝAlÈ€ÒòÇô¢‰b!Ëm„©Ôj÷2­îåv‘•zŒ­uzEôÚs qù*£ZâÄ Ëû°X€ªzsÐÕû{ØePŽpŠ73gèjkRºÑ§ÆÝN›R™$)*0xJä€:×-ar%¹&Qµ9·³É0’ëÉú{VµŠÁ4±Ép©ûÃÔõ¬¨òòÉ$’/àÏuç¹Hâ¬qzž]]^GqÙp¥Ldœ0íŽÂ¡¶†,\Ë&×XòrOqÖ¦°¹òwO!$¹ÀééPÛZÇ¡¿"•‘­qwfYí'X`+c—õ¡#¶··Ì¬q€'×9+È÷óF¶Èbxe=Á©½=œÉc-¿îË€®I ¯~ßAS,<¥wÔË™SÜ衳X„s*în§ñëW ½¶6²Fø!’ØÈ_Ò¡»kSiY•`á±ù×­ëq1:}ª£ädþ#éô¬0ðwk §,cw¸ÍW]}BE‚¶Ù­ïT]¤Œ„…¶ºŒòØ©D{È‘cË7óõÿ>µ~ÎÎÙ.cûR ‚~`~öEzÞå(Ù-‰IËD÷'ðÕâH²$óÄ^Ù }½k£þÕKdF’HÔ;lŒô'>ÕÊë“ØÛÈÉngƒò¿OJa½–þD{¸÷K÷cXÎ8ö÷®:˜eYûM“%Ë—ÜnìÑÕî>Ô³°_4ô!G_ò1OÒî”iñ†„ÆÃ*A9ã5_H´ºÍ'–Lˆ'œòN}vÒÓ•}Øã‘´sQ>E ìtSÞåËN ŒgÐûÒjðE§Z›§vh÷á‡^=x¤/ämu;ë&8ÅAªê1Ih™<ÄwäÓü湡:ŠÛ7Ô"¹1EçṲ́0Êž¿Q¸’[èŒÓ\ù…À'#…Çoª"ÞMÒoÆx œ~Ö¬A¦Ü>ý¶²€[åV<ò3‚;WjІ·"<²Ü̸’çö+…ÝÈ쾟^Ôíf366.@$g~{fœb[ FX®U£  08lñøuæ ½uÜfŒ‚ýŒy⺾%ÉߨÕ8òóßUº7-,ŒŽ®ï÷l|ÃÒ¢Ö4Ûz‹hë"ç‚O¥dÄn!·IZfUs‘Í\™ßÊŽd-&ã·ß#§õ¬y%Š\Æs’qI­FI5Ô åÁx!Aü!ñÏçEuÚT6X¢¤)1<³ÈÝè®ycb›\¿‘Åœ½½„·ZSDùóCRªx4¶z…¤²M@F¨3‘Œžã5»nM¬iѵgiùËÉ¥í õ ü}Oô­g+Å­šVwEA¯]y#ìñ‚Ç«„Ȳn#2hÈË<£žzozl·ÓØF›#ƒÜzVݽ…½ÇúD–àM*‚À¶qÇ¿J- én ºŒçÍ­ãBÎò vùñœ‘þEKµëÊ·-•üªr6ŒãŒVì²iö€,ލÆIþµZMZÞ(ÝÑÔ'L`r{`ÐëN_ NˆÂ+vQ¸½V–8 ¶•nÞÞ@ÅO=‡Ú ‰Ë’PîrF=?J¢J;O,2‡šE<1å8ìjÿ‡þÝ5ß“q41ƒb·ñSøzU5Éh»XÊU–º…ȼhær‰ÙiCœdcÓµsrÄæïcDz]ÅŠãöµëVºuŠA&b‰.×eã?ZâµÝ=î%ExŒœJÄ|£#¯¯áQ…Ä«ÚÖ]Ȧ·D.¯m¼)ã<~JmôË·˜¤`qÇ­!‚æ5@Óù„<ÔgNkÛÈ–iVÉý샸Ý+TÕîÞ…»Æ:#:×N›[¹0ZFÆ@rÒ…Þ·ôöÃRŒ^dDÊãðük Ð¿³¾Ç,zlxŽ*N1¸ŒdûÒÉ«[ܰ¼nÅŠŸ¡ôúÖu«ÎQqŠÓñ0‚\×c/!ûE³Æ&0î£$Vª·Z{ÛˆnÌ‘¿ÞÝ÷¾¼•©vñÍ;”r1•<æ°®­e‰ãÓ´è>öI?/µrácg¯Ýcµ¦µL–mi."h …ÀbǯÖ6Ò]RvDÞ‹ÇŒíÿ ͶÒuDŠIbµ&8FAsŒjë¼3q ¾˜ᥟ–ã©ÿ ßãF›özŠ3œ÷ZŽÓü?l×"K’Æ8ˆÚ˜Àsêkf\F­QYºœšÌk „díPNP¤Ò–ºv2ÆÀF1žkÎ~Ò¦­Ž¤lîÎ{U{é]®.Ê[•ãÊzôÍR"+³åˆ ØaÀõ«¤‘µÜÆGÖB¿–Àá±B©ä{潊P¼C5ZÎÍÞ—Àäyq¯'üqXΦÕöb0Kxü«§·Ó5 «Hä#â^ª3þë\Ö¡ ìs=½àÚ3÷Ý#>• 6ù[¹¼çNQ×rüšÜ‚B±Àð"€UûÜp:QZ+g,ñG$1…VAž£'ך+/iAhÒ2Q«m áZ(’h”1²¨jÆ_ý"#´`¯ô«–¥eHæváÁàþuW]·‰í¾ß30û:vŽH,+4çÊÑ•Ò(ë¶ñ^I·f s¹Xmöëž+SD·—Q°If$JƒÈ8¬AªyJÙ¢– ùõ#¥u>™fÑÁbUŽ8®š‰ªv}íx37RÑRGù•6)Î×ä}kšÕ­îÜÆ‘¤^Vü)Ï'ßé]¶¡¥Úµ“ˆî%2‘Ÿ3~ã»éÓ?…qNgƒ)vÀܧÊIèOáOÌï±·4gVU¶±žW?g@'^Jär=©D)w¸vE€c*Á¿¥mi;¡'î¬|±R2G¿KRÕ¶êP´ˆ^{Úºyç)´‘‹¦’»ØØ¿i¯lã²V’8‚à…nX_Z~—bÖâ9‹8ÏVç¿ö¬KmFK‹¯4Ý41’0Ž¥u1H³¢²ËæQÓò¬9#Ê×ÐËÔU-Ò1æÜX2øŒžÕ—V`³««2¸O_­lÞéÌ& 8 I8ÍeI’ß6Ë´ç4.T­ÔÖ Éù ’çNŽQdøŠ^>vݳÜ^j…個O¶º‰—t¥š\zäcñ«-oqp<˜¤1(»c“ß“{jÖî¨g20SÎxÕÑw{ê*ÔÒ÷”t,èóN×uq&älýî zq[ÒhböHµ ™\DÊ’?»Û§µsñ]¤v1D?×ç1Œ ôük¨B–e„2pb8Vœô¬ëûE+Åy¬â‘r}NÎÖÍ‚¸w ò¡<þ5Ь,í"¾’Lr?–=è´h®Ú_6'Ts¹Yˆ ¨«­i·Ž ¨pN?:áQ/u÷Ôî^î«©™¨K2Äo”Š…Š“Ã+GVw…ÝÞ8Øâ(Ðíž„ã¯ã]ÜŽ.¢€<)òǃì*=BÝÞîÖIá €‚YI*9àþz×]Š1Ö'=e)Ék¡=–‡k¾.ˆ’y²X–ëì+"ûNÝù)„ppknææ%/ ‘†PÈźéY\K"ˆÄ…¥ “éǽgFUœ›T‘ÕéÀШVmÁ7²÷±Zx§ÕæF&,8“ϸô§ÛØ\±ó’¢®Ò$` â¹À³6¿Íp>~V vǧ¢¾k>†R|=ÎÒŸ:0ñáTôhªK4‘-T²¯©ÅÄèJú#µNH,5&™Qü“mÀfn ô©õk˜¯c}+`etß'ƒþq\:¤¥«¡y Ý}ÅM¡j%ÚÛgÜܾIÇN¾Â½o©¥yÅìyN¢ºæF¼ºBZØ`Ncîn1Bj­–§sa4bÉÇÎvðÙïž}ªÖ£5½ü-l÷UW¡þµ›ivî<ÅP>P¼ƒœu#µkE7í5eËF­¢6d¿‘'.Iiî`¼ ‚ <ÝÏ5̬0Û›¦})dO=UÖ>ù­iE²;~j1'¨ÿ&¹fýš÷wgj³ÜʲÓ&€¼ŒÊx!{;šmÖ“ ƶïwu¬Í°à)ÛÀ÷äþ•­6éЩTgŒ±Á5…±Ûê%aw÷Ï¥])Îw•õ±”áÒd÷y܂ތù›±¦éwMo2I¸ðô?ãW¯%{«_!I‰·sƒÓ§ygå[ì]ûÏ< ºOZB¨Ôodv‰ªÛ^«À›c¸î“×>•\XËö“¶ÙÉ ¸³'È?ưt‹¸¡vuHÇÊí¸’çð®«LñÚCZ4dȉ¸óÔ{W.&ƒn+Ba7îõ3.PÚ@Ï<¾^ÝN¹¬>ßûM¥s;Jà÷íÐûÖ¯Š%”[° !nYÀùv?Xð­” § ‚C;±ä8<Þ”déÐu:²çU·ÊÌ«Í1vÅ<0D‹·™¸|Ä‚xSPjP­ýåŒv̦WûêOD$çñ®“W·ÓÒÜý¦VTµO.{YPèvÂæ «WhÌ,NÐr9ë×Ú,G»Í'ÞÀ£Ï²ír_° :ŠÑ˜lüÇ9ϵX>»•dcÔÚ?­]tY<–ûØ=ýzV~¢·>phÈTO¼Ä×4gÎýíΙë¢15{û˜¦E7dáCs·èøUè£vˆ©ZP@Ø àñ銬Ööš…ÀÉÝà÷»äÕk ãö|ÌÁ¤W#’3ÓÓµztÔ\l–Ç%u4õf†¯·Ó„i! + IýÐ=ª‡‡¤–ÓVygH¸ùß‘ŽßŽ?*®âçV•„1gËÎHЧ “Éñ®†êhãIÆ@¯:¼9ºqF°JQLæ.,Éå¢`clŸ˜sÎ=(°’âεǒ¦po\ÖýÅÝ´q˜®Þ=¡w2?9¤–_6ÙRÚ)Œ)#ú~­"R§ÿ äŠÕá¿[» Õ¿n!/„Œ.ÖP@ÏþµmÙO²ÒÜE ªÁù1ÓÉ\[Áö“o; “h;£ã‡­Ûy8£L³R¯N<ªÛ?ò®‰ui¬ä‚8oO–$lÆã?{ÛéºTаmûWšËò³?°õ1}tâÐKÄ`Àœ– Ÿþ½PÿHÓ®)3dŒp Ã)SåædâÝÑÛ4±GóI"*ç‚[ŒÖn¥zZ6HH˜!°ØÍd^HÒ°™ç-ƒ€éÓQîk˜™W–ÝÏ<ö¥O £i^æêIêÉlÖ;†ØXFÌvìäçŽMM{ás±°ùãwÚñ–€‹=qQÙ$VS$܉r=~•Ò.¤nâÈÛ"ðÛ”~•¥J“§.hìgRÕH̉cµ³Ž?/ „p‡ž8Ïk>Ù&»ÔR DR±È%cæp¯=ñØSõ+©ãYÖ)œ€2œ¥TÐ/ÛOšW¸…esó Œ{zUR¦ùe>¤Ô|¯‘[énY¡–#ê ®lAòÄ›D–ãl™P§­mAvŸaŠN :†eÏ<ÖeäñBrc«·(«È=3ÿë®X¹^ĹJJÌ‚h"ܹŽÜd5 Š“¿˜’1SЮ{zÑZ«.¦EKÛÑh|¬Èãælà~tBîùZ(Ûøwf·otøn¡–WgV‹%vŸjæ£vy”3MvR³M¡­¬·«#yâ<. ãwÒµ´Khåš16âcRÀuQìO¯"™x¾tq™›OÒ­hdÒ 'k.O×=j+Tn›}EÛCD[YØØ"," à –$úZÍÒµMFÞÕíšg…\’ŽWéž™­u' íúÖ>·q"…U “Óé\´$ÛqîoÈš,éš¶§¹¾2Ìw’;A÷ÈäÔZ®‹k”ŠM¤áqœþ5v ™`³¶òÛß'>ÕWij¼RE"à±dþ¼e7;\ŨêÎz–ÂñdGdlír©’¿LÖÜþ ³B¥ÒNŸ˜‚;}MrÆGK¦PÇnüië Ü£+’6 ‚:ô®Ê”!6¥3(T’MDÓ‚æÖëPYÙÝØ±F㮵t†èÜmcQŒ¢~•Ã@vÝ‚ûÿmý®T´ØÀlsø ÇA]XÒ”ïÙjæ(oµ,(‚àa›åþ³K ˜™wˆØr àþ´ûxI–å†eÆÜûf´&HÜ(ÝÜú×êÙrt:c -NvÊög’w»ËgiÊàÓõ‰` Wï9ÊZÔÔ<¥›hß»9®Ry^Yá‰Û*8ñ®Ê-U|ÉXÆIÁY²k^ädÉ€¿:ETS[w>Õzså»W-ƒŽÕ•óåf’pÇò­Sr»èi+Å[©«¦³gr[y¬hºsŸñ­XKhÌâ%`ëó©¯z´™¡xÙ@éÐŽ8­¯]Kmh¾QÛæpHíô®Z´ù§næJn% ™fºó ±ìB¤G†Êæ²oD‰?’ä¡ÇÌÀdý+BÞy.-'Y[pFAíUaÇÚ•åk¢Ÿ»uØ™7-o¹{NÔ®m%Ø’yöêœoàçëZÿÛ3ÙÊße1€O<{¥fgÁ&ž÷2¹ë´â­ølyÚAI>aóŽ}3\õ9lä–Ìi½Œ‹}rKt1ˆ×q+œü£ÒŠGUŽy£B*H@ŠÝ›ה›>çÿÙÿÛC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;ÿÛC  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ÿÀÿ"ÿÄÿÄD !1AQ"a2qB#‘¡±ÁRÑ3bráð$Cñ4S‚cs’¢Â%&²ÿÄÿÄ4!1A"Q2aq#B‘¡ð3±ÁÑábrñÿÚ ?üÝ•™=$’;VGMlÎT÷¯bY@$;±£A3I'¥*’ P±aÔµQz"µ¤`oélIçGeާòòúeIF4d B2ENXÇ+XÊ©c­õ8ÅÁEŽäPRÚK„U-„©˜¬#‡'÷¨ÙÔ]Å®#È–0WG󦓕QšÄè­o#6HU4Ç´Ètí²(w D.N1ŽzzŽÿ)žéVRÜï€W9®’vº^A·Ò Î?J<`‰q(MŸÚªË¶âÕj”CÂ’aHÆvÍ<²0Ç~zÀ@4§éëÇïxÇ5Î9˜žå‹‰=Í4Ž„9ñÅb ô\†bN­}(-¤‘«ŠÔž…»Jv ýë’D÷ c×2]X¾•Çj‹yWÓâ%,ÔÕ˜Þkçß!9ûÕ«+p‘»Õ ”7%$,G¦Ù¢!fq:à“«ƒ^ÜŸÊ?©«H;ŸŠÔºù˜úV@õHGö£Ul¨¶yÐÃ(P läv4ga".~¡Þ¦~¶™¬‹ÌåËœŒóV£uzeI#¿Šö@Âûƒ´…‹œèýY<Óú†01Æ+ ª#›Ú¾ÎÛÿ:ýÆQ>¡¨<2g¹SZôrÏ+ßÍ©¸X‘ó²È £E#HUÊžæ´X˜VÄÚj,Aö¯d…æ]ý£ ýè¡U9ÔÝèO6NçÅÜðH¼£L©é±ûy£ÄVU$ãí@†”)L”>(w7+k4~Dîw6· ,k.q†Îçï_:•M-$ljWO½†åMÜ2M8–#ÊU#¯@?Z‘\ü¸Ê4rz’oîZhÑŽyÕŠÍ›HȲ¸È#Ó“Ú¬Á”,0sæ¾+ˆ´¶§‡^ã•w3)(U±ý+,‚IT¡ð4¶;DÈwÉûTX¤kßøn¥ŽBÅnߩݰÕ-„žžæFu~G4¬ž.@IRFѧu £|ŸÂéRÎøbkPÝFHðN —S&}6êIS–5*¡ F ˆCÄ$2¾H?5;¨Î±\G#þƒ‚GƒV-,½ýL vÍ%Õ:wæUŒdgû·¨É³âÄQd·¹&(åV$gÜTŽªÚQ!‡mÉø¬›+Ô¸ ¨U•¶aÀ§ä³’êOQÓÝŒq];T ݉-Q~™ ‰õ§úU¨\ÎÃÛ€8ù¤Ó¤ÈDd¡FNb*¥¬>Ÿ±”‡o|TžC©Øî?Æ5;¯`y X*¤öâ‰mctÁ?4ÜJFS#œýëœZ?BrŸŠãm.{N¨ÛÈ<×?*†\ïŠï¯¬mï‘’í5(n?ÍKºèݧBn.™Ö?Ò¥‰Õð<×KÆòUP)îK—›œi@!±Š§•'A7$qšÔ®½Nq•ŠF?HQ¿Üš¦m¡²¶[%e,ìi<‘ÂW³ë}Ä*oö“‡M‰!if-‚4‘Wº'Té¶ë=K§ÀìƒÛ?¢ ýÇù¤$@•ƒÞ‡°¹™#€'¹àTـȄ9Ô©‰ÐŸ¢Á|?RWFR§l|V§ºGd†ÅFé•§O[RêΉaß4Úà©×Ì>%j^«bÌõ£  3áŽá‡Š$QâRÙÀÆ>ô̇O#5Ìç ÖÑ=B ž¡ä pX’äVä¢;b•iˆïŠÐ´.Gqš÷3‰Ÿ-ÁÚHz*•8`w>7¥¥Ó4yÇÎ’Šîh%Æ}¹ß4Á×q닟]Ë`ªwnæŽn‘SoSÖëÔÁÎ¥;cÕÈýé%?0~?Ì}î—@ÂäÖe¸”§¼…_4¤R0Û€h¯p¦IÚy¬à€Vº,¢Xt€„’ÔQŒ`äTÙ‰7¦Ä1à)Ú±o$°©iI;ñæ©w¸ÉØND¨uF0*BÍsk8?„y-ÈÔĆPÜqKÜNªŒÀåÍW„Ô‹BÈž§Q·šèÆËlø­u Ól«@HÁÇé©KˆÀ*›9Ûš`Fú}fRu95YP"ýϘ¢ÀH%¥©jc¤Z®iPFPâ™é½*iOæ."+ÅaÉóUa4à r*<ÙÂÚÕäßÉå[RìiVµž! Ϊù€ +ÏŠe¤:;w§þ Þ€Ó‹PCå³Û¯ éFg\®àþõÔϦ×X‚¾ÚŸýQ ©ƒ ™6ç¦ÌÐjõ¤ùso‘ðÜŠža‰!÷Å$C³pþunáÙ¤)¸Å-­cˆ {ÖãÊõ¹ˆÉ1Yzí’GfF‰¶l¶{ «ÆG‰ý»â·7P¸Š5x-Ëiú°sš­ŽOò™3ã[¹F˦Ah5*G¹¢_uK[õÜL¸ÿH;šç.úÅåÌdʦÕeõ€iF­9ïÍyÊ;;¦‘[9PʹBùŽÃã¶J#©í‡M[Oâˇœž1²Õ ÃN;žsXŒ2º³3žE¢Ô éÎOjå;—ki×\kŒq“ê½?òW£IîCþ*§Hÿˆ@ÔÜyªWPÚMméM¾7SÜŠVQ€Ó¸ªNbøÀ÷$þŸ†Bé¹™d¸g‰t¡¡uùµ”JWIÎßÚº¸cüÞ–a±ˆùñ\ïIéÏqz…¾‘¾+­ú@P~ø¬òÙ€;……Z§©s^ᣆ+"6Cíc¦V1£¾ÕÎ|š”"Q¹äJÄeŽh¤\®ÿôתµx« g“ñSf> µ61ß·ŠO¬©k!Î'> R‹N5Ï ÔN·Ô=)#‚%Õq¦á²"²·Ö¥ŸHÔíÅó©ÇÓmšYpIúTÚ C×ä·‘æ "mµ§é5 ¨ßMÔz‰˜çJì‹àUøügwûu v7BU~¥sÕ'2»iD;F¿æˆ1:nje„w¡+œï°®Ÿ Ç#Á+ÊQÈ:F–Î>)¹Ä>½ôBD£b­¬iÎ6ª9T8Ôy¤á…ÁÕÁÀÍib”ê!†Iß;â¢sÎ4'¸áoh8Üx¡HìÚ>õðØÉ$k Æ„ è¼zë‰FTž(û¬aFÁv¯²ÏI¯OSnh>3ƒ½½ãïÜV•1¸WÊ {÷SDÄPé'œžõ¹tÈÁìEoPQžÔµÔá£Ò¼Õ¼‰…uÁlY2«ØgŠçn晤(’qÚªuI¤y¡·Œj|yíSz±·1I«w8?Ü`þ`ˆzGQ€-³ÔÔëð2ÀšÃHdŒc Ó±J?/† Å8û¡˜2„Rê)lBzŠveÇoŠBÝ‚Je÷.t¾?½Qžà$R4Lc T´½žPé+d¾Gkȃ£+zÄç&¶!$åw§-¢W·ó4òÁD`Bvg–êtxíYH¡W37s¸­J NFÄïŠAT53²;gŠX•Ï·÷šb&l“½%4f7Ö¾wµ?ØÅNs­ôËÌ.-Pˆ\îúŠ^;¸A4äǤîq»üUÆênVE¸€*iý^*d’‡Ò§µu±äÉÆŒÓµ~ ÿ9"HcŠhŠ ÑÜM'¸€ù¦TŽL2|Šhzn‡;ÂÜM”¶îC™&f1îIØc½2Ý=íbÔl» °©¨¡ô5Êre;F|Sú—1†;•ç"‰²‘×Sqáf!“lÓJ Ñõ 4Д@ñ(cñÚ‚òˆœ%‰äÒËrê§Ï( ÊGÓÜWØ ³1#±Í{õDF5¦¶–F’6Þ°TÜ 7¥¨Êš þ®T Ó¸$ñLH²[ÂTžÌ;|$Vñ^¿§ é” ‘ÏÕö?☘` ê3Æ¡—^qš£©{o¡–A†ÃoÞ”‹§ºLx7Æt“Šé,:qEGóJÊPlG*µns~tÈËç8Ï4xzEÀÓ®2Ê×l–ªØõ÷­]ÈÆÃ‚E%¼¶÷0^„åÓ¥´i§r4 ˜ ) ê$¶ôÔç:â&T/ÛjÎI…ÜågwQ²ÐRéB Hè3ØWA'Kb7ΑŸ¦•S€ªÓ*u•‰¸/)&‡oRݼ~Ÿ‘UB䉕•†FüÔƒI*xíEµ¼{Èã?Tmßíâ±ñ†Ú÷=.*+¦:±ÆwjÆ’šC®>H¯­®mïbBtü7cEE—aAFBŸíRÙSFz¬XŒášHähq,qçnÄy¢ r¹9Œ<Fç©=²ƒ4 À±úN ñB-´'´!©ŸÓϳ;“^ª¦¦Ø H G4+ ¤¿,©4óž?:Öä(ÆtŽÞ+M©£7Urª :8ÊÔ ÷VF!²Kák ½ŸÓ³Ò@.j °©EG_sƒâŸ„îÌñ™µµ\mžÝ굿G±”p’9s[µµOË«l8Þ¨Ao)SŽ9Æ)YsŸF£— ÖâcðïI‘Èü©B?R9£ÅaH”ËnGµs–l’j…º"ï|ñRî šyå`N8ÅN¹]ÉVmA|KQô½`òÈ}ÌKYµÁp’3{Î"‰èJììþEÌ'ÓúŽùj¦ÅlÅñ`nGëwïs&%S’I2ßÛ:9ªÙ¹¹crà•ØZx£A•ÛcŠéc*ˆH™K1c ɯH•,0wÆÕÔô ×6pÒA€Gý=«•ݘ 8Þ±Ñú‘é]@\©$VEÿR÷œþ?ÍŒp—/‰úD‹ê{É Šù Vf(Ü$°Çqo x$VÿÞôÑ”¸á¶Æü×Ï0eÔëY D^XY]×l~ŸŠR!¦`Òv;íT 9rã:OšNáA&=a|¶i˜Íê¿©àHÇÒlŽìx¤å2Äþí8c‘’švw·¨‘JcT:‰é»V·xC‡ŒìïUZãWÌbÐ –€a˜àîÕ‰l仉÷Q£ ¯ÕV0LNã‹ £[È᱑†Å$ç7p6ÉwvwÀ¥ÛRŽã¿íH‚^V_MÉÍt¥Ök7u®vYY VEÈ)æ­ñò–»sïÍ[ËIYC¾Ù'š¿–9.Ê=5Èâ’¸³Ž{¥*þ™ {XS o-´RË&‘•Ï^Ïp¡P$’`4ðBÐl2{ ö©ðȉ½mŽÒjŒb@  0oŸÞ¹ùÃ)Üp¢&]›Nží·j³¨UAÏ$S3¨>ößšMYÉoO­‚Ãj¢"\(f¢Ž)IGß’i›k@fÔ¨=é‹;5HÉ’jE†5eŒ–ÆØ¯3zRAê­ÑJƒÜœRS[,‡ThCjÈߊ¸žœñ„ÁLüÐ^à-§$ó–ïIäf%kŠ) Ü!,GÕÛÿEl²û•výñ÷£ÝÍ ³ºÈÆ©¦Ê[•oËÄL€§é¢U ùƒ¿¾†Ò2òÞîåŠäúœ“_ܝܯ£t„rйÒúWZN¡ ê0¹…ÔáÈSÛŠRü2’’ñJbÉÉ^w«ñ6<ÅŽÿ0[eNKþ’m¥â­³,Q¬hÇ^OÜÖß28%² šR;Im®}@mb*œúM¥÷Öâ«rÄjNšÃhP«€{š‚Òxß4{€MÀÒŽÔ0‘Gž+TêhʇgiçšÝŽYF´ÏÇ"º<™8År]*ìÙu4•aöi “ß5ÑÛß%ÜšP1?m‡ï\Ÿ3ù, Jp·×q–›WÔã(YÓ‚0E{ùfäã„‚OP§'€ç"¥D¨òÀhFÝõvßàÑ!™@Á#~sHzSFq"ÈÛPÅ}°läæ™ñ‚;žä*RY"Ô4†¼Óm,à;(Ï“CŠÝïßÓÀäW¶#òòzòGë7ø¤¢ìîaÊFM²7°\ÞÛ΄úoü)GÒGåUQÕ"\¤r)‘ `¢ýKÜP/òò @I+<Ö¶A‘º‰9æ‚ͤèÃ/?5—”˜Z69f½†}2|Ehîd¼ÍGsFv"ˆ“ã!œQ·;Q.eHàÝY€Ü* Éñ[Ž)-õ)œã½‚P¬t¯¼yg»õs3‚½êW )ŒÊN Î6ßÅMši¤ú¤cñšîÿþ¶¼V¿é²Änï 0:Ç‘ó\SF±2¬í‡Õ‚o½}ŒøÝA8Ù²3LZKs ‰°1Œë·ü+Ma)™½GIx=³\×å@(ÈÀn0j§á›¥¶ºš&“E)ïŠO˜>LMǸÜKÄs¶r¥G»Ž)WÀmk¸>;×¶Î%ãcÆkl«ÿnõó}ËTñÔ ÉÜŒ9¬é$…Îs½ðb¾@ªÄŸ·¨aÀƒ1(Èÿ5™Ó!@ÜQd¸D\³~)i.W«çÈæµA0”“»Îü®G5%Ü–!G¸U“,çLxÜòG5íï"˜†„œw]ó] ÜÇ>¡áOUH`uW¨«Õ‘àŠÄo¨ê”±âŽÑMXþ^iäú0*,ö¶÷,uF3ØTN©…5\Tÿйé•~^ÔÄ7­ “ÁñNCÄÄ@À‰Ç64«ÀT¶+W´34R/¹N64"rvþUÖœ6Ñ©_ðùSÔ‰úcb?¥[/ª }É5¡ÚI“u¸S”Q溋.y¦UFÂ6@¬Äún?ÔÀ±"ë¸(ÙÞí\d• Òþc‹O¤È#$÷£ØXÍu65LOn?2@ r¿c]Lµ0ÛªªéfçÍL¼RÇs Ü÷¥ôßÉ)’CüFÛÙ>í#câ1Xý`r 4 Z(ÿè“·Ø×!Õœò2”`u2¤—Ýw¢©mC?μÝ6iùóY/©°6ù¤eCÅŽó¯dûKö¡+0úN>õô“í÷45 ¡ ¬Q»0$¨Ü×0ÒÍ5ÃÈf9ÁÕn¥v-ìäÉa¤9¨ÊÌÚW&­ñ€ZM“õê34葟[ÓåENüñy1?ÔªTn†A—Ô•Žq¾iãÑzN¶i44…}ƪ1¨ü˜³ÏÙ¡!Æ<™ Üs]wáËQK>ÐÛ'ÆÍ1ž`v\þ•ßô{SoÓaLc+©³óCäñïÜ0}Æ¡ mÞ‹¤‘ŽkauU3_T ¿>jަ( ñ€+^–¡“°¯žUõ ù¡<žü18­¹íÏ()cÔ„ñØÖs±Æ06Å|òädíŠR$äÏæævæ‡ê0ŽäoÞ¾’E ôø \´0¢ÌϤ/aÞ½ a=pìcßÎô­ÓÌkuP¼j;šÌs=ÍÂåDqžÝÍgªõìP)]R7д`Иæ¡-­Xjw:Øòi.²œ”|šA:·PWÕª<Úh²ušM Ìg#ùQŒn¬ÏwldQ¶1´U‡’Hæ½R¬F’JžØ­I¾»‘Øöªf\)+Þ§LƒÖ…äÓ]-Ì+4m©XdmŠÎ úëSAûUîKêV†á†O¤yÿÍJHÉmŽë¶+¦˜ªÆÒ2ìŠI¨@¥ÝàœâŒ2ƒOš³BA¸œê k¸£¡bA8$ìh¶ð<‘`ä<Ó*`¶µ§…'cX¸ºer=/o8SÅ4³´lĄ̀r¹âšŠdS¤ô°•gCé°ãŽãö¡¤wʱiÝ« Ø£ÞÄriT.•cš@‡çÈÙª”Ö% Ü#µaì•\ª–'Àâ±@ÔÆ¡\ŸÓœj¿N…æp‡é5¾Ò¤>挕ª)¶mK¡wD“q¹m–K-7¬«Î–äW;ÔºêY¾î×ìjÜÝCøl 0Ç|RòJ÷PkH·;ö¤.GSbeÜeÖnl?…:™•OsîþuÔôî£g|¥c%_(ûåï-n&q”QôóN¬NÈ‹ÖÜb"#‹0¹P£:¨ÞÖû昃 $jSÞ ‹i$D“".KvcL!¸DÕ¤×=‰£Ž+Íw ÷­lˆÎc8bĖѹ`òj-¬s(ü—>[#bsFx^Q®Dw'l3f±¨iÅø3Û»‹82ZdÆEIŸ«ôõOr“öªOaƒÝhcA›¢Ø$zÊ dŒíMGÆ?UÍ"‡s›¿¾õµ­ t¨}KûT6ºWQbqÀ8 Uî§-¬±ÉÍŒ‘ª7ÒT4­Ü½*ùäÃ3lYcÜÿÜvp°P>¦Œƒ.ɦˆ'V¹ NÀx¸ª¶7׳³1•}1‚ A½Dº±¸µd2ÆtH2Ž7 > Z°_I‘ûNyÂp°Ï; lOzr®TäçnôOtöW 2’èÉ*ç|~“ýÅÑã# ñZ[yÜ:¢’YJç ç|€~Ò¯ŒûŠÚõAt2i3¬š§ôkpº¤U 2wÀ?5ó~&ÉãY¨ø÷‘µk¦þxçŒÝJ³B»„Óß÷íK|¸H,L.5}ldá³é“ˆÏš”öFwÈliæ»+þ› õ˜·›!åY6*jÇá'ÈÞ’ú—惒•³SÔ _¦I¬ÐLÙqŽæ­ÊÅ!6ÆÕ(ôéúL—WP÷ íFfÉ#Ôc¤c'½P®Ü”ê?å¡?4¬d8Á£DÊ€±}˜á†)`ØM$esÜ×Ò±>ØÏ»±íBVãÈQƒê}NÓ¥êõ13¸öGÿñP_¬^\)ÐÞ’“ôÇ·õ§/Í{'«¬¬­±c¸4•Í‘³X¬üÀ byÎñW`\ ´çd z[–F$æ«ÇuUGÒÛ éI-½*2 dôÉdÄ‘IŒœcë¤Å©G‘¸{¢VÌ’ (¾iéÑ‚Ï (ù¦í¬.ZçLsÇÇzêfê6±²‰âŒs¹¤>vÅAÇ.âßRoá o­%–Öx˜ÚÈ¥†FÈÞGÞ»8UePÀìpqÞ¤ÃÔ¬æ1̤ô“ƒü©«'/nLlFž[Åq|¦9¹eXÔ"ñ;: ¨'$Sî:{…,YwÞŸ´×—õ>® l£hx™C)|TŠå ®ÈtdÈ¢ŠPaxô²€ÁÁØŠ1UŠ=(\ÿ:óJåÊ öŸÚ¾„™nòIÜ©l‹&xê>öÀcíãF–ѰC¤¾/8]h¬yñÚµBŸsv&‡gs1Üà ,Nq.üñPgDú› Y·Á®›ÕüÚ²²ûSb{Ôˆ$–bÑÆÀƒÞº¾5äLgÑH%C$ŠÇ´Bâk˜K¨l£÷GòNÖáÔñ³f¦ºImì—†ØÞ®N$"ÌX¾»IB¼gl×C1F‹` vâ¹ÈT+úƒRé5j RX´úÇ?l`ÔžjÔ£±6ZI¡`H8ǵX·ŒHš<ážõ Çèγ÷Ÿ¹ªv׋s:¯ÐÃ’jB¢³R¤0 :Qxî+dÆùÇS*‹aFÄí‘B™‚¦ˆó)FDâφ؆R§fès0 aµy­²Ül1«òùfœ–Œ–S¾F(’º´1Ë jÁø¢õKFK’À™ÜÒ3ÜÆ!¡êÉÇjîcâÈ8ÉZÕ(OPÊ #"äÑ #ÚCçšMµz˜ ‘óT ô"\û3iÔ.-îsm&Œìr2ìiØÊò¤3˜ †‘vÛÎ*[0,tÏz¡Ó É=ÊÜÝFR gIعÿjɃ,‚(„Ò™ÙYªKn²£Ô6ßjj(Q[SRv8Ûj›o"èOjç·aN2–SüMcón7ܯì;ŸtÙÙßùPn#µ”e‘ goïAŠå "à©ÎŸŠ4¨ª¸*I>9  U ˜fV+ Ÿí^þ`F©»q¿55bpT¼"çOšaç¶W£Ôc²æ´ãþó@މcÀ@dVôsûÒAÞwB€K ²ïŒöªÁô9eR?æ s·7¶ˆC!ÀS'qñ¸¥#ªµÌ\™¶•_Qwǧ•ÍœÂX‘J0à«Å_‡Å|9Àn¿2gÎ Hîm:Rª7œRÒ‘Ëw;Ÿš÷ßµ 4î+²Hɹ”šhþ—e¶kMw&½`àƒ‘ŽEdÃ&Nvÿ5¨,®.d ,äœmÛïD@ìÏÝ Öt/Å>˜/Ï¥/_ÒßÕCuÀº’Ûàcƒ_žÅ—MÆ‚—Wƒõãˆü¨ÿJo¢þ"~›ÔeN îöÓE±’渾O„ŽKbÿOþKñæ ó¹gV]ˆÏɯ °K œÇ$qÉ™"e]|W ¯©w¹ Œ¬´o©ã[ELMhGn¤`;ÖõGjv=Ûj^K¸‰Ùƒc‚»ÐF#Ô$¦À&ùš]¢Ì˧b|Ð¥˜i¦Ã|ÒuÍ#E²—cË·oµW‹zž–eK{hótèÄžãzÉdð•…\Þ3Qc¹’f-+—cݩȗ†'mµPq×fzˆžN§ÎÕ*F?éßúÕyÁ*Td)Ÿ56xŠ :¾ž~jŒ'ó2äþ¡Óšù@dŸÔ**ôùÍÚÛº2>wÈày® qÆæ·„vVO5Zæd'25ÏbHà‰bÕPüÓöñ£úroƒI²Dð9ª–¡$UÊææm\¼}@45#‚FÃ5>å™—##ŒU)! üMŽ5.àeŠpw©°Ñ07q##3{¹ñæ¼¹PeMCeZòDd`\ó^HÙuÁ8Æ*êØ©ç?X)T÷ÉÉàQc†8Ô"}dd“þ+ÒB(ßú6,@çö£'QhžÌùó#~ÔX”–Ú²¦8Ñž_j“ÉíB²¼iÏ´ª·´®xù Ù#\…¡(Ô0sâ‹2 ‹Ó c¹ŒÇ©™²78Ú¹ë¯Äó¤î‰l€ìH;Ð.,™O×ÔŸ.UÇÜÏ[é—"/VZ.]TnŸµsŒ;Õ·üU~"Xâù?Þ¥\ÝÍy)–vp®¿Ž¹TS9YÝ­e^“ij$,çÝþÕA¤°UÀÐNqD8LÞ·$ë:Sr6‘•&œv>Ô’ 5™XjŸ^Ìc£iðqœVc‘â´ËH¥ò@$ÓPX–÷1Ô{潞TÒË“Z¥LñyºæŸ\ó+}h¬`ˆéI±&›¶ }¬=ÙãÄVÄ.à 8ªJÔJ=AX%\“ÆîE6ï­$ÒFø"˜”;¹ÎʽÍyp"{bŽrHíXöžä©§ÛôénB8ôºñ]½£fþàEMé=68¥tÌ’yìµ` $â½›(cB)¿Â[9þƱ*9ß8ûѰµkœœx4€`ˆ ‡;ñYx]»ñG՜ᴟšô9àÖòŒŠ¬Nvï£Ésp×áe<*Œ ±4Ó|4¸WLå€nqF¬A±=BìÈ×ÓfBqƒ¸«kêÒÊ0FGj=壤޺ÊÿWý46g ¥†¡Tb ÔñÖ%+é’5Ô“çûVò¯2ç·þâ±1OvØѬ[•ÕÁÑ@W9àŠö„ƒ’oÍ#{yæßn)3{ï÷)ÇÅQñ–]D.P­/,Ê€Ûæž@!¼æ¹d¹‘›mªÇN™¤` oÜy©òá*.=2‡2œQŒj;íŠZð8pì™Pv=Å8ÅSâ³(FÿZZÆÌÛˆm—ùÒó¼ãÛÅYÔ!WäqSRuf*ý¸ª1!'”:£Ò%hú‚+ÙJšèTÎø®@»Å0¸‡$ÆsƒTú_\i¥ôn‚©cíq°ÏÍ|,ßaãçQõ1þ§aQ†7s¤BÚ›þÞõoní/æÚL,‡èäc°"­õ{“N æØý‡5Ó}Æ{žÕ¸)G©ìàr$w.ÃÕíº„~œäÛÈFÚßcþõa-½ÃE!Üwù­ÇnÀ{€Ïšò42M¥›Q ø¢DT&ºˆfcW7 :ÀjÇj~H½U¤6FàlEyvÛoA’-i¾Wz[°õÉ#¦Éy8ÊC“»}ëªé½;òÖñÅ#z“(÷9¬ô«1g€J?ªè±¬~¡9ÏqRçÌÍõB Ü›q¼¡±Å) ÛSê•Ä‹¨i9‘krÓÛ¡çƒ^K¨L¤‰BÑbHã’hSÞ ±©ŽØâ†°"ìó¬l’Ìvñ^â/pB~b—É> `ôŽ)øÅ‰o4›)'`ñZW(vbTo¤Ö•±BÔz8A`ýÎûÖRÒwÑíeŽ.ÝH £ÒbkÑ:´Äd‡c’8 (ÕQ}2Üf%'|oCr€†‘øðihbe%ä;žFx _ݤ1:¶ÍnFõBZ†ã—½Ç,¦QiêýʾYX±ÆrO5.Ö+råTl<Ó×Ytö»•É)À“DØ~ô7qŽl“(£z‹¥\äðØ®OñgUTÏNË6s+çúPn¿JÐí£13rääñP0óÈN wîk¡âxLÏ$‹.PG”'t½é‰pø ¤E3c¸ú[÷íI!µ…ˆôÚCŒåŽ)«H&Ï ÆÂ9#ƒÈ4‰‚F@d±Æ‘ÍtÅö5¹[§u›u šÝžÙ·hÎãî<»galÒG¹ cÞ¬+¼n±¬cê4­ôã–<¢V×4Æ]?ˆGqLÊܘÃ&æç€ºaüâ–*ÊÀ1߸¢~h¹$&Ÿ4,™æTàòsX‡sTÜçºÇS„Ý~Sy{68µ¯ªìpŽ2Mtÿý9Ò½_PDå»åèVÝ6Ó]Õ´…ÔBþ¢yB?ܽ|ŒA8¯¨xò*5,šp¨ªíMi!Œ"€íþ¡^ªB¬},…ì ­ú§N$ýéLìc˜“¸¥Ä²YÀneŒéB`q\õïRéwó–’G†eöê*k«ººµ[gKÂ="0Á?j废Oõ!Al¢4—pÅwaVx…I¶ÌC#SÈ,"õ½Â4daž3î U›+k%*-UJ/$œ’~jOOé†(–Üri´U±¸Â}M¹æ”–$ž [“%;H±6ŸqÜwޤ̲DÞâH=êì½:8U¥k¥QÈÜÔÉÞ#Ÿs‘Á«ÄÃÖâò-Å#r7ß릴všfŠWB0±û×9îý1Ÿ5o¡Ê¦ÒX‹ ju ß ZÜ^1F¥ÔžåJ”?Q—®4Xõ­2™Ý¢lÿCK ±SûRKq¦!ÔW,áFìJ;”â¼·¼–i-I÷HaƒŸµm$Ðá€Þ¹k¹Ëä©)¤êÛ±®¦^5ßL·q¥æ{îh²`â¶:ŽÇ”ÄÆ¥d‘Ë/*v­TÀÁ£Á5ym ,ͯ çïY.SÞÄäœàý5?*5š–Q2¡+¹mØÓ¡+"²ƒ¶Øì)v¿‰%I0Utñó^ZÞ/8öÌ ÿµ4–ýQ.­w´‰¦¸x¦_`÷žâ›—§Á0ш¤ž+ ZÜh1Îáñ±¦=cBçsÂç­É³rS µ¸†U‡Ô>$–òÊÞ¬Pißé« éÐE)aŒ’rsOžž¦ ?ÆÕåÊF¤í“‰¨¥‡K[ˆƒLWj~˦Á(3šbÂ2è`C Ž{Ó*€1l »üщ#äbNàdC‡#µS­@ïýkë©–Ù=Y_Jýª{uÙA.Š;dîhÖç‘ uYŠÇ¥=ò}8ÏLr`áœþ¬mCŽà ‰«nØäšñßQg“Þ£vf2üX‚ìÃçÛ¹Îûãµx_L¥ù¥…ÒúÚI8b±4ÇZ‚Äàæƒ‰&QÄû„ž6É;)ç(TĬ Ôÿê'µk_¨€ã89É ¢dã+«4bêŒÏØÁ_À%\éPÎ rC§úW¢ÈûóÁñ]ƒcI÷ÅJ»².ì ÊìGj»ÆÊPÄdÆXNp8# Û9Í•l°`é«MÓã¸Ra8=K½é³ZHF´'ZêcÌŒk܃T£øfK8™Þk}S„b2u2*HÈÈ:rjæ--Xè!Ò¤o溋[GÓêH4²«—çqçÎåXÒ—pž‚êM©çÐã´q1ð7#4Ú‘¸é$ŒçŠ ÕÃÅ‚užkš‰¡0Üð¬Q„`“㊷>“;g9útðfùXšÆ7í_XÛÇs «â˜ ÈÁ¨ÌV¿™…YWÍ,€Ñ Ǩ«ƒòhÆ-T€wì æ¾’sWÃFàö¤bhA7<’áЕÁÛ¹ïò+åKˇd ×'°Ó³†Y#ý9Ø8· Ýן5‡ëêgS‘üS,íÒæKrWIÔà­{×%c~Ά)9)®ÊùíÖñíC«’cÎû× zZÀ×>£˜Ú7þ{ø¯¤ðYF>'ùˆò’O¯úzÆǦpÛ»TÂ"Õí ö5rÎàÝ!†@5(Ü›w Á+ÆT䜩+¦¤ôdd\QÈ$ $b·HÄ”9Qæ´ ¡PS$÷j4PMw2G êf`  ;ƒW7m—©V8Æ^FáE9-Ã-§§jš ~IÙ¤ûÿµ ©²Ûé±·!­â8wýÇîOø¢ÛÌ³ÛÆ4dFp«šC’@>£‘EdÖˆä%ÜgjÊårçâºkûî-@Ô‹Êšw¼ o¤åYÈWìnyð2ôu пÞtà°õíIÉŒò¿*{W{ÒºµUˆµ¬¹eÝŒ2ýÅ~hbcæö¤ÜÑúmŸTYÅÕ«=¾“T ½#Êñqå£L‹ª±;ÿÅÇ'á»™N¨ÀmþõÁ¤ò(W‰ÜyS]œ]A¤é¦×¨H.VU(ò ¤Éa¾„!Jõ(Æj_ŒHPïr³Œ¹»¨;vº¸·:îäXÛÉâ±TÛm…{,ªˆbÓ¥[°=«8XÂ#62=¤ÿj2?Œlâc"ÝÕIVÙ4U.¨ bx¬[Jr’T }¨ò¢9ßÇÍ ±º2† VX½Û2ïJ\ÂÇH\a«ó-ÀÁÄj7SÞ˜ˆ†•‘`î6¬¡¸‹ÄçƒØ¹öéçë1Åžúqæž¾M ¶þT™oPj 5céóNG,· Te#ö˜ÉNôݤaJŒKÛÇéªÈIlö#µ7¥‹£&?Ö¤È}C'Q¢ÇÒ%›žÝéI¡,¹#z#»Œ{r5cšË—s¾f”ŠA˜§ReÔ„±ßíY„¥´äâ±qÿ8+g'zeb1ÄIÍ_ !qf|‘`q‘š,†8æ¶± ã‘D”hE÷ø¤3ú„t .#Ô$‹¨)ÈÏšX©ˆrrE‡‘½Íù©}W¬Û[GÔ—†#…¦bVcÄn/+.5¶‹uN¡,‹ù{T!sïcú¾ÅF–}BJ±$ËœdÔ‘D­¶~ƺXØ'Ô Èȧ!äLçYÁzÎ*á„7ÕÆ{Ò“Ú¡É ªW 2fÆDNÙý9•‡šì¬:ü±¤g:”¥·+ö®-£1·š­•Zï¶Â‘äâ\€\ŒÄXŠíEK°Ü üoF“¦L—ÈÏŽõå‹Ìúœ•’ÕƒT†¢%H-ŸB—8QÀ§#&25ˆ•‡Øy¢i÷mÈ®{;•]Ç#bÒ(+ÿŠ£–)ƒ¦¥Bì„3n :—j}¿§Tì&£¨G {PýZ_U;aV‘¹]·+‘‘÷¥á¬‹àÕåAÜðܦ²¬Ò®Tƒæ¨@ŠFžý©.â— *~vj¡€}¹ÔïûÆ j ÄP¦ÒÌv☌áô¶<æ²ÑF¢qóIŒqaj…ƒ¸¯%›@Æ6¢Irˆ0ãæ†Òzûi?Ñg¹§rt÷Nd(±äV¬lÚ[3Æ£ƒæš6*ĹȦ"ÌpRG?Ö§þv6”,cQòx¡Ý°‘V}DšZЯªKÅy¹¹3Ô%¸0ã9ý¨kÏáp23^ ¢Š3–ËcK$äݬ…€0E()74¼¹‹²àŸ°Ú«YÙÃr¹gÕ£…ι8§˜\¬÷0}«¸°‹òèÊì¥ÉÆ@íQy_@!ã,l͉`ÚŒÑãЃ¾ôx‚á‹<Ð' NTԊרîVj&ñd±^$d ·&´K®ÛŸŠ$P·Õý*¢hn×sÆ€!É=·Í+pÇéQûÓŒܺȈ’Ã#â—f`oÌIWSÇ Š`Œ 9<.¥í±¥ä ©¨çÚ˜¦æÜRA¾qºù¡¬ÚæF|…FànEFÔp»vóK10Ï_aNÕn ”eêSÝ9ôGÿW$RÑê–õ}LŸväù§míÍ“ Böû‘·íJþz(géê~Ÿ4ÄiD_#wwžb®Nt‚üÔÙÝ+,™`àŒÔË®µoùÆ3Z,¯Î¦bþT6üGvWD+J8 Hsš¥¦qÃ,QLë wÈ;Òw7R4­Æ ÛSRöòÆ­¤)ÈÉÜ|QK¡_H–W;ès¶<ƒWŒ §ó™­Ï$†Y˜3;?VNE0ÈPG«‚?o½xÖÞѤ>ƒúµðhq¨XHÙá‡ÎÅO\Д+åÜ9aâ•»# Xä¦à2iÅ0ÄÚnŒýG8ÒrOi Ø*Ñ‚Ï4iW@E»Wpm$¶áŠéP>œZ—¯2¹þbº)ãI,LªÀàc"¥IÆH Šz0ª bbR_ $ÃÅ…6w¦­@†XäFö>Ù©s'£&’N;U{Hì=kà#·ÿíŽCññóNÈ .¢ñòf£,Âkip·Q©]S©Áÿ;Ku¹$ËèÛ®†I¥añ÷ÉÿÒn_ /×úû5ÐÞl(À¦ÿ\Ëà·3ãc±ðiU#Üig, 1ÒAU0^%d«ÈÓô idHLmõçç$Ðîç:ý1¶NÙ©½.õ®-:¿3Ãú—±ªZ,ÌœK±5ÀÈ¡–¼<+œù"‚â%P0ÈA;SVÖ‘Ü™59Ðö¬…0œ.ÆÆôEŒ˜a÷©ÝÉ£ È1‹¨=Hr¬6ÜTXîȇK¨+ƒçÍ_³+ùLž{ y ¦‚…ÁÇcØÐáÈ1’ MѨ‡N¹²zlÀê8ÕóVlÝýw$ã¶k½¶žÜzr‚­¯H>~ßòõ©-ftr¯l óW¶;»“äNGS«žõ-SÔ•‚øßšZÛ­ÃtTðs?½s]ªÚÉÑMÁ"ƒ„@}żb€:•¸·³x™¡7ñ‚NÚÆÌ>ù¢\,W”’”X=Φç©++ap~*Eå÷NŠ,Ï,h?«zá¿ÝN:œ–ÂåÝ#ÆwÆMI I÷OÉ«qø\”1nâŽ~&€úOÓîÖ‡©¨aÁ¤Šòn±5¹VGvŠpÅ[p<í\ «èe–ÝÄ‘9Fò)Ÿÿ=7 yŒ=OУêé<ÊÕ·¸šy˜çSs\Ïáéߨ\—‘WøK–ÆÛ×HÎH Wrv"¹~F1ø‰Õñò‹ÈÌ5ô‹jû CÇqZ°™Š1v'¸¬Éon‘œdã½Ò0˜ êŠvR[¨Â7pÄ,„&²÷ìÚcE`ň;ñMF‘Fæ@'Å)<Üìð1Þ§‘ƒ|¤yX­ñ`Žbµ;*Ãé*à0™ ŽT12±R0H<|Ðííe‚ZrAò>j²T€SUj7ch¨v ¾ÿ¼»¾»Žæ6AˆÈà X^ÜÀ£L§íÍ5ù»v·cppé¸}t .L.aרôQþb2ÎK åvâ¶BÄ0k¹üYÔ%s ¨[dO´e¿!Ö-e‘ÈÓË5̬Ǔ☟ô÷c÷5rgÍÝ ÝµºÍ.¦±G[XãL`žøS¹©ýÊKKm¦”Êѯ¹‰ÎýÅT@‘8HÔk#7Ås²}X¨7PìЙˆýÒ£»ž>+Jì‰Ý8\n+q̉'¾@ÌOò¯&Aå}T›$Ô˜»H%BÑ€sŒgŒVîOA}%%ß=…/*˦2Tößk‰ãÉ#Ê@D<6¶šDà?Âú‘™xô×,<Òè²^ÝQÛHÙuæ]¤¹QîÉÛWÅ6Ë q*Æ¡§#m…}"¹E FÀ©9Æ “ï­=[ˆCÄ=Ëþ¡BºU¾´ C®ã=ªÁ»„/©zm&¹ÇêQÉÔ¤’%Ó ìóTafmÔ›(qG‰8úv5[¤»Yô랣Çð`ùr7?°¤ï­]1* œöïMõWHß§)ÌVˆ5㼇v?ãö§¶èEîKʱ-¸;0=é˱N®˜Øã>Í%3.HAÏÑlî=6ÁÙÁø>kÎ-MBÆÔEǯúˆK­‰`ñ^Øt»¾´†yt¬1·¤úN’ÿ©‹fcÎdqØWpm´A¤'(ÆäT™0ÐÊñ«d$·RrÚ„R«l¢(ÈhûàFüŒ—=>kgM¦·lÓ±$°0rNÄìiÍ(gLaÆ0y©NFck* BNèÝ-¬à–ßV_#S“Œ!«0ú@þôFYާØ&>¡ÅyŠ?ÒK‚;V±,ÜŒP¢„‹ue+\úÑÊv(v­Þ[4–¾“0Îxª²þ^Yn ?§œV×·LR< Û“âšë]BâƒûÅmÞD‰cf,S¿šr ¤';ƃ#€ÌYtØ PãvËã;ŒPd_r•6*V`¬á öe…Ù#KxÁ`À o£\µÊK²··yޝïO[*À–8çöĘ$Úh„¹sŸš Ø'SUG·€iyË!ìÔøe,¤ c HË#/Р’qB€“0¯W¸6Ý6WC†>Õ#渶Ÿ½u½]d»° ‹– QÍH±éœ3BÚ’áW(ØùÍuüB&s<Åfqé÷«n JN’vøªbd—<7ÍJºé—6­‰ádðHØþôßBÿÊ[[hÉ{éKPî_—­@%Xã÷7êÅP&„g“\*õ1[·¸ØÆ¹ö<×XJÖe&Úe~øS¿ò¤dÀP ‹ "Eć4ÌÇÀô•}üšÉHØÐ¨üÆM~kÔQ‡ï^‘—O¨{Š ÄÑ»4¥çQ’ÍqéÕÇûÑpèOYõ+"*Ìuµ8 ´gíR-î%{X\Œ9Ü…íTb*ì7Æ7À¥¸dÜÓ6“í?μC¶ ßœšäÆõèe(z!Ôð‡#,c8Þ”¸r²` È¢8¸5†eŒ6++p€‰‘¢G“Ô'Wbvj —'-“Þ›’ˆXYíRú„s¢lŠÄ¤÷¦.Ì"hOcê¶‘K¡î3 ¶§"¹5¡WSÁVJâ%‚8î¥üÚJªÞå@q“BN¢mH{8L ˜5^|^CêdÇ9í;y i5æ¦^u׊coo`9vÚ£ÃøŠð¸üÂ,ƒ;°4âu˜æÄ—=>)te2›jÁã•ýBæüÁº‹ÌÏ+É<Í–#?j•4†XË¿é;б*Ù_G+Ås5© ’’.µ¸Þ¦7LºXäž ?óamJ;ïÜ~õ^%¹>W'BÉÑ'Öã`254Ò\[¤x8Œ÷9¤ã…ÙT¢–,p®†Ç£=¼ $Ä™YrÅnVUÙ™IêAHÎ ŠÊGsu!ŠÖ'‘€'2q]?B²Vé²Oqêfؤ µja±¸Iã‰A«§ò8’*Ì3„£?7Kye›Ól†]«Ö…âm.¸?Þ¿A½·²½˜Ü5¢zË+c?zMºE¬ƒPµØp}Jòù—Ø©áâƒþiÉÙØ5ÔºTc9ª‘A4@[ÞgBý-žE1yŽŸ*"ÚÊ©[ üRŸ›é·DFÍx§· Z]²nµ¸Ñ4\Ô½J+oáÛ(8¬G5ÄÈ]C.y V…—LþlŠÇ€ñµ<ö¶,ª-ï‘X 0`@Ï‘@Å@Ôbak²GúÄ~·ÔÜø¢ÙG$ÍpÂ@ŒûsÈ¢?I‘ÆRêÞCÇüÌzúŸwm2:Ûz‹ú´0'ûÖX#GsÇ_R{FñB²J¸]Xco È Œg’sŒUž«hÓtÍ+ 08Ó‚*L0¬GøŒuð3À¬Éo£=ñjµ=b5H¤ƒ°ò¡Ã${Ÿ\†Ø> ¿Þ¼Qß³‘÷4¨Gz*ÆýB ÁIPXñ]:G©³úÁØW3ÐÊGÕÐ0ÂÈóŠë’ H# ŠƒÉÿ¸?ˆJhB°ÄXm‰Þ”f] ·Å2uɱ‘_$pÏ…aüé(Ùž{‚“'Š 7Ò#s^Ë4yÀ=‰ »¨@â¶É™dÍ!‹*«8-œ`Pg˜/}¨†þý;ç~ô¬Žê2Xœbã¸U>¸œ¶{ M¤f8ßóÜ%YAñAVyÛDjAÆçÅR«P®„Ó®0,ìqTúu£ÀZGÝÀ&—¶‰WJØ6Õe#sà2KÈ}E–&O½˜™ÐêÓAø5©i2 ‰ y­õ˜ ý?YÞ§%«CœžhqësÞ®Fºé˜¤DkÇÕRŽU— +¬0°Rš—}5·P¹[x#-7¸¹«ñenQ9{‰CÓâÊ[ˆÆL,5/k©ü=Ñ!³Ä³ k‚3¿èøû×½#¦žŸbæYcr[9FÈ«vÅK·¹x÷¨¼¿$•*§RŒxÔn?ÓaV0GÅÖhÉ/·Ú±ƵõÜ‘¢ }ÎÄ×ÏmUFâ—WÂ3€Ùb6½9Óæi¢V`=ª{Ƴ\FJ’籪QéD]±é™…w0F¦&•ªLÆI‰@¤œøªË$GRd¯ƒ^E2ɼŠ;`RP•SËõ9«ÎžŽCL¸cÈ'š-´"„XǧÛU »If¨;w©–ëqhZ1 ~¬×E\ºUÏ= ‰E#ÎÆÂ¥ßO=¬ž„*2F­`U‘@¼žFi>¹h—ödG#E*n¬§±¯b®`7PÃû‹BÒÉy–ϸ“Snn`ÀŒ‰$$œvŬo¬q¹%‚àœç5:îÑãÝÆ’çRý³Úºj ƒÙ‡I#®°Kpß"ŸcªfIÔ3Ø÷¤ Ñ/«#íÉßµ8+üD“P•²TüÖ1=TgŠY"m2*äèƒYŽVb€hnçÖ„²ÉîþÜ<Ðd¶bWÑb£œŒW‡þÂEêWw3E!€1Í&--±ïž4? ½5×eôZ8mˉË2÷ýêlÌÔ¨ó]cè4$ ß~5qØ:£C¦Æ;“,lÃr¿Ò¨;t³ÅGKBo#lg œŠµ st¡NòOaæƒ QDCšžÚÚÆå¯.@ðð?ýcx3¨Ïs{’ =¨6 aOu;µžE‚/l0ì£ÏÍÒ4à³3Š<~Æ?%WÆ¿Þ/Jº–s -ô’y¥ý‘ô¼gW|ö®£¦Ë0ºHÞØÜàâ—½xîµÍ è!puwù¬رj(àZ±$Ø[§¬^Q²œäñš ½hþiØB€sÚ¨ô)bº¸šØÄ$Pš‰'læ¯ÃgfOå ûˆÆÕ™s.6<ÅÍDz-¡©Îô¿ÄÖ÷^«E"çb dk¯†rê’G­r2um·ðãE'°P)•Gž1\Ï'&76¢¥Ø±Cì×4×j$›+Œ6©·?ˆÊÎñA’4Ø’y¤¯ú’´Ím* àŸ5<¨-©IÏzv·rV–Z‹ñ Èpë¦{M=ÿÔzÆdsÒØ®t37ÜV^s«wV(ÛÄÄǨ/æZ¿ëQI}!Žx'jdýHËh MXö—Ü}ñS=6!·'8ñ_!NvôÁDŒÇBO½‚úP}VY}Ú½½©´'áfŽE)%Èt$略8ýÀ£ªúˆP’6¯Ù{­ÎEUòh¹*òá¯.Þwúœ Ÿœb€UmÙ5’£l×€‘ãžÕRèP‘¹Œf½e °ú¿µÛFã“ý(–qÁqr‹#zc9$ø¯Bæf§UÐmÒç!Á2Kïsý…P7¢šP¹Ç |Ô¸îag+ŠÁG x­]>¶P£lo\&C“%·¹ô1€³Ø:Ͷ«¨Ã¦­˜ «ˆ· &W½ŽvϺ†‹Nÿjò ‰íPú`é­LÃé£0; ÑK3é`‡É8Í- > ŒžÚ‹íS¥ê“ÝD€ƒbT±oþX9ÛñS¶37mTzeBΠiãš HâLÊ‘ŒâŒ Ñ«Øß íûÐÙ[VXjùñRЏ"‰“z‹-¤>£q>Ñœf“«YÌáÊ6-º“÷ñ4óKÕæŠ@t¨íR#ÄÙäwkµ‡Ã Œ;œìži( NžúÚ+n¡åƒ# ©< qwnT†¾¿ä6¨ðÎÒtÏE½ð¾ dò†œé“˜•l…Ø|P8`•{…3_æu–#·Þ™’dFN¦AÞ¥Á:þ\$7ÁÞ‹#‚…˜é<ýë†Øí·("Y‚«¼šcÆåÉ⹞©ÖnîE±1½ñ»Qïnö1çc¿Š”xäÎ< ¿Ÿff4c¥u&¸!dÿ˜›Z2O¦!pá=øÆ¬vûÓol; É;ó_ZFF$ä5ËqoEfá¶ŠçÌ¡‚ï¤î(°tËHîVH,âÙ‚àŠÜEÆUŽIªºÿIòä ¹ îH꿇mº½¹†pU†é"òµù§Zèw]ôÛܮܣŽyû'%Z‡{Ó­:¬bët™ê\þš<YŦ؋Ɍ8ýç)øG¤˜ 'CÿÈc&“þž?µ{Ó/e¶ê×sHÉ1;ó§Æ÷Šì=(Ö3(…ÀŠäXzмт9>E,‘œ°oí¯Ä„bA–\¡J¸ ŠÐœÇ#c_b3]×sPÜù@Ó_BÁ% ‘ûV=)=F9ªäÒ‹0 ;Öw<Ç[”Ìž“sí4C0eÆFj åóÌ qÉ¥­§™$ „¶{V‘q#0 :…,4Àcã¥muGa¿zräjŒ:ò9ù¨ßMS­õe DUý;ˆ}#€Wé?5æàDÆ"¬XsŽÕ]t¹ö®šÌÖÑÈu:øÆH昌ýºˆÏŒ8´‘â„Ü’`Õ¯Ãhу«d£ãjnʬnŒó¾#Úôn©h¹õíðbGÞšr‚ü}IBYh"_Th[Çg9Ð^u¸m@þ#ñ€x¬AÕm/­Ø\Ø.k˜ÖMMï í“]šE¢žÞƒBiËÀc᳚õžê:ì¥2[b6¥'G6r(+rȈAúQãt•´g»ø­¢'¤^±dg´yWë|yê Vªñ†;ýë­ŸLÐ0ß‚ Ck)Ž©¾aæ®Ã…¨—@O)9¡\d¡+LÛ#\?§š¥N ¿ÇV\öÄV©ˆí”€O4ÆÊ‚ŒÏL°KXœH=C&Äüx©Ðt;ë¢Ò[9HÁ8!ðJø#½^Éô#lË^nJ 㜊PÉG¹¬ŠjýAZ[Çn¯Bvb£?ûQðçS¸Îv¯-ää/(9àÅnår…Q´÷Û½-˜Þሠ»HWÜÚUjön£B=PÃý$f•¸@KsÁ©ÒŸM´‘·cMÃnj5–õ· íƒØW½7©4%âg,‡u$ç‹WPíÍ7"`§l÷ïŒDhÇz×QyãD8BX㿊O¡úzåYFøÈ$Sѯ‚u“•`½2¶Ëj¾Ž½l9cÞ³š¦>¹©ŽN~¢‚×øž¡æ:Ï¨ÔÆÙ}Á<æœô˜ãKiR;ó^hELžGžô%Ç® •‹#¿b{׊"-¾v5ƒ2é>ê=® š° ;ï^ësÊ,ÁÃqwj&ÖU†Ì Øù¶×wȪæ_QXà‰`?0#&1¥µ+sZÎñÉdlsÞ³˜î¡q`4f#¹ò%µMÿTd¡?âŠ"¶‘µErˆúeþ£j–¯µ‰VØÖãÕ$ØQœ­Yï–ôEÊ–ö×pÝÄê°ÀêV롸åIÇa\ŸG³’Y}ŽT‚GÅuqin£S ïQyjcq#By5ÌŽtèÐqÍ,Ò“—Ru)ß=é³$npW=ýµð‚)8a¾ø;H¡Ü¢&ùÆsÚ†dÊ•}ð6Çjj{6õù¥Å£–bØÒ8ù¦)Jš€Óª<`<×Ò)hñÇš1@[BìE}*nyñL !‰5­‰Ô1‘ÍÙc·¨S¾¢wɦ¥Òóß ›G³NþHÚ´’zž4D“{ÕNº²[ 85fì§Q"k`ΖVäT+¾›Žde:ÉäVzTfÞîXÁeÔ¿8¦•B¿¸Š(Gñ:«èÌiºû%?Ê¥[™”’AñÚ©™ŒöJ1¿8'⑃ÚÏÎ È>*0h˜@ja!e™œðÞ¤õ¿ÃÓ¯PK‹TÊOõc€Þ~ÕÐŘ4#f]òjÃÄS¿äÌSb-¨÷%Ciµ”VÄ¡@ ìšnÒþÄD!†PÉW}ŨÇ$]>I`ŒK*nˆ{š…Ó!6öQ€#w˾v“š“"|ŠXŸqøÏ#RÛ_ªƒé!r8Ήß©k\Çîc‚TqóQ'½2¸ŠÇnÆCþ*œ~•²¡bÅFÿz•ñ[?þÇŽ+DÒzk ÀÈxšEÆ68‚E‘rŒFÍ3n×}ØpjgQWp bk‘!ôÙ0Gê”7*œb…$SM>pbž3»â‡ssÉ @A–4iF¡ ¥¥Ì^Ë`Œ’ H¹‘.L€ºÛlv¤·ñtî©mqÌ0Ùÿí“ÅP·Al¾IíLø¾#ËóÔ÷7R sMo)BŘi'‘LËrþ‰-±Æô𰉤2œ‡ŠW¬z1[¶F6íVW`ÜŸã ›“!êð"¨tg#lŠÕõÚÜZ«)µŠ)Éôö4IÄ(È$j°ªÞ£8‘¬4MWØãµ=À¶žœ¤iÆœw©pdÜLÚ{.ÛÓRïÕ—Û¤`+wû š„ÄFÀžÙ !‘ˆÆ¡±¥.ï’=w` oÈù¢\[»[³C)YAØŽÂ¥=•ÄK©fs» ö­DSî¸YšMrD÷­4zøïµz#Ò2ëƒØØ+«ÇÍQ{ÔР ÆãƒOOYs·'ÿÛÒ_ù²Œ±ðÔD€#„•kîhwÜ }4GaÛŠXàZÄ3u=¶•$u{G|×¢KX¥1H ©á³YIJ²ÀÀ“Îi“go=¸$øPU?´hIWÖG„…ÏòªÖ}8tÈäoP²“°ñö©¶v¦IN¥ö.Ú«Ü–IdÁa‚3À©ó¾Âƒ¯s åúˆWž@v%¶ÁúªStŽ¡ëz’”b^©›i%½ÒpõÁ¦^1 Öî 7*xý«¤™>0Š|aû›¥·Ü»6Ûœþô;¸DÈUÀ\÷{tw}S–\€ÜZ–Bt!l 󱥃ÄÙ‹e )Q[\^£{ú‡ÍÜæ8G©!ÝÙ{W·Ú´¶ƒ‚Û+= #l.\©.Ä Ïaɪ?ÈMÌ_ÔÒneÈŒ$ãž)èýD…K6¼çJZÄí„’dƒ‘ŠbîQd2éöœóH}Ò‰Y4±­Ë¶5dü÷¯¹>œ±‚7Ë©ÆjFˆ´dãVø¥f‘"y JukÜccó^ I+0ñÊñ2*\¶Ü«y> 'zÚÕcX?ˆÛyíKÃxeFãc&žE–9¶#Fœ+œ}éJÉË_QXý@Š/ÕûQ?1¶¶rNq€9ÃÃõjÕí8Ú¾ü°EVbp'¿Þ´¸=ÃPˆO9Üdölv¢MÔm­a_ÍI†+£š$Ê€dqƒœˆø®Wª¶®¢ùÎf›& gÉÁ,Ju啳»hÿS7º«ô;[Ž£(šÒ'P„eäýû×=Я®¬î×òö0ÞdÿË–-_Èò+õ; ±}l3å&ÆLµKç¿Â´«ýïÿQ^>GmŸüAMÒút‰­TÉŒé?Ò‰oÒ­:}³-¤m¥ÎX³j&‹&PòžõòÌA Œ ßí_>r9z•€{˜‚ÝHl†‡4Ä ¨4NÓ±=Åy(T:ÆpÜYW]EdŸÅ,’f³#)¤­ààüÖ/ý8­–sÉØã½&Ê…#q_\À·è|ã<- Ÿ¶â•é3š¸d–ëZsóÅ9$za4îÔ)î¥d¶ÒêQ]A~hiq ³öÀð6®’°+­Ê”Ǩ%‹€Ë¤7ô£ˆÆê„»dŽ)–t‘•F;íBWZŽýñAÌ™ë&xt,òsChÔ.Q‰'lžÕ¸•˜ÔmžkÜilï†+׸UHí§P<ŸšO«uKn• FØyŸ…½R)ú[qP¦éPÍqêÝEübÞâÛæ«ÀªÍmÔVf!ieËÚ]2íæ«ÆÊ[Û¾{Ô«4khV%|x¦EÊÏ4gº‘Q&S8)‘À¬™}6â‘KåMÏ ñœ­àׂßs"j[¨Æ@'#Ç2êVšÚX€ZF’ꌜŒošÌv⠰뜕>(•xC?8Cd8ÄS1`1ç> y;UΓl¢1$ ¼ êå<Ì TMY”Çfù]Êæ¹»¹tì»7Åt·òfÚcžF*="{¹‰Ó¥?Ôx ÀÀÍ723*"6ͤñUºU¨*Ó«;dqT-º-¬Þ óµ0Q`Ò"{Y“ÊS¥„ž#(¶3–‰ŽFƼk¨Ô„‘À'Œ÷£ J¶ þU"ç§»ÌÓ 5`çOŠT;}µ)³8¨¹R1€蛀u ZÞmj >áȦ’H´• Œö¡{ŽEnìMÐR²aL[Âc·Xe}c;V°T¨z›?Ÿf¢Ù"HŠ –[…“%cÎ’|ö©-ÃýNs]j'¨¤2æ¹™¢hç•NÚInœ‰¹Îχ€ ̱¸Õ†ûÕë1sv–x£‹õ$M—ÿÅs+¼ži¸.=).¥aÁ̸ù w‰ë¾§J"U%NËÛ5䎑ïìk0Ê×6©.r{[¹†ÚEWŽp„Œà×2·F^;Œ®Í,b´…ˆé_¤òÇ€=dsƒÍÛ©[&Xoš?€µ ­ÕÊÖ3þLû“TL}©µ”°xåÀmÆjŽAV>ÜÔ®î¡Ú5I_TŒ\ÒFÔFèöå„Ý@ý=©Àßlx¯¥‘tNŸ“Sœ}Å’}IB($#PĘTiaôoƒ±Ár;íTnò$2«`ñÚ€ñ‰ˆ}²7ª11þÓoÔöå•b3ž+Ø”©dÁ¯$¸i´ŒàÏzdh#@o¨liû S ç…dBFêQ%—CÏj§$¤¶œ öêZJ4±ˆóÍ·¹ê¸´6Ï3áx<ÍjþÎdPC8ÅWXR(Ã…äR²ÊÒ9%r˜¥ü§–§¤' &~Ƨ] ‘ÿIíV¤D¸ºôÕ‚·z‡sm$SÈ'¨ÚŽZ«ÆÀŰ‹‡ÛŸš Ǩ5gOŶ¦,#³*q¶õEи]Í­â[FbŽ%䓹¯‘Ѥ:ÉVù¡É†Ã•5¡ Ȥ^å H‡v·# pš¼f’¸‘B684Ï嵸8òV½6ÑŒúÀ2ã°ÜPŽ+îæb*2¾IóTm¡.ÚJãHÎÕô°‰ !8'µ8Š [c¾ký åZÜÀT‰} 5dd ׌ήƒÆéŽô)Yœ—„j¶uâë,ªÌªÚô‚ÀÅë“/`g¼%Òn@ìië”4Dú¶Ý«!„äaq’rªv²­ªÛ³m^Ë‘‚…È‚îP·¶‰©Ù?­PiA7lÔødõ@<â–2‹©ÁÎþÑñQÑ;0Ê–ê?)xœzH_=è†R¾3Ž Êet Ÿ‘Ÿ5¢pì[|ñ;‹#ó Û¤†ùßj/©­†­83JFß[•àW±Gלêà|V•¾ •hBÁ‘@9Ü“C¸´YÛŸšñ²{Ö…Ð˹½ 6'…Å} #ã8ÎÔ­á)f 1ØTLÊP°ÈÎæ¡ß7æî2á´|ÓT’w¶NçÃT±&Gé¤/ÕíÞ;˜º#ƒö4òc;üЧÝ3¾F P§sH±´ê÷öÎez¨Nñ·þíT£êvÓ}UVoÐÇTRl6q[–(Ü呚7ÆŒn,,èúmß«Õý5.¼žÕÑë%—Œ×Óneé·q>sq¬ïNÒ㑹ڥ̜j¢Ÿ¸ycÆñÉôžqQúůæãH£]Óps±øªÈÚSYËc±<ÒS–Rý[â’¦¡!£!ÅlmÆ™p<⪠ëx‚ãsÜA–6“,W¹.­×½ •‚ÓKúgÞÇ‚|SGó|ÁE´î#.Tº’@8?Ôz>Öí\ÏEê%-šx—P”¤ž®’Îî+«q*{Hú”ò+ŸŸ ÆH­FrµŠM%¶9¤È2WÅD‹¨^-Ä’ý_<µS¼þBì …8\Ö#·þÅ7]Ï'ï9n«s%´¾´Ù”ÈÜçž·üW%Ô €²¨žZ±øžÑ-ËŠætél¸®¾,XóbÉò3£Øêtë×ú¤Lµuée­]õ)¯£F)¥³ÀÞ¡ØÞ;ܤ3¾PžMt±$:2=¸úŠĘÍñÜÔ%ÇqP³:ã¾’x¬îÈߤE`Ój§süé+ËÔ³B%c¨ RMæp™¥ ÈÙ ¸ïÚ›Š}lPb½Ïšç¥ê“ÌH‰}5=‡5»ùmÁƱ"i=û{`n1?2“:1y&­%vc’sZyÙrIØwÅsÖ½RCpá¡ÛPMTŒÝÊ­ ‰I¸4–ÂTî1X?SÛ…3BTóœ©ÅJ»´¸U'ÕR;®qOÏ/¦Þç(¾MM–w˜n¤ÄÄÓ±AËÆ¨Ï­.f³9VΜás¶iIQõê<ê„VÈãmlÙj œq"%äÊž›åמÔÍis‡Íyùc¨ûi«Ü9 ¸Î ²Ñ¨ÌhÀî5ùB±k'Š8¶ŠXUd@ʽ»æ‰2ŸL~Þ(q2•É©9.Rj bKu>Šsä瓼½¹G!!S§·F,~`ÅÀ'#5õÔ™Ø)òÇ\¨ì\ö뺓¬/®d•b •läcŽ-îã—Ó•¤Àl»Qz5¢†¹’$Öx#â©ß#4ÊFI*ÅG Ôf5b¶d;»/Q[<é%GÍM´?V¬åOº¹• a°±ŒW/{Ã3J¸çÜjo“˜*d¹ñyTp9:JƒŒóŽ+ƒ¡ƒëK%ÓJ r¦ ‰CÎIïNãǸ’CDÊjÓ«9íÅ7Ìc³OaY”(”.ûü×Öý>YdRr›îÞãf]ê뤣#Jrœçš/L€z™uàWOcY]Ä6ǦØ÷gÀ4)º µ›Ôµ!;+r*3äØáqËCYŽØú,ˆÕÁÇ™íý(²qãÍPŠ •˜IÒ85³nZÊ(V9ÅM̆Üqý¤.¥d†Ý$RNFIði ®Bùºf´f„£¨]·¥á_MÕþC½?Uk¸¦ÄÜ‘m ’x—šcíÏè^íMÉjð^>å#;v§V8#¸2ˆs)3Ôi£F…d„—ìH¯>~F;q7iqL²‚Ķ;üUŒ€+®<êÚ´O¡02w\qTB+û[%q¶ü×?1ûc Ä¥ã@/# üW“ZÛ×ó ïPI#lø¦$"9FvÆw ßÈ})5(!H süéJÆÅAîG¾†Kv+GW‘”RNw?5@ÜHÀ¤ŠF8¬ZØÈnŽFŒî{×I»ž­n/= ŠÍ d–ìF){h"ŽMLu/:EQêÒ"–Ëp|TUSK.ûqOBY 4±yÕ¥FàõóÍê„dŽÃjN A Ò;dŽŒÀÊuÛɤ•£¸9ǨàVmz£C>‰µz<çø¯‚Ã:8aƒÍVÄWØhx©S×RÊ‘=¾µbvÉÍfßbØnãµHéÙ†èÈ®é)b‡pǶ?zvÖê[¥(ñzcõ7šñºê=~зwÑ–ÙýÇÚHíæ¶Èc"5ÂÆ eŽ3B{IKÎÔþ³N —0ÈAP3µx!4¨.kqQféÙ,æ’Î#3¢çЇÒCÜܵÕ˃¶xZn?ÅÖ6à­¤¹ÁƬ)+¯ÄqÜ®¹tz§‘àU¸qåPANýû‘dÊ„èËVWKª\áÈl`ö£Ìï3eBã,|W9Ó¦2PälÕ¥Zõ[aÀ¢t£‰ÝÆÄé`š˜àÍ.ј:r¨Ï¨ÎYô§'F“ðöó,c \l `j¡ŒY¸ Š;gy v½yÙòQ¸Íbå—h—Uþ´¼2®¼?)¡oí4(ʶaB°f(ÅA q^ÞGndG` ²ƒµ+ €Ü¨„æ˜XÝ}¤êAœdv¥ô×pzˆ¹Ž9³:sN­ÀVU íaIØÐDÈ@Ò‡;À²{v9âšßiî"S1¶‚Át®œèæ°Í‘‚Å”m‚pE;„hõêUÈÉâ¾YD˜t‘·4°¸²+¨´¢éuaC¸ÅL»éÏq*H 6 ¬v5wÔ¥´•@ç4£ˆ1$6vÍPŽAÔPâŒÊõ¾h±GèÀT`úqŸ¹¤ÓñSIOÌU³#jÅýË´:]AðÕ5¿äæ™,$y\­*™úe‡\µêh’A:»cܧÚÀ÷ÚžŽ}{g8Í~aú](œáœíU:âI­nc·ºÉnÄ)fܧÏÈ®Númqî½J±ù ÄôW ‡J0lŒc5âÆ’N%#ãø™Ö”dhäRVüŠd©-ŒœcÍq®Œs.»ŒB²#¶¬œ‚)È›R‚ÀÜR‘úºö ‚1ßÍDq–ˆ€üïÅ/ܤþ¿$qÉk1bØq·ù©iÚ0Ç=ªoâÞÔEü7—=N$•Æ!*ŠU/º×MU{Û?^ÒŸþcjíbñOÆ Ln7 (‰Ñ*˜˜2wÒ——fÖ.B³é*;ÐíúÝÜyèb>‡Û™2Ãí"hŽ­ˆ /Vûˆþ@:Ç­Kx‚AjbRpºÛš§º”ëfEm R[Ce+M Ñv‰äAò¿[+гoG·UAqªÉÙœh˜â‹£ŸvÞ4Ó*…‚‰W^ÇQb¹TdÜŽN)Ô(ʃޱ‚ƒ¡ÌÉÅc9ßI·²8l œ:j{e+°¨–X6ô” â˜6,A¹µ²õ:pÚ²–~̶26Á4ÄwnÃ7Á¦WlñÏÆM¿b &,!•Xk<Òw«,™Ÿ3REûÞh€1¢ƒæ˜i¤#*SÚ©|§¥‘.06LFf½ˆÉDhN(hΘpHaÁªS³…õjØ %ÂÈp!Mù4*úêªjÖ!Ô&´[~¸ö?¸àÓßý? œªìâcàŒ µÒ£ŽÖÌ3"#žqâ7¥(MsrùmΗBT˜€ïfJ–Ù„ZHRí^Eeê&±œü¥*© C/qX’hmSRqíØRFFèGP”¡™á°¦bÌ=¹;óS®:¡g |Ò2Þ\]¨D8ùÆÔ!g+eÃâ´coB{{ÔËÆÏÒ2r6¯:%ó\ÚHò0/«uÇ>¨ÆÊÏ:#÷ºHæ—²…£eŽ0š÷*µR"œzGõK‹lJBžnsLEˆéôÿ­ Öê4Aõç“‘‘EüâjÃ`c}ø¥±n¡O% X„Óœ†S¿ò¦’u(þ)&šj(Äòx4’6B¹Ù·;ÿš w=(Í40œÉ¶®iYn"Sìlý«Å?µÆB«Ímp– >+Ü@ž¸”èŠÍ2+$¬1•ß"¤Í$sHäý^ X¹Óq•BNÀdmŠuo,W¿š«-E&'8ÓóD²g‹ sèn²9ŒcÁ§´Gó0`J¸<7ø5S~š‹ís×”Iò1Å;8?cÍ}P7®V+&f9` M<Ý…h—A;é¤Qèˆõzþ#É êFºO$|Ö£À%ä¶ÃqYYs¤¨$cšÛH².‡LùÈâ”nPÍQ—Änec ÃP‰ÖÇN“É¥ãoM‚d1¦#µ˜à°<óŠìÏ €ÆLèNµ!¼w¤Ñpc9Á;bŸôK5iíµòÛB+ —$oKNêkêù^„\*?5ìë2¨p§ 0ûÐnaxå':ðsE¶mr–cÇ‘UÐ .BÓ]€ÛaŽ)n¦í²ÊŸ á±ØÕ¬„ǹÔFÄצDbc|imÍsjšWÆ%…”;’£ŠƒÔï®Y`@Ý™»s¨^2—µS Gz^ÎÝ$*º5jþ•f$ ÷1 Ë â Iã0?ýã?jl]é@ ;}oÙàaZ6:vß+=?£¬ÉëK(ôÁÞ¨ù¯&œæñÝZ—©‹+Syp²:º¸:|GgL‚HÛ q *#‚0¨»ýéønLƒ ÇOjäù9r9°(G®."Dê>æ µž)d)Êê9"ªAwùÕUzn(w3$Ò© ¤.# ÏÍ)eêK.£X$Ÿ€³'ÛÔñS,!+«#þßšôÇêÃK¶äV-²@GÐ3’9£[C‘C)ÜoÍ(ØÜEš2¬ a†Æ•u=b/ú- 3–éË1‰ˆàŽpvªè¬ŠLŠÏzjJk“lŒZV÷TnÈ£1àj¾i-“›TwÆlÏoÝEe8fï^Ü®»Qùqô€»ø“êÙ~› $ªH{·š—uy=ΘԔ„lTw?4K•1rq¹©g³Î»œ¾~•þµ’ÊÊW‘â–kAƒß†<Õ9o¡žŠWÆ{K˜‚„ÒÊPožôülBÑ’f@Ç’™ôÞèÄce‰qûÕÂ]õ.¨³:ÿ­Ž6b8ZŸMrJF 8Û’kôÞŸÓcé>ÞÍ@VE¡Û¹¨|ß'áÇÅ{0—"!X3ï£u;šÒ[‰=)]ˆ çš9}11]üÖ-˜ÈA${FE|Íš•’jYulù°epàF)Œ4’²6ÄîfbÑʺY´°ÜW‚®7$~5륣i÷C67îGûW%`÷Ïü ‰aoÕ¥°û×YøŠá?à—AוçˆÞ¸›{“ù‡ñƒ_CàÙÃ_ˆ/KQßø¬zŸñ æÒHõ"›ÿMò¥Ǧ^`ÙõlìvŠñtþÁÆßÏNBÀS‘¸æ‘üIè¬1Ä€,³ŠµíÄj'%Õ˜…×E¾·–&1ÿúÅ:”¸«w–io›ŸM”öýê5…õå„ín$‹àíÅVBÆùqÕ:rj<Ïkˆß÷_¤ÿJ<¡Ž›ý¿ùŒþ'Aiy-Òed׊»e+BÈCó_^ô$óëó±Ç»"{fAòœþã5Ó~[©:LmtìÎÌHÔw œ ÿ#PæÄòÿóÝTéÙûЈɸ¯ˆòFÕ–Y$Lb’¦£*fÒä\ï¶1ñM%ö¦ö¨ýÍ- ’êÉcµ1J‚Œg½4îc†A¤ú| ›ø“¬Ãú4ò+ib˜Sà…=0ô l€Ú¸ÿÄ“Guj–®ºŸV³öh-¬Ì cS‡’À“švØ Å'2²1Bx;SÖ#RçV>*üšYì'ï)!Ô .3^†×íØ|×Èë ¢®sK_Ü~^ Awû …A-B[‘ø-ÅEéK¦(r€ÿ:©±È=D Á *åiþ—„¼¤±lf©ËxÜ— ±j–bÆ 3Žõ§—VcÐÌ6ÜgšÄΑ¶[;òsPՙД`ºBš a‡?ö+>Ù¤PF8`ÚŽFhߙ•$üqJ8èên£Mm ±©$†Óœ(,Ìoª9oÞ½D>ƒu+—zˆ=‡ŠÀOWˆU‹úrhÖ9#“QºÁŽ9{çj»n¬Í†]ù/Í{ukû²©Çš,y8¾â2¯!S–ŽXÑvnyÅIS•þÔK»Qo1XÆï§ÅaŸø«IbHÃŽˆš_QÆØ@GšZ ZÚù%Ò¬ÊÙà ' ³ŠRä²²¹óD¢ÉKšÔ¿?^¶•4ÉhÑ·}±kÖm°t´…|2ïPZtζ;½5j°Ã! +úlazŒGb{•_¨Èàˆ£<÷44´’áµ¹'ï^[áÈÅR‡ LkõiMIúDh»ÜöÞÉP}@"™} v#6‘Æ9£ÙF }%±ÜñIþ!½üµ‰lãQ Ÿ©vÎÖj=Î:Œé#©>˜Â¡ày&2*4j¤g‰˜‘#ˆ9ÈäW‘G‡.äãÆjÚ¡^„ÏÚ9™X±#'~6¯ê1¨»sAº”! ~h$ïžõ¡/s.Õ2{ ûÖÊ:§¨Ž¸­(™ŽL©È£+²ÎÜãÍZž¯q¨u²dIŽÂ³ëIa¤-ÛsCŽî2ÞåÇô£È`u*Û©|Rƒ¹  à¸dô²àƒ@º•%LìÅ#©Ü tF‰)Tb<JÙ¡Yš9pÌœð:›‘œó\¼‡s¥EX×F{,^¢ÆÅuØç½#ufÓØàùªãH%rä ZéÀ4ñ¥cÈA€ŽCTŠÌÁqž{Q%‰—§¬ˆ¿¬{â¼$¦ûPe ŠQŒ« <ñžõÐÙª”æQñš:‡‡üÖ­¡CnÄò‚º„¹ý\QX#6¬`ìzUrDµnÉêÁ8¯zˆÄʬu‘ÿ¸¯mIWP…}ÇrÔ^³‘*°`OŠUÿŠÐ~àHä!'až x2‘¸ÀLƒÕ"žÞOâÀZ'`6ßùÑ _Ë‘ ‰Üb¨Ü¤—P‚Œ -¿$mHªœäœ7Š×pEôºÜ=Ì…Èï@Ž6Œb7ÈÏê9þTlê@Iɑſö®7cÜRVê„0 îîR0Èÿ¤w'ÅKHæžéfš3 éO4y¦QpHvQûÒw}TêôW˜ûAä ·6¯¨€Äáz„÷ 2Al%~®Â”†ÞKy Jr~še3ãV òy¥/z”ê5²ë…ÜÕ(E1dÊ(ÊÑ…@QÎy5èÎ0sœíC±+sMV#¸$qG°býÚÚ4eJG›uXã€ø¦ \Hd#ÙœRª °íæ›â[ä0BÈñ—©éž8›a“œÒZöá–!íýYíY»˜¹*’6 iËx/oé¢ûŸv'l“DAËÜb³ôû7f>“I'lÖbKkQˆ )‹óšv`Xiy ÄÂ7U}:;ç½g2FÌ §Â$móŒ ÎÊB±ìkË™N[NŽÔŒ· §éLD&x™Må™cV¸NÜ×SmÕ¬/ä) äo'd' cÍ~pªÆ=œçàФ€*‚wo>+›Ã\ÌY˜Ü¡Xªê~¶ÑH°–$‚yµb(ÌH[>Ò3šâ:âÉ,ºt–—’É1VÕ c»Œø Üþ)½žDv¹ÒˆÀˆáOÁó\ßÿ›‘__ŸÌhÌìR •¶>ïë^ß\,da€‰–9í_,4B`ª”8$ì3\ŸXë¯ÔÙà·*¶£—ýMSáÀÙöÃ$¼êÓõ'¸õHÜ{Æ+»¢q,O“ö¦ç«•N8Á¯%Ómšmäa”Oòkép Ç¥êI™¹kñ6n&²XÈ—3‘¸ðM)6¢Øêfäë1¬Œ}I :Žry4q.šdb§·ÅP.äÄ“¬ Æ8¢Ò‡u,Þ8£Q³¹ÆûRl šõÜÞ£:)ï:­´VÒXþ¦¨€IÏ#xå1œ•æ½ #eVs–ã½bi jCn¾qS÷¨7p²ÈÍ ¤‚w)g÷+Ç~݆((gùr¨G?4`q›Æ¢“#ÌÄœàâ§ÜÚÊPn@ZB®pIçOc@œŸIÙA$ jŒoSeêH„ìE%4úö?±¢É1™4”TaÜë lŸ©‰ûÕÊٜ¤š§Ú$$h±,ö€ê‰¶ìx¦—Ú0â¶·¸oÎõ¥ÏU¨Áˆ ƒ¸¯®îXB€!'•æº[%ô´ŒIÆäêEšGúØñMµÙláFôŒ€6”F(â6lʇ«$crãÍõ£uw#–ÂvXÉÛOͪ¾KîAâêpL‘ !ohäk1bUi¡rÍ«”‰p¸rdQÔ¯Ôx¤,/µØ¡1’ØÁûÓK6 `fÁƒ4ÜJþ·˜J¤´Gÿé¯bpËœfŸ’XÈ*ø ö"xV Ï 8çI=¾(•ìQ›SÅÈ$Ç5›¦ÙwÆ(•‰Ç·¾iw¹FNN6wfzµP‘Ãpñ1XvlVÚ)cLésô¨Íbߪ¹ §Ú¿Òº%^%q†g ìj|¹ØCP¤jsK|FuÅ "¬G¢®¡[PÎq±¦žÒ92Ƨã½Û¨8Á ö;Ò[*·B¡¨"æ8/£+‘ 0Æ!íÚÔH <Žâ«›prQ†<«2GëÆb”¾–ñE' ¦2ßQ?Ìæ*u)šnÊNÛÖÞ3úMüûY”¸Î0*€ÃÔ%Z)>Ðóª3Ø~n Ûê÷?ñ‰Îk¨éW)t…˜ˆØ4¼üX+ì>ÚÂa£H§…¼§¦x÷ycóñO:‚ú!‘NàžÕôÑúƒã;mÅJs³wŠ:‹KeÙiüT›ëGÛ« !ö°«, ]lrÜšJh‹+ÀpUýËžÆQ¹AÄ¥uÜ纒àÂ!\>Kds_GJ3*zn^0Þ©¼/üØÈ8ÛÁ¬I¥ag~ÎõpËõH[c]/¨ŸÌþFTÕ"Ç•“àv«0„ôÆž ®SðÜ’ÉÔ»Ê1íö®–ILL¥âr¿ÐT>^0¹(Gøî].?¢ØÕÁíÜPn£‘09?Ú‰æ<Ñæ é…Èf¹÷Å£SIÐÁ†yuc5¨i1N±®‘…ÏÈ®’Kum.4êS†ùoQŲµü±¯ü°A$ýóUáÈ,“˜`f'CGo¿ðÕFþq½y¤ÈÀ¯cÅ5xÆi™”)ùÏzMIBHíNCÈ\$PR¥{[mS¤AQ¹Íc«³~h‘‘Ž(ý ’}ÌÆËÞƒÖƒúŠá~ *“óQˆ_û´dÁfÒ¬O‘E½cchdÓ©†µÆ!´ÍõJ5?®^/äã…ÙD®úôç½V |GPó½.¤È¡3–õ$%˜îkin>MFV÷íŒmE±µ’ä…L’{ŽæÆâ[ÿE2ÜÇ·5QÈq&sŠêÀ„œ6øÄgä÷þU>I:•ˆ—ÈÜw¦Ã4“Ò—JÏÞ™K #·{’€ ásÉ'Å0‡pŠØ‰]ÝþU’·Õ;ö=‡š‡wxVFŽ"]åúÜrß⛿“ÓšH’ORyñ$¤¤U‹ÐÑdRŒœ{Aý?5RðÆ¼šJà±¥‡è=#ÓÕœQ‡é~8u 'jÇíY¶ €Îzc´ŒœmÚ ÈåšÌz€B$HlÀÇ·eçÂuEé½FHÊ·º2{Šîmæ*¬®ºXïŒç ~$†ÒèFd˜C($£ûÑajz>ç·Øœø!°F68­€ÌùS¿Ç4rŒW ùÓÞŽ³:0*tžAªÂ! =ÍÇay)ÿ“Ïr1Fº±ž0cˆDœãVäù5¨úÝÊcÖÑŠvÂçþ$$Ò²nGÅ)™ÆÈÔ#aB±†Û äÇ>)™¥ÄŠNàïC݉úhÝÆb*aBv]ŠðÚÆ_ÚF>kR ÒsZIuœL$ˆ!A4g‰n nÞ¾x—é¯NY\­fIaÁ>|ÐY&PŸ,§Zô°xÚ¾1ÜVõ’01š÷#<M.6 ¶ }*‡;ø¡»0Ƕ¼f9ã³½ÏV·3èDÏ>hÖÑ…l¨¡|ýè±¾ŸÕµy®¡â rŒQëÎüŠ0A÷8æ ¢ƒMÄuCoЬÔ©ä¹1 ІÔS, ¶àv†Q-¾kú›@ŠžFN½CqNE!“mŠ\ƒ€hºãp~þ([sQÄ‚9\”ä Ìlаtß QS(¹Œ“‘¸¦‚H.ÀÒy•7&sZœÄ0î0TäsŠ©,2¬ƒ Ôw·U‘˜©¾(W/é².KdãnsVÇ!Ä/QØŒ–,³Ô‚>w Gz—%˜¼)ËÄe‚f|gƒžõ‹hKQ›Ú¼ŠÖ4#°ñ£ù™1°VEAYúcÖ§lmD¾¹Ñ)À;g1-²¨UÁçµ(]YøìY“ØËê/‚OT¾¸R04¹:Ìv¨%—ŒŸñæµgê™ ]Âç^ÁÈÆƒþÕI]Yéu)/U¹X÷‰X¯Ú™N¶ÈC´R)ðE/ÓìM𷍿Mg'#Š5ݰU$ìOÐ1R0ÆZªàVî0nÞvÔë"Ó·ô§¯ZÆF¹Âäc¾õÒÛRãÜ¡·µÇ¢pŠ€²&ÆÇ42Õ›ÇE[Srô}K¦;3BŶÎÍÒ†äñúF¡šæ%éæ6g€G'8]ª?ü6íYD!À}µŠ1â«tßë!*GSº’É”“†\Ȥžf9ì rQõΜºã¸»L¦BV„w®È4=Ó¿ÃL ‘a„Ï‘”Ñ®’H ½I¨ä“R®ºÕšJ=9åFsIÇÔ=xÌWЉU‡*pif‹£ÊN™nmÏå (ñøÊ?]ÆoSw=r(Ô‹Hζ»öý©;½sq9%dçõr… ÚdŠë֌Ƃ¬GÆjÌ"¯§µS…aT—Lb“¸9äýDáK)ÐêÚ½À\õù¯¶X–ÀúWüšÌ¥n­4¹ÏÉÿ”pûošbVt„¨ñšxDZá'äÇõAÚÂ#fˆñ‚¤o½®‰À$QåH4 ~Û”¥qÔ›$cCÓ§‘Š£¢%ÚUd'¸ÜRó¬K’%<i½AeÅJäæ¼a¬wûWÌù; ÔDe†÷jvì; fÄNŒ%“ªŽÓ•ÏzbG~t{|ÔèK5Â6å‰ÀÓ:«ÀIËõ7±Sœfõ.c1‚w&œK`1ˆÖš’ÊæÔ¨ëÕ#VHÅ dº¨Kމ&\êý@›h:tG #_Pƒ±Ø{j4ú!@À-ÀãŠ_Õ|·>kç„NPÈSœÍ#0‹B1˜›Eór¶W8÷vÿj›4Þ¼âYQ¾ÕJö&3zŽ£Oe/Å(Ь¹S!ÆAìj¬d ™3‚fepò’¼¶€8vÿÅ{Ñ.–+ljF=D,GÚ¡"´jTå»Ñ¬îŒ]ÉâÈ¢8Èì ÜÑc‰ak1Þ¡pzµþ˜Ó\6ùøÔ{ÓV±¢JHÆ%OjôÐ:§ml͑繥Åã?S·Èm•ö¬$S[ó9–…£²qŠóFQãÑ2(cƒŸiñ_2é}.0ÑWòˆ(;Ô‘œ`ÑL®¨NÇcŠ€#5²P»P0¸c­Çíe’ÄHˆ>Ù4Çç.m!QÒC¬´a¡Ö ãc½SŠú;¸ Å)j•ñ86D5tsB2Œ&—\ŒYþièâ„€@Îj|q»œì>i¸I‰±¬ç©?iR K+`ŸŠÊ–€sÎ O®OLœ7žÆ›ŠGäc¸ÍNV»‡Ü¬­!ÁŽíZv`L w£±XqA!œq¿šðk…SÂU²rAç™9ô™ Tàêî(0¶úÚ £4~¤l‹‚NõãÞæÅ¢†ÆÇlÖ'Fv!Шç5µlL'·l-Ü£ÆüS7b2èÎZò —€.Ú÷ýûד[HŠ@øSWI·WÛR6Øði®žÄ3’ØÞº çˆ3‘@c9æ•ãö°?½ee2Hƒš¯Ö¢1•'9ÏzNÎ(£—ò1NVn¢@%ªãF±(w=éÅ’Ãe5êÜ”ÂA¼RM÷(e479ÍcR¤)q>©;L,±ªÍÚ„“ µŠÒ?AV0yÇÍaáÒ¦‰l¬#&˜*Z0J÷þô†îœÑI“Ÿ½  lqš¨a`ø)kiDxñÝ{¨“¤€¼DŒpïFåÒi›;{CggBÒÞ©ÈÿjfæâÞVBI3€ƒóšHCШ薖ó[] ts“ÏÚ¢` ²w<#ºY-ðéî»R×h^ ÀCÀÅ?¼Ò—lnlWÆ•t2ƒ«œ)!èÙ•bp$$’IÄBœïXkHåæ&3¹_Ÿ™’ŠvXÏ´ÍhÄË¥”`žMZ¶%q®Asv>8ó1Û¢60Ÿgƒj%†qÆi/Ï„uY¼Šj9‚ç1Ÿ¤RäæO&‘„ 5 x!ÁRvÉÞ©4^¬ ÙwÒ¦0 #O8"šI5 A†FÄTîob µìDú…Ï寀¢3ÆÕ6ÚYŒû6£¸=ÍW»·Šys)9 ¥$lc,A@§5N¼*?R“(tMïaÎ8­‡ŽÉ$BEmÀñ@I}0PNvÕ±^ˆÝÃÈ»É ¢·¸Ö–úlÑÈ¿Ã`+B–oþINO3Xé~œp{Sø XŠðé’èI¥¢Aâ¥âC%¡ÌÍNE¼9,Oly®%š{ÛÇ>ž¶f<ð+©ê:äe}Qg g¤mÐÝß#{Ž‘P¿u‰.ç6ö€ªB1«ûâº[—ù5ΈÒi΄ ª(%eÃ!Ž·ÐkÀY׆óðjUŒ"ÁFx§5´ÑËq¢<8; Þ´Tä:ŽøÖCÁ$íF·Ä«ŸiÎ|Šœ7³ ©¤àêàñ1ìQ€7­1>q…=®2 ±ŠÊ'®§«pgKì;PÖ3n3’ŒsƒÚ³wp¶VæM‰;*ù5ÌÃ5ü½M¦’RŽàí°;bªLEÔu“ R¹ÞÛéHœ°ÜœrkÈå>$vÚ¥ôî¡ù— (\¸cT.&c°|\çÆU¨Æ¹eÉÉc“°Q@i5#bLwÛqAÖTd$œî H¤Óê2é9ìy¢êj;‹Í<º±óŒ|ÖI`Äj½kƒêî¹Çšò€AryÍ4ÔpÈÛj½ÜPgêÂÜ2*zþ‘ØüšÉ¹ žxcµemãCiÖÝ銠~¨—~FMºÿˆÞ«ÏråcEÉ`B­ËÛ°®«ªÜK%—äí f’àiÀõ*ßðïV?‘ý±]Y¡øœìà–¡XßÐŽB1“€*å®0qƒñ@~…ÕH ¤ŠïÀªÐty!Œ™Dj£};š^WR;…‰H“Ý„£Ûç#zÜp TdݳނÎÞS,ªãéCÍí º¯¨ ³p3K ¡4Ç"JÍâdD€ãjÔêbôÙDŠË† àÒ–Ó©‘ §\n}7ߊ{þ‚¨áwÈ-’i,¶ã“8±°èÖÞ•ÂëÔ…DnWÈþÔ½çA¹HË@Þ®?AŸ÷«i PCéÂXãv'¹óDÕ0\ž@Æ{ÐÿQ7 eÒ)Æ ÉdiÔX‚NHÁ°í*01ËŸƒTúßK’xÅÌNL‹õõ5αšîÜyÓÄë•nr²ã|,DjK™;ŒùB{q/DKŒi”vvZau°w5Ó~Xº¡Î4`î>ô˜!7¾Ìæ-låºiµB gß5µU“,"³‘^æUÀÃn² 2€óH^©(%,Oò°BUœ…óž(Êì[Lh4Ž[Í{™á®>B¤{~“t:;‚*Ôjœòh‚2N]ðÖH_T|µ+&gxüx“ÔÒFèvb kn¤€ žN7¯FÆ5äkÍ I.qŽ0qšžÉ¸9­Á4{‚=Ô àGµG–PJ°øíL8 {$e>Nô#$ª ö°ò¿íF¬Dɶ³HêArW°¦­äôßN3ði•­ÚV1|ñŠDõyÖDPsÞ®øËõ!ù;îu O§n­«ÏÚ~¢)õÆÚ–‘è]B[ˉDª¹½5Õ§ÒßÃÏ´óØRx•~&`ëbNº´6r…Îc'*ÅÓœ8úOøª÷0Ã*åúqüªÕ æ0á‚ðAæ‹Bã÷´¦½L’FUÁR“ÈùÀ4üãÕªò6aþkØ­UŠ”]LO@`˜B!oc-Á÷†\÷Å]³´ö3’Oz¥mÓ‚Aî#'ŸŠÓÄ‘Á*Ʊ¥ÇÓóR?2X½G¦!Œk¸—¨@ÜéÛ5“3+ãrkèì¾ qš!³•0OÚ”J\usvÒÁ$j½âåa”9r;R‚gÆ §!³]b3óKb£¹îS]Í9*Wܽó±¦"|6[Ÿ bô} ‚ø¯=F ªœãÅa GÔC<®UÜŽp+éd;ÈQäö ,§eÆIŠÛ¶Tp{ŒP {„‹\]„uË á˜È˜À`jMáõot£æŒ.J€„™î;Uƒ E³€,ÍÞÆ²ZÉ‘¸ù­t© o5à“Ô‰•·$Ríz‰…LN›¯ ‚T‰6bù”ºÛ/åÁ½¾jl1³¦G?zÅ̳u Av.Ê+Q¬ðƒbš¿U«Üœ 7‚yà!Y5-ÒŠgר•n~)#8`usóZŽFÝ£?qBEî0%4±‚@0íý(«ÓÈt³¸ÎùÅ%kÕ Óóâ­ÙʳÿRúmÆ) Écy\Ê(Œ0#NüüS ¥ÐŒr9äñô¹팊 ŸHéÔwìiv¸`AmÏjÔi©rFÞ i ã½zÃl³`éY6çÅ[4P»KKvw6½:ÈC*å1ŸïSºÚ3ÛV—]C«Ê¶wk0¾ø˜XŸu"hb=Ãr)¾ž]¦hFpðÛo5äйœFÇN…ßíF¶·b Àí€pXõ{°)+ÈÀ¬©knÑÀV\ Žâ—¸Œ¥»zgPm°64Û6-NõÉÞ£Erìxcšè­!†P“"}¥”ãWßÍ-ÕzL—8upwR±Þ ´ç½AÉ4{{ˆ®2ªÙ#•ÿ"¾¹éÅvð–lï¤ö¬Øô ègN«€vÔ 5YàVî#ž@àV¡u¼Úr+%Ì—*ë‚G5©#hœ©942 $ô±QõfHÿ˜Û‚»ÒW•»'8ßjh†õEÜTùÔ›†?4Ü`¬÷êRŽ_Q@'šõÀÎjj3 88 äfk­Q§¦pXdü|V”ÜËBŒa_5±îþÕ"[Éã|1vÛš¥ks±©a ž3Þ¼Pp“:±©ô®‰S84tôÀQx"±u’€ÛzO[Ò•´’=§æ€õ1—w*¢†M/±Çƒ5ºôÿ*z"éŽDÁ# Öäh'?T‡%k‰˜ÐeR•ÎWœXBq’Gk¡x ïÀóK2E«Ld©|ÓS4sø”6EÉÃ'«‚„vÒtðÈ‚&R iKk"²k‘‹~ÕE@IrBãšO‘”>„wã¶=˜B™lg?zÜpe÷5êFº¹Í3 „Ý·ÇÅDZ§AÜ…ƒÂÄØØƒµ}ë4ˆ²Bò¶ñ,“ 6òz"¬K*Œi œÖZ×ï!%˜în cäï¸+jÊQÁÉÛ≦2€)'~Ƽi@…—HÛ4¡¹îU#¬0;—cì'½%2Ce©ŒÈç(™äÿµOê—·VZ%‘”£’#V9Î;ýªjÝ´ó™e™¿Ô{Uø°0rn¥¸C ;©g\ŸÛµö5¸‚H}¯·Ú£ž¢muË‚Øþ´;9¯:µâFd(Î;-R¸Ù~Þ„K°'Œ¿D’.§ I$bú‹³ca½Y—¯ôÈg: ÝI–!±?sQú½„­{,Q¹ ‡J£ÅN[FŽÕ•”‡ŠyƹÀg2pÙ0Ú «CÕzäš&ò6‡ôOû×OÓº}¿Kµ nšnÌw-û× øfötëPG,ŽñHJ2³7WvfõŵKä+! ëöŒÂÁÇ/pr·» wŽÕµŒ <¨Q¦NI|V‹a•P°Æ;榡Ütb$fŽY#\ú`öäⳇ„JÇ*{ÕNÞmml„“’äœoIIdlÌ“@ù…²JŸÑÿŠ•s)ssÀjiÕV 1ã#ê_Š}úˆÀÆçaY{²gÅjXÅÄK‘„ÆãæïsÑ«v(¤«k}©Vº×r"4{tP0I Œcü×’[Ƙß|îøÉ´{€f‘ ÈØ÷¤® !…Ìd6eéÛUiMD¢rNôK‹}±V]öÅ¿I›tu!BUˆﱦ}e‡ œ íß4SÅ1ƒÎ(ÒXËu²û“Ij}JtD]¤‘щ:—*‘½adHâ3JÚTn~(Be†å46Ue-u n­%ƒH ¸íÏóªÕyWõ‰]ß5äÅô…O·=…ÞA%â¨]@òتïÑᘠ)|íG†ÂÞˆãU>y§Œˆž5õÿO"· ñÍE?#Áª2Ϥ¬O"†#-íQ$ŠÛÛGt¨ …qÎzŸ"¢gœÑˆÉw3ëÕŒ €ÜÐ&ë.ÒŸN'oØSôpf‘täçœÑ?áÌ®«±?j~ó.Kyo'' ;ì+Ô±•À’g,|ºz^3‘…mìãäkÇ-h‰"+-x)ƒ“ŠÅÙ¨†0X“ÈæŸ¸ ØXòù¯­,ýÍ#.O84žÌ>¢ý>ÎS"—ù«¶îñ¾‡N;×Öè±[ì2 I¤•`wã5„–‹'ÔÓ„vÙÊäñæ¹^¥~o¥1Dq gÿ¨ù«½BèZtû©ÎNH8ã;šå@Ⴒ¡\ŒŽi¸‡³þv£4FŠQíJÏ!™Õg‘œ`P`I®]ý 26ÜâˆörÛ–.ŒÀpyø§€¿pJ·ö‰Ïmvø13r®Ë:¬ °~E+&ÚÇC¹g;Ÿø£ÛÈ[¦Ú²N ¶þ ©³d-S¡â€‡ùžz¡YN9ñ_Ot§cÁÁȡݹUeS¿9"ƒkms}&+«fjZ ;2ÌŒ¹ñº)(ÈÈñSºµ„hþ´*BM¾žÊ{Šëdé–é ~ìry¨wºÒ&†S…?CãƒT *C,“&DÎ)FÄä¡”ôÛĸ* Fã±+¸´dK7¦É$Ê wQ\·Oé,÷šê_(€òsÞºt™Œšù'¹íMò˜5àøæË°¡èMM úzŸcMZ'¦ È@8óYoVêEV*wí@½•Ö_F2C ‰T6[ë:,y1 Æ]3#m¾i››£oÐ-¥˜éEüÒ’,‘ɨ‚Aa¹Ò‘꣨K˜¤]çÓÐFì|ЬcåÄzO'2ªÔXê1zŽ0Òꯎq‚kæŠRuHpGcØQM¸!pÚ‰ñTê§6ÍÏ£u'ÜØûS 4`Œç>hbÓN ‚3æ…wyobt"‰$<àý5€Ù¡—·H2c`7¥¦P€ÈÇ,¥(1—ø“ç´3DKœ8"“Ÿðë4zídÕ©b*Ë…6äœì+àÚHpNüŸš¥3:õø•»/D·{Yn}hʶàóÎj—QÿŽéñNÄ£W«"‡ÆùÅ)4Ñ#Ëœ`.¥ÛíDr~PE¡1Õ‹) rC¶Òªz±q*ʧ9?48,mã}lN;);Vãp‰FiÄY¹@À­ ¤ç¶*—I)í©2Ü.ÜS–rDÛF?Ž–š$iÀËs“SdÎ*D©GF5-´/3 §$yû׌‘í–ÛµdŽtU8ÕKÜÙ q¨œœƒÅ@¿†3*lúk‘Ž;Ðe¹‰b °=ñS®…ÄLÅ‹išQåvˆ!cz©<{ÝÇ.+1Én‘dt²·8;æ…5ë'ÓÀóH1šÏ¸ŸŠ¬aX|‹³pÀgqE‰ô·Áî"Ãã|U0Ò.£ àvÍQ¨–îz²Å·šúæq£JN9¾¢Í§V´¨0GRFô®;¹–$»Áü`Ú†à3½Pµ…VhÇŠéIxÒJL§fóðiËk’=:¯ÚœÎ8ÕÉJ’Æ@FQÔ PL`à ï^]D#•¤Pt9zélºM½»–HØêå›sšKñ ºÁLvcÍ5r)aÄD”*¿c&Á ¦ùߊn%„c9ßúRà6KSŠ]y q¸ÔêHâmJ8#cHJ­nùWÆôü‰êÆoÛcSîehا¦3å«qÝÔ µ’éæ“JFÄ÷#zzϨÜXŒƒÊȤ¤yduŒHw 0ò¦×1T$vùªX-Q“ bnu?¯ÃuI†jïO,°Ìtç Œï\l ± ÃÇš¡m«'ºohÜ ð¨:•n[ŽãÒ¹ô™†XûsDº¥q G9ÝÏRe‚à¬rƺ6FOjzÆu¸ aÁ÷¡äR™ksÕ)DÀÇ…ì1ö Í¤¡ ½abmø'ÍòuŠ&€&‚lå®J~vM?Hl Ôc• Ÿ rò3äšn¾xø«˜PžMÆFv4UÔç`9'µe&—iâF\vòi;2 ŽLÖšB¬Àì㚬/µv$‰Š’p0p(ø‘X nGe5…ÆlÖPîäÁíEë¶‚æ8==aŸ`å‡ÅÉã†ñ"“¿«¬PÄòâ¨À'ôýªv<2ž;ZHö¨¡Ã#¸"‰{xÐÛc>÷úiîµ*jUÔ½Éðzçn.?3>Gл(>)øÇÈC•©hO‘}l oÚ™{se*K´ì~A¯ºz+^BŒpÀ®–N™¤&C[—0CG¨ ‚¯ÜÅ”¾¢¦IÒà § {2Àö"6Ú I!×Å8ë1kc9šä䣱(âjãiêá@ö€w4IÉkvdEfÆpvÏþhq’cT#l:Üq$o•~rjCÝÀ1XÖEµW‰[Ü7óJÜC5ñÔ@ØjÓ*„!}¹<ÒÓ[4gYÒàspOíLL»¸Jôd?IàQªbÛe”±Táuô–4rWàäã÷¥žÝ’wÒ4åF`hërˆ$PìN20*Œ‡Ôc›Èdz`äã°4'P¬Ï¨F -â¾ —J©8<5»è̶³ \TÃL?x‘£ òÏ$šµddý©ˆ ¸üŸ‹Fàüèj±zË ì8>*żHŒ¬÷«r¿©VFК¹'Lq˜ý¬Ný†ÛR–²-Ô²©€ÍÖáÙϦ¹5.ý¿18…[؃sE–ý`ưN‘P.näôÉËe¹e8§àÂI¸%êWüÄVÑnÄ ê·Q[‚`°ìEsŠBA$þôÄLQqÁ»úu½ÉÎCróŒ%ÆÜf‘[ÆK¹ çœÒ÷N¯Ó ¨>© jÏ+k«·+3àà“À¢Å‚Á$Ô™ˆ :øÅ­²KN||Ðb»¾¾ÿ‘8/ØVúḢ)5ËzþŽÃýêü1ˆ”*qØ ó Kúvg€s³¨½…¨‚‰=SË0óMë*›‚E/=šNrŒÐËÙÐã?4µ­ÝÔwÒðÇþ\œjø¤ÑmÆÐ­GXÆ)9‹ÓÈ#jqØjÆûriyãÇ»µј Èwj¤í³/sÞ§Èì[ÜNôíÙÄ„qƒI·%cµ[©—F1cn«Á=èBr2sÚš¿ƒ¬ 8 …wbHÀ漤َ`ibŽ8¡±ãQØñMÈ …Øø4œ¤IíÁ§®ûæN¦et”`/Û4âÇé²'dP3ŽçzF5ËŒñV#‰Ýµ îÛãµ{!â*XÙ›Œ%3œŽ âɰ:‡ŽÔyÓBc?Ääj<Ôi溜r| …#–6 §#€*§QÓ:ºËÿÇ”YT'éËœ:ƒë‰°™­:ŒR²–ÁÁ’ u }ò2T~TŒØ85¯P1å.72Å$ÈÎIÚ”d‘&ödmûRw¬Vå´“¶Ü÷¡¡ueY¶>@4äÄjÄÒáOÚ^µº:BLqŽ)ÀêwRçÅEŠîéáYGÀÎëÚ›üÑhFaÐÄàv?µM“ »~PèÊqÏ¥Ž1G„D_ÛÁÎkž–òptÕX ÎM9mêMn=RXÝ%°jÌ3[@G¿â!Y\'Š3_$ÁYFÎ|ÔÑY0q§ Gx-ã ˆõÈ vÍÆ‚NÜÏRœe•4±÷vÅyëH {ç?ÌÒ¦q,cÓ‚|ÒÝFwhL‹q‡Š»†t,ÈÝgªAÔz‰c&˜ccÛ·šŸÌ`“¯*6;SòÙ®7AµM’·ŸÛºžEtñ”#ˆœìŠêyG%–)ÚÊÀŒb¯t (íí½vÔ“`;…¨Ý#£ÅÔ.²Tˆâ ¹Ï>u…K•aãaŒT~V@£ãS(Ågf-Õ,PŸÏ©F–Ø×)pZêèúkînÕ×ÝOª9Þ¢`àóQ¬º{[Bò0SßÀñCƒ'ûiæKhÏNµ¶·‚8ÌjΧ%ÈÜ“ÍT’tœŽ‡¹šVhã¬3ɪýä¼·e—ã=»ŠFVanL&!@¡ ƒÓOkgÖŸéj=o]€õ:5)ÿ ™î 5ÁXÈU\÷5N[,ÛŒoRgÌ¥iLÕu¸Ë"ëœî xU0=@0ÃI¿šÁ9a±ïÚ™ž$0€Ì¯Ó¿z†ê¦X '/p­ÆŒ¼©=ÔñFŠRÛ«ùS]NܼÊäÅܦ§DÁy>k© e"åOQD‘†çâ¾’?D¹×õn7¥Ðª^ õÛ}è°fîå&ÉXàßOŠÜŒ\Xˆ#ü¼:dR ‡.àPÅ‘_O§4ïOúš2僗¾’Jç‘ã5ÏùÙžŽÎÈ#I/ú¤9"—êdGa;¡ßFTøíVf+oXê9ÜÔË”‡Ñ”ÌXÆT†€Ån7%0ÐÜüï¨Í" XÜá¶'ͯëwéÝF,†¸¶F,;:ûOöɲŠétW¨r)»ž™4Ÿ‡`ŽYÖvñk ÿq_D¹PP™Ÿ–kê1Óº¼=Fϲp0éäùEm §­¨än>kŠ~ŸÕ ”:2œ©Jëìd{ûÞdhæM¤OŸ"“•Bm¢QŸ¦Ø4¿}DsZI4€¢ ã8­ZÄŽØVƑϚ¥m ¨lœ¶iêk1©ƒk™Fä*FDf¸W8ÇŽÕ\ĸƽD.ik‹d’@¿Hã½)NàüÁ‚UCo…æ§zåËc}øóO\(’M*2Š7H‹l1¿zðüÆ ž¥Ÿ£¸Æ|VâIÒ¤êÚ‹ `A@ ‚kåš(ÆNKžø­'ó=>fhc2ºž(w‡Û‚IÚ•¼¾1‚H°šò] pÈ ±× ñCtf…¸)‘†f2¤ƒ ¹Û9íÞ°èk»uúNpÊ<|ÖúŸZky)cÓæšã8ÔÉ¥Aÿ5‹Øï¡è_˜º—MÊNàcÀÇŠ¤¿}@ä Å-eKN¬jŽ)}§XÁ tX’6:ã‘\ÄW6½O¡´F&7Q^¨É$Uû ³-„ã,ʾãj÷’”þÑž;Þ¡^D›g€cÕÆi'·ôÊÅa‚IÛz§&R2¥~i<ê]`ïþÕ0:Ô»ÜMƒO{À+HþæºÕha/ ÜW%qnbHÎIÊš»cwùœ©P&P5ò(‰ *–„€}F.=ñ„Œ?ó©w–‹rŒ˜ö°ÇïUd‘"ý[‘ºãjKãF©ÏØ6'*,îm†fˆ¨;<r5e'pñª]p/ü1_èÇ*Æ'›Œ›œs‘Þ½’Žç[nXìú”m·FylÍI3~d4º´6¬cšvêe9‹HÂìsßæ¦Mº1‚¬Ý¹¤"ÝŸsØØ’XÂ\Kü90Ù(§;wÇ5Ê¿Fê‘ êdÉÕ­sö«SLë Æ?ù… ¨?4_ø¤¡ >™g Þ¬ÆÍˆ}EÜ‹ËÃò=Nv÷¨\>`–&‚Z† >h1Ü^DªçÔwN3],6·ýFm@lxi6÷­Kcùx4\ÝAÈЃSFuý4$ëâ;z-î¬Á˜E,3*¶–dTŽ¥øK§Ê X1ŽC¸BÙµan‰ &8CÀ§Æ¤ÏqØŒm\ÂrbsÀËŽH„ Hºd}>eÕ¡t¹~½ø}¬Aº·R`'Ü¿éÿÅvOlp¯¨ÈxÀÎi ®õ#Æ"õK‚¡qýé¸2äGä=÷&Í…JÑœ1''šñiö®‡©þ’ ¶‘©<ŸŠƒâ`­A㸮Þ<«‘mLå66F¡Ñ`H w®›¦¢Ç”$ mö®oK ÎÆº+pcµdíÅGä›N‡Œ;”,ã2;Ìï¹<ŸíOÆå‹* 8;±Ú•± e±žÙ£ÜÏ¥ýGŠç¾ÍKì7Q3}D‚I<Ô“#dnH'¿jfâr&yæœ0UBÙ<ø¦"×qDК`Âܳxø¢ 4éÜŠ,‘©HbNÚ…a†9Æ;ù¡-s@yd·\œlGš›Ô7ˆ†#[lEUœj‰;7ô¨×ÖƒÓüÀÉ+õóTa Åd)¨Im%³’Ån+YfÆùÇšôÌòKSö¶Î?ˆ[åFåáB.ãvpã”4ì-œ«wíSo&(¡U€8ã;Ñ:tï)ê*Ãz…вò1U{0÷ŽÖ°“ …>|P-zºÈ}9õy£uÿD$>Ÿ‘\Ù8?VO‘MÁ‰r&㱨eÜêÙ¡JH ƒÞ”ºémp¡TÓ‘Ç"¥Û^4zTFs¹«™HT1m›÷ d|Gë1”¡Ô‡5³Bæ,dý«Œ J>jÜí Ð\j©NÕ.êÖæC–e`"ªÅ˜ŸÕ¨G%ˆ‘ Æj« ¤r4 É©rÄPïÆy¡im23š­”0îL审$v’é½0–Ý{T †8e×äã¸ù©Ñ f›Š*L`a¤þݨYuB/Œµk†’GEÈÚš0zŒH9ïIYÜ™päqT£`¾òr½°*V;€n3o$d ‡ø¥Ù8*þÕј€ô·+˜üU>»4‚8Ø6¼¸ìd“5›3œ„Û✠œ…4­¼26ÅïŽ)Á˜ %›¹CÕÃ@@ê9¦FJ7Î7¡K*¼áÙNØÅkòÓ*‚Í g-ƒ½iàWFhåÔü€Fçâ–áb:üº–%ã]ø¯¡ƒÒ‘dV8'jÓ3èÃçj%‚›”’opÁ£ä@¸*7Qƒeíõ—NÜŽôQTïØ ÅbÙŠ»Ep0êxñL„]HHSæ’XƒMÛ¶9ßùÔ¾©t,¯¢¸„²0;‘¶j££CÀÊüv®wñ¡®#Çúw¢Ä<^F*·: {Øz¤ $Dz˜÷ÆÿqSz­Ã~U£Îä€~EsM,2‰"vF ©ÁªñõSÔTCx Íl€cWßæœÞ?c¨¥ÍËF%=ø¦Q´€ØÚ‡R `@^Õá-;a>+;å‰J.¦–fÓôåškBŸ«š^ÞÕÓ CšzÝ[QlÞ‘‘…PŽEcö3ïKÚBŒíÍn#¤ ƒâ¶þÁ¬n­óÅfÉŒa\ퟑX“n 5Á“¤ìiÛin:ܸÍÝ›K¿I¡I@Q#sMÛu“ëNÀ L~\z‰GuÒzÀ/éc'æÆÔçLèP ܠ–Và•_½[†T™j„v­£ÆO¦ ©¨›ÉÉÇSJ­Ü^keP‹a×p4ŒŠl qŠTÖV£˜ÎIÎ7Çz)cÊxÀã5±&0‚Бɬ¤ eNN}¬9§4jÛ@ø¬Æ]u¡Å3ž¤ë‹‹‰gô€*‚qÏÞ¨†Âè,2GzP7æšVr74G-((¾Ö]Á=蘃@L`  *ìÀŽsDשpäö©ìò[Aê1.êíµ Å™IŽ2¹U,ã=ˆswjÏ¡9ä㊛~— B×qèE§¦—h\g"”–ÌDÄITðÑTe¶"A4YRNï €MưFþA¬ GSjûœó ‚ê7 Ô2~*£Â,Ú³sm–]9Ï—µ¾ôȶœ¶RjžEň‚¡~æd ŸœÒ§·\U[˜ƒÇ•àÿJœ¬žíóD©™˶¶’îÌzFF7üQ[b©Üœ((/Ôk “¹äVa— ®˜NÃ1bDx «žšÙ‹•lqÍzÖ%biS`¾vªQ_ÛÝBÆ )QïFíö¯¡†QêkM[(¹YXü¬L¥~ª›,*©Ÿ§-°â‚È3 ì ¦n"ieõîNçœÒøS8ÀA®¨ ˆ°Ä‡ÊãŠc£æ–+.¯á·þ/¨ç p+MéßG¯ gÇj"y!XÔêa+ ,¿½j5̇W·ØÒÐLc¾×äQËûΡö®I ÐÔtÆB6wÁ¬Î@‰*¨<àœ×–×:F$#Iãâ–•3330vlЀnS{˜õ5HÈw {Ž~+šêÈl/t¨>‹{£'û~ÕÓM0‰‰ÜS¯¬? »•d:•±œU¸+o¨àD•dÏ{*D¤Gvð+¢‚ÂE ûSý\šNÊØZ4PÅ­¸ÓóV¢ec•\7÷>FK:ê<]ã  –¬®çµ{#Pže$a†Ë©ˆ \ÅÊ¥'HIš,9 b#Úƒy¥îcÃêßuÁ9æ–ºnæœK{Ñz”¢$rQŠ”ÆC-tý.áéçó é $.©À53ñKnb½†fŠæ?kq©{Qú_â8oGt¾”ØÁÒßí]|ܲá óý¤ø8cËDÎäõWP5‰‘Äz‘C0;Rà*à)>óFŽP2šÊýMs@®§UuÔZY]%W¥N☶‘ozƒ‹vd‘Pn3ðh3‹°pkñ’;›ru† é즎—³œ^;í¼M6^c’¹ó&Hâ;6äüV¬Ù—m¿VÛP/.Z+ÔLi]‰__å±8÷ö¨ù "èÀ 9vj:z7Z¢UŒãM­Òd1ÙIÂÿÕPúãÍxð¾bÓ€ ¤¨/¨ì`Ý+û¸æ˜ú(uƒ½*Xë}ÙíⳟPQ–'by¦* 7a±ª‚„:øÀ еZL`Ÿ§æ¼·Ìlc¸blöûVày@d, ì)Q”ú 0é<ŠäjT³m±¼Dl<×·Æ@@wÞ½fÁaƒ«ÔV BàñŠjÌ®Â@N?©¥×N ~ôež6 ¨Fr<šÌ›œ­Ác¨4Ì&†Á*Wµ5œ/ KäXM Ð47ƒNtöþªN0çOÆj>Fç/)±qIám,¥»×1Õú¸oZuþO÷ù®öX•£!WpðO(kb¹$(¶IŸó^È®Ùxd ÿNiÛ¨}hÈ`6àÔwi-Ø…mNQË®å(Á£ o#¨×’p;OÐÑ©sï]ñš¥ÔlŠXiüÑx÷n1Hunž—Ñ+ÆpëÊf0cþÚð ÐN|œâ˜§‰µˆaÈQœs)ŽB¬7LZ€P€ÀäVº’¬¢D\;Šî¨'HŠ´ää8ñÑ< î¼Fâ–M¤_ÿºµfc“¬ðv♎Ùý|–Ö¸ØíƒÚŽŒŠºUBàb”̨ÑÈ7)ê<Џt ¹á¬éÁíÚ”–éw ñK›½M…šXÆ;„r·æSô€9ÁÊö;ÑD™R¸çœRN,}ÇŒQL¡™ˆ>Õ„LïqWŒKräœïÚ¶Ñàg'%j]t‰ +«Á£™ôÄWrÃŒ÷¯f­ÌÅ|ÀêŠËf˜·üHÑI¢bdNì9ÎÜN¥Ê–aðG¨e¤ÉûS¥Fa|‚:Ÿ¡ÙÞ­Ô¤R@rqÚ™”%· ïµpV´3¨…œØ•85ÖY—Ž=+HÛ“É®_‘ã gFW‹'1*Çt$A$žämGI7Ì„3yÅOGXWQ%SÁÚ„z¼Ä$ŠpqŒóQE¿H4%_Ì+Hªê<×¥¢Y fÁsÞ“Iô&HÈ;íKÏ'²]^ÜŠŽ”L1;*#©û'Š7¡Â#!vÛ½ ³,l VÈ;ƒE7¦LhP»ï“Å Võ=¸XâXÀÀàå@Íl"j' úYŽå0fCüôSåR¸ÝäÐÓuÜ;ÅÂÆë#2W½±Ëê1$•Òw漋"%8Ò£qžké¥Ñ‘Žo½î ™™ÝTÒ¾‰“(B6Ùù£ˆÚäjØ/aBž9áU•cõDY:&¨ÆÑŒ Ä_¸Ä¶ÚðØÁñ氪Ѷp â±ë_˜ëñZúeŒ– ¶‚qU¦ÓfUß$óØÓ[ Þæ®^Z úVd *ݨ¾ž ;äŒc4(àfFi’§l÷¯)­Â°FäÄA¥\ÎP«®|çÿ5ÈûY@"»Ž³n$°¸W# ƒûgû×#Ð:|—ÝF$t>’02Æ~Ÿ›é½=2ŽãQ'ö¥o—sÞ³e}5¤ÊÊÙPwRy«iŽ?¬È6'X#MDiÀÀ½  hTI'”-Nôî§k{ÚÇ ™ê© ú =Ôqa•ÙÂà«™d0î dÖø’"§-€©×qpÐÖxÛšê®úte‡·K ²)5ép¬­# °Ð&u™v$Ë~›-ÀÓ! ¤g<š•ÕzJú®º½ñð@æºy;5ÊœÅB¾•Ÿ¨ÈFr¤l4ì9µŽ¦0½. gvôÝðØÅfàiq‘¸<Ó7 ¬ÆXÀ.7;sJ£z¡ƒlÃz¼ÜI©Ót†W…F¦:v#4ݺƾº°Æ»z…Ó.Z,˜Îx=ểîNT.½ŽwÞ¡u!Œb(Ðéra8;ãÿNëD‚;Æua•ÔÍ[Hâ·b>¥TeQÿ6gfà «Í ú–žòÙÜ’ÜÜV®/=X Q™£åN*|v),¤/ŒÕ Ÿ$ªO§äóS«»˜Lfθ¶T¸E›l“ Éþ´œý6ß§]¿åb%*[|ãà|UØí}˜¿aPîïD3;:k™_1ØRј’SÊAk™šÖYS0Š1¹w8øè!í,À0;$—öï[žS"zŽú‰Ü÷¨·R1|-´6Á=ÍSŒ3}Dk0¿±–Yf`d}Cô¯~Ôâ±ú`íØÔ•pÒj ‘Û~)Ø¡õ²Ã>ÁœÚ“‘0„`8ˆô'¶H—Óf^í¡Á„1v8cíâ˜é½QS¨Y\—dÏú¾~ôº"øîyµ±†W¾m¥QO¹é—Œ e°ïVS¦Äñ€Fsœ Æi[Ž‹‘êÅ,ªÈÙ(psûÖ|ÉzÔS0:žDq¤3cŒ‚3L©yµiý“Á¥¤C\‚4Ž|Ñ 2‚dל×+sñµ÷Íé·½PÆÑ†Ùò)+dÕ8!€+¹§Ø3Æá@ÔFÕ;ÁÈwšX¡ u9Øy¤Ì…ŽF7œÓrBà«8_g|Цupt± Œ#b)‹®¡ =ŠC)Æ’ ‚FÇân地ÒFâ‡l¢hÕ\鹿š*"3&”Ò©Çb?jñ¨ vD$p˜¢39 ý°)b¹˜´ŒP¯-þhÁæÒù…ˆŒá7ú¾i[™Ì­é²àêíñB “nä/Ä]A­:}Äй-²G÷?úMFét-4IïLm¯“Uº±h•5¯ðµé-³Û?Ö¥_\5½£¼dç…Éà×gÿ žåt/•è N@¸#I«os‡VØç5ʧ[¹B=XÕ±ú—biën¹k9 d1¿‡íFÞ+®êç†|M« ÛÉ<­p#$lKv§Í:Ffr‘®ÄšÑêRÏd¶±´~™å““ûÔ´Ø‘‘œèÕïŠ,8¹5–r‰/âgÖñ¶Çß¿íRnzìÏ!C˜Î̤sA³¶3 ôéWÓô­«Ô}«¦¸°¡©|î,LÚMªë1!A<×Køz'ˆéŠãÚG¾ü­Kè¶VIÉÔIÀÚž•^%Õqº°ìi>C†<3 -§@-•¤e3±R3¤sZ6QB…a!A9Ï9ûÒ]«%ôM(Žé~¥ìß"žs¤èwäæ¹.[‰–)‰âN®‚ªSëÏŒV&ë¸$U‘޳Cº]JL`«rsR‡á;»‡K«N¦’©9"Q†\Sñ&6Û5Eeb»Q´.·/,͆j¥«9*ç ¿H⤴3XIF}¡¹È£ÃÅ6¹K3c “Å\~î0=J_V’ÙÈ<”’¹,È倯Wæ©HÈñ€dÑÜ656HÛÓ3FlËHCù„EÈWÈg’_V Ì[Jý#ÍM“§”¸Òv®…¤2(,aÍ{L½8F›•$d|×M3•uñ‚w%tÞ«(U´¸$`á}IÿŠ©õ=]-óE1,2ˆÖ!ÿÒÍ{<+$‹#F1æ–Ŭ –âä«WpÑA-Í  ¹V>ê×O ÀØa³Æ”·’Xä$§8*(=oOoq¨¨Y#µS›£[~mn£-«¸e8 ð|ŠÀTãŸÌ縢 Ä:¡ŒÄAÈ—íQú”2ËÔ`èùÅ]¸ŽáÓR(iu퟊™5Ô—Zc[g‰áìÃsÚ‰ …©î.öÞŸ¦HÓ‘ÁÅzù–Dˆ횢mÕ¼zåÓ¡0TóšöGµ²ÆQLª$÷ý¨Fk×fZ3zÌÚ[˜ä9 é ñóYib†Ý”œ’IÏ;Ò—]bG'HÎ8ÇzQîÞUÐ#«‰Ûm0#³}á‚úh'F “ŒÑ•g‘S#ÛÍ!-Ë(>+HMËF>¬dçµPPÕ˜àØÔ×Q™"eàì+Ø£a‚<àS*‘¬@ƒ©4)g+>aQ¤}_4¾v(EçÈ­¡¹B%°À9ÇšÒÃuÀô¥Ð’Iç훉Y· 2s¶)Ĉ$ÆvµBX©‘­Ì¬+3…yî&Á|ü©©ºWO•=/Erܱ$‘ûÒ½8¶$Ô ß4äa–O¸Ûâ™Èƒ£Rwêb>”¸ÓGTúI5ªþk™{|Gv à€ÕÔ[« *G;ëÛÉ Œ•`gÝÚ‰s2µˆ¢}OÈz‰u¾e“$…PG¨Mn6ÎàŠé:”6¿1*A;;hvRAß¹©³ØÈ`Eö0M½HÛR‘æ»i”=EäÄʼn𰂠mÐÊšÎàŸÞ›~•jàR‡±ÕIt¹t´‘ê'ùªyÃjmêlŒêú1¸ÕJ‹{YOæÕžÙÁ¡ûÑ‚;;ûµ7u-ÀmS/žsÅ+q9kB.ãe˜d¡ÆÄÓQØ÷ÿì[ CÛ]" Y8'3!w 6ü×:$|†b@íMDRVRÅ‚ŽJì1ZØEÝÁ\Ä "P‚A–9µIšL–jùõ++nï°¤.ç{]™ônUQÕ‰*1^Œ#/ºçžOÅofj°m‰_¤[ï]ª© !£ “q±ñ^I±¨äUØüŠökˆ•}Äm¾ &+ ÁçÅ$“N€vñX…£¸_á.ô½ã4 ¥˜Š3½A-C•Æ¿2ìÌ3L[Ë €aÁÏ‘R!T•N–ŸŠóÜ2ˆšÂ‚(fnçQkéC*‚xÜx¢\uktˆª²çWô®Ygœ/¦er½9¢Äª=¤R&ØÌÄØLGõ+§ßB‰¢eóUE¼ŽXÂûdÇ9¨ò©£Õ¬E™füâÇimØéõŽÔËtïIó6OêÌQ¯“Š‹LFX<ãaL?DŠ'îBÌ{R367;;ž ]NÖh„±+©Ôd7b )$A6bKw¤z,ýIîOi•¡1–Vq¾Ý…X{}²û7®K¯W3ôš2GP‚'·ÉÜÞ’NÇS/Æ¡ÍZºˆzeaHÄÚU•¶eÛzj9ã¨ÐY~’’br…F7 RnúeÄ%IŽøÊ«°õQ@W#5„•& ³¹?Ú©ÇäºÅ2òlºl‹ ´˜V+í4ý’èb͇·J$]@éíâ‰5¼ƒW¦5cb»b…²–&ãx€!àtŒiq¬1ÈÎø¢Fù ZÒáafÊÎö2/÷¬Oø§¦[N°.=W`tÿ­KÃ#5p\…謃8,J öQÛ½j8JìÀjïDojý©EªJÌLO©]05*?zàÌ­pí.K1ÎõkñGRhîm ‰Õ½BÄãÇ£Þôâf‰ ~jÜ@ûŽÆº¸üiëÛ¤<{»T?Å6â#oqÎr§àŠnÒɲ;¦µ'Ü3Ú×e¶ê} I!݃h<㊧,yõ7/ÙMÉ;¯:ÉwâllN“ûùªQu˜®z•¼vÍ$JÄ«1ƒ\ô!bƒ^2ò+ð;×£eÇ«6$ VÌìî˰' HÎv©HÑé³) 7â–¶ër$a%Ρ¶¬d0ù­´Âox ~Õ"alfš<°#S¹éLßtØî@]c)"ŽCäS±Ê«† ³«‰ü1zmºå¥áÎ@÷v5Ö•þ.¥@ÝÈóŠäùXF<„Žà(©cr5G™lkv¥¢`4O9¦š"mƒFÁY¹ð´„¸%Nâ¥$SÀƒôÕX âŒLe†ÄyÚ•†P\#}C€y4àÎ[#Å ßF%µÜp]NdÉÎGÅ(’{‚€sØšfhert¾K1+“È6_uR”ã#ŒrÝ b >¢þõ¨ÈG,T)9¼…vƲÃÈ¢º&¸ÔÆ78’wQ w=ÔNSþÔÐh|f8lQ úUß*Ç=ŽÕ‰<ÔåIÎ終 ÁÜJX¶ Æ °ÁFàÐ ¥Ï¶[X;¥8ΠüÉ­‚® /j‘‘€Ôªˆ'I°tÙ@Bžè ,­´[X@ÏhÀ¦áBÄ’0;b¾–)â:³¨ž¡9Xš'ýਠ£OÔÇòƒð¸þÔPü-Ò¯ŠÍ$n²ô9ÒcU=7HØí¨ïŠÆŸJ×S“äüW—3©µc5•XTæ[ðÏKéÊÒÉ, úŸýªR’ÙÉÑh^Ä’I®¢ò(º¤o«Œ©ƒæ¹›¾˜ö’$‘^<ûHþk¯ãd,o#ŠøõÔg¤ ŽBwBžA&ÙÜ fÞ5ЊƒŽi+­1L@býœ˜ÃA`m}A{‰Â> 뙈ÂHÊS5ñ¤®Fùª}#«µÃÇor[Zý'PñEäa.9P1¸Œ½4r0”ãnqI ¼¶…ÖÚänÙL«éz¬kíPÀŽ n[ýoÞ¦Up6#™G¹ó5Ä·:®Ib»öûSpN²H\ï·n)Vcê—-GÍy#E lmDÖ ]FãêIp“ ä©öŠÅ«;Ý:±ú·ÁàÐ,ÿ.× ˆÂ{³ß&ˆmæµ—óp/­¶jÝ›¸u©#,‡ùWv±¸iaüë…ü_c ŸTQ …Y# Tv9#üUþ!Gÿ ‡ñ'ÊìŸd1Û^¡ms­íçb™\iÒ8Éþuo¥0a´º³d•9ÌW ü§á˹Íy*¿ö¯¹¿®*u­å՛궞Hý ŒÕYjõ庸1ºœ0â¤Om ,l4 R5ö4ÅeJ±ä®M–U:0¸Ç#-ß(›mš§Òl ÅêË(ÌiÀÿQíI_[;颯1ÇØñU) j²â=D÷Üà3 í^Ø«E곜»ò{âei,בD ±ŠÙ´ÓpQ€ÇàÖ»Ór|à³r†ˆ ”Á5™^΋tÈœ¦ØãíMAc5¤@ÂUÛ>à[©ýNí®VåPÆàƒ§¾õ:qf dÌH—D¦ÞS;)÷hßz<ž°*Í‚‹ƒÍÖi¡Ç¦S$çz,ZfF”ÈÚWmûÔG]ˆÐ!­R(§&'ÄD‘Œçz `DlÎwÉ5Ï\«þ^â[lä k¾=™èw·wPh± ìHÜÖ•n<®'*n\ã(ÚT‚9¬Ê 1Fⲑú+¨¿ßæ–¸“ 4ÈX·Ÿ#gR~;Ôä?B’8tÈ%Ž‘Žâ¹ûs2[4–ÌâEl½Æ+´ëý2öîÃ6°eYaÜä×?oåÙ㔪˱ Gó®Î €a®çˆäò©4²z¬ž”ƒ—QŒýÅ«©#E4:D¯WcIÜ ˜bžˆŒ#jèZ"9Æôµ4bXX“í ‰Ýs‚§júgKÙs! ŒŽõ¨¢"ìŽC Ðduµv]÷çh ¬ca¤òkS8Y2=Ø«Än¦±Hlœù¥[YWr¹¬+±B5™¥q3Íx!g©‡rìYN<šnÌ,hB`“ÉÅòíé¨ßQñO@‚8´«ÍyØP™¸\ȫۊÁ¶-.øgµV!ÉÕñYöãQï¨Ö§ nýŒ6µD9Úc¤6¡ñ](‘Xç$v®~H’[¢Êp¹ 柶n+*Ø7ŒSwj]¢õÔ'Ø8ù§æhã…*è^Gš™wvfl zY6"20§¥dœ°·ÙFJŽqñæ“ÄúÕ´Ÿš/O¸xïà< `wÞ«~$ü>ö›¸›i[ÿä> dUpï¨ BãÔŠo.3ÿé¿99¯ Ä˸s½Føà×Â6^ã›Åb¹4*ßܯÿpÖ¿?1΢–hÊ÷Í3kÓä¹ú$Œ7ú Á¬*€Y𠱡4·w¤©Ü Ôk<ì˱ì*…·B Èá|€*Í•¬v‰„\ÉîjWÏL·Žçm$ÅÑ®ÌAˆQÿImëg§ÉN¥bãšè'ÕÆ¡Þ½1;);õ?Ïr±ˆ$ÇÝ[È ‹ÓÄkž>~ôÏLŽH-i‰S–!ÇŠ0„Á:ã3¶Ÿ[B2`#e$ŠŸ+š©b d {®œ®Öa¥‰ÜÏȪ2#")}¼ikp4ûû:3éxYrsÅs‹5˜ÇB53¦•'lï^›r¯©úsÍ݆˜‘Ü,*qL{P2ΠïœR›GQïRuå£\Il©'¶jâ£e`SQ˲`îsW:ãCt Ì#†8‹¹Í~uÔúŒ½^ôÎã ôƃ°®Ï…Œº‹ê#>^"‡fyÞâF¸s±÷œr|ÑÙ’Æ+—83 ÿ™¦¬zY0™®ÓR1¡†íþÔÿ]·†.ÓµIV6\(σþk r(`¢L0=rm2-ª<ˆ»þÞµ40FÚ󬺧øÍ{ùÛa¤¾°Náp3÷¯"’ÏQ`“Ü0h÷w4crëÿän߬_Z(²õGÔý£½7SëèüRäç ƒ!Çò¯S¦ Lj¬‡ÜÉ4Xá0‚QsΑQ¾D= ÊÓÇ Ù:€TyvY¹Çzp"E nÛ ú4V9;j9¯¯ H„®™°=ßâ”ZÍGq£0~­†1Ca«nþkjK'Ó’MƱ!iˆS‘F[ÿÀ@€TÌ›| q¬‹±¦,:´J K'ßjÍÑY¡+ Š”ÈPçNÔÀÖŒÃ}ÎÊÚæKœúR¬YÍ¢00d[·Õž rýB{GWC¬*ä}fÒ²++'Š&SkÔÐÀËFÜêÕT¶ì¹â˜$‡$yïJAq®4:êÏ&˜YC•e#Q0k…5=šÂ}D_‚)+‹Çˆ¬UËÁªnÉ Èàjwä¤h™ýF2.pkÊEÛL‚„ÜYÞC2Dg`Ç€vÁ®šRå=@9çɽ­ÄÒûÛ+æ¬Ùu!el-n‹4Ct×àüVf[™…o`F˜¤ŒC{N64Œ¨ºõjÎv­Kyk.©ÕCä©c±¡$ÑN5!d¼ÒÔ¸CFNê1Ü<±˜›øcfšc¤z‚9u98Ñ‘¼Ñ$lŽÕìLC© €ÜdÓ™Ï ©Bã ¸òFV]lBŽ[šõ]<ö&ˆêëfJGnõ2U[•*àöø¥ãn]ÅüFnnm­Ð´Ò"¨ßsRzP‡¬þ!·ºXvvŒeil‘ÆÿzÔý$Ü(i‹68ƒYƒ¡]ÄvЬ‘¹Æ ¾õ`*‹w¸–Š3¥½üKak?¤Ìü·§¸½s½s¯\^(HuÅ;(å¾ôòþô0î(ÉåŽÿ"Myÿ ··Ï&¹qûŽÙíR£`Scsç7%©XÕŠÿw …P¼p-£pc¾Š\’¥œ¶FàRòÍ*:ÙÚ>*Ú,DgCQ¥\ cÊÒFI­ìåŽ4 ®0ÄÕVá ÄzdUb€€ÇŠ“ø‚ ‚\Àͦ3¦@§±ïLÅ·Ÿ DŠ·/¡#\…S^ášMÉûf•IÕGÒI§ìÚ¹¹rŒÇlqŠé°ãºã<5°ßWž³©Ìcöæ­CÒ­vyȤd{¶þ”G±´IàŒ®>jo•z—7ZŠôë{‡tštУtÜŸñ]ݥǭwma¶%O½rФíEÔNÃ×EcÕ§OX‡ÔXí\¿<«(üÁ[ÊÐÝE‡Ž{àÖg+ F##bä÷©‡Q9È;ƒNZ°æPPî¹W §Ã*ÄÒ R+1ÐsíÏzx‚NrFÑæLòv$r*mÄz¹ Hn65ÝÜô»i„q˜ÀTcjVó¦CLñ–lÎhñùŠ ÐÆç$z#4^¬çÒoûíG6PZƢܜcŸ¨Ó=L ÖU{¨{*¾n{1£/]ÁGddG. ƒRÇÕÇoêoOËs¥JDNžI¥ÿ5+à±Æ(c¹…Iî|ø‰XzeqÁ€e ª®Ä•à÷¯'‘ÜnIìiÛ^“­’«iÙ´ðXÑZ¢ÛE”Ý ŽœÈ®úò ‹íÏz²³°b±ë½ÑŽMAë1½‘·™‘¬ì;UŽš±M‚òŒ5/ÍMœ£'üÔðÑ+·éqŒœÏ]Fø¿Ä2çá»io:ŠÜiÒ–û“óØQ:×L{kó2Ëê½\ü?ÒÛ¥ôXm¤É‡©3wÔ{~ÜVºÔfnœÍuBuñÈÿJ¼£ýO×®£>r[”çàqîŒjSÎyäЫÌXœ©þB´²‰bªØñJz·O,qFdQ²*ŒÕ@lC$‰í¼ ƒ’q‚7Ç´ÿµZ·XˆeÈçÍD6WÝ¥ÕÍÄvˆ²ßÈSÔº\"8£æRØ«iû ܘËTuD$÷j2LÛtÆ…A$"øcA=FHãT,ªÄ¢!¤ )rŠYŸb6©ïUå®6Ïn£ArØÿH©·½KÓ-bUp2K â—¸ê ¬@‡Þàá» AckÄ…U­;;ÙÀÕÅ®oo:ª¬RNùVÿҰ:ZÈÁØî»‚6ªVöèŠQÜ–=ëà\4d.U%¸¬õDf€"³`0ûoI0a²‚ š¬,F¶|ҲƓHè¤<¶(Q¿3A©6X✔”ß©ïÒ “+˜Û¶xªó[hñÁ£çQ“Øãj¯‘úL ݉ç§ÏlIuÊÿ©w¶q]Ë,q•8ßô‘‘JIom2£Ñ“<‘U¦cþi3xþÔ˶ó˜õ®³\U•]3Éø¨hÀ\H¹áÍT·Æø5Dpæd‘³œ|TKÔÕ;ù®…É#à©9íC¨OÅ£Ô„ ]«K¾W<Ó2[2’¤qK {Gó«C#U﹄P¤‚v¤¤OVwe<¾ÔÝÖ´Œ•ÆGšVÄzò$£4ÕöÒ_#°¢5jÇN¨ÙÕ9ù¡²imKÃú׈ú˜’4‘È¥²îÄò˜”“2ÄÍà ¨VK@Ø÷ƒE¹+ë´glœŠû2°<ÓÔjâ\ÙƒT:pí¼,W8ä׆,q·ŠÉbC cŒmXO.¦­&Ìö@bl8¬,¬­íÿñ^FŒÇ,I±9:yÆ)x„ŽÇõ(<ƒLC…Õê óµ-û“$?Äâ3jÏ Ä$`ƒÉ®5.£· -¢Ž"ÕŒŸç]ÇâØÃtØÔ«mð@ÿ5ùć*WrÆ»^åŠNù=‰ñ»’fÕ$Œ@ä“]â+9®ºoOtÕMÉ; ãÚ¹Cî:FÃ; ý*KHîúR[9`Œ¯#j¯È?V™6"rrå¹ÏXØZC%¶ŽIq¾Ùÿ ´eɱNxF#úW­dz}“Ý3†…O*¬gÅeu@ë ‘OpEDì÷`ËS:ˆŒL4ˆÊið+É¡fF   mZŠd—}84xbl’I=÷íR Ü3cFF„²yB–‘vì3òhvw—þUÌZ?Ñäÿ:/Q6ñ‹ËhæVYB°ÆúXàÔ{q ʃŒjüj¬¤Ô[_)m¥ôÆ´öšNK„Îd‘WäÐ9]~¢qäÒrBu#4ÄQù˜Ü½ã^@\„•Hò+Í*àÆyÎ3Sî!ô£ôÐ DåÿÀ£Ù±–=Y!—fÿzk ÁžÁ‡àÑg"T{1Í «+{©ÔŸ•`OÈ¡Ï 4yMüRC›Ü§.23 ÔöËêFI•5^ß«€ð´‰ º–cµA2®—\f·p¯2£Œ’¨Ç`+Ï[¹8b'ko¦X„‘6¦ÂçQ>í¼Wa×.ì\(ä¿â{{Œ_MÇf;ƒ/Œêz±82œcrGŸ’žBRC ´{Ž8§¿›Et(PüsJÆ’‹·¶PòNÿjœ î4H…µÆÖì…¢* âªô~‡}ù,2˜ÖF'Ißj³Jˆk¥‰æ¬Û¤I Ç )XÆàVfóZQä‰Âu [›k††I]X†¬æ‰m+éT“rÁ?Þ®~$‰cšŸo¼h ò1Þ—µé°Üú›*Ç#`ΧfŽÅÜ¡l=XbHqS®˜Ct‘6ņ¬Š£mx¶ÓæiÙÌ*^^ÇÀó]}ÇáˆA#óR{†Û ¿áhÁaù† ~“¤jê'•„l˜,ljp½E̽?§O!,J:|†ÿÍ/m}wgŸJc¡† 6êGØ×UøðºØtÈ!‚v–FrJã»Jæ_¤]Æ(HíÞºøsbÊ–¤QùXü®åפ('8ŠÙ·iQ²|½[´i“¹î1¸¢Áequ’B¹œïûS‹î,/¢%Ïë-ņRT‰´‚{mMÜE5›úW(FxaÃ~ô¿E†òOtêõ5 ¯º0ß[ˆ¦‰Š·ú†>k—›'„ú`pÎh°Æ1Ü¥eÖ.!!g_^>ç;ŠK¨ô¹ºs¶¨ÃiÏp|lϤÛ‘Þ¼ê™W{ž­Îš;˜.bõ"˜Vy›·bêcR=ó\œmùiU¿‰ŒhoÞ®ôN·k<¾”Áa™ð7>Öûñ\ìÞ1@Yv# ntP•  Èä‘F;sÚ„„ƒ†ÒÀ5³¤Iñ\ƒÜ˜ÀJúS0À$ÔøÄ,RÂêšâkµŠ(­}fŒÌI| çúz´ÚêÙbHë§ãxªØù·ö›s£[°ñenYðGÆ(Bè2"åNÙ=© k,†08à ð~hÐDþ‹!uVFÜ7ï‰D-‰˜¹]ƒgQßjRæ{‰æ•b¸1à ?_Þ…1r؆Q–?«OYÊ¢R@q±ûÚ™ñ„ûUÍ [P–}ERCo!*ã`Úvm©ø¦Y¥!åÔƒQÜ”šWŒeq⑘Í#õ´lvûmKo\ØÔ)×›hä\†ÒÙÎEbeRím.F ½B±ê̶Ŧ“Ø£ê=¾jWPülêå-TKŒƒ#ñû Jx™¸ÔÇú~£:¸-ã–mާÕxF©ã5ù‡â»¤»I‹åúXm_¤Z\¥í”W‘} añäRüÏ&*åÔÀO˜znYNzÞ¢Êb6¬*s¨°<ÑeÓÛ·Å@f’ š2NjŠ èØ~ÔysÈ ŠNâá`¥~wïD–z]‰ÏÞtù­c&vVbp¤‘¸óŠšª¨îŒÏ?µ5p^æoZì+Iœ‚¤àÛR²]€tDŠHþF»Ø¹q£ÜhOsF‚0È4¢Jd+‡0j­µ£^Z±8‰‹à? Ml.ø[údpÍÛsMW]ƒêiGáúmžOU—1Æv‚jð §ú€Ðí£XÝbˆ‘~ß½;t©ùfp6?5ÏË—“êªÜæºðí¦X‡ÔŠ[¡­Ê£;4moÆ n¦œêkªÎà"ër‡J¾kˆ·¿¹±œº³ ìÈx?q]\8Ž\EDÈȸœ\ý:¡0ßÈšj)ÑyNÀ†+–°ê¢æÜÐú¤`àœqšÕÏ^žéê­­“fCË|ÔCÆ ›õùšX­Ü½mü\Ìw;w¢#Q?Kr1Í!ëë:T‘‘Í?¢*’Ú²9Í hÏ:ñîÖå™=AmN¯ŽÔÞ¶iß9Å €þeûeGù¦£ÂŒ±ÛV•üD&™r $`x°BB·«» o@£B+Éâ¾¶OJÝ!ÿ¶1¿zz°#PA±„"Æ9ÛŸ4†T\³6IaƒöûÓ‰é`œÒòéYƒ¿Ú½ì‰à!na(ÔtŸšYÚ5ŸÒë#8Ç4è¤Z©Ú“e\€£PúNikÝ•”©oM†qÎ;RÆ]Ø#¨‘³åÔ—GŒåösT~™„IÌ ŒãN|Ð¥‰W U˜¨Øoµ{ÒzQê÷~‚³"Fºœãµ3åP¼BeIj@ËsÛýª›–“þu)ƒK5¼ˆNBaöãûÕ{5Pš»ÿj~Jã#ŽAßm»Ð½EnãPó^LÊP©‡£tPŽTüUÖf•õ}ÙÔh8p=ÉýE1>¨"/ù‹ú $¥˜dÏš« ‰ÙGn(`4ŸLx$v¬26“³m@O(*8™¹¦Sîc°íÞ‘¹¹–P41P9Qj®wààf² •Áây@1ËQ=ŽäçÍlžÔËÈÇ…ÀÍ7oк”ê]mYA8ËûGõ¢lŠ6Æ¢x°ê}cÕ´Žw÷g þ~ tô@š¥$av_šcøY­®Râúdʈ×}þMT¿éÂæÐ…Ý×u®fwÀÎõ.Ârp§žY_­ê7·;æˆöðÌ@8<ŠŒ~›ƒÒÝëvÝ]ãfšƒrGj¬œ}Fsk\a‡ŽõôŒd‹C.Ç´¶ôÙ†¼“Æi¨¹ŽetWöÈxaJ¬ºñjsŠ¥ðǬѴA>¬o«â±É™'×ÿ ¿Mš…KY¹Øžc>ûÔoD3L¯ÔÞîÆx™gVô[ÚêËœƒñ\R n‡4²¤^¬ˆì-õhߓ溞/–ì¥\l¼äd¼¬hM1_Âý<$@7WºL’wüºõ€°J² B9ó÷¢Ïvd¸{‹‡2K!Ë1ä×°ƒ6fâ5ßOsV¨( =žÿù\Ú–8võp¬âb?Ö)Ⱥʶ°oõ)È®{Õy.YÂ1à*ÏDé“õ;Í. p ÌŽGô4¬¸ñªòaRŒ9_•rÕ¬k<>°÷)8Û‘E*}Ît¶A"©-½¸D·BŽ3B#èý]±\‘˜1©ØÄÿ3vÈ' N•]É<šmT1¨ÉíK@ØP£·™„{Œ ÎÕ+Y:Äû”-äTMy$vô“ c-ƒ–íSíÃõFpùâšGF¸ÁPùø¥²Ñ¸?»˜¼…z‡N–ÓIã* óÈ?Ì à¬Ö6]BŽ8Ãõú4RûÐÈp3À®H´_LUIA3§îjÿ 2ĺî+}Ò"$µ 1È«¨ÆÇ?ʺΗ9šÎÓº¨ >;×3q;4- ÿ™ôULÂ?EØ‚A«2òloQ![ë,]Z…é—±¸VC ðpk‚I&ÈI]íb~Ô#Se$rº¬n‡SqŠü霄mAN±ŒŠßØ Åäôc¶^æÝÕ¤"d¡äþõíïX»½C ÅuS»}ÍO@biëadönôæÆ€ò­Ì Í«€³‚RåXcÈ=èî¾”U}Ùß=ª€ŒhÙØ“C¸Ôïê:)`rGšYÊÊQv”!ð{ÖH”4¹ G÷¥înAy@Ï)9¥3úBŒdSSîLáDùßS–fÉ'&°’Ëš•ÿ5Àl£ùרßsUPês‹’n^é ÞÇêiÓ†Ó·lÕ´Q0}!wÉ;R–ýJˢؤ ~bàL«Â“óüª]ÏTºêO¥†ˆ±ô/½s¾7Èä,éÿVV6f®Ó×_V®48$v­i‘£ ‘·nô¤35³’¯¤ñ¿«Y4s¦´@v n?j{ý+ .F7Ù‘çšt}/“žõ…ºh›a‘ÜU››Xݱ°\óŽ*ñ‘€ €H¦âeqUäb|FÁ–ú_VxYd…¶î¦ºˆ:Õ­ÑWlE*ïûüWçP–Œ–RAª½?ªˆ¦F–5Ö§õpjo#Å dx³Ø¦î~‰ –C$ŒJ·v4õº¥Š  Ê4Qã9>s\…¯â èîÆ¨çR¸Ñœ¸ªðu¦êNÄÂÑ\Oö5ÂËãåõ)‘£5×ú¬·1½½š±ú¹j/áÞ¬×ñ›)­4IîÊ=§ÿ5Îÿõ-¿æ¥YÕíñíW)Øî|U•Ö$ŽXÒÖHåŽg÷` üškøÅpð+ûÌúô¦\»±Šff”’„cOŠBâWB@Ó”'†ñNɤª’ØØí_+{«g ¥Øý$ž Hœ”}F@¦”zm¡³éVÖîÙtA¨Žìw?Ö³-®©„Œå°r>(VKoì’Vã8'8¢¶]ö¤5ó$‹ÔöS逧†íŽ(°I‹ü2ΜÒÂ첟h'ëpÌ’9!b75 ÌdjŒ½º“ŽÔ)"Ò2+e˜9Þ¶’©\üV\^ÄY£ 2‚1â£u>›Äm, °OÛ •o¸«ìèä(¹©c©Ùt{c5Ù]_¢%>ç?ûÞ™„¸qøÀ¬Î4þê“È޳ţ<ñüª·IéPôèÛ³·ÔǽsÿýE,·F{Â}7l¤hvUñó]MêÐu[ ªÈp2ìSk¹›çTûuûAB¤Ç#L¨%psúké58xØïŒ6üU[_T§Žcþ0w|© Ä“ëš3/(Û>‰#²’) Hwi7ÛŒÔ%Ò´Qgà»rßí]{ÀðËé•Ô9Ï;TÄ–Cò"ò!îGÃcÁÿÏ÷«pe«óèX‘šlƒ“ÏÍd¡xÁR÷\ïI#aÜŠ$¥cŒ³6Hì+¥ÆµZÅ™w¥þ*¼é̱NŸ™‰vÃìê>û×Ukø—¦ÞG´¦'Æ}9Fíæ¿?éYÌdXøÃ×ìjÕë“jÇ@OÇšçy^.2ôVäòüjm[ÇzWõLº_ïøùXNbÏðßäæ]:ÈW„^+«ü |¿“¸èÒ·ñ­´`òÑöûšRhÃüãµ!{Ò4}Jk™l½óÌ®<(ÿ5ìŒ<…)÷×óØøNÒTwp?ûk΃žÕì,ÃTnò;â£~üCÿšH…«ÅhRJúžLsŸš¹è"k)¡c’Wmü×6#‰¸7s‚rÊÄ )Ô¬ ý ‰eôÙ[PÈÈ?zx`.dŠôñÆß4 å"2ç0:}ý²…žÑ'NÒC&ãö5>âߥ–'Õ{y@ÝOšìØ(ñâ¤Ýô«µ•Ü®“«_“Üèbòìý¿Ú5Z/ÓÒéëJ².N«p¹it(Ê4‡HôWÕ³‡>ÇÔ…¿UYŠ2ðU‡8â½–•Ë‘€MÏÓK†CŽæ…{s q¼%ÊœoÞ¨¥J€jSLÜä.G¼?wÜâ6âQ“‚q– \Gi;‡–Î$±_ïæ¨%¾ppGjñâ†,ŽNr®—Ê/PÙì\$Ë•UQTdÓLÃ#O&0u(ßæµgÓd¹NÃÛÂ㿚úh^Êdš<¶ƒ¥—«ÅÖøŽà• ,$…ÑçÍ%Ò¯<:òH¥>™l£Ú¬£BÑ b# ¾Ýë*êRr|Ò3Še(È6{«[<Kgù‰dL˶’HÒº›)ž[tiPÆçôžE ÷ XÔgÏzfÛוXˆö8?4ÇËfÂÔC`â¶L ìçëqΰrdçKGi$*DÒ<ŒwËmEx…Ó(—VÜ0ÿ4,IqÇ£<“óm˜â&3Ám¨Ö–³ÙÍ–u¹ú}üÓXœRŸj*”á¶?5Ê˘q­FB1QŒf½YAäb‚$Gl+î9¯‹•\ø¨xÏqŒlÜv¥Ìy#QÎõµ0ɯYu.Ǽ52ªxqôïŠÃ÷­ !FFÀPZOã2Ãmj5ž©ÍuÏÃÓu.¡-é4FŠÕî8©·½-l§Hä—Õl{°6µv ²»JNP ÷®Fîã×»’`N¶«µâgÈà'¡-MØ2”’ ÇH;íÜQ5ÌD±£g’7°ºô‰’Q »¨VWÂã«Å©[cãcš ãnEÄ5+ôûswq€Ü…:±¥¯0§šÚ$Vq£˜l»šZyHZTVgÝBŸ5–oÚm˜—P»w>œ*’x¸£e#sÈ©±äÜ›wÔ­ È9çâž‚IwM!v÷UÀ#T šk°K‘ÂwóI,zî6$ß÷¦¥q¶Ÿ94Û\àì4’5y`PÔ%Øb 36w £üÒóf)œ·š=˜d“»75©ä@Åtà“Œâ§²enE¼FTm÷$WÍ7¤]´d)«ÇS(]Î6Ïjœ¤krÙÈ‘æ«M®à˜F¼Sôãs½v}Î>‘Ó=[‡Hd¸!عÆa_ž4ž™Û+œk¹$f‘ŸQÎÕìþ1È¡A¡î-·¿…!…¤…¸Î[µ{kr¾–JàcÏ4n¹sv¤î²0Àj=´ŒÑ_Êœƒ’Y‹»j”dËð¾ $ÐúºC¨ÇlÒ·Ó2ÛéS†cŠ¿O3¨$¿Þš²fY&„£}xaƒJým²Ô¸­K’ÎrÇrM?ù< R§o;ׯ‹©Ø''¡V )g¸nÚ,!ô†C±©¯(¬Í¸šÕçS å-ÆÃõô˜%³“ÍW¬É²dRh ŽÙB²©liÀ§=-=¾š£¶M·É¦ŠäjcBÄò”*Š¿i&_e×Á¦íÛY÷û†;÷¡ÜE›”, §V5Tâ‰ÎªO‡Bষˆáã`§À9«67 Ç; h0wæ¤Z¨i´e›Å1-º©Àl.@Ô˜õ…ÕGî¯ÅÂIE1<ƒQ£‘ì.ñŸi¢˜Øpq@»‰çE¥úOšö5UשŒ„ Ê¿˜`®[ãÅ]Uu. ð{Tkqp¸¶OŠ:™ ŒY´7gšÓŠô œvc’^,PI±á±í<ŠŸÑÉÈÔ fVžW÷(/`x¡ S%4/j%ÄJÆ{í¡õ»…öçÅÕŽã$ö4—ÓMÎÞj|“HÎpÙà…çŸ2¨É;¼ê£b $#%¸ ÃpÊÞážÛö£È«*eøâE ×ÔÊiµU„ JÊV$\“çíHtûMO®r0x<š³%ÄsˆG§À•™…ÐC¨Œ%[Þ=¥¸­Ls"”R͞Ÿ†4M8 ÷­ÈÉzuÍ#žúšMH—òªdoªM‚×–÷4±Ÿ¿Vºÿä+ ¤VìÖKˆÑ‹©Uuô¶‰WÊÜnùµ ;oÛÅ!—V_Ory¦XM "L#wÍ8:DÑÀ·Ê“ 9m?§ãæ´}ŒÇȤê á·n7£Æfú‘E œ°ÛúкQ´µ» vºãàŽÚ±ÖzçüBbm£+Bñµ(ã$ÔIÊRݼ]>êâ8g·¶[‰P vû|£ ”Qg#õb¸¾‘muqÔà ¨`Ì|]¯PÓpŽ‘6‚~œW7ÊN7í*ÃÉÖÈŒ†…W8àb³¬ÜóRìืfY_Ô Æù§ß*HlTn€»”¡|¬P¼JXü ê8ê·1eYwSÉo¾Î1÷¡úVò1õb$Šv7UÂ犚“å2u[C¤¤óC±±KbMÚ’¸ØöýêŒ(¶’HÆB¹Üy¬¼Š[©mÎi£)ªõã÷2zb¬šÑ@\n3ÍluÀâ6Çô¤Ý-ÑZR˜Çrs^·ê0Àzê4׋#“mËÊ€~+Vߘ½fŽYŠ‚1éǶ~æ†îK›„‚ §êùKIŽ,ª²úŽÙ­uà*·1@`lܦ‘G ²ŽO ÏÊÅkªæ¸W8# ž×mNÃŒV/n‹·§§`ØØíŠq7.æü Î{«ô(cÕsÓÿ;ÆÇÜ¿o"¦\1¶¶H€»8®‚v*Úé©ÝB8žÏHÄÕ¸®Ö­A_r<Þ: b‘>™muÔgÐ%1Ä»»øï]­ ¶¶µÁ°÷'ɨ]¢Ëš´é®07óSyy ·Дøž7|ÏpÑÈõ5ä„WfÇý5âØ ±ï^N2A#q¶šˆi¥ àŒž”¥wØö£Ã(žbÅ[JÏjZu,bt;¿±±ØÓ‘‘…\1@74× ˜.lê:¦7Œ+ 99À<Ð/eü¤"H˜jÐÏÿŠÜ^à¤.ïâÔ;‰RÝÛ÷‘çÅL¢ÞŒ ŸABÖà^Ä7Óê‘\Ð/oÔžH›:›8ÆI5fÂÊAvò[ºjQÛ||Š¡B@ï)ö;êJ¤:c±$,.Jƒ¡Þu ¸Þ[8V&l¸gÒØû £uøU­1sÓË0]ÌLrqð{Õ»{_F<'n Þ©D‘“Ÿ59ò^ÿh–z6'ç߈ÉøqYßJ0 Á<íó\z+†Óü«²ü]Ñ®f½vM~ŒYr äŒW5 ÌQ€–€³úçþõuüfˆ,¡ŒÊXˆÿ‹s' ‡p1—o°ÿzßüB8Ô‹hôõ¾ìÚœµ‰”úŽÅËç=ÿ0ý2ÖosE§=ÐÑ«tиúdû eº]›Ÿkfž uò(Qt¡mp%‚v«n¾W¹I Í‚3íÓ½€ÆÖ3´Äök:‘Qn­¥Î¡”ìEuA¤ÙÎæ“R%›€Aàò3E‹#â\jÿÌæ‰Ûa^fªÝX$gRdÊÿµ Ñû¶«•à N{ãeî±'&Ÿ±úX0çŠ]`3p-ØS˜Ö%E9ÆÅ±XäUMƇõ¦'÷f±kÔšÄúI è''$äÓl2FE#wnpOz¦Z>É©~ ˆ/!õq±)k«›éØó\ô3Í…s±Çz³Óº€»ÿã\¸õÐÞ~) ±žJu*Ãå&JWî(ðÉcKPª7Øhc¤Œá‡ ü©Ø?jr1apr¢«ÐôžŸw{v!ʪNÇ…Zîá·†Ú8­ÕNýùÏÞ’ü1dÖ½9$eKƒ¯~ëÛÿ~jÀê8Âó|‚ù8Ž„§ p$ ¿ ÊÓÈêñ:HIàÚšé}ØE!Ð1ý':EY—0Œ>s^)]¸Û~jêr²ñ'P€Ýˆ’[:“ëU­@UPàn>i<芖nëœS(èN¡³E##^È›šmÌIöï÷%¼²»ÑO$.{ˆí_NTH5€A®F_Â'þ*²Z]€É¨ƒI¿cEƒ'¾mÆ)ƒ ‰Ø\& ïñ^kvŽNôÔ P­'zÓÀ'-æ¥/½ÃèÏŒªPÎ|VWJ$vȵbHý>ý¨+(p˯+Œ+¾¦p©û¥õ+«“v½b{a«Ûk²øÇšœÝkþ®ÏxZçB¨s«믊e*[SpMª+ ÆÆ­_3&1@´YQ¹2.a¦Ž6'|SðôðËÁåc¦£S¤¨÷¢Äíø©>FìÍ´øD£éïD* ×ÙÊã;÷Å{€w¤Y˜b× ¦D}±œZím®a’Þx•âaîkÙïC;BPŒjíPú—Vh¤6ñlä}Gµ[‹±‚ÆäÛÞ…Ó •š %Bx9¨éhbö€AΰÎ5¾þkÞâáâUf°˜×]NJîâZŽ„l?"ÎᎡñMÛõ6•?-.IƱý(ýmã…Å”CTŽ5M'löQQÓÛ:0;«ýjÀ>T¶˜ŒØ›ë78ô¤„Á^㸪6‚2±ÁóÚ’»x¯#BHuý'‘KCpвÉçlWŠsZ=ÌÍõnC£:èS#,}§þô¥ýÂDÉ$y.ž>~)ºŽ¸Xd®žùÚ—kÕœj*X Ž“S& f ‚5 %Á–ä1Mÿ馄8â%ˆ9`ÝÍN7Ý-ŠpýÉ=ëiÕ-ò.$ŽŽÔæF#J` öa#žä¯ñK6Kˆíâxä’ÞòOÒ;š0¿ôyä´1Ê; ðj%•…‹]üòkÊ¥ŽõWÜíl¯l ¬vÝB [)qš4#pË6ø?â¸þ‰Ðå..§>˜_¥O&º¸Wòq«ÊK1Þ$?§æ¡Í…þ­qáÝŰÜ8Qnž£&e;…?¦”´²‰,Iîi¤‘eRuêcÎk?—V 7µ4w0Áǘ¦W·7 èlzœwqi|Ç(©ïö¨¸H†¦$šG¨Ç-í«%´áÁàƒšóá\ú:ýâ˜južºLcf?µxÎAßq\…Çâ~£ab«uá6.»‰GÛ±§lÛ^Øú¢eUþ"'ýªVð3(ä‰Ô˯sH^V£’jgQêvbÝÑÊp= Ô™ÿ¼…“òÑ®|û…&:¤6$A ðFÔì^°ŒWêTé ÝDz`)1Ÿf}ËWñ‡#N~k‰é­$r ÅSé#áôk¸YAPÛGl(<Ä*àÄ#îff cÍ+q…rþåcσM3ã‘îÇ4ƒßÄ¥ÓZŒ‘S b(C^DP™mBA`v¥nbˆ®ôÿJ¹^£lÍÑ´6¥'Öºt‹m,uR5ÈçùÑ!#'4f!¸±ŽÛ[ª[¢( Ú‡- <çr)®œž¥œ.F†§9ø¦c„,£Ù ±˜2UÈ—-lú{\Ñ åÆ|÷©qk‘òIePXŠí$…$†H$ÇR û×1ÓmQý@ÊÀ£Œgo‹”¸7ÜÔΡ3V–mrpN²N*ª@-Ð*ñß5›hôãNzu•šLi,ýªª®äyr–mÏaŒÈ¤ö£.@Á–¼Le¤ÂÈÎÕ¸äp¾Öò9¬&JNæd`‘‡Áßôø¬ÈFF½‰à×ÓDÍØ>E+w<‘¨Á G*ëReñ‹Â?V¡JD a¼^ëeR¼çŠIúƒA’X\nTñOD±” ¯!ÆFvÍA“'êu=FÎø*|!,ã(Ãj>ælð6Ö¿å·´ŒžE$Ï IdÇ“¹&56¦&·syè2å7c“€h¯l¯,àcÞ™NµÜ4w%õW¾²]ý-çz‡»ÈÙ$㹪­ø’Êée„J²¦ CR‘\E:”†d%FúNEw0+"Qfòå%²Ë‘¨0#&¹hæžÆýf€áàbTÉù®»$ÿ0y®o¬[=½ö²4©÷`w«üsd©÷jç_e×íºÅ˜{p«2í,Dý?#È¡­ÜEXÒTï\=•³Ž¢²Å;#)ÎÇ]#1d8-š›'ˆˆÔ§S1’FâwÝB8º‚M„è;œU10¸0á–Mõ)ÛíPnáÈ €¡ôë‰-åhÆH$mâªl€+êd!¨Î‚]„,T¾ÂŠŠ„UÛmÅD¾“R——ä6x¦º<¦æÙÞF`Ñ·¸Žô¢§ÊbV3àâ´dYb É¥Lhòföƒ ÞŒ `†jr‚€vWrÆ8ù®c¬O-§PÒ¤®†å@÷®uâ¹n³§zÌÄëöÿÜUþ(·$ò b1ôWQúsáeý/Û÷¯—&a¯qó[¶°@¾á¹šÝűŠ"cnò§.–)×ÚyÖ&yçDiYb(쇑ýiˆhî/"òÁ=Q!`y¯´¶6“zò)Œ[+RJŠãHö‘‘ñGmqT žú’€T:°5ã ` ïå+P§ªà(É=‡zèì:gKÝ1cϦz ™F>ç—.¤ >™'P}0Û’Ãaû×AkÐíì!3Ïüi¿Ò?j¯$KéÅE;¸ÍŤ©ÒÅHO)²ËŒ œLÂîä´’0Ë“šÍ {w N~SÓsôN´¶ÜòŽniOø/W'Q´¸À<…5Ñ ŒŠ±%ûÝÑŽÉw,}oheÔ‡ŠN÷¨˜çë§µé°ÍÒ ¶¼ƒYTîpP’jgQü-(‡U„±ÍîÊÄÇö5.?#*mâS“J»œô“«`¢àUÏÂë$³ÌrUTOïHCÒ/]´ I<çMuýÁz}¡‰À±ËgûQù~B®2 Ù0pa!Á2w_è—3Ènm1¨rƒù¨ñKwù²õJ©b̺w½vóè˜`°x©W¢·ªÒÄÆ9XìLƒü““®ר÷À;sž†ÍÈ9?5VË¡<§T…c~¦¯zm¤Íw™!eŸrã“ØU¦ŽçZ"±óÍ3>r4¦ í´&#·Ž%Óm•]‹wo“G±œ¹â•i]r4ÓÅaî›@Àɪ¬Ó£ê—¨Ü’zgP>ßPÌêÊ0øÇzR+‰2K¶¬ž¡^!œ(Œ…ß#'Š!‹t`!n8Ó’p]>{ÐVrdbdÕð +—µƒ«29¥%»ÀÄ8~i©†úˆf¸ÏS¿bQ!‚¼€k2_ËW#|ž)d„NØ ™Í [i#B$9*qÍR¸ÐRþ"­†Ä"NèŒÞ£1nqCiæ`±#Æh¶p´ô(!Fù4tµW”‡SÆr6¦U0iŒßMµ1XêWìUGqvXcmRb”g}ó^J…Ù´ @np8«)mÄyu"¶Ö°¥¾„Œ¨|R‹€f|¤NjH½‡lžjUÒùÇÞº9 [sÆÕ"ö¯„÷dã÷ª°¾çˆä#}:0–èGÖG´SŽatû¿SP:x?žHq““ýV{tw: ÀÜš›#ñ{2²AG¨¬`"¹ÕÜö­´‘¨i¤p€ Ù¸­ÇTHÑZFÔwù©—Ïux\6¡ÈUö­\LÆÛQ(ªYjT•ÎK{Ðý©¤rÐŒ מ™—§ÛÍËhS_Z£4¦<Œ'Óò),mwê9h­ÆH[kVšYH”»8®IÿÛ]ÜéÊ^CÈà|Qÿõq'L·9,s)ñÀ¥zWKX!H¹sÉñUøøU1ü™;=N^\Œù8¯©ØtHlE˜ò—œ¾±ïÏûU¨W ó¶ÛŽk‡½·•,=xÉVŒ†6®«ðóÞÜt¤–ô±fú %|š:çp\W¹YJiæ…c%Ñže™c ü<ä|ÖýÀc‘ÜVb3 ²§þZ¯Õäø¨ÆìEjŒu€;÷ó_œ~2³µ´ëqËúrÌ…¥P0 ÎÍû×èLÞÒ{WçÿŒç’~«²€‘.€GsÍ]ášÈó1îIIJÄ 6qOÆçJ¦2ØçúT€Fƒœ’H5B&ŒcQöó]&Q( ©¹œ¯´çùRum¥Ê3€ÍØSîKHS øÏqSn‘=Á±ƒ±©]·$K—z˜0$cH&ˆémÕ€È?½8îahÜ…ÆA…v¶ÒÅ<+4ø#Šå…¥ÅÒJ#!Ç:NÄ|Š©|ºîÖâ;Q<Š}äÇÒöý:æGÖÚBš'Mw’[G,±FÐ'^væŒ`ÂlïŠßëøŽ£¹ÁAøsª82ˆÕ<3nEdþ½‘D^s¤ìGë¸+éÄœŸŽõ>êðÆ¥# 1þ”Kæåc '¾ §%'G¼pðQå†õ?CDÄ©þUÐKnÒyd.Ìs“R™pIÀÜ×CRÝžµÐ[,FäÒîŒ$àb¬Ú¤™Ó*†VR5ô–Å)tŽÀšxÌ£ØljSèöÁÿ=¸ÿs;‘½K[ˆâKÇ·fçÿLšhÕQÔÇj÷¦ôŸÍuõý¶ð¶¹\ö_sRÝ3Ž]©e¥mÿ3(Õÿ–?ÖßíXšc;—g:‰ß5»ÙÄó©Ò0¸‰v¥±‹ö5/Üeʱ„m˜ŠuaƒÈ®ufh•¤RCõPÓñ$ÈšÙú—°¬8Ž¢Ù„¹xLk[/“P/ºâYÆÂ2aSúÇP¼•µ,¥ <2÷ûüÒVQ,÷À´Ž5Enyo–ð?½[ƒÆ  Ÿí&É” ¸ šüþw¨ÊÉ } >©>Àù¦–E{ˆ $A¬,qìÉò~MM†Yú…Ä“Lä¶œ lÀ…Ué=.9æõ.„I¹ÇÞ©ÊBfª#÷·è²ÜN¾ˆÆå˜gùU[.9y‚LAÛPØ~ÔÜWv[)»ˆ–Á¦C‚ ÂA òk…—ÈÊuÔêbD­…ôá6í"…ÇÒ«EŽAþÒ£ {ȈéÔû| öA“¡‡´ÿJ€›Ôgu Ì“&®ÝHºéúåiQÆ[|G½™a·Ò3í;Rç¨â4Êç#|S±+®Ö9ÔrYމ$–²,€úR-÷ìk­Ul³ƒC®Y´Êu|y«ý.s5ª tmüRü¡Ëï&ÎyQ¨€A°øtÆN)p² 2F¯=©…vS€™Îkždç¨FEt!ªÞ«{¶F‰ËJiS¸ÔÒBÊf##ŠqÎÍî,‹1wÒ¬ŠSêòs·ÍßP ‡±ñIÜJÎï"©#8µ ´i¨ ±““ÞºqñM÷<Ê;…žä(pçâ–¹“Ô Ç†óŠ^I ÊP ä“ÜVØÈQA"ÔÅwªîJ¾è»…ÆuS²¬¯ ~`(‘‚ƒ|V#·“ Êݶ¦Þ2ñèl–#µ#&0ÆãJªŠ­ÔaK*–Ð3Æ+ו‰¸÷¥ÛR‚˜ÎûÖã€lY‰îTRŒ Ã-îfâX…ëa¸ì)i­ÑÑ¡eÜƒŠª`òrqŠNí›NŸKý]耭 שù_Wé“tî£-¬„… ù¬tÛ¨ sBRCžæ¬uΟò,Æ`=²Fø>j ¶—vˆDCÔ8çbvW(ÍŒÜ÷ÆÊlJÒu+{%ÔÃ$ÿ:…yysÕa²… œ’¾»‡,xÆj¬Íl£Ùî'x¡S±ÜÂY»ž[tÕ¶:¤på—‚1^³úrlÆ­;¸S¹##žÆ¾–/Q5sœ`ëXl›iá¡B##ë”;gHÉÀ¡FUn ;gŠ$£òÇÚK9ÇŠžÓ7¨ÎWÚO9ªy E“ÆÓÅ …6¦=²9¢¥ì¼—Z¡tWý^ ;‰ëv2cÝŠäo.œßjŽVW(xó]5´1ždRV0jÃÕ{qÔ.¦›Öÿ”Bñ]6Ê£‘õr6¥Î(ÖIÉÀïMÆDdnb¦Jb5)Œb”¹—ÓR(9EÁâ¦Níq8P;‘LAf)YQ?.Ê ¦ Æ3 5zæ9YJ§ÐFì*5´.Ò‚ ÏŠv-“l%N• ‚å°~£Šè”)\ã5ÆÂ]®r€Ÿvj½¿UžáÈž¢")yq’lGc6%Ì’¸#ƒÍ Øc ¿íX·¹Y“R«(=˜b¼•ý!¨dŽã=Q£ |QŒºF¬n{Ôù.?1#Æ.È\ãH^?zÕ×QLiSœ€©¢9 ÊF£Í9Röf.Y´²¶A¨ÿ¼¶õB0´aGŽ*%¤ÌŽ;|Õ´ÉQ‘Sä°vet+PÉÁßíƒCšÛƒZÆ+ã&XñH;ž£&]tâÙ#ö5(“¡X{”o]+ÜÀÇuŠ•<1I~X’—ÆjŒlzh,¤ÔPHAmL-Ê\/£2á‡"ˆÖ¶¡€õd9ð´'µ[idt­ú˜|`%‚KY¼¯éaÁ¢ÝÇêB³ìJà69¡ff{¡q‹@¥À¸ÔØ gîi§5Å´,Ö‰6ŽO* <bÑg.€ãÒ©lÊó+†>¶äŸ4¬cìIê=2 }Ȱt¸Œž¹¤#“V-möUÆÝëQÂt®•'#9©«rÃtV8¦dÈZJ!#Ü=²F.¢¢ ŒpWµ_b1Ž Ì¼FöM;=ý¼é&A¸¡È D¸³2èl|mZVc;÷¤må7-ÁRî øíQÿ~!=&‚ܺ—qžy4+‰‚(Ü ’î0ú5 ÷ø¯Îzã_u)óŸOQN]÷ ºƒÇÞ†ìIÊï“[ïžkÖNø¬"W X”|mPÇLº‰¹Y;“±º *%;±Û>iyb’Xذàvª±d*5ÑŒV"A˜ Îßð|Ô[´òM_šc“Aˆ°óŠB÷§K#WK+¯…”Arͳ%Ù«3¿Ò6ÄÒ–Ž)k©ÉV&L0|Ôö»šC‚p3ü걌¹å&lEN£¡C%ÀE‰ Íêa@ïW®–;Aù(ŸÚ‡TŽÖÿì(])¡é†ÖK)–Iæ‹y{¡A»™u¦À]Àk¶òÝäüT€?â·d:Éù‰ìƒP?q_I6¦,IÉç=é1#,¥£fSäUXЋüɲdº_Nè—ˆ¯â?Jšjæáz`éª?Bê—*Ï®Wf@ “¹ûS—Ãpï;2‰Ic ŒšçäG9>óB†'$2Hç ãäUßÂ¥íÜ,pæ0W=ðwþô—¤u1m@n þT;™zű·%eg ?}·¬Ëþ&6OÚ]‹DZ;ô9ÏŠŸzïÈÃûAàUoL)àg¶Õ7¨ÆL» ü×Ïb#”¿˜˜¢Â`í“‘R&dA®"[cIÞG€Ò&6ªq=‡¸µD. Û€TŒõo¢J Õ·`8Îý«!Õ€#Šñ,\œvQšÐ& Œ â—½”­ŒÌRF?â·4Š»»ª¹$T Û·»ìt@¤‚¿F%„ÕBÛ›K‚mãÍe¯!RBÇÅD¾ë±E•µ"f; ç/o/n\4²0|)À®òâ-ûL«Üì^艨“ÚŸ´Hy05r"¡ô Eì î>›ä×KiZò8Í%ôjj<€sí ùœ0r¤dqšZy‹e9RË+Ý·Á â`¸iÉõ ê;« : :ëÎô dP»sÉ5Äu¾©7ç1 퉳…8ɣLj¹¡Hs¼i™WÙŒý[w¡µË¸*àÔ^‹ø’+öKK”Ü(Æ }¯þƬȡÅDâv7<(ÉEÃ&œd)"¹‹i$:æbuHr[ÇÅv—aLàd¨'Ɖ6Œiöª|sõ"2£qÊ­ P*às[ŽFÁÉË#µ-ÆçÜaÁ ,r'®ØÛnýé„w4“îuThò>¡¸Þ°¬¬#Nê~+3ÈŠêIÜ~šÄw ±~r8ûQ€JÀ÷=»€Ëcì<Š“5“óüª“Lϵlƒ‰â†Ò$‰ ëNÆÅuÒön›pFåf±U§qpº€ØÒ71bBéø¯ êÇ£2²é8¦äN_e‹Äü Vê âÐòçlWCei5„1'«¨(à|Ôye hJÛd0ñNtN¤nmÚ&“2#auÔ X¯ñ ‚†þeQJä¶äb––tD `ddïC¹¾ŽÝŒÃ?.ëªBàˆ”¾jR`’pw“©m rh^£[ ¸íE†Ü<-q/·jc¦ô+Ϋ ]‹q¨¶û|S‹* ÅmÍÁ\jI«cuaŠ vÑÛC&€0;Õê¾ ô„©/m.5PïÕ£L0ËF¥2ÿÈÒ·ÔhìIÖÿ•¹…´¨†`=À í¤Mñ¨v#z$Ý2x×óÌ—1/ë„ä¯Ür(©q­TãAÆàQ5®Ö1~ÚhÝ…Àº‡I>õÚ½üðG͹üÌŠˆ=ÙØWÒ[ªgí^Ù7å®Ò@1ÈÏŠ&6ºžs¡±°²ú’,vûrFG #>qS6\s¶(ñLXÆÝë”êÄòh|j5$`/Ð?•þ&‘2¥ÆTpÞ‹À>ݘwó_Mn—äÃ8 VÓOT‘Ô:©2˜´ØãŸœÒât’=d B°öóXÊÑIîQÁ;äWÅP.4ì|UᇣBz=93œdŠ„ìCiÇ4 ®ŸÔºÆî&é|+Üí_[ÿÄ%Ì7¬®¿VØÏÈ4К°a¦~M£6­$RŒgV#¸rŠN1ÇíR­`0¿¼ƒ·»šxˆØ‰õeNÇ|mSå˜ÆŽz‘ºjM'zÒÇ‘´£Ý¯Çz\¹d *Ž;æ°ó¤`!f-žWûTÁ+ñÔPÙ“PùÅ9cs#I1©"<[¸&§Ç"c1ƒÎN¿cMô‰Œ—’#•Êí¤sæˆwÔSrF'¾Ô&@ãqšôO„!†â°²vÀóFŒ& Û³I\Ú¤‰¥€*Fò+Þ¥ÔÒÂv%Ü}1©Ü×)ÔºŸS¾Œd‹x¿Ñß÷4ÄÆ\þÑŠLGª~†Æw0]D#ä$‡4™Òíìp#ýGÜ{Ü׫Óåf2>Y¼½]é€Ù[F$—œޮɕ‘(3pàù€\K²%´D4àv¥eXkc©HÏšÛGê‚Ùîh••Xú¤m'zç(Þç\* £=  Óßàw,€õ$pek¨@Y_9ßö©}>ÔÅj™;àmZ¼êÉlÐ¥ÀfÒr1¸4[7G‚I ¶IæC*Af|Öæu8Ò1É5ÉÛ±—ñ4N„²†Û=…vrIHÚòÛ` ïS ³Š)ÔÃhS'ëÛaàÓ¼lœyžã˹F1É#Ž 0‘2·»dۺǃ’67ÜdeqÚ²§ŸöžE`Ÿš–w” {F<ÍxcîàäU8Y 'Núpù¬Ý[´‘ž8ãæRpÄ5™6Ü0˜¢A:ÏóS ¤ìÙ céŠú%""ñŒ¼GX|ŠÝ×PˆZzцucûkÇ¸ì¬ rä«‚þåV>þG“R!+$¿ÅeR ïš¶ŒŽØÈÏÍ/{Ò­&›ÖôÂ>Ä•<Ÿµ=]gª•ºŸVµè¶©-Ó±…DQ¹®'¯L:—_šXÔ‰˜,gþ(Ÿˆî9wªL¹ŒiUaKÛÁéiaŒãaMññ.%çþc¨IÁxö6—úv™wøaßùf’·S#r¨Ž~¾™Ö%:ýÇ9Å{ld•™±ü2ûíT a±(¦[1lw,ßí]OL„¥¬z—/!ÔÝ«’èý=î:¼VnØÔHèâeG.)^Q @ŒlHÜK©ô‹~©‰T©MÑ×b¦¹ËŽ”½2HÁ—\ê5Üzx*sßïKÍeÌz.µÎAïüê|yÙE^£T(nU9[xŒû¢8÷ óß ÅðäêÆuè²iq¸ÆxÆ(²nÞ× ã½Nés¼¡dvÓdþæ­E°Ûö5ÅÈÅŒ°aA¿Sº{¸§ ñe<ŽÔÿO‰Uýg ŸÑµ9$%5I Ä˜”sFr†Zéhg½ZÌÝtó"‚d‡Üî;×/¨çeÝ$šB‘«•êÖbÎùÂmžøþÝÇìhü\¡‹$ÜH;*ïž-y \I­‘„€c>iù‡!p5†uv/¯N€I«Qˆ6"òuFK–Õ£'b@¡".¯p5e¡¸½@màwÈì+MÐ/c‰%‘£Un@9+÷§ àiŒ’ǹå‡Eõã$„ (·=û¢ÍQ±&áb •yÈ«PÂ"·@'dL<Óˆt®sF¹­ådçù‰A@VÄ=P²êÖÂkWÃcß}ñžàŠÅÌš_oüT†·K…½ó{2mŸ½UŠd¿µõt&ƒª?Ú¤|j§’õ7AeOq;ŸÄ0ÙJ©$O.žJµ}Óú´ýKªG"$l;ŸçS$´dóžôÿAAùÀáBÉû¼vÍ=±b\d¸ÆR½Îˆ"†ÆxÜ׋<3\Ilk@ _ƒGa¨ñµáŒÍêQ ÛW|x®P ÷w=,Êw ðäç9ó^0rOzZKÈ •"yQC…RØ,~(‚“ÔÚÔhAØv¢¤™mñ½.¬¥Ž9v¢!þhHž"ÎŽãÅ*eÃ6Fyt°~); ú¥(ƒr¹Èî+q€uI×·QGrº‹ƒÁ'Š~™H:ò<_B€³ÈË‚M€Fx4÷~„mШ`ØÍlIŽx¥Ó=Ílìjr"Ìר7;s^r èbɰïšô(¯ëz€f%Mqé ë%T pMmØSoo¿-€SP'Î)ˆ¬Ú„<ÁJïî#zBââ!FÆ 9n$9„Âx‹3¡ê׋cÓfº}ÄhN<žÕÀ Vt2¸Ôì™4¼Ýjú㦵”Ó4±±·#³X±“*åvÒÇãœjIîNr‡j”V‰îþõÑGø™,ôAs—Œ/üѹýü×4²—:H÷|v¬²‰ŸÞÇî(_Éú£®§è1OÇO–HdYX›K8®*b#ÂóäÑúeëÙ§&3õ¯Å%y4­4q*©<â“‹"4¾¬BÅ(È œ½d-À<ò|TÞ›#Ê’#¯¸†ªz±B@=©Ž¼MO#r 0I ,»óI2z9!¸ãz$²Ë-¯VGò¤%&D$±Ô|Q"š˜ÍQÔ¸@ 1ÆùÀïEU‰`IÉÅCüÃÄá\jmT­gŽà i œQ2qÜÉz›šÔ3ã8Û"•{\ êùÅV`0€‚ÃXõpåJ€ãlV.B&²"zMo«ÝìnÁ¡Bƒp*õýºIo”+¨®çÞ¹»¢Öò#©CÌI\qþ# ŒgQòMnÖ4.5h敎mCš£gÍü¬Ñ®£Œé¯¨ÜåÔgò“uK¥´¶—vàWQѺ'ü'&‡a ë‰ñB´Š`Š)p…@ÕŽi•}m¢R4çSpk“—È/kêZ˜ ‹œ‡Jôì‹pºˆ9 œœüŠÓ5ä²»“Énx­†á ¾ ÛOÕý·)£гò=¼âHäuqÃ)Å5VŠV ¢ûÑ÷IÔ¹&°‘¸£ FæÇK¿²—ÓüÕ»­Í·y#å‰¨dñLA-Í”þ¬4l6Èïð|Óƒò}K9 et{ùNþßíF45ÂÌo¡%µ¨7%Ã?IÆ jíϨe-¼œüT¹ì®-$ u#žä*åuŒ°$Œô #bsÏÇÅ<ñ39$hS´È]Ü>9ì?zç{zÒ¬~ž>¶8ýªh”ŒÑ/f›ª\‚¤h}ª?ß½1Œê¡„jGýMÍR)WfVŸUûIöŽcvLn*ƒ¨uâE-5´‚ô.}QçlŠ3C,ö x5®AØš¬ ."Ñ#ƒ¶(+m®-Φ}pÑ@;RaíÜÛ,)ÜëßùV c¡äQéó¿¨mäm‡ÒMV–ÎãFcÃúx¨‰í¶õ£P¯§P5w¥u}f„¾™ ƒ¦—Ÿ”Ñ”RzÉ4w)#&O»"ª¤Å”{°Â·w‹Gv_U”dÏíPmî¤yH'ØG)_Xõ¿ifêÐ]@D‡ >—ì+Ÿ%ᙢie8#š·gw/ cqºò<ÒbØH‘Ý(ÁKãµ*ܩ⤠ŠiV<Фևbq^&A:[Íl6dî*º©“ÀÆL…[ÁQ ê]ŠÈì>ô9iö‚~h~áïÜÿjÂ,Cz–¿*1¾03ŽÆ”S(ÔX` ¨–w¥ÕPŒ7cYž7fwŒ ¾Äg½ Š4a)üÏ)e §åIîkkØ]]AvÎ3…} áÖNë·Å0¥I0^@çíƒDF~ÄJ½7©5è0Î&^;?Ú±×oNé3\&òý“H@Œeõ±€8ÁÜ}¨rw»èì’“­X28ç÷¬rëRL¸êÊõ9»Y/#rZS8s©”œœÑ¤šõ‡§é‘–àÒÖFHîCÉ­—ƒ¿]®mž6 ønÙæºY 7W% 'Ö±»O\JŒˆÃŸ÷§X\¡ŒñSzu³ÝõXÙòH:†OoUÊNòc°íâ£Êi»o JgÐBç;w­Ï"B4¶8¥lØ~^1± M5œ0?Þ“#~õ5ùr Èæ³èÛïÚ¶'dŽ+jáôë9ß²ÌA&{ ë=€Ï'±§ÙÇž{ D³ƒL ®.7 ,$¹â&°¬LYF1Ræ·µxîg'JàìvÁÿ5JæúÝ YÈÇNÕÏu9Ëþ^"¢0rÍä×€,ÓW‘ˆÛ\1 ä}&¾¾ê zÝpÿÿHóMÇ `~‚8¥Û§A$ÚÊœ“ØóTBÛ”r‘ÖÈ'Ü;ýëÙµp?z»/O[Õ–L2¢’/oüW3{kÔìeÜHáÀÈ?5V6=î{— ’NYóЩӭ}BF’àÛÞ¼°é²ÝY:GÔ|×Gm ¤j‚06ÅflÔ*`H½5?ˆ®§ý* àvÉÅuR¹ëX³éì…†3ò3þjò6‹|¨.ÛmRy'‘ø®P*º€ß?)@E$6>)& ǽJê.ìÁuóÚ¦[&§—fBë7%õúcp7#½G¶l‚Iû×Gyl‰»´Xr6®nÙ‹cã¹®ž*à@Ü"ÉU_$üVô”¶S7êÎçh,î/.–8”îpÄ …yÖÚ»(‡RÂ|r0Q M5XL¯ˆòý íYM¶ãVèÑÆ.a@X¨ÚدeéÚ§ðVŒ žô~¥é\~^w!e8 Úºxo™X(íÞ¸9”Ç*È ­œ×_jÑÜÁ ñBEíØ÷©|ÌK§üÊ<7åxßûKQ°”eûx5ôaVR4ìihÉ AöÜÓHá€%¶ã"¹,*Pº…ÓŒ€>Ç5>kSs*‰N}2Jçæ¨"£’ªå‚×Él^Lqš~0ÜçzÄ+ÈÃpɸûVm#†¥ˆdãP;šc¯²-äqFù(¾ü|œS­fh. ¼©úǚ襶!‘KìKp5€}«ÅQ ªÔÆ}ÜÒ1LŽ  0ØÑývwâ£`I˜p-HÐF¹ÛlcÅeÂD„ ¯9ˆ’9•2Se9ãŒP³4 Ô±‰[,}°ø>+ØíLWDv£ÛƒŒ q@xÈ;ç‘â³uÏ»°jo#T'¸Öâr#®NuRéVÚѦe"I¿¢×ŽŠàéHäR7Ò\ÊÊËs #p°äãPË´%¸]ÚÃ8Ü ÷ÁÅkÆôŸKîzxW'Õˆ|÷ß9¦[OÚ¤eâÄE÷s0‚•ÎÈ 5ù÷U7b_[ H[*3#Åtÿ‰/0‘YÆrò¾<Õ'þ4ëS‚7çšêø@b^g³”0£(þ»¿ÚϨa¤1Ë«%ÇúOû×I9Æq\p[Mð»Bošìcn-–â!íqœÅMæ/Û˜Á_¨ã5!8Æi X<ÀF 4Y±–Tž£9”†Ñîþu>¶¨Á©HW÷¯ ¥€íš‰7U6ñr0Þs^þêWA.r #8±Å=¼g \ô&rRê#s[b{w ©ÁçjÓÎõ-nxÃ)ÂàV•Ƽ"–dã8ÍN06Ï‘XD³N@;óRzœ"æ2”皪FúNO>ï…ä©ÁÓóNÂiš¢q·2X&.îÎŒwcúi7€GŸwæ«u;Éí¥ÐÀ¥<|QŠq–Îv5ôr¼M¯;œëEÉ«F, ‰\Z˜T‚äó…îiœòôëðʬÖòûI#u=‰ªò]Ô–çWz]‡´6r&œ®x}Í+u/ÚºH264ä2ÅNàù®OÖ4Nr?Njí•á–Ö"úUˆÇj“&2Ã#ñ“89ØÒ“IJ.$Œ0½0ìÌ Q¯P¬Ñê]À;`ó@ºÔ€YTþ¡[šßLm¤gȭƒH$šaÐ`cüÐFicr|,Ù¡ Ãf¶€G#+²émÇÀù¯e (7¼ÒY´Ò Øe×aûö¡8Ãã•õ¸ORÑ‘žÙ¨]JÒIQf?†}Ùðjܘ‚jÝN1ŠO¬‡¦É±ÌŒª?fÈáDk(dÎa ÕÚ r ·Y¿íîp?z^æyZõïµ´r³d8+àS÷xéöQtõm3LD·=ÈQº§ù?µ'2DcÖÎ Öº<¿2 9ŽÚþ-êQ7£:E1Ó•r0zÕÇâ ùÕ‘ç#pb ¼.ån3¥³§=©·Œ4*ØýÁïX||WaDò¨÷326CƬÀÖ’¸†âLUÏ`O?4Ò\È$c÷4âÅ(Œ/°ge§)£–:Fw©À”ò™½¶šãDhå@Ü÷ÉíKËÐngŒuõ!¶ÍS[˜ÓÚŒÌç~;S&çe+ÁäQ®G^¢YU¶dЮ ¨Ÿ8(Aýêý“[t›?ËÈê¹÷HFìMaîD}ÂçŸÛÅJ™rugïXܳ cBjŰ,Ê‘þ!éHÎ¥ÏbR¬Xß[ÞIJ$º£m¿ôW=¢Èà•ÜñŽõ×ôN’–:=j}C—>FjO+$[Ü£\¹ åÔE®íˆôô˜.eÆ)È¡hÃDà·uñTnaI••” õS-l溑„,®ÀgAlö¦!wSA“$%N+Àæzétd`wR0ieÛîx«–˜\I$ž»(Üg>k,ä€p*´Ýêߤ ‰H[ Y“Q:gƒàÖcd{â`ä.£gÕæ·Ðp³@yŠQ©oµ8’t{ÁZâÁlz©þ®Õl`ïö­,ð£8ïb,f5M.¯áÆyC[õK•náô·î u߇훧ÆÖ§[ÜJW!cÒ§¾Â0C9:›Àó]÷Mé°ØBŠŒÎqlw®w•“\n4… @F¨A]$Àj—}c-ã’ONܪsUfb¤•ßµz_$®üs\àÛ¸ HÜ“•½¶DQªü‘“üëÙSÚwª‘²üäoKÍ ì\N â¼vnáò¾äKÈT%Fñû–¼dF ŸiƒTÚÍTa'aÿrƒý©XlÙ$’ «÷.6=·ðhÃkø†$‹‹C¹SIÍd’0/þNõ}àÊA‚(-jªÄó÷¦®b!}Éž›,arJ½èR˜åô‰#¨ÏÁÚ›§Q ‘­ï¸µæžÍH„«ö¹ÔËÕEœÆÃÅrÒjÌŒW$‘ƒÅ1sv÷’—aí죵a° Žõ˜Ð'ó»üÝâ`ú¬FhÍyqp¸’v#Æp+ã±ç 7+GõüMÜi#ÎäƒF…ñ¸oç_DŒ9µ@„dmäV3 ¢m%lŒmþkàAm@àæ½U9Á\}ëæ‰ƒ)V.lÔm aŽç¸¢IqìÀ#mÈù¥¤ÀL)ßï@pâ6`rHâ½ÄR«ZŸù…¤c€ nâçSWK/eTË;ŸMœ`žôí¹šoPûBïœíŠ^$“£Ül0Ѝºdo§³[šÚÒh€´oŸŠ[ÖÐŃ.IäV–g$–9''8Ú“Ä÷ ­-I©HUG+Èæ›{K(ãT…u3 Ï'5å­ÉTÒ„9>yÅ`ã ©¤ž1æž]ƒT‰…Æzu¢Z܉yØïûQ}Ù$ ÎìO4ªÌñD¨Ò†‘›sâŒé ¯`•<šYRíw¹~¿sÔ˜ÕäÜp)Kw]BF$'9Å{v Óz)H“vÁØšÔQ0Q¶¢>’xT¨ì~[Q-î},oxúeþ:r~Ms3Ã-¬Æ9©œlk«Yn Þ€€I‘nØúSˈ–;•Ž]òMýé˜ò6?Z‘»†7s‹§]Üᢵ•î«^ÛþëQuºŽÌªÆáv5Þ&²Ú—añZšM°¼Ó«aЊlaêF»€ZÏ¡Péc‘šõÝÅ©Ø!ãŽiË– LÀ1C¤Ð®bõá KE@«µpè¤ÉHÒÈÞž ð)‰ †8Y^E¨ËdŒ ÿzÚÜX›Å¥èibÙý0u±Æ?•q—W!µ$jÈû˶YªÜX›+~*KŸÏ ú:wMê=:K‘kªóG ñ÷¢Û\É0xœ,jN9?½r= Æiú‚Ï*-ýå¾{ í-¢KÆç gŠ'bjâ0eÉ™K<*YF£J¤÷RA­I5͹ÁoUGb»Š£ l#ר oJK¨‚\žs\õÊIŽR.´t é2®{Ó0ÊŽÃI<…»L1““_JöÈI7)<6õGqn‚]·"5Ãì+˛Ď2NÃçÍ7\XóOëaX‚ Ÿ¹¥Zæöð‘pþ’¯ÿlŸ4' ˜é˜›ž´I8š=c H,w#µ7¾eʶô;<6½XÔ»S±)‹q²òI£v=@:4&^u\¤óŽqAdÃ.‚0;Ó…œjmÇÍbHÒ$79Í$2âpËõ{2ŒQ/.ÛCi!¶‡5óÙK<©"+UÀ-ëÑkÈ%–,œ9ßËf2®nÊßòé¥QTwYäÜgéxÔiCVK"4Á^I©d’n¹3V«·j9?5ZÉ’6#; ŽjEìñ¥àŠ%÷~¶ñTmI,³9Äq!9>|ÿ*ct šz”n§B\sÀOŠ P‰i,GŠ·Óz¼Æ¿AóóMM ‹}¶ñ×¹€TŸÖ­Ö>p‘¯ù©]'ðñ¸Ó-îcA¸Eå¾þ+§ôÃîpvïR:çW=)KÜþ‘曋#Ÿ¢öcP„ë¶ý&Áâ¶ Ì0Š£qžMpÒáŸ!É8ß4äË4äÉ+äž]Ï4ÖêˆìÇjàWCp“- žCpÑpN☖âBȯ'¸ÿ*ktmàb?þ'þ)Ëkq{*G ¥¶Õ¯éù;SIÙžâz¸¬¿âéB¹“;àm]-—LüºÂŽ\òF7ª?§ÛØ[â'wsÜ„&ü÷®G‘凊õ…xµû‰¼eÎc|Ü#R§ž+Ö™W$-ݶ[§¦"¥tÄJVêè3€p|Ò½g«ËÑm„â”HÚÝ'É4½(¡ËqÚ¹ŸÄ]i:â[£_«ýOþÝ©ž?Œreû ä>E ¸z·´’9ÖûB™Y#ëÈ ðE+odgeŽ1–ùñV¿áCÁÏ»9®ž_hEãÌäl@Z\àÿ ƒ/zÆéôH Å#mÒã\>s¹9Çü½>ÖDSðå]óڡ̺” ª~­rw @…-†úsµnÖGeÁRÚN 8­˜P†Õ“¾5úš09Ô *TïÅÛÓPAL’rNs^›P7S¶8¬€‚ðÍEÈ©¬éÇpЪȎ¨Fz –MÉÒ|1 ª òk죹݅WjÀÆõÖ6'¶qÉê qƒYê7BÊÕä9yÒ qóLÅ"Äûå†6©ýH\zO"Cê;v¡–ApCNnàµÅÚÜd²‘ŒžsOXö<Š™bóÛÜÈ—0»)b&`©ò>j‚BÈ51”0ÊIØ÷®» !Ÿ9 „*óß½Iêæ5SÒF˺…b0|íWô+[é;Tù"»HßIÛb8 ý„VÃñuí¼A/˜\®­'VÎ?~ÿ½7Ôº‚ßZµÅ£+,* ΢xÇÅr½B—`Ž^+vÎmäF%½2}Áy«‹ŠÆEd«‘Ô•…kÉn?瓬s]7á˜ÄVúÙ·—p*\ý>9cYcÃ+ «â©%ì140ètÒ ]©IœPJ1)ÚtHŇÀ¯¤l¸ Á'³$íÚ¾yF£Œv®/ÊkpRÝD’¬lÄ“¹ÇažièÛ{³¾Æ¹n™to:×Pl‚ŠŠ«Ž1š¯ ËZ8†Op'ÚxÅQ—RÝO) ·*³û?Hæ–œ3«`éùø¥¨Ø©íEkÔY¡†äR†&_SH}P#qq‚j4¶êÊŠ«¨‘œšé¯í–F"2\`b•´é.“%ÒŒF7ßÔÇ™Q;˜VÌŸeÓ–ÉcêgÚ§·Å4,¥¶œI"…Ô6«‘EDq]ÜîMn[_\厭?59ò‰mÍ R^Å ÷Î=Ý©Ëyƪú½ƒ<Šùì}4Ôç ÀíóKÜLË£™ûsÉ$‡Ðž1×Tb’#q±cÍ$b£´LKNªb$É*Áñö¢¾0ÀØmÏÍÖ-’ߤWÞ”êô¿ÈzSÈÁÉ¡´þ”Ú$JOÑÍ8ý0Oï<½2ê1¥¶ÇzZd165W|SòÃî#éÛ+ƒ“@šÝÙ56ûdbX\Ù;ÔË ñŠÜÈ$ 9Cðy¯b´2U—<Y’ÙᘢÔê•-L÷éÍ;¬|6*âAùwXEØw¥Ú*ÅlîwÈóU"•瀘ŽY@ù¶õ‰ŒÆudO4S¤éÛµ+¥œ®çlS-Yç8ûšAî,Ì>–ÈÆõòÀ¾™-¸Å(³õm𨯑Ža3 H÷î,­å¸ ©Ðl8þt´ÝBm ÔÑ7"Hãa¶{gã4çX½ŽÉI™ŸN#„þ£å¿éþõÍ¢\õ)Ùî¦õÏéjr #“zS¯Ú|ò–œÍ+fG%˜ŸÕžh7V/g¹[Û8¬ÜB-¦Ìr À$÷¯_9@+š¨£ S @Ü•–(u€òkè%‘!V0d¨ópöl1œPb‹DÍ O;w¦©bXcQîs¥wÈÎâ¨ÞUjB{ò*&9½XÆéÇÍX±êQ].–:%tcÏÚ•™MXê·£(¤QÉ"ê]ûšNï¤[JÏ4‘QF@"™W¡ gÅjb¥ø›ãr*TvS©¥wDc ¥ÆÔ´Ö¸rÇçr* #![Pì|RwNç oáE09婲 Œè®Inõ>âbnŸoaÛnkη¡(#þ&£ïñSìn=9‚¹Ê¹ß>|×S7ÄIŸ($(”:hÜj}Âñ÷«Š£ŠRªwQŸŠl  Ô¹“J‘xÏYr‡ldqHÇl ÌtŽã½<Áò5 dmC(cÆøÔ?µbµD&Äæ0ÊšX‚{n)‘:fL(îE+y1¶¸Q¥··¦î3Œ©$äÓ—bLT]¼‘ ¾ÈÛ,+v¨« 8,á´lH¦bºÖ"cÞ€ù‰@VÆùÍo2t`üwÔj2Ï/³*¿¨Û¢£äMM&Àö5:uBe2…ÆØ¯cê–‘€e¸bÉÆ4—¶ê1WRwR–.¤ƒ¨£Gé’ªñœénôºtã£=¼‰sŸäv¯ºÔö÷yš':ñ†sKYúÐ[zÑHPØÕøÁá­~ÑІ‰Z áBùTf·"«.ue—ŒÖ!.­“ó8Žr¹.œ¸¬OC€êTccÙ©}ªiêÄôI &Ãb+ïU I?Ê”ÊçT`êZ b¬¹äïMãP@Ñ&1  ƒè )¶2jF:yäãzÎϻڴA5-ôŽŒRævŽF#Úªrüü×H"Xc29È5Ï~³y­îdJêQü·5r嵉X²¨ÉÇòlå6n_‚Š5ùœ´¯¬³©ÉÏ5çLü¼bVv °+ûv ºÿZ¶YïÅtX+e=­ÙDœÂåNÚ€&—›ð÷N‘ýX‰…†þÓí?µI’r4†ûÖZîaŽlÒ ‹ú£9+v7/Ùu8fs¬¢Uöø ö­õ^S³)é¢J²AÈ5Ë€X‡î*×Oë +k^ùäRò`d<ñÃt,»œi‚Q# BÏu€8Ç5»[ynfHâ]Lç ïÖÎÊyxU5J0켟½)Ò:,7“Î2¶”V/ž¬¨È†*;”º5ƒÛDtb¸ û ´Ë˜˜oŽÕ:Øzqû[*rF“NÁ—Œ£±9Î;×1Éf$Í{;†8Ubu ïX@ôõ=«*WNO€Mƒ;+oœn3±ûÐv"ê ðƒõï÷¬ê7>ÑD’-]¸ø¬uQ€¹ãŠð3`ßN£¾ïJÝYsºøî)íj«–f( ¤{׫pÖ*Çß©G¸ŽGqJÜ4­ºÉŒveÍÖŠ&df*"l|c#ý©Vi§r"ˆQ4AwqÀIÓEypJúÀ\f–îk¥Ž@cö)eË?ÕŠB~œ“J² q;¾j¼yÔÞU&¢ˆ¹ÚŒ$R¸Î?jäSG&XO8ži_Q²@ÊŸ\·40=Gƒœ“ñ^œH#üRhîN7Z2sŸµaHW–É9ÏíZ C‘óµx%.0«¤Z4QjÍñJ:îl"C«ø+.Þ+¢˜ŠÆï¨ì2v§"·Êêq¿™¢XØ62|R9ý§ŒœbT…®d<šõš+XZv8Ò8£\I©n0*íË_J-âú“äÕÔä;ëÜñ45 k$—R3iÛ95Z½ºCƒ‘óHÚÁèÄ8?ôyJ¦¶ù­ÊA:AÁ~ÝÏ%Ýmã^FI(öÖ¾”l«’ çZKr=ÅI-¹ñö¦C´#€r13>¨@g$Ü_ÑDM$UÔ›þ¾ÑJc´(Ûa˜ïXüJ÷ÑÛm ,'êjäµs“š¿ÅñCŽlnssùO:HºÅìó" rwÂsNÇs2ɯJlyÓ\Ý„ìn£rqœWE"°@€e¹lS3cT4< ]l˜å¯Qs&¼{œm¶jÔp—:ˆÆÛ¨®vл‰:¹Åv0ÀÁC`šƒ0U¢#ZÇpÛdƒÅ{pšUFøsNÄ£% ¸¯§Œ(,r~*nPÜMr°`¶>Ô´Ú‚lÜw§=kî8ŒÐæŒ#‘ÎkÜÀ1âOÉt1Œ}Y&¹þ¹Ö¥:¬,NŒK(;·Àø®†æ mš$«89#šŠŸ†af f“sàUX y?¨ÜÌÇÆ¿ÞKè1ŸÍ<:†]6ûÿÞ¬ž—m;†¸·G'’)Ë>‹Óí&ŽXᑤ_ÔÒŠvâÞ0UJ€1…5ìÞHgµ0p  Á„^³‚ˆ€ä-7ÓcvrÌ£œàR¶‘Í4Oœy«Gnš€9Æø¨rµk»ŽÈég³Ü¤+‚GjNIMÈdžÓI;_qÚ·-¼m Éò)aÞx QûÉýI¦mYÈÇœ£'ñ0tЧm¡ÑýÇÁâ‚]'1¯»9;Õ4q¤±\1äãŠÌ§rG6ÓÕ\ÀvÆÔ¸vi4” ªqç4Ø++”À!@;Žô3P]ˆòóJ_Þ ¥K¤¿·jö[U“*@Áâ¾²˜Ë–$*mHÏL'¹g;sÒ K˜ò| Ä$…fL‚AË «¨Òœb° U|ã–Yª£mnpót‰mæÖ2ÊOïM‹gšÓòòåP¶áy"º;¨¡ü¼ÄI²51À湨îçFQ‘“õ`óD¹ÅžÄ0Áº·åâbŽ € l1LúBC†GÍ' ´òÑiQß½9$Ëg°Q“ž1K³{îc-LO<Ñ´®tªíŽæ¹ž¬Ñ^?¨ñi›O´ôŽÙ¢=óu²ò6é£õn«Èbµ±¶®Â­ññ7:áŒYŠ9f%µ"‚¡ôççµmq†P7ÜÐäbÙÞº@z†Ì¹Œ–ª¶JlGŠ­Ó¯ÒÚHÑGªç>©ßW? Ékv }pIªQ£DÌ\dêÇ4YP^¢q9nôD¨?õ4#˜1ÿ©Å“b½µˆýQljDÇ ±n++Œc:&“ý6'XlHÜèŸñ«F}8e$öbh.Rh–lQΣ\΃$@¦AïN›è-¬Ñ$—uBòM-¼U–3çeÇQ®£Õâ‰$‚´Œ¸½Mµ´FA4»¨íæ³ÿçOå”(<騚7R¾§ÒAeò)Á>%â$í“å<‰–:GM#)Ôç+‘Âøª2FÒ6¥8$R¢ëø!ÔiNp?µ.ÒGöÍs²rf- ê;i2%¼kœ°w¡½ÐFan¤¿ôNª4¾£Cµ0‘¯¸Îäù©Ë&5qÜÕ¹Tš-Oþ£Ncu)£‘Îis€TjcŠ40$sš™·³0 ìcI¥âPPì6íZ–äŒf†"eOL63Æ{QW8Òä±±J¿Ä»ÔI|‡÷{†þ)ø’6ÁR{iâ—‚4’vÖÞÕ9)Å2÷ ˆ”À‰õ<ÄC±ÈØŠÙ›ãℲR4¼×Š}«°\nh˜¾&äßĶÀ)»Œaöêjé çÑc¾9Cçýë«xVõK U”r7©ÑÚÎS\nÌ>•9Óó],@^0uR}Û½¼KnH,Ûê7Ȭ)tüV‹‡¸6ŒuBÇô7±¯Œm`Êu¸=P@:Ä$Œ¶ø4šŽOÚ¬õ )žÏéR€´oæ¯Ä׌D°Œ¥ÑîY"|#ã5oòi8ö0*£8?5ÍX,‘“+7ï]OCŒÊ#m¤7æ¤ò¾¶ÀÊ1]Ï-ßÒ ’œ•ØX»¶¸ê0¼vÓz/Œ#;w£ÝÛ°»NíMÀQFç“P— N½Ç‚$Þ“ÑÓ¤#Ä[ÕyøÆqÚ›»Q0äµ1"9ÇÒ1š È5cÛ–r3·3ÜÕ@„—‰AÇ+ZôÉ\d©þu·¹Íï¤"ßV¦åPY4ÛÍPÎE\ÀQ FOØÓfd)ï`{½g@‘½ ‘]™yzCw ŽÀ Ƭý÷­ð@'ñ@·`2§ÛžE0À Ã|TíÜ"75êiÊc^GzRòQ%¼#AY#¹ñN(US#FIñSDâMrI!PO#µ;»f ÄÄ*¤­’OÓÅ3ëzŽºTŒóâ•hØLN]Š“ÞˆA‘N1±ª’ͯºö¥žs­Ù‹ðV‰×9d'uÜgz2™ài#zÐ'ªz$ôÜ$û±úXS àÇ£Xh[úø.x;4$ŒÙ9‘”º¶ÚŽä Ú ?y”Dúâ8•ÖH˜o¾¥>)‹wŠ]CZ«ô¿ûב4G¤1lãµ2–ÑzL§K0ïñ^f¡Fsä´1¶*9ÇjzÕ 5¦Nyñö©©<Öoˆ›RžSì]VÚ2 Ñ´GÇjY `z•$@É…ÙXdVÀÓ(ÇÓó¹¤S®Y²Ø9Éöª6Œ’Ä„+QÃŒw  ¸¢ ÂÒ=<“æ|ó¥«~SG®¿Hn+G¨ÚØÓΈNøÎOòÏÝþ'yõ%¤zOia^\nÛyT´Vã£uînäFwl’Ò šÔÇdñFYsš@NÂà¼ò]£¾ri°é=]Ä#H8ßzvH$/—)3’Hâ©EOÄ F²_æ7êbC“^ížÕ9µGƒœçqæ« c™5œœÁ©×K8)ìgÑl5rÿD»’ë§cüHÛA>Gj6­LÊM-Ó4Yt± uõ ê¤ý^Æv–à1${“Qü|¸ˆa‚¯ØÊ_šXXª —Û8â¦u[Æ„d®Ki©C¯Ï+´E‰[‡·þ(/pòÆž£32Œdœš©*¼>F<‹õ;y KÜ^Þd1ྠŒc⛂ðG‚à-Û±å~E(m„’7ÿI=ÅxÀ¶ùÍ4…i¨„lÆÓ^˜ØVƒH¨Üölâ•hY³ ‘^$Ê—aNhÂî/#µUJa˜H±J¡Üw™W9o«*6­hÄvÛÜ0 ¥xãzY L/~¸Óasj#Ç ~AÿFæX¬£<Ëù;“ð*;uXºt^„E$qï™ÆN~A¿f–ýd‘Ù‰å˜äÔ?ÊåŽ8 ¦t «NíJä±gQŸ4§©}’Y²¤p7H.1ÔvmUð#}ÏŠÚ…Y7!¶¯tàg|W€©l6Õ¥,§op¬&R¸¬\õJðÝëb5àOò¯Š¬Œ4ð+Õ} €v<ÐÚjgÑÜË{X‚‘‚7ó[ÆF¯«zÂ=ÏAL§HÈ æ¢õÓq™¸±2$[Iå{ý꼋#6ã|ÒAäÝeúpyÓ1š7§;ó\–í]Ëoáã}¹Çý¼ÖIm¬µÆ–lvÉý©yc”k¦R´"”“Ô$±z`ä·‘[¶œ+ Ê‘Éæ”S#ï’ 8زçšÂ”¨ÖåĈ;# w§£Weô¤nN€@ÉR|b¹™Nê4(©ú€mÆ)ËŽ~qF¸“ ¥²29¨ßGöû›²ù5˜q–0 )Õ:¶þ*Ú†H­Øzs@ ZuŒ°Ï’‹¤Ï{p­pJ«±ïV+é‚ÔEšè9DP î/È\“ÔÒHJ#aªLì¿ïM+h:Ÿ$ò|:B×Ð[¶÷ÿ¨÷5^Ñ}`Ðê ÁÏ.A[k;˜ŠFº`‘2€;Žyq-Í´¨5.wp?¥j 9biDX-Ûˆ­Â'™eCÜÒþ Øê n{([«pŒ¡‘ö ñŠá:×I“¤ß˜MýÑ·‘_¡Ar}£jWñNN©ÒŒ{ à÷ÆO#÷ÏÈø²W£&òp;œoF¶Hɼ˜ .уú›ÏíUâ‰Þ9“’65W’+¸€SéFñÞº0î@Hã+í,{ÕÞA6ó=ãĨõgIàû‚‘ûWm¡MˆÇšãbt²…ü›ÊØHÓêo·ÇÍtŸ”½†KDìŠúŽN>ü×7(fŒÍZ–¹e6é(õ@ W½xîpMpÐ_õy¯$»x IPéõe@Çmë·†åg¶†Uxãym¶'íA›@ Åñ YÀŠy šÃGà ©íâ˜y&†q¾6Í,N¡¥Œ Š˜kf.ÖÀ’ÄŒë^(dm,ŸA“'+ %Õƒ§Ånç¢%'yÜÑŤ€šJ±»ò6ITÁM>æ8dŸPn(ý=­¤É+ ÇÔ9?q@—Tg+D{Ã#’?ÔÕà õ6Äüâ€÷q€‘³3¡2+‘Œ bWŽ(I“ V{ßBDCH|¼·$–Šn3•5àŒÄ4ÙÙŠÝÞ<òlô[iä„xñSfÜ ŒŒr{Óxˆ…RHD1Ü_ò@rr9 Í¦‚$R]ûïTˆÊ¬<÷ÓU÷. #“Å(äãÜò©h„V‘Û[Ë*±’oÒ£`OÞŸ…ÁBtŸ§Ú§=ϨþÂÁꘂR9Πvja²7€½BÈÌÉ€²O¤AÆ|ñ_av:F6±"†–1¯ ds@ õF,å)7¦ Ž#æ©) óJ 0‘·¸òi˜ˆ'4Õ ­ÏÕÃ&sEx„Ñß:X`ààÐÑð§QÏ4S UÏj[ Å­tuгj%€eÿW‚~i{P÷é#ü è:¬­^ ¹ÆxMD’þ™j%›ÜÒý(>¦%˜šœDñª¢œ.5­õ#+ÿíÈ,ßóœ~ŸŠK©uù$¸0Y¦;{“}x½.…X=Ü»³g:?óUañšÁ=ÿÍÆPAͧ½NôÛ°´¶fö{ý*CÎ3œžÔ+[žsD8-½vÆ*DÎ\Üs>ª¢à±äø„¶ã÷¬ pA\6{(Œ•²˜ßz¨ðIžÉÉÆFçûרºµT‚öŽF›`â´P™2šr÷©ÜÜÙ¬ˆ—Q/ÒÄa×ìhyt!2›ä P`-€ù©Óÿ =W9ão9™3”Á(@ßì~kPþlŇUURI=ÎiŠ8¶ú™‘­5Üê°¦ÑÂù<’qA¸–9ÜÉ#W ïƒL5¼!mñÉn("÷ø"4)ʵ&véÌ=¹xlýªK1'S= k$ó« à p*|“^«Ôf_ qU:tÚ㿈˜ÇÈûÐdR?˜XÙI¯Ä£êiÒªØ=±MCÔ#¶÷y #ÓÅBžâ+kû}$‚Ií”>k¤ü«O …vÉ5TEÝRä$Ðõ>N¦ŽA!ñÿm=Q´lÌ*·}[bgÓâ€(D,G$÷§Í”6êTŽHø®NL˜®€–œ¤ h4t¹‘J:2؃ëb_J@¯ LqKƒn}ʦ&ój}ò_Ø©Æâ>ú†¬P*#šVÿX‚Tû]ÊŸo'Ín9í‘ÅqQþ!ê_›@ꌿO¦«‚>k£I¿4Tœ‘ó^Éã6*å7EQ,«Ÿš>¨‚ZP=©%-ÏW¹t '$À¤‘0)÷ ,ì†3íÒò)Шqî µanâ’s|è qX”>Cäe›Vµ @‚ê o[i <‡IÛlw4ŒqRç9#9;Ö¯¤¾XÎáWåãzq®8¬Æ)@üÏVâæ! bÀQЛ”ôØÿTŸÖ¾>â³¼p€p šYÖyBÉÒAÈn1T(±Sh“¨—XöŠˆCe÷^õå½µ¥²ª_±…Cºýè—7Ii-Ày3ï—Áø;Ö?þ’­€Ù9ç¸5Z)áÆk…BofT¹€9ÕÔ€{qV:$?—³õ$$3œ×cÕ Ôi‰X$ú‚ï ùí]Æ‘èFc‘d×*ëÃ5'˜¬Šôg±ä?˜FÔ—Ô9Ø{wâ¼U°Óϵf3íäŠøH±µg±5Îܤ á“ÒÖXmóYUMyQ¤“Ú²¬ŒòC+gõ‘ZÐtœÅTØ)MÁ*8½ôÕffQÜŠËêPÇȯ]ŒŒd#÷¢ž"iÆ= ` 1a4R ‰]ÁDzѱ╂VŠí[q“‚>+Ü9 ‘rÜÖp¤•>AÍ Z‰$ú›HýTÂI99ǸõSà [m‘’I$ï½H\¨ŠäÂ&ÑG§ÐP^'ÙÁ56ó¦IГéj÷yìjפt¨{FÀoŠñ}£ ‚x4i”®ÄõÎnîY·–ÒGjhÙÎìŽ Ò‹ºžùàÕ–èÖ7 ­–Є6Œíš<ñ£6•úÊã)äŠD{œ¸uIZ@pØÃ =º©‰H#~M}Ôb{iƨð²wÇ~ô¤Ú˨CŒœcâªuFÇðå÷!çâˆàË‘Ã8c1®¢IæŽÓF€ IïPŒˆ–Ïm)‘2ѰΞⵑ]Y݆ëOigƒQßÍKšÓÒ¸’DËdçOûU dÑî$¯ˆ×èYÏÎA‰^9!!°Ä¶7àQ­} ŒllÕ›”E\gm†õ ŽTaö'Ý.{+;{“!)(úƒ%ÝåüF;k§†à˜µcÔÏÅÛO·ÑØ‚3H]@•l© Ž~)댸•¹ôâE¹e±a±Õæ€%púnõK¦êë–Z¯G½Æ.8'Ÿö<ö¢7Jé«ê…3Á$m¥ÃàÑ–TÓ@û ɵ]GùŒüÕ ù®b˜‹rU$9àcµ|¶VöÍêFí3¯ FÃæœ†8æOH¶§c”=³@î,Q‰‚ÐßqM“<® ‡–UrS;íŒæ¾i$yNS „-ÎkqëwÕéh9Í¥>A§`/,‡%cÉ­Éd,ÞãžÕÌ ž÷_tÓ¿ü;j–ÆevnC>2Ÿø®QãxãpDˆpËà×é·6¡–5ôø?¨ò>k’ëÝ;Eñ ÀMÔ¤Ÿù‰ãî?µv¼/(±àÆæå¥¯rÊçÕ¾ôH-6¹0oˆÖ¬“+³a ïNÁ,A:‡šè³ÐÔÎç±§´àŸÒ~+3¡u'WÏj<ñtæêŒ+¡ Ƕ)Kù„×ÔJæcg.Òdž¸õÀfÀoÍÄbHYpAì1IÙ«;$€ëU¦„9+•9 ÿÖ3¿5¨ö9ÏíL,7ÐÝG€p }8ÈÉ>>(°K’0kºF05‡„ƺ׎k4e(BõÔ¡'W´ö£ú"VÔ$R\†À#Ô2èilÿšC)QÜ FŒJcÐÛ•ü¾D7Ú™¦ 5«í%:~ªZ±EJ¿‡}°ÊuçUt˜<ÚuT^šÑØØ»ÈÚ}FÛì)ëk˜g`оãr£bjl¢Ø™>AlL¦XçØPd‘À¹ sZYµ¦xûÒ’4‚R{i 7'ãõ0 ‘ŽÆŠ’•L°Üø®nÅ‘L`e”é8,€j…PK”õ!bÈxqMlL‘0e@ì͆8i{¨•âu'gÅH¬¡ÁV&udĸÓÁ¤½M‘ÒI΢Èt®}EÁÕŠø–wþe@>í àšß¥œ’®á[m,N–_ŒV-¦ ïLJ‡ÈLÿMê˸`ÔúâbS!‘–P¸g½s]RWy¤RNßNMtc$¯!Òt'ø®rVrŽXžN;Ó° Ùžmˆ‰¨Ö£ lÕ€pqÆ(ˆ­œ’+ `bˆ¤l§jv†RHÏz^Ô¦Œƒjg Ê„¹€F8Ç4Eœc$Ô¸gtPV¤šAOâ¡lva„¼» LŒF5)"f˜NÀkmÆFt Ôî.¿ÐMSŽ *ç}¼U±/óÙ·3«ÈÎĨBG·¿j$K$Ö¬~¾;Šn(Ü)}`¯|S‘,5´ZœÿZCeÔeБ °hÜ0Ëàxª‰[U a³î>hÏq ª©…#ïK›‚'TVöc8 l’h:¨UIkVÁ#“[GÒÌryíLFm¥´õY´•f¼ Ãùƒ±a¶¡Å ¹üOrVèDNyªb(ÖU°7&¡Å#<­êáTo•¦VûÓF9?NõçÆL&N`T$vö¢OãZÃ0nì€Önz-´Ò+[7#W·â„&.rIÓÖÒ6B1Û±¯32 ¹ã‹ŽÄãz¯H¿¶ê‰yÔÙUÁ"åŒö¯Ð{^¥h ²¼r¨ W¾¦«(d;w|ŠZ>›9ü¦r±çe?­åüŠ꤅q~«Ðì¯V0Ú£’#ÿ1y?5©}’7tÑ6¥'±©½W«Mm…¦×§ ¶*õ>¨XáÐÀ T¢äuïS87¹Ùܬw(®œ/cÅ.š“êÆIÎz…gÔ¯…³Z!6r'"¼ˆ:…±oÌYÃ0ìT”ÿz‰®„z¡U¹Ñ+ª¾áIà7ûÑTèÕ©HÕÁì~ƹþŸ×c¿.óY¼6݃oñT"êhˆ‰ÐyVSûP¾&SDA \v{»K5Yf™öòjS¨õ ›ˆ£6г[‘¨·ÛÅ ØYßÊ^E+~‡>Ò~o±¦ÎmÛòó° ûtc‡¥¯fjsleE:4ù(ÞràŒvÏjõ$€`äkö#æ´åâ-!l êRw¨Û³žÊ|ƒ c ék‹ ‡ˆ*ŽþîE5ùüK郸Ǥ¿Žj¶Hçjpl‹ê糕Ü0º–‚±Æ3Tn­ÌZ3§ƒÞ•·u~¡©É “µ:òÏÑÐ}»“^wn@Äü|ާ°Äïgls¨!^Ê!öâ‹õ"v.rÞh{ƘbŒ G+0ÕkQ@¡+¢«m½|oéü€ÇÅ"G+&{VÖ,Fœ.0§òüÇ®5Y˜¤AmÂùï^«1c"c_s_4\"Üb•È’2ºIïæ´Qê(ãØðvø€œoœæ‹â4†5r[œqSä–UpA!4³Þ´w€¤z™—nÛSP›¨cs¦OþDE Ù¶;רú'BÝÜ'é,6þ•c¼¾Ö— ùjp?óT!’[[MÙ•´ÎÕœ¤äW¸ìñG ”‹§¶'9'îkë׋l¾Ý™cQßÒ;cÁªW[ò¢êw8W÷¨aõ| üÿ«u&¿»‘ÁʳdŸõâ¨ñ|f|¶ÝBä1‹iMš;>˜/Uµ´›G÷óPŒ¬]É,Ç$žôýåè›§Y[ŒÀ CJ·Šëb^6LFl…ÌðF@ÈÜQ£È; ×Á•Yqœcq戒ÄßúQ137é\wÍLè@|`ù `„3(ÎÃ4X–v)¨Í(Ì¥IªåD„ ?ôÐ%IYJœ¦9ɦ±"•‚…ûw$ù S …ÅI‘¿Í1¡‡b)Yœ&1wô¢[6ùÑÛ¡cÄhSYÒÊ7Ákww±ÛÂ]~® ¯Ë‰†‡W_â]I <ôµÛI=ÂB€²ƒ©Èà}èöŽD‘’w¦NÎ×r"9À5n5ûÄÊ(èŒÏ3®{iÞ…rÍ,es¤°¢Em¢ƒFX 3ô½ì¢(òÞphÝÐä- H²Ì-ehNதâe϶Oè{fë§\\Jd‰•‘·]÷ §Me O2£« ‘ûWM ×{|´"³ªÄå]€*1T¿uË«{øl£÷ÛÊát7é'¸ñH\X\Ï (‹,‡b#9Ít‡KbÿŸ¼M3(þG•òM{;â=Å"ä9~‚¥{‹‰²Ùß_WJSsÛ“uÛø¯ƒp`+…ªÚ¨¹K²´`dŒoÚ·Ëúx` š±Ô2½üŠÒ8 µâŸJPFÔËn #Å}gbŒy 1``äV=oâ! ¦@ÙÁïKá Dj2òˆáŒpE+,†VM‰nr =ëk$7ñFYc%lœ¤dþô¸ú‚TÔbÎù]t÷…ã"ŸWôôɶm'QŒL4.4œïTmî½E ö“¸ÅI—±ñ.QLžÂ¡½òŠ®`z0Ó$hQÌgmýë2 …8<’qSA’YM–ôÃwl†"©#é%ŽØÿz«"º°Ô륆=£çKßÙÇ=ª)‹$8'Ooš2Ç訶9,˜elg ÷¦9VPG÷ƒvb}FÓ]©“>à5œsý+‘¹½f`oØÚõ YmÛÒÃh:dÛé¸KÈL2ìFÍWx;”~2jPIòúžÒ1Œòiˆ×,U½ÃÆ7ÂÝÊéôÄŒUž‡×¤­¥Ë I²È{Ù®†_‚rXµòT·R#"¬gܤ÷¬º2ÝHÆp?•|Y[éÉS¸šÑ`¢BXw9í\áwbÒÛdžE`äŸÜŠõ#.†`2üÖÜ4€ Ç ñCqéÇ©ä.ØÁâ¨[ÖæU)˜ÎNÃp+{ ÜÚ€0®¿IÇô£r•'改Æí‘µR·zžrŸ~l纴œ€²(uñžþüU¦Š9‘µ6¢‹¾9eÿÅr>»'T‰³ÃàçŒt°Ü¤+­ã]˜ã‚?‘¡Î„7!î/ ÑyÌj¦2°ŠÌJ‘Oü=8bÕäĦXØÙî;:Ô„ª «ŒþšU Ë‘7sË»ušSy%ÿ‘^+‡em^ÕÛÏjkÕ`ºpGqI<¬j ?#æ‘QOã\‡QÔ_V²¨m³“HÝXÅè€Í«>{~ôuŸ}€q°¡ÌuBÁ˜iÉÅ3ƒ"ÈvdU§^Å"±1êÊ©Ô3¢b5i%Hò;TkÛ»VÌeõ1ãÕÛiR÷ $˜ ˜÷ÿ¸U91þ!øy@ÉÆGš1Ò@$é"•¸éòI«Œ¨$õUw…‚§ h²mÚ±r°Ø,þ*e9ô„}]Àȯ®áNu`¾*Ü Líqm*Fq“¿jA¬…¹Ì¬$oV.tiÁ>PH¯ï%d÷£Û]Énà tçu¦#”ÿËóBhÕŽÞa…|wÆlÑØ\ÈJÈ0Ñ㟊²Ò©KÆDdžÂ¹nŸëÚÇ¥†•#Ú Zƒ©zpxÂ0TW>/µ¬ì!.€žá¤º{‚æ$0Ç|WŽc)³îT‚‡ôŸ½kÑŽsêZîqŒïšVÝÔ¬‘°ú›r– zõ0À"¼²“|÷ñUÚŒúI©Ô}GûÓvV6ñ  ƒQW4Xí„L]ˆeß8=«2fêj(ÀZD¬JÆw§¢ˆÉPÆ0Gõ¬°I2’iÇõ§WHq±â¢ÉÝÃc]IñÁø­¨Á4ÔQTpW¢=²N0õ¨ì‹B9ÂŒJl€ì™¿ ­™ärÈÐf3¥Ïô§­®½;$ᇦ ,{Òqtù0K9øÅ-×'knŒ`Œf:6ì9?Ú€ªä`‹ìÄå*A©;¨~"¼šGè‰?QÜÔ—’KÉiefqäl+"B™8pÔHU¤%ÁTga]Ô˜—ê$ŠÅAˆhض´pc` [¸³ŠÚ;€ãèܱLJ€ž2£¥ˆ†‚’GÂê\Žù×ÒH Y‰sãúQõ+?·PÜF‡Út“à ñ^xÔNÔ—,®qœä^ú)ŒˆÉ†ØŒU&QJÒÌä÷ ÞO ˜ð\'S}¬@+õ£9˜.Ø.?zv9W¾kËž˜!v©`X‘¤ì)l”8 ¬ñ}¬Bs]4¤’È£Â˸À#½MGïLFå>š’T­üºîÈÛ‡†qš,K¶¬Q] ™Höœÿ:Ew)L”5 @UµF¨DUÈÜãµOü«0Ô˵DkV…€nŒkQÜ,«–#Y±½Ýž.„e{ÖŽ—A¨øÚ²co¹Ï4¾V*$ŸRµ¥á“VHò)Nµ|m¬¤}Ò{F *.šÖOrà1摾¸w jÎ84)ŽÞýD:Š’ã…‹qVº<þ„Â2ذÏö¯ 4äýmDke wþT÷ÊF ¥Kž¯µÆÝÚ¼YÄ·ZuêLp*]¥ì¹ôÈ$‚cȦ ›LúŠ©lîØ© •Ç…²Dbý•ã>òtÜRá¢ÔŒÑ*3Œp@¯ºœÁút¯§Þ ÙR[d}I#8ÞÖâÝ 1Éíýh·Ef ÀÍrúQmÜÈØ=†y®—C ôò/8Æõ úŠ[„`GÈæ™ˆÑ"bIÅm¤ ŒÏôd”˜ÜçÆ+ÇÉ#~+­ÄICZ–í2 jØBç4 7&Õç4ú!TÆÙñP9¦2õع•$ßÅxs/°wäø¡O.ägŽ(8Ûç½®õ‘l1œæŽóÈÓ¸Œ«Én&v©÷Ç'¸¥¨.w¯fQ–ñM£²·ñ;b‡ùÉ&@žø>jtAÜëL6µŒ EÆ£P’ÁºššâOCF¢ &}aÃn+$<‹÷¦-­ÔÖäÿJ?ª‰™ -¨Xf7£’M&žOÍ4BܸÐ8 ƒH¥¤O&uàüS³7å!%WS/jFB§Bxl[G.ƒvÜy ºÆÒ@aäT‘|þ²Ê2uÎÔe¸ûº³âa³<2×R¢ªåN@'šn®ãO ±¤¡ D8É<iø¿‡eC“µI”ÇïÊI]9ú¶¡;zD²œ)XäÕ +ŠG®ÞÝ[Z+Û•6—ÈÏkŸH•¥ q劽º™Ô³äwÚŒÌe r6ý³]ÆÇÚºA£ÓÂÆ²Žà š›{Ó w/úoάǕFˆ„Yˆ¨nmqƒÙqTF‹‚8íö¬ô[! ‡©!Ä’îGG‘úp1ôQåpr€†ŒûÒÓEß4ZCéèÏ“_D³³}@q¦—¼¿’Îãò±²´ŸSœp<šRMãnF„0tŽâ¶ñª€ÿéñS_ªK 7§n¡› ­ž îh7RÞ~T¹¹ÖÉÈTÁ#ች̘ÃÏuJó³aHÈßúTAÕ5»3-ú@“žê[ù²í°áG˜·´Üg½\¸Wûw0±=Fãês-¹)fÎF‘µ{owÿχ$+¹Áh±Z,›ÊøÅ9N·³•UÓ²–?íKä–h@cCr­±˜HEþh`µ’K™6E,H;(¤î'šTôí¥Kx°uIŒ·Î½r=¬5ïÿ&&Ý{÷Žæ‹4$„Y¹òõ‹Nºeè½JAÊuY\7ÿi»)> s7>ã¦ÞIkuIc8#üŠ\,—_Âe ¡Ù¼Ô¬ýAÒ´­«©X¦asÌÑŽTüŽÕÝ¡ŒPÿŸ¼.ês wA½i‰+‚¢‹}''zña‰ø‹‰H?Mm˜ìqñŠ0Aºãc^¬J¥XBXC G¹ŸH(ÉË}éÈ‚G' žàPQZY4=ûÓ^™ ä oÏ4–?˜Õ¯S^°$¨à~ªFi—xÐäžh— _hÇÛ½/ eäÔÇsZŠÌ ŽH˜–ˆ»×ÑHi&©ÞAéLÊpb œ÷©‘2¨'8¦+rY1Ѥ½d„èp>Ô»,²–WÉ;ïHA4ª&`ÙØŸ¸«6ý©uU€X#qËÏíZÁql ©9z“f‘fÂäà|׌†[Aƒº6â®ÁøbåšK;0ÓQiys ël³I‚ÙPŸŠ¡'Rš>¡•Àgõ×1¾0Tø>j}ÝŒz••˜2î z”°ÏvWu<0äTí\ØÀ•˜”—Z“§‚<Õ» \[(”`Ü.T“°ñQ­ÄwGêVvIÜoó]…Õ¸h–4J€Æ*''ÇÅa8ô$õŠ]Z(Q±ÎÄ-Åä6–ìÄé ?sGÔ¹IXn}Lùï\¯Q½s¹RJdíæ§L#W¨-v“úQ’õ°rï„ûÔ¦Xdb›¸|>$æ…iFIT“Èß»¸ÀEÔjWü4â%vüÈXIÒë¿=©Ùç !$eNÊ$†(8G`G4 ®« q²¦mƒxû •±óÉÈÅFÌnn±ocm¤¶¹â5ç÷©½2ê[þ¥4Ì4†aÀ¨ÒH¬ä¡'>k³°¶·‚Ü<(?9ç4çÆ¸PšÙ‹V.Ú:”ÔãÓ‹ Žõ‘d&©H•‡c°–¼·†<Q`ÿ§b>â³mv³HΚIÙÁÎÕ "X+©ëC²~“œ)9zrJî·,Ï eÈùÕ@G'Ç{Ò÷C à©ÇšÜnÀОd "æêסÆ%°éèúˆ+HKâ±â为ü´½>Eœf7 ýI½)“F–ƒŽôºtåUvƒÊäaÈÉð¸ØŠ7ù¸¢Ž?A¨ì×%0Ôñ_ ZRWÍ Êú¢,{ˆÎæ…,·V¿Äü¶UyaØR¸¡)*8é#/<óµeæŽÛN Yúi»g[ˆUˆ8¯®lµ&¥Um¶íHqh\ǹ«oNuÖ7qâ±uo¶¥Î?˜á‘BDÒ$~š}#+¤ŽÇ$w cÄØ0Iö$¨•£mýÀn ? ºzj ±þT½ý£m¥ˆÇò¥Õ°=Åv£ âãyò”Òdgl~œÓ–ñëS±V`v¤lZ)@ÖÅ_õx«ÅêB¸î;ÔyI]¼­2³´p*:Òyó÷­©ÅcPcÇÒ1^ÿ ‚¾ÖÛ€y¬gi„cH¼šŸRhØ:PªªƒKié °Ðå<•î?È¥‘I5ò;b‹©Ò[ n®6#À¡;Š#Q+û“¦8ã2¨•ç5Çõ9 »6äïµw½E#ü¸¸”nuܫлƒÖ¹’bV5c±oö®Ÿ‡C¡(Â9 NVkb÷eH-ŒÖ¤³•\À"÷÷z³CÔϰç ÞçW,1›™BœîAíR¯$Õ°\ØSȬzfä)ØüRBQ«Ò <×/¢}Ϥ_qHËîAÚ¼ž=¼æ™*É)Ô gÅ9soEU;çzyÉDOFBŽÔ™€âšõ­mþXòÇ‘O]ê¡R ˜Ú¡\–w$åNFù‰T ¶²¬Ã8mIu;õ"ÉÂÿʹò®¾ÿvÜb¨YõI=7³¥ÁÁ­|$ ]ÈÇ’ñmN¦×Ó8X×Ó ÿî+p§Yc¶Çæ¢-ü`ï3(ä‚8¦&êÑdõ ]€Î*/éÜ5ˆG"wµ¾9G$§ê>Õ¹îH8‰ŽŠæŒorØ{‘l3çêøÅVµž×ÒT[•2NæœØBï¸8rìßR’]0U,¡ˆß4ÔZI0P#“SĶh¤µÔ\r[qFXÖá°¼oíå[ üT®‰vD¬:d¹¹–à9|gp3µ5ä¶êÚÜàãÍKúCL€©É⼚í^ÙQFñŒçÈ 8ƒjµ@=N’Ûª;E!r éÇj™v·tÙËüczJÆóT'ÓMOœv§ÿ2±Û¸™‰,0AàR~?ô=É2ªÙHa#1û1†ß$îMô-ŽŽ íSл UæÎ˜ØoŒê›êIU¹ñVÐGŒó¿ÍÜ,°~X6àý©"vãF·F5éqƒ¿Œº˜ã¡DhÚ±ÍK»y!‘¶I☒à»êgÓ£“@‘â™XË*ë±RÍjç‰,.ÙÙb‘K!þb•6êë¨ÇmhÆE•¶ì¾iëxîê8mˆ,HÛ¶õÙÙtˆº$>°‡Ô‘´…wb| þHÁ×gÔÞ­Èž›%¤·r eKÇsŽõ)äŽð±'qÜÕιp°Y4DaåÙ~Ýëœk|.­d~]y7ö‹Éõz^¦½5än;VHËûI¦åf„Å6=Aô¾9ø45 «Å6Èîh£ÔÒ9¼qM%À8à…ÑÈö¶ -¨÷5õø‰^ã4ÊËúÀûñHEnʤœ÷­­°õ;ýé%WóÊ!Y‘YñM,/ 2öì{Ô¤GYrdqT"ºx† ÷c`jlŠ}B¿ÌQ)ù]D@€H©Ö‘#nI$ñZ¼¶¾¼”¢Ç ]Z·Û4õ•“ÛõðŒ0@æ›a1Õî,+;u7ºˆÆTöñ_NʃzeÕdr‹ˆ‰Ü6¬ËÒÛÑq’Ì¿_;ý©ÅýŒ7FAÔRÔrH9Ò "›Àa©F*gM‚xZoR6E;’!Á^â*ý´e>”&Ô´Œ¹ ¥ºDì%»þ‘†ɧÑÖE!† /â¼ IC3…Œr»óQ:¼Ï,Œ¨Ì¬FaÚº+8ýu’¥q°Ïµ@–Ùã‘̨±$|S±Ïø‘ë£9“ ÛH 4GYV˜¦•c€|Ѻ²h2yh“ó‹TáŠêóú†3ŸÄò*±Û%ÑgrE9#iB\…ûšBUºã"?·5„¶‰I}\’sP²‚l™Ñäj€„ %„!±¹Å5•9`(V¶«ü®ýÍ0-Üœ•öÅ‘Ôv,œFÄ`É¢U×;g÷©ÅN½¾)ԉܕtÓ·½Ìef'ï@š5)9q±º‡…ƒ =ñÞŸ#1€‹©œž*T,¢0ï°n)ë72€"$ŽàÐdå\ŠZÛi‘œ¢„c¨Rô™Áf‡‘ßæœe¸Mð ½§s[†F$<j?‘Á°d¯÷Üœ-ºàý¨W¦Žôô6ɃBŸwêÎÔæ`£ŒPˆ‘b1™wãš§n¥Ð˜Ÿ?ôšŸ qLúXœþkÒì$+a†+˜ã–¥@rxÁ$Užæ§ÞGë[Ï àbEÆG÷£¼Ì £o§ù¬²d ïB–¦ç¸êŒå¢ 2’0Y☷ubWN1Þ•»¶6÷N}@Ã<üQ-Æ¡—8Ò{w®©‹pO¸Ä¦ÎN[ö¬³ú†3•;àÒ†|HÚivÁÏzeeú(Á\5î$M;„Žpçø‰‚êv 49‚EU##¿jù-æ’UVR¥FjƒÚºFA$« –ï^$/Q_Ìú×"™ßœÕ+Y'Êv5 —Œúr!Ô6Ïb<ÓOx ÆØ Èœ…qfÁ¸ì¦…3C|câ§t΢.b0;ŸR-ÐŽJÓO2ª³»«¹®[b(ôe*A ¨_% ä¯5“4Ï¢0C’t]ÿzæ¯o'–ãZÈcÐrN1]/C¹ª¼R¦ÄA”x"›— bNF-rLkКۨ&©‘N1µ8Ä£8*FM13DÒ*²ç9 ÐÄkêh@à朅€&h:™g Z0{n{\ü½6k$Î…”6Òœü×C,qàƒÉ=ëò¡foâƒúhñä)׸@þ'Ö/’[hí# œå±Tz1kËW¸ êÒÙÅt‹mjÑ"G j£Ü=ƒbiIú\“ô¤'$¦0Þr8ÏÍYýR2pªš‡‰™ÿƒÙ“üX£.Fu§ûRFÞ(ä0Çm³ÅRô°‚=öÎi?Ëúní’rx©(äݘЇ„,xÆÄ÷ïEcA½¹'ÏsI$޲é#ŽþiN­z¶ñ•V&F;ì1P³T– ¬u–3iÒ¿¬Žÿjå/5he ¥ŽÙ©‰.„€û±ýÍ,ÇÔ8 ]œ¾1JD(HÂ/õ¦l¦{;¤¹ˆ‘,ds^**¨Ûq^ê\#qO- P¨ïZµ‡óQÞÀÃv¾¢Øþ¡ûžAÎ;U;boúEÕ£¨×l}xpO ?±©«yÛÅdñ°&I#`5ÚZ›Œr£È¯•›P>Üã4ÔeUq«o8¬-]O¹òÛ¬ i÷0žiiÕË–'nÔÁf\²¸ öÅNžbÎȤ‘Íy,™ŽÁÀÌî8Pj¬ Œ6Ï|žÔ ;RqÞ¨¬h1«Ýö¬Èþ„RvbD4–ïlbƒÒú,’.©¤ÓaúÚœ›˜ç×O¼k‹¯E“p3¨R˸ÆBÇâDzq¡Ñ,Ã'£n£}É9-÷«Ñ[iPr3Þ (líŠhLÕr2Üg½r²åwÑ”²?QSì&¬cùR7ݹ}X£sõ¸5SÑ-†ñ¾Õñ:v#¤ÈÈmLjs×ìâ ÁÔ>ih˜)Âî çÒ4ƒ ¤nT;ËD†mVê}6ßOúñWáÌ_MøJ‹YÇ~v®nx'–é¥@FþÚè®$Ú<Ç$ªñšž.¢»ÔÑÂèsÁ®†6+°$®ªÿRc?†úˆ=F®Ê£$Ê2vÎõÞKpeb{AÁ5ù½µ²uXnîåÑI®LÎ7|š£{øÚêG•, Ž(IغåÏÏ8'•âœî1ÿÉ‹”c?ö—.nÚêYzhP¢dm/ŸÔ7ÏÏ?ð“nOnõ"שÝC}ÓLìRPç'÷®šHUo%ˆá÷c¿8ÿÓOøö<¼É©:fUµƒÝhñôXç,dfíš,pÇ€X-ô‘D´k§ÔÞ°¹PÆâ—Ý(ÖÒO œŠ•uÒî!s¬kº×J¥µfÎFv ]ÆD ã•÷¢L¬º&aÆ çlìÖKÈÔŸnrMu37£sLʦ}Ǹ¬C-ÄszŠç=ó¾iÙ1œ›& 0C@KBw‘¡µƒÝ$çIÏaWÒÊ{ÊÁö w'¹®_ Ç«ñ~©ÉÒÏ¿À®³J¶²2xëå}  þe"Iƒ‰=-—ŒÐ®z.WÎ7Úš1à%‰Îü Rþæ(,³4›ŽÝêt¶mGš$tƼäã|VÒcéz™8àï^éõ··äV­­’Á8¶ªn-‰S6z„h˜àƒ¶Fô;{‰Mñ,úâ`O; ×N›X|1mdóHÛ}ð+U1Ñ&h<º•§¿ŠÊñŒûN¦-n¡¹‰dFÆN|š^¢ÕKœ0ðkBºt‘Iõ\ N*F\dR÷Æ3y$0"4“*j8P{š3[©q1$d ë,Žæ(&EtýDòjÕµÄâçÑT­ÄšASôØŠ´³ÔDgÒiÁ%ô†]ÐŒàù¡-›zŠ¡G¸ášœM’êó¶“œÑß*ÀºìšG25’$¨âHUŽ0qš;Þat8Ð|Ÿy~í9YbXW|Ðã™}ÎY¾Qñ¶AÍnQ‹ÎHÔ64Ì—²B±à¶œ‘Ÿ4‚¾†Äy'Š+K–rSÇ¥¶5¿´ñQî7ÒÛ¡G™³õe7'â™üýäÌ(DjÃ(Ç|Ò–Ð(ÜM{3~ª,r˜•  ¡F@ îi,ô,þñÆô&®áxâiev¸h½æ6Ùw ¨ZÚB‰uKù[Ÿ¡¾­'º7‚)î¡;?ĸ ˆ©Ö—‘YÇ$wËe(þ4}ÇýCäU¾0`»™öâw6ÑÍoŽTP’dÈØö¤¡émï4‘ú«’Wåöª7²Ù¨OQnmæmvÓ¨ÙÓüÜV?ÄŠOMUáˆR"£5‘üÀEÌ`àÿ1Q'é÷sÜHé:ÉaîÑEvdvŽéM<¹oæ9ý蟖†DÕåÏ øÖ¦SŒèL|C'¹æÜ5¹¶–29PÀ5B×ðìP1’IQÎ8ÁÚ™MQXa‡#Åë$.G¼dy¥¾g$î®j¢Šu1$0*çJïµ E ™È9Ç Ñ¢ ËîS¤Žÿ†Aü"qãqI&½Ë1ºŽä{ˆ¹LŽ2)QDϨÆ3W.:dä6cÖ@Ù“z‘ùk”˜ú¶ò;骰°#¹¹xé„¥iSBÆLiS¶{V.­'õ€Â• dB´òd}‰< ¤± d.T)ÀT¥³k¹š2LE˳;o°âšwŽõU ?«nkrÆcÒ?é%†+P?¥8 ¾wÔ9£fb{£2ñÆ‘*é TùSF¦RHçåܱ£…VWô Ë(Á#†ê¯%û‰"¤™PÈ„8¾ g¥…·ê±¸_iöŸŒÓ71H!!F—^29¨úç$ç ü µG%"ä9O·;ot}=ãÆB?íH$lÒ®ø§º[ާÒòÿQ].<0¡ÛX8—-¨qk”À÷>‡Eeå -4˜ äð*«z6Qeζ' ‘X¸–>›ÔÇûTùošáœêì…üºËÔA'Í5IkÔYÕY$ad ©>¬×‹' ¨l;õãÞ+…ô¶>6¬´ºC÷︯U÷ ÄíʺíSØšVÞÞYò#Ôç’’i˜ºuÌÝTAk2à§Œó_ ôëº]¯ €mN9sß?™<…ÂJw'~èÍd¿¸Ëü2y¾Et—¬‘ñ‰±•#9¡™FUž+׸XÔ—m¼ø®|‡#–0è™ù?U»7½VgÉ1£Œ•w,¸ Iø¾£uÔl/&²õŒf'ÀÒ dv?Êk åÄ:¤½”3x8Å}:€¨©°:E±»q©mßêm‡õ¦àµR3q{o€úÏò\Ñâé©7«Ä>0CrŠA㳡uà+Ńj=Ô ‡¤Dp×WRŸÄûšú[»-£–?úœ‚jvŒŒÒÇ¡·â–P~c‰&4®84ÄNJî­ !óGY@_kç4 °”Ç}T\g#æ½iÔ­¶7ûÒbPùñÚ—¹•’3†ÜüP vj`Ê–7 rfF-„9Fçoç½¶s·#57§ß­¤! W.œÕc Ô’j$x ÔùT†ëRŒ9l£'8µ;k9b20Wjœ ã…ûÑb®åÀÅNëbRv%6õ1± “IKfÑIÛsME08RFâ‹*°ì94€ÅL_"½I&A¬çaæŽcSjÚpu `ÖZ#ë€ËŸ"šô#aÇ4âF¦faÆŒVÑd…A'H?¤v L¢ohôŸðiö‡F·gµÁ·ÞÍŒö§+Ù¹ÏpÔç:Í—ðã•£Ä.NüPºt…d –¹aêåÔð5£„¸Gsú¦ÛDþ¿éµ\¹/1ÿ‰Ê:€8d*Hïšñ`Rt*ã4dˆHzp&Á@¥g©@XºØ²©W#°âŽ‘,1ä=ÍrØÆbEà©`E(³í\U¼czNážÔüÊuà~ô…ä¦3é…Ôï°æ‰.õ NV¡C íVºw£ ‹¨‘À4µˆ‘‚“¿z¹eÓ-á –ÁëÞFD¥ ýB‹¶‰€NÆ–ê›u[÷ª"°ÄG5;¨ÅÚ{›2ƤÇE˜ÆÆ¤KíS:v;ÓqÛÎ0=ªlššQ€H]©ø\_[äžt˜RŠˆÁ WÔ@l~ôõšáU‰Å+»O&u•ꥼ)öœ±œB®¬Ýµ³þiæõxíšeî`Š*ãÔ ƒšž,.¿QßíJÎÌnDß;`÷¤pævcÕ,êT¶-3zº”©£\,× ƒ²(äÔ»;ïCRˆÁÏóª2ÌÍjNuœb…Ô†ÔÃÊúœT¼ki]z9'µ/iÔÒI%þîÊkñ,+ DÄÓüê%”F[”LmÞ»X•ÎVl޹hÖE§Õ]( ; ÷¨=Bõå»’8 ")Ó•å¨ÝîA{$NuB2Ø?§*¤P”,à‚­ÈÅ'X[{†ÆQF¢Ý>)…¢z¥ƒ&¨Æ²é,²²62Tî f+GÈe$ƒÛÀ¦= •#¿zC½›U¡REíÔÖ¥štlv`=µ"nªìÙRMuÏÍ ‘\¨uu °~ÿ5Æ~E`¸”ÎH†3üUøÅìlI3—S¨ÍäOäŽB+`ú¼ÕÄBî!чP*w8ÿ5ÏMpdmX …QŠªÞ¥õ‡Mþdq2É÷úNl äV¨‘˜ül· Ò§iàš9]š@COjè¿ EsùÙ¥BVºXž í\×NüœH²\K"ãm¯¹ß€*ïá¾±-ßS{@¶ë2…äÉ©|ÅbÄj£p0_s¹Šu• 3 .ÙÇ5稑̤ŽÀмаN<æ·„|ï¸×Ìq™Pí&°ÍÁÀ½,’NÒ8*4ã?cFG2Gb––àÆvÜ“ŠÕªUIòp‡|ïžÕ睊Ÿ¨4¤³*œŒÆ|õänZ2@Ô¹ÜÑp÷ˆÀ¹ŸL€Î1žqI³ k;O“A•„ ­vÉÛ™dÖŽ °È>iéŒB*X‹õBVÕåoMKê8®ëª_^¾©[ìãfÿññé·X•¤ˆé¶àâ¹ïX™ àœÕßñ0°þ'/ÈÉÈÐ1è%yB—Ø©“*©Æßz™~ï‹ ’¤(-ûÒÑ»³€\œüÕ_!q?7ÆYõlgïZGlœ*|$«oÚœWQ$cj€F®f&?Ó/#°ê°K!™mÝcýè]B³ê7˜É‰ÈÏ‘Ú’Ò á‰<íVzª´ðØõ¹ž¿÷¡ÇöÅ(Z1©‘žÀ‹Â4Dó¬Ë± ÈbŠYɰ4%i4íß ¤˜æp¢eæÔ4'ôVåœm‘ÎmcÁÎ6ïNÚ!iAñ‘DÍÄj*‹w xi9¢è8Ü÷­hdlãï½`– •ç°©ûŒ2…ÒH9ø£t[lK,§Ÿ§ýë ¨¶ž{×ÖWFÚI¹ø¬`J#q‘ÌeêÛ©ÜyQ@‘Æjr2Ê¢C"ª¹cÅÎåeMjÞÜ×5БrÖêåxæ•'±¥:µãÛZ¼‰‘Ç N6¢,Ú”ŠVP€ i¨†Êç|V09n#*õ‹ÉR†{nkÃyvX;8í¤â½¸Ñìªt€xÇôEŠð¬>+¬ª½ù«‰ßÜzÖ’£ÝR–é·èÖ ºvÉàüÓ“Ík w‘À#}#sQ¦¼ŠBÂ(W»ð*¤@ËÆ¤lÜZî3ÔÚ/˺H=ÌÀ¯ûÔ¯R ¸šðz—Å$¤œWa²‚`@F7'|ÕJ5£&brµ‰HXèEÇ]|Ó2ËøÉšÚ6oÝFjLÖQ‚$ñOõIZ;[4AoË ,zFb€ŒÄ¥,˜È¼‰¡1IúXRâf IƒŽhL¾ R02¹ûÖ€cbn*n J¸ê]¨8ÒY‡8¦Ñ–Hñ.7ì7\Ûsâ¶·úp2TwÅkc¾¡˜êÖ&ÍŒ±.¨ôÔ¯Î*¶~®Õyo\ Fw©}3 \õ  E:Tå˜qŠ~7P§äõ'ÈÂPü'k5Ï[n3 JCgÆ0+­‘TÈ_d@p8Å1i`–v©1éXûcúÔž±Ðg–àÜ[“å?jädΙóY4:¬c€ýã·}F+[RÀ+ÈÛ">jÂÓ‡‘ýò?$Öàé—…´~RlŽÌ¸ùÕté²,cóR$jƒ'O8ù4Kñáèî4îM±‚X£A"û{šz$-˜ˆóK´¹”úHV3À4ÄJAÏoŠ&'¸a):‹i}'~)‹h‘ !FHÛ¼ˆ"©XÇ'$ÑSR 3±1€:†nƒñàÖcAFÎýÅyA.µQ“±Þ‹3 9`Šæ“î±±&²Û¯ha1uA%˜ƒšÏ¦¨«‚@ÆjûÖ!@,caŽh‰'©¤“ÔRè Ò°·•R79ÆõJx`»Dá˜!ÊØÁûÒñêGÏ¥«nú =«ë½RüHøŽKx[Ú«ŽGœÓSË“é¯ïöÚ[Nž––~œê¹Ë dƒB‚)$ÐÓ*«‚7N¯¢º’ç¥Ç;FT”Κݜ‹ <ñ½kò}Æ&†£"05&’FvÇcMÐì»cƒÀ410V@„ƒÜVÕ•üö5!$Ï1$¬Ž³ÈàÆ›Åf&‹{ŸT*0Øy4i NI§fÁÐ¥2 UEmÈ­Vàޤ릸E8Uäö?j‘ÖdHà¦u>çíEƒ©‰ú…Ìh4ÆðóýiÆy¥|Ž2k­‹R‹fµÔ{¢õËÛ~VñL¶àœ}Q7ú—çÈïLÞØ<2CÄãTr¡öÈ<Š™Òýñ˜œìFÕFÛ¨5‹;”3Z9ÎŒî‡ýJ{ïMqö5'[î'#™WN8"·$4ú€#VºÕ“AÝFߘµ“e•Gô>Å"¡Ÿrºã4A ~ ÄJN…“€ê}Ëþâ¶îöωÒTnîÔ’d|©oÓ^‚€åXŒ|Ö!ò>å›|3j?⎲Æ"2+Ù†85(HÉ¥ƒgIÁî -ÔºâÙÀÑ[oq'ÔØÙûÖ."æ„ÂáG#+Ý_ÇmyÔG ÏïRú‡[­ÀBGld‘÷©Ý;®©}¥²ËœË!<š%ݼ«#Ú‘ ©÷9ñ‰Qø‘ 2‡ÆHŒZË!ѰÐûàša&¹üÁfBìÁvÍ1ø M!Yi‚0~£Dë~VéXªK†P;š[dC“€„™.„ÒG$Œdg? Ô´ˆÉ1y_I0f ã$.¾‰ØÉ­\{ÕSRû¶oüRƒ04e>¤¦yJ3å³É⛃8@T€€žÿ4œVÒ5ãD™$l1¾j…ìRÇoéN¦)Ž*‡a  ?2mÛ¶¹†psÇ5åRtéý꜄½<–$}Xç50A£cØÕ @I3)½K߆§HŒÈÄ*àߊè]R8‹"g¾ÜšãÚféÝ;1'˜j'ý+Ú·Ñ?Ìeü­ô¹VÙ$aôŸâ¢Ïã>KȰ†EÄUìÇï ¸{¥‘8mÆWañJ‹{‰d×£«ÒJê, gu Å"no”0äÒ±äj ê«4"" D8dþb´ör2ŸF2WšúKû¦ÂàŽ3_7WŸòÚZ/oúÆÄS«'¡1‡¨)¬ä‰~’IšJH%*p8ù¢·P ÔOÞ”’fÔÁNAóTãîI—"‘'©²n’°cÁŠ]¤W;¶ÿ&·i!K‘ß5A§7’ò¯É.Gƒ½1mnñ¦¶ú¿µi™ƒç⟂=ZA÷¤6MT­|u¾PL¨‡$«rGj^8M³Kêý`àÄæ©Ý¨Æ;qHÝFÓÆº3‘ã’ô–æîÔÏ nÀàÕ‡±= –—‰ît߆o­ÖP÷3ȃÒR;½ud™õ2}'¾x®ðÜJ¹c¨ºG’Gr[ü]u¼¥a#8ß¿zäy¨%‰n3Í{Ž,¹UÔ¡™Oò¡Í#E P7'85ã J‡?ʾ”å€' „ThQsóïÆh­$Àc\C?pM}lî&Ó½ñF%»·È÷úg?΃e¼X€>kèñ›À¢r•8»O.¯bFÐÒ˜Èì3“H=å¹ÙK±òE;áëɯOçQ’0~¬ý_j{«~´ƒ¥¼ÐG¥¢ÔçïMй‡#ÕÔ‡ë >kå—lò f \Ä$àšŒ ÎkÔ²GaÖrçÚ™Ÿð¯©‹þ%é¯sénGó®{äÆOØÔs ¯:ä6ä* šLûˆ8Å;gz—z±AØ©;­Á@^òwß ?Þ¬CÐì,ãÛ“îfbK~õ™søÁi,˜8²fVûu·¸œØx5J‚3œo¾Õãôädµy¬Áô³lj‰Ù[bTÙnòñêÕ‚H­µ©s¬d|QcFÛ÷˜ŒŒ{”Ôüȉw&%èëR÷ A­c2p£ÙQWýû¡ßâ–¸²$jÔ*¼Y‰ç½ÎO«Å ¥´“¬h@P75:"NIrÉù§¿ÌE³r9Çô¤­ô°äoØW[ý»1E¾Ú¤Ë Σ¾Ç4Fê¦/ѯíHI¡=Äì;S®ot+9ÙF+à ¹žlÅD¼ÝjäF¾œ ¤î9¦úwY2˜ç„+cb¦¹n’—½ÌÞ›gbvÍW³QäMÈVÞ½“)+g^FQêWégs«¥@äÔK·šéÞf˸äÿj»zRh]‚§C5þĉ-e ßC#KÄ©¸|™X0•-‰¨3V!vÆ–Á'çŠæ7$I¢æIAö’?Í[é³znç!†ÄÔžF2Ê×/5‡ŠáÛ¨*Ž”>ãAëÒÛÅ€çr| zy"µ‰¤8Þ¸ŸÄ½E®¤PŸéCââ9² ÐYr„BÒ¼QK–2%È5â4‡^ýLèÒ:ØÉ¤áuóûU$¶“@u¦jÜ‹Áˆ&f7æª7 »+ÀíM#¸Tàm½+ekÒŒNy4KËèl¹uËúS?ÔÔ¬-¸Çrw¾™y'EO‹2Æmƒ¸=D¿ê7—¤æM²¦Â‹ø~h•¦…Ë ‡ÁR[f1æ©1LV{ŠÇå” «!Îv£G+!qDA ¶+æ‡CewZ˜°:3¤rƒ£ê})º³R@ ]'ÚµéRY2ÆÙÇ8þÕ^)d9Ú¼¼‘ö¶©‹•ÀáêDÞ:;òœäI ÎÅpÒ¾X°õ Ÿw8ýëš¶ý‰§ ‰aÛœÞ)Ù2òšø5a6‚±÷lx¯R2ªç¹;×±ÆÄ-±­¶# }DœH2z3hŠ<±9aúi ºLw’1ºûF–FãöªqÆØ}XbN=Åx]¾Ó¥Ö=Çlfµ\¯é€Ês’ê½úyõQ½HO~ê~i•ŸÚk²+FÐK‡Flr+›ü—åz°…1îÊ|ŽÕÓÁœ°¦îC—z0‘º aÞ®~–¿¹‰²'‘?†~ì?µL½¶3€Tû”cz/áèÞÇñ”“^“¿úæ³5dÀËî¦ n™§è‰ÕÁÚ½W*NÙ9ßôƒÓ!Jà¹Rp È^DÁ˜ã&¾\/)ךᠷgŽ&”©Ù½mˆfõ4Àî ┌¼djÓ¾Ç4`ãÓ-óß½aZ…Æy: ° žûf¸ûƒuѺԯi3&¦×¤pÀö#¿Šì‚CíÎqæ¤u{/̼2ªá¢q¨ùRwþUgŠôÜ[£¨.oÔW¬õ¤gÑ K•Ò XáˆÜµHêýBèÚt»…¸4ÖçÔÒäj!ˆíñŠ#\ÞM9æG-ûfÕTŽ—ÒbýB&8ø-µvqxøñCþTçdÈíq7š93 w'ÍfÞÌ^Cï­Àþµ‚8ÇïK%o à-ãiì6þ¸ªOÔ‹‘êOëõ¤8û hK€É­8Îõ… Ä)£B¤Ï·&P¶Œ´‡W¸Žôÿ :r§°óC·C~« Æœþª#—¸‘eŠE »0ò*blÊ((žújS!VÎ1Š~VèÒ[à¸Ô¹ðFö¼P‹‹¸ ÇñdeUÉØfªu^™mÒDPÁt.¦â@F w¤da¥öc±·’$„²œÈ¯b‰½!žÛb«, ¸â–hÌsiQíÿ*X{Ôq¸¢®ûí÷§­¢ÌJU°ø«æOkvÛ4m)$.ø,nlrNMxá±²œkÕBrÜšØIŒ˜l ñXg®+†v:wõy úZXœÿ: ÄciÎØ¡½ [ “Z ð$žF …ÉG˜‰’)ŽMˆù 2«t^kÈ*AÛ ^ZŒ\Œ”µ ʃŒäb—»¹Ó2 ý6;œñRÍ̶Ç*wnsÞ‘ºê¾¬š]J“¶G¤ñ~Ö#Nu=êþñ ΑâF'žÂ¥\ÝMo‘+©n4Hå‰eägÀ õBŽñ…ç½u1  œ¬®H&à­'BtJ3²kÂ=YOÜP#erßéû–F²U0Q[:Æù)Ì(ÉÕµORY”GyÎEVŠöxÈIá.@åy©POè⑨÷ùvÞé3"ŒvÜPäרXö{™“¨Æc ‘;°qMõv ,‘Ƥxöæ—6Ïvȹ1–q‚¿z/Pq/T¹`}¹Ò>1ÿâjÄ ]±½ü½¹G@ʼȬ “*n­Ú–½Bar9Æ(ý.ÝæêPY -£2Ò&¼È¡KO „5£tðÖæòDäÿ—ÿm#׺oåÛ󈤡8”Wçí]BG¢% \ ö´±$ÎÁ€Ã¤ÏÅqG’Ë“Ÿ©a[ZŸž•Ô Û8•Ëy9ø®÷¥X¯L²XÇü×ÞVò|~Ô™ø~ۤ܈ƩueK ×â¬R§+œî+Þg”2R§PQOfym;Œf¾÷‚Híµx§õ&…#’5êÆMsÀ³îFgÆ ÍIë’¸Hmãlkl¹<àSæD …Æß<Ô»­7kÎùæ©À´Ö}BLG–38œQRF( Àkvñz^ìѸ$œâšÙQÀÖ§‹ Ά^ÛãÍ ok çæ†²jàŽõãJ±·nô£¹µpÃÓŒûFI;ÑIƒÓÆ yœNK^y­Ë6r¤åk8›ž+=2|j8;V “\Œ¤ocâ€dD 1>Gz,*fc! ¸ÇŠg:¡¸Ô$'mäέU`üêÍn$TÃIÉgµ)9]NýT¥ÐÏ™YP EÊð¿µ)lº-ã“I rH#9§ ,Ñé$“§|Ò·çON˜3hÒ¤†Ïqüê„Ùã1¾±/øÔñÜ{mÑ æ½n¥uv™„h;&ÙûÒÓ"Ü$7¹ÚuÇfïý«iB1¸óUœh:‹+[0ŠòÛ•1‚Åw Tf™%ˆ Ö‚A–Á©É õô°ç×­„ºåÔ ·¼‚È$L¡#Él–s™"fïÍ.ó`lsµS¹(%ÊŒ¨P>ÿ4¤¶Q0 ±RwªUÇù¢ÊëSË} '¦Çc¸"šx.$]ô‘zAâ‘epH➨•]%uŠÖ¾Ä*§ßOl%]*ÑãA ÊÈ>Gù¢ÍÒá½G›£ÈÚÀÞѼÛþ¡ýjUÄó¼¾¢FSmÍy®®Y³ÃlP•=‰êšô¥ ©‘Ù”a†x?4§ªRœäv«¯Ô-ïO§ÔIŽm€¼Œnï«ïÍ)Ôìg³ óƯÿË–3•qäÕmÑ N)÷÷6Þ–»²üôˆb#Ô'üy5÷¨‘¬à×Eø7¦‹›™nd‰ŽO8£wøTäü@ ßS*ô'¡È$PC¬’;caÿ¾iN§ÓÍå¦CQ‡ƒ]äÊÄÄ0G$T{Á+á +·Þ¹xYÝÎCÙŒ¾ ¡5Ñ.@µŽ b1ÌC/ƒæ‹wim{¶t%ή4 &ŒûÉ“õ½WŽ/¦`£nA¡ÈÁr¦n:]‘W9çü7º]:«r¥sUìØ„Òó<š·*ÛSml2j`Ʊ’ÀXÀÚó» ¸m’Å=ŠÊÚÉ4[@‘Ë(ÜþõÊ~,¶s|g úN-Û cÓ`„j<÷4U.CE*,‘‘‚dYŠ?.à!(o¹ùÝÄ"èŒ{ÆÔµ„~½Ã+¨äüWSø“¡[ÁÓMÝŠHŒŒ”?ßÅD·³kxH?\ž; í¦elv±ÊG¿BNê¬di±À #rG´×[„r­2Gš1éöè£TJ3¸óM_)PUI²øÇ+ò&B†úî8„bBè6 ã8§-ú¼ð2²‚¾Fr§ö¦¤·*>)F·ÇïK-û¤PmF‡RI2 ¼X;íµ kˆ$Ü© a-ÜŒ|Ñ’Ö?pflFv ¤^£þBFä¶Ð?IþtQoÂO¿QÛŠzTŽÉ°ªÌòaÐõVø*H̤yÍGºˆ=œÌÛ‚ûÕ8H*“fDòâèÇp=6öL¡Ð÷EyÌr:¶rÙlò*måÒ\0H¢Ð9Þ‹m- Õ òjŸŽ–rÆNMRµ½ÉC!Áà‘Å5Ë&B9'ÛØŸíQMÐ ÂMC'µÒî?T a¶ÛÍNø}Ô¡^´gSl¢& z„œ|“KõH..z{úg®¦^Çâ¼°ŸÔ]:ó§~qš%ý祈a,0+ž9 Ÿ¼clNL¬—¶—12°À†R1àùÒ$C¦ôƒ !Wr?SujQ㉘™î3Æôìw’µºÛH¿Iÿ;÷®†R\ ëñ@?oõ~UŽKèå#*B|mþ)Ä»[hÝ®H‰†[ŸiïûTž‘p,®:¥Ôþä€?ÔI$P-?9{Ô&šàFM%YvQØTù1rv-Ö§±åà+ó;T”H¹Vؤö"½ÔAÎ?5;ðó ´’ÕŽ}3ª<÷_AŠ’±ðs\|‰ÁÊΈ6'øŽã_Z`ÈŠ¹þ¿æ‰Òæý2Ø'ŠFêê9nG>éXœx­¬[è™w^UÇôª¡QTÎZ©ÙÿÔî¡+ ‘+ñ@cÓŠ+• ÃVÝ«v=GLHìWK ý©ë„†ñUeM`ŒéÍ(Ž-p±S‰Ô@±‚B³µz[ €¤6;vªg¥5¯ñìð€ ã#?ʹ彗>à©ë÷"É­èM0…ÉÔÇg€ºiSœr ½WRËö§äFHÚeˆ cF0 @ rŠw;`Q-ÄúYˆÏÅ(ÝZ3’¶&oÔ-œ†Ö‘¶{V21UÀ:–í}H¤Ňú…SŽëRa‰¨Ö=I ‡Óôùe;Ó¶ì'oV6îNÄ~ÕËÍŒÙä'Mrceܨ’>ÀóŸVRÎG`*¦Oÿtîs¹£‹‡‰>°[vÕ/âx¯±„¡ÀŠ>‘¥Tç4ŠOŸpa“Ú´.0uOø¥7AÄ .@û×ðØ{sêhêd+¡”y=ëÔœ#`žkÃÀ“+"§Ïö¥º—S¶±‹2IÎÞíêT½Qa¤˜MD¼˜õIýL‹²Š¯ÈÛu¥—T€ÞÜ´Élîç ;è?Ö‚:]üK²¬€÷Á¯zÅÀŠ'…u*}ZFõ®›zJª$Ší'ý±Æ+ëΪY\ͧյ“À£þI£C@þœÓPDˆ!ljúAÚ°nçLˆd}µ,·¡û‰\õ‹Îºê4$åäS“íÅO^¹y$ƒÔH á¡Sþ)ˈ°³3çÆº¹qX€äÜæ¦ßõ8„åm¦S»µ^²’’XÁ,}ôåOô5„~’è ¶D‡õG6Gò"½ɦdÊë„§a~½B!éi<æ·ròÚ̈ï¨r¤ ·é‡Oåïe…×qêÅÇî(òGs4ÌÂ{yÉdüŽ(rcµ‡ž½ÿÉï É\1ÆÁ®¬£zѨܜ¿j É4'øˆêyÜqJÍ __)ÈЀsYB5ަùVSw²´xìbˆ‚?Sdw5^ÞÐÈŠYŒh9ïšUfˆ/’­ÿXt_B3‚|v©Ø>FÔh+õ>·‚-@/Œ|~õÎ5ÓÍ)iN¦nMiUe>ó’{Ö4!\gæ©Å‰1Š÷'wk±Ô3D}! g¡¥”óͦÖ6iÈ#·ïT-e{%%G¨Ž=ÈÛƒW,'·¸·-lB»Ç°#ýè;cÃøS+MYaŠ4¹d2»/¦"•U‚Z´ê»ÈûW‹Êàzæ– ÜèB ¥Aê@~Äb‚èÎÄw;Õ$¶·`Q†\‘½b{yµ¢üFõåÈ.¦Œ•Üù‹ çcÜ #«ˆ‰RÆväSEäªÇoš\Æaqê.Ì7ð×<ÖëÜ"˜ÄjBœ¶üó[2ÿ{±ü©=IÈo`Þ+ u¯•ôü oØÊ1\öãÒ²’&r¤À$Öâ»AŸJÜ)ªCª¼KÛ…¹W”‚¡Ç±Ti"‡ë˜ÕΨϹ±Sn$’Aä)ù®‡«~ŽT’ç§.{ŒYÙ¾ß5É»‰*Ã#b)¸8¾ÔÀ ½ÍÊ|©þtÒFnlõƇ\|xäTÒ_I9Ècðì®òNåt ýê—-Âf¯{¨MKéÈXý0íûÿ­p=gªIÕ.KR}‘øù?5Ø]YGÔzrC)qéðªØó\ÔŸ‡¥2²BãV2öÈûÔ>&4ÄÅ›¿üE;#…zËGp½6êLÇ!Ä,Çèoc]4Åãsÿñ_žÜÙÍk&‰chäïýÅv–EzI[Éä ÖãLäí¸àþô>fÈe^Ìw“‰âÒ”gÓ‡K¶ûÒ×O¨IyP®Gl«Ÿ¸üUnÇøV’6ž¤Çô¢É×c:ÞæX 4îàlûW?ÌŸåK_ Ù›:5€d¾Ò¤ê½El‹i#QsàkθOüE—N•·Aµ?Ó:•¿GüCPui-çCŒ÷þb•üMÔmº…ñ’ÚHw9Ϊéç(Ö«ýäz¬Š¶8§a—M»ìdÓþy?ØR±œ¶9}ˆ`·ƒ¾l>Oþ1Oc°&*êäåMJkØ#:öÅ1¤zd9¡À­”dsGËF$¥ I†Â«q[æV…Ž{ÑzI= P£yg¼ „ä‘ÜRlîº*_r„Ö×È$Oxò9Qš[çI®ˆ3…Ѭ ûüÑ"\D™­ :IÆ0MF^ãxV戣ܨÚ3¤±ÈùÁMðôË:éÃï‘HÉ,dº¶ÚFØл›g¨\©’-ö;ýè†V/©pä56)=L(É+¶*š¤‰"ëBã#Ñ2Ôðk„XðÊÎWþÑÅy1`§í[‡CåT3í’H¡3/$ì> ,w* Á] 7mÅeØ8¾hÂ%s•!MDЙÈßa½‚g¦UóíþGÅ;a½y"„BK^hc ïÞŽf e“ÔËguÛ©ItŸh9ø¦%a&B¨¥™K±NX¶Ø‰Ocqn#NI_Ó÷¥°ïî'?&ºh$dŒpvÁÏqâ¹éºÜ˜6Õ¾žÙ§¦oM&ɃÚÉj¬cÛ¹ó^‰¥ÿ—¬éàŠËÆðÊÊANãÅy’q«oš£¹.Ä*Ëngî|SV7‰’“0\œäñIª6$þÕ’í§j ÷41N®ÖUY†VXT¾ÇùZIKfc’Ç9¤aaiÓ´–Ó%ÑÏý¨?ÜÿjnÙÄ‘ƒjeØù©ŠVåa´¹ìÉ©ôÉàUßÃv>™šììG±väw¨â.c†;ØW]d‘ÄJIF?óQy¹xãâ=ÆbKk1Õ@Ò_NW¾1;eÿQÚ°ä4xÓ’;ùÌq¤9à’Få}A°f|“œsYfÒpxñZÃú†Æ9íX$Äö‚OK¤ƒuã| U╵+gKgcÚŠ…pd'î ¥Fö¦ø¦ S©½I¶¶Çó(úI³êQÏ&^™ì®y©½{ªI|Á\ú1œ ì~j_«—ÁÉ&»¸|RRß³%|ôÚ´²´`ûö¡Ù]³¾ Ž+–‚WõQ”dŒíVíµ›’PÅ{ É¥¿ÄWw(Çœ6Ï©hÊpHØÿz\Èí+Õ úåÑ”D§5™ú­ÿ¢Ò#*;-ø®?ÃÊ@ ¨ L5{ÀÀƒù¤¤“Ú¹ˆºßP,«˜Ø;‚µT¾¹2íü¨ŒSõBÅ3XYFýI€ NØÍX±m:T þ*wOxD@gšxÿ @c’*Û5Q¹?«"–$Œg¹ Ì lÅ‚èÆÄs^ÆáÙN7¯f'Võ(hÀ"Œ´á†•9Å#Ö±ùû™†•ó¾i˜Ê¤ÿ8ÉûW©I[èc–'+žÕF1þ "yª‰‰téA°h_é†OyÿJ·ö"±4’Æ^&M×bA­t”õz”¶›w ÿ¸ ¯õôù›D˜{^#éLô?⯠r¸¯b%ê²;;#êîA暷Șh2)#;d¹ …`N6 ‘Üe°uw5¦š X”$ÕúÊ’rÝ«"4 õwÉ&”yÚ9`‘¾7ÞˆeÑfË9“Œö¥ð \®èC»ÛÆ5¾•ã/µ|ÓZÇR2Ær6©Ó7æW¹uàSV¢0?•+@úŒ§,ÇlÕjÁ½¯÷È¡42ÆæL©y¥&žÝ%ú‡¸oŠ**t‚ ê;#~i·ÛÏjb î7ÝÙêk¢ìUT”m±F¾·†Î ä†?Ú¼êˆE¼m ¸Y&¿J×1%Ìò>¹%gl÷5ÒÁã¹ÙІXš­Jïx‘©Ð[–Åóaˆ%¸óH¬’8!·¯‘pwûÕŸ¹ð™f8FÆýÍ1ATmé8£ˆÂ@;mÅ2׊»*zž{RØzY¡š0«ë8VAî<ÐÞ8£Ô¬q§|“Í(×Î}©íÉà(2\ã|–cÜׂ1žÜÕÓŒ{OÞ”V\FqF”;¨`£qÅbÙu]"‘ÞžºY‡¹¦BÃàŠ ØGp>¢Œ3ØÕ+xŒË&äqJÍšý5 qȯ+î”¶%eû –:pY­Ê(ÝF9Í7l\ÀL£ ; _¢©ddTÂñœóT§·h :ïŸ5ÍÈÀ9Xm@ñœì«–`ŸŠ Ê1ˆ¡ÁÊâ©]7唌ÏËRn†3­[Ô\*¿\^B„“eÒ$i·ÃŒöÎæš¸‹ªã ‡Š§QªÚX‘€¾)ciðÇ!¸4_+3Y‚ž*bJÄg¶F:TçäR°[ªÌWVúIäUë‹t¶…‰+­¸¤líÒf“mN£ârýIõ%͉{‹ÚÜÏ ¶9ã4Ü/#¬¬Î}E\ƒâ¾²²’âöEVXãQ—vàQœCS> #Hp0(‚t$â⊯+$¿[˜ÓðÈŒº y|ã(Vj¬öˆ>+Ù˜àº0Ö=»v¯6ÍB] o¢$ˆÛÍ QldbKhš2¡Fâ¡t)ã ±9+#¶æº@á½§s\_+’å3ƽI"mp%@|Rí×,ÍúÛÈ­lXá]ÎF||U;"¬À1ã5ÉuKrÝDå}’SîóOñÑs_8áŒv=Ni"E¬}Cšj %X½/Pè=…§ÛœGŒ“Úž›§¬R‰¢\Ö¿í]·Ê·ÄÈSå>‹lM¿ñTc¤fšÌ,0ü³þ+VáŒbÛ sMUA ¶H÷w¤¹¤Q‰~l»ãNKT_Ä–˜¢»Š0¬=²ûéM¼ZN¶S¸.öÃL‹é±/Ùâ[‹&‘ÈNZÓ:€íWí“\D“·ÍN½„ÚHuD³ú¶ªôÖ8Èñ[œØä!c©Ìß[µ³Í©%ß#oÓÍi›a ’vØUÞ£*ÃÕI1àh÷¡B‚y–h®–+Œ’ˆwÈJe<"+ã[ŠÅÓ®be3Xà6*Õ•ÕŸKµd-%Ä®}ÅW&fz½ÅÒÁ4qÍ;±\iùÚŸê¶i 0„«?»·jŸ1äB±ïñŒ•ÚÅäëÐÊ[wÛÜÔø¼ó̪Š9ÀÎø Ih»ãùU~‹Ò°êEöF0294¦\8וC2–¢cˆÎ¾@µh9É%ÈûíKÍwk2³,¬œã÷¥_«Dį Ù^75ÄͰ%'(r£J±[»ÊåGÔ{ÔCs-Óf#¤yÇ4…ÕõÕìš\áW„÷£ZÊÐí¨ßj©0p{“œœ¿OSÛØuYrK«ìHìhÝ0:űRsE[«yŸÑœf&äŽEͤI}„²©Æ)›+F(÷,A#$ŒÔ½.ÆtËÀó­voçC–æ+X ӸܟíR§ësÞ.‹¼Œw#àv¥";YâÀhÇ'[h§ël9ÇÞ…?­ù6IåÊ(ÖŠoµ,2A«ê“^ÍÓ§• +&5 w§ üÍ&Äå£V•ŸH,Ìxz~‹p]D‡I=†æµéÙ˪)—8ýCûS¬oc\2ÆGfÎõ[æ=!’.!îJ—¤Ã’tù;šRâÚbw–ªÊ.Ž2¬í½oò“Ì Ž±ƒÆ Þ…r0Ù1ÍŒUR£ ®‹ùWÖ%b7ŒdÇ|L^LyJö]OÔµ–{–•Ôøú²p<Õ8gIKnÁÐ÷"¹«’¶ÿ‡ €sq;Êí_hþ¥¿•yÑzšZBÐÜ’Ú²­ÏíSeñC)dŒÃåÁ\êvv¾žI-ÏlSÅaD€ÀÏCÖmëYòûŠ›qø¼¸)ÓápÔó`ØW8x™r5—*Œé:Œb4I@QŸ‘°¨WWÖè¾öJJïQ/c *º1L¡Ó'€y±È¡z°@¡¤|±áWs] ~'³qg;.®;,ìò–#°ì(ñN…ÔMŠâk–),¨G'“MÅÑî½T‘Jè–‘õ4T˜¡Ì¬¹ÈöîóÅG¸Y'äumnÅŽ|÷®‚åVªŠ8ªJäèŒ诛º›v¯Gç5êûq«¿4¼ð†éÐz÷@ì_sŸ 9­\H.nžR6'8¦æzu‚Ûgÿ‘s‡—þ„ý+ûòjK:Tø »74*aŽIÀ¯Q¸í_rÍœ~•­Y…%¦•°é_šgB!ˆ¹à3M&‡Ø)â«XÀ¡ƒ“Rçø¥°Ajè:lNÁdNÛÔù¬,,TL§Œ cîkN E€wîEıéÂ^çA9Šz6‘#Ë€Àí¨zçìžD¥L‡ÎH=þ+¢´e¸€º+þ“â/Öý…ÂǦa¤(m¶}²£+…%²8ÛàŽH½Üéä zª¤¨÷î\n)žzÊ=Œ£Ý± i …AÒv=ñZ•wÏ>h, Ç?ÏŠÐ!Tıƨr™lþÕ:HÕ25`ÁššCŒ1÷yóSä9lU { Äcµx4—˜ã5ò‚pšàÆrvÑÜYê6¤€­Ÿ¸¦2C ÇlÔ”ê +é—ðkÔggÊ(Süë~&0>d•Õ´s®§]/Ù€ßÿ5h=6Á+œù­Oqs ÃLÛöG¡þ¹êw¦G>âÜ~ÔÁþÛD; ‡ê7$¨²ÇäºÜ\e S·—>t׋3ˆËée„€6<~õµµN¡ÿ"ßR¨Øã餷–µc¨Äñýžçq+\N]ð3À‡a^tq¥˜Üè®z ¬ˆ é¹ìN¥H“£^FìLŒ»áN✙ñ°«Š|9¾ãQ§±y-IÎæ»K'Ê`{OšäÿÛKsÔ=9TƒÔCNq]uªÔ¶äf¹?õñüK° \cÜØ &çüS¥ÈÍ¿ˆ ±Æ 4žýëé 1^JŽÕÈ7u{šá=Läñžk Z}²$ûkÉpaÐCòh#P ŒVO\£rØÉ#Ç4OI ¹B»mŽ6¯Ut¨ mŒšñ§@‡G#ŒVY=LïR]Çá.…pÚÌ2ÛœgÙ&Ãö4ÿôu!Œ×R÷Á!Å[Œ†øÍzå³¥9©ãÊÎ4ÅK}D—ð÷Ip-mÃ;–4D²²…‚ΓéŠ;#D™'µaå‚ÕÊëfÀÔy4ò7d˜\jq¿‹nLA 8aÀQÆ®ù¨2Ęu,¶Æ¿@ë}ǬÆ'wô®#D sðýpÑú/n¶Ï6“³F2+¿áfÄØÂÝÝÉr‡'Ð(Ôw&«Ëç=óRmíîìz„V×±4Dþ—ØñU×ý§&—¿Ì£Ãnå‹4RªOãŠbæø$xŒdŽÔ„˜bÔͱì{W§Þ4ä[×-³:è9ìÂYO–+¸µUYpsæ¡IÔ-m„ó lð74wº jZ6Ô$ æµñYºžÈØÍÑØŠÇtcêFs«2,;c·ò¯zÚO.¡l d?Þ—›ÜA'é4Ήú¤ ¸-kCÏÁªKÿYÍ»B¿™2ÎþH¯ ¸bU¢‘XÆÆ®K=¼?ˆ'„¶ˆ.÷ÀnìkŸ–&L0;×—·-:¦”\§9ß&¨(ŠŠ\¯ŒÜ¡uµ¹h¤$:6W¢XÕ‚ïDOPéÐõ1)˜úz㟊œãẋF¶(r2kÕÒÄpGz¹ÿ ×j@©Å#/M–Üjؼ2«M²"ø Ü †Ø£ª¦Œ¨ïIëLèv*GÓþÔxeÈÄ›c¿jó)¨Å`en•ok,ÈŠÌN縣ßôˆšØ¤J=»†Æ1R-îÖÞ}HI_ÔqV'ê±~@¢±pÃbÜ“Rº¸pD[ mÉ{²@ù¥!.[ÈRiùð‘`©FFGcSÖaÂÈÄœì~Õjnêh‹•º2+HC–öŠ –-ç “‘‘AèáRfIF4¶Íœ}ªû[)c&ùaߊçyй•³ñÔ™xîÝ´*(ÛWjzòèÇ:5o¾9ã@$,ÌA9ÈZÅç¥ô¾íœàx©ì3¢CX–éN³•>y2bÖò•Vx#ÍRk„¶•µŒ®ŸóB“)*þFÙ«‘Šÿé³~¦ZÝu)EÄd§Åâ[`¬å 8§Di e‰ °Û˧Ü1k†mrÿÔkr­Üoê4jN|ÕË8Ã/V'­ïsý¨~cpM9öÑr†)bÕ«ŒWÐÚ­˜Ò§aO¼ nqà(¡ú>¡:‰ Q–'^§… Îw¬ÛÏwÔ¡ô#i &0£<ü×¶_†¯å»Ì¿—E# ·ô®ÆÒÙUuè< S‘¨8ãâœ3²¯T]Äa²ÆF22h7q!LcVûU $]Gm¹Þƒ/§¡Oê¼ÔÄ’cAº¥©ŠÔÌ6ô€É÷©ó_ÜIh° JÄ?@<ýê·_˜'Lh£ÿî2†®y¡îþB¨Æ-™‡¹¨˜”+ŠfÞж_5‹X‹¾‘°=ê„Q¤\¹ÇÅ5u ^âl=C†„ÑN†ª¡Š)=ཆŮÐì8>(Cû3+Ô’±•íšnÙ±‚€;S¤Å"ññÍbK §\y¼\›“:ìsßD€#‡8ÎÆ£Økµ¼ÄªÈ@úNÙ®ÊÔJêK§·4—Y¾éÑ/£:¬’ÕTn?~ÔìYHè/Ê6fÞxý0u ¨o­& %NÜTË>±P"°(aš:\¥Ä…ý]YïSlþ#A¹ôó>N¡ûÖ?9• FOŒQ¤Ô\{šQÏ¢Û Å9hŠžŒkGa¬`鯠’ t»Œ|ÒNn.ô#à(÷c±ûÓ±Ín±ˆ„LîF­«XP†ve\¶3+òhËLƒ,­·s½ À„‰csír)¶6À .;qP;n„oÆ@¹ñ¥µ‘Vaê îqRon ÷Y)Ìj0¸ø®•š9nðû<½ ï¥$p‡€Æs•]ê¤Ê«\†æfRÔ¢N¾œ³‘ÅõDva—¹Þ· Ü'PFõ-›b1Œ|ÓwðGxÖѦDfL¹ð4âÌÆà¬rÊ×U®³Œc'4¨€<ÞvZIb†ÙÚæ… ^£‡?ÌT‡%ex1R–h°¡R3ñIÜ@óNˆÌrIÞº·Vflà6æ…qoÑœ&ÍÜÐ&z1Œ­ ÏõëHmL(CK$p$QFƒ8ÔÄþìj\63¡'AWa·Åv-¨œ±ä÷¡5š,f@£^68ª—Ë*´dŸÒl™Ï'4“°îj|áúa@<äWEt¾§°Ÿ5.ç§Û§ñG@OŒæ¨Ã’͘ñq_¬^cž‘nÒa½9 ðÈþƧúiêjêíµ?Ç=å¼yÀUÏ>ÓþÄÖúGSN› YÃ#q©‡¸}ª»`¤¹€Ì#v‡®ÈW²ˆc?J1÷7ûU‡`¤l"ŽŠ%Áw!¤Î[IíšÄ“,(uŒcµs#ä6e¸Ð Ô*J‚LQ4ËßÚÅøÎ;GŠâÞÿ1r­ ®«ß=ê´) ˆIo†‰·ßÍ+&:ÜÞG£y¦¹“Ye‚ãa_4rà‹9ã˜HÎJ¸;®*¥ ŒáF@Á4¾`u©•¶î7ÅÝ,ƒ+Çlw¢*L0—‘SH/r*y¯=;cœ°äÿŠœÒœ2ë;òkpC%ĉm«êcØw5î¼0µÜ|`€4d²ÜÆ6ŸçB¸µ±½ÊJ‡*1­6§ú†líçJª®3þ‘Û?óKB,Š~Œd_1Ú™¢˜HW…®`C-¬¢t]ôã?Þ³DeÒ¨«Oa]œS0/§855ú$]Nâ_\´>¨ÎbóTâòÚˆÉþ±,”>³¸¼–âY&w%ØœšYÌõ3÷®ŽóðÍ×N‰ˆ¼'rT{—î*$Šcãq]\YQÇÒrÝ\´Ì(À²é8Ç?5bצ%»YNwX#ãò| opÐË”À'q‘è¢æpÞ¯æ$[r5ŽCÆT ÆzàŠNÖÖ8@P5Ë3Tºoæ®-Z»çlÑzgPK¡è].©9G+ÈÿaT€óæ¢ÊüG7)Æ,ò%¤¹þ"éó¾M{w 9gÆ Ž{rV±ïB/ê ®­'lêpIÜ}H†ál¢×3¶AÜ4ƒ_¶S§5eíbi$"LžãšUúL¶²üS×"à•cÔ_¦[ë‰ä#vj~${g/À<ƒÁ§­­áŠ$„¤s_O˜$r>ð;ŠCeäÆ1V–¦`$ÛRë%I¢L¥²ëí r6¨’©“.™ÇÒãi¾•ÔEÜmmpGæPî?׎âˆã r цV:2®HÎßÎ2¶¾ÚW;Qæ¶µ:Xl($™2A1X¹é"òdAî854Ü 9!ˆn¤¤uàBUY{wÑEA’³³10½Vد¦#}Tîm®¨rÈ¡¼ êá„öåÐÈ¿Päyù£—b-Ÿ ÑÜ ¾1ØÓÑ$aTýG©20Fø®—ðçá9®Ý/.ÕÒ¸AËð(òº¢Û„RZ„ÏEè_Ê. ‘ 6ßõýÖM(@\rkÅ·†t†5Ñ£elSŠžœX f¸Yó6C~¥€ˆ_XÇ,lY5cžæ¼¶´1@Ãlwì£ø->ügúÑUB©¹=“¨aµ"ÜYÂ’1’ÆwðjFæÓ¦@I<ŠüûP¿ôÐúAƒ©ÎäñRz‡OfŒ´Qj‘FH‘NSûÆ+orJ`·³*Dò©PRDL~*©¸ŠÜªÄ%L­¾~¤GÓº¿æ´Ã(µ:5 ÷ø®ŠÚXbŽåõ¼(5ÉŒ4Ÿ$¨7`ýÔRÞÆò;Ðó^Ç$ItcQ5ÊÎb ìóŠÜŠ2ë;ïûÑmæ\èHö=ÈÆjfrw4jxìP’ÍÁäV@”c’pG8¯ITmdäŽ2Åyˆ9¬3ÀƒÔ*ÔÛ4¨¡ À'`kÕˆF4’QÉ#lV&™*#;ç9 ´¤b~+À4.¡ñ©¸àö¡~q#qúØddv¡¬Š"mM¤÷ÉÍ+%ÈH‹H§JñŽôÕÇz…ÆPˆ–Tçïš+ÚÅ3+ËHÜû†h6ì?-«f³mtÅš!´ⲎÈõ0‹‡b²¾†ÎØ®®õ¹m½K^•Wgœ‘í=ÂŽæšê}U­®L‘ïôý¾kšBÇ-ŸïVxØëq¯B -èH˜º7«5À‘œ¶YÛ$š± C朎åcÈR°ïX‘bœjˆa†Çm³ó]VÉϱQxð|WFi½…µ¶çsšVï¨;ÇèÛ¾wÿ¥]_LnÊJ *õ»G*‚¤Þ‹ââ3?«&ÑMIlÁË8ÕšjÒþh"ü ËÆ[Pâ;Æ«džÁE{0ï€ÇâšÌ ý„™qÓ}LiØÈTÀÚ™é³kÏU¶ö ÷È¡#0j&5ó‘‘ÅHEŠõ+¨¼å‚²iÿÓHÛÛÊï®D)ƒ°óUÆã ¸‰ ž(ƒñО8ùQ0Ý6e¶£˜ÿñç_NQñØþÆ—¸°šÞîXe;©Û‘ØÖzÆ­{w¦ã¿Žâ4´¹lKÄRü¤ÖoÔzñ"ŒZyw ôbg@ÁY‡éÍw‚Ù„CFÁ@?£Ù=´ĬUÙ‹HÄd7Œ~ÕÒˆT ÔAÇÅqüÏ&Û¡ÍÄÉʬ±ŽçÍÕI¢¶0qûÓÏrŠw RâÞb võpc“ÞÆA`Üœq[µ‘újÊ‘@$gÆäóñM‰ã‰`T}>M Pñ‰&ö·aâŒäÕ0Ôa}}¦á‘£D¨Î Pr÷§ „Œ¹ßjM­‰aéœéóGföá†Å+G©+ìÌ }!­†¢8#½¥gv<äñKÊ¢3®> ߥpÄçéî<ÑTp‚@Ä6s‘¶+Æ”`®àô¿½\ª°Ó“Û)œ•hßvÆ+BÜз.Qƒ óó[F3ê's€1¸¥S:5€6³FAí,‡òkÇPYg¿•CœžN8 ’=J+ع¢¤ŠYPnG'Å{$þ“ ‚TƒœÖƒ4º;“úŸOéýZ—6äœ}Jt±=·×$zL}ð*ÊÆ+ƒ †ÿwjö® éðE#è–%ÁmÕ»xª°ù ŸB~°Ôz’íí `yÅUhd^Ã;ŽôÌ÷”Ptÿ<Ôù¯â¹™#G÷“Æ)ê lJ,GDÉlò¶ ‘\ãuéfº‘$…°cŠ{©\—…m‚û˜å›â¢4 ÈÀ ãÍYãbZ%„—;hF.áQïçzZÒì6®ø8"ˆÌ&9yKRþ€†ë)€rV« õ À\İ©JÛFu,[žwæšhÓ ¥1ßÍ)lÁ'ÿÅjIרÃùÔŒ ixêá#;gÍJºˆÉ8ñMʦHAîvÜСqJaïØÞi¸ÇbcQÑ”zEÀkNØ LžGpk®…–x5Fù 6a\ŠÛK5±Ô1¥µhUÆ>qVzs®Iõóiðkå o°0ø’ŸÄ£ÿ¶Nh7¬ Q<)œ¢Î Äœ5O» ™*â4Æ9¨ñ€Z,m¢ro"u ¥×±Ûz$áXÅÆ5g Ìä1,6÷ïö¦/eÓ´ÒløªÛ¾SËЙYêõm`Ày ûy4¯Ô’y¿+¤³€iŒÖ{±ûÑ Óeg%ó©NL1ç°ýGüR¢@pšBŠ¡Fê`NMû£‰œz˜Ê³Šf+Hd·F*{2ŸïYGSnЉlŠ$p¹@ ã'½5Ž«¨ñH¦Š™¹ÅÁ9ç"¾$AB$SœŒú ¶Î+sÂ#ŒFs°­çÐ&,øøÇBMº†ðGüH¼'qRdB³+Ê] ‡Ó‘ûŠè% êûÔ»ë¡ ûÆàÕN7@N“ã Råª#RÞu—W¨Í ÷g?5w¨tØîרÃuaIþˆMÔ&™€,ˆtýÍ_ŸRa}0网”®P©Ï”“îqÏÒ® —, ~ j´’GwØÇX£L›²žOÍ5ÓúvÞ*Ã)w?z'Ì ÛÂÇŒ£}f"‚?]bˆ÷5d(‰Qù ›Ó-Œª²6p< ´-fyCÜóPämÔ£õ5mmꜺý±ÚŽNxÐmßNtHÎ➉18ÖäíœTÌMÌ-3íŽ0iYœ rÙÆ?­nìébAÛÆiFËû\®;+È {‰¦d&I çjÒbI‚)*å¼üQý$•v;q‘^ÛÃè6dƒú¿Þu PöÚ¥Êý =§DzSµ ÔŠ‹¾Á~+缊HWÆGeÌK"dò²½åV;&5)7Qlã“ö­é)ÜŠtt¨‘B¬²ƒäàâ¾6æ'×Ô; 5?!ê9œ¶AëIí 01LHÂxž&Så@H®¢v˜ Ãì}ÜQÖ ‰wP¾›÷¦òõIƒ¹Æh¿ F•S"!tãäס؜€Ú—É¥g1»2Ûc*ÙA9­ÚfD_jœ}ë!æu‘ƒ0OÒx£ÛÊ€êÒBŽ-|g¾K]÷œ,hNOµsµ ®0äíŒoM<ÊÌOŽù·tô€Hý4¥%bƒP€Øem\Ú•¼œ†Ó Ži›‰!Ø}5"ògš3逼⟉K0”Xä}Dî:µ³6¶,ØØõ!ïd¾œ™”ǵ JÊÍ$Í©X?p|Ó6у¹Û}«¶¸—¿sŽùß+WBÂO¨&Túo•o±ª6]ÒÒxåêWöúTí 6I#ÏŠöÆÎ "$«¨7ƒš$ý"Iº«ê1®Íà‘©m—°MBøõ¡+Ï{öÏ%¼°¸]‰R %õ¤+¬;·4Çåa°³ºŽ 43žû×1Ó¤+p˜b¤7Ô1«+ЂٙHR'b:u¥ì ù©Zèß“ö¯m’[Fô¢rF•éÓG%ò)9Ëcšz&bpqÜR°L­h÷‹¨D—8”è#ƒGƒŒêmü~õ4iî%öçqŸ@uµ†?L+†\²Ÿðh]ÄòÜ,O$wy“,Í·ÕÒ`¤…@V¹;)¿5æR&$ üS,ÅŽ–NGqSä%tD%Ùo yFc…ˆSúAÞ•KKÍ£·svPý_ÕǺĺ4‘¶Õ^Šâê6[š긊ŸœCmw;éEËrwÆÍUéè¦î(ÛÔ‘Øzμà|y®¶^‘ £•÷dnÐímm¢÷ÃG!$.+ÍåØê{æ Ôe´¤.J–\n d‘QºÅŠY¨ž«#RŸÐz¾‘€C“ñB¾é©yi$g™täžEG¸´HÉŧ)Ë"jFé"¶²*\g`Hæ„Ñ­£4r.‘Ào^ÀÞ¨Ö[QSаØê\6.5ùT¶éÈ®­ôt•îÖ0¾žò î<Õ¥Å(G°ÛVäh‘["é:õðßXÜânK“aSó†_âïE„«2DIIø¦o­â†åÖ0}§â—ÚØ‡>¤®x]ðá€"rÊ$FJ2œÁ#ƒî½[´¾¡…´ÏŒ²³û>v?â£Cp&S+§°)Ú²$‚2ϧÔPq†41󆙷:V/ †ºBF{}#ö£GT¹Êœl3K«4–ΞõlFR¢ÊYNH$î7,ÑÛŒc¢z¤‚@8[K¿Lo«$ÒÎ2z‡ku+¥FëÎ;ÔN«fñu ²º}Dz¾³†`׎Ž’ ƒ±ÏŠ‘£nÿ5ÇÉ•²›iPPºŸ#ŒNsEõ5@q‘šÏ¦qÀÂñA1:° ¨ÙNsÍ.®{Q¨@1Îy'½}îd0È$gäW¢#«:‹Øb²ØI°ëí# 5…jzæ¦L¡1ýXûK %ÔߤðF8£©ÒÃß;^ͤÙÜÁ¯UMÔD6eÉPIÚ±9ÌŠ58ÁȨ¾£4…t YÜ‘À­zLãíýh ê8¤‘¡d>7$~õ—‚g`­!;dþ(rz¨ì²®vÔµï¨À'´HÀå~>jj"2LˆH<ù¬¬Ò´»®ËÚ´Ó¸mu 6”)ë/àüW‰®ã,Žà$`2Ì8Ø B;ÝS÷Ùæ‚Ä‚?zU$‘')¬²ó‚iµe+–;øÅHÀƒràAŸd`Ž)¸eÉ?µ&ìd“8Øm¿z£ €?üP6„$hPš°õ0NvÛñ-¨€p>h%Te†Xæ”æ>ý á•] Fø«¿ƒz5½íÛÝ\Dc…‡sçíQ"ŽfQ}æO`r3]ïF‰:}¬VkÂŒ±–îiV_³à™@Ûä/ç9ÿoµ8895ð<5|ûƒ_:ÌLOó›Sª£V3‚juêH­• ¬Fê±e‘NsÆ3Þ•¹Š1¡°]ÐqžÔXÚŒ§Q’XzPz‘ɦE9*N¼7P³JQ´’4Œ±Bí#„`'=éÞžÃdÈÕ!,3ÜU.OÞQ“÷ <ë·¦øò+ÉnAíçšRñàF2ê ª3ñPÏY’çªA¦˜@§ÉÎÔXð=E."Û­ˆŽ­ñÛÍa;iÁÛÆ(7Á;׌àäw »˜DaMÇ·:qžy5äʯ1 ¹¬É”*Ú²1·Å-4ú¤Ê±½j‚w±ÔnXǤ¡ŸNÈù¡þ`Å1N6ÁÍb%1DKÉ€F|“I»™vÎù­᪠<Œ´…e:ôŸŠñÐs‚GsR %!þ$›ƒŒƒ[36H;Pp£©Ÿ @ÂÜl¸)+™ôFKDoš<’²€µOêO¦×'l‘NĶÀEåBƒ&Üßݸo~˜ÈÆþjb¡gÎûoNÈÊä` š]A«¶q]”EÜÒå‰.Äy>(AÔrǽß1ä.9Í`†s¨. ¦¬ßqipŒìia©&,=Å—FÍPþ¦ãa^0eÃ&5ôñÔPѹ¥c”bASK0{J%•˜³|Ñd™#öœ–=…-ܹ3¯½F 1\‚vÜÒÓºÛÆfSq¦™·"BWcŠT#]O4@¬=žˆ7¸Y2}~¾å.Ö‚¦©[ÉâºšÊæ0°õݤœ6G÷®6;lIc&U¾¥ÓÇÍS´Ž;”e—…ƒ’jlø·%3qebŸnÄì!ºŽæTAÜx4¬®ìáBÎj7W=/[Õ‡¸<ãïUà¿·™UTâ¹ïãœfÆÄf3bæ®'‡ÜÆTõ)#’yÂÆìâCºÿ¤Õ•œ6Œ•àãŠg¦G_Få@ ™ü(Ïø¢F 5Ü¥HE&)Õ½3q+îKlC÷#“üóKz-¨U +µObÉ,ÃÉ Ë~§r3Îi¼˜èI`TÚÚE^å‰5–XÛÓbßAóŠJk· ŽiY/HÅ1q¹Ù0Ç+ܨ÷L ô€8íHÜÌà†S"„/´É¨/;šÁ˜ÊÛ 1qñ7Pênk…)£|*PŽW¸w##¬yúäk¤[Åš%™ceW܆؊ãcº–Ý ¥»ªœ}uYQg…ѳý+|Œ%¶¢f@~æuq>¬ÀÏú·¦³½aI8Üö®jÎ÷ói¶Ÿ)¶{WbbË€Äü×62§s§¢,C–ÀÀ¡…ËêÕÏ"qm뜳ËúU° p±…p¤ÐSÓM n=ãP=Žõäp*®“‚ 'a€Šø†àù5ð Ö€Ó×4.mÈŒ“ ^F7¯ºe¼[«M! Ç$kj\ "¶¬êšœa¿=O£’ad1‡À,ÄpÔ³nÙ9áEoN¡¨ìHïÚ²ê#Å 3DÐZ4x##ŠÊD]3€Jœ6zÒº«ãb{ÖÙðë•?Qì(lÍêÑÒ;íX ªq±­I+&êÛPL‰!ì¿qZ1‚Þ5BÌ@U;Ôßø‘šb°¡P-Í:È’ÂÉ“ÏÅ)¢Dß^¢{昼@7>·IË;çŠlÜ4Q’XŒwˆD¯¨esíú«D2©‘÷ÏjƦ0´L]çiÛÞQý(RF˜*[F¬|gš$×h ®„$É ,¨Î ²jôô¾¦³…Z‹_ÙÛ\® ^=Œ¹S8c+™þžYê1:„`¤ž”‰°öŸ½yaÑ?,D³0ãé ©s*¦ÏöœÖ<šÀ“ºQ¸Ÿ¨›x]±ày«“^¬wFéöœi^¥´"öÄ´R®å”òQ0 ý«‘‡*Çj¿*Is8É]$f¡.Ó†ÎÙªüe u#òO&¡‰‘:±F‚*·Yël¶PÛÛ³+Oy$ÎäÔ”‘årÕ6é¤û£à wvê'›*=Ìú²°ÞWÿùt9§°XÎIg:I=¶®n$i¤XÐe˜à ý¥ÙÅÒí’9}α€27ßùÐyL*Ž kŽ$­eh°~…)izÇ£4NWÔN ¨“þfeÓ»•;nF(+Ð/gÁxô9Î?•q™‘¿QQît¶³ÚÜÙÇ,.Y$ß>> 7 Cq“škjl"[tB«Ï»õ4虀Ýì+˜ÀÜý(ö} îùý5’8Ûþ!昗 ßY’$@ØïȪ[2]rÜ0µìEÒ&„ŒSÑÈêASšòÀHħšb+xão<“R»,E"-;E+k”8ÿ÷#8?ù¢%¥Ë"H—bU< õåÌKŒÉ;Ö-æ6À©;‘ñYd®§Š‹žJ— ã*‡¶4 d“?Ä\`wíV#¼>—¦².ƒ¹k*\ á]öÀãƒ%v³Å[ÓD`½%T2)èîFƒŒæ•^˜‘1¶MJGïšå§Btb@8Ç?ʰ„n¡†5öŽ4ÙjçµswHE̤nŸÚ«‰ô° °;©íH‰•D¯¶¹ š~T˜ŒôÀ”g;wª3¤\õ cvð¢™ü=ÐäêWD•ÌH}Ìxîkô»;--„1Æ0 ò¼±ˆñ^â1ãö“ºGE·é±(@d~ZR»švL<ÚTßÅ>ЪHÓA`23¹’M¯Û$c «k»f>©-€˜®oñ?L’æd¼µ]m) (_=˜ÕþZn tdù“üÂBH\³)ˆïæGQìRŸ§0Ž9€`¡OíÞ—ü¹."ß9æ¯ùCu‹B&rïJßÀ0‘Øvª2[kˆF8sÞ”¹OMô¨y¥£V!š‹Z1V$1«¥µ€3k:uükŠ6Q…RÉž+§³(q&H'bz$û}NKñxcÖN¤PDK¸ý_zR qhšŽàUÆÙê6óîVXðsðóQý=kð*ÜL È•ÈÄO#8bç|Ó x?ÈQÝ.6ñ_GrJŒ¯»Å0©;™ÎGÖDŒj™€'€)ˆ¯ u:d]UõºênÅ.£Žõïˆ=ó2 дêq—5•˜8;v¨d¶wî*ÏA´üôÉj1¦òç‡ïJÉŒ"–&;ríÆ¥Þƒ‹ÌÈ„(#ccæº[6w‘™W=é\FaHP…U\…=EEéãó¾F^dš•ÑrŠÊ}5 =ÝñZ$”Ç4Ÿªí¶ûæˆ$c'ö®y]ĘžSŒ¡Á†< ÈEÜD–9Ïjöwˆ('8ÇŠ˜×ñ¬¤“Æiøñ’4%8ñØ•"öWn‚’DŠ·®É°ÓÀøÍ%jîÒå²Tö&šOàÊÂ5oÓŠ>ݱÀêHã¸Âæœn«¾+ú¶9©R“3—ìhñã ý¦ dîe®n¤búÎ3€< Çæ¥…Ás­{äS (¯î){›p¶þ¡lÆF2 RTC ;”}ehŒ™;¨Pܨa±$ž1Rút“O1OþÚ àÕT‹ _ާӄ–Ú&Mãš?>Å#Dƒ«·4K”•û 2ˆr4lJ߇nVsù;‡Ñ'ÿiŠë­Q"Œãã¸/Êȸd ¯œ©Šêz_T[¨„ƒÊûûW7ÉÇmÉzŒk P—³J±;.Œ.vÆõ%}[Œ—Î)Þ¢òb#‘SPÔÚN ÆØC »šÅ 57>áz|rG)œÆ)øàšrd”é_Ò¤rk]1C«’i–”3zq€OaJf7LFæÉë³x¤ÒÜ7µÏ¸œZE×sƒ¿þ) Ž ½‘ª.wÐ2M“44"6«©Àý#sB»¿yŠiÊÙIßîkÍo>7M3¤(¿<ä׿sþñˆÍ‚sžùíMGn!L†Î{x¯bC1ÖŠwÒÄYIâÓl²¨~Ô‡ZžK~—1ƒw*@ÇaÜÕ9QHý]éft„'9ø¬ FÌÓ±SœèR'¤ªNõu`OPJv#¿ÅMºè«m/­bÚNrc'oÚ¨ØÎ'‡Ók™{Š©XòX·Kxc1êÀþ\W7ù|»€3]˜íaôÚLƒÝŽõÓ“KH­œ¹ÀÇj,mWÇÜA£ö¢Úȯí8$Pæ´72*úKi»~ŸùD`ì}˜x¦·;3A#¨ŸUGŽ%‘‚•<`÷©P³žæªßÌ žíò¹<–ª¡ˆP4øª°~™>BIÜÔÒFÛAU/"ª‚Ÿ½£SÀj?F†Iz’$M…'íFÌIüLEäÀNŸ¥ô«;(cuŒzÌ£Y'$š¤$Ô vóKA$šÎ4ö¦DÊ0ôóyIv³¹Ø Pƒidª±†cÂçù¦°rZLrxj™SÜOÍ|² Nد¿Sjl${塚ŽÕá€Ív$¯€=¨84d\J†?=«rŸQF0{Q]A;ƒ#KÛ¹Ú†Êí6¢ãJöó^+ú~Ã4nDhÇm¸É¯M¨Fu#<“Ú†’+j‘¿©u3©ÐŸÞ…?S#UB«ò昸I‡B¥gWÕ‚p¤sšö!¥´ä¿¥s×]S¨ÏncÄdþ¥P -køªèo$víÛÖf#N<ù§# TKehûDïjÄœ`sRžây\hM+çÍ ~·ÓeT2])#ô¦H¬Ü\Åoæ`";®‘¹ñµyp²ö! ¨7qõbÕšò&Ió¨dg¸®ZOÄ7’Mˆ˜E# œ}Í_4YrU‘÷ûÑ¿ŒÈ,û‚žB¹<}Gd˜é(£ÎiW3° 1ñAšö%F‘ЕMò©3þ$–=>•¬c|‚ì[?Ú½‹ÇfèC|éŒnnKÉ̲FÉéà äÿµÛ ÜŸ½)ãuBgud_¨(Æi¨\Â}@*¦*¨È¹—7wyäX‚êØŸ=©ÛI¥kc­ÀÛ#|TSp0Kàö¯›®h]€xÍNØK »©Nêu»•b §ãšF 0 úwâ“‚àm&wóT-Ìoïq‚FûñXW€¨Þç—°§åßã|ü×'©­?Ó™-É%”y_+ýE!(#ÆØøÞŸŒñ`–û©YÂ-¥Üo½¬ÃãÓ5vÊÒþu\)\ï ÆGï]„R½ÌJC„+ʱÉ?½ âi!mF3"pvù§åóY¾¼EÉñaànâVk šúŽC;ížËFžéä+.Žø¥.B¹`v Aæ´}ä(]!| LEýŒªÔ†æ_r‚ÅFô­Ê2 6i (2¨Tî¸äÑPÇqfà2¶Gàxîm /ÓOLƒ£YàÅ{qbdˆ2¢œVäZFf þžôHY‚zy#Pú¼ qb6'¨I怀ßʱ©ÖA` 72#:em#“Þ²C,±¾¢îEoÈH‚F¢l\É™fvdõ´‘¥ubÀÀ¸ÇÍ5"£;~­ó…Åa2Ú2¡ +}>A­æ+¨¢"·©rš õ4ì?Ô¿j‹sÒ%µÃ¡2§Ûq÷Ð[Æ’«HYQÆ^3³W“»=Óׂ=¸£LŒ†„YPÝÊ_„Ù"èñÇ1iß°9Æ?–+ 2a~¬ùj‹ÑÒéä¸Ñ©Ëg¶+suhÕ +"»ù¹ù”¾BDÞ2Œ÷H‘†…®©þ/µµÊÛƒ4ƒƒÂçïSºõÓGd®îF[AÈ®UŒW ™nLcǦMYâøjã“Ään:ºè?Š'ꓘ%…ÆÆ<ñó]\Hàl~Ù¯Ïÿ["]Ïqþªª*P¯'Ÿé]ݬ¡×88¤v¡ò‘U颃_q©Ò3nÙ:q‘Iaà HÄ0ö±äy§æâ‘X™®p ÇÅLº#sld´LK‚Fk˜id1ý5g$n(wfSÜNßï\oSëõ12éH0žíõcÍSyÂ3¯¸ºŠÊ2j…ïH<‰Ë(g(푲öÅD´üH¾ºÁ2ª  íÏÍtð:Ü+Ç,CÜF¡Ø"´¡OÔ'®)$ˆ&Ic%½ÀFqY–ÉZöi£Kœàv=è71=µÃ2¨Ü)ãïA´ëQÚÜ"\ƒ¶pH`|žÔÙ HÌyEÓ“·ŒWÆÎZn8ßñŒºáÐ¥ç$ãâ¹aÉ2°Ü¤ø žîv†•,Úƒm1õJiÁ{eï?+o0V*Ò¡@>°¥-WBx¾ {Õ£iu7wûFµ'¨Ä`ö£¬Š[äoK,Ї!•ŽÙߊÜ£’0Tç?µ+0õõr¸ù ¬Èíƒí<|Ò-/æ%qûPr{šbŸq';š`ÆY˜u è.Œ8÷P™#lå±äS蚉PƒHÏõ¥n":†rh•·q;Ã(™ÆF0;Të›_áª!“rO8ª³Û†&BôÆûÒ³F$ÖçnsOF£=f)h¯ ÈŒD‰Ç»Äðœ%ä"7­>“ûv¯`Xíá•Î[ÓRjÖzt¸>ÇÝXUJ©’ÃEdfÖ[üPÂï¥Ã4+”|®r râÖVˆK+¾v«–vmä Á©m‡íN[X$Á­Z,¡)¢Ç•p¯ê xÇ!äu9hâGÝ?Vé]^¤ä…"8·r3ñTGàÙVXnQn@süÅtÝ.Álmc·BNƒ‰  ǽ/Éó•Sü3f/ŽAû‰ÎŸÃâh„mü!öâ§ÃøNöGÉdDÖFçÜ@ïŠý­ud`VMº.—eãqžjõ €%/›"~[ÖaŽÛªMJU#:@<ñ]F¥XF³:Âò{ÛVÄø u»R?OrZ=(Qðë‘ÀíRºTõ&rŒf™ºF®·Ÿ¯ªÜ‰2Œ«~§ií)I#`Á†Äpj”E‚k*wÙ±Qíb66Vðƒ©ãŒ'ý\·õ5NÞéš#<šàf]ýz¦ Ȉ܎¢&÷lG qCK§•Ýð7íI<¢ R4åÔŒ{×¶¯"QN¤< WÇ«ƒñjå&Ž)í>¡¹Úxá$Ç€H¨Þ¨_Oø°{ Lº 8÷v BEÀÆkQm1Èb˜Øx¦g,¤‚1É>+eT©myÕÆ; TÌñäûƒÚ›ú£»†I—Û4Ç𜠕\y­¥Ë"†m üPî$׫Ô@9s^E À ¹‹IÚ9}6‘œ6ë«|SÖÅLÌXgÅNAê ðç‚hiÔ$ŽñbÑ®95.äSN2Ý·†¥;‚¯#3€{Š [žpG"½Ö^@3°;ÓjSFKs€My9s_B ÑΖÆ|$–aá1àc;8¢¤JñêC|ìhÅdHð}ëÈ#šm_Q Öu¶ééxw$–8æƒy“j'œö£T³˜Ýõâ1 6F>Õ$—‘ýÀ¶(˜:Îw=é¨bÀÈZx¤€G((WeüSP1•Å´éAðiiœÈÅÙ„!@çb8¥§fôÀa·cæ‚ä“€ gC‰8ù£ ÂnAõ•£È`r«q^¬VŽ}3$²îù©éE-ÞœéÑ5Ì¿”T,eãé>k20"ϨäñödŸÊ•uf ¬¶vëõ+1jbeu‘@9>¬tŽ—oÓ`E(¯62ò2ç?j±i’0NÄ ãy~gÊ@Q׸*œ.s÷ÖÍk´ `ðݨ‚ÊizEºA´ÎÇ0ÿ5yK*à†¨dV`FŠ$'  `*íæ”¾Cýás£è—H²¨2c9Á¯g²³²F{‰]Îq„ ýêú‚ÎNÌœäóö¡ÊNÞ›Æ#ua±ûÐ|ÌNú›ÌžçxvʨD]ðNI¥d‘=¤œðt·ÿ†ºk’`õ-d¬êý»S)y ª¸lœ äëG¥ïNtΟÔ.eÕHå¸Zƒ'Œ×R”ËZ#S®X‡¦ÈÛjóS'èÚ°Ù`s¾ S)$0Ãiþ´º—fxð¹Ú¹¨Î ©”[¨…¥ÒM˜½b‡>í;š¤fŽ(Â[¡÷?½J±OFâM;ƒ# ûoTÌBD9R§Ïz±ÈS•؉ÏêJ¥œwÛ·r§GÞ¨›p» ¶Ûha4Ä›|ã@êzf…Ni¯É’ÙÜ'p+Q#& ç¿oЍ R©Î?ÔM âÄI¦5€åõò»–O¾ÔÔðœd¹Sñ^(,ä³Î9¡¹ Å«1 'ŠÃJ•U!±í$sE!”È$œcßšBN¡¥JD›±Ø Qe–wô=V!¹à ‡Üз srKiùŠ…¹ïãÅ6ÑÇoÃßêÏjë, œŽøA¿jé9÷e¼b–*Yˆ)Ÿ½;"`‚Tïñ@]±,r ØSQ„ Hrëòþ]všA¿Â×:ªsš©Õí®n:£È#yD¸(PÛŠw§~º—L—cЋœ¨·jë&Lxq‚ǹÅȹ2ä"¤{[fžPˆ7ïñ]½²èT™=`  8Ȧ ³¶Š\@ºUvÁÿ½.—¶3Îj,ÞO>§KŒ1ìÀ­¢°xíQ>·&%IbÆUaŽäsý?µ_ôž<׬ª¡tŒLÞå@ê¬T¥ºì1–©ÆÛÔIÿþ~j‡T…ÒùämE{Ø©ó܇›K‚`ö®Ãïó]L7ÄTæyòŸ[+YÎAl± p(òÌ8ÏÅlÁ”—Qm*4vðkÉm}A®1¿u­,¬lŪ• ëÚ@$“K`š7¤<`ðkoÅ4Pê-­»›µ›HÌAÎÕ_Õ5*FÛŒj’¾áTmeG] ÞêŸ2^ã±?£õƒ1RNþ)¨ãÔE'| Q oPˆíñLÅ!—Úvðy©[ö”ÞQŒDÓ:˜÷`sâ––BIŒXm·aY‘’R[ ßâ€ó$jÄnÜ|RÕLñ“:•ÔV÷Èî†Vˆf4?N|šŸuÖoîòÒNÃQÆm¼W½dÿóÒ #±P+«‡ð‰ÍÊÄ1u½ñ ‡GéKnòÍ,®ÆF ›)=²OÅZ±ü]k:XeÆpI#5ùÏ*@ª½&@¡—z›?……­Ïf{U?BN°†0ÿ—•ãîÑqûlj¤eXÛ(à ãšáºeó"›fbt¶¥Ï<Ší¬ó-ªgoojáùXWT¼£È dl?€¨&“DD]é{»è­#igF£ƒS)'Bc‹Ð\L±åä` ïÚ¹N©ø¸·«š}¥'û ŸÕÿÃzjŠÂ68Èäö¨—}NÚ8 Qá›È“]?ÄnÜL!UnåüQ{orn%ºQ«ÒmÆ>ݪÔÝ^.¢¶¯²¶¶ÿþ+ó ŒÄË);÷=è©vȈf…õ!;Šé7ˆ†ª%sl‰Ù\Îöì.½fW”úð)¨oíúœ%nÐÚNFò…Ê·ýÀqHXÊDG"°ÉL=Í4°é8¨Ù@Ñõ,»(5™†/R`­cD‘J~ÄR}BÞãÑ o>ä5n ›˜P5¼­á”p~ã½35âºâêÉ÷h[Ó?Ëé@Ww+[4ý<Ü:zmpéóA¶ºhX¢å‰É5ÑZÇÓä—‰4ʇóƒtk{7ô‡Wµ Ùe §ʈþ Ñ{‰²Oq™=¥XgHäPÐÌV‚ç$ð*Ÿü- 9ë6H€äéäåM¨éˆ¾›uÌ4žÝ^žùšQbPù‰%à–áDCddé¼V^ÕÄæ4vWu‘^8ÝÍ´¦UVöÚ˜·¸”NceÉÆìÞ¼K£¸¤0­Äñz‰£Ÿšòòí½vÐÚ•XÚµs ëq–Ê‚u©[ø÷±;œb˜´M™ÔÚÊb2zïïa‘ƒšÌ7¤Z£^[½y$Ï ÄSî uý%埤 KüXF4“î)Û#µrüÿEe_ïÿÙOß꓉fõÓ@ô _õõ7ø¤Åã¿/†óJOw3–Yi…Ð)ÔÀÀÎØÜæ¶J… §žj >¥m¼ IÞæNãK.©.GÇþø¢\Æ‹3cHÞ·D!f]‰šFæq)Òî=Ç58²b¤>¹~ò8¶…ô‚=äw¥â¹X”eòqçj^Y’K¹$b4†Æÿ™‰#aŽÆ» ƒè•¼Ž$êÅFâ¬Y<7Ê}2;“L³(Ú?n•Z·¿¼h\èŽWúpߘþ;¨ÜÔpÂŒs«uW·Ò°Æ7.ÝþÕÌzž­ÓHØÔ['ïOõ.¥;Â!”!ËgwSRL;7“LÄ”°‰#P·NÝÉ¡;’„Ô úÀž)»k+‹ö+AÁsÀ§šQf/gBÖ²Çn HÜb=‰´²ÊA™Èñ½_³éðØA¢ Ÿ©ÈÜšG¬©KFv†Tã8g ½G|T¶d8¡NšÛHcWÞ†dgÛ¢Gg3€Ë ŒO5Y wâ`ÜÊÝóYÓ¬ûòª Ó§kˆ Çs^zAI j‘OPøÜQ#QŒ<ÑBãVôÂe\)xòb<þ¦½g"c1ãï¡Ê®Hâ»?ÖimӔĒnÄÏÚ¸yde_5Úþ¹kÎ4Wµ³­ÿIcRù¾+LålXËåCŒV—Q`âƒ)m@ ‡z5¹P­ƒ{׊4õqƒ¸Èߟµi›HN ‘ƒšHÜ7¬Èùµ Ýþÿjò÷Sn¥#%wuÅ}©Œ~êrîa/c(|²ÅÔè$‘Lu*a Ï›ø€q±Í,ÎÊúxÏõ¬Í4±2ár1œü×3Öú§Q‡ªÄŽD’l’¯ê?&&v¡4#×}§´4q¬R’Ã`jMúsÛƒªXe„œ{HÛî(2@“1,5݉ÍNÑ%¹i2GÑĬGê‚Æ§ÝC¦F²ê¶q’wQÁ¬Z~ê®Bª÷.q[7s çÅt]G½iL‘’<éô·þhóæÉ‰,CĨÇqk?Ãke"5Æ™|¨â¯GíŒR¡6mµzë‘€x↳’NÞMqrel»s- Ô1ÒW f½YA+·àãcDö©Æ7Ç4ƒ™ÏØE,±–a¤»dŸ½UmÔ+i6k Œ)p>ôhÀºVY º7 m].ÍÈ[ö‰\ÏèH Îüø40èé… “DêrG4aI(N5ô¶N À:ò¦X¡1fìÙcfò3L˜¨²š–F5g#m¨¢P¹ÀÎÜVpÈŒItYÈÈÅ gumŽÔ £É°#|PÞE ¤“çⲡÓK¨ïœšõAy'šnåŽAÓþ£^$ÊåÃ7´Ö£zµã §“Y·„‰‘=C­Žä+ (ØsñßH§e—[}8Ûî ¶„§ü4$Jà¶ =©i‘}BªòD ÁΗ5är;t!FwóZ-`®¬s¾£½ TšXeË*•lŠ×3ÕæêP\a¬ØB?[sü«®+’uÈöÜW‘È&6qß<þÔÜd)º¹–gæ“ÝCë1q‚Ãæ°‹8·7+ µiÕÛ5ú,±YNYæ¶·(Î]qÝ_®þraeÓ¢Xís§B(÷Ÿö®®åþª¿ÌÆìÉ <ƒÚt÷>)ßþ¦’Ì$}=L­·ÏíMØÛ* áÃoQaéÝI©}UÈ2IíëLåÉÐ*è /¹Ü~üM?UQ ÒEäá{UÿnÕFds&ÖI!H®*&‚¦OÀjêzWS’K!ù”M`:€ ŸšæçÀóABQÈ×q©£ ÒF~i)œê+ƒŸ"˜7qO1ïé&±»K&Àç< PÔpýâ¢ÎI[Ó…2Çɪ=;§µ”m$ÚK·öª¶ö«i>£}Mè+F%o¬Tퟨ„rê‡Rq—[cØw I&­»xªrÁS¥vù¤ çP\òdÙш vàT^¦—QÜ$[pG®Ï»niK«s7ÔWn3Ȫqdâwv*yc+Áf±€6àVåºGŒo÷â}qþ¯äk1Î Æ‹ãò„w º¾¥Œ×šrű€G4?[@ЪÄcl×Γ6’w ì(˜dÆ•cR{ù¬Ï<‘~fvЫ؞~Õ>ë¨%œDÎÇPáG$Ô¹›«ÞfcíÒ¹Ø v/¿ØèI³ù*팡qÔX"'¦@Õƒõ|š’«6–~õág‹QL©S±û=Ïÿ*v¨N%_ô·‘ðk¨ˆ¨(u9O‘² =ùþбOéAϳôšyX"‚„ŒŠ–¶Ì;0ÙXî)˜¥h§p¬k0Ù©Yö#1½3q…üÁÔ23“^I\8Ï5 31îq½2-äc¨Ç·÷¢º1†â ®KqàP\…#@9§ÞÕ¤I:‡"’””È”2Ÿ$VpH„ŠYs©f9ìM7Q•$Œ,7©‘ ó“·¦RGVãRö.Š}BF2Š]£çÅj`n yÍ$@q"½i hX6¬ïƒIáFÄ£–·'õ¨ôIi61€{R±Ä?,d}†p <ðG{q¯cîí@š4W!aS8ÅVJDøÉ%„w£Øô{Ù„R]\¤„Š€ØïV"èÝ6ö´„²_ÿ¥ÙMêÆ‰Èvî~+¡X”M’ë¹ñRgrLjS"j hÔq¤@Fûä×]n«<ñÚ¹þ™ô9 ¨±í]#Ùæ¦]~·ISÒ‘÷^r<üWI d`oóÞê‘:H ÛÇÅîF¡äȹé-,€PϬ¥y?¿j÷ðçQ–Ç«jużÛJ…‰ÀìÛøªÂŒ8:IòÝêuú[Ùê™—ÿGŸ·š³@à©ÝÉóa, 'è ¢5/4¨öz™ÕzäV½æ{i–I#R§>ã\×Të-aem¸ˆ3(ÛÜ6ÁþYýêRBrGc¹’˜ÛIŠTfÊöx;ØÉiûò~¯ ù¤’Í®%fBpXŠe!!HËó¾šk¤úktb#=ÆMXä.±h)ø´_þ,H^L$ø­ÙÀg}P©”gH >Iñ]¼QèÄÛÈÍKê.yúE̱™-ýL‘¡Æ¬øò*EÍËõJnŒ•Õl.g³ŽÒN­RI#ª€2jOü:ÎÙù]AdaÌv£Yþ|TðØ»_sš]Àì3IÛYI9Ój#‘]‡â.“$©öÖæ|{Jàäؤú_áiæÅÅêÉiœ„Þßì+¥ÉSŽîHøþÛ“-ú±V ?Ò¼×UÒzgLDÒ-‰cϨŲh¿“Ž7Ê.?Ò Í;ineoSHy#lšæù>S0«©v(æ8ý=Í-p™B3±Ó1F¢ù ÔZá‚°ì<çŠüöXVßñJ]Û3KÌN¬o¾sýê÷Wê2J‚ÝÓ‹†psê}ŠW§ºÛG$Åb4®Gó®ßŒ‡ “Ýê3ãæ@Œ•.ºÙŽÈ\nhbÂP\¦øÜ5»9kÔcÅR–ÙŠÈNp~’œŠn§Eóg5õÒu[¸½gc]pU»o] ”Îý…ªØAqeùye шÜ0唎¶±G$‹$±€¤©äÿʽ”®E ¢¿çqÙìòØ1Ó3Å'¦±dsµZ°Up50â–fbs“·‚³™gʳ¼ŽÆ¤áq¡n1#–tcJðsRî}.A'p*‹³IçNNÆ“vem$ëNÅ©FHêv£óI*lë“ÿpØÿƒûÒ¦ j#øªýA‡äa(0VOèGÿŠQV6]%ˆbwÛ‘]sÄNvuUÊDféJè°ßæhŽÂOÔ¿ïTDihr@•xJ”÷6}>q ÙÈA¹¤§ë7WVÆ”C…ŸçI8NCj(MAEâ7(ÞÉqÏæVë×Aa¹’fmCè'oØRýÈ^ê7kZÊ4“ñJI;\[¤kÌcqñæ¨ôkRƒópñJ§ÿå§Ã9<ÞÖ¢¤Bñ]‡Ò2 óVgùö‘\ÿL“B3‚ûoU$›D68óRåœ~?Ós¯ë*MŽK}ûRR6< Ó®f‚æ#É×î+Εa'W¾d¬I¼¯¤½h¥·BK`÷ cÒ¥ê$I0Æ®íð+®³µHU"Š=*ƒé¾iËk[HmÒƱŒ) š×¥éÊ…áýUÇò<“Ðê??x›DË–_ÛÍa-–L‰yȪ!KOëF!€RØñQü†7“ÚÂ0ßpÕäèœmG½í#ÖúÀlH­Â‹Øô³úE†GÅ1K5u5L•qê4‡IÈù©W– ù’"CŸ©IØ×Fb)•´ÿ:JâD@vÏø®†,¤¬Æ@ÃsœŽÆCpáJ*Œ¹=€£# Œ—ü=;/Pk…gÖrujÞ»‹.§ ä,˜7v Y› Æk¸…—”öXÝrÊvÒ¤õ.½kÓYVh¥?ú1W$][·Šæº„1Ü]ÜG2ëŒ0ê@äP` ·Û©î†¤Î·ÕãêV«Œ¬¨ÇøŠÞÖøjK§Y¬?Äq‡.ÿÖ›Ç!FAüȪqÄI2„Ûmö®‘ȪœS©¸ðÑäÝĬÊþ`€'%™¿Å-Õ`ÞÁq­Š¥Ál…5b;hýF?N•ÏšNòFü›<`êC±ïB®9‚!:ZÔVâ(_@CÜþõk¦Ã®Å_` m\¯Uê÷ "Co#ÂtåÈØšëÿÇ,&ÜÌÌìÊX–9Îõ¾Bˆ‰‡2?ˆlòÁŽúxûÕË;1m© ÷°Ûþ‘Z³´U_QDZxMØ–9ÍsÜШnöjc, Î öÅy&ÛžhfBÙÀóC-…Á9ûÔý@O¦mΓµ&ùaN­œÎ2# ýÛzùíJ€Àó¤gâŒVK•p0-,)%sUÌ6ãc­¿p+%cÈ+ày$Ö+Tpz‘ÿáɱc“óZüˆ {vûU6l§ ö'.2X¶Ç9ÐÍ ™1#f#åT G¨"À5 ̬=«Æi畽ޠØx©wÌ&–7–Üc⟎ïqФš3˜ê±ßß\ú¦Ê@¨º}‹«ûQú%¡Y— Çlì@®£P5gæ·*® ¬†68ÜUM有þ€.Na®q=VØÙݘ‹eXj½/gvm§ QO +¢ëÝ%neŽcê&ÚXÇÞ¢Úô‰çŸCé‰,Mt0æFÅlg+&‰—ê'·–Ó=˜ ’9—TL;w¡Ü,Ý>5ƒÔ,XdŽT~ÕÕÁg •†-«Sg$÷¤/ºt7‰†Ìnœ0¤§’ W¨öñ‰Rù" æŠÝ$*@,T•?ÕàsÀœgïR%éÅ ‚"ŒXíõfŽÓ´N¯¾W°ñMr­úbÑ\~¡ ¶·®HŠ0àñ‡ ÜÍèenàhØŒa†Äùª0KºJXè;ŒsUáx®0²áÓ#AeäÒrd+ØÔpÅ­ÅD¦I¦ÊGÁ¦cF 9#]ÿA³–%—òåYŽ?…í*~q\µý—QéŽÅµ˜Àc¿ó¢L«—£_ÌYȹJIæ5×4HzDjsq!Ž@;‘PáêóÁ‚ª y&œ“¨Î`. I¸QØV6, ÷ râiB.ž±.€C¸ÉÜÕ+^•Óc…®ç·Ï¦5¶I5ÎAÔ£gÙ÷®†Êö› ˆ=TÕ"`oÁ©ó Š!òFž@Zâá®dÉP0‰ÀOµ8Ò$@àé 9òj¸»Oc;ÂGéÓ×7 þ¢vÊñKlg»VK6³-¤m&¢ÌÜPžg¹¼®ÎÙØ1Î+ßIý/s…ûkèTqb?Nõ>-îz•¶ܱ¸E…]˜“Bzâ!ô£b½µëàÇR0 ð2kÍ#Çz§Óg… Qùr)îÜVÀ¸¥K?ˆ†HÈ,ë è¶Yg—w;ªš4qDñ«ÆŠìÜç|SјVb”äkŸ“?!S ˜À òâ\€Þ3KÅ?¤âIçÍáýY§‚AöŒàP'£C=ËkÐ2·þi:1¶µ5Õ:”­r‰! ¾\øÐt^–Ý/¦ÇnÀ [,ú|žßµBü7c'X¿=Bó&˜—«ÿÙJ¤ã,p7¥æ!Æ?¼šÛQIÕF•8àâ²c9~ù§#oQˆÆ?ÍOj•ld€¤)¯Pn 9ÉÆûÓñÀ±Ç±ÉóJLÒ3Qƒ°¤æ•á‘ݸj˜ŽNŒj“+ Nw5±1 ¶65ÈIøžòß©Ágé0+ÎN;WXʦÍã¶*/î Æ¡VPvz/¨@¤•÷ÀîkÁq /üYUqþ£þ)/¨E#luÆ öíŒ åú¿R¸s%¬R(N’Êw?G¨u2˜lŽuldãoŠqn£Vƒcq]m+ÜY¤&Ðî l+à䀧lv¯2 ;8£2(+‘0¼×OCS­ˆ€Ê*ÓS¬ØÈ¿5TªÌO*GÓïÈ*àá¼U-!‚®7ÎÕÉÎĹ¹[æg94Ü]²)fÃr{Q¢¶ü¿ªd]G …>@3Ûã'Î)R¥¤—YÎFTyª>REzW&– [¡`¨ãlqJ-Èת0t“ƒšTê6}=ÌS1iŠçB ÇßÅfÒï=5dôôÉ'¸)ßjzbEî=,䲫`-`«»PißošÕƒz­«Ñ]Ž2âÌnB Œb”Ä!£5ž… 6ñ!CÃZÕ½ŠH2îi‹øó(L€ÿcG´Û íFðÔçæ›”æ?ôµéb+Lþ³ÁíSÌ¢8w;йøí‹Åe7›ûW7m“Ëg°Íu0ý°«ÈFB"H­-Áõ ä–5ì€Ó"«—#sß5†M*ŠY‰Àdš³—¹!_P6Å…Äz-¨<×Yc Ñ¶ r’ý¦³Ò H$¿êHÈȹŽ#±&ƒÒç2ßFE!?m&£Éd?_R¬HQ~ÞäûD[xÆÜG5¹&i‰8>)fÀíMô«SÔîŒ@”F]—“DÿP]§—d*Ǻ7Mžæa"à 1<ä×OÑìc·…‚‹ÃëëHÅœhŠ3€<)\lHÞ¸>OÙ ¥ƒZ©°å.À¢¯¹,1Xe*=¬wùâ½õÑm¾*0.l×¼’ Ïø¬ä8÷ŸåFÖ’aÎ=ÀvþUáA‘¹¬::˜#s«Ñ*üTyÚDewÔWÏa]Œ6r ¨ßzZ{8˜i(<Óñe ØWróÜÊCjó^ÛA5ód’«‚Kc`&¨ÞtÆHõDº›šâçÐ’ e[9Mñ],n¬¿YçrzˆE$·SÍê’¶Ðe˜qœpÉ8«Ñ ^™l‘#(bžÕh¬?/Wmrž5cWw¸·X ±Ä¡qð)ù˜*N ƒ¹;©Xú±¨Ø‘ÃÔçA¿ÿƒ¿åä á†x>Em³è–$ÓH´fGW oŠ :n¦Öîwq²œ:`†ß?£GÍsýîEoÊÌyÝxø«SÜ¥¬,­í^ïñ\\˜Ê?„T0vUÎØ0ßOýGŠæ[ñ é¿À%«&\:©J2Â}At’q‘U‚y Gé¡1¨šÑVCë¶A©òƒ‘¹z“nºOK¼P“Íq8?ÁA?sMÚ‹;tCe6”¥9 Dw!{QDêAÉÆyÇc]ǧ·(¡ˆ¨qσ!¯Z(ˆÇ wÿ÷†¦µß¤ƒîãzóÔy"Veû€i|I› ÿ•a­f?"LнK‡Ñ2«yb+m#…À ýù£ÚÄþžH*Iæ–ÎTG"7½n‘JÿÌO¤ñŸŠ-‚[ÌVâYa?õDJÿ1]‰=¾£^ɦKvŽÀÐcò™tv š»œKô«©dF·½‰¡<€§Qþb™N›xȼ"RÒÀãö®Ž¤Y“HÆ#\Wâ‘/Mê -åhÄ‹­H$}ÿ­[‡)Îÿ‰fâ.©¡cü3a>³Ë˜Î‘JD ±é™›'œÐ:â.·l@‹©\iÿK>Gõ«iø¢å×0ZÜÿüH@?Ìb­ll‚¨BÆÄî'°öù'““Å8—C^‘î8ΧüBÒk&ÄÛjßø/íþGýéøG” 77>x– Gó4—SÛJ‘ÅUFRúhpÃ,׸ åŠYYÓXF9ÉçíNA`³’îÐçaªb¹ýˆ¢ô÷THʬ 2~ŸIÚœ Ì,—wŽHÊ2¯´ƒíßs^‰T¶ãÆMmºUì`‰ìfOú½2icE6á€#èµ Á÷=ôK3*IŒccÎ+2¡2d_HŒƒó÷­ZúßFIšó¨Y\cÛ(Œâ´Ê “õ¹ÎõK‹BΞ’JὤmÞ¿Aü0‹yÒmdEÒ4éÇ5ùÇOè½Fù³¤®§õ‘üëõö‡§ô¨¬ÚTB¸êÉ'Àoq…½È1lE\©#ª€«ôK ifº©Ç“°èDº‚ê>Nõáœ>Ùäm\²웘 õ¶H¿ó\¿ÂíýkhˆÑWÀßùÖL˜}ò3XGT/“…ç9¬ß­BÙî}.­E†7ç4œ ”lÈ¢ÝÞCc¯+¾õþ%ÖìÂÕ}3ÆzìGc zœ„1Øi?Ò±ŒŒ>ô¢õ.R¾†ÿKP¥¾Š>¤šr;nhxnªPõ•"³™ bŽI©kÖÌhVÞ7ú¤ÛúRÉw{ üÄÅ”ïŽò§…>ã×6£×·ñ3…D™ýXÀïKEle“[g òh¾„@É ö%¿<üÖrÖ¥KŒ(Ôn8=VwÆù¤úü³zqòOe¬u>¥%´†Òßê¸ä| Œñ0bžhðàåön¤™2›¥‡žæ{‰–_olíý«Øð›66¤Â1<ø¦%”‘æ¬(¡7 &ovŒ¨ÏjÏü2Hã“Eô˜ÉÎØàR×éA¥N¦sñB 5ô •£’=m’HØ|R³Á,ãL+G˜ì*œ³Bºa]8ñ[†Ýf™cf* ÉȱF)on`‰"2zvÔZ† ئIu¬`0Å{mÒƒÝ<-¨*ïŸ5fÖÙm°ÙŽ1’jlÞBŽ·J´&,¥õc}hÁ󾡊ÕÍ„W‘4r`†`E³°ÉóB†åd#S{²F°S Cöš‰%p³>;Å[°Œ2úa}Þ1IÙ"‚[ãlÕ[|Å’ †o<×?3Þ¥J·¨F¶a‚Ä`lW4[)&¹`³úmØd©§cé11<ƒéIäY•£È9ØÿŠF;:„ÊŽËnÑ õ랕ܑóS-,àê—+n²LY»,có’hR›îÞ¦ggøzƒ¢Z ÛÙ¨ýÎçûÕ@N¦QÇŸåRúBImü=ˆDÒ¾¦GÒŸ†yq4&&bp5Õµ@öX´»›a¬3)(cÁ¡È£J¢&Ùßâµ öŒî ïšË‘©ÿš¤Žâ‚ÌðÔ€ªî21È¥.!P}À¶ª¤áYyÎÙ¡Ü@4¶0 x5F“ ŽÞÞãÖ‘ItÜ š÷≀†ØÃꑸý…14~O¸x¨·±åX’ oŠb¢;[nQ„ :Õïðä˜FíÀˆcúÔ¹RXîO¼™rsšfÎd†PÌ…÷ÇÚ¬KmÄBDA¬ŽôÒÃP2öUhÈÖ÷å$Tp¹ÓÓ\«HÉǦ]Û˜®JãnsFUk«r§*ê V~ß4ÒÓDgÀ¼m"ñ³¼ øÉŸ ðïLÛ\ÈÒ,raT ¥ä‰£Š8XöÔO’k×Sè ‚8Ô;ÓHVŒÃŒ® èí$—ÕÖˆlÓ¸ 3¹¨]&çÑÊ6JÏqV̾Æ+þœƒ\œèÊõ&È¥LVãXõ ï\Çâ{Ëž—Ô-.`pÆË‚29ñ]¹.]C§°nÕÌþ%®oÉlhB¨5g†Ê~ò|àð¡ÜæKyw—-$’¿¸òNkª$•Ä(»ö¯ºm…·N³õðyS$‘ºØx§:\eܹ <Š»>p×Ç¡7ÄÂq‚ÍÙ†²°ž7 GðòrAïV²` ø¡ÛDÐÂ΢kNúG;ø®6G9=šäæµÿä]Ã’ÝÇ[y#2ÇóIßÌër¢59ïŽô$%”FÅ”±ì23U…%lÌe,(D?ÿme%2“\‹9_¤‘_¡Ol·VóZÌ ‡G}'ÏÞ³üf$W™å‘@ÜMt|%1ãâÞ§/6/bs'¥Üu›ä·ˆï!á“_¡YÙt¿Ãö«èF¢Q³O&îßíûQíà‚ÖD†Ö‰²h}W¡§S%yÞ5O¨/êÿj“7•ó?icqaÅ™'¬õ[[›f]·ö#§FÞ•õÚ)TH )<m‡ùª=W¤ÚXÇ¥V ;怷‚>—5¤¹•ÃÏÓŠv"¡>‘ŽŽäKNÄîFõ{ð¾˜}VníÍK•2*K¸wž+8"^ /“švr_1*«Üë »Fu%†1ÀýéXF@¹ŒwØS·#‰IŽ@â¾|èД·pŠPø©ÝIdVŒ”ñƒýèðK­ô#ê'rHàSD€Fàyȯ)øÚÌYd¸¥ž'“2£ÏŸ³êi6P\RwÖf<èljÛ½J·ŠkI³d³cMUÁ2©3@¹×£j9_ŽÕ†@NäT¦ê:B1'o¨ b+ĘÎ3ŒÔg Ïq£5,YΜäT{ö¹MÂUV»U],wíBÒ’®æ›Œ”6D1ûÎJR}Lº•|óLÛIpNa”.žAöªFÇÔ_jÓçš‘kyÈÒTçk¦¹E±3& Òß$W7;HÒNô÷M-åôä Fûç;gÍœñ×â º -ÁUÏ$½sÓZ>¢p£¿jèƒÆð ®¤lAÎj=Ô€¾ŸJ@býGã³PÄžK£€§$¡¼o¡˜I–QîðôPÁÛ‚9¡“’‘ê?VÕx?´Ó$ÞË4%$pÆêÇù×]92@ k³ †äW/}4Z™%Ág ú`R°õÛùW €¼ŒU'ujJÍM;(:d±[‰J««±à¯ƒPobŒÜèØ¶Nw¯#üYÔ~™X™q‚q‚i;É'ü@’IѲàb”¸]mŒ`˪•VÙ,¸PÆ6­ôÈu‹rWé Aý¸¢úî.^ä*ï·Ío¥Ã¯ª¨Q¬*3³x¤9¤bÀìGIÍ–œí½84éÃûy¬CjbÏ¾Û úâTV÷:åÈЗ1ä@t/¢],ǽ5sÓÒâBæ6;žàТu2Çí ù"7,$ÐSJš§)`ÃŒæ •5Ú¡  ?R攵¼0\èu!NÞáŠèËb6ßQþô•í¤7Öí €£ÕÇc[?¦„u<À ¹æ¨+ŸEŽÕÏÙ-Ý»爰úuÅt ¨8ÂÀ¡òkTfê¦äpñ ³Céœã¹<×’0Î||Rþ¦ H9ÀÆù¤*Ø™Qé$Ó*ÛÁ®KñOÿ;§$Á6Òc>溂e–< 9#8ÖR4éW‰Œf#¨|óNñ[†@}ÜŸ ¹ÊZôÈgÔ阛¦[Û!v¹rGÀ¤ú[M,Ÿ—‹$¿Uk»I-äôep\ŒwÅv23+ÑiJñ+¨µŸOŽEÖYÏ'lS?—À9RGÈ­[F`ÁÎISn¥€ÂàðpiæûŽA¨ xÕ»gŠh« ´NèÃ'ŠId}+9(¦€¨þh-~Áoä7¡àí± †¡Òÿ¨Ûªú7W9ìÉÛ÷¢¯\ë 잨—|ñ Zßôù"oFV¹Ðq’4÷¬]ÞÜhÓ þØÇõæ½Ç‰§;ÁêP©Ü"–êÝ=O°¤%êv²Üú‰c€p@çúÒë•NÙvÏ&–”HVEhe¿¨©ƒŠþ‘(7V±,¯èÞÄËÀ[‘ý±]„q\[ÇtWÛ 0ÃîG5ùÕíÉ„ìf8ɯѺ'·£Z;úC5¹A Èɲ±üÇ 2ªûqàìi9C}Þ¢60ž b8ÉÒx¯2‡ÚxîÚ¤ LH$DYŒ†Ç<Ф¸·±¦Â"Œ’OKò°>p4çnßÒ¦unQµô§‘™ê:NkÔo½CVs=Oñ]hEmoÅbuHÿjúÖÅÊiDg?ôŠvÏð|1] næwUúWHþuÒÃm1âU_Šk²ªu*WÒîrt[>©‘nK+Äé:—:ÃyÐs]œ‘ƒ;F)u¶ŠÈDÎô?- ž_ Ý™ÆÜZµŠ™fÂÀ?_oßÅ'ÿÔ]2 Aw“ÿá§û×gwcd ;<ö®;«~I5Í`Â99ôNÊ~Þ)øF<Ÿ÷&åò2ñ´¨­ßâûtTü‰f´Íþ}⋹Ô {iZåfWYLl¥YN<ƒT­b×ñŽÕÐo/R,~F\¶–b“×wšV÷¹%¶¢8ÕŒü÷¡ÀˆaÑ59:Œ ày©z—/ï0¡rAΟ¿4uT  ï_4J±i#ÏšjåŽÕ„؇ÙÔÔ²{(ÆàÔì‰.Ž[díÎMæPº>ç‚<Ñ--¢Xó’ìwbvÞh\ ‡t%(.-c·Œz:ˆÀlU+;(™¢ Œóºš„ÅC`a~Ôí¸¸Žlî ȤæJ5%™åXãrC€25&n£.â|8]-•f¾ŽÙ¤ ²34ƒéÏê5—·2ê#ISr‡oåIƈ§{†÷²¸2HÒd…'ŒíN­ºú‚]ŽùB;Röv ÆD1—Ê”nÿjsrÒ‚ƒ+‹¥€FâÓÝÊ— Èà’5»‰c.b“ ÓIÉ/æ¥F,cÛ#±ÔgXâŠYj$ îp„Gª§£E'C7¼I˜€l`w=ê…Ù‚dX‹p4ýêW©—Û8ÜàS’ÊÔÆŒ°HÊ•aÆôí”’GpI'Š–êÂ]ÏÚ©Zÿ%B÷nAÅc O.¥5þ0ÒÜ(Á>M'x4²ŽÔ½ãÏùY4FÀqûT²?/ ÎÚG ÿZ xww<Ïê¡eëMk! &·u#5ò~$Ÿø–§Q©¨+ŸU‰$œîM4ˆ¡ƒ°ÈÆõÑøÕDB–n¥÷ëöèš´9$ljòËñSªh ÍœŠŠKEì⊖·}J\,ePrÄ` +î1îvÖÝ^ •7FÏphrÌÅP(ÀÎ⹫.‘‹‡»ãv'ÈU¨( ŽE)•=E‘d`N­N§ŠÓß, (±àWÉ3hÐaß×Ðà ‡DÉî gš`™‰œä`üëQ/s•Dz–Ê¥¯šñý@ #jß|V„j)bXßÍ+*T6©óîÓÚ¾–icHÆÌã|ƒ‘_":#Œ±ãJ°N£û’ºœöîn#ã#,¸ú~in¦H_L„)ìw®­äÖÁNÏTn­ÓÄH.`‰O¸¹æ˜£4’㙽OF>£ Ѹ?? hb·sé’FÝÜsöEÚÙe !)Û+Øø¬µ¢éqÁâ™È.§ˆÌÇÓħfçö"µ¯§/§"—>3ÈøªiHÀÜ¿“¹•Zm1‘•úOÏÞ”“SÕ8ŠÜ¬‹•*Ø:» Zæqs0}YQÇÍ{u+M0Û.29Þž†(ØÉ(±Éý4ÏW02b±v`pâ²Ø/€;sZ¸E33'µO¤LÈWñ±sèc rXäš+#%›Oó£ÛÂäFâ¼™“_Ò4’öÐÀ‚œ»ià÷¦"ˆœÇîÕÏÍjœœçÛóNGéºÍ£ÈÇ…É›Pò·¦WS<ƒÅ)á&DY4±þÕá…)! §p|Tém‘.Y¢8ÈØçРQšíººxb‘#}   G¹5ÏMÔeiË%Ød'Y¶¦z½Î¹R®Ž ÿñSm¬_EmQ¾H?j¿0“HüŒ¤äà¢9'Pt%a@X~£A´ÒGI¤öËÉ'½nöh­˜ÇY¾8z”É4²j*ì~ÕÔUõ”k³/’ö¸aîV…Ê<®e“9zv7V:*,Nß½#ª`ÅI(HÛŒPñ¦±rœL*a˜†g NŽE%€Û¸¡%¼ó¾<ö¨³'å˜Ä]‡Õ§p i`Oï0+(ØÔUm6Cë³·4Há2~`DNÇ9ÁþUëJ5Xõ“¹Ó]¸¹k–9ß÷®·ðË…èè§’äçMò4&w©ÒÀÅY´þ­Î®Æ¶K&8Èç>IÝ :r ïƒŠ—¨œƒã5êãó ŸL 5ÑÜc,[u#{?OTŠÄÇÁŠ~2rÿÐÉé#FàŽÛãÍt>ò+„ §KŽG𒋍M1ÓOZÛIôðuqYŸ‹.û•euq±¹ïR°iŸÕH#¾i{˜„1DQI,1ž1VJzÐè|§ØÐçµIBäŸ`ØŠ3UêL2z2 £;js€ó§ã³üŰÎ}1¸Py4;‹FiÆJ¹ÏÕ¤‹®sf²/PÍÌœŒP ŒjíÅ0ñ•P¥%‘@ J0š!/;öð)L¢Ì¬v8«Ë‘ Àû¶4•¬¦IË1ø«ñ©"æ;ñî\€.…! yÅ= :brÃrv”ø`›`éÔurØpt÷¶5&7…½9Žvæ›ÖLlXà‰ÍG¸ Œ§;V]ýA¤mŽi'f%uHZî&Œ0ל©>jE2ÿÌB®6É®’âM%ÀήÕI ÌÌFT¾ÕvÕ^¦·Q ãÁgðÍ©A=á_úûš•0c#ûWOÓ¡6½&(É÷0Ôz/)ë~f ¶‡€rN}ßÕ̘¶ _oŠA‚€¤gæ›™àŒäg~õÈ-ö܃à†áNäžqÁ«‘j•È(@Øy©FÞ&ŸPØ‚0ªi0Dç;ì´Â)šº†ªÅ. m'¸=«ãwbÌÙƒ-þ¬VO€JùøÇ56æU†U‹$g íKTOüÇå`—gôšL]vDc;b€®c–oqSv]&~£:méÅFLÿJe* c©„îm.TiU$êÚ,rÃË*•Wà°æ­[[$!”œ1Ò2OüU{¸··]½5%Žy&§LœÜ*‰¦Lׇ:‡|Ö™™ôŒ.M&²yø§€cx'5IÔÊôàöÙ`Äç•<rR%l€B‘œR0™{\ç÷¢H“"Œ–|ï§â§+m~æÍ<°¤?ÛïQ.:´@4vø’OÿYúWíæ¥õž¡$³Ém¤MZHîÕˆGàŠèâñÀÒ<¹·K2òŸ]‹1,Fä÷¢åDZ›R„ÅÙ¶ =Ï«"" €yª¸YÔO.#p°]ê‘Ô)ÓÎM[ü+¹º¹¼bL(°®l¤ª­Ãlw®çð­‚Út–EÄ“±c‘³JòˆLf½êng£–8´K$šŠ§äx­ôd6ö­,cHšL.yÒ?ô×ÝG #oœæµ±Ål¤‚cµr3YÇÄ{—¡÷(Ëx«°ßíSµ©°]÷¯aônuzNÚ¹ÒE3˜”’p܇ˆÇªÜèãd×¹2ÃL×SaרÕbuíÜŠ‹¸˜6`ç5N+¯U°šXã%ީΤ›œ¨Ú®¤:”ŒV5(_pÀóŠñg$c ŒÖ” r “¶ßÞ¤ë¸|°É;ø¸æÕ¦É5ô².Ú·(Î>Ô$WkÔtžçœÑÕˆ³£©ärÍ!h™AÆhÊ¢4ËH3ž4ç4h m#,F6;f¾k„q!‰0 à `RÝKuF|’êOc*ð9Í/}l’¡Y²ËõŠ#Ç®NbS¥NkO(ˆ*¶¦'ÓŸïZ02›ºšØï¸.—egm46éç|.ÿÌÔ^©gwyÕÜÛÁ#&—ƽt¶Ì'SoŠäÿMwÓç¶)+˜d$éÍSã¨9è›&$ÇEŒr 8à]7wqgý)îoé_\_tî:Æ[9”’ÿ²+éT\¸…—Ólm§ƒYêLn ÇHLjÇš³â#'*9¼Ã’Fï¿Ý\D«mq g%4ŒxÚ¡]õ’S4ª à`SVñ—"$\ÈH³'áÛ9¡&÷Lyei·0w9™XNmœ’¶cŒþÔìV˜ˆ¾á†ûšúúÌÞ[´$nN¤'±£Å`âÖ8®g,ê7ÇzÖë÷„ Ä®$‘ÙJŒj6Í,Ù;i$Ž1Tnb‘p àã<ÿJó§Þ#úrç FNž@¡ºQÁlI¢$ªç!IÛ5åÕǨŒ€éŒ°A ¿ƒÚµé™m˜ â ³àž{S©í‡ ‚|¶± ¢á—øs ¶{FF•deØ€rïT®^7ˆeAlì)T]a™>±ÈÇ"ŸŒŠºžÌAzuçQg£XÑÛ9sO[ôUéMë4Ï(a‚·z§LöÑßRóŒqM¡X‹\&Am°¬%ºõø‚¾60y6̘- hX…X‚Œ¨_óBC*ÛººaTî-ÒãRÀ¬[FÀk")¿,©tžÕ\n7"–2krŽ :nZ1q"°^5ˆYaŸDxÄœg…5JéÕãÒ®21úz‹:;Çé(÷‚xØ £ ù©y q‘”ÏPOÎ-Ø2d‚àc'â°Öéœñš^ÖÕ–ò@ãhø>M:Pj ª²ª”œd| ³@Kz>‘¿–P‘H ƒ¤péçþ,d‚Î %4'^¾æ˜›b2hضóï5·”pŠýÞØZtÈÐiQ¬äîk‚éƽL<²¢Eì[lžÕÚËÔb6¥³€G-¶j?$ì =Àu> c±ÑLx«œIÌš†|äÑ/oÖr-á݉ݾ( ªD# 3äVcÇCr‘û@\ŽüÕÏ÷ˆ¶‚Ý›9#> Dz¨ÃölïEé“þ^é^‹*rÆVxÜìÌáHÈ“Ín)X¨Øß9zäú”ÒÝ]…YJú{¦ûgš¯Ò:€¸@FÎ$ sß Tå ÅÔèFuHÜÔ N†Ùù­Bǹ?Þ…rP0q’|TË£5Fà×©ØÆ’î% åÇ5¹:ª&±qŒ~ àŠãºüu2U@ 3µ$Ò íŽk¢¾2²†¹â»´}S§\ä%Üz¼1Æ às †¶r1\s.Fûב´ÀÿÝHì¤ÑÿL=›t«#ÉIc]^Ÿ‘äSVW¬„E?´ã½s¹êLÊq.G Á½UI5@#½eõs€Täãæ•—¨›–bÈ_êÂt°²²eHaç5 ª¤€99©¶gò–ŒË–Q¸Õ¼Ÿ™@ì¥; ×-’‰® ²Ñ5Ôòê18lŠª¶*æœŒË íŒóZ×ê)enGñÔGé§Ü^ƒOaIBq•=¼S®_\L­…äcšöCmsÍsë¼,Ì3¤g¹¯@]2ÈÌcÁÉÏqWz‹2ï rqÞfY$ˆà ñóNñÉU¸Ü,TV ×lx¢’‚øÞ—¶•6ƒôÿOŠ.®Úw#9©XSDÌO#~ž<Òs>ŒjšbRÜç¨],ëéÃ'¹[ݳöª0ãäj5³ê’³]•˜€eÓâ’.º¿†NÛìiÃê6¢Ài^ì3š $òabí€1]Tú­~'ŸûŒZ^È=¬yâÞ¸a¥ô¡Øÿ½&Ö.}…ÆW“XX&yÒг¶9¥FÜðÆ+f3qÕÄD¥±`9gÿU¥õ+Ëù¦ Ó\Ýz¤?Aqf g1È=Æ@;Ó6.™‚v£–cÉ4–ÉŒ!n$ÕêJê¸H‘3îc’<ÔŒíâ©õ9u‘”!W=êTìÌïŒlÔì ñXÜßODŸ¨Æ’l9?8ßÒ-¥HW;Ò#?žY_NÃäÕýzŸ R<­¸ŽÄ5„œŒŸµ4ĈF¼gÞ’$ŒZtå¢PÃlW=†à¼‰}t-å,Ty¯,ú‹\¶’£Œó_u;PìØÜÔÛdhnÔFHßÕèˆÉûÍYÓA.TlpGz ¯‡#Vkë‹»YukŽ&fÙX®â¹Á:ãŠÐ¸r œcy7ô¢î¹J;yâB2w0¿Ê™ê÷7¾ŠB¤ÇßIÜšgùé[ o,ª8eB@ª±Ûõ5 IÆ9öâË+]ˆT¦+ ôv!ÃŽ¡Ú½3ªH§'IÞ¼»º1°[ˆœ1Ùr¸þ´6ÉÁb¼ì¾(ÖÎÌ8Ƚ_§$÷ u"Lû¶ÙÿóSn_Ð]0ÝÁ®®Xñ·Ž)+ˆ ¹·"HVLl Å_‹9±%É„1±Üãg‘Ý@ý"¾¶C»caÞ­Üþ`ºíÜc“œ#SåŒ@š]HNtZº •XRÈ[³ÊÌLŒtÂ9>~~—lå¡q¤BaS§ý;Wæl%ê q.ìÚ5à×éb³²Š áž(Âàðp*;ü£Þå>?f¦¦Š9IL6œóšÑhUg-žõ»bã²–' ½•Ã) 4ŒTF¥rT°Iú‘ςͩJž*Å”ísf Š‹ÉóSÄ!T"ãH9Å}âÖ]ÆC†Þ·2ü‹®æã<%5Û©ÈM?ÿÔwÅ1®5>tó]¼ÈíúfaȨ7:·8P3«u–+tIDx–8Írÿš¿¹šñ×Wúí@–Þul¼¾¢ÿ¨ê_élýš<ù?.\þ*²· -Õ®dáI÷¡[ÏùÛ19bN 8¥zwG¶¹à‚Ç?Iâ™\A-¶1@F8j¸””A¸»È~ÍšÞ&UR7ÊíDT®‘ôDžÙSÈâ…ˆÓ «U:†™(ptñÞ»ë;¥’Î •Ê ŸW“RÀìù®“£]øn€Ä”9ÛÁ¨üÀYA®£QGæ]³êpñd‹îd/ŸMdVo«¿jüû¥]9êÆó^³±à/Šíb!â ÒpÜäCãâÁÉŽ·lç Á¡JìƒÚM~9ÍEË©ˆÜP˜GP žFhêÙöã52X«¯XÀ©¿ˆ.-¯šÞÞ8›Ó%†w§&ÍÓŒ©ÕP½ñã½%+j켜 Î9]¾(€ÝO¬Â bÞãæ©A‰#(N1¸8©Nèú‡»íÙwÐÊ5c ŠÇSrÔ 4f#‡ýZŽÕbÐääo¿oÚ¡ÛÛ™}Ûã?V)¹/ÊÈ‹ 6„úGï\ܨ\Дñ± s)a4±¶€äÃ}ª>¹Ñ·’)‰®åš6ˆVÝ…}ah÷°öÓ±I1¡B-˜”¡Ü–Áo5ì‚}-¹ÛØïW¤°b`Nõ̼FòGŸwmèÓ Ê eÉW’¼=A™F‚¸Àò1J^˜ÞçÔ‹‰¢<âšêR¬·lWô€¤ùÅOo«ä×WÐ3™¾Ä~ñ‹Å´åÏÜy£<“M'¯!÷0þB—µˆK(VúF枘*áFø/A¿xÌ@”ý ?NÞ‰ †/ožõ€psŠÖumBúÜ©„&POÒ´Î:EI·¡xi´McK¨÷ 0„zQŽYF ?~ç¤Õ‰^`É•Èãg ¯8ßÍÀ Uß¾h‹8©9äbŠæÄÖ}BtBèNüÔ§i¡–AýM,¸ÒHÑ)È]ˆù¨÷½>uf¸ˆŒóœsS§!¥X(ˆw wÑ-̱p9÷áNê¸ý©J8ú¤bwÍ{ÑÝî'¹±’F›HV<8ÝHþXýéu„ÊÚ *O&šVq¡H%LõÊiL«¥ž`I\…6¶n>¬°ÆåyjVX¸%TÆ6çlÑ)Rg‚7¨_˹³T‹Úv–ø¥ÚÃX ŒJFx5QÀôÒH±]†¼Ž=eYËjäPŒ¤no ]Éßðùšd)¨á±ÚŸ¹p§ƒ€¡sæ™ ª6BJ¶1š^葜 ‰óXrr bøû“å\•ÁÁç8§!€²@¹qí“Á¢-¡kZ¶`*¬6Ѥ l{pOsA“0PŒÒˆaRç2Œ“FH¤H‚6–Æì1š –§øssïbw_‘Fu*B‰ r6 ¸ õ ŸÌ¬ÅU²c>æçsñB6ì5FÅ݆YH<špEŒ =ÏZ`峑"ç÷æî;iUeÊ䲚±4&|¨|oÀ|TË®ˆ×BFΉ—'põfEk&+ÈVlD$VeÑ.Ç÷Þ„X8Ò¨vÚŠmçHôÜÆÿÂ%wÕûŠ^'1`F?­\hìNJ_« ì¾Ð4Ž; öÒÝ®dRpcÝþÕ䞬©­#'<àQí‰ce(Ücšõž:îy€å¸þ`êlÊ06£Ë4·P$m+* ö(;Pz×p®A—ƒ_,l:bÌx2_œ èõÄ\¦"Ö5ˆkS‰Ï·9)"d{y÷¥"¸Ç nk–ÒW#¾{Pn4ã¨ÂHA#p§?äÖI«Ô¶`U·¥°3(‚Žõ{¦F"µˆ0, ýéYM †ŸˆƒÇr¬â$ŒnEî9ì\DJ>œ¶?µ\·S9;Ñï-êÖHôƒ(÷ ÿ¥Lrìj0Q>ø’ÚhÒ ‡ôge¶Wýê´­¸]# ¹¯Íîàhäd_;gµRéBöÀaäiãcÀø5¹|5#ší™.&VüDªeƒHºÈíýj}¬¶Š….m‡;ºÇíGê—bòÎ9#R m'œý‹i–/Y‡ûù£Ä§ãÊetµµ1 !…$mY'úy¬,rh)*‘È]‰ûÔXç–Ýõ#àÿz£cÔ•æ Ïé9Ïbkcqز§G¸É²¸ú…vçi)aì96px¯’a:jNÇ5>Ý%·ökʃŒšk¬w÷ƒú… L´g…åcfíL¼˜E8Æâ²ç# ¶Õâ)H$îM£0ìMLªÛ“·}èIkVÒ£KcŠÕÚ­Ú0ÁIàø¯-Ô[[ªä<Ÿ5 º3G]Åã±hȏɔ# ¹¦šE.ÊÜøíY‹Dqœ9bNI'94—ªzAÊŒyäÓ(¹ß©o¨﵆„„œdÖmºzª“C»±<拦EǬ 9å[zlÆ3íA÷¦ª£ŠC,Q?øtKA÷ Í{œv±àääÓe•WS~sQnú–$‘q­NkØþLšËÉ¡.n¢i½MZ¹j-„^Œ¦M'Œ)©O–iˆßª–wãòùeÉM°5K¡QBVâ8Êi!¨ÑQ³¶94 v A`ò@íL§uRD.p ;[GPΘßö§Œ4îä %‡–&VüT»“7¨KSÍbÍÊÜj4ÌÄL‡@ßý5>3ŠŒ2ìEb„I»7ýŒ{üVfoËDÏ‘°ïÚ’ˆ‹…%Ž|U(¶/Ô^F{•^`§€ù49nõ†mHGp#ö\.ù8o4ïN²ºê³íbÈS•~æ±”.ÏS-qŒœàš§cø©õ(ÄFÜ4›gì*çMè°ôÆ ê'¸ÿ^=«öæ«zÌ$#QRy+ç= šXú[ðqHu-àwSjK§X¬]YíHÁ*1ÁnºÿWB6 y¬ÄnÓ# Ü0ÜçJX‚÷9ª†Œ"ÄQص{†$–"ƒi|ÒÃÅí”ÇÈø<ÑYˆ:±ãæ§âFŒŽçˆT “àî)Kë{6ˆÉp‘".úñƒM*ï',+žüWgq5Š\ÀÌLS ñçö¦c¸SøµÕÅŠDþ•¬ÀðÛEH3Æ«‚ìò7ЋÍ'ÕßVeC*ÇñOÅ ¸ÓÜûÜÈó]Ÿp®ö ý fº{wÐNË÷¥nºíc6ë+»ªãûÔŽ¯Õd¿¸eBV8QçäÐízt×ú¤ïæ¬\#ˆl’c™‹RK½.÷¦~mf‚ÙDªÚ—l7ì+«{„uBuqžE~oqÀA§HÎÆ®ô¹êºZ^ÈN#‘ÎÍð|šŸÈñìs]Æ.a|XTë—¡G‡1B7 VŒ$ÒË‚i{ûRð³>XÀ®patLµq“7èž Ka&ur¼/O”Ël¡ó©““Íb#G%‚ƒMÝE°¨9dT±î<Ñ`*Pb…4lfö4pÃÒ FKãµFzž0ÂhßfÃ6Á¬º¦AÛò(P2Eê3Yµ6Æõß9/%’*hÆUJFíñL[tç½>äÖ eŽ*¿E+*>’}§ÅA›!U,%xÔF5²YÛ@Ú¹î¯xcAgø¥µŒWGÔH‚—;„?a_¼ÒÏ3HX–cšB\ÏgÉÇê%û{¹®-ÖBƒŽÕ“&r®wäV:T7FÚÁÒã iàI—¯#jµ«‘©ƒ• ‰É…PNHïUúÓEu·OT1ã;Ô¦µž ŠvÀæ«CaÒú3ß²ã`1ð{Pd®4}ÂB¸[‡‰[ÛºˆC“¶åŽ{ý«¡èW^µ£[™2ñqÇ[EA!™xRã"Ÿ´’{3@먌g9©_Š•r »ºÏ28ÊBw8£4âUž Î2kµêw¶·FQrÌs– rÞº^¹Êí˜Ü~ŽÇíRåÆFê Ç{¦…‚Ž9Ïšä.–Eês– g?κg¾PÞóƒ\çSdk×}Xš wÊ1EÌ!`á íÎÔÏ© bè ¶4²O¥ƒ·´LŽÁœy£#r€Ôqº“4$7?šÍäÓåX.Ò-0Šà†Bííæ©Û•c©T óƒARìM(0Mä1¹ÇËuñq-r³<‘1 –ÛPý»m]‘nȳ ÿë?íH~()ÿ“W:—OÞ·Ær ÷#ÉÑ©ÎZ’S ?‰eÓ!S•ÏŠÍ»hU=›l׳¢–ÎõÕ¯¶áÀÆj#ym‡Žâ#ÆáþûÒP .©$‘‚ñH=Hÿé ¹ªWMˆ–líôŽô¬ÀËÓígʆÌ/«ý'uÿ4Ì,JÑ–¡&‰ŠÇs ¥‰ZUäŸÇåÄ‘ê—.í×µ-r2 ÄV5^üj­ÚE,“*êßb3±DjÆ£ˆÿ7Q«H´3*gs‘ÏÚù#¯×fäp{QÈÛ1V8(rvÅ+4 ‰n*Vsv$Ï“v¦#,dÜDµ&2HÛzÔ¶Á²£è=Çc_K*­Ä±(È}øÏù¯ —RNXgQ}¨Bè=WMH,FA#45¼Œ6€4…çŠÎ$’ëQÒÕ™í„è Ž>‘þh‚¯¸ÀÜbÞæ.À€XìOù¬~~0 ‡ø…x#½%{ ,Á#ö!Ø“KÿãO§KãnôÕħqîX7qP–Q ni{«Æh’H sÅI¼¼Bï­Piòß”¿ˆäü¸†Þ‹lÜÇý©Éâ“Dœ™1a;ÙüK·X—S¬LI8sö2ëñ ÿàFP.Þ¤»·òàTot’oq=Í5¾u)·ÅV©VÀØã‘óT õ‚“=ûÓ#]Ç@2vþU;UOnqÝVÛкuaô~ (XÊ"·< è:ÜI,åF úIóP‹*`Y…íÄåMÜ_Ûê,#<Ñmò¹ ìÉäVgš"=¬Ú±Òd#®Y¶Øõ”`ïœíTJ“¹80x½9 gnAò<Ðmª÷Tµ´Š›nÃé=Çù©¦tª°•õ¶Î3JL €e™q1¾ŸÔ¡Òê2$úc™O>½^LØ[… ]È<Ö:oáèl`!Y.{žËð?Þy$P Gÿé$×36DÈôGbvU¦ƒ[ùžëAÂ/ȪCuÎÄTˆç´»‡Ô³fYWÚÈãµì–È#”Ãb !ñЩOZJ gR‘Œö­…Ò£Ojš½OR32ei&š†å&Ùd ÆimÀÜ[caÜ9=²Ízo ´Ê¹jÆ‘€l-`BDIÔ8bù ¹b³¯TºKcMmtFä7Îk1²AÈ8ïLªRf7 ,ŸÃ惚Š30’ME“mÅ: àŠV{’˜1®³œÅ)YŽ„b’t# tÒäùØâ°×)à‘ÍL“©…rrëÜqŸ>âðÝM$9äö§§ŽÇ¾£#îS¾½‰ÐDŒp[äTÉ2JÅ“õVâ´B=Òê=Ž1G¬ „*Iùª“Š Í‘P‰Åm1Ý ó…VµTŽ0 G#9Í&×5cíH^õY#ˆèb ïŠ"!©L·:7 ¤—µmî™ãQ¾k’wic Žìx4KxXÊÚOœ×Ž“s¨¹¼’ÖØNcõ2q€jUÇ]¸¿ŽK8Ô@tlPåšJâîábôÌîWÁ5÷Nè×WS¥Ñv…ul}_jÜx•E´¸èé± 4cáî-¹4œ Ã A€Ãm¼U¦WúYq± þLk.w+3óNìE£qkˆ¸/Æ ïM[xe߃óYxý61±8Ê“ýkLá—B°öˆïSºÐ©P~[“>çæ«ôÔtñ!mLÄþÕ3A”_cUì,ÞÎÜÆ\H¬Ú†Üf²µ'ÎÀ ÷êÄz}Ʊúó®~ÍÕã*\øó]GT…å³xãPYÆÅpr]%³b"dqõ9`*¼JYhEâp¢Ì²—vÐÌI[¶ôcr¥‘²s€AÞ¸æw2 :‰Í&qÜÓ›ÅÜ!åz–zÓÉ–:˜|TËK[5ä—5›E&ì|Ðíå1J² —pdSQ §¼™8a:ž‹ÐŸªHñ-²N1‚ÿo÷®ÊΡƒò¶ñ,1¯Òª?½qV÷“õ4{™¤,{«iÆý±Mt9§‡«C\Ìèŵlƒµró#9<^¥Ã(`'dÇÓ\g$sŠÉTkãî+FÏ«}Ïz3&Øã|TZƒ`MC È|ŒvûÑ÷F]§z,HÒF@ó^†,}­·}¨I7Û1{¸Å­çæÆê=’|©àþÇûšmãn xÈ%ƒDžíJTçÿ|JÚJß—1ÃDÚùÇþ+Ìfö¿Ät…í皺ÆB¨ ù¥îº‚[áT‚æƒÿŒŒ•*3ŠÎ¸!IÜçúÇáÔµ‘¯­ƒGâF£e'¸ø¨îñÖóL3"•ï_ $ö÷1²­Xa”×Ôl?á=NhX‰½Ñ±ð÷~-¦; ëIv}Ë\?¨AÆŠ¢ìŠ¢Fàö¤'i"pÚΆ`Ó±Bß•Ž]C[îªæ¬rOÙŒZª®”I—ìÇNüTû˜YT5X½4c¯$nßj±¤°‚»r4,¡fò=ßΜÞ)ѹk•á¿y¥Á` v"ù†lªÈO€x¨²^Qž=ƒPb¼o[$“ûÖM{ÄŽ§Cn%Ð ,['z:˜q¥¦¼÷¤ìOª…ÉR݇ŠöF’V’R#=üb¦eÙ³µPœO/æcE•û朎ã%Êã'9ÍJMJÁ#`ç; V]dýÉ "„›ŸR!d#ÔæêÖÑJ’M:K§Nx­õ-0[¼†WnCW#$ Ì\n~OÜClÏ*Þ§Ms×- `Îd•7¨·—×W@¬J ŒøÝˆûÒë±ñLÅ‘îª@Dê< (¬‰ ŠXtÈ¡WQ–$ìOé«éãÚ•¸„Æçni‰œ’EÍdÎrHe±2é^Þ ^ü<¤Á+ýCœŽÒÖîI¢ Ž 9QÛEéEUS°9¼€É·qqk‰ßÄeé·!—ѶíÍq=.Èú‚I#!G×èLÁ›}$ãcÜT™áÖÌHäó[ãg(¥3 ÎúˆiÀ4"}ÄiÉcT\ŽÕ=\úÌóªñêyÅO½FŽAƒÍ7=Ü·½<ØËu)9Óž>Ô´¸öœJVRµÁ§wTâöNt’鿍ôÞ¡“fó½*ן¥Ô:©I Eµ&Tö§}Åu."á”°:— ŠÅÅìVqæLœœ >j*ßÍ •àâ©Y[ÇÖ'J§Ó„e”fñ­[u5®”î?ìò( Y²=­äW±,—C{]xb™õ¢ƒ€Œ È%rAcÍs™€õ:Šn.š(‚² ñ¨w¢þg+€#ŒW‚'’QqÜ·ûRÞ¨ Ï"!ñšW=F€¨W —nÇz"Ü VܑɤYԩžTWŒÑ¡çÝœÑð¾çŽÍBKÆÒ¬¸Pß®u6½tµ‰I îsŽý…4'2 ÞïõvZðZúP÷ÞM;„6D—0Pˆ[ÛÊö‰‘‚àx­ÍÓî€N3šzÙijµ¸V®v­I E*“'±£9Hi¡±[ÿ¥n —/ÍÆ5k%P;–ãäQºcFÒ1 y0™‚‰ì6ø¬‹[‹§H¢RHþµãNm¢¸É×1û£tŒ€¹c5%a#¼‹Ü“üëôAøt¯NHe‘Rã,ùä`ãcüª9ü$Éx²^\C$a²!ˆŸwßâ‹ÉE°L›"«u9ë‰s}!‘”Å%Øc#â–êÚÚKù{¯NÏ1å¾Åu½q/o 0YîúÛ8ý…qã£\þzYT,“8P ‚qÜÕ2ŒŸf5ûöO‘Jè ßô(¢¶èVÅc:DaŽI'óSú¿FXî©F@ÖÚJ|ù®‚Î#oåÄx”lö u»m].}8`ŒvÜW3‘žÁìÿ´è  …fí …-·cOÇ6eË©Èá(‰±MtºoŠÀ¸NbbuŽØâ©É‘$JhŽåiJJÈßšåoÜÄ$AÍ}mnK»“ÉñNHB·¤¾ÑÆ%˜]âš¶ž@ Á´œNÀ2§N?­+Óé¸ðˆV|â–Æ,ˆý¼@¨ Ú¬ZÇ,1ª4†?WŠçZC¥Oaß‚)…ê 2¶¬ û¿Þ§dÈÛes¦YR(C(…Lzh8û b,² øÁý«–³¼žyxˤé°OÀìiÛN¸ue ³ß‘CņŒ_ êY÷)9÷²öóS­n¤kÉ,ô•Ž'$2Œð~*‰e™tÆÊÚ|°æù·w¸3Ò}@œçX ]Áþd›Ø¦A*3eʶrTø¥µLaõpTcsjÃÇ-#<3’jmôÛv9Î7Ïm…i$ŠQ>µ <%æ‰U×b«Æ|Ñ„0ºÍ "uÛõ.ëþn ¹×³Èu{ q[”ªÈØ*r1Qs¬†º”`*âFÎ)WuÉ#'šù-Ö܇Š?pãÝ[ê7i`†E"@H ‚A¤!ëÖ÷3إ瑖@#°]þiË43z:—H;äç«ÛÛ¬*Y€fòy¡!S}Ç.P$ó(œ•8¡9ªΣ‘á¸=¤Žr{b½Aky* Ž~krX Ac•Š/é?ïY*‰€ÇíÞ—®„0ëZ2Uå„w’´In8 ¨ŽþE@ê=nžãP×ý2·Øü×`nŒ ÇdŠÌÉm+º‘&̇Ux|Œˆ@@ËŒd©ËÛB±ñŽÆœ¶ˆµÓ24GÅlÄ!1¦¥Óµ}fØwPJ†ldö«¹r³'|E;ŽÊqb^1ïCò)^EP$B…†F{Õ‹{Q®¬ÙaÎ7ä¶iu¡4`!ÒëóQ|á z„ÅÉ*2ª\Ú™ê6ó<*ð±Q”– ¨ì4‘ípv4{ù%°C…’<6Þ(ß-•+îܧeMc¹÷…”v"”¸g–ÞH“õ)ïJôëãmÔÜœ¤ûg<ÕBX´¾ãs¾~kœèqä7üˆhlQœ}×Rü´8ÎXìDUõQ;“½QüKhmzÉL ÔHŸcÏõÍ¢ô)ºƒ(ô¡;ë#¾ÕÝFLx¹ßrG%Þ¿v— G»};U{KÓ‘Šòç¥ÅÓf)eå·Þ‘K¯Nä ;Ry.Ak( Bît–ü@º@““Ú›+ê3Œ ˆàÔØ]½¥1€3½P‹Ót—^1À¤³Ü•ÔmšL±B Ï“æ¹. ž”­‘±í_ MÍnÞÜ‚£ètá$DX€‡¶z‰d#Ÿ ÞàÃx«1Þ5å< 0£%IÆ¥;г>‚§5ÔÉÓmý'RpGr8ýé+nœ±\‚dÇl¶(×ÈR ôÏÊE$g²ñžNÔïP°6wor§Ü‡âƒc»Ôײ®[ùSÃ<„œ¡çÆZ²S©\p0~ôÿá¼]uòFŠ#ýj\²h·>Hæ«þ ¶u’æñ¶Bº{žk—XÙŒë1¥ 'g ʱØ}«Ã*¤}Xþt³]$jPã=è ະ8éÎÙ®wÆÌ£Å@NýèÑHóSá’ƒÏÅ5Û «ÅDY½K í·?ûÿ½© "ê bpø 8þŸÚ›Ô•síƒÞ}¯ Œ ¾>i~ç—FHëgòÃYÜ5 õoR] àmNßß·ôïÎòcô’6¥›ðíªÃ‹©d’g…l*óVãUUûƆ­G¬º•¼ã:®×µo®EW²Õ #ÍèÈAÏ‘\öRÛLðJ2œ ÷ù¢YÜ\Y8–ÞB®nÿqU²´_Égb1ŒÆÑ>ãûS6òå ­®/¦7†Ô@Î2럩¼Û49mŒy`ø4ËSÄ{ƒê€ún¾àÌ;í^<@¦Ç¯l\¿¨“1ßaìjÒ; €;æ¼l}ÊA܉y—É95˜Ãcn)ëõ ¥†1Á¯ºwNê=Aý;;'‘׌(ýêà%±©3/ÞTè~K8¥éim3íÿToŠêG¤‘$‘È%Ž@4?Á©v_‚½5YzŒú€æ(wþgýªô––ß”A…\_ô×ÊËžñÿÄéàb S‚C -’qÆ+H=FÕÁø4'$…lÕ^›d'”¾6ÎÀWQÏI’ õ<6Æ8”`’FOÅ{il‹q§œ×D:zˆðã'Î(QXG2"ŒwÕ\ÿêL#qkIôMñO(e‹êfå@©W7«¨è`Aç¢ôÛßRUF<üP>6#•LR'AÂ"Ô¨ÆØ¯b»!°qòÊ”õG¦žøÐ.š8ÃHHaœ`ð*|t[p¨]Eúô“Kz`´`äíÍrR^ÈnZUR@?HÕN§uh“,PÉăö Çm‘ \oں؈ƔãF,©cô=G-ˆšå‚0ÈÈÁ¦•‚œgU*n<Ó1{£ß£È7~¥¢ëq¢>“Û;ÖFäc w$A"à“šØ%¹#À©çª ßÝíÆ‘œŒSììÌp;Rèd… çŒÑK…\ûˆäV¶àÏ'tÔ0Ô6E1;ׄ–VW]8;`óB c\ͨ÷ì(€ÔÞ ¥—é5!îæ^4œ ¶óOu^¥¤!Cí°QRL¦;a)³’~õÔñQ¨±“eauE Ø95±ml…½LüôÊ2v¢EÔÙpJ ª²‡ÔXa–ÔÀR~*mÕ±ÕÇDuX%P$Èé>©yé†Üjr3žÂ±UÁ˜ì•$é-.•®Ã¦[ ;ÓC $œçùT~ŸÒÊ"ÝOßuSÞ®‰ä''IÜAäd±ÅaøØˆûôz…ÁË‚½—¾iŸUò¢HÀÛ<ÐbHÏÓ¹r{V.¦ÄxGßÅ@G#Rà*êcÁcM˜ï¾!,ÌÀ„ÜgùW²j* ™9?ÈQ41N~)À9ŸFuI} ñ掫©t²ûä÷4%‡Lä7ÔTSQ)|ý¨š(Ù}¾ÁØù¦ØÂxo;ÖLD†ÓŒ° †h¶Qûx¡îxu‚ÕbešFÐHÈè÷›`Ñä·9>(¸*¬¡YF3T ,,Ž©´`(Þ£v ƒr´¢/²EéHum°¼ÕŸIb·Õî$Œ…sÆÜR~a2“¤çPìiû©UÒª¶pCn O•‹0rwRZY'¨³JrYðUŽÂ—ë6wvx†wŠ]ôÿ¤ŽGô£õ+¸d„`jSÎ6ÅÉ [7¥+´Ž}Ã|iªÿú€ÂÅŸGq§Ö],Ü.©ÇV+t1²²Uãj,nð[–—Hì `¤ºBìwÉò(+9Ù„Š¸Ydü¸]QeìÃjVŽ{C`s‘M\b+|ñ^[¤hvVV;P)¥¿sר—d)#JœS#Õ¾Çj¯ G*IeäüV,ºÅ”ƒÕ‘„o¶ ¹çj¿H‹meˆã•a&§mô‚{TÛÉdŒ°\,¯ÉÿHª÷]FáF…–E •uà×Ô:ܳÜhBå°\îkر»·RPÚ¸ÝÏPŽÆ*uÊÛÜÔŽ qnæ%Ø’w<Òä»Ü–>v§:tÍÚJ.#9øÐ Á‘ -›"wQiÐýšwÆ{Tþ³}Y´Hà³à`TyºÅĈTý*w#Î<Ð-Gæ˜I–\ƒx®rx…O7=G*ÙÆV"5/&¾½µc¦H” 23žâ²«éÌ\ä“°Éæ›µbÚ×Ü2sƒÏòJžBRz’&BÒ0dÁÎàoK„fÀUÒóÜšèZÞ0Ê3¬í‘J\Æ%…™&ŽëÜy¦&@bˆ‹ÚÆY±ÆôÉM-²ßµÝÑ$êAȦ¤`ˆ\Gœ.ÿjCÊ£TBë§Zßê3{$i@ß÷ó\ü} WAsÔ‡O²3•Ì’dD§ûý…s±ÊKë-îc’|ÕØ9ñ7ש1â¯+Å$qGŽ T±–f9Æùäk¬yÔv´ŠCíÈ5ª 7!ên “K½<ˆöíú{ÒRf"¬yà×ÉpU‹jÜŒP°¾ v#‹&·Ò>ø4Úùw]\ƒHDñÊÀ–ÒG$S« •9R9Íh‹a>hݘ4o†w¡u ^?ĶîŽ\Û ¸ÙŸ‚qûVç˜G#€»ãÆ75­\I?Nè—«‘"Dë¨vÜSQ"â˜Ð‡L¼„>©W´“Í:.c™ÙZ6ÓÈ>+²êÂád:W §ŒÿµVµë“›Vt9(>œqPfÆÊzŽPX•šxž6G`ʼ´‘Gl4Î|l‡PEîO¶é+ml..ßUî~ôº¨Šv±¹ŒÍc!ÁUú£?êZèï![°!bËw·šqÒ’Þä„É<Œ÷¨qæKFcepCw/H[Yý³E þ˜ƒYÈ#N9Z(H1ú±¿×þãÁ¤n!XÇ­…Žî§Áðkܹn°hÌ©À;Ábx¡™HïŽk/))­wȯaOd˜# °¨ß%Ä%ì‘L»H˜*ä|Öæê+ky½âŠCí™b(ˆì£†Xï,‰h\icÜš¿0¬9{ëñ0°#R\²Ü°þ5Ìð[4H'>w¬M8+¥¶9íA7.LH~æºJ†¢ÎE¤r¢Ç‡jf>rì²Âž¤mõ:° ÷¨Q;LÞœ„¡'fw£KÆW>“àJ<üýéyT¢’½ÏçÔ¿^è˜dŒÓc!½ƒ$ì~|bDÆ8#Íxåµåv\mä×›‘•©±1*$˜‰ñ ÏqKu)‘ Ñ¿¨‡#Hþ”hÕµë –c²ŠvKOËÆ÷2G™ûT âˆ0R.cº¨ÜåzrKq×-âlå_QÏ`7®¦_â¸á$ðk™ü-(¸ê÷ÊHtŒ’>æº9Ô\¡ñŽÇjw™ÿtè@ÆoqÉYÝβÜEÍ}2ûâ™ ‚$ 2ÙÆ;P„F"U¦#p;V•–5 ¾[ƒÎ*rIÕÆPî+x˜àœòO5Ç’^« Œê@ç?º[û¿Ì0·Ž0Æ?ɤO6LNcÒwÉ;×OÆÿ >ݘ·˜ý«7£‰昳>˜!—X-•'jJ Ë49šUFûW×Qdþ #o¬¿j.$ú‹i~YáHŒÓN"q8­ê²écŠŒþñ¦feˆFIïH³Ká{S’ôd °jBÁ™vÄ4#×qg”ˆÔ±÷¥gHØÓLÝ‘ùp@ÆzUWÕ*äãBÜFNîPHFÓ+€ Uw4xchs¨…ûT QÖ0ÇGg9Åz‚A!É IÉrs2ЬãNTešUц’§ÝÞ›˜è“ £VÜÐX;>­°>¡žõå3Ã÷‰”í­Ž¡ýkØâݰ+z±f'€{WŒChÒØ¦Ù‹#s†8 ;|RòD!·9æž8T Iì( S©qòhÕ¦D'ôF–Àó·4+‹hz‚hupp‘†ãÅ9"«ÈKÒþõášHïÍP¯]Mœä6[X·Ôê]êl©ïŒ|WIw{´`¶ y©uEé{4qÿQÞ¯ÄÎwPZªŒCv8Ê™é÷£l$/ÍjÞÈÜrbB{oûUkK;[I„Š™qÃèß"Q R´Pꥇ?Üq£hlR/*8WlàÇšv “@‘NØ®y¾ç î-½@HŒ}óûTùo.láü¤1¢¸úT’Ua‰Îâ—º&¡ r94äoFsgSB¥Øj37氾躮™qÍ+¢âÜ‘8g„lÔ|üV­ôÃ.°ÃIßn∊ê Ü=¬-˜ÛÄý›àÕKÍ d[¯L̸Æ=§ùÒòF’D:s¸‹ÓÈ6*$S†ÏqäR“4ÀÀ=°j_.zL¨SWcµ=ôÿ«ŠVöA ­€\nIÆ(PÑn¤ÎªÁ v±[*æ8ÀÒj™e¦ìÊwcŸµS¾”J„‘–šŽr> V Í]#‚]z˜ç vÖ­”ëʦ¦?œoˆÆwæ¶·%UˆßaIãø}Eú¾e"bwC¤Š^ÙIPÛP§.ʘq¾2O [¶çj¡[éRŠòòš+êáàr|×WÒ¤½28ôpp1É5ÎØ½Úª®@9â«\Lñ!h°l*\¤5,s!:‡õ^y&Ü`'àW?,·w½@I4¤UC²ئci rî]Øc$çKK@åßHäÖ‚Ìòá®å^Ôn®ž¹S¡´ämš¹eò;<×9Ò]¿;t=¤+ý*Ñ»Ue#R“Û.Qö $ùRš£~®ñLw¡õ Á—µÁyF•*™¥®z„KbD¨ÊJ„óPíí´HråQvHÁ$-AÙ™c Õ;8-îTkôpØnôêBLAä:Žõ+¬;Í$v1ËŸúG5L%Ðdϵr«óóN+h õÓ,P¿¶[t”ƒçµxÖÖÂs:EÊ7àqñó^°“IÊG9/Èú³Ús¿z ýáTúYPI­ŽIÁ¨BáI Ÿó$:@ñL]:à É!ua²àòjRFߘI¤l8ãéªð ìÅ;„¤-B UQ¥@Øù¥oá{y½ÃŒ‘óWº'I{ÛÕ–áåÀÎ3õãŠ7_ü9w|ÒÚ<dÜ«> š”¢`‚œ\¡ÝAÒ‚=Ñçê×—‰iõÊ[Ƥ•ȵP‹ð̶ù7s)»ˆ”"ŽóYþé2ËfÚMƒÉËßµ5ò«*,úže½Îz/ŽvÙÈFVÒq‰0Ão½Q·üsÕ^PYí¼xþƹ=22¼Ú®¯sã`OÍSéöäDÓÜU9|o¬ “bg-W3éÃ19íN ùÑTDÅ1àïIœ¨dö­¥µÃœè:y5¬ ÷À•"üCÔa‹–eðþïïMÇø–W‡Ðxgm`ÿŠæýúI8ÛŠÒI’Þ63ÚÍ Xšx£.n¶mNa¶Vÿ¼Ò)$RÈ# Ô¥ü’C)F‘ØÑ.o«Lv .åƒø£ªÇ d–5Aú4 UEë‘Üô©. (–?©Nàø5ÂE½Äš:^Î+( ¹2[š“ø~‚³Ìð î~*Äp>ømûÞ¢|aX€gO.ºš2H«‡§Å€‘¾µ¾i‰!”F5.çøè¶õ²ÈT±JºÜ:¡0&’™ÎFûRP¹F Ž7«•LÜx©wÊb¸Fò+Uƒj©õÚ :‚wV ˜è›šØ™žÝëÏB3|à¹ñZ 3Án0Ã- éû ʤr\}\6N̬%†ùß‹oq ¸Ëk ž1‘Rd Ö©A²(Fì®$ŠæHž6Ф€Àm_uõO§«IlóÅ<®¥Ö ÆOÅI¸™UÔŒ¯·z>Ï}D†¶¹¨íÑcŽö·êÇŠôÊ@”®§Ò­ŠðJRÍ ²Ö8Å|ñ£ÛG+ÎaToišI÷1¬˜Ë[0`Îù\p{ *é3ô±ÈÉÎkAn=R_X0ÎZ ¼qÇ’?çâ—t6g¹ÜÀˆº’p~jLÀŸ 7Þµ+fã_ªa²ñH´’Å3³0%˜` $^SÃq{éc'JëlüÔ™¬¤0#Fîå ”dªýÌqSooÐG‹y}Y›bäl+§€¼®*9ÖúÌ0Ù@·I‡S Q‘’qý1S#PI9ïÅ «úÖ¢# oû@ânÞšýîEUÀ*Š’#Y0¨’*‡Ù—±=éˆãGŸJ¸@ƒ4¡•ÑÞ-X|íGÈs”'êïKe=ʱ5êQ·±Œ¾¡AA?íL Vˆ®–Rí•Þ… ê˜ ÀþiôÔFPü#°ìÊxû‚ô™Qœéf°8Æ Òy É’‚ãnÔ`F¢A•ÏÓ]€QŽçÅNrâu¯KÒ`WîMÛ>‡ŠPºXä;|ÓÔ:}a™3†ÎôwÑ(&mñŒüÐü•ÔÀHrÆ-ïP’¥}¸óF¼º¶ŠÛ2Ȩ¤c$ÔîµÔR.¨a·PΫ¹ì3Pú”’Í¥Ëcz¿Žr-¨¬™‚èCõ{øoV(£¦ØY íö¥Ò×)¤.¯ú³JG"“Å7ëì@œçÐâQx¬•XfÅ¿+9,uúOošsóq«xÔ; °pGÁÁ ”f|±Ê¢éZt¨oÃþ²¨;’­åñH:ÌfîÌ •Г6ñ4ƒÈ] Ky=7iV ìËD|`Tž·W Ôq¹8×sš_>ÒÅi^B‚Œf¤8!ŠÒB¶jX¶³rqOÛK#ÜcN šX¾¶c0Ç;÷¥ÌÏ™æ¹M÷èÊ”¡,¦¼ãÚã}ªŠ>sýêoKc-ª;œŒžõAN¤kº2L½Ô!\ãUxj>Þý«àwûW¹ß>k+Q3ÒFàšZò2ËÉ^6£ ÈÁÛ‘IÉÕ¢Wd*Ûg4OQˆ­z‰ÛÜ~e™@$‚AÇ‘^åY˜®=Û2· <f4´²±õ-@\yÉïš¼Y]F0|ãƒLÝýD¢Ëz“®­V0ÒF5GŒ2òSïñóIƒ 5Ч¢\—ØHàÒ·öÖô£ºŸ©O?qMLžˆž£Ôå:­½µdá†ê|Óil.:LÙ¤¾¬aÕ¶ëþEuC2ƒü2îõÌõxÙ/RåSÁ<GÖñžÇÆ‘üź•<¢f0Ã$ס¶þ)³0¼ÀU¹ý]•þ~ô»{©aÎEX ê,ÜDÎ> r0 ªvpܸҰHF7%þôœ3ÝA!’ÑÝNö®›§uOÎ,qJ}'Þ8oÚ“ä;ªØ!b”vÁÝzrÇ8:Е\òEmK¸ÕŒ°ÙFqDŠ’ù ޝ‘ dP§žõÅ$Lypº¥ŠC Y¿ê'·Ú—¿›Ô+l9¦= Œã#r(8Á:ަÜgâ‘bîLÌnäåŽÞÜI*DŠò¹v ¥ÀÕ¨¿ÔvZ,°L#+ŠV[V}(ŠUòNÕJÑìË‘Ò»Ž¤Š$/“•$šÃÊXT ŸçE§@f¹ÊøQHõ7X¥·1#¹ÎkC5 Ÿ"ƒ%õ;¨:t«:¸RÙr~*%ÝÌ—ò{‰Ò¼s÷¬õk[þ£Ôä¸0ãaDŽÅ‹[“§Æ‘µ{°G³©p©‘ ŒJ4y¬-}Ly*\Gºud’™õ ØöTÛ\†bt²ùù¥åcp0p¥e‘©ÈÔÑ»¿ !G ¾oIÝuĺ¶’/M´·±„žÜÓ.cl0ýêí¥ÍÔÀ<±ˆÁÛÿw­Æ›0›„I´eP¶3ÝóD¢š“W;jZ4*FŒ¯ú¹¯¢ãR€êz¥¨¸P«Ù­0(àVu;x úrrã5ðà†o¶(x‰I-qÌmƒßjb )}VÂä*$x5€#:÷ñнÐ.¤ÊO¸þßâ——è¶&‡®ã6Oü2cb9+/üIsóXxý)Gµ[på¼°TìC~D­±‰Hï;.|Ñ̾”sÛÄÙÒ£ ~®çûRÉ#L ŒJàaF;y [0Ë.I €+*ÌÁf3Òº‚ÇÕ£.ÚDÿÃ?ãúÕ¾¡s?H ãp3ýêKYË5°'9 ]ÿjõ§V™5‚5“Û?δ­›/&>Ms-q<«$’ŒÒ8Ô\…bßjNíÑA+â¶tR²‘Zßeœ8‚xÌãMòêc6Ž4ý¿•1gxª¤ÜÎ;ÀóSî^GŠ)M,3ý© •™Wø’Iý4XÀ+Fs3ã*äNªN¡jéêBAn1É:[Ã3(Ï(¡y¤ ¶ép§æU§¼#RÛ«`(í¬ÿŠ}Zæøzs2D¡²!¥ó^¬ß¨®U¡z}ËH³]VmÀgßÚ…qbtúð.Ù}ÁþUߘÊpùâ³|â€%÷Àì)„‹MÚ¹N—£ÍÖ©‘^X—¿¨ª%_PbÇä¹®Q„ÐHU†ëŽÕnßñ L¥ocÒà}`àö©2a ’³(‰Ð~b Œ‘¶‡±šƒÕì¡¿¶Š)Ø7»[wïɦÅÇ©{PDOÁÏïQ:Ä–"{‰eB2}éx”–Ñ£ @B]Eb!ì ®A é#‚jD…ThUö ÀÅuøfB¦ÙÀ'v 3Xõ£”L‘ó]Äéú¡ãlmÔ[cŠ3^H«¡s¸ÆMNIurM=lÃH-ãY™b ]Y9>1C´êVø¦ÚsnÅÝ57éÈÚ“MsÈÎøÜïF67 :„´P·@6íOO w6ûìÃ@R…qZ.@Òy¥1$Ø”…x™-‘•ˆ#qÍ|ºƒ:ê_Æi©âõ2GÔ?­$ÙÎj©[ºð2Í„Ö3J±E¤ç¾3VšAl@ÆT)ÎOí\tLñ8t%Xn§¨Mp¤3'¸ï@qþ&ò¾åøµÜ?¨ä…eU9ÚÒT÷iŠE ŒßÔ:çúwZ‰Žài#ºî*õ±´êvæ(åI#ê*ƒ¾;íýkŸ›'ì5*ÆüGÖ.ÒD(ÏQa+ ²Ë¤ƒºµ*Ê‹Žõ«R;½Fp¯£¹˜ö&.¯ŒrŒÇ‚ìl÷­Ë|èĨ|’µnœg¾·‹Ljdl!ZšÑm€,5~Ô_:FS%]¤·±è’1žx©­bRA$jØãÅt~ÍClÖžV™†ý…å((u<~Çs‘¿èBÝ #q‘¶Çâ‡Òâ†HX:+0=ù®¶î¥m/Á¨WkÓî ìãû¯]x·q'†±¸é–·@ôÛ±¥”b7À}óTYƒ)ÁÅ !HQ§fÒ˧–>)èæ¨À|bì@^!#âÒ"YÜGŒœq¶¯¥@ñ[SœVúGk43] /.Ȭ7ýër8\fàáBrÌq<¬º Úª¸}«ãŸP 9ÓäSe?*Ìàd·ì(rÈ®j äžÕÏçgS¦€ÕCJWQd ¶Üø)Ô¦ÿnõ—ËHÏŠ4r«ÆÁï^nUA©¨Ý bƒž)§`®€‚sæ›9búsŸµ/y!”~(õDѸ†d*É«;ÍÞa”±:‰AÜö4³kRTç“MÙÅdJv#ùíTdŒ/Òw([BÆË) n?zÕ×O€M°£<šÌO+NªŠ‹ éª‘éÖ¥ß2c⹎ì†ãúÜ’ëùhU$$»xí÷§&@Én}§°óJu‚Á¢XÉ œäÓ–>£*£¡F5gƒ^oÐx½ÇX¨„ÊœÛÔñÓÈX•ÈH Œ|by!ôÛL]Õžþ);(Ô¹v+³mƒ»PcZRÐÕÍB]§h9ÎsŒû·Ä~‘d}Éä Â@Q#(äML@\° Žš{"a0?¨¡‚…žÜÖ$œÇ§H,ÔçäŒ8HÃ9r=¼K½íÄŒ¢¨rwɦ $››ÄÆ.¦!ô]è2[¼1",…u˜ûÞ³wW3‚W1®ôéE‚,Πñ¹QNý&0¨ƒôÞ›nCÈ“]LÃs)Ê©¯¬úe£ÝFÍn«ïqæÃÔ.½ „c_5FÂ'»ºXC,bÌŒO x£lU{€Q@$‰Í7w2)lÄœP ¬ÐÜiÎÍŸñTÇNuW•6÷¶ÿ6‹\zƒgçæ¨\ u0  $:Bè_ó(rØRM1m*zD±õ;â4QDæ4g^i#¼.¢9X–ÜmÀª9ŒÝ JÖõLã8TÛPíàSÖýB9Á28QÆœoQ£\xå` ÒN;ÓðG š¶–;ŒœdÔ¹Q{–.ÅÆï$bá£õ4G†¡CuGöŸ“Àª·Qú£ ¾çl/ÇÍ#%©·@ssƒ]D{Få”ÄÚÚ(È]#$Öä·ETÜüÓqÀf\¾qLÛÚáô¿ÒvÍÉ]˜õ& Òt²#œ¯©¢“ ‰ïܽ]g*bî~hwQº°s’¹Ü“p¹© b»ˆú°¤ŠËß—¹Ó+³\€$'$ƒ¾jÛ^ó†ÛÉíJÝÉl–ã¨Ír cÔaÜü z9'¨¶&K£¥@DyüÝÂ÷æ$?äÿAOXvѦwb¹éfyîiX³»e‰îjÝÌq¨æªÈ¿Y2=¶ºŽ½»(#V0)«Xš_÷°ÄG¶xÛö9¤¥½]ÙIC±`6§úEÄoÓú¤1žaYÒv*Ú¥7Qòá‹8#Ì~˜rS²·ñ»È² Îù=ë”kùmìU`ÉLïØ“äÖ"‘ï¹uÈ;îv¨2á|¬XJŠ &vqß,·I¨Ã«oûTÖ_%rYM!Ѥ”uxSÔ‡Xï&–K¢³©¸x¥|@ŒÕýeȦ(¸G|j…¯P—Õ\åÔñýê µì.©ü-[÷SñN°±™2 €<ÔùÑÄws£õ½¦@=§Ï4PÿÃ%|gŠ\¤Ö»-Ž3Í›ˆ¿†0ÙßÅIÄÔ@ÇÈJJ¤38$ëí@H²™&Ããn >¥è2©$w¼—ªê25 µW¸·©¡r¡ä´µxŒxÆs¿ƒQt:år«6wHùŠFˑ߽#Õ“ò÷ ÐŒ_§¶hñ’‰ŒÆÍ|LSÔ}^˜bÉ¡ÈT61î?é¯cÀ²c;ƒÚ¹ÿÄ×–îR¬ƒ%ÇÔ>Þ*ÌXË?Mœc‘—­¯ ÿˆµ„oÞÔzšKŸôçŒüW?ÖM*Km{Ò ŠA‘¤çÔO¹®oÖ1oÒùÏ©ú³ð{WGoÔ­[¥ŸYt‚ýX: ?Ó'û×Hx¨‡•_üõ Éä3™6'`S›Ôª—1z«þ pëûÖoºeïJ»kKè½7]Á‡ˆ=Å.ÛmœÕ$ê(S£ü5ioqw3G&µXÈÐË‚ ÛíMôßÃW¶×¹•a‰²Œ§%ÇaŽÔ/Á1ûnœê?½v ÈÍq¼¬Î™YT÷½\ 0ª(Ô0U{@À¯ˆÈÁ¯F‘€6Ís ™ëž¶0p3@ôãc‚¾ê18¯Ú½S ª(6‚–‘# G'‘OÏ*FŠX&–9¢’-C#R‘œv¤ÿÜz=n ë%î+¸¸—]‹E#df¤òrúVŒÅkÜ…x¿ÃVˆa¸ûÒVÖ÷7Êñb%÷`œjùª3“ùf\o§#éÆÿâ²ãTaË3$«•ÓÛméÚ–£,Ž §»Q m_Yi“§ëêrIò8ÿ;©h’c`¨Øùª–вtûH²ˆ‡ó;ÿš>!T~æP2[ÄõÒRÃIÌcµiÓN–·í[E+ ¾wž1éeÔ誩û;[A{Ô!…Δη>niž§ÔPrmÓ"4`y?5›oàÛ^OßBħåŽÿÐHñ’hô`• ’ÈžHÞ²˜òUGqÚ¾†êæÁdkhÒVsÎºŠŸ W…Nã?Ò‰LH)+n¯ žU£—Z¶àŠzÒs Ê‘†SÁ­ý•µÂ™á”£Ðãü×tz— ¸KĶñÜJe‰Õ¥Æ Ucsom­'F#}¹®6HÖ/q¸ˆ±ßNw4¸Fú¥ã°æœq(§£:Fs;–‘°¥ÅÚÆ1­r6'5_9÷j÷ÍxÆO©@ÏŒW†} ]Ë\FàNß4•ÛG<%H9n ¡FÄ i1öÅ5µ³‚UIß¹â´b gŠHÂÆà*ê!”òAÎæå$p«‘l zé'UñäRN n²ª JsÎAûÓÕèý¤ïŒÿ–O·êÚ²:#³&à?ŸµS‡ñZÜHc¸‰Ð‘õ)üÍ´S1HJ°8!·$ÿŠÅÕÊIùÛˆC‡Æ¢¬2»m°£<ý„XgMƒ.‹¸¦‹TsÆï·´œ7ò¬Hò+€ñºŸ +“êDÚ}$1:ò3œÓ]*þå›2ÌòèúUØ(N £Ó˨‰tÉ“8òk%µ0+õV£pɺ"瑽/uùµôÍ¡Ž<ýa“WïI­Ô§ú…£Wa‚ĨäPäY ˜ãœÑl‘€/rÄ.œþÕE¥¤Š2ãâZš€‡ÈW)—P€1Þ´«ƒ}ª„ö‘¢æ5œÒðÅ¡YƒœŽQO->2HŠŒ~¥Ð1ö¨—=A- HFQGµ3‘©ß,Ÿ½Bžyfœ¼»“Û]oǹ>|Ü4!cõ.fõ$|±<LJŽÅœÒq_tä—hÆç'ŒS‚dy‘µ9îä{j—jj¨RÇ# DcÓÒFKðÔË€¤ºª£ÁqÇ mk!†lƒÍ n¦s„*JçF…¶éÚIIõ8ß`)x¢BìúÎp¬6ÀûS2F¾˜”¶ñ©àP0׿)Œò%†~­8Eœ1éÔy5·±ŽMq“ª6>Òâ§ô‡&îàÊsóšnK Ïœàv4l¥^¯ÐˆŠMe5›êŒû@í÷¬‰.˜à†EïØÓÈ.¦ä ¤ðâ¾–Öà6è1ähÎAp¨£4¶ð„Ÿ$ƒ[’é^5Ê»?qæ¶ú­pÇN;49fBšÔq³|׆çŒL$WL.Ã[Ê;ŸúGÍ!|'ꗛĻFƒ„…bIIuFËþ {Ÿ4uœ°ö *õj©Mˆ¿«Ž&n/ÃÐ%$öØQ–ÚÒÝôcSxÆhPÉëïê±Qúx"œŽx-¦@ W æ±™½›ƒñ…ØYËtqhvóLôh7ÓUÛ\eí¸#zßU€DU2ÿzK¡Ý0»6úÈ5êr†`*ðµ2Û”ƒv>kèúeÌkìÁ,<÷ª^د."SíY~õæ²ÙT\/jW3Äs}*íï žâHØÆÛàð *ö3µä¥XZL!µjoqA¥†—½{ ĉy*tk+ñÀÅ,ÙÜðÑž›y “LsÊã ½l´Ñ¨f¹Plo[œ…”°ò¹Ïî NcyšW`£eÎìkw ²!Sª=ìnÓHêNHÈÅt°Î !>3žÕÄÂÀÊFáW`[½t]¨$Œl_WuÉß(<¬ -¨žÃ”/º4±–ÉwóñK»ç@ÁÈ8«1ÇMQ.ÅIºÁ¸gTgp|×!ÍJUÃ!bpnNKµ={ IjK¾Y7]ª43h|}ÇœïUí‹\Bbwσ^È£tnL!2u(ßµAüObÒX¬± zMîÿ´ÿæº;ˆŠ³Dã¾ &Iÿ“õ£ '# Õ8r`âQúЃ?9s¤`ïZôŠãžk¡ê¿‡$üÁ’Ð^ñˆûy¨òtÛ¸‰ùÚ»¸ò£­ƒ9m”Ñ·JüEg5¢tN¾L–£h.@ËÛò¿¿XèÒô›•Žf «ªãÝd^Ć:uâÈ[òò6O!k¦è}N(¬ÏGëèç§JßÃvëfÿRüy®žH·ü÷1yJ¿€Ê +ÑŸrʼ÷Ø×P¬† Aè}N‡qyÌ »)Š@r²&®†(´!ÑÁ;’v®–Ce$JEY?zÁmñý+Zâh$»c>k^ØÀ©*dÈØî4ýÍh ÜOÆ+ÂÀqYi;6jê3aÀ¿ÔsšÃÈA#:Hñ_+N #<ׇI$ùç5•6 ^íIÒ½Žù¦UWNFÙ¥eµ³žzOªõxºDad!˜¯µÁ?Š5ND*÷=QÛû´²·õe‘#Q¶¦<ŸŠçZQqrӗΣ|Žßҹˮ­wÖ/K‰@t¢/ÒµrÑ}T”ä@ gÏjèáO±Ü£ÆjyO&H×Ò}þM6h×.Ä÷ÓØTا0–-íP7'µþ Þ¨@3SœmÐÆI¡ˆ¬ŠB‘Œ÷ ÏG(`2(öþ™M¶Îæ´ÁBà¶A=é!©¢/‹E˜Pûì8­Ûà ÖíôúÍl8Iã¶­,zK„̰ª|ÜS·«¸`ø¥nœ…ÆpsÞ¾†s°vÇŠ¤­ÏQ+qðtDØPHàR’†$1\úsÅ>u8?<Ì™tÔ€1ŸµÑ‰º12¸E5%T®ñA‘}Ùïë0ÉèN"-”mÆ;SªÄ`Wi$Ð@ñœW¥ÂÎÈWÚ :i@ä ª všP`LQ6b2¸ÖÙb0y¨Só3,qDÎ Ô¤ æº Šh8Ü“^CBí…çj³ðûT)ÎGÒº‹ Ñ"'»6)‹_Ãòª´—@äçJŒÕÇ̪ê>¡KÍü5¾ØŸó»hjx1ˆÅe¤é–rÜdW—sê¾íÚ†@ •ŽU“$ƒ\ñw¸ú€ääò)Š9L`<Žãhé,+¤ãl ëØæ/ % \b—„F êÛ¹Úµlú›Õf r(Š÷ÏŽ€•–ܦ‘ÙGjfF:UUxî*gæšb"Œé.}ÏžÅ8'0n»c;æ¥t1Nkq‚䀓Ž3Ú ~)— mï©Éþ•]ÙÜýûv©½W¦ÉyÉ39Ôqµ7Æâ¹h¼ˆJXœØ$iÞ²¬CNõ¶]#-°¯c“§F¹y?éU;þõÛ½u b³)ÚAxгÅFÄw§ã˜¼Lž‘†nê{ù"‰Òo­ç‰­áÔ_J·!{V®T`3úMDXò¢!ä7צ`¡N Ûg¹¯gº»‘ŠêàïY.µéûWÊ­ƒ#ý€¢b.,"“£gÜÄÜRÑ[¼²G~Iª¥±«Š;•%AØ|Ó“¡0{…¹Œ¢zb@UG"‘‹lk^¡e ŸçZ‰YˆTÜœ4À ÇØ Fúe©¸½Ž6$¦¬¿Û½­Ç}Q–Ú-áJ¢ŽÕc¥Yµ¥¸,ƒ×“êøð)ÉmXâ]*e>ÝXÜŠç7’[õÔ¤ ãûÎb>$ŠáÄKÙycþÔÍÝ……¬K„ ÍÁj°-¦ ’q‘AšÅåEFÀÓ¹Éþ³ú‚Ì,ê{ãUÙ’úQŠÖö9LJlqÆk¬Ž%(’Ñààßz奈!*0v5{§Ê—@³è{K5ìÛ¦. u•N&U>ÈÔî(];MßM0JJ•àŽr(—ž¢Ò=¤•ãꤠŸÓ"0H~œV ±©â@î|½â{• ÈaÜs¹ë—iƒ'³ žBÄú‘z…wmæ±ëœÆ'êí@ÙXµQ¸ÀŠÄK³«9ÈïZt>úÑ$eŽs]ÏÅmÕDd6Ûsâ¼Mî\™‚À»騤ï%Ã7ßJÿ÷[Ó-ñGeidFNUßù¹âˆ"×=»y­cÆ9ëcÜ E¬€{Ñå‰Ê•Cƒ¨Ñâ‹'š$Ðá2i%™™¤q»ÆºÈ`»dw¬OŒà <ÇM8 “­Ž¡œw¯7qjGC©?Ó,H#òÊÛÈT1m·Ûâ—[ƒ¨çoóT "0R‰¹dÃnØøtXݶ8&¼¸‘feÉlw¦ílãV¸ÎÀç÷­ÒÄf̨¤â©g¢Ü?Õ#Å/=®³‡y++HÏzù¡‰Ø³ ñÜPŒÄœs¾ç0Ý.톨€*8ÔqQäIÈ}ˆ8"»‰WS•¢¨ÇÅrRDÍÕš–M¶«¼|Å®ýD:u¶ Iýª¤* ì7;Rv±"©ÀªU—¸ïMÈw ¥‹Ü`.Éæ½°‡DúÁ8#óEh€}‡èöÑ‚ÄpFô ЛٸÎ žj]ø"EGíUÆ—Q‘Ç4•â«H£Àâ– „D‹:ƒ¾wñSå8lU™âض6¤ÜDAÕÞ«ÄÒlÊ`ÀöƒŠÒ©rtŽhC$â[6æœÆ¤ê·)t»(%„JÊKyUHT'ö¯‹±,7ãµw=)$ù#{š+3°Ø‘žzN&þföíF†_Tj=¶„Ü“z½¨·‘.¢(AaÚ˜¬Ú¥¤² ΧN?z-ÐYBFjæ ž'©Å9:Óz‘fǸ{8eêÝJLÀ$fË• gòpC*¼9V 3µ ¿™µÅÜAÕAư6ûUK)â»]Ô$ŸG—ØêV4{”U@²FFî)‹dià`|ŠZÁH—Òm°vÏ«¬dåó"·ª2Õ¨ö€ªLQ÷Ë Èãn(÷]?×  Œ©Éù# õ%“$•9;ÑÌþªeóñKu †©öfeú!9šü¨½2sEv)gPD{‘É4t·ˆd0±@¨í E†–Ê…ã½5k1™=)d(Tr?P 1ÐX@ð(+úë#°Uçý¨ÝCgRâéŽÖhÕ‹h†œýR(½;hÞ6 h¶ÝRÊ9fPêÒxjÒ:F¹ò䌹,¾ï¦¥DQɲzÿx¶fP•åmãDõ“¾EH»œÜ]•È*›%Xº2”vRÁNŒš†½3Ò—ó/0” Âù¢ÁÃd÷=Ër„QÉ=ƒjôÙÉÒ´ô6QÇI"*¸ ž &/å@ET`ÀjÝhËé,AÓ¬÷Þ…•Íú‡³*aÓn x]ðhFæ%|1HÃÉø¥-ï–êc$Ÿæ‡:À¤]BCî*GèÍ ù”‹,€Ž@;Ôëו×Z©]'sæ—ŽêvÕ'<çŒRýW©½².KNFT6à|Óqán` ¬F!É¡Úy#Ä’È"YñšõëHô«HòÝTÿs\ö‰î׸vwmòÔEUc¤¾k¡ý*›ý¤gÈgèT¯-ü3Dñ¬Þv$ñQîgXõÐeNÍÅy5óÚ¶•Œ7É¥¤i:”™ŽÛÜå?ÍUNºårÇ}Í e‘rd;öVí㉑Ë6_ŧ[!.#VSòA\tNšéêFÒ¤¾5g5™3"ëÿÈÝIžŽ:„(€û£SÿdU«{Re–Ñ"ùàÖá¶·ŠU™€.  $ðQ’ØÔ9#ÅA—7- j©]Æ4 «¨ñ¸¤ZÍ‹ÝJ0ʬAÁ穘nc2GW¬§éì~)øL-`âr½Ë|ýê[׸ðö'+l.•½È¸=³ŒSÐÊÒ&œ•$caLC»zަxó9íD•w_MBänÕC°&Èb·VÁ f‚5V‘†¢å§O[uVvÔÿPãÆz$«%4F‰‘Œ`ŠÍƦ1¦ZO✸¬4²ÐÇ5ã+2V Gé=ëK BNýëÀ;‚–ØLÚµ#æˆj‚7LrF(±BÑȱ!ܾ(fñ†f|àîhù €„âÎáȸXQ°¥„sj˜QÎAÎß5A’¶¼àïÞ™¢Ø´Û†C¸#‘æäâ5=Rôi-ÙE³jbqƒÞ‘¹é—óÍ¢KI"côÉŒ©ûãŠê¢•WKkÃv©=k®=´ß—…‚È£ÞÌ8¦áË‘š€³”ñ:œ¼°ÍjÅ%FGäWÐ]y„ƒ#ÓS\5×ÿ¤]3ŽÀ¶Ô# ¦ñq·®˜6>ÂI°lNžâB:œÄ Ã?* \laXŒüÔΡp ¿‰™— o Æy5 ÊÈ dÛâ¢(hhpc>ÇÝ…VÜÒé8i$Ô§:ÉûïL2$°²–ÛžhCÊò :ŽØ¥jŒ#qˆåö$È¥% ¨È¥xûóÞ…$ˤˤéÎ<šrÊ º‘B˜ˆFâ˜Í\å”HŠ@ll;Ñ:L­ Ë’7z¬«lªNø$íY²E“¨*!úA&‰È8ØŠ¿qSôh.H–HØwaýëË¡êÂÇlªE¡*¡ ŸÕIæ†3Î2+æ™8¶¥¼1$‚6;ƒ¨Šz öäJÛ/Ò¡Ô®¼èóO(ymÀ¹íDäûžaÆãT§YضŅ(b Ú†wÛŽôíóºéŒ¤sæ³ÄQ‡´Þ+T· M¬Fq«Ú@çc\oV¸±¸™ý"é:¨ö±¯Ðä‚$*@öŽÞkò¾§Zõ›¨F‰Xgã?í]/úyÇöˆòP&2±"Gÿ¨Óú·.±e¤f ÎrMÖÂkÙp›FÖG5Ö~ü>¶·ïu$¢F}ƒÞºYó¦5$ö$èߨë,ÖV}6áòWÜ„þ‘þjí»ú–ëü],6ăüŠOªô¯Ï¢º¶%Œì~)¨í˜ÂϨ£Ü?Õó\pê ïܧU5é\úì„ß9Áù¥ÈeÁ_ióDIœ —ÆzœÑž ™è-¸#jùˆî hÜ• ÿÒkE®?k<L½Ì£€v¬Hï¹Æ~Ô¢¤±\f:q¶M8˜aœäšÓ¨u[‹=ÑŠ)dêT'~Ƹº²Ë*¹v–Y‰/žæ¿Ex†¸ ×ÕzV°Ñ¨Ä€êR~*ÿ"«îcJ@íb’ÞX½E)¨‘†Þº[p鯛êݳ\Ô“JmÔ¼ŒÞ“5âºn§¦ž°ôõkÇï]%\€jæøÎŠÔeéfÉj\W¯)Ö3ž(‘È +lÀk ò>ôXŠHpx®Qb'D9Ëy„C }ÍÅ<š]r@ýéGŠ&p>)¨× 0ÙÛ½!È;‹ráa_ÔA’y½Ëa”¨8'œS1¤³mØo[pIÓŸŠPj;‹V£¸•Êú±êV+ ™UÙH*h±È³³JlA¢” ¸4ÞD åZ›U+“œŽÕ AU€<š¶¼û†ÕàW#qÍ.¢ŠÏ& \s¾ô´PªÎͤ®Ù¦e(¥#jQd3Ì}!yäº1˜Á©f&>‘Î3ŠO×_H¨pXrqÞ‹)d·ö¶3°Å¢Ú†ÄÒÌF® $Wäl75¤lϲŠ,q4}¹æ¾ellxÞ[…©†ªI |ÐLA1œó½•Õ•Á' mI~yœˆÝBéÀ#9$SQIêŠu©ýýR¾‘Ô"ÇÓ>ý,;â©u–77‚4>ÈöφóI<˜Õõþ¬÷®–  î5`ã’Iò «âåx;ˆÍoW¤  ÆF3YKi%gÚ¯í©ô8˜¨õbúT¾W>EJx,c 4d¹]D¨ìÛâ••yíb›rìzX êçXµ¼w°¸õì}7ÂÈ£Poû—œ}©ÏH‘ì»sµKºš»[‰kEö ýG¶h<|@5¼Ÿ/Èíg=¼d¼k=¹\~f©AùñûÔ)¿ý¤°þ¹ÿ5N)gér¼‹#Á#}[ó÷è‚÷¥õXŒWÑ~J\ä\@¹RêOö®¢¾¬Ïù©R³¸+YHnWÚU6Ç“LËÔ¦™WÔq·8Yº,Ö9$R·P¹Ï¯ë§·Èýê[6“ŸŠÅ͈{Qf=Ón$s*Hrˆ5=¾(òõ;H”ê”1ÿJoRU ©"¦v]XóI>ŬÖbÎVQ›«'ÓŒ…ù4D¤ƒÕO~jXâ»^‘`?!° ”½v\*žÃË#œå½¬·s Œ³Ÿa÷®¦Ö×ò¥!·…¨ÃÎy'¾*ŒVi â5UÎì@ÆkFR ©Á'8Ír³y&‡RÜxøû„‹HܺXsßzøjÆ¢2Äí½ ®t’ßp®u¦Ì98Î?jŒ!1»‡g=ý§¸ù¥®¤Ô¤©Ö‚Ò 4‰$ÆNpy#ªõ3Æ8£$ŽçTâÂY¨AcBÌfE×.…\“¶ÜÓý:3Â’ê>ãØW)U»GÖŽûWWкݽóú3)ŽåÁìßj³&'U‰/Ê12$, \àö®O¨êŽd»é`ÙMW¿½ÐïήÇ5 ëSnÙøÛ¾26fd[³éÈJ Ž“æ˜es•läÒ}"Un‡-ìÃãšvI­2¶ÍG–ùæ9:]"Iu0ÀÅ*düÁpØxÿ5D,b63äù©Ïdwml€ÔhÃw =Fý!¶Œ)!`ùbhÄ©±ß¸¯§%+œ ïE‰€òqA”Ç+°'È9m¤¥¾Ü«®1¶iɨÚwì;Òs¤c"3–QØd}‘î{fóšÏÕ•¡™È!£n½9Óá±»?Ç‹N>¥S‚*’ô™‚ÄJ«ÛN(ÉPh‰‡ÉD4AœÄòêç“Èù¥CÜ‘] çáØõ“ Σ°qœT›¾‘{nŒñF³¹*wíTcd:¹ä-}LVYR ªi$:TwÍYŽŽ䍯Õ£©—©¨j–ÁóмH ÌÿRH›'ÈKðô+7£e\€{Põ¨eËožÔÉÇ£ƒÞ¥0 E£&"A ½OŠÊ7ê?™*…ÀÇš±q¡bP« žÃ½(»€²¸Áù¦¡ &ÎfÜa›W<ŠèmØY´i”%HÉ5Žå·ƒÜçæ…VVÔ74YTûV¬u;OZÍŠ­wØñòj;Yʆ'´g“óLBÜñv ¡5z²G#ÔÜhÊrÛ/Þ†ª±`¶Àö££†Ó‘XL B¤HÄ:Â|šÀ‚+Ó1,pxïšQ$Í‚¹O œø¯  )#QÈ絉פàäö£$$ íGШ52NWC‘Ÿ5+©—JÃ;Œ{âœ+¶¦<ñKuU(ÝN[WÓMM0ˆòã3Ñypl°`bnT¨ Û[Ëé¡Õõ û[:~õK£ô©/A’RD£Q,yý¨×]&×ÛêM>¥c@ó¹­f¢UDŸ"~Ìkù‡Uoc’“c¿+ÿŠ£¬Gnf$;8öžäÔ[~·Ó¥•U-Õum™ÜœíTW¨Ëm8†ê(Tr­ŒñS66Œ°œMDµÿÔõ˜™S©¸ MD׌ÄÍŽáp+ u1R¬ªwliDiÞ]lìtîwÍx€ÃrÊNÀ”ÁxâeuQ«–f²LD¼ªÛo¤JÜ hd‘Þ´®#™ÉÎÛ•ÀU•¢÷÷¶vA=D•õœ Mè)y/´·¤–l89&¥#¿Yë*Ͳ3{A좺¥XÖHÛì; kŽ2tò‰­ âØÇ=’I;$E‰%qÇÅß&rO§°ÁíæºŸ]£LË*[œù­ô'l1$¶ŽuqR²±BÄÂcm¾åUÓ"±b5‘€[#"¾¦ÆJû•0;÷bW0«1àƒšöÒð¼‡ÖJnÍÆ*jp,MâFâap’3J­ }Z)«ht@0¾ÁôŸüU!(!s‚ñÆE â9&)2@À‡Ú³æ-¦Ô ÞŒ—1º2dˆŸi# õËÿ‚ê]xÛ¹Ç?jz{YÒÝcˆŸ«QɬGm ÍŒƒ–ížÔc"ñ“§Ë ñÌd` Á¤ú݃^ÚÂbÇ«r?Ô¾U¸¹*ºT´“0MêåCþ‘óMÆìoÄ‹ò/œÃÈÌB`†à-zUËNÂ3àÕ‹‹k•V( »çHÔ¹ù¬[#³d±eÞjãŸëk"ø«¹&nšÒJˆ=˜õJ(£¶Qá?éÆ <ê ÎOñ^§ÕU`?Ô3IlÅ€{ˆä¢7[ÎEy{r}'TÈ,0íM=¼m6G·Žâ¼[`fþ Ô6;v£ 4LÚÕLôûŸFïò—'Ø@“çæºkaˆÈ…CJq†ûææ‰dÕ(Æç5å‡R“¦Ü³Â$GÈ Éä½ÏÇS©‚C)M2 ˜w‰š-ÌÐ?Ñ Èσڂ—1]ÇëDêùáÇù¦b¸ŒÉÊÁtìs\òZè­O£°ŽÜÍ¥›FpÐb³hü˜,xé§?1:Ôääýé@÷w"ELc$jsŒÿšõ™Š ®n ‚yÛB¢äàdŸ°©ÖýB+¨‘A&†beÓ¿Å<½0$$ó™Ž`½y*¤ ¦¥Î7¦rZ¡ÜÚÜóLl¨J¬yçzÔk `ê=aÐÀà×)ÖÇWˆÁkÃYf$ä±ì)N•á),m$\FFqU/ŠxÛ0>@N„ìä!ΙB£‚?¥+ê4ìÎì\Âð¿Ê¼3I3æeöÛ™0§Ó €U»TôV2bY¨y@ y¤“øiž~+Äi×ÓEeSš—xdhñÈRB€m¾æŸAF¤ûk¹ìÚ½eP=¤cÆýê‡EkSq,_LÃgõô¡K—Œ©ñž a¢x7Œ"œäô¬€2ñê;°k¬ŠOBê3œ…;â«EuÒ¹pN‘Œø®e/’VY °ßàÓ¶·kê„äçÿÈË€ŸæZVÇï yp"·–a¨áXûm\§ã»jÁ$¸Yâý¹Pq½ubÙ§éÓÇ÷2_œë9Àíæ¯ð±ctnBÿ™”æÄýÇñE‡Uˆa¿/qÞßþÉïUl½Lƒ±í_“# µ®>Ev‡:—SŽ_É~aWé‘ܩǎ)^O‚¨¤ãÿC7rG'c-¹*V3Årˆú‡©¤ë‚%ú®ßÛÖEÔHq%»A!ìHaŸ¸¡ÞÄ·Öº_$Æu>Es°;áɸîû˜³²6ȘŸN9I#$Ž)ybñÛŒã&¼é—--»JÈT†ÒSÁªóýÍîYY2ý¸¢ b4ŒÂ`ÇÓqƒŒ‘_ øÔ3PVê ÆnT2zˆšˆÜ¨ÔP"•XàsŠ,s²®y=¨zàqë.ëŒb°¬Á­B*•ܶsBœ•PK¾Mm¤ ¹H£9 îƒp‰(‘42ŒcjÜqF €p¦)&‘£ÀuáZTúšGânXØm“’6"¥^ÙÏ( 6#â«Çp4’p{Ðܬ£œ¯!e6&‚DázŸLufÊ2£¸56d’;q¦PÈ»iñ_ >1¦`7ìÚçúßHŠUf‚3˜Ïø®¿åÙ ð±9î×o:tžœ`Mân øðkª‹¨E$ZÝÔžC ÿQ\ÏEéò¨%t-ã·~ÛWV;ó˪à´1g·&™æ 7ï=ã¾E¹»Yá¸$Ç0“â¨!eÀíóKͶ¨`¶‰U|ŽOÍjÈÁïšä¾ö:—ý˜YŽêR7æ´f]:u¨ Ø>æ½»G¾"hdžƸr0óX.ÒFF#hà®>ªË…’&ôÛsÉà3.¢EdV œÎ)¸Àa÷¬°.¾™Œ‚ÇÍ) W6Î ¶—ÈBKT#rEym –VqÎÔiçvÆs_FÀ c8?jÎF †5SÛ³©BŸ¹ggR?MhŸUŒQ‚ q_,!_Ó,Äã;V¨¡SÀ73ªõ1ÀMÁg`Tƒ«PÉÚ½(¥¸ÔËú³Å˜–:ŽO?jò€:îy%{…pƒ!³ýéC[ÂØÈlÑz…ÌP õœ¨éYo¢ˆ/—'lƒ‚*Üa«BßS7V ò–ðê ö¥ ³k\‘°Îàšqï¥YŠƒŸkô¬³Ìcöe˜áµÀùª¿F1A§‰h¤«V8ËglQtÅC¶Ø8îiì\áòO8ÖÌßÁ*C{æ˜TŸsTnô¸%[v4P†Ïìe³«c|Q¡¶’YsŒF¸É£ÒÂaB æS‚©#«nH ß«oQ—¤Uxá“IÒ»v¯ jùY@#Á\Ôç0:¨†RÇfH¿‚£§ ÐÜ«ø>+Ÿ[&†ïÓ¸öÆ›³ø®ÈÙÀçNœ)ÿI"Œ:}£Bн²•q¹99Ü~XÄ+ÔFO–Ïs“ªÌ²‰-ækrFSoaó_\uåÞæÊ)ýiì'ùmEꆮ#÷[2KŒ(Õ†ÇÚ¥˜.²HXlr¦®O‰Ç%2fl‰õ"WéQ[Í#K S(Æ’µyТ”—Ú7ï‘‘^tÅ–ÌäW³}XÆ V@Ï&,gíS¾FWµ1‹L´Ê'7ÿ•%U3D˨jÁܵwMë‚=}«žâ¢«GW‚F‚7ûWC°ÌžÓ ã‘ÍIæegæãÆ’½MŸIËnÞ1Kê`åˆÉv¦%c³•;y¥ÅðBĩۅñ÷¨(>ôÔéܲžäàÒÿ“;¹!µ¶ÁÓL¥ÄRÁêŒÉíFM2BH'°£äË}ƒoÞ¼±ô-oc”¬ä`c™N·ap¹Ñ*ƒÎT½{²º‘½9@#p§ÚjžN80Ãca±0³¤WÒ0N!™A" _Ü\\ÝI$úµ»j½Ëú2ȃƒÎ3šNêèõu0Rä·q©KÛŸÉÄÍ!$ø¦B@9òjg⥸é³,q`{gâ¡t»ˆzx¸y›ø~¦¯åC»üRó“qâ"{€M,âbßQ©oõ*¨9w-½ÐeИǃ¶*W[¾k˜ÒÊòuH¾8ûÒ¸º¼Ý/00=¿Oô¦"–«,Jê¬ÚÉý@šðHüľBêE@të»NŸ/«#bVDKî#>OVIe’TF‰Ž°§Þ§GÓm$¸Žî̌Ŋ0úHÜíüꄳL$SG}ø¥ç+wï÷‡€pÓÙI<>˜:4¶ÀÞ‰c®–HÅì䪷&›|I’ulÚN 4»]M,ßÀʃÈÎEF 2שOÜ­"ê·Ñ Ì@ïµJ½´( LKoq騣m´…߸zÛÚ«Ä’z¤ìsƒ¶iHÜsF¤Ñ"”LëoM€-ÍW…ÖIG!l£Í%³£ú’Æ2Q¹Íe$”Iê3 }$nhœê{ˆ5ê~ec%‹îäQ=52d±e ¹>h.c]4†Ãýëè˜H§K)/íH#V'¸Ð±>«2Ëp¥[;}«Ù®aF.†;{ׂSÈò’ÎqC’P˨ wÎG·é4@YÜq;‰VlÊïŽô›ÒM†ù¦¤¸UVm‹ŽM&¬r£’EX–ETQ ¨…€MxÒé`mé ¦Ètì½³_=ǰdó¶E3ãŠ1¶“ÝÛOõ2CÊeVÁ ƒCFAÓ½ÕÅ礫nOó­UüO]MÏ+C’ìHíšR9Òä’¤ã8;U‰úX¿¶(à«cÚÑKËÒÒÊÊ5•ú³Þ‰2¥W¸hœw3ZÊÂdÏaÁ§!ê7†ÞC#êŽ0 8ßœsK4GN¶‘µÿÿx3Eý÷Ïø£n'±3bt6W&(úuo’»ý«ëûŽ¡$lg‰‡fÎWíKt[¸®-?/+V>çõ/c^u ž I€¤Ošƒ*Paé]3«C}+ÝIü6٘˨“ñOÜÈ‘Ëày¥W©3˨o·³±’ÝÉ&˜Á­¡¦Qh­c¶f¤mFªÄr¨ÙmBŠ 'b‰€ÀgóñA“Õµ‘—FwÞˆ·#Þæd@ë2ÆþæÎ3K^õËK5 ¡¥‘¶Ò6îi eõ %óŠU¢I¶op=èÓÿš$ƒZ§Dg—§¥Ë C/¸Žp;U­qØñ‘I[EéÚÛF’Xã Žsµ8«  ÍÜãzãf ¹"0\úB£8ÕíT^±k$Ýeœ‚Ð8tnàgúUyĆ-arU°i[ˆÕœÐnL‘2þøÚ· q`yµ`ÎfÞOÍt׈ï- /îÉú‡íÏó¥!¸%·'©X.¦µ¹Žeú£<þAþÕÔtŽƒ¸üè9ððÆËô¾õÚÊW%¢Á¹åå£Yþw$™Y•œcŒŸö®fY& Èù®ã«¡—¤\E‚NŽÜ’7W*–„˸#üÒ¼7椟ÌÓ c*ΊÞ2qžâ¨o#…!“AÙ±QìîE¬™Ñj«]ÂÈÌä€J¶Õ[ê,Â^ɹϧ©ó«lE/<LEÜcA#8m°k×¹×#•9Èÿ4¼—FTe#Qo(ú‰:d¯jå³ yÔ[O°Щ£F:ž³kˆôÒ)PÁ;ŸuÉ­‘f¼”+ie]˜ûU‹N¥Ó¯‘d·¼Lžcs¤ØÕ …Ð]XƒÈFäl ÀyV%…FàšöW›Ioqcz× ÄÁŒ ¾i!O©¼À6†)XÀ.y#½?P«8ýF§Å~%”Ä]b,}º?½0²MÄ˯n1Nda¦ŒÆMj=mnº‘‘ñ±*s[žF"8nv¡ÚJ’îA—jlãýGUJĆŽäÀî/Œ¸Á¯ G׬çÅ42͸Ç5¨ÊiÀÜP3ÜÌHj óƒ·÷¨-cšjB±.@'zGàjÁРרÔðp{êx޳.°ÄdcnÔ)`rѰl•;üÑ%‚qÚŠu$gHÉ õÑÔõñ6³é¼;lÜâ³3~^. °¬zÎcÔ@s•Í+#ê;(;רŽâÉ©"0ª¤åøÚµŒWf{Ö˜¨Pd;öÅ+uq,b¡ÃGj ¤™ë&,ÓH5j\1;€i+¡)‰ŽAþtÒ)Uf,r[-š^Eyd1’çn*µWRT³ë%Kp¾r(rmýÎ Ïô§gé®±úŠªìÙØliI,¦ãÈϵªÕd=ÐA˜Œ}±@ œÐÌò®£’mñYbÀ¡E·"¼f!ÈbÙØÓ€„w6'R›Íb”¢ª GàRl­ênþ*•¥Ö™@ˆ¶<µ èZÏ3ñÛô™$ms Ý{ÓÒtá4@ŘØpiVžGu%ÙGúr)ä»ÒNd ×;#dî/ìÛ2qêtÙÚ€J÷ÈãíLÙ oeiƒLçæ•¿¹[‰’ ¨^BtÖ‘E ²ÅaWÀ¯d!PÙŠ$¤š¶l@+2ƒãNÕé‡ÐI$…Ü@À§.£hʡߓ·W»¸BUXœŠP6.xä,;‰ÉÓ®îå?•…ŽO¸€ýÍ/ÖÙº¬>¢ú²ÉœÒ1ŠítÇ€1žÕ'ñM‡©ZfÛIʰäS1åÀ~¢›30¡?9=V{ÙuÊü”p+¡è´ó³ãÚˆD½ü5Ô,$2¢æ.sß"ºOÃP„éªåHwbX0Áø®ŸØþ+N¤Ø‹]4ŸÖ­^Í–eÎ eÏŠ­cs ¶HLŒ7ýÝŒwÖ²Û?q•ntžÕž!o&uBqw5uɌؕ¥Ù©f)LŠUˆoñAšÂ9ƒ´r²±šòÀ:²Jžþ)ˆdÓ1GPG“RíM¬o]I$±öLS {ø¦¡¾õŠ(Y›HîôQîàIâÙCx=ª&ÒS$I?˜ÿÅR•”o¸@s¼é3±dP1õ)Þ¤õ[GÒ0«È=¨C«ÊÀ"¢ë#ÉÚ‹ÿ 7h^{¶ŸlèC……â6Æ¢Šúœõ³ã)¤³FÝè¯ëãe ¬1LÜXÍkr=8ó€ (Î ªO3#lˆWI#õ7ëý«¤1}ÁÒŠ1ibÎj ’Æç)?·—•å“N ɽ^迯z‹úýCU¥¸Ü=ïö¿z{:cæ¤o,S¢5­¼ŸÆH$`3 ÁÇÛ½~…áþ˜ª²k˜—\‚[Rö §ô¡‹8}Mîcûš§±ˆ¨È=‰®F|Ã#X„bSþ†Aˆ®ÝÈ Q®ÿÞCy,ñÊ¥€ÀÊž|WJG-$…¾ŠdA¨,€죕ßPÄŬqßÉr±*M.Ňš)âØc'’ 1 q©IÉØqšÓhUøldw5¶I›q\¼Q³*` äÑút÷RDMá]lpFaF…Öu%NëÈÅyr®¬­±À­½Tñ©«¯MmžK‘¸ ïŸ5.ü=Í ¤ÆU§j.m‡P×î8<ôµ¢;tø‰;`ì|Ñ/ÔrœñÜ•ûÒRjµ¾u¡äžE¼Ð¦ 1µœ°ÉQœç½uPIšÖ®ªuœx¢­ØPužÂ”E9'N;^¸:ãÖÁ.7¬ämß¶y¬¾¦” ²HúTqZNœàŒÖÄQ¼ˆ®Í{BfÛö‰Ïê®ÁtëJO"DÞÆ Gzêl¬ã]ûW³ôh}&ʦ±ÛM/ú…ŒñÇCS’Ké3°þ]©¥ê ÃN{’iÙ: `Y#*Ƥâ¥ÜYÜ[I…S*žG÷ñOÔ ÷7‡Îõ»QùÇÆI+¿4ƒY_¶3k.ÓMôø®í.ǩǩH÷Œf…€ã£¸Äo°ÔèmÄ냖# õŸ},±Ka’–!Tñæ½µŽFFõ92÷·#M±¹*¥A ‰PóÔ­‰#R{XuüJ%¥™AþõìV1œú—–ƒlaf‡sm ·¦‡QþDÔy[лuѨ;+*†¨Eó î[“¦®–e¼¶ ؇¡YZ: Äú° Î7¸„ÈÍ¥x4;YLê킬@$PnˆÊt×f$ÝZc·ñ@«?†ú;ÚK-ÄÅãJ•9Ø÷¥z=¢^MêJ‚#ž6'µuzO¢¨pIî!ÜR\ăRt±—r¨NýÈ®oñ=ËØºZG¼Îº˜ãéï]§£‚ ­Lë] >§¢PJN£ûò)ʬ u5ê~sŒ³—,FI©Ó;I;Èç,ç$×AÕº%Õ”ÍÆTäP¦Õ€*Aî1]œ,­ö9v`XŠ»c`‚Í Æ}FÎqüé>ŸÓ&º™Y—LjrKw®¦& 084¯':¯Ôx1l³•œM$ë ¨Ðx­NÆ'dÒ8ÁÒ6ÏÅWÇkÊaSþ§î>Õ:x©“Õ,¾HÞ¹ë”3_©ez ¶ÓßÜ%¬`Éfc°V?¶p i¥’Wð”th®Uº(#r9®¦YâVõVEìE?6gP8š’KD ”D#b }Ê÷ [¨´Põ,V1lóÞ®¨=£aÞ§õD¹)"¨yc9±*d{k1¤Ô=m~±£†MãBq·“LBY‚à79'·Š%ák¹pªžô«ÈòMC< SOÚ7â°º×X.€†ßšzÊ•EE þ®j|J®Æ4þ¬òiØ®t]!ÏŒR²ÄuØš³.ZA§=5VHŠÆUŒ€|Ô‹H’IÉ#IÎØ§YÚOùžÐt’j|‚ÛF.õª=â £bNw)'ËivbÙà}ûÓ·*ÑÇ™O·>Ñœ“KÞ¬rÄÏ!àäqŠò;ê ˆ@É,~™8b9ÐcѹiÅ#òDI¸?Si˜'VM3Æè9§.QC:up“ ꯸ßJ5䊅UŽ[“ŠÜÅËé´4£o̵íœqE/¹¯’dØÌØð;š ½IŸdÀ«>ŒNŒLHIØ Bê xq#B¹vçQ!·$go½ê £1œŸå_Fì±…Õ²€ ¶¦;ñ\à´×Œ‘ a±Æ â Óßo©ñó°ÿÍnFÀÃoCž\ZDŒÀ‡gÓä…P·dyf–Öex؇VÔ Z7ƒ­Ûzê‚)WÚàqŸŠæúŒÄÜ2†àãj­ø}1a!$ï'ø«2 øÃžààñxúØ[Í%ÊÂÊ}"p]8«ƒ¢Æwm¿Ò}Ñ$Ó)€VÛÚ«rNFÝüWÈÎáèj^mM\Ÿ”Q  wbw5¯BÞà<Ƭ>ycM¥‰àg#½fE €Š.æ¦ù 7p Ü‘qøQdFk[¥ì’óJY~¿KèÚæ0¶ªu<ŠÀç±]q 3¬o€N+ØoMˆ^|2V¾Cñ;ÿh’¦9™ÝÀÒÊÜv¦ÒBp„€ÜÔùlÂß ám*–àclSq(Æuožj,€zŒõ>žîdXe—A•´ næ„äC tÉÇ×²é“ É†`ã8?á*u»“Ú¼jÈ ølÉÕäºwCf$×§;œïŒ}먶I/‘¡†ÿj´dÁ V8=͘ÈVtmG›+äÓ «jeGfPßS6®©Áù[ë«laudàî+¼žOci7T­Ñ–îán]ŒaSø¤wÅ7ÃʾÝK®ç5i`ƒÊÀ¯úV³(×4ËÞ3>)«yDÊ'o Rk:Ç~do¤¶|w®Ð$“¨_âz£8úô»·#µl>àð(ý¥«ùu‚b·Ü‘Üöÿzê´#'b6Ûz‹Èò~6â°¨Hý?£GfŽ’çêÇÓö§¥]Lv''D.0Bû´sSúÍçåcDt"7\ê!›ÞÞâÜJ¹vÎÏjؽ±R©°ø¥æÒ•Ù¹ _ÖEö À€æŠÎlÎ1IFú$ØÎ{Qî™ ’ÜãÚ|×6·ÑÄ_hýÇs¾Ôx"õ¬µ/¾¡UÀÏS:š%* ’jh˜Í<¸´,¥51Þµõâ”!rj§Ä’)8*àÉ¥]vrØÕÛâ²ýO†s‡õ6*7 +e‰Q&¢ß“†á£‚ØßIÍ2Åe‹ Þß¶â’Ë]ù;ñM^«dZ#‹ˆ†Wþ¿ ×çšÊ1Rû×éF]½ŽÎÇŠâ?Z~¤ä._zÿšêÓòxÏöˆÉùp¸š3ª9¤B;«]u‹Îzl~³—bƒ%»æ¸Èâi'HÓ—` WWqué Hýª£½Uå-€Ì+dÜR‹íZ°ê[ ?©åIÜ}©K«ÖŸÛÀÆ ¤Ñ›MÆÿjXÇiL#IÔê-.àº$ÛÊ[ʈý©±wé’ –ÂçP®O¥4]ú·–?¤o–®:¯IA“<Ÿô¡¨s`¦¥ˆôÉbÚ7óëwÂQ⼄ÈÊ® / TÙ¯ì&b`ºD ÈÈù¬A!t‘õ)¤:²*82´±ë»+ã°ñA{èÕLm¹ãj_×–H‚Æ„öÎ(ÉÓÁa#¹ç4¾ ¿ª ?Tb&öQ^JÅ=É.ƒ¸¬Ê©è²ÈÁnrqµI½ëööêE¬>´°-²ó[9úı¨õÕÆQO«bäy¥!êÐÛDiã;×0Ïs<„Ï)•³Žßµ9f]11ßôýë¢+L²4 ¼ +Wš›®LŒ¶qÞœ¶’h.´·$(]+beþa zn¢t°Vn+¶„ëY[mH±èöŽÞ²»¶Û+EW·‰í€ º‘µsó8jÔ—#u†'=¾ yªÛàFù¬ª «}ëÐÄ9ÈÔ•&³žñ` »c<|Ò’Ü Á€O‰}m<Î Œ2ûÁ Šwew6য iµP{1¨ÂÁ qœq¿5ô8UöŒgúR‚°£ÑÖ}¿Þ´¶ÝReh” ðÄsüé¼äG6Ãõ”ÑýZZ¥Ý!¸ÕŒŸ4OBöaªI‚½؉EÖìȹÔNÕ¡T˜hˆ§mþ“ksm¦F'Æ‘šð\K!>”¯µbÞÛÓtf,Œ[¹¦äR‘ê$íæ…¸ƒ­ÆrK ?Ö/-´ÒGÿȘ¾U(7KG«Œw"¨Äáâ-õ|RfWŽáˆÃm“µyïS7 LÛjÇšjÊè#³) éÀ¦îÌwç8Æà #ˆØ¾>õz‘h‰®¡–ýÆ'ëqôùÈ“[z›!j4Û­ú\ÄfšÊVß@Üë½À¯xÍ0,N4çŒU ixV5Ó8`‹ŸüUh«Œ}{=ÎVNM¦õ:>ƒ?á»6W·¡ŸÉ8Ôß±à~ÕÒ–tÖŽ7pkóhä1Œ¦ã¸î*÷DF³×=˼o)ccÀóPæÂ£í{ÿYª·Ôê2Ñ[x©‰}*݈Û:{M‹ãŸŠú(fÈ ËTƒ]Æ wŠBp[óMÆÌFݳ½,ñ Ãöa_[ÈÏr®Ä`°¥Ì"Äfi°rÈc^+£ñCzìÍ‚¹9&ŽªŸOnGÅ ƒ@<¨'PÆNHÓÒÜ`Žæ…$ZŸ¼ÖFUŸƒCV!®a¶º‹L©«nG"¹Äh•&³f`‡±ÃŠêf»ŽÖ•ÕÀšæºŸS¸¹l¦# ÙwÏÞ©ÂH6!ãV½uÒzéyVÒôh—„í¬ø??5|rSP>9®{§ô÷¸+ytéo`Æÿz®gJVby9¦d¢ßX¬€^¡s(vl¸ÛŠNyÌŒpš|ñNG:OX QÅ ŠRW<ŽhV†·/õ*•Õ³ ÐW©{ÁçgP4ÔŬDNFƾ½†ÌÂÍ68ƳÅ{WDM¿Ìb;„»‚TΆ¥ÇÇ?ÓûTîžúàÛ3‰Š)ø'oïJX\Ii{ùw*¡ ç üŠk§£êòúl=$Ve#úéDV…OUNE利g}2§æ°]@TÁã=è–?4Hgawÿ5Ù æL 1•zuˆ»G·i#R8åH©·Ö7}>ëMÒ7ý/ú[í]'FSm+®]°|U›¤K»coq´L7 Ú¤|å[ö†V‰ÅÁ>p ]û1u«)©ïY¾è’X‰%IAwæ“õõÆjCmcoÔ·ävš‘S[H7ÇÅ55È”® ‘\æe.¿qÚ½ŠòäK¥ÕÈm á ± u£.Q u| < ^H^RÂ2K·5:;Ù‹êʧµlunGªÌúN+°:¡QßBHÊ~bM8ÁäÓ¨æ©ØÍ(ב: L8Å|dfbKv¨I'¸T!î‰ ¨(ñÞ’Ú¥ à<ŠdÜ…Mßr1¦§´Ƭñ¿Óp‘îa±¸‘dà ö©W+— •Ô w¯&¿ò‰e8;R«)i‰ÕT*‘YIõ«v¤c•ìfר—;¬ 6(¶Ó¸M*¹¹¬õ6õ-¢sõ+à½"¾ÿÌ¥ºu†Â›=`}lv«ŒÇÒÎGT~€Lvñ/ý5b&Ã0þµ&^äy ±Ÿ)8 æ‡<¨¨pIp(Œù\ÏŠø‡¥ žÕä“R«°?zHBÝAL«$Ó\zŒÅÃ’OsñYk¤€(gprÃ;Þ¼õã–í¦€ ÀœŽÔÿ§„"0ÃÝíL|Œµ(T%Ç´¢l„ê8P‹±G_R0y ŸñSú„Í \ Î1Í<ê÷0û¿„ û‡ÇÅ/Ôì$º¶Ñ ¤ê9ýU¸Ê†¦  G¸Ò”£+D±Æ‘ñóVíYÛŽ”ØÉ©é¢rKý†(-u;–b䪌b®elšõ £-ô’8µ/¿»œxªs˽Ÿ¨u‘€‡œÔ®‰oèÇù‚ cÀóUŒqÊêò f|RXxˆu¹%àDK#iîØ©×}@-¬Œ¥×S:¬‰¦@O#Í^ôø’uF¢0|v¦â+h9U¿E¶t 1lÆëïCçÍR•wWˆe[p{VÖ?N ²çlv¡¯¶,GŽõì­É¹MÃi¨í¬J©îPN7>(°ãÓÈVÀ9ÑJ[;ÄŒY°3YŠöFœéïÛµHQ‰2«•ã>¤Ó¨®ùíSïemn’¤ŒmFI ¼qŒê;8­õ"c‘=ÃÜ=Äv¤\E¹ìN1oŠZ,¡{ãÕ‹[¨o-DÅÂ2í¤ÍL¹‹24>˜ ¨‘šÊ"Æ1œ| í’¬³ŸÄܺ%gLlÌéYnD•2 [qÈ©¯zÑF@È&±ëmL8äP {¹¼½JîÎcE(e<ù¥}79¸oú)SÔfŠ!¢ŒR“u+œê üQ lz˜]W¸ËØ!“Ô qþœÖyóÒt0¤e¿º”ii[ÅfxåY9Á§Œm_cò­ýeÔ¶'ùÕ[UT‰Wb>õÉKypXáôŽÀW±^^ÆI›œá·‡ñ™‡qÃÈPzdÓàì@ßPb=Úð;Ôê®í¦a¥~ÔÔn[PsÀÚ’|r½Ç ¡†¡ç»Ôš õ×§ÿ Sô•foÝÈÿ•Ìà¨ÀéäƒAê†Ç}ÖßÿîcTãÂ5ÿ=Ird®¥N£ÐÚãUÅ©C»FOÕò*‡IéòÚôå¡W$»+åLY°žXk@÷÷ª‘rYˆb ÉøügÔ¿4ò™½Ú¼hËœ±ÆÀ}êìr+êv=êD5¬ÁbrºvÇfûÕHî!œ+¢@7ƒ\ÌöÆå³ ¸ÛàWT‘üVF¥W:²|PRfA¨òO0S65¹õ=¹ãÍ}™5ÜVµƒê<éñDW‘`Åi$&ÄêRÚÙsœµañ•IÝ1Þ½!†2ºŽvÇ¥ÆÃo¤Ñ™¼v¹ s}GzjK„@#”í2±ÜcO,ƒÒbS/“óµ)è¶ ‘ö¹ì„*ê'%¨°››F·“R 6Êò@æ²]A”ª¶=ªøùâÞÅù‰!Ô 'ý_ª¬ PŘºOOŠÜEùesÈf;š߆ºT¾ï˲1ðä lLK(¾ôÖTní“ØVœ¹TØc<Ñ>™mÿ‘[ødñœâœxća¨ Æô<«€#à à×Ä•}Ž8 bY¬÷0 šTDBq§ø¯tÆÈѸ֧rÈ42T®GaÜ×…°  ûšÝ«“îúDI››XÈÑîhW†GÏÅ'Êé­ÊOrû¶ûÕÆ8÷ „æ¤õ6xç°‰&—xñõ|šèxù‰ú1þò|‰ì@ÜFÉ”f 2sœç|П¦¼ñŒ¸ ¹ö¨Û÷¤ãüA Äì&Œ§7µR°ºIÌ‘-À#¨ÈþUk#,H ‰mý9Z)cÀn?ÜP§bc“ «·‘•%@@œb‚V4Jæ®0d+¶È¬U•ñ†=AêHã½t³ôòcÎÏíRîmÔÛ'ÍeSÔñÆOp=.ëò³c8W#Qñó]”.¦Q‘\3Ds±«ÝæSVºmÏ"‘å(eä! +©|0I5p#ÛC»ÖÅJñðx Á$­)vØóMÜ]» пńñÔëU ”ccšfÚéŒ&àƒî;PAí†PãIldíŠ+üÃâ£)A”beOê;ÔĽVk-qD]œé}þÔä7.°Ê«g jg[-q$Q‰ƒ"ä¶yûQâ¯rêLPŸ¬C¾h›]âæW]Ê.1ñWÊ$:¸>EshŠXr«þÕNã©ÚÙZG,Š} p¤ošfdæö£f3ô‰HÄŽH;þ+“üS ,°ÈÇ‚£&ÅÖJCD’“ö¤ú§_±ê¶Mm-¬™;‡8Øù£ñðæÇ1]D»©œõ³›{ȦÎB85u¤k‚8 ø®iã+$ãïTlntÇXÚº™’ň^‰·„•´ý«XîFô¤—ZçmK¥OhXã9ãŒV¥Œ£R¨Ó½jÊEsé½gÔW[j¢È·‚£¸ºÑ¸êüJOlG‚;ÕŽ—ÓL6„•>¤Ûé'JAèJÙ˜•UBp8ì+sõ™@*™@#ýê,œßê°Ó[—mÂÛû4²’7'ŠZÿ­[Z#‰‘ÎÙRýò*ÈÏ®C‰ÎGÞ—ê±áU°8$ JxÊ[ìnɹì׳߶›‡8펒’Ðͨ’N|Ö¢õbŒLxÉ Ô´9æR.@'ùš½T /Q;, ú$PʼnÒqÁïZCéK“±¯5úzuŒWÅBcP|ç5é]{”á)) ¦]-ŽÍAœ<žÕbÜy ,íi*«ca†çïEŸ1»°#:³È¥ß!§;÷6 ±’]„º¶#üÖå2¦¼m\ýÇ¥¹:Ùä'J †j„eZ5WÃj®sØÒŸê`ãÔšE¾o H>N£½S¹·OLjb0¸ì)'URFríóG…Búƒt”`¥Í)*äœüÑe•µT …e2À9îj…±¸$ÐÜX†zùfÓÜŠ§h=6  HOÓOÓZFfkeo‘ŠÆÌ Ñ˜­ø‘ýXÊç׿Pw'±vÑ- ‡ÓÓnå”ÓAËJl4ŠKy^£,‘=ü;q8Sñ²úc(Häx®™)"ÎqŽõÜ,R+iÉî*”Q]G¥7aÈÔLyžUR<‚ÍÊé…‹-ØoY[ï±æ…ugO8<Ñ0Ñ’Ç|Òˆ“ôa4Ç†Š»’õ—˜õb„%`Tçj0š‡:TŒæƒpÚ£P7Îýè77âaà óâ‘Ü4¤‚Yß;ÖqÞã— 2؆½‘=,&ì»Sà”<çy5¹‹+ß|ÒÁŠIœäâš«b¥¸üjBOsë›Ïã¤yî •vœ¸?ÔW ÝFíúÃÝ©!™ˆÒ|qŠéí'.ŠÌ4.'Н7ŠP"Ç[QËS ½•}L¦‘ x¡:•œé'-±Í,ÎêÌùßê=kWN-˜Éé¶9P¦fÔ?”($ÊÂñH[ ~ßæ§Ý/©¥¸#•5Ìë“Ô,%ßQ­«Î‡RÜ>î&ºKâÿ4›úëícÊÑõFGbW$¨?Ò©zrþJÎX#y%”(ÎxûTe–I¤S.2œ85Ðôû‚½b²#$sšnPT$ªÜ‰?Eü7›-åñRãt‹§çɪ’ÙÅ,æGß;ñ\í§V¸xãYÛ^µ äà×CktArí\|¡ƒ[Ê@¡bÕ%ªc;Šö]zÿ†ÃœŒs^‡W“Ø|kÙ†…‚å84s׸ÖWBOŸª¶uC2û¶Î)KVŽ]+’¢žOl£üb¿OU2T‚Q—Wù£ …+ŒW†LöÁù¬=À\ë:BòÞ+;3;„ÖV œ0íš!Ió±^õò×Én(º3îÉÍa熢ÒD“«£n¤`€*tø ¸d¹l‘ôŽÄv5Ñ#)‘ÀjŸÕ줻µÕn߯Œú‡Š%¨Õz4bèñ"c¶|ÇVê¼m¯„BgÕqŒóVìåäÚœT(Ѹ.´b¾øÉöžqEWÒ2’;Šià%ÒAžrÊÒÊq°Ó€1^¸‹Y™Õár¥;ŽGŠh— Å `ýA˜Î¶$/ÓýëØeiFGSŒ¸À4WsÆMêV-´ˆÃ 1†íûø¯mmã²1Ìóòƒí?N(ý\ª@K2ªl7;Ô~¹+Cuù”‰oŒœSÕKŽ3@¹Š©‘YY˜`|WL"Ù–9$*3Q`Y.®IÓB¯Ò¦ºÅ'Ñ À‚1½Q™Ž¢@¡nžÜj"‹%áüÄp'<öÅŒ„iç½|S–Q«ÍFH½Íþb½Q¶r&2H;W™¬®‘e ®HØŠýUi®6‘¼H™Lo°ÇS0æøìUƒ7› 21ƒôœÖ›Õ8Œ0Çc_^BˆèWeð+Õœ`aHæªÅÊû2‘´·‘Þ¾tYc!þžäù¯¤.¬›+Û¥Ó:ÌÓ}AìT˜²Ë "U>£Ç}«'Å;j‰é¼rie<)ïKËÓÁ0åqúóö­`¤î/î°°Ý~bA¨ðàqX–`º€98óŠAì܃·âƒ;©òÀ¹ñ^Lmu.P½ÌƱ͌ԧ$Žô¦¬0aÅ9cˆ˜lÚ¾hwÇI`‘Ú©4 €7(ZLZ ã Œf±v؇PÜ‚~ø¤ìn L6ÑëöïÏ5)^/:jüÒt¿…zœ·Á̈ª# 9®²0 r2kŽü3Aà€5oäÕ«×_§˜aUœ’ÎXg°©r¨l”± ¦êt%FïÚ¿9ê¶ñ§WºQŸù¤Šî¬/VöÉn6PFàž<× Ô$Žæòâæ À;;â—†ÕÈ„‹º™·™b:b;øcÍUÙì VF8ošçáRÄ1;çaV-Ñä(Рä‚7¢Ì¢P6#Aý'ÓŸßæŠ× pÃó¶(!Ý$"1’[o^4ÄË¡£Ôã`@ÂÔ¼njÆ^áb»g@æ‘»ê‡òídKÃdcjr9Uµ3.t³À¤nmí¤¹õ 1,}دc Ëì!2s>¦³ƒ¶|V ÈA@ç$÷4ÍôÈên@R f'qó]$6»ÔçMÒäAn£âŸ… íÜç¡XÌ#‹pyÞ©ÙÝ»H©I;¨ê6PÈÕÊPtæ’è äÂ÷ÓâƒÕ¿Ì3=‹ú»n±ýªõœe­RR¤Üä`ŠÙ':T‚ þT–,7#9žç²´QœœŽuÅWµéöýC¡½Â± 3¼6Úâ΂.”ÞÛ)õcÝÕXûyª}ÔØþÓ"éy"w+ã#oéM,­‹;šÙ œ¬ ÌqŒœs_Z.çÔÀ®ß£tˆlmQäMà »’>)» PZMtbL ØãšÆb> FüàµN~K¶*ÑìÀj<“-̙ͩhÁ'æ‘[”`NÏj^+”mE$FVçIÉ¢¯×Qœ‡S7l¢E.r8¥§*«Pî)Û»7Å*¶¥#ŠšÌ¥ÊgÜ3œÕ8èD¶¢s2 ¹×ÜÖûI"5ûPdoVV!q“Yô°|Õá¹szŸ’F,ÄœøÚ½ 1ôŠÎ0+ÕÈã“Gü@¿ÌÐŒó_c°äã½ ¯Ða€"Å7È­+pÜQĽxÐjào[Ëó3⠢ȸÆkÝr$&5c¾Ú»â¼ôÝA ÖBÈ8Ú·S6 „Œ,¨~3Š-Ú0Œd`Æœ†Û}™ƒ†°0›‚#©Ðþ˜Kk$8É…óúOþjÔa‹€SÁâ t?Uf–p±¨+¤²ÉÈØŠ½ Œ˜ ™ß;ÿŠâùB²'[Ǥ<Š=@ѶK®rFÔxY}5‘ˆÕÈp+èDrÃ*,lúgïLAÓc)‰dm=ÕN* Œ¾ãK ©¸äIÓ\d1Îx5¦ W¾áß„¶[y¥ôbœ`êÎhÑ\LÇK¨äTÌ7©ëÖ§…/Œq^´Š˜Ûlm_LÑh8?m«ì e+愊îgpRÌeB *Yw œoâ—y$Œ€0K ðs[$Á#dªƒÎkÊ„1…AgÅ4 F§¯$‚Íý%`6ÔvcAŽæ;‰ã•tú™\ ‘«Èãìùv£“ØüV}@Xè±lîzhaÔnGðÙ~ v5‘8Žâ8Xõ>¢£a¶y­ÛäBºdmš•Y7&6ÊüÒ€,}@4­4îÃÔ™*{ÀþTk;v <–ê%o¨ù¯P ‰„z€-À¦eÊÆQ[ý^+YÍTÑ­L—‰HH"]}Û ̧TŠÀw¡ímóóޅ볜€Þ°/±qÕ%ÐïŸ7ªÈÎÅ;Œ’®}ÙÈÞµ9fQ¦ åˆ|cæ³Ì:€¹»ŽÂÎ[©0UÔB “SúOâDêo K)QÚ²?ù§îfôÁ‰t–aŒŸ¾h=&Â;(ÓŒ"t‚6Ïš©~?Œ–õÜùX:‰uë—¶€È…LÁ5*߯]LBtûoo˜¥v °ÜU$fôc,0à{¨×6 ?ªÃy9¥ËÎ’6óT&@ý ¡kÜn ¥àÑf¶‚ìj‡¸{÷©ëƒ¹ÎÀUþ3¯fO‘Ysúp29¯½@Û‚*Èé6’#U»¨ÉÑbCªY ÿv1ýê¿êOð4çÙIà$6Ä÷ÇÅtbÖÖ1ì¶\Žï¾hÄ…J¨Ûô¨Éô5ñÅÙœóô½X%ØgþŠõ,š^Ï&ºOË—ORbtcŽçíIÜB²þÔÈ'F3âPl 7Õ¢õ0É5äÉ-ÌM™:r7ÅîÕÔ¨R©+G¨A¦.ňGð`…íü ™Ø€qÞ˜²êM<ž…ÀD${N0 ¡Šeµ+ëÚ–—\.@r|u+hÉX6§Qv Fš¶ß|k]B–¶ÖÁŽAlšE’;Ë3'µÏŸ¨+žëfæ#ˆ¤6Å’MD­…>+vÍ20”8 Šúxä]ýKšaI¥ÒAÎ0››uÔÕÃFÊŽhK´ªb‹ŽÛï_1k˜´j ØØ ðÏ,”{›ü JÔ¡Êv½Am®d #Q¤œïžçæ­<Å”zIÈ®2)®äì¦×ª\dž/æ±î(ãö'DŒ%Π@ù×Ò°±LjÒtä÷©3¨=ÓK ÚK‘§cY¼šâÍ´˜½HØe\càÔä|aWæyi+ȳ4«’X¶?üÑ „C™–B%O³0·GmÜŒœ|×Ù#P-€{Ö1$™n+ãkž{“·sÊx$PæÐ°ÿu5±(õt`“Y›@Œ™?‘¯ ±5•%¹ þ²À€0Õgt—^œÁ¾ôÄw‡ÓÒ}Úˆ]¿M1—Ü.7Ô-Ã%ÜçWzÎP`>£Î<Ð.¥]8vúv¡Ù±”«‘«¬[ŒãõÜõÛLŒÍÒÇ'=xa}ZÑYHß"™™$'`çzöàé#WÈïL¢Ëj.'m8em@î@澎D9Rt6vÈ ^õ[;'u‘µÈ¼Æ›ŸüT5üR$¸Ó5®ˆ[ée9eûù¦ ,ÃB *€“hìNûVf×0 ê8Ü)`2>ôœ7QÉ¡’]q¾@*s^‹’ÓHp6Ð*w0}¤[ÞŸÔ:“¬× ‘'¨Xœdÿzk©Ø‰zµÕÁR±ú˜Õݱ¶ßʪƱÉ4LOµ\0Oq¾MH»¼ye,ruo“LùêœïGüÅßRÔ‘™äïâ»Äd’1†jѺn‹q&Ï'ÍWYßvßS³¸v¡Z‡·u‰‰!¼f½g%Cc;sKÄÑÊËœ’£šgZ<1“°ÆFEL{˜n-,ê˾Tf¥]ÎŽ\;æ©ÎêX…PEJ¼±õA'+Š5ã{J'r\÷-’Ø$v¯£t]³“Û4+…xÛ 2x¬Jš£  ;v«Ô Ž$£úãûp£Á¯ƒÚÒváå;ð´òᇸdx¬#‰ÔØž÷óØgƒ^‚RXï^ÜÂÙ²rp)u™DYŽsM b “¯¦‘dÈÏ•2c8š~é ¤dƒ¶@„¨Ñ‚V¨B*A•Hbfí§(ǨXŒìki$"¶sý*?óܳŽî£=´ $Œ•€\íœø¯&Ÿó–à¢ieú€àÒÑâI<úáF˜ÓíXÄÖæÐî' ³¶ÆÆªÛ+,l¹*Ì69¥×1Ep| nÚæ9Ø„>áÊžjl¬ÄMz®’CqÉÞ¾(†“ü©y?ùŽ©¨¨G€ïE»aRP°ØŠš¶î e ï¤Å/<¨!Ô@RGvÀìòŒ`j=óæ¤ßªûfׯÚMU‹#¸,Ô.kÔ tÇ€;Ÿ5“cŸŠÝ­³MÓoˆ— y?þ+åg;c'ÍS«¡Y†‚@ªB€3Þž¶‘¡ib1Á©nmâeõî4œçJ®I¦MÄnò¢BÄ﫽_pì{ÇGê¦æ ÒfA¶¶?Wþj‘αü»× dom-ä–t ïïU?£Æk¢è]~ªŠ’K…èO?qI+ÊÈÝHÝhêW• ȺTàšd*²è üóZ+­=­Û½cK*ûr~ôŽŒ_+Ÿ:äç?µEüU“¢È!BÙ œ٪ȤfF'~Ù¡Ò)WŒ…aZÚ¢&®Œüí,//`hà‚C¨c$iÌÔž©Ño:‰Ø‘uLà|f¿ZH#ÉÞ¢~(Šâ.—%Ü(ºÐi÷ DFø§âò\ чó78þ“Ô äÇyº(ù¥ï=33˜›Rp3Î)T’D—Q8b}ǧT®q½VT+ò¬²î(!BºÔƒÅ âe÷¯^9ˆF#>)ë a5«›‹˜•”JÍ¥±ˆó¾Ôë]ÄŸÄ”Ê3Œ`ù¡²y¦å„†öƒ€([pi€Á+Z0!XŠ2J£f׊ñ^ɯ=ÏGQ˜°ù˜HÇ}êxž[|„ ~y¡µýËŸù˜ûYÀ“©¼À”ä‰8Ó½F‘Ǩ¨ÅGYå׬»1ù4лw^ßµyÌ!%·¨>Õ-Ÿ„l€xªs vgAé©–é¯Z‘¸Z1Ñ,ØmK!n®/’;m,PcšíÀE¤ÊÞ«ŽÇ€;×çW("#±Þžé=vç§N§S½¿çäx5Ïò|gÊ9!ÿŸÌ³~‰Ÿ¡#¨B0ÀW¬}Hð„Œâ–µ¸Žæ–ŒƒL† ¹5óì š÷, v'Ñ%ŸÜW‡RÈÇVGlÖbÖÄ•lưò…Êd4ƒ}#šõ›ÑžÈC6Ãï_Dáuå²IØßjøä¶ç·z£ú™f] l;“D6*ª‚¼s,N}6.P3ÏíRâË`±ÚI— î#õ|Õ6Ôje÷ƒôŽô´W–O;DÊ À Œâ¬Ä(Q[  :•œ‰HØwÜôš}c €ÄnJðGš‘ÿ¶žbÈŠœêZ¯j¡ JF’¸'Í+(P‡BjSˆB€‡$7Å[y¦Ð±N!ÔN>¡àV™ííXų́€éÖN*Vü@ k,1Æ äo½‹;}Yaê3'\õ¤·FDnàwÊçbv®&ôäY@©ÔóLÏÕ/'s1ºucÙ=¢¬ÉᆠºžûVê––VÄÝg^}±îcþÕµ%ìq,m̰ õGþ |Š“8õrdbìy,wþtN™aw ìw°W»˜wðjŒ^>$C˸§g±]N®+¨}!0 ‡ÒO4)ïØŽs±À ÍK’Ý#dHµ´rF ý'ý5ÓZ~K•ŽZvsœþ È1âÙþÒ€Õ@Å,í$’A$üƒ–>kW÷£>‚ý+±5FH¤)¦?hàš%¼L^áÆäIW ÖgŽàímÑõ1Ëdàšö×§\‰Ž°4–ç=©áygºPBñ¶õåÇPL£¡ÕûqEÏ!:(Ïn:t u3.ä ΘãÒðŸi94ˆ¼–9‹³eF>(×´õ€}"½ñ¶¬Ï}Îs¯õ#­bC†-–ÇaK¤ã@~ãÍI¾¸Y.åmÉ-¾h±ÎZ ïŠî.’ü–æt1¨šV7öž~+Àp¸÷¨PÝÏhÄÄÛ©{¸³,Ь±Œ\ý¨ •þ%á£0Ï4l ›æ©ÙÜ9%`ݳޠ­Ï» pù§íçBÏšFlv:Œå7€©[94\>¦ÙÇ“Í 0ªU€œ××ѰZçÙSFoQw}(KŽI£+ã|žjœ Ýá“*7ßcQî:{ÛgÖwGaÚ¶Õ§®å¹ÖÌÌØlOcZ5!ÕžÀÔøº\æÔ]4« /Ã1Ù¾Õìr´o¦ßH»7-AÅOFüÇ®Ò-Q†ÁíñH-Ôq ±`Ùú|×­æd†CÈTl­-­}òù\ã­ÒÏr>¢-9%Š+i?V ºqíeoµtÞÚÊ4\ ‚4öùØÖ&êío,‰*¶à`¯zÀhÌŸøzV~­6FþŽsûÕédÂd¿ Ô·4wSÝMgÎôü£R‘«9ïPù;Ëþ’Œ*Y„·ЀP`m€kÓA‹³œã:[µ'TF;ô΄Hœ¸;ýªbH0̓ž|¶”Rwâ—iUB’¤ÛmüÑÌÈêc#ñSo%ÃzZI×ÁÏÍSlÕJSñ u ðz³Æ®XG„SççT`Ø”}¼?UºEq!µYK÷ŒŸçG^—lcö[zD¨Ÿßšè6\|E#82<¢fº’6X\‚>’ß=«3óK$zõ½Wé—Î?êøïU幊ZÞé»/l9®Zêm.Ë`£Çhð·3½~$ùGÇ®áÕò$aœq𰣍Õ냭BÍ$¾„ꄸfÿ«ýêQ¶´Y‹‡“iZj¾È>¢Šr:‚\ 9=©K¹ ˆô7<⪣Ú% rGw~• i=ᣳ¶'Œ²–#ùšbµ‰­ˆWꇊçT‹ Ü>M{¤ÓÈú¢rçA†úe&6Ž8ʑӶ“M©ôHØáv¶ZÜÐW«ƒt¹f*`*¥}­! ¿ï^tò–ýRÕš@Î%]g½ ª˜áh/@9R ùçHXÿãV²¶5j_åµÐBhôÈ*íPˆä*§NNàw§’R":‰Æ9©$ë÷)gœÑá¾"ÛS/ÒHÅqê-–ã¶–Fì÷¡ÜÉë0\äIǤ·i.t壷¸êÛ€GqLã¹â´.mΧÒFTÐ&ŽXNc9;Ó !`ÆGÖò®ÙÉøˆÏ.¤I¦wÈ}›Á¦úd̰°ðÙ¦d´[–u)ºðE-ko-½ÁÆUÆÄv5ëa…J 8‘pFŠZüÝ G’hŒÿñL@ÓšúM+úNMx1⸬áý…¤)Ös«<Ð ¸8®³©ôÈ®ãÈ:dÆÍþõ*;^›Ó¡~òO7é¶aÿí7ûUi“—óÕLþ´“þ&˜Æ~¯FöTk÷´·e3FCÈ<ýÅEŸ®Ü›”’5H3”Š!…3æ•èó~_ª4óHdi‰ ÍäïDq’ ÄK¾§[l‰š]-íLnÀîÛvýé_Jœ2Û!å‰&™.«  æC¨ÿй‹9ÀÆ>jÆxPâ%ŠÝB‚vÛâ·£¬dÍ7otŽ`‚AÛ4 ûs­U?î#ÇÅP˜¹69½5nNjŒ/%Ì`ÀÀöâ³4l '’j‚Ûˆ½±9ù­r'®ÛˆÔ±Øù¥oeÂ@8ù§ç÷F¶ãŸšya¤w¤¨äÛš$£7¬Å§cƪñss6õ¿LW:ÈÈšP³‘XJªÚsW‡[ãèÅâ˜é>À ¦í¤Œ‘ûf§ªãö¢D4‚$*k("|Ëê@8ûÔû*#ÆçŠÔSé5ýóÚ“,Í!.@Ôk(Å3SçÀÁ©y#õnÇŸ4Ëû v=ÍIÚtÿ*z˜¶¢7ž?DƒƒBS¹8æ¨ýtþ ÛÉíA{nJ‘ŽÔÅqÑ“63v:ƒVÔ0hÖ#K³A[wÏ8§m`ÐÚ˜dP» …‰O+) …Šàø¤î&*ŽÀéÛœR¬ŒíØx©RXô¢F0Ä䊟¶©^W¥¸{ffA¤ý꽨ҙ~~õÄê gWÔˆ  aº‚§ë}",nÀã#5 5êRAò)›¹ƒ€ªŸšö c‰¥=—nõ¸Ç˜#>é²Þ,ú"sï`1Îk£ë $VM4l OÓäRÚ#|·:º‚øj»u²³hÈ~õ“ £QªZœKu %lú`yßšPÇwrŠ=««Jjî~zrþÖN˜d2ÍÊcíOþ³•î[©\DÒ·–ÎÞMtNDÇŒä_í'ýD)7OéÉecèLAÊá‹ ‰ïS&ü,ÆRö÷h¨çØ®GÆÕRÉÛ#y °2jÁ(ãnõÁ\Ù–¹QYÌÿô€’v’먎IþOûU;>oÓÔ•Q©HÁs–þuO*@÷Vâ UÔnÍôíÅ4ù2}XêxbQ±¼¸gfB5z‡Bõdƒ¨µÚ…VS„ïœsT®¤ô%‚·Õ«CêV¶òÚzцԊ7ÎÀø«ðÒUt`°¹Òþü^—8·ê…bŸ…˜ +ýüêä "sŒŒšüz"q¥ÆEu†¿Ü[H–SŸZ!WQÁOßÅ?"+u'|>ÖudLeS€84feúK(j7☮Èói±DRwûã.óñ ”;¿Û¤ãû@ÍêWêSÚ(h£?4…ïV·»é“Eܪ©<ÿ饟±‚u9ÛÞ ©½Û™ úñÁ?¨Të›f³œÆpê~—fiic¸’g™½Å‰'Í´é4b “…'Øçôö®ê P+ûÉ•·Fy¯9WÍ(Õ¹£:ÞVˆú€ã¾ÿjúå“ó-ØÒç‚|ý¨‚‹„^…Ç¢Mmzˆùª–I?P•a´„ÈxÏeûš áÛXYe»a9;é Ÿó]}“ ±¢Å ŒiQŒ×7ÉòF穪ȊCøfkiRcx † ¥W ÷ªåÜ@Ú˜“«c…z÷J0Äe”בÅvð3€±®S6L§í¹¨ î|ë'!÷=³Rî`“Ö9VÁ¦.Œ–Äc%z õ)•ˆ¿"ŸXmeCa€¯ÞæEr̵^·sê?¦˜ ÊÞ“Žp@ìhÎr=@2A¶`†FíÍ/7PÔ¢Œ»UßÊa]]†ÿÚ––ÞÙ#‘¢L2ÏšÔ̤ì\üN÷¥Hoå"&)'»aK‹vRÊ¡µu)xÞ± >­t XŽ}CvÓ5Ô\ï¥"$â^ç<ˆÊF¡ŽÔÜaÕp3¼'(þ¢²&‰LsϪ6g•€Ôu :5a†9Ån2Ë ÁØžkȯd ¤Cæž·¸ŠgUd ¶)LÌ=GÍKpR Óß½;oÔ•ÀÉù™l#”BN|R_ž)p75øœQî«pºƒ*6œ®r$ÕÙ”a¸#<šbÖA4 ¾ÐF7¡† ;‚I íS~›Y¢1gŒ:¶rq“ûQp]IßJö¤l¶q¹ä¢;vóHÍ¡tvßzð À " ùÜ£ˆª’‚r?Í#}Ij̉€ƒ';ÕkˆJ£HÝÈ Ã" G3¡ôä§|U èˆ,  OÃQÃ,¶§Ø³Aÿ¨âº™2ÃObµH¡#òñ<ú‡sVàu$c}±ŽÂ‘ä_˜•cÆQ.mÙ$$#ôÐïc•Ò5@X’vÍ;j€9ÒkÙˆÉ,ƒõŒT!Èh¾d4‹ z‘ÉL¿Ò¶ðn®ø$ñšsž0ó‘«šÀØrÅFØÚ© gQÁ÷ÏŒ* lŒçÁíJËt‘@Ï4˜*=ª¿¨ø­¡‚#êJBÆK1Çÿš‘Õ.RúT0HcŒ9æªÅ“W©™²|`×p¶3ݽð,çÜriÎû ŠÃ¨¼hoœŠÖÜ‘ÅýíÚöOÉ![p}¹;š0ÎÛ"á\ÍʼãŠ%„ÅSSœo@–\‚çj W A8ošh[Zˆs¸^£p³G$cŽÂ½éÄ[˜IÃÅôŸƒJÍ»ƒžy¥ͼÚ×±þtdãe(á§SÓº„¶R¶_¶Ç=¾k§ŠtXŠ’4ò;× Ta³©Xm½:½Rk{k]'+áþEs³xüÈ#¹Ò;^S¦™t’ù>;U) ÛzŠýzÆÞé-%}H·ã'µTIŠeæ§8È‘'çf¡›µxƒ¾àŠÂ0bFr{× ‚tö¥CÉ&JÈ6<é>¢n3÷¥PdiÛcÍ1—CŽGzô<)§N“°ìk. Üññ^³‚k!Êœr½«f‰èU칩Ýg¦ ËVô×3&Y;gâž–3#)W+¥²qú¾+LD[ƒFº6 ›Ÿž± ‘$d0å{½7ÒⱺÉ9dHˆ:G,jïXéPõÓDV;Œ}_¥þÿï\£Ã5œÅ\4N¼Õ¢h0 >çYxÊ·*öîÍ\†Ç÷¡+&¥“=ñQú/Qw¸k9_Q››7cã÷®–Ú3¤!lwEàÔfÞ¤;}aò2 ;U$ᙽû…ð)Vc˜NsØVÉô•Xê’mbÔ­(W·“@ÎGî+)Æ0NIšž×MGdoR&ê—,ò¸ýé:U 2ÕÔ°Å6ªF7ߊŸ=ðXÛé>1S Šü¹ÔyÞ°J2P–ûíT& î7—zd©* yå÷¡ù¢’ÃlæVá‘@X36†ÈðkOŽK]Âá50ÐKcЏÆP}G9Ú½dbÞ«1Æ3ö¬FpŰ ȪŽ3Íøš ±M$ÿQDkXåQŒ_žkã2úy gŠ*i]ÏÇjYÉúî kw„¨vø ´ŠFà{yÚšŒëflÆ+%!M9òkA­ß \چΣ#ïíD‘½1à|w¥Æs“šb‹‚I„b4ãõgj5¹+Í&BÚ²@ùïN[« 1Žõ¯UŽÉȺb,£r3ŠPZÚÎAhòÝýئ†¦R'PÆ)‹ôµT(;ÂÐcèFä*Ú3"ÛÚ:¤@j#}óŠÉBw=øÅOµg•‹6Y‰Þ­ZFth,ǽfO§pqž{Eíížæ`3ŽMY=5 °V$8Õ¼vÉ©ˆ Ý©ƒs™!m!ßp dãÏÅsòçf?_QÀ©®•Óÿ%IõêlSòÉ¥[Nu1î;Pu0*I$|ã½™Š0…uå¼W9سriº“/,ÒöXÄ£ÀwªVi¸RŒ4ˆ'Š j §À­J‚%OQ”ƒîûš&bÊç€R‹‰êØœÅ#$ÒI}ìŽÔì«¥†A;w¡J°1¸is»0Û)J@&aîb1#B¿ |WŒÐ.†.FyÆÔQ!]`VµV!}ß§ŠÑw›œ÷âHÁnžÁt‘>ž|þÕ3­^cŽÒ"usãÇaLu¾¥ÇTEA”¶úwý]ÍB¼êÊÆ3—'vñ]ïq[îLÇŠ±º¸å´­&9ÈäxªqíØ÷©]ïä¶ ËwÏt²“¤0?æ·1âô#ð±t³ S`‡88ø¢¨)‚2ï^KN$`<èÆã*IÀã5#5{Œƒžë† Og#Š}ÁX#±UÉXD 3^7â’i‘³BU=³‘LÄÆà“ª2l9e$©sµ s<ë ®WØ(æž‚Úk©}"€îG$WWÒºm¥„Ac‘†YÈ÷Š7ËÆ+@\›aøb(ÀkÆ?úÐ?Þ¯EŠ-0 ¶{VˆÎªº†ÆƒêK)8àw5ÈÍÜI›‘B­Ë7uж¶Ùx¿L±m<ø¡J¥ÆxûPÝÍ+tËù­Cå#Í-è‰õG¦ÀòÍN]Æ#Ѥméã'îi$c®w¢^È„â-t&ÔHÇ„©üFWÉ|Wt U:\~¾àxù¥Ç¨ŒP©Ïô#âˆÔ d)Y Å/,Þ”`„ÕToLƒÐØÒ$å·ýê¤6,ÏzÔ—$Í;æR[=‡˜ôCE¸ö‘ÅfkMkC•øÓúdëpHQ¸ÜSPÃ=ÂêHŽžäœ }zu²1s]ŽF£·ò¦õHηjKe„5Cî z|Šró*ø 3A˜i” |ýÅS™‰,{x©²Dº² ÔNâ…žá‘]L¿$’NM3lH‚7 É!Fýª„ÅlµÇîb»ŒoXÌ*c7 A&B@Æw¤.å·pÞˆÔÊw mJÉê]åarÅN<î~~h(L^Üx"1Vïq?6ÿhKyO¬ €Ú›,dÔ¹ÅJ´~ª7³Çƒ_Õ 8ÀÜ Öf0!·7jüAŽ‘0OÜÕe%†‚tâ¦DÐwnI¦d¸Ó¨Ó[cp§qKqÈÌ™»_Mq°¹®’ ª¼z—*3œâ¸k«¹îœ+{Gúk§µ¼Ž P×2åQÓIòp·ù™‰&Sq‡Ô~'{Ôm¬›TŽuvE9&¤Üuɯ¢Uü½¹: Ö>sþ)i Á÷a½¹oš^?ŠçrØÔ§ܽ^<¶"ˆ1 ƒûšr{]‘©¤ú"Éž­;8ªraÒ7¬pèt'–È“æky¦¹SÈ#j5µá•þ?O‘^Í ŽáQsóCx4É‚¥[³y¯¬#Ê™p߈ ˜ã´ŒíFK„–-N3¨qñ\ÔŸ˜“ØÒ¹P=ÃQÆMdA2¦˜åd°Æ‘ý2×pØþÓ¡™ŒÉ€þšÇ¹ÇŠBîIfmäÔçqœŠçæžå$hZFÀ99ÍOkûðÅ’y"8ö1«1x‚»“¶B=KÖß™õ'-$Geaµ !•lànAýªU·R¾YHsùrj…µÃ’•Y¸ÜïU|l¢‰‰99J–0E4Œ¾™' ó²ù¯.“0ÁÕ£`1çÿEÒéà$äoß÷¬›† ÊUÉÁðM%”Ü%2 ÁŠìq‘N¤:†T78¤oÂ%ùtË#{²|÷¦íçÕñT°4˜§dBzk‚÷´¨Ã=¿Í´¦¢ì(ÈBƒØV ¸Z‚;ŠZDPrhÊU,1µÒšSí¿•9uî%ú˜}†Í^ÚÙO|åb\Ë?oЮ'@îÊ£Æw«]&ÔÚÂËT}9óKËäª/ÔÙ˜˜‹·Ru¿Ok(Ê1Õ‘¶|Òr{'hÜà ÿ¥^Á–F$d …s÷jPÌ’Á(7¥bbìnP©>úå®îÚfäàà …t}«OB;åa,϶Ÿù©&þv²´Hÿ¬“Þÿ×aMؼ— LçÖß}c9ª3qÑ’&Þîvbeuƒ|ò+hÅN£Þ¸åžï¥±k6õ äÁ&á~ÕJÏñM¥ÆRlÁ!ÿVà~õͪ×bT®£:)úµ’¸Ô5l4Œæ¼vÁ±ê\¬D„›f¢õ)–òÀÇS(`ÊsµNÿ‡Ã M-É%=¹¡LjWíÜiÔìÚTôĨACÃ)È5ä7Ì GO s\=•Ô–i"Æî žÇU[^dÀçä#ìy¯>.Œ_™oªuQ ";dg÷mæ¹{®£w,š$¸} í†À«76·rWøŒ\Sn¦Ô ¦0ëŽh°ž"ªª $õ£@Rå—?ébik»¹æŒ$¯êéúK ÇïLO4j¬Þ¤Jä’;š§“ÜKêh9J°;cµw~ º+ßΪe‚2²cõ0ãùí\Jè#g#’y¬Û§ÜZÇ–YÝX`ñŽÅL+–õÿ Yj;_pY ;úg@1MzkpN¬cNvìMHº¶xVFU/‘¸:ÆŒÚFîý1é'»<Œì) ,dÛqñÚŒmÐ>´û×ɥ崖ک¥Q©B­ ˜…¸|îHÜÖäHÙr¹:¸ö„;)Ý»Šõ ‰[ Ùœ‡sj.¶ÌQ»+¾ÔrF@þ•Y :3†|WcG”nûŸá—{›BN»¯§Œ–Í-–ÿù;B ÚšÒË HQSmÜòhr[k8*C‘ÕEÌ@#ÜRONd zcœfİh* Zã 0ÛïCêoÍi„“ó=tmY'aÛ46™³¤Ï“0]³ŸŠóW¦=Fð<ÑÔÎá@ª=D ÄlÚ¹ãm7®"(K“üë©gY»0G~ihš2u*÷ƪ~,¥Ô[âùX›±éžœ5Æ£»6*´ ¤zWÜýé/ͤh}ØùÍ*ZN¥#ZG1¶ ćõÀ©™[%–:”1\b€þÑ›þ³ùtÄL¯&qð¿ï[ü/›«É§‹¸ÉòjÿGê? =³¤ûÓÜò®Ÿð²zF¶PI3ƒÎßï[q§ŽJ¹:d.û—t`2° ¶¬ð±ô·šVcªPBƒŠÛ¡çÜÃécÎÕÆ#ó)êjb€4®rqíµHfPº*}¸«krJ»{í_àò)Ûb¾˜|g|f“‘A×q¬‰bmh¬7ÏŠUZ+a™ J¯-^Ív¨ÚCã¾â¦ÌéêúœïÞ·™ž÷JHžtcÜvªêúw’Igw&¤ÙC'Q¹®79gÿJ×W ªE¢8}¨ƒêkÙ\ ã[3\ƒ ÄäñGUgãHòk Ü žÄÖв䓪"n Áë!ôÛÍxªº³Œ^° &O?Ú´á05þ´Bz/{’#0ÃûT×öíŒÕIÝ=ëÙŠÿJBDõ—Ú1àhÂN ]´¨lö¬K"ˆà‘ƒ¿q^„ `äÚ$g:Øž•?F@\AžwM¸ ¼ Šª²zˆÙOƒ@™Ó:6=¨ÔÑ›#R/{¶*– ±´²Úÿòj†&?ÿ[ì;׋i­‘ê $ÒßÀŒ¤o'àRÏ$êÓÏ!i$l³æ«bœÖ¢³_Ë,¸fõ$9fcçæˆ‘Å2·¬ºƒþ .#dŸîyðƒøS(mÊœ-TÔ’‰Ù’nà[ ¥+–R5.®Õ¸z½Ã;$ó3#†x5í¾™cÓ*e†ÄšÓ[CŒ˜€>hÉ^˜\$Æãì§P³Ë¬Äùåqüª‡M™m½˜¾…ÈU^XÒPZ5áŽ8H“© <Ó«­Ò8Ø$H4¢ŸOÉ©ò#‰•)«&7w×ç¹ON%§ÁË:™&©§bçþ£šõ Ž4ÔîI( $1ê]X4)ôêiq[“æR'`6ñ]—@ê1ÛþIf9ç}‡õ®D—9’)þµÕ"¼!² ‘.ì4…Éû v|_2ª¿2p„´_¨õ ‹û׺›· ÙG`)OÌÛ¨¯–lV½!)KlªUBŠQ%˜™_¤_ÈúÚR- êv'qà“Um/â½c†QÒyÎõ )}6í‹Ý3×'åÅ&Œêu«|ŠI¯öŽùŠýgG{dÑ­šÕ$œéƒ0³aîaoôŸ˜Vkk,C3r)[Iæ³’+»lçÄR2­äM\”’&šÌúã?Tgüšåd@õ:ÌN"š†¢EY²™f±–5%HÜThL¬¼2ñóUz{“òà{Jd“敜X›epJ¸ß¸¦ú[h¸Õ3eQvÉ I êvŠU|y¥ÚgL£/<E\Ö “ºJȳF@'5ë£Å .fÔFø;VúuÓ§Nfi7\ãâ‰Õ"!Æ$#ÅJ¡ñ1® W¹í ÆÁ¼ïX‘ÚÝl8àø¦$´¸´¹dŽ6tÏÔ8ÅêÌÇ ´ûgsžEZkw=ro¯·¨ºøÆkÁq¢ã>{T§ Ùß:“©[Ýžâž´ë0Ë,isXζs§æ¬8>¼—qkäÜL·£º¨ØÞ¬Eo¥5¥¼óRÛ¦½´€1×I ÜØŠv9H_L>¼vzåæßé2ñ¾¡Ø0u#ŽäVocö“ ]!r7Á­ÆòGÔ –m¾)>«3tëÉfŸ4¼wÌ1¿+Ä^L¨ÎyÅ1J¹Ûéîv¬h”šõVI±•cö®™:‡Ýî÷äkèÑb›Jž795ô67deQFFN1[6¦efNs÷©Ø­ÌÑžÜÜ»[?¢u¯É®ÙÄ¥˜yÉ?5Ý~VâyaŠÝs—þ#öQRúïá‹,·VŠ©âÝŽäyªü<˜ñØ'¹'“’Øõ&t)KuEvܤnu~ÕF÷¤Cugë©Ìo ÷©}üäça³`üªëœlNr þ*Œä«‚ bPqx´ôUSý*x—SX^þb<‘pëäŠÓ<®Åœs^O J¢@ÃRöÏ4w¸öQÇRäWÑ]À®p5ⓞ5·»Ð’…i"‘´ÌÉÎx4­ëO%âÜ áxø \c–ŒF¥ÉïÓ†ud#ÞÈ7oØÕPè¤g8Û5ÚïÔòc;Uxœ€<(¥=FŠ©ò•ŽTi}ŽjMÕúôûÙ"PJz¥s"ÄÙ;ƒ¸®c¨Ië_JçÎíGŒr;˜t&º¥òÝ¢ª®Ns“S´]Èy¢IÞ²AÅV (¡ÛÜùU}2=E'+ØYÀÈÕ¨ gš S«#Šb̬r˜ ‡ò4g¨ Û©»‹R%Upí€;ƒWmàŠT{FûŸ5ÖO^åî‰ÂDzžæžŽie`¨=º·8Þ¥ËgRœdw®'°¤BÌu®à ú  "êo§&BT`Ô—ê?÷‚‘t’«Œ|) ¢+úNÕP¦…ôË @îO4 ZÇïFPû‰‰UcÛaâ˜[Ö‚Ù™AÒ;Rw8WFƲ·H«.ÇÅ7ãä"_ñŒ’úÁÃg9jŒ‡ÿ”t¹Ÿÿ˜wûóAüœNú£uÐyÅjtD€Œ–o&œÌ ^ ½Ï?/5’‰‰ÿRHÃï@ê;[ `Ùu éíG³y­¤l+ ”a•aò)–[YN›b–—R ™¿‡'ØöýÿmÓ\ C'ëÿÑzr`H<÷§bôá±–<ÒŸ‹ó‰ínAúcŽÄSq#È¥_ èt¸48݉åRfá䱎áÖt¸9 f’˜=Ää̺ ðƒUzrúE—Qb{x§^Ö†A«û½N2ðj;˜Wñ!Åjdc@Íß<N‹a¹I ÇÚFú‘ñUÒ;dÒ©¹;‘¾Õ‹Âà &ÃoíXs–4:ƒUm:Ãvì 8û\y½2ùrB¾œö¥ FhBOxÎú#íàÓð,ašY£]ž2s¤}-À&Äw*Д!‡E¾ÿS4¥Âf"€#qäSÖðã&åŽuÏŠB{²z¬X³#'ɤ-rîb›1xQ¾¶9.Ib+ÆoN#“ÛZh‚©fîsÜTÞ­&„Š5ÿî;ÓWîÕ[³m•Õn8vÆ~;P§³¶)é0“IÜim¿µ}=ܱ,qéÊ.9¦!]pHÍ>Ønæñ 7%KfDX°9$W¸•¥Ìiÿ5Bh?Œ¨™¹È§R8P"VCÀÍÌ@üÉYÉV…¤Ÿ@b²Î3Š©HÊÊÌB“œã`|g÷¥/lô/æ ubœ•9ÍÚïÕ·XΛwÖ“ÌX˜5Öó]˜NŽÎÀöý^› vÁ wæƒ4©ñ8G ¡€ÆÀžMYDH×*Ààû‹x¥;2Öæšœ|‚H™‘Ç»4úzOj»m ×Ä,ªÃb£Š…=±…˜+ê½]ÃE’bÈÒ%ŒÔÔ}G@Ó Õò{Ðí”à’7'9õÌq°ÙH8ßïM4¨à,Jçµ !Ÿs7š8ŠYœE¹'°llÍÔÜ14.²@ÝŽ(;Õ?ø_Rœ‡¸¼ Ü3F¶µ–(ÐhóõW¯ow'üàÎú6•NÙ7¹>öÆ4]?Ÿ-!<„?ʧN†Ul‘äUö´©AäŒP.:p‘· ŽÆµsp„殈_y—$öÁÍ.¥[ç4ÿ[ én£WSóH¶4®Ÿv¯é]6 ÉÜìÏuÇ­ãÛ&‚ÒÃH#o[%#“*3¶ÿzôªK¹öcšgP;íœèKH MîÅãÐ+©JšXEk  óµN¸R6ìW}Ô× lÜa[žu ÌR' à}>kž3´NË üêü&he ä0nàæ¥u½>²ºyªñ=ž’°Q8reŽhžØ[vÖÀÒI1…Õ€(ŽÉ€7-çÅ?Žã´eîC!>ãÞ¾{™LQ¶sæ’XðfÚŽºT©Cœò( ­ÍŒ¬‡ÒÆa±'½fYbE\±Ô; Z{†i•Täcö¡$ŒYα^ ìÀ&{vžª gVæ—E2®Àù¦\9ŒÜüö¡Å|äŸÜÑ–[:†·è·QÆŸ}y§áü2…õÝJXgu]¿­#lÆ7%$e`yVϬ²e.rãý`qSe9¿Êg‚Wqø---@X£Töæ¼¹cŽ6Á¡KÕ ‘[ –pIaÂ×ÓÜ£&äÔ\^Áht$‹€Ä[ù¤%m6Ì{ 5ÙÓrYœi)3!É8_ÓÆº‹QfbYç¸ 1Âøbx¡=„é’#‰sÞ¤,g:ðBzaË[ö£qt;â"³3kÃvÞ‹›jsŠô&[QP~õë }³ü«K ¨ ¦îv=:î;Ë1&¼Ê£IßúÑM¹.’B¯Õžâ¹Î“v,nÿÕ?µþÕÖQJª¾ Ýǃó\O!7×FP71#ÇT+‚ⱆHß>§by¡OvTL‚œgš3ØœìsIªOPªO©Æ“Œ`riušEÁE8;o_,†G$1“±¯[TxucŠ*®çº3ØÙK‘ô±;’8£,~¤™ÉFØïCÕ»8ÈÜ÷jñÒs 6Þ²®Ù1¨`„ò€Xp+7‰—‘?é,4¬S·®3õäæ,‘¨|ilï½z©· ®÷ /gDeC¶êmûPå’T–1¸'ŸLQ#Ž5&9$g`2vÛùײܫ¨‰AÒ9¬ÕèL¥ô"/ck<ŠþŠB¿ôm½/wÒ£i¬¥Éý¶9ìjj`¨ ¨ÂïýhP¡D$yÎ3µ8dq»›Ä9Ñ+¤Æ)T«ø;b›–´M]7:A**œ‘ …×2#&9~ó©—ôÕ|‘Ú#°«*¶ˆŠpN®iO“&;…ÉE)=³U [YöàsKá5—Ü/ ®„ê–Æ ¤ Ht üS_éö:ô‹Dµ·Ò mä#ûUaðO¸ë{;¸ó)¸xˆ;a·®Ÿ§J'·S)J‡N¢*<©G•ÜÖ”k„ùf¼yŒ†¬#‘»RòÊIÇ“JâÂÜq\0öǽ{¾Ùâ’é7V—O(ˆk¹'¿Úž™´®Æ›\u÷S.ˆ!ÖT0Øñާܧ§îC…?ÓâÙ¡ œp­#"‚Y]½¸ ­ÃA”‚}NØšŠ½nYÙ£X£!X€Ù>áMu;¹¡¶¹Ar¥AÏz•Óm´ a±ù«1¨àXÍcº”â¾FR­lë·é;W¶ëÔÌgwŠF¹³Î‘Ø|šø «Ûžù¥ I•¶×ËV¨Rn c>¿ë—SYÄ{b8´{ ‘,@½Â1çNù­u »f ’. 8Ú¦Ý$¾­»Rš»1`îM•ÍV¥ W2D²7Ä’…RØÂš‘erѶŸÓþi‰§’PdPsžæ±žPW ã Wgvö£‹FYð;æ•õ€Ü.ÙhöJ§UÌ£1þ“ú›°¥°2…`F£4}2Ë®L“a¤é—üÒÍrîup)k†in ŒÚ™ÎXüÖãU`⋈«1Eصf™òoñE#Œ‚Ý1†V.® $‘æ€Ȉ•û«6ŒAŒávÁ£ßB"U ç>y¥-¹ªÒŠêE“O¹·ÒFàƒOt 2ÞźåsÝÎËþÿµ!’>ß4øm"4ÀÌÒ³žÛ(sZÝTö:刴ƒÔ÷’y4±:(ÊHúPà÷æ²ñ³d°êfÇWÈÎ-¢V:cÀ}ò Oê…_\;¨äx§ º-oêÈp9׋b‹MÔNl%Ï!Ügð§Zœ«ôû¸Ú{T'àÿŠè.,ÿ&éu mße™8σàÔÞ™iN³€‘ާn2jŒÉe#Џù¾êã䚇;+ä%Eî[ããtMÏai$@æOi;^-˜’Fy²O‚)¸­­&S5‚°'ê€×Î<×ÑÏ:Fr;Œ}êFµºŽ }D\$jѼ@°ÝIÖMÊ@‹‚û¶i‰mÝÉpTãûP&=d×/¶åv¢Op˜&­ÚiÝœº…ûRߙ˻g,{ö£u¤áµ€õŽ¢Ûy4{^ŸrkžD(Î6þu¶ r>âM^¡út3Åú‚ääÑ®IÖD”™çP_§ï^h{•eW({[ô„Pé î½|ðz*TDÎ>(ks¨šbñŠÈÌjríÍÜ ŠC‘!#¹ø«0¸hFdŒ¤g4ý¤€>‡úMkˆiÔ%ü¿ÃNHó\Û9f>I«÷óµ‘1úv5̇ÒÜÓp­ˆj Èæ„ûf‰ë"öÉø¡:’r23Úœ½îZš0K鬚rŒ6"¾Ž9n¤K[dÖ{Õ{[Zc›R¦ÂýF¬Á­¤>•½¿§¶Ÿ¹ïI|üt˜C 3†ÞkhZÑ•=®Xy¦bFQïqÚ©=¢Æ‘¨ìÙã½hCIJ6T÷¤·¸ôJVq!PáHÀ¯ƒË >Üœf¶`Ðç »æÔ³Å}GqÔ×¶áýG’hr¹q©Ž1ƒ@ŠRîÀqÈÍfw}>Tv£ ¹ê¡¨¼ØÎWúÒîr´i$BHî{Òº°NwªD;M1Ç¿Òy5÷¬Lj}€yæµÔ‡+•;º*HUNÀÑkwnÅF#gÁRÌSæ”õžóª—•:Tì€°ÒØèQ¡FÔÞhTf-שB+Ö… ˜ÅÜ ô«ýQÿÚÜŠÓB³^<ö—fQ. @ãK©øìkÔD’!¥†¯šNá)„‹‘ŽiCf4ˆÔ¯qéè’»áöÞª~z4#rXöÔØï™¡Ìè'Qßõ¨ø=ÿz<]5/×Õµ¸gnÊF–_ŒjS(#íêeoRÄ7l© WŒžkRŸ^eÀÔ<Ò®”H—ønïoš¯Ç:@#*G?"¤jxˆ9#+‚W#¾ÔOAd„t’9^húYÓ rG¯#C…'ê$Šn ˜¶£…A,pp>ERæïHm¢Àòv£lˆY<óB´([;ÈsŽÕ¾É†§Ü3¨Ö¡O»Ô›[©åAháËã5iä*[d(÷m±5ÏAÔÖ$¸¹}õ9Ó¾øÌJÂêeî4öqË=f(V3ì c”šS§uq,ž”¤D”'·Åc©4Év·10«¿ÏÅ7ãn\Lxq\„è#‰"ä †ÍY›Tj4¦²ã¨6×÷!—!$CœŸ¤×¹GbC&ÜÏþi QÜSlÉ—3³i&?îjo£$_T…W¶ÕÐ8;—^@"¦Üƒ,€ØnEWÏPJÀ¬‚æ7ùS‘u¸ÖØE,DàiÔ;Òñ FìP1Á#°4/G+ýé…UŽàרÝÏS·r ÓÿmO»¼I?åF~äb·$@)iž1MEQ¯¨x„5ÆßCn$\ ÁñIÇ1gÍZ·P TË“žõ™ u<²`±ôŸZœ2︠›̲~*ÄÈÌuŒö£±Y DÑîÆ1Aò°›ÄHrZ²á6ßzúÞäÆÅg/éqȪòB‰ŸÕŽÕ:U/¹ ¯mëUù 3JÑÔf9EÀö°$n j&Šbs³©ÃÚ¦¤ÛËë[’àr1Ú·&ˆÝ.¡r5r½œÖ|`ôg¹ŸbR[GȰŠÅÂYVÝîйßH8#ïK\õ›ˆcT@f]œïŒÔµæ-,’s¹'“Z˜[…÷¡:h$¼±E×4ƒoÛšnÆ;F‘¼æW `aN; â¢b³w"º>‚ãGÝHaA›D$‰”»Ñ—`)\‘÷¦Ó@pŽà3 …ªa«|Žh²Ù¤²¬‹&’5Ë$^åPáFM”è#ö"¹Î­åµ5±˜²ðº²*àõa}@ë ·Ú,iƒ¯vêazÔ÷ñ,[ àœ Š #c8'>5Œg;âµ§Z<Öò©ê1 g*FŠÑ¤phÁB9Ô&¾.G< ÒÖu3ÔVÎ8; éº=Ã\[˜ ø=ñP bÎ|Un•*[^©c³¦¥òAe?˜bĺñ¬À .ýé+’Ž¡c6ÎGú¨ð¯üBåð¤$[sÍbHÖܼ­…]‚ädÿJæ.á€Ì„»c'5ñB„!Tr;š÷JËpíóY5 Nÿ½8a¸ÂŒl†¶x¡0,«ú±óÅ _Ôl¶wù¦X"xÔdœoóYDWFj-¶KHà Ö^½dÿHó^™C·_ŠËϦ\ãQÛ9¬ÜõÔ<‘³¨>¨Ç&Në ÞÁˆæ—õe’Sè·µ[¿z?楞OE™NÜãš.,e.L,à•fFÆÅNµl»!oÜÑ ‡N²Srrwâ¦u9¬çHÖÜÿIÕ…ÀÇïODWm‰…½Do¯f¾“,pŸ¥³húŽ â„T«nÆŠcž@¾œypFõРQÔË+wué«2sœйgÔÖ±u3åQ®áKkù`or«cqȪÖ1F±TW¹ðˆk²n6ùÒÎØ&­tÛq¨fƲw5&Ø ndU’B±6ÅsóYDjâh¡Œ¼¬GsQe¾7͘ò°/nçäÑ: Ú‰ÜmÅK¶5tÔpÀ‘[}Í»[»Z\¬ëÎ}Å|w®‚V,VÈÇ>kŸMMiœ<Õtf²MY&<©'¾(›ó=ÛKΚZq¨=¨ˆÞóÍ v'8íÍ'Ü5î!w–À „¾*/æB…Uªßçm¦fˆ€tìk–¿Ce,C³óUàKú˜9 Êæé#‹T˜ÇsA›C hÛ ö/óÌé¥W?&„=N5Ïâ©rs”z›ºX]ŠŸqíŠKòÈî'3T¡+€@óæ²m‚ƒÏšz¸]È_dIóO~Ødy ;±]MËjÝÄ!&ô±Þ‚í©¾*¥ªÔ•¬ôù°³Bã*éüˆâœ¸“Ò·ŠÙOÒ5¿Ëö– šq»mŸ[—ÕrýòÆ”âÞ;¤Ÿ2³ß5é,£*~H¯šL&ÊÐ`­Ÿ4;†kÔöqäùíMÄg}óH˜ýþÓNÛtÛÉP¹(¨{±Î•ñ&£1†m'õÔÈ„a‡;ÒÏ’²#)ùqº$róLÇaF*š[# W¨ÙAÚ°ù*€¸áÿOÈöÍ©Æê$bœ‘abG\ÿš®Üþ†íY­XC&6_ÒOø©7 ;x…xõdg¹4Äò1äèÉO“ ûƒWTˆ*“Ç5ê0'߃ކñz`!ãšÀ‰ñ©1Ú˜µÜK_U4࣌¥qZf2D ñB_oï^"j5J=1ý9\þ–?j£skBA>*=´þ„š±žÄy¦ÿãP!ÄÑ0ý;Ôyq¹{Q-Ç‘ÓYU£Ul§Õ+vm²ÀñPmúЉL ˜.•ðiɵÃ*ÄçÈïKɈèÄÈ ¸’¤Ñ4Q+i ç,I5¼ït“ƒ^Ç9)…b«Þ†×h¬Æ i„*0˜Ôo¨ÒYvÞƒp¯t¥a…€’v¡\ÂÞ@¿K©j™Òº»ÚÈ-ç,ѳÝM91—±î€=vÐI$Œþª©'Pµ‚%™ †%ª|%$R¨N:ÚÚG Ì^`Ž5kŸÛµLêý£~2F ®á¹[HYÁR ŠN³–ݵ¢«œáóÈh\ê‘¡T Øß°ÓûVŒPÛ‡p=ºw)QÆ£ñ㘒YÉgs¨ÛÒÅ+ëSŒni…c# ˆMÇÍRä³p1¸"’\žã¯¹”µ¸Bt¹V!—b S¶t»U«é\®Âà Ÿþï÷¬À¥‡ñQØ×¢tYdÛqÆiG):«Š,N¡gµX3`d}Ã}¨ s¢§ ²ŒÑ?>m™Q×Ô‰ÆJ7íâ¼{$¹¯¬ÙŒh2Ñ6÷¡ bý@ÿý¤éX¤¦WÁ’PyÒ)¨—S_(á,ûV¥„Ç ¾uqŽ(v‚A¦mZ†pi¹nQŠ%FqDăQ+ö[‰ FX’ã s§Z´Û÷ G•÷÷Ú¬tÉâ†0˜ÉíÍV!u1ìħR²²ŒVU†-çšc¨ÈÔ\§Ó°ÏíAhË#0ÛÒÁй§¸dm ¡æ¾kÜ MÆAænÀ1S“·¦½‘ÅxèÏÒ—ª¥P•ÒhuBú¥LÁ¥ÝÜ|åâ‹ Áp3æ±–éŒ }JPu#AL«Ÿù¼2Õ‹r²;[‘-×åã>àì)’ß”„ŒÀ~£Àñ^GŸæ4€ú€œmÞ¹þ·ÔË\hÁTCîßê4ÕBíKõQ«®·…ãuqØ×4ˬ._7Åéà`1 6UŽ1ƒWâÆ¨·7 –ååHâ|<⟽cmnöφ8?:ߨÅduzFIFê ŠVk¹nn^yHÔãŠ/™·Ð™ò…ÛÞ\Àå!|,›2°È?5w§O)@ê™$`±~ÕÑòòJ- ‘Áî•Yè·dÛIlT„ä¯b +ÈÜ~®;!cïs“Ž3µOžCeˆ rÄc·jt¦g „ªs ò)¨ªBr‡n*|}Ôqê@XP䌨àV#“f9䓜VÞªêÆØ8ÓÑÕ¬Õ#¨513ŽÇ¼cÔ™SVw£Ï§½' 9¦®ÄSÊQÛˆe «Å7­Dˆ¹Æ¬ä ï$~™>õîi€ ³£®ÙíIq½ÂQ¨Ì®¤(ÕÇ5¨¥]%·'žì£é;ïE¼¶0ieãŒx¥ëô͘•õœÿjÜs‹ÇsCãYWÔ\‚xóW"’SØé.ÅE ‚+il¶Ñƒ"þj}×K’y™mâÒ„ê*NtpE;&=ÃÎôKˆ}1䊘eekuÔãæé $|0 Ý;р̺‰Zè/‘ †)Ç,*L—Lã'(ÕV<ŽÂo9ù›­apj¯ÑÜŽ£V*²§ûâ§ÝC©‹¯ [´˜Æc|UÁ«˜sÇR?Ò÷;¸K…#$ŠrF„èl¨8ßšZß';ò6­YDÑJÊ@ÏÀ5¹ÐimÆ“A>×Ó/ß&œÁ”…#úŠ öÌÈHq9"„ƒr}ÄÌpÊ®ÜÚ§žilC$(2IÈßz«$l£,FÛm\S¿¹BX–fŒTcj·l†ž4¡r@$(©òe[8©{uŸÿHs÷5Ñôëtê=>+’0Ã*ñ"«tøT­ÈÔÿÙprogress_handle.svg000066400000000000000000000021461225012771600365660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images progress_handle_pressed.svg000066400000000000000000000021421225012771600403070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images titlebar.png000066400000000000000000000026341225012771600352040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images‰PNG  IHDR1,ÌÔPYsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ/+áƵtEXtCommentCreated with GIMPW÷IDAThÞÕš¿nGƳ·¤èVÒÚ0.’.Üp^ÁÏ’"mš<]j7VãÂÜ9MÞíΤØÝ»½ã‘’œÀ¤XÜwûç›ï›™%‡,™é¥Õ÷‡j6¹u4€«:ÕUŽÈ.Z®XæM×`¤º ˆzãÄÜ{>˪©º;YMYÐjó@ðÀƒ d™ì’Ø!AèÄúè€è

/ãêç~b9A«5Ͼû–³³3...xóæÍŸòâÅ {þü9>|àúúçM“\!ÆH#n/ï\æzxޣϊ%Å#šc… hžW* .ó§5#ù=ç]×ñðáC=zÄëׯñççç\]]qyyÉjµ m[‹"²µy&‡¶@@²œ™“^b£PcÖ³Q„_@¨³ †šfCÎ9®¯¯999áéÓ§øÕòïßÿE#ŽØTï}º·€ôj¾9ç·z$W€hÉ’6™t=f6b @Õz.KK³“Š]X,\^^òøñc|Œ‘ͦÃûDÓb±@UÙ´ŸY.—=Ý»ÙÈÔÛ” C5ñ#"Cx³$—X1Qƒh²LM-QMlªõñÑù†hÊf½ÁùofÄqnÐ~ˆƒœ4êH“5Í£èd†æçÓ\ AADÀ,[;$VÌ E0g ,VrŒiœ™!N™²¦Y$ºnƒY¤m#Ò86]›7¥ˆØ`Êj ˜…ѹDDè$î<«²¥‹1Š} «fëÁP«±I%¨hˆ:|c^p¼ÁQè›X¾0S®(Û êð:Û³ªºÅøœ4FbŒÉ'bŒÝàhý5êÖ"û&¿U*¾ľù‹‘RBVºªš|BuËš"’hÜöèâ ;7rãy¢2Ø€1¿f%+UíC|¢VðT÷ƒv·'ã‹™˜‚ï­|ÃMDP1¢FÚÐ%9•Á¦ƒeT“ŒÊuÎÚR9è]ZÉç@cîòCçZ"©ÆÁ±§´Þüíý3ìÜűç@ÔÃç|CUS"Ë©m[º®Kè3QrÇ.½‹H¿ï¢EveÄØb¿Ž†åMY·-~ÝnX·œs³Öþ’èó5Z‘z÷y+Èæô~¬m*A?—Dfµ¤MUq%ÑíC{ô ê_Ú(›%&nzù^2q웯¥®ª):Ý'ËÏ%A7w¬¨“Üìyé?œ`ÿOõ>qäõ÷Ý}™ük;ù š¦é¼ý—§ È9wÒò·A*"4MÓgör¶*_NíÜ7‚ˆ1öTuôÓIñCËÉ7âhš=Ölji¹£ŒTþ‡Ÿ~ä¾7~®~Ö_1[êjÑ¡ëu•¨«jŸOø;?Ø0XJ‘E8lÝÎ&`ú“"Ë?ÄšqÝîÐ,ìc£0ÒŸ) ÙúÓ**daÊFùA½)•£Îgº‰õ¥ü;'+²â3€Èqâç@Fzf|¦ä˜ÿ1'«Ñß"þ‡”ŒjDÝØIEND®B`‚titlebar.sci000066400000000000000000000001271225012771600351710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/imagesborder.left: 10 border.top: 12 border.bottom: 12 border.right: 10 source: titlebar.png up.png000066400000000000000000000012261225012771600340160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/images‰PNG  IHDRVÎŽWsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ7‘IDAT8˽”ÏkAÇ?of7Ù˜ò£MLµŠõdµCU,zðà GÛ‹Ô“Þ¼+xïÍ?Àÿ@¬lHk)drÎéJqnúBRûzã»dò¨ì“n“íï|Ã7Àß TL¦ì»§Ê…¹Êå$bWñŒ‹RZC.Ù¼”𫩝ð¶`ƒ ½©´}¯|¾4?=“Ô:¾‚çµPâc)Сçò—‰fCõ|¾ftåôLláäT'K4€JüM@[wÁ7¨TJöu»ä5ÞµAPçËGï×ËgÞxuYÏœM=¬"`+h®ÂâýÀ¼]âU£Æ#à5ÐW ÏÀàš­’N[À Ý–€M`x¬þ`Å€tEÀ’K¨0%¥@Beá^Xú@0\úAT:ŒA”¥ÁV‚DAMôj;ö ¾A|s-Á® 9l~«Õþùây{Ìu7‹ ý>C-Ji+øvs€Àñ°¯ôé/vt2âëˆqÀV ôÂ×ÚT%#º_F¬C#¿ýº¤2Öá¢IIEND®B`‚main.cpp000066400000000000000000000122111225012771600330430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include "trace.h" #ifdef PERFORMANCEMONITOR_SUPPORT #include "performancemonitordeclarative.h" #endif static const QString DefaultFileName1 = ""; static const QString DefaultFileName2 = ""; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); #ifdef PERFORMANCEMONITOR_SUPPORT PerformanceMonitor::qmlRegisterTypes(); #endif QString source1, source2; qreal volume = 0.5; QStringList args = app.arguments(); #ifdef PERFORMANCEMONITOR_SUPPORT PerformanceMonitor::State performanceMonitorState; #endif bool sourceIsUrl = false; for (int i = 1; i < args.size(); ++i) { const QByteArray arg = args.at(i).toUtf8(); if (arg.startsWith('-')) { if ("-volume" == arg) { if (i+1 < args.count()) volume = 0.01 * args.at(++i).toInt(); else qtTrace() << "Option \"-volume\" takes a value"; } #ifdef PERFORMANCEMONITOR_SUPPORT else if (performanceMonitorState.parseArgument(arg)) { // Do nothing } #endif else if ("-url" == arg) { sourceIsUrl = true; } else { qtTrace() << "Option" << arg << "ignored"; } } else { if (source1.isEmpty()) source1 = arg; else if (source2.isEmpty()) source2 = arg; else qtTrace() << "Argument" << arg << "ignored"; } } QUrl url1, url2; if (sourceIsUrl) { url1 = source1; url2 = source2; } else { if (!source1.isEmpty()) url1 = QUrl::fromLocalFile(source1); if (!source2.isEmpty()) url2 = QUrl::fromLocalFile(source2); } QQuickView viewer; viewer.setSource(QUrl("qrc:///qml/qmlvideo/main.qml")); QObject::connect(viewer.engine(), SIGNAL(quit()), &viewer, SLOT(close())); QQuickItem *rootObject = viewer.rootObject(); rootObject->setProperty("source1", url1); rootObject->setProperty("source2", url2); rootObject->setProperty("volume", volume); #ifdef PERFORMANCEMONITOR_SUPPORT if (performanceMonitorState.valid) { rootObject->setProperty("perfMonitorsLogging", performanceMonitorState.logging); rootObject->setProperty("perfMonitorsVisible", performanceMonitorState.visible); } QObject::connect(&viewer, SIGNAL(afterRendering()), rootObject, SLOT(qmlFramePainted())); #endif QUrl videoPath; const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation); if (moviesLocation.isEmpty()) { QUrl appPath(QString("file:///%1").arg(app.applicationDirPath())); videoPath = appPath.resolved(QUrl("./")); } else videoPath = QString("file:///%1").arg(moviesLocation.first()); viewer.rootContext()->setContextProperty("videoPath", videoPath); QMetaObject::invokeMethod(rootObject, "init"); viewer.show(); return app.exec(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/000077500000000000000000000000001225012771600322665ustar00rootroot00000000000000qmlvideo/000077500000000000000000000000001225012771600340275ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qmlButton.qml000066400000000000000000000055241225012771600360230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: textColor radius: 0.25 * height property string text property color bgColor: "white" property color bgColorSelected: "red" property color textColor: "black" property alias enabled: mouseArea.enabled signal clicked Rectangle { anchors { fill: parent; margins: 1 } color: mouseArea.pressed ? bgColorSelected : bgColor radius: 0.25 * height Text { id: text anchors.centerIn: parent text: root.text font.pixelSize: 0.5 * parent.height color: mouseArea.pressed ? bgColor : textColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } MouseArea { id: mouseArea anchors.fill: parent onClicked: { root.clicked() } } } } CameraBasic.qml000066400000000000000000000037671225012771600367110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneBasic { contentType: "camera" started: true } CameraDrag.qml000066400000000000000000000037441225012771600365400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneDrag { contentType: "camera" } CameraDummy.qml000066400000000000000000000050671225012771600367560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 // Item which is loaded by CameraItem if Qt Multimedia is not available Rectangle { id: root color: "grey" height: width signal fatalError signal sizeChanged signal framePainted Text { anchors.fill: parent anchors.margins: 10 color: "white" horizontalAlignment: Text.AlignHCenter text: "Failed to create Camera item\n\nCheck that Qt Multimedia is installed" verticalAlignment: Text.AlignVCenter wrapMode: Text.Wrap } onWidthChanged: height = width onHeightChanged: root.sizeChanged() function start() { } function stop() { } } CameraFullScreen.qml000066400000000000000000000037531225012771600377250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneFullScreen { contentType: "camera" } CameraFullScreenInverted.qml000066400000000000000000000037631225012771600414270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneFullScreenInverted { contentType: "camera" } CameraItem.qml000066400000000000000000000047101225012771600365530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 VideoOutput { id: root height: width source: camera signal fatalError signal sizeChanged onHeightChanged: root.sizeChanged() Camera { id: camera onError: { if (Camera.NoError != error) { console.log("[qmlvideo] CameraItem.onError error " + error + " errorString " + errorString) root.fatalError() } } } function start() { camera.start() } function stop() { camera.stop() } } CameraMove.qml000066400000000000000000000037441225012771600365710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneMove { contentType: "camera" } CameraOverlay.qml000066400000000000000000000037471225012771600373070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneOverlay { contentType: "camera" } CameraResize.qml000066400000000000000000000037461225012771600371260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneResize { contentType: "camera" } CameraRotate.qml000066400000000000000000000037461225012771600371230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneRotate { contentType: "camera" } CameraSpin.qml000066400000000000000000000037441225012771600365740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneSpin { contentType: "camera" } Content.qml000066400000000000000000000132131225012771600361540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root border.color: "white" border.width: showBorder ? 1 : 0 color: "transparent" property string contentType // "camera" or "video" property string source property real volume property bool dummy: false property bool autoStart: true property bool started: false property bool showFrameRate: false property bool showBorder: false signal initialized signal error signal videoFramePainted Loader { id: contentLoader } Connections { id: framePaintedConnection onFramePainted: { if (frameRateLoader.item) frameRateLoader.item.notify() root.videoFramePainted() } ignoreUnknownSignals: true } Connections { id: errorConnection onFatalError: { console.log("[qmlvideo] Content.onFatalError") stop() root.error() } ignoreUnknownSignals: true } Loader { id: frameRateLoader source: root.showFrameRate ? "../frequencymonitor/FrequencyItem.qml" : "" onLoaded: { item.parent = root item.anchors.top = root.top item.anchors.right = root.right item.anchors.margins = 10 } } onWidthChanged: { if (contentItem()) contentItem().width = width } onHeightChanged: { if (contentItem()) contentItem().height = height } function initialize() { console.log("[qmlvideo] Content.initialize: contentType " + contentType) if ("video" == contentType) { console.log("[qmlvideo] Content.initialize: loading VideoItem.qml") contentLoader.source = "VideoItem.qml" if (Loader.Error == contentLoader.status) { console.log("[qmlvideo] Content.initialize: loading VideoDummy.qml") contentLoader.source = "VideoDummy.qml" dummy = true } contentLoader.item.volume = volume } else if ("camera" == contentType) { console.log("[qmlvideo] Content.initialize: loading CameraItem.qml") contentLoader.source = "CameraItem.qml" if (Loader.Error == contentLoader.status) { console.log("[qmlvideo] Content.initialize: loading CameraDummy.qml") contentLoader.source = "CameraDummy.qml" dummy = true } } else { console.log("[qmlvideo] Content.initialize: error: invalid contentType") } if (contentLoader.item) { contentLoader.item.sizeChanged.connect(updateRootSize) contentLoader.item.parent = root contentLoader.item.width = root.width framePaintedConnection.target = contentLoader.item errorConnection.target = contentLoader.item if (root.autoStart) root.start() } console.log("[qmlvideo] Content.initialize: complete") root.initialized() } function start() { console.log("[qmlvideo] Content.start") if (contentLoader.item) { if (root.contentType == "video") contentLoader.item.mediaSource = root.source contentLoader.item.start() root.started = true } } function stop() { console.log("[qmlvideo] Content.stop") if (contentLoader.item) { contentLoader.item.stop() if (root.contentType == "video") contentLoader.item.mediaSource = "" root.started = false } } function contentItem() { return contentLoader.item } function updateRootSize() { root.height = contentItem().height } } DisableScreenSaver.qml000066400000000000000000000040301225012771600402430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtSystemInfo 5.0 Item { ScreenSaver { screenSaverInhibited: true } } ErrorDialog.qml000066400000000000000000000063371225012771600367640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "transparent" opacity: 0.0 property alias enabled: mouseArea.enabled state: enabled ? "on" : "baseState" states: [ State { name: "on" PropertyChanges { target: root opacity: 1.0 } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "opacity" easing.type: Easing.OutQuart duration: 500 } } ] Rectangle { anchors.fill: parent color: "black" opacity: 0.75 } Rectangle { anchors.centerIn: parent width: 300 height: 200 radius: 10 color: "white" Text { id: text anchors.fill: parent anchors.margins: 10 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter color: "black" wrapMode: Text.WordWrap } } MouseArea { id: mouseArea anchors.fill: parent onClicked: root.enabled = false } function show(msg) { text.text = "Error

" + msg root.enabled = true } } FileBrowser.qml000066400000000000000000000334151225012771600367730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import Qt.labs.folderlistmodel 2.0 Rectangle { id: fileBrowser color: "transparent" property string folder signal fileSelected(string file) function selectFile(file) { if (file !== "") { folder = loader.item.folders.folder fileBrowser.fileSelected(file) } loader.sourceComponent = undefined } Loader { id: loader } function show() { loader.sourceComponent = fileBrowserComponent loader.item.parent = fileBrowser loader.item.anchors.fill = fileBrowser loader.item.folder = fileBrowser.folder } Component { id: fileBrowserComponent Rectangle { id: root color: "white" property bool showFocusHighlight: false property variant folders: folders1 property variant view: view1 property alias folder: folders1.folder property color textColor: "black" FolderListModel { id: folders1 folder: folder } FolderListModel { id: folders2 folder: folder } SystemPalette { id: palette } Component { id: folderDelegate Rectangle { id: wrapper function launch() { var path = "file:///" + filePath; if (folders.isFolder(index)) down(path); else fileBrowser.selectFile(path) } width: root.width height: 52 color: "transparent" Rectangle { id: highlight; visible: false anchors.fill: parent color: palette.highlight gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } } Item { width: 48; height: 48 Image { source: "qrc:/folder.png" anchors.centerIn: parent visible: folders.isFolder(index) } } Text { id: nameText anchors.fill: parent; verticalAlignment: Text.AlignVCenter text: fileName anchors.leftMargin: 54 font.pixelSize: 32 color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor elide: Text.ElideRight } MouseArea { id: mouseRegion anchors.fill: parent onPressed: { root.showFocusHighlight = false; wrapper.ListView.view.currentIndex = index; } onClicked: { if (folders == wrapper.ListView.view.model) launch() } } states: [ State { name: "pressed" when: mouseRegion.pressed PropertyChanges { target: highlight; visible: true } PropertyChanges { target: nameText; color: palette.highlightedText } } ] } } ListView { id: view1 anchors.top: titleBar.bottom anchors.bottom: cancelButton.top x: 0 width: parent.width model: folders1 delegate: folderDelegate highlight: Rectangle { color: palette.highlight visible: root.showFocusHighlight && view1.count != 0 gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } width: view1.currentItem == null ? 0 : view1.currentItem.width } highlightMoveVelocity: 1000 pressDelay: 100 focus: true state: "current" states: [ State { name: "current" PropertyChanges { target: view1; x: 0 } }, State { name: "exitLeft" PropertyChanges { target: view1; x: -root.width } }, State { name: "exitRight" PropertyChanges { target: view1; x: root.width } } ] transitions: [ Transition { to: "current" SequentialAnimation { NumberAnimation { properties: "x"; duration: 250 } } }, Transition { NumberAnimation { properties: "x"; duration: 250 } NumberAnimation { properties: "x"; duration: 250 } } ] Keys.onPressed: root.keyPressed(event.key) } ListView { id: view2 anchors.top: titleBar.bottom anchors.bottom: parent.bottom x: parent.width width: parent.width model: folders2 delegate: folderDelegate highlight: Rectangle { color: palette.highlight visible: root.showFocusHighlight && view2.count != 0 gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } width: view1.currentItem == null ? 0 : view1.currentItem.width } highlightMoveVelocity: 1000 pressDelay: 100 states: [ State { name: "current" PropertyChanges { target: view2; x: 0 } }, State { name: "exitLeft" PropertyChanges { target: view2; x: -root.width } }, State { name: "exitRight" PropertyChanges { target: view2; x: root.width } } ] transitions: [ Transition { to: "current" SequentialAnimation { NumberAnimation { properties: "x"; duration: 250 } } }, Transition { NumberAnimation { properties: "x"; duration: 250 } } ] Keys.onPressed: root.keyPressed(event.key) } Rectangle { id: cancelButton width: 100 height: titleBar.height - 7 color: "black" anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter } Text { anchors { fill: parent; margins: 4 } text: "Cancel" color: "white" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 20 } MouseArea { anchors.fill: parent onClicked: fileBrowser.selectFile("") } } Keys.onPressed: { root.keyPressed(event.key); if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { view.currentItem.launch(); event.accepted = true; } else if (event.key == Qt.Key_Left) { up(); } } BorderImage { source: "qrc:/titlebar.sci"; width: parent.width; height: 52 y: -7 id: titleBar Rectangle { id: upButton width: 48 height: titleBar.height - 7 color: "transparent" Image { anchors.centerIn: parent; source: "qrc:/up.png" } MouseArea { id: upRegion; anchors.centerIn: parent width: 56 height: 56 onClicked: if (folders.parentFolder != "") up() } states: [ State { name: "pressed" when: upRegion.pressed PropertyChanges { target: upButton; color: palette.highlight } } ] } Rectangle { color: "gray" x: 48 width: 1 height: 44 } Text { anchors.left: upButton.right; anchors.right: parent.right; height: parent.height anchors.leftMargin: 4; anchors.rightMargin: 4 text: folders.folder color: "white" elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter font.pixelSize: 32 } } function down(path) { if (folders == folders1) { view = view2 folders = folders2; view1.state = "exitLeft"; } else { view = view1 folders = folders1; view2.state = "exitLeft"; } view.x = root.width; view.state = "current"; view.focus = true; folders.folder = path; } function up() { var path = folders.parentFolder; if (folders == folders1) { view = view2 folders = folders2; view1.state = "exitRight"; } else { view = view1 folders = folders1; view2.state = "exitRight"; } view.x = -root.width; view.state = "current"; view.focus = true; folders.folder = path; } function keyPressed(key) { switch (key) { case Qt.Key_Up: case Qt.Key_Down: case Qt.Key_Left: case Qt.Key_Right: root.showFocusHighlight = true; break; default: // do nothing break; } } } } } Scene.qml000066400000000000000000000050211225012771600355750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "black" property alias buttonHeight: closeButton.height property string source1 property string source2 property int contentWidth: 250 property real volume: 0.25 property int margins: 10 property QtObject content signal close signal videoFramePainted Button { id: closeButton anchors { top: parent.top right: parent.right margins: root.margins } width: 50 height: 30 z: 2.0 text: "Back" onClicked: root.close() } } SceneBasic.qml000066400000000000000000000060661225012771600365510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType property bool autoStart: false property bool started: false Content { id: content autoStart: parent.autoStart started: parent.started anchors.centerIn: parent width: parent.contentWidth contentType: parent.contentType source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } Text { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom margins: 20 } text: content.started ? "Tap the screen to stop content" : "Tap the screen to start content" color: "yellow" font.pixelSize: 20 z: 2.0 } MouseArea { anchors.fill: parent onClicked: { console.log("[qmlvideo] SceneBasic.onClicked, started = " + content.started) if (content.started) content.stop() else content.start() } } Component.onCompleted: root.content = content } SceneDrag.qml000066400000000000000000000051331225012771600363770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property string contentType Image { id: background source: "qrc:/images/leaves.jpg" x: (parent.width - width) / 2 y: (parent.height - height) / 2 Content { id: content anchors.centerIn: parent width: root.contentWidth contentType: root.contentType source: root.source1 volume: root.volume onVideoFramePainted: root.videoFramePainted() } } MouseArea { anchors.fill: parent drag.target: background } Component.onCompleted: root.content = content } SceneFullScreen.qml000066400000000000000000000070161225012771600375660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume state: "left" states: [ State { name: "fullScreen" PropertyChanges { target: content; width: content.parent.width } PropertyChanges { target: content; height: content.parent.height } } ] transitions: [ Transition { ParallelAnimation { PropertyAnimation { property: "width" easing.type: Easing.Linear duration: 250 } PropertyAnimation { property: "height" easing.type: Easing.Linear duration: 250 } } } ] MouseArea { anchors.fill: parent onClicked: content.state = (content.state == "fullScreen") ? "baseState" : "fullScreen" } onVideoFramePainted: root.videoFramePainted() } Text { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom margins: 20 } text: "Tap on the content to toggle full-screen mode" color: "yellow" font.pixelSize: 20 z: 2.0 } Component.onCompleted: root.content = content } SceneFullScreenInverted.qml000066400000000000000000000071121225012771600412640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType Content { id: content anchors.centerIn: parent width: parent.width height: parent.height contentType: root.contentType source: parent.source1 volume: parent.volume state: "left" states: [ State { name: "nonFullScreen" PropertyChanges { target: content; width: content.parent.contentWidth } } ] transitions: [ Transition { ParallelAnimation { PropertyAnimation { property: "width" easing.type: Easing.Linear duration: 250 } PropertyAnimation { property: "height" easing.type: Easing.Linear duration: 250 } } } ] MouseArea { anchors.fill: parent onClicked: content.state = (content.state == "nonFullScreen") ? "baseState" : "nonFullScreen" } onVideoFramePainted: root.videoFramePainted() onInitialized: { width = parent.width height = parent.height } } Text { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom margins: 20 } text: "Tap on the content to toggle full-screen mode" color: "yellow" font.pixelSize: 20 z: 2.0 } Component.onCompleted: root.content = content } SceneMove.qml000066400000000000000000000061501225012771600364300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property string contentType Content { id: content anchors.verticalCenter: parent.verticalCenter width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume SequentialAnimation on x { id: animation loops: Animation.Infinite property int from: margin property int to: 100 property int duration: 1500 running: false PropertyAnimation { from: animation.from to: animation.to duration: animation.duration easing.type: Easing.InOutCubic } PropertyAnimation { from: animation.to to: animation.from duration: animation.duration easing.type: Easing.InOutCubic } } onVideoFramePainted: root.videoFramePainted() } onWidthChanged: { animation.to = root.width - content.width - margin animation.start() } Component.onCompleted: root.content = content } SceneMulti.qml000066400000000000000000000135551225012771600366230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property real itemWidth: (width / 3) - 40 property real itemTopMargin: 50 QtObject { id: contentProxy function initialize() { video1.initialize() video2.initialize() } } Component { id: startStopComponent Rectangle { id: root color: "transparent" function content() { return root.parent } Text { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom margins: 20 } text: content() ? content().started ? "Tap to stop" : "Tap to start" : "" color: "yellow" font.pixelSize: 20 } MouseArea { anchors.fill: parent onClicked: { if (content().started) content().stop() else content().start() } } } } Content { id: video1 anchors { left: parent.left leftMargin: 10 top: parent.top topMargin: root.itemTopMargin } autoStart: false contentType: "video" showBorder: true showFrameRate: started source: parent.source1 width: itemWidth volume: parent.volume Loader { id: video1StartStopLoader onLoaded: { item.parent = video1 item.anchors.fill = video1 } } onInitialized: video1StartStopLoader.sourceComponent = startStopComponent } Rectangle { id: cameraHolder anchors { horizontalCenter: parent.horizontalCenter top: parent.top topMargin: root.itemTopMargin } border.width: 1 border.color: "white" color: "transparent" width: itemWidth height: width property bool started: false Loader { id: cameraLoader onLoaded: { item.parent = cameraHolder item.centerIn = cameraHolder item.contentType = "camera" item.showFrameRate = true item.width = itemWidth item.z = 1.0 cameraErrorConnection.target = item item.initialize() } } Loader { id: cameraStartStopLoader sourceComponent: startStopComponent onLoaded: { item.parent = cameraHolder item.anchors.fill = cameraHolder item.z = 2.0 } } Connections { id: cameraErrorConnection onError: { console.log("[qmlvideo] SceneMulti.camera.onError") cameraHolder.stop() } } function start() { cameraLoader.source = "Content.qml" cameraHolder.started = true } function stop() { cameraLoader.source = "" cameraHolder.started = false } } Content { id: video2 anchors { right: parent.right rightMargin: 10 top: parent.top topMargin: root.itemTopMargin } autoStart: false contentType: "video" showBorder: true showFrameRate: started source: parent.source2 width: itemWidth volume: parent.volume Loader { id: video2StartStopLoader onLoaded: { item.parent = video2 item.anchors.fill = video2 } } onInitialized: video2StartStopLoader.sourceComponent = startStopComponent } Component.onCompleted: root.content = contentProxy } SceneOverlay.qml000066400000000000000000000100461225012771600371420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property string contentType Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } Rectangle { id: overlay y: 0.5 * parent.height width: content.width height: content.height color: "yellow" opacity: 0.5 SequentialAnimation on x { id: xAnimation loops: Animation.Infinite property int from: margin property int to: 100 property int duration: 1500 running: false PropertyAnimation { from: xAnimation.from to: xAnimation.to duration: xAnimation.duration easing.type: Easing.InOutCubic } PropertyAnimation { from: xAnimation.to to: xAnimation.from duration: xAnimation.duration easing.type: Easing.InOutCubic } } SequentialAnimation on y { id: yAnimation loops: Animation.Infinite property int from: margin property int to: 180 property int duration: 1500 running: false PropertyAnimation { from: yAnimation.from to: yAnimation.to duration: yAnimation.duration easing.type: Easing.InOutCubic } PropertyAnimation { from: yAnimation.to to: yAnimation.from duration: yAnimation.duration easing.type: Easing.InOutCubic } } } onWidthChanged: { xAnimation.to = root.width - content.width - margin xAnimation.start() } onHeightChanged: { //yAnimation.to = root.height - content.height - margin yAnimation.start() } Component.onCompleted: root.content = content } SceneResize.qml000066400000000000000000000055311225012771600367650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume SequentialAnimation on scale { id: animation loops: Animation.Infinite property int duration: 1500 running: true PropertyAnimation { from: 1.5 to: 0.5 duration: animation.duration easing.type: Easing.InOutCubic } PropertyAnimation { from: 0.5 to: 1.5 duration: animation.duration easing.type: Easing.InOutCubic } } onVideoFramePainted: root.videoFramePainted() } Component.onCompleted: root.content = content } SceneRotate.qml000066400000000000000000000065061225012771600367650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property int delta: 30 property string contentType Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } Button { id: rotatePositiveButton anchors { right: parent.right bottom: rotateNegativeButton.top margins: parent.margins } width: 90 height: root.buttonHeight text: "Rotate +" + delta onClicked: content.rotation = content.rotation + delta } Button { id: rotateNegativeButton anchors { right: parent.right verticalCenter: parent.verticalCenter margins: parent.margins } width: 90 height: root.buttonHeight text: "Rotate -" + delta onClicked: content.rotation = content.rotation - delta } Button { id: rotateValueButton anchors { left: parent.left verticalCenter: parent.verticalCenter margins: parent.margins } width: 30 height: root.buttonHeight enabled: false text: content.rotation % 360 } Component.onCompleted: root.content = content } SceneSelectionPanel.qml000066400000000000000000000110771225012771600404330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root property int itemHeight: 25 property string sceneSource: "" ListModel { id: list ListElement { name: "multi"; source: "SceneMulti.qml" } ListElement { name: "video"; source: "VideoBasic.qml" } ListElement { name: "video-drag"; source: "VideoDrag.qml" } ListElement { name: "video-fillmode"; source: "VideoFillMode.qml" } ListElement { name: "video-fullscreen"; source: "VideoFullScreen.qml" } ListElement { name: "video-fullscreen-inverted"; source: "VideoFullScreenInverted.qml" } ListElement { name: "video-metadata"; source: "VideoMetadata.qml" } ListElement { name: "video-move"; source: "VideoMove.qml" } ListElement { name: "video-overlay"; source: "VideoOverlay.qml" } ListElement { name: "video-playbackrate"; source: "VideoPlaybackRate.qml" } ListElement { name: "video-resize"; source: "VideoResize.qml" } ListElement { name: "video-rotate"; source: "VideoRotate.qml" } ListElement { name: "video-spin"; source: "VideoSpin.qml" } ListElement { name: "video-seek"; source: "VideoSeek.qml" } ListElement { name: "camera"; source: "CameraBasic.qml" } ListElement { name: "camera-drag"; source: "CameraDrag.qml" } ListElement { name: "camera-fullscreen"; source: "CameraFullScreen.qml" } ListElement { name: "camera-fullscreen-inverted"; source: "CameraFullScreenInverted.qml" } ListElement { name: "camera-move"; source: "CameraMove.qml" } ListElement { name: "camera-overlay"; source: "CameraOverlay.qml" } ListElement { name: "camera-resize"; source: "CameraResize.qml" } ListElement { name: "camera-rotate"; source: "CameraRotate.qml" } ListElement { name: "camera-spin"; source: "CameraSpin.qml" } } Component { id: delegate Item { id: delegateItem width: root.width height: itemHeight Button { id: selectorItem anchors.centerIn: parent width: 0.9 * parent.width height: 0.8 * itemHeight text: name onClicked: root.sceneSource = source } } } Flickable { anchors.fill: parent contentHeight: (itemHeight * list.count) + layout.anchors.topMargin + layout.spacing clip: true Column { id: layout anchors { fill: parent topMargin: 10 } Repeater { model: list delegate: delegate } } } } SceneSpin.qml000066400000000000000000000051011225012771600364260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property string contentType Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: root.contentType source: parent.source1 volume: parent.volume PropertyAnimation on rotation { id: animation loops: Animation.Infinite running: true from: 0 to: 360 duration: 3000 easing.type: Easing.Linear } onVideoFramePainted: root.videoFramePainted() } Component.onCompleted: root.content = content } SeekControl.qml000066400000000000000000000120301225012771600367660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Item { id: seekControl height: 46 property int duration: 0 property int playPosition: 0 property int seekPosition: 0 property bool enabled: true property bool seeking: false Rectangle { id: background anchors.fill: parent color: "black" opacity: 0.3 } Rectangle { id: progressBar anchors { left: parent.left; top: parent.top; bottom: parent.bottom } width: seekControl.duration == 0 ? 0 : background.width * seekControl.playPosition / seekControl.duration color: "black" opacity: 0.7 } Text { width: 90 anchors { left: parent.left; top: parent.top; bottom: parent.bottom; leftMargin: 10 } font { family: "Nokia Sans S60"; pixelSize: 24 } horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter color: "white" smooth: true text: formatTime(playPosition) } Text { width: 90 anchors { right: parent.right; top: parent.top; bottom: parent.bottom; rightMargin: 10 } font { family: "Nokia Sans S60"; pixelSize: 24 } horizontalAlignment: Text.AlignRight verticalAlignment: Text.AlignVCenter color: "white" smooth: true text: formatTime(duration) } Image { id: progressHandle height: 46 width: 10 source: mouseArea.pressed ? "qrc:/images/progress_handle_pressed.svg" : "qrc:/images/progress_handle.svg" anchors.verticalCenter: progressBar.verticalCenter x: seekControl.duration == 0 ? 0 : seekControl.playPosition / seekControl.duration * 630 MouseArea { id: mouseArea anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom } height: 46+16 width: height enabled: seekControl.enabled drag { target: progressHandle axis: Drag.XAxis minimumX: 0 maximumX: 631 } onPressed: { seekControl.seeking = true; } onCanceled: { seekControl.seekPosition = progressHandle.x * seekControl.duration / 630 seekControl.seeking = false } onReleased: { seekControl.seekPosition = progressHandle.x * seekControl.duration / 630 seekControl.seeking = false mouse.accepted = true } } } Timer { // Update position also while user is dragging the progress handle id: seekTimer repeat: true interval: 300 running: seekControl.seeking onTriggered: { seekControl.seekPosition = progressHandle.x*seekControl.duration/630 } } function formatTime(timeInMs) { if (!timeInMs || timeInMs <= 0) return "0:00" var seconds = timeInMs / 1000; var minutes = Math.floor(seconds / 60) seconds = Math.floor(seconds % 60) if (seconds < 10) seconds = "0" + seconds; return minutes + ":" + seconds } } VideoBasic.qml000066400000000000000000000037441225012771600365620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneBasic { contentType: "video" } VideoDrag.qml000066400000000000000000000037431225012771600364150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneDrag { contentType: "video" } VideoDummy.qml000066400000000000000000000053441225012771600366320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 // Item which is loaded by VideoItem if Qt Multimedia is not available Rectangle { id: root color: "grey" height: width property int duration: 0 property int position: 0 property string source property real volume: 1.0 property real playbackRate: 1.0 signal fatalError signal sizeChanged signal framePainted Text { anchors.fill: parent anchors.margins: 10 color: "white" horizontalAlignment: Text.AlignHCenter text: "Failed to create Video item\n\nCheck that Qt Multimedia is installed" verticalAlignment: Text.AlignVCenter wrapMode: Text.Wrap } onWidthChanged: height = width onHeightChanged: root.sizeChanged() function start() { } function stop() { } function seek() { } } VideoFillMode.qml000066400000000000000000000062461225012771600372340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Scene { id: root Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: "video" source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } Button { id: button anchors { right: parent.right verticalCenter: parent.verticalCenter margins: parent.margins } width: 150 height: root.buttonHeight text: "PreserveAspectFit" onClicked: { if (!content.dummy) { var video = content.contentItem() if (video.fillMode == VideoOutput.Stretch) { video.fillMode = VideoOutput.PreserveAspectFit text = "PreserveAspectFit" } else if (video.fillMode == VideoOutput.PreserveAspectFit) { video.fillMode = VideoOutput.PreserveAspectCrop text = "PreserveAspectCrop" } else { video.fillMode = VideoOutput.Stretch text = "Stretch" } } } } Component.onCompleted: root.content = content } VideoFullScreen.qml000066400000000000000000000037521225012771600376020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneFullScreen { contentType: "video" } VideoFullScreenInverted.qml000066400000000000000000000037621225012771600413040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneFullScreenInverted { contentType: "video" } VideoItem.qml000066400000000000000000000056101225012771600364310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 VideoOutput { id: root height: width source: mediaPlayer property alias duration: mediaPlayer.duration property alias mediaSource: mediaPlayer.source property alias metaData: mediaPlayer.metaData property alias playbackRate: mediaPlayer.playbackRate property alias position: mediaPlayer.position property alias volume: mediaPlayer.volume signal sizeChanged signal fatalError onHeightChanged: root.sizeChanged() MediaPlayer { id: mediaPlayer autoLoad: false loops: Audio.Infinite onError: { if (MediaPlayer.NoError != error) { console.log("[qmlvideo] VideoItem.onError error " + error + " errorString " + errorString) root.fatalError() } } } function start() { mediaPlayer.play() } function stop() { mediaPlayer.stop() } function seek(position) { mediaPlayer.seek(position); } } VideoMetadata.qml000066400000000000000000000105101225012771600372460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType: "video" Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: "video" source: parent.source1 volume: parent.volume onInitialized: { if (!dummy) metadata.createObject(root) } onVideoFramePainted: root.videoFramePainted() } Component { id: metadata Column { anchors.fill: parent Text { color: "yellow" text: "Title:" + content.contentItem().metaData.title } Text { color: "yellow" text: "Size:" + content.contentItem().metaData.size } Text { color: "yellow" text: "Resolution:" + content.contentItem().metaData.resolution } Text { color: "yellow" text: "Media type:" + content.contentItem().metaData.mediaType } Text { color: "yellow" text: "Video codec:" + content.contentItem().metaData.videoCodec } Text { color: "yellow" text: "Video bit rate:" + content.contentItem().metaData.videoBitRate } Text { color: "yellow" text: "Video frame rate:" +content.contentItem().metaData.videoFrameRate } Text { color: "yellow" text: "Audio codec:" + content.contentItem().metaData.audioCodec } Text { color: "yellow" text: "Audio bit rate:" + content.contentItem().metaData.audioBitRate } Text { color: "yellow" text: "Date:" + content.contentItem().metaData.date } Text { color: "yellow" text: "Description:" + content.contentItem().metaData.description } Text { color: "yellow" text: "Copyright:" + content.contentItem().metaData.copyright } Text { color: "yellow" text: "Seekable:" + content.contentItem().metaData.seekable } } } Component.onCompleted: root.content = content } VideoMove.qml000066400000000000000000000037431225012771600364460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneMove { contentType: "video" } VideoOverlay.qml000066400000000000000000000037461225012771600371640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneOverlay { contentType: "video" } VideoPlaybackRate.qml000066400000000000000000000067261225012771600401060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property int margin: 20 property real delta: 0.1 property string contentType: "video" Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: "video" source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } Button { id: increaseButton anchors { right: parent.right bottom: decreaseButton.top margins: parent.margins } width: 90 height: root.buttonHeight text: "Increase" onClicked: { var video = content.contentItem() video.playbackRate = video.playbackRate + delta } } Button { id: decreaseButton anchors { right: parent.right verticalCenter: parent.verticalCenter margins: parent.margins } width: 90 height: root.buttonHeight text: "Decrease" onClicked: { var video = content.contentItem() video.playbackRate = video.playbackRate - delta } } Button { id: valueButton anchors { left: parent.left verticalCenter: parent.verticalCenter margins: parent.margins } width: 50 height: root.buttonHeight enabled: false text: Math.round(10 * content.contentItem().playbackRate) / 10 } Component.onCompleted: root.content = content } VideoResize.qml000066400000000000000000000037451225012771600370030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneResize { contentType: "video" } VideoRotate.qml000066400000000000000000000037451225012771600370000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneRotate { contentType: "video" } VideoSeek.qml000066400000000000000000000053451225012771600364270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Scene { id: root property string contentType: "video" Content { id: content anchors.centerIn: parent width: parent.contentWidth contentType: "video" source: parent.source1 volume: parent.volume onVideoFramePainted: root.videoFramePainted() } SeekControl { anchors { left: parent.left right: parent.right leftMargin: 100 rightMargin: 140 bottom: parent.bottom } duration: content.contentItem() ? content.contentItem().duration : 0 playPosition: content.contentItem() ? content.contentItem().position : 0 onSeekPositionChanged: { content.contentItem().seek(seekPosition); } } Component.onCompleted: root.content = content } VideoSpin.qml000066400000000000000000000037431225012771600364510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 SceneSpin { contentType: "video" } main.qml000066400000000000000000000173661225012771600355030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/qml/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root width: 640 height: 360 color: "black" property string source1 property string source2 property color bgColor: "#002244" property real volume: 0.25 property bool perfMonitorsLogging: false property bool perfMonitorsVisible: false QtObject { id: d property int itemHeight: 40 property int buttonHeight: 0.8 * itemHeight property int margins: 10 } // Create ScreenSaver element via Loader, so this app will still run if the // SystemInfo module is not available Loader { source: "DisableScreenSaver.qml" } Loader { id: performanceLoader Connections { target: inner onVisibleChanged: if (performanceLoader.item) performanceLoader.item.enabled = !inner.visible ignoreUnknownSignals: true } function init() { console.log("[qmlvideo] performanceLoader.init logging " + root.perfMonitorsLogging + " visible " + root.perfMonitorsVisible) var enabled = root.perfMonitorsLogging || root.perfMonitorsVisible source = enabled ? "../performancemonitor/PerformanceItem.qml" : "" } onLoaded: { item.parent = root item.anchors.fill = root item.logging = root.perfMonitorsLogging item.displayed = root.perfMonitorsVisible item.enabled = false item.init() } } Rectangle { id: inner anchors.fill: parent color: root.bgColor Button { id: openFile1Button anchors { top: parent.top left: parent.left right: exitButton.left margins: d.margins } height: d.buttonHeight text: (root.source1 == "") ? "Select file 1" : root.source1 onClicked: fileBrowser1.show() } Button { id: openFile2Button anchors { top: openFile1Button.bottom left: parent.left right: exitButton.left margins: d.margins } height: d.buttonHeight text: (root.source2 == "") ? "Select file 2" : root.source2 onClicked: fileBrowser2.show() } Button { id: exitButton anchors { top: parent.top right: parent.right margins: d.margins } width: 50 height: d.buttonHeight text: "Exit" onClicked: Qt.quit() } SceneSelectionPanel { id: sceneSelectionPanel itemHeight: d.itemHeight color: "#004444" anchors { top: openFile2Button.bottom left: parent.left right: parent.right bottom: parent.bottom margins: d.margins } radius: 10 onSceneSourceChanged: { console.log("[qmlvideo] main.onSceneSourceChanged source " + sceneSource) sceneLoader.source = sceneSource var scene = null var innerVisible = true if (sceneSource == "") { if (performanceLoader.item) performanceLoader.item.videoActive = false } else { scene = sceneLoader.item if (scene) { if (scene.contentType === "video" && source1 === "") { errorDialog.show("You must first select a video file") sceneSource = "" } else { scene.parent = root scene.color = root.bgColor scene.buttonHeight = d.buttonHeight scene.source1 = source1 scene.source2 = source2 scene.volume = volume scene.anchors.fill = root scene.close.connect(closeScene) scene.content.initialize() innerVisible = false } } } videoFramePaintedConnection.target = scene inner.visible = innerVisible } } } Loader { id: sceneLoader } Connections { id: videoFramePaintedConnection onVideoFramePainted: { if (performanceLoader.item) performanceLoader.item.videoFramePainted() } ignoreUnknownSignals: true } FileBrowser { id: fileBrowser1 anchors.fill: root onFolderChanged: fileBrowser2.folder = folder Component.onCompleted: fileSelected.connect(root.openFile1) } FileBrowser { id: fileBrowser2 anchors.fill: root onFolderChanged: fileBrowser1.folder = folder Component.onCompleted: fileSelected.connect(root.openFile2) } function openFile1(path) { root.source1 = path } function openFile2(path) { root.source2 = path } ErrorDialog { id: errorDialog anchors.fill: parent enabled: false } // Called from main() once root properties have been set function init() { performanceLoader.init() fileBrowser1.folder = videoPath fileBrowser2.folder = videoPath } function qmlFramePainted() { if (performanceLoader.item) performanceLoader.item.qmlFramePainted() } function closeScene() { console.log("[qmlvideo] main.closeScene") sceneSelectionPanel.sceneSource = "" } } qmlvideo.png000066400000000000000000000065101225012771600337460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo‰PNG  IHDR@@ªiqÞbKGDþþþëÔ‚ pHYs__]™Ý‹ vpAg@@êóø` LIDATxÚí›kl\ÇuÇsïÝ7¹\>D­DQ/“z8‘åÈ’kÇ¢lɱÑÄA]–]$(Ð*mShÑ©áuChaÔ(ò!pÝ"Aò©­‹1(±“Ö•S'†­rb;²©ßåcß{ï=ýp—»¼ûâ’\ZÊ?°àræÜ™sþsfæÌ¹³ðÿªbé©^¡‰¤èèô†Ž‰öítMÙ Ó f€ˆŠþ¾ÿ¾Õ¶4€Çp?p8©`ÿ®-¾È}ÂÁîN¯ÏëѼ€sÀpÈ®Ã"L‹ÈY¶éóèô÷½~«m¬“€/õ‚ЂâY„/MŸÜäá#ZštDj¶c –'æȨ„«(†A¦@-Jš„šè¿ï¿nµíKXtyèžA0¶mòòÔƒ´„tlªÍ–e`)‡u ¸ € 7I„4;‡(úûÞ¸eÜ üج)xôhŸÚ¶Å%êÌ•ÿ»´¼ˆ‡™5\/àˆÜP0™³˜7tÉjšâkGϬŽë<ü ­Í¿÷ÙMDš×/õ„U{Æ]$ ÆYcÆK‰nÀ"€þck#ÆÈëáŽ,Fšt‚þåæ}%ã+yE-OQ• ùO8¸¤‘ 0Lÿ‹R L­ÉzÀÈÿõ­‹…C¡k•ÄU•ïË•IÂVä9 gü@§C×j<@ÑLµT£J#+u5X]ÿJK•ïËBª·¹2…oËö¯ª–*¶¶Ø”Îm¥47·uµ/5ê õ¸×T |.k âi‹ÉXŽ€ÖNOçmlkòÉZ béQ¦R7HdcΓJ«Ðnýd»ôZ‹CºXll©Ë@–-¼?˜àƈŸÇïxŠß¾ëv´oÃïñ¢”BrVš™ô¦Þä½ñטˌW ¡h‘ˆ y%4¥/±T-éYjs´bv_{3-á_Î2>ÞÂןúŸ½ã~”R%Ò ¯ ºhh7{Úîå'Cÿĵ¹÷ó²*o´âìùy‚z”?ý̰Uš±Ä±³ù)¥ªêÑh+]KpîRœóð÷=Íç>Pf|¥§¶6ïå·z¿BWó>DìIé¬Í»ð›½ÝþÇwü>÷vDWæç5 ¨kw”‚ÉÙ¿xŽ'?£‡*“\ÈNrúü¿òÜ^à??|Ó2 uínNì8EÀF”‚Ù“…¤Í‘ÝÐ5miwué´vêj\Š5À«Z8uì$†n¸¤’¹9N_þ:ïL~“wÆ_æw¿õüÇÙÓ.™]‘Cìoïs¼@ÁX,‹G pçöý+T}‹ÖÊ PKâ)‹®'¸¯÷.tï+“ùhúM.ÅÞÁÐ5ïm!Ió«ßbtv¼Ø¡Òùä¦ñé!,KžHmî góÎ%ô ¶XØbç§K5C,Ç·‚ñX޹¸Í‰ý÷à3¼®z[,cïb‹‰¦t<†âöMüø­+¼=ðþÍ‚l4ÔËå3 ø“£_!d´Òn/Ô=-ìŽ"™›#c%‰¥G±$GíX¡aTŠÎœŽG¦²ø ‡v|¢ì©´g:u3ô8ò›Û< ™œ»ökAO3v3>ù!OzŒæ@“«­ÎÐ.žÜß%s™q^>ÿ,3©á’Åvݦ@i'Îÿ¶ÀD,˦¦6ºÛ·V `¤9_ ) ði L^Dz-—üÁî}x4JP( ͇O0ÂKb‚Zº®•€eÚÊ™B,ž#ÚÒA$®@@‚œ•.Œ’x EЧ19?CÖ̹äoß¶‹pØæµÎpczÄU—53LÆÇ‰%§‰gæ±Åb½°ÌYÀ‰ÂTž€TÚ¢sK~¿L2c%óó´]Sø¼séY+G€âs{»¢ôìÌpê;OóOþ5tü‹…ºÑøe¾÷Ñ? b£k kªŽXcµT< ” ¦%dL!lƨ຦dó‘[šC#™M‘ÍeS~~#„Ï gç°l÷s¢LÒ2AÎNƒ­\ëŠ{pÖŽe¡bÇ–-X¶ð*ކˆ]ˆã] ë Ó41mÓU®+†òTUL¡å?9öVCÝÛ ˆ B1Z+e›™T lÛÂ.eMihªV÷ËåCJݬ¦[µdG¨X[s^/×ÓºÅUÔQ ¥À´+¯Èºf”)½¨¢¦ieÆ öW÷Æx@ÝÛ ®)tM‘ʦ‘ ÙRMéK2?Å3¶e º¦£—,œ¶XXbr«Q$ Ö. Îbæ5sÉxYP`(Z!ÙQŒLSð^ ݽà™vÓÎ.Ï|Uµ„å^W­Œ€ªPà1 àÓ™JÌ’1³eR^=˜?ɳr¦M“××p6ãä¬ôê5oÐæP ]LÌO3ŸŠ—ÕûÝŸŸNeYB:kÓhÂ[rtŽgcäìtå„éúçAVN€®):Z¹R&å×CDüQ„Åt—“?Èd…žÎí%ÉPa<1èœõ¥f—Ëêô1PÜË£í^<›·ΕI隇®¦½.—›É¢ã-;>'ssŒÄ/UdžîE) [l,Û¬°ë(µÔí"Î;Ãí>Þ¸p–‘Øx™dOëÝ„<­€M&'üz0έ{8²ûN—ÜÈÂE¦S7 gЬå>Dµºèôdb´ænZ}ÝÏj4êÈ + ]qGOƒSWùÉ?+“Œ6õrdë£`{8{~Žlª…¯~þ]ÙKL>˜â¹béâÙlì¯ÔÖJÀŠ¡Ý]~šC:?¿ø]®ÿÛ%ž¼ë$Ÿî=Lg¸Ã%2x{ø{ürü5æ2K Y\\!¿NÏ6[Æœ-ö¤T!/Pa$BÀªiMŸ¹;L{×Ež~åþàÛÏ0—œwÉeÌ¿šø)³™±’Q,Î=üE, Mé…Ïz¹}CX$A¡èlõ±e“Î/Þc`üªK¦Å×É':@SF…ûK±¢=ÝDa5ö,°–¸Bà¶®‰Ü¯ŸËm–Òèëþïù+Žv}¿Þ\1u¶BÜf×n~éqx•zÙ]^vmññò;?âæÌ¨«Þo4s óAŽlý<>#¸úŽŠø9¨Dc X#<ÅýŸŠ0¿Âó?ú—Š'ÆjÞFY,«F’Ü^èï[ûÝAwZ| o›D`k‡—ÇhçÜÅÓ|õû1ž8ü({¢»úü˜v–‰Ä ¦q2¥®›¥ Ъs1 ê Þo\N°!í8ƈÀ–v/›ïñO½Ç«×?äí©0~K2d¬¦-IÕ“üT€Lßõ"ˆ4êvº;X5E#Dœý;tnxde–L&/¥JWÚŠÆ›À0 rç†èEPÿœÌF^Í/àrÿÒ7Äõ\]:‡Ôâ“#U ãÜö¼IñJìâÕûQP1œËÖ ñêTݛ꽤TuþZ%†漜7t d! Jú}¼?¼X$ ¼ Ü„k?RÕ#ò†Ê40 j(o䢡£À ±ÁOß««±• øöe8Õk/¿Úª?¢,œGLãü8bÐ1R®CŽñÄI€²QIúûÞ¾ÕvÖ È“`ßÄ"nèê6ãxÆLÞ¨!Š®;2jT ›^èïZŸ;ýë ÷„ýR/|T;þܾûï;ÐÜmj0oü4ÀÐ-29úxãVë½ l`ØÀ6°µâÿŸUÑejÀq %tEXtdate:create2010-08-31T10:37:54+02:00~½ö­%tEXtdate:modify2010-08-31T10:37:37+02:00øg] tEXtSoftwareAdobe ImageReadyqÉe<IEND®B`‚qmlvideo.pro000066400000000000000000000005611225012771600337620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideoTEMPLATE = app TARGET = qmlvideo QT += quick LOCAL_SOURCES = main.cpp LOCAL_HEADERS = trace.h SOURCES += $$LOCAL_SOURCES HEADERS += $$LOCAL_HEADERS RESOURCES += qmlvideo.qrc SNIPPETS_PATH = ../snippets include($$SNIPPETS_PATH/performancemonitor/performancemonitordeclarative.pri) target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/video/qmlvideo INSTALLS += target qmlvideo.qrc000066400000000000000000000054501225012771600337510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo images/leaves.jpg images/close.png images/folder.png images/titlebar.png images/titlebar.sci images/up.png images/progress_handle.svg images/progress_handle_pressed.svg qml/qmlvideo/Button.qml qml/qmlvideo/CameraBasic.qml qml/qmlvideo/CameraDrag.qml qml/qmlvideo/CameraDummy.qml qml/qmlvideo/CameraFullScreen.qml qml/qmlvideo/CameraFullScreenInverted.qml qml/qmlvideo/CameraItem.qml qml/qmlvideo/CameraMove.qml qml/qmlvideo/CameraOverlay.qml qml/qmlvideo/CameraResize.qml qml/qmlvideo/CameraRotate.qml qml/qmlvideo/CameraSpin.qml qml/qmlvideo/Content.qml qml/qmlvideo/DisableScreenSaver.qml qml/qmlvideo/ErrorDialog.qml qml/qmlvideo/FileBrowser.qml qml/qmlvideo/main.qml qml/qmlvideo/Scene.qml qml/qmlvideo/SceneBasic.qml qml/qmlvideo/SceneDrag.qml qml/qmlvideo/SceneFullScreen.qml qml/qmlvideo/SceneFullScreenInverted.qml qml/qmlvideo/SceneMove.qml qml/qmlvideo/SceneMulti.qml qml/qmlvideo/SceneOverlay.qml qml/qmlvideo/SceneResize.qml qml/qmlvideo/SceneRotate.qml qml/qmlvideo/SceneSelectionPanel.qml qml/qmlvideo/SceneSpin.qml qml/qmlvideo/SeekControl.qml qml/qmlvideo/VideoBasic.qml qml/qmlvideo/VideoDrag.qml qml/qmlvideo/VideoDummy.qml qml/qmlvideo/VideoFillMode.qml qml/qmlvideo/VideoFullScreen.qml qml/qmlvideo/VideoFullScreenInverted.qml qml/qmlvideo/VideoItem.qml qml/qmlvideo/VideoMetadata.qml qml/qmlvideo/VideoMove.qml qml/qmlvideo/VideoOverlay.qml qml/qmlvideo/VideoPlaybackRate.qml qml/qmlvideo/VideoResize.qml qml/qmlvideo/VideoRotate.qml qml/qmlvideo/VideoSeek.qml qml/qmlvideo/VideoSpin.qml qmlvideo.svg000066400000000000000000000145471225012771600337720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo image/svg+xml trace.h000066400000000000000000000061501225012771600326670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TRACE_H #define TRACE_H #include #define ENABLE_TRACE //#define VERBOSE_TRACE namespace Trace { class NullDebug { public: template NullDebug& operator<<(const T&) { return *this; } }; inline NullDebug nullDebug() { return NullDebug(); } template struct PtrWrapper { PtrWrapper(const T *ptr) : m_ptr(ptr) { } const T *const m_ptr; }; } // namespace Trace template inline QDebug& operator<<(QDebug &debug, const Trace::PtrWrapper &wrapper) { debug.nospace() << "[" << (void*)wrapper.m_ptr << "]"; return debug.space(); } template inline const void *qtVoidPtr(const T *ptr) { return static_cast(ptr); } #define qtThisPtr() qtVoidPtr(this) #ifdef ENABLE_TRACE inline QDebug qtTrace() { return qDebug() << "[qmlvideo]"; } # ifdef VERBOSE_TRACE inline QDebug qtVerboseTrace() { return qtTrace(); } # else inline Trace::NullDebug qtVerboseTrace() { return Trace::nullDebug(); } # endif #else inline Trace::NullDebug qtTrace() { return Trace::nullDebug(); } inline Trace::NullDebug qtVerboseTrace() { return Trace::nullDebug(); } #endif #endif // TRACE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/000077500000000000000000000000001225012771600320335ustar00rootroot00000000000000filereader.cpp000066400000000000000000000045661225012771600345750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "filereader.h" #include "trace.h" #include #include #include #include #include QString FileReader::readFile(const QString &fileName) { qtTrace() << "FileReader::readFile" << "fileName" << fileName; QString content; QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); content = stream.readAll(); } return content; } filereader.h000066400000000000000000000040641225012771600342330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class FileReader : public QObject { Q_OBJECT public: Q_INVOKABLE QString readFile(const QString &fileName); }; images/000077500000000000000000000000001225012771600332215ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofxclose.png000066400000000000000000000034071225012771600350400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/images‰PNG  IHDR00Wù‡ÎIDATxÚÕšklTEÇO·Ým¶Th‹""ÃC±HHxÈ#ð‰¯èBŒ ø"ˆ¨5ø(‘€"bQ!< † ‰Ô¤¤ž5CAˆØ´ÝmwýŸ½3qîÜÙ½Ó·0Éé½»wöÞÿoΙ3sgšExÉêi™È ƒ È pvvÖÑ]€BØ*Ø«°þ¯BÜí‚m„Ýê À ØnØãÏàÏØ@X–MŽKüLÖ#Ñ„1qìHñYZ§8róWÁ.:·¸#ò¸ À‹°c}‰Â‹q2 ‚剣j¹âÔ¾S?si‡EÅQ=jç1í;þ\Û»KÔ*ö×tüÌÚbþ}œ ­ÿ„&ýÚÕ#[\9·ùÌžh„ÕÁ.þ€µ8}b¤`4¼Ûñ²8™&B!®<$Õ¹ßõîüŽ-v…œŽ°ÇÑø&lg*€2´ô¯qòЏØSâÕ#‡ïyØ[NhíÃaQ*€ªÁD%gpRôˆïç,ô5Øu‡eL*€Ú¢•ZlÊ|âÖd~uL±ßDÿe$Y‡Ÿý6%;uèf€IøEÏ•‚”¹€Å_‚ý£5à;N(ùœÔ~˜Iñ²p ­0²1 Ú ‚Ü® fX¼,<µ(ZÞµ8¦PsÉ1Ý=¢ÀäÉH í?ƒnS—J @ÒR 0¹?}™=ê©Â½µYÑòYôR CȉPÞÉ“”=~¼Óñ¢öEÈl­­vâÃaÊ-+£ì9s’:Ï£¶©SÑÜ-é¶lŽ;„²µJÁÅ‹)¼m›ë»Ž£G©uþ|Jø@dA|xÿ~Ê™9Óõ}Û’%ÕîY-< µ|hð“;Åé¹K—Rx˸ î§`ñ½ >¨‰çÒºlµoÝjZV°@€CšúÓŠ‹© ²’²qô@9B- x X|¤¼œ‚³fy~ÓÙÐ@ãÆá¨¨!´Êà æ?jõ«¨ ì¢"ϵ( šŸñ!“ø›7éïéÓ)«¦ÆsMH€:?€‰@=|}äHpâå˜ N'.›!l: þö´i¨­5Ž3Œ¤†ÐG¶?“{>bðD1q)öƉt@jùÄ`&>ÕD™GØ'!>bßñUÈ6\Æ ;å Zñgš¹ÈbŸÚŒÀnM¼ €ÅFØD aÃâGžTW;B1NŒÅ8a„@8]7̸\Ô<ð%׈üviâu€¬¼<‚–ÏO!þ7´|>ò¼œÅòËy3Ɖ )<Ñ ˆk쉶6€Ú‰7ٌҀÂuë¨híZVˆ?‹<_€<¯OÁ“+m'&bœ n®_O·pßT pÅà[ÍZ¥¡PÁܹñgÐò}ÐòÆWPr^Лà‰RxB‡hYx¹ûsoÁKõSb·+ݱ¸#8™n®:åmVÞõªÐ…úmtójÞëÔ³Ýß‘3 êÒF·Zxjót†!¤xÞ ìö¿<呸¤mvÆ¡IEND®B`‚folder.png000066400000000000000000000034611225012771600352060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/images‰PNG  IHDR szzôsBIT|dˆ pHYs~~EúüŸtEXtSoftwarewww.inkscape.org›î<®IDATX…½–ilT×Çÿç¾7û>^À3Ûãï{À)¶q3€£’5‚4RM©[’,mS)R•¨”ÒH‘HÝT‡$-¥$M-R”D)1[ê”ÔÂ…€<6¶™ÅãñÌ›ÏrûÁ66fL<%íOz®î{çýî9ç¾w‰s޹Ú•ùÏ ÚZ½^­y<þ¡³g.nï¾ã{@œ= "SssåÇ?yêáeK²Ó&³r¹ðJùii†ÌfýZ¯×önA-–ôM¥eyÏ(Þßï:òù玣œó¯ðû†ºâ‚Â,Ò›äPªf¦YÔ+«4Dø`Ñ"óÆ‘ï?æ#"劕EÇÚÚì ¹¶L9@ókGF|/lÜ´Ò{úÔ…Ÿ/pñn!Ϩ7f4ÕË)ô{ ÒH`1B^¾Z«ÕòxEEþK==W÷H+)ÉÛ¼eKÓóõß(Ò-/ÎbZƒ ÅX8lQ•d[—,Éè.)ÍûMï…kÏÍ'öOˆL'«_±>ŸÎk<…½ˆs7[XÛR¦Ê_fÝõà•¡§9ç\§S‘9M'ËÉË3³Ô+pžÈ• r%ƒVo‚ÁX¡²ZÓ~V^qßÒž_ý~R@ Åc£Ñ£±òÖd @ä‚^ëa6Û°ŠÃ &$ “3¨4€&&Iª Ì2T¯È‘ùý5ØlY'ûú†^½£R0‹O ÌE«Õ¢¨¨ìÖX’$8Œú†!I„ƒ.à±xÒç@ºú<¥×ã߯өÿEÓÛˆ–x¬¨8ûç‹U•›{?ÊJ«ÐÐЈòòòyÎ&‰À9à€ÛsAɃpÄ…hâ»sAÃŽüéÔPdÚ´©Éž›—¦4™5¢Ù¬…$Eàº9†+W\¸ti«›ZÐÖö8ÒÓÓ$ÑhƒƒNŒ¸œÜÂ7‰¼¸ç¸—l6Ëk{~ýÔ6SzˆM7Î\q—¿pãýP]½ ;wþjµzÁ"ÓÄb18}8×ýpæÁާ;†cB«Á<ÿË€ 1ñãg¡Õ¹ÑúмòJ;âñùk Qa±,A,ª@p\8óu~Ú}yAˆ(«LÇÎÝë04ò)š›ëÑÙÙ™’„  ‹ÅÁÁÁ\7ýûþúæ'ž”‚ˆ <¸ÊŠ»×£«ë(¾¹¦‡#u0Îyïu‡Ë36&¥´Pª8Z6ÚðÄ“õxâÉ­8räpJ€P8ºÿý=á” ¦HËaçn;þÙý.ÚÚC(š÷^"@ˆÅàÄ z÷Øù±ÿVˆE±¡µ MK±®¥½½½óÞËH@<>Ùô 8çþÈD¬ûòC÷â€D"k6ó¿ø6žaÚÛ_N.Klª¦Jn—ïÛo¥ÖŒó!È‚øÁšÑ×w{÷îIf€ød f8ç]—.½î‰;OI©2õ£õ[¥îÅÁƒn››)Á¬ @ ê¸òåM8¯…àqM :Ï_m¡D&xxK Îö:;ÿ6#À¦èvññЋ¿Ýwô³Ã‡?äƒ> ö‡1r#‚”Úo6¡°ÛmıwÞÀ©S]&·â¤»ý<À9÷¨"¢Œ3g.þ®°0g³}C­—kLΠ7ŠÐêD¥&n`ûã-صcºº>(ʦˆÍ=L‹¸l!"êé¹úŒÍ–õËU ¥ÚXŽQ^„Þ Bn  ¤4ÝÝÝ·2@Ä@ÉŽåÉ ¢•™†ƒÕU÷¯k©!­F N„Þ(B¡`_€óº}8Œ­ÛÁÉ®·q¨ãWÒ $ƒs~Àr"2<Ù³¿¸8÷»ëíµÂÒìÅP( FÔZá®1²sô=I’¦•B’AD?ÌÏ·þª©©L_SS¹\˜ì½Æ’—çÌi†e0šcxãµ÷Ü÷$0K¤*#ÓÐQW[Xºv]5iÔ*èô"tFd²ÛE"á8þÐ~E¥9øãë'¾Y"z¥RöRYù}Ú×׊Vk&Ԛɬ(U3å9qüK8Ý8wº÷ë˜#³½ ÀºoõêJcUÕ2(“ «Ñ‰p^ÇïÛÿ·Ëï^p¦ çü€DT¶x±©£®®°rÍšjR«Ðh•0™´ðzÆé–¹‘V¥–ï«(Ïßn·×о± þ|øc?8çÿ÷‹ˆ¾g³-rËåâÄϦõÿ¿ìFŠIEND®B`‚qt-logo.png000066400000000000000000000331431225012771600353150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/images‰PNG  IHDRôxÔúsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ  6éüä IDATxÚíÝ{xTå¡ïñd2H&‰$ $äÂ-(` ¶ZÚ‚Z´­—ª½X±íi­õ´b{ºÕÝ›x´ÝÝí®x«Ý¶T¶ZtcÀT‘ ÷{.$0 1d&0d’p9”KÖ"3³Öšïçy|ª…7³Ö»fåý­w½ àX}¨˜rLjRI^I*—.IeãG$+=-A’Ò$•žç'ÔJªëþ÷rIùÓ—WQ±@@äqïÇê“z·§üûÉ¿››åÖ°ìdåû’”‘ ·»ooUUw8X×ý¿µó§//çbçoÐOmØó$åŸò·Ê I<‰š’›¢¢¡ÉÊ’«³«íþgÁñÞà—u7èã»üü^ûÙI}UšãQéð”X6ú  û ÿIWwÿoï!<‰ú\QªÆHîí®ýh èøë„*kP%©jþôå¾H@°KÃ[$ý ÿÕ%i*-r;½6 @°t£Ÿ/é6IótúÀ¼Þ•ÔW³Æ¥kjIJ¼×ø©Á ¨ã3jçO_^Ë—Ñjøênü#jjQšf”ö·{W4”ë£i‹ôjÃï•t_wãÙ‹îIÔW/Ͱúà>‚ßøß&é׊dW?OýÑtêZUÝÁ€EŽp²áÏ—ô´LÌÍ7,©¯®™˜ƒü@à©_:ÞåÿÍ™™ò L¤Þ- šZ×fg&°–€Cÿ§…A~’”‘îÒ7>w]þöT+9@pDÃï•ô¶Î¿QN¯(- ÏMN¥ñ' †iwãïÆÇ•Ð53¼Ô{9Ô~$âîÇ"G4þ€$V?@p~㟑îÒ½×dQï0 Zƒ‡ƒéi åb-€{6þ øC/)‹X¿ñWR_Í›­ô´ê€5þ^IHÊÖGÞve6Kû"ÖÁ 9q>P”¦úIRÙ¸t•MêO½ÃŠXý ÄMãµE~$)7Ë­¯}ñ"êvÖ2vnü¯‘ôrÔ>÷þpžZ±È@°Y㟯ãïý£6ÖÄLM-I¡îA0@ˆax[ÑØÕ¯óýÓ‚‹€˜4þ·éø¶¾QèàœXý D¼ñ÷JªQ»þYêèÕ`ÀZ ÀT˜/é¡h~ä¼¹>þ½¯\,rzØøçw?ýG OÿÁ Ä>DuÎ?Oÿ€å‚«‚ÀÓäÊñèÆ+2¨{ÀÚXýžþ{#ÿçƒÚ=…7T”S- Ø«ñúÈÿ>žD=tý êpžZ±È¶ ÷Iúu4?’Uÿ‚Á€Ø€Eq«_‰ÁNÁ¶#Ui©ýXä€(6þ¥:¾æÔ°ì/€`õCÂ#¥q_öN.ìO­8¯ŽïGRvêÿ9ÿË? Ê+Ö–{u-UFŒõÐýÀ)ÊÅ"Gô¨ñz÷?£ÿ  Ú8$ƒ > N®kÀ"G†W=ƒùÿ¬ÿçôñEŽÊc@@¤’iT ÊäòÀ9||õÃrI3©–žéKôèé¿”Jâ3eF]þƱTF€€Þ—‘Î@¬Íˆöz¹4   @@@@@@@@€€ì+*Œó7w©£ó˜jý’¤]Má“Vè:žµì„>¥&{4Ä;H9Ù’¤Ô”T•ä;íïÍž4û´ÿn9Ô `{ãÉÿ® VI’áf;èð+ØÕÂÅ@z«±¯ów©±µS»[;µ¿µ£Gå’].]9t´F¦±yź¸àb-6}™)9ÊLÉ9ùß…™“Îø÷ö¶mU Ý¯¦Ð.ÕµmPSûN…„¹À¹´«Îߥ-õíÚ¶¯ýœOógjð¯,™¡²±eÔØ_ˆÁ©EœZ¤1šyZïAÓª nÐî¶*5†ë¸Ð@{ûQ­ÛÖêêƒ=~Â?Ñè_;òSšuñåºyÆÍ–=¿½c²gž u­hûþUª;XE@âËÖê}°+¤m !CåÊr‡ëºÉ_ÔÝ_¸Û–ç}"L2G’´¹émmkY¥íÁ Â@œ«jk»^]Ô±P—á§ýæ~7fÝû‘2&{¦ÆdÏT¨3 mÍïh}ó[ª;¸‘/ @â»áŸ7u¶æÍ¹W¾tŸ£ëÇ“äÕ„!s4aȵjÐÊÚçè€}m­îÐV¶jø%é¦qÓôó¯þÌñ ÿ™d¦äèKcP¨3 Õ Õꦗ °‡Öàaý­" ú}í†Ê•å×OÿÇ5mô´¸¯CO’W3 ¿®É9×`}å•U¾¡ÕP™d—K¿˜ý-Ûî‹VXYû¬Vï{•J€uø›»ô—´šÎwâ©ÿOóþ#.»ûϼW“sæjÉöŸ3X°)ö€£Tmm×ï–í3Üøÿìó·ëíù¯Ñø™’£ÛJhNÁ}Jî—L…ô±ñÊŠ€ªª*“ìréÍÿõ[Þõ_€ CæhÔÀéZ²íçÚ\E…ôÑÑÞ~TO¼²Ïpã?a OÕ?[Fãß |@M¡]’¤¦PÂG²•3¿3x’¼úҘ䭨•{_tÌym3¸žDAjÚÉe£OÝÎùÔOê ¨éÀÎîp°CáÃ!ÂÍ v6ªãðvq4þ4þö0³ðëJsekIÍãŽøÞýÎË.0œ 3'IÒÉÿ=“ê–JIR ì×ʆçè=4þ4þÖ3aÈy“}úËö‡l½‚`¿Ëp™)Ã/ŽÈ±œÖ7¿E€) „m´·¥ñ·©ÂÌIº¥ø—¶ž!ÐØÚi¸ÌeÅÓ¹ø Úøÿþïnü' ôÑø[ÄàÔ"[‡€uMÆz/’].¦˜‚\¨W*†§ú¤¦iéý¦ò¬5xØðN’S³r¹à ¢¼ò á©WÉ.—žý毙çoÑ0§ðÛê˜M½ÿ/ÏÅ0«vO§áý$鳿E÷«…Éž©9÷Ùæx[€ic.åBƒ˜ÑÞ~T Ë› —»kò,¶óµ Cæè²Á7ÚâX·7Ÿ½0{Òl.2€Z¾ßÔ ¿]ÿ•g3 ¿®QiS-DÍl- V­?¤zƒ«®IÒ‚¯þŒ÷þ63gÔ÷,½w€™÷ÿ£}ÃZƒ‡õ†‰÷þ÷ϸ–÷þ6äIòjÎÈï[vf@ã~ãàÓE“¹° Fý­"`ªëÿÑ[¡òljpj‘®ú-KÛ.ïÿ?Sò.*€U[ÛMuý?|Ý÷¨<››0dŽ%Çý>Nèã5€ííGõÊšý†ËÝ5y#®bΨïYêU@íãËÿŽ4Œ `ÄŠªƒ†»þ“].Fý;ˆ'Ék©E‚jýÆÀ%#'r!a ìKh Öª­AÃå~tùWßÝêoõkÍ®5ªØü5ìoÒž@ã'Ÿ:}Õ“éSIþ8Û÷†ŒÉž©QûÞÒ¶à* Ô½ñP6¶Œ §þV0\¦ 5M?¼Î¹Oÿ¡Î€Þ­~U_{æWç}]^¿óä¿'»ЕCGëË—\¥›gÜlËsŸ3ê{ª[sSÌ·ÞfðýAjšŠ‡sCÃx€˜«ÝÓijàßw¯¸Í± ÿÛÕГknÒ»>«¯}ñ"Í›ëSiပwthñŽ*ÝòìOTøíOé©×ž²]x’¼ºlHlË¿¹Ëð+©qÙÜÐ =õßUm†Ë”åwär¿ïí~QO®¹I+÷¾xÚÓozZ‚®™áÕ¼¹>ÊñôøçÕ´uÏ¢šøƒZZ¹ÔVuqÉÐcº@© €†_Ì ѧÿÙÿÓqOýÞð –íþÃ9»½ÓÓtãºaF–”ÔóÛwm³_s~ûýàY{½2¹¢ v×¹ÑÄûÿËŠ§sSƒDêéÂ@Ÿ£¦ý…:z~ýw z+*téÎ+³”‘î2ôY­X¤«½^þV¿-ê¦0s’òúÉg¯3¸P²ËÅJ” ‘|ú¿ã²ëS{Û¶êÉ57©1\g¸¬o`¢¾ñ¹‹ ‡€Å;ª4û±l挌þ"O­ÁÃ:2ö `jV.75@OTíÀy­Üjüé¿,w¸#–X]ÝðW»Z"ú×Ló~PÓÔ‚%OX¾þ&þRÄ?ÃÌ@Ÿ.šÌ p.þæ.ÃÝ«’tÝä/ÚþÜ[5håÞ#þ9nw_Ó¯6íÞdé:,ÌœñÕw™xÿÿ™’ÏpsƒœËºÆçý'»\Ž˜ú·²ö¹¨}ÖÔ’ó$éž?~Ïòõø)_d{Œ®M1a Ïñ;R‚\°÷ëþ¿vä§ñô¿~ÿ[QýÌ«KÒ —)¯ßiù£NWr¿äˆüìÚ=Æ»ÿGÆ p.[«; ¯®&I7L³ÿÔ¿h>ýŸPZä6Õ ðË¥¿±t]z’¼™™%w[Œ¼däDnn€s€zãÝÿ©i¶Ÿ_ê h{°"&Ÿm¶ bK…¥ëtJNd^Ô˜xÿ_6¶Œ›à\ªB†ËÌ*ºÄöç½­ù Zî7½ÿö÷?ZºN§Ed0à6ƒïÿ“].GÌNˆÜÓµ¹¹ÿ_qÀÆ?ÿô¿ÓÏŸQØßp™6TX~]€’¬+zõçù›» G¯:š›àœÀd÷¿Ý·Wm9ÔЫKþš1~„¹sOÿ÷BK×íÈ‹¦÷êÏk2ñþÊð‹¹¹AÎe‰w«ŸÎgûóÞþá;1?†ô´S«.ª|ÃÒuÛÛ+šÙè²âéÜÜ gãoî25úÖÅ—ÛþÜë‚-q£s݆ˬmö[~0àÈŒÞ fBªÝ{¨@"j[]‡©r7ϸÙþç\e‰ã•ç2UîO+_²týŽØ;Oà­ÁÆC*Áî¨DÚúã‹ÿ\5¢Ôöç½¹émË‹ÛÝW£r<Úfp&Æû5ë,]Çž$¯%çiÕ®Z¸¬ÉPÙûg\«ï]w·‚íڽϯÎÉoj‹çÉ?_µ¯^Ꮃ‡×)…ã¹¹AÎÆÌÖª’3WÕ7XêxFçº €µÍ~mÚ½ÉÒSÝJ²®Ðª];L•ÍLÉQfJŽ 3¥²ÑsÎú÷ü­~­Ùµæ£P[»AWO¾Šଠ¿ËT9' ®j:´ËRÇ“çK4U®|c¹¥ÀñÙ‘]½Ð—î;mA*»/NHŒ@„Åëô?Iª;¸ÑRÇ“ž–`jQ ÷¶¯±t=g¦ä(5Á·÷XÉÀÏ*¯ÿØ“ÿ¤%fò‹ô öâuú_uK¥%kJnŠVm *ónÝË×÷°ÔI’¶Åå=6aÈM2§GßÅ@د`ÇGc%šB5 9(Iê8| ækV€‡03²ZrÆæ*M¡–<®AéÆ{jÚ‚–0d@7ÜYfN2UnoÛV…»Ž‡ƒðáj íÒºæe vµP©à<`ËS寨tuãÁZK—SÇ|zÔeÜp½lpêé¡jŒfª®mÀA€ˆ1³²Z²Ëåˆ÷ÿÁÎFKWzZ‚”dü¶ßToíîu_ºyùV±ÝÄû§l®bµ€§Êõ_èÔùñVż|€‹03ÿôàa¶?ï½m[-}|òoT^oý0mÌ¥Üt±V»§3n‰Ÿ8eUƒ2̰ú¾ÌͰ€F[«:å—x]°ÊÒÇ—ÙÏ\¨ÛWkùºŸ0ÐÇÍÓÐj¼À)¿¼áfK_zš¹É?ë6Y¾î§0 ¦v›£ sĹ[uÀ©r³Œo¼eï.ËŸWqî(n>€€X230'#ÛçÞÔnýs™ý÷4š,^ec˸ùb%žJRøHØòÇèõk›ýÖïZ¬d—‹› Ì­8q˜ý—¶úÀÌÎØ´Ûúã¦fårÄBc«ñõÿ“].ùÒí?ÐêS?ªï>¦ÊÕ쫱ü¹± @@ŒìÙoü€SžÚa¿-Ž3;ÃÜL€º}Öß-nl^17!@@,ÔL¬èsÆ:î§nµjen·¹[¿þÃËŸ[~V>7!@@Lt5\$'Ók„²Í±š™ ذßúÇ ›IØŽÙ%ùãqþM‡v9úúî 4Úâ8Y ÚOÀÇL•+È* ò¢lHF’á2má-Î-Ǜ͈¦Æý]¦ÊuÆÀ-;,tBr¢ñÛßkHÎØU ÀV!ã›9©»Ö‹ Iνý™ e-€Ôdƒ2ÍM\Z¹Ôòçæõx¹ÀÑdf  Sn±Ë*€ñÀ ÛJØ‹‰)€Na—UO0»P °Åù±'pn Tz‹¿ÙÜ@§ld7fÚX·ÉçwuÑ(½´s‹Ž…Îü½|só»Ò³|âÿ›Wü‰W^—õ@Φ£óX\Ÿ¿]–Ž×Ì¥ÑZÏøgµ{:ÕØÒ©ÇV,:ß.:ëϼƵzôÖG¨\€ÓÀ8ÞP²Ï2À§ÊHwik‡#¿Ùžm ®:ãŸåIrÌyžiP&c @@tÀAsÀ »Ú•'±¯ö,ó~õ:[œ[rB|Ì.ùU+pø€$iWÓñi¨ÿsу'ÿ¼!tXÇB]*HMS^ÚÀÓʦ&÷?ãš g{ Ðk RÓ¨D¨`D\œçÕÓŠUwp£$©LýÏó·?êí9¾l÷5铯®š+Î\§ ¦ÇŽ€;ñôaÄÇŸHì,n¶Ý1§$ñË<^9é5ÌáîzI°³ÑvÇìK7ÞÔít 3'ñ¥ˆ†P—ñ5Fû†Sq6SÓ¤ð3£ÉSÝ,ŒÈ”œG%ñÆ•0€Jˆ¤övsK;i@;m|B¾`¸Æoÿḯ;m|¡ì°# $奎ãæ€K(È* €»jl1÷  xh1•‡ˆÉö £")Üy”J°c™áìÅ@“™€Hj9Ô`Ëã6»®{ à¢ÀäÓ™Ëå˜s ¶7ÆÕµÛX·Éß±ÄþÜh‘6± ðÔ¬\*58µˆJˆ¤=û;©  @´¤%fR V2Ä;ˆJ°€Ü,·£ÏÏëòq‘¬$'#›Jì¬!Än€@@Ü9ê¢âÈ–½»¨€ Þ´…R @Sh•€Ä›ðá•€V‘2ŒJâMrB •     6”œà¡€x“íA% %ñU‚5ÂÍT@@¤äz]T,)ØÙH%XI[{ˆJâÍÿN*ìbJáx*  >¤0 жB‡©€˜ãKO¢lêX¨ËÑç×qø ÀJÊ뙀Èk ×Q ˆŒìé Þx’¼TâO2ƒ€€ø3(3ÁT¹M»7Qyˆ˜Pg€J°¢š}5T‚ å^”c‹ãl:À@S€ ×äeåQ ÒúóUJKÌ´Ý1×îéäË óÒÓÌX_»Á1uàuùø"XL˜E€¬©íP•€ˆi í¢"Ž©€@@üÉõº —iØßDÅÙ×ÃÂG¸{Ž9—ì”a¶;æpÇ1S妞f‹ó«kÛÀMiñ¾%prBŠí޹q_\€\3[¯ÚWOÅñ&ÜÑA% bên¤"mPF¢©rþV¿#Î?Û3,.®sAj_v€|$ÙÕÇT¹5»Ö8ãüØî˜¡Ã†Ëä¥ ´Å¹µjঈWR*ÁfZvì¹Û¹ÀÑàhî@Åæ8£ ±?_ Þ N-Š‹óâd‹ã¬ Vñ¥ˆ–Ü,·á2[ö²^{¬ÔŒÏÂÈÉȦâpáÚÂs.Éý’íuÀGû½b@€€(–m¼tÒb@Ùîá| ’M,Ìb@±Ñ47`Ú˜KíÑÀ"@Ñ3(3ÁT¹¥•KÑ`£ ‚ò…@ï0»@ pÄùÛqC 'ªn©¤¢ÉìZë69$xls¬GL•›=i¶åÏ-|ø7#@@´e¤» —iØßäˆsÏöŒ°O8xıßÁ¦SK¢Î“hükµ'À²­v`—€áf.@@´ÅóTÀÂÌI¶9Ö]MaÃeì²P°“@ uÞþý — wt8f[`ÄSbô3UÎ)Ûçõk‹ã4³ ð”Âñ–?/¶ˆ‘ü!I¦Ê­¯eéÖ¨rè2Àl C}<ƧnnØáŒ€Ôq–?F³«ŽÍ+¶ü¹± @@ L7Þ à”™vX Àì*€^×òçÆ €€ò™åõ;qîvX Àì"@‡M´ü¹í;´ƒ Ve˜[°bK…ýÀëïhv _ºÏòçÖ®ãˆY#˜in&Àºšu¶?wO’õ»Éý­†Ë”åZ?ذ@@Œ¥§%˜¸©~›#ÎßêS™˜šÜßòõÞ¢û æÌ |ß=’”–4ÈÒÇW¿¯Ýp™Ñƒ­¿ÕqãÁZn<€€X33pm³3VÔ?ß²Çæä)€ °€|Ÿ¹–V.µý¹[y&€Ù)€ùYù–®óPg€€–&W¬ØüÛŸ»•7ªõwš*7mô4K×y]ëÜtV‘‘î2\fË^gìå>(9Ï’ÇefÀ„ÖŸþ×ÚÅ `#Ml ¼l÷Gœ{VŠ5_4‡Œ=ÈúëÚØK À2ò³÷„;:± ¶·ÕþV㻎ɱþê†l `!y>s+®ÜôŽýÏÝ{±åŽ©i¿¹%ùÖÞàˆ€,ÆíîkjÀû;í? kpj‘’û%[ê˜Ìœ=i¶¥ëz[Ë»ÜlVS’“b¸ÌâÎØÒ5¯©¥ŽgWSØp;,¼»-€,'ž×ÈK³Ö’Àõãïÿ§Ž·tÇûüÿä~ý`Í0$IJ2þU{mÍ2û ¨ÝÓ)™Ø`Ú˜K-]Çۚ߉ëû+ÛSÀ/`]£²Ü†Ë¼±õ=ÛŸ÷àÔ"¥%fZ#8ôý]Ñÿ–5:×x¨i jÓîMö?éÖXAo}Ã!Ãe®Qjùúݬˆë{+Í•Í/`áF0ÏeªÜ««ÛþÜóÒb?…®5xØÔüÿ+KfXºn77½­ð‘p\ß[ÞdŸ,Ëíî«\¯U¾aûs“=3æÓ·Õ™ëþŸ{É\K×m]Õÿ² @€¥çŸ¸¶Ùïˆ×#Óbû`uõAÃe®Q*_ºµŸ.·µVÄý}åIòZn½ €ÓŒÊ37ÄÖi×IDATÐ ¯¦ä|)fŸíoîrd÷ÿÞ¶­ vµpcÉzëM€œ&=-!n_Är6Àû›C†Ë$»\ºû w[ºNßox™›ªÛÈŒ©T°¶‰Ã<†Ë8å5À_ô{ÚÛªªÁx˜7u¶åë3ÞGÿŸjÔÀéT K  Õ_Ty.ÉÄôþçʟף·>bës/ôy­Üó|TG­¿¿é©Ån)»ÙÒuÙ£ÿÓúþy¿z%ëÓäUIÆgµ~ÿ[=.S»§Sïm>¨mbAjš¾~é\%goÕ> üB£è9·»¯J .÷ÒoÙþÜ=IÞ¨lo?ªòmAÃån7MÅC‹-]—ë÷]ø÷!=ÍYÏ?W¿ë¼¯™ÚÛjÕúCzø¥F-\ÖÔãÆÿª¥zîÖ«ú×ÿÔ¯{@¼ü2£0®(×­ªê†ÊÔ´µ´r©åW¥;ŸËòo1ô”‹§ÿæ~×Òuê h[p7Òæõ£¢—¶üø´Á‘ííGµ­®C[êÛ =íOèÓµ“féêÉWY>‚»€B—úT&êX¨ËP¹?WüÍö 3%ÇpWm4Ÿþïš<ËúOÿ¯÷ÚÏêã1ö=,¯ßi麜Z¤o\üïZøþÿÕ_×¼£]MaÕïkïQÙd—KW­+Kf¨ll>ˆŒ…ýU¾¡ÕP™6Tèç­~ËÏMïI/Àö`EDǬ¨:høé?ÙåÒ®Àòõ÷¾¿÷FÿçxTo0ˆÚ¡'`îØïJ ´,¼B áÕ´Olñ<¥p¼r/ÊÑø‚ñš6zš@"nJqŠá I ––lÎôÄ)¹)†þ~¸£Cϯxž 7|aršá25mAýË_q\]ŒÉž©û¦¼¤+‡_0¨jk»þã¿>ÔÂeM†Ö®¿jD©–Üõ+½úƒ—l·¶{uKe¯Ïû?›ñÇÏ7>XÎM Ð|5µÈxøéò?Éßêwd\2ôF]á{H¾#“”îÙ¢5e¹Ãõ³Ïß®½¬Wð’m7PZ¼ó_£úÝËHw*ó† Ç~ïØ –2£´¿VU0ôn;ÜÑ¡Ÿ¾ôˆ­ÞmQ<´øä¹ù[ýZ³k$©bó?$IcóŠåõxåõx³¡ËÛÕèÕ5ÿ{â²¢zå=c«(:ao Kp»ûꚉzÅà¢6¿]ý†¾rY…ãw4ó¥ûN>ÑÛ}kä³i9Ô ÕM/GýsK‹ÜzeM_CásÁª¥š7ç^ÛïP‰øÄ+XNi‘ÛÔ€ÀyÏ79Õð´Àoüçcô>ô–ô´ÝpÉE†Ëývõ<‘ÙÄÚ=K´zß«–:&·»¯¾|iº¡ðî舋ާê–J:èa#QPTè2µ@OdÖ··m«ÞÜýo–<6ßÀDÝye–¡°¶Ù¯ÙÝà¸ê è½Ý/êñ÷¯×s[îú ŽÍº$Õðx€xy"³s£òÒk¼÷'œýiÿåÍ諯ղݠá'±ñ•Ë3 ¿—]Ûìg„¶Eÿç×Ç Šo`¢æÍÎ6ôÝ[ÛìWáƒWÚr·Ê½m[õúö'N>íGz7FÄN?ª .μMR~4?2Í“¨ #S¨ûS$&öÑÐÌ$­©=$9ÖãrÛö7jgÍš;õj*Ñ"þ´á~í9´Ã6ÇëNî«)E…Ã}ÔðaÏ– >|äˆ^¬ü»ö5îЄa¥à`ÙóÛÛ¶U•{^Ѳ]Ojåž?iOh›:޶Ûñ«U[þtÍ3Üa€ ðôÓ(ŸÛpذo·ÂÁ½úìøÏR‰1öòæG´=¸Ê–Ç><×¥Q9)Ú8¢¶ÐᕩܳS[õ²ŽviòˆÉ–9—ÍMo«rïý×Î_ê]ÿ_Uw`£ÚýëE œò3“Uµ+d¨Ü?ê¶h`b_KýŽÇÆßî]Ê<ý4adŠò³ÜÒ±¾jlíÚæY’&›xrÇÁPg@MvïYûìhR ܬ`g£šÚwZzV@¯†ï€l-,o6´ë=‹(x¨M?¼ŽÍƒhü{Wþ$åI’$•©¿ÁÒ-ÝÿH»´ZênË×l⻄ÞÇ4@8â®Ñ¹Ú’ôàëOëæÇï #doÛV=¹æ¦¸jüefæjKÒ *tõ£×³XP/[»g‰~¿þnº£yéi úÆç.Ò¨¡r‹wTiöc7°lp/uôç jIÍãT@¢ÇíÈЬ‰™ÆžX›ýºâÿÝ¥§^{ŠJ4©º¥R¿ÿà›ÚfÓ9þp€©%)ºsö õñ$ö¸L¸£C÷,ZÀ+Oý¯o‚Mb` ¾‰úþœ,Ã; .ÞQ¥KrÛ ÷ÀÚ=Kôäš›,·/âœÛÝW³.IÕmW XÓÔ-ÏþDW?z½6ífÖÇU·TjaÕ<-©yœ~€M±âBþ$Ý;$K«ÖÒZ{¼fÀâUZöè š7u¶æÍ¹÷äb,ñÜð¯¬Nu7ò¥€}L-IÑøÉzÓ!•o ö(„;:ôØŠEz郷ôÝ+n‹Ëiø`{nw_•Mê¯)Å)†‚@M[P÷,Z _¾¹P_¿t®nÿÌmŽîu´¾ñu½ï™Á}pfX·#¬¿omÓ±PW‚Àƒ¯?­Ÿ.ÿ“n?SwþN-vÔÓþº¦7¹qpZ˜Z’¢©%)ªÝÓ©ª‡TÕ:o¯@¸£C¿]ý†~»ú MèÓ—]¯¹—̵}¯@]°ŠÆ ñåÄF.×È«­ÕÚZßÞ£0°¶Ù¯µ‹èžE tÕˆRM~±®ž|•-{²=Ãø" ~ºTTèÒ5òÊßÜ¥muÚÕVý¾ös–[¼£J‹wTéÁןVAjš>7N—Œœh›Þ¼ô‹¹ø€t|Q!ßÀēۻκ¾GåjÚ‚ªÙP¡6T¨þÃ=zë#–?WO’Wƒ’óØÅp8L0ºë $mÙ»Ë6ç74µ”‹ |ÜÈìdÃe64ÕØæüòÒÆq‘€”žh¸LM[Ð6Ë ÉžÉE>ñ„ìK4U®|c¹mÎqTÚT.4@pªô´C[ ŸðÞö5¶9Ç‘€àÆ›ðnÝۜ߄!s”Ü/™ œ*?ÛøL;¤‘iÓ¸ÐÀ©âaÀeù·p¡€SÅÃ8€Ì”•d|–‹ œjJnŠá2‹¶ÿÓVçH/l$@€¨03 ÜÑ¡Š-¶ê˜œu5v°Ž* QQTè2Uné?ÿËf½·*-1“ œ0*Çc¸Ì››ßµÕ9z’¼º~ôO¸Ø°:^€èë6\fm³ßVÓ%ipj‘æÜLJ•UQ z=yæ^¼ºz±íÎuÂ9šSp ·»¯©×‹*ß°åùN2G·ÿRyýÇrña)ó§/§€DW¼¼8apj‘n+] [F?ƦA°ŠZªÀ˜ª¸p£ò\Òš¾RçQCåžzýwúÍOØö¼ 3'©0s’BÕµ~ ºà5Ú¥š}»µ»õó–š~‘g¤«1\Ç—½…§}nw_•æxTU}ÀP¹7¶¾çˆó÷$y5&{¦ÆdÏìq™ê–J=·å~¾<è-¬`¯€^R:Üøª€5mA=¿ây*¸påTˆ‰ü!I¦öøË{‹©<àÂñ €ÄÎÕ%i†Ë,ÞQeÛÁ€€UÿùÓ—3ÄΨ<—”dü¶zêõßQy€yåTˆ)·»¯ÊFïxzÝÛò·ú©@ÀœTˆ¹ñ#Œ¯’îèЂ%OPy€ ó§/…Z 1—ž– Ò†Ë-Xµ”^À8`3Jû @/`Ê«T°T/€™±ôô››Rœbªà{ÏÎ$&öQQ~²ÆzÔÑÑG­=*èèЋ•׊^WBŸc*É/±ü¹¶¶ïÕúßâ¢ã\ž?}ùBª@@Üp'÷=ú맆¶.éȱó–«mÛ¯—׭гåÏ*t°Eý3”•–E€½2úò»¨†ÈéCôÀ#Þ–TÍÌÍrëk_¼ˆºÇI[«;´µ¾]U !©óhË•å×c§ë²âéš6zZLÏ¡º¥R’T¬R ܬõû 8£*I3éú'€ñ7w©Îߥ𦰶·vêX¨«Gå RÓ4.»@£Ó´1—ª «@ÅC‹{í¸Z5(ØÞ¨¦Ð…‡ÔªQøÈAÕÜÈECOºÿ*ª‚@z vÏññµþÆ ìj ÷¨ìð´tåz³%I9> ½h°$éŠñ—Ÿö÷‡¨)´ëä×µm8þ»Ã¯`W 4þhü­Œi€4þ"§JÒÅ4þ@üx¥ûÉ¿–ªˆªE_á­} €8Q®ãkûóÔOÄÉSÿ·YןˆŸ†¤ÇYÖ—p¾Úî†! ?àüFÿIÏ0­p¦€ŽÏᯒ´NR9ûg)ïnèëN4útëÎjèk»úrIµ<Õ4ô hèAÐЃˆˆªî†~ =à솾ª»¡g^=@C€† =@€ÞWÛýÏ zÀÙ }mwC_Nµ€4ôhèÐÐèuß“ž† phCÏžô =z4ô"«\§ïIOC8¸¡gOz€àh $•JòR ¡@ˆÜñŠîQ+émBhèâ+TéŽ3  ¡@ Vóñ=é«hèz/t‡€R*ièÙ“ ! pJO!4ô„€† ^BÀÓ’®¡B@C€O!@ú’îñ´¤Û¨t«Õé{ÒWÑÐ 83Ü®;Fˆ÷ ={Ò @C€x +t|\hè€G!`awO!€†„Ä{Ò &! VÒËbé`z ÄU(gÿz Äg`!z ÄyxYR>BC€ø +~÷({Ò NC@ó-ªIEND®B`‚titlebar.png000066400000000000000000000026341225012771600355420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/images‰PNG  IHDR1,ÌÔPYsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ/+áƵtEXtCommentCreated with GIMPW÷IDAThÞÕš¿nGƳ·¤èVÒÚ0.’.Üp^ÁÏ’"mš<]j7VãÂÜ9MÞíΤØÝ»½ã‘’œÀ¤XÜwûç›ï›™%‡,™é¥Õ÷‡j6¹u4€«:ÕUŽÈ.Z®XæM×`¤º ˆzãÄÜ{>˪©º;YMYÐjó@ðÀƒ d™ì’Ø!AèÄúè€è

/ãêç~b9A«5Ͼû–³³3...xóæÍŸòâÅ {þü9>|àúúçM“\!ÆH#n/ï\æzxޣϊ%Å#šc… hžW* .ó§5#ù=ç]×ñðáC=zÄëׯñççç\]]qyyÉjµ m[‹"²µy&‡¶@@²œ™“^b£PcÖ³Q„_@¨³ †šfCÎ9®¯¯999áéÓ§øÕòïßÿE#ŽØTï}º·€ôj¾9ç·z$W€hÉ’6™t=f6b @Õz.KK³“Š]X,\^^òøñc|Œ‘ͦÃûDÓb±@UÙ´ŸY.—=Ý»ÙÈÔÛ” C5ñ#"Cx³$—X1Qƒh²LM-QMlªõñÑù†hÊf½ÁùofÄqnÐ~ˆƒœ4êH“5Í£èd†æçÓ\ AADÀ,[;$VÌ E0g ,VrŒiœ™!N™²¦Y$ºnƒY¤m#Ò86]›7¥ˆØ`Êj ˜…ѹDDè$î<«²¥‹1Š} «fëÁP«±I%¨hˆ:|c^p¼ÁQè›X¾0S®(Û êð:Û³ªºÅøœ4FbŒÉ'bŒÝàhý5êÖ"û&¿U*¾ľù‹‘RBVºªš|BuËš"’hÜöèâ ;7rãy¢2Ø€1¿f%+UíC|¢VðT÷ƒv·'ã‹™˜‚ï­|ÃMDP1¢FÚÐ%9•Á¦ƒeT“ŒÊuÎÚR9è]ZÉç@cîòCçZ"©ÆÁ±§´Þüíý3ìÜűç@ÔÃç|CUS"Ë©m[º®Kè3QrÇ.½‹H¿ï¢EveÄØb¿Ž†åMY·-~ÝnX·œs³Öþ’èó5Z‘z÷y+Èæô~¬m*A?—Dfµ¤MUq%ÑíC{ô ê_Ú(›%&nzù^2q웯¥®ª):Ý'ËÏ%A7w¬¨“Üìyé?œ`ÿOõ>qäõ÷Ý}™ük;ù š¦é¼ý—§ È9wÒò·A*"4MÓgör¶*_NíÜ7‚ˆ1öTuôÓIñCËÉ7âhš=Ölji¹£ŒTþ‡Ÿ~ä¾7~®~Ö_1[êjÑ¡ëu•¨«jŸOø;?Ø0XJ‘E8lÝÎ&`ú“"Ë?ÄšqÝîÐ,ìc£0ÒŸ) ÙúÓ**daÊFùA½)•£Îgº‰õ¥ü;'+²â3€Èqâç@Fzf|¦ä˜ÿ1'«Ñß"þ‡”ŒjDÝØIEND®B`‚titlebar.sci000066400000000000000000000001271225012771600355270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/imagesborder.left: 10 border.top: 12 border.bottom: 12 border.right: 10 source: titlebar.png up.png000066400000000000000000000012261225012771600343540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/images‰PNG  IHDRVÎŽWsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ7‘IDAT8˽”ÏkAÇ?of7Ù˜ò£MLµŠõdµCU,zðà GÛ‹Ô“Þ¼+xïÍ?Àÿ@¬lHk)drÎéJqnúBRûzã»dò¨ì“n“íï|Ã7Àß TL¦ì»§Ê…¹Êå$bWñŒ‹RZC.Ù¼”𫩝ð¶`ƒ ½©´}¯|¾4?=“Ô:¾‚çµPâc)Сçò—‰fCõ|¾ftåôLláäT'K4€JüM@[wÁ7¨TJöu»ä5ÞµAPçËGï×ËgÞxuYÏœM=¬"`+h®ÂâýÀ¼]âU£Æ#à5ÐW ÏÀàš­’N[À Ý–€M`x¬þ`Å€tEÀ’K¨0%¥@Beá^Xú@0\úAT:ŒA”¥ÁV‚DAMôj;ö ¾A|s-Á® 9l~«Õþùây{Ìu7‹ ý>C-Ji+øvs€Àñ°¯ôé/vt2âëˆqÀV ôÂ×ÚT%#º_F¬C#¿ýº¤2Öá¢IIEND®B`‚main.cpp000066400000000000000000000134201225012771600334040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include "filereader.h" #include "trace.h" #ifdef SMALL_SCREEN_LAYOUT static const QLatin1String MainQmlFile("main-smallscreen.qml"); #else static const QLatin1String MainQmlFile("main-largescreen.qml"); #endif #ifdef PERFORMANCEMONITOR_SUPPORT #include "performancemonitordeclarative.h" #endif int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); #ifdef PERFORMANCEMONITOR_SUPPORT PerformanceMonitor::qmlRegisterTypes(); #endif QUrl fileName; qreal volume = 0.5; QStringList args = app.arguments(); #ifdef PERFORMANCEMONITOR_SUPPORT PerformanceMonitor::State performanceMonitorState; #endif for (int i = 1; i < args.size(); ++i) { const QByteArray arg = args.at(i).toUtf8(); if (arg.startsWith('-')) { if ("-volume" == arg) { if (i + 1 < args.size()) volume = 0.01 * args.at(++i).toInt(); else qtTrace() << "Option \"-volume\" takes a value"; } #ifdef PERFORMANCEMONITOR_SUPPORT else if (performanceMonitorState.parseArgument(arg)) { // Do nothing } #endif else { qtTrace() << "Option" << arg << "ignored"; } } else { if (fileName.isEmpty()) fileName = QUrl::fromLocalFile(arg); else qtTrace() << "Argument" << arg << "ignored"; } } QQuickView viewer; viewer.setSource(QLatin1String("qrc:///qml/qmlvideofx/") + MainQmlFile); QQuickItem *rootObject = viewer.rootObject(); rootObject->setProperty("fileName", fileName); viewer.rootObject()->setProperty("volume", volume); #ifdef PERFORMANCEMONITOR_SUPPORT if (performanceMonitorState.valid) { rootObject->setProperty("perfMonitorsLogging", performanceMonitorState.logging); rootObject->setProperty("perfMonitorsVisible", performanceMonitorState.visible); } QObject::connect(&viewer, SIGNAL(afterRendering()), rootObject, SLOT(qmlFramePainted())); #endif FileReader fileReader; viewer.rootContext()->setContextProperty("fileReader", &fileReader); QUrl appPath(QString("file:///%1").arg(app.applicationDirPath())); QUrl imagePath; const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); if (picturesLocation.isEmpty()) imagePath = appPath.resolved(QUrl("images")); else imagePath = QString("file:///%1").arg(picturesLocation.first()); viewer.rootContext()->setContextProperty("imagePath", imagePath); QUrl videoPath; const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation); if (moviesLocation.isEmpty()) videoPath = appPath.resolved(QUrl("./")); else videoPath = QString("file:///%1").arg(moviesLocation.first()); viewer.rootContext()->setContextProperty("videoPath", videoPath); viewer.setTitle("qmlvideofx"); viewer.setFlags(Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); viewer.setMinimumSize(QSize(600, 400)); #ifdef SMALL_SCREEN_PHYSICAL viewer.showFullScreen(); #else viewer.show(); #endif // Delay invocation of init until the event loop has started, to work around // a GL context issue on Harmattan: without this, we get the following error // when the first ShaderEffectItem is created: // "QGLShaderProgram::addShader: Program and shader are not associated with same context" QMetaObject::invokeMethod(viewer.rootObject(), "init", Qt::QueuedConnection); return app.exec(); } qml/000077500000000000000000000000001225012771600325455ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofxqmlvideofx/000077500000000000000000000000001225012771600347235ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qmlButton.qml000066400000000000000000000055241225012771600367170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: textColor radius: 0.25 * height property string text property color bgColor: "white" property color bgColorSelected: "red" property color textColor: "black" property alias enabled: mouseArea.enabled signal clicked Rectangle { anchors { fill: parent; margins: 1 } color: mouseArea.pressed ? bgColorSelected : bgColor radius: 0.25 * height Text { id: text anchors.centerIn: parent text: root.text font.pixelSize: 0.5 * parent.height color: mouseArea.pressed ? bgColor : textColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } MouseArea { id: mouseArea anchors.fill: parent onClicked: { root.clicked() } } } } Content.qml000066400000000000000000000122551225012771600370550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "black" property alias effect: effectLoader.item property alias gripSize: divider.gripSize property string effectSource property real volume: 0.5 signal videoFramePainted Divider { id: divider visible: false z: 1.0 onValueChanged: updateDivider() } ShaderEffectSource { id: theSource smooth: true hideSource: true } Loader { id: contentLoader } Loader { id: effectLoader source: effectSource } Connections { id: videoFramePaintedConnection onFramePainted: { if (performanceLoader.item) root.videoFramePainted() } ignoreUnknownSignals: true } onWidthChanged: { if (effectLoader.item) effectLoader.item.targetWidth = root.width } onHeightChanged: { if (effectLoader.item) effectLoader.item.targetHeight = root.height } onEffectSourceChanged: { console.log("[qmlvideofx] Content.onEffectSourceChanged " + effectSource) effectLoader.source = effectSource effectLoader.item.parent = root effectLoader.item.targetWidth = root.width effectLoader.item.targetHeight = root.height updateSource() effectLoader.item.source = theSource divider.visible = effectLoader.item.divider updateDivider() } function init() { console.log("[qmlvideofx] Content.init") openImage("qrc:/images/qt-logo.png") root.effectSource = "EffectPassThrough.qml" } function updateDivider() { if (effectLoader.item && effectLoader.item.divider) effectLoader.item.dividerValue = divider.value } function updateSource() { console.log("[qmlvideofx] Content.updateSource") if (contentLoader.item) { contentLoader.item.parent = root contentLoader.item.anchors.fill = root theSource.sourceItem = contentLoader.item if (effectLoader.item) effectLoader.item.anchors.fill = contentLoader.item } } function openImage(path) { console.log("[qmlvideofx] Content.openImage \"" + path + "\"") stop() contentLoader.source = "ContentImage.qml" videoFramePaintedConnection.target = null contentLoader.item.source = path updateSource() } function openVideo(path) { console.log("[qmlvideofx] Content.openVideo \"" + path + "\"") stop() contentLoader.source = "ContentVideo.qml" videoFramePaintedConnection.target = contentLoader.item contentLoader.item.mediaSource = path contentLoader.item.volume = volume contentLoader.item.play() updateSource() } function openCamera() { console.log("[qmlvideofx] Content.openCamera") stop() contentLoader.source = "ContentCamera.qml" videoFramePaintedConnection.target = contentLoader.item updateSource() } function stop() { console.log("[qmlvideofx] Content.stop") if (contentLoader.source == "ContentVideo.qml") contentLoader.item.stop() theSource.sourceItem = null } } ContentCamera.qml000066400000000000000000000040361225012771600401640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 VideoOutput { source: camera Camera { id: camera } } ContentImage.qml000066400000000000000000000037751225012771600400270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Image { fillMode: Image.PreserveAspectFit smooth: true } ContentVideo.qml000066400000000000000000000044561225012771600400500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 VideoOutput { source: mediaPlayer property alias mediaSource: mediaPlayer.source property alias volume: mediaPlayer.volume MediaPlayer { id: mediaPlayer autoPlay: true volume: 0.5 loops: Audio.Infinite } function play() { mediaPlayer.play() } function stop() { mediaPlayer.stop() } } DisableScreenSaver.qml000066400000000000000000000040421225012771600411420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMobility.systeminfo 1.1 Item { ScreenSaver { screenSaverInhibited: true } } Divider.qml000066400000000000000000000051671225012771600370350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root anchors.fill: parent color: "transparent" property alias value: slider.value property alias lineWidth: line.width property alias gripSize: slider.gripSize Rectangle { id: line anchors { top: parent.top; bottom: parent.bottom } x: parent.value * parent.width - (width / 2) width: 2 color: "red" } Slider { id: slider increment: 0.0 lineColor: "transparent" fillColor: "transparent" gripColor: "red" anchors { top: parent.top topMargin: gripSize / 2 left: parent.left right: parent.right } } } Effect.qml000066400000000000000000000057171225012771600366440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 ShaderEffect { property variant source property ListModel parameters: ListModel { } property bool divider: true property real dividerValue: 0.5 property real targetWidth: 0 property real targetHeight: 0 property string fragmentShaderFilename property string vertexShaderFilename QtObject { id: d property string fragmentShaderCommon: " #ifdef GL_ES precision mediump float; #else # define lowp # define mediump # define highp #endif // GL_ES " } // The following is a workaround for the fact that ShaderEffect // doesn't provide a way for shader programs to be read from a file, // rather than being inline in the QML file onFragmentShaderFilenameChanged: fragmentShader = d.fragmentShaderCommon + fileReader.readFile(":shaders/" + fragmentShaderFilename) onVertexShaderFilenameChanged: vertexShader = fileReader.readFile(vertexShaderFilename) } EffectBillboard.qml000066400000000000000000000045411225012771600404510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "grid spacing" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real grid: parameters.get(0).value * 10 property real step_x: 0.0015625 property real step_y: targetHeight ? (step_x * targetWidth / targetHeight) : 0.0 fragmentShaderFilename: "billboard.fsh" } EffectBlackAndWhite.qml000066400000000000000000000043501225012771600412150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "threshold" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real threshold: parameters.get(0).value fragmentShaderFilename: "blackandwhite.fsh" } EffectEmboss.qml000066400000000000000000000037601225012771600400110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "emboss.fsh" } EffectGaussianBlur.qml000066400000000000000000000062141225012771600411550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/ import QtQuick 2.0 Item { id: root property bool divider: true property real dividerValue: 0.5 property ListModel parameters: ListModel { ListElement { name: "radius" value: 0.5 } } property alias targetWidth: verticalShader.targetWidth property alias targetHeight: verticalShader.targetHeight property alias source: verticalShader.source Effect { id: verticalShader anchors.fill: parent dividerValue: parent.dividerValue property real blurSize: 4.0 * parent.parameters.get(0).value / targetHeight fragmentShaderFilename: "gaussianblur_v.fsh" } Effect { id: horizontalShader anchors.fill: parent dividerValue: parent.dividerValue property real blurSize: 4.0 * parent.parameters.get(0).value / parent.targetWidth fragmentShaderFilename: "gaussianblur_h.fsh" source: horizontalShaderSource ShaderEffectSource { id: horizontalShaderSource sourceItem: verticalShader smooth: true hideSource: true } } } EffectGlow.qml000066400000000000000000000037561225012771600374760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "glow.fsh" } EffectIsolate.qml000066400000000000000000000045571225012771600401660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "hue" value: 0.5 } ListElement { name: "width" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real targetHue: parameters.get(0).value * 360 property real windowWidth: parameters.get(1).value * 60 fragmentShaderFilename: "isolate.fsh" } EffectMagnify.qml000066400000000000000000000062731225012771600401550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { id: root divider: false parameters: ListModel { ListElement { name: "radius" value: 0.5 } ListElement { name: "diffraction" value: 0.5 } } property real posX: -1 property real posY: -1 QtObject { id: d property real oldTargetWidth: root.targetWidth property real oldTargetHeight: root.targetHeight } // Transform slider values, and bind result to shader uniforms property real radius: parameters.get(0).value * 100 property real diffractionIndex: parameters.get(1).value onTargetWidthChanged: { if (posX == -1) posX = targetWidth / 2 else if (d.oldTargetWidth != 0) posX *= (targetWidth / d.oldTargetWidth) d.oldTargetWidth = targetWidth } onTargetHeightChanged: { if (posY == -1) posY = targetHeight / 2 else if (d.oldTargetHeight != 0) posY *= (targetHeight / d.oldTargetHeight) d.oldTargetHeight = targetHeight } fragmentShaderFilename: "magnify.fsh" MouseArea { anchors.fill: parent onPositionChanged: { root.posX = mouse.x; root.posY = root.targetHeight - mouse.y } } } EffectPageCurl.qml000066400000000000000000000043721225012771600402630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { divider: false parameters: ListModel { ListElement { name: "extent" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real curlExtent: 1.0 - parameters.get(0).value fragmentShaderFilename: "pagecurl.fsh" } EffectPassThrough.qml000066400000000000000000000037321225012771600410270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { divider: false } EffectPixelate.qml000066400000000000000000000043541225012771600403340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "granularity" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real granularity: parameters.get(0).value * 20 fragmentShaderFilename: "pixelate.fsh" } EffectPosterize.qml000066400000000000000000000043761225012771600405510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "gamma" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real gamma: parameters.get(0).value property real numColors: 8.0 fragmentShaderFilename: "posterize.fsh" } EffectRipple.qml000066400000000000000000000047541225012771600400200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "amplitude" value: 0.5 } ListElement { name: "frequency" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real amplitude: parameters.get(0).value * 0.03 property real n: parameters.get(1).value * 7 property real time: 0 NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 } fragmentShaderFilename: "ripple.fsh" } EffectSelectionPanel.qml000066400000000000000000000132141225012771600414610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root property int itemHeight: 25 property string effectSource: "" signal clicked QtObject { id: d property Item selectedItem } ListModel { id: sources ListElement { name: "No effect"; source: "EffectPassThrough.qml" } ListElement { name: "Billboard"; source: "EffectBillboard.qml" } ListElement { name: "Black & white"; source: "EffectBlackAndWhite.qml" } ListElement { name: "Blur"; source: "EffectGaussianBlur.qml" } ListElement { name: "Edge detection"; source: "EffectSobelEdgeDetection1.qml" } //ListElement { name: "Edge detection (Sobel, #2)"; source: "EffectSobelEdgeDetection2.qml" } ListElement { name: "Emboss"; source: "EffectEmboss.qml" } ListElement { name: "Glow"; source: "EffectGlow.qml" } ListElement { name: "Isolate"; source: "EffectIsolate.qml" } ListElement { name: "Magnify"; source: "EffectMagnify.qml" } ListElement { name: "Page curl"; source: "EffectPageCurl.qml" } ListElement { name: "Pixelate"; source: "EffectPixelate.qml" } ListElement { name: "Posterize"; source: "EffectPosterize.qml" } ListElement { name: "Ripple"; source: "EffectRipple.qml" } ListElement { name: "Sepia"; source: "EffectSepia.qml" } ListElement { name: "Sharpen"; source: "EffectSharpen.qml" } ListElement { name: "Shockwave"; source: "EffectShockwave.qml" } ListElement { name: "Tilt shift"; source: "EffectTiltShift.qml" } ListElement { name: "Toon"; source: "EffectToon.qml" } ListElement { name: "Warhol"; source: "EffectWarhol.qml" } ListElement { name: "Wobble"; source: "EffectWobble.qml" } ListElement { name: "Vignette"; source: "EffectVignette.qml" } } Component { id: sourceDelegate Item { id: sourceDelegateItem width: root.width height: itemHeight Button { id: sourceSelectorItem anchors.centerIn: parent width: 0.9 * parent.width height: 0.8 * itemHeight text: name onClicked: { if (d.selectedItem) d.selectedItem.state = "baseState" d.selectedItem = sourceDelegateItem d.selectedItem.state = "selected" effectSource = source root.clicked() } } states: [ State { name: "selected" PropertyChanges { target: sourceSelectorItem bgColor: "#ff8888" } } ] Component.onCompleted: { if (name == "No effect") { state = "selected" d.selectedItem = sourceDelegateItem } } transitions: [ Transition { from: "*" to: "*" ColorAnimation { properties: "color" easing.type: Easing.OutQuart duration: 500 } } ] } } Flickable { anchors.fill: parent contentHeight: (itemHeight * sources.count) + layout.anchors.topMargin + layout.spacing clip: true Column { id: layout anchors { fill: parent topMargin: 10 } Repeater { model: sources delegate: sourceDelegate } } } } EffectSepia.qml000066400000000000000000000037571225012771600376300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "sepia.fsh" } EffectSharpen.qml000066400000000000000000000043441225012771600401600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "sharpness" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real amount: parameters.get(0).value * 18 fragmentShaderFilename: "sharpen.fsh" } EffectShockwave.qml000066400000000000000000000053771225012771600405210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { id: root parameters: ListModel { ListElement { name: "amplitude" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real granularity: parameters.get(0).value * 20 property real weight: parameters.get(0).value property real centerX property real centerY property real time SequentialAnimation { running: true loops: Animation.Infinite ScriptAction { script: { centerX = Math.random() centerY = Math.random() } } NumberAnimation { target: root property: "time" from: 0 to: 1 duration: 1000 } } fragmentShaderFilename: "shockwave.fsh" } EffectSobelEdgeDetection1.qml000066400000000000000000000045711225012771600423330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "threshold" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real mixLevel: parameters.get(0).value property real targetSize: 250 - (200 * mixLevel) // TODO: fix ... property real resS: targetSize property real resT: targetSize fragmentShaderFilename: "sobeledgedetection1.fsh" } EffectSobelEdgeDetection2.qml000066400000000000000000000043531225012771600423320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "threshold" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real weight: parameters.get(0).value fragmentShaderFilename: "sobeledgedetection2.fsh" } EffectTiltShift.qml000066400000000000000000000037631225012771600404760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "tiltshift.fsh" } EffectToon.qml000066400000000000000000000046671225012771600375070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "threshold" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real threshold: parameters.get(0).value property real targetSize: 250 - (200 * threshold) // TODO: fix ... property real resS: targetSize property real resT: targetSize // TODO property real magTol: 0.3 property real quantize: 8.0 fragmentShaderFilename: "toon.fsh" } EffectVignette.qml000066400000000000000000000037621225012771600403500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "vignette.fsh" } EffectWarhol.qml000066400000000000000000000037601225012771600400150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { fragmentShaderFilename: "warhol.fsh" } EffectWobble.qml000066400000000000000000000046071225012771600377740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Effect { parameters: ListModel { ListElement { name: "amplitude" value: 0.5 } } // Transform slider values, and bind result to shader uniforms property real amplitude: parameters.get(0).value * 0.05 property real frequency: 20 property real time: 0 NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 } fragmentShaderFilename: "wobble.fsh" } FileBrowser.qml000066400000000000000000000335211225012771600376650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import Qt.labs.folderlistmodel 2.0 Rectangle { id: fileBrowser color: "transparent" property string folder property bool shown: loader.sourceComponent signal fileSelected(string file) function selectFile(file) { if (file !== "") { folder = loader.item.folders.folder fileBrowser.fileSelected(file) } loader.sourceComponent = undefined } Loader { id: loader } function show() { loader.sourceComponent = fileBrowserComponent loader.item.parent = fileBrowser loader.item.anchors.fill = fileBrowser loader.item.folder = fileBrowser.folder } Component { id: fileBrowserComponent Rectangle { id: root color: "white" property bool showFocusHighlight: false property variant folders: folders1 property variant view: view1 property alias folder: folders1.folder property color textColor: "black" FolderListModel { id: folders1 folder: folder } FolderListModel { id: folders2 folder: folder } SystemPalette { id: palette } Component { id: folderDelegate Rectangle { id: wrapper function launch() { var path = "file:///" + filePath if (folders.isFolder(index)) down(path); else fileBrowser.selectFile(path) } width: root.width height: 52 color: "transparent" Rectangle { id: highlight; visible: false anchors.fill: parent color: palette.highlight gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } } Item { width: 48; height: 48 Image { source: "qrc:/images/folder.png" anchors.centerIn: parent visible: folders.isFolder(index) } } Text { id: nameText anchors.fill: parent; verticalAlignment: Text.AlignVCenter text: fileName anchors.leftMargin: 54 font.pixelSize: 32 color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor elide: Text.ElideRight } MouseArea { id: mouseRegion anchors.fill: parent onPressed: { root.showFocusHighlight = false; wrapper.ListView.view.currentIndex = index; } onClicked: { if (folders == wrapper.ListView.view.model) launch() } } states: [ State { name: "pressed" when: mouseRegion.pressed PropertyChanges { target: highlight; visible: true } PropertyChanges { target: nameText; color: palette.highlightedText } } ] } } ListView { id: view1 anchors.top: titleBar.bottom anchors.bottom: cancelButton.top x: 0 width: parent.width model: folders1 delegate: folderDelegate highlight: Rectangle { color: palette.highlight visible: root.showFocusHighlight && view1.count != 0 gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } width: view1.currentItem == null ? 0 : view1.currentItem.width } highlightMoveVelocity: 1000 pressDelay: 100 focus: true state: "current" states: [ State { name: "current" PropertyChanges { target: view1; x: 0 } }, State { name: "exitLeft" PropertyChanges { target: view1; x: -root.width } }, State { name: "exitRight" PropertyChanges { target: view1; x: root.width } } ] transitions: [ Transition { to: "current" SequentialAnimation { NumberAnimation { properties: "x"; duration: 250 } } }, Transition { NumberAnimation { properties: "x"; duration: 250 } NumberAnimation { properties: "x"; duration: 250 } } ] Keys.onPressed: root.keyPressed(event.key) } ListView { id: view2 anchors.top: titleBar.bottom anchors.bottom: parent.bottom x: parent.width width: parent.width model: folders2 delegate: folderDelegate highlight: Rectangle { color: palette.highlight visible: root.showFocusHighlight && view2.count != 0 gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } } width: view1.currentItem == null ? 0 : view1.currentItem.width } highlightMoveVelocity: 1000 pressDelay: 100 states: [ State { name: "current" PropertyChanges { target: view2; x: 0 } }, State { name: "exitLeft" PropertyChanges { target: view2; x: -root.width } }, State { name: "exitRight" PropertyChanges { target: view2; x: root.width } } ] transitions: [ Transition { to: "current" SequentialAnimation { NumberAnimation { properties: "x"; duration: 250 } } }, Transition { NumberAnimation { properties: "x"; duration: 250 } } ] Keys.onPressed: root.keyPressed(event.key) } Rectangle { id: cancelButton width: 100 height: titleBar.height - 7 color: "black" anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter } Text { anchors { fill: parent; margins: 4 } text: "Cancel" color: "white" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 20 } MouseArea { anchors.fill: parent onClicked: fileBrowser.selectFile("") } } Keys.onPressed: { root.keyPressed(event.key); if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { view.currentItem.launch(); event.accepted = true; } else if (event.key == Qt.Key_Left) { up(); } } BorderImage { source: "qrc:/images/titlebar.sci"; width: parent.width; height: 52 y: -7 id: titleBar Rectangle { id: upButton width: 48 height: titleBar.height - 7 color: "transparent" Image { anchors.centerIn: parent; source: "qrc:/images/up.png" } MouseArea { id: upRegion; anchors.centerIn: parent width: 56 height: 56 onClicked: if (folders.parentFolder != "") up() } states: [ State { name: "pressed" when: upRegion.pressed PropertyChanges { target: upButton; color: palette.highlight } } ] } Rectangle { color: "gray" x: 48 width: 1 height: 44 } Text { anchors.left: upButton.right; anchors.right: parent.right; height: parent.height anchors.leftMargin: 4; anchors.rightMargin: 4 text: folders.folder color: "white" elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter font.pixelSize: 32 } } function down(path) { if (folders == folders1) { view = view2 folders = folders2; view1.state = "exitLeft"; } else { view = view1 folders = folders1; view2.state = "exitLeft"; } view.x = root.width; view.state = "current"; view.focus = true; folders.folder = path; } function up() { var path = folders.parentFolder; if (folders == folders1) { view = view2 folders = folders2; view1.state = "exitRight"; } else { view = view1 folders = folders1; view2.state = "exitRight"; } view.x = -root.width; view.state = "current"; view.focus = true; folders.folder = path; } function keyPressed(key) { switch (key) { case Qt.Key_Up: case Qt.Key_Down: case Qt.Key_Left: case Qt.Key_Right: root.showFocusHighlight = true; break; default: // do nothing break; } } } } } FileOpen.qml000066400000000000000000000063041225012771600371420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "white" property int buttonHeight: 35 property int topMargin: 0 signal openImage signal openVideo signal openCamera signal close Rectangle { anchors { top: parent.top; topMargin: root.topMargin bottom: parent.bottom; horizontalCenter: parent.horizontalCenter } width: 0.9 * parent.width color: "transparent" Column { anchors.fill: parent spacing: 5 Button { text: "Open image" height: buttonHeight width: parent.width onClicked: root.openImage() } Button { text: "Open video" height: buttonHeight width: parent.width onClicked: root.openVideo() } Button { text: "Start camera" height: buttonHeight width: parent.width onClicked: root.openCamera() } Button { text: "Reset" height: buttonHeight width: parent.width onClicked: root.close() } } } } HintedMouseArea.qml000066400000000000000000000075301225012771600404600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Mouse area which flashes to indicate its location on the screen import QtQuick 2.0 MouseArea { property alias hintColor: hintRect.color property bool hintEnabled: true Rectangle { id: hintRect anchors.fill: parent color: "yellow" opacity: 0 states: [ State { name: "high" PropertyChanges { target: hintRect opacity: 0.8 } }, State { name: "low" PropertyChanges { target: hintRect opacity: 0.4 } } ] transitions: [ Transition { from: "low" to: "high" SequentialAnimation { NumberAnimation { properties: "opacity" easing.type: Easing.InOutSine duration: 500 } ScriptAction { script: hintRect.state = "low" } } }, Transition { from: "*" to: "low" SequentialAnimation { NumberAnimation { properties: "opacity" easing.type: Easing.InOutSine duration: 500 } ScriptAction { script: hintRect.state = "high" } } }, Transition { from: "*" to: "baseState" NumberAnimation { properties: "opacity" easing.type: Easing.InOutSine duration: 500 } } ] } onHintEnabledChanged: hintRect.state = hintEnabled ? "low" : "baseState" Component.onCompleted: hintRect.state = "low" } ParameterPanel.qml000066400000000000000000000071021225012771600403360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "transparent" height: view.model.count * sliderHeight property color lineColor: "black" property real gripSize: 25 property real spacing: 10 property real sliderHeight: 40 property ListModel model: ListModel { } Rectangle { anchors.fill: parent color: "black" opacity: 0.5 radius: 10 } Component { id: editDelegate Rectangle { id: delegate width: parent.width height: root.sliderHeight color: "transparent" Text { id: text text: name color: "white" anchors { top: parent.top bottom: parent.bottom left: parent.left } font.pixelSize: 0.5 * parent.height horizontalAlignment: Text.AlignRight verticalAlignment: Text.AlignVCenter width: 150 } Slider { anchors { top: parent.top bottom: parent.bottom left: text.right leftMargin: 20 right: parent.right rightMargin: 20 } gripSize: root.gripSize value: model.value onValueChanged: view.model.setProperty(index, "value", value) } } } ListView { id: view anchors.fill: parent model: root.model delegate: editDelegate interactive: false } } Slider.qml000066400000000000000000000105161225012771600366630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root color: "transparent" radius: 5 property alias value: grip.value property color fillColor: "white" property color lineColor: "black" property color gripColor: "white" property real gripSize: 20 property real gripTolerance: 3.0 property real increment: 0.1 property bool enabled: true Rectangle { anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter } height: 3 color: displayedColor(root.lineColor) Rectangle { anchors { fill: parent; margins: 1 } color: root.fillColor } } MouseArea { anchors.fill: parent enabled: root.enabled onClicked: { if (parent.width) { var newValue = mouse.x / parent.width if (Math.abs(newValue - parent.value) > parent.increment) { if (newValue > parent.value) parent.value = Math.min(1.0, parent.value + parent.increment) else parent.value = Math.max(0.0, parent.value - parent.increment) } } } } Rectangle { id: grip property real value: 0.5 x: (value * parent.width) - width/2 anchors.verticalCenter: parent.verticalCenter width: root.gripTolerance * root.gripSize height: width radius: width/2 color: "transparent" MouseArea { id: mouseArea enabled: root.enabled anchors.fill: parent drag { target: grip axis: Drag.XAxis minimumX: -parent.width/2 maximumX: root.width - parent.width/2 } onPositionChanged: { if (drag.active) updatePosition() } onReleased: { updatePosition() } function updatePosition() { value = (grip.x + grip.width/2) / grip.parent.width } } Rectangle { anchors.centerIn: parent width: root.gripSize height: width radius: width/2 color: root.gripColor } } function displayedColor(c) { var tint = Qt.rgba(c.r, c.g, c.b, 0.25) return enabled ? c : Qt.tint(c, tint) } } main-largescreen.qml000066400000000000000000000132401225012771600406520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root width: 900 height: 600 color: "grey" property string fileName property alias volume: content.volume property bool perfMonitorsLogging: false property bool perfMonitorsVisible: false QtObject { id: d property real gripSize: 20 } Rectangle { id: inner anchors.fill: parent color: "grey" Content { id: content anchors { top: parent.top bottom: parent.bottom left: parent.left right: effectSelectionPanel.left margins: 5 } gripSize: d.gripSize width: 600 height: 600 } Loader { id: performanceLoader function init() { console.log("[qmlvideofx] performanceLoader.init logging " + root.perfMonitorsLogging + " visible " + root.perfMonitorsVisible) var enabled = root.perfMonitorsLogging || root.perfMonitorsVisible source = enabled ? "../performancemonitor/PerformanceItem.qml" : "" } onLoaded: { item.parent = content item.anchors.top = content.top item.anchors.left = content.left item.anchors.right = content.right item.logging = root.perfMonitorsLogging item.displayed = root.perfMonitorsVisible item.init() } } ParameterPanel { id: parameterPanel anchors { left: parent.left bottom: parent.bottom right: effectSelectionPanel.left margins: 20 } gripSize: d.gripSize } EffectSelectionPanel { id: effectSelectionPanel anchors { top: parent.top bottom: fileOpen.top right: parent.right margins: 5 } width: 300 itemHeight: 40 onEffectSourceChanged: { content.effectSource = effectSource parameterPanel.model = content.effect.parameters } } FileOpen { id: fileOpen anchors { right: parent.right bottom: parent.bottom margins: 5 } width: effectSelectionPanel.width height: 165 buttonHeight: 32 topMargin: 10 } } FileBrowser { id: imageFileBrowser anchors.fill: root Component.onCompleted: fileSelected.connect(content.openImage) } FileBrowser { id: videoFileBrowser anchors.fill: root Component.onCompleted: fileSelected.connect(content.openVideo) } Component.onCompleted: { fileOpen.openImage.connect(openImage) fileOpen.openVideo.connect(openVideo) fileOpen.openCamera.connect(openCamera) fileOpen.close.connect(close) } function init() { console.log("[qmlvideofx] main.init") imageFileBrowser.folder = imagePath videoFileBrowser.folder = videoPath content.init() performanceLoader.init() if (fileName != "") content.openVideo(fileName) } function qmlFramePainted() { if (performanceLoader.item) performanceLoader.item.qmlFramePainted() } function openImage() { imageFileBrowser.show() } function openVideo() { videoFileBrowser.show() } function openCamera() { content.openCamera() } function close() { content.openImage("qrc:/images/qt-logo.png") } } main-smallscreen.qml000066400000000000000000000300751225012771600406750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root width: 640 height: 360 color: "grey" property string fileName property alias volume: content.volume property bool perfMonitorsLogging: false property bool perfMonitorsVisible: false QtObject { id: d property bool dialogShown: (fileOpenContainer.state == "shown" || effectSelectionPanel.state == "shown" || videoFileBrowser.shown || imageFileBrowser.shown) property real gripSize: 40 } // Create ScreenSaver element via Loader, so this app will still run if the // SystemInfo module is not available Loader { source: "DisableScreenSaver.qml" } Loader { id: performanceLoader Connections { target: d onDialogShownChanged: if (performanceLoader.item) performanceLoader.item.enabled = !d.dialogShown ignoreUnknownSignals: true } function init() { console.log("[qmlvideofx] performanceLoader.init logging " + root.perfMonitorsLogging + " visible " + root.perfMonitorsVisible) var enabled = root.perfMonitorsLogging || root.perfMonitorsVisible source = enabled ? "../performancemonitor/PerformanceItem.qml" : "" } onLoaded: { item.parent = root item.anchors.top = root.top item.anchors.left = root.left item.logging = root.perfMonitorsLogging item.displayed = root.perfMonitorsVisible item.init() } } Rectangle { id: inner anchors.fill: parent color: "grey" Content { id: content anchors.fill: parent gripSize: d.gripSize onVideoFramePainted: performanceLoader.item.videoFramePainted() } ParameterPanel { id: parameterPanel anchors { left: parent.left; right: parent.right; margins: 10 } y: parent.height gripSize: d.gripSize states: [ State { name: "shown" PropertyChanges { target: parameterPanel y: parent.height - (parameterPanel.height + 10) } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "y" easing.type: Easing.OutQuart duration: 500 } } ] state: (enabled && !d.dialogShown) ? "shown" : "baseState" } EffectSelectionPanel { id: effectSelectionPanel anchors { top: parent.top; bottom: parameterPanel.top; margins: 10 } x: parent.width width: parent.width - 40 opacity: 0.75 radius: 20 itemHeight: 50 states: [ State { name: "shown" PropertyChanges { target: effectSelectionPanel x: 20 } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "x" easing.type: Easing.OutQuart duration: 500 } } ] onEffectSourceChanged: { content.effectSource = effectSource if (content.effect.parameters.count) { parameterPanel.model = content.effect.parameters parameterPanel.enabled = true } else { parameterPanel.enabled = false } } onClicked: state = "baseState" } Rectangle { id: fileOpenContainer anchors { top: parent.top bottom: parameterPanel.top margins: 10 } x: -width width: parent.width - 40 color: "transparent" Column { anchors.fill: parent FileOpen { id: fileOpen color: "transparent" width: parent.width height: 200 opacity: 0.75 radius: 20 buttonHeight: 40 } MouseArea { width: parent.width height: 250 onClicked: fileOpenContainer.state = "baseState" } } states: [ State { name: "shown" PropertyChanges { target: fileOpenContainer x: 20 } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "x" easing.type: Easing.OutQuart duration: 500 } } ] } Rectangle { id: splashScreen anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } width: 300 height: 200 radius: 0.1 * height color: "white" opacity: 0.9 border { color: "black"; width: 2 } Text { anchors { fill: parent margins: 5 } horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 24 text: "Tap on left side to switch between sources.\n\nTap on right side to switch between effects." wrapMode: Text.WordWrap } MouseArea { anchors.fill: parent onClicked: parent.state = "hidden" } states: [ State { name: "hidden" PropertyChanges { target: splashScreen opacity: 0.0 } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "opacity" easing.type: Easing.OutQuart duration: 500 } } ] } HintedMouseArea { id: fileOpenMouseArea anchors { left: parent.left; top: parent.top; bottom: parameterPanel.top; topMargin: 75 } width: 100 onClicked: { fileOpenMouseArea.hintEnabled = false effectSelectionPanelMouseArea.hintEnabled = false splashScreen.state = "hidden" fileOpenContainer.state = "shown" } enabled: !d.dialogShown } HintedMouseArea { id: effectSelectionPanelMouseArea anchors { right: parent.right; top: parent.top; bottom: parameterPanel.top; topMargin: 75 } width: 100 onClicked: { fileOpenMouseArea.hintEnabled = false effectSelectionPanelMouseArea.hintEnabled = false splashScreen.state = "hidden" effectSelectionPanel.state = "shown" } enabled: !d.dialogShown } Image { source: "qrc:/images/close.png" anchors { top: parent.top right: parent.right margins: 5 } MouseArea { anchors.fill: parent onClicked: Qt.quit() } } } Component.onCompleted: { fileOpen.openImage.connect(openImage) fileOpen.openVideo.connect(openVideo) fileOpen.openCamera.connect(openCamera) fileOpen.close.connect(close) } FileBrowser { id: imageFileBrowser anchors.fill: root Component.onCompleted: fileSelected.connect(content.openImage) } FileBrowser { id: videoFileBrowser anchors.fill: root Component.onCompleted: fileSelected.connect(content.openVideo) } // Called from main() once root properties have been set function init() { console.log("[qmlvideofx] main.init") imageFileBrowser.folder = imagePath videoFileBrowser.folder = videoPath content.init() performanceLoader.init() if (fileName != "") { fileOpenMouseArea.hintEnabled = false effectSelectionPanelMouseArea.hintEnabled = false splashScreen.state = "hidden" content.openVideo(fileName) } } function qmlFramePainted() { if (performanceLoader.item) performanceLoader.item.qmlFramePainted() } function openImage() { fileOpenContainer.state = "baseState" imageFileBrowser.show() } function openVideo() { fileOpenContainer.state = "baseState" videoFileBrowser.show() } function openCamera() { fileOpenContainer.state = "baseState" content.openCamera() } function close() { fileOpenContainer.state = "baseState" content.openImage("qrc:/images/qt-logo.png") } } qmlapplicationviewer/000077500000000000000000000000001225012771600362135ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofxqmlapplicationviewer.cpp000066400000000000000000000102421225012771600431550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qmlapplicationviewer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmlapplicationviewer.h" #include #include #include #include #include #include class QmlApplicationViewerPrivate { QmlApplicationViewerPrivate(QQuickView *view_) : view(view_) {} QString mainQmlFile; QQuickView *view; friend class QmlApplicationViewer; QString adjustPath(const QString &path); }; QString QmlApplicationViewerPrivate::adjustPath(const QString &path) { #ifdef Q_OS_UNIX #ifdef Q_OS_MAC if (!QDir::isAbsolutePath(path)) return QCoreApplication::applicationDirPath() + QLatin1String("/../Resources/") + path; #else QString pathInInstallDir; const QString applicationDirPath = QCoreApplication::applicationDirPath(); pathInInstallDir = QString::fromLatin1("%1/../%2").arg(applicationDirPath, path); if (QFileInfo(pathInInstallDir).exists()) return pathInInstallDir; #endif #endif return path; } QmlApplicationViewer::QmlApplicationViewer(QWindow *parent) : QQuickView(parent) , d(new QmlApplicationViewerPrivate(this)) { connect(engine(), SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); setResizeMode(QQuickView::SizeRootObjectToView); } QmlApplicationViewer::QmlApplicationViewer(QQuickView *view, QWindow *parent) : QQuickView(parent) , d(new QmlApplicationViewerPrivate(view)) { connect(view->engine(), SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); view->setResizeMode(QQuickView::SizeRootObjectToView); } QmlApplicationViewer::~QmlApplicationViewer() { delete d; } QmlApplicationViewer *QmlApplicationViewer::create() { return new QmlApplicationViewer(); } void QmlApplicationViewer::setMainQmlFile(const QString &file) { d->mainQmlFile = d->adjustPath(file); d->view->setSource(QUrl::fromLocalFile(d->mainQmlFile)); } void QmlApplicationViewer::addImportPath(const QString &path) { d->view->engine()->addImportPath(d->adjustPath(path)); } void QmlApplicationViewer::showExpanded() { #if defined(Q_WS_SIMULATOR) d->view->showFullScreen(); #else d->view->show(); #endif } QGuiApplication *createApplication(int &argc, char **argv) { return new QGuiApplication(argc, argv); } qmlapplicationviewer.h000066400000000000000000000051111225012771600426210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qmlapplicationviewer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMLAPPLICATIONVIEWER_H #define QMLAPPLICATIONVIEWER_H #include #include class QmlApplicationViewer : public QQuickView { Q_OBJECT public: explicit QmlApplicationViewer(QWindow *parent = 0); virtual ~QmlApplicationViewer(); static QmlApplicationViewer *create(); void setMainQmlFile(const QString &file); void addImportPath(const QString &path); void showExpanded(); private: explicit QmlApplicationViewer(QQuickView *view, QWindow *parent); class QmlApplicationViewerPrivate *d; }; QGuiApplication *createApplication(int &argc, char **argv); #endif // QMLAPPLICATIONVIEWER_H qmlapplicationviewer.pri000066400000000000000000000001661225012771600431710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/qmlapplicationviewerQT += quick SOURCES += $$PWD/qmlapplicationviewer.cpp HEADERS += $$PWD/qmlapplicationviewer.h INCLUDEPATH += $$PWD qmlvideofx.png000066400000000000000000000065101225012771600346420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx‰PNG  IHDR@@ªiqÞbKGDþþþëÔ‚ pHYs__]™Ý‹ vpAg@@êóø` LIDATxÚí›kl\ÇuÇsïÝ7¹\>D­DQ/“z8‘åÈ’kÇ¢lɱÑÄA]–]$(Ð*mShÑ©áuChaÔ(ò!pÝ"Aò©­‹1(±“Ö•S'†­rb;²©ßåcß{ï=ýp—»¼ûâ’\ZÊ?°àræÜ™sþsfæÌ¹³ðÿªbé©^¡‰¤èèô†Ž‰öítMÙ Ó f€ˆŠþ¾ÿ¾Õ¶4€Çp?p8©`ÿ®-¾È}ÂÁîN¯ÏëѼ€sÀpÈ®Ã"L‹ÈY¶éóèô÷½~«m¬“€/õ‚ЂâY„/MŸÜäá#ZštDj¶c –'æȨ„«(†A¦@-Jš„šè¿ï¿nµíKXtyèžA0¶mòòÔƒ´„tlªÍ–e`)‡u ¸ € 7I„4;‡(úûÞ¸eÜ üج)xôhŸÚ¶Å%êÌ•ÿ»´¼ˆ‡™5\/àˆÜP0™³˜7tÉjšâkGϬŽë<ü ­Í¿÷ÙMDš×/õ„U{Æ]$ ÆYcÆK‰nÀ"€þck#ÆÈëáŽ,Fšt‚þåæ}%ã+yE-OQ• ùO8¸¤‘ 0Lÿ‹R L­ÉzÀÈÿõ­‹…C¡k•ÄU•ïË•IÂVä9 gü@§C×j<@ÑLµT£J#+u5X]ÿJK•ïËBª·¹2…oËö¯ª–*¶¶Ø”Îm¥47·uµ/5ê õ¸×T |.k âi‹ÉXŽ€ÖNOçmlkòÉZ béQ¦R7HdcΓJ«Ðnýd»ôZ‹CºXll©Ë@–-¼?˜àƈŸÇïxŠß¾ëv´oÃïñ¢”BrVš™ô¦Þä½ñטˌW ¡h‘ˆ y%4¥/±T-éYjs´bv_{3-á_Î2>ÞÂןúŸ½ã~”R%Ò ¯ ºhh7{Úîå'Cÿĵ¹÷ó²*o´âìùy‚z”?ý̰Uš±Ä±³ù)¥ªêÑh+]KpîRœóð÷=Íç>Pf|¥§¶6ïå·z¿BWó>DìIé¬Í»ð›½ÝþÇwü>÷vDWæç5 ¨kw”‚ÉÙ¿xŽ'?£‡*“\ÈNrúü¿òÜ^à??|Ó2 uínNì8EÀF”‚Ù“…¤Í‘ÝÐ5miwué´vêj\Š5À«Z8uì$†n¸¤’¹9N_þ:ïL~“wÆ_æw¿õüÇÙÓ.™]‘Cìoïs¼@ÁX,‹G pçöý+T}‹ÖÊ PKâ)‹®'¸¯÷.tï+“ùhúM.ÅÞÁÐ5ïm!Ió«ßbtv¼Ø¡Òùä¦ñé!,KžHmî góÎ%ô ¶XØbç§K5C,Ç·‚ñX޹¸Í‰ý÷à3¼®z[,cïb‹‰¦t<†âöMüø­+¼=ðþÍ‚l4ÔËå3 ø“£_!d´Òn/Ô=-ìŽ"™›#c%‰¥G±$GíX¡aTŠÎœŽG¦²ø ‡v|¢ì©´g:u3ô8ò›Û< ™œ»ökAO3v3>ù!OzŒæ@“«­ÎÐ.žÜß%s™q^>ÿ,3©á’Åvݦ@i'Îÿ¶ÀD,˦¦6ºÛ·V `¤9_ ) ði L^Dz-—üÁî}x4JP( ͇O0ÂKb‚Zº®•€eÚÊ™B,ž#ÚÒA$®@@‚œ•.Œ’x EЧ19?CÖ̹äoß¶‹pØæµÎpczÄU—53LÆÇ‰%§‰gæ±Åb½°ÌYÀ‰ÂTž€TÚ¢sK~¿L2c%óó´]Sø¼séY+G€âs{»¢ôìÌpê;OóOþ5tü‹…ºÑøe¾÷Ñ? b£k kªŽXcµT< ” ¦%dL!lƨ຦dó‘[šC#™M‘ÍeS~~#„Ï gç°l÷s¢LÒ2AÎNƒ­\ëŠ{pÖŽe¡bÇ–-X¶ð*ކˆ]ˆã] ë Ó41mÓU®+†òTUL¡å?9öVCÝÛ ˆ B1Z+e›™T lÛÂ.eMihªV÷ËåCJݬ¦[µdG¨X[s^/×ÓºÅUÔQ ¥À´+¯Èºf”)½¨¢¦ieÆ öW÷Æx@ÝÛ ®)tM‘ʦ‘ ÙRMéK2?Å3¶e º¦£—,œ¶XXbr«Q$ Ö. Îbæ5sÉxYP`(Z!ÙQŒLSð^ ݽà™vÓÎ.Ï|Uµ„å^W­Œ€ªPà1 àÓ™JÌ’1³eR^=˜?ɳr¦M“××p6ãä¬ôê5oÐæP ]LÌO3ŸŠ—ÕûÝŸŸNeYB:kÓhÂ[rtŽgcäìtå„éúçAVN€®):Z¹R&å×CDüQ„Åt—“?Èd…žÎí%ÉPa<1èœõ¥f—Ëêô1PÜË£í^<›·ΕI隇®¦½.—›É¢ã-;>'ssŒÄ/UdžîE) [l,Û¬°ë(µÔí"Î;Ãí>Þ¸p–‘Øx™dOëÝ„<­€M&'üz0έ{8²ûN—ÜÈÂE¦S7 gЬå>Dµºèôdb´ænZ}ÝÏj4êÈ + ]qGOƒSWùÉ?+“Œ6õrdë£`{8{~Žlª…¯~þ]ÙKL>˜â¹béâÙlì¯ÔÖJÀŠ¡Ý]~šC:?¿ø]®ÿÛ%ž¼ë$Ÿî=Lg¸Ã%2x{ø{ürü5æ2K Y\\!¿NÏ6[Æœ-ö¤T!/Pa$BÀªiMŸ¹;L{×Ež~åþàÛÏ0—œwÉeÌ¿šø)³™±’Q,Î=üE, Mé…Ïz¹}CX$A¡èlõ±e“Î/Þc`üªK¦Å×É':@SF…ûK±¢=ÝDa5ö,°–¸Bà¶®‰Ü¯ŸËm–Òèëþïù+Žv}¿Þ\1u¶BÜf×n~éqx•zÙ]^vmññò;?âæÌ¨«Þo4s óAŽlý<>#¸úŽŠø9¨Dc X#<ÅýŸŠ0¿Âó?ú—Š'ÆjÞFY,«F’Ü^èï[ûÝAwZ| o›D`k‡—ÇhçÜÅÓ|õû1ž8ü({¢»úü˜v–‰Ä ¦q2¥®›¥ Ъs1 ê Þo\N°!í8ƈÀ–v/›ïñO½Ç«×?äí©0~K2d¬¦-IÕ“üT€Lßõ"ˆ4êvº;X5E#Dœý;tnxde–L&/¥JWÚŠÆ›À0 rç†èEPÿœÌF^Í/àrÿÒ7Äõ\]:‡Ôâ“#U ãÜö¼IñJìâÕûQP1œËÖ ñêTݛ꽤TuþZ%†漜7t d! Jú}¼?¼X$ ¼ Ü„k?RÕ#ò†Ê40 j(o䢡£À ±ÁOß««±• øöe8Õk/¿Úª?¢,œGLãü8bÐ1R®CŽñÄI€²QIúûÞ¾ÕvÖ È“`ßÄ"nèê6ãxÆLÞ¨!Š®;2jT ›^èïZŸ;ýë ÷„ýR/|T;þܾûï;ÐÜmj0oü4ÀÐ-29úxãVë½ l`ØÀ6°µâÿŸUÑejÀq %tEXtdate:create2010-08-31T10:37:54+02:00~½ö­%tEXtdate:modify2010-08-31T10:37:37+02:00øg] tEXtSoftwareAdobe ImageReadyqÉe<IEND®B`‚qmlvideofx.pro000066400000000000000000000006151225012771600346560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofxTEMPLATE = app TARGET = qmlvideofx QT += quick SOURCES += filereader.cpp main.cpp HEADERS += filereader.h trace.h RESOURCES += qmlvideofx.qrc include($$PWD/../snippets/performancemonitor/performancemonitordeclarative.pri) maemo6: { DEFINES += SMALL_SCREEN_LAYOUT DEFINES += SMALL_SCREEN_PHYSICAL } target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/video/qmlvideofx INSTALLS += target qmlvideofx.qrc000066400000000000000000000064311225012771600346450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx images/close.png images/folder.png images/titlebar.png images/titlebar.sci images/up.png images/qt-logo.png qml/qmlvideofx/Button.qml qml/qmlvideofx/Content.qml qml/qmlvideofx/ContentCamera.qml qml/qmlvideofx/ContentImage.qml qml/qmlvideofx/ContentVideo.qml qml/qmlvideofx/DisableScreenSaver.qml qml/qmlvideofx/Divider.qml qml/qmlvideofx/Effect.qml qml/qmlvideofx/EffectBillboard.qml qml/qmlvideofx/EffectBlackAndWhite.qml qml/qmlvideofx/EffectEmboss.qml qml/qmlvideofx/EffectGaussianBlur.qml qml/qmlvideofx/EffectGlow.qml qml/qmlvideofx/EffectIsolate.qml qml/qmlvideofx/EffectMagnify.qml qml/qmlvideofx/EffectPageCurl.qml qml/qmlvideofx/EffectPassThrough.qml qml/qmlvideofx/EffectPixelate.qml qml/qmlvideofx/EffectPosterize.qml qml/qmlvideofx/EffectRipple.qml qml/qmlvideofx/EffectSelectionPanel.qml qml/qmlvideofx/EffectSepia.qml qml/qmlvideofx/EffectSharpen.qml qml/qmlvideofx/EffectShockwave.qml qml/qmlvideofx/EffectSobelEdgeDetection1.qml qml/qmlvideofx/EffectSobelEdgeDetection2.qml qml/qmlvideofx/EffectTiltShift.qml qml/qmlvideofx/EffectToon.qml qml/qmlvideofx/EffectVignette.qml qml/qmlvideofx/EffectWarhol.qml qml/qmlvideofx/EffectWobble.qml qml/qmlvideofx/FileBrowser.qml qml/qmlvideofx/FileOpen.qml qml/qmlvideofx/HintedMouseArea.qml qml/qmlvideofx/main-largescreen.qml qml/qmlvideofx/main-smallscreen.qml qml/qmlvideofx/ParameterPanel.qml qml/qmlvideofx/Slider.qml shaders/billboard.fsh shaders/blackandwhite.fsh shaders/emboss.fsh shaders/gaussianblur_h.fsh shaders/gaussianblur_v.fsh shaders/glow.fsh shaders/isolate.fsh shaders/magnify.fsh shaders/pagecurl.fsh shaders/pixelate.fsh shaders/posterize.fsh shaders/ripple.fsh shaders/selectionpanel.fsh shaders/sepia.fsh shaders/sharpen.fsh shaders/shockwave.fsh shaders/sobeledgedetection1.fsh shaders/sobeledgedetection2.fsh shaders/tiltshift.fsh shaders/toon.fsh shaders/vignette.fsh shaders/warhol.fsh shaders/wobble.fsh qmlvideofx.svg000066400000000000000000000145471225012771600346660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx image/svg+xml shaders/000077500000000000000000000000001225012771600334055ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofxbillboard.fsh000066400000000000000000000057331225012771600360510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float grid; uniform float dividerValue; uniform float step_x; uniform float step_y; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; float offx = floor(uv.x / (grid * step_x)); float offy = floor(uv.y / (grid * step_y)); vec3 res = texture2D(source, vec2(offx * grid * step_x , offy * grid * step_y)).rgb; vec2 prc = fract(uv / vec2(grid * step_x, grid * step_y)); vec2 pw = pow(abs(prc - 0.5), vec2(2.0)); float rs = pow(0.45, 2.0); float gr = smoothstep(rs - 0.1, rs + 0.1, pw.x + pw.y); float y = (res.r + res.g + res.b) / 3.0; vec3 ra = res / y; float ls = 0.3; float lb = ceil(y / ls); float lf = ls * lb + 0.3; res = lf * res; vec3 col = mix(res, vec3(0.1, 0.1, 0.1), gr); if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(col, 1.0); else gl_FragColor = qt_Opacity * texture2D(source, uv); } blackandwhite.fsh000066400000000000000000000047451225012771600367210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float threshold; uniform float dividerValue; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 orig = texture2D(source, uv); vec3 col = orig.rgb; float y = 0.3 *col.r + 0.59 * col.g + 0.11 * col.b; y = y < threshold ? 0.0 : 1.0; if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(y, y, y, 1.0); else gl_FragColor = qt_Opacity * orig; } emboss.fsh000066400000000000000000000061241225012771600354020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float dividerValue; const float step_w = 0.0015625; const float step_h = 0.0027778; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; vec3 t2 = texture2D(source, vec2(uv.x, uv.y - step_h)).rgb; vec3 t3 = texture2D(source, vec2(uv.x + step_w, uv.y - step_h)).rgb; vec3 t4 = texture2D(source, vec2(uv.x - step_w, uv.y)).rgb; vec3 t5 = texture2D(source, uv).rgb; vec3 t6 = texture2D(source, vec2(uv.x + step_w, uv.y)).rgb; vec3 t7 = texture2D(source, vec2(uv.x - step_w, uv.y + step_h)).rgb; vec3 t8 = texture2D(source, vec2(uv.x, uv.y + step_h)).rgb; vec3 t9 = texture2D(source, vec2(uv.x + step_w, uv.y + step_h)).rgb; vec3 rr = -4.0 * t1 - 4.0 * t2 - 4.0 * t4 + 12.0 * t5; float y = (rr.r + rr.g + rr.b) / 3.0; vec3 col = vec3(y, y, y) + 0.3; if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(col, 1.0); else gl_FragColor = qt_Opacity * texture2D(source, uv); } gaussianblur_h.fsh000066400000000000000000000055161225012771600371240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ uniform float dividerValue; uniform float blurSize; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 c = vec4(0.0); if (uv.x < dividerValue) { c += texture2D(source, uv - vec2(4.0*blurSize, 0.0)) * 0.05; c += texture2D(source, uv - vec2(3.0*blurSize, 0.0)) * 0.09; c += texture2D(source, uv - vec2(2.0*blurSize, 0.0)) * 0.12; c += texture2D(source, uv - vec2(1.0*blurSize, 0.0)) * 0.15; c += texture2D(source, uv) * 0.18; c += texture2D(source, uv + vec2(1.0*blurSize, 0.0)) * 0.15; c += texture2D(source, uv + vec2(2.0*blurSize, 0.0)) * 0.12; c += texture2D(source, uv + vec2(3.0*blurSize, 0.0)) * 0.09; c += texture2D(source, uv + vec2(4.0*blurSize, 0.0)) * 0.05; } else { c = texture2D(source, qt_TexCoord0); } gl_FragColor = qt_Opacity * c; } gaussianblur_v.fsh000066400000000000000000000055521225012771600371420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ uniform float dividerValue; uniform float blurSize; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 c = vec4(0.0); if (uv.x < dividerValue) { c += texture2D(source, uv - vec2(0.0, 4.0*blurSize)) * 0.05; c += texture2D(source, uv - vec2(0.0, 3.0*blurSize)) * 0.09; c += texture2D(source, uv - vec2(0.0, 2.0*blurSize)) * 0.12; c += texture2D(source, uv - vec2(0.0, 1.0*blurSize)) * 0.15; c += texture2D(source, uv) * 0.18; c += texture2D(source, uv + vec2(0.0, 1.0*blurSize)) * 0.15; c += texture2D(source, uv + vec2(0.0, 2.0*blurSize)) * 0.12; c += texture2D(source, uv + vec2(0.0, 3.0*blurSize)) * 0.09; c += texture2D(source, uv + vec2(0.0, 4.0*blurSize)) * 0.05; } else { c = texture2D(source, qt_TexCoord0); } // First pass we don't apply opacity gl_FragColor = c; } glow.fsh000066400000000000000000000061661225012771600350700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float dividerValue; const float step_w = 0.0015625; const float step_h = 0.0027778; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; vec3 t2 = texture2D(source, vec2(uv.x, uv.y - step_h)).rgb; vec3 t3 = texture2D(source, vec2(uv.x + step_w, uv.y - step_h)).rgb; vec3 t4 = texture2D(source, vec2(uv.x - step_w, uv.y)).rgb; vec3 t5 = texture2D(source, uv).rgb; vec3 t6 = texture2D(source, vec2(uv.x + step_w, uv.y)).rgb; vec3 t7 = texture2D(source, vec2(uv.x - step_w, uv.y + step_h)).rgb; vec3 t8 = texture2D(source, vec2(uv.x, uv.y + step_h)).rgb; vec3 t9 = texture2D(source, vec2(uv.x + step_w, uv.y + step_h)).rgb; vec3 xx = t1 + 2.0*t2 + t3 - t7 - 2.0*t8 - t9; vec3 yy = t1 - t3 + 2.0*t4 - 2.0*t6 + t7 - t9; vec3 rr = sqrt(xx * xx + yy * yy); vec3 col = rr * 2.0 * t5; if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(col, 1.0); else gl_FragColor = qt_Opacity * texture2D(source, uv); } isolate.fsh000066400000000000000000000064711225012771600355570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float targetHue; uniform float windowWidth; uniform float dividerValue; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void rgb2hsl(vec3 rgb, out float h, out float s, float l) { float maxval = max(rgb.r, max(rgb.g, rgb.b)); float minval = min(rgb.r, min(rgb.g, rgb.b)); float delta = maxval - minval; l = (minval + maxval) / 2.0; s = 0.0; if (l > 0.0 && l < 1.0) s = delta / (l < 0.5 ? 2.0 * l : 2.0 - 2.0 * l); h = 0.0; if (delta > 0.0) { if (rgb.r == maxval && rgb.g != maxval) h += (rgb.g - rgb.b ) / delta; if (rgb.g == maxval && rgb.b != maxval) h += 2.0 + (rgb.b - rgb.r) / delta; if (rgb.b == maxval && rgb.r != maxval) h += 4.0 + (rgb.r - rgb.g) / delta; h *= 60.0; } } void main() { vec2 uv = qt_TexCoord0.xy; vec3 col = texture2D(source, uv).rgb; float h, s, l; rgb2hsl(col, h, s, l); float h2 = (h > targetHue) ? h - 360.0 : h + 360.0; float y = 0.3 * col.r + 0.59 * col.g + 0.11 * col.b; vec3 result; if (uv.x > dividerValue || (abs(h - targetHue) < windowWidth) || (abs(h2 - targetHue) < windowWidth)) result = col; else result = vec3(y, y, y); gl_FragColor = qt_Opacity * vec4(result, 1.0); } magnify.fsh000066400000000000000000000053631225012771600355500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://www.reddit.com/r/programming/comments/losip/shader_toy/c2upn1e uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; uniform float radius; uniform float diffractionIndex; uniform float targetWidth; uniform float targetHeight; uniform float posX; uniform float posY; void main() { vec2 tc = qt_TexCoord0; vec2 center = vec2(posX, posY); vec2 xy = gl_FragCoord.xy - center.xy; float r = sqrt(xy.x * xy.x + xy.y * xy.y); if (r < radius) { float h = diffractionIndex * 0.5 * radius; vec2 new_xy = r < radius ? xy * (radius - h) / sqrt(radius * radius - r * r) : xy; vec2 targetSize = vec2(targetWidth, targetHeight); tc = (new_xy + center) / targetSize; tc.y = 1.0 - tc.y; } gl_FragColor = qt_Opacity * texture2D(source, tc); } pagecurl.fsh000066400000000000000000000152621225012771600357170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://rectalogic.github.com/webvfx/examples_2transition-shader-pagecurl_8html-example.html uniform float dividerValue; uniform float curlExtent; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; const float minAmount = -0.16; const float maxAmount = 1.3; const float PI = 3.141592653589793; const float scale = 512.0; const float sharpness = 3.0; const vec4 bgColor = vec4(1.0, 1.0, 0.8, 1.0); float amount = curlExtent * (maxAmount - minAmount) + minAmount; float cylinderCenter = amount; // 360 degrees * amount float cylinderAngle = 2.0 * PI * amount; const float cylinderRadius = 1.0 / PI / 2.0; vec3 hitPoint(float hitAngle, float yc, vec3 point, mat3 rrotation) { float hitPoint = hitAngle / (2.0 * PI); point.y = hitPoint; return rrotation * point; } vec4 antiAlias(vec4 color1, vec4 color2, float distance) { distance *= scale; if (distance < 0.0) return color2; if (distance > 2.0) return color1; float dd = pow(1.0 - distance / 2.0, sharpness); return ((color2 - color1) * dd) + color1; } float distanceToEdge(vec3 point) { float dx = abs(point.x > 0.5 ? 1.0 - point.x : point.x); float dy = abs(point.y > 0.5 ? 1.0 - point.y : point.y); if (point.x < 0.0) dx = -point.x; if (point.x > 1.0) dx = point.x - 1.0; if (point.y < 0.0) dy = -point.y; if (point.y > 1.0) dy = point.y - 1.0; if ((point.x < 0.0 || point.x > 1.0) && (point.y < 0.0 || point.y > 1.0)) return sqrt(dx * dx + dy * dy); return min(dx, dy); } vec4 seeThrough(float yc, vec2 p, mat3 rotation, mat3 rrotation) { float hitAngle = PI - (acos(yc / cylinderRadius) - cylinderAngle); vec3 point = hitPoint(hitAngle, yc, rotation * vec3(p, 1.0), rrotation); if (yc <= 0.0 && (point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0)) return bgColor; if (yc > 0.0) return texture2D(source, p); vec4 color = texture2D(source, point.xy); vec4 tcolor = vec4(0.0); return antiAlias(color, tcolor, distanceToEdge(point)); } vec4 seeThroughWithShadow(float yc, vec2 p, vec3 point, mat3 rotation, mat3 rrotation) { float shadow = distanceToEdge(point) * 30.0; shadow = (1.0 - shadow) / 3.0; if (shadow < 0.0) shadow = 0.0; else shadow *= amount; vec4 shadowColor = seeThrough(yc, p, rotation, rrotation); shadowColor.r -= shadow; shadowColor.g -= shadow; shadowColor.b -= shadow; return shadowColor; } vec4 backside(float yc, vec3 point) { vec4 color = texture2D(source, point.xy); float gray = (color.r + color.b + color.g) / 15.0; gray += (8.0 / 10.0) * (pow(1.0 - abs(yc / cylinderRadius), 2.0 / 10.0) / 2.0 + (5.0 / 10.0)); color.rgb = vec3(gray); return color; } void main(void) { const float angle = 30.0 * PI / 180.0; float c = cos(-angle); float s = sin(-angle); mat3 rotation = mat3( c, s, 0, -s, c, 0, 0.12, 0.258, 1 ); c = cos(angle); s = sin(angle); mat3 rrotation = mat3( c, s, 0, -s, c, 0, 0.15, -0.5, 1 ); vec3 point = rotation * vec3(qt_TexCoord0, 1.0); float yc = point.y - cylinderCenter; vec4 color = vec4(1.0, 0.0, 0.0, 1.0); if (yc < -cylinderRadius) { // See through to background color = bgColor; } else if (yc > cylinderRadius) { // Flat surface color = texture2D(source, qt_TexCoord0); } else { float hitAngle = (acos(yc / cylinderRadius) + cylinderAngle) - PI; float hitAngleMod = mod(hitAngle, 2.0 * PI); if ((hitAngleMod > PI && amount < 0.5) || (hitAngleMod > PI/2.0 && amount < 0.0)) { color = seeThrough(yc, qt_TexCoord0, rotation, rrotation); } else { point = hitPoint(hitAngle, yc, point, rrotation); if (point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0) { color = seeThroughWithShadow(yc, qt_TexCoord0, point, rotation, rrotation); } else { color = backside(yc, point); vec4 otherColor; if (yc < 0.0) { float shado = 1.0 - (sqrt(pow(point.x - 0.5, 2.0) + pow(point.y - 0.5, 2.0)) / 0.71); shado *= pow(-yc / cylinderRadius, 3.0); shado *= 0.5; otherColor = vec4(0.0, 0.0, 0.0, shado); } else { otherColor = texture2D(source, qt_TexCoord0); } color = antiAlias(color, otherColor, cylinderRadius - abs(yc)); // This second antialiasing step causes the shader to fail to render, on // Symbian devices (tested so far using IVE3.5). Running out of scratch // memory? } } } gl_FragColor = qt_Opacity * color; } pixelate.fsh000066400000000000000000000051041225012771600357220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://www.geeks3d.com/20101029/shader-library-pixelation-post-processing-effect-glsl/ uniform float dividerValue; uniform float granularity; uniform float targetWidth; uniform float targetHeight; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec2 tc = qt_TexCoord0; if (uv.x < dividerValue && granularity > 0.0) { float dx = granularity / targetWidth; float dy = granularity / targetHeight; tc = vec2(dx*(floor(uv.x/dx) + 0.5), dy*(floor(uv.y/dy) + 0.5)); } gl_FragColor = qt_Opacity * texture2D(source, tc); } posterize.fsh000066400000000000000000000051241225012771600361350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://www.geeks3d.com/20091027/shader-library-posterization-post-processing-effect-glsl/ uniform float dividerValue; uniform float gamma; uniform float numColors; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 c = vec4(0.0); if (uv.x < dividerValue) { vec3 x = texture2D(source, uv).rgb; x = pow(x, vec3(gamma, gamma, gamma)); x = x * numColors; x = floor(x); x = x / numColors; x = pow(x, vec3(1.0/gamma)); c = vec4(x, 1.0); } else { c = texture2D(source, uv); } gl_FragColor = qt_Opacity * c; } ripple.fsh000066400000000000000000000060711225012771600354060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://blog.qt.digia.com/blog/2011/03/22/the-convenient-power-of-qml-scene-graph/ uniform float dividerValue; uniform float targetWidth; uniform float targetHeight; uniform float time; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; const float PI = 3.1415926535; const int ITER = 7; const float RATE = 0.1; uniform float amplitude; uniform float n; void main() { vec2 uv = qt_TexCoord0.xy; vec2 tc = uv; vec2 p = vec2(-1.0 + 2.0 * gl_FragCoord.x / targetWidth, -(-1.0 + 2.0 * gl_FragCoord.y / targetHeight)); float diffx = 0.0; float diffy = 0.0; vec4 col; if (uv.x < dividerValue) { for (int i=0; i= (time - shock.z))) { float diff = (distance - time); float powDiff = 1.0 - pow(abs(diff*shock.x), shock.y*weight); float diffTime = diff * powDiff; vec2 diffUV = normalize(uv - center); tc += (diffUV * diffTime); } } gl_FragColor = qt_Opacity * texture2D(source, tc); } sobeledgedetection1.fsh000066400000000000000000000070301225012771600400200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on "Graphics Shaders: Theory and Practice" (http://cgeducation.org/ShadersBook/) uniform float dividerValue; uniform float mixLevel; uniform float resS; uniform float resT; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 c = vec4(0.0); if (uv.x < dividerValue) { vec2 st = qt_TexCoord0.st; vec3 irgb = texture2D(source, st).rgb; vec2 stp0 = vec2(1.0 / resS, 0.0); vec2 st0p = vec2(0.0 , 1.0 / resT); vec2 stpp = vec2(1.0 / resS, 1.0 / resT); vec2 stpm = vec2(1.0 / resS, -1.0 / resT); const vec3 W = vec3(0.2125, 0.7154, 0.0721); float i00 = dot(texture2D(source, st).rgb, W); float im1m1 = dot(texture2D(source, st-stpp).rgb, W); float ip1p1 = dot(texture2D(source, st+stpp).rgb, W); float im1p1 = dot(texture2D(source, st-stpm).rgb, W); float ip1m1 = dot(texture2D(source, st+stpm).rgb, W); float im10 = dot(texture2D(source, st-stp0).rgb, W); float ip10 = dot(texture2D(source, st+stp0).rgb, W); float i0m1 = dot(texture2D(source, st-st0p).rgb, W); float i0p1 = dot(texture2D(source, st+st0p).rgb, W); float h = -1.0*im1p1 - 2.0*i0p1 - 1.0*ip1p1 + 1.0*im1m1 + 2.0*i0m1 + 1.0*ip1m1; float v = -1.0*im1m1 - 2.0*im10 - 1.0*im1p1 + 1.0*ip1m1 + 2.0*ip10 + 1.0*ip1p1; float mag = 1.0 - length(vec2(h, v)); vec3 target = vec3(mag, mag, mag); c = vec4(target, 1.0); } else { c = texture2D(source, qt_TexCoord0); } gl_FragColor = qt_Opacity * c; } sobeledgedetection2.fsh000066400000000000000000000060471225012771600400300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://rastergrid.com/blog/downloads/frei-chen-edge-detector/ #version 130 uniform sampler2D source; uniform float dividerValue; uniform float weight; mat3 G[2] = mat3[]( mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 ), mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 ) ); uniform lowp float qt_Opacity; in vec2 qt_TexCoord0; out vec4 FragmentColor; void main() { vec2 uv = qt_TexCoord0.xy; vec4 c = vec4(0.0); if (uv.x < dividerValue) { mat3 intensity; float conv[2]; vec3 sample; for (int i=0; i<3; ++i) { for (int j=0; j<3; ++j) { sample = texelFetch(source, ivec2(gl_FragCoord) + ivec2(i-1, j-1), 0).rgb; intensity[i][j] = length(sample) * weight; } } for (int i=0; i<2; ++i) { float dp3 = dot(G[i][0], intensity[0]) + dot(G[i][1], intensity[1]) + dot(G[i][2], intensity[2]); conv[i] = dp3 * dp3; } c = vec4(0.5 * sqrt(conv[0]*conv[0] + conv[1]*conv[1])); } else { c = texture2D(source, qt_TexCoord0); } FragmentColor = qt_Opacity * c; } tiltshift.fsh000066400000000000000000000054601225012771600361260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float dividerValue; const float step_w = 0.0015625; const float step_h = 0.0027778; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; vec3 blur() { vec2 uv = qt_TexCoord0.xy; float y = uv.y < 0.4 ? uv.y : 1.0 - uv.y; float dist = 8.0 - 20.0 * y; vec3 acc = vec3(0.0, 0.0, 0.0); for (float y=-2.0; y<=2.0; ++y) { for (float x=-2.0; x<=2.0; ++x) { acc += texture2D(source, vec2(uv.x + dist * x * step_w, uv.y + 0.5 * dist * y * step_h)).rgb; } } return acc / 25.0; } void main() { vec2 uv = qt_TexCoord0.xy; vec3 col; if (uv.x > dividerValue || (uv.y >= 0.4 && uv.y <= 0.6)) col = texture2D(source, uv).rgb; else col = blur(); gl_FragColor = qt_Opacity * vec4(col, 1.0); } toon.fsh000066400000000000000000000077431225012771600351010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://www.geeks3d.com/20101029/shader-library-pixelation-post-processing-effect-glsl/ uniform float dividerValue; uniform float threshold; uniform float resS; uniform float resT; uniform float magTol; uniform float quantize; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec4 color = vec4(1.0, 0.0, 0.0, 1.1); vec2 uv = qt_TexCoord0.xy; if (uv.x < dividerValue) { vec2 st = qt_TexCoord0.st; vec3 rgb = texture2D(source, st).rgb; vec2 stp0 = vec2(1.0/resS, 0.0); vec2 st0p = vec2(0.0 , 1.0/resT); vec2 stpp = vec2(1.0/resS, 1.0/resT); vec2 stpm = vec2(1.0/resS, -1.0/resT); float i00 = dot( texture2D(source, st).rgb, vec3(0.2125,0.7154,0.0721)); float im1m1 = dot( texture2D(source, st-stpp).rgb, vec3(0.2125,0.7154,0.0721)); float ip1p1 = dot( texture2D(source, st+stpp).rgb, vec3(0.2125,0.7154,0.0721)); float im1p1 = dot( texture2D(source, st-stpm).rgb, vec3(0.2125,0.7154,0.0721)); float ip1m1 = dot( texture2D(source, st+stpm).rgb, vec3(0.2125,0.7154,0.0721)); float im10 = dot( texture2D(source, st-stp0).rgb, vec3(0.2125,0.7154,0.0721)); float ip10 = dot( texture2D(source, st+stp0).rgb, vec3(0.2125,0.7154,0.0721)); float i0m1 = dot( texture2D(source, st-st0p).rgb, vec3(0.2125,0.7154,0.0721)); float i0p1 = dot( texture2D(source, st+st0p).rgb, vec3(0.2125,0.7154,0.0721)); float h = -1.*im1p1 - 2.*i0p1 - 1.*ip1p1 + 1.*im1m1 + 2.*i0m1 + 1.*ip1m1; float v = -1.*im1m1 - 2.*im10 - 1.*im1p1 + 1.*ip1m1 + 2.*ip10 + 1.*ip1p1; float mag = sqrt(h*h + v*v); if (mag > magTol) { color = vec4(0.0, 0.0, 0.0, 1.0); } else { rgb.rgb *= quantize; rgb.rgb += vec3(0.5, 0.5, 0.5); ivec3 irgb = ivec3(rgb.rgb); rgb.rgb = vec3(irgb) / quantize; color = vec4(rgb, 1.0); } } else { color = texture2D(source, uv); } gl_FragColor = qt_Opacity * color; } vignette.fsh000066400000000000000000000050431225012771600357360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float dividerValue; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 orig = texture2D(source, uv); float cr = pow(0.1, 2.0); float pt = pow(uv.x - 0.5, 2.0) + pow(uv.y - 0.5, 2.0); float d = pt - cr; float cf = 1.0; if (d > 0.0) cf = 1.0 - 2.0 * d; vec3 col = cf * orig.rgb; if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(col, 1.0); else gl_FragColor = qt_Opacity * orig; } warhol.fsh000066400000000000000000000051561225012771600354120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://kodemongki.blogspot.com/2011/06/kameraku-custom-shader-effects-example.html uniform float dividerValue; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec4 orig = texture2D(source, uv); vec3 col = orig.rgb; float y = 0.3 *col.r + 0.59 * col.g + 0.11 * col.b; y = y < 0.3 ? 0.0 : (y < 0.6 ? 0.5 : 1.0); if (y == 0.5) col = vec3(0.8, 0.0, 0.0); else if (y == 1.0) col = vec3(0.9, 0.9, 0.0); else col = vec3(0.0, 0.0, 0.0); if (uv.x < dividerValue) gl_FragColor = qt_Opacity * vec4(col, 1.0); else gl_FragColor = qt_Opacity * orig; } wobble.fsh000066400000000000000000000047101225012771600353630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/shaders/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Based on http://blog.qt.digia.com/blog/2011/03/22/the-convenient-power-of-qml-scene-graph/ uniform float amplitude; uniform float dividerValue; uniform float frequency; uniform float time; uniform sampler2D source; uniform lowp float qt_Opacity; varying vec2 qt_TexCoord0; void main() { vec2 uv = qt_TexCoord0.xy; vec2 tc = qt_TexCoord0; if (uv.x < dividerValue) { vec2 p = sin(time + frequency * qt_TexCoord0); tc += amplitude * vec2(p.y, -p.x); } gl_FragColor = qt_Opacity * texture2D(source, tc); } trace.h000066400000000000000000000057241225012771600332330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/qmlvideofx/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TRACE_H #define TRACE_H #include #define ENABLE_TRACE //#define VERBOSE_TRACE namespace Trace { class NullDebug { public: template NullDebug &operator<<(const T &) { return *this; } }; inline NullDebug nullDebug() { return NullDebug(); } template struct PtrWrapper { PtrWrapper(const T *ptr) : m_ptr(ptr) { } const T *const m_ptr; }; } // namespace Trace template inline QDebug &operator<<(QDebug &debug, const Trace::PtrWrapper &wrapper) { debug.nospace() << "[" << (void*)wrapper.m_ptr << "]"; return debug.space(); } #ifdef ENABLE_TRACE inline QDebug qtTrace() { return qDebug() << "[qmlvideofx]"; } # ifdef VERBOSE_TRACE inline QDebug qtVerboseTrace() { return qtTrace(); } # else inline Trace::NullDebug qtVerboseTrace() { return Trace::nullDebug(); } # endif #else inline Trace::NullDebug qtTrace() { return Trace::nullDebug(); } inline Trace::NullDebug qtVerboseTrace() { return Trace::nullDebug(); } #endif #endif // TRACE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/000077500000000000000000000000001225012771600315225ustar00rootroot00000000000000frequencymonitor/000077500000000000000000000000001225012771600350545ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippetsfrequencymonitor.cpp000066400000000000000000000162641225012771600412020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "frequencymonitor.h" #include #include #include #include #include //#define VERBOSE_TRACE inline QDebug qtTrace() { return qDebug() << "[frequencymonitor]"; } #ifdef VERBOSE_TRACE inline QDebug qtVerboseTrace() { return qtTrace(); } #else inline QNoDebug qtVerboseTrace() { return QNoDebug(); } #endif static const int DefaultSamplingInterval = 100; static const int DefaultTraceInterval = 0; class FrequencyMonitorPrivate : public QObject { Q_OBJECT public: FrequencyMonitorPrivate(FrequencyMonitor *parent); void calculateInstantaneousFrequency(); private slots: void calculateAverageFrequency(); void stalled(); public: FrequencyMonitor *const q_ptr; QString m_label; bool m_active; qreal m_instantaneousFrequency; QElapsedTimer m_instantaneousElapsed; QTimer *m_averageTimer; QElapsedTimer m_averageElapsed; int m_count; qreal m_averageFrequency; QTimer *m_traceTimer; QTimer *m_stalledTimer; }; FrequencyMonitorPrivate::FrequencyMonitorPrivate(FrequencyMonitor *parent) : QObject(parent) , q_ptr(parent) , m_active(false) , m_instantaneousFrequency(0) , m_averageTimer(new QTimer(this)) , m_count(0) , m_averageFrequency(0) , m_traceTimer(new QTimer(this)) , m_stalledTimer(new QTimer(this)) { m_instantaneousElapsed.start(); connect(m_averageTimer, SIGNAL(timeout()), this, SLOT(calculateAverageFrequency())); if (DefaultSamplingInterval) m_averageTimer->start(DefaultSamplingInterval); m_averageElapsed.start(); connect(m_traceTimer, SIGNAL(timeout()), q_ptr, SLOT(trace())); if (DefaultTraceInterval) m_traceTimer->start(DefaultTraceInterval); m_stalledTimer->setSingleShot(true); connect(m_stalledTimer, SIGNAL(timeout()), this, SLOT(stalled())); } void FrequencyMonitorPrivate::calculateInstantaneousFrequency() { const qint64 ms = m_instantaneousElapsed.restart(); m_instantaneousFrequency = ms ? qreal(1000) / ms : 0; m_stalledTimer->start(3 * ms); if (m_instantaneousFrequency) q_ptr->setActive(true); emit q_ptr->instantaneousFrequencyChanged(m_instantaneousFrequency); emit q_ptr->frequencyChanged(); } void FrequencyMonitorPrivate::calculateAverageFrequency() { const qint64 ms = m_averageElapsed.restart(); m_averageFrequency = qreal(m_count * 1000) / ms; emit q_ptr->averageFrequencyChanged(m_averageFrequency); emit q_ptr->frequencyChanged(); m_count = 0; } void FrequencyMonitorPrivate::stalled() { if (m_instantaneousFrequency) { qtVerboseTrace() << "FrequencyMonitor::stalled"; m_instantaneousFrequency = 0; emit q_ptr->instantaneousFrequencyChanged(m_instantaneousFrequency); emit q_ptr->frequencyChanged(); } } FrequencyMonitor::FrequencyMonitor(QObject *parent) : QObject(parent) { d_ptr = new FrequencyMonitorPrivate(this); qtTrace() << "FrequencyMonitor::FrequencyMonitor"; } FrequencyMonitor::~FrequencyMonitor() { } QString FrequencyMonitor::label() const { return d_func()->m_label; } bool FrequencyMonitor::active() const { return d_func()->m_active; } int FrequencyMonitor::samplingInterval() const { return d_ptr->m_averageTimer->isActive() ? d_ptr->m_averageTimer->interval() : 0; } int FrequencyMonitor::traceInterval() const { return d_ptr->m_traceTimer->isActive() ? d_ptr->m_traceTimer->interval() : 0; } qreal FrequencyMonitor::instantaneousFrequency() const { return d_func()->m_instantaneousFrequency; } qreal FrequencyMonitor::averageFrequency() const { return d_func()->m_averageFrequency; } void FrequencyMonitor::notify() { Q_D(FrequencyMonitor); ++(d->m_count); d->calculateInstantaneousFrequency(); } void FrequencyMonitor::trace() { Q_D(FrequencyMonitor); const QString value = QString::fromLatin1("instant %1 average %2") .arg(d->m_instantaneousFrequency, 0, 'f', 2) .arg(d->m_averageFrequency, 0, 'f', 2); if (d->m_label.isEmpty()) qtTrace() << "FrequencyMonitor::trace" << value; else qtTrace() << "FrequencyMonitor::trace" << "label" << d->m_label << value; } void FrequencyMonitor::setLabel(const QString &value) { Q_D(FrequencyMonitor); if (d->m_label != value) { d->m_label = value; emit labelChanged(d->m_label); } } void FrequencyMonitor::setActive(bool value) { Q_D(FrequencyMonitor); if (d->m_active != value) { d->m_active = value; emit activeChanged(d->m_active); } } void FrequencyMonitor::setSamplingInterval(int value) { Q_D(FrequencyMonitor); if (samplingInterval() != value) { if (value) { d->m_averageTimer->setInterval(value); d->m_averageTimer->start(); } else { d->m_averageTimer->stop(); } emit samplingIntervalChanged(value); } } void FrequencyMonitor::setTraceInterval(int value) { Q_D(FrequencyMonitor); if (traceInterval() != value) { if (value) { d->m_traceTimer->setInterval(value); d->m_traceTimer->start(); } else { d->m_traceTimer->stop(); } emit traceIntervalChanged(value); } } #include "frequencymonitor.moc" frequencymonitor.h000066400000000000000000000075031225012771600406430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef FREQUENCYMONITOR_H #define FREQUENCYMONITOR_H #include #include class FrequencyMonitorPrivate; /** * Class for measuring frequency of events * * Occurrence of the event is notified by the client via the notify() slot. * On a regular interval, both an instantaneous and a rolling average * event frequency are calculated. */ class FrequencyMonitor : public QObject { Q_OBJECT Q_DECLARE_PRIVATE(FrequencyMonitor) Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged) Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) Q_PROPERTY(int samplingInterval READ samplingInterval WRITE setSamplingInterval NOTIFY samplingIntervalChanged) Q_PROPERTY(int traceInterval READ traceInterval WRITE setTraceInterval NOTIFY traceIntervalChanged) Q_PROPERTY(qreal instantaneousFrequency READ instantaneousFrequency NOTIFY instantaneousFrequencyChanged) Q_PROPERTY(qreal averageFrequency READ averageFrequency NOTIFY averageFrequencyChanged) public: FrequencyMonitor(QObject *parent = 0); ~FrequencyMonitor(); static void qmlRegisterType(); QString label() const; bool active() const; int samplingInterval() const; int traceInterval() const; qreal instantaneousFrequency() const; qreal averageFrequency() const; signals: void labelChanged(const QString &value); void activeChanged(bool); void samplingIntervalChanged(int value); void traceIntervalChanged(int value); void frequencyChanged(); void instantaneousFrequencyChanged(qreal value); void averageFrequencyChanged(qreal value); public slots: Q_INVOKABLE void notify(); Q_INVOKABLE void trace(); void setActive(bool value); void setLabel(const QString &value); void setSamplingInterval(int value); void setTraceInterval(int value); private: FrequencyMonitorPrivate *d_ptr; }; #endif // FREQUENCYMONITOR_H frequencymonitor.pri000066400000000000000000000002041225012771600411750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitorHEADERS += $$PWD/frequencymonitor.h SOURCES += $$PWD/frequencymonitor.cpp INCLUDEPATH += $$PWD DEFINES += FREQUENCYMONITOR_SUPPORT frequencymonitordeclarative.cpp000066400000000000000000000041431225012771600433770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "frequencymonitor.h" #include void FrequencyMonitor::qmlRegisterType() { ::qmlRegisterType("FrequencyMonitor", 1, 0, "FrequencyMonitor"); } frequencymonitordeclarative.pri000066400000000000000000000002231225012771600434020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitorinclude($$PWD/frequencymonitor.pri) QT += qml SOURCES += $$PWD/frequencymonitordeclarative.cpp RESOURCES += $$PWD/frequencymonitordeclarative.qrc frequencymonitordeclarative.qrc000066400000000000000000000001651225012771600434020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor qml/frequencymonitor/FrequencyItem.qml qml/000077500000000000000000000000001225012771600356455ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitorfrequencymonitor/000077500000000000000000000000001225012771600412565ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor/qmlFrequencyItem.qml000066400000000000000000000066751225012771600445670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/frequencymonitor/qml/frequencymonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import FrequencyMonitor 1.0 Rectangle { id: root property bool logging: true property bool displayed: true property bool enabled: logging || displayed property alias active: monitor.active property int samplingInterval: 500 property color textColor: "yellow" property int textSize: 20 property alias label: monitor.label border.width: 1 border.color: "yellow" width: 5.5 * root.textSize height: 3.0 * root.textSize color: "black" opacity: 0.5 radius: 10 visible: displayed && active // This should ensure that the monitor is on top of all other content z: 999 function notify() { monitor.notify() } FrequencyMonitor { id: monitor samplingInterval: root.enabled ? root.samplingInterval : 0 onAverageFrequencyChanged: { if (root.logging) trace() averageFrequencyText.text = monitor.averageFrequency.toFixed(2) } } Text { id: labelText anchors { left: parent.left top: parent.top margins: 10 } color: root.textColor font.pixelSize: 0.6 * root.textSize text: root.label width: root.width - 2*anchors.margins elide: Text.ElideRight } Text { id: averageFrequencyText anchors { right: parent.right bottom: parent.bottom margins: 10 } color: root.textColor font.pixelSize: root.textSize } } performancemonitor/000077500000000000000000000000001225012771600353545ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippetsperformancemonitor.cpp000066400000000000000000000050331225012771600417720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "performancemonitor.h" namespace PerformanceMonitor { bool State::parseArgument(const QByteArray &arg) { bool result = false; if (arg == "-log-perf") { logging = true; valid = true; result = true; } else if (arg == "-no-log-perf") { logging = false; valid = true; result = true; } else if (arg == "-show-perf") { visible = true; valid = true; result = true; } else if (arg == "-hide-perf") { visible = false; valid = true; result = true; } return result; } } // namespace PerformanceMonitor performancemonitor.h000066400000000000000000000050741225012771600414440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PERFORMANCEMONITOR_H #define PERFORMANCEMONITOR_H #include namespace PerformanceMonitor { struct State { State() : valid(true), logging(false), visible(true) { } State(bool l, bool v) : valid(true), logging(l), visible(v) { } bool operator==(const State &other) const { return logging == other.logging && visible == other.visible; } bool operator!=(const State &other) const { return logging != other.logging || visible != other.visible; } bool parseArgument(const QByteArray &arg); bool valid; bool logging; bool visible; }; } // namespace PerformanceMonitor #endif // PERFORMANCEMONITOR_H performancemonitor.pri000066400000000000000000000002121225012771600417740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitorINCLUDEPATH += $$PWD HEADERS += $$PWD/performancemonitor.h SOURCES += $$PWD/performancemonitor.cpp DEFINES += PERFORMANCEMONITOR_SUPPORT performancemonitordeclarative.cpp000066400000000000000000000041361225012771600442010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "frequencymonitor.h" #include "performancemonitor.h" namespace PerformanceMonitor { void qmlRegisterTypes() { FrequencyMonitor::qmlRegisterType(); } } performancemonitordeclarative.h000066400000000000000000000042031225012771600436410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PERFORMANCEMONITORDECLARATIVE_H #define PERFORMANCEMONITORDECLARATIVE_H #include "performancemonitor.h" namespace PerformanceMonitor { void qmlRegisterTypes(); } #endif // PERFORMANCEMONITORDECLARATIVE_H performancemonitordeclarative.pri000066400000000000000000000004031225012771600442020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitorinclude($$PWD/../frequencymonitor/frequencymonitordeclarative.pri) include($$PWD/performancemonitor.pri) HEADERS += $$PWD/performancemonitordeclarative.h SOURCES += $$PWD/performancemonitordeclarative.cpp RESOURCES += $$PWD/performancemonitordeclarative.qrc performancemonitordeclarative.qrc000066400000000000000000000001711225012771600441770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor qml/performancemonitor/PerformanceItem.qml qml/000077500000000000000000000000001225012771600361455ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitorperformancemonitor/000077500000000000000000000000001225012771600420565ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/qmlPerformanceItem.qml000066400000000000000000000112601225012771600456510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/snippets/performancemonitor/qml/performancemonitor/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: root property bool logging: true property bool displayed: true property bool videoActive property int margins: 5 property bool enabled: true color: "transparent" // This should ensure that the monitor is on top of all other content z: 999 Column { id: column anchors { fill: root margins: 10 } spacing: 10 } QtObject { id: d property Item qmlFrameRateItem: null property Item videoFrameRateItem: null } Connections { id: videoFrameRateActiveConnections ignoreUnknownSignals: true onActiveChanged: root.videoActive = videoFrameRateActiveConnections.target.active } states: [ State { name: "hidden" PropertyChanges { target: root opacity: 0 } } ] transitions: [ Transition { from: "*" to: "*" NumberAnimation { properties: "opacity" easing.type: Easing.OutQuart duration: 500 } } ] state: enabled ? "baseState" : "hidden" function createQmlFrameRateItem() { var component = Qt.createComponent("../frequencymonitor/FrequencyItem.qml") if (component.status == Component.Ready) d.qmlFrameRateItem = component.createObject(column, { label: "QML frame rate", displayed: root.displayed, logging: root.logging }) } function createVideoFrameRateItem() { var component = Qt.createComponent("../frequencymonitor/FrequencyItem.qml") if (component.status == Component.Ready) d.videoFrameRateItem = component.createObject(column, { label: "Video frame rate", displayed: root.displayed, logging: root.logging }) videoFrameRateActiveConnections.target = d.videoFrameRateItem } function init() { createQmlFrameRateItem() createVideoFrameRateItem() } function videoFramePainted() { if (d.videoFrameRateItem) d.videoFrameRateItem.notify() } function qmlFramePainted() { if (d.qmlFrameRateItem) d.qmlFrameRateItem.notify() } onVideoActiveChanged: { if (d.videoFrameRateItem) d.videoFrameRateItem.active = root.videoActive } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimedia/video/video.pro000066400000000000000000000000641225012771600315050ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += qmlvideo qmlvideofx qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/000077500000000000000000000000001225012771600301365ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/000077500000000000000000000000001225012771600313665ustar00rootroot00000000000000camera.cpp000066400000000000000000000314341225012771600332500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "camera.h" #include "ui_camera.h" #include "videosettings.h" #include "imagesettings.h" #include #include #include #include #include #include #include #if (defined(Q_WS_MAEMO_6)) && QT_VERSION >= 0x040700 #define HAVE_CAMERA_BUTTONS #endif Camera::Camera(QWidget *parent) : QMainWindow(parent), ui(new Ui::Camera), camera(0), imageCapture(0), mediaRecorder(0), isCapturingImage(false), applicationExiting(false) { ui->setupUi(this); //Camera devices: QByteArray cameraDevice; QActionGroup *videoDevicesGroup = new QActionGroup(this); videoDevicesGroup->setExclusive(true); foreach(const QByteArray &deviceName, QCamera::availableDevices()) { QString description = camera->deviceDescription(deviceName); QAction *videoDeviceAction = new QAction(description, videoDevicesGroup); videoDeviceAction->setCheckable(true); videoDeviceAction->setData(QVariant(deviceName)); if (cameraDevice.isEmpty()) { cameraDevice = deviceName; videoDeviceAction->setChecked(true); } ui->menuDevices->addAction(videoDeviceAction); } connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), SLOT(updateCameraDevice(QAction*))); connect(ui->captureWidget, SIGNAL(currentChanged(int)), SLOT(updateCaptureMode())); #ifdef HAVE_CAMERA_BUTTONS ui->lockButton->hide(); #endif setCamera(cameraDevice); } Camera::~Camera() { delete mediaRecorder; delete imageCapture; delete camera; } void Camera::setCamera(const QByteArray &cameraDevice) { delete imageCapture; delete mediaRecorder; delete camera; if (cameraDevice.isEmpty()) camera = new QCamera; else camera = new QCamera(cameraDevice); connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State))); connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError())); mediaRecorder = new QMediaRecorder(camera); connect(mediaRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateRecorderState(QMediaRecorder::State))); imageCapture = new QCameraImageCapture(camera); connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateRecordTime())); connect(mediaRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayRecorderError())); mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Title"))); connect(ui->exposureCompensation, SIGNAL(valueChanged(int)), SLOT(setExposureCompensation(int))); camera->setViewfinder(ui->viewfinder); updateCameraState(camera->state()); updateLockStatus(camera->lockStatus(), QCamera::UserRequest); updateRecorderState(mediaRecorder->state()); connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool))); connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(processCapturedImage(int,QImage))); connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSaved(int,QString))); connect(imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this, SLOT(displayCaptureError(int,QCameraImageCapture::Error,QString))); connect(camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason)), this, SLOT(updateLockStatus(QCamera::LockStatus, QCamera::LockChangeReason))); ui->captureWidget->setTabEnabled(0, (camera->isCaptureModeSupported(QCamera::CaptureStillImage))); ui->captureWidget->setTabEnabled(1, (camera->isCaptureModeSupported(QCamera::CaptureVideo))); updateCaptureMode(); camera->start(); } void Camera::keyPressEvent(QKeyEvent * event) { if (event->isAutoRepeat()) return; switch (event->key()) { case Qt::Key_CameraFocus: displayViewfinder(); camera->searchAndLock(); event->accept(); break; case Qt::Key_Camera: if (camera->captureMode() == QCamera::CaptureStillImage) { takeImage(); } else { if (mediaRecorder->state() == QMediaRecorder::RecordingState) stop(); else record(); } event->accept(); break; default: QMainWindow::keyPressEvent(event); } } void Camera::keyReleaseEvent(QKeyEvent *event) { if (event->isAutoRepeat()) return; switch (event->key()) { case Qt::Key_CameraFocus: camera->unlock(); break; default: QMainWindow::keyReleaseEvent(event); } } void Camera::updateRecordTime() { QString str = QString("Recorded %1 sec").arg(mediaRecorder->duration()/1000); ui->statusbar->showMessage(str); } void Camera::processCapturedImage(int requestId, const QImage& img) { Q_UNUSED(requestId); QImage scaledImage = img.scaled(ui->viewfinder->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); ui->lastImagePreviewLabel->setPixmap(QPixmap::fromImage(scaledImage)); // Display captured image for 4 seconds. displayCapturedImage(); QTimer::singleShot(4000, this, SLOT(displayViewfinder())); } void Camera::configureCaptureSettings() { switch (camera->captureMode()) { case QCamera::CaptureStillImage: configureImageSettings(); break; case QCamera::CaptureVideo: configureVideoSettings(); break; default: break; } } void Camera::configureVideoSettings() { VideoSettings settingsDialog(mediaRecorder); settingsDialog.setAudioSettings(audioSettings); settingsDialog.setVideoSettings(videoSettings); settingsDialog.setFormat(videoContainerFormat); if (settingsDialog.exec()) { audioSettings = settingsDialog.audioSettings(); videoSettings = settingsDialog.videoSettings(); videoContainerFormat = settingsDialog.format(); mediaRecorder->setEncodingSettings( audioSettings, videoSettings, videoContainerFormat); } } void Camera::configureImageSettings() { ImageSettings settingsDialog(imageCapture); settingsDialog.setImageSettings(imageSettings); if (settingsDialog.exec()) { imageSettings = settingsDialog.imageSettings(); imageCapture->setEncodingSettings(imageSettings); } } void Camera::record() { mediaRecorder->record(); updateRecordTime(); } void Camera::pause() { mediaRecorder->pause(); } void Camera::stop() { mediaRecorder->stop(); } void Camera::setMuted(bool muted) { mediaRecorder->setMuted(muted); } void Camera::toggleLock() { switch (camera->lockStatus()) { case QCamera::Searching: case QCamera::Locked: camera->unlock(); break; case QCamera::Unlocked: camera->searchAndLock(); } } void Camera::updateLockStatus(QCamera::LockStatus status, QCamera::LockChangeReason reason) { QColor indicationColor = Qt::black; switch (status) { case QCamera::Searching: indicationColor = Qt::yellow; ui->statusbar->showMessage(tr("Focusing...")); ui->lockButton->setText(tr("Focusing...")); break; case QCamera::Locked: indicationColor = Qt::darkGreen; ui->lockButton->setText(tr("Unlock")); ui->statusbar->showMessage(tr("Focused"), 2000); break; case QCamera::Unlocked: indicationColor = reason == QCamera::LockFailed ? Qt::red : Qt::black; ui->lockButton->setText(tr("Focus")); if (reason == QCamera::LockFailed) ui->statusbar->showMessage(tr("Focus Failed"), 2000); } QPalette palette = ui->lockButton->palette(); palette.setColor(QPalette::ButtonText, indicationColor); ui->lockButton->setPalette(palette); } void Camera::takeImage() { isCapturingImage = true; imageCapture->capture(); } void Camera::displayCaptureError(int id, const QCameraImageCapture::Error error, const QString &errorString) { Q_UNUSED(id); Q_UNUSED(error); QMessageBox::warning(this, tr("Image Capture Error"), errorString); isCapturingImage = false; } void Camera::startCamera() { camera->start(); } void Camera::stopCamera() { camera->stop(); } void Camera::updateCaptureMode() { int tabIndex = ui->captureWidget->currentIndex(); QCamera::CaptureModes captureMode = tabIndex == 0 ? QCamera::CaptureStillImage : QCamera::CaptureVideo; if (camera->isCaptureModeSupported(captureMode)) camera->setCaptureMode(captureMode); } void Camera::updateCameraState(QCamera::State state) { switch (state) { case QCamera::ActiveState: ui->actionStartCamera->setEnabled(false); ui->actionStopCamera->setEnabled(true); ui->captureWidget->setEnabled(true); ui->actionSettings->setEnabled(true); break; case QCamera::UnloadedState: case QCamera::LoadedState: ui->actionStartCamera->setEnabled(true); ui->actionStopCamera->setEnabled(false); ui->captureWidget->setEnabled(false); ui->actionSettings->setEnabled(false); } } void Camera::updateRecorderState(QMediaRecorder::State state) { switch (state) { case QMediaRecorder::StoppedState: ui->recordButton->setEnabled(true); ui->pauseButton->setEnabled(true); ui->stopButton->setEnabled(false); break; case QMediaRecorder::PausedState: ui->recordButton->setEnabled(true); ui->pauseButton->setEnabled(false); ui->stopButton->setEnabled(true); break; case QMediaRecorder::RecordingState: ui->recordButton->setEnabled(false); ui->pauseButton->setEnabled(true); ui->stopButton->setEnabled(true); break; } } void Camera::setExposureCompensation(int index) { camera->exposure()->setExposureCompensation(index*0.5); } void Camera::displayRecorderError() { QMessageBox::warning(this, tr("Capture error"), mediaRecorder->errorString()); } void Camera::displayCameraError() { QMessageBox::warning(this, tr("Camera error"), camera->errorString()); } void Camera::updateCameraDevice(QAction *action) { setCamera(action->data().toByteArray()); } void Camera::displayViewfinder() { ui->stackedWidget->setCurrentIndex(0); } void Camera::displayCapturedImage() { ui->stackedWidget->setCurrentIndex(1); } void Camera::readyForCapture(bool ready) { ui->takeImageButton->setEnabled(ready); } void Camera::imageSaved(int id, const QString &fileName) { Q_UNUSED(id); Q_UNUSED(fileName); isCapturingImage = false; if (applicationExiting) close(); } void Camera::closeEvent(QCloseEvent *event) { if (isCapturingImage) { setEnabled(false); applicationExiting = true; event->ignore(); } else { event->accept(); } } camera.h000066400000000000000000000074171225012771600327210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CAMERA_H #define CAMERA_H #include #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class Camera; } QT_END_NAMESPACE class Camera : public QMainWindow { Q_OBJECT public: Camera(QWidget *parent = 0); ~Camera(); private slots: void setCamera(const QByteArray &cameraDevice); void startCamera(); void stopCamera(); void record(); void pause(); void stop(); void setMuted(bool); void toggleLock(); void takeImage(); void displayCaptureError(int, QCameraImageCapture::Error, const QString &errorString); void configureCaptureSettings(); void configureVideoSettings(); void configureImageSettings(); void displayRecorderError(); void displayCameraError(); void updateCameraDevice(QAction *action); void updateCameraState(QCamera::State); void updateCaptureMode(); void updateRecorderState(QMediaRecorder::State state); void setExposureCompensation(int index); void updateRecordTime(); void processCapturedImage(int requestId, const QImage &img); void updateLockStatus(QCamera::LockStatus, QCamera::LockChangeReason); void displayViewfinder(); void displayCapturedImage(); void readyForCapture(bool ready); void imageSaved(int id, const QString &fileName); protected: void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); private: Ui::Camera *ui; QCamera *camera; QCameraImageCapture *imageCapture; QMediaRecorder* mediaRecorder; QImageEncoderSettings imageSettings; QAudioEncoderSettings audioSettings; QVideoEncoderSettings videoSettings; QString videoContainerFormat; bool isCapturingImage; bool applicationExiting; }; #endif camera.pro000066400000000000000000000006141225012771600332620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/cameraTEMPLATE = app TARGET = camera QT += multimedia multimediawidgets HEADERS = \ camera.h \ imagesettings.h \ videosettings.h SOURCES = \ main.cpp \ camera.cpp \ imagesettings.cpp \ videosettings.cpp FORMS += \ camera.ui \ videosettings.ui \ imagesettings.ui target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/camera INSTALLS += target QT+=widgets camera.ui000066400000000000000000000307651225012771600331110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera Camera 0 0 668 422 Camera 1 0 255 255 255 145 145 145 255 255 255 145 145 145 145 145 145 145 145 145 0 0 0 QFrame::Box Focus 0 Image false Capture Photo Qt::Vertical 20 161 Exposure Compensation: -4 4 2 Qt::Horizontal QSlider::TicksAbove Video Record Pause Stop Qt::Vertical 20 76 Mute true 0 0 668 25 File Devices Exit Start Camera Stop Camera Settings QCameraViewfinder QWidget

qcameraviewfinder.h
1 recordButton clicked() Camera record() 647 149 61 238 stopButton clicked() Camera stop() 647 225 140 236 pauseButton clicked() Camera pause() 647 187 234 237 actionExit triggered() Camera close() -1 -1 154 130 takeImageButton clicked() Camera takeImage() 625 132 603 169 lockButton clicked() Camera toggleLock() 658 75 453 119 muteButton toggled(bool) Camera setMuted(bool) 647 377 5 280 exposureCompensation valueChanged(int) Camera setExposureCompensation(int) 559 367 665 365 actionSettings triggered() Camera configureCaptureSettings() -1 -1 333 210 actionStartCamera triggered() Camera startCamera() -1 -1 333 210 actionStopCamera triggered() Camera stopCamera() -1 -1 333 210 record() pause() stop() enablePreview(bool) configureCaptureSettings() takeImage() startCamera() toggleLock() setMuted(bool) stopCamera() setExposureCompensation(int) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/doc/000077500000000000000000000000001225012771600321335ustar00rootroot00000000000000images/000077500000000000000000000000001225012771600333215ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/doccamera-example.png000066400000000000000000000325171225012771600367200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/doc/images‰PNG  IHDR¤Â¶aL$sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœíÝwtUÇñ;[ÒC¨©”$°R—CGEštAE@D@TAƒ ˆ"( ‘*R”¢4A)RÒk(! $Ò¶ÌûÇ&1À&ÞÀ&—ïçpŽÙÙ™gžY ¿¹wfw•€à2!UªªZÌ!ᯠP˜5 Öd¨B¨ªªZµù —R•{wxÒA€üùËß©WŽ-ÿj°í¡â_¡¬°ªÕZÐïU!Dl|²CÛ  ¸–˜l¶Xó¸²N«)áåV@*”,â"„˜ùÃÜ_B(þÊUkþÆ€~¯Æ\½•ÇZHïZbrü[‡wmÈãúUê4/^Ä={Z;¼Â•„[Û6®œ3®—N«Õ¹”ª,„PU5µ[ü”« 7îÙØ¼UÇÊeŠÝsýcç¯oX½,¤v3!Dñ"®¤‚Â¥TeUU•–=?èþòëÉi¦ì¤E¯3ݼrϺ6:÷’.AOçqe ¾Ëñ7wýõ{£–í}‹{äq“'cîÙX§Ñ³>Å= H!DìÕ¤ëélîÕ›n^y÷í÷óXú³‰ã™r¢¦']<ñü•Ii!4Îü*øqRÝ€œ)ŠBø÷°XóšpÞÅ= ¡(‘Z*dÉ {;…&91ûCEQî^yè›ÃsÚ€%ñìÞ3æú }Ÿð.ï¥ÂrýÒ•v_#Jû{>Ú¼W-VE«¹÷z„šÌȳæ9h³6´eâ~Û°5—­Z7»g…¬"ÙW¾{Iö Y2ÂÞj/­M&Ó‚Ÿ—kµZ­V£Õh„¢(Š¢ªªÕªšÍf‹ÅÒ½K;«ÕšÓæÀcÎzëBT¬ç·jÕrÍZ¦-æëûLË´-Ÿž¸éãd:}òäµä“U¡è]‹{û–pÓa½ytçá‹&áVº¼_êÅ3WS…k± JA¾æK‡OÆ^O.Ū„øÕ)BÕšvõìÙÓ—o™T¡s.îTÒ]#„õæñ]‡/¤ ×ÒA~)Ï^Kw-W¥f€>!§È&k|{¿§(Šm“»+LÞÎî&ƒ&­È¾—œ*¬Þ¸ÍVaФ­š5´»äŽ YìOãgqqvÖê´zV£ÑÚöjµZ-V‹N«1™Ì⿱~^_àq¡¦œ=~³yŸðZ®BˆÔí+¶Îüçê5‹ÆËÇ7¼zq7·ë§Ïù4¬÷¥¡˜¯»VaM¾±ÏáY[c|*{]<×á½nO¹‹˜Mÿl(ÙìSƒ§¸³à§Ý[Ü*½5,¬š—ˆ;vè‹_ÎÅW.[T¹uêàù2OÖøäßr‘zsÿžC³6)ZêêÁËmÞéö¬§¸¸yצR->­âqsëúA¬5Ÿ¶·ÓÐOòÈæÿÙßw…ìëܳÂÔáíMZ!n?{°[!Kn#{Fãìâ¤×éu:­V«Õ(ŠÕjµX­&“I¨ÂªZ]œœsÙxœY“¯]ó(÷”ŸB\ÿgÛÔîUê5=9ñèᤢ^惉Å=SƤ™œ=BË©^Œæ!ÿèÜ3ŸšÔëeû©DÀËýŠvÒ»{ !„ð®üݰõoîMðM¾X±ÓÓCBõBM9yú–[™’ÕÃêM(¹sð²ë"³ˆã:/ËdSºP„Ùj§;“ªWðÐ>â×(À2söFö"s\n§‚-¤³³öí#{ûZ6®?hÒ ÛúÙc~Ф-×·[!Kn×ì5³“““N§ÓëtZÅjMIIIKO³X,ªUuvrrww· ÷¹fÜÁšzÓR,¸”BXNJt.]ÚUQU!ôn^þnB¨ªsˆï?3Y|Su+ââ©×<ÙhT·’†²>Ï^™£ìøcïuà’¡é¬Î%½{úŽÍ/®H¬ùJ›aÁš’Á¥<6^¼T,xD¨^ˆ[˦­ùñ‚YW*tÊðj¥+Z¹­[’–yûnò¹ _îÜqK¸úTz¢ª%‡^¼eqgpdÉ÷köYš‡×ËúyÖî^'— ÍÃëeå½Í I+š‡×»c9^³O7Yn[O!„¢(:V«×)Š’œ’œžžn+¡hµVZªd 7ww»›°˜³~½„Âj±¤g«jоX¬aØM|KeX77KúUáb{÷ot´‹§ˆ»qC”ô);v_×{)bSE°›prr±¦¥ù•,%„îu꘭Jˆ·0Åg<¸ul¯¾BíšîŠÅî|;MKM·83´2e]/¿•š~¿Ú21§ v f_xÏ ¹l{G…,ö§ñ5ÿý ¤§¥ZÌE£è´Z!„*TÕªzõ*Y¢¤‹‹‹ÝͨN®Êµø+Â×Whƒ«z™Ö^»åQÊUQM©7âãMîɽª~×Ì×CXOî8ðû™T×JÕúÖv»ã-3éÉ¡× «í£2͉éFµw êîçbÍY­—S<œ3×»•hÒ¸hUUµÜº˜ËN­ªzŸ@fúÌ÷®X¬V!Ä®=ûsY¹NíêB­F#„Ðh“Åzw…,w<̾ðžvíÙÇ]~¶ë÷¶î®%·i|«Õš–ž¦Q­V«Ñ(Y3önnýú¾œh6›Vý¶"§ÍÇ™â\Ô+éìºØ*½üD±z ÅmûþŸ¨«f—o£ÅÏïŠs öòB˜bç­>yÄ¢ ©\Ë~¡Û¹n{¤Ñ¥Æ^½*J”ÊÇ"O©:Eµ¨ÚÀ?÷N˜³o¦ªVsJª«N;UU•ßcà?Ê]Sè¹ÝKoU…¶hV2§Ðï®`c÷¼!/öì;ÕCöôly_»fµ»+dÉ-ì-‹"„F£hµFÑh4B½N_¢D‰ÄÄDÿ¿}{ö¥§›-%ëðpgŸ2.ëî5¼^«–«Kƒ¶Í´Í|&õìÈM"96>A+ª÷ïÓé‰ÒK>SË)§B9ÿv¹M:±àh…Á!ÎÍz·©tæÚÕ9 L1oýµ)oÙ¿NCUU¡quÉe§„=&ëæ¸û¾—^d^q·ólNg y¯ „4iEÍêOØ~È*h·B–{¼õ®EóÆÙ*ŠR¤H‘"ž^ii¦#GŽš-S±šf—€\þ5[Š«oyóÅI“7„7 }æ Ÿ "Z!¬‰qq;vD'”(ísëÈgk\ßlá_ºZ°Ë©ó6ê^k敱e.¿P·_p+VÎ÷ߟ×OhT­‹Ñ/(È·´°&^¹ò÷¡3ç<Šè²ì…ª ›Ÿ|n;%ì,w¿Kþîé³Üñ.ùÌÏ¿Ëç Õ«lªW3ä´äŽ YrÙçò‰¹¿._vùÒeS±šiÎþü äDãáWÉ%ùðöý›W'¥˜T!½‹‡W oÿ’n:¥ÜÍ£Qƒ7mIS'>îGÛ¯Mš" å+ˆäEã}m.þ•BœÕä³}ßÝkÎþ!Áe\Ôä]kÚÿfNÞ¡!>.PÁ÷âžï¯ßšlV…PtÎnž^Åý|½K%/ûlÑw&áâ_)ÔÛÉ6¶÷ Èi§åŠhÙÿɺÞv½Ü`¨’ËÊÙ/Ãß}/}~UÈ*’}å»—ˆ\îÆ¿ã;­k©Ï&ŽÏ¥-!„©¸ÑääGÒ÷ u-î_¶¸ÿKU«ªqó.êýߢ¾™O ×ÒU ¥mTU¸úU­îg{Ϊ*.~•køeBqòò+ëåwW}áPÅY$ó5çò« dcU_Š¿™÷·ÞÅÅ'‰»>ÿα²ØÙß(Ö@ÜûËôøä<€œRM––­;­ÿmiéE½îý¥s ‰7/ÝÞ²u§T“Å©¡B–{\³à1t39ÕÍÅ©y«ŽV/»·Mš·ê˜–nNÎ|×{A¨%·kö<¶n¥¤÷roó\·<®Ÿf2ßJI+h„Pa@N®%Ü,ìlþu!žW]»åÿlL!žWuBˆåŸu‹¿vUQ¼DÉG³ãÁƒŽ9òÑì €Ç^¯BÄ\8?sÆ&ÝÏ]¾눖ÀÃÂWZ 9ÂÉ=hØ[..ì\«Ý¬hó?(¶1¡;¯ÙÛ¡&¬yéÉá{³-)ÖyÞÚ7ƒš´iìa﫵ÿ·ïKãáR«Iû—ût­ë£€jŠëCi€B%a/„Š¶ÖˆY#jf|e¦¾xK1×cë?”–­qÔ¼Qµ]LÉ 1G¶.ü´÷ŠÍ£~žÖ­\ŽßšM±ú«I ¼Nãë¼Cªd öuUsž!O=·fBŸgê CÃoEîI°ÜgO:Ï€  ‚Cž¨Ó¼ë)K~èQdÛ„ñ®Zs(n>;»Cõ§&ÍüÈ 5iË[ ê½±!A½}_M=·fR¿Öõ ƒ¡fÓîc×]¶äÔ­šrrÙ¨îMª Cõ°vo.ˆ¾ó“(4òû=kⶈ—GýØÿÛk×,‰h?ãõ·W]¾ß¸ÏFñ¨Ù³WpÚ®oæP\ hÞ¡bÜšßNÛÒ^MÚ·t›µng£×m³÷Ö„¿Çõþ‹h3þçß×ý¾àãçCÜ„šC·–˜eïÝRvðœß7l\»dÊMüõ\ ZyœÆWÓþ|­¾!ãAàÀ¿ôu±»žåÊÆoV»¼´ðç‚„ýƼº¦Ó¢­×Úvô~àÓ mñàòné§Ï%¦_Ùm¿xûfƒ'ÏþíÔÀÐ*Îê}KvˆzŸÕ.¢ˆl_ïk‰ûcúª´§§NìßÈKBø— Ârù»Ÿ‰IЖ©f(ë£>ÞÁÚ:À\³W\}JëÄU»ë¥ÇìN=Õ¡Ö·Ù–M4 ïû¾âžEÍø^ß‹kË7éPiÒ¿ŸT%4uï’¢Á„Zž·ÅÓc¢Î©ºW-¢Ü¶Ð~Aͳí»TþiôSO/mÚ8,¼E›Võ˺1´Vy ûŒköÿ}›nNóªUÕT‹Ø0¯}©|»@`‰?q&ÙÙ¯¬—6çâ¾M:VšøýªSý/-Ý©„}^Ó3OáœsÁ~s75ÛñÇŸ[¶nšÖ÷›ég,ÝЋÏ$Jù`N5ˉãkö\·Þ{ݼQoî›7÷„sÝv÷\Šk}w ¹¶vùî­KvjÃ:Õð¼»±e•S›ÝPo[˜s·Ú"Ã:öñùÜ¥ëÆ¯Yz$5¿€G,ŸÃ^ëÝòöž[F ²zôŘèƒ-úò“ŸNÝß½ìæ¤˜3§N<~h÷ÆÅS†tyeþ°wF4+¡É­¸Ö»Q§Ðø_ÆOÚªïTÍ㮚Zïý[;­}ï>{þȶå?o¹¬æP0õèÜɳ~ß}"&.îÜ NšK—z÷ùPäu?¯4^a£æM)9~ÊØ³’„pñ®Öq`íý”P-»Çvo/„wßʵ›Œ˜Õ·k=ý=ŠkK…w®úÑè(϶íd½š¢á£çLørì”á]§¦ §RO<÷~}%‡‚š›ú¸S~sSξµÚ›òryÂPX)ƒôÿêëéY_qûh¾õ.""‚¯¸àáÉö·3¸é ÉöHް@r„=’»ínüÁƒ:ªðä÷[ïò,""ÂQ»@zcÆŒÉúù¶°6lØ£îÿñê“me5õÌŠº7 ö÷õó/S£õ;«.™SöލØyíŒr77¿Ré‰!;“…š|lÁ[­ª—õõó÷-S%¼÷'Ót„ #{@Á`¹¼|P·Q‡ŸšðËôp“ ßðÊóN¬ÇàtýÏwŸë·®ÊÛS×t4xÞ<¹kŸªª9Ô0Ÿ[8ðÝÁŸýòM³Òº„ÓQQIÎÊ#=ˆ‚‰°lÚ¬'•þ}Ò²´¶?L«EQEQ:è !DŠý϶$ž×• oZ#ÈW+|}Ê„<ª*Ø{À£—ýš½ÆÍ¯œ^ˆ”‹ûÏ+úWñ´ Åõ¾uê–LŒ:q#YÝ}F î]Ý+/Ctçà®=«ÌZ·Þü§Z6iÖªÓsáAî í¹fp„l×ì K9e²`¶ŸÕŠP²?¡ªVÛ̾k•!Ë÷ož;ü©€ë›&>ß Ñ;›¬ùÛyaDØ §€eÔS›ŽÜ´=4]ÚµóªW•à"®eŒAʉµûo»N¯q+î&n]O±%¹9átÌ­ÌP×yUnòüà±ß®øczØÕ þå]}„= `ÐùµÐÜ´xØówž>{hí¤ÁŽTèõj57­ï³Ã:8­4à˵ÿFÇDÿ»ùç9cMNeÂxþqé‘dUM>µlüÔƒª"„H=4sÜ´_·=éÒ™=kV3û„ø89úȰ ZŸöSg<4®ý“õZô_æúJä¡!4ÅšMøuzÓ‚þO×76lýæ‡RE¸×yoêkn3Ÿ ª6p{­7{(B³þòšO_jV¯FͰÎ_\jýŬ׃õŽ>0ÇS èÿÕ×Óã¯]B$%%=@ ¾âòâ¾¾â¶\`ÐåKöo8„QQûçÎ“Ó žžžBˆ˜ çgΘÁÈÉöHް@r„=’#ìa€äøl|( """Ý$AØ@AÔ(<ÜÑ-@„=D¹|X p¿¸f€ä{$GØ 9ÂÉöHŽ»ñ à*äèÐÙè3Žnÿ!ì €*Tx#³gÏ^¼{°à ì  *ÔI/„¨Q£zÏž½þÚ²ÅÑ܇Bý‚现<,…+>%žà=„Èœpta€ä{$GØ@a¦&¬ïS§á[Ûo9º‘‡Åûó »üxÎ|÷SÉ;†7j>zoÊ£oªÐ!ìe‰[Ù§~Ãë¯[³/MýwÂ3Æç¾;iv lÔªIEwÅQíI°Y˜¢#;5x~æêȡυ Ú™}ðFÒ‘ŸÞëÖØh4¶ì3mg‚E!Dú©E£{·ol4õZö½øX²j+`IØ=ãÍö Fc‹žKÊ7§]XÿÅëíÃF£±Y·wŒÊ(”?´%Ÿìf{–l½–­jò¡eë®UìÔ*йhÝþ£Þ+¡ÍÇ=>~{‰éäüYgŒœ½hæ°*§ yë­O†|·(òð‹³?œq$U!¬f¥üs#¾[¶råâoV:8yèW’…–¸Õ#‡D^ 3oùÊo^v[ñõvÛI€5qÇ„~cwöºxåòù6Oˆ4ru\>ƽ¦hÝ® uQ‹ÿŠËš«¿¹馤NÍt·Oã[öFyÎv:2~õ…´¬9œŽX“-ü G‹:F£1¬Ý_mºdÊ¿¶ ¤âÑpø»]ëW¨Ù¾O‡€„£ž¯¾óBƒ ÕZ½úB…„Ý{âÌB—Ê]_n× ¤¬Ÿ_PÍöC‡5LÙòÇ™4a¾¼iánÏN£?àW©ù€÷ÚûUa¹ú׌µN=>Ú¦F_@寽ßÙ7jÉöxë½:É;Å«v—&üyÉéjžÅ[RŸèÚØçöñ¼åÊÚßœ]gäÜ_WL{Q»xÊ=NG,WÖzýó¨òf.ùeAÄÓÉ‹†üþxÚÝû—ª2ÑùJ»!„Ðxx{轫”µ]íÖzz{ˆ”Ä«Âr}לO&/øëÄõŒ‘´KÓ$‹0]>|ISÎXÖ¶µp.];Èi¥"ýâÞs©tkø}¶Ý”¹tÃ"JåßxѽZ§Åú,[w¾Kï ½5aç⬵ÇÄÉ`×ÐŽÏø,ûuutÏå¯ÿ½x¶á„ºEïØŸ)îÐ%¥ü+åÝ26)_¿‚~Èùt$9îP¬R®GpÆÍ}º’Õ«K:d©áú¸Ý@ØÀãÅuÂúf÷†E!, ÇO&Zü…zïPë?»Ï¥65¸!Ò.ì9“®ÂɯzñǺ½ Ï>Uü!¦½sùvmK/X±òÄËÝ/>àÖxZ-¯»nÀW…P4º¬&4ºÌSû§#)QöwõÞØÏ5{x¼hKû+gÿÜ}Å,Ô”3«¾øþ¸-ýt¾M^¨´tÜÔõÇ.ÆžøóÛO—_ŠB[ªYÿ6ÛÆ½óͺÏÅ^<{xëÒi“ŸNÏワŸíPáêšÅV-9æÕ¼“Áý®5ô>U|DìÁK»6]>|!M§#'×íM°Þ¹~U?õÜ?'2æ-ÌW÷ï¿îY1Ðó1L¾Çð౦õ~zÔ{OFo߸éSßßúrÓ¢¶Im­O«ñ_ôöÞ2ºG»¶¯ÍJjÝ¿Ž«V¯Q„Æ«þˆÈIÝ=7òJǶí:õ‹øõ¬‡‘üŸ×´èX9aåøïN–lÕ!ÔÎeuO“ŒñK¦­<“ªªigÿú§ó¶Æs8Ñy7éÙ0}ÕÇ~:sbów£§Ÿ,×éy{•¥Ç4>fJÑ–ßïjiûYØ{éöÞ™Ïh};ÏßÞù¿õžšµý)ÛÏNeÛŽYØvLVÞ/fnR´N¿©+ú !„0šÑÍT²Q)½Bèý› ø¢É€‡y B­oÓ.Õ>Ю]Eg»+x?3nòÅǽÔlŠSQÿÚϽhÜ5_‘q:Rbâן¼2;IïÐíúÑ m©–㾉ÿtüÔ>…“_Ýn#úT²[Yv„=ÀF½yxÕ†ë•ê†z‹¸=?Ÿ:¤‘Ï£¼•MëÝîûíîXæ×uÁ¶®YŠûNYÞ7ëÙ~™ç69œŽh< Ý#tx8ý„= ƒõÖñ_Æ}2îjº®eÃzLÙ1€”ÿ6J‘:Ãf¯æè6ÿ¸AÉöHŽi|ÀÃR.0ÈÑ-܇¯¦Nst ÷§QxøÜ¹sò²&aÈÆ sqq¹|)ÖÑH+"â>Þc@Ø@åââ’ššêè.\¡n^2\³@r„=’#ìa€ä{$GØ 9ÂÉöHŽÕ€B©p}-@Þ? ÷ž{(¬ø0Z‰Ý×§áÞÓøHް@r„=’#ìa€ä{€¼Lgf´©Ùi~ŒÙÑ8a¸'5õìSßêÖÜh0 †ϾôAäßÓÕû-c>?·c­?ž3åƒ k{²ÔjÖcÔâ#7‡Ù¡Cñ>{À=¤‹ìóü'ªtüÙÛ5K»§]>²õ×yŸ~[mñX£ëCß¹Õdz}^†¦ŠÎ8jî¨Ú.éW.ùlÌG¯‰ÀßÇÕxèý Œì¹2[:zÊþòCæEŽêÑÜX¥rhÍFN^´àÍ*Î"ýäü÷^|¦¾Á`0ToÔõ½…Gn©BdLž·›9®×SOÖ­Y³qˆ51&qsË vŸO?1ñÙšƒ!läÞë>nRëÕ?“2vtkÛ›õ}°7ŶyûÏ猩…ÑP½ÃÌÓ¦´ók'¼úLƒÁ`hØá­È½ {j<‚*T­×áíÑJÄoÛ&„ÂzóàÜaíê ††]Æü~Á6j·&ý;ïÝÎO>a0j?Ýoò†X“¸»Ã»«>„= 7渭¿Ò6x­SEçì‹õEJ¸i„Õ¤©ÐiTäoëÖ­ˆr`ÂÀÉQÉ+˜NÏÿ­ÈàE›wî\=:hã{fs ŸºâÝJNÁoÿ¾ïàÁƒ[#jå6-`:5o…s¿ùÛì[Ü«ØÎˆ—>ø§üëß­X·fIDËë3ú¿½ê²Ý¸Ï¤qvÓ sšÅvêqböÔ#5Þ½|ѬËGýãšUX®¬ÑçÓ½ÿ¸ò÷¥Ÿ½5ÿÍ~ßMó¸³C'»«ý/¨#ö€Ü˜ãŽ^ÞUʹ+vžt íÞ§CX•rþþåkw|{Ä“)›×žÎÌB·¦C_1Ó ½o“Áƒªž[¼èHêýì׳åð×Â|ôSò–é¿;¿ôéÛík•÷/Ҵúî]´5ÞšÓ–¦„Ã˾^vɹjÃ2N¶RO¾÷Á‹a¡ª¶ì?8LwhóéTó¥?~Ø¢k;vd—ZAe+7ðÉ àèŸçJ¹óØó¶ZÁÇ5{À³Äÿ9nÂÜMÇâ3f·]šß0 á$„ÐûW+›1t×z•ñJ8rî–Z<Ï•õ¾UýmS évG§žêPëÛlO—M°ˆR·XÕô?_«o°ýìÚý³›׈D!ô¾ÕʺÙNUôE}ÝÒ/¤XM—^T_ªì‘±Ø»f­â7žN²T»­bÇèjTÖIDATŽ«ÕrÕæùH ÂwˆXqäÜ-µ²Óƒ{ëõ š~½ç—˾¯[¶¨KÚž÷Z¾q+óxÕbÊšiW­&{ãpE(Ù+ªª5ÛýóVÉzB[-âyíKå>­èj¿?ûýÚnZ×bþþ¥Ü´BaB&kCEUjæÏww”§eöV+ИÆäFçö\óöËN¥g_lºq-9=vß1SÕ^/†sÑ*æëG'þ÷~vó…]GoØ"Þ·ï@‚Wå²îŠF«5+Ñ5®E]ErBªm-sâÙØd;çNþ5ˉã«w_ÏqÞ>«^‘²+WªT±LFÒçLïkðW£·¿%2Ü_¤RyO¸­ÃœW+d ]ÀGK_¦ÓØA†“_¼øjÄ‚{;²oË/Ó†u{aÊasÉJÊ™?vÆ™„šrzÅÄïŽeóšvOþø§=çbOÿýýèoN”íÜ-ÔEçéï£Ý±óT\|Bb²YP¿Žç±E+O¤¨jJôo_Î<ªÚ3k½[¾ÑÞóïÑC§¬Þ}1&úà_‹¾üä§ÛO=î—ΧÅ+á¦åŽ_ºïì…c~óþÔ]{Tu·w(rZ­°a;Å5¤ï¬eeg|9kæ°…WLBx”­Ý²ËûªyxW;z×°ž©?Ƴ¨Ýn}Zìžž5üÖ÷îWæámÇ_±{âù ÓûWvB_wàë5‡ŒïÜlŒðj?çˆo~úÒ°÷Ÿ¯7͹dpËW^mø× ;û×x…š7¥ä'SÆö˜•$„‹w•°ŽƒŠüƒUm©g>?î£É=[' 'ÿú=¾œÐ?ÄYáyG‡9¬VÈ(ƒôÿêëéñ×® !’’’î¹Á݃ÊçwW ¡è3§ó¾r¹À Ë—bSSs¼Ý¶B~ôõ˜ÎÌèÐqm÷U‹z0¦|0QQûçÎ“Ó Ÿþyî+xzz !b.œŸ9cÓøHް@r̯ò›>¨ßª}ýݲ0²@r„=’#ì×ì °Šˆˆpt ({(”…‡;º„=J¹|š p®Ù 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöò¢(Žn@Ž{ù D‰ä=P`öòÁŽ;¼¼¼Ýû{ù |ùòÛ¶móôôtt#ì ìä³ÙºeËwwwG÷àN„=€|`±XTU­^½úÆ]]]Ý€ÛöòÙl6›ÍBˆºuë®[·Ž¼ Â@>°X,¶Á½âÉ'Ÿ\±b…‹‹‹£›°Ìf³-ïm[´h±dÉò( {ùÀb±Øfòmƒ{!DëÖ­çÌ™CÞa X²ÉZØ¥K—ï¾û޼NçèÈÀl6k3i4š'žxâÔ©S¶§ÒÓÓEÉñxôÙȶ1}llìüùó­Vkß¾}EIKKKKKSU•¤‹°Ìfó… š6m:xðà„„„~ýúéõzG7 a ÄÄÄ´nÝ:..Îl6O™2ÅÉÉièСÎÎÎŽî €„=€|Ñ©S§k×®Y­Öôôô/¾øâÆC‡Õhø(øUâãã­V«íg“ÉôÕW_yzzV«Vͱ]°!ìäƒì·à¥§§úé§Mš49pà€[…·ÞÈiiiÿý·£»‘=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìÈo–ØŸ_hØåÇsfG7b£st€¢&¬ïÛ⽨ۖ Z¶ð¥²…ç_v5õü¦¦E®Úzärª¥k6íл_÷ú~NŠ£;»o– {t]Þæçy/–Ö !×ÀF­šTt/ RxþJî¤èj Ÿ>¬ºKæcW__­#û±±šLB¯¿÷Ìqê‰ôšv2¤ó€qC«—vK¿|lûÊ…¿bþ¨Z® Í‡JS´nÿQuÝE¦ñ Ó)[)4$4óO`1'ËÅ_„‡øõ¢Y!ÒOÏéÙ ù;\µStd§]¾œóIŸ¶-Â4xª÷„õMB!¬I‡~УE£ÑÖî¯6]2 !„šrê×±/=]Ïh4ë5ïòöÏgMB¤üì醯ÿu3c÷É;†7nùQTŠ­x×) &ömý¤±Þó?D›Ò.¬ÿâõöáF£Ñجۻ?F%XîhÝ|á×±ßü40òÛÏ7­RýÉöý?›7ûPçœZ2EGvjðüÌÕ‘CŸ 3´2ûà¤#?½×­±ÑhlÙgÚNÛNr>Ra·+Std§ݦ/ûúÍMëë6{1bmŒ)§W@¤ŸZ4ºwûÆF£ÑX¯eÏÑ‹%«BÜÚúVçÏO¦Ÿüò¹úF£±ù˜}7o›ÆÏåpìì÷aü=y8eŽ¡óo7zxõƒ“>ZcJ?µ`ÔôØ&#G4-ið›Î,\SdÀܵ[þúõ½r›G‰<‘.,WÖzýó¨òf.ùeAÄÓÉ‹†üþxš0_\>úÓ­e^ŸùËï«W.˜ðZ¸¯Ó=öl:ýÓoνøsçŽy=Šî™ÐoìÎÀ¾S¯\>ÿÃæ ‘ƒF®Ž»-îÍqÛVÑÔ{õ¹ ηµ_¤¸«&‡–l{99Ö™#g/š9¬ÊÁiCÞz듆!ß-Šü0ìâìgIÍlÆÎ‘Zw䨕éÔÂUú—f­ß¾uÉR|üÉŸñÖ^«Y)ÿ܈\¹øÛ•NúÕdá6yɰŠN‡üºc÷îÝÆÔÌ>5‘ëáܽ_!Ìæu3†Ø™üÿÿí#ì ðRÓÿÔØ˜¥éè½)Bh}ÛŒz§öÑÉï}>~Ä·—›z§Iñ¬¹}·&{Õ*ªzŸF¯÷=¿lɱ[—7Íݦvô»j–©Ôäµq¯W<»ô§#)Öµ¥ë6¬ZÆ»”_…Ú-Ú5òÓߣfo¾ÚÀ[¯Ñ:ÝÚ:c­S‡¶©äP¹qï÷_öZ²=ÞšmesÜñ8áRÖíî«ÚæZÊØKÃáïv­\¡fû>Žz¾úÎ B*Tkõê vï‰Ë¼#îî#M¾úW.]{êÍžµŠëç²-º×ÓÝr&-‡WÀ¥r×—Û5)ëçT³ýÐa S¶üq&-·—%÷ù{¿B(NÞ•«U ôÈ¿K2\³€ÂëököŠ®X9g!„Ðú´ùöšcV¹¶šüvx±ÿ†u:?C™Œ1§Ö+¨r‘Ä£ç.ŠUÊõθ•LW²zõbIG¢“´Ï´é¼dlÛv¿6¯ß°i«§ë–qÍýn3o¨¿m”ž~qï¹Ô º5ü>ÛÓe.ݰˆRybšâì·d©*„ÐùJÛŽWãáí¡÷®RÖ¶šÖÓÛC¤$¦X…Pìéõ˜œºÒ ¡/Q¡dÆÉŒÆ­˜sÚ…«SU»¯€åú®9ŸL^ð׉ëç.M“,¹Åi®‡cg¿Bh½ŸùT^©<#ì ³]³w¿s±õæé}'Ó„0_¸hE³&àU‹É¢fþl5YïÜ.Å¥RïYkïÜô×¶í[¾}cÆÌÓ¼WßE(Ù_UUõ¿-”ÿnÊSU­aÌo‘mJæî:ïJÞâ·£ç’Õà¼Þ{¯Øö¢Í¬©(Bh´Ù÷ð_7öŽTÍ¡+S´BÑÜ~`Bö^ºêæÞšyý…‰?M¯]ÆË%mßè¶Cp¶Ý¶?;û}˜ÆÙXv|ùá*Ï—&ØèìÔÑ‹ÎüwÓ—%f÷±$[Ä›¯ìÿ7±H¥ÒEýªú©çþ9‘‘Xæ«û÷_÷¬è©Bh‹ThÐî•aŸ|¿0¿nù±4¡qõrÉ )5ÏÅ¦Ø ''¿êeÄÉu{r9›Ðy7ljÞùï§Ó³/6߈OÑùäÜR^Ù9Òb÷îêNw½æØ¨æÐÝuÑ*–„ã'3nEÐha7ªõùp8ÿ/ 1ësÇ=’ùçäå«5aû—cVíýqßFÏŽÙèÂ7£þ—§¦}S?[²ïü¥3Û7ãT™Bܽ›ôl˜¾êã ¿F‹9±ù»ÑÓO–ëô|¨kÚñS\»÷ÔÅ+W.Ü´ù”¥T…’:¡÷¯kô8±ä÷S)ªšrvÍ´ÙÇí Dµ¥šõoã±mÜ;߬û÷\ìų‡·.6iñí©.tÏ}ðz•SÓz¿þÙ¢ÍQÇNÝ¿uÅ·#^|ùë#æZº¯Wæî#uËKWÙØ}´%‚ý•³î¾bjÊ™U_|7sn“_Ƭ)Þ{ÎK•]„piòîM»¾?z~Xä+e…úнz—Þø~ç W,E«vŽ˜Ò§’“¥ZŽû&þÓñSûtLN~u»MŒèSÉY˜œôW6}óÖ´˜›ªpò©ÑvôăôB諽1®Çˆ1½çT¢Bó^½êÿi§/Wý‘“JLüú“Wf' áâÚ ]ÿ"wÜo¦¸V~eúÂ2‘_ÿøÃˆÅWMB¸—®Ù¼Ó;ý ®Z'»-‰ûx_šÝ#uÊCWÙÂÞ+ UžõÞžwÇ·oáQÔרéå¦ûfÚÎw<¯õ©ñÎÄž^mf.í¿BZû¯p·£¦Ç;p ýæïV|pÊ ý¿úzzüµ«Bˆ¤¤¤(T>ßÚyEŸ9÷•Ë]¾›ššzïUóÈù|÷õ]—Îíæ/ù8ïñ8ÒÏ?ÿ<*jÿܹsrZÁÓÓSsáüÌ3˜Æ@r„=’“x†>°÷Òí½ÝÅ£ðøiž1²@r„=’#ìa€ä{$GØ 9Âd`4Ù° ìÎ!Þa€ä{$GØ 9Âd°{÷n6,»sȆ÷DØ ‡ž={9º…аåƒjÔ¨NÞ?ÂPЕ ºzõÊÈ‘#ÉûCØ 4[Ò[Ìf!yÿ`{@Á•=émÈû@Ø ¨»“Þ†¼¿_„=’Ó9ºÀƒøüóÏÝÂC÷ÕÔi¹¯ ÷‹ðÕÔig£ÏäK) «¨¨ýŽnÁÁ$~æÎ“Õ{(¬ò7 #^<"ì Pºç÷ã \`£[({(”òëjnAvÏ,^„|ÁÝøHް@rLã ®±}äèd@Ø ¨FááŽnA„= €âuù…köH.FöÑgNÿÿEÀCÂÈÉöHް@r„=’#ìa€äøP( """Ý$AØ@AÄ'Å"öPñI±ÈG\³@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=’#ìa€ä{$GØ 9ÂÉöHް@r„=²)”ý!a€TÊ 40ûÂyÜô‚°@YI?lذìË {d=é¹f€lîHz®Ù •Ü“^öjv“žköH"§¤çš=2È%é¹f@¡—÷¤„=…Î=“žköbyIú;®Ù+ƒôÿêëéñ×®:¤cððÄ\8?sÆ FöHNgûOÌ…óŽí<$Ê ýÝxˆþòF¬?¶vëIEND®B`‚src/000077500000000000000000000000001225012771600326435ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/doccamera.qdoc000066400000000000000000000070241225012771600347460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example camera \title Camera Example \ingroup multimedia_examples \brief The Camera Example shows how to use the API to capture a still image or video. The Camera Example demonstrates how you can use Qt Multimedia to implement some basic Camera functionality to take still images and record video clips with audio. A Camera class is created that will act as our Camera. It has a user interface, control functions, setting values and a means of defining the location where the image or video clip is to be saved. It will also store the image and video settings. The Camera class contains an instance of \l {QCamera}, the API class interface to the hardware. It also has an instance of \l {QCameraImageCapture} to take still images and an instance of \l {QMediaRecorder} to record video. It also contains the user interface object. The Camera constructor does some basic initialization. The camera object is set to '0', the user interface is initialized and UI signal are connected to slots that react to the triggering event. However, most of the work is done when the \e{setCamera()} function is called, passing in a \l {QByteArray}. \e{setCamera()} sets up various connections between the user interface and the functionality of the Camera class using signals and slots. It also instantiates and initializes the \l {QCamera}, \l {QCameraImageCapture} and \l {QMediaRecorder} objects mentioned above. The still and video recording visual tabs are enabled and finally the \l {QCamera::start()}{start()} function of the \l{QCamera} object is called. Now that the camera is ready for user commands it waits for a suitable event. Such an event will be the key press of either the \l {Qt::Key_CameraFocus} or \l {Qt::Key_Camera} buttons on the application window. Camera focus will simply display the viewfinder and lock the camera settings. Key_Camera will either call \e{takeImage()} if the \l {QCamera::captureMode()}{captureMode()} is QCamera::CaptureStillImage, or if the capture mode is for video then one of two actions will occur. If the recording state shows that we are currently recording then the \e{stop()} function is called resulting in a call to \l {QCamera::stop()}, whereas if we are not recording then a video recording is started with a call to \l {QMediaRecorder::record()}. \image camera-example.png */ imagesettings.cpp000066400000000000000000000106601225012771600346610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagesettings.h" #include "ui_imagesettings.h" #include #include #include #include ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) : QDialog(parent), ui(new Ui::ImageSettingsUi), imagecapture(imageCapture) { ui->setupUi(this); //image codecs ui->imageCodecBox->addItem(tr("Default image format"), QVariant(QString())); foreach(const QString &codecName, imagecapture->supportedImageCodecs()) { QString description = imagecapture->imageCodecDescription(codecName); ui->imageCodecBox->addItem(codecName+": "+description, QVariant(codecName)); } ui->imageQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); ui->imageResolutionBox->addItem(tr("Default Resolution")); QList supportedResolutions = imagecapture->supportedResolutions(); foreach(const QSize &resolution, supportedResolutions) { ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), QVariant(resolution)); } } ImageSettings::~ImageSettings() { delete ui; } void ImageSettings::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } QImageEncoderSettings ImageSettings::imageSettings() const { QImageEncoderSettings settings = imagecapture->encodingSettings(); settings.setCodec(boxValue(ui->imageCodecBox).toString()); settings.setQuality(QMultimedia::EncodingQuality(ui->imageQualitySlider->value())); settings.setResolution(boxValue(ui->imageResolutionBox).toSize()); return settings; } void ImageSettings::setImageSettings(const QImageEncoderSettings &imageSettings) { selectComboBoxItem(ui->imageCodecBox, QVariant(imageSettings.codec())); selectComboBoxItem(ui->imageResolutionBox, QVariant(imageSettings.resolution())); ui->imageQualitySlider->setValue(imageSettings.quality()); } QVariant ImageSettings::boxValue(const QComboBox *box) const { int idx = box->currentIndex(); if (idx == -1) return QVariant(); return box->itemData(idx); } void ImageSettings::selectComboBoxItem(QComboBox *box, const QVariant &value) { for (int i = 0; i < box->count(); ++i) { if (box->itemData(i) == value) { box->setCurrentIndex(i); break; } } } imagesettings.h000066400000000000000000000056521225012771600343330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGESETTINGS_H #define IMAGESETTINGS_H #include #include #include QT_BEGIN_NAMESPACE class QComboBox; class QCameraImageCapture; namespace Ui { class ImageSettingsUi; } QT_END_NAMESPACE class ImageSettings : public QDialog { Q_OBJECT public: ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = 0); ~ImageSettings(); QAudioEncoderSettings audioSettings() const; void setAudioSettings(const QAudioEncoderSettings &settings); QImageEncoderSettings imageSettings() const; void setImageSettings(const QImageEncoderSettings &settings); QString format() const; void setFormat(const QString &format); protected: void changeEvent(QEvent *e); private: QVariant boxValue(const QComboBox *box) const; void selectComboBoxItem(QComboBox *box, const QVariant &value); Ui::ImageSettingsUi *ui; QCameraImageCapture *imagecapture; }; #endif // IMAGESETTINGS_H imagesettings.ui000066400000000000000000000061271225012771600345170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera ImageSettingsUi 0 0 332 270 Dialog Image Resolution: Image Format: Quality: 4 Qt::Horizontal Qt::Vertical 20 14 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() ImageSettingsUi accept() 322 272 44 230 buttonBox rejected() ImageSettingsUi reject() 405 262 364 227 main.cpp000066400000000000000000000041751225012771600327460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "camera.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); Camera camera; camera.show(); return app.exec(); }; videosettings.cpp000066400000000000000000000157071225012771600347140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videosettings.h" #include "ui_videosettings.h" #include #include #include #include VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent) : QDialog(parent), ui(new Ui::VideoSettingsUi), mediaRecorder(mediaRecorder) { ui->setupUi(this); //audio codecs ui->audioCodecBox->addItem(tr("Default audio codec"), QVariant(QString())); foreach (const QString &codecName, mediaRecorder->supportedAudioCodecs()) { QString description = mediaRecorder->audioCodecDescription(codecName); ui->audioCodecBox->addItem(codecName+": "+description, QVariant(codecName)); } //sample rate: foreach (int sampleRate, mediaRecorder->supportedAudioSampleRates()) { ui->audioSampleRateBox->addItem(QString::number(sampleRate), QVariant(sampleRate)); } ui->audioQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); //video codecs ui->videoCodecBox->addItem(tr("Default video codec"), QVariant(QString())); foreach (const QString &codecName, mediaRecorder->supportedVideoCodecs()) { QString description = mediaRecorder->videoCodecDescription(codecName); ui->videoCodecBox->addItem(codecName+": "+description, QVariant(codecName)); } ui->videoQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); ui->videoResolutionBox->addItem(tr("Default")); QList supportedResolutions = mediaRecorder->supportedResolutions(); foreach (const QSize &resolution, supportedResolutions) { ui->videoResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), QVariant(resolution)); } ui->videoFramerateBox->addItem(tr("Default")); QList supportedFrameRates = mediaRecorder->supportedFrameRates(); qreal rate; foreach (rate, supportedFrameRates) { QString rateString = QString("%1").arg(rate, 0, 'f', 2); ui->videoFramerateBox->addItem(rateString, QVariant(rate)); } //containers ui->containerFormatBox->addItem(tr("Default container"), QVariant(QString())); foreach (const QString &format, mediaRecorder->supportedContainers()) { ui->containerFormatBox->addItem(format+":"+mediaRecorder->containerDescription(format), QVariant(format)); } } VideoSettings::~VideoSettings() { delete ui; } void VideoSettings::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } QAudioEncoderSettings VideoSettings::audioSettings() const { QAudioEncoderSettings settings = mediaRecorder->audioSettings(); settings.setCodec(boxValue(ui->audioCodecBox).toString()); settings.setQuality(QMultimedia::EncodingQuality(ui->audioQualitySlider->value())); settings.setSampleRate(boxValue(ui->audioSampleRateBox).toInt()); return settings; } void VideoSettings::setAudioSettings(const QAudioEncoderSettings &audioSettings) { selectComboBoxItem(ui->audioCodecBox, QVariant(audioSettings.codec())); selectComboBoxItem(ui->audioSampleRateBox, QVariant(audioSettings.sampleRate())); ui->audioQualitySlider->setValue(audioSettings.quality()); } QVideoEncoderSettings VideoSettings::videoSettings() const { QVideoEncoderSettings settings = mediaRecorder->videoSettings(); settings.setCodec(boxValue(ui->videoCodecBox).toString()); settings.setQuality(QMultimedia::EncodingQuality(ui->videoQualitySlider->value())); settings.setResolution(boxValue(ui->videoResolutionBox).toSize()); settings.setFrameRate(boxValue(ui->videoFramerateBox).value()); return settings; } void VideoSettings::setVideoSettings(const QVideoEncoderSettings &videoSettings) { selectComboBoxItem(ui->videoCodecBox, QVariant(videoSettings.codec())); selectComboBoxItem(ui->videoResolutionBox, QVariant(videoSettings.resolution())); ui->videoQualitySlider->setValue(videoSettings.quality()); //special case for frame rate for (int i = 0; i < ui->videoFramerateBox->count(); ++i) { qreal itemRate = ui->videoFramerateBox->itemData(i).value(); if (qFuzzyCompare(itemRate, videoSettings.frameRate())) { ui->videoFramerateBox->setCurrentIndex(i); break; } } } QString VideoSettings::format() const { return boxValue(ui->containerFormatBox).toString(); } void VideoSettings::setFormat(const QString &format) { selectComboBoxItem(ui->containerFormatBox, QVariant(format)); } QVariant VideoSettings::boxValue(const QComboBox *box) const { int idx = box->currentIndex(); if (idx == -1) return QVariant(); return box->itemData(idx); } void VideoSettings::selectComboBoxItem(QComboBox *box, const QVariant &value) { for (int i = 0; i < box->count(); ++i) { if (box->itemData(i) == value) { box->setCurrentIndex(i); break; } } } videosettings.h000066400000000000000000000056071225012771600343570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOSETTINGS_H #define VIDEOSETTINGS_H #include #include #include QT_BEGIN_NAMESPACE class QComboBox; class QMediaRecorder; namespace Ui { class VideoSettingsUi; } QT_END_NAMESPACE class VideoSettings : public QDialog { Q_OBJECT public: VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = 0); ~VideoSettings(); QAudioEncoderSettings audioSettings() const; void setAudioSettings(const QAudioEncoderSettings&); QVideoEncoderSettings videoSettings() const; void setVideoSettings(const QVideoEncoderSettings&); QString format() const; void setFormat(const QString &format); protected: void changeEvent(QEvent *e); private: QVariant boxValue(const QComboBox*) const; void selectComboBoxItem(QComboBox *box, const QVariant &value); Ui::VideoSettingsUi *ui; QMediaRecorder *mediaRecorder; }; #endif // VIDEOSETTINGS_H videosettings.ui000066400000000000000000000141001225012771600345310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/camera VideoSettingsUi 0 0 561 369 Dialog QFrame::NoFrame true 0 0 543 250 Audio Audio Codec: Sample Rate: Quality: 4 Qt::Horizontal Video Resolution: Framerate: Video Codec: Quality: 4 Qt::Horizontal Container Format: Qt::Vertical 20 14 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() VideoSettingsUi accept() 322 272 44 230 buttonBox rejected() VideoSettingsUi reject() 405 262 364 227 customvideosurface/000077500000000000000000000000001225012771600337715ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgetscustomvideoitem/000077500000000000000000000000001225012771600372115ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurfacecustomvideoitem.pro000066400000000000000000000005611225012771600431550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitemTEMPLATE = app TARGET = customvideoitem QT += multimedia multimediawidgets widgets qtHaveModule(opengl): QT += opengl HEADERS += videoplayer.h \ videoitem.h SOURCES += main.cpp \ videoplayer.cpp \ videoitem.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/customvideosurface/customvideoitem INSTALLS += target main.cpp000066400000000000000000000042121225012771600406400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); VideoPlayer player; player.show(); return app.exec(); } videoitem.cpp000066400000000000000000000106411225012771600417040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoitem.h" #include #include #include VideoItem::VideoItem(QGraphicsItem *parent) : QGraphicsItem(parent) , imageFormat(QImage::Format_Invalid) , framePainted(false) { } VideoItem::~VideoItem() { } QRectF VideoItem::boundingRect() const { return QRectF(QPointF(0,0), surfaceFormat().sizeHint()); } void VideoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); if (currentFrame.map(QAbstractVideoBuffer::ReadOnly)) { const QTransform oldTransform = painter->transform(); if (surfaceFormat().scanLineDirection() == QVideoSurfaceFormat::BottomToTop) { painter->scale(1, -1); painter->translate(0, -boundingRect().height()); } painter->drawImage(boundingRect(), QImage( currentFrame.bits(), imageSize.width(), imageSize.height(), imageFormat)); painter->setTransform(oldTransform); framePainted = true; currentFrame.unmap(); } } QList VideoItem::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { if (handleType == QAbstractVideoBuffer::NoHandle) { return QList() << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_ARGB32_Premultiplied << QVideoFrame::Format_RGB565 << QVideoFrame::Format_RGB555; } else { return QList(); } } bool VideoItem::start(const QVideoSurfaceFormat &format) { if (isFormatSupported(format)) { imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); imageSize = format.frameSize(); framePainted = true; QAbstractVideoSurface::start(format); prepareGeometryChange(); return true; } else { return false; } } void VideoItem::stop() { currentFrame = QVideoFrame(); framePainted = false; QAbstractVideoSurface::stop(); } bool VideoItem::present(const QVideoFrame &frame) { if (!framePainted) { if (!QAbstractVideoSurface::isActive()) setError(StoppedError); return false; } else { currentFrame = frame; framePainted = false; update(); return true; } } videoitem.h000066400000000000000000000054631225012771600413570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOITEM_H #define VIDEOITEM_H #include #include class VideoItem : public QAbstractVideoSurface, public QGraphicsItem { Q_OBJECT Q_INTERFACES(QGraphicsItem) public: explicit VideoItem(QGraphicsItem *parentItem = 0); ~VideoItem(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); //video surface QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); private: QImage::Format imageFormat; QSize imageSize; QVideoFrame currentFrame; bool framePainted; }; #endif // VIDEOITEM_H videoplayer.cpp000066400000000000000000000126321225012771600422440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include "videoitem.h" #include #include #if !defined(QT_NO_OPENGL) # include #endif VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent) , mediaPlayer(0, QMediaPlayer::VideoSurface) , videoItem(0) , playButton(0) , positionSlider(0) { videoItem = new VideoItem; QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsView *graphicsView = new QGraphicsView(scene); #if !defined(QT_NO_OPENGL) graphicsView->setViewport(new QGLWidget); #endif scene->addItem(videoItem); QSlider *rotateSlider = new QSlider(Qt::Horizontal); rotateSlider->setRange(-180, 180); rotateSlider->setValue(0); connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(rotateVideo(int))); QAbstractButton *openButton = new QPushButton(tr("Open...")); connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); playButton = new QPushButton; playButton->setEnabled(false); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(playButton, SIGNAL(clicked()), this, SLOT(play())); positionSlider = new QSlider(Qt::Horizontal); positionSlider->setRange(0, 0); connect(positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int))); QBoxLayout *controlLayout = new QHBoxLayout; controlLayout->setMargin(0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); QBoxLayout *layout = new QVBoxLayout; layout->addWidget(graphicsView); layout->addWidget(rotateSlider); layout->addLayout(controlLayout); setLayout(layout); mediaPlayer.setVideoOutput(videoItem); connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaStateChanged(QMediaPlayer::State))); connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); } VideoPlayer::~VideoPlayer() { } void VideoPlayer::openFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath()); if (!fileName.isEmpty()) { mediaPlayer.setMedia(QUrl::fromLocalFile(fileName)); playButton->setEnabled(true); } } void VideoPlayer::play() { switch(mediaPlayer.state()) { case QMediaPlayer::PlayingState: mediaPlayer.pause(); break; default: mediaPlayer.play(); break; } } void VideoPlayer::mediaStateChanged(QMediaPlayer::State state) { switch(state) { case QMediaPlayer::PlayingState: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; default: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } void VideoPlayer::positionChanged(qint64 position) { positionSlider->setValue(position); } void VideoPlayer::durationChanged(qint64 duration) { positionSlider->setRange(0, duration); } void VideoPlayer::setPosition(int position) { mediaPlayer.setPosition(position); } void VideoPlayer::rotateVideo(int angle) { //rotate around the center of video element qreal x = videoItem->boundingRect().width() / 2.0; qreal y = videoItem->boundingRect().height() / 2.0; videoItem->setTransform(QTransform().translate(x, y).rotate(angle).translate(-x, -y)); } videoplayer.h000066400000000000000000000053641225012771600417150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H #include #include #include QT_BEGIN_NAMESPACE class QAbstractButton; class QSlider; QT_END_NAMESPACE class VideoItem; class VideoPlayer : public QWidget { Q_OBJECT public: VideoPlayer(QWidget *parent = 0); ~VideoPlayer(); QSize sizeHint() const { return QSize(800, 600); } public slots: void openFile(); void play(); private slots: void mediaStateChanged(QMediaPlayer::State state); void positionChanged(qint64 position); void durationChanged(qint64 duration); void setPosition(int position); void rotateVideo(int angle); private: QMediaPlayer mediaPlayer; VideoItem *videoItem; QAbstractButton *playButton; QSlider *positionSlider; }; #endif // VIDEOPLAYER_H customvideosurface.pro000066400000000000000000000001021225012771600404160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurfaceTEMPLATE = subdirs SUBDIRS += customvideoitem customvideowidget customvideowidget/000077500000000000000000000000001225012771600375365ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurfacecustomvideowidget.pro000066400000000000000000000005701225012771600440270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidgetTEMPLATE = app TARGET = customvideowidget QT += multimedia multimediawidgets widgets HEADERS = \ videoplayer.h \ videowidget.h \ videowidgetsurface.h SOURCES = \ main.cpp \ videoplayer.cpp \ videowidget.cpp \ videowidgetsurface.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/customvideosurface/customvideowidget INSTALLS += target main.cpp000066400000000000000000000042231225012771600411670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); VideoPlayer player; player.show(); return app.exec(); } videoplayer.cpp000066400000000000000000000111401225012771600425620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include "videowidget.h" #include #include VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent) , mediaPlayer(0, QMediaPlayer::VideoSurface) , playButton(0) , positionSlider(0) { VideoWidget *videoWidget = new VideoWidget; QAbstractButton *openButton = new QPushButton(tr("Open...")); connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); playButton = new QPushButton; playButton->setEnabled(false); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(playButton, SIGNAL(clicked()), this, SLOT(play())); positionSlider = new QSlider(Qt::Horizontal); positionSlider->setRange(0, 0); connect(positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int))); QBoxLayout *controlLayout = new QHBoxLayout; controlLayout->setMargin(0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); QBoxLayout *layout = new QVBoxLayout; layout->addWidget(videoWidget); layout->addLayout(controlLayout); setLayout(layout); mediaPlayer.setVideoOutput(videoWidget->videoSurface()); connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaStateChanged(QMediaPlayer::State))); connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); } VideoPlayer::~VideoPlayer() { } void VideoPlayer::openFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath()); if (!fileName.isEmpty()) { mediaPlayer.setMedia(QUrl::fromLocalFile(fileName)); playButton->setEnabled(true); } } void VideoPlayer::play() { switch(mediaPlayer.state()) { case QMediaPlayer::PlayingState: mediaPlayer.pause(); break; default: mediaPlayer.play(); break; } } void VideoPlayer::mediaStateChanged(QMediaPlayer::State state) { switch(state) { case QMediaPlayer::PlayingState: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; default: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } void VideoPlayer::positionChanged(qint64 position) { positionSlider->setValue(position); } void VideoPlayer::durationChanged(qint64 duration) { positionSlider->setRange(0, duration); } void VideoPlayer::setPosition(int position) { mediaPlayer.setPosition(position); } videoplayer.h000066400000000000000000000051561225012771600422410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H #include #include #include QT_BEGIN_NAMESPACE class QAbstractButton; class QSlider; QT_END_NAMESPACE class VideoPlayer : public QWidget { Q_OBJECT public: VideoPlayer(QWidget *parent = 0); ~VideoPlayer(); public slots: void openFile(); void play(); private slots: void mediaStateChanged(QMediaPlayer::State state); void positionChanged(qint64 position); void durationChanged(qint64 duration); void setPosition(int position); private: QMediaPlayer mediaPlayer; QAbstractButton *playButton; QSlider *positionSlider; }; #endif // VIDEOPLAYER_H videowidget.cpp000066400000000000000000000066211225012771600425610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videowidget.h" #include "videowidgetsurface.h" #include #include //! [0] VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent) , surface(0) { setAutoFillBackground(false); setAttribute(Qt::WA_NoSystemBackground, true); QPalette palette = this->palette(); palette.setColor(QPalette::Background, Qt::black); setPalette(palette); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); surface = new VideoWidgetSurface(this); } //! [0] //! [1] VideoWidget::~VideoWidget() { delete surface; } //! [1] //! [2] QSize VideoWidget::sizeHint() const { return surface->surfaceFormat().sizeHint(); } //! [2] //! [3] void VideoWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); if (surface->isActive()) { const QRect videoRect = surface->videoRect(); if (!videoRect.contains(event->rect())) { QRegion region = event->region(); region = region.subtracted(videoRect); QBrush brush = palette().background(); foreach (const QRect &rect, region.rects()) painter.fillRect(rect, brush); } surface->paint(&painter); } else { painter.fillRect(event->rect(), palette().background()); } } //! [3] //! [4] void VideoWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); surface->updateVideoRect(); } //! [4] videowidget.h000066400000000000000000000046731225012771600422330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOWIDGET_H #define VIDEOWIDGET_H #include "videowidgetsurface.h" #include //! [0] class VideoWidget : public QWidget { Q_OBJECT public: VideoWidget(QWidget *parent = 0); ~VideoWidget(); QAbstractVideoSurface *videoSurface() const { return surface; } QSize sizeHint() const; protected: void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); private: VideoWidgetSurface *surface; }; //! [0] #endif // VIDEOWIDGET_H videowidgetsurface.cpp000066400000000000000000000124531225012771600441320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videowidgetsurface.h" #include #include #include VideoWidgetSurface::VideoWidgetSurface(QWidget *widget, QObject *parent) : QAbstractVideoSurface(parent) , widget(widget) , imageFormat(QImage::Format_Invalid) { } //! [0] QList VideoWidgetSurface::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { if (handleType == QAbstractVideoBuffer::NoHandle) { return QList() << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_ARGB32_Premultiplied << QVideoFrame::Format_RGB565 << QVideoFrame::Format_RGB555; } else { return QList(); } } //! [0] //! [1] bool VideoWidgetSurface::isFormatSupported(const QVideoSurfaceFormat &format) const { const QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); const QSize size = format.frameSize(); return imageFormat != QImage::Format_Invalid && !size.isEmpty() && format.handleType() == QAbstractVideoBuffer::NoHandle; } //! [1] //! [2] bool VideoWidgetSurface::start(const QVideoSurfaceFormat &format) { const QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); const QSize size = format.frameSize(); if (imageFormat != QImage::Format_Invalid && !size.isEmpty()) { this->imageFormat = imageFormat; imageSize = size; sourceRect = format.viewport(); QAbstractVideoSurface::start(format); widget->updateGeometry(); updateVideoRect(); return true; } else { return false; } } //! [2] //! [3] void VideoWidgetSurface::stop() { currentFrame = QVideoFrame(); targetRect = QRect(); QAbstractVideoSurface::stop(); widget->update(); } //! [3] //! [4] bool VideoWidgetSurface::present(const QVideoFrame &frame) { if (surfaceFormat().pixelFormat() != frame.pixelFormat() || surfaceFormat().frameSize() != frame.size()) { setError(IncorrectFormatError); stop(); return false; } else { currentFrame = frame; widget->repaint(targetRect); return true; } } //! [4] //! [5] void VideoWidgetSurface::updateVideoRect() { QSize size = surfaceFormat().sizeHint(); size.scale(widget->size().boundedTo(size), Qt::KeepAspectRatio); targetRect = QRect(QPoint(0, 0), size); targetRect.moveCenter(widget->rect().center()); } //! [5] //! [6] void VideoWidgetSurface::paint(QPainter *painter) { if (currentFrame.map(QAbstractVideoBuffer::ReadOnly)) { const QTransform oldTransform = painter->transform(); if (surfaceFormat().scanLineDirection() == QVideoSurfaceFormat::BottomToTop) { painter->scale(1, -1); painter->translate(0, -widget->height()); } QImage image( currentFrame.bits(), currentFrame.width(), currentFrame.height(), currentFrame.bytesPerLine(), imageFormat); painter->drawImage(targetRect, image, sourceRect); painter->setTransform(oldTransform); currentFrame.unmap(); } } //! [6] videowidgetsurface.h000066400000000000000000000055611225012771600436010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/customvideosurface/customvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOWIDGETSURFACE_H #define VIDEOWIDGETSURFACE_H #include #include #include #include //! [0] class VideoWidgetSurface : public QAbstractVideoSurface { Q_OBJECT public: VideoWidgetSurface(QWidget *widget, QObject *parent = 0); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; bool isFormatSupported(const QVideoSurfaceFormat &format) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); QRect videoRect() const { return targetRect; } void updateVideoRect(); void paint(QPainter *painter); private: QWidget *widget; QImage::Format imageFormat; QRect targetRect; QSize imageSize; QRect sourceRect; QVideoFrame currentFrame; }; //! [0] #endif declarative-camera/000077500000000000000000000000001225012771600335705ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgetsCameraButton.qml000066400000000000000000000051021225012771600366650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Item { id: button signal clicked property string text property color color: "white" width : 144 height: 70 BorderImage { id: buttonImage source: "images/toolbutton.sci" width: button.width; height: button.height } MouseArea { id: mouseRegion anchors.fill: buttonImage onClicked: { button.clicked(); } } Text { id: btnText color: button.color anchors.centerIn: buttonImage; font.bold: true text: button.text; style: Text.Raised; styleColor: "black" font.pixelSize: 14 } } CameraPropertyButton.qml000066400000000000000000000065471225012771600404500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Item { id: propertyButton property alias value : popup.currentValue property alias model : popup.model width : 144 height: 70 BorderImage { id: buttonImage source: "images/toolbutton.sci" width: propertyButton.width; height: propertyButton.height } CameraButton { anchors.fill: parent Image { anchors.centerIn: parent source: popup.currentItem.icon } onClicked: popup.toggle() } CameraPropertyPopup { id: popup anchors.right: parent.left anchors.rightMargin: 16 anchors.top: parent.top state: "invisible" visible: opacity > 0 currentValue: propertyButton.value states: [ State { name: "invisible" PropertyChanges { target: popup; opacity: 0 } }, State { name: "visible" PropertyChanges { target: popup; opacity: 1.0 } } ] transitions: Transition { NumberAnimation { properties: "opacity"; duration: 100 } } function toggle() { if (state == "visible") state = "invisible"; else state = "visible"; } onSelected: { popup.state = "invisible" } } } CameraPropertyPopup.qml000066400000000000000000000076771225012771600403050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Rectangle { id: propertyPopup property alias model : view.model property variant currentValue property variant currentItem : model.get(view.currentIndex) property int itemWidth : 100 property int itemHeight : 70 property int columns : 2 width: columns*itemWidth + view.anchors.margins*2 height: Math.ceil(model.count/columns)*itemHeight + view.anchors.margins*2 + 25 radius: 5 border.color: "#000000" border.width: 2 smooth: true color: "#5e5e5e" signal selected function indexForValue(value) { for (var i = 0; i < view.count; i++) { if (model.get(i).value == value) { return i; } } return 0; } GridView { id: view anchors.fill: parent anchors.margins: 5 cellWidth: propertyPopup.itemWidth cellHeight: propertyPopup.itemHeight snapMode: ListView.SnapOneItem highlightFollowsCurrentItem: true highlight: Rectangle { color: "gray"; radius: 5 } currentIndex: indexForValue(propertyPopup.currentValue) onCurrentIndexChanged: { propertyPopup.currentValue = model.get(view.currentIndex).value } delegate: Item { width: propertyPopup.itemWidth height: 70 Image { anchors.centerIn: parent source: icon } MouseArea { anchors.fill: parent onClicked: { propertyPopup.currentValue = value propertyPopup.selected(value) } } } } Text { anchors.bottom: parent.bottom anchors.bottomMargin: 8 anchors.left: parent.left anchors.leftMargin: 16 color: "#ffffff" font.bold: true style: Text.Raised; styleColor: "black" font.pixelSize: 14 text: view.model.get(view.currentIndex).text } } FocusButton.qml000066400000000000000000000046061225012771600365640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 CameraButton { property Camera camera onClicked: { if (camera.lockStatus == Camera.Unlocked) camera.searchAndLock(); else camera.unlock(); } text: { if (camera.lockStatus == Camera.Unlocked) "Focus"; else if (camera.lockStatus == Camera.Searching) "Focusing" else "Unlock" } } PhotoCaptureControls.qml000066400000000000000000000125221225012771600404460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 FocusScope { property Camera camera property bool previewAvailable : false property int buttonsPanelWidth: buttonPaneShadow.width signal previewSelected signal videoModeSelected id : captureControls Rectangle { id: buttonPaneShadow width: buttonsColumn.width + 16 height: parent.height anchors.top: parent.top anchors.right: parent.right color: Qt.rgba(0.08, 0.08, 0.08, 1) Column { anchors { right: parent.right top: parent.top margins: 8 } id: buttonsColumn spacing: 8 FocusButton { camera: captureControls.camera visible: camera.cameraStatus == Camera.ActiveStatus && camera.focus.isFocusModeSupported(Camera.FocusAuto) } CameraButton { text: "Capture" visible: camera.imageCapture.ready onClicked: camera.imageCapture.capture() } CameraPropertyButton { id : wbModesButton value: CameraImageProcessing.WhiteBalanceAuto model: ListModel { ListElement { icon: "images/camera_auto_mode.png" value: CameraImageProcessing.WhiteBalanceAuto text: "Auto" } ListElement { icon: "images/camera_white_balance_sunny.png" value: CameraImageProcessing.WhiteBalanceSunlight text: "Sunlight" } ListElement { icon: "images/camera_white_balance_cloudy.png" value: CameraImageProcessing.WhiteBalanceCloudy text: "Cloudy" } ListElement { icon: "images/camera_white_balance_incandescent.png" value: CameraImageProcessing.WhiteBalanceTungsten text: "Tungsten" } ListElement { icon: "images/camera_white_balance_flourescent.png" value: CameraImageProcessing.WhiteBalanceFluorescent text: "Fluorescent" } } } CameraButton { text: "View" onClicked: captureControls.previewSelected() visible: captureControls.previewAvailable } } Column { anchors { bottom: parent.bottom right: parent.right margins: 8 } id: bottomColumn spacing: 8 CameraButton { text: "Switch to Video" onClicked: captureControls.videoModeSelected() } CameraButton { id: quitButton text: "Quit" onClicked: Qt.quit() } } } ZoomControl { x : 0 y : 0 width : 100 height: parent.height currentZoom: camera.digitalZoom maximumZoom: Math.min(4.0, camera.maximumDigitalZoom) onZoomTo: camera.setDigitalZoom(value) } } PhotoPreview.qml000066400000000000000000000044621225012771600367440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Item { property alias source : preview.source signal closed Image { id: preview anchors.fill : parent fillMode: Image.PreserveAspectFit smooth: true } MouseArea { anchors.fill: parent onClicked: { parent.closed(); } } } VideoCaptureControls.qml000066400000000000000000000105141225012771600404220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 FocusScope { property Camera camera property bool previewAvailable : false property int buttonsPanelWidth: buttonPaneShadow.width signal previewSelected signal photoModeSelected id : captureControls Rectangle { id: buttonPaneShadow width: buttonsColumn.width + 16 height: parent.height anchors.top: parent.top anchors.right: parent.right color: Qt.rgba(0.08, 0.08, 0.08, 1) Column { anchors { right: parent.right top: parent.top margins: 8 } id: buttonsColumn spacing: 8 FocusButton { camera: captureControls.camera visible: camera.cameraStatus == Camera.ActiveStatus && camera.focus.isFocusModeSupported(Camera.FocusAuto) } CameraButton { text: "Record" visible: camera.videoRecorder.recorderStatus == CameraRecorder.LoadedStatus onClicked: camera.videoRecorder.record() } CameraButton { id: stopButton text: "Stop" visible: camera.videoRecorder.recorderStatus == CameraRecorder.RecordingStatus onClicked: camera.videoRecorder.stop() } CameraButton { text: "View" onClicked: captureControls.previewSelected() //don't show View button during recording visible: camera.videoRecorder.actualLocation && !stopButton.visible } } Column { anchors { bottom: parent.bottom right: parent.right margins: 8 } id: bottomColumn spacing: 8 CameraButton { text: "Switch to Photo" onClicked: captureControls.photoModeSelected() } CameraButton { id: quitButton text: "Quit" onClicked: Qt.quit() } } } ZoomControl { x : 0 y : 0 width : 100 height: parent.height currentZoom: camera.digitalZoom maximumZoom: Math.min(4.0, camera.maximumDigitalZoom) onZoomTo: camera.setDigitalZoom(value) } } VideoPreview.qml000066400000000000000000000050241225012771600367140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Item { id: videoPreview property alias source : player.source signal closed MediaPlayer { id: player autoPlay: true //switch back to viewfinder after playback finished onStatusChanged: { if (status == MediaPlayer.EndOfMedia) videoPreview.closed(); } } VideoOutput { source: player anchors.fill : parent } MouseArea { anchors.fill: parent onClicked: { videoPreview.closed(); } } } ZoomControl.qml000066400000000000000000000075431225012771600366010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Item { id : zoomControl property real currentZoom : 1 property real maximumZoom : 1 signal zoomTo(real value) MouseArea { id : mouseArea anchors.fill: parent property real initialZoom : 0 property real initialPos : 0 onPressed: { initialPos = mouseY initialZoom = zoomControl.currentZoom } onPositionChanged: { if (pressed) { var target = initialZoom * Math.pow(2, (initialPos-mouseY)/zoomControl.height); target = Math.max(1, Math.min(target, zoomControl.maximumZoom)) zoomControl.zoomTo(target) } } } Item { id : bar x : 16 y : parent.height/4 width : 24 height : parent.height/2 opacity : 0 Rectangle { anchors.fill: parent smooth: true radius: 8 border.color: "black" border.width: 2 color: "white" opacity: 0.3 } Rectangle { x : 0 y : parent.height * (1.0 - (zoomControl.currentZoom-1.0) / (zoomControl.maximumZoom-1.0)) width: parent.width height: parent.height - y smooth: true radius: 8 color: "black" opacity: 0.5 } states: State { name: "ShowBar" when: mouseArea.pressed || zoomControl.currentZoom > 1.0 PropertyChanges { target: bar; opacity: 1 } } transitions: [ Transition { to : "ShowBar" NumberAnimation { properties: "opacity"; duration: 100 } }, Transition { from : "ShowBar" NumberAnimation { properties: "opacity"; duration: 500 } } ] } } declarative-camera.pro000066400000000000000000000003411225012771600400210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-cameraTEMPLATE=app TARGET=declarative-camera QT += quick qml multimedia SOURCES += qmlcamera.cpp RESOURCES += declarative-camera.qrc target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/declarative-camera INSTALLS += target declarative-camera.qml000066400000000000000000000111321225012771600400120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { id : cameraUI width: 800 height: 480 color: "black" state: "PhotoCapture" states: [ State { name: "PhotoCapture" StateChangeScript { script: { camera.captureMode = Camera.CaptureStillImage camera.start() } } }, State { name: "PhotoPreview" }, State { name: "VideoCapture" StateChangeScript { script: { camera.captureMode = Camera.CaptureVideo camera.start() } } }, State { name: "VideoPreview" StateChangeScript { script: { camera.stop() } } } ] Camera { id: camera captureMode: Camera.CaptureStillImage imageCapture { onImageCaptured: { photoPreview.source = preview stillControls.previewAvailable = true cameraUI.state = "PhotoPreview" } } videoRecorder { resolution: "640x480" frameRate: 15 } } PhotoPreview { id : photoPreview anchors.fill : parent onClosed: cameraUI.state = "PhotoCapture" visible: cameraUI.state == "PhotoPreview" focus: visible } VideoPreview { id : videoPreview anchors.fill : parent onClosed: cameraUI.state = "VideoCapture" visible: cameraUI.state == "VideoPreview" focus: visible //don't load recorded video if preview is invisible source: visible ? camera.videoRecorder.actualLocation : "" } VideoOutput { id: viewfinder visible: cameraUI.state == "PhotoCapture" || cameraUI.state == "VideoCapture" x: 0 y: 0 width: parent.width - stillControls.buttonsPanelWidth height: parent.height source: camera } PhotoCaptureControls { id: stillControls anchors.fill: parent camera: camera visible: cameraUI.state == "PhotoCapture" onPreviewSelected: cameraUI.state = "PhotoPreview" onVideoModeSelected: cameraUI.state = "VideoCapture" } VideoCaptureControls { id: videoControls anchors.fill: parent camera: camera visible: cameraUI.state == "VideoCapture" onPreviewSelected: cameraUI.state = "VideoPreview" onPhotoModeSelected: cameraUI.state = "PhotoCapture" } } declarative-camera.qmlproject000066400000000000000000000006201225012771600414010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/* File generated by QtCreator */ import QmlProject 1.0 Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ "../exampleplugin" ] } declarative-camera.qrc000066400000000000000000000021301225012771600400040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera PhotoPreview.qml ZoomControl.qml VideoCaptureControls.qml VideoPreview.qml FocusButton.qml PhotoCaptureControls.qml declarative-camera.qml CameraPropertyPopup.qml CameraPropertyButton.qml CameraButton.qml images/camera_auto_mode.png images/camera_camera_setting.png images/camera_flash_auto.png images/camera_flash_fill.png images/camera_flash_off.png images/camera_flash_redeye.png images/camera_white_balance_cloudy.png images/camera_white_balance_flourescent.png images/camera_white_balance_incandescent.png images/camera_white_balance_sunny.png images/toolbutton.png images/toolbutton.sci doc/000077500000000000000000000000001225012771600343355ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-cameraimages/000077500000000000000000000000001225012771600356025ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/docqml-camera.png000066400000000000000000000673711225012771600403450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/doc/images‰PNG  IHDR(üµ¦¶sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœìÝy˜G}?þOU÷ÌÞ—îÕµºo[,›]²È@Bð/Äâ°ó|ó„`r@äï/„p¾„„˜àù súX°±í•Á¶ –µ«[Zí¥=gº»ê÷GÍÔÔL×ôôêXµÍûõðX£žêêêÕcëçª>Ť”dxóÿÀÙðÀÝï'"qôÞË—|fíîÝL^[þä³Õ3W~àÚKÏëð^=îº÷‘‰Þw\~ï’›ÛxéS¹ÀkËŸ|öOoü í;ß#(Ò74æ"fc×áÓ›jÒÃŒÆj"úò]ÿõLжï?/r)u>9³/€)Ó74Öjôù'wÅl¿æuW !ÍÈé<öpbpœˆ.¹âí´û{ut‘KDÕ3WQÉb/€ó®ÿÔøÉÁ‘½Oí¾rË;W.h©ØþŃ»~ôU¯½‚ˆ¦5Ö$¤ʇ[ìMïûÛ÷nû_cϼ!Óý€7Ò[±_Å­›Q½ø-1À«Ùû‹_ÈRÝ’ —,¬fç{8ð*v¼äÉŸýðoú½9ÓêcÞòìKG÷>µûuo¼zö´ú„ô@DGO?ñà7\õ›’l—7ÒûWñ‰˜]ßöÙD² àwˆÙûôÑ«ÿò=W7Сýðã–nZ€Ø ÎƈˆæL«DÜhcÖ´†½DŒå›$ô éÀËÒÑçîø¬ù[ÆX¸ñÍùX¹ÛàÕ©øßw)e²ÿ Á~¾G§‹çÃ;èÑ7ªÿ:•ôðƒ]FÜuÍ•›+ö ;1‡¯˜=h¹ÀKØþ»éyÞ׿ù]Çq‡;œcŒ1)¥Ò÷ý ÞûûïB”»Hf_ÞÛ}`(Ké†ù‹fd^Þ§†%ë/šWÅÄÈÞ'ž?âQíü%­GöŸœ š–Å+Ïñ=ÿÒÑ U·Ì[³ªµ™—F^BJkÆKŠÌÉ÷ÉJbNMãìukç7ðlïK/½Ô76î "b©ši³æ._4½–Å€Ër÷ô¼||hÔ“äVM›5oùâuœHŒüæÉçe©fþâÖñ#=}Ùš¶5ç¥_.óPH6÷™l°ÁS·„{øÂÇÞa½å÷ßg>¥\?ÚýsÕÇo¿oË—X¯”ô Ù§µêª*ÇuR®Ã¹£ž*„Dà:Üó|*äÀâþà<’™¿~){õ{Þ²ui-êýáýû§ÿÝ{.©¦ý÷}ÿ“‡Zk¾óãïysî||׌+þi]õþúÿ÷ˇkWÜòÑÍ6щŸûü½ú—O+ù7Þú_Œì{îàü7\ø×Ï]ÜÀIzÇ^þí¿ÜÓÓŸöZ/¹øŽu-sê"c§ö<õüW=<{eÓ‘gO\g+6³Ñ}¿>¸àÒ Ÿ~ÿœ¶zN#{žzî+û›WÏ<ùëãoûË÷\Ý@G~údçÌ«þiMýÈ£~x—ØøÛCWÏk@ìlg–ñštf›Š=|ácïøðí÷Qq$gíA‹ÊxqΫªÓ)7庎ã8œ1!D „çy$IHQ®Š¸’EŽØÛÿÆ÷oy×<"¢ÙðÖßß”*|[H‡Ïë¸øÕ§éó¶ÝØü®T]ÍZyÁG7?ø‘§&Íã­/™=¶÷À²w¾ù¦Õ)"’££Çýª9Kf6O¼¼/ëÌ[4­abðׇ3^Uýê¶Æ—½~;è¦Çݺ˜xzpÎØ‘eïzËM«S$Ç_zy´vÁŒõ›/þÌŒ'þü;”ïdnû뮣àÔ˜—%F¾°?ô‰áõKë³òã€s#óœFÆ‹òù*K*`2©à©8ãeïáMí¯ÿðí÷©öfÈõáÛï{Sûë­=hQk¼8çUétÚuÝ”ë:n Äøøx&› ‚@ Y•N×ÕÕ©4X²Wx‘é=Ñ´ôíóˆHì¹ç‡ÿïSã5+7ýÛ¶¶†pÓþ?ñž=¶îò¯¼{KÕeñÓ?ºohãûßöÑå|Æò™õ? Œ¶’,k¼Äè±CµËþjuŠˆìÞõ×»†.œÆ9k–/\èùÞoÈÚÆê†”;ïÒ7þÝjg¬[8{wÏñXØ}äXËò¿^"ýοþø«‡|wæêùØ…óW®ÛRûÀ=™üž£±Ÿ¹ã‰_ŒRÍì¬-÷Ð#£A’^IvÖ×xiW^v±þ¼ëáÇÃm"z¸ò²‹uì¥|øöû®¼ìâ’G”]ã•õ‚¢vDDÄs]ÇI¹Œ±±ñ±l6«º`Ž#¸œ9czm]õvH od$5sú4"¢ÁŸ¾(¬mëûmÏ ~Û&—ˆHB×c>ñ«îîê:qêÍh¢ñ_ür ÕÄ åµ”NW“?bt+‘õ‚⌗ÌTÍ9ˆ¨ÿ»ÎZ·vvŠ‚Ì„pឃ-—lþÛŽ93Íp§¶¶>Èž¤êX™L댙DDuïüð»Þiô²jyý¹ß t½øtjék7Ö±Àë?Pî¡™‰lP…”@‚éõU£ÙÉÞ¨â“r=X;4/Vì!âÞ’4ûT#/|`ÙÌDàŒ3×qHý¿[!›š›fLŸQ]]m½H‘ýÎ'ªuÀd¦­²c¥R$ÔÑþP–»ÜœL”’Ì@+<ÕXú_!¥$$yÃGŽ4­ý+æÔ“xéÏþpÿDÍŠ oxmmÉžëJÐ&~ù‹GýÂsŽ×WåÛy¼Ú‘R£QUc€ÄJå·%«ÿ{øäS{"¿îµë‰Èᜈ8g^ Â=h%¿5/Vìáɧö”¬ÐWë½ÔÂ=hQSBˆL6Ãs‡s¦gkëko¼aÛààï{ßÿÁ}ån€DáUu^o_MŸNÍ«ØO~y ~ÕÅ«]ý}é^Åò¿£’ïÂÿà55™£'ûhÚtšöŽ××þõ®çqá4Í\R5^³ ©žˆ¼£ÿý£—^øª•¯±7bÜ8zò$MŸAìÔóÏݵOºLÒY´ªµnÜuÉ7o“Røã5sË=4ñÕ0~ç±Ð4_ÔžD!‰H…I,?ÍîA±Æpqzxê™gõÌÅõ*özíÆ Ã=hQWŒˆsæ8œsÆ9'¢”›š>}úÐÐÐÜy­Ï<õL6ë3^‡ÿn$«ni>°ïû‡W\?_ð®·ý÷›³U éÂ$[è_â²ÿVKIEé'KäªgÎ<ü›ÿûÂâ›V§Ú®¼êk¯9îUµ6Þö?ÛïöRKsjî‡ÞuÁãÙo}MºìsʾJmóðo¿¾w韯ªºâo[±¿¯WVÍ[Ð2+Õ÷/ÿðh7™çÚJ)‰×T-ûP^ ÇõÂöIïI¤ü -˷墷ø=чo¿oãú ÔÝ¡µ­B9‰«®l7ËkllllhÊd¼^ØëײѯžñHHŒêÙm »ÿïà ¿ÿÚß[Z[ÍNýèž—[Þ¶é’ê·Fü;.­ÿIM[4ç¹o?xÛ%ëÿ`SëâúúVòŽï;9n™6úÂm?®ùÈUsç_¸¼zßoÿ{·û'W4ÅyŠ·´ÍùÕ7üÌ/üý‹Z/ž3ŸÄPoï#Ïí?Pßèš/’’xmëÜþ¨‡"ðH²p®ð†D­¤ W¾îüYîaý…ëTë/\WîJIZTÆ+âÔ ßýÎñcǽ–™ª¹øÀ+FzÚâÖáýÇwxäV¥Ý¦?{[îIÕ –»ßøÇo|ѧê¹+VÏ«’c=7üÕÓUÍ]µ|Aµ{òÇ¿÷Ò³V¯š?ƾsÛ7þãê¹+VÏL ß/Y(Áç¼vÞâ¹G»žýÄ®GÇ|IäTÕO_¼dÎLŒìíúó·3’¥ë§Ï®Ûû{÷Oo\¶nÉR‹7€ÙÕœæ-sä©g?ñ êœ¹Uµ MÓZçÌZ4ÓÛ¬´Êy5Ìk+óжFŽŒ@¢é…j}Õºuk"›Ë¶Â{ÏVº³qø Eìj,YïÔ̼í³ÿ1,"ò¦]ä¥[u¼Â¤ê[—®l%"1ÚýÒhẔ‚ÕÌ_»n~îw’jZ×®oU_ ɪ[WnÈýN ª™·fÝ<"’2Èî>ž)~ˆ¬ž½h~cЧšæ,lšSô¼vVÛêY…KÓçº;IÄÒM­ ›ZK^Ï[Ñ$hù‡â¿aɦ²MÇúGâ—“8Ñ?L¡ºóç·Ížñ:Õòj‰Ñ+¢.€W®Ð¿¿§“ù †÷ퟸõÚu%×_~ôº¯Z¼¤…à MxÁ›®y׃?øöüUohnª¯Ø~phäÐÞÇÞtÍ»&¼@ýg- =hìMïûÛ÷nû_/é/w3¼j‰Ñ{»ªi]±lFÊzÞbÒŸá䗔 á@´U ']"úîmïéï;IDÓÕégp–ôì%¢Ã‡~ùÎN^±5œ¼¦/€)‚À `Š ð˜"¼¦/€)·ò=œ/éTÊuÜT*¥¯H)¥”Œ9ú·Âv6*#‘ûÀ¬G§æ¿5º-|'-·è~¬†Â1›É ÷8Σó><Î#|)ÂOáL†[Í W¯lþK^ÓìÊc¬¦ªÚó¼ $#ß÷=ÏsÇ÷ýÈ÷"BàpŽã¬Y½¦½½½¥¥¥ººZ]4B®~«Ã¤â€#ëÐä¦rÂWü{…ˆŠm-ñY!N²šFhEBF<.Üaô`T3Æs\ÆØÄØx:îëë{fO×Ï{¬¦¶~h°?â)/€äJ¥R]tÑ;·^ÛÛÛ{äÈ‘2­¸”²(æ(/~àåÄ *ô£‘ù°h:®Ôˆù¾Ÿ'4ÊID”vSAÔÖÖnÙ²¥±±ñþ¨©©¯8^ÉÕØØØÞÞÞÓÓ3<<œN§ƒ ·Ñɘˆ~Œoyø¢5`²òÄYŒÇHcb4Íò:…ö±si•Xæ. ™³ÂS,s—%mcÄ&iÜ—RNLLŒŒŒlÚ´©kÏžcGÇ /€äjnn®ªªðú¥”Ö%D:ꪦèxËXÅE‘·Dv=Cg•Æ:f:ƒe ‰,¨x1†‰üöFV4¦ñÂî½Ü/¶\Ž´MƱ3˜´ç¥òû+¥²,ÍÂoW4T=gZ2Èö´††EÁkþ&æÛaª`Š ãhªD'ç\JI’HäêÌ !„PT)öÁ8ÖœPüª¤ÑÆwb.²•™ ²/ŸŸd>¯èÔíâ—*ù —d¼âÏ32^S/€DBxOœqîJ®²\Œd¾ºIÎÈa<—°1—F…ó+ÒLé‹zÙ»-K¿"ktE†@æ‡Sba0R¥7ØÓC<ÿ\c„:9ˆÒv†¢5\¼4IfM¡éÏLæêIgBU¿C}ð}Ÿbgþñ˜"Èx$šÌBåV©Š…UGÄHZ2^1éTOÉy8“j…¤:¯F:¹e&¡&»+Ó¶ Ñ6äB­Ô¢-ŠzP–5^…Uº‹1&óýH¦+Öê?8Èx$šªå8©$‹ÎµèÝv’|’ù3­ä‹N Y-á”QÌ€¦è"¨E§VëDÓO¶f¹b¥¾˜-»}е°¡­0þ¢:V’tT…Öbu‡À ¬ªªª®½öÚ7¾ñ ,H§Ó½½½¿üå/¿þõ¯Ÿ8qâ´û¼ùæ?ÛÛ¯9xðà¶m8‹C}Aàhºr=‘Tk¼JÊVI™¯e¯.šk¼ '@[ÈÐF<jiiùüç?¿hÑ"ÕÉøøxkkëÛßþö={ö=z”ÊlⳞ«­ ƒD4>>a[PNY]¥ÓN&“!"nœðc=WÛ²£sòU¾½ÆKJÉ™c¦U•5d¼^%Ô_íŽãH)õT#1æHI*^1£1sBM"Ö¸€…«Häo½å–[TÔõ¹Ï}îSŸúÔàà`SSÓµ×^«BÀ~ðƒW]uÕŒ3Òéô©S§öìÙó¥/}éðáÃLÒŽ»¿ºxñâ‡zh ¿ÿÍoyKUUÕ£<úÏ·ß>22r׎Ë–-%¢+–wvî&¢OúŸ~ô£÷»÷¶´´|ë[÷üë¿~‘ˆ>ùÉ¿¿âŠË_|ñ77Üð!"úêW¿ºxñâûï¿ÿäÉ“×\sÍÈÈÈu×]Ç9÷»ß}õÕWÏŸ??›ÍvuuýÇüGww7EN5š¼4òŠžÌÅõÂÏŽ©JÚú¾ïû>Îj€Ó4mÚ´K/½”ˆvíÚõ¹Ï}nÅŠ®ëú¾ÿðÃWUU577/[¶lxxø©§ž"¢Í›7···/[¶ì}ï{_àùDtÅW¼ôÛßîÞ½ûšk®¹òª+ëêÿâ£{òÉ'fÍš511±gÏ"êîî&¢l6KDƒƒƒêé§N"¢±±1õ[ÕaGG‡ëºû÷ïWé®~ô£oûÛ³ÙìC=ÔÖÖ¶yóæõë×èC:rèðTÿ°& @¢Aàû¾ã8R2NRWï̧§ÄÕ^Ú2^§Z[[U2ìá‡nkkSëÇc3fÌPãù£?ú£'NÌŸ?¿¾¾~ùòåßøÆ7æÍ›·bÅŠ_?û+ÕÃáÇßð†Kcïûã÷}þóŸ¿øâ‹¶-üÈŸäSÿø©n¸¡§§çMW]ED æ/li™–iž¯Þ@ýSøES¯{Ýëö¾ðBUuÕ[Þü¦·½ímDtýõ×ßÿý¾ï?þøã«W¯~÷»ßýùþœn~󢩯|zËZ@µDQÆ+(:8ÈóݼX__¯??öØc+W¬àœ?ÿÜóêÊÂ…mË—-«®ª""ÆØë. "–‰(ºØ®]»d ^³ñ5’‚¥Ë–© çþçÌ6‹/Žù‚ç/€D33^$£–AnM=ãRý¢Ú›‹ëÃ%ì¹^´Økïo^T‹Æ6oÞ|Ï=÷”´]½zõÇ>ö1"úÖ·¾uï½÷NŸ>ý _øù¾ïyžê¿¦¦F-MkjjRwMLŒg³Yýô|lÇ!±LÆ#¢†††|_;44˜J;Yo‚ˆFGs³_þò—ûûûõÀNž<éy^áBoif´â—“PAžª «Ž 2¯û¾o­¼Z/(222ò½ï}ïïxÇ¥—^zóÍ7ÿ×ý×àà`ccãå—_~ìØ±ÆÆFÕìÖ[oë[ߪ~k†t—]vÙôéÓûúú¶lÙ¢®¼ð Däù>ÕÕÕ™;uêÔœ9s,X@DMMM_|qxHŒâ¨_ÿ*7¡yèС;ï¼S}^±bÅ´iÓÎÂËŸc¼M,’9Ň7Ž ²ž•c+ú`­wZrs*•úØ_|lÙ²ekÖ¬¹îºë®»îºl6›N§‰è¯ÿú¯Ÿ~úi•ï¹óÎ;Ÿþùk¯½6Ü¡ëº÷|ûžþùóçу>xøÐáêêê}/í#¢yóæÝóoÿÍÇÿæèÑc+V¬¸úê-³gÏ^°`~mmmô»ôööÞu×]øÀn½õÖw½ë]}}}mmmK–,ùìg?{Ï7¿UhîÂ, {U–®X[rQýsRçŽ €°šÚÚË.»ìãÿøSO=522Â9ïîî¾óÎ;ö³ŸûìÊ•+7oÞ,¥¼ûî»|ðÁsñ£8»ñH4ƘˇqÆ™ ÉŒT#F”[ŸÎò›òÌÊ¢š5+ãp§\37UµdÑâ¯ý÷áÿ|a|b\J™N¥ç¶¶ÖÕÔ>ôàCwß}·çyµµµsfÏQ¹¨eK—NŸ6] ®*¾ë+w}úÓŸ‚ ¥¹yQÛ"ƘtXm}í>ð¡¡!µ…ð‚ /¬®©®o¬¿~Û¶SCCŽãÌœ5s||âÝï~w]]Ýšuk‰è¢‹.Ÿ1cÆâ¥Kô8ç·µ}ë[ßúÒ—¾¤ŠMTUUÕ××Ï™3ÇœÄÔõÌôvEndûR¡w¤}W#ËË5 Çqô!ÙŒ1UÛÌZQ6 @Òé¿é#þnwÝÜßéöÉÄвEcæ•T*5Þüùóæ‡Ì™={ÎìÙúq³fÎ,´POglÁüù æÏ7;äDÜqW¬XQòд›Zº¨]xá…–«ŒÍ;wîܹ¹žó±¦ùî"‰–™¥’fåèm ”ÆÔÎy̨‹0Õ0eñH:ÇqT>Æœ,+9‘å6f’©äTÇá£ãgnÂP.zíEcãc3gÌ\¶tié·Ì~ˤNŸ¬” rœPEY[9Y˹I‘TŠ«dÅ= ¨Ày°aýzšL ò»@Ò©UDRJNÆB/V´ê(:Ò±®‚ g€¬k¤&‘B ]ŒŽÀâ§¾ ýè[¸e¨¬¸ÜFè¢e0ú'}dQþ΋–Õ«Å^÷–>.f;8CÈx$𢰫1¿“N}e®1âNTæÆš©’‘i2½Fʽ,<0ë½áöVÖL›%õUf½WÌŒ—þ¶â¢±\c^èVÝ.¯/€)‚Œ@¢I)u¥(ýOsu—j쫸"±ÈeW`ñ¨¢z¶¥¾¬)´ÑÏeŽÝÒ6¬è _…1ä>2µÒK}ˆ5d¼¦ 2^‰¦3^z3ú`Öb“)p¥qµ ñLªmY1g’é[ÉR,ö)IÖ2~nQß>s¦þD8çBuHvü]¼’N^œsu& ®n`Š^$n-õ©}Œ^o=ƒ(fxWô¸Ð-gVî+ºr„e“Sá'XžÞÍÀK§¥”A`¹× SS/€DÓé.Æw)%1Æ'!%#ƘšstdÔZxÁr)ë¢9¿h>×Òa¼U!ýffË‚Ð|œµ3™ºÓõS)ªÚ9N¨èÙ& õh 'ùrW¤ÚÆ›gdŒ\×åÜe,î¾d¼¦2^‰¦—r7 I0Î…–~—}ÔOü[b®Ê²—W·Æ+ú°êBE[³âçžþéF¯ì8®j Ó(  DÈx$š>2ˆ(WË@]g’Ô")•"â‘ÉF:Œ×™Ô˜(n_š**ÖPXk·ïÉŽêô d”T”P«»(tîxÌΑñ˜"Èx$šBŸÛƨ–yå÷ æs-‘—P­T:³ea+~ÙzŒUøËJGhO:ãU|{Ü»‹ÎeÊÿÀõ!N“- ŠŒÀAÆ éÇQy/I²P¹¾8K}âµd–”Lü}qî­H†Èã/8 å׫˜ñŠ5þš9ÛNFfy §|ÙzÓ*Bà\555D亮ïûŒ1ZÇ]¢ãŒØ8†{>[&{ÊPQ°z9Vyqýä*hDLžêS2‰H^湙꽰¸ YñHýÚù› IDAT.ß÷=Ïs¹ã8©ÅõdV]8òfÒSZüåóg—=K$ô ?QpxÜSzb>º¤l„þ¬Zºn­…Ô^bïy2^É‚Œ@re2™L&ãÖÔæ²,ùú ª~cL/„Òç4ÛÉŽÌYÅ\’_ sY·ðJy2SPñj½2§Â!Ù“ÍØ™ï[n“cŒs¦s`:Ý5::šÍfã<@rù¾ßÓÓsÁÚu2·‰.WÖ‹sž _XîÜ@ZY£‡*„)–[òs—ÑÍ¢V4éÚúB"'êhEýÁ,eÄFfÀÄK¾µ†eË•åÖ×Ëü]Ž#„H¥RRJ×uS©Ô¾}û††ÇÆÆ¢^*@r÷ôôøYoéÒ¥ Œv5"Va9T9Ñ)¥B’Ìhe©;ûŒŸÓ;±gR÷FŸçó´l …h%ݺ®«~øccc8xð`6›‰3tËYQñbx¦²è}õ̬¾`|ñ×p]—I"¶-ZpôÈ¡r·D Îd¼’+N«EÜõõõ¾ï«ý€ù| 'ùí¬h:Lã…Ý{¹_l¹i›Œcg0hÏKå÷!VJeYš…ß®h¨zδx†°Ü½dÛ³ÉeÔûê|ßO§ÓÙl6å8^&ã8Žïû®ëVÚª™JœFpæñH®L&#¥äœ !Ôþ;•â""ΑÌ]¤€d.™b¦r̲VêaÏTÙÒ`F¡¬“(EÙÒÈY’s…Ï,7*X{Öåóe^9œ{²¿oIÂŒ;äù&¤/Çá?ëy‡‘ußC/€är]×÷}!„çyDä É)|áI)™$Æ#®Ë"XãëFk),Û–ÈG¯|?®(â¥sˆE…IýÒ As…ñçËœš¶Ç…†=fA– B—¤æv‘ð|!¤”Lr'¢s SS/€ä’RAP˜gd<—n‘"‚ˆr¯2E¼¢súè¢E‹:;;››››››o¼ñÆK7onj´GiTæ•Ã/ëJ8ýÁZ·¬ä)RJã¦ÂÆÆèMÈxÀ9±wï‹Û¶mknn¶~»}ûöU«V•\ô<ÏŒºˆhÛ¶mwÞyç#>:têÕ÷BÆ ÑJÖxå/K)¤ÊxQñWöƒ¢Cûþ¬É­¢ž£·Iߎ8x \ºkÇŽ½½½ëׯ×é")¥çy?ÿùÏ/^¬£.eÛ¶mDtã7n~Ã%(ŒmTÖ¡æ®Džr]h­¨›ì/^‰¦þj‚@JÉ¥”¹©®\9 x1Æ&5á¥D¤Æâz)åÞ½{¯¿þúE‹Ylß¾}ùòåæ±?¾ï?öØcá¨KÙºuëöíÛ{X³zuÌ¡NúÈ ÛÐ:;Y¼æÿhbþ”0Õg™ïûÇß¾}»õÛ;vœ8qbþüùfûˆ¨kpp°££#ðƒè¨ë/€DS%:9çRJ’D‚$Wg !„* J±Ʊæ„âW%îPÛ¿ÿu×]W.ݵcÇŽåË—ë “ïû?þxtÔÕwòä…\hÉLPÙ—ÏO2ŸWtêvñK•ü„K2^ñç /8»|ßïîîV ³Â:;;Ÿxâ‰yóæéÆ1£®s:æ)ƒŒ@¢ !¼À'Î8w%WY.F2_Ý€ˆ$gä0žKؘGß„ó+ÒL鋺…-K¿"«ªÈнÿ%—\ÒÑÑam¿}ûöyóæ«Qø~ö‰'žX²dIDÔÕÛÛ»nÝ:_ètÏ?ס^IÞ.üîEk¸xi’ÌšBÓŸ™ÌÕ“ ΄ª~‡úàû>Å^ ‡ŒœMÝÝ=åVwuvv>úèÏÛÚ‘ïû1£®s<Þ)…Œ@¢éRïB¢ÜŠ"UÑ °êˆIKÆ+æâ#ê)9g²CåÄŽ=zÉæ²é®;má"ÆX&“yê©'+F]kÖ¬)¿[Ó¶ Ñ6äB­Ô¢-Šù[lk¼ ªtcLæû‘LW¬Õ.82΃—_~¹Üê®îîîüà‡ .ò}?FÔubÍš5ç|¸S/€DS•¢Ç!"•dѹ½ÛN’O2¦µ‘|ÑI!k¢%œ2йÐd®m:räȬٳÊ^Û·oomÁÓÏ<¹tiTÔuâÄñÕ«WEW&c¶ìVôA×Âv„v´B*«°¨Ž•$U¡µXÝ!ð€³ååý/ÿÛ¿ÿ»õ«îîî¯~õ«Dtð`Ïúõë#¢®={öÑÑ£ÇZ[[W¿ò w•@àhºr=‘Tk¼JÊVI™¯e¯.šk¼ '@[ÈÐF¼ø¯ð&¾ÁÁÁY³g—Kw-Z´h``@­ýŠˆº6lØÐÕÕEDÛ·oÿâ¿^w%¥¯>pㄟB^ÊÈxYvtN¾Ê—¢×xI)9sÌt£ª²†ŒÀ«„ú«Ýq)¥žj$"Æ)IÅ[f4fN¨é@İp‰ÈÅéÖ{µýû÷ßqÇåÞBÅUT)êÚ±c‡úíwÜÑÖÖИ_Y/Ë‹˜cæ¥ãx–¹¸^ø¹Ã1UI[ß÷}ßÇâz˜:CCCD´uëVë·“ŠºˆhçÎŒ±¦¦¦s7àó/€D ‚À÷}Çq¤dœ¤®Þ™OO ""&ˆ9ª½´e¼*¥Lq ¨:t覛n U4ù¨‹ˆ¶oß>Þá[ê;Ë奤5yd¼oxÐESùô–µ€jé3ÍŒWPtpçyêìr÷–@Æ Î”ëº·Þz+³iii¡ÉD];vì8vìxSã«0ÝEÈx$œ™ñ"µ rkê—êÕÞ\\.¹`ÏÍðÐb¯2ÅHËY¸páÂ… 9e΂ xáŽ˗/uÑöíÛç¶ÎÍf³E­™_r»°-7}dPür*³¥zVG™×}ß·V^-/8ûN/êÚ¹sç±£ÇfLŸ1uZÈx$š.X %sŠo.T&=Þ{ÈŠŽÍÉŸ¥9€ø‡dë–BˆÓˆºˆèŽ;î˜;w~>1d?µ:ÿ0˘‘ñ²¤´Ìª±We銵%Õ?'u^!ãg×é庈¨³³ó‘Gmiž6E=ñH4ƘˇqÆ™ YœÔaD¹ÍŒ,¿)Ϭ,ªY³2w"šIŠÊ‡•qÕ ‚`ïo^<¨‹ˆ¶oß>§u¶SÅÂuÇ$••Dae•~es0ÂH¿åšߦBïHû®F½K ×,Çчd3ÆTy[KNÎ@Òé¿é#þnwÝÜßéöÉÄвEcæu:dDƒðã‚ xaïé予¨««ë‘GÙ¸q#·M†1cxöÀ+‰Fo°¬&½­òјúÀ9u/8+‚ xîùç—-_uuww«Âî¸ãŽÖÖVk´÷j‚À éÇQùs²Lçor™˜|ÂÆLJÙ'ËôP®Y4}dás/TˆºöìÙóÉO~ÒÚ‰:Bû5¯yMÌ´ÅHPé.ú@!˹I‘TŠ«dÅ}üõõ¼àŒAðëçŸ[¶¬BÔÕÔÔtÓM7Y{ؾ};=ýôÓæÅººº /¼ðÜ ù¼Á®F€¤Ó«ˆ81‡qõ?uQ%`*¦xžc°^ÔJ•+ú¢¾WQ1êÚ°aƒ”rppÐz¦íرCöïß¿~ýúêªêÂËSÿ3__ ÏÄ#~ùG„ÿ§ž¨¶8˜?7ýˆˆã†Jÿ b¶(Á¯žûuŨ˺š¾œ;wnذ¡÷DïêU«ÎæX“S‰&„(É?–%kŒ¸Ãuûp'ÖÅ^2²rjô®FƘïû¿®u577O*êÚ¾}û§>õ©¥K–Ìž5ÛºX­pÑxkÂÏöÊQk¼*f sy¡[uK¸¼jd¼`Ò|ßöWÏ.Œº:ôè£Æ ¼·nÝúÏ·ß¾þ‚ gÏš}öGœ Èx$š”R¯ñÒÿ4kJ©6ÌVË*‹ÌñXv^Øû‚ãºQ×ñcÇÖ­Y;22rà 7ѶmÛ"žÕÕÕµuëÖÑ‘Ñ ë7è‚dÖçRn޾XAd!/k! KÙ3#C¦ö6ª±€Œœ†¶¶E£££á]Š:êZ¹b%ÕÕÕ­]½æýïggg¹®vìØÑÑÑÁˆ­[»VG]¯V¯ò×x¥Ó/}Fú`Öb“)p¥q^š³.«²j¨¯ß°~ý×¾ö5"Ò“‰ù¨ëøª•…uñÍÍÍ«V¬Üºukggç† Jú¹é¦›¾øÅ/^pÁ– ¶4³}ŒyJ’õ…ŒŸ[Ô·…Ïœ©?µ£S’W#/€¤Sç\ ˜ ‰ŠÃˆèEâÖRŸúØGËÒu[ÏTÞ556½vãkt쥢®ÇO¬]³¦¤ýܹsçfì¥ÚïÛ·oÓ¦MÕÕÕñ~Eã ÐzdæTøÉáo-»xéT£”2,÷Z!ð€ÓT__¯c¯®®®ÇO¬Y½ÚÚ²uÎÆ™Ž½ººº:::jkk7mÚ4µC>Ïx$šNw1ƸëH)‰1Î8 )1ÆÔœ£#£Ö –KÉX'ÍùEó¹–C×76¼öµ¯ýÚ×¾6sæÌ5k×”<Å<ãhîœÖ‘áᎎŽíÛ·ß|óÍkW¯™3gŽ¥ÂLÝåûãTá oÇ Ý Û„ Ó¿b-é3wEªm ¹yFÆÈu]Î]Æâ1‰À ÎH}}ýÅ_gºpÅò¿ùíoþþïþþâM7Ô×Çß øªÀ ÑôRn"âF! Æ™ ÐÒï2¢OËŽK¹§ÔÖÖZï-ºÈ9™ëîí#"X¨akVüÜÈÂCËm,(¤ã¸”?›ÈÜô5hÊILd¼MD”«e ®3Iju–JñÈdŠN#FÆ+~‰ˆNTO¥£2‹5ÖZÅí{²£šìà•’ŠjuKÐJv>FCÆ `Š ãhB}Bvn£Zæ•ß3˜ÏµDf\BµRéÌ–…U¬øeë1jTá/£{3 ÈžF*ËV^ÕÞIѹLù¸>Äi²T‘ñ˜"Èx$ã8*ï%I*×g‰¢O¼–Ì’’‰¿³/νÉÐyüg¡üš`3^±Æ_X3gÛÉÈ,Oá”/[¯s`úCE¼’«¦¦†ˆ\×õ}Ÿ1ÆCë¸ !BtœûÇpÏgKÌC$‹wä…^ŽU^\?¹ “§ú”L"R—yn¦z/,®Hd¼’Ë÷}Ïó\î8ŽCDjq=™‡U޼™ôT£ùüÙeÏ }ÂOÔ÷”ž˜.)¡?«„–®[+D!u§—Ø{ž‡Œ@² ã\™L&“ɸ5µ¹,K¾þ‚ª_ÀÓ ¡ô9ÍöC²#³GV1—dÅÈ\Ö-¼RžÌT¼Z¯Ì©pHöd3væû–ÛdÀãœé˜NwŽŽÆ¬(À ¹¤”===¬]'s›ère½8ç¹ð…åÎ Ô¡•5Zq¨B˜b¹%?wÝ,úhE“®­_!$r¢ŽVÔÌ@Lj̀‰—|k Ë*–+Ë­¯—ù»G‘J¥¤”®ë¦R©}ûö ŸŽz©<^É5::zðàA?ë-]º´¡¡ñ®ÆBäÁ*,‡*':¥TH’­,uGcŸñsz'öLêÞèó¼cž–M¡­¤[×uÕllìÀô¼lœá/€$s]wbbâĉÞþþ~Çq¸ëÄ/’n?ú±§²D(š1.Ääô#Î`ý¾­ÂÖ$êé[+uE ŒSþ”L΄jY}Aœ:5ؼ’+›ÍÑðh¬i,H>ìj˜"¼¦/€)‚À `Š ð˜"¼¦/€)‚:^IW[]MÄR©”¾’;@È8ŸQØj—2Êh/mšÿÖè¶ð­‚jÅvʵ'"äWéÈÒ£~¬ð¥åÈ Î¢ÎjdÆ·áW6‚%¯ivå‹€1VSUíy^Üu‚ ˜˜˜H¥R™L&ò½ˆx$œëº+V¬loooii©®®VP w`³“ŠŽ|¬C“ ˜Ê ^ñïÕ5÷cÝc‰Ï q’5Ð4ë苨Úôᣣš1Ƙã2Æ&ÆÆÓét__ß3{º~þØcÍ-3úûND%N8hž/H"¢´› ‚ ¶¶vË–-÷?ð@SSÓÐÐPÅÁ ðH®ºººöööžžžááát:A¸NÆDôc|Ëí“þiº\xgLŒæ¯Y^§Ðþ Nr,f™»,dÎ O±Ì]–´aŒw˜¤qo\J911122²iÓ¦®={Nö3^ÉÕÜÜ\UU5àõK)}ß 騫R˜¢ã-cWèÔê’®#¿Œš¡³Æ€ŒJc³Á²…D–GT¼ž©,z_=3«/_Fü0…ðe \×e’ˆ;££Ããã£m‹=r¨Ü-Qc€s/€äJ§Ójw}}½ïûj?`>ÉD~{#+šÓxa÷^î[.GÚ&ãØÌÚóRù}ˆ•RY–fá·+ªž3-ž!,w/Ùölrõ¾ºß÷Óét6›M9Ž—É8Žãû¾ëº•¶j柧œ9d¼’+“ÉH)9çBµÿN¥¸ˆˆsF$s) ™K¦˜©³¬•úEØ3U¶4˜Q(+Â$JQD¶42F–ä\á3ËJ–Äžuù|™Wçžìï[’0ãy~† éËÀqxÆÏz^ÆadÝ÷†À ¹\×õ}_áyùB2E _xRJ&‰1ƈë²ÖøÁºÑZ Kã¶%òÑ+ßÃ+Š„xébQaR¿tBÐ@aüù2§f Ã„íq¡áGY%h£Pà%©¹]F$<_)%‚ljè\ÃT#ÀAÆ ¹¤”AæÏ¥[¤¤ ¢\Æ«L¯èO™b÷ù‹ö¢Q·„ójÅs±:)Sl"Vå}k>/ædh¹V%;ÌnE^üùVd¼¦2^ÉÕÛÛAŽãHµ¤‹ˆTiÎ k¼l‹Ê)vÆË~odÆ+š5/¥ë—Æãe}\L Ê­ñ2ž¯ò‘*%3é…ŒÀAÆ Ñô/³Pª$AÄt Ì, :‰Ò¦¼tIVÑs#OŽohhèg<¬ve–3sæÌË.»¬t0¢0ª3Yãó”!)*¤¬Êe¼°Æ ’¢çÀ?ýÓ?•‘²ÙìØØØùéT@Æ ÑTBEg¼(—×Ée¼Ô¡Aæ2¯øgK‡s<æ½zÍSÑÅxÙ/ó–Þ“½Ñí;::<¸páBª”ñªø¸ÂÅPÆËºN°Ö-+yŠ”Ò8…©°±1úF2^p®xž744´uëÖèfGš!_Èx$Zɯüe)…T/"*þÊÂ~Pthߟ5¹UÔsô6Éз‡ioo¸EéèèøË¿üËÒSwbg¼ìƒ)?*ëEyÊu¡}P´¢n²k¼x$šú«=)%—R榺rå$Tt›Ԅ—}dv:AO>9yòäõ×__±ý† æÎ;88ØØØh-'ÓdûZg'‹‚×üMÌŸ¦à\9~üxÅ^JGGG__ß9Îù‡Œ@¢©œs)%I"A’«3ƒ„BP¥ØãXsBñ«’FwXbxxxîܹ6lˆÓOGGÇüã¶¶6cQíÍ•}ùü$óyE§n¿TÉO¸$ãž‘ñ€sÄšîêìì 7îèè8~üøT ë¼BÆ Ñ„^àgœ»’«,#™¯n@D’3rÏ%lÌ¥QáüŠ4Eú¢.EaËůÈZR‘¡¯¯/¼Ÿqç΃ƒƒáë‹-jkk;yòDKKKùá.­ø×ɱ@”¶3­áâ¥I2k Mf2WO‚8B¨úêƒïû{%2^pöù¾ßßßoÍxuuuYoéèèèï8ç#;¯ñH4]Þ]A”[Q¤*V#iÉxÅ\|¤S=%çáLv¨fÆ«··wýúõÍÍÍfƒÁÁÁ={ö”\Ô¶nÝzß}÷-^s{¦m¢mÈ…Z©E[ó·ØÖx:Té.ƘÌ÷#™®X«ÿ\pdœO'z{Ãó‰]]] ?ýéO­·ttt ãçªå8©$‹ÎµèÝv’|’ù3­ä‹N Y-á”QÌ€&k¥+"è^ÍÍ-žçuvv†g!›››×¯_âĉ3fÄx®­,jäA×Âv„v´ÂÕ±’¤£*´«;d¼à¬IWU… Itvv¶4·´´´D,ó°ìy|Õ@Æ Ñtåz"©Öx•”­’2_Ë^]4×xN€¶¡xñ3^ÖM|úÑÖýŒDôÓŸþtÓ¦×755uvvÞtÓMá_ùÊW‚@udYt%¥¯>pã„ë¹Ú–“¯ò¥è5^RJÎ3ݨª¬ÅÏx!ðH4õW»ã8RJ=ÕHDŒ9R’Š·ÌhÌœPÓˆ5.`á*‘‹Ó­÷]Ì7Ï$vuuUWWWUUÕÖÖvvvÚFD[·nñ¼Àu])-—fÆ:ÖÀ+¬(Ðä¥ãžÌÅõÂÏŽ©JÚú¾ïû>×ÀyÓ××g-$ÑÔÔLDuuõ£££ÝÝÝÖ{ÛÛÛ‡†^µ³Èx$Z¾ï;Ž#%ã$uõÎ|zJ1AÌQí¥-ãUA(ýcŠ_@Ue¼úûûׯ_¿hÑ¢’– õõ—%¢ºÚÚÎÎÎmÛ¶…;ìèèø÷ûRsc³=OÇr¥5yd¼oxÐESù¾­TKŸif¼‚¢ƒƒ<ÏS‡d—»·2^p6 ²ŒÝÙÙYWW«>766E¬¯:5tî†w~!ãhfÆ‹D`Ô2È­©g\ª_T{sq}¸ä‚=7ÃC‹½Ê#¦ ¨öõ[ ItwwŒŒ¤ÜT6›%¢ÚÚšr˼:::ª««FF†Óé*c4~I3a[oVp>2(~9 •ÙR=«#ƒÌë¾ï[+¯–ƒŒœ5™l¶ººÚºÀ«¡¡Aÿ¶¡¾aÏž=ÖÓ²‰¨££ãÔðð¹äy„À ÑtÁ½ºKŸc£ÛX«‰ª6%¸Áì-‚ŒTÒòÔ©SåæÌ‘ÔÖÖFÌ6^á‰þÖ*þK™o§ÿi¾¬>,hRç/8‹m…$ˆ¨³³³¶¦Ö¼ÒPß1Û8<| "რIDATêŒîüÃ/€DcŒ¹Üqgœ ’ÌXÆÄˆå63²ü¦<³²¨fÍÊ8܉h&óû­ùœ’"®z@§†‡Ã ¼{zz^wñ&óbmC]¹ÀkÆ Õ5ÕcÙ±ÚÚÚüJ‡J¢°²J¿²9]ÏLoW䯷©Ð»Ò¾«±$a¦jª©+j¥—*o[1q¨ ðH:ý7}Äßí®›û;ÙO  [4f^Q§CF4?îÔ©SóçÏ·’pçÅöš}ßï?ÙWîu:::ºººêkëÊ5`ÆðìW(Þ.` XMz[å£1õAMÚFß«!ð€³£`àÞóáë6lxð¡‡&ÕÕÖ­[ö³ŸÍ™3ç, -)x$ã8*ÃCÕJIgbò 3)eŸ,ÓC¹fÑŠ2^Ãö•õ‹- §Á¢©õõá,TáôÉJ *±‹>PH?f •âR“ŒÖÀ1ÜóÙóÉâÝy¡—c•×O®‚FÄä©>%“ˆTàež›©Þ ‹ë’/€äò}ßó<—;ê̵¸žÌê GÞLzªQ‹¿|þì²g‰„>á'j{JOÌG—”ПUBK×­¢ºÓKì=ÏCÆ YñH®L&“ÉdÜšÚ\–%_AÕ/`Œé…Púœfû!Ù‘Ù#«˜K²â d.ë^)Of *^­WæT8${²;ó}Ëm2`ŒqÎtL§»FGGcV”@à\RÊžžž Ö®“¹Mt¹²^œó\øÂrçêÐÊ­8T!L±Ü’Ÿ»Œn}´¢I×Ö¯9QG+êf cÄFfÀÄK¾µ†eË•åÖ×Ëü]Ž#„H¥RRJ×uS©Ô¾}û†‡OŒ G½T/€ä=xð Ÿõ–.]ÚÐÐÀxaWc!ò`–C•R*$ÉŒV–º£±Ïø9½{&uoôyÞ1O˦PˆVÒ­ëºê‡?66vàÀƒz^6Îð@’¹®;11qâDo¿ã8ÜuâI·ŠýØSY"ÍâFrúg°~ßVakõô­•º"Æ)J&gBµ¬>‚ NŒ?l^É•Íf‰hx4Ö4$v5L^SÀAà0ExL^SÀA/€¤K§R®ã¦R)}%w€q>£°Õ.e”?Ñ^Ú4ÿ­Ñmá;[ÕŠì”kOD2È=®Ò)¥GýXáKË‘AœEÕÈŒoïlþK^ÓìÊc¬¦ªÚó¼ $#ß÷=ÏsÇ÷ýÈ÷"BàpŽã¬Y½¦½½½¥¥¥ººZ]4BÜÍ:L*8ò±M.`*'xÅ¿W×Ü}t%>+ÄIÖ@Ó¬£/¢jÓ‡;ŒŒjÆcŽË›O§Ó}}}ÏìéúùcÕÔÖ öG%N8hž/H"¢´› ‚ ¶¶vË–-÷?ð@MMÍøøxÅÁ ðH®ÆÆÆöööžžžááát:A¸NÆDôc|Ëí“•'Îb<®@£ùk–×)´?ƒ“‹Yæ. ™³ÂS,s—%mcÄ&iÜ—RNLLŒŒŒlÚ´©kÏžcGÇ /€äjnn®ªªðú¥”Ö%D:ꪦèxËXÅ:µº¤ëÈ/£fè¬1 £ÒXÇìCg°l!‘å/†g*‹ÞWÏÌê Æ—?L!|×u™$âÎèèðøøhÛ¢G*wKÔ˜àAÆ ¹Òé´ZÄ]__ïû¾Ú˜ÏÇp"‘ßÞÈŠ¦Ã4^ؽ—ûÅ–Ë‘¶É8vó€ö¼T~b¥T–¥YøíІªçL‹gËÝK¶=›\F½¯îÁ÷ýt:ÍfSŽãe2j3£ëº•¶j柧œ9d¼’+“ÉH)9çBµÿN¥¸ˆˆsF$s) ™K¦˜©³¬•úEØ3U¶4˜Q(+Â$JQD¶42F–ä\á3ËJ–Äžuù|™Wçžìï[’0ãy~† éËÀqxÆÏz^ÆadÝ÷†À ¹\×õ}_áyùB2E _xRJ&‰1ƈë²ÖøÁºÑZ Kã¶%òÑ+ßÃ+Š„xébQaR¿tBÐ@aüù2§f Ã„íq¡áGY%h£Pà%©¹]F$<_)%‚ljè\ÃT#ÀAÆ ¹¤”AæÏ¥[¤¤ ¢\Æ«L¯èO™b÷ù‹ö¢Q·„ójÅs±:)Sl"Vå}k>/ædh¹V%;ÌnE^üùV^¯<+W­Ú~ëvëWüÀÇFG§v8/€äêíí ‚ Çq¤ZÒEDDAàÑÞ½{»žébŒÌ’¥ããzýSÌŒWኙ1ŠÌxE³æ¥týÒ˜ç±Ég¼¬‹©âD¹5^ÆóU>R¥$c&½x¼Rýæ7¿ùö=÷”L5ž½“vàìCàhz—Y(UŠ|­!¨øÈ )åk^óš¿ýû¿ûÊþç¾ÿ³«ºí¶Y³gÝø¡‚ X¼d±›Jýö·¿¥2±Zyzôig¼*¤¯DaTg²Æ+æ)CRTXËe¼°Æ àwBmmíœÖV"b,·6ÜËfOž<ÙÕÕ580ØqùåfàÕ:·uÅÊß»ï{j"òŸø›†Æ†?üÃ?a¦™™½æ©èb¼ìWô¢«3ÉxÅ\8ãeÕ¬uËJž"¥4Na*llŒ¾Ñ„À à•êÉ'ŸüÉîÝRcĈÑðȈúj÷îŸl½öÚ˯¸üî¯ÞMDŒ±öŽŽîîîîînÕàCüPtU8x$ZÉ/uQ¥i>üÈè+%9¡žîî}ûöµ··ßýÕ»¥”«W¯ž5kÖÝu—™ž ïû³&·ŠzŽÞ&úÖÚa™*_¡žcg¼ìƒ‰èÙ:ÔÈS® 탢uXãðª¢þj‚@JÉ¥”œ‘姺ˆˆ1žðÚõЮÿäÆu¬ëz¦«ãò!Äî]»}ß× bf¼N'è‰,¯óÞŠõ¢1é#ƒl3†ÖÐм¨ÿhb¾Ž xuúig§ïûW\ye:Þ|é¥O?ýôÀÀÀùÔï:d¼M•èäœK)I ’œ©ä‹J·è÷%7ö÷÷ÿòÉ_^rÉ%¿zöÙÚÚÚxP7&¢¥K—:)÷Å_¤ÉT% ;[ù0[»¨/Í•}ùü$óyE§n¿TÉO¸$ã5©Âi¼^©V­ZõÞëÞ«–ÕË|œòÀôìSŸzðÁ׿áõ7Üxãèèè/{̼wûÿ¾µ±±ñïxÇùw/€DBxOœqîJ.„L²@D´víÚµk×–´æ™gtàõäã744Üÿ£ûÙ,'’:Q¤Î~ÔÙÛùeï¶,QtFÇLÿDWdd~SaõV!k%ePzƒ}AÏ?סNŽ¢´¡h /M’YShú3“¹zÄ™B >¨es13¼^yž{î¹·¼å-ùˆ3rÏ.æštß÷ÿðÝ¿oíá}×ý?çz†À Ñdž‚(·¢HU4(¬:"FÒxÅ\|¤S=%çáLv¨/ÆØÕo»æš«ßº°m!õôô|ÿû?øÑ~h00pËÍqàÀAbbáÂ…Ÿÿü?_uÕUO<ñÄ®]»*Ëú\[YÔȃ®…ííh…7’ù#ƒˆ•$U¡µXÝ¡Žœkï½î:"ºóί8pP]9pàÀþç]DôÞ÷¾÷|ŽlÊ!ãhºr=‘Tk¼JÊVÉ\öÆ’ñ2N€¶¡xñ3^ÖM|Ösµ.\¸`ÁßóvízȲúÞ]»vÝ|óG/^<{vë‘#Gl‰.Ë¢+)s•÷¹qÂõ\íð+ËÉWùRô/)%gŽ™nTUÖâg¼x$šú«Ýq)¥žj$"Æ)IÅ+f4fN¨é@İp‰ÈÅéÖ{‹.Ú¯¥K—ÑËû÷OLL˜ßŽŽŽöôô,Y²dÙ²¥‡ wh+0Q`Æ:ÖÀËò"æ#xéã"‚'sq½ð¥z¢*iëû¾ïûñ×cªΡֹ­DtüøñðW'Nœ ¢9sæLõ˜Îd¼-ß÷Ç‘’q’ºzg>=%ˆˆ˜ æ¨öÒ–ñª ”þ1Å/ ^ï.¥¬®®&¢ñ±±ÀË–|;6:FD5Õ5·&·l)(–»(­É#ã}Ã.šjÌ÷m- ZúL3ãôÿ·w¿±rTçÇŸsföú^cH;86q몜¨8ÐÐN%¬¢­¢(o¢Z$@$¼ƒ6øMZ…4RÔHòG!­”ª\“)AJëJQ#‡–€ÔªäÏ­|m‚­æÚà»wïÎÌ鋳{æìÎÙ³³¾xðYZZZ\\|úé§/õКFá@Û%IbóêV:Hb†J…N¸Â¤Ãâ‚§T/hŒY\\\\\Õ¬w,wŸœP¹Ä.¾¡P`ߤ(q͸§*@ëxÐvv‘1F‹©‘YGñÈ%8 ªšçHÍ¡6º®ÛŠ"®¼Ž;E†:²Q`¨Á¸_&¾eÈð×#Óêmh9wüv5À‘xÐjEQ”«‡+éìGþ#Ä’›`Re¢1Y|Uc<ñ ]¶"r╽sƒó½j&^îÓ©“Æëò²ö”j{Õ/€†xÐjÆ×)Êý¿?»Ë£‚³¸¢T4ã ¬ UìÊ¡è+¡EÄï«’4~dhXñ„oʯ½„ÌÎô²/j €Ä  1$^´šK¼Üb:ûÂï;¥fipåh[„x=½âT2cÜŠ‘‚ûÕÜ%)ø…¼ß-öiùZ+û7¢µ.ŠÂn’]U#…mg /­µÝÐu7ðÅ'‰[}ºmã“âƒ{Õ,ïFnW9¥þºxçˆÀ"ƒdÊ/“W? ¬fÐã1y87ˆG !ñ Õ\Ü¥”ÒibŒ¥´ÒR£D)eŸ9&&6¾PƒH&¼Ã{êÑ0rÁzU¿ùiY^y¼˜ŽFw®ªLÙÃ;I*M7$ô@°ìG[Þ®ò Þ1vÃà9£R’¦©Ö©Ru× x4„Ä €VsS¹ED{$”V…T¦~Oßê§þ)5ge…Û«Ö›ã߬ºì:lô¾¾»Qä+'I*Ãí½ýE±A{H¼Bâ@«¹-ƒD½ ìûʈ$e#" S\Œt‰×FzLŒ? 4k(çZÕ½ö¬£º°c%ìì.©ì;^óâ$^ !ñ ÕŠ¢p;d–1Úi^Ã5ƒÃ¬%š¸Tz¥ÊƦ…MíøºblTÕ§m¡=sâ5zzÝ»Göeþàn§Y¨’x4„Ä €¶K’Äæ^FLÙ¹~4%ŠïxmT ’©¿²¯Î¹S™Êuý g•|­PS¯Zã/çÌ…V2ªÀ]´ ÛÖ» ̽˜ŠÂ €öZXX‘4M³,SJéÊ<î²Dˆ×µ7p¬^ùí2ë.C#ÅVåË©é“ëgë yxêvÉ[xùûfÚïÅäz€v!ñ ½²,ë÷û©N’$;¹^üͪË-of~ÔèÔŸ>ÿö §D…Ûá'6€D×Ý¥§æ­ÇÚF¸×6Ðr}k‹¢ŒîÜû~¿OâÐ.$^´W¯×ëõzéÂæAÊ2ì¿`û(¥ÜD(·Osx“ìhzTsJV}¹¤nÕ™òâGPõz½ªdÊ&Ù³&vþ÷´È@)¥µr˜‹»ÎŸ?¿¾¾^ç.^´W–eËËË×_{,¢´õÒZÊ5Ø7ЕVÁj%‘)eJà”á³Ëøañ­}®·þ”’(‰m­è^ø­³¼ÚÈ/˜ôاÁ²lj»²Áüz3<+IŠ¢èt:Ƙ4M;ÎÒÒÒÙ³+«««±/5Dá@{u»Ýååål½¿wïÞ­[·*]®j,+5e:Ô$ñH© ɼ£}Gkïñsa;öÌtn|?ïš»eK¥D»lš¦öÇ_]]=qâÄÉ“'××{u†'^´™Öº×ë:}úÌ™3I’è4©ß$=¨~õ޲ŠJ5ã½Q·’s·ØÀüýP‡­úé;uE¦e¸K¦VEQØiõyžçy~îÜJýaSxÐ^yž‹Èjwuµ[ëIZŽU ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ ¡ðh…@C(¼BáÐ /€†Px4„  !^ I/õÀsNš¤NǽcŒ1Æ(•¸?*p¢’bðB…>vŸz—-?3SÜu‚ôO¯fòÁí´Žç>ºÎ-2ST©éV¾SýÊþ/8ö5ýKeE®”ZØ4ßï÷ó<7J²,ë÷ûI’dYý^"^´\’$ïÿÝ÷!œt®„Öljû¾î Y–ÍÍÍ­¯¯w’¤ßëÙÅŒišN[ª9¼Kƒ°q$^´W¯×3Æh­‹¢°ëïlÄ%"Z+3xSr1ƒ0Årü¶Vö?E8© Å`^£¬ˆZQDô£@8W¾VƒQy Ø NŸŸð•«ÙSøûŽf:‘~ÖS…ÉLž$º—­÷û½DIpÝC…핦i–eEQôû}É £,SdEߣŒ(¥”h×!X?0[a9:4E>>ó½z»‘JH?CiLš?ôPŽØæÔ/tTº]eøñ1(Ú¤Rx™Bì³]%Rô³¢0ƨ¢$I"wxÔÐ/ÚË“çyùœQéAÜbŠÜ"2H¼&4ñŠg<šÝñœöshIDATß 7…ˆRÍÕFŸýպȄfµ:ïó¼šC'5ְÿl1Tÿy+‰@CH¼h¯W_}5Ïó<Ï“$1vJ—ˆØÖ Z•s¼B“Ê¥vâ>7šxÅs)׿´æ¾CjöÄ+x»š¦nA4˜ãåÝßæ‘6’¬z‘x4„Ä €Vss¼üF©F å"0¿ê ­Mõø”¬‘ûFw¾ÕÄkJ|U”£ÚÈ¯š» ™bJd5)ñbŽ@‘xÐj6Pq‰— rAâe7 ò§yÕß[ºšñøçº9O#oÖK¿â“®6’xÕ¿]5ñ ΄s/‚}ËÆîbŒñva*6ÆOô‘x4„Ä €V›ã5|Û˜ÂØÄKDF? o]Y÷ ·F®_&Yù4xÁ ]¾*W®x…¹rp¨Ñ]®Ëãó‘u³Îñ¢ð Õì?íyžc´1fð¨kÐNÂV'J©™xYñ-ƒœ )zj?;µ¿Cü3oúƒ¥áHñ:ü«©ùíxÔÐ/ZͶèÔZcĈb´Ý3¨(ŠÂ6P•Úã3¡ú]I㬩èQ~@ž>?cž7²ëöè—û…ǯúÏ…Ä  1$^´ZQý<­´N¶)—3ìn "F+I”6þÔ¨j¾bü È½é¦½‡R¢úYãr3N9Är0Æäã'„ã!=¼¯7BŽåÅøqž‘9\z<$ Fhîµ2ƒ~¢UQ¶‡}‘e™ÔNþH¼Bâ@«™¡¢(D3ŠlGƒrÖ‘(1Ä«æä#õŒí‡3ëP§ô u¹š¸pË¡f]•Z„rÙ+ud‰¢T`ŽWyAw)¥Ìð:F¹Žµîï…-ƒZ‡Ä €V³¢’$²¸¬Å­¶3’‰îií…/. -ÕȨæJ@_¼ êÈ®Õ.èRîÎ…ˆ|ó›ßܳgϳÏ>û…/|a¸‚÷ µEnt]„¶ÐŽ+Ç_NªSc¡£m´Vër^`ƒ¶mÛöñüæ›oÞ¹s§ˆœzåÔ~ô£üîwWWWëœÞívEdeeÅþñ³Ÿ}èŽ;þèäÉ“wÝu×Eò%Cá@«¹Îõ"ÆÎñk[ḛ—½}ÓŸãUî`* ñê'^n ;wîüÊW¾²cÇY__×Zï¹fÏžkö|ä?òÀý¬¼ñ†;¥p#½ïÍ7ÿÁÚZwûöí{÷î‘7ÞX‘n·œteL6øFÞ?Á}µ+:gïò嬆‰—V‰7Ú.kõ/æxÐjîŸv·iãpëFU¶g^™›ƒŸ›ÂýÏÉBÿsªÇûò¨‡zhÇŽƘ{ï½wË–-[·n=|ø°ˆ\}õÕŸ¾ïÓö˜§Ÿú×;zÿý÷Ù>úè_=ú/_ûÚßÙë?ÿüv»Ý¯ýëÆ¨o|㛟üä'Edß¾}G=zôèG?úÑÑo].5ØSÿšîo!Ë2ÿo$˲,˘\.ºíÛ·ßxã"räÈ‘þð‡¿ãM~ï†'¾ýıcÇDäàÁƒ›6m‘õ~_DVVé×¹sçDduõ¼ýãÚÚš{ó¹ç~òë_ÿÚ¾yìØ±cÇŽ?~¼ñ¯uñ¨€V³±J’$Æ(-¦vï6‹(DDT!*±Ç¤/ÑÉæ%{ð‰sì¤.yñÅwìØaŸ¸]}ÕUÿñÜs7ÝtÓÜÜÜöíÛOœ81Kžçýuÿô"+&cò~ö™?óù¿úü=÷ܳ¼¼|è–C"²ëꫯ¼òÊòœáÄ| .勸‡Ïƒ TÇøí$Š|dã ~¿o7Éžtî /pz½ž}177ç¿ßé þØÏ2ïíéóª~û·öÍoš¥Ôþ믛†Ù"^´šŸxI‘{½ sê•6ö?öxr}µåB8›&^þ”ó`3Ò1KKKöÅþýû]ÕÜ "kkkÇOìöÞ"¢d}}]D¶nÝj³u›ýÔéõúþ××½¢MùœˆHšïwpoT¿„M¶ì•í–AþûvÊW­kM@-+++G‘Ûo¿ýŽ;îÐZÏÍÍ}êîOÝpà "òä“OÚòÆÎßÚµk—ˆ\~ùå7ÝtSäšý¬/"—]vÙÅü%Aâ@«¹5tƨdtóærË  ñTuçæ`¿Óx¶™ÀÔét|ðÁgžyæ=ïyÏáÇyä¥Tš¦"òüóÏ?ö×½óï‘£GîÛ·ïöÛoß¹sç®]»6oÞžýãÒ/ÿWD®ºêªü§ï¾ùæ[ñð#§NlAmÆO»u’{3ôMê|©ÊIÆÿ©ýÓgÝ/HH¼ÀFc>ô¡}ñ‹_|饗ò<·U×SO=uèС+.¿Üó¥ÇÿÞ÷¾·¶¶¶k×®o}ë[‹‹‹‘ 9òô‘#GVWWwïÞ}Ýu×*ýU«xÐjJ©T'‰ÒJ«BÌh¨£D‹ÕpQžU*ÁT&ÑIä0#±<Ì…L›ç:ïÚñå¿ùòáGí­¯âŸxòÉ'o½õÖÛn½í—¿ø…=fë–­wýé]gÏM’ä];ÞÕí®}ìc»ì²ËÞݵ"ràÀn·»}ûökö¾OD6o™¿ûî»Ïž=k—^¿ÿü¼‘ñ¡JQάr_ÙÆÜAn¹¢ö>íT¾{n«ÕÐà°Æ'Å÷ ªYÞÜ®rJý't!ñÎEÉ”_&¯~XÍ Ç5còsLLl.|¡‘Lð¢ÿ|Ñ¿oà‚õ2ª2~óÓ²¼ò<.x1î\ÿT™²‡w’TšnHè`Ù¶¼]5ä¼cì2†ÁsF¥$MS­S¥ê® ñh‰­æ¦r‹ˆöI(­ ©Lýž ¾ÕOýSjÎÊ ·W­7Ç+¾YuÙ"tØè}/|w£ÈWN’ÔàbH¨´‰­æ¶ ô2°ï+#v’”ˆt4Lq1Ò$^é11züx,4Ò¬¡œkU÷Ú³ŽêÂdŒu”°³»¤²ïxÍ‹“x4„Ä €V+ŠÂí=XÆh§y × ³–hâRé•*›6µãW花QU?œ¶…ö̉×èéuwìÙ—iøƒ»Mœfm JâÐ/Ú.I›{1eçúÑ”(¾ãµQH¦þʾ:çNe*Ôõ'œUòµBMM¼j¿œ3ZɨwÑ2l[ï20÷b* /ÚkaaADÒ4ͲL)¥+ó¸Ë!^gÔÞÀ±zå·Ë¬» [•/§¦O®Ÿ­ƒFäá©Û%SDláåï›i¿“ëÚ…Ä €öʲ¬ßï§:I’DDìäzñ7«.·¼™ùQ£SúüÛ+œn‡ŸØ]w—žš·ká^Û@Ëõ­-Š2ºsSìûý>‰@»xÐ^½^¯×ë¥ ›)˰ÿ‚í_ ”r¡Ü>ÍáM²£éQPÍ)YõåfºUgÊ‹AÕëõª’)›dÏšØùßwÒ"¥”ÖÊe`.î:þüúúz»PxÐ^Y–-//_íuf°ˆnÐÖKk=(_Ô`ß@WZ«•D¦”)S†Ï.ã‡Å·Vô¹ÞúSJ¢$¶µ¢{á·Îòj#¿`ÒcŸ˲©íÊóëÍð¬$)Š¢ÓécÒ4ít:KKKgÏ®¬®®Æ¾Ô…íÕív———³õþÞ½{·nݪt¹ª±¬<Ô”éP“Ä#¥2$óŽ ô­½ÇÏ…íØ3Ó¹ñý¼kî–-•mì²išÚuuõĉ'Ož\_ïÕžPxÐfZë^¯wêôé3gÎ$I¢Ó¤~“ô úÕO8Ê**ÕŒ÷FÝJÎÝbó÷C¶fè§ìÔ˜–á.™ZEa§Õçyžçù¹s+õ‡Má@{åy."«ÝÕÕn­'Yh9V54„  !^ ¡ðh…@C(¼BáБ>^¯¿öê¥Ào</€† ¯_½|òÒŽà7žzàÓ÷^ê1ü¿ðÈ,×§E¶„IEND®B`‚src/000077500000000000000000000000001225012771600351245ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/docdeclarative-camera.qdoc000066400000000000000000000054621225012771600415140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example declarative-camera \title QML Camera Example \ingroup multimedia_examples \brief The Camera Example shows how to use the API to capture a still image or video. \image qml-camera.png This example demonstrates how to use the Qt Multimedia QML API to access camera functions. It shows how to change settings and to capture images. Most of the QML code supports the user interface for this application with the camera types being mostly found in \e {declarative-camera.qml} and \e {CaptureControls.qml}. In \e {declarative-camera.qml} the \l Camera is initialized with an id of \e {camera}, a photo preview is setup, states are implemented for image preview or capture and \l CaptureControls is initialized. The initial \e state is \e PhotoCapture. \l CameraCapture includes a handler, \e onImageCaptured, for the \l {imageCaptured} signal. The handler sets up the application to process the preview including a change in the user interface state. The \l PhotoPreview becomes visible with any key press being picked up by the handler in PhotoPreview and returning the state to \e PhotoCapture. \e CaptureControls, which is implemented in \e {CaptureControls.qml}, generates a column on the right hand side of the screen which includes control buttons for \e focus (not initially visible), \e {capture}, \e {flash modes}, \e {white balance}, \e {exposure compensation}, and if a preview is available a \e {preview} button. The last button exits from the application. When the Capture button is pressed the \e onClicked handler calls \l {Camera::captureImage()}{captureImage()} */ images/000077500000000000000000000000001225012771600350355ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-cameracamera_auto_mode.png000066400000000000000000000014121225012771600410250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<¬IDATxÚìZÑ‘‚0Eæþ¡è;€¤J°K`®¯´° 謀c1Îà I6°sgPg”˜—}o÷%ºéºÎxç07€Õ4 ºÂ믆D^)Å)Äûý¾Ã†eY0¸³%…‚>T><<½ …¬ÛPøˆãO^%¡ïûªé"É€ C¥¶Û­á8ŽÍÄ¿:€P…ÿ”Y àÁJо+îêgYf´m+® €ËÿÓé4€à…뺠xé¯ÀÕ˜|Qzi´°ì<Ï›¬óMÓ –¡/¯Â~$‰ÔVè´ÇÃá09±4Máæ\Öàî@×jd\þ3îÃC-ÒmÛFŸÅ!›ÏÖ€×2—W>G2:0u¬>Äår§â†%Ó'äHŽÇã$¯ó<‡«Q¦¤æŽéÀz¦„ ŒÑ¢¼^¯m]×ÂÁ˜ žE!(ŸC#B¨„¤Qø,ÂÍ ›ìX¹ú„Ÿ! %fBªB‘}_ÔW'{‰¿‡ñ€oÊÁ¿ëŒ©2LUF•¯æFOÓP•Qåëg”h[¡@ùðj!€€Z Ød^DQ„=Vïx6„WŽ)($=¼b%Vm#¹~d m´Íô©($ì¾pxU–CÙ¾ ÆÊ°ý£“‚ÿÿc̱J:@hÀ’9Iøe¦ÿÌAA§•HOt`-Õ@|^eµCƒïÃl31„öA‘ÿô4BPH˜nÌÑ §ªI;òýto©•¨µ}?£_UȾ‘Šæ·ùüWâàŸø`yåÏ´Ï­’IEND®B`‚camera_camera_setting.png000066400000000000000000000013151225012771600420400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<oIDATxÚìšñu‚0Æ¡¯ÿãtF€ tÜ€èÔ `tÚ °¤ùèѧÔBH8ÀW¿÷î©!¿p—»Dm!„uÏz²î\€¥õÜm°m[å{®´½´—Nû»´BÚ›´OŽwcÖþÕ ‡a¸ßívWÇãÑ*ŠÂ:øøJœMÃ¥)*tG”e)n©ª*DZÀ9òÜDš3%ÀU5 ´¢‘O ­¤ykP‚€’$Á…aÑÚ”!pœ\*Z€D¸6eˆ,Ëp“Z7°9”!(°c.ŒL†ÎhŽÒ ŽÑS`@’QáC© Qbæéł˥iÚÜDç69 O¾ïãÚ>@.õs# ˆß’çy|˜).5‡k ¾ø¾‘ÐqO¥@Ó•J…ºu¿¡|@åKGâ[êU;m·[A³ € 7øK·6»n×'×uµK ÕDVö&AÀš÷u]‹1µ)x\Fi¨$Ûñ) Æ”ÕO›èBŒh¦DÓNN 1¶˜Kp¸5B§-U2ë\:Κ t×  0•2sv2YÐ8´EÒÌý—Ó(^Q"Ã"ð7\S¬È\É© k-§vT˜%÷’òÊå8 æ`ƒ˜€bn€É hw/ïöwŽß°ÍœN§cÖù|ÖºÈf³ÁËyx^å“Ñ“h×K¸1¹OµDC óÓ’¿e£í—d‰<` òût‰LlqñóT<÷î´ŠAõœ£å†HÉü1 ûñ_‰À?ø`8£ø¬‰t€gIEND®B`‚camera_flash_auto.png000066400000000000000000000021371225012771600412030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<IDATxÚìZáqª@ÆLþkÚ¦´µ´I¼4¨h˜ $+@+àíG–÷ÈqwÜ!1f&;sƒãØ=¾ýö»#­4MŸlη߾ÛÅ­V«égŒ©ùý&Ô.º²|m‰'¿ €x¹\öƒôâù|v¦Ó)~ö¨lÈN[Ó³ßívSA€‡îL}ÍüýâBš}mú¹÷@·Ýn§I’(_¯×x`l:à­Xzž§}×uñ@ïhSKâ8V:<ñ°„ûÞ]fWgx;xK6ƒÞ2€øVòþ Oî1·IêüŽvp°)ê¼u€D£ÔYÀc {Škgj3JN§Óé(Øl68üi*ÙlµPBì"õîõõ5 ‚è±£Ò=Q9OOO¹p;[ú‘¯—J5ª±>a·s8¤‡Ã!„™Òyî¥ ÀϽç|oooxð蚆pRs1{Î|ßÏš­á àÝ(1tì¢ãö0 Ó~¿Ÿ6m h* àZÒJƒôãf-Õ1f­PÅB¦I üGïïÿßâ~¿w&“ɧNÀ?Z¯×³Á¥£ƒ&Æ:N3ú¹•Mðc]ü¯V«Rèóòò‚d;Œ 6óÅ1Ĥ'ç1k[ãâ`‚ÿ\ˈpÙívÿ^w‚o<c¼ ‰Jœñ„Å9"íjÁ‡çñXík(‰3c©Ló€‰ tN¥à[,g]%%êàõ¢e¨s!VŒ9#Ó.–+k$[˜‹¯šyÙÃQG{W ¾°)5ú ÿŒÍDU„ë2 ªÖÊ,·½&(aU`š+è« "ÖÃºŠ®’Ûur`(ò4ã>ÿó¡T€sNæb  fu‚õi&¹·k´7j˜À¹×‘*‘©RûtôeÂL—¼hä„%wfPTФj´ B¥dcn^rYË©ÚÔ25@4' Û™Kœ^Z]÷;U»Í9D0ÛL‡µ ÷ÎçóŽ[[ PLêË€´jo´‚J“"ز”aL ŽÓG8a;oz%"“ÙÊi`ø„ðJ‹’º(yÅÊŠäFèì†÷ø[Ç>…íl·Ûˆ“øT÷û€+[]qb“%r¡?ÄØµA—Ըƛ½GÕ~© „JøçÍØØfµÆ¹ÏZµä„ó,wºÍ^›B6ùŸù>R¯=ª‚–4§…y$B uýèèjZõÌBmÿsb-TúFÆX, ŽÂ¶{œ3S^/Lw©MëÀ€ðêˆÁä (öŒŠ™‹Ù •µöòÎñuyóøÔÀÖ9 —òŒ>WNù%0$ß÷½Ý ¼î ÉιõÞ3¿WQ»®ÛL~Ç›úŒ€¨ëÚ«¾Ñ9ë2À`Œ Q£¦À#Ô7¹;c€^)µ™ü4M–1­þ5C‚[À=êŸ`¤”¡êsj˜×â P¿?ʤh¦/Pà{Õ?àj|ꣵ¦¨$€ ± N}AÀkÚœú)–CdÚR£m[|¡<`ôÙ†ÔXš¾ÜA¦-5–¦/7@w’úwÛ‘@'¦×v<›¾34¾0¾ß+ËM Æv˜RKÊ$õ×,7€ Û±fú(¨õ95€ ½"­õªé+ cú85aú†RKJ¾µ¡þÚ‡ ø†aÈj'𫹢VgL!‘Âô}!tÚÖb*Z©óAã<š"»Ó{!ð™¦in­”•ìB¾»î2°£}›ïTÚ¨š>Û¼°èb-…ó`<ï:†å|§v#{ ùîz¿ 9è(m% [-’âÓêö; \‹œ|S& ò%YUÕ^GúãÏã7 4*ûù¯Äàü 01“ ‰â'–ÙIEND®B`‚camera_flash_off.png000066400000000000000000000013151225012771600410020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<oIDATxÚìšýmƒ0ÅCÕÿéŒÀ!#0BFðŒÀŒÀŒ€:Gps‘9‰±ïìçªQs’U)äý‡ý m¬µ‡W®Ã‹×Ë|>¾Ð4Í_ÐÕžÇ×y|?¾ñÔòô‚?2KÑ¡˜£gˆ_ÏÄ>û¤0k­m¬Œ1¶mÛÀE|ß÷vG‚¨Б0«išèà GüõXî;w5¦ÓédSÕuu­Æÿ~ƒ@ttÌmÛ8îoRñ!4À4 ×ý!GüõúqÇ‘ôã¦À}¶xú ™…n!Íq_)r?K<àâþ²,Qñô~ÀýlñHMÎ2Ý×(ñH®ûƉ†ˆG ÷Ç£ï>D< `£™%V43yîÃÄ#šSE³ÍÙhñ®û·!ï*-¤8îû¢¸âýõ„R-¥ÛKÊýRñ^äVhʼnÌ%♑;€µa)ψÜEg»X">¹«îÈDSå^ŒDîªñó<³ÜG@ÄG"wU˜ø@è«¿¹«@ůë*r¿@$ž>fèÓ’ /@š*mjáóB_W@,ž;œû{cE@{>UtVœ 4ú«âi1sItD´H‚Þ÷WéâU²Ü ¸÷mBô×µÌt(¬œ•¸w§\úã#‰vëØy¿VÊ=å£dŠÌhÞÿ+ñøç? =4sŽ¡âIEND®B`‚camera_flash_redeye.png000066400000000000000000000016611225012771600415110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<SIDATxÚìXáÍÚ0 UÿÀA,6 Â|¤Ld„Ð BÅ øO˜Ò R¿ÔW]Ülé’O:ìØwïü|>§W…óÎòÍys±, À°, à+å»ÚÐëõÚÌç í (}G¡Wùüõªµvëý×`àChõ¼#èVŽá+‡ß¾ïÃDJktD0Ê Âq„&IRqŽâ}1î 4Õà8w4‹!Pbœ×€FH` уãˆ*ôIÇ£š(†p Ž«`„·#8-ÆÌÚ¨8‰á J#é|ødÔðÙlVY ŒðU!&Uiu‚~ù§©w0ÜÕ=Bôž)KH‘óuFI@ƒ¦Í§î)•Jj Èö ËÔ­ !~ë8>lVƒóÈå«û |‘ A €‹ Ê9ßä<3ÕÒFþh­ú[WÌå§Ó)ǃ£_Gú}”>ΨË"-‚Ò>ù€CRÖRZÙˆu)Tü˜ø7£ùQ6iŸÈ‘˜f¡”&@ÚÃ&}” ²®ñ5¤ê¢¦jJµø/¶SeÎ&§iâ(Šj #[pC >ÚÀ”F¹M™¼W²Oy€Õ¨‹ Þ“ ü¦’D¥#ÕA õÕ9ÿj)Q‚à‘‡AP¦®¢I¦½Hê À0wžÏÃÂáuUÌý‹ßäU—Ü ôá?)HT•Ô1hkªHÛÞ‘µpzŠûê{’ív[Þî‚ej­ægÑŽ1H‘¸Ðxºl6›ëívûlº¥uu#ÇSDK¥PÝænêÃÊIºh„m(ôhEbl6ºÌ49 þƒ2pZi‰Éu² =ȯ#±1+_%Îç3è“t'¿Làù»ó¯öÖ`X€`XÀûÈÞÄEÔ^x·üIEND®B`‚camera_white_balance_cloudy.png000066400000000000000000000011611225012771600432160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<IDATxÚì˜ëmƒ0…MÕÿ°l@6 À°l@7€N tØ:É \ŸÈ©RÚª6 /ÉGºRáø³}}Ö(¥dËz"—P @(€»ô<¼¡išl: ‡1xV±(X|<ªÃëý¸!³ˆÇ1<Ï#»ÝîëAß÷¤ª*’ç99ŸÏ »õÂâýÑ—·!1êµmÛ´,KúŸ²,£¦i¢ñ’…y/À·þޏtÞ÷}*£®ëh†øƒŽ…³$@æº.+ÌúÁ"äeè‹B û+›ý¾m[bYÖèeÐ4 ‰¢èÒ׈ÓéÔó\y*|–°t*!Ÿx®d¢3 [¬ý~?ÙžŽ¶1º®ìÒÝd!3 ƒ¤iŠŸéf+q„-%$™ýh€#¦x¡0òê.g%þJÞ«]Àϵ”ƆïÂÖØ°£Í%ìH¼r.duš$ ]BqS^äFøl+£u]Ó¥t8®Û—@µíDLÚËy !ȵ)…UÀ!Q€v £+ä!ú% @×(|{`)Ý녭ο¶ÍðÏUC Á·ìJ%PE±V€^ X#7‘GQ/ÔÂû¬IüK͵.^˜Ó¼ ø¢ZÖÌ•8YƒàžÈ–ÀTSµá=VÁ‹ÁÂù›³x>UÇë @( ÀŒú`¾N›ÍÔ($dIEND®B`‚camera_white_balance_flourescent.png000066400000000000000000000010521225012771600442470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<ÌIDATxÚì™ámƒ0…¡êF 4&`Ø ê°AFp6`¯ <Ý€ú!s‚ù‘¨÷$+<ãûîð’¸ïûèõ½¹€€€€ôéˆãXè¯÷®_>V´NRÊÓ+FŸçùã hýžÏgÞ À ÀÿடÆ5ªªMMÓ<ôÜn·aXá5×zäÁ@l³hñ»;”èÑ)¥z«$I`Î|~Šž4M‡a…sð¯U†kYa ³ïF€º(Šq!ŒÒó”Y–ù…ïVðÀëÍ•®kaÍ#f™%‚PmÛRNÀà1`ø…JpD! 8â¹ƒŠƒ6áî&€B&™-Ë’Ú\m]×¾G•8g…9˜ë7 ×CUê€!³]×¹™í½Ì¦®ŸÆ“86ñš*¤^z[)Ç“í2KeU¬<8ƒ¯¹àl ®êV€I×X¸_/D×^_$ÑÕ.kûÊíj[°óº[Èì·õ\¯W²c,¨ðæ(s­Y¥°¶ã)öt¡Òd¾] Èœ—O¼DJ3g Ø®[®u¡˜ÿäc```€ýú`«Ù>{¤ÙIEND®B`‚camera_white_balance_incandescent.png000066400000000000000000000011301225012771600443510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<úIDATxÚìZëmÂ0&Uþg²AØ ÍaVh'€Ê¡#¸€l6Èn>dª"¸; ­O²”À½>Ç÷ÈAbŒ™=3½Ìžœ"€à¿HÇ$I"Õ¥ú•y›~½KŒŒ³fêq3Zë…±ª*Vh¸H"×—¿1ˆ#€ ø2F›YÞìQêÙÕuM-¼‘€8ó׀ϲ, — ÙÐê,ËL×ul,t„Ð*¥Œ” ¡ÔóùܸtpžÂØßÔ¡-Η˥sŽívûÑ_¾IÚðd¼ëýûÀŽÚçy~X.´ßï‹Ø†õþV× -~}Ä¢Õûv`ª5x+£¬ÍfãìtPíÙ#ä­ÕEQ81t¸±kíÚ¶;YèY§…Ójµ26ë…{¥¤fÉœØ4A›9…ó+i#†í„uï#tâüщK1ïÀ3%K်àV‡ûõzýë8®-Owä“‚p@5Œ´Øæ@íDªpÀ5¨ ƒ,6)Éniâ$Ž¥[ „Ü18çU3F‰' l3Ö¶¿'ÅŒŒ¡™³P’ §°»BÍÙZ0̽jÃ5 •’i5s]Þ²•ø¾CÛϲ's¡)½¡îfð{[s+#Iü«A<7ý0êÊœZaƒCÿIEND®B`‚camera_white_balance_sunny.png000066400000000000000000000011131225012771600430700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<íIDATxÚìZу0 …ÿ] ÊÀ°#pLÀwtzLä6Hc*\“8 ˆÂ“¬¦4Ä~ÁvR—RêìÎÎqØÞô‚뺦ƾ1ñy»fR˜t³žÅÉ ªª  DZ=-Àh,QQhÛ²÷pA®`Sh‹åÚ‚ºÉ¸]¯WÚ¶-…OIª1 ¥cf¯x¤ýÀBˆ, ½ñ06tÎ%w˜)$!K@il, Ê£C@Vá…I¤hùµ‹æSÕ& R Bà{Y–ƒý}›÷!C?Œñ¦üK"˲g°/~ƒ>XãM˜‘À@ÕxÓž$°P5ÞJ.ú^ß÷7ÍFaE!¯|^þÂ"ZöjHtÜgâF –€'¨¤^z@š¦ÚE‘Ó4Í7k~JtŸUvîtÖYIù;TR2>¬ëÇ]×õ"´¼®¢(îÌÞXTRþÁ¬¬íIXˆ/ž eü¶Å"Ïs*«l{» >ô2Ú¯XÛ`÷nþ&†Õa‹{M¼‰wÌ¡Óé$I6O§w]Ðè–”ºÇ-êw½­ò>[{ÝZ× *k6æ|@¨CwRÙúÆp„6S‰ŸJ%ç1ëÖ°yJYŽlk[JÜó¿'ƒx0šZ5Ÿ+ý¬IEND®B`‚toolbutton.png000066400000000000000000000047661225012771600377710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/images‰PNG  IHDR@*]âbKGDÿÿÿ ½§“ pHYs  šœtIMEÙ  ˜Ž×ªtEXtCommentCreated with GIMPW ^IDAThÞZËndI=y«ÊíöŒºW´dFôPïPo@ò|BÀ°ààF¬áزdV³if7L¯[jÉÍ,,fÜn»\™,òfÞÈW•…%Ë®º·òfž§y|êŽ~¼mްÛíB€[M_®6ë?­V«/!zšfÕjõÇŸþø'8;;ÃÓ§OqttT,ÖN2ƒB隀1žHšdý¾ÈÜ`9~Z4DÍ=%õfågº D„»·X¯×¸¼¼Ä?_ƒ|õŽ¿vŒŸœœœüþÅ‹Ÿÿö׿ÁÅÅ®®®°ÿ‡gF´ µ“pÍâJpÂp´wüxvl"B˜_®§B8>>Æé'?Ä«W¯ð÷/¾ÀÇ=þÝ›Íæó³³3œŸŸãúúëõ!„áò{èÇÿ¹ØiQßý|ž0¹ùÞ0`[ |?1o.ì@ Üîn¡ª¸»»Ãû÷ïñòåK|óú5¾»¼øùOž<Áf³ÁvßÅØóþA‹oCC!P{sŸši’Ðy1‘æËÂ0 (Òý€‰xhLÓRìpssÛÛüèù'øößÿúl€õzcäääÞû,NË8>> "å¿`°L^ç¢ÁÎæÅ©T .ÇÏÚAÈãQWÖ1K‰Þ{¬×kÜßßcåvÛ-œsðÞcš&03&Øn·PU03D"R¨?ð¼È| P†RÜ @!y‘3*]öäIš×pÃHˆà&°¥ØŒÈ‡}³v~ …×ç[Ýn G@!0M¼÷ìv»9…˜]P—]ÜM4Ž`¥9䨤"b ‹¬ÀËŽ{Ÿ—²‰ !„Ë‚r¡‚% {¨`aÙyˆ(T "€s. ª!”»O¼|XaÞÍ À@|–Ô(h¨ñoymу2¥–)·+1]m²›¡ªy}"KèMpqqB4 ÎÍ4ˆªL%¨¿»v§,½, hs{oü,~õ8ŠY¦ð´Î”s²a€¹9º£fÏ,(ߤžåsA¤Éñ…JCÛÅŠÐä}Ñÿ €†ÉX$šduÇâôR¥ë´•&•À²cÕtÝ@}oÀφåáö¹6Ì z 0…Î ‡]`M_¢LU RÏÔ©43I´Ë­> ZÔLZ¿2d@ºBˆèªBy)p2µeÙq‹d­=ûúß‹ëa˜Ÿ?bXïš]#•„ÀÕ3ó• D ‘I¤FEÕÞõ½;¶XˆÂï[ ¯BÇŽÀ^/4`<Àæ ÊiÁÑw‚§ ‚qébKTæRx°c)Ï/ÅÏR.ÐìêØø~@¡@ÒúÌæ¨WQŒ•¬Äô²ú²Újr{ÒäÖb1 @#Ú¨;ºyÛš£yàè(!…«+GZÒ]Ì”½B*Ø,E} Ô¶ú†É¤Ü TÐÒ1§JƒX¶¦ »x©î×&ÝIå6›0*ØJÝMLz7Á$µÒ/˜îÏüÀƒl)º¤Á²“”¥€ª_ôHÊñ•ƈ <—ÛvÖ5X'hws6“2íÍ”Z±µ¯øEÙµ>ÂTx™ªb&åü^g¡:Ä/lK`zïá½ï§Aïý çÊo1*Zî µ#ãq“ÂÆ3r »&îA‚¼ï¢ùéJ•~nm6H½Áƒ@B?†öæ¡)Ûï&l,Îó˜šÖtï°ã!ÇâyÇ*Ø0#]Xïïg’Q÷)jÄTÌ£ña°ñSjO9Q6VF;9½¶¾-Z|€!p¨­6Ò›*mZ §^ÿÍööÔˆw=|YŽXÑm„ÒòYê,P•ÜTí¥ÒžóÛ+‚ι „V=ûžÚ”§$Cz¢Œ½®SŠçS—Y=†ÕGêI‹êÉ xôèì!i©ƒ-g;©C=úÞ×z™ÁÆ>Jö}¦rܼ_¢)ÕÈ»Ý.VƒÉ½ ÚÛeS³eÀÈîòìKãÃvû¾Šã{n@)A¶¡°Ûí¶Û-¶Û-¦GǢº¶("r{/÷YÕTÎڳƺ8"c¥»fãèzaÀ\ú»ø››ø‹›¿!ò©ˆ<öƒg¦n¯h3·%…˜J âH„ôžÒ‰1œxN¥öº«î'Ž¿ììTev~ÚˆYz^í_1˜"Oy¶â«Õ*ÿ=::Âùù9Þ½{÷õ÷ßÿ÷WnþŽÐ_///ñþúúùãDZÙlrLç qþnNü%è:/…Ñ\™ÍĉUB•9êÂìPUYžh¦iÊ º»»Ã›7oðöí[¬×ë_ÞÞ~ø–àôôôÙv»ýp·ý›sîSçxrݳ¿År}6Jd­¾êÝ«Ãè=ˆÍY@*§Ó&¦¶ßÕÕUžÄÿ\‡d‚ÕDIEND®B`‚toolbutton.sci000066400000000000000000000001271225012771600377460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/imagesborder.left: 15 border.top: 4 border.bottom: 4 border.right: 15 source: toolbutton.png qmlcamera.cpp000066400000000000000000000047561225012771600362520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/declarative-camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int argc, char* argv[]) { QGuiApplication app(argc,argv); QQuickView view; view.setResizeMode(QQuickView::SizeRootObjectToView); // Qt.quit() called in embedded .qml by default only emits // quit() signal, so do this (optionally use Qt.exit()). QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit())); view.setSource(QUrl("qrc:///declarative-camera.qml")); view.resize(800, 480); view.show(); return app.exec(); } multimediawidgets.pro000066400000000000000000000005301225012771600343200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgetsTEMPLATE = subdirs # These examples all need widgets for now (using creator templates that use widgets) qtHaveModule(widgets) { SUBDIRS += \ camera \ videographicsitem \ videowidget \ player \ customvideosurface } qtHaveModule(gui):qtHaveModule(qml) { disabled:SUBDIRS += declarative-camera } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/000077500000000000000000000000001225012771600314325ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/doc/000077500000000000000000000000001225012771600321775ustar00rootroot00000000000000src/000077500000000000000000000000001225012771600327075ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/docplayer.qdoc000066400000000000000000000077361225012771600350700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example player \title Media Player Example \ingroup multimedia_examples \brief Demonstrates the audio and video playback functionality This example creates a simple multimedia player. We can play audio and or video files using various codecs. The example uses a QMediaPlayer object passed into a QVideoWidget to control the video output. To give the application playlist capability we also use a QPlayList object. To activate the various functions such as play and stop on the dialog we connect clicked() signals to slots that emit the play() and stop() signals and in turn which we connect to the play() and stop() slots in QMediaPlayer. \code connect(controls, SIGNAL(play()), player, SLOT(play())); connect(controls, SIGNAL(pause()), player, SLOT(pause())); connect(controls, SIGNAL(stop()), player, SLOT(stop())); \endcode We can get the volume (and set our user interface representation) \code controls->setVolume(player->volume()); \endcode and we can make widget 'volume' changes change the volume \code connect(controls, SIGNAL(changeVolume(int)), player, SLOT(setVolume(int))); \endcode The example also allows us to change various video properties by means of the QVideoWidget object. We can go to Full Screen mode with a single button click, and back again. Or if we press the "Color Options" dialog button we can have access to more subtle influences. The dialog has a set of sliders so that we can change the brightness, contrast, hue and saturation of the video being watched. The connect() statements are in pairs so that changes to either the user interface widget (the relevant slider) or the QVideoWidget object will update the other object. \code connect(brightnessSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setBrightness(int))); connect(videoWidget, SIGNAL(brightnessChanged(int)), brightnessSlider, SLOT(setValue(int))); connect(contrastSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setContrast(int))); connect(videoWidget, SIGNAL(contrastChanged(int)), contrastSlider, SLOT(setValue(int))); connect(hueSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setHue(int))); connect(videoWidget, SIGNAL(hueChanged(int)), hueSlider, SLOT(setValue(int))); connect(saturationSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setSaturation(int))); connect(videoWidget, SIGNAL(saturationChanged(int)), saturationSlider, SLOT(setValue(int))); \endcode */ histogramwidget.cpp000066400000000000000000000127341225012771600352670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "histogramwidget.h" #include HistogramWidget::HistogramWidget(QWidget *parent) : QWidget(parent) , m_levels(128) , m_isBusy(false) { m_processor.moveToThread(&m_processorThread); qRegisterMetaType >("QVector"); connect(&m_processor, SIGNAL(histogramReady(QVector)), SLOT(setHistogram(QVector))); m_processorThread.start(QThread::LowestPriority); } HistogramWidget::~HistogramWidget() { m_processorThread.quit(); m_processorThread.wait(10000); } void HistogramWidget::processFrame(QVideoFrame frame) { if (m_isBusy) return; //drop frame m_isBusy = true; QMetaObject::invokeMethod(&m_processor, "processFrame", Qt::QueuedConnection, Q_ARG(QVideoFrame, frame), Q_ARG(int, m_levels)); } void HistogramWidget::setHistogram(QVector histogram) { m_isBusy = false; m_histogram = histogram; update(); } void HistogramWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); if (m_histogram.isEmpty()) { painter.fillRect(0, 0, width(), height(), QColor::fromRgb(0, 0, 0)); return; } qreal barWidth = width() / (qreal)m_histogram.size(); for (int i = 0; i < m_histogram.size(); i++) { qreal h = m_histogram[i] * height(); // draw level painter.fillRect(barWidth * i, height() - h, barWidth * (i + 1), height(), Qt::red); // clear the rest of the control painter.fillRect(barWidth * i, 0, barWidth * (i + 1), height() - h, Qt::black); } } void FrameProcessor::processFrame(QVideoFrame frame, int levels) { QVector histogram(levels); do { if (!levels) break; if (!frame.map(QAbstractVideoBuffer::ReadOnly)) break; if (frame.pixelFormat() == QVideoFrame::Format_YUV420P || frame.pixelFormat() == QVideoFrame::Format_NV12) { // Process YUV data uchar *b = frame.bits(); for (int y = 0; y < frame.height(); y++) { uchar *lastPixel = b + frame.width(); for (uchar *curPixel = b; curPixel < lastPixel; curPixel++) histogram[(*curPixel * levels) >> 8] += 1.0; b += frame.bytesPerLine(); } } else { QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()); if (imageFormat != QImage::Format_Invalid) { // Process RGB data QImage image(frame.bits(), frame.width(), frame.height(), imageFormat); image = image.convertToFormat(QImage::Format_RGB32); const QRgb* b = (const QRgb*)image.bits(); for (int y = 0; y < image.height(); y++) { const QRgb *lastPixel = b + frame.width(); for (const QRgb *curPixel = b; curPixel < lastPixel; curPixel++) histogram[(qGray(*curPixel) * levels) >> 8] += 1.0; b = (const QRgb*)((uchar*)b + image.bytesPerLine()); } } } // find maximum value qreal maxValue = 0.0; for (int i = 0; i < histogram.size(); i++) { if (histogram[i] > maxValue) maxValue = histogram[i]; } if (maxValue > 0.0) { for (int i = 0; i < histogram.size(); i++) histogram[i] /= maxValue; } frame.unmap(); } while (false); emit histogramReady(histogram); } histogramwidget.h000066400000000000000000000054051225012771600347310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef HISTOGRAMWIDGET_H #define HISTOGRAMWIDGET_H #include #include #include class FrameProcessor: public QObject { Q_OBJECT public slots: void processFrame(QVideoFrame frame, int levels); signals: void histogramReady(QVector histogram); }; class HistogramWidget : public QWidget { Q_OBJECT public: explicit HistogramWidget(QWidget *parent = 0); ~HistogramWidget(); void setLevels(int levels) { m_levels = levels; } public slots: void processFrame(QVideoFrame frame); void setHistogram(QVector histogram); protected: void paintEvent(QPaintEvent *event); private: QVector m_histogram; int m_levels; FrameProcessor m_processor; QThread m_processorThread; bool m_isBusy; }; #endif // HISTOGRAMWIDGET_H main.cpp000066400000000000000000000046271225012771600330140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "player.h" #include int main(int argc, char *argv[]) { #ifdef Q_WS_MAEMO_6 //Meego graphics system conflicts with xvideo during fullscreen transition QApplication::setGraphicsSystem("raster"); #endif QApplication app(argc, argv); Player player; #if defined(Q_WS_SIMULATOR) player.setAttribute(Qt::WA_LockLandscapeOrientation); player.showMaximized(); #else player.show(); #endif return app.exec(); } player.cpp000066400000000000000000000350131225012771600333550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "player.h" #include "playercontrols.h" #include "playlistmodel.h" #include "histogramwidget.h" #include #include #include #include #include Player::Player(QWidget *parent) : QWidget(parent) , videoWidget(0) , coverLabel(0) , slider(0) #ifndef PLAYER_NO_COLOROPTIONS , colorDialog(0) #endif { //! [create-objs] player = new QMediaPlayer(this); // owned by PlaylistModel playlist = new QMediaPlaylist(); player->setPlaylist(playlist); //! [create-objs] connect(player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64))); connect(player, SIGNAL(positionChanged(qint64)), SLOT(positionChanged(qint64))); connect(player, SIGNAL(metaDataChanged()), SLOT(metaDataChanged())); connect(playlist, SIGNAL(currentIndexChanged(int)), SLOT(playlistPositionChanged(int))); connect(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(statusChanged(QMediaPlayer::MediaStatus))); connect(player, SIGNAL(bufferStatusChanged(int)), this, SLOT(bufferingProgress(int))); connect(player, SIGNAL(videoAvailableChanged(bool)), this, SLOT(videoAvailableChanged(bool))); connect(player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(displayErrorMessage())); //! [2] videoWidget = new VideoWidget(this); player->setVideoOutput(videoWidget); playlistModel = new PlaylistModel(this); playlistModel->setPlaylist(playlist); //! [2] playlistView = new QListView(this); playlistView->setModel(playlistModel); playlistView->setCurrentIndex(playlistModel->index(playlist->currentIndex(), 0)); connect(playlistView, SIGNAL(activated(QModelIndex)), this, SLOT(jump(QModelIndex))); slider = new QSlider(Qt::Horizontal, this); slider->setRange(0, player->duration() / 1000); labelDuration = new QLabel(this); connect(slider, SIGNAL(sliderMoved(int)), this, SLOT(seek(int))); labelHistogram = new QLabel(this); labelHistogram->setText("Histogram:"); histogram = new HistogramWidget(this); QHBoxLayout *histogramLayout = new QHBoxLayout; histogramLayout->addWidget(labelHistogram); histogramLayout->addWidget(histogram, 1); probe = new QVideoProbe(this); connect(probe, SIGNAL(videoFrameProbed(const QVideoFrame&)), histogram, SLOT(processFrame(QVideoFrame))); probe->setSource(player); QPushButton *openButton = new QPushButton(tr("Open"), this); connect(openButton, SIGNAL(clicked()), this, SLOT(open())); PlayerControls *controls = new PlayerControls(this); controls->setState(player->state()); controls->setVolume(player->volume()); controls->setMuted(controls->isMuted()); connect(controls, SIGNAL(play()), player, SLOT(play())); connect(controls, SIGNAL(pause()), player, SLOT(pause())); connect(controls, SIGNAL(stop()), player, SLOT(stop())); connect(controls, SIGNAL(next()), playlist, SLOT(next())); connect(controls, SIGNAL(previous()), this, SLOT(previousClicked())); connect(controls, SIGNAL(changeVolume(int)), player, SLOT(setVolume(int))); connect(controls, SIGNAL(changeMuting(bool)), player, SLOT(setMuted(bool))); connect(controls, SIGNAL(changeRate(qreal)), player, SLOT(setPlaybackRate(qreal))); connect(controls, SIGNAL(stop()), videoWidget, SLOT(update())); connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), controls, SLOT(setState(QMediaPlayer::State))); connect(player, SIGNAL(volumeChanged(int)), controls, SLOT(setVolume(int))); connect(player, SIGNAL(mutedChanged(bool)), controls, SLOT(setMuted(bool))); fullScreenButton = new QPushButton(tr("FullScreen"), this); fullScreenButton->setCheckable(true); #ifndef PLAYER_NO_COLOROPTIONS colorButton = new QPushButton(tr("Color Options..."), this); colorButton->setEnabled(false); connect(colorButton, SIGNAL(clicked()), this, SLOT(showColorDialog())); #endif QBoxLayout *displayLayout = new QHBoxLayout; displayLayout->addWidget(videoWidget, 2); displayLayout->addWidget(playlistView); QBoxLayout *controlLayout = new QHBoxLayout; controlLayout->setMargin(0); controlLayout->addWidget(openButton); controlLayout->addStretch(1); controlLayout->addWidget(controls); controlLayout->addStretch(1); controlLayout->addWidget(fullScreenButton); #ifndef PLAYER_NO_COLOROPTIONS controlLayout->addWidget(colorButton); #endif QBoxLayout *layout = new QVBoxLayout; layout->addLayout(displayLayout); QHBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(slider); hLayout->addWidget(labelDuration); layout->addLayout(hLayout); layout->addLayout(controlLayout); layout->addLayout(histogramLayout); setLayout(layout); if (!player->isAvailable()) { QMessageBox::warning(this, tr("Service not available"), tr("The QMediaPlayer object does not have a valid service.\n"\ "Please check the media service plugins are installed.")); controls->setEnabled(false); playlistView->setEnabled(false); openButton->setEnabled(false); #ifndef PLAYER_NO_COLOROPTIONS colorButton->setEnabled(false); #endif fullScreenButton->setEnabled(false); } metaDataChanged(); QStringList arguments = qApp->arguments(); arguments.removeAt(0); addToPlaylist(arguments); } Player::~Player() { } void Player::open() { QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files")); addToPlaylist(fileNames); } void Player::addToPlaylist(const QStringList& fileNames) { foreach (QString const &argument, fileNames) { QFileInfo fileInfo(argument); if (fileInfo.exists()) { QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); if (fileInfo.suffix().toLower() == QLatin1String("m3u")) { playlist->load(url); } else playlist->addMedia(url); } else { QUrl url(argument); if (url.isValid()) { playlist->addMedia(url); } } } } void Player::durationChanged(qint64 duration) { this->duration = duration/1000; slider->setMaximum(duration / 1000); } void Player::positionChanged(qint64 progress) { if (!slider->isSliderDown()) { slider->setValue(progress / 1000); } updateDurationInfo(progress / 1000); } void Player::metaDataChanged() { if (player->isMetaDataAvailable()) { setTrackInfo(QString("%1 - %2") .arg(player->metaData(QMediaMetaData::AlbumArtist).toString()) .arg(player->metaData(QMediaMetaData::Title).toString())); if (coverLabel) { QUrl url = player->metaData(QMediaMetaData::CoverArtUrlLarge).value(); coverLabel->setPixmap(!url.isEmpty() ? QPixmap(url.toString()) : QPixmap()); } } } void Player::previousClicked() { // Go to previous track if we are within the first 5 seconds of playback // Otherwise, seek to the beginning. if(player->position() <= 5000) playlist->previous(); else player->setPosition(0); } void Player::jump(const QModelIndex &index) { if (index.isValid()) { playlist->setCurrentIndex(index.row()); player->play(); } } void Player::playlistPositionChanged(int currentItem) { playlistView->setCurrentIndex(playlistModel->index(currentItem, 0)); } void Player::seek(int seconds) { player->setPosition(seconds * 1000); } void Player::statusChanged(QMediaPlayer::MediaStatus status) { handleCursor(status); // handle status message switch (status) { case QMediaPlayer::UnknownMediaStatus: case QMediaPlayer::NoMedia: case QMediaPlayer::LoadedMedia: case QMediaPlayer::BufferingMedia: case QMediaPlayer::BufferedMedia: setStatusInfo(QString()); break; case QMediaPlayer::LoadingMedia: setStatusInfo(tr("Loading...")); break; case QMediaPlayer::StalledMedia: setStatusInfo(tr("Media Stalled")); break; case QMediaPlayer::EndOfMedia: QApplication::alert(this); break; case QMediaPlayer::InvalidMedia: displayErrorMessage(); break; } } void Player::handleCursor(QMediaPlayer::MediaStatus status) { #ifndef QT_NO_CURSOR if (status == QMediaPlayer::LoadingMedia || status == QMediaPlayer::BufferingMedia || status == QMediaPlayer::StalledMedia) setCursor(QCursor(Qt::BusyCursor)); else unsetCursor(); #endif } void Player::bufferingProgress(int progress) { setStatusInfo(tr("Buffering %4%").arg(progress)); } void Player::videoAvailableChanged(bool available) { if (!available) { disconnect(fullScreenButton, SIGNAL(clicked(bool)), videoWidget, SLOT(setFullScreen(bool))); disconnect(videoWidget, SIGNAL(fullScreenChanged(bool)), fullScreenButton, SLOT(setChecked(bool))); videoWidget->setFullScreen(false); } else { connect(fullScreenButton, SIGNAL(clicked(bool)), videoWidget, SLOT(setFullScreen(bool))); connect(videoWidget, SIGNAL(fullScreenChanged(bool)), fullScreenButton, SLOT(setChecked(bool))); if (fullScreenButton->isChecked()) videoWidget->setFullScreen(true); } #ifndef PLAYER_NO_COLOROPTIONS colorButton->setEnabled(available); #endif } void Player::setTrackInfo(const QString &info) { trackInfo = info; if (!statusInfo.isEmpty()) setWindowTitle(QString("%1 | %2").arg(trackInfo).arg(statusInfo)); else setWindowTitle(trackInfo); } void Player::setStatusInfo(const QString &info) { statusInfo = info; if (!statusInfo.isEmpty()) setWindowTitle(QString("%1 | %2").arg(trackInfo).arg(statusInfo)); else setWindowTitle(trackInfo); } void Player::displayErrorMessage() { setStatusInfo(player->errorString()); } void Player::updateDurationInfo(qint64 currentInfo) { QString tStr; if (currentInfo || duration) { QTime currentTime((currentInfo/3600)%60, (currentInfo/60)%60, currentInfo%60, (currentInfo*1000)%1000); QTime totalTime((duration/3600)%60, (duration/60)%60, duration%60, (duration*1000)%1000); QString format = "mm:ss"; if (duration > 3600) format = "hh:mm:ss"; tStr = currentTime.toString(format) + " / " + totalTime.toString(format); } labelDuration->setText(tStr); } #ifndef PLAYER_NO_COLOROPTIONS void Player::showColorDialog() { if (!colorDialog) { QSlider *brightnessSlider = new QSlider(Qt::Horizontal); brightnessSlider->setRange(-100, 100); brightnessSlider->setValue(videoWidget->brightness()); connect(brightnessSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setBrightness(int))); connect(videoWidget, SIGNAL(brightnessChanged(int)), brightnessSlider, SLOT(setValue(int))); QSlider *contrastSlider = new QSlider(Qt::Horizontal); contrastSlider->setRange(-100, 100); contrastSlider->setValue(videoWidget->contrast()); connect(contrastSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setContrast(int))); connect(videoWidget, SIGNAL(contrastChanged(int)), contrastSlider, SLOT(setValue(int))); QSlider *hueSlider = new QSlider(Qt::Horizontal); hueSlider->setRange(-100, 100); hueSlider->setValue(videoWidget->hue()); connect(hueSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setHue(int))); connect(videoWidget, SIGNAL(hueChanged(int)), hueSlider, SLOT(setValue(int))); QSlider *saturationSlider = new QSlider(Qt::Horizontal); saturationSlider->setRange(-100, 100); saturationSlider->setValue(videoWidget->saturation()); connect(saturationSlider, SIGNAL(sliderMoved(int)), videoWidget, SLOT(setSaturation(int))); connect(videoWidget, SIGNAL(saturationChanged(int)), saturationSlider, SLOT(setValue(int))); QFormLayout *layout = new QFormLayout; layout->addRow(tr("Brightness"), brightnessSlider); layout->addRow(tr("Contrast"), contrastSlider); layout->addRow(tr("Hue"), hueSlider); layout->addRow(tr("Saturation"), saturationSlider); QPushButton *button = new QPushButton(tr("Close")); layout->addRow(button); colorDialog = new QDialog(this); colorDialog->setWindowTitle(tr("Color Options")); colorDialog->setLayout(layout); connect(button, SIGNAL(clicked()), colorDialog, SLOT(close())); } colorDialog->show(); } #endif player.h000066400000000000000000000074051225012771600330260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PLAYER_H #define PLAYER_H #include "videowidget.h" #include #include #include QT_BEGIN_NAMESPACE class QAbstractItemView; class QLabel; class QMediaPlayer; class QModelIndex; class QPushButton; class QSlider; class QVideoProbe; class QVideoWidget; QT_END_NAMESPACE class PlaylistModel; class HistogramWidget; class Player : public QWidget { Q_OBJECT public: Player(QWidget *parent = 0); ~Player(); signals: void fullScreenChanged(bool fullScreen); private slots: void open(); void durationChanged(qint64 duration); void positionChanged(qint64 progress); void metaDataChanged(); void previousClicked(); void seek(int seconds); void jump(const QModelIndex &index); void playlistPositionChanged(int); void statusChanged(QMediaPlayer::MediaStatus status); void bufferingProgress(int progress); void videoAvailableChanged(bool available); void displayErrorMessage(); #ifndef PLAYER_NO_COLOROPTIONS void showColorDialog(); #endif void addToPlaylist(const QStringList &fileNames); private: void setTrackInfo(const QString &info); void setStatusInfo(const QString &info); void handleCursor(QMediaPlayer::MediaStatus status); void updateDurationInfo(qint64 currentInfo); QMediaPlayer *player; QMediaPlaylist *playlist; VideoWidget *videoWidget; QLabel *coverLabel; QSlider *slider; QLabel *labelDuration; QPushButton *fullScreenButton; #ifndef PLAYER_NO_COLOROPTIONS QPushButton *colorButton; QDialog *colorDialog; #endif QLabel *labelHistogram; HistogramWidget *histogram; QVideoProbe *probe; PlaylistModel *playlistModel; QAbstractItemView *playlistView; QString trackInfo; QString statusInfo; qint64 duration; }; #endif // PLAYER_H player.pro000066400000000000000000000007641225012771600334000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/playerTEMPLATE = app TARGET = player QT += network \ xml \ multimedia \ multimediawidgets \ widgets HEADERS = \ player.h \ playercontrols.h \ playlistmodel.h \ videowidget.h \ histogramwidget.h SOURCES = main.cpp \ player.cpp \ playercontrols.cpp \ playlistmodel.cpp \ videowidget.cpp \ histogramwidget.cpp maemo* { DEFINES += PLAYER_NO_COLOROPTIONS } target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/player INSTALLS += target playercontrols.cpp000066400000000000000000000143561225012771600351500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "playercontrols.h" #include #include #include #include #include PlayerControls::PlayerControls(QWidget *parent) : QWidget(parent) , playerState(QMediaPlayer::StoppedState) , playerMuted(false) , playButton(0) , stopButton(0) , nextButton(0) , previousButton(0) , muteButton(0) , volumeSlider(0) , rateBox(0) { playButton = new QToolButton(this); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(playButton, SIGNAL(clicked()), this, SLOT(playClicked())); stopButton = new QToolButton(this); stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); stopButton->setEnabled(false); connect(stopButton, SIGNAL(clicked()), this, SIGNAL(stop())); nextButton = new QToolButton(this); nextButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward)); connect(nextButton, SIGNAL(clicked()), this, SIGNAL(next())); previousButton = new QToolButton(this); previousButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward)); connect(previousButton, SIGNAL(clicked()), this, SIGNAL(previous())); muteButton = new QToolButton(this); muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); connect(muteButton, SIGNAL(clicked()), this, SLOT(muteClicked())); volumeSlider = new QSlider(Qt::Horizontal, this); volumeSlider->setRange(0, 100); connect(volumeSlider, SIGNAL(sliderMoved(int)), this, SIGNAL(changeVolume(int))); rateBox = new QComboBox(this); rateBox->addItem("0.5x", QVariant(0.5)); rateBox->addItem("1.0x", QVariant(1.0)); rateBox->addItem("2.0x", QVariant(2.0)); rateBox->setCurrentIndex(1); connect(rateBox, SIGNAL(activated(int)), SLOT(updateRate())); QBoxLayout *layout = new QHBoxLayout; layout->setMargin(0); layout->addWidget(stopButton); layout->addWidget(previousButton); layout->addWidget(playButton); layout->addWidget(nextButton); layout->addWidget(muteButton); layout->addWidget(volumeSlider); layout->addWidget(rateBox); setLayout(layout); } QMediaPlayer::State PlayerControls::state() const { return playerState; } void PlayerControls::setState(QMediaPlayer::State state) { if (state != playerState) { playerState = state; switch (state) { case QMediaPlayer::StoppedState: stopButton->setEnabled(false); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; case QMediaPlayer::PlayingState: stopButton->setEnabled(true); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; case QMediaPlayer::PausedState: stopButton->setEnabled(true); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } } int PlayerControls::volume() const { return volumeSlider ? volumeSlider->value() : 0; } void PlayerControls::setVolume(int volume) { if (volumeSlider) volumeSlider->setValue(volume); } bool PlayerControls::isMuted() const { return playerMuted; } void PlayerControls::setMuted(bool muted) { if (muted != playerMuted) { playerMuted = muted; muteButton->setIcon(style()->standardIcon(muted ? QStyle::SP_MediaVolumeMuted : QStyle::SP_MediaVolume)); } } void PlayerControls::playClicked() { switch (playerState) { case QMediaPlayer::StoppedState: case QMediaPlayer::PausedState: emit play(); break; case QMediaPlayer::PlayingState: emit pause(); break; } } void PlayerControls::muteClicked() { emit changeMuting(!playerMuted); } qreal PlayerControls::playbackRate() const { return rateBox->itemData(rateBox->currentIndex()).toDouble(); } void PlayerControls::setPlaybackRate(float rate) { for (int i = 0; i < rateBox->count(); ++i) { if (qFuzzyCompare(rate, float(rateBox->itemData(i).toDouble()))) { rateBox->setCurrentIndex(i); return; } } rateBox->addItem(QString("%1x").arg(rate), QVariant(rate)); rateBox->setCurrentIndex(rateBox->count() - 1); } void PlayerControls::updateRate() { emit changeRate(playbackRate()); } playercontrols.h000066400000000000000000000061741225012771600346140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PLAYERCONTROLS_H #define PLAYERCONTROLS_H #include #include QT_BEGIN_NAMESPACE class QAbstractButton; class QAbstractSlider; class QComboBox; QT_END_NAMESPACE class PlayerControls : public QWidget { Q_OBJECT public: PlayerControls(QWidget *parent = 0); QMediaPlayer::State state() const; int volume() const; bool isMuted() const; qreal playbackRate() const; public slots: void setState(QMediaPlayer::State state); void setVolume(int volume); void setMuted(bool muted); void setPlaybackRate(float rate); signals: void play(); void pause(); void stop(); void next(); void previous(); void changeVolume(int volume); void changeMuting(bool muting); void changeRate(qreal rate); private slots: void playClicked(); void muteClicked(); void updateRate(); private: QMediaPlayer::State playerState; bool playerMuted; QAbstractButton *playButton; QAbstractButton *stopButton; QAbstractButton *nextButton; QAbstractButton *previousButton; QAbstractButton *muteButton; QAbstractSlider *volumeSlider; QComboBox *rateBox; }; #endif // PLAYERCONTROLS_H playlistmodel.cpp000066400000000000000000000122401225012771600347400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "playlistmodel.h" #include #include #include PlaylistModel::PlaylistModel(QObject *parent) : QAbstractItemModel(parent) , m_playlist(0) { } int PlaylistModel::rowCount(const QModelIndex &parent) const { return m_playlist && !parent.isValid() ? m_playlist->mediaCount() : 0; } int PlaylistModel::columnCount(const QModelIndex &parent) const { return !parent.isValid() ? ColumnCount : 0; } QModelIndex PlaylistModel::index(int row, int column, const QModelIndex &parent) const { return m_playlist && !parent.isValid() && row >= 0 && row < m_playlist->mediaCount() && column >= 0 && column < ColumnCount ? createIndex(row, column) : QModelIndex(); } QModelIndex PlaylistModel::parent(const QModelIndex &child) const { Q_UNUSED(child); return QModelIndex(); } QVariant PlaylistModel::data(const QModelIndex &index, int role) const { if (index.isValid() && role == Qt::DisplayRole) { QVariant value = m_data[index]; if (!value.isValid() && index.column() == Title) { QUrl location = m_playlist->media(index.row()).canonicalUrl(); return QFileInfo(location.path()).fileName(); } return value; } return QVariant(); } QMediaPlaylist *PlaylistModel::playlist() const { return m_playlist; } void PlaylistModel::setPlaylist(QMediaPlaylist *playlist) { if (m_playlist) { disconnect(m_playlist, SIGNAL(mediaAboutToBeInserted(int,int)), this, SLOT(beginInsertItems(int,int))); disconnect(m_playlist, SIGNAL(mediaInserted(int,int)), this, SLOT(endInsertItems())); disconnect(m_playlist, SIGNAL(mediaAboutToBeRemoved(int,int)), this, SLOT(beginRemoveItems(int,int))); disconnect(m_playlist, SIGNAL(mediaRemoved(int,int)), this, SLOT(endRemoveItems())); disconnect(m_playlist, SIGNAL(mediaChanged(int,int)), this, SLOT(changeItems(int,int))); } beginResetModel(); m_playlist = playlist; if (m_playlist) { connect(m_playlist, SIGNAL(mediaAboutToBeInserted(int,int)), this, SLOT(beginInsertItems(int,int))); connect(m_playlist, SIGNAL(mediaInserted(int,int)), this, SLOT(endInsertItems())); connect(m_playlist, SIGNAL(mediaAboutToBeRemoved(int,int)), this, SLOT(beginRemoveItems(int,int))); connect(m_playlist, SIGNAL(mediaRemoved(int,int)), this, SLOT(endRemoveItems())); connect(m_playlist, SIGNAL(mediaChanged(int,int)), this, SLOT(changeItems(int,int))); } endResetModel(); } bool PlaylistModel::setData(const QModelIndex &index, const QVariant &value, int role) { Q_UNUSED(role); m_data[index] = value; emit dataChanged(index, index); return true; } void PlaylistModel::beginInsertItems(int start, int end) { m_data.clear(); beginInsertRows(QModelIndex(), start, end); } void PlaylistModel::endInsertItems() { endInsertRows(); } void PlaylistModel::beginRemoveItems(int start, int end) { m_data.clear(); beginRemoveRows(QModelIndex(), start, end); } void PlaylistModel::endRemoveItems() { endInsertRows(); } void PlaylistModel::changeItems(int start, int end) { m_data.clear(); emit dataChanged(index(start,0), index(end,ColumnCount)); } playlistmodel.h000066400000000000000000000061601225012771600344110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PLAYLISTMODEL_H #define PLAYLISTMODEL_H #include QT_BEGIN_NAMESPACE class QMediaPlaylist; QT_END_NAMESPACE class PlaylistModel : public QAbstractItemModel { Q_OBJECT public: enum Column { Title = 0, ColumnCount }; PlaylistModel(QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &child) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QMediaPlaylist *playlist() const; void setPlaylist(QMediaPlaylist *playlist); bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole); private slots: void beginInsertItems(int start, int end); void endInsertItems(); void beginRemoveItems(int start, int end); void endRemoveItems(); void changeItems(int start, int end); private: QMediaPlaylist *m_playlist; QMap m_data; }; #endif // PLAYLISTMODEL_H videowidget.cpp000066400000000000000000000056011225012771600343730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videowidget.h" #include #include VideoWidget::VideoWidget(QWidget *parent) : QVideoWidget(parent) { setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); QPalette p = palette(); p.setColor(QPalette::Window, Qt::black); setPalette(p); setAttribute(Qt::WA_OpaquePaintEvent); } void VideoWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape && isFullScreen()) { setFullScreen(false); event->accept(); } else if (event->key() == Qt::Key_Enter && event->modifiers() & Qt::Key_Alt) { setFullScreen(!isFullScreen()); event->accept(); } else { QVideoWidget::keyPressEvent(event); } } void VideoWidget::mouseDoubleClickEvent(QMouseEvent *event) { setFullScreen(!isFullScreen()); event->accept(); } void VideoWidget::mousePressEvent(QMouseEvent *event) { QVideoWidget::mousePressEvent(event); } videowidget.h000066400000000000000000000044531225012771600340440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/player/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOWIDGET_H #define VIDEOWIDGET_H #include class VideoWidget : public QVideoWidget { Q_OBJECT public: VideoWidget(QWidget *parent = 0); protected: void keyPressEvent(QKeyEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); }; #endif // VIDEOWIDGET_H videographicsitem/000077500000000000000000000000001225012771600335655ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgetsdoc/000077500000000000000000000000001225012771600343325ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitemimages/000077500000000000000000000000001225012771600355775ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/docvideo-videographicsitem.png000066400000000000000000001522441225012771600431270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/doc/images‰PNG  IHDR£0ƒ† IDATxœìÝiŒ¥Ù}ß÷ï9Ïv·ª[u«ª×Ù§{8C†”"qe‹ÔbI”ɱ‘-/p ±¤  ,/ vI^ňe‰´ƒXp$Ë&%[ûNŽHŠË¬Ý3=Óku×¾ÜíyžsN^<÷Þ®ª®êž­ûvS¿pQ}·óœ§¦jî¯þÏYÌòò2}ìc ·<(""""ò‹C¸™;?þñ€ø½ŸœZ‡DDDDäëSùջ屨{Àw|Çw„ø½Ÿdñøq–N`éÄñ{Ý?ù:µ²|•ã?ËêõëûB©¹|ù2ßùßâ÷~’Çž:ÃñÓ§¦ØMùzvýÊU^{ùü$N.Ó/?ÎÜB‡á`0ÍþÉ}f©åøøÓC6w v{9ÃÒ°ºcØèG¬÷2¢8ÅØhÚݹçÖ¯~ë¯þáÛnçø¡sê?ºëí¾Yw«s gù«Õýø»¾ë»BüÞO’Õk ¢2GÅÊ‚KË>ó‡W™­Ã#'ÛœœOø†‡30Û=ÇêVàÊFàÒfJ×°Q<íˆÜU[×_díÒ³¼ï{þ»·ÝÖW~åïQ%íãOßµv߬»Ý¬^#~ï')¿úcÄ{†·4°öÕOñÄÌÚí6eYòbï=Ì>úñÛt°~ŽÎú/ðêÖ"'¾ù¿|Û'!÷^{6pª]2_/h%9«Ë—X®­—_¼£3›òøÉßp¦Í“ÇcV¶ºüÞskläMâ´1ª˜ŠˆÈ×§µKÏrö£?DçÆÛnëìGˆs¿ÿsÔÚßµv߬»Ý¬^›ü{F‡ýë¢õG?A÷Ƨøë?ðˆ¢ˆ_úå_áKË/‘µ=ôõn¸Ã»’ÏsÅÅ4ûÄ‘íÊýíb×qáÒ€r°CÞ_'®/§ âZW pE•¼øêuòAÎüô1>ñþc|ñåm¾xa‹¤6‹ÒiŸŠˆˆÈ]¼{GÛg¦»Õî›u¯úq3Œy‰Þ²œ|;?ÿéÅ·~Ëûy÷ÓOrþW‰MûƒDIóÀk³ëÿ–0?ärø-ÛÔ¥ÿT_æ8¦F Å…ã Ø:6«óÌ–o}OÊúƳuÿøå/óò…eþÒŸ{7._cys@Úè`Œö鈈ˆ¼ãÞñ°6¸Kaô-f±{Õ7Ft‘//?FúùgYZZä™'ùݯü¿”ÿ瀙¼Ì®ý6OŸÏ|©ÎÌcg¸ ú?óm|Ãú‘4H oé5Óè×ÝaÀÔ1i8nôßt¶aùè3³|êß¾Lww‡Zó}ÿæ7Ïó;Ï^à£ï;ÎÏæ"¥ƒ8mÝ£þŠˆˆÜ; £ïL?&a´»½sûïá^ºÀ»·_ÁZË©æ—^ýUìâG»¯ðñ'7øÌï¯bOÿå;·w[¿ôeê3Ôço½Äüîïÿ9ÊÁ:…Ë(Ê»zǼ“o|´Å×^ºÆ+¯\äÇÿ«ð~þøÄÇßÃÿó«çøØûa®žs}õI󘪣""òu%ákÝí#Ûý¿ø=w|ÿßüéçŽl÷ͺS?;Öíž»]?nN{6‡>¿O8þÝœ»üstê]–ÂXÙžƒúiÞÛyž/>·'þ2¼Í¥~¾ü/ÿ<O}÷ÿÁË¿úßLþ×;<ÿ‹?tÇçÆÆ'õÎmÛLê}ïëm¼Â¥gÿá¡í<ÿKÕ1þàß¡>†¤ÑÙ×çÃÚÝûÜíúuÔcoö˜Gµùîø9€#_s”v3"K ×7†,¡$ø¬åÿü…ç°QFT›¥^OÈKxùõ5Î<<ÇÕ•ëÄ¡ÀØìÈöEDDDþ£ã,öVÛ=ò}o 㽩ö¨‚ç_ÿɯLîÿì¾ï-÷Ãî}þN7k†‹?@oh!G`×—¥áo²»³ÁZö1¢¤õ†Ú:ê¶7`C#@ã<®¿~äsƒèø5ƒW(xßÞç÷~ÖÎöŽíìýž ›{_ð¹£ÚŸßÞ~<ç7z̃ï¿öù_ü¡Û÷¨Û0÷|Ï‡æøæ3 1]ðø•už~bÇN·¹¾Úe³[ò¿ó,/¾²Š5– —·8ûH|A(oëgB7ÝtÓM7Ýî·T•ÃwêÆÚøkÿàK<õoã}ßþ—n¹¼ðÿ˜k/þÖ¡í¾Sç÷×þÁ—ûÙ}×^ü­}Aô©|/üÆ?fãò×îØ±7Uˆê lÔÿ,µò7Ùêz\°kuùâòã4N=öÆ9Ÿü‹›«ýЇغü¹ÉýþÆ+$õýc%Û}ˆ¤Þ¡>ÿ$O|Û^wž¢¿Îê¹ÏNî'õù[Þ7nûÕßþ‰ê½ÎÜöQíŒûóÒ(è|ßÞö¸í‡>TUɪÏgösÜ^ýÇîtL€ÕsŸœËßöã¼úÛ?Á¥ÏÿCþàßÙw^ýó¼úÛ?ÀâÙï­*¢*žßÿò >þM:3ž×® xérÎÿþ©çøoÿê{ØØê1?[çÂå ~÷‹—0q‹[–‡NÎà]Lû興ˆ<€ÞéËôãÏâ£Ú Þ1wòiæN¾nhÖ\Øþ¶ûfÕúûÌÏýÝ÷ð«ÿäG&?õþ?Kmf‘ö‰w‘µ:o¸ñÍçßxOk~ïasPçÏÔHÓ”ZòæÚ¸q<ù¾äÚW>=y|oëíÓ$i,И?C½sfòø«¿ýiö*úë”ý[Þ··í*8vnyMcþÌ‘íìOÑ_'©wxäƒ?L1X'©uö½bo°>ù¾å?û¾ç'yéW~”ÕsŸå‘þð$ƒâÁËç{¹÷{3Öß8¿¯ßå`crÌÃ^ŸÔ:$õ…Ûÿ·3†K×{|öw_ãcï?ƣǼçÉœýëøû?ûe¢JpeމgxøT‡ozÏÃa1Z“´|Ç~6DDDî!¼³atüYyT»!8Ú'žâøÙo9ôù¬Õ!ËûßêgðíÎï»þößç?üÌßÜêý†Zk‘ãg?JûäSdÍù7Ü7]eç:áy® ¢ÓÞ!Ïs†Ã!'ì*×»c[¿Á†n¯ÑÙ2oé£14:g˜=ýÁI`ûÒ§¿€G>ôÃ\üÜOßö}{Û.úë“ BÛ>òø‡Ü·;®V&õïúÞŸä¥Ïþè¾×]ûʧyòcU5v<þ ì¿$ŸÔ;ûž?´ýuè¸?jkï×É1‡ã°v}Ê¥µœöKçy×Ã5>ðÞüó xÁ`ˆµ–8Nˆâlmoãýoù¯2‘ûÕ4*£ôqƒ?üýïpeØD^þãßåþo‘5;dùÃß{Çʨ¹sOýpùÞo²ÚËHù ô+¬oý"iTÐÞùU¶³Ħ³wlëv¶.ŽG>ü#ûBœ©:9¹ŸÖ;û–9úâ§>À©oø+ûÚ:ø¾·Òöa¯9êþ×þõ_àéOüÆÒÆO~ü¦¿~ž¢·ÆÊä2þ+Uõµs†§?ñS¼ø™™T.—Î~/icÆÂÙÛö¡ýÐ1Ø}à gI “6ÇÃÆï‡ôñ1’ÆÂúoo¢S›ÅF ç–wyñõsÔ3ã'gèÌÕIc( G·_ðâ…u>ðž%?5?l£7t ‘É;FÇŸ•· £á6a4FßêgðQÇùôÿg&ÿ>ûÍßʹ/üÏþÛÊwþ­OÒoÎSkݺ åQýØs™þN*Xü%†òØ÷“Æu¢Ö#l•ßʼnâרÕRæ’„¨÷ël§ßÏž¹QoØ3Ÿø)^øL5öàâýÔ­'qÈýƒ]ýò§îø¾½mÏ=ôa gH¹~‡B(fOŸÇ!s¬¿~Ó939ŸƒŠÞÚdâÔÁcCUÁLëÛsëòçoyߣþ ·V@N¾ºÝ1Æš5KwàªÉóÁ`L„M[Dq ŸÎP滼|±‹{uàKž,yïÙc|äæ>û¬‰¢L…Qùºsجñù?~ìŽïûÄü µÖÙÀ6þ¬ÁÊËŸaåÜgyì#7áÜCbs4~sîá“4:4Îî?ö¶owü´¹ÀÙoÿ ÎýÆïëwsá Æ¾á?û4_þW?xËy5Î60ÖÜrÞŒ*ª‡=~Ô1Nã_¡Ñ©Îeo{èC4ÏòØG~„×þð§nŒ=z¹çác)õ®¬éBUå´ 6NˆkM‚w$QÉ\ž8•ñ¡÷tXYïòÏék\_÷¤Íâ¬yÇŸ/‘Í[­Œn^{‘öñ³¤¹}?+j· ‚;²ÝþÎ µÖ­•Ñ·ø|»ó;óMßB­ÙáØ“&kvøö¿ñ¿òÿìªóKsGžßAæé§Ÿñ{?I­~ôBêÙàþÌ7ø_`Žÿ9nɶÁñ0¿ÃÇÞç[[Û|ö¹E|ãÉ7v¶#ÏþóïàØ»>AÑ[§±p–+òó“ÇæF›ºkçh.œ¡±p¨ÆFöÖÎÑ];OÑ_›ÌBOêÒF‡—½ nó£:~~ÜFRïLÞ¿÷ñƒ·¼æ°cïíÛÞçª>-ì;îÞ×ôÖÏÑèœ=ôý·;æaíÞ|~æÂ’z‡¢¿Nw­š°µ÷‡ ïhfÓK)Ks Ù˜ÎLB³nI"K˱'>täó_û÷?yäsíg™=~–öñ›ŸÁ7^ý¦õ;¶{é+Ÿ!;¤4쮑5ÈZCÛ}³îÔóð©êNœ%kvv×ÙZ>Çöõsd­Î‘ç·× ŸS~õÇîBsñl•øG·ÃÜî¹1c k.2³ôÔzÿQ½™c¿‘~½•÷ß©Ý7z>·Ad >Æ»_‹1晴µÁ€1ÆdظF”Ô±I][€ŠˆÈ×-ÏíÃÚâcß|Ç6¾ßZs×Ú}³îÔ™¥Ço9VZo“Öo®+þFûqç1£‹¦¼¡ÝÐq~øPu?…øØyÓMYs‘§ÿÜÿBwíeòÞÚäñæÒYš O‘5ßò¸‡÷ýÀ?¦»zŽÖâS¤Ía|S ÆZlœ@ÖœvgDDDî ïø:£ã1£w©Ý7ë^õãfe4š~+›YÄD–lf¢wsöwÒè6IßÀz˜G·½„‰Æ—¬ï‹ó‘SÜ|œµK_afñ±·ÝÖÎêkÄÍDZ‘½kí¾Y÷²“0Ý'á¬>³H}fñiWDDDþô‰Z§±Ö°³úêÛn+y‚¸qê®¶ûfÝË~ÜwaTDDDäAÍÉ·~ë·¾­6ÞVÑgžyæmuBDDDDÇ•Ñ[J0þ¨'DäÑoŸˆˆˆˆL*£""òz»c>5fTä~¡Ê¨ˆˆˆˆL*£""òºÃ¬ùƒ¥–ñãã1¦ÇšŠÈÔ¨2*""""S£? EDätD-e¼~èd]ÑñýƒQ»ÿyÕfD¦FaTDDXÆT©3„ƒ×ëÁ{ÆB Šª×:ï)Ëc"’8¹×Ý‘C(ŒŠˆÈƒ'XŒ3©€:œw`r¬-À¼Ï1Ö€2xºÝ]ò¼ ^Ÿ!IX“V¡UD¦F×%DDä··2jÝ÷Xb –­­-VW×èöºc°ÄècPdúT‘RàʽXlT``¬ÃŽn¾Åå«çéîö8uê4zF5°ÔUãLo½Ê/"÷ˆþ$‘’ïª[ko~¤<CNŸ«W®pùòe†Ã!333X@‰nz' "€Â¨ˆˆ< ‚7„PÝÆ™ OAIG—¾ÛäÊÕWxåÂslm_§5›±Ðn¡ëRÅtOBDFEDäÁdì(€ƒµc ªRZýaŸ×opþüy®^½F½^çÄñãê@yè |¹÷4fTDD¦Î„7:£}<9 U 5‚õÀ±ÍÐ )ü*;;;¼võ%νö<ÞÕyúôS,-ž…Ç5¬Ï4^TdÊT‘’5EÕ¿ËPb0¤dD6¢ßïE—.]bgg‡,Ë8qü8õ¸ÅÀ ‡ÄÄ“q¦Æ˜[n"ro¨2*""÷œ™T#TDÇ;(Üi¼‡ühç$X ÎBiÀ›U )–¯°Vxaù7øâ¿È±Ö{Éf»,Ì£=»ÇøM‚³ÀܨͪC{¨.á‹Ü;ªŒŠˆÈ©(`˜W¡´I“@àº[æÂ… ¬ol°¸¸ˆóž™™ææçɲ ¨ª q3¼ã B˜ÜDäÞQeTDDî¹0 €æ`etb\=ðuça˜¬‘2\gežíw¸øúëØh@£]cwS¯×™ï#‹g€ˆàêöÖcœs“ :¾L¿w©(¹{ô›&""¤Z Zq‹@àWyõµW¹¾¼L^$qÌìì,½^ÙÙYIÉ&ïÝ4¯ö±wÎáœÃ{¯ê¨È=¤Ê¨ˆˆLAUD¾ñXÑñØÐI­dôõÀ|" ˆˆ©±Árx¯žÿ7\_¾N”mpüTƒØÔØÞÞ¤Õ<ÍüÜ :s§€VÕ¢1XÊœ/ª…óC9zîfHõÞ«:*rè·LDDH†˜]V¸té"¯¿ö;»;ÌÎÎrüÄq²,£ÛëÒh4YXèдMÀã½'I¢úý!;;;ôú½IðŒ¢ˆ(Š&“™¼£KN‰È[¥Ê¨ˆˆL·ãŠèJè¤":zÞæ£ÇûÕËYgË8·þ \¸ö etŽ™v“Ùùyâ´K> xÚí™ÓÀŽ>®€4«&-õû]º½Ò4%Šê¤iJ’$c(Ër2~TDî.…Q¹/„àaÏâ÷ÆXŒ5xçðeI§X2<%C5[ãóŸû¡Œ wÈó䃔gÎ~” Á ›¸Â0èA·¿Á`ÐSP«ÏP«Õˆãï=eYÇ1q\}DêR½ÈÝ¥?ùDDd*Bx.8ü!ë{EAîsb2f¸Ú½Ê‹/½Äêê*­f‹'NÐl6©Õj¤iŠwžÁ`@»Ý&ŠbÌhöSWÁ·×ï³µµE¯ßÃÚˆ,ËH’`2£Þ9w¯¾ "ê©2*""÷^°„à)!KÀV•ÒqÅÔôp¡Ä³J“y`…5.òÕWÿ?^ýu¢Æ Ž=|Œ¬cð~ çcâÄ@¨³»]BÙáñ‡OŠˆª–B™àý€~¿G·»ÎÎîÇŽ?I’D·tÏûj²“ÆŒŠÜ}ªŒŠˆÈÔxç ~ïBóÆTMq‘Ú”}V¹È¹óç¹ví*yžÓh6èt:̵ÛXk)Šç<ƒAŸÝ]Œ1œ8q‚z­ŽÇÓÂn·`{{›íím†Ãœ8Ži6›ÄÉ­u™Âd!|¹»T‘)¨gí l4©ŽÀÑ'!¡dƒëÝ^¾ôo¸võ¡þ'Ï2² ›¹„IJ¢t‡š 9;›5݈ÎÌ Ú­'hp’®ë±¹ØÞî1ì¯S%6ñ,ÎÍÅ(Ú85iIäÞR‘©±¶ºª2ú´ú:.B0XLt3„8¶)ÌaX¥ÛíòÒëÿžµµuBý³:Ŷ¹Fi6è•}5ZÍÖggs™a·I«6ÏBû ÇÙ欯S]zl8“$¥VkG5‚8WíÀ4^Þio@‘»K×"DDä® £e‘Œ­n“Ç÷dÆ)q3 >Ðn·™™©f߯­­±ÛíR:7©z¦i:™Ao0ø}k›šÉ¤%M^¹7T‘7Í,ŽwJ2åèñäŸÚ-ïsn´á’Ç€@¬á±ô¹ÈÊîU¾òâ/òÊ+¯ðÌ7·0v‹Ù…Ö6µ¸ÒáC‰IÀ„ˆÉ·ë ·j¤ÅYæÓGIÊ“\»’3ØXƸY2¬Â¨É¨¥ ­l‰Ô΂7D!Æú­J¨È½§0*""w…1†}Ñ.€÷UUÔyF‹Ú[ †>}¶‡Û\_?ÇÕ+WØÙÙ¡Ýn“$†F³IšVk‡†0Ö`CDCä"ò"gww—áp8­%Ïs†Ã!yžaŒ%Šcܨ:š¦)q’`íÍÊçÞIK ¤"÷–¨ˆˆ¼iÁ+: sa<64=oÁß ¡0DÑEDÜÀáXwÏsáÒ.^û;;»Ôg78qbžÖ€$˜¤šÐDiƒ13T«“¶(r˰—Qæ ¢²C9l3ˆ!Ï xr¢ØÛ:qlˆL ”9Eî £""rWyï>ÂZ°1`ÁPíx4`Àö`›+7®pýúuºÝµZ¥¥%¨Ílâ½§ð;ÕÎH¾$²‘5k £=æ{½Þyk !0è(]I’I?¬½9^4Šõñ'r¿Ðo£ˆˆ¼eã é¤"êÆÒꋼ‹Q—(MÑÓWÙ »\ÙyŽë×—¹²öý¼ÏìB……óK1µÚ—E¾Úª3á‚Á’Ç!Ôôrº»àê¤É,†:ÞExh4©ÄF–$IÓ˜8³w¿ˆL¨ˆˆÜ5ÖTÔ3Ú#Þ(X®sãÆ Î¯œgmmžß¢Q¯³°Ð¡ÓY ͶñÞáŠb²5'ÜÏ9Öé}µ}¿×¨fÉÇ ÆfÅï ›‘µ7+£ÕÈ…Q‘©S‘·  ‡~<(쯈ÀFÀxÑdGLàE6óM^»ñG\¾r…Ý×±‰e~6¦=—0;ïHꛘ¸‹/Kòr{´-gu3$ÕD¨ÒàMB(gÈû»äƒZ4“y’xë›D”S|0Ædž8‰ª¾‰È}AaTDDÞ<Á{ŒµŒ—ä TUËñÒÆB’Ôx6Ý«««\ºt‰õõu¢™˜ù¹9掷hµšØdwß1œs”e‰±Õ,úq»ãJ©sŽ¢,q¥#n$dY6y¯"Œ÷¸P[CœÄ¤iJ’ÄUBfÿd ! IDATz§"2 £""ò¦yc16ÂàF÷©f­G DUXŒì:¯³š¯pñÆïráÕ ôý’´Ž§ÌÏyZs%µÚ@NQ–”nç=Î xðÆŒ‰ðÎãË„‹+ê { –9Zõdñ.—GÄQŒ¬1¤©¥^«Q¯gDI‚ƒ<Æhÿ‘iR‘·$btGJÊÒAȈ#0Ö°dlÛ¼~ý9.]ºÄÖàÆ:óó4[-¢¶#IbŒ18çÀz¼wäENQ8ïnÙ ÉX£í:ó<ǹ’(Š©×ë$IRíÄT:’8!øÑöŸqB’¦$IØ*Œª**r_P‘7/ØÉ¥îèå›c¨¥ë¤dÖ68Ï«×^å¹—µµ5f懜:y’¹ÅÙê’zÍc£ˆ`Þœ+‡ ‹!®t`<Ƭµ£ Pã-;ÊÂÑݱø¢A-’F‹DvKB05‚O0!&Š,Iâªí?M`¡Ä ™6…QyKJ²(À@–fÔG+;ôXÙXáÒµ¯pmy™AÀüÜÇOE,..eUÅÓÄ–8Š(ñEA^æäyNQV³èuÄÑÍ*k,>Tµ( ƒ>jõj“1E8F»5ª¢Y“&)6ª¦Ðk—%‘û‡Â¨ˆˆ¼ïÞlœ’ÆjçXcK+¿ÍÅ×/²²ùÖZ:§ë,,,О'M#\¨¶îL1¼Û¦ÈyapEDKd-ÆØÉ¥z|$½!ŽR6×û$IF¶@lg.#8 ¤aâ’$®Q«Aš¦ØÈ®šdEj1·=Q¹ËFEDä-‰bCf2ª Ý ]º¬ö/qñâ%.Ýx‘íí’ºeaaùN“V«UíWµZ4NÉq ó!eQPΕ„ˆãj©±6²ØÑ$#À;OpŽ¢((Kh4šÔë ¬ÈûÕRC5ãÞCœ$d™%IÀö¬[*"Ó§0*"ò f‚›;…,àÞøýÚ_Å67_YÝ/G÷R¢Ñšò%°å¯påÊ^[ùw¬¯¯â‹Ì.Ö™[J˜™ñ4ê)IÀÕÁ|H)C„ó9eQ’瞢xר¤M‰ãìh©'“ã}UõÞãKOY8¬Ÿ¡Í‘EóPf”ÃçqȱQx" qœÛ ð„à ÁLÎʪ2*2U £""JUª‘B¨*‰eY¥ÐÈV{ÉGvTUuDQÌxÇ÷‚’ Vw¯ð /°6¸Œ5†ãÏ1ßéPkmOv=Ê’ Kƒ²t óœ|pfHéJŠ¢d8â}N–e¤iB’$3žUï)ËBLEä¥c{{›8š­šà½¯ª¢ÆVµ"Kœ$7gÑã&cI«Ê«–u™6…Q‘ÑÁŠèQßR)½ù|U µ|õ›€Ýû a{ÕLt»‹ÇØ¥Äq¿Ç¥á%^|õ2¹ÉI›'8vì…c4›-"ó(–ƒÅãñ8ãpf‡Â8Û%/†ôûŽápHL›6É¢„4Nú× n@^lQõzJ'ôü€A¯Kmû/Òl$Mf)KGb Y–b¨.ùgIf=!M@„÷¢ô¤qŒªÅïuÉ^dºFEDþ”rÎá]Iœ$D’˜Ñ˜Î˜xôéPºêÒx§`b9½²Ëvo…Í­-^-_fuu0´Z-–æOsìØ1Ík ®LFUÈÑXOª•ÆÕIW–ôz}zݲZªUcf¦E’8ÊÒQŒÆŽYc1ÖP%ƒÁ€™ÈŽ–lªªžÆâ(Â{ƒµI’LfÙ8_UFƒú¹OèWQDäëÙQTª-;KJ‚«Öú4TûÉ—ŠP­ôf›$J€jìfW¹²z•‹7>ÇÊÊ ôHÓ6¹Œ¹ùyÚ3‹45²dªe” ~´Ð|¯àw)Ë‚Þ`“^‡<¯333C{v™Ö …Ûa8èQâKE£µF3†ý’AÏR)3õ©m…:>Äãðn@Gdµˆ$5ÜÜÿÓ–2xÌh‚“ˆL—¨ˆÈŸR6²D£EßójWO\pÞãCŸ4M©Å5 †Û¬o¬scýe®]½Êõ­‹ ‡C²ãKKKÌ/¶h6›à3Š<Ç=¢("²É$ð…(]Ižçä.§ßë³ÓÛ¡t%F“ÙÙj!ü½q\G¥Úàý~¿Úe)ffZÕD' Š"ʲ¤,Kâ¸Ú‡¾^¯OÞ»WçQ¤EïE¦MaTDäAtp,è‘cHØ0ŒpÎQø^UÁŒ‡DÖ›" ÖÙ,7¹´ü,—/_fs÷<®,‰gÌžhÐ^|œùÎ<Ö,!úÝ’þ  ŽúÔj5¬­*›ADËm†Å€Áp‡ÝÃ’F³ÁâüqZ­ÁºÝQ2 ͪpœç9qˆ‰âˆA?¥ß5”Ã9²¨N­ž`¬›,ã4^:ÊC­V#˲[§Õ¤%‘ûŠÂ¨ˆÈŸR!°oÍÍ$‰I%"“3`ÀòúE–——¹ºò ëkë÷˜ït8þÐ1fgg‰jÅÆ¼·“Äã}à}5NÓ—”eµÕg¿ß§?èR9Q1Óš¡=7GÅtw=y‘“Å$‰úh²¤Sð¢,éõû@ÆÜÜ<6‚¸Pm÷9®ŽFQT­e𦓀:©ª†ŠÜ_FED¾U)_ñ>X!5Õ˜ÑÂìàm Š$¤Xzô°1<Ç×yíʳôz]¼½Jk)¢5W2?_0׉Ȳ’²¬Wa0ÏF‹ÕÄ1D‘SRºAµ,Tè’üË`Х׆¹ö fZó2JÆz’$"ŠK|(ðaH醘²ëYôk {¶|ˆVºHä®Ìqn<‘©:á8Ž'UÑñ%y¨.åï­ j[P‘éSy€\–èà%hªEÝmDLx®ôÕØÐ$F))à t鱺µÊ˯|K—.ÑÍ/13ÓbñÄ3334ÛÃɸ΢,¾ú·ók,q‚Çù¼eYâC‹ @œåÔëYÝÅÁUKCÚ0‚  ìhOLI`HQ)òœ[›;ÌÍ-òÄãO%óäyN)`0Ö&:õ ¸êý¡€aH(ó&ýݘÌ'µ'1xKžçÔj5êõúär¼µvÚ>Eî? £""°½áª ¥7Ÿ«ÂgUµ,‹|4{Ü¥)- &¢àúð¯^úW¯\e»{€ù¹9š­ƸêrwZ½rTe4Äcq£q¢„Qر£=6¯ö™ßÙ²¼¼L¯·ÃÜÜÇŽÃÃpX-Ã4®VV»(yühR’7+¿“­@½ÇDUø¶¡ÚmÉï©rFQDÇ“KôUì¾vDäþ¡0*"ò  5·ìŸWû­3$Ž^UM»ÄPíL„”8.÷_æÕW_åå‹_`{{›ælà䉓t–Rêuƒ±èƒ ÆàBï –úè°ÕLy¢Œ]·%EQÕ%ôÝ.W¯.Ó¨ÍñÐSOÑ™;Ånw—a/!IS¬m0:ª¨†¸à¡ÀFžà#úý’¼_#‰Éâ%Œoã}Œs“ÉIišDZÖy@(ŒŠˆ< ¬±3®òÝ\ËÓƒ'àÇGÇÄ4CÉk›«\]••®l£×ëáÇñãÇYÆFøÐ¥ ޼èQ»Ým._¾L>ˆyìѳqS«ÕH’„² ¸²œ„¼IÞ³F§Ý³f§-1åœ#Ïs¶··)Ë’ë×—ùЇ?ÌÒÒyžÓÏwªÊe­F‘£m<®º©÷ŽápHY:â8šT>ó<Ç;‡ ·¬/Z}¯4^Tä~§0*"òVµü-уÛÃ_gÊQ»é͇èº/Oy0ovXËôé±á¿ÂµÕ«<îרÜܤÞ44›-ZÍ6õFƒF­Mšq‚‹ †ŒÈ$“aƒÅ„Wð†P8WMJŠŒÁÚcÜÞžúí½'Ïsº»Ž­!Û›%++kü'ß÷_P”%Ö4 äT;1>\00&`ãjÖ½±›ØÈáü, ä½Å®c°’’iÆ2=BT¶`Ðdž˜(˜ÑÎM Y–MåWy0(ŒŠˆÜ§¢¸€¢€<÷˜hX….“ ž!Ûìpeë×®^emçOØíîbŒaaqf«Ú£½^›¡ÑhÄ-¬5x_­jãêÒv°U(vå(BóørüÁKÞã½âƒ/ˆG3׃«++lln‚áᇦ(K’8¦,ªÅømœT—×)9Ìø8ÕŒzDäyAžçDÖROë“õCC-éd ‘‰ˆ¢ˆ$Iö­):Þ‘IDî_ £""糖ÁçÀýÉžñUøó“±¡^7ºëÇeÑd›( À&‘Ó¥¤äêð9–—¯ñúõ?aùúuåE:óKŽ™™juK²Ä¥n²~(GØPíº§à¹§¯ñ ª›±£­7CµÅ§ó62”e`sc‡k×V‡œ:ù~ˆ$®ïosR.ÁxBpUblõ5PV3²|À¸ 7, o‘’1Kìo°.‚`‰Œ%I MS-n/òR¹Oåy /wIâ„F–`H ôØÊ·¸±ý:kkë¼xé÷«ñ”É&F¹Æq&ÍÙ^µÄQZ-yÙ˜(²à˜¬ã ÀmæøŒ/ugËUÑ›Ûköû=¶··YYY¥ßëS«×˜››£=×&ŽŠ¢8ò>¬§ª‚újÝÔ0Z;4ø@Y–eAa2S˜ìüäG³í³ìæXRy°(ŒŠˆ¼·Ìš?PáïݲK=†„˜ßü­ßª*ŒÑ Úí6­V‹Ö\µŒ‘ çF ¾'1˜êò»w(‰ìh±zkGy0­j«Ëï·4j™ì!? vpàJG¿×çúõë”eI»Ýfii‰V³5Ù­iÜÆíìýys!`ìͰê£,KœsD‘ÌÚÿ^kˆ¬%Iª…îÇãEu‰^äÁ¢0*rWw¬mµX–ÔëõjRGQ¦éäÃùN¼÷7?Ä÷¬Á¸7Œî½¿·M-sã±–áè–B€`Ê*€šíê’÷d/vÁPÓ%gkpž••^zå7ÙÚÚ¢àµZ¬µE½^§Ñ*i4 Òš#N¡¬þ O0šL4 Áf\MG.õrT ãÿ¾·þñQm÷i&Ë8a«Ÿ“²(ÙØÜ`muµÚa©]UD——¨ÕjE5þ³ú™Ó“˜ŒÃÆ`‚£tï‡D¦ê‹+Sý‚îN ÌSêñ,i<‹¥Æ0ïc]µ]i²,£ÙlN~N˲œüÞègWäþ§0*rÛ{™qÊ3Ïo¦v3ç½Ø4~B’oðòŸšÚPl›Wj›šR/1躦nú4IÛr?ÍÉuÖKúƒqõf¼@ ðnÄh ðãÑîøF¿¿»»ËücF£@û‹º+Dëºf>Ÿ³\.™ÏçL§SnnnX,Ìf3®¯¯999!Žc²,c00Øßßg<·K¯ßF„]¯alik.›è«tÏ5¾{ÝïÇ;€H¬1,ʧ\]]ñbòwœž2Yüu]!ûÇlå=vž¤DjÅÂ\SU5•­‘RG‰k2¶©ã=i›÷ÆD¬¹š¶óߺ #œóùÀëmÚ˜îCIÅJ¯899áéS÷:ƒ>‡‡Gìí dÌjµjbãFJšàzÓ|f›ðt÷ c—hkPÒÕ°Z£ë’ºJ1U†d‹8É¢ihªˆãˆ(¨HÐëÅH§÷Ûr•O¼[1¼øX'p±5«ÕŠº®)Š¢#nùJ)IÓ”,ËÚexÿز,Y­V¬V+nnn¸¹¹áôô”³³3ž>}JEììì´ÿÓ?ýÓö¹}})ÜFEyÌ×´ú¬Çîm߆ÚSo¶µ_Ó©.¡™äb‰ ÃJW, >ûâS޹˜ÿ†ÓÓSHÏØÛÛc¸çb–Õ%eYb"CGH£"…jºäuå΢‰p’a¹sþ%]@Õt¼ëæ½òKþÚ”„ùlÎéé)Ï¿xŽT’'OžðÞ÷Þ£ßR뚪Z¹ºæœ´—¦fÌñ©ÓŽ…Ûî~wŽ-uUQV%ÛYFGÍ{ ܱjH¤sñ• Ð„h ðîÄh ðS×5ªuèaETUÅr¹DÑÙwÝSï !ˆã¸­!•R¶á÷ÆêºæêêŠ÷ßc Ó锳³3^¼xÁåå%Æþæoþ†ÃÃCŽŽŽÜìó¢pc'›¸ Z GÛiÄ‘°¥ûùN7ºÛ¬Ù1«o®(YºòL¦j>aÊ §öçóÓÏy1ýg–Ñ;\1:ÈI“¥®ˆú9q±ª0–X¤H+6BÔ„[†VÍñ9ái'¥mšwîÔ¬J÷Ç4ƒ 6óP…!’ )#÷yÐÍçFDkXÌWÌf3...¸šÌÐZ°½=bw|ÈöÖ.J*ê¹ûLúX%ÿ¶+yÛ¬eŒ\Z£’ƒE²lja¨úÈJSN3–W»ü/$uŽ^öˆ¤$•UY¡z–"OD·`7†8lþ=¼½1¼åxÇÑÿÂ÷°,]ƒ‹š^ŒvÝHÿóCâPJÉxÿâs>?ûO.'l´p d™K4HâžòBP–¥;G ZÇЩ°! RF®kÞ:÷¯P`97T¯¥'H%©V³ÙŒó³sNOO)Ë’ÝÝ]Ž]ç¼sSoãÄîŽ ½m¨³öõ›ˆ¬µí¿,YŒÑôûE»2ày?•¬×+Œf­Ò ˆÐ@àÝ"ˆÑ@àÆwÚû¼P´"ôe#C½ôó¾ã~{{›ªr4\\\´n©ÿûgŸ}Æx<æððÝÝÝvŸI’0ŸÏ×ÄÃ[•÷_B+F­Ê;£²‰X%*²(¦H7<ãdyÂGOÎÓ§O™UÿQ3ìGôòkâX"•A‹%u&§émPÇ¡ˆ›ƒðáö¾&uÙÜ®¸¿Þ; ltÓß¾Nc,¦ijKS÷Å¢®jf³WWWœ_œsqyÁ`0àÉ“'Ñëõ(«k„ë z}‰¼DåÝúz=ôÞá6¨5Öj°®¼C׊Õ‚î3,bl=@©kbÊmÂC–K¢XÑ=u°@à]"ˆÑ@àFA]×kKï]·^îJúÉKRJ¢(jCò½ëU;;;|ï{ßsâäüœ¥„lì IDAT/^p~~ί~õ+=zÄ|À~ðƒ¶?˲¶ àÛP/ê I!!V®zÓ’4¡H)S¦|tòß|ôÑG_|ˆ1šá®‹ÐJzçF.oÔ[xZûÙíß|YCÅ$q‚6šùbÎÅùçgg\]]©ˆÑÎŽ±½ã¾¤Ìf3”ŒÛ)`/s"M§[ÞáEémiG—²,Y.@ŸíÆ•` *+° ½¬G–em}r x· b4xÇéΜï^Ê{jè6ñŽªïÄ÷u Ý1£ZkÒ4eß-ÕqrrÂññ1çççL&~ùË_r||Ìáá!{{{N„uÆ•¾•˦ÝIEp§æÒâ ÅZ¸”P-.ÓH g¬XñÂü;_<{Æožþ‚óó3Dü‚íñ;{ IRƒ¢qÆ 01ÆhŒn„˜NlµOÜqh…w<»Îg÷òˉX!‘ŠZ{±XpvvÆéÙ)××7H)G=rB4Žbæ3—Î$†(öu¡º³×ÛT7þT·]õþz÷ú´kÆS[„qç£.ó¹FÚŒ^ºƒ¤‡° Ø­-1y^¬Ew› Fw_;×­ßë:¡¯r­ü¤¦Mwª+"ëÚ‰Š8ŽQJQ=b<s}}ÍóçÏ999á³Ï>ãùóçðƒü€GÑï÷Ûý¼«áQ!Ò»š”\èKÎÎÎøÏÏÿ™‹ósæú’,ËØÙ?¢ß/ :¡,+P‘Rn2‘4à³5}YÎüïèµ9h¬aµ\µÍk“Ë €«~ü„ñhŒ”’ªöÙ§ªuÐÛ×ÒîôÖµÆ`͆3ê? Ò]/¤h»ñªªf¹\R4‰²‰jr¥‚8‰)š©b!Ô>øvÄh ðŽã…ßšE݉MÝzÓÍÆkmÛ˜äo㘽½=z½£Ñ¨uJ}ÃËt:åððñxüv.§¶äÆÕ›…!4Hå¤bÂuyÍçgÿÊgŸ}Ê‹›ÿ+,Ã݃Á€¼_!åŠṴ́¢F  D†@RhϯZwe»³î­¯í8£›Îië ¾µ®©êŠ››^¼xÁ‹/¨ªŠýý}ŽŽŽØÛÛ#I·DŽº¦)ÚøeÝ´›9¦ÍT¥Ö­7n¯YÿäœÞªT”KI‘õ‰£¦Ê°"F£„$Žr²l€Rª-1 ï6AŒßºuž›¼Ì=òÔ»ŸÝÇøÇùe|¿„߉’Òe=ö÷÷999á7¿ù ———Ìf3>þøcþò/ÿ’ªªÖôW«ÕÚ>ºøÎnû׉µkÜsøø¦ö6?ûIA‰H&ÚM³zÖ„À}77=L‰”B×K*[“dŠ4M©êEóz¤‹f©ÜfÌç—Í õy§¾Fcêöý4M­ªŠœÓè#½ÎÏÎ8==e6›Qãñ¸°ä“”R¤IŠÒåÕÖ+ìZÐ[Qj^õ4Ú´ÇV–%e¹8³8!ŽcliB"mŽ­OjèÖHw— Fw˜W-S¾Nîg×íÜÜW7¯t³þÓõû[[[n™zg‡Ï?ÿœgÏžq}}Í_ÿõ_ó“Ÿü„ßû½ßcoo¯uU}ã•J©ö:/~¿ÎšS+@á <¿/o'+!4CÍ ´0À%Íç—ÿ7?ÿ?~ÎÂ~âêcG ²l†JnòY`¬_~v®°5ÒMk²>“3jô›e½öó¶›ÞÕT*DßvÓ¯;¤RÈrFA ¤’(©0Ö ë[±Ç®t2™ðÅóç\__“g9ìïïÓï÷×>àÞwÓ8žBº¥øæÙšãëÔ†Z‹µ•˵ë9£XÍjU!Ô ¥$ºŒ¸šL˜Osòt‡aÿ‘صƒ’)¢Î‘"&M Ò¤hë™¿éæ¯@ ðå b4xÇé6.uƒï_—î/óû~±û¬Ðîóuã£6Eežç<~ü˜Á`Àd2áÅ‹|üñÇóÃþßÿýßwy›IÂb±ÀC’$wrRïÀ_5B ç†JФ݄Ú7¢ AJÊS>þô#>zú!Ãá­üˆ^/'ŽÜòµyÞé4ÚPš)»\Ì­“øe…Ô«/Å]*•ÄÛ¦/ÜÜÜpyqÉÕä !ûûû<~ü˜~ÑG׺-↓øi_`Öô7EkMEhcX.—Ôºf0¸RmH¤3*ˆ”"Š£NÈ~¢À· FÀãsL­µíÒ»‚^¯×Ö’öz=~ó›ßp||Ìt:¥®k~úÓŸÒï÷Éó|M|úÚÕWå£~U( $N|j •«Ü²ºå’œQcùôôÿâÿúLëÿæý÷?`k_3›½5q‡ïË·Îß½ìÜÞ²Ñ-¿V3Ú8¢VÞsûmLÔCÈN—~­]´”ŠU]1ŸÍ™Î¦œžžr~qŽ6ší޹:Ñ8Š)ËòÎ~nÙÈm'<ùTã–ðE㊊͚QWS*¬¢® uiÑZ¢DA¬(9@‚`kd$qDgí¹ØlØ ï&AŒ7¦ÛQíëN»£A•R<~ü˜ñxÌóçÏùè£øÇüG>ùäþèþˆ÷ß­ÞÏ»°¿«é69Iƒ®o_S¤", ÉŒ'W®öúúšt;!MS”r Z~ý¢ùMé |7Þ „BךëëkŽ_srr‚®5Û[Û=:b<“¦éZ‡üýï‡mgËß›#Ê«]zW³jѵfµZ¡›ñ·iš6™¬·Ï¯”"Ë2²,£["êEwŸ FÀÓíÀ÷¢À/Ùûeà¢(ØÛÛcŸ4Mù—ùž?Î?ÿó?3ŸÏyòä EQ´BÔ7¦øý~ÝÂÔÒ,Í«•kQ Ð\SQsºúO~ùßÿÎóËfï{;G ÅGLæ7nÉXÆîý$%ï€ú.x“5už÷MHj&,!ÖÑöRÞº¢wn÷/àåy£RH¬hÆl¢©«Ú-ÍO.9?;çòâ’ÝÝ]ždY¶Öóu‹ TÂR«) â’šš û!³ þíÃÿ“(ØÚ˜ä’iy†ÌJ²8Áˆ]HÙ™¿v)pEá•”lㆊîý;—¯pDÁ5QIu›;[–%“‰ 뿾š©„íímvÇûäy’1RÖ`%ÚXʲLÛÄ´ŽŸ°T¹ÚÐN¤“;¾W u!ÒF˜ ôD¥‰ê‘Q™ a"¬Ñ`%I¬X ƺØy¼û1¼åÜ—£Øí<±öu-uwƒñ1MNd¹–IE½^¯CUU!„àƒ>àñãÇüÏÿù?‰¢ˆ~¿O¿ß'I’öqUUµ¹£ÝçëvpÙ×&hºÎnJJNNN¸ººâÅ‹üô§?e°Ëå]_Ó+ ’´Çjµºš¿¶ï×xo^ÙÿŠQß\äÝÈîþ¬uõ˜q·Mf——\œ_PkCÅ|ï{ßck{ k\§¼’$qsêk]£^ñü/ÃZÓÖ” a‘R`¬EŠæÐÆ°Z­(+å•$1JEÍxPW“,¥«#õ³„à¥ç=¼[1¼#ø%áßF|}Ýõ–^ o>^Ho6: !‡H)ùó?ÿs~ùË_ò÷ÿ÷ò'ò'tø¨ µ£ ÆÜ H/HMeÚÒˆÓÓS>ýôSÎÏÏIÓ”Gqxøˆá`©d#ü¼£ë×õF¥ÖùlkCu3*U7–6œQ{ÿ— kÚX7` ÖTsuNOéÇûdÑiu-ÄÄ‘$ÔZœ“Û¯iç—œâ@ ðNÄh øF‰¢¨­½ººâòò’ÅbÁÇL’$>¦J+HóšZׯÞÑ7€±Œk0’"jÊœóèÇ««+NNN8;;ÃZËîî.ï½÷»»»®6T¿<'Ôøˆ¦¶}½s»±n±¾ã¨véŠQkmSáœR£]qUº/½<§èõˆ¢­]BCÇäYF–gøA`­@nËÀ»N£@àÅ7> !xòä ½^¯O?ÿùÏù‹¿ø 꺦ßïEQ;×¾;ýéh ÀHÔ æ\×..Ÿ±\]’o Ô:2`“¹éZvjFÛ™ñ Kwºá_v»|øñ ®RA"”h–Õ UU1›ÍZ!:™LB0ÚñøñcöööÈÒŒªî6ˆy±yë€:á×äˆ Ý^ïhœQ³)f¦¢Æ`kE]+ª2cIÓ1Y²‡ E×î¾Q5K÷)ª#FµÖ%B…nú@à[@øZ¾QŒ1Ìçsʲd{{›Ÿüä'üä'?¡( .//ùè£xþü9³Ùlmi^5:_EôSBBIÉó/¾àüâ‚4M‡ÀÛc)…«íÖŠÖuÍ|>g2™´¢¾®kÆã1?b<“e™«Ã­5ÚèsBM+Hׯ_»î R?ik-ÚŒÖÔUåjr›ºÐ(R­ØH’„<ÏISˆšjŒÍÚáWÕå·ŸàŒ·ã#é÷û¼÷Þ{”eÉÿ÷3ŸÏɲŒ4MI’äÞ¸«ßQc­AsdÜÔÏøäóãüòS†Ã!ƒaLY_c˜»%ha§3j²…üŸàÚè¢w®¦Ï}`ö<Ýý±±Ÿ¸3¯´“cÚñ„Pm÷¼cË<›Í˜L&\œ_0›Í(Š‚ƒƒö÷÷ɳœª>ÞåˆÞ?AÉÚ¦,âN~¨núéu#:ï·(mG8Zs+n11ÖÔØº#„ÙÂÔu©‰P$qFšÆ$ Hå\àv:—wŽÀ;Oø—¼£øœQÿ÷nöèïrœæ—Åä+¥Ú Au]³··Çþáòé§ŸrrrÂt:åææ¦}m¾‘©›sê÷·Z7§t£ CEÍÕÕ,—Kò¦«ÛÝv}oò:çõUÝðàrD…w7)î8¿%+(©ˆc—%ºX,¸¾¾fré&,)¥‡ŒF#ƒRÉöœH%QòÍÀ^E÷Xu]S5ïYÔ”WTUE]k’8i»úýûÇ1I’8!ÚéáúªÜð@ ðöÄh ð–ã—£»“ŽºË”o»Ø|^\ùefß-ç9;;;üÕ_ýRJ~þóŸóá‡r}} ÜFùe]¿uÏ•6÷"j¢X ˜15Ç\^ƪ:%N—d½• –©QÊ ¤jf$Ö8§Ò… F‰)£f‹›-"¤Páî'ˆÂoîzwß)·I¿¹ýa#$ Ö6.i3™I’`’>ø~±XprrÂçŸÎäjBÇìîî²··ÇÖÖY–­•7(¥\¨èÎo¶;××nó×ûû½Æ{ P7 UÆZ¢8ÆZÍb1ÖéÈ“Ç(ö±&%Vò¼ Ëz¨ÈõNyC¶M ð£JÍ»ûùްL¼£lºŸ^¤¶¹“_ÅRöïˆûºã»9¤Ož<ÁÃ'Ÿ|B–eüô§?%Ïó5xsUÜŒëy™‹&š?‹Å‚éÍ B úE¿K©ÔƒrëuF•¾îíBˆÛ¥ú6*ªq7f°K¡œkŠsO£Ž=??çôô”››¬µ öööF¤iÚfsúã×Zßã¶®wÓY6÷áçÍWuEY–äMšBEmªŠY–5£aoù¡û1Aˆß‚ o5½^þð‡XkùÕ¯~ůýkF£ï¿ÿ~{ŸÍ¡¿t}¿¨ª‘ÄÀ”éü˜«égXqE^X’´Â°@›VU¸v{¿œ½Ñ oUsÝCÝòÍŒúûjFÛºGÉœQëæ® !1$Iãúº''D#„Ô,—KNNNøâÙœ¡µfÐ0ÙÝÝeÐE‘›ÆT×míkB7',­ÕŒîÔŒŠÚM`zI7½í”NDJa£cÝXÒÕj¢¦—|@ÌSîL$ÍȲq”¢Ôº½Ë»ñ…+G늢HÉxDD‚©#7ú3Ð˶ɲ¢sºŸàˆß¿æ@ ðV£µ[†Ž¢ˆÇóäɤ”óôéS‹EÛôä…§1n9Ú×”>Œ¡4%777”e麷ã¤éònfÑ¿Eu·¾6¶®jV«777œqqîRÒ4eooÏ Ñј<ϨªŠªvqNBеód:qKëy¢Î}YŽèëlºù’ aµZ±Ẋ$Ir[+%y–ÓëõH~Cß‚3ÞZ|Qw èh4âÇ?þ1gggüâ¿`0Ðëõ‡mD”ofz™3j0Xjæ9óú ´¼!îí@$™Ï§TV¥=¬ŒÑµF çRX‰xÙìyÜW3ª€h#3³{?ë\Ñ&ØÝZ‹iœß²*¹¹™q}=e6[ EÂ`8àðà »ãCÒ4ÇhÐÆb­Àh#N„Võв,AÔͲÿíÌy†ÀbÑë5¥¬'9h„[FoœUéóJqÂaL&AC5K©f½"¦—n‘êeU‚QÄQN–öÈó¾sEM§5¤9ßZÂ÷Î@ ðÖâ5¥TëEÁøCF£¿úÕ¯¸¼¼d2™´÷õ4Iâ8~i¢€Á9uËå¥d3«]S×ÕƒMQ]ä+ºåáÕ‚^Úíß4*mͧ6šZ×,—Kæ³9WWWh­)Š‚ñxÌöζËHµ†º©{õçÄïËh7}ÉhWCj¬él¶Ý¾l7½5nÚ’T.œ¿*K–Ë%išºlQy›(©ˆ4M‰ã¡ü>¾Ô!w€àŒßr^¾Lýv£”Bk½¶lžeyž³··ÇŸýÙŸñw÷wüÑý»»»mœ¼:VIš-ʺbVþKó+â^E”¯(ˬ$Q» S„©Q€ðÿ]¶“ b»ÞPDû÷,H5¢5Þ¸]‚¥ÉíNXòû¡Í5ÕZ·ýÆ‹W<ÿâ9××K²,cgû€½Ý#ú½-1º²ÔºvñH¤ru›ZwD»’XY®÷Á‹Ûny·lFp·¦ÔFîqvýqFNÝÙ±5Z×ØÊ½_bµÇÕt…ž )Ò”mó'Ä×ÛØŠ(I\ÓR*hßFé Qç¼n~Žƒ—|[ÿšÀ[¢­mŒ"×äbŒ¡ßï“ç9I’prr‹/ÚÆ¥(ŠÚ‘—/ãFʲBCGD*jb\çw­õ½óÕ»Çöªcÿ2·{·R)E¹H§²t5®çL§S7>µè³µµEQm#—1®YIkÝæqvk9¥’ÄQüZS¢^FÛQÏìzÿ…mè=@/ÏIÓ´“+ÛÔ„$IZ½nM褾 g4¼µø)A>Àß‹)%yž“ç9=âüüœ_ÿú×EÁ£GZÑf­mÕ71ÂmKs†®‘q‚‘%º+’Z×m ý]ÉfÚõä͚ϖÎ,Ë.mNéFi÷.ÆåwŠÈ ºÕjÅd2áää„ó‹s´Öìì°·wÀÖÖ.Y6@©¦1©Éµmˆ¾Wu›Ýðf£&t=ºÉ´5£výö汋ÅâÓ $es¯©‘ȨJÍ첦^%äê ýdL"¶ÚÕ“FQLšÅä½”$¹}¯´YoL ßN¿ð@ ðVÓÖ;6õ›¾9)MSö÷÷9::ÂÃçŸÎÓ§OÛÇùf¦—¡”d±˜#„ Ž2Ö"…@6c3¿Éq«BŠÖ]­VœŸŸóüùsÎÎÎX­VH%yòä ãÝ1Ãá<ËÖÆÆ¾Î„¢;áMS7j¼`m6ÓlöÕT!•lë}u]ÓëåôûQ§¤"Ž#òÜwÑ»F±n— øvœÑ@ ðV³9*Ô/A+¥È󜃃Æã1}ôÏŸ?çÙ³gY2B™µÖ(•$®®Ô¿g@à»E£@à­¥+ý2½wG=EQðøñc®®®¸¸¸à£>"Ë2Æã1ÀKÝM!nQïÔYkR "ÕÔ«j¾ÉE¤ªª¸¾¾vKóçç¬V+úý>‡‡‡ìïï3 Z÷ÔZ‹®5Ú¬Uº_LÚ¶{Þ»6YÉ_ZÛu'ï»ÝÞ½Ý×§÷>é²d¹X`Í€^/§( çXPR7ôiš®•StK4À·› FÀ[‹ÏZab­¥ªª¶± `Ÿ››>üðC>ýôSöööZ1ú*ÊÒ9‡Q¤B4QHò5{6¦'Ý3[DÓ=/;Ýò¯ïŒÖuÍÍÔÛŸŸ1ŸÏÉ{.IàèðÈe«Æk5Uµrç¦^¡kT>Ê63â7sBÝuöÎlùî¦{ÄfÇ5Ö6]öÝ MIóð SIV³ŒrY ‘'dñ>‰­sT‘ÄIœ­%!ø‰M¯¯Þ}BÍh ð–³é }ké|ݨjê8Á‡ù|Îjµj—ëó»|õ–¶u<›­3¡©ûZüÏ^¨mX,æc‰ã˜,ÏPQDÝ>8 IDATL~Š£˜¼—» ûXµÏµö¼¡^4øNÄh xk1Æ4ã9ë;"Ü‹R)eT/ØÚÚ¢×ëqssógϸ¼¼h|ür¹©H+]}GÙ©ívÎ7ŽèŸÛM:‡TH"uëþ®V+®¯¯9??çììŒÙlFÇìíí±¿¿OÑ/0ÖPÕUs^\ç¼¥Ùìúf¨ï\×ÞßêNǼßÖ“nã67  •sa©ÂGRd¬1ó©BšŠôY|ˆ­·¨–˜!y6¦—îGÑú·‚@ ð#ˆÑ@ ðÖÒ?ݺO_ªŸÏçL&¤”looÇ1§§§|üñÇ¥èN=eUÕ¿Ût¾ô\ÃÒl6ãòò’ÉdÒº¢½¢ÇÞÞ{{{½ÀÍ–7¯®û¼_Hv¦¹ž´yßWäˆJ_aÖ¿$Xk)Ë’ª*‘JÑ èå¹;níb¹Š^Až§¨ÐF|ç ÿ ·–ÍNj/J½˜ôqO777”eÉxÙÀï¿Â"°¢aÚ¥úª´”¥¡.#„í‘%»Ù.±ajƒbH?ÒïIb‚+‚ o7~ŠR7EÀÿÝÃjµbµZ±X,HÓ”~¿Ïûï¿OUU<{öŒO>ù„$I ÄqÌr¹ÄZ7eé¾1¡¿k´q5”ÓٔˋKÎÎθ¹¹A ÉÖö{»{ŒwÇdY†±]ë¶vÖs¯˜lrDïD7­‰{Ó.Åw®t—bÝ%½7§´6ÔÈT„6.`¹\blFš¦M·¼ª]4W–eNX÷ÅÚÓï.ßüÿÄ@ ðÝ®u ]ª÷5¤u]3ŸÏQJ‘eZk¢(âÑ£GL§S®¯¯ùõ¯Íáá!ƒÁ ÝG]×ÈX¸®sÓ£iEVÛmn›¹ónyù6'´ë¦ ‘s87sDýìy_Oú@¯“pº¹¾áôô”ËËKªª¢WôØÙÞá?øY–!¤`¹X¶B¼mÊÚtDÙèF¿3[þövc-†U3[^®ßniœcÙü Û—ì.›ªjFÅDQU]3¿6¬–†Ä )ú}úé1=¨3¤ŽÉ}¶·wȨjÐÂèù@à»Mø/ x‹y¨ðÛØQ¿YÓ·µÝ®v/F‹×××, ¢(r³Ùó¼:IÓ´­½ÜD6ªê¶3½n3E7ÇMn;áïþÚí”ï^'¥lóLýþUó|Ëå’ÉdÂd2áææ!ÃÁÑhÄÎÎY–¹ÿº¦Ö×¹ÞÉÕ¯.CÝÎþm“Í÷¨®+V«àòQëªf6ŸQÕI’Pôûk#>ã$¡(zä=PÒ¹¢ß¢p xC‚ ÞbÖó,oCÌ¿MÜv~§£» u]S–%Ëå’ÅbÑΨOÓ”Á`ÀÖÖqSUišò³ŸýŒ››NNNX.—ÄqìÂóјjÅÿ7ô|D½¤ª‡’+`A¤,Ø a„IPf›Èî1@Ù>‘HQÖeŠb#)JäH$ JÆH!…Ëõÿ15²™ðäóD///[!: 8<<äèèhmòTWÀ¶¥ ´‰Ÿ "¬CÓ/ÜõFHŒ`}“%V– K%ȹÛÚ,RƒTáóC¡ó…ÀB‘UÄuDbb¢EB}a°W=±ÿŒ-û#ÒêÑò€Dn1>b4ùc6®æõƒ¨À·œ F·˜‡„ç·} “wæ|Ž(¸íÓé”étº&D‹¢ I¢("I„¬V+ªªj;™L8==ÅZÛNª¬ë²/ ×î⡤qÖ>èvï¾Û»·y7Ô_*¥Ú)Rµ®™/æ­ÍgH)‡ŒÇã6O´,KêfT÷9»9œ¹˜æK~>|7ýCçAJI–g!˜ÏæÌæ®éªßï3ôÛs-¥¢—÷ô$‰Bµ&tÒ ÔŒo˜® êvÉû뀶6t:R×u[#šç9iš¶!ø¾+½ª*´Ö¬V+¶¶¶¸¼¼äää„'Ož´û[ÚYš‘ÅûH¶Ñú­D!ì­#èkAMæºæ%8+Ï ½n—|wÞ¼¤·¯!Š¢Ö¹],f\]]q||Ìd2AךÁ`Àþþ>ûûûdY¸§—цÞ7Dkù M¨«ýôKö· Hî~ÚÕŒÚÍÛÁb°?@{kkâ8&µ”‹Šé)˜éˆAü>;Ùcru„® Ôy¯`«¿K?"¤¡ªÂVm‰Àfk ønÄh øÆè:»Ý¼M`mi~±X´]ð^ˆEÑLï‰Û¨º®Y.—­›¨µf4qzzÊóçÏ)Ë’4M]“©IÒ„4M]p¾µèZ#•sE¥jŽååZð¥H%‘B¶W¾ñHkÍõõ5'''\\\°Xº$€ÑhÄÑѣш8Ž©uÑæ•“ž¬5.)Ê8ÑhšËÛ@ûNq¦X£¯Cwþ|wŸÖZŒ6Ìg3f3ˆ¢˜ÑΈáp”UI*%½¢Ç`Ч—GhӸиiWB„º@à»N£@à­ ;²ÓO^Z.—Ìf³vÉ=Ë2’Ä È$Iˆã¸Í-˲y*Ëc išÒëõ¨ªŠÓÓS&“ 7Î’DC"Ùg¡u Q$"FÒÔf¾²šéõ]½º®1Æ0NÛåùù|Þ6`ùœÔ^¯ç^:ošóå¦HYëTó­sY5¢Ñç„ú.yßåsD…3E½H«vÿ>§Ôt„kë–êœÊV×[Ü\KXîl³]ü”Øö)ËtBžé÷FdYB$uíZÑd´ÒÉg ß5‚ ß(¾>Ó/×k­)Ë’²,Y,, „­°Ì²¬­»ìŽ Ïç,—ËÖBeý~Ÿ8Ž™N§œœœpppàjQ…›RIT¤°µsF#\‡¹T £¿„-JSs©@Hʲd>ŸsqqÁåå%‹Å‚8ŽÙÞÞæðàñxL’$÷N›ºÓ,­wëC7Ñö¶ûœÑÎÔ¥ûrD×—ûoŸËoUUQ-TuÅ _0éõòV¸öû}vvvè=„p{€ŠÂøý™àŽßq‚ ß8]AZUUb_UUÛ˜äkCý’¼ß¼#ê—òµÖ(¥ÚÇôz=ò½áœävâRS#êQÓ:£#êkC7sD7sFE鮫55›”‹d21º¶˜ùÿ 1†­Þï1L÷õ˜ÕjEžîq¸wÄhç)]~i‘2ÄJ¸Ž~£á×P ð'ü/¼#t2?Ó_¿…ÔÍäü&;îRÝãô#=}l“_f÷ ?yž¯-ÉûÇwóFýò¼Ãï6@)¥‡œŸŸszzÊ|>gkkËé,I’åvaY.äC×T£›Ñì—ŸË>ŸÏ©ª !D×ä›”|ǼBÞAÍfkËÚþ5WUÅÍÍ {{{<}ú”“““Öu´V …%}½Ï³ÉÿÃd²`÷¨GE,Sò¼‡ƘVŒŠÆåDZ”T"¬±hí–å5º}]BˆöýY­V\œ_pqqáœÃ,g4ñ£ýˆ4MBPUÖØ5ØŸÇîß5XëjEmr:­i–Â}=f3E ?]Ê;ž·Y°m%Bóxa\”­š<Ö)ÚH´µH;pç~1Nù ø—j ÷uJ"Sò~ñΉðbšxT×`…yitV ønÄh ð°YCØÍ˜Üœ×ÞuF¿é,Rþøý1K)Ûøº®[g³ª*¬µ.2(MIÓ´ ©÷u¢¾FtµZµËò~¿>Wn¡|ˆ|žçœŸŸ·Ó˜¤”(×íEQ3M¨ç¿·R ¬pbT6qMB¶)ÖÝG‰‘wcª„tœçç眜œpssC’$ŒF#ž~©?MS†Ã!ÇÇÇS×5iÔÇPa‰I¢>IÔ§®æ-›:ÒÄeŒÞ[3ê.­½Õ‚RJ$ëù¨B tíbœŽ9==u£>‡CF®a©ÉõÍD÷9¢m³’¿_žo²§,º¢·µ£¦›3ºY3Ê­ké¿ߤÚQ¥"¨Ç”ó)Ó‹ k-ÛÉÿ`'ÑC¬±Hròl‡ñè€á0GX•!,*Џ[cDh p1¾6º“Œº¢ÒÃr¹d¹\2N©ªªm8ò±MÞ ¢èŽõõuŒÝ|ÒÍç÷“š¶¶¶øâ‹/˜N§loo·aîY–‘eY³O'Ú¤T® þ õÖXçŒJéîmÚ®þ››.//™L&ÔuÍÎÎ{{{ŒF#z½^#øÖÅç}n¨®ö>­íD. ânüCÝòަ@4B”îcœ°®«ŠÕlÖŒTuçjÐeQ!cÉv¾Íh4¢èç¨æ´¹÷ÿ5>(@à;M£@àkà ¿,ïk(‹E;ÖÓ»¥~Æ|·kÞ/ãwÅ«oXªªªÝ÷CøºK­5ý~Ÿ<Ϲ¼¼äâ⢣EFžÉó-&—sªl®ò>Wtóõ„pÑDJ6eF£µf±\°˜/\¾éÕ!;;;²··G–ekåþ|mº¡]¡ºvŸV„6“—¨šÀûÆ)õ]õÍõ­#ÚæºÇëVèVíþ¼#*•ÄÖ}V‹7—9Ú¤ ÒŸ±µµÅVü#„Húl ·8ï1º K+­C „”€Ï6íž¼àŒG£@àk£Û âÝͪªZQéQ?ÚÓ×OúÆ-_êÆg.˜Ïç¬V«µÚÓ—5Áx¡:ŸÏÛ:Í““NOOùàƒˆPä3 ÜvÑ7J¯[sÛvÐkÃjµb>ssç}ÃÒ`0h',9ÑvÛÜ´)47ЗÞGÞ:¤fí>¦­kΨ]wFo÷kÚýt§+ù”Ý ØÚÚb4‘™€°½½ÃÖÖ±””º¢ªjâXI÷+F‡qŸ@à%1¾6ºÎäb±h»à½Ëó¼ëéE¨ÏõbÔ7*usDµeÿ‡ð·O§SŠ¢`4q||ì"SŠ˜ #™"L†Y¤îc­D…ñ‚T4ù¢6!Á¦Í³xÕ‡öW,–3¦Ó)777L§Ó&Ø~ÄÞÞ[Ãâ(¡Ö5º¶©›"ÝÊŽSêò§Úet/.Mãxè¶fôö>Óî¯uZ…¯7hš¬|ý\ºšO?NÔ('Xëe]±¼éaLÆVúczEA?~ŸÄöÉÔY–1îï‘ç9ÆÔT¸¸¦$Qî5Ó›š'r­#º‘k¾³1¼ÃønqXovù]Fæ<ôüÝŽòÕjÅ|>g6›µ5œyž“çùšífŽú|ï†VU…ÖºÍõ®h7Y`“8Ž1Æ9•ý~Ÿ~¿Àåå%ËÅ’"/ÍŸ¢ß'RŠÕjA­5YžbŒ¾ ßѼƘ6ªHÝ.ÏÔº¦l"§®¯¯±Ö’ç9ÃáÁ`@Gk0z=·ì!GôeXÓÑûÝ[3Ú„ÞkS·%.œ_RU5U]±˜/(Wy[#Zôû¤2%н4g{{›íbÛ½ge‰†8ˆ‰0ÔÔÍèÑ0a)¼Œ F·ïîuk#}¡v^¤k"m3ê髦‚~~f¼¯÷¬ëºÍí÷ûm£R÷¸Á‰§î$&­]¦«Ýñ¡/ë¦ïŽ•R’¦)Æ®¯¯YMK¶òm,9ÉañŸE§<ûä_8Øê3å\N&(«‰ãˆ °Æ`LŠT ‹sF¥¨0‹F¬ÄZƒ4%"b™±ªV¬®$‹¹Á–Yž1L~LžçôÓ‘eEö„A@‘o“¥±t©ªòŽ8Kò@à·#ˆÑ@ ðÆ´µ†è&/(}tS]×mǼ_šï:·¾ié¡Ñ/SfàhÇ­ËYE;#^” k,I’°µµE–emÓ”§+j-Îõ5—eå\Ü««+ÎÏϹœ\G1£Ñ€ýý}¶··Ûòïƒs ¥”n1ÝvD¦¹Íí>w×qtµ¡·³î0kÝq²é¸š¶K¿®*teY,—,抲,‰4Mé÷ ‡CŠdljÒ|DQ¤qŸˆ‰ í@à+!ˆÑ@ ðÆH)[1 ´ËëÞÙ¬ëš4M)Š‚^¯G–emv¨ŸžÇ1Bˆ{sD7ke[¼«š$I+‹¢`±X0¹¼Æ¹x ÖĤñ€íí}zùÕJ³X”D‘BJÂ"•ë|—Âåpj¦Ò,æ®cþââšù¬DÑïÙÛÛcg´Cš¦TuEUé&!À›!-Öh— êk`ïßwƾš®cÚìÈzѼòö§ð¸ý8Oa\­5Ò5OÕ…K6¸Ú¢ª*äjL?Ž)Ò÷Ø)vØîÿˆA1 Ÿ=qÑ[ÙYœ7ÏßÔ¡ ßÑ@ ðf1Þ˜nür¹d>Ÿ¯5*õz½vó5…>²É»ž^”¾IŽè«è–xqÛëõÐÚèsh¬!'f{k» Æ¿`¹”ôû…sU%›å~'µÖ”eÉt:åêêŠÙtÀÖöìŽw)zZÓyºOš¦ÄÊÅ_ùçДëHÞè½ O£À[N·CÞÿÜÍóÜìF‡õ¸£7rÝ}ùåx ‹Þµ\.—Ìf³¶FTAš¦ôšîôûr@»‘PÝiLÞ1õÏÕ¨zÓcï·‚8Ž©ëšù|ŽÖš8V!±hÒÈ5Y !˜Ïf0£¤DãF~ŠN­hUÕm£–ŒÆ#†ÃaÛ4M­©Èf)Ûhƒ¶.ÃT ï€Þº¤›.è&¾Æ´‹TÒ W©Ü2¼£©êšº®Ñµ«ËµÖSdYÎ(».ùx—¢ßgXlÓëådQ…B5­Sc5¦í©6 Þ F·/»‘Fþz›wáV¨¾* þuñâ0Žã6ïTkÝ>w]×\__3ŸÏ©ë¥TÛ¬ä—åëÚ×¼­-õËÅ«&¾Û5ïïçŸëˈi_ê—Ô}£U]×Ìf ´¶X$‘üÿÙ{³æ8Îóüû×O?½Í v€»H‰¤hI”d+^ÊIìzãWªbWªr³|€|Œ·Þ£|ƒœûÄ•Ê?eÇKœäÄ–dÙ¢ŠA‰$@¬³÷þô<ž!ÀEE€¼ª©Ó===ÃÑ5×sß×]'¢¦Á‹.óÙ§wétÖGMY5DC’å„qþ ¢Óéríê*õF™éæhMÏã:5ò<#I“²Y(Ï“òõÉÈ(ê-³¢n4Ïɳ=!šN¸ÁJ©Q3Ò¨1IÙX¹&ÍÒ2ïÔ΋.ÿ,ÕdIJ–áõáÀ"MÒ¤p0µ Š:^·˜ ´Ø|¥¡Î)jµ:×ÂÑî( Ó¶ˆ°R¹MnæÌDô^7½ÔŒ ‚ðù1*‡ãî”'jDçXà??*¦SŠ)J“¿W£›|ßÇu]Ç)»×Ȭ:¦£¼êˆV³J«ÏûËÀˆQÓ UÖ¬&)q“×l[“d)¶² ¡V«3è¥ÄqŒ§íbtgVLMF1ÝnN'dgg›Z½VtŸ74šQiNš'¤Éž˜65 fܧùÒ`—AþE,V®rÔè>EZÁøko¦Bå™5ŸÅþSŠ/YšÇ i¬FSº¨ UÞ¨™l†©©)f‚“Ô‚€¦=OàûÔí©"rËrGç¿ì‡Â2ʰ&ʤlT„/ˆˆQAĶm´Öe]çä£v»Mš¦A@­V£^¯Õ‚æy^æ¥Ci:ç«ÍJƒI!^ æÏ2¹&Ë)j"3ŸTÙhíS¯O³ùE³R–`ÛçCúÃ>ín‡ÝÝ]:Ý„4i6i6›4ê-\§†eÙ¤YNšæd)dÄ(K‘òEsÒQÍg::ŽdŸãTXdYZžÇj-išfX™…eÙè|†,ÍHB‡DÃÂ-OãÂ)uíÙ¢©¶XˆÐée¦§[LÕ–q—s(¥p¬©Ê‰ƒ<Ù¢ÊbÏøñ)—ŒˆQAî‹qM ¤éxïõzc¢žç•®hµ[ÞÌ7ã=5]÷_´¦õaŽÏeTe‰KÞYŽ9¨IŠ£fffØ ¢("Žc,ËÛJ>ìƒvæææh4ÔkM\×¹•ÙÞs³Ì²|µAiï’—MJ†j½¨qB³‰² •›¦°¨¨_õ·i\Lµ²(òBçg˜šš¢Q_¢5=M³¹HÝ­ãÑÂF¡GËüã'íñ¼‚ û!bT„©6¹®Ë`0 Óé”KóA”]óÕåp  Á7÷UGt8–QK0¾<ÿeS-aYj‘e…{i)MG¸ºÆLkÛÛ5†ƒ»ßG;š0é1t w‰Ó>¶S£V+„khŒô³²I¨x\#,3¢‘R°ŠzLã:NŠR­mlÛ+K¢("Ib’$ÅJ½¢1©í'v:ƒ£mê^‹Zx‹4 f§ÏÒl6ñE‚Z GM¡PX@šeX¦V×*b°ÈŠÑ¡jt(£§`m"OTt« _£‚ ˆi”2b.Š¢2ÌÞ÷ýbBO½>ÖpTí¾·m» ¸7®h†eSÓã¡@鈚Dzm»ìª/#“*Ui’y£3-üÛ>½~Ÿdw‡ ¨1̇DqDše¸®CÝo133SÖÊZì5…bÂR–gdùxïÞ¸Ï e)l[—ÛeÖ¨Ô8¢™"IR’8¦?0ôG篣yžã%³hÇ¡ÔGËð'hÍ´˜ª£V«áÙKØØhf á‹"S«k ŒjZ-\ÊI¥Ò0/ÂW€ˆQAÄ,kW§*Ôëuêõz™!Z¥*LÍÅdˆ†aHE徫ÑT‹ª[{O*AšQ­žf)6Íú Ód»ße˜ôÉE¤"Ò(Å!Çõ}ææf™™!Ð9YÚ/&Ág9X X ì +Ëɳaµ¤L7}BFNŽEšƒ5,De«Q@~N’Ù£iF=â8&É‘¸Îñ]ßmáû>-ýµz)¿«Ÿj,S¯7ð™ÅF‘R=š. Î òTê`[à꤈¶Ê“J?X#»öAjœÑòvé¢á‹!bT1¦{½ÚècºÓM}¦¹ßAL °GÁ¶m‚ àîÝ»ìììÇ1Íf³XöõýòxLdR5Îi²Ô<ÇqÊëjDÔ~˜çzX}Ðßã8.Z×uq]—(ŠŠÆ,åŒmgÛ[Ùä丸µ0r,Ó TQƒ‰å“ŠZÓÔku4.I’’el`t¾-•“¨R‡˜˜4ÍGYªñÈÕdyư3r‹c›8‰IâQ7üèœh0±—— IDAT·è¸÷¼¢~¦5ÅìÜ­ú2A- –}­¨ÛUóhËÁa ‹œœ˜¤h˜"ÃÊ4¦j@Y`iÐ6(«xÍ,4Vš‘¥ÖDƒ8¤‚ <^DŒ Â!ƈÌ^¯Gm$ŽÌ$¡V«Åêê*+++ ƒB(M`òUúƒI桜[Y4jMT¦ÈºQÒ£›òñID&?Ô4A¥i<:Ž˜ÁpHÔ+IJ›Íaë;›Âµ,|ËGY–jáºÚiêµ:»R|¨­P«×iÔë8lŽœOk$B­QMª=Ê-5©æœT®söάXÂWjü|Þ+DÇ÷7*¸AøÜˆ„CŽƉ ÃÁ`Àõë×Ë%³ô}¿í?¦ñÈÌx7.c5oô~Tï3ÚÉä°FQDš¦ÌÏÏ“¦)›››ø¾O¿ßgnÙ| Zh[“àáÑl6©×j¬ouÙÙÞA¹;Åóöú([•ù ƒH‘fÙ=böžWÑ8•cÛºÜÖuë…Û™7ÑZS÷iÔë4sÔ ·ÿ޵TÔà2W8ºV [+´2’M̈7bÑ,³ïîMy‚éô·*»8hA„LjQA8ĘÆ㊚ۖ——é÷ûloo÷t#ï‡YN7=é´ÞOlšf%3Bt?g“9®ª¨6S™Ls•­Ìãçä¹Ô°ðiz§XœpûÓÛDyŒ•MaåVØÃR¹*–ãkù–²Èö™ÑnÆ:ŽÆóŠQ£AP£xºH!˜vp]Çš*&]©ÇqÐÔQh`šÂ¾´÷v< _,»…¹iôÝ>yš'~ÏÍïîg¬‚ |9ˆ„CŽR ß÷KÔ÷}¾÷½ïñÍo~¥®ë~aÁy¿Ç6FfÒ“i8:¨)h¿}„Ùöq Òê1ƒ²¼`mmV«ÅÅ‹IF®bFU„YnÀòÒ2ŽÿF1rÕÞ=¡nñü-p\—Z­p0ó{œQ°”5ªEUØZãhm pF?ÏRMˆELL”Ä@ŒV¶²!¯ŽÌ¤—ìñõ~ ‚ |%ˆ„Cމ'J’„(Š˜žžfiiéIÖ‘fqq±ŒtÒX£IñeùX¹ËÃe™¥ùæNõpT‹Ù'£¨µ-‹y4¨Ýç÷0Kꑎºä•eaY ÇR8Ú&'# 3â,òÂb¹ßr±”…zd'Sáp"bT1¦éÆŒål4cNc’$÷­ß4KŸ·n´:)ÈÆ›%îj„ÓýºÝ÷k^ªò8—é“$Á¶m¦§§ËÚÚz½NÇt»}í wä.æ£ç§HI×rÁÊFnd>’99Œf¸GäÄ.æ$&SöM:ʵҢÞ×fô:ÚE}®5jJòæ†?Î4A„¯£‚pˆ1ËÌžçÑë“xLÖg§Ó)éÃÊêXÌGÅls?ö~Û$V¿ÊåeÏóhµZÔëu6;›5•YdYÑBÔr´g¡;ëmæ[¸Âx¯aFΦUˆNó l{¯ç]©b¶{žÎgu[(îg1º½¨(ï“¶K“b?ªpF­tT*aJ$ÒÊÞAŽ."Fácj4¡SaÒétøÃþÀµk×hµZeDÑ~TCïM­çýã íMÎ(Œ»©FLÖåâ0 é÷û,,,°µµEE?~œíím\×å¯þê¯XX\$=8‰I=—^?á~û[l[“Ä)i–a+v´m£§œŠÔlø£éHAÐh4¨Õ5úÞS 6 3Â0&Ïs\ÛÇóÀÑÀHÐ’@œR]8¥Xf‡ÆI.Sçç)Ax숄CŒÉç4ã6“$áÎ;¼ùæ›\¹r………ƒaî»ý¤Z]ª¯.µÄýÜÔÇ9Oþ˲,|¿ß¹³³C­V£ÓéðÑG±´´ÄŸÿùŸuy h,Uœïíí Þ~ç÷ìlïÐíu‹}áb+…²JÙØV^̆Ÿõ |Ç.¾0LMM1Ýšfzzš©©)Z­Aøžça+‡Z ¨E-m8ÌGKñ6:/ÜPKƒoJQMžè=HÓ’ O"Fác¦™éKžç•näòò2ßøÆ7˜››;p“±0^ï9Y7z¦AÊtΛ¬ÑêÏqZaj\Ü,Ëh·ÛÌÌÌe«««8ŽÃÉ“'‰ò ¶56Å´«4IÙÝÝåG?úÑ(ìŸòùfYFž&…SÝ»K¯ß'cçÂV6Žë0Óš)DéL‹……–––XZZ¢^›Àó÷íã⸨1ÕZ&m ‚ðl bT1f Ý4©!èº.Ï?ÿ¡P%gT„#ŽˆQA8ÄW3Ïs°=‡´Ûí²!gssó¾û0ÂшQÓan²K‡Ãáîhõv#>Í~&…íaÄ_Åß¡ßý~¿<yž£KY âÁèÞ95¿†Eáx75Šb’8&NBÒ$%ÍFMe¹F)'+‘²l4Ii$H=ÏCìMÛÖ4ušÍ&'Nœ C†a›~ÀVû.wnßáêÇïsõêUíqæ¹3©¿›c3ÂÜ÷ýRàèALåh[3 ÐK’$e)Bžçeš@–޶Ò[ÙcÍQ–ea¦„V &¢(BÙv ¥¶ÖhÛ.os\— ¡i6›åÈ×z½Îüü<ív—Ý]nݾÅÿù÷ÿÃÒâ /½ô¯¼òJ9ì câ8,_S¥ÔØëqXË'Aªˆ„CLÕ3N¨©÷Œ¢h¬ùH)UŠSSÚívñàÚµk\¹r…W_}•3gÎûµÚ˜ó9I’d,LF† ‚p˜1*‡˜ª04‚ÂuÝrÖz¯×+b´Æ²,¢(¢×ëÑï÷ §Okêõ:A”5¢UyМz3y) CƒƒÁ`,Æé°vÏÕT郰m{ìïÕŒVózi]Ô˜ú¾ëºåëT«Õ¸tégΜauu•+W®ðÎ;ïðþûïsáÂ.^¼Èo¼1VÆ!¯ G £‚pˆ™ŒVÊ¥ö,ËèõzÔëuÇ!Ïsƒå’ôÔÔõz½\¬œtHÍã˜:Ñ^¯Ç`0Ø zŸUÂýÏÃdÒ@µlÀ¶í²¼vÆõ®¾^FƒÙÙY¾õ­oqñâE®\¹R^Þ~ûm†Ã!‹‹‹œ>}šV«UÖ§>Ìñ ‚ DŒ Â!Ljßä8®ë’eý~˲H’„~¿O§Óa0”"fjj ÇqÊÓj­¤¹®ÆB™Æ¦ápXº«&WÔ8§UA+.éƒÅž9w“¢Šó_u5M:€i SJrJ;¸®ËÌÌ —/_æÔ©S|ðÁ¼ÿþûüÛ¿ýËË˼ôÒK¼üòË?~¼ÜŸÙ—40 ‚p˜1*‡Sch–ua/#´:š³×ëq÷î]ºÝ.A055ÅÔÔÔXލ8¦Þ,O6,™iE½^0 I’¤téª÷5"çY¤ZY†Õ²‰ýÆ´šßN§Sd’Þ¹Ãòò2³³³¼òÊ+œ?žý×% CþøÇ?²¹¹ÉóÏ?Ï™3ghµZÝ%‚ð¤1*‡œ<ÏÇfÌ;ŽSÌN‰ÌÁ`@»Ýf{{­5­V‹™™”Reç¸LÕFó³¥I’”MQ¦{>I’½‰CûÎI§õ0RM 0"ú~Aÿæ~Õ/“9®“÷{1^ó°w>ML—ÙŸy}”Rôz½²£ee…$IØÞÞ¦ÝnS¯×™››ã‡?ü!7oÞäÍ7ßäúõ묮®òo|ƒË—/—ï ,ð®ë²¼¼Ì~ô#®^½Z.ÝôÑG¼øâ‹|ÿûßß÷õ<ì£\Axv1*GÛ¶‰¢bÊÉ™ÜÜÜäܹse×|½^[š75ˆ“ŽÜ~óÃá°tEÍÒ¼mÛcŽà~cGsƒLUŒšß?¯3jxõ\>Œ3:ù8nÝo;ó êž*¥p]—<Ïét:h­Ëˆ§“'Oâ8ëëët»]Þyç¶¶¶xùå—9þ|¹ßÝÝ]\×%‚N±Ax܈„CŒ™–dŒ³Õl6q]—›7oò½ï}(Šp]—Z­V.»O 1³L\ͺ4.[5GÔ,í?Ll‘ðd1aþÆI­×ëœ>}šF£Áõë×¹qãwîÜ¡ßïã8Ï=÷–eáy^Yšq˜K,Ax61*‡˜j½ŸÉ…b>}£Ñ`}}<Ï©×ëcy£F@V—£M}hÕÅ3ÁêÕf%#D«Û ‡“êû# CºÝ.õzZ­ÆéÓ§i6›¬­­qýúu¶¶¶xå•Wxã7h4åÐÇqžäÓáGĨ rLt“YR¨×ëÌḬ̀¶¶F¿ßÇó<‚ 8°ÑÆhÌRµ‰p‡DQTnû¬wȪ_0â8f0†!µZf³ÉÜÜÓÓÓ\¹r…>úˆÝÝ],Ëâ[ßú¾ïãûþCsAxœˆ„CNÕé43Ókµóóó(¥ØÜÜd~~ß÷‰ã˜8ŽÇ:æÍ>ªBÔ̘‡¥€©.Í‹#z40õÀf¦}µö7MS‚ À÷}Μ9ƒã8lmmñ_ÿõ_ìììðío›¥¥%)Åá‰#bT޶m†!õzÙÙY<Ïcccƒ ¨Õje<“ã8c¥S'†a銚'­Æ…}؆á«§šë8N9‰Ë¼¦NÛ¶YXX`zzšëׯóÉ'ŸðÖ[o¡µæõ×_gyyùI? AžqDŒ Â!§ºd^u;ÍèÇ Nœ8mÛìîî”ãB±¦%㊆aH¿ß/›_&ÃÖ'ÿ¨²ßLøjgý£<·jœÕ~y£OóeÃ4ž™}#J«_$|ßg~~žápH»Ýæý÷ßg}}ø‡ûÒëõÐZK© _ÒF)‡˜êò<ΨëºÌÎÎR¯×Y__gnnÇq‡¥¨ ¢žeÃán·[ŽúœlZ2?Wㄎ2û‰ÎÏ+'éa¨·4B²úš™îzózš\Òf³Éââ"SSSìììðÑGñÏÿüÏ|úé§åþ&§uI¹† qFáS~TWE¼ÓÔÔwïÞ¥×ëQ¯×±, ­u e²BÀ0®¨‰qšt÷ûù(ó0ÎèÊ­ýâ²ö{œ'ÁdM°Áülêˆ-Ë¢Ñh”_2Úí6üêW¿â7Þàüùó4RØš/AOúù ‚ðt#bTŽ“AëPˆÑ3gÎpåÊnݺE£Ñ(Cïã8.·³,‹4M‰ã¸tDMä“ðtS0e„·çyLOO—×ü1ÿó?ÿC§Óazzºlj2ï*ÂãF–éáˆ09z²ÙlrâÄ ’$auu•‚ ›Ôd¦÷ÄqL¯×£Ûí2K¡!‚ôéÆD?™÷Yºw]—F£Áìì,'NœÀqVWWKQ àº.iš–Ím‚  £‚p¨6#U'*---155ÅÚÚwïÞ-›Nªc$Ã0¤×ëÑétè÷ûåòüAÍ8ÂÓÃ~Ík¦N8Ïs|ßçØ±c\¸p­5¿ýíoùÿøºÝn9vTjFAx܈„#€—“4›MNžyž£”’®zA;"Fá`¤Á,¦iÊ‹/¾HElnn’$I)HµÖDQD¯×£×ëÑï÷I’d¬ J„èÓMµÃ¾:ö† ‡C–——Ë/6¿úÕ¯øío[.Ù ‚ ß/£Ô\WÅÞadòµŸÄˆJ“EƒÁ€ ˆã˜ÿüÏÿäòåË;v  ¦ÒÜ$—Åáýá¡qéÒ%êõ:ï½÷Ÿ~ú)ƒÁ€v»}`㓠쇉‚ªÕj4›Mjµ?ûÙÏøðÃËû$IRºÆ€¼¿AøÂȧˆ qò<çÅ_daaÕÕUnܸÁîî.½^ïžÆ'AتKì8A055ÅÂÂkkk¼óÎ;¼÷Þ{@Q[êºn™e+‚ðE1*G#6ççç9sæ ·nÝbccCÄ‚ðHT§4™P|ß÷¹xñ"ü1?ÿùÏY[[Àó¼{ÆÉ ‚ |^DŒ ¦ÙsîÜ9Nž<Éöö6ëëë2ÆQx(LS[–eåûÉÔ„.,,püøq”R\¹r…·ÞzkÌA­:ª‚ Ÿ£‚pÄ1Í7gΜáÒ¥K 666pG–腇ƈQÓ´eêG›Í&§NB)Åÿ÷ó‹_ü‚Á`€çyå6‚ _馄#ŒÉŒìv»4›MÎ;Ço~ó677ɲ¬t¯Œ`¨æLV;ÍŸVÑ:ÙE?éâíçê™ÛÊe­^WóG"J©±c¯¾W€2kuqq‘(Šxçw°m› .püøñ2(§zUª¸ó‚ < ⌠ÂÆäD^zé%Ž;Æöö6·oß.ÝÑÉÚ¾jFädtÑÓv©f‚Âx´•uyPíãýn¯†áÕKµÌ£:Ãބ᛿;ŽÃ‰'xíµ×¸qã¿øÅ/J«õ½žÆäA„û!Ψ q´Öe(¾ëº\¼x‘Û·o³µµÅööv9A§JU$¸ž&EéäsÝï¹ßï¼TуîsT©¾GªÏ3ϋѲAp÷î]”Rܼy“>ø€ . ”µæº:vVá~È'… aŒ(ššš*׫¯¾ÊÅ‹i·Û¬¯¯Óï÷Ëé9f Õ,£Š`î‡qG§§§ñ< ˜››ãÖ­[¼ùæ›looÅr|š¦„aH–eض]:¦O“`áñ ÿ„#Lš¦eÍ^†ÄqÌ©S§¸xñ"qsãÆ1ñ ”ËÖ 5}Âý©–3$IB½^çôéÓdYÆþð®_¿Nž5Çžç•%!Õ1£Òà$ƒ1*Gã†DQT Ó“'O2;;K¯×£Ýn3 JQpÐ’µ LbêH‡Ãa9"ôôéÓ,--±³³Ão~óz½@9J´ê´ËûL„‡AĨ aŒX€ñ%÷¹¹9^|ñEVVV¸uëív›$IÆî/®•ð ´Öh­év»ÄqŒëºø¾Ï‰'˜åêÕ«¼ÿþût:€²DáQO A8Âh­q‡Á`€ïûådœz½Îk¯½Æüü<ý~Ÿv»MÇ¥`Ì”„ý°m¥ý~¿¬ÝÞÞfff†sçÎðË_þ’7n”ÛT›ãª_~ABĨ <˜LQ¥a¢µæÔ©S,//Ón·é÷ûÄqŒR ۶ǃ©ó{š/÷‹`J7/Ï󲎶ZÖP-‡˜ìÒÏíq^ª.§mÛdYF»ÝƲ,ɲŒ›7oòé§Ÿ–ãg-Ë*ËE¤&Y„‡AĨ aª£ ÆÁò}Ÿ¿ýÛ¿åØ±c$IÂÝ»w‡¥@Ȳì™ZR5\¦CöâŒ<Ï#Ïs’$)ÏOÇ÷ˆ©ý„èÓLÇew|–eÄqŒÖºùä666p]·_†'íÀ}U®è~)°¯@7Bªº9W“×Oûż¿ò<Çu]Ò4%Š"Ò4ejjŠN§Ãõë×ñ¼R)áa1*O1Að­o}«œÊôé§ŸÒétÊÆ#Ðáóç9óóó ‡C>øàîÞ½ P~!2#BAQAxŠ1NÖ«¯¾Ê /¼Àîî.W¯^¥×ëá áû>FÇq¸qãü1y^Œ5Ž½Ô ‚ð DŒ ÂSŒ›¯½ö?øÁh4\½z•µµ5,Ë¡ |!lÛ¦Ùl277G¯×ãêÕ«´Ûm`¯“þYªKáó!Ÿ‚ðÓëõ ¸®Ë7¿ùM.^¼ÀÚÚ[[[e‡½ |Lò‰'ÐZsíÚ5>ýôÓòo‚ ƒü_HžblÛ.ÝQ×uùú׿΅ h·Ûܸqƒápø„P8ÊÄqLžç¬¬¬P¯×Y]]åúõëe®m’$ÒÀ$Â1*O1¾ïãº.a’ç9Ï=÷¯¼ò q³¹¹I†åLñ4MKá`"žt÷—ÑIî|?ˆª»7¹?³Ýý2LŸöKǤiŠçyLMMÑív¹sçÛÛÛ幉ãøËc ‚ðT!bTžbLG³©ßk4\ºt‰¿û»¿£Ùlòïÿþï´Ûí2K I’R`™)MG™ªhœD)UŠLsžª1Ofûê¶ÕŸŸõM×uèt:,,,077Ç/~ñ VWW ‚ ŒA¸úI€ 3] ö24———ÙÝÝåäÉ“t»]~ÿûßséÒ%––– åèG“'9)ÆŽUGÔ\äžÞoûê¶Õ‰Uæö£z~¾ ò¼Ðl6™ššbss“µµWP^e IDAT5@&0 ‚ðpˆ3*O9Y–EƒÁ(&äœ9s† .pêÔ)>ùäÖ××Ç–åmÛ.³H%þI8ãœk­ ‚€f³‰mÛ|öÙg¬­­¡µ›&‚°⌠ÂSÎ~5‘õzóçÏ~øaéd-//Ól6ý§ BSÊŽãÐl6 ‚€[·nqýúu–––žô! ‚pgTžbŒÝoè±cÇxå•Wøë¿þkò<çü#[[[AÀp8” :Â1_X’$¡Ñh077Çöö6üñ>2AŽ "Fá)Æ4æ˜%÷$I DQ„RŠz½Îw¾ó^xálÛfkk‹ƒAÙ)-a¾Ò4¥ÛíR«ÕXYY!Š"nܸÁÎÎΓ>DAŽ"Fá)ƶm”R¤iZfBajhµZüå_þ%ßþö· Ã÷Þ{íím´ÖÄq,Ñ<˜÷RE´Ûm´Ö;v ­5wîÜa}}ýI¢ G£‚ðc–Ù³,#MS,ËÂq”RÄqL§Ó!Ë2^zé%þò/ÿ’<ÏY]]¥Ûí–ËóZ뱎qÇqÊHŸÃÝs¿\Q_µßý÷Ûö ÛžeLd˜ ¸ðó¥%Š"fggñ<Ÿüä'ûžÏ,ËÃP„¨ €ˆQAx&PJ¡µ.])r_mj²,‹ .ðãÿ˜ï~÷»„aÈ›o¾I·Û-gçyN»Ýfww—4MË O‡•ƒDTõo“÷Ÿœ²´ß6Õû=ëÇÝ4¾EQTv×GQT:¦Æ¡7ÈùÁ bTžaLÍßp8,»¡ÿìÏþŒüàœ:uŠN§Ã‡~Èææ&@)H‡Ã!QÝ×}ž~Œ ´m»¬O6ÌûäîÝ»å} ÕIW‚ ’3*Ï0f‰:ŽcºÝ.SSS(¥xî¹çøîw¿‹ïûüîw¿+Ý­……¦§§IÓ”Á`@·ÛEk-ÂâÅ8ÆUç])…ëºØ¶M†Ü¾}›ùùyÇ)Å«ù´_éƒ Ï"FAÀ÷}ƒAÙiéÒ%Î;Çúú:ív›«W¯²»»ËÙ³g™™™Á²,z½išŠ}†1u·PdZ–…çy¥ø\]]åüùóå$&3LAĨ Y¦„g˜$IJõz8އ8ŽÃìì,?úѸté«««\½z•»wï–9¥‡¹fTøêHÓ”(ŠÈ² Ïó‚€ øä“OÃpì~P¤2˜q¢‚ <Ûˆ3*Ï0“ÝöP¸¤q—"áÒ¥K4 |ßçü#wîÜa8ròäIæææÊ0}áÙ£êlš,[ÓÔæû>Y–Ñétˆ¢¨¼ÿ¤ø¬ŽáÙDĨ <Ã!†!Y–¡µÆó¼òö<Ïñ£ßïsòäIæççñÍf“f³I­V+ÝR·$bäh2ùº™ä³L_3Y£¦f´êªÊë/Ï6"FA8êzÇ(¥ð<(Ñ ÐZ†!½^©©)^~ùe^|ñE~÷»ßñ³ŸýŒ·ß~Çq¨×묬¬Ðjµp]—ÙÙY ÙÃp,hß8¨¦ *Ïó±è(#Ž¡@³Ü[}.ZëÒÙ=#˜lÛ»—XÔ8“uŦIkMEå–êøPó» Ï6"FA8j£‰Öú±Q 0¯Õj¥°ÐZóꫯrùòeÞyçÞ{ï=Þÿ}Þ~ûm²,ãùçŸçìÙ³;v¬\ö7Ù”U·ÌˆAów¥Ô˜¬ ›ÉìOsüf;ÌnÃÔ°š\L³Iq”$IéÞVsE«aúÏj#Žymªù±°Ýäº.Íf“7ß|“üÇ,Ï™qÜep€  bT„Pu+«¿eígÕe¬Þ_)Å믿ÎÉ“'yî¹ç8sæ 7nÜ`ss“ÿýßÿÅóÍÜܳ³³Ôëuò<§Ýn³½½M¯×ãìÙ³äyN† ‡ÃR ú¾?Vs8)'é³,#Š"Ò4ëð>È!5õ¬ý~¿¼˜ëÆ!­FT=ËL>ÿjœ—çy ‡C\×-§49ŽS&*Ϭ˜¡@Ĩ  ³¼~ìØ1fggyá…øä“Oxÿý÷¹zõ*·nÝâwÞ¡V«±¼¼ÌÒÒ­V ß÷™e~~¾3:KÕtj›åüªSjÜ7󸦑Æ8¯¦êa–ê¡S¾ïS«ÕJ§ÕlgJ ÄÝÛó:‚ Ü£‚ <6Œ€´m›f³ÉñãÇ9~ü8çÏŸçÖ­[lnnòóŸÿœv»Í­[·¸víA°²²ÂÉ“'©×ëe}¨çyAP.·Çq<Ö•]£æb\Ô8ŽÇ–åÇ)›¨äjVKÌ}Íþ4JôYçYwŒAx8DŒ ‚ðØ0‘N“3êhµZdYÆåË—¹}û6úÓŸx÷Ýw¹yó&W¯^åÚµk4›Mæç癞ž¦V«Ñh4ð}¿t+ zèI’¤¼äy^Æ ‡Ã2nhòØ&1àÃá^¯Wº£Æ5î¬p/I’Hެ D>AAxlT§ìÄqL†¥€ó<¯œ]?33ÃéÓ§yã7¸qã~ø!Ÿ|ò ;;;lmm±¹¹IEX–…ïûÌÌÌ033C£Ñ(÷cš’L³’ylÇqp]·œGoî÷°£(gggËšUÇqÊæÞÜÆQA¸"FAxl!b:Ò¡hz2b0Žcúý>J©2‡ôìÙ³|ýë_çîݻܽ{—?ýéOloo³¹¹ÉÖÖƒÁ€ápÈææ&žç•µ£ÕzPó»žAàº.ƒÁß÷Çb‡$–îÞ½ËÖÖ[[[屚˜¢j©€p/&_žV2ë€ûùÞ÷£í²ò{ì£}†¨ÑþÍõïÇñ¤1*ÂcÃP3§¼J’$8ŽÃôôty›Yv¯Õj<÷Üsœ;wŽ—^z‰~¿Ïîî.ܼy“k×®±¾¾^ Ô8ŽË O­V«Œb2ô­V‹©©)Ò4evv–­­­2ÇÔL 2nª–Fpþô§?¥Ýn³¾¾Î`0Àó<êõz¹¼_>$Œ“¦)iš–ç²Zßk±*‚ˆQA&‡rRp1R CÆÜSC£Ñ Ñh°¸¸ÈéÓ§yùå—ËÉMÆ!ÝÝÝeww—ÍÍMnÞ¼I§Ó)§C ‡C666X[[öm>øà<Ïãòå˼ýöÛ¼üòËes’™ôî»ïòꫯråÊ~õ«_•«–eÑëõØØØø ÎÞÑ'Iyùå—y÷ÝwùÚ×¾†Rª¬á­æ ÂQbÒÝû}ôYg~¿Ç±œø,$2{x¤ÇO-㈺ûìõè!bT„ÇŠ¢“KÙ¦¦³zûä}'ë:«ãIšÍ&­V«œÔ†a™Gjš“,Ë¢Ûí–Nl¯×£ßïsúôi^xá hR2£µæìÙ³üð‡?äÕW_ezzzL0 OEìîî²²²ÂÙ³gÇ^_ãJ‹3*‚ˆQA-UÇÌ,»ONj2®¥çy4›Í‡ÚoEc£““ƒêõ:—/_æòåË_îÊ×TJ„£Œ©Õ4ލšt@Ëßú²e¶72ìóÕŒ>-ˆáP³_–gÕa3³ëaÏI5Û¶I’„Á`P6IA!ˆºÝ.¾ï—ÝöI’”–L‡¾ÁDB FUð›D l43·Ë2½ <ÛˆáÐ29ݨºl¯”:0ß³PoÊLH½ÖÏóJwÕ`êE‡Ã!Ãáß÷q]wl_£‘$ J©2§À÷}Éežìô‹½—U>ÚþQ¿M.,’®øÏ‹|"‚p¨1&—Ò«u¥ÕûÂx¾©qD'Ý7ÓMo–þMÜSuߦ©IÄÓçǸÊfâ•qK«S²¤nTžmäV„C‹ipª ÑêuEegvui¾ê šÛ`/ï´º”oîcêO=Ï+ßLo>?fPA•êk&G’‡Ì-kA'K“š}NgÔì]O<Î#s8¾ŠáPS­5.)PF7îmЉã¸Ÿ& ¿:Éì׌téÌÏ"š>ûM`2çÙäº ÂQÆRgç&¤ø QÚ¼·-ȲRkæ£Ò£<}ÉN4æãEU?fÌÏù>·íC–,F•5þï¬úyvXʵEŒ ‚p$¨ —ª[z¿±žÕsßýfÑï·#¤4»^8#8']PSFQýr!GБӒaÙ ¬¬š_~]ˆÈUFNLFF¦rr¬¼ø\É­¸ø·¹dÜû9ÜS7°w7S?*-ªˆÒ<˱”Uz¦ÊÚÐaaÇBñd¿ŠáÈQýÀ~P7¶““ÝAS€&sOE,}q&_#s¾åÜ G™$IHò ÇuqÑ#=—æ!a¢T‚&G¡°P(l`ôÙ]kÈ@í}é­þ{™ü·c>ŸÒ4CÙ ­ÖÈ2ÍG•åy6Ú>«l«²ÒiUûZ¯O£‚ ‚ @¢2R•Ù!¹•‘¡ˆˆÙ 7ØÙÙ¡?è [k´6×9ÚqЖÆÑ¾5Bca¡°Q–U,ɾ#›Eþ|äq¢S“a‘ã‘3r:ó¼¢yNÎxÜ@žï9­Yn7{–ñŸ"FAAO{(C†ÜܼÅgŸ}ÆÚúgô{=,•âº.Úͱ•Âv2´m£]«¸¶´£iºó¸Žƒ«<×Ã|<Ïõ]ª• {$ZÍ#GEv@ó’eYØÊFYÅ~ŒÃZ8§–²‹1*bTAáQÈÉPhR>ë~ÆþñW\yï=:ÝmšÍ&ËÇZ´‚ž?r&ÕeY(•hD°5ø˲ðt ÏÛ£Žv°µ¶u±os..u63(|,ëÞf¥Âbͱ Ò(¥Ê¢Ó,{ò®(ˆAAxdrr¶ØäÚµëüñïrã“4§Nœ8ÁÒÒÍfK‰Æ€Ì(rw­¬p*“4 úŤ¸Î^“‘¶‹“uì¸Å´8×qñUÇÑ´°±µ“åcö¨5Íö¢é”*<ÕB î5€†Úm£‚ ‚ @LÂ!×ׯsåÆ>m¯’5ÏÎpüµMwˆã6yž£ˆŠ ­BZXö^¼YžÙeäSfš–°ÒÑR» j Ð¶‹­m‚´‰¶mn£m?o¡g$\mm¡mm;(Û.J,m¹£Eþúèx|2+Ggî“8%"FAA‘,ÏùäÆ 667ÈóœV«Åñãǘžn†;ô{}´ŽQÊ®4™ZN«–eaëñnú,5SàRò<#M2R ±ŠÆ£4)Í^RDйIÇqp\Gk,•ãyžÔjhÛ.¨lÛÖx¸Ž ¹m?y)øä@Aáa£°-7ßù-Yš’ê| wÚ&ÖÂþ6¨×Épór°,—œœÈ¶œÌNPÊ+%K3«X¾ÇJÊ¥ô<ÏÈó>–e;]”RDQ·˜—"×Õ~1Ò8ѤQŠëø¨®­\´ãàû>ï0Cœô/¢pqFAAŽIj5mò<#I’bò[’â>¶Š ÷3Wdy•&v)ÏrÒ,#Í2,+GYŽ£‹ûþ^Ä1)`|ˆ„£u‘¥<Ò®ä&º)DzT9].És¢(" CzÝ.~žàº.§Ï^z2'n£‚ ‚ €Ñ~Ù¨(S™•&3e`%äyŒå~ÚyqGg”'še>ÊRØdyÊ0-É[ ¹²ÑXJ‘3ÀR)Xç1Yž‘ÄEíéPu±mÛqI³Œ$.ÆÛ£nü 3ô£é'Q€GX} eYFC}•ˆAAx T'ºYÊÂÊM}Nš§¤$£1Å£F&2Ò4!IŠ®{¥‹å{Û.fÞWçÓ#‹SlÛÆ²–UÔšîø¢9jÏY­O–¥&DŒ ‚ ‚ |r ¹=º>XRYxAžÚ¤YFºÄqBûhGÓð[xž‡¥b’4!ŠÛ$IBžô±,…ÒÑhÙ¾èÊO)„g¤4Š,u!ÏѸäV޲ÀJM–hŽ•ƒm)l»©¾å`Ûf>½uàqUˆAAø’Éó¼t23™¤)Q‘ ŠN;/Ĩïû´Z-‚ºMžåDI›0 ã]’8!N;¤i¨ÉeYØZ“*›$ŽI² ÛÖ¸®ƒR6i¢w¢FÕe‘:–ƒã8"FAAŽ&£ÉE¹FÎ脤²,‹,7jÔ-–ÐCM8ȉÚ.àò܉—˜žž¦Õ˜¥Þ¨ªh<¢C'„ñƒÁ€nƒN§Ë0Ù&IR2e£µ&·\’°Çpây.  ×u»$QKËûù(lŸ<%Ï2òlHGXØ bTAáhb"—öò,lK†!¾[„ÌwCƒy¢†\~åò<ǵjªDDDxÔp]‡ÌõÙ­ïâõrl[³µÝ#ŽûdYVN[RÊ"Š"²,cqižF½VB†X ”­È2«Ã#k5Nc”e WDŒ ‚ ‚ <"Æu!Sť̆\aYÅÄ$DZQiN'ؾO¹öÑ ü?þ7,,,0Ë }ú8¸¸x$@·ÛF; ¶àÐdŸ ^Ç·;ØxDýÏˆÃ˜Ì Pv€Š4ÿý‹ÿË믿η¾ÿ=,oÿ‰ánB’öÐØdV\¸´V±l¯í[ÙrôÉϧòG ‚ ‚pÉó½Nõý(æÊÛ¤iÆÎî.ÝnÏ󘚚ÂF•îdDÄfo‹[·nóáGqåÚnu?ÃÆÆÃ#𙚚*ÜT×`023;ÃÙ³g™eŸ¢þÔqÝ"óÔÔŽªbü¨ÖöhÄèᑀ⌠‚ ‚ <•šÑ\íÛMŸf)™¥ ‚:ÃnÆÛ›äi¥…ç™ñŽ‘“P#'äNû·nßbscƒµõ[ìîîòꫯ°øê)2,²v;» },ËÂ|‚`Š Îó›ßü–?þ˜••4u“6»¸8,,,ðÖ[oñÝï]âä©“(ul2ÌÎβ@ƒð¹­]‹ÁpHoÒíöˆ“˲pÕÁu®OY¦AAxÒÑ…|ÒU£ÛÀu]×'‰Sv¶»€fqáCB4.Šœ;l o“¸}¬úPí»ÜY›Arýö*™ò¨1Ëf¿‹EÀ±¬míÅ}^:q‘ÓÇN34-ZX(æ˜e~zŽÙÙiœº"Ó1q¥!Yâ@æ£ò ‹'?TĨ ‚ —Œã8xžGšet:\Ç%¨„#ñçá¡Ñ„qH†hm£‡$-2Bó,Çó<67·p”ƒÆ"NbbêªN¿×gss“ C‡.£éö è‘`£p­Q½Âå“ÚZß7 à«DĨ ‚ Â#à’á’açv–¡rŠùïØ9¨LCj£S daÂüô,¾í0 C@ …¢F–¸$iŒRù]"½K¬wH6^#`§·‹Æ'V¦æÓCÖùû¿ÿkÚñ&ÿïOþ? аhàa±»y—;ƒ›löÖØa›¾Û' lb_‘ÛQJ9*ôI#5£‚ ‚ $MȲbêQ­VCÛ61 u ‡b6üH—Ò²¬²ËÝó<þÿöîå7ŽëÐóø÷œSîfK|é-+²AߌÇÁEnÆòÜŒ!Y^ ³˜Í`€2ñjl² pÿ† då•pü ÙåÃÀÎs;¶#Ë’lËEŠÉ~UÕ9³¨î&E‘⣛*’ú}„ŪêêÃ#võO§Î£ÓéÐ%#%e-kl9¿éêÊ ÷îÓ œq@ Ë2ºv{÷îqÛÜ$rŽv<˱cñ¾ /ŒÂ¨ˆˆˆÈQ´ÞËÒ÷—v÷ýÇ:_yÀåÒq“ØO í°ç'5=0o9ÒZŒY Éñ-š‹±¦à䉄»‹·y°r—nwfm0ÐÍhg«,Ï/°Ü#I–kK„H}ƒ8¶D&)'Ã?TaTDDDdÌBäENá ¬uÄQŒ#òal lßg3ø@E8k  <pÎ’RcrrŠ,Ë€rýyÛïy¹[XŒ±8ëˆ\D•q/%ʲû@œÄeklõYTaTDDDä l\.t}?ý•·éýž]ÞRž‹ô—ôÄÇI’`­Ãž,·¯™$ µz4N‰“„8Ip…ÃZ‹÷ž¬—ŠVQP9ƘGú„þ@Ù ivGÂzXܪ!PO–åcð¾ —õÊ–l¼È!*_Û‡@~ˆ‹¢ ÏËÑúÐÁšÃ1Ž]aTDDDä8ë0Æ‚'Ïs r<¡DŸÌXC^ýP¶G ïÉ]F§ÓÆ{÷c ‘s`Ö–k*ùÂS“gŸúG‚ña£0*"""2feð+[&±ôzeÿN‡%ê€ë/ÆiÁZ‡1¦ßа֑õzcÈ|Æ Û$£U£Ýnã\„seÔÔ¥€#Ž#:Þ`¬!ø #ô­%2eìKú·í냣ªt8ÚgEDDDŽc-Öö9ËÚÚ*9))­Îˆ‰Ë èù2’ ¦‚ªÕjôz=êµ­µ)Ðê¬ál9€)Ï ¢Èõ_k=P_öSÍóœBÿV}Àû~ëlQ û²† £""""c7XåÈCQx>|H7ëbqäE1 ` RÚ0ר³–¼(¨ÕjÃ[õy^ION»Ýï‹‚œäE/]âsF¢((Šê—P³A?Î8IÁ³¶Ö¢Óé`)—äÌ€‚|Ø—3Ïsò<ÇZ‹sÆz½µZ gûÓ6EyH§Ó!ÏójÈ1Q³áÊKõ:ÃÁC1.rd@NÑŸî‘ÁHƒVÑÖZ‹4M‡·á£8ÆYKË·ÉóÃÓ²9* `³<ÏÉÔu¦¦¦È²|8 ÈYGr0q'IÙ¿Ô—ýG ïi·[t»]šÍ&ÆZba°d½Þð<ÇZFEDDDÆ,Ï2м ^opâÄ Š"giéë“ÓD8êµq¿ÕÓZKžg<|ø8Ž˜žž!Žb:´1ý žºÝn•?ÚØ©eTDDDd?Œ_ÿj_M©[t‰S‡ ‹Ë‹|~ç3Î]>Cb¦IlLÀâpÔãR·H’­5ºk+w3NŸ8ËÅÙç˜HR²Ð¥0ÀJû!½¢l,6X0PXðEB Á ¢§ünb›#IDAT½¢G»Õ¢×ë| V«Ñívûû ¾(Ö'ÂbÒ4-'ća7kµZÂŽ~§jÙ7XSÞä`,.x"?hõxqš@VÐÉz4f&O×¹·|“/æ?åìÔ"jäd4¸À §ˆ>=LJ}ÈÍO¿$Ê/óßþçg2šÂÑ¢‰£Ëv÷@±BÃNŸhrý³8ñOÿî$½ZAžE¼|å.ûopÿþ}t>cee…"ØŸ×t™8©Q¶IVßïTaTDDDdÌŒ1$IÂòò2q”ðâ‹ÿÀÊ=ÃÏn0{òyæÎΑÓ¢ÃEÍæ Ο¿À©“瘙™¦V«ÓlNõûŠvB§œ¯´ÛÅZK½^'Ë2¾úê+._¾ÌÙShFà2R“»iÒó)îáCÖV[ÞSø‚,ËÍò  £""""{0èriƒï÷w|¼Ïh’$8KºI.½p‘;v…O?ÿ'Ìœ­s‘Ë8 1 , ³Í„äRƒÉdšéé)\œc%°L‹5–¿`aù.+ù"¶8IÌJ»Ûoq=Å™SÓÔi›] ]rrL(û¦Z(|Ž7YÈ0Æqzl*ŒŠˆˆˆŒ™µÖjš¦4›k-ó÷ç¹õÅMÏMáH0Ô¨‘L7H’„“ÉI’Ž"´M‹……æçYZ^&õFƒx2euuÖ2,--ñÅœhž ÛíÒËzdù*Ýn—V÷ív›Ì—kÝ[g‰ãˆà¦ú,ª0*"""²?ÂiÎxò"ÃPÐh&„^`yyc¾ñü9²üñOÿ—FZÇZËlã gêgh2yÖ¦È Y±F·Ûe©÷÷ïßgqí>ínê=Hb\d˜º5»¬Ù;|z·E¼aú+6E‹,Ï(ü EðàÖˆ\„s¼±µŒŠˆˆˆ?y–a¬'MRrïX^^&µ3\¼p‘•]nݾÍ'Ÿ~‚/<³ûäÿ!çÅæuêtmn·K»Óbum•{ïñ`é:Xg1Q„÷efs‚8j”¡ui‰à=q—ˈÆcʹK1`ËeF½/èõÀªÏ¨ˆˆˆÈ,eŸËÍ-¤ž ò¼äR¢$Û@4N&\üÆVZwY^^âëü>YãäË̺Yp†tñE—vñkó¬tVñišR$]:~P¬¹ˆPÛ%¸r­{¢ˆž]ÃØ€1c×§p ÁCƒ/û¾Ÿõi«¾mVDDDä !àû^ÖÇÀD£‹íN€S³§˜žžÂËÂÂ"·nÞbqq'%%ŠÁâ8Ƈ@GÄqŒ1¦<-ûò6|uåèúf³9œ¯´ÓîÐívñ…'øõçXcÊcÐ<£""""G–ukË éÓ$•Ë|z¢È`x_=0L¹î|0Þd¸´Gc2ð`q•ùåÜ[¼Á˧_ˆjðpÎG œu?E’$4Ò3LM—×¢ •FEDDDöÀ ‘c e ¨Éö e?Ro-!„a¿LO2<ƒs q‘bsƒm[\ä°ÞAˆ0qб†{Ú½U2Ó*'®¯Y“º žZ˜ÄXCêêDqL’Zâ(ÂE‘s8Û$ŠÎL‘¦)µøL9 É×ÁB J«mUÙ‡N§ƒë÷ጢÛ<ÅQÙ—ÓZ‚ oñÞûq†—Ñ8²,#Ë2h|á©»:Íæ Z­6> ý”,Ö•#ámá"Çdsk Édä¼!N’á|¤øÆb3MLŒå¦,À¯‚¨ˆˆˆÈÄý–ÄÙÉ:««kÔñ4,ÐõąŸ“YÉœµø"„@Èër^Ϻ)§]r9°!©m`Ú†SµIlÝeKgjˆ¢ˆ8J‰ã˜éôR9y}a°Î9SW" †ÐÌdˆ1 ¸ÞŒ)°‡`EP…Q‘=ÊòŒW_ýÏ|üñßXûê>íV‹ÕÕU¦§§q±¥Ýk|޳CZöå e+g•-—.8¢(¢'ÄIB-ª“$ ‰+¿¦iJE˜¨le5D8,KD³,L<˜+´\Q)ôÿ N <ܰüÖ™CÓoTaTDDDd&¢WÿÓ?Ót5Zk÷X][#ê&Ľ”˜_$EQ¶dºFÙ§3*Õ™ÄYK³Hp.¢a’4¥^«“¦ Qoÿû°Æ`°˜rŒ<SFΈà»s՜ߊ¨ˆˆˆÈyçyŽÕ×xйÃââ"“Ó1S““Ä)œøcÑ* £""""{bCEm"5¤$„Êi•x´å²ÜÖ]ÁRørG(<ÞFå2ŸÎ`ù2@·[ù0tnœ†ÉQ.z”)ŒŠˆˆˆìQE€!/2ZíqbpÎAïý#AÑb1¦QrÖëN±úwãC(סM9òÞl˜ƒÉ0Â!´Wc £Ç!•‹ˆˆˆì#rŽæDíñ]OŠFý\=!…Êé—†oyÌñÈ_Çã§‘#IaTDDDD*£0*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2 £""""R…Q©ŒÂ¨ˆˆˆˆTFaTDDDD*£0*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2 £""""R…Q©ŒÂ¨ˆˆˆˆTFaTDDDD*£0*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2 £""""R…Q©ŒÂ¨ˆˆˆˆTFaTDDDD*£0*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2Ñ(Ož››ã£>âÅ_WyDDDDäˆøå/ÉÜÜÜHç)Œ^½zuXy¶ÌÍÍ óà~F¡ ¤£BDDDDžMê3*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2 £""""R…Q©ŒÂ¨ˆˆˆˆTFaTDDDD*3ò¤÷ï¾û.ׯ_GYŽ¥ý¬L :}²q¬ö """‡ÃHatš~ò“ŸŒ«<ÇΛo¾ °ëð¤:ÝÙ^ëTDDD¯‘Âèõë×ùñL§ÓWyŽüàüâ¿ØupRîl¯u*"""‡×XúŒ†ôxÂc”:}î¹çôuÃ×QêTDDDŸ‘ûŒ†ðÞ£,ÇÒ~‚Ó N/_¾ÌÍ›7ñÞëëÍ›\ºt‰›7o*ŒŠˆˆ##‡QØ_àzVŒÒ2úù矫n7Ô‡êDDDäøP=`£„Ñ^x7nŒ¹DG× >ŽëïÛ|À|°íþ+W®påÊ•§X"‘ÃO×Σo,·ék8¨Ê N?ûì3Õíǹ>ÓŸþô§Ûó³Ÿý @U‘>];‡Ê[FgffÛ¶¸¸8Jq•QZFçææd¾Ñ­ê­÷™™™C÷ï0¨ýÖéAÿ®Rgƒ‹i¯×Ûö˜ïÿû¼óÎ;º Ê±·Ý5 ööžÝë{ò0^÷äÉtí<*meaaá±í333[n?Šö;€)„Àßÿþ÷k ÜM½¶VÈA}ì§\Û}ȦŸï½÷ßýîw‡Û÷»ßpúôéJÊ%R…íÞ—‡é=+‡ƒ®GßXZF÷3šþôéÓÌÏÏoùÜùùyfgg™ŸŸäØ¿Pƒ}Ï·ù›_ëIÏ?(û tÞ{¾ùÍoòÉ'ŸŒ¹DëçßiûÆ¿oW¿ƒºÝl»í£ÔÇA†äÍ-2›?ôvÚ¿Õùwõ:ø¹^ýuºÝî#û^ýu>üðÃ'>_äY´Ý{r°}ðuóöQìS0®ž®G_¥-£;=oãþÓ§OsïÞ½-¿?sæÌ#ûv:~«ï“A~üñǼ¶;ïÆíƒ¿ïT¿»9×8D}ìôÁ²qÛNû7Û¸o7X!^}õUÚíö#ÛÛÿ9¸víÚŽç9ÌÆ5 äIïÉ­þ8Îãaç÷õNkdösÞÁÍÆïÒ~[Lžô³ öýèG?Úw¹Dƒk×®UÒïi·b~ðÁz¿°AÀÔµ³Z£¾§LÝ)lž={v¤ç”Qêæ£>:°2nU__ýõëìܹs•q»c¢ÜƒúØï¹7·xì´}+;í³ß ú¤./‡­¯ÈAÚÍ@ËqŸ{Ôc¥ºv}Gæ6ýNaòÎ;#=ÿ Œ2€éå—_>°¾.;Õ׿ïÏŸ?ÿÈsΟ??ÜçÎÎ;Ç;w†ÇDÝêcçÞM°'=o;{é#ºÙNï¥Á>Ýj’£n7-(Õ7s«[ñ»-Ç^]¹rEï×§@×Îêz§ãØ´Œîå\»}Î8ŒR7ýë_ŸzŸÑ­Ž¹pá_}õÕŽ­ŸƒïªÌƒúçhúqÛØ—l¯¯¹Óÿîût«Iž5ûýÞfO{À‘&[?x×®]ӵ󰣞`öúøòË/¹pá–û.\¸À—_~ùHðØ|ìÆ×Þªßjÿ(eßËc”:ýÖ·¾u`eÚË1›¿páÂcÛßd½êãiÇmûݸrå o¾ùæ¶?ûõë×ùÕ¯~¥6yfmî÷=û9ŸnÛ.ºv•Mípûöm.^¼¸åöÍçÜ|ìÆc¶:ÏæslUÆÛ.]ºÄíÛ·wýýní7Æ2µ“÷^mûÀä½çý÷ßç•W^Á{¯¯¯¼Âûï¿¿ï:‘ÃɼôÒK!úÇãÜÅi¾ø?ÿ›÷Þ{o×O~ûí·yã7¸ÿþñh !ðÎ;ï GøíDuº³½Ö©ˆˆˆ¯½öÏýË¿óõ—Èÿß¿Žv›~nnŽ·Þz‹ï}ï{c*Þñóë_ÿš¹¹¹]¯:ÝÙ^ëTDDD¯‘ÂèÕ«W2ÈÖæææ†õ´ªÓíµNEDDäðyÓÕ«W ÆLu*"""ÏŠ‘0‰ˆˆˆˆì—¨ˆˆˆˆTFaTDDDD*£0*""""•Q‘Ê(ŒŠˆˆˆHeFEDDD¤2 £""""R…Q©ŒÂ¨ˆˆˆˆTæ±å@_{íµ*Ê!""""Ï GÂèsÿòïU•CDDDDžA“ßàë/T\y¦Ì¼†xéŸÿG`ùÏUGDDDDž3¯ñ¿þë‹æÿÒŒÑ ×‡”IEND®B`‚src/000077500000000000000000000000001225012771600351215ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/docvideographicsitem.qdoc000066400000000000000000000032111225012771600414740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \example videographicsitem \title Video Graphics Item Example \ingroup multimedia_examples \brief This example demonstrates how to stream video on a graphics scene. The Video Graphics Item example shows how to implement a QGraphicsItem that displays video on a graphics scene using Qt Multimedia's QAbstractVideoSurface. \image video-videographicsitem.png \sa {Video Widget Example} */ main.cpp000066400000000000000000000042121225012771600352140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include int main(int argc, char **argv) { QApplication app(argc, argv); VideoPlayer player; player.show(); return app.exec(); } videographicsitem.pro000066400000000000000000000004131225012771600400130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitemTEMPLATE = app TARGET = videographicsitem QT += multimedia multimediawidgets HEADERS += videoplayer.h SOURCES += main.cpp \ videoplayer.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/videographicsitem INSTALLS += target QT+=widgets videoplayer.cpp000066400000000000000000000125121225012771600366150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include #include #include VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent) , mediaPlayer(0, QMediaPlayer::VideoSurface) , videoItem(0) , playButton(0) , positionSlider(0) { videoItem = new QGraphicsVideoItem; videoItem->setSize(QSizeF(640, 480)); QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsView *graphicsView = new QGraphicsView(scene); scene->addItem(videoItem); QSlider *rotateSlider = new QSlider(Qt::Horizontal); rotateSlider->setRange(-180, 180); rotateSlider->setValue(0); connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(rotateVideo(int))); QAbstractButton *openButton = new QPushButton(tr("Open...")); connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); playButton = new QPushButton; playButton->setEnabled(false); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(playButton, SIGNAL(clicked()), this, SLOT(play())); positionSlider = new QSlider(Qt::Horizontal); positionSlider->setRange(0, 0); connect(positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int))); QBoxLayout *controlLayout = new QHBoxLayout; controlLayout->setMargin(0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); QBoxLayout *layout = new QVBoxLayout; layout->addWidget(graphicsView); layout->addWidget(rotateSlider); layout->addLayout(controlLayout); setLayout(layout); mediaPlayer.setVideoOutput(videoItem); connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaStateChanged(QMediaPlayer::State))); connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); } VideoPlayer::~VideoPlayer() { } void VideoPlayer::openFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath()); if (!fileName.isEmpty()) { mediaPlayer.setMedia(QUrl::fromLocalFile(fileName)); playButton->setEnabled(true); } } void VideoPlayer::play() { switch(mediaPlayer.state()) { case QMediaPlayer::PlayingState: mediaPlayer.pause(); break; default: mediaPlayer.play(); break; } } void VideoPlayer::mediaStateChanged(QMediaPlayer::State state) { switch(state) { case QMediaPlayer::PlayingState: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; default: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } void VideoPlayer::positionChanged(qint64 position) { positionSlider->setValue(position); } void VideoPlayer::durationChanged(qint64 duration) { positionSlider->setRange(0, duration); } void VideoPlayer::setPosition(int position) { mediaPlayer.setPosition(position); } void VideoPlayer::rotateVideo(int angle) { //rotate around the center of video element qreal x = videoItem->boundingRect().width() / 2.0; qreal y = videoItem->boundingRect().height() / 2.0; videoItem->setTransform(QTransform().translate(x, y).rotate(angle).translate(-x, -y)); } videoplayer.h000066400000000000000000000053641225012771600362710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videographicsitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H #include #include #include QT_BEGIN_NAMESPACE class QAbstractButton; class QSlider; class QGraphicsVideoItem; QT_END_NAMESPACE class VideoPlayer : public QWidget { Q_OBJECT public: VideoPlayer(QWidget *parent = 0); ~VideoPlayer(); QSize sizeHint() const { return QSize(800, 600); } public slots: void openFile(); void play(); private slots: void mediaStateChanged(QMediaPlayer::State state); void positionChanged(qint64 position); void durationChanged(qint64 duration); void setPosition(int position); void rotateVideo(int angle); private: QMediaPlayer mediaPlayer; QGraphicsVideoItem *videoItem; QAbstractButton *playButton; QSlider *positionSlider; }; #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidget/000077500000000000000000000000001225012771600324505ustar00rootroot00000000000000doc/000077500000000000000000000000001225012771600331365ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidgetimages/000077500000000000000000000000001225012771600344035ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidget/docvideo-videowidget.png000066400000000000000000001516671225012771600405470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidget/doc/images‰PNG  IHDRž½¼¦v– IDATxœìÝy˜¥Y]àùï9ç]î÷Æž™µ&µKHQ@Q%Pì‚¥8Ú¶Î(Ø8Ýôc7£#¶ëðL+ÒƒËtcëc7£-Žâh7H« K eUTQ[.••™{ܸ˻œsæ÷Þ›‘‘Ke™‘™ðû<ÏûDÞí¼ç‘÷¿³ü”÷ž­n¹å–“ïB!„â,=ñÄjë}Á惀3¸í}ÛÕ'!„Bñ-hWn@Õ ãyË-·øà¶÷11=ÍäÎi&vL_¤n !„BˆËÙâÜ< GçYœŸ'ôÝÃàSyï‡Aç57^ÏÔλ¯B!„â[À±£sܳo|‡Ú'¦§i4›$ÝÞÅìŸx“uËkoIYÝÈhuR’L±ÐR¬v4KÝc"”6»›B!Ä·…•£q왞óë§®½“ÑÏ¿`í«ó}þF³ÉÄô4s·ƒA¶3.ÅôºÝ^¼ðõ?æÚÚ Fƒ<ÏÙÛ}ݯ9ã »K{h,þ9Ö'¹â%ïxÎ' ă,çàÑ„¿¹–‘ \»³Áޱˆï¼:•³Þ^gaÍqxÙ3³b‚ÚÏ~!„Bœ“ÖÂS,Ï>Ä ¾ûgŸs|âýäYF}ò¦óÞÞ¹ºPçK1Ámï+FØwš08)ð¬\ûf:sÌÛÞò½cø«ÿñ ¾~t¥æ5§…BˆóÄ»ü¼´3ˆ›Îw{çêBŸx¶V×NÿêÒ-<ðÔ~¾c}?ZkvUžÚ÷qôÄÝE'7öóêë–ùÛ/.¢¯øÁ3·u–vNÄ|ø½¯ä7ÿèËüå'÷”šh÷+ñ‰¼Žü¿ò?}ˆ°<ŽJßô9/F¾þá{ùË¿{‚_ú¿?GPÄ[3É[i HsèßëFÕp÷-S|ð/¥Ý^§T yËkžÏG>ù÷Ý¿‡»oÝÅ?º—°’žÅ9„BñlBÀ§ akuí”íý?ÿê–g}í?ûÀ§lï\éü§:Ç™;ÝùºŸ´·ü‰üôÙ{ø+·˜ô±°Þ„òÜ6ö8?¶;~ÎÓŠênÆ—9̃‡É{+˜¨AÜÔ'k$GÐažÿÀs»ú`³6½Ö å >ņ³sëuež|zÙù~õ/àwÿä~Þüêçóá¿Û˾ëvN„̯¶ÐaY²žB!Äyp¾2„ƒ8ì¹´wÊ×TžµÿôõWsßï½–û?ø~ã×óõ?»—Ÿ|ó8ik–×ßÑúþWðÃ÷ÞÁ_ýÞO¬>ƒMÖŸõûÖ¬¦›x‹ò¾xo]Ž·Jiþà/ã¿|dA«66ýÜ ÆhîyQ“tcŽï¹{šN/ã¿ÿõçÈ{EŠÖ{Ç oÙÅ/þ‹»92¿Ì/¼ïOP.À¹Œ[oº’ß|÷ùÌýóÚy/Oîá÷ßó½˜|žëvxÞÿ®—‘ôºüܯ}ˆÏ}ñþ徜Ÿ|Ë5Ü÷_cz¼Ê®Ñ„W¼ À+^4Eoí wÞ6É—¾v€õ•Ù~üûpû­×ò+?u‡.ñ ïû°Å¼†¬»Äõ;,ÿþßÜ}ÊþýÔÿñþöS_äïú ¼Ï÷¬ß·^æyãMn¿!¨6Þçüã£+Ü|Ý8×\Ñdn©ÃJ'çû_w#O>½ˆÒ†§¯qÃÕcx—áòÞ9¿WrÈ!‡rÈ!Ç–p.ÿ¦avŠö÷5vÞÄôwŸtĵ1œ·'·wž®çÇëÁa¸ø‰ß{çðß7¾ä•ĵ1;o$ªŽžùü}áöãwYÉÃ9Xí•ùÎëc¢(¢ú³~ýfÿЦNj!goS^ñâkøå_ÿ/|ñâ¯<Îw¿úE¼þ·¢µâÞxßÿÚ[ˆÂZ­Ìu“ ¯|a£¿øëäK_þ*þѯxÙM¼ñ»nâ­ïümþÝ»¾—~Ç(¯ºcŸùÂ#¼òåßÁ®‘7îžäOÿÛ§I7æÏª¯ºó¦ác|å«<ð•ÇyÓk^Dž¬ñªÛ§ÐêÔýûêãÅœˆå•uöì;ÄÈ®é³z/ÒÔqÿ׎qÏícŒÕ,ÏÌ&ì9œòÛzœŸù±ï`e­ÃèH…‡—ù‡‡£‚ kš+wÖ‹ëÉ{ÏéýB!ĉ¼=?s<ŸË§jÏ[KcÇL_w×)_WÇðÎðÚçú9ºëyý?ÿM>õïÞ¾ñŽWPªM0}ÃÝ4¦o$®ŒžÕùžê,ºØz‚1ÿ8³ÉUŒ5Z¤iJ’$ìЋk_®í>»«ê³>ú©oðÖx ?|ïíTJúßïÄe¢òØñNêb>åÆF‹¨:Aeì: þ·y À¯¾÷?sß"ªLâ½e­«yåÝý¿òay”ÚÔóAÀsðÐ!ö˜å÷ÜÎËn¿‰·üØ/óüßů¼ëŸpß¾ŠÎçÛ1ÑU÷Òi¼ŽåµívgSFZŸÀeëÏÚÎÖã#Ÿ;H` ¿ðÎfïþƒ|éáÇ J#åæ°_ÿðåoð3ïø!^ô‚øÉ¾kpUüͧ Ë-ï~çÿÂk_ñB^yçÍü_¿òv&÷ýã¬süÚ/¼ò}wóÞw}7;§šüͧ@%>÷sÏ]·²ººÎÃ<ɧ>÷ o|õš9ÊžýÏ ÃÊYõáx€÷üÜÛø{ïâWÿõë‡ßÖ3õOíNÂí/¸ž7½ævœKñÞžÕ÷-ó‡—ô±ýÜ÷ÀAâÀóóo!ÿö'_ÀÿþÖÛø™ÿù&~îm/àß¾ý…¼í{¯áù»+$IgŠáüs{ŸäC9äCŽ-Å*ðoö€Ó·7¼ÏŸþµÎŸøø°½ót=òîbHà†ÿ÷Wþúƒt[Çè®;õõliÎ2ãé]ÆdïÓäJ‘O¿…(¬`ÂkX³o`Gú)J¥ˆfbº÷±¿…Íñì³™YR<üCÜ~ëÕ|èÃCiCTÄDåa¿ïp/ïýÿùãoäÕßõB|äéa¿ö>³ÈOü›ßågÿ޼ï=?Mšæ|é«{‰KeöîòS¿òa~úm¯äßÿò[Y^Ýà?üçò;ðQâú.îÿú~ì‡á3ÿ%Š0®ŸUøê>þÏßùsþÕÛ¾‡_{÷òÙû®#Ë’3ö¯›”ù­?üLŒsýî]üÈ÷ÞA¥qhæ(?ûKïçþ‡P¼™Êè5x8Eÿš(¢M@Xn¢ƒƧ}/:©ãª©ˆR³K ž/²—:D!A©Šw–Pç4+°{gÄKŸ?ÊÂr‡ÿú±Ç˜_öDÕ ‚¸zÚs!„âìx8¾Š»ïŸ¼çã<ö©ÿxÚ×L_wö„×*­ÎØÞÌ#§´)£8ÐÛX¢T'ª4Njï\éü#Ó×ј¾úÔnâêQ¥Á«ßúÖæ÷ö7|=§2 <õ)ž Òcܵ{‰¯îYCO¿¥O5„0cï`µs„ܼ›V«Åëü ŸÜ¿ŠŽGÏêB£rƒ¨Ü8é~S?9+Wnì:m;¥ÚÄ)S´PwœUÏÔ‡Ô{~ö·¾H²1G²q gSpŽÚäÍ”›WUš(œ¶a\9ãum6»˜P‰=WMDL6Fëcõ€jÙE`ÏÒjV;áÿû»§88» JUšq ªHà)„B|“§¯m>¹ûôǸ:JTiœðZ­ÕÛ‹+£øþ"¢­÷GåÆ)Û;Wg¼žkï ®•‹óDåõÉÝÃøílÏ¿)ð<9¨ôíƒ<øT‹µÒ+ˆÎP•G—šüÝ7Úì;ü½^,KQ{Ðå—ŸÕ…^þCXÛ1ú¼·w®¶ãüg<Å¥Ë# v±{"„B|[2µ+ÑJÓZÜÿœÛˆë×Vw]öÎÕvœÿxàšç|!„BˆoG¦y¥æU—l{—Úù‡g(§B!„¸€‚Í7þõÛ¹ÿþû/V_„B!Ä·»îº‹kîýàð¶LìB!„ÛBO!„B±-$ðB!„ÛBO!„B±-$ðB!„ÛBO!„B±-$ðB!„ÛBO!„B±-$ðB!„ÛBO!„B±-‚gÊé5óÕ!„BqX[[{ί•Œ§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„Øx !„Bˆm!§B!„ØÁÅî€BqöÜ–Ûýü‰|Ýò°Úz{ëë…ÛI2žB!„b[HÆS!ÄåGåÅWßÿd<·&4Ï“Ò,ît!. ùB!„ÛB2žB!.#ßìM™ã)ÄÅ$O!„B±-$ã)„â2ò,«×·¦S÷æ„n*„ØV’ñB!„ÛBþäBq9M¾d°?çpßÎÁí­™N}âã’b[Ià)„â²£Taz¿uÌœs Þ{Œ)žk#Ïs”2„A¸ÝÝBôIà)„âòá5Jf6-ÖYP)Zg <Î¥(­@AîíöišQ.× Ã ZEE€*„ØV2Æ „â²µ9ã©•>á¾P‡(4kkk,..Ñî´QJ¡ ?!.Éx !„¸¬x6ß|F› E¥-а´Ó5ÙG{£Ã®]WP)ÇAm1/ôä‘z!Ä$ò !„¸¬8ïp¶8¼÷h}ü£Ìã04Š”.Gfg9|ø0I’P¯×ÑT€çíÅ»!¾Ià)„â²âÂûâ,2R89m,mºv•Ù#ûÙà1ÖÖç©ÄŒ7j€'±m²,»¸!Ä·) <…B\V”î›J¡µF)…§È€fYF7érlþûöíãÈ‘£”ËevLO£(ù)W !¶‡ÌñBqÑ(¶+Ë ‡_ŸJ×XÖITBæiµZó8Ζ¹ùŠ™œØ X2—%´‹e~§d<…B\V´cŠç>G¡ˆˆ1ÚÐív1Æ033C«Õ"ŽcvLOSjôl$I†óB•R'Bˆ G2žB!¶f·d:•‡¶VÔTïWr€Ö`5ä œZD¡y„5¿Às÷ñðÃ3U»x¤Íøè‘q`åVñVÍ~›E‡6›2 /Ä…%O!„—•,ƒ$-Ð*U<žy;ÇX^Yabbëõzæè(qEv30ƒàvozâÂ’Œ§BˆmãûÁžÚšñd:·|ÝÄ:HÂ%"êÀ<ËÌñø3ŸçÐÁƒhÓ£Ò(±ÑK)—ËŒŽMuÀàmEÈæœ‹µvt†Ú7oÏ$„8¿ä·K!Äe¥T‚ZPÃã9Êž~æiæçæH³Œ0¡Óé022ÂÄÄñ𵛃J늺îÖZ¬µ8ç$ë)Ä&O!„Û¨ÈtûÁÜÎÁ\Îa>¤ÿuËZgzJ¬0çŸáÑ}c~n¯0½«B J¬¯¯R«^ÁhscÍ]@­hQ(4yÖeÅ&ô>ï?v< uÎIÖSˆ D~³„B\V,03sˆƒÏÍã?N'z”k®¼†É]žR©‹ÏzI‹´7JÚ‹¸å†»©0„ؤŠÍ½´»+ôzP¥rR©D8çÈóœ ‚â£Q†Û…8ÿäO:!„ÛÊ{Ãc½ÅbÿÌ,ËH]J@HL€#í#<ùÔS,..R«ÖرcÕj•R©DE8ëèõz4 Œ Pý•I&(‚ÜN·ËÚÚn­ q†!Àpe»µv»¾ B|[’Œ§Bˆíã5Þ;r¥ð^ãÑEt U¬Ïq,ReX`‰C<úôG8xð ¦rŒ©«¦ˆÇÎ-a]@*ðe6ÖsÈÇØ}Õ.|6¦¨Päóçzt»ÚíeZkLM_Gš“ºç\±Iæx qaHÆS!ĶsÖáÝæMÛ JI1D:¢G—E±wß>Ž=Bš¦TªÆÆÆh6h­É² k½^—ÖÆJ)vìØA¹TÆáè&°ÑÎX__g}}$I ‚€jµJžœ{ñÞ7•Bœ’ñB±ŠàÒ÷k¤{m†Xº„„ä¬0ß^`ÏÌÇ8zä(¾ü;§GÝ™×gPaމZx_¥×Ki­–èµ cõ4jÏ£ÂNÚ¶Ãê’g}½CÒ]&Ïrtè˜h61ǘƒKYP$Ä…'§Bˆm§u1Ä®)öˆ÷@î-¹ÏÈÉØHW8xð$MSv=¯Éλˆê+äyN–¦ÄQ>¢ÛíÒÚÈÐÚÐh4)e<žµµ5–—:´;\Ö Q‹i4Äq<\É>Ø>ɘ“‡Þ…ç—žB!žƒbÅ÷ñšë[W€÷³‡.*¾’‹ eŽœ–u2•øEÚí6Oü$KKËøò1FÆÊT&:èê¹Z¡“wÁ—¨Ukh7Mkuޤ]¥Ve¼q=!Ó´’”åÅë­bøÜè"¸ ÈR©B`Jxç±¶¨\4ØRis0*„8ÿd\A!Äyçû[)]Ãû7ÅsŠ"ûÖ[²,ÃÃC>D·ÛattŒ;wR)WHÓ´¿gŠwž(ˆL@’$xçi4ÔëÅ*ø¥¥%6Úmrk‡ÙÌ(І+Ù wÂÞ¡j¸ H qáHÆS!ÄYS[ƒ C*ïß1X˜S:éuÖö )°ôð` ‡¦Ë!6ŽðÈ“eÿþýÜòâJ¯12Þ£Rk¡#Í-Î稔€t½L²V"Ên`4º†0ßÉÑÙ”ÞÊÊöˆÃ¤ÿr0 Ó¹¢6{·Ó(V«!ÊöW§o ,ÖÇ3ž†bv€žB\x !„8E èësü‰™NÍc{>ÃÒÒõÑ„];wÒœ)†ÅKm ^[œóX›‘$ I–`s Ê¡”BkÝ_œ4(k’g–vKã² ‘™ 2]GâU ïB”0F†¶(‘©<`…÷9JÉdO!. <…Bœ“Ü9Ÿ’g(ˆ£˜rÿã¤E‡…•fŽ>Âѹ9zÝ£Í&Ó» ˜¸Èdª@CŽ#Ë2Ò<%MS²¼XÍ®´%0Ç?¢´Ò8_£YžÑëõpÞS*‹‹”Òhc°ô«õ³q…ÚKÙ¥:‘—žB!ÎÆYS DDAË^–Xbfáï9tð «¡µfìŠ2ããã4FF‰"ƒõ¥~yË…ÂÙu²Ô“f ›¼7à5Fk”ÒÃávç]4:E`"V—»„a™JE8Œ† ˆt 8¼wx¯†W¥%ã)Ķ“ÀS!¾Í‹tŠŠBÞÂÀ+‹³ a`ˆK†0R¯‘©MøH±ý$ðBˆo3ÚhLõ´¨|‰Í=Ö9œïE¥ „BÑaå•eŽ-ïáè‘#̯"Iâé˜ÉÉIF'jT«Up1Yšb³ÆŒ‡Á÷žÜæ¤iJjSº.­N‹ÜæT*UFFŠMå7ƒƒlgÐOÁzëév»Eu"ï©×kÅ"$ÀCžçäyNuÙËåòðµ›yï±ÖbŒl /ÄÅ §B\N¶ÎÝ<íœÏSßí( J¬µd®Sd&ƒ£5jaÉXf5_efî+>|˜Õ}Ø<'¨÷ÙQ¡1±›Ñ±Q*µ¼÷tÛ9Ý^F`º”J%´.2–ž^tæë$Y^Ò¢µÑ¢—äTª&F§©Õjxçi·;˜°Gpš¦>À†^7¢ÛVäI“Ø”)•C”¶Ã­“Û5)¥(•JÄq|Rp©eA‘žBñmÆ{NØÓ2 "¥1)=zÌ-bnnŽ# ûY^Z† ÃèØÓWN122‚) J)œ´ƒºè®˜Wérò¼(‡ÙívéöÚdYŠ õZF³IhÚŽ4K‰O$Î ·QòΓå9nˆi6GÑ^áÇú¢$æ ëiŒ)ö ¢a0:H%Ë)ÄÅ'§B\ÎN—ŒZoÍ|ªbŽg¦Z8í1¦GH„¦C‡+É^Ž›ç™Ù¯Ðé´qúµIC­™3:šÑ3ÄqNž—‹À/û¿gã@åä¶WlÅäÛ¤YF’¶éõÚt:  h6vP¯¢ˆÉ-(íCƒ rœÏp>!· */æffÝI'FçWR‹&0Îbók‹ŒŠ ‚`˜í «C1¿93*¥3…¸8$ðBˆËÐÖ­€¶#;_l® EêÁY°¹+ær†žÈDD€ÃÓ¦ÃâÚ"{öƒ™™Úé õz‰Mêõ:ÕF2œ‡™åÞÿ¶Î¢•&¼wX—ƒs  Ïsœ/¿,MÙho¦ Z)vîÜ@žeýš¦ yn±¹Å9Ëà2³¬Èš–œ/öû´=Û~/œsh]¡ƒ è è„ã{—þ-§‡žBq™Zƒ!d­5ÎçÅ–C¦¶´ÏðÊ£PEf4°(z€£…G±Î2«ÝfŽ<Êþýûiu`sËm/¾€ N)—3â²ÃÞÛ1yxçQ¼ö(2t¿Ô%*Ç“å YšÒjuX[mÑlNð¼ÝÏ#GIÓï#@¡´í/Bêâ±Åë}>F’§Uº±ž&ÒWc0aN“¦)¥R‰r¹<R×Zt 4…¸4Hà)„—¡ÍT€¬4‹ldž¥ýUÜŠ8Љ¨†ŒùäOÏ|ƒ#³GXo`´Ù¤Z«¡”-†¬£"¨ËûÙCE€R۟׉ï¶}º_‡Òº¢îzk#annŽN§E³Ùdjj ¥IRl}4ÈBÕ‡®¿`ÈùãÝa¹LçP¦´µ/ª¹MÙKc A ‡Ù‹þèÚB\\x !Äå¤?‡STK=-ê“àK§ÈvFm(*ú 9–ÃÝ=<ýôÓì9ôëëëTG<;wìdl2¢\V(í€.è¯ÖWpV¡)÷O[Ì™ÔÆa (ÝÖÖ9Y–‘fÅ0øF«Í‘#sTJM®¼ñFÆš»ØhotBÂ(B«~Î~¦Ô“`½Åû m޺ݜ´["4ÄÁ$Ê5p.ÀZ‡‚á¡(Š‚@öèâ&§B\f´Òx5ÈÞß+S)…Ãã¬ÃyKTEÎK«‹Y~†……f×öÒét°¡ezzš‰©cãcTjÅöDÎ{œ÷€f ½÷Ø~&Ò°©æ{¿ª³›çX›ÓiwØho°¸¸DFLNNP¯×ÑF÷ç† |Ü0 釋~œ-†Ý1¸ÜÓívH³”r©D9.ßbª¯ÑZëÂÉû´YZ>ÄáÇyfþqV–—é„‹ŒŽrÅ•uÆÆ"¢Ø‹äÚö+E(ïð¶ŠRàózÈÛ •S”©ÔA¥ ηɽ%Í:äYÆF{Ç“ö®½æ®ÜuÞjZ«c(ásýL©'/é çSœO1Æe­„¬Q*P‰§Ð¾Žwg5ʹá¦ñqKÆSˆKœžBqêO¥Äùþ*mús½'PÅí]¿ÁÜâ3=r„Å•C´Û2Rš££LO011Nm¼ÔzÉi–†ôW¯í+¥ñÞõkž;ŒÖE†S¹a¶³Xdéõzt»$IÂúú:Ýn—‘Úvíº‚±‘1Vèõ,µZ­XøclÉJzç±ý:ñAzG·Û!IÍåJy¸wèàz·fÅyO–%ôzÚí«««¬¯uhŒŒså®ëˆÂžÃ¨*¥8àPx§@åEà¬:xŠøXö!ÚÖIÛ®[¡¬&¨˜ÑþT‚âõ¾_¹hõì×)„¸4Ià)„—ïú[a*к¿'ErÐõ×ðxí 0D¤´è&]¢’#4_þÒ—Šyšz•0©ŽR¯×©Œ¬'¾K·×ÃÒ%J¥a’ç›çÀnïnÚSoÚÓö·u²Ö’¦)ëëëäyÎüü/»óN&''IÓ”nÚ*2’¥YšõK]nÝ{ôÄyŸÎY’$!Ï-A`†Í4MqÖâ¼GÃIûwß+™ß)Ä¥HO!„8§«~R¦sëýúÔÏSy¿ÝèøÝ¾ŸØ>÷Sqé“ÀS!ÎÅI«×·d.O;´ÿªþã¾ÿ:7\¥>xÆÄŽ(^D¡èqŒ=VÚ{8:7Ç‘…½,--³ž-Ç1fL³Ù¤:2BEEz²ß Ö|@ž'òÎõ i¼V(­7]Ï–ËÜ´ˆHiUý…?Z)2«X]k377ÏúÚ•J©é)šÍ1‚ »A?¶ÌeU)8‡ÇâP(o‹ì§Vx¯ðÎà½ÂÙ€,Qؼ˜2…œ3Ew}ÑomŠúì¥Ré„EEƒúìBˆKžBq‰‰‰Ñ”éÐáÈÊaŽÌÎ2¿ü8ëëë$v™(ЏâŠ+¨Vª˜RZl#«ÐMPdþ¼w'aýj@l©ë~*z¸‚]çznnÓzO·×cue•Õ•U”VLMOqÅ®+¨UkE]õS áÛ9^ iYõÎ_ÕîŠ~gY±ú=Š¢"¨†¢:’s(eúe2Ç !.}ò›*„çätONü:°5ÈlüÞÿꇯô¿Î±AÎJïÌ;ÆÜÒWXXX —"ˆfs”Úh­;¤6ÁæëdyŠ'£0&@«ç,ö=Öª¨H´i;¤S^¡÷}ò~˜E`¨H’„Õ•uÖ×7P*¤1Ò`rb'c£“(¥I’ëlÀn­) Š}C‹{34ƒl§ÂÛï6‹É’ocBS'JàÖw eŠÀ8 Ãæxnf…— <…¸¹þވƘaÖgÑqÎ=ke–Í›h;ç°ƒlœð ý!U­OXU,¾ynS ê= §Jªþ~œý}:UÔ=Ï0´ó6åB>û¹Ï™Cs €F£A­V£Ö,¶²Þamóô0U ¡;k£û¿kÝýL_N] ¡Ÿa’§VjXS}ÄiÀ‚Í-ÝN—ùùyò<§Ñh099I­ZV9´q&›Þ¬÷(}<0uÖ’ç9ÖZŒÑÃÕóƒß ¥Fk°Ø4~0¿S†Ù…¸ôIà)Ä%hµÑº_Ž0Ï)—ËÅ‚‹,#Š¢áñ³qÎÿÀÞ´ÇáæÀsóíÍmÊv4g0˜éO_¡È{ð*/‚Mµ^ [k“;ŠŒ”6)k½},,,ðÔþϲ¶¶FÆ ¥R‰¸¶F¹\¦RË©T3¢’%->/þø,þ.ò1ÞjÙŒúÁZÐïe?ÛéïïÉh%1Õpë$tñs’g9+«+,-.•‰E¦srb’R©D–ó5‹Ÿ©Aºe‘²è”·äÖâ\€QE_lÑëf´[ž<(#DÁšIÚEÛ¢¤§ qS­V‡?§yžoägWˆK“žB\‚6Oò€ƒÇNõá:¨"3È”c†Ç©öd´ýì0‚•íoŽR`úßBë‹?6‡w!1š=Ž®eöÈ, ËO°Ñn“ùår™Fuœ8މ*š0ŠˆÊcpÞ‘gÙ0<>aóø6ÏË,ž¢†ªýœ)ã à¬#·E g´ÆyO»Ófiq‘……Â0`dd„‘‘‘áÏg–ehíÑÚà½ëW ÚR‹}ëí-ó=½÷ýý;AiMÆDQù‰Ùø0 û%2‡}îÿÑ$?¿B\º$ðâ2ÒjµX\\djjŠ8އêæ Ï nõ`ø|k°™eÖZ¬ígÞúæÅÖ4ñ Ï—aË3®^ßZ³ýÄPË+(ž9,Žœ52,+,²¸¸ÈÙ'9rôÝÃÄqLsÜR­Õã.Z'„˜Àa‚¥  ûí‡'öcsÍw¯€R”*" õÇøQœ*Û Å"¢Ü:œ-2å‰Mèvº,.-²´´J·›rÍÕ×1>6I¹\Gëk3¼Wý~Æs°ª}° Ó`?Ó®vw^á¬Çfš,UØ,ÄRŠšDÁÆÇe‹ëõšÀ„æÄk“yB\ú$ðâ´y>Û`è0Izè!:ÄÎ;‹y~Ö«¶DQDÚՕJ¥È˜õWýnÍ|W o .Á¨dŒ¾9Î#'0Š"Xèå=Ö’%:íŸø¾bcÐAkÍôÔ•j•ÊH¯˜³Ø ‚Ð%+µíÿ<Øþ°ú…[@3¨¿n‚¢RÐÚÚGŽaiy gadd„»v2222Ü_óøöIg7OØö·vò›®Ã:G–çdiJnC*å åJ…0 Q¹Â—óOÃ("ŠÂ¾ƒ©)BˆK—žB\‚™ÊÁpy©TbmmpèÐ!J¥‹‹‹8çNÈx²œAP©T†Ag¥R¡^¯Óh4¨×ëT«UªÕ*pbéœ#Iœ+ê_Ë5grú};MþÿÙ{“G’ô ó13_é$#‚Œ53«kéîQ«[ÐAÍI: è ƒ~ž~®‚.ƒé‘€f#5$µZ]Sê®5³22ö…«»›ÙÌÍÃɈÈÌÚº"«ìI8˜ÁÅét23^¾ö}ïW8j.õ¯8·¯…›x&ïlùTŸ¥Ø½í»P+êM´Ö¸k:Æ%4t\"ÁbXêŠù|ΧŸÂáá!g³ßq|| é ;;; w\ôТ:§,KLdˆã)cT¤PM·º®Ü¹S4±IR"¬"wο¢»§šÎsݼW~Ù^ƒ’0›Î8>>æùçÏ‘JòäÉÞúÁ[ô{Cj]SUK×ÜÖœ“öÒt"»Œ¹5bÔbÚÑ›pÓeïα¥®*ʪd3ˈã¨y„;V­‰tî¼tšõ[‚è 6Axº®QÍ8@/þ¢(¢ª*‹Bˆ6¾ëŠzÇGAÇmͧ”² ’7ÆP×5———¼ûî»c˜L&œœœðâÅ ÎÏÏ1Æð÷ÿ÷ìïïsppàf…ÍØ”ÀMìÓJÐøC§B–îç[]án³dÇ4>ø½¹¢dáÊ)™ H¨ù˜ ×ÛÿÏŽ?ãÅä—,¢9v¸d´—“&J]õsâ,bY%`,±H‘V m„¨·”¬šã6r"Ó N$JÛ4Öܪ1•îi†¬ç C$RFîó ›Ïˆ0Ö0Ÿ-™N§œqy1EkÁææˆíñ>›Û(©¨gî3飌üÛ®äM#•1>æhUxJj É¢©] ¢ê#+M9ÉX\Vl¿÷¿Ô9zÑ#’’TFTe…êYŠûü3>;ùoÎ/.°ÑÜ5we.Y ‰{N´ AY–î)h@ÿÂj„0H¹îuë\A¾F1å\N½’b •¤ZVL§SNON9>>¦,K¶··9ØwìÎ%½‰ðº=Ró¦ÙÍÚ×oð±Öb´ÿbd1FÓï­ãïw?Í«×+7^¬î'|úsž>}Ê´úÿˆâ˜a?¢—§¨XÇ© BX,©3/Moí€:Ϋ@Ü„Š÷5¤‹ævÅÝ]éÞÙd­«ýæuc1MÃYšº/uU3N¹¼¼äô씳ó3ƒOž<á`ÿ€^¯GY•X#\'»Ð«ËÜí'ïÂ׫ò¾h¶™Ü„¨±Vƒu%ºV,çtŸacëJEXS.i“²\ňî¨[  <7!u]¯,Ÿw]Px¹Ûè'I)‰¢¨ œ÷nVQlmmñƒüÀ ‘ÓS^¼xÁéé)¿ùÍoxôèï½÷ï¼óNÛŸeY»”ÿ]¨ïà w‘ IDATôF£+WmiIš ¢” ><ú-~ø!‡g`Œf¸íb«’Þ…sÿ"—çé­9­ý,óo¿4!Žb’8AÍl>ãìôŒÓ“.//‰TÄhk‹GØÜr_H¦Ó)JÆíô¬—9Œ¦Óµîðô¦<£KY–,s ÏæÖVãnJ0P•Ø„^Ö#˲¶ž8¼yἡtg°w/å5oëx§ÔwÄûºÍî(N­5iš²»»ë–[8::âððÓÓS...øõ¯Íáá!ûûûììì8ÁÕéù —>»~àV¤Å…µp)œZÎ]f&NX²ä…ùŸ?{Æïžþ‚ÓÓDü‚Íñ[; IRƒ¢qÆ 01ÆhŒnD—NXµOÜq^…w2»Žf÷ò« V!‘ŠZgz>ŸsrrÂñÉ1WW×H)G»ÒØ—e¶ÿž^›{Æ–‹eÛXvq~àêy?a<#¥¤ª}¶¨jñöµ´;½q6­1X³æxúÏ‚t× )Ú®x€ªªY,M2ƒlâ‘\yƒ NbŠfWˆÞ\‚ð ÞP¼xðÛ}³Ùï¢;é¨[ºÞ4b­m›†üíq³³³C¯×c4µ¨oF™L&ìïï3æ’hë,®]ݹY(BƒÔXÎÑH*.¸*¯øìä?øôÓOxqýÿb…e¸=g0÷+¤\R›)VÔ(aA„ÈH C íùU«nkwö»õµÇsÝmÑ/G­kªºâúúš/^ðâÅ ªªbww—ƒƒvvvH’Ä-sã¤iŠ6¾¦X7ÆëzNh3¨u<ëµÛkVõ8·*åBRd}âh„©2¬ˆä(!‰£œ, ”jËDÀ›GžÀL·.s—¹B^lzW³ûÿ8¿ï—á»ÑLRº,ÅÁ`Àîî.GGGüîw¿ãüüœétÊG}ÄßüÍßPUÕJýr¹\ÙGßaíoÿ&±Ö`{™ÔžÂæg?a' Á…vS ž5êEßÍO"¥Ðõ‚ÊÖ$™"MSªzÞ¼éâ„pж…ùUs8}žè½¯ÑX„ºy?MS[ª"ç ú­Ó“Ž™N§EÁxãÙ³g\]]ñw÷wüä'?áþàØÙÙiÝRßå…ƒRª½Î Ýo²FÔ ÐF8cÎ/§Ë›‰DÆPó- pŽAóÙùÿÍÏÿŸ3·»zÖÑœ,›¢’¹›Øc–ë—ÛktSŽ¬Ï¼Œ­fY­Õ¼éjw5Ê…º·]í«Î§òžOÐFƒ©$J*Œ5èúFØÇ±«Ù¼¸¸àóçϹºº"ÏröööØÝÝ¥ßï¯|À½ï¦q2…tËéͳ5Çשå´k+—ÓiWs<±šå²B¨%JItqyqÁl’“§[ ûˆÄ¨-”LuŽ1iR&E[üm7f/GžÀJ·©¨"ÿºtqßõKÜgqvŸ¯Ù´. ó<çñãÇ ...xñâ}ô‡‡‡üð‡?äþè\že’0ŸÏ1Æ$É­Ò»Äî×¹œ´iA7ñÄ@C’rÉ„>ùŸ~Àp8d#? ×ˉ#·íw06”¦DÊn“•sã~UÑôªÇKq[ŒJ%±Æ¶)××לŸsyq‰‚ÝÝ]?~L¿è£kÝÎZ÷_Lü”,0+Îø—EkMEhcX,Ôºf0¸å|mH¤Å)ˆ”"Š£N`}À›Jž@à ãsB­µíò¹‚^¯×Ö~öz=~÷»ßqxxÈd2¡®k~úÓŸÒï÷Éó|EhúZÓWå~]( $Nhj •«ÜҸ圜Pcùäøÿâÿñ/Lêßòî»ï±±«™N_€š‚Џ‰–÷Žd‚[«ï^vnoYëZ_©ñlœN+ï¸ý&šé>d§[¾Ö.ÎIÅŠª®˜MgL¦Ž9=;EÍÖæ\]gÅ”eyk?7¬åt¶“‘|ΨqËð¢q;Åz§«VQ׆º´h-Q¢ V” HÁ °µ2’8"‰³ö\¬7Ó7‡ <À¦ÛÙìëD»ã3•R<~ü˜ñxÌóçÏùðÃù×ýW>þøcþôOÿ”wß}w¥>Ï»«¿¯Nå6­Hƒ®o^S¤", É”%G—®võêêŠt3!MS”rþZ~óùËÒón.ºA …®5WWW¾8äèè]k6769xtÀx<&MÓ•Nõ»ßÛÎZ¿3§“W»ï®ÆÔ¢kÍr¹D7#bÓ4m2Oož_)E–edYF·¤3Ôwo&Ax/L·Þ ¿ìî—r‹¢`gg‡ÝÝ]Ò4åßÿýßyþü9¿üå/™Ífý„gÏ>à  È·Ö2›ÏÞˆe^Ý„» éfÃ_]]qzæ‚ÿ§³)y/g4±pÀææ&B–Ë%uU·5¢ÝúáîfìMNg7Óó&»³©k½_«kMY–h]£"E’$D*jo·Ö ¤ Ë2òLº©æûH¨ó ÞL‚ã¾0ÝÈ#/B£(rqšñ›óùœÙlFEíÌï<Ï©kçTýÛ¿ýo½õo¿ý6{{{dY¶Ò´òM TÂR«) âœšš3ûgÓ3þóƒÿ“(ØØ˜äœIy‚ÌJ²8Áˆ]HÙ™¥¾r)îq;á•“‡lãrŠîý;—¯p:Á58Iu“ëZ–%.øþêrB¤677Ùï’çJÆHYƒ•hc)Ë0mƒÑ*~2Qåj9;1Jîø^-Ê…Ha*ÐsUD”$ªODFe*„‰°Fƒ•$±BF`5ëjVC~| ðf„g ð@¹+§°Ûþ:Âì›Z®^Ÿ ïrË•ÌÏ(Šèõz­ð©ª !ï½÷?æÿñ‰¢ˆ~¿O¿ß'I’öqUUµ¹žÝçëvRÕ×&hœ·ÎnJJŽŽŽ¸¼¼äÅ‹üô§?e°‹Å]_Ñ+ ’´Çr¹¼@¿²ï×xo^Ù™þŠœNßøã]Æîþ¬uõ“q· `gç眞QkCÅüà?`csk\Ǻ’$qsÛk]£^ñü/ÃZÓÖ€ a‘R`¬EŠæÐÆ°\.)+Ÿ•$1JEÍMWC,¥«ûôs„à¥ç=<|‚ð 8~Y÷‹­oº>Ò ßõçñbÑ‹æõ&$!Ãá)%õWůýkþùŸÿ™ýý}þüÏÿœ'Ož´ûºoœçWñ1¸åZ#Ü&¢h™èSžžÿ‚ù—áý³¬=ÃÄ3 %†ŒÚÆXŒˆP²ݰ{»z)•@ŠÎõkî§D5Áò¬>¾YævÑé‚›;"PR¡”jêjýó©›ðÿ&©®`±(9>:çÙÓÌçsÆ£1ï¾÷.;ÛI’¤®Ý¾•J¢nj;M³ä¾>™Èb°Q»F$ßµîk UÓµ%#jc&à œB}1A_¥ô‹‚Q²KÏ e‚,A“g9›ý‚Üÿ¦’%ÆÖ÷×¾MžÀå®lÎ/šÙùM Ðî¾ïŠ@Z¯ƒô÷ñ DY–ñÖ[o¡”b±Xð_ÿõ_L&Þ~ûmòá>þ.¦OÙ>È©¹B¨#š²›!(ݬûZ/×j…ïZ¿µÍ{»{j9­ÄhÀ‚17bÑ‹OS™¶¼áøø˜O>ù„ÓÓSÒ4åÑ£Gìï?b8ØD*Ùˆ<ïÔzGuµ‰¨u4ÛZNÝŒÕÍd¢5ÇÓÞý…ÇZ6Ö…õךj¦ Îé©1ýx—,"¢®’˜8’¤‘Z‰Prû5“ü’S,Axo…(ŠÚºÎËËKÎÏÏ™Ïç|ôÑG$I£GȲ¬mZªªêV„ÓWAT’˜áää„ÃÃCª´boo4¯©uýê} kÀ¸æ)¢¶ÙË9ŠÎI¼¼¼äè舓“¬µlooóÖ[o±½½íj9õËs8EjÛÈ;·ëÜ;Ni—®ð´Ö6å Î5ÚÕW¥ûâÐËsŠ^(ŠÑÚ%%ÄqLžedy† ÕŠá¶ ¼‰á¾|S’‚'OžÐëõZ¡ôóŸÿœ¿þ뿦®kúý>QµsÞ»S“¾±‰ÀŒ«ú‚³óg,–ç䛂Á0¥Ž ˜;„gëP®»‘Ïv†zg2Ñ­®ô—Ý.ï|ƒ«6%š¥qCUUL§ÓVt^\\ „`´5âñãÇììì¥UÝmÞòÂòÆÙt"¯É麽ÞÑ8žf]¸ÞO+:ÁÖŠºVTeÆ’¦c²dAŠ®Ý}£(j–ßSTGxj­Êͱ]íÀ›IøÚ¾Œ1Ìf3ʲdss“Ÿüä'üä'?¡( ÎÏÏùðÃyþü9Óétey]5M4_GÜRBBIÉóÏ?çôìŒ4M‡ÀÃΉ”ÂÕsvk;ëºf6›qqqÑ øº®ÇýT£u¬µhc0ZSW•«¡mê8£HµÂ Iò<'M!j**Ök}_UG&Áñ ß:.:GÒï÷yë­·(Ë’ßþö·Ìf3²,#MS’$¹3bê #j¬5h®ŒëúöŸœžÂp8d0Œ)ë+ 3·Œ,Lã`FMžÿo³WkÝìέô9ž÷Ìb§»?ÖöwfzvrB;>ªíbB`¬s§Ó)œž1N)Š‚½½=vwwɳœª|>ÜÝåtÞ=yÈÚ¦´áV>§núÚu#0ï¶mG$Zs#d11ÖÔØº#„ÙÀÔu©‰P$qFšÆ$ HåÜÝvªUw~} xãÿz7 ŸãéÿÞÍöü}Žœüªø°y¥T;Y§®kvvvø“?ù>ùäŽŽŽ˜L&\__·¯Í7usDýþàÆë怮c´Á`¨¨¹¼¼äììŒÅbAÞtW£Ûîëu^ç¼¾ª+\N§òö&Å-G÷¾„%qì²:çó9WWW\œ»ÉDJ)†Ã!£ÑˆÁ`€T²='RIÔ78k¾{¬º®©š÷,jJ$ªª¢®5Iœ´Ýõþ}ã˜$IœèìôW}].w øv Â3x ø%åî„ îRãC–/à )¿Tì»Öòøà®®®€›¸¿4ë·î¹ò"æNDM S&æó«OYVÇÄ邬W£¢Ä!5J”TM3‹Äç@Z£Ä(‘"eÔlq³¥@„ !Üý1BøÍ]ïî!Eâ6é7·?l„$ÁÚÆýl&I¬q¢Ñ‡ÈÏçsŽŽŽøì³Ï¸¸¼ Žc¶··ÙÙÙaccƒ,ËVJ”R®¦Stç©7Û­ëk·ùëýý^ã=¨›f'c-Qc­f>ŸbË=ŠôGäÉc»X“«y^e=Täúš¼ÑÚvîûqžæÍýüßgÂR{ ð†±îjzAÚæ:~ËÑ¿'îêRïæ|>yòc ü1Y–ñÓŸþ”<ÏWÜÝõ)Nq3ææeî˜hþÌçs&××)èýFY¤R÷J«×çùº· !n–ÛÛx¦ÆÙ[›I.…rn(Î:¢óôô”ããc®¯¯±Ö2 ØÙÙa4‘¦i›}é_k}‡‹ºÚÕþUY߇Ÿ¿^ÕeY’7©Qµu£*RdYÖŒO½i¨‡îgÄѼÁá$½^þð‡XkùÍo~Ãûï¿Ïh4âÝwßmï³>FÓã—ŸïP5’˜0™r9ù+.É K’Væh3Ū ×ö׺ҭj®»¯k½™Ù~Wg[§(¹•ãiÝr!$Æ‚$iÜ\›äDg„šÅbÁÑÑŸ?ûœ““´Ö úÆã1ÛÛÛ ú¢(rSŒêºMB¢} çúd¢•OíOQ»ÉE/éj·ò‡H)la¬ݹ\NAÔô’÷ˆcªÂ鑤YÖ#ŽR”Zž·y3¾\U‚ð ’$qõOž<áää„““Þÿ}â8fŸ¨ xô³®ëöºW#°X&××\\^"„ WÄqÌ\7##¿¹È×ÂhƒT²ÍõÝëžÅbÁÙÙŸþ9ÏŸ3ŸÏ‡ììì°··ÇÆÆq£«yµÆ¶¢SH÷—À7óÖïÍñ´Ö S{Ûî:òRJâ8¦ª*‹eU"•¤Ÿ÷Q‘¢®oêN½Û'ê–ã¾á$ÖZʲdkk‹ŸýìgüêW¿âw¿ûq³±±Á`0\½o&ò¹ ÝzÏÛ8¡SsÍÕäˆéì˜^Ñ£W¬˜SÕS„Ò ;Ýp»+}Åí¼ãö•»nçmGÔ-%75¥J"Pnb‘cjŒ1\^^ñâÅ1ÇÇÇÌçsÒ4e{¼ÍþÁ>ãñ˜8Š©uÝÎm—BE‘ëo§ŒîL&j_«iD§Ïñ\s<Û†¶—ÔÑvÞCÑ.±×Lg3´®(Š”ŒGD$˜:rã1³½l“,+Ú¥» Ng ð&þ‰Ön)9Š"?~Ì“'ORrxxÈÓ§O™ÏçmC’™Æ¸%e_z?†Ò”\__S–¥ë¢Ž“¦Ûº™Íþ€êd}-k]Õ,—K®¯¯999áìÔuã§iÊÎÎŽ£q;뾪*ªÚE( )VΓéD­æu:§óe9¯³èæ 6†årÉ|>`8’$ÉMýª”äYN¯×#IdøÍ|‡ Žg xpøØŸî¨ÌÑhÄücNNNøÅ/~Á`0 ×ë1ÛX&ßhô2ÇÓ`°ÔÌÍsfõçhyMÜÛ‚H2›M¨¬ K{X£k @6ޤ°ñ²YìÞél¹«ÆSÑZ&e÷~Ö¹MHºµÓ8ºeUr}=åêjÂt:GŠ„ÁpÀþÞ¶Çû¤iŽÑ ÅZÑ.º œà¬ê%eY‚¨›¥û›ìþ Å¢Wk@YMTзÞ8¦ÒçâD.6˜ L‚6†jšRM3zEL/Ý Õʪ£ˆ£œ,í‘ç}çvšNåhHP ¾S„ï•@àÁá3¥TëðEÁøCF£¿ùÍo8??çâ⢽¯›I’ÇñK;û Î[,(%›Ù嚺®îmXê"_ѵ¯ž¬óÒ®û¦‰hk4µÑÔºf±X0›Î¸¼¼DkMQŒÇc6·6]©5ÔMª?'~_F»©EF»šOcMg³íöU»Ú­qSФrA÷UY²X,HÓÔewÊ›ÎþHE¤iJGå÷ñ•!¦ˆœx[.—\\\pttÄéÙ)Zk¶¶öØÙÙccc›, TÓ4ÔäsÚ6Þ+¸õ®t³Vù—dÚO»z{óXÅbñ)’²¹WT‚HdT¥fz^S/rõ„~2&›íê?£(&Íbò^J’ܼWÚ¬6ïá_u x´õ‰M½¥oJÓ”ÝÝ]0ÆðÙgŸñôéÓöq¾Ñèe(%™Ïg!ˆc'xŒµH!ÍhÉos$©¢u:—Ë%§§§<þœ““–Ë%RIžy!¥q CVc­Æ8²›Ïé~®oF­vÍNPüª#ºæx6^§1Íä#Q5·6¯Ïd(‘`uÁ|¶d1‹ˆ¢œ"ß%KF(Ó£Ö¥’ÄÕú÷,|÷ Â3<8ºÂÏ/µ{×ÓS?æòò’³³3>üðC²,c<¼ÔµâÆñôœµ!*RM}©æÛ\ªªŠ««+·¼~zÊr¹¤ßﳿ¿Ïîî.ƒÁ uE­µèZ£Íê8¢»…£m»Ø­±+‰ü¥µ]×ñ®ÛííÛ}=©qï“.Kó9Ö èõrŠ¢pN´%%qÓÉž¦éJID·Ì"|÷Â3<8|Ž'Њk-UUµMG»»»\__óÁðÉ'Ÿ°³³Ó ÏWQ–ÎŒ"…¢‰’¯Ñt³6uèŽYë š.vÙéZ}dz®k®'.$þäô„ÙlFÞsýû.»4–X«©ª¥;7õ]k¤òqL¶™™¾žÃ鮳·f­w'Ý!,;ާ±¶évïN6Jš‡g˜J²œf”‹Ɉ<Ù#‹wÁHl£¢ˆ$ÎHâl%‘ÀO:zH«@ ðfj<ʺãó}¬}óužª©»wf³Ëå²]rÏóœÉdÂéé)“‰‹õ±Öº8¢æ>æÅ‹T•kxé6&AÇ ìì¿®5Ö"¥°ÆRW7Ó‹îãË ÿ®ã)¤ r÷¯ *+.//9>>æêê ­5ý¢ÏÖÖV;ßÜh7ÿÜ|Žf—¯£>Ò¶Nf³u&u_‹ÿÙ‹r£ óù c,q“å*Ѝ›‰Iq“÷r«ö¹Vž7ÔwßY‚ð cL3²¾%¸½•R6¡p} ¼ IDATï‚ z½×××<{öŒóós€¶ùÆ/G‘›&´ÔÕ×p”Ïn{ãtÞú¹Ý¤s>…$R7®îr¹äêêŠÓÓSNNN˜N§ÄqÌÎλ»»ýc U]5çÅu°[šÍ®n†úÖuíý­ît®ûmµiè&Ri}Ó R9wÕ˜ ),qT EÆr3›(¤Ù¢H‘ÅûØzƒj‘’gczé6q­~ß ‚ð Ž®ÐéÖizürûl6ãââ)%›››ÄqÌññ1}ôQ§y(ºUÿXUõï÷Ý/×L4NÛùóÞíì=vvvØÙÙ¡ènÖºyuæÝ¢±+&ÍÍÔ¡õû¾"§Sú2³ú…ÀZKY–TU‰TŠþ`@/ÏÝqk…Uô òƒÁ ÝG]×ÈX¸îoÓ£iUÛõm›9ìn‰ø&‡³ë’ ‘s.×s:ý,v_ÿyO’Mº¾ºæøø˜óósªª¢WôØÚÜâwÞ!Ë2„,æ‹Vt· SëN'k]á·f­ßÜn¬Å°lf­ËÕÛ-#,›dû’ÝeÓÜTM‰£˜(걬kfW†å˜!E¿O?= ¦u†Ô1ù ÏææyU Z@Å|ÿÿìÈ}õ{ßÅÎöõD¸©Åìv—{á9ŸÏ¹ººb>ŸE‘›Užçí(ÍñxLš¦m­ä:²QP7âu›Ù¹î(®sÓ‘~û¿ÎnÇz÷ºvÞ¼¹éÎWÍó- ...¸¸¸àúú!ÃÁÑhÄÖÖY–¹Nûº¦Ö÷×¥ÞÊêÔ¯.%Ýûµmõ÷¨®+–Ë%àòGëªf:›RÕI’Pôû+c0ã$¡(zä=Pҹߡp øá<@Vó"oÁ¿KÜ~«³º›u]S–%‹Å‚ù|ÞÎlOÓ”Á`ÀÆÆqSUišò³ŸýŒëëkŽŽŽX,Äqì‚èјjÉ{ÿ7ôlD½¤ª‡’K`N¤,Ø a„IPf“Èn1@Ù>‘HQÖevb#)JäH$ JÆH!…Ëëôø15²™Œäó:ÏÏÏ[Ñ9 Øßßçàà`ebSW¬¶å´‰š "¬CÓ.ÜõFHŒ`u“%V– K%È™ÛÚ¬OƒTáó9¡#þ-TYE\G$&&š'Ôg{ÙcÀÛñÏØ°?"­-öHä£á#FÙ?fãjT_1À)| Â3x€Ü'2¿ëÓ‹¼ãæs:ÁÍ,ŸL&L&“ÑYI’EI’ „`¹\RUUûØ‹‹ ޱֶ“s*ëºÝ‹Âu‰»H&雵÷º~Ýã»ëöîmÞåô—J©vúR­kfóY+:§³)RJ†Ã!ãñ¸Íë,Ë’º™¢Ô}ÎnÎå}î¤ùŠŸßÕ~ßyR’åBfÓÓ™kˆê÷û ýö\K©èå=ýI¢Ð@­ íÀ÷˜ðÏ?|+tÅS·[Ý_´µœ“É„º®ÛšÎ<ÏIÓ´ ”÷ÝáUU¡µf¹\²±±Áùù9GGG_»i2×½.ÁYt^Ôu»Õ»ó×½ø¼y QµŽì|>åòò’ÃÃC...еf0°»»Ëîî.Y–®ùèe´òM“ÏJþf“·éj5ý²ûMs»Ÿv5žvýv°lçÐÞßÚš8ŽIíå¼br f2b¿ËVö˜\ +uAÞ+ØèoÓχi¨j°U»Ì¿^—¾ûá~ïtÛnž%°²¼>ŸÏÛnt/:‹¢h¦ÞÄmìR]×,‹Ö%ÔZ38>>æùóç”eIš¦®ÁÈÔ$iBš¦.„ÞZt­‘ʹR5ÇòrÝ÷R¤’Èf|·)HkÍÕÕGGGœ1_¸ŽüÑhÄÁÁ£Ñˆ8Ž©uÑæ•’¬5.É8hšË›pøN1¥Xž¯Cw{wŸÖZŒ6̦S¦Sˆ¢˜ÑÖˆáp”UI*%½¢Ç`Ч—GhӸ˸)QB„·@àûHž@à[¥;ÖÒO,Z,L§ÓvÙ<Ë2’ĉÅ$Iˆã¸Íæ,˲V*Ëc išÒëõ¨ªŠããc...ØÛÛë¸l–$É>s-¨kˆ"‰1’¦–ò••H¯ïÖÕu1†ÉdÒ.±Ïf³¶9Êçöz=×¹ÿÒwÓœ/7}ÉZ§oɪˆ>‡Ów«ûæ$ŸÓ)œÙé©X¶û÷9 ¦#R[TçTF°¼ÚàúJÂrÌpk“Íâ§Ä¶OY ò|H¿7"Ë"(¨kïÀŠ&•Nþi ø>„g øVðõ”~É]kMY–”eÉ|>g>Ÿ#„hEd–emdw¤æl6c±X´N§‚,Ëè÷ûÄqÌd2áè舽½=W;*œ°”J¢"…­ãá:½¥RýìNšIB 0P–%³ÙŒ³³3ÎÏÏ™ÏçÄqÌææ&û{ûŒÇc’$¹sJÓ]˜fy¼[Ϲît¶·Ýåxv¦ݕӹºdó\~«ªŠj>§ª+ý‚ñhL¯—·"µßwóå{E!Üž "…0~&¸žÀ÷ <À·FW|VUÕÂWUÕ6 ùZN¿¬î7ïtúåx­5J©ö1½^<Ϲ¸¸àððüà ‡C ¹“X6B‰«SŒN°Æuª b„Pw8qS÷N§_þ—Ê5•UÉåå%§§§\^^bŒa8²³³ÃÞÞÃák-óù mJz)Â9Äí¤¢¦¦Ó;¦u<§Ó×r®çt®çxŠÒ]/4Vk j&)ƒdbtm1³?$1†Þ0Lwõ˜årIžî°¿sÀhk)]'|i‘2ÄJ¸Îz£á×O ð½$üË8]ÌŽôׯÇu3/¿ÍÎ÷ûDS÷8ýØK•ä—Ê}3Nžç+ËêþñÝ}ÊÑÑQë&Z+ÐÂ’ˆ>ÞåÙÅÿÃÅÅœíƒQ1ŸOÈóBFcZá)÷iQR!ˆ°Æ¢µ[Z×èöu !Ú÷g¹\rvzÆÙÙ™s³œÑhÄ~ô#Ò4EAUUXcWœ]»7Ö`­«í4¶ÉÁ´¦YÎöõ“Íô%üT&ïdÞˆa!À¶ÕÍã…qÍI¶jòNc¤Th#ÑÖ"íÀûiÄd2á½â]º€ÜAÔ)‰LÉû=Æ[$ ghâG]óæ¥qU@à»OžÀf½æ¯›á¸>¿¼ëx~ÛYŸþ8üñûc–R¶êu]·ŽeUUXk]LOš’¦iøîë:}Mçr¹l—Öý~}n'Ü4)ù@ö<Ï9==m§I)Q($®ë:Š¢f Oω{/d¥@Xá„§l"’„lO¬»4#oGC é2.OOO9::âúúš$IFMS†Ã!‡‡‡R×5iÔÇPa‰I¢>IÔ§®f-›ºÏÄexÞYãé.­½Ñ}RJ$«ù£B tí¢“9>>vã0‡Cö÷÷F®™¨Éêô>w9m#‘¿_boòž,º7µž¦›ã¹^ãÉé¿™¤ÚšN¥"¨Ç”³ “³ k-›É²•è‰!ÖX$9y¶Åx´Çp˜£ ,KEÜ®‰ ‚3ø>„g øÚéNê Hc ‹Å‚ÅbÁd2¡ªª¶ÈG%y—3Š¢[¢Ó?Ö×vó?ןßO8ÚØØàóÏ?g2™°¹¹Ù£gYF–eÍ>@“R¹nôW4¶[cã)¥»?`´i»ë¯¯¯9??çâ₺®ÙÚÚbgg‡ÑhD¯×kÄݪмËåôÏÕÞ§ž˜#cAÜîF¿¯kÝÑ,é‹FtÒ}ŒÑuU±œN›±£î\ z²,#ª#d,ÙÌ7FýÕœ6÷þ¿Æ%|ïÂ3|íxñâ—Ö}Íã|>oG_zÔÏ\ïv¯û¥ø®PõÍDUUµû¾_'©µ¦ßï“ç9çççœ5ÂS ÈÈó!y¾ÁÅùŒª›+¤¼Ëí\}!\’M)€Ñh­™/æÌgs—zy‚­­-ö÷÷ÙÙÙ!˲• ¾Ö]ή(]¹O+8›‰ETMx|ã€úîöæúÖéló<Ýãu+j«vÞé”Jbë>ËùœëómRéÏØØØ`#þ $}6†ìwÝd¢¥Ö€!ŠBJÀg‡vO^p<ï3Ax¯nóˆw-«ªj¤w:ýøK_ï蛪|=§19g6›±\.WjE_Ö âEél6kë*ŽŽ8>>æ½÷Þ B‘7Ž'pÓÍÞ4½nlÛÉ® Ëå’ÙÔÍa÷ÍDƒÁ LäÚMãѺ¨\w8_zyã|š•û˜V ®8žvÕñ¼Ù¯i÷ÓJäÓtÈ¿±±Áh4"3nÆý@ ØÜÜbccƒXJJ]QU5q,‰¤ûÕ¢ÃHÌ@ °Fž@àk§ë8Îçó¶Ý ®<ÏÛÑ—^púÖJ¤Q/>E“ßi#lÚ<‹wF}~Å|1e2™p}}Íd2iBâGììì±1Ü"Žj]£k‹ºiîÑxì8 .ó©] ÷BÒ4N&€nkž¿ܾ>YÈÃûºÌ8ŽI’dey½›? ´5…ÝÎuÿZº.ª_Â¢èæ¿8X¿˜/Úë –¢­iNXVÑà–ËèºÖoÜ\)Õå¥ë`?»äòò’årIÇŒ·ÆŒ·Ç ‡C’$a¹Ðhã–Â#ÝË;]ÊÛçûFpÞϺƒê¾¬ÝÇX¤’DÂàWeÖ5õbÖ6(ÅQL/R=òÈ•EôóƒAŸ^Ü#Nb´]=ÇÝŽx%@ pAx/L7¤=Š¢6ú¨,Kʲ\Y^OÓ´-êv®{Çó®œÎ²,_êh¾ŠV5ÍJÖZÒ4EkÍd:qKæ2FP‘È ù.Y´E=¨æij&ÔºÄ6Žž”¹»´ R*”œºeéù”ÓÓcŽÎY,ÄqÎÖ¦ëbmHÓ]ä—Ÿe(|PÓhÄM’ÿ¹½Ó©õlj<Ų¹½r‘JMm'M¥gÓ߃µÍù°k ÒH”ˆˆeƲZ²¼”Ìg[fdyÆ0ù1yžÓOD–eÙýE¾I–fÄÒ¥–Ê[B8,«W„g øÂ´µ¸$/}\R]×mçº_^ï:²¾¡è¾œÎ¯R*àÅfÇ­{YE;3]” k,I’°±±A–emC“§+`-Îéô5’eåÜÙËËKNOO9¿¸$ŽbF£»»»lnn¶KüÞçJ)Ý‚¸íJs“ÁÙ}èj9×ngÕ96ÖºãdÝI5m·|]UèÊ2_,˜ÏeYišÒï‡É– ùˆ¢(Hã>ËÀ—&Ï@ ð…‘R¶Âh—ȽcY×5išR½^,ËÚlN?u(Žc„wæt®×¶~Q¼[š$I+üŠ¢`>Ÿsq~…s笉Iã››»ôò!Ë¥f>/‰"…” „E*×.…˹ÔL¥™Ï\çúÙÙ³i‰$¢ß²³³ÃÖh‹4M©êŠªÒM§¾;6!-BZ¬Ñ.sÓ×¬Þ ‘ïŒF5]'´Ù‘õyémM'Öq?ú‘—¸ºXk¤klª —0p¹AUUÈå˜~S¤o±Ul±Ùÿƒb@?{â⮲-²8#&nž¿©¾Y)8@àõ Â3|aºè‹Å‚Ùl¶ÒDÔëõÚÍ×ú˜$ïfzúer:_E· À Ù^¯‡ÖnŒ¥hAc 91››MÈü‹…¤ß/œ[j (Ù,Ù;q¨µ¦,K&“ ———L'S667ØÛÛc{¼MÑ+К湛×aeS^àÃãÍêÒz+_ÿ¸8Ž]'¹uã11L&3¬ œã1 èY’¸O¹išâ8JirR<»h€RJÑïõ`nKkRб˜ªRÛÇIÙDe:ا¦¦˜›ejjªlh‚Qm¨VèÑrt–f¤y‘š*ãl“îæ$¦&´Š¶t!RµU,¥+M–¥ÄIRÌOŠ:Ú,˶í²srúO»Ý&MS‚  V«Q¯×Çj7óÍNäDY‚eAœéû´»vvvètÒ<¦ÙX¤ÙlÒ¨·pJY¤YNšæd)dÄh¥ÉFù9é¨F3G²Çqj”‚,KËóX­ýLÓ •)”²°ó²4# a8 < Ôµf‹&¡Úb!8§—™žn1U[Æu\jÌ¡µÆQS•y²+:µb×С)Âc@„§ {bœBS³h:Ï{½ÞXF§çy¥ÛYíZ7sØÍL#:M÷ûŸ[ƒú(Ç¿ëê²LŠeë,GœÑ$űfffØ¢("Žc”R£øA)¸‡}°‡¹¹9õZ×uG.d¶ûÜ”YZ¯6í^â²ÈP­ï4g6Q:¡sÓ°õ¦ƒ¢^6‹iPŠ"s~f©©)õ%ZÓÓ4›‹ÔÝ:-,4öh©~ü¤=™×BÁ ÂS„û¨6û¸®Ë`0 Óé”ËëA”ÝëÕ%m  ”7añU§s8–ñF0¾Äþ¸©–!ŒõTdYáJ* `Ç®]c¦µÀ­ÃA„Õïc;6aÒc0è0î§},§F­VˆÔ °u0 £ÏÊžâqˆ4Žg<Š#JAõ“ÆMœ ¶maY^Y¶EI“$)*õЦ¡¶Oœ(¬tǶ¨{-jA@à-Òh4˜>G³ÙÄw j5=…F£€4ËP¦¶VÑSdÅxM=:Åè)˜C›Èë*—A„§ ÷aš˜Œp‹¢¨ †÷}¿˜lS¯5U»à-Ë*ÃâÛ†aÙpô$'ŒÏ²7ã9Mw{STYéO“´Èóœiáßñéõû$;ÛAa>$Š#Ò,Ãuê~‹™™™²¶U±;úŠÉDYž‘åãu¹»#13´ÒX–]n—©Qý¦q:3M’¤$qL0`0èÎ_!<ó<ÇKf±‡FP-¥Ÿ¤5Óbª~œZ­†g-aaa3[ˆ\4 ˜ÚZÒ?ªAU¸”Ó<¥q]„'„OAîÃ,MW§Ôëuêõz™ÑY¥*BÍÅdt†aHE徫qPOŠª {_:@šQ5žf)Íú Ód«ße˜ôÉM¤#Ò(Å!Çõ}ææf™™!°s²´_LFÏrP (ÐV†ÊròlXÄiÓÕž‘“£HsPÃB@&±…Íç$I‘í™&!aÔ#Žc’, éßõðݾïÓ²_£V¯1åÁïSeêõ>³XhRj£G³ ã2ƒ<:X \;)â¤ò¤hjdÃÞ'>ãYÞ.Ýì‚ |qDx ÂÄt‘W›pL—¸©§4÷ÛI±õE°,‹ ¸wïÛÛÛÄqL³Ù,–n}¿<STPš¬ß4ÏÅqœòºË´æ¹î'Lö÷8ŽKçÕu]\×%Š¢¢iJ;cÛY–¥-rr\\‚Z 9‘iº¨™DùÅ„ŸÖ4õZ—$IÉ2,`t¾•΋ N©CLL𿣬ÒxävÚdyư3rc‹8‰IâQWúèœØnÑùîyEWúLkŠÙ¹9Zõe‚Z@-ûZQg«ç±•ƒÃ4 ENNLR43‘¡2³Výz IDATò¯(l ´*^3…J3²TM¤"ˆó)ÂãG„§ @Œ ìõzÔFBÈLàiµZ¬¬¬pìØ1ƒA!Š&0y™_ÖQì÷û¬®®¢”bii ×uñ<¯ŒM‚Bdš%öêºçy ‡Cnß¾=–Ói‹ãfÛý0ê—ù{5¾ÉŒŠ4MMµ©Œ4ï Û°ð©3Û8ËgºCÐ#É<´“ciE£ÖDgš¬%=ºÙ¨9(Ÿàcò9MƒRšÆ£ãˆ ‡D½B»Ù–`eS¸Já+­J·p]‡Fí õZÀ=VˆþÚ1jõ:zÇK‡#GS§ÕZ£\PS@jÎIå:g׹̊ex­ÇÏçý¢s|£YA„/„OA8 `Æ0  ܸq£Œ-2Ë×ÚþË`š‚ÌÌsãVó<Dõþûñ$ã”LÎiE¤iÊüüHXšF"3fs/ždƒ‘9®ª€6ÓŒLã“¥Íãçä¹j(|šÞigÜùìQ£²)T®Pa¥¹.–ÔkùJ+²=f–›ŽcãyÅ8Î ¨Q <»H˜vp]GM¢t€ã8ØÔÑØÀ4…-iíîx4*½X: ÓRí÷Ý>yš'~ÏÍïûîg§‚ |yDx ÂEkïû¥»éû>ßÿþ÷ùæ7¿‰Ö×uÿlqù Ç6M@fBÒälø‡Õ>Jý铟Õc e‰Àêê*­V‹K—.‘ŒÜÂŒªàRnÀòÒ2ŽÿF1–ÔÚ=¡nñü8®K­V8“ù}Ž'(­Fµ£˶qlÛ,êãŒ~ž¥•š˜˜(‰[;XÚ‚¼6:2Ó¥_\²'×—%‚ðÄá) ”$ Q1==ÍÒÒÒÓ>¬CÍââb£d£F“Óm´òQ¹ ÊÃe™¥ùæÎŒÄópT;Ù'£¨é´”…b¨=àw1Ëâ HÈHGÝêZ)” и8JãØ9Q˜gJ…Å’½rQZ¡¿°C)‚ppá)ÓcFW611I’Ö[šX£/[çY°cÂ×Í2u56éA]ç{5Uy’KíI’`YÓÓÓe-l½^'ŽcºÝ>Ží`îÈ5ÌGÏO“’9®rAe#—1‰Æœœ F3Í#rb wr“Ù {Œïå{ª´¨Ïµ½ŽVQO«F Cžç^ƒQôTVÄ@™3ª­ì‰9Þ‚ O ž‚p1¢ÌŒ¦4ÃäašX"c´##Ó‡ÙW’$÷ݶŽãìÙmÿUQ w]·œ¦ÔjµhµZ¤@šdX–ÆÖš›8ÉQzj”owy›‘>ùèœg£ë=Nƒb·‰GWºÉµ*„§eAõ¥ËSHˆRŠ$¥p…Ñ•Zi°wËžt¿ “B„§ @lÛFk]Nþ1£)šÍfy¿‡‰¿ê}Æ£r­¾Òlc¢ªµ“æ´Ý~Žçäd¤Çq‹]×% CÖ××iµZÅ<ù$Çó<â‘£ké¢YÇV€­H³[V÷×n»Í9O=Ò ’Q?UžõÑ©5Xªx¼œQVæ¨YÈÒÅEé"P>IF"Sç£×+s¹Ÿd*€ “B„§ @ÌR±çyôzÅ“¥ÙétJñù(â±::ò‹b¶y³ú íö¦_å±çy´Z-êõ: ‚š‡ÎYV´÷ô£ÛSØÀݵ6 ó-\Âx·™FŽ¥*¦y–µÛ{®u1ë<Ï G³º-÷SŒn/VõËûä£íÒ¤ØO†.O•ŽÊÔ¨Ì!­ìMáp!ÂS ¦¦ á†!N‡?þñ\¿~V«UÆíE5@ÞÔf>è1öÛÞäx¸Kj„ãA]ò Ã~¿Ï›››DQĉ'ØÚÚÂu]þê¯þŠ…ÅE²Ñ󈓘Ôséõþçw¿Ã²l’8%Í2,mc;¶ea;N9M¨ÙðGS…‚  ÑhP«ÛØ÷Ÿj «a˜†1yžãZ>žŽ ŒÄ+ $ñȵ evhâ2ÁýIžBA„'‚OA8€˜üK3’2Iî޽˛o¾ÉÕ«WYXX`0†ážÛOºœÕåöêrù~<È%}’óÕJ)|¿q¹½½M­V£Óéðñdz´´Ä_þå_u˜y Ø(]œï­­uÞ~çlomÓíu‹}ábi¶4Z[X*/f¥Ïú¾c_¦¦¦˜nM3==ÍÔÔ­V‹ üÏó°´C-ÐÔ‚¢ö5æ£åt ;/\NeƒoJGM^ç}HC‘ ‡ž‚p1SwÌÔ"ÏóJ—qyy™o|ãÌÍÍí;¹ÈV¯Ïœ¬óÜÓ¼d:ØM–gõç8ެ5îl–e´ÛmfffȲŒ••ÇáÔ©SDyátŽmÙXS¢Ò$egg‡ÿøÇ£à|Êç›eyštï½~Ÿ4Œ K[8®ÃLk¦ 3-XZZbii‰zmÏß ‡Cˆã¢&Ô¶e¥ Ï."<áb–ÁM‰}®ëòüóÏóÃþV«õÀ#8‹yáé˜ÓiêG÷Z‚¯b7MÓrY–‘¦éŸ5 þIcDuEôû}æççY__çW¿úUYž`«TDŠCš¿A='häüå÷¿Ažg¤IJ’&$qB’&dqJ’Ä {EÂ@–¤ ‡ºÝÝn‡n·K§Óe}mƒ»·ïbY6A03Ób~~žÙÙ9fgg8á<¾ïc[6ާœ$ £âœÛ¶;þúäjTr<A8„ˆð„ˆq+ó<' ‹ñápH»Ý.›e666¸#ð4Þ&t8îëzVo7BÓìgRÄDÌsÔ£zÌ Ês:‰¢¨ˆY²Œ+œ”‹“"—óÞ½{èÊó+Ët±Œ?Ýla[6¶©cƒýþ€Á O»Ý¦Óé²½½Åöö6ëëëܾ}‡<Ïp]—Öl‹åcËœ=s–3gϰ0¿ˆmùeè¤C-‚ð, ÂS0q\ˆ #žâ8¦ÝnÓn·©ÕjûÎB¯Žº´m»tFMö§mÛ €7sØ•R¥è4µ¦Æ1ܯié Ç1Ãá(\Ïíím†ÃáH|f ‡}·øø³°ÑrÂp@š†@‚ë펨ÔJ¡­Qˆ~î' ƒî,K±´ei,ËÆ±LO5˜›µ°NÛ¤iB·Ûckk“ÍÍ-¶¶6iwÖi·ÛÜ]»Í½õU>ûü:ŸÜ8Æñã'9qâ‹ ËÔj5´rÉó ©éáYB„§ @ŒË˜¦i™Ç9==]Ö|Z–E·Û½o‚™,”¦)Ýn·®&wÓ¶mÇ)…åÃŽ!˲2´> ñåö¡µ~à}¾Š¿C!´ûý~y>ò<Çv,”V âÁèÞ95¿†¢p2KE1I'!i’’f£†¯ÜFk '+š„²l4h$>=ÏÃÙ––eÓhÔi6›œAàӚΘ™oqüØI^zé¶¶¶¸sç·nÝâÿý×ÿð‹Ÿÿš‹—.òÚ«¯qêÔæææF¥ &:&…§9Æ,“‘š‚ Í㘺Î^¯Ç`0Ø MŸPƒÏÃdÇuéß²¬²ŒÁ¼vÆÍ®¾^FƒÙÙY¾õ­oqéÒ%®^½Z^Þ~ûm†Ã!‹‹‹œ9s†V«UÖ“>Êñ ‚ <-Dx ÂÅ™ä8®ë’eý~¥I’Ðï÷ét: ƒR°LMMá8NYZ­m4×Õ(&Ót4K×ÔävG´*^Åý|¸°3çnRàCqþ«n¥éÒ7 [ZëQh×u™™™áÊ•+œ>}š?ü>ø€û·cyy™—^z‰—_~™'N”û3û’æ"A"<ábjÍÒ,ìfpVÇWöz=îÝ»G·Û%¦¦¦˜ššËé4bÆt¢›%àÉf"3å§×ë†!I’”î[õ¾FÐuñùEë'«"°Zú°×(SS“ÛétŠÌÏ»wY^^fvv–W^y… .ð¯ÿú¯„aÈ{ï½ÇÆÆÏ?ÿÊ%}ÏóÆjyMê ÂW‰OA8€±ãº.ŽãÐívi4<ÿüó¼ýöÛ¬¯¯Ójµ ŠÎéF£A³Ù,ѪàÚo©(k ÍR½‰Lª ʪ€«Ö{VgÉ4ª5•F€›©KÕÆ ½Ä£„UÇÙÄIúaužp¿H¯&Lsu´i5IÀì'Š¢òù¸®Ëòò2?þñ¹víZ¹üþñÇóâ‹/òƒü`Ï×ó ;áÙF„§ p,Ë"ŠŠé8&ÇqccƒóçÏ—Ýëõz}lyÝÔ N:m{u°‡ÃÒí4Ëë–e9}{æ<ÈÍ+Uái~ÿ²Ž§ÛÕsù(Žçäãì7Þt¯íŒØ¯º¢Zk\×%Ïs:¶m—±J§NÂqÖÖÖèv»¼óÎ;lnnòòË/sáÂ…r¿;;;¸®Kþ$‚ð$á)3eÈ4ǪÙlâº.·nÝâûßÿ>Qáº.µZ­\:Ÿ]f©·š%iܳjN§Yž”¨ áéb‚ñCZ¯×9sæ Fƒ7npóæMîÞ½K¿ßÇqž{î9”RxžW–Wä2 Až]Dx ¤ZŸg²:¡˜×Þh4X[[#ÏsêõúXž§‹Õ%eSÏYuçLHyµ‘ȈÎêvÂÁ¤úþÃn·K½^§V«qæÌšÍ&«««Ü¸qƒÍÍM^yåÞxã @9€Àqœ§ù4A8‚ˆð„ЉK2Ë¢õz™™VWWé÷ûxžGû6ÁÀxs‹Yn6±IÃá(ŠÊmz§úa¡úe"ŽcƒaR«Õh6›ÌÍÍ1==ÍÕ«WùøãÙÙÙA)Å·¾õ-|ßÇ÷ýGy*‚ð¸á)”ªƒifˆ×j5æççÑZ³±±Áüü<¾ïÇ1qu®›}TE§™¹>K±R]^§óp`êwÍŒ÷j­nš¦A€ïûœ={ÇqØÜÜä¿þë¿ØÞÞæÛßþ6KKKRN!ÂSA„§ ,Ë" Cêõ:³³³xžÇúú:AP«ÕÊH$ÇqÆ2@ ¦®/ ÃÒí4±I0.P»ú¨Í0ÂWO5ŸÕqœr‚•yM;–e±°°Àôô47nÜàÓO?å­·Þ¶m^ýu–——ŸöÓá"ÂS(Õe懲iÆ#®¯¯sòäI,Ëbgg © Œ5·3 Cúý~Ù˜2\>ùø‡•½f¤W;Ü¿Ès«FHí•çù40_,LS˜ ¤7´ú¥Á÷}æç燴Ûm>øàÖÖÖø‡ø‡±/fv¼Ô} ‚ð$‘¶FA8€T—Ø¡p<]×`vv–z½ÎÚÚsss8ŽÃp8,ECUt˜@ò,ˇt»ÝrædC‘ù¹ás˜ÙK`~Y¡8)>B}¤Õ×Ìt¹›×Óä~6›M™ššb{{›?þ˜þçæ³Ï>+÷79åJJ.Axˆã)êÔ êün("•¦¦¦¸wï½^z½ŽR Û¶Ë&“ÅiÄ„q;MtÒ¤#¸×χ™Gq<UXíQµ×ã< &kx ægS÷«”¢Ñh”_(Úí6ëëëüú׿æ7ÞàÂ… 4RÄš/áþçèt:LOO— Gæ="ã4AxÈR» p&Ç36›MNžÛ˜¸%ó>0Ëï®ëÒh4˜åäÉ“8ŽÃÊÊJ)@\×%MÓ²ñLáq"ÂS0ÕF¡ê$¢¥¥%¦¦¦X]]åÞ½{eCHuÔb†ôz=:ý~¿\b߯QFxvØ«±ÌÔõæyŽïû?~œ‹/bÛ6¿ûÝïøÿøºÝn9šSj<Axˆð„Œ’“4›MN:UÖê™usÿ$Iè÷û¥è4yÕ†žÏ>æuN’dL|ÆqŒçy;vŒ¹¹9Ö××yë­·øàƒÈó­µt· ‚ðDá)# fù3MS^|ñE¢(bccƒ$IJñiÛ6QÑëõèõzôû}’$kPÑùlSít¯€ÝAÃá€åååòK̯ýk~÷»ß•Ëî‚ i.„ÊdçµY6¨ÕjLOO“e[[[DQ„ïûå›^¯WÆéì·ïgU€šçU­­Æ eY†çy$I2æ([–5V[ݦzþƒclŽÛDj™×Û4™/1FƒsçΆ!øÃ°,‹ùùyšÍf9’Ó¶íò<íõ~AxTÄñ„ˆ<žç•·‘ç9Žãðï|‡f³Éúú:›››e„R§Ó¡Óé”!ñÕ1š¦ÑŽŽë¹×ó¬–$˜|TÓ|†á˜ð¬æ›V?èçψNç‚"¶*¤ëõ:çÎãÛßþ6«««üÓ?ýN‡ápX¾ï {Å7 ‚ <*âx ÂƶíRäT—ÉÍÏÇŽc{{›••fffHÓ”n·K¿ß¿¯>ô æP>)&Åõd§ùû^ÛÕ.ð½2@ÍuUØD&_ûIŒ€4YŸA0 ‚€8ŽùÏÿüO®\¹ÂñãÇJ*G‚ ü9ÜOMAöňŠË—/S¯×yÿý÷ùì³Ï ´Ûí}›’a/LüR­V£ÙlR«ÕøùÏÎG}TÞ'I’Ò äý%—B>9á’ç9/¾ø" ¬¬¬póæMvvvèõz÷5% Â^TÝ_Çq‚€©©)X]]åwÞáý÷ߊZP×uˬXA„/ƒOA8„a9??ÏÙ³g¸}û6ëëë" „/Duº‘ ˜÷}ŸK—.ñÉ'Ÿð‹_ü‚ÕÕU<Ï»oäª ÂA„§ Bª19çÏŸçÔ©Slmm±¶¶&£…GÂ4œeYV¾ŸL çÂÂ'Nœ@kÍÕ«Wy뭷ƜѪS*‚ðEá)‡ÓsöìY._¾Ì`0`}}Çqd™]xdŒð4 U¦Þ³Ùlrúôi´Öü÷ÿ7¿üå/ xžWn#‚ðE‘®vA8„˜LÆn·K³Ùäüùóüö·¿eccƒ,ËJWʈƒjŽcµãûY¨“Ýì“îÜ^n¹m¿ÜÓêu5ßó0¢µ;öê{(³L‰¢ˆwÞy˲¸xñ"'Nœ(óNrVUŒŠë.Â~ˆã)‡“Ã8 x饗8~ü8[[[ܹs§t='kñªŒ“qAÏÚ¥š¹ ãqRfä~µŠº½,X/ÕRêLw,oþî8'Ožäµ×^ãæÍ›üò—¿,«mßï[Lî ‚ L"ާ RlÛ.æ]×åÒ¥Kܹs‡ÍÍM¶¶¶ÊÉ3Uªâk?qõ,0)@'Ÿë^ÏýAç¥êtîwŸÃJõ=R}žy^Œ_ ‚€{÷æÖ­[|øá‡\¼x­õ˜€5×ÕѬ‚ “ȧƒ BŒššš*ÅÕ«¯¾Ê¥K—h·Û¬­­Ñï÷Ë©3fÔ,…Š8„q=§§§ñ< ˜››ãöíÛ¼ùæ›lmmÅ’zš¦„aH–eX–U:¡Ï’8áñ!ÿç„CHš¦e]†ÄqÌéÓ§¹téqsóæÍ1¡ ”KÏ 5xƒ©–$$IB½^çÌ™3dYÆÿøGnܸAž5žç•eÕQœÒ|$Â^ˆð„Cˆq9¢(*Eè©S§˜¥×ëÑn· ¥ØoÙY&1uŸÃá°£yæÌ–––ØÞÞæ·¿ý-½^ ·YuÐå}&Â~ˆð„Cˆ0¾l>77Ç‹/¾È±cǸ}û6ív›$IÆî/n”ð0lÛÆ¶mºÝ.qãº.¾ïsòäIfgg¹ví|ðN ,éAxòI!‡Û¶q‡Á`€ïûåD™z½Îk¯½Æüü<ý~Ÿv»MÇ¥8Ìl„½°, ­5ý~¿¬ÙÜÚÚbff†óçÏð«_ýŠ›7o–ÛTת_tAªˆð„CŒÉìÔZ†!¶msúôi–——i·Ûôû}â8FkeYcâÀÔå=Ë—Å¥K—çyY÷Z-M¨–4Lvo?íçö$/U÷Ò²,²,£Ýn£”bqq‘,˸uëŸ}öY9¢U)U–|H ± û!ÂS!Õñ…ãLù¾Ïßþíßrüøq’$áÞ½{ ‡ÃR dYv¤–EM“•éÔ†Ý!ÏóÈóœ$IÊóÇñ}Âi/Ñù,ÇqÙ¥žeqcÛvyžþÏÿù?DQį~õ+VVV€âýgD¨”r‚°Gçÿ>‚ðŒ‘e¶m—Ýê®ë–?‡aÈ~ðÇáÓO?e}}×uK¡exÚÎÚWåvîå|{Šq#šªÛ˜s5yý¬_Ìû+Ïs\×%MS¢("MS¦¦¦èt:ܸqÏ•RAöC„§ <ƒAÀ·¾õ­ršÑgŸ}F§Ó)›FŒ„/CžçÌÏÏ3ùðùwï@ùåÇŒÑA˜D„§ <ƒ‡êÕW_å…^`gg‡k×®Ñëõ‚@Dðgáû>FÇq¸yó&Ÿ|ò y^ŒØ4N¼Ôy ‚°"<áÄË×^{þð‡4 ®]»Æêê*J)Ÿ…eY4›Mæææèõz\»vv» ìv´¥:bAùd„g^¯Ç`0Àu]¾ùÍoréÒ%VWWÙÜÜ,;ÝáË`jŠOž<‰mÛ\¿~Ï>û¬ü› Â~ÈÿyáIJ¬Òõt]—¯ýë\¼x‘v»ÍÍ›7‡Où…ÃLÇäyαcǨ×묬¬pãÆ276Ii.aODx Â3ˆïû¸®K†äyÎsÏ=Ç+¯¼BÇlll†a9c;MÓR$˜Ø¡§ÝMý8:ÚááèûQuí&÷g¶{PFè³~‰ã˜4Mñ<©©)ºÝ.wïÞekk«<7q?þ7¶ ‡ž‚ð b:‹M½]£ÑàòåËüÝßýÍf“ÿ÷§Ýn—YI’”bÊL7:ÌTâ$ZëRPšóTV2ÛW·­þ|Ôs*]× Óé°°°ÀÜÜ¿üå/YYY!‚2ÖKaûi€ 3•v3*———ÙÙÙáÔ©St»]þð‡?pùòe––– åxD“×8)¼U§Ó\ïçŠ>hûê¶ÕIOæöÃz~y^ï7›M¦¦¦ØØØ`uuÉE‚ ì8ž‚ðŒ’eQ1 €b²ÌÙ³g¹xñ"§OŸæÓO?emmmliݲ¬2ëS"—N`rx IDAT„ý0ޏmÛA@³ÙIJ,>ÿüsVWW±m{lª– ‚AOAxFÙ«†±^¯sá‚ à£>*ªååešÍ&°÷A¨bÊ1‚ ÀqšÍ&ApûömnܸÁÒÒÒÓ>DA(âx Â3ˆ{É<~ü8¯¼ò ý×Mžç¼÷Þ{lnnÃáP&ÏÅ|9I’„F£ÁÜÜ[[[|òÉ'OùÈA8Ȉð„gÓ4c–Í“$a0EZkêõ:ßùÎwxá…°,‹ÍÍM¶·· eDz ì‡iÆJÓ”n·K­VãØ±cDQÄÍ›7ÙÞÞ~Ú‡(ÂE„§ <ƒX–…Öš4MËÌE#B ­V‹ï}ï{|ûÛß& CÞÿ}¶¶¶°m›8Ž%GØó^Š¢ˆv»mÛ?~Û¶¹{÷.kkkOûA8 ˆð„g³Tžeiš¢”Âq´ÖÄqL§Ó!Ë2^zé%¾÷½ï‘ç9+++t»Ýr‰Ý¶í±ÎmÇqʃ—ó ÜNµ×ý÷Úv¿ÛŽ2&¦Ë„ÅxžG­V#Žã²¡Mk]¾ÍÏæ L΄£‰üË„g#®´Ö¥HØK—.ñ÷ÿ÷œ>}š«W¯–5ŸÕØ¡ªØ2˜ù²ßó­ Isnö:w“òûߣz©>ó%Š"fggñ<Ÿþô§{žÏ,ËÃPD§ aä_¿ <Ãh­±m»t›L`|µáH)ÅÅ‹ùÉO~Âw¿û]Â0äÍ7ߤÛí–3¹ó<§Ýn³³³Cš¦åd¤ƒÊ~‚©ú·ÉûON'Úk›êýŽ:ÆI7MiQ•]îQ•N¨qÞ rþáh#ÂSŽ ¦Fo8–]ÉñÁøCNŸ>M§Óá£>bcc ŸÃá(Šè* Ï>F†ê„(AŽ&’ã)G³ÌÇ1Ýn—©©)´Ö<÷Üs|÷»ßÅ÷}~ÿûß—®ÕÂÂÓÓÓ¤iÊ`0 ÛíbÛ¶ˆˆ#Šq‚«ŽºÖ×u±,‹0 ¹sçóóó8ŽS Uó…g¯òAŽ"<áãû>ƒÁ ìx¿|ù2çÏŸgmmv»ÍµkרÙÙáܹsÌÌÌ ”¢×둦©Ï#Œ©“…"ËS)…çy¥Ð\YYáÂ… å#3˜@„§ md©]Ž I’”b!êõ:q3q‡ÙÙY~üãsùòeVVV¸ví÷îÝ+s@r§ðÕ‘¦)Q‘ežçAðé§Ÿ†áØý HG0#7A8zˆã)GÉ®w(ÜÏ8ŽKApùòe¾ïóÞ{ïq÷î]†Ã!§Nbnn® ¦ŽUÇÒdÅš†3ß÷ɲŒN§CEåý'…fu4« Gž‚p1¢1 C²,öm<Ï+oÏóÏó8þLƒ‘ U‚ àÔ©S;vŒååe¦§§yûí·ùüóÏé÷ûœ:uŠùùy<Ï›T“eY¹_@¯CŒÕšWó…ÂɇaX Ïz½^ T(ʤ\AŽ&"<A¸êlr#.L|µþóÅ_äÅ_äø?ûÙÏx÷ÝwÙÙÙáôéÓ,//—âŽãŒ¹^Oº¾SxòT—ÖÍïf|¦™×> ˆã(’L\—ÔÊ ÂÑE„§ ÷a\Î4MK—Ò¸—&*'Ïó2Dþõ×_ÇqŽ?Î7 \¿~ß÷i6›4›MjµZ邚ˆ#‡“É×Í$˜¥öj\—Éò45žU·T^A8zˆðá>ªËàq£µÆó< p:ƒ À¶mÂ0¤×ë155ÅË/¿Ì‹/¾Èïÿ{~þóŸóöÛoã8õzcÇŽÑjµp]—ÙÙY ¬Ãp,´Þ8£¦A)Ïó±¸&#„¡;²d[}.¶m—Ží~qdY֨ŏ¿"–Æ™¬6ÍE¶mEQùå¤:bÓü.ÂÑC„§ ÷Qm±mû>aQ ¯Õj¥ˆ°m›W_}•+W®ðÎ;ïðþûïóÁðöÛo“eÏ?ÿ<çÎãøñãåÒ½É~¬º`Fø™¿k­Ç„_UÄLfkšã7Û™só¦æÔäNš}L ¡$IJW¶šÛY ¦?ªM2浩æ³Ân\’ëº4›MÞ|óMþñÿ±ø€k×®qûömÞyçjµËËË,--Ñjµð}ŸÙÙYæççËQœÃá°tGMÇ´Y’¯: ÆU3oš\Œ£jš›e¹ áäû>µZ­tPÍv¦<@\»½1¯ƒ Â$"<Axì±hYÍf“'NpâÄ .\¸ÀíÛ·ÙØØà¿øív›Û·osýúu‚ àØ±cœ:uŠz½^ÖszžGå’yÇcÝÑUái.ÆãxliÝqœ²ÁéaneuÙßÜ×ìÿaã6:GÝ aDx ‚ðØ11J“3ÛhµZdYÆ•+W¸sçúÓŸx÷Ýw¹uë×®]ãúõë4›Mæç癞ž¦V«Ñh4ð}¿t!»¹ŸÀI’¤¼äy^Fú ‡Ã2âgòØ&1ÙÃá^¯WºžÆé4®«p?I’HN« {"Ÿš‚ úˆO?ý”íím677ÙØØ Š"”Rø¾ÏÌÌ 3334r?¦aÈ4™Çv×uËùìæ~:®qvv¶¬1u§lœ1Aø !øûaœbA„IDx ‚ðØ1¢Ãt†CÑd„_Çôû}´ÖeÎç¹sçøú׿ν{÷¸wïúÓŸØÚÚbccƒÍÍMƒÃá <Ï+k=«õ›æw#2ƒ Àu]ƒ¾ïEýÞCŽãi ÂS„ÇŽ›fnw•$Ip‡éééò6³t^«Õxî¹ç8þú¬3¿ßçDN|™=|¡ÇO•q:Ý=öz8á)ÂÁˆÎÉåhSƒY½}ò¾“u˜ÕžÍf“V«UN8 ðÌû4CJ)ºÝné°öz=úý>gΜá…^Š"ó8¶msîÜ9~ô£ñꫯ2===&Ž…G'Š"vvv8vìçÎ{}Û,ާ MDx ‚pà¨:afé|r‘q#=Ï£Ùl>Ò~£(Ë𜜸S¯×¹rå W®\y¼OH(_S)O3¦¶Ò8zÒÙ,ßï‹•ÙÞȯ/Wãy˜á)Âd¯¬Ìªsff¹Ã®Cj.–e‘$ ƒÁ l`‚Büt»]|ß/»Þ“$)'™Nyƒ‰a¾Uqo’€² ÌÜ.Kí‚pôá)Âcr*PuéÝÌßo;³\o–ôMà»mÛxžWº¦Sß9‡ø¾ëºcû¾I’ µ.sP|ß—ÜSá™ÁJÿ¼÷²ÎGÛÑï^“ O±;ýË"Ÿ‚ HÌä Éåðjhõ¾0žjœÎIWÍtµ›å{±TÝ·i8¡ôå1n±™e\Ðêt)©ó„£‡|ª ‚pà0ÍGUÑY½Ž¢¨ì®.¯WQsìæ‰V—ãÍ}L½¨çyå㛩G—DŽþW©¾f‚p(yĜβvsÒ‘49œÙ—t<ÍÞí‰ÇùÂ<½/}"<A8Të9û ”q<Æ¥„ûVâ8.…¦ –¯N.2û5c7'Ý7ó³¤/Ç^“‹Ìy6¹©‚p˜Qò òܤqŸ!Ú6ïmYVêÊ|T>”ç£/Ô‰ùxÑÕós¾Çm{åû O­ÆÿU?ÏžfyµOA4U‘RuA4ú²ÚÜbî»×lö½öaDÓÃf¹ ûcÄ夻iJ!ª_$áP1r0C2”¥Ae…¨¤ø¢ë¢QØ@D®3rb222“£òâs%Wqño!sɸÿs¸¯Î`÷n¦–}TT y–£´*½P­v‡](¬â80¾ú/"<A84T?œÖm„ã¤ó¶ßôœÉ\QF>“¯‘9ßrn…ÃL’$$y†ãº¸Ø#í–æ!a¢u‚MŽF£Ðh,`ôeX®mÈ@ï~Á­þ{™ü·c>ŸÒ4C[ÛÖ¨‘š+Ë3òl´}VÙVg¥ƒª÷´T¿ZDx ‚ ‚ <‰ÎHuFd…ä*#C³®³½½MÐÀvR,ÛÆ¶ÍuŽí8ØÊƱ|5……ÆF¡ÐXh¥ŠeõÑ÷a³PŸ¼ËB`Úd(rEJ),m¡U±ãœލBiõ4 Ož‚ ‚ BN†Æ&!åóîçüç{¿æêûïÓénÑl6Y>Þ¢´ðü‘㨇h¥Ð:/œÍˆ`sðJ)<»†çí OÇv°l Û²‹%u«ˆusqqp𨣱ð˜@ã£ÔýD…uš£ ÒĤË"Ñ,“®vAA„ONÎ&\¿~ƒ÷Þ{—›ŸÞ¤9pòäI–––h6›(]$kc1£ÈµUYá@&i @õ‹ kÝ Û*’8L–°ãSÖ\ÇÅ×MǦ……e[8Y>Ö´gjFÓl7NëÂ+-ÄènsæÓªµá)‚ ‚ðÄ$ rcíWo^å³ö Y#añÜ '..P›± ãqÜ&Ïs4Q±¡*„ R ¬ÝH±<³Ê˜¥Ì4% ÒÑr¹z ±-˶Ò&¶epÛ²ðó¶ãàŒDªe+lËÆ²´eËýÊÂVîh¡¾>:ŸL娙û•ŸCž‚ ‚ H–ç|zó&ëëäyN«ÕâĉãLO·Ãmú½>¶£µUiö1µ—ª˜J),{¼«=KÍô´”<ÏH“ŒHTÑ”&…SÙKŠØ77éâ8ŽëâØ6Jçxž‡çµ¶eÍM–ƒeÙx \DžܲžŽá)‚ ‚ðXh,åñæ;¿#KSR;_áN[Äö€°¿:Åur BÜ<‡”rÉɉ, Èɬ­-P)Yš‘¨b •”Ëáyž‘ç}”RÄN­5QÔ-¦«¥… um¿û›Ø¤QŠëøè®…¥]lÇÁ÷}ß'`† 8å_Bãâx ‚ ‚ h’8ÕVZäyF’$ÅÄ´$Å|,®f®Éò*ÃLÔQžå¤YFše(•£•Âqìâ~£¿HÈàØv‘U<Ò©ä&.)G)]NeKòœ(ŠÃ^·‹Ÿ'¸®Ë™s—ŸÎ‰C„§ ‚ Â#at^6êÓÉtF¦²ÑD£ TBžÇèQ®¦•wtFyY棕Æ" ËS†ñhY]%äÚÂv@iMÎ¥SPç1Yž‘ÄE­èPw±, ËqI³Œ$.F[£®ø 3@£¼'Ñ€G¨¾B+µoÓ“F„§ ‚ Âc¤: Mi…ÊM˜{Nš§¤$£Q¾£Ò4!IŠîwmKð–UÌ€¯Îk/Æú¦X–…R¥ŠzOÓ¥^4.í:¦Õãɲ”§OAA„/BnCn®÷—R 2ÈS‹4ËÈC—8NÈbÛ±iø-<ÏCé˜$Mˆâ6I’'}”Òh;-½Ýñ)…ÈŒ´B“¥.ä96.¹ÊÑ Tj²:sT–ÒXV!H}å`Yf^»Ú÷¸Ÿ$"<AAyž—¥q“4%Š"’AQsiå…ðô}ŸV«EP·È³œ(i†!a¼C'Äi‡4M5»£•²mRm‘Ä1I–aY6®ë µEšF…À¨)µFYŸŽrpG„§ ‚ ÂÁg4ñ'·‘ã9!¥”Rd¹Qžn± Ú„ƒœ¨í.Ï|‰ééiZYê:A ‹¦ :$qBo2 èö×étº “-’$%Ó¶m“+—$ì1†xžKßÂu]†Ã.IÔGéb‰>ד§äYFž Iâ…"<AA>&æh/”RXJ†!¾[¶wCƒy¢†\yåò<ǵjºDDDxÔp]‡ÌõÙ©ïàõr,Ëfs«G÷ɲ¬œR¤µ"Š"²,cqižF½*! C”mi²LÂwd™ÆiŒV꩹ ÂSAá1ާ ™.&e䥊ICŽc¡Óœ8N°|Ÿ8rýãUøÿþòoXXX`–côéãàââ‘ÝnÛI°¼‡&Óøõ:¾ÕÁÂ#êNÆd*@[:²ùï_þ?^ýu¾õƒï£Ð|²õ'†; IÚÃÆ"Sqᾪbéݶ,mQHϧ3¯ýéM‰AA8„äùnÇø^sÖ-Ò4c{g‡n·‡çyLMMaa•®cDÄFo“Û·ïðÑÇsõúUnw?ÇÂÂÃ#𙚚*\R×`023;ùsç˜eŸ¢^ÔqÝ"SÔÔzêbD§m[£1œOWú‰ã)‚ ‚ðHTj…ÖPÇ"£Áìì, 4Ÿ ÙÜQ †Czƒn·Gœ¤(¥põþu©_²Ô.‚ ‚𤣠ù¤Ó©G·ëº8®O§lou›Å…ãxx ±qÑätØfsx‡Äí£êCB½Mìpg-YÈ;+dÚ£Æ,ý.Š€…ã'YÝÜ&Šû¼tògŽŸaØ8´h¡ÐÌ1Ëüô³³Ó8uMfÇÄYD”†d‰™Î3Og|¦OAA„Ç„ã8xžGšet:\Ç%¨„#¡çáacÆ!abÛ¶ã¤EgžåxžÇÆÆ&Žv°QÄIBLL]×é÷úlll °qèÐe4í=,4®ãbÛΨ›]cò?-Û~`Gþ“F„§ ‚ Â#à’á’aåV–¡sŠyèX9è̆ÔÂNmˆ æÿÿöî=ÆÎªþ÷ø{­õ\öÞsï …R HùEáÓz ð3&járƒ¨1‘äh‚‰`¼À1Þ‚Ž—¤^bø‡"þþT4F4HÐÄ †ê ?¤Rª¥´éLgfßžçYëüñì½;íÓέ­ŸWódöìg_V¿íŸ¬ëÐ*.¦Á4UjT°Xjøô?8”sçü,9–0ôS%Å05¾Ÿ½ÝŒÏ¾Â$©'uòª#«X‚KiôŽÓ\ šã)"""²„ò"Çûò´ Z­Fä9}@€ò¬ôNøëö>cz«ÍÓ4¥ÙlÐ"#%e6«l¹èÌô4ÆÐ Mœq@ Ë2Zv–}ûö±Ûì"rŽƒvœ<˱cñ¾ /Œ‚§ˆˆˆÈñîð¬Hß9êÜw®Ã|QPä_”Ç[ÆqLb<¢÷j‡»ÿ§iƒqxãÈi’VbÌtèm2o T\Œ5ƒ ¯Lìæàô+´Z³ôWú­ŒF6ÃÔþqÆ“}$IÂTe’©¯ÇCÈ$åÆò«>['MÓÞPzÇ8k©ûy¾º=–‹¥ÅE""""K$Ïs²ÕZ•ááa²,ï-öqÖ‘…LFÅÄIRÎõå|ÏÂ{:­V‹þþ~Œ1Ô Ä.Â`ÉÚíÞ眨Ôã)"""²Dò,£È ªÕEÎääA2oôá¨V*ÄÞLk-yžqèÐ!â8bdd qÓ¤élªÔjµVó¯¶$Ôã)"""r4Œ?üÓ¼ö¢VÑ"N62LLMðâË;9mÃZ3Bbc‡£¯!u$Ù4QQ¡5[0ýJÆ)§²~ô ú’”,´(LA 0Ý8D»h`À‹  |‘HpE(OHÚeP0XcˆÞø¤Î£O‘%’wV[ëHÓ”™™víÚÅää$±:ç¶—Ò(¥V­’¦ioÛ£ÉÉIÆÆFÂâzsDÛE›F½N»Ý&ø@¥R¡Õjuî|QÞT>ŠIÓ´Ü\zCýÖ:*•*…_½y¢êñY<#æ‡6IDAT×=cÝä`,.x"ßíõôxqš@VÐÌÚÔÖ$ ReßÔ.þ±ÿyN>ˆ 95Nç-뇉ž?gž}†]Ïÿ“(ßÀÿüðu EÃ8êôãhqC­ƒäíƒPLS³Súyaç³ \|1¸AÚ•‚<‹¸`Ëf6ø³8pà›;™žž¦Èuö "N*”ýŽ«3OTÁSDDDd‰cH’„©©)â(áÜsÿé}†¿ïü;£ƒg³ñÔ¤ÄÔià0DQDÿëÖÎØài¬Y3B¥R¥¿¿¨3·³šå~ ­ÖZªÕ*Y–±gÏ6lØÀ©c§ÓõËHMJìFH×¥¸C‡˜©SxOá ²,[Õ#4™/Ï~·ÎÇÁÌ*­òQð9*Âë$7ãÉ‹ CA­?!´SSã›pÖÙ§‘Õáÿ=ñjik-£µµ¬­®¥Ÿ5Бg ŠÜ³´Z-&Û{8pà³h´PmCã"Ãðé)Q‹Yû2Ï¿R'0“ŽŠ¢N–g~š"xp³D.Â9‡ÞXŒzN¤Ië,&Šð¾æïïï#Žje@œ$xOÇåQ›±Ç˜roPc Øò(Nï Úm°šã)"""r‚–rŽä«{>=!äyÈ1¤DI ¶(.¨ &¬?k-ÓõW˜ššdoþ>™eð‚>FÝ(8CHZø¢E£8ÄÁÙýL7gð}išR$-š~–PL¹ˆP Û"¸òìw¢ˆ¶ÅØPžoo›‚‡,_ÎU ¼vÿÑ• }44Ds4cjj’Ý»wó÷³wrvúoÔ\ïbb*бœiö”'…€ÁPE9tÞ.7¯Z¢ž¦i¹­“s´Û…/pÖ•+çñE6^éò ž""""G'Ìß9Žçá+€i—O›NÜ290FR ßÇt{/¾ü}OGØ ,£•QªT1r,I-"éOp m(ò¼“7Ë=:µ8Ko»$€PÄØÌš|ËàÚƒTkU†’ D§¸>ì*E@O‘Rä9!@µVexx˜5kÖ0»×³ÿ~vïÞM¾.g¸˜ˆˆuÚy^mg«¤‘ukp”ÃüÆŒ=<äB k·É3(òçªÔj} Ó_ &&ô¶Ã_Y ž"""" r„5Ù¦s’‘É)׎w^ßéùôÆ’Ó¦ð-šyNµ2ÄØº~úØ‚½^¢Þždhh„J¥BÏÐn·™iO‘ùVgx\QÁxC\”1.n`Bµ ¨ùƪncÉ£•³dGµÜßs(xŠˆˆˆ¬¹s=›Óß×ÇÀ)S‡fÚLŒSŸm¦)y2K†›Åûk]Ù£YxB€/pê^ÎY⨆³ã‡I’„Zº–á‘2ÌÚUÞÐHÁSDDDd|w19–PölšœÞ¼ÎPÎûôÖBèÍ£ô$½Op.!.Rln° ‹‹Ö;&N1ÖrO£=Cfêå&ðKâbR×GÀS CkH]•(ŽIRKE¸("rgû‰"‡3äiJ%^[.6òU0†èЕïõTð9 Íf×™sE1¶³°'Š£r0Þâ½ïÍ» !/áqdYF–eÐ0øÂSuUúû¨×ø,tN²XW®H·Q„‹Cýk°ÆÐ— uV°â$éí÷‰¯`Œ!6#ÄÄX(0e{xíJø•¢à)"""²q§‡pt¨ÊÌÌ,U<5 ´,*x¾ð |⟠Ñh,U{N:ùÈGxà’TÓ#;ÚšŠˆˆÈñaIæx†t½ÁµØšžyæ™ú9ççbj*"""«kÑs<ÞܱԦ[Ó 6°k×.Bú¹kguVïw9ñ,:x±…«ÇZ›/¾ø¢j;G·ÇR“;v°cÇŽ7¼¿e˶lÙ²˜æ‰ˆˆÈ,I§÷~)ÚrR:ÖOï=çœs;wî\†V˜ºõ8ÚšvCç7Þø†¯¹çž{>EDD–Ñq5Çó¡‡âÒK/åÔSOå’K.á¿øÅ²ÏÁ\‰ëXkú /,k»FFFz×ÚµkÙ¶mÛ¼ïYõÚͽæ¶íh)tÜxãoÚ#*"""‹·èà¹T¡âñÇçSŸúwÝu/¾ø"wß}77ß|3;vìXõÀ³ØëXkºqãÆeo×øø8ãããìܹ“+¯¼’üãóî¯víæ^sëq,^o¸ýHCð"""²tŽ›ÏoûÛÜqÇ\qÅ$IÂW\Áç?ÿy¶oßÞ{Íèè(?ýéO9çœsغu+ûöíëÝ›œœäúë¯gݺu¼ÿýïgjjjÞûî½÷^Î?ÿ|Î;ï<~þóŸ·¡snMŸþùeo[÷qµZåÆoäé§Ÿ~Ýû×\s £££Œ±yóf}ôQöîÝË…^Ø{MQ\tÑEóþ]–òêÖc1®¼òÊ='"""K︙ãùØcño|cÞg½÷½ïåÎ;ïœ÷Üï~÷;ž|òIî»ï>¾ô¥/ñ½ï}€¯~õ«lݺ•û￟_ýêWÜu×]|ík_ë½o÷îÝüñäÁäöÛoç}ï{ߢۼÇ”º5=ÿüóyî¹ç–¡U‡uk[¯×ùþ÷¿ÏæÍ›çÕ»ûøÁìýþ£ýˆ[o½•Ç{Œõë×óÄOpÑEñ‡?ü³Ï>›ÑÑÑe™÷ۭDZ†Ï-[¶P¯×ßô¹î\Oy­Å.Æ=nVµOMMõæv ÷z.»n½õVªÕ*úЇ¸ôÒK{÷zè!n»í6¢(âßÿýß¹ýöÛ¹óÎ;{ïû¾Àõ×_Ïç>÷¹%ióBë÷„øë_ÿºìí\»v-qóŽw¼ƒï~÷»ó¾óÕßoŒáÚk¯å“Ÿü$!¶mÛÆ/ùK.¼ðB~ò“Ÿpíµ×.[›»õXΚi.¨ˆˆÈ¿²{î¹çäž###LLL066Ö{nbbâ5atppóBéøø8›6mê½Î9÷º*Š¢e/s-&xnÚ´‰gŸ}v‰[4ßÞ½{_÷»_ýøoûwß}7O>ù$û÷ïÇ{O«¯¾š}ìc|úӟ桇â3Ÿù̲ն[•ú·‘¥uÜl 饗òÈ#ð| ÷ÜÃ?Ì%—\2ïó:ÄÀÀä”SNéÝåÑGeÍš5óÚöz_ï÷år¬Cí!žyæ™eoç‘>¿{ÿ†nàÃþ0_ùÊWcÆ „8ãŒ3!ðàƒ²qãFFGG—­ÍÝz,gM4Ô.""òÆ»íàqÓãyÓM7qà 7pÆg°eËüq¾þõ¯óƒü`Þçoß¾Ï~ö³<ðÀ¼ç=ïéÝ»úê«Ù¾};·ß~;O=õ?üáÙ¾}û¶ñxžÝ÷½ímoãé§Ÿ^â½ö{rß¾}¼ûÝï&ŽãÞï=Æ®ºê*¾øÅ/rË-·,k]»õÐP»ˆˆÈ‰iI¶SòÞ/úºà‚ øæ7¿ÉwÜÁ¹çžËwÜÁ·¾õ-6mÚÔ{ ÀÛßþv.¾øbyän¹å–Þ½Ûn»={ö°iÓ&nºé&ÞùÎwÎ{ßÜïšûûµ×^{ÄÇ‹¹³¸è©§žZ’6¼Ñõ꺼Ùý/ùËlÛ¶«®ºŠóÎ;ÑÑQöìÙƒ÷ž­[·299ÉÖ­[—µ½ÝzmM·lÙrÄžÌÅÎY‘#;nz<®¸â ~øá7ýìk®¹†k®¹æ5÷ûúú^.º÷vïÞ=ïsæþþãÿøˆWC‹.ºˆ¿üå/Ëö¯®Ë›Ý¿îºë¸îºëz÷>øÁöÚ¹sçN®ºê*Ö¬Y³¬5;Öztå=÷Üóº=šÝЩà)""²¼Ž›9žGó}'’ÅÌñ|òÉ'û¿ï•W^Ix`ÙÛڭDZ|Ï…O…N‘•s\õxÉ®]»Žû öj‹™ãyñÅóÄO,q‹–Öo~ó›Þãåþ·éÖc1ûxÂáð©Ð)""²²Ž› äOV‹™ãùç?ÿYµ£[ÅܹáS¡SDDdeP=ž'¢ÅôxnÞ¼™?ýéOKÜ¢W·‹ýÿ¦À)""²:–dU»®¥=¯½û¾;v°yóæ^ýWÿ¹cÇŽc®©ˆˆˆ¬>óÖ·¾5Dþ_Öoc×Ïþ¿ÿýïüæû￟n¸ñññelâ‰-„ÀÏ~ö3>úÑ.èõªé‘mMEDDdu\vÙelØv/ÿÜu€ü©ÿ½¸¡ö7rß}÷ñ®w½k‰šwòùõ¯ÍÆüzÕôÈŽ¶¦"""r|XTð¼üòË2ÈëÛ¸qc¯N ¡šÙÑÖTDDDŽ‹^\tùå—+,1ÕTDDDNF‹^\$""""² ž""""²" int main(int argc, char *argv[]) { QApplication app(argc, argv); VideoPlayer player; player.resize(320, 240); player.show(); return app.exec(); } videoplayer.cpp000066400000000000000000000117631225012771600354300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "videoplayer.h" #include #include #include VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent) , mediaPlayer(0, QMediaPlayer::VideoSurface) , playButton(0) , positionSlider(0) , errorLabel(0) { QVideoWidget *videoWidget = new QVideoWidget; QAbstractButton *openButton = new QPushButton(tr("Open...")); connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); playButton = new QPushButton; playButton->setEnabled(false); playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(playButton, SIGNAL(clicked()), this, SLOT(play())); positionSlider = new QSlider(Qt::Horizontal); positionSlider->setRange(0, 0); connect(positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int))); errorLabel = new QLabel; errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); QBoxLayout *controlLayout = new QHBoxLayout; controlLayout->setMargin(0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); QBoxLayout *layout = new QVBoxLayout; layout->addWidget(videoWidget); layout->addLayout(controlLayout); layout->addWidget(errorLabel); setLayout(layout); mediaPlayer.setVideoOutput(videoWidget); connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaStateChanged(QMediaPlayer::State))); connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); connect(&mediaPlayer, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(handleError())); } VideoPlayer::~VideoPlayer() { } void VideoPlayer::openFile() { errorLabel->setText(""); QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath()); if (!fileName.isEmpty()) { mediaPlayer.setMedia(QUrl::fromLocalFile(fileName)); playButton->setEnabled(true); } } void VideoPlayer::play() { switch(mediaPlayer.state()) { case QMediaPlayer::PlayingState: mediaPlayer.pause(); break; default: mediaPlayer.play(); break; } } void VideoPlayer::mediaStateChanged(QMediaPlayer::State state) { switch(state) { case QMediaPlayer::PlayingState: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); break; default: playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); break; } } void VideoPlayer::positionChanged(qint64 position) { positionSlider->setValue(position); } void VideoPlayer::durationChanged(qint64 duration) { positionSlider->setRange(0, duration); } void VideoPlayer::setPosition(int position) { mediaPlayer.setPosition(position); } void VideoPlayer::handleError() { playButton->setEnabled(false); errorLabel->setText("Error: " + mediaPlayer.errorString()); } videoplayer.h000066400000000000000000000052551225012771600350740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H #include #include #include QT_BEGIN_NAMESPACE class QAbstractButton; class QSlider; class QLabel; QT_END_NAMESPACE class VideoPlayer : public QWidget { Q_OBJECT public: VideoPlayer(QWidget *parent = 0); ~VideoPlayer(); public slots: void openFile(); void play(); private slots: void mediaStateChanged(QMediaPlayer::State state); void positionChanged(qint64 position); void durationChanged(qint64 duration); void setPosition(int position); void handleError(); private: QMediaPlayer mediaPlayer; QAbstractButton *playButton; QSlider *positionSlider; QLabel *errorLabel; }; #endif videowidget.pro000066400000000000000000000003741225012771600354310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/examples/multimediawidgets/videowidgetTEMPLATE = app TARGET = videowidget QT += multimedia multimediawidgets HEADERS = \ videoplayer.h SOURCES = \ main.cpp \ videoplayer.cpp target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/videowidget INSTALLS += target QT+=widgets qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/qtmultimedia.pro000066400000000000000000000020031225012771600260130ustar00rootroot00000000000000load(configure) qtCompileTest(openal) win32 { qtCompileTest(directshow) qtCompileTest(wmsdk) qtCompileTest(wmp) qtCompileTest(wmf) qtCompileTest(evr) } else:mac { qtCompileTest(avfoundation) } else { qtCompileTest(alsa) qtCompileTest(pulseaudio) !done_config_gstreamer { gstver=1.0 cache(GST_VERSION, set, gstver); qtCompileTest(gstreamer) { qtCompileTest(gstreamer_photography) qtCompileTest(gstreamer_encodingprofiles) qtCompileTest(gstreamer_appsrc) } else { gstver=0.10 cache(GST_VERSION, set, gstver); # Force a re-run of the test CONFIG -= done_config_gstreamer qtCompileTest(gstreamer) { qtCompileTest(gstreamer_photography) qtCompileTest(gstreamer_encodingprofiles) qtCompileTest(gstreamer_appsrc) } } } qtCompileTest(resourcepolicy) qtCompileTest(xvideo) } load(qt_parts) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/000077500000000000000000000000001225012771600233665ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/000077500000000000000000000000001225012771600252445ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/gsttools.pro000066400000000000000000000063761225012771600276600ustar00rootroot00000000000000TEMPLATE = lib TARGET = qgsttools_p QPRO_PWD = $$PWD QT = core multimedia-private gui-private opengl !static:DEFINES += QT_MAKEDLL unix:!maemo*:contains(QT_CONFIG, alsa) { DEFINES += HAVE_ALSA LIBS += \ -lasound } CONFIG += link_pkgconfig gstreamer-interfaces-$$GST_VERSION \ PKGCONFIG += \ gstreamer-$$GST_VERSION \ gstreamer-base-$$GST_VERSION \ gstreamer-audio-$$GST_VERSION \ gstreamer-video-$$GST_VERSION \ gstreamer-pbutils-$$GST_VERSION maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10 config_resourcepolicy { DEFINES += HAVE_RESOURCE_POLICY PKGCONFIG += libresourceqt1 } # Header files must go inside source directory of a module # to be installed by syncqt. INCLUDEPATH += ../multimedia/gsttools_headers/ INCLUDEPATH += ../plugins/gstreamer/mediaplayer/ VPATH += ../multimedia/gsttools_headers/ # FIXME: Move qgstreamermirtexturerenderer_p.h and .c to section like maemo6 PRIVATE_HEADERS += \ qgstbufferpoolinterface_p.h \ qgstreamerbushelper_p.h \ qgstreamermessage_p.h \ qgstutils_p.h \ qgstvideobuffer_p.h \ qvideosurfacegstsink_p.h \ qgstreamervideorendererinterface_p.h \ qgstreameraudioinputselector_p.h \ qgstreamervideorenderer_p.h \ qgstreamervideoinputdevicecontrol_p.h \ gstvideoconnector_p.h \ qgstcodecsinfo_p.h \ qgstreamervideoprobecontrol_p.h \ qgstreameraudioprobecontrol_p.h \ SOURCES += \ qgstbufferpoolinterface.cpp \ qgstreamerbushelper.cpp \ qgstreamermessage.cpp \ qgstutils.cpp \ qgstvideobuffer.cpp \ qvideosurfacegstsink.cpp \ qgstreamervideorendererinterface.cpp \ qgstreameraudioinputselector.cpp \ qgstreamervideorenderer.cpp \ qgstreamervideoinputdevicecontrol.cpp \ qgstcodecsinfo.cpp \ gstvideoconnector.c \ qgstreamervideoprobecontrol.cpp \ qgstreameraudioprobecontrol.cpp \ config_xvideo { DEFINES += HAVE_XVIDEO LIBS += -lXv -lX11 -lXext PRIVATE_HEADERS += \ qgstxvimagebuffer_p.h \ SOURCES += \ qgstxvimagebuffer.cpp \ qtHaveModule(widgets) { QT += multimediawidgets PRIVATE_HEADERS += \ qgstreamervideooverlay_p.h \ qgstreamervideowindow_p.h \ qgstreamervideowidget_p.h \ qx11videosurface_p.h \ SOURCES += \ qgstreamervideooverlay.cpp \ qgstreamervideowindow.cpp \ qgstreamervideowidget.cpp \ qx11videosurface.cpp \ } } maemo6 { PKGCONFIG += qmsystem2 contains(QT_CONFIG, opengles2):qtHaveModule(widgets) { PRIVATE_HEADERS += qgstreamergltexturerenderer_p.h SOURCES += qgstreamergltexturerenderer.cpp QT += opengl LIBS += -lEGL -lgstmeegointerfaces-0.10 } } mir: { contains(QT_CONFIG, opengles2):qtHaveModule(widgets) { PRIVATE_HEADERS += qgstreamermirtexturerenderer_p.h SOURCES += qgstreamermirtexturerenderer.cpp QT += opengl quick LIBS += -lEGL } DEFINES += HAVE_MIR } config_gstreamer_appsrc { PKGCONFIG += gstreamer-app-$$GST_VERSION PRIVATE_HEADERS += qgstappsrc_p.h SOURCES += qgstappsrc.cpp DEFINES += HAVE_GST_APPSRC LIBS += -lgstapp-$$GST_VERSION } HEADERS += $$PRIVATE_HEADERS DESTDIR = $$QT.multimedia.libs target.path = $$[QT_INSTALL_LIBS] INSTALLS += target qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/gstvideoconnector.c000066400000000000000000000576661225012771600311730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "gstvideoconnector_p.h" #include /* signals */ enum { SIGNAL_RESEND_NEW_SEGMENT, SIGNAL_CONNECTION_FAILED, LAST_SIGNAL }; static guint gst_video_connector_signals[LAST_SIGNAL] = { 0 }; GST_DEBUG_CATEGORY_STATIC (video_connector_debug); #define GST_CAT_DEFAULT video_connector_debug static GstStaticPadTemplate gst_video_connector_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_video_connector_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #if GST_CHECK_VERSION(1,0,0) G_DEFINE_TYPE(GstVideoConnector, gst_video_connector, GST_TYPE_ELEMENT); #else #define _do_init(bla) \ GST_DEBUG_CATEGORY_INIT (video_connector_debug, \ "video-connector", 0, "An identity like element for reconnecting video stream"); GST_BOILERPLATE_FULL (GstVideoConnector, gst_video_connector, GstElement, GST_TYPE_ELEMENT, _do_init); #endif static void gst_video_connector_dispose (GObject * object); #if GST_CHECK_VERSION(1,0,0) static GstFlowReturn gst_video_connector_chain (GstPad * pad, GstObject* parent, GstBuffer * buf); #else static GstFlowReturn gst_video_connector_chain (GstPad * pad, GstBuffer * buf); static GstFlowReturn gst_video_connector_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); #endif static GstStateChangeReturn gst_video_connector_change_state (GstElement * element, GstStateChange transition); #if GST_CHECK_VERSION(1,0,0) static gboolean gst_video_connector_handle_sink_event (GstPad * pad, GstObject* parent, GstEvent * event); #else static gboolean gst_video_connector_handle_sink_event (GstPad * pad, GstEvent * event); #endif #if GST_CHECK_VERSION(1,0,0) static GstPadProbeReturn gst_video_connector_new_buffer_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object); static GstPadProbeReturn gst_video_connector_new_event_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object); static GstPadProbeReturn gst_video_connector_new_query_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object); #else static gboolean gst_video_connector_new_buffer_probe(GstObject *pad, GstBuffer *buffer, guint * object); static gboolean gst_video_connector_setcaps (GstPad *pad, GstCaps *caps); static GstCaps *gst_video_connector_getcaps (GstPad * pad); static gboolean gst_video_connector_acceptcaps (GstPad * pad, GstCaps * caps); #endif static void gst_video_connector_resend_new_segment(GstElement * element, gboolean emitFailedSignal); #if GST_CHECK_VERSION(1,0,0) static void gst_video_connector_class_init (GstVideoConnectorClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (gstelement_class, "Video Connector", "Generic", "An identity like element used for reconnecting video stream", "Dmytro Poplavskiy "); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_video_connector_sink_factory)); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_video_connector_src_factory)); gst_video_connector_parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_video_connector_dispose; gstelement_class->change_state = gst_video_connector_change_state; klass->resend_new_segment = gst_video_connector_resend_new_segment; gst_video_connector_signals[SIGNAL_RESEND_NEW_SEGMENT] = g_signal_new ("resend-new-segment", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstVideoConnectorClass, resend_new_segment), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); gst_video_connector_signals[SIGNAL_CONNECTION_FAILED] = g_signal_new ("connection-failed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); GST_DEBUG_CATEGORY_INIT (video_connector_debug, "video-connector", 0, "An identity like element for reconnecting video stream"); } #else static void gst_video_connector_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video Connector", "Generic", "An identity like element used for reconnecting video stream", "Dmytro Poplavskiy "); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_connector_sink_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_connector_src_factory)); } static void gst_video_connector_class_init (GstVideoConnectorClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_video_connector_dispose; gstelement_class->change_state = gst_video_connector_change_state; klass->resend_new_segment = gst_video_connector_resend_new_segment; gst_video_connector_signals[SIGNAL_RESEND_NEW_SEGMENT] = g_signal_new ("resend-new-segment", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstVideoConnectorClass, resend_new_segment), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); gst_video_connector_signals[SIGNAL_CONNECTION_FAILED] = g_signal_new ("connection-failed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } #endif static void gst_video_connector_init (GstVideoConnector *element #if GST_CHECK_VERSION(1,0,0) #else ,GstVideoConnectorClass *g_class #endif ) { #if GST_CHECK_VERSION(1,0,0) #else (void) g_class; #endif element->sinkpad = gst_pad_new_from_static_template (&gst_video_connector_sink_factory, "sink"); gst_pad_set_chain_function(element->sinkpad, GST_DEBUG_FUNCPTR (gst_video_connector_chain)); #if GST_CHECK_VERSION(1,0,0) /* gstreamer 1.x uses QUERYS and EVENTS for allocation and caps handiling purposes */ GST_OBJECT_FLAG_SET (element->sinkpad, GST_PAD_FLAG_PROXY_CAPS); GST_OBJECT_FLAG_SET (element->sinkpad, GST_PAD_FLAG_PROXY_ALLOCATION); #else gst_pad_set_event_function(element->sinkpad, GST_DEBUG_FUNCPTR (gst_video_connector_handle_sink_event)); gst_pad_set_bufferalloc_function(element->sinkpad, GST_DEBUG_FUNCPTR (gst_video_connector_buffer_alloc)); gst_pad_set_setcaps_function(element->sinkpad, GST_DEBUG_FUNCPTR (gst_video_connector_setcaps)); gst_pad_set_getcaps_function(element->sinkpad, GST_DEBUG_FUNCPTR(gst_video_connector_getcaps)); gst_pad_set_acceptcaps_function(element->sinkpad, GST_DEBUG_FUNCPTR(gst_video_connector_acceptcaps)); #endif gst_element_add_pad (GST_ELEMENT (element), element->sinkpad); element->srcpad = gst_pad_new_from_static_template (&gst_video_connector_src_factory, "src"); #if GST_CHECK_VERSION(1,0,0) gst_pad_add_probe(element->srcpad, GST_PAD_PROBE_TYPE_BUFFER, gst_video_connector_new_buffer_probe, element, NULL); gst_pad_add_probe(element->srcpad, GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM, gst_video_connector_new_query_probe, element, NULL); gst_pad_add_probe(element->sinkpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, gst_video_connector_new_event_probe, element, NULL); #else gst_pad_add_buffer_probe(element->srcpad, G_CALLBACK(gst_video_connector_new_buffer_probe), element); #endif gst_element_add_pad (GST_ELEMENT (element), element->srcpad); element->relinked = FALSE; element->failedSignalEmited = FALSE; gst_segment_init (&element->segment, GST_FORMAT_TIME); element->latest_buffer = NULL; } static void gst_video_connector_reset (GstVideoConnector * element) { element->relinked = FALSE; element->failedSignalEmited = FALSE; if (element->latest_buffer != NULL) { gst_buffer_unref (element->latest_buffer); element->latest_buffer = NULL; } gst_segment_init (&element->segment, GST_FORMAT_UNDEFINED); } static void gst_video_connector_dispose (GObject * object) { GstVideoConnector *element = GST_VIDEO_CONNECTOR (object); gst_video_connector_reset (element); #if GST_CHECK_VERSION(1,0,0) G_OBJECT_CLASS (gst_video_connector_parent_class)->dispose (object); #else G_OBJECT_CLASS (parent_class)->dispose (object); #endif } #if GST_CHECK_VERSION(1,0,0) /* For gstreamer 1.x we handle it in ALLOCATION Query */ #else // "When this function returns anything else than GST_FLOW_OK, // the buffer allocation failed and buf does not contain valid data." static GstFlowReturn gst_video_connector_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstVideoConnector *element; GstFlowReturn res = GST_FLOW_OK; element = GST_VIDEO_CONNECTOR (GST_PAD_PARENT (pad)); if (!buf) return GST_FLOW_ERROR; *buf = NULL; gboolean isFailed = FALSE; while (1) { GST_OBJECT_LOCK (element); gst_object_ref(element->srcpad); GST_OBJECT_UNLOCK (element); // Check if downstream element is in NULL state // and wait for up to 1 second for it to switch. GstPad *peerPad = gst_pad_get_peer(element->srcpad); if (peerPad) { GstElement *parent = gst_pad_get_parent_element(peerPad); gst_object_unref (peerPad); if (parent) { GstState state; GstState pending; int totalTimeout = 0; // This seems to sleep for about 10ms usually. while (totalTimeout < 1000000) { gst_element_get_state(parent, &state, &pending, 0); if (state != GST_STATE_NULL) break; usleep(5000); totalTimeout += 5000; } gst_object_unref (parent); if (state == GST_STATE_NULL) { GST_DEBUG_OBJECT (element, "Downstream element is in NULL state"); // Downstream filter seems to be in the wrong state return GST_FLOW_UNEXPECTED; } } } res = gst_pad_alloc_buffer(element->srcpad, offset, size, caps, buf); gst_object_unref (element->srcpad); GST_DEBUG_OBJECT (element, "buffer alloc finished: %s", gst_flow_get_name (res)); if (res == GST_FLOW_WRONG_STATE) { // Just in case downstream filter is still somehow in the wrong state. // Pipeline stalls if we report GST_FLOW_WRONG_STATE. return GST_FLOW_UNEXPECTED; } if (res >= GST_FLOW_OK || isFailed == TRUE) break; //if gst_pad_alloc_buffer failed, emit "connection-failed" signal //so colorspace transformation element can be inserted GST_INFO_OBJECT(element, "gst_video_connector_buffer_alloc failed, emit connection-failed signal"); g_signal_emit(G_OBJECT(element), gst_video_connector_signals[SIGNAL_CONNECTION_FAILED], 0); isFailed = TRUE; } return res; } static gboolean gst_video_connector_setcaps (GstPad *pad, GstCaps *caps) { GstVideoConnector *element; element = GST_VIDEO_CONNECTOR (GST_PAD_PARENT (pad)); /* forward-negotiate */ gboolean res = gst_pad_set_caps(element->srcpad, caps); gchar * debugmsg = NULL; GST_DEBUG_OBJECT(element, "gst_video_connector_setcaps %s %i", debugmsg = gst_caps_to_string(caps), res); if (debugmsg) g_free(debugmsg); if (!res) { //if set_caps failed, emit "connection-failed" signal //so colorspace transformation element can be inserted GST_INFO_OBJECT(element, "gst_video_connector_setcaps failed, emit connection-failed signal"); g_signal_emit(G_OBJECT(element), gst_video_connector_signals[SIGNAL_CONNECTION_FAILED], 0); return gst_pad_set_caps(element->srcpad, caps); } return TRUE; } static GstCaps *gst_video_connector_getcaps (GstPad * pad) { GstVideoConnector *element; element = GST_VIDEO_CONNECTOR (GST_PAD_PARENT (pad)); #if (GST_VERSION_MICRO > 25) GstCaps *caps = gst_pad_peer_get_caps_reffed(element->srcpad); #else GstCaps *caps = gst_pad_peer_get_caps(element->srcpad); #endif if (!caps) caps = gst_caps_new_any(); return caps; } static gboolean gst_video_connector_acceptcaps (GstPad * pad, GstCaps * caps) { GstVideoConnector *element; element = GST_VIDEO_CONNECTOR (GST_PAD_PARENT (pad)); return gst_pad_peer_accept_caps(element->srcpad, caps); } #endif static void gst_video_connector_resend_new_segment(GstElement * element, gboolean emitFailedSignal) { GST_INFO_OBJECT(element, "New segment requested, failed signal enabled: %i", emitFailedSignal); GstVideoConnector *connector = GST_VIDEO_CONNECTOR(element); connector->relinked = TRUE; if (emitFailedSignal) connector->failedSignalEmited = FALSE; } #if GST_CHECK_VERSION(1,0,0) static GstPadProbeReturn gst_video_connector_new_event_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object) { GstVideoConnector *connector = GST_VIDEO_CONNECTOR (object); GstEvent *event = gst_pad_probe_info_get_event(info); GST_DEBUG_OBJECT(connector, "Event %"GST_PTR_FORMAT" received\n", event); return GST_PAD_PROBE_OK; } static GstPadProbeReturn gst_video_connector_new_query_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object) { GstVideoConnector *connector = GST_VIDEO_CONNECTOR (object); GstQuery *query = gst_pad_probe_info_get_query(info); GST_DEBUG_OBJECT(connector, "Query %"GST_PTR_FORMAT" received\n", query); return GST_PAD_PROBE_OK; } #endif #if GST_CHECK_VERSION(1,0,0) static GstPadProbeReturn gst_video_connector_new_buffer_probe(GstPad *pad, GstPadProbeInfo *info, gpointer object) { (void) info; #else static gboolean gst_video_connector_new_buffer_probe(GstObject *pad, GstBuffer *buffer, guint * object) { (void) buffer; #endif (void) pad; GstVideoConnector *element = GST_VIDEO_CONNECTOR (object); /* If relinking is requested, the current buffer should be rejected and the new segment + previous buffer should be pushed first */ if (element->relinked) GST_LOG_OBJECT(element, "rejected buffer because of new segment request"); return element->relinked ? GST_PAD_PROBE_DROP : GST_PAD_PROBE_OK; } static GstFlowReturn #if GST_CHECK_VERSION(1,0,0) gst_video_connector_chain (GstPad * pad, GstObject* parent, GstBuffer * buf) #else gst_video_connector_chain (GstPad * pad, GstBuffer * buf) #endif { GstFlowReturn res; GstVideoConnector *element; #if GST_CHECK_VERSION(1,0,0) (void)parent; #endif element = GST_VIDEO_CONNECTOR (gst_pad_get_parent (pad)); do { /* Resend the segment message and last buffer to preroll the new sink. Sinks can be changed multiple times while paused, while loop allows to send the segment message and preroll all of them with the same buffer. */ while (element->relinked) { element->relinked = FALSE; #if GST_CHECK_VERSION(1,0,0) if (element->latest_buffer && GST_BUFFER_TIMESTAMP_IS_VALID(element->latest_buffer)) { element->segment.position = GST_BUFFER_TIMESTAMP (element->latest_buffer); } #else gint64 pos = element->segment.last_stop; if (element->latest_buffer && GST_BUFFER_TIMESTAMP_IS_VALID(element->latest_buffer)) { pos = GST_BUFFER_TIMESTAMP (element->latest_buffer); } #endif //push a new segment and last buffer #if GST_CHECK_VERSION(1,0,0) GstEvent *ev = gst_event_new_segment (&element->segment); #else GstEvent *ev = gst_event_new_new_segment (TRUE, element->segment.rate, element->segment.format, pos, //start element->segment.stop, pos); #endif GST_DEBUG_OBJECT (element, "Pushing new segment event"); if (!gst_pad_push_event (element->srcpad, ev)) { GST_WARNING_OBJECT (element, "Newsegment handling failed in %" GST_PTR_FORMAT, element->srcpad); } if (element->latest_buffer) { GST_DEBUG_OBJECT (element, "Pushing latest buffer..."); gst_buffer_ref(element->latest_buffer); gst_pad_push(element->srcpad, element->latest_buffer); } } gst_buffer_ref(buf); //it's possible video sink is changed during gst_pad_push blocked by //pad lock, in this case ( element->relinked == TRUE ) //the buffer should be rejected by the buffer probe and //the new segment + prev buffer should be sent before GST_LOG_OBJECT (element, "Pushing buffer..."); res = gst_pad_push (element->srcpad, buf); GST_LOG_OBJECT (element, "Pushed buffer: %s", gst_flow_get_name (res)); //if gst_pad_push failed give the service another chance, //it may still work with the colorspace element added if (!element->failedSignalEmited && res == GST_FLOW_NOT_NEGOTIATED) { element->failedSignalEmited = TRUE; GST_INFO_OBJECT(element, "gst_pad_push failed, emit connection-failed signal"); g_signal_emit(G_OBJECT(element), gst_video_connector_signals[SIGNAL_CONNECTION_FAILED], 0); } } while (element->relinked); if (element->latest_buffer) { gst_buffer_unref (element->latest_buffer); element->latest_buffer = NULL; } //don't save the last video buffer on maemo6 because of buffers shortage //with omapxvsink #ifndef Q_WS_MAEMO_6 element->latest_buffer = gst_buffer_ref(buf); #endif gst_buffer_unref(buf); gst_object_unref (element); return res; } static GstStateChangeReturn gst_video_connector_change_state (GstElement * element, GstStateChange transition) { GstVideoConnector *connector; GstStateChangeReturn result; connector = GST_VIDEO_CONNECTOR(element); #if GST_CHECK_VERSION(1,0,0) result = GST_ELEMENT_CLASS (gst_video_connector_parent_class)->change_state(element, transition); #else result = GST_ELEMENT_CLASS (parent_class)->change_state(element, transition); #endif switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_video_connector_reset (connector); break; case GST_STATE_CHANGE_READY_TO_PAUSED: connector->relinked = FALSE; break; default: break; } return result; } #if GST_CHECK_VERSION(1,0,0) static gboolean gst_video_connector_handle_sink_event (GstPad * pad, GstObject* parent, GstEvent * event) { GstVideoConnector *element = GST_VIDEO_CONNECTOR (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: break; case GST_EVENT_CAPS: break; default: break; } gst_object_unref (element); return gst_pad_event_default (pad, parent, event); } #else static gboolean gst_video_connector_handle_sink_event (GstPad * pad, GstEvent * event) { (void)parent; if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { GstVideoConnector *element = GST_VIDEO_CONNECTOR (gst_pad_get_parent (pad)); gboolean update; GstFormat format; gdouble rate, arate; gint64 start, stop, time; gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); GST_LOG_OBJECT (element, "NEWSEGMENT update %d, rate %lf, applied rate %lf, " "format %d, " "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %" G_GINT64_FORMAT, update, rate, arate, format, start, stop, time); gst_segment_set_newsegment_full (&element->segment, update, rate, arate, format, start, stop, time); gst_object_unref (element); } return gst_pad_event_default (pad, event); } #endifqtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstappsrc.cpp000066400000000000000000000165101225012771600301420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qgstappsrc_p.h" #include QGstAppSrc::QGstAppSrc(QObject *parent) :QObject(parent) ,m_stream(0) ,m_appSrc(0) ,m_sequential(false) ,m_maxBytes(0) ,m_setup(false) ,m_dataRequestSize(-1) ,m_dataRequested(false) ,m_enoughData(false) ,m_forceData(false) { m_callbacks.need_data = &QGstAppSrc::on_need_data; m_callbacks.enough_data = &QGstAppSrc::on_enough_data; m_callbacks.seek_data = &QGstAppSrc::on_seek_data; } QGstAppSrc::~QGstAppSrc() { if (m_appSrc) gst_object_unref(G_OBJECT(m_appSrc)); } bool QGstAppSrc::setup(GstElement* appsrc) { if (m_setup || m_stream == 0 || appsrc == 0) return false; m_appSrc = GST_APP_SRC(appsrc); gst_app_src_set_callbacks(m_appSrc, (GstAppSrcCallbacks*)&m_callbacks, this, (GDestroyNotify)&QGstAppSrc::destroy_notify); g_object_get(G_OBJECT(m_appSrc), "max-bytes", &m_maxBytes, NULL); if (m_sequential) m_streamType = GST_APP_STREAM_TYPE_STREAM; else m_streamType = GST_APP_STREAM_TYPE_RANDOM_ACCESS; gst_app_src_set_stream_type(m_appSrc, m_streamType); gst_app_src_set_size(m_appSrc, (m_sequential) ? -1 : m_stream->size()); return m_setup = true; } void QGstAppSrc::setStream(QIODevice *stream) { if (stream == 0) return; if (m_stream) { disconnect(m_stream, SIGNAL(readyRead()), this, SLOT(onDataReady())); disconnect(m_stream, SIGNAL(destroyed()), this, SLOT(streamDestroyed())); } if (m_appSrc) gst_object_unref(G_OBJECT(m_appSrc)); m_dataRequestSize = -1; m_dataRequested = false; m_enoughData = false; m_forceData = false; m_maxBytes = 0; m_appSrc = 0; m_stream = stream; connect(m_stream, SIGNAL(destroyed()), SLOT(streamDestroyed())); connect(m_stream, SIGNAL(readyRead()), this, SLOT(onDataReady())); m_sequential = m_stream->isSequential(); m_setup = false; } QIODevice *QGstAppSrc::stream() const { return m_stream; } GstAppSrc *QGstAppSrc::element() { return m_appSrc; } void QGstAppSrc::onDataReady() { if (!m_enoughData) { m_dataRequested = true; pushDataToAppSrc(); } } void QGstAppSrc::streamDestroyed() { if (sender() == m_stream) { m_stream = 0; sendEOS(); } } void QGstAppSrc::pushDataToAppSrc() { if (!isStreamValid() || !m_setup) return; if (m_dataRequested && !m_enoughData) { qint64 size; if (m_dataRequestSize == (unsigned int)-1) size = qMin(m_stream->bytesAvailable(), queueSize()); else size = qMin(m_stream->bytesAvailable(), (qint64)m_dataRequestSize); GstBuffer* buffer = gst_buffer_new_and_alloc(size); #if GST_CHECK_VERSION(1,0,0) GstMapInfo mapInfo; gst_buffer_map(buffer, &mapInfo, GST_MAP_WRITE); void* bufferData = mapInfo.data; #else void* bufferData = GST_BUFFER_DATA(buffer); #endif buffer->offset = m_stream->pos(); qint64 bytesRead = m_stream->read((char*)bufferData, size); buffer->offset_end = buffer->offset + bytesRead - 1; #if GST_CHECK_VERSION(1,0,0) gst_buffer_unmap(buffer, &mapInfo); #endif if (bytesRead > 0) { m_dataRequested = false; m_enoughData = false; GstFlowReturn ret = gst_app_src_push_buffer (GST_APP_SRC (element()), buffer); if (ret == GST_FLOW_ERROR) { qWarning()<<"appsrc: push buffer error"; #if GST_CHECK_VERSION(1,0,0) } else if (ret == GST_FLOW_FLUSHING) { qWarning()<<"appsrc: push buffer wrong state"; } #else } else if (ret == GST_FLOW_WRONG_STATE) { qWarning()<<"appsrc: push buffer wrong state"; } #endif #if GST_VERSION_MAJOR < 1 else if (ret == GST_FLOW_RESEND) { qWarning()<<"appsrc: push buffer resend"; } #endif } // After reading we might be all done if (m_stream->atEnd()) sendEOS(); } else if (m_stream->atEnd()) { sendEOS(); } } bool QGstAppSrc::doSeek(qint64 value) { if (isStreamValid()) return stream()->seek(value); return false; } gboolean QGstAppSrc::on_seek_data(GstAppSrc *element, guint64 arg0, gpointer userdata) { Q_UNUSED(element); QGstAppSrc *self = reinterpret_cast(userdata); if (self && self->isStreamValid()) { if (!self->stream()->isSequential()) QMetaObject::invokeMethod(self, "doSeek", Qt::AutoConnection, Q_ARG(qint64, arg0)); } else return false; return true; } void QGstAppSrc::on_enough_data(GstAppSrc *element, gpointer userdata) { Q_UNUSED(element); QGstAppSrc *self = reinterpret_cast(userdata); if (self) self->enoughData() = true; } void QGstAppSrc::on_need_data(GstAppSrc *element, guint arg0, gpointer userdata) { Q_UNUSED(element); QGstAppSrc *self = reinterpret_cast(userdata); if (self) { self->dataRequested() = true; self->enoughData() = false; self->dataRequestSize()= arg0; QMetaObject::invokeMethod(self, "pushDataToAppSrc", Qt::AutoConnection); } } void QGstAppSrc::destroy_notify(gpointer data) { Q_UNUSED(data); } void QGstAppSrc::sendEOS() { gst_app_src_end_of_stream(GST_APP_SRC(m_appSrc)); if (isStreamValid() && !stream()->isSequential()) stream()->reset(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstbufferpoolinterface.cpp000066400000000000000000000041561225012771600327010ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstbufferpoolinterface_p.h" QT_BEGIN_NAMESPACE QGstBufferPoolPlugin::QGstBufferPoolPlugin(QObject *parent) : QObject(parent) { } QT_END_NAMESPACE #include "moc_qgstbufferpoolinterface_p.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstcodecsinfo.cpp000066400000000000000000000155051225012771600307710ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstcodecsinfo_p.h" #include #ifdef QMEDIA_GSTREAMER_CAMERABIN #include #include #endif QGstCodecsInfo::QGstCodecsInfo(QGstCodecsInfo::ElementType elementType) { #if GST_CHECK_VERSION(0,10,31) GstElementFactoryListType gstElementType = 0; switch (elementType) { case AudioEncoder: gstElementType = GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER; break; case VideoEncoder: gstElementType = GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER; break; case Muxer: gstElementType = GST_ELEMENT_FACTORY_TYPE_MUXER; break; } GstCaps *allCaps = supportedElementCaps(gstElementType); GstCaps *caps = gst_caps_new_empty(); uint codecsCount = gst_caps_get_size(allCaps); for (uint i=0; i fakeEncoderMimeTypes; fakeEncoderMimeTypes << "unknown/unknown" << "audio/x-raw-int" << "audio/x-raw-float" << "video/x-raw-yuv" << "video/x-raw-rgb"; QSet fieldsToAdd; fieldsToAdd << "mpegversion" << "layer" << "layout" << "raversion" << "wmaversion" << "wmvversion" << "variant"; GList *element = elements; while (element) { GstElementFactory *factory = (GstElementFactory *)element->data; element = element->next; const GList *padTemplates = gst_element_factory_get_static_pad_templates(factory); while (padTemplates) { GstStaticPadTemplate *padTemplate = (GstStaticPadTemplate *)padTemplates->data; padTemplates = padTemplates->next; if (padTemplate->direction == padDirection) { const GstCaps *caps = gst_static_caps_get(&padTemplate->static_caps); for (uint i=0; i #include #include #ifdef HAVE_ALSA #include #endif QGstreamerAudioInputSelector::QGstreamerAudioInputSelector(QObject *parent) :QAudioInputSelectorControl(parent) { update(); } QGstreamerAudioInputSelector::~QGstreamerAudioInputSelector() { } QList QGstreamerAudioInputSelector::availableInputs() const { return m_names; } QString QGstreamerAudioInputSelector::inputDescription(const QString& name) const { QString desc; for (int i = 0; i < m_names.size(); i++) { if (m_names.at(i).compare(name) == 0) { desc = m_descriptions.at(i); break; } } return desc; } QString QGstreamerAudioInputSelector::defaultInput() const { if (m_names.size() > 0) return m_names.at(0); return QString(); } QString QGstreamerAudioInputSelector::activeInput() const { return m_audioInput; } void QGstreamerAudioInputSelector::setActiveInput(const QString& name) { if (m_audioInput.compare(name) != 0) { m_audioInput = name; emit activeInputChanged(name); } } void QGstreamerAudioInputSelector::update() { m_names.clear(); m_descriptions.clear(); //use autoaudiosrc as the first default device m_names.append("default:"); m_descriptions.append(tr("System default device")); updatePulseDevices(); updateAlsaDevices(); updateOssDevices(); if (m_names.size() > 0) m_audioInput = m_names.at(0); } void QGstreamerAudioInputSelector::updateAlsaDevices() { #ifdef HAVE_ALSA void **hints, **n; if (snd_device_name_hint(-1, "pcm", &hints) < 0) { qWarning()<<"no alsa devices available"; return; } n = hints; while (*n != NULL) { char *name = snd_device_name_get_hint(*n, "NAME"); char *descr = snd_device_name_get_hint(*n, "DESC"); char *io = snd_device_name_get_hint(*n, "IOID"); if ((name != NULL) && (descr != NULL)) { if ( io == NULL || qstrcmp(io,"Input") == 0 ) { m_names.append(QLatin1String("alsa:")+QString::fromUtf8(name)); m_descriptions.append(QString::fromUtf8(descr)); } } if (name != NULL) free(name); if (descr != NULL) free(descr); if (io != NULL) free(io); n++; } snd_device_name_free_hint(hints); #endif } void QGstreamerAudioInputSelector::updateOssDevices() { QDir devDir("/dev"); devDir.setFilter(QDir::System); QFileInfoList entries = devDir.entryInfoList(QStringList() << "dsp*"); foreach(const QFileInfo& entryInfo, entries) { m_names.append(QLatin1String("oss:")+entryInfo.filePath()); m_descriptions.append(QString("OSS device %1").arg(entryInfo.fileName())); } } void QGstreamerAudioInputSelector::updatePulseDevices() { GstElementFactory *factory = gst_element_factory_find("pulsesrc"); if (factory) { m_names.append("pulseaudio:"); m_descriptions.append("PulseAudio device."); gst_object_unref(GST_OBJECT(factory)); } } qgstreameraudioprobecontrol.cpp000066400000000000000000000065501225012771600335240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreameraudioprobecontrol_p.h" #include QGstreamerAudioProbeControl::QGstreamerAudioProbeControl(QObject *parent) : QMediaAudioProbeControl(parent) { } QGstreamerAudioProbeControl::~QGstreamerAudioProbeControl() { } #if GST_CHECK_VERSION(1,0,0) void QGstreamerAudioProbeControl::bufferProbed(GstBuffer* buffer, GstCaps* caps) { #else void QGstreamerAudioProbeControl::bufferProbed(GstBuffer* buffer) { gst_buffer_get_caps(buffer); #endif if (!caps) return; QAudioFormat format = QGstUtils::audioFormatForCaps(caps); gst_caps_unref(caps); if (!format.isValid()) return; #if GST_CHECK_VERSION(1,0,0) GstMapInfo info; gst_buffer_map (buffer, &info, GST_MAP_READ); QAudioBuffer audioBuffer = QAudioBuffer(QByteArray((const char*)info.data, info.size), format); gst_buffer_unmap(buffer, &info); #else QAudioBuffer audioBuffer = QAudioBuffer(QByteArray((const char*)buffer->data, buffer->size), format); #endif { QMutexLocker locker(&m_bufferMutex); m_pendingBuffer = audioBuffer; QMetaObject::invokeMethod(this, "bufferProbed", Qt::QueuedConnection); } } void QGstreamerAudioProbeControl::bufferProbed() { QAudioBuffer audioBuffer; { QMutexLocker locker(&m_bufferMutex); if (!m_pendingBuffer.isValid()) return; audioBuffer = m_pendingBuffer; } emit audioBufferProbed(audioBuffer); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamerbushelper.cpp000066400000000000000000000142221225012771600320350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qgstreamerbushelper_p.h" QT_BEGIN_NAMESPACE class QGstreamerBusHelperPrivate : public QObject { Q_OBJECT public: QGstreamerBusHelperPrivate(QGstreamerBusHelper *parent, GstBus* bus) : QObject(parent), m_bus(bus), m_helper(parent) { #ifdef QT_NO_GLIB Q_UNUSED(bus); m_intervalTimer = new QTimer(this); m_intervalTimer->setInterval(250); connect(m_intervalTimer, SIGNAL(timeout()), SLOT(interval())); m_intervalTimer->start(); #else m_tag = gst_bus_add_watch_full(bus, 0, busCallback, this, NULL); #endif } ~QGstreamerBusHelperPrivate() { m_helper = 0; #ifdef QT_NO_GLIB m_intervalTimer->stop(); #else g_source_remove(m_tag); #endif } GstBus* bus() const { return m_bus; } private slots: void interval() { GstMessage* message; while ((message = gst_bus_poll(m_bus, GST_MESSAGE_ANY, 0)) != 0) { processMessage(message); gst_message_unref(message); } } private: void processMessage(GstMessage* message) { QGstreamerMessage msg(message); doProcessMessage(msg); } void queueMessage(GstMessage* message) { QGstreamerMessage msg(message); QMetaObject::invokeMethod(this, "doProcessMessage", Qt::QueuedConnection, Q_ARG(QGstreamerMessage, msg)); } static gboolean busCallback(GstBus *bus, GstMessage *message, gpointer data) { Q_UNUSED(bus); reinterpret_cast(data)->queueMessage(message); return TRUE; } guint m_tag; GstBus* m_bus; QGstreamerBusHelper* m_helper; QTimer* m_intervalTimer; private slots: void doProcessMessage(const QGstreamerMessage& msg) { foreach (QGstreamerBusMessageFilter *filter, busFilters) { if (filter->processBusMessage(msg)) break; } emit m_helper->message(msg); } public: QMutex filterMutex; QList syncFilters; QList busFilters; }; static GstBusSyncReply syncGstBusFilter(GstBus* bus, GstMessage* message, QGstreamerBusHelperPrivate *d) { Q_UNUSED(bus); QMutexLocker lock(&d->filterMutex); foreach (QGstreamerSyncMessageFilter *filter, d->syncFilters) { if (filter->processSyncMessage(QGstreamerMessage(message))) return GST_BUS_DROP; } return GST_BUS_PASS; } /*! \class QGstreamerBusHelper \internal */ QGstreamerBusHelper::QGstreamerBusHelper(GstBus* bus, QObject* parent): QObject(parent) { d = new QGstreamerBusHelperPrivate(this, bus); #if GST_CHECK_VERSION(1,0,0) gst_bus_set_sync_handler(bus, (GstBusSyncHandler)syncGstBusFilter, d, 0); #else gst_bus_set_sync_handler(bus, (GstBusSyncHandler)syncGstBusFilter, d); #endif gst_object_ref(GST_OBJECT(bus)); } QGstreamerBusHelper::~QGstreamerBusHelper() { #if GST_CHECK_VERSION(1,0,0) gst_bus_set_sync_handler(d->bus(), 0, 0, 0); #else gst_bus_set_sync_handler(d->bus(),0,0); #endif gst_object_unref(GST_OBJECT(d->bus())); } void QGstreamerBusHelper::installMessageFilter(QObject *filter) { QGstreamerSyncMessageFilter *syncFilter = qobject_cast(filter); if (syncFilter) { QMutexLocker lock(&d->filterMutex); if (!d->syncFilters.contains(syncFilter)) d->syncFilters.append(syncFilter); } QGstreamerBusMessageFilter *busFilter = qobject_cast(filter); if (busFilter && !d->busFilters.contains(busFilter)) d->busFilters.append(busFilter); } void QGstreamerBusHelper::removeMessageFilter(QObject *filter) { QGstreamerSyncMessageFilter *syncFilter = qobject_cast(filter); if (syncFilter) { QMutexLocker lock(&d->filterMutex); d->syncFilters.removeAll(syncFilter); } QGstreamerBusMessageFilter *busFilter = qobject_cast(filter); if (busFilter) d->busFilters.removeAll(busFilter); } QT_END_NAMESPACE #include "qgstreamerbushelper.moc" qgstreamergltexturerenderer.cpp000066400000000000000000000457671225012771600335610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qgstreamergltexturerenderer_p.h" //#define GL_TEXTURE_SINK_DEBUG 1 //from extdefs.h typedef void *EGLSyncKHR; typedef khronos_utime_nanoseconds_t EGLTimeKHR; #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #define EGL_SYNC_FENCE_KHR 0x30F9 typedef EGLSyncKHR (EGLAPIENTRYP _PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint * attrib_list); typedef EGLBoolean (EGLAPIENTRYP _PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); const QAbstractVideoBuffer::HandleType EGLImageTextureHandle = QAbstractVideoBuffer::HandleType(QAbstractVideoBuffer::UserHandle+3434); // EGLSync functions _PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; _PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; class QGStreamerGLTextureBuffer : public QAbstractVideoBuffer { public: QGStreamerGLTextureBuffer(MeegoGstVideoTexture *textureSink, int frameNumber) : QAbstractVideoBuffer(EGLImageTextureHandle), m_textureSink(MEEGO_GST_VIDEO_TEXTURE(textureSink)), m_frameNumber(frameNumber) { } ~QGStreamerGLTextureBuffer() { } MapMode mapMode() const { return NotMapped; } uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) { Q_UNUSED(mode); Q_UNUSED(numBytes); Q_UNUSED(bytesPerLine); //acquire_frame should really be called at buffer construction time //but it conflicts with id-less implementation of gst texture sink. #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << "acquire frame" << m_frameNumber; #endif if (!meego_gst_video_texture_acquire_frame(m_textureSink,m_frameNumber)) qWarning() << Q_FUNC_INFO << "acquire-frame failed" << m_frameNumber; #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << "map frame" << m_frameNumber; #endif gboolean bind_status = meego_gst_video_texture_bind_frame(m_textureSink, GL_TEXTURE_EXTERNAL_OES, m_frameNumber); if (!bind_status) qWarning() << Q_FUNC_INFO << "bind-frame failed"; return (uchar*)1; } void unmap() { gboolean bind_status = meego_gst_video_texture_bind_frame(m_textureSink, GL_TEXTURE_EXTERNAL_OES, -1); #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << "unmap frame" << m_frameNumber; #endif if (!bind_status) qWarning() << Q_FUNC_INFO << "unbind-frame failed"; //release_frame should really be called in destructor //but this conflicts with id-less implementation of gst texture sink. #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << "release frame" << m_frameNumber; #endif EGLSyncKHR sync = eglCreateSyncKHR(eglGetDisplay((EGLNativeDisplayType)QX11Info::display()), EGL_SYNC_FENCE_KHR, NULL); meego_gst_video_texture_release_frame(m_textureSink, m_frameNumber, sync); } QVariant handle() const { return m_frameNumber; } private: MeegoGstVideoTexture *m_textureSink; int m_frameNumber; }; QGstreamerGLTextureRenderer::QGstreamerGLTextureRenderer(QObject *parent) : QVideoRendererControl(parent), m_videoSink(0), m_surface(0), m_context(0), m_winId(0), m_colorKey(49,0,49), m_overlayEnabled(false), m_bufferProbeId(-1) { eglCreateSyncKHR = (_PFNEGLCREATESYNCKHRPROC)eglGetProcAddress("eglCreateSyncKHR"); eglDestroySyncKHR = (_PFNEGLDESTROYSYNCKHRPROC)eglGetProcAddress("eglDestroySyncKHR"); } QGstreamerGLTextureRenderer::~QGstreamerGLTextureRenderer() { if (m_surface && m_surface->isActive()) m_surface->stop(); if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); } GstElement *QGstreamerGLTextureRenderer::videoSink() { if (!m_videoSink && isReady()) { if (m_context && !m_surface->supportedPixelFormats(EGLImageTextureHandle).isEmpty()) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << ": using gltexture sink"; #endif if (m_context) m_context->makeCurrent(); m_videoSink = gst_element_factory_make("gltexturesink", "egl-texture-sink"); g_object_set(G_OBJECT(m_videoSink), "x-display", QX11Info::display(), "egl-display", eglGetDisplay((EGLNativeDisplayType)QX11Info::display()), "egl-context", eglGetCurrentContext(), "colorkey", m_colorKey.rgb(), "autopaint-colorkey", false, "use-framebuffer-memory", true, "render-mode", m_overlayEnabled ? VIDEO_RENDERSWITCH_XOVERLAY_MODE : VIDEO_RENDERSWITCH_TEXTURE_STREAMING_MODE, (char*)NULL); g_signal_connect(G_OBJECT(m_videoSink), "frame-ready", G_CALLBACK(handleFrameReady), (gpointer)this); } else { qWarning() << Q_FUNC_INFO << ": Fallback to QVideoSurfaceGstSink since EGLImageTextureHandle is not supported"; m_videoSink = reinterpret_cast(QVideoSurfaceGstSink::createSink(m_surface)); } if (m_videoSink) { gst_object_ref(GST_OBJECT(m_videoSink)); //Take ownership gst_object_sink(GST_OBJECT(m_videoSink)); GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); m_bufferProbeId = gst_pad_add_buffer_probe(pad, G_CALLBACK(padBufferProbe), this); } } return m_videoSink; } QAbstractVideoSurface *QGstreamerGLTextureRenderer::surface() const { return m_surface; } void QGstreamerGLTextureRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << surface; #endif bool oldReady = isReady(); m_context = const_cast(QGLContext::currentContext()); if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } m_surface = surface; if (oldReady != isReady()) emit readyChanged(!oldReady); if (m_surface) { connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } emit sinkChanged(); } } void QGstreamerGLTextureRenderer::handleFormatChange() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; emit sinkChanged(); } void QGstreamerGLTextureRenderer::handleFrameReady(GstElement *sink, gint frame, gpointer data) { Q_UNUSED(sink); QGstreamerGLTextureRenderer* renderer = reinterpret_cast(data); QMutexLocker locker(&renderer->m_mutex); QMetaObject::invokeMethod(renderer, "renderGLFrame", Qt::QueuedConnection, Q_ARG(int, frame)); //we have to wait to ensure the frame is not reused, //timeout is added to avoid deadlocks when the main thread is //waiting for rendering to complete, this is possible for example during state chages. //If frame is not rendered during 60ms (~1-2 frames interval) it's better to unblock and drop it if necessary renderer->m_renderCondition.wait(&renderer->m_mutex, 60); } void QGstreamerGLTextureRenderer::renderGLFrame(int frame) { #if defined(GL_TEXTURE_SINK_DEBUG) && GL_TEXTURE_SINK_DEBUG > 1 qDebug() << Q_FUNC_INFO << "frame:" << frame << "surface active:" << m_surface->isActive(); #endif QMutexLocker locker(&m_mutex); if (!m_surface) { m_renderCondition.wakeAll(); return; } MeegoGstVideoTexture *textureSink = MEEGO_GST_VIDEO_TEXTURE(m_videoSink); if (m_context) m_context->makeCurrent(); //don't try to render the frame if state is changed to NULL or READY GstState pendingState = GST_STATE_NULL; GstState newState = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &newState, &pendingState, 0);//don't block and return immediately if (res == GST_STATE_CHANGE_FAILURE || newState == GST_STATE_NULL || pendingState == GST_STATE_NULL) { stopRenderer(); m_renderCondition.wakeAll(); return; } if (!m_surface->isActive()) { //find the native video size GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); GstCaps *caps = gst_pad_get_negotiated_caps(pad); if (caps) { QSize newNativeSize = QGstUtils::capsCorrectedResolution(caps); if (m_nativeSize != newNativeSize) { m_nativeSize = newNativeSize; emit nativeSizeChanged(); } gst_caps_unref(caps); } //start the surface... QVideoSurfaceFormat format(m_nativeSize, QVideoFrame::Format_RGB32, EGLImageTextureHandle); if (!m_surface->start(format)) { qWarning() << Q_FUNC_INFO << "failed to start video surface" << format; m_renderCondition.wakeAll(); return; } } QGStreamerGLTextureBuffer *buffer = new QGStreamerGLTextureBuffer(textureSink, frame); QVideoFrame videoFrame(buffer, m_surface->surfaceFormat().frameSize(), m_surface->surfaceFormat().pixelFormat()); m_surface->present(videoFrame); m_renderCondition.wakeAll(); } bool QGstreamerGLTextureRenderer::isReady() const { if (!m_surface) return false; if (m_winId > 0) return true; //winId is required only for EGLImageTextureHandle compatible surfaces return m_surface->supportedPixelFormats(EGLImageTextureHandle).isEmpty(); } bool QGstreamerGLTextureRenderer::processBusMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << GST_MESSAGE_TYPE_NAME(gm); #endif if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_STATE_CHANGED && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_videoSink)) { GstState oldState; GstState newState; gst_message_parse_state_changed(gm, &oldState, &newState, 0); #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << "State changed:" << oldState << newState; #endif if (newState == GST_STATE_READY || newState == GST_STATE_NULL) { stopRenderer(); } if (oldState == GST_STATE_READY && newState == GST_STATE_PAUSED) { updateNativeVideoSize(); } } return false; } bool QGstreamerGLTextureRenderer::processSyncMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); if ((GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ELEMENT) && gst_structure_has_name(gm->structure, "prepare-xwindow-id") && m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO; #endif GstXOverlay *overlay = GST_X_OVERLAY(m_videoSink); gst_x_overlay_set_xwindow_id(overlay, m_winId); if (!m_displayRect.isEmpty()) { gst_x_overlay_set_render_rectangle(overlay, m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height()); } GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); m_bufferProbeId = gst_pad_add_buffer_probe(pad, G_CALLBACK(padBufferProbe), this); return true; } return false; } void QGstreamerGLTextureRenderer::stopRenderer() { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO; #endif if (m_surface && m_surface->isActive()) m_surface->stop(); if (!m_nativeSize.isEmpty()) { m_nativeSize = QSize(); emit nativeSizeChanged(); } } bool QGstreamerGLTextureRenderer::overlayEnabled() const { return m_overlayEnabled; } void QGstreamerGLTextureRenderer::setOverlayEnabled(bool enabled) { if (m_videoSink && (m_overlayEnabled != enabled)) { qDebug() << Q_FUNC_INFO << enabled; g_object_set(G_OBJECT(m_videoSink), "render-mode", enabled ? VIDEO_RENDERSWITCH_XOVERLAY_MODE : VIDEO_RENDERSWITCH_TEXTURE_STREAMING_MODE, (char *)NULL); } m_overlayEnabled = enabled; } WId QGstreamerGLTextureRenderer::winId() const { return m_winId; } void QGstreamerGLTextureRenderer::setWinId(WId id) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << id; #endif if (m_winId == id) return; bool oldReady = isReady(); m_winId = id; if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { //don't set winId in NULL state, //texture sink opens xvideo port on set_xwindow_id, //this fails if video resource is not granted by resource policy yet. //state is changed to READY/PAUSED/PLAYING only after resource is granted. GstState pendingState = GST_STATE_NULL; GstState newState = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &newState, &pendingState, 0);//don't block and return immediately if (res != GST_STATE_CHANGE_FAILURE && newState != GST_STATE_NULL && pendingState != GST_STATE_NULL) gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_videoSink), m_winId); } if (oldReady != isReady()) emit readyChanged(!oldReady); } QRect QGstreamerGLTextureRenderer::overlayGeometry() const { return m_displayRect; } void QGstreamerGLTextureRenderer::setOverlayGeometry(const QRect &geometry) { if (m_displayRect != geometry) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << geometry; #endif m_displayRect = geometry; if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { if (m_displayRect.isEmpty()) gst_x_overlay_set_render_rectangle(GST_X_OVERLAY(m_videoSink), -1, -1, -1, -1); else gst_x_overlay_set_render_rectangle(GST_X_OVERLAY(m_videoSink), m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height()); repaintOverlay(); } } } QColor QGstreamerGLTextureRenderer::colorKey() const { return m_colorKey; } void QGstreamerGLTextureRenderer::repaintOverlay() { if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { //don't call gst_x_overlay_expose if the sink is in null state GstState state = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &state, NULL, 1000000); if (res != GST_STATE_CHANGE_FAILURE && state != GST_STATE_NULL) { gst_x_overlay_expose(GST_X_OVERLAY(m_videoSink)); } } } QSize QGstreamerGLTextureRenderer::nativeSize() const { return m_nativeSize; } gboolean QGstreamerGLTextureRenderer::padBufferProbe(GstPad *pad, GstBuffer *buffer, gpointer user_data) { QGstreamerGLTextureRenderer *control = reinterpret_cast(user_data); QMetaObject::invokeMethod(control, "updateNativeVideoSize", Qt::QueuedConnection); gst_pad_remove_buffer_probe(pad, control->m_bufferProbeId); return TRUE; } void QGstreamerGLTextureRenderer::updateNativeVideoSize() { const QSize oldSize = m_nativeSize; if (m_videoSink) { //find video native size to update video widget size hint GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); GstCaps *caps = gst_pad_get_negotiated_caps(pad); if (caps) { m_nativeSize = QGstUtils::capsCorrectedResolution(caps); gst_caps_unref(caps); } } else { m_nativeSize = QSize(); } #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << oldSize << m_nativeSize << m_videoSink; #endif if (m_nativeSize != oldSize) emit nativeSizeChanged(); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamermessage.cpp000066400000000000000000000056671225012771600315050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qgstreamermessage_p.h" QT_BEGIN_NAMESPACE static int wuchi = qRegisterMetaType(); /*! \class QGstreamerMessage \internal */ QGstreamerMessage::QGstreamerMessage(): m_message(0) { Q_UNUSED(wuchi); } QGstreamerMessage::QGstreamerMessage(GstMessage* message): m_message(message) { gst_message_ref(m_message); } QGstreamerMessage::QGstreamerMessage(QGstreamerMessage const& m): m_message(m.m_message) { gst_message_ref(m_message); } QGstreamerMessage::~QGstreamerMessage() { if (m_message != 0) gst_message_unref(m_message); } GstMessage* QGstreamerMessage::rawMessage() const { return m_message; } QGstreamerMessage& QGstreamerMessage::operator=(QGstreamerMessage const& rhs) { if (rhs.m_message != m_message) { if (rhs.m_message != 0) gst_message_ref(rhs.m_message); if (m_message != 0) gst_message_unref(m_message); m_message = rhs.m_message; } return *this; } QT_END_NAMESPACE qgstreamermirtexturerenderer.cpp000066400000000000000000000300231225012771600337210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Canonical Ltd. ** Contact: jim.hodapp@canonical.com ** ** This file is part of the Qt Toolkit. ** // TODO: Fix this license ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamermirtexturerenderer_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include class QGstreamerMirTextureBuffer : public QAbstractVideoBuffer { public: QGstreamerMirTextureBuffer(GLuint textureId) : QAbstractVideoBuffer(QAbstractVideoBuffer::GLTextureHandle), m_textureId(textureId) { } MapMode mapMode() const { return NotMapped; } uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) { qDebug() << Q_FUNC_INFO; Q_UNUSED(mode); Q_UNUSED(numBytes); Q_UNUSED(bytesPerLine); return NULL; } void unmap() { qDebug() << Q_FUNC_INFO; } QVariant handle() const { return QVariant::fromValue(m_textureId); } GLuint textureId() { return m_textureId; } private: GLuint m_textureId; }; QGstreamerMirTextureRenderer::QGstreamerMirTextureRenderer(QObject *parent , const QGstreamerPlayerSession *playerSession) : QVideoRendererControl(0), m_videoSink(0), m_surface(0), m_glSurface(0), m_context(0), m_glContext(0), m_textureId(0), m_offscreenSurface(0), m_textureBuffer(0), m_surfaceTextureClient(0) { Q_UNUSED(parent); setPlayerSession(playerSession); } QGstreamerMirTextureRenderer::~QGstreamerMirTextureRenderer() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); delete m_glContext; delete m_offscreenSurface; } GstElement *QGstreamerMirTextureRenderer::videoSink() { qDebug() << Q_FUNC_INFO; if (!m_videoSink && m_surface) { qDebug() << Q_FUNC_INFO << ": using mirsink, (this: " << this << ")"; m_videoSink = gst_element_factory_make("mirsink", "video-output"); connect(QGuiApplication::instance(), SIGNAL(focusWindowChanged(QWindow*)), this, SLOT(handleFocusWindowChanged(QWindow*)), Qt::QueuedConnection); g_signal_connect(G_OBJECT(m_videoSink), "frame-ready", G_CALLBACK(handleFrameReady), (gpointer)this); g_signal_connect(G_OBJECT(m_videoSink), "surface-texture-client", G_CALLBACK(handleSetSurfaceTextureClient), (gpointer)this); } if (m_videoSink) { gst_object_ref_sink(GST_OBJECT(m_videoSink)); GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, padBufferProbe, this, NULL); } return m_videoSink; } QWindow *QGstreamerMirTextureRenderer::createOffscreenWindow(const QSurfaceFormat &format) { QWindow *w = new QWindow(); w->setSurfaceType(QWindow::OpenGLSurface); w->setFormat(format); w->setGeometry(0, 0, 1, 1); w->setFlags(w->flags() | Qt::WindowTransparentForInput); w->create(); return w; } void QGstreamerMirTextureRenderer::handleFrameReady(GstMirSink *sink, gpointer renderer) { Q_UNUSED(sink); QGstreamerMirTextureRenderer *r = reinterpret_cast(renderer); QMutexLocker locker(&r->m_mutex); QMetaObject::invokeMethod(r, "renderFrame", Qt::QueuedConnection); } void QGstreamerMirTextureRenderer::handleSetSurfaceTextureClient(GstMirSink *sink, gpointer surface_texture_client, gpointer renderer) { Q_UNUSED(sink); QGstreamerMirTextureRenderer *r = reinterpret_cast(renderer); QMutexLocker locker(&r->m_mutex); QMetaObject::invokeMethod(r, "setSurfaceTextureClient", Qt::QueuedConnection, Q_ARG(void*, surface_texture_client)); } void QGstreamerMirTextureRenderer::setSurfaceTextureClient(void* surface_texture_client) { m_surfaceTextureClient = surface_texture_client; qDebug() << "surface_texture_client: " << surface_texture_client << " (" << Q_FUNC_INFO << ")"; } void QGstreamerMirTextureRenderer::renderFrame() { //qDebug() << Q_FUNC_INFO; if (m_context) m_context->makeCurrent(); GstState pendingState = GST_STATE_NULL; GstState newState = GST_STATE_NULL; // Don't block and return immediately: GstStateChangeReturn ret = gst_element_get_state(m_videoSink, &newState, &pendingState, 0); if (ret == GST_STATE_CHANGE_FAILURE || newState == GST_STATE_NULL|| pendingState == GST_STATE_NULL) { qWarning() << "Invalid state change for renderer, aborting"; stopRenderer(); return; } if (!m_surface->isActive()) { qDebug() << "m_surface is not active"; GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); GstCaps *caps = gst_pad_get_current_caps(pad); if (caps) { // Get the native video size from the video sink QSize newNativeSize = QGstUtils::capsCorrectedResolution(caps); if (m_nativeSize != newNativeSize) { m_nativeSize = newNativeSize; emit nativeSizeChanged(); } gst_caps_unref(caps); } // Start the surface QVideoSurfaceFormat format(m_nativeSize, QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); qDebug() << "m_nativeSize: " << m_nativeSize; qDebug() << "format: " << format; if (!m_surface->start(format)) { qWarning() << Q_FUNC_INFO << ": failed to start the video surface " << format; return; } } QGstreamerMirTextureBuffer *buffer = new QGstreamerMirTextureBuffer(m_textureId); //qDebug() << "frameSize: " << m_surface->surfaceFormat().frameSize(); QVideoFrame frame(buffer, m_surface->surfaceFormat().frameSize(), m_surface->surfaceFormat().pixelFormat()); frame.setMetaData("TextureId", m_textureId); //qDebug() << "SurfaceTextureClient (metadata): " << m_surfaceTextureClient; frame.setMetaData("SurfaceTextureClient", reinterpret_cast(m_surfaceTextureClient)); // Display the video frame on the surface: m_surface->present(frame); } GstPadProbeReturn QGstreamerMirTextureRenderer::padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer userData) { Q_UNUSED(pad); Q_UNUSED(info); QGstreamerMirTextureRenderer *control = reinterpret_cast(userData); QMetaObject::invokeMethod(control, "updateNativeVideoSize", Qt::QueuedConnection); return GST_PAD_PROBE_REMOVE; } void QGstreamerMirTextureRenderer::stopRenderer() { if (m_surface) m_surface->stop(); } QAbstractVideoSurface *QGstreamerMirTextureRenderer::surface() const { return m_surface; } void QGstreamerMirTextureRenderer::setSurface(QAbstractVideoSurface *surface) { qDebug() << Q_FUNC_INFO; if (m_surface != surface) { qDebug() << "Saving current QGLContext"; m_context = const_cast(QGLContext::currentContext()); if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } bool wasReady = isReady(); m_surface = surface; if (m_surface) { connect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } if (wasReady != isReady()) emit readyChanged(isReady()); emit sinkChanged(); } } void QGstreamerMirTextureRenderer::setPlayerSession(const QGstreamerPlayerSession *playerSession) { m_playerSession = const_cast(playerSession); } void QGstreamerMirTextureRenderer::handleFormatChange() { qDebug() << "Supported formats list has changed, reload video output"; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; emit sinkChanged(); } void QGstreamerMirTextureRenderer::updateNativeVideoSize() { //qDebug() << Q_FUNC_INFO; const QSize oldSize = m_nativeSize; if (m_videoSink) { // Find video native size to update video widget size hint GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); GstCaps *caps = gst_pad_get_current_caps(pad); if (caps) { m_nativeSize = QGstUtils::capsCorrectedResolution(caps); gst_caps_unref(caps); } } else { m_nativeSize = QSize(); } qDebug() << Q_FUNC_INFO << oldSize << m_nativeSize << m_videoSink; if (m_nativeSize != oldSize) emit nativeSizeChanged(); } void QGstreamerMirTextureRenderer::handleFocusWindowChanged(QWindow *window) { qDebug() << Q_FUNC_INFO; QOpenGLContext *currContext = QOpenGLContext::currentContext(); QQuickWindow *w = dynamic_cast(window); // If we don't have a GL context in the current thread, create one and share it // with the render thread GL context if (!currContext && !m_glContext) { // This emulates the new QOffscreenWindow class with Qt5.1 m_offscreenSurface = createOffscreenWindow(w->openglContext()->surface()->format()); m_offscreenSurface->setParent(window); QOpenGLContext *shareContext = 0; if (m_surface) shareContext = qobject_cast(m_surface->property("GLContext").value()); m_glContext = new QOpenGLContext; m_glContext->setFormat(m_offscreenSurface->requestedFormat()); if (shareContext) m_glContext->setShareContext(shareContext); if (!m_glContext->create()) { qWarning() << "Failed to create new shared context."; return; } } if (m_glContext) m_glContext->makeCurrent(m_offscreenSurface); if (m_textureId == 0) { glGenTextures(1, &m_textureId); qDebug() << "texture_id (handleFocusWindowChanged): " << m_textureId << endl; g_object_set(G_OBJECT(m_videoSink), "texture-id", m_textureId, (char*)NULL); } } qgstreamervideoinputdevicecontrol.cpp000066400000000000000000000113431225012771600347350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideoinputdevicecontrol_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include QGstreamerVideoInputDeviceControl::QGstreamerVideoInputDeviceControl(QObject *parent) :QVideoDeviceSelectorControl(parent), m_selectedDevice(0) { update(); } QGstreamerVideoInputDeviceControl::~QGstreamerVideoInputDeviceControl() { } int QGstreamerVideoInputDeviceControl::deviceCount() const { return m_names.size(); } QString QGstreamerVideoInputDeviceControl::deviceName(int index) const { return m_names[index]; } QString QGstreamerVideoInputDeviceControl::deviceDescription(int index) const { return m_descriptions[index]; } int QGstreamerVideoInputDeviceControl::defaultDevice() const { return 0; } int QGstreamerVideoInputDeviceControl::selectedDevice() const { return m_selectedDevice; } void QGstreamerVideoInputDeviceControl::setSelectedDevice(int index) { if (index != m_selectedDevice) { m_selectedDevice = index; emit selectedDeviceChanged(index); emit selectedDeviceChanged(deviceName(index)); } } void QGstreamerVideoInputDeviceControl::update() { m_names.clear(); m_descriptions.clear(); #ifdef Q_WS_MAEMO_6 m_names << QLatin1String("primary") << QLatin1String("secondary"); m_descriptions << tr("Main camera") << tr("Front camera"); #else QDir devDir("/dev"); devDir.setFilter(QDir::System); QFileInfoList entries = devDir.entryInfoList(QStringList() << "video*"); foreach( const QFileInfo &entryInfo, entries ) { //qDebug() << "Try" << entryInfo.filePath(); int fd = ::open(entryInfo.filePath().toLatin1().constData(), O_RDWR ); if (fd == -1) continue; bool isCamera = false; v4l2_input input; memset(&input, 0, sizeof(input)); for (; ::ioctl(fd, VIDIOC_ENUMINPUT, &input) >= 0; ++input.index) { if(input.type == V4L2_INPUT_TYPE_CAMERA || input.type == 0) { isCamera = ::ioctl(fd, VIDIOC_S_INPUT, input.index) != 0; break; } } if (isCamera) { // find out its driver "name" QString name; struct v4l2_capability vcap; memset(&vcap, 0, sizeof(struct v4l2_capability)); if (ioctl(fd, VIDIOC_QUERYCAP, &vcap) != 0) name = entryInfo.fileName(); else name = QString((const char*)vcap.card); //qDebug() << "found camera: " << name; m_names.append(entryInfo.filePath()); m_descriptions.append(name); } ::close(fd); } #endif } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamervideooverlay.cpp000066400000000000000000000143161225012771600325600ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideooverlay_p.h" #include #include #include #include QGstreamerVideoOverlay::QGstreamerVideoOverlay(QObject *parent) : QVideoWindowControl(parent) , m_surface(new QX11VideoSurface) , m_videoSink(reinterpret_cast(QVideoSurfaceGstSink::createSink(m_surface))) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullScreen(false) { qDebug() << Q_FUNC_INFO; if (m_videoSink) { #if !GST_CHECK_VERSION(1,0,0) gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership gst_object_sink (GST_OBJECT (m_videoSink)); #else gst_object_ref_sink(GST_OBJECT (m_videoSink)); #endif } connect(m_surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SLOT(surfaceFormatChanged())); } QGstreamerVideoOverlay::~QGstreamerVideoOverlay() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); delete m_surface; } WId QGstreamerVideoOverlay::winId() const { return m_surface->winId(); } void QGstreamerVideoOverlay::setWinId(WId id) { bool wasReady = isReady(); m_surface->setWinId(id); if (isReady() != wasReady) emit readyChanged(!wasReady); } QRect QGstreamerVideoOverlay::displayRect() const { return m_displayRect; } void QGstreamerVideoOverlay::setDisplayRect(const QRect &rect) { m_displayRect = rect; setScaledDisplayRect(); } Qt::AspectRatioMode QGstreamerVideoOverlay::aspectRatioMode() const { return m_aspectRatioMode; } void QGstreamerVideoOverlay::setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; setScaledDisplayRect(); } void QGstreamerVideoOverlay::repaint() { } int QGstreamerVideoOverlay::brightness() const { return m_surface->brightness(); } void QGstreamerVideoOverlay::setBrightness(int brightness) { m_surface->setBrightness(brightness); emit brightnessChanged(m_surface->brightness()); } int QGstreamerVideoOverlay::contrast() const { return m_surface->contrast(); } void QGstreamerVideoOverlay::setContrast(int contrast) { m_surface->setContrast(contrast); emit contrastChanged(m_surface->contrast()); } int QGstreamerVideoOverlay::hue() const { return m_surface->hue(); } void QGstreamerVideoOverlay::setHue(int hue) { m_surface->setHue(hue); emit hueChanged(m_surface->hue()); } int QGstreamerVideoOverlay::saturation() const { return m_surface->saturation(); } void QGstreamerVideoOverlay::setSaturation(int saturation) { m_surface->setSaturation(saturation); emit saturationChanged(m_surface->saturation()); } bool QGstreamerVideoOverlay::isFullScreen() const { return m_fullScreen; } void QGstreamerVideoOverlay::setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } QSize QGstreamerVideoOverlay::nativeSize() const { return m_surface->surfaceFormat().sizeHint(); } QAbstractVideoSurface *QGstreamerVideoOverlay::surface() const { return m_surface; } GstElement *QGstreamerVideoOverlay::videoSink() { return m_videoSink; } void QGstreamerVideoOverlay::surfaceFormatChanged() { setScaledDisplayRect(); emit nativeSizeChanged(); } void QGstreamerVideoOverlay::setScaledDisplayRect() { QRect formatViewport = m_surface->surfaceFormat().viewport(); switch (m_aspectRatioMode) { case Qt::KeepAspectRatio: { QSize size = m_surface->surfaceFormat().sizeHint(); size.scale(m_displayRect.size(), Qt::KeepAspectRatio); QRect rect(QPoint(0, 0), size); rect.moveCenter(m_displayRect.center()); m_surface->setDisplayRect(rect); m_surface->setViewport(formatViewport); } break; case Qt::IgnoreAspectRatio: m_surface->setDisplayRect(m_displayRect); m_surface->setViewport(formatViewport); break; case Qt::KeepAspectRatioByExpanding: { QSize size = m_displayRect.size(); size.scale(m_surface->surfaceFormat().sizeHint(), Qt::KeepAspectRatio); QRect viewport(QPoint(0, 0), size); viewport.moveCenter(formatViewport.center()); m_surface->setDisplayRect(m_displayRect); m_surface->setViewport(viewport); } break; }; } qgstreamervideoprobecontrol.cpp000066400000000000000000000075771225012771600335430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideoprobecontrol_p.h" #include #include QGstreamerVideoProbeControl::QGstreamerVideoProbeControl(QObject *parent) : QMediaVideoProbeControl(parent) , m_flushing(false) , m_frameProbed(false) { } QGstreamerVideoProbeControl::~QGstreamerVideoProbeControl() { } void QGstreamerVideoProbeControl::startFlushing() { m_flushing = true; { QMutexLocker locker(&m_frameMutex); m_pendingFrame = QVideoFrame(); } // only emit flush if at least one frame was probed if (m_frameProbed) emit flush(); } void QGstreamerVideoProbeControl::stopFlushing() { m_flushing = false; } #if GST_CHECK_VERSION(1,0,0) void QGstreamerVideoProbeControl::bufferProbed(GstBuffer* buffer, GstCaps* caps) #else void QGstreamerVideoProbeControl::bufferProbed(GstBuffer* buffer) #endif { if (m_flushing) return; #if GST_CHECK_VERSION(1,0,0) // FIXME: // GstCaps* caps = NULL;//gst_buffer_get_caps(buffer); #else GstCaps* caps = gst_buffer_get_caps(buffer); #endif if (!caps) return; int bytesPerLine = 0; QVideoSurfaceFormat format = QVideoSurfaceGstSink::formatForCaps(caps, &bytesPerLine); gst_caps_unref(caps); if (!format.isValid() || !bytesPerLine) return; QVideoFrame frame = QVideoFrame(new QGstVideoBuffer(buffer, bytesPerLine), format.frameSize(), format.pixelFormat()); QVideoSurfaceGstSink::setFrameTimeStamps(&frame, buffer); m_frameProbed = true; { QMutexLocker locker(&m_frameMutex); m_pendingFrame = frame; QMetaObject::invokeMethod(this, "frameProbed", Qt::QueuedConnection); } } void QGstreamerVideoProbeControl::frameProbed() { QVideoFrame frame; { QMutexLocker locker(&m_frameMutex); if (!m_pendingFrame.isValid()) return; frame = m_pendingFrame; } emit videoFrameProbed(frame); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamervideorenderer.cpp000066400000000000000000000076721225012771600327140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideorenderer_p.h" #include #include #include #include QGstreamerVideoRenderer::QGstreamerVideoRenderer(QObject *parent) :QVideoRendererControl(parent),m_videoSink(0), m_surface(0) { } QGstreamerVideoRenderer::~QGstreamerVideoRenderer() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); } GstElement *QGstreamerVideoRenderer::videoSink() { if (!m_videoSink && m_surface) { m_videoSink = QVideoSurfaceGstSink::createSink(m_surface); gst_object_ref(GST_OBJECT(m_videoSink)); // Take ownership #if GST_CHECK_VERSION(1,0,0) gst_object_ref_sink(GST_OBJECT(m_videoSink)); #else gst_object_sink(GST_OBJECT(m_videoSink)); #endif } return reinterpret_cast(m_videoSink); } void QGstreamerVideoRenderer::stopRenderer() { if (m_surface) m_surface->stop(); } QAbstractVideoSurface *QGstreamerVideoRenderer::surface() const { return m_surface; } void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { //qDebug() << Q_FUNC_INFO << surface; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } bool wasReady = isReady(); m_surface = surface; if (m_surface) { connect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } if (wasReady != isReady()) emit readyChanged(isReady()); emit sinkChanged(); } } void QGstreamerVideoRenderer::handleFormatChange() { //qDebug() << "Supported formats list has changed, reload video output"; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; emit sinkChanged(); } qgstreamervideorendererinterface.cpp000066400000000000000000000040271225012771600345050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideorendererinterface_p.h" QGstreamerVideoRendererInterface::~QGstreamerVideoRendererInterface() { } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamervideowidget.cpp000066400000000000000000000255741225012771600323720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideowidget_p.h" #include #include #include #include #include #ifdef Q_WS_X11 # include #endif #include #if !GST_CHECK_VERSION(1,0,0) #include #include #else #include #endif QT_BEGIN_NAMESPACE class QGstreamerVideoWidget : public QWidget { public: QGstreamerVideoWidget(QWidget *parent = 0) :QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QPalette palette; palette.setColor(QPalette::Background, Qt::black); setPalette(palette); } virtual ~QGstreamerVideoWidget() {} QSize sizeHint() const { return m_nativeSize; } void setNativeSize( const QSize &size) { if (size != m_nativeSize) { m_nativeSize = size; if (size.isEmpty()) setMinimumSize(0,0); else setMinimumSize(160,120); updateGeometry(); } } protected: void paintEvent(QPaintEvent *) { QPainter painter(this); painter.fillRect(rect(), palette().background()); } QSize m_nativeSize; }; QGstreamerVideoWidgetControl::QGstreamerVideoWidgetControl(QObject *parent) : QVideoWidgetControl(parent) , m_videoSink(0) , m_widget(0) , m_fullScreen(false) { } QGstreamerVideoWidgetControl::~QGstreamerVideoWidgetControl() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); delete m_widget; } void QGstreamerVideoWidgetControl::createVideoWidget() { if (m_widget) return; m_widget = new QGstreamerVideoWidget; m_widget->installEventFilter(this); m_windowId = m_widget->winId(); m_videoSink = gst_element_factory_make ("xvimagesink", NULL); if (m_videoSink) { // Check if the xv sink is usable if (gst_element_set_state(m_videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) { gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; } else { gst_element_set_state(m_videoSink, GST_STATE_NULL); g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", 1, (const char*)NULL); } } if (!m_videoSink) m_videoSink = gst_element_factory_make ("ximagesink", NULL); #if !GST_CHECK_VERSION(1,0,0) gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership gst_object_sink (GST_OBJECT (m_videoSink)); #else gst_object_ref_sink(GST_OBJECT (m_videoSink)); #endif } GstElement *QGstreamerVideoWidgetControl::videoSink() { createVideoWidget(); return m_videoSink; } bool QGstreamerVideoWidgetControl::eventFilter(QObject *object, QEvent *e) { if (m_widget && object == m_widget) { if (e->type() == QEvent::ParentChange || e->type() == QEvent::Show) { WId newWId = m_widget->winId(); if (newWId != m_windowId) { m_windowId = newWId; setOverlay(); } } if (e->type() == QEvent::Show) { // Setting these values ensures smooth resizing since it // will prevent the system from clearing the background m_widget->setAttribute(Qt::WA_NoSystemBackground, true); } else if (e->type() == QEvent::Resize) { // This is a workaround for missing background repaints // when reducing window size windowExposed(); } } return false; } bool QGstreamerVideoWidgetControl::processSyncMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); #if !GST_CHECK_VERSION(1,0,0) if (gm && (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ELEMENT) && gst_structure_has_name(gm->structure, "prepare-xwindow-id")) { #else if (gm && (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ELEMENT) && gst_structure_has_name(gst_message_get_structure(gm), "prepare-window-handle")) { #endif setOverlay(); QMetaObject::invokeMethod(this, "updateNativeVideoSize", Qt::QueuedConnection); return true; } return false; } bool QGstreamerVideoWidgetControl::processBusMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_STATE_CHANGED && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_videoSink)) { GstState oldState; GstState newState; gst_message_parse_state_changed(gm, &oldState, &newState, 0); if (oldState == GST_STATE_READY && newState == GST_STATE_PAUSED) updateNativeVideoSize(); } return false; } void QGstreamerVideoWidgetControl::setOverlay() { #if !GST_CHECK_VERSION(1,0,0) if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_videoSink), m_windowId); } #else if (m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) { gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(m_videoSink), m_windowId); } #endif } void QGstreamerVideoWidgetControl::updateNativeVideoSize() { if (m_videoSink) { //find video native size to update video widget size hint GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); #if !GST_CHECK_VERSION(1,0,0) GstCaps *caps = gst_pad_get_negotiated_caps(pad); #else GstCaps *caps = gst_pad_get_current_caps(pad); #endif if (caps) { m_widget->setNativeSize(QGstUtils::capsCorrectedResolution(caps)); gst_caps_unref(caps); } } else { if (m_widget) m_widget->setNativeSize(QSize()); } } void QGstreamerVideoWidgetControl::windowExposed() { #if !GST_CHECK_VERSION(1,0,0) if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) gst_x_overlay_expose(GST_X_OVERLAY(m_videoSink)); #else if (m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) gst_video_overlay_expose(GST_VIDEO_OVERLAY(m_videoSink)); #endif } QWidget *QGstreamerVideoWidgetControl::videoWidget() { createVideoWidget(); return m_widget; } Qt::AspectRatioMode QGstreamerVideoWidgetControl::aspectRatioMode() const { return m_aspectRatioMode; } void QGstreamerVideoWidgetControl::setAspectRatioMode(Qt::AspectRatioMode mode) { if (m_videoSink) { g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", (mode == Qt::KeepAspectRatio), (const char*)NULL); } m_aspectRatioMode = mode; } bool QGstreamerVideoWidgetControl::isFullScreen() const { return m_fullScreen; } void QGstreamerVideoWidgetControl::setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } int QGstreamerVideoWidgetControl::brightness() const { int brightness = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) g_object_get(G_OBJECT(m_videoSink), "brightness", &brightness, NULL); return brightness / 10; } void QGstreamerVideoWidgetControl::setBrightness(int brightness) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) { g_object_set(G_OBJECT(m_videoSink), "brightness", brightness * 10, NULL); emit brightnessChanged(brightness); } } int QGstreamerVideoWidgetControl::contrast() const { int contrast = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) g_object_get(G_OBJECT(m_videoSink), "contrast", &contrast, NULL); return contrast / 10; } void QGstreamerVideoWidgetControl::setContrast(int contrast) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) { g_object_set(G_OBJECT(m_videoSink), "contrast", contrast * 10, NULL); emit contrastChanged(contrast); } } int QGstreamerVideoWidgetControl::hue() const { int hue = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) g_object_get(G_OBJECT(m_videoSink), "hue", &hue, NULL); return hue / 10; } void QGstreamerVideoWidgetControl::setHue(int hue) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) { g_object_set(G_OBJECT(m_videoSink), "hue", hue * 10, NULL); emit hueChanged(hue); } } int QGstreamerVideoWidgetControl::saturation() const { int saturation = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) g_object_get(G_OBJECT(m_videoSink), "saturation", &saturation, NULL); return saturation / 10; } void QGstreamerVideoWidgetControl::setSaturation(int saturation) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) { g_object_set(G_OBJECT(m_videoSink), "saturation", saturation * 10, NULL); emit saturationChanged(saturation); } } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstreamervideowindow.cpp000066400000000000000000000322111225012771600324000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstreamervideowindow_p.h" #include #include #include #include #if !GST_CHECK_VERSION(1,0,0) #include #include #endif /* QGstreamerVideoWindow is similar to QGstreamerVideoOverlay, but uses xvimagesink like gstreamer element instead of QX11VideoSurface. This allows to use the accelerated elements if available on the target platform, but requires at least 0.10.29 gstreamer version with gst_x_overlay_set_render_rectangle to set display rect. */ QGstreamerVideoWindow::QGstreamerVideoWindow(QObject *parent, const char *elementName) : QVideoWindowControl(parent) , m_videoSink(0) , m_windowId(0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullScreen(false) , m_colorKey(QColor::Invalid) { if (elementName) { m_videoSink = gst_element_factory_make(elementName, NULL); } else { m_videoSink = gst_element_factory_make("xvimagesink", NULL); } if (m_videoSink) { #if GST_CHECK_VERSION(1,0,0) gst_object_ref_sink(GST_OBJECT(m_videoSink)); gst_object_ref_sink(GST_OBJECT(m_videoSink)); #else gst_object_ref(GST_OBJECT(m_videoSink)); // Take ownership gst_object_sink(GST_OBJECT(m_videoSink)); #endif GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); #if GST_CHECK_VERSION(1,0,0) m_bufferProbeId = gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, padBufferProbe, this, NULL); #else m_bufferProbeId = gst_pad_add_buffer_probe(pad, G_CALLBACK(padBufferProbe), this); #endif } else qDebug() << "No m_videoSink available!"; } QGstreamerVideoWindow::~QGstreamerVideoWindow() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); } WId QGstreamerVideoWindow::winId() const { return m_windowId; } void QGstreamerVideoWindow::setWinId(WId id) { if (m_windowId == id) return; WId oldId = m_windowId; m_windowId = id; #if GST_CHECK_VERSION(1,0,0) if (m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) { gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(m_videoSink), m_windowId); } #else if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_videoSink), m_windowId); } #endif if (!oldId) emit readyChanged(true); if (!id) emit readyChanged(false); } bool QGstreamerVideoWindow::processSyncMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); #if GST_CHECK_VERSION(1,0,0) const GstStructure *s = gst_message_get_structure(gm); if ((GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ELEMENT) && gst_structure_has_name(s, "prepare-window-handle") && m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) { gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(m_videoSink), m_windowId); GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); m_bufferProbeId = gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, padBufferProbe, this, NULL); return true; } #else if ((GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ELEMENT) && gst_structure_has_name(gm->structure, "prepare-xwindow-id") && m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_videoSink), m_windowId); GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); m_bufferProbeId = gst_pad_add_buffer_probe(pad, G_CALLBACK(padBufferProbe), this); return true; } #endif return false; } QRect QGstreamerVideoWindow::displayRect() const { return m_displayRect; } void QGstreamerVideoWindow::setDisplayRect(const QRect &rect) { m_displayRect = rect; #if GST_CHECK_VERSION(1,0,0) if (m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) { if (m_displayRect.isEmpty()) gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(m_videoSink), -1, -1, -1, -1); else gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(m_videoSink), m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height()); repaint(); } #else if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { #if GST_VERSION_MICRO >= 29 if (m_displayRect.isEmpty()) gst_x_overlay_set_render_rectangle(GST_X_OVERLAY(m_videoSink), -1, -1, -1, -1); else gst_x_overlay_set_render_rectangle(GST_X_OVERLAY(m_videoSink), m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height()); repaint(); #endif } #endif } Qt::AspectRatioMode QGstreamerVideoWindow::aspectRatioMode() const { return m_aspectRatioMode; } void QGstreamerVideoWindow::setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; if (m_videoSink) { g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", (m_aspectRatioMode == Qt::KeepAspectRatio), (const char*)NULL); } } void QGstreamerVideoWindow::repaint() { #if GST_CHECK_VERSION(1,0,0) if (m_videoSink && GST_IS_VIDEO_OVERLAY(m_videoSink)) { //don't call gst_x_overlay_expose if the sink is in null state GstState state = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &state, NULL, 1000000); if (res != GST_STATE_CHANGE_FAILURE && state != GST_STATE_NULL) { gst_video_overlay_expose(GST_VIDEO_OVERLAY(m_videoSink)); } } #else if (m_videoSink && GST_IS_X_OVERLAY(m_videoSink)) { //don't call gst_x_overlay_expose if the sink is in null state GstState state = GST_STATE_NULL; GstStateChangeReturn res = gst_element_get_state(m_videoSink, &state, NULL, 1000000); if (res != GST_STATE_CHANGE_FAILURE && state != GST_STATE_NULL) { gst_x_overlay_expose(GST_X_OVERLAY(m_videoSink)); } } #endif } QColor QGstreamerVideoWindow::colorKey() const { if (!m_colorKey.isValid()) { gint colorkey = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "colorkey")) g_object_get(G_OBJECT(m_videoSink), "colorkey", &colorkey, NULL); if (colorkey > 0) m_colorKey.setRgb(colorkey); } return m_colorKey; } void QGstreamerVideoWindow::setColorKey(const QColor &color) { m_colorKey = color; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "colorkey")) g_object_set(G_OBJECT(m_videoSink), "colorkey", color.rgba(), NULL); } bool QGstreamerVideoWindow::autopaintColorKey() const { bool enabled = true; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "autopaint-colorkey")) g_object_get(G_OBJECT(m_videoSink), "autopaint-colorkey", &enabled, NULL); return enabled; } void QGstreamerVideoWindow::setAutopaintColorKey(bool enabled) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "autopaint-colorkey")) g_object_set(G_OBJECT(m_videoSink), "autopaint-colorkey", enabled, NULL); } int QGstreamerVideoWindow::brightness() const { int brightness = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) g_object_get(G_OBJECT(m_videoSink), "brightness", &brightness, NULL); return brightness / 10; } void QGstreamerVideoWindow::setBrightness(int brightness) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) { g_object_set(G_OBJECT(m_videoSink), "brightness", brightness * 10, NULL); emit brightnessChanged(brightness); } } int QGstreamerVideoWindow::contrast() const { int contrast = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) g_object_get(G_OBJECT(m_videoSink), "contrast", &contrast, NULL); return contrast / 10; } void QGstreamerVideoWindow::setContrast(int contrast) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) { g_object_set(G_OBJECT(m_videoSink), "contrast", contrast * 10, NULL); emit contrastChanged(contrast); } } int QGstreamerVideoWindow::hue() const { int hue = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) g_object_get(G_OBJECT(m_videoSink), "hue", &hue, NULL); return hue / 10; } void QGstreamerVideoWindow::setHue(int hue) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) { g_object_set(G_OBJECT(m_videoSink), "hue", hue * 10, NULL); emit hueChanged(hue); } } int QGstreamerVideoWindow::saturation() const { int saturation = 0; if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) g_object_get(G_OBJECT(m_videoSink), "saturation", &saturation, NULL); return saturation / 10; } void QGstreamerVideoWindow::setSaturation(int saturation) { if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) { g_object_set(G_OBJECT(m_videoSink), "saturation", saturation * 10, NULL); emit saturationChanged(saturation); } } bool QGstreamerVideoWindow::isFullScreen() const { return m_fullScreen; } void QGstreamerVideoWindow::setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } QSize QGstreamerVideoWindow::nativeSize() const { return m_nativeSize; } #if GST_CHECK_VERSION(1,0,0) GstPadProbeReturn QGstreamerVideoWindow::padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer user_data) #else void QGstreamerVideoWindow::padBufferProbe(GstPad *pad, GstBuffer * /* buffer */, gpointer user_data) #endif { QGstreamerVideoWindow *control = reinterpret_cast(user_data); QMetaObject::invokeMethod(control, "updateNativeVideoSize", Qt::QueuedConnection); #if GST_CHECK_VERSION(1,0,0) Q_UNUSED(pad); Q_UNUSED(info); return GST_PAD_PROBE_REMOVE; #else gst_pad_remove_buffer_probe(pad, control->m_bufferProbeId); #endif } void QGstreamerVideoWindow::updateNativeVideoSize() { const QSize oldSize = m_nativeSize; m_nativeSize = QSize(); if (m_videoSink) { //find video native size to update video widget size hint GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); #if GST_CHECK_VERSION(1,0,0) GstCaps *caps = gst_pad_get_current_caps(pad); #else GstCaps *caps = gst_pad_get_negotiated_caps(pad); #endif if (caps) { m_nativeSize = QGstUtils::capsCorrectedResolution(caps); gst_caps_unref(caps); } } if (m_nativeSize != oldSize) emit nativeSizeChanged(); } GstElement *QGstreamerVideoWindow::videoSink() { return m_videoSink; } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstutils.cpp000066400000000000000000000335711225012771600300200ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstutils_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE //internal static void addTagToMap(const GstTagList *list, const gchar *tag, gpointer user_data) { QMap *map = reinterpret_cast* >(user_data); GValue val; val.g_type = 0; gst_tag_list_copy_value(&val,list,tag); switch( G_VALUE_TYPE(&val) ) { case G_TYPE_STRING: { const gchar *str_value = g_value_get_string(&val); map->insert(QByteArray(tag), QString::fromUtf8(str_value)); break; } case G_TYPE_INT: map->insert(QByteArray(tag), g_value_get_int(&val)); break; case G_TYPE_UINT: map->insert(QByteArray(tag), g_value_get_uint(&val)); break; case G_TYPE_LONG: map->insert(QByteArray(tag), qint64(g_value_get_long(&val))); break; case G_TYPE_BOOLEAN: map->insert(QByteArray(tag), g_value_get_boolean(&val)); break; case G_TYPE_CHAR: map->insert(QByteArray(tag), g_value_get_char(&val)); break; case G_TYPE_DOUBLE: map->insert(QByteArray(tag), g_value_get_double(&val)); break; default: // GST_TYPE_DATE is a function, not a constant, so pull it out of the switch #if GST_CHECK_VERSION(1,0,0) if (G_VALUE_TYPE(&val) == G_TYPE_DATE) { const GDate *date = (const GDate *)g_value_get_boxed(&val); #else if (G_VALUE_TYPE(&val) == GST_TYPE_DATE) { const GDate *date = gst_value_get_date(&val); #endif if (g_date_valid(date)) { int year = g_date_get_year(date); int month = g_date_get_month(date); int day = g_date_get_day(date); map->insert(QByteArray(tag), QDate(year,month,day)); if (!map->contains("year")) map->insert("year", year); } } else if (G_VALUE_TYPE(&val) == GST_TYPE_FRACTION) { int nom = gst_value_get_fraction_numerator(&val); int denom = gst_value_get_fraction_denominator(&val); if (denom > 0) { map->insert(QByteArray(tag), double(nom)/denom); } } break; } g_value_unset(&val); } /*! Convert GstTagList structure to QMap. Mapping to int, bool, char, string, fractions and date are supported. Fraction values are converted to doubles. */ QMap QGstUtils::gstTagListToMap(const GstTagList *tags) { QMap res; gst_tag_list_foreach(tags, addTagToMap, &res); return res; } /*! Returns resolution of \a caps. If caps doesn't have a valid size, and ampty QSize is returned. */ QSize QGstUtils::capsResolution(const GstCaps *caps) { QSize size; if (caps) { const GstStructure *structure = gst_caps_get_structure(caps, 0); gst_structure_get_int(structure, "width", &size.rwidth()); gst_structure_get_int(structure, "height", &size.rheight()); } return size; } /*! Returns aspect ratio corrected resolution of \a caps. If caps doesn't have a valid size, an empty QSize is returned. */ QSize QGstUtils::capsCorrectedResolution(const GstCaps *caps) { QSize size; if (caps) { const GstStructure *structure = gst_caps_get_structure(caps, 0); gst_structure_get_int(structure, "width", &size.rwidth()); gst_structure_get_int(structure, "height", &size.rheight()); gint aspectNum = 0; gint aspectDenum = 0; if (!size.isEmpty() && gst_structure_get_fraction( structure, "pixel-aspect-ratio", &aspectNum, &aspectDenum)) { if (aspectDenum > 0) size.setWidth(size.width()*aspectNum/aspectDenum); } } return size; } /*! Returns audio format for caps. If caps doesn't have a valid audio format, an empty QAudioFormat is returned. */ QAudioFormat QGstUtils::audioFormatForCaps(const GstCaps *caps) { const GstStructure *structure = gst_caps_get_structure(caps, 0); QAudioFormat format; if (qstrcmp(gst_structure_get_name(structure), "audio/x-raw-int") == 0) { format.setCodec("audio/pcm"); int endianness = 0; gst_structure_get_int(structure, "endianness", &endianness); if (endianness == 1234) format.setByteOrder(QAudioFormat::LittleEndian); else if (endianness == 4321) format.setByteOrder(QAudioFormat::BigEndian); gboolean isSigned = FALSE; gst_structure_get_boolean(structure, "signed", &isSigned); if (isSigned) format.setSampleType(QAudioFormat::SignedInt); else format.setSampleType(QAudioFormat::UnSignedInt); // Number of bits allocated per sample. int width = 0; gst_structure_get_int(structure, "width", &width); // The number of bits used per sample. This must be less than or equal to the width. int depth = 0; gst_structure_get_int(structure, "depth", &depth); if (width != depth) { // Unsupported sample layout. return QAudioFormat(); } format.setSampleSize(width); int rate = 0; gst_structure_get_int(structure, "rate", &rate); format.setSampleRate(rate); int channels = 0; gst_structure_get_int(structure, "channels", &channels); format.setChannelCount(channels); } else if (qstrcmp(gst_structure_get_name(structure), "audio/x-raw-float") == 0) { format.setCodec("audio/pcm"); int endianness = 0; gst_structure_get_int(structure, "endianness", &endianness); if (endianness == 1234) format.setByteOrder(QAudioFormat::LittleEndian); else if (endianness == 4321) format.setByteOrder(QAudioFormat::BigEndian); format.setSampleType(QAudioFormat::Float); int width = 0; gst_structure_get_int(structure, "width", &width); format.setSampleSize(width); int rate = 0; gst_structure_get_int(structure, "rate", &rate); format.setSampleRate(rate); int channels = 0; gst_structure_get_int(structure, "channels", &channels); format.setChannelCount(channels); } else { return QAudioFormat(); } return format; } #if GST_CHECK_VERSION(1,0,0) /*! Returns audio format for a buffer. If the buffer doesn't have a valid audio format, an empty QAudioFormat is returned. */ QAudioFormat QGstUtils::audioFormatForSample(GstSample *sample) { GstCaps* caps = gst_sample_get_caps(sample); if (!caps) return QAudioFormat(); QAudioFormat format = QGstUtils::audioFormatForCaps(caps); gst_caps_unref(caps); return format; } #else /*! Returns audio format for a buffer. If the buffer doesn't have a valid audio format, an empty QAudioFormat is returned. */ QAudioFormat QGstUtils::audioFormatForBuffer(GstBuffer *buffer) { GstCaps* caps = gst_buffer_get_caps(buffer); if (!caps) return QAudioFormat(); QAudioFormat format = QGstUtils::audioFormatForCaps(caps); gst_caps_unref(caps); return format; } #endif /*! Builds GstCaps for an audio format. Returns 0 if the audio format is not valid. Caller must unref GstCaps. */ GstCaps *QGstUtils::capsForAudioFormat(QAudioFormat format) { GstStructure *structure = 0; if (format.isValid()) { if (format.sampleType() == QAudioFormat::SignedInt || format.sampleType() == QAudioFormat::UnSignedInt) { structure = gst_structure_new("audio/x-raw-int", NULL); } else if (format.sampleType() == QAudioFormat::Float) { structure = gst_structure_new("audio/x-raw-float", NULL); } } GstCaps *caps = 0; if (structure) { gst_structure_set(structure, "rate", G_TYPE_INT, format.sampleRate(), NULL); gst_structure_set(structure, "channels", G_TYPE_INT, format.channelCount(), NULL); gst_structure_set(structure, "width", G_TYPE_INT, format.sampleSize(), NULL); gst_structure_set(structure, "depth", G_TYPE_INT, format.sampleSize(), NULL); if (format.byteOrder() == QAudioFormat::LittleEndian) gst_structure_set(structure, "endianness", G_TYPE_INT, 1234, NULL); else if (format.byteOrder() == QAudioFormat::BigEndian) gst_structure_set(structure, "endianness", G_TYPE_INT, 4321, NULL); if (format.sampleType() == QAudioFormat::SignedInt) gst_structure_set(structure, "signed", G_TYPE_BOOLEAN, TRUE, NULL); else if (format.sampleType() == QAudioFormat::UnSignedInt) gst_structure_set(structure, "signed", G_TYPE_BOOLEAN, FALSE, NULL); caps = gst_caps_new_empty(); Q_ASSERT(caps); gst_caps_append_structure(caps, structure); } return caps; } void QGstUtils::initializeGst() { static bool initialized = false; if (!initialized) { initialized = true; gst_init(NULL, NULL); } } namespace { const char* getCodecAlias(const QString &codec) { if (codec.startsWith("avc1.")) return "video/x-h264"; if (codec.startsWith("mp4a.")) return "audio/mpeg4"; if (codec.startsWith("mp4v.20.")) return "video/mpeg4"; if (codec == "samr") return "audio/amr"; return 0; } const char* getMimeTypeAlias(const QString &mimeType) { if (mimeType == "video/mp4") return "video/mpeg4"; if (mimeType == "audio/mp4") return "audio/mpeg4"; if (mimeType == "video/ogg" || mimeType == "audio/ogg") return "application/ogg"; return 0; } } QMultimedia::SupportEstimate QGstUtils::hasSupport(const QString &mimeType, const QStringList &codecs, const QSet &supportedMimeTypeSet) { if (supportedMimeTypeSet.isEmpty()) return QMultimedia::NotSupported; QString mimeTypeLowcase = mimeType.toLower(); bool containsMimeType = supportedMimeTypeSet.contains(mimeTypeLowcase); if (!containsMimeType) { const char* mimeTypeAlias = getMimeTypeAlias(mimeTypeLowcase); containsMimeType = supportedMimeTypeSet.contains(mimeTypeAlias); if (!containsMimeType) { containsMimeType = supportedMimeTypeSet.contains("video/" + mimeTypeLowcase) || supportedMimeTypeSet.contains("video/x-" + mimeTypeLowcase) || supportedMimeTypeSet.contains("audio/" + mimeTypeLowcase) || supportedMimeTypeSet.contains("audio/x-" + mimeTypeLowcase); } } int supportedCodecCount = 0; foreach (const QString &codec, codecs) { QString codecLowcase = codec.toLower(); const char* codecAlias = getCodecAlias(codecLowcase); if (codecAlias) { if (supportedMimeTypeSet.contains(codecAlias)) supportedCodecCount++; } else if (supportedMimeTypeSet.contains("video/" + codecLowcase) || supportedMimeTypeSet.contains("video/x-" + codecLowcase) || supportedMimeTypeSet.contains("audio/" + codecLowcase) || supportedMimeTypeSet.contains("audio/x-" + codecLowcase)) { supportedCodecCount++; } } if (supportedCodecCount > 0 && supportedCodecCount == codecs.size()) return QMultimedia::ProbablySupported; if (supportedCodecCount == 0 && !containsMimeType) return QMultimedia::NotSupported; return QMultimedia::MaybeSupported; } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstvideobuffer.cpp000066400000000000000000000066211225012771600311540ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgstvideobuffer_p.h" QT_BEGIN_NAMESPACE QGstVideoBuffer::QGstVideoBuffer(GstBuffer *buffer, int bytesPerLine) : QAbstractVideoBuffer(NoHandle) , m_buffer(buffer) , m_bytesPerLine(bytesPerLine) , m_mode(NotMapped) { gst_buffer_ref(m_buffer); } QGstVideoBuffer::QGstVideoBuffer(GstBuffer *buffer, int bytesPerLine, QGstVideoBuffer::HandleType handleType, const QVariant &handle) : QAbstractVideoBuffer(handleType) , m_buffer(buffer) , m_bytesPerLine(bytesPerLine) , m_mode(NotMapped) , m_handle(handle) { gst_buffer_ref(m_buffer); } QGstVideoBuffer::~QGstVideoBuffer() { gst_buffer_unref(m_buffer); } QAbstractVideoBuffer::MapMode QGstVideoBuffer::mapMode() const { return m_mode; } uchar *QGstVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) { if (mode != NotMapped && m_mode == NotMapped) { m_mode = mode; if (bytesPerLine) *bytesPerLine = m_bytesPerLine; #if GST_CHECK_VERSION(1,0,0) gst_buffer_map(m_buffer, &m_mapInfo, GST_MAP_READ); if (numBytes) *numBytes = m_mapInfo.size; return m_mapInfo.data; #else if (numBytes) *numBytes = m_buffer->size; return m_buffer->data; #endif } else { return 0; } } void QGstVideoBuffer::unmap() { #if GST_CHECK_VERSION(1,0,0) if (m_mode != NotMapped) gst_buffer_unmap(m_buffer, &m_mapInfo); #endif m_mode = NotMapped; } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qgstxvimagebuffer.cpp000066400000000000000000000231331225012771600315030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include "qgstxvimagebuffer_p.h" #include "qvideosurfacegstsink_p.h" #include "qgstvideobuffer_p.h" QT_BEGIN_NAMESPACE #if !GST_CHECK_VERSION(1,0,0) GstBufferClass *QGstXvImageBuffer::parent_class = NULL; GType QGstXvImageBuffer::get_type(void) { static GType buffer_type = 0; if (buffer_type == 0) { static const GTypeInfo buffer_info = { sizeof (GstBufferClass), NULL, NULL, QGstXvImageBuffer::class_init, NULL, NULL, sizeof(QGstXvImageBuffer), 0, (GInstanceInitFunc)QGstXvImageBuffer::buffer_init, NULL }; buffer_type = g_type_register_static(GST_TYPE_BUFFER, "QGstXvImageBuffer", &buffer_info, GTypeFlags(0)); } return buffer_type; } void QGstXvImageBuffer::class_init(gpointer g_class, gpointer class_data) { Q_UNUSED(class_data); GST_MINI_OBJECT_CLASS(g_class)->finalize = (GstMiniObjectFinalizeFunction)buffer_finalize; parent_class = (GstBufferClass*)g_type_class_peek_parent(g_class); } void QGstXvImageBuffer::buffer_init(QGstXvImageBuffer *xvImage, gpointer g_class) { Q_UNUSED(g_class); xvImage->pool = 0; xvImage->shmInfo.shmaddr = ((char *) -1); xvImage->shmInfo.shmid = -1; xvImage->markedForDeletion = false; } void QGstXvImageBuffer::buffer_finalize(QGstXvImageBuffer * xvImage) { if (xvImage->pool) { if (xvImage->markedForDeletion) xvImage->pool->destroyBuffer(xvImage); else xvImage->pool->recycleBuffer(xvImage); } } #endif QGstXvImageBufferPool::QGstXvImageBufferPool(QObject *parent) :QObject(parent) { m_threadId = QThread::currentThreadId(); } QGstXvImageBufferPool::~QGstXvImageBufferPool() { } bool QGstXvImageBufferPool::isFormatSupported(const QVideoSurfaceFormat &surfaceFormat) const { bool ok = true; surfaceFormat.property("portId").toULongLong(&ok); if (!ok) return false; int xvFormatId = surfaceFormat.property("xvFormatId").toInt(&ok); if (!ok || xvFormatId < 0) return false; int dataSize = surfaceFormat.property("dataSize").toInt(&ok); if (!ok || dataSize<=0) return false; return true; } GType QGstXvImageBufferPool::bufferType() const { return QGstXvImageBuffer::get_type(); } GstBuffer *QGstXvImageBufferPool::takeBuffer( const QVideoSurfaceFormat &format, GstCaps *caps) { m_poolMutex.lock(); m_caps = caps; if (format != m_format) { doClear(); m_format = format; } if (m_pool.isEmpty()) { //qDebug() << "QGstXvImageBufferPool::takeBuffer: no buffer available, allocate the new one" << QThread::currentThreadId() << m_threadId; if (QThread::currentThreadId() == m_threadId) { doAlloc(); } else { QMetaObject::invokeMethod(this, "queuedAlloc", Qt::QueuedConnection); m_allocWaitCondition.wait(&m_poolMutex, 300); } } QGstXvImageBuffer *res = 0; if (!m_pool.isEmpty()) { res = m_pool.takeLast(); } m_poolMutex.unlock(); return GST_BUFFER(res); } QAbstractVideoBuffer::HandleType QGstXvImageBufferPool::handleType() const { return QAbstractVideoBuffer::XvShmImageHandle; } QAbstractVideoBuffer *QGstXvImageBufferPool::prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) { if (!G_TYPE_CHECK_INSTANCE_TYPE(buffer, bufferType())) return 0; QGstXvImageBuffer *xvBuffer = reinterpret_cast(buffer); QVariant handle = QVariant::fromValue(xvBuffer->xvImage); return new QGstVideoBuffer(buffer, bytesPerLine, QAbstractVideoBuffer::XvShmImageHandle, handle); } QStringList QGstXvImageBufferPool::keys() const { return QStringList() << QGstBufferPoolPluginKey; } void QGstXvImageBufferPool::queuedAlloc() { QMutexLocker lock(&m_poolMutex); doAlloc(); m_allocWaitCondition.wakeOne(); } void QGstXvImageBufferPool::doAlloc() { //should be always called from the main thread with m_poolMutex locked //Q_ASSERT(QThread::currentThread() == thread()); XSync(display(), false); #if !GST_CHECK_VERSION(1,0,0) QGstXvImageBuffer *xvBuffer = (QGstXvImageBuffer *)gst_mini_object_new(QGstXvImageBuffer::get_type()); #else // FIXME: this is just stub. QGstXvImageBuffer *xvBuffer = NULL; #endif quint64 portId = m_format.property("portId").toULongLong(); int xvFormatId = m_format.property("xvFormatId").toInt(); xvBuffer->xvImage = XvShmCreateImage( display(), portId, xvFormatId, 0, m_format.frameWidth(), m_format.frameHeight(), &xvBuffer->shmInfo ); if (!xvBuffer->xvImage) { qWarning() << "QGstXvImageBufferPool: XvShmCreateImage failed"; return; } XSync(display(), false); xvBuffer->shmInfo.shmid = shmget(IPC_PRIVATE, xvBuffer->xvImage->data_size, IPC_CREAT | 0777); xvBuffer->shmInfo.shmaddr = xvBuffer->xvImage->data = (char*)shmat(xvBuffer->shmInfo.shmid, 0, 0); xvBuffer->shmInfo.readOnly = False; if (!XShmAttach(display(), &xvBuffer->shmInfo)) { qWarning() << "QGstXvImageBufferPool: XShmAttach failed"; return; } XSync(display(), false); shmctl (xvBuffer->shmInfo.shmid, IPC_RMID, NULL); xvBuffer->pool = this; #if !GST_CHECK_VERSION(1,0,0) GST_MINI_OBJECT_CAST(xvBuffer)->flags = 0; gst_buffer_set_caps(GST_BUFFER_CAST(xvBuffer), m_caps); GST_BUFFER_DATA(xvBuffer) = (uchar*)xvBuffer->xvImage->data; GST_BUFFER_SIZE(xvBuffer) = xvBuffer->xvImage->data_size; #endif m_allBuffers.append(xvBuffer); m_pool.append(xvBuffer); XSync(display(), false); } void QGstXvImageBufferPool::clear() { QMutexLocker lock(&m_poolMutex); doClear(); } void QGstXvImageBufferPool::doClear() { foreach (QGstXvImageBuffer *xvBuffer, m_allBuffers) { xvBuffer->markedForDeletion = true; } m_allBuffers.clear(); foreach (QGstXvImageBuffer *xvBuffer, m_pool) { gst_buffer_unref(GST_BUFFER(xvBuffer)); } m_pool.clear(); m_format = QVideoSurfaceFormat(); } void QGstXvImageBufferPool::queuedDestroy() { QMutexLocker lock(&m_destroyMutex); XSync(display(), false); foreach(XvShmImage xvImage, m_imagesToDestroy) { if (xvImage.shmInfo.shmaddr != ((void *) -1)) { XShmDetach(display(), &xvImage.shmInfo); XSync(display(), false); shmdt(xvImage.shmInfo.shmaddr); } if (xvImage.xvImage) XFree(xvImage.xvImage); } m_imagesToDestroy.clear(); XSync(display(), false); } void QGstXvImageBufferPool::recycleBuffer(QGstXvImageBuffer *xvBuffer) { QMutexLocker lock(&m_poolMutex); gst_buffer_ref(GST_BUFFER_CAST(xvBuffer)); m_pool.append(xvBuffer); } void QGstXvImageBufferPool::destroyBuffer(QGstXvImageBuffer *xvBuffer) { XvShmImage imageToDestroy; imageToDestroy.xvImage = xvBuffer->xvImage; imageToDestroy.shmInfo = xvBuffer->shmInfo; m_destroyMutex.lock(); m_imagesToDestroy.append(imageToDestroy); m_destroyMutex.unlock(); if (m_imagesToDestroy.size() == 1) QMetaObject::invokeMethod(this, "queuedDestroy", Qt::QueuedConnection); } Display *QGstXvImageBufferPool::display() const { QWindow *window = QGuiApplication::topLevelWindows().first(); Display *display = static_cast(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("Display", window)); return display; } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qvideosurfacegstsink.cpp000066400000000000000000001026741225012771600322250ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include "qgstvideobuffer_p.h" #if defined(HAVE_XVIDEO) #include "qgstxvimagebuffer_p.h" #endif #include "qvideosurfacegstsink_p.h" #if GST_VERSION_MAJOR >=1 #include #endif #define DEBUG_VIDEO_SURFACE_SINK QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, bufferPoolLoader, (QGstBufferPoolInterface_iid, QLatin1String("video/bufferpool"), Qt::CaseInsensitive)) QVideoSurfaceGstDelegate::QVideoSurfaceGstDelegate( QAbstractVideoSurface *surface) : m_surface(surface) , m_pool(0) , m_renderReturn(GST_FLOW_ERROR) , m_lastPrerolledBuffer(0) , m_bytesPerLine(0) , m_startCanceled(false) { if (m_surface) { foreach (QObject *instance, bufferPoolLoader()->instances(QGstBufferPoolPluginKey)) { QGstBufferPoolInterface* plugin = qobject_cast(instance); if (plugin) { m_pools.append(plugin); } } #if defined(HAVE_XVIDEO) // && !GST_CHECK_VERSION(1,0,0) m_pools.append(new QGstXvImageBufferPool(this)); #endif updateSupportedFormats(); connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(updateSupportedFormats())); } } QVideoSurfaceGstDelegate::~QVideoSurfaceGstDelegate() { setLastPrerolledBuffer(0); } QList QVideoSurfaceGstDelegate::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const { QMutexLocker locker(const_cast(&m_mutex)); if (!m_surface) return QList(); else if (handleType == QAbstractVideoBuffer::NoHandle) return m_supportedPixelFormats; else if (handleType == m_pool->handleType()) return m_supportedPoolPixelFormats; else return m_surface->supportedPixelFormats(handleType); } QVideoSurfaceFormat QVideoSurfaceGstDelegate::surfaceFormat() const { QMutexLocker locker(const_cast(&m_mutex)); return m_format; } bool QVideoSurfaceGstDelegate::start(const QVideoSurfaceFormat &format, int bytesPerLine) { if (!m_surface) return false; QMutexLocker locker(&m_mutex); m_format = format; m_bytesPerLine = bytesPerLine; if (QThread::currentThread() == thread()) { m_started = !m_surface.isNull() ? m_surface->start(m_format) : false; } else { m_started = false; m_startCanceled = false; QMetaObject::invokeMethod(this, "queuedStart", Qt::QueuedConnection); /* Waiting for start() to be invoked in the main thread may block if gstreamer blocks the main thread until this call is finished. This situation is rare and usually caused by setState(Null) while pipeline is being prerolled. The proper solution to this involves controlling gstreamer pipeline from other thread than video surface. Currently start() fails if wait() timed out. */ if (!m_setupCondition.wait(&m_mutex, 1000)) { qWarning() << "Failed to start video surface due to main thread blocked."; m_startCanceled = true; } } m_format = m_surface->surfaceFormat(); return m_started; } void QVideoSurfaceGstDelegate::stop() { if (!m_surface) return; QMutexLocker locker(&m_mutex); if (QThread::currentThread() == thread()) { if (!m_surface.isNull()) m_surface->stop(); } else { QMetaObject::invokeMethod(this, "queuedStop", Qt::QueuedConnection); // Waiting for stop() to be invoked in the main thread may block // if gstreamer blocks the main thread until this call is finished. m_setupCondition.wait(&m_mutex, 500); } m_started = false; } bool QVideoSurfaceGstDelegate::isActive() { QMutexLocker locker(&m_mutex); return !m_surface.isNull() && m_surface->isActive(); } void QVideoSurfaceGstDelegate::clearPoolBuffers() { QMutexLocker locker(&m_poolMutex); if (m_pool) m_pool->clear(); } GstFlowReturn QVideoSurfaceGstDelegate::render(GstBuffer *buffer) { if (!m_surface) { qWarning() << "Rendering video frame to deleted surface, skip."; //return GST_FLOW_NOT_NEGOTIATED; return GST_FLOW_OK; } QMutexLocker locker(&m_mutex); QAbstractVideoBuffer *videoBuffer = 0; if (m_pool) videoBuffer = m_pool->prepareVideoBuffer(buffer, m_bytesPerLine); if (!videoBuffer) videoBuffer = new QGstVideoBuffer(buffer, m_bytesPerLine); m_frame = QVideoFrame( videoBuffer, m_format.frameSize(), m_format.pixelFormat()); QVideoSurfaceGstSink::setFrameTimeStamps(&m_frame, buffer); m_renderReturn = GST_FLOW_OK; if (QThread::currentThread() == thread()) { if (!m_surface.isNull()) m_surface->present(m_frame); else qWarning() << "m_surface.isNull()."; } else { QMetaObject::invokeMethod(this, "queuedRender", Qt::QueuedConnection); m_renderCondition.wait(&m_mutex, 300); } m_frame = QVideoFrame(); return m_renderReturn; } void QVideoSurfaceGstDelegate::setLastPrerolledBuffer(GstBuffer *prerolledBuffer) { // discard previously stored buffer if (m_lastPrerolledBuffer) { gst_buffer_unref(m_lastPrerolledBuffer); m_lastPrerolledBuffer = 0; } if (!prerolledBuffer) return; // store a reference to the buffer Q_ASSERT(!m_lastPrerolledBuffer); m_lastPrerolledBuffer = prerolledBuffer; gst_buffer_ref(m_lastPrerolledBuffer); } void QVideoSurfaceGstDelegate::queuedStart() { if (!m_startCanceled) { QMutexLocker locker(&m_mutex); m_started = m_surface->start(m_format); m_setupCondition.wakeAll(); } } void QVideoSurfaceGstDelegate::queuedStop() { QMutexLocker locker(&m_mutex); m_surface->stop(); m_setupCondition.wakeAll(); } void QVideoSurfaceGstDelegate::queuedRender() { QMutexLocker locker(&m_mutex); if (m_surface.isNull()) { qWarning() << "Rendering video frame to deleted surface, skip the frame"; m_renderReturn = GST_FLOW_OK; } else if (m_surface->present(m_frame)) { m_renderReturn = GST_FLOW_OK; } else { switch (m_surface->error()) { case QAbstractVideoSurface::NoError: m_renderReturn = GST_FLOW_OK; break; case QAbstractVideoSurface::StoppedError: //It's likely we are in process of changing video output //and the surface is already stopped, ignore the frame m_renderReturn = GST_FLOW_OK; break; default: qWarning() << "Failed to render video frame:" << m_surface->error(); m_renderReturn = GST_FLOW_OK; break; } } m_renderCondition.wakeAll(); } void QVideoSurfaceGstDelegate::updateSupportedFormats() { QGstBufferPoolInterface *newPool = 0; foreach (QGstBufferPoolInterface *pool, m_pools) { if (!m_surface->supportedPixelFormats(pool->handleType()).isEmpty()) { newPool = pool; break; } } if (newPool != m_pool) { QMutexLocker lock(&m_poolMutex); if (m_pool) m_pool->clear(); m_pool = newPool; } QMutexLocker locker(&m_mutex); m_supportedPixelFormats.clear(); m_supportedPoolPixelFormats.clear(); if (m_surface) { m_supportedPixelFormats = m_surface->supportedPixelFormats(); if (m_pool) m_supportedPoolPixelFormats = m_surface->supportedPixelFormats(m_pool->handleType()); } } #if GST_CHECK_VERSION(1,0,0) struct YuvFormat { QVideoFrame::PixelFormat pixelFormat; GstVideoFormat vfmt; guint32 fourcc; int bitsPerPixel; }; static const YuvFormat qt_yuvColorLookup[] = { { QVideoFrame::Format_YUV420P, GST_VIDEO_FORMAT_I420, GST_MAKE_FOURCC('I','4','2','0'), 8 }, { QVideoFrame::Format_YV12, GST_VIDEO_FORMAT_YV12, GST_MAKE_FOURCC('Y','V','1','2'), 8 }, { QVideoFrame::Format_UYVY, GST_VIDEO_FORMAT_UYVY, GST_MAKE_FOURCC('U','Y','V','Y'), 16 }, { QVideoFrame::Format_YUYV, GST_VIDEO_FORMAT_YUY2, GST_MAKE_FOURCC('Y','U','Y','2'), 16 }, { QVideoFrame::Format_NV12, GST_VIDEO_FORMAT_NV12, GST_MAKE_FOURCC('N','V','1','2'), 8 }, { QVideoFrame::Format_NV21, GST_VIDEO_FORMAT_NV21, GST_MAKE_FOURCC('N','V','2','1'), 8 }, { QVideoFrame::Format_AYUV444, GST_VIDEO_FORMAT_AYUV, GST_MAKE_FOURCC('A','Y','U','V'), 32 }, }; #else struct YuvFormat { QVideoFrame::PixelFormat pixelFormat; guint32 fourcc; int bitsPerPixel; }; static const YuvFormat qt_yuvColorLookup[] = { { QVideoFrame::Format_YUV420P, GST_MAKE_FOURCC('I','4','2','0'), 8 }, { QVideoFrame::Format_YV12, GST_MAKE_FOURCC('Y','V','1','2'), 8 }, { QVideoFrame::Format_UYVY, GST_MAKE_FOURCC('U','Y','V','Y'), 16 }, { QVideoFrame::Format_YUYV, GST_MAKE_FOURCC('Y','U','Y','2'), 16 }, { QVideoFrame::Format_NV12, GST_MAKE_FOURCC('N','V','1','2'), 8 }, { QVideoFrame::Format_NV21, GST_MAKE_FOURCC('N','V','2','1'), 8 }, { QVideoFrame::Format_AYUV444, GST_MAKE_FOURCC('A','Y','U','V'), 32 } }; #endif static int indexOfYuvColor(QVideoFrame::PixelFormat format) { const int count = sizeof(qt_yuvColorLookup) / sizeof(YuvFormat); for (int i = 0; i < count; ++i) if (qt_yuvColorLookup[i].pixelFormat == format) return i; return -1; } #if GST_VERSION_MAJOR >=1 static int indexOfYuvColor(GstVideoFormat vfmt) #else static int indexOfYuvColor(guint32 fourcc) #endif { const int count = sizeof(qt_yuvColorLookup) / sizeof(YuvFormat); for (int i = 0; i < count; ++i) #if GST_VERSION_MAJOR >=1 if (qt_yuvColorLookup[i].vfmt == vfmt) #else if (qt_yuvColorLookup[i].fourcc == fourcc) #endif return i; return -1; } struct RgbFormat { QVideoFrame::PixelFormat pixelFormat; int bitsPerPixel; int depth; int endianness; int red; int green; int blue; int alpha; }; static const RgbFormat qt_rgbColorLookup[] = { { QVideoFrame::Format_RGB32 , 32, 24, 4321, 0x0000FF00, 0x00FF0000, int(0xFF000000), 0x00000000 }, { QVideoFrame::Format_RGB32 , 32, 24, 1234, 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, { QVideoFrame::Format_BGR32 , 32, 24, 4321, int(0xFF000000), 0x00FF0000, 0x0000FF00, 0x00000000 }, { QVideoFrame::Format_BGR32 , 32, 24, 1234, 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 }, { QVideoFrame::Format_ARGB32, 32, 24, 4321, 0x0000FF00, 0x00FF0000, int(0xFF000000), 0x000000FF }, { QVideoFrame::Format_ARGB32, 32, 24, 1234, 0x00FF0000, 0x0000FF00, 0x000000FF, int(0xFF000000) }, { QVideoFrame::Format_RGB24 , 24, 24, 4321, 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, { QVideoFrame::Format_BGR24 , 24, 24, 4321, 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 }, { QVideoFrame::Format_RGB565, 16, 16, 1234, 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 } }; static int indexOfRgbColor( int bits, int depth, int endianness, int red, int green, int blue, int alpha) { const int count = sizeof(qt_rgbColorLookup) / sizeof(RgbFormat); for (int i = 0; i < count; ++i) { if (qt_rgbColorLookup[i].bitsPerPixel == bits && qt_rgbColorLookup[i].depth == depth && qt_rgbColorLookup[i].endianness == endianness && qt_rgbColorLookup[i].red == red && qt_rgbColorLookup[i].green == green && qt_rgbColorLookup[i].blue == blue && qt_rgbColorLookup[i].alpha == alpha) { return i; } } return -1; } static GstVideoSinkClass *sink_parent_class; #define VO_SINK(s) QVideoSurfaceGstSink *sink(reinterpret_cast(s)) QVideoSurfaceGstSink *QVideoSurfaceGstSink::createSink(QAbstractVideoSurface *surface) { QVideoSurfaceGstSink *sink = reinterpret_cast( g_object_new(QVideoSurfaceGstSink::get_type(), 0)); sink->delegate = new QVideoSurfaceGstDelegate(surface); g_signal_connect(G_OBJECT(sink), "notify::show-preroll-frame", G_CALLBACK(handleShowPrerollChange), sink); return sink; } GType QVideoSurfaceGstSink::get_type() { static GType type = 0; if (type == 0) { static const GTypeInfo info = { sizeof(QVideoSurfaceGstSinkClass), // class_size base_init, // base_init NULL, // base_finalize class_init, // class_init NULL, // class_finalize NULL, // class_data sizeof(QVideoSurfaceGstSink), // instance_size 0, // n_preallocs instance_init, // instance_init 0 // value_table }; type = g_type_register_static( GST_TYPE_VIDEO_SINK, "QVideoSurfaceGstSink", &info, GTypeFlags(0)); } return type; } void QVideoSurfaceGstSink::class_init(gpointer g_class, gpointer class_data) { Q_UNUSED(class_data); sink_parent_class = reinterpret_cast(g_type_class_peek_parent(g_class)); GstBaseSinkClass *base_sink_class = reinterpret_cast(g_class); base_sink_class->get_caps = QVideoSurfaceGstSink::get_caps; base_sink_class->set_caps = QVideoSurfaceGstSink::set_caps; // FIXME: #if GST_CHECK_VERSION(1,0,0) #else base_sink_class->buffer_alloc = QVideoSurfaceGstSink::buffer_alloc; #endif base_sink_class->start = QVideoSurfaceGstSink::start; base_sink_class->stop = QVideoSurfaceGstSink::stop; // base_sink_class->unlock = QVideoSurfaceGstSink::unlock; // Not implemented. base_sink_class->event = QVideoSurfaceGstSink::event; base_sink_class->preroll = QVideoSurfaceGstSink::preroll; base_sink_class->render = QVideoSurfaceGstSink::render; GstElementClass *element_class = reinterpret_cast(g_class); element_class->change_state = QVideoSurfaceGstSink::change_state; GObjectClass *object_class = reinterpret_cast(g_class); object_class->finalize = QVideoSurfaceGstSink::finalize; } void QVideoSurfaceGstSink::base_init(gpointer g_class) { static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE( "sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS( #if GST_CHECK_VERSION(1,0,0) "video/x-raw, " "format = (string) RGBA," "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]; " "video/x-raw, " "format = (string) I420," "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")); #else "video/x-raw-rgb, " "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]; " "video/x-raw-yuv, " "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]")); #endif gst_element_class_add_pad_template( GST_ELEMENT_CLASS(g_class), gst_static_pad_template_get(&sink_pad_template)); } void QVideoSurfaceGstSink::instance_init(GTypeInstance *instance, gpointer g_class) { VO_SINK(instance); Q_UNUSED(g_class); sink->delegate = 0; sink->lastRequestedCaps = 0; sink->lastBufferCaps = 0; sink->lastSurfaceFormat = new QVideoSurfaceFormat; } void QVideoSurfaceGstSink::finalize(GObject *object) { VO_SINK(object); delete sink->lastSurfaceFormat; sink->lastSurfaceFormat = 0; if (sink->lastBufferCaps) gst_caps_unref(sink->lastBufferCaps); sink->lastBufferCaps = 0; if (sink->lastRequestedCaps) gst_caps_unref(sink->lastRequestedCaps); sink->lastRequestedCaps = 0; delete sink->delegate; // Chain up G_OBJECT_CLASS(sink_parent_class)->finalize(object); } GstStateChangeReturn QVideoSurfaceGstSink::change_state( GstElement *element, GstStateChange transition) { Q_UNUSED(element); return GST_ELEMENT_CLASS(sink_parent_class)->change_state( element, transition); } GstCaps *QVideoSurfaceGstSink::get_caps(GstBaseSink *base #if GST_CHECK_VERSION(1,0,0) , GstCaps* /*filterCaps*/ #endif ) { VO_SINK(base); GstCaps *caps = gst_caps_new_empty(); // Find the supported pixel formats // with buffer pool specific formats listed first QList supportedFormats; QList poolHandleFormats; sink->delegate->poolMutex()->lock(); QGstBufferPoolInterface *pool = sink->delegate->pool(); if (pool) poolHandleFormats = sink->delegate->supportedPixelFormats(pool->handleType()); sink->delegate->poolMutex()->unlock(); supportedFormats = poolHandleFormats; foreach (QVideoFrame::PixelFormat format, sink->delegate->supportedPixelFormats()) { if (!poolHandleFormats.contains(format)) supportedFormats.append(format); } foreach (QVideoFrame::PixelFormat format, supportedFormats) { int index = indexOfYuvColor(format); if (index != -1) { gst_caps_append_structure(caps, gst_structure_new( #if GST_CHECK_VERSION(1,0,0) "video/x-raw", #else "video/x-raw-yuv", #endif "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, INT_MAX, 1, "width" , GST_TYPE_INT_RANGE, 1, INT_MAX, "height" , GST_TYPE_INT_RANGE, 1, INT_MAX, #if GST_CHECK_VERSION(1,0,0) "format" , G_TYPE_STRING, gst_video_format_to_string(qt_yuvColorLookup[index].vfmt), #else "format" , G_TYPE_STRING, qt_yuvColorLookup[index].fourcc, #endif NULL)); continue; } const int count = sizeof(qt_rgbColorLookup) / sizeof(RgbFormat); for (int i = 0; i < count; ++i) { if (qt_rgbColorLookup[i].pixelFormat == format) { GstStructure *structure = gst_structure_new( #if GST_CHECK_VERSION(1,0,0) "video/x-raw", "format" , G_TYPE_STRING, gst_video_format_to_string(gst_video_format_from_masks(qt_rgbColorLookup[i].depth, qt_rgbColorLookup[i].bitsPerPixel, qt_rgbColorLookup[i].endianness, qt_rgbColorLookup[i].red, qt_rgbColorLookup[i].green, qt_rgbColorLookup[i].blue, qt_rgbColorLookup[i].alpha)), #else "video/x-raw-rgb", #endif "framerate" , GST_TYPE_FRACTION_RANGE, 0, 1, INT_MAX, 1, "width" , GST_TYPE_INT_RANGE, 1, INT_MAX, "height" , GST_TYPE_INT_RANGE, 1, INT_MAX, "bpp" , G_TYPE_INT, qt_rgbColorLookup[i].bitsPerPixel, "depth" , G_TYPE_INT, qt_rgbColorLookup[i].depth, "endianness", G_TYPE_INT, qt_rgbColorLookup[i].endianness, "red_mask" , G_TYPE_INT, qt_rgbColorLookup[i].red, "green_mask", G_TYPE_INT, qt_rgbColorLookup[i].green, "blue_mask" , G_TYPE_INT, qt_rgbColorLookup[i].blue, NULL); if (qt_rgbColorLookup[i].alpha != 0) { gst_structure_set( structure, "alpha_mask", G_TYPE_INT, qt_rgbColorLookup[i].alpha, NULL); } gst_caps_append_structure(caps, structure); } } } // printf("get Caps %"GST_PTR_FORMAT"\n", caps); return caps; } gboolean QVideoSurfaceGstSink::set_caps(GstBaseSink *base, GstCaps *caps) { VO_SINK(base); #ifdef DEBUG_VIDEO_SURFACE_SINK qDebug() << "set_caps:"; qDebug() << gst_caps_to_string(caps); #endif if (!caps) { sink->delegate->stop(); return TRUE; } else { int bytesPerLine = 0; QGstBufferPoolInterface *pool = sink->delegate->pool(); QAbstractVideoBuffer::HandleType handleType = pool ? pool->handleType() : QAbstractVideoBuffer::NoHandle; QVideoSurfaceFormat format = formatForCaps(caps, &bytesPerLine, handleType); if (sink->delegate->isActive()) { QVideoSurfaceFormat surfaceFormst = sink->delegate->surfaceFormat(); if (format.pixelFormat() == surfaceFormst.pixelFormat() && format.frameSize() == surfaceFormst.frameSize()) return TRUE; else sink->delegate->stop(); } if (sink->lastRequestedCaps) gst_caps_unref(sink->lastRequestedCaps); sink->lastRequestedCaps = 0; #ifdef DEBUG_VIDEO_SURFACE_SINK qDebug() << "Starting video surface, format:"; qDebug() << format; qDebug() << "bytesPerLine:" << bytesPerLine; #endif if (sink->delegate->start(format, bytesPerLine)) return TRUE; else qWarning() << "Failed to start video surface"; } return FALSE; } QVideoSurfaceFormat QVideoSurfaceGstSink::formatForCaps(GstCaps *caps, int *bytesPerLine, QAbstractVideoBuffer::HandleType handleType) { const GstStructure *structure = gst_caps_get_structure(caps, 0); QVideoFrame::PixelFormat pixelFormat = QVideoFrame::Format_Invalid; int bitsPerPixel = 0; QSize size; gst_structure_get_int(structure, "width", &size.rwidth()); gst_structure_get_int(structure, "height", &size.rheight()); #if GST_CHECK_VERSION(1, 0, 0) GstVideoInfo info; gst_video_info_from_caps(&info, caps); if (info.finfo->format == GST_VIDEO_FORMAT_I420) { int index = indexOfYuvColor(GST_VIDEO_FORMAT_I420); if (index != -1) { pixelFormat = qt_yuvColorLookup[index].pixelFormat; bitsPerPixel = qt_yuvColorLookup[index].bitsPerPixel; } } else if (info.finfo->format == GST_VIDEO_FORMAT_RGBx) { int depth = 0; int endianness = 0; int red = 0; int green = 0; int blue = 0; int alpha = 0; gst_structure_get_int(structure, "bpp", &bitsPerPixel); gst_structure_get_int(structure, "depth", &depth); gst_structure_get_int(structure, "endianness", &endianness); gst_structure_get_int(structure, "red_mask", &red); gst_structure_get_int(structure, "green_mask", &green); gst_structure_get_int(structure, "blue_mask", &blue); gst_structure_get_int(structure, "alpha_mask", &alpha); int index = indexOfRgbColor(bitsPerPixel, depth, endianness, red, green, blue, alpha); printf("INDEX %x\n", index); if (index != -1) pixelFormat = qt_rgbColorLookup[index].pixelFormat; } #else if (qstrcmp(gst_structure_get_name(structure), "video/x-raw-yuv") == 0) { guint32 fourcc = 0; #if GST_CHECK_VERSION(1, 0, 0) int index = indexOfYuvColor(gst_video_format_from_string(gst_structure_get_string(structure, "format"))); #else gst_structure_get_fourcc(structure, "format", &fourcc); int index = indexOfYuvColor(fourcc); #endif if (index != -1) { pixelFormat = qt_yuvColorLookup[index].pixelFormat; bitsPerPixel = qt_yuvColorLookup[index].bitsPerPixel; } } else if (qstrcmp(gst_structure_get_name(structure), "video/x-raw-rgb") == 0) { int depth = 0; int endianness = 0; int red = 0; int green = 0; int blue = 0; int alpha = 0; gst_structure_get_int(structure, "bpp", &bitsPerPixel); gst_structure_get_int(structure, "depth", &depth); gst_structure_get_int(structure, "endianness", &endianness); gst_structure_get_int(structure, "red_mask", &red); gst_structure_get_int(structure, "green_mask", &green); gst_structure_get_int(structure, "blue_mask", &blue); gst_structure_get_int(structure, "alpha_mask", &alpha); int index = indexOfRgbColor(bitsPerPixel, depth, endianness, red, green, blue, alpha); if (index != -1) pixelFormat = qt_rgbColorLookup[index].pixelFormat; } #endif if (pixelFormat != QVideoFrame::Format_Invalid) { QVideoSurfaceFormat format(size, pixelFormat, handleType); QPair rate; gst_structure_get_fraction(structure, "framerate", &rate.first, &rate.second); if (rate.second) format.setFrameRate(qreal(rate.first)/rate.second); gint aspectNum = 0; gint aspectDenum = 0; if (gst_structure_get_fraction( structure, "pixel-aspect-ratio", &aspectNum, &aspectDenum)) { if (aspectDenum > 0) format.setPixelAspectRatio(aspectNum, aspectDenum); } if (bytesPerLine) *bytesPerLine = ((size.width() * bitsPerPixel / 8) + 3) & ~3; return format; } return QVideoSurfaceFormat(); } void QVideoSurfaceGstSink::setFrameTimeStamps(QVideoFrame *frame, GstBuffer *buffer) { qint64 startTime = GST_BUFFER_TIMESTAMP(buffer); if (startTime >= 0) { frame->setStartTime(startTime/G_GINT64_CONSTANT (1000000)); qint64 duration = GST_BUFFER_DURATION(buffer); if (duration >= 0) frame->setEndTime((startTime + duration)/G_GINT64_CONSTANT (1000000)); } } void QVideoSurfaceGstSink::handleShowPrerollChange(GObject *o, GParamSpec *p, gpointer d) { Q_UNUSED(o); Q_UNUSED(p); QVideoSurfaceGstSink *sink = reinterpret_cast(d); gboolean value = true; // "show-preroll-frame" property is true by default g_object_get(G_OBJECT(sink), "show-preroll-frame", &value, NULL); GstBuffer *buffer = sink->delegate->lastPrerolledBuffer(); // Render the stored prerolled buffer if requested. // e.g. player is in stopped mode, then seek operation is requested, // surface now stores a prerolled frame, but doesn't display it until // "show-preroll-frame" property is set to "true" // when switching to pause or playing state. if (value && buffer) { sink->delegate->render(buffer); sink->delegate->setLastPrerolledBuffer(0); } } GstFlowReturn QVideoSurfaceGstSink::buffer_alloc( GstBaseSink *base, guint64 offset, guint size, GstCaps *caps, GstBuffer **buffer) { VO_SINK(base); Q_UNUSED(offset); Q_UNUSED(size); if (!buffer) return GST_FLOW_ERROR; *buffer = NULL; if (!sink->delegate->pool()) return GST_FLOW_OK; QMutexLocker poolLock(sink->delegate->poolMutex()); QGstBufferPoolInterface *pool = sink->delegate->pool(); if (!pool) return GST_FLOW_OK; if (sink->lastRequestedCaps && gst_caps_is_equal(sink->lastRequestedCaps, caps)) { //qDebug() << "reusing last caps"; *buffer = GST_BUFFER(pool->takeBuffer(*sink->lastSurfaceFormat, sink->lastBufferCaps)); return GST_FLOW_OK; } if (sink->delegate->supportedPixelFormats(pool->handleType()).isEmpty()) { //qDebug() << "sink doesn't support native pool buffers, skip buffers allocation"; return GST_FLOW_OK; } poolLock.unlock(); #if GST_CHECK_VERSION(1,0,0) GstCaps *intersection = gst_caps_intersect(get_caps(GST_BASE_SINK(sink), NULL), caps); #else GstCaps *intersection = gst_caps_intersect(get_caps(GST_BASE_SINK(sink)), caps); #endif if (gst_caps_is_empty (intersection)) { gst_caps_unref(intersection); return GST_FLOW_NOT_NEGOTIATED; } if (sink->delegate->isActive()) { //if format was changed, restart the surface QVideoSurfaceFormat format = formatForCaps(intersection); QVideoSurfaceFormat surfaceFormat = sink->delegate->surfaceFormat(); if (format.pixelFormat() != surfaceFormat.pixelFormat() || format.frameSize() != surfaceFormat.frameSize()) { #ifdef DEBUG_VIDEO_SURFACE_SINK qDebug() << "new format requested, restart video surface"; #endif sink->delegate->stop(); } } if (!sink->delegate->isActive()) { int bytesPerLine = 0; QGstBufferPoolInterface *pool = sink->delegate->pool(); QAbstractVideoBuffer::HandleType handleType = pool ? pool->handleType() : QAbstractVideoBuffer::NoHandle; QVideoSurfaceFormat format = formatForCaps(intersection, &bytesPerLine, handleType); if (!sink->delegate->start(format, bytesPerLine)) { qWarning() << "failed to start video surface"; return GST_FLOW_NOT_NEGOTIATED; } } poolLock.relock(); pool = sink->delegate->pool(); QVideoSurfaceFormat surfaceFormat = sink->delegate->surfaceFormat(); if (!pool->isFormatSupported(surfaceFormat)) { qDebug() << "sink doesn't support native pool format, skip custom buffers allocation"; return GST_FLOW_OK; } if (sink->lastRequestedCaps) gst_caps_unref(sink->lastRequestedCaps); sink->lastRequestedCaps = caps; gst_caps_ref(sink->lastRequestedCaps); if (sink->lastBufferCaps) gst_caps_unref(sink->lastBufferCaps); sink->lastBufferCaps = intersection; gst_caps_ref(sink->lastBufferCaps); *sink->lastSurfaceFormat = surfaceFormat; *buffer = GST_BUFFER(pool->takeBuffer(surfaceFormat, intersection)); return GST_FLOW_OK; } gboolean QVideoSurfaceGstSink::start(GstBaseSink *base) { Q_UNUSED(base); return TRUE; } gboolean QVideoSurfaceGstSink::stop(GstBaseSink *base) { VO_SINK(base); sink->delegate->clearPoolBuffers(); return TRUE; } gboolean QVideoSurfaceGstSink::unlock(GstBaseSink *base) { Q_UNUSED(base); return TRUE; } gboolean QVideoSurfaceGstSink::event(GstBaseSink *base, GstEvent *event) { // discard prerolled frame if (event->type == GST_EVENT_FLUSH_START) { VO_SINK(base); sink->delegate->setLastPrerolledBuffer(0); } #if GST_CHECK_VERSION(1, 0, 0) return GST_BASE_SINK_CLASS (sink_parent_class)->event (base, event); #endif } GstFlowReturn QVideoSurfaceGstSink::preroll(GstBaseSink *base, GstBuffer *buffer) { VO_SINK(base); gboolean value = true; // "show-preroll-frame" property is true by default g_object_get(G_OBJECT(base), "show-preroll-frame", &value, NULL); if (value) { sink->delegate->setLastPrerolledBuffer(0); // discard prerolled buffer return sink->delegate->render(buffer); // display frame } // otherwise keep a reference to the buffer to display it later sink->delegate->setLastPrerolledBuffer(buffer); return GST_FLOW_OK; } GstFlowReturn QVideoSurfaceGstSink::render(GstBaseSink *base, GstBuffer *buffer) { VO_SINK(base); sink->delegate->setLastPrerolledBuffer(0); // discard prerolled buffer return sink->delegate->render(buffer); } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/gsttools/qx11videosurface.cpp000066400000000000000000000416331225012771600311510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include "qx11videosurface_p.h" Q_DECLARE_METATYPE(XvImage*); struct XvFormatRgb { QVideoFrame::PixelFormat pixelFormat; int bits_per_pixel; int format; int num_planes; int depth; unsigned int red_mask; unsigned int green_mask; unsigned int blue_mask; }; bool operator ==(const XvImageFormatValues &format, const XvFormatRgb &rgb) { return format.type == XvRGB && format.bits_per_pixel == rgb.bits_per_pixel && format.format == rgb.format && format.num_planes == rgb.num_planes && format.depth == rgb.depth && format.red_mask == rgb.red_mask && format.blue_mask == rgb.blue_mask; } static const XvFormatRgb qt_xvRgbLookup[] = { { QVideoFrame::Format_ARGB32, 32, XvPacked, 1, 32, 0x00FF0000, 0x0000FF00, 0x000000FF }, { QVideoFrame::Format_RGB32 , 32, XvPacked, 1, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { QVideoFrame::Format_RGB24 , 24, XvPacked, 1, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { QVideoFrame::Format_RGB565, 16, XvPacked, 1, 16, 0x0000F800, 0x000007E0, 0x0000001F }, { QVideoFrame::Format_BGRA32, 32, XvPacked, 1, 32, 0xFF000000, 0x00FF0000, 0x0000FF00 }, { QVideoFrame::Format_BGR32 , 32, XvPacked, 1, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { QVideoFrame::Format_BGR24 , 24, XvPacked, 1, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { QVideoFrame::Format_BGR565, 16, XvPacked, 1, 16, 0x0000F800, 0x000007E0, 0x0000001F } }; struct XvFormatYuv { QVideoFrame::PixelFormat pixelFormat; int bits_per_pixel; int format; int num_planes; unsigned int y_sample_bits; unsigned int u_sample_bits; unsigned int v_sample_bits; unsigned int horz_y_period; unsigned int horz_u_period; unsigned int horz_v_period; unsigned int vert_y_period; unsigned int vert_u_period; unsigned int vert_v_period; char component_order[32]; }; bool operator ==(const XvImageFormatValues &format, const XvFormatYuv &yuv) { return format.type == XvYUV && format.bits_per_pixel == yuv.bits_per_pixel && format.format == yuv.format && format.num_planes == yuv.num_planes && format.y_sample_bits == yuv.y_sample_bits && format.u_sample_bits == yuv.u_sample_bits && format.v_sample_bits == yuv.v_sample_bits && format.horz_y_period == yuv.horz_y_period && format.horz_u_period == yuv.horz_u_period && format.horz_v_period == yuv.horz_v_period && format.horz_y_period == yuv.vert_y_period && format.vert_u_period == yuv.vert_u_period && format.vert_v_period == yuv.vert_v_period && qstrncmp(format.component_order, yuv.component_order, 32) == 0; } static const XvFormatYuv qt_xvYuvLookup[] = { { QVideoFrame::Format_YUV444 , 24, XvPacked, 1, 8, 8, 8, 1, 1, 1, 1, 1, 1, "YUV" }, { QVideoFrame::Format_YUV420P, 12, XvPlanar, 3, 8, 8, 8, 1, 2, 2, 1, 2, 2, "YUV" }, { QVideoFrame::Format_YV12 , 12, XvPlanar, 3, 8, 8, 8, 1, 2, 2, 1, 2, 2, "YVU" }, { QVideoFrame::Format_UYVY , 16, XvPacked, 1, 8, 8, 8, 1, 2, 2, 1, 1, 1, "UYVY" }, { QVideoFrame::Format_YUYV , 16, XvPacked, 1, 8, 8, 8, 1, 2, 2, 1, 1, 1, "YUY2" }, { QVideoFrame::Format_YUYV , 16, XvPacked, 1, 8, 8, 8, 1, 2, 2, 1, 1, 1, "YUYV" }, { QVideoFrame::Format_NV12 , 12, XvPlanar, 2, 8, 8, 8, 1, 2, 2, 1, 2, 2, "YUV" }, { QVideoFrame::Format_NV12 , 12, XvPlanar, 2, 8, 8, 8, 1, 2, 2, 1, 2, 2, "YVU" }, { QVideoFrame::Format_Y8 , 8 , XvPlanar, 1, 8, 0, 0, 1, 0, 0, 1, 0, 0, "Y" } }; QX11VideoSurface::QX11VideoSurface(QObject *parent) : QAbstractVideoSurface(parent) , m_winId(0) , m_portId(0) , m_gc(0) , m_image(0) { } QX11VideoSurface::~QX11VideoSurface() { if (m_gc) XFreeGC(display(), m_gc); if (m_portId != 0) XvUngrabPort(display(), m_portId, 0); } WId QX11VideoSurface::winId() const { return m_winId; } void QX11VideoSurface::setWinId(WId id) { //qDebug() << "setWinID:" << id; if (id == m_winId) return; if (m_image) XFree(m_image); if (m_gc) { XFreeGC(display(), m_gc); m_gc = 0; } if (m_portId != 0) XvUngrabPort(display(), m_portId, 0); m_supportedPixelFormats.clear(); m_formatIds.clear(); m_winId = id; if (m_winId && findPort()) { querySupportedFormats(); m_gc = XCreateGC(display(), m_winId, 0, 0); if (m_image) { m_image = 0; if (!start(surfaceFormat())) { QAbstractVideoSurface::stop(); qWarning() << "Failed to start video surface with format" << surfaceFormat(); } } } else { qWarning() << "Failed to find XVideo port"; if (m_image) { m_image = 0; QAbstractVideoSurface::stop(); } } emit supportedFormatsChanged(); } QRect QX11VideoSurface::displayRect() const { return m_displayRect; } void QX11VideoSurface::setDisplayRect(const QRect &rect) { m_displayRect = rect; } QRect QX11VideoSurface::viewport() const { return m_viewport; } void QX11VideoSurface::setViewport(const QRect &rect) { m_viewport = rect; } int QX11VideoSurface::brightness() const { return getAttribute("XV_BRIGHTNESS", m_brightnessRange.first, m_brightnessRange.second); } void QX11VideoSurface::setBrightness(int brightness) { setAttribute("XV_BRIGHTNESS", brightness, m_brightnessRange.first, m_brightnessRange.second); } int QX11VideoSurface::contrast() const { return getAttribute("XV_CONTRAST", m_contrastRange.first, m_contrastRange.second); } void QX11VideoSurface::setContrast(int contrast) { setAttribute("XV_CONTRAST", contrast, m_contrastRange.first, m_contrastRange.second); } int QX11VideoSurface::hue() const { return getAttribute("XV_HUE", m_hueRange.first, m_hueRange.second); } void QX11VideoSurface::setHue(int hue) { setAttribute("XV_HUE", hue, m_hueRange.first, m_hueRange.second); } int QX11VideoSurface::saturation() const { return getAttribute("XV_SATURATION", m_saturationRange.first, m_saturationRange.second); } void QX11VideoSurface::setSaturation(int saturation) { setAttribute("XV_SATURATION", saturation, m_saturationRange.first, m_saturationRange.second); } int QX11VideoSurface::getAttribute(const char *attribute, int minimum, int maximum) const { if (m_portId != 0) { Display *disp = display(); Atom atom = XInternAtom(disp, attribute, True); int value = 0; XvGetPortAttribute(disp, m_portId, atom, &value); return redistribute(value, minimum, maximum, -100, 100); } else { return 0; } } void QX11VideoSurface::setAttribute(const char *attribute, int value, int minimum, int maximum) { if (m_portId != 0) { Display *disp = display(); Atom atom = XInternAtom(disp, attribute, True); XvSetPortAttribute( disp, m_portId, atom, redistribute(value, -100, 100, minimum, maximum)); } } int QX11VideoSurface::redistribute( int value, int fromLower, int fromUpper, int toLower, int toUpper) { return fromUpper != fromLower ? ((value - fromLower) * (toUpper - toLower) / (fromUpper - fromLower)) + toLower : 0; } QList QX11VideoSurface::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { return handleType == QAbstractVideoBuffer::NoHandle || handleType == QAbstractVideoBuffer::XvShmImageHandle ? m_supportedPixelFormats : QList(); } bool QX11VideoSurface::start(const QVideoSurfaceFormat &format) { if (m_image) XFree(m_image); int xvFormatId = 0; for (int i = 0; i < m_supportedPixelFormats.count(); ++i) { if (m_supportedPixelFormats.at(i) == format.pixelFormat()) { xvFormatId = m_formatIds.at(i); break; } } if (xvFormatId == 0) { setError(UnsupportedFormatError); } else { XvImage *image = XvCreateImage( display(), m_portId, xvFormatId, 0, format.frameWidth(), format.frameHeight()); if (!image) { setError(ResourceError); } else { m_viewport = format.viewport(); m_image = image; QVideoSurfaceFormat newFormat = format; newFormat.setProperty("portId", QVariant(quint64(m_portId))); newFormat.setProperty("xvFormatId", xvFormatId); newFormat.setProperty("dataSize", image->data_size); return QAbstractVideoSurface::start(newFormat); } } if (m_image) { m_image = 0; QAbstractVideoSurface::stop(); } return false; } void QX11VideoSurface::stop() { if (m_image) { XFree(m_image); m_image = 0; QAbstractVideoSurface::stop(); } } bool QX11VideoSurface::present(const QVideoFrame &frame) { if (!m_image) { setError(StoppedError); return false; } else if (m_image->width != frame.width() || m_image->height != frame.height()) { setError(IncorrectFormatError); return false; } else { QVideoFrame frameCopy(frame); if (!frameCopy.map(QAbstractVideoBuffer::ReadOnly)) { setError(IncorrectFormatError); return false; } else { bool presented = false; if (frame.handleType() != QAbstractVideoBuffer::XvShmImageHandle && m_image->data_size > frame.mappedBytes()) { qWarning("Insufficient frame buffer size"); setError(IncorrectFormatError); } else if (frame.handleType() != QAbstractVideoBuffer::XvShmImageHandle && m_image->num_planes > 0 && m_image->pitches[0] != frame.bytesPerLine()) { qWarning("Incompatible frame pitches"); setError(IncorrectFormatError); } else { if (frame.handleType() != QAbstractVideoBuffer::XvShmImageHandle) { m_image->data = reinterpret_cast(frameCopy.bits()); //qDebug() << "copy frame"; XvPutImage( display(), m_portId, m_winId, m_gc, m_image, m_viewport.x(), m_viewport.y(), m_viewport.width(), m_viewport.height(), m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height()); m_image->data = 0; } else { XvImage *img = frame.handle().value(); //qDebug() << "render directly"; if (img) XvShmPutImage( display(), m_portId, m_winId, m_gc, img, m_viewport.x(), m_viewport.y(), m_viewport.width(), m_viewport.height(), m_displayRect.x(), m_displayRect.y(), m_displayRect.width(), m_displayRect.height(), false); } presented = true; } frameCopy.unmap(); return presented; } } } Display *QX11VideoSurface::display() const { QWindow *window = QGuiApplication::focusWindow(); Display *display = (Display *)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("Display", window); return display; } bool QX11VideoSurface::findPort() { unsigned int count = 0; XvAdaptorInfo *adaptors = 0; bool portFound = false; if (XvQueryAdaptors(display(), m_winId, &count, &adaptors) == Success) { for (unsigned int i = 0; i < count && !portFound; ++i) { if (adaptors[i].type & XvImageMask) { m_portId = adaptors[i].base_id; for (unsigned int j = 0; j < adaptors[i].num_ports && !portFound; ++j, ++m_portId) portFound = XvGrabPort(display(), m_portId, 0) == Success; } } XvFreeAdaptorInfo(adaptors); } return portFound; } void QX11VideoSurface::querySupportedFormats() { int count = 0; if (XvImageFormatValues *imageFormats = XvListImageFormats( display(), m_portId, &count)) { const int rgbCount = sizeof(qt_xvRgbLookup) / sizeof(XvFormatRgb); const int yuvCount = sizeof(qt_xvYuvLookup) / sizeof(XvFormatYuv); for (int i = 0; i < count; ++i) { switch (imageFormats[i].type) { case XvRGB: for (int j = 0; j < rgbCount; ++j) { if (imageFormats[i] == qt_xvRgbLookup[j]) { m_supportedPixelFormats.append(qt_xvRgbLookup[j].pixelFormat); m_formatIds.append(imageFormats[i].id); break; } } break; case XvYUV: for (int j = 0; j < yuvCount; ++j) { if (imageFormats[i] == qt_xvYuvLookup[j]) { m_supportedPixelFormats.append(qt_xvYuvLookup[j].pixelFormat); m_formatIds.append(imageFormats[i].id); break; } } break; } } XFree(imageFormats); } m_brightnessRange = qMakePair(0, 0); m_contrastRange = qMakePair(0, 0); m_hueRange = qMakePair(0, 0); m_saturationRange = qMakePair(0, 0); if (XvAttribute *attributes = XvQueryPortAttributes(display(), m_portId, &count)) { for (int i = 0; i < count; ++i) { if (qstrcmp(attributes[i].name, "XV_BRIGHTNESS") == 0) m_brightnessRange = qMakePair(attributes[i].min_value, attributes[i].max_value); else if (qstrcmp(attributes[i].name, "XV_CONTRAST") == 0) m_contrastRange = qMakePair(attributes[i].min_value, attributes[i].max_value); else if (qstrcmp(attributes[i].name, "XV_HUE") == 0) m_hueRange = qMakePair(attributes[i].min_value, attributes[i].max_value); else if (qstrcmp(attributes[i].name, "XV_SATURATION") == 0) m_saturationRange = qMakePair(attributes[i].min_value, attributes[i].max_value); } XFree(attributes); } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/000077500000000000000000000000001225012771600250635ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/000077500000000000000000000000001225012771600273525ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/audioengine.cpp000066400000000000000000000067761225012771600323650ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qdeclarative_audioengine_p.h" #include "qdeclarative_soundinstance_p.h" #include "qdeclarative_sound_p.h" #include "qdeclarative_playvariation_p.h" #include "qdeclarative_audiocategory_p.h" #include "qdeclarative_audiolistener_p.h" #include "qdeclarative_audiosample_p.h" #include "qdeclarative_attenuationmodel_p.h" QT_BEGIN_NAMESPACE class QAudioEngineDeclarativeModule : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") public: virtual void registerTypes(const char *uri) { Q_ASSERT(QLatin1String(uri) == QLatin1String("QtAudioEngine")); qmlRegisterType(uri, 1, 0, "AudioEngine"); qmlRegisterType(uri, 1, 0, "AudioSample"); qmlRegisterType(uri, 1, 0, "AudioCategory"); qmlRegisterType(uri, 1, 0, ""); qmlRegisterType(uri, 1, 0, "Sound"); qmlRegisterType(uri, 1, 0, "PlayVariation"); qmlRegisterType(uri, 1, 0, "AudioListener"); qmlRegisterType(uri, 1, 0, "SoundInstance"); qmlRegisterType(uri, 1, 0, "AttenuationModelLinear"); qmlRegisterType(uri, 1, 0, "AttenuationModelInverse"); } }; QT_END_NAMESPACE #include "audioengine.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/audioengine.pro000066400000000000000000000025001225012771600323600ustar00rootroot00000000000000CXX_MODULE = multimedia TARGET = declarative_audioengine TARGETPATH = QtAudioEngine IMPORT_VERSION = 1.0 QT += quick qml multimedia-private win32: LIBS += -lOpenAL32 unix:!mac:!blackberry: LIBS += -lopenal blackberry: LIBS += -lOpenAL mac: LIBS += -framework OpenAL mac: DEFINES += HEADER_OPENAL_PREFIX INCLUDEPATH += ../../multimedia/audio HEADERS += \ qdeclarative_attenuationmodel_p.h \ qdeclarative_audioengine_p.h \ qdeclarative_soundinstance_p.h \ qdeclarative_audiocategory_p.h \ qdeclarative_audiolistener_p.h \ qdeclarative_playvariation_p.h \ qdeclarative_audiosample_p.h \ qdeclarative_sound_p.h \ qsoundinstance_p.h \ qaudioengine_p.h \ qsoundsource_p.h \ qsoundbuffer_p.h \ qaudioengine_openal_p.h SOURCES += \ audioengine.cpp \ qdeclarative_attenuationmodel_p.cpp \ qdeclarative_audioengine_p.cpp \ qdeclarative_soundinstance_p.cpp \ qdeclarative_audiocategory_p.cpp \ qdeclarative_audiolistener_p.cpp \ qdeclarative_playvariation_p.cpp \ qdeclarative_audiosample_p.cpp \ qdeclarative_sound_p.cpp \ qsoundinstance_p.cpp \ qaudioengine_p.cpp \ qsoundsource_openal_p.cpp \ qaudioengine_openal_p.cpp load(qml_plugin) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/plugins.qmltypes000066400000000000000000000222261225012771600326370ustar00rootroot00000000000000import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // // This file was auto-generated with the command 'qmlplugindump -notrelocatable QtAudioEngine 1.0'. Module { Component { name: "QDeclarativeAttenuationModel" prototype: "QObject" Property { name: "name"; type: "string" } } Component { name: "QDeclarativeAttenuationModelInverse" prototype: "QDeclarativeAttenuationModel" exports: ["QtAudioEngine/AttenuationModelInverse 1.0"] exportMetaObjectRevisions: [0] Property { name: "start"; type: "double" } Property { name: "end"; type: "double" } Property { name: "rolloff"; type: "double" } } Component { name: "QDeclarativeAttenuationModelLinear" prototype: "QDeclarativeAttenuationModel" exports: ["QtAudioEngine/AttenuationModelLinear 1.0"] exportMetaObjectRevisions: [0] Property { name: "start"; type: "double" } Property { name: "end"; type: "double" } } Component { name: "QDeclarativeAudioCategory" prototype: "QObject" exports: ["QtAudioEngine/AudioCategory 1.0"] exportMetaObjectRevisions: [0] Property { name: "volume"; type: "double" } Property { name: "name"; type: "string" } Signal { name: "volumeChanged" Parameter { name: "newVolume"; type: "double" } } Signal { name: "stopped" } Signal { name: "paused" } Signal { name: "resumed" } Method { name: "stop" } Method { name: "pause" } Method { name: "resume" } } Component { name: "QDeclarativeAudioEngine" defaultProperty: "bank" prototype: "QObject" exports: ["QtAudioEngine/AudioEngine 1.0"] exportMetaObjectRevisions: [0] Property { name: "bank"; type: "QObject"; isList: true; isReadonly: true } Property { name: "categories"; type: "QObject"; isReadonly: true; isPointer: true } Property { name: "samples"; type: "QObject"; isReadonly: true; isPointer: true } Property { name: "sounds"; type: "QObject"; isReadonly: true; isPointer: true } Property { name: "loading"; type: "bool"; isReadonly: true } Property { name: "liveInstances"; type: "int"; isReadonly: true } Property { name: "listener" type: "QDeclarativeAudioListener" isReadonly: true isPointer: true } Property { name: "dopplerFactor"; type: "double" } Property { name: "speedOfSound"; type: "double" } Signal { name: "ready" } Signal { name: "liveInstanceCountChanged" } Signal { name: "isLoadingChanged" } Signal { name: "finishedLoading" } } Component { name: "QDeclarativeAudioListener" prototype: "QObject" exports: ["QtAudioEngine/AudioListener 1.0"] exportMetaObjectRevisions: [0] Property { name: "engine"; type: "QDeclarativeAudioEngine"; isPointer: true } Property { name: "position"; type: "QVector3D" } Property { name: "direction"; type: "QVector3D" } Property { name: "velocity"; type: "QVector3D" } Property { name: "up"; type: "QVector3D" } Property { name: "gain"; type: "double" } } Component { name: "QDeclarativeAudioSample" prototype: "QObject" exports: ["QtAudioEngine/AudioSample 1.0"] exportMetaObjectRevisions: [0] Property { name: "name"; type: "string" } Property { name: "source"; type: "QUrl" } Property { name: "preloaded"; type: "bool" } Property { name: "streaming"; type: "bool" } Property { name: "loaded"; type: "bool"; isReadonly: true } Method { name: "load" } } Component { name: "QDeclarativePlayVariation" prototype: "QObject" exports: ["QtAudioEngine/PlayVariation 1.0"] exportMetaObjectRevisions: [0] Property { name: "sample"; type: "string" } Property { name: "looping"; type: "bool" } Property { name: "maxGain"; type: "double" } Property { name: "minGain"; type: "double" } Property { name: "maxPitch"; type: "double" } Property { name: "minPitch"; type: "double" } } Component { name: "QDeclarativeSound" defaultProperty: "playVariationlist" prototype: "QObject" exports: ["QtAudioEngine/Sound 1.0"] exportMetaObjectRevisions: [0] Enum { name: "PlayType" values: { "Random": 0, "Sequential": 1 } } Property { name: "name"; type: "string" } Property { name: "playType"; type: "PlayType" } Property { name: "category"; type: "string" } Property { name: "cone"; type: "QDeclarativeSoundCone"; isReadonly: true; isPointer: true } Property { name: "attenuationModel"; type: "string" } Property { name: "playVariationlist" type: "QDeclarativePlayVariation" isList: true isReadonly: true } Method { name: "play" } Method { name: "play" Parameter { name: "gain"; type: "double" } } Method { name: "play" Parameter { name: "gain"; type: "double" } Parameter { name: "pitch"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } Parameter { name: "direction"; type: "QVector3D" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } Parameter { name: "direction"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } Parameter { name: "pitch"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } Parameter { name: "pitch"; type: "double" } } Method { name: "play" Parameter { name: "position"; type: "QVector3D" } Parameter { name: "velocity"; type: "QVector3D" } Parameter { name: "direction"; type: "QVector3D" } Parameter { name: "gain"; type: "double" } Parameter { name: "pitch"; type: "double" } } Method { name: "newInstance"; type: "QDeclarativeSoundInstance*" } } Component { name: "QDeclarativeSoundCone" prototype: "QObject" Property { name: "innerAngle"; type: "double" } Property { name: "outerAngle"; type: "double" } Property { name: "outerGain"; type: "double" } } Component { name: "QDeclarativeSoundInstance" prototype: "QObject" exports: ["QtAudioEngine/SoundInstance 1.0"] exportMetaObjectRevisions: [0] Enum { name: "State" values: { "StoppedState": 0, "PlayingState": 1, "PausedState": 2 } } Property { name: "engine"; type: "QDeclarativeAudioEngine"; isPointer: true } Property { name: "sound"; type: "string" } Property { name: "state"; type: "State"; isReadonly: true } Property { name: "position"; type: "QVector3D" } Property { name: "direction"; type: "QVector3D" } Property { name: "velocity"; type: "QVector3D" } Property { name: "gain"; type: "double" } Property { name: "pitch"; type: "double" } Method { name: "play" } Method { name: "stop" } Method { name: "pause" } Method { name: "updatePosition" Parameter { name: "deltaTime"; type: "double" } } } Component { name: "QQmlPropertyMap" prototype: "QObject" Signal { name: "valueChanged" Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } Method { name: "keys"; type: "QStringList" } } } qaudioengine_openal_p.cpp000066400000000000000000000314321225012771600343270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include "qsamplecache_p.h" #include "qaudioengine_openal_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE class StaticSoundBufferAL : public QSoundBufferPrivateAL { Q_OBJECT public: StaticSoundBufferAL(QObject *parent, const QUrl& url, QSampleCache *sampleLoader) : QSoundBufferPrivateAL(parent) , m_ref(1) , m_url(url) , m_alBuffer(0) , m_isReady(false) , m_sample(0) , m_sampleLoader(sampleLoader) { #ifdef DEBUG_AUDIOENGINE qDebug() << "creating new StaticSoundBufferOpenAL"; #endif } void load() { if (m_sample) return; m_sample = m_sampleLoader->requestSample(m_url); connect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); connect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); switch (m_sample->state()) { case QSample::Ready: sampleReady(); break; case QSample::Error: decoderError(); break; default: break; } } ~StaticSoundBufferAL() { if (m_sample) m_sample->release(); alDeleteBuffers(1, &m_alBuffer); } void bindToSource(ALuint alSource) { Q_ASSERT(m_alBuffer != 0); alSourcei(alSource, AL_BUFFER, m_alBuffer); } void unbindFromSource(ALuint alSource) { alSourcei(alSource, AL_BUFFER, 0); } //called in application bool isReady() const { return m_isReady; } long addRef() { return ++m_ref; } long release() { return --m_ref; } long refCount() const { return m_ref; } public Q_SLOTS: void sampleReady() { #ifdef DEBUG_AUDIOENGINE qDebug() << "StaticSoundBufferOpenAL:sample[" << m_url << "] loaded"; #endif disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); disconnect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); if (m_sample->data().size() > 1024 * 1024 * 4) { qWarning() << "source [" << m_url << "] size too large!"; decoderError(); return; } if (m_sample->format().channelCount() > 2) { qWarning() << "source [" << m_url << "] channel > 2!"; decoderError(); return; } ALenum alFormat = 0; if (m_sample->format().sampleSize() == 8) { alFormat = m_sample->format().channelCount() == 1 ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8; } else if (m_sample->format().sampleSize() == 16) { alFormat = m_sample->format().channelCount() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; } else { qWarning() << "source [" << m_url << "] invalid sample size:" << m_sample->format().sampleSize() << "(should be 8 or 16)"; decoderError(); return; } alGenBuffers(1, &m_alBuffer); if (!QAudioEnginePrivate::checkNoError("create buffer")) { return; } alBufferData(m_alBuffer, alFormat, m_sample->data().data(), m_sample->data().size(), m_sample->format().sampleRate()); if (!QAudioEnginePrivate::checkNoError("fill buffer")) { return; } m_isReady = true; emit ready(); m_sample->release(); m_sample = 0; } void decoderError() { qWarning() << "loading [" << m_url << "] failed"; disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); emit error(); } private: long m_ref; QUrl m_url; ALuint m_alBuffer; bool m_isReady; QSample *m_sample; QSampleCache *m_sampleLoader; }; QSoundBufferPrivateAL::QSoundBufferPrivateAL(QObject *parent) : QSoundBuffer(parent) { } ///////////////////////////////////////////////////////////////// QAudioEnginePrivate::QAudioEnginePrivate(QObject *parent) : QObject(parent) { m_updateTimer.setInterval(200); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateSoundSources())); m_sampleLoader = new QSampleCache(this); m_sampleLoader->setCapacity(0); connect(m_sampleLoader, SIGNAL(isLoadingChanged()), this, SIGNAL(isLoadingChanged())); #ifdef DEBUG_AUDIOENGINE qDebug() << "default openal device = " << alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); const ALCchar* devNames = alcGetString(NULL, ALC_DEVICE_SPECIFIER); int cc = 0; qDebug() << "device list:"; while (true) { qDebug() << " " << devNames + cc; while (devNames[cc] != 0) ++cc; ++cc; if (devNames[cc] == 0) break; } #endif ALCdevice *device = alcOpenDevice(0); if (!device) { qWarning() << "Can not create openal device!"; return; } ALCcontext* context = alcCreateContext(device, 0); if (!context) { qWarning() << "Can not create openal context!"; return; } alcMakeContextCurrent(context); alDistanceModel(AL_NONE); alDopplerFactor(0); } QAudioEnginePrivate::~QAudioEnginePrivate() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QAudioEnginePrivate::dtor"; #endif delete m_sampleLoader; QObjectList children = this->children(); foreach (QObject *child, children) { QSoundSourcePrivate* s = qobject_cast(child); if (!s) continue; s->release(); } foreach (QSoundBufferPrivateAL *buffer, m_staticBufferPool) { delete buffer; } m_staticBufferPool.clear(); ALCcontext* context = alcGetCurrentContext(); ALCdevice *device = alcGetContextsDevice(context); alcDestroyContext(context); alcCloseDevice(device); #ifdef DEBUG_AUDIOENGINE qDebug() << "QAudioEnginePrivate::dtor: all done"; #endif } bool QAudioEnginePrivate::isLoading() const { return m_sampleLoader->isLoading(); } QSoundSource* QAudioEnginePrivate::createSoundSource() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QAudioEnginePrivate::createSoundSource()"; #endif QSoundSourcePrivate *instance = NULL; if (m_instancePool.count() == 0) { instance = new QSoundSourcePrivate(this); } else { instance = m_instancePool.front(); m_instancePool.pop_front(); } connect(instance, SIGNAL(activate(QObject*)), this, SLOT(soundSourceActivate(QObject*))); return instance; } void QAudioEnginePrivate::releaseSoundSource(QSoundSource *soundInstance) { QSoundSourcePrivate *privInstance = static_cast(soundInstance); #ifdef DEBUG_AUDIOENGINE qDebug() << "recycle soundInstance" << privInstance; #endif privInstance->unbindBuffer(); m_instancePool.push_front(privInstance); m_activeInstances.removeOne(privInstance); } QSoundBuffer* QAudioEnginePrivate::getStaticSoundBuffer(const QUrl& url) { StaticSoundBufferAL *staticBuffer = NULL; QMap::iterator it = m_staticBufferPool.find(url); if (it == m_staticBufferPool.end()) { staticBuffer = new StaticSoundBufferAL(this, url, m_sampleLoader); m_staticBufferPool.insert(url, staticBuffer); } else { staticBuffer = static_cast(*it); staticBuffer->addRef(); } return staticBuffer; } void QAudioEnginePrivate::releaseSoundBuffer(QSoundBuffer *buffer) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QAudioEnginePrivate: recycle sound buffer"; #endif if (buffer->inherits("StaticSoundBufferAL")) { StaticSoundBufferAL *staticBuffer = static_cast(buffer); //decrement the reference count, still kept in memory for reuse staticBuffer->release(); //TODO implement some resource recycle strategy } else { //TODO Q_ASSERT(0); qWarning() << "Unknown soundbuffer type for recycle" << buffer; } } bool QAudioEnginePrivate::checkNoError(const char *msg) { ALenum error = alGetError(); if (error != AL_NO_ERROR) { qWarning() << "Failed on" << msg << "[OpenAL error code =" << error << "]"; return false; } return true; } QVector3D QAudioEnginePrivate::listenerPosition() const { ALfloat x, y, z; alGetListener3f(AL_POSITION, &x, &y, &z); checkNoError("get listener position"); return QVector3D(x, y, z); } QVector3D QAudioEnginePrivate::listenerVelocity() const { ALfloat x, y, z; alGetListener3f(AL_VELOCITY, &x, &y, &z); checkNoError("get listener velocity"); return QVector3D(x, y, z); } qreal QAudioEnginePrivate::listenerGain() const { ALfloat gain; alGetListenerf(AL_GAIN, &gain); checkNoError("get listener gain"); return gain; } void QAudioEnginePrivate::setListenerPosition(const QVector3D& position) { alListener3f(AL_POSITION, position.x(), position.y(), position.z()); checkNoError("set listener position"); } void QAudioEnginePrivate::setListenerOrientation(const QVector3D& direction, const QVector3D& up) { ALfloat orientation[6]; orientation[0] = direction.x(); orientation[1] = direction.y(); orientation[2] = direction.z(); orientation[3] = up.x(); orientation[4] = up.y(); orientation[5] = up.z(); alListenerfv(AL_ORIENTATION, orientation); checkNoError("set listener orientation"); } void QAudioEnginePrivate::setListenerVelocity(const QVector3D& velocity) { alListener3f(AL_VELOCITY, velocity.x(), velocity.y(), velocity.z()); checkNoError("set listener velocity"); } void QAudioEnginePrivate::setListenerGain(qreal gain) { alListenerf(AL_GAIN, gain); checkNoError("set listener gain"); } void QAudioEnginePrivate::setDopplerFactor(qreal dopplerFactor) { alDopplerFactor(dopplerFactor); } void QAudioEnginePrivate::setSpeedOfSound(qreal speedOfSound) { alSpeedOfSound(speedOfSound); } void QAudioEnginePrivate::soundSourceActivate(QObject *soundSource) { QSoundSourcePrivate *ss = qobject_cast(soundSource); ss->checkState(); if (ss->isLooping()) return; if (!m_activeInstances.contains(ss)) m_activeInstances.push_back(ss); if (!m_updateTimer.isActive()) m_updateTimer.start(); } void QAudioEnginePrivate::updateSoundSources() { for (QList::Iterator it = m_activeInstances.begin(); it != m_activeInstances.end();) { QSoundSourcePrivate *instance = *it; instance->checkState(); if (instance->state() == QSoundSource::StoppedState) { it = m_activeInstances.erase(it); } else { ++it; } } if (m_activeInstances.count() == 0) { m_updateTimer.stop(); } } #include "qaudioengine_openal_p.moc" //#include "moc_qaudioengine_openal_p.cpp" qaudioengine_openal_p.h000066400000000000000000000116561225012771600340020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOENGINE_OPENAL_P_H #define QAUDIOENGINE_OPENAL_P_H #include #include #include #include #if defined(HEADER_OPENAL_PREFIX) #include #include #else #include #include #endif #include "qsoundsource_p.h" #include "qsoundbuffer_p.h" QT_BEGIN_NAMESPACE class QSoundBufferPrivateAL : public QSoundBuffer { Q_OBJECT public: QSoundBufferPrivateAL(QObject* parent); virtual void bindToSource(ALuint alSource) = 0; virtual void unbindFromSource(ALuint alSource) = 0; }; class QSoundSourcePrivate : public QSoundSource { Q_OBJECT public: QSoundSourcePrivate(QObject *parent); ~QSoundSourcePrivate(); void play(); void pause(); void stop(); QSoundSource::State state() const; bool isLooping() const; void setLooping(bool looping); void setPosition(const QVector3D& position); void setDirection(const QVector3D& direction); void setVelocity(const QVector3D& velocity); QVector3D velocity() const; QVector3D position() const; QVector3D direction() const; void setGain(qreal gain); void setPitch(qreal pitch); void setCone(qreal innerAngle, qreal outerAngle, qreal outerGain); void bindBuffer(QSoundBuffer*); void unbindBuffer(); void checkState(); void release(); Q_SIGNALS: void activate(QObject*); private: void sourcePlay(); void sourcePause(); ALuint m_alSource; QSoundBufferPrivateAL *m_bindBuffer; bool m_isReady; //true if the sound source is already bound to some sound buffer QSoundSource::State m_state; qreal m_gain; qreal m_pitch; qreal m_coneInnerAngle; qreal m_coneOuterAngle; qreal m_coneOuterGain; }; class QSampleCache; class QAudioEnginePrivate : public QObject { Q_OBJECT public: QAudioEnginePrivate(QObject *parent); ~QAudioEnginePrivate(); bool isLoading() const; QSoundSource* createSoundSource(); void releaseSoundSource(QSoundSource *soundInstance); QSoundBuffer* getStaticSoundBuffer(const QUrl& url); void releaseSoundBuffer(QSoundBuffer *buffer); QVector3D listenerPosition() const; QVector3D listenerVelocity() const; qreal listenerGain() const; void setListenerPosition(const QVector3D& position); void setListenerVelocity(const QVector3D& velocity); void setListenerOrientation(const QVector3D& direction, const QVector3D& up); void setListenerGain(qreal gain); void setDopplerFactor(qreal dopplerFactor); void setSpeedOfSound(qreal speedOfSound); static bool checkNoError(const char *msg); Q_SIGNALS: void isLoadingChanged(); private Q_SLOTS: void updateSoundSources(); void soundSourceActivate(QObject *soundSource); private: QList m_activeInstances; QList m_instancePool; QMap m_staticBufferPool; QSampleCache *m_sampleLoader; QTimer m_updateTimer; }; QT_END_NAMESPACE #endif qaudioengine_p.cpp000066400000000000000000000117131225012771600327710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudioengine_p.h" #include "qsoundsource_p.h" #include "qdebug.h" #include "qaudioengine_openal_p.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE QSoundSource::QSoundSource(QObject *parent) : QObject(parent) { } QSoundBuffer::QSoundBuffer(QObject *parent) : QObject(parent) { } QAudioEngine* QAudioEngine::create(QObject *parent) { return new QAudioEngine(parent); } QAudioEngine::QAudioEngine(QObject *parent) : QObject(parent) , m_listenerUp(0, 0, 1) , m_listenerDirection(0, 1, 0) { d = new QAudioEnginePrivate(this); connect(d, SIGNAL(isLoadingChanged()), this, SIGNAL(isLoadingChanged())); setDopplerFactor(1); setSpeedOfSound(qreal(343.33)); updateListenerOrientation(); } QAudioEngine::~QAudioEngine() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QAudioEngine::dtor"; #endif } QSoundBuffer* QAudioEngine::getStaticSoundBuffer(const QUrl& url) { return d->getStaticSoundBuffer(url); } void QAudioEngine::releaseSoundBuffer(QSoundBuffer *buffer) { d->releaseSoundBuffer(buffer); } QSoundSource* QAudioEngine::createSoundSource() { return d->createSoundSource(); } void QAudioEngine::releaseSoundSource(QSoundSource *soundInstance) { d->releaseSoundSource(soundInstance); } bool QAudioEngine::isLoading() const { return d->isLoading(); } QVector3D QAudioEngine::listenerPosition() const { return d->listenerPosition(); } QVector3D QAudioEngine::listenerDirection() const { return m_listenerDirection; } QVector3D QAudioEngine::listenerUp() const { return m_listenerUp; } qreal QAudioEngine::listenerGain() const { return d->listenerGain(); } QVector3D QAudioEngine::listenerVelocity() const { return d->listenerVelocity(); } void QAudioEngine::setListenerPosition(const QVector3D& position) { d->setListenerPosition(position); } void QAudioEngine::setListenerVelocity(const QVector3D& velocity) { d->setListenerVelocity(velocity); } void QAudioEngine::setListenerDirection(const QVector3D& direction) { if (m_listenerDirection == direction) return; m_listenerDirection = direction; updateListenerOrientation(); } void QAudioEngine::setListenerUp(const QVector3D& up) { if (m_listenerUp == up) return; m_listenerUp = up; updateListenerOrientation(); } void QAudioEngine::updateListenerOrientation() { QVector3D dir = m_listenerDirection; QVector3D up = m_listenerUp; dir.normalize(); up.normalize(); QVector3D u = up - dir * QVector3D::dotProduct(dir, up); u.normalize(); d->setListenerOrientation(dir, u); } void QAudioEngine::setListenerGain(qreal gain) { d->setListenerGain(gain); } qreal QAudioEngine::dopplerFactor() const { return m_dopplerFactor; } void QAudioEngine::setDopplerFactor(qreal dopplerFactor) { m_dopplerFactor = dopplerFactor; d->setDopplerFactor(dopplerFactor); } qreal QAudioEngine::speedOfSound() const { return m_speedOfSound; } void QAudioEngine::setSpeedOfSound(qreal speedOfSound) { m_speedOfSound = speedOfSound; d->setSpeedOfSound(speedOfSound); } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/qaudioengine_p.h000066400000000000000000000070531225012771600325170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOENGINE_P_H #define QAUDIOENGINE_P_H #include #include #include #include QT_BEGIN_NAMESPACE class QSoundSource; class QSoundBuffer; class QAudioEnginePrivate; class QAudioEngine : public QObject { Q_OBJECT public: ~QAudioEngine(); virtual QSoundSource* createSoundSource(); virtual void releaseSoundSource(QSoundSource *soundInstance); virtual QSoundBuffer* getStaticSoundBuffer(const QUrl& url); virtual void releaseSoundBuffer(QSoundBuffer *buffer); virtual bool isLoading() const; virtual QVector3D listenerPosition() const; virtual QVector3D listenerDirection() const; virtual QVector3D listenerVelocity() const; virtual QVector3D listenerUp() const; virtual qreal listenerGain() const; virtual void setListenerPosition(const QVector3D& position); virtual void setListenerDirection(const QVector3D& direction); virtual void setListenerVelocity(const QVector3D& velocity); virtual void setListenerUp(const QVector3D& up); virtual void setListenerGain(qreal gain); virtual qreal dopplerFactor() const; virtual void setDopplerFactor(qreal dopplerFactor); virtual qreal speedOfSound() const; virtual void setSpeedOfSound(qreal speedOfSound); static QAudioEngine* create(QObject *parent); Q_SIGNALS: void isLoadingChanged(); private: QAudioEngine(QObject *parent); QAudioEnginePrivate *d; void updateListenerOrientation(); qreal m_dopplerFactor; qreal m_speedOfSound; QVector3D m_listenerUp; QVector3D m_listenerDirection; }; QT_END_NAMESPACE #endif qdeclarative_attenuationmodel_p.cpp000066400000000000000000000256221225012771600364250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_attenuationmodel_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE QDeclarativeAttenuationModel::QDeclarativeAttenuationModel(QObject *parent) : QObject(parent) , m_complete(false) { } QDeclarativeAttenuationModel::~QDeclarativeAttenuationModel() { } void QDeclarativeAttenuationModel::classBegin() { if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) { qWarning("AttenuationModel must be defined inside AudioEngine!"); //TODO: COMPILE_EXCEPTION ? return; } } void QDeclarativeAttenuationModel::componentComplete() { if (m_name.isEmpty()) { qWarning("AttenuationModel must have a name!"); return; } m_complete = true; } QString QDeclarativeAttenuationModel::name() const { return m_name; } void QDeclarativeAttenuationModel::setName(const QString& name) { if (m_complete) { qWarning("AttenuationModel: you can not change name after initialization."); return; } m_name = name; } ////////////////////////////////////////////////////////////////////////////////////////// /*! \qmltype AttenuationModelLinear \instantiates QDeclarativeAttenuationModelLinear \since 1.0 \brief Defines a linear attenuation curve for a \l Sound. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. AttenuationModelLinear must be defined inside \l AudioEngine. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AttenuationModelLinear { name:"linear" start: 20 end: 180 } AudioSample { name:"explosion" source: "explosion-02.wav" } Sound { name:"explosion" attenuationModel: "linear" PlayVariation { sample:"explosion" } } } } \endqml */ /*! \qmlproperty string QtAudioEngine1::AttenuationModelLinear::name This property holds the name of AttenuationModelLinear, must be unique among all attenuation models and only defined once. */ QDeclarativeAttenuationModelLinear::QDeclarativeAttenuationModelLinear(QObject *parent) : QDeclarativeAttenuationModel(parent) , m_start(0) , m_end(1) { } void QDeclarativeAttenuationModelLinear::componentComplete() { if (m_start > m_end) { qSwap(m_start, m_end); qWarning() << "AttenuationModelLinear[" << m_name << "]: start must be less or equal than end."; } QDeclarativeAttenuationModel::componentComplete(); } /*! \qmlproperty real QtAudioEngine1::AttenuationModelLinear::start This property holds the start distance. There will be no attenuation if the distance from sound to listener is within this range. The default value is 0. */ qreal QDeclarativeAttenuationModelLinear::startDistance() const { return m_start; } void QDeclarativeAttenuationModelLinear::setStartDistance(qreal startDist) { if (m_complete) { qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization."; return; } if (startDist < 0) { qWarning() << "AttenuationModelLinear[" << m_name << "]: start must be no less than 0."; return; } m_start = startDist; } /*! \qmlproperty real QtAudioEngine1::AttenuationModelLinear::end This property holds the end distance. There will be no sound hearable if the distance from sound to listener is larger than this. The default value is 1. */ qreal QDeclarativeAttenuationModelLinear::endDistance() const { return m_end; } void QDeclarativeAttenuationModelLinear::setEndDistance(qreal endDist) { if (m_complete) { qWarning() << "AttenuationModelLinear[" << m_name << "]: you can not change properties after initialization."; return; } if (endDist < 0) { qWarning() << "AttenuationModelLinear[" << m_name << "]: end must be no greater than 0."; return; } m_end = endDist; } qreal QDeclarativeAttenuationModelLinear::calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const { qreal md = m_end - m_start; if (md == 0) return 1; qreal d = qBound(qreal(0), (listenerPosition - sourcePosition).length() - m_start, md); return qreal(1) - (d / md); } ////////////////////////////////////////////////////////////////////////////////////////// /*! \qmltype AttenuationModelInverse \instantiates QDeclarativeAttenuationModelInverse \since 1.0 \brief Defines a non-linear attenuation curve for a \l Sound. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. AttenuationModelInverse must be defined inside AudioEngine. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AttenuationModelInverse { name:"linear" start: 20 end: 500 rolloff: 1.5 } AudioSample { name:"explosion" source: "explosion-02.wav" } Sound { name:"explosion" attenuationModel: "linear" PlayVariation { sample:"explosion" } } } } \endqml Attenuation factor is calculated as below: distance: distance from sound to listener d = min(max(distance, start), end); attenuation = start / (start + (d - start) * rolloff); */ /*! \qmlproperty string QtAudioEngine1::AttenuationModelInverse::name This property holds the name of AttenuationModelInverse, must be unique among all attenuation models and only defined once. */ /*! \qmlproperty real QtAudioEngine1::AttenuationModelInverse::start This property holds the start distance. There will be no attenuation if the distance from sound to listener is within this range. The default value is 1. */ /*! \qmlproperty real QtAudioEngine1::AttenuationModelInverse::end This property holds the end distance. There will be no further attenuation if the distance from sound to listener is larger than this. The default value is 1000. */ /*! \qmlproperty real QtAudioEngine1::AttenuationModelInverse::rolloff This property holds the rolloff factor. The bigger the value is, the faster the sound attenuates. The default value is 1. */ QDeclarativeAttenuationModelInverse::QDeclarativeAttenuationModelInverse(QObject *parent) : QDeclarativeAttenuationModel(parent) , m_ref(1) , m_max(1000) , m_rolloff(1) { } void QDeclarativeAttenuationModelInverse::componentComplete() { if (m_ref > m_max) { qSwap(m_ref, m_max); qWarning() << "AttenuationModelInverse[" << m_name << "]: referenceDistance must be less or equal than maxDistance."; } QDeclarativeAttenuationModel::componentComplete(); } qreal QDeclarativeAttenuationModelInverse::referenceDistance() const { return m_ref; } void QDeclarativeAttenuationModelInverse::setReferenceDistance(qreal referenceDistance) { if (m_complete) { qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization."; return; } if (referenceDistance <= 0) { qWarning() << "AttenuationModelInverse[" << m_name << "]: referenceDistance must be greater than 0."; return; } m_ref = referenceDistance; } qreal QDeclarativeAttenuationModelInverse::maxDistance() const { return m_max; } void QDeclarativeAttenuationModelInverse::setMaxDistance(qreal maxDistance) { if (m_complete) { qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization."; return; } if (maxDistance <= 0) { qWarning() << "AttenuationModelInverse[" << m_name << "]: maxDistance must be greater than 0."; return; } m_max = maxDistance; } qreal QDeclarativeAttenuationModelInverse::rolloffFactor() const { return m_rolloff; } void QDeclarativeAttenuationModelInverse::setRolloffFactor(qreal rolloffFactor) { if (m_complete) { qWarning() << "AttenuationModelInverse[" << m_name << "]: you can not change properties after initialization."; return; } m_rolloff = rolloffFactor; } qreal QDeclarativeAttenuationModelInverse::calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const { Q_ASSERT(m_ref > 0); return m_ref / (m_ref + (qBound(m_ref, (listenerPosition - sourcePosition).length(), m_max) - m_ref) * m_rolloff); } qdeclarative_attenuationmodel_p.h000066400000000000000000000105031225012771600360620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEATTENUATIONMODEL_P_H #define QDECLARATIVEATTENUATIONMODEL_P_H #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeAttenuationModel : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString name READ name WRITE setName) public: QDeclarativeAttenuationModel(QObject *parent = 0); ~QDeclarativeAttenuationModel(); void classBegin(); void componentComplete(); QString name() const; void setName(const QString& name); virtual qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const = 0; protected: bool m_complete; QString m_name; private: Q_DISABLE_COPY(QDeclarativeAttenuationModel); }; class QDeclarativeAttenuationModelLinear : public QDeclarativeAttenuationModel { Q_OBJECT Q_PROPERTY(qreal start READ startDistance WRITE setStartDistance CONSTANT) Q_PROPERTY(qreal end READ endDistance WRITE setEndDistance CONSTANT) public: QDeclarativeAttenuationModelLinear(QObject *parent = 0); void componentComplete(); qreal startDistance() const; void setStartDistance(qreal startDist); qreal endDistance() const; void setEndDistance(qreal endDist); qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const; private: Q_DISABLE_COPY(QDeclarativeAttenuationModelLinear); qreal m_start; qreal m_end; }; class QDeclarativeAttenuationModelInverse : public QDeclarativeAttenuationModel { Q_OBJECT Q_PROPERTY(qreal start READ referenceDistance WRITE setReferenceDistance CONSTANT) Q_PROPERTY(qreal end READ maxDistance WRITE setMaxDistance CONSTANT) Q_PROPERTY(qreal rolloff READ rolloffFactor WRITE setRolloffFactor CONSTANT) public: QDeclarativeAttenuationModelInverse(QObject *parent = 0); void componentComplete(); qreal referenceDistance() const; void setReferenceDistance(qreal referenceDistance); qreal maxDistance() const; void setMaxDistance(qreal maxDistance); qreal rolloffFactor() const; void setRolloffFactor(qreal rolloffFactor); qreal calculateGain(const QVector3D &listenerPosition, const QVector3D &sourcePosition) const; private: Q_DISABLE_COPY(QDeclarativeAttenuationModelInverse); qreal m_ref; qreal m_max; qreal m_rolloff; }; QT_END_NAMESPACE #endif qdeclarative_audiocategory_p.cpp000066400000000000000000000136521225012771600357100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_audiocategory_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE /*! \qmltype AudioCategory \instantiates QDeclarativeAudioCategory \since 1.0 \brief Control all active sound instances by group. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. An instance of AudioCategory can be accessed through QtAudioEngine1::AudioEngine::categories with its unique name and must be defined inside AudioEngine. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioCategory { name: "sfx" volume: 0.8 } AudioSample { name:"explosion" source: "explosion-02.wav" } Sound { name:"explosion" category: "sfx" PlayVariation { sample:"explosion" } } } MouseArea { anchors.fill: parent onPressed: { audioengine.categories["sfx"].volume = 0.5; } } } \endqml \l Sound instances can be grouped together by specifying the category property. When you change the volume of a category, all audio output from related instances will be affected as well. Note: there will always be an AudioCategory named \c default whether you explicitly define it or not. If you do not specify any category for a \l Sound, it will be grouped into the \c default category. */ QDeclarativeAudioCategory::QDeclarativeAudioCategory(QObject *parent) : QObject(parent) , m_complete(false) , m_volume(1) { } QDeclarativeAudioCategory::~QDeclarativeAudioCategory() { } void QDeclarativeAudioCategory::classBegin() { if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) { qWarning("AudioCategory must be defined inside AudioEngine!"); return; } } void QDeclarativeAudioCategory::componentComplete() { if (m_name.isEmpty()) { qWarning("AudioCategory must have a name!"); return; } m_complete = true; } /*! \qmlproperty real QtAudioEngine1::AudioCategory::volume This property holds the volume of the category and will modulate all audio output from the instances which belong to this category. */ qreal QDeclarativeAudioCategory::volume() const { return m_volume; } void QDeclarativeAudioCategory::setVolume(qreal volume) { if (m_volume == volume) return; m_volume = volume; emit volumeChanged(m_volume); #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioCategory[" << m_name << "] setVolume(" << volume << ")"; #endif } /*! \qmlproperty string QtAudioEngine1::AudioCategory::name This property holds the name of AudioCategory. The name must be unique among all categories and only defined once. The name cannot be changed after the instance has been initialized. */ void QDeclarativeAudioCategory::setName(const QString& name) { if (m_complete) { qWarning("AudioCategory: you can not change name after initialization."); return; } m_name = name; } QString QDeclarativeAudioCategory::name() const { return m_name; } /*! \qmlmethod QtAudioEngine1::AudioCategory::stop() Stops all active sound instances which belong to this category. */ void QDeclarativeAudioCategory::stop() { emit stopped(); } /*! \qmlmethod QtAudioEngine1::AudioCategory::pause() Pauses all active sound instances which belong to this category. */ void QDeclarativeAudioCategory::pause() { emit paused(); } /*! \qmlmethod QtAudioEngine1::AudioCategory::pause() Resumes all active sound instances from paused state which belong to this category. */ void QDeclarativeAudioCategory::resume() { emit resumed(); } qdeclarative_audiocategory_p.h000066400000000000000000000056431225012771600353560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEAUDIOCATEGORY_P_H #define QDECLARATIVEAUDIOCATEGORY_P_H #include #include QT_BEGIN_NAMESPACE class QDeclarativeAudioCategory : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(QString name READ name WRITE setName) public: QDeclarativeAudioCategory(QObject *parent = 0); ~QDeclarativeAudioCategory(); void classBegin(); void componentComplete(); qreal volume() const; void setVolume(qreal volume); QString name() const; void setName(const QString& name); Q_SIGNALS: void volumeChanged(qreal newVolume); void stopped(); void paused(); void resumed(); public Q_SLOTS: void stop(); void pause(); void resume(); private: Q_DISABLE_COPY(QDeclarativeAudioCategory); bool m_complete; QString m_name; qreal m_volume; }; QT_END_NAMESPACE #endif qdeclarative_audioengine_p.cpp000066400000000000000000000426041225012771600353370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_audioengine_p.h" #include "qdeclarative_audiolistener_p.h" #include "qdeclarative_audiocategory_p.h" #include "qdeclarative_audiosample_p.h" #include "qdeclarative_sound_p.h" #include "qdeclarative_playvariation_p.h" #include "qdeclarative_attenuationmodel_p.h" #include "qdeclarative_soundinstance_p.h" #include "qsoundinstance_p.h" #include #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_BEGIN_NAMESPACE /*! \qmltype AudioEngine \instantiates QDeclarativeAudioEngine \since 1.0 \brief Organize all your 3d audio content in one place. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary \c AudioEngine is part of the \b{QtAudioEngine 1.0} module. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion" source: "explosion-02.wav" } Sound { name:"explosion" PlayVariation { sample:"explosion" } } dopplerFactor: 1 speedOfSound: 343.33 // Approximate speed of sound in air at 20 degrees Celsius listener.up:"0,0,1" listener.position:"0,0,0" listener.velocity:"0,0,0" listener.direction:"0,1,0" } MouseArea { anchors.fill: parent onPressed: { audioengine.sounds["explosion"].play(); } } } \endqml \c AudioEngine acts as a central library for configuring all 3d audio content in an app, so you should define only one in your app. It is mostly used as a container to access other types such as AudioCategory, AudioSample and Sound. \sa AudioCategory, AudioSample, Sound, SoundInstance, AttenuationModelLinear, AttenuationModelInverse */ QDeclarativeAudioEngine::QDeclarativeAudioEngine(QObject *parent) : QObject(parent) , m_complete(false) , m_defaultCategory(0) , m_defaultAttenuationModel(0) , m_audioEngine(0) { m_audioEngine = QAudioEngine::create(this); connect(m_audioEngine, SIGNAL(isLoadingChanged()), this, SIGNAL(isLoadingChanged())); connect(m_audioEngine, SIGNAL(isLoadingChanged()), this, SLOT(handleLoadingChanged())); m_listener = new QDeclarativeAudioListener(this); m_updateTimer.setInterval(100); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateSoundInstances())); } QDeclarativeAudioEngine::~QDeclarativeAudioEngine() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioEngine::dtor" << "active = " << m_activeSoundInstances.count() << "pool = " << m_soundInstancePool.count(); #endif qDeleteAll(m_activeSoundInstances); m_activeSoundInstances.clear(); #ifdef DEBUG_AUDIOENGINE qDebug() << "for pool"; #endif qDeleteAll(m_soundInstancePool); m_soundInstancePool.clear(); } void QDeclarativeAudioEngine::classBegin() { } bool QDeclarativeAudioEngine::isReady() const { return m_complete; } QAudioEngine* QDeclarativeAudioEngine::engine() const { return m_audioEngine; } QDeclarativeSoundInstance* QDeclarativeAudioEngine::newDeclarativeSoundInstance(bool managed) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioEngine::newDeclarativeSoundInstance(" << managed << ")"; #endif QDeclarativeSoundInstance *instance = 0; if (managed) { if (m_managedDeclSndInstancePool.count() > 0) { instance = m_managedDeclSndInstancePool.last(); m_managedDeclSndInstancePool.pop_back(); } else { instance = new QDeclarativeSoundInstance(this); qmlEngine(instance)->setObjectOwnership(instance, QQmlEngine::CppOwnership); instance->setEngine(this); } m_managedDeclSoundInstances.push_back(instance); } else { instance = new QDeclarativeSoundInstance(); instance->setEngine(this); qmlEngine(instance)->setObjectOwnership(instance, QQmlEngine::JavaScriptOwnership); } return instance; } void QDeclarativeAudioEngine::releaseManagedDeclarativeSoundInstance(QDeclarativeSoundInstance* declSndInstance) { declSndInstance->setSound(QString()); m_managedDeclSndInstancePool.push_back(declSndInstance); } /*! \qmlproperty int QtAudioEngine1::AudioEngine::liveInstances This property indicates how many live sound instances there are at the moment. */ int QDeclarativeAudioEngine::liveInstanceCount() const { return m_activeSoundInstances.count(); } QSoundInstance* QDeclarativeAudioEngine::newSoundInstance(const QString &name) { QSoundInstance *instance = 0; if (m_soundInstancePool.count() > 0) { instance = m_soundInstancePool.last(); m_soundInstancePool.pop_back(); } else { instance = new QSoundInstance(this); } instance->bindSoundDescription(qobject_cast(qvariant_cast(m_sounds.value(name)))); m_activeSoundInstances.push_back(instance); if (!m_updateTimer.isActive()) m_updateTimer.start(); emit liveInstanceCountChanged(); return instance; } void QDeclarativeAudioEngine::releaseSoundInstance(QSoundInstance* instance) { instance->bindSoundDescription(0); m_activeSoundInstances.removeOne(instance); m_soundInstancePool.push_back(instance); emit liveInstanceCountChanged(); } void QDeclarativeAudioEngine::componentComplete() { #ifdef DEBUG_AUDIOENGINE qDebug() << "AudioEngine begin initialization"; #endif if (!m_defaultCategory) { #ifdef DEBUG_AUDIOENGINE qDebug() << "creating default category"; #endif m_defaultCategory = new QDeclarativeAudioCategory(this); m_defaultCategory->classBegin(); m_defaultCategory->setName(QString::fromLatin1("default")); m_defaultCategory->setVolume(1); m_defaultCategory->componentComplete(); } #ifdef DEBUG_AUDIOENGINE qDebug() << "init samples" << m_samples.keys().count(); #endif foreach (const QString& key, m_samples.keys()) { QDeclarativeAudioSample *sample = qobject_cast( qvariant_cast(m_samples[key])); if (!sample) { qWarning() << "accessing invalid sample[" << key << "]"; continue; } sample->init(); } #ifdef DEBUG_AUDIOENGINE qDebug() << "init sounds" << m_sounds.keys().count(); #endif foreach (const QString& key, m_sounds.keys()) { QDeclarativeSound *sound = qobject_cast( qvariant_cast(m_sounds[key])); if (!sound) { qWarning() << "accessing invalid sound[" << key << "]"; continue; } QDeclarativeAudioCategory *category = m_defaultCategory; if (m_categories.contains(sound->category())) { category = qobject_cast( qvariant_cast(m_categories[sound->category()])); } sound->setCategoryObject(category); QDeclarativeAttenuationModel *attenuationModel = 0; if (sound->attenuationModel().isEmpty()) { if (m_defaultAttenuationModel) attenuationModel = m_defaultAttenuationModel; } else if (m_attenuationModels.contains(sound->attenuationModel())){ attenuationModel = m_attenuationModels[sound->attenuationModel()]; } else { qWarning() << "Sound[" << sound->name() << "] contains invalid attenuationModel[" << sound->attenuationModel() << "]"; } sound->setAttenuationModelObject(attenuationModel); foreach (QDeclarativePlayVariation* playVariation, sound->playlist()) { if (m_samples.contains(playVariation->sample())) { playVariation->setSampleObject( qobject_cast( qvariant_cast(m_samples[playVariation->sample()]))); } else { qWarning() << "Sound[" << sound->name() << "] contains invalid sample[" << playVariation->sample() << "] for its playVarations"; } } } m_complete = true; #ifdef DEBUG_AUDIOENGINE qDebug() << "AudioEngine ready."; #endif emit ready(); } void QDeclarativeAudioEngine::updateSoundInstances() { for (QList::Iterator it = m_managedDeclSoundInstances.begin(); it != m_managedDeclSoundInstances.end();) { QDeclarativeSoundInstance *declSndInstance = *it; if (declSndInstance->state() == QDeclarativeSoundInstance::StoppedState) { it = m_managedDeclSoundInstances.erase(it); releaseManagedDeclarativeSoundInstance(declSndInstance); #ifdef DEBUG_AUDIOENGINE qDebug() << "AudioEngine removed managed sounce instance"; #endif } else { declSndInstance->updatePosition(qreal(0.1)); ++it; } } QVector3D listenerPosition = this->listener()->position(); foreach (QSoundInstance *instance, m_activeSoundInstances) { if (instance->state() == QSoundInstance::PlayingState && instance->attenuationEnabled()) { instance->update3DVolume(listenerPosition); } } if (m_activeSoundInstances.count() == 0) m_updateTimer.stop(); } void QDeclarativeAudioEngine::appendFunction(QQmlListProperty *property, QObject *value) { QDeclarativeAudioEngine* engine = static_cast(property->object); if (engine->m_complete) { qWarning("AudioEngine: cannot add child after initialization!"); return; } QDeclarativeSound *sound = qobject_cast(value); if (sound) { #ifdef DEBUG_AUDIOENGINE qDebug() << "add QDeclarativeSound[" << sound->name() << "]"; #endif if (engine->m_sounds.contains(sound->name())) { qWarning() << "Failed to add Sound[" << sound->name() << "], already exists!"; return; } engine->m_sounds.insert(sound->name(), QVariant::fromValue(value)); return; } QDeclarativeAudioSample *sample = qobject_cast(value); if (sample) { #ifdef DEBUG_AUDIOENGINE qDebug() << "add QDeclarativeAudioSample[" << sample->name() << "]"; #endif if (engine->m_samples.contains(sample->name())) { qWarning() << "Failed to add AudioSample[" << sample->name() << "], already exists!"; return; } engine->m_samples.insert(sample->name(), QVariant::fromValue(value)); return; } QDeclarativeAudioCategory *category = qobject_cast(value); if (category) { #ifdef DEBUG_AUDIOENGINE qDebug() << "add QDeclarativeAudioCategory[" << category->name() << "]"; #endif if (engine->m_categories.contains(category->name())) { qWarning() << "Failed to add AudioCategory[" << category->name() << "], already exists!"; return; } engine->m_categories.insert(category->name(), QVariant::fromValue(value)); if (category->name() == QLatin1String("default")) { engine->m_defaultCategory = category; } } QDeclarativeAttenuationModel *attenModel = qobject_cast(value); if (attenModel) { #ifdef DEBUG_AUDIOENGINE qDebug() << "add AttenuationModel[" << attenModel->name() << "]"; #endif if (attenModel->name() == QLatin1String("default")) { engine->m_defaultAttenuationModel = attenModel; } if (engine->m_attenuationModels.contains(attenModel->name())) { qWarning() << "Failed to add AttenuationModel[" << attenModel->name() << "], already exists!"; return; } engine->m_attenuationModels.insert(attenModel->name(), attenModel); return; } qWarning("Unknown child type for AudioEngine!"); } QQmlListProperty QDeclarativeAudioEngine::bank() { return QQmlListProperty(this, 0, appendFunction, 0, 0, 0); } /*! \qmlproperty map QtAudioEngine1::AudioEngine::categories Container of all AudioCategory instances. */ QObject* QDeclarativeAudioEngine::categories() { return &m_categories; } /*! \qmlproperty map QtAudioEngine1::AudioEngine::samples Container of all AudioSample instances. */ QObject* QDeclarativeAudioEngine::samples() { return &m_samples; } /*! \qmlproperty map QtAudioEngine1::AudioEngine::sounds Container of all Sound instances. */ QObject* QDeclarativeAudioEngine::sounds() { return &m_sounds; } /*! \qmlproperty QtAudioEngine1::AudioListener QtAudioEngine1::AudioEngine::listener This property holds the listener object. You can change various properties to affect the 3D positioning of sounds. \sa AudioListener */ QDeclarativeAudioListener* QDeclarativeAudioEngine::listener() const { return m_listener; } /*! \qmlproperty real QtAudioEngine1::AudioEngine::dopplerFactor This property holds a simple scaling for the effect of doppler shift. */ qreal QDeclarativeAudioEngine::dopplerFactor() const { return m_audioEngine->dopplerFactor(); } void QDeclarativeAudioEngine::setDopplerFactor(qreal dopplerFactor) { m_audioEngine->setDopplerFactor(dopplerFactor); } /*! \qmlproperty real QtAudioEngine1::AudioEngine::speedOfSound This property holds the reference value of the sound speed (in meters per second) which will be used in doppler shift calculation. The doppler shift calculation is used to emulate the change in frequency in sound that is perceived by an observer when the sound source is travelling towards or away from the observer. The speed of sound depends on the medium the sound is propagating through. */ qreal QDeclarativeAudioEngine::speedOfSound() const { return m_audioEngine->speedOfSound(); } void QDeclarativeAudioEngine::setSpeedOfSound(qreal speedOfSound) { m_audioEngine->setSpeedOfSound(speedOfSound); } /*! \qmlproperty bool QtAudioEngine1::AudioEngine::loading This property indicates if the audio engine is loading any audio sample at the moment. This may be useful if you specified the preloaded property in AudioSample and would like to show a loading screen to the user before all audio samples are loaded. /sa finishedLoading, AudioSample::preloaded */ bool QDeclarativeAudioEngine::isLoading() const { return m_audioEngine->isLoading(); } void QDeclarativeAudioEngine::handleLoadingChanged() { if (!isLoading()) emit finishedLoading(); } /*! \qmlsignal QtAudioEngine1::AudioEngine::finishedLoading() This signal is emitted when \l loading has completed. The corresponding handler is \c onFinishedLoading. */ /*! \qmlsignal QtAudioEngine1::AudioEngine::ready() This signal is emitted when the AudioEngine is ready to use. The corresponding handler is \c onReady. */ /*! \qmlsignal QtAudioEngine1::AudioEngine::liveInstanceCountChanged() This signal is emitted when the number of live instances managed by the AudioEngine is changed. The corresponding handler is \c onLiveInstanceCountChanged. */ /*! \qmlsignal QtAudioEngine1::AudioEngine::isLoadingChanged() This signal is emitted when the \l loading property changes. The corresponding handler is \c onIsLoadingChanged. */ QT_END_NAMESPACE qdeclarative_audioengine_p.h000066400000000000000000000133741225012771600350060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEAUDIOENGINE_P_H #define QDECLARATIVEAUDIOENGINE_P_H #include #include #include #include #include #include #include "qaudioengine_p.h" QT_BEGIN_NAMESPACE class QDeclarativeSoundInstance; class QDeclarativeAudioListener; class QDeclarativeAudioCategory; class QDeclarativeAudioSample; class QDeclarativeSound; class QDeclarativePlayVariation; class QAudioCategory; class QDeclarativeAttenuationModel; class QSoundInstance; class QDeclarativeAudioEngine : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QQmlListProperty bank READ bank CONSTANT) Q_PROPERTY(QObject* categories READ categories CONSTANT) Q_PROPERTY(QObject* samples READ samples CONSTANT) Q_PROPERTY(QObject* sounds READ sounds CONSTANT) Q_PROPERTY(bool loading READ isLoading NOTIFY isLoadingChanged) Q_PROPERTY(int liveInstances READ liveInstanceCount NOTIFY liveInstanceCountChanged) Q_PROPERTY(QDeclarativeAudioListener* listener READ listener CONSTANT) Q_PROPERTY(qreal dopplerFactor READ dopplerFactor WRITE setDopplerFactor) Q_PROPERTY(qreal speedOfSound READ speedOfSound WRITE setSpeedOfSound) Q_CLASSINFO("DefaultProperty", "bank") public: QDeclarativeAudioEngine(QObject *parent = 0); ~QDeclarativeAudioEngine(); void classBegin(); void componentComplete(); //This is used for tracking all objects declared inside AudioEngine //see appendFunction QQmlListProperty bank(); QObject* categories(); QObject* samples(); QObject* sounds(); QDeclarativeAudioListener* listener() const; qreal dopplerFactor() const; void setDopplerFactor(qreal dopplerFactor); qreal speedOfSound() const; void setSpeedOfSound(qreal speedOfSound); bool isLoading() const; int liveInstanceCount() const; //for child elements bool isReady() const; QAudioEngine* engine() const; //if managed, then the instance should start playing immediately and will be collected //when the playback finished QDeclarativeSoundInstance* newDeclarativeSoundInstance(bool managed); //internal sound instance is different from declarativeSoundInstance //declarative instance is more like a soundInstance helper which can //switch to different sound instance conveniently while sound instance //must be mapped to one sound definition. QSoundInstance* newSoundInstance(const QString &name); void releaseSoundInstance(QSoundInstance* instance); Q_SIGNALS: void ready(); void liveInstanceCountChanged(); void isLoadingChanged(); void finishedLoading(); private Q_SLOTS: void updateSoundInstances(); void handleLoadingChanged(); private: Q_DISABLE_COPY(QDeclarativeAudioEngine); bool m_complete; //see bank() static void appendFunction(QQmlListProperty *property, QObject *value); QDeclarativeAudioListener *m_listener; QDeclarativeAudioCategory* m_defaultCategory; QQmlPropertyMap m_categories; QQmlPropertyMap m_samples; QQmlPropertyMap m_sounds; //Use strong type here since no need to for AttenuationModel to be accessible directly by user //after config stage QDeclarativeAttenuationModel *m_defaultAttenuationModel; QMap m_attenuationModels; QAudioEngine *m_audioEngine; //for execution stage management QList m_soundInstancePool; QList m_activeSoundInstances; QTimer m_updateTimer; QList m_managedDeclSoundInstances; QList m_managedDeclSndInstancePool; void releaseManagedDeclarativeSoundInstance(QDeclarativeSoundInstance* declSndInstance); }; QT_END_NAMESPACE #endif qdeclarative_audiolistener_p.cpp000066400000000000000000000164641225012771600357240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_audiolistener_p.h" #include "qdeclarative_audioengine_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE /*! \qmltype AudioListener \instantiates QDeclarativeAudioListener \since 1.0 \brief Control global listener parameters. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. AudioListener will have only one global instance and you can either access it through the listener property of AudioEngine: \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine listener.up:"0,0,1" listener.velocity:"0,0,0" listener.direction:"0,1,0" listener.position:Qt.vector3d(observer.x, observer.y, 0); } Item { id: observer x: 10 + observer.percent * 100 y: 20 + observer.percent * 80 property real percent: 0 SequentialAnimation on percent { loops: Animation.Infinite running: true NumberAnimation { duration: 8000 from: 0 to: 1 } } } } \endqml or alternatively, by defining an AudioListener outside AudioEngine: \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine listener.up:"0,0,1" listener.velocity:"0,0,0" listener.direction:"0,1,0" } AudioListener { engine:audioengine position: Qt.vector3d(observer.x, observer.y, 0); } Item { id: observer x: 10 + observer.percent * 100 y: 20 + observer.percent * 80 property real percent: 0 SequentialAnimation on percent { loops: Animation.Infinite running: true NumberAnimation { duration: 8000 from: 0 to: 1 } } } } \endqml This separate AudioListener definition is allowed to make qml bindings easier in some case. */ QDeclarativeAudioListener::QDeclarativeAudioListener(QObject *parent) : QObject(parent) , m_engine(0) { m_engine = qobject_cast(parent); } QDeclarativeAudioListener::~QDeclarativeAudioListener() { } /*! \qmlproperty QtAudioEngine1::AudioEngine QtAudioEngine1::AudioListener::engine This property holds the reference to AudioEngine, must be set only once. */ QDeclarativeAudioEngine* QDeclarativeAudioListener::engine() const { return m_engine; } void QDeclarativeAudioListener::setEngine(QDeclarativeAudioEngine *engine) { setParent(engine); m_engine = engine; } /*! \qmlproperty vector3d QtAudioEngine1::AudioListener::position This property holds the 3d position of the listener. */ QVector3D QDeclarativeAudioListener::position() const { return m_engine->engine()->listenerPosition(); } void QDeclarativeAudioListener::setPosition(const QVector3D &position) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioListener::setPosition"; #endif m_engine->engine()->setListenerPosition(position); emit positionChanged(); } /*! \qmlproperty vector3d QtAudioEngine1::AudioListener::direction This property holds the normalized 3d direction vector of the listener. */ QVector3D QDeclarativeAudioListener::direction() const { return m_engine->engine()->listenerDirection(); } void QDeclarativeAudioListener::setDirection(const QVector3D &direction) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioListener::setDirection"; #endif m_engine->engine()->setListenerDirection(direction); emit directionChanged(); } /*! \qmlproperty vector3d QtAudioEngine1::AudioListener::velocity This property holds the 3d velocity vector of the listener. */ QVector3D QDeclarativeAudioListener::velocity() const { return m_engine->engine()->listenerVelocity(); } void QDeclarativeAudioListener::setVelocity(const QVector3D &velocity) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioListener::setVelocity"; #endif m_engine->engine()->setListenerVelocity(velocity); emit velocityChanged(); } /*! \qmlproperty vector3d QtAudioEngine1::AudioListener::up This property holds the normalized 3d up vector of the listener. */ QVector3D QDeclarativeAudioListener::up() const { return m_engine->engine()->listenerUp(); } void QDeclarativeAudioListener::setUp(const QVector3D &up) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioListener::setUp"; #endif m_engine->engine()->setListenerUp(up); emit upChanged(); } /*! \qmlproperty real QtAudioEngine1::AudioListener::gain This property will modulate all audio output from audio engine instances. */ qreal QDeclarativeAudioListener::gain() const { return m_engine->engine()->listenerGain(); } void QDeclarativeAudioListener::setGain(qreal gain) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeAudioListener::setGain"; #endif m_engine->engine()->setListenerGain(gain); emit gainChanged(); } qdeclarative_audiolistener_p.h000066400000000000000000000067101225012771600353620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEAUDIOLISTENER_P_H #define QDECLARATIVEAUDIOLISTENER_P_H #include #include QT_BEGIN_NAMESPACE class QDeclarativeAudioEngine; class QDeclarativeAudioListener : public QObject { Q_OBJECT Q_PROPERTY(QDeclarativeAudioEngine* engine READ engine WRITE setEngine) Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(QVector3D direction READ direction WRITE setDirection NOTIFY directionChanged) Q_PROPERTY(QVector3D velocity READ velocity WRITE setVelocity NOTIFY velocityChanged) Q_PROPERTY(QVector3D up READ up WRITE setUp NOTIFY upChanged) Q_PROPERTY(qreal gain READ gain WRITE setGain NOTIFY gainChanged) public: QDeclarativeAudioListener(QObject *parent = 0); ~QDeclarativeAudioListener(); QDeclarativeAudioEngine* engine() const; void setEngine(QDeclarativeAudioEngine *engine); QVector3D position() const; void setPosition(const QVector3D &position); QVector3D direction() const; void setDirection(const QVector3D &direction); QVector3D up() const; void setUp(const QVector3D &up); QVector3D velocity() const; void setVelocity(const QVector3D &velocity); qreal gain() const; void setGain(qreal gain); Q_SIGNALS: void positionChanged(); void directionChanged(); void velocityChanged(); void upChanged(); void gainChanged(); private: Q_DISABLE_COPY(QDeclarativeAudioListener); QDeclarativeAudioEngine *m_engine; }; QT_END_NAMESPACE #endif qdeclarative_audiosample_p.cpp000066400000000000000000000145251225012771600353540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_audiosample_p.h" #include "qdeclarative_audioengine_p.h" #include "qdebug.h" #include "qsoundbuffer_p.h" #include "qaudioengine_p.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE /*! \qmltype AudioSample \instantiates QDeclarativeAudioSample \since 1.0 \brief Load audio samples, mostly .wav. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary \c AudioSample is part of the \b{QtAudioEngine 1.0} module. It can be accessed through QtAudioEngine1::AudioEngine::samples with its unique name and must be defined inside AudioEngine. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion" source: "explosion-02.wav" } } } \endqml */ QDeclarativeAudioSample::QDeclarativeAudioSample(QObject *parent) : QObject(parent) , m_complete(false) , m_streaming(false) , m_preloaded(false) , m_soundBuffer(0) { } QDeclarativeAudioSample::~QDeclarativeAudioSample() { } void QDeclarativeAudioSample::classBegin() { if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) { qWarning("AudioSample must be defined inside AudioEngine!"); return; } } void QDeclarativeAudioSample::componentComplete() { if (m_name.isEmpty()) { qWarning("AudioSample must have a name!"); return; } m_complete = true; } QUrl QDeclarativeAudioSample::source() const { return m_url; } void QDeclarativeAudioSample::setSource(const QUrl& url) { if (m_complete) { qWarning("AudioSample: source not changable after initialization."); return; } m_url = url; } bool QDeclarativeAudioSample::isStreaming() const { return m_streaming; } /*! \qmlproperty bool QtAudioEngine1::AudioSample::preloaded This property indicates whether this sample needs to be preloaded or not. If true, the audio engine will start loading the sample file immediately when the app started, otherwise the sample will not be loaded until explicitly requested. */ bool QDeclarativeAudioSample::isPreloaded() const { return m_preloaded; } /*! \qmlproperty bool QtAudioEngine1::AudioSample::loaded This property indicates whether this sample has been loaded into memory or not. */ bool QDeclarativeAudioSample::isLoaded() const { if (!m_soundBuffer) return false; return m_soundBuffer->isReady(); } /*! \qmlmethod void QtAudioEngine1::AudioSample::load() Starts loading the sample into memory if not loaded. */ void QDeclarativeAudioSample::load() { if (isLoaded()) return; if (!m_soundBuffer) { m_preloaded = true; return; } m_soundBuffer->load(); } void QDeclarativeAudioSample::setPreloaded(bool preloaded) { if (m_complete) { qWarning("AudioSample: preloaded not changable after initialization."); return; } m_preloaded = preloaded; } void QDeclarativeAudioSample::setStreaming(bool streaming) { if (m_complete) { qWarning("AudioSample: streaming not changable after initialization."); return; } m_streaming = streaming; } /*! \qmlproperty string QtAudioEngine1::AudioSample::name This property holds the name of AudioSample, must be unique among all samples and only defined once. */ QString QDeclarativeAudioSample::name() const { return m_name; } void QDeclarativeAudioSample::setName(const QString& name) { if (m_complete) { qWarning("AudioSample: name not changable after initialization."); return; } m_name = name; } void QDeclarativeAudioSample::init() { if (m_streaming) { //TODO } else { m_soundBuffer = qobject_cast(parent())->engine()->getStaticSoundBuffer(m_url); if (m_soundBuffer->isReady()) { emit loadedChanged(); } else { connect(m_soundBuffer, SIGNAL(ready()), this, SIGNAL(loadedChanged())); } if (m_preloaded) { m_soundBuffer->load(); } } } QSoundBuffer* QDeclarativeAudioSample::soundBuffer() const { return m_soundBuffer; } /*! \qmlsignal QtAudioEngine1::AudioSample::onLoadedChanged() This handler is called when \l loaded is changed */ qdeclarative_audiosample_p.h000066400000000000000000000065021225012771600350150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEAUDIOSAMPLE_P_H #define QDECLARATIVEAUDIOSAMPLE_P_H #include #include QT_BEGIN_NAMESPACE class QSoundBuffer; class QDeclarativeAudioSample : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QUrl source READ source WRITE setSource) Q_PROPERTY(bool preloaded READ isPreloaded WRITE setPreloaded) Q_PROPERTY(bool streaming READ isStreaming WRITE setStreaming) Q_PROPERTY(bool loaded READ isLoaded NOTIFY loadedChanged) public: QDeclarativeAudioSample(QObject *parent = 0); ~QDeclarativeAudioSample(); void classBegin(); void componentComplete(); QString name() const; void setName(const QString& name); QUrl source() const; void setSource(const QUrl& url); bool isStreaming() const; void setStreaming(bool streaming); bool isPreloaded() const; void setPreloaded(bool preloaded); bool isLoaded() const; QSoundBuffer* soundBuffer() const; //called by QDeclarativeAudioEngine void init(); Q_SIGNALS: void loadedChanged(); public Q_SLOTS: void load(); private: Q_DISABLE_COPY(QDeclarativeAudioSample); bool m_complete; QString m_name; QUrl m_url; bool m_streaming; bool m_preloaded; QSoundBuffer *m_soundBuffer; }; QT_END_NAMESPACE #endif qdeclarative_playvariation_p.cpp000066400000000000000000000176261225012771600357400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_playvariation_p.h" #include "qdeclarative_audioengine_p.h" #include "qsoundinstance_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE /*! \qmltype PlayVariation \instantiates QDeclarativePlayVariation \since 1.0 \brief Define a playback variation for \l {Sound} {sounds}. So each time the playback of the same sound can be a slightly different even with the same AudioSample. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. PlayVariation must be defined inside a \l Sound. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion01" source: "explosion-01.wav" } AudioSample { name:"explosion02" source: "explosion-02.wav" } Sound { name:"explosion" PlayVariation { sample:"explosion01" minPitch: 0.8 maxPitch: 1.1 } PlayVariation { sample:"explosion01" minGain: 1.1 maxGain: 1.5 } } } } \endqml */ QDeclarativePlayVariation::QDeclarativePlayVariation(QObject *parent) : QObject(parent) , m_complete(false) , m_looping(false) , m_maxGain(1) , m_minGain(1) , m_maxPitch(1) , m_minPitch(1) , m_sampleObject(0) { } QDeclarativePlayVariation::~QDeclarativePlayVariation() { } void QDeclarativePlayVariation::classBegin() { if (!parent() || !parent()->inherits("QDeclarativeSound")) { qWarning("PlayVariation must be defined inside Sound!"); return; } } void QDeclarativePlayVariation::componentComplete() { if (m_maxGain < m_minGain) { qWarning("PlayVariation: maxGain must be no less than minGain"); qSwap(m_minGain, m_maxGain); } if (m_maxPitch < m_minPitch) { qWarning("PlayVariation: maxPitch must be no less than minPitch"); qSwap(m_minPitch, m_maxPitch); } m_complete = true; } /*! \qmlproperty string QtAudioEngine1::PlayVariation::sample This property specifies which \l AudioSample this variation will use. */ QString QDeclarativePlayVariation::sample() const { return m_sample; } void QDeclarativePlayVariation::setSample(const QString& sample) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } m_sample = sample; } /*! \qmlproperty bool QtAudioEngine1::PlayVariation::looping This property indicates whether the playback will be looped or not. */ bool QDeclarativePlayVariation::isLooping() const { return m_looping; } void QDeclarativePlayVariation::setLooping(bool looping) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } m_looping = looping; } /*! \qmlproperty real QtAudioEngine1::PlayVariation::maxGain This property specifies the maximum gain adjustment that can be applied in any playback. */ qreal QDeclarativePlayVariation::maxGain() const { return m_maxGain; } void QDeclarativePlayVariation::setMaxGain(qreal maxGain) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } if (maxGain <= 0) { qWarning("PlayVariation: maxGain must be greater than 0"); return; } m_maxGain = maxGain; } /*! \qmlproperty real QtAudioEngine1::PlayVariation::minGain This property specifies the minimum gain adjustment that can be applied in any playback. */ qreal QDeclarativePlayVariation::minGain() const { return m_minGain; } void QDeclarativePlayVariation::setMinGain(qreal minGain) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } if (minGain < 0) { qWarning("PlayVariation: minGain must be no less than 0"); return; } m_minGain = minGain; } /*! \qmlproperty real QtAudioEngine1::PlayVariation::maxPitch This property specifies the maximum pitch adjustment that can be applied in any playback. */ qreal QDeclarativePlayVariation::maxPitch() const { return m_maxPitch; } void QDeclarativePlayVariation::setMaxPitch(qreal maxPitch) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } if (maxPitch < 0) { qWarning("PlayVariation: maxPitch must be no less than 0"); return; } m_maxPitch = maxPitch; } /*! \qmlproperty real QtAudioEngine1::PlayVariation::minPitch This property specifies the minimum pitch adjustment that can be applied in any playback. */ qreal QDeclarativePlayVariation::minPitch() const { return m_minPitch; } void QDeclarativePlayVariation::setMinPitch(qreal minPitch) { if (m_complete) { qWarning("PlayVariation: cannot change properties after initialization."); return; } if (m_minPitch < 0) { qWarning("PlayVariation: m_minPitch must be no less than 0"); return; } m_minPitch = minPitch; } QDeclarativeAudioSample* QDeclarativePlayVariation::sampleObject() const { return m_sampleObject; } void QDeclarativePlayVariation::setSampleObject(QDeclarativeAudioSample *sampleObject) { m_sampleObject = sampleObject; } void QDeclarativePlayVariation::applyParameters(QSoundInstance *soundInstance) { qreal pitch = qreal(qrand() % 1001) * 0.001f * (m_maxPitch - m_minPitch) + m_minPitch; qreal gain = qreal(qrand() % 1001) * 0.001f * (m_maxGain - m_minGain) + m_minGain; soundInstance->updateVariationParameters(pitch, gain, m_looping); } qdeclarative_playvariation_p.h000066400000000000000000000071661225012771600354030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEPLAYVARIATION_P_H #define QDECLARATIVEPLAYVARIATION_P_H #include #include QT_BEGIN_NAMESPACE class QDeclarativeAudioSample; class QSoundInstance; class QDeclarativePlayVariation : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString sample READ sample WRITE setSample) Q_PROPERTY(bool looping READ isLooping WRITE setLooping) Q_PROPERTY(qreal maxGain READ maxGain WRITE setMaxGain) Q_PROPERTY(qreal minGain READ minGain WRITE setMinGain) Q_PROPERTY(qreal maxPitch READ maxPitch WRITE setMaxPitch) Q_PROPERTY(qreal minPitch READ minPitch WRITE setMinPitch) public: QDeclarativePlayVariation(QObject *parent = 0); ~QDeclarativePlayVariation(); void classBegin(); void componentComplete(); QString sample() const; void setSample(const QString& sample); bool isLooping() const; void setLooping(bool looping); qreal maxGain() const; void setMaxGain(qreal maxGain); qreal minGain() const; void setMinGain(qreal minGain); qreal maxPitch() const; void setMaxPitch(qreal maxPitch); qreal minPitch() const; void setMinPitch(qreal minPitch); //called by QDeclarativeAudioEngine void setSampleObject(QDeclarativeAudioSample *sampleObject); QDeclarativeAudioSample* sampleObject() const; void applyParameters(QSoundInstance *soundInstance); private: Q_DISABLE_COPY(QDeclarativePlayVariation); bool m_complete; QString m_sample; bool m_looping; qreal m_maxGain; qreal m_minGain; qreal m_maxPitch; qreal m_minPitch; QDeclarativeAudioSample *m_sampleObject; }; QT_END_NAMESPACE #endif qdeclarative_sound_p.cpp000066400000000000000000000372511225012771600342020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_sound_p.h" #include "qdeclarative_audiocategory_p.h" #include "qdeclarative_attenuationmodel_p.h" #include "qdeclarative_soundinstance_p.h" #include "qdeclarative_audioengine_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE QDeclarativeSoundCone::QDeclarativeSoundCone(QObject *parent) : QObject(parent) , m_innerAngle(360) , m_outerAngle(360) , m_outerGain(0) { } /*! \qmlproperty real Sound::cone.innerAngle This property holds the innerAngle for Sound definition. The range is [0, 360] degree. There is no directional attenuation within innerAngle. */ qreal QDeclarativeSoundCone::innerAngle() const { return m_innerAngle; } void QDeclarativeSoundCone::setInnerAngle(qreal innerAngle) { QDeclarativeSound *s = qobject_cast(parent()); if (s && s->m_complete) return; if (innerAngle < 0 || innerAngle > 360) { qWarning() << "innerAngle should be within[0, 360] degrees"; return; } m_innerAngle = innerAngle; } /*! \qmlproperty real Sound::cone.outerAngle This property holds the outerAngle for Sound definition. The range is [0, 360] degree. All audio output from this sound will be attenuated by \l outerGain outside outerAngle. */ qreal QDeclarativeSoundCone::outerAngle() const { return m_outerAngle; } void QDeclarativeSoundCone::setOuterAngle(qreal outerAngle) { QDeclarativeSound *s = qobject_cast(parent()); if (s && s->m_complete) return; if (outerAngle < 0 || outerAngle > 360) { qWarning() << "outerAngle should be within[0, 360] degrees"; return; } m_outerAngle = outerAngle; } /*! \qmlproperty real Sound::cone.outerGain This property holds attenuation value for directional attenuation of this sound. The range is [0, 1]. All audio output from this sound will be attenuated by outerGain outside \l outerAngle. */ qreal QDeclarativeSoundCone::outerGain() const { return m_outerGain; } void QDeclarativeSoundCone::setOuterGain(qreal outerGain) { QDeclarativeSound *s = qobject_cast(parent()); if (s && s->m_complete) return; if (outerGain < 0 || outerGain > 1) { qWarning() << "outerGain should no less than 0 and no more than 1"; return; } m_outerGain = outerGain; } void QDeclarativeSoundCone::componentComplete() { if (m_outerAngle < m_innerAngle) { m_outerAngle = m_innerAngle; } } //////////////////////////////////////////////////////////// /*! \qmltype Sound \instantiates QDeclarativeSound \since 1.0 \brief Define a variety of samples and parameters to be used for SoundInstance. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. Sound can be accessed through QtAudioEngine1::AudioEngine::sounds with its unique name and must be defined inside AudioEngine. \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion01" source: "explosion-01.wav" } AudioSample { name:"explosion02" source: "explosion-02.wav" } Sound { name:"explosion" PlayVariation { sample:"explosion01" minPitch: 0.8 maxPitch: 1.1 } PlayVariation { sample:"explosion01" minGain: 1.1 maxGain: 1.5 } } } MouseArea { anchors.fill: parent onPressed: { audioengine.sounds["explosion"].play(); } } } \endqml */ QDeclarativeSound::QDeclarativeSound(QObject *parent) : QObject(parent) , m_complete(false) , m_playType(Random) , m_attenuationModelObject(0) , m_categoryObject(0) { m_cone = new QDeclarativeSoundCone(this); } QDeclarativeSound::~QDeclarativeSound() { } void QDeclarativeSound::classBegin() { if (!parent() || !parent()->inherits("QDeclarativeAudioEngine")) { qWarning("Sound must be defined inside AudioEngine!"); return; } } void QDeclarativeSound::componentComplete() { m_complete = true; m_cone->componentComplete(); } /*! \qmlproperty enumeration QtAudioEngine1::Sound::playType This property holds the playType. It can be one of: \list \li Random - randomly picks up a play variation when playback is triggered \li Sequential - plays each variation in sequence when playback is triggered \endlist The default value is Random. */ QDeclarativeSound::PlayType QDeclarativeSound::playType() const { return m_playType; } void QDeclarativeSound::setPlayType(PlayType playType) { if (m_complete) { qWarning("Sound: playType not changable after initialization."); return; } m_playType = playType; } /*! \qmlproperty string QtAudioEngine1::Sound::category This property specifies which AudioCategory this sound belongs to. */ QString QDeclarativeSound::category() const { return m_category; } void QDeclarativeSound::setCategory(const QString& category) { if (m_complete) { qWarning("Sound: category not changable after initialization."); return; } m_category = category; } /*! \qmlproperty string QtAudioEngine1::Sound::name This property holds the name of Sound, must be unique among all sounds and only defined once. */ QString QDeclarativeSound::name() const { return m_name; } void QDeclarativeSound::setName(const QString& name) { if (m_complete) { qWarning("Sound: category not changable after initialization."); return; } m_name = name; } /*! \qmlproperty string QtAudioEngine1::Sound::attenuationModel This property specifies which attenuation model this sound will apply. */ QString QDeclarativeSound::attenuationModel() const { return m_attenuationModel; } int QDeclarativeSound::genVariationIndex(int oldVariationIndex) { if (m_playlist.count() == 0) return -1; if (m_playlist.count() == 1) return 0; switch (m_playType) { case QDeclarativeSound::Random: { if (oldVariationIndex < 0) oldVariationIndex = 0; return (oldVariationIndex + (qrand() % (m_playlist.count() + 1))) % m_playlist.count(); } default: return (oldVariationIndex + 1) % m_playlist.count(); } } QDeclarativePlayVariation* QDeclarativeSound::getVariation(int index) { Q_ASSERT(index >= 0 && index < m_playlist.count()); return m_playlist[index]; } void QDeclarativeSound::setAttenuationModel(QString attenuationModel) { if (m_complete) { qWarning("Sound: attenuationModel not changable after initialization."); return; } m_attenuationModel = attenuationModel; } QDeclarativeSoundCone* QDeclarativeSound::cone() const { return m_cone; } QDeclarativeAttenuationModel* QDeclarativeSound::attenuationModelObject() const { return m_attenuationModelObject; } void QDeclarativeSound::setAttenuationModelObject(QDeclarativeAttenuationModel *attenuationModelObject) { m_attenuationModelObject = attenuationModelObject; } QDeclarativeAudioCategory* QDeclarativeSound::categoryObject() const { return m_categoryObject; } void QDeclarativeSound::setCategoryObject(QDeclarativeAudioCategory *categoryObject) { m_categoryObject = categoryObject; } QQmlListProperty QDeclarativeSound::playVariationlist() { return QQmlListProperty(this, 0, appendFunction, 0, 0, 0); } QList& QDeclarativeSound::playlist() { return m_playlist; } void QDeclarativeSound::appendFunction(QQmlListProperty *property, QDeclarativePlayVariation *value) { QDeclarativeSound *sound = static_cast(property->object); if (sound->m_complete) { qWarning("Sound: PlayVariation not addable after initialization."); return; } sound->m_playlist.append(value); } /*! \qmlmethod QtAudioEngine1::Sound::play() Creates a new \l SoundInstance and starts playing. Position, direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play() { play(QVector3D(), QVector3D(), QVector3D(), 1, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(gain) Creates a new SoundInstance and starts playing with the adjusted \a gain. Position, direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play(qreal gain) { play(QVector3D(), QVector3D(), QVector3D(), gain, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(gain, pitch) Creates a new SoundInstance and starts playing with the adjusted \a gain and \a pitch. Position, direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play(qreal gain, qreal pitch) { play(QVector3D(), QVector3D(), QVector3D(), gain, pitch); } /*! \qmlmethod QtAudioEngine1::Sound::play(position) Creates a new SoundInstance and starts playing with specified \a position. Direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position) { play(position, QVector3D(), QVector3D(), 1, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity) Creates a new SoundInstance and starts playing with specified \a position and \a velocity. Direction is set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity) { play(position, velocity, QVector3D(), 1, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity, direction) Creates a new SoundInstance and starts playing with specified \a position, \a velocity and \a direction. */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction) { play(position, velocity, direction, 1, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, gain) Creates a new SoundInstance and starts playing with specified \a position and adjusted \a gain. Direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position, qreal gain) { play(position, QVector3D(), QVector3D(), gain, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity, gain) Creates a new SoundInstance and starts playing with specified \a position, \a velocity and adjusted \a gain. Direction is set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, qreal gain) { play(position, velocity, QVector3D(), gain, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity, direction, gain) Creates a new SoundInstance and starts playing with specified \a position, \a velocity, \a direction and adjusted \a gain. */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain) { play(position, velocity, direction, gain, 1); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, gain, pitch) Creates a new SoundInstance and starts playing with specified \a position, adjusted \a gain and \a pitch. Direction and velocity are all set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position, qreal gain, qreal pitch) { play(position, QVector3D(), QVector3D(), gain, pitch); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity, gain, pitch) Creates a new SoundInstance and starts playing with specified \a position, \a velocity, adjusted \a gain and \a pitch. Direction is set to \c "0,0,0". */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, qreal gain, qreal pitch) { play(position, velocity, QVector3D(), gain, pitch); } /*! \qmlmethod QtAudioEngine1::Sound::play(position, velocity, direction, gain, pitch) Creates a new SoundInstance and starts playing with specified \a position, \a velocity, \a direction, adjusted \a gain and \a pitch. */ void QDeclarativeSound::play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain, qreal pitch) { if (!m_complete) { qWarning() << "AudioEngine::play not ready!"; return; } QDeclarativeSoundInstance *instance = this->newInstance(true); if (!instance) return; instance->setPosition(position); instance->setVelocity(velocity); instance->setDirection(direction); instance->setGain(gain); instance->setPitch(pitch); instance->setConeInnerAngle(cone()->innerAngle()); instance->setConeOuterAngle(cone()->outerAngle()); instance->setConeOuterGain(cone()->outerGain()); instance->play(); #ifdef DEBUG_AUDIOENGINE qDebug() << "Sound[" << m_name << "] play (" << position << "," << velocity <<"," << direction << "," << gain << "," << pitch << ")triggered"; #endif } /*! \qmlmethod QtAudioEngine1::SoundInstance QtAudioEngine1::Sound::newInstance() Returns a new \l SoundInstance. */ QDeclarativeSoundInstance* QDeclarativeSound::newInstance() { return newInstance(false); } QDeclarativeSoundInstance* QDeclarativeSound::newInstance(bool managed) { QDeclarativeSoundInstance *instance = qobject_cast(this->parent())->newDeclarativeSoundInstance(managed); instance->setSound(m_name); return instance; } qdeclarative_sound_p.h000066400000000000000000000142001225012771600336340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVESOUND_P_H #define QDECLARATIVESOUND_P_H #include #include #include #include "qdeclarative_playvariation_p.h" QT_BEGIN_NAMESPACE class QDeclarativeAudioCategory; class QDeclarativeAttenuationModel; class QDeclarativeSoundInstance; class QDeclarativeSoundCone : public QObject { Q_OBJECT Q_PROPERTY(qreal innerAngle READ innerAngle WRITE setInnerAngle) Q_PROPERTY(qreal outerAngle READ outerAngle WRITE setOuterAngle) Q_PROPERTY(qreal outerGain READ outerGain WRITE setOuterGain) public: QDeclarativeSoundCone(QObject *parent = 0); //by degree qreal innerAngle() const; void setInnerAngle(qreal innerAngle); //by degree qreal outerAngle() const; void setOuterAngle(qreal outerAngle); qreal outerGain() const; void setOuterGain(qreal outerGain); void componentComplete(); private: Q_DISABLE_COPY(QDeclarativeSoundCone) qreal m_innerAngle; qreal m_outerAngle; qreal m_outerGain; }; class QDeclarativeSound : public QObject, public QQmlParserStatus { friend class QDeclarativeSoundCone; Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(PlayType playType READ playType WRITE setPlayType) Q_PROPERTY(QString category READ category WRITE setCategory) Q_PROPERTY(QDeclarativeSoundCone* cone READ cone CONSTANT) Q_PROPERTY(QString attenuationModel READ attenuationModel WRITE setAttenuationModel) Q_PROPERTY(QQmlListProperty playVariationlist READ playVariationlist CONSTANT) Q_CLASSINFO("DefaultProperty", "playVariationlist") Q_ENUMS(PlayType) public: enum PlayType { Random, Sequential }; QDeclarativeSound(QObject *parent = 0); ~QDeclarativeSound(); void classBegin(); void componentComplete(); PlayType playType() const; void setPlayType(PlayType playType); QString category() const; void setCategory(const QString& category); QString name() const; void setName(const QString& name); QString attenuationModel() const; void setAttenuationModel(QString attenuationModel); QDeclarativeSoundCone* cone() const; QDeclarativeAttenuationModel* attenuationModelObject() const; void setAttenuationModelObject(QDeclarativeAttenuationModel *attenuationModelObject); QDeclarativeAudioCategory* categoryObject() const; void setCategoryObject(QDeclarativeAudioCategory *categoryObject); int genVariationIndex(int oldVariationIndex); QDeclarativePlayVariation* getVariation(int index); //This is used for tracking new PlayVariation declared inside Sound QQmlListProperty playVariationlist(); QList& playlist(); public Q_SLOTS: void play(); void play(qreal gain); void play(qreal gain, qreal pitch); void play(const QVector3D& position); void play(const QVector3D& position, const QVector3D& velocity); void play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction); void play(const QVector3D& position, qreal gain); void play(const QVector3D& position, const QVector3D& velocity, qreal gain); void play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain); void play(const QVector3D& position, qreal gain, qreal pitch); void play(const QVector3D& position, const QVector3D& velocity, qreal gain, qreal pitch); void play(const QVector3D& position, const QVector3D& velocity, const QVector3D& direction, qreal gain, qreal pitch); QDeclarativeSoundInstance* newInstance(); private: Q_DISABLE_COPY(QDeclarativeSound) QDeclarativeSoundInstance* newInstance(bool managed); static void appendFunction(QQmlListProperty *property, QDeclarativePlayVariation *value); bool m_complete; PlayType m_playType; QString m_name; QString m_category; QString m_attenuationModel; QList m_playlist; QDeclarativeSoundCone *m_cone; QDeclarativeAttenuationModel *m_attenuationModelObject; QDeclarativeAudioCategory *m_categoryObject; }; QT_END_NAMESPACE #endif qdeclarative_soundinstance_p.cpp000066400000000000000000000345051225012771600357260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarative_soundinstance_p.h" #include "qdeclarative_sound_p.h" #include "qdeclarative_audioengine_p.h" #include "qaudioengine_p.h" #include "qsoundinstance_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE /*! \qmltype SoundInstance \instantiates QDeclarativeSoundInstance \since 1.0 \brief Play 3d audio content. \inqmlmodule QtAudioEngine 1.0 \ingroup multimedia_audioengine \inherits Item \preliminary This type is part of the \b{QtAudioEngine 1.0} module. There are two ways to create SoundInstance objects. You can obtain it by calling newInstance method of a \l Sound: \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { id:root color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion01" source: "explosion-01.wav" } Sound { name:"explosion" PlayVariation { sample:"explosion01" } } } property variant soundEffect: audioengine.sounds["explosion"].newInstance(); MouseArea { anchors.fill: parent onPressed: { root.soundEffect.play(); } } } \endqml Or alternatively, you can explicitly define SoundInstance outside of AudioEngine for easier qml bindings: \qml import QtQuick 2.0 import QtAudioEngine 1.0 Rectangle { id:root color:"white" width: 300 height: 500 AudioEngine { id:audioengine AudioSample { name:"explosion01" source: "explosion-01.wav" } Sound { name:"explosion" PlayVariation { sample:"explosion01" } } } Item { id: animator x: 10 + observer.percent * 100 y: 20 + observer.percent * 80 property real percent: 0 SequentialAnimation on percent { loops: Animation.Infinite running: true NumberAnimation { duration: 8000 from: 0 to: 1 } } } SoundInstance { id:soundEffect engine:audioengine sound:"explosion" position:Qt.vector3d(animator.x, animator.y, 0); } MouseArea { anchors.fill: parent onPressed: { soundEffect.play(); } } } \endqml */ QDeclarativeSoundInstance::QDeclarativeSoundInstance(QObject *parent) : QObject(parent) , m_position(0, 0, 0) , m_direction(0, 1, 0) , m_velocity(0, 0, 0) , m_gain(1) , m_pitch(1) , m_requestState(QDeclarativeSoundInstance::StoppedState) , m_coneInnerAngle(360) , m_coneOuterAngle(360) , m_coneOuterGain(0) , m_instance(0) , m_engine(0) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::ctor()"; #endif } /*! \qmlproperty QtAudioEngine1::AudioEngine QtAudioEngine1::SoundInstance::engine This property holds the reference to AudioEngine, must be set only once. */ QDeclarativeAudioEngine* QDeclarativeSoundInstance::engine() const { return m_engine; } void QDeclarativeSoundInstance::setEngine(QDeclarativeAudioEngine *engine) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::setEngine(" << engine << ")"; #endif if (!engine) return; if (m_engine) { qWarning("SoundInstance: you can not set different value for engine property"); return; } m_engine = engine; if (!m_engine->isReady()) { connect(m_engine, SIGNAL(ready()), this, SLOT(engineComplete())); } else { engineComplete(); } } void QDeclarativeSoundInstance::engineComplete() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::engineComplete()"; #endif disconnect(m_engine, SIGNAL(ready()), this, SLOT(engineComplete())); if (m_sound.isEmpty()) return; //rebind to actual engine resource QString sound = m_sound; m_sound.clear(); setSound(sound); } QDeclarativeSoundInstance::~QDeclarativeSoundInstance() { } /*! \qmlproperty string QtAudioEngine1::SoundInstance::sound This property specifies which Sound this SoundInstance will use. Unlike some properties in other types, this property can be changed dynamically. */ QString QDeclarativeSoundInstance::sound() const { return m_sound; } void QDeclarativeSoundInstance::setSound(const QString& sound) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::setSound(" << sound << ")"; #endif if (m_sound == sound) return; if (!m_engine || !m_engine->isReady()) { m_sound = sound; emit soundChanged(); return; } #ifdef DEBUG_AUDIOENGINE qDebug() << "SoundInstance switch sound from [" << m_sound << "] to [" << sound << "]"; #endif stop(); dropInstance(); m_sound = sound; if (!m_sound.isEmpty()) { m_instance = m_engine->newSoundInstance(m_sound); connect(m_instance, SIGNAL(stateChanged(QSoundInstance::State)), this, SLOT(handleStateChanged())); m_instance->setPosition(m_position); m_instance->setDirection(m_direction); m_instance->setVelocity(m_velocity); m_instance->setGain(m_gain); m_instance->setPitch(m_pitch); m_instance->setCone(m_coneInnerAngle, m_coneOuterAngle, m_coneOuterGain); if (m_requestState == QDeclarativeSoundInstance::PlayingState) { m_instance->play(); } else if (m_requestState == QDeclarativeSoundInstance::PausedState) { m_instance->pause(); } } emit soundChanged(); } void QDeclarativeSoundInstance::dropInstance() { if (m_instance) { disconnect(m_instance, SIGNAL(stateChanged(QSoundInstance::State)), this, SLOT(handleStateChanged())); m_engine->releaseSoundInstance(m_instance); m_instance = 0; } } /*! \qmlproperty enumeration QtAudioEngine1::SoundInstance::state This property holds the current playback state. It can be one of: \table \header \li Value \li Description \row \li StopppedState \li The SoundInstance is not playing, and when playback begins next it will play from position zero. \row \li PlayingState \li The SoundInstance is playing the media. \row \li PausedState \li The SoundInstance is not playing, and when playback begins next it will play from the position that it was paused at. \endtable */ QDeclarativeSoundInstance::State QDeclarativeSoundInstance::state() const { if (m_instance) return State(m_instance->state()); return m_requestState; } /*! \qmlmethod QtAudioEngine1::SoundInstance::play() Starts playback. */ void QDeclarativeSoundInstance::play() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::play()"; #endif if (!m_instance) { m_requestState = QDeclarativeSoundInstance::PlayingState; return; } m_instance->play(); } /*! \qmlmethod QtAudioEngine1::SoundInstance::play() Stops current playback. */ void QDeclarativeSoundInstance::stop() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::stop()"; #endif m_requestState = QDeclarativeSoundInstance::StoppedState; if (!m_instance) return; m_instance->stop(); } /*! \qmlmethod QtAudioEngine1::SoundInstance::play() Pauses current playback. */ void QDeclarativeSoundInstance::pause() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QDeclarativeSoundInstance::pause()"; #endif if (!m_instance) { m_requestState = QDeclarativeSoundInstance::PausedState; return; } m_instance->pause(); } void QDeclarativeSoundInstance::updatePosition(qreal deltaTime) { if (!m_instance || deltaTime == 0 || m_velocity.lengthSquared() == 0) return; setPosition(m_position + m_velocity * deltaTime); } /*! \qmlproperty vector3d QtAudioEngine1::SoundInstance::position This property holds the current 3d position. */ QVector3D QDeclarativeSoundInstance::position() const { return m_position; } void QDeclarativeSoundInstance::setPosition(const QVector3D& position) { if (m_position == position) return; m_position = position; emit positionChanged(); if (!m_instance) { return; } m_instance->setPosition(m_position); } /*! \qmlproperty vector3d QtAudioEngine1::SoundInstance::direction This property holds the current 3d direction. */ QVector3D QDeclarativeSoundInstance::direction() const { return m_direction; } void QDeclarativeSoundInstance::setDirection(const QVector3D& direction) { if (m_direction == direction) return; m_direction = direction; emit directionChanged(); if (!m_instance) { return; } m_instance->setDirection(m_direction); } /*! \qmlproperty vector3d QtAudioEngine1::SoundInstance::velocity This property holds the current 3d velocity. */ QVector3D QDeclarativeSoundInstance::velocity() const { return m_velocity; } void QDeclarativeSoundInstance::setVelocity(const QVector3D& velocity) { if (m_velocity == velocity) return; m_velocity = velocity; emit velocityChanged(); if (!m_instance) return; m_instance->setVelocity(m_velocity); } /*! \qmlproperty vector3d QtAudioEngine1::SoundInstance::gain This property holds the gain adjustment which will be used to modulate the audio output level from this SoundInstance. */ qreal QDeclarativeSoundInstance::gain() const { return m_gain; } void QDeclarativeSoundInstance::setGain(qreal gain) { if (gain == m_gain) return; if (gain < 0) { qWarning("gain must be a positive value!"); return; } m_gain = gain; emit gainChanged(); if (!m_instance) return; m_instance->setGain(m_gain); } /*! \qmlproperty vector3d QtAudioEngine1::SoundInstance::pitch This property holds the pitch adjustment which will be used to modulate the audio pitch from this SoundInstance. */ qreal QDeclarativeSoundInstance::pitch() const { return m_pitch; } void QDeclarativeSoundInstance::setPitch(qreal pitch) { if (pitch == m_pitch) return; if (pitch < 0) { qWarning("pitch must be a positive value!"); return; } m_pitch = pitch; emit pitchChanged(); if (!m_instance) return; m_instance->setPitch(m_pitch); } void QDeclarativeSoundInstance::setConeInnerAngle(qreal innerAngle) { if (m_coneInnerAngle == innerAngle) return; m_coneInnerAngle = innerAngle; if (!m_instance) return; m_instance->setCone(m_coneInnerAngle, m_coneOuterAngle, m_coneOuterGain); } void QDeclarativeSoundInstance::setConeOuterAngle(qreal outerAngle) { if (m_coneOuterAngle == outerAngle) return; m_coneOuterAngle = outerAngle; if (!m_instance) return; m_instance->setCone(m_coneInnerAngle, m_coneOuterAngle, m_coneOuterGain); } void QDeclarativeSoundInstance::setConeOuterGain(qreal outerGain) { if (m_coneOuterGain == outerGain) return; m_coneOuterGain = outerGain; if (!m_instance) return; m_instance->setCone(m_coneInnerAngle, m_coneOuterAngle, m_coneOuterGain); } void QDeclarativeSoundInstance::handleStateChanged() { emit stateChanged(); } /*! \qmlsignal QtAudioEngine1::SoundInstance::onStateChanged(state) This handler is called when \l state is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onPositionChanged() This handler is called when \l position is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onDirectionChanged() This handler is called when \l direction is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onVelocityChanged() This handler is called when \l velocity is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onGainChanged() This handler is called when \l gain is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onPitchChanged() This handler is called when \l pitch is changed */ /*! \qmlsignal QtAudioEngine1::SoundInstance::onSoundChanged() This handler is called when \l sound is changed */ qdeclarative_soundinstance_p.h000066400000000000000000000112101225012771600353570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVE_SOUNDINSTANCE_P_H #define QDECLARATIVE_SOUNDINSTANCE_P_H #include #include #include "qsoundinstance_p.h" QT_BEGIN_NAMESPACE class QDeclarativeSound; class QAudioEngine; class QDeclarativeAudioEngine; class QDeclarativeSoundInstance : public QObject { Q_OBJECT Q_PROPERTY(QDeclarativeAudioEngine* engine READ engine WRITE setEngine) Q_PROPERTY(QString sound READ sound WRITE setSound NOTIFY soundChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(QVector3D direction READ direction WRITE setDirection NOTIFY directionChanged) Q_PROPERTY(QVector3D velocity READ velocity WRITE setVelocity NOTIFY velocityChanged) Q_PROPERTY(qreal gain READ gain WRITE setGain NOTIFY gainChanged) Q_PROPERTY(qreal pitch READ pitch WRITE setPitch NOTIFY pitchChanged) Q_ENUMS(State) public: enum State { StoppedState = QSoundInstance::StoppedState, PlayingState = QSoundInstance::PlayingState, PausedState = QSoundInstance::PausedState }; QDeclarativeSoundInstance(QObject *parent = 0); ~QDeclarativeSoundInstance(); QDeclarativeAudioEngine* engine() const; void setEngine(QDeclarativeAudioEngine *engine); QString sound() const; void setSound(const QString& sound); State state() const; QVector3D position() const; void setPosition(const QVector3D& position); QVector3D direction() const; void setDirection(const QVector3D& direction); QVector3D velocity() const; void setVelocity(const QVector3D& velocity); qreal gain() const; void setGain(qreal gain); qreal pitch() const; void setPitch(qreal pitch); void setConeInnerAngle(qreal innerAngle); void setConeOuterAngle(qreal outerAngle); void setConeOuterGain(qreal outerGain); Q_SIGNALS: void stateChanged(); void positionChanged(); void directionChanged(); void velocityChanged(); void gainChanged(); void pitchChanged(); void soundChanged(); public Q_SLOTS: void play(); void stop(); void pause(); void updatePosition(qreal deltaTime); private Q_SLOTS: void handleStateChanged(); private: Q_DISABLE_COPY(QDeclarativeSoundInstance); QString m_sound; QVector3D m_position; QVector3D m_direction; QVector3D m_velocity; qreal m_gain; qreal m_pitch; State m_requestState; qreal m_coneInnerAngle; qreal m_coneOuterAngle; qreal m_coneOuterGain; void dropInstance(); QSoundInstance *m_instance; QDeclarativeAudioEngine *m_engine; private Q_SLOTS: void engineComplete(); }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/qmldir000066400000000000000000000001161225012771600305630ustar00rootroot00000000000000module QtAudioEngine plugin declarative_audioengine typeinfo plugins.qmltypes qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/qsoundbuffer_p.h000066400000000000000000000044241225012771600325510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDBUFFER_P_H #define QSOUNDBUFFER_P_H #include QT_BEGIN_NAMESPACE class QSoundBuffer : public QObject { Q_OBJECT public: virtual bool isReady() const = 0; virtual void load() = 0; Q_SIGNALS: void ready(); void error(); protected: QSoundBuffer(QObject *parent); }; QT_END_NAMESPACE #endif // QSOUNDBUFFER_P_H qsoundinstance_p.cpp000066400000000000000000000250401225012771600333550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsoundinstance_p.h" #include "qsoundsource_p.h" #include "qsoundbuffer_p.h" #include "qdeclarative_sound_p.h" #include "qdeclarative_audiocategory_p.h" #include "qdeclarative_audiosample_p.h" #include "qdeclarative_attenuationmodel_p.h" #include "qdeclarative_playvariation_p.h" #include "qdeclarative_audioengine_p.h" #include "qdeclarative_audiolistener_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_BEGIN_NAMESPACE QSoundInstance::QSoundInstance(QObject *parent) : QObject(parent) , m_soundSource(0) , m_bindBuffer(0) , m_sound(0) , m_variationIndex(-1) , m_isReady(false) , m_gain(1) , m_attenuationGain(1) , m_varGain(1) , m_pitch(1) , m_varPitch(1) , m_state(QSoundInstance::StoppedState) , m_coneOuterGain(0) , m_engine(0) { #ifdef DEBUG_AUDIOENGINE qDebug() << "creating new QSoundInstance"; #endif m_engine = qobject_cast(parent); } void QSoundInstance::bindSoundDescription(QDeclarativeSound *sound) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance::bindSoundDescription" << sound; #endif if (m_sound == sound) return; if (m_sound && m_sound->categoryObject()) { disconnect(m_sound->categoryObject(), SIGNAL(volumeChanged(qreal)), this, SLOT(categoryVolumeChanged())); disconnect(m_sound->categoryObject(), SIGNAL(paused()), this, SLOT(pause())); disconnect(m_sound->categoryObject(), SIGNAL(stopped()), this, SLOT(stop())); disconnect(m_sound->categoryObject(), SIGNAL(resumed()), this, SLOT(resume())); } m_attenuationGain = 1; m_gain = 1; m_sound = sound; if (sound) { if (!m_soundSource) { m_soundSource = m_engine->engine()->createSoundSource(); connect(m_soundSource, SIGNAL(stateChanged(QSoundSource::State)), this, SLOT(handleSourceStateChanged(QSoundSource::State))); } } else { if (m_soundSource) { detach(); m_engine->engine()->releaseSoundSource(m_soundSource); m_soundSource = 0; } } if (m_sound) { if (m_sound->categoryObject()) { connect(m_sound->categoryObject(), SIGNAL(volumeChanged(qreal)), this, SLOT(categoryVolumeChanged())); connect(m_sound->categoryObject(), SIGNAL(paused()), this, SLOT(pause())); connect(m_sound->categoryObject(), SIGNAL(stopped()), this, SLOT(stop())); connect(m_sound->categoryObject(), SIGNAL(resumed()), this, SLOT(resume())); } prepareNewVariation(); } else { m_variationIndex = -1; } } QSoundInstance::~QSoundInstance() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance::dtor()"; #endif if (m_soundSource) { detach(); m_engine->engine()->releaseSoundSource(m_soundSource); } } void QSoundInstance::prepareNewVariation() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance::prepareNewVariation()"; #endif int newVariationIndex = m_sound->genVariationIndex(m_variationIndex); if (newVariationIndex == m_variationIndex) return; QDeclarativePlayVariation *playVar = m_sound->getVariation(newVariationIndex); #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance: generate new play variation [old:" << m_variationIndex << ", new:" << newVariationIndex << "-" << playVar->sample() << "]"; #endif m_variationIndex = newVariationIndex; playVar->applyParameters(this); detach(); m_bindBuffer = playVar->sampleObject()->soundBuffer(); if (m_bindBuffer->isReady()) { Q_ASSERT(m_soundSource); m_soundSource->bindBuffer(m_bindBuffer); m_isReady = true; } else { m_bindBuffer->load(); connect(m_bindBuffer, SIGNAL(ready()), this, SLOT(bufferReady())); } } void QSoundInstance::bufferReady() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance::bufferReady()"; #endif if (!m_soundSource) return; m_soundSource->bindBuffer(m_bindBuffer); disconnect(m_bindBuffer, SIGNAL(ready()), this, SLOT(bufferReady())); m_isReady = true; if (m_state == QSoundInstance::PlayingState) { sourcePlay(); } else if (m_state == QSoundInstance::PausedState) { sourcePause(); } } void QSoundInstance::categoryVolumeChanged() { updateGain(); } void QSoundInstance::handleSourceStateChanged(QSoundSource::State newState) { State ns = State(newState); if (ns == m_state) return; if (ns == QSoundInstance::StoppedState) { prepareNewVariation(); } setState(ns); } void QSoundInstance::setState(State state) { if (state == m_state) return; m_state = state; emit stateChanged(m_state); } qreal QSoundInstance::categoryVolume() const { if (!m_sound) return 1; if (!m_sound->categoryObject()) return 1; return m_sound->categoryObject()->volume(); } void QSoundInstance::sourceStop() { Q_ASSERT(m_soundSource); m_soundSource->stop(); setState(QSoundInstance::StoppedState); } void QSoundInstance::detach() { sourceStop(); m_isReady = false; if (m_soundSource) m_soundSource->unbindBuffer(); if (m_bindBuffer) { disconnect(m_bindBuffer, SIGNAL(ready()), this, SLOT(bufferReady())); m_engine->engine()->releaseSoundBuffer(m_bindBuffer); m_bindBuffer = 0; } } void QSoundInstance::play() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstancePrivate::play()"; #endif if (!m_soundSource || m_state == QSoundInstance::PlayingState) return; if (!m_isReady) { setState(QSoundInstance::PlayingState); return; } sourcePlay(); setState(QSoundInstance::PlayingState); } void QSoundInstance::sourcePlay() { update3DVolume(m_engine->listener()->position()); Q_ASSERT(m_soundSource); m_soundSource->play(); } void QSoundInstance::resume() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstancePrivate::resume()"; #endif if (m_state != QSoundInstance::PausedState) return; play(); } void QSoundInstance::pause() { if (!m_soundSource || m_state == QSoundInstance::PausedState) return; if (!m_isReady) { setState(QSoundInstance::PausedState); return; } sourcePause(); setState(QSoundInstance::PausedState); } void QSoundInstance::sourcePause() { Q_ASSERT(m_soundSource); m_soundSource->pause(); } void QSoundInstance::stop() { if (!m_isReady || !m_soundSource || m_state == QSoundInstance::StoppedState) { setState(QSoundInstance::StoppedState); return; } sourceStop(); prepareNewVariation(); } QSoundInstance::State QSoundInstance::state() const { return m_state; } void QSoundInstance::setPosition(const QVector3D& position) { if (!m_soundSource) return; m_soundSource->setPosition(position); } void QSoundInstance::setDirection(const QVector3D& direction) { if (!m_soundSource) return; m_soundSource->setDirection(direction); } void QSoundInstance::setVelocity(const QVector3D& velocity) { if (!m_soundSource) return; m_soundSource->setVelocity(velocity); } void QSoundInstance::setGain(qreal gain) { if (!m_soundSource) return; m_gain = gain; updateGain(); } void QSoundInstance::setPitch(qreal pitch) { if (!m_soundSource) return; m_pitch = pitch; updatePitch(); } void QSoundInstance::setCone(qreal innerAngle, qreal outerAngle, qreal outerGain) { if (!m_soundSource) return; m_soundSource->setCone(innerAngle, outerAngle, outerGain); } bool QSoundInstance::attenuationEnabled() const { if (!m_sound || !m_sound->attenuationModelObject()) return false; return true; } void QSoundInstance::update3DVolume(const QVector3D& listenerPosition) { if (!m_sound || !m_soundSource) return; QDeclarativeAttenuationModel *attenModel = m_sound->attenuationModelObject(); if (!attenModel) return; m_attenuationGain = attenModel->calculateGain(listenerPosition, m_soundSource->position()); updateGain(); } void QSoundInstance::updateVariationParameters(qreal varPitch, qreal varGain, bool looping) { if (!m_soundSource) return; m_soundSource->setLooping(looping); #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundInstance::updateVariationParameters" << varPitch << varGain << looping; #endif m_varPitch = varPitch; m_varGain = varGain; updatePitch(); updateGain(); } void QSoundInstance::updatePitch() { m_soundSource->setPitch(m_pitch * m_varPitch); } void QSoundInstance::updateGain() { m_soundSource->setGain(m_gain * m_varGain * m_attenuationGain * categoryVolume()); } QT_END_NAMESPACE qsoundinstance_p.h000066400000000000000000000103301225012771600330160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDINSTANCE_P_H #define QSOUNDINSTANCE_P_H #include #include #include "qsoundsource_p.h" QT_BEGIN_NAMESPACE class QDeclarativeSound; class QDeclarativeAudioEngine; class QSoundInstance : public QObject { Q_OBJECT public: explicit QSoundInstance(QObject *parent); ~QSoundInstance(); void play(); enum State { StoppedState = QSoundSource::StoppedState, PlayingState = QSoundSource::PlayingState, PausedState = QSoundSource::PausedState }; State state() const; void setPosition(const QVector3D& position); void setDirection(const QVector3D& direction); void setVelocity(const QVector3D& velocity); //this gain and pitch is used for dynamic user control during execution void setGain(qreal gain); void setPitch(qreal pitch); void setCone(qreal innerAngle, qreal outerAngle, qreal outerGain); //this varPitch and varGain is calculated from config in PlayVariation void updateVariationParameters(qreal varPitch, qreal varGain, bool looping); void bindSoundDescription(QDeclarativeSound *sound); void update3DVolume(const QVector3D& listenerPosition); bool attenuationEnabled() const; Q_SIGNALS: void stateChanged(QSoundInstance::State state); public Q_SLOTS: void pause(); void stop(); private Q_SLOTS: void resume(); void bufferReady(); void categoryVolumeChanged(); void handleSourceStateChanged(QSoundSource::State); private: void setState(State state); void prepareNewVariation(); void detach(); qreal categoryVolume() const; void updatePitch(); void updateGain(); void updateConeOuterGain(); void sourcePlay(); void sourcePause(); void sourceStop(); QSoundSource *m_soundSource; QSoundBuffer *m_bindBuffer; QDeclarativeSound *m_sound; int m_variationIndex; bool m_isReady; //true if the sound source is already bound to some sound buffer qreal m_gain; qreal m_attenuationGain; qreal m_varGain; qreal m_pitch; qreal m_varPitch; State m_state; qreal m_coneOuterGain; QDeclarativeAudioEngine *m_engine; }; QT_END_NAMESPACE #endif // QSOUNDINSTANCE_P_H qsoundsource_openal_p.cpp000066400000000000000000000214031225012771600344060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudioengine_openal_p.h" #include "qdebug.h" #define DEBUG_AUDIOENGINE QT_USE_NAMESPACE QSoundSourcePrivate::QSoundSourcePrivate(QObject *parent) : QSoundSource(parent) , m_alSource(0) , m_bindBuffer(0) , m_isReady(false) , m_state(QSoundSource::StoppedState) , m_gain(0) , m_pitch(0) , m_coneInnerAngle(0) , m_coneOuterAngle(0) , m_coneOuterGain(1) { #ifdef DEBUG_AUDIOENGINE qDebug() << "creating new QSoundSourcePrivate"; #endif alGenSources(1, &m_alSource); QAudioEnginePrivate::checkNoError("create source"); setGain(1); setPitch(1); setCone(360, 360, 0); } QSoundSourcePrivate::~QSoundSourcePrivate() { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundSourcePrivate::dtor"; #endif release(); } void QSoundSourcePrivate::release() { if (m_alSource) { #ifdef DEBUG_AUDIOENGINE qDebug() << "QSoundSourcePrivate::release"; #endif stop(); unbindBuffer(); alDeleteSources(1, &m_alSource); QAudioEnginePrivate::checkNoError("delete source"); m_alSource = 0; } } void QSoundSourcePrivate::bindBuffer(QSoundBuffer* soundBuffer) { unbindBuffer(); Q_ASSERT(soundBuffer->isReady()); m_bindBuffer = qobject_cast(soundBuffer); m_bindBuffer->bindToSource(m_alSource); m_isReady = true; } void QSoundSourcePrivate::unbindBuffer() { if (m_bindBuffer) { m_bindBuffer->unbindFromSource(m_alSource); m_bindBuffer = 0; } m_isReady = false; if (m_state != QSoundSource::StoppedState) { m_state = QSoundSource::StoppedState; emit stateChanged(m_state); } } void QSoundSourcePrivate::play() { if (!m_alSource || !m_isReady) return; alSourcePlay(m_alSource); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("play"); #endif emit activate(this); } bool QSoundSourcePrivate::isLooping() const { if (!m_alSource) return false; ALint looping = 0; alGetSourcei(m_alSource, AL_LOOPING, &looping); return looping == AL_TRUE ? true : false; } void QSoundSourcePrivate::pause() { if (!m_alSource || !m_isReady) return; alSourcePause(m_alSource); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("pause"); #endif } void QSoundSourcePrivate::stop() { if (!m_alSource) return; alSourceStop(m_alSource); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("stop"); #endif } QSoundSource::State QSoundSourcePrivate::state() const { return m_state; } void QSoundSourcePrivate::checkState() { QSoundSource::State st; st = QSoundSource::StoppedState; if (m_alSource && m_isReady) { ALint s; alGetSourcei(m_alSource, AL_SOURCE_STATE, &s); switch (s) { case AL_PLAYING: st = QSoundSource::PlayingState; break; case AL_PAUSED: st = QSoundSource::PausedState; break; } } if (st == m_state) return; m_state = st; emit stateChanged(m_state); } void QSoundSourcePrivate::setLooping(bool looping) { if (!m_alSource) return; alSourcei(m_alSource, AL_LOOPING, looping ? AL_TRUE : AL_FALSE); } void QSoundSourcePrivate::setPosition(const QVector3D& position) { if (!m_alSource) return; alSource3f(m_alSource, AL_POSITION, position.x(), position.y(), position.z()); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set position"); #endif } void QSoundSourcePrivate::setDirection(const QVector3D& direction) { if (!m_alSource) return; alSource3f(m_alSource, AL_DIRECTION, direction.x(), direction.y(), direction.z()); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set direction"); #endif } void QSoundSourcePrivate::setVelocity(const QVector3D& velocity) { if (!m_alSource) return; alSource3f(m_alSource, AL_VELOCITY, velocity.x(), velocity.y(), velocity.z()); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set velocity"); #endif } QVector3D QSoundSourcePrivate::velocity() const { if (!m_alSource) return QVector3D(0, 0, 0); ALfloat x, y, z; alGetSource3f(m_alSource, AL_VELOCITY, &x, &y, &z); return QVector3D(x, y, z); } QVector3D QSoundSourcePrivate::position() const { if (!m_alSource) return QVector3D(0, 0, 0); ALfloat x, y, z; alGetSource3f(m_alSource, AL_POSITION, &x, &y, &z); return QVector3D(x, y, z); } QVector3D QSoundSourcePrivate::direction() const { if (!m_alSource) return QVector3D(0, 1, 0); ALfloat x, y, z; alGetSource3f(m_alSource, AL_DIRECTION, &x, &y, &z); return QVector3D(x, y, z); } void QSoundSourcePrivate::setGain(qreal gain) { if (!m_alSource || gain == m_gain) return; alSourcef(m_alSource, AL_GAIN, gain); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set gain"); #endif m_gain = gain; } void QSoundSourcePrivate::setPitch(qreal pitch) { if (!m_alSource || m_pitch == pitch) return; alSourcef(m_alSource, AL_PITCH, pitch); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set pitch"); #endif m_pitch = pitch; } void QSoundSourcePrivate::setCone(qreal innerAngle, qreal outerAngle, qreal outerGain) { if (innerAngle > outerAngle) outerAngle = innerAngle; Q_ASSERT(outerAngle <= 360 && innerAngle >= 0); //make sure the setting order will always keep outerAngle >= innerAngle in openAL if (outerAngle >= m_coneInnerAngle) { if (m_coneOuterAngle != outerAngle) { alSourcef(m_alSource, AL_CONE_OUTER_ANGLE, outerAngle); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set cone outerAngle"); #endif m_coneOuterAngle = outerAngle; } if (m_coneInnerAngle != innerAngle) { alSourcef(m_alSource, AL_CONE_INNER_ANGLE, innerAngle); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set cone innerAngle"); #endif m_coneInnerAngle = innerAngle; } } else { if (m_coneInnerAngle != innerAngle) { alSourcef(m_alSource, AL_CONE_INNER_ANGLE, innerAngle); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set cone innerAngle"); #endif m_coneInnerAngle = innerAngle; } if (m_coneOuterAngle != outerAngle) { alSourcef(m_alSource, AL_CONE_OUTER_ANGLE, outerAngle); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set cone outerAngle"); #endif m_coneOuterAngle = outerAngle; } } if (outerGain != m_coneOuterGain) { alSourcef(m_alSource, AL_CONE_OUTER_GAIN, outerGain); #ifdef DEBUG_AUDIOENGINE QAudioEnginePrivate::checkNoError("source set cone outerGain"); #endif m_coneOuterGain = outerGain; } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/audioengine/qsoundsource_p.h000066400000000000000000000061201225012771600325730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDSOURCE_P_H #define QSOUNDSOURCE_P_H #include #include QT_BEGIN_NAMESPACE class QSoundBuffer; class QSoundSource : public QObject { Q_OBJECT public: enum State { StoppedState, PlayingState, PausedState }; virtual void play() = 0; virtual void pause() = 0; virtual void stop() = 0; virtual QSoundSource::State state() const = 0; virtual void setLooping(bool looping) = 0; virtual void setDirection(const QVector3D& direction) = 0; virtual void setPosition(const QVector3D& position) = 0; virtual void setVelocity(const QVector3D& velocity) = 0; virtual QVector3D velocity() const = 0; virtual QVector3D position() const = 0; virtual QVector3D direction() const = 0; virtual void setGain(qreal gain) = 0; virtual void setPitch(qreal pitch) = 0; virtual void setCone(qreal innerAngle, qreal outerAngle, qreal outerGain) = 0; virtual void bindBuffer(QSoundBuffer*) = 0; virtual void unbindBuffer() = 0; Q_SIGNALS: void stateChanged(QSoundSource::State newState); protected: QSoundSource(QObject *parent); }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/imports.pro000066400000000000000000000001211225012771600272740ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += multimedia config_openal: SUBDIRS += audioengine qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/000077500000000000000000000000001225012771600272155ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/Video.qml000066400000000000000000000526521225012771600310100ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtMultimedia 5.0 /*! \qmltype Video \inherits Item \ingroup multimedia_qml \ingroup multimedia_video_qml \inqmlmodule QtMultimedia 5.0 \brief A convenience type for showing a specified video. \c Video is a convenience type combining the functionality of a \l MediaPlayer and a \l VideoOutput into one. It provides simple video playback functionality without having to declare multiple types. \qml import QtQuick 2.0 import QtMultimedia 5.0 Video { id: video width : 800 height : 600 source: "video.avi" MouseArea { anchors.fill: parent onClicked: { video.play() } } focus: true Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play() Keys.onLeftPressed: video.seek(video.position - 5000) Keys.onRightPressed: video.seek(video.position + 5000) } \endqml \c Video supports untransformed, stretched, and uniformly scaled video presentation. For a description of stretched uniformly scaled presentation, see the \l fillMode property description. \sa MediaPlayer, VideoOutput \section1 Screen Saver If it is likely that an application will be playing video for an extended period of time without user interaction, it may be necessary to disable the platform's screen saver. The \l ScreenSaver (from \l QtSystemInfo) may be used to disable the screensaver in this fashion: \qml import QtSystemInfo 5.0 ScreenSaver { screenSaverEnabled: false } \endqml */ Item { id: video /*** Properties of VideoOutput ***/ /*! \qmlproperty enumeration Video::fillMode Set this property to define how the video is scaled to fit the target area. \list \li VideoOutput.Stretch - the video is scaled to fit \li VideoOutput.PreserveAspectFit - the video is scaled uniformly to fit without cropping \li VideoOutput.PreserveAspectCrop - the video is scaled uniformly to fill, cropping if necessary \endlist Because this type is for convenience in QML, it does not support enumerations directly, so enumerations from \c VideoOutput are used to access the available fill modes. The default fill mode is preserveAspectFit. */ property alias fillMode: videoOut.fillMode /*! \qmlproperty int Video::orientation The orientation of the \c Video in degrees. Only multiples of 90 degrees is supported, that is 0, 90, 180, 270, 360, etc. */ property alias orientation: videoOut.orientation /*** Properties of MediaPlayer ***/ /*! \qmlproperty enumeration Video::playbackState This read only property indicates the playback state of the media. \list \li MediaPlayer.PlayingState - the media is playing \li MediaPlayer.PausedState - the media is paused \li MediaPlayer.StoppedState - the media is stopped \endlist The default state is MediaPlayer.StoppedState. */ property alias playbackState: player.playbackState /*! \qmlproperty bool Video::autoLoad This property indicates if loading of media should begin immediately. Defaults to true, if false media will not be loaded until playback is started. */ property alias autoLoad: player.autoLoad /*! \qmlproperty real Video::bufferProgress This property holds how much of the data buffer is currently filled, from 0.0 (empty) to 1.0 (full). */ property alias bufferProgress: player.bufferProgress /*! \qmlproperty int Video::duration This property holds the duration of the media in milliseconds. If the media doesn't have a fixed duration (a live stream for example) this will be 0. */ property alias duration: player.duration /*! \qmlproperty enumeration Video::error This property holds the error state of the video. It can be one of: \list \li MediaPlayer.NoError - there is no current error. \li MediaPlayer.ResourceError - the video cannot be played due to a problem allocating resources. \li MediaPlayer.FormatError - the video format is not supported. \li MediaPlayer.NetworkError - the video cannot be played due to network issues. \li MediaPlayer.AccessDenied - the video cannot be played due to insufficient permissions. \li MediaPlayer.ServiceMissing - the video cannot be played because the media service could not be instantiated. \endlist */ property alias error: player.error /*! \qmlproperty string Video::errorString This property holds a string describing the current error condition in more detail. */ property alias errorString: player.errorString /*! \qmlproperty enumeration Video::availability Returns the availability state of the video instance. This is one of: \table \header \li Value \li Description \row \li MediaPlayer.Available \li The video player is available to use. \row \li MediaPlayer.Busy \li The video player is usually available, but some other process is utilizing the hardware necessary to play media. \row \li MediaPlayer.Unavailable \li There are no supported video playback facilities. \row \li MediaPlayer.ResourceMissing \li There is one or more resources missing, so the video player cannot be used. It may be possible to try again at a later time. \endtable */ property alias availability: player.availability /*! \qmlproperty bool Video::hasAudio This property holds whether the current media has audio content. */ property alias hasAudio: player.hasAudio /*! \qmlproperty bool Video::hasVideo This property holds whether the current media has video content. */ property alias hasVideo: player.hasVideo /* documented below due to length of metaData documentation */ property alias metaData: player.metaData /*! \qmlproperty bool Video::muted This property holds whether the audio output is muted. */ property alias muted: player.muted /*! \qmlproperty real Video::playbackRate This property holds the rate at which video is played at as a multiple of the normal rate. */ property alias playbackRate: player.playbackRate /*! \qmlproperty int Video::position This property holds the current playback position in milliseconds. To change this position, use the \l seek() method. \sa seek() */ property alias position: player.position /*! \qmlproperty bool Video::seekable This property holds whether the playback position of the video can be changed. If true, calling the \l seek() method will cause playback to seek to the new position. */ property alias seekable: player.seekable /*! \qmlproperty url Video::source This property holds the source URL of the media. */ property alias source: player.source /*! \qmlproperty enumeration Video::status This property holds the status of media loading. It can be one of: \list \li MediaPlayer.NoMedia - no media has been set. \li MediaPlayer.Loading - the media is currently being loaded. \li MediaPlayer.Loaded - the media has been loaded. \li MediaPlayer.Buffering - the media is buffering data. \li MediaPlayer.Stalled - playback has been interrupted while the media is buffering data. \li MediaPlayer.Buffered - the media has buffered data. \li MediaPlayer.EndOfMedia - the media has played to the end. \li MediaPlayer.InvalidMedia - the media cannot be played. \li MediaPlayer.UnknownStatus - the status of the media cannot be determined. \endlist */ property alias status: player.status /*! \qmlproperty real Video::volume This property holds the volume of the audio output, from 0.0 (silent) to 1.0 (maximum volume). */ property alias volume: player.volume /*! \qmlproperty bool Video::autoPlay This property determines whether the media should begin playback automatically. Setting to \c true also sets \l autoLoad to \c true. The default is \c false. */ property alias autoPlay: player.autoPlay /*! \qmlsignal Video::paused() This signal is emitted when playback is paused. */ signal paused /*! \qmlsignal Video::stopped() This signal is emitted when playback is stopped. */ signal stopped /*! \qmlsignal Video::playing() This signal is emitted when playback is started or continued. */ signal playing VideoOutput { id: videoOut anchors.fill: video source: player } MediaPlayer { id: player onPaused: video.paused() onStopped: video.stopped() onPlaying: video.playing() } /*! \qmlmethod Video::play() Starts playback of the media. */ function play() { player.play(); } /*! \qmlmethod Video::pause() Pauses playback of the media. */ function pause() { player.pause(); } /*! \qmlmethod Video::stop() Stops playback of the media. */ function stop() { player.stop(); } /*! \qmlmethod Video::seek(offset) If the \l seekable property is true, seeks the current playback position to \a offset. Seeking may be asynchronous, so the \l position property may not be updated immediately. \sa seekable, position */ function seek(offset) { player.seek(offset); } } // *************************************** // Documentation for meta-data properties. // *************************************** /*! \qmlproperty variant Video::metaData This property holds a collection of all the meta-data for the media. You can access individual properties like \l {Video::metaData.title}{metaData.title} or \l {Video::metaData.trackNumber} {metaData.trackNumber}. */ /*! \qmlproperty variant Video::metaData.title This property holds the title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.subTitle This property holds the sub-title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.author This property holds the author of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.comment This property holds a user comment about the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.description This property holds a description of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.category This property holds the category of the media \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.genre This property holds the genre of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.year This property holds the year of release of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.date This property holds the date of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.userRating This property holds a user rating of the media in the range of 0 to 100. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.keywords This property holds a list of keywords describing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.language This property holds the language of the media, as an ISO 639-2 code. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.publisher This property holds the publisher of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.copyright This property holds the media's copyright notice. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.parentalRating This property holds the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.ratingOrganization This property holds the name of the rating organization responsible for the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.size This property property holds the size of the media in bytes. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.mediaType This property holds the type of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.audioBitRate This property holds the bit rate of the media's audio stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.audioCodec This property holds the encoding of the media audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.averageLevel This property holds the average volume level of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.channelCount This property holds the number of channels in the media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.peakValue This property holds the peak volume of the media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.sampleRate This property holds the sample rate of the media's audio stream in Hertz. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.albumTitle This property holds the title of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.albumArtist This property holds the name of the principal artist of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.contributingArtist This property holds the names of artists contributing to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.composer This property holds the composer of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.conductor This property holds the conductor of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.lyrics This property holds the lyrics to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.mood This property holds the mood of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.trackNumber This property holds the track number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.trackCount This property holds the number of track on the album containing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.coverArtUrlSmall This property holds the URL of a small cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.coverArtUrlLarge This property holds the URL of a large cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.resolution This property holds the dimension of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.pixelAspectRatio This property holds the pixel aspect ratio of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.videoFrameRate This property holds the frame rate of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.videoBitRate This property holds the bit rate of the media's video stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.videoCodec This property holds the encoding of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.posterUrl This property holds the URL of a poster image. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.chapterNumber This property holds the chapter number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.director This property holds the director of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.leadPerformer This property holds the lead performer in the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.writer This property holds the writer of the media. \sa {QMediaMetaData} */ // The remaining properties are related to photos, and are technically // available but will certainly never have values. /*! \qmlproperty variant Video::metaData.cameraManufacturer \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.cameraModel \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.event \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.subject \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.orientation \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.exposureTime \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.fNumber \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.exposureProgram \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.isoSpeedRatings \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.exposureBiasValue \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.dateTimeDigitized \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.subjectDistance \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.meteringMode \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.lightSource \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.flash \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.focalLength \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.exposureMode \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.whiteBalance \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.DigitalZoomRatio \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.focalLengthIn35mmFilm \sa {QMediaMetaData::FocalLengthIn35mmFile} */ /*! \qmlproperty variant Video::metaData.sceneCaptureType \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.gainControl \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.contrast \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.saturation \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.sharpness \sa {QMediaMetaData} */ /*! \qmlproperty variant Video::metaData.deviceSettingDescription \sa {QMediaMetaData} */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/multimedia.cpp000066400000000000000000000112551225012771600320570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qsoundeffect.h" #include "qdeclarativemediametadata_p.h" #include "qdeclarativeaudio_p.h" #include "qdeclarativevideooutput_p.h" #include "qdeclarativeradio_p.h" #include "qdeclarativeradiodata_p.h" #include "qdeclarativecamera_p.h" #include "qdeclarativecamerapreviewprovider_p.h" #include "qdeclarativecameraexposure_p.h" #include "qdeclarativecameraflash_p.h" #include "qdeclarativecamerafocus_p.h" #include "qdeclarativecameraimageprocessing_p.h" #include "qdeclarativetorch_p.h" QML_DECLARE_TYPE(QSoundEffect) QT_BEGIN_NAMESPACE class QMultimediaDeclarativeModule : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") public: virtual void registerTypes(const char *uri) { Q_ASSERT(QLatin1String(uri) == QLatin1String("QtMultimedia")); qmlRegisterType(uri, 5, 0, "SoundEffect"); qmlRegisterType(uri, 5, 0, "Audio"); qmlRegisterType(uri, 5, 0, "MediaPlayer"); qmlRegisterType(uri, 5, 0, "VideoOutput"); qmlRegisterType(uri, 5, 0, "Radio"); qmlRegisterType(uri, 5, 0, "RadioData"); qmlRegisterType(uri, 5, 0, "Camera"); qmlRegisterType(uri, 5, 0, "Torch"); qmlRegisterUncreatableType(uri, 5, 0, "CameraCapture", trUtf8("CameraCapture is provided by Camera")); qmlRegisterUncreatableType(uri, 5, 0, "CameraRecorder", trUtf8("CameraRecorder is provided by Camera")); qmlRegisterUncreatableType(uri, 5, 0, "CameraExposure", trUtf8("CameraExposure is provided by Camera")); qmlRegisterUncreatableType(uri, 5, 0, "CameraFocus", trUtf8("CameraFocus is provided by Camera")); qmlRegisterUncreatableType(uri, 5, 0, "CameraFlash", trUtf8("CameraFlash is provided by Camera")); qmlRegisterUncreatableType(uri, 5, 0, "CameraImageProcessing", trUtf8("CameraImageProcessing is provided by Camera")); qmlRegisterType(); } void initializeEngine(QQmlEngine *engine, const char *uri) { Q_UNUSED(uri); engine->addImageProvider("camera", new QDeclarativeCameraPreviewProvider); } }; QT_END_NAMESPACE #include "multimedia.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/multimedia.pro000066400000000000000000000032001225012771600320640ustar00rootroot00000000000000QT += qml quick network multimedia-private qtmultimediaquicktools-private HEADERS += \ qdeclarativeaudio_p.h \ qdeclarativemediametadata_p.h \ qdeclarativevideooutput_p.h \ qdeclarativevideooutput_backend_p.h \ qdeclarativevideooutput_render_p.h \ qdeclarativevideooutput_window_p.h \ qsgvideonode_i420.h \ qsgvideonode_rgb.h \ qsgvideonode_texture.h \ qdeclarativeradio_p.h \ qdeclarativeradiodata_p.h \ qdeclarativecamera_p.h \ qdeclarativecameracapture_p.h \ qdeclarativecamerarecorder_p.h \ qdeclarativecameraexposure_p.h \ qdeclarativecameraflash_p.h \ qdeclarativecamerafocus_p.h \ qdeclarativecameraimageprocessing_p.h \ qdeclarativecamerapreviewprovider_p.h \ qdeclarativetorch_p.h SOURCES += \ multimedia.cpp \ qdeclarativeaudio.cpp \ qdeclarativevideooutput.cpp \ qdeclarativevideooutput_render.cpp \ qdeclarativevideooutput_window.cpp \ qsgvideonode_i420.cpp \ qsgvideonode_rgb.cpp \ qsgvideonode_texture.cpp \ qdeclarativeradio.cpp \ qdeclarativeradiodata.cpp \ qdeclarativecamera.cpp \ qdeclarativecameracapture.cpp \ qdeclarativecamerarecorder.cpp \ qdeclarativecameraexposure.cpp \ qdeclarativecameraflash.cpp \ qdeclarativecamerafocus.cpp \ qdeclarativecameraimageprocessing.cpp \ qdeclarativecamerapreviewprovider.cpp \ qdeclarativetorch.cpp QML_FILES += \ Video.qml DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 load(qml_plugin) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/plugins.qmltypes000066400000000000000000001265721225012771600325130ustar00rootroot00000000000000import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // // This file was auto-generated with the command 'qmlplugindump -notrelocatable QtMultimedia 5.0'. Module { Component { name: "QCamera" prototype: "QMediaObject" Enum { name: "Status" values: { "UnavailableStatus": 0, "UnloadedStatus": 1, "LoadingStatus": 2, "UnloadingStatus": 3, "LoadedStatus": 4, "StandbyStatus": 5, "StartingStatus": 6, "StoppingStatus": 7, "ActiveStatus": 8 } } Enum { name: "State" values: { "UnloadedState": 0, "LoadedState": 1, "ActiveState": 2 } } Enum { name: "CaptureMode" values: { "CaptureViewfinder": 0, "CaptureStillImage": 1, "CaptureVideo": 2 } } Enum { name: "Error" values: { "NoError": 0, "CameraError": 1, "InvalidRequestError": 2, "ServiceMissingError": 3, "NotSupportedFeatureError": 4 } } Enum { name: "LockStatus" values: { "Unlocked": 0, "Searching": 1, "Locked": 2 } } Enum { name: "LockChangeReason" values: { "UserRequest": 0, "LockAcquired": 1, "LockFailed": 2, "LockLost": 3, "LockTemporaryLost": 4 } } Enum { name: "LockType" values: { "NoLock": 0, "LockExposure": 1, "LockWhiteBalance": 2, "LockFocus": 4 } } Property { name: "state"; type: "QCamera::State"; isReadonly: true } Property { name: "status"; type: "QCamera::Status"; isReadonly: true } Property { name: "captureMode"; type: "QCamera::CaptureModes" } Property { name: "lockStatus"; type: "QCamera::LockStatus"; isReadonly: true } Signal { name: "stateChanged" Parameter { type: "QCamera::State" } } Signal { name: "captureModeChanged" Parameter { type: "QCamera::CaptureModes" } } Signal { name: "statusChanged" Parameter { type: "QCamera::Status" } } Signal { name: "locked" } Signal { name: "lockFailed" } Signal { name: "lockStatusChanged" Parameter { type: "QCamera::LockStatus" } Parameter { type: "QCamera::LockChangeReason" } } Signal { name: "lockStatusChanged" Parameter { type: "QCamera::LockType" } Parameter { type: "QCamera::LockStatus" } Parameter { type: "QCamera::LockChangeReason" } } Signal { name: "error" Parameter { type: "QCamera::Error" } } Method { name: "setCaptureMode" Parameter { name: "mode"; type: "QCamera::CaptureModes" } } Method { name: "load" } Method { name: "unload" } Method { name: "start" } Method { name: "stop" } Method { name: "searchAndLock" } Method { name: "unlock" } Method { name: "searchAndLock" Parameter { name: "locks"; type: "QCamera::LockTypes" } } Method { name: "unlock" Parameter { name: "locks"; type: "QCamera::LockTypes" } } } Component { name: "QDeclarativeAudio" prototype: "QObject" exports: ["QtMultimedia/Audio 5.0", "QtMultimedia/MediaPlayer 5.0"] exportMetaObjectRevisions: [0, 0] Enum { name: "Status" values: { "UnknownStatus": 0, "NoMedia": 1, "Loading": 2, "Loaded": 3, "Stalled": 4, "Buffering": 5, "Buffered": 6, "EndOfMedia": 7, "InvalidMedia": 8 } } Enum { name: "Error" values: { "NoError": 0, "ResourceError": 1, "FormatError": 2, "NetworkError": 3, "AccessDenied": 4, "ServiceMissing": 5 } } Enum { name: "Loop" values: { "Infinite": -1 } } Enum { name: "PlaybackState" values: { "PlayingState": 1, "PausedState": 2, "StoppedState": 0 } } Enum { name: "Availability" values: { "Available": 0, "Busy": 2, "Unavailable": 1, "ResourceMissing": 3 } } Property { name: "source"; type: "QUrl" } Property { name: "loops"; type: "int" } Property { name: "playbackState"; type: "PlaybackState"; isReadonly: true } Property { name: "autoPlay"; type: "bool" } Property { name: "autoLoad"; type: "bool" } Property { name: "status"; type: "Status"; isReadonly: true } Property { name: "duration"; type: "int"; isReadonly: true } Property { name: "position"; type: "int"; isReadonly: true } Property { name: "volume"; type: "double" } Property { name: "muted"; type: "bool" } Property { name: "hasAudio"; type: "bool"; isReadonly: true } Property { name: "hasVideo"; type: "bool"; isReadonly: true } Property { name: "bufferProgress"; type: "double"; isReadonly: true } Property { name: "seekable"; type: "bool"; isReadonly: true } Property { name: "playbackRate"; type: "double" } Property { name: "error"; type: "Error"; isReadonly: true } Property { name: "errorString"; type: "string"; isReadonly: true } Property { name: "metaData" type: "QDeclarativeMediaMetaData" isReadonly: true isPointer: true } Property { name: "mediaObject"; type: "QObject"; isReadonly: true; isPointer: true } Property { name: "availability"; type: "Availability"; isReadonly: true } Signal { name: "loopCountChanged" } Signal { name: "paused" } Signal { name: "stopped" } Signal { name: "playing" } Signal { name: "availabilityChanged" Parameter { name: "availability"; type: "Availability" } } Signal { name: "error" Parameter { name: "error"; type: "QDeclarativeAudio::Error" } Parameter { name: "errorString"; type: "string" } } Method { name: "play" } Method { name: "pause" } Method { name: "stop" } Method { name: "seek" Parameter { name: "position"; type: "int" } } } Component { name: "QDeclarativeCamera" prototype: "QObject" exports: ["QtMultimedia/Camera 5.0"] exportMetaObjectRevisions: [0] Enum { name: "CaptureMode" values: { "CaptureViewfinder": 0, "CaptureStillImage": 1, "CaptureVideo": 2 } } Enum { name: "State" values: { "ActiveState": 2, "LoadedState": 1, "UnloadedState": 0 } } Enum { name: "Status" values: { "UnavailableStatus": 0, "UnloadedStatus": 1, "LoadingStatus": 2, "UnloadingStatus": 3, "LoadedStatus": 4, "StandbyStatus": 5, "StartingStatus": 6, "StoppingStatus": 7, "ActiveStatus": 8 } } Enum { name: "LockStatus" values: { "Unlocked": 0, "Searching": 1, "Locked": 2 } } Enum { name: "Error" values: { "NoError": 0, "CameraError": 1, "InvalidRequestError": 2, "ServiceMissingError": 3, "NotSupportedFeatureError": 4 } } Enum { name: "FlashMode" values: { "FlashAuto": 1, "FlashOff": 2, "FlashOn": 4, "FlashRedEyeReduction": 8, "FlashFill": 16, "FlashTorch": 32, "FlashVideoLight": 64, "FlashSlowSyncFrontCurtain": 128, "FlashSlowSyncRearCurtain": 256, "FlashManual": 512 } } Enum { name: "ExposureMode" values: { "ExposureAuto": 0, "ExposureManual": 1, "ExposurePortrait": 2, "ExposureNight": 3, "ExposureBacklight": 4, "ExposureSpotlight": 5, "ExposureSports": 6, "ExposureSnow": 7, "ExposureBeach": 8, "ExposureLargeAperture": 9, "ExposureSmallAperture": 10, "ExposureModeVendor": 1000 } } Enum { name: "MeteringMode" values: { "MeteringMatrix": 1, "MeteringAverage": 2, "MeteringSpot": 3 } } Enum { name: "FocusMode" values: { "FocusManual": 1, "FocusHyperfocal": 2, "FocusInfinity": 4, "FocusAuto": 8, "FocusContinuous": 16, "FocusMacro": 32 } } Enum { name: "FocusPointMode" values: { "FocusPointAuto": 0, "FocusPointCenter": 1, "FocusPointFaceDetection": 2, "FocusPointCustom": 3 } } Enum { name: "FocusAreaStatus" values: { "FocusAreaUnused": 1, "FocusAreaSelected": 2, "FocusAreaFocused": 3 } } Enum { name: "Availability" values: { "Available": 0, "Busy": 2, "Unavailable": 1, "ResourceMissing": 3 } } Property { name: "captureMode"; type: "CaptureMode" } Property { name: "cameraState"; type: "State" } Property { name: "cameraStatus"; type: "Status"; isReadonly: true } Property { name: "lockStatus"; type: "LockStatus"; isReadonly: true } Property { name: "errorCode"; type: "Error"; isReadonly: true } Property { name: "errorString"; type: "string"; isReadonly: true } Property { name: "availability"; type: "Availability"; isReadonly: true } Property { name: "opticalZoom"; type: "double" } Property { name: "maximumOpticalZoom"; type: "double"; isReadonly: true } Property { name: "digitalZoom"; type: "double" } Property { name: "maximumDigitalZoom"; type: "double"; isReadonly: true } Property { name: "mediaObject"; type: "QObject"; isReadonly: true; isPointer: true } Property { name: "imageCapture" type: "QDeclarativeCameraCapture" isReadonly: true isPointer: true } Property { name: "videoRecorder" type: "QDeclarativeCameraRecorder" isReadonly: true isPointer: true } Property { name: "exposure" type: "QDeclarativeCameraExposure" isReadonly: true isPointer: true } Property { name: "flash"; type: "QDeclarativeCameraFlash"; isReadonly: true; isPointer: true } Property { name: "focus"; type: "QDeclarativeCameraFocus"; isReadonly: true; isPointer: true } Property { name: "imageProcessing" type: "QDeclarativeCameraImageProcessing" isReadonly: true isPointer: true } Signal { name: "errorChanged" } Signal { name: "error" Parameter { name: "errorCode"; type: "QDeclarativeCamera::Error" } Parameter { name: "errorString"; type: "string" } } Signal { name: "cameraStateChanged" Parameter { type: "QDeclarativeCamera::State" } } Signal { name: "opticalZoomChanged" Parameter { type: "double" } } Signal { name: "digitalZoomChanged" Parameter { type: "double" } } Signal { name: "maximumOpticalZoomChanged" Parameter { type: "double" } } Signal { name: "maximumDigitalZoomChanged" Parameter { type: "double" } } Signal { name: "availabilityChanged" Parameter { name: "availability"; type: "Availability" } } Method { name: "setCaptureMode" Parameter { name: "mode"; type: "CaptureMode" } } Method { name: "start" } Method { name: "stop" } Method { name: "setCameraState" Parameter { name: "state"; type: "State" } } Method { name: "searchAndLock" } Method { name: "unlock" } Method { name: "setOpticalZoom" Parameter { type: "double" } } Method { name: "setDigitalZoom" Parameter { type: "double" } } } Component { name: "QDeclarativeCameraCapture" prototype: "QObject" exports: ["QtMultimedia/CameraCapture 5.0"] exportMetaObjectRevisions: [0] Property { name: "ready"; type: "bool"; isReadonly: true } Property { name: "capturedImagePath"; type: "string"; isReadonly: true } Property { name: "resolution"; type: "QSize" } Property { name: "errorString"; type: "string"; isReadonly: true } Signal { name: "readyForCaptureChanged" Parameter { type: "bool" } } Signal { name: "imageExposed" Parameter { name: "requestId"; type: "int" } } Signal { name: "imageCaptured" Parameter { name: "requestId"; type: "int" } Parameter { name: "preview"; type: "string" } } Signal { name: "imageMetadataAvailable" Parameter { name: "requestId"; type: "int" } Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } Signal { name: "imageSaved" Parameter { name: "requestId"; type: "int" } Parameter { name: "path"; type: "string" } } Signal { name: "captureFailed" Parameter { name: "requestId"; type: "int" } Parameter { name: "message"; type: "string" } } Signal { name: "resolutionChanged" Parameter { type: "QSize" } } Method { name: "capture"; type: "int" } Method { name: "captureToLocation" type: "int" Parameter { name: "location"; type: "string" } } Method { name: "cancelCapture" } Method { name: "setResolution" Parameter { name: "resolution"; type: "QSize" } } Method { name: "setMetadata" Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } } Component { name: "QDeclarativeCameraExposure" prototype: "QObject" exports: ["QtMultimedia/CameraExposure 5.0"] exportMetaObjectRevisions: [0] Property { name: "exposureCompensation"; type: "double" } Property { name: "iso"; type: "int"; isReadonly: true } Property { name: "shutterSpeed"; type: "double"; isReadonly: true } Property { name: "aperture"; type: "double"; isReadonly: true } Property { name: "manualShutterSpeed"; type: "double" } Property { name: "manualAperture"; type: "double" } Property { name: "manualIso"; type: "double" } Property { name: "exposureMode"; type: "QDeclarativeCamera::ExposureMode" } Property { name: "spotMeteringPoint"; type: "QPointF" } Property { name: "meteringMode"; type: "QDeclarativeCamera::MeteringMode" } Signal { name: "isoSensitivityChanged" Parameter { type: "int" } } Signal { name: "apertureChanged" Parameter { type: "double" } } Signal { name: "shutterSpeedChanged" Parameter { type: "double" } } Signal { name: "manualIsoSensitivityChanged" Parameter { type: "int" } } Signal { name: "manualApertureChanged" Parameter { type: "double" } } Signal { name: "manualShutterSpeedChanged" Parameter { type: "double" } } Signal { name: "exposureCompensationChanged" Parameter { type: "double" } } Signal { name: "exposureModeChanged" Parameter { type: "QDeclarativeCamera::ExposureMode" } } Signal { name: "meteringModeChanged" Parameter { type: "QDeclarativeCamera::MeteringMode" } } Signal { name: "spotMeteringPointChanged" Parameter { type: "QPointF" } } Method { name: "setExposureMode" Parameter { type: "QDeclarativeCamera::ExposureMode" } } Method { name: "setExposureCompensation" Parameter { name: "ev"; type: "double" } } Method { name: "setManualAperture" Parameter { type: "double" } } Method { name: "setManualShutterSpeed" Parameter { type: "double" } } Method { name: "setManualIsoSensitivity" Parameter { name: "iso"; type: "int" } } Method { name: "setAutoAperture" } Method { name: "setAutoShutterSpeed" } Method { name: "setAutoIsoSensitivity" } } Component { name: "QDeclarativeCameraFlash" prototype: "QObject" exports: ["QtMultimedia/CameraFlash 5.0"] exportMetaObjectRevisions: [0] Property { name: "ready"; type: "bool"; isReadonly: true } Property { name: "mode"; type: "int" } Signal { name: "flashReady" Parameter { name: "status"; type: "bool" } } Signal { name: "flashModeChanged" Parameter { type: "int" } } Method { name: "setFlashMode" Parameter { type: "int" } } } Component { name: "QDeclarativeCameraFocus" prototype: "QObject" exports: ["QtMultimedia/CameraFocus 5.0"] exportMetaObjectRevisions: [0] Property { name: "focusMode"; type: "QDeclarativeCamera::FocusMode" } Property { name: "focusPointMode"; type: "QDeclarativeCamera::FocusPointMode" } Property { name: "customFocusPoint"; type: "QPointF" } Property { name: "focusZones"; type: "QObject"; isReadonly: true; isPointer: true } Signal { name: "focusModeChanged" Parameter { type: "QDeclarativeCamera::FocusMode" } } Signal { name: "focusPointModeChanged" Parameter { type: "QDeclarativeCamera::FocusPointMode" } } Signal { name: "customFocusPointChanged" Parameter { type: "QPointF" } } Method { name: "setFocusMode" Parameter { type: "QDeclarativeCamera::FocusMode" } } Method { name: "setFocusPointMode" Parameter { name: "mode"; type: "QDeclarativeCamera::FocusPointMode" } } Method { name: "setCustomFocusPoint" Parameter { name: "point"; type: "QPointF" } } Method { name: "isFocusModeSupported" type: "bool" Parameter { name: "mode"; type: "QDeclarativeCamera::FocusMode" } } Method { name: "isFocusPointModeSupported" type: "bool" Parameter { name: "mode"; type: "QDeclarativeCamera::FocusPointMode" } } } Component { name: "QDeclarativeCameraImageProcessing" prototype: "QObject" exports: ["QtMultimedia/CameraImageProcessing 5.0"] exportMetaObjectRevisions: [0] Enum { name: "WhiteBalanceMode" values: { "WhiteBalanceAuto": 0, "WhiteBalanceManual": 1, "WhiteBalanceSunlight": 2, "WhiteBalanceCloudy": 3, "WhiteBalanceShade": 4, "WhiteBalanceTungsten": 5, "WhiteBalanceFluorescent": 6, "WhiteBalanceFlash": 7, "WhiteBalanceSunset": 8, "WhiteBalanceVendor": 1000 } } Property { name: "whiteBalanceMode"; type: "WhiteBalanceMode" } Property { name: "manualWhiteBalance"; type: "double" } Property { name: "contrast"; type: "double" } Property { name: "saturation"; type: "double" } Property { name: "sharpeningLevel"; type: "double" } Property { name: "denoisingLevel"; type: "double" } Signal { name: "whiteBalanceModeChanged" Parameter { type: "QDeclarativeCameraImageProcessing::WhiteBalanceMode" } } Signal { name: "manualWhiteBalanceChanged" Parameter { type: "double" } } Signal { name: "contrastChanged" Parameter { type: "double" } } Signal { name: "saturationChanged" Parameter { type: "double" } } Signal { name: "sharpeningLevelChanged" Parameter { type: "double" } } Signal { name: "denoisingLevelChanged" Parameter { type: "double" } } Method { name: "setWhiteBalanceMode" Parameter { name: "mode"; type: "QDeclarativeCameraImageProcessing::WhiteBalanceMode" } } Method { name: "setManualWhiteBalance" Parameter { name: "colorTemp"; type: "double" } } Method { name: "setContrast" Parameter { name: "value"; type: "double" } } Method { name: "setSaturation" Parameter { name: "value"; type: "double" } } Method { name: "setSharpeningLevel" Parameter { name: "value"; type: "double" } } Method { name: "setDenoisingLevel" Parameter { name: "value"; type: "double" } } } Component { name: "QDeclarativeCameraRecorder" prototype: "QObject" exports: ["QtMultimedia/CameraRecorder 5.0"] exportMetaObjectRevisions: [0] Enum { name: "RecorderState" values: { "StoppedState": 0, "RecordingState": 1 } } Enum { name: "RecorderStatus" values: { "UnavailableStatus": 0, "UnloadedStatus": 1, "LoadingStatus": 2, "LoadedStatus": 3, "StartingStatus": 4, "RecordingStatus": 5, "PausedStatus": 6, "FinalizingStatus": 7 } } Enum { name: "EncodingMode" values: { "ConstantQualityEncoding": 0, "ConstantBitRateEncoding": 1, "AverageBitRateEncoding": 2 } } Enum { name: "Error" values: { "NoError": 0, "ResourceError": 1, "FormatError": 2, "OutOfSpaceError": 3 } } Property { name: "recorderState"; type: "RecorderState" } Property { name: "recorderStatus"; type: "RecorderStatus"; isReadonly: true } Property { name: "videoCodec"; type: "string" } Property { name: "resolution"; type: "QSize" } Property { name: "frameRate"; type: "double" } Property { name: "videoBitRate"; type: "int" } Property { name: "videoEncodingMode"; type: "EncodingMode" } Property { name: "audioCodec"; type: "string" } Property { name: "audioBitRate"; type: "int" } Property { name: "audioChannels"; type: "int" } Property { name: "audioSampleRate"; type: "int" } Property { name: "audioEncodingMode"; type: "EncodingMode" } Property { name: "mediaContainer"; type: "string" } Property { name: "duration"; type: "qlonglong"; isReadonly: true } Property { name: "outputLocation"; type: "string" } Property { name: "actualLocation"; type: "string"; isReadonly: true } Property { name: "muted"; type: "bool" } Property { name: "errorString"; type: "string"; isReadonly: true } Property { name: "errorCode"; type: "string"; isReadonly: true } Signal { name: "recorderStateChanged" Parameter { name: "state"; type: "QDeclarativeCameraRecorder::RecorderState" } } Signal { name: "durationChanged" Parameter { name: "duration"; type: "qlonglong" } } Signal { name: "mutedChanged" Parameter { name: "muted"; type: "bool" } } Signal { name: "outputLocationChanged" Parameter { name: "location"; type: "string" } } Signal { name: "actualLocationChanged" Parameter { name: "location"; type: "string" } } Signal { name: "error" Parameter { name: "errorCode"; type: "QDeclarativeCameraRecorder::Error" } Parameter { name: "errorString"; type: "string" } } Signal { name: "metaDataChanged" Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } Signal { name: "captureResolutionChanged" Parameter { type: "QSize" } } Signal { name: "audioCodecChanged" Parameter { name: "codec"; type: "string" } } Signal { name: "videoCodecChanged" Parameter { name: "codec"; type: "string" } } Signal { name: "mediaContainerChanged" Parameter { name: "container"; type: "string" } } Signal { name: "frameRateChanged" Parameter { name: "arg"; type: "double" } } Signal { name: "videoBitRateChanged" Parameter { name: "arg"; type: "int" } } Signal { name: "audioBitRateChanged" Parameter { name: "arg"; type: "int" } } Signal { name: "audioChannelsChanged" Parameter { name: "arg"; type: "int" } } Signal { name: "audioSampleRateChanged" Parameter { name: "arg"; type: "int" } } Signal { name: "audioEncodingModeChanged" Parameter { name: "encodingMode"; type: "EncodingMode" } } Signal { name: "videoEncodingModeChanged" Parameter { name: "encodingMode"; type: "EncodingMode" } } Method { name: "setOutputLocation" Parameter { name: "location"; type: "string" } } Method { name: "record" } Method { name: "stop" } Method { name: "setRecorderState" Parameter { name: "state"; type: "QDeclarativeCameraRecorder::RecorderState" } } Method { name: "setMuted" Parameter { name: "muted"; type: "bool" } } Method { name: "setMetadata" Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } Method { name: "setCaptureResolution" Parameter { name: "resolution"; type: "QSize" } } Method { name: "setAudioCodec" Parameter { name: "codec"; type: "string" } } Method { name: "setVideoCodec" Parameter { name: "codec"; type: "string" } } Method { name: "setMediaContainer" Parameter { name: "container"; type: "string" } } Method { name: "setFrameRate" Parameter { name: "frameRate"; type: "double" } } Method { name: "setVideoBitRate" Parameter { name: "rate"; type: "int" } } Method { name: "setAudioBitRate" Parameter { name: "rate"; type: "int" } } Method { name: "setAudioChannels" Parameter { name: "channels"; type: "int" } } Method { name: "setAudioSampleRate" Parameter { name: "rate"; type: "int" } } Method { name: "setVideoEncodingMode" Parameter { name: "encodingMode"; type: "EncodingMode" } } Method { name: "setAudioEncodingMode" Parameter { name: "encodingMode"; type: "EncodingMode" } } } Component { name: "QDeclarativeRadio" prototype: "QObject" exports: ["QtMultimedia/Radio 5.0"] exportMetaObjectRevisions: [0] Enum { name: "State" values: { "ActiveState": 0, "StoppedState": 1 } } Enum { name: "Band" values: { "AM": 0, "FM": 1, "SW": 2, "LW": 3, "FM2": 4 } } Enum { name: "Error" values: { "NoError": 0, "ResourceError": 1, "OpenError": 2, "OutOfRangeError": 3 } } Enum { name: "StereoMode" values: { "ForceStereo": 0, "ForceMono": 1, "Auto": 2 } } Enum { name: "SearchMode" values: { "SearchFast": 0, "SearchGetStationId": 1 } } Enum { name: "Availability" values: { "Available": 0, "Busy": 2, "Unavailable": 1, "ResourceMissing": 3 } } Property { name: "state"; type: "State"; isReadonly: true } Property { name: "band"; type: "Band" } Property { name: "frequency"; type: "int" } Property { name: "stereo"; type: "bool"; isReadonly: true } Property { name: "stereoMode"; type: "StereoMode" } Property { name: "signalStrength"; type: "int"; isReadonly: true } Property { name: "volume"; type: "int" } Property { name: "muted"; type: "bool" } Property { name: "searching"; type: "bool"; isReadonly: true } Property { name: "frequencyStep"; type: "int"; isReadonly: true } Property { name: "minimumFrequency"; type: "int"; isReadonly: true } Property { name: "maximumFrequency"; type: "int"; isReadonly: true } Property { name: "antennaConnected"; type: "bool"; isReadonly: true } Property { name: "availability"; type: "Availability"; isReadonly: true } Property { name: "radioData"; type: "QDeclarativeRadioData"; isReadonly: true; isPointer: true } Signal { name: "stateChanged" Parameter { name: "state"; type: "QDeclarativeRadio::State" } } Signal { name: "bandChanged" Parameter { name: "band"; type: "QDeclarativeRadio::Band" } } Signal { name: "frequencyChanged" Parameter { name: "frequency"; type: "int" } } Signal { name: "stereoStatusChanged" Parameter { name: "stereo"; type: "bool" } } Signal { name: "searchingChanged" Parameter { name: "searching"; type: "bool" } } Signal { name: "signalStrengthChanged" Parameter { name: "signalStrength"; type: "int" } } Signal { name: "volumeChanged" Parameter { name: "volume"; type: "int" } } Signal { name: "mutedChanged" Parameter { name: "muted"; type: "bool" } } Signal { name: "stationFound" Parameter { name: "frequency"; type: "int" } Parameter { name: "stationId"; type: "string" } } Signal { name: "antennaConnectedChanged" Parameter { name: "connectionStatus"; type: "bool" } } Signal { name: "availabilityChanged" Parameter { name: "availability"; type: "Availability" } } Signal { name: "errorChanged" } Signal { name: "error" Parameter { name: "errorCode"; type: "QDeclarativeRadio::Error" } } Method { name: "setBand" Parameter { name: "band"; type: "QDeclarativeRadio::Band" } } Method { name: "setFrequency" Parameter { name: "frequency"; type: "int" } } Method { name: "setStereoMode" Parameter { name: "stereoMode"; type: "QDeclarativeRadio::StereoMode" } } Method { name: "setVolume" Parameter { name: "volume"; type: "int" } } Method { name: "setMuted" Parameter { name: "muted"; type: "bool" } } Method { name: "cancelScan" } Method { name: "scanDown" } Method { name: "scanUp" } Method { name: "tuneUp" } Method { name: "tuneDown" } Method { name: "searchAllStations" Parameter { name: "searchMode"; type: "QDeclarativeRadio::SearchMode" } } Method { name: "searchAllStations" } Method { name: "start" } Method { name: "stop" } Method { name: "isAvailable"; type: "bool" } } Component { name: "QDeclarativeRadioData" prototype: "QObject" exports: ["QtMultimedia/RadioData 5.0"] exportMetaObjectRevisions: [0] Enum { name: "Error" values: { "NoError": 0, "ResourceError": 1, "OpenError": 2, "OutOfRangeError": 3 } } Enum { name: "ProgramType" values: { "Undefined": 0, "News": 1, "CurrentAffairs": 2, "Information": 3, "Sport": 4, "Education": 5, "Drama": 6, "Culture": 7, "Science": 8, "Varied": 9, "PopMusic": 10, "RockMusic": 11, "EasyListening": 12, "LightClassical": 13, "SeriousClassical": 14, "OtherMusic": 15, "Weather": 16, "Finance": 17, "ChildrensProgrammes": 18, "SocialAffairs": 19, "Religion": 20, "PhoneIn": 21, "Travel": 22, "Leisure": 23, "JazzMusic": 24, "CountryMusic": 25, "NationalMusic": 26, "OldiesMusic": 27, "FolkMusic": 28, "Documentary": 29, "AlarmTest": 30, "Alarm": 31, "Talk": 32, "ClassicRock": 33, "AdultHits": 34, "SoftRock": 35, "Top40": 36, "Soft": 37, "Nostalgia": 38, "Classical": 39, "RhythmAndBlues": 40, "SoftRhythmAndBlues": 41, "Language": 42, "ReligiousMusic": 43, "ReligiousTalk": 44, "Personality": 45, "Public": 46, "College": 47 } } Enum { name: "Availability" values: { "Available": 0, "Busy": 2, "Unavailable": 1, "ResourceMissing": 3 } } Property { name: "stationId"; type: "string"; isReadonly: true } Property { name: "programType"; type: "QDeclarativeRadioData::ProgramType"; isReadonly: true } Property { name: "programTypeName"; type: "string"; isReadonly: true } Property { name: "stationName"; type: "string"; isReadonly: true } Property { name: "radioText"; type: "string"; isReadonly: true } Property { name: "alternativeFrequenciesEnabled"; type: "bool" } Property { name: "availability"; type: "Availability"; isReadonly: true } Signal { name: "stationIdChanged" Parameter { name: "stationId"; type: "string" } } Signal { name: "programTypeChanged" Parameter { name: "programType"; type: "QDeclarativeRadioData::ProgramType" } } Signal { name: "programTypeNameChanged" Parameter { name: "programTypeName"; type: "string" } } Signal { name: "stationNameChanged" Parameter { name: "stationName"; type: "string" } } Signal { name: "radioTextChanged" Parameter { name: "radioText"; type: "string" } } Signal { name: "alternativeFrequenciesEnabledChanged" Parameter { name: "enabled"; type: "bool" } } Signal { name: "availabilityChanged" Parameter { name: "availability"; type: "Availability" } } Signal { name: "errorChanged" } Signal { name: "error" Parameter { name: "errorCode"; type: "QDeclarativeRadioData::Error" } } Method { name: "setAlternativeFrequenciesEnabled" Parameter { name: "enabled"; type: "bool" } } Method { name: "isAvailable"; type: "bool" } } Component { name: "QDeclarativeTorch" prototype: "QObject" exports: ["QtMultimedia/Torch 5.0"] exportMetaObjectRevisions: [0] Property { name: "enabled"; type: "bool" } Property { name: "power"; type: "int" } } Component { name: "QDeclarativeVideoOutput" defaultProperty: "data" prototype: "QQuickItem" exports: ["QtMultimedia/VideoOutput 5.0"] exportMetaObjectRevisions: [0] Enum { name: "FillMode" values: { "Stretch": 0, "PreserveAspectFit": 1, "PreserveAspectCrop": 2 } } Property { name: "source"; type: "QObject"; isPointer: true } Property { name: "fillMode"; type: "FillMode" } Property { name: "orientation"; type: "int" } Property { name: "sourceRect"; type: "QRectF"; isReadonly: true } Property { name: "contentRect"; type: "QRectF"; isReadonly: true } Signal { name: "fillModeChanged" Parameter { type: "QDeclarativeVideoOutput::FillMode" } } Method { name: "mapPointToItem" type: "QPointF" Parameter { name: "point"; type: "QPointF" } } Method { name: "mapRectToItem" type: "QRectF" Parameter { name: "rectangle"; type: "QRectF" } } Method { name: "mapNormalizedPointToItem" type: "QPointF" Parameter { name: "point"; type: "QPointF" } } Method { name: "mapNormalizedRectToItem" type: "QRectF" Parameter { name: "rectangle"; type: "QRectF" } } Method { name: "mapPointToSource" type: "QPointF" Parameter { name: "point"; type: "QPointF" } } Method { name: "mapRectToSource" type: "QRectF" Parameter { name: "rectangle"; type: "QRectF" } } Method { name: "mapPointToSourceNormalized" type: "QPointF" Parameter { name: "point"; type: "QPointF" } } Method { name: "mapRectToSourceNormalized" type: "QRectF" Parameter { name: "rectangle"; type: "QRectF" } } } Component { name: "QMediaObject" prototype: "QObject" Property { name: "notifyInterval"; type: "int" } Signal { name: "notifyIntervalChanged" Parameter { name: "milliSeconds"; type: "int" } } Signal { name: "metaDataAvailableChanged" Parameter { name: "available"; type: "bool" } } Signal { name: "metaDataChanged" } Signal { name: "metaDataChanged" Parameter { name: "key"; type: "string" } Parameter { name: "value"; type: "QVariant" } } Signal { name: "availabilityChanged" Parameter { name: "available"; type: "bool" } } Signal { name: "availabilityChanged" Parameter { name: "availability"; type: "QMultimedia::AvailabilityStatus" } } } Component { name: "QSoundEffect" prototype: "QObject" exports: ["QtMultimedia/SoundEffect 5.0"] exportMetaObjectRevisions: [0] Enum { name: "Loop" values: { "Infinite": -2 } } Enum { name: "Status" values: { "Null": 0, "Loading": 1, "Ready": 2, "Error": 3 } } Property { name: "source"; type: "QUrl" } Property { name: "loops"; type: "int" } Property { name: "loopsRemaining"; type: "int"; isReadonly: true } Property { name: "volume"; type: "double" } Property { name: "muted"; type: "bool" } Property { name: "playing"; type: "bool"; isReadonly: true } Property { name: "status"; type: "Status"; isReadonly: true } Property { name: "category"; type: "string" } Signal { name: "loopCountChanged" } Signal { name: "loadedChanged" } Method { name: "play" } Method { name: "stop" } } } qdeclarativeaudio.cpp000066400000000000000000001216521225012771600333370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qdeclarativeaudio_p.h" #include #include #include #include #include #include #include "qdeclarativemediametadata_p.h" #include QT_BEGIN_NAMESPACE /*! \qmltype Audio \instantiates QDeclarativeAudio \brief Add audio playback to a scene. \inqmlmodule QtMultimedia 5.0 \ingroup multimedia_qml \ingroup multimedia_audio_qml This type is part of the \b{QtMultimedia 5.0} module. \qml import QtQuick 2.0 import QtMultimedia 5.0 Text { text: "Click Me!"; font.pointSize: 24; width: 150; height: 50; Audio { id: playMusic source: "music.wav" } MouseArea { id: playArea anchors.fill: parent onPressed: { playMusic.play() } } } \endqml \sa Video */ void QDeclarativeAudio::_q_error(QMediaPlayer::Error errorCode) { m_error = errorCode; m_errorString = m_player->errorString(); emit error(Error(errorCode), m_errorString); emit errorChanged(); } void QDeclarativeAudio::_q_availabilityChanged(QMultimedia::AvailabilityStatus) { emit availabilityChanged(availability()); } QDeclarativeAudio::QDeclarativeAudio(QObject *parent) : QObject(parent) , m_autoPlay(false) , m_autoLoad(true) , m_loaded(false) , m_muted(false) , m_complete(false) , m_loopCount(1) , m_runningCount(0) , m_position(0) , m_vol(1.0) , m_playbackRate(1.0) , m_playbackState(QMediaPlayer::StoppedState) , m_status(QMediaPlayer::NoMedia) , m_error(QMediaPlayer::ServiceMissingError) , m_player(0) { } QDeclarativeAudio::~QDeclarativeAudio() { m_metaData.reset(); delete m_player; } /*! \qmlproperty enumeration QtMultimedia5::Audio::availability Returns the availability state of the media player. This is one of: \table \header \li Value \li Description \row \li Available \li The media player is available to use. \row \li Busy \li The media player is usually available, but some other process is utilizing the hardware necessary to play media. \row \li Unavailable \li There are no supported media playback facilities. \row \li ResourceMissing \li There is one or more resources missing, so the media player cannot be used. It may be possible to try again at a later time. \endtable */ QDeclarativeAudio::Availability QDeclarativeAudio::availability() const { if (!m_player) return Unavailable; return Availability(m_player->availability()); } QUrl QDeclarativeAudio::source() const { return m_source; } bool QDeclarativeAudio::autoPlay() const { return m_autoPlay; } void QDeclarativeAudio::setAutoPlay(bool autoplay) { if (m_autoPlay == autoplay) return; m_autoPlay = autoplay; emit autoPlayChanged(); } void QDeclarativeAudio::setSource(const QUrl &url) { if (url == m_source) return; m_source = url; m_loaded = false; if (m_complete && (m_autoLoad || url.isEmpty() || m_autoPlay)) { if (m_error != QMediaPlayer::ServiceMissingError && m_error != QMediaPlayer::NoError) { m_error = QMediaPlayer::NoError; m_errorString = QString(); emit errorChanged(); } m_player->setMedia(m_source, 0); m_loaded = true; } else emit sourceChanged(); if (m_autoPlay) m_player->play(); } bool QDeclarativeAudio::isAutoLoad() const { return m_autoLoad; } void QDeclarativeAudio::setAutoLoad(bool autoLoad) { if (m_autoLoad == autoLoad) return; m_autoLoad = autoLoad; emit autoLoadChanged(); } int QDeclarativeAudio::loopCount() const { return m_loopCount; } void QDeclarativeAudio::setLoopCount(int loopCount) { if (loopCount == 0) loopCount = 1; else if (loopCount < -1) loopCount = -1; if (m_loopCount == loopCount) { return; } m_loopCount = loopCount; m_runningCount = loopCount - 1; emit loopCountChanged(); } void QDeclarativeAudio::setPlaybackState(QMediaPlayer::State playbackState) { if (m_playbackState == playbackState) return; if (m_complete) { switch (playbackState){ case (QMediaPlayer::PlayingState): if (!m_loaded) { m_player->setMedia(m_source, 0); m_player->setPosition(m_position); m_loaded = true; } m_player->play(); break; case (QMediaPlayer::PausedState): if (!m_loaded) { m_player->setMedia(m_source, 0); m_player->setPosition(m_position); m_loaded = true; } m_player->pause(); break; case (QMediaPlayer::StoppedState): m_player->stop(); } } } int QDeclarativeAudio::duration() const { return !m_complete ? 0 : m_player->duration(); } int QDeclarativeAudio::position() const { return !m_complete ? m_position : m_player->position(); } qreal QDeclarativeAudio::volume() const { return !m_complete ? m_vol : qreal(m_player->volume()) / 100; } void QDeclarativeAudio::setVolume(qreal volume) { if (volume < 0 || volume > 1) { qmlInfo(this) << tr("volume should be between 0.0 and 1.0"); return; } if (m_vol == volume) return; m_vol = volume; if (m_complete) m_player->setVolume(qRound(volume * 100)); else emit volumeChanged(); } bool QDeclarativeAudio::isMuted() const { return !m_complete ? m_muted : m_player->isMuted(); } void QDeclarativeAudio::setMuted(bool muted) { if (m_muted == muted) return; m_muted = muted; if (m_complete) m_player->setMuted(muted); else emit mutedChanged(); } qreal QDeclarativeAudio::bufferProgress() const { return !m_complete ? 0 : qreal(m_player->bufferStatus()) / 100; } bool QDeclarativeAudio::isSeekable() const { return !m_complete ? false : m_player->isSeekable(); } qreal QDeclarativeAudio::playbackRate() const { return m_playbackRate; } void QDeclarativeAudio::setPlaybackRate(qreal rate) { if (m_playbackRate == rate) return; m_playbackRate = rate; if (m_complete) m_player->setPlaybackRate(m_playbackRate); else emit playbackRateChanged(); } QString QDeclarativeAudio::errorString() const { return m_errorString; } QDeclarativeMediaMetaData *QDeclarativeAudio::metaData() const { return m_metaData.data(); } /*! \qmlmethod QtMultimedia5::Audio::play() Starts playback of the media. Sets the \l playbackState property to PlayingState. */ void QDeclarativeAudio::play() { if (!m_complete) return; setPlaybackState(QMediaPlayer::PlayingState); } /*! \qmlmethod QtMultimedia5::Audio::pause() Pauses playback of the media. Sets the \l playbackState property to PausedState. */ void QDeclarativeAudio::pause() { if (!m_complete) return; setPlaybackState(QMediaPlayer::PausedState); } /*! \qmlmethod QtMultimedia5::Audio::stop() Stops playback of the media. Sets the \l playbackState property to StoppedState. */ void QDeclarativeAudio::stop() { if (!m_complete) return; setPlaybackState(QMediaPlayer::StoppedState); } /*! \qmlmethod QtMultimedia5::Audio::seek(offset) If the \l seekable property is true, seeks the current playback position to \a offset. Seeking may be asynchronous, so the \l position property may not be updated immediately. \sa seekable, position */ void QDeclarativeAudio::seek(int position) { // QMediaPlayer clamps this to positive numbers if (position < 0) position = 0; if (this->position() == position) return; m_position = position; if (m_complete) m_player->setPosition(m_position); else emit positionChanged(); } /*! \qmlproperty url QtMultimedia5::Audio::source This property holds the source URL of the media. */ /*! \qmlproperty bool QtMultimedia5::Audio::autoLoad This property indicates if loading of media should begin immediately. Defaults to true, if false media will not be loaded until playback is started. */ /*! \qmlsignal QtMultimedia5::Audio::playbackStateChanged() This handler is called when the \l playbackState property is altered. */ /*! \qmlsignal QtMultimedia5::Audio::paused() This handler is called when playback is paused. */ /*! \qmlsignal QtMultimedia5::Audio::stopped() This handler is called when playback is stopped. */ /*! \qmlsignal QtMultimedia5::Audio::playing() This handler is called when playback is started or resumed. */ /*! \qmlproperty enumeration QtMultimedia5::Audio::status This property holds the status of media loading. It can be one of: \list \li NoMedia - no media has been set. \li Loading - the media is currently being loaded. \li Loaded - the media has been loaded. \li Buffering - the media is buffering data. \li Stalled - playback has been interrupted while the media is buffering data. \li Buffered - the media has buffered data. \li EndOfMedia - the media has played to the end. \li InvalidMedia - the media cannot be played. \li UnknownStatus - the status of the media is unknown. \endlist */ QDeclarativeAudio::Status QDeclarativeAudio::status() const { return Status(m_status); } /*! \qmlproperty enumeration QtMultimedia5::Audio::playbackState This property holds the state of media playback. It can be one of: \list \li PlayingState - the media is currently playing. \li PausedState - playback of the media has been suspended. \li StoppedState - playback of the media is yet to begin. \endlist */ QDeclarativeAudio::PlaybackState QDeclarativeAudio::playbackState() const { return PlaybackState(m_playbackState); } /*! \qmlproperty bool QtMultimedia5::Audio::autoPlay This property controls whether the media will begin to play on start up. Defaults to false, if set true the value of autoLoad will be overwritten to true. */ /*! \qmlproperty int QtMultimedia5::Audio::duration This property holds the duration of the media in milliseconds. If the media doesn't have a fixed duration (a live stream for example) this will be 0. */ /*! \qmlproperty int QtMultimedia5::Audio::position This property holds the current playback position in milliseconds. To change this position, use the \l seek() method. \sa seek() */ /*! \qmlproperty real QtMultimedia5::Audio::volume This property holds the volume of the audio output, from 0.0 (silent) to 1.0 (maximum volume). Defaults to 1.0. */ /*! \qmlproperty bool QtMultimedia5::Audio::muted This property holds whether the audio output is muted. Defaults to false. */ /*! \qmlproperty bool QtMultimedia5::Audio::hasAudio This property holds whether the media contains audio. */ bool QDeclarativeAudio::hasAudio() const { return !m_complete ? false : m_player->isAudioAvailable(); } /*! \qmlproperty bool QtMultimedia5::Audio::hasVideo This property holds whether the media contains video. */ bool QDeclarativeAudio::hasVideo() const { return !m_complete ? false : m_player->isVideoAvailable(); } /*! \qmlproperty real QtMultimedia5::Audio::bufferProgress This property holds how much of the data buffer is currently filled, from 0.0 (empty) to 1.0 (full). */ /*! \qmlproperty bool QtMultimedia5::Audio::seekable This property holds whether position of the audio can be changed. If true, calling the \l seek() method will cause playback to seek to the new position. */ /*! \qmlproperty real QtMultimedia5::Audio::playbackRate This property holds the rate at which audio is played at as a multiple of the normal rate. Defaults to 1.0. */ /*! \qmlproperty enumeration QtMultimedia5::Audio::error This property holds the error state of the audio. It can be one of: \table \header \li Value \li Description \row \li NoError \li There is no current error. \row \li ResourceError \li The audio cannot be played due to a problem allocating resources. \row \li FormatError \li The audio format is not supported. \row \li NetworkError \li The audio cannot be played due to network issues. \row \li AccessDenied \li The audio cannot be played due to insufficient permissions. \row \li ServiceMissing \li The audio cannot be played because the media service could not be instantiated. \endtable */ QDeclarativeAudio::Error QDeclarativeAudio::error() const { return Error(m_error); } void QDeclarativeAudio::classBegin() { m_player = new QMediaPlayer(this); connect(m_player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(_q_statusChanged())); connect(m_player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(_q_statusChanged())); connect(m_player, SIGNAL(mediaChanged(QMediaContent)), this, SIGNAL(sourceChanged())); connect(m_player, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged())); connect(m_player, SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged())); connect(m_player, SIGNAL(volumeChanged(int)), this, SIGNAL(volumeChanged())); connect(m_player, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged())); connect(m_player, SIGNAL(bufferStatusChanged(int)), this, SIGNAL(bufferProgressChanged())); connect(m_player, SIGNAL(seekableChanged(bool)), this, SIGNAL(seekableChanged())); connect(m_player, SIGNAL(playbackRateChanged(qreal)), this, SIGNAL(playbackRateChanged())); connect(m_player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(_q_error(QMediaPlayer::Error))); connect(m_player, SIGNAL(audioAvailableChanged(bool)), this, SIGNAL(hasAudioChanged())); connect(m_player, SIGNAL(videoAvailableChanged(bool)), this, SIGNAL(hasVideoChanged())); m_error = m_player->availability() == QMultimedia::ServiceMissing ? QMediaPlayer::ServiceMissingError : QMediaPlayer::NoError; connect(m_player, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); m_metaData.reset(new QDeclarativeMediaMetaData(m_player)); connect(m_player, SIGNAL(metaDataChanged()), m_metaData.data(), SIGNAL(metaDataChanged())); emit mediaObjectChanged(); } void QDeclarativeAudio::componentComplete() { if (!qFuzzyCompare(m_vol, qreal(1.0))) m_player->setVolume(m_vol * 100); if (m_muted) m_player->setMuted(m_muted); if (!qFuzzyCompare(m_playbackRate, qreal(1.0))) m_player->setPlaybackRate(m_playbackRate); if (!m_source.isEmpty() && (m_autoLoad || m_autoPlay)) { m_player->setMedia(m_source, 0); m_loaded = true; if (m_position > 0) m_player->setPosition(m_position); } m_complete = true; if (m_autoPlay) { if (m_source.isEmpty()) { m_player->stop(); } else { m_player->play(); } } } void QDeclarativeAudio::_q_statusChanged() { if (m_player->mediaStatus() == QMediaPlayer::EndOfMedia && m_runningCount != 0) { m_runningCount -= 1; m_player->play(); } const QMediaPlayer::MediaStatus oldStatus = m_status; const QMediaPlayer::State lastPlaybackState = m_playbackState; const QMediaPlayer::State state = m_player->state(); m_playbackState = state; m_status = m_player->mediaStatus(); if (m_status != oldStatus) emit statusChanged(); if (lastPlaybackState != state) { if (lastPlaybackState == QMediaPlayer::StoppedState) m_runningCount = m_loopCount - 1; switch (state) { case QMediaPlayer::StoppedState: emit stopped(); break; case QMediaPlayer::PausedState: emit paused(); break; case QMediaPlayer::PlayingState: emit playing(); break; } emit playbackStateChanged(); } } /*! \qmlproperty string QtMultimedia5::Audio::errorString This property holds a string describing the current error condition in more detail. */ /*! \qmlsignal QtMultimedia5::Audio::error(error, errorString) This handler is called when an \l {QMediaPlayer::Error}{error} has occurred. The errorString parameter may contain more detailed information about the error. */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.title This property holds the title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.subTitle This property holds the sub-title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.author This property holds the author of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.comment This property holds a user comment about the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.description This property holds a description of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.category This property holds the category of the media \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.genre This property holds the genre of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.year This property holds the year of release of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.date This property holds the date of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.userRating This property holds a user rating of the media in the range of 0 to 100. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.keywords This property holds a list of keywords describing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.language This property holds the language of the media, as an ISO 639-2 code. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.publisher This property holds the publisher of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.copyright This property holds the media's copyright notice. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.parentalRating This property holds the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.ratingOrganization This property holds the name of the rating organization responsible for the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.size This property property holds the size of the media in bytes. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.mediaType This property holds the type of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.audioBitRate This property holds the bit rate of the media's audio stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.audioCodec This property holds the encoding of the media audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.averageLevel This property holds the average volume level of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.channelCount This property holds the number of channels in the media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.peakValue This property holds the peak volume of media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.sampleRate This property holds the sample rate of the media's audio stream in hertz. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.albumTitle This property holds the title of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.albumArtist This property holds the name of the principal artist of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.contributingArtist This property holds the names of artists contributing to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.composer This property holds the composer of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.conductor This property holds the conductor of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.lyrics This property holds the lyrics to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.mood This property holds the mood of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.trackNumber This property holds the track number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.trackCount This property holds the number of tracks on the album containing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.coverArtUrlSmall This property holds the URL of a small cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.coverArtUrlLarge This property holds the URL of a large cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.resolution This property holds the dimension of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.pixelAspectRatio This property holds the pixel aspect ratio of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.videoFrameRate This property holds the frame rate of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.videoBitRate This property holds the bit rate of the media's video stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.videoCodec This property holds the encoding of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.posterUrl This property holds the URL of a poster image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.chapterNumber This property holds the chapter number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.director This property holds the director of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.leadPerformer This property holds the lead performer in the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::Audio::metaData.writer This property holds the writer of the media. \sa {QMediaMetaData} */ ///////////// MediaPlayer Docs ///////////// /*! \qmltype MediaPlayer \instantiates QDeclarativeAudio \brief Add media playback to a scene. \inqmlmodule QtMultimedia 5.0 \ingroup multimedia_qml \ingroup multimedia_audio_qml \ingroup multimedia_video_qml MediaPlayer is part of the \b{QtMultimedia 5.0} module. \qml import QtQuick 2.0 import QtMultimedia 5.0 Text { text: "Click Me!"; font.pointSize: 24; width: 150; height: 50; MediaPlayer { id: playMusic source: "music.wav" } MouseArea { id: playArea anchors.fill: parent onPressed: { playMusic.play() } } } \endqml You can use MediaPlayer by itself to play audio content (like \l Audio), or you can use it in conjunction with a \l VideoOutput for rendering video. \qml import QtQuick 2.0 import QtMultimedia 5.0 Item { MediaPlayer { id: mediaplayer source: "groovy_video.mp4" } VideoOutput { anchors: parent.fill source: mediaplayer } MouseArea { id: playArea anchors.fill: parent onPressed: mediaplayer.play(); } } \endqml \sa VideoOutput */ /*! \qmlproperty enumeration QtMultimedia5::MediaPlayer::availability Returns the availability state of the media player. This is one of: \table \header \li Value \li Description \row \li Available \li The media player is available to use. \row \li Busy \li The media player is usually available, but some other process is utilizing the hardware necessary to play media. \row \li Unavailable \li There are no supported media playback facilities. \row \li ResourceMissing \li There is one or more resources missing, so the media player cannot be used. It may be possible to try again at a later time. \endtable */ /*! \qmlmethod QtMultimedia5::MediaPlayer::play() Starts playback of the media. Sets the \l playbackState property to PlayingState. */ /*! \qmlmethod QtMultimedia5::MediaPlayer::pause() Pauses playback of the media. Sets the \l playbackState property to PausedState. */ /*! \qmlmethod QtMultimedia5::MediaPlayer::stop() Stops playback of the media. Sets the \l playbackState property to StoppedState. */ /*! \qmlproperty url QtMultimedia5::MediaPlayer::source This property holds the source URL of the media. */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::autoLoad This property indicates if loading of media should begin immediately. Defaults to true, if false media will not be loaded until playback is started. */ /*! \qmlsignal QtMultimedia5::MediaPlayer::playbackStateChanged() This handler is called when the \l playbackState property is altered. */ /*! \qmlsignal QtMultimedia5::MediaPlayer::paused() This handler is called when playback is paused. */ /*! \qmlsignal QtMultimedia5::MediaPlayer::stopped() This handler is called when playback is stopped. */ /*! \qmlsignal QtMultimedia5::MediaPlayer::playing() This handler is called when playback is started or resumed. */ /*! \qmlproperty enumeration QtMultimedia5::MediaPlayer::status This property holds the status of media loading. It can be one of: \list \li NoMedia - no media has been set. \li Loading - the media is currently being loaded. \li Loaded - the media has been loaded. \li Buffering - the media is buffering data. \li Stalled - playback has been interrupted while the media is buffering data. \li Buffered - the media has buffered data. \li EndOfMedia - the media has played to the end. \li InvalidMedia - the media cannot be played. \li UnknownStatus - the status of the media is unknown. \endlist */ /*! \qmlproperty enumeration QtMultimedia5::MediaPlayer::playbackState This property holds the state of media playback. It can be one of: \list \li PlayingState - the media is currently playing. \li PausedState - playback of the media has been suspended. \li StoppedState - playback of the media is yet to begin. \endlist */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::autoPlay This property controls whether the media will begin to play on start up. Defaults to false, if set true the value of autoLoad will be overwritten to true. */ /*! \qmlproperty int QtMultimedia5::MediaPlayer::duration This property holds the duration of the media in milliseconds. If the media doesn't have a fixed duration (a live stream for example) this will be 0. */ /*! \qmlproperty int QtMultimedia5::MediaPlayer::position This property holds the current playback position in milliseconds. To change this position, use the \l seek() method. \sa seek() */ /*! \qmlproperty real QtMultimedia5::MediaPlayer::volume This property holds the volume of the audio output, from 0.0 (silent) to 1.0 (maximum volume). Defaults to 1.0. */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::muted This property holds whether the audio output is muted. Defaults to false. */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::hasAudio This property holds whether the media contains audio. */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::hasVideo This property holds whether the media contains video. */ /*! \qmlproperty real QtMultimedia5::MediaPlayer::bufferProgress This property holds how much of the data buffer is currently filled, from 0.0 (empty) to 1.0 (full). */ /*! \qmlproperty bool QtMultimedia5::MediaPlayer::seekable This property holds whether position of the audio can be changed. If true, calling the \l seek() method will cause playback to seek to the new position. */ /*! \qmlmethod QtMultimedia5::MediaPlayer::seek(offset) If the \l seekable property is true, seeks the current playback position to \a offset. Seeking may be asynchronous, so the \l position property may not be updated immediately. \sa seekable, position */ /*! \qmlproperty real QtMultimedia5::MediaPlayer::playbackRate This property holds the rate at which audio is played at as a multiple of the normal rate. Defaults to 1.0. */ /*! \qmlproperty enumeration QtMultimedia5::MediaPlayer::error This property holds the error state of the audio. It can be one of: \table \header \li Value \li Description \row \li NoError \li There is no current error. \row \li ResourceError \li The audio cannot be played due to a problem allocating resources. \row \li FormatError \li The audio format is not supported. \row \li NetworkError \li The audio cannot be played due to network issues. \row \li AccessDenied \li The audio cannot be played due to insufficient permissions. \row \li ServiceMissing \li The audio cannot be played because the media service could not be instantiated. \endtable */ /*! \qmlproperty string QtMultimedia5::MediaPlayer::errorString This property holds a string describing the current error condition in more detail. */ /*! \qmlsignal QtMultimedia5::MediaPlayer::error(error, errorString) This handler is called when an \l {QMediaPlayer::Error}{error} has occurred. The errorString parameter may contain more detailed information about the error. */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.title This property holds the title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.subTitle This property holds the sub-title of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.author This property holds the author of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.comment This property holds a user comment about the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.description This property holds a description of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.category This property holds the category of the media \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.genre This property holds the genre of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.year This property holds the year of release of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.date This property holds the date of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.userRating This property holds a user rating of the media in the range of 0 to 100. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.keywords This property holds a list of keywords describing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.language This property holds the language of the media, as an ISO 639-2 code. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.publisher This property holds the publisher of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.copyright This property holds the media's copyright notice. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.parentalRating This property holds the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.ratingOrganization This property holds the name of the rating organization responsible for the parental rating of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.size This property property holds the size of the media in bytes. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.mediaType This property holds the type of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.audioBitRate This property holds the bit rate of the media's audio stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.audioCodec This property holds the encoding of the media audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.averageLevel This property holds the average volume level of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.channelCount This property holds the number of channels in the media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.peakValue This property holds the peak volume of media's audio stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.sampleRate This property holds the sample rate of the media's audio stream in hertz. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.albumTitle This property holds the title of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.albumArtist This property holds the name of the principal artist of the album the media belongs to. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.contributingArtist This property holds the names of artists contributing to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.composer This property holds the composer of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.conductor This property holds the conductor of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.lyrics This property holds the lyrics to the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.mood This property holds the mood of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.trackNumber This property holds the track number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.trackCount This property holds the number of tracks on the album containing the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.coverArtUrlSmall This property holds the URL of a small cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.coverArtUrlLarge This property holds the URL of a large cover art image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.resolution This property holds the dimension of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.pixelAspectRatio This property holds the pixel aspect ratio of an image or video. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.videoFrameRate This property holds the frame rate of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.videoBitRate This property holds the bit rate of the media's video stream in bits per second. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.videoCodec This property holds the encoding of the media's video stream. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.posterUrl This property holds the URL of a poster image. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.chapterNumber This property holds the chapter number of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.director This property holds the director of the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.leadPerformer This property holds the lead performer in the media. \sa {QMediaMetaData} */ /*! \qmlproperty variant QtMultimedia5::MediaPlayer::metaData.writer This property holds the writer of the media. \sa {QMediaMetaData} */ QT_END_NAMESPACE #include "moc_qdeclarativeaudio_p.cpp" qdeclarativeaudio_p.h000066400000000000000000000203301225012771600333120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEAUDIO_P_H #define QDECLARATIVEAUDIO_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include QT_BEGIN_NAMESPACE class QTimerEvent; class QMediaPlayerControl; class QMediaService; class QMediaServiceProvider; class QMetaDataReaderControl; class QDeclarativeMediaBaseAnimation; class QDeclarativeMediaMetaData; class QMediaAvailabilityControl; class QDeclarativeAudio : public QObject, public QQmlParserStatus { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(int loops READ loopCount WRITE setLoopCount NOTIFY loopCountChanged) Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged) Q_PROPERTY(bool autoPlay READ autoPlay WRITE setAutoPlay NOTIFY autoPlayChanged) Q_PROPERTY(bool autoLoad READ isAutoLoad WRITE setAutoLoad NOTIFY autoLoadChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_PROPERTY(int duration READ duration NOTIFY durationChanged) Q_PROPERTY(int position READ position NOTIFY positionChanged) Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool hasAudio READ hasAudio NOTIFY hasAudioChanged) Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged) Q_PROPERTY(qreal bufferProgress READ bufferProgress NOTIFY bufferProgressChanged) Q_PROPERTY(bool seekable READ isSeekable NOTIFY seekableChanged) Q_PROPERTY(qreal playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(Error error READ error NOTIFY errorChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged) Q_PROPERTY(QDeclarativeMediaMetaData *metaData READ metaData CONSTANT) Q_PROPERTY(QObject *mediaObject READ mediaObject NOTIFY mediaObjectChanged SCRIPTABLE false DESIGNABLE false) Q_PROPERTY(Availability availability READ availability NOTIFY availabilityChanged) Q_ENUMS(Status) Q_ENUMS(Error) Q_ENUMS(Loop) Q_ENUMS(PlaybackState) Q_ENUMS(Availability) Q_INTERFACES(QQmlParserStatus) public: enum Status { UnknownStatus = QMediaPlayer::UnknownMediaStatus, NoMedia = QMediaPlayer::NoMedia, Loading = QMediaPlayer::LoadingMedia, Loaded = QMediaPlayer::LoadedMedia, Stalled = QMediaPlayer::StalledMedia, Buffering = QMediaPlayer::BufferingMedia, Buffered = QMediaPlayer::BufferedMedia, EndOfMedia = QMediaPlayer::EndOfMedia, InvalidMedia = QMediaPlayer::InvalidMedia }; enum Error { NoError = QMediaPlayer::NoError, ResourceError = QMediaPlayer::ResourceError, FormatError = QMediaPlayer::FormatError, NetworkError = QMediaPlayer::NetworkError, AccessDenied = QMediaPlayer::AccessDeniedError, ServiceMissing = QMediaPlayer::ServiceMissingError }; enum Loop { Infinite = -1 }; enum PlaybackState { PlayingState = QMediaPlayer::PlayingState, PausedState = QMediaPlayer::PausedState, StoppedState = QMediaPlayer::StoppedState }; enum Availability { Available = QMultimedia::Available, Busy = QMultimedia::Busy, Unavailable = QMultimedia::ServiceMissing, ResourceMissing = QMultimedia::ResourceError }; QDeclarativeAudio(QObject *parent = 0); ~QDeclarativeAudio(); bool hasAudio() const; bool hasVideo() const; Status status() const; Error error() const; PlaybackState playbackState() const; void setPlaybackState(QMediaPlayer::State playbackState); void classBegin(); void componentComplete(); QObject *mediaObject() { return m_player; } Availability availability() const; QUrl source() const; void setSource(const QUrl &url); int loopCount() const; void setLoopCount(int loopCount); int duration() const; int position() const; qreal volume() const; void setVolume(qreal volume); bool isMuted() const; void setMuted(bool muted); qreal bufferProgress() const; bool isSeekable() const; qreal playbackRate() const; void setPlaybackRate(qreal rate); QString errorString() const; QDeclarativeMediaMetaData *metaData() const; bool isAutoLoad() const; void setAutoLoad(bool autoLoad); bool autoPlay() const; void setAutoPlay(bool autoplay); public Q_SLOTS: void play(); void pause(); void stop(); void seek(int position); Q_SIGNALS: void sourceChanged(); void autoLoadChanged(); void loopCountChanged(); void playbackStateChanged(); void autoPlayChanged(); void paused(); void stopped(); void playing(); void statusChanged(); void durationChanged(); void positionChanged(); void volumeChanged(); void mutedChanged(); void hasAudioChanged(); void hasVideoChanged(); void bufferProgressChanged(); void seekableChanged(); void playbackRateChanged(); void availabilityChanged(Availability availability); void errorChanged(); void error(QDeclarativeAudio::Error error, const QString &errorString); void mediaObjectChanged(); private Q_SLOTS: void _q_error(QMediaPlayer::Error); void _q_availabilityChanged(QMultimedia::AvailabilityStatus); void _q_statusChanged(); private: Q_DISABLE_COPY(QDeclarativeAudio) bool m_autoPlay; bool m_autoLoad; bool m_loaded; bool m_muted; bool m_complete; int m_loopCount; int m_runningCount; int m_position; qreal m_vol; qreal m_playbackRate; QMediaPlayer::State m_playbackState; QMediaPlayer::MediaStatus m_status; QMediaPlayer::Error m_error; QString m_errorString; QUrl m_source; QScopedPointer m_metaData; QMediaPlayer *m_player; friend class QDeclarativeMediaBaseAnimation; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeAudio)) #endif qdeclarativecamera.cpp000066400000000000000000000530611225012771600334640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecamerapreviewprovider_p.h" #include "qdeclarativecameraexposure_p.h" #include "qdeclarativecameraflash_p.h" #include "qdeclarativecamerafocus_p.h" #include "qdeclarativecameraimageprocessing_p.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE void QDeclarativeCamera::_q_error(QCamera::Error errorCode) { emit error(Error(errorCode), errorString()); emit errorChanged(); } void QDeclarativeCamera::_q_updateState(QCamera::State state) { emit cameraStateChanged(QDeclarativeCamera::State(state)); } void QDeclarativeCamera::_q_availabilityChanged(QMultimedia::AvailabilityStatus availability) { emit availabilityChanged(Availability(availability)); } /*! \qmltype Camera \instantiates QDeclarativeCamera \brief Access viewfinder frames, and take photos and movies. \ingroup multimedia_qml \ingroup camera_qml \inqmlmodule QtMultimedia 5.0 \inherits Item Camera is part of the \b{QtMultimedia 5.0} module. You can use \c Camera to capture images and movies from a camera, and manipulate the capture and processing settings that get applied to the images. To display the viewfinder you can use \l VideoOutput with the Camera set as the source. \qml import QtQuick 2.0 import QtMultimedia 5.0 Item { width: 640 height: 360 Camera { id: camera imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash exposure { exposureCompensation: -1.0 exposureMode: Camera.ExposurePortrait } flash.mode: Camera.FlashRedEyeReduction imageCapture { onImageCaptured: { photoPreview.source = preview // Show the preview in an Image } } } VideoOutput { source: camera anchors.fill: parent focus : visible // to receive focus and capture key events when visible } Image { id: photoPreview } } \endqml The various settings and functionality of the Camera stack is spread across a few different child properties of Camera. \table \header \li Property \li Description \row \li \l {CameraCapture} {imageCapture} \li Methods and properties for capturing still images. \row \li \l {CameraRecorder} {videoRecording} \li Methods and properties for capturing movies. \row \li \l {CameraExposure} {exposure} \li Methods and properties for adjusting exposure (aperture, shutter speed etc). \row \li \l {CameraFocus} {focus} \li Methods and properties for adjusting focus and providing feedback on autofocus progress. \row \li \l {CameraFlash} {flash} \li Methods and properties for controlling the camera flash. \row \li \l {CameraImageProcessing} {imageProcessing} \li Methods and properties for adjusting camera image processing parameters. \endtable Basic camera state management, error reporting, and simple zoom properties are available in the Camera itself. For integration with C++ code, the \l mediaObject property allows you to access the standard Qt Multimedia camera controls. Many of the camera settings may take some time to apply, and might be limited to certain supported values depending on the hardware. Some camera settings may be set manually or automatically. These settings properties contain the current set value. For example, when autofocus is enabled the focus zones are exposed in the \l {CameraFocus}{focus} property. */ /*! \class QDeclarativeCamera \internal \brief The QDeclarativeCamera class provides a camera item that you can add to a QQuickView. */ /*! Construct a declarative camera object using \a parent object. */ QDeclarativeCamera::QDeclarativeCamera(QObject *parent) : QObject(parent), m_camera(0), m_pendingState(ActiveState), m_componentComplete(false) { m_camera = new QCamera(this); m_imageCapture = new QDeclarativeCameraCapture(m_camera, this); m_videoRecorder = new QDeclarativeCameraRecorder(m_camera, this); m_exposure = new QDeclarativeCameraExposure(m_camera, this); m_flash = new QDeclarativeCameraFlash(m_camera, this); m_focus = new QDeclarativeCameraFocus(m_camera, this); m_imageProcessing = new QDeclarativeCameraImageProcessing(m_camera, this); connect(m_camera, SIGNAL(captureModeChanged(QCamera::CaptureModes)), this, SIGNAL(captureModeChanged())); connect(m_camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)), this, SIGNAL(lockStatusChanged())); connect(m_camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(_q_updateState(QCamera::State))); connect(m_camera, SIGNAL(statusChanged(QCamera::Status)), this, SIGNAL(cameraStatusChanged())); connect(m_camera, SIGNAL(error(QCamera::Error)), this, SLOT(_q_error(QCamera::Error))); connect(m_camera, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); connect(m_camera->focus(), SIGNAL(opticalZoomChanged(qreal)), this, SIGNAL(opticalZoomChanged(qreal))); connect(m_camera->focus(), SIGNAL(digitalZoomChanged(qreal)), this, SIGNAL(digitalZoomChanged(qreal))); connect(m_camera->focus(), SIGNAL(maximumOpticalZoomChanged(qreal)), this, SIGNAL(maximumOpticalZoomChanged(qreal))); connect(m_camera->focus(), SIGNAL(maximumDigitalZoomChanged(qreal)), this, SIGNAL(maximumDigitalZoomChanged(qreal))); } /*! Destructor, clean up memory */ QDeclarativeCamera::~QDeclarativeCamera() { m_camera->unload(); } void QDeclarativeCamera::classBegin() { } void QDeclarativeCamera::componentComplete() { m_componentComplete = true; setCameraState(m_pendingState); } /*! Returns any camera error. \sa QDeclarativeCameraError::Error */ QDeclarativeCamera::Error QDeclarativeCamera::errorCode() const { return QDeclarativeCamera::Error(m_camera->error()); } /*! \qmlproperty string QtMultimedia5::Camera::errorString This property holds the last error string, if any. \sa QtMultimedia5::Camera::onError */ QString QDeclarativeCamera::errorString() const { return m_camera->errorString(); } /*! \qmlproperty enumeration QtMultimedia5::Camera::availability This property holds the availability state of the camera. The availability states can be one of the following: \table \header \li Value \li Description \row \li Available \li The camera is available to use \row \li Busy \li The camera is busy at the moment as it is being used by another process. \row \li Unavailable \li The camera is not available to use (there may be no camera hardware) \row \li ResourceMissing \li The camera cannot be used because of missing resources. It may be possible to try again at a later time. \endtable */ QDeclarativeCamera::Availability QDeclarativeCamera::availability() const { return Availability(m_camera->availability()); } /*! \qmlproperty enumeration QtMultimedia5::Camera::captureMode This property holds the camera capture mode, which can be one of the following: \table \header \li Value \li Description \row \li CaptureViewfinder \li Camera is only configured to display viewfinder. \row \li CaptureStillImage \li Prepares the Camera for capturing still images. \row \li CaptureVideo \li Prepares the Camera for capturing video. \endtable */ QDeclarativeCamera::CaptureMode QDeclarativeCamera::captureMode() const { return QDeclarativeCamera::CaptureMode(int(m_camera->captureMode())); } void QDeclarativeCamera::setCaptureMode(QDeclarativeCamera::CaptureMode mode) { m_camera->setCaptureMode(QCamera::CaptureModes(int(mode))); } /*! \qmlproperty enumeration QtMultimedia5::Camera::cameraState This property holds the camera object's current state, which can be one of the following: \table \header \li Value \li Description \row \li UnloadedState \li The initial camera state, with the camera not loaded. The camera capabilities (with the exception of supported capture modes) are unknown. This state saves the most power, but takes the longest time to be ready for capture. While the supported settings are unknown in this state, you can still set the camera capture settings like codec, resolution, or frame rate. \row \li LoadedState \li The camera is loaded and ready to be configured. In the Idle state you can query camera capabilities, set capture resolution, codecs, and so on. The viewfinder is not active in the loaded state. \row \li ActiveState \li In the active state the viewfinder frames are available and the camera is ready for capture. \endtable The default camera state is ActiveState. */ QDeclarativeCamera::State QDeclarativeCamera::cameraState() const { return m_componentComplete ? QDeclarativeCamera::State(m_camera->state()) : m_pendingState; } /*! \qmlproperty enumeration QtMultimedia5::Camera::cameraStatus This property holds the camera object's current status, which can be one of the following: \table \header \li Value \li Description \row \li ActiveStatus \li The camera has been started and can produce data, viewfinder displays video frames. Depending on backend, changing camera settings such as capture mode, codecs, or resolution in ActiveState may lead to changing the status to LoadedStatus and StartingStatus while the settings are applied, and back to ActiveStatus when the camera is ready. \row \li StartingStatus \li The camera is starting as a result of state transition to Camera.ActiveState. The camera service is not ready to capture yet. \row \li StoppingStatus \li The camera is stopping as a result of state transition from Camera.ActiveState to Camera.LoadedState or Camera.UnloadedState. \row \li StandbyStatus \li The camera is in the power saving standby mode. The camera may enter standby mode after some time of inactivity in the Camera.LoadedState state. \row \li LoadedStatus \li The camera is loaded and ready to be configured. This status indicates the camera device is opened and it's possible to query for supported image and video capture settings such as resolution, frame rate, and codecs. \row \li LoadingStatus \li The camera device loading as a result of state transition from Camera.UnloadedState to Camera.LoadedState or Camera.ActiveState. \row \li UnloadingStatus \li The camera device is unloading as a result of state transition from Camera.LoadedState or Camera.ActiveState to Camera.UnloadedState. \row \li UnloadedStatus \li The initial camera status, with camera not loaded. The camera capabilities including supported capture settings may be unknown. \row \li UnavailableStatus \li The camera or camera backend is not available. \endtable */ QDeclarativeCamera::Status QDeclarativeCamera::cameraStatus() const { return QDeclarativeCamera::Status(m_camera->status()); } void QDeclarativeCamera::setCameraState(QDeclarativeCamera::State state) { if (!m_componentComplete) { m_pendingState = state; return; } switch (state) { case QDeclarativeCamera::ActiveState: m_camera->start(); break; case QDeclarativeCamera::UnloadedState: m_camera->unload(); break; case QDeclarativeCamera::LoadedState: m_camera->load(); break; } } /*! \qmlmethod QtMultimedia5::Camera::start() Starts the camera. Viewfinder frames will be available and image or movie capture will be possible. */ void QDeclarativeCamera::start() { setCameraState(QDeclarativeCamera::ActiveState); } /*! \qmlmethod QtMultimedia5::Camera::stop() Stops the camera, but leaves the camera stack loaded. */ void QDeclarativeCamera::stop() { setCameraState(QDeclarativeCamera::LoadedState); } /*! \qmlproperty enumeration QtMultimedia5::Camera::lockStatus This property holds the status of all the requested camera locks. The status can be one of the following values: \table \header \li Value \li Description \row \li Unlocked \li The application is not interested in camera settings value. The camera may keep this parameter without changes, which is common with camera focus, or adjust exposure and white balance constantly to keep the viewfinder image nice. \row \li Searching \li The application has requested the camera focus, exposure, or white balance lock with searchAndLock(). This state indicates the camera is focusing or calculating exposure and white balance. \row \li Locked \li The camera focus, exposure, or white balance is locked. The camera is ready to capture, and the application may check the exposure parameters. The locked state usually means the requested parameter stays the same, except in cases where the parameter is requested to be updated constantly. For example in continuous focusing mode, the focus is considered locked as long as the object is in focus, even while the actual focusing distance may be constantly changing. \endtable */ /*! \property QDeclarativeCamera::lockStatus This property holds the status of all the requested camera locks. The status can be one of the following: \table \header \li Value \li Description \row \li Unlocked \li The application is not interested in camera settings value. The camera may keep this parameter without changes, this is common with camera focus, or adjust exposure and white balance constantly to keep the viewfinder image nice. \row \li Searching \li The application has requested the camera focus, exposure or white balance lock with searchAndLock(). This state indicates the camera is focusing or calculating exposure and white balance. \row \li Locked \li The camera focus, exposure or white balance is locked. The camera is ready to capture, and the application may check the exposure parameters. The locked state usually means the requested parameter stays the same, except in the cases when the parameter is requested to be updated constantly. For example in continuous focusing mode, the focus is considered locked as long and the object is in focus, even while the actual focusing distance may be constantly changing. \endtable */ QDeclarativeCamera::LockStatus QDeclarativeCamera::lockStatus() const { return QDeclarativeCamera::LockStatus(m_camera->lockStatus()); } /*! \qmlmethod QtMultimedia5::Camera::searchAndLock() Start focusing, exposure and white balance calculation. This is appropriate to call when the camera focus button is pressed (or on a camera capture button half-press). If the camera supports autofocusing, information on the focus zones is available through the \l {CameraFocus}{focus} property. */ void QDeclarativeCamera::searchAndLock() { m_camera->searchAndLock(); } /*! \qmlmethod QtMultimedia5::Camera::unlock() Unlock focus, exposure and white balance locks. */ void QDeclarativeCamera::unlock() { m_camera->unlock(); } /*! \property QDeclarativeCamera::maximumOpticalZoom This property holds the maximum optical zoom factor supported, or 1.0 if optical zoom is not supported. */ /*! \qmlproperty real QtMultimedia5::Camera::maximumOpticalZoom This property holds the maximum optical zoom factor supported, or 1.0 if optical zoom is not supported. */ qreal QDeclarativeCamera::maximumOpticalZoom() const { return m_camera->focus()->maximumOpticalZoom(); } /*! \property QDeclarativeCamera::maximumDigitalZoom This property holds the maximum digital zoom factor supported, or 1.0 if digital zoom is not supported. */ /*! \qmlproperty real QtMultimedia5::Camera::maximumDigitalZoom This property holds the maximum digital zoom factor supported, or 1.0 if digital zoom is not supported. */ qreal QDeclarativeCamera::maximumDigitalZoom() const { return m_camera->focus()->maximumDigitalZoom(); } /*! \property QDeclarativeCamera::opticalZoom This property holds the current optical zoom factor. */ /*! \qmlproperty real QtMultimedia5::Camera::opticalZoom This property holds the current optical zoom factor. */ qreal QDeclarativeCamera::opticalZoom() const { return m_camera->focus()->opticalZoom(); } void QDeclarativeCamera::setOpticalZoom(qreal value) { m_camera->focus()->zoomTo(value, digitalZoom()); } /*! \property QDeclarativeCamera::digitalZoom This property holds the current digital zoom factor. */ /*! \qmlproperty real QtMultimedia5::Camera::digitalZoom This property holds the current digital zoom factor. */ qreal QDeclarativeCamera::digitalZoom() const { return m_camera->focus()->digitalZoom(); } void QDeclarativeCamera::setDigitalZoom(qreal value) { m_camera->focus()->zoomTo(opticalZoom(), value); } /*! \qmlproperty variant QtMultimedia5::Camera::mediaObject This property holds the media object for the camera. */ /*! \qmlproperty enumeration QtMultimedia5::Camera::errorCode This property holds the last error code. \sa QtMultimedia5::Camera::onError */ /*! \qmlsignal QtMultimedia5::Camera::onError(errorCode, errorString) This handler is called when an error occurs. The enumeration value \a errorCode is one of the values defined below, and a descriptive string value is available in \a errorString. \table \header \li Value \li Description \row \li NoError \li No errors have occurred. \row \li CameraError \li An error has occurred. \row \li InvalidRequestError \li System resource doesn't support requested functionality. \row \li ServiceMissingError \li No camera service available. \row \li NotSupportedFeatureError \li The feature is not supported. \endtable */ /*! \qmlsignal Camera::lockStatusChanged() This signal is emitted when the lock status (focus, exposure etc) changes. This can happen when locking (e.g. autofocusing) is complete or has failed. */ /*! \qmlsignal Camera::stateChanged(state) This signal is emitted when the camera state has changed to \a state. Since the state changes may take some time to occur this signal may arrive sometime after the state change has been requested. */ /*! \qmlsignal Camera::opticalZoomChanged(zoom) The optical zoom setting has changed to \a zoom. */ /*! \qmlsignal Camera::digitalZoomChanged(zoom) The digital zoom setting has changed to \a zoom. */ /*! \qmlsignal Camera::maximumOpticalZoomChanged(zoom) The maximum optical zoom setting has changed to \a zoom. This can occur when you change between video and still image capture modes, or the capture settings are changed. */ /*! \qmlsignal Camera::maximumDigitalZoomChanged(zoom) The maximum digital zoom setting has changed to \a zoom. This can occur when you change between video and still image capture modes, or the capture settings are changed. */ QT_END_NAMESPACE #include "moc_qdeclarativecamera_p.cpp" qdeclarativecamera_p.h000066400000000000000000000253571225012771600334570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERA_H #define QDECLARATIVECAMERA_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qdeclarativecameracapture_p.h" #include "qdeclarativecamerarecorder_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeCameraExposure; class QDeclarativeCameraFocus; class QDeclarativeCameraFlash; class QDeclarativeCameraImageProcessing; class QDeclarativeCamera : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(CaptureMode captureMode READ captureMode WRITE setCaptureMode NOTIFY captureModeChanged) Q_PROPERTY(State cameraState READ cameraState WRITE setCameraState NOTIFY cameraStateChanged) Q_PROPERTY(Status cameraStatus READ cameraStatus NOTIFY cameraStatusChanged) Q_PROPERTY(LockStatus lockStatus READ lockStatus NOTIFY lockStatusChanged) Q_PROPERTY(Error errorCode READ errorCode NOTIFY errorChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged) Q_PROPERTY(Availability availability READ availability NOTIFY availabilityChanged) Q_PROPERTY(qreal opticalZoom READ opticalZoom WRITE setOpticalZoom NOTIFY opticalZoomChanged) Q_PROPERTY(qreal maximumOpticalZoom READ maximumOpticalZoom NOTIFY maximumOpticalZoomChanged) Q_PROPERTY(qreal digitalZoom READ digitalZoom WRITE setDigitalZoom NOTIFY digitalZoomChanged) Q_PROPERTY(qreal maximumDigitalZoom READ maximumDigitalZoom NOTIFY maximumDigitalZoomChanged) Q_PROPERTY(QObject *mediaObject READ mediaObject NOTIFY mediaObjectChanged SCRIPTABLE false DESIGNABLE false) Q_PROPERTY(QDeclarativeCameraCapture* imageCapture READ imageCapture CONSTANT) Q_PROPERTY(QDeclarativeCameraRecorder* videoRecorder READ videoRecorder CONSTANT) Q_PROPERTY(QDeclarativeCameraExposure* exposure READ exposure CONSTANT) Q_PROPERTY(QDeclarativeCameraFlash* flash READ flash CONSTANT) Q_PROPERTY(QDeclarativeCameraFocus* focus READ focus CONSTANT) Q_PROPERTY(QDeclarativeCameraImageProcessing* imageProcessing READ imageProcessing CONSTANT) Q_ENUMS(CaptureMode) Q_ENUMS(State) Q_ENUMS(Status) Q_ENUMS(LockStatus) Q_ENUMS(Error) Q_ENUMS(FlashMode) Q_ENUMS(ExposureMode) Q_ENUMS(MeteringMode) Q_ENUMS(FocusMode) Q_ENUMS(FocusPointMode) Q_ENUMS(FocusAreaStatus) Q_ENUMS(Availability) public: enum CaptureMode { CaptureViewfinder = QCamera::CaptureViewfinder, CaptureStillImage = QCamera::CaptureStillImage, CaptureVideo = QCamera::CaptureVideo }; enum State { ActiveState = QCamera::ActiveState, LoadedState = QCamera::LoadedState, UnloadedState = QCamera::UnloadedState }; enum Status { UnavailableStatus = QCamera::UnavailableStatus, UnloadedStatus = QCamera::UnloadedStatus, LoadingStatus = QCamera::LoadingStatus, UnloadingStatus = QCamera::UnloadingStatus, LoadedStatus = QCamera::LoadedStatus, StandbyStatus = QCamera::StandbyStatus, StartingStatus = QCamera::StartingStatus, StoppingStatus = QCamera::StoppingStatus, ActiveStatus = QCamera::ActiveStatus }; enum LockStatus { Unlocked = QCamera::Unlocked, Searching = QCamera::Searching, Locked = QCamera::Locked }; enum Error { NoError = QCamera::NoError, CameraError = QCamera::CameraError, InvalidRequestError = QCamera::InvalidRequestError, ServiceMissingError = QCamera::ServiceMissingError, NotSupportedFeatureError = QCamera::NotSupportedFeatureError }; enum FlashMode { FlashAuto = QCameraExposure::FlashAuto, FlashOff = QCameraExposure::FlashOff, FlashOn = QCameraExposure::FlashOn, FlashRedEyeReduction = QCameraExposure::FlashRedEyeReduction, FlashFill = QCameraExposure::FlashFill, FlashTorch = QCameraExposure::FlashTorch, FlashVideoLight = QCameraExposure::FlashVideoLight, FlashSlowSyncFrontCurtain = QCameraExposure::FlashSlowSyncFrontCurtain, FlashSlowSyncRearCurtain = QCameraExposure::FlashSlowSyncRearCurtain, FlashManual = QCameraExposure::FlashManual }; enum ExposureMode { ExposureAuto = QCameraExposure::ExposureAuto, ExposureManual = QCameraExposure::ExposureManual, ExposurePortrait = QCameraExposure::ExposurePortrait, ExposureNight = QCameraExposure::ExposureNight, ExposureBacklight = QCameraExposure::ExposureBacklight, ExposureSpotlight = QCameraExposure::ExposureSpotlight, ExposureSports = QCameraExposure::ExposureSports, ExposureSnow = QCameraExposure::ExposureSnow, ExposureBeach = QCameraExposure::ExposureBeach, ExposureLargeAperture = QCameraExposure::ExposureLargeAperture, ExposureSmallAperture = QCameraExposure::ExposureSmallAperture, ExposureModeVendor = QCameraExposure::ExposureModeVendor }; enum MeteringMode { MeteringMatrix = QCameraExposure::MeteringMatrix, MeteringAverage = QCameraExposure::MeteringAverage, MeteringSpot = QCameraExposure::MeteringSpot }; enum FocusMode { FocusManual = QCameraFocus::ManualFocus, FocusHyperfocal = QCameraFocus::HyperfocalFocus, FocusInfinity = QCameraFocus::InfinityFocus, FocusAuto = QCameraFocus::AutoFocus, FocusContinuous = QCameraFocus::ContinuousFocus, FocusMacro = QCameraFocus::MacroFocus }; enum FocusPointMode { FocusPointAuto = QCameraFocus::FocusPointAuto, FocusPointCenter = QCameraFocus::FocusPointCenter, FocusPointFaceDetection = QCameraFocus::FocusPointFaceDetection, FocusPointCustom = QCameraFocus::FocusPointCustom }; enum FocusAreaStatus { FocusAreaUnused = QCameraFocusZone::Unused, FocusAreaSelected = QCameraFocusZone::Selected, FocusAreaFocused = QCameraFocusZone::Focused }; enum Availability { Available = QMultimedia::Available, Busy = QMultimedia::Busy, Unavailable = QMultimedia::ServiceMissing, ResourceMissing = QMultimedia::ResourceError }; QDeclarativeCamera(QObject *parent = 0); ~QDeclarativeCamera(); QObject *mediaObject() { return m_camera; } QDeclarativeCameraCapture *imageCapture() { return m_imageCapture; } QDeclarativeCameraRecorder *videoRecorder() { return m_videoRecorder; } QDeclarativeCameraExposure *exposure() { return m_exposure; } QDeclarativeCameraFlash *flash() { return m_flash; } QDeclarativeCameraFocus *focus() { return m_focus; } QDeclarativeCameraImageProcessing *imageProcessing() { return m_imageProcessing; } CaptureMode captureMode() const; State cameraState() const; Status cameraStatus() const; Error errorCode() const; QString errorString() const; LockStatus lockStatus() const; qreal maximumOpticalZoom() const; qreal maximumDigitalZoom() const; qreal opticalZoom() const; qreal digitalZoom() const; Availability availability() const; public Q_SLOTS: void setCaptureMode(CaptureMode mode); void start(); void stop(); void setCameraState(State state); void searchAndLock(); void unlock(); void setOpticalZoom(qreal); void setDigitalZoom(qreal); Q_SIGNALS: void errorChanged(); void error(QDeclarativeCamera::Error errorCode, const QString &errorString); void captureModeChanged(); void cameraStateChanged(QDeclarativeCamera::State); void cameraStatusChanged(); void lockStatusChanged(); void opticalZoomChanged(qreal); void digitalZoomChanged(qreal); void maximumOpticalZoomChanged(qreal); void maximumDigitalZoomChanged(qreal); void mediaObjectChanged(); void availabilityChanged(Availability availability); private Q_SLOTS: void _q_updateState(QCamera::State); void _q_error(QCamera::Error); void _q_availabilityChanged(QMultimedia::AvailabilityStatus); protected: void classBegin(); void componentComplete(); private: Q_DISABLE_COPY(QDeclarativeCamera) QCamera *m_camera; QDeclarativeCameraCapture *m_imageCapture; QDeclarativeCameraRecorder *m_videoRecorder; QDeclarativeCameraExposure *m_exposure; QDeclarativeCameraFlash *m_flash; QDeclarativeCameraFocus *m_focus; QDeclarativeCameraImageProcessing *m_imageProcessing; State m_pendingState; bool m_componentComplete; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCamera)) #endif qdeclarativecameracapture.cpp000066400000000000000000000262351225012771600350530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecameracapture_p.h" #include "qdeclarativecamerapreviewprovider_p.h" #include #include QT_BEGIN_NAMESPACE /*! \qmltype CameraCapture \instantiates QDeclarativeCameraCapture \brief An interface for capturing camera images \ingroup multimedia_qml \inqmlmodule QtMultimedia 5.0 \ingroup camera_qml This type allows you to capture still images and be notified when they are available or saved to disk. You can adjust the resolution of the captured image and where the saved image should go. CameraCapture is a child of a \l Camera (as the \c imageCapture property) and cannot be created directly. \qml import QtQuick 2.0 import QtMultimedia 5.0 Item { width: 640 height: 360 Camera { id: camera imageCapture { onImageCaptured: { // Show the preview in an Image photoPreview.source = preview } } } VideoOutput { source: camera focus : visible // to receive focus and capture key events when visible anchors.fill: parent MouseArea { anchors.fill: parent; onClicked: camera.imageCapture.capture(); } } Image { id: photoPreview } } \endqml */ QDeclarativeCameraCapture::QDeclarativeCameraCapture(QCamera *camera, QObject *parent) : QObject(parent), m_camera(camera) { m_capture = new QCameraImageCapture(camera, this); connect(m_capture, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool))); connect(m_capture, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(m_capture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(_q_imageCaptured(int, QImage))); connect(m_capture, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SLOT(_q_imageMetadataAvailable(int,QString,QVariant))); connect(m_capture, SIGNAL(imageSaved(int,QString)), this, SLOT(_q_imageSaved(int, QString))); connect(m_capture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this, SLOT(_q_captureFailed(int,QCameraImageCapture::Error,QString))); QMediaService *service = camera->service(); m_metadataWriterControl = service ? service->requestControl() : 0; } QDeclarativeCameraCapture::~QDeclarativeCameraCapture() { } /*! \property QDeclarativeCameraCapture::ready This property holds a bool value indicating whether the camera is ready to capture photos or not. If camera is not ready to capture image immediately, the capture request is queued with all the related camera settings, and the request will be executed as soon as possible. */ /*! \qmlproperty bool QtMultimedia5::CameraCapture::ready This property holds a bool value indicating whether the camera is ready to capture photos or not. It's permissible to call capture() while the camera is active regardless of the \e ready property value. If camera is not ready to capture image immediately, the capture request is queued with all the related camera settings, and the request will be executed as soon as possible. */ bool QDeclarativeCameraCapture::isReadyForCapture() const { return m_capture->isReadyForCapture(); } /*! \qmlmethod QtMultimedia5::CameraCapture::capture() Start image capture. The \l onImageCaptured() and \l onImageSaved() signals will be emitted when the capture is complete. The image will be captured to the default system location, typically QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) for still imaged or QStandardPaths::writableLocation(QStandardPaths::MoviesLocation) for video. Camera saves all the capture parameters like exposure settings or image processing parameters, so changes to camera paramaters after capture() is called do not affect previous capture requests. CameraCapture::capture returns the capture requestId parameter, used with imageExposed(), imageCaptured(), imageMetadataAvailable() and imageSaved() signals. */ int QDeclarativeCameraCapture::capture() { return m_capture->capture(); } /*! \qmlmethod QtMultimedia5::CameraCapture::captureToLocation(location) Start image capture to specified \a location. The \l onImageCaptured() and \l onImageSaved() signals will be emitted when the capture is complete. CameraCapture::captureToLocation returns the capture requestId parameter, used with imageExposed(), imageCaptured(), imageMetadataAvailable() and imageSaved() signals. If the application is unable to write to the location specified by \c location the CameraCapture will emit an error. The most likely reasons for the application to be unable to write to a location is that the path is wrong and the location does not exists, or the application does not have write permission for that location. */ int QDeclarativeCameraCapture::captureToLocation(const QString &location) { return m_capture->capture(location); } /*! \qmlmethod QtMultimedia5::CameraCapture::cancelCapture() Cancel pending image capture requests. */ void QDeclarativeCameraCapture::cancelCapture() { m_capture->cancelCapture(); } /*! \property QDeclarativeCameraCapture::capturedImagePath This property holds the location of the last captured image. */ /*! \qmlproperty string QtMultimedia5::CameraCapture::capturedImagePath This property holds the location of the last captured image. */ QString QDeclarativeCameraCapture::capturedImagePath() const { return m_capturedImagePath; } void QDeclarativeCameraCapture::_q_imageCaptured(int id, const QImage &preview) { QString previewId = QString("preview_%1").arg(id); QDeclarativeCameraPreviewProvider::registerPreview(previewId, preview); emit imageCaptured(id, QLatin1String("image://camera/")+previewId); } void QDeclarativeCameraCapture::_q_imageSaved(int id, const QString &fileName) { m_capturedImagePath = fileName; emit imageSaved(id, fileName); } void QDeclarativeCameraCapture::_q_imageMetadataAvailable(int id, const QString &key, const QVariant &value) { emit imageMetadataAvailable(id, key, value); } void QDeclarativeCameraCapture::_q_captureFailed(int id, QCameraImageCapture::Error error, const QString &message) { Q_UNUSED(error); qWarning() << "QCameraImageCapture error:" << message; emit captureFailed(id, message); } /*! \property QDeclarativeCameraCapture::resolution This property holds the resolution/size of the image to be captured. If empty, the system chooses the appropriate resolution. */ /*! \qmlproperty size QtMultimedia5::CameraCapture::resolution This property holds the resolution/size of the image to be captured. If empty, the system chooses the appropriate resolution. */ QSize QDeclarativeCameraCapture::resolution() { return m_imageSettings.resolution(); } void QDeclarativeCameraCapture::setResolution(const QSize &captureResolution) { if (captureResolution != resolution()) { m_imageSettings.setResolution(captureResolution); m_capture->setEncodingSettings(m_imageSettings); emit resolutionChanged(captureResolution); } } QCameraImageCapture::Error QDeclarativeCameraCapture::error() const { return m_capture->error(); } /*! \property QDeclarativeCameraCapture::errorString This property holds the error message related to the last capture. */ /*! \qmlproperty string QtMultimedia5::CameraCapture::errorString This property holds the error message related to the last capture. */ QString QDeclarativeCameraCapture::errorString() const { return m_capture->errorString(); } /*! \qmlmethod QtMultimedia5::CameraCapture::setMetadata(key, value) Sets a particular metadata \a key to \a value for the subsequent image captures. \sa QMediaMetaData */ void QDeclarativeCameraCapture::setMetadata(const QString &key, const QVariant &value) { if (m_metadataWriterControl) m_metadataWriterControl->setMetaData(key, value); } /*! \qmlsignal QtMultimedia5::CameraCapture::onCaptureFailed(requestId, message) This handler is called when an error occurs during capture with \a requestId. A descriptive message is available in \a message. */ /*! \qmlsignal QtMultimedia5::CameraCapture::onImageCaptured(requestId, preview) This handler is called when an image with \a requestId has been captured but not yet saved to the filesystem. The \a preview parameter can be used as the URL supplied to an \l Image. \sa onImageSaved */ /*! \qmlsignal QtMultimedia5::CameraCapture::onImageSaved(requestId, path) This handler is called after the image with \a requestId has been written to the filesystem. The \a path is a local file path, not a URL. \sa onImageCaptured */ /*! \qmlsignal QtMultimedia5::CameraCapture::onImageMetadataAvailable(requestId, key, value) This handler is called when the image with \a requestId has new metadata available with the key \a key and value \a value. \sa onImageCaptured */ QT_END_NAMESPACE #include "moc_qdeclarativecameracapture_p.cpp" qdeclarativecameracapture_p.h000066400000000000000000000104541225012771600350330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERACAPTURE_H #define QDECLARATIVECAMERACAPTURE_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeCamera; class QMetaDataWriterControl; class QDeclarativeCameraCapture : public QObject { Q_OBJECT Q_PROPERTY(bool ready READ isReadyForCapture NOTIFY readyForCaptureChanged) Q_PROPERTY(QString capturedImagePath READ capturedImagePath NOTIFY imageSaved) Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY captureFailed) public: ~QDeclarativeCameraCapture(); bool isReadyForCapture() const; QSize resolution(); QString capturedImagePath() const; QCameraImageCapture::Error error() const; QString errorString() const; public Q_SLOTS: int capture(); int captureToLocation(const QString &location); void cancelCapture(); void setResolution(const QSize &resolution); void setMetadata(const QString &key, const QVariant &value); Q_SIGNALS: void readyForCaptureChanged(bool); void imageExposed(int requestId); void imageCaptured(int requestId, const QString &preview); void imageMetadataAvailable(int requestId, const QString &key, const QVariant &value); void imageSaved(int requestId, const QString &path); void captureFailed(int requestId, const QString &message); void resolutionChanged(const QSize &); private slots: void _q_imageCaptured(int, const QImage&); void _q_imageSaved(int, const QString&); void _q_imageMetadataAvailable(int, const QString &, const QVariant &); void _q_captureFailed(int, QCameraImageCapture::Error, const QString&); private: friend class QDeclarativeCamera; QDeclarativeCameraCapture(QCamera *camera, QObject *parent = 0); QCamera *m_camera; QCameraImageCapture *m_capture; QImageEncoderSettings m_imageSettings; QString m_capturedImagePath; QMetaDataWriterControl *m_metadataWriterControl; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraCapture)) #endif qdeclarativecameraexposure.cpp000066400000000000000000000327771225012771600352720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecameraexposure_p.h" QT_BEGIN_NAMESPACE /*! \qmltype CameraExposure \instantiates QDeclarativeCameraExposure \brief An interface for exposure related camera settings. \ingroup multimedia_qml \ingroup camera_qml \inqmlmodule QtMultimedia 5.0 This type is part of the \b{QtMultimedia 5.0} module. CameraExposure allows you to adjust exposure related settings like aperture and shutter speed, metering and ISO speed. It should not be constructed separately, instead the \c exposure property of the a \l Camera should be used. \qml import QtQuick 2.0 import QtMultimedia 5.0 Camera { id: camera exposure.exposureCompensation: -1.0 exposure.exposureMode: Camera.ExposurePortrait } \endqml Several settings have both an automatic and a manual mode. In the automatic modes the camera software itself will decide what a reasonable setting is, but in most cases these settings can be overridden with a specific manual setting. For example, to select automatic shutter speed selection: \code camera.exposure.setAutoShutterSpeed() \endcode Or for a specific shutter speed: \code camera.exposure.manualShutterSpeed = 0.01 // 10ms \endcode You can only choose one or the other mode. */ /*! \internal \class QDeclarativeCameraExposure \brief The CameraExposure provides interface for exposure related camera settings. */ /*! Construct a declarative camera exposure object using \a parent object. */ QDeclarativeCameraExposure::QDeclarativeCameraExposure(QCamera *camera, QObject *parent) : QObject(parent) { m_exposure = camera->exposure(); connect(m_exposure, SIGNAL(isoSensitivityChanged(int)), this, SIGNAL(isoSensitivityChanged(int))); connect(m_exposure, SIGNAL(apertureChanged(qreal)), this, SIGNAL(apertureChanged(qreal))); connect(m_exposure, SIGNAL(shutterSpeedChanged(qreal)), this, SIGNAL(shutterSpeedChanged(qreal))); connect(m_exposure, SIGNAL(exposureCompensationChanged(qreal)), this, SIGNAL(exposureCompensationChanged(qreal))); } QDeclarativeCameraExposure::~QDeclarativeCameraExposure() { } /*! \property QDeclarativeCameraExposure::exposureCompensation This property holds the adjustment value for the automatically calculated exposure. The value is in EV units. */ /*! \qmlproperty real QtMultimedia5::CameraExposure::exposureCompensation This property holds the adjustment value for the automatically calculated exposure. The value is in EV units. */ qreal QDeclarativeCameraExposure::exposureCompensation() const { return m_exposure->exposureCompensation(); } void QDeclarativeCameraExposure::setExposureCompensation(qreal ev) { m_exposure->setExposureCompensation(ev); } /*! \property QDeclarativeCameraExposure::iso This property holds the sensor's ISO sensitivity value. */ /*! \qmlproperty int QtMultimedia5::CameraExposure::iso This property holds the sensor's ISO sensitivity value. */ int QDeclarativeCameraExposure::isoSensitivity() const { return m_exposure->isoSensitivity(); } /*! \property QDeclarativeCameraExposure::shutterSpeed This property holds the camera's shutter speed value in seconds. To affect the shutter speed you can use the \l manualShutterSpeed property and \l setAutoShutterSpeed(). */ /*! \qmlproperty real QtMultimedia5::CameraExposure::shutterSpeed This property holds the camera's current shutter speed value in seconds. To affect the shutter speed you can use the \l manualShutterSpeed property and \l setAutoShutterSpeed(). */ qreal QDeclarativeCameraExposure::shutterSpeed() const { return m_exposure->shutterSpeed(); } /*! \property QDeclarativeCameraExposure::aperture This property holds the current lens aperture as an F number (the ratio of the focal length to effective aperture diameter). \sa manualAperture, setAutoAperture() */ /*! \qmlproperty real QtMultimedia5::CameraExposure::aperture This property holds the current lens aperture as an F number (the ratio of the focal length to effective aperture diameter). \sa manualAperture, setAutoAperture() */ qreal QDeclarativeCameraExposure::aperture() const { return m_exposure->aperture(); } /*! \property QDeclarativeCameraExposure::manualIso This property holds the ISO settings for capturing photos. If the value is negative, the camera will automatically determine an appropriate value. \sa iso, setAutoIsoSensitivity() */ /*! \qmlproperty real QtMultimedia5::CameraExposure::manualIso This property holds the ISO settings for capturing photos. If a negative value is specified, the camera will automatically determine an appropriate value. \sa iso, setAutoIsoSensitivity() */ int QDeclarativeCameraExposure::manualIsoSensitivity() const { return m_manualIso; } void QDeclarativeCameraExposure::setManualIsoSensitivity(int iso) { m_manualIso = iso; if (iso > 0) m_exposure->setManualIsoSensitivity(iso); else m_exposure->setAutoIsoSensitivity(); emit manualIsoSensitivityChanged(iso); } /*! \property QDeclarativeCameraExposure::manualShutterSpeed This property holds the shutter speed value (in seconds). If the value is less than zero, the camera automatically determines an appropriate shutter speed. \l shutterSpeed, setAutoShutterSpeed() */ /*! \qmlproperty real QtMultimedia5::CameraExposure::manualShutterSpeed This property holds the shutter speed value (in seconds). If the value is less than zero, the camera automatically determines an appropriate shutter speed. \l shutterSpeed, setAutoShutterSpeed() */ qreal QDeclarativeCameraExposure::manualShutterSpeed() const { return m_manualShutterSpeed; } void QDeclarativeCameraExposure::setManualShutterSpeed(qreal speed) { m_manualShutterSpeed = speed; if (speed > 0) m_exposure->setManualShutterSpeed(speed); else m_exposure->setAutoShutterSpeed(); emit manualShutterSpeedChanged(speed); } /*! \property QDeclarativeCameraExposure::manualAperture This property holds aperture (F number) value for capturing photos. If the value is less than zero, the camera automatically determines an appropriate aperture value. \l aperture, setAutoAperture() */ /*! \qmlproperty real QtMultimedia5::CameraExposure::manualAperture This property holds the aperture (F number) value for capturing photos. If the value is less than zero, the camera automatically determines an appropriate aperture value. \l aperture, setAutoAperture() */ qreal QDeclarativeCameraExposure::manualAperture() const { return m_manualAperture; } void QDeclarativeCameraExposure::setManualAperture(qreal aperture) { m_manualAperture = aperture; if (aperture > 0) m_exposure->setManualAperture(aperture); else m_exposure->setAutoAperture(); emit manualApertureChanged(aperture); } /*! \qmlmethod QtMultimedia5::CameraExposure::setAutoAperture() Turn on auto aperture selection. The manual aperture value is reset to -1.0 */ void QDeclarativeCameraExposure::setAutoAperture() { setManualAperture(-1.0); } /*! \qmlmethod QtMultimedia5::CameraExposure::setAutoShutterSpeed() Turn on auto shutter speed selection. The manual shutter speed value is reset to -1.0 */ void QDeclarativeCameraExposure::setAutoShutterSpeed() { setManualShutterSpeed(-1.0); } /*! \qmlmethod QtMultimedia5::CameraExposure::setAutoIsoSensitivity() Turn on auto ISO sensitivity selection. The manual ISO value is reset to -1. */ void QDeclarativeCameraExposure::setAutoIsoSensitivity() { setManualIsoSensitivity(-1); } /*! \property QDeclarativeCameraExposure::exposureMode This property holds the camera exposure mode. The mode can one of the values in \l QCameraExposure::ExposureMode. */ /*! \qmlproperty enumeration QtMultimedia5::CameraExposure::exposureMode This property holds the camera exposure mode. The mode can be one of the following: \table \header \li Value \li Description \row \li Camera.ExposureManual \li Manual mode. \row \li Camera.ExposureAuto \li Automatic mode. \row \li Camera.ExposureNight \li Night mode. \row \li Camera.ExposureBacklight \li Backlight exposure mode. \row \li Camera.ExposureSpotlight \li Spotlight exposure mode. \row \li Camera.ExposureSports \li Spots exposure mode. \row \li Camera.ExposureSnow \li Snow exposure mode. \row \li Camera.ExposureBeach \li Beach exposure mode. \row \li Camera.ExposureLargeAperture \li Use larger aperture with small depth of field. \row \li Camera.ExposureSmallAperture \li Use smaller aperture. \row \li Camera.ExposurePortrait \li Portrait exposure mode. \row \li Camera.ExposureModeVendor \li The base value for device specific exposure modes. \endtable */ QDeclarativeCamera::ExposureMode QDeclarativeCameraExposure::exposureMode() const { return QDeclarativeCamera::ExposureMode(m_exposure->exposureMode()); } void QDeclarativeCameraExposure::setExposureMode(QDeclarativeCamera::ExposureMode mode) { if (exposureMode() != mode) { m_exposure->setExposureMode(QCameraExposure::ExposureMode(mode)); emit exposureModeChanged(exposureMode()); } } /*! \property QDeclarativeCameraExposure::spotMeteringPoint This property holds the relative frame coordinates of the point to use for exposure metering. This point is only used in spot metering mode, and it typically defaults to the center \c (0.5, 0.5). */ /*! \qmlproperty QPointF QtMultimedia5::CameraExposure::spotMeteringPoint The property holds the frame coordinates of the point to use for exposure metering. This point is only used in spot metering mode, and it typically defaults to the center \c (0.5, 0.5). */ QPointF QDeclarativeCameraExposure::spotMeteringPoint() const { return m_exposure->spotMeteringPoint(); } void QDeclarativeCameraExposure::setSpotMeteringPoint(const QPointF &point) { QPointF oldPoint(spotMeteringPoint()); m_exposure->setSpotMeteringPoint(point); if (oldPoint != spotMeteringPoint()) emit spotMeteringPointChanged(spotMeteringPoint()); } /*! \property QDeclarativeCameraExposure::meteringMode This property holds the camera metering mode (how exposure is balanced). The mode can be one of the constants in \l QCameraExposure::MeteringMode. */ /*! \qmlproperty enumeration QtMultimedia5::CameraExposure::meteringMode This property holds the camera metering mode (how exposure is balanced). The mode can be one of the following: \table \header \li Value \li Description \row \li Camera.MeteringMatrix \li A matrix of sample points is used to measure exposure. \row \li Camera.MeteringAverage \li An average is used to measure exposure. \row \li Camera.MeteringSpot \li A specific location (\l spotMeteringPoint) is used to measure exposure. \endtable */ QDeclarativeCamera::MeteringMode QDeclarativeCameraExposure::meteringMode() const { return QDeclarativeCamera::MeteringMode(m_exposure->meteringMode()); } void QDeclarativeCameraExposure::setMeteringMode(QDeclarativeCamera::MeteringMode mode) { QDeclarativeCamera::MeteringMode oldMode = meteringMode(); m_exposure->setMeteringMode(QCameraExposure::MeteringMode(mode)); if (oldMode != meteringMode()) emit meteringModeChanged(meteringMode()); } QT_END_NAMESPACE #include "moc_qdeclarativecameraexposure_p.cpp" qdeclarativecameraexposure_p.h000066400000000000000000000122371225012771600352430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERAEXPOSURE_H #define QDECLARATIVECAMERAEXPOSURE_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qdeclarativecamera_p.h" #include #include QT_BEGIN_NAMESPACE class QDeclarativeCamera; class QDeclarativeCameraExposure : public QObject { Q_OBJECT Q_PROPERTY(qreal exposureCompensation READ exposureCompensation WRITE setExposureCompensation NOTIFY exposureCompensationChanged) Q_PROPERTY(int iso READ isoSensitivity NOTIFY isoSensitivityChanged) Q_PROPERTY(qreal shutterSpeed READ shutterSpeed NOTIFY shutterSpeedChanged) Q_PROPERTY(qreal aperture READ aperture NOTIFY apertureChanged) Q_PROPERTY(qreal manualShutterSpeed READ manualShutterSpeed WRITE setManualShutterSpeed NOTIFY manualShutterSpeedChanged) Q_PROPERTY(qreal manualAperture READ manualAperture WRITE setManualAperture NOTIFY manualApertureChanged) Q_PROPERTY(qreal manualIso READ manualIsoSensitivity WRITE setManualIsoSensitivity NOTIFY manualIsoSensitivityChanged) Q_PROPERTY(QDeclarativeCamera::ExposureMode exposureMode READ exposureMode WRITE setExposureMode NOTIFY exposureModeChanged) Q_PROPERTY(QPointF spotMeteringPoint READ spotMeteringPoint WRITE setSpotMeteringPoint NOTIFY spotMeteringPointChanged) Q_PROPERTY(QDeclarativeCamera::MeteringMode meteringMode READ meteringMode WRITE setMeteringMode NOTIFY meteringModeChanged) public: ~QDeclarativeCameraExposure(); QDeclarativeCamera::ExposureMode exposureMode() const; qreal exposureCompensation() const; int isoSensitivity() const; qreal shutterSpeed() const; qreal aperture() const; int manualIsoSensitivity() const; qreal manualShutterSpeed() const; qreal manualAperture() const; QPointF spotMeteringPoint() const; void setSpotMeteringPoint(const QPointF &point); QDeclarativeCamera::MeteringMode meteringMode() const; void setMeteringMode(QDeclarativeCamera::MeteringMode mode); public Q_SLOTS: void setExposureMode(QDeclarativeCamera::ExposureMode); void setExposureCompensation(qreal ev); void setManualAperture(qreal); void setManualShutterSpeed(qreal); void setManualIsoSensitivity(int iso); void setAutoAperture(); void setAutoShutterSpeed(); void setAutoIsoSensitivity(); Q_SIGNALS: void isoSensitivityChanged(int); void apertureChanged(qreal); void shutterSpeedChanged(qreal); void manualIsoSensitivityChanged(int); void manualApertureChanged(qreal); void manualShutterSpeedChanged(qreal); void exposureCompensationChanged(qreal); void exposureModeChanged(QDeclarativeCamera::ExposureMode); void meteringModeChanged(QDeclarativeCamera::MeteringMode); void spotMeteringPointChanged(QPointF); private: friend class QDeclarativeCamera; QDeclarativeCameraExposure(QCamera *camera, QObject *parent = 0); QCameraExposure *m_exposure; int m_manualIso; qreal m_manualAperture; qreal m_manualShutterSpeed; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraExposure)) #endif qdeclarativecameraflash.cpp000066400000000000000000000130431225012771600344760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecameraflash_p.h" QT_BEGIN_NAMESPACE /*! \qmltype CameraFlash \instantiates QDeclarativeCameraFlash \inqmlmodule QtMultimedia 5.0 \brief An interface for flash related camera settings. \ingroup multimedia_qml \ingroup camera_qml CameraFlash is part of the \b{QtMultimedia 5.0} module. This type allows you to operate the camera flash hardware and control the flash mode used. Not all cameras have flash hardware (and in some cases it is shared with the \l {Torch}{torch} hardware). It should not be constructed separately, instead the \c flash property of a \l Camera should be used. \qml import QtQuick 2.0 import QtMultimedia 5.0 Camera { id: camera exposure.exposureCompensation: -1.0 flash.mode: Camera.FlashRedEyeReduction } \endqml */ /*! Construct a declarative camera flash object using \a parent object. */ QDeclarativeCameraFlash::QDeclarativeCameraFlash(QCamera *camera, QObject *parent) : QObject(parent) { m_exposure = camera->exposure(); connect(m_exposure, SIGNAL(flashReady(bool)), this, SIGNAL(flashReady(bool))); } QDeclarativeCameraFlash::~QDeclarativeCameraFlash() { } /*! \property bool QDeclarativeCameraFlash::ready This property indicates whether the flash is charged. */ /*! \qmlproperty bool QtMultimedia5::CameraFlash::ready This property indicates whether the flash is charged. */ bool QDeclarativeCameraFlash::isFlashReady() const { return m_exposure->isFlashReady(); } /*! \property QDeclarativeCameraFlash::mode This property holds the camera flash mode. The mode can be one of the constants in \l QCameraExposure::FlashMode. */ /*! \qmlproperty enumeration QtMultimedia5::CameraFlash::mode This property holds the camera flash mode. The mode can be one of the following: \table \header \li Value \li Description \row \li Camera.FlashOff \li Flash is Off. \row \li Camera.FlashOn \li Flash is On. \row \li Camera.FlashAuto \li Automatic flash. \row \li Camera.FlashRedEyeReduction \li Red eye reduction flash. \row \li Camera.FlashFill \li Use flash to fillin shadows. \row \li Camera.FlashTorch \li Constant light source, useful for focusing and video capture. \row \li Camera.FlashSlowSyncFrontCurtain \li Use the flash in conjunction with a slow shutter speed. This mode allows better exposure of distant objects and/or motion blur effect. \row \li Camera.FlashSlowSyncRearCurtain \li The similar mode to FlashSlowSyncFrontCurtain but flash is fired at the end of exposure. \row \li Camera.FlashManual \li Flash power is manually set. \endtable */ int QDeclarativeCameraFlash::flashMode() const { return m_exposure->flashMode(); } void QDeclarativeCameraFlash::setFlashMode(int mode) { if (m_exposure->flashMode() != mode) { m_exposure->setFlashMode(QCameraExposure::FlashModes(mode)); emit flashModeChanged(mode); } } /*! \qmlsignal QtMultimedia5::CameraFlash::flashModeChanged(int) This signal is emitted when the \c flashMode property is changed. The corresponding handler is \c onFlashModeChanged. */ /*! \qmlsignal QtMultimedia5::CameraFlash::flashReady(bool) This signal is emitted when QCameraExposure indicates that the flash is ready to use. The corresponsing handler is \c onFlashReadyChanged. */ QT_END_NAMESPACE #include "moc_qdeclarativecameraflash_p.cpp" qdeclarativecameraflash_p.h000066400000000000000000000057551225012771600344750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERAFLASH_H #define QDECLARATIVECAMERAFLASH_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE class QDeclarativeCamera; class QDeclarativeCameraFlash : public QObject { Q_OBJECT Q_PROPERTY(bool ready READ isFlashReady NOTIFY flashReady) Q_PROPERTY(int mode READ flashMode WRITE setFlashMode NOTIFY flashModeChanged) public: ~QDeclarativeCameraFlash(); int flashMode() const; bool isFlashReady() const; public Q_SLOTS: void setFlashMode(int); Q_SIGNALS: void flashReady(bool status); void flashModeChanged(int); private: friend class QDeclarativeCamera; QDeclarativeCameraFlash(QCamera *camera, QObject *parent = 0); QCameraExposure *m_exposure; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraFlash)) #endif qdeclarativecamerafocus.cpp000066400000000000000000000276571225012771600345400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecamerafocus_p.h" QT_BEGIN_NAMESPACE /*! \qmltype CameraFocus \instantiates QDeclarativeCameraFocus \inqmlmodule QtMultimedia 5.0 \brief An interface for focus related camera settings. \ingroup multimedia_qml \ingroup camera_qml CameraFocus is part of the \b{QtMultimedia 5.0} module. This type allows control over manual and automatic focus settings, including information about any parts of the camera frame that are selected for autofocusing. It should not be constructed separately, instead the \c focus property of a \l Camera should be used. \qml import QtQuick 2.0 import QtMultimedia 5.0 Item { width: 640 height: 360 Camera { id: camera focus { focusMode: Camera.FocusMacro focusPointMode: Camera.FocusPointCustom customFocusPoint: Qt.point(0.2, 0.2) // Focus relative to top-left corner } } VideoOutput { source: camera anchors.fill: parent } } \endqml */ /*! \class QDeclarativeCameraFocus \internal \brief An interface for focus related camera settings. */ /*! Construct a declarative camera focus object using \a parent object. */ QDeclarativeCameraFocus::QDeclarativeCameraFocus(QCamera *camera, QObject *parent) : QObject(parent) { m_focus = camera->focus(); m_focusZones = new FocusZonesModel(this); updateFocusZones(); connect(m_focus, SIGNAL(focusZonesChanged()), SLOT(updateFocusZones())); } QDeclarativeCameraFocus::~QDeclarativeCameraFocus() { } /*! \property QDeclarativeCameraFocus::focusMode This property holds the current camera focus mode. It's possible to combine multiple QCameraFocus::FocusMode enum values, for example QCameraFocus::MacroFocus + QCameraFocus::ContinuousFocus. In automatic focusing modes, the \l focusPointMode and \l focusZones properties provide information and control over how automatic focusing is performed. */ /*! \qmlproperty enumeration CameraFocus::focusMode This property holds the current camera focus mode, which can be one of the following values: \table \header \li Value \li Description \row \li FocusManual \li Manual or fixed focus mode. \row \li FocusHyperfocal \li Focus to hyperfocal distance, with the maximum depth of field achieved. All objects at distances from half of this distance out to infinity will be acceptably sharp. \row \li FocusInfinity \li Focus strictly to infinity. \row \li FocusAuto \li One-shot auto focus mode. \row \li FocusContinuous \li Continuous auto focus mode. \row \li FocusMacro \li One shot auto focus to objects close to camera. \endtable It's possible to combine multiple Camera::FocusMode values, for example Camera.FocusMacro + Camera.FocusContinuous. In automatic focusing modes, the \l focusPointMode property and \l focusZones property provide information and control over how automatic focusing is performed. */ QDeclarativeCamera::FocusMode QDeclarativeCameraFocus::focusMode() const { return QDeclarativeCamera::FocusMode(int(m_focus->focusMode())); } /*! \qmlmethod bool QtMultimedia5::CameraFocus::isFocusModeSupported(mode) const Returns true if the supplied \a mode is a supported focus mode, and false otherwise. */ bool QDeclarativeCameraFocus::isFocusModeSupported(QDeclarativeCamera::FocusMode mode) const { return m_focus->isFocusModeSupported(QCameraFocus::FocusModes(int(mode))); } void QDeclarativeCameraFocus::setFocusMode(QDeclarativeCamera::FocusMode mode) { if (mode != focusMode()) { m_focus->setFocusMode(QCameraFocus::FocusModes(int(mode))); emit focusModeChanged(focusMode()); } } /*! \property QDeclarativeCameraFocus::focusPointMode This property holds the current camera focus point mode. It is used in automatic focusing modes to determine what to focus on. If the current focus point mode is \l QCameraFocus::FocusPointCustom, the \l customFocusPoint property allows you to specify which part of the frame to focus on. */ /*! \qmlproperty enumeration CameraFocus::focusPointMode This property holds the current camera focus point mode. It is used in automatic focusing modes to determine what to focus on. If the current focus point mode is \c Camera.FocusPointCustom, the \l customFocusPoint property allows you to specify which part of the frame to focus on. The property can take one of the following values: \table \header \li Value \li Description \row \li FocusPointAuto \li Automatically select one or multiple focus points. \row \li FocusPointCenter \li Focus to the frame center. \row \li FocusPointFaceDetection \li Focus on faces in the frame. \row \li FocusPointCustom \li Focus to the custom point, defined by the customFocusPoint property. \endtable */ QDeclarativeCamera::FocusPointMode QDeclarativeCameraFocus::focusPointMode() const { return QDeclarativeCamera::FocusPointMode(m_focus->focusPointMode()); } void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCamera::FocusPointMode mode) { if (mode != focusPointMode()) { m_focus->setFocusPointMode(QCameraFocus::FocusPointMode(mode)); emit focusPointModeChanged(focusPointMode()); } } /*! \qmlmethod bool QtMultimedia5::CameraFocus::isFocusPointModeSupported(mode) const Returns true if the supplied \a mode is a supported focus point mode, and false otherwise. */ bool QDeclarativeCameraFocus::isFocusPointModeSupported(QDeclarativeCamera::FocusPointMode mode) const { return m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(mode)); } /*! \property QDeclarativeCameraFocus::customFocusPoint This property holds the position of the custom focus point in relative frame coordinates. For example, QPointF(0,0) pointing to the left top corner of the frame, and QPointF(0.5,0.5) pointing to the center of the frame. Custom focus point is used only in QCameraFocus::FocusPointCustom focus mode. */ /*! \qmlproperty point QtMultimedia5::CameraFocus::customFocusPoint This property holds the position of custom focus point, in relative frame coordinates: QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center. Custom focus point is used only in FocusPointCustom focus mode. */ QPointF QDeclarativeCameraFocus::customFocusPoint() const { return m_focus->customFocusPoint(); } void QDeclarativeCameraFocus::setCustomFocusPoint(const QPointF &point) { if (point != customFocusPoint()) { m_focus->setCustomFocusPoint(point); emit customFocusPointChanged(customFocusPoint()); } } /*! \property QDeclarativeCameraFocus::focusZones This property holds the list of current camera focus zones, each including \c area specified in the same coordinates as \l customFocusPoint, and zone \c status as one of the following values: \table \header \li Value \li Description \row \li QCameraFocusZone::Unused \li This focus point area is currently unused in autofocusing. \row \li QCameraFocusZone::Selected \li This focus point area is used in autofocusing, but is not in focus. \row \li QCameraFocusZone::Focused \li This focus point is used in autofocusing, and is in focus. \endtable */ /*! \qmlproperty list QtMultimedia5::CameraFocus::focusZones This property holds the list of current camera focus zones, each including \c area specified in the same coordinates as \l customFocusPoint, and zone \c status as one of the following values: \table \header \li Value \li Description \row \li Camera.FocusAreaUnused \li This focus point area is currently unused in autofocusing. \row \li Camera.FocusAreaSelected \li This focus point area is used in autofocusing, but is not in focus. \row \li Camera.FocusAreaFocused \li This focus point is used in autofocusing, and is in focus. \endtable \qml VideoOutput { id: viewfinder source: camera //display focus areas on camera viewfinder: Repeater { model: camera.focus.focusZones Rectangle { border { width: 2 color: status == Camera.FocusAreaFocused ? "green" : "white" } color: "transparent" // Map from the relative, normalized frame coordinates property variant mappedRect: viewfinder.mapNormalizedRectToItem(area); x: mappedRect.x y: mappedRect.y width: mappedRect.width height: mappedRect.height } } } \endqml */ QAbstractListModel *QDeclarativeCameraFocus::focusZones() const { return m_focusZones; } /*! \internal */ void QDeclarativeCameraFocus::updateFocusZones() { m_focusZones->setFocusZones(m_focus->focusZones()); } FocusZonesModel::FocusZonesModel(QObject *parent) :QAbstractListModel(parent) { QHash roles; roles[StatusRole] = "status"; roles[AreaRole] = "area"; setRoleNames(roles); } int FocusZonesModel::rowCount(const QModelIndex &parent) const { if (parent == QModelIndex()) return m_focusZones.count(); return 0; } QVariant FocusZonesModel::data(const QModelIndex &index, int role) const { if (index.row() < 0 || index.row() > m_focusZones.count()) return QVariant(); QCameraFocusZone zone = m_focusZones.value(index.row()); if (role == StatusRole) return zone.status(); if (role == AreaRole) return zone.area(); return QVariant(); } void FocusZonesModel::setFocusZones(const QCameraFocusZoneList &zones) { beginResetModel(); m_focusZones = zones; endResetModel(); } QT_END_NAMESPACE #include "moc_qdeclarativecamerafocus_p.cpp" qdeclarativecamerafocus_p.h000066400000000000000000000107261225012771600345110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERAFOCUS_H #define QDECLARATIVECAMERAFOCUS_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include "qdeclarativecamera_p.h" QT_BEGIN_NAMESPACE class FocusZonesModel; class QDeclarativeCamera; class QDeclarativeCameraFocus : public QObject { Q_OBJECT Q_PROPERTY(QDeclarativeCamera::FocusMode focusMode READ focusMode WRITE setFocusMode NOTIFY focusModeChanged) Q_PROPERTY(QDeclarativeCamera::FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode NOTIFY focusPointModeChanged) Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint NOTIFY customFocusPointChanged) Q_PROPERTY(QObject *focusZones READ focusZones CONSTANT) public: ~QDeclarativeCameraFocus(); QDeclarativeCamera::FocusMode focusMode() const; QDeclarativeCamera::FocusPointMode focusPointMode() const; QPointF customFocusPoint() const; QAbstractListModel *focusZones() const; Q_INVOKABLE bool isFocusModeSupported(QDeclarativeCamera::FocusMode mode) const; Q_INVOKABLE bool isFocusPointModeSupported(QDeclarativeCamera::FocusPointMode mode) const; public Q_SLOTS: void setFocusMode(QDeclarativeCamera::FocusMode); void setFocusPointMode(QDeclarativeCamera::FocusPointMode mode); void setCustomFocusPoint(const QPointF &point); Q_SIGNALS: void focusModeChanged(QDeclarativeCamera::FocusMode); void focusPointModeChanged(QDeclarativeCamera::FocusPointMode); void customFocusPointChanged(const QPointF &); private Q_SLOTS: void updateFocusZones(); private: friend class QDeclarativeCamera; QDeclarativeCameraFocus(QCamera *camera, QObject *parent = 0); QCameraFocus *m_focus; FocusZonesModel *m_focusZones; }; class FocusZonesModel : public QAbstractListModel { Q_OBJECT public: enum FocusZoneRoles { StatusRole = Qt::UserRole + 1, AreaRole }; FocusZonesModel(QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; public slots: void setFocusZones(const QCameraFocusZoneList &zones); private: QCameraFocusZoneList m_focusZones; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraFocus)) #endif qdeclarativecameraimageprocessing.cpp000066400000000000000000000175661225012771600365760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecameraimageprocessing_p.h" QT_BEGIN_NAMESPACE /*! \qmltype CameraImageProcessing \instantiates QDeclarativeCameraImageProcessing \inqmlmodule QtMultimedia 5.0 \brief An interface for camera capture related settings. \ingroup multimedia_qml \ingroup camera_qml CameraImageProcessing provides control over post-processing done by the camera middleware, including white balance adjustments, contrast, saturation, sharpening, and denoising It should not be constructed separately, instead the \c imageProcessing property of a \l Camera should be used. \qml import QtQuick 2.0 import QtMultimedia 5.0 Camera { id: camera imageProcessing { whiteBalanceMode: Camera.WhiteBalanceTungsten contrast: 0.66 saturation: -0.5 } } \endqml */ /*! \class QDeclarativeCameraImageProcessing \internal \brief The CameraCapture provides an interface for camera capture related settings */ QDeclarativeCameraImageProcessing::QDeclarativeCameraImageProcessing(QCamera *camera, QObject *parent) : QObject(parent) { m_imageProcessing = camera->imageProcessing(); } QDeclarativeCameraImageProcessing::~QDeclarativeCameraImageProcessing() { } /*! \qmlproperty enumeration QtMultimedia5::CameraImageProcessing::whiteBalanceMode \table \header \li Value \li Description \row \li WhiteBalanceManual \li Manual white balance. In this mode the manual white balance property value is used. \row \li WhiteBalanceAuto \li Auto white balance mode. \row \li WhiteBalanceSunlight \li Sunlight white balance mode. \row \li WhiteBalanceCloudy \li Cloudy white balance mode. \row \li WhiteBalanceShade \li Shade white balance mode. \row \li WhiteBalanceTungsten \li Tungsten white balance mode. \row \li WhiteBalanceFluorescent \li Fluorescent white balance mode. \row \li WhiteBalanceFlash \li Flash white balance mode. \row \li WhiteBalanceSunset \li Sunset white balance mode. \row \li WhiteBalanceVendor \li Vendor defined white balance mode. \endtable \sa manualWhiteBalance */ QDeclarativeCameraImageProcessing::WhiteBalanceMode QDeclarativeCameraImageProcessing::whiteBalanceMode() const { return WhiteBalanceMode(m_imageProcessing->whiteBalanceMode()); } void QDeclarativeCameraImageProcessing::setWhiteBalanceMode(QDeclarativeCameraImageProcessing::WhiteBalanceMode mode) const { if (whiteBalanceMode() != mode) { m_imageProcessing->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceMode(mode)); emit whiteBalanceModeChanged(whiteBalanceMode()); } } /*! \qmlproperty qreal QtMultimedia5::CameraImageProcessing::manualWhiteBalance The color temperature used when in manual white balance mode (WhiteBalanceManual). The units are Kelvin. \sa whiteBalanceMode */ qreal QDeclarativeCameraImageProcessing::manualWhiteBalance() const { return m_imageProcessing->manualWhiteBalance(); } void QDeclarativeCameraImageProcessing::setManualWhiteBalance(qreal colorTemp) const { if (manualWhiteBalance() != colorTemp) { m_imageProcessing->setManualWhiteBalance(colorTemp); emit manualWhiteBalanceChanged(manualWhiteBalance()); } } /*! \qmlproperty qreal QtMultimedia5::CameraImageProcessing::contrast Image contrast adjustment. Valid contrast adjustment values range between -1.0 and 1.0, with a default of 0. */ qreal QDeclarativeCameraImageProcessing::contrast() const { return m_imageProcessing->contrast(); } void QDeclarativeCameraImageProcessing::setContrast(qreal value) { if (value != contrast()) { m_imageProcessing->setContrast(value); emit contrastChanged(contrast()); } } /*! \qmlproperty qreal QtMultimedia5::CameraImageProcessing::saturation Image saturation adjustment. Valid saturation adjustment values range between -1.0 and 1.0, the default is 0. */ qreal QDeclarativeCameraImageProcessing::saturation() const { return m_imageProcessing->saturation(); } void QDeclarativeCameraImageProcessing::setSaturation(qreal value) { if (value != saturation()) { m_imageProcessing->setSaturation(value); emit saturationChanged(saturation()); } } /*! \qmlproperty qreal QtMultimedia5::CameraImageProcessing::sharpeningLevel Adjustment of sharpening level applied to image. Valid sharpening level values range between -1.0 for for sharpening disabled, 0 for default sharpening level and 1.0 for maximum sharpening applied. */ qreal QDeclarativeCameraImageProcessing::sharpeningLevel() const { return m_imageProcessing->sharpeningLevel(); } void QDeclarativeCameraImageProcessing::setSharpeningLevel(qreal value) { if (value != sharpeningLevel()) { m_imageProcessing->setSharpeningLevel(value); emit sharpeningLevelChanged(sharpeningLevel()); } } /*! \qmlproperty qreal QtMultimedia5::CameraImageProcessing::denoisingLevel Adjustment of denoising applied to image. Valid denoising level values range between -1.0 for for denoising disabled, 0 for default denoising level and 1.0 for maximum denoising applied. */ qreal QDeclarativeCameraImageProcessing::denoisingLevel() const { return m_imageProcessing->denoisingLevel(); } void QDeclarativeCameraImageProcessing::setDenoisingLevel(qreal value) { if (value != denoisingLevel()) { m_imageProcessing->setDenoisingLevel(value); emit denoisingLevelChanged(denoisingLevel()); } } /*! \qmlsignal QtMultimedia5::Camera::whiteBalanceModeChanged(Camera::WhiteBalanceMode) This signal is emitted when the \c whiteBalanceMode property is changed. */ /*! \qmlsignal QtMultimedia5::Camera::manualWhiteBalanceChanged(qreal) This signal is emitted when the \c manualWhiteBalance property is changed. */ QT_END_NAMESPACE #include "moc_qdeclarativecameraimageprocessing_p.cpp" qdeclarativecameraimageprocessing_p.h000066400000000000000000000117661225012771600365560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERAIMAGEPROCESSING_H #define QDECLARATIVECAMERAIMAGEPROCESSING_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE class QDeclarativeCamera; class QDeclarativeCameraImageProcessing : public QObject { Q_OBJECT Q_ENUMS(WhiteBalanceMode) Q_PROPERTY(WhiteBalanceMode whiteBalanceMode READ whiteBalanceMode WRITE setWhiteBalanceMode NOTIFY whiteBalanceModeChanged) Q_PROPERTY(qreal manualWhiteBalance READ manualWhiteBalance WRITE setManualWhiteBalance NOTIFY manualWhiteBalanceChanged) Q_PROPERTY(qreal contrast READ contrast WRITE setContrast NOTIFY contrastChanged) Q_PROPERTY(qreal saturation READ saturation WRITE setSaturation NOTIFY saturationChanged) Q_PROPERTY(qreal sharpeningLevel READ sharpeningLevel WRITE setSharpeningLevel NOTIFY sharpeningLevelChanged) Q_PROPERTY(qreal denoisingLevel READ denoisingLevel WRITE setDenoisingLevel NOTIFY denoisingLevelChanged) public: enum WhiteBalanceMode { WhiteBalanceAuto = QCameraImageProcessing::WhiteBalanceAuto, WhiteBalanceManual = QCameraImageProcessing::WhiteBalanceManual, WhiteBalanceSunlight = QCameraImageProcessing::WhiteBalanceSunlight, WhiteBalanceCloudy = QCameraImageProcessing::WhiteBalanceCloudy, WhiteBalanceShade = QCameraImageProcessing::WhiteBalanceShade, WhiteBalanceTungsten = QCameraImageProcessing::WhiteBalanceTungsten, WhiteBalanceFluorescent = QCameraImageProcessing::WhiteBalanceFluorescent, WhiteBalanceFlash = QCameraImageProcessing::WhiteBalanceFlash, WhiteBalanceSunset = QCameraImageProcessing::WhiteBalanceSunset, WhiteBalanceVendor = QCameraImageProcessing::WhiteBalanceVendor }; ~QDeclarativeCameraImageProcessing(); WhiteBalanceMode whiteBalanceMode() const; qreal manualWhiteBalance() const; qreal contrast() const; qreal saturation() const; qreal sharpeningLevel() const; qreal denoisingLevel() const; public Q_SLOTS: void setWhiteBalanceMode(QDeclarativeCameraImageProcessing::WhiteBalanceMode mode) const; void setManualWhiteBalance(qreal colorTemp) const; void setContrast(qreal value); void setSaturation(qreal value); void setSharpeningLevel(qreal value); void setDenoisingLevel(qreal value); Q_SIGNALS: void whiteBalanceModeChanged(QDeclarativeCameraImageProcessing::WhiteBalanceMode) const; void manualWhiteBalanceChanged(qreal) const; void contrastChanged(qreal); void saturationChanged(qreal); void sharpeningLevelChanged(qreal); void denoisingLevelChanged(qreal); private: friend class QDeclarativeCamera; QDeclarativeCameraImageProcessing(QCamera *camera, QObject *parent = 0); QCameraImageProcessing *m_imageProcessing; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraImageProcessing)) #endif qdeclarativecamerapreviewprovider.cpp000066400000000000000000000066521225012771600366450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamerapreviewprovider_p.h" #include #include QT_BEGIN_NAMESPACE struct QDeclarativeCameraPreviewProviderPrivate { QString id; QImage image; QMutex mutex; }; Q_GLOBAL_STATIC(QDeclarativeCameraPreviewProviderPrivate, qDeclarativeCameraPreviewProviderPrivate) QDeclarativeCameraPreviewProvider::QDeclarativeCameraPreviewProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } QDeclarativeCameraPreviewProvider::~QDeclarativeCameraPreviewProvider() { QDeclarativeCameraPreviewProviderPrivate *d = qDeclarativeCameraPreviewProviderPrivate(); QMutexLocker lock(&d->mutex); d->id.clear(); d->image = QImage(); } QImage QDeclarativeCameraPreviewProvider::requestImage(const QString &id, QSize *size, const QSize& requestedSize) { QDeclarativeCameraPreviewProviderPrivate *d = qDeclarativeCameraPreviewProviderPrivate(); QMutexLocker lock(&d->mutex); if (d->id != id) return QImage(); QImage res = d->image; if (!requestedSize.isEmpty()) res = res.scaled(requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (size) *size = res.size(); return res; } void QDeclarativeCameraPreviewProvider::registerPreview(const QString &id, const QImage &preview) { //only the last preview is kept QDeclarativeCameraPreviewProviderPrivate *d = qDeclarativeCameraPreviewProviderPrivate(); QMutexLocker lock(&d->mutex); d->id = id; d->image = preview; } QT_END_NAMESPACE qdeclarativecamerapreviewprovider_p.h000066400000000000000000000052451225012771600366260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERAPREVIEWPROVIDER_H #define QDECLARATIVECAMERAPREVIEWPROVIDER_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE class QDeclarativeCameraPreviewProvider : public QQuickImageProvider { public: QDeclarativeCameraPreviewProvider(); ~QDeclarativeCameraPreviewProvider(); virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize); static void registerPreview(const QString &id, const QImage &preview); }; QT_END_NAMESPACE #endif qdeclarativecamerarecorder.cpp000066400000000000000000000433301225012771600352100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativecamera_p.h" #include "qdeclarativecamerarecorder_p.h" #include QT_BEGIN_NAMESPACE /*! \qmltype CameraRecorder \instantiates QDeclarativeCameraRecorder \inqmlmodule QtMultimedia 5.0 \brief Controls video recording with the Camera. \ingroup multimedia_qml \ingroup camera_qml CameraRecorder allows recording camera streams to files, and adjusting recording settings and metadata for videos. It should not be constructed separately, instead the \c videRecorder property of a \l Camera should be used. \qml Camera { videoRecorder.audioEncodingMode: CameraRecorder.ConstantBitrateEncoding; videoRecorder.audioBitRate: 128000 videoRecorder.mediaContainer: "mp4" // ... } \endqml There are many different settings for each part of the recording process (audio, video, and output formats), as well as control over muting and where to store the output file. \sa QAudioEncoderSettings, QVideoEncoderSettings */ QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QCamera *camera, QObject *parent) : QObject(parent) { m_recorder = new QMediaRecorder(camera, this); connect(m_recorder, SIGNAL(stateChanged(QMediaRecorder::State)), SLOT(updateRecorderState(QMediaRecorder::State))); connect(m_recorder, SIGNAL(statusChanged(QMediaRecorder::Status)), SIGNAL(recorderStatusChanged())); connect(m_recorder, SIGNAL(error(QMediaRecorder::Error)), SLOT(updateRecorderError(QMediaRecorder::Error))); connect(m_recorder, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); connect(m_recorder, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(m_recorder, SIGNAL(actualLocationChanged(QUrl)), SLOT(updateActualLocation(QUrl))); connect(m_recorder, SIGNAL(metaDataChanged(QString,QVariant)), SIGNAL(metaDataChanged(QString,QVariant))); } QDeclarativeCameraRecorder::~QDeclarativeCameraRecorder() { } /*! \qmlproperty size QtMultimedia5::CameraRecorder::resolution This property holds the video frame dimensions to be used for video capture. */ QSize QDeclarativeCameraRecorder::captureResolution() { return m_videoSettings.resolution(); } /*! \qmlproperty string QtMultimedia5::CameraRecorder::audioCodec This property holds the audio codec to be used for recording video. Typically this is \c aac or \c amr-wb. \sa {QtMultimedia5::CameraImageProcessing::whiteBalanceMode}{whileBalanceMode} */ QString QDeclarativeCameraRecorder::audioCodec() const { return m_audioSettings.codec(); } /*! \qmlproperty string QtMultimedia5::CameraRecorder::videoCodec This property holds the video codec to be used for recording video. Typically this is \c h264. */ QString QDeclarativeCameraRecorder::videoCodec() const { return m_videoSettings.codec(); } /*! \qmlproperty string QtMultimedia5::CameraRecorder::mediaContainer This property holds the media container to be used for recording video. Typically this is \c mp4. */ QString QDeclarativeCameraRecorder::mediaContainer() const { return m_mediaContainer; } void QDeclarativeCameraRecorder::setCaptureResolution(const QSize &resolution) { if (resolution != captureResolution()) { m_videoSettings.setResolution(resolution); m_recorder->setVideoSettings(m_videoSettings); emit captureResolutionChanged(resolution); } } void QDeclarativeCameraRecorder::setAudioCodec(const QString &codec) { if (codec != audioCodec()) { m_audioSettings.setCodec(codec); m_recorder->setAudioSettings(m_audioSettings); emit audioCodecChanged(codec); } } void QDeclarativeCameraRecorder::setVideoCodec(const QString &codec) { if (codec != videoCodec()) { m_videoSettings.setCodec(codec); m_recorder->setVideoSettings(m_videoSettings); emit videoCodecChanged(codec); } } void QDeclarativeCameraRecorder::setMediaContainer(const QString &container) { if (container != m_mediaContainer) { m_mediaContainer = container; m_recorder->setContainerFormat(container); emit mediaContainerChanged(container); } } /*! \qmlproperty qreal QtMultimedia5::CameraRecorder::frameRate This property holds the framerate (in frames per second) to be used for recording video. */ qreal QDeclarativeCameraRecorder::frameRate() const { return m_videoSettings.frameRate(); } /*! \qmlproperty int QtMultimedia5::CameraRecorder::videoBitRate This property holds the bit rate (in bits per second) to be used for recording video. */ int QDeclarativeCameraRecorder::videoBitRate() const { return m_videoSettings.bitRate(); } /*! \qmlproperty int QtMultimedia5::CameraRecorder::audioBitRate This property holds the audio bit rate (in bits per second) to be used for recording video. */ int QDeclarativeCameraRecorder::audioBitRate() const { return m_audioSettings.bitRate(); } /*! \qmlproperty int QtMultimedia5::CameraRecorder::audioChannels This property indicates the number of audio channels to be encoded while recording video (1 is mono, 2 is stereo). */ int QDeclarativeCameraRecorder::audioChannels() const { return m_audioSettings.channelCount(); } /*! \qmlproperty int QtMultimedia5::CameraRecorder::audioSampleRate This property holds the sample rate to be used to encode audio while recording video. */ int QDeclarativeCameraRecorder::audioSampleRate() const { return m_audioSettings.sampleRate(); } /*! \qmlproperty enumeration QtMultimedia5::CameraRecorder::videoEncodingMode This property holds the type of encoding method to be used for recording video. The following are the different encoding methods used: \table \header \li Value \li Description \row \li ConstantQualityEncoding \li Encoding will aim to have a constant quality, adjusting bitrate to fit. This is the default. The bitrate setting will be ignored. \row \li ConstantBitRateEncoding \li Encoding will use a constant bit rate, adjust quality to fit. This is appropriate if you are trying to optimize for space. \row \li AverageBitRateEncoding \li Encoding will try to keep an average bitrate setting, but will use more or less as needed. \endtable */ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::videoEncodingMode() const { return EncodingMode(m_videoSettings.encodingMode()); } /*! \qmlproperty enumeration QtMultimedia5::CameraRecorder::audioEncodingMode The type of encoding method to use when recording audio. \table \header \li Value \li Description \row \li ConstantQualityEncoding \li Encoding will aim to have a constant quality, adjusting bitrate to fit. This is the default. The bitrate setting will be ignored. \row \li ConstantBitRateEncoding \li Encoding will use a constant bit rate, adjust quality to fit. This is appropriate if you are trying to optimize for space. \row \li AverageBitRateEncoding \li Encoding will try to keep an average bitrate setting, but will use more or less as needed. \endtable */ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::audioEncodingMode() const { return EncodingMode(m_audioSettings.encodingMode()); } void QDeclarativeCameraRecorder::setFrameRate(qreal frameRate) { if (!qFuzzyCompare(m_videoSettings.frameRate(),frameRate)) { m_videoSettings.setFrameRate(frameRate); m_recorder->setVideoSettings(m_videoSettings); emit frameRateChanged(frameRate); } } void QDeclarativeCameraRecorder::setVideoBitRate(int rate) { if (m_videoSettings.bitRate() != rate) { m_videoSettings.setBitRate(rate); m_recorder->setVideoSettings(m_videoSettings); emit videoBitRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioBitRate(int rate) { if (m_audioSettings.bitRate() != rate) { m_audioSettings.setBitRate(rate); m_recorder->setAudioSettings(m_audioSettings); emit audioBitRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioChannels(int channels) { if (m_audioSettings.channelCount() != channels) { m_audioSettings.setChannelCount(channels); m_recorder->setAudioSettings(m_audioSettings); emit audioChannelsChanged(channels); } } void QDeclarativeCameraRecorder::setAudioSampleRate(int rate) { if (m_audioSettings.sampleRate() != rate) { m_audioSettings.setSampleRate(rate); m_recorder->setAudioSettings(m_audioSettings); emit audioSampleRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { if (m_audioSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { m_audioSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); m_recorder->setAudioSettings(m_audioSettings); emit audioEncodingModeChanged(encodingMode); } } void QDeclarativeCameraRecorder::setVideoEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { if (m_videoSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { m_videoSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); m_recorder->setVideoSettings(m_videoSettings); emit videoEncodingModeChanged(encodingMode); } } /*! \qmlproperty enumeration QtMultimedia5::CameraRecorder::errorCode This property holds the last error code. \table \header \li Value \li Description \row \li NoError \li No Errors \row \li ResourceError \li Device is not ready or not available. \row \li FormatError \li Current format is not supported. \row \li OutOfSpaceError \li No space left on device. \endtable */ QDeclarativeCameraRecorder::Error QDeclarativeCameraRecorder::errorCode() const { return QDeclarativeCameraRecorder::Error(m_recorder->error()); } /*! \qmlproperty string QtMultimedia5::CameraRecorder::errorString This property holds the description of the last error. */ QString QDeclarativeCameraRecorder::errorString() const { return m_recorder->errorString(); } /*! \qmlproperty enumeration QtMultimedia5::CameraRecorder::recorderState This property holds the current state of the camera recorder object. The state can be one of these two: \table \header \li Value \li Description \row \li StoppedState \li The camera is not recording video. \row \li RecordingState \li The camera is recording video. \endtable */ QDeclarativeCameraRecorder::RecorderState QDeclarativeCameraRecorder::recorderState() const { //paused state is not supported for camera QMediaRecorder::State state = m_recorder->state(); if (state == QMediaRecorder::PausedState) state = QMediaRecorder::StoppedState; return RecorderState(state); } /*! \qmlproperty enumeration QtMultimedia5::CameraRecorder::recorderStatus This property holds the current status of media recording. \table \header \li Value \li Description \row \li UnavailableStatus \li Recording is not supported by the camera. \row \li UnloadedStatus \li The recorder is available but not loaded. \row \li LoadingStatus \li The recorder is initializing. \row \li LoadedStatus \li The recorder is initialized and ready to record media. \row \li StartingStatus \li Recording is requested but not active yet. \row \li RecordingStatus \li Recording is active. \row \li PausedStatus \li Recording is paused. \row \li FinalizingStatus \li Recording is stopped with media being finalized. \endtable */ QDeclarativeCameraRecorder::RecorderStatus QDeclarativeCameraRecorder::recorderStatus() const { return RecorderStatus(m_recorder->status()); } /*! \qmlmethod QtMultimedia5::CameraRecorder::record() Starts recording. */ void QDeclarativeCameraRecorder::record() { setRecorderState(RecordingState); } /*! \qmlmethod QtMultimedia5::CameraRecorder::stop() Stops recording. */ void QDeclarativeCameraRecorder::stop() { setRecorderState(StoppedState); } void QDeclarativeCameraRecorder::setRecorderState(QDeclarativeCameraRecorder::RecorderState state) { if (!m_recorder) return; switch (state) { case QDeclarativeCameraRecorder::RecordingState: m_recorder->record(); break; case QDeclarativeCameraRecorder::StoppedState: m_recorder->stop(); break; } } /*! \property QDeclarativeCameraRecorder::outputLocation This property holds the destination location of the media content. If it is empty, the recorder uses the system-specific place and file naming scheme. */ /*! \qmlproperty string QtMultimedia5::CameraRecorder::outputLocation This property holds the destination location of the media content. If the location is empty, the recorder uses the system-specific place and file naming scheme. */ QString QDeclarativeCameraRecorder::outputLocation() const { return m_recorder->outputLocation().toString(); } /*! \property QDeclarativeCameraRecorder::actualLocation This property holds the absolute location to the last saved media content. The location is usually available after recording starts, and reset when new location is set or new recording starts. */ /*! \qmlproperty string QtMultimedia5::CameraRecorder::actualLocation This property holds the actual location of the last saved media content. The actual location is usually available after the recording starts, and reset when new location is set or the new recording starts. */ QString QDeclarativeCameraRecorder::actualLocation() const { return m_recorder->actualLocation().toString(); } void QDeclarativeCameraRecorder::setOutputLocation(const QString &location) { if (outputLocation() != location) { m_recorder->setOutputLocation(location); emit outputLocationChanged(outputLocation()); } } /*! \property QDeclarativeCameraRecorder::duration This property holds the duration (in miliseconds) of the last recording. */ /*! \qmlproperty int QtMultimedia5::CameraRecorder::duration This property holds the duration (in miliseconds) of the last recording. */ qint64 QDeclarativeCameraRecorder::duration() const { return m_recorder->duration(); } /*! \property QDeclarativeCameraRecorder::muted This property indicates whether the audio input is muted during recording. */ /*! \qmlproperty bool QtMultimedia5::CameraRecorder::muted This property indicates whether the audio input is muted during recording. */ bool QDeclarativeCameraRecorder::isMuted() const { return m_recorder->isMuted(); } void QDeclarativeCameraRecorder::setMuted(bool muted) { m_recorder->setMuted(muted); } /*! \qmlmethod QtMultimedia5::CameraRecorder::setMetadata(key, value) Sets metadata for the next video to be recorder, with the given \a key being associated with \a value. */ void QDeclarativeCameraRecorder::setMetadata(const QString &key, const QVariant &value) { m_recorder->setMetaData(key, value); } void QDeclarativeCameraRecorder::updateRecorderState(QMediaRecorder::State state) { if (state == QMediaRecorder::PausedState) state = QMediaRecorder::StoppedState; emit recorderStateChanged(RecorderState(state)); } void QDeclarativeCameraRecorder::updateRecorderError(QMediaRecorder::Error errorCode) { qWarning() << "QMediaRecorder error:" << errorString(); emit error(Error(errorCode), errorString()); } void QDeclarativeCameraRecorder::updateActualLocation(const QUrl &url) { emit actualLocationChanged(url.toString()); } QT_END_NAMESPACE #include "moc_qdeclarativecamerarecorder_p.cpp" qdeclarativecamerarecorder_p.h000066400000000000000000000206401225012771600351730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECAMERARECORDER_H #define QDECLARATIVECAMERARECORDER_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeCamera; class QDeclarativeCameraRecorder : public QObject { Q_OBJECT Q_ENUMS(RecorderState) Q_ENUMS(RecorderStatus) Q_ENUMS(EncodingMode) Q_ENUMS(Error) Q_PROPERTY(RecorderState recorderState READ recorderState WRITE setRecorderState NOTIFY recorderStateChanged) Q_PROPERTY(RecorderStatus recorderStatus READ recorderStatus NOTIFY recorderStatusChanged) Q_PROPERTY(QString videoCodec READ videoCodec WRITE setVideoCodec NOTIFY videoCodecChanged) Q_PROPERTY(QSize resolution READ captureResolution WRITE setCaptureResolution NOTIFY captureResolutionChanged) Q_PROPERTY(qreal frameRate READ frameRate WRITE setFrameRate NOTIFY frameRateChanged) Q_PROPERTY(int videoBitRate READ videoBitRate WRITE setVideoBitRate NOTIFY videoBitRateChanged) Q_PROPERTY(EncodingMode videoEncodingMode READ videoEncodingMode WRITE setVideoEncodingMode NOTIFY videoEncodingModeChanged) Q_PROPERTY(QString audioCodec READ audioCodec WRITE setAudioCodec NOTIFY audioCodecChanged) Q_PROPERTY(int audioBitRate READ audioBitRate WRITE setAudioBitRate NOTIFY audioBitRateChanged) Q_PROPERTY(int audioChannels READ audioChannels WRITE setAudioChannels NOTIFY audioChannelsChanged) Q_PROPERTY(int audioSampleRate READ audioSampleRate WRITE setAudioSampleRate NOTIFY audioSampleRateChanged) Q_PROPERTY(EncodingMode audioEncodingMode READ audioEncodingMode WRITE setAudioEncodingMode NOTIFY audioEncodingModeChanged) Q_PROPERTY(QString mediaContainer READ mediaContainer WRITE setMediaContainer NOTIFY mediaContainerChanged) Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(QString outputLocation READ outputLocation WRITE setOutputLocation NOTIFY outputLocationChanged) Q_PROPERTY(QString actualLocation READ actualLocation NOTIFY actualLocationChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY error) Q_PROPERTY(QString errorCode READ errorCode NOTIFY error) public: enum RecorderState { StoppedState = QMediaRecorder::StoppedState, RecordingState = QMediaRecorder::RecordingState }; enum RecorderStatus { UnavailableStatus = QMediaRecorder::UnavailableStatus, UnloadedStatus = QMediaRecorder::UnloadedStatus, LoadingStatus = QMediaRecorder::LoadingStatus, LoadedStatus = QMediaRecorder::LoadedStatus, StartingStatus = QMediaRecorder::StartingStatus, RecordingStatus = QMediaRecorder::RecordingStatus, PausedStatus = QMediaRecorder::PausedStatus, FinalizingStatus = QMediaRecorder::FinalizingStatus }; enum EncodingMode { ConstantQualityEncoding = QMultimedia::ConstantQualityEncoding, ConstantBitRateEncoding = QMultimedia::ConstantBitRateEncoding, AverageBitRateEncoding = QMultimedia::AverageBitRateEncoding }; enum Error { NoError = QMediaRecorder::NoError, ResourceError = QMediaRecorder::ResourceError, FormatError = QMediaRecorder::FormatError, OutOfSpaceError = QMediaRecorder::OutOfSpaceError }; ~QDeclarativeCameraRecorder(); RecorderState recorderState() const; RecorderStatus recorderStatus() const; QSize captureResolution(); QString outputLocation() const; QString actualLocation() const; qint64 duration() const; bool isMuted() const; QString audioCodec() const; QString videoCodec() const; QString mediaContainer() const; Error errorCode() const; QString errorString() const; qreal frameRate() const; int videoBitRate() const; int audioBitRate() const; int audioChannels() const; int audioSampleRate() const; EncodingMode videoEncodingMode() const; EncodingMode audioEncodingMode() const; public Q_SLOTS: void setOutputLocation(const QString &location); void record(); void stop(); void setRecorderState(QDeclarativeCameraRecorder::RecorderState state); void setMuted(bool muted); void setMetadata(const QString &key, const QVariant &value); void setCaptureResolution(const QSize &resolution); void setAudioCodec(const QString &codec); void setVideoCodec(const QString &codec); void setMediaContainer(const QString &container); void setFrameRate(qreal frameRate); void setVideoBitRate(int rate); void setAudioBitRate(int rate); void setAudioChannels(int channels); void setAudioSampleRate(int rate); void setVideoEncodingMode(EncodingMode encodingMode); void setAudioEncodingMode(EncodingMode encodingMode); Q_SIGNALS: void recorderStateChanged(QDeclarativeCameraRecorder::RecorderState state); void recorderStatusChanged(); void durationChanged(qint64 duration); void mutedChanged(bool muted); void outputLocationChanged(const QString &location); void actualLocationChanged(const QString &location); void error(QDeclarativeCameraRecorder::Error errorCode, const QString &errorString); void metaDataChanged(const QString &key, const QVariant &value); void captureResolutionChanged(const QSize &); void audioCodecChanged(const QString &codec); void videoCodecChanged(const QString &codec); void mediaContainerChanged(const QString &container); void frameRateChanged(qreal arg); void videoBitRateChanged(int arg); void audioBitRateChanged(int arg); void audioChannelsChanged(int arg); void audioSampleRateChanged(int arg); void audioEncodingModeChanged(EncodingMode encodingMode); void videoEncodingModeChanged(EncodingMode encodingMode); private slots: void updateRecorderState(QMediaRecorder::State); void updateRecorderError(QMediaRecorder::Error); void updateActualLocation(const QUrl&); private: friend class QDeclarativeCamera; QDeclarativeCameraRecorder(QCamera *camera, QObject *parent = 0); QMediaRecorder *m_recorder; QAudioEncoderSettings m_audioSettings; QVideoEncoderSettings m_videoSettings; QString m_mediaContainer; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeCameraRecorder)) #endif qdeclarativemediametadata_p.h000066400000000000000000000246311225012771600350010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEMEDIAMETADATA_P_H #define QDECLARATIVEMEDIAMETADATA_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include "qmediaobject.h" QT_BEGIN_NAMESPACE class QDeclarativeMediaMetaData : public QObject { Q_OBJECT Q_PROPERTY(QVariant title READ title NOTIFY metaDataChanged) Q_PROPERTY(QVariant subTitle READ subTitle NOTIFY metaDataChanged) Q_PROPERTY(QVariant author READ author NOTIFY metaDataChanged) Q_PROPERTY(QVariant comment READ comment NOTIFY metaDataChanged) Q_PROPERTY(QVariant description READ description NOTIFY metaDataChanged) Q_PROPERTY(QVariant category READ category NOTIFY metaDataChanged) Q_PROPERTY(QVariant genre READ genre NOTIFY metaDataChanged) Q_PROPERTY(QVariant year READ year NOTIFY metaDataChanged) Q_PROPERTY(QVariant date READ date NOTIFY metaDataChanged) Q_PROPERTY(QVariant userRating READ userRating NOTIFY metaDataChanged) Q_PROPERTY(QVariant keywords READ keywords NOTIFY metaDataChanged) Q_PROPERTY(QVariant language READ language NOTIFY metaDataChanged) Q_PROPERTY(QVariant publisher READ publisher NOTIFY metaDataChanged) Q_PROPERTY(QVariant copyright READ copyright NOTIFY metaDataChanged) Q_PROPERTY(QVariant parentalRating READ parentalRating NOTIFY metaDataChanged) Q_PROPERTY(QVariant ratingOrganization READ ratingOrganization NOTIFY metaDataChanged) Q_PROPERTY(QVariant size READ size NOTIFY metaDataChanged) Q_PROPERTY(QVariant mediaType READ mediaType NOTIFY metaDataChanged) Q_PROPERTY(QVariant duration READ duration NOTIFY metaDataChanged) Q_PROPERTY(QVariant audioBitRate READ audioBitRate NOTIFY metaDataChanged) Q_PROPERTY(QVariant audioCodec READ audioCodec NOTIFY metaDataChanged) Q_PROPERTY(QVariant averageLevel READ averageLevel NOTIFY metaDataChanged) Q_PROPERTY(QVariant channelCount READ channelCount NOTIFY metaDataChanged) Q_PROPERTY(QVariant peakValue READ peakValue NOTIFY metaDataChanged) Q_PROPERTY(QVariant sampleRate READ sampleRate NOTIFY metaDataChanged) Q_PROPERTY(QVariant albumTitle READ albumTitle NOTIFY metaDataChanged) Q_PROPERTY(QVariant albumArtist READ albumArtist NOTIFY metaDataChanged) Q_PROPERTY(QVariant contributingArtist READ contributingArtist NOTIFY metaDataChanged) Q_PROPERTY(QVariant composer READ composer NOTIFY metaDataChanged) Q_PROPERTY(QVariant conductor READ conductor NOTIFY metaDataChanged) Q_PROPERTY(QVariant lyrics READ lyrics NOTIFY metaDataChanged) Q_PROPERTY(QVariant mood READ mood NOTIFY metaDataChanged) Q_PROPERTY(QVariant trackNumber READ trackNumber NOTIFY metaDataChanged) Q_PROPERTY(QVariant trackCount READ trackCount NOTIFY metaDataChanged) Q_PROPERTY(QVariant coverArtUrlSmall READ coverArtUrlSmall NOTIFY metaDataChanged) Q_PROPERTY(QVariant coverArtUrlLarge READ coverArtUrlLarge NOTIFY metaDataChanged) Q_PROPERTY(QVariant resolution READ resolution NOTIFY metaDataChanged) Q_PROPERTY(QVariant pixelAspectRatio READ pixelAspectRatio NOTIFY metaDataChanged) Q_PROPERTY(QVariant videoFrameRate READ videoFrameRate NOTIFY metaDataChanged) Q_PROPERTY(QVariant videoBitRate READ videoBitRate NOTIFY metaDataChanged) Q_PROPERTY(QVariant videoCodec READ videoCodec NOTIFY metaDataChanged) Q_PROPERTY(QVariant posterUrl READ posterUrl NOTIFY metaDataChanged) Q_PROPERTY(QVariant chapterNumber READ chapterNumber NOTIFY metaDataChanged) Q_PROPERTY(QVariant director READ director NOTIFY metaDataChanged) Q_PROPERTY(QVariant leadPerformer READ leadPerformer NOTIFY metaDataChanged) Q_PROPERTY(QVariant writer READ writer NOTIFY metaDataChanged) public: QDeclarativeMediaMetaData(QMediaObject *player, QObject *parent = 0) : QObject(parent) , m_mediaObject(player) { } QVariant title() const { return m_mediaObject->metaData(QMediaMetaData::Title); } QVariant subTitle() const { return m_mediaObject->metaData(QMediaMetaData::SubTitle); } QVariant author() const { return m_mediaObject->metaData(QMediaMetaData::Author); } QVariant comment() const { return m_mediaObject->metaData(QMediaMetaData::Comment); } QVariant description() const { return m_mediaObject->metaData(QMediaMetaData::Description); } QVariant category() const { return m_mediaObject->metaData(QMediaMetaData::Category); } QVariant genre() const { return m_mediaObject->metaData(QMediaMetaData::Genre); } QVariant year() const { return m_mediaObject->metaData(QMediaMetaData::Year); } QVariant date() const { return m_mediaObject->metaData(QMediaMetaData::Date); } QVariant userRating() const { return m_mediaObject->metaData(QMediaMetaData::UserRating); } QVariant keywords() const { return m_mediaObject->metaData(QMediaMetaData::Keywords); } QVariant language() const { return m_mediaObject->metaData(QMediaMetaData::Language); } QVariant publisher() const { return m_mediaObject->metaData(QMediaMetaData::Publisher); } QVariant copyright() const { return m_mediaObject->metaData(QMediaMetaData::Copyright); } QVariant parentalRating() const { return m_mediaObject->metaData(QMediaMetaData::ParentalRating); } QVariant ratingOrganization() const { return m_mediaObject->metaData(QMediaMetaData::RatingOrganization); } QVariant size() const { return m_mediaObject->metaData(QMediaMetaData::Size); } QVariant mediaType() const { return m_mediaObject->metaData(QMediaMetaData::MediaType); } QVariant duration() const { return m_mediaObject->metaData(QMediaMetaData::Duration); } QVariant audioBitRate() const { return m_mediaObject->metaData(QMediaMetaData::AudioBitRate); } QVariant audioCodec() const { return m_mediaObject->metaData(QMediaMetaData::AudioCodec); } QVariant averageLevel() const { return m_mediaObject->metaData(QMediaMetaData::AverageLevel); } QVariant channelCount() const { return m_mediaObject->metaData(QMediaMetaData::ChannelCount); } QVariant peakValue() const { return m_mediaObject->metaData(QMediaMetaData::PeakValue); } QVariant sampleRate() const { return m_mediaObject->metaData(QMediaMetaData::SampleRate); } QVariant albumTitle() const { return m_mediaObject->metaData(QMediaMetaData::AlbumTitle); } QVariant albumArtist() const { return m_mediaObject->metaData(QMediaMetaData::AlbumArtist); } QVariant contributingArtist() const { return m_mediaObject->metaData(QMediaMetaData::ContributingArtist); } QVariant composer() const { return m_mediaObject->metaData(QMediaMetaData::Composer); } QVariant conductor() const { return m_mediaObject->metaData(QMediaMetaData::Conductor); } QVariant lyrics() const { return m_mediaObject->metaData(QMediaMetaData::Lyrics); } QVariant mood() const { return m_mediaObject->metaData(QMediaMetaData::Mood); } QVariant trackNumber() const { return m_mediaObject->metaData(QMediaMetaData::TrackNumber); } QVariant trackCount() const { return m_mediaObject->metaData(QMediaMetaData::TrackCount); } QVariant coverArtUrlSmall() const { return m_mediaObject->metaData(QMediaMetaData::CoverArtUrlSmall); } QVariant coverArtUrlLarge() const { return m_mediaObject->metaData(QMediaMetaData::CoverArtUrlLarge); } QVariant resolution() const { return m_mediaObject->metaData(QMediaMetaData::Resolution); } QVariant pixelAspectRatio() const { return m_mediaObject->metaData(QMediaMetaData::PixelAspectRatio); } QVariant videoFrameRate() const { return m_mediaObject->metaData(QMediaMetaData::VideoFrameRate); } QVariant videoBitRate() const { return m_mediaObject->metaData(QMediaMetaData::VideoBitRate); } QVariant videoCodec() const { return m_mediaObject->metaData(QMediaMetaData::VideoCodec); } QVariant posterUrl() const { return m_mediaObject->metaData(QMediaMetaData::PosterUrl); } QVariant chapterNumber() const { return m_mediaObject->metaData(QMediaMetaData::ChapterNumber); } QVariant director() const { return m_mediaObject->metaData(QMediaMetaData::Director); } QVariant leadPerformer() const { return m_mediaObject->metaData(QMediaMetaData::LeadPerformer); } QVariant writer() const { return m_mediaObject->metaData(QMediaMetaData::Writer); } Q_SIGNALS: void metaDataChanged(); private: QMediaObject *m_mediaObject; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeMediaMetaData)) #endif qdeclarativeradio.cpp000066400000000000000000000374711225012771600333410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativeradio_p.h" #include "qdeclarativeradiodata_p.h" QT_BEGIN_NAMESPACE /*! \qmltype Radio \instantiates QDeclarativeRadio \inqmlmodule QtMultimedia 5.0 \brief Access radio functionality from a QML application. \ingroup multimedia_qml \ingroup multimedia_radio_qml \inherits Item Radio is part of the \b{QtMultimedia 5.0} module. \qml import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { width: 320 height: 480 Radio { id: radio band: Radio.FM } MouseArea { x: 0; y: 0 height: parent.height width: parent.width / 2 onClicked: radio.scanDown() } MouseArea { x: parent.width / 2; y: 0 height: parent.height width: parent.width / 2 onClicked: radio.scanUp() } } \endqml You can use \c Radio to tune the radio and get information about the signal. You can also use the Radio to get information about tuning, for instance the frequency steps supported for tuning. The corresponding \l RadioData gives RDS information about the current radio station. The best way to access the RadioData for the current Radio is to use the \c radioData property. \sa {Radio Overview} */ QDeclarativeRadio::QDeclarativeRadio(QObject *parent) : QObject(parent) { m_radioTuner = new QRadioTuner(this); m_radioData = new QDeclarativeRadioData(m_radioTuner, this); connect(m_radioTuner, SIGNAL(stateChanged(QRadioTuner::State)), this, SLOT(_q_stateChanged(QRadioTuner::State))); connect(m_radioTuner, SIGNAL(bandChanged(QRadioTuner::Band)), this, SLOT(_q_bandChanged(QRadioTuner::Band))); connect(m_radioTuner, SIGNAL(frequencyChanged(int)), this, SIGNAL(frequencyChanged(int))); connect(m_radioTuner, SIGNAL(stereoStatusChanged(bool)), this, SIGNAL(stereoStatusChanged(bool))); connect(m_radioTuner, SIGNAL(searchingChanged(bool)), this, SIGNAL(searchingChanged(bool))); connect(m_radioTuner, SIGNAL(signalStrengthChanged(int)), this, SIGNAL(signalStrengthChanged(int))); connect(m_radioTuner, SIGNAL(volumeChanged(int)), this, SIGNAL(volumeChanged(int))); connect(m_radioTuner, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); connect(m_radioTuner, SIGNAL(stationFound(int, QString)), this, SIGNAL(stationFound(int, QString))); connect(m_radioTuner, SIGNAL(antennaConnectedChanged(bool)), this, SIGNAL(antennaConnectedChanged(bool))); connect(m_radioTuner, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); connect(m_radioTuner, SIGNAL(error(QRadioTuner::Error)), this, SLOT(_q_error(QRadioTuner::Error))); } QDeclarativeRadio::~QDeclarativeRadio() { } /*! \qmlproperty enumeration QtMultimedia5::Radio::state This property holds the current state of the Radio. \table \header \li Value \li Description \row \li ActiveState \li The radio is started and active \row \li StoppedState \li The radio is stopped \endtable \sa start, stop */ QDeclarativeRadio::State QDeclarativeRadio::state() const { return static_cast(m_radioTuner->state()); } /*! \qmlproperty enumeration QtMultimedia5::Radio::band This property holds the frequency band used for the radio, which can be specified as any one of the values in the table below. \table \header \li Value \li Description \row \li AM \li 520 to 1610 kHz, 9 or 10kHz channel spacing, extended 1610 to 1710 kHz \row \li FM \li 87.5 to 108.0 MHz, except Japan 76-90 MHz \row \li SW \li 1.711 to 30.0 MHz, divided into 15 bands. 5kHz channel spacing \row \li LW \li 148.5 to 283.5 kHz, 9kHz channel spacing (Europe, Africa, Asia) \row \li FM2 \li range not defined, used when area supports more than one FM range \endtable */ QDeclarativeRadio::Band QDeclarativeRadio::band() const { return static_cast(m_radioTuner->band()); } /*! \qmlproperty int QtMultimedia5::Radio::frequency Sets the frequency in Hertz that the radio is tuned to. The frequency must be within the frequency range for the current band, otherwise it will be changed to be within the frequency range. \sa maximumFrequency, minimumFrequency */ int QDeclarativeRadio::frequency() const { return m_radioTuner->frequency(); } /*! \qmlproperty enumeration QtMultimedia5::Radio::stereoMode This property holds the stereo mode of the radio, which can be set to any one of the values in the table below. \table \header \li Value \li Description \row \li Auto \li Uses stereo mode matching the station \row \li ForceStereo \li Forces the radio to play the station in stereo, converting the sound signal if necessary \row \li ForceMono \li Forces the radio to play the station in mono, converting the sound signal if necessary \endtable */ QDeclarativeRadio::StereoMode QDeclarativeRadio::stereoMode() const { return static_cast(m_radioTuner->stereoMode()); } /*! \qmlproperty int QtMultimedia5::Radio::volume Set this property to control the volume of the radio. The valid range of the volume is from 0 to 100. */ int QDeclarativeRadio::volume() const { return m_radioTuner->volume(); } /*! \qmlproperty bool QtMultimedia5::Radio::muted This property reflects whether the radio is muted or not. */ bool QDeclarativeRadio::muted() const { return m_radioTuner->isMuted(); } /*! \qmlproperty bool QtMultimedia5::Radio::stereo This property holds whether the radio is receiving a stereo signal or not. If \l stereoMode is set to ForceMono the value will always be false. Likewise, it will always be true if stereoMode is set to ForceStereo. \sa stereoMode */ bool QDeclarativeRadio::stereo() const { return m_radioTuner->isStereo(); } /*! \qmlproperty int QtMultimedia5::Radio::signalStrength The strength of the current radio signal as a percentage where 0% equals no signal, and 100% is a very good signal. */ int QDeclarativeRadio::signalStrength() const { return m_radioTuner->signalStrength(); } /*! \qmlproperty bool QtMultimedia5::Radio::searching This property is true if the radio is currently searching for radio stations, for instance using the \l scanUp, \l scanDown, and \l searchAllStations methods. Once the search completes, or if it is cancelled using \l cancelScan, this property will be false. */ bool QDeclarativeRadio::searching() const { return m_radioTuner->isSearching(); } /*! \qmlproperty int QtMultimedia5::Radio::frequencyStep The number of Hertz for each step when tuning the radio manually. The value is for the current \l band. */ int QDeclarativeRadio::frequencyStep() const { return m_radioTuner->frequencyStep(m_radioTuner->band()); } /*! \qmlproperty int QtMultimedia5::Radio::minimumFrequency The minimum frequency for the current \l band. */ int QDeclarativeRadio::minimumFrequency() const { return m_radioTuner->frequencyRange(m_radioTuner->band()).first; } /*! \qmlproperty int QtMultimedia5::Radio::maximumFrequency The maximum frequency for the current \l band. */ int QDeclarativeRadio::maximumFrequency() const { return m_radioTuner->frequencyRange(m_radioTuner->band()).second; } /*! \qmlproperty int QtMultimedia5::Radio::antennaConnected This property is true if there is an antenna connected. Otherwise it will be false. */ bool QDeclarativeRadio::isAntennaConnected() const { return m_radioTuner->isAntennaConnected(); } /*! \qmlproperty enumeration QtMultimedia5::Radio::availability Returns the availability state of the radio. This is one of: \table \header \li Value \li Description \row \li Available \li The radio is available to use \row \li Busy \li The radio is usually available to use, but is currently busy. This can happen when some other process needs to use the audio hardware. \row \li Unavailable \li The radio is not available to use (there may be no radio hardware) \row \li ResourceMissing \li There is one or more resources missing, so the radio cannot be used. It may be possible to try again at a later time. This can occur if there is no antenna connected - see the \l antennaConnected property as well. \endtable */ QDeclarativeRadio::Availability QDeclarativeRadio::availability() const { return Availability(m_radioTuner->availability()); } void QDeclarativeRadio::setBand(QDeclarativeRadio::Band band) { m_radioTuner->setBand(static_cast(band)); } void QDeclarativeRadio::setFrequency(int frequency) { m_radioTuner->setFrequency(frequency); } void QDeclarativeRadio::setStereoMode(QDeclarativeRadio::StereoMode stereoMode) { m_radioTuner->setStereoMode(static_cast(stereoMode)); } void QDeclarativeRadio::setVolume(int volume) { m_radioTuner->setVolume(volume); } void QDeclarativeRadio::setMuted(bool muted) { m_radioTuner->setMuted(muted); } /*! \qmlmethod QtMultimedia5::Radio::cancelScan() Cancel the current scan. Will also cancel a search started with \l searchAllStations. */ void QDeclarativeRadio::cancelScan() { m_radioTuner->cancelSearch(); } /*! \qmlmethod QtMultimedia5::Radio::scanDown() Searches backward in the frequency range for the current band. */ void QDeclarativeRadio::scanDown() { m_radioTuner->searchBackward(); } /*! \qmlmethod QtMultimedia5::Radio::scanUp() Searches forward in the frequency range for the current band. */ void QDeclarativeRadio::scanUp() { m_radioTuner->searchForward(); } /*! \qmlmethod QtMultimedia5::Radio::searchAllStations(enumeration searchMode) Start searching the complete frequency range for the current band, and save all the radio stations found. The search mode can be either of the values described in the table below. \table \header \li Value \li Description \row \li SearchFast \li Stores each radio station for later retrival and tuning \row \li SearchGetStationId \li Does the same as SearchFast, but also emits the station Id with the \l stationFound signal. \endtable The snippet below uses \c searchAllStations with \c SearchGetStationId to receive all the radio stations in the current band, and store them in a ListView. The station Id is shown to the user and if the user presses a station, the radio is tuned to this station. \qml Item { width: 640 height: 360 Radio { id: radio onStationFound: radioStations.append({"frequency": frequency, "stationId": stationId}) } ListModel { id: radioStations } ListView { model: radioStations delegate: Rectangle { MouseArea { anchors.fill: parent onClicked: radio.frequency = frequency } Text { anchors.fill: parent text: stationId } } } Rectangle { MouseArea { anchors.fill: parent onClicked: radio.searchAllStations(Radio.SearchGetStationId) } } } \endqml */ void QDeclarativeRadio::searchAllStations(QDeclarativeRadio::SearchMode searchMode) { m_radioTuner->searchAllStations(static_cast(searchMode)); } /*! \qmlmethod QtMultimedia5::Radio::tuneDown() Decrements the frequency by the frequency step for the current band. If the frequency is already set to the minimum frequency, calling this function has no effect. \sa band, frequencyStep, minimumFrequency */ void QDeclarativeRadio::tuneDown() { int f = frequency(); f = f - frequencyStep(); setFrequency(f); } /*! \qmlmethod QtMultimedia5::Radio::tuneUp() Increments the frequency by the frequency step for the current band. If the frequency is already set to the maximum frequency, calling this function has no effect. \sa band, frequencyStep, maximumFrequency */ void QDeclarativeRadio::tuneUp() { int f = frequency(); f = f + frequencyStep(); setFrequency(f); } /*! \qmlmethod QtMultimedia5::Radio::start() Starts the radio. If the radio is available, as determined by the \l availability property, this will result in the \l state becoming \c ActiveState. */ void QDeclarativeRadio::start() { m_radioTuner->start(); } /*! \qmlmethod QtMultimedia5::Radio::stop() Stops the radio. After calling this method the \l state will be \c StoppedState. */ void QDeclarativeRadio::stop() { m_radioTuner->stop(); } void QDeclarativeRadio::_q_stateChanged(QRadioTuner::State state) { emit stateChanged(static_cast(state)); } void QDeclarativeRadio::_q_bandChanged(QRadioTuner::Band band) { emit bandChanged(static_cast(band)); } void QDeclarativeRadio::_q_error(QRadioTuner::Error errorCode) { emit error(static_cast(errorCode)); emit errorChanged(); } void QDeclarativeRadio::_q_availabilityChanged(QMultimedia::AvailabilityStatus availability) { emit availabilityChanged(Availability(availability)); } /*! \qmlsignal QtMultimedia5::Radio::stationFound(int frequency, string stationId) This signal is emitted when a new radio station is found. This signal is only emitted if \l searchAllStations is called with \c SearchGetStationId. The \a frequency is returned in Hertz, and the \a stationId corresponds to the station Id in the \l RadioData for this radio station. */ QT_END_NAMESPACE qdeclarativeradio_p.h000066400000000000000000000154721225012771600333220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVERADIO_P_H #define QDECLARATIVERADIO_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE class QDeclarativeRadioData; class QDeclarativeRadio : public QObject { Q_OBJECT Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(Band band READ band WRITE setBand NOTIFY bandChanged) Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged) Q_PROPERTY(bool stereo READ stereo NOTIFY stereoStatusChanged) Q_PROPERTY(StereoMode stereoMode READ stereoMode WRITE setStereoMode) Q_PROPERTY(int signalStrength READ signalStrength NOTIFY signalStrengthChanged) Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool searching READ searching NOTIFY searchingChanged) Q_PROPERTY(int frequencyStep READ frequencyStep NOTIFY bandChanged) Q_PROPERTY(int minimumFrequency READ minimumFrequency NOTIFY bandChanged) Q_PROPERTY(int maximumFrequency READ maximumFrequency NOTIFY bandChanged) Q_PROPERTY(bool antennaConnected READ isAntennaConnected NOTIFY antennaConnectedChanged) Q_PROPERTY(Availability availability READ availability NOTIFY availabilityChanged) Q_PROPERTY(QDeclarativeRadioData* radioData READ radioData CONSTANT) Q_ENUMS(State) Q_ENUMS(Band) Q_ENUMS(Error) Q_ENUMS(StereoMode) Q_ENUMS(SearchMode) Q_ENUMS(Availability) public: enum State { ActiveState = QRadioTuner::ActiveState, StoppedState = QRadioTuner::StoppedState }; enum Band { AM = QRadioTuner::AM, FM = QRadioTuner::FM, SW = QRadioTuner::SW, LW = QRadioTuner::LW, FM2 = QRadioTuner::FM2 }; enum Error { NoError = QRadioTuner::NoError, ResourceError = QRadioTuner::ResourceError, OpenError = QRadioTuner::OpenError, OutOfRangeError = QRadioTuner::OutOfRangeError }; enum StereoMode { ForceStereo = QRadioTuner::ForceStereo, ForceMono = QRadioTuner::ForceMono, Auto = QRadioTuner::Auto }; enum SearchMode { SearchFast = QRadioTuner::SearchFast, SearchGetStationId = QRadioTuner::SearchGetStationId }; enum Availability { Available = QMultimedia::Available, Busy = QMultimedia::Busy, Unavailable = QMultimedia::ServiceMissing, ResourceMissing = QMultimedia::ResourceError }; QDeclarativeRadio(QObject *parent = 0); ~QDeclarativeRadio(); QDeclarativeRadio::State state() const; QDeclarativeRadio::Band band() const; int frequency() const; QDeclarativeRadio::StereoMode stereoMode() const; int volume() const; bool muted() const; bool stereo() const; int signalStrength() const; bool searching() const; int frequencyStep() const; int minimumFrequency() const; int maximumFrequency() const; bool isAntennaConnected() const; Q_INVOKABLE bool isAvailable() const {return availability() == Available;} Availability availability() const; QDeclarativeRadioData *radioData() { return m_radioData; } public Q_SLOTS: void setBand(QDeclarativeRadio::Band band); void setFrequency(int frequency); void setStereoMode(QDeclarativeRadio::StereoMode stereoMode); void setVolume(int volume); void setMuted(bool muted); void cancelScan(); void scanDown(); void scanUp(); void tuneUp(); void tuneDown(); void searchAllStations(QDeclarativeRadio::SearchMode searchMode = QDeclarativeRadio::SearchFast ); void start(); void stop(); Q_SIGNALS: void stateChanged(QDeclarativeRadio::State state); void bandChanged(QDeclarativeRadio::Band band); void frequencyChanged(int frequency); void stereoStatusChanged(bool stereo); void searchingChanged(bool searching); void signalStrengthChanged(int signalStrength); void volumeChanged(int volume); void mutedChanged(bool muted); void stationFound(int frequency, QString stationId); void antennaConnectedChanged(bool connectionStatus); void availabilityChanged(Availability availability); void errorChanged(); void error(QDeclarativeRadio::Error errorCode); private Q_SLOTS: void _q_stateChanged(QRadioTuner::State state); void _q_bandChanged(QRadioTuner::Band band); void _q_error(QRadioTuner::Error errorCode); void _q_availabilityChanged(QMultimedia::AvailabilityStatus); private: Q_DISABLE_COPY(QDeclarativeRadio) QRadioTuner *m_radioTuner; QDeclarativeRadioData *m_radioData; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeRadio)) #endif // QDECLARATIVERADIO_P_H qdeclarativeradiodata.cpp000066400000000000000000000236051225012771600341650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativeradiodata_p.h" QT_BEGIN_NAMESPACE /*! \qmltype RadioData \instantiates QDeclarativeRadioData \inqmlmodule QtMultimedia 5.0 \brief Access RDS data from a QML application. \ingroup multimedia_qml \ingroup multimedia_radio_qml \inherits Item This type is part of the \b{QtMultimedia 5.0} module. \c RadioData is your gateway to all the data available through RDS. RDS is the Radio Data System which allows radio stations to broadcast information like the \l stationId, \l programType, \l programTypeName, \l stationName, and \l radioText. This information can be read from the \c RadioData. It also allows you to set whether the radio should tune to alternative frequencies if the current signal strength falls too much. \qml import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { width: 480 height: 320 Radio { id: radio band: Radio.FM } Column { Text { text: radio.radioData.stationName } Text { text: radio.radioData.programTypeName } Text { text: radio.radioData.radioText } } } \endqml You use \c RadioData together with a \l Radio, either by accessing the \c radioData property of the Radio, or creating a separate RadioData. The properties of the RadioData type will reflect the information broadcast by the radio station the Radio is currently tuned to. \sa {Radio Overview} */ QDeclarativeRadioData::QDeclarativeRadioData(QObject *parent) : QObject(parent) { m_radioTuner = new QRadioTuner(this); m_radioData = m_radioTuner->radioData(); connectSignals(); } QDeclarativeRadioData::QDeclarativeRadioData(QRadioTuner *tuner, QObject *parent) : QObject(parent) { m_radioTuner = tuner; m_radioData = m_radioTuner->radioData(); connectSignals(); } QDeclarativeRadioData::~QDeclarativeRadioData() { } /*! \qmlproperty enumeration QtMultimedia5::RadioData::availability Returns the availability state of the radio data interface. This is one of: \table \header \li Value \li Description \row \li Available \li The radio data interface is available to use \row \li Busy \li The radio data interface is usually available to use, but is currently busy. \row \li Unavailable \li The radio data interface is not available to use (there may be no radio hardware) \row \li ResourceMissing \li There is one or more resources missing, so the radio cannot be used. It may be possible to try again at a later time. \endtable */ QDeclarativeRadioData::Availability QDeclarativeRadioData::availability() const { return Availability(m_radioData->availability()); } /*! \qmlproperty string QtMultimedia5::RadioData::stationId This property allows you to read the station Id of the currently tuned radio station. */ QString QDeclarativeRadioData::stationId() const { return m_radioData->stationId(); } /*! \qmlproperty enumeration QtMultimedia5::RadioData::programType This property holds the type of the currently playing program as transmitted by the radio station. The value can be any one of the values defined in the table below. \table \header \li Value \row \li Undefined \row \li News \row \li CurrentAffairs \row \li Information \row \li Sport \row \li Education \row \li Drama \row \li Culture \row \li Science \row \li Varied \row \li PopMusic \row \li RockMusic \row \li EasyListening \row \li LightClassical \row \li SeriousClassical \row \li OtherMusic \row \li Weather \row \li Finance \row \li ChildrensProgrammes \row \li SocialAffairs \row \li Religion \row \li PhoneIn \row \li Travel \row \li Leisure \row \li JazzMusic \row \li CountryMusic \row \li NationalMusic \row \li OldiesMusic \row \li FolkMusic \row \li Documentary \row \li AlarmTest \row \li Alarm \row \li Talk \row \li ClassicRock \row \li AdultHits \row \li SoftRock \row \li Top40 \row \li Soft \row \li Nostalgia \row \li Classical \row \li RhythmAndBlues \row \li SoftRhythmAndBlues \row \li Language \row \li ReligiousMusic \row \li ReligiousTalk \row \li Personality \row \li Public \row \li College \endtable */ QDeclarativeRadioData::ProgramType QDeclarativeRadioData::programType() const { return static_cast(m_radioData->programType()); } /*! \qmlproperty string QtMultimedia5::RadioData::programTypeName This property holds a string representation of the \l programType. */ QString QDeclarativeRadioData::programTypeName() const { return m_radioData->programTypeName(); } /*! \qmlproperty string QtMultimedia5::RadioData::stationName This property has the name of the currently tuned radio station. */ QString QDeclarativeRadioData::stationName() const { return m_radioData->stationName(); } /*! \qmlproperty string QtMultimedia5::RadioData::radioText This property holds free-text transmitted by the radio station. This is typically used to show supporting information for the currently playing content, for instance song title or artist name. */ QString QDeclarativeRadioData::radioText() const { return m_radioData->radioText(); } /*! \qmlproperty bool QtMultimedia5::RadioData::alternativeFrequenciesEnabled This property allows you to specify whether the radio should try and tune to alternative frequencies if the signal strength of the current station becomes too weak. The alternative frequencies are emitted over RDS by the radio station, and the tuning happens automatically. */ bool QDeclarativeRadioData::alternativeFrequenciesEnabled() const { return m_radioData->isAlternativeFrequenciesEnabled(); } void QDeclarativeRadioData::setAlternativeFrequenciesEnabled(bool enabled) { m_radioData->setAlternativeFrequenciesEnabled(enabled); } void QDeclarativeRadioData::_q_programTypeChanged(QRadioData::ProgramType programType) { emit programTypeChanged(static_cast(programType)); } void QDeclarativeRadioData::_q_error(QRadioData::Error errorCode) { emit error(static_cast(errorCode)); emit errorChanged(); } void QDeclarativeRadioData::_q_availabilityChanged(QMultimedia::AvailabilityStatus availability) { emit availabilityChanged(Availability(availability)); } void QDeclarativeRadioData::connectSignals() { connect(m_radioData, SIGNAL(programTypeChanged(QRadioData::ProgramType)), this, SLOT(_q_programTypeChanged(QRadioData::ProgramType))); connect(m_radioData, SIGNAL(stationIdChanged(QString)), this, SIGNAL(stationIdChanged(QString))); connect(m_radioData, SIGNAL(programTypeNameChanged(QString)), this, SIGNAL(programTypeNameChanged(QString))); connect(m_radioData, SIGNAL(stationNameChanged(QString)), this, SIGNAL(stationNameChanged(QString))); connect(m_radioData, SIGNAL(radioTextChanged(QString)), this, SIGNAL(radioTextChanged(QString))); connect(m_radioData, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), this, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); // Since the radio data type depends on the service for the tuner, the availability is also dictated from the tuner connect(m_radioTuner, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); connect(m_radioData, SIGNAL(error(QRadioData::Error)), this, SLOT(_q_error(QRadioData::Error))); } QT_END_NAMESPACE qdeclarativeradiodata_p.h000066400000000000000000000161641225012771600341530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVERADIODATA_P_H #define QDECLARATIVERADIODATA_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeRadioData : public QObject { Q_OBJECT Q_PROPERTY(QString stationId READ stationId NOTIFY stationIdChanged) Q_PROPERTY(QDeclarativeRadioData::ProgramType programType READ programType NOTIFY programTypeChanged) Q_PROPERTY(QString programTypeName READ programTypeName NOTIFY programTypeNameChanged) Q_PROPERTY(QString stationName READ stationName NOTIFY stationNameChanged) Q_PROPERTY(QString radioText READ radioText NOTIFY radioTextChanged) Q_PROPERTY(bool alternativeFrequenciesEnabled READ alternativeFrequenciesEnabled WRITE setAlternativeFrequenciesEnabled NOTIFY alternativeFrequenciesEnabledChanged) Q_PROPERTY(Availability availability READ availability NOTIFY availabilityChanged) Q_ENUMS(Error) Q_ENUMS(ProgramType) Q_ENUMS(Availability) public: enum Error { NoError = QRadioData::NoError, ResourceError = QRadioData::ResourceError, OpenError = QRadioData::OpenError, OutOfRangeError = QRadioData::OutOfRangeError }; enum ProgramType { Undefined = QRadioData::Undefined, News = QRadioData::News, CurrentAffairs = QRadioData::CurrentAffairs, Information = QRadioData::Information, Sport = QRadioData::Sport, Education = QRadioData::Education, Drama = QRadioData::Drama, Culture = QRadioData::Culture, Science = QRadioData::Science, Varied = QRadioData::Varied, PopMusic = QRadioData::PopMusic, RockMusic = QRadioData::RockMusic, EasyListening = QRadioData::EasyListening, LightClassical = QRadioData::LightClassical, SeriousClassical = QRadioData::SeriousClassical, OtherMusic = QRadioData::OtherMusic, Weather = QRadioData::Weather, Finance = QRadioData::Finance, ChildrensProgrammes = QRadioData::ChildrensProgrammes, SocialAffairs = QRadioData::SocialAffairs, Religion = QRadioData::Religion, PhoneIn = QRadioData::PhoneIn, Travel = QRadioData::Travel, Leisure = QRadioData::Leisure, JazzMusic = QRadioData::JazzMusic, CountryMusic = QRadioData::CountryMusic, NationalMusic = QRadioData::NationalMusic, OldiesMusic = QRadioData::OldiesMusic, FolkMusic = QRadioData::FolkMusic, Documentary = QRadioData::Documentary, AlarmTest = QRadioData::AlarmTest, Alarm = QRadioData::Alarm, Talk = QRadioData::Talk, ClassicRock = QRadioData::ClassicRock, AdultHits = QRadioData::AdultHits, SoftRock = QRadioData::SoftRock, Top40 = QRadioData::Top40, Soft = QRadioData::Soft, Nostalgia = QRadioData::Nostalgia, Classical = QRadioData::Classical, RhythmAndBlues = QRadioData::RhythmAndBlues, SoftRhythmAndBlues = QRadioData::SoftRhythmAndBlues, Language = QRadioData::Language, ReligiousMusic = QRadioData::ReligiousMusic, ReligiousTalk = QRadioData::ReligiousTalk, Personality = QRadioData::Personality, Public = QRadioData::Public, College = QRadioData::College }; enum Availability { Available = QMultimedia::Available, Busy = QMultimedia::Busy, Unavailable = QMultimedia::ServiceMissing, ResourceMissing = QMultimedia::ResourceError }; QDeclarativeRadioData(QObject *parent = 0); QDeclarativeRadioData(QRadioTuner *tuner, QObject *parent = 0); ~QDeclarativeRadioData(); QString stationId() const; QDeclarativeRadioData::ProgramType programType() const; QString programTypeName() const; QString stationName() const; QString radioText() const; bool alternativeFrequenciesEnabled() const; Q_INVOKABLE bool isAvailable() const {return availability() == Available;} Availability availability() const; public Q_SLOTS: void setAlternativeFrequenciesEnabled(bool enabled); Q_SIGNALS: void stationIdChanged(QString stationId); void programTypeChanged(QDeclarativeRadioData::ProgramType programType); void programTypeNameChanged(QString programTypeName); void stationNameChanged(QString stationName); void radioTextChanged(QString radioText); void alternativeFrequenciesEnabledChanged(bool enabled); void availabilityChanged(Availability availability); void errorChanged(); void error(QDeclarativeRadioData::Error errorCode); private Q_SLOTS: void _q_programTypeChanged(QRadioData::ProgramType programType); void _q_error(QRadioData::Error errorCode); void _q_availabilityChanged(QMultimedia::AvailabilityStatus); private: void connectSignals(); Q_DISABLE_COPY(QDeclarativeRadioData) QRadioData *m_radioData; QRadioTuner *m_radioTuner; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeRadioData)) #endif // QDECLARATIVERADIODATA_P_H qdeclarativetorch.cpp000066400000000000000000000127771225012771600333640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qdeclarativetorch_p.h" QT_BEGIN_NAMESPACE /*! \qmltype Torch \instantiates QDeclarativeTorch \inqmlmodule QtMultimedia 5.0 \brief Simple control over torch functionality \ingroup multimedia_qml \c Torch is part of the \b{QtMultimedia 5.0} module. In many cases the torch hardware is shared with camera flash functionality, and might be automatically controlled by the device. You have control over the power level (of course, higher power levels are brighter but reduce battery life significantly). \qml import QtQuick 2.0 import QtMultimedia 5.0 Torch { power: 75 // 75% of full power enabled: true // On } \endqml */ QDeclarativeTorch::QDeclarativeTorch(QObject *parent) : QObject(parent) { m_camera = new QCamera(this); QMediaService *service = m_camera->service(); m_exposure = service ? service->requestControl() : 0; m_flash = service ? service->requestControl() : 0; if (m_exposure) connect(m_exposure, SIGNAL(valueChanged(int)), SLOT(parameterChanged(int))); // XXX There's no signal for flash mode changed } QDeclarativeTorch::~QDeclarativeTorch() { } /*! \qmlproperty bool QtMultimedia5::Torch::enabled This property indicates whether the torch is enabled. If the torch functionality is shared with the camera flash hardware, the camera will take priority over torch settings and the torch is disabled. */ /*! \property QDeclarativeTorch::enabled This property indicates whether the torch is enabled. If the torch functionality is shared with the camera flash hardware, the camera will take priority and the torch is disabled. */ bool QDeclarativeTorch::enabled() const { if (!m_flash) return false; return m_flash->flashMode() & QCameraExposure::FlashTorch; } /*! If \a on is true, attempt to turn on the torch. If the torch hardware is already in use by the camera, this will be ignored. */ void QDeclarativeTorch::setEnabled(bool on) { if (!m_flash) return; QCameraExposure::FlashModes mode = m_flash->flashMode(); if (mode & QCameraExposure::FlashTorch) { if (!on) { m_flash->setFlashMode(mode & ~QCameraExposure::FlashTorch); emit enabledChanged(); } } else { if (on) { m_flash->setFlashMode(mode | QCameraExposure::FlashTorch); emit enabledChanged(); } } } /*! \qmlproperty int QtMultimedia5::Torch::power This property holds the current torch power setting, as a percentage of full power. In some cases this setting may change automatically as a result of temperature or battery conditions. */ /*! \property QDeclarativeTorch::power This property holds the current torch power settings, as a percentage of full power. */ int QDeclarativeTorch::power() const { if (!m_exposure) return 0; return m_exposure->requestedValue(QCameraExposureControl::TorchPower).toInt(); } /*! Sets the current torch power setting to \a power, as a percentage of full power. */ void QDeclarativeTorch::setPower(int power) { if (!m_exposure) return; power = qBound(0, power, 100); if (this->power() != power) m_exposure->setValue(QCameraExposureControl::TorchPower, power); } /* Check for changes in flash power */ void QDeclarativeTorch::parameterChanged(int parameter) { if (parameter == QCameraExposureControl::FlashPower) { emit powerChanged(); } } QT_END_NAMESPACE qdeclarativetorch_p.h000066400000000000000000000055741225012771600333450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVETORCH_P_H #define QDECLARATIVETORCH_P_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QDeclarativeTorch : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(int power READ power WRITE setPower NOTIFY powerChanged) // Errors? public: explicit QDeclarativeTorch(QObject *parent = 0); ~QDeclarativeTorch(); bool enabled() const; void setEnabled(bool enabled); int power() const; void setPower(int power); signals: void enabledChanged(); void powerChanged(); private slots: void parameterChanged(int parameter); private: QCamera *m_camera; QCameraExposureControl *m_exposure; QCameraFlashControl *m_flash; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativeTorch)) #endif // QDECLARATIVETORCH_P_H qdeclarativevideooutput.cpp000066400000000000000000000543741225012771600346330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativevideooutput_p.h" #include "qdeclarativevideooutput_render_p.h" #include "qdeclarativevideooutput_window_p.h" #include #include //#define DEBUG_VIDEOITEM QT_BEGIN_NAMESPACE /*! \qmltype VideoOutput \instantiates QDeclarativeVideoOutput \brief Render video or camera viewfinder. \ingroup multimedia_qml \ingroup multimedia_video_qml \inqmlmodule QtMultimedia 5.0 \c VideoOutput is part of the \b{QtMultimedia 5.0} module. \qml import QtQuick 2.0 import QtMultimedia 5.0 Rectangle { width: 800 height: 600 color: "black" MediaPlayer { id: player source: "file://video.webm" autoPlay: true } VideoOutput { id: videoOutput source: player anchors.fill: parent } } \endqml The VideoOutput item supports untransformed, stretched, and uniformly scaled video presentation. For a description of stretched uniformly scaled presentation, see the \l fillMode property description. The VideoOutput item works with backends that support either QVideoRendererControl or QVideoWindowControl. If the backend only supports QVideoWindowControl, the video is rendered onto an overlay window that is layered on top of the QtQuick window. Due to the nature of the video overlays, certain features are not available for these kind of backends: \list \li Some transformations like rotations \li Having other QtQuick items on top of the VideoOutput item \endlist Most backends however do support QVideoRendererControl and therefore don't have the limitations listed above. \sa MediaPlayer, Camera \section1 Screen Saver If it is likely that an application will be playing video for an extended period of time without user interaction it may be necessary to disable the platform's screen saver. The \l ScreenSaver (from \l QtSystemInfo) may be used to disable the screensaver in this fashion: \qml import QtSystemInfo 5.0 ScreenSaver { screenSaverEnabled: false } \endqml */ /*! \internal \class QDeclarativeVideoOutput \brief The QDeclarativeVideoOutput class provides a video output item. */ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) : QQuickItem(parent), m_sourceType(NoSource), m_fillMode(PreserveAspectFit), m_geometryDirty(true), m_orientation(0) { setFlag(ItemHasContents, true); } QDeclarativeVideoOutput::~QDeclarativeVideoOutput() { m_backend.reset(); m_source.clear(); _q_updateMediaObject(); } /*! \qmlproperty variant QtMultimedia5::VideoOutput::source This property holds the source item providing the video frames like MediaPlayer or Camera. If you are extending your own C++ classes to interoperate with VideoOutput, you can either provide a QObject based class with a \c mediaObject property that exposes a QMediaObject derived class that has a QVideoRendererControl available, or you can provide a QObject based class with a writable \c videoSurface property that can accept a QAbstractVideoSurface based class and can follow the correct protocol to deliver QVideoFrames to it. */ void QDeclarativeVideoOutput::setSource(QObject *source) { #ifdef DEBUG_VIDEOITEM qDebug() << Q_FUNC_INFO << source; #endif if (source == m_source.data()) return; if (m_source && m_sourceType == MediaObjectSource) disconnect(m_source.data(), 0, this, SLOT(_q_updateMediaObject())); if (m_backend) m_backend->releaseSource(); m_source = source; if (m_source) { const QMetaObject *metaObject = m_source.data()->metaObject(); int mediaObjectPropertyIndex = metaObject->indexOfProperty("mediaObject"); if (mediaObjectPropertyIndex != -1) { const QMetaProperty mediaObjectProperty = metaObject->property(mediaObjectPropertyIndex); if (mediaObjectProperty.hasNotifySignal()) { QMetaMethod method = mediaObjectProperty.notifySignal(); QMetaObject::connect(m_source.data(), method.methodIndex(), this, this->metaObject()->indexOfSlot("_q_updateMediaObject()"), Qt::DirectConnection, 0); } m_sourceType = MediaObjectSource; } else if (metaObject->indexOfProperty("videoSurface") != -1) { // Make sure our backend is a QDeclarativeVideoRendererBackend m_backend.reset(); createBackend(0); Q_ASSERT(m_backend); #ifndef QT_NO_DYNAMIC_CAST Q_ASSERT(dynamic_cast(m_backend.data())); #endif QAbstractVideoSurface * const surface = m_backend->videoSurface(); Q_ASSERT(surface); m_source.data()->setProperty("videoSurface", QVariant::fromValue(surface)); m_sourceType = VideoSurfaceSource; } else { m_sourceType = NoSource; } } else { m_sourceType = NoSource; } _q_updateMediaObject(); emit sourceChanged(); } bool QDeclarativeVideoOutput::createBackend(QMediaService *service) { bool backendAvailable = false; m_backend.reset(new QDeclarativeVideoRendererBackend(this)); if (m_backend->init(service)) backendAvailable = true; // QDeclarativeVideoWindowBackend only works when there is a service with a QVideoWindowControl. // Without service, the QDeclarativeVideoRendererBackend should always work. if (!backendAvailable) { Q_ASSERT(service); m_backend.reset(new QDeclarativeVideoWindowBackend(this)); if (m_backend->init(service)) backendAvailable = true; } if (!backendAvailable) { qWarning() << Q_FUNC_INFO << "Media service has neither renderer nor window control available."; m_backend.reset(); } return backendAvailable; } void QDeclarativeVideoOutput::_q_updateMediaObject() { QMediaObject *mediaObject = 0; if (m_source) mediaObject = qobject_cast(m_source.data()->property("mediaObject").value()); #ifdef DEBUG_VIDEOITEM qDebug() << Q_FUNC_INFO << mediaObject; #endif if (m_mediaObject.data() == mediaObject) return; if (m_sourceType != VideoSurfaceSource) m_backend.reset(); m_mediaObject.clear(); m_service.clear(); if (mediaObject) { if (QMediaService *service = mediaObject->service()) { if (createBackend(service)) { m_service = service; m_mediaObject = mediaObject; } } } } /*! \qmlproperty enumeration QtMultimedia5::VideoOutput::fillMode Set this property to define how the video is scaled to fit the target area. \list \li Stretch - the video is scaled to fit. \li PreserveAspectFit - the video is scaled uniformly to fit without cropping \li PreserveAspectCrop - the video is scaled uniformly to fill, cropping if necessary \endlist The default fill mode is PreserveAspectFit. */ QDeclarativeVideoOutput::FillMode QDeclarativeVideoOutput::fillMode() const { return m_fillMode; } void QDeclarativeVideoOutput::setFillMode(FillMode mode) { if (mode == m_fillMode) return; m_fillMode = mode; m_geometryDirty = true; update(); emit fillModeChanged(mode); } void QDeclarativeVideoOutput::_q_updateNativeSize() { if (!m_backend) return; QSize size = m_backend->nativeSize(); if (!qIsDefaultAspect(m_orientation)) { size.transpose(); } if (m_nativeSize != size) { m_nativeSize = size; m_geometryDirty = true; setImplicitWidth(size.width()); setImplicitHeight(size.height()); emit sourceRectChanged(); } } /* Based on fill mode and our size, figure out the source/dest rects */ void QDeclarativeVideoOutput::_q_updateGeometry() { const QRectF rect(0, 0, width(), height()); const QRectF absoluteRect(x(), y(), width(), height()); if (!m_geometryDirty && m_lastRect == absoluteRect) return; QRectF oldContentRect(m_contentRect); m_geometryDirty = false; m_lastRect = absoluteRect; if (m_nativeSize.isEmpty()) { //this is necessary for item to receive the //first paint event and configure video surface. m_contentRect = rect; } else if (m_fillMode == Stretch) { m_contentRect = rect; } else if (m_fillMode == PreserveAspectFit || m_fillMode == PreserveAspectCrop) { QSizeF scaled = m_nativeSize; scaled.scale(rect.size(), m_fillMode == PreserveAspectFit ? Qt::KeepAspectRatio : Qt::KeepAspectRatioByExpanding); m_contentRect = QRectF(QPointF(), scaled); m_contentRect.moveCenter(rect.center()); } if (m_backend) m_backend->updateGeometry(); if (m_contentRect != oldContentRect) emit contentRectChanged(); } /*! \qmlproperty int QtMultimedia5::VideoOutput::orientation In some cases the source video stream requires a certain orientation to be correct. This includes sources like a camera viewfinder, where the displayed viewfinder should match reality, no matter what rotation the rest of the user interface has. This property allows you to apply a rotation (in steps of 90 degrees) to compensate for any user interface rotation, with positive values in the anti-clockwise direction. The orientation change will also affect the mapping of coordinates from source to viewport. */ int QDeclarativeVideoOutput::orientation() const { return m_orientation; } void QDeclarativeVideoOutput::setOrientation(int orientation) { // Make sure it's a multiple of 90. if (orientation % 90) return; // If there's no actual change, return if (m_orientation == orientation) return; // If the new orientation is the same effect // as the old one, don't update the video node stuff if ((m_orientation % 360) == (orientation % 360)) { m_orientation = orientation; emit orientationChanged(); return; } m_geometryDirty = true; // Otherwise, a new orientation // See if we need to change aspect ratio orientation too bool oldAspect = qIsDefaultAspect(m_orientation); bool newAspect = qIsDefaultAspect(orientation); m_orientation = orientation; if (oldAspect != newAspect) { m_nativeSize.transpose(); setImplicitWidth(m_nativeSize.width()); setImplicitHeight(m_nativeSize.height()); // Source rectangle does not change for orientation } update(); emit orientationChanged(); } /*! \qmlproperty rectangle QtMultimedia5::VideoOutput::contentRect This property holds the item coordinates of the area that would contain video to render. With certain fill modes, this rectangle will be larger than the visible area of the \c VideoOutput. This property is useful when other coordinates are specified in terms of the source dimensions - this applied for relative (normalized) frame coordinates in the range of 0 to 1.0. \sa mapRectToItem(), mapPointToItem() Areas outside this will be transparent. */ QRectF QDeclarativeVideoOutput::contentRect() const { return m_contentRect; } /*! \qmlproperty rectangle QtMultimedia5::VideoOutput::sourceRect This property holds the area of the source video content that is considered for rendering. The values are in source pixel coordinates, adjusted for the source's pixel aspect ratio. Note that typically the top left corner of this rectangle will be \c {0,0} while the width and height will be the width and height of the input content. Only when the video source has a viewport set, these values will differ. The orientation setting does not affect this rectangle. \sa QVideoSurfaceFormat::pixelAspectRatio() \sa QVideoSurfaceFormat::viewport() */ QRectF QDeclarativeVideoOutput::sourceRect() const { // We might have to transpose back QSizeF size = m_nativeSize; if (!qIsDefaultAspect(m_orientation)) { size.transpose(); } // No backend? Just assume no viewport. if (!m_nativeSize.isValid() || !m_backend) { return QRectF(QPointF(), size); } // Take the viewport into account for the top left position. // m_nativeSize is already adjusted to the viewport, as it originats // from QVideoSurfaceFormat::sizeHint(), which includes pixel aspect // ratio and viewport. const QRectF viewport = m_backend->adjustedViewport(); Q_ASSERT(viewport.size() == size); return QRectF(viewport.topLeft(), size); } /*! \qmlmethod QPointF QtMultimedia5::VideoOutput::mapNormalizedPointToItem (const QPointF &point) const Given normalized coordinates \a point (that is, each component in the range of 0 to 1.0), return the mapped point that it corresponds to (in item coordinates). This mapping is affected by the orientation. Depending on the fill mode, this point may lie outside the rendered rectangle. */ QPointF QDeclarativeVideoOutput::mapNormalizedPointToItem(const QPointF &point) const { qreal dx = point.x(); qreal dy = point.y(); if (qIsDefaultAspect(m_orientation)) { dx *= m_contentRect.width(); dy *= m_contentRect.height(); } else { dx *= m_contentRect.height(); dy *= m_contentRect.width(); } switch (qNormalizedOrientation(m_orientation)) { case 0: default: return m_contentRect.topLeft() + QPointF(dx, dy); case 90: return m_contentRect.bottomLeft() + QPointF(dy, -dx); case 180: return m_contentRect.bottomRight() + QPointF(-dx, -dy); case 270: return m_contentRect.topRight() + QPointF(-dy, dx); } } /*! \qmlmethod QRectF QtMultimedia5::VideoOutput::mapNormalizedRectToItem(const QRectF &rectangle) const Given a rectangle \a rectangle in normalized coordinates (that is, each component in the range of 0 to 1.0), return the mapped rectangle that it corresponds to (in item coordinates). This mapping is affected by the orientation. Depending on the fill mode, this rectangle may extend outside the rendered rectangle. */ QRectF QDeclarativeVideoOutput::mapNormalizedRectToItem(const QRectF &rectangle) const { return QRectF(mapNormalizedPointToItem(rectangle.topLeft()), mapNormalizedPointToItem(rectangle.bottomRight())).normalized(); } /*! \qmlmethod QPointF QtMultimedia5::VideoOutput::mapPointToItem(const QPointF &point) const Given a point \a point in item coordinates, return the corresponding point in source coordinates. This mapping is affected by the orientation. If the supplied point lies outside the rendered area, the returned point will be outside the source rectangle. */ QPointF QDeclarativeVideoOutput::mapPointToSource(const QPointF &point) const { QPointF norm = mapPointToSourceNormalized(point); if (qIsDefaultAspect(m_orientation)) return QPointF(norm.x() * m_nativeSize.width(), norm.y() * m_nativeSize.height()); else return QPointF(norm.x() * m_nativeSize.height(), norm.y() * m_nativeSize.width()); } /*! \qmlmethod QRectF QtMultimedia5::VideoOutput::mapRectToSource(const QRectF &rectangle) const Given a rectangle \a rectangle in item coordinates, return the corresponding rectangle in source coordinates. This mapping is affected by the orientation. This mapping is affected by the orientation. If the supplied point lies outside the rendered area, the returned point will be outside the source rectangle. */ QRectF QDeclarativeVideoOutput::mapRectToSource(const QRectF &rectangle) const { return QRectF(mapPointToSource(rectangle.topLeft()), mapPointToSource(rectangle.bottomRight())).normalized(); } /*! \qmlmethod QPointF QtMultimedia5::VideoOutput::mapPointToItemNormalized(const QPointF &point) const Given a point \a point in item coordinates, return the corresponding point in normalized source coordinates. This mapping is affected by the orientation. If the supplied point lies outside the rendered area, the returned point will be outside the source rectangle. No clamping is performed. */ QPointF QDeclarativeVideoOutput::mapPointToSourceNormalized(const QPointF &point) const { if (m_contentRect.isEmpty()) return QPointF(); // Normalize the item source point qreal nx = (point.x() - m_contentRect.left()) / m_contentRect.width(); qreal ny = (point.y() - m_contentRect.top()) / m_contentRect.height(); const qreal one(1.0f); // For now, the origin of the source rectangle is 0,0 switch (qNormalizedOrientation(m_orientation)) { case 0: default: return QPointF(nx, ny); case 90: return QPointF(one - ny, nx); case 180: return QPointF(one - nx, one - ny); case 270: return QPointF(ny, one - nx); } } /*! \qmlmethod QRectF QtMultimedia5::VideoOutput::mapRectToSourceNormalized(const QRectF &rectangle) const Given a rectangle \a rectangle in item coordinates, return the corresponding rectangle in normalized source coordinates. This mapping is affected by the orientation. This mapping is affected by the orientation. If the supplied point lies outside the rendered area, the returned point will be outside the source rectangle. No clamping is performed. */ QRectF QDeclarativeVideoOutput::mapRectToSourceNormalized(const QRectF &rectangle) const { return QRectF(mapPointToSourceNormalized(rectangle.topLeft()), mapPointToSourceNormalized(rectangle.bottomRight())).normalized(); } QDeclarativeVideoOutput::SourceType QDeclarativeVideoOutput::sourceType() const { return m_sourceType; } /*! \qmlmethod QPointF QtMultimedia5::VideoOutput::mapPointToItem(const QPointF &point) const Given a point \a point in source coordinates, return the corresponding point in item coordinates. This mapping is affected by the orientation. Depending on the fill mode, this point may lie outside the rendered rectangle. */ QPointF QDeclarativeVideoOutput::mapPointToItem(const QPointF &point) const { if (m_nativeSize.isEmpty()) return QPointF(); // Just normalize and use that function // m_nativeSize is transposed in some orientations if (qIsDefaultAspect(m_orientation)) return mapNormalizedPointToItem(QPointF(point.x() / m_nativeSize.width(), point.y() / m_nativeSize.height())); else return mapNormalizedPointToItem(QPointF(point.x() / m_nativeSize.height(), point.y() / m_nativeSize.width())); } /*! \qmlmethod QRectF QtMultimedia5::VideoOutput::mapRectToItem(const QRectF &rectangle) const Given a rectangle \a rectangle in source coordinates, return the corresponding rectangle in item coordinates. This mapping is affected by the orientation. Depending on the fill mode, this rectangle may extend outside the rendered rectangle. */ QRectF QDeclarativeVideoOutput::mapRectToItem(const QRectF &rectangle) const { return QRectF(mapPointToItem(rectangle.topLeft()), mapPointToItem(rectangle.bottomRight())).normalized(); } QSGNode *QDeclarativeVideoOutput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { _q_updateGeometry(); if (!m_backend) return 0; return m_backend->updatePaintNode(oldNode, data); } void QDeclarativeVideoOutput::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) { if (m_backend) m_backend->itemChange(change, changeData); } void QDeclarativeVideoOutput::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_UNUSED(newGeometry); Q_UNUSED(oldGeometry); QQuickItem::geometryChanged(newGeometry, oldGeometry); // Explicitly listen to geometry changes here. This is needed since changing the position does // not trigger a call to updatePaintNode(). // We need to react to position changes though, as the window backened's display rect gets // changed in that situation. _q_updateGeometry(); } QT_END_NAMESPACE qdeclarativevideooutput_backend_p.h000066400000000000000000000070461225012771600362600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEVIDEOOUTPUT_BACKEND_P_H #define QDECLARATIVEVIDEOOUTPUT_BACKEND_P_H #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QDeclarativeVideoOutput; class QMediaService; class QDeclarativeVideoBackend { public: explicit QDeclarativeVideoBackend(QDeclarativeVideoOutput *parent) : q(parent) {} virtual ~QDeclarativeVideoBackend() {} virtual bool init(QMediaService *service) = 0; virtual void releaseSource() = 0; virtual void releaseControl() = 0; virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) = 0; virtual QSize nativeSize() const = 0; virtual void updateGeometry() = 0; virtual QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) = 0; virtual QAbstractVideoSurface *videoSurface() const = 0; // The viewport, adjusted for the pixel aspect ratio virtual QRectF adjustedViewport() const = 0; protected: QDeclarativeVideoOutput *q; QPointer m_service; }; /* * Helper - returns true if the given orientation has the same aspect as the default (e.g. 180*n) */ namespace { inline bool qIsDefaultAspect(int o) { return (o % 180) == 0; } /* * Return the orientation normalized to 0-359 */ inline int qNormalizedOrientation(int o) { // Negative orientations give negative results int o2 = o % 360; if (o2 < 0) o2 += 360; return o2; } } QT_END_NAMESPACE #endif qdeclarativevideooutput_p.h000066400000000000000000000121731225012771600346060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEVIDEOOUTPUT_P_H #define QDECLARATIVEVIDEOOUTPUT_P_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaObject; class QMediaService; class QDeclarativeVideoBackend; class QDeclarativeVideoOutput : public QQuickItem { Q_OBJECT Q_DISABLE_COPY(QDeclarativeVideoOutput) Q_PROPERTY(QObject* source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged) Q_PROPERTY(int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) Q_PROPERTY(QRectF sourceRect READ sourceRect NOTIFY sourceRectChanged) Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged) Q_ENUMS(FillMode) public: enum FillMode { Stretch = Qt::IgnoreAspectRatio, PreserveAspectFit = Qt::KeepAspectRatio, PreserveAspectCrop = Qt::KeepAspectRatioByExpanding }; QDeclarativeVideoOutput(QQuickItem *parent = 0); ~QDeclarativeVideoOutput(); QObject *source() const { return m_source.data(); } void setSource(QObject *source); FillMode fillMode() const; void setFillMode(FillMode mode); int orientation() const; void setOrientation(int); QRectF sourceRect() const; QRectF contentRect() const; Q_INVOKABLE QPointF mapPointToItem(const QPointF &point) const; Q_INVOKABLE QRectF mapRectToItem(const QRectF &rectangle) const; Q_INVOKABLE QPointF mapNormalizedPointToItem(const QPointF &point) const; Q_INVOKABLE QRectF mapNormalizedRectToItem(const QRectF &rectangle) const; Q_INVOKABLE QPointF mapPointToSource(const QPointF &point) const; Q_INVOKABLE QRectF mapRectToSource(const QRectF &rectangle) const; Q_INVOKABLE QPointF mapPointToSourceNormalized(const QPointF &point) const; Q_INVOKABLE QRectF mapRectToSourceNormalized(const QRectF &rectangle) const; enum SourceType { NoSource, MediaObjectSource, VideoSurfaceSource }; SourceType sourceType() const; Q_SIGNALS: void sourceChanged(); void fillModeChanged(QDeclarativeVideoOutput::FillMode); void orientationChanged(); void sourceRectChanged(); void contentRectChanged(); protected: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); void itemChange(ItemChange change, const ItemChangeData &changeData); void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); private Q_SLOTS: void _q_updateMediaObject(); void _q_updateNativeSize(); void _q_updateGeometry(); private: bool createBackend(QMediaService *service); SourceType m_sourceType; QPointer m_source; QPointer m_mediaObject; QPointer m_service; FillMode m_fillMode; QSize m_nativeSize; bool m_geometryDirty; QRectF m_lastRect; // Cache of last rect to avoid recalculating geometry QRectF m_contentRect; // Destination pixel coordinates, unclipped int m_orientation; QScopedPointer m_backend; }; QT_END_NAMESPACE #endif // QDECLARATIVEVIDEOOUTPUT_H qdeclarativevideooutput_render.cpp000066400000000000000000000271331225012771600361630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativevideooutput_render_p.h" #include "qdeclarativevideooutput_p.h" #include #include #include #include #include QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, videoNodeFactoryLoader, (QSGVideoNodeFactoryInterface_iid, QLatin1String("video/videonode"), Qt::CaseInsensitive)) QDeclarativeVideoRendererBackend::QDeclarativeVideoRendererBackend(QDeclarativeVideoOutput *parent) : QDeclarativeVideoBackend(parent), m_glContext(0), m_frameChanged(false) { m_surface = new QSGVideoItemSurface(this); QObject::connect(m_surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), q, SLOT(_q_updateNativeSize()), Qt::QueuedConnection); foreach (QObject *instance, videoNodeFactoryLoader()->instances(QSGVideoNodeFactoryPluginKey)) { QSGVideoNodeFactoryInterface* plugin = qobject_cast(instance); if (plugin) m_videoNodeFactories.append(plugin); } // Append existing node factories as fallback if we have no plugins m_videoNodeFactories.append(&m_i420Factory); m_videoNodeFactories.append(&m_rgbFactory); m_videoNodeFactories.append(&m_textureFactory); } QDeclarativeVideoRendererBackend::~QDeclarativeVideoRendererBackend() { releaseSource(); releaseControl(); delete m_surface; } bool QDeclarativeVideoRendererBackend::init(QMediaService *service) { // When there is no service, the source is an object with a "videoSurface" property, which // doesn't require a QVideoRendererControl and therefore always works if (!service) return true; if (QMediaControl *control = service->requestControl(QVideoRendererControl_iid)) { if ((m_rendererControl = qobject_cast(control))) { m_rendererControl->setSurface(m_surface); m_service = service; return true; } } return false; } void QDeclarativeVideoRendererBackend::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) { Q_UNUSED(change); Q_UNUSED(changeData); } void QDeclarativeVideoRendererBackend::releaseSource() { if (q->source() && q->sourceType() == QDeclarativeVideoOutput::VideoSurfaceSource) { if (q->source()->property("videoSurface").value() == m_surface) q->source()->setProperty("videoSurface", QVariant::fromValue(0)); } m_surface->stop(); } void QDeclarativeVideoRendererBackend::releaseControl() { if (m_rendererControl) { m_rendererControl->setSurface(0); if (m_service) m_service->releaseControl(m_rendererControl); m_rendererControl = 0; } } QSize QDeclarativeVideoRendererBackend::nativeSize() const { return m_surface->surfaceFormat().sizeHint(); } void QDeclarativeVideoRendererBackend::updateGeometry() { const QRectF viewport = videoSurface()->surfaceFormat().viewport(); const QSizeF frameSize = videoSurface()->surfaceFormat().frameSize(); const QRectF normalizedViewport(viewport.x() / frameSize.width(), viewport.y() / frameSize.height(), viewport.width() / frameSize.width(), viewport.height() / frameSize.height()); const QRectF rect(0, 0, q->width(), q->height()); if (nativeSize().isEmpty()) { m_renderedRect = rect; m_sourceTextureRect = normalizedViewport; } else if (q->fillMode() == QDeclarativeVideoOutput::Stretch) { m_renderedRect = rect; m_sourceTextureRect = normalizedViewport; } else if (q->fillMode() == QDeclarativeVideoOutput::PreserveAspectFit) { m_sourceTextureRect = normalizedViewport; m_renderedRect = q->contentRect(); } else if (q->fillMode() == QDeclarativeVideoOutput::PreserveAspectCrop) { m_renderedRect = rect; const qreal contentHeight = q->contentRect().height(); const qreal contentWidth = q->contentRect().width(); // Calculate the size of the source rectangle without taking the viewport into account const qreal relativeOffsetLeft = -q->contentRect().left() / contentWidth; const qreal relativeOffsetTop = -q->contentRect().top() / contentHeight; const qreal relativeWidth = rect.width() / contentWidth; const qreal relativeHeight = rect.height() / contentHeight; // Now take the viewport size into account const qreal totalOffsetLeft = normalizedViewport.x() + relativeOffsetLeft * normalizedViewport.width(); const qreal totalOffsetTop = normalizedViewport.y() + relativeOffsetTop * normalizedViewport.height(); const qreal totalWidth = normalizedViewport.width() * relativeWidth; const qreal totalHeight = normalizedViewport.height() * relativeHeight; if (qIsDefaultAspect(q->orientation())) { m_sourceTextureRect = QRectF(totalOffsetLeft, totalOffsetTop, totalWidth, totalHeight); } else { m_sourceTextureRect = QRectF(totalOffsetTop, totalOffsetLeft, totalHeight, totalWidth); } } } QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) { Q_UNUSED(data); QSGVideoNode *videoNode = static_cast(oldNode); QMutexLocker lock(&m_frameMutex); if (!m_glContext) { m_glContext = QOpenGLContext::currentContext(); m_surface->scheduleOpenGLContextUpdate(); } if (m_frameChanged) { if (videoNode && videoNode->pixelFormat() != m_frame.pixelFormat()) { #ifdef DEBUG_VIDEOITEM qDebug() << "updatePaintNode: deleting old video node because frame format changed..."; #endif delete videoNode; videoNode = 0; } if (!m_frame.isValid()) { #ifdef DEBUG_VIDEOITEM qDebug() << "updatePaintNode: no frames yet... aborting..."; #endif m_frameChanged = false; return 0; } if (!videoNode) { foreach (QSGVideoNodeFactoryInterface* factory, m_videoNodeFactories) { videoNode = factory->createNode(m_surface->surfaceFormat()); if (videoNode) break; } } } if (!videoNode) { m_frameChanged = false; m_frame = QVideoFrame(); return 0; } // Negative rotations need lots of %360 videoNode->setTexturedRectGeometry(m_renderedRect, m_sourceTextureRect, qNormalizedOrientation(q->orientation())); if (m_frameChanged) { videoNode->setCurrentFrame(m_frame); //don't keep the frame for more than really necessary m_frameChanged = false; m_frame = QVideoFrame(); } return videoNode; } QAbstractVideoSurface *QDeclarativeVideoRendererBackend::videoSurface() const { return m_surface; } QRectF QDeclarativeVideoRendererBackend::adjustedViewport() const { const QRectF viewport = m_surface->surfaceFormat().viewport(); const QSize pixelAspectRatio = m_surface->surfaceFormat().pixelAspectRatio(); if (pixelAspectRatio.height() != 0) { const qreal ratio = pixelAspectRatio.width() / pixelAspectRatio.height(); QRectF result = viewport; result.setX(result.x() * ratio); result.setWidth(result.width() * ratio); return result; } return viewport; } QOpenGLContext *QDeclarativeVideoRendererBackend::glContext() const { return m_glContext; } void QDeclarativeVideoRendererBackend::present(const QVideoFrame &frame) { m_frameMutex.lock(); m_frame = frame; m_frameChanged = true; m_frameMutex.unlock(); q->update(); } void QDeclarativeVideoRendererBackend::stop() { present(QVideoFrame()); } QSGVideoItemSurface::QSGVideoItemSurface(QDeclarativeVideoRendererBackend *backend, QObject *parent) : QAbstractVideoSurface(parent), m_backend(backend) { } QSGVideoItemSurface::~QSGVideoItemSurface() { } QList QSGVideoItemSurface::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { QList formats; foreach (QSGVideoNodeFactoryInterface* factory, m_backend->m_videoNodeFactories) formats.append(factory->supportedPixelFormats(handleType)); return formats; } bool QSGVideoItemSurface::start(const QVideoSurfaceFormat &format) { #ifdef DEBUG_VIDEOITEM qDebug() << Q_FUNC_INFO << format; #endif if (!supportedPixelFormats(format.handleType()).contains(format.pixelFormat())) return false; return QAbstractVideoSurface::start(format); } void QSGVideoItemSurface::stop() { m_backend->stop(); QAbstractVideoSurface::stop(); } bool QSGVideoItemSurface::present(const QVideoFrame &frame) { if (!frame.isValid()) { qWarning() << Q_FUNC_INFO << "I'm getting bad frames here..."; return false; } m_backend->present(frame); return true; } void QSGVideoItemSurface::scheduleOpenGLContextUpdate() { //This method is called from render thread QMetaObject::invokeMethod(this, "updateOpenGLContext"); } void QSGVideoItemSurface::updateOpenGLContext() { //Set a dynamic property to access the OpenGL context in Qt Quick render thread. this->setProperty("GLContext", QVariant::fromValue(m_backend->glContext())); } QT_END_NAMESPACE qdeclarativevideooutput_render_p.h000066400000000000000000000103431225012771600361420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEVIDEOOUTPUT_RENDER_P_H #define QDECLARATIVEVIDEOOUTPUT_RENDER_P_H #include "qdeclarativevideooutput_backend_p.h" #include "qsgvideonode_i420.h" #include "qsgvideonode_rgb.h" #include "qsgvideonode_texture.h" #include #include QT_BEGIN_NAMESPACE class QSGVideoItemSurface; class QVideoRendererControl; class QOpenGLContext; class QDeclarativeVideoRendererBackend : public QDeclarativeVideoBackend { public: QDeclarativeVideoRendererBackend(QDeclarativeVideoOutput *parent); ~QDeclarativeVideoRendererBackend(); bool init(QMediaService *service); void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData); void releaseSource(); void releaseControl(); QSize nativeSize() const; void updateGeometry(); QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data); QAbstractVideoSurface *videoSurface() const; QRectF adjustedViewport() const Q_DECL_OVERRIDE; QOpenGLContext *glContext() const; friend class QSGVideoItemSurface; void present(const QVideoFrame &frame); void stop(); private: QPointer m_rendererControl; QList m_videoNodeFactories; QSGVideoItemSurface *m_surface; QOpenGLContext *m_glContext; QVideoFrame m_frame; bool m_frameChanged; QSGVideoNodeFactory_I420 m_i420Factory; QSGVideoNodeFactory_RGB m_rgbFactory; QSGVideoNodeFactory_Texture m_textureFactory; QMutex m_frameMutex; QRectF m_renderedRect; // Destination pixel coordinates, clipped QRectF m_sourceTextureRect; // Source texture coordinates }; class QSGVideoItemSurface : public QAbstractVideoSurface { Q_OBJECT public: explicit QSGVideoItemSurface(QDeclarativeVideoRendererBackend *backend, QObject *parent = 0); ~QSGVideoItemSurface(); QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); void scheduleOpenGLContextUpdate(); private slots: void updateOpenGLContext(); private: QDeclarativeVideoRendererBackend *m_backend; }; QT_END_NAMESPACE #endif qdeclarativevideooutput_window.cpp000066400000000000000000000123271225012771600362120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdeclarativevideooutput_window_p.h" #include "qdeclarativevideooutput_p.h" #include #include #include QT_BEGIN_NAMESPACE QDeclarativeVideoWindowBackend::QDeclarativeVideoWindowBackend(QDeclarativeVideoOutput *parent) : QDeclarativeVideoBackend(parent), m_visible(true) { } QDeclarativeVideoWindowBackend::~QDeclarativeVideoWindowBackend() { releaseSource(); releaseControl(); } bool QDeclarativeVideoWindowBackend::init(QMediaService *service) { if (QMediaControl *control = service->requestControl(QVideoWindowControl_iid)) { if ((m_videoWindowControl = qobject_cast(control))) { if (q->window()) m_videoWindowControl->setWinId(q->window()->winId()); m_service = service; QObject::connect(m_videoWindowControl.data(), SIGNAL(nativeSizeChanged()), q, SLOT(_q_updateNativeSize())); return true; } } return false; } void QDeclarativeVideoWindowBackend::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) { if (!m_videoWindowControl) return; switch (change) { case QQuickItem::ItemVisibleHasChanged: m_visible = changeData.boolValue; updateGeometry(); break; case QQuickItem::ItemSceneChange: if (changeData.window) m_videoWindowControl->setWinId(changeData.window->winId()); else m_videoWindowControl->setWinId(0); break; default: break; } } void QDeclarativeVideoWindowBackend::releaseSource() { } void QDeclarativeVideoWindowBackend::releaseControl() { if (m_videoWindowControl) { m_videoWindowControl->setWinId(0); if (m_service) m_service->releaseControl(m_videoWindowControl); m_videoWindowControl = 0; } } QSize QDeclarativeVideoWindowBackend::nativeSize() const { return m_videoWindowControl->nativeSize(); } void QDeclarativeVideoWindowBackend::updateGeometry() { switch (q->fillMode()) { case QDeclarativeVideoOutput::PreserveAspectFit: m_videoWindowControl->setAspectRatioMode(Qt::KeepAspectRatio); break; case QDeclarativeVideoOutput::PreserveAspectCrop: m_videoWindowControl->setAspectRatioMode(Qt::KeepAspectRatioByExpanding); break; case QDeclarativeVideoOutput::Stretch: m_videoWindowControl->setAspectRatioMode(Qt::IgnoreAspectRatio); break; }; const QRectF canvasRect = q->mapRectToScene(QRectF(0, 0, q->width(), q->height())); m_videoWindowControl->setDisplayRect(m_visible ? canvasRect.toAlignedRect() : QRect()); } QSGNode *QDeclarativeVideoWindowBackend::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) { Q_UNUSED(oldNode); Q_UNUSED(data); m_videoWindowControl->repaint(); return 0; } QAbstractVideoSurface *QDeclarativeVideoWindowBackend::videoSurface() const { return 0; } QRectF QDeclarativeVideoWindowBackend::adjustedViewport() const { // No viewport supported by QVideoWindowControl, so make the viewport the same size // as the source return QRectF(QPointF(0, 0), nativeSize()); } QT_END_NAMESPACE qdeclarativevideooutput_window_p.h000066400000000000000000000054441225012771600362000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEVIDEOOUTPUT_WINDOW_P_H #define QDECLARATIVEVIDEOOUTPUT_WINDOW_P_H #include "qdeclarativevideooutput_backend_p.h" QT_BEGIN_NAMESPACE class QVideoWindowControl; class QDeclarativeVideoWindowBackend : public QDeclarativeVideoBackend { public: QDeclarativeVideoWindowBackend(QDeclarativeVideoOutput *parent); ~QDeclarativeVideoWindowBackend(); bool init(QMediaService *service); void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData); void releaseSource(); void releaseControl(); QSize nativeSize() const; void updateGeometry(); QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data); QAbstractVideoSurface *videoSurface() const; QRectF adjustedViewport() const Q_DECL_OVERRIDE; private: QPointer m_videoWindowControl; bool m_visible; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/qmldir000066400000000000000000000001401225012771600304230ustar00rootroot00000000000000module QtMultimedia plugin declarative_multimedia typeinfo plugins.qmltypes Video 5.0 Video.qml qsgvideonode_i420.cpp000066400000000000000000000261571225012771600331020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsgvideonode_i420.h" #include #include #include #include #include #include QList QSGVideoNodeFactory_I420::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { QList formats; if (handleType == QAbstractVideoBuffer::NoHandle) formats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12; return formats; } QSGVideoNode *QSGVideoNodeFactory_I420::createNode(const QVideoSurfaceFormat &format) { if (supportedPixelFormats(format.handleType()).contains(format.pixelFormat())) return new QSGVideoNode_I420(format); return 0; } class QSGVideoMaterialShader_YUV420 : public QSGMaterialShader { public: void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); virtual char const *const *attributeNames() const { static const char *names[] = { "qt_VertexPosition", "qt_VertexTexCoord", 0 }; return names; } protected: virtual const char *vertexShader() const { const char *shader = "uniform highp mat4 qt_Matrix; \n" "attribute highp vec4 qt_VertexPosition; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "varying highp vec2 qt_TexCoord; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " gl_Position = qt_Matrix * qt_VertexPosition; \n" "}"; return shader; } virtual const char *fragmentShader() const { static const char *shader = "uniform sampler2D yTexture;" "uniform sampler2D uTexture;" "uniform sampler2D vTexture;" "uniform mediump mat4 colorMatrix;" "uniform lowp float opacity;" "" "varying highp vec2 qt_TexCoord;" "" "void main()" "{" " mediump float Y = texture2D(yTexture, qt_TexCoord).r;" " mediump float U = texture2D(uTexture, qt_TexCoord).r;" " mediump float V = texture2D(vTexture, qt_TexCoord).r;" " mediump vec4 color = vec4(Y, U, V, 1.);" " gl_FragColor = colorMatrix * color * opacity;" "}"; return shader; } virtual void initialize() { m_id_matrix = program()->uniformLocation("qt_Matrix"); m_id_yTexture = program()->uniformLocation("yTexture"); m_id_uTexture = program()->uniformLocation("uTexture"); m_id_vTexture = program()->uniformLocation("vTexture"); m_id_colorMatrix = program()->uniformLocation("colorMatrix"); m_id_opacity = program()->uniformLocation("opacity"); } int m_id_matrix; int m_id_yTexture; int m_id_uTexture; int m_id_vTexture; int m_id_colorMatrix; int m_id_opacity; }; class QSGVideoMaterial_YUV420 : public QSGMaterial { public: QSGVideoMaterial_YUV420(const QVideoSurfaceFormat &format); ~QSGVideoMaterial_YUV420(); virtual QSGMaterialType *type() const { static QSGMaterialType theType; return &theType; } virtual QSGMaterialShader *createShader() const { return new QSGVideoMaterialShader_YUV420; } virtual int compare(const QSGMaterial *other) const { const QSGVideoMaterial_YUV420 *m = static_cast(other); int d = m_textureIds[0] - m->m_textureIds[0]; if (d) return d; else if ((d = m_textureIds[1] - m->m_textureIds[1]) != 0) return d; else return m_textureIds[2] - m->m_textureIds[2]; } void updateBlending() { setFlag(Blending, qFuzzyCompare(m_opacity, qreal(1.0)) ? false : true); } void setCurrentFrame(const QVideoFrame &frame) { QMutexLocker lock(&m_frameMutex); m_frame = frame; } void bind(); void bindTexture(int id, int w, int h, const uchar *bits); QVideoSurfaceFormat m_format; QSize m_textureSize; static const uint Num_Texture_IDs = 3; GLuint m_textureIds[Num_Texture_IDs]; qreal m_opacity; QMatrix4x4 m_colorMatrix; QVideoFrame m_frame; QMutex m_frameMutex; }; QSGVideoMaterial_YUV420::QSGVideoMaterial_YUV420(const QVideoSurfaceFormat &format) : m_format(format), m_opacity(1.0) { memset(m_textureIds, 0, sizeof(m_textureIds)); switch (format.yCbCrColorSpace()) { case QVideoSurfaceFormat::YCbCr_JPEG: m_colorMatrix = QMatrix4x4( 1.0, 0.000, 1.402, -0.701, 1.0, -0.344, -0.714, 0.529, 1.0, 1.772, 0.000, -0.886, 0.0, 0.000, 0.000, 1.0000); break; case QVideoSurfaceFormat::YCbCr_BT709: case QVideoSurfaceFormat::YCbCr_xvYCC709: m_colorMatrix = QMatrix4x4( 1.164, 0.000, 1.793, -0.5727, 1.164, -0.534, -0.213, 0.3007, 1.164, 2.115, 0.000, -1.1302, 0.0, 0.000, 0.000, 1.0000); break; default: //BT 601: m_colorMatrix = QMatrix4x4( 1.164, 0.000, 1.596, -0.8708, 1.164, -0.392, -0.813, 0.5296, 1.164, 2.017, 0.000, -1.081, 0.0, 0.000, 0.000, 1.0000); } setFlag(Blending, false); } QSGVideoMaterial_YUV420::~QSGVideoMaterial_YUV420() { if (!m_textureSize.isEmpty()) glDeleteTextures(Num_Texture_IDs, m_textureIds); } void QSGVideoMaterial_YUV420::bind() { QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions(); QMutexLocker lock(&m_frameMutex); if (m_frame.isValid()) { if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { int fw = m_frame.width(); int fh = m_frame.height(); // Frame has changed size, recreate textures... if (m_textureSize != m_frame.size()) { if (!m_textureSize.isEmpty()) glDeleteTextures(Num_Texture_IDs, m_textureIds); glGenTextures(Num_Texture_IDs, m_textureIds); m_textureSize = m_frame.size(); } const uchar *bits = m_frame.bits(); int bpl = m_frame.bytesPerLine(); int bpl2 = (bpl / 2 + 3) & ~3; int offsetU = bpl * fh; int offsetV = bpl * fh + bpl2 * fh / 2; if (m_frame.pixelFormat() == QVideoFrame::Format_YV12) qSwap(offsetU, offsetV); functions->glActiveTexture(GL_TEXTURE1); bindTexture(m_textureIds[1], fw/2, fh / 2, bits + offsetU); functions->glActiveTexture(GL_TEXTURE2); bindTexture(m_textureIds[2], fw/2, fh / 2, bits + offsetV); functions->glActiveTexture(GL_TEXTURE0); // Finish with 0 as default texture unit bindTexture(m_textureIds[0], fw, fh, bits); m_frame.unmap(); } m_frame = QVideoFrame(); } else { functions->glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_textureIds[1]); functions->glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, m_textureIds[2]); functions->glActiveTexture(GL_TEXTURE0); // Finish with 0 as default texture unit glBindTexture(GL_TEXTURE_2D, m_textureIds[0]); } } void QSGVideoMaterial_YUV420::bindTexture(int id, int w, int h, const uchar *bits) { glBindTexture(GL_TEXTURE_2D, id); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, bits); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } QSGVideoNode_I420::QSGVideoNode_I420(const QVideoSurfaceFormat &format) : m_format(format) { setFlag(QSGNode::OwnsMaterial); m_material = new QSGVideoMaterial_YUV420(format); setMaterial(m_material); } QSGVideoNode_I420::~QSGVideoNode_I420() { } void QSGVideoNode_I420::setCurrentFrame(const QVideoFrame &frame) { m_material->setCurrentFrame(frame); markDirty(DirtyMaterial); } void QSGVideoMaterialShader_YUV420::updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { Q_UNUSED(oldMaterial); QSGVideoMaterial_YUV420 *mat = static_cast(newMaterial); program()->setUniformValue(m_id_yTexture, 0); program()->setUniformValue(m_id_uTexture, 1); program()->setUniformValue(m_id_vTexture, 2); mat->bind(); program()->setUniformValue(m_id_colorMatrix, mat->m_colorMatrix); if (state.isOpacityDirty()) { mat->m_opacity = state.opacity(); program()->setUniformValue(m_id_opacity, GLfloat(mat->m_opacity)); } if (state.isMatrixDirty()) program()->setUniformValue(m_id_matrix, state.combinedMatrix()); } qsgvideonode_i420.h000066400000000000000000000054641225012771600325450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSGVIDEONODE_I420_H #define QSGVIDEONODE_I420_H #include #include class QSGVideoMaterial_YUV420; class QSGVideoNode_I420 : public QSGVideoNode { public: QSGVideoNode_I420(const QVideoSurfaceFormat &format); ~QSGVideoNode_I420(); virtual QVideoFrame::PixelFormat pixelFormat() const { return m_format.pixelFormat(); } void setCurrentFrame(const QVideoFrame &frame); private: void bindTexture(int id, int unit, int w, int h, const uchar *bits); QVideoSurfaceFormat m_format; QSGVideoMaterial_YUV420 *m_material; }; class QSGVideoNodeFactory_I420 : public QSGVideoNodeFactoryInterface { public: QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const; QSGVideoNode *createNode(const QVideoSurfaceFormat &format); }; #endif // QSGVIDEONODE_I420_H qsgvideonode_rgb.cpp000066400000000000000000000223751225012771600331740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsgvideonode_rgb.h" #include #include #include #include #include #include QList QSGVideoNodeFactory_RGB::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { QList pixelFormats; if (handleType == QAbstractVideoBuffer::NoHandle) { pixelFormats.append(QVideoFrame::Format_RGB565); pixelFormats.append(QVideoFrame::Format_RGB32); pixelFormats.append(QVideoFrame::Format_ARGB32); pixelFormats.append(QVideoFrame::Format_BGR32); pixelFormats.append(QVideoFrame::Format_BGRA32); } return pixelFormats; } QSGVideoNode *QSGVideoNodeFactory_RGB::createNode(const QVideoSurfaceFormat &format) { if (supportedPixelFormats(format.handleType()).contains(format.pixelFormat())) return new QSGVideoNode_RGB(format); return 0; } class QSGVideoMaterialShader_RGB : public QSGMaterialShader { public: QSGVideoMaterialShader_RGB(QVideoFrame::PixelFormat pixelFormat) : QSGMaterialShader(), m_id_matrix(-1), m_id_rgbTexture(-1), m_id_opacity(-1), m_pixelFormat(pixelFormat) { } void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); virtual char const *const *attributeNames() const { static const char *names[] = { "qt_VertexPosition", "qt_VertexTexCoord", 0 }; return names; } protected: virtual const char *vertexShader() const { const char *shader = "uniform highp mat4 qt_Matrix; \n" "attribute highp vec4 qt_VertexPosition; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "varying highp vec2 qt_TexCoord; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " gl_Position = qt_Matrix * qt_VertexPosition; \n" "}"; return shader; } virtual const char *fragmentShader() const { static const char *shader = "uniform sampler2D rgbTexture;" "uniform lowp float opacity;" "" "varying highp vec2 qt_TexCoord;" "" "void main()" "{" " gl_FragColor = texture2D(rgbTexture, qt_TexCoord) * opacity;" "}"; static const char *colorsSwapShader = "uniform sampler2D rgbTexture;" "uniform lowp float opacity;" "" "varying highp vec2 qt_TexCoord;" "" "void main()" "{" " gl_FragColor = vec4(texture2D(rgbTexture, qt_TexCoord).bgr, 1.0) * opacity;" "}"; switch (m_pixelFormat) { case QVideoFrame::Format_RGB32: case QVideoFrame::Format_ARGB32: return colorsSwapShader; default: return shader; } } virtual void initialize() { m_id_matrix = program()->uniformLocation("qt_Matrix"); m_id_rgbTexture = program()->uniformLocation("rgbTexture"); m_id_opacity = program()->uniformLocation("opacity"); } int m_id_matrix; int m_id_rgbTexture; int m_id_opacity; QVideoFrame::PixelFormat m_pixelFormat; }; class QSGVideoMaterial_RGB : public QSGMaterial { public: QSGVideoMaterial_RGB(const QVideoSurfaceFormat &format) : m_format(format), m_textureId(0), m_opacity(1.0) { setFlag(Blending, false); } ~QSGVideoMaterial_RGB() { if (m_textureId) glDeleteTextures(1, &m_textureId); } virtual QSGMaterialType *type() const { static QSGMaterialType theType; return &theType; } virtual QSGMaterialShader *createShader() const { return new QSGVideoMaterialShader_RGB(m_format.pixelFormat()); } virtual int compare(const QSGMaterial *other) const { const QSGVideoMaterial_RGB *m = static_cast(other); return m_textureId - m->m_textureId; } void updateBlending() { setFlag(Blending, qFuzzyCompare(m_opacity, qreal(1.0)) ? false : true); } void setVideoFrame(const QVideoFrame &frame) { QMutexLocker lock(&m_frameMutex); m_frame = frame; } void bind() { QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions(); QMutexLocker lock(&m_frameMutex); if (m_frame.isValid()) { if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { if (m_textureSize != m_frame.size()) { if (!m_textureSize.isEmpty()) glDeleteTextures(1, &m_textureId); glGenTextures(1, &m_textureId); m_textureSize = m_frame.size(); } GLint dataType = GL_UNSIGNED_BYTE; GLint dataFormat = GL_RGBA; if (m_frame.pixelFormat() == QVideoFrame::Format_RGB565) { dataType = GL_UNSIGNED_SHORT_5_6_5; dataFormat = GL_RGB; } functions->glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_textureId); glTexImage2D(GL_TEXTURE_2D, 0, dataFormat, m_textureSize.width(), m_textureSize.height(), 0, dataFormat, dataType, m_frame.bits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); m_frame.unmap(); } m_frame = QVideoFrame(); } else { functions->glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_textureId); } } QVideoFrame m_frame; QMutex m_frameMutex; QSize m_textureSize; QVideoSurfaceFormat m_format; GLuint m_textureId; qreal m_opacity; }; QSGVideoNode_RGB::QSGVideoNode_RGB(const QVideoSurfaceFormat &format) : m_format(format) { setFlag(QSGNode::OwnsMaterial); m_material = new QSGVideoMaterial_RGB(format); setMaterial(m_material); } QSGVideoNode_RGB::~QSGVideoNode_RGB() { } void QSGVideoNode_RGB::setCurrentFrame(const QVideoFrame &frame) { m_material->setVideoFrame(frame); markDirty(DirtyMaterial); } void QSGVideoMaterialShader_RGB::updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { Q_UNUSED(oldMaterial); QSGVideoMaterial_RGB *mat = static_cast(newMaterial); program()->setUniformValue(m_id_rgbTexture, 0); mat->bind(); if (state.isOpacityDirty()) { mat->m_opacity = state.opacity(); mat->updateBlending(); program()->setUniformValue(m_id_opacity, GLfloat(mat->m_opacity)); } if (state.isMatrixDirty()) program()->setUniformValue(m_id_matrix, state.combinedMatrix()); } qsgvideonode_rgb.h000066400000000000000000000053671225012771600326430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSGVIDEONODE_RGB_H #define QSGVIDEONODE_RGB_H #include #include class QSGVideoMaterial_RGB; class QSGVideoNode_RGB : public QSGVideoNode { public: QSGVideoNode_RGB(const QVideoSurfaceFormat &format); ~QSGVideoNode_RGB(); virtual QVideoFrame::PixelFormat pixelFormat() const { return m_format.pixelFormat(); } void setCurrentFrame(const QVideoFrame &frame); private: QVideoSurfaceFormat m_format; QSGVideoMaterial_RGB *m_material; QVideoFrame m_frame; }; class QSGVideoNodeFactory_RGB : public QSGVideoNodeFactoryInterface { public: QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const; QSGVideoNode *createNode(const QVideoSurfaceFormat &format); }; #endif // QSGVIDEONODE_RGB_H qsgvideonode_texture.cpp000066400000000000000000000206111225012771600341110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsgvideonode_texture.h" #include #include #include #include #include #include QList QSGVideoNodeFactory_Texture::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { QList pixelFormats; if (handleType == QAbstractVideoBuffer::GLTextureHandle) { pixelFormats.append(QVideoFrame::Format_RGB565); pixelFormats.append(QVideoFrame::Format_RGB32); pixelFormats.append(QVideoFrame::Format_ARGB32); pixelFormats.append(QVideoFrame::Format_BGR32); pixelFormats.append(QVideoFrame::Format_BGRA32); } return pixelFormats; } QSGVideoNode *QSGVideoNodeFactory_Texture::createNode(const QVideoSurfaceFormat &format) { if (supportedPixelFormats(format.handleType()).contains(format.pixelFormat())) return new QSGVideoNode_Texture(format); return 0; } class QSGVideoMaterialShader_Texture : public QSGMaterialShader { public: QSGVideoMaterialShader_Texture(QVideoFrame::PixelFormat pixelFormat) : QSGMaterialShader(), m_pixelFormat(pixelFormat) { } void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); virtual char const *const *attributeNames() const { static const char *names[] = { "qt_VertexPosition", "qt_VertexTexCoord", 0 }; return names; } protected: virtual const char *vertexShader() const { const char *shader = "uniform highp mat4 qt_Matrix; \n" "attribute highp vec4 qt_VertexPosition; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "varying highp vec2 qt_TexCoord; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " gl_Position = qt_Matrix * qt_VertexPosition; \n" "}"; return shader; } virtual const char *fragmentShader() const { static const char *shader = "uniform sampler2D rgbTexture;" "uniform lowp float opacity;" "" "varying highp vec2 qt_TexCoord;" "" "void main()" "{" " gl_FragColor = texture2D(rgbTexture, qt_TexCoord) * opacity;" "}"; #ifndef QT_OPENGL_ES_2_ANGLE static const char *colorsSwapShader = "uniform sampler2D rgbTexture;" "uniform lowp float opacity;" "" "varying highp vec2 qt_TexCoord;" "" "void main()" "{" " gl_FragColor = vec4(texture2D(rgbTexture, qt_TexCoord).bgr, 1.0) * opacity;" "}"; switch (m_pixelFormat) { case QVideoFrame::Format_RGB32: case QVideoFrame::Format_ARGB32: return colorsSwapShader; default: return shader; } #else return shader; #endif } virtual void initialize() { m_id_matrix = program()->uniformLocation("qt_Matrix"); m_id_Texture = program()->uniformLocation("rgbTexture"); m_id_opacity = program()->uniformLocation("opacity"); } int m_id_matrix; int m_id_Texture; int m_id_opacity; QVideoFrame::PixelFormat m_pixelFormat; }; class QSGVideoMaterial_Texture : public QSGMaterial { public: QSGVideoMaterial_Texture(const QVideoSurfaceFormat &format) : m_format(format), m_textureId(0), m_opacity(1.0) { setFlag(Blending, false); } ~QSGVideoMaterial_Texture() { m_frame = QVideoFrame(); } virtual QSGMaterialType *type() const { static QSGMaterialType theType; return &theType; } virtual QSGMaterialShader *createShader() const { return new QSGVideoMaterialShader_Texture(m_format.pixelFormat()); } virtual int compare(const QSGMaterial *other) const { const QSGVideoMaterial_Texture *m = static_cast(other); int diff = m_textureId - m->m_textureId; if (diff) return diff; diff = m_format.pixelFormat() - m->m_format.pixelFormat(); if (diff) return diff; return (m_opacity > m->m_opacity) ? 1 : -1; } void updateBlending() { setFlag(Blending, qFuzzyCompare(m_opacity, qreal(1.0)) ? false : true); } void setVideoFrame(const QVideoFrame &frame) { QMutexLocker lock(&m_frameMutex); m_frame = frame; } void bind() { QMutexLocker lock(&m_frameMutex); if (m_frame.isValid()) { m_textureId = m_frame.handle().toUInt(); glBindTexture(GL_TEXTURE_2D, m_textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } else { m_textureId = 0; } } QVideoFrame m_frame; QMutex m_frameMutex; QSize m_textureSize; QVideoSurfaceFormat m_format; GLuint m_textureId; qreal m_opacity; }; QSGVideoNode_Texture::QSGVideoNode_Texture(const QVideoSurfaceFormat &format) : m_format(format) { setFlag(QSGNode::OwnsMaterial); m_material = new QSGVideoMaterial_Texture(format); setMaterial(m_material); } QSGVideoNode_Texture::~QSGVideoNode_Texture() { } void QSGVideoNode_Texture::setCurrentFrame(const QVideoFrame &frame) { m_material->setVideoFrame(frame); markDirty(DirtyMaterial); } void QSGVideoMaterialShader_Texture::updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { Q_UNUSED(oldMaterial); QSGVideoMaterial_Texture *mat = static_cast(newMaterial); program()->setUniformValue(m_id_Texture, 0); mat->bind(); if (state.isOpacityDirty()) { mat->m_opacity = state.opacity(); mat->updateBlending(); program()->setUniformValue(m_id_opacity, GLfloat(mat->m_opacity)); } if (state.isMatrixDirty()) program()->setUniformValue(m_id_matrix, state.combinedMatrix()); } qsgvideonode_texture.h000066400000000000000000000054011225012771600335560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/imports/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSGVIDEONODE_TEXTURE_H #define QSGVIDEONODE_TEXTURE_H #include #include class QSGVideoMaterial_Texture; class QSGVideoNode_Texture : public QSGVideoNode { public: QSGVideoNode_Texture(const QVideoSurfaceFormat &format); ~QSGVideoNode_Texture(); virtual QVideoFrame::PixelFormat pixelFormat() const { return m_format.pixelFormat(); } void setCurrentFrame(const QVideoFrame &frame); private: QVideoSurfaceFormat m_format; QSGVideoMaterial_Texture *m_material; QVideoFrame m_frame; }; class QSGVideoNodeFactory_Texture : public QSGVideoNodeFactoryInterface { public: QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const; QSGVideoNode *createNode(const QVideoSurfaceFormat &format); }; #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/000077500000000000000000000000001225012771600255205ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/000077500000000000000000000000001225012771600266215ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/audio.pri000066400000000000000000000060201225012771600304340ustar00rootroot00000000000000INCLUDEPATH += audio PUBLIC_HEADERS += \ audio/qaudio.h \ audio/qaudiobuffer.h \ audio/qaudioformat.h \ audio/qaudioinput.h \ audio/qaudiooutput.h \ audio/qaudiodeviceinfo.h \ audio/qaudiosystemplugin.h \ audio/qaudiosystem.h \ audio/qsoundeffect.h \ audio/qsound.h \ audio/qaudioprobe.h \ audio/qaudiodecoder.h PRIVATE_HEADERS += \ audio/qaudiobuffer_p.h \ audio/qaudiodevicefactory_p.h \ audio/qwavedecoder_p.h \ audio/qsamplecache_p.h \ audio/qaudiohelpers_p.h SOURCES += \ audio/qaudio.cpp \ audio/qaudioformat.cpp \ audio/qaudiodeviceinfo.cpp \ audio/qaudiooutput.cpp \ audio/qaudioinput.cpp \ audio/qaudiosystemplugin.cpp \ audio/qaudiosystem.cpp \ audio/qaudiodevicefactory.cpp \ audio/qsoundeffect.cpp \ audio/qwavedecoder_p.cpp \ audio/qsamplecache_p.cpp \ audio/qsound.cpp \ audio/qaudiobuffer.cpp \ audio/qaudioprobe.cpp \ audio/qaudiodecoder.cpp \ audio/qaudiohelpers.cpp mac:!ios { PRIVATE_HEADERS += audio/qaudioinput_mac_p.h \ audio/qaudiooutput_mac_p.h \ audio/qaudiodeviceinfo_mac_p.h \ audio/qaudio_mac_p.h SOURCES += audio/qaudiodeviceinfo_mac_p.cpp \ audio/qaudiooutput_mac_p.cpp \ audio/qaudioinput_mac_p.cpp \ audio/qaudio_mac.cpp LIBS += -framework ApplicationServices -framework CoreAudio -framework AudioUnit -framework AudioToolbox } win32 { PRIVATE_HEADERS += audio/qaudioinput_win32_p.h audio/qaudiooutput_win32_p.h audio/qaudiodeviceinfo_win32_p.h SOURCES += audio/qaudiodeviceinfo_win32_p.cpp \ audio/qaudiooutput_win32_p.cpp \ audio/qaudioinput_win32_p.cpp LIBS += -lwinmm -lstrmiids -lole32 -loleaut32 } unix:!mac { config_pulseaudio { DEFINES += QT_NO_AUDIO_BACKEND CONFIG += link_pkgconfig PKGCONFIG += libpulse DEFINES += QT_MULTIMEDIA_PULSEAUDIO PRIVATE_HEADERS += audio/qsoundeffect_pulse_p.h SOURCES += audio/qsoundeffect_pulse_p.cpp !maemo*:DEFINES += QTM_PULSEAUDIO_DEFAULTBUFFER } else { DEFINES += QT_MULTIMEDIA_QAUDIO PRIVATE_HEADERS += audio/qsoundeffect_qaudio_p.h SOURCES += audio/qsoundeffect_qaudio_p.cpp config_alsa { DEFINES += HAS_ALSA PRIVATE_HEADERS += audio/qaudiooutput_alsa_p.h audio/qaudioinput_alsa_p.h audio/qaudiodeviceinfo_alsa_p.h SOURCES += audio/qaudiodeviceinfo_alsa_p.cpp \ audio/qaudiooutput_alsa_p.cpp \ audio/qaudioinput_alsa_p.cpp LIBS_PRIVATE += -lasound } } } else { DEFINES += QT_MULTIMEDIA_QAUDIO PRIVATE_HEADERS += audio/qsoundeffect_qaudio_p.h SOURCES += audio/qsoundeffect_qaudio_p.cpp } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudio.cpp000066400000000000000000000120051225012771600306050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include QT_BEGIN_NAMESPACE namespace QAudio { class RegisterMetaTypes { public: RegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _register; } /*! \namespace QAudio \brief The QAudio namespace contains enums used by the audio classes. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio */ /*! \enum QAudio::Error \value NoError No errors have occurred \value OpenError An error occurred opening the audio device \value IOError An error occurred during read/write of audio device \value UnderrunError Audio data is not being fed to the audio device at a fast enough rate \value FatalError A non-recoverable error has occurred, the audio device is not usable at this time. */ /*! \enum QAudio::State \value ActiveState Audio data is being processed, this state is set after start() is called and while audio data is available to be processed. \value SuspendedState The audio device is in a suspended state, this state will only be entered after suspend() is called. \value StoppedState The audio device is closed, and is not processing any audio data \value IdleState The QIODevice passed in has no data and audio system's buffer is empty, this state is set after start() is called and while no audio data is available to be processed. */ /*! \enum QAudio::Mode \value AudioOutput audio output device \value AudioInput audio input device */ #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, QAudio::Error error) { QDebug nospace = dbg.nospace(); switch (error) { case QAudio::NoError: nospace << "NoError"; break; case QAudio::OpenError: nospace << "OpenError"; break; case QAudio::IOError: nospace << "IOError"; break; case QAudio::UnderrunError: nospace << "UnderrunError"; break; case QAudio::FatalError: nospace << "FatalError"; break; } return nospace; } QDebug operator<<(QDebug dbg, QAudio::State state) { QDebug nospace = dbg.nospace(); switch (state) { case QAudio::ActiveState: nospace << "ActiveState"; break; case QAudio::SuspendedState: nospace << "SuspendedState"; break; case QAudio::StoppedState: nospace << "StoppedState"; break; case QAudio::IdleState: nospace << "IdleState"; break; } return nospace; } QDebug operator<<(QDebug dbg, QAudio::Mode mode) { QDebug nospace = dbg.nospace(); switch (mode) { case QAudio::AudioInput: nospace << "AudioInput"; break; case QAudio::AudioOutput: nospace << "AudioOutput"; break; } return nospace; } #endif QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudio.h000066400000000000000000000054011225012771600302540ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIO_H #define QAUDIO_H #include #include #include QT_BEGIN_NAMESPACE //QTM_SYNC_HEADER_EXPORT QAudio // Class forward declaration required for QDoc bug class QString; namespace QAudio { enum Error { NoError, OpenError, IOError, UnderrunError, FatalError }; enum State { ActiveState, SuspendedState, StoppedState, IdleState }; enum Mode { AudioInput, AudioOutput }; } #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::Error error); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::State state); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::Mode mode); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudio::Error) Q_DECLARE_METATYPE(QAudio::State) Q_DECLARE_METATYPE(QAudio::Mode) #endif // QAUDIO_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudio_mac.cpp000066400000000000000000000105041225012771600314270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudio_mac_p.h" QT_BEGIN_NAMESPACE // Conversion QAudioFormat toQAudioFormat(AudioStreamBasicDescription const& sf) { QAudioFormat audioFormat; audioFormat.setSampleRate(sf.mSampleRate); audioFormat.setChannelCount(sf.mChannelsPerFrame); audioFormat.setSampleSize(sf.mBitsPerChannel); audioFormat.setCodec(QString::fromLatin1("audio/pcm")); audioFormat.setByteOrder((sf.mFormatFlags & kAudioFormatFlagIsBigEndian) != 0 ? QAudioFormat::BigEndian : QAudioFormat::LittleEndian); QAudioFormat::SampleType type = QAudioFormat::UnSignedInt; if ((sf.mFormatFlags & kAudioFormatFlagIsSignedInteger) != 0) type = QAudioFormat::SignedInt; else if ((sf.mFormatFlags & kAudioFormatFlagIsFloat) != 0) type = QAudioFormat::Float; audioFormat.setSampleType(type); return audioFormat; } AudioStreamBasicDescription toAudioStreamBasicDescription(QAudioFormat const& audioFormat) { AudioStreamBasicDescription sf; sf.mFormatFlags = kAudioFormatFlagIsPacked; sf.mSampleRate = audioFormat.sampleRate(); sf.mFramesPerPacket = 1; sf.mChannelsPerFrame = audioFormat.channelCount(); sf.mBitsPerChannel = audioFormat.sampleSize(); sf.mBytesPerFrame = sf.mChannelsPerFrame * (sf.mBitsPerChannel / 8); sf.mBytesPerPacket = sf.mFramesPerPacket * sf.mBytesPerFrame; sf.mFormatID = kAudioFormatLinearPCM; switch (audioFormat.sampleType()) { case QAudioFormat::SignedInt: sf.mFormatFlags |= kAudioFormatFlagIsSignedInteger; break; case QAudioFormat::UnSignedInt: /* default */ break; case QAudioFormat::Float: sf.mFormatFlags |= kAudioFormatFlagIsFloat; break; case QAudioFormat::Unknown: default: break; } if (audioFormat.byteOrder() == QAudioFormat::BigEndian) sf.mFormatFlags |= kAudioFormatFlagIsBigEndian; return sf; } // QAudioRingBuffer QAudioRingBuffer::QAudioRingBuffer(int bufferSize): m_bufferSize(bufferSize) { m_buffer = new char[m_bufferSize]; reset(); } QAudioRingBuffer::~QAudioRingBuffer() { delete m_buffer; } int QAudioRingBuffer::used() const { return m_bufferUsed.load(); } int QAudioRingBuffer::free() const { return m_bufferSize - m_bufferUsed.load(); } int QAudioRingBuffer::size() const { return m_bufferSize; } void QAudioRingBuffer::reset() { m_readPos = 0; m_writePos = 0; m_bufferUsed.store(0); } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudio_mac_p.h000066400000000000000000000077441225012771600314270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIO_MAC_P_H #define QAUDIO_MAC_P_H #include #include #include #include QT_BEGIN_NAMESPACE extern QAudioFormat toQAudioFormat(const AudioStreamBasicDescription& streamFormat); extern AudioStreamBasicDescription toAudioStreamBasicDescription(QAudioFormat const& audioFormat); class QAudioRingBuffer { public: typedef QPair Region; QAudioRingBuffer(int bufferSize); ~QAudioRingBuffer(); Region acquireReadRegion(int size) { const int used = m_bufferUsed.fetchAndAddAcquire(0); if (used > 0) { const int readSize = qMin(size, qMin(m_bufferSize - m_readPos, used)); return readSize > 0 ? Region(m_buffer + m_readPos, readSize) : Region(0, 0); } return Region(0, 0); } void releaseReadRegion(Region const& region) { m_readPos = (m_readPos + region.second) % m_bufferSize; m_bufferUsed.fetchAndAddRelease(-region.second); } Region acquireWriteRegion(int size) { const int free = m_bufferSize - m_bufferUsed.fetchAndAddAcquire(0); if (free > 0) { const int writeSize = qMin(size, qMin(m_bufferSize - m_writePos, free)); return writeSize > 0 ? Region(m_buffer + m_writePos, writeSize) : Region(0, 0); } return Region(0, 0); } void releaseWriteRegion(Region const& region) { m_writePos = (m_writePos + region.second) % m_bufferSize; m_bufferUsed.fetchAndAddRelease(region.second); } int used() const; int free() const; int size() const; void reset(); private: int m_bufferSize; int m_readPos; int m_writePos; char* m_buffer; QAtomicInt m_bufferUsed; }; QT_END_NAMESPACE #endif // QAUDIO_MAC_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiobuffer.cpp000066400000000000000000000416211225012771600320050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiobuffer.h" #include "qaudiobuffer_p.h" #include #include QT_BEGIN_NAMESPACE namespace { class QAudioBufferPrivateRegisterMetaTypes { public: QAudioBufferPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } class QAudioBufferPrivate : public QSharedData { public: QAudioBufferPrivate(QAbstractAudioBuffer *provider) : mProvider(provider) , mCount(1) { } ~QAudioBufferPrivate() { if (mProvider) mProvider->release(); } void ref() { mCount.ref(); } void deref() { if (!mCount.deref()) delete this; } QAudioBufferPrivate *clone(); static QAudioBufferPrivate *acquire(QAudioBufferPrivate *other) { if (!other) return 0; // Ref the other (if there are extant data() pointers, they will // also point here - it's a feature, not a bug, like QByteArray) other->ref(); return other; } QAbstractAudioBuffer *mProvider; QAtomicInt mCount; }; // Private class to go in .cpp file class QMemoryAudioBufferProvider : public QAbstractAudioBuffer { public: QMemoryAudioBufferProvider(const void *data, int frameCount, const QAudioFormat &format, qint64 startTime) : mStartTime(startTime) , mFrameCount(frameCount) , mFormat(format) { int numBytes = format.bytesForFrames(frameCount); if (numBytes > 0) { mBuffer = malloc(numBytes); if (!mBuffer) { // OOM, if that's likely mStartTime = -1; mFrameCount = 0; mFormat = QAudioFormat(); } else { // Allocated, see if we have data to copy if (data) { memcpy(mBuffer, data, numBytes); } else { // We have to fill with the zero value.. switch (format.sampleType()) { case QAudioFormat::SignedInt: // Signed int means 0x80, 0x8000 is zero // XXX this is not right for > 8 bits(0x8080 vs 0x8000) memset(mBuffer, 0x80, numBytes); break; default: memset(mBuffer, 0x0, numBytes); } } } } else mBuffer = 0; } ~QMemoryAudioBufferProvider() { if (mBuffer) free(mBuffer); } void release() {delete this;} QAudioFormat format() const {return mFormat;} qint64 startTime() const {return mStartTime;} int frameCount() const {return mFrameCount;} void *constData() const {return mBuffer;} void *writableData() {return mBuffer;} QAbstractAudioBuffer *clone() const { return new QMemoryAudioBufferProvider(mBuffer, mFrameCount, mFormat, mStartTime); } void *mBuffer; qint64 mStartTime; int mFrameCount; QAudioFormat mFormat; }; QAudioBufferPrivate *QAudioBufferPrivate::clone() { // We want to create a single bufferprivate with a // single qaab // This should only be called when the count is > 1 Q_ASSERT(mCount.load() > 1); if (mProvider) { QAbstractAudioBuffer *abuf = mProvider->clone(); if (!abuf) { abuf = new QMemoryAudioBufferProvider(mProvider->constData(), mProvider->frameCount(), mProvider->format(), mProvider->startTime()); } if (abuf) { return new QAudioBufferPrivate(abuf); } } return 0; } /*! \class QAbstractAudioBuffer \internal */ /*! \class QAudioBuffer \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio \brief The QAudioBuffer class represents a collection of audio samples with a specific format and sample rate. */ // ^ Mostly useful with probe or decoder /*! Create a new, empty, invalid buffer. */ QAudioBuffer::QAudioBuffer() : d(0) { } /*! \internal Create a new audio buffer from the supplied \a provider. This constructor is typically only used when handling certain hardware or media framework specific buffers, and generally isn't useful in application code. */ QAudioBuffer::QAudioBuffer(QAbstractAudioBuffer *provider) : d(new QAudioBufferPrivate(provider)) { } /*! Creates a new audio buffer from \a other. Generally this will have copy-on-write semantics - a copy will only be made when it has to be. */ QAudioBuffer::QAudioBuffer(const QAudioBuffer &other) { d = QAudioBufferPrivate::acquire(other.d); } /*! Creates a new audio buffer from the supplied \a data, in the given \a format. The format will determine how the number and sizes of the samples are interpreted from the \a data. If the supplied \a data is not an integer multiple of the calculated frame size, the excess data will not be used. This audio buffer will copy the contents of \a data. \a startTime (in microseconds) indicates when this buffer starts in the stream. If this buffer is not part of a stream, set it to -1. */ QAudioBuffer::QAudioBuffer(const QByteArray &data, const QAudioFormat &format, qint64 startTime) { if (format.isValid()) { int frameCount = format.framesForBytes(data.size()); d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(data.constData(), frameCount, format, startTime)); } else d = 0; } /*! Creates a new audio buffer with space for \a numFrames frames of the given \a format. The individual samples will be initialized to the default for the format. \a startTime (in microseconds) indicates when this buffer starts in the stream. If this buffer is not part of a stream, set it to -1. */ QAudioBuffer::QAudioBuffer(int numFrames, const QAudioFormat &format, qint64 startTime) { if (format.isValid()) d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(0, numFrames, format, startTime)); else d = 0; } /*! Assigns the \a other buffer to this. */ QAudioBuffer &QAudioBuffer::operator =(const QAudioBuffer &other) { if (this->d != other.d) { d = QAudioBufferPrivate::acquire(other.d); } return *this; } /*! Destroys this audio buffer. */ QAudioBuffer::~QAudioBuffer() { if (d) d->deref(); } /*! Returns true if this is a valid buffer. A valid buffer has more than zero frames in it and a valid format. */ bool QAudioBuffer::isValid() const { if (!d || !d->mProvider) return false; return d->mProvider->format().isValid() && (d->mProvider->frameCount() > 0); } /*! Returns the \l {QAudioFormat}{format} of this buffer. Several properties of this format influence how the \l duration() or \l byteCount() are calculated from the \l frameCount(). */ QAudioFormat QAudioBuffer::format() const { if (!isValid()) return QAudioFormat(); return d->mProvider->format(); } /*! Returns the number of complete audio frames in this buffer. An audio frame is an interleaved set of one sample per channel for the same instant in time. */ int QAudioBuffer::frameCount() const { if (!isValid()) return 0; return d->mProvider->frameCount(); } /*! Returns the number of samples in this buffer. If the format of this buffer has multiple channels, then this count includes all channels. This means that a stereo buffer with 1000 samples in total will have 500 left samples and 500 right samples (interleaved), and this function will return 1000. \sa frameCount() */ int QAudioBuffer::sampleCount() const { if (!isValid()) return 0; return frameCount() * format().channelCount(); } /*! Returns the size of this buffer, in bytes. */ int QAudioBuffer::byteCount() const { const QAudioFormat f(format()); return format().bytesForFrames(frameCount()); } /*! Returns the duration of audio in this buffer, in microseconds. This depends on the /l format(), and the \l frameCount(). */ qint64 QAudioBuffer::duration() const { return format().durationForFrames(frameCount()); } /*! Returns the time in a stream that this buffer starts at (in microseconds). If this buffer is not part of a stream, this will return -1. */ qint64 QAudioBuffer::startTime() const { if (!isValid()) return -1; return d->mProvider->startTime(); } /*! Returns a pointer to this buffer's data. You can only read it. This method is preferred over the const version of \l data() to prevent unnecessary copying. There is also a templatized version of this constData() function that allows you to retrieve a specific type of read-only pointer to the data. Note that there is no checking done on the format of the audio buffer - this is simply a convenience function. \code // With a 16bit sample buffer: const quint16 *data = buffer->constData(); \endcode */ const void* QAudioBuffer::constData() const { if (!isValid()) return 0; return d->mProvider->constData(); } /*! Returns a pointer to this buffer's data. You can only read it. You should use the \l constData() function rather than this to prevent accidental deep copying. There is also a templatized version of this data() function that allows you to retrieve a specific type of read-only pointer to the data. Note that there is no checking done on the format of the audio buffer - this is simply a convenience function. \code // With a 16bit sample const buffer: const quint16 *data = buffer->data(); \endcode */ const void* QAudioBuffer::data() const { if (!isValid()) return 0; return d->mProvider->constData(); } /* Template data/constData functions caused override problems with qdoc, so moved their docs into the non template versions. */ /*! Returns a pointer to this buffer's data. You can modify the data through the returned pointer. Since QAudioBuffers can share the actual sample data, calling this function will result in a deep copy being made if there are any other buffers using the sample. You should avoid calling this unless you really need to modify the data. This pointer will remain valid until the underlying storage is detached. In particular, if you obtain a pointer, and then copy this audio buffer, changing data through this pointer may change both buffer instances. Calling \l data() on either instance will again cause a deep copy to be made, which may invalidate the pointers returned from this function previously. There is also a templatized version of data() allows you to retrieve a specific type of pointer to the data. Note that there is no checking done on the format of the audio buffer - this is simply a convenience function. \code // With a 16bit sample buffer: quint16 *data = buffer->data(); // May cause deep copy \endcode */ void *QAudioBuffer::data() { if (!isValid()) return 0; if (d->mCount.load() != 1) { // Can't share a writable buffer // so we need to detach QAudioBufferPrivate *newd = d->clone(); // This shouldn't happen if (!newd) return 0; d->deref(); d = newd; } // We're (now) the only user of this qaab, so // see if it's writable directly void *buffer = d->mProvider->writableData(); if (buffer) { return buffer; } // Wasn't writable, so turn it into a memory provider QAbstractAudioBuffer *memBuffer = new QMemoryAudioBufferProvider(constData(), frameCount(), format(), startTime()); if (memBuffer) { d->mProvider->release(); d->mCount.store(1); d->mProvider = memBuffer; return memBuffer->writableData(); } return 0; } // Template helper classes worth documenting /*! \class QAudioBuffer::StereoFrameDefault \internal Just a trait class for the default value. */ /*! \class QAudioBuffer::StereoFrame \brief The StereoFrame class provides a simple wrapper for a stereo audio frame. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio This templatized structure lets you treat a block of individual samples as an interleaved stereo stream frame. This is most useful when used with the templatized \l {QAudioBuffer::data()}{data()} functions of QAudioBuffer. Generally the data is accessed as a pointer, so no copying should occur. There are some predefined instantiations of this template for working with common stereo sample depths in a convenient way. This frame structure has \e left and \e right members for accessing individual channel data. For example: \code // Assuming 'buffer' is an unsigned 16 bit stereo buffer.. QAudioBuffer::S16U *frames = buffer->data(); for (int i=0; i < buffer->frameCount(); i++) { qSwap(frames[i].left, frames[i].right); } \endcode \sa QAudioBuffer::S8U, QAudioBuffer::S8S, QAudioBuffer::S16S, QAudioBuffer::S16U, QAudioBuffer::S32F */ /*! \fn QAudioBuffer::StereoFrame::StereoFrame() Constructs a new frame with the "silent" value for this sample format (0 for signed formats and floats, 0x8* for unsigned formats). */ /*! \fn QAudioBuffer::StereoFrame::StereoFrame(T leftSample, T rightSample) Constructs a new frame with the supplied \a leftSample and \a rightSample values. */ /*! \fn QAudioBuffer::StereoFrame::operator=(const StereoFrame &other) Assigns \a other to this frame. */ /*! \fn QAudioBuffer::StereoFrame::average() const Returns the arithmetic average of the left and right samples. */ /*! \fn QAudioBuffer::StereoFrame::clear() Sets the values of this frame to the "silent" value. */ /*! \variable QAudioBuffer::StereoFrame::left \brief the left sample */ /*! \variable QAudioBuffer::StereoFrame::right \brief the right sample */ /*! \typedef QAudioBuffer::S8U \relates QAudioBuffer::StereoFrame This is a predefined specialization for an unsigned stereo 8 bit sample. Each channel is an \e {unsigned char}. */ /*! \typedef QAudioBuffer::S8S \relates QAudioBuffer::StereoFrame This is a predefined specialization for a signed stereo 8 bit sample. Each channel is a \e {signed char}. */ /*! \typedef QAudioBuffer::S16U \relates QAudioBuffer::StereoFrame This is a predefined specialization for an unsigned stereo 16 bit sample. Each channel is an \e {unsigned short}. */ /*! \typedef QAudioBuffer::S16S \relates QAudioBuffer::StereoFrame This is a predefined specialization for a signed stereo 16 bit sample. Each channel is a \e {signed short}. */ /*! \typedef QAudioBuffer::S32F \relates QAudioBuffer::StereoFrame This is a predefined specialization for an 32 bit float sample. Each channel is a \e float. */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiobuffer.h000066400000000000000000000115661225012771600314570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOBUFFER_H #define QAUDIOBUFFER_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractAudioBuffer; class QAudioBufferPrivate; class Q_MULTIMEDIA_EXPORT QAudioBuffer { public: QAudioBuffer(); QAudioBuffer(QAbstractAudioBuffer *provider); QAudioBuffer(const QAudioBuffer &other); QAudioBuffer(const QByteArray &data, const QAudioFormat &format, qint64 startTime = -1); QAudioBuffer(int numFrames, const QAudioFormat &format, qint64 startTime = -1); // Initialized to empty QAudioBuffer& operator=(const QAudioBuffer &other); ~QAudioBuffer(); bool isValid() const; QAudioFormat format() const; int frameCount() const; int sampleCount() const; int byteCount() const; qint64 duration() const; qint64 startTime() const; // Data modification // void clear(); // Other ideas // operator *= // operator += (need to be careful about different formats) // Data access const void* constData() const; // Does not detach, preferred const void* data() const; // Does not detach void *data(); // detaches // Structures for easier access to stereo data template struct StereoFrameDefault { enum { Default = 0 }; }; template struct StereoFrame { StereoFrame() : left(T(StereoFrameDefault::Default)) , right(T(StereoFrameDefault::Default)) { } StereoFrame(T leftSample, T rightSample) : left(leftSample) , right(rightSample) { } StereoFrame& operator=(const StereoFrame &other) { // Two straight assigns is probably // cheaper than a conditional check on // self assignment left = other.left; right = other.right; return *this; } T left; T right; T average() const {return (left + right) / 2;} void clear() {left = right = T(StereoFrameDefault::Default);} }; typedef StereoFrame S8U; typedef StereoFrame S8S; typedef StereoFrame S16U; typedef StereoFrame S16S; typedef StereoFrame S32F; template const T* constData() const { return static_cast(constData()); } template const T* data() const { return static_cast(data()); } template T* data() { return static_cast(data()); } private: QAudioBufferPrivate *d; }; template <> struct QAudioBuffer::StereoFrameDefault { enum { Default = 128 }; }; template <> struct QAudioBuffer::StereoFrameDefault { enum { Default = 32768 }; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioBuffer) #endif // QAUDIOBUFFER_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiobuffer_p.h000066400000000000000000000061311225012771600317660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOBUFFER_P_H #define QAUDIOBUFFER_P_H #include #include #include "qaudioformat.h" QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QAbstractAudioBuffer { public: virtual ~QAbstractAudioBuffer() {} // Lifetime management virtual void release() = 0; // Format related virtual QAudioFormat format() const = 0; virtual qint64 startTime() const = 0; virtual int frameCount() const = 0; // R/O Data virtual void *constData() const = 0; // For writable data we do this: // If we only have one reference to the provider, // call writableData(). If that does not return 0, // then we're finished. If it does return 0, then we call // writableClone() to get a new buffer and then release // the old clone if that succeeds. If it fails, we create // a memory clone from the constData and release the old buffer. // If writableClone() succeeds, we then call writableData() on it // and that should be good. virtual void *writableData() = 0; virtual QAbstractAudioBuffer *clone() const = 0; }; QT_END_NAMESPACE #endif // QAUDIOBUFFER_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiodecoder.cpp000066400000000000000000000351471225012771600321470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiodecoder.h" #include "qmediaobject_p.h" #include #include "qaudiodecodercontrol.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QAudioDecoder \brief The QAudioDecoder class allows decoding audio. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio \preliminary The QAudioDecoder class is a high level class for decoding local audio media files. It is similar to the QMediaPlayer class except that audio is provided back through this API rather than routed directly to audio hardware, and playlists and network and streaming based media is not supported. \sa QAudioBuffer */ namespace { class AudioDecoderRegisterMetaTypes { public: AudioDecoderRegisterMetaTypes() { qRegisterMetaType("QAudioDecoder::State"); qRegisterMetaType("QAudioDecoder::Error"); } } _registerPlayerMetaTypes; } class QAudioDecoderPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QAudioDecoder) public: QAudioDecoderPrivate() : provider(0) , control(0) , state(QAudioDecoder::StoppedState) , error(QAudioDecoder::NoError) {} QMediaServiceProvider *provider; QAudioDecoderControl *control; QAudioDecoder::State state; QAudioDecoder::Error error; QString errorString; void _q_stateChanged(QAudioDecoder::State state); void _q_error(int error, const QString &errorString); }; void QAudioDecoderPrivate::_q_stateChanged(QAudioDecoder::State ps) { Q_Q(QAudioDecoder); if (ps != state) { state = ps; emit q->stateChanged(ps); } } void QAudioDecoderPrivate::_q_error(int error, const QString &errorString) { Q_Q(QAudioDecoder); this->error = QAudioDecoder::Error(error); this->errorString = errorString; emit q->error(this->error); } /*! Construct an QAudioDecoder instance parented to \a parent. */ QAudioDecoder::QAudioDecoder(QObject *parent) : QMediaObject(*new QAudioDecoderPrivate, parent, QMediaServiceProvider::defaultServiceProvider()->requestService(Q_MEDIASERVICE_AUDIODECODER)) { Q_D(QAudioDecoder); d->provider = QMediaServiceProvider::defaultServiceProvider(); if (d->service) { d->control = qobject_cast(d->service->requestControl(QAudioDecoderControl_iid)); if (d->control != 0) { connect(d->control, SIGNAL(stateChanged(QAudioDecoder::State)), SLOT(_q_stateChanged(QAudioDecoder::State))); connect(d->control, SIGNAL(error(int,QString)), SLOT(_q_error(int,QString))); connect(d->control, SIGNAL(formatChanged(QAudioFormat)), SIGNAL(formatChanged(QAudioFormat))); connect(d->control, SIGNAL(sourceChanged()), SIGNAL(sourceChanged())); connect(d->control, SIGNAL(bufferReady()), this, SIGNAL(bufferReady())); connect(d->control ,SIGNAL(bufferAvailableChanged(bool)), this, SIGNAL(bufferAvailableChanged(bool))); connect(d->control ,SIGNAL(finished()), this, SIGNAL(finished())); connect(d->control ,SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64))); connect(d->control ,SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); } } if (!d->control) { d->error = ServiceMissingError; d->errorString = tr("The QAudioDecoder object does not have a valid service"); } } /*! Destroys the audio decoder object. */ QAudioDecoder::~QAudioDecoder() { Q_D(QAudioDecoder); if (d->service) { if (d->control) d->service->releaseControl(d->control); d->provider->releaseService(d->service); } } QAudioDecoder::State QAudioDecoder::state() const { return d_func()->state; } /*! Returns the current error state. */ QAudioDecoder::Error QAudioDecoder::error() const { return d_func()->error; } QString QAudioDecoder::errorString() const { return d_func()->errorString; } /*! Starts decoding the audio resource. As data gets decoded, the \l bufferReady() signal will be emitted when enough data has been decoded. Calling \l read() will then return an audio buffer without blocking. If you call read() before a buffer is ready, an invalid buffer will be returned, again without blocking. \sa read() */ void QAudioDecoder::start() { Q_D(QAudioDecoder); if (d->control == 0) { QMetaObject::invokeMethod(this, "_q_error", Qt::QueuedConnection, Q_ARG(int, QAudioDecoder::ServiceMissingError), Q_ARG(QString, tr("The QAudioDecoder object does not have a valid service"))); return; } // Reset error conditions d->error = NoError; d->errorString.clear(); d->control->start(); } /*! Stop decoding audio. Calling \l start() again will resume decoding from the beginning. */ void QAudioDecoder::stop() { Q_D(QAudioDecoder); if (d->control != 0) d->control->stop(); } /*! Returns the current file name to decode. If \l setSourceDevice was called, this will be empty. */ QString QAudioDecoder::sourceFilename() const { Q_D(const QAudioDecoder); if (d->control) return d->control->sourceFilename(); return QString(); } /*! Sets the current audio file name to \a fileName. When this property is set any current decoding is stopped, and any audio buffers are discarded. You can only specify either a source filename or a source QIODevice. Setting one will unset the other. */ void QAudioDecoder::setSourceFilename(const QString &fileName) { Q_D(QAudioDecoder); if (d->control != 0) d_func()->control->setSourceFilename(fileName); } /*! Returns the current source QIODevice, if one was set. If \l setSourceFilename() was called, this will be 0. */ QIODevice *QAudioDecoder::sourceDevice() const { Q_D(const QAudioDecoder); if (d->control) return d->control->sourceDevice(); return 0; } /*! Sets the current audio QIODevice to \a device. When this property is set any current decoding is stopped, and any audio buffers are discarded. You can only specify either a source filename or a source QIODevice. Setting one will unset the other. */ void QAudioDecoder::setSourceDevice(QIODevice *device) { Q_D(QAudioDecoder); if (d->control != 0) d_func()->control->setSourceDevice(device); } /*! Returns the current audio format of the decoded stream. Any buffers returned should have this format. \sa setAudioFormat(), formatChanged() */ QAudioFormat QAudioDecoder::audioFormat() const { Q_D(const QAudioDecoder); if (d->control) return d->control->audioFormat(); return QAudioFormat(); } /*! Set the desired audio format for decoded samples to \a format. This property can only be set while the decoder is stopped. Setting this property at other times will be ignored. If the decoder does not support this format, \l error() will be set to \c FormatError. If you do not specify a format, the format of the decoded audio itself will be used. Otherwise, some format conversion will be applied. If you wish to reset the decoded format to that of the original audio file, you can specify an invalid \a format. */ void QAudioDecoder::setAudioFormat(const QAudioFormat &format) { Q_D(QAudioDecoder); if (state() != QAudioDecoder::StoppedState) return; if (d->control != 0) d_func()->control->setAudioFormat(format); } /*! \internal */ bool QAudioDecoder::bind(QObject *obj) { return QMediaObject::bind(obj); } /*! \internal */ void QAudioDecoder::unbind(QObject *obj) { QMediaObject::unbind(obj); } /*! Returns the level of support an audio decoder has for a \a mimeType and a set of \a codecs. */ QMultimedia::SupportEstimate QAudioDecoder::hasSupport(const QString &mimeType, const QStringList& codecs) { return QMediaServiceProvider::defaultServiceProvider()->hasSupport(QByteArray(Q_MEDIASERVICE_AUDIODECODER), mimeType, codecs); } /*! Returns true if a buffer is available to be read, and false otherwise. If there is no buffer available, calling the \l read() function will return an invalid buffer. */ bool QAudioDecoder::bufferAvailable() const { Q_D(const QAudioDecoder); if (d->control) return d->control->bufferAvailable(); return false; } /*! Returns position (in milliseconds) of the last buffer read from the decoder or -1 if no buffers have been read. */ qint64 QAudioDecoder::position() const { Q_D(const QAudioDecoder); if (d->control) return d->control->position(); return -1; } /*! Returns total duration (in milliseconds) of the audio stream or -1 if not available. */ qint64 QAudioDecoder::duration() const { Q_D(const QAudioDecoder); if (d->control) return d->control->duration(); return -1; } /*! Read a buffer from the decoder, if one is available. Returns an invalid buffer if there are no decoded buffers currently available, or on failure. In both cases this function will not block. You should either respond to the \l bufferReady() signal or check the \l bufferAvailable() function before calling read() to make sure you get useful data. */ QAudioBuffer QAudioDecoder::read() const { Q_D(const QAudioDecoder); if (d->control) { return d->control->read(); } else { return QAudioBuffer(); } } // Enums /*! \enum QAudioDecoder::State Defines the current state of a media player. \value StoppedState The decoder is not decoding. Decoding will start at the start of the media. \value DecodingState The audio player is currently decoding media. */ /*! \enum QAudioDecoder::Error Defines a media player error condition. \value NoError No error has occurred. \value ResourceError A media resource couldn't be resolved. \value FormatError The format of a media resource isn't supported. \value AccessDeniedError There are not the appropriate permissions to play a media resource. \value ServiceMissingError A valid playback service was not found, playback cannot proceed. */ // Signals /*! \fn QAudioDecoder::error(QAudioDecoder::Error error) Signals that an \a error condition has occurred. \sa errorString() */ /*! \fn void QAudioDecoder::stateChanged(State state) Signal the \a state of the decoder object has changed. */ /*! \fn void QAudioDecoder::sourceChanged() Signals that the current source of the decoder has changed. \sa sourceFilename(), sourceDevice() */ /*! \fn void QAudioDecoder::formatChanged(const QAudioFormat &format) Signals that the current audio format of the decoder has changed to \a format. \sa audioFormat(), setAudioFormat() */ /*! \fn void QAudioDecoder::bufferReady() Signals that a new decoded audio buffer is available to be read. \sa read(), bufferAvailable() */ /*! \fn void QAudioDecoder::bufferAvailableChanged(bool available) Signals the availability (if \a available is true) of a new buffer. If \a available is false, there are no buffers available. \sa bufferAvailable(), bufferReady() */ /*! \fn void QAudioDecoder::finished() Signals that the decoding has finished successfully. If decoding fails, error signal is emitted instead. \sa start(), stop(), error() */ /*! \fn void QAudioDecoder::positionChanged(qint64 position) Signals that the current \a position of the decoder has changed. \sa durationChanged() */ /*! \fn void QAudioDecoder::durationChanged(qint64 duration) Signals that the estimated \a duration of the decoded data has changed. \sa positionChanged() */ // Properties /*! \property QAudioDecoder::state \brief the audio decoder's playback state. By default this property is QAudioDecoder::Stopped \sa start(), stop() */ /*! \property QAudioDecoder::error \brief a string describing the last error condition. \sa error() */ /*! \property QAudioDecoder::sourceFilename \brief the active filename being decoded by the decoder object. */ /*! \property QAudioDecoder::bufferAvailable \brief whether there is a decoded audio buffer available */ #include "moc_qaudiodecoder.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiodecoder.h000066400000000000000000000104521225012771600316040ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIODECODER_H #define QAUDIODECODER_H #include #include #include QT_BEGIN_NAMESPACE class QAudioDecoderPrivate; class Q_MULTIMEDIA_EXPORT QAudioDecoder : public QMediaObject { Q_OBJECT Q_PROPERTY(QString sourceFilename READ sourceFilename WRITE setSourceFilename NOTIFY sourceChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(QString error READ errorString) Q_PROPERTY(bool bufferAvailable READ bufferAvailable NOTIFY bufferAvailableChanged) Q_ENUMS(State) Q_ENUMS(Error) public: enum State { StoppedState, DecodingState }; enum Error { NoError, ResourceError, FormatError, AccessDeniedError, ServiceMissingError }; QAudioDecoder(QObject *parent = 0); ~QAudioDecoder(); static QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs = QStringList()); State state() const; QString sourceFilename() const; void setSourceFilename(const QString &fileName); QIODevice* sourceDevice() const; void setSourceDevice(QIODevice *device); QAudioFormat audioFormat() const; void setAudioFormat(const QAudioFormat &format); Error error() const; QString errorString() const; QAudioBuffer read() const; bool bufferAvailable() const; qint64 position() const; qint64 duration() const; public Q_SLOTS: void start(); void stop(); Q_SIGNALS: void bufferAvailableChanged(bool); void bufferReady(); void finished(); void stateChanged(QAudioDecoder::State newState); void formatChanged(const QAudioFormat &format); void error(QAudioDecoder::Error error); void sourceChanged(); void positionChanged(qint64 position); void durationChanged(qint64 duration); public: virtual bool bind(QObject *); virtual void unbind(QObject *); private: Q_DISABLE_COPY(QAudioDecoder) Q_DECLARE_PRIVATE(QAudioDecoder) Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QAudioDecoder::State)) Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &)) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioDecoder::State) Q_DECLARE_METATYPE(QAudioDecoder::Error) Q_MEDIA_ENUM_DEBUG(QAudioDecoder, State) Q_MEDIA_ENUM_DEBUG(QAudioDecoder, Error) #endif // QAUDIODECODER_H qaudiodevicefactory.cpp000066400000000000000000000251411225012771600333030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qaudiosystem.h" #include "qaudiosystemplugin.h" #include "qmediapluginloader_p.h" #include "qaudiodevicefactory_p.h" #ifndef QT_NO_AUDIO_BACKEND #if defined(Q_OS_WIN) #include "qaudiodeviceinfo_win32_p.h" #include "qaudiooutput_win32_p.h" #include "qaudioinput_win32_p.h" #elif defined(Q_OS_MAC) && !defined(Q_OS_IOS) #include "qaudiodeviceinfo_mac_p.h" #include "qaudiooutput_mac_p.h" #include "qaudioinput_mac_p.h" #elif defined(HAS_ALSA) #include "qaudiodeviceinfo_alsa_p.h" #include "qaudiooutput_alsa_p.h" #include "qaudioinput_alsa_p.h" #endif #endif QT_BEGIN_NAMESPACE #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, audioLoader, (QAudioSystemFactoryInterface_iid, QLatin1String("audio"), Qt::CaseInsensitive)) #endif class QNullDeviceInfo : public QAbstractAudioDeviceInfo { public: QAudioFormat preferredFormat() const { qWarning()<<"using null deviceinfo, none available"; return QAudioFormat(); } bool isFormatSupported(const QAudioFormat& ) const { return false; } QAudioFormat nearestFormat(const QAudioFormat& ) const { return QAudioFormat(); } QString deviceName() const { return QString(); } QStringList supportedCodecs() { return QStringList(); } QList supportedSampleRates() { return QList(); } QList supportedChannelCounts() { return QList(); } QList supportedSampleSizes() { return QList(); } QList supportedByteOrders() { return QList(); } QList supportedSampleTypes() { return QList(); } }; class QNullInputDevice : public QAbstractAudioInput { public: void start(QIODevice*) { qWarning()<<"using null input device, none available";} QIODevice* start() { qWarning()<<"using null input device, none available"; return 0; } void stop() {} void reset() {} void suspend() {} void resume() {} int bytesReady() const { return 0; } int periodSize() const { return 0; } void setBufferSize(int ) {} int bufferSize() const { return 0; } void setNotifyInterval(int ) {} int notifyInterval() const { return 0; } qint64 processedUSecs() const { return 0; } qint64 elapsedUSecs() const { return 0; } QAudio::Error error() const { return QAudio::OpenError; } QAudio::State state() const { return QAudio::StoppedState; } void setFormat(const QAudioFormat&) {} QAudioFormat format() const { return QAudioFormat(); } void setVolume(qreal) {} qreal volume() const {return 1.0f;} }; class QNullOutputDevice : public QAbstractAudioOutput { public: void start(QIODevice*) {qWarning()<<"using null output device, none available";} QIODevice* start() { qWarning()<<"using null output device, none available"; return 0; } void stop() {} void reset() {} void suspend() {} void resume() {} int bytesFree() const { return 0; } int periodSize() const { return 0; } void setBufferSize(int ) {} int bufferSize() const { return 0; } void setNotifyInterval(int ) {} int notifyInterval() const { return 0; } qint64 processedUSecs() const { return 0; } qint64 elapsedUSecs() const { return 0; } QAudio::Error error() const { return QAudio::OpenError; } QAudio::State state() const { return QAudio::StoppedState; } void setFormat(const QAudioFormat&) {} QAudioFormat format() const { return QAudioFormat(); } }; QList QAudioDeviceFactory::availableDevices(QAudio::Mode mode) { QList devices; #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) foreach (const QByteArray &handle, QAudioDeviceInfoInternal::availableDevices(mode)) devices << QAudioDeviceInfo(QLatin1String("builtin"), handle, mode); #endif #endif #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QMediaPluginLoader* l = audioLoader(); foreach (const QString& key, l->keys()) { QAudioSystemFactoryInterface* plugin = qobject_cast(l->instance(key)); if (plugin) { foreach (QByteArray const& handle, plugin->availableDevices(mode)) devices << QAudioDeviceInfo(key, handle, mode); } } #endif return devices; } QAudioDeviceInfo QAudioDeviceFactory::defaultInputDevice() { #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast(audioLoader()->instance(QLatin1String("default"))); if (plugin) { QList list = plugin->availableDevices(QAudio::AudioInput); if (list.size() > 0) return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioInput); } #endif #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) return QAudioDeviceInfo(QLatin1String("builtin"), QAudioDeviceInfoInternal::defaultInputDevice(), QAudio::AudioInput); #endif #endif return QAudioDeviceInfo(); } QAudioDeviceInfo QAudioDeviceFactory::defaultOutputDevice() { #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast(audioLoader()->instance(QLatin1String("default"))); if (plugin) { QList list = plugin->availableDevices(QAudio::AudioOutput); if (list.size() > 0) return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioOutput); } #endif #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) return QAudioDeviceInfo(QLatin1String("builtin"), QAudioDeviceInfoInternal::defaultOutputDevice(), QAudio::AudioOutput); #endif #endif return QAudioDeviceInfo(); } QAbstractAudioDeviceInfo* QAudioDeviceFactory::audioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode) { QAbstractAudioDeviceInfo *rc = 0; #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) if (realm == QLatin1String("builtin")) return new QAudioDeviceInfoInternal(handle, mode); #endif #endif #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast(audioLoader()->instance(realm)); if (plugin) rc = plugin->createDeviceInfo(handle, mode); #endif return rc == 0 ? new QNullDeviceInfo() : rc; } QAbstractAudioInput* QAudioDeviceFactory::createDefaultInputDevice(QAudioFormat const &format) { return createInputDevice(defaultInputDevice(), format); } QAbstractAudioOutput* QAudioDeviceFactory::createDefaultOutputDevice(QAudioFormat const &format) { return createOutputDevice(defaultOutputDevice(), format); } QAbstractAudioInput* QAudioDeviceFactory::createInputDevice(QAudioDeviceInfo const& deviceInfo, QAudioFormat const &format) { if (deviceInfo.isNull()) return new QNullInputDevice(); #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) if (deviceInfo.realm() == QLatin1String("builtin")) { QAbstractAudioInput* p = new QAudioInputPrivate(deviceInfo.handle()); if (p) p->setFormat(format); return p; } #endif #endif #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast(audioLoader()->instance(deviceInfo.realm())); if (plugin) { QAbstractAudioInput* p = plugin->createInput(deviceInfo.handle()); if (p) p->setFormat(format); return p; } #endif return new QNullInputDevice(); } QAbstractAudioOutput* QAudioDeviceFactory::createOutputDevice(QAudioDeviceInfo const& deviceInfo, QAudioFormat const &format) { if (deviceInfo.isNull()) return new QNullOutputDevice(); #ifndef QT_NO_AUDIO_BACKEND #if (defined(Q_OS_WIN) || (defined(Q_OS_MAC) && !defined(Q_OS_IOS)) || defined(HAS_ALSA)) if (deviceInfo.realm() == QLatin1String("builtin")) { QAbstractAudioOutput* p = new QAudioOutputPrivate(deviceInfo.handle()); if (p) p->setFormat(format); return p; } #endif #endif #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast(audioLoader()->instance(deviceInfo.realm())); if (plugin) { QAbstractAudioOutput* p = plugin->createOutput(deviceInfo.handle()); if (p) p->setFormat(format); return p; } #endif return new QNullOutputDevice(); } QT_END_NAMESPACE qaudiodevicefactory_p.h000066400000000000000000000065241225012771600332730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIODEVICEFACTORY_P_H #define QAUDIODEVICEFACTORY_P_H #include #include #include #include #include "qaudiodeviceinfo.h" QT_BEGIN_NAMESPACE class QAbstractAudioInput; class QAbstractAudioOutput; class QAbstractAudioDeviceInfo; class QAudioDeviceFactory { public: static QList availableDevices(QAudio::Mode mode); static QAudioDeviceInfo defaultInputDevice(); static QAudioDeviceInfo defaultOutputDevice(); static QAbstractAudioDeviceInfo* audioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode); static QAbstractAudioInput* createDefaultInputDevice(QAudioFormat const &format); static QAbstractAudioOutput* createDefaultOutputDevice(QAudioFormat const &format); static QAbstractAudioInput* createInputDevice(QAudioDeviceInfo const &device, QAudioFormat const &format); static QAbstractAudioOutput* createOutputDevice(QAudioDeviceInfo const &device, QAudioFormat const &format); static QAbstractAudioInput* createNullInput(); static QAbstractAudioOutput* createNullOutput(); }; QT_END_NAMESPACE #endif // QAUDIODEVICEFACTORY_P_H qaudiodeviceinfo.cpp000066400000000000000000000351721225012771600325740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiodevicefactory_p.h" #include "qaudiosystem.h" #include "qaudiodeviceinfo.h" #include QT_BEGIN_NAMESPACE namespace { class QAudioInfoPrivateRegisterMetaTypes { public: QAudioInfoPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } class QAudioDeviceInfoPrivate : public QSharedData { public: QAudioDeviceInfoPrivate() : mode(QAudio::AudioOutput) , info(0) { } QAudioDeviceInfoPrivate(const QString &r, const QByteArray &h, QAudio::Mode m): realm(r), handle(h), mode(m) { if (!handle.isEmpty()) info = QAudioDeviceFactory::audioDeviceInfo(realm, handle, mode); else info = NULL; } QAudioDeviceInfoPrivate(const QAudioDeviceInfoPrivate &other): QSharedData(other), realm(other.realm), handle(other.handle), mode(other.mode) { info = QAudioDeviceFactory::audioDeviceInfo(realm, handle, mode); } QAudioDeviceInfoPrivate& operator=(const QAudioDeviceInfoPrivate &other) { delete info; realm = other.realm; handle = other.handle; mode = other.mode; info = QAudioDeviceFactory::audioDeviceInfo(realm, handle, mode); return *this; } ~QAudioDeviceInfoPrivate() { delete info; } QString realm; QByteArray handle; QAudio::Mode mode; QAbstractAudioDeviceInfo* info; }; /*! \class QAudioDeviceInfo \brief The QAudioDeviceInfo class provides an interface to query audio devices and their functionality. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio QAudioDeviceInfo lets you query for audio devices--such as sound cards and USB headsets--that are currently available on the system. The audio devices available are dependent on the platform or audio plugins installed. A QAudioDeviceInfo is used by Qt to construct classes that communicate with the device--such as QAudioInput, and QAudioOutput. You can also query each device for the formats it supports. A format in this context is a set consisting of a specific byte order, channel, codec, frequency, sample rate, and sample type. A format is represented by the QAudioFormat class. The values supported by the the device for each of these parameters can be fetched with supportedByteOrders(), supportedChannelCounts(), supportedCodecs(), supportedSampleRates(), supportedSampleSizes(), and supportedSampleTypes(). The combinations supported are dependent on the platform, audio plugins installed and the audio device capabilities. If you need a specific format, you can check if the device supports it with isFormatSupported(), or fetch a supported format that is as close as possible to the format with nearestFormat(). For instance: \snippet multimedia-snippets/audio.cpp Setting audio format The static functions defaultInputDevice(), defaultOutputDevice(), and availableDevices() let you get a list of all available devices. Devices are fetched according to the value of mode this is specified by the \l {QAudio}::Mode enum. The QAudioDeviceInfo returned are only valid for the \l {QAudio}::Mode. For instance: \snippet multimedia-snippets/audio.cpp Dumping audio formats In this code sample, we loop through all devices that are able to output sound, i.e., play an audio stream in a supported format. For each device we find, we simply print the deviceName(). \sa QAudioOutput, QAudioInput */ /*! Constructs an empty QAudioDeviceInfo object. */ QAudioDeviceInfo::QAudioDeviceInfo(): d(new QAudioDeviceInfoPrivate) { } /*! Constructs a copy of \a other. */ QAudioDeviceInfo::QAudioDeviceInfo(const QAudioDeviceInfo& other): d(other.d) { } /*! Destroy this audio device info. */ QAudioDeviceInfo::~QAudioDeviceInfo() { } /*! Sets the QAudioDeviceInfo object to be equal to \a other. */ QAudioDeviceInfo& QAudioDeviceInfo::operator=(const QAudioDeviceInfo &other) { d = other.d; return *this; } /*! Returns true if this QAudioDeviceInfo class represents the same audio device as \a other. */ bool QAudioDeviceInfo::operator ==(const QAudioDeviceInfo &other) const { if (d == other.d) return true; if (d->realm == other.d->realm && d->mode == other.d->mode && d->handle == other.d->handle && deviceName() == other.deviceName()) return true; return false; } /*! Returns true if this QAudioDeviceInfo class represents a different audio device than \a other */ bool QAudioDeviceInfo::operator !=(const QAudioDeviceInfo &other) const { return !operator==(other); } /*! Returns whether this QAudioDeviceInfo object holds a valid device definition. */ bool QAudioDeviceInfo::isNull() const { return d->info == 0; } /*! Returns the human readable name of the audio device. Device names vary depending on the platform/audio plugin being used. They are a unique string identifier for the audio device. eg. default, Intel, U0x46d0x9a4 */ QString QAudioDeviceInfo::deviceName() const { return isNull() ? QString() : d->info->deviceName(); } /*! Returns true if the supplied \a settings are supported by the audio device described by this QAudioDeviceInfo. */ bool QAudioDeviceInfo::isFormatSupported(const QAudioFormat &settings) const { return isNull() ? false : d->info->isFormatSupported(settings); } /*! Returns the default audio format settings for this device. These settings are provided by the platform/audio plugin being used. They are also dependent on the \l {QAudio}::Mode being used. A typical audio system would provide something like: \list \li Input settings: 8000Hz mono 8 bit. \li Output settings: 44100Hz stereo 16 bit little endian. \endlist */ QAudioFormat QAudioDeviceInfo::preferredFormat() const { return isNull() ? QAudioFormat() : d->info->preferredFormat(); } /*! Returns the closest QAudioFormat to the supplied \a settings that the system supports. These settings are provided by the platform/audio plugin being used. They are also dependent on the \l {QAudio}::Mode being used. */ QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const { if (isFormatSupported(settings)) return settings; QAudioFormat nearest = settings; QList testCodecs = supportedCodecs(); QList testChannels = supportedChannelCounts(); QList testByteOrders = supportedByteOrders(); QList testSampleTypes; QList sampleTypesAvailable = supportedSampleTypes(); QMap testSampleRates; QList sampleRatesAvailable = supportedSampleRates(); QMap testSampleSizes; QList sampleSizesAvailable = supportedSampleSizes(); // Get sorted lists for checking if (testCodecs.contains(settings.codec())) { testCodecs.removeAll(settings.codec()); testCodecs.insert(0, settings.codec()); } testChannels.removeAll(settings.channelCount()); testChannels.insert(0, settings.channelCount()); testByteOrders.removeAll(settings.byteOrder()); testByteOrders.insert(0, settings.byteOrder()); if (sampleTypesAvailable.contains(settings.sampleType())) testSampleTypes.append(settings.sampleType()); if (sampleTypesAvailable.contains(QAudioFormat::SignedInt)) testSampleTypes.append(QAudioFormat::SignedInt); if (sampleTypesAvailable.contains(QAudioFormat::UnSignedInt)) testSampleTypes.append(QAudioFormat::UnSignedInt); if (sampleTypesAvailable.contains(QAudioFormat::Float)) testSampleTypes.append(QAudioFormat::Float); if (sampleSizesAvailable.contains(settings.sampleSize())) testSampleSizes.insert(0,settings.sampleSize()); sampleSizesAvailable.removeAll(settings.sampleSize()); foreach (int size, sampleSizesAvailable) { int larger = (size > settings.sampleSize()) ? size : settings.sampleSize(); int smaller = (size > settings.sampleSize()) ? settings.sampleSize() : size; bool isMultiple = ( 0 == (larger % smaller)); int diff = larger - smaller; testSampleSizes.insert((isMultiple ? diff : diff+100000), size); } if (sampleRatesAvailable.contains(settings.sampleRate())) testSampleRates.insert(0,settings.sampleRate()); sampleRatesAvailable.removeAll(settings.sampleRate()); foreach (int sampleRate, sampleRatesAvailable) { int larger = (sampleRate > settings.sampleRate()) ? sampleRate : settings.sampleRate(); int smaller = (sampleRate > settings.sampleRate()) ? settings.sampleRate() : sampleRate; bool isMultiple = ( 0 == (larger % smaller)); int diff = larger - smaller; testSampleRates.insert((isMultiple ? diff : diff+100000), sampleRate); } // Try to find nearest foreach (QString codec, testCodecs) { nearest.setCodec(codec); foreach (QAudioFormat::Endian order, testByteOrders) { nearest.setByteOrder(order); foreach (QAudioFormat::SampleType sample, testSampleTypes) { nearest.setSampleType(sample); QMapIterator sz(testSampleSizes); while (sz.hasNext()) { sz.next(); nearest.setSampleSize(sz.value()); foreach (int channel, testChannels) { nearest.setChannelCount(channel); QMapIterator i(testSampleRates); while (i.hasNext()) { i.next(); nearest.setSampleRate(i.value()); if (isFormatSupported(nearest)) return nearest; } } } } } } //Fallback return preferredFormat(); } /*! Returns a list of supported codecs. All platform and plugin implementations should provide support for: "audio/pcm" - Linear PCM For writing plugins to support additional codecs refer to: http://www.iana.org/assignments/media-types/audio/ */ QStringList QAudioDeviceInfo::supportedCodecs() const { return isNull() ? QStringList() : d->info->supportedCodecs(); } /*! Returns a list of supported sample rates (in Hertz). */ QList QAudioDeviceInfo::supportedSampleRates() const { return isNull() ? QList() : d->info->supportedSampleRates(); } /*! Returns a list of supported channel counts. This is typically 1 for mono sound, or 2 for stereo sound. */ QList QAudioDeviceInfo::supportedChannelCounts() const { return isNull() ? QList() : d->info->supportedChannelCounts(); } /*! Returns a list of supported sample sizes (in bits). Typically this will include 8 and 16 bit sample sizes. */ QList QAudioDeviceInfo::supportedSampleSizes() const { return isNull() ? QList() : d->info->supportedSampleSizes(); } /*! Returns a list of supported byte orders. */ QList QAudioDeviceInfo::supportedByteOrders() const { return isNull() ? QList() : d->info->supportedByteOrders(); } /*! Returns a list of supported sample types. */ QList QAudioDeviceInfo::supportedSampleTypes() const { return isNull() ? QList() : d->info->supportedSampleTypes(); } /*! Returns the information for the default input audio device. All platform and audio plugin implementations provide a default audio device to use. */ QAudioDeviceInfo QAudioDeviceInfo::defaultInputDevice() { return QAudioDeviceFactory::defaultInputDevice(); } /*! Returns the information for the default output audio device. All platform and audio plugin implementations provide a default audio device to use. */ QAudioDeviceInfo QAudioDeviceInfo::defaultOutputDevice() { return QAudioDeviceFactory::defaultOutputDevice(); } /*! Returns a list of audio devices that support \a mode. */ QList QAudioDeviceInfo::availableDevices(QAudio::Mode mode) { return QAudioDeviceFactory::availableDevices(mode); } /*! \internal */ QAudioDeviceInfo::QAudioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode): d(new QAudioDeviceInfoPrivate(realm, handle, mode)) { } /*! \internal */ QString QAudioDeviceInfo::realm() const { return d->realm; } /*! \internal */ QByteArray QAudioDeviceInfo::handle() const { return d->handle; } /*! \internal */ QAudio::Mode QAudioDeviceInfo::mode() const { return d->mode; } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiodeviceinfo.h000066400000000000000000000073311225012771600323140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIODEVICEINFO_H #define QAUDIODEVICEINFO_H #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QAudioDeviceFactory; class QAudioDeviceInfoPrivate; class Q_MULTIMEDIA_EXPORT QAudioDeviceInfo { friend class QAudioDeviceFactory; public: QAudioDeviceInfo(); QAudioDeviceInfo(const QAudioDeviceInfo& other); ~QAudioDeviceInfo(); QAudioDeviceInfo& operator=(const QAudioDeviceInfo& other); bool operator==(const QAudioDeviceInfo &other) const; bool operator!=(const QAudioDeviceInfo &other) const; bool isNull() const; QString deviceName() const; bool isFormatSupported(const QAudioFormat &format) const; QAudioFormat preferredFormat() const; QAudioFormat nearestFormat(const QAudioFormat &format) const; QStringList supportedCodecs() const; QList supportedSampleRates() const; QList supportedChannelCounts() const; QList supportedSampleSizes() const; QList supportedByteOrders() const; QList supportedSampleTypes() const; static QAudioDeviceInfo defaultInputDevice(); static QAudioDeviceInfo defaultOutputDevice(); static QList availableDevices(QAudio::Mode mode); private: QAudioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode); QString realm() const; QByteArray handle() const; QAudio::Mode mode() const; QSharedDataPointer d; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioDeviceInfo) #endif // QAUDIODEVICEINFO_H qaudiodeviceinfo_alsa_p.cpp000066400000000000000000000433041225012771600341070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include "qaudiodeviceinfo_alsa_p.h" #include QT_BEGIN_NAMESPACE QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray dev, QAudio::Mode mode) { handle = 0; device = QLatin1String(dev); this->mode = mode; checkSurround(); } QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal() { close(); } bool QAudioDeviceInfoInternal::isFormatSupported(const QAudioFormat& format) const { return testSettings(format); } QAudioFormat QAudioDeviceInfoInternal::preferredFormat() const { QAudioFormat nearest; if(mode == QAudio::AudioOutput) { nearest.setSampleRate(44100); nearest.setChannelCount(2); nearest.setByteOrder(QAudioFormat::LittleEndian); nearest.setSampleType(QAudioFormat::SignedInt); nearest.setSampleSize(16); nearest.setCodec(QLatin1String("audio/pcm")); } else { nearest.setSampleRate(8000); nearest.setChannelCount(1); nearest.setSampleType(QAudioFormat::UnSignedInt); nearest.setSampleSize(8); nearest.setCodec(QLatin1String("audio/pcm")); if(!testSettings(nearest)) { nearest.setChannelCount(2); nearest.setSampleSize(16); nearest.setSampleType(QAudioFormat::SignedInt); } } return nearest; } QString QAudioDeviceInfoInternal::deviceName() const { return device; } QStringList QAudioDeviceInfoInternal::supportedCodecs() { updateLists(); return codecz; } QList QAudioDeviceInfoInternal::supportedSampleRates() { updateLists(); return sampleRatez; } QList QAudioDeviceInfoInternal::supportedChannelCounts() { updateLists(); return channelz; } QList QAudioDeviceInfoInternal::supportedSampleSizes() { updateLists(); return sizez; } QList QAudioDeviceInfoInternal::supportedByteOrders() { updateLists(); return byteOrderz; } QList QAudioDeviceInfoInternal::supportedSampleTypes() { updateLists(); return typez; } bool QAudioDeviceInfoInternal::open() { int err = 0; QString dev = device; QList devices = availableDevices(mode); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) if (devices.size() > 0) dev = QLatin1String(devices.first().constData()); else return false; #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; #else int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(dev.contains(QLatin1String(name))) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } if(mode == QAudio::AudioOutput) { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); } else { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); } if(err < 0) { handle = 0; return false; } return true; } void QAudioDeviceInfoInternal::close() { if(handle) snd_pcm_close(handle); handle = 0; } bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). int err = 0; snd_pcm_t* handle; snd_pcm_hw_params_t *params; QString dev = device; QList devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioOutput); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = QLatin1String(devices.first().constData()); #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; #else int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(shortName.compare(QLatin1String(name)) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } if(mode == QAudio::AudioOutput) { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); } else { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); } if(err < 0) { handle = 0; return false; } bool testChannel = false; bool testCodec = false; bool testSampleRate = false; bool testType = false; bool testSize = false; int dir = 0; snd_pcm_nonblock( handle, 0 ); snd_pcm_hw_params_alloca( ¶ms ); snd_pcm_hw_params_any( handle, params ); // set the values! snd_pcm_hw_params_set_channels(handle,params,format.channelCount()); snd_pcm_hw_params_set_rate(handle,params,format.sampleRate(),dir); err = -1; switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } else if (format.sampleType() == QAudioFormat::Float) { if (format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_LE); else if (format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_BE); } } // For now, just accept only audio/pcm codec if(!format.codec().startsWith(QLatin1String("audio/pcm"))) { err=-1; } else testCodec = true; if (err>=0 && format.channelCount() != -1) { err = snd_pcm_hw_params_test_channels(handle,params,format.channelCount()); if(err>=0) err = snd_pcm_hw_params_set_channels(handle,params,format.channelCount()); if(err>=0) testChannel = true; } if (err>=0 && format.sampleRate() != -1) { err = snd_pcm_hw_params_test_rate(handle,params,format.sampleRate(),0); if(err>=0) err = snd_pcm_hw_params_set_rate(handle,params,format.sampleRate(),dir); if(err>=0) testSampleRate = true; } if((err>=0 && format.sampleSize() != -1) && (format.sampleType() != QAudioFormat::Unknown)) { switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } else if (format.sampleType() == QAudioFormat::Float) { if (format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_LE); else if (format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_BE); } } if(err>=0) { testSize = true; testType = true; } } if(err>=0) err = snd_pcm_hw_params(handle, params); if(err == 0) { // settings work // close() if(handle) snd_pcm_close(handle); return true; } if(handle) snd_pcm_close(handle); return false; } void QAudioDeviceInfoInternal::updateLists() { // redo all lists based on current settings sampleRatez.clear(); channelz.clear(); sizez.clear(); byteOrderz.clear(); typez.clear(); codecz.clear(); if(!handle) open(); if(!handle) return; for(int i=0; i<(int)MAX_SAMPLE_RATES; i++) { //if(snd_pcm_hw_params_test_rate(handle, params, SAMPLE_RATES[i], dir) == 0) sampleRatez.append(SAMPLE_RATES[i]); } channelz.append(1); channelz.append(2); if (surround40) channelz.append(4); if (surround51) channelz.append(6); if (surround71) channelz.append(8); sizez.append(8); sizez.append(16); sizez.append(32); byteOrderz.append(QAudioFormat::LittleEndian); byteOrderz.append(QAudioFormat::BigEndian); typez.append(QAudioFormat::SignedInt); typez.append(QAudioFormat::UnSignedInt); typez.append(QAudioFormat::Float); codecz.append(QLatin1String("audio/pcm")); close(); } QList QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) { QList devices; QByteArray filter; #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) // Create a list of all current audio devices that support mode void **hints, **n; char *name, *descr, *io; if(snd_device_name_hint(-1, "pcm", &hints) < 0) { qWarning() << "no alsa devices available"; return devices; } n = hints; if(mode == QAudio::AudioInput) { filter = "Input"; } else { filter = "Output"; } while (*n != NULL) { name = snd_device_name_get_hint(*n, "NAME"); if (name != 0 && qstrcmp(name, "null") != 0) { descr = snd_device_name_get_hint(*n, "DESC"); io = snd_device_name_get_hint(*n, "IOID"); if ((descr != NULL) && ((io == NULL) || (io == filter))) { QString deviceName = QLatin1String(name); QString deviceDescription = QLatin1String(descr); if (deviceDescription.contains(QLatin1String("Default Audio Device"))) devices.prepend(deviceName.toLocal8Bit().constData()); else devices.append(deviceName.toLocal8Bit().constData()); } free(name); if (descr != NULL) free(descr); if (io != NULL) free(io); } ++n; } snd_device_name_free_hint(hints); #else int idx = 0; char* name; while(snd_card_get_name(idx,&name) == 0) { devices.append(name); idx++; } #endif if (devices.size() > 0) devices.append("default"); return devices; } QByteArray QAudioDeviceInfoInternal::defaultInputDevice() { QList devices = availableDevices(QAudio::AudioInput); if(devices.size() == 0) return QByteArray(); return devices.first(); } QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() { QList devices = availableDevices(QAudio::AudioOutput); if(devices.size() == 0) return QByteArray(); return devices.first(); } void QAudioDeviceInfoInternal::checkSurround() { surround40 = false; surround51 = false; surround71 = false; void **hints, **n; char *name, *descr, *io; if(snd_device_name_hint(-1, "pcm", &hints) < 0) return; n = hints; while (*n != NULL) { name = snd_device_name_get_hint(*n, "NAME"); descr = snd_device_name_get_hint(*n, "DESC"); io = snd_device_name_get_hint(*n, "IOID"); if((name != NULL) && (descr != NULL)) { QString deviceName = QLatin1String(name); if (mode == QAudio::AudioOutput) { if(deviceName.contains(QLatin1String("surround40"))) surround40 = true; if(deviceName.contains(QLatin1String("surround51"))) surround51 = true; if(deviceName.contains(QLatin1String("surround71"))) surround71 = true; } } if(name != NULL) free(name); if(descr != NULL) free(descr); if(io != NULL) free(io); ++n; } snd_device_name_free_hint(hints); } QT_END_NAMESPACE qaudiodeviceinfo_alsa_p.h000066400000000000000000000075271225012771600335630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIODEVICEINFOALSA_H #define QAUDIODEVICEINFOALSA_H #include #include #include #include #include #include "qaudio.h" #include "qaudiodeviceinfo.h" #include "qaudiosystem.h" QT_BEGIN_NAMESPACE const unsigned int MAX_SAMPLE_RATES = 5; const unsigned int SAMPLE_RATES[] = { 8000, 11025, 22050, 44100, 48000 }; class QAudioDeviceInfoInternal : public QAbstractAudioDeviceInfo { Q_OBJECT public: QAudioDeviceInfoInternal(QByteArray dev,QAudio::Mode mode); ~QAudioDeviceInfoInternal(); bool testSettings(const QAudioFormat& format) const; void updateLists(); QAudioFormat preferredFormat() const; bool isFormatSupported(const QAudioFormat& format) const; QString deviceName() const; QStringList supportedCodecs(); QList supportedSampleRates(); QList supportedChannelCounts(); QList supportedSampleSizes(); QList supportedByteOrders(); QList supportedSampleTypes(); static QByteArray defaultInputDevice(); static QByteArray defaultOutputDevice(); static QList availableDevices(QAudio::Mode); private: bool open(); void close(); void checkSurround(); bool surround40; bool surround51; bool surround71; QString device; QAudio::Mode mode; QAudioFormat nearest; QList sampleRatez; QList channelz; QList sizez; QList byteOrderz; QStringList codecz; QList typez; snd_pcm_t* handle; snd_pcm_hw_params_t *params; }; QT_END_NAMESPACE #endif qaudiodeviceinfo_mac_p.cpp000066400000000000000000000264311225012771600337310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include #include #include #include #include #include "qaudio_mac_p.h" #include "qaudiodeviceinfo_mac_p.h" QT_BEGIN_NAMESPACE // XXX: remove at some future date static inline QString cfStringToQString(CFStringRef str) { CFIndex length = CFStringGetLength(str); const UniChar *chars = CFStringGetCharactersPtr(str); if (chars) return QString(reinterpret_cast(chars), length); UniChar buffer[length]; CFStringGetCharacters(str, CFRangeMake(0, length), buffer); return QString(reinterpret_cast(buffer), length); } QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray const& handle, QAudio::Mode) { QDataStream ds(handle); quint32 did, tm; ds >> did >> tm >> name; deviceId = AudioDeviceID(did); mode = QAudio::Mode(tm); } bool QAudioDeviceInfoInternal::isFormatSupported(const QAudioFormat& format) const { QAudioDeviceInfoInternal *self = const_cast(this); return format.isValid() && format.codec() == QString::fromLatin1("audio/pcm") && self->supportedSampleRates().contains(format.sampleRate()) && self->supportedChannelCounts().contains(format.channelCount()) && self->supportedSampleSizes().contains(format.sampleSize()); } QAudioFormat QAudioDeviceInfoInternal::preferredFormat() const { QAudioFormat rc; UInt32 propSize = 0; if (AudioDeviceGetPropertyInfo(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyStreams, &propSize, 0) == noErr) { const int sc = propSize / sizeof(AudioStreamID); if (sc > 0) { AudioStreamID* streams = new AudioStreamID[sc]; if (AudioDeviceGetProperty(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyStreams, &propSize, streams) == noErr) { for (int i = 0; i < sc; ++i) { if (AudioStreamGetPropertyInfo(streams[i], 0, kAudioStreamPropertyPhysicalFormat, &propSize, 0) == noErr) { AudioStreamBasicDescription sf; if (AudioStreamGetProperty(streams[i], 0, kAudioStreamPropertyPhysicalFormat, &propSize, &sf) == noErr) { rc = toQAudioFormat(sf); break; } } } } delete streams; } } return rc; } QString QAudioDeviceInfoInternal::deviceName() const { return name; } QStringList QAudioDeviceInfoInternal::supportedCodecs() { return QStringList() << QString::fromLatin1("audio/pcm"); } QList QAudioDeviceInfoInternal::supportedSampleRates() { QSet rc; // Add some common frequencies rc << 8000 << 11025 << 22050 << 44100; // UInt32 propSize = 0; if (AudioDeviceGetPropertyInfo(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyAvailableNominalSampleRates, &propSize, 0) == noErr) { const int pc = propSize / sizeof(AudioValueRange); if (pc > 0) { AudioValueRange* vr = new AudioValueRange[pc]; if (AudioDeviceGetProperty(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyAvailableNominalSampleRates, &propSize, vr) == noErr) { for (int i = 0; i < pc; ++i) rc << vr[i].mMaximum; } delete vr; } } return rc.toList(); } QList QAudioDeviceInfoInternal::supportedChannelCounts() { QList rc; // Can mix down to 1 channel rc << 1; UInt32 propSize = 0; int channels = 0; if (AudioDeviceGetPropertyInfo(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyStreamConfiguration, &propSize, 0) == noErr) { AudioBufferList* audioBufferList = static_cast(malloc(propSize)); if (audioBufferList != 0) { if (AudioDeviceGetProperty(deviceId, 0, mode == QAudio::AudioInput, kAudioDevicePropertyStreamConfiguration, &propSize, audioBufferList) == noErr) { for (int i = 0; i < int(audioBufferList->mNumberBuffers); ++i) { channels += audioBufferList->mBuffers[i].mNumberChannels; rc << channels; } } free(audioBufferList); } } return rc; } QList QAudioDeviceInfoInternal::supportedSampleSizes() { return QList() << 8 << 16 << 24 << 32 << 64; } QList QAudioDeviceInfoInternal::supportedByteOrders() { return QList() << QAudioFormat::LittleEndian << QAudioFormat::BigEndian; } QList QAudioDeviceInfoInternal::supportedSampleTypes() { return QList() << QAudioFormat::SignedInt << QAudioFormat::UnSignedInt << QAudioFormat::Float; } static QByteArray get_device_info(AudioDeviceID audioDevice, QAudio::Mode mode) { UInt32 size; QByteArray device; QDataStream ds(&device, QIODevice::WriteOnly); AudioStreamBasicDescription sf; CFStringRef name; Boolean isInput = mode == QAudio::AudioInput; // Id ds << quint32(audioDevice); // Mode size = sizeof(AudioStreamBasicDescription); if (AudioDeviceGetProperty(audioDevice, 0, isInput, kAudioDevicePropertyStreamFormat, &size, &sf) != noErr) { return QByteArray(); } ds << quint32(mode); // Name size = sizeof(CFStringRef); if (AudioDeviceGetProperty(audioDevice, 0, isInput, kAudioObjectPropertyName, &size, &name) != noErr) { qWarning() << "QAudioDeviceInfo: Unable to find device name"; return QByteArray(); } ds << cfStringToQString(name); CFRelease(name); return device; } QByteArray QAudioDeviceInfoInternal::defaultInputDevice() { AudioDeviceID audioDevice; UInt32 size = sizeof(audioDevice); if (AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &size, &audioDevice) != noErr) { qWarning() << "QAudioDeviceInfo: Unable to find default input device"; return QByteArray(); } return get_device_info(audioDevice, QAudio::AudioInput); } QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() { AudioDeviceID audioDevice; UInt32 size = sizeof(audioDevice); if (AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &audioDevice) != noErr) { qWarning() << "QAudioDeviceInfo: Unable to find default output device"; return QByteArray(); } return get_device_info(audioDevice, QAudio::AudioOutput); } QList QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) { QList devices; UInt32 propSize = 0; if (AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &propSize, 0) == noErr) { const int dc = propSize / sizeof(AudioDeviceID); if (dc > 0) { AudioDeviceID* audioDevices = new AudioDeviceID[dc]; if (AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &propSize, audioDevices) == noErr) { for (int i = 0; i < dc; ++i) { QByteArray info = get_device_info(audioDevices[i], mode); if (!info.isNull()) devices << info; } } delete audioDevices; } } return devices; } QT_END_NAMESPACE qaudiodeviceinfo_mac_p.h000066400000000000000000000061651225012771600334000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QDEVICEINFO_MAC_P_H #define QDEVICEINFO_MAC_P_H #include #include QT_BEGIN_NAMESPACE class QAudioDeviceInfoInternal : public QAbstractAudioDeviceInfo { public: AudioDeviceID deviceId; QString name; QAudio::Mode mode; QAudioDeviceInfoInternal(QByteArray const& handle, QAudio::Mode mode); bool isFormatSupported(const QAudioFormat& format) const; QAudioFormat preferredFormat() const; QString deviceName() const; QStringList supportedCodecs(); QList supportedSampleRates(); QList supportedChannelCounts(); QList supportedSampleSizes(); QList supportedByteOrders(); QList supportedSampleTypes(); static QByteArray defaultInputDevice(); static QByteArray defaultOutputDevice(); static QList availableDevices(QAudio::Mode mode); }; QT_END_NAMESPACE #endif // QDEVICEINFO_MAC_P_H qaudiodeviceinfo_win32_p.cpp000066400000000000000000000341041225012771600341270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include #include "qaudiodeviceinfo_win32_p.h" #if defined(Q_CC_MINGW) && !defined(__MINGW64_VERSION_MAJOR) struct IBaseFilter; // Needed for strmif.h from stock MinGW. struct _DDPIXELFORMAT; typedef struct _DDPIXELFORMAT* LPDDPIXELFORMAT; #endif #include #if !defined(Q_CC_MINGW) || defined(__MINGW64_VERSION_MAJOR) # include #else extern GUID CLSID_AudioInputDeviceCategory; extern GUID CLSID_AudioRendererCategory; extern GUID IID_ICreateDevEnum; extern GUID CLSID_SystemDeviceEnum; #ifndef __ICreateDevEnum_INTERFACE_DEFINED__ #define __ICreateDevEnum_INTERFACE_DEFINED__ DECLARE_INTERFACE_(ICreateDevEnum, IUnknown) { STDMETHOD(CreateClassEnumerator)(REFCLSID clsidDeviceClass, IEnumMoniker **ppEnumMoniker, DWORD dwFlags) PURE; }; #endif // __ICreateDevEnum_INTERFACE_DEFINED__ #ifndef __IErrorLog_INTERFACE_DEFINED__ #define __IErrorLog_INTERFACE_DEFINED__ DECLARE_INTERFACE_(IErrorLog, IUnknown) { STDMETHOD(AddError)(THIS_ LPCOLESTR, EXCEPINFO *) PURE; }; #endif /* __IErrorLog_INTERFACE_DEFINED__ */ #ifndef __IPropertyBag_INTERFACE_DEFINED__ #define __IPropertyBag_INTERFACE_DEFINED__ const GUID IID_IPropertyBag = {0x55272A00, 0x42CB, 0x11CE, {0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51}}; DECLARE_INTERFACE_(IPropertyBag, IUnknown) { STDMETHOD(Read)(THIS_ LPCOLESTR, VARIANT *, IErrorLog *) PURE; STDMETHOD(Write)(THIS_ LPCOLESTR, VARIANT *) PURE; }; #endif /* __IPropertyBag_INTERFACE_DEFINED__ */ #endif // defined(Q_CC_MINGW) && !defined(__MINGW64_VERSION_MAJOR) QT_BEGIN_NAMESPACE // For mingw toolchain mmsystem.h only defines half the defines, so add if needed. #ifndef WAVE_FORMAT_44M08 #define WAVE_FORMAT_44M08 0x00000100 #define WAVE_FORMAT_44S08 0x00000200 #define WAVE_FORMAT_44M16 0x00000400 #define WAVE_FORMAT_44S16 0x00000800 #define WAVE_FORMAT_48M08 0x00001000 #define WAVE_FORMAT_48S08 0x00002000 #define WAVE_FORMAT_48M16 0x00004000 #define WAVE_FORMAT_48S16 0x00008000 #define WAVE_FORMAT_96M08 0x00010000 #define WAVE_FORMAT_96S08 0x00020000 #define WAVE_FORMAT_96M16 0x00040000 #define WAVE_FORMAT_96S16 0x00080000 #endif QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray dev, QAudio::Mode mode) { QDataStream ds(&dev, QIODevice::ReadOnly); ds >> devId >> device; this->mode = mode; updateLists(); } QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal() { close(); } bool QAudioDeviceInfoInternal::isFormatSupported(const QAudioFormat& format) const { return testSettings(format); } QAudioFormat QAudioDeviceInfoInternal::preferredFormat() const { QAudioFormat nearest; if (mode == QAudio::AudioOutput) { nearest.setSampleRate(44100); nearest.setChannelCount(2); nearest.setByteOrder(QAudioFormat::LittleEndian); nearest.setSampleType(QAudioFormat::SignedInt); nearest.setSampleSize(16); nearest.setCodec(QLatin1String("audio/pcm")); } else { nearest.setSampleRate(11025); nearest.setChannelCount(1); nearest.setByteOrder(QAudioFormat::LittleEndian); nearest.setSampleType(QAudioFormat::SignedInt); nearest.setSampleSize(8); nearest.setCodec(QLatin1String("audio/pcm")); } return nearest; } QString QAudioDeviceInfoInternal::deviceName() const { return device; } QStringList QAudioDeviceInfoInternal::supportedCodecs() { updateLists(); return codecz; } QList QAudioDeviceInfoInternal::supportedSampleRates() { updateLists(); return sampleRatez; } QList QAudioDeviceInfoInternal::supportedChannelCounts() { updateLists(); return channelz; } QList QAudioDeviceInfoInternal::supportedSampleSizes() { updateLists(); return sizez; } QList QAudioDeviceInfoInternal::supportedByteOrders() { updateLists(); return byteOrderz; } QList QAudioDeviceInfoInternal::supportedSampleTypes() { updateLists(); return typez; } bool QAudioDeviceInfoInternal::open() { return true; } void QAudioDeviceInfoInternal::close() { } bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). bool failed = false; bool match = false; // check codec for( int i = 0; i < codecz.count(); i++) { if (format.codec() == codecz.at(i)) match = true; } if (!match) failed = true; // check channel match = false; if (!failed) { for (int i = 0; i < channelz.count(); i++) { if (format.channelCount() == channelz.at(i)) { match = true; break; } } if (!match) failed = true; } // check sampleRate match = false; if (!failed) { for (int i = 0; i < sampleRatez.count(); i++) { if (format.sampleRate() == sampleRatez.at(i)) { match = true; break; } } if (!match) failed = true; } // check sample size match = false; if (!failed) { for( int i = 0; i < sizez.count(); i++) { if (format.sampleSize() == sizez.at(i)) { match = true; break; } } if (!match) failed = true; } // check byte order match = false; if (!failed) { for( int i = 0; i < byteOrderz.count(); i++) { if (format.byteOrder() == byteOrderz.at(i)) { match = true; break; } } if (!match) failed = true; } // check sample type match = false; if (!failed) { for( int i = 0; i < typez.count(); i++) { if (format.sampleType() == typez.at(i)) { match = true; break; } } if (!match) failed = true; } if(!failed) { // settings work return true; } return false; } void QAudioDeviceInfoInternal::updateLists() { // redo all lists based on current settings bool match = false; DWORD fmt = 0; if(mode == QAudio::AudioOutput) { WAVEOUTCAPS woc; if (waveOutGetDevCaps(devId, &woc, sizeof(WAVEOUTCAPS)) == MMSYSERR_NOERROR) { match = true; fmt = woc.dwFormats; } } else { WAVEINCAPS woc; if (waveInGetDevCaps(devId, &woc, sizeof(WAVEINCAPS)) == MMSYSERR_NOERROR) { match = true; fmt = woc.dwFormats; } } sizez.clear(); sampleRatez.clear(); channelz.clear(); byteOrderz.clear(); typez.clear(); codecz.clear(); if(match) { if ((fmt & WAVE_FORMAT_1M08) || (fmt & WAVE_FORMAT_1S08) || (fmt & WAVE_FORMAT_2M08) || (fmt & WAVE_FORMAT_2S08) || (fmt & WAVE_FORMAT_4M08) || (fmt & WAVE_FORMAT_4S08) || (fmt & WAVE_FORMAT_48M08) || (fmt & WAVE_FORMAT_48S08) || (fmt & WAVE_FORMAT_96M08) || (fmt & WAVE_FORMAT_96S08) ) { sizez.append(8); } if ((fmt & WAVE_FORMAT_1M16) || (fmt & WAVE_FORMAT_1S16) || (fmt & WAVE_FORMAT_2M16) || (fmt & WAVE_FORMAT_2S16) || (fmt & WAVE_FORMAT_4M16) || (fmt & WAVE_FORMAT_4S16) || (fmt & WAVE_FORMAT_48M16) || (fmt & WAVE_FORMAT_48S16) || (fmt & WAVE_FORMAT_96M16) || (fmt & WAVE_FORMAT_96S16) ) { sizez.append(16); } if ((fmt & WAVE_FORMAT_1M08) || (fmt & WAVE_FORMAT_1S08) || (fmt & WAVE_FORMAT_1M16) || (fmt & WAVE_FORMAT_1S16)) { sampleRatez.append(11025); } if ((fmt & WAVE_FORMAT_2M08) || (fmt & WAVE_FORMAT_2S08) || (fmt & WAVE_FORMAT_2M16) || (fmt & WAVE_FORMAT_2S16)) { sampleRatez.append(22050); } if ((fmt & WAVE_FORMAT_4M08) || (fmt & WAVE_FORMAT_4S08) || (fmt & WAVE_FORMAT_4M16) || (fmt & WAVE_FORMAT_4S16)) { sampleRatez.append(44100); } if ((fmt & WAVE_FORMAT_48M08) || (fmt & WAVE_FORMAT_48S08) || (fmt & WAVE_FORMAT_48M16) || (fmt & WAVE_FORMAT_48S16)) { sampleRatez.append(48000); } if ((fmt & WAVE_FORMAT_96M08) || (fmt & WAVE_FORMAT_96S08) || (fmt & WAVE_FORMAT_96M16) || (fmt & WAVE_FORMAT_96S16)) { sampleRatez.append(96000); } channelz.append(1); channelz.append(2); if (mode == QAudio::AudioOutput) { channelz.append(4); channelz.append(6); channelz.append(8); } byteOrderz.append(QAudioFormat::LittleEndian); typez.append(QAudioFormat::SignedInt); typez.append(QAudioFormat::UnSignedInt); codecz.append(QLatin1String("audio/pcm")); } if (sampleRatez.count() > 0) sampleRatez.prepend(8000); } QList QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) { Q_UNUSED(mode) QList devices; //enumerate device fullnames through directshow api CoInitialize(NULL); ICreateDevEnum *pDevEnum = NULL; IEnumMoniker *pEnum = NULL; // Create the System device enumerator HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast(&pDevEnum)); unsigned long iNumDevs = mode == QAudio::AudioOutput ? waveOutGetNumDevs() : waveInGetNumDevs(); if (SUCCEEDED(hr)) { // Create the enumerator for the audio input/output category if (pDevEnum->CreateClassEnumerator( mode == QAudio::AudioOutput ? CLSID_AudioRendererCategory : CLSID_AudioInputDeviceCategory, &pEnum, 0) == S_OK) { pEnum->Reset(); // go through and find all audio devices IMoniker *pMoniker = NULL; while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag, reinterpret_cast(&pPropBag)); if (FAILED(hr)) { pMoniker->Release(); continue; // skip this one } // Find if it is a wave device VARIANT var; VariantInit(&var); hr = pPropBag->Read(mode == QAudio::AudioOutput ? L"WaveOutID" : L"WaveInID", &var, 0); if (SUCCEEDED(hr)) { LONG waveID = var.lVal; if (waveID >= 0 && waveID < LONG(iNumDevs)) { VariantClear(&var); // Find the description hr = pPropBag->Read(L"FriendlyName", &var, 0); if (SUCCEEDED(hr)) { QByteArray device; QDataStream ds(&device, QIODevice::WriteOnly); ds << quint32(waveID) << QString::fromWCharArray(var.bstrVal); devices.append(device); } } } pPropBag->Release(); pMoniker->Release(); } } } CoUninitialize(); return devices; } QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() { QList list = availableDevices(QAudio::AudioOutput); if (list.size() > 0) return list.at(0); else return QByteArray(); } QByteArray QAudioDeviceInfoInternal::defaultInputDevice() { QList list = availableDevices(QAudio::AudioInput); if (list.size() > 0) return list.at(0); else return QByteArray(); } QT_END_NAMESPACE qaudiodeviceinfo_win32_p.h000066400000000000000000000072421225012771600335770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIODEVICEINFOWIN_H #define QAUDIODEVICEINFOWIN_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE const unsigned int MAX_SAMPLE_RATES = 5; const unsigned int SAMPLE_RATES[] = { 8000, 11025, 22050, 44100, 48000 }; class QAudioDeviceInfoInternal : public QAbstractAudioDeviceInfo { Q_OBJECT public: QAudioDeviceInfoInternal(QByteArray dev,QAudio::Mode mode); ~QAudioDeviceInfoInternal(); bool open(); void close(); bool testSettings(const QAudioFormat& format) const; void updateLists(); QAudioFormat preferredFormat() const; bool isFormatSupported(const QAudioFormat& format) const; QString deviceName() const; QStringList supportedCodecs(); QList supportedSampleRates(); QList supportedChannelCounts(); QList supportedSampleSizes(); QList supportedByteOrders(); QList supportedSampleTypes(); static QByteArray defaultInputDevice(); static QByteArray defaultOutputDevice(); static QList availableDevices(QAudio::Mode); private: QAudio::Mode mode; QString device; quint32 devId; QAudioFormat nearest; QList sampleRatez; QList channelz; QList sizez; QList byteOrderz; QStringList codecz; QList typez; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioformat.cpp000066400000000000000000000327511225012771600320300ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include QT_BEGIN_NAMESPACE namespace { class QAudioFormatPrivateRegisterMetaTypes { public: QAudioFormatPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } class QAudioFormatPrivate : public QSharedData { public: QAudioFormatPrivate() { sampleRate = -1; channels = -1; sampleSize = -1; byteOrder = QAudioFormat::Endian(QSysInfo::ByteOrder); sampleType = QAudioFormat::Unknown; } QAudioFormatPrivate(const QAudioFormatPrivate &other): QSharedData(other), codec(other.codec), byteOrder(other.byteOrder), sampleType(other.sampleType), sampleRate(other.sampleRate), channels(other.channels), sampleSize(other.sampleSize) { } QAudioFormatPrivate& operator=(const QAudioFormatPrivate &other) { codec = other.codec; byteOrder = other.byteOrder; sampleType = other.sampleType; sampleRate = other.sampleRate; channels = other.channels; sampleSize = other.sampleSize; return *this; } QString codec; QAudioFormat::Endian byteOrder; QAudioFormat::SampleType sampleType; int sampleRate; int channels; int sampleSize; }; /*! \class QAudioFormat \brief The QAudioFormat class stores audio stream parameter information. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio An audio format specifies how data in an audio stream is arranged, i.e, how the stream is to be interpreted. The encoding itself is specified by the codec() used for the stream. In addition to the encoding, QAudioFormat contains other parameters that further specify how the audio sample data is arranged. These are the frequency, the number of channels, the sample size, the sample type, and the byte order. The following table describes these in more detail. \table \header \li Parameter \li Description \row \li Sample Rate \li Samples per second of audio data in Hertz. \row \li Number of channels \li The number of audio channels (typically one for mono or two for stereo) \row \li Sample size \li How much data is stored in each sample (typically 8 or 16 bits) \row \li Sample type \li Numerical representation of sample (typically signed integer, unsigned integer or float) \row \li Byte order \li Byte ordering of sample (typically little endian, big endian) \endtable This class is typically used in conjunction with QAudioInput or QAudioOutput to allow you to specify the parameters of the audio stream being read or written, or with QAudioBuffer when dealing with samples in memory. You can obtain audio formats compatible with the audio device used through functions in QAudioDeviceInfo. This class also lets you query available parameter values for a device, so that you can set the parameters yourself. See the \l QAudioDeviceInfo class description for details. You need to know the format of the audio streams you wish to play or record. In the common case of interleaved linear PCM data, the codec will be "audio/pcm", and the samples for all channels will be interleaved. One sample for each channel for the same instant in time is referred to as a frame in Qt Multimedia (and other places). */ /*! Construct a new audio format. Values are initialized as follows: \list \li sampleRate() = -1 \li channelCount() = -1 \li sampleSize() = -1 \li byteOrder() = QAudioFormat::Endian(QSysInfo::ByteOrder) \li sampleType() = QAudioFormat::Unknown \c codec() = "" \endlist */ QAudioFormat::QAudioFormat(): d(new QAudioFormatPrivate) { } /*! Construct a new audio format using \a other. */ QAudioFormat::QAudioFormat(const QAudioFormat &other): d(other.d) { } /*! Destroy this audio format. */ QAudioFormat::~QAudioFormat() { } /*! Assigns \a other to this QAudioFormat implementation. */ QAudioFormat& QAudioFormat::operator=(const QAudioFormat &other) { d = other.d; return *this; } /*! Returns true if this QAudioFormat is equal to the \a other QAudioFormat; otherwise returns false. All elements of QAudioFormat are used for the comparison. */ bool QAudioFormat::operator==(const QAudioFormat &other) const { return d->sampleRate == other.d->sampleRate && d->channels == other.d->channels && d->sampleSize == other.d->sampleSize && d->byteOrder == other.d->byteOrder && d->codec == other.d->codec && d->sampleType == other.d->sampleType; } /*! Returns true if this QAudioFormat is not equal to the \a other QAudioFormat; otherwise returns false. All elements of QAudioFormat are used for the comparison. */ bool QAudioFormat::operator!=(const QAudioFormat& other) const { return !(*this == other); } /*! Returns true if all of the parameters are valid. */ bool QAudioFormat::isValid() const { return d->sampleRate != -1 && d->channels != -1 && d->sampleSize != -1 && d->sampleType != QAudioFormat::Unknown && !d->codec.isEmpty(); } /*! Sets the sample rate to \a samplerate Hertz. */ void QAudioFormat::setSampleRate(int samplerate) { d->sampleRate = samplerate; } /*! Returns the current sample rate in Hertz. */ int QAudioFormat::sampleRate() const { return d->sampleRate; } /*! Sets the channel count to \a channels. */ void QAudioFormat::setChannelCount(int channels) { d->channels = channels; } /*! Returns the current channel count value. */ int QAudioFormat::channelCount() const { return d->channels; } /*! Sets the sample size to the \a sampleSize specified, in bits. This is typically 8 or 16, but some systems may support higher sample sizes. */ void QAudioFormat::setSampleSize(int sampleSize) { d->sampleSize = sampleSize; } /*! Returns the current sample size value, in bits. \sa bytesPerFrame() */ int QAudioFormat::sampleSize() const { return d->sampleSize; } /*! Sets the codec to \a codec. The parameter to this function should be one of the types reported by the QAudioDeviceInfo::supportedCodecs() function for the audio device you are working with. \sa QAudioDeviceInfo::supportedCodecs() */ void QAudioFormat::setCodec(const QString &codec) { d->codec = codec; } /*! Returns the current codec identifier. \sa QAudioDeviceInfo::supportedCodecs() */ QString QAudioFormat::codec() const { return d->codec; } /*! Sets the byteOrder to \a byteOrder. */ void QAudioFormat::setByteOrder(QAudioFormat::Endian byteOrder) { d->byteOrder = byteOrder; } /*! Returns the current byteOrder value. */ QAudioFormat::Endian QAudioFormat::byteOrder() const { return d->byteOrder; } /*! Sets the sampleType to \a sampleType. */ void QAudioFormat::setSampleType(QAudioFormat::SampleType sampleType) { d->sampleType = sampleType; } /*! Returns the current SampleType value. */ QAudioFormat::SampleType QAudioFormat::sampleType() const { return d->sampleType; } /*! Returns the number of bytes required for this audio format for \a duration microseconds. Returns 0 if this format is not valid. Note that some rounding may occur if \a duration is not an exact fraction of the sampleRate(). \sa durationForBytes() */ qint32 QAudioFormat::bytesForDuration(qint64 duration) const { return bytesPerFrame() * framesForDuration(duration); } /*! Returns the number of microseconds represented by \a bytes in this format. Returns 0 if this format is not valid. Note that some rounding may occur if \a bytes is not an exact multiple of the number of bytes per frame. \sa bytesForDuration() */ qint64 QAudioFormat::durationForBytes(qint32 bytes) const { if (!isValid() || bytes <= 0) return 0; // We round the byte count to ensure whole frames return qint64(1000000LL * (bytes / bytesPerFrame())) / sampleRate(); } /*! Returns the number of bytes required for \a frameCount frames of this format. Returns 0 if this format is not valid. \sa bytesForDuration() */ qint32 QAudioFormat::bytesForFrames(qint32 frameCount) const { return frameCount * bytesPerFrame(); } /*! Returns the number of frames represented by \a byteCount in this format. Note that some rounding may occur if \a byteCount is not an exact multiple of the number of bytes per frame. Each frame has one sample per channel. \sa framesForDuration() */ qint32 QAudioFormat::framesForBytes(qint32 byteCount) const { int size = bytesPerFrame(); if (size > 0) return byteCount / size; return 0; } /*! Returns the number of frames required to represent \a duration microseconds in this format. Note that some rounding may occur if \a duration is not an exact fraction of the \l sampleRate(). */ qint32 QAudioFormat::framesForDuration(qint64 duration) const { if (!isValid()) return 0; return qint32((duration * sampleRate()) / 1000000LL); } /*! Return the number of microseconds represented by \a frameCount frames in this format. */ qint64 QAudioFormat::durationForFrames(qint32 frameCount) const { if (!isValid() || frameCount <= 0) return 0; return (frameCount * 1000000LL) / sampleRate(); } /*! Returns the number of bytes required to represent one frame (a sample in each channel) in this format. Returns 0 if this format is invalid. */ int QAudioFormat::bytesPerFrame() const { if (!isValid()) return 0; return (sampleSize() * channelCount()) / 8; } /*! \enum QAudioFormat::SampleType \value Unknown Not Set \value SignedInt Samples are signed integers \value UnSignedInt Samples are unsigned intergers \value Float Samples are floats */ /*! \enum QAudioFormat::Endian \value BigEndian Samples are big endian byte order \value LittleEndian Samples are little endian byte order */ #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, QAudioFormat::Endian endian) { QDebug nospace = dbg.nospace(); switch (endian) { case QAudioFormat::BigEndian: nospace << "BigEndian"; break; case QAudioFormat::LittleEndian: nospace << "LittleEndian"; break; } return nospace; } QDebug operator<<(QDebug dbg, QAudioFormat::SampleType type) { QDebug nospace = dbg.nospace(); switch (type) { case QAudioFormat::SignedInt: nospace << "SignedInt"; break; case QAudioFormat::UnSignedInt: nospace << "UnSignedInt"; break; case QAudioFormat::Float: nospace << "Float"; break; default: nospace << "Unknown"; break; } return nospace; } QDebug operator<<(QDebug dbg, const QAudioFormat &f) { dbg.nospace() << "QAudioFormat(" << f.sampleRate(); dbg.nospace() << "Hz, " << f.sampleSize(); dbg.nospace() << "bit, channelCount=" << f.channelCount(); dbg.nospace() << ", sampleType=" << f.sampleType(); dbg.nospace() << ", byteOrder=" << f.byteOrder(); dbg.nospace() << ", codec=" << f.codec(); dbg.nospace() << ")"; return dbg.space(); } #endif QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioformat.h000066400000000000000000000076521225012771600314770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOFORMAT_H #define QAUDIOFORMAT_H #include #include #include #include QT_BEGIN_NAMESPACE class QAudioFormatPrivate; class Q_MULTIMEDIA_EXPORT QAudioFormat { public: enum SampleType { Unknown, SignedInt, UnSignedInt, Float }; enum Endian { BigEndian = QSysInfo::BigEndian, LittleEndian = QSysInfo::LittleEndian }; QAudioFormat(); QAudioFormat(const QAudioFormat &other); ~QAudioFormat(); QAudioFormat& operator=(const QAudioFormat &other); bool operator==(const QAudioFormat &other) const; bool operator!=(const QAudioFormat &other) const; bool isValid() const; void setSampleRate(int sampleRate); int sampleRate() const; void setChannelCount(int channelCount); int channelCount() const; void setSampleSize(int sampleSize); int sampleSize() const; void setCodec(const QString &codec); QString codec() const; void setByteOrder(QAudioFormat::Endian byteOrder); QAudioFormat::Endian byteOrder() const; void setSampleType(QAudioFormat::SampleType sampleType); QAudioFormat::SampleType sampleType() const; // Helper functions qint32 bytesForDuration(qint64 duration) const; qint64 durationForBytes(qint32 byteCount) const; qint32 bytesForFrames(qint32 frameCount) const; qint32 framesForBytes(qint32 byteCount) const; qint32 framesForDuration(qint64 duration) const; qint64 durationForFrames(qint32 frameCount) const; int bytesPerFrame() const; private: QSharedDataPointer d; }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QAudioFormat &); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAudioFormat::SampleType); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAudioFormat::Endian); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioFormat) Q_DECLARE_METATYPE(QAudioFormat::SampleType) Q_DECLARE_METATYPE(QAudioFormat::Endian) #endif // QAUDIOFORMAT_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiohelpers.cpp000066400000000000000000000105341225012771600321750ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiohelpers_p.h" #include QT_BEGIN_NAMESPACE namespace QAudioHelperInternal { template void adjustSamples(qreal factor, const void *src, void *dst, int samples) { const T *pSrc = (const T *)src; T *pDst = (T*)dst; for ( int i = 0; i < samples; i++ ) pDst[i] = pSrc[i] * factor; } // Unsigned samples are biased around 0x80/0x8000 :/ // This makes a pure template solution a bit unwieldy but possible template struct signedVersion {}; template<> struct signedVersion { typedef qint8 TS; enum {offset = 0x80}; }; template<> struct signedVersion { typedef qint16 TS; enum {offset = 0x8000}; }; template<> struct signedVersion { typedef qint32 TS; enum {offset = 0x80000000}; }; template void adjustUnsignedSamples(qreal factor, const void *src, void *dst, int samples) { const T *pSrc = (const T *)src; T *pDst = (T*)dst; for ( int i = 0; i < samples; i++ ) { pDst[i] = signedVersion::offset + ((typename signedVersion::TS)(pSrc[i] - signedVersion::offset) * factor); } } void qMultiplySamples(qreal factor, const QAudioFormat &format, const void* src, void* dest, int len) { int samplesCount = len / (format.sampleSize()/8); switch ( format.sampleSize() ) { case 8: if (format.sampleType() == QAudioFormat::SignedInt) QAudioHelperInternal::adjustSamples(factor,src,dest,samplesCount); else if (format.sampleType() == QAudioFormat::UnSignedInt) QAudioHelperInternal::adjustUnsignedSamples(factor,src,dest,samplesCount); break; case 16: if (format.sampleType() == QAudioFormat::SignedInt) QAudioHelperInternal::adjustSamples(factor,src,dest,samplesCount); else if (format.sampleType() == QAudioFormat::UnSignedInt) QAudioHelperInternal::adjustUnsignedSamples(factor,src,dest,samplesCount); break; default: if (format.sampleType() == QAudioFormat::SignedInt) QAudioHelperInternal::adjustSamples(factor,src,dest,samplesCount); else if (format.sampleType() == QAudioFormat::UnSignedInt) QAudioHelperInternal::adjustUnsignedSamples(factor,src,dest,samplesCount); else if (format.sampleType() == QAudioFormat::Float) QAudioHelperInternal::adjustSamples(factor,src,dest,samplesCount); } } } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiohelpers_p.h000066400000000000000000000046521225012771600321650ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOHELPERS_H #define QAUDIOHELPERS_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE namespace QAudioHelperInternal { Q_MULTIMEDIA_EXPORT void qMultiplySamples(qreal factor, const QAudioFormat& format, const void *src, void* dest, int len); } QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioinput.cpp000066400000000000000000000271711225012771600316770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudio.h" #include "qaudiodeviceinfo.h" #include "qaudiosystem.h" #include "qaudioinput.h" #include "qaudiodevicefactory_p.h" QT_BEGIN_NAMESPACE /*! \class QAudioInput \brief The QAudioInput class provides an interface for receiving audio data from an audio input device. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio You can construct an audio input with the system's \l{QAudioDeviceInfo::defaultInputDevice()}{default audio input device}. It is also possible to create QAudioInput with a specific QAudioDeviceInfo. When you create the audio input, you should also send in the QAudioFormat to be used for the recording (see the QAudioFormat class description for details). To record to a file: QAudioInput lets you record audio with an audio input device. The default constructor of this class will use the systems default audio device, but you can also specify a QAudioDeviceInfo for a specific device. You also need to pass in the QAudioFormat in which you wish to record. Starting up the QAudioInput is simply a matter of calling start() with a QIODevice opened for writing. For instance, to record to a file, you can: \snippet multimedia-snippets/audio.cpp Audio input class members \snippet multimedia-snippets/audio.cpp Audio input setup This will start recording if the format specified is supported by the input device (you can check this with QAudioDeviceInfo::isFormatSupported(). In case there are any snags, use the error() function to check what went wrong. We stop recording in the \c stopRecording() slot. \snippet multimedia-snippets/audio.cpp Audio input stop recording At any point in time, QAudioInput will be in one of four states: active, suspended, stopped, or idle. These states are specified by the QAudio::State enum. You can request a state change directly through suspend(), resume(), stop(), reset(), and start(). The current state is reported by state(). QAudioOutput will also signal you when the state changes (stateChanged()). QAudioInput provides several ways of measuring the time that has passed since the start() of the recording. The \c processedUSecs() function returns the length of the stream in microseconds written, i.e., it leaves out the times the audio input was suspended or idle. The elapsedUSecs() function returns the time elapsed since start() was called regardless of which states the QAudioInput has been in. If an error should occur, you can fetch its reason with error(). The possible error reasons are described by the QAudio::Error enum. The QAudioInput will enter the \l{QAudio::}{StoppedState} when an error is encountered. Connect to the stateChanged() signal to handle the error: \snippet multimedia-snippets/audio.cpp Audio input state changed \sa QAudioOutput, QAudioDeviceInfo */ /*! Construct a new audio input and attach it to \a parent. The default audio input device is used with the output \a format parameters. */ QAudioInput::QAudioInput(const QAudioFormat &format, QObject *parent): QObject(parent) { d = QAudioDeviceFactory::createDefaultInputDevice(format); connect(d, SIGNAL(notify()), SIGNAL(notify())); connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); } /*! Construct a new audio input and attach it to \a parent. The device referenced by \a audioDevice is used with the input \a format parameters. */ QAudioInput::QAudioInput(const QAudioDeviceInfo &audioDevice, const QAudioFormat &format, QObject *parent): QObject(parent) { d = QAudioDeviceFactory::createInputDevice(audioDevice, format); connect(d, SIGNAL(notify()), SIGNAL(notify())); connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); } /*! Destroy this audio input. */ QAudioInput::~QAudioInput() { delete d; } /*! Starts transferring audio data from the system's audio input to the \a device. The \a device must have been opened in the \l{QIODevice::WriteOnly}{WriteOnly}, \l{QIODevice::Append}{Append} or \l{QIODevice::ReadWrite}{ReadWrite} modes. If the QAudioInput is able to successfully get audio data, state() returns either QAudio::ActiveState or QAudio::IdleState, error() returns QAudio::NoError and the stateChanged() signal is emitted. If a problem occurs during this process, error() returns QAudio::OpenError, state() returns QAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ void QAudioInput::start(QIODevice* device) { d->start(device); } /*! Returns a pointer to the internal QIODevice being used to transfer data from the system's audio input. The device will already be open and \l{QIODevice::read()}{read()} can read data directly from it. \note The pointer will become invalid after the stream is stopped or if you start another stream. If the QAudioInput is able to access the system's audio device, state() returns QAudio::IdleState, error() returns QAudio::NoError and the stateChanged() signal is emitted. If a problem occurs during this process, error() returns QAudio::OpenError, state() returns QAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ QIODevice* QAudioInput::start() { return d->start(); } /*! Returns the QAudioFormat being used. */ QAudioFormat QAudioInput::format() const { return d->format(); } /*! Stops the audio input, detaching from the system resource. Sets error() to QAudio::NoError, state() to QAudio::StoppedState and emit stateChanged() signal. */ void QAudioInput::stop() { d->stop(); } /*! Drops all audio data in the buffers, resets buffers to zero. */ void QAudioInput::reset() { d->reset(); } /*! Stops processing audio data, preserving buffered audio data. Sets error() to QAudio::NoError, state() to QAudio::SuspendedState and emit stateChanged() signal. */ void QAudioInput::suspend() { d->suspend(); } /*! Resumes processing audio data after a suspend(). Sets error() to QAudio::NoError. Sets state() to QAudio::ActiveState if you previously called start(QIODevice*). Sets state() to QAudio::IdleState if you previously called start(). emits stateChanged() signal. */ void QAudioInput::resume() { d->resume(); } /*! Sets the audio buffer size to \a value bytes. Note: This function can be called anytime before start(), calls to this are ignored after start(). It should not be assumed that the buffer size set is the actual buffer size used, calling bufferSize() anytime after start() will return the actual buffer size being used. */ void QAudioInput::setBufferSize(int value) { d->setBufferSize(value); } /*! Returns the audio buffer size in bytes. If called before start(), returns platform default value. If called before start() but setBufferSize() was called prior, returns value set by setBufferSize(). If called after start(), returns the actual buffer size being used. This may not be what was set previously by setBufferSize(). */ int QAudioInput::bufferSize() const { return d->bufferSize(); } /*! Returns the amount of audio data available to read in bytes. Note: returned value is only valid while in QAudio::ActiveState or QAudio::IdleState state, otherwise returns zero. */ int QAudioInput::bytesReady() const { /* -If not ActiveState|IdleState, return 0 -return amount of audio data available to read */ return d->bytesReady(); } /*! Returns the period size in bytes. Note: This is the recommended read size in bytes. */ int QAudioInput::periodSize() const { return d->periodSize(); } /*! Sets the interval for notify() signal to be emitted. This is based on the \a ms of audio data processed not on actual real-time. The minimum resolution of the timer is platform specific and values should be checked with notifyInterval() to confirm actual value being used. */ void QAudioInput::setNotifyInterval(int ms) { d->setNotifyInterval(ms); } /*! Returns the notify interval in milliseconds. */ int QAudioInput::notifyInterval() const { return d->notifyInterval(); } /*! Sets the input volume to \a volume. If the device does not support adjusting the input volume then \a volume will be ignored and the input volume will remain at 1.0. Note: Adjustments to the volume will change the volume of this audio stream, not the global volume. */ void QAudioInput::setVolume(qreal volume) { d->setVolume(volume); } /*! Returns the input volume (gain). If the device does not support adjusting the input volume the returned value will be 1.0. */ qreal QAudioInput::volume() const { return d->volume(); } /*! Returns the amount of audio data processed since start() was called in microseconds. */ qint64 QAudioInput::processedUSecs() const { return d->processedUSecs(); } /*! Returns the microseconds since start() was called, including time in Idle and Suspend states. */ qint64 QAudioInput::elapsedUSecs() const { return d->elapsedUSecs(); } /*! Returns the error state. */ QAudio::Error QAudioInput::error() const { return d->error(); } /*! Returns the state of audio processing. */ QAudio::State QAudioInput::state() const { return d->state(); } /*! \fn QAudioInput::stateChanged(QAudio::State state) This signal is emitted when the device \a state has changed. */ /*! \fn QAudioInput::notify() This signal is emitted when x ms of audio data has been processed the interval set by setNotifyInterval(x). */ QT_END_NAMESPACE #include "moc_qaudioinput.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioinput.h000066400000000000000000000064261225012771600313440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOINPUT_H #define QAUDIOINPUT_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractAudioInput; class Q_MULTIMEDIA_EXPORT QAudioInput : public QObject { Q_OBJECT public: explicit QAudioInput(const QAudioFormat &format = QAudioFormat(), QObject *parent = 0); explicit QAudioInput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = 0); ~QAudioInput(); QAudioFormat format() const; void start(QIODevice *device); QIODevice* start(); void stop(); void reset(); void suspend(); void resume(); void setBufferSize(int bytes); int bufferSize() const; int bytesReady() const; int periodSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; void setVolume(qreal volume); qreal volume() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; Q_SIGNALS: void stateChanged(QAudio::State); void notify(); private: Q_DISABLE_COPY(QAudioInput) QAbstractAudioInput* d; }; QT_END_NAMESPACE #endif // QAUDIOINPUT_H qaudioinput_alsa_p.cpp000066400000000000000000000617161225012771600331420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include "qaudioinput_alsa_p.h" #include "qaudiodeviceinfo_alsa_p.h" #include "qaudiohelpers_p.h" QT_BEGIN_NAMESPACE //#define DEBUG_AUDIO 1 QAudioInputPrivate::QAudioInputPrivate(const QByteArray &device) { bytesAvailable = 0; handle = 0; ahandler = 0; access = SND_PCM_ACCESS_RW_INTERLEAVED; pcmformat = SND_PCM_FORMAT_S16; buffer_size = 0; period_size = 0; buffer_time = 100000; period_time = 20000; totalTimeValue = 0; intervalTime = 1000; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; resuming = false; m_volume = 1.0f; m_device = device; timer = new QTimer(this); connect(timer,SIGNAL(timeout()),SLOT(userFeed())); } QAudioInputPrivate::~QAudioInputPrivate() { close(); disconnect(timer, SIGNAL(timeout())); QCoreApplication::processEvents(); delete timer; } void QAudioInputPrivate::setVolume(qreal vol) { m_volume = vol; } qreal QAudioInputPrivate::volume() const { return m_volume; } QAudio::Error QAudioInputPrivate::error() const { return errorState; } QAudio::State QAudioInputPrivate::state() const { return deviceState; } void QAudioInputPrivate::setFormat(const QAudioFormat& fmt) { if (deviceState == QAudio::StoppedState) settings = fmt; } QAudioFormat QAudioInputPrivate::format() const { return settings; } int QAudioInputPrivate::xrun_recovery(int err) { int count = 0; bool reset = false; if(err == -EPIPE) { errorState = QAudio::UnderrunError; err = snd_pcm_prepare(handle); if(err < 0) reset = true; else { bytesAvailable = checkBytesReady(); if (bytesAvailable <= 0) reset = true; } } else if((err == -ESTRPIPE)||(err == -EIO)) { errorState = QAudio::IOError; while((err = snd_pcm_resume(handle)) == -EAGAIN){ usleep(100); count++; if(count > 5) { reset = true; break; } } if(err < 0) { err = snd_pcm_prepare(handle); if(err < 0) reset = true; } } if(reset) { close(); open(); snd_pcm_prepare(handle); return 0; } return err; } int QAudioInputPrivate::setFormat() { snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN; if(settings.sampleSize() == 8) { format = SND_PCM_FORMAT_U8; } else if(settings.sampleSize() == 16) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_S16_LE; else format = SND_PCM_FORMAT_S16_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_U16_LE; else format = SND_PCM_FORMAT_U16_BE; } } else if(settings.sampleSize() == 24) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_S24_LE; else format = SND_PCM_FORMAT_S24_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_U24_LE; else format = SND_PCM_FORMAT_U24_BE; } } else if(settings.sampleSize() == 32) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_S32_LE; else format = SND_PCM_FORMAT_S32_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_U32_LE; else format = SND_PCM_FORMAT_U32_BE; } else if(settings.sampleType() == QAudioFormat::Float) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_FLOAT_LE; else format = SND_PCM_FORMAT_FLOAT_BE; } } else if(settings.sampleSize() == 64) { if(settings.byteOrder() == QAudioFormat::LittleEndian) format = SND_PCM_FORMAT_FLOAT64_LE; else format = SND_PCM_FORMAT_FLOAT64_BE; } return format != SND_PCM_FORMAT_UNKNOWN ? snd_pcm_hw_params_set_format( handle, hwparams, format) : -1; } void QAudioInputPrivate::start(QIODevice* device) { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = true; audioSource = device; deviceState = QAudio::ActiveState; if( !open() ) return; emit stateChanged(deviceState); } QIODevice* QAudioInputPrivate::start() { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = false; audioSource = new InputPrivate(this); audioSource->open(QIODevice::ReadOnly | QIODevice::Unbuffered); deviceState = QAudio::IdleState; if( !open() ) return 0; emit stateChanged(deviceState); return audioSource; } void QAudioInputPrivate::stop() { if(deviceState == QAudio::StoppedState) return; deviceState = QAudio::StoppedState; close(); emit stateChanged(deviceState); } bool QAudioInputPrivate::open() { #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()< devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioInput); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) if (devices.size() > 0) dev = QLatin1String(devices.first()); else return false; #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = QLatin1String(m_device); #else int idx = 0; char *name; QString shortName = QLatin1String(m_device.mid(m_device.indexOf('=',0)+1).constData()); while(snd_card_get_name(idx,&name) == 0) { if(qstrncmp(shortName.toLocal8Bit().constData(),name,shortName.length()) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } // Step 1: try and open the device while((count < 5) && (err < 0)) { err=snd_pcm_open(&handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); if(err < 0) count++; } if (( err < 0)||(handle == 0)) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); return false; } snd_pcm_nonblock( handle, 0 ); // Step 2: Set the desired HW parameters. snd_pcm_hw_params_alloca( &hwparams ); bool fatal = false; QString errMessage; unsigned int chunks = 8; err = snd_pcm_hw_params_any( handle, hwparams ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_any: err = %1").arg(err); } if ( !fatal ) { err = snd_pcm_hw_params_set_rate_resample( handle, hwparams, 1 ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_rate_resample: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_access( handle, hwparams, access ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_access: err = %1").arg(err); } } if ( !fatal ) { err = setFormat(); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_format: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_channels( handle, hwparams, (unsigned int)settings.channelCount() ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_channels: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_rate_near( handle, hwparams, &sampleRate, 0 ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_rate_near: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_buffer_time_near(handle, hwparams, &buffer_time, &dir); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_buffer_time_near: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, &dir); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_period_time_near: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_periods_near(handle, hwparams, &chunks, &dir); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params_set_periods_near: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params(handle, hwparams); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioInput: snd_pcm_hw_params: err = %1").arg(err); } } if( err < 0) { qWarning()<start(period_time*chunks/2000); errorState = QAudio::NoError; totalTimeValue = 0; return true; } void QAudioInputPrivate::close() { timer->stop(); if ( handle ) { snd_pcm_drop( handle ); snd_pcm_close( handle ); handle = 0; } } int QAudioInputPrivate::checkBytesReady() { if(resuming) bytesAvailable = period_size; else if(deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) bytesAvailable = 0; else { int frames = snd_pcm_avail_update(handle); if (frames < 0) { bytesAvailable = frames; } else { if((int)frames > (int)buffer_frames) frames = buffer_frames; bytesAvailable = snd_pcm_frames_to_bytes(handle, frames); } } return bytesAvailable; } int QAudioInputPrivate::bytesReady() const { return qMax(bytesAvailable, 0); } qint64 QAudioInputPrivate::read(char* data, qint64 len) { // Read in some audio data and write it to QIODevice, pull mode if ( !handle ) return 0; int bytesRead = 0; int bytesInRingbufferBeforeRead = ringBuffer.bytesOfDataInBuffer(); if (ringBuffer.bytesOfDataInBuffer() < len) { // bytesAvaiable is saved as a side effect of checkBytesReady(). int bytesToRead = checkBytesReady(); if (bytesToRead < 0) { // bytesAvailable as negative is error code, try to recover from it. xrun_recovery(bytesToRead); bytesToRead = checkBytesReady(); if (bytesToRead < 0) { // recovery failed must stop and set error. close(); errorState = QAudio::IOError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); return 0; } } bytesToRead = qMin(len, bytesToRead); bytesToRead = qMin(ringBuffer.freeBytes(), bytesToRead); bytesToRead -= bytesToRead % period_size; int count=0; int err = 0; while(count < 5 && bytesToRead > 0) { char buffer[bytesToRead]; int chunks = bytesToRead / period_size; int frames = chunks * period_frames; if (frames > (int)buffer_frames) frames = buffer_frames; int readFrames = snd_pcm_readi(handle, buffer, frames); bytesRead = snd_pcm_frames_to_bytes(handle, readFrames); if (m_volume < 1.0f) QAudioHelperInternal::qMultiplySamples(m_volume, settings, buffer, buffer, bytesRead); if (readFrames >= 0) { ringBuffer.write(buffer, bytesRead); #ifdef DEBUG_AUDIO qDebug() << QString::fromLatin1("read in bytes = %1 (frames=%2)").arg(bytesRead).arg(readFrames).toLatin1().constData(); #endif break; } else if((readFrames == -EAGAIN) || (readFrames == -EINTR)) { errorState = QAudio::IOError; err = 0; break; } else { if(readFrames == -EPIPE) { errorState = QAudio::UnderrunError; err = snd_pcm_prepare(handle); } else if(readFrames == -ESTRPIPE) { err = snd_pcm_prepare(handle); } if(err != 0) break; } count++; } } bytesRead += bytesInRingbufferBeforeRead; if (bytesRead > 0) { // got some send it onward #ifdef DEBUG_AUDIO qDebug() << "frames to write to QIODevice = " << snd_pcm_bytes_to_frames( handle, (int)bytesRead ) << " (" << bytesRead << ") bytes"; #endif if (deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return 0; if (pullMode) { qint64 l = 0; qint64 bytesWritten = 0; while (ringBuffer.bytesOfDataInBuffer() > 0) { l = audioSource->write(ringBuffer.availableData(), ringBuffer.availableDataBlockSize()); if (l > 0) { ringBuffer.readBytes(l); bytesWritten += l; } else { break; } } if (l < 0) { close(); errorState = QAudio::IOError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); } else if (l == 0 && bytesWritten == 0) { if (deviceState != QAudio::IdleState) { errorState = QAudio::NoError; deviceState = QAudio::IdleState; emit stateChanged(deviceState); } } else { bytesAvailable -= bytesWritten; totalTimeValue += bytesWritten; resuming = false; if (deviceState != QAudio::ActiveState) { errorState = QAudio::NoError; deviceState = QAudio::ActiveState; emit stateChanged(deviceState); } } return bytesWritten; } else { while (ringBuffer.bytesOfDataInBuffer() > 0) { int size = ringBuffer.availableDataBlockSize(); memcpy(data, ringBuffer.availableData(), size); data += size; ringBuffer.readBytes(size); } bytesAvailable -= bytesRead; totalTimeValue += bytesRead; resuming = false; if (deviceState != QAudio::ActiveState) { errorState = QAudio::NoError; deviceState = QAudio::ActiveState; emit stateChanged(deviceState); } return bytesRead; } } return 0; } void QAudioInputPrivate::resume() { if(deviceState == QAudio::SuspendedState) { int err = 0; if(handle) { err = snd_pcm_prepare( handle ); if(err < 0) xrun_recovery(err); err = snd_pcm_start(handle); if(err < 0) xrun_recovery(err); bytesAvailable = buffer_size; } resuming = true; deviceState = QAudio::ActiveState; int chunks = buffer_size/period_size; timer->start(period_time*chunks/2000); emit stateChanged(deviceState); } } void QAudioInputPrivate::setBufferSize(int value) { buffer_size = value; } int QAudioInputPrivate::bufferSize() const { return buffer_size; } int QAudioInputPrivate::periodSize() const { return period_size; } void QAudioInputPrivate::setNotifyInterval(int ms) { intervalTime = qMax(0, ms); } int QAudioInputPrivate::notifyInterval() const { return intervalTime; } qint64 QAudioInputPrivate::processedUSecs() const { qint64 result = qint64(1000000) * totalTimeValue / (settings.channelCount()*(settings.sampleSize()/8)) / settings.sampleRate(); return result; } void QAudioInputPrivate::suspend() { if(deviceState == QAudio::ActiveState||resuming) { timer->stop(); deviceState = QAudio::SuspendedState; emit stateChanged(deviceState); } } void QAudioInputPrivate::userFeed() { if(deviceState == QAudio::StoppedState || deviceState == QAudio::SuspendedState) return; #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()<(audioSource); a->trigger(); } bytesAvailable = checkBytesReady(); if(deviceState != QAudio::ActiveState) return true; if (bytesAvailable < 0) { // bytesAvailable as negative is error code, try to recover from it. xrun_recovery(bytesAvailable); bytesAvailable = checkBytesReady(); if (bytesAvailable < 0) { // recovery failed must stop and set error. close(); errorState = QAudio::IOError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); return 0; } } if(intervalTime && (timeStamp.elapsed() + elapsedTimeOffset) > intervalTime) { emit notify(); elapsedTimeOffset = timeStamp.elapsed() + elapsedTimeOffset - intervalTime; timeStamp.restart(); } return true; } qint64 QAudioInputPrivate::elapsedUSecs() const { if (deviceState == QAudio::StoppedState) return 0; return clockStamp.elapsed()*1000; } void QAudioInputPrivate::reset() { if(handle) snd_pcm_reset(handle); stop(); bytesAvailable = 0; } void QAudioInputPrivate::drain() { if(handle) snd_pcm_drain(handle); } InputPrivate::InputPrivate(QAudioInputPrivate* audio) { audioDevice = qobject_cast(audio); } InputPrivate::~InputPrivate() { } qint64 InputPrivate::readData( char* data, qint64 len) { return audioDevice->read(data,len); } qint64 InputPrivate::writeData(const char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) return 0; } void InputPrivate::trigger() { emit readyRead(); } RingBuffer::RingBuffer() : m_head(0), m_tail(0) { } void RingBuffer::resize(int size) { m_data.resize(size); } int RingBuffer::bytesOfDataInBuffer() const { if (m_head < m_tail) return m_tail - m_head; else if (m_tail < m_head) return m_data.size() + m_tail - m_head; else return 0; } int RingBuffer::freeBytes() const { if (m_head > m_tail) return m_head - m_tail - 1; else if (m_tail > m_head) return m_data.size() - m_tail + m_head - 1; else return m_data.size() - 1; } const char *RingBuffer::availableData() const { return (m_data.constData() + m_head); } int RingBuffer::availableDataBlockSize() const { if (m_head > m_tail) return m_data.size() - m_head; else if (m_tail > m_head) return m_tail - m_head; else return 0; } void RingBuffer::readBytes(int bytes) { m_head = (m_head + bytes) % m_data.size(); } void RingBuffer::write(char *data, int len) { if (m_tail + len < m_data.size()) { memcpy(m_data.data() + m_tail, data, len); m_tail += len; } else { int bytesUntilEnd = m_data.size() - m_tail; memcpy(m_data.data() + m_tail, data, bytesUntilEnd); if (len - bytesUntilEnd > 0) memcpy(m_data.data(), data + bytesUntilEnd, len - bytesUntilEnd); m_tail = len - bytesUntilEnd; } } QT_END_NAMESPACE #include "moc_qaudioinput_alsa_p.cpp" qaudioinput_alsa_p.h000066400000000000000000000116161225012771600326010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIOINPUTALSA_H #define QAUDIOINPUTALSA_H #include #include #include #include #include #include #include #include "qaudio.h" #include "qaudiodeviceinfo.h" #include "qaudiosystem.h" QT_BEGIN_NAMESPACE class InputPrivate; class RingBuffer { public: RingBuffer(); void resize(int size); int bytesOfDataInBuffer() const; int freeBytes() const; const char *availableData() const; int availableDataBlockSize() const; void readBytes(int bytes); void write(char *data, int len); private: int m_head; int m_tail; QByteArray m_data; }; class QAudioInputPrivate : public QAbstractAudioInput { Q_OBJECT public: QAudioInputPrivate(const QByteArray &device); ~QAudioInputPrivate(); qint64 read(char* data, qint64 len); void start(QIODevice* device); QIODevice* start(); void stop(); void reset(); void suspend(); void resume(); int bytesReady() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void setFormat(const QAudioFormat& fmt); QAudioFormat format() const; void setVolume(qreal); qreal volume() const; bool resuming; snd_pcm_t* handle; qint64 totalTimeValue; QIODevice* audioSource; QAudioFormat settings; QAudio::Error errorState; QAudio::State deviceState; private slots: void userFeed(); bool deviceReady(); private: int checkBytesReady(); int xrun_recovery(int err); int setFormat(); bool open(); void close(); void drain(); QTimer* timer; QTime timeStamp; QTime clockStamp; qint64 elapsedTimeOffset; int intervalTime; RingBuffer ringBuffer; int bytesAvailable; QByteArray m_device; bool pullMode; int buffer_size; int period_size; unsigned int buffer_time; unsigned int period_time; snd_pcm_uframes_t buffer_frames; snd_pcm_uframes_t period_frames; snd_async_handler_t* ahandler; snd_pcm_access_t access; snd_pcm_format_t pcmformat; snd_timestamp_t* timestamp; snd_pcm_hw_params_t *hwparams; qreal m_volume; }; class InputPrivate : public QIODevice { Q_OBJECT public: InputPrivate(QAudioInputPrivate* audio); ~InputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); void trigger(); private: QAudioInputPrivate *audioDevice; }; QT_END_NAMESPACE #endif qaudioinput_mac_p.cpp000066400000000000000000000742361225012771600327630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include #include #include #include "qaudio_mac_p.h" #include "qaudioinput_mac_p.h" #include "qaudiodeviceinfo_mac_p.h" #include "qaudiohelpers_p.h" QT_BEGIN_NAMESPACE namespace QtMultimediaInternal { static const int default_buffer_size = 4 * 1024; class QAudioBufferList { public: QAudioBufferList(AudioStreamBasicDescription const& streamFormat): owner(false), sf(streamFormat) { const bool isInterleaved = (sf.mFormatFlags & kAudioFormatFlagIsNonInterleaved) == 0; const int numberOfBuffers = isInterleaved ? 1 : sf.mChannelsPerFrame; dataSize = 0; bfs = reinterpret_cast(malloc(sizeof(AudioBufferList) + (sizeof(AudioBuffer) * numberOfBuffers))); bfs->mNumberBuffers = numberOfBuffers; for (int i = 0; i < numberOfBuffers; ++i) { bfs->mBuffers[i].mNumberChannels = isInterleaved ? numberOfBuffers : 1; bfs->mBuffers[i].mDataByteSize = 0; bfs->mBuffers[i].mData = 0; } } QAudioBufferList(AudioStreamBasicDescription const& streamFormat, char* buffer, int bufferSize): owner(false), sf(streamFormat), bfs(0) { dataSize = bufferSize; bfs = reinterpret_cast(malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer))); bfs->mNumberBuffers = 1; bfs->mBuffers[0].mNumberChannels = 1; bfs->mBuffers[0].mDataByteSize = dataSize; bfs->mBuffers[0].mData = buffer; } QAudioBufferList(AudioStreamBasicDescription const& streamFormat, int framesToBuffer): owner(true), sf(streamFormat), bfs(0) { const bool isInterleaved = (sf.mFormatFlags & kAudioFormatFlagIsNonInterleaved) == 0; const int numberOfBuffers = isInterleaved ? 1 : sf.mChannelsPerFrame; dataSize = framesToBuffer * sf.mBytesPerFrame; bfs = reinterpret_cast(malloc(sizeof(AudioBufferList) + (sizeof(AudioBuffer) * numberOfBuffers))); bfs->mNumberBuffers = numberOfBuffers; for (int i = 0; i < numberOfBuffers; ++i) { bfs->mBuffers[i].mNumberChannels = isInterleaved ? numberOfBuffers : 1; bfs->mBuffers[i].mDataByteSize = dataSize; bfs->mBuffers[i].mData = malloc(dataSize); } } ~QAudioBufferList() { if (owner) { for (UInt32 i = 0; i < bfs->mNumberBuffers; ++i) free(bfs->mBuffers[i].mData); } free(bfs); } AudioBufferList* audioBufferList() const { return bfs; } char* data(int buffer = 0) const { return static_cast(bfs->mBuffers[buffer].mData); } qint64 bufferSize(int buffer = 0) const { return bfs->mBuffers[buffer].mDataByteSize; } int frameCount(int buffer = 0) const { return bfs->mBuffers[buffer].mDataByteSize / sf.mBytesPerFrame; } int packetCount(int buffer = 0) const { return bfs->mBuffers[buffer].mDataByteSize / sf.mBytesPerPacket; } int packetSize() const { return sf.mBytesPerPacket; } void reset() { for (UInt32 i = 0; i < bfs->mNumberBuffers; ++i) { bfs->mBuffers[i].mDataByteSize = dataSize; bfs->mBuffers[i].mData = 0; } } private: bool owner; int dataSize; AudioStreamBasicDescription sf; AudioBufferList* bfs; }; class QAudioPacketFeeder { public: QAudioPacketFeeder(QAudioBufferList* abl): audioBufferList(abl) { totalPackets = audioBufferList->packetCount(); position = 0; } bool feed(AudioBufferList& dst, UInt32& packetCount) { if (position == totalPackets) { dst.mBuffers[0].mDataByteSize = 0; packetCount = 0; return false; } if (totalPackets - position < packetCount) packetCount = totalPackets - position; dst.mBuffers[0].mDataByteSize = packetCount * audioBufferList->packetSize(); dst.mBuffers[0].mData = audioBufferList->data() + (position * audioBufferList->packetSize()); position += packetCount; return true; } bool empty() const { return position == totalPackets; } private: UInt32 totalPackets; UInt32 position; QAudioBufferList* audioBufferList; }; class QAudioInputBuffer : public QObject { Q_OBJECT public: QAudioInputBuffer(int bufferSize, int maxPeriodSize, AudioStreamBasicDescription const& inputFormat, AudioStreamBasicDescription const& outputFormat, QObject* parent): QObject(parent), m_deviceError(false), m_audioConverter(0), m_inputFormat(inputFormat), m_outputFormat(outputFormat), m_volume(qreal(1.0f)) { m_maxPeriodSize = maxPeriodSize; m_periodTime = m_maxPeriodSize / m_outputFormat.mBytesPerFrame * 1000 / m_outputFormat.mSampleRate; m_buffer = new QAudioRingBuffer(bufferSize); m_inputBufferList = new QAudioBufferList(m_inputFormat); m_flushTimer = new QTimer(this); connect(m_flushTimer, SIGNAL(timeout()), SLOT(flushBuffer())); if (toQAudioFormat(inputFormat) != toQAudioFormat(outputFormat)) { if (AudioConverterNew(&m_inputFormat, &m_outputFormat, &m_audioConverter) != noErr) { qWarning() << "QAudioInput: Unable to create an Audio Converter"; m_audioConverter = 0; } } m_qFormat = toQAudioFormat(inputFormat); // we adjust volume before conversion } ~QAudioInputBuffer() { delete m_buffer; } qreal volume() const { return m_volume; } void setVolume(qreal v) { m_volume = v; } qint64 renderFromDevice(AudioUnit audioUnit, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames) { const bool pullMode = m_device == 0; OSStatus err; qint64 framesRendered = 0; m_inputBufferList->reset(); err = AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, m_inputBufferList->audioBufferList()); // adjust volume, if necessary if (!qFuzzyCompare(m_volume, qreal(1.0f))) { QAudioHelperInternal::qMultiplySamples(m_volume, m_qFormat, m_inputBufferList->data(), /* input */ m_inputBufferList->data(), /* output */ m_inputBufferList->bufferSize()); } if (m_audioConverter != 0) { QAudioPacketFeeder feeder(m_inputBufferList); int copied = 0; const int available = m_buffer->free(); while (err == noErr && !feeder.empty()) { QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available - copied); if (region.second == 0) break; AudioBufferList output; output.mNumberBuffers = 1; output.mBuffers[0].mNumberChannels = 1; output.mBuffers[0].mDataByteSize = region.second; output.mBuffers[0].mData = region.first; UInt32 packetSize = region.second / m_outputFormat.mBytesPerPacket; err = AudioConverterFillComplexBuffer(m_audioConverter, converterCallback, &feeder, &packetSize, &output, 0); region.second = output.mBuffers[0].mDataByteSize; copied += region.second; m_buffer->releaseWriteRegion(region); } framesRendered += copied / m_outputFormat.mBytesPerFrame; } else { const int available = m_inputBufferList->bufferSize(); bool wecan = true; int copied = 0; while (wecan && copied < available) { QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available - copied); if (region.second > 0) { memcpy(region.first, m_inputBufferList->data() + copied, region.second); copied += region.second; } else wecan = false; m_buffer->releaseWriteRegion(region); } framesRendered = copied / m_outputFormat.mBytesPerFrame; } if (pullMode && framesRendered > 0) emit readyRead(); return framesRendered; } qint64 readBytes(char* data, qint64 len) { bool wecan = true; qint64 bytesCopied = 0; len -= len % m_maxPeriodSize; while (wecan && bytesCopied < len) { QAudioRingBuffer::Region region = m_buffer->acquireReadRegion(len - bytesCopied); if (region.second > 0) { memcpy(data + bytesCopied, region.first, region.second); bytesCopied += region.second; } else wecan = false; m_buffer->releaseReadRegion(region); } return bytesCopied; } void setFlushDevice(QIODevice* device) { if (m_device != device) m_device = device; } void startFlushTimer() { if (m_device != 0) { // We use the period time for the timer, since that's // around the buffer size (pre conversion >.>) m_flushTimer->start(qMax(1, m_periodTime)); } } void stopFlushTimer() { m_flushTimer->stop(); } void flush(bool all = false) { if (m_device == 0) return; const int used = m_buffer->used(); const int readSize = all ? used : used - (used % m_maxPeriodSize); if (readSize > 0) { bool wecan = true; int flushed = 0; while (!m_deviceError && wecan && flushed < readSize) { QAudioRingBuffer::Region region = m_buffer->acquireReadRegion(readSize - flushed); if (region.second > 0) { int bytesWritten = m_device->write(region.first, region.second); if (bytesWritten < 0) { stopFlushTimer(); m_deviceError = true; } else { region.second = bytesWritten; flushed += bytesWritten; wecan = bytesWritten != 0; } } else wecan = false; m_buffer->releaseReadRegion(region); } } } void reset() { m_buffer->reset(); m_deviceError = false; } int available() const { return m_buffer->free(); } int used() const { return m_buffer->used(); } signals: void readyRead(); private slots: void flushBuffer() { flush(); } private: bool m_deviceError; int m_maxPeriodSize; int m_periodTime; QIODevice* m_device; QTimer* m_flushTimer; QAudioRingBuffer* m_buffer; QAudioBufferList* m_inputBufferList; AudioConverterRef m_audioConverter; AudioStreamBasicDescription m_inputFormat; AudioStreamBasicDescription m_outputFormat; QAudioFormat m_qFormat; qreal m_volume; const static OSStatus as_empty = 'qtem'; // Converter callback static OSStatus converterCallback(AudioConverterRef inAudioConverter, UInt32* ioNumberDataPackets, AudioBufferList* ioData, AudioStreamPacketDescription** outDataPacketDescription, void* inUserData) { Q_UNUSED(inAudioConverter); Q_UNUSED(outDataPacketDescription); QAudioPacketFeeder* feeder = static_cast(inUserData); if (!feeder->feed(*ioData, *ioNumberDataPackets)) return as_empty; return noErr; } }; class MacInputDevice : public QIODevice { Q_OBJECT public: MacInputDevice(QAudioInputBuffer* audioBuffer, QObject* parent): QIODevice(parent), m_audioBuffer(audioBuffer) { open(QIODevice::ReadOnly | QIODevice::Unbuffered); connect(m_audioBuffer, SIGNAL(readyRead()), SIGNAL(readyRead())); } qint64 readData(char* data, qint64 len) { return m_audioBuffer->readBytes(data, len); } qint64 writeData(const char* data, qint64 len) { Q_UNUSED(data); Q_UNUSED(len); return 0; } bool isSequential() const { return true; } private: QAudioInputBuffer* m_audioBuffer; }; } QAudioInputPrivate::QAudioInputPrivate(const QByteArray& device) { QDataStream ds(device); quint32 did, mode; ds >> did >> mode; if (QAudio::Mode(mode) == QAudio::AudioOutput) errorCode = QAudio::OpenError; else { audioDeviceInfo = new QAudioDeviceInfoInternal(device, QAudio::AudioInput); isOpen = false; audioDeviceId = AudioDeviceID(did); audioUnit = 0; startTime = 0; totalFrames = 0; audioBuffer = 0; internalBufferSize = QtMultimediaInternal::default_buffer_size; clockFrequency = AudioGetHostClockFrequency() / 1000; errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; m_volume = qreal(1.0f); intervalTimer = new QTimer(this); intervalTimer->setInterval(1000); connect(intervalTimer, SIGNAL(timeout()), SIGNAL(notify())); } } QAudioInputPrivate::~QAudioInputPrivate() { close(); delete audioDeviceInfo; } bool QAudioInputPrivate::open() { UInt32 size = 0; if (isOpen) return true; ComponentDescription cd; cd.componentType = kAudioUnitType_Output; cd.componentSubType = kAudioUnitSubType_HALOutput; cd.componentManufacturer = kAudioUnitManufacturer_Apple; cd.componentFlags = 0; cd.componentFlagsMask = 0; // Open Component cp = FindNextComponent(NULL, &cd); if (cp == 0) { qWarning() << "QAudioInput: Failed to find HAL Output component"; return false; } if (OpenAComponent(cp, &audioUnit) != noErr) { qWarning() << "QAudioInput: Unable to Open Output Component"; return false; } // Set mode // switch to input mode UInt32 enable = 1; if (AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enable, sizeof(enable)) != noErr) { qWarning() << "QAudioInput: Unable to switch to input mode (Enable Input)"; return false; } enable = 0; if (AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enable, sizeof(enable)) != noErr) { qWarning() << "QAudioInput: Unable to switch to input mode (Disable output)"; return false; } // register callback AURenderCallbackStruct cb; cb.inputProc = inputCallback; cb.inputProcRefCon = this; if (AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &cb, sizeof(cb)) != noErr) { qWarning() << "QAudioInput: Failed to set AudioUnit callback"; return false; } // Set Audio Device if (AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &audioDeviceId, sizeof(audioDeviceId)) != noErr) { qWarning() << "QAudioInput: Unable to use configured device"; return false; } // Set format // Wanted streamFormat = toAudioStreamBasicDescription(audioFormat); // Required on unit if (audioFormat == audioDeviceInfo->preferredFormat()) { deviceFormat = streamFormat; AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &deviceFormat, sizeof(deviceFormat)); } else { size = sizeof(deviceFormat); if (AudioUnitGetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &deviceFormat, &size) != noErr) { qWarning() << "QAudioInput: Unable to retrieve device format"; return false; } if (AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &deviceFormat, sizeof(deviceFormat)) != noErr) { qWarning() << "QAudioInput: Unable to set device format"; return false; } } // Setup buffers UInt32 numberOfFrames; size = sizeof(UInt32); if (AudioUnitGetProperty(audioUnit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, &numberOfFrames, &size) != noErr) { qWarning() << "QAudioInput: Failed to get audio period size"; return false; } AudioValueRange bufferRange; size = sizeof(AudioValueRange); if (AudioUnitGetProperty(audioUnit, kAudioDevicePropertyBufferFrameSizeRange, kAudioUnitScope_Global, 0, &bufferRange, &size) != noErr) { qWarning() << "QAudioInput: Failed to get audio period size range"; return false; } // See if the requested buffer size is permissible UInt32 frames = qBound((UInt32)bufferRange.mMinimum, internalBufferSize / streamFormat.mBytesPerFrame, (UInt32)bufferRange.mMaximum); // Set it back if (AudioUnitSetProperty(audioUnit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, &frames, sizeof(UInt32)) != noErr) { qWarning() << "QAudioInput: Failed to set audio buffer size"; return false; } // Now allocate a few buffers to be safe. periodSizeBytes = internalBufferSize = frames * streamFormat.mBytesPerFrame; audioBuffer = new QtMultimediaInternal::QAudioInputBuffer(internalBufferSize * 4, periodSizeBytes, deviceFormat, streamFormat, this); audioBuffer->setVolume(m_volume); audioIO = new QtMultimediaInternal::MacInputDevice(audioBuffer, this); // Init if (AudioUnitInitialize(audioUnit) != noErr) { qWarning() << "QAudioInput: Failed to initialize AudioUnit"; return false; } isOpen = true; return isOpen; } void QAudioInputPrivate::close() { if (audioUnit != 0) { AudioOutputUnitStop(audioUnit); AudioUnitUninitialize(audioUnit); CloseComponent(audioUnit); } delete audioBuffer; } QAudioFormat QAudioInputPrivate::format() const { return audioFormat; } void QAudioInputPrivate::setFormat(const QAudioFormat& fmt) { if (stateCode == QAudio::StoppedState) audioFormat = fmt; } void QAudioInputPrivate::start(QIODevice* device) { QIODevice* op = device; if (!audioDeviceInfo->isFormatSupported(audioFormat) || !open()) { stateCode = QAudio::StoppedState; errorCode = QAudio::OpenError; return; } reset(); audioBuffer->reset(); audioBuffer->setFlushDevice(op); if (op == 0) op = audioIO; // Start startTime = AudioGetCurrentHostTime(); totalFrames = 0; stateCode = QAudio::IdleState; errorCode = QAudio::NoError; emit stateChanged(stateCode); audioThreadStart(); } QIODevice* QAudioInputPrivate::start() { QIODevice* op = 0; if (!audioDeviceInfo->isFormatSupported(audioFormat) || !open()) { stateCode = QAudio::StoppedState; errorCode = QAudio::OpenError; return audioIO; } reset(); audioBuffer->reset(); audioBuffer->setFlushDevice(op); if (op == 0) op = audioIO; // Start startTime = AudioGetCurrentHostTime(); totalFrames = 0; stateCode = QAudio::IdleState; errorCode = QAudio::NoError; emit stateChanged(stateCode); audioThreadStart(); return op; } void QAudioInputPrivate::stop() { QMutexLocker lock(&mutex); if (stateCode != QAudio::StoppedState) { audioThreadStop(); audioBuffer->flush(true); errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioInputPrivate::reset() { QMutexLocker lock(&mutex); if (stateCode != QAudio::StoppedState) { audioThreadStop(); errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; audioBuffer->reset(); QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioInputPrivate::suspend() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState || stateCode == QAudio::IdleState) { audioThreadStop(); errorCode = QAudio::NoError; stateCode = QAudio::SuspendedState; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioInputPrivate::resume() { QMutexLocker lock(&mutex); if (stateCode == QAudio::SuspendedState) { audioThreadStart(); errorCode = QAudio::NoError; stateCode = QAudio::ActiveState; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } int QAudioInputPrivate::bytesReady() const { if (!audioBuffer) return 0; return audioBuffer->used(); } int QAudioInputPrivate::periodSize() const { return periodSizeBytes; } void QAudioInputPrivate::setBufferSize(int bs) { internalBufferSize = bs; } int QAudioInputPrivate::bufferSize() const { return internalBufferSize; } void QAudioInputPrivate::setNotifyInterval(int milliSeconds) { if (intervalTimer->interval() == milliSeconds) return; if (milliSeconds <= 0) milliSeconds = 0; intervalTimer->setInterval(milliSeconds); } int QAudioInputPrivate::notifyInterval() const { return intervalTimer->interval(); } qint64 QAudioInputPrivate::processedUSecs() const { return totalFrames * 1000000 / audioFormat.sampleRate(); } qint64 QAudioInputPrivate::elapsedUSecs() const { if (stateCode == QAudio::StoppedState) return 0; return (AudioGetCurrentHostTime() - startTime) / (clockFrequency / 1000); } QAudio::Error QAudioInputPrivate::error() const { return errorCode; } QAudio::State QAudioInputPrivate::state() const { return stateCode; } qreal QAudioInputPrivate::volume() const { return m_volume; } void QAudioInputPrivate::setVolume(qreal volume) { m_volume = volume; if (audioBuffer) audioBuffer->setVolume(m_volume); } void QAudioInputPrivate::audioThreadStop() { stopTimers(); if (audioThreadState.testAndSetAcquire(Running, Stopped)) threadFinished.wait(&mutex); } void QAudioInputPrivate::audioThreadStart() { startTimers(); audioThreadState.store(Running); AudioOutputUnitStart(audioUnit); } void QAudioInputPrivate::audioDeviceStop() { AudioOutputUnitStop(audioUnit); audioThreadState.store(Stopped); threadFinished.wakeOne(); } void QAudioInputPrivate::audioDeviceActive() { QMutexLocker lock(&mutex); if (stateCode == QAudio::IdleState) { stateCode = QAudio::ActiveState; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioInputPrivate::audioDeviceFull() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState) { errorCode = QAudio::UnderrunError; stateCode = QAudio::IdleState; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioInputPrivate::audioDeviceError() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState) { audioDeviceStop(); errorCode = QAudio::IOError; stateCode = QAudio::StoppedState; QMetaObject::invokeMethod(this, "deviceStopped", Qt::QueuedConnection); } } void QAudioInputPrivate::startTimers() { audioBuffer->startFlushTimer(); if (intervalTimer->interval() > 0) intervalTimer->start(); } void QAudioInputPrivate::stopTimers() { audioBuffer->stopFlushTimer(); intervalTimer->stop(); } void QAudioInputPrivate::deviceStopped() { stopTimers(); emit stateChanged(stateCode); } // Input callback OSStatus QAudioInputPrivate::inputCallback(void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData) { Q_UNUSED(ioData); QAudioInputPrivate* d = static_cast(inRefCon); const int threadState = d->audioThreadState.loadAcquire(); if (threadState == Stopped) d->audioDeviceStop(); else { qint64 framesWritten; framesWritten = d->audioBuffer->renderFromDevice(d->audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames); if (framesWritten > 0) { d->totalFrames += framesWritten; d->audioDeviceActive(); } else if (framesWritten == 0) d->audioDeviceFull(); else if (framesWritten < 0) d->audioDeviceError(); } return noErr; } QT_END_NAMESPACE #include "qaudioinput_mac_p.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioinput_mac_p.h000066400000000000000000000117241225012771600325000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIOINPUT_MAC_P_H #define QAUDIOINPUT_MAC_P_H #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QTimer; class QIODevice; class QAbstractAudioDeviceInfo; namespace QtMultimediaInternal { class QAudioInputBuffer; } class QAudioInputPrivate : public QAbstractAudioInput { Q_OBJECT public: bool isOpen; int periodSizeBytes; int internalBufferSize; qint64 totalFrames; QAudioFormat audioFormat; QIODevice* audioIO; AudioUnit audioUnit; AudioDeviceID audioDeviceId; Float64 clockFrequency; UInt64 startTime; QAudio::Error errorCode; QAudio::State stateCode; QtMultimediaInternal::QAudioInputBuffer* audioBuffer; QMutex mutex; QWaitCondition threadFinished; QAtomicInt audioThreadState; QTimer* intervalTimer; AudioStreamBasicDescription streamFormat; AudioStreamBasicDescription deviceFormat; QAbstractAudioDeviceInfo *audioDeviceInfo; qreal m_volume; QAudioInputPrivate(const QByteArray& device); ~QAudioInputPrivate(); bool open(); void close(); QAudioFormat format() const; void setFormat(const QAudioFormat& fmt); QIODevice* start(); void start(QIODevice* device); void stop(); void reset(); void suspend(); void resume(); void idle(); int bytesReady() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; qreal volume() const; void setVolume(qreal volume); void audioThreadStart(); void audioThreadStop(); void audioDeviceStop(); void audioDeviceActive(); void audioDeviceFull(); void audioDeviceError(); void startTimers(); void stopTimers(); private slots: void deviceStopped(); private: enum { Running, Stopped }; // Input callback static OSStatus inputCallback(void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData); }; QT_END_NAMESPACE #endif // QAUDIOINPUT_MAC_P_H qaudioinput_win32_p.cpp000066400000000000000000000536231225012771600331620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include "qaudioinput_win32_p.h" QT_BEGIN_NAMESPACE //#define DEBUG_AUDIO 1 QAudioInputPrivate::QAudioInputPrivate(const QByteArray &device) { bytesAvailable = 0; buffer_size = 0; period_size = 0; m_device = device; totalTimeValue = 0; intervalTime = 1000; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; resuming = false; finished = false; waveBlockOffset = 0; mixerID = 0; memset(&mixerLineControls, 0, sizeof(mixerLineControls)); initMixer(); } QAudioInputPrivate::~QAudioInputPrivate() { stop(); closeMixer(); } void QT_WIN_CALLBACK QAudioInputPrivate::waveInProc( HWAVEIN hWaveIn, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ) { Q_UNUSED(dwParam1) Q_UNUSED(dwParam2) Q_UNUSED(hWaveIn) QAudioInputPrivate* qAudio; qAudio = (QAudioInputPrivate*)(dwInstance); if(!qAudio) return; QMutexLocker(&qAudio->mutex); switch(uMsg) { case WIM_OPEN: break; case WIM_DATA: if(qAudio->waveFreeBlockCount > 0) qAudio->waveFreeBlockCount--; qAudio->feedback(); break; case WIM_CLOSE: qAudio->finished = true; break; default: return; } } WAVEHDR* QAudioInputPrivate::allocateBlocks(int size, int count) { int i; unsigned char* buffer; WAVEHDR* blocks; DWORD totalBufferSize = (size + sizeof(WAVEHDR))*count; if((buffer=(unsigned char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, totalBufferSize)) == 0) { qWarning("QAudioInput: Memory allocation error"); return 0; } blocks = (WAVEHDR*)buffer; buffer += sizeof(WAVEHDR)*count; for(i = 0; i < count; i++) { blocks[i].dwBufferLength = size; blocks[i].lpData = (LPSTR)buffer; blocks[i].dwBytesRecorded=0; blocks[i].dwUser = 0L; blocks[i].dwFlags = 0L; blocks[i].dwLoops = 0L; result = waveInPrepareHeader(hWaveIn,&blocks[i], sizeof(WAVEHDR)); if(result != MMSYSERR_NOERROR) { qWarning("QAudioInput: Can't prepare block %d",i); return 0; } buffer += size; } return blocks; } void QAudioInputPrivate::freeBlocks(WAVEHDR* blockArray) { WAVEHDR* blocks = blockArray; int count = buffer_size/period_size; for(int i = 0; i < count; i++) { waveInUnprepareHeader(hWaveIn,blocks, sizeof(WAVEHDR)); blocks++; } HeapFree(GetProcessHeap(), 0, blockArray); } QAudio::Error QAudioInputPrivate::error() const { return errorState; } QAudio::State QAudioInputPrivate::state() const { return deviceState; } #ifndef DRVM_MAPPER_CONSOLEVOICECOM_GET #ifndef DRVM_MAPPER #define DRVM_MAPPER 0x2000 #endif #ifndef DRVM_MAPPER_STATUS #define DRVM_MAPPER_STATUS (DRVM_MAPPER+0) #endif #define DRVM_USER 0x4000 #define DRVM_MAPPER_RECONFIGURE (DRVM_MAPPER+1) #define DRVM_MAPPER_PREFERRED_GET (DRVM_MAPPER+21) #define DRVM_MAPPER_CONSOLEVOICECOM_GET (DRVM_MAPPER+23) #endif void QAudioInputPrivate::setVolume(qreal volume) { for (DWORD i = 0; i < mixerLineControls.cControls; i++) { MIXERCONTROLDETAILS controlDetails; controlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS); controlDetails.dwControlID = mixerLineControls.pamxctrl[i].dwControlID; controlDetails.cChannels = 1; if ((mixerLineControls.pamxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_FADER) || (mixerLineControls.pamxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)) { MIXERCONTROLDETAILS_UNSIGNED controlDetailsUnsigned; controlDetailsUnsigned.dwValue = qBound(DWORD(0), DWORD(65535.0 * volume + 0.5), DWORD(65535)); controlDetails.cMultipleItems = 0; controlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); controlDetails.paDetails = &controlDetailsUnsigned; mixerSetControlDetails(mixerID, &controlDetails, MIXER_SETCONTROLDETAILSF_VALUE); } } } qreal QAudioInputPrivate::volume() const { DWORD volume = 0; for (DWORD i = 0; i < mixerLineControls.cControls; i++) { if ((mixerLineControls.pamxctrl[i].dwControlType != MIXERCONTROL_CONTROLTYPE_FADER) && (mixerLineControls.pamxctrl[i].dwControlType != MIXERCONTROL_CONTROLTYPE_VOLUME)) { continue; } MIXERCONTROLDETAILS controlDetails; controlDetails.cbStruct = sizeof(controlDetails); controlDetails.dwControlID = mixerLineControls.pamxctrl[i].dwControlID; controlDetails.cChannels = 1; controlDetails.cMultipleItems = 0; controlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); MIXERCONTROLDETAILS_UNSIGNED detailsUnsigned; controlDetails.paDetails = &detailsUnsigned; memset(controlDetails.paDetails, 0, controlDetails.cbDetails); MMRESULT result = mixerGetControlDetails(mixerID, &controlDetails, MIXER_GETCONTROLDETAILSF_VALUE); if (result != MMSYSERR_NOERROR) continue; if (controlDetails.cbDetails < sizeof(MIXERCONTROLDETAILS_UNSIGNED)) continue; volume = detailsUnsigned.dwValue; break; } return volume / 65535.0; } void QAudioInputPrivate::setFormat(const QAudioFormat& fmt) { if (deviceState == QAudio::StoppedState) settings = fmt; } QAudioFormat QAudioInputPrivate::format() const { return settings; } void QAudioInputPrivate::start(QIODevice* device) { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = true; audioSource = device; deviceState = QAudio::ActiveState; if(!open()) return; emit stateChanged(deviceState); } QIODevice* QAudioInputPrivate::start() { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = false; audioSource = new InputPrivate(this); audioSource->open(QIODevice::ReadOnly | QIODevice::Unbuffered); deviceState = QAudio::IdleState; if(!open()) return 0; emit stateChanged(deviceState); return audioSource; } void QAudioInputPrivate::stop() { if(deviceState == QAudio::StoppedState) return; close(); emit stateChanged(deviceState); } bool QAudioInputPrivate::open() { #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()< 96000) { qWarning("QAudioInput: open error, sample rate out of range (%d).", settings.sampleRate()); } else if (buffer_size == 0) { buffer_size = (settings.sampleRate() * settings.channelCount() * settings.sampleSize() + 39) / 40; period_size = buffer_size / 5; } else { period_size = buffer_size / 5; } if (period_size == 0) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); return false; } timeStamp.restart(); elapsedTimeOffset = 0; wfx.nSamplesPerSec = settings.sampleRate(); wfx.wBitsPerSample = settings.sampleSize(); wfx.nChannels = settings.channelCount(); wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels; wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec; QDataStream ds(&m_device, QIODevice::ReadOnly); quint32 deviceId; ds >> deviceId; if (waveInOpen(&hWaveIn, UINT_PTR(deviceId), &wfx, (DWORD_PTR)&waveInProc, (DWORD_PTR) this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); qWarning("QAudioInput: failed to open audio device"); return false; } waveBlocks = allocateBlocks(period_size, buffer_size/period_size); waveBlockOffset = 0; if(waveBlocks == 0) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); qWarning("QAudioInput: failed to allocate blocks. open failed"); return false; } mutex.lock(); waveFreeBlockCount = buffer_size/period_size; mutex.unlock(); for(int i=0; i> inputDevice; if (int(inputDevice) < 0) return; // Get the Mixer ID from the Sound Device ID UINT mixerIntID = 0; if (mixerGetID((HMIXEROBJ)(quintptr(inputDevice)), &mixerIntID, MIXER_OBJECTF_WAVEIN) != MMSYSERR_NOERROR) return; mixerID = (HMIXEROBJ)mixerIntID; // Get the Destination (Recording) Line Infomation MIXERLINE mixerLine; mixerLine.cbStruct = sizeof(MIXERLINE); mixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; if (mixerGetLineInfo(mixerID, &mixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR) return; // Set all the Destination (Recording) Line Controls if (mixerLine.cControls > 0) { mixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS); mixerLineControls.dwLineID = mixerLine.dwLineID; mixerLineControls.cControls = mixerLine.cControls; mixerLineControls.cbmxctrl = sizeof(MIXERCONTROL); mixerLineControls.pamxctrl = new MIXERCONTROL[mixerLineControls.cControls]; if (mixerGetLineControls(mixerID, &mixerLineControls, MIXER_GETLINECONTROLSF_ALL) != MMSYSERR_NOERROR) closeMixer(); } } void QAudioInputPrivate::closeMixer() { delete[] mixerLineControls.pamxctrl; memset(&mixerLineControls, 0, sizeof(mixerLineControls)); } int QAudioInputPrivate::bytesReady() const { if(period_size == 0 || buffer_size == 0) return 0; int buf = ((buffer_size/period_size)-waveFreeBlockCount)*period_size; if(buf < 0) buf = 0; return buf; } qint64 QAudioInputPrivate::read(char* data, qint64 len) { bool done = false; char* p = data; qint64 l = 0; qint64 written = 0; while(!done) { // Read in some audio data if(waveBlocks[header].dwBytesRecorded > 0 && waveBlocks[header].dwFlags & WHDR_DONE) { if(pullMode) { l = audioSource->write(waveBlocks[header].lpData + waveBlockOffset, waveBlocks[header].dwBytesRecorded - waveBlockOffset); #ifdef DEBUG_AUDIO qDebug()<<"IN: "<(len, waveBlocks[header].dwBytesRecorded - waveBlockOffset); // push mode memcpy(p, waveBlocks[header].lpData + waveBlockOffset, l); len -= l; #ifdef DEBUG_AUDIO qDebug()<<"IN: "<= buffer_size/period_size) header = 0; p+=l; mutex.lock(); if(!pullMode) { if(len < period_size || waveFreeBlockCount == buffer_size/period_size) done = true; } else { if(waveFreeBlockCount == buffer_size/period_size) done = true; } mutex.unlock(); } written+=l; } #ifdef DEBUG_AUDIO qDebug()<<"read in len="<(audioSource); a->trigger(); } if(intervalTime && (timeStamp.elapsed() + elapsedTimeOffset) > intervalTime) { emit notify(); elapsedTimeOffset = timeStamp.elapsed() + elapsedTimeOffset - intervalTime; timeStamp.restart(); } return true; } qint64 QAudioInputPrivate::elapsedUSecs() const { if (deviceState == QAudio::StoppedState) return 0; return timeStampOpened.elapsed()*1000; } void QAudioInputPrivate::reset() { stop(); if (period_size > 0) waveFreeBlockCount = buffer_size / period_size; } InputPrivate::InputPrivate(QAudioInputPrivate* audio) { audioDevice = qobject_cast(audio); } InputPrivate::~InputPrivate() {} qint64 InputPrivate::readData( char* data, qint64 len) { // push mode, user read() called if(audioDevice->deviceState != QAudio::ActiveState && audioDevice->deviceState != QAudio::IdleState) return 0; // Read in some audio data return audioDevice->read(data,len); } qint64 InputPrivate::writeData(const char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) emit readyRead(); return 0; } void InputPrivate::trigger() { emit readyRead(); } QT_END_NAMESPACE #include "moc_qaudioinput_win32_p.cpp" qaudioinput_win32_p.h000066400000000000000000000116521225012771600326230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIOINPUTWIN_H #define QAUDIOINPUTWIN_H #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE // For compat with 4.6 #if !defined(QT_WIN_CALLBACK) # if defined(Q_CC_MINGW) # define QT_WIN_CALLBACK CALLBACK __attribute__ ((force_align_arg_pointer)) # else # define QT_WIN_CALLBACK CALLBACK # endif #endif class QAudioInputPrivate : public QAbstractAudioInput { Q_OBJECT public: QAudioInputPrivate(const QByteArray &device); ~QAudioInputPrivate(); qint64 read(char* data, qint64 len); void setFormat(const QAudioFormat& fmt); QAudioFormat format() const; QIODevice* start(); void start(QIODevice* device); void stop(); void reset(); void suspend(); void resume(); int bytesReady() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void setVolume(qreal volume); qreal volume() const; QIODevice* audioSource; QAudioFormat settings; QAudio::Error errorState; QAudio::State deviceState; private: qint32 buffer_size; qint32 period_size; qint32 header; QByteArray m_device; int bytesAvailable; int intervalTime; QTime timeStamp; qint64 elapsedTimeOffset; QTime timeStampOpened; qint64 totalTimeValue; bool pullMode; bool resuming; WAVEFORMATEX wfx; HWAVEIN hWaveIn; MMRESULT result; WAVEHDR* waveBlocks; volatile bool finished; volatile int waveFreeBlockCount; int waveBlockOffset; QMutex mutex; static void QT_WIN_CALLBACK waveInProc( HWAVEIN hWaveIn, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ); WAVEHDR* allocateBlocks(int size, int count); void freeBlocks(WAVEHDR* blockArray); bool open(); void close(); void initMixer(); void closeMixer(); HMIXEROBJ mixerID; MIXERLINECONTROLS mixerLineControls; private slots: void feedback(); bool deviceReady(); signals: void processMore(); }; class InputPrivate : public QIODevice { Q_OBJECT public: InputPrivate(QAudioInputPrivate* audio); ~InputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); void trigger(); private: QAudioInputPrivate *audioDevice; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiooutput.cpp000066400000000000000000000313151225012771600320730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudio.h" #include "qaudiodeviceinfo.h" #include "qaudiosystem.h" #include "qaudiooutput.h" #include "qaudiodevicefactory_p.h" QT_BEGIN_NAMESPACE /*! \class QAudioOutput \brief The QAudioOutput class provides an interface for sending audio data to an audio output device. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio You can construct an audio output with the system's \l{QAudioDeviceInfo::defaultOutputDevice()}{default audio output device}. It is also possible to create QAudioOutput with a specific QAudioDeviceInfo. When you create the audio output, you should also send in the QAudioFormat to be used for the playback (see the QAudioFormat class description for details). To play a file: Starting to play an audio stream is simply a matter of calling start() with a QIODevice. QAudioOutput will then fetch the data it needs from the io device. So playing back an audio file is as simple as: \snippet multimedia-snippets/audio.cpp Audio output class members \snippet multimedia-snippets/audio.cpp Audio output setup The file will start playing assuming that the audio system and output device support it. If you run out of luck, check what's up with the error() function. After the file has finished playing, we need to stop the device: \snippet multimedia-snippets/audio.cpp Audio output state changed At any given time, the QAudioOutput will be in one of four states: active, suspended, stopped, or idle. These states are described by the QAudio::State enum. State changes are reported through the stateChanged() signal. You can use this signal to, for instance, update the GUI of the application; the mundane example here being changing the state of a \c { play/pause } button. You request a state change directly with suspend(), stop(), reset(), resume(), and start(). While the stream is playing, you can set a notify interval in milliseconds with setNotifyInterval(). This interval specifies the time between two emissions of the notify() signal. This is relative to the position in the stream, i.e., if the QAudioOutput is in the SuspendedState or the IdleState, the notify() signal is not emitted. A typical use-case would be to update a \l{QSlider}{slider} that allows seeking in the stream. If you want the time since playback started regardless of which states the audio output has been in, elapsedUSecs() is the function for you. If an error occurs, you can fetch the \l{QAudio::Error}{error type} with the error() function. Please see the QAudio::Error enum for a description of the possible errors that are reported. When an error is encountered, the state changes to QAudio::StoppedState. You can check for errors by connecting to the stateChanged() signal: \snippet multimedia-snippets/audio.cpp Audio output state changed \sa QAudioInput, QAudioDeviceInfo */ /*! Construct a new audio output and attach it to \a parent. The default audio output device is used with the output \a format parameters. */ QAudioOutput::QAudioOutput(const QAudioFormat &format, QObject *parent): QObject(parent) { d = QAudioDeviceFactory::createDefaultOutputDevice(format); connect(d, SIGNAL(notify()), SIGNAL(notify())); connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); } /*! Construct a new audio output and attach it to \a parent. The device referenced by \a audioDevice is used with the output \a format parameters. */ QAudioOutput::QAudioOutput(const QAudioDeviceInfo &audioDevice, const QAudioFormat &format, QObject *parent): QObject(parent) { d = QAudioDeviceFactory::createOutputDevice(audioDevice, format); connect(d, SIGNAL(notify()), SIGNAL(notify())); connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); } /*! Destroys this audio output. This will release any system resources used and free any buffers. */ QAudioOutput::~QAudioOutput() { delete d; } /*! Returns the QAudioFormat being used. */ QAudioFormat QAudioOutput::format() const { return d->format(); } /*! Starts transferring audio data from the \a device to the system's audio output. The \a device must have been opened in the \l{QIODevice::ReadOnly}{ReadOnly} or \l{QIODevice::ReadWrite}{ReadWrite} modes. If the QAudioOutput is able to successfully output audio data, state() returns QAudio::ActiveState, error() returns QAudio::NoError and the stateChanged() signal is emitted. If a problem occurs during this process, error() returns QAudio::OpenError, state() returns QAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ void QAudioOutput::start(QIODevice* device) { d->start(device); } /*! Returns a pointer to the internal QIODevice being used to transfer data to the system's audio output. The device will already be open and \l{QIODevice::write()}{write()} can write data directly to it. \note The pointer will become invalid after the stream is stopped or if you start another stream. If the QAudioOutput is able to access the system's audio device, state() returns QAudio::IdleState, error() returns QAudio::NoError and the stateChanged() signal is emitted. If a problem occurs during this process, error() returns QAudio::OpenError, state() returns QAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ QIODevice* QAudioOutput::start() { return d->start(); } /*! Stops the audio output, detaching from the system resource. Sets error() to QAudio::NoError, state() to QAudio::StoppedState and emit stateChanged() signal. */ void QAudioOutput::stop() { d->stop(); } /*! Drops all audio data in the buffers, resets buffers to zero. */ void QAudioOutput::reset() { d->reset(); } /*! Stops processing audio data, preserving buffered audio data. Sets error() to QAudio::NoError, state() to QAudio::SuspendedState and emits stateChanged() signal. */ void QAudioOutput::suspend() { d->suspend(); } /*! Resumes processing audio data after a suspend(). Sets error() to QAudio::NoError. Sets state() to QAudio::ActiveState if you previously called start(QIODevice*). Sets state() to QAudio::IdleState if you previously called start(). emits stateChanged() signal. */ void QAudioOutput::resume() { d->resume(); } /*! Returns the number of free bytes available in the audio buffer. \note The returned value is only valid while in QAudio::ActiveState or QAudio::IdleState state, otherwise returns zero. */ int QAudioOutput::bytesFree() const { return d->bytesFree(); } /*! Returns the period size in bytes. This is the amount of data required each period to prevent buffer underrun, and to ensure uninterrupted playback. \note It is recommended to provide at least enough data for a full period with each write operation. */ int QAudioOutput::periodSize() const { return d->periodSize(); } /*! Sets the audio buffer size to \a value in bytes. \note This function can be called anytime before start(). Calls to this are ignored after start(). It should not be assumed that the buffer size set is the actual buffer size used - call bufferSize() anytime after start() to return the actual buffer size being used. */ void QAudioOutput::setBufferSize(int value) { d->setBufferSize(value); } /*! Returns the audio buffer size in bytes. If called before start(), returns platform default value. If called before start() but setBufferSize() was called prior, returns value set by setBufferSize(). If called after start(), returns the actual buffer size being used. This may not be what was set previously by setBufferSize(). */ int QAudioOutput::bufferSize() const { return d->bufferSize(); } /*! Sets the interval for notify() signal to be emitted. This is based on the \a ms of audio data processed, not on wall clock time. The minimum resolution of the timer is platform specific and values should be checked with notifyInterval() to confirm the actual value being used. */ void QAudioOutput::setNotifyInterval(int ms) { d->setNotifyInterval(ms); } /*! Returns the notify interval in milliseconds. */ int QAudioOutput::notifyInterval() const { return d->notifyInterval(); } /*! Returns the amount of audio data processed since start() was called (in microseconds). */ qint64 QAudioOutput::processedUSecs() const { return d->processedUSecs(); } /*! Returns the microseconds since start() was called, including time in Idle and Suspend states. */ qint64 QAudioOutput::elapsedUSecs() const { return d->elapsedUSecs(); } /*! Returns the error state. */ QAudio::Error QAudioOutput::error() const { return d->error(); } /*! Returns the state of audio processing. */ QAudio::State QAudioOutput::state() const { return d->state(); } /*! Sets the volume. Where \a volume is between 0.0 and 1.0 inclusive. Note: Adjustments to the volume will change the volume of this audio stream, not the global volume. */ void QAudioOutput::setVolume(qreal volume) { d->setVolume(volume); } /*! Returns the volume between 0.0 and 1.0 inclusive. */ qreal QAudioOutput::volume() const { return d->volume(); } /*! Returns the audio category of this audio stream. Some platforms can group audio streams into categories and manage their volumes independently, or display them in a system mixer control. You can set this property to allow the platform to distinguish the purpose of your streams. \sa setCategory() */ QString QAudioOutput::category() const { return d->category(); } /*! Sets the audio category of this audio stream to \a category. Some platforms can group audio streams into categories and manage their volumes independently, or display them in a system mixer control. You can set this property to allow the platform to distinguish the purpose of your streams. Not all platforms support audio stream categorization. In this case, the function call will be ignored. Changing an audio output stream's category while it is opened will not take effect until it is reopened. \sa category() */ void QAudioOutput::setCategory(const QString &category) { d->setCategory(category); } /*! \fn QAudioOutput::stateChanged(QAudio::State state) This signal is emitted when the device \a state has changed. This is the current state of the audio output. */ /*! \fn QAudioOutput::notify() This signal is emitted when a certain interval of milliseconds of audio data has been processed. The interval is set by setNotifyInterval(). */ QT_END_NAMESPACE #include "moc_qaudiooutput.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiooutput.h000066400000000000000000000065461225012771600315500ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOOUTPUT_H #define QAUDIOOUTPUT_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractAudioOutput; class Q_MULTIMEDIA_EXPORT QAudioOutput : public QObject { Q_OBJECT public: explicit QAudioOutput(const QAudioFormat &format = QAudioFormat(), QObject *parent = 0); explicit QAudioOutput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = 0); ~QAudioOutput(); QAudioFormat format() const; void start(QIODevice *device); QIODevice* start(); void stop(); void reset(); void suspend(); void resume(); void setBufferSize(int bytes); int bufferSize() const; int bytesFree() const; int periodSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void setVolume(qreal); qreal volume() const; QString category() const; void setCategory(const QString &category); Q_SIGNALS: void stateChanged(QAudio::State); void notify(); private: Q_DISABLE_COPY(QAudioOutput) QAbstractAudioOutput* d; }; QT_END_NAMESPACE #endif // QAUDIOOUTPUT_H qaudiooutput_alsa_p.cpp000066400000000000000000000616311225012771600333370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include "qaudiooutput_alsa_p.h" #include "qaudiodeviceinfo_alsa_p.h" #include "qaudiohelpers_p.h" QT_BEGIN_NAMESPACE //#define DEBUG_AUDIO 1 QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device) { bytesAvailable = 0; handle = 0; ahandler = 0; access = SND_PCM_ACCESS_RW_INTERLEAVED; pcmformat = SND_PCM_FORMAT_S16; buffer_frames = 0; period_frames = 0; buffer_size = 0; period_size = 0; buffer_time = 100000; period_time = 20000; totalTimeValue = 0; intervalTime = 1000; audioBuffer = 0; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; resuming = false; opened = false; m_volume = 1.0f; m_device = device; timer = new QTimer(this); connect(timer,SIGNAL(timeout()),SLOT(userFeed())); } QAudioOutputPrivate::~QAudioOutputPrivate() { close(); disconnect(timer, SIGNAL(timeout())); QCoreApplication::processEvents(); delete timer; } void QAudioOutputPrivate::setVolume(qreal vol) { m_volume = vol; } qreal QAudioOutputPrivate::volume() const { return m_volume; } QAudio::Error QAudioOutputPrivate::error() const { return errorState; } QAudio::State QAudioOutputPrivate::state() const { return deviceState; } void QAudioOutputPrivate::async_callback(snd_async_handler_t *ahandler) { QAudioOutputPrivate* audioOut; audioOut = static_cast (snd_async_handler_get_callback_private(ahandler)); if((audioOut->deviceState==QAudio::ActiveState)||(audioOut->resuming)) audioOut->feedback(); } int QAudioOutputPrivate::xrun_recovery(int err) { int count = 0; bool reset = false; if(err == -EPIPE) { errorState = QAudio::UnderrunError; emit errorChanged(errorState); err = snd_pcm_prepare(handle); if(err < 0) reset = true; } else if((err == -ESTRPIPE)||(err == -EIO)) { errorState = QAudio::IOError; emit errorChanged(errorState); while((err = snd_pcm_resume(handle)) == -EAGAIN){ usleep(100); count++; if(count > 5) { reset = true; break; } } if(err < 0) { err = snd_pcm_prepare(handle); if(err < 0) reset = true; } } if(reset) { close(); open(); snd_pcm_prepare(handle); return 0; } return err; } int QAudioOutputPrivate::setFormat() { snd_pcm_format_t pcmformat = SND_PCM_FORMAT_UNKNOWN; if(settings.sampleSize() == 8) { pcmformat = SND_PCM_FORMAT_U8; } else if(settings.sampleSize() == 16) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_S16_LE; else pcmformat = SND_PCM_FORMAT_S16_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_U16_LE; else pcmformat = SND_PCM_FORMAT_U16_BE; } } else if(settings.sampleSize() == 24) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_S24_LE; else pcmformat = SND_PCM_FORMAT_S24_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_U24_LE; else pcmformat = SND_PCM_FORMAT_U24_BE; } } else if(settings.sampleSize() == 32) { if(settings.sampleType() == QAudioFormat::SignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_S32_LE; else pcmformat = SND_PCM_FORMAT_S32_BE; } else if(settings.sampleType() == QAudioFormat::UnSignedInt) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_U32_LE; else pcmformat = SND_PCM_FORMAT_U32_BE; } else if(settings.sampleType() == QAudioFormat::Float) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_FLOAT_LE; else pcmformat = SND_PCM_FORMAT_FLOAT_BE; } } else if(settings.sampleSize() == 64) { if(settings.byteOrder() == QAudioFormat::LittleEndian) pcmformat = SND_PCM_FORMAT_FLOAT64_LE; else pcmformat = SND_PCM_FORMAT_FLOAT64_BE; } return pcmformat != SND_PCM_FORMAT_UNKNOWN ? snd_pcm_hw_params_set_format( handle, hwparams, pcmformat) : -1; } void QAudioOutputPrivate::start(QIODevice* device) { if(deviceState != QAudio::StoppedState) deviceState = QAudio::StoppedState; errorState = QAudio::NoError; // Handle change of mode if(audioSource && !pullMode) { delete audioSource; audioSource = 0; } close(); pullMode = true; audioSource = device; deviceState = QAudio::ActiveState; open(); emit stateChanged(deviceState); } QIODevice* QAudioOutputPrivate::start() { if(deviceState != QAudio::StoppedState) deviceState = QAudio::StoppedState; errorState = QAudio::NoError; // Handle change of mode if(audioSource && !pullMode) { delete audioSource; audioSource = 0; } close(); audioSource = new OutputPrivate(this); audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); pullMode = false; deviceState = QAudio::IdleState; open(); emit stateChanged(deviceState); return audioSource; } void QAudioOutputPrivate::stop() { if(deviceState == QAudio::StoppedState) return; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; close(); emit stateChanged(deviceState); } bool QAudioOutputPrivate::open() { if(opened) return true; #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()< devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioOutput); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) if (devices.size() > 0) dev = QLatin1String(devices.first()); else return false; #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = QLatin1String(m_device); #else int idx = 0; char *name; QString shortName = QLatin1String(m_device.mid(m_device.indexOf('=',0)+1).constData()); while(snd_card_get_name(idx,&name) == 0) { if(qstrncmp(shortName.toLocal8Bit().constData(),name,shortName.length()) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } // Step 1: try and open the device while((count < 5) && (err < 0)) { err=snd_pcm_open(&handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); if(err < 0) count++; } if (( err < 0)||(handle == 0)) { errorState = QAudio::OpenError; emit errorChanged(errorState); deviceState = QAudio::StoppedState; return false; } snd_pcm_nonblock( handle, 0 ); // Step 2: Set the desired HW parameters. snd_pcm_hw_params_alloca( &hwparams ); bool fatal = false; QString errMessage; unsigned int chunks = 8; err = snd_pcm_hw_params_any( handle, hwparams ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_any: err = %1").arg(err); } if ( !fatal ) { err = snd_pcm_hw_params_set_rate_resample( handle, hwparams, 1 ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_set_rate_resample: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_access( handle, hwparams, access ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_set_access: err = %1").arg(err); } } if ( !fatal ) { err = setFormat(); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_set_format: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_channels( handle, hwparams, (unsigned int)settings.channelCount() ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_set_channels: err = %1").arg(err); } } if ( !fatal ) { err = snd_pcm_hw_params_set_rate_near( handle, hwparams, &sampleRate, 0 ); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: snd_pcm_hw_params_set_rate_near: err = %1").arg(err); } } if ( !fatal ) { unsigned int maxBufferTime = 0; unsigned int minBufferTime = 0; unsigned int maxPeriodTime = 0; unsigned int minPeriodTime = 0; err = snd_pcm_hw_params_get_buffer_time_max(hwparams, &maxBufferTime, &dir); if ( err >= 0) err = snd_pcm_hw_params_get_buffer_time_min(hwparams, &minBufferTime, &dir); if ( err >= 0) err = snd_pcm_hw_params_get_period_time_max(hwparams, &maxPeriodTime, &dir); if ( err >= 0) err = snd_pcm_hw_params_get_period_time_min(hwparams, &minPeriodTime, &dir); if ( err < 0 ) { fatal = true; errMessage = QString::fromLatin1("QAudioOutput: buffer/period min and max: err = %1").arg(err); } else { if (maxBufferTime < buffer_time || buffer_time < minBufferTime || maxPeriodTime < period_time || minPeriodTime > period_time) { #ifdef DEBUG_AUDIO qDebug()<<"defaults out of range"; qDebug()<<"pmin="<start(period_time/1000); clockStamp.restart(); timeStamp.restart(); elapsedTimeOffset = 0; errorState = QAudio::NoError; totalTimeValue = 0; opened = true; return true; } void QAudioOutputPrivate::close() { timer->stop(); if ( handle ) { snd_pcm_drain( handle ); snd_pcm_close( handle ); handle = 0; delete [] audioBuffer; audioBuffer=0; } if(!pullMode && audioSource) { delete audioSource; audioSource = 0; } opened = false; } int QAudioOutputPrivate::bytesFree() const { if(resuming) return period_size; if(deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return 0; int frames = snd_pcm_avail_update(handle); if (frames == -EPIPE) { // Try and handle buffer underrun int err = snd_pcm_recover(handle, frames, 0); if (err < 0) return 0; else frames = snd_pcm_avail_update(handle); } else if (frames < 0) { return 0; } if ((int)frames > (int)buffer_frames) frames = buffer_frames; return snd_pcm_frames_to_bytes(handle, frames); } qint64 QAudioOutputPrivate::write( const char *data, qint64 len ) { // Write out some audio data if ( !handle ) return 0; #ifdef DEBUG_AUDIO qDebug()<<"frames to write out = "<< snd_pcm_bytes_to_frames( handle, (int)len )<<" ("< 0) { totalTimeValue += err; resuming = false; errorState = QAudio::NoError; if (deviceState != QAudio::ActiveState) { deviceState = QAudio::ActiveState; emit stateChanged(deviceState); } return snd_pcm_frames_to_bytes( handle, err ); } else err = xrun_recovery(err); if(err < 0) { close(); errorState = QAudio::FatalError; emit errorChanged(errorState); deviceState = QAudio::StoppedState; emit stateChanged(deviceState); } return 0; } int QAudioOutputPrivate::periodSize() const { return period_size; } void QAudioOutputPrivate::setBufferSize(int value) { if(deviceState == QAudio::StoppedState) buffer_size = value; } int QAudioOutputPrivate::bufferSize() const { return buffer_size; } void QAudioOutputPrivate::setNotifyInterval(int ms) { intervalTime = qMax(0, ms); } int QAudioOutputPrivate::notifyInterval() const { return intervalTime; } qint64 QAudioOutputPrivate::processedUSecs() const { return qint64(1000000) * totalTimeValue / settings.sampleRate(); } void QAudioOutputPrivate::resume() { if(deviceState == QAudio::SuspendedState) { int err = 0; if(handle) { err = snd_pcm_prepare( handle ); if(err < 0) xrun_recovery(err); err = snd_pcm_start(handle); if(err < 0) xrun_recovery(err); bytesAvailable = (int)snd_pcm_frames_to_bytes(handle, buffer_frames); } resuming = true; deviceState = QAudio::ActiveState; errorState = QAudio::NoError; timer->start(period_time/1000); emit stateChanged(deviceState); } } void QAudioOutputPrivate::setFormat(const QAudioFormat& fmt) { if (deviceState == QAudio::StoppedState) settings = fmt; } QAudioFormat QAudioOutputPrivate::format() const { return settings; } void QAudioOutputPrivate::suspend() { if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState || resuming) { timer->stop(); deviceState = QAudio::SuspendedState; errorState = QAudio::NoError; emit stateChanged(deviceState); } } void QAudioOutputPrivate::userFeed() { if(deviceState == QAudio::StoppedState || deviceState == QAudio::SuspendedState) return; #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()< #include #include #include #include #include #include #include "qaudio.h" #include "qaudiodeviceinfo.h" #include "qaudiosystem.h" QT_BEGIN_NAMESPACE class OutputPrivate; class QAudioOutputPrivate : public QAbstractAudioOutput { friend class OutputPrivate; Q_OBJECT public: QAudioOutputPrivate(const QByteArray &device); ~QAudioOutputPrivate(); qint64 write( const char *data, qint64 len ); void start(QIODevice* device); QIODevice* start(); void stop(); void reset(); void suspend(); void resume(); int bytesFree() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void setFormat(const QAudioFormat& fmt); QAudioFormat format() const; void setVolume(qreal); qreal volume() const; QIODevice* audioSource; QAudioFormat settings; QAudio::Error errorState; QAudio::State deviceState; private slots: void userFeed(); void feedback(); void updateAvailable(); bool deviceReady(); signals: void processMore(); private: bool opened; bool pullMode; bool resuming; int buffer_size; int period_size; int intervalTime; qint64 totalTimeValue; unsigned int buffer_time; unsigned int period_time; snd_pcm_uframes_t buffer_frames; snd_pcm_uframes_t period_frames; static void async_callback(snd_async_handler_t *ahandler); int xrun_recovery(int err); int setFormat(); bool open(); void close(); QTimer* timer; QByteArray m_device; int bytesAvailable; QTime timeStamp; QTime clockStamp; qint64 elapsedTimeOffset; char* audioBuffer; snd_pcm_t* handle; snd_async_handler_t* ahandler; snd_pcm_access_t access; snd_pcm_format_t pcmformat; snd_timestamp_t* timestamp; snd_pcm_hw_params_t *hwparams; qreal m_volume; }; class OutputPrivate : public QIODevice { friend class QAudioOutputPrivate; Q_OBJECT public: OutputPrivate(QAudioOutputPrivate* audio); ~OutputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); private: QAudioOutputPrivate *audioDevice; }; QT_END_NAMESPACE #endif qaudiooutput_mac_p.cpp000066400000000000000000000504311225012771600331530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include #include #include #include #include #include #include #include #include "qaudio_mac_p.h" #include "qaudiooutput_mac_p.h" #include "qaudiodeviceinfo_mac_p.h" QT_BEGIN_NAMESPACE namespace QtMultimediaInternal { static const int default_buffer_size = 8 * 1024; class QAudioOutputBuffer : public QObject { Q_OBJECT public: QAudioOutputBuffer(int bufferSize, int maxPeriodSize, QAudioFormat const& audioFormat): m_deviceError(false), m_maxPeriodSize(maxPeriodSize), m_device(0) { m_buffer = new QAudioRingBuffer(bufferSize + (bufferSize % maxPeriodSize == 0 ? 0 : maxPeriodSize - (bufferSize % maxPeriodSize))); m_bytesPerFrame = (audioFormat.sampleSize() / 8) * audioFormat.channelCount(); m_periodTime = m_maxPeriodSize / m_bytesPerFrame * 1000 / audioFormat.sampleRate(); m_fillTimer = new QTimer(this); connect(m_fillTimer, SIGNAL(timeout()), SLOT(fillBuffer())); } ~QAudioOutputBuffer() { delete m_buffer; } qint64 readFrames(char* data, qint64 maxFrames) { bool wecan = true; qint64 framesRead = 0; while (wecan && framesRead < maxFrames) { QAudioRingBuffer::Region region = m_buffer->acquireReadRegion((maxFrames - framesRead) * m_bytesPerFrame); if (region.second > 0) { // Ensure that we only read whole frames. region.second -= region.second % m_bytesPerFrame; if (region.second > 0) { memcpy(data + (framesRead * m_bytesPerFrame), region.first, region.second); framesRead += region.second / m_bytesPerFrame; } else wecan = false; // If there is only a partial frame left we should exit. } else wecan = false; m_buffer->releaseReadRegion(region); } if (framesRead == 0 && m_deviceError) framesRead = -1; return framesRead; } qint64 writeBytes(const char* data, qint64 maxSize) { bool wecan = true; qint64 bytesWritten = 0; maxSize -= maxSize % m_bytesPerFrame; while (wecan && bytesWritten < maxSize) { QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(maxSize - bytesWritten); if (region.second > 0) { memcpy(region.first, data + bytesWritten, region.second); bytesWritten += region.second; } else wecan = false; m_buffer->releaseWriteRegion(region); } if (bytesWritten > 0) emit readyRead(); return bytesWritten; } int available() const { return m_buffer->free(); } void reset() { m_buffer->reset(); m_device = 0; m_deviceError = false; } void setPrefetchDevice(QIODevice* device) { if (m_device != device) { m_device = device; if (m_device != 0) fillBuffer(); } } void startFillTimer() { if (m_device != 0) m_fillTimer->start(m_buffer->size() / 2 / m_maxPeriodSize * m_periodTime); } void stopFillTimer() { m_fillTimer->stop(); } signals: void readyRead(); private slots: void fillBuffer() { const int free = m_buffer->free(); const int writeSize = free - (free % m_maxPeriodSize); if (writeSize > 0) { bool wecan = true; int filled = 0; while (!m_deviceError && wecan && filled < writeSize) { QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(writeSize - filled); if (region.second > 0) { region.second = m_device->read(region.first, region.second); if (region.second > 0) filled += region.second; else if (region.second == 0) wecan = false; else if (region.second < 0) { m_fillTimer->stop(); region.second = 0; m_deviceError = true; } } else wecan = false; m_buffer->releaseWriteRegion(region); } if (filled > 0) emit readyRead(); } } private: bool m_deviceError; int m_maxPeriodSize; int m_bytesPerFrame; int m_periodTime; QIODevice* m_device; QTimer* m_fillTimer; QAudioRingBuffer* m_buffer; }; } class MacOutputDevice : public QIODevice { Q_OBJECT public: MacOutputDevice(QtMultimediaInternal::QAudioOutputBuffer* audioBuffer, QObject* parent): QIODevice(parent), m_audioBuffer(audioBuffer) { open(QIODevice::WriteOnly | QIODevice::Unbuffered); } qint64 readData(char* data, qint64 len) { Q_UNUSED(data); Q_UNUSED(len); return 0; } qint64 writeData(const char* data, qint64 len) { return m_audioBuffer->writeBytes(data, len); } bool isSequential() const { return true; } private: QtMultimediaInternal::QAudioOutputBuffer* m_audioBuffer; }; QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray& device) { QDataStream ds(device); quint32 did, mode; ds >> did >> mode; if (QAudio::Mode(mode) == QAudio::AudioInput) errorCode = QAudio::OpenError; else { audioDeviceInfo = new QAudioDeviceInfoInternal(device, QAudio::AudioOutput); isOpen = false; audioDeviceId = AudioDeviceID(did); audioUnit = 0; audioIO = 0; startTime = 0; totalFrames = 0; audioBuffer = 0; internalBufferSize = QtMultimediaInternal::default_buffer_size; clockFrequency = AudioGetHostClockFrequency() / 1000; errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; audioThreadState.store(Stopped); cachedVolume = (qreal)1.; intervalTimer = new QTimer(this); intervalTimer->setInterval(1000); connect(intervalTimer, SIGNAL(timeout()), SIGNAL(notify())); } } QAudioOutputPrivate::~QAudioOutputPrivate() { delete audioDeviceInfo; close(); } bool QAudioOutputPrivate::open() { if (errorCode != QAudio::NoError) return false; if (isOpen) return true; ComponentDescription cd; cd.componentType = kAudioUnitType_Output; cd.componentSubType = kAudioUnitSubType_HALOutput; cd.componentManufacturer = kAudioUnitManufacturer_Apple; cd.componentFlags = 0; cd.componentFlagsMask = 0; // Open Component cp = FindNextComponent(NULL, &cd); if (cp == 0) { qWarning() << "QAudioOutput: Failed to find HAL Output component"; return false; } if (OpenAComponent(cp, &audioUnit) != noErr) { qWarning() << "QAudioOutput: Unable to Open Output Component"; return false; } // register callback AURenderCallbackStruct cb; cb.inputProc = renderCallback; cb.inputProcRefCon = this; if (AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &cb, sizeof(cb)) != noErr) { qWarning() << "QAudioOutput: Failed to set AudioUnit callback"; return false; } // Set Audio Device if (AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &audioDeviceId, sizeof(audioDeviceId)) != noErr) { qWarning() << "QAudioOutput: Unable to use configured device"; return false; } // Set stream format streamFormat = toAudioStreamBasicDescription(audioFormat); UInt32 size = sizeof(streamFormat); if (AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(streamFormat)) != noErr) { qWarning() << "QAudioOutput: Unable to Set Stream information"; return false; } // Allocate buffer UInt32 numberOfFrames = 0; size = sizeof(UInt32); if (AudioUnitGetProperty(audioUnit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, &numberOfFrames, &size) != noErr) { qWarning() << "QAudioInput: Failed to get audio period size"; return false; } periodSizeBytes = numberOfFrames * streamFormat.mBytesPerFrame; if (internalBufferSize < periodSizeBytes * 2) internalBufferSize = periodSizeBytes * 2; else internalBufferSize -= internalBufferSize % streamFormat.mBytesPerFrame; audioBuffer = new QtMultimediaInternal::QAudioOutputBuffer(internalBufferSize, periodSizeBytes, audioFormat); connect(audioBuffer, SIGNAL(readyRead()), SLOT(inputReady())); // Pull audioIO = new MacOutputDevice(audioBuffer, this); // Init if (AudioUnitInitialize(audioUnit)) { qWarning() << "QAudioOutput: Failed to initialize AudioUnit"; return false; } isOpen = true; setVolume(cachedVolume); return true; } void QAudioOutputPrivate::close() { if (audioUnit != 0) { AudioOutputUnitStop(audioUnit); AudioUnitUninitialize(audioUnit); CloseComponent(audioUnit); } delete audioBuffer; } QAudioFormat QAudioOutputPrivate::format() const { return audioFormat; } void QAudioOutputPrivate::setFormat(const QAudioFormat& fmt) { if (stateCode == QAudio::StoppedState) audioFormat = fmt; } void QAudioOutputPrivate::start(QIODevice* device) { QIODevice* op = device; if (!audioDeviceInfo->isFormatSupported(audioFormat) || !open()) { stateCode = QAudio::StoppedState; errorCode = QAudio::OpenError; } reset(); audioBuffer->reset(); audioBuffer->setPrefetchDevice(op); if (op == 0) { op = audioIO; stateCode = QAudio::IdleState; } else stateCode = QAudio::ActiveState; // Start errorCode = QAudio::NoError; totalFrames = 0; startTime = AudioGetCurrentHostTime(); if (stateCode == QAudio::ActiveState) audioThreadStart(); emit stateChanged(stateCode); } QIODevice* QAudioOutputPrivate::start() { if (!audioDeviceInfo->isFormatSupported(audioFormat) || !open()) { stateCode = QAudio::StoppedState; errorCode = QAudio::OpenError; return audioIO; } reset(); audioBuffer->reset(); audioBuffer->setPrefetchDevice(0); stateCode = QAudio::IdleState; // Start errorCode = QAudio::NoError; totalFrames = 0; startTime = AudioGetCurrentHostTime(); emit stateChanged(stateCode); return audioIO; } void QAudioOutputPrivate::stop() { QMutexLocker lock(&mutex); if (stateCode != QAudio::StoppedState) { audioThreadDrain(); stateCode = QAudio::StoppedState; errorCode = QAudio::NoError; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioOutputPrivate::reset() { QMutexLocker lock(&mutex); if (stateCode != QAudio::StoppedState) { audioThreadStop(); stateCode = QAudio::StoppedState; errorCode = QAudio::NoError; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioOutputPrivate::suspend() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState || stateCode == QAudio::IdleState) { audioThreadStop(); stateCode = QAudio::SuspendedState; errorCode = QAudio::NoError; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } void QAudioOutputPrivate::resume() { QMutexLocker lock(&mutex); if (stateCode == QAudio::SuspendedState) { audioThreadStart(); stateCode = QAudio::ActiveState; errorCode = QAudio::NoError; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } int QAudioOutputPrivate::bytesFree() const { return audioBuffer->available(); } int QAudioOutputPrivate::periodSize() const { return periodSizeBytes; } void QAudioOutputPrivate::setBufferSize(int bs) { if (stateCode == QAudio::StoppedState) internalBufferSize = bs; } int QAudioOutputPrivate::bufferSize() const { return internalBufferSize; } void QAudioOutputPrivate::setNotifyInterval(int milliSeconds) { if (intervalTimer->interval() == milliSeconds) return; if (milliSeconds <= 0) milliSeconds = 0; intervalTimer->setInterval(milliSeconds); } int QAudioOutputPrivate::notifyInterval() const { return intervalTimer->interval(); } qint64 QAudioOutputPrivate::processedUSecs() const { return totalFrames * 1000000 / audioFormat.sampleRate(); } qint64 QAudioOutputPrivate::elapsedUSecs() const { if (stateCode == QAudio::StoppedState) return 0; return (AudioGetCurrentHostTime() - startTime) / (clockFrequency / 1000); } QAudio::Error QAudioOutputPrivate::error() const { return errorCode; } QAudio::State QAudioOutputPrivate::state() const { return stateCode; } void QAudioOutputPrivate::audioThreadStart() { startTimers(); audioThreadState.store(Running); AudioOutputUnitStart(audioUnit); } void QAudioOutputPrivate::audioThreadStop() { stopTimers(); if (audioThreadState.testAndSetAcquire(Running, Stopped)) threadFinished.wait(&mutex); } void QAudioOutputPrivate::audioThreadDrain() { stopTimers(); if (audioThreadState.testAndSetAcquire(Running, Draining)) threadFinished.wait(&mutex); } void QAudioOutputPrivate::audioDeviceStop() { AudioOutputUnitStop(audioUnit); audioThreadState.store(Stopped); threadFinished.wakeOne(); } void QAudioOutputPrivate::audioDeviceIdle() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState) { audioDeviceStop(); errorCode = QAudio::UnderrunError; stateCode = QAudio::IdleState; QMetaObject::invokeMethod(this, "deviceStopped", Qt::QueuedConnection); } } void QAudioOutputPrivate::audioDeviceError() { QMutexLocker lock(&mutex); if (stateCode == QAudio::ActiveState) { audioDeviceStop(); errorCode = QAudio::IOError; stateCode = QAudio::StoppedState; QMetaObject::invokeMethod(this, "deviceStopped", Qt::QueuedConnection); } } void QAudioOutputPrivate::startTimers() { audioBuffer->startFillTimer(); if (intervalTimer->interval() > 0) intervalTimer->start(); } void QAudioOutputPrivate::stopTimers() { audioBuffer->stopFillTimer(); intervalTimer->stop(); } void QAudioOutputPrivate::setVolume(qreal v) { const qreal normalizedVolume = qBound(qreal(0.0), v, qreal(1.0)); if (!isOpen) { cachedVolume = normalizedVolume; return; } if (AudioUnitSetParameter(audioUnit, kHALOutputParam_Volume, kAudioUnitScope_Global, 0 /* bus */, (float)normalizedVolume, 0) == noErr) cachedVolume = normalizedVolume; } qreal QAudioOutputPrivate::volume() const { return cachedVolume; } void QAudioOutputPrivate::deviceStopped() { intervalTimer->stop(); emit stateChanged(stateCode); } void QAudioOutputPrivate::inputReady() { QMutexLocker lock(&mutex); if (stateCode == QAudio::IdleState) { audioThreadStart(); stateCode = QAudio::ActiveState; errorCode = QAudio::NoError; QMetaObject::invokeMethod(this, "stateChanged", Qt::QueuedConnection, Q_ARG(QAudio::State, stateCode)); } } OSStatus QAudioOutputPrivate::renderCallback(void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData) { Q_UNUSED(ioActionFlags) Q_UNUSED(inTimeStamp) Q_UNUSED(inBusNumber) Q_UNUSED(inNumberFrames) QAudioOutputPrivate* d = static_cast(inRefCon); const int threadState = d->audioThreadState.fetchAndAddAcquire(0); if (threadState == Stopped) { ioData->mBuffers[0].mDataByteSize = 0; d->audioDeviceStop(); } else { const UInt32 bytesPerFrame = d->streamFormat.mBytesPerFrame; qint64 framesRead; framesRead = d->audioBuffer->readFrames((char*)ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / bytesPerFrame); if (framesRead > 0) { ioData->mBuffers[0].mDataByteSize = framesRead * bytesPerFrame; d->totalFrames += framesRead; } else { ioData->mBuffers[0].mDataByteSize = 0; if (framesRead == 0) { if (threadState == Draining) d->audioDeviceStop(); else d->audioDeviceIdle(); } else d->audioDeviceError(); } } return noErr; } QT_END_NAMESPACE #include "qaudiooutput_mac_p.moc" qaudiooutput_mac_p.h000066400000000000000000000117121225012771600326170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIOOUTPUT_MAC_P_H #define QAUDIOOUTPUT_MAC_P_H #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QIODevice; class QAbstractAudioDeviceInfo; namespace QtMultimediaInternal { class QAudioOutputBuffer; } class QAudioOutputPrivate : public QAbstractAudioOutput { Q_OBJECT public: bool isOpen; int internalBufferSize; int periodSizeBytes; qint64 totalFrames; QAudioFormat audioFormat; QIODevice* audioIO; AudioDeviceID audioDeviceId; AudioUnit audioUnit; Float64 clockFrequency; UInt64 startTime; AudioStreamBasicDescription deviceFormat; AudioStreamBasicDescription streamFormat; QtMultimediaInternal::QAudioOutputBuffer* audioBuffer; QAtomicInt audioThreadState; QWaitCondition threadFinished; QMutex mutex; QTimer* intervalTimer; QAbstractAudioDeviceInfo *audioDeviceInfo; qreal cachedVolume; QAudio::Error errorCode; QAudio::State stateCode; QAudioOutputPrivate(const QByteArray& device); ~QAudioOutputPrivate(); bool open(); void close(); QAudioFormat format() const; void setFormat(const QAudioFormat& fmt); QIODevice* start(); void start(QIODevice* device); void stop(); void reset(); void suspend(); void resume(); int bytesFree() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void audioThreadStart(); void audioThreadStop(); void audioThreadDrain(); void audioDeviceStop(); void audioDeviceIdle(); void audioDeviceError(); void startTimers(); void stopTimers(); void setVolume(qreal); qreal volume() const; private slots: void deviceStopped(); void inputReady(); private: enum { Running, Draining, Stopped }; static OSStatus renderCallback(void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData); }; QT_END_NAMESPACE #endif qaudiooutput_win32_p.cpp000066400000000000000000000534231225012771600333610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include "qaudiooutput_win32_p.h" #include #ifndef SPEAKER_FRONT_LEFT #define SPEAKER_FRONT_LEFT 0x00000001 #define SPEAKER_FRONT_RIGHT 0x00000002 #define SPEAKER_FRONT_CENTER 0x00000004 #define SPEAKER_LOW_FREQUENCY 0x00000008 #define SPEAKER_BACK_LEFT 0x00000010 #define SPEAKER_BACK_RIGHT 0x00000020 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080 #define SPEAKER_BACK_CENTER 0x00000100 #define SPEAKER_SIDE_LEFT 0x00000200 #define SPEAKER_SIDE_RIGHT 0x00000400 #define SPEAKER_TOP_CENTER 0x00000800 #define SPEAKER_TOP_FRONT_LEFT 0x00001000 #define SPEAKER_TOP_FRONT_CENTER 0x00002000 #define SPEAKER_TOP_FRONT_RIGHT 0x00004000 #define SPEAKER_TOP_BACK_LEFT 0x00008000 #define SPEAKER_TOP_BACK_CENTER 0x00010000 #define SPEAKER_TOP_BACK_RIGHT 0x00020000 #define SPEAKER_RESERVED 0x7FFC0000 #define SPEAKER_ALL 0x80000000 #endif #ifndef _WAVEFORMATEXTENSIBLE_ #define _WAVEFORMATEXTENSIBLE_ typedef struct { WAVEFORMATEX Format; // Base WAVEFORMATEX data union { WORD wValidBitsPerSample; // Valid bits in each sample container WORD wSamplesPerBlock; // Samples per block of audio data; valid // if wBitsPerSample=0 (but rarely used). WORD wReserved; // Zero if neither case above applies. } Samples; DWORD dwChannelMask; // Positions of the audio channels GUID SubFormat; // Format identifier GUID } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE; typedef const WAVEFORMATEXTENSIBLE* LPCWAVEFORMATEXTENSIBLE; #endif #if !defined(WAVE_FORMAT_EXTENSIBLE) #define WAVE_FORMAT_EXTENSIBLE 0xFFFE #endif //#define DEBUG_AUDIO 1 QT_BEGIN_NAMESPACE QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device) { bytesAvailable = 0; buffer_size = 0; period_size = 0; m_device = device; totalTimeValue = 0; intervalTime = 1000; audioBuffer = 0; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; finished = false; volumeCache = (qreal)1.; } QAudioOutputPrivate::~QAudioOutputPrivate() { mutex.lock(); finished = true; mutex.unlock(); close(); } void CALLBACK QAudioOutputPrivate::waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ) { Q_UNUSED(dwParam1) Q_UNUSED(dwParam2) Q_UNUSED(hWaveOut) QAudioOutputPrivate* qAudio; qAudio = (QAudioOutputPrivate*)(dwInstance); if(!qAudio) return; QMutexLocker(&qAudio->mutex); switch(uMsg) { case WOM_OPEN: qAudio->feedback(); break; case WOM_CLOSE: return; case WOM_DONE: if(qAudio->finished || qAudio->buffer_size == 0 || qAudio->period_size == 0) { return; } qAudio->waveFreeBlockCount++; if(qAudio->waveFreeBlockCount >= qAudio->buffer_size/qAudio->period_size) qAudio->waveFreeBlockCount = qAudio->buffer_size/qAudio->period_size; qAudio->feedback(); break; default: return; } } WAVEHDR* QAudioOutputPrivate::allocateBlocks(int size, int count) { int i; unsigned char* buffer; WAVEHDR* blocks; DWORD totalBufferSize = (size + sizeof(WAVEHDR))*count; if((buffer=(unsigned char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, totalBufferSize)) == 0) { qWarning("QAudioOutput: Memory allocation error"); return 0; } blocks = (WAVEHDR*)buffer; buffer += sizeof(WAVEHDR)*count; for(i = 0; i < count; i++) { blocks[i].dwBufferLength = size; blocks[i].lpData = (LPSTR)buffer; buffer += size; } return blocks; } void QAudioOutputPrivate::freeBlocks(WAVEHDR* blockArray) { WAVEHDR* blocks = blockArray; int count = buffer_size/period_size; for(int i = 0; i < count; i++) { waveOutUnprepareHeader(hWaveOut,blocks, sizeof(WAVEHDR)); blocks++; } HeapFree(GetProcessHeap(), 0, blockArray); } QAudioFormat QAudioOutputPrivate::format() const { return settings; } void QAudioOutputPrivate::setFormat(const QAudioFormat& fmt) { if (deviceState == QAudio::StoppedState) settings = fmt; } void QAudioOutputPrivate::start(QIODevice* device) { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = true; audioSource = device; deviceState = QAudio::ActiveState; if(!open()) return; emit stateChanged(deviceState); } QIODevice* QAudioOutputPrivate::start() { if(deviceState != QAudio::StoppedState) close(); if(!pullMode && audioSource) delete audioSource; pullMode = false; audioSource = new OutputPrivate(this); audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); deviceState = QAudio::IdleState; if(!open()) return 0; emit stateChanged(deviceState); return audioSource; } void QAudioOutputPrivate::stop() { if(deviceState == QAudio::StoppedState) return; close(); if(!pullMode && audioSource) { delete audioSource; audioSource = 0; } emit stateChanged(deviceState); } bool QAudioOutputPrivate::open() { #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()< 96000) { qWarning("QAudioOutput: open error, sample rate out of range (%d).", settings.sampleRate()); } else if (buffer_size == 0) { // Default buffer size, 200ms, default period size is 40ms buffer_size = (settings.sampleRate() * settings.channelCount() * settings.sampleSize() + 39) / 40; period_size = buffer_size / 5; } else { period_size = buffer_size / 5; } if (period_size == 0) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); return false; } waveBlocks = allocateBlocks(period_size, buffer_size/period_size); mutex.lock(); waveFreeBlockCount = buffer_size/period_size; mutex.unlock(); waveCurrentBlock = 0; if(audioBuffer == 0) audioBuffer = new char[buffer_size]; timeStamp.restart(); elapsedTimeOffset = 0; wfx.nSamplesPerSec = settings.sampleRate(); wfx.wBitsPerSample = settings.sampleSize(); wfx.nChannels = settings.channelCount(); wfx.cbSize = 0; bool surround = false; if (settings.channelCount() > 2) surround = true; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels; wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec; QDataStream ds(&m_device, QIODevice::ReadOnly); quint32 deviceId; ds >> deviceId; if (!surround) { if (waveOutOpen(&hWaveOut, UINT_PTR(deviceId), &wfx, (DWORD_PTR)&waveOutProc, (DWORD_PTR) this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); qWarning("QAudioOutput: open error"); return false; } } else { WAVEFORMATEXTENSIBLE wfex; wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfex.Format.nChannels = settings.channelCount(); wfex.Format.wBitsPerSample = settings.sampleSize(); wfex.Format.nSamplesPerSec = settings.sampleRate(); wfex.Format.nBlockAlign = wfex.Format.nChannels*wfex.Format.wBitsPerSample/8; wfex.Format.nAvgBytesPerSec=wfex.Format.nSamplesPerSec*wfex.Format.nBlockAlign; wfex.Samples.wValidBitsPerSample=wfex.Format.wBitsPerSample; static const GUID _KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; wfex.SubFormat=_KSDATAFORMAT_SUBTYPE_PCM; wfex.Format.cbSize=22; wfex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; if (settings.channelCount() >= 4) wfex.dwChannelMask |= SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; if (settings.channelCount() >= 6) wfex.dwChannelMask |= SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY; if (settings.channelCount() == 8) wfex.dwChannelMask |= SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; if (waveOutOpen(&hWaveOut, UINT_PTR(deviceId), &wfex.Format, (DWORD_PTR)&waveOutProc, (DWORD_PTR) this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { errorState = QAudio::OpenError; deviceState = QAudio::StoppedState; emit stateChanged(deviceState); qWarning("QAudioOutput: open error"); return false; } } totalTimeValue = 0; timeStampOpened.restart(); elapsedTimeOffset = 0; setVolume(volumeCache); errorState = QAudio::NoError; if(pullMode) { deviceState = QAudio::ActiveState; QTimer::singleShot(10, this, SLOT(feedback())); } else deviceState = QAudio::IdleState; return true; } void QAudioOutputPrivate::close() { if(deviceState == QAudio::StoppedState) return; deviceState = QAudio::StoppedState; errorState = QAudio::NoError; int delay = (buffer_size-bytesFree())*1000/(settings.sampleRate() *settings.channelCount()*(settings.sampleSize()/8)); waveOutReset(hWaveOut); Sleep(delay+10); freeBlocks(waveBlocks); waveOutClose(hWaveOut); delete [] audioBuffer; audioBuffer = 0; buffer_size = 0; } int QAudioOutputPrivate::bytesFree() const { int buf; buf = waveFreeBlockCount*period_size; return buf; } int QAudioOutputPrivate::periodSize() const { return period_size; } void QAudioOutputPrivate::setBufferSize(int value) { if(deviceState == QAudio::StoppedState) buffer_size = value; } int QAudioOutputPrivate::bufferSize() const { return buffer_size; } void QAudioOutputPrivate::setNotifyInterval(int ms) { intervalTime = qMax(0, ms); } int QAudioOutputPrivate::notifyInterval() const { return intervalTime; } qint64 QAudioOutputPrivate::processedUSecs() const { if (deviceState == QAudio::StoppedState) return 0; qint64 result = qint64(1000000) * totalTimeValue / (settings.channelCount()*(settings.sampleSize()/8)) / settings.sampleRate(); return result; } qint64 QAudioOutputPrivate::write( const char *data, qint64 len ) { // Write out some audio data if (deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return 0; char* p = (char*)data; int l = (int)len; QByteArray reverse; if (settings.byteOrder() == QAudioFormat::BigEndian) { switch (settings.sampleSize()) { case 8: // No need to convert break; case 16: reverse.resize(l); for (qint64 i = 0; i < (l >> 1); i++) *((qint16*)reverse.data() + i) = qFromBigEndian(*((qint16*)data + i)); p = reverse.data(); break; case 32: reverse.resize(l); for (qint64 i = 0; i < (l >> 2); i++) *((qint32*)reverse.data() + i) = qFromBigEndian(*((qint32*)data + i)); p = reverse.data(); break; } } WAVEHDR* current; int remain; current = &waveBlocks[waveCurrentBlock]; while(l > 0) { mutex.lock(); if(waveFreeBlockCount==0) { mutex.unlock(); break; } mutex.unlock(); if(current->dwFlags & WHDR_PREPARED) waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR)); if(l < period_size) remain = l; else remain = period_size; memcpy(current->lpData, p, remain); l -= remain; p += remain; current->dwBufferLength = remain; waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR)); waveOutWrite(hWaveOut, current, sizeof(WAVEHDR)); mutex.lock(); waveFreeBlockCount--; #ifdef DEBUG_AUDIO qDebug("write out l=%d, waveFreeBlockCount=%d", current->dwBufferLength,waveFreeBlockCount); #endif mutex.unlock(); totalTimeValue += current->dwBufferLength; waveCurrentBlock++; waveCurrentBlock %= buffer_size/period_size; current = &waveBlocks[waveCurrentBlock]; current->dwUser = 0; errorState = QAudio::NoError; if (deviceState != QAudio::ActiveState) { deviceState = QAudio::ActiveState; emit stateChanged(deviceState); } } return (len-l); } void QAudioOutputPrivate::resume() { if(deviceState == QAudio::SuspendedState) { deviceState = QAudio::ActiveState; errorState = QAudio::NoError; waveOutRestart(hWaveOut); QTimer::singleShot(10, this, SLOT(feedback())); emit stateChanged(deviceState); } } void QAudioOutputPrivate::suspend() { if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState) { int delay = (buffer_size-bytesFree())*1000/(settings.sampleRate() *settings.channelCount()*(settings.sampleSize()/8)); waveOutPause(hWaveOut); Sleep(delay+10); deviceState = QAudio::SuspendedState; errorState = QAudio::NoError; emit stateChanged(deviceState); } } void QAudioOutputPrivate::feedback() { #ifdef DEBUG_AUDIO QTime now(QTime::currentTime()); qDebug()<= period_size) QMetaObject::invokeMethod(this, "deviceReady", Qt::QueuedConnection); } } bool QAudioOutputPrivate::deviceReady() { if(deviceState == QAudio::StoppedState || deviceState == QAudio::SuspendedState) return false; if(pullMode) { int chunks = bytesAvailable/period_size; #ifdef DEBUG_AUDIO qDebug()<<"deviceReady() avail="< intervalTime ) { emit notify(); elapsedTimeOffset = timeStamp.elapsed() + elapsedTimeOffset - intervalTime; timeStamp.restart(); } return true; } if(startup) waveOutPause(hWaveOut); int input = period_size*chunks; int l = audioSource->read(audioBuffer,input); if(l > 0) { int out= write(audioBuffer,l); if(out > 0) { if (deviceState != QAudio::ActiveState) { deviceState = QAudio::ActiveState; emit stateChanged(deviceState); } } if ( out < l) { // Didn't write all data audioSource->seek(audioSource->pos()-(l-out)); } if(startup) waveOutRestart(hWaveOut); } else if(l == 0) { bytesAvailable = bytesFree(); int check = 0; mutex.lock(); check = waveFreeBlockCount; mutex.unlock(); if(check == buffer_size/period_size) { if (deviceState != QAudio::IdleState) { errorState = QAudio::UnderrunError; deviceState = QAudio::IdleState; emit stateChanged(deviceState); } } } else if(l < 0) { bytesAvailable = bytesFree(); if (errorState != QAudio::IOError) errorState = QAudio::IOError; } } else { int buffered; mutex.lock(); buffered = waveFreeBlockCount; mutex.unlock(); if (buffered >= buffer_size/period_size && deviceState == QAudio::ActiveState) { if (deviceState != QAudio::IdleState) { errorState = QAudio::UnderrunError; deviceState = QAudio::IdleState; emit stateChanged(deviceState); } } } if(deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return true; if(intervalTime && (timeStamp.elapsed() + elapsedTimeOffset) > intervalTime) { emit notify(); elapsedTimeOffset = timeStamp.elapsed() + elapsedTimeOffset - intervalTime; timeStamp.restart(); } return true; } qint64 QAudioOutputPrivate::elapsedUSecs() const { if (deviceState == QAudio::StoppedState) return 0; return timeStampOpened.elapsed()*1000; } QAudio::Error QAudioOutputPrivate::error() const { return errorState; } QAudio::State QAudioOutputPrivate::state() const { return deviceState; } void QAudioOutputPrivate::setVolume(qreal v) { const qreal normalizedVolume = qBound(qreal(0.0), v, qreal(1.0)); if (deviceState != QAudio::ActiveState) { volumeCache = normalizedVolume; return; } const qint16 scaled = normalizedVolume * 0xFFFF; DWORD vol = MAKELONG(scaled, scaled); MMRESULT res = waveOutSetVolume(hWaveOut, vol); if (res == MMSYSERR_NOERROR) volumeCache = normalizedVolume; } qreal QAudioOutputPrivate::volume() const { return volumeCache; } void QAudioOutputPrivate::reset() { close(); } OutputPrivate::OutputPrivate(QAudioOutputPrivate* audio) { audioDevice = qobject_cast(audio); } OutputPrivate::~OutputPrivate() {} qint64 OutputPrivate::readData( char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) return 0; } qint64 OutputPrivate::writeData(const char* data, qint64 len) { int retry = 0; qint64 written = 0; if((audioDevice->deviceState == QAudio::ActiveState) ||(audioDevice->deviceState == QAudio::IdleState)) { qint64 l = len; while(written < l) { int chunk = audioDevice->write(data+written,(l-written)); if(chunk <= 0) retry++; else written+=chunk; if(retry > 10) return written; } audioDevice->deviceState = QAudio::ActiveState; } return written; } QT_END_NAMESPACE #include "moc_qaudiooutput_win32_p.cpp" qaudiooutput_win32_p.h000066400000000000000000000114551225012771600330250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QAUDIOOUTPUTWIN_H #define QAUDIOOUTPUTWIN_H #include #include #include #include #include #include #include #include #include #include #include // For compat with 4.6 #if !defined(QT_WIN_CALLBACK) # if defined(Q_CC_MINGW) # define QT_WIN_CALLBACK CALLBACK __attribute__ ((force_align_arg_pointer)) # else # define QT_WIN_CALLBACK CALLBACK # endif #endif QT_BEGIN_NAMESPACE class QAudioOutputPrivate : public QAbstractAudioOutput { Q_OBJECT public: QAudioOutputPrivate(const QByteArray &device); ~QAudioOutputPrivate(); qint64 write( const char *data, qint64 len ); void setFormat(const QAudioFormat& fmt); QAudioFormat format() const; QIODevice* start(); void start(QIODevice* device); void stop(); void reset(); void suspend(); void resume(); int bytesFree() const; int periodSize() const; void setBufferSize(int value); int bufferSize() const; void setNotifyInterval(int milliSeconds); int notifyInterval() const; qint64 processedUSecs() const; qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; void setVolume(qreal); qreal volume() const; QIODevice* audioSource; QAudioFormat settings; QAudio::Error errorState; QAudio::State deviceState; private slots: void feedback(); bool deviceReady(); private: QByteArray m_device; bool resuming; int bytesAvailable; QTime timeStamp; qint64 elapsedTimeOffset; QTime timeStampOpened; qint32 buffer_size; qint32 period_size; qint64 totalTimeValue; bool pullMode; int intervalTime; qreal volumeCache; static void QT_WIN_CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ); QMutex mutex; WAVEHDR* allocateBlocks(int size, int count); void freeBlocks(WAVEHDR* blockArray); bool open(); void close(); WAVEFORMATEX wfx; HWAVEOUT hWaveOut; MMRESULT result; WAVEHDR header; WAVEHDR* waveBlocks; volatile bool finished; volatile int waveFreeBlockCount; int waveCurrentBlock; char* audioBuffer; }; class OutputPrivate : public QIODevice { Q_OBJECT public: OutputPrivate(QAudioOutputPrivate* audio); ~OutputPrivate(); qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); private: QAudioOutputPrivate *audioDevice; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioprobe.cpp000066400000000000000000000157011225012771600316430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \class QAudioProbe \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio \brief The QAudioProbe class allows you to monitor audio being played or recorded. \code QAudioRecorder *recorder = new QAudioRecorder(); QAudioProbe *probe = new QAudioProbe; // ... configure the audio recorder (skipped) connect(probe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer))); probe->setSource(recorder); // Returns true, hopefully. recorder->record(); // Now we can do things like calculating levels or performing an FFT \endcode \sa QVideoProbe, QMediaPlayer, QCamera */ #include "qaudioprobe.h" #include "qmediaaudioprobecontrol.h" #include "qmediaservice.h" #include "qmediarecorder.h" #include "qsharedpointer.h" #include "qpointer.h" QT_BEGIN_NAMESPACE class QAudioProbePrivate { public: QPointer source; QPointer probee; }; /*! Creates a new QAudioProbe class with a \a parent. After setting the source to monitor with \l setSource(), the \l audioBufferProbed() signal will be emitted when audio buffers are flowing in the source media object. */ QAudioProbe::QAudioProbe(QObject *parent) : QObject(parent) , d(new QAudioProbePrivate) { } /*! Destroys this probe and disconnects from any media object. */ QAudioProbe::~QAudioProbe() { if (d->source) { // Disconnect if (d->probee) { disconnect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); } d->source.data()->service()->releaseControl(d->probee.data()); } } /*! Sets the media object to monitor to \a source. If \a source is zero, this probe will be deactivated and this function wil return true. If the media object does not support monitoring audio, this function will return false. The previous object will no longer be monitored. Passing in the same object will be ignored, but monitoring will continue. */ bool QAudioProbe::setSource(QMediaObject *source) { // Need to: // 1) disconnect from current source if necessary // 2) see if new one has the probe control // 3) connect if so // in case source was destroyed but probe control is still valid if (!d->source && d->probee) { disconnect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->probee.clear(); } if (source != d->source.data()) { if (d->source) { Q_ASSERT(d->probee); disconnect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->source.data()->service()->releaseControl(d->probee.data()); d->source.clear(); d->probee.clear(); } if (source) { QMediaService *service = source->service(); if (service) { d->probee = service->requestControl(); } if (d->probee) { connect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer))); connect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->source = source; } } } return (!source || d->probee != 0); } /*! Starts monitoring the given \a mediaRecorder. Returns true on success. If there is no mediaObject associated with \a mediaRecorder, or if it is zero, this probe will be deactivated and this function wil return true. If the media recorder instance does not support monitoring audio, this function will return false. Any previously monitored objects will no longer be monitored. Passing in the same (valid) object will be ignored, but monitoring will continue. */ bool QAudioProbe::setSource(QMediaRecorder *mediaRecorder) { QMediaObject *source = mediaRecorder ? mediaRecorder->mediaObject() : 0; bool result = setSource(source); if (!mediaRecorder) return true; if (mediaRecorder && !source) return false; return result; } /*! Returns true if this probe is monitoring something, or false otherwise. The source being monitored does not need to be active. */ bool QAudioProbe::isActive() const { return d->probee != 0; } /*! \fn QAudioProbe::audioBufferProbed(const QAudioBuffer &buffer) This signal should be emitted when an audio \a buffer is processed in the media service. */ /*! \fn QAudioProbe::flush() This signal should be emitted when it is required to release all buffers. Application must release all outstanding references to audio buffers. */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudioprobe.h000066400000000000000000000050301225012771600313020ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOPROBE_H #define QAUDIOPROBE_H #include #include QT_BEGIN_NAMESPACE class QMediaObject; class QMediaRecorder; class QAudioProbePrivate; class Q_MULTIMEDIA_EXPORT QAudioProbe : public QObject { Q_OBJECT public: explicit QAudioProbe(QObject *parent = 0); ~QAudioProbe(); bool setSource(QMediaObject *source); bool setSource(QMediaRecorder *source); bool isActive() const; Q_SIGNALS: void audioBufferProbed(const QAudioBuffer &audioBuffer); void flush(); private: QAudioProbePrivate *d; }; QT_END_NAMESPACE #endif // QAUDIOPROBE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiosystem.cpp000066400000000000000000000257031225012771600320630ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiosystem.h" QT_BEGIN_NAMESPACE /*! \class QAbstractAudioDeviceInfo \brief The QAbstractAudioDeviceInfo class is a base class for audio backends. \ingroup multimedia \ingroup multimedia_audio \inmodule QtMultimedia \internal This class implements the audio functionality for QAudioDeviceInfo, i.e., QAudioDeviceInfo keeps a QAbstractAudioDeviceInfo and routes function calls to it. For a description of the functionality that QAbstractAudioDeviceInfo implements, you can read the class and functions documentation of QAudioDeviceInfo. \sa QAudioDeviceInfo \sa QAbstractAudioOutput, QAbstractAudioInput */ /*! \fn virtual QAudioFormat QAbstractAudioDeviceInfo::preferredFormat() const Returns the recommended settings to use. */ /*! \fn virtual bool QAbstractAudioDeviceInfo::isFormatSupported(const QAudioFormat& format) const Returns true if \a format is available from audio device. */ /*! \fn virtual QString QAbstractAudioDeviceInfo::deviceName() const Returns the audio device name. */ /*! \fn virtual QStringList QAbstractAudioDeviceInfo::supportedCodecs() Returns the list of currently available codecs. */ /*! \fn virtual QList QAbstractAudioDeviceInfo::supportedSampleRates() Returns the list of currently available sample rates. */ /*! \fn virtual QList QAbstractAudioDeviceInfo::supportedChannelCounts() Returns the list of currently available channels. */ /*! \fn virtual QList QAbstractAudioDeviceInfo::supportedSampleSizes() Returns the list of currently available sample sizes. */ /*! \fn virtual QList QAbstractAudioDeviceInfo::supportedByteOrders() Returns the list of currently available byte orders. */ /*! \fn virtual QList QAbstractAudioDeviceInfo::supportedSampleTypes() Returns the list of currently available sample types. */ /*! \class QAbstractAudioOutput \brief The QAbstractAudioOutput class is a base class for audio backends. \ingroup multimedia \inmodule QtMultimedia \internal QAbstractAudioOutput implements audio functionality for QAudioOutput, i.e., QAudioOutput routes function calls to QAbstractAudioOutput. For a description of the functionality that is implemented, see the QAudioOutput class and function descriptions. \sa QAudioOutput */ /*! \fn virtual void QAbstractAudioOutput::start(QIODevice* device) Uses the \a device as the QIODevice to transfer data. */ /*! \fn virtual QIODevice* QAbstractAudioOutput::start() Returns a pointer to the QIODevice being used to handle the data transfer. This QIODevice can be used to write() audio data directly. */ /*! \fn virtual void QAbstractAudioOutput::stop() Stops the audio output. */ /*! \fn virtual void QAbstractAudioOutput::reset() Drops all audio data in the buffers, resets buffers to zero. */ /*! \fn virtual void QAbstractAudioOutput::suspend() Stops processing audio data, preserving buffered audio data. */ /*! \fn virtual void QAbstractAudioOutput::resume() Resumes processing audio data after a suspend() */ /*! \fn virtual int QAbstractAudioOutput::bytesFree() const Returns the free space available in bytes in the audio buffer. */ /*! \fn virtual int QAbstractAudioOutput::periodSize() const Returns the period size in bytes. */ /*! \fn virtual void QAbstractAudioOutput::setBufferSize(int value) Sets the audio buffer size to \a value in bytes. */ /*! \fn virtual int QAbstractAudioOutput::bufferSize() const Returns the audio buffer size in bytes. */ /*! \fn virtual void QAbstractAudioOutput::setNotifyInterval(int ms) Sets the interval for notify() signal to be emitted. This is based on the \a ms of audio data processed not on actual real-time. The resolution of the timer is platform specific. */ /*! \fn virtual int QAbstractAudioOutput::notifyInterval() const Returns the notify interval in milliseconds. */ /*! \fn virtual qint64 QAbstractAudioOutput::processedUSecs() const Returns the amount of audio data processed since start() was called in milliseconds. */ /*! \fn virtual qint64 QAbstractAudioOutput::elapsedUSecs() const Returns the milliseconds since start() was called, including time in Idle and suspend states. */ /*! \fn virtual QAudio::Error QAbstractAudioOutput::error() const Returns the error state. */ /*! \fn virtual QAudio::State QAbstractAudioOutput::state() const Returns the state of audio processing. */ /*! \fn virtual void QAbstractAudioOutput::setFormat(const QAudioFormat& fmt) Set the QAudioFormat to use to \a fmt. Setting the format is only allowable while in QAudio::StoppedState. */ /*! \fn virtual QAudioFormat QAbstractAudioOutput::format() const Returns the QAudioFormat being used. */ /*! \fn virtual void QAbstractAudioOutput::setVolume(qreal volume) Sets the volume. Where \a volume is between 0.0 and 1.0. */ /*! \fn virtual qreal QAbstractAudioOutput::volume() const Returns the volume in the range 0.0 and 1.0. */ /*! \fn QAbstractAudioOutput::errorChanged(QAudio::Error error) This signal is emitted when the \a error state has changed. */ /*! \fn QAbstractAudioOutput::stateChanged(QAudio::State state) This signal is emitted when the device \a state has changed. */ /*! \fn QAbstractAudioOutput::notify() This signal is emitted when x ms of audio data has been processed the interval set by setNotifyInterval(x). */ /*! \class QAbstractAudioInput \brief The QAbstractAudioInput class provides access for QAudioInput to access the audio device provided by the plugin. \ingroup multimedia \inmodule QtMultimedia \internal QAudioDeviceInput keeps an instance of QAbstractAudioInput and routes calls to functions of the same name to QAbstractAudioInput. This means that it is QAbstractAudioInput that implements the audio functionality. For a description of the functionality, see the QAudioInput class description. \sa QAudioInput */ /*! \fn virtual void QAbstractAudioInput::start(QIODevice* device) Uses the \a device as the QIODevice to transfer data. */ /*! \fn virtual QIODevice* QAbstractAudioInput::start() Returns a pointer to the QIODevice being used to handle the data transfer. This QIODevice can be used to read() audio data directly. */ /*! \fn virtual void QAbstractAudioInput::stop() Stops the audio input. */ /*! \fn virtual void QAbstractAudioInput::reset() Drops all audio data in the buffers, resets buffers to zero. */ /*! \fn virtual void QAbstractAudioInput::suspend() Stops processing audio data, preserving buffered audio data. */ /*! \fn virtual void QAbstractAudioInput::resume() Resumes processing audio data after a suspend(). */ /*! \fn virtual int QAbstractAudioInput::bytesReady() const Returns the amount of audio data available to read in bytes. */ /*! \fn virtual int QAbstractAudioInput::periodSize() const Returns the period size in bytes. */ /*! \fn virtual void QAbstractAudioInput::setBufferSize(int value) Sets the audio buffer size to \a value in milliseconds. */ /*! \fn virtual int QAbstractAudioInput::bufferSize() const Returns the audio buffer size in milliseconds. */ /*! \fn virtual void QAbstractAudioInput::setNotifyInterval(int ms) Sets the interval for notify() signal to be emitted. This is based on the \a ms of audio data processed not on actual real-time. The resolution of the timer is platform specific. */ /*! \fn virtual int QAbstractAudioInput::notifyInterval() const Returns the notify interval in milliseconds. */ /*! \fn virtual qint64 QAbstractAudioInput::processedUSecs() const Returns the amount of audio data processed since start() was called in milliseconds. */ /*! \fn virtual qint64 QAbstractAudioInput::elapsedUSecs() const Returns the milliseconds since start() was called, including time in Idle and suspend states. */ /*! \fn virtual QAudio::Error QAbstractAudioInput::error() const Returns the error state. */ /*! \fn virtual QAudio::State QAbstractAudioInput::state() const Returns the state of audio processing. */ /*! \fn virtual void QAbstractAudioInput::setFormat(const QAudioFormat& fmt) Set the QAudioFormat to use to \a fmt. Setting the format is only allowable while in QAudio::StoppedState. */ /*! \fn virtual QAudioFormat QAbstractAudioInput::format() const Returns the QAudioFormat being used */ /*! \fn QAbstractAudioInput::errorChanged(QAudio::Error error) This signal is emitted when the \a error state has changed. */ /*! \fn QAbstractAudioInput::stateChanged(QAudio::State state) This signal is emitted when the device \a state has changed. */ /*! \fn QAbstractAudioInput::notify() This signal is emitted when x ms of audio data has been processed the interval set by setNotifyInterval(x). */ QT_END_NAMESPACE #include "moc_qaudiosystem.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qaudiosystem.h000066400000000000000000000117521225012771600315270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOSYSTEM_H #define QAUDIOSYSTEM_H #include #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QAbstractAudioDeviceInfo : public QObject { Q_OBJECT public: virtual QAudioFormat preferredFormat() const = 0; virtual bool isFormatSupported(const QAudioFormat &format) const = 0; virtual QString deviceName() const = 0; virtual QStringList supportedCodecs() = 0; virtual QList supportedSampleRates() = 0; virtual QList supportedChannelCounts() = 0; virtual QList supportedSampleSizes() = 0; virtual QList supportedByteOrders() = 0; virtual QList supportedSampleTypes() = 0; }; class Q_MULTIMEDIA_EXPORT QAbstractAudioOutput : public QObject { Q_OBJECT public: virtual void start(QIODevice *device) = 0; virtual QIODevice* start() = 0; virtual void stop() = 0; virtual void reset() = 0; virtual void suspend() = 0; virtual void resume() = 0; virtual int bytesFree() const = 0; virtual int periodSize() const = 0; virtual void setBufferSize(int value) = 0; virtual int bufferSize() const = 0; virtual void setNotifyInterval(int milliSeconds) = 0; virtual int notifyInterval() const = 0; virtual qint64 processedUSecs() const = 0; virtual qint64 elapsedUSecs() const = 0; virtual QAudio::Error error() const = 0; virtual QAudio::State state() const = 0; virtual void setFormat(const QAudioFormat& fmt) = 0; virtual QAudioFormat format() const = 0; virtual void setVolume(qreal) {} virtual qreal volume() const { return 1.0; } virtual QString category() const { return QString(); } virtual void setCategory(const QString &) { } Q_SIGNALS: void errorChanged(QAudio::Error); void stateChanged(QAudio::State); void notify(); }; class Q_MULTIMEDIA_EXPORT QAbstractAudioInput : public QObject { Q_OBJECT public: virtual void start(QIODevice *device) = 0; virtual QIODevice* start() = 0; virtual void stop() = 0; virtual void reset() = 0; virtual void suspend() = 0; virtual void resume() = 0; virtual int bytesReady() const = 0; virtual int periodSize() const = 0; virtual void setBufferSize(int value) = 0; virtual int bufferSize() const = 0; virtual void setNotifyInterval(int milliSeconds) = 0; virtual int notifyInterval() const = 0; virtual qint64 processedUSecs() const = 0; virtual qint64 elapsedUSecs() const = 0; virtual QAudio::Error error() const = 0; virtual QAudio::State state() const = 0; virtual void setFormat(const QAudioFormat& fmt) = 0; virtual QAudioFormat format() const = 0; virtual void setVolume(qreal) = 0; virtual qreal volume() const = 0; Q_SIGNALS: void errorChanged(QAudio::Error); void stateChanged(QAudio::State); void notify(); }; QT_END_NAMESPACE #endif // QAUDIOSYSTEM_H qaudiosystemplugin.cpp000066400000000000000000000123521225012771600332170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiosystemplugin.h" QT_BEGIN_NAMESPACE QAudioSystemFactoryInterface::~QAudioSystemFactoryInterface() { } /*! \class QAudioSystemPlugin \brief The QAudioSystemPlugin class provides an abstract base for audio plugins. \ingroup multimedia \ingroup multimedia_audio \inmodule QtMultimedia \internal Writing a audio plugin is achieved by subclassing this base class, reimplementing the pure virtual functions availableDevices(), createInput(), createOutput() and createDeviceInfo() then exporting the class with the Q_PLUGIN_METADATA() macro. The json file containing the meta data should contain a list of keys matching the plugin. Add "default" to your list of keys available to override the default audio device to be provided by your plugin. \code { "Keys": [ "default" ] } \endcode Unit tests are available to help in debugging new plugins. \sa QAbstractAudioDeviceInfo, QAbstractAudioOutput, QAbstractAudioInput Qt supports win32, linux(alsa) and Mac OS X standard (builtin to the QtMultimedia library at compile time). You can support other backends other than these predefined ones by creating a plugin subclassing QAudioSystemPlugin, QAbstractAudioDeviceInfo, QAbstractAudioOutput and QAbstractAudioInput. -audio-backend configure option will force compiling in of the builtin backend into the QtMultimedia library at compile time. This is automatic by default and will only be compiled into the library if the dependencies are installed. eg. alsa-devel package installed for linux. If the builtin backend is not compiled into the QtMultimedia library and no audio plugins are available a fallback dummy backend will be used. This should print out warnings if this is the case when you try and use QAudioInput or QAudioOutput. To fix this problem reconfigure Qt using -audio-backend or create your own plugin with a default key to always override the dummy fallback. The easiest way to determine if you have only a dummy backend is to get a list of available audio devices. QAudioDeviceInfo::availableDevices(QAudio::AudioOutput).size() = 0 (dummy backend) */ /*! Construct a new audio plugin with \a parent. This is invoked automatically by the Q_PLUGIN_METADATA() macro. */ QAudioSystemPlugin::QAudioSystemPlugin(QObject* parent) : QObject(parent) {} /*! Destroy the audio plugin You never have to call this explicitly. Qt destroys a plugin automatically when it is no longer used. */ QAudioSystemPlugin::~QAudioSystemPlugin() {} /*! \fn QList QAudioSystemPlugin::availableDevices(QAudio::Mode mode) const Returns a list of available audio devices for \a mode */ /*! \fn QAbstractAudioInput* QAudioSystemPlugin::createInput(const QByteArray& device) Returns a pointer to a QAbstractAudioInput created using \a device identifier */ /*! \fn QAbstractAudioOutput* QAudioSystemPlugin::createOutput(const QByteArray& device) Returns a pointer to a QAbstractAudioOutput created using \a device identifier */ /*! \fn QAbstractAudioDeviceInfo* QAudioSystemPlugin::createDeviceInfo(const QByteArray& device, QAudio::Mode mode) Returns a pointer to a QAbstractAudioDeviceInfo created using \a device and \a mode */ QT_END_NAMESPACE #include "moc_qaudiosystemplugin.cpp" qaudiosystemplugin.h000066400000000000000000000070511225012771600326640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOSYSTEMPLUGIN_H #define QAUDIOSYSTEMPLUGIN_H #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; struct Q_MULTIMEDIA_EXPORT QAudioSystemFactoryInterface { virtual QList availableDevices(QAudio::Mode) const = 0; virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0; virtual QAbstractAudioOutput* createOutput(const QByteArray& device) = 0; virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) = 0; virtual ~QAudioSystemFactoryInterface(); }; #define QAudioSystemFactoryInterface_iid \ "org.qt-project.qt.audiosystemfactory/5.0" Q_DECLARE_INTERFACE(QAudioSystemFactoryInterface, QAudioSystemFactoryInterface_iid) // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QAudioSystemPlugin : public QObject, public QAudioSystemFactoryInterface { Q_OBJECT Q_INTERFACES(QAudioSystemFactoryInterface) public: QAudioSystemPlugin(QObject *parent = 0); ~QAudioSystemPlugin(); virtual QList availableDevices(QAudio::Mode) const = 0; virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0; virtual QAbstractAudioOutput* createOutput(const QByteArray& device) = 0; virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) = 0; }; QT_END_NAMESPACE #endif // QAUDIOSYSTEMPLUGIN_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsamplecache_p.cpp000066400000000000000000000306111225012771600322730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsamplecache_p.h" #include "qwavedecoder_p.h" #include //#define QT_SAMPLECACHE_DEBUG QT_BEGIN_NAMESPACE /*! \class QSampleCache \internal When you want to get a sound sample data, you need to request the QSample reference from QSampleCache. \code QSample *m_sample; // class member. private Q_SLOTS: void decoderError(); void sampleReady(); \endcode \code Q_GLOBAL_STATIC(QSampleCache, sampleCache) //declare a singleton manager \endcode \code m_sample = sampleCache()->requestSample(url); switch(m_sample->state()) { case QSample::Ready: sampleReady(); break; case QSample::Error: decoderError(); break; default: connect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); connect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); break; } \endcode When you no longer need the sound sample data, you need to release it: \code if (m_sample) { m_sample->release(); m_sample = 0; } \endcode */ QSampleCache::QSampleCache(QObject *parent) : QObject(parent) , m_networkAccessManager(0) , m_mutex(QMutex::Recursive) , m_capacity(0) , m_usage(0) , m_loadingRefCount(0) { m_loadingThread.setObjectName(QLatin1String("QSampleCache::LoadingThread")); connect(&m_loadingThread, SIGNAL(finished()), this, SIGNAL(isLoadingChanged())); connect(&m_loadingThread, SIGNAL(started()), this, SIGNAL(isLoadingChanged())); } QNetworkAccessManager& QSampleCache::networkAccessManager() { if (!m_networkAccessManager) m_networkAccessManager = new QNetworkAccessManager(); return *m_networkAccessManager; } QSampleCache::~QSampleCache() { QMutexLocker m(&m_mutex); m_loadingThread.quit(); m_loadingThread.wait(); // Killing the loading thread means that no samples can be // deleted using deleteLater. And some samples that had deleteLater // already called won't have been processed (m_staleSamples) foreach (QSample* sample, m_samples) delete sample; foreach (QSample* sample, m_staleSamples) delete sample; // deleting a sample does affect the m_staleSamples list, but foreach copies it delete m_networkAccessManager; } void QSampleCache::loadingRelease() { QMutexLocker locker(&m_loadingMutex); m_loadingRefCount--; if (m_loadingRefCount == 0) { if (m_loadingThread.isRunning()) m_loadingThread.exit(); } } bool QSampleCache::isLoading() const { return m_loadingThread.isRunning(); } bool QSampleCache::isCached(const QUrl &url) const { QMutexLocker locker(&m_mutex); return m_samples.contains(url); } QSample* QSampleCache::requestSample(const QUrl& url) { //lock and add first to make sure live loadingThread will not be killed during this function call m_loadingMutex.lock(); m_loadingRefCount++; m_loadingMutex.unlock(); if (!m_loadingThread.isRunning()) m_loadingThread.start(); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSampleCache: request sample [" << url << "]"; #endif QMutexLocker locker(&m_mutex); QMap::iterator it = m_samples.find(url); QSample* sample; if (it == m_samples.end()) { sample = new QSample(url, this); m_samples.insert(url, sample); sample->moveToThread(&m_loadingThread); } else { sample = *it; } sample->addRef(); locker.unlock(); sample->loadIfNecessary(); return sample; } void QSampleCache::setCapacity(qint64 capacity) { QMutexLocker locker(&m_mutex); if (m_capacity == capacity) return; #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSampleCache: capacity changes from " << m_capacity << "to " << capacity; #endif if (m_capacity > 0 && capacity <= 0) { //memory management strategy changed for (QMap::iterator it = m_samples.begin(); it != m_samples.end();) { QSample* sample = *it; if (sample->m_ref == 0) { unloadSample(sample); it = m_samples.erase(it); } else it++; } } m_capacity = capacity; refresh(0); } // Called locked void QSampleCache::unloadSample(QSample *sample) { m_usage -= sample->m_soundData.size(); m_staleSamples.insert(sample); sample->deleteLater(); } // Called in both threads void QSampleCache::refresh(qint64 usageChange) { QMutexLocker locker(&m_mutex); m_usage += usageChange; if (m_capacity <= 0 || m_usage <= m_capacity) return; #ifdef QT_SAMPLECACHE_DEBUG qint64 recoveredSize = 0; #endif //free unused samples to keep usage under capacity limit. for (QMap::iterator it = m_samples.begin(); it != m_samples.end();) { QSample* sample = *it; if (sample->m_ref > 0) { ++it; continue; } #ifdef QT_SAMPLECACHE_DEBUG recoveredSize += sample->m_soundData.size(); #endif unloadSample(sample); it = m_samples.erase(it); if (m_usage <= m_capacity) return; } #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSampleCache: refresh(" << usageChange << ") recovered size =" << recoveredSize << "new usage =" << m_usage; #endif if (m_usage > m_capacity) qWarning() << "QSampleCache: usage[" << m_usage << " out of limit[" << m_capacity << "]"; } // Called in both threads void QSampleCache::removeUnreferencedSample(QSample *sample) { QMutexLocker m(&m_mutex); m_staleSamples.remove(sample); } // Called in loader thread (since this lives in that thread) // Also called from application thread after loader thread dies. QSample::~QSample() { // Remove ourselves from our parent m_parent->removeUnreferencedSample(this); QMutexLocker locker(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "~QSample" << this << ": deleted [" << m_url << "]" << QThread::currentThread(); #endif cleanup(); } // Called in application thread void QSample::loadIfNecessary() { QMutexLocker locker(&m_mutex); if (m_state == QSample::Error || m_state == QSample::Creating) { m_state = QSample::Loading; QMetaObject::invokeMethod(this, "load", Qt::QueuedConnection); } else { qobject_cast(m_parent)->loadingRelease(); } } // Called in both threads bool QSampleCache::notifyUnreferencedSample(QSample* sample) { QMutexLocker locker(&m_mutex); if (m_capacity > 0) return false; m_samples.remove(sample->m_url); unloadSample(sample); return true; } // Called in application threadd void QSample::release() { QMutexLocker locker(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "Sample:: release" << this << QThread::currentThread() << m_ref; #endif m_ref--; if (m_ref == 0) m_parent->notifyUnreferencedSample(this); } // Called in dtor and when stream is loaded // must be called locked. void QSample::cleanup() { if (m_waveDecoder) m_waveDecoder->deleteLater(); if (m_stream) m_stream->deleteLater(); m_waveDecoder = 0; m_stream = 0; } // Called in application thread void QSample::addRef() { m_ref++; } // Called in loading thread void QSample::readSample() { Q_ASSERT(QThread::currentThread()->objectName() == QLatin1String("QSampleCache::LoadingThread")); QMutexLocker m(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSample: readSample"; #endif qint64 read = m_waveDecoder->read(m_soundData.data() + m_sampleReadLength, qMin(m_waveDecoder->bytesAvailable(), qint64(m_waveDecoder->size() - m_sampleReadLength))); if (read > 0) m_sampleReadLength += read; if (m_sampleReadLength < m_waveDecoder->size()) return; Q_ASSERT(m_sampleReadLength == qint64(m_soundData.size())); onReady(); } // Called in loading thread void QSample::decoderReady() { Q_ASSERT(QThread::currentThread()->objectName() == QLatin1String("QSampleCache::LoadingThread")); QMutexLocker m(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSample: decoder ready"; #endif m_parent->refresh(m_waveDecoder->size()); m_soundData.resize(m_waveDecoder->size()); m_sampleReadLength = 0; qint64 read = m_waveDecoder->read(m_soundData.data(), m_waveDecoder->size()); if (read > 0) m_sampleReadLength += read; if (m_sampleReadLength >= m_waveDecoder->size()) onReady(); } // Called in all threads QSample::State QSample::state() const { QMutexLocker m(&m_mutex); return m_state; } // Called in loading thread // Essentially a second ctor, doesn't need locks (?) void QSample::load() { Q_ASSERT(QThread::currentThread()->objectName() == QLatin1String("QSampleCache::LoadingThread")); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSample: load [" << m_url << "]"; #endif m_stream = m_parent->networkAccessManager().get(QNetworkRequest(m_url)); connect(m_stream, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(decoderError())); m_waveDecoder = new QWaveDecoder(m_stream); connect(m_waveDecoder, SIGNAL(formatKnown()), SLOT(decoderReady())); connect(m_waveDecoder, SIGNAL(parsingError()), SLOT(decoderError())); connect(m_waveDecoder, SIGNAL(readyRead()), SLOT(readSample())); } // Called in loading thread void QSample::decoderError() { Q_ASSERT(QThread::currentThread()->objectName() == QLatin1String("QSampleCache::LoadingThread")); QMutexLocker m(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSample: decoder error"; #endif cleanup(); m_state = QSample::Error; qobject_cast(m_parent)->loadingRelease(); emit error(); } // Called in loading thread from decoder when sample is done. Locked already. void QSample::onReady() { Q_ASSERT(QThread::currentThread()->objectName() == QLatin1String("QSampleCache::LoadingThread")); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSample: load ready"; #endif m_audioFormat = m_waveDecoder->audioFormat(); cleanup(); m_state = QSample::Ready; qobject_cast(m_parent)->loadingRelease(); emit ready(); } // Called in application thread, then moved to loader thread QSample::QSample(const QUrl& url, QSampleCache *parent) : m_parent(parent) , m_stream(0) , m_waveDecoder(0) , m_url(url) , m_sampleReadLength(0) , m_state(Creating) , m_ref(0) { } QT_END_NAMESPACE #include "moc_qsamplecache_p.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsamplecache_p.h000066400000000000000000000112021225012771600317330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSAMPLECACHE_P_H #define QSAMPLECACHE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QIODevice; class QNetworkAccessManager; class QSampleCache; class QWaveDecoder; // Lives in application thread class Q_MULTIMEDIA_EXPORT QSample : public QObject { Q_OBJECT public: friend class QSampleCache; enum State { Creating, Loading, Error, Ready, }; State state() const; // These are not (currently) locked because they are only meant to be called after these // variables are updated to their final states const QByteArray& data() const { Q_ASSERT(state() == Ready); return m_soundData; } const QAudioFormat& format() const { Q_ASSERT(state() == Ready); return m_audioFormat; } void release(); Q_SIGNALS: void error(); void ready(); protected: QSample(const QUrl& url, QSampleCache *parent); private Q_SLOTS: void load(); void decoderError(); void readSample(); void decoderReady(); private: void onReady(); void cleanup(); void addRef(); void loadIfNecessary(); QSample(); ~QSample(); mutable QMutex m_mutex; QSampleCache *m_parent; QByteArray m_soundData; QAudioFormat m_audioFormat; QIODevice *m_stream; QWaveDecoder *m_waveDecoder; QUrl m_url; qint64 m_sampleReadLength; State m_state; int m_ref; }; class Q_MULTIMEDIA_EXPORT QSampleCache : public QObject { Q_OBJECT public: friend class QSample; QSampleCache(QObject *parent = 0); ~QSampleCache(); QSample* requestSample(const QUrl& url); void setCapacity(qint64 capacity); bool isLoading() const; bool isCached(const QUrl& url) const; Q_SIGNALS: void isLoadingChanged(); private: QMap m_samples; QSet m_staleSamples; QNetworkAccessManager *m_networkAccessManager; mutable QMutex m_mutex; qint64 m_capacity; qint64 m_usage; QThread m_loadingThread; QNetworkAccessManager& networkAccessManager(); void refresh(qint64 usageChange); bool notifyUnreferencedSample(QSample* sample); void removeUnreferencedSample(QSample* sample); void unloadSample(QSample* sample); void loadingRelease(); int m_loadingRefCount; QMutex m_loadingMutex; }; QT_END_NAMESPACE #endif // QSAMPLECACHE_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsound.cpp000066400000000000000000000152511225012771600306420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsound.h" #include "qsoundeffect.h" #include "qcoreapplication.h" /*! \class QSound \brief The QSound class provides a method to play .wav sound files. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_audio Qt provides the most commonly required audio operation in GUI applications: asynchronously playing a sound file. This is most easily accomplished using the static play() function: \snippet multimedia-snippets/qsound.cpp 0 Alternatively, create a QSound object from the sound file first and then call the play() slot: \snippet multimedia-snippets/qsound.cpp 1 Once created a QSound object can be queried for its fileName() and total number of loops() (i.e. the number of times the sound will play). The number of repetitions can be altered using the setLoops() function. While playing the sound, the loopsRemaining() function returns the remaining number of repetitions. Use the isFinished() function to determine whether the sound has finished playing. Sounds played using a QSound object may use more memory than the static play() function, but it may also play more immediately (depending on the underlying platform audio facilities). If you require finer control over playing sounds, consider the \l QSoundEffect or \l QAudioOutput classes. \sa QSoundEffect */ /*! \enum QSound::Loop \value Infinite Can be used as a parameter to \l setLoops() to loop infinitely. */ /*! Plays the sound stored in the file specified by the given \a filename. \sa stop(), loopsRemaining(), isFinished() */ void QSound::play(const QString& filename) { // Object destruction is generaly handled via deleteOnComplete // Unexpected cases will be handled via parenting of QSound objects to qApp QSound *sound = new QSound(filename, qApp); sound->connect(sound->m_soundEffect, SIGNAL(playingChanged()), SLOT(deleteOnComplete())); sound->play(); } /*! Constructs a QSound object from the file specified by the given \a filename and with the given \a parent. \sa play() */ QSound::QSound(const QString& filename, QObject* parent) : QObject(parent) { m_soundEffect = new QSoundEffect(this); m_soundEffect->setSource(QUrl::fromLocalFile(filename)); } /*! Destroys this sound object. If the sound is not finished playing, the stop() function is called before the sound object is destroyed. \sa stop(), isFinished() */ QSound::~QSound() { if (!isFinished()) stop(); } /*! Returns true if the sound has finished playing; otherwise returns false. */ bool QSound::isFinished() const { return !m_soundEffect->isPlaying(); } /*! \overload Starts playing the sound specified by this QSound object. The function returns immediately. Depending on the platform audio facilities, other sounds may stop or be mixed with the new sound. The sound can be played again at any time, possibly mixing or replacing previous plays of the sound. \sa fileName() */ void QSound::play() { m_soundEffect->play(); } /*! Returns the number of times the sound will play. Return value of \c QSound::Infinite indicates infinite number of loops \sa loopsRemaining(), setLoops() */ int QSound::loops() const { // retain old API value for infite loops int loopCount = m_soundEffect->loopCount(); if (loopCount == QSoundEffect::Infinite) loopCount = Infinite; return loopCount; } /*! Returns the remaining number of times the sound will loop (for all positive values this value decreases each time the sound is played). Return value of \c QSound::Infinite indicates infinite number of loops \sa loops(), isFinished() */ int QSound::loopsRemaining() const { // retain old API value for infite loops int loopsRemaining = m_soundEffect->loopsRemaining(); if (loopsRemaining == QSoundEffect::Infinite) loopsRemaining = Infinite; return loopsRemaining; } /*! \fn void QSound::setLoops(int number) Sets the sound to repeat the given \a number of times when it is played. Note that passing the value \c QSound::Infinite will cause the sound to loop indefinitely. \sa loops() */ void QSound::setLoops(int n) { if (n == Infinite) n = QSoundEffect::Infinite; m_soundEffect->setLoopCount(n); } /*! Returns the filename associated with this QSound object. \sa QSound() */ QString QSound::fileName() const { return m_soundEffect->source().toLocalFile(); } /*! Stops the sound playing. \sa play() */ void QSound::stop() { m_soundEffect->stop(); } /*! \internal */ void QSound::deleteOnComplete() { if (!m_soundEffect->isPlaying()) deleteLater(); } #include "moc_qsound.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsound.h000066400000000000000000000051601225012771600303050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUND_H #define QSOUND_H #include #include QT_BEGIN_NAMESPACE class QSoundEffect; class Q_MULTIMEDIA_EXPORT QSound : public QObject { Q_OBJECT public: enum Loop { Infinite = -1 }; static void play(const QString& filename); explicit QSound(const QString& filename, QObject* parent = 0); ~QSound(); int loops() const; int loopsRemaining() const; void setLoops(int); QString fileName() const; bool isFinished() const; public Q_SLOTS: void play(); void stop(); private Q_SLOTS: void deleteOnComplete(); private: QSoundEffect *m_soundEffect; }; QT_END_NAMESPACE #endif // QSOUND_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsoundeffect.cpp000066400000000000000000000430121225012771600320130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qsoundeffect.h" #if defined(QT_MULTIMEDIA_PULSEAUDIO) #include "qsoundeffect_pulse_p.h" #elif(QT_MULTIMEDIA_QAUDIO) #include "qsoundeffect_qaudio_p.h" #endif QT_BEGIN_NAMESPACE /*! \class QSoundEffect \brief The QSoundEffect class provides a way to play low latency sound effects. \ingroup multimedia \ingroup multimedia_audio \inmodule QtMultimedia This class allows you to play uncompressed audio files (typically WAV files) in a generally lower latency way, and is suitable for "feedback" type sounds in response to user actions (e.g. virtual keyboard sounds, positive or negative feedback for popup dialogs, or game sounds). If low latency is not important, consider using the QMediaPlayer class instead, since it supports a wider variety of media formats and is less resource intensive. This example shows how a looping, somewhat quiet sound effect can be played: \snippet multimedia-snippets/qsound.cpp 2 Typically the sound effect should be reused, which allows all the parsing and preparation to be done ahead of time, and only triggered when necessary. This assists with lower latency audio playback. \snippet multimedia-snippets/qsound.cpp 3 Since QSoundEffect requires slightly more resources to achieve lower latency playback, the platform may limit the number of simultaneously playing sound effects. */ /*! \qmltype SoundEffect \instantiates QSoundEffect \brief The SoundEffect type provides a way to play sound effects in QML. \inmodule QtMultimedia \ingroup multimedia_qml \ingroup multimedia_audio_qml \inqmlmodule QtMultimedia 5.0 SoundEffect is part of the \b{QtMultimedia 5.0} module. This type allows you to play uncompressed audio files (typically WAV files) in a generally lower latency way, and is suitable for "feedback" type sounds in response to user actions (e.g. virtual keyboard sounds, positive or negative feedback for popup dialogs, or game sounds). If low latency is not important, consider using the MediaPlayer or Audio types instead, since they support a wider variety of media formats and are less resource intensive. Typically the sound effect should be reused, which allows all the parsing and preparation to be done ahead of time, and only triggered when necessary. This is easy to achieve with QML, since you can declare your SoundEffect instance and refer to it elsewhere. The following example plays a WAV file on mouse click. \snippet multimedia-snippets/soundeffect.qml complete snippet Since SoundEffect requires slightly more resources to achieve lower latency playback, the platform may limit the number of simultaneously playing sound effects. */ /*! Creates a QSoundEffect with the given \a parent. */ QSoundEffect::QSoundEffect(QObject *parent) : QObject(parent) { d = new QSoundEffectPrivate(this); connect(d, SIGNAL(loopsRemainingChanged()), SIGNAL(loopsRemainingChanged())); connect(d, SIGNAL(volumeChanged()), SIGNAL(volumeChanged())); connect(d, SIGNAL(mutedChanged()), SIGNAL(mutedChanged())); connect(d, SIGNAL(loadedChanged()), SIGNAL(loadedChanged())); connect(d, SIGNAL(playingChanged()), SIGNAL(playingChanged())); connect(d, SIGNAL(statusChanged()), SIGNAL(statusChanged())); connect(d, SIGNAL(categoryChanged()), SIGNAL(categoryChanged())); } /*! Destroys this sound effect. */ QSoundEffect::~QSoundEffect() { d->release(); } /*! \fn QSoundEffect::supportedMimeTypes() Returns a list of the supported mime types for this sound effect. */ QStringList QSoundEffect::supportedMimeTypes() { return QSoundEffectPrivate::supportedMimeTypes(); } /*! \qmlproperty url QtMultimedia5::SoundEffect::source This property holds the url for the sound to play. For the SoundEffect to attempt to load the source, the URL must exist and the application must have read permission in the specified directory. If the desired source is a local file the URL may be specified using either absolute or relative (to the file that declared the SoundEffect) pathing. */ /*! \property QSoundEffect::source This property holds the url for the sound to play. For the SoundEffect to attempt to load the source, the URL must exist and the application must have read permission in the specified directory. */ /*! Returns the URL of the current source to play */ QUrl QSoundEffect::source() const { return d->source(); } /*! Set the current URL to play to \a url. */ void QSoundEffect::setSource(const QUrl &url) { if (d->source() == url) return; d->setSource(url); emit sourceChanged(); } /*! \qmlproperty int QtMultimedia5::SoundEffect::loops This property provides a way to control the number of times to repeat the sound on each play(). Set to SoundEffect.Infinite to enable infinite looping. */ /*! \property QSoundEffect::loops This property provides a way to control the number of times to repeat the sound on each play(). Set to QSoundEffect::Infinite to enable infinite looping. */ /*! Returns the total number of times that this sound effect will be played before stopping. See the \l loopsRemaining() method for the number of loops currently remaining. */ int QSoundEffect::loopCount() const { return d->loopCount(); } /*! \enum QSoundEffect::Loop \value Infinite Used as a parameter to \l setLoopCount() for infinite looping */ /*! Set the total number of times to repeat playing this sound effect on each play() call to \a loopCount. Pass \c QSoundEffect::Infinite to repeat until stop() is called. */ void QSoundEffect::setLoopCount(int loopCount) { if (loopCount < 0 && loopCount != Infinite) { qWarning("SoundEffect: loops should be SoundEffect.Infinite, 0 or positive integer"); return; } if (loopCount == 0) loopCount = 1; if (d->loopCount() == loopCount) return; d->setLoopCount(loopCount); emit loopCountChanged(); } /*! \qmlproperty int QtMultimedia5::SoundEffect::loopsRemaining This property contains the number of loops remaining before the sound effect stops by itself, or SoundEffect.Infinite if that's what has been set in \l loops. */ /*! \property QSoundEffect::loopsRemaining This property contains the number of loops remaining before the sound effect stops by itself, or QSoundEffect::Infinite if that's what has been set in \l loops. */ int QSoundEffect::loopsRemaining() const { return d->loopsRemaining(); } /*! \qmlproperty qreal QtMultimedia5::SoundEffect::volume This property holds the volume of the sound effect playback, from 0.0 (silent) to 1.0 (maximum volume). */ /*! \property QSoundEffect::volume This property holds the volume of the sound effect playback, from 0.0 (silent) to 1.0 (maximum volume). */ /*! Returns the current volume of this sound effect, from 0.0 (silent) to 1.0 (maximum volume). */ qreal QSoundEffect::volume() const { return qreal(d->volume()) / 100; } /*! Sets the volume to play the sound effect at to \a volume, from 0.0 (silent) to 1.0 (maximum volume). */ void QSoundEffect::setVolume(qreal volume) { if (volume < 0 || volume > 1) { qWarning("SoundEffect: volume should be between 0.0 and 1.0"); return; } int iVolume = qRound(volume * 100); if (d->volume() == iVolume) return; d->setVolume(iVolume); } /*! \qmlproperty bool QtMultimedia5::SoundEffect::muted This property provides a way to control muting. A value of \c true will mute this effect. Otherwise, playback will occur with the currently specified \l volume. */ /*! \property QSoundEffect::muted This property provides a way to control muting. A value of \c true will mute this effect. */ /*! Returns whether this sound effect is muted */ bool QSoundEffect::isMuted() const { return d->isMuted(); } /*! Sets whether to mute this sound effect's playback. If \a muted is true, playback will be muted (silenced), and otherwise playback will occur with the currently specified volume(). */ void QSoundEffect::setMuted(bool muted) { if (d->isMuted() == muted) return; d->setMuted(muted); } /*! \fn QSoundEffect::isLoaded() const Returns whether the sound effect has finished loading the \l source(). */ /*! \qmlmethod bool QtMultimedia5::SoundEffect::isLoaded() Returns whether the sound effect has finished loading the \l source. */ bool QSoundEffect::isLoaded() const { return d->isLoaded(); } /*! \qmlmethod QtMultimedia5::SoundEffect::play() Start playback of the sound effect, looping the effect for the number of times as specified in the loops property. This is the default method for SoundEffect. \snippet multimedia-snippets/soundeffect.qml play sound on click */ /*! \fn QSoundEffect::play() Start playback of the sound effect, looping the effect for the number of times as specified in the loops property. */ void QSoundEffect::play() { d->play(); } /*! \qmlproperty bool QtMultimedia5::SoundEffect::playing This property indicates whether the sound effect is playing or not. */ /*! \property QSoundEffect::playing This property indicates whether the sound effect is playing or not. */ /*! Returns true if the sound effect is currently playing, or false otherwise */ bool QSoundEffect::isPlaying() const { return d->isPlaying(); } /*! \enum QSoundEffect::Status \value Null No source has been set or the source is null. \value Loading The SoundEffect is trying to load the source. \value Ready The source is loaded and ready for play. \value Error An error occurred during operation, such as failure of loading the source. */ /*! \qmlproperty enumeration QtMultimedia5::SoundEffect::status This property indicates the current status of the SoundEffect as enumerated within SoundEffect. Possible statuses are listed below. \table \header \li Value \li Description \row \li SoundEffect.Null \li No source has been set or the source is null. \row \li SoundEffect.Loading \li The SoundEffect is trying to load the source. \row \li SoundEffect.Ready \li The source is loaded and ready for play. \row \li SoundEffect.Error \li An error occurred during operation, such as failure of loading the source. \endtable */ /*! \property QSoundEffect::status This property indicates the current status of the sound effect from the \l QSoundEffect::Status enumeration. */ /*! Returns the current status of this sound effect. */ QSoundEffect::Status QSoundEffect::status() const { return d->status(); } /*! \qmlproperty string QtMultimedia5::SoundEffect::category This property contains the \e category of this sound effect. Some platforms can perform different audio routing for different categories, or may allow the user to set different volume levels for different categories. This setting will be ignored on platforms that do not support audio categories. */ /*! \property QSoundEffect::category This property contains the \e category of this sound effect. Some platforms can perform different audio routing for different categories, or may allow the user to set different volume levels for different categories. This setting will be ignored on platforms that do not support audio categories. */ /*! Returns the current \e category for this sound effect. Some platforms can perform different audio routing for different categories, or may allow the user to set different volume levels for different categories. This setting will be ignored on platforms that do not support audio categories. \sa setCategory() */ QString QSoundEffect::category() const { return d->category(); } /*! Sets the \e category of this sound effect to \a category. Some platforms can perform different audio routing for different categories, or may allow the user to set different volume levels for different categories. This setting will be ignored on platforms that do not support audio categories. If this setting is changed while a sound effect is playing it will only take effect when the sound effect has stopped playing. \sa category() */ void QSoundEffect::setCategory(const QString &category) { d->setCategory(category); } /*! \qmlmethod QtMultimedia5::SoundEffect::stop() Stop current playback. */ /*! \fn QSoundEffect::stop() Stop current playback. */ void QSoundEffect::stop() { d->stop(); } /* Signals */ /*! \fn void QSoundEffect::sourceChanged() The \c sourceChanged signal is emitted when the source has been changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::sourceChanged() The \c sourceChanged signal is emitted when the source has been changed. The corresponding handler is \c onSourceChanged. */ /*! \fn void QSoundEffect::loadedChanged() The \c loadedChanged signal is emitted when the loading state has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::loadedChanged() The \c loadedChanged signal is emitted when the loading state has changed. The corresponding handler is \c onLoadedChanged. */ /*! \fn void QSoundEffect::loopCountChanged() The \c loopCountChanged signal is emitted when the initial number of loops has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::loopCountChanged() The \c loopCountChanged signal is emitted when the initial number of loops has changed. The corresponding handler is \c onLoopCountChanged. */ /*! \fn void QSoundEffect::loopsRemainingChanged() The \c loopsRemainingChanged signal is emitted when the remaining number of loops has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::loopsRemainingChanged() The \c loopsRemainingChanged signal is emitted when the remaining number of loops has changed. The corresponding handler is \c onLoopsRemainingChanged. */ /*! \fn void QSoundEffect::volumeChanged() The \c volumeChanged signal is emitted when the volume has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::volumeChanged() The \c volumeChanged signal is emitted when the volume has changed. The corresponding handler is \c onVolumeChanged. */ /*! \fn void QSoundEffect::mutedChanged() The \c mutedChanged signal is emitted when the mute state has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::mutedChanged() The \c mutedChanged signal is emitted when the mute state has changed. The corresponding handler is \c onMutedChanged. */ /*! \fn void QSoundEffect::playingChanged() The \c playingChanged signal is emitted when the playing property has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::playingChanged() The \c playingChanged signal is emitted when the playing property has changed. The corresponding handler is \c onPlayingChanged. */ /*! \fn void QSoundEffect::statusChanged() The \c statusChanged signal is emitted when the status property has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::statusChanged() The \c statusChanged signal is emitted when the status property has changed. The corresponding handler is \c onStatusChanged. */ /*! \fn void QSoundEffect::categoryChanged() The \c categoryChanged signal is emitted when the category property has changed. */ /*! \qmlsignal QtMultimedia5::SoundEffect::categoryChanged() The \c categoryChanged signal is emitted when the category property has changed. The corresponding handler is \c onCategoryChanged. */ QT_END_NAMESPACE #include "moc_qsoundeffect.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qsoundeffect.h000066400000000000000000000077541225012771600314750ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDEFFECT_H #define QSOUNDEFFECT_H #include #include #include #include QT_BEGIN_NAMESPACE class QSoundEffectPrivate; class Q_MULTIMEDIA_EXPORT QSoundEffect : public QObject { Q_OBJECT Q_CLASSINFO("DefaultMethod", "play()") Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(int loops READ loopCount WRITE setLoopCount NOTIFY loopCountChanged) Q_PROPERTY(int loopsRemaining READ loopsRemaining NOTIFY loopsRemainingChanged) Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool playing READ isPlaying NOTIFY playingChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_PROPERTY(QString category READ category WRITE setCategory NOTIFY categoryChanged) Q_ENUMS(Loop) Q_ENUMS(Status) public: enum Loop { Infinite = -2 }; enum Status { Null, Loading, Ready, Error }; explicit QSoundEffect(QObject *parent = 0); ~QSoundEffect(); static QStringList supportedMimeTypes(); QUrl source() const; void setSource(const QUrl &url); int loopCount() const; int loopsRemaining() const; void setLoopCount(int loopCount); qreal volume() const; void setVolume(qreal volume); bool isMuted() const; void setMuted(bool muted); bool isLoaded() const; bool isPlaying() const; Status status() const; QString category() const; void setCategory(const QString &category); Q_SIGNALS: void sourceChanged(); void loopCountChanged(); void loopsRemainingChanged(); void volumeChanged(); void mutedChanged(); void loadedChanged(); void playingChanged(); void statusChanged(); void categoryChanged(); public Q_SLOTS: void play(); void stop(); private: Q_DISABLE_COPY(QSoundEffect) QSoundEffectPrivate* d; }; QT_END_NAMESPACE #endif // QSOUNDEFFECT_H qsoundeffect_pulse_p.cpp000066400000000000000000001033721225012771600334710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include #include #include #include #include "qsoundeffect_pulse_p.h" #if defined(Q_WS_MAEMO_6) #include #endif #include //#define QT_PA_DEBUG #ifndef QTM_PULSEAUDIO_DEFAULTBUFFER #define QT_PA_STREAM_BUFFER_SIZE_MAX (1024 * 64) //64KB is a trade-off for balancing control latency and uploading overhead #endif QT_BEGIN_NAMESPACE namespace { inline pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format) { pa_sample_spec spec; spec.rate = format.sampleRate(); spec.channels = format.channelCount(); if (format.sampleSize() == 8) spec.format = PA_SAMPLE_U8; else if (format.sampleSize() == 16) { switch (format.byteOrder()) { case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S16BE; break; case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S16LE; break; } } else if (format.sampleSize() == 32) { switch (format.byteOrder()) { case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S32BE; break; case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S32LE; break; } } return spec; } class PulseDaemon : public QObject { Q_OBJECT public: PulseDaemon(): m_prepared(false) { prepare(); } ~PulseDaemon() { if (m_prepared) release(); } inline void lock() { if (m_mainLoop) pa_threaded_mainloop_lock(m_mainLoop); } inline void unlock() { if (m_mainLoop) pa_threaded_mainloop_unlock(m_mainLoop); } inline pa_context *context() const { return m_context; } inline pa_cvolume * calcVolume(pa_cvolume *dest, int soundEffectVolume) { pa_volume_t v = m_vol * soundEffectVolume / 100; for (int i = 0; i < dest->channels; ++i) dest->values[i] = v; return dest; } void updateStatus(const pa_cvolume& volume) { if (m_vol != pa_cvolume_max(&volume)) { m_vol = pa_cvolume_max(&volume); emit volumeChanged(); } } Q_SIGNALS: void contextReady(); void volumeChanged(); private: void prepare() { m_vol = PA_VOLUME_NORM; m_context = 0; m_mainLoop = pa_threaded_mainloop_new(); if (m_mainLoop == 0) { qWarning("PulseAudioService: unable to create pulseaudio mainloop"); return; } if (pa_threaded_mainloop_start(m_mainLoop) != 0) { qWarning("PulseAudioService: unable to start pulseaudio mainloop"); pa_threaded_mainloop_free(m_mainLoop); return; } m_mainLoopApi = pa_threaded_mainloop_get_api(m_mainLoop); lock(); m_context = pa_context_new(m_mainLoopApi, QString(QLatin1String("QtPulseAudio:%1")).arg(::getpid()).toLatin1().constData()); pa_context_set_state_callback(m_context, context_state_callback, this); if (m_context == 0) { qWarning("PulseAudioService: Unable to create new pulseaudio context"); pa_threaded_mainloop_unlock(m_mainLoop); pa_threaded_mainloop_free(m_mainLoop); m_mainLoop = 0; return; } if (pa_context_connect(m_context, 0, (pa_context_flags_t)0, 0) < 0) { qWarning("PulseAudioService: pa_context_connect() failed"); pa_context_unref(m_context); pa_threaded_mainloop_unlock(m_mainLoop); pa_threaded_mainloop_free(m_mainLoop); m_mainLoop = 0; m_context = 0; return; } unlock(); m_prepared = true; } void release() { if (!m_prepared) return; pa_context_unref(m_context); pa_threaded_mainloop_stop(m_mainLoop); pa_threaded_mainloop_free(m_mainLoop); m_prepared = false; } static void context_state_callback(pa_context *c, void *userdata) { PulseDaemon *self = reinterpret_cast(userdata); switch (pa_context_get_state(c)) { case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: #if defined(Q_WS_MAEMO_6) pa_ext_stream_restore_read(c, &stream_restore_info_callback, self); pa_ext_stream_restore_set_subscribe_cb(c, &stream_restore_monitor_callback, self); pa_ext_stream_restore_subscribe(c, 1, 0, self); #endif QMetaObject::invokeMethod(self, "contextReady", Qt::QueuedConnection); break; default: break; } } #if defined(Q_WS_MAEMO_6) static void stream_restore_monitor_callback(pa_context *c, void *userdata) { PulseDaemon *self = reinterpret_cast(userdata); pa_ext_stream_restore_read(c, &stream_restore_info_callback, self); } static void stream_restore_info_callback(pa_context *c, const pa_ext_stream_restore_info *info, int eol, void *userdata) { Q_UNUSED(c) PulseDaemon *self = reinterpret_cast(userdata); if (!eol) { if (QString(info->name).startsWith(QLatin1String("sink-input-by-media-role:x-maemo"))) { #ifdef QT_PA_DEBUG qDebug() << "x-maemo volume =(" << info->volume.values[0] * 100 / PA_VOLUME_NORM << "," << info->volume.values[1] * 100 / PA_VOLUME_NORM << "), " << "mute = " << info->mute; #endif self->updateStatus(info->volume); } } } #endif pa_volume_t m_vol; bool m_prepared; pa_context *m_context; pa_threaded_mainloop *m_mainLoop; pa_mainloop_api *m_mainLoopApi; }; } Q_GLOBAL_STATIC(PulseDaemon, pulseDaemon) Q_GLOBAL_STATIC(QSampleCache, sampleCache) namespace { class PulseDaemonLocker { public: PulseDaemonLocker() { pulseDaemon()->lock(); } ~PulseDaemonLocker() { pulseDaemon()->unlock(); } }; } class QSoundEffectRef { public: QSoundEffectRef(QSoundEffectPrivate *target) : m_ref(1) , m_target(target) { #ifdef QT_PA_DEBUG qDebug() << "QSoundEffectRef(" << this << ") ctor"; #endif } QSoundEffectRef *getRef() { #ifdef QT_PA_DEBUG qDebug() << "QSoundEffectRef(" << this << ") getRef"; #endif QMutexLocker locker(&m_mutex); m_ref++; return this; } void release() { #ifdef QT_PA_DEBUG qDebug() << "QSoundEffectRef(" << this << ") Release"; #endif m_mutex.lock(); --m_ref; if (m_ref == 0) { m_mutex.unlock(); #ifdef QT_PA_DEBUG qDebug() << "QSoundEffectRef(" << this << ") deleted"; #endif delete this; return; } m_mutex.unlock(); } QSoundEffectPrivate* soundEffect() const { QMutexLocker locker(&m_mutex); return m_target; } void notifyDeleted() { #ifdef QT_PA_DEBUG qDebug() << "QSoundEffectRef(" << this << ") notifyDeleted"; #endif QMutexLocker locker(&m_mutex); m_target = NULL; } private: int m_ref; mutable QMutex m_mutex; QSoundEffectPrivate *m_target; }; QSoundEffectPrivate::QSoundEffectPrivate(QObject* parent): QObject(parent), m_pulseStream(0), m_sinkInputId(-1), m_emptying(false), m_sampleReady(false), m_playing(false), m_status(QSoundEffect::Null), m_muted(false), m_playQueued(false), m_stopping(false), m_volume(100), m_loopCount(1), m_runningCount(0), m_reloadCategory(false), m_sample(0), m_position(0) { m_ref = new QSoundEffectRef(this); pa_sample_spec_init(&m_pulseSpec); } void QSoundEffectPrivate::release() { #ifdef QT_PA_DEBUG qDebug() << this << "release"; #endif m_ref->notifyDeleted(); unloadPulseStream(); if (m_sample) { m_sample->release(); m_sample = 0; } this->deleteLater(); } QString QSoundEffectPrivate::category() const { return m_category; } void QSoundEffectPrivate::setCategory(const QString &category) { if (m_category != category) { m_category = category; if (m_playing || m_playQueued) { // Currently playing, we need to disconnect when // playback stops m_reloadCategory = true; } else if (m_pulseStream) { // We have to disconnect and reconnect unloadPulseStream(); createPulseStream(); } else { // Well, next time we create the pulse stream // it should be set } emit categoryChanged(); } } QSoundEffectPrivate::~QSoundEffectPrivate() { m_ref->release(); } QStringList QSoundEffectPrivate::supportedMimeTypes() { QStringList supportedTypes; supportedTypes << QLatin1String("audio/x-wav") << QLatin1String("audio/vnd.wave") ; return supportedTypes; } QUrl QSoundEffectPrivate::source() const { return m_source; } void QSoundEffectPrivate::setSource(const QUrl &url) { Q_ASSERT(m_source != url); #ifdef QT_PA_DEBUG qDebug() << this << "setSource =" << url; #endif stop(); if (m_sample) { if (!m_sampleReady) { disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); disconnect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); } m_sample->release(); m_sample = 0; } m_source = url; m_sampleReady = false; PulseDaemonLocker locker; setLoopsRemaining(0); if (m_pulseStream && !pa_stream_is_corked(m_pulseStream)) { pa_stream_set_write_callback(m_pulseStream, 0, 0); pa_stream_set_underflow_callback(m_pulseStream, 0, 0); pa_operation_unref(pa_stream_cork(m_pulseStream, 1, 0, 0)); } setPlaying(false); if (url.isEmpty()) { setStatus(QSoundEffect::Null); return; } setStatus(QSoundEffect::Loading); m_sample = sampleCache()->requestSample(url); connect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); connect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); switch(m_sample->state()) { case QSample::Ready: sampleReady(); break; case QSample::Error: decoderError(); break; default: break; } } int QSoundEffectPrivate::loopCount() const { return m_loopCount; } int QSoundEffectPrivate::loopsRemaining() const { return m_runningCount; } void QSoundEffectPrivate::setLoopCount(int loopCount) { if (loopCount == 0) loopCount = 1; m_loopCount = loopCount; } int QSoundEffectPrivate::volume() const { return m_volume; } void QSoundEffectPrivate::setVolume(int volume) { m_volume = volume; emit volumeChanged(); updateVolume(); } void QSoundEffectPrivate::updateVolume() { if (m_sinkInputId < 0) return; PulseDaemonLocker locker; pa_cvolume volume; volume.channels = m_pulseSpec.channels; pa_operation_unref(pa_context_set_sink_input_volume(pulseDaemon()->context(), m_sinkInputId, pulseDaemon()->calcVolume(&volume, m_volume), setvolume_callback, m_ref->getRef())); Q_ASSERT(pa_cvolume_valid(&volume)); #ifdef QT_PA_DEBUG qDebug() << this << "updateVolume =" << pa_cvolume_max(&volume); #endif } bool QSoundEffectPrivate::isMuted() const { return m_muted; } void QSoundEffectPrivate::setMuted(bool muted) { m_muted = muted; emit mutedChanged(); updateMuted(); } void QSoundEffectPrivate::updateMuted() { if (m_sinkInputId < 0) return; PulseDaemonLocker locker; pa_operation_unref(pa_context_set_sink_input_mute(pulseDaemon()->context(), m_sinkInputId, m_muted, setmuted_callback, m_ref->getRef())); #ifdef QT_PA_DEBUG qDebug() << this << "updateMuted = " << m_muted; #endif } bool QSoundEffectPrivate::isLoaded() const { return m_status == QSoundEffect::Ready; } bool QSoundEffectPrivate::isPlaying() const { return m_playing; } QSoundEffect::Status QSoundEffectPrivate::status() const { return m_status; } void QSoundEffectPrivate::setPlaying(bool playing) { #ifdef QT_PA_DEBUG qDebug() << this << "setPlaying(" << playing << ")"; #endif if (m_playing == playing) return; if (!playing) m_playQueued = false; m_playing = playing; emit playingChanged(); } void QSoundEffectPrivate::setStatus(QSoundEffect::Status status) { #ifdef QT_PA_DEBUG qDebug() << this << "setStatus" << status; #endif if (m_status == status) return; bool oldLoaded = isLoaded(); m_status = status; emit statusChanged(); if (oldLoaded != isLoaded()) emit loadedChanged(); } void QSoundEffectPrivate::setLoopsRemaining(int loopsRemaining) { #ifdef QT_PA_DEBUG qDebug() << this << "setLoopsRemaining " << loopsRemaining; #endif if (m_runningCount == loopsRemaining) return; m_runningCount = loopsRemaining; emit loopsRemainingChanged(); } void QSoundEffectPrivate::play() { #ifdef QT_PA_DEBUG qDebug() << this << "play"; #endif if (m_status == QSoundEffect::Null || m_status == QSoundEffect::Error || m_playQueued) return; PulseDaemonLocker locker; if (!m_pulseStream || m_status != QSoundEffect::Ready || m_stopping || m_emptying) { #ifdef QT_PA_DEBUG qDebug() << this << "play deferred"; #endif m_playQueued = true; } else { if (m_playing) { //restart playing from the beginning #ifdef QT_PA_DEBUG qDebug() << this << "restart playing"; #endif setLoopsRemaining(0); m_playQueued = true; Q_ASSERT(m_pulseStream); emptyStream(); return; } m_runningCount = m_loopCount; playSample(); } setPlaying(true); } void QSoundEffectPrivate::emptyStream() { #ifdef QT_PA_DEBUG qDebug() << this << "emptyStream"; #endif m_emptying = true; pa_stream_set_write_callback(m_pulseStream, 0, 0); pa_stream_set_underflow_callback(m_pulseStream, 0, 0); pa_operation_unref(pa_stream_flush(m_pulseStream, stream_flush_callback, m_ref->getRef())); } void QSoundEffectPrivate::emptyComplete(void *stream) { PulseDaemonLocker locker; #ifdef QT_PA_DEBUG qDebug() << this << "emptyComplete"; #endif m_emptying = false; if ((pa_stream *)stream == m_pulseStream) pa_operation_unref(pa_stream_cork(m_pulseStream, 1, stream_cork_callback, m_ref->getRef())); } void QSoundEffectPrivate::sampleReady() { #ifdef QT_PA_DEBUG qDebug() << this << "sampleReady"; #endif disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); disconnect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); pa_sample_spec newFormatSpec = audioFormatToSampleSpec(m_sample->format()); if (m_pulseStream && !pa_sample_spec_equal(&m_pulseSpec, &newFormatSpec)) { unloadPulseStream(); } m_pulseSpec = newFormatSpec; m_sampleReady = true; m_position = 0; if (m_name.isNull()) m_name = QString(QLatin1String("QtPulseSample-%1-%2")).arg(::getpid()).arg(quintptr(this)).toUtf8(); PulseDaemonLocker locker; if (m_pulseStream) { #ifdef QT_PA_DEBUG qDebug() << this << "reuse existing pulsestream"; #endif #ifdef QTM_PULSEAUDIO_DEFAULTBUFFER const pa_buffer_attr *bufferAttr = pa_stream_get_buffer_attr(m_pulseStream); if (bufferAttr->prebuf > uint32_t(m_sample->data().size())) { pa_buffer_attr newBufferAttr; newBufferAttr = *bufferAttr; newBufferAttr.prebuf = m_sample->data().size(); pa_operation_unref(pa_stream_set_buffer_attr(m_pulseStream, &newBufferAttr, stream_adjust_prebuffer_callback, m_ref->getRef())); } else { streamReady(); } #else const pa_buffer_attr *bufferAttr = pa_stream_get_buffer_attr(m_pulseStream); if (bufferAttr->tlength < m_sample->data().size() && bufferAttr->tlength < QT_PA_STREAM_BUFFER_SIZE_MAX) { pa_buffer_attr newBufferAttr; newBufferAttr.maxlength = -1; newBufferAttr.tlength = qMin(m_sample->data().size(), QT_PA_STREAM_BUFFER_SIZE_MAX); newBufferAttr.minreq = bufferAttr->tlength / 2; newBufferAttr.prebuf = -1; newBufferAttr.fragsize = -1; pa_operation_unref(pa_stream_set_buffer_attr(m_pulseStream, &newBufferAttr, stream_reset_buffer_callback, m_ref->getRef())); } else if (bufferAttr->prebuf > uint32_t(m_sample->data().size())) { pa_buffer_attr newBufferAttr; newBufferAttr = *bufferAttr; newBufferAttr.prebuf = m_sample->data().size(); pa_operation_unref(pa_stream_set_buffer_attr(m_pulseStream, &newBufferAttr, stream_adjust_prebuffer_callback, m_ref->getRef())); } else { streamReady(); } #endif } else { if (pa_context_get_state(pulseDaemon()->context()) != PA_CONTEXT_READY) { connect(pulseDaemon(), SIGNAL(contextReady()), SLOT(contextReady())); return; } createPulseStream(); } } void QSoundEffectPrivate::decoderError() { qWarning("QSoundEffect(pulseaudio): Error decoding source"); disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); bool playingDirty = false; if (m_playing) { m_playing = false; playingDirty = true; } setStatus(QSoundEffect::Error); if (playingDirty) emit playingChanged(); } void QSoundEffectPrivate::unloadPulseStream() { #ifdef QT_PA_DEBUG qDebug() << this << "unloadPulseStream"; #endif m_sinkInputId = -1; PulseDaemonLocker locker; if (m_pulseStream) { pa_stream_set_state_callback(m_pulseStream, 0, 0); pa_stream_set_write_callback(m_pulseStream, 0, 0); pa_stream_set_underflow_callback(m_pulseStream, 0, 0); pa_stream_disconnect(m_pulseStream); pa_stream_unref(m_pulseStream); disconnect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume())); m_pulseStream = 0; m_reloadCategory = false; // category will be reloaded when we connect anyway } } void QSoundEffectPrivate::prepare() { if (!m_pulseStream || !m_sampleReady) return; PulseDaemonLocker locker; pa_stream_set_write_callback(m_pulseStream, stream_write_callback, this); pa_stream_set_underflow_callback(m_pulseStream, stream_underrun_callback, this); m_stopping = false; size_t writeBytes = size_t(qMin(m_pulseBufferSize, m_sample->data().size())); #ifdef QT_PA_DEBUG qDebug() << this << "prepare(): writable size =" << pa_stream_writable_size(m_pulseStream) << "actual writeBytes =" << writeBytes << "m_playQueued =" << m_playQueued; #endif m_position = int(writeBytes); if (pa_stream_write(m_pulseStream, reinterpret_cast(const_cast(m_sample->data().data())), writeBytes, stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) { qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context()))); } if (m_playQueued) { m_playQueued = false; setLoopsRemaining(m_loopCount); playSample(); } } void QSoundEffectPrivate::uploadSample() { if (m_runningCount == 0) { #ifdef QT_PA_DEBUG qDebug() << this << "uploadSample: return due to 0 m_runningCount"; #endif return; } #ifdef QT_PA_DEBUG qDebug() << this << "uploadSample: m_runningCount =" << m_runningCount; #endif if (m_position == m_sample->data().size()) { m_position = 0; if (m_runningCount > 0) setLoopsRemaining(m_runningCount - 1); if (m_runningCount == 0) { return; } } int writtenBytes = 0; int writableSize = int(pa_stream_writable_size(m_pulseStream)); int firstPartLength = qMin(m_sample->data().size() - m_position, writableSize); if (pa_stream_write(m_pulseStream, reinterpret_cast(const_cast(m_sample->data().data()) + m_position), firstPartLength, stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) { qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context()))); } writtenBytes = firstPartLength; m_position += firstPartLength; if (m_position == m_sample->data().size()) { m_position = 0; if (m_runningCount > 0) setLoopsRemaining(m_runningCount - 1); if (m_runningCount != 0 && firstPartLength < writableSize) { while (writtenBytes < writableSize) { int writeSize = qMin(writableSize - writtenBytes, m_sample->data().size()); if (pa_stream_write(m_pulseStream, reinterpret_cast(const_cast(m_sample->data().data())), writeSize, stream_write_done_callback, 0, PA_SEEK_RELATIVE) != 0) { qWarning("QSoundEffect(pulseaudio): pa_stream_write, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context()))); } writtenBytes += writeSize; if (writeSize < m_sample->data().size()) { m_position = writeSize; break; } if (m_runningCount > 0) setLoopsRemaining(m_runningCount - 1); if (m_runningCount == 0) break; } } } #ifdef QT_PA_DEBUG qDebug() << this << "uploadSample: use direct write, writeable size =" << writableSize << "actual writtenBytes =" << writtenBytes; #endif } void QSoundEffectPrivate::playSample() { #ifdef QT_PA_DEBUG qDebug() << this << "playSample"; #endif Q_ASSERT(m_pulseStream); Q_ASSERT(pa_stream_get_state(m_pulseStream) == PA_STREAM_READY); pa_operation *o = pa_stream_cork(m_pulseStream, 0, 0, 0); if (o) pa_operation_unref(o); } void QSoundEffectPrivate::stop() { #ifdef QT_PA_DEBUG qDebug() << this << "stop"; #endif if (!m_playing) return; setPlaying(false); PulseDaemonLocker locker; m_stopping = true; if (m_pulseStream) { emptyStream(); if (m_reloadCategory) { unloadPulseStream(); // upon play we reconnect anyway } } setLoopsRemaining(0); m_position = 0; m_playQueued = false; m_reloadCategory = false; } void QSoundEffectPrivate::underRun() { stop(); } void QSoundEffectPrivate::streamReady() { #ifdef QT_PA_DEBUG qDebug() << this << "streamReady"; #endif PulseDaemonLocker locker; m_sinkInputId = pa_stream_get_index(m_pulseStream); updateMuted(); updateVolume(); #ifdef QT_PA_DEBUG const pa_buffer_attr *realBufAttr = pa_stream_get_buffer_attr(m_pulseStream); qDebug() << this << "m_sinkInputId =" << m_sinkInputId << "tlength =" << realBufAttr->tlength << "maxlength =" << realBufAttr->maxlength << "minreq = " << realBufAttr->minreq << "prebuf =" << realBufAttr->prebuf; #endif prepare(); setStatus(QSoundEffect::Ready); } void QSoundEffectPrivate::createPulseStream() { #ifdef QT_PA_DEBUG qDebug() << this << "createPulseStream"; #endif pa_proplist *propList = pa_proplist_new(); if (m_category.isNull()) { // Meant to be one of the strings "video", "music", "game", "event", "phone", "animation", "production", "a11y", "test" pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, "game"); } else { pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, m_category.toLatin1().constData()); } pa_stream *stream = pa_stream_new_with_proplist(pulseDaemon()->context(), m_name.constData(), &m_pulseSpec, 0, propList); pa_proplist_free(propList); connect(pulseDaemon(), SIGNAL(volumeChanged()), this, SLOT(updateVolume())); if (stream == 0) { qWarning("QSoundEffect(pulseaudio): Failed to create stream"); m_pulseStream = 0; setStatus(QSoundEffect::Error); setPlaying(false); return; } else { pa_stream_set_state_callback(stream, stream_state_callback, this); pa_stream_set_write_callback(stream, stream_write_callback, this); pa_stream_set_underflow_callback(stream, stream_underrun_callback, this); } m_pulseStream = stream; #ifndef QTM_PULSEAUDIO_DEFAULTBUFFER pa_buffer_attr bufferAttr; bufferAttr.tlength = qMin(m_sample->data().size(), QT_PA_STREAM_BUFFER_SIZE_MAX); bufferAttr.maxlength = -1; bufferAttr.minreq = bufferAttr.tlength / 2; bufferAttr.prebuf = -1; bufferAttr.fragsize = -1; if (pa_stream_connect_playback(m_pulseStream, 0, &bufferAttr, #else if (pa_stream_connect_playback(m_pulseStream, 0, 0, #endif m_muted ? pa_stream_flags_t(PA_STREAM_START_MUTED | PA_STREAM_START_CORKED) : pa_stream_flags_t(PA_STREAM_START_UNMUTED | PA_STREAM_START_CORKED), 0, 0) < 0) { qWarning("QSoundEffect(pulseaudio): Failed to connect stream, error = %s", pa_strerror(pa_context_errno(pulseDaemon()->context()))); } } void QSoundEffectPrivate::contextReady() { disconnect(pulseDaemon(), SIGNAL(contextReady()), this, SLOT(contextReady())); PulseDaemonLocker locker; createPulseStream(); } void QSoundEffectPrivate::stream_write_callback(pa_stream *s, size_t length, void *userdata) { Q_UNUSED(length); Q_UNUSED(s); QSoundEffectPrivate *self = reinterpret_cast(userdata); #ifdef QT_PA_DEBUG qDebug() << self << "stream_write_callback"; #endif self->uploadSample(); } void QSoundEffectPrivate::stream_state_callback(pa_stream *s, void *userdata) { QSoundEffectPrivate *self = reinterpret_cast(userdata); switch (pa_stream_get_state(s)) { case PA_STREAM_READY: { #ifdef QT_PA_DEBUG qDebug() << self << "pulse stream ready"; #endif const pa_buffer_attr *bufferAttr = pa_stream_get_buffer_attr(self->m_pulseStream); self->m_pulseBufferSize = bufferAttr->tlength; if (bufferAttr->prebuf > uint32_t(self->m_sample->data().size())) { pa_buffer_attr newBufferAttr; newBufferAttr = *bufferAttr; newBufferAttr.prebuf = self->m_sample->data().size(); pa_stream_set_buffer_attr(self->m_pulseStream, &newBufferAttr, stream_adjust_prebuffer_callback, self->m_ref->getRef()); } else { QMetaObject::invokeMethod(self, "streamReady", Qt::QueuedConnection); } break; } case PA_STREAM_CREATING: #ifdef QT_PA_DEBUG qDebug() << self << "pulse stream creating"; #endif break; case PA_STREAM_TERMINATED: #ifdef QT_PA_DEBUG qDebug() << self << "pulse stream terminated"; #endif break; case PA_STREAM_FAILED: default: qWarning("QSoundEffect(pulseaudio): Error in pulse audio stream"); break; } } void QSoundEffectPrivate::stream_reset_buffer_callback(pa_stream *s, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "stream_reset_buffer_callback"; #endif Q_UNUSED(s); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; if (!success) qWarning("QSoundEffect(pulseaudio): faild to reset buffer attribute"); #ifdef QT_PA_DEBUG qDebug() << self << "stream_reset_buffer_callback"; #endif const pa_buffer_attr *bufferAttr = pa_stream_get_buffer_attr(self->m_pulseStream); self->m_pulseBufferSize = bufferAttr->tlength; if (bufferAttr->prebuf > uint32_t(self->m_sample->data().size())) { pa_buffer_attr newBufferAttr; newBufferAttr = *bufferAttr; newBufferAttr.prebuf = self->m_sample->data().size(); pa_stream_set_buffer_attr(self->m_pulseStream, &newBufferAttr, stream_adjust_prebuffer_callback, userdata); } else { QMetaObject::invokeMethod(self, "streamReady", Qt::QueuedConnection); } } void QSoundEffectPrivate::stream_adjust_prebuffer_callback(pa_stream *s, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "stream_adjust_prebuffer_callback"; #endif Q_UNUSED(s); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; if (!success) qWarning("QSoundEffect(pulseaudio): faild to adjust pre-buffer attribute"); #ifdef QT_PA_DEBUG qDebug() << self << "stream_adjust_prebuffer_callback"; #endif QMetaObject::invokeMethod(self, "streamReady", Qt::QueuedConnection); } void QSoundEffectPrivate::setvolume_callback(pa_context *c, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "setvolume_callback"; #endif Q_UNUSED(c); Q_UNUSED(userdata); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; #ifdef QT_PA_DEBUG qDebug() << self << "setvolume_callback"; #endif if (!success) { qWarning("QSoundEffect(pulseaudio): faild to set volume"); } } void QSoundEffectPrivate::setmuted_callback(pa_context *c, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "setmuted_callback"; #endif Q_UNUSED(c); Q_UNUSED(userdata); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; #ifdef QT_PA_DEBUG qDebug() << self << "setmuted_callback"; #endif if (!success) { qWarning("QSoundEffect(pulseaudio): faild to set muted"); } } void QSoundEffectPrivate::stream_underrun_callback(pa_stream *s, void *userdata) { Q_UNUSED(s); QSoundEffectPrivate *self = reinterpret_cast(userdata); #ifdef QT_PA_DEBUG qDebug() << self << "stream_underrun_callback"; #endif if (self->m_runningCount == 0 && !self->m_playQueued) QMetaObject::invokeMethod(self, "underRun", Qt::QueuedConnection); #ifdef QT_PA_DEBUG else qDebug() << "underun corked =" << pa_stream_is_corked(s); #endif } void QSoundEffectPrivate::stream_cork_callback(pa_stream *s, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "stream_cork_callback"; #endif Q_UNUSED(s); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; if (!success) qWarning("QSoundEffect(pulseaudio): faild to stop"); #ifdef QT_PA_DEBUG qDebug() << self << "stream_cork_callback"; #endif QMetaObject::invokeMethod(self, "prepare", Qt::QueuedConnection); } void QSoundEffectPrivate::stream_flush_callback(pa_stream *s, int success, void *userdata) { #ifdef QT_PA_DEBUG qDebug() << "stream_flush_callback"; #endif Q_UNUSED(s); QSoundEffectRef *ref = reinterpret_cast(userdata); QSoundEffectPrivate *self = ref->soundEffect(); ref->release(); if (!self) return; if (!success) qWarning("QSoundEffect(pulseaudio): faild to drain"); #ifdef QT_PA_DEBUG qDebug() << self << "stream_flush_callback"; #endif QMetaObject::invokeMethod(self, "emptyComplete", Qt::QueuedConnection, Q_ARG(void*, s)); } void QSoundEffectPrivate::stream_write_done_callback(void *p) { Q_UNUSED(p); #ifdef QT_PA_DEBUG qDebug() << "stream_write_done_callback"; #endif } QT_END_NAMESPACE #include "moc_qsoundeffect_pulse_p.cpp" #include "qsoundeffect_pulse_p.moc" qsoundeffect_pulse_p.h000066400000000000000000000122501225012771600331300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDEFFECT_PULSE_H #define QSOUNDEFFECT_PULSE_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qsoundeffect.h" #include #include #include #include #include "qsamplecache_p.h" QT_BEGIN_NAMESPACE class QSoundEffectRef; class QSoundEffectPrivate : public QObject { Q_OBJECT public: explicit QSoundEffectPrivate(QObject* parent); ~QSoundEffectPrivate(); static QStringList supportedMimeTypes(); QUrl source() const; void setSource(const QUrl &url); int loopCount() const; int loopsRemaining() const; void setLoopCount(int loopCount); int volume() const; void setVolume(int volume); bool isMuted() const; void setMuted(bool muted); bool isLoaded() const; bool isPlaying() const; QSoundEffect::Status status() const; void release(); QString category() const; void setCategory(const QString &category); public Q_SLOTS: void play(); void stop(); Q_SIGNALS: void loopsRemainingChanged(); void volumeChanged(); void mutedChanged(); void loadedChanged(); void playingChanged(); void statusChanged(); void categoryChanged(); private Q_SLOTS: void decoderError(); void sampleReady(); void uploadSample(); void contextReady(); void underRun(); void prepare(); void streamReady(); void emptyComplete(void *stream); void updateVolume(); void updateMuted(); private: void playSample(); void emptyStream(); void createPulseStream(); void unloadPulseStream(); void setPlaying(bool playing); void setStatus(QSoundEffect::Status status); void setLoopsRemaining(int loopsRemaining); static void stream_write_callback(pa_stream *s, size_t length, void *userdata); static void stream_state_callback(pa_stream *s, void *userdata); static void stream_underrun_callback(pa_stream *s, void *userdata); static void stream_cork_callback(pa_stream *s, int success, void *userdata); static void stream_flush_callback(pa_stream *s, int success, void *userdata); static void stream_write_done_callback(void *p); static void stream_adjust_prebuffer_callback(pa_stream *s, int success, void *userdata); static void stream_reset_buffer_callback(pa_stream *s, int success, void *userdata); static void setvolume_callback(pa_context *c, int success, void *userdata); static void setmuted_callback(pa_context *c, int success, void *userdata); pa_stream *m_pulseStream; int m_sinkInputId; pa_sample_spec m_pulseSpec; int m_pulseBufferSize; bool m_emptying; bool m_sampleReady; bool m_playing; QSoundEffect::Status m_status; bool m_muted; bool m_playQueued; bool m_stopping; int m_volume; int m_loopCount; int m_runningCount; QUrl m_source; QByteArray m_name; QString m_category; bool m_reloadCategory; QSample *m_sample; int m_position; QSoundEffectRef *m_ref; }; QT_END_NAMESPACE #endif // QSOUNDEFFECT_PULSE_H qsoundeffect_qaudio_p.cpp000066400000000000000000000310331225012771600336150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // INTERNAL USE ONLY: Do NOT use for any other purpose. // #include "qsoundeffect_qaudio_p.h" #include #include #include #include #include //#include //#define QT_QAUDIO_DEBUG 1 QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC(QSampleCache, sampleCache) QSoundEffectPrivate::QSoundEffectPrivate(QObject* parent): QObject(parent), d(new PrivateSoundSource(this)) { } QSoundEffectPrivate::~QSoundEffectPrivate() { } void QSoundEffectPrivate::release() { stop(); if (d->m_audioOutput) { d->m_audioOutput->stop(); d->m_audioOutput->deleteLater(); d->m_sample->release(); } delete d; this->deleteLater(); } QStringList QSoundEffectPrivate::supportedMimeTypes() { // Only return supported mime types if we have a audio device available const QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); if (devices.size() <= 0) return QStringList(); return QStringList() << QLatin1String("audio/x-wav") << QLatin1String("audio/wav") << QLatin1String("audio/wave") << QLatin1String("audio/x-pn-wav"); } QUrl QSoundEffectPrivate::source() const { return d->m_url; } void QSoundEffectPrivate::setSource(const QUrl &url) { #ifdef QT_QAUDIO_DEBUG qDebug() << this << "setSource current=" << d->m_url << ", to=" << url; #endif Q_ASSERT(d->m_url != url); stop(); d->m_url = url; d->m_sampleReady = false; if (url.isEmpty()) { setStatus(QSoundEffect::Null); return; } if (!url.isValid()) { setStatus(QSoundEffect::Error); return; } if (d->m_sample) { if (!d->m_sampleReady) { disconnect(d->m_sample, SIGNAL(error()), d, SLOT(decoderError())); disconnect(d->m_sample, SIGNAL(ready()), d, SLOT(sampleReady())); } d->m_sample->release(); d->m_sample = 0; } setStatus(QSoundEffect::Loading); d->m_sample = sampleCache()->requestSample(url); connect(d->m_sample, SIGNAL(error()), d, SLOT(decoderError())); connect(d->m_sample, SIGNAL(ready()), d, SLOT(sampleReady())); switch (d->m_sample->state()) { case QSample::Ready: d->sampleReady(); break; case QSample::Error: d->decoderError(); break; default: break; } } int QSoundEffectPrivate::loopCount() const { return d->m_loopCount; } int QSoundEffectPrivate::loopsRemaining() const { return d->m_runningCount; } void QSoundEffectPrivate::setLoopCount(int loopCount) { #ifdef QT_QAUDIO_DEBUG qDebug() << "setLoopCount " << loopCount; #endif if (loopCount == 0) loopCount = 1; d->m_loopCount = loopCount; d->m_runningCount = loopCount; } int QSoundEffectPrivate::volume() const { if (d->m_audioOutput && !d->m_muted) return d->m_audioOutput->volume()*100.0f; return d->m_volume; } void QSoundEffectPrivate::setVolume(int volume) { d->m_volume = volume; if (d->m_audioOutput && !d->m_muted) d->m_audioOutput->setVolume(volume/100.0f); emit volumeChanged(); } bool QSoundEffectPrivate::isMuted() const { return d->m_muted; } void QSoundEffectPrivate::setMuted(bool muted) { if (muted && d->m_audioOutput) d->m_audioOutput->setVolume(0); else if (!muted && d->m_audioOutput && d->m_muted) d->m_audioOutput->setVolume(d->m_volume/100.0f); d->m_muted = muted; emit mutedChanged(); } bool QSoundEffectPrivate::isLoaded() const { return d->m_status == QSoundEffect::Ready; } bool QSoundEffectPrivate::isPlaying() const { return d->m_playing; } QSoundEffect::Status QSoundEffectPrivate::status() const { return d->m_status; } void QSoundEffectPrivate::play() { d->m_offset = 0; d->m_runningCount = d->m_loopCount; #ifdef QT_QAUDIO_DEBUG qDebug() << this << "play"; #endif if (d->m_status == QSoundEffect::Null || d->m_status == QSoundEffect::Error) { setStatus(QSoundEffect::Null); return; } if (d->m_audioOutput && d->m_audioOutput->state() == QAudio::StoppedState && d->m_sampleReady) d->m_audioOutput->start(d); setPlaying(true); } void QSoundEffectPrivate::stop() { if (!d->m_playing) return; #ifdef QT_QAUDIO_DEBUG qDebug() << "stop()"; #endif d->m_offset = 0; setPlaying(false); if (d->m_audioOutput) d->m_audioOutput->stop(); } void QSoundEffectPrivate::setStatus(QSoundEffect::Status status) { #ifdef QT_QAUDIO_DEBUG qDebug() << this << "setStatus" << status; #endif if (d->m_status == status) return; bool oldLoaded = isLoaded(); d->m_status = status; emit statusChanged(); if (oldLoaded != isLoaded()) emit loadedChanged(); } void QSoundEffectPrivate::setPlaying(bool playing) { #ifdef QT_QAUDIO_DEBUG qDebug() << this << "setPlaying(" << playing << ")"; #endif if (d->m_playing == playing) return; d->m_playing = playing; emit playingChanged(); } void QSoundEffectPrivate::setLoopsRemaining(int loopsRemaining) { if (!d->m_runningCount && loopsRemaining) return; #ifdef QT_QAUDIO_DEBUG qDebug() << this << "setLoopsRemaining " << loopsRemaining; #endif d->m_runningCount = loopsRemaining; emit loopsRemainingChanged(); } /* Categories are ignored */ QString QSoundEffectPrivate::category() const { return d->m_category; } void QSoundEffectPrivate::setCategory(const QString &category) { if (d->m_category != category && !d->m_playing) { d->m_category = category; emit categoryChanged(); } } PrivateSoundSource::PrivateSoundSource(QSoundEffectPrivate* s): m_loopCount(1), m_runningCount(0), m_playing(false), m_status(QSoundEffect::Null), m_audioOutput(0), m_sample(0), m_muted(false), m_volume(100), m_sampleReady(false), m_offset(0) { soundeffect = s; m_category = QLatin1String("game"); open(QIODevice::ReadOnly); } void PrivateSoundSource::sampleReady() { if (m_status == QSoundEffect::Error) return; #ifdef QT_QAUDIO_DEBUG qDebug() << this << "sampleReady "<format()); connect(m_audioOutput,SIGNAL(stateChanged(QAudio::State)), this, SLOT(stateChanged(QAudio::State))); if (!m_muted) m_audioOutput->setVolume(m_volume/100.0f); else m_audioOutput->setVolume(0); } m_sampleReady = true; soundeffect->setStatus(QSoundEffect::Ready); if (m_playing) m_audioOutput->start(this); } void PrivateSoundSource::decoderError() { qWarning("QSoundEffect(qaudio): Error decoding source"); disconnect(m_sample, SIGNAL(ready()), this, SLOT(sampleReady())); disconnect(m_sample, SIGNAL(error()), this, SLOT(decoderError())); m_playing = false; soundeffect->setStatus(QSoundEffect::Error); } void PrivateSoundSource::stateChanged(QAudio::State state) { #ifdef QT_QAUDIO_DEBUG qDebug() << this << "stateChanged " << state; #endif if (state == QAudio::IdleState && m_runningCount == 0) emit soundeffect->stop(); } qint64 PrivateSoundSource::readData( char* data, qint64 len) { if (m_runningCount > 0 && m_playing) { if (m_sample->state() != QSample::Ready) return 0; qint64 bytesWritten = 0; const int periodSize = m_audioOutput->periodSize(); const int sampleSize = m_sample->data().size(); const char* sampleData = m_sample->data().constData(); // Some systems can have large buffers we only need a max of three int periodsFree = qMin(3, (int)(m_audioOutput->bytesFree()/periodSize)); int dataOffset = 0; #ifdef QT_QAUDIO_DEBUG qDebug() << "bytesFree=" << m_audioOutput->bytesFree() << ", can fit " << periodsFree << " periodSize() chunks"; #endif while ((periodsFree > 0) && (bytesWritten + periodSize <= len)) { if (sampleSize - m_offset >= periodSize) { // We can fit a whole period of data memcpy(data + dataOffset, sampleData + m_offset, periodSize); m_offset += periodSize; dataOffset += periodSize; bytesWritten += periodSize; #ifdef QT_QAUDIO_DEBUG qDebug() << "WHOLE PERIOD: bytesWritten=" << bytesWritten << ", offset=" << m_offset << ", filesize=" << sampleSize; #endif } else { // We are at end of sound, first write what is left of current sound memcpy(data + dataOffset, sampleData + m_offset, sampleSize - m_offset); bytesWritten += sampleSize - m_offset; int wrapLen = periodSize - (sampleSize - m_offset); #ifdef QT_QAUDIO_DEBUG qDebug() << "END OF SOUND: bytesWritten=" << bytesWritten << ", offset=" << m_offset << ", part1=" << (sampleSize-m_offset); #endif dataOffset += (sampleSize - m_offset); m_offset = 0; if (m_runningCount > 0 && m_runningCount != QSoundEffect::Infinite) soundeffect->setLoopsRemaining(m_runningCount-1); if (m_runningCount > 0 || m_runningCount == QSoundEffect::Infinite) { // There are still more loops of this sound to play, append the start of sound to make up full period memcpy(data + dataOffset, sampleData + m_offset, wrapLen); m_offset += wrapLen; dataOffset += wrapLen; bytesWritten += wrapLen; #ifdef QT_QAUDIO_DEBUG qDebug() << "APPEND START FOR FULL PERIOD: bytesWritten=" << bytesWritten << ", offset=" << m_offset << ", part2=" << wrapLen; qDebug() << "part1 + part2 should be a period " << periodSize; #endif } } if (m_runningCount == 0) break; periodsFree--; } return bytesWritten; } return 0; } qint64 PrivateSoundSource::writeData(const char* data, qint64 len) { Q_UNUSED(data) Q_UNUSED(len) return 0; } QT_END_NAMESPACE #include "moc_qsoundeffect_qaudio_p.cpp" qsoundeffect_qaudio_p.h000066400000000000000000000105021225012771600332600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSOUNDEFFECT_QAUDIO_H #define QSOUNDEFFECT_QAUDIO_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include "qaudiooutput.h" #include "qsamplecache_p.h" #include "qsoundeffect.h" QT_BEGIN_NAMESPACE class QSoundEffectPrivate; class PrivateSoundSource : public QIODevice { friend class QSoundEffectPrivate; Q_OBJECT public: PrivateSoundSource(QSoundEffectPrivate* s); ~PrivateSoundSource() {} qint64 readData( char* data, qint64 len); qint64 writeData(const char* data, qint64 len); private Q_SLOTS: void sampleReady(); void decoderError(); void stateChanged(QAudio::State); private: QUrl m_url; int m_loopCount; int m_runningCount; bool m_playing; QSoundEffect::Status m_status; QAudioOutput *m_audioOutput; QSample *m_sample; bool m_muted; int m_volume; bool m_sampleReady; qint64 m_offset; QString m_category; QSoundEffectPrivate *soundeffect; }; class QSoundEffectPrivate : public QObject { friend class PrivateSoundSource; Q_OBJECT public: explicit QSoundEffectPrivate(QObject* parent); ~QSoundEffectPrivate(); static QStringList supportedMimeTypes(); QUrl source() const; void setSource(const QUrl &url); int loopCount() const; int loopsRemaining() const; void setLoopCount(int loopCount); int volume() const; void setVolume(int volume); bool isMuted() const; void setMuted(bool muted); bool isLoaded() const; bool isPlaying() const; QSoundEffect::Status status() const; void release(); QString category() const; void setCategory(const QString &); public Q_SLOTS: void play(); void stop(); Q_SIGNALS: void loopsRemainingChanged(); void volumeChanged(); void mutedChanged(); void loadedChanged(); void playingChanged(); void statusChanged(); void categoryChanged(); private: void setStatus(QSoundEffect::Status status); void setPlaying(bool playing); void setLoopsRemaining(int loopsRemaining); PrivateSoundSource* d; }; QT_END_NAMESPACE #endif // QSOUNDEFFECT_QAUDIO_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qwavedecoder_p.cpp000066400000000000000000000230211225012771600323130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qwavedecoder_p.h" #include #include QT_BEGIN_NAMESPACE QWaveDecoder::QWaveDecoder(QIODevice *s, QObject *parent): QIODevice(parent), haveFormat(false), dataSize(0), source(s), state(QWaveDecoder::InitialState), junkToSkip(0), bigEndian(false) { open(QIODevice::ReadOnly | QIODevice::Unbuffered); if (enoughDataAvailable()) QTimer::singleShot(0, this, SLOT(handleData())); else connect(source, SIGNAL(readyRead()), SLOT(handleData())); } QWaveDecoder::~QWaveDecoder() { } QAudioFormat QWaveDecoder::audioFormat() const { return format; } int QWaveDecoder::duration() const { return size() * 1000 / (format.sampleSize() / 8) / format.channelCount() / format.sampleRate(); } qint64 QWaveDecoder::size() const { return haveFormat ? dataSize : 0; } bool QWaveDecoder::isSequential() const { return source->isSequential(); } qint64 QWaveDecoder::bytesAvailable() const { return haveFormat ? source->bytesAvailable() : 0; } qint64 QWaveDecoder::readData(char *data, qint64 maxlen) { return haveFormat ? source->read(data, maxlen) : 0; } qint64 QWaveDecoder::writeData(const char *data, qint64 len) { Q_UNUSED(data); Q_UNUSED(len); return -1; } void QWaveDecoder::parsingFailed() { Q_ASSERT(source); source->disconnect(SIGNAL(readyRead()), this, SLOT(handleData())); emit parsingError(); } void QWaveDecoder::handleData() { // As a special "state", if we have junk to skip, we do if (junkToSkip > 0) { discardBytes(junkToSkip); // this also updates junkToSkip // If we couldn't skip all the junk, return if (junkToSkip > 0) { // We might have run out if (source->atEnd()) parsingFailed(); return; } } if (state == QWaveDecoder::InitialState) { if (source->bytesAvailable() < qint64(sizeof(RIFFHeader))) return; RIFFHeader riff; source->read(reinterpret_cast(&riff), sizeof(RIFFHeader)); // RIFF = little endian RIFF, RIFX = big endian RIFF if (((qstrncmp(riff.descriptor.id, "RIFF", 4) != 0) && (qstrncmp(riff.descriptor.id, "RIFX", 4) != 0)) || qstrncmp(riff.type, "WAVE", 4) != 0) { parsingFailed(); return; } else { state = QWaveDecoder::WaitingForFormatState; if (qstrncmp(riff.descriptor.id, "RIFX", 4) == 0) bigEndian = true; else bigEndian = false; } } if (state == QWaveDecoder::WaitingForFormatState) { if (findChunk("fmt ")) { chunk descriptor; peekChunk(&descriptor); quint32 rawChunkSize = descriptor.size + sizeof(chunk); if (source->bytesAvailable() < qint64(rawChunkSize)) return; WAVEHeader wave; source->read(reinterpret_cast(&wave), sizeof(WAVEHeader)); if (rawChunkSize > sizeof(WAVEHeader)) discardBytes(rawChunkSize - sizeof(WAVEHeader)); // Swizzle this if (bigEndian) { wave.audioFormat = qFromBigEndian(wave.audioFormat); } if (wave.audioFormat != 0 && wave.audioFormat != 1) { // 32bit wave files have format == 0xFFFE (WAVE_FORMAT_EXTENSIBLE). // but don't support them at the moment. parsingFailed(); return; } else { format.setCodec(QLatin1String("audio/pcm")); if (bigEndian) { int bps = qFromBigEndian(wave.bitsPerSample); format.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt); format.setByteOrder(QAudioFormat::BigEndian); format.setSampleRate(qFromBigEndian(wave.sampleRate)); format.setSampleSize(bps); format.setChannelCount(qFromBigEndian(wave.numChannels)); } else { int bps = qFromLittleEndian(wave.bitsPerSample); format.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleRate(qFromLittleEndian(wave.sampleRate)); format.setSampleSize(bps); format.setChannelCount(qFromLittleEndian(wave.numChannels)); } state = QWaveDecoder::WaitingForDataState; } } } if (state == QWaveDecoder::WaitingForDataState) { if (findChunk("data")) { source->disconnect(SIGNAL(readyRead()), this, SLOT(handleData())); chunk descriptor; source->read(reinterpret_cast(&descriptor), sizeof(chunk)); if (bigEndian) descriptor.size = qFromBigEndian(descriptor.size); dataSize = descriptor.size; haveFormat = true; connect(source, SIGNAL(readyRead()), SIGNAL(readyRead())); emit formatKnown(); return; } } // If we hit the end without finding data, it's a parsing error if (source->atEnd()) { parsingFailed(); } } bool QWaveDecoder::enoughDataAvailable() { chunk descriptor; if (!peekChunk(&descriptor)) return false; // This is only called for the RIFF/RIFX header, before bigEndian is set, // so we have to manually swizzle if (qstrncmp(descriptor.id, "RIFX", 4) == 0) descriptor.size = qFromBigEndian(descriptor.size); if (source->bytesAvailable() < qint64(sizeof(chunk) + descriptor.size)) return false; return true; } bool QWaveDecoder::findChunk(const char *chunkId) { chunk descriptor; if (!peekChunk(&descriptor)) return false; if (qstrncmp(descriptor.id, chunkId, 4) == 0) return true; // It's possible that bytes->available() is less than the chunk size // if it's corrupt. junkToSkip = qint64(sizeof(chunk) + descriptor.size); while (source->bytesAvailable() > 0) { // Skip the current amount if (junkToSkip > 0) discardBytes(junkToSkip); // If we still have stuff left, just exit and try again later // since we can't call peekChunk if (junkToSkip > 0) return false; if (!peekChunk(&descriptor)) return false; if (qstrncmp(descriptor.id, chunkId, 4) == 0) return true; } return false; } // Handles endianness bool QWaveDecoder::peekChunk(chunk *pChunk) { if (source->bytesAvailable() < qint64(sizeof(chunk))) return false; source->peek(reinterpret_cast(pChunk), sizeof(chunk)); if (bigEndian) pChunk->size = qFromBigEndian(pChunk->size); return true; } void QWaveDecoder::discardBytes(qint64 numBytes) { // Discards a number of bytes // If the iodevice doesn't have this many bytes in it, // remember how much more junk we have to skip. if (source->isSequential()) { QByteArray r = source->read(qMin(numBytes, qint64(16384))); // uggh, wasted memory, limit to a max of 16k if (r.size() < numBytes) junkToSkip = numBytes - r.size(); else junkToSkip = 0; } else { quint64 origPos = source->pos(); source->seek(source->pos() + numBytes); junkToSkip = origPos + numBytes - source->pos(); } } QT_END_NAMESPACE #include "moc_qwavedecoder_p.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/audio/qwavedecoder_p.h000066400000000000000000000072651225012771600317740ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WAVEDECODER_H #define WAVEDECODER_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of other Qt classes. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE class QWaveDecoder : public QIODevice { Q_OBJECT public: explicit QWaveDecoder(QIODevice *source, QObject *parent = 0); ~QWaveDecoder(); QAudioFormat audioFormat() const; int duration() const; qint64 size() const; bool isSequential() const; qint64 bytesAvailable() const; Q_SIGNALS: void formatKnown(); void parsingError(); private Q_SLOTS: void handleData(); private: qint64 readData(char *data, qint64 maxlen); qint64 writeData(const char *data, qint64 len); bool enoughDataAvailable(); bool findChunk(const char *chunkId); void discardBytes(qint64 numBytes); void parsingFailed(); enum State { InitialState, WaitingForFormatState, WaitingForDataState }; struct chunk { char id[4]; quint32 size; }; bool peekChunk(chunk* pChunk); struct RIFFHeader { chunk descriptor; char type[4]; }; struct WAVEHeader { chunk descriptor; quint16 audioFormat; quint16 numChannels; quint32 sampleRate; quint32 byteRate; quint16 blockAlign; quint16 bitsPerSample; }; bool haveFormat; qint64 dataSize; QAudioFormat format; QIODevice *source; State state; quint32 junkToSkip; bool bigEndian; }; QT_END_NAMESPACE #endif // WAVEDECODER_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/000077500000000000000000000000001225012771600267505ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/camera.pri000066400000000000000000000005661225012771600307230ustar00rootroot00000000000000INCLUDEPATH += camera PUBLIC_HEADERS += \ camera/qcamera.h \ camera/qcameraimagecapture.h \ camera/qcameraexposure.h \ camera/qcamerafocus.h \ camera/qcameraimageprocessing.h SOURCES += \ camera/qcamera.cpp \ camera/qcameraexposure.cpp \ camera/qcamerafocus.cpp \ camera/qcameraimageprocessing.cpp \ camera/qcameraimagecapture.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/qcamera.cpp000066400000000000000000000713701225012771600310750ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideosurfaceoutput_p.h" #include "qmediaobject_p.h" #include "qmediaserviceprovider_p.h" #include #include #include #include #include #include #include #include #include #include namespace { class CameraRegisterMetaTypes { public: CameraRegisterMetaTypes() { qRegisterMetaType("QCamera::Error"); qRegisterMetaType("QCamera::State"); qRegisterMetaType("QCamera::Status"); qRegisterMetaType("QCamera::CaptureModes"); qRegisterMetaType("QCamera::LockType"); qRegisterMetaType("QCamera::LockStatus"); qRegisterMetaType("QCamera::LockChangeReason"); } } _registerCameraMetaTypes; } QT_BEGIN_NAMESPACE /*! \class QCamera \brief The QCamera class provides interface for system camera devices. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera QCamera can be used with QVideoWidget for viewfinder display, QMediaRecorder for video recording and QCameraImageCapture for image taking. See the \l{Camera Overview}{camera overview} for more information. \snippet multimedia-snippets/media.cpp Request control */ class QCameraPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QCamera) public: QCameraPrivate(): QMediaObjectPrivate(), provider(0), control(0), deviceControl(0), viewfinder(0), capture(0), state(QCamera::UnloadedState), error(QCamera::NoError), supportedLocks(QCamera::NoLock), requestedLocks(QCamera::NoLock), lockStatus(QCamera::Unlocked), lockChangeReason(QCamera::UserRequest), supressLockChangedSignal(false), restartPending(false) { } void initControls(); QMediaServiceProvider *provider; QCameraControl *control; QVideoDeviceSelectorControl *deviceControl; QCameraLocksControl *locksControl; QCameraExposure *cameraExposure; QCameraFocus *cameraFocus; QCameraImageProcessing *imageProcessing; QObject *viewfinder; QObject *capture; QCamera::State state; QCamera::Error error; QString errorString; QCamera::LockTypes supportedLocks; QCamera::LockTypes requestedLocks; QCamera::LockStatus lockStatus; QCamera::LockChangeReason lockChangeReason; bool supressLockChangedSignal; bool restartPending; QVideoSurfaceOutput surfaceViewfinder; void _q_error(int error, const QString &errorString); void unsetError() { error = QCamera::NoError; errorString.clear(); } void setState(QCamera::State); void _q_updateLockStatus(QCamera::LockType, QCamera::LockStatus, QCamera::LockChangeReason); void _q_updateState(QCamera::State newState); void _q_preparePropertyChange(int changeType); void _q_restartCamera(); void updateLockStatus(); }; void QCameraPrivate::_q_error(int error, const QString &errorString) { Q_Q(QCamera); this->error = QCamera::Error(error); this->errorString = errorString; qWarning() << "Camera error:" << errorString; emit q->error(this->error); } void QCameraPrivate::setState(QCamera::State newState) { Q_Q(QCamera); unsetError(); if (!control) { _q_error(QCamera::ServiceMissingError, QCamera::tr("The camera service is missing")); return; } if (state == newState) return; restartPending = false; state = newState; control->setState(state); emit q->stateChanged(state); } void QCameraPrivate::_q_updateState(QCamera::State newState) { Q_Q(QCamera); //omit changins state to Loaded when the camera is temporarily //stopped to apply shanges if (restartPending) return; if (newState != state) { qDebug() << "Camera state changed:" << newState; state = newState; emit q->stateChanged(state); } } void QCameraPrivate::_q_preparePropertyChange(int changeType) { if (!control) return; QCamera::Status status = control->status(); //all the changes are allowed until the camera is starting if (control->state() != QCamera::ActiveState) return; if (control->canChangeProperty(QCameraControl::PropertyChangeType(changeType), status)) return; restartPending = true; control->setState(QCamera::LoadedState); QMetaObject::invokeMethod(q_ptr, "_q_restartCamera", Qt::QueuedConnection); } void QCameraPrivate::_q_restartCamera() { if (restartPending) { restartPending = false; control->setState(QCamera::ActiveState); } } void QCameraPrivate::initControls() { Q_Q(QCamera); supportedLocks = 0; if (service) { control = qobject_cast(service->requestControl(QCameraControl_iid)); locksControl = qobject_cast(service->requestControl(QCameraLocksControl_iid)); deviceControl = qobject_cast(service->requestControl(QVideoDeviceSelectorControl_iid)); if (control) { q->connect(control, SIGNAL(stateChanged(QCamera::State)), q, SLOT(_q_updateState(QCamera::State))); q->connect(control, SIGNAL(statusChanged(QCamera::Status)), q, SIGNAL(statusChanged(QCamera::Status))); q->connect(control, SIGNAL(captureModeChanged(QCamera::CaptureModes)), q, SIGNAL(captureModeChanged(QCamera::CaptureModes))); q->connect(control, SIGNAL(error(int,QString)), q, SLOT(_q_error(int,QString))); } if (locksControl) { q->connect(locksControl, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason)), q, SLOT(_q_updateLockStatus(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason))); supportedLocks = locksControl->supportedLocks(); } error = QCamera::NoError; } else { control = 0; locksControl = 0; deviceControl = 0; error = QCamera::ServiceMissingError; errorString = QCamera::tr("The camera service is missing"); } } void QCameraPrivate::updateLockStatus() { Q_Q(QCamera); QCamera::LockStatus oldStatus = lockStatus; QMap lockStatusPriority; lockStatusPriority.insert(QCamera::Locked, 1); lockStatusPriority.insert(QCamera::Searching, 2); lockStatusPriority.insert(QCamera::Unlocked, 3); lockStatus = requestedLocks ? QCamera::Locked : QCamera::Unlocked; int priority = 0; QList lockStatuses; if (requestedLocks & QCamera::LockFocus) lockStatuses << q->lockStatus(QCamera::LockFocus); if (requestedLocks & QCamera::LockExposure) lockStatuses << q->lockStatus(QCamera::LockExposure); if (requestedLocks & QCamera::LockWhiteBalance) lockStatuses << q->lockStatus(QCamera::LockWhiteBalance); foreach (QCamera::LockStatus currentStatus, lockStatuses) { int currentPriority = lockStatusPriority.value(currentStatus, -1); if (currentPriority > priority) { priority = currentPriority; lockStatus = currentStatus; } } if (!supressLockChangedSignal && oldStatus != lockStatus) { emit q->lockStatusChanged(lockStatus, lockChangeReason); if (lockStatus == QCamera::Locked) emit q->locked(); else if (lockStatus == QCamera::Unlocked && lockChangeReason == QCamera::LockFailed) emit q->lockFailed(); } /* qDebug() << "Requested locks:" << (requestedLocks & QCamera::LockExposure ? 'e' : ' ') << (requestedLocks & QCamera::LockFocus ? 'f' : ' ') << (requestedLocks & QCamera::LockWhiteBalance ? 'w' : ' '); qDebug() << "Lock status: f:" << q->lockStatus(QCamera::LockFocus) << " e:" << q->lockStatus(QCamera::LockExposure) << " w:" << q->lockStatus(QCamera::LockWhiteBalance) << " composite:" << lockStatus; */ } void QCameraPrivate::_q_updateLockStatus(QCamera::LockType type, QCamera::LockStatus status, QCamera::LockChangeReason reason) { Q_Q(QCamera); lockChangeReason = reason; updateLockStatus(); emit q->lockStatusChanged(type, status, reason); } /*! Construct a QCamera with a \a parent. */ QCamera::QCamera(QObject *parent): QMediaObject(*new QCameraPrivate, parent, QMediaServiceProvider::defaultServiceProvider()->requestService(Q_MEDIASERVICE_CAMERA)) { Q_D(QCamera); d->provider = QMediaServiceProvider::defaultServiceProvider(); d->initControls(); d->cameraExposure = new QCameraExposure(this); d->cameraFocus = new QCameraFocus(this); d->imageProcessing = new QCameraImageProcessing(this); } /*! Construct a QCamera from device name \a device and \a parent. */ QCamera::QCamera(const QByteArray& device, QObject *parent): QMediaObject(*new QCameraPrivate, parent, QMediaServiceProvider::defaultServiceProvider()->requestService(Q_MEDIASERVICE_CAMERA, QMediaServiceProviderHint(device))) { Q_D(QCamera); d->provider = QMediaServiceProvider::defaultServiceProvider(); d->initControls(); if (d->service != 0) { //pass device name to service if (d->deviceControl) { QString deviceName = QString::fromLatin1(device); for (int i=0; ideviceControl->deviceCount(); i++) { if (d->deviceControl->deviceName(i) == deviceName) { d->deviceControl->setSelectedDevice(i); break; } } } } d->cameraExposure = new QCameraExposure(this); d->cameraFocus = new QCameraFocus(this); d->imageProcessing = new QCameraImageProcessing(this); } /*! Destroys the camera object. */ QCamera::~QCamera() { Q_D(QCamera); delete d->cameraExposure; d->cameraExposure = 0; delete d->cameraFocus; d->cameraFocus = 0; delete d->imageProcessing; d->imageProcessing = 0; if (d->service) { if (d->control) d->service->releaseControl(d->control); if (d->locksControl) d->service->releaseControl(d->locksControl); if (d->deviceControl) d->service->releaseControl(d->deviceControl); d->provider->releaseService(d->service); } } /*! Returns the availability state of the camera service. */ QMultimedia::AvailabilityStatus QCamera::availability() const { Q_D(const QCamera); if (d->control == NULL) return QMultimedia::ServiceMissing; if (d->deviceControl && d->deviceControl->deviceCount() == 0) return QMultimedia::ResourceError; if (d->error != QCamera::NoError) return QMultimedia::ResourceError; return QMediaObject::availability(); } /*! Returns the camera exposure control object. */ QCameraExposure *QCamera::exposure() const { return d_func()->cameraExposure; } /*! Returns the camera focus control object. */ QCameraFocus *QCamera::focus() const { return d_func()->cameraFocus; } /*! Returns the camera image processing control object. */ QCameraImageProcessing *QCamera::imageProcessing() const { return d_func()->imageProcessing; } /*! Sets the QVideoWidget based camera \a viewfinder. The previously set viewfinder is detached. */ // QVideoWidget is forward declared void QCamera::setViewfinder(QVideoWidget *viewfinder) { Q_D(QCamera); d->_q_preparePropertyChange(QCameraControl::Viewfinder); if (d->viewfinder) unbind(d->viewfinder); // We don't know (in this library) that QVideoWidget inherits QObject QObject *viewFinderObject = reinterpret_cast(viewfinder); d->viewfinder = viewFinderObject && bind(viewFinderObject) ? viewFinderObject : 0; } /*! Sets the QGraphicsVideoItem based camera \a viewfinder. The previously set viewfinder is detached. */ // QGraphicsVideoItem is forward declared void QCamera::setViewfinder(QGraphicsVideoItem *viewfinder) { Q_D(QCamera); d->_q_preparePropertyChange(QCameraControl::Viewfinder); if (d->viewfinder) unbind(d->viewfinder); // We don't know (in this library) that QGraphicsVideoItem (multiply) inherits QObject // but QObject inheritance depends on QObject coming first, so try this out. QObject *viewFinderObject = reinterpret_cast(viewfinder); d->viewfinder = viewFinderObject && bind(viewFinderObject) ? viewFinderObject : 0; } /*! Sets a video \a surface as the viewfinder of a camera. If a viewfinder has already been set on the camera the new surface will replace it. */ void QCamera::setViewfinder(QAbstractVideoSurface *surface) { Q_D(QCamera); d->surfaceViewfinder.setVideoSurface(surface); if (d->viewfinder != &d->surfaceViewfinder) { if (d->viewfinder) unbind(d->viewfinder); d->viewfinder = 0; if (surface && bind(&d->surfaceViewfinder)) d->viewfinder = &d->surfaceViewfinder; } else if (!surface) { //unbind the surfaceViewfinder if null surface is set unbind(&d->surfaceViewfinder); d->viewfinder = 0; } } /*! Returns the error state of the object. */ QCamera::Error QCamera::error() const { return d_func()->error; } /*! Returns a string describing a camera's error state. */ QString QCamera::errorString() const { return d_func()->errorString; } /*! Returns true if the capture \a mode is suported. */ bool QCamera::isCaptureModeSupported(QCamera::CaptureModes mode) const { return d_func()->control ? d_func()->control->isCaptureModeSupported(mode) : false; } /*! \property QCamera::captureMode The type of media (video or still images), the camera is configured to capture. It's allowed to change capture mode in any camera state, but if the camera is currently active, chaging capture mode is likely to lead to camera status chaged to QCamera::LoadedStatus, QCamera::LoadingStatus, and when the camera is ready to QCamera::ActiveStatus. */ QCamera::CaptureModes QCamera::captureMode() const { return d_func()->control ? d_func()->control->captureMode() : QCamera::CaptureStillImage; } void QCamera::setCaptureMode(QCamera::CaptureModes mode) { Q_D(QCamera); if (mode != captureMode()) { if (d->control) { d->_q_preparePropertyChange(QCameraControl::CaptureMode); d->control->setCaptureMode(mode); } } } /*! Starts the camera. State is changed to QCamera::ActiveState if camera is started successfully, otherwise error() signal is emitted. While the camera state is changed to QCamera::ActiveState, starting the camera service can be asynchronous with the actual status reported with QCamera::status property. */ void QCamera::start() { Q_D(QCamera); d->setState(QCamera::ActiveState); } /*! Stops the camera. The camera state is changed from QCamera::ActiveState to QCamera::LoadedState. */ void QCamera::stop() { Q_D(QCamera); d->setState(QCamera::LoadedState); } /*! Open the camera device. The camera state is changed to QCamera::LoadedStatus. It's not necessary to explcitly load the camera, unless unless the application have to read the supported camera settings and change the default depending on the camera capabilities. In all the other cases it's possible to start the camera directly from unloaded state. */ void QCamera::load() { Q_D(QCamera); d->setState(QCamera::LoadedState); } /*! Close the camera device and deallocate the related resources. The camera state is changed to QCamera::UnloadedStatus. */ void QCamera::unload() { Q_D(QCamera); d->setState(QCamera::UnloadedState); } /*! Returns a list of camera device's available from the default service provider. */ QList QCamera::availableDevices() { return QMediaServiceProvider::defaultServiceProvider()->devices(QByteArray(Q_MEDIASERVICE_CAMERA)); } /*! Returns the description of the \a device. */ QString QCamera::deviceDescription(const QByteArray &device) { return QMediaServiceProvider::defaultServiceProvider()->deviceDescription(QByteArray(Q_MEDIASERVICE_CAMERA), device); } QCamera::State QCamera::state() const { return d_func()->state; } QCamera::Status QCamera::status() const { if(d_func()->control) return (QCamera::Status)d_func()->control->status(); return QCamera::UnavailableStatus; } /*! Returns the lock types, camera supports. */ QCamera::LockTypes QCamera::supportedLocks() const { return d_func()->supportedLocks; } /*! Returns the requested lock types. */ QCamera::LockTypes QCamera::requestedLocks() const { return d_func()->requestedLocks; } /*! Returns the status of requested camera settings locks. */ QCamera::LockStatus QCamera::lockStatus() const { return d_func()->lockStatus; } /*! Returns the status of camera settings \a lock. */ QCamera::LockStatus QCamera::lockStatus(QCamera::LockType lockType) const { const QCameraPrivate *d = d_func(); if (!(lockType & d->supportedLocks)) return lockType & d->requestedLocks ? QCamera::Locked : QCamera::Unlocked; if (!(lockType & d->requestedLocks)) return QCamera::Unlocked; if (d->locksControl) return d->locksControl->lockStatus(lockType); return QCamera::Unlocked; } /*! \fn void QCamera::searchAndLock(QCamera::LockTypes locks) Locks the camera settings with the requested \a locks, including focusing in the single autofocus mode, exposure and white balance if the exposure and white balance modes are not manual. The camera settings are usually locked before taking one or multiple still images, in responce to the shutter button being half pressed. The QCamera::locked() signal is emitted when camera settings are successfully locked, otherwise QCamera::lockFailed() is emitted. QCamera also emits lockStatusChanged(QCamera::LockType, QCamera::LockStatus) on individual lock status changes and lockStatusChanged(QCamera::LockStatus) signal on composite status changes. Locking serves two roles: it initializes calculation of automatic parameter (focusing, calculating the correct exposure and white balance) and allows to keep some or all of those parameters during number of shots. If the camera doesn't support keeping one of parameters between shots, the related lock state changes to QCamera::Unlocked. It's also acceptable to relock already locked settings, depending on the lock parameter this initiates new focusing, exposure or white balance calculation. */ void QCamera::searchAndLock(QCamera::LockTypes locks) { Q_D(QCamera); QCamera::LockStatus oldStatus = d->lockStatus; d->supressLockChangedSignal = true; d->requestedLocks |= locks; locks &= d->supportedLocks; if (d->locksControl) d->locksControl->searchAndLock(locks); d->supressLockChangedSignal = false; d->lockStatus = oldStatus; d->updateLockStatus(); } /*! Lock all the supported camera settings. */ void QCamera::searchAndLock() { searchAndLock(LockExposure | LockWhiteBalance | LockFocus); } /*! Unlocks the camera settings specified with \a locks or cancel the current locking if one is active. */ void QCamera::unlock(QCamera::LockTypes locks) { Q_D(QCamera); QCamera::LockStatus oldStatus = d->lockStatus; d->supressLockChangedSignal = true; d->requestedLocks &= ~locks; locks &= d->supportedLocks; if (d->locksControl) d->locksControl->unlock(locks); d->supressLockChangedSignal = false; d->lockStatus = oldStatus; d->updateLockStatus(); } /*! Unlock all the requested camera locks. */ void QCamera::unlock() { unlock(d_func()->requestedLocks); } /*! \enum QCamera::State \value UnloadedState The initial camera state, with camera not loaded, the camera capabilities except of supported capture modes are unknown. While the supported settings are unknown in this state, it's allowed to set the camera capture settings like codec, resolution, or frame rate. \value LoadedState The camera is loaded and ready to be configured. In the Idle state it's allowed to query camera capabilities, set capture resolution, codecs, etc. The viewfinder is not active in the loaded state. \value ActiveState In the active state as soon as camera is started the viewfinder displays video frames and the camera is ready for capture. */ /*! \property QCamera::state \brief The current state of the camera object. */ /*! \enum QCamera::Status \value ActiveStatus The camera has been started and can produce data. The viewfinder displays video frames in active state. Depending on backend, changing some camera settings like capture mode, codecs or resolution in ActiveState may lead to changing the camera status to LoadedStatus and StartingStatus while the settings are applied and back to ActiveStatus when the camera is ready. \value StartingStatus The camera is starting in result of state transition to QCamera::ActiveState. The camera service is not ready to capture yet. \value StoppingStatus The camera is stopping in result of state transition from QCamera::ActiveState to QCamera::LoadedState or QCamera::UnloadedState. \value StandbyStatus The camera is in the power saving standby mode. The camera may come to the standby mode after some time of inactivity in the QCamera::LoadedState state. \value LoadedStatus The camera is loaded and ready to be configured. This status indicates the camera device is opened and it's possible to query for supported image and video capture settings, like resolution, framerate and codecs. \value LoadingStatus The camera device loading in result of state transition from QCamera::UnloadedState to QCamera::LoadedState or QCamera::ActiveState. \value UnloadingStatus The camera device is unloading in result of state transition from QCamera::LoadedState or QCamera::ActiveState to QCamera::UnloadedState. \value UnloadedStatus The initial camera status, with camera not loaded. The camera capabilities including supported capture settings may be unknown. \value UnavailableStatus The camera or camera backend is not available. */ /*! \property QCamera::status \brief The current status of the camera object. */ /*! \enum QCamera::CaptureMode \value CaptureViewfinder Camera is only configured to display viewfinder. \value CaptureStillImage Camera is configured for still frames capture. \value CaptureVideo Camera is configured for video capture. */ /*! \enum QCamera::LockType \value NoLock \value LockExposure Lock camera exposure. \value LockWhiteBalance Lock the white balance. \value LockFocus Lock camera focus. */ /*! \property QCamera::lockStatus \brief The overall status for all the requested camera locks. */ /*! \fn void QCamera::locked() Signals all the requested camera settings are locked. */ /*! \fn void QCamera::lockFailed() Signals locking of at least one requested camera settings failed. */ /*! \fn QCamera::lockStatusChanged(QCamera::LockStatus status, QCamera::LockChangeReason reason) Signals the overall \a status for all the requested camera locks was changed with specified \a reason. */ /*! \fn QCamera::lockStatusChanged(QCamera::LockType lock, QCamera::LockStatus status, QCamera::LockChangeReason reason) Signals the \a lock \a status was changed with specified \a reason. */ /*! \enum QCamera::LockStatus \value Unlocked The application is not interested in camera settings value. The camera may keep this parameter without changes, this is common with camera focus, or adjust exposure and white balance constantly to keep the viewfinder image nice. \value Searching The application has requested the camera focus, exposure or white balance lock with QCamera::searchAndLock(). This state indicates the camera is focusing or calculating exposure and white balance. \value Locked The camera focus, exposure or white balance is locked. The camera is ready to capture, application may check the exposure parameters. The locked state usually means the requested parameter stays the same, except of the cases when the parameter is requested to be constantly updated. For example in continuous focusing mode, the focus is considered locked as long and the object is in focus, even while the actual focusing distance may be constantly changing. */ /*! \enum QCamera::LockChangeReason \value UserRequest The lock status changed in result of user request, usually to unlock camera settings. \value LockAcquired The lock status successfuly changed to QCamera::Locked. \value LockFailed The camera failed to acquire the requested lock in result of autofocus failure, exposure out of supported range, etc. \value LockLost The camera is not able to maintain the requested lock any more. Lock status is changed to QCamera::Unlocked. \value LockTemporaryLost The lock is lost, but the camera is working hard to reacquire it. This value may be used in continuous focusing mode, when the camera loses the focus, the focus lock state is changed to Qcamera::Searching with LockTemporaryLost reason. */ /*! \enum QCamera::Error \value NoError No errors have occurred. \value CameraError An error has occurred. \value InvalidRequestError System resource doesn't support requested functionality. \value ServiceMissingError No camera service available. \value NotSupportedFeatureError The feature is not supported. */ /*! \fn void QCamera::error(QCamera::Error value) Signal emitted when error state changes to \a value. */ /*! \fn void QCamera::captureModeChanged(QCamera::CaptureModes mode) Signals the capture \a mode has changed. */ /*! \fn QCamera::stateChanged(QCamera::State state) Signals the camera \a state has changed. Usually the state changes is caused by calling load(), unload(), start() and stop(), but the state can also be changed change as a result of camera error. */ /*! \fn QCamera::statusChanged(QCamera::Status status) Signals the camera \a status has changed. */ QT_END_NAMESPACE #include "moc_qcamera.cpp" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/qcamera.h000066400000000000000000000154731225012771600305440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERA_H #define QCAMERA_H #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QVideoWidget; class QGraphicsVideoItem; class QCameraPrivate; class Q_MULTIMEDIA_EXPORT QCamera : public QMediaObject { Q_OBJECT Q_PROPERTY(QCamera::State state READ state NOTIFY stateChanged) Q_PROPERTY(QCamera::Status status READ status NOTIFY statusChanged) Q_PROPERTY(QCamera::CaptureModes captureMode READ captureMode WRITE setCaptureMode NOTIFY captureModeChanged) Q_PROPERTY(QCamera::LockStatus lockStatus READ lockStatus NOTIFY lockStatusChanged) Q_ENUMS(Status) Q_ENUMS(State) Q_ENUMS(CaptureMode) Q_ENUMS(Error) Q_ENUMS(LockStatus) Q_ENUMS(LockChangeReason) Q_ENUMS(LockType) public: enum Status { UnavailableStatus, UnloadedStatus, LoadingStatus, UnloadingStatus, LoadedStatus, StandbyStatus, StartingStatus, StoppingStatus, ActiveStatus }; enum State { UnloadedState, LoadedState, ActiveState }; enum CaptureMode { CaptureViewfinder = 0, CaptureStillImage = 0x01, CaptureVideo = 0x02 }; Q_DECLARE_FLAGS(CaptureModes, CaptureMode) enum Error { NoError, CameraError, InvalidRequestError, ServiceMissingError, NotSupportedFeatureError }; enum LockStatus { Unlocked, Searching, Locked }; enum LockChangeReason { UserRequest, LockAcquired, LockFailed, LockLost, LockTemporaryLost }; enum LockType { NoLock = 0, LockExposure = 0x01, LockWhiteBalance = 0x02, LockFocus = 0x04 }; Q_DECLARE_FLAGS(LockTypes, LockType) QCamera(QObject *parent = 0); QCamera(const QByteArray& device, QObject *parent = 0); ~QCamera(); static QList availableDevices(); static QString deviceDescription(const QByteArray &device); QMultimedia::AvailabilityStatus availability() const; State state() const; Status status() const; CaptureModes captureMode() const; bool isCaptureModeSupported(CaptureModes mode) const; QCameraExposure *exposure() const; QCameraFocus *focus() const; QCameraImageProcessing *imageProcessing() const; void setViewfinder(QVideoWidget *viewfinder); void setViewfinder(QGraphicsVideoItem *viewfinder); void setViewfinder(QAbstractVideoSurface *surface); Error error() const; QString errorString() const; QCamera::LockTypes supportedLocks() const; QCamera::LockTypes requestedLocks() const; QCamera::LockStatus lockStatus() const; QCamera::LockStatus lockStatus(QCamera::LockType lock) const; public Q_SLOTS: void setCaptureMode(QCamera::CaptureModes mode); void load(); void unload(); void start(); void stop(); void searchAndLock(); void unlock(); void searchAndLock(QCamera::LockTypes locks); void unlock(QCamera::LockTypes locks); Q_SIGNALS: void stateChanged(QCamera::State); void captureModeChanged(QCamera::CaptureModes); void statusChanged(QCamera::Status); void locked(); void lockFailed(); void lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason); void lockStatusChanged(QCamera::LockType, QCamera::LockStatus, QCamera::LockChangeReason); void error(QCamera::Error); private: Q_DISABLE_COPY(QCamera) Q_DECLARE_PRIVATE(QCamera) Q_PRIVATE_SLOT(d_func(), void _q_preparePropertyChange(int)) Q_PRIVATE_SLOT(d_func(), void _q_restartCamera()) Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_updateLockStatus(QCamera::LockType, QCamera::LockStatus, QCamera::LockChangeReason)) Q_PRIVATE_SLOT(d_func(), void _q_updateState(QCamera::State)) }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCamera::LockTypes) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCamera::State) Q_DECLARE_METATYPE(QCamera::Status) Q_DECLARE_METATYPE(QCamera::Error) Q_DECLARE_METATYPE(QCamera::CaptureMode) Q_DECLARE_METATYPE(QCamera::CaptureModes) Q_DECLARE_METATYPE(QCamera::LockType) Q_DECLARE_METATYPE(QCamera::LockStatus) Q_DECLARE_METATYPE(QCamera::LockChangeReason) Q_MEDIA_ENUM_DEBUG(QCamera, State) Q_MEDIA_ENUM_DEBUG(QCamera, Status) Q_MEDIA_ENUM_DEBUG(QCamera, Error) Q_MEDIA_ENUM_DEBUG(QCamera, CaptureMode) Q_MEDIA_ENUM_DEBUG(QCamera, LockType) Q_MEDIA_ENUM_DEBUG(QCamera, LockStatus) Q_MEDIA_ENUM_DEBUG(QCamera, LockChangeReason) #endif // QCAMERA_H qcameraexposure.cpp000066400000000000000000000513521225012771600326070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcameraexposure.h" #include "qmediaobject_p.h" #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QCameraExposure \brief The QCameraExposure class provides interface for exposure related camera settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera */ //#define DEBUG_EXPOSURE_CHANGES 1 namespace { class CameraExposureRegisterMetaTypes { public: CameraExposureRegisterMetaTypes() { qRegisterMetaType("QCameraExposure::ExposureMode"); qRegisterMetaType("QCameraExposure::FlashModes"); qRegisterMetaType("QCameraExposure::MeteringMode"); } } _registerCameraExposureMetaTypes; } class QCameraExposurePrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraExposure) public: void initControls(); QCameraExposure *q_ptr; template T actualExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &defaultValue) const; template T requestedExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &defaultValue) const; template void setExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &value); void resetExposureParameter(QCameraExposureControl::ExposureParameter parameter); QCamera *camera; QCameraExposureControl *exposureControl; QCameraFlashControl *flashControl; void _q_exposureParameterChanged(int parameter); void _q_exposureParameterRangeChanged(int parameter); }; void QCameraExposurePrivate::initControls() { Q_Q(QCameraExposure); QMediaService *service = camera->service(); exposureControl = 0; flashControl = 0; if (service) { exposureControl = qobject_cast(service->requestControl(QCameraExposureControl_iid)); flashControl = qobject_cast(service->requestControl(QCameraFlashControl_iid)); } if (exposureControl) { q->connect(exposureControl, SIGNAL(actualValueChanged(int)), q, SLOT(_q_exposureParameterChanged(int))); q->connect(exposureControl, SIGNAL(parameterRangeChanged(int)), q, SLOT(_q_exposureParameterRangeChanged(int))); } if (flashControl) q->connect(flashControl, SIGNAL(flashReady(bool)), q, SIGNAL(flashReady(bool))); } template T QCameraExposurePrivate::actualExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &defaultValue) const { QVariant value = exposureControl ? exposureControl->actualValue(parameter) : QVariant(); return value.isValid() ? value.value() : defaultValue; } template T QCameraExposurePrivate::requestedExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &defaultValue) const { QVariant value = exposureControl ? exposureControl->requestedValue(parameter) : QVariant(); return value.isValid() ? value.value() : defaultValue; } template void QCameraExposurePrivate::setExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &value) { if (exposureControl) exposureControl->setValue(parameter, QVariant::fromValue(value)); } void QCameraExposurePrivate::resetExposureParameter(QCameraExposureControl::ExposureParameter parameter) { if (exposureControl) exposureControl->setValue(parameter, QVariant()); } void QCameraExposurePrivate::_q_exposureParameterChanged(int parameter) { Q_Q(QCameraExposure); #if DEBUG_EXPOSURE_CHANGES qDebug() << "Exposure parameter changed:" << QCameraExposureControl::ExposureParameter(parameter) << exposureControl->actualValue(QCameraExposureControl::ExposureParameter(parameter)); #endif switch (parameter) { case QCameraExposureControl::ISO: emit q->isoSensitivityChanged(q->isoSensitivity()); break; case QCameraExposureControl::Aperture: emit q->apertureChanged(q->aperture()); break; case QCameraExposureControl::ShutterSpeed: emit q->shutterSpeedChanged(q->shutterSpeed()); break; case QCameraExposureControl::ExposureCompensation: emit q->exposureCompensationChanged(q->exposureCompensation()); break; } } void QCameraExposurePrivate::_q_exposureParameterRangeChanged(int parameter) { Q_Q(QCameraExposure); switch (parameter) { case QCameraExposureControl::Aperture: emit q->apertureRangeChanged(); break; case QCameraExposureControl::ShutterSpeed: emit q->shutterSpeedRangeChanged(); break; } } /*! Construct a QCameraExposure from service \a provider and \a parent. */ QCameraExposure::QCameraExposure(QCamera *parent): QObject(parent), d_ptr(new QCameraExposurePrivate) { Q_D(QCameraExposure); d->camera = parent; d->q_ptr = this; d->initControls(); } /*! Destroys the camera exposure object. */ QCameraExposure::~QCameraExposure() { Q_D(QCameraExposure); if (d->exposureControl) d->camera->service()->releaseControl(d->exposureControl); delete d; } /*! Returns true if exposure settings are supported by this camera. */ bool QCameraExposure::isAvailable() const { return d_func()->exposureControl != 0; } /*! \property QCameraExposure::flashMode \brief The flash mode being used. Usually the single QCameraExposure::FlashMode flag is used, but some non conflicting flags combination are also allowed, like QCameraExposure::FlashManual | QCameraExposure::FlashSlowSyncRearCurtain. \sa QCameraExposure::isFlashModeSupported(), QCameraExposure::isFlashReady() */ QCameraExposure::FlashModes QCameraExposure::flashMode() const { return d_func()->flashControl ? d_func()->flashControl->flashMode() : QCameraExposure::FlashOff; } void QCameraExposure::setFlashMode(QCameraExposure::FlashModes mode) { if (d_func()->flashControl) d_func()->flashControl->setFlashMode(mode); } /*! Returns true if the flash \a mode is supported. */ bool QCameraExposure::isFlashModeSupported(QCameraExposure::FlashModes mode) const { return d_func()->flashControl ? d_func()->flashControl->isFlashModeSupported(mode) : false; } /*! Returns true if flash is charged. */ bool QCameraExposure::isFlashReady() const { return d_func()->flashControl ? d_func()->flashControl->isFlashReady() : false; } /*! \property QCameraExposure::exposureMode \brief The exposure mode being used. \sa QCameraExposure::isExposureModeSupported() */ QCameraExposure::ExposureMode QCameraExposure::exposureMode() const { return d_func()->actualExposureParameter(QCameraExposureControl::ExposureMode, QCameraExposure::ExposureAuto); } void QCameraExposure::setExposureMode(QCameraExposure::ExposureMode mode) { d_func()->setExposureParameter(QCameraExposureControl::ExposureMode, mode); } /*! Returns true if the exposure \a mode is supported. */ bool QCameraExposure::isExposureModeSupported(QCameraExposure::ExposureMode mode) const { if (!d_func()->exposureControl) return false; bool continuous = false; return d_func()->exposureControl->supportedParameterRange(QCameraExposureControl::ExposureMode, &continuous) .contains(QVariant::fromValue(mode)); } /*! \property QCameraExposure::exposureCompensation \brief Exposure compensation in EV units. Exposure compensation property allows to adjust the automatically calculated exposure. */ qreal QCameraExposure::exposureCompensation() const { return d_func()->actualExposureParameter(QCameraExposureControl::ExposureCompensation, 0.0); } void QCameraExposure::setExposureCompensation(qreal ev) { d_func()->setExposureParameter(QCameraExposureControl::ExposureCompensation, ev); } /*! \property QCameraExposure::meteringMode \brief The metering mode being used. \sa QCameraExposure::isMeteringModeSupported() */ QCameraExposure::MeteringMode QCameraExposure::meteringMode() const { return d_func()->actualExposureParameter(QCameraExposureControl::MeteringMode, QCameraExposure::MeteringMatrix); } void QCameraExposure::setMeteringMode(QCameraExposure::MeteringMode mode) { d_func()->setExposureParameter(QCameraExposureControl::MeteringMode, mode); } /*! \fn QCameraExposure::spotMeteringPoint() const When supported, the spot metering point is the (normalized) position of the point of the image where exposure metering will be performed. This is typically used to indicate an "interesting" area of the image that should be exposed properly. The coordinates are relative frame coordinates: QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center, which is typically the default spot metering point. The spot metering point is only used with spot metering mode. \sa setSpotMeteringPoint() */ QPointF QCameraExposure::spotMeteringPoint() const { return d_func()->exposureControl ? d_func()->exposureControl->actualValue(QCameraExposureControl::SpotMeteringPoint).toPointF() : QPointF(); } /*! \fn QCameraExposure::setSpotMeteringPoint(const QPointF &point) Allows setting the spot metering point to \a point. \sa spotMeteringPoint() */ void QCameraExposure::setSpotMeteringPoint(const QPointF &point) { if (d_func()->exposureControl) d_func()->exposureControl->setValue(QCameraExposureControl::SpotMeteringPoint, point); } /*! Returns true if the metering \a mode is supported. */ bool QCameraExposure::isMeteringModeSupported(QCameraExposure::MeteringMode mode) const { if (!d_func()->exposureControl) return false; bool continuous = false; return d_func()->exposureControl->supportedParameterRange(QCameraExposureControl::MeteringMode, &continuous) .contains(QVariant::fromValue(mode)); } int QCameraExposure::isoSensitivity() const { return d_func()->actualExposureParameter(QCameraExposureControl::ISO, -1); } /*! Returns the requested ISO sensitivity or -1 if automatic ISO is turned on. */ int QCameraExposure::requestedIsoSensitivity() const { return d_func()->requestedExposureParameter(QCameraExposureControl::ISO, -1); } /*! Returns the list of ISO senitivities camera supports. If the camera supports arbitrary ISO sensitivities within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ QList QCameraExposure::supportedIsoSensitivities(bool *continuous) const { QList res; QCameraExposureControl *control = d_func()->exposureControl; bool tmp = false; if (!continuous) continuous = &tmp; if (!control) return res; foreach (const QVariant &value, control->supportedParameterRange(QCameraExposureControl::ISO, continuous)) { bool ok = false; int intValue = value.toInt(&ok); if (ok) res.append(intValue); else qWarning() << "Incompatible ISO value type, int is expected"; } return res; } /*! \fn QCameraExposure::setManualIsoSensitivity(int iso) Sets the manual sensitivity to \a iso */ void QCameraExposure::setManualIsoSensitivity(int iso) { d_func()->setExposureParameter(QCameraExposureControl::ISO, iso); } /*! \fn QCameraExposure::setAutoIsoSensitivity() Turn on auto sensitivity */ void QCameraExposure::setAutoIsoSensitivity() { d_func()->resetExposureParameter(QCameraExposureControl::ISO); } /*! \property QCameraExposure::shutterSpeed \brief Camera's shutter speed in seconds. \sa supportedShutterSpeeds(), setAutoShutterSpeed(), setManualShutterSpeed() */ /*! \fn QCameraExposure::shutterSpeedChanged(qreal speed) Signals that a camera's shutter \a speed has changed. */ /*! \property QCameraExposure::isoSensitivity \brief The sensor ISO sensitivity. \sa supportedIsoSensitivities(), setAutoIsoSensitivity(), setManualIsoSensitivity() */ /*! \property QCameraExposure::aperture \brief Lens aperture is specified as an F number, the ratio of the focal length to effective aperture diameter. \sa supportedApertures(), setAutoAperture(), setManualAperture(), requestedAperture() */ qreal QCameraExposure::aperture() const { return d_func()->actualExposureParameter(QCameraExposureControl::Aperture, -1.0); } /*! Returns the requested manual aperture or -1.0 if automatic aperture is turned on. */ qreal QCameraExposure::requestedAperture() const { return d_func()->requestedExposureParameter(QCameraExposureControl::Aperture, -1.0); } /*! Returns the list of aperture values camera supports. The apertures list can change depending on the focal length, in such a case the apertureRangeChanged() signal is emitted. If the camera supports arbitrary aperture values within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ QList QCameraExposure::supportedApertures(bool * continuous) const { QList res; QCameraExposureControl *control = d_func()->exposureControl; bool tmp = false; if (!continuous) continuous = &tmp; if (!control) return res; foreach (const QVariant &value, control->supportedParameterRange(QCameraExposureControl::Aperture, continuous)) { bool ok = false; qreal realValue = value.toReal(&ok); if (ok) res.append(realValue); else qWarning() << "Incompatible aperture value type, qreal is expected"; } return res; } /*! \fn QCameraExposure::setManualAperture(qreal aperture) Sets the manual camera \a aperture value. */ void QCameraExposure::setManualAperture(qreal aperture) { d_func()->setExposureParameter(QCameraExposureControl::Aperture, aperture); } /*! \fn QCameraExposure::setAutoAperture() Turn on auto aperture */ void QCameraExposure::setAutoAperture() { d_func()->resetExposureParameter(QCameraExposureControl::Aperture); } /*! Returns the current shutter speed in seconds. */ qreal QCameraExposure::shutterSpeed() const { return d_func()->actualExposureParameter(QCameraExposureControl::ShutterSpeed, -1.0); } /*! Returns the requested manual shutter speed in seconds or -1.0 if automatic shutter speed is turned on. */ qreal QCameraExposure::requestedShutterSpeed() const { return d_func()->requestedExposureParameter(QCameraExposureControl::ShutterSpeed, -1.0); } /*! Returns the list of shutter speed values in seconds camera supports. If the camera supports arbitrary shutter speed values within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ QList QCameraExposure::supportedShutterSpeeds(bool *continuous) const { QList res; QCameraExposureControl *control = d_func()->exposureControl; bool tmp = false; if (!continuous) continuous = &tmp; if (!control) return res; foreach (const QVariant &value, control->supportedParameterRange(QCameraExposureControl::ShutterSpeed, continuous)) { bool ok = false; qreal realValue = value.toReal(&ok); if (ok) res.append(realValue); else qWarning() << "Incompatible shutter speed value type, qreal is expected"; } return res; } /*! Set the manual shutter speed to \a seconds */ void QCameraExposure::setManualShutterSpeed(qreal seconds) { d_func()->setExposureParameter(QCameraExposureControl::ShutterSpeed, seconds); } /*! Turn on auto shutter speed */ void QCameraExposure::setAutoShutterSpeed() { d_func()->resetExposureParameter(QCameraExposureControl::ShutterSpeed); } /*! \enum QCameraExposure::FlashMode \value FlashAuto Automatic flash. \value FlashOff Flash is Off. \value FlashOn Flash is On. \value FlashRedEyeReduction Red eye reduction flash. \value FlashFill Use flash to fillin shadows. \value FlashTorch Constant light source. If supported, torch can be enabled without loading the camera. \value FlashVideoLight Constant light source, useful for video capture. The light is turned on only while camera is active. \value FlashSlowSyncFrontCurtain Use the flash in conjunction with a slow shutter speed. This mode allows better exposure of distant objects and/or motion blur effect. \value FlashSlowSyncRearCurtain The similar mode to FlashSlowSyncFrontCurtain but flash is fired at the end of exposure. \value FlashManual Flash power is manualy set. */ /*! \enum QCameraExposure::ExposureMode \value ExposureAuto Automatic mode. \value ExposureManual Manual mode. \value ExposurePortrait Portrait exposure mode. \value ExposureNight Night mode. \value ExposureBacklight Backlight exposure mode. \value ExposureSpotlight Spotlight exposure mode. \value ExposureSports Spots exposure mode. \value ExposureSnow Snow exposure mode. \value ExposureBeach Beach exposure mode. \value ExposureLargeAperture Use larger aperture with small depth of field. \value ExposureSmallAperture Use smaller aperture. \value ExposureModeVendor The base value for device specific exposure modes. */ /*! \enum QCameraExposure::MeteringMode \value MeteringMatrix Matrix metering mode. \value MeteringAverage Center weighted average metering mode. \value MeteringSpot Spot metering mode. */ /*! \property QCameraExposure::flashReady \brief Indicates if the flash is charged and ready to use. */ /*! \fn void QCameraExposure::flashReady(bool ready) Signal the flash \a ready status has changed. */ /*! \fn void QCameraExposure::apertureChanged(qreal value) Signal emitted when aperature changes to \a value. */ /*! \fn void QCameraExposure::apertureRangeChanged() Signal emitted when aperature range has changed. */ /*! \fn void QCameraExposure::shutterSpeedRangeChanged() Signal emitted when the shutter speed range has changed. */ /*! \fn void QCameraExposure::isoSensitivityChanged(int value) Signal emitted when sensitivity changes to \a value. */ /*! \fn void QCameraExposure::exposureCompensationChanged(qreal value) Signal emitted when the exposure compensation changes to \a value. */ #include "moc_qcameraexposure.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/qcameraexposure.h000066400000000000000000000142031225012771600323250ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAEXPOSURE_H #define QCAMERAEXPOSURE_H #include #include QT_BEGIN_NAMESPACE class QCamera; class QCameraExposurePrivate; class Q_MULTIMEDIA_EXPORT QCameraExposure : public QObject { Q_OBJECT Q_PROPERTY(qreal aperture READ aperture NOTIFY apertureChanged) Q_PROPERTY(qreal shutterSpeed READ shutterSpeed NOTIFY shutterSpeedChanged) Q_PROPERTY(int isoSensitivity READ isoSensitivity NOTIFY isoSensitivityChanged) Q_PROPERTY(qreal exposureCompensation READ exposureCompensation WRITE setExposureCompensation NOTIFY exposureCompensationChanged) Q_PROPERTY(bool flashReady READ isFlashReady NOTIFY flashReady) Q_PROPERTY(QCameraExposure::FlashModes flashMode READ flashMode WRITE setFlashMode) Q_PROPERTY(QCameraExposure::ExposureMode exposureMode READ exposureMode WRITE setExposureMode) Q_PROPERTY(QCameraExposure::MeteringMode meteringMode READ meteringMode WRITE setMeteringMode) Q_ENUMS(FlashMode) Q_ENUMS(ExposureMode) Q_ENUMS(MeteringMode) public: enum FlashMode { FlashAuto = 0x1, FlashOff = 0x2, FlashOn = 0x4, FlashRedEyeReduction = 0x8, FlashFill = 0x10, FlashTorch = 0x20, FlashVideoLight = 0x40, FlashSlowSyncFrontCurtain = 0x80, FlashSlowSyncRearCurtain = 0x100, FlashManual = 0x200 }; Q_DECLARE_FLAGS(FlashModes, FlashMode) enum ExposureMode { ExposureAuto = 0, ExposureManual = 1, ExposurePortrait = 2, ExposureNight = 3, ExposureBacklight = 4, ExposureSpotlight = 5, ExposureSports = 6, ExposureSnow = 7, ExposureBeach = 8, ExposureLargeAperture = 9, ExposureSmallAperture = 10, ExposureModeVendor = 1000 }; enum MeteringMode { MeteringMatrix = 1, MeteringAverage = 2, MeteringSpot = 3 }; bool isAvailable() const; FlashModes flashMode() const; bool isFlashModeSupported(FlashModes mode) const; bool isFlashReady() const; ExposureMode exposureMode() const; bool isExposureModeSupported(ExposureMode mode) const; qreal exposureCompensation() const; MeteringMode meteringMode() const; bool isMeteringModeSupported(MeteringMode mode) const; QPointF spotMeteringPoint() const; void setSpotMeteringPoint(const QPointF &point); int isoSensitivity() const; qreal aperture() const; qreal shutterSpeed() const; int requestedIsoSensitivity() const; qreal requestedAperture() const; qreal requestedShutterSpeed() const; QList supportedIsoSensitivities(bool *continuous = 0) const; QList supportedApertures(bool * continuous = 0) const; QList supportedShutterSpeeds(bool *continuous = 0) const; public Q_SLOTS: void setFlashMode(FlashModes mode); void setExposureMode(ExposureMode mode); void setMeteringMode(MeteringMode mode); void setExposureCompensation(qreal ev); void setManualIsoSensitivity(int iso); void setAutoIsoSensitivity(); void setManualAperture(qreal aperture); void setAutoAperture(); void setManualShutterSpeed(qreal seconds); void setAutoShutterSpeed(); Q_SIGNALS: void flashReady(bool); void apertureChanged(qreal); void apertureRangeChanged(); void shutterSpeedChanged(qreal); void shutterSpeedRangeChanged(); void isoSensitivityChanged(int); void exposureCompensationChanged(qreal); private: friend class QCamera; explicit QCameraExposure(QCamera *parent = 0); virtual ~QCameraExposure(); Q_DISABLE_COPY(QCameraExposure) Q_DECLARE_PRIVATE(QCameraExposure) Q_PRIVATE_SLOT(d_func(), void _q_exposureParameterChanged(int)) Q_PRIVATE_SLOT(d_func(), void _q_exposureParameterRangeChanged(int)) QCameraExposurePrivate *d_ptr; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraExposure::FlashModes) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraExposure::ExposureMode) Q_DECLARE_METATYPE(QCameraExposure::FlashModes) Q_DECLARE_METATYPE(QCameraExposure::MeteringMode) Q_MEDIA_ENUM_DEBUG(QCameraExposure, ExposureMode) Q_MEDIA_ENUM_DEBUG(QCameraExposure, FlashMode) Q_MEDIA_ENUM_DEBUG(QCameraExposure, MeteringMode) #endif // QCAMERAEXPOSURE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/qcamerafocus.cpp000066400000000000000000000430621225012771600321320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcamerafocus.h" #include "qmediaobject_p.h" #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace { class CameraFocusRegisterMetaTypes { public: CameraFocusRegisterMetaTypes() { qRegisterMetaType("QCameraFocus::FocusModes"); qRegisterMetaType("QCameraFocus::FocusPointMode"); } } _registerCameraFocusMetaTypes; } class QCameraFocusFakeZoomControl : public QCameraZoomControl { public: QCameraFocusFakeZoomControl(QObject *parent) : QCameraZoomControl(parent) {} qreal maximumOpticalZoom() const { return 1.0; } qreal maximumDigitalZoom() const { return 1.0; } qreal requestedOpticalZoom() const { return 1.0; } qreal requestedDigitalZoom() const { return 1.0; } qreal currentOpticalZoom() const { return 1.0; } qreal currentDigitalZoom() const { return 1.0; } void zoomTo(qreal, qreal) { qWarning("The camera doesn't support zooming."); } }; class QCameraFocusFakeFocusControl : public QCameraFocusControl { public: QCameraFocusFakeFocusControl(QObject *parent) : QCameraFocusControl(parent) {} QCameraFocus::FocusModes focusMode() const { return QCameraFocus::AutoFocus; } void setFocusMode(QCameraFocus::FocusModes) { qWarning("Focus mode selection is not supported"); } bool isFocusModeSupported(QCameraFocus::FocusModes) const { return false; } QCameraFocus::FocusPointMode focusPointMode() const { return QCameraFocus::FocusPointAuto; } void setFocusPointMode(QCameraFocus::FocusPointMode) { qWarning("Focus points mode selection is not supported"); } bool isFocusPointModeSupported(QCameraFocus::FocusPointMode) const { return false; } QPointF customFocusPoint() const { return QPointF(0.5,0.5); } void setCustomFocusPoint(const QPointF &) { qWarning("Focus points selection is not supported"); } QCameraFocusZoneList focusZones() const { return QCameraFocusZoneList(); } }; class QCameraFocusZoneData : public QSharedData { public: QCameraFocusZoneData(): status(QCameraFocusZone::Invalid) { } QCameraFocusZoneData(const QRectF &_area, QCameraFocusZone::FocusZoneStatus _status): area(_area), status(_status) { } QCameraFocusZoneData(const QCameraFocusZoneData &other): QSharedData(other), area(other.area), status(other.status) { } QCameraFocusZoneData& operator=(const QCameraFocusZoneData &other) { area = other.area; status = other.status; return *this; } QRectF area; QCameraFocusZone::FocusZoneStatus status; }; /*! \class QCameraFocusZone \brief The QCameraFocusZone class provides information on zones used for autofocusing a camera. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera For cameras that support autofocusing, in order for a camera to autofocus on part of a sensor frame, it considers different zones within the frame. Which zones to use, and where the zones are located vary between different cameras. This class exposes what zones are used by a particular camera, and a list of the zones can be retrieved by a \l QCameraFocus instance. You can use this information to present visual feedback - for example, drawing rectangles around areas of the camera frame that are in focus, or changing the color of a zone as it comes into focus. \snippet multimedia-snippets/camera.cpp Camera focus zones \sa QCameraFocus */ /*! \enum QCameraFocusZone::FocusZoneStatus \value Invalid This zone is not valid \value Unused This zone may be used for autofocusing, but is not currently. \value Selected This zone is currently being used for autofocusing, but is not in focus. \value Focused This zone is being used for autofocusing and is currently in focus. */ /*! * \internal * Creates a new, empty QCameraFocusZone. */ QCameraFocusZone::QCameraFocusZone() :d(new QCameraFocusZoneData) { } /*! * \internal * Creates a new QCameraFocusZone with the supplied \a area and \a status. */ QCameraFocusZone::QCameraFocusZone(const QRectF &area, QCameraFocusZone::FocusZoneStatus status) :d(new QCameraFocusZoneData(area, status)) { } /*! * Creates a new QCameraFocusZone as a copy of \a other. */ QCameraFocusZone::QCameraFocusZone(const QCameraFocusZone &other) :d(other.d) { } /*! * Destroys this QCameraFocusZone. */ QCameraFocusZone::~QCameraFocusZone() { } /*! * Assigns \a other to this QCameraFocusZone. */ QCameraFocusZone& QCameraFocusZone::operator=(const QCameraFocusZone &other) { d = other.d; return *this; } /*! * Returns true if this focus zone is the same as \a other. */ bool QCameraFocusZone::operator==(const QCameraFocusZone &other) const { return d == other.d || (d->area == other.d->area && d->status == other.d->status); } /*! * Returns true if this focus zone is not the same as \a other. */ bool QCameraFocusZone::operator!=(const QCameraFocusZone &other) const { return !(*this == other); } /*! * Returns true if this focus zone has a valid area and status. */ bool QCameraFocusZone::isValid() const { return d->status != Invalid && !d->area.isValid(); } /*! * Returns the area of the camera frame that this focus zone encompasses. * * Coordinates are in frame relative coordinates - \c QPointF(0,0) is the top * left of the frame, and \c QPointF(1,1) is the bottom right. */ QRectF QCameraFocusZone::area() const { return d->area; } /*! * Returns the current status of this focus zone. */ QCameraFocusZone::FocusZoneStatus QCameraFocusZone::status() const { return d->status; } /*! * \internal * Sets the current status of this focus zone to \a status. */ void QCameraFocusZone::setStatus(QCameraFocusZone::FocusZoneStatus status) { d->status = status; } /*! \class QCameraFocus \brief The QCameraFocus class provides an interface for focus and zoom related camera settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera On hardware that supports it, this class lets you adjust the focus or zoom (both optical and digital). This also includes things like "Macro" mode for close up work (e.g. reading barcodes, or recognising letters), or "touch to focus" - indicating an interesting area of the viewfinder for the hardware to attempt to focus on. \snippet multimedia-snippets/camera.cpp Camera custom zoom Zooming can be accomplished in a number of ways - usually the more expensive but higher quality approach is an optical zoom, which allows using the full extent of the camera sensor to gather image pixels. In addition it is possible to digitally zoom, which will generally just enlarge part of the sensor frame and throw away other parts. If the camera hardware supports optical zoom this should generally always be used first. The \l maximumOpticalZoom() method allows this to be checked. The \l zoomTo() method allows changing both optical and digital zoom at once. \snippet multimedia-snippets/camera.cpp Camera combined zoom \section2 Some notes on autofocus Some hardware supports a movable focus lens assembly, and typically this hardware also supports automatically focusing via some heuristic. You can influence this via the \l FocusPointMode setting - typically the center of the frame is brought into focus, but some hardware also supports focusing on any faces detected in the frame, or on a specific point (usually provided by a user in a "touch to focus" scenario). This class (in combination with \l QCameraFocusZone) can expose information on what parts of the camera sensor image are in focus or are being used for autofocusing via the \l focusZones() property: \snippet multimedia-snippets/camera.cpp Camera focus zones \sa QCameraFocusZone */ class QCameraFocusPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraFocus) public: void initControls(); QCameraFocus *q_ptr; QCamera *camera; QCameraFocusControl *focusControl; QCameraZoomControl *zoomControl; bool available; }; void QCameraFocusPrivate::initControls() { Q_Q(QCameraFocus); focusControl = 0; zoomControl = 0; QMediaService *service = camera->service(); if (service) { focusControl = qobject_cast(service->requestControl(QCameraFocusControl_iid)); zoomControl = qobject_cast(service->requestControl(QCameraZoomControl_iid)); } available = focusControl != 0; if (!focusControl) focusControl = new QCameraFocusFakeFocusControl(q); if (!zoomControl) zoomControl = new QCameraFocusFakeZoomControl(q); q->connect(focusControl, SIGNAL(focusZonesChanged()), q, SIGNAL(focusZonesChanged())); q->connect(zoomControl, SIGNAL(currentOpticalZoomChanged(qreal)), q, SIGNAL(opticalZoomChanged(qreal))); q->connect(zoomControl, SIGNAL(currentDigitalZoomChanged(qreal)), q, SIGNAL(digitalZoomChanged(qreal))); q->connect(zoomControl, SIGNAL(maximumOpticalZoomChanged(qreal)), q, SIGNAL(maximumOpticalZoomChanged(qreal))); q->connect(zoomControl, SIGNAL(maximumDigitalZoomChanged(qreal)), q, SIGNAL(maximumDigitalZoomChanged(qreal))); } /*! \internal Construct a QCameraFocus for \a camera. */ QCameraFocus::QCameraFocus(QCamera *camera): QObject(camera), d_ptr(new QCameraFocusPrivate) { Q_D(QCameraFocus); d->camera = camera; d->q_ptr = this; d->initControls(); } /*! Destroys the camera focus object. */ QCameraFocus::~QCameraFocus() { delete d_ptr; } /*! Returns true if focus related settings are supported by this camera. You may need to also check if any specific features are supported. */ bool QCameraFocus::isAvailable() const { return d_func()->available; } /*! \property QCameraFocus::focusMode \brief the current camera focus mode. This controls the way the camera lens assembly is configured. \sa QCameraFocus::isFocusModeSupported() */ QCameraFocus::FocusModes QCameraFocus::focusMode() const { return d_func()->focusControl->focusMode(); } void QCameraFocus::setFocusMode(QCameraFocus::FocusModes mode) { d_func()->focusControl->setFocusMode(mode); } /*! Returns true if the focus \a mode is supported by camera. */ bool QCameraFocus::isFocusModeSupported(FocusModes mode) const { return d_func()->focusControl->isFocusModeSupported(mode); } /*! \property QCameraFocus::focusPointMode \brief the current camera focus point selection mode. If the camera focus mode is set to use an autofocusing mode, this property controls the way the camera will select areas of the frame to use for autofocusing. \sa QCameraFocus::isFocusPointModeSupported() */ QCameraFocus::FocusPointMode QCameraFocus::focusPointMode() const { return d_func()->focusControl->focusPointMode(); } void QCameraFocus::setFocusPointMode(QCameraFocus::FocusPointMode mode) { d_func()->focusControl->setFocusPointMode(mode); } /*! Returns true if focus point \a mode is supported. */ bool QCameraFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const { return d_func()->focusControl->isFocusPointModeSupported(mode); } /*! \property QCameraFocus::customFocusPoint This property represents the position of the custom focus point, in relative frame coordinates: QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center. The custom focus point property is used only in \c FocusPointCustom focus mode. */ QPointF QCameraFocus::customFocusPoint() const { return d_func()->focusControl->customFocusPoint(); } void QCameraFocus::setCustomFocusPoint(const QPointF &point) { d_func()->focusControl->setCustomFocusPoint(point); } /*! \property QCameraFocus::focusZones Returns the list of active focus zones. If QCamera::FocusPointAuto or QCamera::FocusPointFaceDetection focus mode is selected this method returns the list of zones the camera is actually focused on. The coordinates system is the same as for custom focus points: QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center. */ QCameraFocusZoneList QCameraFocus::focusZones() const { return d_func()->focusControl->focusZones(); } /*! Returns the maximum optical zoom. This will be \c 1.0 on cameras that do not support optical zoom. */ qreal QCameraFocus::maximumOpticalZoom() const { return d_func()->zoomControl->maximumOpticalZoom(); } /*! Returns the maximum digital zoom This will be \c 1.0 on cameras that do not support digital zoom. */ qreal QCameraFocus::maximumDigitalZoom() const { return d_func()->zoomControl->maximumDigitalZoom(); } /*! \property QCameraFocus::opticalZoom \brief the current optical zoom value. \sa QCameraFocus::digitalZoom */ qreal QCameraFocus::opticalZoom() const { return d_func()->zoomControl->currentOpticalZoom(); } /*! \property QCameraFocus::digitalZoom \brief the current digital zoom value. \sa QCameraFocus::opticalZoom */ qreal QCameraFocus::digitalZoom() const { return d_func()->zoomControl->currentDigitalZoom(); } /*! Set the camera \a optical and \a digital zoom values. Since there may be a physical component to move, the change in zoom value may not be instantaneous. */ void QCameraFocus::zoomTo(qreal optical, qreal digital) { d_func()->zoomControl->zoomTo(optical, digital); } /*! \enum QCameraFocus::FocusMode \value ManualFocus Manual or fixed focus mode. \value HyperfocalFocus Focus to hyperfocal distance, with the maximum depth of field achieved. All objects at distances from half of this distance out to infinity will be acceptably sharp. \value InfinityFocus Focus strictly to infinity. \value AutoFocus One-shot auto focus mode. \value ContinuousFocus Continuous auto focus mode. \value MacroFocus One shot auto focus to objects close to camera. */ /*! \enum QCameraFocus::FocusPointMode \value FocusPointAuto Automatically select one or multiple focus points. \value FocusPointCenter Focus to the frame center. \value FocusPointFaceDetection Focus on faces in the frame. \value FocusPointCustom Focus to the custom point, defined by QCameraFocus::customFocusPoint property. */ /*! \fn void QCameraFocus::opticalZoomChanged(qreal value) Signal emitted when optical zoom value changes to new \a value. */ /*! \fn void QCameraFocus::digitalZoomChanged(qreal value) Signal emitted when digital zoom value changes to new \a value. */ /*! \fn void QCameraFocus::maximumOpticalZoomChanged(qreal zoom) Signal emitted when the maximum supported optical \a zoom value changed. */ /*! \fn void QCameraFocus::maximumDigitalZoomChanged(qreal zoom) Signal emitted when the maximum supported digital \a zoom value changed. The maximum supported zoom value can depend on other camera settings, like capture mode or resolution. */ /*! \fn QCameraFocus::focusZonesChanged() This signal is emitted when the set of zones used in autofocusing is changed. This can change when a zone is focused or loses focus, or new focus zones have been detected. */ #include "moc_qcamerafocus.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/qcamerafocus.h000066400000000000000000000125131225012771600315740ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAFOCUS_H #define QCAMERAFOCUS_H #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QCamera; class QCameraFocusZoneData; class Q_MULTIMEDIA_EXPORT QCameraFocusZone { public: enum FocusZoneStatus { Invalid, Unused, Selected, Focused }; QCameraFocusZone(); QCameraFocusZone(const QRectF &area, FocusZoneStatus status = Selected); QCameraFocusZone(const QCameraFocusZone &other); QCameraFocusZone& operator=(const QCameraFocusZone &other); bool operator==(const QCameraFocusZone &other) const; bool operator!=(const QCameraFocusZone &other) const; ~QCameraFocusZone(); bool isValid() const; QRectF area() const; FocusZoneStatus status() const; void setStatus(FocusZoneStatus status); private: QSharedDataPointer d; }; typedef QList QCameraFocusZoneList; class QCameraFocusPrivate; class Q_MULTIMEDIA_EXPORT QCameraFocus : public QObject { Q_OBJECT Q_PROPERTY(FocusModes focusMode READ focusMode WRITE setFocusMode) Q_PROPERTY(FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode) Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint) Q_PROPERTY(QCameraFocusZoneList focusZones READ focusZones NOTIFY focusZonesChanged) Q_PROPERTY(qreal opticalZoom READ opticalZoom NOTIFY opticalZoomChanged) Q_PROPERTY(qreal digitalZoom READ digitalZoom NOTIFY digitalZoomChanged) Q_ENUMS(FocusMode) Q_ENUMS(FocusPointMode) public: enum FocusMode { ManualFocus = 0x1, HyperfocalFocus = 0x02, InfinityFocus = 0x04, AutoFocus = 0x8, ContinuousFocus = 0x10, MacroFocus = 0x20 }; Q_DECLARE_FLAGS(FocusModes, FocusMode) enum FocusPointMode { FocusPointAuto, FocusPointCenter, FocusPointFaceDetection, FocusPointCustom }; bool isAvailable() const; FocusModes focusMode() const; void setFocusMode(FocusModes mode); bool isFocusModeSupported(FocusModes mode) const; FocusPointMode focusPointMode() const; void setFocusPointMode(FocusPointMode mode); bool isFocusPointModeSupported(FocusPointMode) const; QPointF customFocusPoint() const; void setCustomFocusPoint(const QPointF &point); QCameraFocusZoneList focusZones() const; qreal maximumOpticalZoom() const; qreal maximumDigitalZoom() const; qreal opticalZoom() const; qreal digitalZoom() const; void zoomTo(qreal opticalZoom, qreal digitalZoom); Q_SIGNALS: void opticalZoomChanged(qreal); void digitalZoomChanged(qreal); void focusZonesChanged(); void maximumOpticalZoomChanged(qreal); void maximumDigitalZoomChanged(qreal); private: friend class QCamera; QCameraFocus(QCamera *camera); ~QCameraFocus(); Q_DISABLE_COPY(QCameraFocus) Q_DECLARE_PRIVATE(QCameraFocus) QCameraFocusPrivate *d_ptr; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraFocus::FocusModes) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraFocus::FocusModes) Q_DECLARE_METATYPE(QCameraFocus::FocusPointMode) Q_MEDIA_ENUM_DEBUG(QCameraFocus, FocusMode) Q_MEDIA_ENUM_DEBUG(QCameraFocus, FocusPointMode) #endif // QCAMERAFOCUS_H qcameraimagecapture.cpp000066400000000000000000000506341225012771600334050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include "qmediaobject_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QCameraImageCapture \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera \brief The QCameraImageCapture class is used for the recording of media content. The QCameraImageCapture class is a high level images recording class. It's not intended to be used alone but for accessing the media recording functions of other media objects, like QCamera. \snippet multimedia-snippets/camera.cpp Camera \snippet multimedia-snippets/camera.cpp Camera keys \sa QCamera */ /*! \enum QCameraImageCapture::CaptureDestination \value CaptureToFile Capture the image to a file. \value CaptureToBuffer Capture the image to a buffer for further processing. */ namespace { class MediaRecorderRegisterMetaTypes { public: MediaRecorderRegisterMetaTypes() { qRegisterMetaType("QCameraImageCapture::Error"); qRegisterMetaType("QCameraImageCapture::CaptureDestination"); qRegisterMetaType("QCameraImageCapture::CaptureDestinations"); } } _registerRecorderMetaTypes; } class QCameraImageCapturePrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraImageCapture) public: QCameraImageCapturePrivate(); QMediaObject *mediaObject; QCameraImageCaptureControl *control; QImageEncoderControl *encoderControl; QCameraCaptureDestinationControl *captureDestinationControl; QCameraCaptureBufferFormatControl *bufferFormatControl; QCameraImageCapture::Error error; QString errorString; void _q_error(int id, int error, const QString &errorString); void _q_readyChanged(bool); void _q_serviceDestroyed(); void unsetError() { error = QCameraImageCapture::NoError; errorString.clear(); } QCameraImageCapture *q_ptr; }; QCameraImageCapturePrivate::QCameraImageCapturePrivate(): mediaObject(0), control(0), encoderControl(0), captureDestinationControl(0), bufferFormatControl(0), error(QCameraImageCapture::NoError) { } void QCameraImageCapturePrivate::_q_error(int id, int error, const QString &errorString) { Q_Q(QCameraImageCapture); this->error = QCameraImageCapture::Error(error); this->errorString = errorString; emit q->error(id, this->error, errorString); } void QCameraImageCapturePrivate::_q_readyChanged(bool ready) { Q_Q(QCameraImageCapture); emit q->readyForCaptureChanged(ready); } void QCameraImageCapturePrivate::_q_serviceDestroyed() { mediaObject = 0; control = 0; encoderControl = 0; captureDestinationControl = 0; bufferFormatControl = 0; } /*! Constructs a media recorder which records the media produced by \a mediaObject. The \a parent is passed to QMediaObject. */ QCameraImageCapture::QCameraImageCapture(QMediaObject *mediaObject, QObject *parent): QObject(parent), d_ptr(new QCameraImageCapturePrivate) { Q_D(QCameraImageCapture); d->q_ptr = this; if (mediaObject) mediaObject->bind(this); } /*! Destroys images capture object. */ QCameraImageCapture::~QCameraImageCapture() { Q_D(QCameraImageCapture); if (d->mediaObject) d->mediaObject->unbind(this); delete d_ptr; } /*! \reimp */ QMediaObject *QCameraImageCapture::mediaObject() const { return d_func()->mediaObject; } /*! \reimp */ bool QCameraImageCapture::setMediaObject(QMediaObject *mediaObject) { Q_D(QCameraImageCapture); if (d->mediaObject) { if (d->control) { disconnect(d->control, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); disconnect(d->control, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage))); disconnect(d->control, SIGNAL(imageAvailable(int,QVideoFrame)), this, SIGNAL(imageAvailable(int,QVideoFrame))); disconnect(d->control, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SIGNAL(imageMetadataAvailable(int,QString,QVariant))); disconnect(d->control, SIGNAL(imageSaved(int,QString)), this, SIGNAL(imageSaved(int,QString))); disconnect(d->control, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(_q_readyChanged(bool))); disconnect(d->control, SIGNAL(error(int,int,QString)), this, SLOT(_q_error(int,int,QString))); if (d->captureDestinationControl) { disconnect(d->captureDestinationControl, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations)), this, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations))); } if (d->bufferFormatControl) { disconnect(d->bufferFormatControl, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat)), this, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat))); } QMediaService *service = d->mediaObject->service(); service->releaseControl(d->control); if (d->encoderControl) service->releaseControl(d->encoderControl); if (d->captureDestinationControl) service->releaseControl(d->captureDestinationControl); if (d->bufferFormatControl) service->releaseControl(d->bufferFormatControl); disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); } } d->mediaObject = mediaObject; if (d->mediaObject) { QMediaService *service = mediaObject->service(); if (service) { d->control = qobject_cast(service->requestControl(QCameraImageCaptureControl_iid)); if (d->control) { d->encoderControl = qobject_cast(service->requestControl(QImageEncoderControl_iid)); d->captureDestinationControl = qobject_cast( service->requestControl(QCameraCaptureDestinationControl_iid)); d->bufferFormatControl = qobject_cast( service->requestControl(QCameraCaptureBufferFormatControl_iid)); connect(d->control, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(d->control, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage))); connect(d->control, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SIGNAL(imageMetadataAvailable(int,QString,QVariant))); connect(d->control, SIGNAL(imageAvailable(int,QVideoFrame)), this, SIGNAL(imageAvailable(int,QVideoFrame))); connect(d->control, SIGNAL(imageSaved(int, QString)), this, SIGNAL(imageSaved(int, QString))); connect(d->control, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(_q_readyChanged(bool))); connect(d->control, SIGNAL(error(int,int,QString)), this, SLOT(_q_error(int,int,QString))); if (d->captureDestinationControl) { connect(d->captureDestinationControl, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations)), this, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations))); } if (d->bufferFormatControl) { connect(d->bufferFormatControl, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat)), this, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat))); } connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); return true; } } } // without QCameraImageCaptureControl discard the media object d->mediaObject = 0; d->control = 0; d->encoderControl = 0; d->captureDestinationControl = 0; d->bufferFormatControl = 0; return false; } /*! Returns true if the images capture service ready to use. */ bool QCameraImageCapture::isAvailable() const { if (d_func()->control != NULL) return true; else return false; } /*! Returns the availability of this functionality. */ QMultimedia::AvailabilityStatus QCameraImageCapture::availability() const { if (d_func()->control != NULL) return QMultimedia::Available; else return QMultimedia::ServiceMissing; } /*! Returns the current error state. \sa errorString() */ QCameraImageCapture::Error QCameraImageCapture::error() const { return d_func()->error; } /*! Returns a string describing the current error state. \sa error() */ QString QCameraImageCapture::errorString() const { return d_func()->errorString; } /*! Returns a list of supported image codecs. */ QStringList QCameraImageCapture::supportedImageCodecs() const { return d_func()->encoderControl ? d_func()->encoderControl->supportedImageCodecs() : QStringList(); } /*! Returns a description of an image \a codec. */ QString QCameraImageCapture::imageCodecDescription(const QString &codec) const { return d_func()->encoderControl ? d_func()->encoderControl->imageCodecDescription(codec) : QString(); } /*! Returns a list of resolutions images can be encoded at. If non null image \a settings parameter is passed, the returned list is reduced to resolution supported with partial settings like image codec or quality applied. If the encoder supports arbitrary resolutions within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. \sa QImageEncoderSettings::resolution() */ QList QCameraImageCapture::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const { if (continuous) *continuous = false; return d_func()->encoderControl ? d_func()->encoderControl->supportedResolutions(settings, continuous) : QList(); } /*! Returns the image encoder settings being used. \sa setEncodingSettings() */ QImageEncoderSettings QCameraImageCapture::encodingSettings() const { return d_func()->encoderControl ? d_func()->encoderControl->imageSettings() : QImageEncoderSettings(); } /*! Sets the image encoding \a settings. If some parameters are not specified, or null settings are passed, the encoder choose the default encoding parameters. \sa encodingSettings() */ void QCameraImageCapture::setEncodingSettings(const QImageEncoderSettings &settings) { Q_D(QCameraImageCapture); if (d->encoderControl) { QCamera *camera = qobject_cast(d->mediaObject); if (camera && camera->captureMode() == QCamera::CaptureStillImage) { QMetaObject::invokeMethod(camera, "_q_preparePropertyChange", Qt::DirectConnection, Q_ARG(int, QCameraControl::ImageEncodingSettings)); } d->encoderControl->setImageSettings(settings); } } /*! Returns the list of supported buffer image capture formats. \sa bufferFormat(), setBufferFormat() */ QList QCameraImageCapture::supportedBufferFormats() const { if (d_func()->bufferFormatControl) return d_func()->bufferFormatControl->supportedBufferFormats(); else return QList(); } /*! Returns the buffer image capture format being used. \sa supportedBufferFormats(), setBufferFormat() */ QVideoFrame::PixelFormat QCameraImageCapture::bufferFormat() const { if (d_func()->bufferFormatControl) return d_func()->bufferFormatControl->bufferFormat(); else return QVideoFrame::Format_Invalid; } /*! Sets the buffer image capture \a format to be used. \sa bufferFormat(), supportedBufferFormats(), captureDestination() */ void QCameraImageCapture::setBufferFormat(const QVideoFrame::PixelFormat format) { if (d_func()->bufferFormatControl) d_func()->bufferFormatControl->setBufferFormat(format); } /*! Returns true if the image capture \a destination is supported; otherwise returns false. \sa captureDestination(), setCaptureDestination() */ bool QCameraImageCapture::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const { if (d_func()->captureDestinationControl) return d_func()->captureDestinationControl->isCaptureDestinationSupported(destination); else return destination == CaptureToFile; } /*! Returns the image capture destination being used. \sa isCaptureDestinationSupported(), setCaptureDestination() */ QCameraImageCapture::CaptureDestinations QCameraImageCapture::captureDestination() const { if (d_func()->captureDestinationControl) return d_func()->captureDestinationControl->captureDestination(); else return CaptureToFile; } /*! Sets the capture \a destination to be used. \sa isCaptureDestinationSupported(), captureDestination() */ void QCameraImageCapture::setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) { Q_D(QCameraImageCapture); if (d->captureDestinationControl) d->captureDestinationControl->setCaptureDestination(destination); } /*! \property QCameraImageCapture::readyForCapture \brief whether the service is ready to capture a an image immediately. It's permissible to call capture() while the camera status is QCamera::ActiveStatus regardless of isReadyForCapture property value. If camera is not ready to capture image immediately, the capture request is queued with all the related camera settings to be executed as soon as possible. */ bool QCameraImageCapture::isReadyForCapture() const { if (d_func()->control) return d_func()->control->isReadyForCapture(); else return false; } /*! \fn QCameraImageCapture::readyForCaptureChanged(bool ready) Signals that a camera's \a ready for capture state has changed. */ /*! Capture the image and save it to \a file. This operation is asynchronous in majority of cases, followed by signals QCameraImageCapture::imageExposed(), QCameraImageCapture::imageCaptured(), QCameraImageCapture::imageSaved() or QCameraImageCapture::error(). If an empty \a file is passed, the camera backend choses the default location and naming scheme for photos on the system, if only file name without full path is specified, the image will be saved to the default directory, with a full path reported with imageCaptured() and imageSaved() signals. QCamera saves all the capture parameters like exposure settings or image processing parameters, so changes to camera paramaters after capture() is called do not affect previous capture requests. QCameraImageCapture::capture returns the capture Id parameter, used with imageExposed(), imageCaptured() and imageSaved() signals. */ int QCameraImageCapture::capture(const QString &file) { Q_D(QCameraImageCapture); d->unsetError(); if (d->control) { return d->control->capture(file); } else { d->error = NotSupportedFeatureError; d->errorString = tr("Device does not support images capture."); emit error(-1, d->error, d->errorString); } return -1; } /*! Cancel incomplete capture requests. Already captured and queused for proicessing images may be discarded. */ void QCameraImageCapture::cancelCapture() { Q_D(QCameraImageCapture); d->unsetError(); if (d->control) { d->control->cancelCapture(); } else { d->error = NotSupportedFeatureError; d->errorString = tr("Device does not support images capture."); emit error(-1, d->error, d->errorString); } } /*! \enum QCameraImageCapture::Error \value NoError No Errors. \value NotReadyError The service is not ready for capture yet. \value ResourceError Device is not ready or not available. \value OutOfSpaceError No space left on device. \value NotSupportedFeatureError Device does not support stillimages capture. \value FormatError Current format is not supported. */ /*! \enum QCameraImageCapture::DriveMode \value SingleImageCapture Drive mode is capturing a single picture. */ /*! \fn QCameraImageCapture::error(int id, QCameraImageCapture::Error error, const QString &errorString) Signals that the capture request \a id has failed with an \a error and \a errorString description. */ /*! \fn QCameraImageCapture::bufferFormatChanged(QVideoFrame::PixelFormat format) Signal emitted when the buffer \a format for the buffer image capture has changed. */ /*! \fn QCameraImageCapture::captureDestinationChanged(CaptureDestinations destination) Signal emitted when the capture \a destination has changed. */ /*! \fn QCameraImageCapture::imageExposed(int id) Signal emitted when the frame with request \a id was exposed. */ /*! \fn QCameraImageCapture::imageCaptured(int id, const QImage &preview); Signal emitted when the frame with request \a id was captured, but not processed and saved yet. Frame \a preview can be displayed to user. */ /*! \fn QCameraImageCapture::imageMetadataAvailable(int id, const QString &key, const QVariant &value) Signals that a metadata for an image with request \a id is available. Also includes the \a key and \a value of the metadata. This signal is emitted between imageExposed and imageSaved signals. */ /*! \fn QCameraImageCapture::imageAvailable(int id, const QVideoFrame &buffer) Signal emitted when the frame with request \a id is available as \a buffer. */ /*! \fn QCameraImageCapture::imageSaved(int id, const QString &fileName) Signal emitted when the frame with request \a id was saved to \a fileName. */ #include "moc_qcameraimagecapture.cpp" QT_END_NAMESPACE qcameraimagecapture.h000066400000000000000000000127111225012771600330440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAIMAGECAPTURE_H #define QCAMERAIMAGECAPTURE_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QSize; QT_END_NAMESPACE QT_BEGIN_NAMESPACE class QImageEncoderSettings; class QCameraImageCapturePrivate; class Q_MULTIMEDIA_EXPORT QCameraImageCapture : public QObject, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) Q_ENUMS(Error) Q_ENUMS(CaptureDestination) Q_PROPERTY(bool readyForCapture READ isReadyForCapture NOTIFY readyForCaptureChanged) public: enum Error { NoError, NotReadyError, ResourceError, OutOfSpaceError, NotSupportedFeatureError, FormatError }; enum DriveMode { SingleImageCapture }; enum CaptureDestination { CaptureToFile = 0x01, CaptureToBuffer = 0x02 }; Q_DECLARE_FLAGS(CaptureDestinations, CaptureDestination) QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = 0); ~QCameraImageCapture(); bool isAvailable() const; QMultimedia::AvailabilityStatus availability() const; QMediaObject *mediaObject() const; Error error() const; QString errorString() const; bool isReadyForCapture() const; QStringList supportedImageCodecs() const; QString imageCodecDescription(const QString &codecName) const; QList supportedResolutions(const QImageEncoderSettings &settings = QImageEncoderSettings(), bool *continuous = 0) const; QImageEncoderSettings encodingSettings() const; void setEncodingSettings(const QImageEncoderSettings& settings); QList supportedBufferFormats() const; QVideoFrame::PixelFormat bufferFormat() const; void setBufferFormat(const QVideoFrame::PixelFormat format); bool isCaptureDestinationSupported(CaptureDestinations destination) const; CaptureDestinations captureDestination() const; void setCaptureDestination(CaptureDestinations destination); public Q_SLOTS: int capture(const QString &location = QString()); void cancelCapture(); Q_SIGNALS: void error(int id, QCameraImageCapture::Error error, const QString &errorString); void readyForCaptureChanged(bool); void bufferFormatChanged(QVideoFrame::PixelFormat); void captureDestinationChanged(QCameraImageCapture::CaptureDestinations); void imageExposed(int id); void imageCaptured(int id, const QImage &preview); void imageMetadataAvailable(int id, const QString &key, const QVariant &value); void imageAvailable(int id, const QVideoFrame &image); void imageSaved(int id, const QString &fileName); protected: bool setMediaObject(QMediaObject *); QCameraImageCapturePrivate *d_ptr; private: Q_DISABLE_COPY(QCameraImageCapture) Q_DECLARE_PRIVATE(QCameraImageCapture) Q_PRIVATE_SLOT(d_func(), void _q_error(int, int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_readyChanged(bool)) Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraImageCapture::CaptureDestinations) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraImageCapture::Error) Q_DECLARE_METATYPE(QCameraImageCapture::CaptureDestination) Q_DECLARE_METATYPE(QCameraImageCapture::CaptureDestinations) Q_MEDIA_ENUM_DEBUG(QCameraImageCapture, Error) Q_MEDIA_ENUM_DEBUG(QCameraImageCapture, CaptureDestination) #endif qcameraimageprocessing.cpp000066400000000000000000000247551225012771600341230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcameraimageprocessing.h" #include "qmediaobject_p.h" #include #include #include #include #include #include #include #include namespace { class QCameraImageProcessingPrivateRegisterMetaTypes { public: QCameraImageProcessingPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } QT_BEGIN_NAMESPACE /*! \class QCameraImageProcessing \brief The QCameraImageProcessing class provides an interface for image processing related camera settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera After capturing the data for a camera frame, the camera hardware and software performs various image processing tasks to produce a final image. This includes compensating for ambient light color, reducing noise, as well as making some other adjustments to the image. You can retrieve this class from an instance of a \l QCamera object. For example, you can set the white balance (or color temperature) used for processing images: \snippet multimedia-snippets/camera.cpp Camera image whitebalance Or adjust the amount of denoising performed: \snippet multimedia-snippets/camera.cpp Camera image denoising In some cases changing these settings may result in a longer delay before an image is ready. For more information on image processing of camera frames, see \l {camera_image_processing}{Camera Image Processing}. \sa QCameraImageProcessingControl */ class QCameraImageProcessingFakeControl : public QCameraImageProcessingControl { public: QCameraImageProcessingFakeControl(QObject *parent) : QCameraImageProcessingControl(parent) {} bool isParameterSupported(ProcessingParameter) const { return false; } bool isParameterValueSupported(ProcessingParameter, const QVariant &) const { return false; } QVariant parameter(ProcessingParameter) const { return QVariant(); } void setParameter(ProcessingParameter, const QVariant &) {} }; class QCameraImageProcessingPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraImageProcessing) public: void initControls(); QCameraImageProcessing *q_ptr; QCamera *camera; QCameraImageProcessingControl *imageControl; bool available; }; void QCameraImageProcessingPrivate::initControls() { imageControl = 0; QMediaService *service = camera->service(); if (service) imageControl = qobject_cast(service->requestControl(QCameraImageProcessingControl_iid)); available = (imageControl != 0); if (!imageControl) imageControl = new QCameraImageProcessingFakeControl(q_ptr); } /*! Construct a QCameraImageProcessing for \a camera. */ QCameraImageProcessing::QCameraImageProcessing(QCamera *camera): QObject(camera), d_ptr(new QCameraImageProcessingPrivate) { Q_D(QCameraImageProcessing); d->camera = camera; d->q_ptr = this; d->initControls(); } /*! Destroys the camera focus object. */ QCameraImageProcessing::~QCameraImageProcessing() { delete d_ptr; } /*! Returns true if image processing related settings are supported by this camera. */ bool QCameraImageProcessing::isAvailable() const { return d_func()->available; } /*! Returns the white balance mode being used. */ QCameraImageProcessing::WhiteBalanceMode QCameraImageProcessing::whiteBalanceMode() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::WhiteBalancePreset) .value(); } /*! Sets the white balance to \a mode. */ void QCameraImageProcessing::setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceMode mode) { d_func()->imageControl->setParameter( QCameraImageProcessingControl::WhiteBalancePreset, QVariant::fromValue(mode)); } /*! Returns true if the white balance \a mode is supported. */ bool QCameraImageProcessing::isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceMode mode) const { return d_func()->imageControl->isParameterValueSupported( QCameraImageProcessingControl::WhiteBalancePreset, QVariant::fromValue(mode)); } /*! Returns the current color temperature if the current white balance mode is \c WhiteBalanceManual. For other modes the return value is undefined. */ qreal QCameraImageProcessing::manualWhiteBalance() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::ColorTemperature).toReal(); } /*! Sets manual white balance to \a colorTemperature. This is used when whiteBalanceMode() is set to \c WhiteBalanceManual. The units are Kelvin. */ void QCameraImageProcessing::setManualWhiteBalance(qreal colorTemperature) { d_func()->imageControl->setParameter( QCameraImageProcessingControl::ColorTemperature, QVariant(colorTemperature)); } /*! Returns the contrast adjustment setting. */ qreal QCameraImageProcessing::contrast() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::ContrastAdjustment).toReal(); } /*! Set the contrast adjustment to \a value. Valid contrast adjustment values range between -1.0 and 1.0, with a default of 0. */ void QCameraImageProcessing::setContrast(qreal value) { d_func()->imageControl->setParameter(QCameraImageProcessingControl::ContrastAdjustment, QVariant(value)); } /*! Returns the saturation adjustment value. */ qreal QCameraImageProcessing::saturation() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::SaturationAdjustment).toReal(); } /*! Sets the saturation adjustment value to \a value. Valid saturation values range between -1.0 and 1.0, with a default of 0. */ void QCameraImageProcessing::setSaturation(qreal value) { d_func()->imageControl->setParameter(QCameraImageProcessingControl::SaturationAdjustment, QVariant(value)); } /*! Returns the sharpening adjustment level. */ qreal QCameraImageProcessing::sharpeningLevel() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::SharpeningAdjustment).toReal(); } /*! Sets the sharpening adjustment \a level. Valid sharpening values range between -1.0 and 1.0, with a default of 0. */ void QCameraImageProcessing::setSharpeningLevel(qreal level) { d_func()->imageControl->setParameter(QCameraImageProcessingControl::SharpeningAdjustment, QVariant(level)); } /*! Returns the denoising adjustment level. */ qreal QCameraImageProcessing::denoisingLevel() const { return d_func()->imageControl->parameter(QCameraImageProcessingControl::DenoisingAdjustment).toReal(); } /*! Sets the denoising adjustment \a level. Valid sharpening values range between -1.0 and 1.0, with a default of 0. If the parameter value is set to 0, the amount of denoising applied is selected by camera and depends on camera capabilities and settings. Changing value in -1.0..1.0 range adjusts the amount of denoising applied within the supported range. */ void QCameraImageProcessing::setDenoisingLevel(qreal level) { d_func()->imageControl->setParameter(QCameraImageProcessingControl::DenoisingAdjustment, QVariant(level)); } /*! \enum QCameraImageProcessing::WhiteBalanceMode \value WhiteBalanceAuto Auto white balance mode. \value WhiteBalanceManual Manual white balance. In this mode the white balance should be set with setManualWhiteBalance() \value WhiteBalanceSunlight Sunlight white balance mode. \value WhiteBalanceCloudy Cloudy white balance mode. \value WhiteBalanceShade Shade white balance mode. \value WhiteBalanceTungsten Tungsten (incandescent) white balance mode. \value WhiteBalanceFluorescent Fluorescent white balance mode. \value WhiteBalanceFlash Flash white balance mode. \value WhiteBalanceSunset Sunset white balance mode. \value WhiteBalanceVendor Base value for vendor defined white balance modes. */ #include "moc_qcameraimageprocessing.cpp" QT_END_NAMESPACE qcameraimageprocessing.h000066400000000000000000000074441225012771600335640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAIMAGEPROCESSING_H #define QCAMERAIMAGEPROCESSING_H #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QCamera; class QCameraImageProcessingPrivate; class Q_MULTIMEDIA_EXPORT QCameraImageProcessing : public QObject { Q_OBJECT Q_ENUMS(WhiteBalanceMode) public: enum WhiteBalanceMode { WhiteBalanceAuto = 0, WhiteBalanceManual = 1, WhiteBalanceSunlight = 2, WhiteBalanceCloudy = 3, WhiteBalanceShade = 4, WhiteBalanceTungsten = 5, WhiteBalanceFluorescent = 6, WhiteBalanceFlash = 7, WhiteBalanceSunset = 8, WhiteBalanceVendor = 1000 }; bool isAvailable() const; WhiteBalanceMode whiteBalanceMode() const; void setWhiteBalanceMode(WhiteBalanceMode mode); bool isWhiteBalanceModeSupported(WhiteBalanceMode mode) const; qreal manualWhiteBalance() const; void setManualWhiteBalance(qreal colorTemperature); qreal contrast() const; void setContrast(qreal value); qreal saturation() const; void setSaturation(qreal value); qreal sharpeningLevel() const; void setSharpeningLevel(qreal value); qreal denoisingLevel() const; void setDenoisingLevel(qreal value); private: friend class QCamera; QCameraImageProcessing(QCamera *camera); ~QCameraImageProcessing(); Q_DISABLE_COPY(QCameraImageProcessing) Q_DECLARE_PRIVATE(QCameraImageProcessing) QCameraImageProcessingPrivate *d_ptr; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraImageProcessing::WhiteBalanceMode) Q_MEDIA_ENUM_DEBUG(QCameraImageProcessing, WhiteBalanceMode) #endif // QCAMERAIMAGEPROCESSING_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/000077500000000000000000000000001225012771600273635ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/controls.pri000066400000000000000000000060601225012771600317440ustar00rootroot00000000000000 INCLUDEPATH += controls PUBLIC_HEADERS += \ controls/qaudiodecodercontrol.h \ controls/qaudioencodersettingscontrol.h \ controls/qaudioinputselectorcontrol.h \ controls/qaudiooutputselectorcontrol.h \ controls/qcameracapturebufferformatcontrol.h \ controls/qcameracapturedestinationcontrol.h \ controls/qcameracontrol.h \ controls/qcameraexposurecontrol.h \ controls/qcamerafeedbackcontrol.h \ controls/qcameraflashcontrol.h \ controls/qcamerafocuscontrol.h \ controls/qcamerazoomcontrol.h \ controls/qcameraimagecapturecontrol.h \ controls/qcameraimageprocessingcontrol.h \ controls/qcameralockscontrol.h \ controls/qcameraviewfindersettingscontrol.h \ controls/qimageencodercontrol.h \ controls/qmediacontainercontrol.h \ controls/qmediagaplessplaybackcontrol.h \ controls/qmedianetworkaccesscontrol.h \ controls/qmediaplayercontrol.h \ controls/qmediarecordercontrol.h \ controls/qmediastreamscontrol.h \ controls/qmetadatareadercontrol.h \ controls/qmetadatawritercontrol.h \ controls/qradiodatacontrol.h \ controls/qradiotunercontrol.h \ controls/qvideodeviceselectorcontrol.h \ controls/qvideoencodersettingscontrol.h \ controls/qvideorenderercontrol.h \ controls/qvideowindowcontrol.h \ controls/qmediaaudioprobecontrol.h \ controls/qmediavideoprobecontrol.h \ controls/qmediaavailabilitycontrol.h PRIVATE_HEADERS += \ controls/qmediaplaylistcontrol_p.h \ controls/qmediaplaylistsourcecontrol_p.h SOURCES += \ controls/qcameracapturebufferformatcontrol.cpp \ controls/qcameracapturedestinationcontrol.cpp \ controls/qcameracontrol.cpp \ controls/qcameraexposurecontrol.cpp \ controls/qcamerafeedbackcontrol.cpp \ controls/qcameraflashcontrol.cpp \ controls/qcamerafocuscontrol.cpp \ controls/qcamerazoomcontrol.cpp \ controls/qcameraimagecapturecontrol.cpp \ controls/qcameraimageprocessingcontrol.cpp \ controls/qcameralockscontrol.cpp \ controls/qcameraviewfindersettingscontrol.cpp \ controls/qimageencodercontrol.cpp \ controls/qmediacontainercontrol.cpp \ controls/qmediagaplessplaybackcontrol.cpp \ controls/qmedianetworkaccesscontrol.cpp \ controls/qmediaplayercontrol.cpp \ controls/qmediaplaylistcontrol.cpp \ controls/qmediaplaylistsourcecontrol.cpp \ controls/qmediarecordercontrol.cpp \ controls/qmediastreamscontrol.cpp \ controls/qmetadatareadercontrol.cpp \ controls/qmetadatawritercontrol.cpp \ controls/qradiodatacontrol.cpp \ controls/qradiotunercontrol.cpp \ controls/qvideorenderercontrol.cpp \ controls/qvideowindowcontrol.cpp \ controls/qmediaaudioprobecontrol.cpp \ controls/qmediavideoprobecontrol.cpp \ controls/qmediaavailabilitycontrol.cpp \ controls/qaudiodecodercontrol.cpp \ controls/qvideoencodersettingscontrol.cpp \ controls/qaudioencodersettingscontrol.cpp \ controls/qaudioinputselectorcontrol.cpp \ controls/qaudiooutputselectorcontrol.cpp \ controls/qvideodeviceselectorcontrol.cpp qaudiodecodercontrol.cpp000066400000000000000000000163371225012771600342330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediacontrol_p.h" #include "qaudiodecodercontrol.h" QT_BEGIN_NAMESPACE /*! \class QAudioDecoderControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QAudioDecoderControl class provides access to the audio decoding functionality of a QMediaService. \preliminary The functionality provided by this control is exposed to application code through the QAudioDecoder class. The interface name of QAudioDecoderControl is \c org.qt-project.qt.audiodecodercontrol/5.0 as defined in QAudioDecoderControl_iid. \sa QMediaService::requestControl(), QAudioDecoder */ /*! \macro QAudioDecoderControl_iid \c org.qt-project.qt.audiodecodercontrol/5.0 Defines the interface name of the QAudioDecoderControl class. \relates QAudioDecoderControl */ /*! Destroys an audio decoder control. */ QAudioDecoderControl::~QAudioDecoderControl() { } /*! Constructs a new audio decoder control with the given \a parent. */ QAudioDecoderControl::QAudioDecoderControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! \fn QAudioDecoderControl::state() const Returns the state of a player control. */ /*! \fn QAudioDecoderControl::stateChanged(QAudioDecoder::State state) Signals that the \a state of a player control has changed. \sa state() */ /*! \fn QAudioDecoderControl::sourceFilename() const Returns the current media source filename, or a null QString if none (or a device) */ /*! \fn QAudioDecoderControl::setSourceFilename(const QString &fileName) Sets the current source to \a fileName. Changing the source will stop any current decoding and discard any buffers. Sources are exclusive, so only one can be set. */ /*! \fn QAudioDecoderControl::sourceDevice() const Returns the current media source QIODevice, or 0 if none (or a file). */ /*! \fn QAudioDecoderControl::setSourceDevice(QIODevice *device) Sets the current source to \a device. Changing the source will stop any current decoding and discard any buffers. Sources are exclusive, so only one can be set. */ /*! \fn QAudioDecoderControl::start() Starts decoding the current media. If successful the player control will immediately enter the \l {QAudioDecoder::DecodingState} {decoding} state. \sa state(), read() */ /*! \fn QAudioDecoderControl::stop() Stops playback of the current media and discards any buffers. If successful the player control will immediately enter the \l {QAudioDecoder::StoppedState} {stopped} state. */ /*! \fn QAudioDecoderControl::error(int error, const QString &errorString) Signals that an \a error has occurred. The \a errorString provides a more detailed explanation. */ /*! \fn QAudioDecoderControl::bufferAvailableChanged(bool available) Signals that the bufferAvailable property has changed to \a available. */ /*! \fn QAudioDecoderControl::bufferReady() Signals that a new buffer is ready for reading. */ /*! \fn QAudioDecoderControl::bufferAvailable() const Returns true if a buffer is available to be read, and false otherwise. */ /*! \fn QAudioDecoderControl::sourceChanged() Signals that the current source of the decoder has changed. \sa sourceFilename(), sourceDevice() */ /*! \fn QAudioDecoderControl::formatChanged(const QAudioFormat &format) Signals that the current audio format of the decoder has changed to \a format. \sa audioFormat(), setAudioFormat() */ /*! \fn void QAudioDecoderControl::finished() Signals that the decoding has finished successfully. If decoding fails, error signal is emitted instead. \sa start(), stop(), error() */ /*! \fn void QAudioDecoderControl::positionChanged(qint64 position) Signals that the current \a position of the decoder has changed. \sa durationChanged() */ /*! \fn void QAudioDecoderControl::durationChanged(qint64 duration) Signals that the estimated \a duration of the decoded data has changed. \sa positionChanged() */ /*! \fn QAudioDecoderControl::audioFormat() const Returns the current audio format of the decoded stream. Any buffers returned should have this format. \sa setAudioFormat(), formatChanged() */ /*! \fn QAudioDecoderControl::setAudioFormat(const QAudioFormat &format) Set the desired audio format for decoded samples to \a format. If the decoder does not support this format, \l error() will be set to \c FormatError. If you do not specify a format, the format of the decoded audio itself will be used. Otherwise, some format conversion will be applied. If you wish to reset the decoded format to that of the original audio file, you can specify an invalid \a format. */ /*! \fn QAudioDecoderControl::read() Attempts to read a buffer from the decoder, without blocking. Returns invalid buffer if there are no decoded buffers available, or on error. */ /*! \fn QAudioDecoderControl::position() const Returns position (in milliseconds) of the last buffer read from the decoder or -1 if no buffers have been read. */ /*! \fn QAudioDecoderControl::duration() const Returns total duration (in milliseconds) of the audio stream or -1 if not available. */ #include "moc_qaudiodecodercontrol.cpp" QT_END_NAMESPACE qaudiodecodercontrol.h000066400000000000000000000067771225012771600337070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIODECODERCONTROL_H #define QAUDIODECODERCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QIODevice; class Q_MULTIMEDIA_EXPORT QAudioDecoderControl : public QMediaControl { Q_OBJECT public: ~QAudioDecoderControl(); virtual QAudioDecoder::State state() const = 0; virtual QString sourceFilename() const = 0; virtual void setSourceFilename(const QString &fileName) = 0; virtual QIODevice* sourceDevice() const = 0; virtual void setSourceDevice(QIODevice *device) = 0; virtual void start() = 0; virtual void stop() = 0; virtual QAudioFormat audioFormat() const = 0; virtual void setAudioFormat(const QAudioFormat &format) = 0; virtual QAudioBuffer read() = 0; virtual bool bufferAvailable() const = 0; virtual qint64 position() const = 0; virtual qint64 duration() const = 0; Q_SIGNALS: void stateChanged(QAudioDecoder::State newState); void formatChanged(const QAudioFormat &format); void sourceChanged(); void error(int error, const QString &errorString); void bufferReady(); void bufferAvailableChanged(bool available); void finished(); void positionChanged(qint64 position); void durationChanged(qint64 duration); protected: QAudioDecoderControl(QObject* parent = 0); }; #define QAudioDecoderControl_iid "org.qt-project.qt.audiodecodercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QAudioDecoderControl, QAudioDecoderControl_iid) QT_END_NAMESPACE #endif // QAUDIODECODERCONTROL_H qaudioencodersettingscontrol.cpp000066400000000000000000000115661225012771600360250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudioencodersettingscontrol.h" #include QT_BEGIN_NAMESPACE /*! \class QAudioEncoderSettingsControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QAudioEncoderSettingsControl class provides access to the settings of a media service that performs audio encoding. If a QMediaService supports encoding audio data it will implement QAudioEncoderSettingsControl. This control provides information about the limits of restricted audio encoder options and allows the selection of a set of audio encoder settings as specified in a QAudioEncoderSettings object. The functionality provided by this control is exposed to application code through the QMediaRecorder class. The interface name of QAudioEncoderSettingsControl is \c org.qt-project.qt.audioencodersettingscontrol/5.0 as defined in QAudioEncoderSettingsControl_iid. \sa QMediaService::requestControl(), QMediaRecorder */ /*! \macro QAudioEncoderSettingsControl_iid \c org.qt-project.qt.audioencodersettingscontrol/5.0 Defines the interface name of the QAudioEncoderSettingsControl class. \relates QAudioEncoderSettingsControl */ /*! Create a new audio encoder settings control object with the given \a parent. */ QAudioEncoderSettingsControl::QAudioEncoderSettingsControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys the audio encoder settings control. */ QAudioEncoderSettingsControl::~QAudioEncoderSettingsControl() { } /*! \fn QAudioEncoderSettingsControl::supportedAudioCodecs() const Returns the list of supported audio codec names. */ /*! \fn QAudioEncoderSettingsControl::codecDescription(const QString &codec) const Returns description of audio \a codec. */ /*! \fn QAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), bool *continuous) const Returns the list of supported audio sample rates, if known. If non null audio \a settings parameter is passed, the returned list is reduced to sample rates supported with partial settings applied. It can be used for example to query the list of sample rates, supported by specific audio codec. If the encoder supports arbitrary sample rates within the supported rates range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ /*! \fn QAudioEncoderSettingsControl::audioSettings() const Returns the audio encoder settings. The returned value may be different tha passed to QAudioEncoderSettingsControl::setAudioSettings() if the settings contains the default or undefined parameters. In this case if the undefined parameters are already resolved, they should be returned. */ /*! \fn QAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings) Sets the selected audio \a settings. */ #include "moc_qaudioencodersettingscontrol.cpp" QT_END_NAMESPACE qaudioencodersettingscontrol.h000066400000000000000000000061671225012771600354730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOENCODERSETTINGSCONTROL_H #define QAUDIOENCODERSETTINGSCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QStringList; class QAudioFormat; QT_END_NAMESPACE QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QAudioEncoderSettingsControl : public QMediaControl { Q_OBJECT public: virtual ~QAudioEncoderSettingsControl(); virtual QStringList supportedAudioCodecs() const = 0; virtual QString codecDescription(const QString &codecName) const = 0; virtual QList supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const = 0; virtual QAudioEncoderSettings audioSettings() const = 0; virtual void setAudioSettings(const QAudioEncoderSettings&) = 0; protected: QAudioEncoderSettingsControl(QObject *parent = 0); }; #define QAudioEncoderSettingsControl_iid "org.qt-project.qt.audioencodersettingscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QAudioEncoderSettingsControl, QAudioEncoderSettingsControl_iid) QT_END_NAMESPACE #endif // QAUDIOENCODERSETTINGSCONTROL_H qaudioinputselectorcontrol.cpp000066400000000000000000000100311225012771600355070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudioinputselectorcontrol.h" QT_BEGIN_NAMESPACE /*! \class QAudioInputSelectorControl \brief The QAudioInputSelectorControl class provides an audio input selector media control. \inmodule QtMultimedia \ingroup multimedia_control The QAudioInputSelectorControl class provides descriptions of the audio inputs available on a system and allows one to be selected as the audio input of a media service. The interface name of QAudioInputSelectorControl is \c org.qt-project.qt.audioinputselectorcontrol/5.0 as defined in QAudioInputSelectorControl_iid. \sa QMediaService::requestControl() */ /*! \macro QAudioInputSelectorControl_iid \c org.qt-project.qt.audioinputselectorcontrol/5.0 Defines the interface name of the QAudioInputSelectorControl class. \relates QAudioInputSelectorControl */ /*! Constructs a new audio input selector control with the given \a parent. */ QAudioInputSelectorControl::QAudioInputSelectorControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys an audio input selector control. */ QAudioInputSelectorControl::~QAudioInputSelectorControl() { } /*! \fn QList QAudioInputSelectorControl::availableInputs() const Returns a list of the names of the available audio inputs. */ /*! \fn QString QAudioInputSelectorControl::inputDescription(const QString& name) const Returns the description of the input \a name. */ /*! \fn QString QAudioInputSelectorControl::defaultInput() const Returns the name of the default audio input. */ /*! \fn QString QAudioInputSelectorControl::activeInput() const Returns the name of the currently selected audio input. */ /*! \fn QAudioInputSelectorControl::setActiveInput(const QString& name) Set the active audio input to \a name. */ /*! \fn QAudioInputSelectorControl::activeInputChanged(const QString& name) Signals that the audio input has changed to \a name. */ /*! \fn QAudioInputSelectorControl::availableInputsChanged() Signals that list of available inputs has changed. */ #include "moc_qaudioinputselectorcontrol.cpp" QT_END_NAMESPACE qaudioinputselectorcontrol.h000066400000000000000000000057111225012771600351650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOINPUTSELECTORCONTROL_H #define QAUDIOINPUTSELECTORCONTROL_H #include #include QT_BEGIN_NAMESPACE // Class forward declaration required for QDoc bug class QString; class Q_MULTIMEDIA_EXPORT QAudioInputSelectorControl : public QMediaControl { Q_OBJECT public: virtual ~QAudioInputSelectorControl(); virtual QList availableInputs() const = 0; virtual QString inputDescription(const QString& name) const = 0; virtual QString defaultInput() const = 0; virtual QString activeInput() const = 0; public Q_SLOTS: virtual void setActiveInput(const QString& name) = 0; Q_SIGNALS: void activeInputChanged(const QString& name); void availableInputsChanged(); protected: QAudioInputSelectorControl(QObject *parent = 0); }; #define QAudioInputSelectorControl_iid "org.qt-project.qt.audioinputselectorcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QAudioInputSelectorControl, QAudioInputSelectorControl_iid) QT_END_NAMESPACE #endif // QAUDIOINPUTSELECTORCONTROL_H qaudiooutputselectorcontrol.cpp000066400000000000000000000101031225012771600357100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiooutputselectorcontrol.h" QT_BEGIN_NAMESPACE /*! \class QAudioOutputSelectorControl \brief The QAudioOutputSelectorControl class provides an audio output selector media control. \inmodule QtMultimedia \ingroup multimedia_control The QAudioOutputSelectorControl class provides descriptions of the audio outputs available on a system and allows one to be selected as the audio output of a media service. The interface name of QAudioOutputSelectorControl is \c org.qt-project.qt.audiooutputselectorcontrol/5.0 as defined in QAudioOutputSelectorControl_iid. \sa QMediaService::requestControl() */ /*! \macro QAudioOutputSelectorControl_iid \c org.qt-project.qt.audiooutputselectorcontrol/5.0 Defines the interface name of the QAudioOutputSelectorControl class. \relates QAudioOutputSelectorControl */ /*! Constructs a new audio output selector control with the given \a parent. */ QAudioOutputSelectorControl::QAudioOutputSelectorControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys an audio output selector control. */ QAudioOutputSelectorControl::~QAudioOutputSelectorControl() { } /*! \fn QList QAudioOutputSelectorControl::availableOutputs() const Returns a list of the names of the available audio outputs. */ /*! \fn QString QAudioOutputSelectorControl::outputDescription(const QString& name) const Returns the description of the output \a name. */ /*! \fn QString QAudioOutputSelectorControl::defaultOutput() const Returns the name of the default audio output. */ /*! \fn QString QAudioOutputSelectorControl::activeOutput() const Returns the name of the currently selected audio output. */ /*! \fn QAudioOutputSelectorControl::setActiveOutput(const QString& name) Set the active audio output to \a name. */ /*! \fn QAudioOutputSelectorControl::activeOutputChanged(const QString& name) Signals that the audio output has changed to \a name. */ /*! \fn QAudioOutputSelectorControl::availableOutputsChanged() Signals that list of available outputs has changed. */ #include "moc_qaudiooutputselectorcontrol.cpp" QT_END_NAMESPACE qaudiooutputselectorcontrol.h000066400000000000000000000057321225012771600353710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIOOUTPUTSELECTORCONTROL_H #define QAUDIOOUTPUTSELECTORCONTROL_H #include #include QT_BEGIN_NAMESPACE // Class forward declaration required for QDoc bug class QString; class Q_MULTIMEDIA_EXPORT QAudioOutputSelectorControl : public QMediaControl { Q_OBJECT public: virtual ~QAudioOutputSelectorControl(); virtual QList availableOutputs() const = 0; virtual QString outputDescription(const QString& name) const = 0; virtual QString defaultOutput() const = 0; virtual QString activeOutput() const = 0; public Q_SLOTS: virtual void setActiveOutput(const QString& name) = 0; Q_SIGNALS: void activeOutputChanged(const QString& name); void availableOutputsChanged(); protected: QAudioOutputSelectorControl(QObject *parent = 0); }; #define QAudioOutputSelectorControl_iid "org.qt-project.qt.audiooutputselectorcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QAudioOutputSelectorControl, QAudioOutputSelectorControl_iid) QT_END_NAMESPACE #endif // QAUDIOOUTPUTSELECTORCONTROL_H qcameracapturebufferformatcontrol.cpp000066400000000000000000000072631225012771600370210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QT_BEGIN_NAMESPACE /*! \class QCameraCaptureBufferFormatControl \brief The QCameraCaptureBufferFormatControl class provides a control for setting the capture buffer format. The format is of type QVideoFrame::PixelFormat. \inmodule QtMultimedia \ingroup multimedia_control The interface name of QCameraCaptureBufferFormatControl is \c org.qt-project.qt.cameracapturebufferformatcontrol/5.0 as defined in QCameraCaptureBufferFormatControl_iid. \sa QMediaService::requestControl() */ /*! \macro QCameraCaptureBufferFormatControl_iid \c org.qt-project.qt.cameracapturebufferformatcontrol/5.0 Defines the interface name of the QCameraCaptureBufferFormatControl class. \relates QCameraCaptureBufferFormatControl */ /*! Constructs a new image buffer capture format control object with the given \a parent */ QCameraCaptureBufferFormatControl::QCameraCaptureBufferFormatControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys an image buffer capture format control. */ QCameraCaptureBufferFormatControl::~QCameraCaptureBufferFormatControl() { } /*! \fn QCameraCaptureBufferFormatControl::supportedBufferFormats() const Returns the list of the supported buffer capture formats. */ /*! \fn QCameraCaptureBufferFormatControl::bufferFormat() const Returns the current buffer capture format. */ /*! \fn QCameraCaptureBufferFormatControl::setBufferFormat(QVideoFrame::PixelFormat format) Sets the buffer capture \a format. */ /*! \fn QCameraCaptureBufferFormatControl::bufferFormatChanged(QVideoFrame::PixelFormat format) Signals the buffer image capture format changed to \a format. */ #include "moc_qcameracapturebufferformatcontrol.cpp" QT_END_NAMESPACE qcameracapturebufferformatcontrol.h000066400000000000000000000055601225012771600364640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERACAPTUREBUFFERFORMATCONTROL_H #define QCAMERACAPTUREBUFFERFORMATCONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraCaptureBufferFormatControl : public QMediaControl { Q_OBJECT public: ~QCameraCaptureBufferFormatControl(); virtual QList supportedBufferFormats() const = 0; virtual QVideoFrame::PixelFormat bufferFormat() const = 0; virtual void setBufferFormat(QVideoFrame::PixelFormat format) = 0; Q_SIGNALS: void bufferFormatChanged(QVideoFrame::PixelFormat); protected: QCameraCaptureBufferFormatControl(QObject* parent = 0); }; #define QCameraCaptureBufferFormatControl_iid "org.qt-project.qt.cameracapturebufferformatcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraCaptureBufferFormatControl, QCameraCaptureBufferFormatControl_iid) QT_END_NAMESPACE #endif qcameracapturedestinationcontrol.cpp000066400000000000000000000076301225012771600366560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include QT_BEGIN_NAMESPACE /*! \class QCameraCaptureDestinationControl \brief The QCameraCaptureDestinationControl class provides a control for setting capture destination. Depending on backend capabilities capture to file, buffer or both can be supported. \inmodule QtMultimedia \ingroup multimedia_control The interface name of QCameraCaptureDestinationControl is \c org.qt-project.qt.cameracapturedestinationcontrol/5.0 as defined in QCameraCaptureDestinationControl_iid. \sa QMediaService::requestControl() */ /*! \macro QCameraCaptureDestinationControl_iid \c org.qt-project.qt.cameracapturedestinationcontrol/5.0 Defines the interface name of the QCameraCaptureDestinationControl class. \relates QCameraCaptureDestinationControl */ /*! Constructs a new image capture destination control object with the given \a parent */ QCameraCaptureDestinationControl::QCameraCaptureDestinationControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys an image capture destination control. */ QCameraCaptureDestinationControl::~QCameraCaptureDestinationControl() { } /*! \fn QCameraCaptureDestinationControl::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Returns true if the capture \a destination is supported; and false if it is not. */ /*! \fn QCameraCaptureDestinationControl::captureDestination() const Returns the current capture destination. The default destination is QCameraImageCapture::CaptureToFile. */ /*! \fn QCameraCaptureDestinationControl::setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Sets the capture \a destination. */ /*! \fn QCameraCaptureDestinationControl::captureDestinationChanged(QCameraImageCapture::CaptureDestinations destination) Signals the image capture \a destination changed. */ #include "moc_qcameracapturedestinationcontrol.cpp" QT_END_NAMESPACE qcameracapturedestinationcontrol.h000066400000000000000000000057161225012771600363260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERACAPTUREDESTINATIONCONTROL_H #define QCAMERACAPTUREDESTINATIONCONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraCaptureDestinationControl : public QMediaControl { Q_OBJECT public: ~QCameraCaptureDestinationControl(); virtual bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const = 0; virtual QCameraImageCapture::CaptureDestinations captureDestination() const = 0; virtual void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) = 0; Q_SIGNALS: void captureDestinationChanged(QCameraImageCapture::CaptureDestinations); protected: QCameraCaptureDestinationControl(QObject* parent = 0); }; #define QCameraCaptureDestinationControl_iid "org.qt-project.qt.cameracapturedestinationcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraCaptureDestinationControl, QCameraCaptureDestinationControl_iid) QT_END_NAMESPACE #endif qcameracontrol.cpp000066400000000000000000000141161225012771600330250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraControl \brief The QCameraControl class is an abstract base class for classes that control still cameras or video cameras. \inmodule QtMultimedia \ingroup multimedia_control This service is provided by a QMediaService object via QMediaService::control(). It is used by QCamera. The interface name of QCameraControl is \c org.qt-project.qt.cameracontrol/5.0 as defined in QCameraControl_iid. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraControl_iid \c org.qt-project.qt.cameracontrol/5.0 Defines the interface name of the QCameraControl class. \relates QCameraControl */ /*! Constructs a camera control object with \a parent. */ QCameraControl::QCameraControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the camera control object. */ QCameraControl::~QCameraControl() { } /*! \fn QCameraControl::state() const Returns the state of the camera service. \sa QCamera::state */ /*! \fn QCameraControl::setState(QCamera::State state) Sets the camera \a state. State changes are synchronous and indicate user intention, while camera status is used as a feedback mechanism to inform application about backend status. Status changes are reported asynchronously with QCameraControl::statusChanged() signal. \sa QCamera::State */ /*! \fn void QCameraControl::stateChanged(QCamera::State state) Signal emitted when the camera \a state changes. In most cases the state chage is caused by QCameraControl::setState(), but if critical error has occurred the state changes to QCamera::UnloadedState. */ /*! \fn QCameraControl::status() const Returns the status of the camera service. \sa QCamera::state */ /*! \fn void QCameraControl::statusChanged(QCamera::Status status) Signal emitted when the camera \a status changes. */ /*! \fn void QCameraControl::error(int error, const QString &errorString) Signal emitted when an error occurs with error code \a error and a description of the error \a errorString. */ /*! \fn Camera::CaptureModes QCameraControl::captureMode() const = 0 Returns the current capture mode. */ /*! \fn void QCameraControl::setCaptureMode(QCamera::CaptureModes mode) = 0; Sets the current capture \a mode. The capture mode changes are synchronous and allowed in any camera state. If the capture mode is changed while camera is active, it's recommended to change status to QCamera::LoadedStatus and start activating the camera in the next event loop with the status changed to QCamera::StartingStatus. This allows the capture settings to be applied before camera is started. Than change the status to QCamera::StartedStatus when the capture mode change is done. */ /*! \fn bool QCameraControl::isCaptureModeSupported(QCamera::CaptureModes mode) const = 0; Returns true if the capture \a mode is suported. */ /*! \fn QCameraControl::captureModeChanged(QCamera::CaptureModes mode) Signal emitted when the camera capture \a mode changes. */ /*! \fn bool QCameraControl::canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Returns true if backend can effectively apply changing camera properties of \a changeType type while the camera state is QCamera::Active and camera status matches \a status parameter. If backend doesn't support applying this change in the active state, it will be stopped before the settings are changed and restarted after. Otherwise the backend should apply the change in the current state, with the camera status indicating the progress, if necessary. */ /*! \enum QCameraControl::PropertyChangeType \value CaptureMode Indicates the capture mode is changed. \value ImageEncodingSettings Image encoder settings are changed, including resolution. \value VideoEncodingSettings Video encoder settings are changed, including audio, video and container settings. \value Viewfinder Viewfinder is changed. */ #include "moc_qcameracontrol.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/qcameracontrol.h000066400000000000000000000064011225012771600325470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERACONTROL_H #define QCAMERACONTROL_H #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraControl : public QMediaControl { Q_OBJECT public: enum PropertyChangeType { CaptureMode = 1, ImageEncodingSettings = 2, VideoEncodingSettings = 3, Viewfinder = 4 }; ~QCameraControl(); virtual QCamera::State state() const = 0; virtual void setState(QCamera::State state) = 0; virtual QCamera::Status status() const = 0; virtual QCamera::CaptureModes captureMode() const = 0; virtual void setCaptureMode(QCamera::CaptureModes) = 0; virtual bool isCaptureModeSupported(QCamera::CaptureModes mode) const = 0; virtual bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const = 0; Q_SIGNALS: void stateChanged(QCamera::State); void statusChanged(QCamera::Status); void error(int error, const QString &errorString); void captureModeChanged(QCamera::CaptureModes); protected: QCameraControl(QObject* parent = 0); }; #define QCameraControl_iid "org.qt-project.qt.cameracontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraControl, QCameraControl_iid) QT_END_NAMESPACE #endif // QCAMERACONTROL_H qcameraexposurecontrol.cpp000066400000000000000000000162271225012771600346250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraExposureControl \brief The QCameraExposureControl class allows controlling camera exposure parameters. \inmodule QtMultimedia \ingroup multimedia_control The QCameraExposure class is the usual method of adjusting exposure related parameters when using camera functionality. This class provides a more complete but less easy to use interface, and also forms the interface to implement when writing a new implementation of QCamera functionality. You can adjust a number of parameters that will affect images and video taken with the corresponding QCamera object - see the \l {QCameraExposureControl::ExposureParameter}{ExposureParameter} enumeration. The interface name of QCameraExposureControl is \c org.qt-project.qt.cameraexposurecontrol/5.0 as defined in QCameraExposureControl_iid. \sa QCameraExposure, QCamera */ /*! \macro QCameraExposureControl_iid \c org.qt-project.qt.cameraexposurecontrol/5.0 Defines the interface name of the QCameraExposureControl class. \relates QCameraExposureControl */ /*! Constructs a camera exposure control object with \a parent. */ QCameraExposureControl::QCameraExposureControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the camera exposure control object. */ QCameraExposureControl::~QCameraExposureControl() { } /*! \enum QCameraExposureControl::ExposureParameter \value ISO Camera ISO sensitivity, specified as integer value. \value Aperture Lens aperture is specified as an qreal F number. The supported apertures list can change depending on the focal length, in such a case the exposureParameterRangeChanged() signal is emitted. \value ShutterSpeed Shutter speed in seconds, specified as qreal. \value ExposureCompensation Exposure compensation, specified as qreal EV value. \value FlashPower Manual flash power, specified as qreal value. Accepted power range is [0..1.0], with 0 value means no flash and 1.0 corresponds to full flash power. This value is only used in the \l{QCameraExposure::FlashManual}{manual flash mode}. \value TorchPower Manual torch power, specified as qreal value. Accepted power range is [0..1.0], with 0 value means no light and 1.0 corresponds to full torch power. This value is only used in the \l{QCameraExposure::FlashTorch}{torch flash mode}. \value FlashCompensation Flash compensation, specified as qreal EV value. \value SpotMeteringPoint The relative frame coordinate of the point to use for exposure metering in spot metering mode, specified as a QPointF. \value ExposureMode Camera exposure mode. \value MeteringMode Camera metering mode. \value ExtendedExposureParameter The base value for platform specific extended parameters. For such parameters the sequential values starting from ExtendedExposureParameter shuld be used. */ /*! \fn QCameraExposureControl::isParameterSupported(ExposureParameter parameter) const Returns true is exposure \a parameter is supported by backend. \since 5.0 */ /*! \fn QCameraExposureControl::requestedValue(ExposureParameter parameter) const Returns the requested exposure \a parameter value. \since 5.0 */ /*! \fn QCameraExposureControl::actualValue(ExposureParameter parameter) const Returns the actual exposure \a parameter value, or invalid QVariant() if the value is unknown or not supported. The actual parameter value may differ for the requested one if automatic mode is selected or camera supports only limited set of values within the supported range. \since 5.0 */ /*! \fn QCameraExposureControl::supportedParameterRange(ExposureParameter parameter, bool *continuous = 0) const Returns the list of supported \a parameter values; If the camera supports arbitrary exposure parameter value within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. \since 5.0 */ /*! \fn bool QCameraExposureControl::setValue(ExposureParameter parameter, const QVariant& value) Set the exposure \a parameter to \a value. If a null or invalid QVariant is passed, backend should choose the value automatically, and if possible report the actual value to user with QCameraExposureControl::actualValue(). Returns true if parameter is supported and value is correct. \since 5.0 */ /*! \fn void QCameraExposureControl::requestedValueChanged(int parameter) Signal emitted when the requested exposure \a parameter value has changed, usually in result of setValue() call. \since 5.0 */ /*! \fn void QCameraExposureControl::actualValueChanged(int parameter) Signal emitted when the actual exposure \a parameter value has changed, usually in result of auto exposure algorithms or manual exposure parameter applied. \since 5.0 */ /*! \fn void QCameraExposureControl::parameterRangeChanged(int parameter) Signal emitted when the supported range of exposure \a parameter values has changed. \since 5.0 */ #include "moc_qcameraexposurecontrol.cpp" QT_END_NAMESPACE qcameraexposurecontrol.h000066400000000000000000000072011225012771600342620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAEXPOSURECONTROL_H #define QCAMERAEXPOSURECONTROL_H #include #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraExposureControl : public QMediaControl { Q_OBJECT Q_ENUMS(ExposureParameter) public: ~QCameraExposureControl(); enum ExposureParameter { ISO, Aperture, ShutterSpeed, ExposureCompensation, FlashPower, FlashCompensation, TorchPower, SpotMeteringPoint, ExposureMode, MeteringMode, ExtendedExposureParameter = 1000 }; virtual bool isParameterSupported(ExposureParameter parameter) const = 0; virtual QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const = 0; virtual QVariant requestedValue(ExposureParameter parameter) const = 0; virtual QVariant actualValue(ExposureParameter parameter) const = 0; virtual bool setValue(ExposureParameter parameter, const QVariant& value) = 0; Q_SIGNALS: void requestedValueChanged(int parameter); void actualValueChanged(int parameter); void parameterRangeChanged(int parameter); protected: QCameraExposureControl(QObject* parent = 0); }; #define QCameraExposureControl_iid "org.qt-project.qt.cameraexposurecontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraExposureControl, QCameraExposureControl_iid) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraExposureControl::ExposureParameter) Q_MEDIA_ENUM_DEBUG(QCameraExposureControl, ExposureParameter) #endif // QCAMERAEXPOSURECONTROL_H qcamerafeedbackcontrol.cpp000066400000000000000000000144751225012771600345020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcamerafeedbackcontrol.h" #include /*! \class QCameraFeedbackControl \brief The QCameraFeedbackControl class allows controlling feedback (sounds etc) during camera operation \inmodule QtMultimedia \ingroup multimedia_control \since 5.0 When using a camera, there are several times when some form of feedback to the user is given - for example, when an image is taken, or when recording is started. You can enable or disable some of this feedback, or adjust what sound might be played for these actions. In some cases it may be undesirable to play a sound effect - for example, when initiating video recording the sound itself may be recorded. \note In some countries or regions, feedback sounds or other indications (e.g. a red light) are mandatory during camera operation. In these cases, you can check \c isEventFeedbackLocked to check if that type of feedback can be modified. Any attempts to change a locked feedback type will be ignored. The interface name of QCameraFeedbackControl is \c org.qt-project.qt.camerafeedbackcontrol/5.0 as defined in QCameraFeedbackControl_iid. \sa QCamera */ /*! \enum QCameraFeedbackControl::EventType This enumeration describes certain events that occur during camera usage. You can associate some form of feedback to be given when the event occurs, or check whether feedback for this event is enabled or locked so that changes cannot be made. \value ViewfinderStarted The viewfinder stream was started (even if not visible) \value ViewfinderStopped The viewfinder stream was stopped \value ImageCaptured An image was captured but not yet fully processed \value ImageSaved An image is fully available and saved somewhere. \value ImageError An error occurred while capturing an image \value RecordingStarted Video recording has started \value RecordingInProgress Video recording is in progress \value RecordingStopped Video recording has stopped \value AutoFocusInProgress The camera is trying to automatically focus \value AutoFocusLocked The camera has automatically focused successfully \value AutoFocusFailed The camera was unable to focus automatically */ /*! \macro QCameraFeedbackControl_iid \c org.qt-project.qt.camerafeedbackcontrol/5.0 Defines the interface name of the QCameraFeedbackControl class. \relates QCameraFeedbackControl */ /*! Constructs a camera feedback control object with \a parent. */ QCameraFeedbackControl::QCameraFeedbackControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the camera feedback control object. */ QCameraFeedbackControl::~QCameraFeedbackControl() { } /*! \fn bool QCameraFeedbackControl::isEventFeedbackLocked(EventType event) const Returns true if the feedback setting for \a event is locked. This may be true because of legal compliance issues, or because configurability of this event's feedback is not supported. \since 5.0 */ /*! \fn bool QCameraFeedbackControl::isEventFeedbackEnabled(EventType event) const Returns true if the feedback for \a event is enabled. \since 5.0 */ /*! \fn bool QCameraFeedbackControl::setEventFeedbackEnabled(EventType event, bool enabled) Turns on feedback for the specific \a event if \a enabled is true, otherwise disables the feedback. Returns true if the feedback could be modified, or false otherwise (e.g. this feedback type is locked). \since 5.0 */ /*! \fn void QCameraFeedbackControl::resetEventFeedback(EventType event) Restores the feedback setting for this \a event to its default setting. \since 5.0 */ /*! \fn bool QCameraFeedbackControl::setEventFeedbackSound(EventType event, const QString &filePath) When the given \a event occurs, the sound effect referenced by \a filePath will be played instead of the default sound. If this feedback type is locked, or if the supplied path is inaccessible, this function will return false. In addition, some forms of feedback may be non-auditory (e.g. a red light, or a vibration), and false may be returned in this case. The file referenced should be linear PCM (WAV format). \note In the case that a valid file path to an unsupported file is given, this function will return true but the feedback will use the original setting. \since 5.0 */ qcamerafeedbackcontrol.h000066400000000000000000000063151225012771600341410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAFEEDBACKCONTROL_H #define QCAMERAFEEDBACKCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraFeedbackControl : public QMediaControl { Q_OBJECT public: enum EventType { ViewfinderStarted = 1, ViewfinderStopped, ImageCaptured, ImageSaved, ImageError, RecordingStarted, RecordingInProgress, RecordingStopped, AutoFocusInProgress, AutoFocusLocked, AutoFocusFailed }; ~QCameraFeedbackControl(); virtual bool isEventFeedbackLocked(EventType) const = 0; virtual bool isEventFeedbackEnabled(EventType) const = 0; virtual bool setEventFeedbackEnabled(EventType, bool) = 0; virtual void resetEventFeedback(EventType) = 0; virtual bool setEventFeedbackSound(EventType, const QString &filePath) = 0; protected: QCameraFeedbackControl(QObject* parent = 0); }; #define QCameraFeedbackControl_iid "org.qt-project.qt.camerafeedbackcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraFeedbackControl, QCameraFeedbackControl_iid) QT_END_NAMESPACE #endif // QCAMERAFEEDBACKCONTROL_H qcameraflashcontrol.cpp000066400000000000000000000101631225012771600340410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraFlashControl \brief The QCameraFlashControl class allows controlling a camera's flash. \inmodule QtMultimedia \ingroup multimedia_control You can set the type of flash effect used when an image is captured, and test to see if the flash hardware is ready to fire. You can retrieve this control from the camera object in the usual way: Some camera devices may not have flash hardware, or may not be configurable. In that case, there will be no QCameraFlashControl available. The interface name of QCameraFlashControl is \c org.qt-project.qt.cameraflashcontrol/5.0 as defined in QCameraFlashControl_iid. \sa QCamera */ /*! \macro QCameraFlashControl_iid \c org.qt-project.qt.cameraflashcontrol/5.0 Defines the interface name of the QCameraFlashControl class. \relates QCameraFlashControl */ /*! Constructs a camera flash control object with \a parent. */ QCameraFlashControl::QCameraFlashControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the camera control object. */ QCameraFlashControl::~QCameraFlashControl() { } /*! \fn QCamera::FlashModes QCameraFlashControl::flashMode() const Returns the current flash mode. */ /*! \fn void QCameraFlashControl::setFlashMode(QCameraExposure::FlashModes mode) Set the current flash \a mode. Usually a single QCameraExposure::FlashMode flag is used, but some non conflicting flags combination are also allowed, like QCameraExposure::FlashManual | QCameraExposure::FlashSlowSyncRearCurtain. */ /*! \fn QCameraFlashControl::isFlashModeSupported(QCameraExposure::FlashModes mode) const Return true if the reqested flash \a mode is supported. Some QCameraExposure::FlashMode values can be combined, for example QCameraExposure::FlashManual | QCameraExposure::FlashSlowSyncRearCurtain */ /*! \fn bool QCameraFlashControl::isFlashReady() const Returns true if flash is charged. */ /*! \fn void QCameraFlashControl::flashReady(bool ready) Signal emitted when flash state changes to \a ready. */ #include "moc_qcameraflashcontrol.cpp" QT_END_NAMESPACE qcameraflashcontrol.h000066400000000000000000000055471225012771600335200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAFLASHCONTROL_H #define QCAMERAFLASHCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraFlashControl : public QMediaControl { Q_OBJECT public: ~QCameraFlashControl(); virtual QCameraExposure::FlashModes flashMode() const = 0; virtual void setFlashMode(QCameraExposure::FlashModes mode) = 0; virtual bool isFlashModeSupported(QCameraExposure::FlashModes mode) const = 0; virtual bool isFlashReady() const = 0; Q_SIGNALS: void flashReady(bool); protected: QCameraFlashControl(QObject* parent = 0); }; #define QCameraFlashControl_iid "org.qt-project.qt.cameraflashcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraFlashControl, QCameraFlashControl_iid) QT_END_NAMESPACE #endif // QCAMERAFLASHCONTROL_H qcamerafocuscontrol.cpp000066400000000000000000000130471225012771600340670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraFocusControl \brief The QCameraFocusControl class supplies control for focusing related camera parameters. \inmodule QtMultimedia \ingroup multimedia_control The interface name of QCameraFocusControl is \c org.qt-project.qt.camerafocuscontrol/5.0 as defined in QCameraFocusControl_iid. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraFocusControl_iid \c org.qt-project.qt.camerafocuscontrol/5.0 Defines the interface name of the QCameraFocusControl class. \relates QCameraFocusControl */ /*! Constructs a camera control object with \a parent. */ QCameraFocusControl::QCameraFocusControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the camera control object. */ QCameraFocusControl::~QCameraFocusControl() { } /*! \fn QCameraFocus::FocusModes QCameraFocusControl::focusMode() const Returns the focus mode being used. */ /*! \fn void QCameraFocusControl::setFocusMode(QCameraFocus::FocusModes mode) Set the focus mode to \a mode. */ /*! \fn bool QCameraFocusControl::isFocusModeSupported(QCameraFocus::FocusModes mode) const Returns true if focus \a mode is supported. */ /*! \fn QCameraFocusControl::focusPointMode() const Returns the camera focus point selection mode. */ /*! \fn QCameraFocusControl::setFocusPointMode(QCameraFocus::FocusPointMode mode) Sets the camera focus point selection \a mode. */ /*! \fn QCameraFocusControl::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Returns true if the camera focus point \a mode is supported. */ /*! \fn QCameraFocusControl::customFocusPoint() const Return the position of custom focus point, in relative frame coordinates: QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) points to the frame center. Custom focus point is used only in FocusPointCustom focus mode. */ /*! \fn QCameraFocusControl::setCustomFocusPoint(const QPointF &point) Sets the custom focus \a point. If camera supports fixed set of focus points, it should use the nearest supported focus point, and return the actual focus point with QCameraFocusControl::focusZones(). \sa QCameraFocusControl::customFocusPoint(), QCameraFocusControl::focusZones() */ /*! \fn QCameraFocusControl::focusZones() const Returns the list of zones, the camera is using for focusing or focused on. */ /*! \fn QCameraFocusControl::focusZonesChanged() Signal is emitted when the set of zones, camera focused on is changed. Usually the zones list is changed when the camera is focused. \sa QCameraFocusControl::focusZones() */ /*! \fn void QCameraFocusControl::focusModeChanged(QCameraFocus::FocusModes mode) Signal is emitted when the focus \a mode is changed, usually in result of QCameraFocusControl::setFocusMode call or capture mode changes. \sa QCameraFocusControl::focusMode(), QCameraFocusControl::setFocusMode() */ /*! \fn void QCameraFocusControl::focusPointModeChanged(QCameraFocus::FocusPointMode mode) Signal is emitted when the focus point \a mode is changed, usually in result of QCameraFocusControl::setFocusPointMode call or capture mode changes. \sa QCameraFocusControl::focusPointMode(), QCameraFocusControl::setFocusPointMode() */ /*! \fn void QCameraFocusControl::customFocusPointChanged(const QPointF &point) Signal is emitted when the custom focus \a point is changed. \sa QCameraFocusControl::customFocusPoint(), QCameraFocusControl::setCustomFocusPoint() */ #include "moc_qcamerafocuscontrol.cpp" QT_END_NAMESPACE qcamerafocuscontrol.h000066400000000000000000000065301225012771600335330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAFOCUSCONTROL_H #define QCAMERAFOCUSCONTROL_H #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraFocusControl : public QMediaControl { Q_OBJECT public: ~QCameraFocusControl(); virtual QCameraFocus::FocusModes focusMode() const = 0; virtual void setFocusMode(QCameraFocus::FocusModes mode) = 0; virtual bool isFocusModeSupported(QCameraFocus::FocusModes mode) const = 0; virtual QCameraFocus::FocusPointMode focusPointMode() const = 0; virtual void setFocusPointMode(QCameraFocus::FocusPointMode mode) = 0; virtual bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const = 0; virtual QPointF customFocusPoint() const = 0; virtual void setCustomFocusPoint(const QPointF &point) = 0; virtual QCameraFocusZoneList focusZones() const = 0; Q_SIGNALS: void focusModeChanged(QCameraFocus::FocusModes mode); void focusPointModeChanged(QCameraFocus::FocusPointMode mode); void customFocusPointChanged(const QPointF &point); void focusZonesChanged(); protected: QCameraFocusControl(QObject* parent = 0); }; #define QCameraFocusControl_iid "org.qt-project.qt.camerafocuscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraFocusControl, QCameraFocusControl_iid) QT_END_NAMESPACE #endif // QCAMERAFOCUSCONTROL_H qcameraimagecapturecontrol.cpp000066400000000000000000000140051225012771600354110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include QT_BEGIN_NAMESPACE /*! \class QCameraImageCaptureControl \brief The QCameraImageCaptureControl class provides a control interface for image capture services. \inmodule QtMultimedia \ingroup multimedia_control The interface name of QCameraImageCaptureControl is \c org.qt-project.qt.cameraimagecapturecontrol/5.0 as defined in QCameraImageCaptureControl_iid. \sa QMediaService::requestControl() */ /*! \macro QCameraImageCaptureControl_iid \c org.qt-project.qt.cameraimagecapturecontrol/5.0 Defines the interface name of the QCameraImageCaptureControl class. \relates QCameraImageCaptureControl */ /*! Constructs a new image capture control object with the given \a parent */ QCameraImageCaptureControl::QCameraImageCaptureControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys an image capture control. */ QCameraImageCaptureControl::~QCameraImageCaptureControl() { } /*! \fn QCameraImageCaptureControl::isReadyForCapture() const Identifies if a capture control is ready to perform a capture immediately (all the resources necessary for image capture are allocated, hardware initialized, flash is charged, etc). Returns true if the camera is ready for capture; and false if it is not. It's permissible to call capture() while the camera status is QCamera::ActiveStatus regardless of isReadyForCapture property value. If camera is not ready to capture image immediately, the capture request is queued with all the related camera settings to be executed as soon as possible. */ /*! \fn QCameraImageCaptureControl::readyForCaptureChanged(bool ready) Signals that a capture control's \a ready state has changed. */ /*! \fn QCameraImageCaptureControl::capture(const QString &fileName) Initiates the capture of an image to \a fileName. The \a fileName can be relative or empty, in this case the service should use the system specific place and file naming scheme. The Camera service should save all the capture parameters like exposure settings or image processing parameters, so changes to camera paramaters after capture() is called do not affect previous capture requests. Returns the capture request id number, which is used later with imageExposed(), imageCaptured() and imageSaved() signals. */ /*! \fn QCameraImageCaptureControl::cancelCapture() Cancel pending capture requests. */ /*! \fn QCameraImageCaptureControl::imageExposed(int requestId) Signals that an image with it \a requestId has just been exposed. This signal can be used for the shutter sound or other indicaton. */ /*! \fn QCameraImageCaptureControl::imageCaptured(int requestId, const QImage &preview) Signals that an image with it \a requestId has been captured and a \a preview is available. */ /*! \fn QCameraImageCaptureControl::imageMetadataAvailable(int id, const QString &key, const QVariant &value) Signals that a metadata for an image with request \a id is available. Signal also contains the \a key and \a value of the metadata. This signal should be emitted between imageExposed and imageSaved signals. */ /*! \fn QCameraImageCaptureControl::imageAvailable(int requestId, const QVideoFrame &buffer) Signals that a captured \a buffer with a \a requestId is available. */ /*! \fn QCameraImageCaptureControl::imageSaved(int requestId, const QString &fileName) Signals that a captured image with a \a requestId has been saved to \a fileName. */ /*! \fn QCameraImageCaptureControl::driveMode() const Returns the current camera drive mode. */ /*! \fn QCameraImageCaptureControl::setDriveMode(QCameraImageCapture::DriveMode mode) Sets the current camera drive \a mode. */ /*! \fn QCameraImageCaptureControl::error(int id, int error, const QString &errorString) Signals the capture request \a id failed with \a error code and message \a errorString. \sa QCameraImageCapture::Error */ #include "moc_qcameraimagecapturecontrol.cpp" QT_END_NAMESPACE qcameraimagecapturecontrol.h000066400000000000000000000064251225012771600350650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAIMAGECAPTURECONTROL_H #define QCAMERAIMAGECAPTURECONTROL_H #include #include QT_BEGIN_NAMESPACE class QImage; QT_END_NAMESPACE QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraImageCaptureControl : public QMediaControl { Q_OBJECT public: ~QCameraImageCaptureControl(); virtual bool isReadyForCapture() const = 0; virtual QCameraImageCapture::DriveMode driveMode() const = 0; virtual void setDriveMode(QCameraImageCapture::DriveMode mode) = 0; virtual int capture(const QString &fileName) = 0; virtual void cancelCapture() = 0; Q_SIGNALS: void readyForCaptureChanged(bool); void imageExposed(int id); void imageCaptured(int id, const QImage &preview); void imageMetadataAvailable(int id, const QString &key, const QVariant &value); void imageAvailable(int id, const QVideoFrame &buffer); void imageSaved(int id, const QString &fileName); void error(int id, int error, const QString &errorString); protected: QCameraImageCaptureControl(QObject* parent = 0); }; #define QCameraImageCaptureControl_iid "org.qt-project.qt.cameraimagecapturecontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraImageCaptureControl, QCameraImageCaptureControl_iid) QT_END_NAMESPACE #endif // QCAMERAIMAGECAPTURECONTROL_H qcameraimageprocessingcontrol.cpp000066400000000000000000000151511225012771600361250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE namespace { class QCameraImageProcessingControlPrivateRegisterMetaTypes { public: QCameraImageProcessingControlPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QCameraImageProcessingControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QCameraImageProcessingControl class provides an abstract class for controlling image processing parameters, like white balance, contrast, saturation, sharpening and denoising. The interface name of QCameraImageProcessingControl is \c org.qt-project.qt.cameraimageprocessingcontrol/5.0 as defined in QCameraImageProcessingControl_iid. Camera service may choose the parameters of image processing pipeline depending on sensor properties camera settings and capture parameters. This control allows to modify some parameters of image processing pipeline to achieve desired results. Parameters with the "Adjustment" suffix, like ContrastAdjustment, SaturationAdjustment etc allows to adjust the parameter values, selected by camera engine, while parameters like Contrast and Saturation overwrites them. For example setting the SharpeningAdjustment parameter to -0.1 slightly reduces the amount of sharpening applied, while settings the Sharpening parameter to 0 disables sharpening at all. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraImageProcessingControl_iid \c org.qt-project.qt.cameraimageprocessingcontrol/5.0 Defines the interface name of the QCameraImageProcessingControl class. \relates QCameraImageProcessingControl */ /*! Constructs an image processing control object with \a parent. */ QCameraImageProcessingControl::QCameraImageProcessingControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the image processing control object. */ QCameraImageProcessingControl::~QCameraImageProcessingControl() { } /*! \fn bool QCameraImageProcessingControl::isParameterSupported(ProcessingParameter parameter) const Returns true if the camera supports adjusting image processing \a parameter. Usually the the supported settings is static, but some parameter may not be available depending on other camera settings, like presets. In such case the currently supported parameters should be returned. */ /*! \fn bool QCameraImageProcessingControl::isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Returns true if the camera supports settings the the image processing \a parameter \a value. It's used only for parameters with a limited set of values, like WhiteBalancePreset. */ /*! \fn QCameraImageProcessingControl::parameter(ProcessingParameter parameter) const Returns the image processing \a parameter value. */ /*! \fn QCameraImageProcessingControl::setParameter(ProcessingParameter parameter, const QVariant &value) Sets the image processing \a parameter \a value. Passing the null or invalid QVariant value allows backend to choose the suitable parameter value. The valid values range depends on the parameter type. For WhiteBalancePreset the value should be one of QCameraImageProcessing::WhiteBalanceMode values; for Contrast, Saturation, Brightness, Sharpening and Denoising the value should be in [0..1.0] range with invalid QVariant value indicating the default parameter value; for ContrastAdjustment, SaturationAdjustment, BrightnessAdjustment, SharpeningAdjustment and DenoisingAdjustment the value should be in [-1.0..1.0] range with default 0. */ /*! \enum QCameraImageProcessingControl::ProcessingParameter \value WhiteBalancePreset The white balance preset. \value ColorTemperature Color temperature in K. This value is used when the manual white balance mode is selected. \value Contrast Image contrast. \value Saturation Image saturation. \value Brightness Image brightness. \value Sharpening Amount of sharpening applied. \value Denoising Amount of denoising applied. \value ContrastAdjustment Image contrast adjustment. \value SaturationAdjustment Image saturation adjustment. \value BrightnessAdjustment Image brightness adjustment. \value SharpeningAdjustment Adjustment of sharpening applied. \value DenoisingAdjustment Adjustment of denoising applied. \value ExtendedParameter The base value for platform specific extended parameters. */ #include "moc_qcameraimageprocessingcontrol.cpp" QT_END_NAMESPACE qcameraimageprocessingcontrol.h000066400000000000000000000067571225012771600356060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAIMAGEPROCESSINGCONTROL_H #define QCAMERAIMAGEPROCESSINGCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraImageProcessingControl : public QMediaControl { Q_OBJECT Q_ENUMS(ProcessingParameter) public: ~QCameraImageProcessingControl(); enum ProcessingParameter { WhiteBalancePreset, ColorTemperature, Contrast, Saturation, Brightness, Sharpening, Denoising, ContrastAdjustment, SaturationAdjustment, BrightnessAdjustment, SharpeningAdjustment, DenoisingAdjustment, ExtendedParameter = 1000 }; virtual bool isParameterSupported(ProcessingParameter) const = 0; virtual bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const = 0; virtual QVariant parameter(ProcessingParameter parameter) const = 0; virtual void setParameter(ProcessingParameter parameter, const QVariant &value) = 0; protected: QCameraImageProcessingControl(QObject* parent = 0); }; #define QCameraImageProcessingControl_iid "org.qt-project.qt.cameraimageprocessingcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraImageProcessingControl, QCameraImageProcessingControl_iid) QT_END_NAMESPACE Q_DECLARE_METATYPE(QCameraImageProcessingControl::ProcessingParameter) Q_MEDIA_ENUM_DEBUG(QCameraImageProcessingControl, ProcessingParameter) #endif qcameralockscontrol.cpp000066400000000000000000000072531225012771600340650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraLocksControl \brief The QCameraLocksControl class is an abstract base class for classes that control still cameras or video cameras. \inmodule QtMultimedia \ingroup multimedia_control This service is provided by a QMediaService object via QMediaService::control(). It is used by QCamera. The interface name of QCameraLocksControl is \c org.qt-project.qt.cameralockscontrol/5.0 as defined in QCameraLocksControl_iid. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraLocksControl_iid \c org.qt-project.qt.cameralockscontrol/5.0 Defines the interface name of the QCameraLocksControl class. \relates QCameraLocksControl */ /*! Constructs a camera locks control object with \a parent. */ QCameraLocksControl::QCameraLocksControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the camera locks control object. */ QCameraLocksControl::~QCameraLocksControl() { } /*! \fn QCameraLocksControl::supportedLocks() const Returns the lock types, the camera supports. */ /*! \fn QCameraLocksControl::lockStatus(QCamera::LockType lock) const Returns the camera \a lock status. */ /*! \fn QCameraLocksControl::searchAndLock(QCamera::LockTypes locks) Request camera \a locks. */ /*! \fn QCameraLocksControl::unlock(QCamera::LockTypes locks) Unlock camera \a locks. */ /*! \fn QCameraLocksControl::lockStatusChanged(QCamera::LockType lock, QCamera::LockStatus status, QCamera::LockChangeReason reason) Signals the \a lock \a status was changed with a specified \a reason. */ #include "moc_qcameralockscontrol.cpp" QT_END_NAMESPACE qcameralockscontrol.h000066400000000000000000000056201225012771600335260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERALOCKSCONTROL_H #define QCAMERALOCKSCONTROL_H #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraLocksControl : public QMediaControl { Q_OBJECT public: ~QCameraLocksControl(); virtual QCamera::LockTypes supportedLocks() const = 0; virtual QCamera::LockStatus lockStatus(QCamera::LockType lock) const = 0; virtual void searchAndLock(QCamera::LockTypes locks) = 0; virtual void unlock(QCamera::LockTypes locks) = 0; Q_SIGNALS: void lockStatusChanged(QCamera::LockType type, QCamera::LockStatus status, QCamera::LockChangeReason reason); protected: QCameraLocksControl(QObject* parent = 0); }; #define QCameraLocksControl_iid "org.qt-project.qt.cameralockscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraLocksControl, QCameraLocksControl_iid) QT_END_NAMESPACE #endif // QCAMERALOCKSCONTROL_H qcameraviewfindersettingscontrol.cpp000066400000000000000000000114161225012771600366710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcameraviewfindersettingscontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraViewfinderSettingsControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QCameraViewfinderSettingsControl class provides an abstract class for controlling camera viewfinder parameters. The interface name of QCameraViewfinderSettingsControl is \c org.qt-project.qt.cameraviewfindersettingscontrol/5.0 as defined in QCameraViewfinderSettingsControl_iid. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraViewfinderSettingsControl_iid \c org.qt-project.qt.cameraviewfinderresettingscontrol/5.0 Defines the interface name of the QCameraViewfinderSettingsControl class. \relates QCameraViewfinderSettingsControl */ /*! Constructs a camera viewfinder control object with \a parent. */ QCameraViewfinderSettingsControl::QCameraViewfinderSettingsControl(QObject *parent) : QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the camera viewfinder control object. */ QCameraViewfinderSettingsControl::~QCameraViewfinderSettingsControl() { } /*! \enum QCameraViewfinderSettingsControl::ViewfinderParameter \value Resolution Viewfinder resolution, QSize. \value PixelAspectRatio Pixel aspect ratio, QSize as in QVideoSurfaceFormat::pixelAspectRatio \value MinimumFrameRate Minimum viewfinder frame rate, qreal \value MaximumFrameRate Maximum viewfinder frame rate, qreal \value PixelFormat Viewfinder pixel format, QVideoFrame::PixelFormat \value UserParameter The base value for platform specific extended parameters. For such parameters the sequential values starting from UserParameter shuld be used. */ /*! \fn bool QCameraViewfinderSettingsControl::isViewfinderParameterSupported(ViewfinderParameter parameter) const Returns true if configuration of viewfinder \a parameter is supported by camera backend. */ /*! \fn QCameraViewfinderSettingsControl::viewfinderParameter(ViewfinderParameter parameter) const Returns the value of viewfinder \a parameter. */ /*! \fn QCameraViewfinderSettingsControl::setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) Set the prefferred \a value of viewfinder \a parameter. Calling this while the camera is active may result in the camera being stopped and reloaded. If video recording is in progress, this call may be ignored. If an unsupported parameter is specified the camera may fail to load, or the setting may be ignored. Viewfinder parameters may also depend on other camera settings, especially in video capture mode. If camera configuration conflicts with viewfinder settings, the camara configuration is usually preferred. */ #include "moc_qcameraviewfindersettingscontrol.cpp" QT_END_NAMESPACE qcameraviewfindersettingscontrol.h000066400000000000000000000060201225012771600363310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAVIEWFINDERSETTINGSCONTROL_H #define QCAMERAVIEWFINDERSETTINGSCONTROL_H #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraViewfinderSettingsControl : public QMediaControl { Q_OBJECT public: enum ViewfinderParameter { Resolution, PixelAspectRatio, MinimumFrameRate, MaximumFrameRate, PixelFormat, UserParameter = 1000 }; ~QCameraViewfinderSettingsControl(); virtual bool isViewfinderParameterSupported(ViewfinderParameter parameter) const = 0; virtual QVariant viewfinderParameter(ViewfinderParameter parameter) const = 0; virtual void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) = 0; protected: QCameraViewfinderSettingsControl(QObject *parent = 0); }; #define QCameraViewfinderSettingsControl_iid "org.qt-project.qt.cameraviewfindersettingscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraViewfinderSettingsControl, QCameraViewfinderSettingsControl_iid) QT_END_NAMESPACE #endif // QCAMERAVIEWFINDERSETTINGSCONTROL_H qcamerazoomcontrol.cpp000066400000000000000000000121101225012771600337220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QCameraZoomControl \brief The QCameraZoomControl class supplies control for optical and digital camera zoom. \inmodule QtMultimedia \ingroup multimedia_control The interface name of QCameraZoomControl is \c org.qt-project.qt.camerazoomcontrol/5.0 as defined in QCameraZoomControl_iid. \sa QMediaService::requestControl(), QCamera */ /*! \macro QCameraZoomControl_iid \c org.qt-project.qt.camerazoomcontrol/5.0 Defines the interface name of the QCameraZoomControl class. \relates QCameraZoomControl */ /*! Constructs a camera zoom control object with \a parent. */ QCameraZoomControl::QCameraZoomControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the camera zoom control object. */ QCameraZoomControl::~QCameraZoomControl() { } /*! \fn qreal QCameraZoomControl::maximumOpticalZoom() const Returns the maximum optical zoom value, or 1.0 if optical zoom is not supported. */ /*! \fn qreal QCameraZoomControl::maximumDigitalZoom() const Returns the maximum digital zoom value, or 1.0 if digital zoom is not supported. */ /*! \fn qreal QCameraZoomControl::requestedOpticalZoom() const Return the requested optical zoom value. */ /*! \fn qreal QCameraZoomControl::requestedDigitalZoom() const Return the requested digital zoom value. */ /*! \fn qreal QCameraZoomControl::currentOpticalZoom() const Return the current optical zoom value. */ /*! \fn qreal QCameraZoomControl::currentDigitalZoom() const Return the current digital zoom value. */ /*! \fn void QCameraZoomControl::zoomTo(qreal optical, qreal digital) Sets \a optical and \a digital zoom values. Zooming can be asynchronous with value changes reported with currentDigitalZoomChanged() and currentOpticalZoomChanged() signals. The backend should expect and correctly handle frequent zoomTo() calls during zoom animations or slider movements. */ /*! \fn void QCameraZoomControl::currentOpticalZoomChanged(qreal zoom) Signal emitted when the current optical \a zoom value changed. */ /*! \fn void QCameraZoomControl::currentDigitalZoomChanged(qreal zoom) Signal emitted when the current digital \a zoom value changed. */ /*! \fn void QCameraZoomControl::requestedOpticalZoomChanged(qreal zoom) Signal emitted when the requested optical \a zoom value changed. */ /*! \fn void QCameraZoomControl::requestedDigitalZoomChanged(qreal zoom) Signal emitted when the requested digital \a zoom value changed. */ /*! \fn void QCameraZoomControl::maximumOpticalZoomChanged(qreal zoom) Signal emitted when the maximum supported optical \a zoom value changed. The maximum supported zoom value can depend on other camera settings, like focusing mode. */ /*! \fn void QCameraZoomControl::maximumDigitalZoomChanged(qreal zoom) Signal emitted when the maximum supported digital \a zoom value changed. The maximum supported zoom value can depend on other camera settings, like capture mode or resolution. */ #include "moc_qcamerazoomcontrol.cpp" QT_END_NAMESPACE qcamerazoomcontrol.h000066400000000000000000000062201225012771600333740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAZOOMCONTROL_H #define QCAMERAZOOMCONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QCameraZoomControl : public QMediaControl { Q_OBJECT public: ~QCameraZoomControl(); virtual qreal maximumOpticalZoom() const = 0; virtual qreal maximumDigitalZoom() const = 0; virtual qreal requestedOpticalZoom() const = 0; virtual qreal requestedDigitalZoom() const = 0; virtual qreal currentOpticalZoom() const = 0; virtual qreal currentDigitalZoom() const = 0; virtual void zoomTo(qreal optical, qreal digital) = 0; Q_SIGNALS: void maximumOpticalZoomChanged(qreal); void maximumDigitalZoomChanged(qreal); void requestedOpticalZoomChanged(qreal opticalZoom); void requestedDigitalZoomChanged(qreal digitalZoom); void currentOpticalZoomChanged(qreal opticalZoom); void currentDigitalZoomChanged(qreal digitalZoom); protected: QCameraZoomControl(QObject* parent = 0); }; #define QCameraZoomControl_iid "org.qt-project.qt.camerazoomcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QCameraZoomControl, QCameraZoomControl_iid) QT_END_NAMESPACE #endif // QCAMERAZOOMCONTROL_H qimageencodercontrol.cpp000066400000000000000000000111641225012771600342170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qimageencodercontrol.h" #include QT_BEGIN_NAMESPACE /*! \class QImageEncoderControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QImageEncoderControl class provides access to the settings of a media service that performs image encoding. If a QMediaService supports encoding image data it will implement QImageEncoderControl. This control allows to \l {setImageSettings()}{set image encoding settings} and provides functions for quering supported image \l {supportedImageCodecs()}{codecs} and \l {supportedResolutions()}{resolutions}. The interface name of QImageEncoderControl is \c org.qt-project.qt.imageencodercontrol/5.0 as defined in QImageEncoderControl_iid. \sa QImageEncoderSettings, QMediaService::requestControl() */ /*! \macro QImageEncoderControl_iid \c org.qt-project.qt.imageencodercontrol/5.0 Defines the interface name of the QImageEncoderControl class. \relates QImageEncoderControl */ /*! Constructs a new image encoder control object with the given \a parent */ QImageEncoderControl::QImageEncoderControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys the image encoder control. */ QImageEncoderControl::~QImageEncoderControl() { } /*! \fn QImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings = QImageEncoderSettings(), bool *continuous = 0) const Returns a list of supported resolutions. If non null image \a settings parameter is passed, the returned list is reduced to resolutions supported with partial settings applied. It can be used to query the list of resolutions, supported by specific image codec. If the encoder supports arbitrary resolutions within the supported resolutions range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ /*! \fn QImageEncoderControl::supportedImageCodecs() const Returns a list of supported image codecs. */ /*! \fn QImageEncoderControl::imageCodecDescription(const QString &codec) const Returns a description of an image \a codec. */ /*! \fn QImageEncoderControl::imageSettings() const Returns the currently used image encoder settings. The returned value may be different tha passed to QImageEncoderControl::setImageSettings() if the settings contains the default or undefined parameters. In this case if the undefined parameters are already resolved, they should be returned. */ /*! \fn QImageEncoderControl::setImageSettings(const QImageEncoderSettings &settings) Sets the selected image encoder \a settings. */ #include "moc_qimageencodercontrol.cpp" QT_END_NAMESPACE qimageencodercontrol.h000066400000000000000000000060701225012771600336640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QIMAGEENCODERCONTROL_H #define QIMAGEENCODERCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QByteArray; class QStringList; QT_END_NAMESPACE QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QImageEncoderControl : public QMediaControl { Q_OBJECT public: virtual ~QImageEncoderControl(); virtual QStringList supportedImageCodecs() const = 0; virtual QString imageCodecDescription(const QString &codecName) const = 0; virtual QList supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const = 0; virtual QImageEncoderSettings imageSettings() const = 0; virtual void setImageSettings(const QImageEncoderSettings &settings) = 0; protected: QImageEncoderControl(QObject *parent = 0); }; #define QImageEncoderControl_iid "org.qt-project.qt.imageencodercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QImageEncoderControl, QImageEncoderControl_iid) QT_END_NAMESPACE #endif qmediaaudioprobecontrol.cpp000066400000000000000000000066551225012771600347370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaaudioprobecontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaAudioProbeControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaAudioProbeControl class allows control over probing audio data in media objects. \l QAudioProbe is the client facing class for probing audio - this class is implemented by media backends to provide this functionality. The interface name of QMediaAudioProbeControl is \c org.qt-project.qt.mediaaudioprobecontrol/5.0 as defined in QMediaAudioProbeControl_iid. \sa QAudioProbe, QMediaService::requestControl(), QMediaPlayer, QCamera */ /*! \macro QMediaAudioProbeControl_iid \c org.qt-project.qt.mediaaudioprobecontrol/5.0 Defines the interface name of the QMediaAudioProbeControl class. \relates QMediaAudioProbeControl */ /*! Create a new media audio probe control object with the given \a parent. */ QMediaAudioProbeControl::QMediaAudioProbeControl(QObject *parent) : QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys this audio probe control */ QMediaAudioProbeControl::~QMediaAudioProbeControl() { } /*! \fn QMediaAudioProbeControl::audioBufferProbed(const QAudioBuffer &buffer) This signal should be emitted when an audio \a buffer is processed in the media service. */ /*! \fn QMediaAudioProbeControl::flush() This signal should be emitted when it is required to release all frames. */ #include "moc_qmediaaudioprobecontrol.cpp" QT_END_NAMESPACE qmediaaudioprobecontrol.h000066400000000000000000000050641225012771600343750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAAUDIOPROBECONTROL_H #define QMEDIAAUDIOPROBECONTROL_H #include QT_BEGIN_NAMESPACE class QAudioBuffer; class Q_MULTIMEDIA_EXPORT QMediaAudioProbeControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaAudioProbeControl(); Q_SIGNALS: void audioBufferProbed(const QAudioBuffer &buffer); void flush(); protected: explicit QMediaAudioProbeControl(QObject *parent = 0); }; #define QMediaAudioProbeControl_iid "org.qt-project.qt.mediaaudioprobecontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaAudioProbeControl, QMediaAudioProbeControl_iid) QT_END_NAMESPACE #endif // QMEDIAAUDIOPROBECONTROL_H qmediaavailabilitycontrol.cpp000066400000000000000000000071501225012771600352470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaavailabilitycontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaAvailabilityControl \brief The QMediaAvailabilityControl class supplies a control for reporting availability of a service. \inmodule QtMultimedia \ingroup multimedia_control An instance of QMediaObject (or its derived classes) can report any changes in availability via this control. The interface name of QMediaAvailabilityControl is \c org.qt-project.qt.mediaavailabilitycontrol/5.0 as defined in QMediaAvailabilityControl_iid. \sa QMediaService::requestControl(), QMediaObject */ /*! \macro QMediaAvailabilityControl_iid \c org.qt-project.qt.mediaavailabilitycontrol/5.0 Defines the interface name of the QMediaAvailabilityControl class. \relates QMediaAvailabilityControl */ /*! Constructs an availability control object with \a parent. */ QMediaAvailabilityControl::QMediaAvailabilityControl(QObject *parent) : QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destruct the availability control object. */ QMediaAvailabilityControl::~QMediaAvailabilityControl() { } /*! \fn QMultimedia::AvailabilityStatus QMediaAvailabilityControl::availability() const Returns the current availability of this instance of the media service. If the availability changes at run time (for example, some other media client takes all media resources) the availabilityChanges() signal should be emitted. */ /*! \fn void QMediaAvailabilityControl::availabilityChanged(QMultimedia::AvailabilityStatus availability) Signal emitted when the current \a availability value changed. */ #include "moc_qmediaavailabilitycontrol.cpp" QT_END_NAMESPACE qmediaavailabilitycontrol.h000066400000000000000000000053511225012771600347150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAAVAILABILITYCONTROL_H #define QMEDIAAVAILABILITYCONTROL_H #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaAvailabilityControl : public QMediaControl { Q_OBJECT public: ~QMediaAvailabilityControl(); virtual QMultimedia::AvailabilityStatus availability() const = 0; Q_SIGNALS: void availabilityChanged(QMultimedia::AvailabilityStatus availability); protected: QMediaAvailabilityControl(QObject* parent = 0); }; #define QMediaAvailabilityControl_iid "org.qt-project.qt.mediaavailabilitycontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaAvailabilityControl, QMediaAvailabilityControl_iid) QT_END_NAMESPACE #endif // QMEDIAAVAILABILITYCONTROL_H qmediacontainercontrol.cpp000066400000000000000000000074221225012771600345610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediacontainercontrol.h" QT_BEGIN_NAMESPACE /*! \class QMediaContainerControl \brief The QMediaContainerControl class provides access to the output container format of a QMediaService \inmodule QtMultimedia \ingroup multimedia_control If a QMediaService supports writing encoded data it will implement QMediaContainerControl. This control provides information about the output containers supported by a media service and allows one to be selected as the current output containers. The functionality provided by this control is exposed to application code through the QMediaRecorder class. The interface name of QMediaContainerControl is \c org.qt-project.qt.mediacontainercontrol/5.0 as defined in QMediaContainerControl_iid. \sa QMediaService::requestControl(), QMediaRecorder */ /*! \macro QMediaContainerControl_iid \c org.qt-project.qt.mediacontainercontrol/5.0 Defines the interface name of the QMediaContainerControl class. \relates QMediaContainerControl */ /*! Constructs a new media container control with the given \a parent. */ QMediaContainerControl::QMediaContainerControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys a media container control. */ QMediaContainerControl::~QMediaContainerControl() { } /*! \fn QMediaContainerControl::supportedContainers() const Returns a list of MIME types of supported container formats. */ /*! \fn QMediaContainerControl::containerFormat() const Returns the selected container format. */ /*! \fn QMediaContainerControl::setContainerFormat(const QString &format) Sets the current container \a format. */ /*! \fn QMediaContainerControl::containerDescription(const QString &format) const Returns a description of the container \a format. */ #include "moc_qmediacontainercontrol.cpp" QT_END_NAMESPACE qmediacontainercontrol.h000066400000000000000000000053501225012771600342240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIACONTAINERCONTROL_H #define QMEDIACONTAINERCONTROL_H #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaContainerControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaContainerControl(); virtual QStringList supportedContainers() const = 0; virtual QString containerFormat() const = 0; virtual void setContainerFormat(const QString &format) = 0; virtual QString containerDescription(const QString &formatMimeType) const = 0; protected: QMediaContainerControl(QObject *parent = 0); }; #define QMediaContainerControl_iid "org.qt-project.qt.mediacontainercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaContainerControl, QMediaContainerControl_iid) QT_END_NAMESPACE #endif // QMEDIACONTAINERCONTROL_H qmediagaplessplaybackcontrol.cpp000066400000000000000000000120331225012771600357360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediagaplessplaybackcontrol.h" #include "qmediacontrol_p.h" /*! \class QMediaGaplessPlaybackControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaGaplessPlaybackControl class provides access to the gapless playback related control of a QMediaService. If a QMediaService supports gapless playback it will implement QMediaGaplessPlaybackControl. This control provides a means to set the \l {setNextMedia()}{next media} or \l {setCrossfadeTime()}{crossfade time} for smooth transitions between tracks. The functionality provided by this control is exposed to application code through the QMediaPlayer class. The interface name of QMediaGaplessPlaybackControl is \c org.qt-project.qt.mediagaplessplaybackcontrol/5.0 as defined in QMediaGaplessPlaybackControl_iid. \sa QMediaService::requestControl(), QMediaPlayer */ /*! \macro QMediaGaplessPlaybackControl_iid \c org.qt-project.qt.mediagaplessplaybackcontrol/5.0 Defines the interface name of the QMediaGaplessPlaybackControl class. \relates QMediaGaplessPlaybackControl */ /*! Destroys a gapless playback control. */ QMediaGaplessPlaybackControl::~QMediaGaplessPlaybackControl() { } /*! Constructs a new gapless playback control with the given \a parent. */ QMediaGaplessPlaybackControl::QMediaGaplessPlaybackControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! \fn QMediaGaplessPlaybackControl::nextMedia() const Returns the content of the next media */ /*! \fn QMediaGaplessPlaybackControl::setNextMedia(const QMediaContent& media) Sets the next \a media for smooth transition. */ /*! \fn QMediaGaplessPlaybackControl::nextMediaChanged(const QMediaContent& media) Signals that the next \a media has changed (either explicitly via \l setNextMedia() or when the player clears the next media while advancing to it). \sa nextMedia() */ /*! \fn QMediaGaplessPlaybackControl::advancedToNextMedia() Signals when the player advances to the next media (the content of next media will be cleared). \sa nextMedia() */ /*! \fn QMediaGaplessPlaybackControl::isCrossfadeSupported() const Indicates whether crossfading is supported or not. If crossfading is not supported, \l setCrossfadeTime() will be ignored and \l crossfadeTime() will always return 0. */ /*! \fn QMediaGaplessPlaybackControl::setCrossfadeTime(qreal crossfadeTime) Sets the \a crossfadeTime in seconds for smooth transition. Positive value means how much time it will take for the next media to transit from silent to full volume and vice versa for current one. So both current and the next one will be playing during this period of time. A crossfade time of zero or negative will result in gapless playback (suitable for some continuous media). */ /*! \fn QMediaGaplessPlaybackControl::crossfadeTime() const Returns current crossfade time in seconds. */ /*! \fn QMediaGaplessPlaybackControl::crossfadeTimeChanged(qreal crossfadeTime) Signals that the \a crossfadeTime has changed. \sa crossfadeTime() */ qmediagaplessplaybackcontrol.h000066400000000000000000000057561225012771600354210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAGAPLESSPLAYBACKCONTROL_H #define QMEDIAGAPLESSPLAYBACKCONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaGaplessPlaybackControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaGaplessPlaybackControl(); virtual QMediaContent nextMedia() const = 0; virtual void setNextMedia(const QMediaContent &media) = 0; virtual bool isCrossfadeSupported() const = 0; virtual qreal crossfadeTime() const = 0; virtual void setCrossfadeTime(qreal crossfadeTime) = 0; Q_SIGNALS: void crossfadeTimeChanged(qreal crossfadeTime); void nextMediaChanged(const QMediaContent& media); void advancedToNextMedia(); protected: QMediaGaplessPlaybackControl(QObject* parent = 0); }; #define QMediaGaplessPlaybackControl_iid "org.qt-project.qt.mediagaplessplaybackcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaGaplessPlaybackControl, QMediaGaplessPlaybackControl_iid) QT_END_NAMESPACE #endif // QMEDIAGAPLESSPLAYBACKCONTROL_H qmedianetworkaccesscontrol.cpp000066400000000000000000000072011225012771600354450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmedianetworkaccesscontrol.h" QT_BEGIN_NAMESPACE /*! \class QMediaNetworkAccessControl \brief The QMediaNetworkAccessControl class allows the setting of the Network Access Point for media related activities. \inmodule QtMultimedia \ingroup multimedia_control The functionality provided by this control allows the setting of a Network Access Point. This control can be used to set a network access for various network related activities. The exact nature is dependent on the underlying usage by the supported QMediaObject. */ /*! \internal */ QMediaNetworkAccessControl::QMediaNetworkAccessControl(QObject *parent) : QMediaControl(parent) { } /*! Destroys a network access control. */ QMediaNetworkAccessControl::~QMediaNetworkAccessControl() { } /*! \fn void QMediaNetworkAccessControl::setConfigurations(const QList &configurations) The \a configurations parameter contains a list of network configurations to be used for network access. It is assumed the list is given in highest to lowest preference order. By calling this function all previous configurations will be invalidated and replaced with the new list. */ /*! \fn QNetworkConfiguration QMediaNetworkAccessControl::currentConfiguration() const Returns the current active configuration in use. A default constructed QNetworkConfigration is returned if no user supplied configuration are in use. */ /*! \fn QMediaNetworkAccessControl::configurationChanged(const QNetworkConfiguration &configuration) This signal is emitted when the current active network configuration changes to \a configuration. */ #include "moc_qmedianetworkaccesscontrol.cpp" QT_END_NAMESPACE qmedianetworkaccesscontrol.h000066400000000000000000000054601225012771600351170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIANETWORKACCESSCONTROL_H #define QMEDIANETWORKACCESSCONTROL_H #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaNetworkAccessControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaNetworkAccessControl(); virtual void setConfigurations(const QList &configuration) = 0; virtual QNetworkConfiguration currentConfiguration() const = 0; Q_SIGNALS: void configurationChanged(const QNetworkConfiguration& configuration); protected: QMediaNetworkAccessControl(QObject *parent = 0); }; #define QMediaNetworkAccessControl_iid "org.qt-project.qt.medianetworkaccesscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaNetworkAccessControl, QMediaNetworkAccessControl_iid) QT_END_NAMESPACE #endif qmediaplayercontrol.cpp000066400000000000000000000232251225012771600340720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplayercontrol.h" #include "qmediacontrol_p.h" #include "qmediaplayer.h" QT_BEGIN_NAMESPACE /*! \class QMediaPlayerControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaPlayerControl class provides access to the media playing functionality of a QMediaService. If a QMediaService can play media is will implement QMediaPlayerControl. This control provides a means to set the \l {setMedia()}{media} to play, \l {play()}{start}, \l {pause()} {pause} and \l {stop()}{stop} playback, \l {setPosition()}{seek}, and control the \l {setVolume()}{volume}. It also provides feedback on the \l {duration()}{duration} of the media, the current \l {position()}{position}, and \l {bufferStatus()}{buffering} progress. The functionality provided by this control is exposed to application code through the QMediaPlayer class. The interface name of QMediaPlayerControl is \c org.qt-project.qt.mediaplayercontrol/5.0 as defined in QMediaPlayerControl_iid. \sa QMediaService::requestControl(), QMediaPlayer */ /*! \macro QMediaPlayerControl_iid \c org.qt-project.qt.mediaplayercontrol/5.0 Defines the interface name of the QMediaPlayerControl class. \relates QMediaPlayerControl */ /*! Destroys a media player control. */ QMediaPlayerControl::~QMediaPlayerControl() { } /*! Constructs a new media player control with the given \a parent. */ QMediaPlayerControl::QMediaPlayerControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! \fn QMediaPlayerControl::state() const Returns the state of a player control. */ /*! \fn QMediaPlayerControl::stateChanged(QMediaPlayer::State state) Signals that the \a state of a player control has changed. \sa state() */ /*! \fn QMediaPlayerControl::mediaStatus() const Returns the status of the current media. */ /*! \fn QMediaPlayerControl::mediaStatusChanged(QMediaPlayer::MediaStatus status) Signals that the \a status of the current media has changed. \sa mediaStatus() */ /*! \fn QMediaPlayerControl::duration() const Returns the duration of the current media in milliseconds. */ /*! \fn QMediaPlayerControl::durationChanged(qint64 duration) Signals that the \a duration of the current media has changed. \sa duration() */ /*! \fn QMediaPlayerControl::position() const Returns the current playback position in milliseconds. */ /*! \fn QMediaPlayerControl::setPosition(qint64 position) Sets the playback \a position of the current media. This will initiate a seek and it may take some time for playback to reach the position set. */ /*! \fn QMediaPlayerControl::positionChanged(qint64 position) Signals the playback \a position has changed. This is only emitted in when there has been a discontinous change in the playback postion, such as a seek or the position being reset. \sa position() */ /*! \fn QMediaPlayerControl::volume() const Returns the audio volume of a player control. */ /*! \fn QMediaPlayerControl::setVolume(int volume) Sets the audio \a volume of a player control. */ /*! \fn QMediaPlayerControl::volumeChanged(int volume) Signals the audio \a volume of a player control has changed. \sa volume() */ /*! \fn QMediaPlayerControl::isMuted() const Returns the mute state of a player control. */ /*! \fn QMediaPlayerControl::setMuted(bool mute) Sets the \a mute state of a player control. */ /*! \fn QMediaPlayerControl::mutedChanged(bool mute) Signals a change in the \a mute status of a player control. \sa isMuted() */ /*! \fn QMediaPlayerControl::bufferStatus() const Returns the buffering progress of the current media. Progress is measured in the percentage of the buffer filled. */ /*! \fn QMediaPlayerControl::bufferStatusChanged(int progress) Signals that buffering \a progress has changed. \sa bufferStatus() */ /*! \fn QMediaPlayerControl::isAudioAvailable() const Identifies if there is audio output available for the current media. Returns true if audio output is available and false otherwise. */ /*! \fn QMediaPlayerControl::audioAvailableChanged(bool audio) Signals that there has been a change in the availability of \a audio output. \sa isAudioAvailable() */ /*! \fn QMediaPlayerControl::isVideoAvailable() const Identifies if there is video output available for the current media. Returns true if video output is available and false otherwise. */ /*! \fn QMediaPlayerControl::videoAvailableChanged(bool video) Signals that there has been a change in the availability of \a video output. \sa isVideoAvailable() */ /*! \fn QMediaPlayerControl::isSeekable() const Identifies if the current media is seekable. Returns true if it possible to seek within the current media, and false otherwise. */ /*! \fn QMediaPlayerControl::seekableChanged(bool seekable) Signals that the \a seekable state of a player control has changed. \sa isSeekable() */ /*! \fn QMediaPlayerControl::availablePlaybackRanges() const Returns a range of times in milliseconds that can be played back. Usually for local files this is a continuous interval equal to [0..duration()] or an empty time range if seeking is not supported, but for network sources it refers to the buffered parts of the media. */ /*! \fn QMediaPlayerControl::availablePlaybackRangesChanged(const QMediaTimeRange &ranges) Signals that the available media playback \a ranges have changed. \sa QMediaPlayerControl::availablePlaybackRanges() */ /*! \fn qreal QMediaPlayerControl::playbackRate() const Returns the rate of playback. */ /*! \fn QMediaPlayerControl::setPlaybackRate(qreal rate) Sets the \a rate of playback. */ /*! \fn QMediaPlayerControl::media() const Returns the current media source. */ /*! \fn QMediaPlayerControl::mediaStream() const Returns the current media stream. This is only a valid if a stream was passed to setMedia(). \sa setMedia() */ /*! \fn QMediaPlayerControl::setMedia(const QMediaContent &media, QIODevice *stream) Sets the current \a media source. If a \a stream is supplied; data will be read from that instead of attempting to resolve the media source. The media source may still be used to supply media information such as mime type. Setting the media to a null QMediaContent will cause the control to discard all information relating to the current media source and to cease all I/O operations related to that media. */ /*! \fn QMediaPlayerControl::mediaChanged(const QMediaContent& content) Signals that the current media \a content has changed. */ /*! \fn QMediaPlayerControl::play() Starts playback of the current media. If successful the player control will immediately enter the \l {QMediaPlayer::PlayingState} {playing} state. \sa state() */ /*! \fn QMediaPlayerControl::pause() Pauses playback of the current media. If sucessful the player control will immediately enter the \l {QMediaPlayer::PausedState} {paused} state. \sa state(), play(), stop() */ /*! \fn QMediaPlayerControl::stop() Stops playback of the current media. If successful the player control will immediately enter the \l {QMediaPlayer::StoppedState} {stopped} state. */ /*! \fn QMediaPlayerControl::error(int error, const QString &errorString) Signals that an \a error has occurred. The \a errorString provides a more detailed explanation. */ /*! \fn QMediaPlayerControl::playbackRateChanged(qreal rate) Signal emitted when playback rate changes to \a rate. */ #include "moc_qmediaplayercontrol.cpp" QT_END_NAMESPACE qmediaplayercontrol.h000066400000000000000000000103051225012771600335320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYERCONTROL_H #define QMEDIAPLAYERCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaPlaylist; class Q_MULTIMEDIA_EXPORT QMediaPlayerControl : public QMediaControl { Q_OBJECT public: ~QMediaPlayerControl(); virtual QMediaPlayer::State state() const = 0; virtual QMediaPlayer::MediaStatus mediaStatus() const = 0; virtual qint64 duration() const = 0; virtual qint64 position() const = 0; virtual void setPosition(qint64 position) = 0; virtual int volume() const = 0; virtual void setVolume(int volume) = 0; virtual bool isMuted() const = 0; virtual void setMuted(bool muted) = 0; virtual int bufferStatus() const = 0; virtual bool isAudioAvailable() const = 0; virtual bool isVideoAvailable() const = 0; virtual bool isSeekable() const = 0; virtual QMediaTimeRange availablePlaybackRanges() const = 0; virtual qreal playbackRate() const = 0; virtual void setPlaybackRate(qreal rate) = 0; virtual QMediaContent media() const = 0; virtual const QIODevice *mediaStream() const = 0; virtual void setMedia(const QMediaContent &media, QIODevice *stream) = 0; virtual void play() = 0; virtual void pause() = 0; virtual void stop() = 0; Q_SIGNALS: void mediaChanged(const QMediaContent& content); void durationChanged(qint64 duration); void positionChanged(qint64 position); void stateChanged(QMediaPlayer::State newState); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void volumeChanged(int volume); void mutedChanged(bool muted); void audioAvailableChanged(bool audioAvailable); void videoAvailableChanged(bool videoAvailable); void bufferStatusChanged(int percentFilled); void seekableChanged(bool); void availablePlaybackRangesChanged(const QMediaTimeRange&); void playbackRateChanged(qreal rate); void error(int error, const QString &errorString); protected: QMediaPlayerControl(QObject* parent = 0); }; #define QMediaPlayerControl_iid "org.qt-project.qt.mediaplayercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaPlayerControl, QMediaPlayerControl_iid) QT_END_NAMESPACE #endif // QMEDIAPLAYERCONTROL_H qmediaplaylistcontrol.cpp000066400000000000000000000131451225012771600344370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylistcontrol_p.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaPlaylistControl \internal \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaPlaylistControl class provides access to the playlist functionality of a QMediaService. If a QMediaService contains an internal playlist it will implement QMediaPlaylistControl. This control provides access to the contents of the \l {playlistProvider()}{playlist}, as well as the \l {currentIndex()}{position} of the current media, and a means of navigating to the \l {next()}{next} and \l {previous()}{previous} media. The functionality provided by the control is exposed to application code through the QMediaPlaylist class. The interface name of QMediaPlaylistControl is \c org.qt-project.qt.mediaplaylistcontrol/5.0 as defined in QMediaPlaylistControl_iid. \sa QMediaService::requestControl(), QMediaPlayer */ /*! \macro QMediaPlaylistControl_iid \c org.qt-project.qt.mediaplaylistcontrol/5.0 Defines the interface name of the QMediaPlaylistControl class. \relates QMediaPlaylistControl */ /*! Create a new playlist control object with the given \a parent. */ QMediaPlaylistControl::QMediaPlaylistControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the playlist control. */ QMediaPlaylistControl::~QMediaPlaylistControl() { } /*! \fn QMediaPlaylistControl::playlistProvider() const Returns the playlist used by this media player. */ /*! \fn QMediaPlaylistControl::setPlaylistProvider(QMediaPlaylistProvider *playlist) Set the playlist of this media player to \a playlist. In many cases it is possible just to use the playlist constructed by player, but sometimes replacing the whole playlist allows to avoid copyting of all the items bettween playlists. Returns true if player can use this passed playlist; otherwise returns false. */ /*! \fn QMediaPlaylistControl::currentIndex() const Returns position of the current media source in the playlist. */ /*! \fn QMediaPlaylistControl::setCurrentIndex(int position) Jump to the item at the given \a position. */ /*! \fn QMediaPlaylistControl::nextIndex(int step) const Returns the index of item, which were current after calling next() \a step times. Returned value depends on the size of playlist, current position and playback mode. \sa QMediaPlaylist::playbackMode */ /*! \fn QMediaPlaylistControl::previousIndex(int step) const Returns the index of item, which were current after calling previous() \a step times. \sa QMediaPlaylist::playbackMode */ /*! \fn QMediaPlaylistControl::next() Moves to the next item in playlist. */ /*! \fn QMediaPlaylistControl::previous() Returns to the previous item in playlist. */ /*! \fn QMediaPlaylistControl::playbackMode() const Returns the playlist navigation mode. \sa QMediaPlaylist::PlaybackMode */ /*! \fn QMediaPlaylistControl::setPlaybackMode(QMediaPlaylist::PlaybackMode mode) Sets the playback \a mode. \sa QMediaPlaylist::PlaybackMode */ /*! \fn QMediaPlaylistControl::playlistProviderChanged() Signal emitted when the playlist provider has changed. */ /*! \fn QMediaPlaylistControl::currentIndexChanged(int position) Signal emitted when the playlist \a position is changed. */ /*! \fn QMediaPlaylistControl::playbackModeChanged(QMediaPlaylist::PlaybackMode mode) Signal emitted when the playback \a mode is changed. */ /*! \fn QMediaPlaylistControl::currentMediaChanged(const QMediaContent& content) Signal emitted when current media changes to \a content. */ #include "moc_qmediaplaylistcontrol_p.cpp" QT_END_NAMESPACE qmediaplaylistcontrol_p.h000066400000000000000000000067671225012771600344370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLISTCONTROL_P_H #define QMEDIAPLAYLISTCONTROL_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include "qmediacontrol.h" #include QT_BEGIN_NAMESPACE class QMediaPlaylistProvider; class Q_MULTIMEDIA_EXPORT QMediaPlaylistControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaPlaylistControl(); virtual QMediaPlaylistProvider* playlistProvider() const = 0; virtual bool setPlaylistProvider(QMediaPlaylistProvider *playlist) = 0; virtual int currentIndex() const = 0; virtual void setCurrentIndex(int position) = 0; virtual int nextIndex(int steps) const = 0; virtual int previousIndex(int steps) const = 0; virtual void next() = 0; virtual void previous() = 0; virtual QMediaPlaylist::PlaybackMode playbackMode() const = 0; virtual void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) = 0; Q_SIGNALS: void playlistProviderChanged(); void currentIndexChanged(int position); void currentMediaChanged(const QMediaContent&); void playbackModeChanged(QMediaPlaylist::PlaybackMode mode); protected: QMediaPlaylistControl(QObject* parent = 0); }; #define QMediaPlaylistControl_iid "org.qt-project.qt.mediaplaylistcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaPlaylistControl, QMediaPlaylistControl_iid) QT_END_NAMESPACE #endif // QMEDIAPLAYLISTCONTROL_P_H qmediaplaylistsourcecontrol.cpp000066400000000000000000000102621225012771600356550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylistsourcecontrol_p.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaPlaylistSourceControl \internal \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaPlaylistSourceControl class provides access to the playlist playback functionality of a QMediaService. This control allows QMediaPlaylist to be passed directly to the service instead of playing media sources one by one. This control should be implemented if backend benefits from knowing the next media source to be played, for example for preloading, cross fading or gap-less playback. If QMediaPlaylistSourceControl is provided, the backend must listen for current playlist item changes to load corresponding media source and advance the playlist with QMediaPlaylist::next() when playback of the current media is finished. The interface name of QMediaPlaylistSourceControl is \c org.qt-project.qt.mediaplaylistsourcecontrol/5.0 as defined in QMediaPlaylistSourceControl_iid. \sa QMediaService::requestControl(), QMediaPlayer */ /*! \macro QMediaPlaylistSourceControl_iid \c org.qt-project.qt.mediaplaylistsourcecontrol/5.0 Defines the interface name of the QMediaPlaylistSourceControl class. \relates QMediaPlaylistSourceControl */ /*! Create a new playlist source control object with the given \a parent. */ QMediaPlaylistSourceControl::QMediaPlaylistSourceControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys the playlist control. */ QMediaPlaylistSourceControl::~QMediaPlaylistSourceControl() { } /*! \fn QMediaPlaylistSourceControl::playlist() const Returns the current playlist. Should return a null pointer if no playlist is assigned. */ /*! \fn QMediaPlaylistSourceControl::setPlaylist(QMediaPlaylist *playlist) Set the playlist of this media player to \a playlist. If a null pointer is passed, the playlist source should be disabled. The current media should be replaced with the current item of the media playlist. */ /*! \fn QMediaPlaylistSourceControl::playlistChanged(QMediaPlaylist* playlist) Signal emitted when the playlist has changed to \a playlist. */ #include "moc_qmediaplaylistsourcecontrol_p.cpp" QT_END_NAMESPACE qmediaplaylistsourcecontrol_p.h000066400000000000000000000056211225012771600356440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLISTSOURCECONTROL_P_H #define QMEDIAPLAYLISTSOURCECONTROL_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE class QMediaPlaylist; class Q_MULTIMEDIA_EXPORT QMediaPlaylistSourceControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaPlaylistSourceControl(); virtual QMediaPlaylist *playlist() const = 0; virtual void setPlaylist(QMediaPlaylist *) = 0; Q_SIGNALS: void playlistChanged(QMediaPlaylist* playlist); protected: QMediaPlaylistSourceControl(QObject* parent = 0); }; #define QMediaPlaylistSourceControl_iid "org.qt-project.qt.mediaplaylistsourcecontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaPlaylistSourceControl, QMediaPlaylistSourceControl_iid) QT_END_NAMESPACE #endif // QMEDIAPLAYLISTCONTROL_P_H qmediarecordercontrol.cpp000066400000000000000000000144701225012771600344050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediarecordercontrol.h" QT_BEGIN_NAMESPACE /*! \class QMediaRecorderControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaRecorderControl class provides access to the recording functionality of a QMediaService. Generally you will use the QMediaRecorder class in application code - this class is mostly used when implementing a new QMediaService or if there is access to specific low level functionality not otherwise present in QMediaRecorder. If a QMediaService can record media it will implement QMediaRecorderControl. This control provides a means to set the \l {outputLocation()}{output location}, and record, pause and stop recording via the \l setState() method. It also provides feedback on the \l {duration()}{duration} of the recording. The interface name of QMediaRecorderControl is \c org.qt-project.qt.mediarecordercontrol/5.0 as defined in QMediaRecorderControl_iid. \sa QMediaService::requestControl(), QMediaRecorder */ /*! \macro QMediaRecorderControl_iid \c org.qt-project.qt.mediarecordercontrol/5.0 Defines the interface name of the QMediaRecorderControl class. \relates QMediaRecorderControl */ /*! Constructs a media recorder control with the given \a parent. */ QMediaRecorderControl::QMediaRecorderControl(QObject* parent) : QMediaControl(parent) { } /*! Destroys a media recorder control. */ QMediaRecorderControl::~QMediaRecorderControl() { } /*! \fn QUrl QMediaRecorderControl::outputLocation() const Returns the current output location being used. */ /*! \fn bool QMediaRecorderControl::setOutputLocation(const QUrl &location) Sets the output \a location and returns if this operation is successful. If file at the output location already exists, it should be overwritten. The \a location can be relative or empty; in this case the service should use the system specific place and file naming scheme. After recording has started, the backend should report the actual file location with actualLocationChanged() signal. */ /*! \fn QMediaRecorder::State QMediaRecorderControl::state() const Return the current recording state. */ /*! \fn QMediaRecorder::Status QMediaRecorderControl::status() const Return the current recording status. */ /*! \fn qint64 QMediaRecorderControl::duration() const Return the current duration in milliseconds. */ /*! \fn void QMediaRecorderControl::setState(QMediaRecorder::State state) Set the media recorder \a state. */ /*! \fn void QMediaRecorderControl::applySettings() Commits the encoder settings and performs pre-initialization to reduce delays when recording is started. */ /*! \fn bool QMediaRecorderControl::isMuted() const Returns true if the recorder is muted, and false if it is not. */ /*! \fn void QMediaRecorderControl::setMuted(bool muted) Sets the \a muted state of a media recorder. */ /*! \fn qreal QMediaRecorderControl::volume() const Returns the linear audio gain of media recorder. */ /*! \fn void QMediaRecorderControl::setVolume(qreal gain) Sets the linear audio \a gain of a media recorder. */ /*! \fn void QMediaRecorderControl::stateChanged(QMediaRecorder::State state) Signals that the \a state of a media recorder has changed. */ /*! \fn void QMediaRecorderControl::statusChanged(QMediaRecorder::Status status) Signals that the \a status of a media recorder has changed. */ /*! \fn void QMediaRecorderControl::durationChanged(qint64 duration) Signals that the \a duration of the recorded media has changed. This only emitted when there is a discontinuous change in the duration such as being reset to 0. */ /*! \fn void QMediaRecorderControl::mutedChanged(bool muted) Signals that the \a muted state of a media recorder has changed. */ /*! \fn void QMediaRecorderControl::volumeChanged(qreal gain) Signals that the audio \a gain value has changed. */ /*! \fn void QMediaRecorderControl::actualLocationChanged(const QUrl &location) Signals that the actual media \a location has changed. This signal should be emitted at start of recording. */ /*! \fn void QMediaRecorderControl::error(int error, const QString &errorString) Signals that an \a error has occurred. The \a errorString describes the error. */ #include "moc_qmediarecordercontrol.cpp" QT_END_NAMESPACE qmediarecordercontrol.h000066400000000000000000000066231225012771600340530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARECORDERCONTROL_H #define QMEDIARECORDERCONTROL_H #include #include QT_BEGIN_NAMESPACE class QUrl; QT_END_NAMESPACE QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaRecorderControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaRecorderControl(); virtual QUrl outputLocation() const = 0; virtual bool setOutputLocation(const QUrl &location) = 0; virtual QMediaRecorder::State state() const = 0; virtual QMediaRecorder::Status status() const = 0; virtual qint64 duration() const = 0; virtual bool isMuted() const = 0; virtual qreal volume() const = 0; virtual void applySettings() = 0; Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void statusChanged(QMediaRecorder::Status status); void durationChanged(qint64 position); void mutedChanged(bool muted); void volumeChanged(qreal volume); void actualLocationChanged(const QUrl &location); void error(int error, const QString &errorString); public Q_SLOTS: virtual void setState(QMediaRecorder::State state) = 0; virtual void setMuted(bool muted) = 0; virtual void setVolume(qreal volume) = 0; protected: QMediaRecorderControl(QObject* parent = 0); }; #define QMediaRecorderControl_iid "org.qt-project.qt.mediarecordercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaRecorderControl, QMediaRecorderControl_iid) QT_END_NAMESPACE #endif qmediastreamscontrol.cpp000066400000000000000000000113161225012771600342520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediastreamscontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE namespace { class QMediaStreamsControlPrivateRegisterMetaTypes { public: QMediaStreamsControlPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QMediaStreamsControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaStreamsControl class provides a media stream selection control. The QMediaStreamsControl class provides descriptions of the available media streams and allows individual streams to be activated and deactivated. The interface name of QMediaStreamsControl is \c org.qt-project.qt.mediastreamscontrol/5.0 as defined in QMediaStreamsControl_iid. \sa QMediaService::requestControl() */ /*! \macro QMediaStreamsControl_iid \c org.qt-project.qt.mediastreamscontrol/5.0 Defines the interface name of the QMediaStreamsControl class. \relates QMediaStreamsControl */ /*! Constructs a new media streams control with the given \a parent. */ QMediaStreamsControl::QMediaStreamsControl(QObject *parent) :QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys a media streams control. */ QMediaStreamsControl::~QMediaStreamsControl() { } /*! \enum QMediaStreamsControl::StreamType Media stream type. \value AudioStream Audio stream. \value VideoStream Video stream. \value SubPictureStream Subpicture or teletext stream. \value UnknownStream The stream type is unknown. \value DataStream */ /*! \fn QMediaStreamsControl::streamCount() Returns the number of media streams. */ /*! \fn QMediaStreamsControl::streamType(int stream) Return the type of a media \a stream. */ /*! \fn QMediaStreamsControl::metaData(int stream, const QString &key) Returns the meta-data value of \a key for a given \a stream. Useful metadata keys are QMediaMetaData::Title, QMediaMetaData::Description and QMediaMetaData::Language. */ /*! \fn QMediaStreamsControl::isActive(int stream) Returns true if the media \a stream is active. */ /*! \fn QMediaStreamsControl::setActive(int stream, bool state) Sets the active \a state of a media \a stream. Setting the active state of a media stream to true will activate it. If any other stream of the same type was previously active it will be deactivated. Setting the active state fo a media stream to false will deactivate it. */ /*! \fn QMediaStreamsControl::streamsChanged() The signal is emitted when the available streams list is changed. */ /*! \fn QMediaStreamsControl::activeStreamsChanged() The signal is emitted when the active streams list is changed. */ #include "moc_qmediastreamscontrol.cpp" QT_END_NAMESPACE qmediastreamscontrol.h000066400000000000000000000062211225012771600337160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIASTREAMSCONTROL_H #define QMEDIASTREAMSCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaStreamsControl : public QMediaControl { Q_OBJECT Q_ENUMS(SteamType) public: enum StreamType { UnknownStream, VideoStream, AudioStream, SubPictureStream, DataStream }; virtual ~QMediaStreamsControl(); virtual int streamCount() = 0; virtual StreamType streamType(int streamNumber) = 0; virtual QVariant metaData(int streamNumber, const QString &key) = 0; virtual bool isActive(int streamNumber) = 0; virtual void setActive(int streamNumber, bool state) = 0; Q_SIGNALS: void streamsChanged(); void activeStreamsChanged(); protected: QMediaStreamsControl(QObject *parent = 0); }; #define QMediaStreamsControl_iid "org.qt-project.qt.mediastreamscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaStreamsControl, QMediaStreamsControl_iid) QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaStreamsControl::StreamType) Q_MEDIA_ENUM_DEBUG(QMediaStreamsControl, StreamType) #endif // QMEDIASTREAMSCONTROL_H qmediavideoprobecontrol.cpp000066400000000000000000000066511225012771600347400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediavideoprobecontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaVideoProbeControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMediaVideoProbeControl class allows control over probing video frames in media objects. \l QVideoProbe is the client facing class for probing video - this class is implemented by media backends to provide this functionality. The interface name of QMediaVideoProbeControl is \c org.qt-project.qt.mediavideoprobecontrol/5.0 as defined in QMediaVideoProbeControl_iid. \sa QVideoProbe, QMediaService::requestControl(), QMediaPlayer, QCamera */ /*! \macro QMediaVideoProbeControl_iid \c org.qt-project.qt.mediavideoprobecontrol/5.0 Defines the interface name of the QMediaVideoProbeControl class. \relates QMediaVideoProbeControl */ /*! Create a new media video probe control object with the given \a parent. */ QMediaVideoProbeControl::QMediaVideoProbeControl(QObject *parent) : QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys this video probe control */ QMediaVideoProbeControl::~QMediaVideoProbeControl() { } /*! \fn QMediaVideoProbeControl::videoFrameProbed(const QVideoFrame &frame) This signal should be emitted when a video \a frame is processed in the media service. */ /*! \fn QMediaVideoProbeControl::flush() This signal should be emitted when it is required to release all frames. */ #include "moc_qmediavideoprobecontrol.cpp" QT_END_NAMESPACE qmediavideoprobecontrol.h000066400000000000000000000050621225012771600344000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAVIDEOPROBECONTROL_H #define QMEDIAVIDEOPROBECONTROL_H #include QT_BEGIN_NAMESPACE class QVideoFrame; class Q_MULTIMEDIA_EXPORT QMediaVideoProbeControl : public QMediaControl { Q_OBJECT public: virtual ~QMediaVideoProbeControl(); Q_SIGNALS: void videoFrameProbed(const QVideoFrame &frame); void flush(); protected: explicit QMediaVideoProbeControl(QObject *parent = 0); }; #define QMediaVideoProbeControl_iid "org.qt-project.qt.mediavideoprobecontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMediaVideoProbeControl, QMediaVideoProbeControl_iid) QT_END_NAMESPACE #endif // QMEDIAVIDEOPROBECONTROL_H qmetadatareadercontrol.cpp000066400000000000000000000114101225012771600345320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediacontrol_p.h" #include QT_BEGIN_NAMESPACE /*! \class QMetaDataReaderControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMetaDataReaderControl class provides read access to the meta-data of a QMediaService's media. If a QMediaService can provide read or write access to the meta-data of its current media it will implement QMetaDataReaderControl. This control provides functions for both retrieving and setting meta-data values. Meta-data may be addressed by the keys defined in the QMediaMetaData namespace. The functionality provided by this control is exposed to application code by the meta-data members of QMediaObject, and so meta-data access is potentially available in any of the media object classes. Any media service may implement QMetaDataReaderControl. The interface name of QMetaDataReaderControl is \c org.qt-project.qt.metadatareadercontrol/5.0 as defined in QMetaDataReaderControl_iid. \sa QMediaService::requestControl(), QMediaObject */ /*! \macro QMetaDataReaderControl_iid \c org.qt-project.qt.metadatareadercontrol/5.0 Defines the interface name of the QMetaDataReaderControl class. \relates QMetaDataReaderControl */ /*! Construct a QMetaDataReaderControl with \a parent. This class is meant as a base class for service specific meta data providers so this constructor is protected. */ QMetaDataReaderControl::QMetaDataReaderControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroy the meta-data object. */ QMetaDataReaderControl::~QMetaDataReaderControl() { } /*! \fn bool QMetaDataReaderControl::isMetaDataAvailable() const Identifies if meta-data is available from a media service. Returns true if the meta-data is available and false otherwise. */ /*! \fn QVariant QMetaDataReaderControl::metaData(const QString &key) const Returns the meta-data for the given \a key. */ /*! \fn QMetaDataReaderControl::availableMetaData() const Returns a list of keys there is meta-data available for. */ /*! \fn void QMetaDataReaderControl::metaDataChanged() Signal the changes of meta-data. If multiple meta-data elements are changed, metaDataChanged(const QString &key, const QVariant &value) signal is emitted for each of them with metaDataChanged() changed emitted once. */ /*! \fn void QMetaDataReaderControl::metaDataChanged(const QString &key, const QVariant &value) Signal the changes of one meta-data element \a value with the given \a key. */ /*! \fn void QMetaDataReaderControl::metaDataAvailableChanged(bool available) Signal the availability of meta-data has changed, \a available will be true if the multimedia object has meta-data. */ #include "moc_qmetadatareadercontrol.cpp" QT_END_NAMESPACE qmetadatareadercontrol.h000066400000000000000000000057071225012771600342130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMETADATAREADERCONTROL_H #define QMETADATAREADERCONTROL_H #include #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMetaDataReaderControl : public QMediaControl { Q_OBJECT public: ~QMetaDataReaderControl(); virtual bool isMetaDataAvailable() const = 0; virtual QVariant metaData(const QString &key) const = 0; virtual QStringList availableMetaData() const = 0; Q_SIGNALS: void metaDataChanged(); void metaDataChanged(const QString &key, const QVariant &value); void metaDataAvailableChanged(bool available); protected: QMetaDataReaderControl(QObject *parent = 0); }; #define QMetaDataReaderControl_iid "org.qt-project.qt.metadatareadercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMetaDataReaderControl, QMetaDataReaderControl_iid) QT_END_NAMESPACE #endif // QMETADATAPROVIDER_H qmetadatawritercontrol.cpp000066400000000000000000000124771225012771600346220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediacontrol_p.h" #include QT_BEGIN_NAMESPACE /*! \class QMetaDataWriterControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QMetaDataWriterControl class provides write access to the meta-data of a QMediaService's media. If a QMediaService can provide write access to the meta-data of its current media it will implement QMetaDataWriterControl. This control provides functions for both retrieving and setting meta-data values. Meta-data may be addressed by the keys defined in the QMediaMetaData namespace. The functionality provided by this control is exposed to application code by the meta-data members of QMediaObject, and so meta-data access is potentially available in any of the media object classes. Any media service may implement QMetaDataControl. The interface name of QMetaDataWriterControl is \c org.qt-project.qt.metadatawritercontrol/5.0 as defined in QMetaDataWriterControl_iid. \sa QMediaService::requestControl(), QMediaObject */ /*! \macro QMetaDataWriterControl_iid \c org.qt-project.qt.metadatawritercontrol/5.0 Defines the interface name of the QMetaDataWriterControl class. \relates QMetaDataWriterControl */ /*! Construct a QMetaDataWriterControl with \a parent. This class is meant as a base class for service specific meta data providers so this constructor is protected. */ QMetaDataWriterControl::QMetaDataWriterControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroy the meta-data writer control. */ QMetaDataWriterControl::~QMetaDataWriterControl() { } /*! \fn bool QMetaDataWriterControl::isMetaDataAvailable() const Identifies if meta-data is available from a media service. Returns true if the meta-data is available and false otherwise. */ /*! \fn bool QMetaDataWriterControl::isWritable() const Identifies if a media service's meta-data can be edited. Returns true if the meta-data is writable and false otherwise. */ /*! \fn QVariant QMetaDataWriterControl::metaData(const QString &key) const Returns the meta-data for the given \a key. */ /*! \fn void QMetaDataWriterControl::setMetaData(const QString &key, const QVariant &value) Sets the \a value of the meta-data element with the given \a key. */ /*! \fn QMetaDataWriterControl::availableMetaData() const Returns a list of keys there is meta-data available for. */ /*! \fn void QMetaDataWriterControl::metaDataChanged() Signal the changes of meta-data. If multiple meta-data elements are changed, metaDataChanged(const QString &key, const QVariant &value) signal is emitted for each of them with metaDataChanged() changed emitted once. */ /*! \fn void QMetaDataWriterControl::metaDataChanged(const QString &key, const QVariant &value) Signal the changes of one meta-data element \a value with the given \a key. */ /*! \fn void QMetaDataWriterControl::metaDataAvailableChanged(bool available) Signal the availability of meta-data has changed, \a available will be true if the multimedia object has meta-data. */ /*! \fn void QMetaDataWriterControl::writableChanged(bool writable) Signal a change in the writable status of meta-data, \a writable will be true if meta-data elements can be added or adjusted. */ #include "moc_qmetadatawritercontrol.cpp" QT_END_NAMESPACE qmetadatawritercontrol.h000066400000000000000000000061161225012771600342600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMETADATAWRITERCONTROL_H #define QMETADATAWRITERCONTROL_H #include #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMetaDataWriterControl : public QMediaControl { Q_OBJECT public: ~QMetaDataWriterControl(); virtual bool isWritable() const = 0; virtual bool isMetaDataAvailable() const = 0; virtual QVariant metaData(const QString &key) const = 0; virtual void setMetaData(const QString &key, const QVariant &value) = 0; virtual QStringList availableMetaData() const = 0; Q_SIGNALS: void metaDataChanged(); void metaDataChanged(const QString &key, const QVariant &value); void writableChanged(bool writable); void metaDataAvailableChanged(bool available); protected: QMetaDataWriterControl(QObject *parent = 0); }; #define QMetaDataWriterControl_iid "org.qt-project.qt.metadatawritercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QMetaDataWriterControl, QMetaDataWriterControl_iid) QT_END_NAMESPACE #endif qradiodatacontrol.cpp000066400000000000000000000120721225012771600335240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qradiodatacontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QRadioDataControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QRadioDataControl class provides access to the RDS functionality of the radio in the QMediaService. The functionality provided by this control is exposed to application code through the QRadioData class. The interface name of QRadioDataControl is \c org.qt-project.qt.radiodatacontrol/5.0 as defined in QRadioDataControl_iid. \sa QMediaService::requestControl(), QRadioData */ /*! \macro QRadioDataControl_iid \c org.qt-project.qt.radiodatacontrol/5.0 Defines the interface name of the QRadioDataControl class. \relates QRadioDataControl */ /*! Constructs a radio data control with the given \a parent. */ QRadioDataControl::QRadioDataControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys a radio data control. */ QRadioDataControl::~QRadioDataControl() { } /*! \fn QRadioData::Error QRadioDataControl::error() const Returns the error state of a radio data. */ /*! \fn QString QRadioDataControl::errorString() const Returns a string describing a radio data's error state. */ /*! \fn void QRadioDataControl::error(QRadioData::Error error) Signals that an \a error has occurred. */ /*! \fn QString QRadioDataControl::stationId() const Returns the current Program Identification */ /*! \fn QRadioData::ProgramType QRadioDataControl::programType() const Returns the current Program Type */ /*! \fn QString QRadioDataControl::programTypeName() const Returns the current Program Type Name */ /*! \fn QString QRadioDataControl::stationName() const Returns the current Program Service */ /*! \fn QString QRadioDataControl::radioText() const Returns the current Radio Text */ /*! \fn void QRadioDataControl::setAlternativeFrequenciesEnabled(bool enabled) Sets the Alternative Frequency to \a enabled */ /*! \fn bool QRadioDataControl::isAlternativeFrequenciesEnabled() const Returns true if Alternative Frequency is currently enabled */ /*! \fn QRadioDataControl::alternativeFrequenciesEnabledChanged(bool enabled) Signals that the alternative frequencies setting has changed to the value of \a enabled. */ /*! \fn void QRadioDataControl::stationIdChanged(QString stationId) Signals that the Program Identification \a stationId has changed */ /*! \fn void QRadioDataControl::programTypeChanged(QRadioData::ProgramType programType) Signals that the Program Type \a programType has changed */ /*! \fn void QRadioDataControl::programTypeNameChanged(QString programTypeName) Signals that the Program Type Name \a programTypeName has changed */ /*! \fn void QRadioDataControl::stationNameChanged(QString stationName) Signals that the Program Service \a stationName has changed */ /*! \fn void QRadioDataControl::radioTextChanged(QString radioText) Signals that the Radio Text \a radioText has changed */ #include "moc_qradiodatacontrol.cpp" QT_END_NAMESPACE qradiodatacontrol.h000066400000000000000000000064421225012771600331750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QRADIODATACONTROL_H #define QRADIODATACONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QRadioDataControl : public QMediaControl { Q_OBJECT public: ~QRadioDataControl(); virtual QString stationId() const = 0; virtual QRadioData::ProgramType programType() const = 0; virtual QString programTypeName() const = 0; virtual QString stationName() const = 0; virtual QString radioText() const = 0; virtual void setAlternativeFrequenciesEnabled(bool enabled) = 0; virtual bool isAlternativeFrequenciesEnabled() const = 0; virtual QRadioData::Error error() const = 0; virtual QString errorString() const = 0; Q_SIGNALS: void stationIdChanged(QString stationId); void programTypeChanged(QRadioData::ProgramType programType); void programTypeNameChanged(QString programTypeName); void stationNameChanged(QString stationName); void radioTextChanged(QString radioText); void alternativeFrequenciesEnabledChanged(bool enabled); void error(QRadioData::Error err); protected: QRadioDataControl(QObject *parent = 0); }; #define QRadioDataControl_iid "org.qt-project.qt.radiodatacontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QRadioDataControl, QRadioDataControl_iid) QT_END_NAMESPACE #endif // QRADIODATACONTROL_H qradiotunercontrol.cpp000066400000000000000000000214441225012771600337530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qradiotunercontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QRadioTunerControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QRadioTunerControl class provides access to the radio tuning functionality of a QMediaService. If a QMediaService can tune an analog radio device it will implement QRadioTunerControl. This control provides a means to tune a radio device to a specific \l {setFrequency()}{frequency} as well as search \l {searchForward()}{forwards} and \l {searchBackward()}{backwards} for a signal. The functionality provided by this control is exposed to application code through the QRadioTuner class. The interface name of QRadioTunerControl is \c org.qt-project.qt.radiotunercontrol/5.0 as defined in QRadioTunerControl_iid. \sa QMediaService::requestControl(), QRadioTuner */ /*! \macro QRadioTunerControl_iid \c org.qt-project.qt.radiotunercontrol/5.0 Defines the interface name of the QRadioTunerControl class. \relates QRadioTunerControl */ /*! Constructs a radio tuner control with the given \a parent. */ QRadioTunerControl::QRadioTunerControl(QObject *parent): QMediaControl(*new QMediaControlPrivate, parent) { } /*! Destroys a radio tuner control. */ QRadioTunerControl::~QRadioTunerControl() { } /*! \fn QRadioTuner::State QRadioTunerControl::state() const Returns the current radio tuner state. */ /*! \fn QRadioTuner::Band QRadioTunerControl::band() const Returns the frequency band a radio tuner is tuned to. */ /*! \fn void QRadioTunerControl::bandChanged(QRadioTuner::Band band) Signals that the frequency \a band a radio tuner is tuned to has changed. */ /*! \fn void QRadioTunerControl::setBand(QRadioTuner::Band band) Sets the frequecy \a band a radio tuner is tuned to. Changing the frequency band will reset the frequency to the minimum frequency of the new band. */ /*! \fn bool QRadioTunerControl::isBandSupported(QRadioTuner::Band band) const Identifies if a frequency \a band is supported. Returns true if the band is supported, and false if it is not. */ /*! \fn int QRadioTunerControl::frequency() const Returns the frequency a radio tuner is tuned to. */ /*! \fn int QRadioTunerControl::frequencyStep(QRadioTuner::Band band) const Returns the number of Hertz to increment the frequency by when stepping through frequencies within a given \a band. */ /*! \fn QPair QRadioTunerControl::frequencyRange(QRadioTuner::Band band) const Returns a frequency \a band's minimum and maximum frequency. */ /*! \fn void QRadioTunerControl::setFrequency(int frequency) Sets the \a frequency a radio tuner is tuned to. */ /*! \fn bool QRadioTunerControl::isStereo() const Identifies if a radio tuner is receiving a stereo signal. Returns true if the tuner is receiving a stereo signal, and false if it is not. */ /*! \fn QRadioTuner::StereoMode QRadioTunerControl::stereoMode() const Returns a radio tuner's stereo mode. \sa QRadioTuner::StereoMode */ /*! \fn void QRadioTunerControl::setStereoMode(QRadioTuner::StereoMode mode) Sets a radio tuner's stereo \a mode. \sa QRadioTuner::StereoMode */ /*! \fn int QRadioTunerControl::signalStrength() const Return a radio tuner's current signal strength as a percentage. */ /*! \fn int QRadioTunerControl::volume() const Returns the volume of a radio tuner's audio output as a percentage. */ /*! \fn void QRadioTunerControl::setVolume(int volume) Sets the percentage \a volume of a radio tuner's audio output. */ /*! \fn bool QRadioTunerControl::isMuted() const Identifies if a radio tuner's audio output is muted. Returns true if the audio is muted, and false if it is not. */ /*! \fn void QRadioTunerControl::setMuted(bool muted) Sets the \a muted state of a radio tuner's audio output. */ /*! \fn bool QRadioTunerControl::isSearching() const Identifies if a radio tuner is currently scanning for signal. Returns true if the tuner is scanning, and false if it is not. */ /*! \fn bool QRadioTunerControl::isAntennaConnected() const Identifies if there is an antenna connected to the device. Returns true if there is a connected antenna, and false otherwise. */ /*! \fn void QRadioTunerControl::searchForward() Starts a forward scan for a signal, starting from the current \l frequency(). */ /*! \fn void QRadioTunerControl::searchBackward() Starts a backwards scan for a signal, starting from the current \l frequency(). */ /*! \fn void QRadioTunerControl::searchAllStations(QRadioTuner::SearchMode searchMode) Starts a scan through the whole frequency band searching all stations with a specific \a searchMode. */ /*! \fn void QRadioTunerControl::cancelSearch() Stops scanning for a signal. */ /*! \fn void QRadioTunerControl::start() Activate the radio device. */ /*! \fn QRadioTunerControl::stop() Deactivate the radio device. */ /*! \fn QRadioTuner::Error QRadioTunerControl::error() const Returns the error state of a radio tuner. */ /*! \fn QString QRadioTunerControl::errorString() const Returns a string describing a radio tuner's error state. */ /*! \fn void QRadioTunerControl::stateChanged(QRadioTuner::State state) Signals that the \a state of a radio tuner has changed. */ /*! \fn void QRadioTunerControl::frequencyChanged(int frequency) Signals that the \a frequency a radio tuner is tuned to has changed. */ /*! \fn void QRadioTunerControl::stereoStatusChanged(bool stereo) Signals that the \a stereo state of a radio tuner has changed. */ /*! \fn void QRadioTunerControl::searchingChanged(bool searching) Signals that the \a searching state of a radio tuner has changed. */ /*! \fn void QRadioTunerControl::signalStrengthChanged(int strength) Signals that the percentage \a strength of the signal received by a radio tuner has changed. */ /*! \fn void QRadioTunerControl::volumeChanged(int volume) Signals that the percentage \a volume of radio tuner's audio output has changed. */ /*! \fn void QRadioTunerControl::mutedChanged(bool muted) Signals that the \a muted state of a radio tuner's audio output has changed. */ /*! \fn void QRadioTunerControl::error(QRadioTuner::Error error) Signals that an \a error has occurred. */ /*! \fn void QRadioTunerControl::stationFound(int frequency, QString stationId) Signals that new station with \a frequency and \a stationId was found when scanning */ /*! \fn void QRadioTunerControl::antennaConnectedChanged(bool connectionStatus) Signals that the antenna has either been connected or disconnected as reflected with the \a connectionStatus. */ #include "moc_qradiotunercontrol.cpp" QT_END_NAMESPACE qradiotunercontrol.h000066400000000000000000000103551225012771600334170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QRADIOTUNERCONTROL_H #define QRADIOTUNERCONTROL_H #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QRadioTunerControl : public QMediaControl { Q_OBJECT public: ~QRadioTunerControl(); virtual QRadioTuner::State state() const = 0; virtual QRadioTuner::Band band() const = 0; virtual void setBand(QRadioTuner::Band b) = 0; virtual bool isBandSupported(QRadioTuner::Band b) const = 0; virtual int frequency() const = 0; virtual int frequencyStep(QRadioTuner::Band b) const = 0; virtual QPair frequencyRange(QRadioTuner::Band b) const = 0; virtual void setFrequency(int frequency) = 0; virtual bool isStereo() const = 0; virtual QRadioTuner::StereoMode stereoMode() const = 0; virtual void setStereoMode(QRadioTuner::StereoMode mode) = 0; virtual int signalStrength() const = 0; virtual int volume() const = 0; virtual void setVolume(int volume) = 0; virtual bool isMuted() const = 0; virtual void setMuted(bool muted) = 0; virtual bool isSearching() const = 0; virtual bool isAntennaConnected() const { return true; } virtual void searchForward() = 0; virtual void searchBackward() = 0; virtual void searchAllStations(QRadioTuner::SearchMode searchMode = QRadioTuner::SearchFast) = 0; virtual void cancelSearch() = 0; virtual void start() = 0; virtual void stop() = 0; virtual QRadioTuner::Error error() const = 0; virtual QString errorString() const = 0; Q_SIGNALS: void stateChanged(QRadioTuner::State state); void bandChanged(QRadioTuner::Band band); void frequencyChanged(int frequency); void stereoStatusChanged(bool stereo); void searchingChanged(bool searching); void signalStrengthChanged(int signalStrength); void volumeChanged(int volume); void mutedChanged(bool muted); void error(QRadioTuner::Error err); void stationFound(int frequency, QString stationId); void antennaConnectedChanged(bool connectionStatus); protected: QRadioTunerControl(QObject *parent = 0); }; #define QRadioTunerControl_iid "org.qt-project.qt.radiotunercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QRadioTunerControl, QRadioTunerControl_iid) QT_END_NAMESPACE #endif // QRADIOTUNERCONTROL_H qvideodeviceselectorcontrol.cpp000066400000000000000000000103451225012771600356240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideodeviceselectorcontrol.h" QT_BEGIN_NAMESPACE /*! \class QVideoDeviceSelectorControl \brief The QVideoDeviceSelectorControl class provides an video device selector media control. \inmodule QtMultimedia \ingroup multimedia_control The QVideoDeviceSelectorControl class provides descriptions of the video devices available on a system and allows one to be selected as the endpoint of a media service. The interface name of QVideoDeviceSelectorControl is \c org.qt-project.qt.videodeviceselectorcontrol/5.0 as defined in QVideoDeviceSelectorControl_iid. */ /*! \macro QVideoDeviceSelectorControl_iid \c org.qt-project.qt.videodeviceselectorcontrol/5.0 Defines the interface name of the QVideoDeviceSelectorControl class. \relates QVideoDeviceSelectorControl */ /*! Constructs a video device selector control with the given \a parent. */ QVideoDeviceSelectorControl::QVideoDeviceSelectorControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys a video device selector control. */ QVideoDeviceSelectorControl::~QVideoDeviceSelectorControl() { } /*! \fn QVideoDeviceSelectorControl::deviceCount() const Returns the number of available video devices; */ /*! \fn QVideoDeviceSelectorControl::deviceName(int index) const Returns the name of the video device at \a index. */ /*! \fn QVideoDeviceSelectorControl::deviceDescription(int index) const Returns a description of the video device at \a index. */ /*! \fn QVideoDeviceSelectorControl::defaultDevice() const Returns the index of the default video device. */ /*! \fn QVideoDeviceSelectorControl::selectedDevice() const Returns the index of the selected video device. */ /*! \fn QVideoDeviceSelectorControl::setSelectedDevice(int index) Sets the selected video device \a index. */ /*! \fn QVideoDeviceSelectorControl::devicesChanged() Signals that the list of available video devices has changed. */ /*! \fn QVideoDeviceSelectorControl::selectedDeviceChanged(int index) Signals that the selected video device \a index has changed. */ /*! \fn QVideoDeviceSelectorControl::selectedDeviceChanged(const QString &name) Signals that the selected video device \a name has changed. */ #include "moc_qvideodeviceselectorcontrol.cpp" QT_END_NAMESPACE qvideodeviceselectorcontrol.h000066400000000000000000000057361225012771600353010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEODEVICESELECTORCONTROL_H #define QVIDEODEVICESELECTORCONTROL_H #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QVideoDeviceSelectorControl : public QMediaControl { Q_OBJECT public: virtual ~QVideoDeviceSelectorControl(); virtual int deviceCount() const = 0; virtual QString deviceName(int index) const = 0; virtual QString deviceDescription(int index) const = 0; virtual int defaultDevice() const = 0; virtual int selectedDevice() const = 0; public Q_SLOTS: virtual void setSelectedDevice(int index) = 0; Q_SIGNALS: void selectedDeviceChanged(int index); void selectedDeviceChanged(const QString &deviceName); void devicesChanged(); protected: QVideoDeviceSelectorControl(QObject *parent = 0); }; #define QVideoDeviceSelectorControl_iid "org.qt-project.qt.videodeviceselectorcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QVideoDeviceSelectorControl, QVideoDeviceSelectorControl_iid) QT_END_NAMESPACE #endif // QVIDEODEVICESELECTORCONTROL_H qvideoencodersettingscontrol.cpp000066400000000000000000000133411225012771600360230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideoencodersettingscontrol.h" #include #include QT_BEGIN_NAMESPACE /*! \class QVideoEncoderSettingsControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QVideoEncoderSettingsControl class provides access to the settings of a media service that performs video encoding. If a QMediaService supports encoding video data it will implement QVideoEncoderSettingsControl. This control provides information about the limits of restricted video encoder options and allows the selection of a set of video encoder settings as specified in a QVideoEncoderSettings object. The functionality provided by this control is exposed to application code through the QMediaRecorder class. The interface name of QVideoEncoderSettingsControl is \c org.qt-project.qt.videoencodersettingscontrol/5.0 as defined in QVideoEncoderSettingsControl_iid. \sa QMediaRecorder, QVideoEncoderSettings, QMediaService::requestControl() */ /*! \macro QVideoEncoderSettingsControl_iid \c org.qt-project.qt.videoencodersettingscontrol/5.0 Defines the interface name of the QVideoEncoderSettingsControl class. \relates QVideoEncoderSettingsControl */ /*! Create a new video encoder settings control object with the given \a parent. */ QVideoEncoderSettingsControl::QVideoEncoderSettingsControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys a video encoder settings control. */ QVideoEncoderSettingsControl::~QVideoEncoderSettingsControl() { } /*! \fn QVideoEncoderSettingsControl::supportedVideoCodecs() const Returns the list of supported video codecs. */ /*! \fn QVideoEncoderSettingsControl::videoCodecDescription(const QString &codec) const Returns a description of a video \a codec. */ /*! \fn QVideoEncoderSettingsControl::supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), bool *continuous = 0) const Returns a list of supported resolutions. If non null video \a settings parameter is passed, the returned list is reduced to resolution supported with partial settings like \l {QVideoEncoderSettings::setCodec()}{video codec} or \l {QVideoEncoderSettings::setFrameRate()}{frame rate} applied. If the encoder supports arbitrary resolutions within the supported resolutions range, *\a continuous is set to true, otherwise *\a continuous is set to false. \sa QVideoEncoderSettings::resolution() */ /*! \fn QVideoEncoderSettingsControl::supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), bool *continuous = 0) const Returns a list of supported frame rates. If non null video \a settings parameter is passed, the returned list is reduced to frame rates supported with partial settings like \l {QVideoEncoderSettings::setCodec()}{video codec} or \l {QVideoEncoderSettings::setResolution()}{video resolution} applied. If the encoder supports arbitrary frame rates within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. \sa QVideoEncoderSettings::frameRate() */ /*! \fn QVideoEncoderSettingsControl::videoSettings() const Returns the video encoder settings. The returned value may be different tha passed to QVideoEncoderSettingsControl::setVideoSettings() if the settings contains the default or undefined parameters. In this case if the undefined parameters are already resolved, they should be returned. */ /*! \fn QVideoEncoderSettingsControl::setVideoSettings(const QVideoEncoderSettings &settings) Sets the selected video encoder \a settings. */ #include "moc_qvideoencodersettingscontrol.cpp" QT_END_NAMESPACE qvideoencodersettingscontrol.h000066400000000000000000000064111225012771600354700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOENCODERSETTINGSCONTROL_H #define QVIDEOENCODERSETTINGSCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QByteArray; class QStringList; QT_END_NAMESPACE QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QVideoEncoderSettingsControl : public QMediaControl { Q_OBJECT public: virtual ~QVideoEncoderSettingsControl(); virtual QList supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const = 0; virtual QList supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const = 0; virtual QStringList supportedVideoCodecs() const = 0; virtual QString videoCodecDescription(const QString &codecName) const = 0; virtual QVideoEncoderSettings videoSettings() const = 0; virtual void setVideoSettings(const QVideoEncoderSettings &settings) = 0; protected: QVideoEncoderSettingsControl(QObject *parent = 0); }; #define QVideoEncoderSettingsControl_iid "org.qt-project.qt.videoencodersettingscontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QVideoEncoderSettingsControl, QVideoEncoderSettingsControl_iid) QT_END_NAMESPACE #endif qvideorenderercontrol.cpp000066400000000000000000000067231225012771600344370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideorenderercontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QVideoRendererControl \inmodule QtMultimedia \brief The QVideoRendererControl class provides a media control for rendering video to a QAbstractVideoSurface. \ingroup multimedia_control Using the surface() property of QVideoRendererControl a QAbstractVideoSurface may be set as the video render target of a QMediaService. \snippet multimedia-snippets/video.cpp Video renderer control QVideoRendererControl is one of a number of possible video output controls. The interface name of QVideoRendererControl is \c org.qt-project.qt.videorenderercontrol/5.0 as defined in QVideoRendererControl_iid. \sa QMediaService::requestControl(), QVideoWidget */ /*! \macro QVideoRendererControl_iid \c org.qt-project.qt.videorenderercontrol/5.0 Defines the interface name of the QVideoRendererControl class. \relates QVideoRendererControl */ /*! Constructs a new video renderer media end point with the given \a parent. */ QVideoRendererControl::QVideoRendererControl(QObject *parent) : QMediaControl(parent) { } /*! Destroys a video renderer media end point. */ QVideoRendererControl::~QVideoRendererControl() { } /*! \fn QVideoRendererControl::surface() const Returns the surface a video producer renders to. */ /*! \fn QVideoRendererControl::setSurface(QAbstractVideoSurface *surface) Sets the \a surface a video producer renders to. */ #include "moc_qvideorenderercontrol.cpp" QT_END_NAMESPACE qvideorenderercontrol.h000066400000000000000000000050751225012771600341030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEORENDERERCONTROL_H #define QVIDEORENDERERCONTROL_H #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class Q_MULTIMEDIA_EXPORT QVideoRendererControl : public QMediaControl { Q_OBJECT public: ~QVideoRendererControl(); virtual QAbstractVideoSurface *surface() const = 0; virtual void setSurface(QAbstractVideoSurface *surface) = 0; protected: QVideoRendererControl(QObject *parent = 0); }; #define QVideoRendererControl_iid "org.qt-project.qt.videorenderercontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QVideoRendererControl, QVideoRendererControl_iid) QT_END_NAMESPACE #endif // QVIDEORENDERERCONTROL_H qvideowindowcontrol.cpp000066400000000000000000000160451225012771600341360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideowindowcontrol.h" QT_BEGIN_NAMESPACE /*! \class QVideoWindowControl \inmodule QtMultimedia \ingroup multimedia_control \brief The QVideoWindowControl class provides a media control for rendering video to a window. The winId() property QVideoWindowControl allows a platform specific window ID to be set as the video render target of a QMediaService. The displayRect() property is used to set the region of the window the video should be rendered to, and the aspectRatioMode() property indicates how the video should be scaled to fit the displayRect(). \snippet multimedia-snippets/video.cpp Video window control QVideoWindowControl is one of a number of possible video output controls. The interface name of QVideoWindowControl is \c org.qt-project.qt.videowindowcontrol/5.0 as defined in QVideoWindowControl_iid. \sa QMediaService::requestControl(), QVideoWidget */ /*! \macro QVideoWindowControl_iid \c org.qt-project.qt.videowindowcontrol/5.0 Defines the interface name of the QVideoWindowControl class. \relates QVideoWindowControl */ /*! Constructs a new video window control with the given \a parent. */ QVideoWindowControl::QVideoWindowControl(QObject *parent) : QMediaControl(parent) { } /*! Destroys a video window control. */ QVideoWindowControl::~QVideoWindowControl() { } /*! \fn QVideoWindowControl::winId() const Returns the ID of the window a video overlay end point renders to. */ /*! \fn QVideoWindowControl::setWinId(WId id) Sets the \a id of the window a video overlay end point renders to. */ /*! \fn QVideoWindowControl::displayRect() const Returns the sub-rect of a window where video is displayed. */ /*! \fn QVideoWindowControl::setDisplayRect(const QRect &rect) Sets the sub-\a rect of a window where video is displayed. */ /*! \fn QVideoWindowControl::isFullScreen() const Identifies if a video overlay is a fullScreen overlay. Returns true if the video overlay is fullScreen, and false otherwise. */ /*! \fn QVideoWindowControl::setFullScreen(bool fullScreen) Sets whether a video overlay is a \a fullScreen overlay. */ /*! \fn QVideoWindowControl::fullScreenChanged(bool fullScreen) Signals that the \a fullScreen state of a video overlay has changed. */ /*! \fn QVideoWindowControl::repaint() Repaints the last frame. */ /*! \fn QVideoWindowControl::nativeSize() const Returns a suggested size for the video display based on the resolution and aspect ratio of the video. */ /*! \fn QVideoWindowControl::nativeSizeChanged() Signals that the native dimensions of the video have changed. */ /*! \fn QVideoWindowControl::aspectRatioMode() const Returns how video is scaled to fit the display region with respect to its aspect ratio. */ /*! \fn QVideoWindowControl::setAspectRatioMode(Qt::AspectRatioMode mode) Sets the aspect ratio \a mode which determines how video is scaled to the fit the display region with respect to its aspect ratio. */ /*! \fn QVideoWindowControl::brightness() const Returns the brightness adjustment applied to a video overlay. Valid brightness values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::setBrightness(int brightness) Sets a \a brightness adjustment for a video overlay. Valid brightness values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::brightnessChanged(int brightness) Signals that a video overlay's \a brightness adjustment has changed. */ /*! \fn QVideoWindowControl::contrast() const Returns the contrast adjustment applied to a video overlay. Valid contrast values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::setContrast(int contrast) Sets the \a contrast adjustment for a video overlay. Valid contrast values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::contrastChanged(int contrast) Signals that a video overlay's \a contrast adjustment has changed. */ /*! \fn QVideoWindowControl::hue() const Returns the hue adjustment applied to a video overlay. Value hue values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::setHue(int hue) Sets a \a hue adjustment for a video overlay. Valid hue values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::hueChanged(int hue) Signals that a video overlay's \a hue adjustment has changed. */ /*! \fn QVideoWindowControl::saturation() const Returns the saturation adjustment applied to a video overlay. Value saturation values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::setSaturation(int saturation) Sets a \a saturation adjustment for a video overlay. Valid saturation values range between -100 and 100, the default is 0. */ /*! \fn QVideoWindowControl::saturationChanged(int saturation) Signals that a video overlay's \a saturation adjustment has changed. */ #include "moc_qvideowindowcontrol.cpp" QT_END_NAMESPACE qvideowindowcontrol.h000066400000000000000000000070471225012771600336050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/controls/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOWINDOWCONTROL_H #define QVIDEOWINDOWCONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QVideoWindowControl : public QMediaControl { Q_OBJECT public: ~QVideoWindowControl(); virtual WId winId() const = 0; virtual void setWinId(WId id) = 0; virtual QRect displayRect() const = 0; virtual void setDisplayRect(const QRect &rect) = 0; virtual bool isFullScreen() const = 0; virtual void setFullScreen(bool fullScreen) = 0; virtual void repaint() = 0; virtual QSize nativeSize() const = 0; virtual Qt::AspectRatioMode aspectRatioMode() const = 0; virtual void setAspectRatioMode(Qt::AspectRatioMode mode) = 0; virtual int brightness() const = 0; virtual void setBrightness(int brightness) = 0; virtual int contrast() const = 0; virtual void setContrast(int contrast) = 0; virtual int hue() const = 0; virtual void setHue(int hue) = 0; virtual int saturation() const = 0; virtual void setSaturation(int saturation) = 0; Q_SIGNALS: void fullScreenChanged(bool fullScreen); void brightnessChanged(int brightness); void contrastChanged(int contrast); void hueChanged(int hue); void saturationChanged(int saturation); void nativeSizeChanged(); protected: QVideoWindowControl(QObject *parent = 0); }; #define QVideoWindowControl_iid "org.qt-project.qt.videowindowcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QVideoWindowControl, QVideoWindowControl_iid) QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/000077500000000000000000000000001225012771600262655ustar00rootroot00000000000000qtmultimedia-dita.qdocconf000066400000000000000000000017301225012771600333430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc# Name of the project. project = Qt Multimedia # Directories in which to search for files to document and images. # By default set to the root directory of the project for sources # and headers and qdoc will therefore generate output for each file. # Images should be placed in /dic/images and examples in # /examples. # Paths are relative to the location of this file. exampledirs += ../src/examples \ ../.. \ ../../examples headerdirs += ../src \ ../../src imagedirs += ../src/images \ sourcedirs += ../src \ ../../src excludedirs += #Do not change the variables after this line unless you know what you are doing. outputdir = ../ditaxml outputformats = DITAXML examples.fileextensions = "*.cpp *.h *.js *.svg *.xml *.ui *.qml" examples.imageextensions = "*.png *.jpeg *.jpg *.gif *.mng" headers.fileextensions = "*.h *.ch *.h++ *.hh *.hpp *.hxx" sources.fileextensions = "*.cpp *.qdoc *.mm *.qml" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/qtmultimedia.qdocconf000066400000000000000000000034211225012771600325020ustar00rootroot00000000000000include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) project = QtMultimedia description = Qt Multimedia Documentation url = http://qt-project.org/doc/qt-$QT_VER/qtmultimedia version = $QT_VERSION # The following parameters are for creating a qhp file, the qhelpgenerator # program can convert the qhp file into a qch file which can be opened in # Qt Assistant and/or Qt Creator. # Defines the name of the project. You cannot use operators (+, =, -) in # the name. Properties for this project are set using a qhp..property # format. qhp.projects = QtMultimedia qhp.QtMultimedia.file = qtmultimedia.qhp qhp.QtMultimedia.namespace = org.qt-project.qtmultimedia.$QT_VERSION_TAG qhp.QtMultimedia.indexTitle = Qt Multimedia qhp.QtMultimedia.virtualFolder = qtmultimedia # For listing child nodes in Qt Creator or Assistant. qhp.QtMultimedia.subprojects = classes qmltypes qhp.QtMultimedia.subprojects.classes.title = C++ Classes qhp.QtMultimedia.subprojects.classes.indexTitle = Qt Multimedia C++ Classes qhp.QtMultimedia.subprojects.classes.selectors = class fake:headerfile qhp.QtMultimedia.subprojects.classes.sortPages = true qhp.QtMultimedia.subprojects.qmltypes.title = QML Types qhp.QtMultimedia.subprojects.qmltypes.indexTitle = Qt Multimedia QML Types qhp.QtMultimedia.subprojects.qmltypes.selectors = fake:qmlclass qhp.QtMultimedia.subprojects.qmltypes.sortPages = true exampledirs += ../../../examples/multimedia \ snippets # Specify example install dir under QT_INSTALL_EXAMPLES examplesinstallpath = multimedia headerdirs += ../.. imagedirs += src/images \ sourcedirs += ../.. excludedirs += ../../multimediawidgets depends += qtcore qtdoc qtquick qtqml qtmultimediawidgets qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/000077500000000000000000000000001225012771600301325ustar00rootroot00000000000000multimedia-snippets/000077500000000000000000000000001225012771600340505ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippetsaudio.cpp000066400000000000000000000166561225012771600356730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* Audio related snippets */ #include #include #include #include "qaudiodeviceinfo.h" #include "qaudioinput.h" #include "qaudiooutput.h" #include "qaudioprobe.h" #include "qaudiodecoder.h" class AudioInputExample : public QObject { Q_OBJECT public: void setup(); public Q_SLOTS: void stopRecording(); void handleStateChanged(QAudio::State newState); private: //! [Audio input class members] QFile destinationFile; // Class member QAudioInput* audio; // Class member //! [Audio input class members] }; void AudioInputExample::setup() //! [Audio input setup] { destinationFile.setFileName("/tmp/test.raw"); destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate ); QAudioFormat format; // Set up the desired format, for example: format.setSampleRate(8000); format.setChannelCount(1); format.setSampleSize(8); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::UnSignedInt); QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); if (!info.isFormatSupported(format)) { qWarning() << "Default format not supported, trying to use the nearest."; format = info.nearestFormat(format); } audio = new QAudioInput(format, this); connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State))); QTimer::singleShot(3000, this, SLOT(stopRecording())); audio->start(&destinationFile); // Records audio for 3000ms } //! [Audio input setup] //! [Audio input stop recording] void AudioInputExample::stopRecording() { audio->stop(); destinationFile.close(); delete audio; } //! [Audio input stop recording] //! [Audio input state changed] void AudioInputExample::handleStateChanged(QAudio::State newState) { switch (newState) { case QAudio::StoppedState: if (audio->error() != QAudio::NoError) { // Error handling } else { // Finished recording } break; case QAudio::ActiveState: // Started recording - read from IO device break; default: // ... other cases as appropriate break; } } //! [Audio input state changed] class AudioOutputExample : public QObject { Q_OBJECT public: void setup(); public Q_SLOTS: void handleStateChanged(QAudio::State newState); private: //! [Audio output class members] QFile sourceFile; // class member. QAudioOutput* audio; // class member. //! [Audio output class members] }; void AudioOutputExample::setup() //! [Audio output setup] { sourceFile.setFileName("/tmp/test.raw"); sourceFile.open(QIODevice::ReadOnly); QAudioFormat format; // Set up the format, eg. format.setSampleRate(8000); format.setChannelCount(1); format.setSampleSize(8); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::UnSignedInt); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) { qWarning() << "Raw audio format not supported by backend, cannot play audio."; return; } audio = new QAudioOutput(format, this); connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State))); audio->start(&sourceFile); } //! [Audio output setup] //! [Audio output state changed] void AudioOutputExample::handleStateChanged(QAudio::State newState) { switch (newState) { case QAudio::IdleState: // Finished playing (no more data) audio->stop(); sourceFile.close(); delete audio; break; case QAudio::StoppedState: // Stopped for other reasons if (audio->error() != QAudio::NoError) { // Error handling } break; default: // ... other cases as appropriate break; } } //! [Audio output state changed] void AudioDeviceInfo() { //! [Setting audio format] QAudioFormat format; format.setSampleRate(44100); // ... other format parameters format.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) format = info.nearestFormat(format); //! [Setting audio format] //! [Dumping audio formats] foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) qDebug() << "Device name: " << deviceInfo.deviceName(); //! [Dumping audio formats] } class AudioDecodingExample : public QObject { Q_OBJECT public: void decode(); public Q_SLOTS: void handleStateChanged(QAudio::State newState); void readBuffer(); }; void AudioDecodingExample::decode() { //! [Local audio decoding] QAudioFormat desiredFormat; desiredFormat.setChannelCount(2); desiredFormat.setCodec("audio/x-raw"); desiredFormat.setSampleType(QAudioFormat::UnSignedInt); desiredFormat.setSampleRate(48000); desiredFormat.setSampleSize(16); QAudioDecoder *decoder = new QAudioDecoder(this); decoder->setAudioFormat(desiredFormat); decoder->setSourceFilename("level1.mp3"); connect(decoder, SIGNAL(bufferReady()), this, SLOT(readBuffer())); decoder->start(); // Now wait for bufferReady() signal and call decoder->read() //! [Local audio decoding] } audiorecorder.cpp000066400000000000000000000151501225012771600374050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "audiorecorder.h" AudioRecorder::AudioRecorder() { //! [create-objs-1] capture = new QAudioRecorder(); //! [create-objs-1] // set a default file capture->setOutputLocation(QUrl("test.raw")); QWidget *window = new QWidget; QGridLayout* layout = new QGridLayout; QLabel* deviceLabel = new QLabel; deviceLabel->setText("Devices"); deviceBox = new QComboBox(this); deviceBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); QLabel* codecLabel = new QLabel; codecLabel->setText("Codecs"); codecsBox = new QComboBox(this); codecsBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); QLabel* qualityLabel = new QLabel; qualityLabel->setText("Quality"); qualityBox = new QComboBox(this); qualityBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); //! [device-list] for(int i = 0; i < audiosource->deviceCount(); i++) deviceBox->addItem(audiosource->name(i)); //! [device-list] //! [codec-list] QStringList codecs = capture->supportedAudioCodecs(); for(int i = 0; i < codecs.count(); i++) codecsBox->addItem(codecs.at(i)); //! [codec-list] qualityBox->addItem("Low"); qualityBox->addItem("Medium"); qualityBox->addItem("High"); connect(capture, SIGNAL(durationChanged(qint64)), this, SLOT(updateProgress(qint64))); connect(capture, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(stateChanged(QMediaRecorder::State))); layout->addWidget(deviceLabel,0,0,Qt::AlignHCenter); connect(deviceBox,SIGNAL(activated(int)),SLOT(deviceChanged(int))); layout->addWidget(deviceBox,0,1,1,3,Qt::AlignLeft); layout->addWidget(codecLabel,1,0,Qt::AlignHCenter); connect(codecsBox,SIGNAL(activated(int)),SLOT(codecChanged(int))); layout->addWidget(codecsBox,1,1,Qt::AlignLeft); layout->addWidget(qualityLabel,1,2,Qt::AlignHCenter); connect(qualityBox,SIGNAL(activated(int)),SLOT(qualityChanged(int))); layout->addWidget(qualityBox,1,3,Qt::AlignLeft); fileButton = new QPushButton(this); fileButton->setText(tr("Output File")); connect(fileButton,SIGNAL(clicked()),SLOT(selectOutputFile())); layout->addWidget(fileButton,3,0,Qt::AlignHCenter); button = new QPushButton(this); button->setText(tr("Record")); connect(button,SIGNAL(clicked()),SLOT(toggleRecord())); layout->addWidget(button,3,3,Qt::AlignHCenter); recTime = new QLabel; recTime->setText("0 sec"); layout->addWidget(recTime,4,0,Qt::AlignHCenter); window->setLayout(layout); setCentralWidget(window); window->show(); active = false; } AudioRecorder::~AudioRecorder() { delete capture; delete audiosource; } void AudioRecorder::updateProgress(qint64 pos) { currentTime = pos; if(currentTime == 0) currentTime = 1; QString text = QString("%1 secs").arg(currentTime/1000); recTime->setText(text); } void AudioRecorder::stateChanged(QMediaRecorder::State state) { qWarning()<<"stateChanged() "<deviceCount(); i++) { if(deviceBox->itemText(idx).compare(audiosource->name(i)) == 0) audiosource->setSelectedDevice(i); } //! [get-device] } void AudioRecorder::codecChanged(int idx) { Q_UNUSED(idx); //capture->setAudioCodec(codecsBox->itemText(idx)); } void AudioRecorder::qualityChanged(int idx) { Q_UNUSED(idx); /* if(capture->audioCodec().compare("audio/pcm") == 0) { if(qualityBox->itemText(idx).compare("Low") == 0) { // 8000Hz mono is 8kbps capture->setAudioBitrate(8); } else if(qualityBox->itemText(idx).compare("Medium") == 0) { // 22050Hz mono is 44.1kbps capture->setAudioBitrate(44); } else if(qualityBox->itemText(idx).compare("High") == 0) { // 44100Hz mono is 88.2kbps capture->setAudioBitrate(88); } } */ } //! [toggle-record] void AudioRecorder::toggleRecord() { if(!active) { recTime->setText("0 sec"); currentTime = 0; capture->record(); button->setText(tr("Stop")); active = true; } else { capture->stop(); button->setText(tr("Record")); active = false; } } //! [toggle-record] void AudioRecorder::selectOutputFile() { QStringList fileNames; QFileDialog dialog(this); dialog.setFileMode(QFileDialog::AnyFile); if (dialog.exec()) fileNames = dialog.selectedFiles(); if(fileNames.size() > 0) capture->setOutputLocation(QUrl(fileNames.first())); } camera.cpp000066400000000000000000000137621225012771600360150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* Camera snippets */ #include "qcamera.h" #include "qcameraviewfinder.h" #include "qmediarecorder.h" #include "qcameraimagecapture.h" #include "qcameraimageprocessing.h" #include "qabstractvideosurface.h" /* Globals so that everything is consistent. */ QCamera *camera = 0; QCameraViewfinder *viewfinder = 0; QMediaRecorder *recorder = 0; QCameraImageCapture *imageCapture = 0; void overview_viewfinder() { //! [Camera overview viewfinder] camera = new QCamera; viewfinder = new QCameraViewfinder; camera->setViewfinder(viewfinder); viewfinder->show(); camera->start(); // to start the viewfinder //! [Camera overview viewfinder] } // -.- class MyVideoSurface : public QAbstractVideoSurface { QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const { Q_UNUSED(handleType); return QList(); } bool present(const QVideoFrame &frame) { Q_UNUSED(frame); return true; } }; void overview_surface() { MyVideoSurface *mySurface; //! [Camera overview surface] camera = new QCamera; mySurface = new MyVideoSurface; camera->setViewfinder(mySurface); camera->start(); // MyVideoSurface::present(..) will be called with viewfinder frames //! [Camera overview surface] } void overview_still() { //! [Camera overview capture] imageCapture = new QCameraImageCapture(camera); camera->setCaptureMode(QCamera::CaptureStillImage); camera->start(); // Viewfinder frames start flowing //on half pressed shutter button camera->searchAndLock(); //on shutter button pressed imageCapture->capture(); //on shutter button released camera->unlock(); //! [Camera overview capture] } void overview_movie() { //! [Camera overview movie] camera = new QCamera; recorder = new QMediaRecorder(camera); camera->setCaptureMode(QCamera::CaptureVideo); camera->start(); //on shutter button pressed recorder->record(); // sometime later, or on another press recorder->stop(); //! [Camera overview movie] } void camera_blah() { //! [Camera] camera = new QCamera; viewfinder = new QCameraViewfinder(); viewfinder->show(); camera->setViewfinder(viewfinder); imageCapture = new QCameraImageCapture(camera); camera->setCaptureMode(QCamera::CaptureStillImage); camera->start(); //! [Camera] //! [Camera keys] //on half pressed shutter button camera->searchAndLock(); //on shutter button pressed imageCapture->capture(); //on shutter button released camera->unlock(); //! [Camera keys] } void cameraimageprocessing() { //! [Camera image whitebalance] camera = new QCamera; QCameraImageProcessing *imageProcessing = camera->imageProcessing(); if (imageProcessing->isAvailable()) { imageProcessing->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceFluorescent); } //! [Camera image whitebalance] //! [Camera image denoising] imageProcessing->setDenoisingLevel(-0.3); //reduce the amount of denoising applied //! [Camera image denoising] } void camerafocus() { //! [Camera custom zoom] QCameraFocus *focus = camera->focus(); focus->setFocusPointMode(QCameraFocus::FocusPointCustom); focus->setCustomFocusPoint(QPointF(0.25f, 0.75f)); // A point near the bottom left, 25% away from the corner, near that shiny vase //! [Camera custom zoom] //! [Camera combined zoom] focus->zoomTo(3.0, 4.0); // Super zoom! //! [Camera combined zoom] //! [Camera focus zones] focus->setFocusPointMode(QCameraFocus::FocusPointAuto); QList zones = focus->focusZones(); foreach (QCameraFocusZone zone, zones) { if (zone.status() == QCameraFocusZone::Focused) { // Draw a green box at zone.area() } else if (zone.status() == QCameraFocusZone::Selected) { // This area is selected for autofocusing, but is not in focus // Draw a yellow box at zone.area() } } //! [Camera focus zones] } media.cpp000066400000000000000000000224371225012771600356430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* Media related snippets */ #include #include #include "qmediaplaylist.h" #include "qmediarecorder.h" #include "qmediaservice.h" #include "qmediaplayercontrol.h" #include "qmediaplayer.h" #include "qradiotuner.h" #include "qradiodata.h" #include "qvideowidget.h" #include "qcameraimagecapture.h" #include "qcamera.h" #include "qcameraviewfinder.h" #include "qaudioprobe.h" #include "qaudiorecorder.h" #include "qvideoprobe.h" class MediaExample : public QObject { Q_OBJECT void MediaControl(); void MediaPlayer(); void RadioTuna(); void MediaRecorder(); void AudioRecorder(); void EncoderSettings(); void ImageEncoderSettings(); void AudioProbe(); void VideoProbe(); private: // Common naming QMediaService *mediaService; QVideoWidget *videoWidget; QWidget *widget; QMediaPlayer *player; QMediaPlaylist *playlist; QMediaContent video; QMediaRecorder *recorder; QCamera *camera; QCameraViewfinder *viewfinder; QCameraImageCapture *imageCapture; QString fileName; QRadioTuner *radio; QRadioData *radioData; QAudioRecorder *audioRecorder; QAudioProbe *audioProbe; QVideoProbe *videoProbe; QMediaContent image1; QMediaContent image2; QMediaContent image3; static const int yourRadioStationFrequency = 11; }; void MediaExample::MediaControl() { { //! [Request control] QMediaPlayerControl *control = qobject_cast( mediaService->requestControl("org.qt-project.qt.mediaplayercontrol/5.0")); //! [Request control] Q_UNUSED(control); } { //! [Request control templated] QMediaPlayerControl *control = mediaService->requestControl(); //! [Request control templated] Q_UNUSED(control); } } void MediaExample::EncoderSettings() { //! [Audio encoder settings] QAudioEncoderSettings audioSettings; audioSettings.setCodec("audio/mpeg"); audioSettings.setChannelCount(2); recorder->setAudioSettings(audioSettings); //! [Audio encoder settings] //! [Video encoder settings] QVideoEncoderSettings videoSettings; videoSettings.setCodec("video/mpeg2"); videoSettings.setResolution(640, 480); recorder->setVideoSettings(videoSettings); //! [Video encoder settings] } void MediaExample::ImageEncoderSettings() { //! [Image encoder settings] QImageEncoderSettings imageSettings; imageSettings.setCodec("image/jpeg"); imageSettings.setResolution(1600, 1200); imageCapture->setEncodingSettings(imageSettings); //! [Image encoder settings] } void MediaExample::MediaPlayer() { //! [Player] player = new QMediaPlayer; connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); player->setVolume(50); player->play(); //! [Player] //! [Local playback] player = new QMediaPlayer; // ... player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); player->setVolume(50); player->play(); //! [Local playback] //! [Audio playlist] player = new QMediaPlayer; playlist = new QMediaPlaylist(player); playlist->addMedia(QUrl("http://example.com/myfile1.mp3")); playlist->addMedia(QUrl("http://example.com/myfile2.mp3")); // ... playlist->setCurrentIndex(1); player->play(); //! [Audio playlist] //! [Movie playlist] playlist = new QMediaPlaylist; playlist->addMedia(QUrl("http://example.com/movie1.mp4")); playlist->addMedia(QUrl("http://example.com/movie2.mp4")); playlist->addMedia(QUrl("http://example.com/movie3.mp4")); playlist->setCurrentIndex(1); player = new QMediaPlayer; player->setPlaylist(playlist); videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); videoWidget->show(); player->play(); //! [Movie playlist] } void MediaExample::MediaRecorder() { //! [Media recorder] recorder = new QMediaRecorder(camera); QAudioEncoderSettings audioSettings; audioSettings.setCodec("audio/amr"); audioSettings.setQuality(QMultimedia::HighQuality); recorder->setAudioSettings(audioSettings); recorder->setOutputLocation(QUrl::fromLocalFile(fileName)); recorder->record(); //! [Media recorder] } void MediaExample::AudioRecorder() { //! [Audio recorder] audioRecorder = new QAudioRecorder; QAudioEncoderSettings audioSettings; audioSettings.setCodec("audio/amr"); audioSettings.setQuality(QMultimedia::HighQuality); audioRecorder->setEncodingSettings(audioSettings); audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr")); audioRecorder->record(); //! [Audio recorder] //! [Audio recorder inputs] QStringList inputs = audioRecorder->audioInputs(); QString selectedInput = audioRecorder->defaultAudioInput(); foreach (QString input, inputs) { QString description = audioRecorder->audioInputDescription(input); // show descriptions to user and allow selection selectedInput = input; } audioRecorder->setAudioInput(selectedInput); //! [Audio recorder inputs] } void MediaExample::RadioTuna() { //! [Radio tuner] radio = new QRadioTuner; connect(radio, SIGNAL(frequencyChanged(int)), this, SLOT(freqChanged(int))); if (radio->isBandSupported(QRadioTuner::FM)) { radio->setBand(QRadioTuner::FM); radio->setFrequency(yourRadioStationFrequency); radio->setVolume(100); radio->start(); } //! [Radio tuner] //! [Radio data setup] radio = new QRadioTuner; radioData = radio->radioData(); //! [Radio data setup] } void MediaExample::AudioProbe() { //! [Audio probe] audioRecorder = new QAudioRecorder; QAudioEncoderSettings audioSettings; audioSettings.setCodec("audio/amr"); audioSettings.setQuality(QMultimedia::HighQuality); audioRecorder->setEncodingSettings(audioSettings); audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr")); audioProbe = new QAudioProbe(this); if (audioProbe->setSource(audioRecorder)) { // Probing succeeded, audioProbe->isValid() should be true. connect(audioProbe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(calculateLevel(QAudioBuffer))); } audioRecorder->record(); // Now audio buffers being recorded should be signaled // by the probe, so we can do things like calculating the // audio power level, or performing a frequency transform //! [Audio probe] } void MediaExample::VideoProbe() { //! [Video probe] camera = new QCamera; viewfinder = new QCameraViewfinder(); camera->setViewfinder(viewfinder); camera->setCaptureMode(QCamera::CaptureVideo); videoProbe = new QVideoProbe(this); if (videoProbe->setSource(camera)) { // Probing succeeded, videoProbe->isValid() should be true. connect(videoProbe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(detectBarcodes(QVideoFrame))); } camera->start(); // Viewfinder frames should now also be emitted by // the video probe, even in still image capture mode. // Another alternative is to install the probe on a // QMediaRecorder connected to the camera to get the // recorded frames, if they are different from the // viewfinder frames. //! [Video probe] } multimedia-snippets.pro000066400000000000000000000010201225012771600405600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets# Doc snippets - compiled for truthiness TEMPLATE = lib TARGET = qtmmksnippets INCLUDEPATH += ../../../../src/global \ ../../../../src/multimedia \ ../../../../src/multimedia/audio \ ../../../../src/multimedia/video \ ../../../../src/multimedia/camera CONFIG += console QT += multimedia multimediawidgets widgets multimedia-private SOURCES += \ audio.cpp \ video.cpp \ camera.cpp \ media.cpp \ qsound.cpp OTHER_FILES += \ soundeffect.qml qsound.cpp000066400000000000000000000055201225012771600360670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qobject.h" #include "qsound.h" #include "qsoundeffect.h" void qsoundsnippet() { //! [0] QSound::play("mysounds/bells.wav"); //! [0] //! [1] QSound bells("mysounds/bells.wav"); bells.play(); //! [1] } void qsoundeffectsnippet() { //! [2] QSoundEffect effect; effect.setSource(QUrl::fromLocalFile("engine.wav")); effect.setLoopCount(QSoundEffect::Infinite); effect.setVolume(0.25f); effect.play(); //! [2] } QObject *clickSource; class MyGame : public QObject { Q_OBJECT public: //! [3] MyGame() : m_explosion(this) { m_explosion.setSource(QUrl::fromLocalFile("explosion.wav")); m_explosion.setVolume(0.25f); // Set up click handling etc. connect(clickSource, SIGNAL(clicked()), &m_explosion, SLOT(play())); } private: QSoundEffect m_explosion; //! [3] }; soundeffect.qml000066400000000000000000000045071225012771600370760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [complete snippet] import QtQuick 2.0 import QtMultimedia 5.0 Text { text: "Click Me!"; font.pointSize: 24; width: 150; height: 50; //! [play sound on click] SoundEffect { id: playSound source: "soundeffect.wav" } MouseArea { id: playArea anchors.fill: parent onPressed: { playSound.play() } } //! [play sound on click] } //! [complete snippet] video.cpp000066400000000000000000000136421225012771600356700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/multimedia-snippets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* Video related snippets */ #include "qvideorenderercontrol.h" #include "qmediaservice.h" #include "qmediaplayer.h" #include "qabstractvideosurface.h" #include "qvideowidgetcontrol.h" #include "qvideowindowcontrol.h" #include "qgraphicsvideoitem.h" #include "qmediaplaylist.h" #include "qvideosurfaceformat.h" #include #include //! [Derived Surface] class MyVideoSurface : public QAbstractVideoSurface { QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const { Q_UNUSED(handleType); // Return the formats you will support return QList() << QVideoFrame::Format_RGB565; } bool present(const QVideoFrame &frame) { Q_UNUSED(frame); // Handle the frame and do your processing return true; } }; //! [Derived Surface] //! [Video producer] class MyVideoProducer : public QObject { Q_OBJECT Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface) public: QAbstractVideoSurface* videoSurface() const { return m_surface; } void setVideoSurface(QAbstractVideoSurface *surface) { if (m_surface != surface && m_surface && m_surface->isActive()) { m_surface->stop(); } m_surface = surface; if (m_surface) m_surface->start(m_format); } // ... public slots: void onNewVideoContentReceived(const QVideoFrame &frame) { if (m_surface) m_surface->present(frame); } private: QAbstractVideoSurface *m_surface; QVideoSurfaceFormat m_format; }; //! [Video producer] class VideoExample : public QObject { Q_OBJECT public: void VideoGraphicsItem(); void VideoRendererControl(); void VideoWidget(); void VideoWindowControl(); void VideoWidgetControl(); private: // Common naming QMediaService *mediaService; QMediaPlaylist *playlist; QVideoWidget *videoWidget; QWidget *widget; QFormLayout *layout; QAbstractVideoSurface *myVideoSurface; QMediaPlayer *player; QMediaContent video; QGraphicsView *graphicsView; }; void VideoExample::VideoRendererControl() { //! [Video renderer control] QVideoRendererControl *rendererControl = mediaService->requestControl(); rendererControl->setSurface(myVideoSurface); //! [Video renderer control] } void VideoExample::VideoWidget() { //! [Video widget] player = new QMediaPlayer; playlist = new QMediaPlaylist(player); playlist->addMedia(QUrl("http://example.com/myclip1.mp4")); playlist->addMedia(QUrl("http://example.com/myclip2.mp4")); videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); videoWidget->show(); playlist->setCurrentIndex(1); player->play(); //! [Video widget] player->stop(); //! [Setting surface in player] player->setVideoOutput(myVideoSurface); //! [Setting surface in player] } void VideoExample::VideoWidgetControl() { //! [Video widget control] QVideoWidgetControl *widgetControl = mediaService->requestControl(); layout->addWidget(widgetControl->videoWidget()); //! [Video widget control] } void VideoExample::VideoWindowControl() { //! [Video window control] QVideoWindowControl *windowControl = mediaService->requestControl(); windowControl->setWinId(widget->winId()); windowControl->setDisplayRect(widget->rect()); windowControl->setAspectRatioMode(Qt::KeepAspectRatio); //! [Video window control] } void VideoExample::VideoGraphicsItem() { //! [Video graphics item] player = new QMediaPlayer(this); QGraphicsVideoItem *item = new QGraphicsVideoItem; player->setVideoOutput(item); graphicsView->scene()->addItem(item); graphicsView->show(); player->setMedia(QUrl("http://example.com/myclip4.ogv")); player->play(); //! [Video graphics item] } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/snippets/snippets.pro000066400000000000000000000000631225012771600325200ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += multimedia-snippets qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/000077500000000000000000000000001225012771600270545ustar00rootroot00000000000000audioengineoverview.qdoc000066400000000000000000000050171225012771600337260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page audioengineoverview.html \title Positional Audio \brief 3D positional audio playback and content management \section1 QtAudioEngine Features Qt Multimedia includes the \c QtAudioEngine QML module for providing 3D positional audio playback and content management. QtAudioEngine enables developers to organize wave files into discrete \l Sound with different \l {PlayVariation}{play variations}, group sound controls by \l {AudioCategory} categories and define \l {AttenuationModelLinear}{attenuation models} and various 3d audio settings all in one place. Playback of \l {SoundInstance}{sound instances} can be conveniently activated by in-app events and managed by QtAudioEngine or controlled by explicitly defining \l SoundInstance for easier QML bindings. To access these QML types import the \b{QtAudioEngine 1.0} module. \qml import QtQuick 2.0 import QtAudioEngine 1.0 AudioEngine { //... } \endqml \section1 Examples \list \li \l {AudioEngine Example}{Audio Engine} \endlist \section1 Reference Documentation \section2 QML Types \list \li \l AudioEngine \li \l AudioSample \li \l AudioCategory \li \l AttenuationModelLinear \li \l AttenuationModelInverse \li \l Sound \li \l PlayVariation \li \l AudioListener \li \l SoundInstance \endlist */ audiooverview.qdoc000066400000000000000000000143551225012771600325450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page audiooverview.html \title Audio Overview \brief Audio playback, recording and processing \section1 Audio Features Qt Multimedia offers a range of audio classes, covering both low and high level approaches to audio input, output and processing. In addition to traditional audio usage, the \l {Positional Audio}{Qt AudioEngine} QML types offer high level 3D positional audio for QML applications. See that documentation for more information. \section1 Audio Implementation Details \section2 Playing Compressed Audio For playing media or audio files that are not simple, uncompressed audio, you can use the \l QMediaPlayer C++ class, or the \l {Audio} and \l {MediaPlayer} QML types. The QMediaPlayer class and associated QML types are also capable of playing \l{multimedia-playing-video}{video}, if required. The compressed audio formats supported does depend on the operating system environment, and also what media plugins the user may have installed. Here is how you play a local file using C++: \snippet multimedia-snippets/media.cpp Local playback You can also put files (even remote URLs) into a playlist: \snippet multimedia-snippets/media.cpp Audio playlist \section2 Recording Audio to a File For recording audio to a file, the \l {QAudioRecorder} class allows you to compress audio data from an input device and record it. \snippet multimedia-snippets/media.cpp Audio recorder \section2 Low Latency Sound Effects In addition to the raw access to sound devices described above, the QSoundEffect class (and \l {SoundEffect} QML type) offers a slightly higher level way to play sounds. These classes allow you to specify a WAV format file which can then be played with low latency when necessary. Both QSoundEffect and SoundEffect have essentially the same API. You can adjust the number of \l {QSoundEffect::loopCount()}{loops} a sound effect is played, as well as the \l {QSoundEffect::setVolume()}{volume} (or \l {QSoundEffect::setMuted()}{muting}) of the effect. For older, Qt 4.x based applications \l QSound is also available. Applications are recommended to use QSoundEffect where possible. \section2 Monitoring Audio Data During Playback or Recording The \l QAudioProbe class allows you to monitor audio data being played or recorded in the higher level classes like \l QMediaPlayer, \l QCamera and \l QAudioRecorder. After creating your high level class, you can simply set the source of the probe to your class, and receive audio buffers as they are processed. This is useful for several audio processing tasks, particularly for visualization or adjusting gain. You cannot modify the buffers, and they may arrive at a slightly different time than the media pipeline processes them. Here's an example of installing a probe during recording: \snippet multimedia-snippets/media.cpp Audio probe \section2 Low Level Audio Playback and Recording Qt Multimedia offers classes for raw access to audio input and output facilities, allowing applications to receive raw data from devices like microphones, and to write raw data to speakers or other devices. Generally these classes do not do any audio decoding, or other processing, but they can support different types of raw audio data. The QAudioOutput class offers raw audio data output, while QAudioInput offers raw audio data input. Both classes have adjustable buffers and latency, so they are suitable for both low latency use cases (like games or VOIP) and high latency (like music playback). The available hardware determines what audio outputs and inputs are available. \section3 Push and Pull The low level audio classes can operate in two modes - \c push and \c pull. In \c pull mode, the audio device is started by giving it a QIODevice. For an output device, the QAudioOutput class will pull data from the QIODevice (using \l QIODevice::read()) when more audio data is required. Conversely, for \c pull mode with QAudioInput, when audio data is available then the data will be written directly to the QIODevice. In \c push mode, the audio device provides a QIODevice instance that can be written or read to as needed. Typically this results in simpler code but more buffering, which may affect latency. \section2 Decoding Compressed Audio to Memory In some cases you may want to decode a compressed audio file and do further processing yourself (like mix multiple samples, or some custom digital signal processing algorithms). Qt Multimedia 5.0 offers a preliminary API for this case - the \l QAudioDecoder class. QAudioDecoder supports decoding local files or from a QIODevice instances. Here's an example of decoding a local file: \snippet multimedia-snippets/audio.cpp Local audio decoding Note: This API is preliminary at this time - the API may change or be removed before the final 5.0 release. \section1 Examples There are both C++ and QML examples available. \section2 C++ Examples \annotatedlist audio_examples \section1 Reference Documentation \section2 C++ Classes \annotatedlist multimedia_audio \section2 QML Types \annotatedlist multimedia_audio_qml */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/blackberry.qdoc000066400000000000000000000100701225012771600320420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page blackberry.html \title BlackBerry \brief Platform notes for the BlackBerry Platform Qt Multimedia supports BlackBerry devices that run the BB10 operating system. This page covers the availibility of different features on BB10. \section1 Implementation BB10 ships with a few different multimedia libraries. The main library for audio and video playback is \e mmrenderer. For low-latency output of raw audio samples, \e libasound, a variant of the Linux ALSA library, is available. Finally, for three-dimensional positional audio playback, \e OpenAL is supported and present on BB10. The Qt Multimedia BlackBerry backend uses mmrenderer for media playback. For the positional audio classes in the \l {Positional Audio} {QtAudioEngine} QML module, OpenAL is used as on all other platforms. For recording videos and taking photos, the camapi library is used. \section1 Supported Features Playback of audio and video with QMediaPlayer and related classes is supported. This includes the corresponding QML elements like MediaPlayer and VideoOutput. Since the playback is delegated to mmrenderer, the supported formats are the same as in mmrenderer. As mmrenderer supports streaming from HTTP and other URLs, this is supported in QMediaPlayer as well. Playlists as sources are also supported. mmrenderer does not allow access to the pixel data of video frames, hence Qt Multimedia classes like QVideoFrame and QAbstractVideoSurface will not work since they require access to the image data. QVideoWidget and the VideoOutput QML element are implemented with an overlay window; mmrenderer creates a seperate window displaying a video and puts that on top of the Qt application. As a consequence, no other widget or QML element can be put on top of the video, and QML shaders have no effect. The \l {Positional Audio} {QtAudioEngine} QML module is fully supported, as it is based on OpenAL which is available in BB10. The \l {camera} {QCamera} support includes recording of videos and taking photos. The viewfinder is available through QCameraViewfinder and the VideoOutput QML element. Note: To use the camera on BB10, your application needs the 'access_shared', 'use_camera' and 'record_audio' permissions set in the bar-descriptor.xml file. \section1 Unsupported Features Low-latency output and input of raw audio samples with QAudioOutput, QAudioInput and related classes is not yet supported. The SoundEffect QML element and QSoundEffect are based on these classes. In your QML file, use the MediaPlayer element instead of the SoundEffect element, as the APIs are nearly identical. QMediaPlayer does not support QIODevice-based streaming sources. However, streaming by specifying, for example, an HTTP URL as the source does work. In addition, QMediaPlayer does not yet provide metadata like the artist and album of the current track. Radio and audio recording are not yet supported. */ cameraoverview.qdoc000066400000000000000000000274041225012771600326730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page cameraoverview.html \title Camera Overview \brief Camera viewfinder, still image capture, and video recording. The Qt Multimedia API provides a number of camera related classes, so you can access images and videos from mobile device cameras or webcameras. There are both C++ and QML APIs for common tasks. \section1 Camera Features In order to use the camera classes a quick overview of the way a camera works is needed. If you're already familiar with this, you can skip ahead to \l {camera-tldr}{Camera implementation details}. \section2 The Lens Assembly At one end of the camera assembly is the lens assembly (one or more lenses, arranged to focus light onto the sensor). The lenses themselves can sometimes be moved to adjust things like focus and zoom, or they might be fixed in an arrangement to give a good balance between objects in focus, and cost. Some lens assemblies can automatically be adjusted so that an object at different distances from the camera can be kept in focus. This is usually done by measuring how sharp a particular area of the frame is, and by adjusting the lens assembly until it is maximally sharp. In some cases the camera will always use the center of the frame for this. Other cameras may also allow the region to focus to be specified (for "touch to zoom", or "face zoom" features). \section2 The Sensor Once light arrives at the sensor, it gets converted into digital pixels. This process can depend on a number of things but ultimately comes down to two things - how long the conversion is allowed to take, and how bright the light is. The longer a conversion can take, the better the quality. Using a flash can assist with letting more light hit the sensor, allowing it to convert pixels faster, giving better quality for the same amount of time. Conversely, allowing a longer conversion time can let you take photos in darker environments, as long as the camera is steady. \section2 Image Processing After the image has been captured by the sensor, the camera firmware performs various image processing tasks on it to compensate for various sensor characteristics, current lighting, and desired image properties. Faster sensor pixel conversion times tend to introduce digital noise, so some amount of image processing can be done to remove this based on the camera sensor settings. The color of the image can also be adjusted at this stage to compensate for different light sources - fluorescent lights and sunlight give very different appearances to the same object, so the image can be adjusted based on the white balance of the picture (due to the different color temperatures of the light sources). Some forms of "special effects" can also be performed at this stage. Black and white, sepia, or "negative" style images can be produced. \section2 Recording for Posterity Finally, once a perfectly focused, exposed and processed image has been created, it can be put to good use. Camera images can be further processed by application code (for example, to detect barcodes, or to stitch together a panoramic image), or saved to a common format like JPEG, or used to create a movie. Many of these tasks have classes to assist them. \target camera-tldr \section1 Camera Implementation Details \section2 Viewfinder While not strictly necessary, it's often useful to be able to see what the camera is pointing at. Most digital cameras allow an image feed from the camera sensor at a lower resolution (usually up to the size of the display of the camera) so you can compose a photo or video, and then switch to a slower but higher resolution mode for capturing the image. Depending on whether you're using QML or C++, you can do this in multiple ways. In QML, you can use \l Camera and \l VideoOutput together to show a simple viewfinder: \qml import QtQuick 2.0 import QtMultimedia 5.0 VideoOutput { source: camera Camera { id: camera // You can adjust various settings in here } } \endqml In C++, your choice depends on whether you are using widgets, or QGraphicsView. The \l QVideoWidget class is used in the widgets case, and \l QGraphicsVideoItem is useful for QGraphicsView. \snippet multimedia-snippets/camera.cpp Camera overview viewfinder For advanced usage (like processing viewfinder frames as they come, to detect objects or patterns), you can also derive from \l QAbstractVideoSurface and set that as the viewfinder for the QCamera object. In this case you will need to render the viewfinder image yourself. \snippet multimedia-snippets/camera.cpp Camera overview surface \section2 Still Images After setting up a viewfinder and finding something photogenic, to capture an image we need to initialize a new QCameraImageCapture object. All that is then needed is to start the camera, lock it so that things are in focus and the settings are not different from the viewfinder while the image capture occurs, capture the image, and finally unlock the camera ready for the next photo. \snippet multimedia-snippets/camera.cpp Camera overview capture \section2 Movies Previously we saw code that allowed the capture of a still image. Recording video requires the use of a \l QMediaRecorder object. To record video we need to create a camera object as before but this time as well as creating a viewfinder, we will also initialize a media recorder object. \snippet multimedia-snippets/camera.cpp Camera overview movie Signals from the \e mediaRecorder can be connected to slots to react to changes in the state of the recorder or error events. Recording itself starts with the \l {QMediaRecorder::record()}{record()} function of mediaRecorder being called, this causes the signal \l {QMediaRecorder::stateChanged()}{stateChanged()} to be emitted. The recording process can be changed with the \l {QMediaRecorder::record()}{record()}, \l {QMediaRecorder::stop()}{stop()} and \l {QMediaRecorder::setMuted()}{setMuted()} slots in \l QMediaRecorder. \section2 Controlling the Imaging Pipeline Now that the basics of capturing images or movies are covered, there are a number of ways to control the imaging pipeline to implement some interesting techniques. As explained earlier, several physical and electronic elements combine to determine the final images, and you can control them with different classes. \section3 Focus and Zoom Focusing (and zoom) is managed primarily by the \l QCameraFocus class. QCameraFocus allows the developer to set the general policy by means of the enums for the \l {QCameraFocus::FocusMode}{FocusMode} and the \l {QCameraFocus::FocusPointMode}{FocusPointMode}. \l {QCameraFocus::FocusMode}{FocusMode} deals with settings such as \l {QCameraFocus::FocusMode}{AutoFocus}, \l {QCameraFocus::FocusMode}{ContinuousFocus} and \l {QCameraFocus::FocusMode}{InfinityFocus}, whereas \l {QCameraFocus::FocusMode}{FocusPointMode} deals with the various focus zones within the view that are used for autofocus modes. \l {QCameraFocus::FocusMode}{FocusPointMode} has support for face recognition (where the camera supports it), center focus and a custom focus where the focus point can be specified. For camera hardware that supports it, \l {QCameraFocus::FocusMode}{Macro focus} allows imaging of things that are close to the sensor. This is useful in applications like barcode recognition, or business card scanning. In addition to focus, QCameraFocus allows you to control any available optical or digital zoom. In general, optical zoom is higher quality, but more expensive to manufacture, so the available zoom range might be limited (or fixed to unity). \section3 Exposure, Aperture, Shutter Speed and Flash There are a number of settings that affect the amount of light that hits the camera sensor, and hence the quality of the resulting image. The \l QCameraExposure class allows you to adjust these settings. You can use this class to implement some techniques like High Dynamic Range (HDR) photos by locking the exposure parameters (with \l {QCamera::searchAndLock()}), or motion blur by setting slow shutter speeds with small apertures. The main settings for automatic image taking are the \l {QCameraExposure::ExposureMode}{exposure mode} and \l {QCameraExposure::FlashMode}{flash mode}. Several other settings (aperture, ISO setting, shutter speed) are usually managed automatically but can also be overridden if desired. You can also adjust the \l {QCameraExposure::meteringMode()} to control which parts of the camera frame to measure exposure at. Some camera implementations also allow you to specify a specific point that should be used for exposure metering - this is useful if you can let the user touch or click on an interesting part of the viewfinder, and then use this point so that the image exposure is best at that point. Finally, you can control the flash hardware (if present) using this class. In some cases the hardware may also double as a torch (typically when the flash is LED based, rather than a xenon or other bulb). See also \l {Torch} for an easy to use API for torch functionality. \target camera_image_processing \section3 Image Processing The QCameraImageProcessing class lets you adjust the image processing part of the pipeline. This includes the \l {QCameraImageProcessing::WhiteBalanceMode}{white balance} (or color temperature), \l {QCameraImageProcessing::contrast()}{contrast}, \l {QCameraImageProcessing::saturation()}{saturation}, \l {QCameraImageProcessing::setSharpeningLevel()}{sharpening} and \l {QCameraImageProcessing::setDenoisingLevel()}{denoising}. Most cameras support automatic settings for all of these, so you shouldn't need to adjust them unless the user wants a specific setting. If you're taking a series of images (for example, to stitch them together for a panoramic image), you should lock the image processing settings so that all the images taken appear similar with \e {QCamera::lock(QCamera::LockWhiteBalance)}/ \section3 Canceling Asynchronous Operations Various operations such as image capture and auto focusing occur asynchrously. These operations can often be canceled by the start of a new operation as long as this is supported by the camera. For image capture, the operation can be canceled by calling \l {QCameraImageCapture::cancelCapture()}{cancelCapture()}. For AutoFocus, autoexposure or white balance cancellation can be done by calling \e {QCamera::unlock(QCamera::LockFocus)}. \section1 Examples There are both C++ and QML examples available. \section2 C++ Examples \annotatedlist camera_examples \section2 QML Examples \annotatedlist camera_examples_qml \section1 Reference Documentation \section2 C++ Classes \annotatedlist multimedia_camera \section2 QML Types \annotatedlist camera_qml */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/changes.qdoc000066400000000000000000000136121225012771600313370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page changes.html \title Changes in Qt Multimedia \brief A description of changes in this version of Qt Multimedia The Qt Multimedia module in Qt 5 combines (and replaces) two older modules, namely the Qt Multimedia module from Qt 4.x, and Qt Multimedia Kit module from Qt Mobility. Existing code that uses Qt Multimedia from Qt 4 can be ported with minimal effort, but porting code that uses Qt Multimedia Kit may be a more involved process. The \l {changed features} section highlights changes relevant to porting. Also, note that widget-based classes, such as \l QVideoWidget, are now in a separate module called Qt Multimedia Widgets. \section1 New features in Qt 5.0 There are a number of new features in Qt Multimedia: \list \li Expanded QML API \li In addition to the \l Video QML type, there is now the option of using \l MediaPlayer and \l VideoOutput together \li QML \l Torch class \li New \l QAudioRecorder class \li Volume support for QAudioOutput and QAudioInput \li More examples and documentation \li QSound moved from Qt GUI to Qt Multimedia \li QSoundEffect available to C++ now, as well as QML \li FM Radio Data System classes and types now available (\l QRadioData, \l RadioData) \li Various other API improvements and bugfixes \endlist \section1 Removed features A number of classes or features previously offered in Qt Multimedia or Qt Multimedia Kit have been removed. \table 70% \header \li Removed feature \li Notes \row \li QMediaImageViewer \li This class (and related controls and services) were removed since their functionality was not suitable for many applications \endtable \section1 Changed features A number of classes previously offered in Qt Multimedia or Qt Multimedia Kit have changed in ways that may affect previously written code. This table highlights such changes. \table 70% \header \li Changed feature \li Notes \row \li \c qmake project file changes \li Previously, to use Qt Multimedia Kit, the \c qmake project file must contain \code CONFIG += mobility MOBILITY += multimedia \endcode Now, you only need to write \code QT += multimedia \endcode Or, if you want to use the widget classes, \code QT += multimedia multimediawidgets \endcode \row \li Namespaces \li The \c QtMultimediaKit namespace has been renamed to QMultimedia. This affects a few enumerations, namely \c SupportEstimate, \c EncodingQuality, \c EncodingMode and \c AvailabilityStatus. Searching and replacing \c QtMultimediaKit with \c QMultimedia will greatly aid porting efforts. Metadata have been split off into their own namespace, QMediaMetaData. \row \li Metadata types \li In Qt Multimedia Kit, pre-defined metadata keys were enumerations in the \c QtMultimediaKit namespace. These pre-defined keys have been changed to string literals in the \c QMediaMetaData namespace, for consistency with extended keys. \row \li Metadata accessor methods \li In Qt Multimedia Kit, there were two different families of methods to access metadata. Functions such as \c QMediaObject::metaData() operated on pre-defined metadata using enumerated keys, while functions such as \c QMediaObject::extendedMetaData() operated on extended metadata using string keys. Qt 5 combines both families into one (e.g. QMediaObject::metaData()), which can operate on both pre-defined and extended metadata, using string keys. \row \li Qt Metatype registration \li Qt 5 registers many more classes and types with the meta-object system than before. If you have previously applied Q_DECLARE_METATYPE macros to any Qt Multimedia class, you will probably need to remove them. \row \li QSoundEffect availability \li The SoundEffect QML type was publically accessible in Qt Multimeda Kit, and now the C++ version is officially public too. If your code contains the previously undocumented QSoundEffect, you may need to update it. \row \li Camera controls \li A large number of the camera controls (QCameraImageProcessingControl, QCameraFocusControl, etc.) have been updated to address a number of design flaws. In particular, a number of discrete accessor methods have been collapsed into parametrized methods, and the ranges or data types of some parameters have been adjusted. \endtable */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/classic.css000066400000000000000000000074531225012771600312200ustar00rootroot00000000000000BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { font-family: Arial, Geneva, Helvetica, sans-serif; } H1 { text-align: center; font-size: 160%; } H2 { font-size: 120%; } H3 { font-size: 100%; } h3.fn,span.fn { background-color: #eee; border-width: 1px; border-style: solid; border-color: #ddd; font-weight: bold; padding: 6px 0px 6px 10px; margin: 42px 0px 0px 0px; } hr { border: 0; color: #a0a0a0; background-color: #ccc; height: 1px; width: 100%; text-align: left; margin: 34px 0px 34px 0px; } table.valuelist { border-width: 1px 1px 1px 1px; border-style: solid; border-color: #dddddd; border-collapse: collapse; background-color: #f0f0f0; } table.indextable { border-width: 1px 1px 1px 1px; border-style: solid; border-collapse: collapse; background-color: #f0f0f0; border-color:#555; font-size: 100%; } table td.largeindex { border-width: 1px 1px 1px 1px; border-collapse: collapse; background-color: #f0f0f0; border-color:#555; font-size: 120%; } table.valuelist th { border-width: 1px 1px 1px 2px; padding: 4px; border-style: solid; border-color: #666; color:white; background-color:#666; } th.titleheader { border-width: 1px 0px 1px 0px; padding: 2px; border-style: solid; border-color: #666; color:white; background-color:#555; background-image:url('images/gradient.png')}; background-repeat: repeat-x; font-size: 100%; } th.largeheader { border-width: 1px 0px 1px 0px; padding: 4px; border-style: solid; border-color: #444; color:white; background-color:#555555; font-size: 120%; } p { margin-left: 4px; margin-top: 8px; margin-bottom: 8px; } a:link { color: #0046ad; text-decoration: none } a:visited { color: #672967; text-decoration: none } a.obsolete { color: #661100; text-decoration: none } a.compat { color: #661100; text-decoration: none } a.obsolete:visited { color: #995500; text-decoration: none } a.compat:visited { color: #995500; text-decoration: none } body { background: #ffffff; color: black } table.generic, table.annotated { border-width: 1px; border-color:#bbb; border-style:solid; border-collapse:collapse; } table td.memItemLeft { width: 180px; padding: 2px 0px 0px 8px; margin: 4px; border-width: 1px; border-color: #E0E0E0; border-style: none; font-size: 100%; white-space: nowrap } table td.memItemRight { padding: 2px 8px 0px 8px; margin: 4px; border-width: 1px; border-color: #E0E0E0; border-style: none; font-size: 100%; } table tr.odd { background: #f0f0f0; color: black; } table tr.even { background: #e4e4e4; color: black; } table.annotated th { padding: 3px; text-align: left } table.annotated td { padding: 3px; } table tr pre { padding-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; border: none; background: none } tr.qt-style { background: #96E066; color: black } body pre { padding: 0.2em; border: #e7e7e7 1px solid; background: #f1f1f1; color: black } table tr.qt-code pre { padding: 0.2em; border: #e7e7e7 1px solid; background: #f1f1f1; color: black } span.preprocessor, span.preprocessor a { color: darkblue; } span.comment { color: darkred; font-style: italic } span.string,span.char { color: darkgreen; } .title { text-align: center } .subtitle { font-size: 0.8em } .small-subtitle { font-size: 0.65em } .qmlitem { padding: 0; } .qmlname { white-space: nowrap; } .qmltype { text-align: center; font-size: 160%; } .qmlproto { background-color: #eee; border-width: 1px; border-style: solid; border-color: #ddd; font-weight: bold; padding: 6px 10px 6px 10px; margin: 42px 0px 0px 0px; } .qmlreadonly { float: right; color: red } .qmldoc { } *.qmlitem p { } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/examples/000077500000000000000000000000001225012771600306725ustar00rootroot00000000000000video-qml-paint-rate.qdocinc000066400000000000000000000023001225012771600361070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/examplesThe QML painting rate is calculated by the FrequencyMonitor class, which turns a stream of events (received via the notify() slot), into an instantaneous and an averaged frequency: \quotefromfile multimedia/video/snippets/frequencymonitor/frequencymonitor.h \skipto class FrequencyMonitor : public QObject \printuntil Q_OBJECT \skipto Q_PROPERTY(qreal instantaneousFrequency \printuntil averageFrequencyChanged) \skipto public \printuntil : \dots \skipto static void qmlRegisterType \printuntil ; \skipto public slots \printuntil notify(); \skipto }; \printline }; The FrequencyMonitor class is exposed to QML like this \quotefromfile multimedia/video/snippets/frequencymonitor/frequencymonitordeclarative.cpp \skipto FrequencyMonitor::qmlRegisterType \printuntil } and its data is displayed by defining a QML item called FrequencyItem, like this: \quotefromfile multimedia/video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml \skipto import FrequencyMonitor \printuntil id: root \dots \skipto function notify \printuntil id: monitor \skipto onAverageFrequencyChanged \printuntil { \skipto averageFrequencyText \printuntil /^\}/ The result looks like this: \image video-qml-paint-rate.png qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/images/000077500000000000000000000000001225012771600303215ustar00rootroot00000000000000annotatedurl.png000066400000000000000000001163011225012771600334520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/images‰PNG  IHDRXmÛ9_sRGB®ÎébKGDÿÿÿ ½§“ pHYsMœÞöœWtIMEÚ 1ûµÿ[tEXtCommentCreated with GIMPW IDATxÚì½{¼eYUßûcε×>§«ª›î¤¤  â«õc„/¢(äŠàAyøÁ›1>> šñÞ€—ðúäæŠƒ!^¸QñÊÕ 6´Æ Ê„UÕUçì½×šsÜ?æ˜s­S]]uª»«“³ü´tUïµæ\cÍǘcü~¿!×>æ ö‰ü7ÞðI®ƒëà:¸®ƒëà:¸®{~©™1Ž›K\×Áup\×ÁupÝ[€ˆXâà:¸®ƒëà:¸®ƒëÞs°ìÀ ×Áup\×Áup\÷¦ƒÕ-"ª¬ƒëà:¸®ƒëà:¸®{ë’E¿eã°!çtæú?Ùÿ$Ø)±/)¿3ªË–÷Ó lŠ¥ùÏå5üfwÙÞÿªþWù”?íéC}’M°»°„JFD°¬†íëMìy`Ï{ØóÀžÿ3ÛÓ{‡£ÛSN±AµgÌÀP Á8uŸÖ™= Ëá^°§N–ŠÀ8kªþu„Ñ O°ž=#Ì~Þ^ òçÁF ‡¸.7Dÿím¶÷ÿM,€ ‘È8o!øoR¹gͦFÛÇë 2Òib„!°I›½x»™$,‰i`œ¿`X@bÇtÚ‘9"Ô¡Ùþ,RŽjøGŸiÌ´Šê±½8‚ø³K7„)šfjX®¨vÕöXÁf=­£Ä»WºäÿmyeEÈmÊž—V¿7#(YÌûäm×çj™–ý¯êÿ™?°ç=´§¯4–ìy`Ï{Øó¯¥=瞦 `SÉ$ÁP2ù{ŠÛ³¶’…ö†Åžî°ª–ånØSü™†‰{fsgbrhâçI XócŠûãž—,l4²È™MÈÍ©Z·Aë¤;a“ãâæËÅÂA!åžêÊÕ¾…œËH 1’Æ‘cTH–Ò³’õäUK€XlÒÌóSwøìÎVû£ã/06D¹4²·GÆ™C)DTlm eQ0C$#‰P>Y±yùC;‚“é,Q,âk¼uÔHóÛË`3rëU@DYÀ‚B1E1˜¦&PLRóò¥öш¡mšp™¦ŽºAËû &†˜z?eòîë»[y~®§+DAÈ ’9°ç=¶gYxL ÉÓ2w`Ï{ØóÀžÿ=Ú¡Øê.ì †ŠÇÓ¤¸SŠ·\žfÎX¶â@fÄÌßsrîª=1›ËÓìGäé]Í.•Òê@(Ï3È–ŠC&FˆdÝ™‰ŒšèÇë¸f1.дf¥ YHÒ³”‘œ#›0¢ÉH,XæÙ2°Qˆ&¤‘Œ’Q¢Bro&š¡’ÉôÀ@ÎÂH”%°Ærq¦³¿WÄȹüÛ¨F2#È‚ »ˆD‚ŽŒ ’j $¥8" Ói,N^ì!­…^`ÈKL2•MÀRq¦b9ôXÛ¸Ça‹c6b,£Â¦.%ÏüÛrÂ,ŽV˜jîÿŠÅˆÍ§3?ˆ;ÚFDÈ A¤LX±„"!,#B"Ê@½·/•lE%À\îNVQižþž ge™ÿIåbøûWÇ_ËâæXTÔŸ˜Ü Z>N K™t*÷ОÜÉž:;vΞ¸=EömO»“=FFHR‘;ÙÓD¹ÙSKhZÊG$‘ý¤Úìi znöœ†étÆ;Õžõ¤¬"³³ëÜž f÷Š=ÇÉbÍž#â ÝéÇgÀÈ"ä<_Hƒ›Þâ|ÙSæ ‘ÈdÏ)ñs0ßïÎ|?u|Øón{âö,I<ñ`HY+„€©Líc˜{^bÞ®€1É%2fæéXŠw²g>%D&íÛLNrYkÊ»¤²Ù—5ö¬Ÿ5õk&tb$]Ù° 8˜Ð#¡¤Ûrz²f#%º”Åè-° #Ø ™Èš•,è,a,YÊ PÖ( |ìD0Y’dE¤ŒM(c̨‘£5г]²e»$„¾¤NÃH'K"b»-¨ #= "‰D¯°a¤—Þ‡Ö¡|÷ÐcŒ˜%’®èè5‚¬Øôé­$3×$zƒ  D;)ß%›¢¤2¨Ä|«•vJQñ§IêæÍCÂYÊŠþÙ³ÅÂS4õ˜³ù¤›òÓe)a\üä#ž“®!ßQF¬m¯ÅÙpçáLódœ ¢+‹Cö`niß"Ór2ðÐlËÛ[éH&“Po¹N±ìX V!+ƒVñgÞ={Ö|­øÂ‡LSALÊÖßvËú Œd ä’«—êxÌÛŸ?¥­² îmËÜéª?`³¶|aö³g»SÒ4™si§ÞcVÚ11?1æâ¼Hn_P¬X¶Œ½|¡RòlAm:íæš A±ƒù~æû=ì9·§º=í{âö4·'~h*G­Pœƒ™=m†-ÃÓiZ×_ý(ïé@k)ɚέöL-bXíYÖú,FM¨¶5Á,ƒ†4Bì+èÖ–XHBY`ž®[DQ ïLjH‡‘Y—¤!["Ɇ2¦èéXaI–t¶bW`iÊJ"½/ld×}Ìžž k`kYÍÒxî`Yd!æ­nèéI£ ½ÉFFKzTœ!:†ÓBl’I’è­#‘é@v‰D’§8E"X¤gmk„Î{&Õn‰Xït^¨ÙX)úXnT‘)[+Ó)‘«C buÛtϼ |•(κ¬Îƒ•ߡő5CÔ7­¬í¿«h9á[yNÚÄE$”ߊ9hÒ|"Š´Áª~Ò©ñ ™…‡ëÉfú»ê\„æ„Ë(bp(uQ1Š{%er¨ÖA{îö ,7̃yxXüþ —² ˆ¨ Ùö´ÅYÚ2õ÷)mQqóðþ¬-iÖ«÷xA´.2J¥Ž¯<ÙYdvzc–F?}•¾¨U¡6s‡ç4mù EÛ9nþE¬Êsä4Ï)mçö,7ò)ý”fŸ»´Ãì;©ÿ2zž‹=Õli|ÎÑ$y6m´=˜ïç<ß›Kà‡{ØÓ껳=³c¥ÄíYßý®íi§ØÓW‘0_-ÚArBºMQ¯D."™âiÅaõ_íY'¥½,”e‚¬‚f [cdW 0ŽB,yf]AÞ0Ò¡‚ %5ÊÉÕFP:‹ !m@Hbɶ`i0à6 F—" ƈ&J!öX]­wW_é"QaXJ‰  jti$JÇ #šK ¤HOdŠÓ+’-XæŽAw@Ì%kz]2ä‘Nµdl`‰‚ö›¼ —„12j¢DcoJXRrh`DñpgΆª6°]‹>˜€–m¹ ®‚3.ZNÜeHûgO˜j6ÐcdÙC²Q’Ïí[ÉË×I¤e&¹—(qƲE‰”Pªy~¶°+ ³Ü6u<Ò!6ƒùÙl°VÀ ¼VÏXª³€™Ô³Ô,_^r¿J4ånÛÓ_àVþÔ°{ë¦;GˆoÜy>ž¿¶BûïvÚ{‚ßcí䆔ð{=ey4ý”þÍð¾8¢êØL;k[ó>îݳÙ>ûlåtë9S?-ËYŸiؽò›;ÙS±¼¿ñ‰`¹œ˜M|‘Õ™;˜ï÷`¾{ÄZMÑp`Ï{îÇžp3s{Òì9¾ŸÎžÌ÷s{bÁñ\î2ZM fF8­=KÊ„œ³Ë4©GðGT µˆ„zl]c²txWqål4$;m²Ñc3 }ôe* 5²­U¬€¾EìÇltZ£÷Àè®bÝq‹¤¥4‡QòPꬱ¼„°BlÙl$¬1Ȉ°tçòè( ŒU*èý~¬3$¨ç²ù¿yDªCé[”™Gƒÿ& ˆji3[‰-,ú¾&œÑ0µ‚i+,†\¾9x>Þ7N“†õH{KñÌë+N5óA-ÌÎ7³}+óG<Åb3¼àìjÒ©$›ú²ƒÒØ"6}¬iõ¶´,,ÒòðihDiTZÌH9“̈!:ñîÛ3WLÂ|\Μ„ÒM#X@LHÞÈùn˶-}ºvÌWÎr*R«6<êiû——P-MÖò öÑVþÝK¸~¿}.‰À³÷³Å½ÎðLêiõþætöÜïø„”ÉW—X#—÷å|ÐFÇŸÍwOóLÍ—È\Ù°N!BÍ™Oÿ­ç{‹·ÔQp¯ŸöükcϽÕíYñ•û±geÎí)Û0wPbC¦ž‹=sCc)ƒ0n}¿„l¬ƒÐWï„Bõâ@ –½Ç j±åˆÇuIÛEobt“霦'MžÁFtÖ®¸6Å:C‹ Ö.ÙàÙc„°lý©9cÃmMÇ‚•(ËúF#Ea4XÎùZ˜ÞÍÖài¿ÞûM¬j#HŽsb ‰¥Ò—þÇòîã轊nâ~¹Ý>Q ]V £––ë­x ®C<ü81.kþIö®â 7º,3fI#»ú –žöÓ¼8“ÂÄZóØÁÜI+9ä‰\~ -ìZq:™š"¢±*Z5×–»|2KŠÍÓi!k¨)£AWh~;w{–ÅAP›Ê™Gi¤ÎïÒoß,ç¿-1i'/9Í=§kg~"<µfÈ{º/ƒ³ˆöÛVu¼ÏøîûêóéŸuÚ~gí[Û´îáoNgÏòÓ³OÃRa:™‚Ÿcù>˜ï´“¸d›3ùÉU)ö5e’gÔ{]£ÅhëÄËùž}ŸwÜ¥mRöüŸ×ž2; YcV9‚z(õ¹x$Mf¢ ÆíYy‚6ƒn{Î0µž–¼+{¶}×Ó°Ù#sYrKI¦”Q…œ]4ÌULAÒ1PïA¬)Aˆt`A„Q‹„ƒ¨Ëd4µˆYl3Ì|ÏdÏ`.©Pð«´’( Ë2+Xî€ Ò2u=.éÝHg…¥˜4ѹòDž¥Q£GEBÉØä±D_E°T‚ 9ˆç''i Çå—¶“щÛ!{4+[ ö­:1îÐ`¡õëé£ELP dèJži}P#µÚ>d”"‹–|Щ뒌› )¥=²Æ]xý§×ikø–ÐuhÔ)Â%ÓÄ–AKOÍ40qCÓW‹Ÿ^23všÖЙc3]©`q™Niwמ2 Ó‰ÔIYœ6µ’æA„LòTQùÜ'me§.ßùž˜‚LÌï™R_g²E@)J0&É#HŽÙ8K[#g4þÙÔ´À~úì Î³õ31PêžYfÜ=ÿÍí)-ÝpÖñ¹'¹àCÛ7©ó=ßÅ)÷Ö(ê:£TTÁÉ4ñ»¬8ôͱöxÍ%Õ;fÜ×óݬnì:‹òîoŒØóL{ZÛ dÚêSdb^"U—ËÊnO3¡FNkO†,·ˆTµ'ÍžR)ÞÂ]ÚS,8/ :UÎuöe.^1Ä% ËK–yÍŠH/˜°ÑHÖÆ-L³±©¤,ÄX0NËAØÕÀ2F„£À8Ò0u–­¸ÅaŒ«²¯ Fâ.9Ç‚÷Ju HÞ†llYáø­±[f¬,# 9³ °„–žªÝ¥S!%ÃâÒ½¥Ñå@Šƒ´Å’AGú<²Š[%Gl"Kº»i‚0&÷Ö4bi` aÀH êŒ~+3ï¾F+nh·0½T³‡+›¨Hù“ªƒssù'×U&µ†Ž°Ø‚¾oÎÝ•aÈ–ˆAÑŠd‡ÝÝù>I|ŤÓÍ÷IëG,:õ[Yoy,$êíí ”[Ê|—#%µ(Ç”ÍM*Äfõ<§{Oç;(;'OUêèûeá˜GÄ#¹V„h¨æó»~b%ê0³'RžÌ2b¹ ÎdO?Hç–n«´z:‹ûtýÄ¿ÿÿˆölxSóyà‘Áìö„`¡0?àšÛS÷Øs.õ0ÙÓÊ=ö²e²Ì8ÖXÊE‘K*_³¥V£¯cN › Ò8¼\²ÖŒ±HÛ$ÖhXxjTÈ6’DR¶Ãàk#£ݰ’W슬fFëF…EËǦ–SµLƒ”¬OÞÁC¿ùY<èËË{~æYŸ\£bhJŒÝäh1 ì¦ Ã._ú½¯ ôðgÿꕈ)%4ÈA:”ŽA6H’Â2HVÌŽ®h^™ÃñÅXÙHoJÐ"(šQ–’ˆdƒ€%2äKú4t‹f5¤J^UïF*¹ „l¨39j¨ÕC¥9øà0‚dNy”EI0¤ [—=„+û¿ò7û¿°9a…9 Ö¢k„ɹš'<D·9ö±Opë_\ÇpûÍä<"‹èº&u‚GÄsüê!áìR‘õ¨¥>8+/;U^$£²O¬R®ùxÈÇ'Ô„V§´YŠmÿöÄÓB5ed{êDÙLàNȨuºÕì>jëÔ{üûZigRUÖr{ïÁ˜QŽ÷ö/‹ÍÈÁ…E§ÙÙÛ:ó¸U±™CyæçTBúÙûÉYŸÙÄîáoNµ§ÍæëYÇ'†¥ì!Ì »Ÿû|/JfcÚ8k+rrH6ˆå¢ !œ3A]·@b¡j§”øþç}Ï}îs¹é¦›xò“žÄáCÛMc¨bV‚ë¤1 ;'×`‰¾‹ô}Çz3°ÚŒˆ[Û=1tl6)Žöl¾Sç»8SÌuÅN7ßwNçío;|àyË[~–·üì[„Ý]²eúEDz_Ìœ®òUBÕJYî4v*6'ù†~æõ32ºìe`ˆ7‰ d•Æ"KM½È~ä»´gÁݲ¯B*zo¢-G€dßlí>[?s–ÉéšÛ³¦Ï×~T\œ¢tîŒé{Ûž"¹ÉI¦_µ§µ@ÇKzÒ&Ûª;“%¹=C6·§4{Z³§3•rã]ºƒ›gû»´¨ð™ÌqYŠUXkbá@òu(ã7å5½,I äHd×£|©ô_#bÆØA´ vc€Xĸ‚\³-Ö ,% ݦ¤KÏZ„au”/~öò¨ý!ns¿‡?Š_yæ5h'ĸdÄ FBÆŽV<ò½…‡<éY,·á¢=Œßû᧰ؾˆµÁRÆq—n„AKkSú0"yd×–D„èú> #K""»¨óŒtt”´f#1"؈²R£¢ê •g‰:™(õ!“rVÝ šJñPl®”þòð´³ü¤¤q‰¹?zñ¥HW$ùkI)E²˜9X{ŠQúaC>¸}ØO®i"Òô³Ê¤ßâÝW ýUÏF±Õ×9™¹rÚ—ªU•yUh5¬Lî0¼{ö´†±™BÝÖ˜ÀÖRh“.§³²Ý7mYb–8œp¤®x> ìMº9¥3Í›ª¶‡²A+çRFÎÖ–ÙÎUf?}ž O¹ŸNå;Ë3í^úÍí)¶ñ)ÅÉ—XfßsŸ}ª&ôq‹ÅbÁµ×>’g|×3ùò/ÿr.¼ðBVë5ŸüÄ'ø“ëßÇoþÖ»øÍßþuT¤PïŽ>Âe—=°–/¢æ—«R‹SÏS ˆpá¡nZ6ºE@–RÊiÌ_Á„ FD1X£Hf´":Ù…êÌ&ÇI Ú6HáÒK/åxÛ[Û¬s"„À¡CÛ%Z ‰ä§U•Ι±%Ï b¥ˆ–ˆ‚fão\õ71IÜøéÉc‰‹FO¿«Éd‰Q¤­?±,¢åáë^ýíüù‚‰oôb3†Ú\S­ÐîkªkÒBª}Ú@¹j]Iq†Å¿Ïù^?¨®ÌØ#‘IÁü¼íG¹¤ÞÃÙS‡3 ®{bÏ$“~ Šb9Í ÎÆœÐ‰Õù+´¼³¥éuÙ‡¹ò}ýC P褛¨þüqϺ¬¥} Êõé¶[k.ŠKlÖ¶b—.Õ°.Ö#E,n!kIôô¾?l±(ÚSQÙ*…µ¤c¶oűH0Œ=ÈÈF6˜u<웞Çß÷ãì²£±ý°‡ñøŸ¿žß{á×süä§9ŽÒŠ¥Så žûR®ú»OÜš†\Ý}ßWf¸+³‰&|µÅLØo~Rm+MQ˜YBg¾IÚ,]X¢U:+@o{biûi‹œÏøîØ~û츯ýô3ç³?ÓìÞùÍiìYð1gŸh¬M}[Ì êyÓø¤h åò›”2¯zÅËxÊS¾›nº‰w¼ýíÜxÓMÄ®ã¡}(ßøÄ'ñ‚þ±ï8´½h˜÷üá{ØŒNÜq}¿¸Ó«©i3gêÔT£;SmG¨»¸ºÝÞw™tÌ*à÷®Þ…StÝêFXÖ“™¼‡,YKMQ£™5=4{—“'ïàúë߇ˆðE_üEÜpÃMŽž4ìÔï;|ÏŸß½Ùóë<Ñ6?<¯R«$HÁe‡HÓ’*)²‘rðÈd²eHjݪìo|N ÑÂ0¬yÎw7O~ò“øà?È÷?ÿùÜô™›†X,\rñÅüÓŸøgt¡#ÔÔò'ïãúëß‹ ,·–…ðR‰Óm“‚îç{Ù¤&r·ÞEt&ðªó•LéÃsžól¶·cå¶¼ð~G¸ðÈÒ0pà 76'õ sÑ‘ Sâ¯>õi.ºß%>|ãØ±ã?~Ô£7ÊÅ—\ÂÖV¥ÄÑ£G9±³ã'ðé]B\qÙe`ð‰O|ÒK¨”wÉ–yàe—ÓÅŽãÇïàè±£eÌéëã©2ugP.ؾ€ ¶±X”vL#;;;»ýööûú.—^riaЉpÙåW»…ü”O|üãN‚Q’‡âÈ¡C„n«ÕŠÛÞΘS‹êA©‘ùà?!sço ›qñý.¡_.É9qÃ7”÷4i,Ü)…š½BÁô]ñïYTÌs‹¢ål©¤™Áîýõ³0ò™É"´9už÷#šŽV‘£©pñÙe6oîŽ='åùÂ4ÜkÏ.Xç5¢Ë•›zm­­W¨¦2geQÎís•‹•ùa³3Î Xg"“6J*:Ù9›uf½‚4ùÄœü³wsì÷~žåÅ——ËÒ—ÌžMT†R0t'nã’+®Bx%ª¡Í«ñÄ 6'2nvQí¦S‘o´2[H«QUþUbn•fÕÏgI¯ œ\)¿¾‡V;înØSŠs#®b×轕cSïsÇS¼jô;mï¶Ö´¦2mþÓ=X}(ùïŸ4æßL2ÖOjeà‡©4̾ÚÒ³Ú¹}ѳöYs¶~ʬžâ]=SöÑ®œCß&{Ú<q¦ñé'Úà¢ÉåT½(xÕó9û˜Aêéa{{3c{k‹1%BÕÐ삲½}³ÁE…œGžûìç𒽈O}úÓ\sÍ5>r„Ñ2ÏyÎsyñ‹^§>õW|ï÷}/?ýêŸæšk¾”ÕjÍu×]Çýøñ¡}ˆ¾ðûyγŸÍƒô n½õVÞýîwóÊW¾’oºiÏ»<ðŸÏ{¯{oéãpèÈáö.'wVüû_ú%®¸â ^óÚŸá_¼æ5+x¯é0`í¾ÖüÐK~„G?úÑ\ý«¹äÒK!pôèQþâ/ÿ‚wþú;yË[ÞÂj½&‘yþó¿Ÿý‘哟ü$ïxÇÛ ¡8’‹Å‚ØŽ¾Ý]žô¤'ñŒg|'_vÍ—ñyŸ÷y¬×k>üáó®ßý]Þü¦7sË-ŸmѪ;¸îÿ¾ôK¾˜ï|Æ3xêSŸÊ•W^ÉÇ>þ1¾øK¾„#‡{‘æ´GÚ¦Võ³™ànS1¥¢pJômr²‚@)¤+÷úú9Á&^-}^÷£”V«ÏfÕý&ÛØ¾í)3{²ÇžrŠ=eÒÔšÂy“5\#Ë|M5t=K=Aæ‚£§µçÞ¢ÛV×zlJ£Ë,æW50æÔ‚*Â,ÐÉX¼a€T|†5]Q87?c¤ ´ŠåR6HRÆB笿E!(äXøz6€ C2º0£·ðþŸzW½äç¹èê‡3ŽBèòNam.¯¸Š­]ÅaØCeë F4a<¹ÃG_ûŽÿÁÛË%„Hȃ³V]DT„õ°òòc¥¤1Ç)ŽÎn,2I”ÖHƒ˜ ¤CR&ÇäNֹŮu‹bÆ»+J°6«,n> yÓ*˜E§˜»—^Ó(6 @›iÐIÄõÓìHÚŒ¤]#‰ÍñÛØýÄA?}=~ä÷sÁe—ciD’Ÿj= :P=çCDºíú«up;ásö'Üø‡¿Ëí?ݲŠbzNœÔ&{KºˆÎÊ&äZ,¥iÕÿ›Ó†ÅâÂþPŸâB”@Zý®sµ'²gª·Šê-1ç „š’sÄ$µ‚ÂzžÛ*…š¬á.¦•îÎ÷”ÜB(ýsfОþͱ'L\K;¹[ÏÚVcžáÝkaÖ³öÙSûé'gï[­‘vOs'{tÆÇgÕ3 ê¡lfôU&\Ê>ÇŒJ"K&Fåúë¯çꫯæ[¿å[ÙlþÝ¿û·|ä#FC ë:$t˜E‚lÈRxgA`Øl¸ãÄ Nž<‰†’¦ ›aÉwÐu/yñ‹yÝ¿|üà‡ùÁðûØÇòªŸ|¿üËoå¾þq<ÿùßG^ûš×ò˜Ç<†ÏÞü^õªÎgßÍ2ÇÇÌW*ï¢9yò$'Nœ`³Y8‚XMª´5K=m’²ñ_ñwx×oÿÿü'_ÉM7Ý̲ïyä£É‹_ôb^ð‚Ðuo|ãëQSÞøÆ×ó¦7¼‰÷¾ï½ˆÂã¹ùæÏ:¤N8rèÃfÃS¾í[yùË_A‘7¼á_òkÿéíÜÿ—ó?ñ2žþ´§qÅe—ñCÿð²^¯ Ö3Àñãw°^¯ø?øƒ<âàûûo¼‘§=õi,ûe+\\ WåsõBã¹ÂféwiåÆs+6>Ç@5èÃùX?ÝÆY*»P°ü¼îG:ôu.˜ÕëSÝÅýÚSežT<Õž§8n3™R«Ñò9‡Y¦bVA’÷'¸³7®Ò|®Ï왤Ö6Ô6&ª=ƒMÑ1±ÊXÌ^þk.±.,ãÈŽ¶Rb…AÊ›„àõ~½ÂZAb!hŒã@‚’É@´Hb‹NW˜Å"JÆJŠÂ2.IYº‹|î|ôåãªû]¾šÍ¶€]e†h¤,tµr€¹¦Âj³ÃͯúVvþòwX.· ÖšÈY0º]kíRއ5Xa]!²#Câ¸b{ŒDk„(Æ"ôœ4EuÀèA×ai=kQbŽ ¢6 Ž;-~jÎî- ]¨¦*E·ê¥ õ@¥¶H=+'\†„äñ¹<¬Ù¬ò¸aØÙ¸ä~»†¿õíÏçðƒ¯$oV×tfõ Ô`ð:«ÕäÕÔ—ÝsôÃáöý Ú*p35e”Šë*DÞ2ùÇ=œJè77à¤ç[ÉdÚ›ŽEÑQãTùÀ'ܹڳÂE«B¡ýª«£%õd…Ätª¹•²ËàUHƒip‹Ôj^Ù •84½22¢Ÿ1­èlxèzD,{‹PÁwF)Vz¶¶\·êLï>¢Žw:sŸÍ›³öÓÕ¥ãYž™JÿÿæT{Ö󙯧³™Ä¿ýì”-Óæ¸ß1S—ÿíeÏÏüÿ;_ýÕ_Íýï¾û»¿›ç=ïy=z;׿ï½üö»ÞÅï½û¸ís·5ðÛ„™šoJ”Rx¥ÖF[,üê¯þ¿üú;ßI¯Êë^û®¹æ®¾új¾ç{¾ïxê·qüØíl† ¯úÉŸäg~æÿäÚ¯ú*>ÂÑcÇÛ»ÌYýE£fö.3ŠVÜ kUÿ¾sA‚ æ©ßþ„°íˆ~húÀûÿ+ïÿ¯ïç­o}+O|â7òïÿí/pìØíìœÜáäÉUc4ßzÛmÜþ¹Ï¶ï«¸ß%òÃ?ü#¼îu¯åoz3‹ûä§øÖ'¿ó»ïæ ÷ïò¶ÿð6~û]¿C x?!¥Äµ×^ËWÕcIˆ ?õªWqÁrË©†yô†5#»:¹zÅÛÜ´§"d®ÃTuÀ›£uﯟ¥†h(vm‘¤ó»™$w#b±I°2L¢«;û³gžê¦N]ìSÚ4k§Öߪ‡ÚNÉêT\¹¦fê©ÕÊ;í§-ÍEêð®Þ=Xò:kg~NÁøí£Ÿ X:kßtý×»cÏ™ˆà™ÇçD/¯Y€¢š] ÂûŸ%âK3Nž8Áw>ýé<õißÁ£ýU<ôaã’K.åë÷ <ökÇM7ÝÄë_ÿz~áÿ Ûý‚`F:¥NC¡º‡†_8vìÿßügúP¬ý±}œÝÝ].ºè"þèþˆÝÝ ª‹…ðûðû„¹üò+è—KÂÑ£í]ò-ÁÝ,›Em÷VŽÈL¶o”üšŽ£ë„#ÝŸkùHtÅ%EªÍfÃ8Ž\yåƒè—ÛØ±£ížæàYYQê÷Íf\û¨G±µµÅ±cÇxç¯ý*] ˜2²Ú9É›ßô&þÑK_Êw=ûYüú;ƒ..[5ܾïù©ŸzÆH£qÑ7qI}o•Lš1J¥‰rvS‰¬ì²7=¥äx¨<“Fhéê{ýli$O5Þwû‘¢×ã¤$!1VÌ¥cêögÏèN—¬æ2î<ýZ‹=cíÍê Ú…¯k­Û³$³*ÓplŽ{ym/]V#°®õV4²¦ºŒÉ%»5[à[«šá K˜1«éŒFrNôŽóMY˜+°[G*ùŠvYŒaALD”!׺·»Úa9²–t$Û°¡g¡»äÜM) p[XJÀBG¶£±>~Ÿ~ͳ¹ü‡~‰péCX$aÐÒªdÂè¤c5‰Ûßø{ß;Xnm12‘Ø…2¤PR¹ŠäJÑ´êKÊ5,mÀò€IùÍZ„@(Q+-ŒÐ]X’ ˜?Œ20²`! ¶`ðb…]Y5i.Há“æï›—¥Ð ­SÝ‚’UÑ=e7p4ªþU Î" 9±Y¯wN°f\Ÿ § C2n;¶auäM¡›EoËZ0ÓÉs&€Ÿ%@XeŽß±f3¦:¬tYŸ*ib^È$<‡XÆËÎÑJ™v¯_eƲGç•Õ­Q™ïŽ=Í1wš|HÉÏp_¥,—²pŸ´EÍY­zõ5dm>Û=.68ÊÞþMõà­ä¾[‘Õºx°¦ØþÚ:›k‰•ýôYöÕO}Ø¡Õɾ‡¿9ÕžÉ7º³Ïr„Õ¦ÍV£X挤ýŽÏ¦…f¡8œQ¸íè1Þôæ7ñ ¿ðsl-·¸âÊ+ùÚ¯},OúwrñÅóÒ—¾”~üã\Ýuƒ¤ó•»¦¨K™ú÷Ã0ð¹ÏÞ¡e7ÜYíKñ0>÷Ù›ÆÑ¥X„cG![[[„Ð}¦Ê¶Ó¹Ò§ºý]tî`‹*{nÁ$¢¢l6÷õãŸüø?å‚ .`{{›cƒÜqÇq>ŒÆ“ò÷óöK¿Bû¾šG.¿ì, n¿ýv>ù©躮¨¡KdÑ)×]wø‚/(àáF¾(þ?ý/Jì‚«WÜMÁ¦hÖÙœu,¥o¶u¬eãrq6*»«ê>™G?=r¥¦me¸×ÖÏ ×9¸½¦ë*ò|îG~˜”*[P°{fO/Žìâª&:³ç=®%¬¤Fk»w²§‘D‹Ò¸¥<{—VÂk–^4eY x¥Žc›ÕtÔ&4V×—ØtȨb¯Ú¡À!::q¤c9!Ö± É#}ŒvA—¬‚a¶&Êë<ÒkbM_åÎP:–‰ò[OaFb!Xä€ÄÌ81\€ØŠ|ÓŸ“n» îw9»©j>&œJJŠº½¢œ|ß»X,’{r\³ ²Fl‹U–ÈiçÂKä5$a;–Ù‘ø”QÖŹÐÀV H€@Ô’eC{†´Y¢º¸‹±„¤EɽIIiZ­(9¦Ü±$›Wy5gFX.“Ãuݲ;š]s)—‰‘¥”ÌÈë:ޤÍÒ@²ÌÉ‘Ö`ƒS®ÄYAjfé­Yùù ÁX ̼|NåûŠ—Ið‰á’ØÊ ¤<쬭ªÚ[k45ÜJ¨q=KyZ‚Eî–=m‚€g¯´Âö®XLC ä¶YŠÝGmÍ‹§ÎËStmí`}ŒÔþ…J—7›Ðg›Þ$®Y£goËîòÝM¤t¶çÛ7;k?õìÏ»w~sª=k™³Ï*è8’nZ‡ç<>5;KÊÇKôMm½»Ãjw—[n½ëÞû^þõÿý³üÜϽ…+¯¸’ç<ëYüñ{ÞC¿è!¥½i¸ª¥a’ª0#猄Øz¥”\#ºÔDh¿Q$Äö.sµú¢9—yް¤€ƒÊTÒ¢J­húÐ‡ðŠ—¿’nÑñïü þõ¿ú¿øèÇ>Æj½bgg‡[n¹¥Ý£­ß³š±}ß ,—½oìÆfYô[%ÒU¨\œÜÙàСCeÓI³@D¸ãŽh(=µÌ™z4ÇK͹)'ÌJ$´ˆhƒgÇ_ˆ9¶(‡«¬™ê5îÅõ³èµjyÄO&êüùÝØS"¬*»ß}{:È=s)¥Cqìª=1mðŒ¦9摃ª\oj‰2óý«›ÙsRdo¢¯>ÁGòTVN&‚—i©Ó(Ù#ä^3@KzsN"XŽƒ £û÷Ë&Gdjl k g‰£7 .L K¥¬¥ó$]ßVû­™Ìbl¢Ð[±å&o@#‡ŸüOØ|Þç³\—¢Ì+:–f°3²Ž#HOŸ pèÒô+Üþºïd½:ÁzFqa^zŒ‘åØA·…`¥'ã‰}YeÇ5„¾t'm!q,°#DXGè –F_Æž(ÛqékÊšµ-é=Ýe."·çÒFñ–=Aõ2°ä”RxÔc~ E+ö[£c2Æ¡P2aHXÊìF^A29eW¨­¥ rUo*~Éy(¨!V°k‰ šŽ†¶>Æ=‚%u)¨‘²ŽùA»„^•½¥dì”Rê§³JÕÕ& pŽöœò'”LØ«W³'¹1“û¦-‘ys~ÏžÒ£Õt¡á(ö–È™ ˆž®µÆŸC[gx÷sês-O¿~ŠØYŸ¹ŸvïŽ='üYƧàÀîFŠs'ét—žñ›±ÓhèLö Bè9vì¿õ›¿Åsžó®ºêª©¶žÒªGNTö®>ÁÿÞš6E•D÷‚¤÷ˆdÎþ¢°‹vPˆqV¶–ÛíàP˪T,Êü 50òÈG>’¾ï¹õÖ[yùË^Æz³!.:.ˆË/¿Œœ³—i±Y;rª™¦ÿ&‘;Nœ,å„BàÈáÃw˜<—ÞÿRn¹å–âlJ[õ&ÎB;dÎÔ§öúU'ÚLê•RY÷íhj2 VêìÝm¦Ö…LNȽ¹~î-ªÍ^§ø>Ø8ÍL»ûöœ³–­¹yÌ*ST5“™¦˜ÄÆŠS(nY™úvg{–ú†³Ô´T >„Ó¾o¨Rû-žØd(|¿%’­(4É1w†uª|aZÊ>[œé‡Ù4^- XdaÒ—‡Åi ˜d£‚åI)ŒÈ9ô„¿Oÿ¸ïÃt`µ{ÒuªV¬DŠÒzJlt ¹¸xöùáÈs†Ÿ}1«á}Z2Ø@b±d| jڰؗôÁ"öz.z$Ë+”Ú>ÂÂfCÊ#ÝR«|XI9ö~`XŠM5ªióª½èn"£Ÿ¬½ÀkS%‘Z•Ü«‰ç,ì!¶7ŵÐÄ¢b·MZ#úÏŠ®R±c7¢·‹‘q“•‘‡M)©a“Èè<ÔkU%%uACD¬cÜdH©l.ºððüXjaI+é…C½”@ ïsšRUuÃ7g jÉ}7¶J“™ÜÝݰ§G”²ƒ­.%@k‘–lÒ4’*·@&Î[ÂBžîI•ã2ÝS€3,³k·ÆL]ÇæN”ûto;McæÌm•…ô®ß½bÎÞçʾÙG?«¼É™ž¹Ÿv÷Ý·Sí™Ï:>ÍNuó¥)=W|Ö¾Æg+þ[þe³Þ%.:DjÔhfbè<Òr‡§Èj;3²ª@'F’<Nª–aiDýž½‚5ÒÚ»¤\X„‡æÁW=ˆÏ}æ3 JJÊCþæCXz Rd¶N¥ãE‰Î~<|èªÊ8ŽÜqÇI¶··A2»ãÀžð Ã@ß÷t´Î^?/åTXÎu­ÔyíøÄ_}’ÕjÅÖÖ_ðð‡òçþAßëãfÅã¾îq˜|Ý{ Ý£›ÜpÉ1õ¹›[D½¯]«jкÕWM·)âo€TÖ«cIîR<c¼W×Ïl3Œ¬£€êaà|îG„VK1HÁïÒjõÝ{ê9Ù³b½ò¬¶h=Be™9¸f%‚ÝtÃæö,µÈ9·lT5•kÒ ìvª=¥Ø¡j}UßÑX™F–Ò³ÒRÇV4†¼"š°ŠÙ^© KŒÝ¸¬°!EK;‚%VfÛ`»u9c+Á®ã\£À*®;Føæ—b×~;6¬[äkH#q¬}LìÊŠ^zvs‚¼ÆÂ‚Å•_NüþÍøº§C¡KèV0ʤh”`ÛIsC„í±|ëV°ªÁ -!® ¶ŽÂdÕÒêu7˜±Qa4ƒ¸ ©à¹Tµ„ÈkÝ(\_XUËÇÔèÿ¬BæÐ… Í¹ ¾!x”J=ô®¡h£h•äï{º[Øúذ|ï/±¸þ­ôïÿO,nþ *ʸY³Y9ð}½Ë°Z1®V «Uûûa½Ã°Z³^ ë]ÆÕšqwŸÚe³J Ãè'1kFUi«ÜüžòÜzj,ÂyZá?“k;ÚîÑvOíok'H ©ï³­ZÍî®Þ‘}÷Ù_?ËÏüL“{ç7w¶§ìk|¢¥\H­#Y>»:Iö?>gßÿäΊ7¼áMü¯øJŽ\xaÑ´òœ¾ï¹úo]Í×Ãã!ð›¿ñNâbÑkÒÐeo$¯"“ð£ºeµ SÍ4•½69%ØîY­Ö|ä#eGžþôg Rˆ(‡mñÍßòdŽ92s8ý[ÏÓz.\Š ŸûÜgÇ‘íím®ù²/sÌÀßzÈCyæw=£uL_çK pógnŒ«ü`r.’:9üÇïãÆoä /ä)ßþT.¼ðP µ~á~Ï|æ3Y­V¼åç~E¿åvг(ŸyY±Š!+Ôñ¨õ;zÝ1gž)ŽO±¡c|Ú8S‚„9Ô²á›WE¾om¼×O/EÔ¡ZRŒá¾Új %T ð¾²§z”0¸=÷Ìë™=£Û3ֵɣÑÅž¥Ú@PˆˆÏë@Ð’"¯öTŸï¦•äu{J™‡Ö4ˆ¶ Ez€¸.¼FYa¬ó‚u©?ÀvX £° íbb,´Ì‹­¸d«Šñê¬ë›[½[+$äM Ùf|Ü k¾´³ËÉufg0vvÃz‡ÝqÅΉÛ9qËÍØ»;»Øzƒ # +6ë\|%ýsßzˆÍ8°„ !Dwš³±—ìFHÒ¡vEØ [dÙfi¥Î£uÅ1í¶ƒ`¡ ¶dë`=[VºÅ"ÀŠ;,l È1øé2ÍX7Õ×-úUµðhñì Å×á'‚VS2Ñ™Jí<*L’PÂËas’pò6H‰ÁM»H±G0lvÙìî Ã%•ZNs!:©…b+K#O¾C‰@¤´ö¿bŒ¨t\­§¿‰QÏ›O@•"ª×êKÙtRÇLal%bŒ: ‘¨×ELf®•ynö,miSŽi¹uë e_²S‡­é¢pŽŸjÏw[¹²êÊ=%æ5·(‘Eqm®TÃúŽ!(Œ.Ìx;Ù±7ðé~ú™9Ë3SÃ>ܳߜޞMüõ ãS}¨•jÁ-ÅÑ÷?ßµêü’râ_ø~îçÞŸà|àÉ­·ÜJá¼?×~ÕµÜï¢ûñ¶ÿø+¼õ­ÿžE¿h€úy!“®PÔõ”¤ÎªYº´Œ‰Îéìyo Õ¶1”wÙ=¹ÃÛßññ[X© IDATˆ/à;žþt.¹ôó¸õÖ[xøÃÆG?þqn¿ýv.½ôRæÅ–æ—Yb+k)Óúû¿ÿnþêSÏàá8/ùËøÏïyËEÏ£¿úѼáoäeÿì'ü}Y""‰EßñÞöyÉ‹_ÄüÈñ»_ù• › ýrÁO¾úÕíøÇÿøŸð/þÅ«yÚw<Ë.¿œ¿üË¿äС#<þ àÍoz3ýȇ ê·™ƒå (/]lØ[q V"¨åuÌK¨ä–æ¢÷ Å‘ÿ(^^¥ˆäVk°àaï¥õÓŠƒ\Ü×fî7 etžö#Éeó$ºÃ3Õ~¼¯ì©3{¶4ùÌžSú»Ø31‰BW{jß–4ªß;+˜ZÒÔœ$™F¤åõHdÆJ “@ȘvPY0ÊŠŽHd@B!d˜[4I ð!1zrÓdg†¼BYuƤlØŠ[ ¶bc F²LgÊÎ+Ý£žÆ8`@ÒXGÌ» ¹ƒqþŸWoû4úM? Ÿÿˆ‚…JØrÌhR¸ÿß |ó?fùŽW2 ¦†²Eˆ;(‘bzbÜaÇÖ,TYÙ 6 D:’v.ŠÈq͈RÇŠÝ‚ ¬R$…='Q¶ÀF"®ú£’=W[‡ÅÓÎZ(ÖjEò?0S§ô%ähÕX¼{K‰Ñ‚ o–Ô`–Vóœ–zЉ`Ã’ä ¬VäÝ]lÜ 6@ Nz ê%^ ð/‘­+Þºë6¨i³ y,'v‰î¹{q^ Ü]°à b\¢ Äçš•©R0®Lžš:oçr Ñ'V,§b’×T;{2–À­:…ÙLŠNËhµ¶žK˜"’È6Òy ›óÙ¤–ª¨÷Dw²h©#é¶ËåÈ„ÊX”C´ÛÛ†yÿBë_,1cËÞVØG[Áût×ïÞù¦}¶>¥×YûiñìvqM¯{ø›»°§JW(ñw5>­²ä¢3 Õ€à'h;§ù.V å^tø~à/ä1_ó®ù²k¸öÚGrÉÅ7ÌÐýáñÖ_þeþôOß:¿d™nѱ½½Írk Ó‘ÑÖ ÿû­­-0i¶1¶¶¶ØÞÞf±ˆdM$ Í&lo{TA÷ŒÃxû¯¼;Nçyßû}<ñ‰ßÈm·ÝÆ/þâ¿åõox_÷µ_Çöö6ý¢+À^QÔrk+teÓ‰";~‚ç?ÿxÑß{!_ÿøÇó]Ï|úà‡øéW¿šwþú¯ñÚ×¼H­›»-~þç‘Íj—oþ–oỾë;Y,:tˆW¾üåléøø§>Îwï÷ñ´§<…ÿŸ½w²¬*ϽŸwεö¥ªúFÓt۴Ѐͭ½ Àˆ!^á$‘c$êHƉ¨8$Á“a¾˜qxø^àS žáÑdDcÀb/´€Qi[hÁæ"4}ïªêª½÷Zk¾ßó²Ö®®ê®n.ÚôóÃaSµk¯µçžk®g½ó}Ÿ÷oz#Î~ù+ЛžÆO~ò|þÚÏãž{î8ŸæàDPÀùÖC"ɃG“C.~‹¼ ­V² Ô« H²NZP ±¨3´eI8ëlBõh‰\3?£ä™Z?³Ô6Jƒ8òÎgþ~›» M¸=ãébé9ÆS“ó™†qòãéDaƒÓ–ßNN“1Ô=ê#bAŒiH²7ÁŸ² 9pYØ:50ÈŒEfºpZÀÙnˆ_äÁ4¦ÑEn}ò÷ÓF ºf¤h(“ùj}#ÈT1@#èCM}t1Å»¦‡:h “tdJd@oÈBÿ›r eÞ†NmGû«‰Á/ÿm”_þSà÷>yÞIÀ ÍÚ@p¦d€²µmäRb`…*FE0@(FÔgÑMÈe#Ro­Tyød…ôa0ŠŽvü(˜ Ðr)1AnºhC!èR¡/dõóÕØ±^à-ÞËP½•ÅÈS(›UÉ:ΦnÌ&xÍøIU²Û70!¿Âç+ʼn‹UP!ùÜ}6GyÌi¨~ëýÅÏÊA˜5&UšøH…&cBM“YƒGJiµ¡ë¿ s÷?"{èndÝÅÐÌ$³S{ÚU¾ƒ =.•ûZ @ >J,xiZt,,Ê ˜Ø³½éI,[z$ò¼uþ–Ou­ü¶—J5u.Nh–jœC¥þâ²ÁqW],DОéc”áÉYPÁ ó—§J S†‘Ln8®LçW¨ †w¾Ü:-Î…|ІB}’„Þ•û:VÈ­ÜÇgyû=gAæÒ¾Î³˜Ì»ï÷ÔP™ùT_3ÛxÉQB÷=?o¶:¾kÓý>Ú#,óïïܼ¯wÀú! y_PL´*W†jMohŒä2ÛB&ÑKÍçHNõJTƒiXc0²`¿ÒÔaº×Çô`€ÌäX86âÿ&䉌ONÁº­vy§í×çÍwOŠÁØèˆªCŸEQVzE­ü¼–V†V«‹þž=¨ª ív†v»…B}–Æôž T ´:tòVš“‹jÐG1èûȦµ0­.ÚÖ`rb7œxCÒ,Ø_V!©*(}(*8”8báX¸aú8B5`jЇ ýݲ̠ÕnÃI6t=B &wïF¥ŠîØ2“ÇXoXSۥη]r¢pbüƒ’«Ís%øßI°" )T\¨&yUê‚Ûx•š;?ë§ŠƒU uþ!Zâƒr/º~ÄýHSë¯g~<*¤®ø”t?ž€ Mðl( thøªAßûΪ·%Ð4žHÑn« ã ÓH$×®ÏݪB#vëóËú<¹cÆ,Àî‰8~Åjô£0ƒÊetCÞU/tBë¿ÌýèB1’úGŒbOtE0m€Nå0€Af¦ÑqTFQ¨`$¬3»«ÝÈÐÁîß¼ºæå^@Õ2hMN¢ºí*Œ=ô]H>âûVôZGBßò—Ðå/ðcé|E©LlƒÜø7èîÜ„ŽE©@™O• ƒ–ÚužBQI¹´L£ƒ®í•²‚(*Ö¡r% ]d•`ÓPÛAÏù `VÈ!3Æ…DfßGÈÄí€d³æR㠨ˣSÕLl·á⥘*Lª=‰­ ´Ñê@5?¡m€ ú•úÇï*føÆ.è¨Û™hÝÛ)†?5øI%ÈTÐ ñMÒÂÓ”  RˆÛ m—ÕmQ¶6…t%$Þ†f 5Ÿ51·+U:ÕMvÝŽgðdq"u"rh#~%¹N«1¨RCÏgøX±W•ÄptôüŠ^e!ÔÝè¯F¢ãJZˆmí:Þ8‚‡ŽÙϱT,œV©©ð\ŸÝÌóœºýž§÷÷qû|Ï*ùh=µ×Ì>ž&úpï{~Æ-‚‡˜%/"ÿ³ù^ï’ÚQ‡«U,Ú-…H+Œ“§¾ .VÔhjìÏ¿ÓÎa:­Ô%@ƒ9lÞi#ït¢ËP’“€`ÁèˆÏ“‰çLK.Z>¥0ÉÑ/yne]Ÿð¬HÕV#££P­®å~¾-–á³Ä9©ŠV§¬•¥þ£ñó¹ HXû ¬z§pie°yª85ló EU&oa¤ÕB.â‹zP±Q}XçF, [Õ¡3…˜”~+`kçÀ*X ›T}jC”VÄ¥Z¹(˜5åªj*íG2}†ÖÏ0÷\X3MðµŠÛãîYº5:>+ã™êõÒx"yÅkH0!¢¦’ïÅÞUaF¸ÿĤ -bEÃ=(´õ1R{g…hšH³-wí§åÕ¾V¢´s@éPfÑ 2ÿ #g1p ›y×yŸ_ ³ -Û(µ@+¼¾ªý;Ö`ຶƒ=Z  ë./á\9F ¥Ã¢Û?…©*Ç`Í‹0€ ÀÝzmºUÞ…Z…ÑT2´uƒ›þ'¦ÎûKO@+7Эcô_?†ö®M¨:£8+:è_‹›£¥Eøüy¨•jA÷ûëÈ4ʲ‹ÜN£ªlÈûìÚ AQ‡®­ÐGÖèˆÅ *´PŠ/Ä Ë] ÂF§ÙXǯA!û¨†5^9Äã¡-¯ÚO9,µ›O¿‘¡ò“„V¸8Ee1@5± •ñYø¾7” O´ÖÄNè¾±¬º"™'"zydm˜Þ”_€¬ïæÆ;e« 7°l'NB7rmôà’taØÐ¯I‚¿ˆTWuµLlaªÚ´.V$k¼O£þi..AR¥&ΰƒ ÞF€V>Â#FPVxVŽ/çèlœ’sB˜ZCο³ÆJ04²MÆz1oÎß”}’§uáü €ÊÔ•|sË«´î8?ÛgoØìïœcÙùþÎÓUe*íŸë=½È°Où53ÇÓ›î~J¼I„„Ûº&*<”ÀüÂÍ/È<žÜ T³t]§V<±ÚO2Ä Wkü“tUùXÏÃ÷‰²~íWŸl[ùsÈLô ÞA¢¨±‚2ÞD‚ÁeÝtÚ…J'ÞD4ÓŸ‰2ÌãÇ·ñ7•j£?øÀié+¬T`%÷[èªç«ä$ËC— …Q>»õâ5$u;(Ô9• r>Æ„ñ»ÔóÝšFÑ[è'&ZDñ…”›šÌ·Õ…­&ÿdaË&˜2‡ï:J\ Õ°Þe½at ÍÚ¾°–=íëg´÷Ê Ý|%¦2 ixï§Jñh3Wÿ@á“ó Öxß'ã,YÙ76¹~[qPc}ú…°¥…f¦Ì‘R»\tõHUÀØZeÈ‚'âˆZÀ•˜ÎrtËF€¶õ],¦¥‘ï_‰ÞàQó2,¼å ßò L7Gn£·aègXXŒNî@ëÅž ÿ•É1vó•0ýGÐÉGýøÙàº~Qµ G^°¹?Oë« 3SAT0e¹ë ˬ–è  >qŒÝå^ìæå`»ðR-¯;$¬>ö8mzƒ¤DðF/'EíÏQ÷1‹vê¨ÍÓ ªNÜÛe+ø©h,Á¿ :‡Á葘<ñ :G„›‰ nË``}r®dÞ²AK åòÎæènû9F¿Ù®Ç YjMj6=v´Î¶M_lÞÙx$ƒ¸z 2dQÖ)!)×U{¦ö`zzK–,Anót+;˜ñL%º¡uE§«KíSá•Ö;õÏÆ±4 ƒÔ.çs§y~µŸ4ʬg?NHV•y+¼v®Ï.)vÿçœ|›öwžá˜û|ÏùŒÕÁŽg|òs~úÉnŒÅÄÄzýÚí6ƺc~Ë]õY»Þrf¢zQm:Më^·‚Fp{ø5C°ƒÕ„Ô·i½ë¼˜Æõ®H7Xºýù¿1C¦õx6cíÉ'm8Ÿ:"Ì<—Ô³/t¢8ñ„ÈPÀ9×Ïýgíž9ïñ4ÍÖx›§wýœežá¡.DÿjCSw€ãÖF­‹…bí8ž©‡¡(Š¢Äî;1::†ÉÉI¬X±ÎÕíËbš„‹bT£(–†‡WX£¤1^¡±vluçâ}%ŠàR¡™ÀÀ´é¡SfØ“u•“hÙ6J["¯ò` þrEUT¨ªj»¨TaeŒ@8«£7¾²Æ2%¢µ½RÖ¢˜ÕêCcô8Ü7S«*:ú+ª¦Ý¸º»6ŒMódLz¢ÄóÕ‰/aœÑk½a8‡þE ¿Æ=`ímÇØOoLmIü2¡õ®rRÁh:‹ÐZ@Så‰OX-a] ›„YW·Õò-ñ»ÞFë2ñ¡&é&×ýFSXÕúÉ&$Lfb`5¶V©[+ÈxÖ‘>|%µ¦ðsESHYƒ×‘Aª¥y†…4G\c±Šm@µu'8}Ó¡KïW–ÔÝ]45/MŸI0¯cUûg—Bõû?ç2:ºïã<-|~ÉþÞSUž–×Ì6ž iˆ¼ÙægxRB*U6žµë= ˜Ø%õU”ÔV*=ÙÇ­ÿäîn–â·hSK*­7ljÿ4?‹DÝÞ×»¸´Ý]{æ›T‰¼áñTÔÆû\?SÛã”e¼™Ìg'̹ ߆‹h0#S£@–#×…µèHyVaz0­ Uä’A-Ð ¾0þÎâÏÛ[¸8-aÑ… ÿ<3(] c¼Éy4ôQr?G\ºà¼}ˆª/²0FáÎ!S‡êM•Õ`¶y·ã„…ïŽâ`ý¡ò­ÈS.œø­´úË‹“ˆЫ ¹qßY£Txðaa£²Øh4U¨ÃÂö€ýSD‰Öô6ˆsa[©ñd O0 o©#ºÇ*4Ë!y&k…„ÊÚ£WBûMmÂg@=é ±g›¿ŒÔ¦5äNøm’èfmüD 9_:ÃÌxЉÍVkwäÚrÂD.Õ¤«Qž¥cùㄠƆ¡¯Jð‰ÚñæS…VñÆ¢jOO’¬4R E¥¾ƒF·ôý gª9?»_ÃËyŸ³·ßóô¹"ZWrÎòž&œ×S{ͬ㙶×÷3?MHÿ5~~ZÄLbôü|Z®÷øðMSd04Ø7/ßW.¤ö‹ [/&%×R)ÜŒ%ëÔù_3¯w1Rß8CMUÓØºñþD³_ïñÆ6ÜÙ žOý1—%ÚÄÖ+vxáÎU6¸Å:¤”Äàùd5vHÑWïY›úùÀ¥ÞUÞK©¾Zü¾½ŸŒ!Á±áb Û‚±!ÙUCÏ5¸F‹iý9ØPþ]'+œV!ôêÝo˜°Ïî£<6\Ê™ å˜1Ý6NÚ¸CâM튫͠²ø‹Ú@áªú7Öo_ZŸŒy0ã) ÍaE2E|$NÆ™´‰çs¢*uÈŒ z¦¥Ö(œ3!oËÿMÌ{‡ßü2¬_dò–l[.U–!,ƒâëÔ!3@åì>%QìÌñÙ}›— Õ¼ÎÙ› º*ÛïyšÃ6×{úÞ}nŸÇÏkæOÄkfóÓŸqὡX›²!8à9ó´]ïá}R4&T"VuʱĴã˜àÛ~„çn¸P*¶<¤ÞÎóz—ÔW<”¾KJzVÔv2{§„ù 1Q‹„yâ\¬¶u!?L¡Æ[·Ä„ªçÜxäú¹¿ñ<”æg*ˤ²!_µ^5¶5DÓãý(XáÌs<½w˜A³=6RÔÔ„{¢KÝ7b“ÄœE\ bך(†ýŒ7bµ0R@2ƒŽPm¯3A7SôÐF†>Ķ xc|øž…Ⱥ@6í[ߨ7—íå-ˆSôŒ)ýzÔΦ ÒAU9ÆÁÙ yt­Ÿ=-aœËûP´ÐF¾´Ñ2}T0>Ï,ôƒœÌ\½ ô‘YAi;èbÚwžH¹²  “‡ñ+iÛE®%$¯`Ãê ˆÒ2£(h¡‡²\ÖG”VÑ Wµ¡yÓŸÆtK`Ô¢_:Œd+(+A&Îæ&&ñÂÕQ£ ácÃM—áá†ï§ŸÒbɶIÓ¨îóåD¡¶6·Œ7Ž*„Y³Ôµ]S˜ÖŠC.@ïS eOøü+—.ý˜LXŸ‘IÏ$‚ÊûÅ꿆±`L¶T¸:)PLÜp»Õ¡¹ˆÔ-`*ÿoã£>&Ú¸kó8ÿñ4¡ÒCÀFÁãÃŽ*¡…G=²>©RÒÅ÷Œ+øÅÅ( 2XŸ<©+U8NÝgÌÄŽöFÒù¥ã„&²"ÞH3 ±üyÇ£fãìØšys0úÛßyÎëÜâÓìS}ÍÞãyö7?%D`Ɔfµ>žÄå€çÌÓv½O" ‘¸”C#ƒIæTéè¨ÛèÆDHÚ¾Þëͺ»Þc­Ù¾®w_…éÂ{˜Fï»°~ÊðxVaVNã9Ÿõs_ãy(ÍÏtÝk<³ú&ɰ#+P@½°ÙçxJJ±ð¦ÇUm=R)·)1{Ë$òø™UMèE:<ž*|•±5¹_§íBdjЃ³}´4‡¢‹B X©P"G¡ŒHÚjQÚÒç?h¡Â´Xd*ÈP¦B®m ¶%VûP“‡oÍûY´DK€\ZpÆ"×=>’ e,2¿‹Ù ¦½mPe¦ÃçÌ‚0@+˜‹:dL£„h¦P¢„ÍhJ,Ú 8ï¨ÊL¡ÚGiC­@4÷ )RB¥c÷ ÔÆæ°0à2ƒ¾ú»),| ¥¤=ã{°I®4vu‘„&—h”ÆÚàyS;#ûÊþªT¹P'“!åHŸjTæV"YØ"ñ[€N³0ñ4](±JDU}„+„YZDƒ•xÑ[)Ó’ OYé¢OPZ[?ÄDÁ”ÄZÔ¡öÐ:ÓdȬ¦&Ѱux ãÃÙ&xéÀ°ÊáEi´•¯f€/?±æ™>–ßN4Æ„=~‹R}x×@S04¸ÓQ?FB\HSÆx/&×èå˜Zjt#ßϱöóÙ]Xó:g­[kìëÏM$Ÿq½ç)¢‘üµU×»Æ(„³Æ*Ü@M(ŽàxÎã™â{Cãi‚^Ý?0vÜpÈI5c<% ¥z<«T‰[I¨l؈ظ¥L3]È=ÒfÉEãþ›O;5~<á­ ªØvÍج„Í2˜¢€ ^&h{ÃL•ÁN4+²mô³ í,Ä»M@{€vÐÓ’õ²zYY%ȳ½Ò¢ ƒ2+•­Ð¹ š“vtLßÇû`Ý4]?&™E¯ Û”è{¯*«(  Ph9èš¶ÿ².¬ƒJéÁ˜ýJÐ’^šE™bÚè© ƒžnÒ39¤Räyy%€ëCJ@mÖ)¬ |Å©Zdb½1™ÑzY†°ªÆXÄŠ®F;­½§4V3ÄèQ¬pA¥&´W¨·ZbÕ‹O}jC³®à‰^)>©7$±«ßBŠçãÿÀ7£5¢p.t.ߺBœ¦à´† ÕÀz¿,E ¡zSGW?EhòðöÇ I#1ùÓ˜p¡ÇÆÇÆ aN„~d1ì@dzî›’4C¸Û„ö•iôZ×úÉæÙ9–÷ù21G¼mFì5Ù(¤I•iw!a0ÍÀØ r ¤nGŸÚòÌçX^ds}ö؇r¿çr=æužnï)OÓkfŒ§IÛó™Ÿk-2"aû¢:¨9ó«¼ÞõW}½Ç.¸ÑV"NW'é¦Ëñ<|ÇÓkÉáñDAÍñ”h !68žÇñŒ•~¡¯mO›¶?ýxJc k¶Ó¡æè¢±½”¿¿§÷‹ ¾†Œ§)á}2›!‹RRež¡,è Rs”¢É(ÐF»ì o€–U´‹6zaë­_ Z”—‚~æÐ­ÄWæ…ËÑ®ši0ý, hC\ŽÂöÑ—mþEG·WÈBâ¼váÄ`;ôÐͺ€Èœ@³ª*ƒ±ÚU×#e€J¢%€(Û€é¡*4ÀÀ¢]ßÚ:tB‚¶–è—m´¥‚Ž)r-,G¯ÀJ yÖF_ë|‘T@ ¹?ÿO:Ecgð(°œ…¯:M@£u¦yYOèôýJªa ÕNõ]I4&†§îUuÝj] ±÷ÍVb9ˆÖÁY8c]´Jµ¯šà]ÜÓF†Óðt¡Éu¥ÑìˇµC?< OQÑcÅ$qã'þ (Q%òN™1Oa<ë¶?NNÁóÆßø¤…†f¦pîÙ9VHZÕàmå¢ÓÌãÄ2e’‹Õ…xª©5å9h#ÁV£Q¥ I—û=V0èØÇg÷Õcó;g ‹Î¾Ï³>æ¾ÞóézÍ^ã)1Ñvx~ÖWT=?qèJ¸ÊÁd6oùÈVÁ§Š×û|¯÷X›ŸnÌZ[Bpý<¸õ3´çxΧ6ÆSÒxÆ4’ùŒg0¨p&U€'ã_hí€ß¨`÷~ZaMÓÚ) öU v^uå¨Sôû}d™A [ÐñÙßÁÒn”¾‡(6TT¡â¹2¡³M:m…†Ye¬ïÀ`âæª/$JÞ­’J¾ë'øã9—ù¶s>!­Å¡òâ6x{Áù__hÃöoLtWd. šm|סx(Åh5¤I04v@Žj2Hc÷W] Bxû(Ñ`Ü,Mœ|ÒÉugÉh K ´á©‘þaRCò‘hÜì¤ñg k@] ™Â˜Fc¦m”À6Ï ÍQfD IDATèXÜ4³ ò¹›•õµÊïF’`Ãã±¾ }ö`ž¸·5ŠŸ˜®t¨ª y+ ,u®Ëã °¡Ú\cƒVGrš³®: .Ï1¬Ÿ¾;ÅL—úX±‚LSÉrÚýo«~ ’Ʊj‡ŠÚ^Y1ôe5|µÒ"…a·äÔz¶/Yƒq|rÖ¦ÔðßÔã¡ûç¡yÝiÑixÓÄ÷ŠOòõyÍðººÑðÌϺt^2ûù§Eü€Çs~óÓˆEQ¨\+Yn‡ü¾öu½§Ü$mTu¡9§÷ å_ï‚™ƒ# —pmxõ=]×{ã> ë]\¨LÅÌ›Ïxîu½ÏOßÅoZ7¼R§[1V±!R.,5¡Ü>|V?ž¦îŸÆ3NÞ*}±¾¢EBk Mãi‚;›'eué)Æ0.÷c$Œ­¼²¡…VΟã“>íõ«É2tºWç ^ã†ñÇ– †ê}~¸2µàÑP%=¶T Ô³¼àé’ÌMÃÐMëÂm§MQ­†ï´.¶jç|Û$ˆÚd¨± "øj¹caœÿŒ|X[œDã×àG¯w¾+Ÿn ù‰KV?UF“Ä<¬öÖT~K&¶¬U?ž.ާs!o&øµitÌÄôg¤ë½n%T_ï’—ú×"E-\ò€šíz×4žÁV©ø²áƒU¥›G½ÎÈ^×{lqcÒxº0ž¦ñ°å¯›ÖÏ5pÁõ?”È7×O4ÖÏáñl®Ÿ~~jX?Uëcξ~ÖëÂlëg²à }>uÖñ â­mŒg¨¸ŒûrÁgªÏðàM"Ãx¦ë}¯ù£HnèÆèâÃa˜Ÿn–ñŒÕHÒO1žª6D8*/¤p·&lͺ¦J ò©‡…:W[ÂI]Ù„°®8­‚86)¡nH5Ç»jŒ¤H…*øÃ˜Ô|3…EƒÀr.Åk#5mLÒúm†L£³o(uOU ¾,9åIØWOþ#¦-Š^ñ §s1u,‹ÔÈTbxTcëEįI¡=Š4\çÂ{Öh9žR4ž’¾\àLHÊ ½¼b ë…2ü÷æÇSê§3¾¯’Qo¼–Ü\tè ºö ªõfŽgýäW[ ÞÅß|¢\r¡”X5Ö?º¡gá4qÓ“ˆÔ¹&”S[IÑy“µºð*F]¬’ÉÃ×Þ>~ë¯ ‹˜I ´h`šÐÈY\ÈõÈ‚ès>1ÖØÆx‘m¼Qžºfµ_ØЦ¹§_¨E]ò‰=ÊâxVZ¿C¸„áqa<ƒÀÛ0È“tƒ‰ß”DÿƒÔ°ŠŽâ&\[;Rû…<ó7X .ÒC×{›Ä¸M>E¥ßBFHJŽ­¢ŒŸ¿ñzWñ id0áz9Œ¢ Ï|gÃx:¿51ä¥-)¢ÇS‡æg½å4|½§QklõÔëD¼ÞUûM ½Ô—3në„kSãöLãz>*®¡®ç§q®ŽTH´ñ×-TÃú©ÁçÉÖëÜŒë=†a\c~ÆñôÓnhýôóÓ%ï£ÔµAë61Z´Äqñv3¦Îs2ÑÇʤš;ÕPÑ%UÊß”`£¸ÑÖÒ ~0—F£åØÍ@ƒÈ6¡’ÚZÙúµ(Oó!'̯ŸUÃL³6×Õ f]Œ’JݯҘºE“_ãdË ê-ŒUª°~šÚ¶eH`¹úþ—Dòp´Þ÷puu°¨aì«kÃ[ ~ðÑ–ªî(þ!oÈÂh¨Ë@íœ.áÁ8®Ý&î|Úám8À„î(~~faZ™jàwf`ѯ í»W¦8äØc ä…•NJô]küZ`Tá\Ÿü^rU”ÈÑV…s~çg ‚VéÛ‰QF‘W^„b‘+`P¢o-ÊJ‘›ýÊf UÕöÛDzÖeÈ\‡P†mØz[Â[`ô$Ë0(}cf2´pôE|OD@;rVJÛ‚- ÓƒHžêËbg‚=¬Ulß¼ǯ>>ú ¿î ȱ§þ'­MÇ‚t‰~Q`øgý ’ž}k!âÆå¯TWßÈã^ký<TuíìP»…ÇÈE2bhš¦7[”éÝ šVö{·%@ðÿ¼ (ÃÓBô\qgžè¬mêîOÍ _\©ÿ#Òè¡vÍië®ë"…7«FÛ“º(Ú_dUPšÊ£«Ø=<·[˜fó‡¯ Cb·¹µ§îˆQ ‰Ã ´Y¹ç;þ±.Ƥ¶ .ÔXTá–‡Jm¸n×{çhgZª%É€”Û$ A,ëNñRHlÒâ÷Z…è¤|m\úæÓM6;ºÆûV…gˆø®RÚ'ž’B¢—Q˜ Ú á›ú;Nß¹A “ŽKÕNq›¶nߟƒN˜ŸU¨¢’Fk•hb©Zû½»ÔñÍ¥›FM#A ö¾ªbïÃ4ϼ€Q>‘ Ñmk¨'ˆº` bÓV†Aèψ*Äh,òô(‚äÅcÂùøïªô°ÈtFã“Ø 86ŸMÑ-S["†[´ÃpwÓ8ºU ûÛ°=Q„ï(kìPhÊ)Š›“цQFQ5{¤z3³DÓ Vӧ΂9¦“2ä­¤©§œñëTá=£=Šƒ ã XXä¹ÿ¶v:9a1µD=.ât\ª°÷'ëÑ$+4VÕzŒ,4{Š/%˜”»)S#t ô7èd%Ý«\hNnaDÃú©É…\­šãùÅʸ*vÀQ¿öB²0>¾¹w´_paMö×jöʰ3P[ˆfÉöA‚©‚6:>d)5†q®RÄÔ&Wÿ¸u$¨RoÅz»Ê%3®"3t_S©SŒø¬¦äúž"ZqWÀ%w6A‡2Ýš¤£a­ƒiøÕKÏM«o¥6IñUXdþuê…¸Æ$xö=¡§¬!WÖÏÄ{¬ þâBzDLa‘P­Îo#jýfâ}OCÛ9ÕÔˆb`ƒ÷ rbMÝwRãƒp4£uAX6îã¹HúÞL-*Ò¼ ½[qAÔ"¬&¥ßˆ‹Jx˜Ð†¾që< yŽª¬’RUÕ²,°/dï´€Y6su¶TÀûè~Îi¶–`ó9WÁ^):ó:×9¿ý7æ8OÌqn:σ8ïùì²1>˜1x&Æy¾óf_ßÎ㻚Ï\:˜ùûTÇGæy¾xŠßáSY'æûùtä:™ëgºy¾¯kGç±&êþ|®ù§i<Ÿ®5ì@×´ùÜ3ô)Ì+à·¿s”yþn¾ëã^ïrkÃ3µcŽû”>粿ïQðz™Ïw|0ßý¾>s–åÈvíÚB!„òôa8„B!X„B!X„B!X„B!„‹B!„‹B!„‹B!„P`B!„P`B!„P`B!„ ,B!„ ,B!„ ,B!„ ,B!„BE!„BE!„BE!„B(°!„B(°!„B(°!„B!„B!„B!„B¡À"„B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!„‹B!„‹B!„‹B!„P`B!„P`B!„P`B!„ ,B!„ ,B!„ ,B!„ ,B!„BE!„BE!„BE!„B(°!„B(°!„B(°!„B!„B!„B!„B¡À"„B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!„‹B!„‹B!„‹B!„P`B!„P`B!„P`B!„P`B!„ ,B!„ ,B!„ ,B!„BE!„BE!„BE!„B(°!„B(°!„Bm2!„<û¨*Œ1h·ÛTU…Á`ð”ßwddÆìÙ³Î9ˆ› ,B90‘""0Æ$!¡ªpÎ¥ßìûEœssþ®ª*HÇ™ù»}_DðË_þ_üâÑëõ°fÍ\tÑEÈóü Çbzz—]v6oÞŒ+®¸+V¬HçO¡À"„yáœÃ¿ÿû¿ã+_ù î¹çTU…SN9o~ó›ñªW½ ÖÚ!¡åœÃüÇ Ûí⤓NÚK|cpÏ=÷àÚk¯EQX³f Þóž÷ ÓéÀZ‹Í›7ãCúÚí6z½®¹æš$ˆ¦¦¦ð‰O|>ú(Ö®]‹Ë.» ý~ŸëñÇÇW\Á`€×¼æ5xó›ß|Ð+Ë2\ýõøÜç>عs'n»í6LLL@D°iÓ&Œã´ÓN£è"„‹BöFU¡ªøìg?‹¿ø‹¿@Y–A«ÕÂwމ뮻ï~÷»ñ™Ï|“““PUXkñ÷ÿ÷øà?ˆsÏ=7Ýt&''÷zok-¾ò•¯`zz+W®Ä%—\‚N§ƒ<Ïñ­o} ÿüÏÿœ^ûÎw¾çž{.Š¢Àää$®ºê* \~ùå󊞉Úí6ƒÁA «¦Ø<ãŒ3𾓓“x×»Þ…~¿V«…û·ÃE]k-yäìÙ³‡“ˆg&¹B9âöÚ‡?üa”e‰c=?ûÙÏððÃãõ¯=àÚk¯Å—¾ô%´ÛmäyŽù—Á>ð8çe²,K®¦p[»v--ZxüñÇÑï÷¡ªÈ² ßþö·‡ÎãÖ[oEžç<ùä“)‡êMozŠ¢ð‹¬1Ȳ yž#Ë2ˆÈÐ1gŠ»ækã95ÿ¿ù~Í׉N9å|ï{ßÃüc\tÑEPU¬_¿çž{.¶nÝšÞ¿ùÞ1¬y\cLú!„‹r˜ç9¾ð…/¤¨÷½ï}X¶lœsø›¿ù›ôºüãèv»¸á†pÉ%—¤Ÿç;ßÁ²eËpÖYgatttH`-\¸§œrJúÙƒ>k-úý>~ô£ Çw¿ûÝ$Zî¸ã~«îŒ3Îlذø‡ˆ¥K—bll k×®Åg?ûY”e¹×gšššÂ‡>ô!uÔQÃË^ö2Ü|óÍ)¯KDðè£âÒK/ÅêÕ«166†±±1¼ô¥/Ž÷Þ‹+¯¼Çs Ö®]‹“O>—_~96mÚ„W¿úÕiKð‰'žÀŠ+pòÉ'cË–-lÛ¶ þçžÞóè£ÆŸþéŸbûöíL'„‹r¸ ¬o~ó›é¿Ï:ë,EUÅèè(–-[ÀG yälݺ^xazýQG…7¼á 8çœs’H‹"f0àüóÏO?[·n²,Æ 055…v»Õ«WyälÙ²Y–á?øàu¯{TëÖ­ÃÞð|ík_ÃùçŸ|ä#xä‘GpÙe—áÓŸþô^[‚wÜq¾óïà­o}+,X€7âïxÖ­[ÁÄÄþøÿŸÿüç±k×.¼ímoÃ?øA¼ä%/Áøø8Ö¬YƒÓN; ?þ8¶lÙ‚;v`||¿ÿû¿ŸŽÑétðÛ¿ýÛ8ÿüóÑn·155…‹/¾Ÿüä'±páBüÝßý²,Ã5×\ƒ÷¿ÿý˜žžf‹ƒ„9X„CïÉÐÜÿýé¿—/_ž’Ù­µX´h¶nÝŠ²,ñðÃã’K.Á‹_üâ$ÊN=õT\}õÕØ³gÏ^‰èeYⵯ}múïþð‡È² ?ýéO155…¥K—â-oy ®¼òJôz=Üÿýxõ«_ïÿû€ /¼ããã¸êª«°cÇ,]ºûØÇpÜqÇaýúõø§ú'|ä#Áå—_>tܱ±1ÜxãX¹r%Ž;î8|ô£E¯×à 7Ü€³Î: ãããøá8þøãñ…/|CÕ###¸õÖ[Ó{žyæ™8á„ð…/|°dÉ\}õÕ˜œœD»ÝƧ?ýé•»úê«qî¹çbjj õW…o¼O>ùd“„\§8„Cèét:)Ò"")ÇÈ9‡~¿cÌ…BbÍŸEªªÂK_úÒ´=v÷ÝwÃZ‹ 6`0àÄOÄ+_ùJ´Z-LOOcãÆxòÉ'±sçNÀ«^õ*ìØ±·Ýv[N§žz*ò<ÇK_úÒtœ»îº+g} .„1gžy&FFF<𦧧‡ÎuëÖ­¸ùæ› å€Í´h~Ιâ4úo}æ3ŸI??ÿüó!"8ýôÓÓÏÖ­[·×ßBæ#X„CžfNS39»)¶æKôÑ:çœspë­·brr=ôPŠ˜]pÁX½z5ºÝ.vïÞ‡z·ß~;YZ°`vïÞ*wìØ·½ím(Ë7nLÇÙ¸q#N<ñÄôßcccIÌ,Y²$÷®]»P–%–,Y‚׿þõ¸ñƱk×.üÎïü^ûÚ×â¯ÿú¯qÒI'¥¤úù TUŦM›ÒÏ.¾øb”e‰-[¶ £1fHÌBæ#X„Cç–/_žþ{çÎ)zãœÃôô´‚̲Tx â£(Š¡mÂ[o½5‰£×½îu8þøãÑív=ôn¹åÀ _øBŒŒŒ ‰ÉÉIÜxã¸é¦›ðàƒbll ­V ½^ox16³/ÇÑDµÓéàÚk¯Åïþîïz½n¼ñFüÖoýÖ¯_?çßÏG”HçøãÿcccÈóEQ0Ñ ,BÈáBUU©R~þóŸ'kªª°mÛ6~ëðùÏþ'j—e‰sÎ9'ý÷Í7ߌ7¢ÛíâÅ/~1-Z„N8€òDµvíZt:´½«W¯Æøø8&&&Òÿúý>ÞùÎwÎiD:>>ž¢FGq²,ƒª¢ÝnãK_únºé&¼à/lÛ¶ ÿøÿ8çg™í³Ç÷šyÌæ9|üãß§Y*!„‹òb0àâ‹/NÿýÕ¯~£££h·Û¸ÿþû155øßø ,^¼x¯¿9KqKn¦QUuÔQX²d àßøƒ.¼ðB  üæoþ&à§?ý)6mÚ„v»¾ð…€n·›’ÃwíÚ…õë×cbb»víÂøø8¦§§÷.ÍsÚ¸qcŠÂvÚièv»É§jbb¯zÕ«pùå—§mÄmÛ¶Íjý0Ûç6ÆÀZ‹²,Óg€¯ýë صkvïÞ©©)LOO3‚E!äpÁ9‡W¼âX»v-à†nÀç>÷9Üu×]C~Wû·›¬šQ¥Ÿÿü瘘˜À† fíY("èv»8ùä“ ¶ .¸eYE¸¢¹èèè(Ö®] UÅâÅ‹ñÆ7¾€ß¾|ßûÞ‡G}"‚xŸúÔ§öŠ Eçî¹ç|⟀s‹-ÂïýÞïÁƒ{ï½ßøÆ7Ðï÷1>>ŽoûÛIT­ZµjÖ\³™Ÿû±ÇÃæÍ›ñÄO`×®]ø³?û³ô»w¿ûÝøîw¿ ÁæÍ›ñÅ/~œl„$Lr'„’,Y²W\q.½ôRlذôG”~·bÅ \uÕUX¾|yʇZ¶lÖ®]‹õë×ãÁLÑ©æv\“n·‹O<ëÖ­K?;ûì³ÓkÏ>ûì¡×ᤓNB¯×ƒ1—]v6n܈ï}ï{¸å–[’Œï}饗BD’ èm·Ý†U«V¥×¬^½W^y%N9åEûî»ïyÏ{†Ži­Å™gž‰?øƒ?HÉù‘(¾¬µxã߈¯ýëIŒÞwëŒ3ÎÀ‡?üa|æ3ŸÁÖ­[‡ü¿`ýúõX°`'!ìܹ“.r„CUE«ÕÂc=†o~ó›¸ôÒKø(Ó§?ýiyä‘(Ër(:µiÓ&Ü~ûíØ±c–,Y‚+Và /œ3GkÆ X¿~}êxþùç£Õjðö×_}ÚÊ[±bÎ9çœ$èâ6ÜwÞ‰|Û¶mC–eX¾|9Ž=öX¼üå/ÇÎ;±nÝ:ìØ±“““ ÁÑGÓO?+V¬À`0€ˆ`Ë–-X·nž|òILNNbÁ‚X½z5Î:ë,,Y²UUaëÖ­¸å–[eŽ=öØ$'''qÓM7á±ÇÃÈÈ–/_ŽóÎ;£££Üwß}ذa6oÞŒªªpÔQGaåÊ•xÅ+^‘>/!„‹r˜,ÀoçíØ±çw~ñ‹_`É’%¸öÚkñÊW¾rÖÊM1Õì 8s›p¶­Ãýý¾ù³™ÿns¶¿ß×kæó^s}†™Ÿó@Ïrp0‹rh>†¤pÀWÚ}èCªU«°{÷n¼õ­oÅC=´Ï¿‹Ûü÷Ì×íïøûúÙÌÏ<Îly_s½f>ï5×ùÌüœz„ƒ\£Á"„<°ÖâÀ¦M›011óÎ;cccB!„ smçío›Bž)¸EH9ôŸçQW„ ,B!„ ,B!„BE!„BE!„BE!„BÅ! „B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!„‹B!„‹B!„‹B!„P`B!„P`B!„P`B!„P`B!„ ,B!„ ,B!„ ,B!„BE!„BE!„BE!„B(°!„B(°!„B(°!„B!„B!„B!„B!„B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!dn2‰¨ê!s®"Â/ŒBùõW##]ˆùõ.`rrŠ"‹B9&Cna w !„§ 濾B!X„B!X„B!X„ÌE³ÒðPª:$„B(°È¯-"‚A1@å*VñB!sÀ*Br@¨*ò,OÿžK„ÍüŠ1B!X„ÌHFoy_¾õ«øÁ}w }Ì$:GíÆ@waIûhœ¼ô¬\¸«œˆ#:G`A{µÄH¾VšÓÌA¡]„BžÓÈÎ;™HC ªX¸hlN¬Í;¶ãÜügÜÿÐ8å·8ò)€@¡pê(Œ±È 0ÖZ„#;«°tôh¬^x Vޭı‹OÅÑ Çò‘çÍ<:î€D×®ãh„B(°È¡+°þùÛqÓ÷ÿË^¢8í Lµ ¢ÈÐ{ì-z»áuF,Žì‡“Ž|Öñ"œtä™X³ø$,ë®Bžg€ÿ-0»è¢À"„BEY%ìÚ3%o8hàů›ÂóW¶Ñ/,æ£oüö¢ES9Uê0YlA©ˆ¶I‹ºG`å‚•8nñ‹°bôh¿èExÙÊßÀâÎÒYß—‹Bȯ3ÌÁ"ûÁàO> &€N‹Œ _" @fT@è."P¸‚ XØZ>ôweUâç;~†Û ˜.÷à£ç|œp1¿B!Xä¹Eé*@ `Mc°)®PŸ‹e­…snŸ‚Ëÿ…BTÒÛ;–þ®WNB%çàB¡À"ÏqæØLV´[À£Û·cÔ-ÅÇž…E  ¬ <¹çAlÚýe‰®]X‹,hV¢?˜F.]XéH!„‹ ®í¶Åw¦Ë=OB!Xäp×V~¿°çú<ü<\óÞ¡tEØþ¾¶à ìIDATá:¼í“ÿß¼ûv,D >úšÏ£›A¤ÀÆûwãE'¯Ef38u0Æb¶¤yB!„‹6ˆ ´Ubç&Á¹§\€£á‹Û¾ÿãÎ?ÂCæf\ôÿüW<ºýqŠ%Ýå¸äEŠƒ-˜\?…מþþoD°­· ;úÀiÉÁ%„BE_lK±þž>.<ë•he9lðÐúƃ_Á»Ï[1‚jé.üÍ? #œ–xíª?Àø¯ÄO>·ÿåÕo ¨ xïéß;å½èd£XB!‡yÁ7pÇû6â빕–0bñÕŸý¸ïÉÊ¥GáˆUãøØW¯AoPB`ÑÊ3ì.žÀô`ÓÕŸ O!„¢ÐÉ4* SdX{z_ýÁ5hÿïQ\ùÞ0PTX»ú8-a%ÃW~v ®¼ëm‰ràðâ×.Æ­›¯Æ{o¼ Çu4žß„G÷¬ÇT¯Äh¶ ƒò—`B!‡,Œ`‘ƒÆÇ°¨r¼äܾ5ø[¬ýàËñ­ÝÓ F2|ä»ïÂÿ\÷^ŒØ¥PuPò*ÇÒ£öîÆ \ƒvü¦û"LÂ"„BE{™åó±r÷ü%°+Öã¿x§—_a›ïÔ¥gaQ{TÕ ( €SAYY,n Q=h$Cn2Š-B!Xäp•XP–Š•G/êf|ã‡ß†ÀÂi‰ß9å]øÜëoÃ1‹×`²Ü¢T>ÍJPhc€×TÝ|1V/8Ê„wB!Xä°FÎ:¼ì¼Å¸äÿ;&¶CÄG²ŽYôt³QT®¿÷Ÿép”ªÔŽ]|,–/X¹×ï!„C&¹“ù#ûÓW X¹Z¡ÝMxýÿ¾ïÓ»0Ú]„^1…½-X”¯BÚ#ô˜.Ç¡ppê0ÚZ€?~é_c¬µÜ"$„BEžÛTû zJÈÇB/ÃÒ#å¢_àêŸüŒ¨Sd&‡è•㘮v£r€‹EX½äxÁ’—`ÕÂ5øÍcß‚ãŸÄíAB!Xä¹Îp$É'¬Ë^?ó¯T 2Èeî 8ç|ž–*–¶ŽÃ KÏÄ©GžŽS—…㟂ã¯ÀÄ¿ô•†W„B(°Ès‡ãŽZ‰cžÙòDF+Õ8­àPÁ©C&Àô°¸³ ‹ÚK°´s4V-ø/8vññX½è¬\øæL¿èEXµ` Úy~ûPŸ6ñDE!„‹<çVLÞ¹½þ½¢zVÄ!„C æ`‘ý«ð d|„ªšõw„B©¡Ñ(!„B!„B!„B9 a©!„ò´Á$wâ (ÊC"iyõ„B(°È¡¡¯D0=Õ;¤Î—B¡À"-„BÈas°!„B(°!„B(°!„B(°!„B!„B!„B!„B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!X„B!„‹B!„‹B!„‹B!„P`B!„P`B!„P`B!„ ,B!„ ,B!„ ,B!„BE!„BE!„BE!„BE!„B(°!„B(°!„B(°!„B!„B!„B!„B¡À"„B¡À"„B¡À"„B!X„B!X„B!X„B!X„B!„‹B!„‹Bž:UU¡×롪ª_»sSU E±×ïœsè÷û(Ëò×z|Uý~ƒÁª:ëïãÿÇÏ2Ûë5öõÝBEyNc­Å¿þë¿â5¯y îºë.cöyÃ4Æ Ë²!0×ÏŸŽôÄÄÞþö·ãSŸúò¿Ïó×_=à%/yIºI«*¦¦¦p÷ÝwãyÏ{N<ñDTU5¯è™1_þò—ñ'ò'è÷û³žÏ\ÿž9&ûûñw"cÌ>£ƒÓÓÓøÎw¾ƒø‡À\0¯÷ëwsý~¿›ïgßß9íë»#ä`È8„C™v»G}÷Þ{/Œ18餓°fÍEÇoûÛ±}ûv<ñÄøÁ~€¢(°zõj¼ímoÛëçgŸ}6~úÓÿ¿½{Žª<ø8þ={²ÙÝ\HHÔ¥ˆ@¸ˆ4¡X¥#ÓA±M«8Þ:Š^f¨m@)¥µŒÚ©•:Žöâe”¡Pê8E ‰2£‚Õ±0L ir—C&!ìæìfwÏyÿxßó¼YBûÎÛñ÷ù‡ÉÉîsöyžaÎ/ÏmwSVVÆðáÃÙ¶mǧ¨¨ˆ/}éKD"‘s¢P(Äúõë¹úê«)((È ñxœ­[·RSSC__Ÿ Oétš††:;;)++cæÌ™ìܹ“ÂÂBÊËËyî¹çX¶l#GŽdûöí2zôh.½ôÒ¬ÀÙÑÑA,ãŠ+®`×®]ìÛ·œœ&L˜À„ Ìz*˲‡Ã477ÓÚÚŠeYŒ7ŽÉ“'¹6Ìó<8@{{;S¦LáøñãÄb1¢Ñ(‘ÉdÌkNŸ>M8fâĉLœ8ÇqΆòòòØ·oû÷ïÇqJJJ¨ªª"èéé¡©©‰îînJJJ¸êª«…Bd2™uÿûßÿÎÁƒÉÍÍeêÔ©\vÙetttÐØØHoo/#GŽdæÌ™¤R)Óçê;,ù\Y·no¿ý6ñxœL&èQ£xâ‰'¸ù曩©©¡¹¹Ù¼nݺuD"æÌ™3຀V¬XÁõ×_OCCëׯ'•J ™3gkÖ¬!cYÄb1ó¶m›ÖÖVZ[[¹ñÆÉÏÏ7ŸÓ¶mvïÞM*•â–[n!•JaY©Tйsç²sçN p‡ûº:¾óïpå•W²lÙ2ÚÚÚ¸ãŽ;xøá‡Y²d ®ëšòßzë-Þ}÷]&NœÈ“O>I"‘Àóø ?úÑèííÍ .–e …x衇xá…8qâáp˜P(ÄæÍ›¹üòËù裸ýöÛÙ»w/Ñh”þóŸŒ3†W^y…Q£F˜º;–ßÿþ÷f¤oÒ¤I<ôÐC<úè£ìÙ³Ïó6lßúÖ·xúé§Íú²¡úNä_¡)BùV__ÏÿøGÒé4kÖ¬á£>båÊ•œ}:‰D‚]»v y饗hll•J‘L&I$YÛðû_÷ª®ëòÓŸþ”qãÆ™Q-€çŸžP(ÄþýûÙ±c---ìݻ׬ËÉÉ¡¾¾ž¢¢"f̘1`=S}}}ÖôSss3 ”••qÏ=÷L&7nwÞy§©_&“1áÅu]‰‰D‚t:=hèß& .$‰pðàAÇ!‹QWWÀªU«H¥Rôõõ±råJyäÂáð€©Ðïÿû=z”§žzÊD×uÍš///Y³f‘J¥H$Ì™3‡ŠŠ ’ɤi«þâñ8/¿ü2®ëò§?ý‰qãÆá8©Tм¼.¾øb’Éä? ¿üå/›)¶ÜÜ\***سg–eQYYÉúõëY·nÓ¦M3÷:|ø0dôèÑŒ?Þ”eÛ6Û¶m£··×¬+صkŽã0~üx† fŽŽð§½>«61b„i“ÞÞ^>øà¢Ñ(#GŽ$“Éàº.¥¥¥TTT°uëÖ¬uIþˆW}}=‹/æŽ;îÈúýY,Æ #//X,F(Âu]³îìÌ€å¯7›5kÉdÒ” yýõט8q"@ÀÜûºë®#•J±{÷î¬ò®ºê*‰€™æ;v¬)3NS\\Œëºfôk¨¾QÀ‘Ï¥`0xÎþ¿¢°°Ð Û¶Íš«xáÆodêÔ©ÔÖÖ²aÃ8Àï~÷;3õ8{öì X–e Úw"BŠÈ$?ôß fY===ftÄu]ª««yúé§Ù²e ×^{-žçqäȪ««yê©§²®ï߿ߔå€Ù³g³bÅ ¢Ñ(žçaÛ6Éd×uÉÉÉ!77—ÚÚZŠ‹‹Í”–_N,cÛ¶m\yå•”––š³¨ü5\/¼ð ,`åÊ•¬ZµÊð׿þÕÜ?‘HðË_þ’üà|ûÛ߯²,–-[fB‹dÃù´‰çyÜzë­$“Iî¿ÿ~fÏžmN]»v-•••æø…S§N™©Ëx<ÎâÅ‹yýõ×Y³f Ó§OgáÂ…œ>}šÞÞ^Òé4Žãðâ‹/rë­·²`ÁlÛfÚ´i¼úê«TVVÒ××gÖ¤ù£ƒžçqÓM7±zõj–.]ÊüùóÉÉÉ!??ŸW_}•’’Ö­[Ç’%K¨©©!›0ôÛßþÖL+ž­î¾Ó§Ogªxù$>ø ?ÿùÏyøá‡qÛ¶q‡'NFÉÏÏDz,ÚÚÚ1b™Læ¼ÚÄ¿¯mÛäääpìØ1eeeôõõe…Aÿ¶ …Bf*3•J™¯²I&“æžÁ`£G’››Ë¥—^J"‘ ‰˜òmÛ¦§§‡‚‚‚¬6 ƒ?~œD"ÁÈ‘#ÿÝ››K,£££ƒ/|á ¦<3ZpFÝûØe2Óçžç …ÌBÿP(4h߉hKD>_þÏ(ˆ¿æ§ÿh"üŸýSÚËÊʲ´ƒ]÷GD†N:ÎZûÿ=æ‡˲ؾ};ñxœªªª¬©3Û¶Ù²e sçΰ¾Ç//•J‘ŸŸOAA;[}Ãá0åååxžgÂ…ăFÎÕ&þ5ÿ\ªh4 `¾2¦ÿ®È3Û²;ù×ÎüÙóŸ:ÚkÔâ@ÍŸQÑV­¾ŒD†¤ðt,¿ó’ ܶÇ|Ú¸~³ …»Q«)G·¾› ªàH¤Gåbqêý˜;‹W=>࣯¡ØÁ/—| •\]åo VSƒE‡?­;3*sãÒ )ÔŠdÇÌά§¯JñX—{»£­¾‡ÞýÊ’¿ ^•‚5£¸y?ºZ¡`B1!r Öæü’Â'à˪ÿEIËhôm`$2¤¨sPý4&ÅÍqûn¾¶ïO¸uèK§‰‹™Ñy°Ûíøàü/PÒJζæ^Tu• ª«e7Žã‡³ß€$ˆ ¢ï¾´ ‡êv±e­¾ÿ¼º}D¾~³ [Oÿý¦›ì5‹Í„:mê´h쾄G§ýdTÎ̧³Í°£äuØa#ÞÑcèBiëQ”¶ÅöuÅ>×ã¿Ýö]_C8u}/ê´¸vóªßdlµ[¡Õ·ãtÓ×(m=†Í‹>À8u¦_u1N^ß‹¦ž*Ôh.¶ZÙq ÕšdDMÇåÎa˜¬VÔj/àíÓ/âÅùÛˆ w4¶?V:@Koq1Z™àeu8H èûÓ~‚wÖœÀ÷¦nb¯•·}ƒ³Íˆç»/Μw×Rl+(Äšìxí Á¬Ãûg7³ƒ|"ï¼»¶«³žbë6~Žê®RÁÎÌ·Ý—Þ!œôá)/áí‚ãx»à8^˜»9ƒFàk=¾à£¯!«ÿÌ£! •ñöuÅì¿·¾³w§>ÀÞ3ZõØsåOW`îóþÒ÷Ñú¿£Fs“ãæá«àÑÜÍNÎkÄåÎbL‰›ïrÏ;öU(ŠíûSnºÇÐI\ ‘‡{vèæƒDyFâ2ȤrÌLZÎ9/&ÊE×öåeéCÎ(0/yµ×ž¸¶Z}[ž¿ŒD†Å©ë‰zgšö vh¾mô›º‰ëóR Ì(Ì(1%~>6·W=¾à£¯auL, S¾‹ß¯:ˆ÷ÖžUÆaÁ‘X?iƒK€Îߺðk²ŸR¦Âìq÷ºÜ+È~Úí½Æ›WD±ý±ÒëЋžsòüótSO5QV0!%£"®7÷ÖxUn‚*uТ¼vðÂã¤ñÊÂáÁÑá_ìÐ|ÛÈŠžA\ßUþÌV£Ë{}­Ç{GÁC_.†ó,Tr5¤Ft+e*ÎV´ÏïºðãÂ3ÝöÑÛ=£e@ÛKðþ°¤×¨qkLŒDær¸w†v Ím‡eÒ`¯íµöÕå {¸­Ç}?ðmã‘Ü—ñæ‰gÑ7¸Ÿk9ˆÖÞ:<7û¿ˆ@¯õÆŠXÑdÜ©kAaÃg¨Ö”¢K× ƒE7êþùKßrF!èž¶ïO¸]¡•²Pâ"÷·MnàÃCQ7nôÍb3“?µpV¦¡ÙÉ]ðÀz³oFbà̦|À·8U2^Z𡘖¾:ügᓸÜ1|ôµ_ðÑBdÜØ}¿>ö(Õý×n^…ÎÜëbc¡‹±„PÛ÷—<®ÐQÊb{¤3õB®t?kÉ$Á„Ylf0lœÁÊ9+¯œQ[˜¡ç¬6‹×*%ôN3ÿ¶5…K¢*JH‰áðÓÅ;ðnñ&v+¦·èðΙ—ðãùÛ3ƒW=>à£/ÿ‹+ïÃd58Q€ÕYOy\YüÙ—±‚PÛËqK %"›¸¨¸áñµ‚ÜÓ˜zÝÎJêàŽÆe©gpå6xí`lè8ѶÖb·©ŒÃË ÿ¹ ‹œfq >­Ü*¨ž¯à£/¿¾»’äü$AÒoMc¡¶?–ã–À4'C€jçÐ8÷wÅ]“c+ÀÙ2$sŒ.=r*Q¾Ñ×è3v{í`vL>Q.ãÄÀhÚf”xzÆëĵ7A‘‘ê•·ÀËûWá?ö¯ByÛ ¯mòÑ—¿Æo±šÈñI•ì$í+ln¶èc¡o¡jûþÒ;›‘@nÂ"$…¥³Öü¥­Ç`´è¡Õ·cg靨{3—/­ê*…ÕfAÙBâz~"ÊŸ—²†(­ÿ&‹gš½‡á—¤=™dx óUÕ7í‡Éb€ÎÔ‹ÒÖ£x«è‡£Rß6~_ô<.Ü8ƒY“Õ€³œŸ3¢öµ|\ö[ôµè3jññ…ßyí/}ùcü–ʱƒó(nÞïýìωWu–|+ú ¡¶ï/¸³Æ˜’âù9ÿ-'ÿý è-ýØ~î§ÄÃOÎxÍÑÙ¤8Û|Û¿¡ýóêv—¯½ò—cFâ=ĵŒèiXœºß4þcpvù/|u7{_% ¾BLhž˜ñ >,yV»f›;J_UQ|Û¨Ö”z] ²ŸáUo0R2üß‘¶U<ôåñÀŠôG±³ì×lyë顲p,J]ý5¹™ˆNÿÇÓ/°ÿú¸d,ô-Bmß_:pg3Ìð> ¯.Ý…£õŸ ìÆqtèš`±™1 +3s2& 6Ìy §®ïÅ™¦}hé­…Þ¬ƒR¦B²: óSÖ`θï¸ä=’»‰apâÚ´÷_‡T E…Å©÷#A•Šß>î¶ß³’V ),Gêÿ†ª®të;`·Û¥ŒGfL¤|wÔÊâÓÆÏïDqó׸ÒyýMìù*5r2–¤=ˆì˜™¼êÀcÓî˜eívüëôŸûpæòM_þ¿cÇåø®ø`í.´õ5"˜ ÁÄØY¸oâóH¤nú‘Ü—!“£¢íúŒÝ°Ãþ­é[Ðùt¶ï¸³™ 𯗂âöMADAAš‚‚‚:4uh êÐÔ¡)((¨CSPPP‡¦   MAAAš‚âvs§ ”r[QR‡ TÀ‘p]%@JDf%­Ä¬q+GL5DAA [n«ÝŠ£ÛObGékøÃÉ ‚2@RPP|˽}]1¶âa§äã5š2|Èóî)((ä -g¸gÂC¨×^ĹG–ŽŠ¶¨Ñ”¹¥máÃçãÌd³[ñiåV´ôÖÂh@tH"–§?‚»ÓÔo_9‹´møÙ¡uNG [ Ž)‰ÍV6~½œM*÷ÆÊ/¡Œõض/2èÒµà‡ïgŸ ‘…cËêClÙd1`ã¾å°ØÌ‚oÞû%Âò` •3—éw+¾à=~g„Ȱe5™Œþý³›qa0óG$øÃêƒlªgØ´o%úSýfùçˆ Mryo¶{®lGCw%û GÕ39ªÄ’‡ØüTçÐCÈOZÆ:47pqh¡|>Ç>ÃŶ"ô8åJîÐ5á¯o¢Sׂ§üÈç~òå,Š I@\h2›SÊj· ¡û2²b†ÇV«-g9EãÕ™}•ALh"q¸iè`ûwSßɾ»ZSÊ&¬Ë‰Í'œY¨œÝñ1 ¡“ÕÕ€¹Ú6D…8R0,¨læë²Ã†ËÅÈd¤èÖ·³Î¬ŽvëÌ€#å“Õn!úðöé±qÁ»D2 ±å!Æ{ú =„¤ð ¢ÜÀÉ9>Ÿ¢k{ÐcÔ`ýÄ ØZp Ó†ÓªÛ…Zï4,B8‹&ÆÎ&ÞQëD†Wœòn{#_ç+ƒÌèéÄó­}ÙTÀ‘mÒ=†.Ÿ{)„³H)S!5r{Œ0ZÐÜSƒ”ˆTužgàM_à5ÂWw…¥!T¹wp…®\ϺÝn‹%g.ßñ'«3,UÂhÕ+tE{Ì6#‚™<4u#ÊÛ¾qÚvŸÂøˆ‰ì„+—*ì…o:˜Qú¤oÈC¬÷ô m²8«©šœ9Eä1 â|¸bæœÉ¼A(gÑ$—sd9±õ€Üø…^Ûæ+ƒ   d8m»oô5Àn·³çg¹TA¬tbÉÙݤÄgüR ƒ´ÈÉìõN]3Œ=JZŽ ®Î‹’È®²p±ýŒ=:uÍ€´È)ÄŠ(þ’G ðrùu…îá¬|qÆE1yŒ¸4­ÁR¥ÏÏ å,ʉ¯ªw Ÿ#µpOúÃìù‘‘È]‚G\‘Afôtv%3Y èhaWèÜ„E.lŠþâ‹â;þôèi¸Úuž VÕwW¢²ýGÎk˜7—]‘»/¡ª«„]í3¢rE±KÉ#x¹üºB·ö’[,ÎùOL#î;:ä.ŸŸÊY”5•˜8j4Щk†f Õað1ù#R• ‘÷}¦iY´R”6|ßñsZûª?„Ùf„’QarÜÜÁ`Û\"B} æÏÃÏ{‰pó¿ä¼\~uè󭇉óóœäUÄ}1yŒ¸‘Ìt³¹PÎ"©„!Ø#ûŒZoøÌ)º»hĶ…È YE8RaÃn6ˆ79~ž(mø¾ãŸ5•¤Uu9¨pò—°ñŠŒ¨iÄØjµå¬ý¤EN¥ßþ’‡XüTçÐ&«GëþŽó-Ã_1Ýö  ɹß4p£×Bá/yˆÅOPghw}•Ÿ¸Mù±Ëu1xŒ6ísÝb®Ìx ©‘}~Çh8‹&ÅÎáãgñqᙈäP躃PdFO'"Ûž¶ÛbÉÙøŽ?#jñ3¡Já²²MŠ›‹Šö"ò9‘¶Ûþ”‡XüT“I´ÈÉX0~-¦Æ{^©FËc¤dBa°è"S!%"‹Æß‡™IËxöW8gQbø¨1.gxo“ˆ!î9:,8 Ù±3ý&gOà;þŒèé8Öð)[ž‘¸Ô%r=Ùé-äå/™ûã½|9ÍFÂ-ÇmÈÔ¾¿ú#üãÊ{€W—îrùôõvÇ>þ@CE0zXm4Þ¼Œ#õc·¡w’1ßéã§}›À]¼ L‰ïûñ¯ièø)¨C‚£0)vÖM|Ž×oàtüb‚òCSPÜFø~ö ùºž£ÃIEND®B`‚qmlcamera-menu.png000066400000000000000000001760461225012771600336720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/images‰PNG  IHDR€hHPÝsBITÛáOà pHYsÄÄ•+ IDATxœìy^U™ÿ¿çœ»¾kw§ÓÙÈJBB‚È„U‰AdwTœ:È¢ˆŠNcQ5Š–¢¨È .3›È6È6("Ìš ŽÃ2B†Å¬Nw¿ëÝÎòûãé¾4!o‰é$}>e¥Þ~ûö}Ï}åÜï}v†yËa±X,‹eçÂÇ{‹Åb±LD¬[,‹Å2X¶X,‹e°l±X,Ë8`Øb±X,–qÀ °Åb±X,ã€`‹Åb±XƧão’¶(—UœºÂËšmø‚*C’Bx„€”HSp]0¶Óm±X,–=D£rÁôú?ˆÉ“Bßk¾üŠ7c†Ê´‚çÅb–eZ9®N å–«œ‰d`‹;©/Kh—#sÁ9\Ì M‘¥à¾¥vÐ:pÇã@)d8´‚ã!K'N!*¡¯Z-¸Á6OÃ:5âð ~Rk2/4IÒ3eJmh³Ö™ãò¢àY–%I¢µB¸®Ë9’[,‹Åògá‚f£Žv{¯…‹6Õ“þ-•}×û  ç*MÅð<'(h­À¤ÃuÄéÔE‹7>û,ïíå2nƒ Õj ŠÀ¹_ƒ PZ¦q³c ÅB¡eYš¦J)ιã8BÆXd ¤q¿Ú=yËÆðyþ'÷Úk¯©S§:®ûšãµÞ1f±X,– cFgr¨Þxjõsß»ú·ßuà…ÓgEaZ#‰áûA©·›hE(ˆ³â”rRo³ à;¼=°¡:©R{þ™‚Ó8ñ¸“þöŒÓ9äI½ÝB8 ¥a;&í‰ñ1ç1&I’þþþõë×ÿówþù–¿ Å)|ÒÜrÏt£QW©‘¦S¶UG ±ô+ådýà2ˆ¸·È{ðÇ{ϵMX(Ð!Yš2ÆÇ1ƼfA‹Åb±¼A ¸VJ¦’XxÞoŸ\ýÿÎüÈêÕO; ŽŽŸD)¤FBi¤m/ðS(© •r\ßÒŠÁVøöƒoºêÛ3fÌ(IªFC•Áq;ø ‰cß÷Á˜VŠ‹«ZI)œlÍ‹]~Ò––†!áOÛ+©7lÛÖí,À¾¦#¤Ã׬ZùàÌ)“%)óÇÑZK)…ŽpF¿¸m›Ø‹Åb±ü)D’ùÒv»z:nñ زaé§žºâÉÍbÚ VÒ(x>3™I¯\L‡j¼TÕí–¶~Δê}?ùÑÌÙ{{‚ƒ$I`Œïû‚3šíb ¹f23Ƹ®ËÀ¤’®Iáx/oØ|È‘]ÏzüDØvòWgæÒº#å¦5/<ÿÌÞsçÔ†ëÕ®ž×/?“Y–e…°°C.Ìb±X,’)€‘:˸ë*¥Ÿ|jõA} ¸Ï‹=Æ«hÃa8 ‘&h†V\îëiô¯Å¦_øý{Ï›®X˜»d ¥æ0œsÃwL®R’&Œ1!„௠*3`xhKWwõ…ÿ{qÁ>K¼i RÑ §“mó<Ë²Ä \5Ø|ÿûNÚ{î4hYíêI<ñj¬Wk­”ò\×s„1;(½Ûb±X,®u’$N !˜“9X¼téñËZùøo‡‡‡Ý¾²aŽi6á¸^©œ6· Xr»+M›%§Ÿõ·sfNEÚ~(¥6Æ8˜ãÊÀ¨•x.¥ cÆŒ±Ló®îIÈZóçM?íý'ßõЯýî¾$N!¶ý¹X©Àáõ¡ÁóÎ>£$ C¸LŽýÎ9ç#?Ú$hËÎDJé8N’$œs×u“$ñ}@–eÆÏó$I’—ÉÅq€Z­V­VÛív¡PÐZóÑÜ:¡”’Þáœ+¥„ÆƘÖZkí8N³Ù,•Jô'ôçišzžGÿ 3§i꺮1†þ*?•1fì'Réý-“_HEaÒ‘Q‰QБY–i­é`Z¤R*I’B¡¯^c„´rZ^þ5*¥´Ö®ëÒÚív†tCIÓ”Nn±ì4˜aÁÀ<ÈÀüûs>ôÓ;ÿ£¼ðF-ÏÂJ%ª ¥\0¿bb©¶:I}àœ3NÓÌaî$8ÎØ´$Á¤Iâû~¾‹i+  NÛGJéº.Ýò¿§ÝJo²Qµbä#rùSiÛ ‰q¸;çc?úÑÏ*=se ¶}Ý9sŠ1­5Œ™?>º0+³–]JDp]×uÝF£‘K…뺌±$Iø¾Ï9o·Û¹P¥iZ­Vä*;44$¥ÌO˜‹:!Dš¦Œ±f³Ç1íÆR©”e™”ÒÇ1Ïójµý«µ&y#A¥A¥”R i-­5}:œ”;Š")¥ïûô4M †¡çy”xA £‹¥câ8¦ó !èÓ•R¤ýô)ô¢T*µZ-:@J™ÿ ]—çyQ ÆØæÍ›c¾ï«ÕµÀbys,\¸®+¥$%“R‚1!„ÑšÊb•RŒ±™3gº®»™¢-S*•hó !â8Ž¢ˆ¶j±X¤§ív»Mû‚î$I’ä7œ|ozÊw]Àœ9s` c¬“úb{캴ogÏ™CodYfí\Ë.B½^眓X.—´Z-J)ReÔ.& C’:Š˜RÒ>ìîîv'MS²MéxÍfiy©T"Ýj6›d"ÓS0½ÙjµHÔËå2ç<Š¢Z­ |Î…³ÑhÐç¦iJ{^JY(êõz»Ý.•Jô'ô¡ôÐÓÓ£”j4qçrž¦©Öš®@ŽãdYFg¦‡z!„RŠÞäœ(‹t õ  {PEô½…aH·›îînZ9-Ûbw¦Ïšj÷äy`L)rüRS !´ÖFÊÙ³goÿøà =ôйsç.^¼øÚk¯¥âV«Õn·9çyxæÌ™ïyÏ{({ãÚk¯½çž{T*•Nç—RRi®m•¥”Bçõt`2=Ïhíz]’uIYv’$Y»ví‚ È|<묳.¾øâîînR2?c ySûúú( @©T"ËsN.YƘëºY–=úè£GqEz¤”ÝÝÝ<òȘ¢ïû+V¬8öØcIœh;A@J €”¯Õjå¡ V«U«ÕV¯^½ÿþûk­¯¾úêgŸ}–~[­V›Íf¹\®Õjä^NÓTáû>ɹçy$ÕŒ±«¯¾úW¿ú€ü1‚®%ìü¦°~ýzY–‘|6›MÆØ¤I“hµŒ±v»MYcRJz>X¹rå¯ýë?üát™ù‘¢sìÊbÙù8Žc¤D–$3:%*aLbçÛóÕAÇñ–-[¾ô¥/=ýôÓëÖ­[µjÕgœ``` X,‹ÅááaR_)åé§Ÿþ­o}‹vÍ}÷Ý·fÍš(ж“ ¥GmT.D–¦ 7ÕŸæ\,ËïVÖ²XÆ—ï}ï{>úè÷¿ÿý}ìc×\sM±XÌ ¸V«•$ eó¸òÊ+.\¸hÑ¢¿û»¿ËõŒb¢ív›ž—c+V¬8òÈ#H)©¿Û#=òÈ#Ç<½Î²ì¡‡š>}úÌ™3Ï<óL:e0Q*Çðð0¥u<÷ÜsGuT’$W]uÕ}÷ÝwÅW,]ºô{ßû€0 o¹å–ƒ:hÑ¢Eçž{nî¾òÊ+çÏŸÿ–·¼åØc}úé§I}/¼ðÂã?þšk®É-xÍfóðÃ_¹råé§Ÿ>wîÜeË–MŸ>ýÜsÏ=ì°ÃŽ=öØçŸž¬óiÓ¦ýú׿>âˆ#/^üþ÷¿€çydþÆqüå/¹··wÚ´itiaJ))¶óÿŸµX¶ é*cp]cŒ”’9ŽÑŽ“G…•2®ûGz]AP*•è™›j ŠÅâwÜÑ××÷ÜsÏ(—˳fͺä’K®¿þúžžž… c¾ûÝïÞ~ûí_|ñ;ßùÎï|ç;N>öÓÉ=þÇDsÞòmÿoÑñÁüÃÁC­2c”1&ËF^X,»sæÌ¹ì²Ëèõå—_¾`ÁÒŒY³fýÓ?ýYÀ¿ùÍo¦M›600EÑ>ûìsà 7Äq,¥\²dÉ?ÿó?Ó߯qÜjµ>ó™ÏÜwß}›6m2ÆPñ9çœsçw&IB?cÎ;ï¼[o½•xì±Çz{{7nÜhŒY¼xñ5×\CÇÌ;÷ºë®“R¶ÛmcŒ”ò£ýèÏ~ö3JÆ^¼xñç?ÿyc -uÕªUS¦LY¿~½”ráÂ…ßýîw•R÷ÜsO¡PhµZƘþþ~Zá‚ .½ôR)%ÕYQÖ-¬Z­.^¼xppÐsÔQGÍš5ë¿þ뿌1GqÄG?úÑ8ŽiUÓ§O§Sõôô\}õÕt~­õŠ+¦M›öõ¯}Á‚tÚ$IÌÈ~·Xv ²¼ÈgÂ÷=žïsßûìõv¶÷±˜·œïsæ#fQN’Ì•¤²ãi²Ì3wîÜ/~ñ‹ftQ©Þ²eËÞ÷¾÷%Iòï|g¯½ö¢_]qÅ}}}ô·{ï½÷—¾ô¥?¶P§‰6ÆeŒ óߎ½í¤³ÛsAÓóoÞäÙ&aYv(9¯h·ÛTíEQ©Tj6›äþ×ý׃:hÒ¤IAœrÊ)ßûÞ÷|ßBÌ›7ïÐCÅhÆSW_}õÒ¥Kûúúr§îm·Ý¶lÙ2ÊÑ$É]wÝE©^Ƙ«¯¾úmo{Û”)S”R'Ÿ|ò 7Ü@+9à€fÍš%„ ?³”òž{îÙÿýɬ̫{)ûãšk®9ì°Ãººº„ï{ßûn½õÖ,Ëžþùžžz”žN)eÝ]–]!ŒTä'‰1†ì`h)aŒ+hã¹×éìòåœ\\…B* ²,£¸Õ 7Üpûí·¯X±â _øÂÝwßMoŽÍyn·ÛÔB`û+Ýjãl?‘Âjªe·DÑÕÕE-#Œ1Œ1’±B¡@i­V‹1öØc|ðÁ’$™={6™¡Y–Ýu×]ûï¿–eT°f͚ŋ÷ôôcȽ¼~ýú9sæ”Ëe*jÒZoÚ´iöìÙ3fÌ :Ÿ'žxâÀ̲,˲E‹mܸ‘¢ÂwÞyçQGE»Z)5888cÆŒiÓ¦µZ-*"Äh8Yk½zõê%K–„aØßß¿`Á‚µk×ú¾ÿ®w½kíÚµ—\rÉË/¿L»×CQç4M)úKyË­VËqÊ#Ë«~»»»É½Fiš’½»»;ŽcÏófÏž=<<Ül61ƒƒƒ÷Þ{ïÅ_,„Ø´i©x–eÔd«‚ ‹ew‡jý¥”—]vÙ’%K¦NúÉO~’\>{íµ×ßÿýß}ôѧžzêâÅ‹éy—ö¥E£ò ¥‚}ȵì–0Æ6lØ@åC<ÏÛ°a½Ž¢ˆ’)H¿öµ¯ÝrË-Tc°÷Þ{·Z­r¹Le¯t*¥ÔÝwß}â‰'’ôº®+„¸ýöÛO<ñıµ¼wß}÷»ßýnz.β¬Ùl^zé¥wÞyg__ßÀÀÀüùó©²6oYÕh4ÊåòøÃ“O>™1V,1\×õ}ŸLáçž{î—¿üå¯ýëZ­Öl6=ôÐ-[¶ì»ï¾«W¯~ï{ß{íµ×~ó›ßüЇ>dŒ ÃpÒ¤Ižçå30Z×»iÓ&2ëé{ظq#-[kM_å[i­É(/ Ï<ó ¥™œþùgu–1¦X,öôôä_j1¶3ÿ?µXþÒ8ŽÓßßà3ŸùÌ?üÃ?Ю¡'ø7~ñ‹_¼üòË/ºè"Ú)Œ1ÎyÔ?Ž1Öjµòžw;f=;êDË΄ʊ¨$€üu£Ñ˜2eJ³Ù®T*A|á _¸è¢‹Æ6zl·Ûd€’` !n¹å–k¯½ÖCÆ.çüª«®"‡0u”tçꫯ¾ù曕Rô·a^vÙe^xaÞu @Ô4‡1V.—1·Þzë7ÞH-¨òC)%Éÿ’%K?üð¯|å+cOj­÷Ýwß§žzêÞ{ï}Ï{Þ3eÊ”cŽ9&I’uëÖ «@«Õ¢V_…B¡X,Òå„aH½ôh ôq”›M÷”8޵Öûí·€5kÖüÇüEÂÆÐÐ- Ãz½¾Z ‹e7%I’¾¾¾b±8RÑ4êŽ0uêÔOúÓÕjõsŸûÜ7ÞHϸt¯( µZ-jz³×c]ЖÝιïûëׯ§Ê×õëדU«UÚ*ä˜Ý{ï½ï½÷^ŒÚÒN+ Ôk‚$jxxxãÆûî»ožð?88¸aÆŋSÄ@­V[¿~ý’%KH®8ç .¼ÿþûcÈÓK £"(Š"ÓyæÏŸ_,©¿Gš¦ä70444sæÌßÿþ÷dŽS›:d xžwÜqǽõ­o}üñÇ(¥¦L™jHh­é&BU¿6l _Ùºuë\×͆öööÒçRûÌ¡¡¡ V®\9gΜ,Ë^yå•Å‹W*•ýöÛï«_ýê–-[,XðÀ¨T*I’l§åžÅ²;Bw€Í›7A@ÿySÓ›8ŽW¯^}å•W¾ð ÿùŸÿ¹råJÚh*¦¶ôMjGaز["¥Œã¸¯¯Ò‰ûúú(½€Ö:ŽãF£‘$É¿øÅ+V<üðÃyV‘RªÙlžvÚiO<ñ™Å?ÿùÏ—-[FîV:ÃC=tâ‰'’”RÙ‡~øøã§Öä¶:묳~øáG}4‚z½NÍŸ‡††>õ©Oýìg?£ÝûÈ#œtÒIä°¢'î·¿ýídÈèîî>ÿüóïºë®ßüæ7t@†a¶Ûí¾¾>Y–½øâ‹Tˆ{G­‡aÞòmÿ†;ž®§/=iT“~ÖZÓ™õÙËŸ åMä#Ãè½I9yódr#“>åÇçÓú²,£BaŒNl6› ,X·nu󠔚yòÉ'ï´ Ù 9ÚHÇu]ʽڲe‹­ëµìúP …ÉQ†”RŠ9Ð2KàºHh-¼±\©h Î9Œ³•K–= jíºîX¯òXk•d˜s¾}ïzóÇzww>t ÔýƒJ­9kÙ- Ú?4¯Œ<=íÁÍÅÉs½YûI¯ªãFúÅrÒlCµ‚¾½âM›'O«lþíC›^|ªoÖ\ÅÜüI™:MbÌ´†¿0RnŒq8Û¸vÝ´Y 0e¡Ó;W¶Û<º£œõo˜4{¸»âÑÿÑœiÇÛmh±ì¦¸®›¦i†Tc@ÂÇ1u¸, œóz½¾ýƹúÖjµ8Žc4p\ s¼X,R¸šÂ½ÛMj±Œ;4H@EZkR_)åÿøeʦW^B¹b¸ã•ºŸ]ý¿ÇòÆincŒ ¶rGÿ…ð=üïó/,_¾ü™ß?Ï*Ýî”i­M›R©ÓñqHɃ‚Nb¸®Ã¥|ñ9ÙûN:þS9mþüùÓfÎ9ÌŒ_ª§Åb±Xöt¦¸`ÁÁŸ¯\ùƒ›oûéCFm%z§+·Ãh¥À8c0JAJhÍŸxÏ)'ôï>|øÛ­–ËÐ’9F;( B)¼Ö¡½qíÚ^x៮ý÷;~r/Úpæ.’ÚA–‰ Tq¼ß8MœRY6"@zª²µ%X–ühã#WKpûdm±X,–7‹4œBy…Œ¼Ø”»Û­#ÈdŒÉAk(­=¹Q)¥â6Ú-ÀFØAÅxŒ±W…ÏóHøƒ)SãVêõÎpŠ“Úƒ5@8åP¶šp·ý¹‹z©W j·Û‘çy×”(jUjŒ¡v¸Ô߇ÊìèP‹Åb±¼„WHâ¶Ébæ8L8PL+·ÝH;K9ÇØàî¨)œùÓTðS”ã9¾ë0)¥f;&+ïK÷îÐìÝ=Ì/µÛ Cð±:ý::ZÀF1Î…¯µBƒ§à‡ÛØ4„ €çAkh=âÖ¶Q¥Åb±XÞ ŠÂ¶2S އ°ŒhxÛÇo+Ê3‰Fà{¾-Ó(†LÁ v¡Hš*„€ÖÈ2r†WzJQœeí†Á÷ãF%ÜhͶ­Ýs·ù‹Àód«m´AÁ¸À´Ri+†ë1Ïœ¥IhCsË´­Q²X,Ë›ÁYªâ‚ä1:%åÁÐ<$ÊcŒ¹¤TQ¤’Æ@¸ÌõÏÕjÇtSžg´T0€10€Ìó’f[î „ãꨅ$ñ ¡ì`wtAg©‚ë‚;*as=£3D‘(ùZI•*pçÜh%ã̦bY,‹åÍàžr™Q’1æpfŒQPÚèŽReÌ«ÒKñà‘F Œa.w]€”©NÛ2ÖðvP%ž’Ð FCƒqÎFÞLScŽ‘R!ð¼,U : °LR§P`ÌdQ­ \ÏCwOÖn‘õÍ\7ŸÎ)™í4k±X,–7AÖhÂu¹T c w¾Z˜´GÐY€}™¹Zfø¿·üÕ¢ÿèº93û5¤?YªuÖ†1Fpas°,‹ÅòfPh6t©Ê90Ð?ir_­ïÀAhM‚p&ÈöÍ‹‘vg: 0÷„j¸µ—=Ù\µjUOß”®j‰Ù™ –‰R*qÏ9O’Ä÷ý,Ë\×m4år9?RkmÌHÇqò?WêU’ÅbK–e´¿¨£3€z½Þßßÿ–Œy…MšgR‚ƒi &vwî,§Ú8pÊ)§L™2¥§Zâ°êk™èäꛦ)ß÷¸®«”"õ•Rj­pÎ…išæê+¥BXõµX:áº.çœsžÇw+•ÊôéÓO:áxî8Ü‚ ß-FÚíãžÕh·[:ýƒ•R€”6Îk™èÐ}sNÒ Žc)¥”@Eô[)¥RªÕj‘`t €ÌömµX¶… îæÏ¸ …ÂGÎü[-S¥306òD»G´æè,ÀƤé!‡B_Êq½Ë›Â£”˜àJ)Çq覆!Ý5ÈØ-‹$ÀqpÝ‘Ân]I˶ÈR9çŒ1¥”1FkýöÃC£Î  ¥”)Œa޳RçÌh@wOêâÐ0pÄ`ñ[,o Î9w1z³(‹uM'IR(’$ ‚ Ùl&I²aÃ$Ϲ5<Ö,¶X,9cR]×B0Æ´ÖÕJ0çL%)ŒáÜÙž~í&t¾%µÖà‚F g™ e²ó–f±ì’äÕwŽã?ñćrHooïa‡öå/ùè£P*•:è ûï¿ßCLjìõ‹Ë_ÚYZkò3ŽãЮà€Ö`ƃíÌ(ÜMØ^–†12IÍŒ†6¢ÓXa‹eb06 c¬ÝnÿÛ¿ýÛìÙ³~ó›ß,\¸pŸ}öI’@«ÕZ³f ÉmÜÊ²Ì °ÅÒ cL¾eÆì ˜,MÈ çZ©=Úíû®p`”RFó<™c>[&4Bàf³™ÿøØc-]º”R«N=õÔk¯½6Ou®T*4°„1†!)¥[,`ŒÑ¶¢m2"ÃZ‹¨Ý†–Üaœs(…Ý?”ÓùF 3Ì/–À88c‚[Ø2ÁIÓ”žÐ+• ¥VýË¿üË“O>ùÍo~ó+_ùÊW\1cÆŒùóç“-ŽcÊÉr]Wk}ûí·/]ºtÆŒ\pA«Õ@†²MжX¶ cŒ²±À(?DPЩ4†3ÈÝÞ“dŸÄ-–7€çyy‹ªD:ýôÓ8à€ /¼ð’K.ùÌg>óñ¼··—¬ä®®.Ïó¶lÙàñÇÿô§?}ûí·>ðÀ7ÜpC£Ñ`ŒÍš5ëæ›oEÑØ¸—ÅbÙã±l±¼”RY–Q’1eÊ”f³™W% …õë×gYÖjµÚí6ç|Ò¤IQ}ÿûßÛÛÞ6oÞ<'œpƒ>X.—=Ï;äCÊå²”2 C›m±L(lL×byc8Ž“ËmEa ­u’$®ëº®ëyžçyŽã$IBâºzõ꣎:ŠšV.Z´èú믧3Ü~ûíù™Ó4µ}²,–‰ƒ`‹å °•‘JyU“'O¦I¥a’ “ÐRA0ç\)µqãÆ›o¾ùá‡n·Û===ÇwœÖ:Ë2Ï󨕇1Æ&gY, +ÀË€úòh­)W“1V«Õ\×MÓ”úÈgYæû>™ÈžçQѰ1fÚ´i'tÒE]Dch–E‘)+o§e±X&vÃ[,oJËk‡aÇ1yž•R¤Í$¥qS’bîܹO?ý4ù¨ilCÇAШޑìæqº2‹Å²³±./‹å‘7PJ%Iây^–eQQñb”̬µ.‹žçµÛmçŸþ-·Üò /Ђ Š¢~ðƒ+W®¤Ò&«¾Ë„¢³3î £M–ÂhdIj{A[&8µZsNM%•R¾ï7›Í®®.ªåÕZ“cÔVVJQ»Ê#<òºë®;ãŒ3ÞñŽwxàïxÇ;xž÷ÔSO=óÌ3I’0ÆòNôËÄd«&qTn µ†jƒ•DˆZÌ€†6pw{’aÞòmÿFÁãÍô¥ß™¬!¥Ì0×fiZ&:Íf³T* PîÐÐPww7F½ÊôÛ,Ë(ÿ@’$îmµZÅb‘£F¹\Î;\Z,–|¢ö«o™6s'æüUd Æ0@‚qݼt~;ã Îa˜2pÓ Ïñ]𛤣̸6™â~Q VæÌ©`Ã:1w–Š30†ÑN%J)“$HSØ ‹Åb±¼ÂI0qͯ”’úâ¤gÚ´Áþ~¸ÞÖ&/çŒ1³›çau`ǃÜ2$zú8w²áaûz[­ºÃB)%²l$M溎ãdI²Sn±X,–=ŒZ"úº•ÌЮ³BAp.Û ¸ –óÎÓ¯vôvX+ ¥à®¥Rè FC»‚š¿#Ã(„`»÷÷`±X,–q¦âðz³!\Î=_J ÎÏè6ùœŒÄ€±Û§@c{IXŒz^Æ@k€1¦ ÍeÓa „í¢g±X,– €-ˆÚJ ÅV#G:d)wNÂ1íç0`$À\mýÜ1’îþY×a±X,Ën—#>ð±ÃGFúÆ;I/±,hÎÀÀ3` %¯QþÜf¶•Åb±X&&ݦ2g  í?Ö0äÏ4ÎÏbèŒ<È'T¼zÀ˜x³—d±X,Ë.1!^'‚#5ÊŒAð1ŠÛ9TÝY€sÅÎeœ”\1*‚~í‚`ë€-‹Å2àã^6¹>rÒGm¶$~Û±€#YÕˆæ,£3š­<àÜ °Åb±X&zLÎS.‘Æ€9¯¾þü$,¦è1W®#„Ð=,£6¸1ðvÄeY,‹Å²«3Fû`r†( ¥! ˜1‚3–t¨Óýã1`2s wœ8¨QÈwë0c³ -‹Å2`c<¾cB´Ü›¤¥$´Ò à ÃÀXe®`‚“Àg¦ÊeQJC€½`±X,– ˶ N=© ¸h ghKÍý”qtn—ÙÙ€aŽ€ÏA9λ}ã‹Åb±Xþ2p &`<Å ½½<¬ŽÅ»ÌqÀ4˜æ¡ë.s ÷€Ö_‹Åb±üEІ3¸,t!(Æ;êlç_P–µó¸‚ÖÛ1¥-‹Åb™ÈpÃ` ˜ä¡¡€`ŒQŽïè‚ÖZ‚i×0¡ŒÖP àÖ¶X,‹åõ¥¡´PÆ ­;™º-`£a$—àvä‘Åb±X,ÛF*0%”‡àè<´¸sg¥à0¸„ÉÀ4cœ[¶X,‹e›(͇˜—ð\¾¡ÅXkî8Â`€‘à†sάÿÙb±X,–ma´fŒQî¸Ã™ØÞ”„ΰœPE-Lò᤾0¾Ršˆ´#$8"‰$e^àû~œ¥àœclÚuüèlÅ[,‹ÅÒ‘¼[¤4A¡×êà R:=eGð’4L(t´d" ”Jàq-2ĉàEÕaVŸРë/D-e~hÚíÒÔ)R+£o`ÕªI c†cl‡kƘ¶ã-‹ÅòÇ™„×ÖàƒÅšèª„Ÿ%iR«ƒ ¤)¼p\Ö9n\uʉT±´âØ nA1D©À˜œqfuÖÔZƒZÛð³Åb±Xþ”c¯[@h(]U³Þ’(•™ã eŠn¹9.ë7VpC?Óšõô˜Zq0ÕŒæ£ÅN£°al;ql‹Åb±X^…Ø¿.i©R7m#¥ÉDO’’žj¥±1ãÕäqܸ‰´Ô;©9Ðv³Ü3©T(oøß5ízË© Ñ ŒF8±‘áÃ6l±X,–?ÎXE; °^éåÂ^û.NÒfmX……BßÔöÀ°ƒbÀoñ‹æÀgάÙ/ýìf±ø¾cÞõ·øÀ_Ÿ¼œ1Æg£ß ÛÞ0 ‹Åb±X^ƒyÍk£¡)¦ùÐÿûÿ~ËOþûÁ¤QßûÄw­éßÔÞ²a€t|<¬ ó–oóB¹Êka/j!( Zï°,hކ†åKk÷Ÿ¿à›_úÒ_½ Й–Œ1>šmŒaŒ,`ë‚¶X,˟ˆN™1³z¸ÜãÿýðŠ .ºè™ukyß$wj_¢ÔÒ5n ¹.eA#Ö&"-*±í,èñ`È@êdíÆ)¿ÿÍãåb(³¶ã»0þ¶·úk±X,–?…2¥X’Dq!,Öÿêˆw¼ÒjTæÍ®3 ¾ƒæÙ¿A?´µ~³·îÅŸú-B†C©ïxôÝú -–×ÇqZ­V±X4ÆdYæy^»Ý. ô/€f³Y*•’$ñý¸Ë 1¬àV¡À îC÷ÝñÖÅom–ìz2.ë¿âZLjj|ïûgΘ:>Ç¿§‹e÷$‚F£‘eY±XfŒyžW«Õ …B­V ÑêÆR©dŒ±êk™à8Ì1J(Å©}}§¿ÿ4ÝŽÑŽÇk=ã&ÀkgŸù‘r¡4ò{MºšÅbùS(—Ëß*‹”RÕj5MÓjµÊk6›QȲm;Á,– E¾Š~xæÏÀ–a$Çþ¥?Î44Þvð!¤Ì¨ šYG³ÅòF0ÆH)=Ï µ–R !Ð;Q•J¥0 馣ԸÝh,–]ãº.¨,û«ýöG¦|gÜû¬”2Žã%K–\zé¥RJ_ûÚ×æÎ›ec,Ë2ÇqšÍæ·¿ýíxàÒK/=öØc¯¼òÊn¸aòäÉsæÌáÜfYX&4 :€D Áyd²‘Œ[hÆnH‹e"˲sÎ9çòË/ùå—ëõúð¡}hÕªU“'O¾òÊ+Ç ‚ MSÏóÇQJyž%v:Ž£µ.•JÿøÇ/^|ÑEýô§?ýô§?ýáøcûØìÙ³Æx_ŸÅby+ÀË.D¹\>ñÄ)]ùŒ3ÎØ²e˲eË´ÖGyäÊ•+K¹ÙlHÓ4/óP(cI’¸®EQ’$Õj€”²\. ٰŲKaØbÙ…hµZÕjµ»»Ààà`WW€8ŽK¥R–eZkê=I †a¥RÉK~›Í&ÁRÊüx¾ï !jµÚ¸^™ÅbÙ+ÀË.„ÖÚ÷}ê.ÙÕÕU*•šÍf¡Ph6›4ÑÅu]¥T¥Ri·Û¤”d‡a˜¦©Ö: CÇqÒ4íêêâœS ι"ŽÇ­åžÅby=6ëØbÙ…ð}? C ë6›Í¡¡!ÒàR©ÔjµÈðm6›Œ1­µRÊ“$#}äƒ ¹M’$MSÆFª+”R¤Ù4¶Áb±ì"X¶Xv!8ç/½ô%UcÊå2ùŸÓ4MÓ€”r¯½öÚ¸qc©TÐl6{zz”Räm¦b$ß÷9çCCCèTišnÞ¼YJéØJ?‹e—Áº -–]ˆF£1oÞ<Š×vuuQ]/€,˦OŸN…FK—.ýÝï~§µ^¿~ýM7ÝÔl6…Ô‘ƒdX)ÕÓÓC'LÓ”²±ŠÅ¢U_‹e—bü†1ÓQÊÀK‘ÁöªµLh„Íf³Z­J)†"÷0gYÆ9×Zík_[·nÝ~ûíwÖYgýà? iHRJšE€1vá…^uÕUtÐùçŸïû~«Õ²EÀK3M= $ܸ4ÈsÊÅîñZüåÛü…P®òZØË‡¤Z_© ŽÆŽjÛe4~ñ+Ó†ËR¸ž "d¡pwÌù-–Ý­5ÍWȲÌuÝv»](¢(ò}pp°··Õ+¥cœsúÑCA_ ¨ÕjÕj•~¤0¹£-– K¬Ó@{F#óà!ƒ,¬à°¿‚çí˜à’ á*•ÀãHµ‰H‹Jl»Ëò¸=³LÁ0hšÀ éÍqìÉi±ì"£˜’œ …ÂæÍ›Ã0¤ äš&¹•RrΓ$ñ*ÂÚhcŒ¯(ÿ# IDATÖÚ.~ÿ>tÑ%—lnÕÝY3Ú.÷©'ÇÎgüØu³áŠ…G.|öÇ?ûëÓN;eÙÑç|ä#Gw„à00$¹#Âkõ×b±X, †s€)z c4Œá¸÷Çÿuõ7Üõ_÷#Mö>ñ]k6n@ÔBw7äøäaŸ Z™bwW«#dZ©v•ÙðìóˆRghËèÊ™¿ ŒåÍ:,‹ÅbÙ`£V›¿”ÕVð§.šßöDmh~LžïÀQÙ»‹ º y:Xª]q–4¯·bþlW!..c#g­aÌÈÆ-‹Åò'óºÈe±&SñÿÙ{ó8»êúþÿõù|ÎvÏÝæÎL’É6 1!P ‚š°C‚"ʦֈŵµX}Tû-B­VÚÖ¥Õ¸Ö*?[i,‹*ôÁ*TA H ™,³ÝõlŸå÷Ç{æ2hR“8róyþ‘ǹgÎ=çsn÷¾Î{ÇpÁ/¡Vs„+Ç›žá©ÈÇÀËM€8Ë2 ­ÍXå¢ò•IGMv“'—=WcŒ1+À‹ÅbÙÌ4饦4ôo»’‚s(‰‘ôõ›$ó…à™Ê«>/7nš˜Dú•²ÛSMâ4k6†R+Ài0€1ÃÀ´`‹Åb±üv e_ýšÙÆ„@£é÷÷³°èpÑÚ±3-„Rw€BËÌ1 «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çFÛ°Åb±Xö¾IAÌé2œ –’±:´â¾Ð“ÈÐS@NMZókÄ‘ep]£5SQÄ<Ï£”šüÈÒÝçãÁ‹Åb±ì Zƒl¶®ŽÔV]kp®£ÈñNØF‹ÅbÙ¦+êôFJM”Ç/™HÒV}BÂpö@gdy,3ÇpÑi C8‡ò«[ok‹çŸ¾î/ºèŒWŸÊ㌳ç›P2ØV”‹ÅbÙ3Ì ¶†¦˜æ·Üù¥o~ã»wÞž4Cç¬Û´c{gt Ò|<¬ùµ¢táh`|Bþê¹£[rÝ5לqÚɀδdŒÑøRLMgc`v’Åb±XöŒçûPvàrŒßùƒ{þì½ïýÙ–çøì>w`v¢Ô éÚ^¶¢ÌO€!©“ç¶ÍøÅC”‹G³›±PV-‹Å²'ìF¦K’( 山Ɗ5'nn7+‹i0 îÎÌu”^Ðp ¶îô¶<}ûOFÁáAê;ÞîôÝú -Æ)%cL©zJ)zIÐKòå¶P‹å@#1,t«P`¡{ÇÝtôò£[‡#†ÐHrYO~ŵޗ×/~Ý çÏ/8>ÇËïiÀbÙ?hµZZk×uÇéVP$IBê+¥”Rê©®pÚ¶‡³Xö‡9F)å 80{öë/¸Pwbtâ¼Ö“›;«¿uý%å°4¹‹½ ]Íb9)•JB)eš¦jªAïû¤µŽã8ŽÃ9'=žn[,–=!Ë&½ÁE¿°þâ7`tIn°òàLCãåÇ­ eFeÐÌ:š-=ä^ö<¯«Ä¤|¾Qý‚tG,Ëb`\×À•e+Ž< ™òÝ$ýþÉM€eœÂóE¹ c¸#à,G‡¸Å²¿ „`Œ‘ùë8Žçyèß4MÛívÇ8ç¤Í‹eO1š¹ Ò(ấZ †¹<7OR~œ¦àiªa&—aÝÏ–ƒž®¦R%ÞöíÛÿñÿñ˜cŽI’D)åy^±X,—ËNçšk®9î¸ãr]¬År`¢!cð\8"Š¢¼’›óÀCÁáš1É$g)­WÍrPC–n–eäaž3gβeËV®\éû¾¢ëvÃÐó¼N'§!jË g RÆ…y¢åŒ•Öî=¹%—«Õ:×µ)Ñœžc¡-P˜ €1fݺugžy&†i¿Öšìc›m±ì8Çe,Õq 0”ª•f§Ëzr³€ëQ™†æ "Ôœi¤8rËF³X^LH;»©UQ½ýío?ùä“» V]tÑÛÞö¶Ï|æ3óæÍìfD_uÕU‹-:餓¶nÝJ{($|ã7 ]vÙeÝÔ­‰‰‰k¯½öˆ#Ž8äC>ö±½ø·i±ìW0èTç ÉfÒÈk=Öâ´Xr€ |Çi·ÛÅb±P(œrÊ)7ÜpƒëºI’ø¾Ûm·}ùË_>çœsFGG7lØ@¶ï§?ýéÏþóÏ=÷\§ÓyéK_Ún·É2þÉO~rÙe—=þøãµZm```ÅŠo~ó›•Rÿû¿ÿû©O}êÑGÕZ/X°`ÅŠgœqFÞ·n±X&±yÇKžtàuëÖ5ýèG¾ï?ùä“õzýÈ#P©TzzzcFã¾ûî[»v­Ö: ÃsÏ=wîܹœs×u?ÿùϯY³¦V«)¥Þò–·|ó›ßB!>øÁžyæ™årYkýçþçŸúÔ§r½W‹Åò¬[,9 µ&os±XEQooúÈ#¸í¶Û–/_>wî\­õøøx£ÑÐZW*•»ï¾{ppÀóçϯ×댱V«õƒüàè£nµZœó#Ž8â‘G!—õ“O>9oÞ<­5ió¦M›r½i‹Åò¬ ÚbÉÆgqSEGguÖ<Ðn·üñãŽ;Îu]Îyooo§ÓI’Äó¼R©T*•¤iÖZJAÿÇ>ö±›nº©\.OLL¬[·NÑét‚ ‚€N^©Têõz®7m±X^€µ€-–àœSÅ‘”Òãû~’$'žxâ¿ÿû¿‹ÅÿüÏÿ\»v-ç|||<Š¢¾¾¾B¡ µ¥”+Ïó …B·3eEW]uÕöØcŸþô§„aX(²,£2GÎù‚ ò½k‹Å2+ÀKÎPØqœãŽ;®ÕjÝwß}O>ùä‰'žÀó¼4MµÖ”5}ôÑG×ëõz½.¥|òÉ'“$À|àÒ4¥\-²’ nÙ²…ÜÑO=õÔÂ… óºG‹Åò›X¶Xr «©4õHk-„êëë»òÊ+׬Y3wîÜ(ŠŠÅbµZçœ3ÆÎ=÷Ü 6л¾ûÝï†a˜¦)cì#ùÈM7ÝôðÃcZV—”òï|ç7¿ùM¥”Öú[ßúÖúõës¼e‹Åòkä7ŒAøð8˜†ŒR^Š vº‹å €sN¡YäF¦í“O>ù'?ùÉš5kZ­9ã8®T*Œ1ïxÇ;^óš×¬\¹òÕ¯~õõ×_Ÿ$ ½qùòå_ùÊW®¸âŠ¡¡¡uëÖÑÛÇY³fÍUW]µjժŋ¿÷½ïµ5H–ƒœVšzH¸qi甋µ¼ÖðøÔ]þA(Wym,ðá©ÂW*ƒ£1Sm»ŒÆÝ÷™ö\–Âõ4`!+wfÎo±˜´Z-ò!SÇ«F£A¬µîNÞ¶mÛÀÀ@–e”ÉEáäññq*XêžÊ£µ6Æ0ÆÈ†Îç–,–ýƒX§öŒFæÁC%X¡‚—­€çÍ̸äB¸J%ð8Rà¹D¤E%vÝe97 ˜e †AÓ†©ãö÷ÁrpÓn·I}©¦S ÒQqÎGGGé°®ëzžç8Ép­V#‰ít:4N˜1&„p‡&,ÑaËA çæL)Ÿ2¬PD’Û ‚ÜØpŠZip¹5-5ÅbÑ“eɰRŠ6 …€þþ~ZkJ¿j48çdæÒ©M¦sfY–¦)ÙÁyݗŲ¿Ð=­¡µÉdP*ç¾–&8`T« Às<&³ç ºĘ́‚ˆ²¨ÆÇÇig7`ìû“ƒÄÉÀeŒ¹®+¥¤<,)eÇJ)2”c9Ž]³Xö44 ` µçI£,qýò?ï=¹ p*ß½çîÕFkRJ›“m±ø¾EQEZk2…J©Z­ Óét:’^ß÷»óƒ»ÓÈ) Àqœ hˆ!Ff´ÅrÐâ€ÃŒ <ú8ÚêàsA”‹þíKãí&Y¾®p¬ƒÌrC#~ …B¡Pàœ+¥šÍ¦”’¬^¥T†a ƒØ›JáœÇqL®i:O’$TéDp.·c±ìW0Ú@`¤ó¹¯~}5Íss¾ægsº‚—ÂoßòщñVÒ×ê¯å`' Ãv»$ Es…år™²¨hðu¦öÎô–4M¥”Œ± <Ï3ÆNû¾ßuV6 ËbR2ȧ7?ó•¯-¨UáäŠÍ­ )‹Ê^ÐÜôÌ<Çèž»f÷÷Ê¬ãø®Q>Ûå§a:,‹Å²ƒ]êHÆ"Hã:ÁøxséKW6\áÏh ÇŸ™ ïeR~à A Žjq뎱“Ï>ûýèi§œ£SÝáàBÀL ¯Íß´X,Ëž ´f`|J„µÑTï ßøý;ÞûÁîl7ÜÁù—ƒûù¬3?vÝl¢Žb¸ä„¥?¿åÖ3.¼ðÜ“O{Û%—œtæÁa`8Hr'…×ê¯Åb±XöÃ9À(/ÑÀ c8¾wËî«_ùöoDš ³nÓ¶aDmÔjùäaåç‚V¦XëiïØ™Vª=Ee†þKD©3>:µ2Fæ/c`Ýf‹Åb±üh€MYmfZüRV{Yè,;¬ã‰úøü ˜5'žÁ1Š :”<kÕž8Kš‚7:MqØ!®B\\ Æ&=ÎZØɗ6Äb±X,{ÎoD.‹u™ güj5G¸r¼éžŠ| ¼ÜXp€³,“ÐÚŒÕQ.*?P™t”‡©qåÔ߇^2+À‹ÅbÙÌ4é¥pôo»’‚s(‰‘ôõ›$ó…à™JsZgnÜ40‰ô+e·§šÄiÖl ¥V †Ó`c†i+À‹Åbùíʾú5³1FÓïïgaÑᢵcgZ¥îùô¨É/ «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çÔ/Ëb±X,–ßUÀSsº gB„¥d¬­¸ï#ô$2ôÐÉi™ù\@–ÁuÖ`LE›j 0ù‘¤»Ïǃ-‹ÅbÙ´Ùl]!¤t]ZƒsEŽçAkLµq}ñÉÏ®§Ì/˜N§40Gje4âÑV­šDÁ0f8¨qÏ”3mE[,‹å·c`&Ewºýf ,nÖEO¥øY’&õ¸@šÂ;È\ÐU§œH{A;ŽÍØ(Š”BÆÀŒàŒ3Ãh¼5³eŒ1¶X,Ë  Ø4ºû5” ªÕhK”ÊÌñ„2E·\Ï©Gn¬4$àüLkÖÛkêuÆuÀT'0ºë1˜²€-C²X,ËbŒ™Ì%z•†é)M&z{•”<ðT;É«ÓSnÜBZêïkì@§Uîí+…åá'6um§>9ôÔ6â°X,Ë>0]Q§7âhTj¢.8|ÉD’¶êª†³:##€Èc™9Æ€‹NkdÂ9tð_Ýz[«X<ÿôu|ÑEg¼úTÆgœ=ß„’Á¶¢´X,Ëža^°m44Å4ï¸åÎ/}óß½óö¤Ù:gݦÛ;£ÛPæãaͯ¥ GãòWÏuؒ뮹æŒÓNt¦%c¬;FÍÃYÀÖm±X,–=áù>”]¸Üãwþàž?{ï{¶å9>»Ï˜h5Cº¶—­(ó`È@êä¹ms ~ñÐåbÆÂìf,”Õ_‹Åb±ì »‘)Å’$ŠÃByl¬±b͉›ÛÍÊâCLƒ»3sÝ¥4¨­;½-OßþÓ‡Qp`8dúŽ·;}·>hËH’$¾ïȲŒs>Ý»ÓjµJ¥€N§†!€8Žƒ ˜©KS'W!€±±±ÞÞ^)¥ãä÷•·Xò&1,t«P`¡{ÇÝtôò£[‡#†ÐHrYO~ŵޗ×/~Ý çÏ/8>dz? –?4|߯×ëZk×u…œs¥€4MK¥’”2I’0 ³,«×ë3¨¾äsB(¥¢("õe¶§åàÆaŽQ @9(Ìžýú .Ô8¯õä&ÀÆêo]I9,Mîb/HW³XþȲ¬Z­rÎÓt²ß»BJéyžRJkMö±¢Z­ÎàucdûvmnÎ9í±Xf²lÒ\ô ë/~F'äÖ +?Î44^~Ü*RfTͬ£Ùò‡…ëºêõºçy:B!DwÞYÆRÎX73U7Ïó}¿Ùlvo‹å ÅÀÐW’*ËVy2å;»I<úý“›Ë8…ç‹rÆpGÀXŽq‹å÷B«ÕP­V1išR¬—1Öét², ‚€16>>@1ƒZÆX’$´‘¦©ëºZënøÙb9H1š¹ Ò(ấZ †¹<7ÏP~œ¦àiªa&—aÝÏ–?8J¥Òèè(¦F\øÃ>á„ÆÆÆÂ0t]÷ÙgŸP«Õ>ðqÄ]çØïN»Ýö}_Jùž÷¼gÅŠApÎI’-–ƒ i4ƒçÂQåµÜ˜’׌iL&9K9c?@Ëþ@Ç===´íûþ¢E‹–-[ÖÛÛÛn·,\¸@EµZs>ƒj±X̲,˲ î¶ÛíLò²XD8c0Ú0.È-g¬´vÖ“×…Ë”râ:ÓÐF€gk$,XA@©ÈôòüóÏß°aCš¦Óµ°P(pÎ'&&f0IÊãºn¡P í4MI’gêüˈÀqOu0”ª•¼Ö“›×£:2 ÍD¨9ÓHpØ$ËI7əꮸâŠW¼â²,K’ä’K.yÓ›Þô¹Ï}nÙ²e ,ð<*‚þò/ÿò˜cŽ9ᄞ}öYÊÀj4þýßÿ}hhèÐCý‹¿ø‹8Ž1•TõáxhhhñâÅúЇº×ê^š–A//¿üò+Vüñ=ö%ZX¶lÙC=´xñâ /¼Àk_ûÚÕ«W {ì±Û·oÇTŽØßüÍßÌ›7oåÊ•7ÞxãÐÐJFk0v,Šå€…A§48`€L6“F^ë±§Å2xž'¥Bc8çkÖ¬ùÊW¾2>>^«Õ|ÿûß¿öÚkׯ_¿}ûö/|á T€tóÍ7oذabbBJ¹`Á‚Y³f¥iZ©T~ò“ŸüéŸþéã?Þ××·hÑ¢ \~ùåRÊûï¿ÿãÿøæÍ›1 .<餓V­Zåû¾çyI’pÎ]×¥\ën¸áÆo$M]¶lÙÄÄí×Z¿îu¯»ñÆW®\ àë_ÿzívû‚ .øÛ¿ýÛ«¯¾º¯¯ïÖ[oýØÇ>¶mÛ¶žžž tÅÛb±Ì86+Òb™²,ëvº8õÔSÇÇÇŸ}öÙ8ŽùË_ŽŒŒœþùÀäŒR!cì[ßúÖyçÀqœõë×sÎɸüò—¿|ÒI'õõõxó›ßüÃþÐqœ ®½öÚ³Ï>»P(„aøªW½êºë®ó}¿Ýn+¥|ßw]·Ñh¤iªµþÖ·¾uî¹çÆq¬”:çœs¨ Gš¦žç­]»våÊ•išcÈ .¥|õ«_ýãÿ˜ ‘o¹å–µk×öôôh­O?ýô¼>L‹å`À °Å23P}!ç<˲¾¾¾‡~8‚»îºkpp0 Ãz½nŒñ}_)å8ν÷Þ»|ùrÊÆ:òÈ#7oÞLææ]wݵ|ùrRÊb±xÿý÷c”R¿üå/—/_ž$I’$Gyä“O>©”*‹Bˆz½ R©!þÄO,]ºÔó88@qß}÷Q£éíÛ·Ó‘t‰V«U.—1Íf³X,h4I’¤iÚn·ñ‹_\}õÕ>øà’%K>øÁ~æ3Ÿ¡câ8¦¥ådY,–ßÖm±ÌÝ:"cÌÊ•+ƽ÷ÞÛh4Ž<òHß÷³,+‹===4ƒaõêÕ<òß÷þóŸS.•ëºsçνûî»=Ï+—ËŒ1ò*c?üðG}”.ñØc-_¾\k­”:ôÐC{{{çÌ™³lÙ2ºúÊ•+Ÿzê)ºÐÈÈ"oÛ¶­¿¿ŸNX«Õ¾ûÝï.\¸pÉ’%õzsÞ×××étZ­Ö1Ç3<û–[n¡\å7v3|à¸ýöÛüã'IBrKžä /¼ðÎ;ïl·ÛI’üà?¸ð i¾B–eaR4€(ŠÎ=÷Üo|ã###¾ïûÛߦV—ccc˜ª#:þøãGGG£(ªV«ßþö·›Íf†¥R镯|åM7Ý$„HÓô?øA^Ÿ§År0ß0áÃã`2J9x)2Øi-–)%çœú-w:°SO=õ¶Ûn{å+_I-®¨4y•GGGßö¶·]tÑE/{ÙËÎ9çœë®»®[_»bÅŠ 6\|ñÅ'œpš5kN;í4ZëuëÖ]uÕUK—.zßûÞwÚi§‘Ø“ÛSöw¡P¸ôÒK/¸à‚—¿üå§Ÿ~ú5×\CéÍ4‘’¥¼êU¯:æ˜cV¬XqòÉ'ÿýßÿ}· ×ÛßþöU«V-_¾üU¯zÕI'D~ij$Bm¥©§æ‹ûéZ,3C+M= $ܸ4ÈsÊÅZ^ëaX|ê.ÿ ”«¼6øð€T á+•Áј©¶]FãîûL{.Káz0ˆ„;3ç·X^D”Rœó(ŠhÜeSêmÿæ[²,sGJI&lÇžçqÎ[­V©T@r>11ÑÓÓE)7)%mÐÎ]®gúè…îaY–‘•<}I´SJ©µ&'9ª`¾êª«n½õÖÿøÇŽã»›FÏø§g±¼8Ä: ´g422(Á ¼lvõ ݸäB¸J%ð8Rà¹D¤E%vϘÛw‰e †AÓ£´¦9öä´X~¨´—fýȲŒj„xž×jµ”Rív›Òš&&&¢("ï±ëºa&IÒu_wŽìΞžc )h’$”5Míw§¾t’N§ÓÍg¦vó¤÷I’P¶€v»M’ì8ç¼X,Ò‘µZM)õo|ãì³Ï¦ò$*S¦µY Ør€Â¹€9Sʧ +‘ä–íŸ[´+œ€‘RzðÀàrkþZHȦô}¿Óé8ŽC—Ó4åœû¾Om±XTJ5›Íîx¿N§†!“ÑŒ)15Ð û8‚®âÒíÜÝz¨Žˆr» …5­ô}ŸdØqc -©»xxxÖ¬Y¯~õ«GGGGFFŽ:ê¨K/½J‘Ѽ;ƒÞb90èZZCÃd2(•ã)#ðE&7f‚Fµš¢Vò&3Ö¶xžGž^rA €+¦ô•šOuÅSn^­5½… bR_òNS!/ ÝòÜéVòÿ1݈4’,]ß÷[­V´Q*•èœ$öBˆ®®S²ØÍ7߬”RJÑùÉ5íû>¹µ­ Úrࢡa8©¥ÃyÒh K\ß‹Ó8—õäö]Jà»÷üϽÚÐ/ ¤”ö›mù Žã(в,3ÆdYF¹Qžç !’$¡T&cL­V£2!äø%ÁVJ¹®ËëJÝÄÄm—›ÜÝ¿u;wî$É4ÆK)Iþ©µV×Ô&‡vEä?—Rº®K’¯µ¦çL œ ÓyÆ?4‹åEÀ‡4xôp´Un.èÜ$Ï \Üðo_o7éÛì ÇÚ¿– ÓR€–|Å®ëRˆ—:6“ Ò´†® W)5{ölR\Qi­éêä,¥TJõôô¤iJ!áî¼#rïn=ÍfsÖ¬YT§DKŠ¢ˆ¬jò'ÓcA×IN'$˸!&=î7;SÓBi¿ÅrÀÁh€5’Îç¾úeôÕ4Ïí2?›Ó¼~û–ïŒNŒ·’6¸V-*ä&½@C<Ï£—Åb‘ ÍnÚ3OÊG2‰©ÁÀd%Ó aÇqèàî©<Ï#ýVJý±Ør¹¬µît:4( SNiU5x IDATÚîŽ8¤.´òR©D&/¦lq×u9çiš’‰L½61M‰-–¥dOo~æ+_ÿZP«ÂÉ/9·2¤,*{AsÓ3óÿ¡{îšÝß+³Žã»Fùl—Ÿ†uzY,‹e0»Ô‘ŒEÆu‚ññæÒ—®l¸ÂŸ?Ð0Î ÝÜË2¤üžd A Žjq뎱“Ï>ûýèi§œ£SÝáàBÀL ïļ,‹ÅbÒšñ)ÖF“wÇ.¾ñûw¼÷ƒÜÙn¸ƒó;.÷‘SP%?vÝl¢Žb¸ä„¥?¿åÖ3.¼ðÜ“O{Û%—œtæÁa`8Hr'…×ê¯Åb±XöÃ9Àmà c8¾wËî«_ùöoDš ³nÓ¶aDmÔjùäaåç‚V¦XëiïØ™Vª=Ee†þKD©3>:µ2Fæ/c`È©NËb±X,`SV›™¿”Õ^úËëx¢>>?f͉ëõ»ðâ‚%OÇAµ'Î’¦àNSvˆ«—‚±I³Ö0fò¥­|°X,Ëžó‘Ëb]¦ÃY¿„ZÍ®oz†§â kÄ!8ÀY–IhmÆê(•¨L:Ê@ ß©d‚^2+À‹ÅbÙÌ4饢yú·]IÁ9”ÄÈúúM’ùBðLí¶žï÷LnÜ40‰ô+e·§šÄiÖl ¥žœ»b`À4À˜a`Ú °Åb±X~;†²¯~Ílc B ÑôûûYXt¸híØ™B©;ÀnÛªÿ^É/ «/D3b¥BÒhJá¨()T*i&S`Ì0ð)ÿ3çÔ/Ëb±X,–ßu‘£ æt΄KÉXZqßGèIdè) “Ó2ó¹,c „É2æº*Ëà8J)ÆØäGî>¶X,‹eOÐd³uu„È2Çq 5„ÐqìA¾ú’Ÿ<ÚáA¨£¨8»GjÅÀ£ÑV.#qa3SSϦĘiÛ(Úb±X,¿3©¬ÓõÕ„,i5DO%,Y’ÆõŽI’kı—ä&À%Â8Q¶ÚmŒ¢·•’QŠÁg†Q[]jŒÇc6l±X,–=@°it÷¦UXP­Fsb¥2w<¡L(Šõœ:qä&ÀÚ0©´Sp•ÊÐßVKpé*Ä!Ó]Á”ll’Åb±XöcÌd.Ñ ¨ÔM•)j5%%ó]ÙNccòêô”›wöT;;·#KªµÞ‚WØöÄ&ÕIl#‹Åb±ü.LWÔé8•šS).XvØD’¶ê*(fD££€Èc™9Æ€KngÇgèC7ýÇÆzœwÚÚKׯ?õì“cœqö|JÛŠÒb±X,{†yÁ¶ÑÐÓ¼ý;w|é›ßøî·§­æâ³×>µc{4¶…i>ÖüZQ:†+Ã&êê™-G¶äÚ«¯^{ú)€Î´œ>Šœf—20;Éb±X,{Æó}(»p¹Æo¿ã®ËÞ÷¾ŸoyŽÏéwf'ZAÍ®íe+ÊüXÆ!wÒ-Ûk©zâÁûkÕ²Ñ ÆL°ëã­þZ,‹eOØL)–DíN©X­¯Xsâ³VuèÐÓ†Í3ø@éÀÉ6o›ŸüÁOvÊ W‰«ÇÛ¾[´e?¦Ýn‹Eišº®ËÓZsΕRB­µ”Òó<ÚÇqìæAs7$Iâû>ßó¼îF÷T´ÑétÂ0”R:ŽCÿÒÛ•RJ)zãÞBa…ÆÆÆz{{§ŸÙb9€H +ù5(ð¢wçÆÿïèåG7Ï1„F’Ëzò+®u¼l¼~ñë.X8~Áñ8žýJ[TŠÅ¢ÖzbbÂó<ƘRŠsnŒQJaJ,¥”RÊ}P_¤¾$¢FC)EØÂ,Ë„aE‘ã8išvÿ$¥Bì›ú’ïN¡”Š¢ˆÔ—ÙÞ8–‡9F)å 80{öë/¸Pwbtâ¼Ö“›;«¿uý%å°4¹‹½ ]Íb9€H’„sÞÓÓ£µŽã¸Ûÿ}ºì‘ šß¡ ŽäÜ÷}!缫µÊåòô#É`%¤œ¬q$‘Þ+ctªnfç|úÉ-–‹î· èÖ_üŒN Qy-&?Î44^~Ü*RfTͬ£Ùr`âû~ÇêõzœóññqÔIFÑ5 …}iûÞétÛ÷ý4M£(¢SEQDÇÄq,¥¤¤‘´$×ué€nnãžÓ}\`Œù¾ßl6ɯ¾·`±äŽ¡¯T–­8ò(dÊÏ© r`§ð|Q.Ãî¸ËÑ!n±üNcȱ\«ÕH,kµZ’$d} !Ç™˜˜h·Ûûvþ0 iCJE‘çy…BAJ™¦iµZÐn·»žíV«5<<Œ)u×`ÝË•1–$ mPx›ÂØûvKÎÍ\i”pÝR­Ã\ž›G'?NSpŽ4Õ0“˰îgË‹Rêÿý¿ÿwì±ÇfYFX¾ï{ž÷þ÷¿ñâÅI’ôôô‹Å‘‘‘};?éú¦M›V­Zµpá“N:éúë¯ùË_ I’W¼âúЇ(÷ê¯xÅÆ1$À]y¼ßívÛ÷})å{Þóž+VqO’l±¨hH£Á<Žè~A^|r`xH"8\3¦1™ä,å^Ǩ,–ýÇqŽ:ê¨Õ«W“ƒ‹œ´”ü¼`Á‚ <Ï#íïï'Ïð^!„ÃpbbâCúÐ1ÇóÔSOÝzë­CCCkÖ¬!¡)•JtäÖ­[7mÚDr«§æxfY¶\,³,˲lÁ‚¤»ÓMm‹åÀ‚3© ãB<Ñr¦Jk÷e=y]¸\­€ëLC ž­m°˜h­/¸à‚þç&q-•JQqÎÇiµZQ1ÆÂ0¤„©}HH¦7–J¥Çü˜cŽáœ‡axÞyç}üã§<)ß÷Ûí6]¨Z­V*Îy–eŒ1Š K)÷-ìº.Á“¦)IòÞžÇbÙpÀ8.ãà©ÎÀ†Rµ’×zràzTG¦¡¹‚5g©›ÜaÙ¯1Ƽë]ï:þøãée’$ò'ò–·¼å_þå_ƒ £óýïÿá‡~Ê)§<óÌ3¥R‰Tqà 7,Y²dþüùW\qù¾È\þèG?ºdÉ’Ã;ì#ù¦ò§Hꨆ8Š¢üã>øàûßÿþ«®ºê‹_übooïÒ¥K©RˆÄžlScL–eQ¹®û’—¼äž{î9ÿüó9æ˜3Î8cëÖ­—_~ùË^ö²Ã?ü¹çžë^â£ý衇ºxñâO|âRJD¦µþ«¿ú«Å‹Ÿ~úé=ö˜ëº´T×u¿öµ¯-]ºtÑ¢Eïz×»´Ö´ß ³e?‡A§48`€L6“F^뱧Ų(¥Î<óÌ/~ñ‹(ù?þã?þå_þåÜsÏÿÒ—¾DM*n¼ñÆ/}éKcccŒ±ÞÞÞžžRÐ_üâ—^zé³Ï>[«ÕªÕêñÇÑE !6nÜøw÷wÛ¶m‹¢hÞ¼yÇü©§ž ÀuÝnç ×ußóž÷Üpà ¯ý민òÊN§366ö¯ÿú¯»\§ÖšÌÖ,ËÖ¯_ÿ³ŸýÌóÊW¾òŒ3Îø§ú§ë®»î5¯yÍ{Þóž¯~õ«Œ±;ï¼ó#ùÈÄÄÄsÏ=÷Ò—¾tÉ’%gžyf³Ù¼÷Þ{?õ©O5›Mƒƒƒ===ŽãlÛ¶mddäòË/üñÇgÍšµtéÒO~ò“ï|ç;…Ýtk‹Å²'ØlF‹e/pgõêÕI’<ôÐCAlݺuçΧžzªã8žçQ™¯1æ;ßùκuë¨îèï|'™³…Bá _øÂÙgŸA³Ù|÷»ß}à 7(¥Ò4ýÌg>sÉ%—8ŽÓ××÷–·¼åóŸÿ<¦•eY6>>î8cìÉ'Ÿ¤Ìä0 kVsÇI’¼ímo ‚€1væ™gnݺuõêÕžçüñÃÃÃŽã8Žó‰O|âo|#…«Ï=÷Ü 6$IR©T>ñ‰O¼á o S½öµ¯­×ë®ë |ìc;묳¨òø¬³Îºí¶Ûèáw)q¶XB¬[,{Gÿá‡~Çw0Æn¿ýöÅ‹×jµF£ANfÎ9cìG?úÑš5kèø… Ξ=»ÕjeYv÷Ýw¿ä%/) år¹§§ç±Çó<ÏuÝ_üâ³fÍ"[¾|ùwÞ C*[r]·V«I)“$Y´hu¹¢Ž»[$ebA0kÖ¬N§CÛJ©¾¾¾B¡066V*•FFFÈ[~Ï=÷Ì™3‡R¦=ôÐû￟oýïÿþï¼yódYvÜqÇi­›ÍfÇO?ýôìٳ鄫V­úéOš$Éøøx7áËb±ì Öm±ì5«V­º÷Þ{lܸqíÚµ*•ŠëºÝžÉ®ë6 ZkÇq¥(7 6|ë[ß* ¾ï¯X±‚Ž!ãrbb"MÓ0 ‹ÅâÄÄD¹\œ5kV–eI’PȶÝnW*•,ËȨÝÝ É!Üh4Œ1…B¡P(¤iZ.—»%cÃÃÃëíëë«V«­V«P(ôôôP…1ÇTÌ£ë–J%ÆØæÍ›Ÿxâ‰|póæÍ…BaõêÕjµÚ‹ðÉ[,HX¶XöšL°víÚ+¯¼ÀøÃø‡ ?¥iJm·Û$¢###ýýýÔ €RªV«½ño¼úê«t:Rk!ĬY³*•JOO€§žzjΜ9´ýè£2ÆÈÿœe™ëºQŽŽRªÙ©»„úEW*•F£A†µçyÃÃÃä7¦–sçÎBPár÷aûöí¾ï;Ž£”j4ÔH¤;}1ÇñÀÀÀùçŸÉ%—Ìš5 @«Õ¢•Ðýþ¾>z‹åë‚¶Xö sžp ۶m»õÖ[ëõú+^ñ ZëÞÞ^¥”ÖºT*…aøÀô÷÷k­·oßN“„Ë–-Û´iSš¦$Ò]3gÎwÜ‘eY»Ý–R’L¶Z­yóæ•ËååË—¿ä%/¡'Î9¥:w»]î’R©D'w§ÙlFQ”$ɬY³vîÜIÉY­V«ÝnS•ÑÐÐÐ#<<ìºîm·Ý6gΜ8Ž …ŸÿùŸó›ß|üñÇéôlA'ü½ÿX,@ä7ŒAøð8˜†ŒR^Š vÊŠe¿†ºA%IrÖYg}ï{ß;í´ÓH}©?3+pçÒK/=餓^ùÊW¾îu¯»üòË]×BDQtì±ÇÞ|óÍçŸþªU«þèþèÜsÏ¥æ‘k×®½ì²ËV¯^=44ô7ó7Ý.211žç%IBSI€ÉMIÔ¤£I’‹˜Š—èÈR©Çq³Ù¤fÎÍf“r»ŠÅ"Gt]÷¸ãŽ{×»Þuúé§^qŧv¥Ô»ßýîóÎ;ïä“O^»ví5×\£”¢‘ëV­úâ¿øú׿þøã?öØc/¾øbÊ ³=¢-û9­4õ4 pãÒ Ï)sK_`X|ê.ÿ ”«¼6øð€T á+•Áј©¶]FãîûL{.Káz0ˆ„-%´t'û¶Z­R©D¢Èñ«µN’„Ò²~³:V)%„˜þv²8µÖ­V«R© Aav3­è]t­îžî”Àf³ùk P;:áoQ0Æì2«kÈRN€›Í&µ¶&§ ÁÔ³ÑhÐ%v¹‹eÿ!Öi =£‘yðA V¨àe+°OÓ²w7\W©G <—ˆ´¨Ä®{ÔäöÄÊ2à©ppò ŸcON‹eOȲŒ”‡,¥$+“œÌ¾ïÓœóB¡à8£(^K­¯8çäÊ`Œ)•J”⤵ïûÅb‘ÒÓl6Ɇ.•J'&u¤á€q—Ëeê˜A‰`Ò4•RV*²Ú•R”QEÞiR_²ªéqt·+ê4÷—ò¿â8.‹”Ì¢Ýn“¨T*t_V}-û9œ;˜3¥|ʰBInÜr`W8Àh`¸—[óײ_CN`ÏóH>©îå”ÙDÖ!©&©¹¦;Ué5lŒQJÑh?)Ø=[Çqw;Z(¥HIÛÈb&a&—2€$Ih¹\N’¤;¯—Fvu—Ìq)e×F'£–TÜ÷ýîc9´ã8ÖZÓ²=Ï㜷Z-ÒòN§C1lÏó¨ÚŠž<^¬ÿ‹åw +zZCk“É ”Ûƒc~°à€Q­&Ïñ˜Ì¶Ñ±ìïPý‰ iijš¦4˜ÚWÅqLÚL5µa&IB£~m(¹s4›M ²R/å!Ó :2Žã®Ç8I +¥¨Twtt´[˜DúM+ᜋEŠ»®ë8ë$êq“O==8çÝÀ0M¤û¢nfu†RJj´I&;u¢~‘þ,–}ECÃRKpž4Èן!ÿóÞ“›§ðÝ{þç^m´À!¥´)–ý’+×uÉCKRª”¢&”¨a$™¤d/’Jîh!Dš¦VJÑü"’Ør¹LNf2²©çÜCç¡s¶Ûm*a"1¦÷v:jµJ&,Í` ê^2µ Z^’$´BzI"¹¥ìNÇ15ö¢~Ԥ裣£t;Ýl)e½^'‡ö‹ôß`±ì8  Á¸ðÀ£€£­>´@¹¸áß¾4Þn’åë dž€-û9Žã»µÑhÐÀALM¢Iõ$TI’PB…Šã8¦–N‡Ê)c¹\.w}×<¦+ƘRŠÎLv'y§‹Å"¹Ûív÷Š7Ó¦g~‘‚’›B¼¾ï»®ÛjµÈØ¥FÓ¤ÓÝIGJ)j9%iSô—Ö××€ eŠ;ŽS­V»X,û- €6X#é|î«_F_MóÜœ¯ùÙœ®à¥ðÛ·|gtb¼•´ÀµúkÙßé–U*2+»‹)¥$‰¥ædŒvÿ%%#m&¿.¦‚¸$œÓuwú|!:†.D‘ãb±HrKžm”EJLáÞB¡@éTä¯NÓ´;W˜œÛ$Õ´MRM¹]år™lâ,˨ït÷îèB¤»¾ïK)é¯QY/´å€FgB>½ù™¯|ýkA­ '¿PlneHYTö‚æ¦gæ9þC÷Ü5»¿WfÇwòÙ.?  ¶X,Ë` v©#‹ ëããÍ¥/]Ùp…? a$œÝvuÝ;ö² )¿'ÖBƒ£Zܺcìä³ÏþÄG?zÚ)'ÂèTw8¸‚0S»û¶ó‹Åb±<Òšñ)ÖFÓÜO¸pøÆïßñÞ~pg»áÎï¸ܧž/>ù °ëfuÃ%',ýù-·žqá…çž|ÚÛ.¹ä¤3×ÃA’;)¼V-‹Å²'ΦhÆ0hÃñ½[þûs_ýÊ·ÿ{#Òdèœu›¶ #j£VƒÌ'+?´2ÅZO{Ç6È´Rí)*3üó_"JñÑ©•12ë6ë°X,‹åÿ@lÊj3Óâ—²ÚËB`ÙaOÔÇÇàÁ¬9q½>c>P\СäéX#¨öÄYÒ¼ÑiŠÃqââR06éqÖÆL¾46l±X,–=æ7"—źL†³~ µš#\9Þô OE>^n,8ÀY–IhmÆê(•¨L:Ê@uŠÝ¦zŒ1fØb±X,{€™&½T#@ÿ¶+)8‡’A_¿I2_ž©4§uæ&ÀMÓó‘H¿Rv{ªIœfÍÂPj`0 0f˜¶l±X,–ߎ¡ì«_3Ûƒh4ýþ~.Z;v¦…PêPÈc™9&aõ…hF¬THM)%…J%ͤb ŒÆ>åæÜØQ£‹ÅbÙ¨Û+1§Ëp&DXJÆêЊû>BO"CO|–™Ÿ!L–1×UI Ç¡¦óМOê.¹l’Åb±¼˜èppa ˜ËÀLc sWk@JðbÞ+~!»KÖuUª¸ž+;3†©ž©:›€Å™v\QPœC¥€‚'•iCïºÝt~<ÚáA¨£¨8»GjÅÀ£ÑV.#qa3ÔSž^cÚ6жX,–3Ù$1ƒQ0 F€ùŒpcFª8KRÁŒë iFs^ñž!yQ’E ´TÅ"ó=“¥ÈRff¦GÌjÈÚŠMÀI_–`ÌGÏ~–]b!Œa«ÝÆØ(z{P)¥¸œqf˜1†ò°0™„•×J-‹åàB8 QŒÆxâ4 Œ áÁ¸€„BüÀðSÎÎüLIæ—…ï5Û­xûóænoÏL%RZèÀq¯G¦1¢4K0¼XöØÏX&•v ®RúûÑj .]…8dš\Ð@×}ol’Åb±¼X(! %‚iæ@ûw´#Dš2yžÇKLk©Ô„3ÔÊq†0»Ñ‹­(øàYå@ÌTQòìðÓ(ÏÐHàØG;’îœÌ p€53µ=•ãwßþó'žxbÛ¶aX ü0Ž­Q,;Éþ"Ükã"S®ë?ýÌæïßõÃÍ;¶¡V…ï°t7&ê^bœa®zJbv«ÝÐØ9k¾|É¡á‘KææÆž]¯3? Xº›·ó§Ÿ|ð§/\´¤Ì|K]tv]-e±ì$IBsé³,ãœO÷Ö´Z­R© Óé„a Žck¿ç(¥„´Öœsº\–eŽãdYæy)¥ã8t!×u]×m·ÛÅb1Ë2×u©žžsÞ=ŒN«”¢·[,¿•–Š " Z7¸ª ¸ý©çž¾ý?š[¶ÍÜÜ‚<0à™VœÃeÙ¶ýóÿöµÈ¼¯G›™2,¥ e”â,W¢à‡çœ—ݶ±31¾’Õv$ÍÌ/•d?fzn~Ž{ÇËÆë¿î‚…óç€ãå¶Xö ß÷ëõºÖÚu]!ç\) MÓR©$¥L’$ Ã,ËêõúÞª/€®ú¦iJ—ຮÖÚó¼F£¡µ&Y¢( CzÒ/‹J)Çq¢(âœsÎÓ4íª¯”RaÕײç¸ÂUÚ€s¿³uGãçîØ:ü\Þëú]aŒÑWLQ.—-ZÎwg.ïÛ¨|v²~ÇúMøñŸyùêAu«I‹ð¢$€éNš›;«¿uý%å°4µôÝFÎ-–ý„,˪Õ*)íBH)=ÏSJi­I2…ÕjuÎOåœs:€8Ž¥”N@¥RaŒ‘9[(tU–²% … 2¡_BJÙ]ü¾Ýµå`C@+ÉÀn"yïƒ÷m}ô¡fµò^×ïŠ1†snŒáŒ•J¥#<Sߎ™¡ÛSkºœ‘2‰ã_=&Ì[´ÅH—yé8½šç(À™†ÆË[@Êl*¡Ý&;[ök\×P¯×É $]ì>Swçw‘e,÷þ»mŒ!“ºûTN¦m±X¤¦4Zk!D’$´ RJ2‹é€8ŽÓ4¥%ÅqÜ]3­êw½ËÁƒv9À¤Rímã?~ügã;ÃJ­’÷º~W”” Z+¥8Ø!ƒƒˆcÌè¤c ©/ù¢` ¤äþüïï…KZÅRËQíy©NóûBÊ8…ç‹rÆpGÀØ~–Én±ü­V @µZ5ƤiJ±^ÆX§Óɲ,ÆØøø8!D×<Ýs8ç]'ý.‹Ý?Ñ™1¥©ddw:Šøj­Ûív¾ïcÊ>îZÃÓÍb‹åÿÀ@9@Ö‰wlß±9‰ç5/ÈgdÐ BŽ"F*)ey¦úoL¿ÀTûdιœƒóB¡mq]GÍ=¤®ã^ærŶA–óà4çHS 3YCfÝÏ–ýžR©4::Š©‘Õþð‡O8ᄱ±±0 ]×}öÙgÔjµ|àGqľ¹|»¿Žã?øàƒ'žxâ¬Y³Î;ïDÈ97ZS’¥S`ÚwdF`Ssü´Öš²±ƒ–a9þÕc}åŠô\­U‚¬Ä•›—)EÅu¦¡oï]vË‹IBúÞ8ÿüó7lئéô„çB¡À9Ÿ˜˜Ø—¯‚ÞE¾nzyï½÷®ZµÊqœ â8ö}_Jéû~ÇdãRê5¥\’/ºR©pγ,£Ì,RJ¶ì!šZÿ ÁEºc‹Ójïd¢†| ˜¾#¦À „P3š‡õë¬5Œ)öôŽm}`bxŽ1*($ÚdÀ,âܾõ¨ŽLCsjÎ4R*¯õX,Óé&9Ó7ö²Ë.[½z5**¸ä’KþøÿxÆ K—.]°`çy»}ßûÞwôÑG¯Y³fË–-t†F£à†nX´hÑ!‡rå•WRbñ‘|dhhhñâÅúЇhYÒN§ú§ú§Gyäꫯ~ÿûߟ¦éÊ•+¯¿þzòQ_{íµK–,1Æts°)𬔢ó!>þñ/^¼øØc=å”Süqztøô§?ýGôG‡~øM7Ý`ppðá‡üÿÙ{ó ˪ûÎów¶»ß·çžYYTÅR¨(,@4PÚ, ËK²5m„»í±vh"l‡…™PÌL´;,™MŒ<îh…„P·=î6–Œ-@¬b;EíY•™•ËÛßÝÎ:xSÝS…Rj$£÷‰ŒŠÌ÷nžwò¼ÊüÞ߾妛n²Üyçóóó;wîüßø hµZv3_ýêW/¾øâ­[·þú¯ÿ:ôû}ؽ{÷“O>ùñ|çÎû÷ï_[[ýd”}ýÏ> ã»þd˜·cŒ9ßðØz„•‘e@’0ŽTCHÐì4óT¡¤¡š8 ˆ´™É˜i IaN6GÊ„9÷ ®ƒØ1!gY†h› éø¹³Âà:QLHæ3ŠU¾"I*4aà’Y¥@mÊÜ ­$º@aB°Ã2%4„hã~40ˆR–2`• 3$X”zî¨X“=À=`mpRÈ]0 ¸MPxˆŒµRvÚ=`Œ¥`L"F·‚·¼wÆéè5WWÁEHç#‹sĈs`%Í&6SJ¯½öÚ¿üË¿ìõz¥R‰Rzß}÷}þóŸ¿ùæ›WWWo¿ýv[¶{ÿý÷ñ‹_L’Dk=666??Ÿçy©TzüñÇû·ûСCFcÛ¶mÓÓÓ¿ó;¿cŒyúé§o»í¶……˜››»îºë®¼òJ›re+‰cRÊßüÍßü‹¿ø‹_ù•_¹å–[”RY–­¯¯B²,{“J§z½žçùÝwß}Ë-·¬¯¯Û!¶¹ÇÝwßý™Ï|桇Ú»w¯ã8Ýn7Š¢~ðƒwÜqÇ 7Ü/½ôÒ'?ùÉ×^{mrrrffæ«_ýêÇ?þñ,Ë^zé¥?ú£?zàvíÚµsçÎ?û³?ûÔ§>%„H’ä£ýè½÷Þ;99ùó?ÿóò'rë­·ú¾ÏCÙ&!ÿ½o#~²ÐŠRw Œclà „ó(uÆä¹¢ÂÒŠ ÀTJî$! é ¥ ËEQdIÞ.‡B0BJƒT”:¡´ã¢º‘Tˆ–TË;JÍ"ìQc¯_ÈÏ]‚ªŒ Å‘Ëç×øàÜ÷ne>] LDؤÌsÐ9ö¥ „ª4¢E~ ㆖¹&/8¥2ï…ÀLìÏ$JÑ·opA|„’4!G.©#Î5a­­yà 7´Z­………¢(>¼¶¶öÁ~px¥-Û½ýöÛo¾ùfû-ŸúÔ§Ò4µþá;î¸ãºë®«×ëð±}ìá‡vÇuÝÏ}îsïÿûƒ ‚àÆoüüç?o}ËÖ¬´­¯8çåry}ýõF»V€§§§Àó<[uNz½žçy cccÖ=~æÌ[õo|ãÀ—_~¹­¤BI)¯¿þz«¾J©/|á ùÈG&''…¿ú«¿úWõWEQø¾Çw\uÕU»ví€_ø…_¸ï¾ûl+.BÈM7Ý´mÛ6Ïó<øðÃW*×u­Ç{sl#þy¡%£î@K1ëa¢ /ƒ6•Ú"egd‘Šœ(N4Ï1tƒ WôE:Xäù)žž‘EOsµòEç„  2)¥ ÉKÕ¶)2T8ÚR ..‡;?¦N&Ìi¦vºÌal€ŒV@K,£bmö|û™"N憉êd |ä‚&)fȵ>‚ÅÈO!+@æ‡)Ó¦èjx5ð³ÝKÄ%jÊö†==# xĈscõÉöÜ›œœ|öÙg/¾øâGyd~~> ÃN§®ëZËòСCûöí³Í#§§§{½žà‡~øƒü Õ¹0 Ÿ~úiëæ=räÈÇ>ö±,ËB_|ñW¿úU[òDZ5 !¶ÜÈ*™mlÉBØn—oRglÝ?÷s?÷™Ï|æŸøÄW¾ò•ÉÉIÛœò›ßü¦5¦•RƘR©¤”Ú±c¼ÑMóÙgŸ½öÚkÓ4u]wëÖ­û·ëºn¯×{àÞóž÷Ø—¾ð ï¾ûn»1cL¥Ri·ÛÕjÕ÷ý¡¿ÞÈûZrŽxKa\„°QZæ Špmî•»N//øë‹[4¯"`ÀVÂòJ­!¦®M Y*ràI½¹êž>>•ôÆý°lÈ €@ 23Œ”çê‰Éôò+žÌ3cÀNÖë;k§ç›+ãEoÌ =É™ú䫈$F"#ãöªè‰è|‚‡âÝ¿°½HÐ=_ï!¯F"ÈW›”‘“»•‰ÿñW§ ]ÜyçŠÐuWOþÚ¿òÜúóí¸¡+rwõ¨:újräØšÁci±±Dñ‘qlž¤UVË|ÿûß×]wÝ|óÍßþö·ßýîwgYV©TJ¥R’$V¤“$™œœÌóœÒh4lÿHcŒçy·ÝvÛ]wÝU.—9çï{ßûl U»Ýö}ßfHY9'„pÎçææfgg—––Â0üØÜ–š£É ÓÅB³%%ìªA³ÖhŽ7x" žÇ@.ûAøÊâK³wý-Âδ-^²·8øÄ¿Õ|åñ*K ðˆçÀ*G–eaº®«”ºñÆoºé¦Á`ðè£~ñ‹_´´Ûmk†Ú˜ñúúz¹\VJ5›MƘÍCö}ÿÖ[oý½ßû=ιïûJ)Ûfrnn®ÝnÛHs·Ûݲe‹]çÞ{ï­V«Y–Yó—ÒétZ­Ö°ú¨^¯Ûÿ7ɲ¶ºÞív¯¸âŠ{î¹çÎ;ïüÄ'>177wðàA[F…1n6›•JeX­dwÇqE_øÂ>ô¡MLLØ™f³Y¯×…·ÜrËüÁØv]„ß­V«AØ›•0 ÏÞcldþþ4ƒ¨…C ! D†GTª]ÏËóÎ|‘¸…ad°*X]_à¼HyZVJÎO&¦*횦ÊÁ€À1&W(§HhŽ5(Š“Ø¿²PœC'ÍûH:T"¦¤hžqDáÇAÅy¯Çft\îŸoŸJ§ÍÕt¶æïÛ7y⿞‚î ¦°îШþ3W'Š71xÙƒ…z©h®‹V{%ÉÆ½ lLø`°ë™[K'^ËôÆÚeîLGŒ8/g+Üþýû“$ùÎw¾c»^xž'„ð\.K)…—^zé±cÇcl³ ­'yjjê‘Gq]7Žc„ëºVJwïÞýüóÏÛ—xá…öìÙcŒB\tÑEóóó»wïÞ±cÇ`0°¾è8Žƒ  ”FQd;PRJOœ8q¾w:Á`P.—µÖžçÝtÓMû÷ïôÑG`vvö±Ç€z½n³¦)¥VÑ­SýÒK/}ôÑG'''B6¿Ì°¯¼òÊ'žxÞ°˜Ba¦ijeØæ§iÚívmÚófö¸ñÏB2Ó !¨¨N½ÕV[Ç÷9ÄuÀõ=æc"/ («K1†Ø6¥wgÝËÛg¶ä)8ŒS¦zš †À¡Êhª8FF÷Ä™nVH9î¸úádT+J㯄ãߪ`ˆ ÅU¯—6»=Ž™ ««çÛg}|Oìï@.¾¨2>IùF2‘¬øQ{ëÇ—cxûl–e­Vëþûï?ßþ=Ï‹¢H¿ÑþÔ©Sǿꪫ„Ÿýìgïºë®#GŽEa•2MSÛ\ÚÇ¿õ[¿uçwÚX5¥Ôqι1æÓŸþôßýÝß=õÔSv£½]°¡èašïûµZÍš-ˆ²w*?·jÄO0 ‘Ì„q^ž:ìGý•Ãû}MáÓBöÒ¼È !L*ÑšÀ ù>ŽV¢*q…œeM”i¤Á` @c¢(E„¸(#„8©"…ÒÀ¹W yw[¶¾«Ý$HN{îö4"È¡³TíN:õóí³y"çIuáh–$kµ1ש4@"Çáû®t’žZ|y²Ùê¸5S»Ò¶ÒÆã¨— ý€6Þ¶õ•Âc“H^°áó9ßÊä X€—@пN¤Øœ•B À$ŠuѦkEK‚ØÐ‡ 4  $À¦Î·ñSˆÍ²]!mÄTñ®w½ëþûï¿ñƇMžûý¾ã8Zëv»ýk¿ökùÈG®ºêª|à·Ýv›uMcÞö¶·}éK_úÈG>rÝu×½ãïx×»ÞeMÃ÷¾÷½ø‡xÙe—íÝ»÷ÓŸþô;ßùNxcÌC–eŽã؃A©T*—˃ÁcüÇüÇ‹‹‹—^zéÍ7ßüå/Y)Å9·Û³ûÌó܆ŸàK_úÒþýû¯¾úêƒ~ô£}÷»ßÍ»úê«?ûÙÏ^}õÕW]uÕ×¾ö5ë"Úú­Vëꫯ¾ýöÛ?ô¡øÿ½ØŽàÕZK)=Ï˲ÌÎf°‹ÀMž»Ýn¹\βÌ÷}ι]Ê~b„7²‘áÊ]›`<|!›hmŸ²ÿ·:¼Æ&<çyî8Ž1ƶʲ¯bÿµq\»U»ó³S¥l[ÛâþœÕé4M=ϳ±mJé0RîûþpÏËËËÖC „°g5ñÏ )ú_þígÑepr¡r lCëhÌ)TàûQ/ÚžtÃ+®»·{fïâ‰é~j¨C´v”ä„%‰º«Î¶=Gv8´vºrä¹½JVœÀ tËÅ . ‚ó€UÓ®fáé—´Õ¥>—¬,óÔ¬¿ôŽõã—õÕR8žÒ ×]+UZ˜ÃôŽ…Æ”,r8ôÔÞ”Â(ϳÐa ÍÜÏþëÿÌN)&~÷—[+ËSÿåqyÓǧ^*ÝsoxãÍI‰˜oÝŸ^vEo×ÌÜ¿ÿw¨(w0þà_õ.Âý÷èd0·óÂêîÏD%ýõÿ8•¨ cƒ±@*×Fh Šežpñ}þõÿYuóz Tˆó&a™ÜÓ̉@SâRfŠ©›‹Í™É¬‡# }×…UÚ#ÀÞØ¬ ŠЀ"ä0ÈèÑ`Ã? 6|kå!„Š¥ã8vèPžç¡ z½žã8¶@Èu]«|6ߊ26)%cÌNR¶‡´Æ´*û 1Æ*™}é$IªÕê0oÙæp 3›li¯"Žc«ÁZk„µJm" / ¶Ý!¥t(œY–Ù°í¬iU“s-=[Ýkƒ¾Ö£~ö)ÙÞ{SSSÊ)ÛKdø¢#~Úðay¯äªˆ½hrËÚ‘ï^”u0!ƒÐ‰rS1*œ@‚"s0!:e³;ŽM_p:éŒ>6V¨®Ð"ÙcXy@±ÊH XîÚR°vè½}Ñ‹ýòÌw&v>IžrÆ ›Í#ª4Ö®ùÅo]7ï¸I7l.••„ ÅD¼ÞÚ°7Æ…)Ì()$Âiÿô÷ŸÜyéþ#ãßÛ1™=ø ¿Ö"Ú0  (ºÿ¢µ .29t0Ìå9ééÞ«“ÚqUlÝÐùœ_€¢ ‘ç€: 0 Tû!ßË µH!8!> AI‚ h£¿¨™FFÀ ƒ QþLj+”R«j¶ÞÆÆe=ϳE>a*¥¬‹øìﵡ×a(­5cÌzŒ}ß·[UûI’$AX³²ÛíÚY VmâtQö&À ª½'°Ö-Äql­UûÒÖØ¶‰¶–·õMy{(¥†òo#ßI’DQdŸµëÛ-cÂ0AÙ› [âlû£ ÏÊF‚äo؈ŸH:ÝQD7iÌIÛµöR±5‡l7æÞ¢˜É²J.92 TéÀ(g|¼½ãÀ‹ýNøêãWã‡c/çY7WL Ò%…VJ`â(ô[²ÙqrB¤zæíϱm¯-©'+þøÎo­žI¾}çeŒæ³[[µJÙ¹àŬ󎂃1c Œ•Ñ€@² rLâpèÅ©Ÿ¹ªý+7Õð wâ„ÔYˆ™¤ÀØ!hüý§.|æ;³«ý<®²Ù [û¬]°7¼ý T¼¶¡ó9¯Ú¤¢Ñ@1PH(0‘mÊ‹!@iÍñp¢ú@$"1} |C‚ d€2ƒs³úΈŸj!¶—ÅЯkµÊú–Àj!ÄÊ´Z-;+Ð*™Õ9+Kv(‚íÕ<,ü…³:NÛOìƒv5k([9„7¨6k` [@[ul6›Zk«ÓvH¶ÏBl¶¶ý¡†–º]Ä.>L•J’„s>ô¢clW°ÉbV×áÁÃÃÉÄö™†ÑÄŸbü8õˆKA}ºµ|tZä>6ÕA'Ä€¼¸òÊ]!<1(Q,kck[/û~¿Y?öÂÞ"wYÄy:‘õË^y3F ÐFS¥ f’WðªñJãëáØ!žT‹~hÈ lDuk‡¥¾(â<?ñòÎçÙÕÖvx¥c̳]ç @Ø@ Xjt›ƒ—¿7¦HÿÙ'Doà‰cÈhl ƒ Fý¸wdpºç>½,>ù}ôèÔÌé·_¹áðùë€qF @RP¦ÁÀ^ë¼ß²!R ¹ÿз¾û¾Ýè0¡ ;h£¾c0@ÈÑlá?<Ã>SƘ¡RÚ¢ °IRgÇnkµç¼ÛíŽYŸ­•%¥”•«aYŽéÚ±¾Ãem„X1¬£µ Ÿ}ßït:6?Ùª¸ÕT[ då1Re(/Ï š^œ"7¡ƒ‘3×wºqÐè º‹ªhôš†R Æ`Œ&Zé'O‚ï#„›Dî«`*°>ìäÓß{æÐR±ì‹€RŒ6 !´VFª Bh@¾9ñÊä }ò‹>òÊØ†Žç¼ì°*‡¤̱)|J]*?ô{@÷«Áƒÿ·7¼óí^¥Ž4– 7ø»ÊHc„2ˆaê€@ÌëÉY#FüÀDQdÓ”l«çáãŽã «¯V´¬à€Ã0TV;:ÐêÖpt T«Õa×ÚˆÃë‡~]7µ+W*kmWÓÃXõ°ç”Õr°ža;šÐ¾Â&REQ„ªT*Bˆ¡ó™1V…ÖÚ~imk+ŸVËíÅîv„^Û°÷Ð9Ï9·Áoëxÿ¾I#~²ÁžH Ùí’g¿u}Òï{1çÙTÊç®»v¡—ÐV‹õºçœâ–ëœ ý3/>¿WðˆE\*“gÆ÷RÏw’f„\£” „JYhèPâ"T*× %JTNEáŠë$v UJº ß;ÙíTI/ïÎ0×§´ &¨Ô19‚„Ö ƒ—^z (Ñtš3\åbè\Xª -·„Ò˜BëE@mÇC…l‘‰òJÆ(ê9y ‘e7j9¯£,&¢K5>^Ë·LPßãÔ…}µÎõ†¼Áb4NtéËÜñÕ}—ÍsÝØ¯+,U&Æf‚éYOa¨ƒö9GžêˆÿD†©ÂŽãXÃÔ†c•R¡(І)¾Ã9€c+N¡³SŸìRCݲNÃ/ÏÎN²ÁW„ÐÐBäyDZ½°Q[» Uh›ùeEÎfcÙE„6ýØú™mÊ•½8Š"{Wa_ÅF¦miïð>cØœÞÈG³¦ùÐó<´Ômеëºgg†Û°9o¤mÿ(ß®?¡H-T±ƒÖO·Ž]Õײt‰‹^lCîKƒ¥éõ“³™ Q”Äõn¥Òg¬/ΗƊ$´‡¥î®™Je%ÉÆ ’@‚…¤Ö\­‘Ì;e¡ÀEqX{ÄÕÁú™:¥èÍÆ¤Ñ|ÅhIumÐ;ÁDÝNè0vêÉñãÇÁ!ZkÐýª{@ò{X¥%ºuÎÁÛžð.nt¡t¡5ƘV\a5ëÌBo1ÇÈ`!‹z&h/.ìؘš‚N<ÀŒ`@XÉVOïì·ÒBf~ؽb‡31Ë»ÝÕÕÃxñ˜ÛZuþzÓjlSд½÷Ÿ¿ùw¿gÛÌL–”â6V2hÔ8ušÕ±[¶Ÿœ›}­Q+ï‚9T¦óÔ!ÏÁ÷ ÃëhÔ|sÄ?‡: b À# @AÄ~rö#¯kÕYÿs "Ã/íRC|×?ûâá‚èìø #Œ…lø,Åôë bÀöqF^¿€ B {] ò]ÿì‹)¦ÿýÌ·nÆŸýóÚgêü¿ç@`¸Ÿá®Îþ©]ænð×zÄŽEi)‘DîuûŒì1oÐÈÓ=?€A§Lj‡2¡ódÐs£²$þ¢Og´Æ ÏüJØÍ:,ài’jÅ%A©ØÇ(è%‘k_ÿd\Q¯=öîÞá +Ó"®¾ZägÔê5Ú}­6÷7“ófPL__”j.¦s)?<¹e•mŸüÏì^(°{üL®M¸®Fìð±ã>ñdF\‡Brç°yÜôÑ£Œó6ª4 F23¬Šùa´^Bãsýø5à»4±œÕZ ³±êÔByvéÊkÎôWw?õô€ó\:'"4P’+ÞGÌ£åÉþÚ"8ýêô+¼]+üÍ¿y1ëJ?jä™ô\OðÿyI²Æ–-}D–Nœü»¿¿çÝ7\¿en3´1 XºÏa(uW*ß;‰žáÝjcußåË.ŸkÔ¯Å^ØZºÕ0B@ñ¨)ψ#F¼Ž¡È(p°1^¢0¼H FüMYßH–¤¨ÈBˆJˆñ|ü¶ƒ`Œ1v@E<-uÖÌúÑã09>EmÐìôãJ³TÎÆÆBÆXéÊ;²Ì/’Édm{{mLµ€ –¼­QدOÝyaPÚ,/L¯ŸœD.cŽ=zï¬--³ÓN©ÔYY®mít×;픹¡ÂR‰’ÔƒYL IDATDFUʳa8•¦.p„ò㉤7±÷úçwˆ¾Ð˜ i…‚¡R›‚^Ð#Í'^|ñÅS§— ¡ !… ø>ñ\µÂ«;ÖúƒB¶¦Á  À>"Ú(ÝN(¯BZë¢P¬ÆÞb¿54ã4®´ôëA¦m’ò?¹!D&(¸¡S Kåé`ÏþüCÎòB׋I.šÔu”tMžoV÷h‘qPšDeŸA»¥É¡ã'8ùõtƒDªº d#ˆ 8°µuàÚ ÿæ?¿’óJf:˜O&4=-Š‘zĈ#Þ î !Aò¦ßî}íó` ”ãˆéb“b º  )X“Ze@$(Í)@guR"ÈB )S¨×#&b @Üž½10€aW€ÈP¬@qÅ Rp˜…”QH­Ò"¯Ý,à( ”ÆÝ/ ¨!…î' | $sãZ¿Nm Ð^4iÇWÀWU¨ ¿Á,h-5¨»ŽQ(NPç¢]iû¹ã߃©Ý$Jú#"©CH´Sžäy²9o@žBÁ€s`4š›#uO&çî—}¾RBæ%ZùFÕ±ö"€8ÁœPý4Wi,Ü\‘öJÆd2û*1ýˆ#Fü´ÁòÂQޝÄÖkÖJw)!ü”·Àc¸Øœž*®ë2Y–½.´Æ‚ B¨0Ôh ÆÕÒWÂÕŠ¢ÒËH×´¢µÎ)*a(ƒ\'—*–ÊU†€öÁ0„¤RŽóB:¥9™²£GŒ1âÍŽR4Ôy².E—sLc(…:íƒnÊúY:Na³´Ò"îƒ^Œ€* ht<F*DÕ×,\Íx–pB@.€œcÏEf€4å’AêH  ûpZiìé´Zƒ4u‚€#ƒT9nP«§Ó Ç! S0ö„F‚ËÌ¥È<R÷JUi‚B!ωë Üë”8= §!àvh­A!Ð  ðÐ!‚L` ½ú4—€—ŒºZ9*c Îp¨WƒSР\#(¨™NÒÀ„g9h‰K%—PžæÄŒÜ ÈÒtAŠ>8óy« ~.€By‡#ÆHÁ‹yÞé€)„s ³¢‡ ¯ ÞX•fzF…@j®Ó˽3GÖjå½­d GcY&ŒlBÅuhž7ÛÌõlNœâQ¢ €–Àb.VF1vÞr…ópÞàæÄÆaRP¤p¢®?yèès»÷_tøX®!A%m83dT1bĈob!êk&M……%W÷Z…z{ÚlŽ”ñJ)FÅL¸Œ'ÒôlÔ4ƒ^¯Ž3†™­Bœ6Z#Z#ˆIspŸ:®1Æ#Œ–˜%ˆ¨Ë¹ôŒ*ŒÀh¤ë9<ç!‚\f”‚Bki¤²(@iPBâ8A$2¦’c§n@Ü7¸`¼(¨ö»k`$âúXˆ¾–šGd=ÐÂk8y±±zw ªOpC‚'¥ééžþûZ_­-´&È ìùZhÎ òj ¡ó¹‚Aô‘ãæMT¡@kpˆãº¼“çƒ6´IÙ'ñVŸÆUfFÈ ×%¾Ê´”P”LAÖ¦qŒÁçN|W IˆQZ‚ÁÔ‰ÀPÅÂJ{7fJ€¾Àyè¸ë¯LÄÿâ(3û Ò3Du1bĈ£s£•a€ÐFk®uþƸ½L&Àƒ`Ì=õK¿èLn9‘qƒºY:~ÿ=½•uÕn1“x‚‹|øã\dD;=èNÍ_ðêeûÛ/[uÐÜâéSÏþÃÔâ²—º4çÓºèo› ®¹ÆÌŽç¥ Þ‡šƒì[w³#‹Ò-m+ÚÇÁñ‘ž!x øñ§™ü毯,´Ëßø‹9'\-œ“Pžú­ntVvÿË_[®Ìø¿þ-ë·èDùâÿá_~·\*ŒÛÈe:O–Äw/}÷Hœ«|£ç@!c Û7ç í)µ,4 è”zçˆ ×‰MU…‚ÐóKœçq!€‚ ‘€à!øB®8Ph)4@ÐÓÄŸƒDÊ„€J`¤,ú €ãƒsî;2œ¸¦¯¤Ö!w¦6FXk Ædã0­ô›ÌI:7B!£h ˜ƒ)ÃJa©´.ê'y¿àªÑ F˜õO“8bqkZAäbýD!` "@—‘Ó7™D0¡ZˆjF™RXçÎÊÖžŸB›F”¹˜;\Më$2bĈoM”Òˆ3ÂÔÏy Þ°‘wnˆ àƒ–€Œ&uü$ðf cõ•Sî#ílçv6·séÈÑ~Aú°¶ Wb15¤Ð0 9=¿¸ãßøz*ÖC§R}ñ»tÇE‡·ï{m±_Mó* .é ^j[…\ö²îÜÃ,S¯ýžëÆn© ¸áFƒBtÎÀqYà*“b¤ËåâÀÛ—ú+ º hJ¹Ç˜(½íêµ8»í61¡D˜£„ŒrºÞIÁiC;àùÔ–r~®qôD³PË1¢€ÑŒŒÖ¶·-hºQ6 !Ø\¤©`9˜ÔÖÐg 45ê‚Ȥ~EE/Ó"ÏP´Ä˜„ÄÏQƒ#Ï`DA L.™¬¬xUÈ@ö^§ÈU q4ÉUÞôâÊ9÷“ Xû-û„ÈxªðÀÍ OŒ1bĈŸ*h*œ´ã+QøD‘E–ô‡ÝMJ𔕠„Î nc*Òƒ¸j£òšXÛ•,öÌÃ?œÉI©®=¤{/0Vª|Ñów»Þü|½3XÌE_âjPWJVÙ®úé{'SõŠ‘¹¡ÐÀ0¸=Êæñ,>ƒ£1iè`|Ð9 º€x»YÖéCa ­Ÿˆ¶n_+Ï&I¤ $¯õwíB­e! *P“õRc"IR ~0†ÓlÜl½ßk÷Š­{›òœs—Ñž÷œ"Æ06R1Æ”Ê\€ ¶lÌ[Æ‹\7‚rŒ!²’sì'uè¸Z*ùµ“Ð[cÝ Z1¹'ôƒIHM¶Ò$…£ž(€®¤-’½Õ D%m°8yÞ:·Ì#aõ¸ÏOei P‘‹ÈMºƒ1bĈ·(ÜG’„ÉO úGÀ€8Ñ—'›4 ÀH0>€˜( € ÒZvV: «”+Õ£ F·+m‘  2'kÈͳ3Ý´ ž(åý$"sE¶&hý…%pº’wÁ@†jK¾JMV漟EwPôV ’âzUç"ëuiX’:A(Z:Ž¢Y~é•ÙòƒÓ™:‚TeÿUy$gjáRtŠ»U­{„x°„Œ1‚ІKl(bÀp¥eX) x÷9~iW–·Šþ ðùìpñ>w~«ÄšÉñÕÅò3«Ÿ8Þ)Jn}¼Ð]‘Ÿ“2SÉÉlùøä¼ÿ 쿤2;èY.DV^]*¥ýªbV:7VÆæB¯RåírouîôñJ§9~…²s 0•D'öèïþoÿæ÷>NKžë(BånÖ0‰#FŒxk¢•dØãݶSùóËü>FµDu¸G›²¾K•‚\@AŒ™ë¢êÚráÒ XåHµ®{ßéGÒÙ?ÜåUåÒb½Q!ŒÆúˆùIr誫ۓ1l™ŸÑz¦\©¥Ý•>ðts)ÜZÞÆM94†ã5eQ —ùeÇcøÕ+ÞÞ¹ï;=;ñ¡“ëY®H‚uš°Ú˜ÌФW ½ðÔÌ ï<?³âô˜·å½åûï\™Ÿ¬•ý1e„é¬r?Äz‘§KŒŸ†´òü88m0KŸ¢¯Ï²Çc’ۉߘP½A-Ïø2`Œ½)‡0ÑŒ^{Üyî¿öÚõ‰ÉÕm¬^÷η–<÷ É”p‰æKõKõmIñõlnnßÎÒ;œ¬¼~ •âE´¢Z„I‚yÞ»±þÞ}o¯FU¤Ò è4&UmòL®K¾3•½sî§P0dzÁxMäaŒê€GŒ1âÍ@ˆ‚ÇhwŽI€\"¢fs:a9(TH”Lêh¬E¾<>Ó](O®m_È”wâèN#.&°4=Ýî6#‚¸çA@Ç•—qD&ùÕ}—­Íw=YŸ~Q›âøËo“‚ÐJ7ÏZ„”c§9óµ_mœšÜšTòÒ_úÅݯ}ñÇÚK'zÑ–Ó Éj‹DnÁS‘#O¨}W¢—n>5qÅeý3+pâpiË\&HbL ƒ¡”d¡K¢È×W&äå—-z~qô˜–`ƒÓ¯ßHiClò³1†`¬7z΀P08Ï„(:‰ËŒªÀƒC7¾´úÀ%—öw\(žûn«µ’ Üú¤ 2o&|%Ù>¹ãºÿ¢Q_j® µv5vˆÚìrYgI:µKƒö „2HüÑxð#FŒx3@\GƒçT¢^3âÒ04Ùæ´"&¨Œ©Ca éZšª“«—\ãFº›êî ùö½c»íÕI/Ä$h¹L+HzÝÈ脺µÕå1Jûm'•ŸýFZLièúÞµý"3‘,̸ÁeàUƒ{Ú9é‹hþŽ£'ï¿DË)7ô÷îš©W>pçןY\]£ œqI€Ø)$æòä¡ã]WŸ~ù©÷\yåãÿé¡T«­Š/$€ÜÂTå¬àÛ/(ÿO¸Î‘)û‚¯—Ÿx ^8N!0°Á$_  A# Xré;¡+”"©68PÏugDá(?ÍL¢¤ãxSMÿ^ÚÝ£NÅ[ë]P.ø *­keˆ{YOƒÆï{ÿÏúc&1Ku"2§Æ××N(=S{u™w4?ÞhÈþÚTº˜&^cæ¦Ù=å²Ü¿Ž…/ƒ:w–ÆM¾”n`$AÔ¡D›4ÍcÄO,Ãñïv|=Ø)÷Ýn·\.€oËí†S¶ðYa¥Ôpý?)%!!4|õ¢(cœsÏó´ÖcÎ9¥c¬”âœû¾išAI’„áæôùûÐZÛMJ)ÇÎ9!d£çp>„Œ1ÈóÜó¼³9ÃQ–eöÐFü¨! ‘¡@h.B'”‹´‡a“ ·§µTJÝfQ@‘ØóÄ·°¢«q47¿µ·ïòÖ™Õo{Ú×*Z1é,6AÞᎳ„,ë숣¥2>OcDÖ׈´1Xß²ì‡ h­ÕÐ Brq»QXö„ú 5¥€6Ä$Aj°íÌá½ÝVL‚3nù Nñ<'ÈØ_FÎyc¬ÉÀõ(2ƒz5Š¢…|ò0]‹²^üÜóùÜe'Ÿ»¼·6‰Éæ¤äxË`Ud¨µöOüêêª1†1Öï÷­ygÿ”GQäyžã8¡$I¬^þ`X+'ÖÈN’Ä÷}­õPÀ’$ét:”R»«ÄV}Ûí6BÈ÷}ιU¾ Ös¾ï‡a8 <ÏÛÄýØ“±?>Bè.§i*„ð<!Ôn·í÷þxïQFl"’¾bØq⶘Ë)Å`˜än‘9Íc{@Õ‚˜kÒ/„ÁRâAÒÖd}" ¢vQÔÉ„½žô«ë‘Wî­­U‚±f®/óÉ"w 9 äÄä–3”:Õ àÌõ°L· b&tD‘ÐŒºÔõõ10 ”vYÒ>³ŒŠHjgœ°<6· ²HI¨~R,ÓaN¤eˆha!êQÆ¢ô¶š•bfÂï¯gª¿}£ç°i,UÏà6øPM6g ‰w_È>ôah&­ÿtç‹­•±°¼ ÒÌ\)‹x1C¼õL¬ŠQLŒÑÝ{Ä ÉÏ,…­•šÔõ4Â\Kerç‰û¶}ïá=KÇ·ãÏ_þžk*+Rw7kÿ#ÞJØ?îJ)Üýæ7¿yÅW@ÇÖG1N’äsŸûÜ\pâÄ Œq†Ö0ýÁ^cüÌ3ϼóïܹsçõ×_Žã´Z-X__ðR©E±}ûö[n¹Åq!ÄÞ½{o½õÖjµ §Nrçǘ„¥”²rÛëõn»í¶ƒÚ°ôf­¶vE‘e¼© :ÆØ©S§ Z­Þzë­{÷îYÀo˜Þ‰ÕU”yÊt½x½1»²e÷juÛß×·=PÙòÄ Mš«ÁˆbƘFìºòñ­W܃Üe¥Æ„¨·;•^{ëÄ…ÿw©ñòØ–#ÕíOz½¹<'ò'âi{a ~y‹NiQŒEìa:;U ªµ”Zcǃ•ÐãV(Ž=—@‘ðNoÐnBP@* 4ÈÝ2Ö9n*W! ‚ö«a¾ïºÕür¸¼¦}üÿaïÍÃì¬Ê|ÑwMß¼§Ú5©ÊœL€¼mDÅV[±mq¸M?J·}ñôÜ}E´ïíVÒ\õŠ€âp´[ AH2'•JªRÓž¿qM÷EvsN'ôOîUšý{xx*»Ö^ßZ«ªöo½ïû{ß÷WhÆp¶À=`±ã“&‚tbÉZgãù.ªõÿõè°>GB ÂB2Bµî·lš…µ$à 8ú‡wf4-Oq£gŠSf«´¬•À¤©—Ð4«ôA%÷ÆÖ=SЦ¦.<]Â^µh+œBÆùl´Ç6l0L$R)åû¾ã8ÅbqllLJiì-3æWSÛÞyç‹-úÉO~ÂCU*•®®®$Iº»» Š"×uÇBñW±X4Ï_«šb¶œÏç-Z´zõj#+ûÂáÿ.xà‘‘‘Í›7¿Ìü­V+s,q—J¥¶Ï ƒÿ zX)%E&eƒØ³¦—Ï‚‚YJ”&­ 1{^íD7Fš…J æÔ1P¥°( ˆë-üÀú…+·çËǨ%Íá¹qgv¾!­ /.õhÎ}·tdáú&E¶å51N(qNìúßD-S…³TH­1$m'XšMM'I@¯¬² \ LÚª?izs3 la`-/œ<Ú\[yÇyÈ*5ÂYoâ`¼ó¹ÕÛw²Ù° ö‰3:‡³FÀ˜ô¨´Ê±IÂú§.ûOP„…wýE#*lpUâä(Ÿ {¨U;Ö¢Ÿ•A6V°‡Eð£Þ¥¿pPé—? ÅeM:¹A!Kû1šw½¥ÌO¡0‡â®¤Á´ÜcYDG#4¥>›:‘^é01à0 s¹œ Apã7þÎïüŽ¡@Û¶M¦ç¼ÙlNMM@Û#Úl6}ßÿÕÔ¶‡~Ë[Þ"¥tGJÙÕÕEQûÐN¤iµZÆl;ŸÛ3˜1¿´s(¥ozÓ›ÞøÆ7ÀÙLK) ƒ~ýë_ß´iÓ¦M›^& ©}×uBµZ­CÀÿa §)ËYV)W©rÒðfâxŽpmŒä„å4åõÌ3ÏÜqÇó7#¥½óÎ;MþÌßýÝß­]»Ö,ؘ•F®Õßߟ$‰qü~úÓŸ^µjÕyç·víÚ£Gš¨ç=÷Ü3<<¼qãÆ‡~XJ¹hÑ¢ŸýìgK—.}÷»ßmýo|cÁ‚‹/~ï{ß Q™õ|ík_[¾|ùèè¨yÝÄ_—-[¶uëÖ·¿ýí ,X¿~}Em‘³¡Æ$I(¥wß}wk×®5žƒ <÷Üs7ÞxãÈÈȆ Z­V–eþð‡¯ºê*“H-¥|ÛÛÞö®w½ËLõå/ùÜsϻ馛@k­µ^¾|ùO<±zõên¸á/þâ/yä‘Ï|æ3ëׯÿêW¿Úh4àþûï_¸páèèèG?úQsP†kÿàþàüóÏ¿üòË>ÜaßßdNxj l+ï:Ã’Hé(K£&µ8¥4ÕÊð)å£(+éT*ÞÙÂˬ…½MQÅã:‘ôlÏÙGu³)`ÕP޶íæ¡å\2𢯙NQ¡5߯EA[±oz5”dB*KðÁDBlïŽi3ÑC"È5¢²B] ±‰Êb›Y 3©Sˆ­Ju_ÄSD$@%' æÊ¤÷P(œJ´„ØÚæƒ år‘cÅ@ʬF:„rðRhœñú¬]o‘îÓ¤eÓ˜Èxé–Î#^íQ`9ŽÓ0Õ³2>)X]k²ÊÅV=jfÅ£,x²»÷XsÆîOHÏ1;eî Öy)-É´pJ6"ˆZ¾Î{µ°>Ó¨Ï8öýžTvR_0Ù)/ÍôugóæÍ_øÂ´ÖÆnÛºuëM7ÝtÝu×ÍÌÌüÃ?üƒÉ/úÁ~ðÍo~s||<‚ÑÑQÛ¶MŽçž{îÖ[o}úé§GGG—/_þÅ/~ñ]ïzWÏ<óÌí·ß^­V]×íééÙ°aÃe—]f¢ËZkcLÛ¶}Ûm·}å+_¹å–[ÞùÎwBúúú8çæ»ÍfS)E)5ïjKÆÇÇ=Ïó}ÿþûïÿË¿üËÇ—ËÿÚJå{ßûÞïýÞïíÙ³§¯¯RŠò}ÿæ›o¾ï¾û6nÜØl6>üGôG{öìA­]»ö®»îºùæ›kµÚÄÄÄÍ7ß¼k×®áááåË—ãßxó›ßl²{o¸á†­[·–Ëå+®¸âÿø?ûÙÏrÎM.2œ4:o¼ñÆ,Ëî¸ãÓÍuÝ7¿ùÍÛ·o/‹—^zéÇ?þñÏ~ö³—\rÉ]wÝ•e™ù)<òÈ#_þò—¥”Ï>ûìÇ?þñ^x¡\./[¶ìsŸûÜûÞ÷>£G{ï{ßûÐC­Y³î¿ÿþn¸á¯þꯌËýÉ'Ÿüà?¸wïÞîîî… ~ä#ÁûÛß¾çž{ªÕªbtt´T*™øÂ¯á·­ƒ~Ad)" #šh†©$‚'¾ !$¥$(Ñ@8Â\ F©M €•RZK”ëO‘– áÔ­jrLd¾àµ2Œ‰ÖZªLk ˆ%™ë3LšRÊ,U”HËŸ"k´Ï/IAAc‚½ Ç4ð$Ê’ˆ{§é½¦   …–¢ ¹À1 ßrdìGˆ$2Á2Qà@5YAàP' ZZiìG5 ÈÅŽTâÌJŸµK%E ‚´â"KTW~t~fÜrw]Ϻ(DR¾d0x ð"ÎRÇ®l¾¼ðîÎPg¶q¬Üše}e¥â\`¼± '=º‰ótÖÇY…ت•N ´*qΩŒŒ¤ý]ƒТ¥¬9z¶ÖßÁ+ †ÿÚªZcä]vÙeJ©íÛ·#„vìØqâĉ .¸€âû¾eYŒ±$I|ðÁ믿>‚(Š Y …0 ïºë®M›6ŽŽÀu×]wÿý÷çr9„Ðßÿýßà‚€Rúæ7¿ùóŸÿ¼)Œ1BˆÂÄ2MêQ¹\N’äøñãí4_“L)5âç¶Î«\.gYÇñÌÌÌðð°¹Fçüþûï¿úê«.\èû¾‘(sÎ7lذnÝ:ÈårŸþô§/¼ðBιëºï|ç;ï»ï>(‹wÞyç»Þõ®‘‘ŒñÕW_ýµ¯}íÅï¿ãï(—ËJ©k®¹fË–- ”ò<諒?I6!$Š¢ë¯¿¾X, !®¹æšçŸ¾Õj½á oBìÛ·vïÞ]­V/¾øbBÈW¾ò•k¯½Öìúo|ãøCãŠàœ¿æ5¯Y¾|9h­JN οúÕ¯nÞ¼Ù\>Þóž÷lٲŤMßwß}o{ÛÛ€ò¾÷½ïWËÏîàÿDYS@Œp†1j1ËFR•ÅÌË¥¶—Ú®²lL%àðÍ߯Р5Šp%•’óV¥'Kl„4ÁϺ¢° @Ú…*ÁŽVDJ®5GH"„X¼ÚLWk¾·èt4MºãØ–Ú²=?N8b¡"•0Jê³¥úL”ºÔ_=ÝúU6.ÂXĶ)ˆ €$4pøi* žÒq¨ Ì¡n²ªÕ-ÛJj‡ÓÖ$è ÌVéßÏ¢ ¤d\&Ô“Ä•ýKÕ·”>øŸK7Ývà¿ãù÷Üþøåo9â÷æE¸’^¯k6š¼Ìs˃¾[ôÃ4ö‰ÑMß^÷[÷­ÚüȪ×=°âuwœûà±Ä¶¼ÂЮ‹ßô‹ ×n[òš\òoxþg›+õŽ­õwðŠC;­¶\ÛÓÓ³jÕª'žx¶nݺråÊ‘‘¥Ôüü¼‘ÝAðè£.[¶ c‹/6Nlß÷wîܹhÑ"CE+V¬8v옔²Ñh<ýôÓ½½½æ£lllß¾}mµù¿aÖ4M}ߟ5)ÈI’ „ŒÃÙu]ÃmmëÍ”Ýp]×(°^ûÚ×¾ð ·ß~{­V³,«Ùl2Æžzê©«®ºªÕjqΓ$!„4+V´'Ù¶mÛ’%KÌíahhèèÑ£&·xÛ¶mF¦µÞ¸qãîÝ»cœóžžÛ¶Í-Á²¬ùùy³þ8ŽBm¿ºeYãþþ~ß÷9çãõë×OMMQJ …Âøøx.—ËçóÆ«Ì9â‰'V®\iVõÔSOuuu ¥ÔúõëwïÞ¦iEã+¯¼ÒdyEQd²¿šÍ¦ÙÈ–-[Î9瓚éûþ3Ï“gŒQqÝRê8ë¦9©î¡ÐÉDz•¢¾5ŠbãŸÜ°aÃÎ;ƶmÛ.¾øbSJÉ÷ý™™™žžcu !L©ÈvÝã©©©ûî»ïÉ'Ÿl4¥RiãÆ„|>']ÜQuuuÕëu“Ý»fÍšñññ®®®8ާ§§€R:88h³===sssJ)Ã7iššå•“!›'N˜«Ã9çœsäÈ‘·¾õ­ƒƒƒ_üâû·Ò4=qâD.—SÆËȧµÖÍfÓúç>÷¹‡~¸··7 ÃK/½Ô,Ò¶í{î¹gË–-RÊ(ŠŒü[JÙjµ!žç™[³ ÆØŠ+L(·T*ýâ¿0!êz½Þl6MÖÖìììÀÀœŒ1›ÊÌ]tÑc=ö|`ëÖ­6l0&9çÿôOÿ´gÏžýû÷#„^÷º×i­=Ïs]wÏž=æäMeì8Žs¹\†Žã8Žó™Ï|æ;ßùN¡PȲìÚk¯B$IR,ëÞœÆèèh§ôo,<Œ!Ô¢®DÊ•ÄÄF6&ŒùAUJ- e¶A`Å (b; ©cl Êl,•ÙH:‰ð@ î+Z^ìå3!í¨ÕM¨Ô B›Û¶PR .‘|2åM®ûl—º…9®žä˜ETÚYêÖ¦m­±jvˆ¤tÊõ§Mâ ´T õ0UH¦€ ø¯Æ "d[€Spu«F :]^&攪g‘8åKÀ1œa­ì³—†”žÚ À*5g¡ÔcÙ®'¬d=Bg’ 5ø|¨$¬?7<^­Ùa†ýž$®‰Lör}”8u8Íf¦‡YÁòŠ]yW+Ìy*èAÛé΢î(²71É’n¥ŠÔêð«„­µIé¡”*½êª«>úÑÞ}÷Ýßýîwï¼óÎ$I 7OOO÷ööÀÌÌŒçy”Ò0 ¥”†\µÖW]uÕ'>ñ BH½^Ïår†lÛ^´hQš¦ŽãDQdrв,ûÚ×¾6<<œ$‰±­[­V³Ù4V±D Ûðœçy/­mR¤ …B¡P0+ìééyúé§¿ûÝï¾å-oéëëÛ¼y³ã8år¹Ý!499i|ÝæZ@)ýÓ?ýÓ}ìc†t)owÛm·ýÉŸü‰±ÑM©/ÏóŒ¨ÊÐgš¦J©0 Bÿò/ÿbÛ¶"Žc&„$Ib²»»Û(²,«×ëžçyžÇñW\ññ\ký£ý蓟ü$c¬ÕjaŒÿðÿðÖ[o5ê3sÕ€6…›p;çܼnŒl×u?ñ‰O|ìc3 *L5oÛ¶«Õj–e¾ï›$±4M;ìû ž¶˜UuºEA¤A˜%²ì¨™S‚Œj‹*`­µ¦ c"à1PZÉT ®UDUÉó\ZD ×q–…MEqmG© 4PÐHJ!U„‚¢¹ÞÒð f;õÙî¨ZtŽY.…¥¶Ê(°iËtª¦kÓ5O·jæ÷'Z‹¨€ ®KÝB¸¬CÚ(”«nnèļ߆¹¸«'“­‹¸|ÁÏ©}ˆÒtÆ-†qtfçvÖØ/£ÔÑhH8¸To¼$ñºöwé\tÁ ÏïÙù¬ï¼óž}öÙ0 Ý&IÒßßoYVÇÆ ^³fÍÏþs“औjk¼ÇÆÆ¶oßn¦ò—qA›ƒ2ëyÞìì¬1Iãý¥u©fggMDÖ÷ý¶oÛöèè¨1ë]×½ì²ËŽ?þýïrròòË/7gxÁlݺ•1fꎀֺÑh,\¸0 C­µ©çl²›L7$ÆØÀÀÀã?~ûí·Û¶mØ×݆ öìÙ„C‡!„Ú”:øMƒ››ðüÙ®®(ðü¸§¦ 9 lбРêÅîf±Üð¼ µ[”f'ö®µV£U"'3ºé{­\ –žR£¶’¼gz¢wâÅ4( 4͈’ ¶áúпò?‡,;6ê“0;òƠGs6-ך¤ÐCFWwÊ?·(i»è…§CîÔyºý}ùM×X\ן~Ôš›)€j€H4G‹b?¾þú.©†î¹ç DŒyð¶ßa}G1Œ .›AG7&E¿|ªÏ ƒwfáY‹Gµ†ŽC@p\$ëOìX÷Ïÿ¸àÁ;†ü|•áú;Þ/­8¢ê14@xT‡Ags›•¬«T]±nGo÷Ü ŒLíºJd <ãuí–²(‡pb¾æµ‡´ªlÿq゚-ó;Ü9\Òó ÏÖú;xeÁ$Ê1)4 ¥ûó?ÿóU«VïåKuRA¼ûÝïþ¾0;; >ú¨)J…1þЇ>ôÀ»å–[î¿ÿ~©5œ755eîƘ¾í¶Û¾õ­o=ÿüóæ‰fÎùŸýÙŸ=øàƒ;vì€\.gÄÌŒ±z½nfgg.\˜e™±¿á%)UY–-Z´¨Ñh˜í›g™57îîn3Ãàà ïû_úÒ—Î9çœr¹¬µ¶mûw÷w~øá;wšŸ‹±°}ߟœœ4…ÆŒV΄̵n¿ýöGyä‰'ž0¡n`ŒY–õú׿þG?úÑää$<öØcm½ƒß@,_£K¢¾‘ù®ž9ÛÕº¦4§È&,ÒZ§‘ߘ™=pîø¶Íû¿v×OÞ4ºdn`$+\†Š:ËQ„KÝñèâ&¯,=´}d÷Ï¢¹Þ^ohAêçb–®µÀ )B˜Rìù¤Pb·ïèó«ö>Û…­ƒÃK¦óî âåþEFå\yÿЪǘ3µçÉ{¶Æuêç]ó•Ó­¿Q9ØÓ7946OiK&!‚,JÜxýÌ®ç˳]ÝUÀŒXý¸ZÌÄ—oηæO«²>{Bˆ%ÜÌúàÿqèïo…ʤ`ä Ä@!Z#Bê´å[9Â.H¤y D2‡j­EœBOB'6¾ÿ–_„Yã›ßZ˜ RŠÈq,¨œžýóO|Úβ¡eöŸ~du†b žÅÑWûÄÁ G*Èa630t¬otïî_\h7iñ¾n¹lÝ3'&arïe‚Ƨ\N‘¯EòÑ¿’þ PTc H¢³öîà7Æœe™iécŒ9ÏóFmæ6ŒbFšœWóz»A¯‰Y]’Éß=ÝMU 3 í)Ͳ̘†íÇ9Žcܹp²Ú"œÔ‘™!£U6ü×l6=Ï3ÓÎÍ͵#ÐÆm²{Û#b+Ë2oµZžçß» »šv®ëRJAi.fÂjµZ,8I“deNÉMàÜ÷}³ÓEÊìôß•B„ah|Îíí˜$Œq«Õ²,Ë„íÛ+7“˜3E6M¥L(Á(´ÏÂïGÿ4¤)Dè?ÿÝŸi­ `%\&ø4"#šŸÓaŸNùú+ÔœYzdÏÂTÚs¢(sŒÇy!¢UD¹VK¯½ú¿D-tð—ç ±„Ú“k׿•ú/¶]J‚ªN)uèâ+·‰ÈÛ»} òPÇSI„<Ë•1\ù­ƒ£Oý| —ÁhÃ¥ûƘ=úÖ†Œ¨€Ñ¥/ô.˜Ø÷ôUóuÛÉUYÚuîæoŸšÜw©B ÈŒH[9?ÿ«°»2KÿñÍ.oK¼î¯ßK“z  N¿[»ám©9!V}ñ GÁ-y¼xóì=0“~ïÞà)æX¤Úø­·N3ßþÞCåZføQÆXcÌ‘L”æ ¨d±Ãm|ûŸÁß|¶d'åÔç(ågï·™» fˆøˆâqSð–“-Ím®ŽÓ—„S " ­B(ÅY–ú›e™V/þ#„y†ƒÁóù¼1FÕ²,Ïó ´ýÀ`„Ó&  &¡ˆb<ɧ„a_)¥áE£+¶,ËP—=aŒ*û¥‹Ì²Ì<×ä/‚A™går9c^k­Û5¥Íâ nVhJoËØXœA»Í¢Q}sÎ̈́ƧÝn¼hZ*•ÌH¥T»’ xÃI ´ïûÕjÕqŠ~©O˜sÞjµŒÍ,£}wñ<ÏHÞÌ©šµµ-Ú6§šs0ïŠãØØåŒ1£3òéÿµßŽþ¿B–`ža%‰VD«+ €È,%±Ò™‚‘„2D "@PÑ*¥TL3, ©°Î•ŠÅâ\¹§â{Ô‚.Â0`&ù‚¨9'³ µÖ€´eYF¯'%P%±JJîº6¡ !µld»JI*¥PZ1¥O™ç¦)&ÂRjE)Jˆ9ÄÒécA‡ç¬ïÒR¸L€°Î»€†óÝõiÓ€‰,O§’ » %ÞZiêJ%À©äglݽv„ˆ"¤5p ° 8ૌ$'âU—V¼îÖÑC9ˆz €"¥4H)¹H-‹!Lk©Êâø™RáLJíBKG0EŽÒ4B¹žèWiÝÚÁ`›É|m"£¦G/œôÜšBÍÿúÇ|’Mªz½nŠMšñmCÖÐáËXÀ„f³i¼ÊÆ=>77'ã¾F¥lú†S Òh£Ò4m»¯ÀuÝvö°©[‰2ãM› vÕæFN…16w‹$I„&ôk$Äí=?|š¦FÃEÇÆ´ób«Õj_VÚ}Žóù¼9ÀR©d’˜³,3ŒkffŒA@ ÃÐŒŒ¢È¸ jµšïûæôÚ‚mãÍn÷ŸPJ™Õš¼dc(› ‚‘yÿÚ[&wð2œii!`á¶/Dk‰Ì¢\Ù@§™{ #®¹«%ê]² I/®.†t±–.VúÌǪ5T›(&Mî:L§e!¨]¨¤xZk‰ùƒUZkB±ãXBrÐ4B¿ØOŵ”Òi9R *d†°ÒŠj’{–­”Œ´â”"¥Ê*³œ+ùôÏØÚMI¡€d–8ÎÜ’•dïŽtv’!+×ê%¼àˆãCj@ÚÞ,usj±é)'ƒ__!ÆeZÉZ pÇñ™U€(Z¼çªë–w=úhùžï+È*­4›MË¢¶Í8OBZ®ˆÌ&,RZZj¥JØ ±ް6‰e–E5œqû§þcÃx_øÖ¸ ßzi ÕаÖÚ´&4e=ŒƒÚ|î ÌÄM%ý2uÛ™µ–e™Ü¤¾¾>³c;º®küÀÆPn ¸Lðزù|Þ0´¢]øÉ˜¹¦«„RÊkÇíæ‰†ÏÚ×c˜RJýÒø®É J’Äu]ótc ›lŸZ­f¶éy^ûæaNÉl@~þX)¸“a-Áö¨’TJ–uôè‘ó—/e%„`LžÑÚ•º i­@»%J1BH¦2 #K+ŠQºÓ´ƒÿ& h’eµ÷ÒòI†Q̺Ö:Š"“@ìû¾!0cÀµÃœ/¹V«"9%cFÖdØË¨²»l0uIDATã86)­³³³===&¿ö¥Ó¶C¡Qi­ µ;ÏsÖ|RJ3&i;¨l¸Ê[6±^³Yc¯»®k:/™ýš@¬q§Â39¸pòFblkã30acs¥0k6¹Rf*ó.ó™ˆzé½ÄúfæbaîæõöÏ¢÷c©ÃÉÊ*`¢ÑÆÔ®T*½½½¦G§Öo,Œ×k@Xi- D2UÅ¢µÈ©ÖÕ}=½Ï÷¯zavvYíøXRš›‘Ö¸ÈÜf£¿äO¯ØPÃ…ŸR? ì‘Ê¡‘¹¹£¶hx% ¶+)•”„ZZk.RŒ¿ØÂKb„Lë3jžI£:$ÒÈUJaªµ"ˆÄ m )B4B˜"ÄÆÇ'€Q`˜·rn~úø~lYÁÿýЛ¯.M<ÛuñE­ïÿóx+ê-tõrÑ€8[QL(Òk/ÚÑ»d@V' ûvª°€MœY;ѳØkLƒ”`[®mµ’LãÙáa}ñÅAöÿóN$•á`ÌmÍKÒ…”Ê0PºcÇŽÕcÃ&ÞC)©², € ò…¬`l!„ ò¤äZYŒ±D…J †-L RÂi‚¼‘ËåLy CZÆ:4fh¡Ph+{ì¨]e©ímP MšH'œŒh¾ÌsbÈè§ÚTjŒK˲zzzŒ˜ÈØÁ† ' 2ÃI’1‘ !m¾i7Pj_Â0l¶Û‘c³qcÔš7šù}ÿ?é¡à%­™LÄ×”¼hŸ@ûéæ cmk­ÍÛõ·Ûå>Œ¡lŒlóÁ5åGÌ¥Ái¯ñ@´•kms©T2>v)eooo›¡;•°~c¡5×À ­¹Ö¦¾ ÆóÔb,Ñ’É4çæ’žÞ…¾iïÝQ²¥Gý&e,ŒÁ"È÷``0ya÷lkæ?eÐ*ü W˜õÙyJ–ü¾ÿ¦¢a­µIÕüEQ!B!)•@øÅ (h"„bž#â&¥i–R`MR­ˆ à•§»vî­ ¥2L¥®!æi&ìvÒKÝ _«²¦Ø÷‚çy®Ä‰TÐŒ·šyËQyzýøãkªz¦ø«Çº,>º`™÷O_-«3tÊž5t–q'W€æ±#ZÖÏÝ8¶á‚.ÛÝw÷§ëI\°†“ÖÜ>à‹Ý¹¼9‰'„"¨×ëFMkEA‚0ÆÛR¥™v® Q†ó@”‚Ž(£ƒ ó±n¾fŒÙ¶mè³í#5vg{¼ìû¾‰›H¤)×l¥m2»ö”0¾eãO6R#ã§5E3LœÕ˜ª¦P³±öÚ÷3³IRj§'µ³µÝQØ$4J3q\ιÉkjÛ£í]Æ(/ RJ#™6™Wí³¡aã0Ï5IÏæÆ`–gôSæ¬Ì­^ÒD\×5éÂæ•vNf›afŒqò›ÉBf6ã67GÝVrµóªÍ´öý…Ò\k¡4WZj€B¶i£â9)h¾ogß9?@têÐÖ<Ö­diN'‹ŠA9ßUuJÛ'÷nˆšÁ‰Ã=s6÷Ö.ÐdÖèo+õ(¥½˜•€1Ö •Z˶:^k Ôü*"Bĸx4,¹@Dˆãôà‘q‚Br:ŠT¡/j52й=[íeçM=ýØqZŽ5[=‘í µ(¶•Hã"LÍŽ%q4¾ðÄO³gþ»72dmÜ4q¦çö²°²i€“žm¥œ®!‰SIÄ&Lá\QÃÆË÷V¥ø/w­‚VY#{Ü$ŽÓ¯¢,õ'^È‹ÿ×oþ¼ ~k @Ž Å¼9—㬂ÊaŶœ:ÄkâÓˆÐòêÌf'æhZ:MR®Ôf…OV„pjaj‚pØuNÌ3—Z2$m„;ó«Œ0P0(@€@6×MÀKnnŽå´¿øwŽÚê\õ¯¶Gþ[PLÛzq¼ȵݗ®§=¡ÍlóÏöÌ‘—>¢= öTí‘Bˆ™°ý¢c9fñÐ"„P`QëÅÝ©ÿaÙækè*v½ø-óÝö´fýÿvUíí·ßÛ>™6ÚSµFµ^:ÀµO²ìÉ‘ùyœYŸ·þ—aIEJ$…õ&£;L%§î7 D¯åWd”S"oçODÉ2¯»Z¯ûX;*‹ òÖè2[¡Õ[~Öçê(u”FZ¹éœô«•ñs6ájÅ }'‹8ö:•ç³ïúÃC]€ós­J_¹+lÕ›qE©n;WmÌç»Tõ‘ Ð‡æ—!o[n`úÄxÁ=…~AÍNŠR>bš“,ÈÇA7·½^#Ö„‹§j­oýèA®3ÔÝ *'Ã‚Ê rQ)ÎÄOžž|tÛæXªR½…yŸÆœ€Ì’d0ï§%+à‚êùY^î?AÐåEOé& ‘VH)Ð >mløì© ³^pkª)uº+yk䉆¤ àqê"RäYá$ø„à’ã—Ãù¬ÔçÅáÈüDóï?|ÓMÌÏeÈ_ŒRÑ×-™ö“ùy–sÈö­¨N,êÂ0íè òø(Š](FÑ Ëur9M+ yÜ‘rQ ÜbŒcm8ã†tÐA¯*Xš" ÁÂZ·²<-‚ÎÒ(eäÔNŠòŒgš;$+£$ƱCbæé’]˜°Q7%Mw€LÇwúýdGÉ ™6EVKc³€ÉHıëôº|‘çnñ™0ö¯Yî®E-Ï£]á”Åð9¹^ÞHc –Óto­P?«§”´d˜§wœJ¬æZs”uQTÃJÑz™b%ŽæsµÉXbkïáñŸlyjöØQÔW(u—+ãsAWAgŠGÒ¶ÛA¨]$‘ízÂåŒÓ¸éÕ«®ÆÚLNœÈ|’ãÉ8õÀ_”…Êrq G3[œYqƳFÀg§9еÆHç>G!Ï÷7š)Ès»8ó‹^®vtÈ&óýYõð6(YÁÀª­»žX¹këþãÒ·×ôº…2D-U0:LüÝJ{“#å¾þ¡çv‹ 4›¥ª>ïçK…z|jVNfyÎ¥ÕêLÁbG€dGÇÑAtð²P1 <Ìœb9çDò¡¬…¹:µÃÐ<Ò FkJÀöliS­y63èb•xë/;ØÕÊáA›œs™=ãìrÞ­×"B$±²f:ßSÂáül.Ÿ'š–», ªÇí¸>Vf‹¾—ï:ŒdweÚʬVÎ/…-6<:Xèz6£…!§w¤Fõ‚Ö\«ÉRís}•ùØö›A÷Dz"8[¨7jéS[<ùóCö7%q¡«¤eV©UiwI$s:%Jˆ$©pЀ¸L¢˜PH¹Åt©»äù–Šf@²,­» µ9\²{RÝÎ×umÏȇÂÂÆŒkõŸr9ŠÉ–ÊIÓ ´|Ê¢ AÊ%RvtÐA/ –¤–´\ÉÇ.žÍGrîFY†ÓS[Àï¿UJNÒâ O ¿÷7 ƒƒû'øÐ2Îf¼Rf[ÃËàÆs±$q±Pš©Ô‹…ÑV£ëÞ/m«·rÅs8Q}_rùÄûÞÈâ–=støÉg[³qz'±+òT®…d•òVÁcŽNß1Þ|MÿØ;þXÚ>;´»o˽–·“•)ŽorWÝŸÕ×üèÇzõùóÿ»!×N~ñÔm+â]Aÿ¨FNXkÄqb6žŒ¦Žã°¥€0ÕH"dW^Á³>.ò 1ˆ Û8Ó#ë¯8²ä|ÇõŠˆZ‡‡¶?[Ûõ\R¯Ž€fÞËÖ‚f„h¬M-h­õiEXp‚Y+ùü4¸Â…¼VÍ ¬j¡ÒBJ‰©ÕeY…¨‘æ ~szÒÎ;Y2]XZ‰T\·À’n­Ã„íâ!Øùá,u5ÄÄÅ2•)ÐÛ[êýåA1À À+±m)˜}Bµ0„ ,uÛÿ‰îüÇnG÷%nqBä+é ƒ:xUAÒÓœ„¿ûáñÏ,ôG±¢&Sç¹ìÁF£¢3^îËi õŠÒ˜¨TZ¥ KfýdÙ<¹,K¨Ý’ÍåÚž‚4µ‹½iC0¿,U¢øŒ•×,íåz*¡íôHÅD˜åCDv>$Y_TM T ŠËà Òñ϶çŠÅ1mMV祟/…I€5B !*Ñ 0qÊZÐgÏNIBÈcËîË꤂¹ù¤yR§¬$R"Ò ÐjJÖMxªtk$óÙ€21GjVpÎjâ¦iäim’'€<ðÛͧ- ¨@­¶E鄬Ä.œÆ§ìqESÑBÚ •­°ÇeJÊ„êÄ€;è ƒ^ˆ*‰•Ä2À•™å: ÚàieÇ4á`%óÕ”[y^)˲,Ú¤$&¯ °V=Hý¡°Ÿ UI‡°D¾Êâf&èa/`‘Þ<…Ü0¨ð$äGÒp¹…ºìÞciópëè\ZD­‘¨ÕtÜA!‡¸£uäEsuÀb+MmÁy¬-®1ÙIî ƒ:x9 棦bB™Ÿ·U£’Ú¾#°£N“Q#¹ –KT>CÀµ,KD·‡Ê•ÉÜcàŒb]PX&qH¶(ˆ“€æ@ ¡Sê9a’¹^W'¸*¡tD  N,2i‘MÙÍo%Žk÷,I™Ò³*æ%RÏë4µ;qê\4@fÁ@·Î¡˜´†’J}þ' ûœr4š˜QŒ±H”–4!ÁöA‰G1²yÌÁAÀˆŠ¥@³™Á"@{e%æuÎiÆOž$= ‹¿6Ž(õ ôÜ™ž3U¢ŠÅ*œs½~…O¤0ÃÄåÔ~"I €µ&ØÂ )mrxÔ©ic<ØUMIä@Å1“ù|RHÀ ¤ÀqÔgD©&85-Uµ¡Ù˜ÕÖÀH&g¨€„T PœpâØóë<}Úù$<êTVÓ Ek‹Ea‚ ê ÷:.è:è ƒ—ƒ–J‡åü9Õl_#^½M’Ù„ÓUÿµ„T¦&´Ç–$~p/@¬ày ÇÏR @8*ÌN€±È;\ÅÀb` ƒ ‚ð4pÈuI ²Õ  làÚHÀƒ„'€€ë´â*ã @~’–|„@˜* 4`XhÀ`1ˆ§Á)2 PlEPà­‚€)`@:T>RtÅp,|7€$M@aÐH ÐÖ@r» õ%u}À_»û‘rµD,P ÓQV­¦âd' h„Ö„"†4 (œFĄЙɯ¸*á ŒmQ"9WYJù© þeÑœi-ëÍ-Aqmj_STŽAA3ÌR•Pyj‹¹ƒ:è !ŠäiªÄ¼öà„/½Z½¶Äè•QŒÌTNý·Tk³µ*J QøÌêCèÓi¡0…@(¥@!Ð4@F\°ŽF1Mx EÌÑ(¤;JÔõ5¯S:‡E`±eR P¸Òf€>Ý Hë3síêH[ŽÃ|›+™Eǧٗ8ÓF(ŠÏD:ß{œVäÖšÑDôY±ì:è ƒW<¤“aiÁ¼ô¼Eóimˆ·ZÌE)…$sìS¿Ž]h…²e;AÁriEY-†ü™>àÔ†(K /Ö|R ”€ÀQ÷èÁ¸5$ð1mR¤¨–M .8HqÖª•—®Mö=$HЀ@#àJJÁ§=þ3lÄäu¢(Êj ”9õ}-•*ƒðÔo8ÓV lâ¬<×;¶7Nç‚C(cN–¦iG„ÕAtðràh–$ +dd¡Ø¾¥ÈÀ¾B44üÔ<â`lW;®”:iÕ©Á¶Üž|œ6ÎlþÓ¡$‘Ì `@ÄÒ_ºÆªÎæ¨+9x"Õ„¥gk!¨gó°5q tm'ú@ZƒP (ÐaëÔDˆNOͧD”U€ È3Sˆãx¾QRÙêÔóH}†%$‘’znh½ß!ð®&¤ µŸà$=³y:è ƒ^e`ðæD f§æÉèb½óxÄЂèÄ…WÆç'A§Y&hÁ¾gçâÓT*ÐY,8Ágf˜iuj‹Se” 4( €!@HgȰw oÿ^­)€:G(hà‚Ö» «ó3lAß@®wªYó2¡] ´)OgêžF~zËb˜&ækÔr×·ñÜÕk†zO9üL[¦qÝ âßýàå=ÁÅêQ˜úðº£Áê ƒ:xYð¬f‘"`Ð(94õÝ•ç~‹òK4I<üÊ(%ÈO²œ˜<¾s÷ ÏïÝÏÌA!sžB¤@ٙͯOc(B (e"0}qÃéã2™J°à˜ ßên‹¼:Ñã©oî¿»,Ú#ÚT²§+‡â\læß<ØùúÛ›?ÿz8ºHüdQÆ£Êú1,uàþì‚ ¸bbeËi žòVf‹ŠãÝë­¯¾¸yôìèøøtxò PQÚeLãŒ1ÒÆËžòJhšG £jc§ýÉÝáúþã²Ð£¿wOŸí ^–ˆËw»¢·ÈìnMÏÓ­nÝ“{×÷õ|ãà‰Ë93’Î>ÏtíÜoŽ{};@.—ƒaF!Tper*—×±[Ë[ä¬ak}‹Öß„ðÝs`0M]WaêÏÀ'σᮕOÖÕxÎÓn©T ‰DNÌÓ¹X²ñ;\ȽÉã³—1«g<ƒÈæÍ¡R«¡ÓjÁU¢á"t%æ£3s^µ'F'¤±—Îáä„4Ùàq¢G…ê dÃÉtV#àè…4 BN^La°sQ‹LçÕ¥ •aål4BéBß#”.Vã”NÀzÌž+@ ¯D"" ÁAA(­¨ÄóK¿‚ä§ÃǘɡQ«…@£¥úÿ®ªytÊ^µ'ä„ÅhBùŤÛh<íÈÝaÃÅ` ¶,»ˆûBp‡  §ÆÁt«ùy46Z7‹¦²ç®¼‰Ê  ì?y’ʪJÆ 7À ×Ûu:.äæ²™b¢£Éé,KËÊP|í:wî …B!T6¯^¯Gmm-T*ËåÐëtÐêt AHHr¹][Öu±§Ô6A “n£ñ´£wG.ÔƒÕˆpàÎŽþ­s8µ¼ v)ÈMAÀ%«³w”áé@£±ÑšiL>¨¶¶Š€Èd2èõzèt:„#$$r$ä|õz=jLþM¡hôoZ-ëßÌm3õ·¶][[ •Z…r…:Úº: ÔÛ„\.‡T&…¤²²‚ÑÖi9E7nÜ@yEW¯^ÅÝ}úÔ7sæjµG³²Ð¼ysÄÅÅ¡e‹öÏ@"Ã0Ðiµ())A\»vhÞ¼¹…„aTTT °°1ÑÑ€„ëb¿]—‡¬Ò95žž¸`ÃBçB0`u"½Ë3!]?9S°kÓ™¯ÎÍ„SãæÙ€˜t±.Ã0¨ÓjQrý:Ú´mËéƒ*++y}Ý™ Ã@ÛàßÚÆÅñû·+WÝ`›ýÌ ÍÌl·k×ÍÃÃ9m :*Šßw6IUUS§ÑðŠ2BXXôz=¤R)´j5úµŒÖÆèXHìþõW„……A­Vcð AvO¨o@Fƒëׯ#!!’†À`¾4%‘HØãgΜAëØX(•J»ÁÀïfî°áQ½4ŽèóóÙ³¾-–“un\rIãé½'ÒÅjl´ ¾F£Ñ ¸¸»tôAçΞE¬•â› ˜Ûî*Ò¿ÅÆÄ ÐdÛÞ94ؾ^R"Îwž>èèh~ß PIee¥Ý@ ©«ÃÞ½{Ѳ% Õ†¡¦ºÚÊѶ5ôáÝpìØ1ÔÔâÒ¥2L?Þnä1¡Óëñ×åËè–Ø R©z½W+“É`0qþÜ9´oßÞrÙÉÀA ¯ÎAÃéX2ò¥Y‚£:Gµnőق¯ÎËH®Wg.hL:N‡Ë—/£K—΢}Ð…óçm}l‚ÉvB·ѶÏ=‹öíÛC®PØ &Û‰I‰¢mŸ9sí︃wÉ>P)¯•‚5|bÊÊ4¨¬¬„Þ`À÷§KQÖ׊‹q!7gÏ^ÄèQ½ ­®2†aPVV†fÍš12P«4Ðiu¼/Z ePÊÊÊ,7´¼¸Ä"æâáÕ98ªt8ÝÓk¡‹ÔÉ2,.;!ƒúÏÐèÍB'Rký‚õK,Vù¸l[œ³bµ‚:³sàÕ‰qÐö4BébË0Ë¥q%ÝÅ `òAAAAù @¥ÒÆY“íÿV^VÎi;ˆË¿ÙœRƒï em¿={–~ò‰…Íuk×aúôé¬íàà`AÛv¤ªáÛF <¹TµÔTW¡¼¼FƒGÆîŸ~@yéM$&öEhhwÈ«N@R[kÏ$ ÊËËݪT*t:àK¥R!&&ååå0¬" 7¼X;¦ÀB«õ!;ùÅÖÁÎ^l@`µæÛžÎL+&8Øäå°a÷e•O¸ Ž€!”×J+dÛü|œÖ˜þäÒ¸ú¹²áäçÒ^ºX¹ŽõA-[²>èÚµkœ¾Çt\¬â²mzýüóÏèÛ÷nìØ¹ÃÖ¿ÅÆ¢¬¼œó¦ Ûˆ1óÓ§OÇ®;±üÓåÐétXÿå—X·n-f¼1ƒµ‹ŠŠ Ûz›awK9dï"0òPÔ‹««ñ߯6 ÎP¿ö$3êPS]‰jUеíYÙ9B’ymF¨U*@&…V£¶I¯®®Fhh¨Íñà¨ÕjÞÝ,1 »tÀ«5Ó¸¬Ò8hƒ3?àp0×ðØ`5é¼; áÑØØlЉY걉±Y¸Ä®.‰q>ØX„ÊrbðâÔÀEŒFÌàÄ^º;ÊàÑXëŒF#TV>hÙ²¥¸QR‚eË—³7ǼûÎ;¨­­Å'K—°õA\%F¨Õjÿ¶oß>Ìž=ï/úKRSa40|øp6=8$j•Ê\¾3:&;w}‹G}œ8‰Ü‹¹Ø±sZµl‰ššjÖ¶J­†ÑÙA€ü7h•ƒa¡¡¸«O_è5Õ5(¾~%%%èбƒy0ÍB완Á`hx¡Õêl^kÖ¬EMM­ÍqƒÁNÇÕÄ^`º¸xuna‰ʼn…9¤ý;¤1šgõ\3YÃõ; 9;õ9sr†Àæ³WÇè_¬Ž/Ýeù[k˜ ᥠ½¾þeæƒ/þ¯¾ú*jjjñμy¸x)K—Êéƒø"ƒz+Û?üðfÏ™ƒo¶mÃÄ °fÍZ,Yò1¾ýî; ÛõùøGí\¾³¼¼þ®Î§ž| YÙYxø‘G޲²2KÛ:ÝÙ†ÜÞG["¿ &´9›þã÷ßáâÙ?Ð2< 'r‹×Š pß½÷!**ª>“LÂk¨œ1` Ói¡ÓÙÞ¶ºpáB\½Zd“¦««ƒDbÜYÛoØi—ÀÎÌÀìÖ,ÓŸ6Z[­ÎvŒµ}9ï.åæZø´+áÂùsþ-+«Þ¿IùWë¹|gT«hìØõ-‚”¸œ—N‹o¿ýqmÛ²¶=ŠÐfÍ µg{öìÙ øÖŽ í’ ;ÿ jÏìǹ¿ªÑ÷±ièÛÿ^H¥RÜÙ¥ þܲª*¨µZk.¢OßDH;ñÔû\.‡V«EyE9š‡7‡F£Áhä|!ÿò_ˆ@\»vR*íÚó§žíiØ?]Ñ8aË¥2=ðšË:7iݑϧpvvàH>´.é\á‹\Ïw×,À\gîƒÊÊË,|Z­Faá¨Í|’ÉEFF"®];(ù»&Ûšº:Ö¿©Õjqþ-.J;þËwöêݽÅÅÅ0 _“¡@Ÿ»ï†Z¥ª·n×¶\!¯zŽóA0† Æ®=¨©ÊA¿bÑ{à(0ÒH@"Exx8t×G똄‡©ñW¡I=ûóžˆ ™LH$(((@MM bccP§©ƒ^¯‡Ñh„Ñh„T&Chh.ä^„ª¶ñññˆ‡T&·ÚëàÓÁbtbmÙÕz+ ph8u.Gʶ«È#Ú†¶B`váÐÜC¬3ÈãˆÞΟSçÍ`Gg¡å¹@AÁÔÔÔ FÀ©ÕêFdgd  ~ÆÀ0¢ý[­¹°mí;•Ê@”•–ZØ®««ƒV««·]Sƒøøx„óØf …¢!4̬ƒAAþ%þµÆ$Œø …-ÀȃñQzñ nV¡ZmDˆ$‘­ <Âþw I¥RC©T¢ªªf ed DFF H©D@€¥¥¥Ø·wbccѱcGÄÆÆ6~’ƒO7Õì@¬=—ËuÇ,Gç¨Ö½Ý|ä÷IÄŽVÈï¶@!VëÄèßF×ÀŽNb惪«ªqà`ZDFZø ²²2ìß»­Û´A‡c÷KÜL%I%3ÿV…ƒ3ЂǿÅÄÆ¢£Û&¤R)‚L¶+«pðÀA´lÁaû·½ˆ‰‰A‡ÃcÛô€™B¡€¤¢¢‚ѨU¦æ©ÿ·áš+-¹Šô´%0ü)Üsw"dL>ô’®€¤ñQåœì#ØûãV¶!&½ø&Z¶Š5j×ëõ¨ªªBII ªªªPtõ4j5”AAhÓ¦5ÂÂÂ…°°0«‘°^C”;âÕÚj<¡³}+Fg×8¿8ٷ㨎§d»zÉ‚žŠn7ˆóóØeÄ ¬‰Óó>Ê&FÇyÈ&£¸Ú1ÜoÄêì'ñëô:=*++Í|P4j ”AJ´nÝaa¡ˆŠŠFsÖ ô(ÓøÎäß®—” ºª …EW¡Ñ¨¡T¡MëÖ ¶¹ü?¦rô:=ªªLõ®ÆÕ«EPk4Rš×›Û6cYY×µJÕ¨²7ŠftA€±£p¶R êêê R©`0!“ÉŒÀÀ@Èd2þï/Ú pçSéœ\Þqz©ÈÖ•<¢ò;`Ãë¸:°cÃÑ™o'gbubmÙh]å;«cŒFKd0@&“!88æ>HÈW{Yù7½ÉvP°³Wï† øêÍg›k¹,8„+;sœÌoñ zR©è½·,ýøˆÎ®Ö]ûŽèx´Îèíæ‘W0«Ó9ÃÁÉUfö M$¼´ÌãNÉ10[*ÓW"îL3šÝýäˆó·(‡§,ëou$pH0ÏWL˜CŒ“uc~‹`ö~t»6˜Æ{Üyu¦7»o{ÆÓÄ:!-ÎBk¥l/<‰µŽÃ¯M;z^Ûy,$ŽÜêÉ7Úi*¨»(¥3³ Gó¸{OÁ ÎÚ­»uƒX7‹ëÙÉŽPYBE(¿ý…)±Î؃ùÜ>°xØÊ%­ Àê9œ=áÂcÓ®ÞNÞúÔÍb.Ô¦Àáy`f`7Ÿ—fœz79G´n&­À•Ï©«6ÄæÞ¡`ö÷æìÀiMà€£çÑ;cW`àÈlÕ;: àËc'Ÿ`y<¶ý áÎÙ³ÁÂM{ ^sþž²ëåà¨ÖS6 "r«,P;]0á<}!„ÛX²s㯖pšÆ;E€þa‚ âöFÐà Ÿ°ðùŒÀïA·?\ßéLAø Ø¥¡úïÿwæ!‚ âVƒ±xÍbiÈÞ¯ÜA·Ö¾žö‚ ü9ºkˆ Ÿ°öù4# ‚ðAâããmþOKKC||<²³³9Ó…A„üü|`ÿŸ5k¦M›†üü|ää䨤ççç; l¾b‚ ‚hZLÎÝsùh³˜ §qvdïl> A>†çg–Húd³Ï!‚ šOϬ}>Í‚ |Œ&™Ôo˜^ADSâù=KŸO3‚ £‰fA„¯@w Aø9t×A„ŸCw Aø9t×A„ŸãÝ»†šAøt×A„ŸCw Aø94# ‚ðs¼=#tÛ(A„/áé…Ïg©õî1AÑ´Ðw Aø9´G@áçÐ]CA~Í‚ üïß5Ä Ý6Dá3xþ®¡FŸÏ€fA>íAø9´G@áçÐŒ€ ÂÏ¡A„Ÿãõ»†Ð]CA¾„7ïhF@ásÐA„ŸC{A~N“ü}ý4A„ïàùåHú)0½‚ ˆ¦ÅÓ3kŸïôÒÁ`ÀŠ+пÄÄÄ &&ýû÷ÇŠ+`0X]DDç+::ÚÆ&ŸÖšÜÜ\Œ3mÛ¶EÛ¶mñä“O"77×iW=<™N4-'NœÀ /¼€=z°ŸÝ>}úॗ^Bff¦ÇÊ5X·n†Џ¸8´jÕ ÉÉÉxñÅqôèQV×TŸúÜúÞÞ#;• Àœ9spêÔ)¬X±III€S§NaÞ¼y(,,Djj* ¼¼Ü&ozz:öïßÏi—KoNII ~øa¼ñÆX·n`Ó¦MxôÑG‘‘‘-Z8¤#ü‹´´4¬_¿3fÌÀ»ï¾‹V­Z¡¦¦X¾|9FŒ!ø4'""B´~Ö¬Y¸ví–,Y‚®]»B*•¢  û÷ïÇÛo¿={ö8{ZÄmF||<¶lÙ‚œœ‹ãiii§¤¤ OŸ>ùœ ’²²2¦¢¼”=ÙRTƸ¸8äääØŒì‹‹‹Ñ§O\¹r…7ï°aÃ0gÎÜÿýÇÅ\Tï½÷4 /^lq|Μ9 Á¼yóÒq!TWÓ‰¦áðáØ1c~ù儆†Ú¤F,\¸ ,mÓ‘¾nݺ5rss"Ú¾7¡Ï­ïœœLéU»ºÏ?ûÔ&ˆ¡¼ì&ûwDd¤ó{J¥’7-((ˆ7-77%%%úˆ]Ïwt9E¥Raß¾}8yò$rssqàÀtíÚk×®e¯ s›C† Áܹs-–Qûí7Œ5ŠÕDDDàèÑ£èܹ3«©¨¨@bb"ŠŠŠxëRSSƒ””œ;wΩs!P*•P*•èÓ§ÒÓÓ±qãFÎ<7nijÏ>ëP{÷îmáâããqþüyÝ… pçw:¬ã£[·n8þ<Ž9âP}¹¸zõ*¦L™‚ 6 &&Æe{„s¤¤¤àÀM] 0þ|ddd¸d‡o©ÕÄäÉ“‚]»v¡°°ååå())a—ß"55•]óÊË»„¬ÌCìÝšB˜û|—~ª’/h𔲲2?~Æ s¨œ?þømÛ¶eß?øàƒœ#§­[·Z¬½‹ÕññÄO ==S§NŶmÛª³9ÕÕÕxæ™gššŠ®]»:m‡p©S§bñâÅ¢—?pèÐ!‹c‡Bbb"û^"‘ˆ@Í;×â%%%¼ËIII6ÌÎ<ë™™‰  cÇŽì®Âs˜ï\λ€Ëyxƒ@~^r²Ž°û?Îàt 3f Æo±Yœ••…gŸ}cÆŒ±ÑÿïÿÃèÑ£9×gM<õÔS8xð T*4 ~ûí7<÷ÜsxõÕÆ[¨¦M›†mÛ¶aõêÕ¨ªªBUUV¯^íÛ·cÚ´iëì1hÐ lß¾sæÌÁúõëhF&Nœˆ©S§â¾ûîs*?á>Œ±cÇbðàÁذaþúë/hµZhµZäååaÍš5ú^x3gÎDNNt:rrr0sæL‹ÏOll,222DƒU«VaèСøé§ŸØÏxff&&Mš„©S§ræyñÅ1sæL?~:ÇÇ›o¾éð¹'&&bÙ²e(//‡F£ÁO?ý$ú: ¼ùŒàß,ÎÏÏÃï9™ì-¤Î>‘,)++eÊJ7‹[´´]?åB¯×cÅŠؼy3._¾ hß¾=ž|òI¼òÊ+6РAذaƒÝŠîÞ½+V¬@vv6¤R)’’’0mÚ4<ñĺ .`îܹì²MÿþýñÁج“ŠÕYc½i–——‡Ñ£GãÙgŸÅk¯½æÐs|#=Ú”k:>Œ5kÖ 33¥¥¥P(ˆ‹‹Cÿþý1nÜ8¤¤¤°Úõë×cåÊ•¸rå âââðꫯbüøñlú–-[°`Áƒa»ýš••…ÿüç?8pà®]»¥R‰„„Œ?ãÆcuÖŸ¯õë×cÙ²e(..F\\¦M›†¹sçâúõëœz.;yyy˜9s&>  ~Oaúôé˜6mšÅg•>—¾é9‚w¥ØÕ<žãÔs¥7o°G¶ha ;È-ZF9Vc‚ ¼ÊÉ“'1eÊdee5uUÁ÷d±5Î>Y\z³P[[‹¸vw@ú²9‚ði¦NŠY³fáŽ;îÀÙ³gñÚk¯á™gžiêjÄäÌÍ|ZZ»œgþ7W>!P«Õ8uê4""[Ð3xð`Œ3±±±7nFŒ—^z©©«ExoüAPP’“»£Y³fÎ?G@„w;v,ÆŽÛÔÕ ¼ˆ·¾}Ô´Ý0#`Ì^ADSâùµZ…?ÿü5553 =‚ _ÂÓ3†”Ê tï^¿4D{A>†·~³Øjiˆ ‚ð¼±G V«ñçéÓ¨©©¡=‚ _Ã{AAJ$wOB³f!4# ‚ð5¼u×éGÄœþ…2‚ Â3xzF`íóiF@ácxkF`‚ö‚ | oì˜û|šAøM2# =‚ ßÁ«{ Í‚ |Ž&˜˜¯Ñ”€ ¢©¡=‚ {LÝ \IDAT?§‰î"‚ |o}× 9@›ÄA¾„7¾}”ýôA„ÏA{A~íAø9Þß# É‚ | oî´G@ásÐA„ŸC{A~Ž×÷ÐA„/ÑD{A„¯Ð$OÓ&1A„ïàù=ÆâošAøÞžP ‚ð1èÊ‚ ü¯þBh€ Âçðî- Aø´G@áçÐA„ŸcÙ›ÿŸ’’‚øøx¤¥¥!55•W' ŸÏ’›7o0×®±‚¶qw¸ë\‚ ¤ðÊ_ìß­[·¡¥!‚ ‡A„ŸC€ ÂÏ‘C»ÄA~ƒ¹Ïg@3‚ ¿‡A„ŸC€ ÂÏ¡@@áçÈ͘‘‘‹/º³.„;vÄÀÊC}â¨/ܵ©ûq¦MM8L2qò NJ³þß_€èŽ¥>ñÔî‡ÚÔý8Ú¦æ8.^¼ˆ§ÆM@uu3Ù <üè(|·ëÑJ}â9¨/ܵ©ûq´MÍqzi CÏx§Ú–úÄ#P_¸jS÷ãJÛ8 &Üõ‰ï@}á~¨M=‡ó3P§xgÛ–úÄýP_¸jS÷Ó43š¦ygÚ–úÄ3P_¸jS÷Ó$ÀÕ‚ Ï@}â;P_¸jSÏà7›ÅâÛ°¡e«($wOƨÑc0hðMX3nܵ™f~Þæ\Ê/â<î üµ/¬ñÕ¾±W¾PºXüm³ØíJ›Å"¹˜WÐjµ()¹Ž¬£™ø`Ñ{øñǰø£%M\;Kœš:óä3·«ö݉¿ö…5¾Ø7B廣~žlS_ÅÓíÚ4KC·`t6ÕW¡P M›¶xâï£1|øHŒùÇãØ±ý<öøß›¸†¸sÄä‹ýä¯}áÛÆWÁ­èsÌñå@àôw ™¢³ùëâÅ\Lžô,îê‘€n]ïÄãŽÀ÷ßí²Ðüúë/xⱑHLè€A÷Þƒ-[6Y¤ß¸qóß}Ý;áž»{bÁ»s¡R©ØôNâ°kçv<öÈp$&tÀ]=ðÒô©(-½iSó8êË0 ”AAxéå×°uëf‹ã›¾þ Þ? ]âñàý±ù¿Ù´5«Wá…ç'YèkjªqQ[[cqüч‡ãĉc×Ý]}ÂwÞÖí9êï 9© ºtºÃ¢¯}x8ºu½ƒï³í+†a°õ›ñÀàHè!Ü‹M_…Nâ¨/ÚýVë®ôNâ°éë¯0ä{‘Ð% €o¶npT¢¨¨C†CHHär9ºwïŸ}Á¦§­Z‰ï-B¿~ P(ЮÝøWêR ûfâñ'F! QQј¿`~úñ‹]ºl%îêÕr¹‘xkö\Ê8ètG„……Y8’ôô/1ÿ½EèÑ£'är9zö¼ ó,Búúƒa´iÓ:vÂÞ½{À0 ŒF#6~•Ž¥.ÅÆ¯þÃÚùmÏ/xpÈP¶lGëîŽ>€.î°y™§/þ×ÇèyW/Èd2³¾ú |˜Š!C‡A¡P s—®øø“åøtù'¬fíÚ4Ì_°Ý»÷€\.G=1Á"»míÏ}q«÷ —Ã2/#9¹'Þÿ>Ö®MtýúÀž=»1iÒ·Ô] \}gÏçÙjÍt Ýlòýyú^ž>Õ&Ÿy_œ?w½z÷¶È›’’bcŸ³®~ÚÖÜJ}ÕÎUÆùsgÝÒ†6å ÔíVõ?\éÞlWÀÍ›ÅoÍž‹G}™Gcÿþ}øhñ˜4y ¦<ßø ø#׌×_F§Î]°>ý+ÄÆ¶F`` ôz=’“ºØäá²!ùÒsr²Ð5¡›Eºu„eе`Øß†cÕç+¡V«ðÕÿ¥c츂aŒ÷ þïÿÒ‘Ô=çÎÅÝ}ïqªî®Œ˜„l[SÿA·*ßhDαS¶kO¨ø«êŸ}!T–5Þî›àà`TT”£yóp›´ŠŠ „„„x´ÿ2ÙÍçËþÇíêÊŒÀ­{ à !¡&NzŸ,ý[¶î@ÚªÏØ´®]™y„wZóûï9xcÆ,ÜqG{€a=zÄ¢,¾rùŽ ¥«T*¬úlþ>ê챎;!;먅.ëèQtêÜ…}×íÛ·ÇWÿ—Ž çÏãþûÃ0xà!8wö þûßè×o€Å”ÞѺ»£Oœm—n‰IøóÏSvóvéÒ¿çd[ËÎÊ¢¾àé‹[¡oº'÷Àýû8Óì߇¤îÉõã*£K—®‚çî©6õUÿã­vu·Þ54uÊ$>”•J…ÚÚZ9œ¶mÛ²éÏMy ¼‹ÌÌÃÐjµøë¯Ë˜ýÖL6½s—®X»& Ð¨ÕØûÛ¼=ûM·t„yºV«EQQ!vîØ†Œ~ ={Þ…#bÓŸùçx¼ÿþ|œÄŽíß ¬´½e¥¥Ø¾í¤þëC¼8ý‹úY—ñþûó1aâs¢ÎÝÝmêËþÇíê n]zzÜ?±zõ*üqòЫw –ú9«4ø~èô:,ù×b\ºt­¢¢ð ÓÙô%/â÷à˯Ã0ˆ¿¯½þ&æ¾=Ë¢,¾“jŒ¤nJ%Z¶l‰¤¤dÌzëm xŸEÞ‡y *• o½ù®^-BëÖmðÜ”0ò¡‡-tÆ@ÚªÏ0jô?,ŽýlX¿ÜkS'±uwªcy>B¶¸Òûö퇙3ß§˗âÔ©“02 ’»÷À„‰“YýСCuUf¼ñ J®_GëÖm0yòóXøÞ»Ô"/N_ë›^½zcågiX»æ ,I]Œªêj„…†¢gÏ^XùY’{ô´È?~Â$Ìšù:®^-BLl,¦N}C†sê¼hS_ö?ÞhWW‚äæÍÌբƧãڵ̴aÃ<1z,ª*+.˜°Á`À¾ß~Æ„ Dé}©O’“ºà?Ï7u5ÜÆ­ÜÖ¸³o\±u;µ©»q¶]iÓ+—Ù¿[·ië_OßJxrê |¥îàVï kÜY/§—yn³6u7Μ§+mCß>z›á+}â+õhJ|µ |!Ü*å5Þ>Oú=ÅÙ/ôÉñ“g|¢îâVî kÜÙ7®ØºÚÔÝ8Û®4#¸ ñê”›° õ…û¡6u?Mü%:ßJPŸøÔî‡ÚÔsÈç–:ÅsЈÉw ¾p?Ô¦îÇÙ¶1ôŽwEÇŽ±sûôJéçTÁ„0ÇrŽ cÇŽ¢õÔ'žƒúÂýP›ºGÛÔÃ!7 g8p [0á:vìȶ³¨O<õ…û¡6u?޶© ƒÁIQѦôæMö ˜Ê‚ ˆ[óÊZ´h©Ñà™¯5%‚ |ƒ‘Ôh¤@@ᯠHM?¾@Aø£‘fAþ c4P ‚ðgŒõ3Z"‚ðGjkkadhiˆ Â/Q«Õ8sö,ª«ª!­ÓÓŒ€ Âß BRb"dJÈF#dR ›hþ Aq{R[[‹h FH/IuM]‚  ÔÖÖh\ª­­Å%¹Ò™7¡¡m‚ ˆÛsçÏ. )C°óðMÈ"ú _pQˆÈà@4WH`d™DØ(Aqë P(…2Fȯ“cãùJãÿÚ ª–©´ù\IEND®B`‚slideshow-img1.png000066400000000000000000022152201225012771600336100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/images‰PNG  IHDRÕk ø9 IDATxœì½y¼eIUçû[kEÄÞçœ;dÞœ«¨9k–¹Š©,¨BPÄ©>ÚÈ}ÚèCx­ ÝÚÝ|l»Ul•FŸˆ¨8ÏgÃëçÔ ‚ ¨Œ2UÔ5f 9ç½çì±ÖzĹ·’ÊÌ"‹Â¬þûûÙŸª}öéDìñ‹µÖ>I¸øâ‹10000000ðUåÚk¯=úcØ8«Ê#<öµ§ºEvªÌØP!Tí_|qxìk·îرí´Ûvîx$8000000ðèâÞ=wß{çžûî¾»|æÕU‚»Wñqö»wœ~Ú#ÝÂG'wßq箿±J¹ÿe뎛¶¬t³Ù#Û²GÛôꋺGò‘µ¾+tßaÚ?•}k„D,tëþ×bߟ½û濨¹vœûô•Ó¾î«UÂÉððkÙ´eeëŽ{>¡?šQ;ˆ‡O4ÁPòm{fïüû;—F8s×ò®Íññg4 |hMï;èwì÷Û$ -Køò% <ª9x÷u{oûèãž÷S5ã§ßýË%—å=üNM;ëÇfԆǾöâ‹/Ÿ»Ywt†½Ÿy빋w,//—R®[»t鬫[îlß +ûÞqóÁ­;Ÿü¿?Ô6=úX^òÓ–ËæQ^ˆý}{nÛ'ñ®}Å­¸éÊR:g×øñ»—ÏÛî=¸úw×ìÝßOB ‘¯]öÞöÑó¯xÉôð=5ãùW¼ä†ýa»|ÎÃ/áÔ´³~lFm=™ënú@ãÇè¬ç¯ÞóÖøß&"úçïþäžÏ7Ëg= v‡/Œ¹CÃäìç[Â× ·®ê-·ÍÊìp?ÝFÛB‡vYóLóÚ½ûgûî½îæ»ûYÿÄ‹¶?ÿ²íŸ¸þÐ'n9Û%–ôH7|````àÃM¿â¼uñ}ø%œ _ÝZÖõÇqœ/¼'>û-o{û×?ã²K.:ïÆ÷üé~±ÄÉÑ-YÚ÷¾¹»ÝŸ¾À“Á}ÀݬôªîÔ:’z$%ðˆ›ÑÅçò×_šöí?¸4¢ÿûÏ?uý-{^ð—Ürû]{ÌÒx…ˆé¶ <2<¬u}ö°õÇI/ß_ÝZDië§öœ>òÑmÛ¶^|îÖ~ú¿—3þ%@õ¼÷ýíÆ;?9Z<{÷W,>>ü¦gxüwývoyók®R-/}Í_Æf9´K'J–Æ[N-_Aö‡F”F¨Ag3Kc¾â⥷þÅõ«G·Mø–«/ý³¿¹ñ½åŠÇíxË;o-Šþ™[50000ð¿(_ÓúcõÐáãç_úŸ¿å’C71ói“îó7¿‡·^ÀÜtõyûßù¡ûøôž0ïI³ï¶OVvï«ßSºCrééDÉF›¿BoÅÃÌþpxÂY Ÿýü]7Ýtëk^ö¿ñ–?ÿêKÿŸ÷ÜpÕegnõwßwWœlL _ƒÄ‡·®¯:|l o~ù¥'JÿÒ_¿æØN¦¢Õò€{ñ¸µ¬¿‚qœå~Žïø¦nÿÕÑ*€mþñ{mÂèôÇ®|î×ìÅÎâ$^(ݵuôòïÞýÔÇnß¼Ô8¸ö‘ÏÜöGï¼îãŸ?"ë›þµý7…ñ–ëßóJg=ãß´ËgI³ø]WŸöò﹤”ò ¿õþ£“ßpÙ¶—½ð‚3v.^sÞß~û'>ð©ý¡YÚµmá'¾ç‚©å»¾áœŸ|ùÿvÚŽ•Ï\׫~ù¯îÜÏÒ,ñÙ»F¯~É%O¾dûG>}ë~ã‡nßK;wlyßo>ïÀ¡éÓÿåïH»ù´];Þû†ç^õƒ|Ͼi3Ùú×o|î¦ÅæÊÿö¾ÕG[@Çé»å‰4‘îÞßDðâ–Áü[︆¥‘vi4Š}Áõ_Ü»ûŒMwÞ{wðLÜ|ÙžxôaCÔåûäK8NÊ €/ŸxóË/ý׺žÿþ+wòµðÆõ̱Ûú/Ö:r÷ à}ÜÖýÍ‘Ãû÷6WI\xŒÇëêòo¹ò¬­›F´eó䛟yÑÏ¿âÊÙþ›uvàèÚç.SX¹êI[_ó#OZYn·oYø¥W=ïèdÏzâ–_ýɧ~ìS7=áy?s÷½{ßø³ßþÏXîßõúý¤¯åõ¿ø“gž¾5~â%§ÿÜ?uvð Ö¾ðÌ…·ýçg>ã »š$W^vÎÛÿÛ ÎX>p×·_sãÝ›—G—œ¡yõî§^²àò RdÏãÎm7/5Ÿ¹îÖ[o¾F»C'úÊ]oÏ{ê¦'°ü÷ŸÞwѹ[Î>}ùîûV¬–ï|Îù×ÝtßrûÁóÏ\eϳ“éÉáŽáŽáx”Üô+;p‚|ÿë>yÁåÏzܳ_pôàÚ¿~Ã]×ýíJøÊÚùý¯ûä†ì¸ëº¿Ý\þ¬kÿú ûoÿì‰jùýñàÕÊhËþÑ3ÝýÀUçí «×í?'-Ÿ}’­>cÇÀ¿zåÏ=æâoxâ3_üŸ~éwþüÝȳ}ZÖŽ•EÓý7åÙþïÿÖs¼î¼óü«_ùï^wt²—~Çn¿ôú?8¸ïÎ_ûÝwøÑ=}zð–3w->x-ïø“÷œû¸oúûYO~üyÓý7ånß+_táÂ8þ×7¼}×Åßü«¿ñ¶¥…Ñ«~øŠÙ¡/¾÷Ÿpõå§w‡ïx꥛<í±ÛºC·^ù„ïúË÷w‡ï0è+wÙ>ô©{žtáÒUO\ؽCséõ­×¼èùýè÷<þ/ºäÀ¡Ù?q±Üs³k€éô‘†c8†c8†ãÔO·„zeÓ®‹vžÿõGšÉ–ã”ð•¶ó%¿ò±ºÂ¾ç7b.>.{f»°eyç…ÍÂÊ k°á¡ ' µ{Íp`6zÂî6¥ÔÆ/Ÿeƒ7ÿéMÿÇ÷\øÆÿö€ÿð¾÷äí¯¹ážÑæs˜ïÅ8º,.>g3€_{Ú,ÿùnýcþôÉ¿úõôgœ¶­;x믿ù¾úÇ¿óAjyÙ+ÿ5[ÞÿOûÄÊÚ^|âE[¼áoQ´oþŸü×?þâ§>éÂÙ[ÿêC×ýŸ?ôœç=ûi¯ýÍw?ã §»û•O»Dû#Ï~ÊÞõ¾ˆÍ¦Øn>aÐÑmw¯½ëƒ_¸ê²ígí_z^ÿ?þê–_ùýO‰ ¨ké),žqÚÊ“.ÝÖuÙ­¸•“ïÏGî_¹ÿ¥®Ç–à®Ë;/Øqþ3p½YXq·£ÓŸüêsÜv>÷G~å½oúÉz~ÁeW¶ [wœÅò® šÉæ¯åËÇÀákWüswtYY>Ü÷}×u;ù¾»WÏà…sN¦Å¿ûg7þÝÿú9O;óЧ\úœg=åÙW^þ_^ÿŽ?ø‹8ñð¥D„€d´rÞâÎ'ý'"pÙ³¾ûö½4ÚtNé•ÙÁfa×ÿø£Ÿ¼vσÔRœ—VvOv<¾~4+ny^ªÈháÜ¥Oœ§ì^sÃwÝsàüóÎøÆ+/ܲyá ¿÷g?öƒßþÍW?îÜ3·Ý±ç¾k>ËdÛ¥¡]z~Ë–nÛÛÿÞŸÞxáíåÝùï^ú‡Á}6ë˜9„(Aà8xèYø ?¾6y8ñ§–‰ã”évœ’ݘþ¤WŸã¶sC|¸þc¼ü[¸™¬4ãÍL|L-ëöãQV¬Û»yíoî[kҙ߶6»wßÁ?IR,~Ï¡æÅœ–N”qƒW¾è¢[noxËûþã/½íû^øÌ×þÇõS/ûö7ÿ¿ÿÞuûý­Zo@=¿þ–{¾î‚]/{é ÷O>÷ÝßxÁÑúâûÎ?{Ûë~áÕ/û7¯;\ÖÒxkšl£-¯ú¡+n»óÞ©%¤…Ð.¦ÉÖõÒDûìmW^vîþÀw¾ùO>÷C/x€øØg 4þ›¼ù{¿íI¯ù©ï»kϽ?ÿ«øÏúk~êû¼û½ÇaG›%¤ßH"µK,ñ†=G®ûâ £†ÎÚµ¸²i”rÖÕi¾î–}—_ºíœÓ –)j````àQÌÃÑuí8®þðãé?Fœüêslioû·WÖ“óŸüõ7|üï|ô/~ç9?üÚéds»ð%¿vql-þ—U–·ÍÞW@eûw¤0’…3–çîÌïkÛ´)FYû«Cé;î"9Ï}ê®]ßrîk^þMWn¸ñ ³ƒ·5 »îoÙÑ­~ûíýÏ|ë«^ñ’W½¥mÀÁ¿ë³ÿþeW_ùŒ'öCo­?ò©/þÀϼóyWî>mû“¾\-t´ ˆ€_ýý<áâ]¯~ÅK^ý 8txí5?ÿ[¡YNíæ¿ýØ]ßûm8ëŒ]¯Ã[áÿûŸþ±—~€wýå߆f1¶›ùx?>iyu¦Dp'"á´ ¡µ´Xú#×ߺª7ïu+pkRxìùÛŸþ„3Þñ®3‘fP_›<àm‘?úé«N”òù?ñ¦vaKsÔÒNÇ+¡^q³c¯»ÙÒŸüês¢vžÿ¤+š…•Ëžÿƒ{çïxßï¼ú^ú Ë;/8¶G³®?øø ØÜýÃc¶ÅÞõôvéôz%®\r`ß½O9s5Æx†ûǾø‘éÂÓ¼Å?÷»ŸùÎgŒ/{ìYK‹“ðÃûÙ_üÍÐlâ°î!º_Ñß|rÿ«~ñíÿ懟«Z~æçßô»¯ÿé?ý÷÷~ñÈ¡w¼è[áùgÁýÓŸ»ùMo{_™üé_þ‹Ûã¾l-÷S""ºùá¿ù§ô™O{Ò…þȧÿíÏþ_·Þ=[Øvqš¬üÓGV§ÝdÔüÑ;Þš¥?ÿÀì¥X]~è?Ýl}|o:n§­õvÆö4J¸ã¾nuæÄB9ÄÐNÜ4JÙ4ƹ§5O½tåÞ}«𧟽{Ÿ¥É–ÐLN4nNÞþqà®ë–wœŸÆ›6®ÔµãØþ觯®:¶„éá{Û…-_bÿ8éÕç¸íÜý¤g´“•íç=­™¬<ûÿË_ÿÞÏÔv¦ñ¦cÛy4tÑE…Ǿ¶çW¹šÙµWž{Ï{?9£ßø%ÚÅõ |àªËNWÕƒ½ëš­6>ïÁ}ðŽ­í»©t] IHã-ã•Ýíò™yí¾Õ½7˜lÙ `ã¼ÝtVwø®µ}7ÍÞb¸¹[³°s²ew»|fwøÎµý·ÌÝ®ý*ˆb»i¼²;¤…Òù²µŒ·œ¿¶÷†£•sûÕûf¾°¶ÿíW%MÆ›Ïi7&[a¶ºïƵ½7˜vã•óš…Ý‘=kûnbiÆ[Ο¬ì&‰Ç 74~ú¶´mS\Y +‹q2â(î=0=r¤û»OÞþ…Û‚Hâ84‹Ò,ÿÝÀÀÀÀ× ~ä£ÛÏ}ê±×?û—¯?öâòÎó—vœ¿¼ãüúñž›ÿ‘.?Q ·}úÍäKœ ÝêÞf²¥YXy@ §7~ø­K;Î_Þy~3YéV÷Üsá»ohVŽmçF–Ù´/Ÿyõ ã?¸¿÷Šs÷}âóiÛ7?ð- _ì/;°z×ã.>çðáÃÏñÛþòúÔl~vO¶ìNã•Òv+$1¶›âh³¤¢yäÇügÑ×Ï%4íÒiG£åÓrw¸’¤4Þ"±m—NÍÂhùtí×@$iG[$ެt_¶"J“­™C³°Mb›&Û5¯IÇñJh–ˆŒvq§Hr×8Z í2K iHâx…É~G•ÀXåë¾xäº[Ô]]‹YvW¸¹;ÜÝî’¤IH‹ÇÇý³G=~»ÂösŸrìÅf²ÒŒ7= zãD%4ãÍ5Úôè+ÍxÓ±%<œvn;çòfa%–Ý4–—¶ŸÛŒ7ø²µÌõk~Y»å£×:Ø^ãq~—“Ûåw}æÈ ·_7›Írî±z=žö ín&+ÍdåØë2Ùr´:;úœ¹ q'–v§öÔ†Ô¶‹;Ž­æ$kùRId¼¹G?= eˆÛÛÅíÇ&;¶B»ÓÞJ0™@N ¢†C+qÄq4üìúÀÀÀÀ×2v‚u}ëÙO>Q–£Ó3ÓÃ/áá´sqÛ9G˜FËi´|2µœ8þcëÓ¦Àƒý[)ãÇÜØ=$„“Y”¿¶ bæÑL¾|Ú¯aÖïðñÿã¡–p2|ukY·Ȱ 8Õ„É9{oûôâÖ³jÆÃ÷}!LÎaá‡_©iç ¬ÿ“A œrdátf:|ßÍ5cZ<7ŒOûª”p2|ÕkôÇÀÀÀÀÀÀ#‰,>¦Y|Ì#[©¯e®?BôÇÀÀÀÀÀÀÀ)"lœÝþîy÷»Þù6e``````àQÌó¾ùùyÞ›êù`ö8Õ úc``````àT3èSÍ ?N5ƒþ8Õ úc``````àT3èSÍ ?N5ƒþ8Õ úc``````àT3èSÍ ?N5ƒþ8Õ úc``````àT3èSÍ ?N5ƒþ8Õ úc``````àTRꋯº<ŽÆ«‡VqÏŠ:G_l—¶”µŽrÇvÛ(NvíÜ:š0µvèÀêôpç÷`Ú£ä´i±PbGG”U·Y3ž‘q“µÏ#Ht…TÖfÖ!ï—oý–<íë/GêÛ…¦Ó%élÖ·m»¶:±I)ŽÈND³ÙŒ™ÄSJ³ÙŒØ‰H„Ü•ˆœ…¼hÛ.—L ˜8I¶)Ì­x¤ÀŽÜåQHFp7ƒKd‡:™¸ÃÝݽm[3SÕŒX1Ô¬ËQ$q脳*˜TUb,¦Å­m#Èb¥h¶Qjáœó*‘©ªˆè͉¤VÄÌ"RJ‰®^TDbŒªjf"b^ô¥H NèµÑIõ¦*D¸{ÑÆ€¬%Ž[¹»ª±±3ˆ²š©ª2síÌÚ6Ì̉Ô-›QŸsŠ¡‰Np2gWVU7s€³ªSp¨ÁŒÀŠsgòÖ™HÜ ÎD\JafN¶ÞËjI‚ª–0)îG‡€Ì FÚgU…‰™™™1sm9 lt¦ªCs1+¦)¥.÷ÎÄÜr0s»{q¸åœkŸ¨* Ü}£s*½ñ¢ "f¦œX”Д´˜Œz©jŒ‘ˆj™înÚÕ¯cf2+½Ä˜˜êX¨jÁ̈ĜjÕî^¿N¡8UЇ(wF aª§j†Rm<3×¾"ó&Ì+*¥ˆHAUÝ}£'kÅæ5Ö¼"R„”ÒFS‰È%Ô ™QŽÜ÷} ¶zƒ¤¹„ú¾¨ZA82õ¾ïûf<šõ3«[HɵF1UU0s#ˆ±·f«k!„"äB®^kжmß÷f"åÞÜ@Ób-ÚÍ<ŠH \úLÚ ‘ìpµYßqcJªˆYIû¢Äœƒt)¥¾/A¢Ì €`Pƒ*46¡¸ 9åŽH@ Ôîdóìa¨¹šô  0aŽ,®ff¥–sÎõž…yC¯Æ’ºY–Dà9l œ¯Ó¶m Šª e7ƒ¹Z ÁÝaînDLDq¯£F@ñr €D=Ì=çÜŒGÓnÆÌNèKá4IÉå’¢¹…»®"*¥Ô»¨IR²™ Àµ ÍDÄë´kB Í…ˆ‚H£Þ#swe-¥PE•R(z1˜$ÉY„¢ qËlÐ/äP1F$!À]gý¨õæâ(ÓN˜!ÌM´’%÷àh.ëܵÅÑÚl*!„&¼ËY$zï¬@ýÚÔ‰b“\xÕ;ˆÁ5çF˜YÛ¶}ªfv.0¡Ü÷DĘð&pù_+ýl2» ”K1 â Ù”ƒ¨{Ô¦àÐåœRRƒ'6WËÅ Ä1Ëå í @}~ˆ5Jì–-Jòèh’¸{l›^K]Y¦ª‰9RY5ŒRWòˆP29ˆ|æ="g·—\~ú?—þ#–V¼£Â0ö5_]ˆN³‹ð|šf©ZDDê¤B°â™BpfE•„ˆLâuêˆBÀDLî±âÆÌA¢åâLînYƒ4D‘Ф¬05óÈȉŒh¾l»'@,ÂÎMÓÑš¯›‰poVB+^Œ¢ˆˆA bî Ì,ì™;ƒ\¡f˜ÁLõûÖ§Âáf*!ws`æÄÍ@G¤`pe7÷C‡W#±QˆÑݧÓ)3§”æs÷:fV×BrrswXÕ‰„ˆE"Ë¥”ÂŒ P ˜ëÂ:92s“ˆ™åR‚Ì…&f„¸Î˜Ì '(ˆ™¥ê8‘l,êu©03811ƒ@·,Ý”93™AÕS ¹Ww'B¡jDwLD‹™¹ª±Ä*œÀˆ RïŠR »“Ã"±JÞ«ð¥bŽ #1W½kfPK1U­ìŽ›c)%"íº®ª>QÍLUŠFrÄ.žXˆ(†PUKÁK‘Ñ(®­M7†Éáãñ¸×2êêc̹s§È1ÄHÌ]ÉÂ̈ f’¢Åà¦&ĵ“7„£{0ס4W-Wg¢Dј™È×LXnÄ' œ¢ ólJ I£Ø©A$†Ô\­á ,æp®‚’T‰ØXŒÉ„ÌÔ¸©õZÜD ”€£ÈAÍæ·@`f$—ÂëÀ13“;‘»ÁÀ!¤„"ˆ\×µi)¥.3¥”n:‹!D– b0‰rÀ,«¥­¨‘)ê8’1U)Ð{ˆŒ õÙ¤¸–zT JLMÓ œSj<&"‡"ØÙ1Æú°¸+sdbæ ª¨E™™)F$¦ ’Àˆíü[€AB!ˆgêûìD’`L…‚@a®Z4ÆÈ`RŠL¦L!À‘ÉÈÃ"@ÌBd¥hU6V Q¢H0³ÜçB1h1pB""gÄ\œ)Ž:SMÈÝEž$,ŽÆ«ÓiHq–û¥ÑDÚ¸ºº¥±bMÛLû.Œ\„v¶lBœµ(œB)E@ÁSK“v±d°™»ÁÝœÝ8Q¬Ó&13G çLDM3r¸ƒÈIÀäâ DÄÎ(¥¸{ÆÝ½#‚GJ05Ž,Þ‚¨h™­ÍbŒìC4ó†b“ÚnmJ*% IÐäÖ»0bŒ¦=»”’š¢xH©KIjl̹°e-=å1ˆaFA¦ÓÕµÕ.ÅÅØvÓÕC`qÌC\zEK4ëÙ…zX”ܺ·]›É§P¸tÊÉCH±,ê]÷íýÂM·ž¶õ ’‚(B€SÎªÚ ‡Q‰D ffVTsŒmJÉ 1yÈ`Ê”êÜwkSR6ÕL dsâ6¶^\(”®¸{1u3goÛ–™¯Íh¾ó¤¶Q×uPOœ$ÊÆ3Ö­M¥˜s˜¢ÀyÔN¦«³qÓªzÛ&wÊlߨ\ÎWG²: QJ©**çõÝ€™9ÀQ‚»QQ!Õ\½#8Q¡†™±ycL•„˜˜ˆ9»ˆCûLanVU QUÂìbp‡kׇ”&£/îÆ0¦”a.L^ Nàî7Á n½¥˜`šs‰Ü;3r΀ª*Ìërë“©J Å à¦D8@v³°Eµ Òk®¶ æÑhT{¯Î}Gu,Õ :<„£°ªÙjÉ)ÅÐJß÷BÀhnça¾­$¢¦iL¡PÈh¾“1³›×Q³RˆH æ ˆ"wr0j3êxÍgd% ³>7͸›åqJ9烛œLI8Ö&™Àî®æÆFÃÜüC"v$3¹š’ƒˆÄ!&67rÔ!¡d!‚`f€Ã‰Ý݈I HÒ™³»Ô]2Ú¦-¥¸y7+}ßQÓHM7îžsV5"jC"Ñ\ 5)¥Ô©¨fòz{§”bŒ!„’-„Ø—¼¡Ç㱺œiáNÄ6³È ˜IŒ¥/s3œE c>⥔u둇à ÀLÎÌ!G'cålÙIŠ©¹³ÄÈ‚t³Y XŠ»ja‡@,«™ÁÌz!s-êN!‡¢99 …`\`@‘1‰4ˆ\šTܼ”:S˜32ƒPo]u $"8ÀLÄAUÍàY0¸j»*b˜9J 0ƒ‹ºÃûÜf!–\Í‹ ˆç†ŠœUU<¤¦îËÙÍÕˆC`2WÌ-Á bdwUw%&wõvdžápc¢3­O ÜÅ©„T²‘ ˆ”bÕ~&ì\uâ"‹%‰#°“€(»ÖtUH$J)eÜNtk]ŒLêE˜]œ"¨˜š**]ŸbLfk3C#!¶ñÈÚ*ƒ,—4Y*ÂP-¤g*¡]ç®' —ÒJP'•À0­÷[ýoJh¯™F IDATI]Y™iTúœ8 1¬ŒÇãýU+#;k)C1avdÕ:ôB’³Q_@$Ù‰Cp8 !xQr°S¡hÖƒæl}äÄL pS?›’—¾ÏARÓ4uO[J)¥„4ªÏ ˜³e'RÁ)¦†YLìpÑÍ=ko„v²Ð)ÌM˜%’Ǭ›¦Äü!)Ї¦?Lvx>ÜF×­³|¯i  yïå›öš×Š´í¡éR’¥-ãtäÐ1äT¢qìâh¥DêBßQ¯ÁA© £…ž–2zõq:‚~ÕsÊJ:½ës×Üpá9—žqaêliÅœ€®ï› FÖ´B”Q¨;2Û2YêÍÁbP×bFM³0[S ¹›‘ ,쳤é4[ m3ÒlâIaZ0)Ϻñhœµ8 ½iŠlž…#9´Ÿ…ØÄÐx°bê°i7kš&¥Ç©€TU1µàÞ„x°¬N×úqZvÄH€Í„¼ï«`‰\JQV†Ba6› È‹+‚ªŽF£¸ë8L„¼‡WˇðZßgÓãÄHµ0‘2‚‘ƒIÕë]Ûðú¾'g#J1u]ÇÊ‘"0åDªJ¸“{pÈ,ç#±’é¸i»~JlEKJ‰8­u½ˆHS†µ^ú&×ÎÉM<-›÷ìΑI Ù¢A´3‚PHMʦ"Br63r¨¸{µ†³1)S1ePJ1¸ôZ”y¦>ëºÌF“ÐÌr¢@l€™ƒ9WÏÒÜf.f ©1³ÞJ)¥m[ízéëxH`V73Czµl™Š51µ)1FÓÙ”&F3Ó¾g‘…6Óì>ÓÂ!R3ë3À,ž5‡úYO$mHV”š‹’…QÌî¡õN‹åÒıH€ùB;b„aH!‘‹÷}ß.4uMe©ŠJˆ(kPc؈C`¸[/Ä 9amm-„bdh.N$© ¹¯»eJ)õ} ç\ QìHDšµiÚ’ ŠLDŒˆªž€#H@pHÈEÕJU{ Is{¾ ±›º˜]  f¶¾o$HŒF˜ºö2YjEsŸBC䈂uÀÍ%„Ü÷)„¾ëcŒìlfÍhâN.W¨-‚’Dåðê’4ËÎãI)f¡ ³UrÔÝ)U¨‹´ 㢋£Ö´7+…FfÖu¹iJ)¤ÆDN¬€NB1‘zC\ pgXµ_Õºª‚"e˜’©0†EŠP%Õétc„H1¥& 3õ}¿îC!‰m×u1Fw§*,àj‘iY !0± kÓY¡Z˜¬hµ±ÅÈ !hÎfhÚs3sER;“óZ^u…Ãc1†¾ï‰œ§F$Õcwcƒ@nŽ”Š`ÕK$jBäbÚw“ÉdÍ{S'côà¶1(N±ëº¤”XŠ©H‚wkÅ !T[¦huƒÎ$3¸ òáƒM Þg%¤62K)…9ä.sÛÓ–¾tfÙGÁŠ ¤µ®QŒÑ¼‡1­•2ž,t]ÇÙZ¤àK£EQ53*ÚÇm)EàÅ׈Cî2‘™Ù‘n­DަФ¶)–Lزfí3…³ØŽˆ¼tÓ^¸— •q\›vA¤%NÎÓÕU6_\£€äÈÈ`'sˆ¥ŒBQu ecNî"b1*:·»!–RbˆZ 3 …®/’b¯}+\º™õya<‰£²¦}hSo®FjÒ4­gƒ°¬äX¨î Bdi›´j^ˆ™CWŠ2Åw]¡~¹i‘Í:P‘„®Áà3ÅæŸSx'M_| æÆ$ЖFŒƒ>ý™—X=0ëWïØc·ß¤1ºSòîpqéTcäÂ}éûHTÈ:s¢6ŽŽ åv|ó­wÜpËvœsŽ …èÓY×4M)eqq±nkbH}a&´­L§«̳–¹W¾ï 2`}µÄz³j‚0BDî‚ôݬJÈÞr²euurËL,p%Õyof šÍfNH)¥”êÎÏÝûœ™™ˆ«VDú¾Âi4Ö™rÓtÝ,‰ ±C]M½ˆ™5£Qß—œg©ú>ç[˜Y“Rvƒ–bÆÎîNs—ML¬޹PU'TS|ªA€ª2ˆj‹®}XûÊÝ… nBÜw½ˆ qa—6ªª–€Z5x¡¶­î™æ;od"u'fÌ[ïìpä€93#Ô˜îFP-N ji¶y@ `ÄóÀ f“êäëîF`Ž¡/} Q0›öª†ç¶BÝ 'ÇúU„µ¨„¹1ɉ8„P´—õ”næ¹1¤&«w‘B õÑÇFTVõ:Á ¡šë%„àb!¢bÎÄBœX¬xÑìжmsî„]$T'Âú¾ÂÍlV2 sŒÓ®s"8 ¢€ÂQ‡Ö×u5ïÆ¼g„âZ‚ÅPb’Q£V ˆ’˜š;E°;{ŠÑ]µš¤an›ÔJ²¢¥ZCÛΊ†˜f]†±1Œc3)¦]ÎCÓ4¦GÀÁÌ£„‚›A­šZnf1Fƒj&ŸÇ—Õ["C!¤‚qÌ‘K2ObŒ]×IŠêVÜêC%" Rµ,\-_N RÔÈÌ(VÿrÎ¥— B1F˜Z.‘%µ£j†i«“NÍL]m2™Ó´ôEPmW»©Ì%5#5-:#¢ÜvëžµÕpÎY;·nž‹ƒŠù©p˜Íf-„P}ñêJ‰¨ƒs-ÅÌRDjX„µôEÉ“gV°‰eOQ”î¿ÝK)fˆÂ!C P°ê=:lÓÍê,YJqx Ü•^ƒº»ˆ)ˆ*™ sȽ 7\„Tu£4ð" aT¾¹AÅâú¶"ä^NfVwuÛµàæfê"ÎL"õnÛ¶ºí˜*Äc¡¥8 jêž%̤Ô7BµÚMÓ¬Ï/ÐÒILäLµ5ju¡€É‰A\mR ¯‹–0U¯6‘;9ê2A,µ“C *¥ä¢DÄJÖeI£ª¨ó8¼Îq bb–y¼…9„xc-' išÒYŸbª‚¯JIÔ•#›Ã9Pm€º‚­uíº÷´f13À˜ !V©)<ÖL¯ˆ&&xèg]$ 6B¹Ï.÷@ˆÕÜ B˜•U„Ý]µÞJˆ!A½:zÌœA,@ß6¡F‹0I6¡êH"1pP­¢”U­gf›‚ÈÜ×}ÿëª7„PGXw]1s‚˜KŠf.}ž4m¿6 DTÇ}¾ÀÎ3æ>×ì÷ߎë«ÕŠ7"ˆØQe/ÖõG¯Å‰Á×#ˆ«/¬–#`wrS…S!¬dFÅr€â)`”Õxá+D‡`ÅÕÔ‚‘¥¦Åh·ÌUQ¦õ8-˜›» Ùüñ4‰Ô”r”ºÝˆï ä8šÀ@ 2¢Tû¹öyý‚Gk—y !’°°™•¾Ì£‰X5X§j˜A„$òt:­£¹ÑK)fVõ<rgu§:MLÍÌšm}Ë ê<31ÇÜñ²ªÛ6’1€bĤD®Z0Ðzt¶0[o1D5«O\ÝP‚”"uc¸™±ÃÈÜQc“¤½B!ÕÑ’û¨hCåÔ[ËÝWµO˜LLL☡nî„n6FdY^X\M7"ºx}£ dDQŽYÕàB,êÄ\}%sÅC£(}.@Å’³‹»ˆŠZb€ªÁ PŠw}׸/¶­ª–‚¬6‘ä„@,nºÖiÛNún µ:5Á]6¼Æf³YH‘‚ÀÕÉÁjVT‘yf ˜ 9»b ÁÍj,ùÜÉÂZéaä"}g”`ECDd*³žˆÉÈà„©qv‚ëgî^#¸GãñÚÚZQ3U‡ˆ¸ÔP+ú¾çðÐÞ¨}hú艚¾gèœ@kðÌ(¦™9yHEöì9xÆÎí+ËÛ¶mŸÒò&?ÐJñYOìÕÝcc¼S Œ$¨ò`SµX|ìÁ(6ãÅko¼åö=ç]|Áð"s×¾ŸÇcÕ|ç{î»',/LF²¼Øö¦î¥>?!: 6³­Yà9gªÃm,lÞ¹ÇÀ, "š³³e3‰,f(½r`ÀçKþºÏu4™™—y8ÂÜÈo=²Žccf¡IÄîLðÓ.,¢Jª®ÅÚFÜu=æn* q'³’5„T¥E Ä, WC±(R7‚bŒöØ5s}'fcE߈N¯¹(ÀÌÜ%˜ÂÕÌœXc"8Ô´œœÌœ7–„*¿˜!Vg‚à Bõåò\µ{³F˜Ü !ÎWwB %®ïœp" ¾ÒWw'0 NÁÕ`>’ÈÌ„™û.Ã]B "&ªú£‘Hæf¦ZDš¿”Q> È9³„”R¿¾Áµu— f *f!„ s÷”Cëñ%U#ZéÌ!€™Fã>«˜±9® 2Áj>NMd1w%B±"DmjUU»(U k”`VÌ 3‹P]N¼dƒ¨ä\Pã 89$\½À,É<@ÕÌjˆPP3–¨š›Ô0‡*¡DæBªÆ¯‘Ö×»²†EÄævÄ^_ì’à¸Æ99œEêüoÐ;êØeu£“­ªªu‰S%;×P˜úŸB.ÅÌ¢Hu«×\õ«‰“‚@Ì#(™3¥ñbŸ‹p„:iŽÍŒUá) ­« '€™Ý­Z85j™˜æïé©­Ë'sc ™i4©W)p LMã67¾Ö !„àNef€›ffªQ«š6z‰Öß[©o13C<[5­Çõ8$swáºÁa®]mióW–ªz¨ÔuºZ¸ê£S$‡™Á(¦ù+u$÷QÛ¶uÝíûÑ\Q0ÃÌT³ƒ«!bPg&2a!6+ÕîY[¢¹¯ãU­³FN#0„…@C›‡Ý»£h+burÀëfŒÉŠmuÿÜ•bv¸º±®0Ò†ÍMÜÛñÈJvµÒç#¯¿¨57í˜SQ˜‘á¯6ÑRγ¾ˆ¸ŠrŸS€ZaP¯}Û¶Ì1s)9÷9ƒ¨¸\‰i6-6Ñt¶ºJH‘DVû™»–£-e­‡ÌmŠ1FSµ¢ó½.àî“É„„³i4r‚¹ (…TcL¸¾{àfD@07³€ym:M)‘0È™ƒˆd-ì$"@onPßy"@݉"àð\Ÿ×”b¹“ˆ¸Y7mÎYp–âêóçjÆÌ ÓØIñÐôMB×Ï@‘‚йyžåÈ­q[èf¶jïÿÇwÝ RéÆãñ–Ñ–N'3?2Ù4[Ní]kw7Ë qÄØÂ ½Oƒ÷#⤬éá@c M¯–"|tàÈÿÄGîØ}ÖîÐp,¯™ŽÒØ­4ngl]^;oÛßßyÃ5ÿÔÍVÏÞyÚâÊÖq+ƒd ª–ØB„)yÌpá€Dnn&14L{+fFZ#ò@ ¸'UrgÊÅKFJM  ëºCÓÕ£‹7"ú3¨¾‘Xf!„®sˆMþÚÞõǶe»úGÕœ«{ï}ιö½öµXNˆ!€±Æ2!<"øD„"øÿ$ )(‚ÈEÆv?Iâäúæ¾ÏÞ»{­Y5Æøñ¡æZg$”ûÁK­£Þ}º×£fͪQ¿×ÑÁ šÒ+k&Ñá(tM´dŦkÏÛŽ˜Þíu|0QO×6ˆëõz(¥+»˜ˆt—1ÇaMjU=i.(1 Ô%Q¼²Ì¬°L$aªØh&œœq33s“ †A&bšœêÎL¤ˆ #Z7m{Æ$¥˜¾+]…ön›¹yÌ ‹As3‡P!Mµ“É<2‘03dÕœ­5e‘Y‚sF”€F®Â–Dp2ÛÖ¤¿Žx$ŵªFN5õUŠ*&Q ÜDÄÈÇl²,0p7f¥ÎR.–ZQU¢\µ*£µŽ°fb¦{Íy,'§J)f ½.¥ÆíºÀvÈ2PŠŠˆ9hï³æÌéî œAP5¥ûŽÈ…çט A•°zk&«@Źìº{åÑyÔ±Óh‹àïÞ8ϤŠxf4Q$‹˜‰ÈÊ*ìõ$( %ªÚz¸õ¾­cß:¶2g¨˜{™½…Š0×>ê0—Ž1Ô´u∩"Ô²îÉJ……* ("M!ªÌ™¢ 5Š1CDSD+ˆé˜Í|³[LL<µKZm&L¡™Rdá°ç„„T±*U•â#hæê‚*D$[(2Z[WUQD+HBÀ]û×7m£Ž`©x©€J5àéja•$õDõ±vÁ”®…ø}óŽ?æðúÉãܹ®2ÕTšÊ’ÂØÌR‰§m_º Å9‹¸S0Ê’Uð©Š9Ìaͽ·õU TÔ-*)‹„Âú*Q5Y3ã“ÖÖ{Û‹ˆ}3ë`ÍO «ª5bx`©sÖ÷cŒ¯>ìPUHAÂÖ—hθ^oÐôãê¯×z ²ëù϶ÎúkH¥¹˜BŖ袅dzr‘¹Ÿa‘Mm}1+ñ°©jIF`”-××:ßk¬O²Fî¸ÔãoÈ›ÔdÙÕÞX£m½ç%xL!Érˆ/žN¤TÂEMÎ5¡fÄ1—æ„Wõô<ükAKPºÃ­L Kzvº$Ö_}5' ‰ªH3“î4-Á:¯_xÜ##CܨKf~"¸«sƒ@1]èªRy|4,Ì*E&ë1«×Ð=À°Ç½óøgï}Í«uÖÌÊó˜ã˜£@ ÔM›—Ѝ®iiƒœDÃ]fô€‹ àœxLàÌœs¶Ö*¼–ÍõÏõW-Ñ:r}ãA™)ÂŒQ@¹š•JÔ($êjíÓ[iI⪪«­¯y½IÖfÞ Z”,-æ1Éy M¸ZS&¼ÔÓºxR²8#gŒ1æœ3ƒwqOæéWŸq¨ÁDÑš™é1Çq1g£ìbK¯ŠÌ¨Š¬y·1o?¾oÛ6˜ÚÜzKE€“õåËG1Ju+•RåN!ÙÕÆTéûeÖô6o‚0™Š±«+±mÛ‚46o=¡GjŽ«tƒ„pÊ.Øt".Ï»[¿øe—þcU?¦þ4›Ñh“ó¦™ a.’›ÍlóvD€‰ßùßÿÅýç{»|8®:ŸLíi{ú«é/L¹þ½ð;>uñ)¯/u•½Ù[ßBooZÛàZ’MÒõjÏ{Ì———ë×~â-ó",ðwïÞ|¼}øòõöÚ°}þö{?üÁw¾÷ÿÄOýÇÚ7swˆ©R¤÷g’3"ƤyS+E’³B "æždV `‘UA3MÛeÛ+É,)æ˜ú¶efÃô®%·½ˆgNs‰û¥«Êq“}»\çÈ S_*33£ÈZ5øI²ÐŒiý R›1ÖêÙüiäÚ?Æî.µ¬SõÞEdF+ ZOøúúêÖÍÉ…Ü<–þµQÙwßl')~ Tçí037sªJÎ43&T¬»8€Xñl‹ç2#9Æ5|Ä™¹R D¤‰.š Ƀñ¨ËôªÞÈÎ:¬’kzzzºÅ­ÈÊBf%!ª¦ÉZµÎcT`­æËë± f’àâ¯åΆãQŸ=–ÔÞ»€ –Ô)ç1šu·y wUóE國{Ý÷­¤¨®‚LH‰êXvY¥-UÕ[W•üÊ›#ª‚HŠ4í3‘¶w„4›å]²—ÇíÓ"rU\çKÜ×tœBc}üæc¬ª*«ZkTÏÑ[ä>Y·Û­÷ÞûEd}ö²SÖ°ÆJT#sï×å­,ñÅÈŸ|!GÌÉRÕÃõŒ³ÐÖ"ЬÞ{D˜iï]isfUõÖ""éÞVYãHÔµiÝE*È’‚55³Çz1g÷¾*ã¯ÈÁ¢\VW‚źm×Öþ˜–J]J*D¤–äœ4Ñ"$ j].ä§ûýyð(¬×@Ls±P¬™  gÕ9çýÈš:šQqÉÌUD¡Ÿj]]•ƒª–`N ài£^œÕ9TÕ× %"» cýb!M ¥*K¥yV‘9›UÖM½ )…˜š.ÆS5‚‡NvŒaf-¦ÒÜÌ”¬ªÖ{DŠ™ë`Ö{9µPʇäå±Ù'æc!eÑlý<Ǫض푙ÀÊ®8å´¼ßÝÞÚ£2ær›»„Ìóê¬è Qˆwm™I³ˆ™…¥¸/¦õîVU)Ö½ ÚZ'y\oc¿øåòtÇÖºBLt÷~ÓDM…‚ÈÌ|’ @9H&KD ’3†“_S5ÇœY€«À[Ÿ¢o¶·[µüpôér zeLEsÛ›Š»û¨\¤(Åê[ÇÓÉÚž.p;æ(€*ÙTÜtÒ FîÞöÖ_U¥»}óË¥‡Œùrô•)ç´iT¢®â~0_óÕ Åé)™!®1&!·B䟫ÿvK‡ðH¥åL.†#•É#ßG³^óúÙO^~ûÓþ'ÿÙ¿ò—Þ¾Ù¿üî÷êæÛ×~Vûþ7~õßûG¿ûûßýþìOŸÛ[ÖȯÍ&¯7±ÜírÙ¿~||èì2_áúá¥~ûÿžõ·?ÿ2;¾ûåŸÞ¼ùþÎÿþåŽï_f¼¼þ ý¿øóã?ùµÌïJªÔe–d9€7Ïï>~|é½Ï×ÙEºyTvs§Ó¶zÍ)*™T•­5¥Ü¥ëíí»wqŒy=ö·»ªgPUç8D%¢Šs ªÚÖýƃª·¿}>‹ȈhPw3‘²•[†éf+ò•*V•©1R!Bt¿dFÈ\ ˜ªW•jsU¯-¶8DÜÔ°,ÎÖš8F¥ª˜’Eo¾–ã%hÕäîþòújf%ç‘ú\"ÍǪ¾rØ^¿üð¶ùMq¨@ö®Ö'¯|õ]Ç1I˜™ikîà|¬k?p÷£Šª ¶†Å¾Y”Ì‚@æ\buåÍ `;Žif¢™ŽÊ£¹_ 1"%¬ÛȸÎm•tÕÞwV¸ûñúê&n#ZÙËíº¿}†é21 …yLUmÞ"BEçœMSð¬ç´©€©ª¥rà ãP½PÑœa«|R3«fF—(«€)+›Œ¥¢"K{&BY"˜ãªUsž+ï’¯}*(š!˜²Óææ‚‚*Toýâ5Ëjé ”!UqÛ­“\¡+SFv joÅŠ*Ð`MœÌù“É IDAT!´K/†7;Ž£ªZëQµŽîn. ThÉÊ•áÓ›=Æ„`Y¸k)Ïý’¬PÕ&'~°÷-EêÖŽ9)|Ò¶ö§srš(7[™TÀŠOqwKà"¬¹wŸsfRôŽsègòÈIYžã¢)I¨45¹ÎGï0oÇ!0ØÞzVÅív5s·'}ar1UQs-Úò åY‰¨X±À\ÖÜÌX'¢T-;Žª‚û‰.”HóF®£DVÖ‘j+ýQTÈÓåÇ`a/JªÙTLg†Bk†ê’Á•BW114K„Bsê­^ %ÒŒ9ºØC Þ›dYÒÄj¤˜RÄ›Ì(e¯(W0c˜¥©ƒ S/ö…œÂº)RÇ1Î0_ªˆÞ¦ª^Ši†‘×moUeÒVõyVÞYšY//eªö´@Üã69ƒŠ­ijMfj±'úÞ´™.êû®˜ñú^#‘ÐöF¹ÅtÈ­y_·dUŠ YË¢Rl¢9é¦ N&¼ „€Óä'nV¸”n+O)ayĕџúÌ9nøóELsß®sªBDn¬ ¶¤°©mÑžwmþáà ‡À”äûÛí²õ(ˆZ‹3kÎÛÁæl’öòåPû¥]Sš7ÎÚt›Çl›geÛ?{¹¾"gZÜÛ®A±éfhž¢¯™¯9÷·—?Çú2U€YCæDF¡5^ãòùÛ¾ïóÒêþðw¾ÿþï¿ó½.o#²™öööù©ó›ß¸×R}} é7wXUÜòöáËãxyyêFµ!E øì'¾þë¿þ¿þ³úÃÿî¿ýÛÃwŸ½yzó©ßù—ßGɇ×uèßÿ?þdòOÿËÿêoƒÖð8ì¾¼¼ìûþþýû7Ïï*çƒ1áý7\͵l+ç1–¯ X¼•ûÓ%s­P+9ÊEw¼w=0ìö¼Ï9+¦@ܽXs†»ó¾Åf¦.µfñô‰îmÎXdÝ¥JdžõÓÓSŒ…ZŸQå+¯&YùàDA5NGÜI­•ÀÌ”¢¢Q'£‚YÅâår¹Æ¨Êíé’s(DLQ'0‹OÈ‹3%œs^¬%D©.F$™®B*™d¹î`Œª>õÇpDZ“¦žÃø8 µÞ\.^ ˆJƒ¹®¼U%2U¾â#¸²Þ¹š¹hE`ÕC½+jšc}:CŠhe,(Þô¼R 适ÀûÜÛd•¨7«ÑR„È&fÇq¬xÙu¥Z¿ìP-œSÅ.Bò8Ž{4V­Hõ4-›F•@#K›(º†t]Ø3†j¥" ¨bf%ºNîšKc+Xœÿ𤙒_]ˆûПþõ­¸9)&Kf*&Œiæ¦}ÎÄ2òýÙGU˜më¦í¼ÜKîKÔÌËð`m–G$3ˆœÎ†ö ݳ0Œ%œ^G{ ÌÍT–êhÍÉÓoP€;/³v GœFDl[[gä%¾æây|,éQ;ÈqæJeº{ÆÌ{äݧëþ|Ι3|alwî¬÷ΚGî¶ô <âÓZÜTĈ¥°~,Yë]=Þ°ª^¯Wwß÷ËœGfª.Î"DØ»/:y•¶ËT\ÖšˆÏ9«Jm‘ÎX3ä,‚×>ÆâYŠÌˆ¥U\Þà*öÞ¯×ëz&¶êªJ¦–DÓe_–ÇÕšK²ª(ȪQÔn"ns i&.U4U–¬fÇq3‘K¡Ü\µ"9Í Ñ#'™cÈÖ/·ÛëbuKîšxÝš°^cÎݶ9gÎÙÕÍh¦¹L ¢†u´D0–ƒF\@$Ë¥µ®â™Ác í—ª€"3Q«Ð`åÉI‚®:" °åœU7’Vºiw÷¬UƱ,ß#[kbzÌÑZ{z÷vÎy=ŽÿªZUÑ•Î7êÉ÷U.*æQ)k [HmË={¹Ì9­AÕæQÕZSäˆ*‘#Ù|kÖF U½]¯Çql—Kï§B–TÉ™sÛÓeƒ þßkËÿÿãÇÌ_ï8^® çËu™Œ`“¡ Z«}\K´ÒÓ÷ùþË—}ï{Ïû7çíæ)ßýÓoÇØ*õ¯üâÏë;¿wlú&P!é.9r tS Þêµ^^°¤r¹¯õþàÿîÿø¿ü×ÿýßúÎûïøÞÞ½}Š˜•íÃë|»ëÛËö;¿õ‡¿òïÿÚ7ö) Ñ%³8nÓ½===©jIFÆÖûº T¤+rް’f ‘ Eàc¥JäLsùú®Ìz$ ãŽßŠÈÇ·mÛzkóv!­™Êr®¹Å8a[@A[õ«TÌÝg]ïéh~^sŒTé‹§ Î2(ïú†“–.Þ$ÖÆÔ´-‰¿†DVÚ©!GÉÙ–9QõÞnãpUqMRÌ (Ö¹àîXPÅ#Y €Ý%“ U™Ë¡·ò$|mx‘¡:ÿ\1‰ãvëÛv’ß÷úc¡®aGÿ£u•½ud)‘ê&‚ë!´æh¦GìûàãÇår:¦,EoMÛûëh:Uñ¼í^^…У÷†³“(•×ëpõî—Ì„¦š«L5™sÞêFòéó§oÿÛ?ñÙ7>~|•µÁ¹5Óå‚6ѪŒ´ž|ÜGÿŠï·GîÒ…™Ø¼‚Î/òvÅÓËgöîåý¸ùÍ¿¶¿ÄËåòµ›½÷!hÜfü¶<®óã¼|Sv¿úË¿ô‡¿ûñµšè˜òrkuÔaF´#C/¦™I‰ÊvÓ/vãæ_ô‡ÚÏ|ýç~åßžýí×­Ÿ½Õñê't¾~·Ã.öVcš¨÷vŒ«i9 –"")8b^¶µ×#H*%&·í)ë8âÖ7¯º5QU/A*Ü=6k*ª°…hIáJQÀé&TÎ •ã˜CU¬JJEħ•ˆl àÔ )TVxO©Ë~É9Ídm¢ëÄ™"æ]DPUcRµ%S&T¨š¥V™X¢* QY¥ƒçÙPwYø%ÙÍj¤.ÐÔQg¦#à !%“€”7B*“&Ï,j%!5¸" Òvõ`erëoID` º Î4ÒÕC„µbḻPœmÛÙÌš¶ÕUDD6aº®dt@S¢µ®ªÇqôÞ!%J9Â+BÈmÛfFÜÄ¥µªjÖÖ ÍÐT„3‘ô¦*È çΩ{ë3GEJ–¡1‡vñ D_f)˜¨‡:¦Cs†ŠÎ„ˆ&šÛΨÍ<^fÓ$£K7ãH2‚\}Äî;ßi©—2VA@Jñì—ÑwVÕ´-¹% #D MÔ‹t•ÛÖÈê’uÌHÓ–5Õñ¿´·ªâ4†$KÄ€K‘#)<²šyf5èiÖëÈÌÜÌVÊ©i/#`Qœ$©âëPQ8c÷–¨ZY35“#j@E6mò£²fkîvÒ’4Ë´‘Ë]%nÛËœ&¦‚êy¤/á\3Ë£˜’Ö¦@U¡~›Ô,w¿7Gf¹iΙsBwˆ9[sªdMiá9²›€¥*³ÆÖ¶ÛéjÐüXY…ˆlÍ„É ®Ã‰¨EhÄ,AëÛVYDšÕQ "N¢Í›oš& ÖÒ SÅÛ| —{ÃRàtµdf­F’`±  ˆ™XD¼¡jÉM Ä1 *Í¢ À³¨fBÅÍ–E*¼1#Ü\ïV¿³«•î."­J ×9ÏŒˆõ¶ÒŽŸve-~¨RbŒœ+Œ8sšÈj@¨)¤ª0Sâ¸Å73· P6ÛJ;g¼°fúófÖ 7’}+ÈUP *´<w2ÚæU€T‹lî¡Qx›ÛœYÞ”šSšD5šAÔõÊ”n¡©œâl—¶q«š]*' Måùåýx·½9^¯O¾QúvË‚ÔàÑšA]IDffÓ¤£Qº!¬ÕB("^o,Æ!¦Š®r-Üü;ƥâ0 !²Þ¼y3ŽƒUóÎÖî&V°ÆåÉ2Bˆujª*ûegôKWEÍФ·S…Ç«ª¸ŠCx·•µcª×ãµmžãu·„"’êþÊ€èçþ•™éЂdqO^õ´1Ö´'™èæÅ[b$ŽæVœŒ€5( &”¨+ŠÂ/k|OåóÂö3?÷ùÏý…/þÉý€ªS§yÍ9’30yårÆk°(ÑmÆÇýíó}ëŸþB~#f>û~}ýø—ÿò/üʯþÛóûíÏŸß~ùÝïÿõ_û¿ñÓÏæ!f‹X)¼nBÂÌ…ts-VÖiZ«j­½ÜŽÌê½ ³2tN{óöù?î}¤/sÚ¢ízpu ‘¸]Í@§¥ëê‰X‹šwQ÷yLÑ%{–ªld+é+HÕW‘š% ˆÈ™[ÜX÷}¿˜Ö«kbVÎHѶGÛΜÁÌ.ú°´=hãõÏOQ÷:5ðî5Qµ9æ <ŽcÛ.™SõŒKÊ H¹Zrà¿2[ `n®ô ä¸Í•Á°ï»šÇQ` ƒ)"lvw­@Cϳ%xæÜ%xŸÂìÒ=g°RW‡PÀˆâÙˆüÓS) «çÔŠ«í/±²TMÄÕŒhj³•…SЪª"F-~Bô<®ÈB¤ïêSÕ6b(Y‘æt›=ât3?¹ §*bC«ª÷¾Ä"Q"¢U+¬37 Tš948LEQÛÖFeåx½{ïrà\ L"êÑÝ0?IËÊ52­µëõº~Þ{›sªhTœ•¼§”>˜ŽsTª²êLÐZbO‹©Œ9©hB© ¢!S&KiUË(\”U¶‹“1†šÊ'Ý×ç#ÂG‚@föÍcÖò—,òÑ2X…Ë$ȇ4„!w]ЂJ[YÔ&k›_Áe.0÷ÿXi’kâõ&û¶“¬,S&—å„ÅÈ%•ÓŒE)®w‹¥± é[;P™aª•©E3ˆÌ”‡ZâîÀP'Ë€êî1†ªªÊj…wcóââÝŒ}N–ˆh•P½Ýn ŠêfýaXQR+IbékOüR$IT=4(RUSÀ*­Šmþ¸A΢ö°6çÖ ² 3{÷îÝZ^Ç!"j:o Ü’9§iŠ÷h¬O'aÝsŸ(Ñú¯4WU]³HÞb*ÖâoQ¡"ÍÔE·knŒŠ)Ô dɤÖi.ZæWæÊº[o·[kÂˬâB8EÏ[ ÒZ«,"ygÞ[КÌT±›2‹Â•xœU!A“dMR-®¥—^d\cÖÝ¡}‡ª6—Ç45¿Í+œ ‚­Öãã(ó„…¿ª&‹0iº1`ÚªÂírÁ¨Öz fܶ½ÁtÎy¯Ú¶EÎ ®ÐËëñc¢%v‰q«,QeÞB¦ªâòyFw“Êd¦Aæ—?»„ Ô¼;^^ðwÿþÿõÅŸüäÏþ›?µ½}ÿÿêÏüé·¾—áZ=«¤]¢ddQwô”ü$dŠaÌ>?m’þ¿ûÿúñ×Þ==_úØv{}ÿK¿ô‹ˆïþ“×ùöo}þµÏ?“î?fÛ„E˜^_‡¸Å,wo‚ÊÑR‘î"`ÅëëkþLšZ Eb»0ëÕÌ26‘&@Üʼn\*TmªL@k¡a£‘F)pJI³B¥àÞ¢ Ìš»5U‹åƒ¯¯)¢ò8Žvgy{ïkaUÖôôôôòòf¹™*kë¦ %ÍD)`2TkÅsŒ™÷½á\òŒ°dfîû¾žÙÝGÞHRhÞ¤(E"!È2• ¢sÛ ºuîòòÕòd‚+.¥™á·Ċ+šœmÑÙ¶m™Q___û¶‰Èæ­æÅó–ãZ-¡¶SVG¹R5Ní•È=”,ÝUmÇÅ:²„’ª¸×[qoMiÞWêŠÈòÕCÔšêrZj5®ª©¤,›_‘¬”~òeÍl¼\"ZªÁð©2w’”¤bŠLv4ó³Ä\ØÔK—‡{p-‹)3íUµE*¡ *«&¬ ÊŒLðéyGTšª¢µ6瀤9A]fÈÖ¾™V%wÒ÷¸…k 3+f™[FºûúŒ¥m•2G•Üef¤R•¨r‘ËÓÓq¬~õ6ÀP+ÅŠÖ‰,i™•$·~™3SiuÞtÓ½å˜Í{3=”"Ô —eæ f¬2· KrÞ¤¸Zƒ€®ñ„gZ‚¥µ;ÉêdZf)ŽUEÍ™­m*2JϺíQÎ6ÕæbÌÁ¨‹ZåT[riå™HS‹;K£ª .ª2P"1ÃEwµ"Eeß¶q;Nîé €Ï5àKG¥ªqŒ¦«Ê,FdÞ•õk7Z¯ˆ,¿k±gœ‚o9WF?ÉîíüeD Uë¸MSu•=-(•@2©X3ó¹]>=´T•˜³â‘òØ/Zk‹ä]xÚª)ˆZULž§Ñ!ñèN2#L/™së2ÕVŠñ*£Oó¼Ý›OÝÁ{¿­ÖfM*Œ b‘™±º "*p¨jE‰\ø&B¨ªŒùµ¶ÕŒX./±™¢ˆ@´"Íœ%û¾%ZP–™LlÞY"šH1Ê\ Ñ1F÷¦DUBjÛ™s¬Ò¶¸ÆëÖš˜MT1YéíRH¢*B̸¨¢ÂNMGÌÕÄ’6¯*óÔ_ç0³cf»ÓÜ­µ~AUÍ#*Š!.}ߺòÖTBÌ R}ïÛÇ÷çËjŽ˜3Eqsï¢ -µLKÕ´õ‹ˆß"Žùç©?Èþü„ÖLJ`pTÛ7S¹Îâݦ[ïé‚cØÀ)w³€ûÈGÿ­/¿û Oøö¯ÿéçO_oû6çÍÞh¾ÿlçÓü¶ž¶¿Ž/›¿™Ç!±™þ:» éÇïßNù‰ý£ôôüÌÞï¿öïü§_þéßùöw¾ÿÅO~ÃæPkrf¢ƒ½[™aÝdFî¶\¡2Xð¦0]›S€J1hMF„Š÷³j^*×—®ÊÒÈhÚ7o®m0E(¢™yhÍXÏ·h¤•‚ÆhQÏALK3Ð<Ê,Üœ#Ç@©««·šOUxÞg&t˜ˆˆ¨¸Þn7wÏ™yÜžš«*©$osªjTˆH3s¿{`/’Í{Ö¡7ˆ0sãötù¢jšYÖ Hdu‘Þ·ùþ6£šæÎÝfªj0šyU%Bd’b÷~f,‘fg(Ì’I@ -¬ƒqžYÅn·CU·mëæ@ŠHåèm…úMU¿·šÐÔ¯º¯Ùjç ­ "ÜíÙ²(×l½AlBµ`+j>jåa»ŠÛŠßÎd5ÕÞ^çÁ&FY YìɺˆÜn7*šnP‰œ9'¤ºXI­â¸ÞÚÖƒ%n#ç¶m™©T1³›½N®H'e* –™”xɬ*­B•ÜýƒP:+øÔúJ‘Ò{S·s2sm™¹œ uµ·Ñ>眫ÏqÖZ"iÍUå„Rá¾ñÒbwÈ\YXæuÌwÏÏ$'çUgzÁМ€lsFóRµLöv‰¨ ˆ)¬i„%f™”É®¾âC&ku³PѧbQ¤¸©ëÌ pO{jû-&ÍsLÌR¢Ì]/½P¾w²D ·ÈD¥”‰mkc õ³v—Óuâ$9‡»³$3Å·(ª8nd"±úŠ<" º5ŬÛ*ª¢Ú»‘Õº kÇ뜽†þ:'u«ª‚·½]¯WC©ºÖf&œôJffnl˜ŠÄ2# U}‹¸ŠÔÖ<#§-ÜTºL Œ*öŸ>¶p[Û""£ ¤JD].—Ìù€ÐΑV4ÍÌWòÊ<†hYï"~Ü€1RÅ»Ëêo°ímÎi.™ƒ°eÙ]{ü€gBœÖÚj9$3[‘©2ë²ïUu±ð›å#»Ýn­µííåv»Ý(g¨¨ªl5‘@…·‚Q¥ZRWQipK‘™·¾Ë=»E é¾UƒdU´¦Ùw2fXßé}[Ê»ƒ“@•˜msÆÓv!Û (.æ^‡1IÞ0!¦ŠíéRbãc5Wß9çdÊb$ÈLФfXd‰Ó·+js,ëÓÅ;Ö|SYz¥3ɺ™ègú4™â2çT¥ªÅJ2s²Æm m<†°7þ„’ºÝæœáœU…®Óùöù)ç0  Á"õ®Rª%Gs±1:ó6å6)æZŒ¾ïUñaÞ>Gß|pÇÕÁ®FÏ1†Ñ¬±DsÕ}W341©ÌVñçXlOûx}á—`uhAÌ­óyŸÞ·wÏ‚Gå<½mÍÉ­ïo?ÛŸõÉn¥S-üGÿòú¬_ÿÞ÷¾=Û¬ã!ÇWm”g›ó6P UßEñyß~ÿþÖÏþäôÆ/W3.ü¶ÙßþoþÖ?ÿÖwZkɤ÷¾–¤U‡Ÿu±H1W§39øE¦êÒŠ¯¦ipS  fsŽâ,Y-DM÷¾1("cŒÁ\½9ÖpÁZΪ긗fŠÙMÅ $WûÙ3©sF9%¯G Ö».]ü}U̯ÎOdÞ×Ü…«»iêYĽ‘©™-»pò"Úû>ÆX²Ký¤1)¯¯Í<Æ©s¬ŠfTeŠÚõ¸‰ÈþtQ± Þƒ—|@²¦ÞÃWUά:²PDaåš ñIㆯ@B‘ãÿ¡íÝzmY®ó°o\ªºç\{ïsxÈCŠ¢…„,0rƒJÀ~1òd8y‹ÿÿHü ’‡¶8À°-ÊV"H¢-#¦$’G¼ì³×š³»j\ò0ºçÞ¤dÊ’~9k­½N¯žÝß1e IDATÕU£¾ñ]ö[Æã6þìñhµ7œø¸™¸\:òÒ]¤Hùá>‰ˆû¾C53·mËbœàþ Ÿ¦´¶d¢8 ¾à÷j ù «¾Þ÷ý ‹–`"FœÙ‘q¤™×ÃRÕ„Ï9›jæ{¶q¿Nþ¸?u4ä)Bû¾g–[¶Ö"·hÛn÷mÛ.—ËŒ#l“N jÏ}‹U3ÈÌ´‘ˆp¹Ÿ“íå¥}Ì‘öÀ?cÖm)1€¤£+÷x1ëçA±ï»vI[Q£&üS5AffP­5â|ÿ4¦²ÏÁŒta©¨{Dľï¦Ñ>ƪö6¼P®Y¢µqŠç¯ÆMk-òˆÞíÇT)AÎßµ:¹Ã-¢ÌFýô «Ë¨ÑxÜ=7bÖ“G?ÎðÞÇÙÊoÀ¼mfG€7ÍÌÝfr‘* µ OpÍ-Ry{ÂsŸœY–+~œÌc<=]÷}Çs‚ dj d„ªTØ%õÒÙfÓ²v»²œwè%8"Z["‚@sDTiXûnîŒX´ô#Î̺4Û' #Á™ ,‰L†g{zíÀ$`§±/ƒ"éˆÂœbÎëú4ü^îqIá– jMHÁÌHN¢9÷tp*E¾€4%ÁŒ1Ɔxï̶ïcÎÉå)ׄ™)Ò2„˜% ´. ìccF×Vû¨qßž®×.z¿ß/ËåC¨é¦Ý,[F„ù̦¤Lü^úsübõÇÓ*<oÞÜ÷¡uPwØ 8®o2)S xÂ-²MM·a6¾ò¥ÿæßþÆ_ûk_“ÈÏb–ëwþí¼ý¿Þ^䣾^n·w6æd×nÌ=çlbðûTáÎ1r“+ç;ßù¯ë7×—n™DέYäóÛÏÖ'’3ì3ö¹_Û@å j-W™‚œ鯙LœH–Æ‘\I†Hsù4²`áµ5_.™yø•‰ä².ÉYé²ÄAäàûaY.é¤PEfP/7‹B„*1ÁƒnMÈ2áœIé8œø2SE »ŽÓ4©&—c¯aæþñ¢ª¦ò)ŠÚ´ˆTÓtVQ2=b@¹‘ç !≠'Âõi©NSxd6  Ú…³¹Õ¤£ªÛ¶Q×V,ú‘R²ø¤Ç3y_Þcªÿ¡á÷Øì¦aÕØbfOGF…ÍÖƒ´ð¥]2•i)¹¯]Ú>æmî,Ü´5pŒY²Ø<ͤËAuî;y‘Š$`™‡%}D)ꪘG Ñ&™ÉÄÑj³È0 ‚¹µdâ &""ÊDDLP€=-y|ÒªuªQ‚ÒŠ»3q¡Á…¯ç©[y+~bäÏÜ̪?êëûýþ ÑX^¯Åcߦ´†€§3B¬ÄIÀáÄð°Zw· @D5J%À½T‰²Ô#2wíÇ6ú¾o”ï]hï÷»,}]WÄáWïQ–ÌŠ9"™+QýÜKˆP}êö^Ÿ‰‡ðû¬ Eáe ¦#ÜÀûÑûI€ÓÞkþž ÓùXGmÛë'q‹“Y¾ƒÖZ?¸5ªÐD£||tBçœ}ùÙRÛ¬bc' 1 ±[zUóqê_ê1Õƒ¨3‹È¾ï"ïU<ßüðRçœëº6’°‚å{Ux€·þþbt íË£„²‚m­xñõíãÅ,!1G„Í=3}ŒŠ•àû”’ðPv–š7v709¥ÛRaÉ$f±ÌLm­ÒúÂç f(;Å{ÖZ}QÚcU¡µ†"Š)sf¨ ùôˆæ1' ¯M眬°íÎÚÀÇg?x6 "¥ÜíÒ·EŽ}/1»M²í¾IPcÉ"—yÈE]"(‚V°ðÃ:!Mb³@¶çwûÒä‘Ô½ˆBÛ29/ÏCc°Dšwå‘™Œ³K¿PéÛI¤áôÑzz2³4Ïݪ0)_öçÞ;Dn·Ï#m]w¿4¹ßö&Ú—uì{š3sÍB|ÅÖ½ê%'ˆ¢;•¼ààë¿úøÅê¯~úÉ÷æ|ûòÌh+àAj›Œ×6öMˆÃ¹"nóe3"½ùÎ}ö÷þÞ׿òå¯E¿¿ùºÚäoý毶ÿU¿ýÏ~øîÏÿ´E÷d\:‡ä>úe{º\÷Ͷ~ÑûdúÁ|÷÷ÿͯþ‹ùwÿ“ÿ.|€S÷üˆD†Ý…;dm¢R ˆelcç %1_…ƒðbÃÓV%Žˆ;œ¹eÄ1I¥‹23g^ûbfÖñðˆlRaж´~7Ã9½× yîï˜2‰YcX£…"JéM„<©RíÇ€²ˆŒ9/ÒÂÂïS½w¨¼Û‡…±öF]òIáÁµuþà%|¼‹wy3èЍjº‡‡ªÂ&ÈÈ4(33±… ×Ó©Eš™›SÕȬZ¤áÅ&ã“ÐZ!•Æt8ÙÇl,Yæ™ለív[×µømU®•çú£>~:ÁGœ½ÙTU]»™]¹—×E%$ B™I LÌp]Ú}4¹\MÏiœèÓ ŒKgM²ˆ´@牘™êuëÊveŒÑ{g®DÜãÊ33aQ !š÷UmÊÞ•fØ~ßÖeÙ·—×ë2wãvíuo#Ã]šy8[Ü„ÓÌÆ ªÖ\&3[zÏáŠÚ/fFÞ4ÈbÕ–ûìDMÄ»ÍÈl­¹9‹4.w81‡[c§µ?q¦‡ÙL·¾(Qò M‚“%Q8EÎ]—'ËÌN9“Ø}»·¾VbzÅ1FD4–@P “ siêJB:|6²¶h:Ù…^Þ>_—«GlÏ/ºôš郲£ªÞ̼iቑ~ m¬ò—Œ£ŸwübõÇþ<¾úé¯Ä ÿøÇ?€o¼HРÙ"G`Y]¡9Ýoé#È«»±¿tV[’pKaê—õÍ·¾õ­ï~ÿ_ý`\?{ÞОT&ÝŸßôWq§Ôñ ,¦Wn·}¾¾~ó/ÿà÷ÿ«ü?}öâÊ©«Q£ô–F°Ð¶ÃÙ_]Óñ´\Æ7.Ü ÿB¹L bX %ý‡–F÷}‡qúî.Ò†ÞV~Zg@7g#fV ‚ƒ<Á¬1*w‰ƒ†¸§Ov¦ÁX'ùl`óp$+ôÖ˜#…ÙlCª:)3œ! ÄäL bÇB1{“îæÌж4»C]ï›MÛ݈-À—|ÏUQxlÄZâO$WBžp›¤¥›‡JÓò)ÓID£ì@,"¢ëÒUî÷{&uí¡H°D±–“7€$ M:…Äp"¡Pv4Q"Ò,4'ÀEEH@¢t`¶÷(L…笜hìÜ›'ˆ×Œ$JM\¢a‡!›‰XF#qq•^šÃÚ©i.ˆ$+¼€žm Á(£± ”³jW÷ƒLDlf‚*÷~à^½GÎI1¦©ª…\k:Ìl"°13ÔØ@± Ñ0‡D 1S¦ ÁÐ%ÒÑÀä7%º‡3qÒœ œÈml—Ëå¶Ý›v€#‚2Wm1Çô„,«#¨©‘ó"‰Â#9HAi‘F¾«,, p2ÏðìmxtMò“Ü(µYÊ4„9”3‰B)áž×§ë°È×O¯ö}ws&ÊáT'àJ÷()Ä€ê¥s†›:e&˜RuŸLÙÊÃvT‹G˜*ˆ‡üªŠ­õOú52““@p‡;RP?‹Xeãdbf¢Ä½Dà‰Ì<ÔF\)é)énbYº&("– 3K*[XR¦‡f‹²þ%LߨS"˜ý³éD‚­–9“!œÌ”¦*{€Y¸ vÑLfê ʰ¥»Ïd¾É‚®aÒÈÒ”zfÑ¢gxZj^DËóhÚÜ›Ñ%ƒ#Ó™S‘»rË$·îÄl n—5†dTq΄uÕô(+ˆ"Í]V6³0^ø’N@HÒXD/b\òKn,B$¾OMê¢û>:GB^r'Åô•U‰ï9aAr&]K‚æHŠEÉãîñäanr†/¦†öÀ$ƒŠYAL)Ìnô¶n™Ù5î!¥­sέó¹/¼ìn1ƒ¨¹g¤JZËDˆö4”]HF(’i÷Û½·&¬†‘”3L˜œÓÒXÄ…„Lás*q€·13S‰K+pKÁ¹9|¤6Û‘Þ¼ônûðá—eµkù›©íÆ9Ð.Å4Ju³mÌõz!¦-†@’híÍ ÎŒG"GfLP„ Ï̦ƒI¨5i ²aéO]‰9°¨”`)Òu%XøjQCÿÿÕ?zûüõ_ùøÓ_þò?û>HS8-)­«˜Gqâ>èc3ÈAeyå’®6ÄmYW=õõ–—¯~ó7~ùßÿÙg÷ý³ýÃõÕDZmØž÷iÜ/Ü–Wf¦Lš@oþôñ«ïÿð‡ÿú÷ÿàoù·$unƒED8k“ñÑë×6¦U``Ù  ‹ìd” Ñòyr‚€¶ÛM/—9g&­ºÌ1;¯t6© )™Dº™ Ž-¾gÒZ 0 lšî=‰3K³«$c|ð1‰ÊÃå°6}DDááÉœÄNÉ`aQm™ «¸0³E´z…z$²Ëc•}³`ç¥)WНd†é©©‰ˆOÌ÷¶›˜;ƒl9D‰™ÂƒA‘I !V¦ÀÅU»Û(~YZŠQõRlLzïÑdÃÈÏI0™   Fg$ÌDù²Bæe=mV¨Õ*ÇY†`»JF” ¦`‰õrÙçV>Û~/­ÇA‘a†œªÔDYèèI˜¨Ó>È4vö°j†-x¬pf³ÓœYU‰9“p˜“2ÀåÕYðFm•jÊüÞûÿq<äÇçÊL ï‚L²ŒJW1Dv'Ø.ÜŒƒÁ‡³a]")"3"±û®ªÜ[uªo¼Ÿ&- ÷ Ã9á`!w#F#. t_tÛ¶ I&ó™f±0Q˜sRòÔšû4®˜¤ÓhŽ>ˆ~ +¿MF "“é1ƒ€ˆàÀ6g­·àC/»ê<ðclUJUƒÙ#*óSD(¿ðŽàHëñ`NW¶•§_è/ùßBŒ‡î@z/îR½éȬ æ°sHš6”ö*O׬ˆ i=³§DÌÓèúCž 3×îi" d˜ßÌ!J"‚`fÞ·‘”óÑÁ)˜£1›;å%ÏåCSlS7wW$4©Cµïå(Cµ'ˆÝ&‚ÀÜ•#‚[½`feF€)Pfqé«O'•tÜæFºw–&:‰ˆ‰Ð¨‰&ÌæîòÈCÑMŠê¥$Å#XêÑóò³§ö€sê•é­[½EacèÊ"9çŒôcŽæ T¨ d…ëôšÙÎþ3Û´¦ä [,dŠHz†‡EVËØ(ÛÙÔb‘ƒ`‘™ŽDfñK‚åxÖÕk³q÷q°Ü=ìÅb2c"TYÊ`˜Í¦js{u¹šÙÒezC©rΉHw—‹ì68ÁÌÑÚ ‹âԃɣz¸aÉ*Ûó&¢5Vâî_œÜ~þñ‹ÕÏ›ÿÙ>{óúº|aÙßÝs¤·6…‡2tfU°ƒ›³ý£ú»_ùæ¯]Z#ô–’·Æíoý¿þüƒÛŸ~á«÷x6~£¯ð²½,°~¹Næè].Žy£¹åölñ¿ýö¿ø›¿ù›½Û¥]‚ÄÉ]’ð¼Ý)Ѹ)se ’ÓT$Ò¤ž^Á*BAT–­wfµÝšˆM@žA!ªŠ–àzðÌ…p&å mzf‘KSÈqD‘0Ó}¿3³¨¥ˆ³s"Ü……¸ré±]"Ý!`V¯ÚÅJÖš µ4'bjR‰ Y»³þÐÒ)dt½„—~•˜X˜Ð©’ÔÐXI@Y"Ä©¢¬‡[Ð &H–j ØwçžBìîå4PåTjϘcO¤0uÓ§t™™¡kcD©"#ó°ÿJw£ãͱÈ$ÊDxxx—¥Ò"Ü<2S¸‰T ‡i7-횯›f$S™þfA/c й­ë%"Ú²>èx`IJwÇ#)&òÑ>î‘ñèsáÃÌúr¸䈣8‹iGoT8ãHYxt—*  ÕñS,t ‰«¶8–1X‚"13 L¢ŒäSY 8THìf@&%É„eK"b.—ËÌØmf¢sù°TªAj4‡‡'EJšON¨Hc±1™93x!cLwm¬É Ì2gÍdEF¸ä¢ $†ù"ZKÔœvh‹Ï>qožéZ±Ê ´ú/ Ê’™¸®—cµS¥î[­y5/×x¾¬—¢"ª!ø«ðÒ”…‹Pi<„Gž@­[‹hE ¨êÈ‘`3‚4Vb­Ð@lsT³†Ë{æŒQ=§‹)|„ï6Ëê~¿_é(5ŠNQíEñ ¤g.—5™Â,™§…³0WJp€‰S’AÕà<üN¦[('ùkW£¨•ƒÔ—Ê.Ȉ‘ˆd»{-±xÌ4ûÒ()‹˜IPUV óÂS%ûœSîþêÕ« 2‹H‘UÛÜ-Ü«/󕤲N®;Ÿ9¬©ŽmÈ͘•×n¾õÖ(rŒ‘ÂÌBÂæf&ròI”+uªL `„9sñˆ€¶3ÑWU } ˜ÌPì³}»Êœ“0lcYDQ©7ÂÉ·±ÃCUÛeû& –„cj¢’""CåÇÚæ ì/w%Aa€Ìméq·Y¶lÊB‘xŸ=”á.ÜZkÉÓl0/6½¨uÍáî×¾DDxP"‹€ÉL sàÒº{Ðá«ÒóË[UÝ÷$æ1MXˆ™DZÜ™s¼êR4ÏûK_W@îswŸãÕåZ»» øäéµ™ßç˜1ÛÓ“Ñ1óýÇ¿ ÿ‡‹Ï6¿ðK_üžO¢ùË·/û]sà:µ±ù@ú ¶!7¢ Šˆ›ÉëÿûÏ¿ÿÏÿðÿÖWþ‹…sá¾¼úøËñ&¾ò«ôúß½»þø~ÑOîò z—ui¼ÛnÐe½§ƒ—žížw|rý>ùìïËç}<÷vE BÚÎD`Þ8ÃR@6æÒ–ˆ|w¿-oVÓÍ{…jöÅ}rÚ¥iPš9B¤_¦XbFdz0Œa#‰¹ÑÝn(TaäâÌË% Ó­·n‘É,˜C¨ÈÛ¡ª`žfëµ»{¤ ³jg^#"f 2ÝÓ½Œ1ÌFkÔ…çnJ ÄØ©ýz‡Œ¹«_W3«öç~Ûjöl] ñH˜³Ûƒ·y#+«Lw=vK6f˜?-«e)„‚(m~§Z×Nw¬ÚvÏ9¾0áìTÌG&b RrtÙ)$PO6™9$Áá N#ÛæÎ•mÃ’ˆ¨éR´–éáé>CD LlÉ"I•”ÞöÍn{¼~âqF‚µÖÉ͇Å‘ÆB‰4W‘”¥¥³¼²²§­Ü”˜T“ÈŠ*¹(ûœD´.ÝÂÙºT»Ê2z‘nfÌÍä@JÆAô´,c ŸQå„ïîY&•ÎDÎ̔ޙÓ3B˜£Vé-‰´ðHPR.,8ÝÌ Ü{ßöÙ–>l®ëêcòå´o?ÌäÁŒq„¬ÑŒ™™kS%&ƒ—¹Du*¢ìþ1ŸBI93TÚ4ã® ªt'²”™ žÁ~PšÙ©&»ƒˆp†­dªG—1Û¹d†r1¥Æ}cR ‡‘°!Ý'3Â={j=ܲÝàÞÜ][³1[®c9|ÙžX² naC¦"Â-’’›‘I,K”%Wz&÷&sï#\Ä› ‰`ÎcG‰®‰´/1á8h7¯^_Jj”é a³YqÖsŽÖ6F×~¹¬µÁ%æ3=zk‚fhmàsR¦Û`æ…™»Ï¥-fî3(àD)³Ì +ÓÖuͱe:"‰AD&Æ^F,‘±Ü39áì/{å ºéîrÏ W`¬Ï@f‘´vlkjFHÓaHé $¡AIå@A-ŽÉ®Ê—U•1çÌàL ïNÊ$SŽžM³5#eawßæýe 5-cž±„rHB)Žôá"b Œ±÷u %„Y#Q$…C…„çÌ1ƺ®¢jfYwZ±­3mª¶É:Íšˆ ݦ !]gh¿:S(ñ´4§iîJKìQbPçÉݺ»óLÞ£sg&RzÞnN™ªÃF ^Y}[Ó&""³¦"¥‚›#}sP2§®áèOO#|¹¬1Ìïû JG8…0MwCY8„=×eÙlÞ}ÎÆK(y@Ë:ËÜÜ“(U/mÊ.‰%6rÒû ÓáO¯?Έ—Ÿ|~i _ŸÂr¦šü¹í˲Ðr]Jñ—Öõ?¨øÿ þH·ýžmÑËõõ›WÛËÛgøä–˜éÓÚÚuÑÆ9®æ÷¨îE&˜DƸÿä{¿÷íþßþ7ÿi×Õ‰×Wm·ûÊëoüú7ÿéoÿžtÆëðg7íË¥].*Æñ²x¨Sqƒe—éËúGô‡¿õ_þX;cŽÁºž@‚AA–i6›òC@Eã’ç™`æ9ƒT‚8¢pïpºjB#ÌÈÃ6´µvÛ·§ëåÝóËåòŠ(â„@L(=biKM(ÞZ‹S,wÜÀÌšŒ4n5C[+ÒR À¼˜CY4‚%Ñ,¦dæv»‹»{kg2\a‘LªÊ Dº¹E'3W¸IÂÍLñ^¾!" bfå##OK4¢òu VÙçð fÑÞ ÎS‰W­sŸÆÂ¥þ@P)dïý‚íŒ#Í\–ÅÌë^Æ ’"gg€ˆg‚ÈÍšXZÓ¸ÙN¤Ë*&‡wû!ÿ33>ÿzA÷îž JEéë"ðHw0Y¬½CËjf9´6vIUcc ]zñÃ놔 %ü¤1f2 ádàÖ¥P!dsÎú+`‚¨e†G Â<=š™*JF”îÓáÎW¾o\¼7ˆ¬µ»g:æ¡z ¤Ì4çѹ0³ÓNôtèâÃyÓ=(Ù2ÌnÈÂÌ Ç{ÃÃZŒ¹rˆZÍãTï\©{Gß©z48¹ÉÕά ! ÆŸ¡-«¶ê—ɺ» ¦^:|`‚ˆ1F5@yr™Š³‹Š×v·ûý@éj¨§›¹G¢TH™ˆ8ž¯ÏÈôt(ó¾ïBªÜ¤7¦ü{t.·ëqÖDºYåm/7é-À’ëQgXDŽaN ë‡W–Ì õü oÔ»jk·ñáó-Æ4Ó…<=£wµ¹ïæ—ÖJD’énÌ‚8ÚdLL‘ J"D‚’NŽÚc¯""s¯qÎðdÈӦƫGDÂLΓ„ÃÂû¾¿W;oœ…a¦ÁXNZš×ƒDµ¤¹lö:¦i}á Ÿowd–xž‰Øæx꫈”žlf™é›O!ün~m*h­Y¸¨¦Gï}lû»û­æön"VaÅoeæŽ@îÓÆŽÞ6Š.:§EB¡·{ztÕCq¨ûл“0ÂÃü˜À•%<ð‹¿Xýq]²--7ïëë¯}ùkÿîÝâIwzfL»í!O×7í|¾ÿ^þ»Ç»c<µçoÿïÿÇ?ø‰§¶¯ýÊ/ýÿýßùú¯|2no¿þË_üµoüÒw¿û¬ªÏ›í´nqgÒ)Ì„.±eR öÐßýW¿óßøêeùh¼ýÁ›?}¾=óúêh 'ÚÌ.–žÄÃÜ‘,òÀœ‰º/Ë$®x'jÌ4Ç<«eéª È«õõþ2®tÁŽ ÞUÄF“£[LDM•Ü}úA9.zÚ±-žtÊMKµ•'¡^Y3“¦®rñêÃÌÉ@Ä\ œÀ8ÝH$"˜ž2‚)çÜEäîs‘W,LŒé4È%ªŸàGÁ+À¤þõÑu÷iÇèa§ˆ¤¢v·‰ä®†ìÚ* gr̕ӛ,Œm”=ÎfAi=޹5޾ NêC}±’ Ypœ`8ÉæÄÙšA”H#d†«j¹Çî™Ì¤BQfS˜{Q #¢$™É@4–¶ô9'˜‚i÷¤²i2ãDcæ°QºEˆÈQÐM΀Ý÷Úw>ßo™Yœ†Z]̬báGe¶hSU㟠/­#N…dõ¢°ÊŒÃ­$ –®jq'®ÄH3 IDATæLÊ&l6XØÏ—ìCVDºQ¤‡2á`¦ÄœÓ‘ÚÛ±¶EfÄÃÖâý˜9¤ 5¡sVÇtQe»•éK&訓T ©šÄW#3[Hf¡É2ÍÄAÑ0€UÉ%ß+³,' )"È“‰ë…­±">}&´üÇaB.ˆì„´ˆK»^¯™nftæÛ ª.ÌZ’ˆJ¸s[Ò ¼Þ7ffR¢#¬˜ø°÷È4htÊš–e)Ã@:E³ËrYýÌ‚\ðƒ2Rï öÄòÁ’Ï €\¤geNÔJ{Å’ OX銊#bf’ba5«!g½÷£üuÂL"ËóÜ÷üSSfÅÚPNã™Ta]¤IO¾^|Î,a3‘ˆ8\3-#6C•V +‹½¢­K„tç ­uZlL³! Ñ÷y¿5®TuH’fÎw·¾6ºöÝg·iqí+3û´$¨FWñ}ˆP–Þpš. Àý~¯yØÌƶwQ€¼ÉˆHFyô¸o¢‹‡3 2ÄÃú«ëý6ÖõÓ\÷÷ÔÄЖîê­·aΙÕS®:ÆÌ1í."¤¢¯Ö·/Ïž¹´VÞÃ|ŽèÚÜÒA!„±3s#VÖí¾µÖà?5³ý•Ç/V|ôúõ¶ÛfþýïöëßüÕ/}òÅ·?úþ“Õ!ÎJ1GÞŸ·e]6ÝÎ6BvRZÜ.¯^úÙ÷ßû½ûÉ߈ß{×o~ãëoüï€|~ùq å.#Þ!,i2SaK¾1Ú'ä“/~éÝ»wüÇüÕ/ÿgMR(×¥K—§¢9=,ÌÚ 6܆Í~i1æœsm­½|~{}ýä>÷¤Ú™’*3ŽMMm–óôž"¢·oß­}i¤{5ç)ÝRI‰ÀL/÷{ë’$§Òå#-œk¢9­š€è &Âð Hf$¨ôªR–垇“"²ø`Ä´ßG"Öµ‹‘3S$ÌÌ‘J0¨K¥œW¬Œ‘6m¬~? —Ž‘Á Á{„g´wJÊ™€ÅÌû¾{FžÀ£X!"Q"Ü›H̼͑Í'ë°–s ¼QªÄÙéØåÓ¥eÒ¾ïÈ#ØS²u&b‚û>ç‘ÖÀì§["Œ82’øô†:W÷ȨóÔÍ/!Ùu½xƶmîå9}š)ë²,Lbf|^äœQ°µ6lú7µ™¨÷^þÄ»ëj‡­ë:Ë!¨`ÌE2ç•§U-!túš_¯×y¦±H€ƒÒ£ØK‚EÙ¶Ešˆ²²{…ƒ…u±ýP¢¬0«ZáZ]tÏ8WÍhZƒó`Õ ât×>îÒ#—¶²Ä˜/BšÌZzáú£üd?ª%û(±Þ×á&ÌÀx?xDãØW=„2&©Ø¦‡ÕÕ>«ÈÉ,!Fž¾õì âæÉ·w·8²jݽ`üÂ?èô`€>ÅhäÃ3òz½ŽðîŒëe!¢9gk‡¡uœ›bœÎ¤yJR«Ô¦“ähgàð¶m½÷¢1õÞw³ôèÚž^½šsîÛàr¹c”ôú&´ÎfãÄ?Êex0nú™ÁŒÞÛaéQ9ÓÌ-2X»0³´ˆypò2«G<ÇU"!áËåZW[òìºok¿Ô=¬­|OÛ¾Ï9i¡V®?c±j›Ó,¢64bê$ŒØ¶Í jz˜¹$A¨IÄö9§{#^*ºüëøLfQÄlu÷I]Â¥„Ê6C…l72#6fï‹àä¶m"ReâQß‹ñ¢Ü•͘T¥±ô¦ÕNʰp¸ƒëº"°ïûõ²(W `É1#•YÍv3S–CEOT3Ɔ<Ƙ·í¾>]m+¾|ªj˜×ÊÓ×E“Æó­ø=H¼º®î®L·ç»^ƒ£QŽZ»ê©fd.Ëòüùs_4áî¾\µ“ŠeªêG}TÝUwÿÜ6fýXš€ܸ½Ýö!ÙYW]$0Ƹßïº.àÃþ'…DÔ<˜„°×c²9 P‘¥ÿ%Ö ?ç/}éKü•¿óêÍåóïüÏÿïÿ?ÿ·ÿ—oÿŸËÒŸüNœ¿ðôôú"6ïï¶n£!/drY[[gö1ÞFÄŒB"”HÀ5)´ÛºÚëWl¾õ«Ÿ¾ZìÝmòüé¾÷½Ÿ|öîe¼zz­ôì ZH.+Úú®ùJyEDÜ"À¶|ë×ÿóçe6UŸãõ²ºÛ'–™µ”bŽdGöÖUeÂ'¦t™æbm¥¾P‡“²tÕÒcd‹GJ[ì>;k‚R8ÄDáWífS˜DEš€2ÌÂ,FáŠpˆ0 “$ˆBÒµ°sâ ’÷˜¬Ä #p’(Sã’h ®J‹V¾¥RYIŒ[©´ˆˆ j·ADÌOÏj£˜kÂ<ܰhJ•'; ¢Q cH&Ì–²-»r2´µ}L$˜”D7µñ£-ͨdëBŒÌ™æî™$Ì¢Ó=VI©²‘"!,"ÒTC,sŠ$M¡lE,IÊDz"¸e(Q³ ÊL*«Ëi¦­áàØ#Sh³á$B•øÉ ]Z˜•F*)¤)j’FӢњ0elªéF ,ÜÈ(Ü”N‘ž:E"²·v¬ÀÂEˆ3b¹^æáå"±ÈÍÈrÉ2 ·,"9f0—tncF—¾JWHš¶¬Ìfef€4–4¯š²FWÓÄgéeQauê^ÑÍ‚d$Ǿßz—p):g2R– !‘ `E–5€yi-®ÇÊÁ*ŽsIƒÈbn¶C£Èš"©”¥OH/½L ÄÂ’„‘¾,â1Áy¹,DɦdÐI˜Ô ‰=†Ò’H(hU¡Þ”tñ£Èi,™,,¥GŠ "ˆ‰¹ô)¤M=Hõ¤$ArmIY¤S’O’˜Î` \™N™>§2-M‰2® Æ@6¸»ESrÚt7·E¿Už¬‹gvBX(·¥]ÒhÜ=I³5-3EÕuìNɜܥ )‘€±´!DP$…Ph ÍÊ¿í-‘`xÌ™!D… „ šîÆLY»‚ZK¯ŽD‚ßÝRÌžNœ]YË!‘ÌÁbB–Ë–ËLwš“v…(g.½O7Va;,o`a´ | 7F—Ž &îáœ.•šG&«ôkWK“…wÄd¤°öf1Î*¦íÄ! "9SRM±À4»»cRôËEw§HeÒr,e¢(àÂ=,`†9úªÂ¨’(¨%!hZ:1‘R 9g¨ÌÆf¦ îè,(Â~’ïCU-\®ëÝGï+Ctm+¥%Ay "“E@$y §E#Aä>æŽ í™âIØ»°„M¬Çp÷‡ìÖÏ–-Ù,±eV70óðÚÂéHëîžAý½ô¤èS³÷5\æzu[›YË>'«D¹ÀR*ÊrXtÆŒ„G"~ª!ŧ\¹<Üòä!™?C<2o™ à<Ïi'å"OÁï¾ï¥£•e}ó3‘‘­ñYæúŸ\‡øÀ>øgŽ£]ìsQ•¶qúèIuªñV·ú ³?H*™yíKië,LEÁÂ{EÎÑ£JçÓ €ªŠę̀ ÅÃ]êaõåÑŠ2"¨@)fÒi©K@EŠ•õp-#"PÔì´,˸ð\Ú:m§€pÕðTwoúP•G†ÕÛT 󈢳´®ííÛ·½÷Ëå2ÆJLr†ûa$Èû¶éé`V'c’A‘5þêãH½¿‘¹í»öÃQ!­5sO$1EÄ»wïÖSpELí†eY’!™U?±TÎè·¾ð}@Lkëís¦ê°q„õ6¹ûº®ræÞmË8¢­#ÊCÚ‰RE›4ŸÓÃ##Æà¦ÂŽŒ@ÓÌ€g* <$é~¿‡9%^÷uÎÉZ»Âr88g\Hæûý~¹\êéT«…à f®A—•¶ –dˆŽyí4 æÆÌ˲`Ñ1†áÈigŸföÙZ'Ûb½4»ÿsè¯<~±úã“ëSú&OX>½îÏ··/ñ…7_ÿâ/ÿÙ¿ÿvn;ÐrÂÆó»ž«ˆó‡í ÑxýÅëÓWôÝ~›nÀ¾ÛóóíwþÙ·¿úÅßÒ¯\sÕÍ(xeˆû‘ž°,KøîÖ¬äîî³­MO‚w5þŠß ÂY¶µµvÖXww\ÈÒ)’à]‘ˆ´Œ0#Æ ÈÎK£NE­µØs»ßŸ^]£²­ÎRgwü.ÖHbæéVb„*8¸Ñ´O {" éž0Š‘SAÔUt6&šYEXq@™9r%& Ó˜ccCU)ÂÌ„˜äÂD„HÇûÕ:7›ûÿKÛ»õZ²eéA߸̈Xkgæ9uêrNUõE‰ë Ù’Á$@XÂüEãù<ñb,Ü-Úˆ–鯮®rwu]ºÎ%3÷^sŽ1>f¬•Ùmú<8ŽRyv®½"b^ÆüÆw ieœÚ÷¨:9z,!9“{§WÒ£™%w#)˜RÀê1Ðtz ˜û\¨•l“I FR! Ô”3jä$ð©dÖ²nf–1üÎpѺ³+æf˶â£Î‚ˆÇqÁɉJI¦@dˆª-&&Uwƒ‡Úg,æ£@jhŸ¶Ð(ih*&"cúRÈÝ'»ªö ’ͼQWõæ^Ußè> {‘,‰23¬ˆ(™‚ÛI˜–ÍL‹”"¹®ë1ú£À’»á:ëlñÌÑ5]·{?Z;ÑÑ9„æPl'ˆCÍ2óÒ–#†icF¡Ú²,cvÜ7׬4³1³f FšIjfU…*JXd‚*iBQš=bÖ‰‡¸ñî×ù(ú#âÜ›ÕYz¯¥äQŒqJ ñÅ Ù{gb'ôžPU)`æ%ZU‡`U(ÊfÝ àÿgûQÒ‰H™š{fb²qU…˜iïzçŸÎ‡lͧܘÁRYÙqƒÂ—&¦%ȬåC„¨GIJx凜#ÖÌú˜!p1›¤y7Ñz¬-UUYu±&Êœ© r„“z `Œ‘™~Q…²ï»«ƒŒˆ­µQ!Y­f¶š—.À‡…k¾;k|Ì©Ìô¦Y…ÊØ×—«ˆÄ~‰"VM` )PU¯×ëôþé½OA²™I õôV‹5d›Vwdæò><É>:TÌlÛ¶ö ¯È½7;h¦lî}°ªlV[Y¯¶K òr;Z[š¨ËIŽ™çŠº÷áæ×X–eÒ/Î&»ŠNÍkæL‚251p–Å™ ®—ucä앓̪2)ÕˆXÌs¤BdäÕÚWûó²,Í|ÆøÕý—’â,2&I”3Œð j™#ǘZŒ•¸nk!2iñœms#&gå†E®Ë2©ßÏï_–e)pŒ!ê‰ÒÕ­ÇñÜd1‡7ì}/~  ýu®oW|÷Gßýå7¿Î‘Îïß^Þ uwŸµW_/yòêõȱ¨‰^¹°?©"®ÆˆnÉû²¾?ð%±½M}wÙ<±þÍ¡|që/ûWÛöTº-þ²HÛíxl—mÛŽ:H_.{“_¿ûòŸþñ?ûÏþÎßܾÿöïKÞ4ý<mÓj·BŒªír½=ïn^Õ•š™fž!f++9Æz]S‘dfŽÛ‹‹¾Y,ÇX—¥«Ä8ÄM½b]×êÂqì¾,)L²™1¢"³Iÿ~Œ‘ýº\Ít?žYõæi P4½BÅÜ[³ÆÑC–%jAsU§¡J‹¢SÑ_Ö¶1U1›Ô°€´“h(ƒê¦/Ï}Œ±´íz½V¬½p.4ûm?»—vCšQX¨qYÅPU•X´¤ ßùäÓÙ Qˆ )Š1º !aK·!5­«¸À²·d¦«šjfXQ‰U–£¢¨©à ¡QcÌX, z%çi2Õ‚1ê2áH?ŽÕ›ªŽÈš®e¦£rñ•ÍVMQ“U•>vwµjÅl0ÍD Ô踻HÍy¶fuÜw‚9†»o Eª€ !¨CóI.•¡&f2Æ.ÊÌT½F4Õuï!hªÍ‚"˜6ÿRœ‹ZóÔˆ¢ªg޵ù¹ç==m·Ûí¨Þ|iu×ì½Wäårƒ…MQuä&׌@Uú'‹" fÎȦ­znmªÓ…Åšk2‘W_Çi¶¨8´ÅˆërJµÖc ­Ø§õµˆy[QYä¬=©ÐÖ–Ê yyzµïûè}]×¹ã6׈޶…IP%ÙDYFÀiG6ŸÉƒõÕ´m[HÑ;x£"Çq¬ëJ_ëÞû†¤€È¼,Kô3ü,Ïs³5köf9(²j“7d–©»eªsYŸÕÛI¥f¦æqPD+«µÆ¢Bºø’™qt˜º{¡RkÏ}Û¶‘ŽÊ4˜‰Ç¨,®—+82¨”؇ʢ"¤,m¥J g¼¤"û²h[[î¾}ÂE-‚"M¡(Ì2½äŒç Ù¼ef0kªG1jY¶ÕŸ"zÄ!V˲{BUXCÅ1R—6Á¯ 宨ô¦™aÆgæ­4Q·Ì”¶ëñ|Û¶-úpqMµ*[·~„• hðeòxRÀLÔÒd—¤[CUŽ>×ë•Ïód‘,ŠÉz¾ÊI…Ž;õ°¤‹fæ  EÄ›OAF«ˆ(1ToÏÏëhÔ îÁZ×­¸Fq%Èr‘Ëu{¹½_[;"aê–‘î~Œƒ$­ZX4Ì=º×9ÁUg•ÿ(:¡•m2QÔ¨:P£ò2&ÿ·.˶ŠìïoÛ¶Õí¦æÞZ©Ž‘Õ«­VE¸pqU‘Ñû¶\\´‘º¸ª=›¯Jy¹½ß¶m¦°ôw]uÑ“#///Û¶‰ˆ˜²<Ä4´o›>‡+rÜ–ËrômºlŒ÷ZIè€ Ót}7³mrY½öÞèJÍmY۾o÷£ß_÷úvõG3ÿâ{ŸÿßÿügûMâ×oßïÇ?øä;Ÿ~ã7)Y|ÝLŸå¶×¡îåνN†š©6KÖíeÐE´žûûz9ð~¸.K†ïý¶]¿óå7o_;›–šušíRÑô¼XË£gk]¼}õÕoþŸ?üÕßøÿ­!q° Blj]&!Â'çK>"?Ê]—ˆ)Q*³·y]77û+¨˜e¦A)E!›9« XÕÍ<•âˆ(Us1}yy1—;”=%ˆ`k ‰±4зæÇ1HâÕÈT.×éSYUÛ¶eæ] ³þ°QéÞfé<’ÄOš)*›z¿®÷\•JÚ nF53•ɰÿ žúúë¯ï„>¡ˆšKf¥Þ$«éBTæ€è¤Ñ ¦·Ó z…ªŒ*Tbß÷21wmÆ:ý@åž©˜YÍU§{[¦›õÑ'†Ö–¥æ3šÅÎÝRU4°&³*fÀM%&•a<’.53Ë1ÚçFÞí)ͬ˜w›L¥qŒÝDI#EEŸ§1¢î.{ïOþ!ê–w}ÄìáX×KUeLèâ-÷}ç݉µªNn[qjÛîgïóÊœ)¯ë4ŽˆºwOš9ª¦•­¸)‘wûÝûk=o,sˆpj+83¢Å ŒHNžDRDUx6ŒTŽã¨»rûqâyyy¡©šöý@±™Üm¤ÊÑ£ f™%Ç”0á.øœ÷îjD½E(õ|;U›=WÕ £žìݺgDë©Ô•ùI6_(ÐÒky®¿ÇÍOÝМ¼·#¨^UÉ}yì:fV5mSóº{Í.ÑÙUM½L³¦ªäN+~ˆéT€ã.¬ªyRŸõÇ9µy¦>V6U Ô>çÜ×»—kUÍG=A¾#@mîŽççç¥]¢LªšÚ”q-K»½ÅNêÞ™¶cÉÄô=? ó1¦ÑØ,¡¨ V…Lä~$m‘‘ €—~¸  ÏÏÏ<“µeФTJfa”´öa6=,'§iº TÕ\*j6_nÇNµ¶m[ß¹)ÔU˜iH˜éļ+QÍù8ƒ^m:"6bß. V VÞ¿Œ5¿ó’Éà¤_Öˈ•ªXÌM ³XΑ Z¬kK"+ÔÛ²8I7ÛDäýÛwOÛ<»n—±GôW—mŽí>í¤ïãsŽaw»=ß\Û|Y×(3›¢ä½÷,É:ŠŠ®—KÛ‚C.oT½ªb¼qY_[ïù{ðïø[.ÇÒl¯]/VrdŸ½mº{F¸^¯§ÍõBgxÀªeYT EŇ ¤ª Fr8GA¢Ü s'ëA%3KU›'‘(5q˜Ùåréc?çí=q@?bYÖI¤°÷QýCâÚ©†/kvëÔ½÷Sêyê‰Æ4¼SÑÖn"„ÂH7#1Såæ3â1;ª]ÜWTEŒÙ’­ûYÀ<¹ffU}æ5ó5É"Í׈ hLØUä²È”éPPY¢Ê=HY–e̸ÄLÝ}¶'& N’daö´Ãít†Pe$À¡¨‡l¨Š#)keeŒªªu½òò|,¶P9×£‰R’wb"s·¾_“^Ue•“ªÉžRröÊIÊé*¢ %䃄ÊbæÊÔD„'³DEÒæÍ ’R±Ê]úû± ÊD«jY6LwZ²,&a•³jW•Ù›0-¶änÍ"g n>šDz—¥<~Íã/Eg´²ê²]Äp‡˜J¤\ÅÌI‘"(¥×ŒAŒª:©iÅUršO‰¨«óa~\~>ÚÊ—1†‹lî|ˆžz©Ëúø'sî1´é¢‚ȧí2ŽTŠ4ÁÙݯªºÝn"†æ¼Íª*šˆ‰¨èô‰‡™õ£+ä8féyÖC#» Ím’pˆ´Ì,”$/m!™¤µf›eßü¦¡9玶™(μ·ç>~"“í„ÌiÉ2¦»x T5Y™Ù3_}zˆ!E$%BDÕd%DÌ}½&5ùz½žr§»…~ˆ4÷x»\.¤" ô~ܶÓ@½à¥•å.Z\›¦ ¤'ì£Ò™YÇ „.‚P’¨Èˆxõô4ݪ–ey¾Ý\t† µÊ2èêîÖ»wÛÞÚ´LuW™s4›¶êÖ2Fd¼ÿêݲ,—¶æ>ºT¦û똞ˡ\––™™=Zkè¬d™ÙžƒÀ¸çƒþõ¯oW,æïß>ÿøÇ¿ ý=òý­_7ɽ¯¯·ï}ñù¿üóŸï«¾ÔX^¯úrq BÎùˆª‚‹ªæÛóóåééýÏË=wT^®Ûþò–ãøwÿýÿàËwÏßäP¤¡óQ¹Qª¹T«HCj2ôͧ—¯Þþìí»?¿\mY\é"^÷H…ém¸®—ã8&=gÙy~Šˆš,1éÇ៱°÷ËÌfW’9õÙÖeªg ò(VZk½’É9 n·—ukUå®"bDUÕÚšn6¤ÌÔ\g¬ÄÌþœò<ô>BEäååe]Ûl§ÀÙ+Jîýžª,Y½w@@573Ë 6{ßw|ùÚÎY_•SË-"3²QøÉ«§Ó>àίªÃoŒq¹\§îý±’¿ÿޚ™¬åò*3_çïN\¤ks˜ DAÅKºÀÀóíÙÌ®Û:%–чmë|ûq»ùºØÙ¯þ×·«?¾óé÷»í"ûb}Èúövì½öÏ—ËçŸ|òåó—Ïýöj[åÝ~k¿fDp?2Åd©¾êí“zؾÂ{‘ç¡j\ÕÐÃŽ%lüý¿ûwþñ?þ½ôË_T.©ö¸‰|‚CLDÕ ƒaÚãÏ~òÍßüÛÿÑ—ý/»¿åyYž”@Lÿé1(°&®Õ.:úAQSVƒÈ*UÈlºˆH’ÔÂ*;\«øþÝ˲,k¶‰H1UM­ñ8èš&æ-"*†™­ªïÝ}tY|qi½n¬1²Öõ)rß®Oc„ÀzåªÇÀ¶l&¾Î»á<ÁŒ ×uQ‘8SlNQ@Øá«fŽ[OQ¡hAF˜´ƒ#•pÝŽ>Ωey” ÌÓiK2H…6M L´ú¨¬u]3Øt‹LÕŽ)J¹¤¦$&±jÖÝ‚.¶Bm¯2&ÏC,¸2bÈŒVPiYÃÌ.ÛVU•¢ÚöþâB×i†U©0K¦<B›ž"$¨Éˆ¶8­jS¯UÅc”êùÕ’…Ô줲M ôÉ3¬¾U• Út2uofÓݤÂT]…JFQÞDuYI‚lRÀqú$ÂA—’ÈI‘Z@©4ÁÜÒT,ÑÓÛM+"ROln2S B™E?æ©Â›fv+S:¨) +¬R¾ ‘¦¥{ 3¡•¹4'¹œ‘{C q ª-¾&ʤò¨ T¨¦P­Ìyès_èÚ b ÂTAq$Gg—¡­ì´¤pRˆ@ˆÍ^Qœ¢’6;Ÿã¸,Å3mD²‚¬ª@UÆØT'GïEjˆªPßçM½I5/림e¾@¯ÓF¯Š&VY3¸‰“¬ -ÍÚB’=Œ4ULGvR@ˆZ.*)¤¡„ÊG´úìÈŒ¬uÛÖeÉ>NŸ(1ˆ¨h!Ë 2m1‰Y!ËÅ7$DDÌÜ"检¨‰¹F)L5?¢·Å4‘8J<5 Š¥FŽNrä´“Vµ–Q&zf VwGѤȜ_{ŠeÌ€vtŒ[Ž}¬.ÌÂd…›S+Æ>W K[ª€‘ZàYVf––;É‹AŒH°™K+H¹ª°D+šÒEr•’ÑS­UTp Z+á“ˆЦŒr]Žc„™‰Iešúô+qjŒ\ÄD¦p& bfR$Ë„еD‚0uµ(Í4JfJ«{a".§ $Ç(-,º™¢gÜö£Ú”‚¨µ&–¤7G뀌.yACgª•ˆÆˆš'S[ì%w]D‹Í./}¤ð8B}Uœö¼È\›¢:..G4¸¤B”‹ê0ÞrñE„m³#zY-ìª ØK$ÚuïjÄPCk>s^Ï4c“JNºéñœ&ëÓk%`*¦ýèOË%Æ(5UºµÒ`Û”ÑK­`{¯cÄåÍ«šûWÈ+Y+ª¹ "v{¹™ ™¯Ö”ü7ÉÿŽmÑ_<µ}ö´ÿÅí»Ÿ}¢<.m{þúËïmþ[ß¹üü]qìû;è³øŽ¥#Á0r3{c¾é:úò”ãåeWî¯=b v{úüÕÓöö›¯^X_üÖ¿¸ÝÞ=k o™ab‹§¡%XœÆ^jZY#§7¯þÁ?ø‡?øô{Ÿüøu-§#Ý-‡™ºz#Å}}ÙŸ¹êˆ1²š{VQ *™sNaÕ˜L4ODÌÎzvìÜ™uÇ< ´{Xâõ:SyNÌ ²ïûvYDC¬€X…d‘ì&~±ª:Æ­™3ªÈv¹>Ö¾ÙÆcÇèÓ:wu7Ý÷]!d½º\æ~Æér¸ÀÝsÄÃÕD4˜ÞE½°»ÓWUÉGÚÔ³"æ‘‚¹¬ëô”, ½9PJ€¥ª®>»Ó9×r²HAËSÏÈ%DTçÖ;›yšy§žl9 ¸D âî©,IN0_ìî©%2ú˜V J-«êœ]^9&uÃÖ‡áMM/øØYk'g¢½ÿY1,mŠŒÙ«@½ô¼\.ªÊrGÏár¯çÐZ‹ûõ8¨ d[AÚâó/ýþÍgç~¤Ûíö8XŸ|œ¹LÔ4j•ã8´°šOtgŽóÊ2óœªuÎ<éºÝÖšæL_¼3#Â'ÑR¦€œåÛZ$T©¥ª*Ód3s_Æ}zâóyO-83ïJEo>' gèLHHšjEšû1ãÜèÒæcô”3VÒc¨I»\n{é 5y"Ó…å|)³ýQU š;ctÎæ"ö0³éƒ9Ÿ¼Ý“uíut‚¦’‘Å} 5¢TYˆé(@ ¥fWþ+WÙùd&Õc~l霞Z$*%ŠËê9;;‚© 2÷^‡ÀDÄÌsr~#›keFŽæžQ¬È$m–‡¥Ê3OYÃÉÑ©¹%†]TD2Ò—™.EYæ-ŠIJ$’ù„å k­I˜˜rkqÍÙt¥EíG”ÀAåL~ˆf¶عµu-µ^§Of>ÆÝóÔûùÛUÄ™*ª¢G“¶xôQU36erQÇ Íp5™©÷€‡Œqb³¾œÀÀ«W¯âèÅ™mY„ +Dd’3S‹nrô~Ý/ÌZÛ2¢ P³&éÞF¦BY`FEÌÆ}fÚÚ.¯®M)c !]µ 1*"¡rCžPé(SlO[}Z&¾dß–ËfMgÃÓp;ž!Ø®L#zœº^EÓíØ‡«é=£¸TÔ’Uœ$DwßÇ‘Kdì»›Qå«q³¥½¾¶Û»½3UÑ+w3Y|½Cpôg’în.Ju·Lfæøþ *ùÿ{}Ëü—1ö[÷üVšÚê#Ž7‹-Í|ÙÞýúŸüðõ7]ߊÀ]uq2Æñ $ ÝÖÑ.›\8²ûDãú)jërxy·÷ïýà‡z½þ‹ŸþÉ ü{Ÿÿö?ûã_íeà%³¹dÄ¢¶©2)ruä¾ÿúýüþÿùßþî•ÚSªpøz5Q)c4mã¶/f=†r6fjº™MwÈiî;!Í3Ôq.C<ý9îöu&„œÐú«W¯Žã8û£ÜÝ}bfOOO}ÜL1Ï"-kšW&“ToÓbIí4Ìî96ï¦dùÔ¦"‹¬,H ME÷—Û¤•mó~hÑUÍ[U!‚¤· ïöÉóæQ´ö±Á3Î_zóÞCL¡2ÆpmàÙn_צ„˜JIŽS¤ ªTAÈôQØ™,3ËôÏž_cÚÌG:K1MEæ¶mU¥¬{”ˆÌ,éÙ©))²¹Can³ƒ*¤SZ )V¹®k3´¼¿t5Cœ`ãl"à^ˆœ€ÐG¾ÚsxˆH‰ôˆ¹&> » îón 3 Ù9¢æ¿%¹n­j¨è¿4ߨ4»Ìœ."³‘5zo­‰È˜HƒXÕÙÁ…y$çÜQC%2]AUÓmÁ"‰Q³4_×K)2ÃM”PµÊÊè"ö(ææíÀîCÈÈÓTCp6wî÷ÞZË>f 5ÂI2™Í¸ù@Ž$/Ë*T¢”‚PîÑU—Çz÷xn?C¤5ƒ‘9*€šäÝ’hžæ«jòjç[˜8}EƒärY«ŠU.f¢3GÆ}ˤ§ +2«î³êÑýàn³ τ͖jÓ¹Rj&=ëRutA¢8EI%"º©`.¸OX ÄÕÜÖ¹©*J¢h:¹ÙgÖJ%MNs^ÑT9¨ÂI”©ªy„°Ùø ˜Uê^%??h:³wV”¬‚J‚­5pQ,TÑ[‹ª“ã2gúS{RU‡˜9ª˜FE%¶ÍQ!ò¡ zÔ‚o­Š9“¼I1Ed‘Óµyš¾TEq:Ù<è;§g™M ú¬ƒ§OñÝÒ^D¹øÙîaP¨iª¯_¿0û³=nfž®}„™WUe6Õ¦621×7 §5QNHo陣F‘XÛ’%„·&•¡KësµªêÇ*”qÛÌ÷}_× lñ’ š™»ôË¢=#ò63Ý ÐˆPñ9Hrö3ÐÊÍ’Ü÷ýÕ«W{ 3K¢µæe˶ý¶šKá›·_ |¹4׿àb d&oãaô,‚ªÜ¶ ¤DØšG‚b=þš×·«?þ×ÿë{ýÝ/¾¼Õ»·q‡º,×ë÷?ûÅûë«×mÿìö:Þý¼Â3»ÔÑšæUꙨXíXpÉKð:¤9j\TÇ“Œ_¿ýFëòûðþû×OÿþßúÏïŸþÇgúî¸AmëÚBJÁT(}ˆt—2\ÖöòÙåù'ÿûßþoþS“T§··N_ºŒ¼•rk?,"’”æâ:ÆhºÚ¢”Î8˜ ˜ÉV…Ä´RdŒ u@ 0½µˆ(s/#FölmÕ¦ -R/Ke‚%ÑÅa6¡TÁÉb¢ª.«sô&²ú ³è€nm]uRûK(áÖÄ«˜jMTûÈÌroËTg(JêHˆ)ÉÂÚšâÈÊÑÔtnØUÓí M­±2SÌj(‘µô¨M]Õ³§Az³b+Ñ£T2™ÑjR—eÉ‘£JÈ•4BˆÃÖÔ¨œüDiSÏLå¤ hg’i¨Š¡åœ&dDtÔ@ µeÁmAñÌ/sF$+×¶¨,Õå8(5'ŒPx±Æ`œ¨ÀRgþN먲»]û¹LD˜+W¸P} G•ÆŒœ¤T¦Ìd€¤ ]å’€PŒÀÜìs0—e]›Å~[ ™9LVmZu}œz_¢R˜B–Aš©P¡°ÈÈ{£ëvͬ`¹šß¢gB®Û”‡[q1%’dA1’™JÉ’¬šO æ6u1c˜Øé"ˆà¥"²¡2²LRS5™vVbéÊCջĉœqäé…IwöÎ ÉÖldB¢±®ksÍÌǺ®™“\n“0éIân´ýy_Õ!^àŽ¦MÖàzY狎É1ô“±2!Ö,æÉž²°r±ˆazV>‰’Zã8D•–™TsiR©™(,Å¢¡g[JK4¥ª¤‰,š ©ˆpW!“Ke–ªKÃLLÅ‘; e“ U&Ì:Š"n §y”5k½wcž¶u‹$Å@DJ %9b•µy‰ Ù`$dfòf&¦‡£Xô®"­yf,†JPqU+ʈªªËrã‚ÈRTŽ^E\ÉÔei™ƒÈÎôĨT·ÙÈ^¶íUÓØšÁX¨x´\¤åî‘áàà Rpæ ‹G¥ºÊªC4Èe];óÈ êTÕf¡/Çâ ‘ZCò–Õ–Ë^A)‰lU:Ê®ŠˆÀècwn=H­¶.Gê¢ /q;ÔÒ¤„UìÀÖ,ƒû±/æ0>tñ£J¦-G|Ò¶ÌÜ5º†~ÜÌhɵmû¾L±²Ì«/ö#« 3q›å]‹JQÙÇ-R³Hà“SõÇ/ÿüýŸýò§Õ®ÏGyyzõÅ矯üšÁZå«þ¶5Ë–v•z§£X5^½yýöö¶™=¿¼[¯øì{ß%cô’å8nãýËX6Y7HæþöÕUþím¿ýù›×?úÍ~ë;ü‹¯M¿·`¼ªwª±«–1”9"K2%‰&XÚ«ßüæ7¿úå/ûÍJ¤÷Þ`óàè뢪ä1T!÷ƒæ#b,ÍkäÌ]Ù–õ}Œ1S{…ª"ÞdŠ!y÷FŒ5®b4E!#ª3çÝ´Ù*DA!aRêÕ˜Hàŧ_03L4ƈé)ö‘ÑR%¨JÌ&‹þ„-æR»¸GUFêf3•rw8g–Æ&Ú£OÞ¢b"ªfÜâççgj;c:ó~ ŸX3²ØŸ_1U7w¡d™¨­­WÈbs?‰T™v ¤* (”ÌšB̬ 3«TL j­˜Ù(<ŽÛ´Scö©ø¸Úì"MkÖR (afâÔ& é}¢ÁÉ¿gƒÍkÞÚDûçßÇU-¨U6jÚKá~ºwËÄŒ€}œ¿#„wõæ,hæÁºD&£m¾ˆùßœGP‘e&ė“ýIÑ%г3ãq#÷!óá²»'f×)eõ”)„~Ïõ˜R½9TF¦Ø„±@Å"5•Šéj+ªþx„»ÒYr‰êì,ŒŽÙÖùNÌ©§¾È]iòÀá&1™d°ôn>ÑÄrÊUUeUÆq‚(†ó{~X?žÆC†ú1}&7‰i@¹·*º[feNC ÎÏÈKŠH°2dXƒ¦”)ýõei¾n/“èóQïtXHy¾ ©`Lèhgâ”Ïš è×"„ªŒÌ k¨ªÁb?TµbzªpSâÈS"PqjCf˜ßÉ‘‘ÙÓ™ôñ¨RT”Ó¡`F(ྈÈû——õ²Íbý\CÌZk“e""É:sm³F¤©j¹sÚJHYÅøÔüxJ/µÃóð€ºãaj6ï)SµH’df w[ZÎ6ðœO" ™ªÎ"îͳSð Ë„2ùÐD kÎ*Qqôž• ©;ÌYŒˆu]'É43#3'¸*GnÞʽ/ªnžÂ¢M¹–jEF䥙«Mn•‰®¦Íå8º ̦¹’Â[Rbôi =+²SLDtŒan¦.dŽSøÖ¶ª³Ó- »4sF&("1¢2ÕÝÝÇ~p.J&Sj÷ PÏË"„Fa]®(Ï,bˆ1*1^½Þn·›™©Ìœ/˜ZBù–Å·üñço|þG?ù³¯ß½›ºIÔfí³ï}úùË~ú“_íCÕK4 4ÊRÙ9öïüè;}÷{Ÿõ&"”°ç¯÷x~†»û§5LiŸ}ÿ{ŠÊãøïÿÞùž“—wÿÉ»ÿøöþ諯;óаL»d(xwV0‘ص^¹úü“ßÿüÇÿÅr}‚ÀÜÆë¶ýþö‰ÊÞÍ?Æ%¹®ke7›V¦xþæe]×uY÷}м Dez{žô‚Sñ/uŸù“% RG‰¨D„37C†Ö‰‰‘œIž™ ¨JKV3SKN¾…Éé[Zé2Ó´f2 S[™9fè0e8 E)¸ÊP¥0©Ø‚J¹Óò'Ü=*à"âPÅ1Óÿá'¬O Æ ;›…Ç&G\Ú:ýÖÚTdì<|K*zeTÊ]÷;»°ªê‹EôF5#õX.°f åS©„&„“O‹ª±>-Ã_Í™“>—Ëš°êL£pV Ê(wg¡=‡p™I) À£™Ílªé@-T¨P²pB áª@Eèä™ÒÇ%Èã“ç÷œ–0U5î¶ès§?×ú3/ž}tW¤„cä£;0»T×#Õ#NÆÉ£¢R僡Z­›-»FÓ+ï°†¶û=ì½EuHw=)õVP…f:Ó꣒äQŠš×Ýôv޷猶ÕQñˆÇ¨’)ѪRÓžl,æëû<½Êñac÷j{Hj”2km&ã*Ž®w¡Ç¿êœ>ßìcã<ß‘tâ~‰ˆç÷cöã&?Ú”@©n<7½Sa¸z[–…¦=FU%²DKð }<ÔfÚÙFª­C9³¬{f\?n‰þ¥w}&}tGrRÄtL—^3‘2 2b™ÀI)Þg`™DŠû &D% ’³ðÕõ‡©{|zz™“‘Óƒô1櫪ĦÁ4IWéQ@]®Ëù3›šR˜©¢yO(œó73£ÇÉüÈjf°¨ÍTuZ6«Jk>sõfˆb ÈbNÔ”$%SETÄs”®V‚‚ÞGžô—g[Úôê Y„ö>9Lì±»{[ívÜ îîB6oÈó~Gï—åêîuóX D’X›ý0‘FU•…PÅ.FU«R™Ÿ,#‘ùɶ¢øòr[×up:µè×ëuß_æ©C‡PD¥‰ìeª¾x[ZewÕ½êÒZ#³2Ç(“tŒO–ËÔô²b¶ÚH6kö` B=·mMÑFïûqlÞèt77ñ=úútˆ—.#ŽmÛÆˆE›2+ ßæúvõÇoýî“=ýèÿøÃŸ½ìG ûò7ÇŸÿé«Oß|úzyýÅgËO~òËåõòÅçŸÿ䧸,«[Ci_õÞEùr{/zÊu]çÇ¿óç?ÿùu½þðó/~õ‹_}õö®××_ݾþ‡ÿÓÿüã~ñé¯_jmÑ>âÀs^…ÍÐQ¢ÅRŠA@F¿mDfþþïýÞýßý]w9b[O,Ý}ÉÌÇywÎ쪲æªÑaì½»ÁÌT|õúéÍã¸u·VU c1Á™?1§ýt­H©¨dq]=]@¡°MöbI¹;¥ÊÄÊP2¯¹ÊÈ,µ&5oz¹\$ªÖ:â8ŽƒU‹m"2H‚"cNïéx8M<³TdiS&W…ˆÌîìrnKóh¢"Rà‘é¢F.­¡(œü×y|Ç™Ì5k‘*1W³©žKÌ>TµµUDÍ„*ƒ}âü}ŒíéJXöþȘ˜d®û¯˜ìwkm1jÖÌ ƒeÉ̲(—­ÈŒLúÒ|1Ü{Ò“?1_«)¨¢ržû Ó¦‚uÂ-<«¥çšþñž7“0'­ø±Ç¨SYÌ`[® JÍ*ÌʈhÞÜÝtéc<ö¼Ïfž'f;ƒe¥fž¦[|Õ뉚LªÝÿÇNó(‰xwˆ{¼Þ›ÜxTØùšeJïý8FÓæ¢® ³ƒ£ Ó“3ïtÞû™Ýê³ù&S 5¸q’*ÄtdâD×Î/ÿØTuòŒtjeZÓb°æ =j/wW(ðÿàÉTý4~h&GN¹$L\=$ uì2sõ¦" éüãñœÃo‚póÞάQ@O/ȶ]Dd É:€“¨T)$2KÄT43÷½«T»lªº,Ë<.ï£ëÚf½øqýÁŠ;þA HfdhˬœIÏrÆ«¨ùBVÌa*L^(¼µ‚$QUñð£ö઻*Â"„BeP¢ÓT§zš*,™\83›pÈu½{ŽY嫊‚€º/$o/G[—;þA7ûØî33eY‰)‹ç~ŒeYÍ,gJd&Kú¨&’Yzù0tóžœòzÙ˜“~¢›kì#‚%"z‡Y¹{³3\Â\bŒªX–…J@Ha©ª©z1cÖ¢U!ÞûëWWˆ1ÔU|ú<Â|[×y\—§—Ûû¦z½n·÷ÝÝq·ž#yG[Ι #9PzÙÞ¿{Ômm,ÌLêæf*#«²"mCôÈ„ëqMÔ ÍÕÇ›íòrŒ#«š"Žë¶½¼¼¼ö'›~N™‘¤ÂÖ¶yóŠcÑ­dŽ1ÖÖÌlGïëÚ†QÓt¦$oÏ/«¹©ŽˆË¶öJ’ugÆTL&zŠÈE®èB‘fxúζ¿<·õÒûÄ\ñôêzGT< P!ñòþùééé_šô¯½¾]ýñ«ßܾóƒÏ~·žÿø§ßÐíûï_ôë¯ê˯ŸõÕ7Ûo ÈúíýøO~õÓýxv Çè_÷ÖžÞ¬oäë—§ï¿~[ƒ¯Ÿ^?ÙÓë}~Ñ\~ý•>|óÝOùGÿüO?ýõï\>A;ïyü¿´½K¯,Yvö­ÇÞ™ç>ªºªº›lÒ¤ Ú"MbÛ†(Ál0`H† xæ™§þWx X‚‚mØi>›D“Ù|ˆÝ$ûQ]ï{ÏÉŒØ{=¼Ç¢ ˜sÊÄ@¤C…ɆŢËEy<]_¬Ë›×™™³I*1gFf %…™e¤Z;™5fšT†@îéìØFA&ÚsAÉnÓ#$è9)ʈ‰Â(‘…ˆtaÊL›V–ÀI$Mw›žÞã«®Ä IDATDxÐÂÝ3c¦Io1mI®$냲îx¦=iú¢,i (ZêiÉÌLÛ'322áÌD'(bE¯ZÊ“ ÒêœðAQNTZ"Öw ÏdÈq±8ø@Ú¹6 "j@‘NH‚ÑÛÓ¾5’F’‘ÊáNÉ$ÄÂÓggõ¹“`x0HeÍiæ;d×&ž6[kF‘œ QY”Ác¯]Œ<%3ÆÞT+n•˜.\ v¦rU”ÄÝÝ÷aHÏP–;M2oôd± gÏ€H"“ IÍáÁ4ãü§{âI4LCdó\¡àYd­³»³´PñÌd8ƒëü&ŽPî̇ ×Tæ”…8ƒ€d¯©“'#éæ1fåDÕÁIé>‹q7§àzç¢Mé.ƒ2Ù=IÄM¢3“K‚)Ù‹'Lªª¤–‘„`šÉYlV –LLf%hrÆ]jÑ5ÊÓi fn,><ÃkˆfÌ gR¤‰t§Èt7—ˆ”ìVÔÞ AFL"j38TDvÚv!T˜ÎÁɵ˜v¤í=IYŽ1ƲœÂ¬©ºéiú$8w¶Ø’’Ê I@i633;–Y2˜´+3X',ÂôtÙHRf*„Šd|ÒÝ6QÈ´½JjM¡¤ÓùÌÌ»MÏ@ãÄôá-4 «,Îá±5êîžBNFÀf²*³'Éá)Xžb6ÕL¤Eؤ93“eU¡:¿Ï‹R&rZ½Á$§%M Y cša £›A*€9fk­I{ÚªkZÓ3 ˇÖr¸ÇLÁim67jm]h`K&±ákï„ï33;¨A<¼‘ÌݤÊ!Dæ“D0±ÛTâvZ0fC„)³;„•ˆö}ÓÞÒƒˆNl¢ÖËfºÐ)–nmÛœº†Ø!Ç ÆÐ¨wyýôi¡é$2C‚S”„€±7Rg‘Ô–aS—ɼV”±Ê•ݨxýVwé‘î½rÇÛ˜kïpÈÒÀÞϧ7mìËù<6w «xë 0mÄzÞ<™ûßaýñkßúNüúGxq¢„ ¾ú¾üÔë¿ÿÕw»äã~ýö_ýðåÃé‹¶ÿñ/}ðÁŸ|è×W‰œ øt!ûÒ³³‹$8ÑÞïÇÞÿàôƒùÊ·§®ãñúÉã÷.ÿôøùçÿïS?ÿÕ÷>ú¿~óÃ|²ÿð³§€%]zÛçŒ0—|@Ìt{ô´¬Ï^=m¿úë¿öÁ—ÿÉówŸ]ÆPYçœÒNf“"ÖfS¢/ª9Ì<°,KLWaa˨‘9³–õ ‹÷E÷ýQ˜ÜÙ–þlî—¸ nÛy ÐÓe[ô@_ç´ é½S äeR—k‹TŒ…™åa,Ž1†J¯.’ˆæ˜™‰®Ü•"É<ƤL tãHÕ„P&;lgÙ=n: JéA`šE2ˆuÑYÃøÄ}\íî]5"ÆBÄ FšDÿC@•d÷FS…rfV|³_–ÅŽ&‰E$î>ÆhrPaêÞºßν‹r/Pªú7.ãPVfT@`fÎj©¬ Ýc:‰h·œBYLx¾ùîWÈ× $ˆûìM±òpw&âæü–DHD#’™#½¼"b]a¾Ï™7-OåBEæªw%¡‹ H9.ß›ããg÷ˆ`É=!™X•ªJÁ`BnŸŸê‹ „p<"”ùDÍçôm‚)o€Ì•FDZÜ\DzëDD0fÞË“’œi·5¾©E2“ˆ{z ލfô8Úo;Í‘Ã)]Ç˜êøªtH"ù¦‚ÆMÁt¯±‚<¨;¾"2>4·å:QŸÄÇÔ¥‹Š!TÙxåÂDªÍo.{1&Q9•0nÀ’12îM”K™Ú·'=ùö·ªhñ£œ¦#¨öžhà Bå§”Ú!¨>¼æ Ì;`!KACáM,Óш3LµÑ-S·è&#g…îúŒE—{óZÏòMDqCËÊWÍÝÂo„%w!¨ä02=à¼^n&§Yr*"bbŸ¾==Q2’„[ãÞE],Ê4<¼#Z’—¹²ÜrRÌkBÁ,û6Ë2–@¢(„ͬ\5mÿœ‰„UDè Ž%AðÌ*eY&g2QÓæEJ"Œq>/ö}o‡è}ÔÅb¸o"Ò’L¡»9gµ(É,÷eLtxšÝ—%€zê•™˜r:˜ñœÎÈÜÔ€ùÁ™ÎÌ}í­õŽ˜áå’îV‹gÛ6Öå“í©õÖ%sI?vÉëõZ‘Â…`IS"Ê[Ò‰Jš)YhSè¾Ímë§u¿nÒ”DÎuî°ô®¯_¿^×Õ ÙÔa^äõöjYNûãVæ&JNÛ²,Ì\>§­wß¶ J¾[ÓþÍ_ËüÛöÞúNãõãéåË‘éšóÔh]ôùˇ³.KÆg?üøÝŸzWS¾óê;9¯8#9…ÂËùáÁµóéñõH9SÇœY÷ê_þ¯ÿÛŸÿùw¯í²m[[NŸOÍ1Ħí<§Pt^IÎ9béb' Ú7ß¾üµ¯|øá‡ûÓå—Ï®3cÍ‚df •xf]ÑGÕ–_Ç^gó‘ê½aµY÷Fî{ëšáû>®ñìy«”¨¾oW"®èÅ#ÉУ5Uå;—03=|ÎÉ]D$gÞ—uï½,‰yÌ)âÜú˜3§ H@̼jóiW‰Š-£„$*îæHÍ·tîò®•’Rî÷ñˆéÛ›IÝ—B™ED8Â©ŠˆÌ˜=™DÓüÔ—mŽ0;z<ö[×5©|ñID]Îá&™Ô˜=mD6‘‚o’øG8ã™yØþºßYóÃ×ß®þOðëýôð"·|àe56ßtôg;A)Oä/‰ÏÏßù|ýüs\|k§U-Û;ËëÒÖÝ@~ Ïå!òŠya¿@ýûŸ|ïûÿûgwOï=çÓëÓËv½>>ÍùxŠ3åªËêÊ[Z-]mÙ‡üôã§W¿÷ûßú¯ßù±þìâŽ~~}X¤¡-{×FŒÝ(ŒbºM¬kgÒàýÔ(gn’D*ÍÝ FîL@ y„&ú¹k;YF¸¸·6ÆH÷v^Ó­ºœ±eÊ3],“”Ш-ÈymÙ5{ "4òãÉÒ{=-Û¶Yš¹/Ü<<"fDªfºS´ {Y0çÌÈ.e.€L_V¾Û-‹…!„¦y´¤…¥Â ¤ááÁá&H†EïjæD.­5‚”ÅЃE¬gNâ4¿>Ž¥5mHaa†‡72çÜ‘]µÜNiß/ªÚûêvÄÎiëæ^»òŒAD”!J¨pïmsÛ÷mmkkänñ´]žÒlé‹O …*%¹‡Û`ŠÞtÛ¶á,ÜÉ*Ôún“zKð˜—AéÜ•©¦’gLHÏ̪rD„DéÒa1÷½µ¶®ëŒ™Hi¢"cŒôh¢ ŽÊ³fìû¸a €’<¥†uÏ›ÉG»c ‘ÅÌT4‰r÷ J"Y2Â$Bˆ·±çµ"ÕÄÅ6bÊ*ƒª!t^H dûxCñ3+2J=ËUFx¦ !²/=Ì»¨Í© nŒH÷œnB™°Ja™n³>üº´¥SÂÍg½¦g&µQgH3S¤efOµÝZ03ûðbÛ É>A˲pzM'œFÎ ¥saÞ Æ«2"¦j&M‚Fbdtwo„ŽLŸ‘„ͧ’ú!§20V´zFˆhY–ò´nW.¯ôu]÷}g‘ˆhèéäáí´Rø 8˜‰¥¾l"éængÌÄœsŸÞÖg`T2Rcñi*b–"A 0==]„OK_È%d*yÕ̺J„U\ýnÀ3ÉÝA@¹™eZº—á¬p {Â"3¼'E…3sxVê›j '"™ÓÚù–§Ml榲.¬ñ4;³%XÅ‘1“4©ùt#–ÆÍÌs²’/Lžá h<Å)uLÊXZ¯"Ìå:ÁH(…I4Ü;¯}¿~v:ó#ìX:'lé“ן¦•B™yºÍ i*­9µQD ¸4 ŸÇžÅ–1‚RD"3ÍÝû²‚‚…ÌŒIØø Ö‰¹¥ísG,]zD¨‰î7‘%’Rd°ƒƒÒ›÷}ìDdëù”CÓÂK¦¯½‡y¸Y™7X)‘œBÒZƒ…‚z_ðŠæð±´3Ftá¹=1ƒ´==]Ed壧éªò@—í) aÜå4vGÈiYöíõy9ñøªw¥“ÃçŒÀžŠSk­ÙþêADÁ<œ¦'‰;ÃVífÙ”Ó)"Ú²Æ #7Xq²OhʋӳRÄx¸œm4ìúwXÄ«ÐXÜ2Ÿ¶ëã|—O§lr—ÍgáœMYS¾û—þÌÏüìW¾úÞç?øaé­yMÍ/¶/>¹F¦ôéú껟}/’S½šíh{?ÓôöÅŸ.×±“Ç.JËéECH:Â÷΋pcæ1Ç"Ô2Û»ýêoþÖ׿þõ÷¾ô`©sΊ1TU%ž#Ý‚>C‰ƒiw•‘lÛ¨º2"î"ÌÛfÿ-Í•$Q\·ÇzGfºgk|:õ»Kðí5ç^»j›™’„¬hgDLNÊ$XXñ£¶Å1F!«w­n^O÷ÉBõÙcŒÖ‚ôÞg‹ˆTuÖôä&á¬:ž™qçX± ¼uðÖV–˜s¢\<ªûÏ}Ñ´IDÒÔPîC)¥ŽÙ(ë´43mb6ªcØ÷=œëõ›Gam¦™™•ÂćÂeyÖëOÝ¿oÙÖ8-‹»SiMÌGD,ËBA:d1vrïÔ¯æD´®+—ݫ͈+\,´ÛNÌaXÌ÷ìw0óÃÃà ¯æ¸éNñ–ª°¦$fvÿ y#¨Ö,“MÏð9¨4ÄMÊx»AsŽ[ìKÔ€,ÃãÐÎÝvÞ¨|·¦äpÖ§Íõ½wêy¿ã€Þ,D4Ã!l·žï@ÛËÊ …"¿‘ÞÔÏaw[Ì[tåg‰5úþcN™3¶ýõÜUÛËóË¿ÿ~ö¿þ“/ßõžýéréK_¸U>Êu3¯ëZìþÌL‚»ëõJÔþ-³e`\·Ö$ƒlDRÛc=gÜ਼ã|ǃÖ«ª »á D ‹©‹z·¹‘°0wnÛ–!M7Ÿ`bm´ïkï™æZÑR‰拨Gä¨v–õ¶ÃY„æ˜ëºª*EV^èœÓÜIYXÌfÄ&Ú"æãOËi×ý¡¯3¦Û”Sq( õdc¬½#.œ ËÎÌMD!÷Ý€ˆÊ(vÎÙ¥[ÉÓºöÖfnÛ>Üö}§›.õoþúÛÕÛ'aH»®Á'ýèÕ'?|úâ«üå¶.ËimOÑEa»SêG?ü˜%—w†lêÑŸ®©ž­¿~zÅ É5?ýüãÖ×ÝAZ[À;@­)¤½úøÓœM +ÚÃIdm¬Dâckœ §¨“eX^÷ëéÙ—¾ûÉ'ßüÖŸü?ýËc ê•üvìÄ-%=Ç´Û9 Nåßà‡M…ÞôhYŽ™œx0#=²ð.æËåBˆ÷v¾ÅNÂi3™Á6|33 Ú÷]š’ÝŠƒû|}Y–ÂQŽ=÷¶ŸÞwázñað|<~·}sðÔç¤H ðS 'ðQùô8læ­ufbQÕ#罞Ê7*@R–Û/}ßw!Ô£„)L""Ü*?év1éÞîש¦üøœíH›¸ŸtCæï˺Äã7˜oÛFDBì–5ÊÈÖ›Ù8l ÌÎËÚ)O9¼X§õ{·œt¤fŠ zje¼Ux7Ç‚;a·A{%ÚôÞ÷}¿ŸÄèflz?6zïãByåàÒS¦ˆl>=]E‰8fVýaHabæ4뒤Ǖ@½FDÝßûPÄ3«!q}‹Ò,d溮÷!ŽÔá% ñ0µ`P8¹¾{fŠ )·mŒº;þ–ëkUÉ™I*冖°Á‹€+v`Øétšó*BFG€Kð­Zºßëc˜R¢r?ø µ#[d'Zk­‰™Un»$£ì2ò?HDxëÖÔmŠ7…Ǹ; s&Æî%›#¢¤È¥`JPý³Ý™.Õ™”qj]ŠinÇ\ÃóØX2o²ÓÛõñ4¹‘i"âiÛzï¤2çô|³äŽéËí©@‘"På' ܤ1¥Jç(ncÄ[ñ1ã V%B¶ëŒˆÓi­Étçd½U¨,ÂzÓ¨£†xFA$I™I}D=ø5ú¬DË‘00J[»²Ø«_ýŸÿÇÿó—ñä‚Á½7휻,§æ§íé×~óÿè/ÿú?ý‡_ÿG¿ü‚CgzØ`–¿ðÍÚñnÐ)Äq¸NWZ/¥/)»ªHsŸÊŒÖDEr7PFvlþSD„R³~Ç]€h­kÀ‘ÙT,Ü}šC°䘃„D™‹hzp–kàT†쀊̌`ÔŒfÎÉÔÎë>ˆÊ€¤™<”¥vŸdRîõhTÂ…G¦;7í,3É÷‘” ˜ÙŒ£¤`æ¹íáv~v:1º€|sò¡½û»Ì˜Êû$!A gy¹dxxx¸Ž½¾¿ùëoi²'Â@†6BÃåü§ßþ³½ŠörŸóz½jï'&‰Y¾ûÝï¾¾|6ö§ÖWhúÕèñê2øüüE_>}üô¢ÁÌÛÕá-羇E›û‹_ù•¯ÿâüÞïEŒIûu~6§ZFkÄ™ÊPfÊbÎ÷®*Ì*m—~Ù/þ—ßþ‡ÛÏ‘œŽG÷xâQóWÝö©ª‘¤ªTT€eéÛ¶1c][JÞ˜ÚüÌDØ4¸±®«'ê¨+r–ÙdnáQÓB,Tul“!mYˆx¿•µÌyo‚Dj­9r†sd–eï ˜sV>ôÛÅÄÛønøAm.õ¶–ë°aa8‘–»(Ü#Ëî“‘„L»«ø<,“<Ü®Ö{7ó9I¤‰HY.ãf!ÕDê(ðU!Ì\NZsŒbuLÛë( ¢v½O{”{eVO™™µ/{]Éû®È¸]½õ²"ýF²)Q.誋ˆÍ)Ä]ôÜ—±ã ­&"¢µ6g>ÎÅŒð¡h­*‹”{73›7óººM÷Ä*MnçA;»TµHìû^]c"f–åvÇ#³’ßoħG›Îì•Îulߨx©ûe|s‰’øÇP×çí¥’™åmSï·9µµ8\¤RÁÊe8í£bW7ß<ÏÖîßKo|©ÝËívÊ~ŠŽ7Ô{jo]×uŸÆŒâK©¶2ê’ºu¶Ê­§â^ë²ËÍ\IQÍ<eðÖ¥‘Œ7l›r‹ò[:3s[ö¸_ÏŸ?ÏÌmÛé~å3ŠÌ²üg¦šh 2àÎÜ‘?¶Öjk-’˜+A÷˜—Eå_ߌ­ÜcYÕÍê²d¤¹­ëÊÌ×±uæ1ï×K­´¢«×",žrÝã:KT¤Ê¢QÓ@±ˆø˜• ½í»ô&"eÅ]Í+÷u][™”L›Å#>¢1ص÷ÞšNÛÝg„{‘¦Ò2ÂÒê¦Õ‡/§bq¯yr,‹†?ú£?øíßúÖG?x\—/Ÿ½|õÅ'áŸ^®_Ďͦ1?Zbù±¾žßûá¿yþìóïk?¡,nƒX€cRk(òþí)ˆ ¸X–år*µÆTUÜ}»\YÀ$µÈã8D©µé‡?Þ™y¹\Òç‹ó2ƈ$æJÓB‚=sŸƒˆÂ†.=™ÂÜÒ@ˆÌá³µµÀ³zº^¯D¬|øä—Ó³EàÀû©33¥ ÷9gølí4cM= MXdN'’ÌAªº®}l“éaqÛØ¸‘j'P!²óz}ùâëuî–`RJK ÓͳnY–‡‡‡ÇÇGw·p#ØÒŸ®)ÏÖ5 aá—Ë…›æßiþ-Æ+´‰9hÿàL/¿üìKï½ÿìwþèÃéß?ŸŸ)“¬ø"Æ'Ÿ}ü¬½‰h†³ÊÚ× øþÆ3ðï þP1ZÏ+¨ó©µŸø±÷?þèõ÷>ú|·«‹,KSõEý1Òl.L Ì±7]ÂÍMÈ$¨õÀÒý²w‘Y†Ô§>Ÿí—_ûæoÿÅ«ÿñ?þõwl=}1vmïh nÜe˜±„H(£I°Ù´Ý ¡^oû>üÞO>û)¶ír~vÊsONœÇ´µ÷ÎM·Ü£$ " j#˜u]ëáÜÇ®"UÅß;]wÇA™) ]×êÏÆ¾WÅʪæ³:T~KQ#3O7J°0ÝÄ…Ø—j£ècó4{ IDAT Ò„¨\Ø™A0÷Ûx83S˜ˆš¶ «8¥Ó&/÷ÏBqê<Æ‘(}@vËûµÌ¤$‘楀ÈÛ‰Å7ïÈ£ŸöÑX¤‰g¹{Qáeiç5†1H"ðLÇaô)·F¹Ð\©k”%‡ÏRx†ÖØ,ÒðÆèµ"‰ Q€M$”EDDÍe$½5‹¬Ö™/±çM ª03JÖ8L¨˜QGäHéþ{¼‘$s!¦›V½55; `‚¹Ïræˆ`â޲H”¿wiJ#Ë©pl;ĉ<=œË;’)‘9†²äé"¢¢ìiæQÌö¾õ·Ï /WMå*=Л¤ù0«Ÿo-ËŒùö—ùë>û«ÂZ¤ˆ—áH&¤…€ÊtUÕç¾ìûN3Tå.69Ê5榻ªRÓˆQ°‡["¹ MFdd ÁÈ® ߨXŸ `N+q{Åõ½™œÞ<|þVÌËŒú›Ýè ¹DŒÖ‰ËeS–ÞÎyCõd„¨0mmáQ¡Ðǘ·A€Û´ööÊ<Ëš¸ÝGu£UÕ옠͹Hdq¨„‹‘€[ÚÀ›¡P0Àâð¡-MYlÅO¤C}Áo#£÷ïrß êAÛÛî{”ˆDÉˈÂÝs2+1zofΜ"iDÉ„“J ![¥8U† Ò ¸yz0u}º¾îb]ÛïýÎïþÙ·¾½´õ¤c¡'™O>í$¯ÛÙ¾ôŒ¿BÎ"øt¹Úv}u¹Î/>Ýþä7þ òÅw~ð9<ÿ`ýgÿýóK?Ó‹0‡ê† ’-³â#|îJK}ýrz-™tzÉt©·ó]¿aÃY9ŽÄiçÄÒ—Çí©·öö–è^ÙŠ :†¹ªZXø¦ÚW6 "’Ä‘ð03C¶EgÔôvÖ‡'¢œ®"LîZî53Óæ~„I‚ƾ¯ë*MÌFq¸{ïä‘ÁD‡Ò…›Aµ{ïc Y:‚…ø:¯Bê”’qØü¸ûét®¼÷ˆ8¯îvnm€2r›ûIN¨g=ø²ï`ù»œ¿ðéyÌ«¶Åc}|õ´j_¯>»ù£]ñprŸŠ±o¯ÑN—§«‰¡M4wJ!šf0áùËþ¸í?ý³?ùéë/ÆŒI£Î Ñ¥gï—-ÿÍ_|rño¾×{ÌAO¯Ï°÷õÅSpf#^2§ z’JjJgkÒ9x´Þ¿ñßúÚÏ|M´=¬'Ѳ$Ïc?-ë2·éîŽÔ³Î›Ž®læ„èþÞ¸‘=I$ãMºØÑ‚È1Òò5÷æ‘A`ííàršeæ¢Z˜ógfaÞF ‡˜Sj ~Û˜Šm#f£GÔä¹,çšYŠÈf33mNYR[åÓZkfA²ÜgùÆ—óxDï$Ì ¥¨m yB 1Ê ×:D-ˆÒä~&‚G™Œ„Pù~±CýûÌÅ#Ê]ï¾>==©–ãURAaNž¬Â‡Â?î['{¶¦)<÷Á*‰ dïǶ’7feãæ>ß,t=à“²?áXK"³ (\#“À€ã zØ[ºöŒhÜ<3ß™á”ÔZ§äðÌ ’7%ÙÁÃhm¦Uجg€‰•‰$DbŸLT³x]1¿Y둊˜³Û:Š¡Y'„ ¿*† j.ëmˆv¨6:pV 0ÝÙ ú¯î„ðöÕ¸ße¾±§é˜Íåý9=®g•€BÌäî}íA1môÖÈ‘pât3f€ØmÏŠ›¢L#D@£ ⎠ÓÂêÉ¢ú줟}üÃ?úÝßS_üÕxöî숳èÓGÑ_¦pXôv^ŠçüòÅ]—¿ø·Ÿ>mKzýx }çé3ùWÿËïÿÜÿô+/^¼Ø÷ýr¹¼|ùòñññ¼žl˜#Yˆ‚œYN˳¹Ê>I·b럶mò!UÁI˜6" 䉚õ»ûa:ânf|Z+Eøpäópwˆ© )ÍyiÜ„Á“YI`~Ì}lŠH²Ö Ü÷½ä ÜÚ™$ŒéŒà¤¥ìD¬j‘–ሟ3)«–u›QÔÄêm¸*ȈŒ1FÝîÓét:¬rÙ6V¹nÛùtBbG†T“>ÑÓ2Ã…ki ¥)ef2œ8—•§»ùÞýÿª#Þ¼þvõÇû_þé/¿Œ‡¶óO?Ýæ)Η=žŸí»¯×öbŸ××_üÐO$MÇük¥ÅvG[0/–—ó»M¨‹œž¾xm˵óðùÉÏüÔ—¾ÿÉuÿïüô—çWc…'ûú½ÓÆòñõ³‰±ž^Ì™Ï&Ü­–WºxÐ ò¨å²·…_o»§4èoÿþÿÓÿ’O'Å»ùZ_ψqÒe–ñ-Ç©Ÿ¯ûع7ËpÏÆÌ)bIF˜”æ 8ÛRìß<ìÉ2sîL)ÌÊ$76›=˜g%à$öÞûÜ/sWi da "9InX0r*zúlÂ,ifBÝœ¤åÜ7"j"îˆL0?ù¥÷®*—ë…™‘ÙEbî ˜Rç Ì6çlx­ª$:“#)Y¡Œê "ͧ6‘m®h™™1—Ö OûÐÓ.*Õ߇»ÃФª¬åè“|ΙK73í‹Pš„ìân)¬p£²ŒˆÓ¢™9Ý*£†•9.³ž:Crféa 7ÎÌÎð`\mo܉ˆnO™ÈL¾-® €‚iG„9Ì;XR½DJ0ÌÍ}¦eî™Ù¤5m6A„a3…ÛÚaNJì„-ŒˆH™Ì|^×™±×”ðm«Þ±Ü%4@‘쩽‹ˆY„{X,¢sÎÖŽÊaæ{íB$Ha`Ž#ñœ¼)²Áƒ†£‹vÒô˜>Ò‚8[“Œ#¦ÇGŠ4Ÿ.Gåf¦ëa„”ILçPÕš”‘Ù‚2‘îJtêÝÌv‹jâ‹‹0Æ03iêÉB]ÁB¼+ƒ¤_&¹'A"Âi"HD¦Ï¾ | CkÍÂ9Ëd¤ùp"ôÞgLbÆæ‰ƒ·øüÜ¢&_­y"+Ô( 0†Ÿn$°q!Fïýq0÷NÃûŒ£@i÷ºVä‡Smc !Þæ#ß2VäV‡õÞ¯ÛëÞ{Z.¼ºPdÄÌ@ú$ "Úl¶‡>݃\¹¹©ð=›ˆ‹»#  Í`+,„´5©H™*³D¦²©hˆÂÜg$±”W…«*ÒÝ<µ1hÑ&ÄaæÓŽzš‘"3R™˜Â‡'(‚¡ë‚ˆ¹H¯Ònjíˆ8¡#i yo—ô–ÙlÑYgFP´eÕÌ;ѹ`ž«ÛC²ñôPU…Ç´aŸ]ñÁ;¬šüûßÀ«§÷ߣgïѳ¾®$ñ:LV N6ŒisÀ‘,y¹|¶WÄy~ùN¼žþøä¯?»è5ž}ùçïÿÏÿü_ÿä{Ïþú?úúöŸÿÊõžo¯°`E/¼5#·«+ _ÇN*‘‘‘y¢¥júÝv]dÎɯdœ¦àÞXP¹ 'ffÈ\Y#hUÙs’–›"mÛSk-‘AÍÁ>clxv>g$Ì›ªÍMˆ‡ÍózÊ9–‡‘D„ûÞû1ÙLì]xLØ“®n½­{d7í¦ˆ‰.ôš¶VrÍG¶3?ç‹p ¢d@ªéécYÄǾ Á‚.x &å…“¡*3öÓÃJ 95ò È@œô0ïÊ«ËÔ”T¾x”Æc¾÷îóÍ õ|úÿ¹þ8m—_úú¨Íÿòóöýã³+MÞý{¿¤/¾ò¿ûoOS»æewD‡Eâj¸^1-¼ë"ϾüŽÃ£Ów?ûÁåóg²ðN¯ÿê39å ¤íÜ^¼Ü6úÚûÿèüäoüáïüáŸ6ŸNŸÑû?u¯Gvy5®»è’ª ŽW4T’sƪº0-Ÿ?¾þÿê_þwÿ쿵}×¾q&Χó܇2A›în§ó±%È"2’È•Ï|b.ÙÂ0‡N/o´X@?­•KTŸÚ>â’æ¾éì‰({ÞD7"bá<‰ªˆ„¹ÞéÊ?má‘][+”?"ZkÏŸ?¿Ú¥¾û›Íš9Kž"æ æ¦]ÛœG~ ¿•îî»{¹iµö#KNnbEÎ#Üä@©ni&oÿ\?æ52wW¼Ñ8uÚy€T®ÐXhÑ „ŒhŸ™cŽFoÜ,Ѹ$Ê7ˆ>¹¾Å1(zïcn÷)ضm\Ù¼î­5aö 0ÍD&©â/r;€Šìª¤n1…y¦0"ˆôSw÷@£V·œÓ‰Ëíîxñav"žÎ* lcWªºv ‘VWã>¤@U¢îîn¥„÷×ñ€¸r”D\\.›Á ßÇQáy”×Vøá}´”™§ÓéútYz/ÂÝóæTVãWUa“<,©7#Tc4•iV«¢˜¹>-YÀ@¢¸Y‰¤Dš‹öaÃ,–åø¾[+“ñDÍžjÄBHd U•UJ¥Ü8ìû¸"Í™1º6˜áˆ`÷$8žIrüÑÈM̼ö^ûFI.kÙ\®×¾.ʽƒg˜[´¶”-P¥`S–‰~£ðÌ4‹ŠºkÂsñpôÞ{ïÏVS›ßüõoþÆ¿þÆßÿ¹Ÿ{þâñÕõ[„•<Çô€Ï`›HgUe%˜]/{__šû¾íûxýê“øè{ãÕGƒ_ÆdfU65v^X—Öì`ËìÔôjÃL»¡ÏbÏŒÆBqŸÍj!܃EÍŒ½÷Ú¸t]s£ ížÓ6YÛçÿ/mïÖkÉ– }ã2gÄZ{ïÌ<™ç—]EUùVq7–m@FÐHÔ€ZíFÝB–àÁ â!ø¼ðè.’HH< na!°DÛÆìÂÝUvµ«ºêœ<§2OæÞ+"æœc FÄÊ]Õ€\µR™;÷^;VļŒùï²<Ä!ò¿V~ȸ ¼l0±Äýv_Ek*Zf˜­îU5ªRêèmbÁháˆ`„èCkaæZ+QÒí{_†ÈT„Ü"Fvd¦C‹Çö°ä<¥ýþz37»9·ÞƲ±ŠŠN[[-»E?Tÿõ7ß½|òò³ÛÓÒ]æé\&i&OOÏß¿yïÅ}ÿôÛ:Dìáõ[u.‚Õ[ôÃ@"`Üݜ߾z]Γ“ÁG¼zè~¡ñæ ¤¡úùö4=yJ·ý/ÿüÅçŸüÂ/þóŸ>Ø?úÆwkÀ§÷ž¼µÞÛHÚ1yŒ`P.Dܹœþðÿ诽þWžÞÞt3†iTß:ÌË4h„GÐhÂÂ$!¤Aìt‰Ñ{Íoê¬D}ŒÐ4˜¥œ“×̶»£ÑÉÌ6¤^ù¿;SA("êùìPbÛš€U4éDäáæxŒðÈB¤BÞŒ‚ Þ^•½AA‡…yIª¾K9¢3#M¶†½ëÞžôÑZ§ëVŸïŽØ£+"Ì3–]˜ó7^[0VÎ~<D>÷8o“7P*$Ûõ’-†¸Î·L KÞ(?ÊθÅ×÷Üçv˜ B,*èayKŠ~Lf‘¥w gÌ9ý$ÜŠ0#`~­6„8­©ù]Z$öéG;.½ÿ¯y"IßWêÔläò± vŒÂ8l}]6" ã¶ Õê¢ä™î­÷9ˆuÛDdš¦HYXª1DÉéL4Zcwg‡º;‚ð» ;ü½CQx÷=»ª.éedÿœù·fã݃H)µ”¶eg""uR–Ú™á½5ã¢n‘1ÓœC#¾÷ÆfJD„@%bÛá¸ÇÀ{\=OùO5³àdâ^;KïêÀ# Èvj´mH¦Ø"Ü͇—Y’ò2Õºk2Ý&Y!ÀWÌ~cߦÙýp6Qb Ný+Ã"Ü(( 8@Âö!óáwÂð°Á…ÂZà=DÓ\>"|Œ]¼¢‡„ØÝá±{ÑF`>Íc ÷! !&ƒ 7d®¢à 0ÁGzêæ¾âÄœQstP‚p¢òŸ""7%àæÜ5؈FˆsEvhÈg¶""R-ÂÂI€§÷ÛþBÞm fîuöÛgüíO>¦éücæ~šJxònÞ9zfV9™×6ʧ¯^¿Y¿óñK}þäùÍÝéæõÛ‡fc®³ÏX×Ö/[ÑÀ°Åc$ùàN[`€ªêè]UÓ7ˆî-Pˆ‹Šˆ¬ë¢Tü0 &÷X}Ìs RémUUGÁ«{F’ä? H/!‘)ƒ«€›ùdfJì*¶nxUVvg¡ƒÀÌÑGëp!Ç\yÛ¶"êµz:>LÕ̬÷zžÇ ©µááa)º]š(™YaUbÖ°<Ñ „ûÖdâmÛàc*Õc ™*!bxÄÓ­I ;êi¶¶Áýþþþ|÷Ìm(ÿ`ÅöÝŸ­ø“o|ôy¯c(Jµu¶y§>¨Îç1Æ÷‘Žûvèi³þØÍ›ÓvŒ³_ä•…Á,ËR¦Ý<#0­Ç³ä  Ë÷µã¾¿Õ~NÌ•*¥ ³z_ó¾åΞRL3»BIáƒQ4¼r•f&:L"—³dÝfMæîŽÝÉ á‡Äó ïæ»ÿ[ä°ɤK›mwïcd ¸mÛU¾Ü?ÌÓ.¥`v˜–‚ØKŸÌŒÍ5÷ñëJÁá8kÛ& ©Ôv-øøöë¶‘0ƒ‘Ycôÿ"ôó°Ì«&’ZæP´Öjj{߯kÚáûá¨q…ˆ8¹Ýcì.O9ð„VÛQÏ«dL݆–º—Y»‘„HEÉÜÍaî±B8€ ä‡ Üed¢„uºÈÙörrƒê1`T• â {ŽîÎiîæ±Ÿì™ ,* KÏp]¡HSY˜!¤"Ù9M{¢PÞ–Ô®s¡°ݦé´ucÖ-xvûü\8¢–Ø|#÷­=,÷ßþèá“O.kL_üÒOüÿú¿ýÏþK_zö„l|÷7ó7ÿËÿúï¾üìfôrwkò»»Û:â¡ÕŒ8¨ë¹ÂÌÁ´žœ$J¢[ Ëa3+¥äÔPU!†‡0o1J)1FƒkB6ƸÑ)Ýäœ#õ© Ê>ÝH•¬¥¶7Öuu÷rš[¸¹¹±VT¶¾¹ûétz·žùn“§ <”-Ü»3¨NÓy>õu Åf]FÜu·ZŠ›?¹¹­·mY×õÉ{ÏÌ}Y.æÁ!c Q!f1s&0PD‰5¢µÞ´ÊÌ%Zçóyé„à}0ö8‹¶®µVeØífš¬VUÅöCö_ÿŸ.´ýÎ7¾Ùâ Ü.£mSëöÙ4ËÝÍÎ5”—'O–õõàSŒþ;ñ€LþzÜÃqÿv“Ód«>ŸëM,Ë&·“YÃÆ7p£Ú·ûOp!¿éxÚz|çÏþþ×>ø‘/*kä]Ÿë‹²^6_£t —qb•h1°CE!Ý?“úä¿øµ_ûÞûw?øÒ =õîo„&øx¸¼)µŽ°·ËwEJï“N’ ‘bÖ»@Ï58B†»“s€€BpD´. Õ½Îm­ÍSa ÷1 (:çN0†)¬D@@Ä먢¡âæ.EÙœz¯LE¶zª€[#ruq¡  D†™3¨yD( °3 1aFjk͇O¥ tïÍÁîÉóW­wŒ45Pt˜›Gà€›-Û–«mž Ɇñí|VÕe4ä1Ì™û°¢çÝY| 9‘ÃAºç¤Ú@¦%‘nÝÝ‚Þ7©`„«ðî-#Ê9†ÙዹÎÌÜÝj™,|óÑUÙy4‹°Z+ªÕÝiíúÏg6¦ˆËXXuž&fÎkŒ š?{ú1–¶À4¼<ùðƒ‡W[…­1À€⡼µ¥£ÙÌÓW~òg^½üÎ岜Ow˜N%vUÁVˆƒvª§Á…ž¿÷üëô§_ÿÚŸîŸx?zL“2s„;ØÝ‰¥h™¦‰KsxE½91sš-…!@o]¥r‘fU«T¹ï›FryÖgæLmÀnY†£?òXɹ«4É"ÌPæ–f7­7p„xé8Eò·»Á=)éB¤$ŽAâȽxGÚ¯¿ô|>ç"Î.;ü->ư±šs.»Ÿ:3{µå|r÷áN¼óá÷V‘{Úg¡ˆ=r<££ýyœŸßy;I€•¹÷ñ`6æÝ¤¡ÖÊå@ jÝ3>®È¿‡’ìÞ@ð ƒ[ø<ÍhðH‹‘+v²CJRÓY¹mæûq–æy&3[–…|>¬Ý.3Y‡Ä#<…Õ´; í ¼M÷wˆÅ£¦Áµ:y¬?¨µ&ÖÛ¿Š¡˜¹¥ÜnG¼Ø FÛ.kÂD”έÛT´{çïÁW"éåÎÕº» $ý²dg=î¯Zk.jf©é# sLkÀ5È<Ò!©”º{l„ <âèÐUˆ»s˜do«åg¼úA¥Î%¡‚6:€2ë™2½­˜yžçÁ¬WäcG&ÄY»á:<$ˆy?ÑÙ?ÑáVyµ—åCÄt½ÚÝAUG‡$à„ëEký±µ{‚ bGf¯ÆAºâ jfi¦¾¯­ª;´>vë¶Çî­5Ô4`!R0C@;ºÉ‡ì9¨°Na0rK¿÷$>={ïz—]ŽG}½|]§óõïÌŒG¯ëSÆ£1ã‡úïúV±÷ ‚‘‚ġ뽻TGH„#Ðm>Ug©†..¶øýÖI”^½úΓ§óí³óÓä8—"µÐ@ˆ,°7ë¶®]  å|§wäÛ6^ß}ùîoýÊ/ÿW¿ú«Ÿ:žÖòÉëõ|wÛÛ°IOhýzœÈ ¢ÅÒzÔ3†<Üw‘9_•‰Ù9>;óU10´‡…™UDI´LézœGµ|d´«ìoøîΡꖻ¤$\Q*Éè°çÖî IDATK>´ô ƒ°a¾÷I™)Ò´jx&PEê1f Ø®`ÊßÕZÓ©:QkÖ»9ÀA‚né;Õqض‰È…¹0Ǧ:=ñ-aT3ãcˆö6ò#;‚ˆÜ{@`H'?Ñr]öÿ‚¯¬þøÊx‘Þ>Ú¬;ô~êíDælAoï—Ûç')<ã©]|Ù6¤?kTAN2(.ãíǯM£<ŸoožÎõÉ¿ôS/_Ýòé§Í/ÓÉ.÷oHf·Õ Ê„¨'iIy[aíÝÜÂ-z¸ …;‘1³¹·Ö4—Ú[³c¾âêDdïr>qDTÒ²\hçˆìß|]_"™v”yˆöá• ÀŽÃçýù Ëa;Qæ’Öjà,5MU{k×%éZ÷0 <ˆÈ†¥@P¬ðÖTX„<|ffªLÌàȤ˜L0gyƒ)ÝäsPÀŽ­ÊoÜ1|’3À Ýýh&¾ Ä,ñ•×*$öhÐ ‘6:˜onnüQÚñ|)DäÍLDÚn£ªø°¢Þ=…DûVÇ;PlÌDœJ( 'G ÓMͬµ6ÏóžGš Âkës‡Oêª0@EDy€AV›ÿOÜ£»»›Ÿî8ónó÷ÝlWš?Þã³WÕGgÑô­gæí:¨µFaÉ1`»\|O{×khÖöà 73´ž¤ IyR0ÑGk6 qµðx”µ„wuÉ’sDñ]ÕÄÒªÙbK6>Ž}:Ü=DLL6T&ya´oó§yöm3³UÔÃɃ‰É'vZÞ\η?Z¸Xëp.5‘c8­£o£?»{.ÎäÑØü~ç~zöÆ/?õ‹?ÿ×?ýä¿ùï~‡—m®7A2,ˆ+“ŠxD€ÉÝ…4ï¡­»u'ÒŸWC‚£zˆáòFíþZ§k¶­›ˆÐaØ“EŒ~óDÔm·QÙ×w©Å(BŶ†ÜJ¢ ÝÝÎ)œpÕ«ã‘3f-çiêfŽpŠ”§_|Ì|:V[˜„KQ ’aæ&”}á®Ê££K™ÝábÃ¤Š°ô¾à`‹_Káiš’|ý¸½[ç¤n, 2<®Xÿ¯¬þ¸ÛæËû<þ±Ög—‡~:qwÛfy˜ûíÖÖ1–±µËë!ÜbzM6ÈE—‰^° c3{µö§ó›õ“¿üâÞ·›xôÙº½ñX¶ˆÊôìé|þ¹Ÿþ·¿óõ?ûî:jÝÞz²ˆ—ý¬Ï¶§¡²°áÁ4ù` ¿¢“üù7?}ûéøðó3I[¼ÂAf!£*u “i¢€¤‡1h®%¢¸¦›¹µ•™:¼³MU )T1Csñ³LËÖ‰¡ó4ÜvÙ·ï¾Ú×áèî"™Ê˜uqÒîV3¨pLÔU%³0‡T¥{7ô€¦ª­»ޤ`Þ {Ò*…{¸˜Ù¨P`DT‰>¶"ZkÅœQæ[êQœ2_[z‡H wbS-ë²ëˆXAY9š‹“‘Ã)óX2‰@w㊔[.DS©}Û¦’úF"%³Ö–%çüê‚Ü’ÑoÔPHƒ³7ŠFnQæˆØ¶­Îᾉ!ˆµùatO. €é4w·Ö{añáY´ñqtãƒZ(‡€á{¡!dËç$Ttq'7ŽFY Xƒ ÇpiØ8ކ”{ÕàýˆžZ'ÃDöºÇÉ.ZâmP„‚´tˆ±å#Ajj•ÝÝg­Tr9K;|baÁ"¯²µ ‘n.$§ÔÓº'€– cO´ ‡ReâR),XÅÝÝv}„ª^#ßÂ(,dF$b ¦ÃméMk¡*D$ Sdè`d`äy€‘u‰`碆ðˆê4±æäíÓ¡Õ-À’5 “g÷mO¸I€HYˆ(÷6äI&}ºŒ16s0)˜ÝHÅÚZÊ•“ïU’¶‘`ŒáˆÔ;1ƒ™¹ùÄSD<=?_׋•r;Æ®¼'Î ŸëL­'Y+OëÒæ0jtû¹ùç÷׿Úß¾þÑ*·Ûƒ-S‡1­{Ò³GRM§Rû6TÏIÍ„U–eQ±\<¢Té}3wPè#Â_Qí½K) (s9f䩞F½o¢nÞÆP1‘0q.íÍцS{rsöÑ:µ­…²¦Y­–2Ü[ï*Ÿ“q“¬ÌAVòÛÌ$v½zîÁyï"{”®Ó-Û9€®äj†quბÑöŠ'Ãtè ¨>žb9ðÒ×üŠ:|ßÈÜG#!ö€U÷+ñLØ„”rI©ªYt{×qߟàHJ»ˆ2zä{ y03yxÆ 1‹³G1:×ÙćKr\ ‘Tq78ÂJ"º¬k­µ÷®™ïæ&"µÖ}—e‘‡ûÆÌDE@6ÌÝÝ<±p³jNÄDr:ÍYbÙ†‹ˆªÀv[Õr&òIoÿ½ÿôß:Å“©>ûØ_ÖùYµÛÒn[|v%tïÃOeE‰‰Õmp³9ËýÝ7-:{ñÄüN`xmmämMóÐ}É倅Ysîáô(ìðxA§ó, õáažg"FÚÔÇf.̳ò8‹à8ˆP½·Â ³£ƒµÃkQÆânÛÆªÓ4œˆCX#LŸðHš±Ô¹¶uÕ¢Ž` €›fñhÓTªœ¶m#%ÁBä"DÂ"$fìômC»,4Ï3ˆV뙕õý+ïÿçë¬?Ü×7oÏÏžŸ<írz³®/ß¾ùâÜ"”JÈmñî͆@`ÍQO+‚ÄLËÛû“žÑ-æ*Ê«õ~yÀŠö@Ÿàáó_>O´ UšÃ«a°ÆXeþÿóOßÿy½½=Õ§ÑüÍ'÷UÜmõ™¹7Ï$^+H‚&*%ú©jDùýßÿ½æ—~n>Ÿ<ˆXÈ‚ŽŽ½·Ö`ž-ÿÌ#3¶hŒÆ,n¶Þ®Ë€>ŒIDw 9vÚ38v¤7=ÔE$yöÅ—w¸º1Ü("Ù d.@eònû‘~‡l‘riˆb®²£N»oŒ,5 N"G ™ ,‡¾dɤ‹H)4ÖËÛ" ¬²-ÙtØ“NÃ3h#´äÚ”%‚‚‚ÈΨ›çúHDÓ4Åá6뚪š9³8žF…—Lî:(pw9D7ù>ëº Ô»•ÂÌÊTù˜êAäÇ‘îñÐÍû/"íÚ@É›vuûÈ¯ìæ ªŽü-=¿˜ï?Ú¦¤ÊBÌëh–¹ÞØy©×}îúnx$ë%¢Ô…º[’wsYÊ´>2sƒÙ–åªÇ»þ8íü+81D31Q´°1ÍEƒº_Ú\‹bìðòµ‡â)¯Í¸9B‡{ÐÙ"R,•)´‹&ÞKk ûèÕd“õ¤¿ïú#Þ­ìYÚ¾ZˆÒÉ‹4"»¿­»g2õu=M*4(œ±ste¯¨”¢±7ãµÈ1øw/óÈe€™U9ëxÔ¤ÈÎ €Á;Q }ʯí§|] Cé7"é&ûîNüŽ“m&b?ø¹mʉ2³'!”˜x[}1˜–ØÃõ{r „‚ÉÉÝÆìª$,`ÊL7Sˆ«,é:Oý£$r=±ßógDÜÔ€ocnÙfË{Þ{Oíq^0€mÛÜ!¼ëkÒŸ01³r,‘­ï qŽ•ÖºJ‰ðme>Ùˆ>Ƥˆ  oáZêÙœ~ëwëôÝO?Šÿ?ùšÏ"xx7NŽû& +µ„™cŒˆ:WŠ‹Èè`áRt£y´ë]Í%Âl¯’X3¥>šªØ#2 l.~&Ü îD`Õ¹ÌcéµÎ½oƒî"EˆmØØºÎ'Ry·Ú“¨VA„!ÌO7§nâBak("ŠªÖÒS—GÄ¢FkîÁ Iªww&`Ø|>?<<ì빘Ð{›æB4!”&á¢Rº™eªó4Ò"|–²õeYêím>Sáþ¯¬þXØÅ £I.÷1jù}û+/Þ{RuzýpÏR˜Ñܪhkx‡Q‹ö¦ÇM@€–BïíæVî Û|.“P»™J¥é¡UϵD«NÏ¿ùíWµ>·k{ôþâÉÇÃ{UŸÏSûhY•·2?x7£Úƒ •‹­­÷•Ÿ}ýë_ÿøåËú¢·Mµª•y¸K"®µÆ0¦iòam¬+¹ÎBAmí•DŒ ѬÍòae»}]W«âLnQkm ³ª«8!n™9Cì®Ky"™‰å®íf!"CÌ̪W6 ÞÉ£”b±oÃf€žß“'§ÜÉøX;j)ım{Í”»ããÞÜñÅÁÌ­5¦ªáGV§{¾O)SoMt×Ùâ8¯vÏ6" ¬Dùáé;˜¹(N¦wº{kM§Y•·mk­±ÐƒÃ÷å‘]ðL÷¼®kWá‰ÙF$ ˜…vzíëx´Ê£b<™:{P‡<Ú_¯P ŽŠažç«ÂÞ9À‰IK,y* ÀÇÈ7ÏÂw¢ÌTðd<®rˆc/–ÈÝ÷%Bsç›§)±œ+r¬bûéÿúV­™ªÂQ¤zw£Ùj€¼¶ÑGå’Ï÷jt™¼(f”·“Q½î<¯S©DDG¸`nº«”‹²»ÏóÜ{_–åªÔÝkÉã ˜F#"rkI7ÉGœO¡Ô𕇄S8º™›Ë1öøË&$Ö{?N—Ëå˜,–ÃÌzç= –3ã)ĺ®IÍ6oY7ÓA„z\£äÌMh„©*3T™xßuü0¤¹þÈãúãææ&~ϕۇ;ßã£À>é]¯½1Ë)‡“ˆ\‰&9²b>MÓ?¥äP!<”TDˆ9"wgVVbâ”2á1cúˆ›¸T:X_|˜µ'“.+ lÓióËå’ûÞ{ðsÙ©ëi˜ém¬"¤*ÊÂÙøhÝ‹f=ðÈ03µXÚ&"E'3ìÅ'yx° ŒŽZN—íÿúƒon¯ž¿úhŠñ•î«—W×3ÝÙ›ëSð¸lTTkY{Þmk7R"Â}·BLùë¨Î[QJ,Ȭ¯·N…onÎëºò¾¨8àk¸ë­»™¦mk1, "e[¶Rk WÆ"ì{Þ$s2زx²Þ-Fœ´ò´cŠË¶uÁ*†1¨÷n#ˆTušªõ«qœN§õ²`ØX;«Ì§Óp{ùòåÝÝ™±÷¡ZÓØhk×uÛâB"Ê’rñ0óŒÙ4‹©”5=‘½'®ûý€øÇ·¿óã_þÂòz»ôO1ÍæOý×ë¾iþÉ}ÃÍüf{µ•qšlô ˆu. P§A,$õáa©OO\8jôTo¶zëø“µßƒ_lëhÃ9.2$bD,*÷˜žEÕ¿ñ¯ýÒ?ù—?ÿ{ø¿ý÷þðã—½œøÍ›ïb:ß:NËý”jg¼éŸ9¡¨*–u¿þ?þ/óoÿò“/M#4øD4“¡0…»m‹‚iÙú$¥bpôŒxÐL­s¶,&YæFYgøjàÞoKáôh©Ô‡©Ö‘o¢QªsÕnŽÎ£{á¨:ØÂ)ª”!›ÃÈMD2 .u“>l€H$ˆ…AÆÎfPV5¢á¶ª0õ1,SÖ—FDé‚àîoß¾½9¹c¢×ó\1_î¦RzD'E3/bLìFÃaá,`f €„ƒ„ Ü™µ÷AÙœ‘µED±†°æJÕZ0 G¤ÙTj¹±Í…Ÿd’wçcÛwë}ô6•"rn­Ùw§9w½ˆffb¢0;M“YH)8À‰½"S  N`bYwr!°À½/ È ±»¹“˜À¼YÏÝÊᘒÐ4å ))âÙ"¡D†Û8½ˆÌS*ù(‰ƒÜ|g!>ˆ‰ˆê"‚ªlÁ{g\ bî­ U-*lÆξµE„Y¸› jÀ¨" ³R°Œrah. `’è}"@²GQ§É|ø0 „‰µTVíhî0fâ½u¶pw-Ì>Ú¶u csHjqsá½÷‘ÐÂTÉÃÌܸÊé1NÍÕ‰F$ÒïÃÃËÄÁŠÖ.E‚b³v¹ì‹>‡ªxYD 8TuÒil#"".EZ7òNDÂèË™@°î4tOÕŠËåÂBY.PÑÒ†Õ#,<†åÙ=BAà °”!Å¢Î~ '" ȈYf’ܤû²žj ,ÖSòX¹N§î^´’»ƒ›˜ç[#´0kÝcp‚ŒÃ…ÈÕ‚m—Å0')tT·$îÊ øº]ʤ¾­Ò)÷ß¼ŸcŒRŠ+nGÙz%t§qž4LÌ8ÎÁ Iq3""ŒÂÌ<»;‚¹»•B¸jÁH,4Hƒ1‰!šw¢¢@!†"Åc ô»o=”Ûo^Û 4#ÄÝÜ·zšXPjµp¡‹×Ty”¢ÛÃVd’‰êDmŒ5V}òâ½á6M*D­5Õ@¥¸rô¾‹[@…‹3³[k=˜yªs ñãÀ¶l')Þ;õ-e*ýÿ_|üñw~ì‹"ó©÷¯>åᯈ.=øüD‡ö Ñ.Ö-¼¨Ò:bíðˆáôì.h¡Iƒd}óÄ7w7¼¤Zušêt´nÍ«Ã[ ÓÅ•?úø;ÿí¯ýO/~ƒ§óüé˵Ї y:=Y¾Kð ­Þž[ô`ßÌ.`Ú¢·ûåÙéÅïõþêwÿÅ_ü±Ñ«JÚÝä!"g{ŽØÌ0- w³8Yi¢Ãû©Ž™ÌFHF¸!äÐÛù´5Ý(À²«%zxø˜¦É ­[„ƒ¹”$až¡L´,³ŠH±áèytNF‡sì_~ÒKv—Æ®¿Öàù_/>xÿ³Ëk2SæLÍÜc 'g›˜EµÀö6 ‚›»›»§ÓWM÷ßÀzõ]~‡(_/ Xž¯æ§GßÛ§È;L·L× Öù ·Ë%oÐ¥mµVd^`¼Ã9sûo­m[/:ñ#×Z÷½`fØqF P)(š˜å@0I„§(ÉBÈSà>×öH +°Ã*Ì‘¦™p§+Ðr]Í#woPº13Pºoyˆ$¤ÖcWJã@ òùaŠ×€p6¿Š`3jŽ%œY{¥èµ—‘¯ª)?¾Êƒ#‚IjÖuݶÍÛ‹eÀa×»G¤3…’¢³‹ªðèYãò¥[œ…Ë‘z…sŽ n£°“ˆŒ¾#tpGôŠˆU…9ȼžY“ôÃÌ4•u]£ËÎGæ)× ]%T•£Ç1,»Þî{H™OÓD 7,3évߨã |ýóZCÇðp*u7Ø0B Ý£l?i¦Wªhê9ßQO"‰¢jÝ©“ÃcŒ(îcn¾®ko> Kz &ÖÌ0¶Æ¬Î,d8|µF»éN±­ùÝé¼õŒ* ßÅç9Ò’ ¥åPGÇ)DQJñGº÷išÌšÇÈäÞ‚ÚOÒq .a–…T9狢à ˜ˆ)ÂÍ‚„©"ÈJQÇ¢ #HÑ·oV†„ÛfRÕÌ"\XVëñHϨH¸Y¿DX0HKtïC*áB,ó|r¼‹ƒ>N‰æFÈèÁâ̲.":†»SVEK$³¤”rªÓhÝ“ÆË‘…+¶gn&F)­7c\Æö„ƒ‡WÆó|³û¾‘HÂØÄ‰T3o½¥±i2´zx€1ÌZ ‰®­»ÇN‘ÉåúúDêù,Lî¾µV#Šjx8pww÷ðð°®+‘Dì ¿Óédc,Ë"<1sÕ¦ÿé§ßzõòKoV1L„åò_úü?õ#|íãoþù·?1{sùì^nPëãAμ-ŸQŒèI’.u®“JY.U§‰5ÆÚ{ûðƒÏÝHõeZïž~þ Ìšãê{ž]D-eëK–n™2/¬DTkeVRzèŸyXQÁÎe "q>()BŒÜïÁî1lH)Ž˜„¤”’üܼ¤ vxa•R†[·1ܧi¢ Ží GÐÚkõB„€ÈCxWBúqSòóî( ©ûZ—³"(…¾û½¹BáÝ×ÖÃñMè½ï³í¹¾é{ˆ@Â#CŽÊud ”xd?"('jâ\ bIßÖàïéæ *ÌÙT³Li齟ëdá`v7"Ü…Å™¦2q€ÌÃÃÜáƒU*¸žª#ÁÑE‹Di$òh½ ©ºÙTëð±´°{Áeñ—Í‘ð½Y3¬‰P¤‹n-¤·Öj¸+}OânB;kkù¯üzfž&aÝ-"ZßNRΧiÝÚOçV4iõ©˜Ù2)·:IÒu·Þ,¢Ù6N:7ëÉêë6”%ñÑŒmÊÙ—+¶µØ”KfóQte†ÒD¸ ‹Qï¥hó"så¥H„ T++sËμ?ÚÅn˲PÑ|¨rGofihÍî'çs­›­ç™,Ze½w÷þÓ}rÿòþ£Ï^/Ð4BF»|‘z[[,0x'Xioâs?ýå:Sï¯^}÷øGп IDATMD{õz“©bzVdæåôù§Ÿ§¹½¹É7½¿)Läf€{[ž<¶-ãøïÿç_þ7ÿÕŸú‰§ù¯üÌ×¾ñ­o~k©óùÉÍ4–nDhé^O7´\TÀ ë—ét3½7ÿo¿ý÷~åßù­¿®¢DO»nýažçʺ¹{ïŽÅ·RŠ”Ô€P ÝZsˆˆ°XëTX&Í5.ˆ eïOe¶œ®…1@QnCˆ[»”RÈ b)µ÷Îd€Y a.}¬Ù¸Q³ Gï-0Î"@wAsÂDT˜0 ÞNuÆŒ2G%±L‡¡'aZA²m[x’˜9ÌhøžãÅy˜œ@pV>mÛ&ϣў ͤ>³’G‰0#aŒÞ)@:²`NZ("==#˜ÔIS >Y93,-˜*qC»Þn·ÖZkÍ)™hî{Sõ1j¯Y´×.cfð¨Û|ÄDw¢C7Q¢6jÚ, L)˜1‚›ØÜ3ácóµwrb06sï*,ͪ 1–-9ækéFÁ1»7‰Lg(€aÆlĈœ1¹ë!h– ª#AU¥I€8ª^¥[…Ú…A™6¶êüA-ƒD˜’Ýómæ„´ ²9äfY!Š”Ë$À ÄAéQN:ç™J%3:„–œdæ ã()ª´Ý#h'°Ù|”kÌLÄ¥ô ŒðX„8À”‘\*’ 2™P"I8ÆTK1uÔÝC¸øÅš4'U}9" žé]9îHñáƒ&ÊÖËâ4˜á¶e&SZŒZÉËÆ f÷ˆª;"%…ÀDœ¢IÁâ“R2¤q ‹9Ìq2O-¬+Û0eW£„_åBD™… #(¶ù&­ #s†1›%Q·™2Á,"ò®¶!Ó¡cغ–ª® T,Ì»jfZ¦¬‡m—E@HHÙïsÐAFá™a±C(AV*Ri÷9öakSûù—ãöd¼®*O0cÖ¼´ðr4vGšAÄÌ–F°9§…·¥‡û‚$>Œ¼Úë>´¯$F‘’ûˆœyë¢ÙaäÜe›wuåð»Q•o ”eŽ·ôOr%ˆE9«˜CÀ¤ûÐEº¶ûþš™Á¢m Ç}Z¢5–@2§9ÙLo¾égËD M-‰åjä°uqŸY|¡â9q¤ˆÜ'̃ˆºˆæœ”ÙøÊ!¯·/×KK`˜ƒT–æ ŸhØhì‹)19Ó£ÅXçdÇî} ¦[ø)È?Æú£éxZ®ÛË—K["ÒçÛ}{ùÒ÷Ë/}ë«ígÂîûvC2¦3x‰OŸx±ùö™Y*ºÈQ~ëܵ•‰+'@¥( ¡E„‡e¸²v‘$RN—¨ÀÃAUT(ÈÝ=BUU´X±yÊzã@ÈÇóˆ÷r÷âÖ=;  M'ਲ਼‡q™ÛêÁ2yØâefÊ„ŠúØ!B¬¤0÷4'¢ò9LÎt·c‘¶–‡5e èI*‰œ1øøàü`}f&1©Š{,Kc–2¬Ü‹,L±ïCõˆî{Ì7‹kfÂ,J…f0 ‚"ÑâY–óYúDe›ËRÖ‡zí™Ù„[›;'{ƾ[Á9ªmÛ6sPÚ/eÆr¹TZ½¤("Ìfi>Edë]Ü­u‰0¢¬*ê iRDÔóŽý~·–¦ –$NJâdìûà¥ò…׸ª·n6¦1€ûmF@µ¹]Â3}ÛnM˹¢ˆH–à #.iG,">=vKéx§—~<* +‹B:ˆ3gŸètHš 'x25’ºY:5vË™é>;5&Έ²$f}hët³†£*˜Ëºï»²ìûf^€}ß%?˼«nƒÂÂ2ˆ›ˆ,Aîc‘Ãìàv»Õƒ0ÝúºÜï÷bg×çŸÛÕµõ.²ÛTÖ6ÂÒc̑J’ÂAUúK¢µÆJ ¦4á±Æf”Ÿ¡Ö?Êë›Õ‹àÛ—õ«·{»<}}Û~üõ‹ÿà_úvi—&Ëm»a7ÁOScŸQ9¥ ¤×[\¯ÂkÒO—ö¥+ã~K–ô姯?Þ>$·Ý™ýãÇñékD\.————ç/®ßúõoÿí¿ýýçõ/-É´|ìLòz{¹4I›“ÝE(ÌŒHM$åyýðóÛFk¢­ÿô·÷/ü¥?½WŠ]ôyxh÷iž$gDV¤Ôd¨[~¹¬Ì|ßïÍ‘Ö<^–^S£YgžJ¢,Š<¾&³L[{/›ôp_—Å×>}úÔZ«ŸeaS–ÖZk}ß'@"✡åp ªôø1Œ,š2àËÊÁÄ@Ü«89v´•ŸÄ³Y`8T{[$²àq_0DJ·Ò[—`ȱ›e0ǵv±9’+^6A‰ÌÓÂá,#˜ñðpÎLÀˆR„Âü°Bjêhrxr×€Yõ!˜Ô¤¨°o–éÎ@{f÷t÷A`€É¥¹õ3ˆ²ûºLH÷²š.@™™=£SKóeK–ÙÆ¸§(!Í’9)2‹9ñ¨íê|zD|Råº>Któ .‘´Ï{ÜãUÓ(3»^¯…%”ß®HES¡@D0д2àæFIžfñ°Ü.Þ—üQèÔðpù%†2s‘K²Â ÑÒ J*˯:N팿 bªçåí~ï½{¦E¦hPeš“ÀQ¨U2MÛÂw4Š‚|RfòÌ»¡#©¦0uYzïéùø£Ì,˜"¢¬\êŸÓªþøÿu`‡;û¾1“¯³FI¼óJ/‹°¤£+.Ècp©ˆDÎ1“5ˆ•:æE1s2=xÿ¬I‘“›WLFWˆ‚¸Âê2)âêc!©jáötðÉfTþ(No›~Y#l†§[q× %BÕ˜3 ä‰,Í=AŒ˜8MH#k~øù‰Ì¢]8<ÌUÕ§ BéÑ.×ìÓnÛ¶hëDi)T’áŒK8È‹Ž§õ ˆ9wwå¢-%q¬½±QïêœîáKë= D`ö}LOɲ Z‰LHw3'=–è£Ìò™9‚Ü ½õÞE÷L²Í`V”!DIiîÆ ¹ï˲t–Ëój3âtú¯{af–.?½Cq6g™e»™0S…,DP$å«ìfÔ !J¸YÓ&,ôY‰`ÖÛ’sÎi{y”LéÂËí"IÑZórÖfzô9E×#“™’ÓÓç4G9yKkG'–•·õnZôàÈ/Ë2çlªB¬­gºOó°= …Ö—ÝÆ4ÓÖHZL§$u€s"'‚8,|lãr¹Œ1V=Ì|ÿè¯oVŒ·öûÿìÇ¡~Ìüg??ýþ¿øÐÿÔWþ“i7Ä+hW¶Öûýí6rëýJÉÌ”—ãí¿óóþ|Mýô'?ÖÞì%?~üÞW/oŸöõåŸüì—¾÷-qßfÜÑ&(÷qoý£ÄØ–ý“ßïÿÃ_ûÿÅõîùU:Ý7|då‹°æÒ·Ðû̱^\Õ§ÍOË>i„ÿÿËÿú¿ùïêuUqÛ?]d™#L…™éÜ8;ÂïMŽÓ2À‰ˆeY&šsßàˆ”ÌkËNå)æ1Àœ; 7n÷ý.M÷}ïëÒ{÷9)Ëâ;+vSßgwíÒzïÛÜ]w›”Ä̲³ìeLî$*"ɉL1B‡Á{ïcn"Â臄©™»W¬Ff¸#Xø0 'r'epYŒØl¯= ½úíû–Œ0†öéÔ4#-öƼ;/!"æS4Ü Bn ù±ì—åu›(: ”¨Ï™p"JÎh€UHl¸4Ýià86”îž[tV3¸û\™îiQ2×ülê¥q _=‚´Pœl%Q»¬÷}ðšD`Pwˆ,DxŒaÚX…@Q.œsηáÒ39}QëGœSY› SЉBÀ­µiÕ¡^nýZõIf¾ä±Ìö·MDb¸öV €C(6  ž®}Ûn7›“ó1b&x “”3é9ƒN"8ˆ[wwœ•²He™¿~öÈ °O»´•B,cF…\Ä™9ć{‘O è½oîž´>öé mŠt>‰Ìl­“j1t9຤$êuä˼S$%”ùíö ‰Öföa½­¾…€"8™3)8 £)2¿Š3ßï÷{J` æRTEùr鑦«2Ó£±F”ŸW\Œ€ô˜B)ˆmŸÆ„×¶†È a-Çœª 8 Òý¹/N|Ÿw‚['VÇBÔ–¦‰0s›ÖY‚iLj­ Q¦›ÏpëÃlU-n2Ñ¥}ôþz{»>?ísho󾓹°ˆÐ>Ëåb~3Û{(ùî¶,ËÒ—ôék¿Ð6á1çöüaT3í9ìÃzݶíÿCÀ¸1EøãvÛ>­Ý ¾^Ÿ?ýìÇ“hXÚí¸å˜ X¤i"1mùºý˜×çËUnóí§ŸrglNOœoØöÐ"ËYé·þÏßúƒþÞËÛýÿz•e™Û¾Bš^ß§ m˜„»Ï1ÈG ¼}úÉWçoþý¿ò—ÿ£yÒ•%=gì"±z#Qµi™Y8UµSo÷·uíû6›.Hè¢pc¯?›&UmD‡ÄÚ{Ѻ>¹Ô{÷1q°üp‘Þ#Š zÒ?ÏÃ@è³$äA9ìý:NVÁƒ¾ô`ö=ü²ˆóHÿ:è EBhΙŽ ²@÷+!ÃÌšˆª‚3ÂH©7©ÜOJg†à m€ö·²{"÷IDLšxdxaÛ¶RQeñœT¹!J¨æ3‹ª°ÙP€Wde>¡ï %Í,±Šª/u5mÙÝà (ÔòèóªÆ†{Í‘),åj7½w$´1…¼‹Ýyzzzùùtza–Ö:lнp&r·iV÷åñ”½ êUþ5¡Tá.¢89=¬\ƒ!}'èÚÜÝÆ‘ô0sq>7r9"˜ ÍB•Ÿž>lÛ§ÄæÑøªê¶m5âyw£ËKƒˆÈÃóZROWâó·¶Æ‰B± KpôùÃ<^QfVc DR‚•“@‡i9Íù–ð±¶tB”$S@ àLϙɪÊàT% bFœÉJÑREû&U½Ôdù~ŸÓ˜•@aî9´#ršï3ïÛ~kK/·P¼[uéæœ"!‘6-E‚眂TÕmnûܹm››ÙÃÎä±÷¶3ºà9'˜µK‘OçÜÙÈÒí~Ä‹H˜un{#G9øÞöÛ±™/ïÌ~Zk˜c_Ul¸¶–îäç¨ÝMjq?6‡3Ë:ªU¾ß·µu]»…3K÷·›C^Ï·ÛíÚ×¾¬ÛË'¡ûv»IÇÚúÜ­6Œ’3Ô ×çN¡//_«v¥1FÇ•f Øî;ñüfæ§ø¦õÉ’ 丽¼p×Ö—¼®ÿþ¿óo¬ŸÿŸßùÇÃ×¼ùÝÑÁÙ©1`,‹š; “¤Ü÷4ƒ¾o÷ýéi™ûW–¹íL÷!šBj”9IÛ÷Ë«ïùóOû¥Ûoûýö£ ±^ú܉i1ì©! $„¤dIfˆdxÈ×ûßý[ÿð?ý‹5ñcÂÍí²ïÒ?(Þù1µŠ'Qô²´Ö–9"ÐÒRDÂgÂI„[ÆBÑE¼!M•È-¸ÉÓÓÓÜÇœ“ëp`ãŸ1^UwŸf‡Zþs¾TV®^©×Gþëë뺮Hcˆ vRæv<ùï<¡ªnÕ#ƒŽ„9š»ƒ39…yY{ù´Yí˲ðÑ'+¹»OclÎÎÔ¤½o¿ŽêMà@èaZ:-“‚’œëˆdY–}?Ô°ª*¢‘n6¥u &)h¢8 ×Å=‘P!wWa"xž¼Š‡ÃÞÜç±Ú@å”L[8«œ•]D¢‰Z­é¼hÒU®…Aç‡Î*§Òê躘i.E'bq÷ÒȔı®¼22‡7$2‚IÆn„Ø7gï½±²=}Ôô½eŒ²@ɱOœˆàA½"Z.vGÆ¢œE®ÍGýñXHËÒõ"œAI@‰é0D;«~®@("‚…œ2Aˆ¨ÂEàÔ.rÏÈw„•¤v̼»"……td†:QÝžµu€fÎ ¢ÖzªÓå²Ì9Æ6.ý1%<«Éu]çÛ~_¯M›RT[#šsöÞoÛ›´#w©uJLëå ÕS:aJ4ÕãÖ³Í9Ü|]Wi PØ™…‹³ùdí½Ót7g–Þ›Ùd€U^ÞîË^wYUe·«tKKóQë^«².ÈcÛ¶E—„ßo÷Þµ³ä´çåÓ-…‘%4¦Kë3£RÇk-ôLN¤&ž¯W÷½xT…bäclÍÌMš´ûm^.˶¿õÎ ¿½ÎÇýšùMå,ßXÿÂ÷¥k°Î}#ô¥­ßúâ»öÏ||ͼü$_o ñqnL* ýœ 9A j1™+d1à„UÑ4‰oãSëŠisDA¡K³ûŽ0À©é$ÚÛüYïßýÑ—?ùßÒ¿üÿ™?ÿçó¯ÿõßúúgŸž×¶Ï±\0ÂF„;ÍÙÈ8I×Ëú;ÿà·ÿð?ýÖ¿¾gÌ!WË{í/CÔÌŸ“å«á`ƶÝÌÒ‡wéÓÙ{/yÌBOw^%F:I&c„ûýÞ{¯¶LUÝ,"™åÁ«jÚÝu] §QGž¡éqFÖn˜¨X"žsónŸ§µ,2“üèqJBJ9vN.ÀÃçT]ñCŽw´vmItH`‰È]{Ð<¸Q`T¼F3C% ${™+Sؘ*ë¥5Ìí^vR²{Zºà®ÊfÖ{œsL.Õ×õZüÖ÷@Uã£;{„4cO PÕ}ßÞÇDt³‘Ê·±7â9'ZÅnCU4#2C@1¦@…È,ÖÖ—Þ¸"@¦"å¿––˜/ýn£¯Ëtsw·XµõeQUóàåå¥q2óƒz•L»ÛÁŒ‰æ~ßК°¤{â)ûÚjm?À×oôúfõ7âNû}CëN¼MüÁþð_þ,íyðGÍ·¤/~½?M?³×9·;Xó~{…€„"É|¹ÊÊÜ´Íiq‡hÏ[ø=ˆ±<7fÄ`¨3õž¸5 »ûõ²v$#åõç=þÔ÷¾—ÿÙð?ýϳü6ïyÿúG¢cŽ»wÙŒY®˜ao—Ë¥?ëÏþ³ÿýûkÿÝÿß~ò»éÝrŠ5‘`r €»öVÄc hö1Ý“ÜDhÎ[f¶ÖŠ'  -:¶;<–e‰ÌÈÎIÇÒû6¦Û® ;û BPo—ó«FB±®Ý"©,]eÚ]E"&µÕDH:Ãfæi‰H˜/ªFœîmY=€J4”îaš#2SˆYêŸ$ÁL„r .È£N• ½’Ì% Àtã¦ñoñyp&ˆæœÌ’äsîTú,‚ÍÌ9ï"­°…òq6”Ò8J!Ö–‘c¢–6Ë¢"FÇÌB—LxÉ¢æ)IlÎUF?ÜA"8?ב -Žè "¢šO93<áÜ’""£µf‘>|éËù‡1ãÌ’•JÁÈ´º×S/L3ÒÉHäƒí¯Ë“¿m;XÈxÞ7¨»!|n#:ÉÚ;%,qŸa±\D$%âˆtðýMI™A̬Ô̵Â(‚ɪbB…ç}¯gÞ('‚ÀštßîOë…Ζ—&»Ý šAd`ʦ±ÓM˜2`n³)S"(ó²,5S›î­5%q¤4Ýç䮉 Ì`²0f4bâÌtÖô=fLVBæð™î̸mÛóÓGóÒúmß\*¯ŸÞVYì>/ñ_ IDAT‘ÙŠ[³±ÆJaY–ͬió1„xY–Œ”`N"ñšS̈ Æ€Èâ¬ûpr_š’ÄÌ™üÍJoV¤øf9Eßoh sþ³ßÿÃç_þâåËg½JÓ`6¢ë‡¤éØ¿%“‰nëGÖE7»-—Å_gÌôa°8ˆ áà”L¶û”þ<¦g~ºåÍ—¼¶ËòÓ»ËÝñ½_ùðíï\¾~½Éå:_sÌÔ.. J‚#Ʋ8ÇC¦=ýÞïþäþÂ3sš£õGÉV3~€ö}7P¨Ç3 8ÃÏQbå KA#uˆHª=Pß°ìîëz™éLÄJ>‘H›Ñ–`qP4!*‘»™TSè>—õ0lÌìns»‹‹D8zëûœªJžáy8ºS–wUªxy‚™¹¤oQ£ßC(*­Uœæ1oŠˆ2ú¯Óˆ™ÒYOª ©*˜˜Tçè}Û6:… ur?¦T¦[¡‰´ðšì>]/>Ü̘å~¿'“žÙG ûè-wªÖQ¤gº5áD2§÷Xö™å½Êy°îݽ¬1›jM^·m«Ä üB#÷YvQ} ’=M¹g˜#aÎ]8P^Ú3Ž®ý½Xæ=F] ,"Ü­¾>bå!×€ÎLZUEWµÆs\ùáÒZzxÌÔwQ5w/ °ð!DJM8“œMÛ ¿o¯åìŽ#5 o­ÝÌLšXăä@°kÉÌIˆÌ>T;%ïâ÷ÊÄ̉¨õ>£–á/DñÕ-öÃóʼn(Â#¬Ê@aÇ„â!u)ñyÌ8#‹vàIH¦c„™ N ‘¢L„1¶µ;꣯ëÜçe]AÉL”˜¨L*#ü¦c8r‚Uòl¢lœIÌG¼ðœƒ™UÚü[וÎaqž©Î®€˜+š *ƒèeβü=ôÀQ3HÉã¡KGœÊe!樤4N$á8ëb´3N'Sï¾®ëËËK)joiÚ 4r3Ži¢BMŽm|’ºæ;‰û²,N&J¨p&ˆÉæÈe©'ô˜Ž1e¤ Uû誗֦ûcs®·ë½ãdM‘Ì’””pX~xú™·íîÓ><=’GzìÿÛmkÏךõ”£qQ‹Zkå²ksV{ *žéæÉ¬ëÕ#ܯêîûÞ[[ûà¾MÕÎ\Q‘µ/¦{‚9Á¬nc¸6n­#ˆÃžØ÷ûõz‘}Žûý.Mp÷õzém÷Û‡§gß7<¦E®hÕvªÑÓÓSW‹ùQˬ.u,>úLs ¤sDp°p¾Ó”ýQ^ßÿX!¢Ö »cŽõÃßY¾ú•ûàå[“ä9æØ|›™¦*çƒ 0!³}±>}¡Áv{Ý-cyZ}|½@Äé{†€”¢Óçà‹´û>„Ùó-x}½yùð½Ÿ|}ÿþ|õoÿé?ùë¿úç^þßìƒB.›ßŸ¯+¶êG(ÍÍDlÌßÿþÿÕþð»â£422¢FDTNΉ¿¬+<ˆ¨Ò³ŽSð‘ŸQ[^±‹Ði_]DGu6#˜Â"’(ˆÑÞ·!Š2ÞŸs#BD…¿£÷NÔ¶ýµžFe¨–+IQ 1,œ9ç4‹ðgáëIE$D„”åÁ¹Ë“,˜á0O D4Ûg+}7QÕõ:÷£¨_H $7 dy/ “™5_ÌÌ@ªö¢TmÄ !Šò÷ËŒš$Ü]Kšág¾|¼³3y, 8£ÊÕ`JâëÓ‡ýõµlÒDä¢Ý2"ðØX0õ ­Û²,%÷(RMgr3Qrw!)T–Û¥@V"º\.µ¿Œ1AÁ¤­µé‡·®v}새¿%?ê§„B‡ W"“(Sˆ{—® €M·1¡ŸiWˆµ8ë¬RUœ¾«óRDNšÅÁ‡x_Ká]ÆXD(ˆK—‰lªI(“ƒ8ýÝ?¿=‘«d¬LŒ1FÌKëDÅvVŠªrÎúè°À@'³&SÓ#B„˜‘ÉéMˆ„9ÌX%DX @„+I¡/î”(Ã’ƒøôê3$˜t]Ü3ÖÛëöu±H`Uíì$¤† b@ŒI™9]@àŠ>Ê(“j)i®ÌÛÛ­³Öšê2ÆØ†‘€aADÈ\Döm‘U43 Ô—cD”chf™­B U]b¾¾†´'ö‹êð$óï’üPú­û³c2(2ú¢Û6›òÚÖ·}fœÈSDX†'(ƒÖõÓZz)–3Q™J×Ý{ìžäÒdc%ƒÉo;¹QoU3IÓÖÖy‡4v÷ ¢zÑûœ÷‰çL<й^|LMê$$¸Á™A$% 'ÐØýò§——fn¢]Ôçˆh%‘Í÷m›‚¤ˆÕ ¢l1£‰”L8\°¬W‡CE/Z2÷(-œ6"±ðùÜD¤¹!_÷·µ÷9Æñå×m>]>Àœ $÷9gDµ7ýôúR‰Ê\õfDZ"¤3SI-lÛ¯ßûÖýõÛnÛÀ2®;;Ê;(XÛ—k›}‘•øûööÕ6¾ÍòÌëÝrÀŒ ÉܸK%Cz$Ú¿þšs{ˆ¿W¾¬_ÇË¿üô¿ùk¿öoþ‡ÿÞÏæÿáoÿÁæ¿÷íïÌ/¿úRƒ›ˆ°Ì},Ú ¹Ùî]ß|¿\®ÿôwþñ_üê7¾s}êË¢ü]w÷Ì"Ú«jÚÑ(ÔqPÕÞ©òªçX×uÆŒ?5"ºßîÜ´õ&Ü}‹4ð¾ïÎ>ÀmQpòñ¾Øö¯[k@>?_i¿Æ”"Är<üŽŠg)šïì¯~á^¹§¦Gкö„í»IˆX…ƒ" ”ÍlzÙY. Î…|ö«FýW[V}ŒÉ¨!Ãý~'f>óÌètåz|ŒXwàÌžhZãèwfµ­™9gÍ Ž> „ÑØöúýî¾®kx ³² fI 0Ó¾ïG0Ï;¯0IDÚjQsSR&gN Ø‚h}Õ{[äQþQ‡ñ¾jÞ#…U'Z r†Ñý~?·¡4r$y8¡ˆ´z\úwÜú©÷Kîuâဖ‡aJŒçÓm¬>OµË%&¬ÃOˆÍ£Fmi¹^/fVè+ôç<0Ƙsö®‡'å¶m½¯Åª£‡6 ŸðñîsN'°ÊÇ™æsÎ¥uãTW1hmã³ØÄ3ßün¬PUA™çs0eÄmÒtƒøˆ¿Hh+¨r„/½×t‘ˆ?«áDI”V®:œUqƒ„E|Z„«ôL:@ì<Èæ¤Œ¬9¸ßïÔŽ+?ç\ú dóºuÙ{ïoÛ—Ž¥»ƒÏ¬¢óUCÀz4Y81G,\ˆHF2EåÈ¥:î—ŸD$G~ÓѱšÍ`Ó¾ïBL™ž¾®Ïï½ Çœ»$$3 W OK3(îBĽ @é£/„ ÷^§^ºf‹"·Þ; ×Pµµ6¶­µ&RNb„$ÎlmY¨EÒÆ_ß¾v÷Î °÷tœ ¹d†Í8ADœ::!#mÎr!‹P÷ظjõeIY£ N$CiΓ°¢•õ=ç¶sãÇÔ&ÀÌ™”4JÕPãÚˆ9çlÄœe#]Ñq1©$¤Êeᯯ¯ÏÏÏG$›ˆˆ¶éðŒIÙzš–)|:YŠˆ¶„Œps›®ÑSË/1Æ6§YE1"$"D•É™ŽÈ¢ fÎÈðDÒªÍÆ†H±·ÖúÒIå¾m­¯‰?ÎùKù=CL w L„¯¯é¶op‡j +rèÄŠôñò3ÛxÅè¼Ær{¹-í‰Ø><ñ÷ûÍ(@! Öë²½ÞšÞÛ|•Þ}¼ö¥ÿ¿õüøwü'ã{¯6ïwr‰_ÚBw$e$‹øÜ:céý…=ì,?ùé¾ÿ»ÿü—¾ýç²Á{pÔu ¯Ä ¬Ö°˜ùµL¡ÌÜ‚ˆ¹y„^–Æø|eê`¸^¯ªŠsvàî|`ÂyÌÊôÐÓÝ µq%´qÌÃó™I¸‹Z9Ž¿ÓÄ?€V"êÄQPI’'Œ[´ Ũ`9Æ{DhMÓ‡Ù1wG23/Òo0àbû »…™‡œ• ,V¾²t¥Ó9Cåq>=^uDõÞ_^^ Wo,slu‚|†å=’HÎgõñØÚŠªB"⺮õýhí8˜‰îsQešˆPä¥/µË?@£Ìœ6N[±™÷Þæ6“ÊgÐ[÷̈ò0®ñ·Û¶ýñ¯ªl„’Çë >œË£úáú{k`|T·5¡èL•NIg¼áéåJDÀº¬q¾êí"kvT£&¼.+˜|Îòíçiš§MÙ;*ÌÁŸ0³ÒSøùZZ?—fÛíž™Këþ‹¥Oçä{Öa#zTÉøñÍŸ·‘³¹\.»Ût‹9)ÁÿmïÖkÛ–}íÒûs­µ÷9uêær¥\¶«l»|ÁøBâDˆ—<À;þ?ñÀH¼ð€„@D–ñHâÄÇ)b§ª\®sN³÷ZkŽÑ{»ðÐÆ˜{„K2óáHµöª¹æcôÞ[ûÚwIˆˆSmD™6I±8”M ¨êÜ]åR…œ»&ôìÁ­%c9h£*wD$¬pcÎSX–e"º¶4×ÖîîîÞ^?eæL^×ID¸´¾Ík©Òji[Ì™yYÖZw·j‰ÂLDù\YQºø£@ÅéJN¨Œ1¬÷îE¾-d.³‚«™`%à„Ä™-tz·$!ÝjÄdf‹ª;„°ÌŒ° ’“ð‰@Q`ˆ"ɃDšÔ@Qðæ ûÿâ:cÊS'|@€ë¢ëÂÌ5N²¬Z¨˜F̤tâ‘éŽþ'cŽu]E¤µv‹>&"ÏéMT/‹HDëÝÌä4>(©>ÆÓÓcÅÑ’@©”«ÌˆÈçç§eY D›Ofâ ™siò—ÎÌaV¾/r4lYP(3oÛVWì~½d¦‡wU]šÄëB4qÓ»¥WVí}íƒQ[(jaCPœž:aŠu½‹é!"sß™¹±‚¼+Te†' HµuŸ›œQÕ pË>põϘ÷ËêeC+ìèMö°$@ýáòÞ ßÆœ×-÷¯^•ÝûŸýõ#æ¿äÅÌÒ'UÈ_yu¡íÍ›íú ”*#‰™."” ¼ýH>×?ÝžæÕ]òÓyïùCV7Ëû÷Ö17ÊŸ.ÂsîëÚ¿ñS? ³o÷÷‡Ï$SE3Ïë•>ݾñS_žòð{ÿðñ_üÖÛ?þƒ·û{»\bÒn¤-‰ÇØ´µtSöëú2Ùx~ó7þûÿá—¿õÓ0ùÓe¹xÒ¾™.wH±Šx=Ð933Ka.óDf0'Ñ0S9!rή?^\¹ÌÜ÷ýîîÎ(g¤Í]”)Çô T`R›Æ´0SPˆ0uv«Òa‡ÅSý‰£þhjI§A_dÙWœDæÊt Í¤Š¨P‰t‹Lå;‘EûO~UÕ֘˰‹…+!®Œä݃˜Ed÷Yg‘í69ÑT©ëKÊdµe‘©g¸º“ܘÑùR+¡„© Âa8OµäDÂ%ìä2wÖˆ¸¦±ƒcÎÞ[™ûp¾Y`!ÀDt¿¬ÆÆêî¢b6Öõ‚t³="Æp@‘Ìz;÷U}õêÕ¡R­[Dú²T‡~6~:Når¹ìû^eÓËãÿ@ˆD Cæ1œêŠáü 5î­ëéþN"^æ(‡¯]µzáÚ‰H4”ƒÒè -â¬ëóÜÝÝh†°eWb]ãzMVÑÖD>~óxÿ#U?Zý1銢C—N ŠpKK!"+ÔÁûDÕØâPÒ$?øÎGÒ[ÞÇ€¶°.ó:ö\_Ý-kï›3F|B`ɰýÃÿø²ÜéÔFmËÇx¦áê|ð½ñ|/ë—Ûò›ßüÂߦÿþ·×‰/¾^æo¶×ò4ž5Ÿ(,)½÷a~Q ô?þýôæ6uwŽ‘¢½MšÂðš‚;Ì",MGîÓ]µS¡æ”ìnõ€ßàß}ß»´‚Ínâ™ý•²jì'n3¢õ:§‹¤dfVrdøugÏ {ð‘ÛŽÖK›Šç#žZï1vB¹—©”Ǽ>7ñLÇdáLš£¨=3Gd[zzpL"K"V¾£÷@“sržÔÈ€Bˆh°';,X_‹n]tåÌœá¼Gfú˜­µâ»ù¥ Q€\BNcL‘Æ’‰éî›Íèí¥ù6F!öîLŒ¤PB9I$pÌp©d!ÊK_#"Ì»ö˜>-ÂBzk­1m„û=³ãÐR„ÂÝöúk™hê~ÜÓÞóti’Ú2"ͧªÖL}÷ÉTº[J’„TW™D1Æ– ¤ô~@7`€™7rˆdXPJÎ̤Ɯ‘…¾’p±*õ¤³‰’n\tSÉÌxƜً(Õp‹H…Dfáeç’& fÒêjJ ¢;jÓ6fdÎ IðHÌ}ȽtC$²¤”T– @7׆ÓíWòzç´Jйd@sà:ìSU‰ÃÀÚ ›nֻЮ ¶éD$LÈ9–&Ó¸>]çxì¯Vʦ½­,¼“-sÂôÞ‰…}‘wª¬<)·4uba…—8ÙÓX!iÎ7¡„ÖÒ˜"‘iÓRyÞff°³.Ü8͇µ÷ôøÃrïæ™±pW=¤‘Ê>šˆ»e¦2Hè’ðtòÔŸG>PË‹™;¹÷µïû¢¤Øl[´==¿•eqs×;}3ŸûÒÃcs,«Žùœ3 ÊÔúå~³éÛS×Fð•<2º.D”œ”“àHoÊÌzÃÌ)—5º|:GSctUS´ˆ9óñÍ›ÖÚ][GúÓ¶ɾ¿ üù×ÿ/iGZØ»}jåëáŽüùŒˆ±^:ÂI•’yæÛ§G›­µu](b÷ŒÐ\Û÷>zƒ|‹ö€ioŸ0&¸ÏÜŒÔúSÞÙ÷ïßÿà§~úkßûþ[²ëÒtoÖv3O“G‚ùôÇ~¹8òïüï¿óÍŸÿY¤+5QQY6IÓ>•O3Ž úÑC IÏaY½"FT´,Wšy•/cŒRíÚE—¡“ÀÌB 3‹ôƒP惺^ÖÕÆL¤2gâÔÙ|Šk€@ž¸Á¿|`Êz¸g @! ÝÓÌ´k×1³´&,cß´ub™¶»'³f°yˆ@D”8¦ßzX*wfБ2:l€¥d8ò‘¼¢=2‹½«ª­iÁõqpø­ôƒídœœB†t„[ÈI4"¸GdY}‚Z>%…¥¥ Õà¤/ÃßY˜Ð@»,\¬‘Ì$…ÃQ£Ð:å-'0.Ì¥¥¤z$ˆˆk| XQ²”ŠØZ[2xÛ¶0½Ä`–D3£Ñͦœò„Oê9ñ¼\€Ég&'œÄ%fœ$›²‚§"%Ü ñzœÀï<$j\ÍÌãd´¼¤õ¼¼˜sÅÞIýFì…²ä9”ÙZh„›9'@G|ÃÃp 2‡.ê&2™Þ8h'(…Ã*WÙšxxïEÈxi‡•Dâom!¢1öÌTY<,“TÔ#Ý¡ÚÃ<ÈK‚sXD4Õ›"Ò´ªRÊÔ›‹+¥Ž·@ˆIå4\G9s˜ÙeYpš}]¯WœÎîeH¸–ZÅlÞ®yí-½µy­`ƒC¾N'U_¹D¹Ç ŒZ­‡IØÍˆ d$¤§Ú‹o÷¹{ûÍѵ.ýmÌá,%D7A_}ÎãóçÜ—ÖÖuSŠU(`&Ý=‰¶quwY.ªB”t~üI“VI*íÛýån³„²Œ9=w'i§L²P3ç6µXMADìî†Lå1Fo-AfNÉ‘ Jaö8äú»MUv÷Þ{âH´?WîMVxyˆÌÞ»Exº°ø¾¦X{>ΈfÞ÷C\?œ½÷Œtw"bÌQvdãùzžGˆm\´1–Öœ@D½÷`®R]×Î4Æuí}NgêëÊ@’Ï! ]×õùù¹â&Š1z mEIA¾}ûØz_´K!•uG«@©³.DnÓmÎmŒ½/ME,?ÊëÏ¡êõh ‡QMÜÎ éäÌœHw§Ö„ŒqŽ{»RU­ k"!H•ˆI‚/”ÕfÚ4á®Ê—è¡)‘Nf¦i¨–}Zé&Ì ì*¢ëZܪ’’W©RÆÒ½Þ†™Ér°AEi­Ëœ.Ò‹çaïâsÙ$DÁ˜®@“6bÞÎf®X¯Û³µ¦ÄLäæD5üös  è$1Й>¯tpZ³÷.,IÉ¢c·[‰S_ÁÆgAn·ÃÜ $"U â8à#Âè½W¦òmà-/ü@W9ŠqvILD~¨do£:•8ñ†o8Ó®ˆàÒŒx.º”ªŒAœÌå|U†Œvs+¿Uã•Çɾï­bê^8~ÞÖ2f­äåÇ«³yÕwÄ—:¨,Ž*ÄÂIy]Wxà”&¿cVÿsÕfîÃ)= Ò Æ'i<Í%‰ªÎ•ªV,äî&i帙™éƽ¯Û~ –h2cæ&nù…8AðèÜÀ‘ÎD" ø4朕'­›™²Ôb¦ÊR9@M´D"Dh$q€Úq1oyèÞ{¢õ¢yÕø7DðV-æÙóüIbÍd!äÜä:\îħAÚþ4^÷»ÇŸI1V´{ƒ'HáŒk|Ž–Ÿÿ‰¯~óg>÷ßþÏ¿ý‡ÂY×»{‘\™/?Üžïäo?|ýúõ{N¾}âùøI2=ú±oö¾ú”ÿèñ#æ×|ÿááŠûêßûôßý/óßø¥å“xKmñþ@É3÷K`éB¬$‡¥Ñæ‹,ȸîO"¢BÚ3ÃÒáaÌ‚PPšeSÝö+3Ç47#¢&BQcû5"*7Ÿ9¤ªÂ,ÂÛ¶1ó«÷ÞÛ¶ÏOw¯_Íð8Ó;K“M**Ä[&G¦ðI'\¸p½^—µ»aÂÇ<¸³R?X‚‰3œžZ1£LÆ´¦,„ä‘é’ÍÇL"(73Sb!xF ‡M"bg÷¾Î9!œ Õâç×±æ’ÿ‰[ÙPöƒÀr7›ž™;››™) !2-1K‚³[ÊE-Ã-Ýs†e`‰P&Ίʌ$ÍtÆOðùrfÃ3S™áÁHáÉ å¾ñ`f$+>)3lŒ¬¼ž ÎïÊcËijב‘Y‘Câc;¨J!JX_ú¾ïé©„Æbféñ˜ƒµnEf8 GFòG„§nûT¥jÔˆBU,¼\¯C¤û˜²°¤Á7BZ%=¨òm¨#pŒÿÎ3Jo¥"sÛ#‘L ‘šf¯—Ëö|UÕçyí½3°”@‰‘AÄ‘1ɈÒövnÐ(]— °wÒ`ædŒ}–= € æª:󱵿ƒ9;e2Ay³\2™BDäÎÌæAÂÛ¶µËÅ×1[kÁ¬JIf¹Á2`3–¦Lœ^u1vS‘ËÚ1ÈI`I[fjNc¤ÊI$ÌÓ&eB¸±ªsyé!0vG ‰†™©«’Dª……¥Ñ`f5óÐu‘gD!Ë&cNR6šY@‹0·ŠšQú ÙwÀ*hâf eFµînÑÚ²ô»±íy0W(ÒˆS–¶ï»j—Cb†9[D0‰ •ç ¯œš¢kFÄœóîns#øŠÃMîzBeyú‹ó™_½µÃ/'£-Uh§%1’sd),-"`WUèÀFáÒøb6×{å»Å¿ðåoœ8æÒW=DC%,?À¹œ.À’ʲ2³“O·«L§‰Ö÷æBrar?Á˜”‚´2%Ù´[Â|N›K_Ëpˆ ã:z_ŒœµKQqU(›µ.L‘I5/èÒj^gfN¢ÚÇÂÝ=ÚÚ¦Íá6Áyß:ƒÜÌ#–õîñùéáõ{OãyÎ) Î²^z*¿µýŽY–a{ÀØC…šðóD )ÂÔ»Û Â¸ÎËÂËr!]uŸ[ .÷KL›~…C"1ðù‡LHN¤‡ÚÒà ‚ùx]åàëxK ï˜þõDL Òâ.h­…ÀÝÓ  ûÓ8L" Ø ]äó_ú‡?ü˜]çÕß¾yN¨²O¦a²´e½¿Ë&ÏË_”ç°äçé1ö¹t@?ЕÇxû~û/ÿKõµ¿û¿ý½o}ñ§ó7~õÃï~÷£?üí¿ý÷ߌ{‘øÈ„î[hï?¶½¥ÕÞû¿ý§Çm°cõ°‘èz8CyZx޾®™îÎ`nm‘»>ïDBhªz󹪂ëV)?<<Äá¦õÎ/™N­Ÿ 6·dæãÓ“ˆ ·Ï}îs¥ÅÊm…6ÝÀíÄH$ñ᧘ÈÈôh²Ì *c f£ÕN­ë‘ÌyVss´5"Ü”µ_äæÉ¼í;©,Ë" }¸¬c›·ÏVOÜT‘˜@žŸz»/ñšñã|i>?¾÷¥/¼ÿc_þ£üíç¾ùp‡~ò ¿ñ«ÿÚ¾çG?xó‡ÿ»ßþGßùðã7hbÙß_>øè{Ÿˆ¼¢0†»dtf‚“tÒˆPâÖd7"’zúµ÷‚ݓé€ìz?,.p"u·'Nwdw¯³ @MßmLPך^¯×ÖÛ°©,$H>¸Šå¨Y'^D$•ó  ñ>L5ÊÞu߇J«,ÖÒà© ‘ž@nÔ8 lšj_%ö}W>€ÐÚš¦Yk rLýõ„d_²|<\D(°ô^ªqNDó±ZÎúÃqÂn¢ÏÈs§Èwn+Ç&Rû—™iˆ¤Íú¼/Ó¯ŽEË{ñ ÖN·,K˜×F[楜äüifÅ\ƒ¶ TÎÜœ³‹V›§$áöæc·VÓ“gþٱ̪öÊÕËäs&!½œ0Ì$IŽDÄÜGöcÖ¾”𩾼1Ò3"8‘’(ÐêvqŽë<ÎkiÜœ…‰HôMFéÅLä–L-œýlIR¨fRwÈÒŸ·ëMõP³ª“ÿ‡5iX!ˆ7ôMœÅ*fÆ5››ïêà8¹ß½TŽBksNòTæ*›ˆnN9ÌŒا8z&b«0âˆ0k¢­5D6é>',S©\:jsºá›À=,S2r] "3ÈK+äÛvUUmÊ ð="z_3Óí0XZ'æÌcáƒÀ““™\3ÞLÏ<¢ê÷²"€ŽÛT†%G b)­Ï¹÷¥1Ÿ…;åMù|S•¿íË[/ïüÞYÈe°œÎ¡cø,Vþ»;P‚ Ì g"4ˆ*÷G×ÖKL‹Ë„FhÿL”àÑáƒi–EJ¦«ªØ¾¨6–iFÑT—Û¨´n¥€Î:5HeŒ±?MDâæÜØc Uú7Û‹ZöFá2Ëd2‹ÔW_–¥¬Õ"¢5i­Y7õ ++„€O˜S–ƒC}þ°‚³ 1–Þ÷t7Ox™z¨·5ÌmN"c"QîÄc–^îîÊ#qÛ&wÎÈ9gWMó1çœSú @EÌÌ•UÓ<‡È9…y]×ÇÇg¾°…“üÿ9‘vŸ4ÛzawKw¤?Ü¿Ö.Ÿ>¾•Æû¶c@©].—ä¿ëÿ(hŒÙ;/íy»^í9Å|›`w` ߯¸o][|ëg¡ß=üàãç1Cóõ›¿ÿÞç¿ô3¿üË¿ówÿæå²þà;oΟxÿ»vÖÿà¯ÿ |åÇ~âêüÞ·?ú×ÿÕùý×K$?=û_yû3¿ò«ÿÔ9ðGÿdûdÿôûûÓ§46©ÔÑ»U°ƒb cÒdËHwÊ@x&, *ËÒ"2‚܉ø0·^–å­V-ÏG|ƒœ©Üªï¶û¤ùóã̘,‚&,ùÖÜUÖeYÜ0G2ËÄ•™#1ö±®kSÝ÷yÄÃÛių®«ÏâŽXS­0³Ö;˜†›»WØým?÷Y"òLë‹J£š¥Gkm¦G„YÉËMá¥Ï´™µ¥—N˜Õ?­ëêg'ýîo}†Ý˜këxÉ{:Á^#´—?ôÓ‰¼X‹ÇOds–1\ÕªšÈˆØËh ’#…Ê«Þié~’énÇjùš½î¶«âä,ã…GHë<çd.EŒ Y†%žsŽ¥õÞû6‡×Æt8Ä;nl eíãµVG pµ•wwë¶?=ÜßÏýØE„A|´qû0·*#ް{¾Êå _žWsNee¢¹ï—˲mÛØwǹÏ'¹Ù*MPžL'§¤ÎæÞûuµø c¨Vª88’>Ö–§§kk-C2„)‰ƒ*uQ‹ëññÍzw_ƒK>­ùΚ5Qïû×—'_•q"îcŒõL *[…Û5¯—QA€1†7팲r÷CJ––Äî.RzGx<¤¨<ªëêÓÌLˆÉ±¶nfî“8%‰À¦Êõ;ÄDA ™ yÙ¥CjßNŸ¶¬"žfæ—¾ɶõwŒàS–bfsÚªÒ[ŸÃ ¡½ ‹º‰¥ð¨Ç£÷>y«?ˆèÈšéüÍÍ”*é“F“HʈôÀ>›hzôcÔÅæì½9œ…8Bìi jwê1÷}îëÝeØ‘®cf­7ròjåö}o\kZ×uY›ó:v¨q[Ôœ›vŸ¦">ý:®÷÷÷&‘¬?ò£ò?Þ ›ÇÐÓÓž "ØAÆáÍí¢û[кÎÝàHc¸ÓÝë}yrýAºô]ï2û²]'SÑ'òïŸþø×¾þ6w ÿêW?ÿ„êÝÖ_ªïëug~ÿ ÛÛýÙ7ñð»ý·þÃñüøû¿ÿOþÇÿéÛôݧïü_O?÷ ÷9¾úů¾}~¹Cñê‹ßPt5¦T·7 šÐš3Sû–Ž“&Y½,'7!Ê}\玵/BU9Î"ÃÜ]U\2}Re.s,Ëð¡K‡g¦wQ²ámº]SEEÌ­/Ím¥ !“­ æ)ep‹)‘H+׬` F8ßKi¦B@8¤¨õisúœÎ >˜¦:-l{n¶ôÊxÉÚé"¥"o¦  d’ˆÞŒ³l’ãþr‚=Ã÷¹²J0" ³j³µ ésY*ÜXé’LQš0$‰3zU$±¼é‘M4ÜÐD{XS1)]QH}Š;„X¡†,ƒ×ëÕÝÑZïuè¡'Ùœ 4U÷*>ê=P&,V•ÍÓÌhKÀ D6ÑïõØÚÜ«_Œƒªç¬&AéDt²& 7išeMÚäëLŸáPxAAáÌœ6-¼³È4ö±so$ à0ò¹)ñ¾OD."6-bÖEÐå0] ¦BÊv`læÆJAëÚ­4Ì ·€4îýißJ´áÓªœ‘D¢j„YMöÚˆˆšT_lv½6ÕJ¡Ã"‘˜Õ‚JqjfÄL¬Èq3óx^/ÈÜ3“JZ>Ê ‘1èëb6Tùv"b )DDN ÖEdîCˆo”̃~›!žd‚#-Ã2ÌÈ¥é>©$á.c„h€8¥%7âÌ+Íáûê& ×Ö½˜È,!^‰Éå™Tiõ{ÚØ3¯km@ø~½"ЄŠpaPrÚƒ0X1÷QnÈaó0O³aQCØ,)€Õû5­úÞ#piÜ®~ÝÆ@›ÎسLì|­ö~`†Ù$† ž‘*gCMHBØÝÚ&BÓg ÃqY×9§2S"#|\‰I”Ê{ €_"°yK”LÚëÐud¿_wÛ‘]âٯƒˆ²HÏÖúûÉü£…M/Kíæ¾íÕÚNo¯O™É ¥µ²ÀéÚŒ1Ü’DÆ>›ª…Ì™MïÇ63Su3!°eЦIï™><”„#9Ý -YÃ<Ò¢/(’9@T/ ÓÚU5¦aL¢-kT‹§ ‰!¡aaö…¦æ»qŽN¡aÈ}L7VéL’”Ä Oá–!€EüzˆZßÇ´1™yi==2ì1P¹|÷™Bb“µR)T¥SÕ¬€©ô»»ûÝ1‡»?Ó‘ÓSé1vé´lM¸YØ#@Œ&óe!úç]Äæ`Ó;Ê‚3ÜϾŸ™™DXulc]r æD˜¸¼ö~?Mƒ±Ý_ð©Op+·¹±{¦ÀX9º6 þøÑ>°ØìõëO¯oúÝ«vy󼥨é:g<¾¯¾ÿŠÛõë_ë_ÿ©¯ÿ­ßûmËúŸý7_ùÊçý7æW~ý—žæ®ë’N¡íb{Ò¥_´‡Yì6µ C®×ëýÝ+?óBoÐñ6'-ìû^ÜÇ‹ÍW¿<Ò’’φ›‘éAD â&$²»7ád!"öaäÞZ“âîeÆÙ@»{E´³hºæÀ´çøŒ %3q„$PmªšI'àüÒµsF)<¹r‡‰„I…+U®Ò¤*€/ø ÿoÆ1(Ý66·Þ;<üäÛㆲ2I_á·>øx!Wi'Ö‘B䙞`RáJbf‘¶ùôˆvYœ"…'e"²÷^êU¤G¤ût÷ÖÚºö̬H…ªZkU9}V®ù™/uûüçÜo_§æ»™é>˱µ^u¹{¨.‡ð•²A̬•OÉgóq«‹f~§GÍÌò ˆ3æ´ð7ôë¸zÀõz½[îøô—|ñ>AgXe•GqªEäæíëeáR”àÈ€ew7sf‘[¤”œn°8A¦zŸ[“]v™&)±ˆLe–.æ:DÔ§°€o_°>ç 1ª?Q‚íÌܶMÎT”|ñ:¾…a¿µFŽ[¸YMdè4ß¼ E¤Ø-ç£ q›ÇDŒ8#–Ö=#éÐ-±Çᘙ'!”Ê7%‰8‘fƬ*Âg‚ÛÔBÚÌŽ!_¤gT0[á7Ç·.DÉÜZÃtòÈQ1§Î~2Æ¡U¡S…Žá8öóz¶óИ—M*q‚¢FɪêªzL ýHè[––¥£|Éÿ¸^¯Çc/ ù§÷ºì•B7®ñ‡e*Ç šÓ×¶H†3,Ó-3…›4ÔÌ…&³©ª@…@%$SNÇŠ D¹uÙœsš@{- ݶMŒŠšp˜ä"Pg»*3„v…ׂ* ˆE QNÎ`9þÕ=ÌFf‹°BÇ´úXžÍ§1³› HU·9ˆ¨õfG|Ìæc^TJ7ƬGqZ^Öåil×9î×Kgqb0©åÄè)ÂÒ»Q¸O©(%.²${ÌÌ»»»Ûß÷Ý=—eY–Åç4ó˺>ÏÍÝ'ó¢„["!­'À¾º,Ú%2’këcÛôÞåÞ‘clkB‘ÔHJu¿,KÆ8±®?ûëGäUª}ÓVvÎî^Ì<ǨNs‚0­Òy„4Ј]ÝdüàíUz§GÁLôŽ `Ã<¼þüã<–÷)îòíøI{õ¹mð|þð͘Ô6Íî/×ýÓx¦-Þh¿>|Àÿæ¿ýï~ásïýʯýÒ×~öç¯?´ŸûÆÏü…ÿâóÛ§ÿßûÏ¿÷á'¿ö×~ý/ýsÿì«»î±GŽhô›¦B¹­ s›—»8 "o\5 µw+Ë>·#ììöÍADža‹ˆPeçÒLó™.A 8gf2RÎP¦ôPH„«H‰°9>¾’QP¼E½ã$ò)%e9Ô¤õJ¬½û´mÛ”%å3$¬zméJ ¦&¢‰Ûè·85­µðCUxJØÿô+OeUtû´{hÞÝœÊA8;TОú¬S§ÎTfV✆¢ªn6‰H…b²Pdx%3ÓÉc $#qº§ ’™9Í ÁRü v÷²º_Ö~à·¿î±ß¾Ñí*E‘BœGoíÚ'üŽai½©6㚙뺚…M»Õ¥€m­===Þ^^C9ñª]èM¡.ìmr¤"¢ 3s¤j/ÚμžúHe9Oç•Û)õ²F)©³G4å(Ó‹I\†Ìh­ªhö›çéIèË3Aô6ºÑ/tª{xtŸfüqòK^½  Õ'¯úVÍÜÌE¬ëê/ôüõáéE”LUÞ""ùŽÀ±¶isNHœ!‚5îkÇ<²¢Ô "jITùœ"lÓ- *ÇŠ *Wbf&+9Ȧ*Rmðm0«$"òN[mNDM¸Y£ƒ‹ƒs"¦ªUèÑõzmàF¬ÊÓ…µuâβ\ÜçíBݪ±›ÿG]·sÙ†ÇNL"T£®ÞW›Ñ´?>>VÖU†ƒ"rÖTˆ„×bAž”/Õó ¨0ˆôç§™Á:æ^BbU-{Ù š>è`á2%b·ˆÑõ–„#3ܳ-2ܘuŽ‚j,‹2§È²9 wÅáVÇÜZcÎú¾û>žžžÚ]›cVÍÚ{å±mM”ˆ¶ç+ÂYÅlRU•X˜‚éVT9gZ"*ÝW”Ü-“)Dw3E5Šp >Én³‰Î9…™@¡ >§•MD\î®àY S‘Š$¤???S“‡‡Š4³Œ¨•Æž‹G0Í9 I—»åúô|¹\²Ë3ªòðøø¨g tØX–ui½ÊÐ0 P'£x¤"„éL‹UOK„Œ•\ˆ•‰“lLuéOÛ®ª*å3¯ãJ™`ÉV½ÝÝÝÅg|þL¯­þ <ÚÊt©‰„ÏBäØJ¨‚ÚÇ$sÎjzì ýÕë×Óí­§ mr!oÚe}ÿó_ÿ…ŸþÝßýìüÍoýÂ|ûdm²Fb<>}ü}7ËׯºÑìïõ·×g¾ÈºmÀ-¯ó×~ã—òÚ?ùÁò‡çŸr®o¿óü—ÿ×—@XÍ IDATϳôÅ×öÿ'ÿÅoýÖõWþÒ_ýÚO|ù«?ù¥/íóŠ|¿}î“Ç·{B”éî’¢ì‘fÌìáMµF+"ÌÁÂ:§­ëýœSeyõŠ"¼*ÐeYdF£î\¥:¦0dßyå!I  w€MK£¦ÐÆ1'{0ƒ‘pS¤ª®æô¹í™…áÓ¬eÀw ‚œôà§ÂfiëˆÒŸowíécŒ^Æ8"sÛ+ÀÍ<„‰¨ ßúï +¬'±"ûÒ&ekâî,ÂådS™Ï]ÌÂæ¦¼ …_d ý¿i{—^Ù¶,=è9׊ˆ}ι7o>œN×ÓYEÙ¸¤êÑ7B4 añhðø 4hðh :4[ @²Ur•…0 †;¡\åLꙕyï=gæcEœYiT‰ªBWGWû+æšsŒo|¿í·š7íhìÑÚ °3޲ŒðXz¿Ýnm]ö}·ÌóE2[Î`˜çžݑϷëõ6[knŽHoʇÂΞaz‚2ˆÂAM± ÌlpfÖ®…0EĹ·=,ƒ,3œDNH³á𹞢d†»SÌÓzÒ%=D„‰I‘M:ßlHoØ 1ÈZ@1GxаfRÅÝ#GíÚëÉÙ‰ëNæëºª+štÛç›ó;¿íœÜ×Óuìé>(@ä½E"¦I.—‹eL˜Í!Ì$˜9£5bâioÖåúüá²´—}¨«2³g²Ê6veV¯œD©áî&üÄçÛ´)×þüùíÌë2ʳNÚ‡çëùÝåË_hoÀÛ¿¬úããæh†Wê¦z<Øûúã!"§Óe¼ÁDpÛ郜NÙ)÷/Ÿ~íòƒçþöëã‹ÏíWÿõ¶Ï¿úµoþÊ·ÿ•ÿæ¿þïú§o¿ý7åŸþoÿìkŸ}í«_ÿê?øó+Ÿœ?Ýø]#Þ>ÿrû0~ý‡ÿ o9vþ¥¿ñkû³Ý¾ÿüé×~’t,_kï_Þï¿þ_ýSø?½½yûÉ¿÷wþö¿ù¨õeLÏH³üHЋ»ÏmìLe™…}ß—eÉÀ¾ï¥Y­æ¬Þã1'$´†;i ê8ÀÛÇr7³£Á|…_U»@{¤×æ f¢® ™I ñŒðPU|tüą̈€Ú¡¿xì ‡Š×ÍøŽÿ5 #B˜L ‡hfîc'¢S_„…ï×§^|˜;„„@ÇÞG@0â6Ò}úba0‰Åa^é“Fø<8¤!ÂnNœLâÇ1Üݧ°dúí¶#õŽ[Xñü—µƒ3 ¬ën®`éÎa³>‰Ò'÷uõáô Ë­V¸ÉßföÈ~ëÊ`ß6uQQ÷¶±C8ïÞke¾”™t8×3 <²ÆbÌLTV·."¥„z}=fŠöxÞÌâ1Ъ¥XˆJ+êív˃`›Õl&QbêÔ;²±²#¦áFwþ`©@ëI KmÊ·Ûç8‹ðCÈ `Û¶ÊXù¸Hö½÷~½^—µrj„JKú ب‰aY°cˆCÓóøwß÷D°Ø¨|ÁÌÇi gÜœƬ·ë^&"x5—ÌÌ1MÊ©/C˜(’ °L(ËÚº#ÍÌf¨ö9'EÊ]èî$\¯çÔ!÷‘w n)³˜Y˜æ>YE›Ìƒ*^°Ä$gl"¢J®ðÃu áÄkë¡…Ò@`O¦ V,KBÎbqv;R‹{k¾Ûra<·Ÿ÷ô€G¬ Ž:›€b>yGûèÐ#tdëàWŠ´À+”ü÷Çr:r³ƒŽTM!¢m»ªvQõéÉ•Veyözïá©ZSÃaÉZëäã9RëðáÖan‘Iîé9Ó L튮wÜJé1C3¸Ït'äA‹ fÖÖ¢¹ùŒŒŠå{¨fü¯¡§®$×ÛKùäÝÃЋj?­¼kò8æH§¤|yy¹¬'¹O‹ˆ° ¸cΛJ[×>÷!Ê„@¸¹Q7ˆ¨ˆêI£h=®ûµ“Ün7ñ<-ë¶m%Äm½ƒh»½4ÑeYTÔ"ö±_£Îbw‘ çÑ‚ZørZm$Ïð`vx@¦GPP"3¯×«žÎ a·=Üg¦ÛàK2±‡/+%¶e夬í?Ïã/Àÿô1òymØü~ŽÒcl·ÑäÝM’…;4½m,º,oçä±íÛÕ$ðÕËÏ6ƒ`N^Þ5~:mæåÓ7ò öuýößøæï~ÿ[/s¼¡%Ÿ·ÿð?ø;¿ýÿ×ßúŸþÉúŸüÇë[»¼£ÿì¿ø»_}ó3ë_ý[¶¿ÙŸŸo¶øþðßþþû?þîŸ~ñG¾ˆ~eÕ§ñÅíÃ;îMDÄÅ÷Æ«M@/—Ë]ÓŠ­ºmûéÜ2ì!’T8¥#‘`#!R°€\œ†v§Å áÞÖ%еïñØøõÇ‚¡DîÑ’[BU7î^!ë,,M§óñYh“RöEÊó>êÍÂü#‡§M ¸ 1S¢Qâ‘z:Ǩ©óc!BH'Uu&!©<Í|ä“bŽFÉJ™P†P¥J 2r·-3—®AÉ‹4AIR d!JìK{›‡‹€«–ljNlÜÔ„»™QŒD 9“"’R9¦?(Rè×cËÇÅ/×/º³ôï¨Ø<ÌÓ-3¢ßÃÍA÷¼çLç™3Ù2=ˆ¹á69çl­9fyè?ÎþjÇÈî7QÁ05»;&¹œÏÓvÕ*g§JÛ7<þ&îÝpÜkË EÌý˜&[h‰>é TReMkM+]¨òV¿Ù!–¢E2ót:Ýn·Þûœ›HóCû¸Çš3s¦13¥R¹‡Ùº®IØmºç!õâ½õ$só,R¬PùÊ31Ò˘¼OëØ­µÓårpl“¦ˆ ¥¨¼#*)¾%Œœ@\8f,ÜXªË'Ô¤ï0‡ŠdÏ…D[¦S ê¶Cç¹m›Tð]9·ˆOE.„¯¿êDLÕt3âD RÜR"É!ìI‘5[L%"в,>ͧa´¹{à0®5wNºÒÝawéDz,tx ˶m­5÷i™) à(ú™šH{\±?»Ý83âQôÞ)Ü)kff)™‰8µ'3K¢vêÓ ‡©™‰´ÇýåœàðчçQ‘W]·ÆØQÚ5Q"P E£2[fÎû K*ýæÈ¬AéÝÀʨà×J(»·a¯Ò»3#iÎy:Ês…ˆZ«Já¡,ÅÐ|p»2S›JocÛ)ÑEÅDUˆèÔµ*Âyû¢åZ£a óÚZÚ¦3Ì Ó,„P^„…@‚cv›ãr¹¼Œmš].—0Pu‰ÚTU÷ë­© QDœZ7³ l×›vy¿ßÎç³¥ƒ83¶1–Ójsl‹.L$‡ÜH(Ý\eß÷ˆÐ¥ŸHEÅùˆlK/Sw_ϧ?»rþ?ÿ?ëëõçD¯l˜âoe¦ˆ¾ÿòBUÈñ™óèº~ööü³¿ø³ÿýû÷¿ù×~ž½ ç[æ\—íÍ“N<ÿá{ÐIÚétúb¿}å[?ÿ­õÓßú½ÿá¯}ýíõg¾òG¿÷–º¿ëòö³söON_9÷ó›wÄjÁ§õWßžVqÃ~ï‡ÿø·þOjß§ü¹p·1´-JJY>?Æw9_Á×s–×--Ë2§q ø" M""¦[¦˜¶,œ¶s…/x(.æs­÷óºÌð¬òô88ôÀ“ÙzïÚZk×÷ÒCUyížQÑ’Õ©*Ýe¨‰É̪Äx¿vºÓ@dÓªâ‰i=]ecA&[d&¯-3mN™fQd:ÜãB2ÂæœÃ—e>-¦.Z?€D ŸéÖš¤»‡{‚èD¨–8ϧ“™E$@@ò±73©6J³ yóœÕYVypÐKõÌ$l32@²$¬jôŠÐ˜s¶S#È6vÐ]ßw' ¡8De̪ªÿ(Å¡¾+ 9æpº2sï ÍcÛ‘ÄÁûÛ*VÆ= ¨ÊkfbbjW­³„™kàñ+™Èà9}ß'±/K¡ëíªëƒ›VÆÌœ²?nšL–áÉîlÑIÄ $ˆ:ÆÆÅ))”KD˜ å´îžËºPƒüºª>|8NsnÄ‘}Ì$]îzÔ|0Eæœ!aa¾Ýn¬Â**ÊHâTå9wQˆÈq?,jÏaUEña!ïûit{¾&¼ÂZk”Â…3”‘GpŒ"瘢Rñ|v·ww¾ûàE8E²¥Ã¡d…Ä>€¥b4‹ˆJ&åôÉ·:@,ÒóˆV¡Gýá>–ÎÂGÈh2*æ¯X¸­w#ædJMpI¥€D”‰Œ8"˜(ëºFf¸WÍT5DY¥HDªZ–¥^63{ÌÃÄŒÀ¾[æñ»èèaMözK¯’¡þ+@éKÃÝñ¢b•""­-3ü¶ïÉÁÊee\òÎÞ»M¿#Çqp)DU„Ý“ü¸þ‚ÀÝ#R…Ëþ¦Nzâ£é­x[ù*áNÂu':ÄÓÜc„÷å¤Ú“œµ"-T•‰=#ä#Ù™™o·Û¾Í·—7û¾÷®8"`d†›;'zëcŒŒ°iîÎ!î·Û~^V…yÓ¥¦uæcÆÌËÚ6s›¦ÄMYYÈm>¿ÐÒÁ$]‡W¯H͇¯Úll .óÏ}ßkˆ\ËÕÍ3òééi†§Õõ)§‡y~ºäÒÀiäIhd/h+ÐAÙúÒÉaf#ÝϧΠaÓÜúzöÛvûð¬­9Rz os<ŸÎ§m»ééÌÝÝ~òÑÿ/{ütõKñxÈhzƲ.ûm£ýÞü•iZûÓÇB¤µ6Ç@‚ Þßbá-¨·Ám#[–SúùËïo¿ðo|ö׿ýé‡ñÂryâ§“áÓ®oN—/§ÿÖçÏ_ýì›?Øì—XVÖ–ñæÜÛÓIŸ.íM,§¯÷峌ë»Ó/½¡ß}Ûß½ñsøx6šW{ûôöóÏçó{V é¹kýäúñݲ,íf7»µõ=çÚ{Nk,i>Íuís$!aî[š2K2Â,œ÷˜CD®­B’ÈuU]¸Ï^ZJnì>“ƒˆ”5žAîÊ peãÌd30щҮ/"Ò–¶ƒ™cº$rZP.M‚3écÓfVI(J“f¶¶5’ê™ÐféàÐ%Ò¦%¸õ­Î9 8“rR"³í“ˆ$¡$]Å33óš3(† !©4ŠìÚVi$0w!Žƒq¢#€Kãwßâ#3·QžL©Ã̘»‰"L” b6³äÁ`aîA¶«°ˆ½„*Ót¢½ú'áEäØ¶Î§Ë¶mBlÆÒñð¹PéúùŽîVVK`„×€?¥År]x‘…™3$3çnž¾®«™meY‘ÉDOiéÈà$á Œ˜ÁrÄ„Æ-’ˆˆ.™É‰¥5dú>Aa$0ßh=Q‘9qÌÝ› ‘1Œ«_„Y¸“Ê’I»'±‹°/‹Ù`æ&ÍÝʳ¶}Nhx”¨É4s÷´”ãøÄºv"ŠÈò° »ç°$"I[¥ªà†„‹¦jK7†P*\Ö¾Œ1Æ8T`‰LÜE·Ã:ø€[ˆÈ†…z™ÌŽ­­sNäAªR0"˜Õý˜2dÆ‘´Äp7êÚ—ÕÝIÛˆh,IìÃE¤‹ÖØ„ˆè¹ØnÑz°Ælf¼BÔ„gÄmš‚”8‹Å&Μ6Íí! ÊÒš 1 w»OÎ…y&KÞkG%ØHJ0L0ö]);4sΈº.°ŒL”ŽÒ~D:’)9ã°gE§°Â+c»½¤¹qL‹!J€ƒsˆÔ31í°à,¾:hãîUcfœPâ@:}A]qŸÙp_Ô=g΄ˆtˆ»Ip;‡Dú´ÞX¡AÓ‹ .ž, ŒÄ\˜aéž$läCiˆ<™ ”ÞTÄ“]XsfÞ€$_›¼}Ù>Ð9ZkÍ’¯“„·ÌÖÛ ËdËLb’ʸY†ˆò ÒÆ Ï[£8SfF¨°hxHä"2)ã0g Š<õ¶6!E@¤î~»ÎÞ;ѾoÓáMZ&q²4÷7*»m©l”Oüf†'M0“,™œ.ŒEIIc†­Oo'"39¥¯Of¶ï³ÓdaÖ–VÐ5Ì ¤›¥¥´ÆLI°ÛÕæ\×U™ÛyÍÌé¶Gö§sDÀ]•%@ =µL iiK¦—ñ‡ëËïš±ƒ‚–Ëù”éè}=õLKXÄPÆÓ›4¦',ƒäGÊÁõ‡›q ´Ê²,eeXMÀ£Z¬¦‡Ïq=ñá:b“~Š9§'‘ ˜v{sy7ç8­¦fži± ?iß~ð‚/oùœÏb?óÕ7_ýÊ¥«tцeÿ`Õ±ÑËífáž~›#„DWê§îç3`Ó—óÓW| Êb=¶§7ßèݸ©Çfî—ói:_÷^xΩ‡~ cN›®'3ŸÓöðÓi‰£yždÐsi«ÈR#Üéw)¦s¡¦Ñ 7€Tµµv½^ úÓ¥»™ªô¦™e-·)ª™e”¿·šwê0êðp>z¸Ì´ÝD¤·uNgfQØŒŒ`¹SÓµ¦&Ì .8Ô¬~"×v*2DDäÝݲ/=3»èízUâˆPie=ažLÈf‹ôÇëy,¤¼ûO<Õª ´bì³3e2ÒÛ1®VID*Þ¸‰Hpé9ëZb£¦Øw»3dîê–tŸTÙžDÒZ+DêÁx¨‡¨3 I ެû/É9Ü9Á\˜Y¤)¢M—ÊMMx˜ŸZ¿^¯Ü¨–6tÄé½Ò›¼æÀ>®C¼Ê Ð{j] † º†{ñBA@&D9òF•ykú Id™aÓ鸪…'ç]ªóXº~—Q‰;æœ9oêf¯<îNzayD(n¸ž$ ̈>Êê{oAHÊãrE#²p"Ьç£L.ªÄkåÁ­iÌŠm^"Þ˜T–Z;Æ1ý¨‹Rçw´©”±¥aFFMu’ „ ’˜à˜IqV–…G"¢­ñ²„{ “‰„‡9eÙÕ¥Hw«?u¬|‘ºÑ|²¼OTµiLs?j”€EX’eažé ŒâWFüˆ,“ˆ²ìâH«°$€ M„ÂÄá•® ª:=2³‹H1ŠŠ\ºòJ®<,ñÔÛ˜3"nc scq$”#rºU.xMEDÀAD$\Œ˜Ç(êq Ô’«w•áîxÌŒÌîÎÌ¡ðˆÖ»†£<ù< 4B2Q‹ÈÆ¢-Ü…(£|µ‹#Ì¢ªÚn5âI°™L²4 $ÓÌN§SÝ |IŽˆ±ïÜÔÝÁÔ¸µ¤˜¶tµ1Èa˜!¤¤ Z‹µu:À<⬳=G ïæœ5„†E2ñ㴮íe¹.üŸ®þÐÖ<&µSûøðáŽ-à`â<~’ï ã¯ëe¤¹“˜ÇHHÓIDŒ1_ˆÇå|~~¾íÁ·óò?ç;$ò–õÍÓ'šm??ýÞï~ïW~ñ×8máÕny¾¼{jËB¢ ‘¥GÓhlÚ&‹·•NËîᄦÈréJ¾Ïá‰Ýœº’ š¶&/cc9÷ó)rf¤¶ÓjèK{Þv5Õµ­•íJDë©Í9ç0¥uo¬DhÐÝ µèH"2·‡TÄDxmeœ5?ó»Í63WN¶!«€-È™»N3"ÕŒŒô@ž{÷8˜D6P·ú,*öÚÝçHOjMé1hÓd9sN%Ê´ŽÐ“²x©·P²Ì¤CŸnrWtm///ÜL– íjáâ¥ùv`¯ë³ƒeéwÍð“©<Ɔj¡dhAûêÉPjXÀ¦ÑœL§s3›Dœ˜Db¢äêá8´¦1à3GdiŒm1%AuÚUéSÇaÙÒ÷Þ×uµ‰ƒ†ÒµÿÃ…‚î³HábgFAYÔT ü` 2gÄ2,#‚‰EH¸­ËõùváUš8…Ç$ƒ„he­Fÿ°>c2‚@ˆqœ …9ûHÙj³4›ã²¬L:ÇDæÒ{åô ëÈß2²…2óÎU|T·µJ+Æ@SVEDi>¿Ýs|k8n7ffeææe¨ÂþQåíüB¡ž±ö»;è’5XáÃYµ¼)é>GKfa$"ÚZÛ¶-=ÜLt©ã§X¸F à,*R9#å Z^&3"YUéH¬JPúÌŒH2¤LÔz׸?øn‘ÉèL˜sˆ*2Ìʼn”•xÇá  !¶ôÈ„ uH‹¨Å†{(AD8M|„ŠDæQ,1¶€˜ƒ¸‚(‘ pfH„©éþb"Ì@iÎUEzxÚOU¡Ãýø©mªøíË AöÒF:Ê„ÜÁ5×&!–„x’¸>ÊÆ"’Ä™”ë*€¨….îɬ6§êÉtK$Y„‚˜¤\â«Xo­yì"b¶óôw§Ëû“Ó0M,à˜ÇðTD ÅìóÌøó B”¸:(HÅ å€@‰Ú“+¨¼j2Þü÷£ðž €…™ÅÌl·ÓræÒÿgNÊìräˆ!K'†ªf{1«l¾‰™(B„!\7 ™»´òÊËózŠš?1›Ðt癹B¿kj\wP[ôAž=j¤B»^mô®fÆM/—>·½>k3»s„yìsY±1)±®«Í«¶œsè|z[&7I>l"2‡5ÀÌ×ÞºŠâ§úéðY5Å|žÂL9~dÿ:šG.­]ˆ°û$F:†+<&*PI·†ýšrRËëïýáÿþ¿¼±ôµÝäö¼=/¾²Ÿõý–íK»ò-þÿåwþíëoÛX£¿Y¡ÊmiËééé­gŠÝ&I¶ON©‘û&a²œgúÜma§Häifèi1™/>ëÚÅlcöƧ=ÂÉn6zo*J©úé¹ î¾§»{AñCÅÁÜ:;–¦iãYU"r" 9^öE4GÆÒ€H¦ ߌˆƒ™;-­‹’íÛõåC‚ré ©¶F¶ÅŸj`€ÒÜvg‚|™7ŠèàN’³t0ƒ’i¿}°#Bé)3歺ǧOï}¿Ï¤×1Ff\Þ¾Ù3c˜lNf†Ê o¯6Úzš•ºB‘ H7¹K6Öu­ ãò rKd²J‰P*ΪÚhÕ$Èô{HUrCf¦sBYêí`žs¦S)r$ÕÃ$“‰T™¥Æ­læÒ>ROtw8ó»ï§ðò¨Œ«**¦Ö›qO˜Ó "Äd9!,P!µ9ç¶Qj¹)Œuéf–m);߇DèÚ¢‰ÝöDDHÆafˆBCxN·=Y%Ëä DÊ-·íYD>x"2èž)ÃTi]f~ѦÚÝŠ·Ïáãð#o×Ó'sß3&ikÅ)qwbvâÚdÇÌ?î¶½ˆþB8\c.ÚJ—>¶=Í=õ txQJ¥Éíåv>?efï:ÆH¤6†SX$‚™‰µ¡{—"Ã@1§(õk-ËB("·Ön·[%Ýe²j›söv`¶yˆˆ’DDS¤ù²hÙx¤;"žÎçˆØ÷}—M ”à@’pë•f…ŸÑ{?ŽÌVº¤P²r"Täî\wÔXGÇE®Ä0~êç™q³áI! €ÚÅÝUÄÝoþѧ5#)‚‰­þç>GˆHƒº¥°ÐçU™èËâÈ9'«L]P[w‡Ç¾_³csi…̆€´‰‚"Œ‘Oðy½ìûLO3¯ƒyéºï·d½ëÕEx¸Q÷|)ˆ±ÔÕäp“to"îΔ‘AJLS„ ªrM™yØî>P¢‘¡²9I\¢4Ý’È({”Q´ æ; 'ÐmLá[k–{v<ƒÇ?¼§¼Í§³3ìú¼±dkYƒÉ=Ùz_Æ‹92)Œ-œ5—F¶"D"”¤î¹,­O÷ÉÌÅ#ñˆ€T¨3%Óq*q?¯<4Ò<‹ÅD4ìr¹ˆ°t÷Þ—ú4<,ÃÞôæîžaHND»z&=µ'{¹>é²Ã¤[ú0R†E¦«Jc\×e! }óöÍØ_(LjI”Ú´ßöá 0{l}Qd„þé IDAT¡çýúö|Û>ã„p»/Ë9܈r¡TJñéHR°ÇÆÌ µ§7}ܶi›6M‰S´×­bEpŽMæ_|ýñç<ªÝ]/ƒ8[ÓYÃgÅ48Á2ÆD$7þ{ÿð×i¹ä‡þË¿ôËßùã/Ÿ"±í9œ<þæ/}ë~çË?ýá÷¿ûÇ0È—Kû²@§ÛíöþýûÌ\×õfp÷÷ïß‹ˆ­ëú¼íËåÝ#Œ™Ó<"ÔI`AMTdŽÉÔÂʈ)õÅ6¬°¾EËig“U(1çÌiÊÒ׎õ ÷®Äœ˜Ó’Iéè-–Þö}×Þ2ãz½FZcZבњÅѨݿóGDkÌ8%k±#"EdI¦sM€ Õo2 sªäDY­[=ÅKÿþ=-‹ê]Ц'‘0OÉÛ¶e&ƒV¦Cú?cJe8÷Êáûõª(äk äÑ[Ô+©+üØÍ‰¨4Š*RF•î.A$žî@øGG&w?Ä/wøw5Ý£þà»o7^G³ÞÓp Ç!î¬<æhªë'ïŽ$O³Ž*²æˆíC˜#<3§™ãcÚHÞ„E˜‘Eøˆ  |Ìþªå;ù0Ëb1‡Ý1áâçg髽n=gÖGìßœ#3ÒC92ÓÜ#7UÍÄœóa£W¡ «GZ3S¦Œ‘ŽF†tÕCu9pŸDÔëyzz*ŽpõdTAŒ¬¯÷„ãä¾§UÔRát:Íy Ââ_çvLXª4}ƒÔ_{ÜÝØ <Ê&"X‰›’ P›Í`fâ%8Á"–afäÇü´Lñj,õˆ†)Nëë¶øõ¿™ÉD×ë5˜HHÊaõpê”"mTbN–p ¯mq_-K$jJòñI™û¶ikŽ·h+årNÂŒR?zbEܧ?›^è˲,îYŒ #’÷a ;<ïwîÝæß$£>ëâ4ÒTºôÖ£n+ÙÈ}ÛKÜo[bªiT܉´^UÝÆ˜äÍæn3 méÎÌà§ËÙbð² âûxõ=QØ ©€!¹²m³‘‰Þ»Ùˆxléî>­•Û?ÓŒ…û9ºôǪ¦Œõc!ÉC?楟ëj1Š9T‹áÁz>ŸÏîþ2ž—e½^¯$ü²ÝÚÚ)aát3ËX/çÈtF_×p·Ý–v¾^¯n{×$¢éNH‚$+8Ü2£W( ’EÊÍ"¤M/ébZÅ‚ó2·”þüáöéÛwá6ÂgÌ‹jZo¾¢1¡ómî?q%üËyõG}àÿ\b÷­iKCšÃÓ-±'§Ëº=¿0OÛ·FþÊ7¿öùoÿöE|>q >µöó?sûêûþÞ?üoüÕoÜüeåw52¿\.ßøÆ7DdŒ!m¹Ýn—†ÖZNc\.O{ñºAÅÊ»wïþÚ7ý“~ÚÆ-8q:¦JÀߘ$fLd“ ˆ\ò> }ÓÏ5=9ŸÏ5‹¾ùì$,2ò8'@yØ’ð-LÖ>çR˜™Ôç$@Q¶§Çy|g@ÔÎdmá‚+cJ+?s`¤'“3µª?`î̵cÎ25ŸDT6Nz÷>¯‹Vg^Y îûÞ[‹ˆ^v07]Ey°Gf< C…*õÞ©(~ÇÛ¸?{݉ëîü‰úFä«xŽÞ;2 å1FwXàÁnL!l’LέS.€ð|œ‹¯+×/©¾Îw=™áÁD·í¦ªM5™Ü¼·ÅÍüNÓcó fVð_Êœ dNÛ!8ªAձř=ˆÊ°õà²}ècÚ×åÇNÜ9g2±0åá$[ïî±nq I‡BõÇêG¹|ÌÖÊ3ê¤;näºeêÇÜýHÔED NøA1‰’WÔË –ª?ªbi>C@½õÈsªˆMk‡{ Õ±,ËÃ|€Ó+.¾]"’Q>óñ!.ËëÚç.êaä=𤴈0ªTî̼SÜÈO"ŽáÑÖˆ"Òˆ"‹ö±›{˜» ‚D ".éÂ1w>ˆÕá~š^ÿñÞ;sÚdUÝ×´½r°"® =¢öS&"š¹ÇêÌLÉîHãž@ù‹ò¾ï"”×Ûs«%T0\o§²QRtíEx\µ¼ …Ü=Í‘ûž#dÉ!‰ÜŠUÖªÇôÐ^9—Éý©õmÛ×ÓåºM653ÌtíéÞ4û®KØ{ï­É¾ï–ÎsnyZf@«Ã €R ,3ÖÞžŸŸÏïÞlÛÎD$½k¦oûËôdÒ2ònGroÝŒ|ñÅZp>ãåúþ|>G† ‰"¦÷Çvðç{üeÕÇb®Šþ>³Œ–§§Õ7כּGD$3Ö^Æâyéëp» k½Ý®ï¿òé›?úƒïÿ韕§7g:ù‡ùáóç/U–·ËrÎ&w+‹mÛ~ðƒôÞhYW¹\.·Û-ržùðáC?¿%:¤fÌ\á¬Ò\¦ÙÕ} szjï„‘ð}¿qã¤( ]íJU†ßçv½öÞ›êõz]Ö53#ïÓÝŸqZ€–õœ™ÓÍ"ÀtÀ$"B`1·ÞÆ~câ9'Ý7ÊG‰0à@€"3DÉÌœÅÝ„X›¢¸,þò¾Ž"¦NDøô´Œ±¹Û>®½wU™s¨»ê¾ï­µJ(s2«Üsä¹iDÐniž,û¾sb!!âQ»ó£5¯Jè'௎Œ‡ðõWõ뎊»ÏÍ8Ž|Q")ÊÛpre*˜2ˆAcŸÚxŒQ×íØ[ï-u}dUÈÑó|äÀ>¶úÉÞ{æXý¢Šîû^ÚSGz8Ó¦ª&ìtØö›žWf!‚ßͰGxfI Dû0ÑΤf8Ȫm_ÇÛã¸Zו™çœLäcgæÞ—9g)H™*À¡­ª< "b&÷Èô"äÖ>N¬T|YVDD¦Ñ{/ÕσH΂Ǿó¸¡M)-XD}'‰ôÜóÇõÆAÁ;ÂhîÖ,?öodóz:ó—ˆÓ‰åwO°±í­õþACñª>~¬L:–ÐǯÌ9;5÷éx’>'iJëÇÎܶ ÀzZ'ÆCÞR%Òñ¼÷îüŽü¸cx®•¢[#fè#/^îá'ÂîK¿D„Ùá­S"Zß'<‰ *Ápd¸ ‚ïá a Vgj­«‡¹xád6&·£ÒÍLî-˜Bˆ„™D(|¸Ùl­µ&Û6„»eCRÎé’‚R ÄQGšYkmÎ=Óµ K†'çóyì¹<©GTáÅ‚, ü=Aºg]Ï* ñªú$¢1¯õµºÆ@5ªü( Œm»\žnà A`eιïûQÏh,õ_Öóó˜sÎX—Ëœs]×ÛË–™¬P WiaÐÛÓiÛ®×íÆÌG#QÛ¬s¹”õÞAK_p»zk­µF&NÄx–¾²þðן¾}7È$U]ˆÊ)@#T¤`•?ÿã/²þxÜví0lÌ"òf›Œ`Û",IåËÓåùz°›-Ò¯×Á§vYN·å´þàåù“Ÿùì÷¾÷¼Æ·¶ߥùs_nÃWÆ_<¿ü•o^bûBw?åš-ÂþäÃ÷Þ~]ðµO¾ÊÏûg}ù|^¯äëÓS£“Gµn™ï·Ñ¥þr ò@tpã¦"’{z³…S0‘0¯ÌŽä$$˜dw[—3"8¹K·m¢’T3ˆ¨³ö¢"‹Ž1̯E¬KIÆm,ËÒ0%†y —g[ȱ$„@ä9¯Ã™tmRá9g0éJîð;q‹ãf€Ã{¤9·‘` eðm»1z;3)’{«õ—µïq&”ú…ÔmJbX˜Û$":5-£7ŸH'ÖE׈ˆ´ÌY`,€éÓ#ˆ$F9m ˆ¨WØ› î‘™ÞxñˆÈ`•ˆ!…CÂ3(Ñj‘¢¤ã^NÜcÉÚ2ÆîT¶ÞDû>´-»»rÃ0%žî“¡*^–‰HejêaLü ·ÃABÔwsΠé”Ð5éå I‚¾"’ãÀ':-ÄÌ Nɼö³#=ÃÍ©ÕÚÏ€ÔŸ™Æ’A)ºJ"âÚš»‹q©É|ŽcDâ¾Ï4ɼñ$¢%ZlcÑéÅ2Ëz%%‚ 2á$9r&ñR»!‘ßÛÖpׯ‰¢µ1"@Aœ|O'™æÌ¼o³µFÛ¬Ðãi@2y: ®%TF 3r³[ K¯N{²$Sz˜[ciÊažÌ–$”ëºfúûªÊ K€i¹œ÷}ï,'íÈÒÄ)DÁ0·Þzmܵ›W±¢žB"ÍŒÀŠ…59¡±ÖGR+—9Õ¹m¡ÌO±š€T*gá9 sN€ ¹£9³LØ2éLMµá$l„g?JáZè9¼ŸJØ4Vá¥X8 !"òŒÈÜY5I‹EH‚*§»2e¦Ï¨’´ëÎ rÊÈ ¤j£dVš6Æx&bnÊÔoÛ8­¼[Ô=ƒ=ÂDã ¢ªJ3á “»“e°1;RßjT¬ÚˆA‹.ˆ‘ð%S’ís?µ·6Á*Ž4‹¬vƒ"³p½¥”ã.Ó$I–”†ÐØMU%S‰ ”8`-w§ª¡}.C‹f13CH0S·k_¶|ùj¾Ï;·¶"hîÖ› UÕÞæmd¡ÎœæT ÉT¾j˜n!”¤hPñf5]Ä)‡®4üÁÌ]ÂK‚E¡‰,Ff°Rxpc"ÚÇmΩÊé32SÚ9‘`lÃNóK¢õÑ‚¬+Áö}oë‘ETó{ш0›ª\Hì‰ÜÜ ÉëºÂƒƒÞ¦O3n­™ûË ¨|GŒ­ó·&’%%,h]UÍŽ–wbߥD\û¢cì󎔋}œKg‰Ì¼]¯ªå#Ž; Ë™ºôffJrr›Á¹Î9”º#ÝþG¬ UŽfÊ "ø4N®”µ8œG{‘·8ŸÖ[y€%(pYVpb¢óÌì´6ï+¯‰ žp"<(±è!aû& V~ éåm…òJO„•™åÂw]¨»#kÌ ª I)éÚ1HÜõ¨ŽALŒýÆÌÅ–µWä¹gÑ©hõß"\1xÄÜ¥GDxð+ÚÍë‰ݹ&PJÖtŒ‘$T«îh©´Ï~ààS¦—TŠ…˜ÁBî;ŽÌk0¢SúOs¹»ö–™¸Gº»_GùÚ0Â[[ªP`âZ“ÁA ¸Ï9ý´œá1‡%“‡ÛØy.H ‰àîP‰‡—q܃BDA÷D·W—¨GÐtO˜HN»2395Ñð˜c ±ÑVy‰‘ALÉìyÝO÷ûuf¦×4Ü)#õiÄ]Ë`ŒÁ­¢6(q'Éõz•»qˆß%èæ»€8©‹\·›´öxR¾§ºÔÎ#ÅÛH?”J‘”9Šð0ò'¯à^h¡pMff¥CÑsà¬×´@ÅQ¤f „ÙªÍÆÌˆ®ÍÌŠo¥j!J+=;.(´^6Ep&Z†ÓÒ2¢ˆJÜTX˜9}ÏHm”9‰?Ú= Çç+’Ò4à#Ižwf 3_¯×›ßTòí'ï¶ùìQŠ#Ö¾öÞË-â1¢å;Û,ˆÇBÇw$g5·¶!…2³kŠ2Ûö""Ú„™lìfOSPg¥FûØ*­BD朾ìhJ(@&¤6ƒY"þPXP)(3ö}_Öué=¦Ø÷ ee`}DwTGÇB‘æµKTeöÎNw­º9gIõݲµN™ÎÌ>QIl´6-ÍfÇ}Li¡swiçÕmzØu\¯þù †¿”úãÇnþÇ#"·mÀÓ¡ÓŸŸŸû¥q×0ÊäŒöæÍ§_|þ3ÿÉw~—˜¿ûÃçoÿõý´>=9~ó}çýˆ7Ÿ¶¦Öõ¾üÓåF8­ÿùùwØ~îßÿwÿ£óWð ßþÕ·ëwÏ¿Ðê`iMÔkï@0Ñ~¾¬ÚhßoÕ2îû>§ƒK+›eRÅ̧¾Ì<ÂN×u-ZžcÒý4-x-"æ,`zÜ9Û¶1yM©¥IF*kæaV]03ˆÅÝ{¤4u¡Týð¼Q Ï”̪Å0/ž‘xÆÝÔˆ„……2ÙcgVB '’²iÅHÅ}Ë®½ÌdQ°x"ˆåtú™{—_ë¶ì>è7s®µ÷9ßwUNů¤ÊJ;D&‰‚P0)ŠÓI:Ðç Cƒ4È?@›Rh¢ƒè„BÇŠP¡âc»"Ë®‡SuëÞû}gïµæc­ý*Hb£²Än”®î=uÎÚkÍ5ç¿ñ{\"ŠyÇ\‚±Œ®íOZfºÉ‘,—Lbæ¦K„UâëûÛ~Ô ‰2Ä$øŸãUHº¥Ý^ÌYP^ùkd‚‚K`l»ªÈH}®ý’šA˜äÁž­D€'…ˆ ö03Rí$ÂR$,ÕãÏX–Ez33 ÊŒ×ÓÙó©ò룚ˆDq ?†YÕLJâŸ"ER®Ï¼¬G ^8˜”Θ‰|¸¶˜ÅAg«_“Uåà—âñÒÑØQÿüø÷)|â°…x ›Ÿ<ÝY¬™1N5r1.Ǹ\íx8Â-Éeèé‘ ámßšêBÒXÊdjò Qœ•ð˜¾sYî¥`hkÕ‚sWÙ¶#ù48O$ƒ$ff¤¼™u]·ms÷Î ûúkά¬,LlpìJ ²6?^ ó”––ArXíÓÂÂýy.ªµò ®ÑFóqÿ«â/$|ó©­½ýø£¹NˆeD>˜•xX›ÂP”°ŠH×û>Y–sþxÔ»ñÐè²zı—8ˆ¨icÖà RåµHkº˜…‡W­™¯Î’ªiB5݉9í¨`šêýý‹ªú4´¦ÄDàȃÖCÜz;²E™*ÏÈgÕˆ0Ÿ†¤ Mà4$I ž#=ÂX¤\+Ôì€â˜9O÷U<”®Ì3¦± Õä V™Eõ-.— Å•`iÞ’ˆÀÌp‹ÌÉ"ªgòQ¬‡;¥, Ó[k|†S„ŠxD*„3f7GÄõºNéÓªCEçô˜QoÄÛ·o™yν¬2sYŽ¿~½^ge2³-ºï³ðu]ËKÞÂ)RUÇœvL3²02m "î*fcÌðµ_á(ßûýÞûŦ¯ x­ØËåòîË/ˆÅ,Y›ª&…ˆ¤'<Ã<Ì–ççA´ÝoO‡_Õ³”€fâòt±˜-þ˜Ž¬Ÿþ‰«>­åLzÁÅ|ÛYTõmÊûœ‘R´…²cˆî8Á‘n/ÖôÍN„}ÿ³ßøÆ_ýÕoüÿïÿHÞz£LšAÿÇÿùmå7añýï}æ¼Ó~Ô{ß?yêWšþñeùìKÙòòôÉ ¾zÝû?øÖ×øg–ûxÿëó)óúœ.ï÷˜¶wf´µ+iN‚Ó~·uí·=D¯»Û̹,rA‡93{NBd„› kD²ÊmßZkaÖ[/«»3Sk`ß§,IDáé6C¸1÷VÉs#"éM8÷1Fz‚%È¦4³3HìºtËÈÌ/)ÒƒæäÈE[cY ïò>Æ\וáCªKˆÅÓŽšÀ&Q™‹-µXglˆYX†iÓˆtJfáÍÌÂ}rÛ2¢³ˆTKFk3|Cx:”ž^Íã«ðaÄÜïÉÜ|‚¹‰æ¾Õ+Ò´5¸q¦ÛdÎÆ²×f`mÓ#öÙô8ÚçÜŽ ÓØ¼÷N­¡å€>­vßz[rŒD‚„W½ÏYà^lM„¹‹RQ+¦Íu]¡‹ŽðTްdÀ½]æö>#ŠL1}·H¸·ÅLNΊŽ±Ä›03yfÖa7,«°#"ursNB¯ƒœU•õ }¨_åá’,‡=W8âðí9ª¦Ú™äH§`%i:ã´HÊ`íZ—¥¦l‰p{m8—ÞÝ÷ºÈº°1FSåŠæ‹XTˆ 'N!U@!ƒ8@}½dìHŒá—õé>î|pУk„qizw‰2™‰3RÊgñ•ߘµeæ&$ A2Ü…ç>7I\û²mÛæó±ÿ,M3“Ì(K*‘mn£ƒ¥·=6£IJÜuÛ6~[—ò¼²™­-Ê+ Ífïî÷µõe]ï/7%&j'2‰¨˜s†ÌB´kq¼’©K;¦M®û¾WÈ7U€œL4múð§ËszÆËÎÈ$ÜÒ#°˜¢;i!lbRãÆÆA4¨ºÂfŠ4V2s(弄D’cF˜šj  ”´6ºŠÛ¶ÞÛÈËAãͨ²>Ïš5#ÆIÉâ=[f™`VqOÌKëÌÚ¤Ï9%3C$Ậ"54m#Dkt¹\ªX¼¬»ÍRܸä ëÎNɽ ›¤u–\úèî€H"#¾ûbNV–,ÁØ×‰Äðœ@(íy‘1©D™Á™… Ññ;‰,H²é*<¦gf_.ïÞ½«9§©°)&y‘q$#T”®:çcg"R™©—g¿¹ïµ—miýÝË;‘Æ"!éi›•R©‚âA‹€àMeŒŽÞ[؆eÆÂ+ƒÃaÖ¾|ÏÏËíöÂÂî3–˳I$Ó„)Qcömè”¶ŒM\µueRvž]–÷ïÙ¤gDÆ ÖÇ´&ksÞ}:ézýÈÝÁ#Ù=­‚·Tж,ÛÆ6“‘oD!bBh}‘QKjIΡĤâÈ/ö1ó' þÿÒÏOÿ˜©´>òÕŸù||¹`™„¸IY„›ò,N‘."Äœ$ññW¿v}óñg;aߘ8~´}íçÿìç?ø’‰]b}bÇ–óÜ÷y·û¶{ðúÚwb~Zü–Ný‹7óþÿékßüÓý¯ÿåŸÿúW}Yú%€û,V|mý•ä2͘h-º©—-PFÔˆD˜b÷Q4ìGcZ}@Á%p ¢±›ˆ0«DZ±uÕÊ­(Êû{D|ôö¹÷®BÔt¿Ý¥wNŒ(µ6ó>FÕ ¬J .*útwîÀšc¯ìÇVÆû"äD)*á…ËÆÑ>œ€0Ž(wÊ„Y@§ZåP@LWÕ8¦$i$´ÞÁÈôR}•<Â?33©æ”¥ƒ!ÌAÉIÙ ±ðp Œ(xÒ9M;LækضM$"f®„¹p/ "„ç„qᔜ C81E¹N•åÖµƒb½ô<íËäH§óÖÊp}/Kf.לú;5>PÕÛíVä•¢qˆ( Y&­0sHÒ3"²|•ÐÎä<œdð|E”~5@çÇ:§š‰Æp÷®uD‡`+½êwðþöRkû×öÆ#Öu9„˜"[’›MsÌ-&ˆtºñ±½gfŽ9ƒ¬÷¾6sø,ÒV„%!™)MÝ£ûÅ©°Û„Ñ9̉B dÏÐSjòGÿüê*݇J×ÕŸ Òï?‚6垄ъ3;»t¸—¥ƒ³ëuvüÞ|ÿýÍßío¿ÊŸýè—¿ñÍùîÝ*íoüúßúïþûÿá;øCa?ú ¸E_šè2Ç"KÒvó1ó;¾¾ýÅíåý²¶_úúÏþÚ¯|ó—æ+W(c¹Ýžkäé­K¤¤µ¦Kw÷ŒXX„Ž"êÛ Å¶m½«‡]¯×…£–ÆZ‡û¾[8á¶êBš”ˆ#‘†êîýD‰†W£œz *óxÐ[X˜)gZˆ“’J†FǯڅˆÆ6˜Yˆ*”êø»íļþëyLS‘;Ú‰ý(»3‘Å÷`‘À±Ãp?.øùé Ýf6Ò¢‰áDlLŽœLšDIÇb "ADpq‘–&½EÄÈ(ÍTDre&no´õÞU8YÕEeð–‡O¾Œ’Ôš0[•3öF)¤IÈ@(=Ž ¢W¯ÿq~e!;î~ß%0¦].OeÔA¤Ìà®íþrSbfªÐ]°YKÍÐA93ÁD³¯UA‰/D´q#b3räS’¦ï^^ÖŠ/fö¸g¦dF,2÷\%ÍlÑ«2MFÀm*ñår™àá kM#ÈsŠª‡—~³¨<[«[Ú“`HGÒº(±ˆø~ψð@æ*Àÿ¿$'ÿ >?…ú£…ïöîó?¤~áÍ—·}ìIòœ4a?ð~„Eÿ‰ÈôØo÷\YŸB—øþI[%ÆþtYÞßß½ýô _Ÿö7ýÓûw÷}ÜC, #¢Üï{>Åž¹Ïÿè?ùþÒ/ÿÊñ÷þ«o}ï‹ïÿÁïÿÇÿùßýÆ/~õïþgÿérMéÏlwÕ^†Kî±,Ë;à~¿¯ëJ‘Â’‘”b’ÒˆRd¾}ûˆû6ªïY–¥ü ²ìž"Zk¥«Ý¡H?½kBÆØDh½tNb3˜!gØú»w_krÎI"á’ „{XTl" A®©¼pú]D)ŽˆÔÖ1§Ika aQn6'ŽæI€j/¨‹z>ÌÊ L\ÖÕÌŠ,©ª5Øç^âF1N‘(Ô§v–ÖÚégDe§Ã@ŒF×¥ü œ &M7R*swí"JBB‰Ð>° 0áÒ'‘ê!p°ô®ôA®V:ÏëåâfÕ)Ö˯‚Ñ;Hí>­·:0Ü¢Æ#DÜŸê× “Í=3KœüxÖ‘åÊu¾Ö>[4Ì|õ‰ˆE>ÐŽM Ií˜úW U›²ûÁ€)‚ØC¤¡i´ÈP&Ì9‘þQI§BBD3‚÷ÒNG ¬ëZÙõzãöhª8cPW0ÝY¸t¢½RbiÔ”¸W`q„«–P<Ý÷¢ÐâÈËf”kUêuNÓ+ó:^"¢†‰Ž¼oÛr½L7îͧGïv»U’êÀ‰0Çõi°ffIµäá9ë¶à•/Vž°Pž6ià1"*à¬tÂiU¶á$’ìW6h"g€{_Zœú̃ZaÉ§èº Ã‰ˆTº KZki‡¡øƒÏ^UWÝ¥}Ž*hü4žçÃ~Û¾×û‚LP$‚(™¤˜^NJ^Dp²"}zÐ[SÕmÛ2SE’ÙÇQØ=ê6sGr˜Å-"ç¢ËˆIÄŒ`æ"MDÇÍ)šgÝÃ÷ïß+17­7¨_"Ê9ñt¢dr"ŸÛ’aî™`ÀEÄÜ÷9¨n,áÍeq¹Ûªœ9mÞ¼–ı6Ž ‹E—Cx dV24Õu]ï÷;2Ãɉ›k뎃€•g{P»ßÃæ\•XÌ©µfî. ¦›Ó͉I˜ A‡9ÊåéºïûËviW-7wim©þ¢/ýn‰’’Œýao.W"zy™R)˜Ü©½m6 {òÈ8Öž”B ’êf#­5ìsöË•DÊFL@‘QíŠ^”49ÝEÈ"Ün/‹öÇâ¯ÅÐÀ3yx -#-±°Y0ÂÝ+çëŸ'=ùç}~ õÇûËûïQx0e´g±©9ä '"X’gÜÁ@šnv:ÓgoßäqÿÌ}yf~ûÅ;Ž|\øŽ¸g’Ä#´Q4"Œ "1§ÏÜo—7ï~ðƒë_ÿ78?ÇGë›ïÝ?ù¹?óòÃùíßÄ?ý‡Û_ù«_ÛÇgóãOg æXúUH68µ¾65Û¸aÃô@.¬ óUÄãý{¨È*”É~YÖItOW†PfB—®ªÁ bÜg¸ûR#yǤ¹—Á¼KGÍ u ‰’´Þˆ3û¾ÉH¥C™¡à®mºO7>áD´tx˜’8ÑÇDiÖlf&ÅûeÐ4ÊÌ HI@/.¼:2"¢3FIÂGކ™«ú?aÕž ÒD;$Tîæ„ÇŒ)$k_lÞE™ˆHVº¥g"ez#"в¹GÄe]))fD7fmsNŸÅ¯ç1ç岺{ [NÍö2Œá¤HHˆ’ùÆ$­ÑÕE¸´EœP‘í¾§ uuF"!*;:éˆ=In ! ]€ŽÄÒž³=ÎáÚ”¨)Kzd”[Ÿ!<^Y‹Ó) ãWtò qL|¸Ä¨í 2t ‰‰ ¼ä "BBø•‹h;8kyPƒË[Ýû~W­„ÚÁM§%!²ÉUûý~o­QRLoÌŒŒÌZR‰¶*'öÀ¥z[êà¯ð-ªl[KféAHd°;âÉ*IâȞȵ5öˆ"÷f“—¹{Íè‚ —¤uU÷™«J’ŒaKëyD«ƒ™9'DPS»ˆ¤Q¤Ôˆ¯b€˜yŽÛq´DŒ»D„æD‚X¯Oý~Û‚¨5ó„則¨ù†èz¿ßyQ³™]XDÁYÉ¥Ó‡‚Ê}ÄÍÊ…™¥³¸ðlRÔšáÛ¾,—‘ÌÉá™A’Fé]gû â.¡á™œý‰çœ÷1×åpgÂÆÌÌ.œ”3‚@ËÂÈŒàEj–ĈÁÔ•‘”Ö˜&åËÜ1wé}s‚0ç]DT$<Â’’áqy¾ffPKŠÆ ½Mƒ ú¢¼ô“’­”ü°}£ˆ’ç¼}ºF„#“‘‰='ˆV¢Í&„ªÜY ÝsØ{Ue¡žA¬±E‚¥­ש?Œ<†(vOákП<6ÞÐÍÓf©š¾¤AšÔˆL‘aÞßoÉbКœædnƒ‰”9™£ €* óvGµø‹¶˜žfâ±<_-C×$Sîs0Á×Ö÷}y_–¥/+uÖÓÚµj5ɰŽ¥rÚ`n]–»ef@ú²¬cŒmn)4·3ˆ¦Ó¢, ° –LÎÀtÚôÉEט>@‘âá[ë›ÌÊŒÍyz*#éÝ—/Ï—+<ÁÄÃýz}2‹dšnWQa‘Œ”˜Û$¢ÞÔsNˆ¬è¤,ÛÜ@<Ó¡Ë«xø)Ôyà®ïßG"%“²æýÀ9¼¼ÛæfˆÊSeK|ùå—fAM¾¬oùÍøÑg?üì÷~ÿ{_~'Ò1Ð_¤Ë§Ón{¾÷xî°¼¬ëîð o/_¹èò¦-î¿øýãqŸùnøŸúÙ?ó_þ½ÿú—ÿüØŸ$œˆ…«jÎ ÷ä‹dó°0""–r=Š6FÝÛ<œRuß÷þã»×‡®ýô { AŽÜýˆtn­åtŠ0”Íž“šc"†'ãÓQêÁ8yóæM݇®-#Ý,™ö9 ä$Öã¥{ð¢p2ÉÊ·êaPû¸ìzÆ>ÌGèÂeú9çfÉ`}×õúÔ/eLR¶m…·ù©¥TD¤–bJ,Bk2%E8’Ó‘9miëà Óšþ¬‹#Í#‰A€páá1KÑE×u <„ÏQˆrEÌÆ™IŽ[š‡û¥ø´ARëKD0ÊJGøØ$çú)äµ_:Âc«0±O2“Àx%„v?ÄÃeÏcfoß¾½í[xýIê_þŸÌ$xéQ3£Lñztì¶*:,ÙöÝœI)bi´,m»í¯×oÿ“ß~óéÛûËøíï|[–§9ìO?­¿·Í° H(M%Ÿž?_àÏãëÈüS_ùäßý;¿þÅ÷o¿ûO¿+ž÷÷ßý·íoùïþÜ7>µÈ˜&Ò”¸BÏG‹‘Ó¥1ñ¶Ý¤í³µ%ˆ¤Ü#‚U_ì.]8©•a‰>¦™!²„¸nÚ9Ð&4U¦0‚2£õ%3#¬N|´Æ€Õ>,Ź$ß§”ÑPxdD‚ˆâLj¸v¿:5_£ÇG‹|3£ÍáÚ*zû0P¯. ^ó±w@Uíc±þ’iVÀ|^ô Àxfûò\Òv(}FP$"KõãÅ`6˜Y/‡lÙF†MemY»Ø*ÍÌ”¨œéŸŽv™*aY9¥|Ú ÍYg€SBXDÉâà;ÂÌ„4¦ sdš§® ‰ÐÙèH€E÷ý¥¦uöŠoXË8Yò®3áAS-ÆÖO”ƒtÚ#–¤°àè €p÷cÖtZÈàDwqÖ"t (ÖóA†e¢øY§¢Ô‚{”¬Ææüh¹7&ÞmJU¢yÔ •$ðLœ¬‚ƒÙP+íq°=ø¼¯VøñɇÇy§%î¹Q¸ûˆZà|>2c•¦ªE|!63&Êt?§iYXï'§®9‹ÿèºÔyÔyÜ” ²Î$ †hcØœcékÕ~æ€<êû£¨šóuáXË %fÌo}-föˆWÔ¸‡ípj©âîÂÜz‡eœ2!÷È ÁÄ9lL;F]EiPy¼)tþ®1Å18`f$¼ˆižë 8¢=lÎp÷SýnUm7éH#!6Ê9'<–®™Î„, ¯¥€Êzd𙣳dÆíÌüHÑò?¯âDAM=Óm>jt0#")Sé?éàÂ8M>X’"T+*qli­“PNŠ\¤*ù´CwwJw¬4àj# HBŠ€)‰¼Fu„Ò¬žÎc=$ÓL˜–õµ'4Ã-v–”ÆÛ>‹E¦G׿óLü©ñãK_mÛÞåÌèE`ã#°sß÷·oß¾¼¼Ò‘LkñË[ãmÛܧªpíKÅ?;»ÎtgU3oªq(8·Ë›·iÅð>ªÆ}ΟŸ1}¿otÊ)H˜W23£˜a©IJ¬XŽ7â¡2s1Â|ŒÑ/ëk–ÞñóÓàŸ¾µpKA¹ù6)Ë@‰ÂuXG0`Iá<´IÎÃ{ÏLÛ·ñüÉëòƒÛwIñùûQð`Ü{ãqßr¹¾ ÏŒ„’ð.÷†7·m~ïÝ>Ñô%ß¶O~囿ú·~íoí+ýà÷ë_ÿ¥ˆçw~YùÉÝôÅûw—ËE/‚— ¡¤¶!šY4‰\ž¶±_Zë#b ›c(¥çØHL¸'Ën¬ ¥öesÞ™H[73úÒ‘l",¬á³bVmB,J·9t°2ƒÔ%÷pT>sk™9¹jŒV¾™"Lg8QF2=üM ÃeÁÚö}mH¸dªv¼$)õôÀ„õh—6·ý&‰ë@#÷û­µeYÚívk‹¾ys>¶m“Ö“yúLbJbnDb3iNI¬MŒZ´öòåŸ~ôé{ìûÞ®²,ý¶o*Öe컸w¨:¤¯;!Ÿ†DsgÌ ó&œˆ7o¯÷؃C±ÐÒcu¢´H–FÔþXÅßTþ‹ˆøð‰ñJ’“h‘pYß Ip8;ä=ffpûá÷ß]>þˆ/¾ßÞÃB° êñ%Ü)Çí½ eM@¶Ì/2ÞüìÕ·í[ßú­¿ö×þÕŒ˜/†ÿÒWî+¿ð³AsJÖkô.,e"ùðˆ¶ö˜V)ÛÙI2srnsï½#(9“ òÌHp‚^»C'ï¬(ô˜ÜÃ¥0Ê2©NTI^¥¶éÒ™Ay„ ¤zùø1ž(‚¹”û-Oæ $ÒÎÊ¢ê÷ûÒš’ºûœsÎÙXšªÍÝlpSmZçeÓ^q£½w4¢D˜HN"$12sÎ0+ÓOmÊàôˆp'ª)ø~ß UÓÀ’™·Û–ffÅ8nªðpwmD)Œ˜vÄÉ©g¦œ¹eªê§ÐãGȲ4Q‘TGƒ{&·áôÝRÕÖÊMäèY‹]!r´ÑJ  ª–A‘䑌#Yé0À%å4òRÙHýÚÆÇöªªó¼à|ŒŠÉY!“U¦6̧. 2ÿ^6Oq ó‡ÈãúBkåôˆ­„W•y( h¿Ý/—KL[—kñ cÇɾ\/ú˜A<îØ£•ÓÖ@±gèŒä} ñJLkf#!§ cÎùP->.»†&ú§RlåúúqŽœè$Öø!N!1 ¯âúAuíK1g3ÓÆ¾,ËC†}Ø²à“œI1©YDT$ïõz}Œr^C5"¤(I#v£pG~PQÕª²cí "%¡ÊPÛ7âÃÔáõfXUTœîcƧzˆÇrRU9é´tƸ¸;‰>nH-u&ŠW¿¼~ÌÓ.k—’ˆÌ‡Ú¢zœél–롳@¬Žû2",<)‰Dµš=ç¡v~ŒáÓ:<0׺Ú·!TÙ+3–…IZá¬}é¢@\ˆÇf™¹’Øû»@³5~$Fƒf6»ƒXµQD»hy—ɲ,ªj'Ý ˆqߘy=°»a8qÊÇÅezDZb†³ŠÏð‚Ùjc¬®&=2²õ6æä†e•ØÝbÞ¡‘’ e2¦d…u­Øáæ æ™¤o»&ÖËMcåá€pÀÙ´›xf3û˜D´¼yÚ÷>×ç§HÛ¶Íc>‘ÒH‡½aµ¬’ 9Z¦™©²¹Aøz½Þn7"5÷u]“²`ÊmÛžÖËœÓ2fø%yY–——wï¿xwyúˆXÜóðrW†Ùíý‹“·ëJ±˜¢ÅmŽaI¬À'ô:áOªþ "0˜^Ïð‚Y˜ÓÍ ¦óHIçÒK“0yºùÆ×Χ·Ïœp›9ƘN·@wy¦9wYóÔxŽ/žþ½ÿoþÖoýÎÿþ­ßû¿ñþò_ú ¿]9‘ƒOïÞ}>iPã»\JÈçÈS@ËîH®·,ªÛ}ƒðnáÖ1ý«D”gZ8ˆ4¸Ã\#D¤T³ˆùœë@r2"gA"ˆ=#Ls$+É#'€.Ýww÷ÖˆõL€ÄÃû:Ž9ïÓÓÎ]þv»¡)]’È<Ö§k=¬Jð&=Žgœf"ž5xÙîYÎÓaB̉$0Q8õ¾fæ‘ðÞNioõúîn¶,‹#“™÷ûÖEm{:}Ø‚‰j`MˆjY˜E… QJ\döÜ: 3ñÆ‚ª«ªÌÌ¥·²¢ÏS†J… FÄÚþ8ÌL «§\–eßÄÄÒX|ƒ“8$ã•R@­õáö¨rÿéyä)¯0³#\žóǘ5*îÎý~ç¦MÕ2JÌ‚“R›û.‹ÿ(c»—dæØñKU‡H[¿¿¹^¯sßIÚƒgPߙǼ=Nâǧæq†Ï&l6_Ÿ(ôŠÑBH‡l”Ú‘0¿J·P9ãøq¿]œs%­n¾j´ó(­§ö3Õ«:Æ(¯·Sp^Û¶].—ûýÎg”+¿25ܪGérP›rÎã`±'ÄÝ…Ïé1 q̱„Œ €‘a:DT¤ Ù™0ðú³m›ª®ëúPËÓ+»ÛªºÊ‹eß¶Çê:U$|ì¢Ë²DĶma~íË1ÏBR…‡f ª‚€ÍŒÕ‘‚0»£+×W‹ˆ³{É}ß3¨¼>3“ŠNd‰Ìp&4›iÓ#¢*n"ª]èÑ`àœä¾î1§³€™'S…CÚæ ˜HE™…ŠÒ¤ÜÇö¸‡5‘ ¤ððîl[N¥wÕsÎr[bÊëzq÷°ãV#’„ø$™=ž)B$,3,ÒÁÌ’|&VÑÙZ“Æó>˜™xNÛ„˜8X•k€æ¸;K '¢ ²ôh ¸#RYöýNECQ(³’ºgRr'd¤D$É„—¹§Š4½3¹hËY†Ø”¥Ç‰ðpQ]–eeÞ^nõ\%×°ÌŒ9gy­4–Vj^Rá3cÕ½÷¯\¾rÛéÙ„/ži°YDkÄd”²Ò"œÿÁ?2S› é>÷Ç¿lTÚËàÆRž}>Ý ìŽ9¿dÛŸÖ¤ì­Ï°—}ø—¸ÒbÛ“Ð?yËëu»ï>.øÂþâ_üæø_üù_øßþýßøßúwþÆ¿öÙwþÙ½¥ÿJ6Y–7]ںݡ2˜‡µ@ñ%‰‰E2}Ž93×~á¦wѸ ……ušeÎÄDf[5IÜ07CrFdúåù*›3Ov³ 7&¢ ÑÐj‹ãj®—5˜^MáÝö.ùkcj+ζGÑ. ÄNB9‚˜ÍÐÙefôêœÙÌ3*‚âñ•ØUH[s¤ÈqL¾yþdÛŽ¦ðî{k-U© ûˆ„²0d‚ÎéEgL Ò¨wþ Û¶&J58­_ÛZ[ZßmöÞ}?éæ•HOœ s7ä°}zv¼Ýxc˜ãÈø:v7" mÇ‘ù8`æœU¢ˆHµ’yÊ\4·ûý¾,‹Šfzk:ç,ÒÌÜï[pm`²è"ÄÄt'Ͼ#¢˜@ÊæOUqZ_¸ûOÌ_” _&þÓ& Ì:žŸŸßßoÛ¶igAÃgêz_>¼É….ؘ£ˆøbRžs"!Ìožžçœ×õòåíþü¨S_”JÅÇ{Z»ö±=ñ᨟,‚êƒÎÉÌŽ*€HË.€¨jA ¯œ¶G‰Sø€ö%>,˜€WŽ[2hŒ¡Á„Ìš IDATçyü`Æ•ô±­ äø.ÄÂÌæÞ{¿ÝnåÍSEFµwÌ\ó‹ÞS©$ôõ|F5=nrD€#"ÍfÁ0…ó@­e™™méFƒIZúæp§Ê!{å{VŸªŠaÃgÂóår©[¤«1Æý~_—åϨ|Ò´µ8 …ZØëºRv` Q“ !™¶ÿñø\¤±p¬KûçBÜZ»¬ëœ³ð2&aæâ]V°¥ˆ˜Ï8½vª"ìí¸f=­¸q©xUýöGcÛúûßü/_ùäç¯×ë§M.2}YG‚F^T ©ª’Ѐ‚Ÿ×Ë|Ù/M÷ØmìÒ”;‡±ÙF QÆÁ6'Ѳ Ǯ쩠´¬Km´ÛÝÄ$M b&& Ì·$‰0ƒ‰ÍláÆÌÛ}iB€y¥•“¡áp÷=`e~ú_1‰MÔëÍr”\ umâJæP&J¡0¿t·dº2(É ÓÜë~¹}ÂNî3“æ0 X *Û¾/Ë’.î`N¨IšÂm­u1›Âf­¸°Ÿ» 9ï8RHí$?ì b–ƒ¤,,,-"<’é„TpdÝ8±ê²¸‡`Édp°`Ú’™Áš–ÌbªÅŽÄe¹äÛª¦°Ï!Ò¶±‹ˆ¹ )ËÒHïfFˆ‘æ±,+FGøƒ£WÀL˜¤H*¥!Ê»§>^H' <…äð•° Ü<›(2)òÒºP¶¡‘¸-Kd›Ð‘î¡Ä¬lfsÌÖ#'wJXZÛc8…{6,°£Hbæ&ÒUöbÎÜ­v8˜Ù™P6‘½ËýÄxBû¸Õh­3×PÝUˆË‰‘¨$NÈX—£¬É“![Í}k-³?AeÅÑTŠ]_ÙuŒ©ê›ëSU6žÁD–‘æA)¢Òõ¾ß[kœ)@2…[8˜jŠ˜L‹0"Öupð‡c’ˆ8H»ÌB¹$ò²,GY@ó ŸáŽ&åØáûVAežÓEÄ"É£?­EÁ9ž]p©ÈP0€t7Ûýž™v›ãâÏ©,kãAYÿ%™<æ¶Ý™¹Y½7Œ°ô#ÀÆO¨(Š·»Ån$¬"ç§…ïM‰î{$c’YN*É0¶+éešæ¶p'ÉH=¢DúUUGWöáœRûžeTÑ™åÏMÌ÷û>ÒAhÊ‘‡™ˆff’R;8Y‰.ˆÖxÞý`ï>].÷ûÝÆÌfHåä1¬®m§¾$¯ÉÈ}J ½÷›¿#JeN29‘ ÖˆF#¡šê"‘fD4æ bN&w3ÞZ–¯hzˆHHˆqz’žãVÑ X’OˆHgrÛœÿ7oïòkÛ–Þý¾Çs­½÷yÜGÝ[/§Ê±:ÈH)4à =z4i"ºH hz„c,IL& ”ƒQU9~”íº÷Ö=gïµæã{Ðøæ\gßr¹œ˜¥*éÞs÷Y{­9Çãû~ßï1üžOÛ¶^ôé&¤i>s‹6Ñ6W d€Ê;]bca‘jU-º*oP ðis·«Ñ@º[ té´\ïïî^ðù2./îîÑX¸%‰«;Ùùõ)r  =¦LXïýñí[QÝ®Ûý‹‡j²Ø%‘ ‡¯ªÔÌ'3·‡¾1ÍEä…‡’X ¾Ìë¨ýÿ¢¿=(¾ÐC<=o[P‚ "ìã àƒ¯~ôé>cHnQ3ç·oï^ÜŸN§.íÓxkŸ¾ k&QHÓñJåÎ&½ù¿¿õ«Ü^Þß߯´¾øJk‹íüê|ÿåŸùúÿõ7ÿÖ÷—áOþÌŸxÙè|×s"ä„xC"Æ+=§»›»‡›S2U0?3™®e¿¨„2⺭¬DHd¸[eWò!j¨{ª({FØÒºm£‹Z|Á‹ú4()óúø”÷÷÷|ncÝEÏKÒ›?UD"̉=e’"T?Ï,–áåyó€"vóÞšžÎ뺎u‘@ wijµf6Ý]™ˆ*^$êR1ó8&¸·¥HDä–áBäÛì½Ì`O¿ ª×)<³ UíÕ·˜öÃV⡽{¬²$ûŽõî¨C•Ž8ªõ>·Ú"ú&.T–ˆžËL…©„EDåÈo´g€1„çœGŠèœÓá²h1RöÁ‡êm¢‡ŒuŒQ£“¦mŒØy*|˜l“°™2ñŒjCGèný§ýP9H!¥ºc÷MŠ#ù“™çÜóÛn½µˆ¸Çó™H®çq¨{èGµÌ–äÓï–%3]Â’ôEä$ßýoÎ)­á°Å ù¨mêX¹·•C‡A‹ª:£"™Ü÷è]<³ÖåÌõ퓈d„ì‹D°(§Ô]~"{ŒÜî9öü£Öe¤Èôp‚pVê¯0ˆTuY–¼”ÍXx÷Ít È@L’yÍÅ’ûdÇ2)"á“T€äL•V–b‡'ž‘`×e¦eŠŠ[Ö]p÷J€+,A’@örÖ rÿFQ¹»ÒD„=É̲,«ÍD:Rœuyvf}fòQ‚§pØ¢r3Dªd ìQj^c''8#=llÜ:n‘á5[Øæl½U)WålÉ|2Ø=f‘e.œw}W2‚9•IHEçØnd—<쇉(=ª|Ë*tŽGÀù|®µýôôÔOËv¹Ró÷îÓÌæ@’D)¢fvwîcN:6À9lh× ÜE³Aðy2˜ùÔZ© T¥Š¿:æœmé.¤©DéžÓ `'„Тš%èh*3UøØ1ß¡ ‹Úþ 9õéæ„»ë•UÅIHÙ:ðŽTó‡zýëÛæû|˜~áO Mعo§ûΗŒœÜ‘m‘ ZiÍð ”Å¢Fƺ¡Ï]–NAÞ>s»nŸâþþþ·ó·ˆçùƒ»oý?¿¡ÑýÛßú·þi>ýæö´~pzõÐïž®˜)ËÒŸ™À¡žáÁ”§6Ìî—>¯+Œz4€ADl!"Ò— 2B¼¨š9 β•–œn*ÔWD¦•¥ûžL ªg»ŸÏÌ\Yï*"6géTË1©.[ Ü/*q„wz”ŸGfïÑ&ÊVùÀ!(T܉X3ALÄ–âï(~ï6_ #ÜŒ(¯—‹0ۜ׫?·¾ØOÄýSæÃݽ‡ÙœÛ¶õvàè J¤ík€!’G&¶[ Þ´¬´2H28‰™Óâºû¹uwŸsme+ÀaFê•™¹ Î#mÚì½—€è¦½qÜ}Y‘­-ëuóÂI–†]˜J<™óÏBŒj¿»• ;8\„Ä€˜nrÝv«6<93é8Éöаì:ø 9Òõ>£\ÄÝ›*E¦E ³q…f‰hÙ€ «E S#ªÌîçoRÔŠ*=‰è:öx‘ÖZM$k˜âŒ$3'&U5ìÞ[ÖÝó]ÐBU~˜×š©êá&YâÃ~ŒQ,Û*£å™l˜mùIºm[ÍÑèÙ€CvY›ðz½¶Þ¥©…·ƒ9ûC›Oe÷R¢‰–=IÔ7’l]¤Û‡ÉH…ÒED»;ͱíl’ãí²É‰vªÕwR¾Â8X&Pæ’¿`ÞÅÌÏ÷ú²ªlcÞ†GÌ &"r씵mÛ:årêÉ4Í™Y”öSDlÛ¦J5ÔC@˜« M¦Z¥ÔvWïëÅ™wÝkU›uƒÎçsÝ5NhïDdîN$©4nsŒÖšÙÙÉ8É’AOŠtfxàµPªj1sn€iæÞ%(“ ÏÊEw/lIƒìHŸnÌœõlB˜i ópÍ4³>Ã+^'‰H8Á>™)“…vÁÄ@¿_jͤðàíFDD–.ž„Já7n6¢­ûΉã¤kËÌÆâÓ"ÝÍxÙ7Š:˜¹i»®«ŠÔØ«X)çóyQ6·i­µrpdΉÞÁå@ÙÒ-:qx2DIB§—©Q–%ƒÂŒ‰Šn¼®+ºvÎsO"²H&“‘O_K˜ùPŽò¨j‡ñ#Þæ¬Á93ëÚµ1³÷`H€ÈEìñJý‡‡!ÿð×±þ¸M”ÿ ú£.ýóÿšà|x¹N³oyy»*b[#—’”Î.rÿb½Îñ8ôÕú[,Àcà*°Ÿ`ç÷¿ò=[_>~öÆççë°Ïü=Ñ6=þýÿø/~éõ¥¿úæOþ™Ÿýg¿ý?ýÒÿü+û+?ý•Ÿ¹>î·i÷. ü±ùÈ([klmñóD<^žÎçnëÆÌ!d †§§§ZÊ©Z£iÛ˜)BK_Ò®D1šÐ\EY#až3‡“gú‹¦…æ)(ÍÍ –è@抈ƭ-ws –L?là%=˜ÓO§‡Zå3FÀ D ‰­úkFD¬ÂÌ3ÃÌ-œòn¿¯ÚöþZÙãJLA&*‘‘Mz èUš Ëà"E¹1„'bÆ¢­t 3|¿JÃÎzÔ7””žŸv“6ìv¤„̹,mŒ5D¬hæNœ3V=í#^ševTÇ¿g˜Ïáè"Òšº{Ù¬i×isŽùðð°m›YhÚÒ)¯ÞŸ‘×ueíµq¥9"%’ЈäzÓ½+YL¸r*]ïîC-”HHö#€@‘Œ'bL$Ò‚*ýB£Bþ3Ë•¿m6U›{àHÎ ¤45÷ÈdÞgùY\‡ØÕ7ÆwÁ­’Ôf1U|Hw*ÃëcÀÂZ "R•›.ÐôL`êIP!mÓ“±Ÿô7`&3¥÷¬- ´>]—e™™­÷ùôx+/n§cEv¤9ƒá!TÌWL³q]uéUEF9Û1Ñ3ŸoÞ3­5%j‡³>7M‚¥KW ÃÒIŸ±HiK' Å,Ñ…­QðlbÎN]6· )>©ÇšE!Š]7@Yzˆ¨RAxù4\.ëÓµ´ÃŒåfµbä~ìx»OÚˆ5³Ð á¤ÄâD™ì^å<‚à ·€°´>ª–mÝÙË¡_+ðÒ½‹zÂÍwTÒ£‰hë#œÅÏw\"v72³ ½†ËØms\dFº¯c®z׺ dó ¤0˜d­óºNæF‘û=‚ˆ©)Á{çÈ%`"â KLH¨œ´¥]˜$¤ªõ±99ÓƒR@Ì)rõyC¥»( ȤŒÞôôŸŠÈù|&÷1Æ^¢< ÷LÍóùa®ºÈEósím¸q[–eÙ®¡Ù`" ç -ûÝ€ T;‘¸e*Ÿ‡µ6εNhÆY{[sÁ޳è6§» £­ãº,}¸µE×¾¼y¼JÔuÈ¥÷ÝX¦Í©­©ÈœS€…•mãÆë6f8‹d“ȰË™*‚F#bŒë«öBïîÍFë=33fWø55‘„ÅUrÄÒQ hÐfë²,"rÛ 7³»Þ·¹ÉÒiáÓÝùñí[d(2סËýi$¼™kk페›®s¤rzø6„ø”q+^=\cJ'xØz»½±uýê‡ïíÕÝÃé½ö£•ÿøÇú3_ò±½8¿Y'Ý-?hk{ï?x#[óœ1‡_€Ùè´lOk?ŸÌìþ+ïý þ_ùÅ_ü߈ããÏï;˜ …oOo?7 #Nýüö³ßìˆÿãá/ü«ÿb›þWþÚoüŸó¸¸_Nx¯ElcÈÙ»j挘 ‘Ø"·Þ»ˆˆÉmHdÚÅ«ƒ8{ïsa멟̌‰)]Ò==z«dBÎuÄP…¸CÁäMD(7¦­Ò\­²×3ǶõÞËÀ š aÞe?¤åËC"¤°LfVÕ…i›{Á‡{Dý%ªSàûÏY­ÿG{ÊWý4‹ìþÍÕuÝ~5ÞéEwØYޏµ"ÌÓ¡~,z¹ˆ$°gqõ~r÷°Dä"šœYÆb &1Úã oMðrw†‡…§Ž[„òö+23ܵQ$=>ý¬}Y¦ù"Šô:¤,P#œàf‰ÔÞ‰àÓ×ö¸õÇ«fLõÏ7¦m˜•€ªŒgBÃÛýj²kpíÌÂR# ""&ls²ì$Êvœý7L‚™‹%àÆŸm­Y5îID¼ÃU ”º¼vûôœ(œØ#uT•‰”x—/37ÎÁ-Ç$e§©žÏga1­µâ“òáÄ¥ªf­âlSW"꽟Ïç˶âP € )ÛZz¾¶å°P¢1FÖG™‡r™òÿvL 9ÃD¹/½JXQöŒ= oŸ$ÉQP£Ò@Tu'ƒò˜)gf쉠î[äykÍÝ"²rno›g]~Ëƒà‚£pd&w•;™dä´©nšD5sÌ}Ï ©<²ÈÞYd‘½—»ÅÎ R¤?âu"  HDNQzf|àÁ~;wwwáa–7/57ndO3[N ¥×­›ÛF½¿§.'G$q²D^×§å„PJ²w8ß €HNø´."§sL0qùè;BóÔz•¶”)Çš”–ás˜ÍÁ͸ïk©¾DäÕýk«çB=o"ÉûŪ ‘'P%³‡Ï„!©“$CA6g‘¾¸…›/ËR­"2ÌO¬miëº:r[P’iÇ>ýp0Ûæ€°4©ä„EÞ·µýn³7Àãã£2¡Hf¾^¯t¸á@˜áÄÁ™Ò9‰=âíææœÙÁ4<%3×î ˜³ k«ÇjÛ¶oZ†_¯å²-!QÐuzc=âíé-ƒ„øÇ–×ïð•¯|lïÝ/ËBŒ_ÿÎwñ‡~ý#ÕùŰÄ篺jïxXŸs;½z1ÒÏí ¢A¢!¼Z¸öf„ŒmQÉÉÀrêïòÙöêýßüài{(G`éI-}¥¤ÌÖþÒû—?»^¾þ¯?þàW.ŸÿŽÒGn+ະö“Q€ ˆiÛ’M4zçeYÜGãV'ñMpY=!"ÑÆž´ô.Ä%¥£òO‚%spdoB±Q± A±¥HafÊÊ”`&¦®YPuÓtUxyö#¦ûrœ4U FfÍÇûrƒ`#‚¢|bÁ,¬QÎ6DGáµ™7D&¢ZffÖC—.Ä,G©·ýýV¼nÛ¨ïæ…"\W¢÷¶^G¸U\v†UËqÃ?“ÞD"öD„‡{G|ÎÙ¤½;„2ËYàþt1H æDYµŸíù{[êrØÿÓAsÙeÌÌçóyÄØÿV¤RIòcWB™¥×ûDd‰$5&m'Í“o1Zžc—B6r² ÈŒl­Ó‰N5ûM8ˆJ|±Y»Öþ¥ô¼yÀr1‡P ßXAõlŒ’áñÎo³ã)àíbª¼ôff@õV–`fh`n2-r̉N"DK[œ±¹!SµM"¬ªIážé¬M@ÚÚ4“Ö9s›{ C‘©‰¨µæ˨{²g*GTÜ”0g„ ÎÒ¼¤ûØ‹Eß­çzpju©ê°ÙZ#Ð67!ÊD§Î‹ÛTôÔû0#áž@Ó"\CD®×kÕßADYÿšˆ\HøÑ½Kï–šùÕÞ?5ýàÕËo|õë|:¡ò¨¸†âÿàyÈôú£ëoÿ;Èí•ϼ½oC¸ ËúèÔä…¼\׫ŽÓÜÒÛùÜ"§Mׯ1}NÒ»?ûd|ëïüÖ azq]§kCH°¹ÈÏ¿xé§3þøôùúöñwð­¿ø_ükÿÆ_øèáŽ}6ÊɸÄP9/Kgsn½ïšJKÌm¬µ“VoÇÔ2ÄËî“”YkDMDsL8”¥*Ùú‚LÔ3spQ*Ù8P£¸Än€Hä>ç4Ê`Hï]‰7ÛìfÓ^;ѲôÃ^ —Ë…ß…H§Ã£©žä1ˆHø†@ noôEbJm…*²o1ÓSv*8™ÇPQUé}]ײ‰ˆ¢¿åáLÂAŒ¹¥ß íªAäP¢#m´“ KúxErkËÒ{áæ!̨RIÞMê#íÓñ¦¥ÙUèµ@Á6¥½¼\—Ö[“ëu•¶ˆò´ÑHËÈy欣´ˆ."ÂEhŸct‘2x~­23ýþkÒçîù@Û/ÂÝâ¨Þ­ßâm›*{œ7QçÍN’Péòî1|¶Ë|z!¢9-œ«4¹áI1¹4ÛYL5ðã ÕÉ@˜—g3DÜ"“º¶õÙ õÆ΃a'7V,ÑûrëÅ{ï…tQDÎ*VTˆvZÀ:W•x7r½á[¿‰SªÓét›™ÄùæÓµ_"FÉÈǽwÕæîÂvîe%lÒ9ãV‘D„‚h¡£/_´å-uù¸ìÇçå§ñx>ŸEiÚ&"ÄEšŽƒZ»ãp"R)€DTNÛ¼»n¯ÌÐrã`Π1ÆéÜÍ=ÜAG0+R„Žp—0sÝèÛuwŠòUA¦µ„êW¨*3lŸ 3GÒîfõìnÞÞªR›ƒX" á^¬Õ¹ÁNäJdR–™¢ „LŠc¡–•3ÏéÄPL÷ì93$¾WÀ²+Œ˜•ˆ‚<È™ "–[†y ]™ÂC„Ê7åšÄ%Ý3¼õe"Y­<[kd¹®kˆX–eÝ™Ñ{ ÈÌá¾´S¦¯—õþá”éØC¼m³wض]ïïÞ#xåOÕD Ô{ß¶uC»PP ñét*¸Nšú?”‡ü;"Ö9¸73×r H S*ҙǜ Šmzx¿»6ÍL„Ý][SÕwFZ‡³‘»?<œ·m»¬×åî $EᾯLÞùàÂÌè2bšuŽóé¤*ÉĹqúÞ—îî鮪ÒtØJnîæ÷w÷wgÑ“à§êçš„"áÓqÔóï#DþÃ_?Zý!Ä¥›Ha"r›`¢éIèÍ9NO61äð !$í¨5çòªO÷ô§t<=ù/_,wòÉ:Í2·~µ¸{ýRÎ#àù¸¾~ýå|ò„៾ùmèr:Ÿ[=®ˆþðƒ/ôéeüÎo|þþë~âÇ_¿~Ýï{ß}8¿'3Éœn ÀYyÛ6¢¹,FìcN9éB™>}‚“NîžB™ ¸Œ!Ì]ÔfAÁeܣ̙M²‹—ãÉ™‰Ð”ç<‚B’˜°:¦O ‹prB@î¼´ûÌ4~ VvVÅÌX%³ŒÑHC’rØ~,qdÍÈ#Ã"‰èð9,¤UlX$edPàtÒŒHó»ó²Î-33²‰äœQàKu]7[ˆê‡¦¯½÷rÎfÍ& ›³©prf"fÄü̶‚H8™˜˜Ó|¥X"“™ºH¦)S[t5'äÒw€A{›sö¥]¯f^>ÈLÖ“à iD¤Tñã™,Òh¨H”÷TdRÓÑœLÁŹS #\“…pÉŸÐåt*.›»dr91êMó4Ö:x IÄžž]”šdÒ˜o›6fÎ9™ {2ß;ĻػJDG)9m䳈8¼ºÕ¥/sNbºëË[ÛÈ`Na+zr¸ÁK,:ç!ÝEs–㿆UÍA5NÊLNF0{2™×õ¢Œ.º®CDöJ´uwçHfh†‰Nê@RD„@lZDäÜù–¹ƒgU>ú;ÚÄM¥sŒ.JDcÛ(³k#P‹6÷åtÓSHNYúŒÃh€ÝwãZMÔ´Œ ý!²õLqkÒ»Ž1PŠ3߇bzÒ@ZzÂô~ln m§ˆ À™uzäp ‚@ºÍBvò'9'¤‡ÐZÊ)Fë°ÅZIÉ tV›1lÒ©U`'˜3,"3ünêZÝHïËv@h+Dd”%ÀÁ”¥Ôå`FÔ÷ÁÓ^s˜ ¾øLÒ†gk½î~ù£dy¾¿wÒÊg IDATz 剅T”0b$$y ´åÌDÄ+ß‘dxåL‰pÍç9Ñ["§¤Dmq† ‘ (upújS’qì®:‹.§†Ì4øF¤çƶ®9}÷ÝAïºz°Ù$¶}Šç{üŠÍi4‰‰Xß^‹v½›+YlDC”Ì3“s1e;u¸ À"«Oq4ÕÎ|µAM¡ÂxsybGï½ëbæ!¼F@Û™ƹ0ïÄç2fŽH#—Þ‡;º”ƒ‹Úz"Q-átxN§%ˆÜˆ Œ¦Êžì™– 9õsXµq$çS›Fáà –Á.«vhCrD›”…˜ƒ¶œOÂÎë|ËKk ±^^ô—ßøñoæõ ûüò‡¯>øè㾜oÍÉ>.Ì£AKà óÿ VÒnKw$(IøÕë—hXÇ5+ )Bàœ†jÓH¨ò+:ñë{ç×?¸Šô„GÌ—/ßÓ¾|éËßøîw¾Ã§ösþŸÿÍïüÆŸøú7?úøkÿÍ_ýùׯßÿÓ?ù?ÿWþ‡mòùüÁrwzy÷Û¿û 6¿µ\®oÆþ}ßòúíëß9Ÿ¾zúú·ÿîø­oo~øÂ×í;íÁç®ßKû??üða‘Ó¿þoþQ²€9‰˜EĺÇ.Y†?×§•’’'°ªPº1"ÈRXEDçðÛMªã$"n¨îÞ…T]|ø1בS®eÕLÔMUUβü© “ ·Ž¼t†õ\úAÉfb0)Ñ4çq"˜²$”î ÂL,êÂGB›MwO$%˜9Kp‹]•ýXºíªfVÐï *ØûÚˆ<2]ùPy%3HE3³z½‡S#.‹£r,É.}l."ÒZm|@2‹&ÄInîîeÑQyñëºÖ¥cæ"“ãhõn¨L]+;Áå‹á®8@ˆ?ãˆâ#bñͨä¹ÌªêFÈJÝ·âƒÊ0ãݱ—Ø‘yÆG@h`Ôß©i×MÅúlÞ±{B׸»|!ßAl3¸*§"Âו’D”ÅéÉ@ÞÔ¡Û6ËtKEphYI¥Ö 3/ËR«×GÎÌw="îîî"ì†á€dö±ºî@Úao/éµöæ§¾g€]ç~øxÝâá ǪVlB©Ì1˜5"H9îá¢BÏLÍñŽfÁÌ,úŒÁã^á®óÙ8ò†»(¨Œ¼ÐÃ#¸A2¡ 7ß}9€ÈAŒJšLOJvÎt_”B#‡-ÞÞ)(š–Ö”3™)‰˜8¦+¸-§áS˜#C‰™¤|«&vì“yŸÿ®ëÚ´:H(°jWÊX% ˜‰´8æ•7Å@aW"Ò[߯0óÖÚ¸¥6ûÒ"={ã /x®P±k»–Dô—ˆbãö$J±HEv#@T*Þ¶Lóöy_L:&†(ë•äZ$º?Ô‘ƒ8J«J o;ã§+?0ÔÃU ªï¤¢µjEíuÈæ^%ßžPbN œð =-±]¯Kï­wN¤9Ø(SD9Ýò°#z‡?ݶ*ßáôré=3[oåîã"R²{ý¡J?ΤŒê% ûɃŸ·…/ªì‘ÉÈ™AÛ6n+SUS*2Є…wí~Sûr×—Ëçߟ÷òOþ™Ÿz¸;#²Wüã~ýhõÇt¯§n«vG8#ÞŽÈÍ#Œ{cBIÕxÈ=È””¤ÎJˆ]ƒbKÉû;ꌫkàòøÙGßx…W|iãý÷?ü_ûµ‡…¾úñË÷?xÁ<ö§?úÝßøúW¿úÍŸþÙ?ûýçÿé>|íë_þÖ/ÿêðïýÛ¿ü7þ—¿ñ7¿õÙYþåîÏý3?ó§þúÿþ+|øÑºáÛßý½_ø…ÿzYÞëËò‘¾8?zûÙÛ/½ºÿô7c,¿ûÝïÿÉêK¨RÔ§GµÊרÙG±ížžžôþÞ,Ì…cºL4åtPÀ±D&aÛÖÆï2[kE“sŠˆ°ìuúaQ€ês4» /Ì”ðëzIg÷lº°fë €FîX¾»÷ÖŒ(#šªÑÎÇÄM±™Gmà(8žOÇù ”\¯×IܲZ€}ÖQeSýQþf™!J·‡öîüâÆPÙwÕÒ½¬¤,²^Ƙ,­4̇°%¬HdyÌÑò0®­O{#”(ùöÜÕx=<¿Á`NO-{_ËÌxçNAP¤xÓ.®ÅY5GÐMö¹Oj(ÈoDæ¨Ç·æ‰ûu¨O~»þtøì;xPL£È.zPR¨‰ä3ZŽc»>OÑßöÓ‚[ÅádfaÚ™9}%(Ø«ßWcÐŽæ?sá\Ãj=p¢U4Èó6ãxg °O&nk;‘±G eFas´ó'ê´¸î3=ÏïÈîÅòÌ…”#³´Ð„ L°B@ vóòy÷ˆ*9ðiûi Þùq¤–dDºˆ¨îòs"‰]Q‡:tETŽy+.‹eìî¶ŽŠP{#ÝOÄȬ٠?Ë6>C 2…Ž™q{ÏÛ¢=…ïhûegæjˆÂu>Þ9óÞV #²Z£ºÑû„· wÍîÖ÷LA;ÅÝ'ññ€< ¡h?GÅ™AU‹ÜgfÆa{ºåÃKi!€‹š7ˆ‡{ìvj"L b±C³îy„H /{[K‡¿¾ˆL = €™ ÈDI>Ö’.}L ‚ÑÞ¸ £–~ :+GVÂ:É6}èÒÔsQöÊ+ضmo&;‘‚7˜ 1 8/탗¯ÿÜŸý§Ól{´åþ¤ºßý*\ðéõ£½Q§+F¬Iic¡>‡%ßÝ}~} æê4K'L02ƒ ;¯½ëûç—fc[Ž‘s¬oŸ°†è¹éé“O?=ü¥¹L Z/l¾°¶ ½¸¼MÕ>ysù'~æ›ýÞ?~ýÁ7ÞûÉßûþ¯µÇ~wú©O?ÿùsûð?üOþ݇÷ž¦½ü[Ÿ}çÇ¿ù§þôÿø×¾òbêÕ¨;ɰ­ç©_Þ·Ïpý«ÿý//÷ßëüÑuL‘å (g×|||Z–“UTœ7is›Ê¼¨"ƒˆ™’Â9Al3+.æ,wW§àDáçáó»SßW0Af®ÌDæ¶m`J¤!óùÜ67êZ‘xÌìc¶2Špš""aNæz¤ —ë”ÞDÄû"pjfJ¢‰(ªzkåaÓ–ÆDÂQ9i¶Ö#bbwO1¹¢PJ€Ä¥¬»w‡®¶ DõÀ¥Ÿ@$»» ›sn‚2_·kí ­½ÌLMwœB„š(ií>ëJ2™[Õ¾ç$ áÎØ]žT¦UD Š1ë9„JDÀü^ÚœÓ.tŸ ðΟ£ô´HK÷Ê!/¬>k#Ð9‚™“|Ì+3gÂæNÈL™ÌÉ¥±¨-U˜Ã“rÛvü»ÞU¶ÕhGJ:ë¶7ÊfCD‚1|O'¹\.U´¦iy“'ð‘ZÇæ&M ¾7e¦pm»TÈNn¢-*ö–pŠ@Xù.òA[žÓ(‰ÎI¬¢sÔ'Ù%¾@pGÄ ÁÒȆe3‡[:#s bYR@„˽«ùNÄ´85¹L[Î'DR$+11¼ˆyûåÏ,ú‹.ÁÚ§!¤Ï#]øØÐWߎD:Üq€…g†4¥ªK<Ñ@uÆUJŠHÍUð`D„3'Ÿl3f>%'8¹Œ²3«Ê`•ØyK €€Â=}Çf æUv¡Ìt0ÈSÍœ(Dœ 'Ã]ÌÝþmfì90www5Åh§¾m["EÅ37³ÆÂ´¯jŠ€‡RyŒ8 §”õpòÅ'WA&»½ò kÄ32«²'"YcW•nâ©QÑÂÈÒ“Ñvüu¯ËwÔ æmß PθL»³Û:­éÙ±w ÈYS9„— NOf† Øø™©ÉÓfDžc²d[¨HÔAÆÚ=¹Y MÓšJÙ6ª©ëv¯}f I@.Ä*ì˜gˆ¹3€¿±k“d…ˆRP ‰H‡•#jÞJ<ÕÚ¸\)&f0…_r’ž3Ff0‰ŠUR¨úœ™áAp‹t4e5‹ 3D%3'm<ƒ #Œ€Þé©ÈŒ–Nž ÖZ Ù¥ÂÆ&“ݼi¿>Y–<àm»ŠK0ÃÉ„t©ZíÅ]gI›×E>|ýµ«ci¶(×ÓH~|{Ý,pò0ýÿÂþC¼~´úcÄh Ѫ3ÒœÍbæ bé§ñ4Hëþ¹ÄuI;«ž,Ÿ¿ykf îçW_¯O‘ü¿û÷NË‹{ßú˜¯Ï/$åÄo>¿~òý·¯^~‰ÁMï^Üñæ×—7E ½\Ö¾<ÍóÃÝŒæÙ·‰Ï>¿ò9B0A3ï5òù{Oß»x¸ÿúËíÉB–p°ÉöÍf²¾x±Ô‘ŸÛ¶ÐE3ÝlZd׿‘LDÁŽ Jnǰi›JöEnnQiÜô9HpÓ8ÜÉRùn$ìîÌÒÀ6é×§§E´³.‹¤G€2C¸! йk9‰·ËDt‡ÃìÖ·ÇÓc¬UzŸN'Ÿ+óîšU?¦Ävݘy¥=Â#3ßµáyü‰»8Úß9†™õvbæHÏL$ŠŠ»Nä¶mTT‹£]^Í>­ EJN"ª–žqn­dýÆ0ZkÄØ§ ‰S͹2Ë3…úîÖì‰}Èޏ%jÑ;®0"¨*éžvÁ‡å+½“½aÎ]ÑzLÒ,T ðá›™tK¯¸ Ž À[¿á.ïòPn£–¬ Hdd¼¸¨KftH 6ËÝwÎèˆü½}TÃ>‹#8TŠ”‘érÀ(Nˆ?(~h-Q¨œ)‚ÀL” 81*ÛL¸ùð~>»oáçö½=¥<øDM•óˆ?̢€T ·]Õõìµ÷Í^Ç%W•gfÊL‰¬Gf0¤6%â]}¶hšf&y² (hîð†ý‘=1ç†j0³?Ë婟]·B#Y…*ÒsÎMDXŠ Ná]ÙY]¨äú`â<°opZfÚ1'Ú­o#pL˜ùr¹äØñ‘ú$"{”kìÈÁ¾üÊ™B@™Ïr(乬©WbŠîÊ·<ÂÛlë†ÕoìÉ”`Þ…Nä„áãv>Ý.ûs¼ÞÝ¥©™iïžãˆ94"¢½da"ÍQÀ‘Øo®ëVïÜiøâ ób!pB…6 ‚"ïÏ'3#Om­ðÑ¥‹Oã*JÌÊ»(@F³º;Uu IQáD5tƒÏÂ~@Dæ^K#ŸÖµ«ž¤Á¼†&îÙúbcF3„2A!AÊ"`[§§'A„{§”¦sN i$@ùa·£Q0qŒÈHÔN«ÄÉ™4c&ÁÌN"@X™3¡,Õ.«º‹DÀœœK›‘ä,¢Ç:¤zzï ó–~ýhõǫ׾yü,WGGÎÚ™È(-#Ì3âtºCV&"<û ÛNI©Dc%Ñs¿^Wn ÒÇõÊ+(ÀÔüíÅ&½þÚ—®ëÐ\·ÇÌ÷žÖG·Óº^" ˆÖ¢y>ŸîT`‚.ý¡uïíÅÃÇËÝ{½¿~º>6•p bîËI¨q3cùäÍåþþ€Q6‘Ë"½=^¯¼[ú(€‚ÁÏçó iá`î "*ö›…'QT3ÙØ¨‚æk‰B™s%¯©÷ÞZËÕnÙ•Q)µÈÞu¤w•‘¾œô$­±¤OP–­r8"*{v?i8³µvî 3?ÆÛ:›–#B¸{bÔqu:ïûÇžýèîž{äejYÎÑ{¯íÇ^LGgSBe½@MµîÓ„BÃ)E¥-ò9Î#bz´Ö`éî”)Då]­™ˆÈÒ¶T5ÉÇDÚ«?ú²‘eš¹T¾_õ2™5úÉÃ3{Ÿæ6'¥!î ¬íï)"%!Â62žï¹qäá1³ùºœêÚ–Ñmqløz½rrk-$™Y˜mìQs·rÍÝY‚…"J¸s÷Öö*çF(‰ÃKƒŠ»]Iêaû,ÿ` Iï=âw;žUKy¸gÞÎ*bª ƒG]H¼3Y63€³\U÷ð^é{ý ‚£’‘‚ »ÎÞ{_VÁQ»|­") ÍὉˆTùXWfÑÅÌ‚0ÇU)·Î[_‡&Es÷üåÌô8IÛèºdRÍü#‚š8’ÛMǸ‡ˆ6/HÙT‰9üŒró¥Õƒæ¹ÌåõNï¼´Ë@ó|:ënOŸ¤²ÎáîËiQbù˜õë”âÉLž^5,ÞÅ5Ó1Ýà¾{ony qôðb¹-':ÀžZ u¯+GûV6Ý–j”“înÆ Tö¤‡g܆*‚ÈÜ5ÕzÃöêE¼›+µÓ©j@‚9ÁL¤Ïrn@½0W'Tí ‹$`sÃ]…Äz›HÎR‰\„´ñIûEŽeÙGÌtÅN“wÚѨHIpÙ¾X%ZŸ.ÌÜ[K”ªQ5i÷9n­e„xGsfΙ»6öMôÌ$73!ûýZ–e®¨´ÖjP~Ò–eÞŽ[Ÿæ‘Î"Ra¦Ù-ÃÌIˆSj§9$))º¶uDðÖu!Ž1aŽˆÉ˜îÕ5Ð4"å-sPîúm“gäØ8R˜¶°S?cx^609ÒÜÑ»š<ØÒ9Óµ½ƒHEºv3“ÍøÑ_?Zýñôé¥ë2r•¼ž{¡-Ö Áƒ`éýéq;/N¡ÚNK®ÛÛÛ_ÏéÓ/Tz;½xïÕ÷þþwA@" ‹Èê.ž ùÝüê7õãß}öøÉ«ë«·Ÿ¿ùøK¶Ž—¯Îë´y: ±=>}àr¹Ä,ªz[|þv[׈”¥Ÿ›ò„’Cײ´€§ûó‡çÓKã•xJcµØlŒ$¢¥ÎЍª×m…ˆHó‚ÊÑ·¦ÔšãaÚå®UH}8²ìŠð# ²šÔ¬L„9“ÂT‘‘HxLs#R kMš ,ÌCˆå&ÏLð…í) ¹h+ ¥ªÖ¤elƒŠR+ÂB8¾m×}ó2‹ ƒ% b†0Qj€ä ªÝ;¡§y½Õo-Úâˆßl¢Êâîa“%“º»;H@ðÈ9gü¸pWnKï·øS»–4·mOKÎg‰öµíMÞ‘IÈÖÛœ“DfduTqÄv¸{e811{šY0**ö†Üy±ïˆr¡v7³ÓétkoøGá(DÙZ²™™A¼œ÷2-fz*íFàuÇ㤊žX· ¡Hî’ùnÌ~`'éÓöfw¯] &áÛ!t_õÖîŠ|¸•×Gçćêaº÷åQ¨’j¼ÔL¹Ç5ï¤Ø]š^—ˆ˜(Â3Y˜Í‚I.O—~O¼ÓšðHó]í"Hîí”>Ìf¬º×©‰È~ZVw!•@ÂýVÔž¨ªr°MëUqæÊœ7ŠÊãÜ{6ªZ,Ýâf KKêÚ6Ÿž93èpé-žx!m{$ú³d鈀ì‡t=æDôæéQ "B*Óg ÓjÓg,Ú½–žˆ€2Æ–Bî£OˆdBæÛ‘/Z°Ó­à¸}÷Ü}+óàXÄAÁ©£ªwË©2ínoRççD0H@­5ÛFÆn¤¢%'‘eŒu+üC/y>óàž×^ÆFD&âY2n‘ØLŽ2·DÈõXoˆ™“iÎYtáN÷IäD¨çt½F•C ¸{ØPíDTíVeçzÌ×ËëȈ¤§mÕFBœ”`ìV÷ a@ДAD>­‹&…€º¶¹ÚÌ|··Ñ(fï84@NL…OF%—’õT>==Z0ݹ5ÊÈŒ2¹O3kʰwæF¹ŽÔ,™X4(Óã” ðŒ$¡»»»uÌdsj࡟Ê!ª6dì »ÉÄ‘EEr@¦IK[²5õY  5 B}é,˜>©«ˆ{cM°Ï²3pfnmÚ‹/" Ϙ3¯­þp\Ë•1Wâ]i3Ã}wÉ!|þ½Ï ì>óž|9ãLxœÍ€1I6ƒ¿zy¾C|õÕÝc_Oïwÿìdt}ø°½}û–Ϥg ™ò?þÒ_‹šÒåÕ{ßûä“¿÷ÿþí4úÏþËÿŠ€o|íc8ÙûãñûÜŒÕDÖ°ëã^ðÞ¢ËÙÏ/Ï#Îo&}EÑ–¾NÉ`¡W }8ëÃ=ãʧåå´8Z½ð'Ud“»­$åÅe5¡DŒ¯ƒÀݯ׭62‚Z Ì“H{À3†™2‡ge“bÆÎ,;ï^ù”`"aÊ,É<»;ƒÉȇ±Ó$HKÀÂÑ—eNˈ“÷N¢uŠ˜#<žEˆ¨ˆN…š̬}IbF¦ žø$¢-™µ©mÖ»\Æ–ñÿ±ö.½’lYšÐ·{›ù9'"óÞ|TUw—U-Zj¨%$&ü~& @´ÔSÄ€Ÿ€@bÀP €*«ÔUy³óÞ¼qÜÍö^ËÌÎÉ,2«Ê©¸‘înfû±ö·¾G4"2dm]‚pc9©ˆ Œ¹×¬ÑEƒûC% (Ì$B8bnÛwbÂsÛ¦sÂñÖ@…²LeÂZ+@3§Õn!MÓƒljßÓZ—ô$Œ2„lÎÎ}IðÊšÉ#ã‹xG ¯fÌu¬uÿ8kzj¹JÂ.N<¶‰£B I$9ê&×e"¡$dF fÕé§4Ÿœ ™»/MI0|iUÉ7" ŸÈtUãî1™5“‹}£4P„+³ìûÞˆDØÂ2³IOóð,Š’B’ÁåeâÓ3à„reN‚d¨êœ‡?ףƙ.Ï ‰‰4"Šb¾Îhª*RZ¢°ý —i=¸¨Lü´<EDî¶÷®@”Š'æœLkD 5žùH¾%I}»e¢µˆ0Ì&Úì³5ñpÒÜmÏbº5–ˆHsAÙ_æP(0¤E¸”oÛôA–D6næ&%"pÓ,u•°v‰*ÁºX`fú¶?õ¥N ð™Cš$a¸3gdÊ"™ùr{ñL§#Œ®g,*ÜÔÂ-‚¦ýtA»œÝžõÕ[ô3³We©Ì¹eY"ŒØï/LÅw©®e" R®f“›0³IDéé›/ËBŠÔu­R(+´²“š™(~OíÍnP(yr‚T”ÆÜ&q[–×××ê§…DrFxQvdûÂÌ*½÷5"}f:8‰Ë "îæyÊ:ˆˆD{fþß 4ƒƒ±èíuê#ø‘4¼Â£a$énªìŒ¤´´Ý¦gB€0+rI$–XbDÀU$ b›;¨—kN<œ™Ú¢A‰HÊh–æ!ª¤âáá‘ÍŠÆPÛÓS„nPC}+›A‰àLΔá›ÇÔ|Çþ%¾€Á˜¾Ê‡˜ðtb%¹k*UGÆAs8«~7¶›¤„¹ ¢ sr"†Fˆ4|>-O¶[kôô´z n€¤¹¿ü@vùd¼ V¸sN*%⯿Þÿ åïLþÀß$ÿ'É ‰–§ìp˜à¡“Øj¼ý+^•Ÿo·<+\ŸzÈ}Ogêöù»Ï$HÏñ$ÏH iÈ ù ç6Æè/‚Æf>ÒÝ_éñíw?ooë"jÜ-âv»½¾¾?43´7‚º™ÐzÏÓQŠÎ¼Óªô w}»§ç©×# ¸f¢9gׯ…Ø–Þˆ¨FÚÚƒàªî QJs¯E¡‰$€M;oàRb¾õ¬z&.±lmÍ#ˆ¸/mßFI}_ÚRÅ‹øØ…YY·°®­Î»@1ú³3(2z[Êܹi!ÉW0X5h©êeæpg¢e½ù0Ldfɱ®k+Rǯ“B̬ŽVyŠe"‚ 벺ûIìPʘ|R+®63.lùz@þ†ècžn™)—ñ  »'1©öÇ~_tÁÙ)¿¤FEƒ B2¸)j•7W0€È¸¬Û ?È3´ð–>š;\¼:Ñvp/ÞŽ°De%w""ZÎ÷dbj“šLû¾3ëÚºÙŒ½ë8½1ˆa Nxo«{ˆ,ÁMoï§ïÕ8Ás:ÕÈÊøz[·9è]L¥#%Ã\D´úï¦@}¾™9ÑćG!a>SFT¦º|ÝLªdĈ3uÙÌèÔÊÊiÂ[ÂïÌ,‚‚»˜"Çufå“WÛµ+K;Ni!™EˆÛç'éÑ‹r>¡ªÎ«—T¦ï\çueyÏû©º3NJ‡ío5sk\¹{É|J'î,[ˆDÅÍlŒÌ¢®Ê ÛǺ®Ûž‘ožo‡»`A2"ÒX|nM•…ݧÔmmÓ@Ñû0QüàÚ!Pm€¤ ä{k¤)11%KéQcÎ¥=1%—w³c8õ ¤ >©*™$ÕEJf6ˆ©”//Ïg?(2“"  ¼M„Hk-£<ܸƚ.ZÆ68Åk8EÑhòÑZ"'…´œÑo+àP/•{ ªqÑšªRNUaa6ƒ3qÒißÚXÇäËþ½ßÿ³þ“…,t¡©?~ü¯. 3“v¨Å""5Ožžžâô ¯k©úýBziS¨fBT«F¡H?ÿI‡3cŽÃôžQRbÒÖ¶ù(i^‹¡%XL5ÕO¯µ²7ŒäL$QRP+m‡ç‡ÛÓœž™4áæ‡’ »¹¨JÂ÷¡ªíÍë6g=,)fDt]èl_ÏÑÇ ð)3ÅÕ,Í„ðº®Ó­–³¹o×Aí‚©ùt’VÕY!|ÚmxJ¡÷4ä»âM„"‘A§§•q”‡•+FõM2ST«K‚<,wˆˆ>ÃÜIØ3˜¥õ>÷YáÔ*ÉÌäàSû`òˆålðŸ†Ç8¿¨í0 s –;‘»¡,Oæ,}àû›It ~G¡õyô82÷ei™~iôÎ1@iwóhÀ‹°ùNÄf`"9’Á(ìûþº¸úœZb"bY–ñ¸ß}fÑ‹3 nÒÓ£ þ %0º6ªc÷t£¥(-”‘ˆTæý]ýo\ÂÛ}< >-®*í}¤Žø#wàRü‚™EÕ=;~Bži;î“AåGBUþò™µcfkï$<æ«ù8f®µ93{X ²¼îE„ Êr©ÇãJ:mâîˆPŠd«ìîq‹¥ôe x {ˆEdlSXR–6ûÓº"rßw³µöx<’‰…ñÆs:üj/ÃŒHïÊ@…êÅØ‡H…-t:ôd:ñ±Xe½(Á Õ»Úpu[ <¿¢CQ[²$ïDÄœçÓÉZÛO3»%1³Å¬T<"ˆð´="Òf5QäH{×ëЛzD82Ñšªáåø+[Uø£è9"3 y)2êN9kšÌyt͘YˆKÌeá#¹F®åIŠÍwô¯câð1¯‹›[çÒÿ5¤=B“H¥ÅzÖÄìûÔÖæœÒÛåíD`ðÉÚF&©&;9 ˜"áAòԇߥ*.óÉd.‰T2Ü+ª*‡‹kvû`Â!Ý"–eYÜr{+$¬Ø=å`‹öŒØÇ€èØ]ÄædZÆ~o­}óçÿâÃú2¿ýÎ>ßöÿ|BÇÙÆúñcûÕ·ßýÃ?úÃïëþî—üÔréí£)<Öô–X…žbºåg[tÛ}Ìì"´¥s‰K#"òÔÎ T´·uA¤›Å6î c,KfB‡OD¤çÔÔ[§„§ƒ2ÓUÄ r(…‚òÌ1uáÖà}Û¶uJŸÆLåÅsÔ'¯¬ºÂÝSxCf£g%iåXCdE¸ÖæG&¯¼•9éd±]4…èBήՓv6ºži5\µ,€4&¢}Ž#,±´¥ä¡)‘Özçв*Ø}'% Ï$¾¼)LR¸Åžéuäªm˜™§;išçÜ$¢™™íp«²iG¤teV¶ÀkL¬jf“ÁÌܘç¨_D܃™%0Çžuªeº°LÛ˜¹ž¹ä"‚HóÉÌw$)ƒiß'3H%%<(ƒBépºÉéCD& ŽN U·¦*•ɤUoÖ”°1Z_LT3¡¡é9ÜúÒÆ"bÛ6˜™óàâ0QÚ¬?7Ç‘ýÆä8¢Ž)xÑÓ×$àF&碗œáá<2š2¡ÞHºûæÃ†8&w!dN̘ÛÜJª‹z‚IR¤OÉ0凤”AE©œ Vuy~zñ g‘†dæž–”äÕ¿ÈL%EPÖFXùG @t°¼Ë¥ó£¤>¥9cG©Ž#R56Ë&?¦ˆØÜ›$3ºÁ£78Æl43GN$úÚ«J`O >6&ÈLωƒUoEgÅA³«†˜‰¤¸ï‘ÖLLz®O©ôùßYvÄ-¬3}êtK ¤Š èIºgêã,˜XÉ &U sÞgfúÒ©i­L´ï{S™˜DîíxÊaà¶.¾U[‚¤÷ÝM”;‘m;CTÚ4´ˆHʰˆÀÚV÷][¦= ^Ø•–‡`¥ÞŒ}'&U¶}ª0a²—Þt:Ž.s"_–çØ¶ÆyUÕÃÃ¥Q¨øîÊ*”ÇBž[,¤Bœsÿøôâó1mß{'VdöÞ¿û‹O¿°o&ñÿø~øñ „²T‰ü«-™ßñõ75af°S™q 5á¯~üÕÏÿü/ «ÿ7z|_Ÿo?I§ø|ÿnéb;’ˆŸº¹{Œ,`³ˆ™iH"Qõ Ç£„‘ÈØçŒÏ>þÓŸ|ýòáùéé¶íó­5'5R£4xIýYfhM´ö’úß9'$ݬ÷¾, ‘8ùä×éÜÝ™°ÌXúó#ƒEÚëýÓmYo·[BzïÊ%άëÍS:!vXY‘žà„2“U\î7t¸™UÓÁLp}v¬­nL/·SRáólQ±s×á‰ÎVˆü*óu¥Ó¬pß÷ò`&¢Öš1TÓE,ªœPé·Û‡LKQu÷¾,rF±û¯ e«<­aPHÉ…-ˆhDTŠÁ¥'pµëŠ6Hä-P N»ŽŒèåWÁs%RÑi~E³æy7žŸŸçiþsc®Ûx$7ÔyÑòÈ`{~Äiôþ¢Þ#oNVvêã½L µº–rƒþ4b€¨µ–' “üà–hŸ²Œ^˜Ut!N´‰Y÷]µWñº´^ü9#d+2ð¢×\?™+á/Ã<ø2~"W‘LoB”îsΈ" TUZQ&"R™AJJ¿ è /ÌÌb^‹0|æÕ±™%‰¤á- ÷Ún[„GžÀ‘ßqØÁQ­vD3¼‹ro×¶ÞP—sxW\ÔÉ¡¡wzÚz§Ã¯ßÜ:’~¯÷×ý¬6_žý¬ã\q íYR¦zs9"Gætë½7•0¿£—¦ˆˆ"†’F™ g"ù ]ßüÚ¸zZ[êmf–gFH‰hŒ"I¸”EÄu‹ê—Ð;ß¶ë»®7Ô.!Œœ²ªšîÊŒ¹‡›µ¦I: ` Ž aœs¤&{ïFº¦X}{k­´DG€±›_F‚×n,,ÉÂ$G—ùŠ€¸(ê@É-,#ÂH´zAéqßïIz ¡Bs LIy¿ß…øyYTu?™ï¶íª ó1méZ9ÌÓ]º9r§,¼š2 IaŒ±…ÍÖÖpÏrEªð,Iv,18xºS„(S`î[ï«Ï‘€ªöòPvkMqb±f63¨-Û~WU·ÌS¤iµìôÞõ«_]7猑&wk­pm‘Ô3ó»ï¾ÿÑWz_??î;öÞÚc•FD”ø_þ÷?ùã?þã}õÕM™Á•ùú›*dþúøÇµ=ó‹ôÈØÃ…b‚‘cŒp¿kÊ ³i÷/ô=µî>üõÓ€D¹¼,û¼G:$Á`¥ÓÆ‘”`Ÿ pÐBìFáæI‰É™+¿ìû+È;%óéãÂ-›1£İ\mçÕ)Œ–c»M”Y3å»õ´ü¶Ã‹„{´õ9|]ŸÂí~¿/ÉÛ¶Ýç.·¥Ð‹kn``&'N_èó­’íÒcÎYì“£;+TT‰|}~AWýô™-ë4 ÔŽ‚æ*>p®¡t’BèTd”H²nHk­÷>OÍÅ·¡/£:ñ<Æ‘‡ˆ¦’x£<Ìò×çð–·ž¿Îð¿‡q€[;$þ*ZÖæyRˆÈá|_ 2 Ñ’¾à¤j^”m3+óé÷ÞÄ2%IHÂBî®ë¡LÆ»¹#làüåõ—"ráÕÚÀ;çDœ[Ýõä Ò;äZäõ< ×=¢ØÁU^ßeýU,…cÒU¦.]Åå,Ÿ­:š€³,lß"ÊêŸG„,-Jƒ%‰G,U÷2™™°@¢ùŽˆ'ôƒÅ–¨G—âæ|qÓp¯¤bNÀƒ<”Òæ>3–e qfä"Ý̽/á™9ÓYûû¡[·7mÒ¹+soÓ,2ÚÉçÒ\ÖSkíñxÜn·úsNÞºcW{…”Öu­:83—å` ]¢«$µ·P⃽®k¹Œœ¬”£YJæ–AŸôP¤1­L*™™(E“(ùð¹Õ²n’SopÝÌk½½tš…¸»Ù¥*>@€q%xÕÆTÅ( Û¥ýfcމßj»ó/¯7\‡ËìŽÞõqÒ\EÊ•niZúyjJ‘ÓʼnKÁÏ×NQ÷9ß}S­îî^¶Í™‘5ø+6Yä=-Ïå²g¬µ}ßëÄòžºwb‚ð>7í îúƒ2szF˜9T,ýv»¥G-Œóä%´öED<摨w˜Ä&%Ž™Ñˆ#œÇp¡Ö™¹Û¶‘£-·¤sgD¹QeArfUšÑƒ™{k*ÄTó8¤0eJÏäs{""yÄóó3¯¯¯Ë²œuj¨*XD¤†7µÖ¾Ì]U™xÛ&3œ<™"ìùvÛ¶ûÒ[}Ü'±pï=Ü—eÙ›ª"²¿<ýù7yßî?ýúÇ_?ß2‚ cøãoÀÿ¨Q4ç”×ÎI’ÔVò´/_¾€Qícp†Y­ IxŒW@í‹# Jz3Šô‡† …0‘¬ë=÷ý°}çÁ+îÛëÜÉ7‹Ê¹3Ë|<À=wÞî«ü§ÿô¿þ»/mYÈûªsŒçö¡éÒžúÄÃŒ~ë KL ½?·)M_Ð8TeÍaäþ,YrÔ%¼’êÃh_žžáÌ ·1ìËÓ²Rät_z·Œdâ¾X†&š,î^ª}w§”g¦3е¹;Û@Ø>§ª2“Kªd¥â KNò$K(Fº ·Öš™#%ƒ…#3×¥1*@NDÜç¶=2sít //+ôv¸ $a 'rxÊ‘H%nÊÇÞÊú†e¹-÷ûÝ™ÔiÍ(­Ý­,7zo#·pU¦¼´…ûov~3#Ýo·§9Ý-š.iÂ@:…1E˜*?h -³š§’I*í¾Mm¢}¡ eUñ>÷ÍIˆ{ïaN™á í ‰YŠY‹ÎÚXö1ŠËÒ–>Fúx\UÅœE5å÷– ЍnÛÙZâ uˆH—"-Š´>ÆPf&föˆ`[ëc Àóà: c ]5Ó˜rwd ór[«¾¹ JQuÀÀð8Ë,ö0(qcB# RÅcå^û§çAbH‚{é-Tqe ‡šŒt ëëjeÇŽ¤$N¦ˆ mÅùÌ9ˆ(“ €J‚‡Y_9Ç„ÅÚ Ï :C‚äæûµA‘¼V¹oC÷ûÚZvÙ|•/½lQúB€Sµ:'¼a”B¤L‘œ™M›ãè$ι·&¶,%ô³ ]«jŸ¶6ˆ¦IÄÜìnD´6ÛÔ&4e”>ya‰¤Ý#{wä«Ù™Ïú”È$ÆÄqpõ"Ý%A>(Q¾¹rçBfsÁyZåЬŠhT…iP:…B|•ÔîZ†"eÏ꙽Ý<òvwék×úȲx&"/N}€.jáÃŒˆnëâÓÊlæ"í¥”!fP“Ùƒ ÚŸ3?ö-ÀZƒÈ˜Dhwb8Ro‹™ 1³ØæÄ¤$k67CJ‘BÀÖ"=,]"ÇØ…8"x…[Äpí{_–N_‚‚òÀŸIŸ4Ÿ¼m‡U9Ô,„Aîþ`Plþòô ¸¶²<=wU†ÇC„(²ñ¤•Sî#Cö}[D,‘„TáVA¨ð_å–‘<¸æŽa Ä)X7¾Ï©))ÞqvQ}ܧRÞ>Îdgƒ›Z°!á½qőޞ:î@km›¥­QÔµ¤1)É›oëW/ÛØ·AäÔžÚvZùnãFÁìéÞ©}þüŸf˜w@æ/õ‹_|þæiyú{¿÷w¿zù¸ÔYò!ãbÿö¯¿#÷ˆÈFn#n{JÀ wD¾9l&:Ôfú>Á% Œ€GÛ¶Ig¸ƒ™˜ïd1,÷)Ô{ öÇc¾8±­ëª}#làÿôÿüSùúüÝݵïùhÚNœû¾µ颿¹mwæ 4$bÚÊeiurѦá¡"dN”É,y*ßEÚ˜ëº.½—íN0%S¼<.Eͬ¦4€jœ×SqÏÞ—}­5”DC\’eY®sULÛ=(YXÌ,(P¹çàð2Ì8ú5r2Ö¢ŽqDYÜÛ#[«NÀ¾ïu†ˆ3)ê¤}e?©(=U&˜¾Ü_Ed+¡¿–DxÏTõ)""ôx¼VcŒÊRß 5=õwGºú„¶mD“0#P|sP¦{€rß“ù€¢›F¥9=“œ É8\:¸Ðl.Ö0"§IáEÌaîy¤-\”þïm( WncR¦ðáß•§Q˜Ÿ±,…&_’„8_uï᥺ÏÝ”$y¾ùÀöåí;•/Î.UfÎ9arÙ™à%"Ç?¯êLyÖ™3á@úYð]Ip¹3ƒå$bGÎâê—Ïc™{mgòâ»1Àœ*™Í¢(8­5÷y»#ˆivµµËmY.غ„Šk­!ÌKæ aºÉilP—<ÆàÓvÅÝjÜf¸AÂ#è­MV¸ ··XÄ«A晨f%q©¥Ç{~£4¯h OðAJJ„#"")`€Y"~­Q{ŽœŸ85y’ž®G\#Ále"ôX"ˆâ$\â{ •˜â=ƒ„ Bᓈ2²o:?¨ ±ºÍeð3}2²p5NB,\U+xODª²gæ9”¨³ãƒªEpzNÖ‚ã ð€G? È åIIXDd­X¢âÁ¾ùoìû^kÑÚÕÜ•ÉÌð¦TCìA^A‰qò {ïTdõak×ùzo,, )ǃ8×Öº.¶Éé Þ[”ˆ óÈ̦"ªhôéÓ§?1üøã¯#(¡$Àœö[¾þêÚ¡ºº$Ï2]?;š€½Z&I°@$1êD7§“F!‘ ;6ÂÎó˃tùéÓË–Ø×>læ>+ I4)ܾýæá›R¡+•ìw‡øÓÓú¡¼žIhÏÌt–XÖFÄ,ª‘¦$ȤS.EDsLa¨È ˆ§e}Zoî>ç\´½Ž™)ßt¼9ÌÃ/¨6Ò™(2D)Ì én8è傪<2sÛ6Y–Å ”ÆÒr”¤,n[ ~‰púGL—røÜÃ’„O»tkAT„B•3³± g5Í«j®s•92“Ü#³·æïÌžËÁ¬î 3æ^'pÉPš°'0Ì™DµˆÐaRþæÅ©",R¿ÙÌ@eƒxÐùpV=$06Q2Ói âÕŒ8•n¨«p‚ôZ€<¸È‹]j¾×¦£$y¶ŠÃ%!}KÄ=e¦„ÎÚ3‘v4h–õèˆG„ ô¾Vurõ;®6@ïjˆcY¿–|Jl2s]×mÛÌlY˼¬è¯R¦¾Z@—ÿ3O·3Œ—¨öJwvnùÇD¬lÊÔzj‘éUi*‚cÚÈ”~´TDŽæWy¥DÎpŠ@kœ ³¡]Êy1"øŒd«u³·>÷™ªz¿ß[©"ÏËq÷¶4"rT˜)̉8ãR,£ðmfö ‹2'Mª|æ·–Ä5éò×J‚£bcfðqÿ‹SìS\ûkù qµ"B˜--#ÂqpM™)Î-ùâÞ23ŸVr( ?ï*PΗ‹r™Þ2Сz{++Ïσ$Á~êR |«Nò]Sæú¢+U;s‚RˆÜK7E’ "‹ø,gda…àîûé÷þÇ_¿íb¯g¦’Ѫ-G—šH Sqû²ú> e¡’¹î“ˆôè³/ãȾy_AÒIH"">¨Åo#" T®J9€%H™9}ÁÌb Zkéѵmc>L|Î3ÕáÖ{0Í+‹TD€¤ÃÝn9? ñ®§\UòÕ¶;ˆTtà 9äA‘B:piô<ꮪ™o¢ýë¶×ܯ£‘ª6awÏwíæ®í «-X‡¥Ú#„)} ·±féñ¤K„Ñ@hDDWVi–Ÿ1Ü^Ö›B@c ›Ó9·ÏŸ?Ûæ¯¯_~úÓŸ~|Z‰X€JPÿ^ õW™¹\¶ôv[‘àdYÒc^Ž– ]o­Éýñ¥ÖˆÞÖÖZŽÏnXº°HBcà‹€ä«IÍ×ÈíN]o«Ü(×¹ ÀàìcæÝCVõýWöÕÚ;}üþÓ/?}þîë¯Wö®J”3SU´ ¯·Þ»Ì5°lÑåMEÙ{Ï0³ ¦>Ä´ªš[kn®ë""Ç#f4Q d¢­çœ\×Vg…±å²Ü¾ÿÕç>Èa̬ Ï9.›çÚã»R[ðÒ”4•1ö bVàåEĺ®cŒ‹)R£“ˆrZ=§Ëâ‡m‘:bÛcÉòéJb!Qa¢Gr{~Þ¶íö| ó¹1Æe…É'ÃX9f–ÍÔ¾½öÔnkßçàºîÊ`ðòòRwOI}ÖEmî“%E™ˆÂ£wØ póÌl­gÉ×Äi6!·c†« Ã+O'Iéáóp@æ¹í"Â๋›¶S$“2æ-­û><"™T•ß1ÝŠ£SUBݽ9ÍÝE¸–€Zʪä¯õ Uç=[%:¬ë+Ÿ•µ}}®cë—/_zï;<ÃäL¥Óü>3Ëø9KãG$B˲D¤[:8Gïa‡pÐŽ;¬mŒÍÌ$Ä,æ¨ôA!.ò©Ç6V„G®='M¸1óH3?ôÕu¯® @™ö8xEI‰Ö»»×õÖ¡üý2=Â'"Ž\[q-úˆPiA * pó‚“R.SŠÿÈ3JúýƬ‚rñ‰à™›g¡'YÀA£GÀ6-¤:¬² ˆ"mš¬ra`õ9•*åôÅL{Ã\ Í{R*Ü5¤™€Ÿ^[ ¢ _½XDQ^ËïΖYC±êû‹ºTÃ8‹ë&3)Žât—Læ R–²Ùm"ó±õ<ýæ3X•™}Ne‘3ÊàÀZ"UUÎh¡£¾ŸVÅe"AœDxçpß{߯æîÕ÷ADÕ1©Zõ„"¥i9‹@¸VŒóR‡âàèñâ{Ø"§Ù¨îQ—–KnÃk¿E³>–Ö÷`Ñ6 ‡|Z*S´÷ÞºlÛ¶ï»»•™êi®ëJ5…O€ª¯Ëßæ¬Sªk`ÈÇ÷Cò:lj[qc" £4Ê$ö°ˆÐvK˜ú¡ÁÎÀ¨XÇUJFÚ`Õk˯ÑâّܻD8Æx~~¾ßïËºŠ®¯ûëòÕjž÷ÝH´ìÜnÏtºõ$ì6`D]—Û:Ü3£»q8»gPЪ‹ˆüË/ßó«oðüôõÇ¿ÿãµ_Oíþm^¿sýQ7:Þ±£\#Ì·&Ýý±þ°Ñs²©}2 Ap…—Ðc<¾¸ÜÈ(Ðë|AýCÏØŸ>¬Ãcîâ[?åí®/M‰|â“à¶Ü–öùËçï¿Øc‰‡j©G¶Ç.Ë—Ç—ÿîú_ÿ£ÿø?&ÿÆ?þû¾²åeûêã×Û†a9iWUâ9md.ß7Ìlß>-·7geòÁäÒøáðÂ…³qCp¢·ÆcÛ™™… y&!34ºè#æÉ,aÙ´‘QC¡30í¥µJ÷" Üs«Äû°`|ß~ôïþò/¿ùá~˜±¯ Œ9ÁÒX˜ºtY´ù>lîáBULÔÊ^Oä©/µ(ÌÄ0ƒCU‡[™k陪mILâÔF1=œTZŽ]êHýùÞ˜yø¼?VmÙu§CgÛóœ~€8ÜE—çVˆ9 ‰LÎ'1$†+ QÙ 3H›e21JÒI#Ò)Œ¦d-¸ƒ"‚2G—e(%$á ä&¢ ¤4 …”áTµCí¶ØÙR‘Lx0¤ –“WÑên؈"J×&Ñ–á6‡ŽYeÑ s… ÑtmUç Ϲ«H„5¹}%¹M˜3wÚÂÛá‘!‰ÆÊÌ£÷$à¦Of6Ò=rÍ5gUf?mä„›½N$˜„¥»;AÇnDq0y‘œ™Æ‘Äh⌠Êñ1•¥Ò.ÏÄŽAú±G‚Ék%)nDD"¡Òç´ˆª!ÊOÌ8”DJNcáé©Ì•QXÄã”ÏxPD:( á$H„µÖæɬ@ÎËïõTý„¤Q©fÀ91™Y˜¼¬ˆˆ3˜y‘6ç¬m¼jåÞ;‹F‰J2E¦#À«Šb¢0Êœs ÷V€y€…¬Úˆ¢Ì©"½\ ¨˜À¾[9F„ ’ò* –~¡ È`Ì9ºhšÌ nå%x+á³ðcbÒðL°¨W „Q½zyH IDATfÉÖÂc2GoŒ}Ø‘úÀÜ—B$( 7¢Šž}èQÙ""d||~©ùvþÈ`]D$‘ˆ$,½yDâÀKbzkÂÁœÃ ¸éIIÀâ 3 eÀ—l@z7îªIì…ãGD¤zFL>Z¥Z‹Ì| "BzŸá=x~Ù›jdÊ –!Ò°ô„knû½÷ï?í¿üöõ§¿÷†¶ß©œøÝê>iáïq!œ N°³¤D´¸IX+34 éŽdi'?|õ2cÆc Óî»öáNì<°võ8Ò¥3&?î9^÷§çE¹0yzÚ Ö§Ïãóãuû/ÿ«ÿæŸý³ÿöWŸ_—¯ÿÕ·þoý›ÿè?ü'ÿÞ?þ×ÿ~Ó³z¾ˆˆa»¶Ûº®?~,’ƒOŽL¢äÌÄð! fýòxÅÉ:,Ï fF™7‹Èº;3¥©g:Å%A˜s®}G’“¨ðÑhó™¬]˜',|rb½é_üü›O÷ûò½÷Eà~(gÌ,ÍG/œô«3_së<Ónëj:œPí!#äDZ)<“‰ZR‚%‰d8¥}µ'@DuxUÕ®ª½W0úÜG"ÓÀ~mq¶ÆEÚù‡ƒÄÎÌ\ÌÞ¤Eøt ›µÖÖe™û ò=U»\2£§íñت×3,½¦z 哾w¶BP2‡ëoòTáD;ß©ør9Ï[f^Œwºÿþù_üâã×?êÌ𠇂w³:³ ˆ/þÇi÷t¯©ž™[u7™™y¸ÇáÔ~˜L;’º"3XˆÅËþÔ‘W9|q>€¬æBmPv3ŒQáÕsæú1¹2ÞQü.)¿§3Ez£úã̱m%¤šDÃ]DT89¤€7Û™™’Ý­IU+.*Ÿ~*ªºÏqý畤å—M…{]Qý¯(öýñôüÂŒ9&128ð– pŒ@=WÅ(iqf”€'ÆAKŽSµ$Qd„‡¹ŸŠBŸ³5)of2Ë5b¯­}m¥0þ[Tj)µÃrºµ~ÍÕsa„»WŸ µÖU}šÛ™Òt ÑOR|kml{}Wd¸û²ôLxÌó”tòa%¿I#¢iVª/oVíQ¶oÂ>­)µ¤2<„øm=ñÙZsòW–§§'"€Y[33‡•ðoÿúÝêå´1M{RÃêÈ/ÏýînŸ¤7ë’îì åœfËÓÿä¯ßÿ%Ä·°Eb$/Œ%Šú=åÌöö…rç ÐÛÍÖ‰±ÓMŸ~p뜯{z*“|Ÿ¾{kŽ_>¾Ák¾ÿ>=±h¦‹t!¥È ˜1cé‹f&‘36íååeŒƒ±,Ï5àÌlš©’dª IH›­8ÒLÛh­ÅnMµ±$2twîl‘Bjö ؈×Ä\„9á37f¨öeicAlâãË÷9çœ6„="„áÔ†yD°°ˆ0Â)Q Nþ©ˆêDP5ÊSØ…ŽƒNº×¸==Õù#Ó˜ËÉ*ÖuùöûŸýÓÿâøÓŸ/ßßÿÁþ£çßý;ÿþ?ùW™Æ*Z™O’ȤÌ9Këð™™8}SX0爰e¹]mO³) £÷u‡kËUZ!¢#M ”¤ldF%É< ¦wZ‰8޵(ÞîØ7á— Í…‰Ý³2wŽ ]Ù÷ý´/Ë=vFÖjìäŽT%D°¹ ¡#ܘ)YÊáoº‘ÈÒ—VA!:îÙûÍl´Öö}#Nf 3*"qŸq:ÑÕ¨ßÑ{;èºÃzk(wœµn6Ÿp̸­‡×xÅ!!’™až™Ê­ö}„Â% ¹öÃÉÍ(Y°ë®ºm[z4Ž*%8¹­ÇA%#ǘ""`eòŒ® æˆÿ—¶7‹µ­Ë΃¾1Æœs­½÷9÷œÛü}Õï¿—˱]¶bW² $BÈ–vPV¬‘ <ðñï(¡‰d!b!!‘Px ‘Ä&NÊN5¶ËõWÿ··;g7kÍ9æZûž¿¢Ä.‰¬§««sÎÞ{í¹æã_ãÍužç,én¥Þ™¹ŠHiXÎZ޼dÉ}ØŸ˜¼ÕÎ %2XʬaBNA¬7î>Ž¥ËRÆR¨g ¨uÁIJ«.‹hG›êÖÌ9gõÖ#~Ì´×èî.ËÉj®JÌR/sKU$DÉADȢ$Þ´Ís˜©Œ¹˜w&{˜¹s&aw×V»Õ}bÅÌstg‹3‡,c"XXU‰’LóÍvwUOmëé”·4¦ÈA)'w ÄEªÕynL©ä`tKR‹¹pËl\JšçyRnÂIBÈ ÏìXb“ˆ.ò µ5—@ww¸±‘ÐT§œ31Íá'ÆPqbv?ÞÛ /V»Ps©”–œ:SUYŽ®”£Û?¤°‘¥Í3S""u ÆÔNyÌÈ€E'êZ?8)ì ‚PJÎaî–œ9íJ&ö¹îsàbŽ˜ÑŒhØä6Ï1n/Nsí8·7íç< ©W&X=•TÌ,•’Ç|»¿ÝH¤­£ó¨¿¿ñË÷›Û·Š;Fýt—uÇ1ÐnOI¹$dŽ3FÂÑìpœ‡ÝeÃMÝ÷ {éu´ºFå`6µpã±ñÅnrÞí6'=LZ `JB ‡ØXv”æWA!“Î,>¿þʯ¸I–¡`kš%'‡t¡ZERwý €=ªêÌÆ"]§^ÚwÊE¿:"ÒÛ륥Yø øºË_»B¡S¬î"D„„à&¥tl©ŸåX"?JµÅHƒïøŸ@8Q¬FVË7ÓýÊÝÍW] qNgÈ´ÏGrß c™úQ7¼rR…».6‹kÛÚ?×y°B+»~-ÿ—€·óAÒë³3vêÎ éÊ=e,{)e·ÛÕZûËÙ©!ÂÝŠ”…|@dqÞ!׎ „»kD–ÂÂÚt3nAᶘb;õ¡3—<ý^…»gI”VÝl‡Øïˆ&ÎÈ?€À€U6ÙÛú3ì|¦¦v®ÙùMöõ“ÆÝ“wŽï={VcÇãøÝŸÛËæ ´dõ ‡ux˜ÚÂÕÊ8VïrÐB}1!°ÙlæyÞn·ó<§Üß’IZ´H"dëcÚï­$!aø •Ä‹§–#´w‰S*2HNÖ=åú.Ù“bˆ:H} ˆHZb{YÃ)ÞŠeÀ»‡ˆ¸wý Ç)X¬# [×ðÝw‹spd4ÐóU5•Lë߇YË"V͉$§ÍXÔ¬çu§cÆ¢¡èïÖÚ;/_&õÉc]?Y´šý©/¥$«­+ätVk÷µ—Rò.Â%QmKHr¡e=ßiÐݽêRDfY`ös¸ñ¹¸ïýôy=œÛâó´‘HÎ÷ìp8l†q¹Ÿ¥g\_ú¼¥¨ª…<$ýÙñ˜ËâpÓ· ŽÖZÀ†!÷rÐÍx¹ïžRjUÝ©T¹DZzà’Z‡™˜¹sHÏ)˜´:wºeŸÝ÷¼6Ð}X¶ÛmÙ¨µjS÷ w¹©:ID0õ† DÔ÷R¦ÕKM˜ ”I<è*BÇQÛÄ磭ãá©Kq9Ä!"{wy gf  вèx80”r×´K·óbºÔ¿\õ@8È)@I"Üý©‰õé]¾‹X”‰Ý‚¨ûö/‹˜S"`Vw‚8·Ö†²ˆJ⓹•1³ÅižDòE{ðªÇjÓ°B’F‘sÎ%eG0ÀìüA®ïsþB]ì{çeˆ>"A^÷4‡;éibw?N§åzÕÆÛËÈÏp:¡9ÔBI©{s³ 6Ex=0±±¨<}ZKÙ•Ý™€æd ‘D<¡?ê ϵÅEyšësâ)•ñT»]xtŸ ‰\¨ YgŠ™2¢8:UÎ[K"ýŸÔ‚h†NÑêk·¬Pózˆy®B,=Ã…Ùs«Z[kmÈY[ó;´yf!¡¹ÎÄ‹ï^6©g?¹K^(´ªûs˜R"bw"F˜Kê5SM‰Uïþ}žÔÎèeßΘYbi–}ŸÇù¦ƒ"kg&!îžrwÜY¾õ³£ƒ¯Žãçæ›ˆzÕ7¸urƒ›EÎy,©Í«yIÿt)¥jSb麞5¾“RIçÛÛ_[ÒºE¨j¢äª9•pt}JXŒ¬SOàa‹©¡µ9¥eB/"ˆÈ"皣ßþ‰¢›"Ð ÿ;ãܾ`}Þά_m'ˆÈ ‡ºßOûÛ“I¤Ÿ~[ÆuWƒHR 'ëå:¯Sí’2ƒšÖTº ¬7Eˆ™[Sá%“sš¦nô™sîé˜Ák¸„Í€CÊaÍžˆ2Ñ`f=¬pÀsÎX÷Ôaj­]}­¶ˆxÍM’0mFÜ'V™™€DŒ ¹[õØ › †O§#²€ˆ5šädÕ‹13yϱ£åØëžWýûíe­•rrïž¹IÏ#ÙÕR¢Õ¼øb°¤Â UÎf¸»`ÎMUJIÕsNëÁ ÷XZ»õêþQéNÞo¯ÈUµjãî+L xŒœ,‚K6³ÉštðoßöeÜ-ÿ‰Í™}ˆ"ÌÞ–œ±\\\Ìó\J¡Þ‹{l‡±—òaŽpUMIˆza!9çÄLS‡ap÷¦g]«œm¾ˆ¢Ù²›’»ŒKD8/áÏ]NÉÌ=¿¾ÿVmµH0¤…™­ê´fÁÜNûÍ0Q›çÅe¥÷šÙf³é=D uë_†€ÎbæišÎ¼lf‡™…Ù0d™çÙƒ…ƒ<ˆ(—¬îäæ ã$$ÒàjM§Úôx:¤È‘i:m·w×ZGéÕ|¤T–N¯”XÙèÌbß-e†P½iЦȧYgs+Lœ¹ðpÁ¬™'R ³‡¤ÔmÜÌ‚Ë06…rÎó<ï.vó©2Àæ~»|jcɧބe.9H£Mk?£ý®–”8 ÂÓ|$Š”8àf–Ò¶ƒ¼reÌ,/øåÒ†Qx4·Å‡–:Ø#¸cÂAP³œsÕÚÁøs•ÆÌª¶8 ÔæšXryx<ŸßÓ@DÌAì¡­™µRR­sÎy»‘Ç7‡aw!eHă 8ž]]~üáý¯µýsjÙÆ'§ùùnwÅæn6”¬VŸ?~ò+¿ò×žÜØþ˜s¾|ôèâßú7þ䛯ìž?½qS8Ó4s’¨ìxóøi)÷m«M²1·A@Z[b†!KÙŸyIªKv‹™j¢Ì"}1„ÁàÌ—è9ï40I¸—’Ô=ÌØCœ¤])dpw„‹Ø6%! w7]$Äœ:¯ RkuC* lfÖæXÍ|z€/Þý¥DÞ›HXs‰¾„8…»óY²t§ %"0ÀD÷6»ŽŽ¨j`2¦”¡jYˆ\È#‰Ü¥DTJéb„Ž+¸“‡ÈáDÆÌ"Y(€fÞ,¨æÝ¸‚PçùüQ"^”¡½DSÓî1–Q(Â3œ˜Œº÷¬÷m!àáÈÞ€©u ˆDXŸÒ Cß±]Éz-!¼d ¥”Õу‘;Þî6Œ‰Ã >$S ÷®AP}2(3 d,DWPÙ‰J8´“ÁÌŒÌÉ}õó]° àáÒj!òDà€A!ÔçIÞ–‡º¤¤Ú@û.‹¸E„p2ëÙÛB®‚o B –§™(¶žŽ“>‹IТé’iŠÝERãð9‹kZ2He°Ö˜9+‚0/I)1¦‚¦Á6ë©oƒ±)Bæ`r&ˆ¤¡c„Ùkv–`&©õtb¡ šÍ‚$•Ršy‘<ÏóÅ•%’'ñˆð”¬K:# ¤Ä°’ k³»*JÄ"a aH'?1ËÀâî™ØZ-ì&€ƒaNÌbÞšY çüþÓ/Ó3šõçöŸ­ó{××üÅð¥GëT<¨°¤Rª7ÏÍýôüÉw Ò(ì^ýtõèjw9¶§6Wu1„ÒõtP¶[¼òÚKWîÝ¿Ÿpð<½¦üÿ_£'f³ D—G2ˆÎ3šw~u²6¬±–D×ì&LC’mÉ9µ¼¹ZÙn©’ys7âvª‘ÄYU‘2DT|ÞúøÞՃéi=Ñ ”„Aî”s7 Bݶ¹yŽÍöêcßùö-$Ìoâƒë$±ó£Í×ü§/¿7mÊ.øé©*åä€[EkYDÆ1󦄷5g7Ïe™Åøå½ycæ-Æ:·ûç›Í&åÕ¡O@AŽÈâfM@Ôõ ,˪ê|"ïæmCÉbe—ÅÝÇ£ª²¸™…)ÐlÍ‹Âqí®;ëøãœEb/¨Ñ%$9ç¹­ùp«×53Ÿû| žð ˜{OuÏ"\RD$w7“>ÏnêBѽÀÍlžç”s¯èïšµwG¦3€ŒØ€»Äë* "IçaVœ£hW˜ñŒ·3KOB5Ú7"Tk·¤ÕxªSû‡Ê¹s-afÂðyšÓ/·eÞ¤áI$s£ˆŽ²¸{$¡U"$I†!OÓ±?ǦçoÿÚÍM'kÇêÖZk—¯Ä£áúºùn3³ÝûÔkœ?˜ÍÍLãá£ûe;¢íÛsg}ðh¸¾ð­ðè·wœçù‰ÕSJ""Úö—Ûa:þ{î?œŸýÿ“_zë­ë3o3Ü……@4déúUwשŽ9wî-ÀÁ‰ácÁQ¥o€ÕCCEdžOMgéX {°õ$&ˆÎîÚÛJ ª¦ë·Ì=ÌÕ–c²2ðÂÏ{ù¶L‹ •½£Í=ä=€.V<‡ç->¼¸3‚²Èy<œÖbvkÝÞ0Eøâv*bªˆfm/˜Kɺ:ü‘4’†×¦µyS¤,9Õ¦¼êŒ()¥ dÕ7×ÈâäMÌÜF¼€‡iÝp°ZçñGÍ! IDATwNhbiæJ±*åÕ™Ø9R3 /Öò@h&&ÏÄ «ÚýW™#ÈÑ! ­#]„H ÄAÝ3P‰ I¼.0LÑ蟫ï½Í•œªiDPáÓéðív˜§g¡í§~ìS¯½±8éóg¿þw~õw¾ð÷ž~çÙãkß|zÒ40ÚOóýcä>ñ&oO./¯ÇK1zposqKAÏlþøÇ_}~¼iá̵”&É?ýÙyéòš _ûÊo¾ýä ¿ö›_ýòWÿÿìÏã|}ŸøµyÀ]EæˆØK€—5‚ ZÏ”–Mp\ÜË׸³‚ Y1&kn©“fÈRåÉÁE§‰"Èl>‚Ëó©gXá#€¯·ÎVu ‡!ÌéÐ|ïÓý«ÝK¯ÐþEÌÃÓÃæ¿üoÿûñ¯þOÆíË¿÷톋‹ÝÕÕk¯¿¾Û\dÎ×»ûFDEÊ.?¸¾7f)LŸøØk"«VæLD‡zJ)• TqìO¦Ñ@˜™‚¬e †‡¤faD  %b£*Á¥süª¥¨EõáÕÕÓæó!ÊÌœ\Üø±ïkg$ö §÷íàlv™’Ð ß…ó6çg;ç`×ýZFõ¥Q÷ƒš€ÎüYñ`_c`ͬ'Å/ßÊ“=ï³=‹î °G„†/A[ôbèÌ{?DÄ«[y¬Ó_3ÃÊÃ:?‡ÄNìïÏsg ¤ÜŽÚ·3D0Âý…ô| œ:°“‰=Âò¦Á=È”¸GѦ1»»¹öñ ¾þõ¯¿óìæãŸx‹¦VÀ‰KPÒãmFjÿ1”o©U=Žn|<Ì_û¢0WÀä³ÚiÒé½ãít8ê¯ü×éÃýiûðâââb·Û»—^}%¥4Þ#v»ßøêWŸÍÃõÅån¼Ø]ePfæ± ä­µrb;5­ênhï=yR$½t}•%uõ 9"BÁ¶¸o¨Ãrf‡·z"•m˜B›I$SÇÖµUf&±-–áBO9Et‚ˆ1RÀž2ˆ¼µ&œ™ %€LÜo{Dt×/ò˜…‚HxMؼóÕ¿ŸŸºcÁB«¯ŸÑ¬Ðô²D;5ë™Ú?ÈÝc¸‰ ˆ2wèž—ÑC$ÀÁ= "Ìm%è4^k¬³){/Yz¡¿CîîXÎïp÷î ¤áÄKYLLÈððÙç, ßöü»‘ÓGè/½ëA ÔúŠM’t$ƒë@¨*ßåðݹÎ/qÐôý¢WùX;óÏœ7D, 'xgZÌçûsŠà´–nâèäæžâM‰–ØÂ”ºy—ïÛ<äLDjNkÄ7K Zô·€0»[l!˜ª%P§ÿ«ª8‹0¹-M‘F£ Þu6H®lÆ9Ñ*ñ=oªì7"Úö#D¬)uò«U£,-BÍsÎÒÇm™`ZKJæÕBì¦'§ž„' zõrsÊ8¶æÌâî6aáÁDÂ}4K+óëü÷\ÔR§63 Ã0Ïs==#>óæ›ŸøØ+W÷.õÙã_ûÕÿë¯ü§ÿËÛ¿óî§~æó?ñƒ/½þq»¾zíøì[Çtrð\HršnßùÍ/Ü6‡{›4xÓUFªzº.÷ë!)›¦ÇÖöû›Ç/?¼÷úë}ëxåò*Ùÿ4ÿô›oý£‹êŸp}¿þ@€2À¬º^9,ºt®»ƒ/¡™1lJèɇÏ/\ß¿Ø ~JÙR#ýmv”Çá– 5²l}ò1 Aà 1÷–‚™”si›{Ûý“+c”Œš9ó¨p´€$g>Emû÷Þ|éÕˆÓx±›óÍåª´Íæ¾ìÆ[/'?`Þ|ë]\ÜÓ!=þàö«Wòðû­ïÞs=ŒI$ì)é~3”öä¸ËÕ£+¹¢«×î•Ë\î¥û[ÙlÇë«ûe;ö¼Ç4s3‘úìÝ<{ºøúWc‘MÞOûœCà’<ç\n¥j£„©Ü¢ ÌÕNóLúlgܦ]ÞÜÀ¢1äêÊ=£Ð”ó|ê[Ãù&g5eæ:Ê,œR“™™*Zt»'À+уf‚ „eñyž œIbI„’5lié4,Iê£A"ÊYzÏmMSNîK>KœšÎ’Ó—H8Ue"WïæÓjÖ­ÀÄ Ô‘’ê`â\ÒÔz;ËD ,<|¢a殩lD$%Ï­ )×yÐÿšztËi ¸™ˆ8莽÷Âçm­ÑH´øÂ9·,šXÌZ’!¿$ÖÐ">°Íõ¸I÷¾úõoþÞ×¾ùð•W)Â3ª×îë‚æY”`TiR{nN”,OßÀ#kG§ˆøêâJu§ê»{"ÉÌBJ•qIÔÓh­MÓÍÿ™ÏÊóÛ¶ÿío|I¾¡\'?¼s3Ïí0ÍÁD›rq}EC¾~éá¸Ý^î6Ãv“†âá|ýàzwcûßlŠ„_##Ì ²=Î7Õ§ËËíaz®>k5á-±)"rdÉ„°ðÉ•Ù(“«‘³@(Q¹k¹ýðæòú%ft¿ä*„l<öÌ-HTkÊ£ºs*ƒn}ns.ÔÚQRRï+Ý(¥ÔtiõZ¨mÊÐÉ.%³5™5wïª8FÏ” 8‘ e´SN ‚Ç*ËÒ;Y Ð\YÆqÜÒä>»Q³.ˆä.&;!¥â ²ˆðÚŸ IÉÌÔ,ËBÌ Y˜yÒÙ" ³‡J·Ù¢²¤ª.à¦" w´ˆ´j"È)óR?E"«=ýÇ<“H’¹)Vv<nBŒ4Bi-ÐkøB8ên™ÁÝO¯+\ˆ(BÂy$Ùg©ˆ@u6‘„«*/Ê‘…†@ÀZDNÙ»¸lf3H$3 ¡BAL”¼.øóÔj¯Ž2Ktòy§ðÌ,ˆ%xˆ…s÷bs8EØv»Û½Óô,m7â—›á;”žMm¼äp¯Ö"‚'hXs. &b13r’qØÎês˜Ð¥mZ¢‰=Ø"BFŽ"‡ã$”3]<}ï)ÓÍûÏ|ò¥O½õJÒú{_ú‡ãï~á¿û¯þòkßü×~öó»ÏÿØõNö·¿ÃÇý3ÃSÁ€)[ ¸P¾·ÇQ‘xH…½æz:Þ>ß\\*ã8·ÍõåÚ\]ïæíOþÈ[oÞ×4›Ž¡ÕNã?½úÖ ,a¯³ó_Õý4·¹Õ¦ãnKz{jÇ)siíxòÓ0^Ü^æf$-A´Ü˜@j;äat?+á½zto5׊FI¨°ë¥ˆÜÝIÚíó'-oTUÆ ñ©Ý„Û͓ǧSÊÐÇ>ýùŸü‰O·gS|çý'ÓÓƒÚ¿û§éõG?$qô¹¶4M:Ï'<~ÒTKX9=ÆW¾+N NÍ4Nû#ë4Ïóíóÿs{Ìì>ßnõ“›<âåW_Ïe˹ܻ~˜ÇáÁuRÕíåK¥”7ßxp}?”ÛŒidÖZJnÄìwàPf¢œr­µŸ^ªz–ç•R̼³A»2³+û=wׯÅB#–~ A ´ÛO˜†o·Ûy®‹—ÈÚñôW¿Û0­hawÄ{·7×»RY½Ñ:*»â¥qþÏL%|i×ÈøNB É"=i:"º³SÄ‹á=5·RŠ­Ö~èÆBk@%Ýõ9½ã×¹Vo‰™»`²³hû §p’D bö0€¸ºasyýö׿ñ¥/ÿöÃG¯2ÈZ ˜pœãE,™»«5’Áç×íYDxZx{7û½pvwf5𤢖Ýezxá êÐ9©|æ-a—»íýv»íåÀÖŽóÍóƒ™!¦i:N'kxï[§éh¦‡Ã!`ÝÍö“Ÿ|óåW_¶0‰HG;0óvsQʸÝ^Œã˜â £‡Ìß›¾õÕþò_úŸä3?ü‹æ_‘1åRS"U´z ¸¤,’lTBp¢ [ÀV1û-'cv§HCnÕ܃„%±{XÀ‰ÁBCÜšFX)¥G¹œÙø´ºj¢ >r&2Dƒá¡m²j½»J…ÒÿBÎn™06›±U÷°R6}å}^?ýgÎÝ@êŽ*‘w3qÁá"¢¸ž~<îŽÌtM[Äyܳ¥ßóNºÄ#çLëpa™ç: CJÅ\A¦ ‰ˆfÖz&-b·Û¹*f‹Õýù-Ã’Ì܉šVDÂtou“èÔÛ‹BP'##¦T’;º=k*™y1õ¿©ªuj¡³&)Â" I)UkA༨vû÷Þ -d)f*BL èq¿î‚D¸[ä<æ2R°·`–U/åD$)¹¼§éIæä±ˆÉK)ó|Úìv®ÍÓ״ â7»ííé„as:Íæåpܳ=ùÄ[¯ÿðgÞÌ© µþí¿ú7ù/üòï}åËê_þ¹?÷‹?ÿ‰·îãöƒ!óaz–s•\N«¹_ìJL ëµæˆ¾\ý÷§»ž×«ª±†µÃ4}ðüxy“RŒæÃÁyÌÄä Ö2ñH¨³[¥`F²9Á‘RJIÈ}"*!=ù´Ÿ3%.LQ¥ˆ |<Í` §,%Ú)K‚ÍÓ‰ZãÆAÏOvïÉ-ÍÍ*!çÉé¯üÿǯ¿ñåGÛñ]:<¶9Øþ׿þ?<¸ðG..wWùÁJ²7i·Ãˆgû`3¦’ÒfضcÝŽ›Ì×·GÇÝ|ôݸ=îOæ)Ýì§ýaºÙOÓ||ï[7I†')¦I÷û¯JNŸýÌkê_ÿëëét{+)Ò&ÍŽøˆ¾¿ªz7Ârz­GÜ}³xäL§é6¥”KŠðl¼ø•5Š=BÐÅñ¬¨ÀR湟3W¹Ó/ì^îÖqަ\÷_avÄ8ޱ¢Íçò¥;ž BÜ}u ë°9»;ñ: 0¢KÎ<¼ãäëDi¹z×[kuÄYÊÛǽá‹.«d£ï˜g—¬˜¶­¹ºoì:G˜…Ã@}õ{D NJùí·¿óío¿÷ÆëoÂÔ+Á‰˜LA!Ôµ‡Ýï5i‡#œy1]ä5W°NYÈÂ…E‚E´VDÑAn3­ê(vI%`ttÂDÕĘphÏ3qÎ,Ê¥ó4D’*mÊõ4ÕO¿z-cq@†,y°pÕjv ’iž¦Ú¬1Í{›¬=9ÍSSµý~?Mõx˜æyf±ÍnLyøÚüMãÅ0 òÒƒ—¾ûöá“oýhN»Ûã~Øøn'ÛíîþõNDº¢Ü7·fjV{|[ŽGÊ#ƒê­f1I%y·%À#¼coDQ[+’ˆ(­os+i5ä¾S°§ebKÔÕ@}1ÎóÜKö³zÖÏ#¯¾/î u©µF$)‘ÇÜ#Ǿ§þ¸{õ—îâQ @1×Ý_¿úfؘ[ö3H˜„—½õaúÈ#¶%‹Áùb‡¿Ø¨¤>ͱžUvÇDwZ& ŽH¿cpçÝ.Ÿ> ¼hrÎ7³ßäïù¤q'|à{ö„»¿ÞŸz{˜jw|æa”pÛOõaD/ª ˆÚ*#ÒÂúHwkfäœÍ[OñH©ÒD¨)ÌÖ3ù:¢EÔww-y„Ex$–/µN.$%vdaoœçqîäÞZUßl6†°P‹ZÏápXºˆ$s˜jH a‚©qêÝY8‡‡j˜ˆÌÜ,˜ÉFŒnÕ’¾{Îó¬­2cš&î¡%êBÄ jž"ŇÏëTÝ¿|ëõ×ò}"‰ýî?ø{¿üßü…¿õ×þæë_ûÓ¿ð‹¯ýÂ/¼|¼½»k¿GLz6?FηûÛÓíO5Ýk›$É#XÒPN·ÏràÑL£Hb¦Í&«‘ 3sjá ºÝn7eˆªÛ1½~óa>ÕìeÈEµý£ëáŸp}õG¦²¬HíìÓ %_è{ÝÙÍÝ''êiêÜžž@"’“Ƹ»˜uBŽyÚƒA#»VtÄ ÌÅxqÑ31d›†ìFÛ¤'‚‘Źͧé87I$’ ±~ÚÊx}ù íO‰¥pj\v£Ã<_Ñáäa(Fo}ãýgïbßîÝî¶÷lš›Å»·óö¥‹¯¿ŸÝçzâËͽœ7ÇÛ)Êñòz;W=ÌUÃk³ê¾.2Éüü©›Z¨2Ž¡MÛ±$ಌî_?Ø]Ì­M8=zåú͸7éÃw~çý¯ß{òvúÖoõ›ßyú…øÚOþ3¸™{«C™õu-vxk—>oq%DZµf¦¥ôT÷±?'DË”ÝÃ#XÃÍ= ƒtIÛ’.ݳ 9¤·}h}—t†Ú@©j¦ÇÑÚâñÐáâ!ô-,¥ämÁxmÏ%±»{qS"‚lq"ˆ„½x9fN9©Öî(ÜeÀ]6ÙYúr:¶Ã¨AÖk¬´X|ÚêÈ/,Ç^¥¤±ðf’Ÿ ³`‰ `4ÀAq¼½Ùlïýý/|éío½û¹ýÜ|8l‹˜ÖMNî^A‹Ã˜Hq7w7d±÷n´ S“€HÝÍÌ)±÷¬*ˆ“;’—ÑÝ=*AÁ N-*Æì¡ðêÍ»\̨§i³EL^¹"(À %çÓ´ÏcÞÓíGm®3ljEdࢱeK÷WœŒ®KDï°¯’”~8Y™XÀ”˜ÓáݧŸ|u÷ÆÕFŒž}÷·Nsœb{š>¼½}Þ­KÍ´éüìx bU½Ý- añݦ¼òò½O½õð‡>õ‰ë‡›z8…A}qtÍEÌL­Ões¡ª’ˆ™‡ap‚µùÌNÀ:ÏRt®2Ž¥¶Éݳȩ-Ó®. `ábwSŒE .4¸»›o6¥µÙÝJÉ>i)ƒ.Ü¡å:½Ý0Þ»­ŸU‘,ŒÂBæƒ$ÕîfcFLªÝ×]ŸÝº}Ë™`Ñ'„Û4 "­µD,"’—ị@!Uµ:…œ‰XËO­1)™)ðg]¤þE¸i±^íÝÖ› ªwë_‰h)ñ ädmîî,,eãº$Ýgpx¸ZÊIݶÛíÔ'n ”RÅ Î)3C!¢¹Ö’Å€IkKBü oHãÞ°q÷™C<([“°¨K¦¦*fçcfo:Ï•A’à”©Ö%¶AÎNT1‰9º|ðówëªiáÄÂc$ÀC“” vïy™†îí„´Ýl"¢¹…yxP–<Ÿ&¡hsV­"Bá€O4rÊ.zÜ?{§ ü³ì§¶ynóÍÛ_ùâôgÿýÿ÷oýúç>ù¹óÿí?ûÏÿüÕ}ß?û¢¿¾†aØ~ð +»aF½º~¥Zm‡§/—ñ¶ê$ÃøüÐ48%)›œ>¼y|q`ž§c;í.wÆJ2ÏÊR•§z™Æ<¦<^šž>(4蜠OƒÛ7N•öi›®‡[zãáîX[˜d\4†xâ6‹•§‡Ûc;Ú¼ÙíÌ"#i» H,lGÀlÆÝî„ D…¹Ûíó›"#.¼ýµöü·¾¹¹wñþ»ßýõßøåí(éâ²l|í+_ÿ±ûDÐcøå0¾¤uvR®‰¹P0Ñɦ*BèÆ»=a×:·®£…„ÄÌ")¥D­9÷þÖš„H Ñ:½§›3 ¿‘œq¬˜%f@ˆ½ª,dF#NÔÂ:Þa­V뉈R"USpp_@‚nnEDD‰Ü@äAèSh¨ZóXظ¥ƒ\Ë4‰ˆ˜„>âKLá±´ k»FmJ´¨f°¶¹ÐŠè»*´ÖØn‰hq !òÅßý~ó½o_{ô ëñ²TŽéØŽíX/7c â>XKü<—Œˆ!•Ãtbæ$t{{È9»aÄH ¤ zf'SˆóõîrR­°:6e£ZgmÃv£±Ø;9¹û­y°»Ü™’YvÖî¢ç$‘‚²psÏ9Ïa.¨mÎL€Kf'n­…@qJe•l˜1›l­‚®CÉÍÝN‹75k R󶹦‰Nt™fÕ)ž`ƒ¬ÏJ¢ëK’’A<˜¥1?ë{‘Ré9nÊÏoæ/ýú{ÿû_ÿ-ãöG~úÇÿЧßü̧>Nhß}ç››#èêòêf¿J†Ácž"¢Hqs£EŸÒ WNÐd-ˆ)‰ ixùåñÉãw¨åfÊÒ0/ÀNŒµ 1QÊy>Õ®²¡¤ªn:IN@äœ:šÐýÇ¥Ýê-$a$’ÈÝBI-ˆ¤HæèRè¨yˆpBOI#ˆ‚rg¡ EçU0BO‡…  æ0wÍ,’ÈU©™€ }$êæÌPÊŒ¼d:ÈsõÞÝš·a°$²ð̈'2Wv^²Ëe!•;ÃkëMüZ¾€()1I½Pæd S P3¸ZbVW¸ E—„Cû²Î3¢Õ¡Ï¡ÌÔ-³Á ð©™#„S€\òQõ¤ã&ÝZ{8¤Ø+íØ&ˆùEå ÑÆð6OŽÔü„`&ef ã …K7Jiaq$ˆ5Š®H¦Å‰ÄW4¡ÔÇCD²åÉSgæDcx©ªrÊ@w+E$̦á.Ä%¨ÕÊ "2¼Gs³–".§•*¹ä±Ì‡½€ b¾}ö­ÞýüOüàÏ|þš¾õ»ÿwó‹ñ¿ø‹ÙðgþÕ?ùKâ_º¿Ëhos«öòä—奶?Tž¾“78Å\}~öÒ%?¾Mû‰Erµy 9I±é´ÛnÍôáƒ{"dY9!XB:$gFc£ÝÆvŨ¼òú½]ÚÓüaø@ããÚüÓ«?¨CÊãýmc«nPgx$:‡azÌæ»pž€[ç7 I:dzš¢—0zšÐ-9à —Ԛ ¹*xg@¨û:‚R²t£ã„um%…‚< ”`áÕ¦¦S­ÓÅ+À¤,&Єƒ¶2@ˆ ŽztçSõä­Õ¨Õ+*”èr›/† b>&×zŒ@ô¶ 2îÅNÙ4_n#ŽÕ”Ž•Üù8…Ãèvnðm³É32y:¼.ôðáµÕ›·^¿º.Sfç‹íwðå/¾ó/ü‹ŸûØ'_MœOÇw´éj5¢÷EJ xåóÒîOÕýŽLù@­õŽ:±×Z'3D³„²;yl±&v.“s«€)‰Weà’úÔDrWºÒ›†ÞZñš•Úßp,Ô÷tîübÍx£; ¢ÑÃ{×댽/1÷ Q–¸ƒf/krÑ/nñî^JéZ‰.]Wùz»s¨V3KÒ0bþæ;ß}vóôão¼z}}ÿ´¿¸H\]Ý¿õÃdÎÁ^½ûe¢󛪻y´Ö.®I\³ æÚT °©srž<Ý›$æÔf?qJ%!lPbÎyÐZ;¦uy¹«µNÓ±O»A º%ÂL%‡$$b÷< À-‚9ÜT('!é±q/ЃÑWN¬©D¸'Á’X'ýØ"DÖ7"±81³;‚˜³Ð<„-昆Ȝ³”K¹ºŸ®~’RþÒoþîÿý«_1ÄOþÄÿáÿì½ëGBnípªÏÊH®Um™¢˜òü¢>fê§Û •SD´vÚíîßÜPm3ó†8À?·íåû÷üO¿í)%1Õ»?àî´H5D"¬»‰ÄÂ’ìfªËOb%¬tYîD†vïÂ\ºXˆSñÑÈ@!ªª`x  Ö÷qG‹»Nûƒs÷¹Ç1^݈ˆÓéÈœúͽ;ê%Æy²ƒúß/“,_&eýß}Opà{ÒsEî0[#:àt¾Ãßó-ÑJðY·80âÿãíÍbeK¯û¾5|ÃÞ»¦sνçöpoÏɦH6EÊRHY¢%€I ÇòCb $@Œä)@Fžâ ãXˆm!6'‘lÄq "±¬D‘%J¤Z¢H©)Rd7ow߾㙪jß÷­µòðUUß–¬ì§F¡Ï9u«ö°Öý×ïoÂbh ¦–«)¯ê YL¦|lÀX̬r±¨J\¬]ÓÖ–XU™½™«7´*»2»œs)ųçºAŽ€RJ!ôÄÎ{@b¦ÃØ:`dæ4Nµ•"äÆÈ,çŒX€‘‘PÀر‰Ž%qlê>V;ª4@¼®·©uó4lÖýíOÿÀ'"Ýz²í¾ö+_þÒ/üü¯ÿÒ/~âÕgþÒðïÍóælÅzÕGWCÚ‹~Aµdƒ\ŠNŠÁr©¬"Ýc¼o"šn²ª1–`DmŒÔI’ Rˆ-(ê6y¿ö…‡ôÐ9¾ñì“â‚þhýЬذÍàŒ I[ãV¿+pÈÝ,ĈøìlSrm*ÙP±±8çÙɼʆëó^“ÂÀdIÀ€ È3æš“‰Aƒ!8Ž”K¡ÁbƒÀçvd IDAT…=™ô ꮵ7¨›m2o gT±¤c æ[ïœs @ÉÈÙf»ÎlµX@„)c.¬éšõWÓ´0{×\_ÞJÂÛ5 äBŒj4]l§ÍåmÓ5aô­cˆVü”ÝÅzݯ7«åÉ*¶³£6ú!çu9IÓ4H–e ŒÑ€A4¥âÀÜ5"N'Ë6pñ0’&?Ý=•oÜ>ûâ¿X_>ñÂ37ÿßøñïÿ‘§&Ť©‘GðÈ,€ Àчœ3˜éTs>Œ˜é`È8Ü—Õ î¼ ffˆ„»Çð1M“ªúŸPìlq€PTPÀDÌX2¢«÷—:]6ƒÃ¸÷&Áðô LÔ£S÷#Üç­Ô—ýÿ¼ÇVíëæÊ·6Ü—&S.wéXߎcŒf»¿{p„ ¢Á2¶´T12šg$H9?º¸¸}ÿþ3Ï?ÓAZw-&…Œnºº¼s÷üçþÉoÏÑ5ŽTÊ$ÒŒýàMôþ÷,B¼èß»~tüC¯ܬø¹YÝ<¶ó–Rô]lŠ2Þ¸~JiµØð¢c´Â¤ìPºy¥U朜GQ R>7@B›XJQ1çAl€ ·€sŒaÊ“+22 HJæ÷O»÷I˜ÒîQ÷øÃ5W0¨{ŒÁpx.ÙÞ@œ"$I@XD‰B­5 ÁÆq$vä˜GÂIè\›°|ùÙ'Ó°‰1²Èï}íÛ_üů¼õö[ðSÿÈ­›O¿üâ³* )—<TŽ,kuUÛ2ì½Æ‡zJIHRÊHj+Â?û¥€ñ[/wÛ§DEwžŒL=ˆ*e Œ2Bµ~’ˆ™"‘c.Ÿê°ÓIÅÅ_=h]ðafPC1C÷¾‡©þ,¨ÕˆíÝùœ™‰íKå¾í„çݵÓ4 ìG­D €¹Lûñ«Íf3Õ]rÍ¡, "T{œq´+>+ ‰Á Mê~ :n€vžñÝ£c}öÊŽõ¹ŸïûئBuØÀˆ¦u«GµÞðfà:t)Ùn†¤d… ©9g„ (h#˜Õíb3Dç=UæõÁR“snÔUÛ®uH"šs²ªÚ£«-VýÊK. –¦LP׊Í;$4Pçœ €8ef2³Šg`J)ÕDUQ!,$Lôx?ö‘×VOŸ½ÙýÖ/üü_û+åå§®ÿØös/<õ'_ùq²3æ+Ï„Šô¤™­YúØ&)íê©”’´…ˆ6ÓÄÒ‡Òè\hFI½¥ÒHž”¨°œ³ÈˆØ‡&"­8âa»†hPÈ6ÁM&ôã\€kÛ±Loß~Ï‘gúÞJŠï­þ(˜`óþ‹ g)fMã6cä>ù¬  ä D¨b;¹ãÙIðœ™Ü¢;—‘¼ƒuƒ‚€3Sµºu…0gVÆ4*^õkcW†2×Ûì-{U;ë‡yã7i}9¬3$h=8×LéÈ;›¦)11ÎÉuÆq*3Gã¼=—iXo@ y½kJZ\;¾êí²gÔUÖØ!Ám韈Í]sT¼Fä˱RŠó.v¶=¿ßÀbyrLÒúÕÌÐ4@e×–YŒ “õiöî£K¢ù¸-ónõô).¢¬IŠ EltHÓ×]7ï×7N»ën¯}¾1– ØE׈•, BFjæ÷àñª¤o½ww6_¢ƒ*1åaD±a½Á(S©T\£r m¸ÆM@SMàèùk/L#8n^·W=Ùª[ÞyðÎÅ:ójnÅ=¸ýo.Bt‰¯6cVX_nBJOt³ïñ¥¯~éKYTº8{ú4w2[ÎÚ£.Ìâ|±òM\t³FtLÓâú|ŠÑ7‹p²huó3Œ>ð(ãÀkð½š`ëý8H±±°¦˜]X˜3.¢˜ÐS.ŽyÒ2™ Þ”RÖÆ‡¨@ÎI±Û©L*j^ mzÍ‚@ˆ.8¦’v¹ódä 4—Ðv©Þ[Å8C"3›“™‰¡Ï/7c±ìÀÐs61¸’²Žaúð˧ˆ¸¹?þüW㌿øêG_}îÅ›¯òy„lC¯2‘‰š:––)R'E(’AÉ%8-NÁl¶ÉÉyÁì@\T›L{"-i\­ŽU°Å&Ž% ™#v€EÌ‚óªŠ@ZöÆê ö1c¨¢ÕΛ Ç á|¬ú'@/:f60ÍŽÈ‘ð ê]@ P-„d» Á´ªfÁ»Ë”îܘ&DtŽ¡"DygjÙI‰•L$VˆÈÀа þŽX¥FÒx g&¸Û5ÛIÒÞC½µ˜™UyRE­»Kè°‚¡wäŒS)"@Dµ‘Jîb~Ïa ÞJÉX!CȈXÄœyØ¥š¢š 9j,  8o賤LzU·8.Ìo!{C,„º÷ šAÚuaBDEK!¹å™‡`yjB7içCÔÌ îªZ)ˆ€¸à‡œ0¸¬\]¸C"6ѺJ­˜˜90WG)Ö5­NYµXÃä¼ORò0Î/ FPƒ^&³×n¼wçöÉqøøkÏwyû»÷oý£Ÿù›ÿð¥çný¹ýß|ᦛµÓù¸I³8Y×.ÖÛœE]  .]IšSòDlR†¬Û5Íü$â½80ËÃØ6ìãj[ PñAH#HÈSÙÔ´‡®™o6W ¢ ¦”â¼±¢Žƒo£‡híÂè2pA8?‹qù=%à~úÇvŒQ©#ç(×4§’R}Ös«"ÈDÄ ¨Îï&°åjuµ¹DOˆNóI‘2(0¨TCg÷×˧º­ôä²óË8\ ® '1ïóÕô ̼©‚W¦,`W†Ö'(A †Lr¦iæšܲ3àànÞˆf(9eM…ºvyë™Àðûo½yÑ÷ÞEêšöÙåõ£ØÍÁ£X.#ÆyG’V«ãW^zq{yqï½w}çs2GhÁEDJR,Æa’ɰéfGË#,Ú_­ #ñ\@o^·Û¬ÂÚHžýbèIC=;[ÿz‘§¼÷BTLˆˆÐ©N´wì?|tŽjïr ûϠɰCRàcÇAfxüEQ}¿ýªõG6uºSÝìöoÓT;¬$ØAÀ#¹Çíã8£ƒŒû˜ßÚˆÃpèê?óýnIv]$(˜(˜9$+RL<3 ‚ZÍ,Æš²gRrNõ9áœhõ|ˆQ  ÁƒC4Ë›·NV ¹4íXò›ßþæà¢ã¼y°œu¯>÷¤iÚöÁkï;Ó¹®Ü£‡ý¦wWÛqš]{c)èdT\“Ð[¸œ ÊüèAáfv~¡à³³ÇŽˆûqt~9¥ñÆÍgG^ïÏŸìâ|TÄ6E× ‹i¤MÐìÖ÷ò[Û·º®-(0§U7·¯Ý¹ûmÓæì Á·G§­³Ö‡ÖscÝ‘§Îæ7ÚÎÏ©\šf¾–è2[.˜£‹EôĪYýTd*È`"bSö³1;SaÏk1b"SÔ ƒ”HÁ—iHªÕØ6Êèœ žsÎÌÑÔ¬~Ae»Ý0 Hm¬+Ž¢~™Dˆ¸}ñÕÅÙ¥ïû³_þ¥7ÿñ¾ð©ïý¹[7Ÿîq,b“Àyzm| É… @SÕÕÑ äi¹˜çb5',Ùf6k»iꑽxD/4Žceþj)IÍ6_ª;"ÀeuŠQOࢻì›*ñÖ±„1>~¶#¢ ˆ1VQ°¢9ŠJFC4@B2TfÆ}¤N­_¬N DDÅÌÊ>P²2¾¿]|¸Üª”¨{nX}û‡+±Vù"’ú\/ð]*¤ÈŽ%ùØ­c§¥y¬ES0E¬_€ìXE’eãÊv®Ÿ’T´ƒËj0xÍ”­Ó? .ÖáK±""üÁɲH¤*˜BýŒuš†ŠAÒbBf` ûÝþÝ7(ZÃŒœs5Á±þc§iBƒPy¸df–svD¦JH¥$¨f8D!”"žYÑ„ÀLu¾˜Rjc#"%gòX=òYÄÌcš¸®¿”œEÕ96IÑ5€@ÉUB?û™σãË¿üåŸû¹{ß|óæêÚ_üOÿürÞärAå¡nª¬º˜Á¡sýdÀ !ø6”~ÜFÏ1´>°CœÆqÊIaÏoÔ 0íVot1$ÕË~œŸÏæiÈRFfV Q;»¸B$fÇÎa6Â@~w’˜bKcÑaÑÅ!ûB˜üïÿëøP@fE”¹C·°rÕC¯RĈQŠB= ˆ!Ž›ÆÈ7Çó4ÞY.N7ë»Ê­36©k—IUP2 ‡«{ãêæ©ðeQ‘I¬`žHEd*[6L:)Hvè¼£,&‚ ¯JîAÈa¢´‘¼MJlù¨ š¨L ˆÇœbÓ MLôÉèüâ’ V³Ud'’|` Î%D&L—îØ‚ŒH»VÉûvQ4—"Z|\"Zq˜šŽ¶y£Þž~îÆ¢s·¿óûlì\VÎÊ” =º‰.]9†ËéæÍÙŸýóŸ<ÛLûüB¿ýœ_^CR•0r)á`}8Ì öÞ1¬w^ð!¢óƒCÜÚº}°Ô@Üo—=^—¨*"‹È^*6Cȼ»oz$F&1-‚‚µ£2К^†å£Ä†/‡ã ~Ö‹¿¾ózƒ¨?RëUeØ!À=˜B#EU5)5§MQÔÈj Uí`æš  fj‰+‘(e+ª±‰Rr`÷è½;ývûÖÙÙû7›ty¹Þn‡¾¿šÍ»Ók'zî™a3ýÎoýßÏVÒðÕ/þ_õ¿úŸÆ³Ë?õ£?ú¯½ôüâ£/ý¥w†~Û8Ç!zFD)}ôlj%fWr1B%!#ÚN M’ @™m,Ž˜¸Ûz{€Ó¨Öè¦ßŠ ®9ÉwûupŒ‰¼•Øv"–KÁ‘ÐZÇ3Ä*_)1¤<κEÉÛ®¹ž‡µ(—ÿ¿ë6…1%±GæQ 96»ê‹Ö•Q33p<ál»òtÞ¯³ócéÁ ¤¢À>„çÆ®0ŒaÉsèû²MeÐ’ÍRª]«2ÂŽŽ|8¹wjÓÎQhïÏzECÍÇ« û`jk=v÷C <Ï Œ aO\Jq&jE¼kMÑö®÷ YßyŸå½Ãì1ï[=*/¹ºXªøq°°DïÅTMy¿ñ`Á"‡’2V“@1&¬±i¸ã #0‰ ˆ9G¹¤4Œ¡]ªbWÊ4ŽcÓÐûôg¾ú[_|áD¿õÆ»gÚî™aØ6¡=åÔ‘ýèg?Ñžr§Ùåø³ßúõ/¿yvw3×–íÊ“¢ä&k¶:2ïzhË`›bÓQ\ŠNªi5×ONe, ‡öÚÅlÙ6³1¿øBšÿ‰?>ý'°XtMän9ø$òðÁÅ´™Î.ÓùàFË©Ï4öÓ&¯¯ÎnßyçK_Ÿ®‡u¯†“°½ì·~;%l`á|tO†¼î]™‹ÅDV G±&âPŠ¢X–f¨EŽfn³¡1eçhQŠ›ÇðúËO·­Ä(N‹ŒŠê ½vaì'Èæ†’¯úáÞ{÷„ ”2ŽceF©ªDß4>°X Ž>´>4€v¤ÎœsíO‘w§Ê^Ÿ7ç`ܲ’wÞ™Á¥c“bÜÉÆÙ ¾µ¾êÿößúßÛ6~êõ^{õÅã“‚MÃ99>½~Ü ¾ñõßyúÅçÈÔ;ÚŒÛo~ãoüÆ·×—©m¯¡[…'¶ýW~å­go-^~þ…Ƈ~»5&`,*¼^ÖtÃÝâåÞ:z¸¬vOh؃¹êUæ£üŠ«úGãœÀÞ¤R§!H^ÕבR˜ÙD 9ÃAÿ¨ÏC$Ýë´OŠaïõÐã×Úá)Èû,ûÇK‘*+2×Ì*C„ÀNEMß/\e–ª™–RPÉŠ©1’wH¦eÊ#Àâ0~Ö9§&¶s4ÓáõÚ&™Š'2E@çký±)cAEJÊmlPU%÷‚•,VƒÑ0n…óÎLZ´ ˆ³¾~# "橎bEdÇã8ŒŽ‹@%ç€v¶‚šÓ¥(f†‘ƒæÄ†„Y™Aý(–RòÎÕíeà]þSí½É*CkL“#&7—¯¼ðÌó7ŸÐí£ú‹ÿÇÿú÷~šmþ؇?vó×nu¨kÍkµGW›ÜÄù2:Ÿcls)Q‹”±uÍ4õNS!*j´¨{ „º…®ŸÆ,¢yï CR…¡&&ȳ†uÊ``Ä.6eH©¤Æd™¦<޽d¥.hè®=¸Õ‘³Ø•nÑßKñð=Ö•Q­ŠPÅ9@Ä@9)£ž°H>ņæã£- à8*:íx…c™m»~&ä 8ªyBˆ$„Û¢ê‘ ‘¹Y§2ú¹“I*©LH2£8¶`É<ú¹4]¶×L›æèØ£¼d“ ŸãhU¬d]_Õ¡™AXxõ°Y_:ì5‹Ù‹ è[+ª“ IÄ2‚5PÂÃF¯Næ^uœ¦•6§ôü««ÏÿÁyНµÝ²aNi’Rtr?äwßy¸îs óõøÐ Û¬/ÞýÎíwÞz{ý΃æ½þ*QV¿•ÛeÛuGGG‚!ˆm×›§Ÿ}>ó‹¹s ”µ¤Év„DYv6¤Þ5˜\ÆYô×ã1HV `G†qV­’“V.»¨\JÉåÝÛoOEâ¬ë–«1z7åÌÌI³1')ÍÒkT †™*Rt#€äŒŠÁe°trWϧ©Üy{ý _üß®=yòÒËÏþÀ'^xîø¨#{”Ïï_~7^8×´ßþÝï¼õí7·ëþáÝo›ÍÎ6ƒy¼*›bÑ´ûí»ëËðŸÿ¥¿pzóÂÁsÓR®NC-@ˆ °ÏŽ©{[Õ[½«ò =UD¬çútRÏ Ò“%Gˆû¤$$4@ðc)fÀ¡QØ%šë.óòÍ“¼7³"ŠÈD„à í#úêµM€lˆäTŰ.¨+šìÜ$bõªñuH³‰!cQ5ÒPª‰Ø‘„ܘSâ”GC02ÇfyT@pà"˜€°˜j"dD$B3©BÓÝræ^š®ï-„PÊ!•WEÄ < ©JAG†LìEr5Í!î3 ó—CvBêï¯oÌе˜dÍÁCP‚Ý8©rÆêâl`ß<™iJ ìjýèµ×^MÈÓ”Ç ®_?zxÞ“Úq*÷ÞzãÓŸ~my­Å™[ ýÝ/|á[oÝsøÜ‹/­>÷¯¾F~öïé_úôçga~µY_]®ùWíS¯¾º(šaìÓ”ôÛßygÑ5’óv=^ž§ÌÓùåâOg’›vfS6˜Bè]’¬–§r9_´³eô@õ‰£å"ÄßßF“Õ²eÓ‹ó‡É¦ît1ÍŒ"÷ëÞq3ïæ1†’ƶ«¥ëàþKÏnש¹ñäç>ü² %°ƒ9/O®c¸ eICŸ¾›¦iZoû!§ó2dtܵW„J6s–<Þe›ŽbÊèz bd ]IÒÆ&Ù³SUP5Ö!±‹s‘bŒÍ¼Mf¥H üÂËÏH±ËËõå£[ 1¶>:³2[µJ¤i(õi hˆTÊhHJÄ!7¾QFþô'?|±Ù¼ùÍ7¿ö«ÿôd1û“ÿÊçŸÿÐKáÁ£è‰ÙìѽÛ+oÇGáíf½˜59#xŒHÈöŽÃ+Zã|kÀhÄݶš©V*‰Xuž ¼E×Û]õ@ueˆ2Vˆq•0ÍU^±íI¦÷I=L° ÖˆG<ÌhŸÞaýÞöK=Áû¢ ‡…8­»ô°0G31%É\g©I+Znõͤ쑴çþ¾¨|ØÑ+"„>„¨ªUN%"™å\B†K1ç1rÍëV£væ¤Lìó3§7ž}úFÿèÁ/ýŸþëÿíO}úµïÿ3Ÿû—Ÿ{j6 w•Œ5Óш¼wBºŒÝ¦SJ³Ù1"õã`d‹¤éÙ›·ðæ|Û….O9O)šÕs}yŽA!ø.ƒ,£B¦^sÒ¢–Q8¶MˤÙÚ®(SÊVt*=Qhš&Ccòm¦æï¾}eNŽ¢ºx¥) IDATØ+¤«õ¦mgRl†?Âú#!xjN;#Ë:¥i2qe-^]¾·¡ëóù¢Þ&ÇeÊàgl¨9%0Ð\²‹[Ÿò$šú5x³\ŠS@1ËÂ$fÀÌÅLY‚wÞp»ÙBpÌÔ)AŒ YY|@u“ŸÛV×çâ8+³_Íx5ó]ËLËLy3ß¾|çJ2÷æEA'8^>qÑ謥cÐì4€’O¥$öÞ f{¸BŠŒiʰ—4µÂ†+ Ñ™¨RÍV@$ †¢Üz¼¶:º~t¬©`Qp¥iA D¦¶ $ JIŠ.“{ão_¼×__Þ8½–=³w1e s½Ñô¸Öº»Zöû®»Ç?!"@TsÞ(€‚ (Ð.´‰0çÁ“'"Ò\ê\Ç =¯Oz"B£ Цf`¤5©Ãïp• Tÿ#‘³÷IdhऺGÑ Ø@A@w&)‡¤ò÷Ø#¤ºœr¨?v“ig¢b`М!bΙÕ?Ž ìvN~)€ ¨„®‡’†Ïþñï_ÌZÐÁ»ØÅbwûþÆ7xz||ÆÎòs?ør³õùâjøoþ»ŸíÓóæ%DSKSžY†m)ñˆÇ霦£“¾ü襗nø†„§ ¯Ël~rÿÞ¯þðç>Üxçú«Ë›gO¤Áë—¾úõ×?þCÚÍpõÖ›wR/¯¼ú±¦¡O[ÿèÁÙúl½hüæjm"Î/óâÅ茮?¼ûÞíßúæšCˆŒ´~ø°‹Çl8m×Ìì‹bjüû!¶1ÐÂCãiÄÏÞ¸Ü<`ÆvÖ15†ñ¤í®MWW÷î/ªZý=9OcšœŸß}ð`{ñ`1[²l|˜9‘Ñ…NÄÞ}Ï€\hØ;ç\ l¦JÒ"HvièÆL†#‘ƒ”‡Îùùõãr|d_üͯü⯺wïÜ^®šž}â¸]ÓYë]¶¢ iöd=Õ¶U²œOëwýÉ–!˜pFóTo€µÎP<ÔÁ‡ËðŸ5Zíκ½áúpìN]þ/IEî=ûõµ”€–} êU³ª©ó RGÕˆøxÌÍcïê N´Èšˆ‰:fTÍ™+aˆ<H:ÐÊÚ[Âa;QO$eÇR°„"¡J1U©ËBÀØ)¼?Úå`³B#S­ó !äC×û]¡Ã‡©A‰r. „DHÄìÙhZ®ºÌVò¨–‹ŒÎùqÜÄý‚ýãp‘ PGqDj(Zyöù Õ$WGTU¢US¬¶YPSð@(JX«1!‡%‹”Ý\®ŒÇžzòÚµ£kw¾þÆoÿÌ/üÍô ÏŸ>ýc?ö™ÿò/ü¹®™"?œ®ÞY´K\¦Až3z0AHžÝ¢é44çç—«Õ1³3hsàP†,ýfKÅÆõ´½Cb‚$Ecð„AJÎ%­§íC›ùüÚ²k«HFD„˜&if.—ѹ¶‹T¡œs)¸F§þü­Ûãµ'ŽEòÝ;WËv‘}â)'͈Lø‡ì´ÿsŽï­þpÂäA!;0s¡‰ËGÃÖ-¦ÙºXA–Æ¥2  ßj/CË"PQF‰7çÃ|~c»ÖÛ­j!CcjÉÏmh›ÙÐoY‘ KÉä…ptz‚ÃYJÛ¶W›!®–…ÕÀÃ6'”=÷W‰2nâòÞÃüÜaø·~äSK7š†ûw]n²Nvídqu ‹“\ …¦õÉtòÆÅÙâæF%!‡.ê³ ~IæS‘fÖ‰³) .–sU2íD±PoLCÎFdwUúvÑõÓ& Fj˜€&“u»†'2Ç…T¢x.ê ÍŒlŒÌžÁ—ÌççÓ,Ôö (M†.˜©@F°}ˆC½É®[€È$"š•ˆ"¢¨@λޟ€Lˆ©‰íÒ¬Q™²™ÕêЍªú@ ¢P€‘@j­i|€d©A«iÍB ’K^ra´À¬(j†ŽÀXU¡˜ƒ\Ô¹¦îæè´¿qðncÅ¡© NL 2yÜ1ÎHUŽYÅv7dÙ÷©&¹Lµdt䤈÷~)ÂOž<½è–¦(nòÆRYž\3;ëœ\Çrä‡gž¹ùÌê辿xs}ö3ÿKmx%ŒÛaˆÓÓ‹‰r{5ˆß–#‘Kaœ0ÃÌ/–ýt_‹"t¸bžßܤ“ùüF?>QêWïöx(`!ÿöÝ‹W^UÕ+‚ä‘.·[•±X!¢y8Þ<³|úß{é…'|ƒjüþã_úèg^‰þª³áÉ·º×õã³kÌs9¿¾õÕôÑ×N­ÜËÛ§KŸO·ßÝ\¨Mk‡n“übuzÜÖã”ÜÝ{‡úé¢Ï}á傚'W×Ëf“û´èæÜuScÐÕÊÍ/“¸I3ο÷Ý‘íѰAÇ­«Ðâv./ÛÖç‰9ßzæÆùå£Ùü¸ Ež]›»EÛ,Úî¸C œÄ/¯}ô‡Ÿò$'Ç‹o½ñµË3F+ªý8Þº¾"ïŠØåö|èó8ÎÇ"± Ç«Æ7VúäÈcu ¨ô„¦haR³‘ œs`CúÈGžÉ–Ï·ëß~ãMoxãäxyã›õ#"säYIÌy(«S^,g1¼D¼¡vBuBŽ } T…¢\Ñ€¹Äd±PÈ#p Á˜Y-hˆ¨¨ ¹ì³wEñ> @÷M¿•ÖaÊBÄj`H̾”< "1ùœ2³kCP˜²*2ICR@ &*bÙ•,@$hÔ™¢sÊTˆÑ BÖb"Αs5«Ò|  $f¥ÆG«"@ªO^Sóì+HV³ÇªþªÌ`‡|·¦‰)%ïjJŸ*¢‘GDØ/+! š©‚j|2ª‰z Ï\ÀêN²’™A.˜3z3$)N³›6©ãÔ¹¢¤èAUˆÌ‘Â.î$BFcÇf*`V¸SU6ê\4Q- V96sà™/›O¤Î€™U43!"xäè ™dSì‹AQ;>š÷WÆíÙG?ôâéª]ñüüÔÏ|áïüÏŸýÔëöÇÿíek ¼kad,­§‚ÉÄ®$1@ N•È·½eµäòtëdVd³n Í›Ó>Ï•SJv³4hpaÞ†íú „f~’ˆÐO“±[,æ3sg'§·J€Ìæ’ªcÆíÑ|–#õê›8ßl§yÓ%01Ô¾ôʨŽçËyï]ôîu~VUçÇK’Ééô9rÿ"ë8¥Á5>d™æÍ —34ãÀD4 %a2Åþ¢§`B|éseZ9k¸lKR£Là œ¡1¨"ÔŒ4Ó,‰ËctlˆÍl.ˆÆÚIÁܨ=:oSCp˜™XJjš¨`ß¾÷žiˆ˜ÎÞ÷³HYÿôŸþS·žðh(……gw¯®þëÿþ'¿ø+_¹ûîð}/½ðïþ™ÿܾlZÞÝú­ÉXú~¼óÞ] ?MùìüÁïÞ?›‚ï‡éÂPÀBlѱ‡fýèâ·¾ñ{³'®¿ûðlœÓòäÉÜ­p*´=ÛGô쀙ÑO¡³íp?„&Æ¡é¨ä)!µÞ iJ~›Æ©E-EÀ z¬Û}¥µ\“»Á”‘Ø¿O;ô[¥±¶,pÀðp%#ÔðOÓ* Vÿ=ˆ¦ Lª`€ÌìLED¤ìDæcÑÔ ¼÷YËŽø©ºÊõý£;ŒMH)U XÎR‘J¶fíٌɕ"û¡-èŸ{¾ÿïÚ©2¸#¦?.ážÚYTØyI´HÍuÛu«Ë•€A…Ðê„ ƒ–¦k‡©¿ýÝ·ž¾~²Ù\}ß'^œ/¶VÞ½þ×óÑ£õ­åÓ¹”I‰·S.•åK¨Ñó0M5–Ö9çµr#Œä½!(RQ-f`Fc*´íc¢ ´ìfŠG°h‰h{ã¦ÿµo¾ùñŸžÃ¯ýæ·>þɼtšÍé·¾õΣsíºëÆÓ¤ù»W7O®G€´^çq[$C9¿tÞQžÎQš‡ÎÚÅòìÞ2L[•mÎýF cËAœkf͸yøÄj*_÷^ŒÑ7˜±›ÏèLÛYÉé\úËaÞ´³.´4Í£¡ÑÉÀB˜/ºëGsU%ï.×Ë.t2–tþ —1g³ùòhåRJ„®Îkp "ÂŽXì´è`¨ìË /ÞL›íöòbsyÞE|âdyýh)%m·[Qe»uÃÿð×ÿê“Ïzo©Lç'ûØGÚE̼cßE&1c®‰ë@€ F;ò†ˆ„Ƀt·7®ÖÝA>ù·Y| ¸GèT…Ù©ªšbQ-´' Úžì×÷=£ï2vÒÔ ª‘ª†Èš$"Û¡cÍÐ@‰Ñ™!!˜*0:Ø“dW+3b³š7ÿÁ·}PrÔ*¶ä\Aº;rÏŽb,‡w~øÙ]ö›¨ù=ÛË9‡dΉÊ~ Uï¦ïÿ53›¦ Uëº\U•ˆ(×Yîæ\õ{¡š0µO–tjjàœë§C;Å*vÇ4C$tHH†H"‘ 0¥Tª(Œ|Ç®¨L&ë½tãɓӰýÉ¿ü—¼õÎ ×®ýg?ñïܼv$¹×Ò÷99‚àcNÍ‚scN{Ö—’TPŒŒ1„Æ#Õ¿€à M4„úÚFÆ$¹4‘C€Q7®ˆà Ôj@´pØ^´»wç|ÌÜ/UĻދŸ˜i½íuÛ&¢)†èÐ,8¶à(¸«Íå0lÛØ½ô\|ê))¯.Ög®úmù!øŽï­þÈOºàVÄ6"q*™ˆú4¨gš-–ÛË $hY›m/ñ„lT˜ăÑl63Pb½ùìé»ï½ ÚÆ¬h–`F `’zj\KLY$(CÑ•¤:sÅ+:±Á —È©8.ÔJ™@²HVÒdÀ!¨aìâ´ÝF|™ú³÷T5„b|å¸ûñßwþ?zðp€ŒÕÊC…|:wÇݬHÚnüë¶:¾v}R1›Bt9'd m`O"¢àÊv Åß½ýÿÒön1š]Ùyغì½Ïå¿UUwWw³I6É&‡šáÜÇ3šŒÆ±¥HŠJlÈplâ‡$F"äÁFD1!#m!–#Ž`¿X‘aÙ±KQ,;X#Ysáp†3äôðÒM²oÕ—ªúo眽÷Z+ûÿÿ.R¢yðya,þ—Sg¯½ö÷}ëûŽþî?¹þò7ïÝ?ª¾1K†Q€bŸ fHNÂÈO÷ÛvR¯nÞ|xï¡ô13Ä”,„cp°÷ü צ‘arHž… hBèsF披! ˜Z(×ίp·ªwŠ÷Rã¶’”M9F“°%• ´@)™LÀÀ,oŸ}3‰) 3#¹MYD$¢ÀL <Ö '±2ï°k€˜9AÎ)xذÉàKQ> æœUĹš™‹òªóöVjÀÆï«ˆ\œãbþXà}"‘’jfì z,›ý£¼;mC/š¦>@Ž@ù·^»ñî§÷V«áâù±³Þ }ù•oYÕÞxpô÷í«ëžŸ8HË·›à“‘ŽÇåç]3ȉ¯B·ZWØ;"jÛv½^iaÇÊXnÎ*GD ¾–„DMN,F“&ZRFªíB€ÛïÝóçÏí;¢îb×¥øh1ÿÖ+×».¦(U5ÚoÃ…ýÙå‹ûu½„c$"R$3f|s.9”ªJ ²qå ¤Z?YD Q X=zËèQU ¤7¤Y™½)@¶\ìX6ÓÌ YЈ!«”t>C#™n^Ê×u‘|•.d÷·Ø®ÝßÈy#²Ò æÒ\ä\,‰À™~ËL‹ðì1Yƒ³Ùl×$i IÕI¡F‘D“"’ˆÆ U£!¨);SÐ,½ ¨É6æÐ@Hˆ®@SZ†õ* RË¢¦ jT\°$ ÇO\>xöÙ§[’ÿí/ÿOo|óUíû?ñG~lü™Mœ 'wóñ¶mç«EÓSVæ™Ùºò×Ë’S2ç¢ÉàiEé$¯}@"U5Ä,=j«l6™MQpmQЍÈÄTíÎ=::­}PÐU?Å•w+²I·WÍjðó¤}ÕØ„Œñ\å$C=.V¾®¡O¢B;!‚â'Î=‘ïÞtÿÁ7Þ‘vïÜÓÏ]þȵߥø×÷×脲sºZBFˇsXG`‚œ³€P ša¹J“>±@­4bY,:ÁÄ“ªaçú´N«áâ¹ý{ïÞ\A6ËVo8šs‡¤’CUQƒѬGXÉ<çÍ*‰°?kCŸÌ€kàÚÔåªö>YRföÏ?ÿ|Ë<†@CöÕÌÈDdÕã£ÓGçö§w×°ªxÊ8’œ9Í—M3ÍU›$.2ŠwIrGÐQê54! & ’tÝz–!^ÚŸ^™NïÔËu˜(>ʘ“.)»Œžœ±k¼±b~TÃdRMÔÅeZ%ðÁ“÷Z_¤ÅÉC™4ÈÊŒDdyÃÝnPD&n|Uð>v[äÏÚ"}€Š>ks¾kSÊÜHù1g-J,2(nÆ >xUËCtÞ#b–Í(,lgðL û¾—¤7­"–:µÃfŒ¥ª|9ŒIÊèœïc€2¿TrTðàƒÙæžz|m+|@KD¸ƒrÊŸRÕ MwëbëýÕc¥mVÉ+çC:$P+v IÔm+"Dcƒ:¨*ÔèÁŒXHˆ™L…·+k6CS$*1G†€j¢ªjXyE!"ù³/=ë½|éý½¿ý7þÚgžùðù¡??¥áf[óÉÑýÃs{§óõòtå½w¨èšsSOÈSÊÝ0t!„ªª*vë>"b–ì¨b#ª*5H¢’âà•˜¹b=]ß§¨]ž\8ˆ ã6,ûáÆ[ïüƛߨ°ùØG®Õ•sLûPÃbþÈ9ˆCZÄSÌ­*¬W±9ç8v«Q]1Žª¢’ã(„>‹™¨æ¨‰(¬VË[³—f‡t±ýwô®^M›ëz¸¿÷ëûä_º(Tä5wCAØ¥!ƒ”Ó²šê k4g N–@™P½Ö“Ð zûäÖewy\d[Åì]ÀÜä4€)©Y64„\Á²ï@Œbêª),ÞK*ÙiqY Æ“ÑiŸPkŠ™RÎ:$ëÁCg‰”ûµ¥÷…ùÚÎŒÁ¤ÐÈa’jŸbn\ƒJŽâ}«ˆÒ4™5¡jÀ‹$ÒìU3±«'UN1C1IÙ5¦}mчÉIïNÂÁÕ½T»Z†Ž bT$·ˆ)0€9ɬòavaGÐ'I9*¬ÑaT¨›izt‡ž|’X€T,:š¦<„Pcó½ANÕ`bVP°ï©ìø@‘¸,os@–U2’ªdÊÑ#º\òŠ*†Ìž!™™ùrZÈ Í‚'B‰…(Ýø™9CÛ$ÖV,ºÑâíH"ò@7ÚU&ofI„\‘È©”„9@UrìÌ,8Ó´DÜÄ[=–ß²„YÈ€§ ŒK†‰!0sÑ‚¥%¡Â§$u}1 !«¨äHŽÁÉ…|ÓºGîŸqUÏ׫Ð=\ÌOÏ×5&Á¦yëî¯~ã5›ã%çXÖ5ÄÔ7^»|NiüÖÍ·ó·OîÝ»õÞ½_xíuD›8ÂÙ¨½ñíçÆåd’R;C>zúâ3§§æªs\YæÍ¹ƒu3fÚŸ.ÎïÍb/T]BˆäNïM ­' C™Ã¦ï’(†àÙ¥ýéÍ#û¶ í Ñ|oôÄ:âåxySô™”*R5 ¨ÓÉ9Ò¯ópª ÓâäyW7ºÄ!ÚH©"j‡î¸iêgqÅ)sôÈè!:$Ÿ“«Â¤/ÇýúB¿n¸¾?ã &îz2JÀâg3ïÙu2Ûáüx9ÝO®M}ÉpÙk¿N<_IÃTàþ¬®÷üxõ¡_:<œ{l_{õ­Ã§.Ïë÷ÞëçzûîÉÑI}ýö"tùÒùýóOÔm—÷zÔ¾G9 œ„ÑùéþzÝŸ·³¦ Ö©ïEËÞqU¹¦â*…h˜KԥǪœ¯©Ë„nPèÉÕ£æÚÁôêáä½{§×ߺ3ôùÖ]W=ótÕîcè–·NCœÔ¥•Aœ VkVU­7¦ BD9m¬ÿŒ¬X»š¡ £ª¨%%62"Øž+¶ÒNDT$$MX´2%™ª”pº€‘6Š‘ )ÉeÌ%¨d@3T+#mbNQqƒD™‰úhÅ.Ôˆ0çHLPmìk-£ 8@`5"CT+z—Ì`fNJ`õ¨HÄ¶É“Ú ¿m ŠV S$¨…"g¢¸%O0™"R‘ÞT’ UÃ#«×@óÔ'î„û+b¬Ñšh."ßXà$&D$%0§ȹœ³" ÃÜIdF$6ÝÌ7åòRôV™™"˜‚¡‰$4òäÅÁº_ó¥½ñ¨ª&Mý/þé¯ü•ÿö¿úààþë?ú©_ ~Õ÷wÚ¢©™Ž)s[Uª„n=$³ÁW^]LYÌÌÕ ¤$ºì5«!Sp\÷ë¡®6ãœÍa4J– æ(ó<ôU˜Žž}æîñÉǧï¼}÷·¿òµO|ö³ÿáÛ{ê<½÷]Ï%ó˜À0·qÙ¥½ñZlï ñÞõ}ß§ r/ƒ[s2±¢×¼gbËýbÊ¢„õ1`Ë?‰=¾úµ×~û¯å·^ù«ýþUõ ‰ÑCOm=Ñ ä]ŸOhq¬"€JŒ€9 ¨A6HC‚m:(G¹ûîxo<;7ísÂÊk5d2Ô⬠.À`XuCìÀˆÉYF`¦à$%TCC*uÕ ŠpŒ˜UÜ€|ëôäÊå§pT“»ˆu¨ðªªý² ·©ªB´AbÍŽ™ØÑÐg3@ôL b)eD¨CÛw+"ò¾‰²2! ¡].ú¾#gŽdÐÜJ–£·B¨Ûࢬ†AÂl­\Îsç}®æm£Î‘#ÈÑÚªï$9‹›©çœW×µè ª¢› ž2d(Y^¿þæ½£5Ò¸ZM.lZ76$ˆq“v‡;3;ï}x<ç‚Û9…¬fH¨jn37ª=19O9Gç$›ê¦ Ÿå%ËJܱ¨ge°5PÿÀ¿üÝ/s䢵³6Å´]Éi£8A,UÚ)0|à“”F q l0±*œYãôþ±d8ƒÎîâ‚î>Æãϼå¢LÍÔˆ#{©  ç@c£üA]Íû.æÛÌ ¸Á½9gÍFäUvªÛb'Mh1R±mÈL¢Â מ¾tùÂøë¿þ«?ûóËeù³òOÿõŸþ)Nk‰‹xrƒ'U &C.U(„àç¬fš°DS_Àžu?bS$ïÁ(­Ó¤ª öŽ¡Ã`}X`i^ýÞ­·o}oòbzâÙ+W?ó‘—þøS?¹×¼uý[ï¾öÊßüÒ‡fûSUJ„žÉµ‡O7”³®j^,Ž'-r*S0u[/N—4D‡\5È ’Öì¬ÂÚ9Zw}ZEWß»±@³¯~õ׿ó`ý­oß´TÿÞŸCø~ûæLM«Þyßu H½:fdFØ3dAÀ6Õ1F@',`hˆYÁ ïûþAïZ¿ºdŠ„ÔTÚý£’ÁÖ…SEJ Ÿ¨¡ç ?«©! €Øƒ2*מ÷h±ë{ª8¤^õÍwßýÔKÏ,UÏk–œ”+Ö«>e@¡¬"¦¡a*Y 9jΤ Ž™÷¤™UeÌ€Š š#&ân˜;ç™#yg0 µæ. †õº"_õD\ÕQ(KåÉ×öH†  gM5 Ân#‘!DTîî&@­ Ž+U15CðÄÒº+ùòïK¾6säp1BG f\)ÍGáAEy³yÔu½Û°5—†B¶±vfdY=’%¡~ ì¬Öw¬ÊNa·£{w-HéZàýü·™Yqµ£n=EÎòJºý5FrETæë23!¤œ‹²nƒcÑáJ1FIéíwnÞ;^ÍfûMhÝÄUêØ‘Úv¹Ö¹¿ûàáo¾Ù´3ªmbUუ[מ9|ñùkÇ÷Œëñú$q‚Y=FäTa4AFŶCìû%n¬î3"± BGDÞ5 ÎO“ßçÃxµœ!WÞËÚÑlµê¹ª}墤åêÄ92©S?ø*÷ý<õáéÑ´´<]äõ:¯±§ù»Ço)vî›/ÿ–ù΃"r?$~ëæÝìÄ»Ã7oλ‹ØB­Ó"†Qe©YÇÕ^}a~U×S"‡ZÅÖ*8m‡èG{çëfâTÁû&›±gï,å\øøR¸‹ÂÆ{¿îiã7ƒ%ÐÇH0yfÈ]Έ b?·¼v¤‡c‡éù«Wªkã»G÷Þ¹µ|û‡Ž'Ç÷Wýêôä~ýö›Ë‘çé¤~âÊ¡7àê™ÂàÚq]lÂGÓZU“äÔKïœóÁ11˜jŒÙ,¨@]åfƒÜU!_:׌F“!Zäc³}Æ5›ó¦l¶Iµå­ä“yvï÷,ÊfŠ3Sd *`Š„N¥<ظ[µØzñL¨ïYvJÇ·ŒßKWUC@*¬·ÖÿÏßD>39À!µ-s´ëvý˦­AÚ'¿ÚF@ö¾¥º»WøÖð~*ì¨"Sf‡H¦V*‡ª®ãÀ#§ªÌ\’ ñwB{LU£Bù]s…“aòÎQÎë]ÛWÞ <“™šA–ŒÈŠ–÷xêÉÇwnÿõÿå¯>üÞ÷~ô¥Ï|ú£já¾ô½·&Ô¶)bÉž*½”:Ç}·.ܢ*‡,æ|V0CjjAÍi Pª±ªFª4€wÌäÃÓÏ?õ_üý—>ÿyôûo¿õ÷ÿæÏ¿úòwœìŸ»píÅkOŸŸ:4\u“ʳêâøÁɃ^ÆM]ùÑhZÌ"cœsƒJªÊy25A0Ä*´1 ±GJ…jZ…q5 ÏÍï?yþàÓ?ñÃÿÕ_ø†Åéïz×?x}ý%ã£ެ?yH‚÷—GWsè"4X©%$%3¨Bˆ1¶m»V”ͳ†¦99z -sf^Šy”I+ÚƒeË   )«'€È`Éœ÷Æm—[AŸÉ9à±FerUÓúØ¥…‘‹«%8°Þш9*4 €é:)„ ɨ d°: ˜/¸_ªfu²ÖT)¤”ª& òÌN„‘=ƒ¥œ˜A´´K § 5€SvÁ„Ô*ÆŠÅ ‚†>Ũu¨ú“ùˆ9© ¯¹ÞÇŸû¥Ÿ7åÙ…V½ Qåëÿà/þÜß;<¨² @®©ü¤ ŸüðL[¿¿79wa:Or8n.]Ú·°VÇóE3šŽf¾­ªª:yp‹8µ¦QjÖÕb9ª&}‚ Ò:vj‰k¥Ø×`R×dÝ*ÝaÓ(A˜3™’ p ÆÈÀ„†H kWƒ¢‘–“»Íþª[1(X©Uj@f ,åÄŽúaU7íãÿ$¢â3[4n!„¸½Pg"ß6­ltõ›ðCÚÚõœE/±ªª2‹»Ñ“1xÜM€¬Î3çþÑ«{3YÊ%3/Ø39Æm;vä*Ÿ›~9¿÷`Ѹ2½Jh!ø>§.J'Ö 95êF=^˜¬;ùÅ_ú?â_ú苟ûì',bªP1Ù÷n|îsŸ»}çŽjØ$>ÂûÁ²‰ö}_Ö`‰wñÅ@}»šr4V3³DtÆnx›–²Ë{‚­ìÃÌbŒ!Ü ÷Š: C2²¬–%íÞ.tI·n§ VêC¡)×ù3ãìÊݼΙ4Úò¿«j\uëpºU€Íiy)Tͪ–ÙåðÅ&·Ãl%äοOÉï¿B"ë¾Ä ëûѹsóÕÒT)ø<èÎT¥ëÖÎ9çœIaRÐ{Š)áfPD#ƒw\°ŠeÍR¾ZYÂÛ–£0X©«4_{â\Pùùÿñ¯|ýŸþÖüüÉŸøcϵÔëêÖ¤’œÄù="Ji0³ºE€!æ!8cÉt:WgÚ ){ö~½u1>ªÙ¨õýàë§oÝùÿûÕ“¡£ýÕ«ÑGVXãb±WÛpšON–¿ôËçŸûÝë?÷…O½~çÝŸýï~æ/ýôÉÛ°vR™YD†PÆùÒÅ9¯=Õ)¥€Ø¶-¢Åœëº¶!CRF$vä\PÕ>°5Âî—˃‹W Ô£ªªÖÁ-†nÈÑ5Î7ßWüÜ÷ÙT5+aL‘ úõàÈgI ˆID£sÆ ÂÔļZ[¹™Q =fMɸš6½uE“z5”͂˨Lrɾ¦‚î¡Ó<‚©è€èGGF"2” ¼«x2ŠWIX'ÓŠGaÝÍ«Æ=”ïºjR5“~¨ºttꦣq[h:Y¦/¿rè"-»G‰Oé™ýö¿ù¯êÒ“e¿üs?ó¿8²[tF‚ûãÑg>üŸÿ³?yzüÆ­{ï~øÃŸR…qÕt} ê!¦°–Äb¨× B5^D˜5£8vè}@ÈĵCÐ &H„H™i#óŽsTpÎ9R`vèJ®ƒ$c«/ ªf”bZd"!83óÛ|ð²”7È+–ª¤›1ÝÃé®Ùñù®Õ(E°øgœí?v:üÇÃ¥€ºó`à]¸.©‰i uÚE?îTÎòÜgû³?ÓÖv–6 (þw"É»ê_tø¯¿q÷;¯]_ö’b>~p|üàþËíWöšqÛøO\»ò‰O¾XϦÀ-p\ú~ù>õ¡'ÎÕusX{‹;}óKÿàKãÿíÿüÇ?ü¬Ã;7V¬‡¤DÀ%éB˜ª]¿uöÓlñj-™{ˆ ¤Ô‡Õ U‰Û]ÇT 7É|€elq뫆à¬|Í÷‹i ‰:f!"g˜$•$ c.ó  [Ÿn1f#:7ôx²S2ÔèWô&¨iÊžÔÐåì@ Yõ4'¢P·µ™„ê‡uN^ýÒ?ûúË_þ®u5ë–6\¸úÌóÏ^©`¢sι¨˜ÑÙ;3Ë’³wS0WWã,+@i‚¯*—qÕìÓÇ>}mrnÿÞín´_½þ›Z¢ðë¯gí/Î&ŒÏ=}ÕyhOæÞ»ªò¡vÓºæq¸p0‰}¼ÿàNí8´£l¤b¦ä‡>;ç䡼ðfäÛW¿sýèÁ£ùâ'>\½wóµÏ~êÓÿèþêg?ñ…Ú×6˜)næÌ?ø<ŸåKÏWZÒö‘D@²ˆ[[DNï_€»#D9?ì8D4ÇÀ ÃɱšÙnÕ•_>³ Íd“SMïÈÝuÌåãÁ–‚ßq•VÃ9‡ »go7?œ³bÑnÙ ’Z^v÷úZRÒ·o±í{dwÇ ù{¶ì>˜ŠhL³•¾‡ i6Ä\úP !X†œ¥Ëâ¼/wS-{‡(–óà¹RÝÈ]¶–-å±Î·nXÏ/L¯^8ÿýÂ/ýŸ¿øÏÇÿåŸùÓ‡ûœ‡“–M¸‹Ù7 dsŽœkV«•¿ùF …–kf  M]/""i[¾4eRÜüaYŸ¾òÕÕ{«à²õ«ayrõ™§þÔgÿÀ?þå/íïe£a´×ˆe†FƌХ˜£…༯›ïcî¶Ó…ˆã@1¢0r£ªÄˆŒFf`¨äœc&"šN§Ã0tëþüÁ>BÝ6!DJÒ»ÆcóØ â÷r}ŸýÇ3 xÚ÷§Ë:´i9{º^L©" •T§a 34Þ}ª* Û6‹åÕð rŽ€â*†J³ ›âP"× 4)8ðëºYõfʦIˆXÕB`Ò$¢UÝ®yÅ “ñìÚµgoÝyo‘Rrìxo8=¥¦cŠ@·šYûì³:?ÞwMMŽ»(Ž×ãÙáõï®\¾X7rï-Ñz¾XÎ.Lå$žŸwÚ¯Bšw¶ŸLÎ?<êÚQ3[,V!çûúÅdƒ *uW÷ï¯s=ÙïŒæ ngE >$Ps€ãvR¹0ªFFˆ „à@ A}áP@ËA€½§’— °ë?t—"ëK„ƒ™•ßM6•ë¬ÒÀv`FéKš¦‰9•š¸ÁlýæßÏdŸ=]åœcŒ—/_~ªæ ëG“Ù9Ö¸öIWËnïÑéúê…ó³ý `yˆi<‡¼ÍÓ;S°¨§ó¥õñéíÃ=ú ?ýçÿà?zLÀµ9BÝLªª2/åY-ßów¶h;Õ° bq~ýàæMeؘ$!"™•éc1³’ÏèlãöÝUÀ È3lÇ M¡õ•˜n&!§œS”&Œrʼ  .ÌOã–TMσzaÉȳft5¥”>}çö+ òÜS—ž¼¸?áúd½ÄÅlo‚H†Ÿ{òÜt׫£ã“óå€D£=pDÎWu+«ãiš­ ¸N?ü¡§nܾóå/¿<›Lëjïèîü­ïÝê×Pñ8±¦$ÁIìƒm •y"Â--ûVwifèȱþï É ð1.x‡pÎ…ÊK!"2©eÍI„1ªˆ)osz›¦)ïÅÎÙ¶k/ Þd>Ô?Óñìúø³JÕmZx÷ø7¯Á¢¿2@%6Dcòf÷¿¢eWÊRݲ+5»ƒÍî­sÎ¥çÎ9'Ö¤VUÕIȱi,ý3‹dUõäÉ ;ÄM'ˆd6ð®VɆ@\Fq°¬Ø 9ƒtÃÃg®^¢¿öËÿäïüÏëÏüûÿáK/ëëì6äïÊ®ïmÅMÓV“/äx2Ûs=Ìï<{qÿäÎ “úèö£ΫH;F5Ëêt=¯º8‹Ú[2DÔ4—z…LÝFõØ42fI°s!0OÇr]U•cEW¬ Øû÷)xþ¯ïÓ¬f„Œ-§Ä Q0“{Vˆ¾å>.`•˜ò:­0ƒj@Ã~H“@õ¨ÍžúÓ9HÄeyPó`˜‰]%N1ï]2Dªö£Ù´Ó*AéE†j4{&Œ<èZ‡‡µªŠæ 5Så+“ññCk§“HaHG€Ú èý¸Žß=ytå‰ >Y¾xéü…ƒ‘÷áèæ£É¤öã¤'Æ*Ã< èÓ¼Cë÷+îb³ï×~¹WMFnîäÑ¥Ör-yý ;.æ•óš!Ř³clö/ž?ªOúX…ÚÍÕÍ9`ïjsNF^‘÷"ÔU`pj"„ÌÔ[uCEêÖ*„ê'É`"P‚ Šs:;‘¼EhI1Á˜j)FHÉÈ ÁØ$•S3¹r:ècrŽB¥œmŽ2€ž6îF(%ОPQ1ãED„œ‰Ð$#X!‡ ÁcéTÌì±zÎS±?@CV@33§`V0-C}†~cåžrFGY$IL¨V„¹98|ÜíÊß Ù{/Ùû”ººásçü»w»uŽÐ (“u  ÙªS˜ªzÅUâj¡ ç‹çž¸øèø[£Éèü¨ñàg§çÿÓŸúÏ>þÑçŽÉ AjøµWßþkŸO˜¤Cáv’ò‰3$ 6V^ÅP’T¡J¦€žƒE0C $ðffЍV6¦rw@ Ì#“ZC!é j" ,à7’¢æue*Nš€èhà„ÈÆ€²*úªñ€C``ŠY«IÓqR!B§ÉÀÌ’ 2©n ²L•°®Û”’*ò ìȠäBLƒf`¿ÊhžÐåìÝÍ£ãóûUðâÆú4ÂÓPÉå§*W ]ÿàèákßüF=U•'Ž£I2\Ò˜†<Ä>:GUU (àÚL«Êû¦îÓ<ƒç Ez7eÕ}èÙï]¿þ…ÿƒÝééñí›7îø££ÚÔ=Lwî8ÓÙø¥«—NõUcóùü»w¦“½ƒƒÃ “Ù ê‡ó~u¢FX`Ê9§4º©$ ÷Ÿ¹4úg¿öë5ÇnÿsŸúì~î‡Ì§>=rÎsŠ Œ•@ÌÄØ™™¢"£©´4 š9T*ê5CŽQ ™ÕLÅ­lÀÎû"Æ…„šQc ̈`*¤€Ä0–q[B l †jª™ˆ «lJ?#™©iVÙ€†ˆLRgÍhPòRÈ ]¶hfHƒ‰ˆæ¨âNCZ"È´e|ð)+’dÆûßϰ’¢°©IÛF\ÝÖ+U±´ÓÄ‚fŠ”Ì¢ ¦ZGðS£JàØ”05&Èê²³d T½2l:$$@B@…€µEé7C†ÞL¥Ïb }\eŠfÝ~M7¿ýö_ûK?ûÒ“OýÅÿü?zrVÇõën”¦-æ.µ¡´œ}%1àxT{¨5öb̬bhÞ»ÊzóUÖL{©*wÇ{ÑO¿òÚ·îÜxéâ“OÏÚ–d4;8üÈKóÏý,̦䭋 |¨nµÊ×m±Š]õžW0?<F—FaI|õðþ£U¬fšÂa½?—Âþ0Ì«¡ï— ‡%Á=ÄÐŽ IA“(ë ˆŠ ª‰ª 1"z‘¡OyÔNrÂ>Y:^8á0Üsâ,[dêaÆ‹›Ý÷ÕQ|ýÇzµbçÈ@·yèÄÆ&hƒi5u+dƒ†*I ,™i衇‹OÞ;ºãç,¬ôÅÔb†@fYº-9uÎÎä@¦ˆà ëzõJdÞ3ˆÐ /ipž`TWˆžÌAíâTVÐT•7l¡kƒ¤È DÓ0€¥¼X¾{ÿ‘ð‰O¾ÔŽªÕ0˜ƒ.÷ãý¬FþQ\eL¾áh›:˜Î°Z7­]2Q‰)vCZWíAZ'“¨šÔ´De:®Æ>ˆù¬~ÖVu šÖb42äa5Õ“iS;”õr‰¦@žA·$1nóÕ6«°$Y«:çr2Üàõ}_ZÕæ”â¤ÔAµ…¦ª;DÌC nG*gP@ÄÚ±ª±‹1âVb’ élfuíJx˜˜íX˜M±0ذžÛætò“%ã­ô‰6}…y IDATI‰¼ "µ7lå?Pô•Eƒæ0çÌ[”ÌàñÙh÷C…βb‡rùpÿò!d±¾ËëqÕªˆ¡ˆdvê'F¾@pUÀ.‰Ë®fÁÄÎÕ¾•n8·7»úâ•~èy„„À†ˆà•ˆ™ß»}óÚ ]š6±¯]ëÔFm‹ˆ –Q¨*D°(Úƒ#ô8hO€d†ƒ­©4#íhãã„èlíbÔÌWUÑ,! èFæÂLeòs9¶ECv»—©y*§>(ƒÓ›Y Cæ ]¶ 0d L³W&"@%)ÐúY©@/ ºÁjDË#QÎëRX|È@D1F—R†ÁTГx °ã&¶îJò!1Dò‹ùòÙ½ÃïýË×£ò¡òS‘*&pðþüÙA²«œVÆ­¹8¦e?_:]Ä æGxõ…ÃÙ…xxéêÐç7oÞþÊ×^ÍTß¿wrw±öŽ<ÙlÖ\’P=ï³àœbæ·’Ðaß®ªÏݸ<¿wø/é7^ýâ‹ÿùÏü¥]Wh}KV}ú…*8\·«½c€T€ùyf¦Ê“&1+ˆÈ¹KŒÓý ´é0§úù;:Jçö.=÷ÁƒýŠÛ©içJ³‹À¨–«JE›1U„ž00)XPé<†X‡ÉÁÞK¯ÝœMÇi³Þ‡&u©]¶©ÍUå3ÆÔöB–”l›Ø¬ˆ¡Þ{Å*çhìb) ‘ú®÷Ñ‘â =’5†z¹¸s°ûX–jçÒ£ûïûðüsÿß?€ïdûÎêÐAuö8†– Íj„€Å¸qÙ *1¹L :˜TÕ¸ò­úõ&à „zt ˜9ÖŠÅÀ âpxX¸g4`ÉÃPì¥%b@ÍZ6ªÝºë æÝPÕ!îS–ÝQœêúÑi¸wëíveãKS >IÑœAUìí[w÷öŸxòFU‡ª©/a³æ$iïÂÞhÒ¤tZ@–mê-ªs9[é®]í‰ÀbôHšs2‡8dº  ¢Qê²»|±A¹È¨ijˆO?ýÁK£üêë_I±ìïÖ¥””£p­†Dg°u ”ÂŽ1—bè¶«ÏΡ[„Ÿ™9³¢¢¯¼BQƒÁ\M”Ïê,z.Ó³ ¯¤l¶µlÞo÷l†jfæ¼#B(’ílÊxÈ–DLE„¼;ÏÝ>‡OÂN l¸èj g…ÐÜ‹ÃL†`Fçò8‹£$@-Œh¢gõǶ—ï]bO3d¤ÍzþäãOWÑ™v.0¢C•ÌÌΈ@Çž E° át1•^DrÎ]ºüØÅ ›.›nƒ©€<RJÔuôÆÍ{¯MOVÇ÷Þþƽ·[r#¬]œŒ|vv'ž²€«Ô„zoBôÈÆÉ1xÂÚ3’¢-ÓêÍÞN´Îe)ª‚†ZÄBQuð@®{6•«ÈöÞ´>[ÅŸ ì ³Š 'Ÿe(Ý´J"qD4Ä«‚œyog„Ý0™¿®8 .VE6Å\Ê@45ŽÍSѬY…ØW£DC`é:gy6©ö&u¼zùt½Ràù©pœ~ã˯5uŸW.†¢#íñ2U¥š#“ËWo°ƒ £Î&û– -=ucºKÏ>óþ»wïî _[¯RW¸_ÅÓãÖžÍfOÔÂÖ«U릊Í(ªY¸pÛèµWo^üJg¤‡¯¾úýú¡_øÌsÏ}ÿá[·pSX ½c•زòmJmE ÈHŒ¡ +„a¼ô}ï½'"3Ì©<Œê€áĆ,8”vÛ¾ûw35Pƒ!?AmÇ*Ñí'DÏ3sâp»˜00áÁl˜`’eÒ–U¤ó„lT³á…w °¼‹gñ`‚Dš·IRiÂþr΋}¨·î¬CüȶZ8?÷ÊyaGžØ#圷,© ’š¡Ñð¬¤r[rû¼3‡¤¢Ž@5ïL›Y°?úíßü¥ÿóŸNÆûçoýL9¹ÍÖ]<©pß·“zbRrNu *YÀ¨Í@Šw´Ù¬¼cP,VI „`„Þ{òŽÒ—ó·^~czùñUœ>víòãW«jܬWs…¶ #+ÄPAîŒd «Ñ üÐrFÎ4¨Jb´J;Wódu²ž\™¬:¦fŸb®u–](1iOLÎmÇ,¢•Ò÷Û¯ZP´ª‚S+90—’‚¯bÍÄ7®]®v÷¥ï]ìʳï{â}Oƒ³·Þü P¿Ãú£€ÁUSœ©8ª¨Æfb Ò) rŠvæÌ@@™{ÝàÁ#Œè ëÁ…ŠˆG,¥¨0*9ÅJ‘Á*Ü((ê©K+ qÇPBUÑ¢=¢u®¡Bv'’šGÚí¸ft°ÿxÿOÿøÿ·¿ðËö]³¯¡eߦ~í#Zî^üƒ¯½øÂ· T{£:Zyòý½yxò‡ùäGŸºÂy|!îÞËëâ«Y_A¶ÍÄG“¸ÖY¯cXß5U{|º9>%×€FjÕG¿²9“zŽÆxš}è‚où;èú2Žç·.M÷~ä‡>xÿø•S],- ú(Ðø±IŸrAb dâJ!T,(ý¨šmú ´)´ }5ÄÁ¨Gšas•ý&Ft… ˆ‘KJC7æP:á¹lÓ\íTÍO}©|¤”:åœK@$FÆœs@è•^r2­¢#UC 1ÆíÓJc39[Ì‘”Ͱúqp^Eð Yg°²!£œ‘‰0Q5P2oh`ªhFHÎ9± fƸ}èŠ#•è°+ÙÅP¤w ¡Ê}„Ï~ëdZ5Ø./Ìæ=…ÃÍ£W'Æ ¼°eÖ´ö.ø¯¼|tó[Ý“×v—U|}è’³qê–¡ª 8› àÞÁ!7(ñÚäB¨ºëO]l‹°®ðÞÍã½§'è»åüŽôûë´*H_ûÆÑéI>>:ŒQ:‹fÏ>óXÝÀáá¡"‘Á$ðd¿SÙ½rÈœçÚÅÍB› Ô{uÑ»ñ*-¦,ûºöjÇM#ŒFz©‰; ï®î»Àb©ŠúœzÛäÐ43³âͬMH­r˜t]êsK¨ÁAˆÖ!¶íºª)68Æ;-ä ˆ H‘9¥¾ñFbÌ®¨¡”ÒD D”¤°ã¡¾Qc0r«nÅη)så#2iÉäŒIA7Ù¹€Õˆ¨VÄd%+ âL/_t—­ÉY6ë…Oi~¸rëtóæ·®\»ÚÊþÉz9Ïën}Ú' “‘5“‘ǾPÝ–>Ä}ÁùÁÅrø™uIõ¥+£ŸüØ÷¼þÕwž}ß•·Þ|ñ+_Ú¬w©£—»ºýËÍdTrÛoƲ‡;;ÍÎô²'Y–Ô3ÚõËqoVÇomæßýÆ;·Š8 µ15ÈfàJµ< ‘‘ÕA4ÍÈš‹#.ªÌÄ‘D5‹˜·¸ÔÙ†”÷yhoEDd*Û¼‚amïØƒž·d13C.‚wY g‚@âPMen‰˜]Q æ"e8ODèÝVA˜sAD‡¡/qžÓ9Š©ED`2EP10§0à|Ä,hÙ4bCP <XNÏ !ÜèØ É ’@_ #>Xv§‘FÔ7Dw²ë 'ØŸ•,D¹”¡ÂÄŽ)*"q’’L=’Q! €DŠ÷XTØðnåí`t°¼³øïþáÿ7þ½¿üü«rú-”e—VwVyROD@è„ Ad6ÙY¯-›vEeÕÅXcáQ}òz¹>%–Øx"¬šIŸäx¾¸sóõ+W®àtfñêôñÝG˜.?óÔb½šÛê䛯^‹;{³ÝÕýU5Ce›%^ 6ýfÜ#¹j7íï­(5§ßw|w`uuþÒ­O] 4ºþ¡ï~úß<˜xßçÆ•Ë{»í[¯ösU×Ö÷O3¹R‰;DÔ¶më¦)ÅúUö>zˆ‘"2AUÅÊ×R8µ9¦:Þt¹]œ€véþúÅo|ãÚ£OýIÕç5ª ;4H"Jíð+VÀÕ1ÕÌü4ôË–•"H)]N"ìÁ³©$"PÒ®ô@ºà ¨g”M} .:Ë©OªP\ æÉ鬆4Ó>Jˆk:Îr3‚¾+»UCº¶l6ÝÈ×?ýS?yoyïŸÿî×מ–L%:¨‚õÐ+äv¤1‚ó'‹Åªo7Y0Ú­;·¤{3Ënµë'ÍlUtc}XÞß©NÚn‚_çÖ×ãõ¦­€Þ’‚f§`]ÆÔ5P‹$3&r޼˜U´3óÓIµ·7qá1™/O7%'׸œ³óÆÌìüf³™4û/¼ðÂïüÑWöïý-Á’ûe)˜Þuá¢Q¸Áp¿íaºG(` [0;cRQAÍÔB )†&7Ë9çþ 5SDï½e)²Í|aÕ-Õ2ø) [Œñ|Uqþâ¹!ÇøCl•©IŽQÕøÌ¡„‘˜Z " ÛvÄ¡ø¤þjżRÝààø•/~¡_cÙ4/}þõ~ÓV–¦ùéÝúòþÎÎÎèòÞK>‘>}ßS»{þê³×v/ï°±¾u_’¾ÉÑ+x€ ©Ï› ûãº.#îG·Íìâå«“'].!•úíO¾þô‡~ôðþ·®?ö4Åâãn›õíÓ¯~üÏìà ==Y»ÏüÁçžüÀ…“ùÒ÷µôú“?öQéoû0º¼|ñÅÏÿÐ~x6ÆÜ&Àrü­ÃW¾úNŒ»áíþt±Zk‘O|â£1÷ݯÿê/•¾^µÀ£q/Z$¡ ‚iêózMy?qáÀW³éA¼¨=ÌRDÙ—‡ 7ڑʧY^e‰qœØ)H]×UJ+j©oQsßWc_JVj"… :NV°ˆ',b²Õ$˜Zßwˆ-«D"¯€«²XuªÅqç<Ž P¹¨à „@ -“6cDÜÏ z)„P–‹²Zaß½zˆ¾Âþ¸=Y”´-%÷]W¦Sç°JºÎE]¬‘]剋{ŸøÑïŸþ™GÿÙÿñ{×o|Ïë7_ú¥O¿’íâë_ßhvý¨évöóÎ1ÎïÔÞ_8Ø!¯Qó|µþÊíönz3\{rüöý#3A'"ÀïeN·-’™Ì0¸F#±#RËE`È~BtˆçüÛbÏhdÇÙs~Ä÷L> ®ï{•2„?oí}€ál8¤ :„4=Üh3Ê ?œïóü·öð9lå [“e·-> ÔÝÐ=_ÎqËÁÓý=ÛP½!"” `K*%+¸1LÞB£ÍLd¹  ™q𹨬I•Ô¼hP¬€QáüxxÎ#‹ö«vw'Î|õÏñW~û×þÕÿøþ‹ŠVVîç¶…"U“Ñ.(Ž"KYKB<>-Ù×BЖµgeÀ¸Z­‚c¹3‡¸~ç GW.ìŽÍ~Pú´žíŒ’¼öÚU3]·–IW‚dÔLP+ªlK·ã˽×^{é_ Ãë³JV+B^HIu¸ðÌÓõgÿâ¥×n|øY)›?û±Üûæç_üýïº8ÅI:Y^ªwŽ¥äÞUÌž“šI$ç¾÷މÌòzëÜ 51VUÈ9w›M5#!©äܧ{UCo­N'£zDhm‹Eþ§ÿêþÖ§?óÿÙ¯~ÛÕû×nß!þq~‹xWR07ª1v–T;P’—‡žoAÀÂè‹uJÀ%å¾:_Z6-@^”‘À´(Z¦Ì•'CRUL‘(°9443Å €µË-Z"/Jj}•õ*íŒG`ƒšÁ†Q3ñLé§ü桼ôN×[ ê²*b¬/ŒÂwÝxtÜ{N %ÞŸqÓë×w‚?Ø›½s›¸™Œg;@”²2»f¤»u<¸î5£ngŒF¤Æ$ÅXŠ ”^Ò4ŽL±äœ¤óâP qg§•¥´Ì¹s}ŒszÞBy>äÀ9÷©O}ñoþm¯¼âÀž‰½k:ÃÆDgÿÕSÏ6š’@̪ŸâÁ¤F I­y@@À2€²ÃjØ9áËÂ9¥:¼:,ÃÞÛpúÇL¾tõçì8vˆ(Å ˜LPTÙ`BÚC_3ÃÖ:é]FÛ'EPÈÁcßnŽî¼Ý.6uƒÎÏî]8˜É²÷ˆ¼óÍÁÁªBÎÀÞ9œ´·‘u¿9|ä±'wÆØåûm×dzÀ àÄü0÷Áráˆ7œ‹¥QŒYtüááúðäh“­…q%\–Ëêþ·ç§kÏWEG©‡ày2ÆÉ^îž.±Š¤­s´ÉW®ì±Ó‹—¦©Ÿoô¨¾²cë™;yåæÿð³}>$Øñû?ýÂg»¼,1Ї¾ï{»þáz¾Ñ¯½úÖºÏÏ=÷Œs²ž/rÇ]iïÜ=½{wS¨ooŸ®NR>ú×>é$}ú·¿pt’b›"UÓ3w‹õIŠ'_ &;“Q]ûXÃ3O_*ë¥'i—}œì‚ŸTµ§@}ß+BU×Ä¡©³¬ˆ:]ÎÅÀÄrðNd°WòŒDfçg€8<‰ÌÌÔܰüF@c$òÞkV³¤%ïLªIefªv÷øty:ßiâñ“qÓŒº¼P£lpº\ƒ‹@N»ÊÑ^uJiÕÝ?‚ã?yç}îf›n®7Eï,ôÞaâ[paozqwowû;§ÞÍcCÓéôÙÇ®ŸÌ7ˆüÊÍ×N6KAòÄe°¯ø6ÁÓȽ{(Ú ›@þ$00C"2Øt~<ˆ™( QD›†€îÌ@õ||R|HœQÀÒEzÎ DßszØ&Û(¾Ë×ÁÞ3È¿­g~Ëb4gŠSdX@,ƒ™1nCƒQ·³›¾ûˆ/ Õ ‰äˆGbYÄA_/f( ÌÛÉψXÅTPM‰ÈM ªðPÑLÁdmìíá™ßºÿs÷?r›;}ßGm0¢ó&snêjÕ®Ø o–E• “w ¼jÝŒsé+4yõ/ßN2½ñX½·ýÒÁ^ k»M¾w³ªqcy>Ÿ§8ÏF—µjâ&Ÿf“ú`X6§‹ÓÓžðÅOþƧ¾ñ¥¯îTÓÿä?ü©¢+Ïž‰¯_¹ ºúÔû&O>ʾº»¸o÷Ž~ëù•OÿÁÿðG®ïNŽo¿ëÓ´˜ïï„0dvâÑ™°)W±\§Ü"”’ÑÄ«E&DïÍy×0‘'¸Sëû–9ß8DZ6ƒàîÜy‡¿Ã‚â;Ä?lK=–ÔøL‚ àaˆ@HT?Ž|qÝ®™ü0fÓÙ|•rgœ‹±H¦áD`¤À’"˜•”@K/]¢ª\œ<õÈÍ] Uáã£õ;w¸d•b¥"õ}vÎMÆÇéñýcçœo#"o W1^¨ƒËír± <Ž'ÝWéɪ¾×óÅzÝv>Í7éÎÝõ¨ÙYæTÕŽ"\º~ =ß;>Ñ fÏ쳪+àšŽa±ZR„º"=–ŠL`¢Žc]Qa±Xô©õ®rÀåµFÜò¹ãÑÔ¡‹1Î&—ïÞ:¼ñÔX]235 }ï¶Oß-Fõ0 ²õ‘°3ü QÑÀÞk.¤"æ QLuëשªxÖ.ø ×Ÿ©hQU‡8Ü:<"øÉ§8ÏPxøõA}ö€Ó=ë¶=¨‡Ý(zd–"2„h?dìª C¥…škqÛ* ˆTÁ9ºyóæý·ß<˜ÔZ Y•[VWÇ“X[2Çn2™t]všáœE­Íy±Á7Þ:~þ©øÎáŠ"àxbK©‰]=øô*°n|Û®7}ûĵKo¼uüÕ—¿~||ìëÉr#Ó¯¼úóêèÞ›õèꫯ¾ºn³äúèè~ª¦*ëówOW›~ÒL˜Ëxäó&gsì´§¬ Ì»Elæ^DkÇu5)ÍÄ7滞{wÜѦŠU¯¥0nr;u©©GÑÇU[œóËå1z¥ªì°»}4?¸žþRÓ¦ƒÏ}ö8Ä~±º—Ófr}ôѿ𧻵V]ÿG_ÿò¼_ÿÈG8qEœÇñç^üÚ­»«ýëOvÒŸnNo½ñÖø9?žNBõ»¿óù/}î+ߺ¿Þ¹Ð4#/"¾Š¹”.§õz=½z56xåÊHÖ+ÏhÈ…”Jà76CU0E…r–‰‡¤˜!ñðøbÅb }׆Pyv¥df"@Ç,›îéǯÝ[.hïþ½ùtr|8Ÿ^Ù¹xQb]WÞ{Q²ñ†¨ã¸FR‚¸¬£åÑÇF×ü_þÞ玎²£]“úöqºw|ûÂÎøú¥IQ<¦ÃÃÇ÷«§o\>^û—¿Þ¾öú+ ¶j;æúÛŸÍðnøáì%%fE"@E2@=+GÐ9§2Xìœ<Ôûû1ÁYýqŽ”<ˆÚ™Ìƒ-«!1K.C.£1Ú 8p1Ó=ËrÞ•z®ö8ÿàÃzŽí3G<,!dHš3 ‚ÜTÁÓпEøî߇w«ª$Jè<;vàE2d¡‚6~(*šÁ25 ç¾ïUÕ!UDE ˜Ébþ!«öí™C¹|±ù̧ãîÛ¯ÿñ¯I\Zõ&Áy/Ù5Z¬ï!IæÈD–,%‚H•0„à]{YÏ[b`)7®îöë´û¾Q[VoÞ¹íºý&o [Z,c5ãÅâ¤A:Ýt›IM8I²zç7ÿßÿçŸü_¿üµW^gØU—ÞySwž|üîñæ‘+Ì䚺:/&|ë _/æ/}í¥Ÿùóệvñàö¬y Kn—°Z\Ô6§¶ëûv-kô•fÌ ª*8î[G¾]¤*Œú¬©Í…XÆÕXrI}ÁÕ;;ËõÊí—]÷íéb:j@äd5çæOÒ Ñ(8 ”­0#£JYx4€ Hgý@«ÃÕ@ gÓ$`SMl5·ëEa  Úw (:#QT/ªP bØ28hÑa§¦¥ ’Çãöä÷oÖ¹Êcp€cÀ½¦ºý…†²h§Ý¨ªŠó°øÙ8Çbä§vùùàßü+~ýÕÏÿü?úßÿú'>öñûÁHíºLw0ôÀ>+WŽÖ›åË÷Oo¹UÛ©Û»½_µzèe|4¿}…êû÷ï®NtÒ†ÙÞ•££õ(8§ $^‹Õ!¶Y‡ôù\Z«jmÜÝUûæÇ»ã½÷]Ÿ8£…²z9ÍÝJš]  çTE4‘snD?þѧÀVE §”رÚvœsô0ljCAPDa$D$…ÌÛ‰CU‡Ø<›¡Îm3pû¢‚‘"9 dCÈ Šä´DÌh`B Î;+bH¨ÆLTúŒLd¦Û D§I38U`g`ùülßåÍjÀDÅLó™£0­æ·Ùû…¬~ìã? u)ýææ›7}òñj2’ÜWÌpïHOî>óÌ•õéá—¾ðJU]†lBÆѲ™d5Ħ¶Œˆd–U ©+ƒ 8…¡ŸÔ ŒCT…N2û 0¸‚Vn™ÖÑ#3Uc"æG÷«P¯ï¿yo³ÞäþÊÞôôîk»;;QŸN[)›w°wL÷7¾óþî~Í|©â|èFj5%Ý»tã+_þú[¯½Ö_¬'Ó‚eo\F´\C*ßó]ïsöOþî üðSÁ²d6¬¨DlˆsBP@5QEd0Úú…ç!™)©œ!ÛÐÉHFhJ¥¨™;/;ÎeËèð)D`¦^%fÌC¨Ü IDATöÑg+gô9€*˜¨(š# ÀA³ªlç %0D€¨ˆ$[ÃŒPA L˜MHÑL¬€pÆ0¡ {G€Aßµ°Ø®”ÈD Éœè`Gæ Å ˜ö%ˆ”D‡Ç]¸<Ú™µ(#æšÂBz,9 ³b$¤(è° þòRBA$!ÌN“t`Å“43üÊ+¿ÿÉ_øM·3ó®ò§7k8YõâTz$§ ­*7#I}­±”RrÉÎ9(ÙóæÉWßxí8»MÑø¾ÇŸ~t¦Ýi”Ú–ëo¾ò²U“jÔ¶O^Û]nNƒª“Ë—Ÿzõxžq~ýžx¸»jÃ1Ÿ¬ÃF}·ùµÿõŸ|ýîéõ'>ð7þÞßÙýÈ•kRì_úõ_18H……rn—woýo?ÿó‡‹qxâÉç¯D Zñdµ¼ŸôRWÜ8Ìr’ª™a=.ëŒP].R-ÞÕNÅšUµž83êRaн“ºâQ3Íý¦ß´ ¡dÀYìðP±Ë¥–²]mæ’þäqrÛ  ”  `à£( Ùpx Iæ9î´ô  T!g„ b àLKVü-Ù;ò“ñ4õ'VÌ’(¨StµÛ™ÌÚÒ°äµ0ƦŠDB¼ÒŒ&(Q6Ù¨9È¥B`¹¶7éHT¦Ñú´xîùGÿï_ø¯Óz)ýqÆJK·:í\ìÄQ2N.Žwg]IB@$VD,xÇ•h0F®ø3_|ùãeäiézÇ=€e&ólÆžu,(jâ]L=äàÒj3©›Úñ¦6N½jM6´„ˆBŸ²HùØOü™'ž¿¦Ìméª’ßøúÿsÕ𬅷a÷PDí!ðc‹åŠž§ÖmÁŒ·¦Æ$"<øJ%ÒAaŽ(*†ÃÔ„~0FCPUOn°ê›÷¬K)‚ D1F3Í–w$SÝÞIçwã…À†ƒaÝvúÞØ‘‚CDçRÉ{;³k>òò×îåÅìÊåº4Þ™úYÜé6P,¥´±®ÃÊ‹˜ªJViû©+UжtMŽ ïf0Qn."&‚ÑØ_»¼¸02ɲ¡HîzÉc(ŒL4uÊg”„\"vy6Ž©˜í?ÿ…/OšãÅÊhs<_¼òÊk6Wm·YwÁûE+Ÿ}ñ¥½ýÙ#W/]ÚÔq,šŠ‘¢9b.6,Œ™|*Àg ëóÅ1žuP;çúÞ¼÷Þû#Qö•(9 ³¯â¤X2Eš2¶R¾ðÌ×_8Ä®ï+ÄXÔ:ƒ,Ê ( kâ (Ez5- "AëúüÖÛ÷6Ê“ ííN'£Ú1iés„!„¨ñƒ•ñ¶™b`êŒTsI}N­#¾8¥Í ärxóÎIŸF1|ëÖòÆËõàŸ„’Ñ´°žÝþ…êâîþ—_ùÒ_ÿ«?ù™¾ø_|ík/}óÑg>ÐKs÷^~쑃ѤœÞ½xp°ž¯©Tнùÿ~;øðf¢[EªmAÀì<íáÏn):oš5Ê"ˆÈCGmYªú¼³VR3¤$çâ@am Û¥ˆ aÛs0&$ï÷ UÕ-úúp«Ë»±")Ò`->Π ó¼Àƒ…Ðù±†¶òÁðÚ t2j) „¤ª(ˆ¥ž6½9Ž$– D@¡("© ¨ n èÁL‡oÌ (ª‰BŽ»v9ÇÕüÎüí×ûùf¶ÿ8Û.Ò1ûûì%d_Š2!0xÏ!R"sF"hŠM=EdU]¯ó‹/¿ý…·ðÏþ[?ðÝÏ]©Omù&AL÷ëPgçÏmèöfûyyÔçÎ bSO×R°””R·Z4GŒ÷~öÿý«?úÑÍ"q·²izé×þÕïÿê'ࣈ“Ö«Q5Z/W§ªšçë'ó£Sp¡S<œ/Cß8®™ªñ¬¦ÔW±‚’½Ù¨‚$E4ÆšYû¾ ƒÎ9$+)1;ïɯ%§61_»RÔy,æÅ5ž)NÃ…·’ùsÅÔ¬äb~sß#ƒeàÄ‚‹…1b!P´Í(ƒ×3ˆPŽnÖ4/Ö+Tƒ¶#b‚" X‡q—z(½CoZÔTÅ´Ýd¦ºä ˜G‡æôîqA-\z^Ëùjm«E¿Ê’¦1´­8ßKEUE"ÆýR>ñÏ~ãÒáÇøí›/Þ½0ìrY$ ZK M­j ÈÀ€äÁ¨(ø¦L‘©J½t¶QMËv1ï7q²ëä´Sªb¬œšµÊ…PÀ$apzí4Ôu`àÒV7.5¬i2› ‡ñîl3?YƒöÌÉyï˜Ëßš¡7ô¶ì6äv‹VŽALzS7Ø)–Rãa`ý1×ø,¯Al›]9xE 6ç“3l‘’mTlÑË­ …=ä¸z6+•R·]»ƒÐ½˜Ó°È#@av*RpÏ¡xwb§µÓõ}Ï6Tá|ÒÄ–]Ll`[ y;Ÿnw¨}&tXR!\¾vÕ7z?#­!IÕL=ûM€Ðµ* WÙó1/7£hJMUÙjÕÌ.ŽgMœE!pgÏ 1fvv÷ÆÔoQÄ”PK!(9·£ª²’ÈÌ{@ÀžrS3{DDÇ<šÄù²nÝòÎ{·NÖy5[¬î ˆÎ*Æ´aÃ"¦”b°èj{]wï¤Cl{KFd€™=)cŸR5v¨Äì5m¯Ñ`½`ö@ö{ÎîŸ_RŠq)Cƒ ©n€˜y¸T9çóлá眙¨PNN=;)fªÞÇáƒÞUL•©s4Ç6ð},û®úýk¿÷¹—ðO}¨Ûœ¾úÆ›¯Ý^*˜sþÒå«£”©*žY× ðúù£ú=°¦ˆ¤Î"¯;+ÉBÍ£YãG3?…½vÓæÅ/~úsÅSßµÎ9LZˆT‚5;ÂÁ‡¦¤îë__ÿýŸûÓÓþ»ÿþÇþ³ð?¯'w¦2 ß{°¿Ó”g¾k½öß|ëv#`ܺÔ<äUú.3v@ƒ!¦DÝ™2C†Ð €¡–Úza=l9úmËŒj,%1’xðÍœõ½Ÿü\¿Å|&«1CÜvüj02C 笠yDÔßðù¶]Æ|›dä=[IÙ“÷ÌCØ€i*H „zVZ™)B97ó8'z 8dÇCÛ,3ªxOÅLP'f' AŠ›92Åœ­÷àC%P U³¬JF°%­ÌT ÔÙÐ@KéÚÙØÞ~õæß|dïÊ8"Ãaef)íe(Øõª”MˆU5ú JòÞ{½¯7ëÞ”údßõý?ò·ÿ‡Oà…x÷þ«¯¼B‹Ó±àí®;w¼uÎaŒªSx³Yt]žŽ¦gIÙùxa¶Ût«,¸fM÷üî4|òS¿þÁ¼ÿµÏ~õþWŽf?1ž²>I—fãɼ-¡Š*Ì~¾é•²`€j‚#0‹_u+Kí&- ¯ƒlÖm§!:1»¾ïEÈŒbàRŠs,"£qÍäE$€cBç}\­7XW13TWùVû>—ÝÑ…(ÿÚ‚ûݾ³úƒs£`ÞyAo šÏ–öLŒÒ%Ø@°(˜eÈ…ÖÁO€J‘¬@ëu¬ü„ݪ]yÇ€¨iÀÑ…˜6=º Ée]+ïÔ¸™Ž«ãõíÃ…ñº[¥¬’P ‚óŠ–K›O °njä{Ýé±Ä+{.Ùþl]…‹³u*»lÏ<ñôžÿÞ8wíéâä0†K ŽCŒ@ÁsJ›&ÖPÔW^*² IúvzõëÃ%꘱ݽA½÷¸Ü›„½ £ ·ª®ïÛ5®£tUƒK]P¨d£ÌÍúöü”F~´{ñÂbíÜéa9áâËÇ™çióê Ó&.vé¥45„ êJÖ”–1iB4ä–TȦ–‹”ªnrRU ! +Š­¹ˆˆŒì½öÙT‚˜iÑ‚ˆ(J[t†Þ97x"ÐÐp@g¥lǬ™9#"B:3ð1B Cn©!ÄЀ‘‰QQÍ L€‘Ø@I¤(˜˜™™gF³`¦:Ê"¥ 6>ÈN;T54v¬ª})D¬x¾nÜÞ­4|½JpÛÍ,üÈJôÎUÎíL v%¹¯Æõ5æ X¬Ó’ý…fló{‹ÅaR«µ!¨1,Sš€,285,`¥N5äí¸ßX§IÆA!‘)÷Q'P÷99„¥¬ðd4¦´î¹Ž#Ú¤ÓºÅàå$WSr€¨f¹¥HC¡4Ê­ˆYêId°†í;=¾/£61•’¢ß­¥ó–Û¶ Ρހã&ì&]縄8Ýä[JRÕOeNèOBÃB*d!8¨@'ÎÑéñ‰gW4+eG:Ø’„*8Gj©jB'½¢:®{¨6Ù(˜wÅ‘#GÞû&T¢–â=©¡e†Vó¦×b‘&arƨÑSÛ¶'ãÉîí[ï¢déù§¯IÇÇÇo¼þ­÷ˆåp~šÄ7“Ipn6‘Š@ŸµTuhWëèCî…›¦'HhHŽQ´ Œˆ *ßA0-¤u}ü2Šävó/|AE ŒûSÝŸøn]¾tûíƒ ×šÑlöòø`…ðá'.ÿå?÷±ßúÔWß¹¤‰ÁÂ[÷ä+oÜK›2MƒŽ’1€á6DMÍÀñÖØcp5,´¶­ fÕЃêXT¶é¹ªÂC ÀÐ]ŠHà‘€2ZCpÄ$«çLó?ëˆC°"ý9Œ8ÌÌPL|€ˆ U¡:b Ù†·‘d̓”Ï"¦q¨i€ ˆÌX2XcFPË BDâQˆ”Á, qH)i>k¦cîûÞF’A)Ó@"W@b]!©ELYŒœG¥I¬—ÇK‚â¼ èŒò­@´*ªsÎø‘A*Y½sëÁ¿ø•OY¿¾ü‘ïñËM5ö‹*—Eëeñ“ªO DÁù’rÙôÕÎ.‡]³å颊³lrãñGžùà÷Û4t®ôñ«ßxåúnÍe…›.DÒLP¸]¤–÷‡Gm»¢È»•”Ö#(j·Y#GÕ±Àºœž~á‹ÿâ¿üÅoNõÙïùáM¨¤I+$—ú¨‹À¾ ;i¾2²JÜ9âYÊÒ„5¸Åb=¢| ²#ã, (±r~);á “ßô]¨½1u99çÌ`pjðÞ£︊Υ^ Ä‚…ŠgÚas%q7q³½f6xðoÿ§÷c›ÍŸ`ý!µ™IæÊÈ9ÎʹujBì8IPH¡ ‘ \J°è£eÊ딵£šÝ'Ø—A ˆè)”Ö¬0í“«b㢧RÕŠÝc^„Ó¹§Yß.;Èw:˜£ &¦ª§¥_ö(ç zòú››£Õ¿ñÁçŸ MfKR•õjµ`çÂ^I’‚ # a°¢j.‚b!"*É'ºâjí}ìñ ÓIcß×NÆ¢?nOÒñýc•ÞÊZ»Ã(§#ªBê¡[v·ԗ€!5pmÇoÞ>yíÕaý!¹ˆ Çóéˆ\í6‹ö‘æñ§®£e¢Ž ‘+ÉØ‰A‰•ò]S &K¥˜™÷¾ë:Ç‘™SJHå`·³Ð„>'V`"¼W†"u€Op(:Ζ°Ã…~XMv~õ‡uÒÖ÷·ø] àV÷n´ö|áuþâpP¨Ÿ³ö7|w¾Ôù;™é<ŠtÉ™ ":j2Ô7ñwöf"Úº¿CŒ1ƨЖ¢ª%VnºÃ)Ÿ¦Ô/¤_Ø—¾øÒǯ~7؈tã,8}Ò¶d/ˆ©˜ãôz!pƒ¿!€DZêf~¼þÆ›‡m·¢ÓÆ´FTƒbPTÕ9 tú˜Ù/,J±ù29ç¢÷}þò—¾¡šc¬—˵ƒÂ C¨]›!k5g(YRÉZDLxê‹tÓYlKqž7²Ìî4Lf艙-ô6½ÝWnEú1LÓ¢FiÝåUöMtr²1AŸVuðAR¥–³®ìÈÂZpAÔy!ÉÈÞ! 0¶ëB¤LšI‚Z&BÑä<0c_z9»ŽÎ95`ÞFì‘wì]ÒuA+*’sà ¨”C†ÛUT ±/ÙLëÑ(ÔÕdgæIÆ»£¦¯¾úúåK«åÉÛoß\/©®FW.íǪÙ,Öê’ZpjÒzÂà‚j13P-æm ¢!m9óú€²›L&´3Mm7&—%½þú›iìö÷’‹¤¶ô‰]uëÞÉÎÁ…Ç{ÄùüäóÏþîï}z³©~ægþÜ>pe³yÉÅéù­7ÜÒp6dìÝ.[çwù9‡½–3ÑaÈ^Â3-g!ÀAz/sVÁ8f0P°RŠÂYv¼ûf xNl?Tñ¾]^ Æyz-¶}?Ì&äb0\è¡aKv ÕÛæ^À¡ÝÑDˆ‘%åÚ…aº(Z»°.Bh jC³ŒúPÈ ÑÌ6¥/m}IR×# ²'íüáö'^)åÜâl8¥ª¦~Ýüê¾xu·šÖÓ@h9$Ód¨›ÜF²@¸FL@¹ž¹MÂ;ýéÉÑx'REZ&…ãÚÊ<åç¹Ðmîн{§‹£ûoÞŽeÖ’Oœ Ö'S Ám´‰EÄUR×VͪÑnãÕI’Î £/»Íº“X¥ÜæÅÉý{‡½ûÿh{ÓXÙ²ëø1­é™}¼?yíMøSßYý1<ˆ"ùIÕLrì͆}çshÆä¹®_@R k…M;ª¹D‹æb¹õž¯ÆQ eç´q!¸˜ÙU®î5W7Í]¾C¹ÕÞ} šc*õÇUãdÛð?¾t¼iæ6›Ò#åÎÕ»‰HA2Þ]¾QÉ›À­ÆÊödWÆØÈT¦Ä¶3ˆ$0³¶­›–E‡,±ëÓI”´ì;ö,$‡Ùƒ¬%«ñÉù"e@P1À1&2PgEity¾>Úk]-/¾tr9ä¶mÍ÷€ 9˜È‰ˆœiZÇÁÕUÒìRŽÉl´ýqÏ}áþzÝ7M5›M™TÓÅþ=7õâ´ª*é©#ÕŒ4‚Ë)Ù´m8Úáþdl«ûn±è»Ñ4Ûíý˜Fs†“Æ‘ÖëÞ” }ÕÐçÜ1…¶¡N¨m›¶Mßÿ \oüÇ?vÑ|ôG?õ#?úSOßêÎ^üâ4Ô¦g1¥ùÞ¬DlgÓ.çB‰Ÿ´1™Ø˜ûPùŒQUªÉ]y¤q¦%cËùƒßýŒŸ…מÿãDýñcð§>¾³úÃÏ{¶‰ DQâ6PúeÝÎ4×Á×3 nÑÀND$粃HìtÞD`Ôõj %½¥ö®†Ê‘w6Ÿ»$˜! ZUùÅyŸm=«Û¾_j®ÂÞÁù½w›6q6sk뱤j¨FY4˜)¨§×K¿ç/b2ÆôK¿ô×âÿãŸÚk[°(‰åÕ0†Pq¦²s Z9¿Z.±®¦àXŽËÏ=ÿòëoÁêádØ£ét¯î`yÎgíÚâü ŽÈC¶ŠCŠ™ÁÜÄwilÛRN"@´ê/Àå½;Ç?ü¯ªüúk_Õ”*Ö‹…ôi4~üñ;~•™Z.ë7õ3[ÎDæ›¢Šª(»Ú9côÞ;efœR‡Û¤ Ü æ‹”¤È§ŒÀÌbŒˆØ„€%ËáŠ?~+ö\i6dU°+BÙÍÝŠäE¯T€LW…µW_6D¹GÂ?|w€-l†úHtUégD…kˆ›|™Â„}Ï{F¢]›™RJ)5!âd2 Á÷ÃÙ/‰‚dòu@§¢8E #á )âÃÓó”˜bNŒ”³2€"°mPtP9†¶Á(Ãᵫõić MÈ!€ j*‰]„Z©ctÁ8Cë=ô&cŒÓKÅ\…i3©«šE/’ôŠ5‚"zGÁ‰i4Éc±ŒP-3k—g«×ß<'ru5ɉ^|á%—h™^ŸÎÏ._¹vøZUMU#k“Úɬ[ÙóÏýqÀ1ë‚&õý‹a2 š{çýgÿÍ]=xª©ökÏk DI†PU³½ùzè…qµîWëC©e‘l&³ùtÝwå @S5U%ç !‰ QÖnKUÑU4ç (åFÛ„q¹¼Å•FsJÙš¶jÚÐëàï$£_·ST­ß?ùÀÃ{§ë嚦¯Ý}“NçóùSŰuàÆ=™lSlu¥˜@ƒosŽDZUæ=¶õ¾wÕ;gúÏÿù/?ñôôÕ×Î^|þÕÿìoþW/}ýbÿŸÿí_˜ì;¶7ÇNk˜!O‡òdWç/…m@ß*2¶Myi²Š~-òÇFU»ÁÙœÏT¾…б¸œZɸ'*XEþ¦úãj(5â–º‡´mNï{4óè5º­á6V§nXTàTc3ƒR\˜Á& ZÍÌó.E‹U˜©zò9å²½lÇÁê6 ’`±ÛV D(Ù˜@ aRM.G5f•1ÃMí•ï¶ÐonsCsö=Óý·ßðdq½°q}|°ßTuS"$OV-ÕV]<è~ý_üÚ>·pÓ'ü?ø?ô‰I|𢷱r,–×—ãåòôúoþëW–í™}÷G>ÕsÓõýܧ籃Lˆì\8˜QÛþ½ÿþIôœ\üäÏþ• Ó¯î_»vóúÞ4ov뇚‡~¸ðA#¨÷Þ97¨5.ؘ48ÕRL³É´¤KårNÞ{ï\ÓRÊ#Jê ­?û[¿öÊë÷ áw?ñôík×áÏ®þX<_‡i“S§”IÄ…š’NçÎ0ÕàÏu½¾jß÷ $);t¢d€·~yˆ‘¬“+‘`‹n\ E"B/C ÚébHàaýàîÙxQe¼3Ÿ]viêšCÕ¶©ê8¼æ ÙÄ"$X­Gà6ö`¬(Ò´ù¿?÷Ÿyîó×ëöñ½Ã;³ë{GÇíþþdoÊuGÁsUS剨öáØ&“ÉÜ7íÁØÏ»ñÓïÿèGK¿ôüþjåZ4 ’Iùp¸E—pýÒÅ kÓ¨@+£kD“w¸–®ª™]X jëX?üìÓó6{%ãdzËÃeL â «ƒU3K}JXÕ ª”4µÕdq¹ºïôàøºŒD„™ÐCE%K$‘ó¨Î9"P3(”<9P`Ëk+ô‹M ˆh’DÕÌœg“bþ!_aÚølÆ4%í  œABSQ6#¦Ñ„DÐ C~Óí•1¬˜S” ŽH²™d"DB.oL!ªoE8eÛJLX®µ¦‚f,¨ ‚¦ˆ„ÄèpS¨¢éÖŽI²ð„ eQ®ÀMÕ-tU@àþå¹&F8ˆ ÉCìœå àˆH ×z# IDAT¡:çÛÕååÔOl ©Ï@ Ñd d…'C³_¿þò;Î…îò‚LçÕ5Ã”Ô -6• k2ÉÌH(ä ‚µN*{$$Ë9¸jS267%諪xç0¨&DâÀ–3(@Bjjñ¼ž¸ª­sDb0¶bVOÆè¹»v¼7次™Ð3SZ¾ïñƒkÓéáüðÖÃfO{k”Áâg>°?Ûc¥¸ŒëqèÇQùBÑ‹Œï/@±2zÂÛðÚÙ½1ƒÀæúϽÇ@/Ïù·>óå§+¬[D™ÏNö'oÜK¹98jºÅ¨©«}9U‘T„I³’æÆ¨vµxàœdVYÌ %¬B…«˜HÙGÃŒ¾ñaè;7Ÿß?ïsôÞgÁ%O´­n5׿wæ³k¿óÙß?¼}@ONNd®«Š÷¦†š$“)…ª’%G""‡‚#2¦¬ @è|xìNúôÚK 1Îvûÿù½/ øfzÐu‹¦v 70"’©‚Z¹ˆ:$D53”¬»K8š’!™jFS—@232<‚JÈ c1C“ 4ÀDh±0®ÌÔP #[´Ä™¢)äœmÇ?-ŠÔâÓS–˜H*×fÍX@ IM7Rü¤ @¼Å[U™È9Ì&¹À*FffÐ!k×`Ñ¿ȦwÈÛâ\T¡BDÌykÊ ¦äÌ!æ,`àb˜½"d ÈI«®Ž¦‘r–è9Tb£ÛæÑè•`9Ç$qHƒª03„œ²˜„¦½q|í°ö/¯/…ôBqŸÚX§µ!Øt}"¿ôk¿ùÂ[Ëù‰¿öÿÛŸ=¹üÚÁLî}þKw ±i–ÄrþÉûK/®ð÷þäÕ¿÷Ÿþõç~ë—}»´N¸7; ý£kjKƒwaR·.uº§è+\jRß\Ç9³Hwºè×–°®œ3+ ºCUñ1‡ƒêÆéâòzKèCÇÓêÎn?ñ=b5ÆüÖK/¼ùÕ_þÒ[;žÙñ>„c'0rwsZ𫣝3‘h\ Ã$Ô’Æh9çœpìÏ#…\¸·ìMcã—ÊV}ãY&M=àqÈ^.Ÿ™®n=ÉŽæ§2ÞøÔŸUýá“æÅ:®zŽ – ¬fs®}ƒQƒãu]cPÏÕ°Xƒ9C6“¶¢\[àÑGÑóqh<;ÊØ'²œæRF%[úë×ö‚Kµ×&ØÑ¤u‡.FðÞª ö榱ëÇAGàB°¶êfíƒX¾÷—ßžÞºUÖë”ÕQ2‡ih a6õùÇÞ÷_þ­Ÿî——C·¾wö`•øäb±îRŽÂ îßzòF“‡¾ïûH^DQd$çÙ;JYÆœFåhºýÊ¿mÛ6M“VcÖjUÀ”ÒMª)C¨ƒ÷¬œ²7M3 ÃÿèëŸúôvÚŒ9‰–‰…÷OÆ” @ ËJa¶iÆ.€­Ø¤Tý;áÉÎDUa›_ÕÕ®<v¬•Kö ªòfÔ°¹½† "¥ÎЭH’¹:P–Í{ $S»Êá²i•Vµ@,L\Û8\=K‰HLUÕ1HGWMÞ|xñ¥_ú•_ü¹¿¬"Y†õºcDGh¢÷¼…Í`#Âv–Rxóçßx]‡×}mè÷eQ8v7ÿ¡ªFbXw—¢ÑÌAéRwÙáW\D,)\9GÜ 5ùšJ\1d C4#ÍF Ä¢¦ª¨Ôø:IB(FKjbbfìÑT]IS‹¢YM‰P4¸˜GEÇÀŽUÄìí»ë·]µê¾:mÛ§n]ûÄ'Þ×4“,=ù`™bÊMþ°nrVvϽ²d˜HżsIÌ1î i¸ýÌäú;c?v€J(’¢‰hN9ã·ÔC¶ŒÂh¨Hª&ª¤Š}—bo³Éa!KÄ ½™Ac™Îí®%´mîËË2tÌP¹N/N'óÆ û}¢ù­ãöìþÛ¯}ý­ÕÙPχ‘üŒeÉd2Fµ"¿Úúrâ•z @„:˜îß»û€¬îÏ¢¾sÓXÍ™i&¦’¢b¦P,8°ä&nH@bÀÛÑ"  ¡Ó͉½†ã®\P$ÕìÐÙfñ~Û-»¸¢/ãMÒ8åühºSÙ”AùîküvOù.Ç@E¯´ÊzD(Œ®Rd˜9Þ [€b He±í†P ‘ôÝ^Šle°„ € ÔŠø(qwóf€`wïæ½–í l7Ž!"(?Q¶½ý¶ª 0«±‚µóVPЇPµ_{áÍßüì—Ýcßóóã§ß÷¡gý+ßxñóËÚÑÙWjBT3Š‚>öÝO¼úʽÝ(+„|óÚnEËŒ³º¹ˆQ2x‘qÙ¯Ûvê´®ë! !ZJioZKʳ¦ÍfÁzR©Ú·#¼µŸž~úS? #ÜùÞïùÿàïj^ 97.ןÿíϼøÚ«ïß¿‘—Ë£¶úä3‡-ìU2¬Ôi=®/gÏÚy5dËÈYbÕTC×÷y$€a¼÷àùJú±o\Í„)%ûzÒ6®öXepY}JvÓ ‚àôÆa»8ˆqÈCómÏÇ÷ßYýqmà!A^ õ¬r2®‚ Î9ç8ÊØušå`VÃD†˜ÁÈ#1”T‡ÝSQ8!FŒàM*`ÍŽ±d’!e`óê2€Q"‹’-÷Q4‰|·HwàÀ„èsb‚é¤Êf§1ƒDvQˆŠž;˜î¹ƒÃ[ ‘¦ÉÂÜíϘGÑ*LI8¹¿Ä![„qw9ªQÛ¥n™ÌMNï.–9¬KŽr|Ãs ¦Î}©'ÉÌ€ˆU9£Qô!0ÇaêúPuµ\.Íf¹Ë‹ËØ¬Û Öë~†-£Ëu‘íe¹\=8íß~ëä}Ï>IDŠt­ìȰý[61EõªT¸zm}dŒ¸;v“Uå E3ýÝ-éÝ@çj Rx«1F² ¶Lb?l*MÚuéÑ̶)¬9g·Ío„ÝVÕ"lÆ7eS€dFà‰AÍÈÔM¼wûÈUÃÄG7ª%Häùþùò¥×ï~ý+/üíŸûë`˜%5­OCbGì}—âÆÚUs66"2•*ÐÙr’‚æ§žz2xZ¿¾>MN=l,¯DS߯'“@‘ Õ@v7ØrtT™ÍTDlãu[õ™![Ä:IªP@2D4"V2@Á͵MÁ²©’2s•“e5fÄ¢*qÙ9Ö,*‰œ[–!p µÆäj4®¨Y­õù¯Ýû‹?úçIÅ̹“±ªj‡h1Ú@’QU, B"Gl"ŽÙ…°ÊY‚\ÞÔ؃÷Á20×*É9a7d‹†{ÝʾÕ9 À™Q˜‘ ù·Þ¹  ÓÕ2_«øaUs4alE:Ater¯Ûd²ò%ï&úD„œB@8¿ÿ`R].»iÅkËû7LÎß–‡÷º|ìÙ³á•{o.Tõà`?­—> ЉÏÈÎ!>â€A§VUÞ\ ~½Ƶ4‡ý"ÿÊÿùÙWßZÝùáû…Ÿÿ[H—m}òõ¯þI>Ió'ß×ùWÔ‘\¦>2¡GE!Ý>üôOÿ¥ý'¯}øG~ðüìãÛ7O^~5Q•,Pˆ<‚wÌbé Çqd®”¨mšuß{bD¼}ëvŽvq§‡ö]7þÁ¯üwê¦&ºwû‡<ÞÿÍú¯n9Ã8®.í||uvxãçþüG ¿¬Âtyq¿®DR×Aî¹_Ÿ­=ÖñøÚ-ã(zßùZ­ûŽ¥«ª2@uÐÅnjjª‰ÕŒÍÈ!./–ÄL¡Vn@emf7öòyï­7‚;‹ó?Í)¹=¾Cÿe€ ¦ÀN”»£BÌgã°÷Æ 3qÞRŠP$×h%@ 2€"8?=œŽ4Æq žMP:£.QÔŒ)„jèc± O–¢ê¬®‰(É&ÍÔ©40Ù²9³óÈ­ªÆ?ì\yÿÚÌt5ÄÓèê•âÕ‘W'&iÞ´“Ö-\``gRÂà]߯÷çè€f~߯µ¹{ƒv&UŒ1é°^‘Ä–G É* a2‡ª¾:¾ìÐÐÓ´Ód27[HΦÐO÷¸ÑÅ‚îßïFm2ÀÉŽ'm°Oï½sTÏ\@Q%¬Ð ór}×ÕŽ»þ ©SGN*4UÞØž:wiÙW%%®˜˜¤íìÓ <;„¬* Æj¤ÀŽ€ 2äœI!1~Œšé¶s3EE&Fƒ”ƒs%§ŠØ‰ðNgÈ\'™ÙÀŒLÍmF-¦[*¾" wT¦6%ò‚J™! +]Ž’ U7£ê]ë¦fÌaêRJH†PeÎß}ð×¾¸>=S‡chjhÍ4«³&›z+ÃÐ;Hs±—ÏÖ„À?yëÎ^89©)7”[PŠ:—­JäæÑéºží­ºŽ™ý€D¤Œª&ž ÁÌ\^dr€Ø3Z ð`­DEqŽƒ¡BÆ, ¤æD›*tqH”µFTÍJ†–‰uª`™(© ˆ#CS%+и`V‡è•«Ø»!)i@ßdøÒËobZ;—Aœj¬Šq fGË4*˜÷Á‰:ôÑ Ô=‚ÇŒ LRoµ5àDT¯è]NT±2ªªr•€‘HFɆª l µWå^²HüàÇžvj9 '˜yq:œ/.»~v¸¿êspyѯ—]|Œ(ܹƆa±LlY=æÄ•k.êæ0Ð|^» ðá]hæž2Ϫ½Ã½~}zùÔcûî$4žî¿i׎ºáÍ—^\ܾõ„ˆ×45 X‹ÑX5“œx2"æ,} ëf⇘¯ßœª²ã &¥ÓÒ°³ÌY‰Y‘ÕÌ $3L"KV‹‚C,dR²RÈÖO̶æ:ÀJ¹ÀÞoj5#ÞTº[)€™pihSH•¥‡ÅPÑ $[5‘A¢Q·¢˜¼a€"³/$Xw…€%NdËžA¤²7؆kU&ìŠh,*ˆ¼L¶®$yÛ;؆§üHɯň¼m´;Ù #bq,RP‘9阥ž5ˡ(j)³‘¯Yjß ±#£ÂíA,xªâƵÌ0³wNE”‰L“j÷ëfíœD¥Ð^{≓æw&~óWŸ{ížÿè¿óé¿ù÷ÿýÛ¾üÂgEãcwn¸ê1žêR»qŒƒaNQ4‡¦1UnæýÍ'úû?> Ÿ=|î…/|èúQ:[±‰Zbö]ìBÝ‚S?iH„­gɸp¼RÍYªc<}ûâ<ág?¤]; {ï¼òÆ+_yþ¯}yÏÅ'øCζ•öGsºFƼèî½TS,·mX\^ä(·¦<ŒqÌâÌMi•Ÿ|ö™|ßû‘ºÏ=ÿ…?~pžrfÖ0O+o6’yï=»Ò9ù>GCq¬Î»ÚyµLŒQdcðU…ÐÔr1@NÀ.2£c$(N8 i="BNcJ¦HjdÞ ›@* n$¨ZÎ EšÀûhÉÈN±Bܲ²·íô}_ØR)%âÌœÆXv©ëºtß8}—‘Ñö!ˆ©™&ÍŽåU•HÎ9°#"S•²m½çiwˆÈÆ(žƒ Äf €@øèÎW[:’ÂÛt'jTRCñ›·NhïÑî0Û¦REÊKhÊ;¸5dO†Ô=~ãè|ö~õsÝɃ4Œ9g`f)eÈY³l!" Š1†¼‰×´7õžhï}J ˆ=ÀLà”š0–)¸CboµeÉ.&MDŽE“™!°¢e§¤`Î\ÈIXÔF“œÄy€, „@8æÈ3iR À ¨* ÍŒR‘ (qÞCŒ,‹ÛtŸ[̼ŒØE 2QOHÞ9ç©iªõê¬â€°1}ÑÂSÜ^fª²»<ˆ$‘Í4¤©«’¶óÒ/‰^h¢ í=Õ£S(mø@žYD”Á{W9‘›wo?qL>ôãpzþðbÙŸ=6ާ_ñ­n±<::Ê¡rÍU‚orRRAMæÌ¡‘_w§/¿ö¯ÿð?ùÉ‚>«A%z¬YˆØ¦Ê‡Œ c;»]3;íVPU·÷C˜Íã’Úöæ·£³_ûßþÉúäA¾ÿCï{æý‡ Ýå]³˜¢ˆD_OD²Èš‡,ì!¯sŽÉ@sJ) ¡n5YõŒI¬NÆ3zÁP_œõUÕ2шàÑÀ£`6˺õu40„¶©£Ä *$»yó𻞽Á*ï^¶)úaˆ`–ù/Œ\øÆ„YÌÄÈrKx’±¾•¥Ò"·P6Wãü V ĈMŠæ¦ìœK©WtÎ2EpÌÓ6ÃØXÆ0kÝV0öóÉ”ˆÆqT'ó*IìºÌ©íOf¼NOÜ<~ÿÓ·ëÔݘ¾Ö´Mˆ}v@õÒ¼mœ@U³ ®œ%UlÕ¤™M+ð± —„5{ÂÅzå›i5®#1×M@Mm6kO.zf§UÀ… .$Uß„ÉCEäâ|}pT›!3Aíx6åË~m¢* µ]1ÞpŽ·\ B°+«¼¬ðbÔ³+;TuÇÕ¸zìö¬«“ˆllWt¼ʱª*,²8&Þá¥ïÁ\ÙþÊ«;ÂmqðˆV’³”èjm´ñW½ZI Ù6ò“7›ÏÕ—+Çn'½º«"h™©>ŠvÎ¥,JÊìDàüt8¹ŸTñ[EÄr¶$Y7-쪀$©Ö7n?5ÄpëÎS“™-;‘W_CÐ…<”IúE«ªRª–]¢1')Tô Ä„¬äÙ ):$%É*H¤€ÑDL3hJ¹ñ5"¢(æ’GŽ è¨Ì”HrB#1Q+ù] Î<; £!€’!;D$2à Z2PÃÑÑ~?¬ #"02b@E,‘>+‡RjVUÀ­”±ˆ¨¯Š;,EÅâÞÏd¦FúMç%€åRµ 0VU ’Gaöˆ–³ÄªÇnÃ1àûžNIÆ”Î'OÏ/..,[ »uÕèj=\ö¶·`àS’33«%ÇFdÎqÎcRÉ9÷}¿Z­3 ¢2Ž)]ö À8߸=[öC¶ð•¾ñÃ?ô¡‡o¼Â ö®=ÁŽ™ü–N¡P”ãDYóÆ(‘óÖnƒ‰€Á,•l#ã*Þ}øh-óN{õûèëÚ–ƒ»‡ìÖãn)ípŽ÷1&[ßÈ:± Î8Ô­kƒã0¥0=Ü[j5›ø;·Sžïå~õÆs_y¦™¸®¿øã/ŨŸxú{ª§Ú*‹·ér¹`$P2 Çx¾=qC¶7#1Â!%9T ß1+)XÔ¤ 1gP )õãƒõº/ ¤Hj\5Æ‘ªª­›¬b„ª:šL& ª¥¨ýº¾þâWÞ|ëÕ;ÇG­¯!g ¾Éù[ ì¾ÍñÕ#ha°ug+`p®;À´˜b˜©¤Õùbö8#pa$X¦TµUh™½ ¾žL®].ÏÉ7IÁ£&‚@ÊÓâ)ACÑÈ‘Èa I†aÔ=Þ¤ ‘ª.—KC0Ebç|ã4Ts°ÛÉÞ~8úä‡?ù'w?›Áœ"G¤*ǬàT5% ½#Iê@¦m ±ÃP9f&v*¶pp6ô.ø&´q5°71í†nâ5'Rä• ÞûàëqL)8T-0+±:çÌðrÑyWãØ2%CÇ  Ä€Ô¸ìJe–V çœÒÔ !œSD*Š•ïŽLêœc.—ö÷\°w›ÔîÆbº„żK·¢;¡b"’rJ™‘\å ÐDv] ½{ô´¨HTš°b§ŠD;-ßÕIUs;çƒÍF°MªP|ÄqÛ–®>üê'ژЧTî£ú(+¼š6ÃåHÞ I¿ü•—€.VÍ´©®~EeË{ÔD"ªjú”ò›÷ÎþÇÿùŸb|ÐN<…½®æÇ7¯!r xvÿìôÞ;äÁÅéež´G{89V©„k”Å5ŽãlJª©ä×0³&E ‚)U{Ëqç»a|ûÁ«{‡ï?œÏÎø‹¿ðŸ|᳿ýËÿë?YÕtZ×o'aC%CCUUTؘø3åmÖÒΆG͈˴‘‰ÈËO¾Å7²=˜9ÉF WºŽÝEz÷ÇÕ•¾ÉDùæ&ä*þa¹ŒhU5cÅŠ  lžv¸C¹Ø‹n¸ß›O´…vdC­ÅÒ´¨Åå +µ8÷ï:“÷´W**RÛF1˜îZ©o~ó»p¥ØÚÔ;J23;WöO(žëºá¸š*˜Xй”»ÓÕ̽¨æ§ÌÃ0 "Žz8NÏm5=_ž¼t|¶ßÙ̧Yú~½®oÔ µ³¶šú½tzѪ¦êòÒ£ U5€ˆ¤ÕjU·ÍÞñ‘›4CŒž™k«‰°OãÚ1Žý:‡êw¬ë½kO?û]c¼<ýê7^øÂ—fžWׯ££™ŸNír|£1?¬×—ëetI'.“ˆ¹0=hRÅ~•V¹+e ˆ™1Âè=û*¤ªfÇÞvEièëP@ß÷æUÕ‚_Ça<Ÿ¶ž];,×Ãå9Ï*F¥|óÚ¤ã·ɾåñÕP¦›ˆ®álšU±:j;»„ñ˜,% ŽôZ;é‡õy¶Œ—–"#6ÈIÆ®šîÝ»rqwº×ÎÛ––—½Ùž¡¡O7‘ó%W xÞX9_¹ÞG*€h™ã2‘®Y6TÝ0Ñ$šff¦Hªê‘=’iN¥àðì¬d{£zÑl¸¹Šûg2Ê)€)ñŽö¡ÊDhÄäTwë_Ô2n‰jš7ôÕ q Ì”˜U¤|œâážEÀ“CSs[×xUà*"vöàl±Xܸ¹ã†ûep Ö€_Ž@êÌ!VU`FÐÄŒÌØTµô®5ùô÷ÞüÔ_üA‘‡5­Hàéñõ›ÕÜêP9‚Jsбï{‘\åØΛY“`rxýñøÈ_ÿ]¯“/þÛ{?ûïÏÒ:®kœZ˜YC;mÛÉÁS|ªöúÎ×{<_×dyÌfœ2%´0åÎê}mšË¥Ö²_…ÅUªÙë7ŸÙwyœp—çæN/ÜåýÕåé_|çáÁÁì0Àè´\MmS9bJ6ôÜu]íI˜Åô@`"¹wÎÁ´2æ^HƒIãý²K„UFG ÝÊò8­TÈ}[k’Ž˜Zfï8€e5È †:¤DŽME=R-ˆèSÎ6Šyèû8­'¾vó†nÝŒýzµ¾PŠUþlër0s3(¸à 6&*‘Îà\mZŸ—ñ§½«é¥˜¼ËXŽ1Q²z &™¹WS̲¯°!TSËfè,TÍÌÀ×ÕƒU„¬Ù0« °©"ƒ3&B×åñhZ¹ £˜ftè£É(:w>F=œNþ‹Ÿÿþ‡ö¯Þº³…¦¡ãkû‡{óÖ–¥ÎbÔxɸ\.ÙU(ÙD¤_]¬»Ë‡÷î[;g¥ªvm 7n#­T[D¡Zœž ‡vÚLÓYÖAˆ +_+!äÜw¬ªÆDzÿÁjöçÍHŒáá@(Nƒ„wÛ sEä‡1Ÿ.–g——ªàÁL3j®Šü¢`‹Å“î´GW¾ùo5{ßý*[Û."dD”,Wþt”!——Ð12€lï’‡·›þîP“M?¤Û½ Êë–[ÌÛ™ÎæUJ¸.¼« ~ÏÌü]Xî•“s30B^\t)š÷¾„ŠÛ~BÊè€@ øJ[¥CJIýµk×BSÍÌ"Ò>0dd‘4›N’ç" ebS&C_i@ŽS˜*Î)Ø8 ¢:®yD×´•óŠFœ‡±ª<“gž:ÉÜ­hoÚ øâ9䔲­%U¡54Ñ{d23B,æ†Á9N€bÌ)´œÌÔr_#»—¾óÜ¿EªÀwµ¯%ÁÞlZWnZÒªªêIKDëõšº©ìLTUj˜hµìV«|tã™üèÿðË'÷ºßxûsç—CÌ—?øÃ¸}Ófµ›€í…0€©™š2’Œ€ÀìÉѱdÃ"¡f,¿P‘g#°ªzOLé·ÉH œÆã£yU5·n¶éµÃÇöÛî|ÌÝ÷×ïÜ=å:\¬–U{ˆcîÇd@>›.»u=©)ø¨R;&ï\ÅΤټÙ?˜ôï=8Y$ŸYË“éåå½Úç2aT͉ˆ­_ÔÞsÊ^9u¯.Õ 4²=v©~D´[V(–4@ÈJ[½+¸ÂÝ1, –`*°«i!Wøé»U M‘ÛÊYßµö6JÎê\IÌÞøÅ€Û¹“˜};Þ̸8FZ1PGÉ~3µyt7T#õüÿÒöf¿’¤×ØY¾%"2ófÞ­Ö®®îf7ÙMŠ-JTK"%ÎH³zlx0ƒ1ŒÀðÛ¼ù1 Øoö£ ÃËÀ10`Œi[£‘(‘"©!ÕûR]]ݵݺ[.±|ßwÎñCä½Uݤ´ÇÓ­º‘‘‘y#Nœïw~‹!Añ]JɈª¨"2[X½"C]×j/-or·ûÉOôþ›w¼.>þèñG=Œ;S™o&“ÉsÏÝøÎïþÎÞÞ¢ïû[7¯ïÖ¡ŸVõ§÷îÜt²ûä4 %ì„Í&“Ò8ž\®S¬ÃÞáìÆÍƒ´Ù¼ûÞÛ«³ã¯\oBÉ f!1TˆLX4Nýþ•C_Wª:ñÑ’L÷¯„8¯¯îWuçeÒðä<ºÊV›ë‘^9Ø !´CI±öà Š(Zöjšm4Æ*ÎP‘¬HÊYç˜I!eíJ! íúì@Å»+ïþìÞ½OÂwûëõz:©™‰UE¤°Gb”b€(*j…*‚ªøñé72–D•›&yòäõ¿ùbý©½õÉÒ &ÔD€vÕ½ùóßzóCÊrý0\Ù»ýÆoÜžÎwšýISãÕÃÇÃÉ1~í…¯«õ  H»ÞüèÏÖͤŽóU§Äà†lųŸÎ_¸õâþÞ,RùÑýáÌ5_¹vuq¿÷¾TRŠqcmp±s¤ùõï¼q2lš1úz~‹\õèáñûøÇ×'ÕUžTó¾¬bD¯PÙ*­’gD?i»Ž= sE |eì±ÛD㺔Nr4Ô$Á¡‘¢á´I-pè²(z•ìcU€* X«È”sßçÞ‡`LJ8©}°Ï@LÅÒ&oÀ×¹S#VÕÀα/&¥Ð×ฌåiR q©=›æÔK)5qÚô¡±©¿ÔæËõh2^ê¹ 3M¬Ð˜¡7Ù[¤"JÔ¬6O DXöØŽ¡Ž$“ƒ®¡¦L£Å çõäŒa ©˜kö+•ìÀg Õ¹#+ìxˆM]›¯Á ¬0Éxæ+͘°+~c¡w0©,Ö aã„3ú¬P6q;Ó«âCuýõ—¿ùÿæ^8#õ"Ööƒ¨Ã>¥u9%ë\åx“N~øÖÛ7^yprÔ6þƒõʳÍýxùkÎÛáÕýÕÙ£´œa@Ÿ%{0`e0D#fb„fš†5íhí ¥»îLªéög½œY>³Ô¢»•‰‘¡y‹n3ü“üï¿øë‚.gF‰QØikáµ- ªD”QÆ m‘L¸5R”ÄO½“±H/£K!€»àÄÑ\Ë€ 0(Z–™ŒÍ3BÑl6bƤdèŠÑg‰xL» z]$ÕÑ…5¢Œ9Sä±ú‰Âe§ŠfÙF'Sd*Zˆy« RsþÍ…Ä9'¢paéF[¹·ˆœŸŸÿÆ×ÞXììš<Œ;Ó¶uHTëÕ½Ý'÷—ç"}QçfÈl°Ìy½:žº{óæo}÷[·Ÿ¿ÞLÍ£¥ÁÞü‹‡@]†504˜°OÒ«–¾7æz“:×f­k‡ˆ$ê© xT2tŠ"™¡2šYr»TTH‘ÑqѼ‘yÉFæ- ¢ #ŒCQ„~¬N­4!,7-“ðŠ&èĸf !"8ç‘Ø9˜!ÔA€ÄE³<B·RÄA8ŽçO–›¡ÌOŽ3b_‹qŸ”4™Dzí×^šÕp°çýÛOZ̃Ū‰sÿëß~iÿÐß¿wöÎÛïC™¿úêí‡îÎÝO=XÐ>Z~½9ÚZÒ½sÑŠh~óÍ·–Nöo}óæ~êŽxê&;‡•'{l©ˆ¢10{DD¥ CÛ¶Îû>g¼˜1Õ†uã·—¹æÍÞÁ¾Ö ãÃu𻿠NÉEÞ©=ç®×7N×íPŽ·{×®œnŽÓq7ÁÃÃéœËÊ¡™áÉrã'µÖ¼µ óÙüîý;³f÷êõÃCj&~[¡ šÃ ÌÉØ©Ù(+mN‘.ØÍ£õEÊ9p¬#‚è…$¤(lÞÚß((©¡™)‘§T C(RБà¶N›)ŽœêÈ6GÛ"¼2Ób‚D„`€[ŒAdnšÙhUŠ8 qA€ ÄÍTɘ@‘£ˆ0‘ˆ‚Á¥«R˜¶ÃЧª¢@‘1"ÁK„!8C!”d9l*núM–çó}ôЕ !ÕÈEúÞ†fŠ¡”·¾ÿG?y·|:ûà“ô¿ý÷ÿ{]=YD8lv&“üÝï¾ê²i £C#ÐU ˆ|Óíú¨©K¤:‰õ¦èÞ•}›x[@†êÁƒÕô…½õæøÊÕ·{½ ËÏ>¹{úÈÎw§Í~Ê@±^ÜŠá-N«P †ë¶ïr¹õ­ç~õ+/}óo}@Þÿ•&÷œºû?ý³ÙÞôÆ4¼ôÒ‹ pκâM…9õDIE]§ê}%Q¶&+rt‘¼åÒ‰§fŠh|Ó‰sZyŸ ¹”DNo°Æ‘ ðÜÁÆž­’yTwI\¨›ª’\ÀS»^{’!ÀÐc–Г¨‡ªoK¨ƒGh¥_oêý°B'f@Øæ þÿˆе}ÕM %ªb¦£ ïÀœˆ£c"ISô«ö À% ¢ž0†Z)2»àêʺT ‰Í°6˜býxõd:_ôˆÉ è²bö1’&ÇCñ—ž’š¦’û E¹Ï™ƒ#IÃ00 J.Á±t›Zð¹ú°;÷å Ô°mf3fÞs;¥(•%†àkË®ƒŸb 4HõÎMKï(ÔJÜ;Ülºz’ <~0³÷AjV°¾dŒ¾¦àAͳ¯¼Û[ìY+Bˆ«×U»n0&FƒqR•­Û¡µmKDë6 (2ƒa}ÖˆÆLjxºÚ~?f€E´Àˆ ¢Q×—»ËžKØã’† ÛKÄÐŒPTœé笄.¢ÏŒ¢/.ÿ¼ô€lýOm´t¡Ž1(Ä!={ñ³ˆ1=cK}qI]Dâ‰$¼°pE§@èÌÕg<=y\y;Ù@×òÙq_5õt6u\wé™­V«a.§Õιºq€#—«'µgSçÜ6~ž§û”Š`¨ê³Õº™Lò è~ùIGîâÅb”È9bf02½`nõ‚Y ²CÓ1vLG.ÝÅ`Ϊa@GVŠZ5t‰˜y”5šš1"³cÏ}—GÃTOÙÔPÁ9†,YÊJ(çìQ-º˜4•6GÏÞQ*ùýÞýêË×÷yî¶®gÇ ]ß§·ßz÷Ûo¼vçî§›>ÿñŸýx±ØyròÄÅ@ä&‹²>kCµ÷ò×¾†$ºõ¥P@EgîêÁ=k>¼w×o 4î}øñ{ÓéÁ|>áöÄÌ꺉®Q+¥$â|¾z4U9oBíÌ2+¢9RE¿€d¦#Ç6—" ]6Br&¢àk¼>ßóÞO‚~åʬkÛû|øä<†Içû”¥dâ÷î?̳yÏ}S/&QE.­ÛÅs×f³Ù££‡•{:ó¯y‡T¤xr$"e«e¶Ë[I/]>ñ € q$`~nüÑû‹`äçÀΧ;Œ78^ÐJ dazÉãÅ#`̼u(þ¼9ä8…,že(Þ@¥8ç€0‰ 2óÓ]B9¡#Œ1žƒó ºUn_"Bˆ’{“ÑÒ6D”÷÷J/˳U7¤ébæF99y|~ô ´xôàm øÒ×n»…æ$M¬BOÏÝÿôÓÓ.Éj£óùîëßx)'ã|Ë ¤"Y!G E±zA2R+Ytt0C@)MðS7Mçë¢öwþî¿÷þÇíPTÌ!ø_x~^ŸµÝÉÇug«ÝëÏ·+Ázžd©U´@<©œ§Mß÷°žÍo\ ×oŸÜüèá§÷Þ}{vv´Ø§»¯\5+I[((… ¬ß´“&8v]ŸˆG/@„cÆ£E#@2D€¼¥êv†P,1šcÃ!À¢XÇÐéú‚P¢cOlZºa”Ó“qðŽû+äRÌT3) `6ÒRäÊ•DNý€6€sdꬉ hDdÇŒ RT’XaG\ô¯Å¾~aû’øG=u`PÕ©_2˜ CÒâLI[‚€ÆÆ»¶(Û1"Z dæ\œƒÀj%ˆ0¸*Frèú¬½(VdŽHÑÌŒ è—}0CB0S#̠ƾ€±c`ï‰Èå¡\ݾ~뻯¿ôþ§qz½;úPÓÁÎþµ~8‡>!tˆèÈGï53 µŸîUI†Ý½IGVYªT¦¾ö8 Ë“ó¹ û»|ð‰ôëè*„˜Y¦QDÕ`H’r ´쀜šù¦¢ˆP@iÎÑÀz¤Ñ¨{Ì"3-¥Äfg“AÇB…:Ž$Ç/½SÕ¡”§¡–8:…ŒŠ-ô:†ÂŒõd,{Ö[CÀ_Ø/ ɼ “¨)áE)ÄqYÃ£Í Ú ¦Ïº<;—Ïä²>Â~üùbÆw¡Ñ%úÅQúå1G[÷íç¸<#0%ÂIt;ÓXy¨"­ºÍrÕžÏëfR3.œsVUÍ= ¢wÁ©“ fßu-Sí½‡qPý ˜®æR Î{録ÀÓ„ÒÏ}™¤ JffêÀpëûÌ—3>5Ì!PîÕ1"¢˜8âí žé?Å Yyc+6:ÇùRèØ{"@[Íqr7XLÙB{ 4 Ñl®äT»à±ˆ!0ŠgW ?z¼ ÎK²ÕÊ ’‚IFèºr~Ö§Íj\*mš…)¶íÒUDD]Ûݽ{wñÕ±0B`4æ|ãpêâÎGw>Ø™q™ÔXí:Wç²9y‚×b¯Ã‡~¸YéþþáµkWB%ÓÙB9T’‹¨8D²lfj™;Ó”ÛÞˆ*äX Õa"’S)B޳™óŠ—mšíïî=wûW¿uûñÑѓӓÀ˳óŸ¿óÑΕ—¢ó•¯†®œžnRF€ŠýTUsÎ!„ËFtüã˜9@Rc5T'ˆ¦ÛY Ž~áìÆg0ªÊe -ü¢~Í.²úFŸ•/4vi "Š,¨qOUUM_¸©1›";‰4B"ÃüùcŽý;=t´Pp$ã“qœ¥Š Œ~=l»pVEDÐlPy´÷ù*‚ ¢C*‘Ãù?üOñä¨}_ûæk7_ºUÑ£;ï?~÷ç†ó“ÉÍ®’…Û/;lË'ŽÿÍÿ¸šÆƒys|²ªªCò»Ÿw9¯ lB*ÅØ3l¡'CEQÈÎЀՂ‘÷! 'É }ÉÃ_~ü¦Ëë;ºqã|¹!$t8›Ïï?ü»ËaÕGχ?Ûþ×_}1Äi·:ÓèYNÝ,1%ﳃ4t»»»9µ"êb#À¤T<àP¤ï‘©DÎCvçˆs˜D‹Šˆ *ƒsIU‡b1D-ffZ€Ì ÀŠ‚S tÀ‚ª¢"½hluݬVç¥hp­x‡hÎUÁl«'pèD$Å&† ÅåBJˆà±èý5Û—ë?¬’,ŠÁv¯\Éièú¾/1"3÷-D '"žHm0oPÐ ª‚lJ…Ø-[8¨'{õúì,9³ -® ji¯¥Ð—,ˆƒ««f0‰”H£†dcÆ’¥ ÌÓn%ˆxNO&~g¹ƒršóµé.gÎÿ“ÿèo»X ©¨*²Ÿ¯ç>\G ) âœû†4îOæ¯ÞøÊÙzrm¶ûÙÃÓ½3Ö®xÜæ½ƒçöÙº£ƒƒ=Çc$D˜8‘3§4MSq µÐu++½%(G«îàÚÌäñÉùæøJhrzüèüÏgóÝÅtÚ Å20G„Àª$ܧ4ÝM欩p˜ {§ªTÌxË%DID"Õ-1·X­™c퉀UU%ûŒ±&êܶr]òXÕ*p`‚&Û‘¼fP‡ˆºMÖE1+㓟¶¥hD5òÈ %¶D€DÛ®Ô¶ã`RÂh&±¥÷ÎB¨¥”±²U‹%¢ª-J[ï$’M•˜/‘ƒHj2Ðä†UÞì›5“=J±’ôòK7S:1êr)’{ë:^©«]òÉ Í‘’ó6É%–Ä„52#¨:ÈÙ“ÂÀ9ú¡lV»Ét:]·˜ÌçmçŒ.z¶TVì$C‘MÓì0²‰yW˜iã´öÔP½ÑsæC¨v8 ðÌÄ*†Z¼ ®ˆ#4ìlàÐ'sÌ\ +„† ¡°1c$ïKŸ  š«;m­nœõ]B¦.§‰CSã¤Ø÷W liÕz'äÚ££U“¢¥¨X‘:€šüügÎ>HÊ4TDPPàJH˜¹¦;ï|ò½ßú-WºI•;-(SÕÆ±84ï3[ •ôç›I þövó}Ví=¿Àúpç¹å:vÿá|~ØåöG?ýñ£›Íº{éÕ=1™îìOÓº µï6›ùb‘K9n;:²”†8‰õ ÉH{të®N@‹1OeÈEp¹N½«°*.®_{å×nž5±ÿìãÓÍéî»÷º÷§?½ûðÑ“w`“æ‡ûeÒíìí Ò ¶ðƒX)ŽŽf6 RXÀ‚ÓªAlªòTÿ¥ÌPJ )»àHËÈôR0PõNб à…Sªf%fðLˆ$ÆZüÖÉÛ±CÈð²=ÚòÁ&¡ÚJâG• "1ÚˆF I.Áû(f#–é½ßž¯d`9Á¨¤DtýxÉ"TC R4Äé ¨ebí™ÑÏ õèf“é“GÇ“*?~øÉÝ{çWwi‡iŽé`z¥Úe_ÖDåæÍúöK¯^¹¶ßìÔ ¶ÙÜç½'o¿y÷ù_ùÍo¿Žétâýɬ‡òYÙdbEyÈ@õ$'# Œ„€’Q l´r/ΓAŽÕ®™…"äð•¯>ÿøþŸ±c¬êÝÛ{/möÿðhuòþ«ïÿÎïþó7¾ýÛ×Ï7?ÿÓÿ a…æÕôÓ;ï†P¿ˆuµî’“a1¯ÏÕN}òÑwnîó=6é´ë; ÜÄ¢žcê„È`©òŠÈä Ïkɢ ‘ÀsÁRÆpÅÒ.£(†¹-%Pdb®„!•ÒgÜôˆÞ•!a—™@SéT3#öIw¦³9W¾-©×´˜ÍjÄ® œ9«™Ôa2 õŽ‘åŒUã=¡ ‰ÙeÐb*䨠#.€¬ÓI°=_›I :ÊZ”íK5 _®ÿs ¨íššùài0`Ú@ ˜Q>ߪ‹aˆÊMë&^Yì]Ùýäø\–- ]*aWyWˆ”*ÑÈq;ôu¨†MË@.äþ£ IDAT£!i_ÆÀÛ á§j>(Ã`Ã<øÜ—2GÎ1Z¿Ù„¸AÚ‰•™e±i=-C¯²uúRCÇ1@fRì»ÜOæÔƒ|ï›í Íf¹™ùªnâlVß?½Ó䌩£Òªl„|±Ì¡1%-ŠL}Éš$KÊZ¤BFÓŠ˜´ßYDÉ”(TjØ›y{ ®åœKѺždÝbépÁQÝnxa~JL*¢Ï@¸¿7é€ôÔWˆp;“¶-ß F Â5]íéû\$[=½Nt»<¹| #m—IÏ-Ÿ?9»ÔÙÂE&øå»Œ†iðL`ÞÓ—™©ÊêŠÈ¨HTUQã1+Ôp±X¼øÂ gg'Ä2ÛdéÌy׊\AùÜqüòOÏN»®ÓBëõºj D¤ï{ÀÑœ©l9…f6乫6gë 8óšI*%8@`¼¨ü„B$)q§ÈfÖ›+…œ1!‹EB’b*Š\H™© }W… f,FˆähH`Êh\H]_-vT3²CbµÌL#Ì¡ffÅLD²jQÜâIcâè6ù¯ŒqçEÌ”Å;+¹Õ.ƒ’¯cŸÄ±WK¥¤’Rb3ÈY‚'ô¤Ö‚A 1T¹ Û2xDÓâœ+Yu‘îlhˆÆLªRJòº¾­'!¯³h¯ZVýÚ1‡Š‰©L§î¥Û×úåÙl>uè>ýôÓyÛ=xÀ7oÞ‚)YNïr¸¿_êÊqÐ2œ¥4 ΜæÔEÐ@✞fÓ¡HðÄÜ$5`’BL"h¬èàpÚ.{m~ç[¯üÚóÿô?ÿ¯þuˆ1ö«!§¤˜3h lì)Õûr¬ùìEûŠ7¨g“Ñc L¶øˆš<«Ž1DC3 .ümKFUpr„nåùãñ/Æ4ÐȳÁlö9<ïB-㤌øb°u‘6uùÂKâ6Àj6+Ä\Ê11³h>„8éû6/õí7ß?~töàÓ£wÞzÿÖ­›Ï]¿qp8‰3)ÁªYsug!’ö«¥mÖtz>¼û³ûüÃ;}òjþÉ]»rmÿÿäWT> >ûÆ#ãƒÌ.f¾Ì¬I½™z Ú&›ᘼ`¹hofB0vvCÛ1ˆ‰¦”îßC|Eäœ „àû¢ƒ³.Š9»õÆ«7o_‘¼>ºûZ+_,ɘƒw1¥ä€ˆšŽn“@H "B†Ð¶=8˜Tuê[sä<û¡Yø<ª§‰‚ˆ4M£Zú>9rU¬ë¦^¯V–J 5ÊFDuEèȨRȆêÈ;ˆ¤æJB¶^’ ¨)’•’È“‹®ÑÑó_À{—‹4MeÎK›Qˆª*°”¬y]{DÌC@Oac°LiVPVʈðWÍÿªíKê_3FUdÃñÄ DF†ºc, #¤þ9ç>0„^r²VL$xãê"ƒ¶Cé1—ÕJe7ÔÎ :-uvɈ€ƒÜ™MͲ楑3‡GãªÑy’=²%(uhBô/Ћzvš Xn*šY*9¡"åœp´˜‡¤´)²:çÀŒ¬XŸMo¼º;Ýp`‘)IR³åÇ'Ëûm% V|ŒŒY*ψêrŸQRUEÄ<¨ˆj2(âT½YŠšGDÆ]½ó6Ò¾.›‘¢‚.øœ³q4eÃüyžñv k"#ÒVe—–0úL®¬Ø&yÖ–”Fïì-€±í¶€ËŽcèAF{Û§û>• âÖ i+«¸ŒxP00|Z/7D{Úv\^`k3ºI#âˆ#Úå Ýœ#`ºÄlÆ“áÑžæó1ÄÊqŽÜ šæ!Ÿ.;ÿ…Fh,dzµºý‘¾O£¯ ª)"#`‘‚}žùêá§'¥í͉cgh]7˜“wD–¸ÊÐXˆ nÝžÙÌ‚"uŒóDΩb ´b€EmäYA/4Æ]ÎY²k²¾ìÔÕºm÷f;‚ óöÙÄ¢Fª …eôhB õ*"J:Òo°ð.RC $½¶;gBxðøTKGÌäL°ô” ÅL 2 ô}ŸÚSdJ‚Y «q¢ã"¥H CÚ¬×=“nÚ»I.ƒsn¹Ü´›ÓÙÌqèsPdh=åªY=|0H¹8üÚë¯<¼DI®_Ù?~øøáãÇ?ü¬¼öõÍf-’[‡_}åönvçUßž‡Š³d ¾M*YÐ(›S´:x‹1±”ù¢6G¿÷{_ùìÖsïäìôxÚCRÍ8"B³_ì*à™VãÙ’xI±zöt`ªê<š‚Dmsî©Ñ0Œ–PƬh3£mGOhnt7{º'‚Ê­ßÆþžÑÆÛÈ%‡íMnfì\)e\}®;ö#>3 Bãs)¥^{B›Nvã£GGù—oþä'?yt§»}ëù[·¯¼öÊÍ¿ñ7^f§€Bƒ[¥ááfStúÁÛ«Ó{ÒIÿÑýÍÉ“ãÅÎ|±»óþûwÏ>{ãï|ë[î›ßz®iî³;õ$ÞÅ”ýå=ëœ3,ˆHˆÐP@Ñ€Bas©§’ƒ£f`nÔ«3y$¨&SDV)è8‚! µJû×®\¿}µ®ãOÞÿøÃ&^þøO^š7¶\'Å$=щˆ%f64‘œr&"v‘¸¤Rº–@Õ“u¹$DÒ‹úCªšRòžyì^JbÀ* Ƭd j™ ¨$‡nHʼn!‹b‘âÑoÒZ«FŠöCëhJæ`ࢣ”*ä¡Lw&–K× •¯<ýÓßëÚªo7ŒšóŠcp±Þˆ5;‹ÝeQmã ¶´êBå«àÀpèÍzq’ȇªâè²Â0Lø2 `¥ ˜W-*Lè‰ ÈÈ¡#¢óóóÿèO~û{[Æ‘3oM Ÿr/à FE´ª¦4\öUOW9ÛJÈj&¦ÈÛß’‰yv>§’×‘î€ Ï<¤ÙF—n5âtQ™|`‘lfž/Ô¹#þl£Ä•žOÆ IÆ~DJŸ¯"vy‰ªêh³}`DU-¥lÓ8TAÆFs)ÀÌå9YUß÷o½õ³R~çàÚt³ìÉöðèøì¼3ÚSiŸ½ÎÇ›¿®kÕ³œ­×k ªªºNpéþ>Æ‹l6›ª©«éd²;?éZsh켸œD X1ç,9QÃlyÔD7Œ€DÅLÈãéÐ7¡>[õYÖŽ¨h–aÓÊqÊI§³]f&O!ºIÍu=Ä&$Ñ!徜·C~˜Wû;{ˆV M¶Yð™­ èû¾ÍCÜ&¬FVTµ‚H )¸à«Ê•¬B¦U"ô8´ÁùÆA‡šSB‡!8¨ÑŸnzR`ç<³¤àvKÔ4T•÷‚2(ÇÔmr鳉æ,è¼1› HJH¶ZŸÒÕêügñÁtRíV}'OŽ–ŸÝ;1Ùß=œ‰NM1õ¼YöÑ™ô†N²˜æ©çawÁ2” «ÅÎfѸïýæïÿ—ÿÅ}óúov©Þä|¾ÎÒ¹ø?ÿ¯÷f·_ûšx7skæ ®"Š©b¼v.›¶UNOÏ»VsrôoÞý;ß}½«HÖíÙ¯þö‹fª¹o*GÅ¡y,’iA}fx¦–~q¥ˆTʨ9SÙÊhÕŸBŽÊ¬HjR‰ö¹'‡ªú̞ȼ=§=B7‡-È1ºŸ^®Åa胂[Ú7^¾œÇØ£/|¢‹ŒDS-Uͪe}¾úÑŸýð‡?ü‰wÕW^zõßøÎÁï݆߸iÏ'€V’p=AÄ®ë<¥œRß6ý&õhÈJ<±¤ÒšRàêˆH²”RDu[±cŒPŠjÉCQè½ódyP fÈ$ˆCàqò›œ(¸8ßg]í”>þô/yPP`$ëÚµ±fgê˜Jí*Tæuަ“Y{ºvÁ×±*y0Cm¦ §ÈR—‹‚A§@y¹Ù íþü‡6?(Í\ãô¼øKn¿jûrýG• HÍ9cbç²Z)2ðhÞ!3¥ú¬ì'Õò| hÂã²8Cx37«ÎRš SäZz¿™H5)‹œO*£bkÅϨÀTc4M]‚2kv@ŽÁg(‰Á¯¥Ífèdp«¼ 5H–oąר 4(PFØ9>Þ<ý&ºÉGw>é¢ӲãJt:‘«&äk@‰ 7MÃaB䂨ÎWé Ö‡«³ão}ãF›ó;æ¹Ôyè±4šKÉà ®Îqà»ï! 1Ú¨—iqÆf"Àœ²çSÊFuÎnnÚà'µŸ¦DjÐ÷+•¾ž4‘“Ceo`YÁ!ã CŒ-`üÙOß<;©^ùÊÙÕ[3Àx‚ffµŒÌùqÍAD€†ªfÏÊ…ˆL¤ "1©ªŒ dNħóžL(¦Æ†£W);›Só"^5Läp¬* ê ÆBIŽÇÅ쎩£Ç2¢* ¢)©ªœa°­ÉǶаéöøŽ«ñM™PµŒ«dGcî-ªyÒQ½çPE/ÑqñWJ  Ÿˆh%x}¾÷Þ£6÷ih­ Ùür•6k­µ=؆IA=#4w¾–yVªÔTÜú¸€”âxƒ(a>îÞ×áÉ­}7YûÕ²’Kè¢׸%‹²ECÇš-%ë r›¢bP;²*923rîp:Ÿ»>-¦gíf™ûY3a„}fî]¶C'‡‹Ù$¤É4,Òng듞ˆ¶ý‰Îw¦€â‰™ÀÌjòœëç÷5è“Ó$2cTóy]#`D“’sÞß µ/·¦Ó. mÚMûö²ô)eÑëëÕÊ{?lrB- Jv\UÞ3ûõé9`Y\_<9}b½’d„†JC ¿wu?Iï)“KUÉ€PÈðѧ'Í,îÍ|(]:ò¤;Æö,,v¿ñÚžÓõÃmêO¯ >}ñùêáÑg¥U0ãLJÍÉÉr½æW¡ËY—geg#l©©6Ãý™L¤ßˆ_í…ÏŽŽŸÛÛ[uý»'Uô;3e,ÓššÚ»z ÓÚ307pº¦zÞßüü/~vÊÿLãÎ>ÑéÜŠa3Øì¹°—ÔV4I B\PJ!f{ê>Ž„ôtN±Õ ]>2U€Ð*Äl£a´š‘ª‹~-ç{³ÛUr:1Íi0IJ®wUÕoúÅâEóPØA’ ²Ca$Lj`Å<ZýesTÈ V!—b¨dÚ$ 5k‘”RnWyº7´§Ó«±_Q º¸RûA‡$gOî½÷øÑý=•ßÿÆ‹.ÈÉùãè‘€Ê$.%í8¢ h h”±7ò>øÉt×LU²/]1!Ba.¦Ôa#GqèfçB d›Ô ó2'c3P >«¥®ˆs®BŸ¥˜‹}—%„ÙÞþ«uóäüüí>!>ºs÷Þ_~áöo~ûW2ɲñ•êÊJç°8ª‡l†˜Ù5™ ][O}ÉÅÌ‚ã¾ï 0Dô@Žœ*åvXrs§·_üÕ÷ºÜC¸÷á£ðe:Š/×U²@žª2Hå9D j¢hÈPƒ` HÇù¥!Tžë˜Ñš*`ôÜÐK&èRöž²@'Ùª)ŽÄiNI¹”"'dz².2ä<„1ûÕ-‘@$‚mQ=é0¨£ EKi¦áÊáNññrXå\M º®šVc*9x@tÞ;f Áål’:.ÉrV ZÁÁ±‡KøÀdLšà æù³+­‹IH)cÕ`â/.¾>¿Ó¨Ë1ðX1/IhDbf‚æØ]²rIO¸µ\dçšªŽ /yõ™yÛ5~Ž(÷ì\‰PTÇ ÎÈ)ù‚¥’=€Haf2C*¤™Ønß¾õÎOŸ´-Z¡4H.ÝÉñFDsÎÀ¤EÁ¸”­hQ‰-î=:îb¦úÜ 3ìV²š¶6qfæÀLÓ•ý½w?xs±[]Úœ<]‚áeœkËEM )EƒXʼnãç꺎ˆ¢wÓÊjÊSŽ•«¡"2pP/v¨×¶/Ÿ<|4_„ù~.š˜s·L›óeØ;XÔ»lúM]×;ÍŽrq¼Ã*ÂjÙ_»r%lò½ûŸ¦’ ŠjVdì oÌê¯ß~r‚îú'g«F«®“ prz~t|‚Ìqº¡U-R Ô/Ýz~XÿÓô÷OÝ]/jÆQ>:zÌà7B]2®³ ¸RòÅ’š8eH êÅý'+nš:€å®Ý´­¶xç %ÖM ¹_®—Õùñ“£ißaÉ)’¾xëp18lú¾ïrY}v>#QàXOÚ®s¡ ›Lv»é,?ÉÚ×ܾ֬×ëÅlž³ýäß½ùÕ×^½÷x`¹»s•,Çß~ÿÎéy·Ø»º¾/©]O§Íõë×sØ]žõj|C=hgj¸uVø¼‘îx9 /3bfM/´tÎ9üÂ¾ÛøPY€F˜~ôƒ{÷ýï7ÕþÏýÕ«W'¡ñÁ®ŽÑÁýáíJåB]M vìÙVЋŽÉ㨠Ì3? ƒöípÁ:ǧD1ËSÜ­ FÇ<*C¸‚zÚñVÝz…!BÁl@J¦¨Õ´z|üøá]•A¾ÿüÁlZoÖÇû|ëúá·ÿæëWoüW¯/¾òÕýWe×9×®íúË¿nº¶îñɃcB%­·,XV2ÆŽH͘ ªªÉdb£oÙˆƒZ)ÕuÝ©$²ÏÙûè¬ï[s®ÿã?~h·#´™8nÒ8Õy‘ëÊK)€ºÝnçÍÌ{¯E®›é}û2³ª&Ó©5n̈ŠSÈh;ˆ=Í»®õMUt@äy¨µ˜‚ñz» Ñ©*TÊÈ"ÐZåæ§Çý/þ£ÿí;ß©óÙ‡—«[³øJ¬B›Ç~0ð Z唡Ïê»±¯a4uHã8Du,Lˆ6}é@¥¨™VUÓT5øêb}‰Pš={˜gu¶ëèr³Ë³Ã¿ðoþøÞí;Ìñøqû/}·ü¡ëÕƒ#C¨´˜GdQ°4šz¨<É„Ž ‹‹je§¹Èpb*ÎddFvˆÔJÊ›ËËHŽ ;öÔ<;D‡4šÉÔ=0+„AÐ;RFfà@• WÙ$Pc¢à€”+dµBÀ)ãÑ…¥è:.8Ì—û‡ÚžÃÛ‘ »U½\$õ¢Û+Y\5»Ò6Çï†O>߀ìÎN†á²ÛB››Hóü¨á°UŠŠÈ8¹>±˜1!²!© 9‘E4¬(8\-o,bîûªªh±)ªRÉ6ŽYýd+K̾ÈPd4C'=B†R4›@¹.Eà•ÕñO& Úä, DB23‚«Ë?ò“O¯«=h"‰} D ®I‹ ƒ"£B¾r(ã¤u®æ`@T¦ú^[@ì)·ãûâ*Ñ àëIúäk„"–œðº§þ´‰®ÔfÆ$³!fÈ¢ýý÷]¨ó+ð¹Oïm7碄ÈÃ0¤œL’¬/[)À€dD0¦Ö 4Þ}î¯zŒ*©õ.O4‡§ÿ[3ͤÜ~ƒèixzœœºûפ#$5R\VUSaå)ò$Qç³écñN„ ¤*YT‡®C…Y?üÜ­ù|ޥѢߴC7 Ò¬žÏêà‘ aD¦‚*cÛëîÊ-0Õîw©ÿÐÇ^¬\Þ¬O‡ÄUÕRUÎû8«ð|»Û´]î·Ì,†E €nÞðž;i¿ôßh/o~·|õ·¿sëæ,ÒèЯ[}|‘µ}2Ï윙!’!R¡LH€ªelÛóÝv—+6õ.ŸwÃz+š<+mÏγS–¦bQ¸y¸ŒR¬@ÎÚnÉû.É68Ÿ.7–îrӑ󟣕Ü:‡go¾ù¸œËÞ“ê×ífÿÆÁlQWÑÝ>:<;;;;ýg?¼"¢®ÝüÚ¯ü“ð7Aô@öî·ÿöÏý%fÐn\»¾{ØkP@ìËàc5lǪˆž“”f^òÓ¯.ü”Yˆˆ0M‚«2‚NMWÀɯhhDHtÕES³)âÊF6EÅ+ª* ¥’(”6í^}Ýß»}ë/~äÞÃ×>úÊÜç½Y¤U—…ÏRJ”’ì|- ‡=DD½Qû©@r¾*S|ºN¦6°TF€ëÞÐS¹d6ù«ÝDeœ\Tú-]‹Q‡ÈÄl*WƒêxåˆFps1¥ª:?;|ä“/y×þý¿ó_ÿØG_øìÇ_iœKí‚n;ôÄ "[AÕbWX,cŸ¤˜‹®®ë©Éer5;í½'4!Lcb0šÒFÑ™*ÂUjOˆÜµƒCæëaÌb@FCd ËÕí»ÈñÝ÷Öf3×äîÂI¹Øµß}÷nÜ™<9ßôc÷îÛß¾q8ÿܧ_zöníòæhP6y$‡ÞûÈ¢©T1¶m;¯*fžêZ¢h !D!1)ÚwG«k¯D±ct ,n.«Ë~é éfÓ—óºªáÁýù°'E“«QÔÒ˜âLÕ²¤YúÒ9‡.Yk±Àœ!e&eZŠ -k­ØÄ¸Y°w$‘ÚºÊk‹nG@A)¢LñF–:X=¦Æ8`+ÐÇyÕ+sí älcçh¿™¹?ªÉ©³ØƒÏ«åÜR±"jÃrŽ£.´·±­ O{ÍIÀ‰șǞœôû‹yw–oͤ²!I;Ûäw)#y×û)Ï–þ&¯Æj¢í'“öñ 9o»ÒH”qŸg”`ƒ<2¢¹´·cöÌájÑÄà8UÑ{Y­ª¶©à°µ‹“í³7Žj¨@Œ€ÙТ1E_͉À²`d3w]™ƒreêÀ@ªÊèU'ˆÒÔ¶ë™ØiFF[R%gÆjVÔˆ¦tÎë`*0"Ê2 ˆ«±þiÐÆMèwFfÎ*¦™ˆžÖûêÑ~µY_´mï#Ä*žï WÏ/N§ zÉ>à²jêp,<•ž`»Âùe Q'uLä1µ#¢(¹FÕ-çÕ¬êpºT’"ù0ùgHe´…•qÁî™[Ëè„IŠ .§ŒŒÈ@ †XDüˆ†X6Ã@>@ ãgnž3Ý΀Ýv½¤ºÙ«êÕе'›Í¼n|p¡P´ÕBN½ç!IÈœF™·ìʶs) X0FWUT ¤awïÆ^Úm?8[å܉ªÅX‰HɃS½¹¨±¨ìv©¸j‹±®ÁíN/þ¿úÓGe¿Ž/}îlìß}ëäÃ/ìÁo¹ˆ]•ävó¨íÈ! ¹ÀìA%uý®r+JŽÜjQݼ»€.õî™ùâå£f»Ýæ$ýz½&ÛvýЕ÷ËÉúÌí©Í¶Á ÌR…ú{o¿óæû÷ nuûsp—9¿ùàþYŒ…—4¶#/‚!­7›íÅfÅIÑ…Š7=òÞC| o¼}Ò IDATÍáÑ»¶¸íxÆßþîöätíëƒ'O~æÏÿðoýã//ê½7ñhxöàH¢«c„”\) Õ*Tt jF4 @f÷TgOo±2EÎ=-2L ¥ä½gfPtE«…©å‘B`dÆË\ÚX5ùö‡ê.ïݾwÜço¼ûä•Ï~¦ìÞX”5Û\òX‹Ž ³åœM€ÑÐ+ á(ÁÕ«‡?nWà"b3f¬k?[ZðãbUH…3ìÅf‚ë  •Î’œ£TƱ$£Âe†F "¤¢dRP+E-E6W@×»³¿ø3?q÷o4rM®òADúl®†6i$ô@¥G°:L›§Æ¸E³p ¦=ø”¡€% 1ñÁ9°Nû‹ŽW­¢Ìj8ñÄ<& T¡¥T +T *h H¬cÂb®f…Œ6’±¯Ùk×—sßE×c:|åÅø?ü¼ôþë?ú¥’›ÛþL‡m8¯ÀÈZƒ eÄ’8Kèöª‚Thzjœ&×XÒŽÑ5ÎqÉœŠAt…-‹)ûfµØ­7d¥Ehìn5øÑžñè#;Ò.DÅ™|ö_û‘q±Ü[Tûï³ܸ½=?îîÿ>?y2nýsàÆÓXrê.ÒfËÕ|jC7¨£¬¢É‘ãœ31ô ¬iÜ!ª¼Ú[”"¦¤~Wäbw²ûý_í×ûß}øèôüügÿÚø¯JØP´¨ !X.€ Ȳó¶@©€ÙíÀP¦ÉˆTȲ£Rríœ+cÚ 7ìlÊ‘'r"(h! Š¢±w&€WZÑ#ʇGUs§j¸r¡vºÑÈ|ãúÝÉåýwQÆB+4Î ˜2ŠCŒ@…X›„¬…*òÊhÑ“9ÌÌrYÔ  –RR2^rΙ|èSÇäÀÑô’‹¾ŠQDÁ±«”`)RJ&ÄÀÁ ’£2k‚œ'¢éXï9²"%”Îx¤MÚµ#AC†‚0¯ÑJÎã*d¦ 2ÊŒ®G3ð* ãê+ºÂO]ù!Óu‚·ª˜–@îª\b æ`Ê».uš^Äð:b’ Ì쉈¨Â¢^¾¯S¯ ›×‡¹§ã¹¸ÕT2" #Mb‚&;\[Y àzùÿë™|ÚeG0@ É³o xÅ„½Â2Žã¸¿¿0˜YJiÊõ±«ü O°”RôÜWm†M[Ö‹£Ð¶¥0{ðý¸«CDD&ŽM¢öäôtµZÎjßÔs^?ÑÜWqÞ§ŒÀ HѶMŒóèLKŸµ˜(EcR›QT@Í»¨$"’E‹ä¢¦`¶+k3‘™EöÞ|FD¯( ä• 8àèÈÊv»~ñ•nZMc¿Ø÷XÆ¿ÿÿ§½åj0×o³*¥„ ƒ¦«2?-Ý=}–ði:M¤ÿñ‡Ù{?ÉzPTœ(ë 8¢dÇæˆ=¨ézìiªÉi¨—ÕéùéÜkFÂBŠSAN˜h¢ NùL °Šáâôìë¿þÏ¡¹)/ÛKòÒu%Ø·Å5Íl1of9ç\Jér_ùÐ4¯BŒq±šWM]ÏkªŽ‰­ò‘ˆ<2Å8kJQ`”XáruÃUÙ{ ì Kž5 Š!Üꎺվ[ùÿçË¿ýÒ+ŸØ»u·„-BV¸è«]9œ %Bef`LÞIsI£&í‹kÌUÕÁØîò‘3„R&ÂQËŽ9ŠDD@G€¨)CNxIÈ Î̉ÆYG5Wóù"Æ*0£=|øØ9÷ì³ÏÞºuƒž<‰ÌTTrió¨Ò³n¢%™Õ‡ÏtÃYãeäÒÍ*RI˜”;@È•€@!·`6YŸ__çrÎ"â™—õŒ],¥(X74avð=ï+ï 9¥£Ê6Íêíï­7ëó[Í+Ÿýp¡¶-mUUbE?òéO~òÇÿÜÛOŽ+§%tÌLäÆn»Zí×ufFËšªº>š-…|ÎÙŠ4MSœ)x/ Y22{ÏlŒHã € æ¬Û]fr¥ØjÛËõûï?:ùÖÛÿëï~óþ“ÓÅlï_¡þ€XŒ%‰r L¡CAOÞ£Ò`<„qd0A+Ò€gf+%¯·gîùg+Ë)AS9'HÙtʱ"`+hWqŽRFÉ#ªKi&@fÓb F€úÔÿ} ÂÌWéÌEä:„Fùéž è¦XD…k™3W4óÔ5' C0CšÔ3_mÔpÅÿã°„«»½nʘÙuŠ?ІúC¿UJafOž™‹^Më1‘+ýáœÌp=Ýãa?æ¶_ù­û·ž ÞQÀåvsÌrç×™”sÊ**òõ¦Mm××÷š9oÚ4‹” #zæU­M`*ªÙ´Lð)rŽT²¢e!ÃB¤,Å (;#Gì¼÷ãØªª%,Ælä]cb‰…L] 1FD+9#rî‹1f›ô ˜‰¡ Þáb¯:ÈÍæäBç#;swnÜXΫÀ”E‘‚QA‡¦‹N•y3Q#v„€¦ZÌ$„êâüò‹_üâOýäI¾üÕ_þgþ'ÿÂÍ{û÷nwŸ}í•_øÅ_»óáý~ݲ)0Ÿ…¾ÈX8’+cq XHÁ®RœÛ¾$)۱˱JUùÅrÅdÖ¡’X¼f,ÕÌ-×Y÷îf÷îñFÕïñ‚Õ\@¦rñø¬A êÒ Þ?aHj^Ð ð“‹ör£_¼q— Ð`JÊ,W2X¦Ø¤"Ã|Ö0”‚A>ýÙ×éùÇU½è‡LÞpûf(ei¥xspUi$#²ë¡V¸b­ƒc×]€€Ø¯®ëQ/ Œf„Š@ „Ä &J HERª™'¯~âC÷ó÷îÞ=8yøxï‡æYØ‘ÀU#ÓOk¬#¨–ÜGÈŸÿÄË¿ûíËz¾XÎðö‹û¬ÔžöoýÝ ÌüjuûέPù çï˜È™÷>«ãXD„é|·Ë]. Ú_@ÎX’”>'Õ¢ÅÌÀ)RÝU5WækŠ5²‰j‘¤e”XÚíöÖí9[±¼†wžënܹ28ËgÃ[ïk6˜/VÞõUª€U,•U˜³™•o’·ååv»­çs•Õ!Â`èx(²?«k œp´íd,%SÍ9+®Š 9å, ÀNSÚy/ä´O%©ydzÆu›óƒç^6³ËË‹1µý°á™ô»m¤jRƒicÓDrÁ7Î×§'^8Ü«ª mëJÉC0x#TËP Ô.TÎQ¹X;À”=)JÁ¤, %ºjÙì_ö÷7NŽ¿úïÜ<ºñÜåç?þR‡¾kÛÍîþqçðùWoþȇ_¾÷ÌÍ匷ëGóñÁîÁÖ±4Õ‰ûÛ®ó¡aÍdÙ±#r„€ºÚ…qØ ¡ÁP/d5oSƒÍùœt1DÉ`Dœªª©e94fE4¯7CU5R vÙ-ÝÑÍÃwýçþêÏÿü·÷ AñƒéŸ‰2eU¨Ø{?ŽÙ•²©w ¬7³Æ‡(ã°Q`4š, ˆâ3$ۛσ)%á 2¨™£åRúªY®#ˆa+ªe^r”lDâ|ññ®WáatœÆußG¤–Ê~U9†CZFŒûâbhGÊ„¶èvØÌfæ]Ap0Ì"“1[ð•Â…ä¶Ë˜p6¯E6ÞsJÃ.åå[yÜõ»mVÖ#aÜN‹™sE˜|£šÚ²,ì|—dÛ‰÷¾7t—ÏÜ»=–<0ÅŒ$†+›…*TžXJuÍ3ì Š ‚"0SV¹X_î¶®d6u `h†veh2³«Úï¿‘¯""ŸþaÔ«úÇä1³,V‚#04@KWyW¦EÍÈ&Þy1påiuÎMä3s""R&÷¼™©ˆÇïë¾Æ Ë§ëiýCÐ1˜©¨ˆ)#Vˆ(šUËÕL˜Ùô5}•ôÁËlB;ƒ MµB~JªÎ2"yDôÞOsÈËår{ù@DÔAK)E )Ò3 ÀbŒ1Ƈ—'êóÁQõç~ô3ª¨k‡ÍîÆ«*mëç^!FA;__v#‘óín0-]WºÓ"Hžª”âÄNkï”—CH½¤¯\ôX²šU0¾S!Ì:Z5tçÛ åbëm«çuµ¿¬*Of¥Ý]?ÞnúÔÛ;wû±iBQ)>Î8:#É*¹O#£ iØÍ}èhÿ¹ÕÑéY~ÙW{{Ïß¾Q†hŒ…ݶ-Õ9§ƒÃålÖë³”{DÑ%f‹2Bû>þéŸú!€ï­ÏŽýÿüê·¿§?ûïþìë¯k½°öý³[ÏïïÒ3Þ-…m]¹h¡ ŽÉ@sž&¶Èï†ü­ï¾ã«ý;·ç{û İ^¯ßûƒ·†!ÄæPä'ki‹ˆù½ k·‰ï¨äþþ–¹“ýíÞ̓9óí`vøòç?~šh½9K}»>±ºÞw ‡q±c³í •Y¨L$T® 4C²Azv°¿w°œÝ¿<Íí6IP¬bÕܸ{çä;o®¶›G——ûûû;?ÞxïU¸¨Šˆ*ÆÇñûÓïHX43³s\Š>Õ´j]S³\*JL¦‰EAduÉ™A÷êès–Ý:­?òüÍo}ëTO/îÞEá,–5›7dbr„¨cÆ9+qÒ—–æò/~ãË»²Ú><îŒ~ïáñg?ùÊ«¯ÜøÌ§ŽþÞ/~å|½åª{îÃ/*fDs Ò‰&¯*¯1†,Rûš1"«#B1S$p^Tg±bæ„  U‚h "‘qÏ»bá–‚GÕ2ÞdÞ¦íæÍ7¾÷¦§$˜ÒÅ£cKøÆ7¾}q¾9‡‹¤µƒ±«}5lûÍÚhVõ”Flû5Ì›zé«0ïnþî?úU§Çi}Y‡U/-""°3}U׳zV-öa9¯öuô>ÖãpÜ>Ø*¹[w]׬f¿ø~áôñi‰{DÒà½cgmwîcRɉ¨4±sÎèiue§Õ¼Þ×É&uL]‘Qµ8 ®ª¼ÍLiÈ;¬Úž¯YÏþ¤]ú_rý`úÃK?úŠ3_¸ÑgamÉz@g¡ª9²é¶ÏL `ŠsÊÜs—Êz»=¸âbÖXq‰(Ù,W·—{½¦Ê€ŒBñn™U» #'î{)Eœƒ”`DFŸ”]ì•KœQ¹§Ð‹¯{9áa>1õ‡¥ dƒîüXÆÒû$Þp'Š•36Æ´b%0V€îÆ µ“͘Ïrˆm7qåOvýÙs7šNîž¾¿ÞŸI,¤CÃë4ôR†ìææ}ÙibÉD, Õ€¸"çFI;ÜVÍ|—œ£@GòÅG7ˆ¦\$%¶0¢DfÃTòêö­Ï}øåXßÒ}+ä`,Z‰kA0„ Á|UÚE¢+z‡~Z¸€+¥òc™¹Éû€ê`B…23 ˆ8DSžøÍ` PTDQÁN©(t*G€àœ™¨¡7Å$…X‰@”¯ú9tõŽ7QC¸ŠGAÀd†J\ÌÌ{Ñ©T2EÔ\›í¯€`¬×9ºf¨iDD ¨ZTÁ”™Y@Àe+Ž ç2¥M…r¨m¥ >¥j½@g‹Â0Z,P xCB ϰœÇÔÞ»ÈïTérÅãfؤºå…):n§¤+ŽQú~,ßyëâàð…ó̓¢‚ xI¢ëmKÎÏÅ‚¥ï‹bNÚöIƒ7,ÂŬÔd>Ahû šŒœŒ½gð^Ô‰-¤–ÆaWú®C_™Y*¡æ=?ÏDµö)»Ðæ=…à›î²fDÓà=9ÉRÒÀP…­Ip\7þ¨7î<ºØ=|ûQ¿éBísC~ßâÌ”¢Zòñã‹q(ˆŽÙ‡‹ ªj$Iµ8û&4A¬1›Ï¾öèòwþoÿ÷ÿå_Y-^¾û‘»»ÅiRΪ`Z‘…le€q„1¸ØpíÌbVÿô§>úÚs÷^}þ•zzÇðèôwÏÖ_lNÎOÏŽ>v›‘sΙ†‡OÞ½MÝÌ~ì¯ÿðÞª ŽÏ/î?xøèüò¥—?óÍ7¾åW󽥿u{Ù,nŒ]ùÎ7ïß¹s¯ÈPÞ¾l»‹‹5ýæï¼{çî-E7އ«ý½$»&îÝ·˜¢jé“=sï¹o¿ñ½ƒY ¥¸àݪ>ºEó··”[ƒƒè7ãüðhùèòÉ•€w`ÔL<å9 ©QEšz˜0­¤«IWU½iù˜O‚ÙH‰ˆDUÐÕf†¤äœs föí÷Ü}¾]·‘Ýü`¯íI’HUA`f-æ¢s‘ó8¤Ô£a`"rC)ª~£Ú¦8+‘eþÎ7Öã©|w»qC8_¯õ|M·öúîLF¨}]T}ªj6²#S#)b¦Ž”½™‘ðÄe7ÔQ£cÉ6Ö.˜™¢z&Pó:RQh‚ Ø#ca<;y½~ÿr›li¡©_¨ÑÇYߣTD¥ëüBWÏÌE2ú˜kô0¤á¢Ý®‡nYA LԔܞù…÷¶Û‡§ïÿ­Ÿÿ»Ý6Í ÿ­þ¡•›h®j • U¡vRÖÁña3ŽÀÛ‚RÆ\.Ô ›!Ыr¨Ûþ*PÙv[Ûn‡B)Ìh¤µÌÚžƒö&C‹•WË»d©PSÍ,K*­ãNU©Å,«¹º.…XÙ’l‡ËÙÝ»uCƒæ?2ì}7¦?I8üÿ¤?ú¶…@`2[Ì’æX´@Pœ2§¡([‘P·ièKÂÈ:Ó`%*„Œ.y[¬æJ$¾2.˜9CË ÉÄgqÅ#Iîj*ûbãe DÀ@qì+®ëÆ'”Æ{$’½!ÖMÓL™u]+ŠÍ©›_Ïü¼±Pa½ c#,ylƒóÃ"{rVݸ¹ÉðÛo|§Z…û·÷¨j¡mÒà¨Ð_zþ¨Ò-ñ1Æ s¬ÓØ"GF ÀˆÎX³J¶(ÞÆ‘Qc œ:œ¤¨ä±3WÆ1ålÎÌœ7ÐÑ œ’ å Ÿü¡ƒ»+ »!+!SúÀ°ÀäBŸbŸ®‡JþÈéj%| ðU”«îò»™ÐÀLŠsî #:‰† u¦F8Ù1® O"`u^X} Òü”(jªDßÏf{úCS§üT§ŸŠ¨éQµ\ÿºÕve¨öüi·TÁ‹YéC‹Ð¬ÎN¬pXPPsU3 ä‹ãÓªÞ#MO½é¼Ý^|ä•ÞÏÂW~ûë§—yØ=Y~þ£Š³ƒ&¤‡¾+ÞWŽ+¦X…(-«Â°êÕ¼o‚iÀ{òLyhÁ“{z×!„4vcÎÛ>Íê¹’Ô¾È2t9íÆ²­óãõ)¡Ÿ×uÂAó`–œã¡ïX Bq ÎÛ®Ûª+ì‰èÞ×m·kÏê}Þ_VûͪA‡¹ª±bß„Ź晽º{œ‹e1AH%9ÔìÙ1;)ÆLÑù:Ä@Ó˜“ôê=0;F/¥UÀBnq³?ëú‹u üͯýþÿþO¿Y}l ‹z1¿óÜ3eæê9 »î;ßùÖÿø·þá{åäôìµÏ|rèÇ5ØöÓ°š×l¥ûÙlf³ÙºÛõÒ{ïÍDDÜÜs©fWqq:Ú¶”C_÷Í»®[„sö,ÌbtĵÍg‹vîKûa¬9ÃÈΕ’'R™ÅÊ1g1ö;‡ªìIJ®½.dçœd£B$€*ÔÐLZ­WóDPü€úc¶ˆ\ÇD¬,CrÁD" 1*¨EŠ¡p·†Š4xÃ(ƒ*úЃDÖʇóã³ãom·—Uu7Ö¨æcÆÁL "2)»rS7£ËDë+…@ÍÀ%õ¢DÕáÜ:°0¡ó€™sÎu]§”б(Œc±Íî#¯>ÇãåÐ]îÞRœ°ƒƒ#ÊÌâêf€ƒ°˱»xõã϶¥½Qï÷±¿ÀrYàj˜Åg_ÿÈ‹Ï.7ÃñÉÅÃâ±'7“„Z‹Žàzsè¼ùþ²”žKÏÞf¥%2VµàÝh—æKÁ’0ö¬–< fIbÊ%Äâ%º6ìÀ"ÇYES´ôAþé¢ÔÌþXج™Mއ§õi¿sÓàbR&˜2î™éäþœZãf@€*ÊŒRPMåšÀñ”ŸS–<‘Š1Ñ4—¨jpÝ”¹vË"=Ý|Ÿ6VTÕ‘÷ÞçœŸŠ§ïÿËDOïK!Ãõ\î4±ffiÀÞ;Wò„-7@C«@½a1Dkf.Ö¦ªí¦4cb-ÆÅÌ —¼?o‚sSiËùº[_ìÌUÖ,·ä=‡á|;n/¿ûÍG?òg¿ˆ~db»zßPÆœl¬çq·ÛQ…©/ín¸pΓ,¢g¦Ó˵¢«° ’úƳ§H GÐdTES-… *ïÓ06€ Å´Îz:s-šPú±áS1SrF¦ûç’×Sþr1Q”Ñëað>k¿í·íØw>6qm1µ1—µøÆxqrrÿó_xΉ.ÃÑ?<ä¿ò—¾øñϼú+ÿÇ/}óëmš=dU7hØî.ÛN©ŠË¶íÆ’ÿöÿüåÚÄ;XÔÕŸyíùC÷ÊßüOÿNØÛcÿÌñû#Ȥ˜u¬—ž¢/™ˆÜ”É®,¬†–¡^Ì+zö¹; J®\ ¾êÇa(ùË¿öËýV4•Ün¥ ŽÃ&—åê £5U©"Á½f~‹Ã‹÷^™ó›ß|sZ>UU‰H)E¦œs؉v»Ý,€E°?d6BÄ d¬SØìutíÓ§¯UÔÄÀ¦ÏÇLuGTÉ6Ù¨7Ûô•ß{[Güæ[ï~i÷ÚéÚ.ÎÖÍ«/ßõØ;L¿õå¯<>ƒÇ˜ýåãOùT  ŽÃó/Ü}fqÐY6ÃsGw«}?›þ£/¿ðü[Á-oÜ>¸Y<#±(æ#M SDVõBL !M±Ý•Šf/ )K)¹”¬’ÚôêPQÊÔ‡-£uÛ¶?}øèþÙ0»±Z­xFßùæýwÞz÷ìt=¤TǦ”²Ûlo¾xÏ{_TÌ»íùÙÅãR»uø0‡1¡fÇc™¯ø„9^n»öŒi?üÂËÝÙºÛl<µ]9³,Ç IDATÚîFç•Dµ}﨩n-ægÃ¦Šž¬%¤ªtÄuÞ÷ѧ>ûñnÜvíÅ£“ËÙòðb³U¶ ‰ƒ¸Y%drí*§jŠ54Èà¨T‘ÉT³”B¿ü/¾ý`ÔÎ7wîÝûÔ³·—ýЧ¿øßþ'ÿù¸·_ß<8yï»aÜ¿ñ5:{¯*=¥Í‹/?{þ½‹—>ùúü7~î?ø÷ÿ=>XqhçÁà”Ò°Ý.ö–Nœé°7wƒ íñ1”Q‹t½¹¸*máâ‚3T‡q6› Ûa±XÄa¿ãd4Ôì·›ÍîR JDÊ©ÔìÕL Á‘˜”L}ÊDä+R¶ ¥¸j2ƒ9w˜ÂÌÕµŸ‘Ãì¨ZÜz뽓HQü€õ^êÈ©$/#Z!ˆVg'Ì ùz“´Rt¬ÁcÄz´Â`d¢¥æR ýpr´÷œ¸æ¸;úËb®ö”FÈDìz`W4dÓâÃé|·¹+_ÀùJe‡:?&訹]É5×Å2톱†Ø8É95«ÕæÑյ̓s‰1K"~éõúÔ«õr.£Ó4ŽãnÝ]2墘éÛ®©/‰j1ì¬<éÆ3uRJÝ)o¯óì€hë?*@†ŽÊƕ֗¾$Ô—¨Ày¨Tæq†UÀ #{VÉ›ÀKÍg+gé r‰N;§æ(0ˆ^I ZRµÙua =²w¦\!‚¤VŠT(€FL\HLÁ'©>U-&«„€QÑŒS#^ 8.cjÈk6@"JiÑ›X1R¢«Ã 8EP0UC ÇCŠJVE$rH¨ÁTlò0™¹)ßE´ :4Tf.šÑTóà'è"X¹r€0˜ )Î9c‡f¦V’v–ÕG0Uc1žŠ(±d1t<àxëÅ=†ƱËŽ=§1³w¥˜¡ŠE3P¨β±u¤r7¼ºÚ¯ëí.àÐ̺˛Lã|02Á16³ËmwSq»iCA"ÌÑ08çŒY\Lä€(êÉËE’€);ïw]Û¥Ì@ŒŒ"{%ÍP|¤¡ï¹„¡—“S n-â|ÆeÜô­G ÍÌØå‘€¥$6c€•ã€*×î2y©À±\°.ê0Ôº]7w¾?¨^Ìrîƒ|ásŸûâ>vx;ÿ½GoĸÊë\ 8-&´-»Mƈsñz3ÄvwF®Æìj¸²ÕGîÝ?ê·)CšíEÅl:XµèEi,3_—´k!G_! Bb_þ¯ŸŸŽ·n¼ôÅOVÝðÞƒËÝáÍŸ}îîáAãg}ÉœäNh¨uXºõ°õ¼l¹KîÿÞ»°èîɓӎ6Ù‘¯Ïvé||4’©ƒQNŠQlêº]¯‹ ªEv&¼ôðì³·Ø2ÂùÞ·ßüöýÓ³ÖÅ·žôgÿ×o½ÓÎÂ’ÀC¡²¦!s/R97îFŒU¦Bed"E3°„„zÈ8=—ª„Ènj•Ò4ƒ~udÂb6M€AÈÙ åÁ³Ö4ã8ÔÌ^UeÍä¾ûÕo¹þ'¹œüó_ÿzU}âÎ /õ]évw_üèW~û×!ß¹}óùû§íÍ0Wµ2”õÉÅñ£ák_û^R_ ͨÞíÞ¬–sõøèüÑþj>kBDòàÛíЯóÑþ;YK Í«…Gs5딜:§r³©KIcɳåÊÈ¢óÁJiÂ*Ô‹y½¬‹æho>G7›=»ùìK è«È‹¥ÝG_ý@)‰±„1:te©’ÊЦ±+}69 {KyP1kû¡dýßû½÷O”×mûã_ü±~xãÅjϽ\Þ;~<[ì=|r –U?îòãþ켎ûµ×$ÝØÏWM x¾p}OcËù"â‰ã»]]Å:W}MÁÜjÞ¬Ko¼ µ¡-X‚EoÞ—0¬fó`ÙrEMÒ‹»ó©?õ‰Ý>xáæb/¿ùvÜØ–p8kîÞÒ:@Y¯æyvý}Úô8›9ˆ?ññמÿŠ`ç\}1,_~ÖKÚKz¡½–¡ÄÙryqÒEƂłg'ªUðÎâVÊc C?æ£ÕÝí<ùœn_Æ…ÛüÁãÃj~!&dçíI×Eüi{³_Û²+Ík4³Ykíö4·ÎÑÛ;á°v6å¢(g>%•ª$(@H€„ÄBHHÀŸ)DI JB)%YBdA6&³œ]ÙØ.;Âv„}sûÓîfusÎ1ûÜëpR%¥rëÜ#suö^kïµÖk|ßø~»$&̾Ó %e&@2F³Ún³˜NÜdÈÑ´Á8„†“Éas¡Ÿ=zãßýí_û/®=nÛò7Uø8ª¶½j4CµÄÅPÙaòŒFKßKFxØcTOæ=* .—Óf߇}÷îÝЮÈ…’Wµ‚ä‰M¥HpÞÆÑU5î&MˇY¥˜A$; ¢£¤ãX Qð»›gÛ) ›´Î}ImšnlÏOö_W,óYuu>Eõˆ^8ç ›Ñx}Rz!®‡!9ð9‹ˆLš©È¦šÄ³Õà²V‚.“!çɇjÑâ˜UIÈóFΈÍdDÐIhÙh/©‚>èК™u]w°¿‡ˆ¬ˆ€Zö>($@`ï(gØ¥aènò5g!r;ôÃC­C­ÀŽy ŠhPŠ á8ŽØvàÓÂÉ_¹3û«Çs»ú/I MF˜‰ðoéîcz¨Ëäœ/~Tä5ÀÅ.ÑÅÝ$’^@ðh‡¨Ùç^ÈIò£÷ž»Ì4"P³c.mtU g¶IU™Ñ³GJ"e—Äö0†Tv Ýp"¦4ªjß÷…ŠÈ..^íÁÖi‘ÈŠ^ÚÛ?ÙÜ‹žpï Fe|aõ ¢H†jR.sΚ‹ÝažTLŠy“4…à"“—ˆ¡ %v¨Eœ÷ŽÉÝÖ¡D‘tÇ6"BÇ`HãêÍ]ºwûþõÇ>òw¾øÒ—ÏßΛuŸ7Õ|QÇÚœŸœÝº[Ø×uôy¤VTA ƒ!äaDÇj¦"J:èP Ð+/ÿàå×¾_•ƒc$"B r‘L¥ 9çÈ0 ÃÕ@upª4¼ô¹çó¯¼üƒËü¼ŒËÓö7^½ytÚ?þøé Ÿ¸f¶¹{ÿŒýþdî]H³ÆÍšË5!2ådþ €²Ý­ô`çŸg$ghr!Š£˜î^çî뚎e¤Ð”¢¦Ðž·Ë€nôJl;º©^”Y;üÚn2ÙlWyì6x7Ë ª@;w‹d FCDEаÚ\Ù;8=½íx·î±!$Ë””T :5Q4UÅ,Õ!ca2ˆJlÈjÅÌØÀ)í2¬XsÉ9g“ ˜H%²ë’ªšòÎ$;ËŽ!1ƒ‘ç2gt0»¼ ÿü?ûGW/7_ÿíΓòlé«ùþþµIݼ}ûØâ!ð Ç\rŸ) ¨ ) ‚YB–¢"£ €X»zÛI†èØ´Œ¢ÀäL aÇC¾Ý¿0dÊ!lD2[Ð|¶üæ·ïWK=9:{ü©ê™ç®Ý»×žžž^¾ ívýéÙ¸IåÒ•f8_ÿÁ7¿fã"TͳÏß`§õ4\¹zö­£{š‹ªU̹ã@!øÀÎ d+bÅ#90GÔ ½-Ðo~çÿù¯|ë>,Ÿ?¸þ$èA5Y¸5©‚Hf"p•Їù!gSC-TÀù±ØéÙyÛ›Ô“Ò~ŒÎ‡õéù¼™°BIyoZŸiª+ï F®°G_… „¤ÛÙ.‹˜"‰Q—¤aôÌ…Y-©öR\ÌìˆCpJ#X& .Fª"cÊ9å$¹(²õdª䂪¢…¨Ë©S}ïí×·íú_ûêÏÿÊüׯ(~¼úƒ«ZTÇÑG7C‡ž ':ADé3V˜ tD<™ÄÁ*öãΰˆ»(r4·2E0ðØûI½\·ƒv]ïm;RvÉçëu×/—{:ŒƒµÓX5{1º*úÊY™2í_½ò xk«æ«¦š‘3ŨJæQeÛ–4ú’ë\ª¾gÑäÞyûi³ÀžÆa{íà}\ìÏ« hªæ<™‰ªzïK)GGGË«5:ÇjP5ž€†¢PÔ£Ï] P4Ö Õ¹”RrBD.J‡‚ªŠ”’… cfÊ uˆeHž|Þ¹CÌD¤ªBÙ'®}~”Rvõ:†õ‡iŽÞ—4ª*_xþ/r½~ä†ïGÐ4¶ƒ‡ãÃÇÀ]9I2@ƒ ÀDl@ìÌLÀ$#Ô]à>Pl࣠!º]¸¤nµôòÄc™Ç½:V) ) j;C+¤<ìî*Ì ØUMIvh‰”R!ÙEð+’ ¨BDp„à]Ñû7oÇÉlêŠCJ0Ë5©xFfR­z«Ac­‘ZV@@Q4"ôÅ»@äÌÈHЦ2·Á;hHS—[UaÚB ©%"‚IIÛ<²ÚùIåڀ̪Y H v¥ dPQs01kÍÆéõƒÅ Ï]n‡76ý»Ô€øæ·¾ü‡5~r-ãïþÉïO®,ºUŸdØÌÌ#ºªY ˆ(9vè,aqj”Ç2æ³,D&EÚn×FìbHÅ0VàœëûþÒ¥K;o„jF+hL@€¼Y÷Óæðòᣛ‘g‡7ªÕɤÚþ:¾·ÖRûòæKÏ,oÝâÕ¦}òÊ‚‘ž˜¾x^þÙïþþÕ+ÏGÆ÷ßyÿ/¾ùîõË?u8ýó7ß|w½]•áÓŸ~æêÜ}öS•Ÿî³o@¨ÛÊåë(ܶíË·îo†Í¤ªc¤(†0Κ‹©Cóþù¶=«š½{'-L¶Ç ]Ö0¿ñÈ#“¸H ¤t°\6 7C‡¢™e)YÄv)àŒê¸8•­dû¦ÒΫŒ¼;Ñ8x¿óYrÎÙ3ëzµ2³û÷ï/Êbë÷îÝ<¾{'UÍå·^»?a-к †aýú÷^Ù”³èÃöô|Ù,¥oÛa+©+^òÌÏç^ *)d©­ZoÏa ÒÃgžyì\ýå›W–û¥є˶ä-RÃ6Ùp]5õõ—úñý9ú '„KAàq9Ð]h.ï?úÞ½íjÈ8%·¨ŸLÆasÜ÷=z¿(c#Ù`æV‘uŠRRâPM%a–±Ë«õýƒƒƒÅÁÔÀÕIR**ш|%€¹hÖraÓwÈàîÖݦ+â4ËP}í«¯G°áñÇ?Ž èQ[‰s‘›“uçz|~ÔeÝß[,&¬íË¥ÿêæªÃ«×JòÓ?q½~âg>³ééßûãog‡#C=k8NÒÙÆ!0"5ÄdbÞ,ÐòÑk«£;I³1‘ÚW¾š<÷¹Ï^ÿ¹½?ø‹ïþʯþìÉ[ßsÍI94À•Y¾ÞÍfûÇG«'°%U4ôÞ/ôC©šÉvȾžzDcˆÕT®\½vóέ½K{Ûõñb2Û³qc®ž@6«v“Z aÛuŒ†Lh]£Cš W—FDu(¤ŽÂl™qÇ×…¡ É8ŒFŽiÖ@¨ ª”J®êɦ ÉŽ1V8C]-înÏ ÆgŸzâ»ßùÊUQüxõ‡@¤š)"†ÌÁö©/]ìy,8QÈä£Q]¼ÙÇ (l·bJ[ñ¼Ôó^‘zÛ°›Ê!ލ‰¸INhŠ<æäØU;E‡dt±Áh 0 ªj%4,^·Ž<Ìrg~SÆÕ83a(‹Æ7—rÎC×9#I#(¡«œ ÆÙÜKN>6©¸Z·Vùe¨6Ï?åÓÓËà]gûüÇPu’X3Z—iæÒº·¾¤Ê‚"+xìrDåRS×iÃÛ©Ÿ¤v0æÙÔp‘äj­nì8Œ¥Q&¿t÷º³_ûŸÿ÷mçÆ4Ë6­g â8òV–Ú€ùúÁä?ü~ÕUVÕ â@E Œ‘\dDõD¨ãÍ@ÉSvÆŒàµdr(*ˆŽ™EÅ{ÿ`ŽW<Žj¤¢€„È€ÞÌ+’ €;DEMhY è» |ßéH Ôt7\h° ¶3FÂbj¦ü°‹!fåÂ'k;]Ü²× XË.=ŒQ”‘ÐvÞL,EDa‡J1±ò‚ïõ÷f3ñ’§Î HìÉMµö¡ë¶³¨(ä øÞ°cš“)“UÓº‡cÒbÅÀ*õD½ âÁµÃWß<]Ìæ¥ kVC&Ð;`OØ“bÉšœ©C›ÇÆú¶ RõX²U€&-†P÷ŒÑz*Vc5Œ[¥IA)Ô¤\„hÕÌÂåýÉÝ“{yvN 5'3lp/ç1Æ*¸4n‡¢ìðSãçóR¥g_||Õ^Þ»ŠRGOcªßþÁ]'©vŸúÞ×7Ÿå13’š(qV\˜Z)¥¤ýÊ©$S(™JqŽÀRfetäXXÔ.²YvÜD熡«#ÆÚ— „&Y=×ø•opõƒ7Þ?úÖ»]U•Š{’ŠòôñG.zpvóþùzÌ'Ûáq|Ú°xT…Õá¥Iôû•­_|îÚ³µÕWúy*7õç>ú™öû_yêñOœ¼ûýãn݇êòÓדt÷ï?v¹äò’©á©%(ß¿}ÄL'ízµ Äý+‡¸ƒ”Öáìì„üåM“àPªM OG•>µ¤åÊA¥y;ñdIMÔRåÝ~¬ÛíùŠdeÅaƒY¸Æ”J’$b¼YQrµä]>Ÿ(3šAF`U(YˆA-9 (hÅI)M\x<:Ø›/j˰·Ø]­·w¼][.ßîü½N÷=Ôì•Y›aÔ{SˆZrå8N&Iõø´ýÞŸü`2÷—ÂO>÷Dàí¢žæÄƒc¨Äêµô"in)+±Àmí"Ž¡‚èÒ˜K)ŠÁ;Ž¢¥óu½elêMRb晋 )ɹeªšÁJë{hª¸hB­Ó³ j2ä9”¾†wßÝ>yù“!r¨2ih,ª‰öHŒî¼·X,Äó1&¼_zòo£ÿÞ÷>(eap6g¬´®âcˆ»Ú? 6`[rXï…m.‰a>=¨=Û4b¢±R è*3œÔnº·¨°w¿÷þö»ïëÇ_ü„®‡ ¡«%wX\N@Þ5€Áƒ !”±ÝÇ\/í0æ8›@³ÄûëGG¿ Ì„O)—Õ Î}7³ý+Ç·Þ7ª@üÜû{«óó¶¿{|¶9ZÕ4ÏØ<õÌcm¿jWç·o~p0›lWçoÝ~çÆå«³ºñ1>~m/kYm7§g'ó½¹"÷$ÌB³<=/õD Šf¶ÐL¶÷·iÍ{**]5—‹@@EU+‘9”âÍ$»¡Û˜r5™"±lb=öãÃÓ|7 KD»Œ;9ÆÀvÙ¬ "Þ33/—ËiS³ŸN—ʸ>9½ÛKÿäÓyó­q"fC±&3B¸ô\„ÑUU·ZêÓŸúOÿ½û£Ïߘí»ûï½ýïÞ}ëÝVÃ4TMÛ´ë8?ŸîMn\ýȬô/¿öÚ|1íúó”Dß¶£záÒ”ŒÄÅVF=†^]D,Vœ£I¬—“Å„sÄX­‹æâçÍ,+°ãÈd¨à]d@„ý°šT³H‘Œ|ˆÀæì8$*ãØ:¾Bsew£^óâP\íÑ<׋ɌKdŠÈ–Š Ã¢±êÞl‡ÅÞaà2‡Š/IU‰-’ó9-öë/þÝŸûOžý‰í¶«£6ÅÅÝÇá"3S)  ¢ã0t)çíeD IDATƒ¯ª©å!å\ÔûœU °ˆµmŸ³ô}®cάB„Üw€Â9Öm‹™„ÿÖO/f×Ãðßÿ¯ÿ]ZŸ ?ø†¥VG²­6§ZÕ1Ò8ôžƒw”R²!õ˜ÏšÔ€’1fOÞ; RÌ 8ï ¹h$'†ÆÁ˜ØSVɦ³8«Ð™‘j.¥d)"6Û«Ç!i\Ö!ˆ"GGª Ê‚âL™Ùw]ÇÌå¡Öÿ×|üxõGйhP ‰*Éi >….†B;z:E4MC ÉšçÈÎW †À ™SW!vÃ¥ïéÜë¸Î\ Ç,2µf ˆ2ës@sÙ™2 d(q2ÁÊÍæW"%ï­&Zòtâ½S ÀÝéö˜ê&DçªÊÍç³PÚníY A½¡s¹dAëÓX‘'ÌÉc c½UÜigíætU†ùÊ›Ggúío¾æÕ0 ˜³óC3xß`˜Î¹YöÂcÆ1gl,z,b"hˆ¦ªª ª!Dˆ1æœw_ffÅÁ¨€ÊÁ\•ÔOÈôáÕ§ïûéd±=Ùü×ÿí¿o~óÊËï¼ùõßýâßž/¶·%E¢ŠÏ7Cö± )ÓEàÁ%lW \ØŠÄUÁ»ÚL‰ÍŠìбbhfFì:#ŠÀš@Bp€ZT„ÀìC€j ¶»†Ú.vÀH’˜™©~¨þÀ‹Ì{þxÑ"ùÐÆ›ð…‹vyhˆ”D‰"J.;œïÃjò‡VUð¨ŽLJ"¶ç>ú´—+æ­í»”ÇÆ{2ÅA„‰óG÷Ï‚¯Á€ÁÌiq›æõ¥Ôf×`pQtÎЉC23Q96û7.5Ëf”LdH¦)oŒ€ÌˆÔEôˆ¤Öå1w…Í."†j—ŠXÓ4‡U=›V2œC‹¡„„ÆÓ‰Òåe“ÕyF»mÎn:a=Óý#9ºÍ¤‰S‹XHs§F±ÎgËTÆÐx""!{ÍmÖÍÿöO~Ã…µä4ÿȧßxí¨ûÒßú{ÿÕó?fW®||½:F2ffò%{„iwŽ´¬‰¬)E©BôN ¨¢š8Çn!8~GP%rJªàœ„@‡RŠxF"#ën9ãn}µYî7Lm ~}"4X¼†H©Tnh·«Ùd?ýþ÷ßß*eYüã_ÿòç_zô³¿äÝü/¿þu|¯n†¥Ñ¥WÞ8òöâÔS(ëqo¯þâ/|öË¿óÕ½ýæÒÁ#Óùôý÷Þ{áÙ—†aüƒ¯~ù§?ÿy˜âÉ{÷·ýÖÇ0¤“g¯-/Í'Õõñ ×·ï)®†lšn”o|ëÕñþi[k;äÑh^qmœ¯Í©)BpØ‘C.èÔ7UŽC_5S C$0f£ˆÌ1F„°?ß»\“+ß¶œ¥›HX”:+ô`³"¢*D"Ê0vꆥò•‘M§,¦„1äh\ÅØ0Åõªó®ŽÁmeð¾>[õuÅÑ2¢,g8Œ±ò‡ wùÑ'Gœ¼õú;ܵ¿þkÿËöäèþ‹ ŸÍ/ÇœçÜpÎÓ8Yo×'‚Ö¡¢Ì‚ÄÀUVJŒ¬*€J,õ<ÞºyçåqÊgí™™Ý]±O\[¿úÆŒ'7>öä+oþà2ƾò°'‹}˜ìÜl×ç Ò«×OëˆIíõïoWÝüöyóÝwO»õYn·ËIâãÃ8nÇÂò±çý©/<ú§_ùà'¾ð)¶CåhR)¬D#N|?°uš80 ‰Ây*œGcXç¬ì\ÈI‡^”§†Ä\ABC’¡ñ-5~cz\OúæÐÝ\<þÈɽ{Š:l3ç˜!IÊ2Àpçþ{ßúÞ÷n¯¯}ìÕoþà£Ï=éâÄd‚rçÇq¹œÕNFEpº^=yåºßÆ1‡P(†™a¤f"›>7þJlF)ï\³ ÷élðc²lH½ŒBeÝ âö ØÇÍ<± Ç‘FMÝØ.xjE²YŒ¡$nüRÝo~üàùÕ½MŸj0@ý›Ì_WÝ%Þ)šs.N§8ÄRJ‘aèGÀB¼æœA~dhb†9MÎÏÏQJiÂ\Æ}/ê]_2¢aÖBĆj¦¨Š`, Ž,YÖ ZzvœÀFå2HÅÆ€eŠA–2 ýã[ô“G‡¿ûÇ_ýƒ!~™ TFVçHg³1±XDïˆ÷ööâᾫãÉñ¿÷·_ 8Ìö±ZlÛs:=oÙãX ÙºBžNÈQúqL¢`¨Ê"œ(pˆN ˆŒY- Hà¡”bâJØýc$f+¦jÁêˆ„ÊÆ‡©C–"9g–Œ¹ŒHæˆ ÈÿÿÚ!ÖèAÀ×Ew÷C(ÎÄÌ;áÃþ5h·”]„FS̺“j˜/¨a¶’âƒæÆ&¢þðÿj¸›ÏUUAT3{h–„Åž>Ü‹‡ÃŠh¶ÓXð‡J àƒ4HȈ"j†]×hÎéüüüääl—]„Š`j&ŠˆXE?< ¹{éóm ž§ÓjÿpçnL-”æìxKD»Ié‡//"šKN)Ö3ïTM•ëh¨Å¤(d´l¥@b0ç˜à‚¦*V”³y¤Bt¼ZŸ}o¥@U“Q €ï;a³ž¹2ˆ Älº3Õ‹s½co{õÕv{½¯˜Q ‹©ŠÍóÏ|ü`ïòrÊl&¥Äè_ýæ»}wç±gŸýÂ/<ûçß~+Tag·ïÉùyðá`3ÜþÃÿ÷ŸLëNÏomÏ7_ýüf{ögß~Í-.#ÓþõGo©Úý;›m¶YD(ãÞ|o>Ý“1;SdCŽ(†ƒýX“«] ÈÀ4S9??‹g2ï#SÇQÆÁÚM)iêÝÕm»Æ'—x "^A ’Æ ÷fÚž—Xá¾''m…J{õÚ¬”TCŸûÆ7_?ÿêËO?ÿÑ“ÓÓÛï|woÒ|ö¥çc˜ßogÓåtyµ+cð1ãåÞÁ¦ý—.àO]-B‹'žÜžýÆoþÆcÜ8==¡Y¨Ø§!¿÷«ûûÄÍD‹dõÎs´’Ø…èØ oš¦Š1Ð ¦±vöCjô‡OU´bˆªFŽTÌÀŠgÊc"Ôª™¥{wJê`k¾æÖ›¾²Üw›G.]ÿ‹¯|÷g¾ðo®sNM}edÝH™‹u5" åQ±ê Pü„$™Apll»kÅ… @* ¨H¦÷•ƒº#DfT‡ˆ&"¢Ùу¿tÎù HRªëÚ»˜Ò…Ð0tÝ|9÷D¨ª‚»ôj™÷/üÔ/ÿÒÁ³þÜÁoÞ?}r²‡ˆ{ûûgÛ­sNRÏÌy¡Íš=s¤ª~éç?÷ôÙÚF€Éd²Û÷qtÓX¥,ÆÎ9§)1’¦R@™JJUO´+ÍØÇn2©TY…\œúƼW`éú± s_kqv¶>›75öyãš*Tì©–dY¬H"eæS;zïMrñ. 73uŽÇ5@mJÓù£ÿŠºá_ÿø1ù/Î9cbF…’s–q ®12³5ÎDX²–T˜e' ÇrÂw Ü¡ŽÚçˆzMlb €"$HÁ¶ZHT Z.•C%?¤â°‹NMµ:@g\ r$a߀‹Å×à98©i»G®](jåõ“ÍëG<¸øÞi;ŠªfæI•Œò0:pN’¾dÖtðÒcÏ>ÕA=Þ<ÎÿüÕ{£àf³ñfe»º2›ü/üŒ´w³´E! ¢Î¡ñp:öì#DÂ2$MªÑsCDbm·ƒÃÐnólJív°TêÚ×±8ʹO,V epêœú%Ÿƒ!wìIEFfC”\ðÿŠN×®¤)Dn÷ö›ýP’y¸¢?Ìöø+%‡Ÿg—uh¢H•@;1ÖŒÈQþjýa jD»l°é.tœÏ©¢ÎØáyÕy&BÕbªøÀ>òpSw…ԇǀˆ>»ï~û ÿa°#âRLªéðÒÔy{ÿý›Zj#_¸X1Tƒ\J¹ ëí×]:…k& Žê™;8ð*mʼn­)uÌ‘~È×-Ò„8uÊ…¤¨åÜAËÞ¡Cv2Œ[”¢•!©™(#J1!0€=I‚ ýf«¡¤ÌHãl-£˜t„Î!†192¯"V!:dĪ&@Þ:4î]—N:ÄíÑöô™çýwþѯ>õäɤܾs¶\ ÂñÉí»” íàå÷î½úò­®KõŸ¾ÖLã/ý—®]¹ögùµ®ë»žï­ÿ§_ÿ‚®n¾óKÓÃùáa\,ú>{çüìþÉvè¥í*—RÀüÙ—žÛ»riyxðÔó—ûnEF¯¿öö­[w‡nÔ¤=òÌzÓÍæWûŸ}Ùd`ƒÚû\L-Q®š)Ut·WÓ"=:(Y'Í´¸ï,ûË?ûæf®¦}ÒD8挊!T)냾ÝnCäËÞ¬úî«/s óyIŸ{lAšzêãüôn{´61¾u:|îÅž_ýö+ßý³ÛÇéÕÛÃ3Ï߀ì¾÷êÝgž>$>@7™íÏo|&{Ë瞸ú‡'7?ñÒ'Þ¾sÓ÷ßÿö·~r½^/‹™F±xZiAÛlšK#§årîÜ5`š»h’Õ.(‰Þ{|—&Œ` ^Q‡Íñ¦“+ׯ¦\Šh×nÎNno‘f³&¸ýxcoyå6  OöéÇžjfÕìßü$XŽ¡ÌꈤK?̱B>9;}ôú£Â­X<¾¿™1Rí3žÞ¹s+Ÿéw¾ö½ÞüŽlOfΰ¹&-i_ÍØ·w×ï½üúúƒ{÷éû ¨/}œÇ££[E%ö¸Ä€£õ÷OuÓWFIU¥PöÞ¹*•$tz½5OÉaIªsÉd²t£r’àL†žð? º+óÛÕqI¾Lòݳ ¨BŸ)5ØWõræ4—1eS%&ÜÅ7£1 • ƒú"É«ƒ¯Ð£9e!vŽÙRa&ɬ»Qs$)ä<3EÅ\J‘b)Ç6N³‘÷ÞÒ ¢àœûÿh{_Ûòì¾o…_Øá¤_ªz•^wU§b“M²i4EJ¤M¶‚ =´öÌ€ÿ{`Ø `Ê¢%Êfj‰M²Ù¹ººX¹êÕK7ß“vø¥µ<8¯ª‹MIPàwpî>gãâlìýý­õ]Ÿ/Yä¡„ý»G"2šñ[ßùæÏß‹)E· ''º7ÃRXµ®ëû«í1µ®™.7i²px{¶×_ž}oµÝn¯®®˜ïQ!cLSÎ9ƒÖuÂ0[xGöúêª`‹õVEã0,›ƒIÜŒ¾nRÌ¥ï9×0”îü± ìϘƒ„RY^XâËnMÍäÖá­õ°˶²† Æa„ÝýSkƒ‰Á2y06„À'íD VŽÌüÆ3ZÀxó¥¯ü´mŽ‚À¯üÿüþ‡÷ÿ¤ÄÓõÿ»þasÞ°JéSAÍŽÔ(3"Z0ÆdfH?Ú^7M3ŽãlÒd ιR¶¾qŒÄ°Û•"@d}JY@‹ [P**„b ¡ ƒJV°†²hã< U¾®9ˆ ªÈJ,ŠS_1¦I]ÝV$ CÂAª1‚ˆq!!&f°,IŠ’øÈ¨ë6UÛžVÛ—s¨xXŽl}º¸„ýÁ^e‰çTÕvˆº\åT€ Wì ¢LŒPUÕv»ûZ0çŒTr*"`È8këÆU5ksŒtquv5lû" ýfcÇ-5föÓŸy¦®ëlH4Ã.ý_SýøTýc§4ô¯…×ïj!»åœ?]ùôŠ1îÊžD,¡LÌ»ÝA6V\ìÿNõ§ïï²åJI»è8çì'ŽOŸòcw17Ÿü<ý¤Â÷„(ª*Äf‡÷ã¸\lΤä”#ëÇ EKJ*üéïa§~DQ™ö¦RÆù¼‚ ¸¾i?þoùýcdô•÷—ªœB"`@JV”…!³ˆ`UI Dñéþ ÑBÉ™Pµ4M%±HŒh2XÐE bEè(1£XÀÇÌÑX?`GD©ïÎûbfØøIýÂËGÿá¯üÔb1¹óì>™ñýûßùïý“Áµ§y”WùF{Û#´ÓÇ_®oÑ´º¾zØÆxÿŸýnçÙ_øµŸ»ù̳ô'o m¾òê+ï¿õ'‡GÏýOÿû?ŸÍÚçž¿= 6?ˆáÖ+Ÿ}öÞKGS÷Â3ûµú²ÝŒO~ÿ_¼ñÞ»$ÅÊóÝçžùâϽ")ÞóùØÅ¶RãE R,9@QB ¤ …IŒa¤XÕÄÖÕ8?8œMgéN;¹9ûÕÓËñõwî_®{Aˆ!d[ÕÛm·¼î¾÷gß‹™´ÑU]ÿä/¾¥®¼µY!×u+qÝÙ &ó²¸i¢&…µwb+xãî&¤ë--iÏùo¾þ—ßýöÓDÔ¥L¢P;[J*%qe†4TU› ]œœßÿèáü`ÿó¯Ü«CÊPÀpŸŠ2 èf³yÿÃw›¦9=ÛÎö˜ Šü¨þ±+L‘¬È ¨0*!¤írõö'jy6÷ÖÚ»·oÝ{é•^~¶Œ³ÄEðèæíR´]̾ó­oïÝÜà IÚöq}º~Üž¯»­›.ö÷ÖcúÇÿôŸü¯ÿ(ç¸a»Zßrÿ‡7¢õ[€Y3ͽ~íÿùV‹øìÁsá¼ûÞÓ҄Õf°pks‘ÛUMµg¡sÆÇ±¤‘Wë@]¡âgõ~ €b7µEW±€QCd?)akÃÎYk‰˜rR—£‚1`Ÿ&NjãT0çœRR¤<†AX‰IDQmE ©Œ)JB5¤Þ²¢ØÇŽºÆyFÊ)’  E£ªI}ßs acr’Bˆ1bέh®¬cŽqEÂ]cšع*Ei”ü|·Ñ”¬AÊâv”ÂÞNoLî_¾þx¸æ!=ÓîO®µ¯kAD¢ã|>?}ôþd>+IrÆ LDŒPYÔÉd²KíöÞ—Rf³™1¦]ìO÷×ËóÙ´&·DëG%²Ž\Æ„¸Y­û˜«õÙ“Œl®x}}úÍ9ÏcZ‹DV9Ü›œž]©ÌûLç‡Û¸Õ\rI¹°£Œ‹h$õÙUÓ¦nrIC×[ë¥$P­ªÚ¿øê+cÈÌ2üMö_L†l°0hB.‡$q"-¹B®(DÈ%ôóš{N  $ÄB έŠ1\w«^ׇ“³ ²œ{Üdp9Ùß}J­B6qUòS dÈ!€!­Ûºj+e$cPÐK4³ÒØQÊeÌUdfÌ)€±±ä!è!{“°½\gË™¸¢bì a5F æ6Î'UÞVWlê¾8Ë)ä73o¡ Áޏ¶iÜ8 ž Xtˆ™ÐqÁ £€(1ÊÌ¢ ¹®Ï6C<¤ÕfÑT6N‡Á ¨1=•ÆáBóêñeÿÆÙ7u;Ë#Zšž_¬Þèì¯;HbšnXåÁ,šqÜî¶%¹L›yŽÅ0ã2ÀÎC Å›ˆD„w4eá¿ZW‘ÌÌ"b!‘¬DÅ €pcñéTµ¢äÙ •\˜¨äÄÌžYUw´Òœ;c ¨)™Œªíà¨;¥²ã­±sUE‰Xµì!M’ôiˆS-ĤXv"òÇ[¥õ$ædŒ²ÒÔMºeÿÑ;ýæ¯þýã£ö›ß¼ªª&¤F‰ œoö!(€X'PZ¶J ›ÁÞªLµ„ªl.ñ¢?…BD $„.K¢Qˆ(Ýßß?»è‡u´`˜4èÆ©Õ‚Z˜A’h`Õ]â)Ô ZB%¤Æ SâRF -.›Œ5¯ì€¢AbdšÖõª÷вWWÃñÁ⥗ï¼ü¿ôÒ½†Ö{(n„pyyúÎkß71›êŽ»5€Iœa‚Àû•1}J ceÜ•Bh¦ƒ5Ó[ÏÜ’^û½¯-î¼ð«_þü«/Î\¼ýÖë7¾úë_ýYAÿùŸ»ùÇ¿öÿÚPaœ-ÒeÖ'—ùÞ£÷_{ƒØ}÷ÝzÍ+ÿ¥gŽ>;1ñƒG§]du,®ª{Õ¾íg5·™Î[8¤E‹ˆPb‡6‰W"±ÖÅdPëQ…ÁÚZÜèæq–%‡ói]‹â e:[ŒýÖÓ6¦Í Ÿ{¥[öO,O׫“ÎnG;-p… ?|´¬ÙT¶%e²™mÊûU»InXž5óTìÕsÇ/ÌRÁrqó Né™O>¼ìN—˰Ynë½aæ=yÎ"Û¡ß?ö˜l ׋jæM#81&Æ-eË%£+–T28 ¡›:˜7þt³]v×WaÓYºyóÖÜ”ŠwÆ …XXÑ’± ÜP›joöáãóïî«\†ßøõŸ~òá“G¯]a‘zobçÕþ!ghɾô³Ï}ýï”ï›CXLQ\êJ¶oÃi™·ùнOgÇ·ê;ë•:˜ž/ê_ýû¿™-mÒõr1Q?†’½Ät‘–4Móƒ$äöç×Ûåz½>YU•·ov¹|BãzÓõ9Wû‹â¦'çÛËu?„±³¨È ?±ìŒ7ͼ핞œ,³¤Û2;ëÏO.Ó‰mÐK<£ÂM3L§9Od‚k_ü`L5©&Ôpˆ[ÑÐ8ÜknŸ-×yݼÔêºìõ4v6ê]½Ÿ™T ‹lJŒ2F§:™.‚¿H)j ¦&&Æí¾â IDATcPHrr®ß®Ž¤ÅpV+&q½^TÇ—W1;®ª6­VUÕ´óÛzþÐaJ‚ÁTÆH¥”càƒÊ߈›F9/áÚâlîí“Õõô`þàôõÍ\Bô¶®£:o&}Ø"ªäbg­–¾¯½¿Ä„9 ›¥pìsp:l/äÍŠM¶#õ9_/LJZu›ÃÅÞÙ, Õ³ÙϽõúw¦:rBÂrrf¬!¹íXš­16lÖ¦;ö¥›•F„Ke&U®¼Vbν%Vv`½:—R9[nýþm¿wüðb‹kÇû}¿?ó7¥?ˆ…‘f.Œ¥8çIÕäd‹áœSñ˜ [ÙÅBPb&c3äz>Ù¦.™6amt*}_XÀ“5…-`6 ‚R KÖ@.:$À•µ¾j*ïÅð2î5²(¦„>FèÙæ¥”’R²ŽDC"oÈ2×òsF‡h™P±çle-‹/yã½e&â]ª{®j·î7¾ªÂj+9åœ1ÐP)* HšK„’X‘U²fUÜå­øÍÕÅp4mrÚB¥‰s¶Qs.mbɤÅNd ²ŸûÂËÏÞ½U9_ߘöÉ£Soü£‹wÁ—ÇŽyvvyCÇFE‰Ù7Õ”|˽Ñü´ž¡'äŠì(ßð£¶È_­Oü•ÖÆÇýkí8Ž;úê'ïî^?—Ýic ÒSDôî¯ïz–Ÿ4P>þ•™Ín~öÓfŽœîãa)`ÌÒqÓ§R»v'ú‚Ü)PQÁ%áÁ®Ð’T‘Ô˜ô ¿ü¥é>ÆüX1ëeƒ–"ˆÈfNÆH’"1gQGÙèïýá׺pšÊ™Çf^ݹ}¼D9È@J– ª†TÄ`?tFÕhÁ’Y fѤª©UVV@«ˆYIQ UŒªQ¡"*°›/!D@Ø Tƒ”¬À•Æð…ϼ4tãÙêb2=êûð™öΗ_¾óòÝœú÷Â#Yo‘"OÔpc'ÞÌëVç”ãØYR,… KÒKíêÆpÎ…$ö­©Æo5Ó‹Ç÷;8¡Ùb¾¼ˆ2VãºÝ»q\Ùþüòá;›³‡Víø­>^÷e³¹üïþ«°¿¿ÿõÿú¿··¶Û¡ïÇRÙy[IÖS¢Â0&ÑT¢ݙˡxðŒªÄcŽ(Ì;j)™°ô]—ÆôÚ[—#$ÐuN…íP:×XÉ<[ø£££‰ã×í›ñj&M}qu]BIBèf7æÒo.®¯€šj>P’lŸ´3Û’šØ{G†æ`6JF›ºrWF…¾óol—›ƒ;Ÿ=°ÄVÅI±iLÎ:`¤1”ëe7™6ÞµQ6YrŽÞ™”SË–*5ŽîÞúÞŸ|S+Ê7÷mѤ‘É(¢Dg0#KÖH&X-¨éà`ñþÃÕdv~ñD·×÷ß§ž‘Ô¾bÿáÛ§÷ö$ «è˯¾8ië·ß~ÜoøªÑ1WS?µPÕIC×E[†ùrNú¼·?;|æ†p—\W˜¯WÛ$|ã踄XMc¿îzt¶j÷°¤a³Ý¤ÆO¬"XïWC÷ðâ|îÞØ~XÈ8FE«BCD"7l»†RÊOù0¥¤‰º!D- Ôm¶¥+)¦$ý˜¢%oh|òáYŠsîâj¹Ë N)+¢Á2*ˆYoíí5 eÝ 3ĵpIØVûËË«Ð÷½þ€çÌŒ•#gJI#hjœË)43“6x(²8< !8"$&SM|3kêd: !bÆ’KÕ̵ÖÅ y=yíñköÃÛ/¾tï+¯ŽÆe-¡¨„T5Ð(ˆh\ ° BÖœ [(Ýv-×—É™õJœH]c8Æq»Í™gÌøtˆpjŸýÂs“Ö‡ní!Ëò¿ú¿~ÏN¦~1½ ×èôÆ­yíÄ/×{ä•òu.÷~öËÑÍGb†ós)°IùôƒG×'¶ËÓ8,¿üÂMADï‹®ÛF¦}&è¶ÛÉd†Ñ²EdQ±l ¢(h„ P &²,EUT(e)EC§ìèá£aLJÇÌ\Âßœþ0P +2RÊO|§%e „œ )3‘³•Ž#b#%8€ðñÙ&%bëœ[Ü?Ãïüð{FË¡ŸÕÞæŽ@F·-Q¸ˆ·F‰€jÂ’ˆ°Óà4å‡j´9G!Îl«ñÊ0P….çC6µ2sžL&UU1³Hnš&å : µL–È9Ð˜ÄšŠ©'Ç"Ò ©¯ØŽQU5k4 ± ;Œ¦÷S/õzèÀZËäsÊPk-’­F²‹,EQµ.¥²lËG!“Àfj2Níž¿{3šPLJ…³©ÖI$lî=÷‚IÄ56­Ø,Õlý?ÿ/àìDÔ7®ÿíï32L.¥R9ûÿáæ¥ó2DõD—vÙQÒw:À !bù1_ç#ÃÀÌ!„ëÎ|ÒCùXa3I»ú ¨~Ú±±[ι”ÒN<”,DĆvlG*YT#(ònà“Jù”%Ö2ÈÓLQÐOÛ^>Ñð£èø$eCbbbT %=ÿü½wÞzxÝÝ«šz³Þ ÚR²µ•÷æ1®N… P¶y¼üÍ_ÿå½}Êéq…Xºæê"@ÁdÀ€„RX½àéåucbášA5ÇÀzpxc¯nìÕúâôòbÌ j#*¡ˆ"!"Â:±*©PIYuÇëßáõ ARFd"KÌ: Ãú×þýÏ“ŽÞ½úèÑùÃN^¸óÒ̯OL1ˆ2àÖ F-Ñ’±Ä)Å$%I˜T• ‰)¡ÚW«†Ò…!0€%†X¢­Íp ež²Žð;ÿÃÿX!½þí×^þÂç<>3ïoøý?]àíŽüåõII~³ánÜ~túƒ”[ŠcRßx—½17(Ñ%kª*Ö»Ì>'[ å¤C ‹“$-# Ä~Ãj©dgÜko<èdº-%@F,}ðo¤ÃïçÑ/}õ¥Ü_4†Ií¤º8»6ãhSªªÅ­Ã/ÝÛûÆÅ7M?×LMΟüü—^9òôÚŸÿy·F«>|”R±%ͦ7R(Ueã—^þ웯¿™Õ]¯ó[o=9žT›YÜŽ³ãé0\æèsÈ_ÿ³üLùüËŸ¿UJï•¢Þú~»öN¿õ—Ëå²i:wu³×Ô-_zã]¬oݺJ9'"P(Å«É. :X£½õî“ûï¸ÆÊäß{ÿòá[wöVqÌuÞÆ|!§[â„ágŸ½õãûï=2)Vâ¼®³`GFë$¦åˆYA²Ú¢®ñûÝupSµB˜Ë!Î?:¿¾ì–“É, sª·›ÆbCä¦rÝäƒY²¯ÌÁ¬ÊEMÅ‹=D ã6ÖuËrŽÖ墫ÕÊדº®½%%]õÛM·Þ_ìUÎ:ä!Ȳ[YϾ1Œ-´]vb³ye!–q7›.†Âó}ÒÐ:HÝõf½äÿã·çíwo*ÒFà7ÿÞoÕu?uqjÍÐoC̶̘MNr~¹ê2zƒš;#°½Þt«Õ|fn 0}”>l©+s»o’ ¦®\Õ¯¶¥O{‡{*ZƘº “ööÏ™¦³«œ¹ ·éˆ:KTb®•À†¢J–¼ÍÛ>Hd`J7ö.úmQ—uÌ¡ŸWÖ£2qÖf3©ÜÃâhïæxøöùßü·Sæþ{cáÜLüüÖ/ÿ'Ÿ·¾¢¢g>ˆÝJÿö_~o\ݸ9ô—Êëü¯Æ$“ùÑñ"¤rXMö¤˜[6,º¤ÖJ À×Ý!„1spm=äXM-ªˆ¾® V9&“Ñ›Š¸åX:X…2 ò0öÎU¶ÀaeR}{KyWÁ!À¯ÿ$Šâ'Y‚PXc ÎbÉJª±ëzIcÅ2䯴&´>ìd0ö*ã(¨ZQ„Ô?#µ][5øù—VËË«UX®:„$R«à”eÞ¤s¦.bãœI)%†¤rÝo½÷a,VhU©f•.`”‹ 2x‹¦Xd`SOD$tÍdS’œ}¶ T×…´rfÒwU³–½¨´œ²Èzƒ 3kç©,]]-ÚùÉÉÃÊSAñ8z² ¹„ÑyÜù£€“TFq 5it*)+Ìz­‘„8$Gp j0•Ùf¸¸ÚK7N6‚ aÌâip¹Ù4-gÉU"V[»WÀm͆«–ºÌºö *IUÙ±¨(ª6hd÷Dÿ8‰†œ)H!c*P.EÉiΪÂÎNJ ˆÅðNpU&""‘œ¹ßqºr@ QQD , ¹ä…‘DÒÓÚ9¹hd$gÈYÀØ3"ÖzUPH%ëNÜHÑ€("dÕªL†JyŠ]'SE•SJÖÚ’²Ÿ”4D_5ïŸmÎËøGßxíï½ñwT§…ó¬u ”HdÆ\B)G‡7¬wŠˆ@-¸:«±Ñ:$ªš¶!\w‘*ÁÐHÅ%_o¥‹NM³ [-èàÆÂ꼩]ã7ã¶‹¥‹’‹,¤aç()Ѝ!ä`:ÌB†QA‰ $dÐL†–ŠõÑko–,{G7êêæÝ›BÃæúÊ`®*rª÷'Ì qМ!ÄZÙºUŒÆð£Ó[×›,HÎÎ]·-âÄÚ~Û­Çq²¿‡–Ãx–˜ bY>~s2Ýë_~ðí?}Ðý™ÕãémSºû>P‰ÖYý¹_üÊâNqZ¨T¸GíqÕ J—©6”D;ªË¸"·h4 °H²œ¼Ž&ôî£G§{3o§‹ aooÕmŽïTÏ'ÅÙšjÜÑïÚz2ô›Õ5GŒÕ}ãÝŸúù_ð¸ nc o=üh÷á(˜¼(1Ž)ÆÕúâòÉÝçnŽcÿ½7^_ûÙ~»g—O†ys4êv¶O&Ê <Ú»ÓùùÁ·^{ðƒÓ)µÃru,½i¦…4‰F;ˆµãéúöÏ|!ÜâÍåéÕõyÒFÀl©&m6¥Ø@¡ ¥TÖ›qµV€X!d5 „·“º¡¢VQ12³,ÓI#c‰&ëá*ïFï©EEÔM·ª©g[‹klåiìRãªD1ÙcKÆéPR3¥’šJ›þz‹ù {Ú^tÃjut4EMP¤ ’ÖC[oŒã¾BÆ4Mú8¬¦ÕÞvm0ûéd¯ªºES*ImË}Oý¸´5cæÚÔÆ_8›Vµk+o%IDD¦ ÏbÆXVý*w×¢Èib/ÏVéêâòz²7õ-Í÷&Ãf;3–¼«þsÁ˜úý'âµ.›2K¡˜JÁÅœ3ÓLÝ´é‡É ž©kíž„ýôfq›’é&®Äî¬}Äyu|¬mC¦-·ï<Ë&¿÷§ÿÂÉjÚL$Óã¿üà»_ÿ¡5¾©ª‰ÅWM£Ÿ«aêšÂA¤jstãùªºzr ÿ¿ß}SMes ˆÎU㈕ãÆEBlê’RBD&ª[AY´UJ² ær%QSÁ)u¨ R`…ëwÞ;'²/¼øŒD¨ŒÓ°£8ž6u*ýåãtrrÆ céýÌf'Ý.Õ"O~Òì÷]¬¹a]“(Â튣Éå+Ÿÿ[ë«}¾¾ OÎNÏ/·'gïlŸ\ô{Cû¹{ÚûA õ<·[`X5À„S/H'§Ð$jÉc¾\õ3VËZ?x|9¤RƘkƒfìâÕÕ¶ iÌ–ØTW—çWΈ­üÜNÛ¦š5¾"ˆ—×ëó+Ô“'6ySûÍIŸ®­ç±ß†ŽHÜôÖ°f‘¡„㇪ª\cêz:ia2u!UËÕÙý.ÖKéúêàöþ˯¼¨  `—ؘ¯¯¯///÷ö§7nÜzþùçû!0‰Bv-Ú¸‰…Q¹F‡f,P)ymûíòpkd³=ª\ ëгËÐÎ민âšöþÏß?´2Oú•<3_ÄâBòÑ–Úc5žÙ¨ƒ·ný«¦ ÝZ@S)bŒ[glL#4Û1lp»ë±äêÇ“ɼ$_‘H¶§1g !¨3‹À}ÚLjƤHY y¬' ®××ÎU9ƒµ¹®“B!2«’õôÉÖyn¬±‘ÍúL«†ÙT–"Ä4^ýùi òZ†.NˆYLZo7]fK6IJÊŒJ$´ë»I&@2¢>f`›aQƒ:Œ $ÙHò¦“ds"‡ybüǘgbF"ËBˆ%‰TøÙ;7-d¶ÖQœ7”“†”™»¾ûRJlý|”ñ•—_>¹|wì·Kµt49|ùÅÛwnÁéX®7[#…@Ѳ¡^0*šj,0@êL¹½ypB8š¶`Ýñ ³j`j÷s cìÆž-r˜‰²adTBDµLƒ!1¤•«™,–è=‡1¥Z[CFC„ ÛÝ“ÿ“®Š*dw€gE"kc)>ºüèþëo½ùžµî·~ë?"γ…+eöEÙ=ßE ìîñÿ >QyHý˜¸Š¤ÀªšÅàÎèúÔ^ üãW+pRbÄ,"¥ì§¨øtB{Ç,a,"úrþ#I‘‚ˆô1ýéu,¢ªT ýùwÿü÷¾öZÜš¿û[¿±w«?ڛו͜§U#IPtG“L(Ų‰hÒ®·‰° ÃdÑrµ:ýOÿî¯Q•É,S?ö×øöÞzšó È`˜¥ÄÒu‘Ò.5pÄBB2Ûͤ­ÚÆ‘&ÎÒRƒP²±Ök, ¥SbŠ’GUÈU£hUÒ(Š •QWÆ«ŸýÅ_Œçû_¼ýÌlR¥8<^/QRU“3Õ:çÏÜûÜüà ’ðøòúäòzÿè`RϽô±æ/-ƒ¾þÖû“£Ã9 —$)__Å[/·µYoW—WW¡Ç±ð Bh+2*Ÿ(­‰97rþðB6Û‡Äùìü:«Ùpð¨TÿòŸ¾n-öùïw¸Zåü‡_¿sÜa»å‡7÷_}å˜T¦·rήHQE´¨HÈry¹,¹jšz±Ðýƒ›äí|q¥Y_^—|–Í@0üÿàWö÷‹ÂEw‰F|¼]Ëõ“óÃ4¼ÓT’7=Óˆp%ÆÁòz­{.7ÕûÛ!Ó<Ò5k!¢KýÑÙ81nÝ㤮*ÛÕvÎI,()hj¼{0}·ŒÏÝ=òÏÚû¯¿{ï…ÛûK_úÚ¿úgóùþƒ‡WÛ®‹Å]lº?þîërX½ò…}†â@m[' ÏÞ{A1>9;¹Ún6å|½91R}ôüñÝ«³îÙ»·úaã=fQ%,«íÉ0nfÓƒ÷ß}òÍo}ƒH«ÚMæÍÅæìñÉC-|«­&†ãpoít›u•óƒ«'s2æöž{î¥/|áKÝxøêñùÕºáŤnß~ëýK÷ÃxËᜳ¨QÕÂSwƒˆ*åhoa½ëøZ¯§ÓÚf£˜sP®½¦µÍÑn×]Ý4¶i2³BBÄͲoÛI)Åy,%Dd>¿•sªª*¥°Ù®êjæ½)D´Ùl‡>MÚCüŒgK))–¾çóýRô^D)¸ÙtáÖâPJ›.B(%!ŠJ‘iÕÔdûy”$v›îÑÅvfæ=ŒÙ]k4†½“hfUÿƒÇ«$I4 D% N 7-MÜf4´4íÞ|:W©Ô•×”s)MVTv¢dÐ¥þš¢ï±bp&“€1–æÏÉLæG°X¼|xŸä³×¿ÝÎòá —±yû×®†G§}Zí÷õ~uùøëÆVwÉfÒ2Jg‡íWQ^UeIó¼Ö˜†X¡D  RŠ"äbÁ¨_¤XJFÍš43æ 4KÊ¢Š…——Oj˵¥.õ•‘ˆ’TÖ%…B‰¬%`¶6Iר;š5Fsɱ° „Ðx/a;õn½½v®µAÒÐ÷ã÷ûÛú ý\§@Zˆ#   hZ B(Z@‘‰vÞÏ¿z6Y­ª5—i5mêy!è“ZÓfT‘H €Y4«+­ 1È(Q¶’-äA-A4€D#3Ö®$È À±©A5E‰ÉXkmÓ4šz眤l€© Uº»wóW~æå«Ç¬—[íSN¡ñÕözd­êÓt5–<¯ë‹ ©×õž{|òÎG›‹aÌ5nR¿9{î™ã£ÃÃ&_÷« }Ò^0*¢”ó˜! !‹ª2‚Ô•Ó'—ǯܾX«O«Ó°Gs+C×]võâHE"i0e—)‚ЍPDv“’S‚) ”XÕ3Mˆ%96Tõ›žfÊ,¤°«ìfYwOóLؘáôäòí·ß{ïý]-SŸ*[½ùæãasò¹—Ÿ¹ýÌ\yG!H;Ý "YÕìŠ;ªºª"Òn$åG¹÷º+NÈ'Jåsë¿©þ±†Ygl¨AQF&VE)ªòÔÊú#[ èîȧË+øtX ªüÕfurv²ýù“x}]>÷åÛ¾½ý¿ý£?•©5%Q1Uh!BUÉ¥”b@LVñM=žqJ~»Nuˆ¹\Õ¨M´‡‹3@Öçowäì{¤c2ˆ6LX$çìšZU7›Ž¶¢“ÑÔ’@ÅxCLÑP0(•ƒ(©XÐP¢ŠQ,ª ˜˜Ë¬a{iS/ºY;92m´£+;¥ñº»YµýãǹÃbc0·±¦alJ° º|ˆnr@¡ÑÍÄ–QQ·c·°‡©;›9ª!ÔõÄø™Ùt›éb¾|ÒØ ýåúêÕ¯¾úÏ}-錟ܺ܇ó°YMÛÙézxñ‹¯Hã}°ñÕü¬Ûœe7;\Øc/³üáj;ËzX×ý°jPIT¥EÌ™|ÿ{?\_¥Úå—îöåúƒGï]^nó[{ÓùͶ­ê8¦ç÷®Î·¢É¶T_EßµGøÅçîH=âbÖb¡! ¿ñ«÷î½ü™Uß?xôøüòúýGcÛ"™ª®™yuµ!Ÿ^^ã‰Û:¡®›ÅbQ®NÑ!)“Cw}5h†a>i±!í<©‰ueœiÂõp°7ßo'^©*¼:¹4Uí³b‘9ÄPÖ}Z쇡l‡0öƒšmS•ÔO9z T‘£„"’R*¢ue¼s ¡DDdð¶’BÇ7Ãií= BÌ6ƒao«›³Çw#ñ»¿ûÛ_¹qWÝð·¸cŸq·k<üéç!7®º¤‚è¸JØ¡móHyˆ£$d[7dü¥vÕ€XD!‹±êÆ4gc h0Ä.±j*3Ùóm•úXW•¦!„^dPe5h̤1q“ûí|+’%#¢”ݦŸA˜[HIv "˜ÍšÕr‰¢•õyLÎZMmÏœööê¾ ¾°(¦¿v·ÿ·)ŠŸäÃÙ€3P(…¾bßCR×€B•¤"†zTU¨À«‘ŒeZA Ž)%§–»4͈¥Ë[ï ™œr)X¶Ô Y"1D* Y Ã"¡ªYª‡±A$T$* YGG󚉩ËfŒ\Y´·¼ÉjãóX,[,ÖpcØÆX áÁlÿÕW^<þê³lr5­KQÐk’U±7®F@Ã3xû4\$È|8v4ôPÀhRêJž·Õ½ÉÑÅÉã.CT_P*h"¨ÁCðA±g×ÉT:ÝQ­û×e›&ó5ÇetûÓ9XÓ÷×¾ /B£1ƒhŒ© QU¹ë‰žytzjÛµ…»iÛ቎ÀuÕ¦goýÝû_øÒ]ƒ@ª @D);>:–Ò¨d‚HN\-¡{ãäzÔz]=>}û§¿ørJaZ-ÆaEì rQÀ"Šʠ̆”s¦¬ˆE8Àd ”’ˆI¥I;³sŒf§f”–U3ËÓÎKæO ݘ]ùà}d¯'Åöè\|²œa³ŠK8«›ýY>Íwúk¦1ô}ï‡vðOßy¤l„¥O±&Ì^-\a’ä,H”ËÂ0*ÄœS:u—‰@#*ħ󲬫ª@Ú-².VeiS¢½dTõ%M3Ê)ÈjÓSßO&“*ÜPM9‡–Ðò€¡Gvh/Ñ÷RׯkÌ¡K¡Gé09ãIÙ-/¬Ù2Æ$6Õá^ˆq€TØ#U®”0lN—ͨdÄ –•¤M" cGeÑIJ2œKÕllN@$›ž'Ü<®qädËÖ}¼¨Œ3CH‹€£*ƒ¤ç Í L)£c²ÈU²*iÊ’¬-Î+VÕ臋­k0x±–ÊRU„ c "·øûÓIØ€)8I¹Ç+W hΙˆ HÓ!ò«Ù %£ÖG1ÓfÓvKŠIÈÄu¢(¤„Â9QB H„DK¾dÊ€ZÃUǦ À•ÍE²*¦%LÎ"xoK·ì’µ•¢AdZ2i _üêósy”(²H›ÜNŽr*ÃRJ„&e%"q¶™`§E¹Ná,[S§ ×01(›2%‡% %W;cîMh‹I9%u¶Î†!£bRð1ùÌ×öǻӚe4r¬ù¥[%˜º¾W–Öi™xc!S]ÒÜÇLUÛqóú;£ó'kZt4,š­Ù—>ûÚÏôÖó/ÿ«ßú­[v¶h@¹ë³±eÌÕfÉ€ÊL9GÉ   8­){ødþgßûÁ'ÇÇ)KŽ—–;¶–Ñ@&âŠØ°$UØdH” pPº;P°Â6[D€! €  ¡X""0F„2ZF` ‰PsQ&[É:ü£?üýç7÷ˆžÛ/þâßü‰ËŽÓ$f^R? jƒX$ls½ã…/¿6¼õÆí/¡=»¿xr—ÐΧ4_õõŽÍª>ôŸ½ùâÓóSÞÛ>½¶³¿GÆ­./’ÀÑÑáöÞÑ«åÌXyéhüoÿÍ]ÛÅs=­U‹ì Ôc|ºY\Û½ùù;7¥[V„Ç›õ®N~òg?Þí@bÈ9e&Ë@CaꦩúÂ¥!㉹qýèáý‹“““¢RýíoþúbÅOÏŸîM¶Gr}:½Fo¼þË—¾ö2ÄáìtþæÏïÝ|ñÎÖ”ßû£''óåbó»¿ý›§ùòÑýB,~ç÷~·OÝ|³ØÚšMÇ•¦žˆžœ¬µ†¶ë­¾K&„‡›E9Ÿ=ßþü«)¶}{>w%"ÉxRÇU¹Ý ÿÉïýÃßüŸÞ?á4·FÙ–“ºr\%ŸÛ³ùñ£ãûHigoúò­—j¢g§çmßU1 ÚîlqppøÜÍ}×ù •ÒhTû8Äàgv´»KDÎÑô³n±8—¸YŸÜ—e_™ÉÛï|òàѺ†*ƒ&l¤œ«ÕªæZÄ}¼n‡Ð­e±ì<±OG£ñlX z`ô×oŒ˜"‚•5¼ÿæ·¾°óèÁEJRTU+çJÑ\•.8&gÊé Ï¥¿ÿàÑx{›ë5€ˆ~Øx1eY6Š»oÊÑx»RI”„×ëuv\ÖUŠúžú~ØÚšC1ÆÉ$õ›®ë—³ÉVÁ$)Ç|ÂÅåPT¥-›ŒCNVK•¾¶–!ƒ¸Ë.<OÝ„•!®—§'&ðãi#ÐçbûäLùó¿úÑþ®Y\pprIDUS_Íb»MkŒ)*‡ˆ! 4DV38 `Ê4œc·_§ý]‡ ªf­Š2 #ãXÅ.»æ•×^ÍœÞùÙÏöLÒFÖq>yD5€¨…CÁ½ÂÞ8Dk, ý<çLI‰|Κˆê,”R.,ij¡´V0wiH1rQ C‡P³"Š¡¬U*krŽÁ9ÁÓÓ³ÕÚôƒ¿vm<™Œ€ÕëÍùZUA<8iš±1foçÖ¦]$?Dò9¡u¦´4—9Ô"–QU £hÞø¶(ìÚ !$ CIêªB 2SélÃèX­Ñ¢bi ª1‰Ú¿“¢ø;ößÚ:%Èæª!T…5 ‘!à ™DskË6øaÀ9ýxœ @ë°©—1LˆÚnÐ4Ò )¥”‚H'Ì@ŠˆHð©Ñ€ HłпY»ÂK¤˜›Ó0Tê|ë­µÆÃ¥*¢¨QÄÿà‹_yåÖáb1Äg˜†‹ÕŠ«qé°ÈY ÙÙ«*«c¢˜¼xODY†œµ.Ê,ÑÝš4cÆÙÄ€ ]w:)r5ÚÞbI9‹†¬8ƒA+9+(sÚ˾èÝÖµ¾M‚ºi}=¶ëj±Ny5€f”²rØ£$¶lrðëk;ÕdgûæõYMüz¹džäp:BÛ}ß#² ƒ¥ ÊáJó\5p}üøYõÁ£Ó·ß»O›Jšxé ²9€õöúÖ i‡ïþé_üÚ¾vxtP”ìÓ€`UK1W”p‰ª¢È¬(WÑtåÛˆIDX S0’¦ŒÊ$$"Ê k ýÎßòEQåÂ0ºÊ§„ÈW¼TâO¿ª eô9g½²ï‚ŠßÛÛ>{´Â’m=¹ÿðxïãÉñq®›½Æ”ó>çˆ</.æ)c5¥Ô÷=¤5ŽW¥çWæ«Ý“ˆhJÌåU3ŸŠó•±Öº‚µqÎ&儬ä²–±T+’bJP$È2£0‹2ftd–%ƒWEIF‰®0o X ”ÀÌ6%EÊ’sN9_¶k[ÏN/rb€ Åt::xq·Õ@`™*A*vë¾÷HVÔÄ,+MóæòþÙÏûû§§׳¥éœAΠYÀ]_ æàÚáÑÍŸ~ò8!>{ò샻_;¸†YR_ü'_ðàÑùyw¼V¹õ‡°~æ9éêüòÁƒC€œs×ušqÑ,¬ytr~xý _¬®Ïvêf ¨øäþã­ÙþÞÞ.E`H¨  ÌªQÒÐ%VÉ>¥$™bTUîûà}ŠAÆuÑ÷›Áw“Q©q <8”Q%ÑŸ2¯‡ƒõÉf„œ‹*¿ôÒµW_}õ_ÿëÿí`+G¨Ü­{÷ÒhÊÖöÁ|µj?º¿yÖïvž»qýî‡OÊi!±)Û¶- {v~²»ßÌ×ËÙÄî õØLÄ•Д’•Ù%@gŒ’Þ}øk. {9oE™ÛMoM›ÉA1m_??ÛjÈ0('ùþ{<»Låµk)Ô[[mô“ «²ècTTѬ9;cTE»0ôCÛŸÇF™H!ª*[Ëj”5¡B™  È’„AM `¨ŠXZ¾ìºñÔQ IlQae¡fR©²+E¸/J%!J¼]NKè:è£nĪuœÚЯMѧÜy@Ê1AҞؔV u1ö£Ú8ƒÛ³=ejf뜊hHëŲښ”¥ a Å¼µ<•§eDؤ¡±¶¤@Y(†6Î’3”EC” ¶1çwÞüÙ¦]ºíx+KQµ³¹¨¡à˜$FI¡*›h-’Dܘ´K1C6xa¶Æ`&Š9ö …&•,àj€ÍyH˜eTWI£ÏI†àM,Ûùz¾8ßÞiRÞ{d沤“““Ó3w|r,ãYõøä„Ñø!j–/|î•í]*ª¢¨¬±£ü=d €ÙXˆ(Y2¢:F°.æ¤ù Ì£lLa ‹(Y•Q emœݲ$bìT§ŽÀ¿Ëù»é¥ RguЂZbF(Õròid+ÊÄ¢ ÈWœ{ñà;”«å|4@ Ê>›¢\¤èRŒ¹ö¸éœ†6·ÂÒp  8eÈ)F¦:²ì² ¤ä äˆ µyÈ)ud&C(¬ë˜=Õ±ÅX»i’œ­D¤a3Ý3_Ú~±,ê”RJ€(¥Æ b¯ISb¡ÒdD- r2«Ã1÷K¿ŠÃÐMw·‹[7ššm«uézt¸&5n¤¾7zf´_°j&“\Ž}ëzcûÌ7PrŽ1HÂÈÝåéz5G­“ÏÙn ‚’M™MÆ|e©1(C˜Œ§CÛñî^L°\÷)* : s %i)103'è ±¦œК )µ[î¿óÎÛ+šanyXÍš¢¿ökãšÕùã)Ew}ö§?y[íÎk®xá¹-Çšs‹»Ö#•Æ¡¨ênð"ÁZ;uÚKê F´îôtþàÉÓËÅæµ/ßÙÛÞÀœ˜Ð1Ÿ$eaBQI IÄZ4V1 iœ •ŠN”¢Áè­JÂȵƒŠ¼8¿Üí÷mk- DÕ|W×#‘ÒrD+ý ï¼ûáì·v?³ÿæO¯í[1­½ì¾°]oÑt~á#æ„EÁ ¡(!D@$[MÏæKï#µÅ¤lŸ„Gµ#í¥ë)åä¢àÉä€Â"×’:0Ы·a¨š­ùfåÑX. È$")2§ŽÐ´Éç$Ùû©©|ÛZ2d›AR¯@jA6© å 9iŒ ’ªQ¶*%ƒZᜠD }¿I¢;õþÿßùtX}ëŸü¿T×<‚ÀL= %¡ á6ÛÆÐØáb-°.>zýþÍ‘”2ÐYµP`9ªúu8tœ•Y–¨)‹lî¼²+¡ó7¿±»wh©:Ü)ÊYW“­É†Š;ãâÖáöwL¯§…0ÄXšôÊËG_ýÌÄ:«9üÙ¿¼QNö­AdTF!NՈʺv&E (¦¨²QbË‚9Íê³´RÂ%àÙªZ¤`“6%z¯‹l8жÏ*)e3ÙÞ?¼¶¸Z/‚­’¿<:š-Ÿ=^–MýÛwöþãóz÷zc×õW›û÷Ú[{û7'ýëo~ò•_ûÆÚß¿ë/¾ökÿx¼ûÁÅÃVÍ[·_øÆg‡ÅåhûÀÕ븊X?wpûÒ?<ܩٔ.iN1bîKýèøa½ºÑ¯.öGywÛ•v»óÒ&s¹Š¦Àvs±½¿uvž||rbSçkýjUíìãnå©v| `€M3™=9»xº8}ðä^yi’ÍôöÙå£ÙHû¡õÁ•«'ÍAê-åa¹9ŸŒÆí} çÙþÚUû¶ô OCÙ–•Ö4¶CL~(ËÅúr4;¼\è'g›¿øåݯ½v´Í,) bQT]ë“‚h*Jr åóÅÅ`´ ÌÆ JÑçÈY©4±ðCì®ÕU¾t!iJ‹Ò¦bŒ¥ƒ’Š JaÙEÛжk"- {W7Ú|Ôœ£¦¨›¬°lÉRÌÞ¦)Mæn£ç†ºìçËÕ#›B¨ Ú*›½˜ÕùúI\Cû+ß—e}­`bfeë¦ÓˆÆd¨™Q‰GͪÜhLv<Ê~äübU—•U—ý¥GG×rßÏÏN%ƒ´yµVc¥½±09u]¿.SÉR…Zªx =úÞZ lÖË ÖSQˆ2ÙŒÀ9BòÖgt9»¨ŸÆð¨4*…‡Ü䣅ar—º“““'ç¼ÑX5ãq2Û;“ããG”BÕÐf}œ›ÆÛk4;põKcGÍVN&{ë “Bðq“¢GDS±: +cU•}ßc ¹t¡KŠdŒ5£z¼5›e­çË ÊkLCãlô‚ÂënIv—MD&ÖMµùûÓ!­¹ÈI…2@¹êöF“´êujõꪚ>@ÁÿïÊK!ÄàsUAáªÂ•§§g,Œ9¢Ž]0Õ y,BjKB-²w$¦ŒÝ¦½ÀI‚$!@È X#0ô®cMÌÙ"FDÜm§M”Q$QvJ,UU`RŠ*,1:v š bѨ@ h“­bfRd°Ž™üÍk‡ÿýw{kR5…s€ÖÐf³¸wùt9÷«Vk£õnÓÍ“³… #¾ªB# ,]QÙ¡ârfª1Ú3iÆÂ€Æ –\S£áÂåG ¤I$¤1E”Œ’‰Ø•MChŒšœMl:R0ˆ„¤{"D£ŒµÁ \ÖEw ¾6«Þõ—u1n@º6ÉЦMFxñär«_Ÿ›½øßÿäüWÿê¿ü—ÿÅ£ƒ§Çoí:ÃÚXD¶N³ôÆåœ³3a5ˆrQF,^ÿå»?{ã]ßÅ*ð­[ÏíÎrê : @\– UhfD2œy,)fIY€0ƒ%²¨ ÒBÖÌ £QÙJ !üÁÇ?ýÙ{ëU¨íÖg_ÙýÌg®O¦ `JI\]gð—õˆ7ýÆéÎúbþñû÷¿ì=ï6nÒð>ÿ—¾ü¢ÅÅCÕ­®"ʈ9çàÁ›ª¬€HˆsŶ€€Q*Ðú^bŸw•Wå˜uk\ü¸*çÎÑþáþå|PcʲœE2…óÞw]ןϛ¦q<$:ç›zÒL”I2TŒ›õà}$nbRD7%P€˜M¤p¡²µÅ´¬zäÖö—–^¦;GÚ"¢fô'öæ[ï½wØÜ^…ËA”\™V„â’=œwµ  &¹îøxéˆZäBØeˆÏÉN‚ð/?ú„Æ/Mž;øÆ7~m—ýü£Ï¼rç[_ÿÒññqF÷{_ý–‹f§žìF[¤”¢kþÚáäÆá¬®`{gòþ{wc4ȵ*¼úê«ËùiæMUîÖË/ïßÜùÏþóÿëß~'#edRcRf@d4ýJB·œV×-¸(ÊHuQž?{‚ ŽXcW–VÍH©8[ [K@`sQCBuE)©ËЃÉÔ¯¶L6q¹;³Ö›3ãœs¡Óé®u9W“Æ5 3­'9Ü6åh²së…ÙΞ½ùÂgþçÿéßü“úõ.,†Î)Ú»÷>úðã·¯_¿ùý~Ï£oû'ÿðÿæñ¼ÏQŒòâìbog{º'ý°Z.N}ûÞ½÷liËjüèɇÓÂ-WrtÿÁCÈãfkÙö^†óànÜ¿|ü´?¯¯ÝzðôøÆöÞåâiÈ—‹‹ã忬ªÝæüÂwyÿÚ݃=@™Mn<|p¼g¬ÔÛÕ¼[-Ƥ¼}tËw½}öÅçö¶÷pîܾýWoý¢_/·ƒŠ4 _¸up³³yxùùý¶W†‡;{/t›ËB-)‡SÏyPÍ>š$×®áéz-ES齇wÿù?ûƒ'ç§ó“óÇïïÞ¸…P Ã"®1$C–Áäˆ>eɘ3/q‰ˆˆ¤^ðŠ:ÈB‡Mßú`ʦbr\œavˆ6E¢¨i8«]±°¤eUEHȽ¥,îRÓ:Åy‰9$ÁešÙ¦ù|>™BׯWëþÚþÍ aùÑÚšÁ¹nˆÙ•š£#)YS„ñþ…p;fBPWÔ뢻}P5åèd½~ôË÷wêqEÎ^Ùê§ 0&*(@€cò")ÆÂXrÀ72Hç›fœ°ŒAªª¹ì}B$MS´—KHq\N]QÄt‘“fÍV‰mQI‘˜QÃpqq™‚¯\Ál9fB¥·ëQYa±àƒÝW?w»]­Þ¿'·ö÷«Éh¼¿o˜KkFM“0¤Åf!k¡, MYÚÁe@ erĦªû¾ïCÇÌÃr]…3BÆårµX¬• b¶ Ð|>Ï [£±ªc4ôizñââ¢øûÓª°eT‡p5ëO U’ÁDš\FMð·ý·¿"@Щ"¨é:ß¶>øDL’!« "‰lÔ "¤¾P¦”ˆT4[ÃU'ˆ³ÀàlQ;k,Ðn)ÍG¥›4Åx<ñÑHòf˜¸Ò”¥³e!ÆbQ˜d “*"£WŒk  ^‘ ;!ERyÌ,Y2mÖ‹ß½ûl¥gç®2`stI§ãɪóÇ—Óz,Ó˜%uÎYŽRÄ+ ªb§jˆKW”ei­M!£f$’,Àư¦ÊPÆ(ä=´B¬ IDD­‰ ¢Í ý5CbE޽ x€¤h•„­Q‚zÜœžžç!ìLÇ"Îr”|±®îí?9>N’³JV†!IÁך‹i¡ð›_yéÆ~³spôüüßÿÑ«/¾RÚªÉ{¿{¸}ãÖÑíWnWU¹¼œWE¦øäÑÉ~òÓår¹³=¹hCÐï}ï{~òÕ¯¼¶³]碛ԃHV+"Ë‹ÕåùÅzÝ›ªyþ¹³­Æ÷kVø›…š8ÈÊÀÅÇ÷¾ù‹wööö®?ãÑ“uÛÅÂ…31ãùbÝEïœM)y¿¼8_~éÎí,FÑÍ»azptÙy(ròŒeîIFæéQuöŒá 7bL×uW$†¬B’ˆ²B I”êêt³nFe )HÖ@¾÷qµ¹÷øá÷þê'w?¸üÝoþÎ7¿ñ_ýõ/Üéü¿ýã?¿uýv’ä` ³PN)g‡:¶tÔ4ÍÐõ R h IDATÃÉúù—nyßž-ŸЕö*”ú m%ç(Må‚cß e¦)WÖW^Η£piÚÍÒ/F„U´,_½óòsG»ËÇaÙ^ }0R‡R1Ù”b€Fð§¡ëWëjⳇÁV«‰8—wÇÅ”bøé÷þüh2íÃÝ×ß³ìœsÖ:댋jÆMMƱÛx¤±Ûí+ùͯ|mXù;·o4õg´DZ†b¦ìr.]çV›åãwî=÷®¨3pF2HÌŒ Œ`þê'o<|r~ç‹ßÈH³ÄÞ?z¼³{`ÙLÉÐGOzï~üÆøÏ¾6jÆ€Eèü¼+%m•5YÉÄZíå¨P¸*º¡oœÉι«u^ŒñŠ“ëœk}G†’zÔ¨9Yò±˜R?¬›QÉ©ÒÃj{ÿððhï·~üù_{ùÿýóŸŸ,;yòõ߇óMgQ|·\mV«n^—¶ Ý|õ8Yج/ËM¿5žôa!ô½gã\]¡H7¬ö¶¯Ff¾x¦ÚF‰ ¥OÃÅâIˆËg'ý£G0…Ý­×tEÿôä®×Ô“¾íjtL€œÉ˜d1[U ÆÙ²v£›{7Ζó²,·ö·o¾²»îrµüäqç•qµ?–¼ÚM‡ù¼5/~öæ/¿p¹Zh{–» 9cˆ£˘RD”ƒC†.ÅþÖý½ßý­Ïͦö`?Ÿ=ø_ß|çôýÍÍÏá3¯¼dlf‰¨’’H&¬« 3kö "ª 9äpUisÊ1|ïGŸüðG=='1œ¬z6…R5¤ü­ßùm“†Æù„)¤¤ÈŠ2n@â‚1Íu°6"£ÏT¢µ)©dBdf¾*òëƒ?ŸŸ}ªÊIévûNŠÅÕe9);.T†‰#ˀ∑¼¯rÿBMºUÛÛ2KVDú ªZ1¸‚(IFV¤LШí¸KÞ€0MÕ´í0_lDm›‹Ë¹—“ÄŒ ’†a{Ú|ñs·›Ù˜$É6iìBo2h  qTVÛ[;1Aç˜8Ù1^¶^Õ{[UÙT³½r·qE5žŒöœ3Mí’B6Ûnã¥A“íïíäœA‚ê†5)II¦6¬ƒ¬9&De¤f4Î9×¥!tˆˆÄ1 ²5Ì@YArÊ!„Ê:´Š”˜Ë«%5„©®ë¿äï˜AATÉDH4Vf©¡(]›À$)j¶’s†_i^UMIbŒ¬Úw^| ÊŽ ™º†vh Kc¡"TraRBW…á$´† T¥Ýj¸,ØNwF¹2f¶½uº^„M2ÆåUQ4¥9´C[9Çc&Ë„È)‰ª! äœEÄA‚”S TÌ ^w·¶÷÷žÎŸœ<ÂY–›pvRk¦[v¼µYpƒ+°q&FÈ)AB Ñ+ç§%ö)‘BFÍ AS`ÐMLpå€ ) lsÂ0¨çO³ ƒÐTáašzlÉúÎ7®Ö(òd‡,`™¡üøáñ»~°Ü¬ßyóGøOÿ?½ý‘B0%…äß»ûð§?{ýÃ{\]ÅÐøèûÊ€µ$‚¤ ç*M3ò·öë?ÿ³ÿ÷Ço}¼ìðx.dm´ÕÇ/Fã­÷Þ½ûË·~qüäY;g*ËÃí¶[kÅåÙ~ƒ—š×›ó÷ßoë²ø­oüZý£ÇŠzëíî½ýÞÝœL\C]Ž&Í„Uå¸n± DT ´”P£ÂëïßýÅ»÷Ö­ž=]l¾ûÞµ;Óz³^’ä¹>Y,FÛOfÏNŸþÖÞÞ^×ú÷ÞýèÁGORîMÅÕôè¼(µÉû‰+I˜2«HZ<ÿÒ-ܱ!EÃ|?èûþ*%žó•9QÎÆ^9MÓbèÑ£‹óƒbWS,cÄd}P;šý‹ñ/þäþòµ×>×LÊ×¾rgþ­wߘVÓ±³ ƒ¥ÔÛ‚®^¦¨tÆžœœ¼ûvwðRUf_¿SΊÆ8H~±J)i/)a,;? 2eP2œ"¨¿1âÔuaÔ^OÔ4¶XpM»ã‡¨Ï¥Ü¼1í5 ­lbže¤hꉯ¾ö?$ƒû®D;®«u³ïVŸ¿}#$\Fcû–¥·Žj ih[.¢Ô®f»;Ý[,†åÅÜÇ^0Nš[uÃ'ËÅy˜ŒöNŽ—} “çŸwÕ¶;º~é¤a­ªiÌ‘ÉÖ¡«Ülwçùq³‘èS®H†ØåŒ &§´ž·Ž£-¹ÓÐ÷sb0¶b3ÊÁ ’¤9dÍYbÊ>hˆ€„ªEa›”ƒDÊ)$2LÖ‚‚2Û¤¾(,º"çL¢UUXCH#km69&F 9u}ßüýé:³bÎ(쀅¢O&ªÖ&1‡!03xÄž2„.¨€ð)¤j4šË´®…$2Ø!SeGí³Ý°zãÑCŸ2›:)F€'eGrì³n$ s¹YǾ…ÒIæ˜sº²Z)ki:rÙh¢.‘ï»”{*¤‚àÿôÛ?µî°o÷»Ìl-;fRC³8Bº…U’¼êã­ÝÝ™æ¯ÝzéäÞ3…ÀÚý†o¼Üo6!gÑ•I!_ž¥}»×sï¶Mž‚rÅÒŽ¨ÎðÑÉãåRã̓ ¡±C¯­^„8tZ)'[äMИ2ä!{( {‚¥óZŒ®]0ébXM_¨~øîwÖá¹Ggáb=ÏŽ"Ò;Þ?{¶B(vGu‰éƒ÷>üܡT`¶ùÉÇñú_Ÿ=kf6¥i5uÊâÑ2‚e-vªhôáÃóédlí8µwŸ{¡¾÷`gy²Ê~Åu·ìò: P¾üùiV],=¨Æd–“ËSàmtˆ)we¨ÆÏ.×ÿî»?L¢/=·{ÿãÇw½q¾6^úa¨\£˜b·è-AÂbqûÅÛך±UH¹ßtON–?üù;Ü=óA(õy2Ö¡;a‘³6õ$ÇþìiG?yüøÞñ•²=ytBÀÉù§¥±ÌvÚ€9±mW~˜ ƒ«·¶pÒãPÚ2õ)öjäAxiI&C¼ædl/q¾®ÌÖÌ9®ƒ¥¤–Í–†Œ·?ûüöQÕ Ï3ÛÌŠºoÛИÄ@!hß÷¥+Ûoíl,üðôÙés·®Û‚ú´©Ç¥M¦@HÆØ>HÁ(P\ÏFÊhÊ"¥Ä~Õ×è˜M刭"cð³[I‚Šàýå*¿c¬‘_mãCD`FÕŒtuȤÚ ÄlMÌbl†sô”»”^$4"WeÅ€@Ož<¹óžsÎý-´ º®K9G /¢5/§¨ÂÖ———MÓ ÃpEj)]¸yQK*ò0.0‡¶ÌлF0šÆ¼ú¥#Žÿüß½ÿîÆ6£ýÇK}ü ïäÆÊh~¹JXÐø`ª b™^yáfÅÏ…|YÌ,õëIªÏáùÛ²êvŠâþè»ëe"¯T=޾ðÙk+³»e‹Ìk3ãùª›ß ëëÓéó}~ÝŒr”†ø zç&ÓÒ¸¨)úÁ­ûgÄeS6~¥K#vdQOÛbùü2´óœ•¨h¦¡wRV£Ûå*nâÅZ† @]MS˜íÖ'Ï|#…/§MSM÷÷Ü4ûKçiul°ÊëMÒÎ9P–„ 7ÝÁáÒhBGg›³œCºm›,6]'ÍÞÁ­/MûvíóÅãËgõ­q]†u—þò¯ßzNŠ[V }?øh ¶q^=^­ïÝÙ™›ñD‚ aÉZŒÆÛ`xðŒÊüüÖaËMçŠÂ†¡ó'x£Ýù¤à~d.T¿ýÓŸ¬÷^XÝyaº )F’„)3‰0’1ŽÄ R²€\JÞ-ëÊÚ­íÒgíú9ª§2Œqd¡ÍÎ -<ªÅLÅ·®èÈxA_@ìcRÐ+¶|â!:Rokº\_D n>Ķ=õ0ÍzŸ ö£‘aö),cFWmíIcÕ¥€ „ #†È*r«íz½.h¨Ôô*ƒ²«Œ\Šgæ¡(ƒ¨–DÅæ—rdÈT)˜Ûʧã`ÙN««ÚªžÖëv5¬b(F¶.Íx·f ×F›ÂDEÁ 2®ó­8.]Α˜‚­…@‡à»ó5²eŀƩ¶ FãF¢!Bˆ!2áNŒ T2ÙшÁKFTot°‚ älá*‘„¨¬Î“cbT•lsP´¬iÂz ²Ä }ß/ãpml@*55¦O›½þ^ôGÌ™-6 @ ¥+$:ïå˜I’1BŽZUq”CR Ã#AisÏ¢Íb([iC?ÛžÕm(4îoÇâöìvðŠœR¯À¥Dj8‹ºÉ¥¤¬hDk虣ªé{î`(#ÖÉë·¿¡HÉÚ}ø ñlݹj<ùýß=Vßž6u»iO»¹±è (Ë‚¬E¶6ÐEilôÉqÝ ËÕÈ•6B’+Æ À›ïýü­w¼+¬OØë~HÉ `O\!rQ}x÷þoÞAR’†$ѳócIqgÖÌF\×0ÞöÊR0.ZTÁË‹>]áÿ&ãQS—CŽžŠÉbUTž|2ô•Mˆ=†Ö.µY¯¢³è€JS®n7}ÛzD"ãrÓ˜¢(Œ19g6| aخˣkû{M(ælŒcP ¥’\M¶´@—”¢BÈÆÇÂÕ}ôÆ/z~QÌÆå7ÿÁo¼ôü^”yÎÞ V}øÞÞøZonî\?<ÈëµbVfîÛÞ97 >…¸³}ð¿üïßþða`Ÿ ŒtÿíýÏ«YLÑ M`%aTÍŠ I€Xuh€T¯œXˆ(€sN‚ˆÄ ¨J‘(ƒf˜»àœ3 ^’Šz °Æ¨æœ5Éf<2“µæŠH (¦QEF4I23—˜TSØŸ6DdÌäÓ:À2·×Šztdá}¥æáñÓ¨@°c ³šBׯ:»ãé­­çò6¶&ËÏ~ñÎ )Dmv¯—I!÷ÿ臡oKGÖTçEé¾óÿ¼½šoVó¡/š¿~÷ý‹ïÜ=]n–P›í±ø¡â[‹Un¦Mö¦â''ë÷>x0Ùß~º¡‹½÷Òs/ÖæðßÿŸßûÒ?wüäâ׿ýÊ+× ¦Ñ‘Qˆ"¢D™ª²ëÖ/?'ôù_<[<;±µ‹9´ýzk;ä gËö`kÜ4ci»a³JÝã@wgreUM‹ ½WÂåŃ' )òééÃO>\AÌu9±ÜÖe˜Ìøüá÷õfÓCʼnҸf£¼:?=;»ãvŽn”Œf±úÿh{³^[³ë˜ÏÜ-¼HŠÁ2—Œ3’Â&ŒõÍr±89Z½{ï“ßûíΣæ =Š³Ñ˜ŸúÙ/“®¦9ùŠ\ó΢[}LÅi&[tÌê ÔTqäDäͦ)"ÎW@Õ8$æ…jRÐ" ‚Â0Ç HQÔºn³ Á`Âd ç\Hiž‚²ÚRHÙ6(UÎÑÔž+k‡9Ùª9¾Ð çÉY+E§<ئ.Y2FB]UcLÝz©Þ èºk1Ái}²`¦y¸9 ÿh0?šþðp=…â9'u†#Š)`Q%K1F‰ñ_‹¿t ãBz³¿Ù‡i?oá©6G'KOðÑ÷- äB€ &é›î4˜‰­iÀ¤’€òy j”MÌ+£…¥h¦…ЀGò¹€'Æ8ÍÖœŠtˆfö $ÈXÐ ›8r6s›4ôº«¦ðQ®µ8»ÿöœ¤\Þ ä˜§qe½·QœsJz|²¾syqýr"гÂL,¹°"tÍÂ×N2±V–êÕBȦanC¬³Çë{•©d[X’¤]¶J|DÈЗ©ìm ¨ù&æ…—óS²®bFaPAŒ) cÆ)”¤²õrå¼£R.K¸’µ«]-©¤yÔ¢ŽmÓU5í¦EÛ(Ãí0ßLy³ß0Щ嶕¯þô;O_"¢í*cÀPŠi¬¬cÃL(‰Åb)˜FŒQ ˆYµ^rŽB©²ÆªÄvc&¦®uPé—>÷cµ–õúêêÙ“›O=¸?ö’sY®Úí~óÑ«›Ý Wó%Èn¹vµŽÓÖZ[$CγHŽ¢±!1ö¢~µŸ6Ks“ÒÄèKÅ6[È*UÓä˜ € —8§mæ~VM¥$’œËb±øá0°”R˜Ù4Õ !,d(¨Í¹ ã Pb4pHØSÁ$ Yç,±çÅÑâ+_ýêoþvÿ½ï~ëüõ/ÿ§ó?Z­BÉsºº»_Oô{OûWWñâzüì»÷~ðôÃû÷ï‡4“5•ò8Âj½V‡<}µËïnÃ]I™¾÷d(wî,U²”Dz(­cF@%Ç&äüF(ª2ü’cŒ9$š-E²xï³Ó‚:D¶(¡bAÊjE„5†ŒˆŒ` {Q¡73Òˆì‡Ìüe[cbŒ¦f" !àÉÈgÍk¶W½d,¬À Xý&¤•5Žtš÷¨1ƸZ¬_TUhæ-[ÃÜØ» %" “  DF"¼w÷¦æ'O>¸ìÓƒåèv! q òÌV÷ÓÅ8Ÿ¼x1¼xòJôhޱYâ¼kß0šq I„Œ1][ùvžÊÍõT¹£’MQË×Ó4ƒ`µ›ú{VýþòoþÚ¯®üöŠ ÅÚ¯hœ'v"È&ñè¸)JÏ_ÜÜÞ:5@™¸êZ’ö¤m<†0‡~朷篟ß\ݤy<=^:«EF…¹¤ñxÝmvq˜Ï‹4Åi¿o›îjv®–«*´PFÕ³«×ƒÀ^LÊ™ú’J½ëXwMÉA´ò™uªLªA&ffg ™va؇RêóíMçGš’aÊKS-’g‰dU n{îäó?þç¿þgÿ“Gë>n‡§¯þößþ>ÿî#$ÃÌȤÆe2þ0 óÍ4»–‚ÜÔKRÇÐ,ª5 8WR½G2Ø $ 2‹uÓ©Ì%€ÆqØ÷–8ꜣÍ.¯{XtÕœ5>I¨3ÃØŠ®e+IrÈ}¸½‡m™÷ØеÍñÙ]s\aeæª*$¶= ¯pÇB’â8£S…R’H&(,ê€3’cغ4Lý4O¯®@Tæd ÀVQ‘j›PaQ/ŠŽ%÷:jƒNK²kI9¥‚ÖZ0­•¨1‚d©€ c.¥”œUr2¡ÏTAŠe£%;S)íLe-š"šb 1(FE%zÒâ8+)(Z"bëQ@€š®# ‚h}5Ç„È9gç].…L-D"Êì’°¢A €AIÔ›M?´²,¥tÖôÃþôDv›½–Xq1’5ýHø¹Qô>&"…’Q …Èl²æiLÖ’PSe؆¸pÕ¶ì€àQÏš|•UI±IàºÆ“Ê`’=^¢]Â;éÙU/¾Qì-¡n9„ xĦ1˜DU%0bãCÈHÇ”ÓÒª…™T×ó½ø%ص3]KT0Ë××ÁÚ<”¸'éì®HKUE›sŽt ¬[¿(•+±Ð1,/¸á[&Ó åÊîË]šÒ­Pfƒ¬²Ûo«n}t–/Ÿ·]= ”” bVªÛÅXÄ×u ?ÊnÝP;W E’d\·jÚ;«6Þœ?óÖÛ¸‡¶ò]k `šÃ¦âcMÈ–D bƒ*hw¨îÐ$B€d0‰TlÒ!Œìm4ÁÖ^YHÓ*ó¢Á¤ºíSã*+>Ne@2Ní‹ï>^}ík'Ž—«éú|~ùâòæ“ë||vçèÇ~ç÷_߆iH¹²Pqn<÷s°Ö[CDcI¨"ÎÙŽ!C`S*Û„y¬«FónÎE”²rç-#2ÒéQÕV5i¾¹žrž_¼|)ZgX Ïýªçœ•eI1§´{×A.ÙXT„˜R.óœÇ¹@e™Â5¡*0«Æ1ªˆˆÁluJΕ„—7,À"”!j™&ÍI åh-«–œE’Ô¾‚"š xÒ”Ðå)ïÇßüÖ³ºë$"L„)ŠXT]™”wóPU¦Ø’ \[ç½kûùú¯¾oŽªÇ·7¿üÍßyï­Sv'ëö7¾5_½~²¨ÜÇ"˜¾ó¸ùâô…¾ýô§¾¸B…Ëó'gï~뻿óWþ½Ÿ›¸ªïÞ_ÜÛ‹8l¼ûîÓg·ÍÙòøÔצb•,‡ÐPP1†˜9ƨ(ÄœsVcL–R5cVÅ ¥¨¢*©¢"Y-(ÖATͪ¨¦‰˜­ N¡ÅÎÛf\ÝÎSOÎÎÅ u¡H˜%÷šBvû4]®Ë«‹Kt1kîºîôôž`¶DÔu¤ÈSxÙmÛÌ+çLΪœB)¾^ooÂÍ}X%œ‘'gÚ1O¦²YõPˆ™c²èÀº‚•P<¹·>>’Ó{ïúª²ÈÏÛK¾î¯«ÉÖëÖ´ÞR‚O=X¦¸Éû›óvg÷–•ÆPúWWéf&SÑw®^ßÜb} ©‚ÂávØ×|¶¿ýƒó'¯^<|÷~”*jɲ?:¢}˜ŽÎNNn®¬Å¥kZ;ßî?ÿÙOµsK%|,?¸xyñþ§ªß_TašV‹£ÓÕ ¨^Ýî8ÆíùG÷NŽŒYžß<3 FÑÝP67»ÚW*7£«Ú>™W)ûi®ðÝÊ×éöÕ~{ÒM[§l${qu»ô›ùô¨«Ž;»?­ªäÇ9@>Ç`ÍâfÊ“YB¶Ñº"2ö`Þlã,ä<û5pîç’íž:´·Fgš“/Ý ³;®ªj·?ñîý­Û5®ß.žUÕ¸Ù½\/(Éë¤ÉpUwÖÇ’¬€}¾ )jã2Ï=shnsóô|µðÿüñkpò­'ãÔ¯¨ßG™E{Ù]çbgtɸl¬·UµÞ5–ë_þÇ¿ôèŒ7ãtôàÝ®x n]— Ô–úäèÃùù¢Á„ Ä…ûïÝ»×®noûÖ5”Å0¶š &D¥¢(ªª³–B2Hj–«ÚÓu¬µ!J(’¤»”’ˆx6M];ͬ=k¤B@‡HHå gNbÔ!·î´²"0ÎÓÒ6ÆÊ8ìvišæRŠ¡£ö(nÆñ5n¬é’Þº¹`Ç­oìÉ™=¹sôüéË—¯Z\æ£_ùgßßëƒÎ󤀤I •äF·–QÔ[&jˆ0—r3›½‚l¶¥mkÕ§˜c¼w|w{µ1ê·?ØÝÌ7«“Óo}w³ZÞY¶í~¿oל`ãšµTµ© sTÉjCå‘k%RY­ÅB Åîg$¬ãeÄý!G_UµßWU5„xy»Y/ ËæõùË‹@KlÙ9™ö“7Â(U!öÛanÈ ÀÆ—”sŽˆ @q•bL %I‰ùéÇOŸoòº;>þ•ß¹wL¶žRÙ ãÝãö­»ÈÞ» Õ_½š¾ú'?‹Fõ×þÕr¹x¯}÷éó'y¿9>©½«rUþ§ÿðŸH)†8x::nn®®þÎßþ?Ã~÷wÿÞo®kc^üÁï}«m¬”Y‰l½|=N»óï}û_,:H¡EØúóËÛ›ï}x|Z㤥~qs)Ÿ¼´&×^Îî/µ Îâœ/ÔŽéÏÿ¹?»ZTçoý¯—oiaº÷îÍ“.—§s6#çóp½Û_nnnæÇãº{pOú<àÜþÖ³Í÷;«ÛO~ç£_ükÿùE?¥"g—ý‚È|íßz”Ò1±, ÷¡UHTµ‘Z¼öyUWŸzçŽkθñ‰ƒ¬!:nA $£)fB ÄÞ²ó·4N!V®~tåM­!Ö 7LâÌí¼¿—Úû÷ÏVuÖþ¦Z,ê•“l93—zî1Ù[åMÓèp“zZkC]õGãEØÛ¹íöãú3^ÌZ“8ç*$dfÉEDŒñý1M€Qãäú’#¢ã…g¶€%—PbVp¾¶tN¬²Äœ Óñj)d3P³ò!$Ìs.ü´-s–ˆNS˜ëº%cBI蜲OÆŽ2¯\³è i]£çÛ2®n.¯v¥´Ü%U"3ÌCnàÛ/âëáæÅ¹­<8cÏV_ýïY–1̳×DãæÈÀBdа<‡|õþjR*Ä3‚¨–RU• Yçó0C(\„ÇÛ¡XdÈÀ5(ö¢€5(Ü  `ÁªµTò 騀ÉóŽK¬µ½{F¨óÞï$-;÷Ío½üކYáY¯½µ ê@òTâ¡vçaûâ‚P Y"Æã~’ëãÅâ ï-º¶Ò>½Þ §÷ÎÈ[Ѓ­fš*]LH´h«ÆjÊ­†P¦’|¢£¶eB¤¢˜e†c¡Ieë…(š\r‚"ÎZ¦Rë+—uÞÞî¼õ^Ø 9jŒã´¨:‚0Ω-¤šy{Ãý°SitŒÝ»Ý÷…Ëæº¯|S{]-šíõ³ï¾ýëöùz«»È¥£ŠKŽ3βw1­LY$   )×me Ç\V•ÆW¡Ÿܽ÷é÷Þçá[%eaÿKßü6']VhZ3…Ñ:LB’~ž2 @c½!ƒDÄÌ›íÍagu„†•T1Z¨ºæòö6Æ(âN/d¨L³h[hIx•÷Þûy˜¦ibFE|£?‰´®kð¾íêÎQÖ8!Më¶Jä•@AkëUšACÌDr0f¹Ù ßùàÙñ1¼|rûÂ"‰bDÞæÑXrÎ!bÓ,S”EwLè@SUyÍi¿»èšvÑØùµ^]ôÓËñ•ËÎÀ ¼>{kÅi»Ùß^GË T•Ë!_á 0õ£wððóÿ›9«x=@ŠQ ñz£?€ìB¢;§o½8—÷Î~pñ8KI9+![“R s±¡#UÆ昄%•h-cUATuî±^¬wã´Tý^R®,û´˜‡0ǹªÈ€¾~rµ¨p¢-»öübûôù̼XWËÅéi»´D¾bD( ‚¢$ ˆcß›’ö7½“åÓŸ³a&a4˜…æ3wë#u®µÇL4Í&¡\‰$n×O/nîÝÍ W—×ã<­WXrí+[0•(·l¥à lãëý¶{üò¼kìg?}ïkñë ;gÂíf~±{ðè3ŸæwÆþòù‹ß½ºJa˜Æ!e…ö{[û¥á*jX®š£eãê¦ ZŸsNÖÁÛº”ryyÕïcŒp|t÷+ê§NïþIßLO¾ÿúý­ÒÂ)qY-Ÿn?üú/üÂÏü;÷V8ÿÿÕû«ÿüwÚŒç·ðüV·×7ÀÞ óè c1„¨ Zä5ŒŽ›\æ/~õ‹òÏü¹ nJ;SEˆhÈ ”"aŒC*qû)ØÍöjœ¶Äe?\Ì¡]ÓÐdæ S_ÈE‹ìIÀVèÈ:óðýG¦œ7Ч~ØÏ‰Ð‚Úq„åª{ô™û_üêÏ,×Çó0n.®(Æ1¯¬?å×ç0¸À%–ÅÛ1‡Zl) aUUE1A͇¯›1ÆU$(Æ)*HœµDÔ R”R±ÎdoªÚµ@:j/€sʲ!窪mëõ½1d4>Äyš¦iWm¢’ —ôûÏo÷Ã<…Ë—7sf[˜‚LåêüêÙÓW‹Õi.Ú.ÛõQ×tÈ>Vs:Ëã¤ß^ºíÕn¹4ŒÙ;Hsbߎ3E«‰Ëa­@DOìsLÆèl,ŠTaƒ„¨„„†LÛŒ±(s”Ä·Ë;§xv}‘øø¨ZÿHñ?¢þ" ªªÆ±¯ª*„dÈ!rQi½“KÉÌ*DoòÇä‡Û y“ ij[yb°nP˜q‰6M— ŸJ¸éÜÙ(YŒ€è&T Tί^„Ø üð¿B Ìàf‚„¥l,XÆjV@VåÕøJÔàÈØR$Rò0G(H ©¤$U·¼ —jÊåæü/þ™¿¼t6 ]ü‹_Ýd'ɰÀ4î„5–Ìݪ=5Y )2n‹æ£1æ¦é´ì1¹Ÿæ:ÎUtPÙCðÀ>ÏJÀu…s¿ZVΨê0…Útñn¼½iš.ÎóÐ÷k‘5¡f'¾«LTŸTÐ cÖ]·\V]cjð9Ó<Ìj j.\*Y ’w\dB&²Ë›óË×O_¢•ÇO_<õ¼9^.–S師éxµ>¿¾}ùz÷3_ú’/U嬥RTl]ßìç×›íë|¸ôöÞêøìx•â”R †…ñhP@BNÖ›˜C´u˜XUªEýÎçßþÉ/þxÝV7›iÿß USg(›Ývè·ÛÛk眫» ŠXU~Ã#ÆÈRŠu` Ô]Ûu•ó†Ó,#ÆY[ƒ]» TIbɘ»®³ve"bb%^wËS:qÆ €£££¶mûêºV-ˆŠÄ"{fD@À”R)eRšU &Ç@’=W ý› Uã € àC¢BRÆ4ÿàÅËž½<=ýÌÃ#ú¹suÝÄŒYTsŽ Ù¶¦ä„ó(iµªMã¶®øÁ£³!ôi‡ãµÂbÀm9=ª€ƒ*½|q¾lÞ@@A<ìÅo@ƘC¢ÚµÄ9D *ªxP'ª‡þTU6FåÍ/®†¤ @EˆñäìÁÕm?•aÜt†|5””´"%,R˜ÌÒX2#Z6IÜ8)T•)’@Ù>9oV‹©ŸâHP|“›7Ñy™Ç]ã|UÆI£û>”™]Üñ“Øûwï}î'Þ©B:¨€Á¤(ÈÌwO¯_®×§³¤o~û›?þÅ÷Èʳç)êvß‹9}ôî;W¯.s™K.¶:$ËÉÙÝ¥·Õ“gßÙï_: Ç«µŠó¶,3J]Õ»ÝÎ8k¼k»eÝâñrµðÈ^\^n¯.©ª“¥µm˜ÚTGA‚|üñÿðäõ»ï®îvÛm…uÓ¬S*à%Ë<Îq¥Þ¼žvyòÁÕi·°è/_OslÖ•Ö5 WƒyárÚ?w°ë 52Wi¼_UOnÂë§OÿÒ§Þo«;]Ü©¦j>7î¯ïoûÇ»U%ŒàŒE6IÒç®AU‹yó4†k0VÌ€&JY‹*(X²kßú‰È­ÒË’ŸöÛëÛ›Çwàœ'ß¶íÆ®®æišÇmS.ªLãöÃîÞãvoR®ª“aŠE±!^Œö/ÎA|ïÝw¾ü…÷IAÆy2ªFó¾–n¶2JrŠóí°¹.‹Õ¢©­u¹$Í9Ç,cŠ7ö`ÒFшa6†4ÒÙ³cz)±D­+×5¦ms@3“H)I¤ÞnFV© ú¶ùÞïò[ß~¼Íb‚1¥ùìtýW¿þlJ%ô¦ä?¼¼ÙkLÕ´Ip ypT!³’²VUed_ŒaƒêÊ\{!šUyc¤¤0{2%…fJ `ÆT– ­Ó<ޱdr¾]W:Øí89òFQcP¦¬Rk¥ IE^ï¶3ÌÏÆô|s»ïÓò4æÝ˜mwô¿ÿÒo@H(XŠ"›¢ª¿ýŒÈ0 èò›ßø`±¬¶Û´¡ç% Ñ .D9ß~òÜÑÑz1ôÏçt]÷à~Û,Ò/þÿ­{§KËQ>H)šÊÿßÿ×Yçvu\„‹µöúêi]Ïd|âUÿá‹s)?üž9Z7‹…v¾µFÇ}OèÄÈPÀ‘4M×ÕUÈÕ“ÛÎU篞æ2ÿƯÀ¼tvñ¥/ÿäÄó.å4oüè>~òüüÙÇ­½~k¹SÆQÁqìZÄ<ÇÄY˜™ÕbĈ–‰ˆ2QйÇÕúºE4›iª«5Y¬Œiݬ´Ô3qÝ­†‹;^«å%à¶ŒúÐ@4{d)PŠFPSJBEW¹˜4Æ’RpvŒqLð¦4MùfT€© d*‘”ÙÔÝ·~ÿÙÅæf$B(NQ&žJ29XPu!¤¢ ˆo.¨È( P PÞH 0   €-Øñ‚‡+"£RËõÛt¾ß¡]vµã±`˜’­»J”€С¯ ¾µZvšF 2!!’䂨s°¥C"’RЇ9õEhžÒÔO-4VÄ «c †bŒÜU±ŸBÊŠC,j"­ŽC,Ž]cшšRž5~€7ÞÉ[ŸQˆ äÍ!×€ €¡ÃG£Y³/æv;Ü^Ži†\4©^ïâóóï/–•sÔT– ç’Yµ$&O}Ó|òñëí¬'Ë®®\M`!³ ‰WdP2̈o""¬ò>Îïÿ‰/~úó_b¿ªº…ÿ+ÿþ¿û_þÿõ¼¦c†Ý•ÿ‡ÿòç¾þåvÝ+iÉ·•q15ƒN™Tð¨0ÎépÜ`>”¾$gD$D"*жµoºßûÞ'hË»µ5FUëºFD(…ˆÀ²µ¾®sÎ$‡0þ0,ÃÚ¿ØT'CãnÞN³Û4 T¦í~º¿ù@­µ€š¢ÍùË?ñˆu›DÝÚ,W …‚¨<ÇÌû²^BÎʤLÀdr}ø¬RJ‡b“"Ml„ˆRŠÎ3«ŽÆZ…P7†8‹Î••R²"€ 1‚ DTz3§Ø!"SŒÑ8‹„ª EE ‚0#”’,ŠZÏ) 0Ç[0“hÔ2"ƒ‚QPÍ ZT 33¡R>D pÉ€D(QVrÌÀR QÍ)$T-¥ SÈ *PÔ\ HÁ’œšÚš©U$DRˆªE%£:Dý!*ùÙó«_þàûBçDj¦S‘¢ $ ý5fb@cìP¢›Ä10CnÛv}ÚÞŽ/ÓœT” LΉֵ]vvÕº½Nûé¼^¾ß­­ÙÜ ¢Æ;ƒl3ÎÁ27M»3û0nBÔ¡ª Q³piëÚ²A‡ ¨hÎ¥ˆ¤L8Ûº–ÂÃ~"òasHDÖiºöÅÕyNó{YvÝÍíÔßjÇÕ󫋪©ëeUuñÒÕ´è$ŒŠ¤DúпºÄ\"›9ºñ‹f9Daë0Æ"P°TU½›ÒÕ6Õ¼zû¨uev¬‡Œ¡Ѝ\@å°ìCÌdðèîw>÷i¡Õž>ÿ™÷ÏîÜýƳ§ õzqï·?~5üƒý_ÿ¿Ê’Œ4 gQÅ!ÊT”‹æ(TP‘@´ˆŠ‚’sÅ£(V‰‹F_YOõ4%$p®ªœ! 7­Hª1Æ9Æý4H.†DJÊš‹ä\&3¶^ÄÊãÉQó“_ú‚Ú<‡>n®çË‹HÐV›}ÿA5Çà¹FhqJÓ<½u·†t÷£gÓ!…³@F'CÆÆ©Db$!((óA¢ûŠU [ëÔ˜‚1JF˜‘eZEtìšÖ+ä"³ÊAXð EDD 2!þAJ€ÀaÕ'TUD%‚"REUfY¤ Ä70 !Îc¾lZȦ’sIxÆ,$QP‘KQ&J‚ÓA&dÁŠ`RçÙH "Âl¥^: kp’"¨1¥ "1 ª "B>G´8U[bgMSã|ˆ$Yë…Wœ3kJ…!1•‹ TKç²Ø¨µ.¾A5"¾†’U$[Rl.–¾[ ÃöÁQ½ÉáSwVïß[Úl·Så—›­´GhŒ%ð29zu~Ó¸³Û°ÕI&Û² §¼ÙF)œÞ?ª½u~R…¢¹H–ZT5ÌØÔëy†µ®¡]t†u/{|ekg›ºñu•®/6?yÖtK×uÁÚ¼lŠk´LÛiÆÊTG®ÙNûRJÎy½^[kŸ>}Š:-+{z|˰Ù_½¸²sè“IÞ;Q|òòÙbÙ·w–÷–GÎuãÅ3SVÇ÷øºrµiPhS#×Ï…õ³‹í–æÙ6_ûÒ£ûwÀh iqLNé@ÂBk‘ˆ(—™J"s8¨¨2Ú‡%z•DÄrÎyï ðv»5m¥$Ûí6ÇØX/<Í«u%Õ„Q\ÅÚy«Öeu·Fr\™µ¤r|ÜUÞîÆi*aa Pæydeq ]Øp8ÏI EÇ`Œ½5Þ9ÇJι©…r0$%e –£#¼>ŸKƺ®}íÈó6HºöõŸû«æL IDAT¯%ßy÷ÅmºìOšÓ?ÿ•ÿí×ö}ê¯S‘¸ý?ùà+V µázœìËÍžšÚtÖä±1Ë^ A#T‘Ei™5C’g˜R'ãvÚÍÛ›áÑûïoöT/–_ùÙÏÿãÿîïŽt ®UAÎT”l^[›\Êyy¼¸}3|ã»§·nÍ›0~=LÎQ“¦1ÖQT´Ê€0ÛvyePU."…¼û \²X®«Øl|ÕzÃ]ë ÖT²ì:FböfVÕl”œ%Ó’·2¯fÛݹ &—gx´™¶k–¢¦Cº:Åço~ú™½ßü‡ßjñJLs"‡¡õBCr)o˜S rNH Ù Á™s¸ì¯@0"Bå¨5h-¬S%yVѱ†k(¢)"Æ cÌ…Û¶JcâåÝ+îæ^8Þ#uA™=™’e2ªÀHU‘@ÌêƒnÏu{ñÀ‡«'¯9÷ôlþ¡ ÿÂÏ~úñù·¿wÞñsŠü­÷þþ»ãí[WÍjäœë#ž÷5 ‰ ˆ6R*&c˜@4•<"VfÄÐ'@%P³¬ €i7í|8_Ø·çã„í”)N0€Îfašú”£‚S±]ëtÄ«RVEûÕÄ£™±mÎÏ÷ö[ó ¬ó»”Ì6¨nX`rŠùšÀ£·î¿—³«…ÙÚ½½òð}CEÅåloš†RÆœvìZF©+ÏÈ–,*ûšy&Í%¥äÈs-)Œ!˜«C«ZÌÔÔ¥˜·h1Wk·è*©*®FêPªÇ“¦L  •I4vX4²ì|µ+‘ ‘‘ĉ 0ZôcS51 *Í14¥Œ :Þ8ˆC_-çGr?)U5:3,%—©ª›X.ÕDC¤¨É@ˆé’8©«:æÉ©j.Ù92¦“` -» `p›Gç)°º¼­s¨$L”Rùª33T‹IJv:i$º<À šemg³ýùâè tE÷ï=È@•ÌBYÆ|²&ªÔgX˜“:ŒjØ„ªæ’jÕ(Ts#”¥0¨âj7múêê¼_¿rãcH6ÛÆ‘‡7 ûcç+*˜”P£ýzò­;ÝõS ón2$n­hœÒq·Ün‡ÊTΪné&Ùfˆ›u¹vüLZ±TÎC™€C³lºZˆ›Ê(¦R ¨«hÈcq3SÍgòHFíðæñáÍf¨¥Oi¢%rÓ¬O£Ù¾÷)Z<ÜÛ 6•¡À&¥ë‹yí•òä Õ°È«áñú¼Oäçqq¸ÿtÛQ½j—l%ŸoÞë»>w÷¾ýõw¿Î“ñÙÏ}ô™Ï ‚ÛÍHµžTc?ŒRû `hÞ²xGìJΙ±bìLÝ?&ðY/WƒBžJ)•¯¦’ Ê6OÎKÌ›iò‹n7˜)¸`É“§*ˆ–d ÷ÐEÕI63¶›~g«ããk»Q]í§izáê,Žîí×ßYtÑ6Ó^+lÀŒF”…œ±c?‚F§à¤ñ`ê·´WÐSÜš¶“ Þ•ÂÑùJ‰0J ]GmgÀ΄¿÷˜¸èˆöç'ï|÷Æ4»®öÚ;¯ÝY¥ÿõûýuÓYôw>þì~`Z¥V„µ [‹®Ÿ¨Ý(2²=q.Ï‚„ŠU!%€”i\tPª´ZŸ¡œë¨n“AÙ/« &œo§òóú'ßüoþ{©‡Îüí?sý4|éõtÑ}z}ž âŒŠÁÓN+æ4fªƒ‰¢dM1A4ßúšÙ©L`Þ…Š÷í^P2"h¨ëʱŽ6ö©0W[ 5 ÿÇ8DëÕTrÍuM \ñ¶„(ý(+M‚Ž®\-²+yÊXÑ.Cˆ¼$–“ X‘u»1)˜]]Ý~öÖ"­î_œôýÎû ’( ‡0$é‡t¹%ÁsÏ=ýö‘oÑU8󈂨¦råøÌ̘Ùy/`¥”GgÛß}õ>ô >Ç®^åÅzýþ½¯tRõãUŒqCq)"Àå_~*eÄ”÷»&gƨ0ÐAg‡qÊÞsÉY³z%d¿‰ÓQAPª¹e¡ 6Ët¶ÞÎçÜ9YÀè3ŒšÐÏЄêÆÑѼk«ëÇ˃çìkw#À¼  ¶Íæ»Ö«»´/€s¡NÀœM—¦@1@@ ¤rùJ\"‡F¦Áœ•ÐR+“Ñv¬ƒêû%“/Ù•Ù[".м÷îã÷ïŸ?síêíks"AÇ`Ht)¦åbÞ;"’¢Dì\P°>Nê‹?ñÒ'oçi˜ïÝôõÐiØô?úùýðKŸýëãüúW¾7j¹zxëÿø¥ßºzó8Ê~/ºùá“‹1cpRÆ:Hˆ $ &ÏÄf@ ÑŒÔÕlÖ-B»Bð u1¯ºÁ+¥iì·ÇËkqìkïuJ@Ø9§Ä (Ӱ媘eÕ\WóóÓþx>:ÕÝô¤Åâ=‡aX]‘$yë~û_þ›å—ß|ýl*þÉÙnÛoêŠg§6M%"¥$%‚œ³tX¿ù>¤ä¤BÕ„›hçkt>‚e®]Ãxìœãzâf= ";s’+€\U æ¯Þ>ÞŸK’¬6T·Vµ„α/;f0Ïc)€uº*¤æ‹“³SfB}0¯} Lj÷žìÂì –œƒ”e£C½X*,f¾ J²"%WLÕ¼Çhu÷‡§ÏKºU0³ˆºjˆÑyç2šÆ’Œ:Ÿ¨r•)&ÕìM¤ 9Vב¯M1eÔÒxŠ1ú¦e§>TÆEWqp^¦Å$¦-SEÀ TbBDßaC׸š{f®;?«š¹oŸì¶)NËî  i±¡Læüðeá¥F"¤ê¨£|ëæÁbAÞ§!iŲ̈‹D@¼8Ú‡8ÆÝxá뀎5å½eg ]ôqBæùþ¢E7õëº •Àa·@·Ë£êšÏÎΗ‹+žEâÄÌuhOÏû~“(xò)@¨ k‚å¨<í6›í9³«¯]{–||rqòhóθ9{ᩃõź aïhœòéé¹'ßÎz(göibY—³]w´tËÙvýxJâ¨8ŽR×G×êjV3Îöº K*qHçÉlmÑvK†°Ód¨ֶݼ^ô JÖͶW€BÒ°„¤b€ÄÌ9G€—2Ã?ñ|ÐÀ¢`ž¬ôësç…ͤʌ&ý8ž ˆìÈm6 <ë‚sNËd ó~¤­éî<<‹iÕTlÓ.`{t°ÏÌ3ší/ž{æÖ|îeÕÓ¯üÖ¯£®ÞóÁƒ*ª¡ª™Uì4îìÎ[¾ü›ïœÏŽºë{麿>몆˜DÖ¹$(à*™âvŠz¾î‡MíXTÆy_}õÕïÜà Ÿúȧn>óßøí_{ã›×®\—[³ü±=¿÷düÚøS?ÿ#¿þ?ýÒ”Ö*{Î…(¦*…ÚÐ9f<}r>uäš0G¬¹„õI’š»’²Y1*Ú0&qÎÅ1ah³a¿Ý5¢ZrE.çaâ&ÄøÂtɧà0 n¡iŠ—¾B#p]DÈ| äœsåÙ9b¦ƒùž n6ÛSË9q u];çr.óù>`þhÏñþ’{G$:\1Vu=MŒËdPBÅÙ uc?ÿ£'ß®ÙCêkPÂ計øj6oj°» €½Gƒì\GSq)Ž’·ª€7Q €š\ËÈÌ Ôƒ6ŽG‘ .™ c25c…¢Æ)ª/Ü’–ÎÙ¶Làr²€h‰!/fs‚¢%ÏëÖRY—ˆ%y‡eVûÊSžd=n—Gs+DyW1”q—C»‰Ú¸ÐÔ5³“Bb ˆê+335D$4…K•LLÍ"ùP¸mkU‹®©ë ™ˆ¨”d¦f—9³æHˆh½‰÷\4U{ëh6w*–/Íu*  —ZK@pжm)JÄç«[/>ýÃ?þ©ùAw}U_IÌà<ìÝjÚéßýw~áÏþ¹˪å:I=»zï,ï¦qH“™i†J ³VUð†˜å´b‡Ù;ïØLT2€!!˜‚ª©’hŠƒÆ’“ As™7]íC‰[`D3#ƒ¶9'0q€tœ$›ŠÛ­÷Œó¼9H–y¢ó‹Ô-—€%Æ‘½¥8Ì—!íãâãÇ›‡§~Áó¼HÓx2nxõT;G –@¤(QE+¦aLYLA»°ÊI€ÕÕl¾lƒwÎ <ïÔ$kQ¼+ïê«GÍÿ§åIŽýWÞzpÒÇØô»Ñ3|êÆ‹SÙ=<éO6[šWå©[ûÇóz&ÓºOù¤¼øâÓ—/¦±Ü»{ú̇ntÎE±ÿûïu½³h³ƒƒ›ûóîö2`¬u\ŽQªf ¦ €†(Zœ‚ê¿:"bR8póRaf`ú][7lÅ!–<Ó¥õ]Š]V¤J‘*4¾` .‡0BC((æ< @9?[±3ç‘É•¢³¶“4ÍÇ,¥”œ@ʼn:D‡Däh(%¥‚‰ÌÐržPRT“ó¡Þ;XVÁ[‘‡§çäÈùÊp$%GÀAŒi†Þ)ôã0õgÞ̲:Àƒ£#dí§ v=!1!‰DtØŸbɱÄíTûP…Æ#.ŽÁ ·‹ù|¹Øl/D£r® Ü ý¸¿œÕm…ešÆ!¦ÍnL!Ššä¦[ŠÄ*,Û&Œ›³ÆYtfX)zó$‚:_§¦ß¬×›­su‹eˆLNbº{zgY¹ÛWŽ®Î 9Õ`J–Wc?ªÞ¼yûÑéyŽ»¶öqê7Û~õØVO¦“‹añS?·W×øÝ¯¾qöö£Ìu!õ‡]B¸²üê?úvÝÿä}øö-(SÑ’T¹˜Ëf¦H Ìfˆú‡8àÿû "˜$–’6ë‹ÕŃ"c©‹¨0c0†qˆE)´Uņ9çõ(½XÅN™=ùWŸuîhµz4£ºâJ,Ù>x¼œßX.öß~ë ûûH\,;Õ"BΪ‚š©ÈÞÌ«*Íü3ß÷œt.b‰š¦Œä½cFòl€X¸@L‚¹y7ó’4§7Þ~¯™íŸm7מ{åî{ïíúó“»^ýî;úùÁúýÝx}ØM¹ï‡•NC è•ã¨ÉlšôÚ¢žjp¡ô“/™@B.À N)Ùvã«þ}ʼn QòÔûÆm5ƒ+ (P1‡ÈM¨Ò."€gG€¨ªÞ{M#˜ôC?Óšˆ´ˆ‘™YQ€,JÈbU‰ÊÎ@KffܬÖÊÖ÷•óèØ3« 9g"ÿ‡zÖÿ÷»ý§:ذ¡ G‹»Æû’{IcgûBVL uÝû±Lè*†Ñ.95 rž<£Bæó½«aÖªЦ W{ÓóqHcÌ,†E@bwS‰}àÐ> ÛÌÌıh®ë:ÉduðÚ3d¤£ÅÞ•å~šJÃ>|À]*“#3IÓèg,P2³GO“eîÍâÈÓZU "ºJ™‘<»àèù$4BBCD4FTïœ !3ftæWþ•OŒý£ƒ¿iêº;Rú¼ýÜÓ{óµïåõ¤2ÂÙºOÉ%’‚¨Š>Å©ßíJI«Ó'/ÎêÏÞÜ'-RRUù:„4M÷NWЇÜÒñaƒˆq*Û^ÇI–ËÙKÏÌ«8äÝ“6»ÇÿÜ¿ôþ“æIZ^í¶.ޝ½{¯~± ·oþÆï}È•ÞV‘66@q „®Òš§8œßßžD™f‹k]çMÖØÒÄ…j$lL y&ä\ë]Û¶‹ÙÌÔ‘???_¬êºµóªª )›óÝæl7kêåá^³¨ÉÁùYxòpÓ:×]qÛîäúGŽÿù—¶@ÿåW¿!äÒ„N¬Ê‚ÎA[ßyÿ´ò­ÃýgnT™¹^çÈ,̈|Žä:‚ïÿá¼rëúï}í«§§§_øÂ~ô‡(´öð{ïýƒ_ý7¾ñF›ëCQlŸºòÏþ‰Oêǰf÷#Ÿýü?ü¿~à/ýåÿü÷¾ò½g¯_ÿÞ£ª®¨öÛͪé\[ó¼só¹wa ôT…qü3¿ðS¯|üéãý‡çÿíÿðw$uZ¦e¼qxüñg·Ï~ø“?ó“/~çÕo½úåw®ÜzÍØìÆ¡©—ݬí§Ž*Ù£TY¬Ó¸f`í™9²m|©âÊ7­"ŒÙ¦ºÙBl=RúíObögÃôÀô©iŒJ8Øi‹%˜K_œQ ‚B„ÙNæ ˆ‹e˃swâʘÐ`VU`J µ» b©xð„(®(Fj E±®özj촂 =Wº4 iÖaÌ'çýû§)­’ ©¨°7¬Æx­k—<6(›QžœÞÛ븩DÓt4o÷÷êÇOîFƒhë÷|g+Ví4ÛK—~°Cju S‹Š5¤<°U5‚wSvl¦•1)qå”Q‰ƒ™@¦ŒfÁ)ªÔžÌpŒ9d1Œ¹È`Î}Þmòl>¯©d¯Ip@§>ÖK˜.F292Y‚®5ä1¬œï^l+HÁeqm´ÜFþü§?·×Éw^ÿº`7œëáþþÁö:ÍS¾x¢•w s&‚zæÏÆÓ*T%ªÇ€ ‹öðäìþ4•㣽½Ãª«¼9íf3IaS@„Ð c.Ó0Žu)ðözÛu•ôrî:<è®vYš]ãÙI]ç}8j»v½Ùf–{û.OHy¹Ð&+îdµ]ÅmÞ2}ôöSmíÛÚõãiN;öìÉVvÛT¬~trÑÌ&v÷uJ³ÚÌf‹Õv !0µûÝÕ)éÍý²'Yóï|çõÙwâ¢óÞ“ZY,jD>:œ¿ùÎk®móF“¸nqŒo<ýaßšÙJJ¾rxüp{:®Æ¼kÇÝÙñ{ý»¯~óëO=ó±ÿ±~íµï´¾äidö3Š™'Ÿ¢1ˆ1Æ’À{/’Cj%j¤PT&ß–'wÞޖǼ ¡ÄõØçDY ž-:UÝBY_¤“³¡íð`ßí/ï­ŸˆíÕCÆG›+W+·°ÑúF{D ÍÞfϜϳež¼ñ÷ÞýÕóóãÏÿÙéâ k²€Ö˜fbò>ÌTr¶|É´W…|鉌-ííDUrŽ©m[>±­Xšâ¨ãÐrî¸DÓó O¶vtãÆ«_ùVX|âãŸ|ýwÆýn¹ÉüöÝ“gO‡…z+‚]m>+µۺ䋔+ôs§ì&ì7¸©FǼ8‰ÎßÚ›”‘…hã½xj›ÈÑh;q–Œ|è„k|þ³/?xÿ¼uó«¾37ì½xãS´|òöêöÑâ`Ù"»aÕ‚Qå* !›’¦ÉWjä0ws$_ª¶ÚMŒœ«2}2%EÆ즱võ>¹š}TIÀÿXùS„±“hY4¡“I# š9H¢&%ys,I B΀ˆ†€¦„š«••Íデ­bé{×åIœ[ŒÑLÀ”Œ¼“’.A%tÌžCÈj>0MÛ¨ €$£kÃÎ\?;¾ž6 ÔüA«g’ÝE\K· À–L =x¼Ûl’ŽÀØÓv¸¸óþ½À›íúüÁÉã[Oí3pN–Rô](Z`fF“‚ˆ˜°…VÐ;¨†ÎŸ÷Ëøñ—nH|¨Ì׬­Ý”ãj³~ ÁBSù«G‹»Þ¾Xoc‚MN€,H€¹hÎÂ%ƒfÈëíV V¯Ø, ª 9º4½ø*T]e\­ÖÛómšÖ·óvŽJONŸlÎú&´MhmW7UŸú³ówU×a×z_7'›þKß~ëÞã·çóŽ :Çvéà$÷hï=¼X.—ÇW›à“Dȹ•R.š‰P¡@ÉY»9=zün–õŸúâŸüôg>na<Æ¿ýË¿¼~pñ̳/Ì#Õ*iŠëÕ—þÏ_ÓqûÊOüÈÞ¬!èñÿ½Ÿû—ÿõФ~äÆé'Ój˜5ûyyìš¶ªª€$À},ŸûÌ'>óÉç–G^}í­U:›7û)›ÎšÙG>òáÝnwm?Ôµôù¢Û¯™(‡¦],ÛÝYÓÖã8þãäÐã¥ýõ²,Dd·ÛÄ8bˆˆÉ¬ˆF35ÕTbÎ9o·Æ*"¥ Î;禈„dÌLN¨„lŠ` F*&h ˆ¨AòÈÌ’I¹©  rñ TYŒ‰{„€ÌÔºrýp ê¸é ¸vQ\f6 ³4¬%%£ ,< ‘Ø´ª­Ž*3€Ç§'³å¬ªqœÖC)™Ã:O£•MLЄ~Ì#±Õ'çܰLÉ”)–¦ ¥h‘‚94u©(òR2"*«b,r™å{iè5Sf&fQ¤IJ.*!ôf*´PæJÑ!zöЧ (1]Æù X&S‚šêÊ]ú6/ý_—kc›…ÐЫÖÈhL ¥":Fʄ㴬Žó¸>Ëq³ž‚ iUU¹¤¶ g§…]cÅÔÚêê­¹¢ª IDATkCºèûÝÖ÷&k›ÆÙü n«³‹û{G×–ËîîãóÕ¨»¾\?äº2fÞ­v-×’sLÃ0æ1jÎ\ã]'ƒ<Þ\¸Ð›»@FªjŽÆ]ddc'–Ìæ|Ðò â´ÞoW'MÐ ìÆT©(é4ø"´¿˜·´ÝŸÏCðçë m;»BÐtnŸ-!Yh4òÓ× ï¶ëa¼›åDûûË"©j|‰%/—û‡‡W¦­|÷;oÞºúò+/7OÞÛm35g#ì‹–ìÆ¯}õµ»7Î6‹{?ó}áõ7¾¹ZŸ.g˺®UДÕA/¹³ËxM303ç*WÕ«Õªd@ä’Í 3y)17µôãFí·ÛQ}±œsDÂ@†i7ÍkýxÖqÛ,¢u 5PƒÅþ²é’ó«öi›2¬ÏÓÁüÆÞþüôìmÙÊûïÆÓ¬o¼uïé«]è  ®{¯‰’Œp¡n2r¢S™Jv…%¥R7uÑlECíS‰b…kG-êäÛùBû'm›ù‡n?íqúÚ·ï~ûëËewäCѦZ`{÷µ‡÷ï>\\½^/'›'Ç×—ýø„´ LiÑU®e捻橌° õŒÌ¨òÄZ5<6­Ïc Ã4-oÜ’û»¦êGœÍW®Ýþ3ÿñ¿ïC=úºkê~uúÅø˜xïË¿QyÈã–8UU5ÆQÚ¦`öà4²#vX²¡ 6 –- ÖìÔ«a€P¹@Šu5sUp\iàq«êÒsðGe?þèóG‹×rQ¹Œû"±¤¾RÀœsÔ§¤hv‰Ç‹¡le—¥”&T¡r­Yƒ:‹ãË0ŒÁ7Q“`FJ€b)¥"–¥pðƒæKÓŠZÍ žJÈ ‡”¹© Î;…ëš’›Ûb±¨wB3gÀ(ÔÆT€ÀK´Æ~»ãº ž¾~ÿÝÇã“[W÷Ç1¦ÍŽ4<>?!Éê}eEƒ«òTÂWãºC=ll£«=y°TÙ”²²Ùnµ|›û8Ã*¸jƳ³³g«­äT²SKeŠ2BÛ l¢…² y• €Ã¶”<HÞÐ3U‚¤€"僚Õóó³û÷ïçœÁù“ª²ºœ¥òADVcqFMÕšòuJVšåá²™{ÉG7ÁüýÇ篾vV³¯«Ý¬sÎ#"©qVz°ÙîR^ø¡î×1ïšJX£kH õy³¸º#¡ýîÊ7¿ù-¬é•W>õ©—¿¯k«Ýzý¥_ý­íƒÓ{ÇuE€kåäÚ<°‹ñw÷ïi-Ÿù©Ÿ\4Ûð×þâø7ÿ‹ÿ²«I÷«;'ç%ºÃƒ½&d‰²vÞW¾®(âjuO§áüÞ½yPuôê›wFÙïÇÓš‚3<›ÊÍÇ›×î<º³V0}ëëç»Wl ƒÇŠérÔX¯×Ó4!”RrÎìœ1ãe{…̌ΣZñ 岓¨”RJñÞûÙ ËãÒ4Måj‡dˆ0‹"PÉè\ðÎ!NÙÔƒ¢ ‚€¨7óˆq¡T‘µ© €¬XšI•Ù‘ULšSÍÉû9Ù¢a‡Ð›QI2ï}1%ÏwÎo,Gv.¨Ó ­7Õh¥Ïb®ÆÐŒàK)c‚œîsÜ–¸‡As"ËZZ4ç(¦1rAðÓ¸ œ™””Ы‚!0²øµ8Tt˜AÕÔÐÀMbE‰*F!3UPFÓ¤(@¹q.xp\ø’4À(ºuåë^£C2äàÐ;,$Df¾,V½¼øs·ãËqÈŒYaR `Êýf§ˆÙò4«H†1ÛuÌÊI¤21IHÕå±àò|d „퇌Ñ`e†Yצªí0"ZR-1Ž"®m—iÄ‹ó]‹šÑCU)ª¡»všË®ß6Þµu³ëû”‰¨­+M1n/NÁbßoACå–m–×ðìõ÷$Å!ŸÏæÍ˜âbqÔwM%%ï†8e·Ü?::¼þÔÞþ®ßÄi—âf»YÏëi‡º©ËÃÓ“‹ª )ïr™ê£¥xG0Únwç7‡×_h»Å÷}ßmHÓÃè?öçþÕÃæ¦íÝ¿üöéÃüé}ü ÿâOÞy÷Kq#û×AÔTœGöÅLÝetÞ¥©õ2êÃÒÆ¹ðݯ~í½wŽ=ŒCAôMÅuMgÀÛz?÷:BMhU¥ŸF#ÝŽ½ô±ªæ ywõê5ß åäâ<ª&,‰€ªÖN"¹¸iÓ‹‰—<2ô BñwÛñ›oÝ»û—(3 bJ.¨‹ú¾ìZŽÏ}âY&Æ¥ˆ!„¦N%úÚ'´ÂàœGæ0I-Z:‡'«éáÙï}ùÕ»ç_úÄÑÑñ½‡ïÜzþÊÁ-xÿw~ûˇO}˜ÙíuM¿Y‡ÛOÿK¿ð§gWü|øóWc\=¼[ÒH ZJÑ8Ais–Š‘«Ã[¬ç!é´7Û÷•¢ã˜$E?LmOú,®”d¥˜aíë½gžª8UDãvxøäÉkßxmwÿþ ÏÌÕ1™¢B?Ž©ˆ…« Àˆâ¼W)j ÔÀŒ]S5³±x¶ÀRÌJ`VyÈâÜ@AÚ9S#9ç®s—ìóÚÄäúcH…%A)ÄkÆ2Ùå }ˆ^Dä2ž !Yä˜9„q5Ík¤¹fƒæbÐÍ0íÆ)IfR®sPR4Ç¡ˆÀ zÀ vS†°G`œùîúÑ1¤US·Ç¡i ¤­®¼uö O†ŠóЃð(Ì¡Pœ D¥D›˜×§e=Øsîö÷OÏ»n1Øô»L©LãµX )î@ù±ççÞ}ó[ÿÝýKã}úóÿæO]œ¼÷á=ÿÖïV-iŒã<¦òôíæüúßÖ>|ÿºníŸyù“ýOÿÒvõøïýÝ_ûŸ/<~d› ~â#ŸÜß h£ó*Àc¶´É¥¨ìdMãx½:¼x±Û”B$§iÝf^ÏozdçM™¡uµ"ÇBÓö&)™õ¦#Ì W.N#ØùR™ÉøzÙl¼3v,,ØÌ·ëuú<ÏË<—ÄI;_Ф( eOÎCHΘÜWÉ$-‹,36S›#Úès>ºT\4R$âзml©w¹3ÆeƒoûN½¹ÿÎ.•‡‡# PúR£ä3È*ð°\78$À&•»õÞô º´3_ õÔõíÒ“†×¿w;š–³ßü‡ÿx”Ii­v£)­·Òf§xA4[O„ (áÖp¦ƒ-Š:Cl1©U² š@‡º."HHxT_]Éü¼]öÉ*;­Gj×IçqØä™ÉŒá„•Ï­4ž))¥u»*Ìízu|‘Þz×¥´îZMÆ ÚÒh1@4ЉŒ)¬ÍQ£D)(ºXœåµWžƒÞhVa| EQÄRŸº>Ë\YÌp\—¡ë Ø@5®Y aFâr_-.†wžR~çîBŠòÇ~â ÔùÅ|•û`g¡m>ÿÙ/ýÎï| }úÊ•£É¥âò.¹™­Ï\fÑ€Ëi<Í” q>Ÿ_ò5'”(©£Í†À‹œçÑÆÖ³n›Æ ଄ž‡fyqvûn~±jvBBª2ÛHtÞöÍ0ôÉeµô% ^šÈg0ªˆA0¦WܬÛpçÑýÒ×Û£*ëòøøØ‚Ù›ìdA¥8-Œu“ñî3Ͻ`ˆäûS ~Ÿþ—Ä¢·ÓlV|ÏôK €ôÄ…óéÆ °šàÑ[ö 4‚,{ÄA&£!›SP¤‘9Ïlß ËÇKh&PK¤Î“ÏÈx œŒ$fÝvë°:¸*G®q¹5ë;·dZK–‘”SŒJžX @º5Bß'ïµBÆ`ŒÂÔl:U(Æ%ÇÄ}â>ù2QÄgÞU1y®ª£jš"TåÔðò`6™d×8=Õk˜·úè;ÓéžÐÐÇÇE±îZ´U—†U7 Cðª‚0tƒ#ÈŒ'“¼õàhݬK"[æ£d Nçiû¨Ñ$Lˆ–Ð Chœ39ºm¤4”5ëîÊÍ«aêq  *²iy\–§¡vùdh%öCúÂS^x]En»v¹Êó’7ŒFñ¼tÄ!RP¸³[&QÃ)nÖmä4žŽ.õÑÍ1 }íµï0Úİ(Šé,3j„í¨,^zùùåúÜd•µ´9]¦2ÈAÕ ¤ˆ ¸;Þ»X4Õ‘Óþx Ÿ®7wæó²Ìó«×ÆŠQ]~tÕ•ÌYU?ÎqsåòÞG?tuškeSìÖÚ4ûûE/«ªhI)± "2æˆ8ÄD¶Éñ ™3Ö°f@Q… ö(ÒnH=:×¶B„»ÓQæ¤@¸<ñç›ðà¸-R-ÞPfæ@U–³uEVÔbsçr¯©pâ *E²œrƒ"ÑÆ€Í´®6mo­åÄïÕO¥H€„€„Ì¢D ¢hiû*R`°´Õ¸$·Íb`â‡Üwƒ KLI…Ť.̬5mˆÚ9wŽ¢É˜9tmdŽ"i4›M&;ª||z¢„m )Æ$CbÄtCo½ËÀ«²™y²ä8Iš*7¹%ïó³ÅÂÕuP¯„EU“uë–3¡ÙôÊ ëa¥]7N&£ÌyÖyX·§“É5_Ñf³î:#NÁ©±j‹5£Ì‹ÕRU'‘¤"àXÁøMìbY;·³7)v*-Y›Yñ;;ùž±mJ©§”™:óCß‹š8Ë ýKб÷˜s  ^€>©E4¡ëÑ;ðd€ UŒ¢‹€€ml»¨›fÉ­DBŠDÅ&-ªO4Ø>Xt$®ÎÆÊ<)Æ~Ѿa a`ÝxÇϽï(ÎÖbn©ëWÞ’÷¹·E½‡ºÎ3ƒ^Œ-ˆ²j8öCJQM1*š4¸Ü®›õ´*ûnYä³Ì”ÖŽFs$̲ 8b²Î8zíxg‹¤dMq° ÈéÁ£ãÝK×ðáà¼÷£Àµ {ëv¹Ù{tÚ½qg-8l‘ŸŽȨÉÛÝýœ=Õ³‰ËÝõË·*„äC¼† „XºLs”ŒuEY׋®=ÉÂü¾Ö÷©?MJD8Ny†ÔmY”Âq"=É@üËýÊ)‚¡Ø @{Áœ¨ï‘|†”{Ö¤(P{‹ÂyÑ +;ŰM‘fÕ'Ô`@¶y`fû{ú~¶¿G`20p:›v«åc_fÜõ’˜%Z'Y‘©aîÛ€h`[¯ÇÀΡÃÒŠ—º¡ KPx,+bA)­a×w<ô)‘Då-d¹íû zC™ÉÒ¢[ϧùåñn‘6Ýál׿qbLœÍ*Á.†•)Mfyh—gíüþéñÚ:ÏCŸçRbk¶ðt`Š­*÷i]äy5ÎFEî;W9_:œ°K¢ŽÐHÅ*õÁZ`@{"%ÓUF#u–%îChbŸGÆX¾ú£ËÕ£ófÝSHdILL ˜Ûç'e]uE4Õ$îc!±Ñlß·¬ œs@–}Uõ·îßýðü09ÿ§¯~}³ iq¶ŸO®Ïö{÷h\ïhUì&³Ã£éþ›Í+øÈØûnYÖ¹1”„Üî–צÓ~gçå|óÊÁ,¬[kse¯ÈkmBUë]Rɲ ¹'h ¯Þ¹¿‚2|úËßÍMÜ) —w¯]‡ˆ˜pˆœAë ( %Õ¦í†a¸víJŒ‘nó8i·î«|ò½7o/6o½wRmx™ùZ••R^ûú®m._ûûÿÁO~ç÷þèÓ_Í|mu"ïTû;SbR§êé‘NÏæÇ­<}ýr¦15+eVcŒnò‡·ÝP¦!1'Í ;*ÐXÛÇpóÊ~^We]¦£aèÁ©[.iwï°ë6–•nÜ<ž§Ãƒë§Çg©Ýååñ¥½åbs0!RÙ?˜…¸WÅ~^‡ööíÛ/Œ™Xä¼Ï:2¹ÏŸ{fréRºvãàùgad öÝãGqºƒÝi"M²ÍÏ5´¥/‰ˆÃ"`r0ιL’ò¦s brדú¡°äÎ.úSi¯]½üÒûž—j›N_{ûîwë>uÌ]ê47uCˆ }«U–ÃʇÞt­ô­ËBwaONæÊ9å ïݤôWIxåÒÑï¾MÆpø«õ‡C`Ѥ¬&3¢  J"[@KFA-RLd-€¢AdŠbYœrdpNÄ¢%1Î’"ù ÀïîÏv²ÌôãLã°Ú´›Ì:/ºù˜ÚÂm”²QÆ-ÃÐ÷òF†ª¶Î¢ˆX$IÜqèq³e9r£Q¹Ym†~5ªQ|jÛ¾mâÐK¿é›ùòéÙ¤Ú­6QR´.7ΫñªÔ!ŠÇ7ýY½3!‡óySÏfšg狸jòýKGËï~=Ũ“œ óuàÀÆ AwguׯÝ4sg2Í1¶2M7ëU•9*Ç}ß'éë± C´`U1±MlÕÀÀOìùO8U ¹Ÿhr¤EߜѸ%RcÈy$rÍ’Ç£™Ò ÞÍgí°`ˆüàîh&Gp°X.ë\.ír\cS¢:%k˜¤¬*¤t~q:ÞNŽFÅlôèÁ‰7´SUÎj€Þ`^å™ñV %²Dµ×®_{åƒï+émsïÞjÕæ,“jTdfè£ EÖ¸#j °¨ön\ºýúk9èÀZä£ÇM{üøôñ£3¨n¬»~ú_úwþ½7ï½þÙÏ~öæì'Ÿî›…xçaœØ2»C[ZsãR}~z¾¼Ðv¸45Y7ôÖ{ (ëf• %@YJƒ„ÆÌ2g= tÞ¨³Û6lÖ†#‹ZŸ²Î9žNjVÀ!¦(Ȭ¹'¤È(1ˆlw-»ùWñþõKL¥!¢&T±-"‘]^|ãóôë¿õk;×oHêÂz9)0"®Ï–6óe•«3TXØíª¬?<=¿wrçÅ÷¶>×ïg}ŸóDU†‹“哞ÿß´:àŸ™¼<¹8DL-«Ÿ¹XjdÄ6ôËΜ³- d™ñ9×J¼á˜@ `T$uª £â:G½ûö½Ã£)Ù&~¾ZÝ»ÿæjÑLŽ7O_»‚¥“å™ýÈn9àwß^µ›.¦La¼u¡ SX5+QMÎ6+3 U)D, Bo’:i[g­0 ²Wí ¤$9[k²ƒEȆ~Õ™étvÆ]s<§¬Øœ/ì^ÕT-É7ÞÙ:RîfÒ…6 ÐÓ#JÒvLåæÜ°®<0©fˆh£ThŠ}oŒfÅy­É>ûâGwóªìûV(Ä&+‚AïÌ8e("é ¥)!â0 Qœ1è<„”ĹL#Ø!2Ù¦iÇ{;ן.ÂPî»D’°ú¯~ïþx²s³ž…ÝbÝ]Nß}ûíÀ:“gÙ²éšåº—åÈ©cD÷¥Ïd–2 IDATÿ±*mOR:“«±~ŦÈf{»¿ô‹?é­;;=­«úïÿÝŸ¸þôþ«_x«2>Û_÷z>é']©Ü݇÷Þyóö‹Ï<–íª\5¡½tðüd:®ÇŒ”²¬â‹ÜfÞ(Gï=Š!%ªòȃ1©(ŠÕFîÍõ|þ#ûÁÜ(ˆ™îOLnÁ"’"g…¯ ‚A°v¢À‡—þµ¢M-»w¼5Îm–šŽ[µÅH¼\>x°+s“âÕ³ó¸í‡¦¬Ëü¨ÎˆÜdtkgz¸^ž—n”ÛÌ#:ÄÀÂv¤–XÒŽÝ×PxÎÍ¡Á\- …ÒËrÙZ»ƪª#'+)i¹$@Kê@r!kg*€hˆH€RJŠârù%‰Æ¸aŒ1Ƙ­MQá*ì|ø#—­µO{DM/µ3F%s´š^ ùµð»Å96c1àP5%T€­åH) ˆ ªÒE@m¶8I iŸ<&K>‹CðZÙXÞyý‘ÕÞ{‡ðòK/üÈǨ“ƒY>­À¼·¡Æ8¢V”¢˜ a1j­õ)=87ŽÚ€¬»UûÿüÓÕÎBT  ‘•4ªT54¡( ª X’"#óVÌèÀ*A"H’ 4Ô„ €€ZíÚb싼ïÚã5_ %ZG;GãÓÇëÔ2:ßw)*‚‹½AŽ®,Ýd¶s°Ö§*  Í #£ó† >^´1qßµUÆ )1ãzýx.I«>I0~äêÃ¥Ïë¤,>cІ¨^-âfÓŒÇUž—…Í §æÖTÏ>ws<*á™k×\œ[ܼ9>>•Õ ×m¨Ç#ñZÚrh |úøâü¼óE÷¬?½{²x­éFÅþK/~œ3yÝÑE¦hlCÖfÖ‹ð*InL¶-CDD·Gƒ[…#£À®ÉÂùúâød‰}Ö±÷f³Þ©£§ãE'quqߣýiqe\ÃýóÌgJ£)ghº 0 ÎÜ9=½¸XoÖ+hºîb.¤®Ðüà°Xô6†°^­n\9¡„™—|³ÞÜ»{gïráÊÌ¢ÞM—ýpûу/ëî›_;ýñi–AF^ƆÆ6è0 $K»ÌåÒ [¯ î bß®þé~uÕ¸·€ó¹úºMþɯÿÆûÞwíþö¿Ä*WŸᛯ~£šêY ¥4G×nnâúþÙ|q¼ºûöéÏüå¼bÊbLŽmÝ)÷Y¶bºoü~™¢­p’ÑzX'‰A’‘á0o!O¹3f¹<ߌ‹átÉ,‡¼ÈfÎÕ”U¾†ÄLšUvÃÕ6?¸ùòKŸ¸|1\þŸþ»w¯ž·ù“{ëÇ‹ÂÐå!¥$’Ê*7«ª2yºòÔÍz¶—k L`þ_­?þry±ý–þù“诱PQd•n»”eÉ!jääÁ9Rd—e¬ƒ’‚EȬqN#‹D‚'5¶2÷]Bð†|‘[Y/Û“G«aËwì®»JÖ¨ÂöwÇwß>Et]”Ð7ýº?<ÚK ²º- ×:‡»»»C¢n\®ª  Æ"#•aTYC=˰ɴv–ˆìÙé²pÓ<ÏÉö)µm›"€õaHdQ4(5ä…“ 3€uHÈ’(ƒ€B QT5¥mëED„uð¶H1T¶€ J¸upâ(DÖBP†7Á£Ú‡4·¨ÊšR†@¹Ã-˜y†l{w((“h˜–£­¦ö©ÎÊñºåQY[ÌTU10DQ%5ORížÌ7QUãŸßiO~ÙÖˆ¸ý»:_®Ú©èc/Z„À‰™] ™ú´®‹©K8¼}÷¸F̈¶7pß÷mÛPÁƒ!ò¾Vc#ˆŸfYflC´^´«‹ÝRÛ„ÖmCQH!ZÞ–_V°¢2)¼7~QAT„€É! ª€Ú­´· @À€BÈ€}h6ÂÑÊÊçYH±i{ã³4¤>Aßsׯ|k=£j2_XemB ]·b@·ê{ƒÈCÃ,mózdXcLPÎ$:‹m¯·ïCÛMmBœŸ¯XJf­GjT /1„ÉttýÖ­•xé`j5î«o¿óuÈLVšÊÚŒmÛ!"‰5*¸X­Elß ó¥±d‘ÓGgíº°>Üz~§_ ©(¢¨(‚‘E$n{ÞÛ£©ª†$¨¼­ @QTu½a_;k}­ömô®tg„Ö’!aæ¾ï-º!oË ö÷w,ëuš'ÙÛnAŽdÝ5È:QÛ)£„HÔ§Øôjl5_°X^¯×ËÕ‚™…Mß©¥‘Ë‹ÈY‘ÕMÏ÷î>8¹wŠJš^Í]}²\ÿöoþÚ'>pýgÿý±;?‹§v³”=šah”’MQû>ˆHL]Yå†k|õ;¯¥.Tu½Nª"Ïê×n6›‹É¨,\øúW¾ l†´ÜÉ|µ3«Þzë]=Úµ¾|íÝÇõË7"E¤†N‡Àq 2OÞf}LÎBŸ†4´›Å"©ª­ú‡Hl“ZNhÕ{uë6­»´ZõÂæòlVYã¸çªØõ¡…²8_¶—7ëêਂ܈ ªnÅ9)%Iƒ·ÙhgWm>dûÅÔÙ )òÜ“Qk­1†Ã‰é}ÛÊfÝù¼Ø4AEýë¬Îúc[v|¿®_ "–dpc°[mž`J²Ar6EæU F‚€XH A-¼7A2YVìï#ç§g WóÓóa½„Þ€ñ'å™îÌjG.÷fwºº¦Ñ¥$©ꡉ1 ùªËÀg½³€˜ÙYÊóNÒV“ÃÝò¨¶™?ÊÇ£Ù¸Žq6Æ–—êÂØMf!„¶ms1Æ‚÷þ‡>øÒâü¼;;?r“¢]†è|!3ÆÛ²4¶òxípç§î“üéîηw²™«Ë!áéùm2=©X3óí:ž.Çå dmýpºXSfêr”yZŸ“­gÕe”íïLr×,=ÐnD;·¿ö¥U³ÌróüÍ[en¹OY‘»"Ÿå¥ï‡™É¿ø{Ÿù½_ûÝ*Û}ç|õ™¯}ÛŒÇýÉisq ÒGBŽMhñþã_”áüO?ûGX–‚˜”ID¼ïóiþó?ÿ7¾òͯ~í[· àL) ‰ûÞçÖÆdc‚˜ oÉÔ˜T ‘ŒUDq}N$¶ZpUñ䥬¬Ë˜ ߬(®{ÏWW½u`  ÓcjuR²„IH…žÐŒ4†œ‘Â2熜T‹Ô€ªˆÐm”½µ" "Ž !¿}o LD©‘À="‰ˆñ6i"%T#ü„úkß;’2'k¨Èsïòmolë‹Tp`ò$ @>‡4ôý4÷‘Ä AÈy}o½w9Š>Ñþ¥sZÙ3#i–ýÐŽl6l.Àh•É´íì*óÐîoÞ¸¼ÂMÓô}èº~q±úÈG>æÌf躾¥®]è.]™†Ø„®WÎOÏ7vÿðè ^<>ÝËÈ  'ä€X¶õ¡XDC ˆEð TJTY*XVk·Ÿ…‚U"ÒíÓŽPQÐEL™E3ˆ‰Élº»aHŽ•r„¼í×Þ:0$Þû®ÎÎÎO.æ‡# s› K·i*Ÿv¹±¬A“§ÁçVè0ôÃI´éû¸ìæ– ‰%-3Zp@”thú~h#¬+“å;‡W^0V5ifÈ£‰mÓ¯V$ô}U¹3ëvXwË,ŸF‘ÔKŒê|¶{0šÌvæóG3˜ZkJèÃWß½ýøWõ÷>þñŸºtsä\UÎ[t„Ô‚OˆÛó±XkŸH@’(€AaQ`ÁlÿtŸ{ù}/¾ò|À”,µRŠaùøü¸=8 éÒô`¾%HpÖXÀiY5í&†a@Ê­íc'e^YuÿîŰîl 6zïÑãÇ›qYUT7ya._><==OÁÅÁQV’©­ï¯\߯ªêég/eøaƒª¼1šW£½Åê"­ÞyøÆnn10%qŠV)gc0¶ßôÑY(3;® °-F¶m‡IûV“s9Ô¼NóÍéþ|èå—ž{ôèí*ƒ2¯†µNª£{«£ƒÑ·¾þjn{ñ4Ú4ò¥o¿ö‰½ì‡fµì{¦Ü×2xvqÑ÷NHÅ/™W};nVc—Õ!EVÌúEH:›$¡‘e¿š]>¢¦W§ÿÂßùÄéÞž§.­ç×g}*Ï7bfu=é6篿öjä%.»èóz½êŸÐ©d8;;ëÃ0¿÷pïÆÓõõëz©Ÿ±¤K“]Ö4„ι÷6Ä~`ÎílÅ b6ùW~»peß÷?õ“?ü×/ þùûðW'¬½«Y !‰ˆ  QîT;°b$DT…Ä JÞmY]¹²UT“u«Í±Œc«Q-fz²mZlºBx^ú@ZŸuÇí’sûè݇U¥×nìÅÚ[öyåó²‡NBñŒ%‘8ʽCZ¶C7ðÑh’;Ûê V"“6lÆypq \“8V$XÍ80*-7ëùɲ™0Øõrµ*ŽŸ»vøôS—¿øê—Ï“NÛ»Î&”fñïþÔO_OÎÿÖ>½NÁ: Ò§@vpQ`5m¨ ­6§ð™?ûøäazåæÍ‹åꨬoŒ'·öá“?õã—Þéâ¿üÏþ[X›Çýùã/=8ö!.ܽq´Ÿêòþ£#f'ßüÒ½?ûÔ7ž/o.Ý׿þú£Gç'g÷´Q-K€þÖK·þíŸÿ;å´|÷­{Ÿú­ÏÎâ„Ò²¢¦L)œwÃ|¾PåÙlÊ€‘ñÞñÙ&Ì.óròøôÄç=ë›ó‘[_ÞŸ~ðƒï›æþ «¬ (ÅŒĦ7Íã‹ÕGæg¯<ÿt6ÑGgWÿó½\.Ùh «úÐ~þwtMüßú“§.Ot03¨Ngý‰?õO}õÕWï~ëZw=Í...ÎN”7VÓˆ¼ ±ôõ'~ì#—¯~ïݻ⠷ÃÙɃ$$M"  Ch3`dMCíLm8¤Míÿò~·å~TeW&–{‡cêM—Zè‹7‰ׯB ӑ׺„Á¸Ü¨Fa`Øn*©…®26@«ìœ"'B|o GDÝæg “‰2  2PˆhHMÌȱ0io ,AÔ €ÀzOã_}1³0n6øàÑë§'g§g=bE†{n‚ )}ûιÉÝ•£Ka³RÅx6-VQT1ˆ* T€ ÐERÚ2 Å #3+‰±èÑd7ŸÙ?>?UÞ;ªûá{Í¢ñÖ©IòåW ….¬×ëIQxëòÂ@Cß·ú'_­ªÌ8o³ñÅb%!–N«ÌÂΔ×§s¸wçþ÷ÞzW Ü¯ÐG ˜’GÒhZÆD&)l-9‘€Õ "‹:2*,ª¬PEÝZ5B§Ö(z¥¤1 ²!¶dIÑ1 k°“º¥5B¬ŠÜ1¯OV›>HÆfÞ‘£x8ñY–É ËÓÆû’íÓf½îi¿rÖùÌ£ÅQQ¾ ¾;^,„´O¢ë[äú¦gÊÉÑär1_­çÊhÔ¡µu]Ç¡ <kmÃ4OmY¦àêK×/Íü°\?zëÁ®Û<:{H2g©Ùt©é‡ÇõT)Û™åÙœò¢*& »ö}W®–;Ëå2rºsû-cGIâÓ/>wóVÍ2ÿò>WøÉáìºs6š¹hámÎa0ÀÈ>ÙL„œWI)ªÙzlÁÄaHšÊÝ‘5X@4¨"pÛuYìP¾³Ø÷Í$ÓÊQ»ÆããÕx4uÔ÷ÃÆX)ò±`•ªõn³h2i&F2(Ùn9M`»~¸ùÌÕ+S¡Ÿ/.ß ‰ÔV—ŸÃ´Aô×voݸR•¹Í!9ï0©•…5M’Y96•îÿÀèÇ^ÿüë¿÷+_éúôsë“Ï|x1š\yéåë§'óŽcà~ìÅ>=:9½ÿÿEýñÿÔB£€Â‚ ÈB[öÁ„ ¢j:!€$U <¼rE¨ mHOOó¬Þíìîî,Î[£®pã½Ì¥.÷¡ôYl6e^ÜxþÖÈ®óÓÂwU…u/ܸvמýâµ}ò£v¯vsù3ŸúÜCŽ÷_µ¨Êo¾v†uiªúþ²wùÅ:··>úb¹GWÊûl™rtz¿'6«ùâ`T¦Ä ¨ënÓ¬Wƒ¦*+4#MÚ<ì=Ø,OŒœ?8½½ªh=.ôÆS;m÷°éŽG›\Ð Qn´é;î{àÔE6Έ5.ØÎÂU QTQÅf„QXXYà=ùv)l‰Æ†ãÖaŸ@¶Ú+…5°ª¤•‚RÒ#‚&T2Öme˜`™EÉõ)Fg²£Ã:O¨Rr±Qg¥Kí²9_µÍƒs ³YÛ|\¯»¾®ê#©(©²€ Šè“s€’!PD @±¢ªª`Ô¢GEŽôã?ö‘ç^Ø{ó7ÞYþÍ|Ygµ/8ˆˆ¨€Î/–EQù¼´"²U§ CCèæë./kç²,Ë2ë4E]Š Á}ñUóÕïƒ9jzñ>éZFO ¤‚*¶ÝÝh Ð#%5LŒˆŠª™PŒUUBAE$$aãŒwckLLsçööGuÒ‡ó¥Į̈.»ÍÚ’!¢¼Ž±¹˜–ÉtÚu*®ì7ÉV™ I&ÓqŠ­`«Ø; ©íçÃ@ƪIáA€}acêôuÎ4´’e6Ë쨚š4ô›e`Y[LžCæò˜ÒåÃ#KæäþÇïÞÌû³%/¹ãºš8$Q› *S$O›¾I˜M»ªËQž›Õ£æbIh‹ªŒ³=ÿŸü§ÿaYÙSy6çï?<ø_þÔìÒôÆ3—?öb‘ǤÁ‘æ¾èûÁؘâ“V˜%N[“6"¼7½–mÜßÅñâñÉq­õÕ²}t±ÆT©•źa2RYf}¤®ÆWvÊÂëÚݽ{?…¸\뀖½‚Hdg,ŽÇå°ZÞ=iÉÙÀ:_öIr_Øbdó f£Éâb}>ÚXÚÙŒÒ6¢&öjoP¬pŒ‰Ûesü½ÇbâîhrûþiŸ;OìÑ¥éáå“nùÆ7¾= ­껦ŸwëØ>ýÜS³ƒëß¼wt´õÖàþù¾òÇð)ôYPÝsˆtÒ|ïÑ9K¿X®ŽŽö.–íÞþ´ëWaHVéï¿òÚ§ËÇßx°¬g;åèü§~ô¥¡›«,ËѨªÚ£ÃK¯~÷Á½óV¼Qã ÅOŸœû§w?ûÛz±B_Ž~î_þữ¾±Z4RÚMXÀ¥.^Û/n>sÃçõäòe?iç‰;³Ž&ƒòx¶ÇËeæÅ^Œ&®Â+S>¹÷îñK;‹U›ÕõW¼î”ÙŽ_œÏSAÕµ7Û†|]›&Õ&Kà±Ø}_ÀÿÏõ(H’¡m!Wå¨ÈI!2lUÔÛC˜t+št`¤åHž$“ž7M U–å•i‡æþãG{™;(üNî‡.Ú%æµ;P©fÕr½a„ñÎ,/ðÒ¥Éý;gà<$Æ”lÒ”(ê ° l­EC{ã¼ôy Y<ª±{û£v}yÓÔö j5i×·9µ]—}î·I £Ý„`Œ³ié¼S[´)”“ÙáxcrCic‚&©¨wZ@ɼq ¼6ˆ/Œ¢Iš9ëÑç>ËÇcÕfv®‹ }P5½ò¡í\ýÚ×.~ûýƒ¼¢À}ÚàÏý­ùÐG_|ðèÍg§/GíïÜó¹ç¯½ýÖëŸûÌgþ·ÿæ¿í_ÒPÔRDNÕþìC?ý£E½¿>} íúÖAýÕ¯üÙ»¯}ã»o½>;:$Üëø¹÷]ÿ…/~îòáÕ}[ÒñÛKc†«uŸbL»lÇy£²Ü¬/§º^b‚‡÷ïÜxé¹ÝÑ(õà u¼¿ûöm[–ƒ4™]X]{êêÅéùî½É†ÃE×¾ùêyÂs§1aû Në²ÚÔÕ¨þWþöÏŸ¼uñÆ™¾ÝyœAœ¼ø?øòsëÓ»ÆíðáKÍIv¥¼ÚŸ…°ØTéðþÝ‹·¿ôõùi”`»ÐóªW"2¤´êÂÝGyî_yå•ñ¨Zös3Ø·¾ó֛ݣµÆÞ¶ G29Ø?9^F¶'šv.í9ÔÔPŽu·Y.3ÜA®œvžˆð XK QdÛ*ìû~"ŽcXÆr F·ôfxâPpè’²µ“Zk·VѼA‹ªfk.hHÔ ;ëUHÅ<‰›T@4ÆDñnñÂnüãßø}ÆYs±A”˜g™G·®Åª I)I1j "‚°!%áwîö¶î„uÛ&•/æ±T׆Ü^N…aƒª4E®œ+CÊ÷OÏÀ‡©Û~ýälˆÆ³‰m„ ¨Þwʦˆy¾>/Á„®5®pÆNËj2M]°‚õN}o¾öÂ+½ëá'nîZË‘‰0ô~¬Ý¤,SÓUFªfè–Üî~ßGG£ê†Íçú嵜»°~诸‰ËîæãŒUý±÷>rôÊK±.?ú¾G^î©Ç¯í|êâô|Hg ˜ÒÉѪM8›nGP¡[¼ñúËv§ÆVÕ IDAT~æ³ÉxëÃ?ú‘<ûöï}æ›j{ÖÝy_MÆ#]Å‹si›kvò¡‡¿ç÷õ‹‹•Ìctá©iªâÃêûÍ›¿ñwþéýaF[³_úùŸùÍÿöïÝ»{ï˜U,ëuÌDjg²ý·ÿößL¦ð ç«Õ:&[‹‹Õ¬wçë’ìêr•rÖZO&[ ¶À­Éæ~ÕÌ (lR;åöb~¦`{åÓjÕÝ_–~ù-[®¯Î¦;³ôp1¼‰µ$‹tà#ratÕ‹ã‘R¤—Ï[ÒIÏÆú,2çHÛÒ0D6qk/zóè<ˆR›ùø„KYÓ‚•Ï8B–ZÔÎÁv’.Qè»Îµm;ªiÐ,FoÏn–®J¹b³>ÏJ2¡6ÊZsŠ^táH[ÒÊD˜Sa #Ôd-¢ÅÙâ×~õ7¯MÇûÛ“GB¤ÔûÔ×Ý9ßÿ©WŸ|WJtlèü÷Ÿ¼b«›»‡A.'¿|ûÑú/Íã|l5æoÝñû7Ìç?óÔ›úê­©MíËÓðò½7ï'É8|ö ¿ã}\\¬Ž^[cÔÔøºnbàȤ¶öË~!sŸ¾õæ=Vv·¨Ú¿ú·þýÿ`gì’ï·÷'>ñÈÑü|ùù§>ñC?3ÝÎggo¼ùʽ*n?ÿÕgÎ_[uóÉËw›ù+ï^‡2IC•8êúæl6OÊíÝR)°ŽN¿Õ«vòÔ«wÁ¨ËõêÃû?1ZÖ?þÿG¬!£øË£“òÏ¿¾»ÿ^sî¾ð+ÏHPGíZí9· ‡WYžOÏ*ChF[#èÚf¾üÂÙçR–ÕºuÎÖšò>ú^ß?䣻wï¾yÕŒžý“¯ñ÷¾t¹êþañ¡ „¢A¸pÓYUYü¹Ÿ>(ŠL$( Åäì Hl}ªw¯¼~~Û!ñîÎîäðpäcë”0¢Ï9#*B%ÌÉc!I‚VH ‰bŒŽ ‰’ #&FÉlˆÈnv•’6¯€„À›ÐmxË¡'ïnÕ¢Êo>ûÆñÙÑb]g`•‡‚÷\?H];1Š‹bÍY³”sA%ƒhP’\Æœ‰2‚h…*Äá-f—*€*Jâ3@Bf¥ KE¿ùÉOGUàîÎÏöS„ˆC¸T(…-Çåö}þO#˜¨Uo@!c–J`æ“'ÜöT‚¢ÌüVð´ˆÖ6EˆÄ$´bÆ*6|ÅðÖ”Øä5d©b©ÌÑlFHo$5áÆÏ5Da&²¶P½‚lJ%œµ¤I#b¢UœE’d£ *Îï…j4ˤú¸Vš–1¹åâ¾_]œL¦MÛ´ œÛIg÷µª@äò~ƒ¨°€>5ãIqóëƒ_Ýyã•¢¨¬ÝµN5ÍÜXÚŸYN©×v4*k¿^"C%e¿ìSŸ+S®»^ ¶9"*W5XÕô¾YfPšµ#Çoí{ž¸¶\Ýî8ŒªIi§À¹²@—í…X幸\j= \–¥S(yº,¬K3M›µ·¶| ,[Ó1Ù Ã|ùRÈnêvÌj¾ºüÊ×›ßÿã/a w?üðž|ôÃz  èlÔ¡µÎŒ™Í@*9…1PŒ>EÐ †0äB¹ÒSG½\öuQ-ÖCŸ¹®º[\£¦¾Žx‚H=zx}­îaÆâûyôïw?ñðƒ‹wUÓQq}ÑίԺ2w_{²åhŠ ZVç~ŸW/7uqo[¹uáªí‹» s|^©ƒý-SLo£ƒéåÝÅ·ak49®¯ßØ«$ã‡oúäI*Š&õ´ö'Ý«»«¦áfHšA+¶åÅb¡²(`kìÉÅ}»»G:C`h}ŒM¡ÌÖvNBã‹ÒrP€Æ Åœ E­ÔÕë7”Ò)E­ 0!̘Y`€ƒÁw“ªª@âº÷ßuç’ÿCÃ};)p³,aAB[–eÎY£éûÞZÛ¦9“ÑÀX8$Ji:æïrÎþUê/þøó 7{qÎñõW^‹@ à+P*Š@ÎÝi¿Y6rÎ6£cDkdæ‹!5ç«´¥%% ¸$¢sðÙ¹B»m/ºk{PJ›*±,3MÉ (γªX¥!¤(M»Ä”&QiÄ\¡)êµt:r.•ÙH+EÄS6¯Éˆo?ˆÒÇwÛnhv¨F(¸©,Q§³%Œ€ Ð Ú(‘2“¶ç¦‰µ@¿^^»XNv¦ÄízyúÇŸúÝÆÄ° íŸ?¾{ÿÔwûè¦#Ã=+,F¦óœUxå…ç>÷ÜW¿÷ÉïÝ‹zä¢áE. jó‚”›–î”cÎ9€$¥æ¾Ã¶›&$²(-ÛŽYÐ`¶½(°VÛaµîÈ~ú3_?¹{^ª²ÕÿøøòŸùÊòxö¿úÜ—¿xçùÛÏݸõîÿø÷>póªÑFd¼1Ε’Y”Ú¸±‰ ƒßâ@fñ‘@) @AÈh|×c?õ‹¿pxõc¿ð“A‚ÀP)yHó§ž>yê«Ï‡N.ÎÏK[IÎ}»–œD™ÒÙw=tµ°0¤žJó'_ÿÊd´›³¸z_Ûd(׈cb9ŸwNÒxZù0ôƒ¢rÝIRtyy²¸¼y8UˆYgR¢„%gKF‘~ý•×Ά+ûÛÊ`]+¤ŒJ€#mnoÀÍžE)%€‚ˆÀŒ$œ2ˆCÌ„ˆ póÚE”‚"„ˆ˜PÞ!KÉÉ w1ö§Jƒ"ÿ‰ŸýćÛV…×’:ȾñõWRЬ&aIïX]3mÞ\"È="BÖoÏ\DuÜ-‡óC7úÌv3 ÇN2pæ€+öº,J›”E²¢ªÒØ& 0AQ´„yc[¢ÐçœcŒÆ’ˆ’X“)Š"G?0\!ݪv¼òB–AC™B´š «ëR¬‚F•5…¡‚ Ôì(Ã$èr–„ |Àííí›ïy ,Ë”RÖD "9&j£1ªéV'óÕddËbû6·ƒJâH+¥À¨dhÕ­#Sê;mmH1†”r³±j;å£\.;SÈôDiÎÌy6›Î/»oËj}i'£6[W•+öp{k<~åÎiŽ2攕5EeG•µÖïîj•×óùx<ðYa·ww çFÑëÈyHDæ >æ4° LÊêQ©˜‡v-cÆÙb»*¯îni……✕S0 Q†>¦(ãñÖkgg‹ÓÉnµµ3Ñ#-¥ë|´¸¸|æ¾òìC·øŸxøGR:“C$@@Bä ü¡¤ìÚ8äaÈÃd{´e i$œùÞ“q¥«š¡c]$îV'í¤ª,˜±£¹çUßèrX’p‚B×w©¡†uö†eh‡Ž”5j²­wö>ø=]..Âüìñ$"ÉŒ*#‰"$ÀaÕ­#‡¦Û )Ä>敘0›aü„bۗʰ€Ä”™ÁR;4g‹‹EAo'Óf•çC䢊Îh§$÷­¤ŒÊÙ+W¯mïï,ÚÓ ´^týÝu»bí‹©sÑ9€ÂRÌ ²&²MÉ(«t’ö̘rᜆ,‚¤ sϬ•U1ˆÒF´¢ù! p¥ÒnÃa‚²,ëˆ(猅7̦·va9gœsVJéà%¶9IбRÅ[ÊÛ˜!¥*&ˆLœ «zýÜ…úþ…$ÀY#E€PºÍë--¿3€È`4¤ìuV!BŒ@@š K—ÀP!pN¨Š¦i†u¿½7æ<”(]¿âCßtM"ð44ÆhÁ²€­JÏ*˜6QwˆY"sAI9·ÊâµÃaµnƒäy½UжӅÁéH]:ÍzˆmUI¥®_;¨Ç…&T„GGG·lÓA’”›@A}»–íâÊÔ*,Ý*>|ýúdT] üæÉòå{çe9½¾»Õ4éø<l";P³dР ¡€Bˆ™Lé2oœ<"(%Ù?~sÿÁë{jÌA’%‚ UʳŸú+ÿ^Ÿ>ùå¯|âîéåJ &V};¯êÝåååþÈKíåýÕŸýG¿ôÉ«qüÒ·ïÍûµµzZ»þäö̪ÉÁŽh»X·Æ^Xƒ\¿êÃÓ¥*·Ê`à+O?ÂCO>r=莈€1®…î^ ËñåCG‹>]~â'?‚Ø(sô‡3(æŒ"B¤µÖ¤-IÊÁ{WhÄ J6î¿ì „@¤Rj´Ag]Î"òâˆÂÀïˆc@@‡ØòùOÿÜG«ÉÕÂN³t]s>uºÏÇÊJ¶2ÇÕ4û ¤H!¡°€0Ó&‘! KÎBZmâ_X’@’ m8³~”z‡|ÙßÏ£¤uë3” ö¬Ð½~çNâ&t¤ÁC—µÔS»}mV9k1š´òPô}Z-/rLšH@׈"+J'Ò¶º@âptZ8S»<“ÊH&²‚6è_˜¹-FÀ""œD¬µ}4"$dH”QéÛaüÔµÐöâc‰P¤èƒ×¬$è‹Q.ùÜ^¹2iâ°ŽC›¸?;›_žçÜÂtZ!âááá½£c¯}UUÓÉ$‡Õ|Õƒ2÷N/P®˜Íû<„ÆZë}lxBFBÔìΚÆK¼Xù[û‡ÛE=ÝB;V÷Ïš³y ¯RnÆ‹“;·¾éûNŒHêgã­º˜jR)žûÔÄ4„lµ5T{Ÿ³€&`TÝ»!ìnËbÞ¶>×[ûS; 1mc]YO§É{[@wV+§ÐÙZ•eñ#ï}/Mê¿V9_ùbõ¿þIw«L”‡„Jx±$ÎÿÞ¯|zµŒÚðOüäû>öñw?üÀTõ>眙Ö("–BJëÕÐ7¾Õ•n—}Û§Á­–žd!3««YÕ•†HeQ •ªjMß5©×XˆŽ„lŒÄ¾[ô9Çp¦oS «BSn¼ÃT¹ƒÕ‚çwÏnl_¿º»wekÉiäõ^H’”†ÂÀÎÖl%\8ÓÀ>ûÜOêqw2³‚¢ž–ä“p”:ßù˜&L´®÷÷¯\œÔÕÖ,g tqe¼sy|DY]6Ýìúõ0oéòrZÁþNѽ6¸B†ã³Õ¿üôlöË÷úÿÖ_ï­‘Êöƒ´1,/×O}í[áä%é.Êñ¨¼ì#ZT‘µ¾ß®ãyRärîµH1°Qtd«ØrVÈÛååådtº®ÓZ[kSJ„(Âò3Ÿœs!çl­u¶ŒSD`7 ƒ©\¡,Ë#‘Í9§¨8I&qpˆó¶í|óêé‰ðÇŸ«æEá ÓžaÃÀÏ›¯m^±ïÖ…1ÜN-¨êþ¥=^¶ûeQ—£¡çÐóõƒ½½IýÅqFܶfRÓ’Sˆy4¨ù2LtqsK,»áõ"Ý[ól¦wU¹k”8ÁÖó`ÆëFN…ªf°š³N[eÞÚNͰ–ØG¥a/sŒ@pyïûàê²k×ø¤+®V ñlçÉÉîC»ŸÿÚ7¼¹¥¬_´ÃqjYj[]]ÝZW^Ý I_ÓxžJ§á¢ì›boÛݸwvÿ¿yq Ï=žqsÏcÚ¿bºóA¾ñâs»£Ù­+%èz%©Õ‡¾é.‘bèû& ÒyÕ'Ôîúµ'ǧ7wn.N‡Á䤔Ae²ê%“ºì[ÕÝöÅØHÕߨ¾z³t•ºÔĘFe½˜Ÿ/Czþ«o~ëµÿòïüÿéÁá0‚ŠÒ›)¾‘w\Wxû¼ `-ˆÈ[ÑWb`ƒBE)TcÒXZHZ°v(À¿ðó­2î7vÊ{¯Ÿc攣õƒØU"M¡mŠÄXô$dƒ‚™ÒÊÔÑn#ƒ}WÚÒƒ¤zÔŠh°‹…×CœíŒb¿zú»wNV¿óù—¶+PÔ3)ᣄÛwŽšÐÿ¯¿ùi­ÀkäšGÞ÷,É*›–Å´p£.\DÎo[z‰N"‰X+çÜHkH£Z#ÅÌA2×®ö=§bRÇœ5QÌ9 [k“°¶ÆZ+<,.Ï^xî^?œ°‰zÀ.SUd£ôÐ6£bBÓé<%&MsÎ@ ¬ ‹x 𢴨ŒD$ " @1³PúÎÓˆˆ€ ¯!K— oS(ƒ@Ö~šaR²å8Ã+aÈ„ rU¦Ñ*—†¥JI/}£2¢8Ì”EÊœ0EI‚ ˜&Rè^1`¦<ÄÔ'¨I¡‰&eD$ !T$Ј ‹+ BÙ˜Õ[ΊB {¶Dë4§R¨Êmò½3lI§xH$$¦6ç'å˜0‹AE”fÅ`‰¿r6+D„ìû>Í;ÍÔ…ˆD¡0)ûP11G7"43ƒEU–:­ýโù*±ÌÕ°6HÁwuY0@çñrŒªï½Ùûâîþä?õ‘GÙÝÛ™Ä~}£t·îÛèiÌã´fßEÀE’²j2(íBîï_Öµñ Ç÷ËBƒ5ì´Î%g³Æ¨3æ!$|jL¶»×¸ÂyÊ®œ¢™Ì‡Ð V»É‡nŒ D1{A°ˆS¡zÈ„ÙåDÉ;­êjܬ}  rp! ýB3WE¡Ë:K&µ W§¶Ê­-5Çàôœ eF-ZÛ¡ÏÝŽ™xJêzÿüÓ/¾üüñl´µ3s¦”©Yµí´8¹ÓÎO»7¶µÆXÊÔÑîlruïñ±Îé[/¼ì†ì 7qEŽÈX£ÌÖ´lÉ ”&¨¸EqhŸƒÕiŒ¦ÐEPJYgH/³«WÂZª¢2”F¥Ë9‰D¥ÐmttH1­9‹¢ÍV„ã°¦ÒÑ|Yw‘9éÂáµ.•áR©2³ê³dáÑ_Qü%Âÿ”ˆ *fЃෛ“’¢0>Šk=Ò¡‘—ï)PÖŒ®Ív§“¢,Ë® GGgM^ÇvLoö+ däEð>pÓ‹V6°¼~ÿ3‹vËuÛA¨Ç‰¹Ñ;ô½­¡•F‰ m^®úê`/ëœôàÃ**V—¶â¼Î)jQà¥Kª úñ÷¾ïþñŽã‹ø©š™ðÃïºrýÑk÷V÷~â›Ï¾qûäëŸ&îØÄ_ÿß~ãdÉþBUbAÒdg¼ýž«'‹Ñß~ó(tÍž{±*paÑ8‰v)¶,}ÄöÖ•­ÒøCBè‡ì¸í˜P§ØRºpCLŒ}9® ¥¬ðÁ­gÇ‹ËãùäBž2 2 ¼U~§6›ËM½³¾=÷CbFæ·±þ ®õ1|âç~òÙמþúŸ>·Š+%VÉ€"BZhWXÀ(ãLúÖ#÷ó¥Ÿêˆ$s )GvBCÊiµÞßß¡åEtãÆ~¤yßõ½ÿINòÒ7_ºlWÑãüâ2E“–¬Û6@ÖDLI©ªÖMèRYn\Ç^B9C΢•=8Ø~ò±ë%òÓ_}~Ñ%"i£ËI q¼º»ÿÄ#×Ö¤~¡u‰9V§Ô cŒ‚Š´2,‰‘½Iz䶪ٽØa’Ãk×On¿ÂÀ¤¬2˜…uf›8«ª±]_Ö:ûÜûuA¥cÔ …±öbÔ*^¤¬œFš5ôi(,^Ùž\¶¡m[äê¿ûÕàˆ¦$T IÉÁáVÕ¶#-¢RizMȹŒY©¨4ºn݇ ´Ï7c 3'¶o áùÐuÙ×µQÅäÆÁ¡!ÊC[z»ÖÛ‰Dež‰ IDATÉF›Œ8Úigwg£R “ÜÜßåœ,ú Ê, [8ͬÙã};®+ EŒ \U‚oÿü6üŽúÿþذjˆA‹ ŠÐÛî œsd\97¡Õ®,Ï.–:çuU¶'bfbÒTÝ;Rò‚]Vª1ê4ä¢BVf`}»fdu>oÆi˪´¤4ó÷¨>û§OÞwM~µÇ—߸ÌÂÕ¶ó¡ñ™U‚‰ÈÒ¨~µR»WwêrRØÕƒ7®Üz`¿ð‹Ë;˯¿x'‰Ÿdýxñà£?xó±Çž,ŠÐÐèž~5¬Ç:ò0,cîOONNlïÎΫ×CC„e)[S£WÜ °<¼5–Ác¼¨tBkÊÂÎf»)zEº.+ˆ°|ß÷ ²wõ õ «ªW4}Ï­~ú_ÿñ|~¡ Wù«/¼zÞÛÑäÊÎÄùþ}øúµ+{&LèôãïýÐûÚ¬û_üë?6Û½ÒüëŸü­÷àCÖÎÌÞþ. lŒã‰¾ÛɾSïlWß%7àæ: R! 9ûïà|[øÆ(„ôoþÒÏû®½¸÷µÔFaÔÆ†ÐÎ×+È+7)›¶oÍÂÀ¨²¬ˆQò¤¶¾Ì#¡Ò¢ʼn£#§¸gqÙ‘~øÖƒ¯¼üF,Š“Îs’X)(‡zF¯.¾ñܽ|}O (̪,“ë3‰Ï«Ûá^®š½kµM ‘¼€DHdD(ËʤÈJ?pZøjç ™ŸñÕju˜š±FèãÆ±D„E€Ñ‘ã|^«ÑùE—¸È YI2óUÌS¦Ðn¤[öYŒADBä·í>6vêöbe"A$FæïâF…Ì, Æàb1óÍ7¢cj[‰ *$Iñ-3«MJR´Á!™#0"*J(à6¢ZA’€(A’lC"*gdȈ(P‹R ÂÀ!0J!,oý€”7·ÂH( €‘QˆYKdôYq›M [–®GÛ)&ézðˆ±Õ)c—µÖ¶ó¨ÅZ­TR bm¥ sÎчŽ%¨Íx—’Wš”5DÚ@ê `­”䨢èžYQ©5Âö¨Òù!¦Çg[W+¥J4À´÷ÄãõáþVôÍlo*ôç¾pzuëÃ…P?póÄVIHYU€˜½Šâ%£³”CåûH‡‡H’³•&fˆì³Ò6 ©œG®dä×ï¼~ûöé#7v·n'!26åHÀ”³T`,äÅb>?¹×ÃÂó*œúÁÇÊ€ •™mÎÈœ´qåzÝYÐ <*ÃD eÃÀ`æ‘+x90gï%7m~÷­‡ö'e…CöëUÛ¹¢ œïÍ»8ˆ³q^³ÆDm§0CX f"Æœ¼äJ嘲³aÙ)%ÖZÌctd“â~Hk¦d á"´m‰¨‚gædTÎqdÆ…«AéÄAr ÚÙ”sç‡v(­Éö+·_ÛžíUãÉb¥˜† ùÃûžM9ñÈ9TÆfýÿÏ?€P je¨ÑÈ]¬.…F‰pïzÓzq¾¬ 91Ê9=™˜j⤋Œh!š­j7 G€€xÉÑ(ÌCkÓ l‚¨Œ:!ð-` JåØ)îÚ U5Ý.•s; ê]·›–«Ý­mméõ{ÇýÑѵÝ+?öÁÇ^yñö?û&T{Ë&Ýë!ó´F6dÈ4í†äV¡‰CšßŸ?ÿµÚõjX¯¾òÏ?s8“ÃÐxŽDlªñ4xñ>} æþ‹¯Ú¦(ješ‹¾#à¡ë#UÙ,tò±VÕþ®ÛÛ³_zæs×ÇO>qX`6fÞ÷’µ;¸Q~óåÏë¼÷Á÷~(…7¼÷û¢r‹6Þ¾s¦±UŽ9MF•þ·¿ñ°¼ûÖ['íÇo^ÝzlGsyqÞÞ9yuýô7ŸÿJøôÝ{Z”¡âË¿òÏ ƒ"`H‘ð¡PË΋‹ÐíO·NÞxöüö7{âƒ×n½«>Ø]‡và$¬ mÚå¢T¦mVãñØ÷çι‹³ δ¿¿ŸØ&åÙj˜Œvu$'¾í›WŸûÚúB­2̶wddÒÌ¢óûoÚœNî¿ôÒ÷ßxßkÓ7çЈ`Ùê½j÷g~ᯀ»L>õé§~ø{>ü…/¼”‡µ1;‰9Gµ½³5)𡇰rAÚŸ­ÖK¯ Gô|½'ë^9{ñ2æÅ:`u›@{«"°Q€:…Ãé+ÇiR¹5/ËÐR$Ò!Y«U,j;ÞÖ”w'.xmJ!´œ‘+ÚtL­uô ´¦l#"Ô&ŒwWóûo\üØRß}þŽäãþ˜œ)\Èù­˜–ÍpÂXçAŠ2å!a37=wÆRNä&äCŸBìšuɉ#vI@¹‚I…H m€;R† 'n… ix‹íáÉ"!k €Y‚`ÁeÓ Ã€‹!”CŧL¢ë²”¤K€T‚S·:d³±êB×—ý ²æQkB`"È€¢0 + @ˆ’müÒ²âÁ* a$4)2(d13rB1*k À5б:Ŭ@A& œÎ)r$Wûœ1HLy…`˜¥Þ7Î\*+V`<±Ùô‘!k( øèƒïÙ°µÊlÕRçJ`I) ‹¥vª5)…¥í¼òJ‘µÎaT]òÉɉQ,+?rõrÑ‘ÔfRÍl2uÌKle.–ëª4~ú¦ŸN&ËÓËz¼mŠÒg™/Z 1úèEkPEð¬QC q™Œ-;îÆZ);«(·k fÍ”}t«ÎÇGCëÏFûAÅjbaˆÖ(à܇>Wio|P¬–sEеKŸ<ª-3Ž]èc„¡÷·|Ø÷!ç^H|ž#åj:ÞÚžmÏĘ“çž{ás_Z$¢÷}àɺ°×h½JàbŒ…Å'žxRl¹]6C°è¥@ãŠê²ï"‡ÁrŠå«Ï}3 «™sµ5o/Ua*Mj:žpJejG‡»ÅÞî•íɨ.m¥= ÓÄO}í•+|`zµô±ñl ‹®OÙá"´ •Û¬|™ÝÁµ!œäìµÊ’M@$\ëa‘êzâD­|èC^w1@Šâû¾Ñ˜..ïïãLyT†°ÊÍ/ß;ÕiVɸ I9dm^:¹»Ðj·¬S¿ªÁÞ0d+ãl- 4ÁöÄܳ!‰OS‰í ³Ó¨„¸š—ʱUY„‘‡4Í"8h£ŸwÝjØ™íjèLÌ\8§ArÌ eb–ˆ†ÊB£Õ1¬æËù3/|ûñ›Q©O.Ö†lçCY–¶¨ÎCiªUÊš }ƒQŒ1êÈÿ²®üªÿ×â$©«±sEÓ4JQÀDã"'Ô„7·´­ï¨é£T%08²»õØò½¤L1q>eñ" û-¡ y§(}Ú£†ZÏ>ôÑ)RJu>õY ´q=h Äܵ–|çr>­LŸòlT!û¾?¬gníì| zöÕã¹_£H…BŠ5F…dÈ’VãzÖ÷¨©ËI =ÝYæ‘v˜(­@§I31ó •FÃõ‘}Væu… kÏ—íàë²X9ô…iiè׫f\\©§Ó¢rxvÿ¸YœLÇÅþöxw$¶­ÛöÊÞÖj9=;îÏ/Ž&Ú6ΪõºC] <ŒG£ÝjÇU£ªªr’Þ:ïcÚÚkx«“åk Lm×øyL•1;ÆÜxèÁÊUFénÙj¥üzت·–}íêõóã;iB•šõöH?ó•§>óÛŸ-&×f‹¶ëûØ®¯î¾~ûÔ§8Ä­Ýêê¶ç´8_ìͦ}3ßß8‹S‹#[嘫‰ZÇÅ׿ötµ™žÊ­»³ñλo~ðG¿ÏíÔgÏ<÷G_}áèþŽã£ÇÜ”4Ê&„à[¯<3ˆ°pŽéæ·¯Îo¿v\×vѬ]aBòïºùîþ‘ïßçåêþ·ß8úÖë÷•0o/ Dú¾_­V)!FF@E¨b„ˆØ"#%$•1ûƦÚÙÙšLënÝäëq¡çÌDJkhDbŒQkÀÚ¥BDrŽšP…vbÕd¤cêX'v™ !¿åï´9)¥ ˜ƒÏœ”ÕNXÉ3*¤_¨Ö›ÿg6`›•"0@‚·ióïÌ $aA$`@ÉX›®·E‘ÛväJüŽä/‹lÇ,‘@#åÈ(Y+D""$Ξ €¿Ã‚XJ@D€0¢`Fz›-Do Ö”VÚ[…€ˆŠ™µ0 H†1+´  (å„!§Äœ þwòÞ,V×4»ïZk=Ó;}ãžÎÞgŸùTuU×ÔU=w»Ûv{ˆ-’[¹°„ƒˆd„¡€%'$&t@ 'ØqOí)înwUu Ý5:ó°Ïž¿éžqq±«ŽÈM_Æ<—ßÍ«WúžwýŸõü×ï/âÙs€èLB ¸ï:Ë€:±@ÅJˆ­‘r¤ëm×¶Ui”"d…ˆ}ß:|dfˆR "[×\¾²› †\gó,C‘}ž,C"̆¥ãØõ-Ä  ¤fÑ™¬èÚà»Î6¡Ò ¤i œœs½à$uoz$¤d%ÜYžÚÖçy)¥ ½_¹Ð7P/ë”ãpc}0(C]¸Î‘€Ñx“¸-G ÜÎOO—ÚœŸQ£$ˆyŽÎõž­Q6ňˆ]×Íëž®R™kÉÐGf äÒ*yë|c̲üo}k\ˆI¦²|PÆh&ã!¦öèèøädf-ô)Pâ.zåBëCÒ¤¤P:¶!ÆÁÈCn-÷}¦Kœ”P•™ž$¯Ÿç"ßÚ.¼Ý{0¯ëtùê5£HF»0Ûoo¼8üˆ"…6Rj­WvBðBèú†m'b0’1X)3FÀ‰38çëå,zR‰À)Qt^¡RH(ÉŠ ¸襢rH“‘.syx:CÒ€B cShv-fYÞ.Ûä“clzGDL‚¢O$@¡´}Ô¢@PDd­*ËIýõÉ{×ëªÄ$QkÙõ @bŽ)Å=Cü£é8D”H1Dà>¥<7óÅ¡6Ø÷}çºô;Ü{oŒÉó<¤”P`Ù9[-²ì»*Ó<õ3QQå“õ5‡ž¡Âeê0#|+d­U%Šx ¹¡‚ƒh¼p^õ>%ŸØ÷!Å>ELì! ëäcàè#bZX—¢%ˆ¥R1ºÎGÇD\ÛÍÏ}ŠBê%ßëN®_Þ퀷2=.͵‹ú¾+‹Ñ˜½Ëò¬‹½ÎOÇ•R‘¼Î̤[,ƒ R–$i¶êFƒjaý;wùÜ@Ä”‚PdCÓp')_CM}´ôÕû'ÞEz|÷ÁÅíía²‘šŒª‹—¶<Úe7Ó™Z«¶˜yµZÅQÁÌ£ÑHH¼Ô÷]£4yXĈÍÉü°uŒjì{ÍQ™Þ˜žÛl­’GS!ª£Åá+ïî«éúfµjçÉâÉžÝX¿4ç¹R=OÑ+f ù¤hzŒ¤'ëÛâø!o}ˆMWo òw¾yku·æo=ì+eº”Þ¾³ßÙ !w­Û;‰éîûÓõ’r~ü`¤i3 ëkã*°ñmU“ï·67¾­ŠnãÜHu)”hþøôv»¿ðå_»ó0(Qˆ¬xù¯æ™Œ)vMS¡F%!Ï‚R’kºÁ`¼»=-L* ±\ù$‚ÈÌëo½ñîמ¼0Î2½èÃ*ˆÑVÈJ‰d ":ëò<÷ ’(3!€`žÅãÃEëSL("i ³â‰mL]×ÔÍ"¥sE‘e¹DLJÊH,RLR ! ˜ñ ¬ ÈBJ£É$.•Ђ¼ëuN2! AÐYŽ«PƒRÊ»HD}àä 9²\ˆ=[/1JAœ€ X]Pžˆ%@8#ˆ€˜˜(üÓ«™¾P21~;Íž RbZø¶Ö7NO犑-%ÄÈšä™…$!J¤\JŽA¦„Ì‚@`!:©Àú€Hgi8,élî ÎlHˆ ˜‘"b@ |¿Ýâ$ø,äR„Á{D22;™ÄD(‚"BÁ9dÌ”À"@ Á1³ £Õ ôKß‘ >²c„„ZA•P)‚ÈŒ!H €Twuï|bUë:+QB:·³Š ˆ®í r.23a9ÎÛe•ç2]½*‡b2R›ÆÇ^øÏÇ€12‡ç9fš%0ŠÅ¼B­Ïmn]Ù)”Q`Ìý\9–D*„„ËÎ9Óº(”` ݪ‹çH™L¢ˆm­GÇ)rHD¹6«Ä’ØPO¡ggYëì,@.ƒ$)"’ "¤˜l¯”ðÞ¦HHN1±G„g@üÎ"1ÄûŽ2Ÿgúôtþøà`:ÙD™Bl²oÏÈH) ç\Ì("° `J’VA|7ë¡þ@&)3­ŽŸüð“óÕâxöÇFJ]=zÔ&C ’ób$+¥ó¹OŒ¤ &Ö,“O)0 ¡“±´X‹šs!Tô¡&) @uT’2E·°VJP°MÑrê}ã * I†$\“PúÖRRʘ¼Oîtuzû¶–E5ë#•Z ty¶¿¤§Ã*öùÊ7ZTJ„íõm¿;v†Õø+‡Ç¯ìÝéµÕpPMŠ‹W¶?þÒ•i)OöîÝxïàÆ¼|÷´_ ¬¿¸»û_üûÿf¶{²šÇø~óôÑ鲎´Oþ@ÞHBˆ3Àãý^)Õw]&² ûµu‰œ#ôG«NúaÆåjël®o¾ôÌåýã“ÇÇ}oI›Al}Ö˜Û7n;çcŸò‰'žüò¯}ýá»KáNgŽÏ|®_ÞU¹ ®›žÛšŒ«¯}ík—.>we÷ÂðòÅæÖ[û‹Åw¿µiä§ŸØ™u]OU1…*…áKCìˆöŽO…V¹&¬F•AeûÔv}ȵ٫ï\¾ú‚¹æw/~ò¥æd~||xº¸suûr>hHÌÑÙ\ïÆÐþ£ßøê[wNí­¼÷„õúd€½îêØ/ÕSO]],BŠÒÀPeùâèd:P›ë¥Ê䲕M‘c6(*¡9”Ë™_õ’³!¦a }fÊè¥RʰAIJ,£ê˜ @ ^)eš¶I4– $qш!(Öè¬ê\×-³­Q IIVJ§„„gnS+$r ”" ›LÇu³ZÕmȆÕD{+…×£jrêW1€€ty,RJštÉ2^‰‹'®\º°==xÿÝ`ok@Rº™¦ì /â¬lŸµU ‘‘‘S:£!žÁã¿C”ø KÆ €$' ¤¤ÝÝzQKÆ@ 3–L)×&Ê `’™PCC ¢kY…$BHSãRùŒ›,HJLL(H§ˆD6FH""¤¼@)k{k­U2WyeJ-ÔÁ£ƒÑd*g‚ËÙ@¢E„)ŸÅk­cjÀà"Yëïò(Õp¾ªPD²è„ìsÛÑɼõ‘7·všØe²Êt)"w¢µT[ôÌ`ÐvÉs ˜òAVVÙ÷îúò¸Ô}½¾T#™õ“µêüÖt±ZΖ³­­Íq^õõÊ{:µ3%]‹%­%B!ùhcŒÖ«L†®acdAû'GµíÛÞ€e/BtFå>ù¶oë®$3PÒÌf µX F@GK£»šó,×2<÷‚LËØ4¶=ÑÊp⼘æUÙ:,ˆRg¡¸Æ˜‚DˆÂ‚)EHIÙ¦oû6˜ ŠÍé°G߯ºÎǾ'akºuº÷0El[<]A™¦€]Rh!M&up10 DNòჽQÉÎBN• Y^èR’Éc&›·T¦oß~uµ:Yµ)Áx~,³²žÝ±qîi|û0Ì9žÌþ¨wHŠbô!„Uݶéx&йviDÁ¨¼ÀìšíZ;VJ1JIÄ(¥L)aâÐ[óît5jb„©òxéëD®ŒºÐìÄ3¹a•%â{©…˜çƒÐ:ÉI“-V÷WÍ2Fv½“EIQf0w+ïÀèœ!xo™óàD5P}Â<8¤D 0°+3z[eC(]LŒ„ˆ1ô67*%´Ý)i•ºŽþàn^Ü•vw½ÿcxfÌb&"J!rò)&¦ïØÙïªXÿñÑDtÆAL™‘“ÖÀÜ<>U~Qõn©ŠHåÒ+E” ±1œ`®¶¶¶u‘w¶_.—‚1´!"§ˆ>É$„¥ åÈ{Ÿ(³ºPsS'˜¼dVè ÆäAÇ$1y.r€húÚÂ@=4«~4.z¡bJ&SnlÍú>5²Ë½ëu6—¢ðià‹ 0Ó ²,ËŽG™T> Qä$h}¢Ø»€*¿¶]Ñ„ìÖíe·|µ™^ܾðò»ofÞÒdy.d(6ËÁ²¹1Ȧ½ëNÕ÷  ɵ ‰ b´Ák!•ª·BD—K8휒‚c>ß_À‘¤Ú>¿öì³Ïܽ{{Ñ´k®]WÓ<ÚkW§u˜ßŸŸnûèõõÝ2ÔÒvùñ[wöÑùÁæÎý¥Ÿà¬[,ÍÞj#+.â™8]óÜ·Œ|¹3ýÞ.œ¿Ø›a4÷);íšbÉ(-ƒÚȲ ‹vŽfبD ÝIíåy1¾úÞ«?rísϽð¡ÝO|„i.nݺÓ?º.Tß5`ۼЇ彇ÍÉ2I’ºhûU•Írµ<·µñì÷=ƒ}îÙw]¸2dp@Üzë‘ôZeN¦ QË”Naéêl7ý¢)Ì ¦˜V†± Îe[Û…T¤õzäYQJÔ¶n¯µ¢ÉrˆÄFz2W©« œ´ålÿûU–{5`tgD`L¤”RÊBŒQɬï{ÁŒuçÏoÛÇeeœo7¦—ݽ"U++(:ï6¦ùÇž¾ðîÛo,ýîöÔ?¸_оvaïèNg÷¨Þ+”áˆ=HC $$P â“/2˜>pdžÉŽDôB0‘HÌLÄ’ àÌ|H‘¹yóvïÂÃûׇ×5Š<°½$ÙAlbŸé”…Λäµe„E($F«U•nMêeO€ÒgI’"'abDßÇét}:Q}_wÞ>Ü?Z¶13£¶ËÈÏ>9Ø\OÞ\õ¢MÜ€ÐDNÆ^—Òø\%ûU„¡Cdâ‰ÙJ‚“à(D° Q˜xF£ÑP 2ô–RŒ1•Œ)Q0(9Æ”ú2YÑç’B{”›r"£$aÆ&J¢bCŽäþi\z¿U –GÕç~üûíÃwÄ´ì»U5Ú¤Õq·X…bš×°2*„bXÅÈÁ÷ìŬ<<8–E‘¬–;Gç´5˜ÏQTIÆ~œs”´\Ô ™I3ûà[òu!ƒZæÆ'OíÒ‚ò}%Íp{Té‚{Û$ˆ­m¼½l“ÒÃL¼Û¶nÚä:›)8Dv™¨\¥µ+ÁByÅ!%—HHP­‡e©ä¹îuìÓZ¾†aµ8l}ÓwÉ&TŠcêÁ’Q::¥228È &OŒ18¨iÞô’`e$¦–3#K©9©Ä4—ÝÞMš¯J•…TwýòÝ7ÅP~\CÉ`»îðöÞèÜîùMÑnf˜›¢uæ£ÌÉ)Ñ4ŽePkòÉâRlÀóZ•±N!„‚éµ{ï+!8¤vÙSJ©÷î¹Y YuZ<^,±¶Î‹¨‚ñÒ("‘çùZ9¨[¿PepÐåF–4˜íUé³õÌö;B—TXãжQ–RBR86 ˜Ê  å0£¥K’Ôh@G&ôÖ”¹`…ãa.¤0D•ó*pV»– gm`FD`!œbB¶Ñ%Çó®{û›o®­m7nðÍ÷ïÌT”F”:ˤOÑDÑúJë¢È¼c%QxÒ½«*±àö»ªÚ|ôÇTÎ`ÌÀSà½Ç¥™ JžÀJ FûÉh°µ9ÀdZÆ¢Ê6Ê,X·œÍÈ¥¦Ô»€b£&Œ¼„Dˆ‚\Û 3›†HpJ¡¤ì¬©Ûv–û¾2ÕhcÀÚÜÍVlô¨äa÷÷ûA9f8nC¾* ¥²iN¥ |,¤&o“ÔÌ&É’’ŽuH­góÙ¸*Üj% p¼b4"Ú¼ô‰¯}õŸ¤ÜŸØº1Y6buÒnïlu¾A¥´wXUf¤ °ÖQ¸½d IDATGIS‰¤PB*ÄXŸËÞ-Bjó «Ñ0Y}íú¥íó»Åhm¶lO›n|þéˆÃãùíÅý]}虋ÛÛ~ïýÇG³‰+ 1Y>ÿÑ:ñÑlÑ5éÒäú›ß|ýÆ­÷ïÝØÿÊ/¼¶=Øøâ¿x(ßZÛ*>ó¹õ Nž$×…q1ÝÜ,.^8§ÔÈH(°^Ö>Ú½ÇT·ƒñh-FÞŒ•ÑY5hm/<¸u§9«`g÷÷^ûµ¯Ì¡pð¨œ^¾µX®½[+^eƒ|ìóoÜ|óqëjQTCQmTäOûëÕÚúPxÞÝyþtv´{©ŠÌZë¢ÐOOœRw½à”2ML¤2ž±8%ãÙìnŒñÌU€1)‰2AtŠ]H‘Âd:Z,R×u”›Äàb AXÇh•ÒÛÒQ$z;;‰h‹º…Ô{ÇÌgÔy@F´ˆè|Û÷½Ñùh49{Ü|9þÂÖBqì#EÀ¥µIkiÕ`}óöÝšpœ©ÛïßlëÎYÌTÕ5^b)#Ö§®9YwG9@PIp`L A ˆ˜R‚D$ˆ)€=ƒ‰ÅÜ~°í¾­ûÏ®’ñ;!ß¹7“sýjöW~úoü…¿øçKr¤dà;‘@1@’” uŠ‚ „¤f!#Ç€À’ã”Б"p@F¢I,fM›U´qî\XVÕp .UëËåüêÕ-¹éSÓ»ÖwŸøž+”N—éáÁeFF4š‚±™9­8“²TåÚx|zÚpŒ1Ë5`6€Ð3Å€è£OHJ¦3pâoS¬… ARL! à uÄ$«¼ÈT¬²ÈËÖ‘èQÛœt©t%iäUˆÑ”f¶š©Ñh²òhSÕ;sns'Æ…Bwx:¯6w4íºƒ“ ÄàÆc8çÚf¥eÖqN‹«ºÐ4¶Y6>BPÙx²óá§žD··³>¸ùÍxgöxeëÌH=,×6&œf³Ù’¡‹¦ÊZç™jÒø#ÎJCÒZ_÷NØ00¤bLд÷Þ¹àÚŅݾ¶}¬C2F , Sž{+y+c•ÑZkc$»•tŽ\˜$ !PÖ>ròå ð1Í|k Mà;a&çä9!ªk“"Do×*ÏÔðÚÖZtïçÿæuë¯ÿÒ/ýò¼ž>ö¯ªG[‡;ÛO¾0ˆ Í‘ïÊ|œ)ú¶Y.On>˜Ž'Ïž{¢ôîÛ¯?÷᫟ýÌ'~á9‚‘Y ÁEh·/n?þµS³¹ÝÄ ´(KMq¹³]þk?ùÃjØŸR4# åSO_1Ú1açݪkža.£¥­»wS0ÁǶçóçž,² 3Y«£Ø¿×IQßøÆ;Ï¿ð¡ûÓŸû±?óÃ_ûʯž,AÿóÿþåÇwaš?É>غͤè½]Ö‹é¹ê“?pïÇ~ò /½pmyüõNì½}hïÿí_–P_¼¶¾x|zøè ‰ªÌ£õów÷nût:›Í|“<ž­:‡ƒ-à.ËÒåíñÑÑ 8¾ëHÑÔ«2˧“‘÷¶³Íÿð?þŸ¥9·¬¡ñêó×OU€Å{‚„pè''u_dTa•°d”6äB?”{ÿñ¯üÚÛç%‹ßù­oü‡ÿÑO]º:j»ULrûüίs}{C )rA$*¥FEe¤ )%•)%†$}J¡O‚yˆ!+oKÛ8òP‘Øô “‹^Cñ=ûÜ«¯~9ç­Ñj¶B…!ų»tæ  ¢$¥Ä>©JÆàÁ´…’æ¤n×§ƒc£3†,Ú¼tåúÇ>ô•—µ;Z{å÷ÿâ_ø>÷…Ͻðüµ×_þ•Ÿûëíà«ï]¸ôô7ÞèdD DŽÞèD‘R§)ô Èd}#…ŒÌÈDIžyhÓÑ.ümï'3}{ëáéþ³ ‰\Œ»c?¿Tô‰—=WS fÖù™ðÒdRH‚3 Bˆ„Â[-$À˜KÑÆ(eîSbP u¢2é }ïç>¾µ6ŠÁÎŽ=zxû7ÓPWº|)“¸8Ú§Ìd¤š7_½3Êm©Ö Xö€dÈ—`a<Ͷ†™ïŽ”Ñ®k/ïlAGY€ï·h¥ £Cê9p ]¤ í“{0?Ak³Ö¯àcÏ^™œ_ÙæQ…Õ²vÕZnùá¢v$m9"+oÜxï‹W_šæ[ÃÁ`‘Hæ“g/?áˆ5 ô>ÎæÿK¿°9Þ (óÁ(™Îig=çJaßk%…6‘`:ì«*´ó^$™¬h¢ÆñöóWŸ¼zõêÿòü-‘zNKC-SòÞ‰%m&r´1ïÏo=¼ƒó›#l3£¦£1Ž!Øh-4èUQô¶ŽiœØkC)ùº^ Gƒ®ë`ýw`µZÝxÿÞs/\Gä\sa[[‰k¶:±6F”’ÄÊ…/åÝéð©Î7»W¸¬6¿ùÊÛ§ø¨0›ÓLë@F`ÈœBHœHÉ¢^ùB!•ßUÕþ^ÀD‘&ˆÿt (1³M8#)½“© 0X¤È:ª¾ÑE Á9Çѱ )×§ÀC9p¾Ö2§^xÖBf…"… º(Eî“%•bôÊä¥H¾@ÁÍŒ.]ÚÂüñÝ['uížzfë ¶ýÉCaµ˜/m”I=¸¿ÿ´ïîFßg2[¤­¹ßoúyÙ­íÛ&†N5± *E1Rq:J§¿µY­Ã© KÝ ˆ:ö®íÐw÷o¿‘éñ¹qöÂî⤛ïTOÞ9}C+d„¶W˜ ‡lR­¸il¡«1•€!ËUçIùGwëeÈëVç:ý7?÷™OÊÉÓO=õÉO~V)”z»œNǓ̓½;e6Ýï.O?ýÿÛ1ÂÎõk½M]¥Šv2öUв(/_<nw¼³‘ýÌýs»OìN6v.¯ÛEëš³0Z›ºÞ2ÉyM '[[“µÖ-MŠf2Õ/Ÿúìż*Þ¾qw¶ 1XŸb”£ÍLe£L.g/|ôÚW_ùŒ—L“ι݋çËA1fòWu¯µ`ìc°±µQjQ;÷Æã=p²ÂÌùë….gÍâÉ+£ßøõû›çÎ;‹&RQY*RGš“ðI%ÔËÜk (X)ŒÎE¡3ÉÉŠâcåÊþðŸøØÓO<ù…ÏÿÀ/þF¹óýÌwÚoÝð8Ð"Ú2©eŽ´®ª`{à ’S¤ k#QéÆõEY&—A¬! Ö¶ž¾ty{7¥§yãå£î™ýèü¹O]Ú¬ÛÇo\Ù½ôÓÿÝ_úñ?õS2¬é¤Œ*CvLZE¿™å5j×E ¤HÌ@Þ[ã9†ˆBù@D$’D‘0¹Fª*¦eûÜïÇÀ@AE¥ÉÚs¥"‰°5C]÷M*I©\¯Ø3)&¡ËAYNîßzðK?ÿõ2+1lB`µª%O‡VõéÍÃSf²Ò»yn|Ò4y^ÅÙat&‘ èÊ4 æ 0Q—ÆZßÕu ´=œvAÈ8©Þ/bꤔŒ“šHrŒ¹H¹Ç(•‚Ä”$ÕÛôÚ;ûe¾¼8ž.ºI½YÙ½“.»°S™LÍæ±sÜ¥¡Ã—.|øÆíWsYI¢æòõK›Ï*&Ùw‘²,‹Öq¦:®7Ö§Ì®ÎØ‡…NBî{b$;T±¡Ì‹l¹hêÈCYf÷ß>Þ™^éœ5qÖ5‰„K!6«vbŠÉ΢ãÁÚ´aHŽ1±Ôr¦{¥zö‘cWÏdC—š"tyaBçÀe™Ð{'ûmH˜9ßÈ”"U¼À”SŸúýr4Ô“Œ¤[œ¶Ê>†¶‘ |î)"Q[ÂS15ö_ùQ£ïýÝ/ÍMè3+£0¾¨¬TþæÊy’EPÕd  Ф^äƒû{+”ÆH½/D”NEP©ÜP}/BTÔ«pŒ>9]´)s]GÛCurzê#_ïðpuêZ_/]Ï`Ûã“MÌÆÙš„DŒ‘§Ë:-L1øòïýöbïô3_úæý…> à„íõŠÕøòæ¿û/ýÈüÝ·šGÙPèq³œsl­[þÖêÓ§Ÿv+÷ðÖ¾8šW¿½l5Ì×ÂQåÚFº0ئWÁR³FùTú‡C‰m´{/>±“šå˜Ú2ÀÍFl±QYô(ó¥Xª< e_+ŽR»XöÔ°R“kãéœ×CRJæ®÷³£~6›§Îc¨#ʪA Š…^("oƒµ£\ÆÄPlö˜ž{î‰×^{bÓâýxðÊí{w‹nû¹­cl#œD»Ô°à¸iêÓ1oùÎÚnñ]•ïáõGä$”È«|RwQ‡0PòètNØ*•”jÔH“Ò[çέœ´¾8YvRDä¹ 8UÃjüÄçs 2Då¸À<é}»j;ƒF¨ÈÁ$«ŒÑå ¶G ”l¬L* ä߸9ÎTU[Û×»ºÐQ`…ìê²TŠãÃ-igç\»‘É=Æè: 7ÝÎ&[¥$-¢:»× :>ÍOëå^üš’Jb¦…oäq°¹Ñ[ç·7×7ÛEóðîíLJG™’.¦ÌP"áûQRˆbsãܪæ—lH.@Š ­ áþ½;»C/CÒLŠS¨—¡óÄÁÔ}ë°ð úÎ-J®ú¾Ñ~ã•oÕmØXÛ®ÆÜR÷ì'ŸÛ½tùåòòv±Ù‘¾uxÿþƒ›W/vÎ.»¦ƒÒd®õïߟžœì^¸¶SN^½ñ&ëkG'õN5øw~â'>wa÷÷ÿ׿]W•!µK!Ε–€Ë•w‰üâî…íõ­M-L’C×ZÜ:}7˜¬¯¼1X®ç[óZ®%¡ë$üPŠÔénå=¬›*¯ûÓhŠˆ&±ö”Î.]¸ $i%X`ˆÁhéÛž©C’ ɹ¾ç21shLO|hço~ ІT# *–Þî=ú†÷—/^v‰{fàd´öR¦Y™ÿ›¿EH(ÁCJ$PILÈÿœ`B'†6&çõŽ´4¹RJ¸|o]²#pì{Rè$غ¢À«eHDÔDßGµ1 ¡&!“6@ Gáòµs?ôýŸzïöïœ>Ú¿ðÔÇ/lOGÈ”D¢Ü ËÀœ0Äè|ˆG–§¥çzÑø¦SN¨ÀÆü´È|^‹ˆƒ­é„`° Á аGº¹çêxÚF÷®ÌäþIóã·þü¿ñãŸý/>î÷ORh.ž{o”ƒÂJh9xo­Ö“k-H9ç‚;Ú'):¦Ì×.ìˆ_þù¿ùÂsOÛ>¥+Y¬–i)ÚÅQž”¡ÊDQȯ¼óÆ`4Ùyò™ƒ¶^ÕÝüÖyþ¥gï=¼V½krPåÝÌœÛzZîŒfõTše(ÒúÆhc{tí©§“ |çÞ½ýˆ‚rÔ"¬“r B˜<8¯e®„¹°=VCCR!•…¶®ÙmÔoŒŠñ¹ïÿÔµŒV"Öýbqr:k^5r¹\6Öí­Ž©J(ja›skã§®¸Èú¾?^5M¦†‰mÛ¶“r0;8C ½³*BNf1劊”ˆCH€"E°½–Á§]& ¯6V$1!Üÿ—ÿôç§;nZݾñ« Äý[‡v¯ A 6D7k{ˆÙíƒîh)M¥1#A˜qR\!zk;fà(IqJuÓFÒ&%XÌgmÓÖýÔGèäWþî—n¼ûö Ÿ}bGøûÓ?øbÊVßúÃßû•»W7¯?wu[ùVE0jä©GŒ &ÍLg´YD"Wrùm33"|%È)¥‰álb÷,¾Ù ÿ, ÿìÇ#©®X7¯¼óÆ{ÃÒùÑA`€RD$ä$˜Ñ1IkNNDU¹è|Šu!)Y‚JetñÒ•j”)ð™P¶ñ™ÊRJ=·LÑÆ.Ì’ŒH°—±¨†ÚL¥Ö¯¼òÙéj±XVrBR8Ž}$ékSVâìsÂÃR*ˆRžÉ²*màÞÙÖ†eã’Ô:Ï“fŒ9£Œ^¥(“<›ªÎ ÉDJ¨‘I.ÇuÖ”ú3Ï\XÙ»‹}óäSkÊ øê_Œ-”ZßÝI'{{o¿{ûßûO~|>kïÿƯù­wß¼qóäòÕ}£ÈSÄY$‚wõ‡‡³ »ç6¶.f¦·¡UÒ”ÖÑöÖöµ'wׯYôpóý»ùøg´Ôe ±íE &Ä•R`FIé6 ti s ¹p½ŠbI…’‘±s¥eyÚ³ŠÃÑ„±Î 0$Àãcúð³¶·n½SVr<¶¾‰ÀëzQèJŒ-w&EgAcDÂïÜzÿþ­7®^}¶nüù‹—î=8:™ûea¤PûÒdýêôÀv)QïýõkWBööÊ’¬£ºvì}ô]888I\+ÅU¡šFÄ>úMJÉÆP ŠÖ5Ž1ô)"Iतt-ÅÕ`<^¿P–¦Å&3,†¥zÜœf•‰¦3èÑv”̤¬W˜¥jBw¶oÏn&`k›£öd’•™äá¼&zâÒ½“Åï¾ò- –}]Ë$äZ5ñˆWÍÅÉà–ob_6v”Ô\–dÝò…Ë—®_|ò™«“«ίß|ãõ‘ªKŠcY=\®œ’Oê³oÿækïÞ¿iß”ÃõÑÚ€.J3F4Ð-ãbŽêcö‹,[ßʰ3:ŠJÀ¨§à8øh„ R"@¯•°!LEU"+o}iäG?þá¼L V!v"òlGT‡§Ëæd±¯Cˆã¬€àûzélK.X›Èƒû®ª÷¿Øúƒ@JF²L‡!¤Äÿ¼Ô¤¨FCU­íƒ ¹ò%€ˆ1c¤”˜¹ÊËÿR1ðMh?ýñgŸy>O^ôÍéòäîx°¹½»Ñ÷µu­÷M»rÃrB"l<³sÚ6ÖÇíÍmdœ=úæË‡ïS"g{{‡ëëëY¦Ë2ïû>r»±6]»re¾h¾òÕßÛÛ?L¥üïÿÎÿupj³8KÕ®þïëÏ^A=_+Ïîíi×/LÏ?{Î ;"ç)%kmLácŸ~Ê9÷ʃ[€Áõ|ùÒU´VBìòm¡Á2rÍʺ“·ïù„róÂï íûYÛ–’230B\8?UŠE=,ú¼xéùëåÃ÷þÊ_þë^ïn]½&¦â°¿1Ô=zpÚ³OvY%{÷§¾ð=/|¢”"}égÿÞ§?ö‘ª2]:.w>ùüÎzÓ,~öoü·_ø¾Op°xëý&–G§vpíy<·ˆÑ"q\öÍòD†Ž0™Îyë£$ ¾g³¼d°ïCIkÉeÛW/ýПû³zTüä ÿVtMù7îïýƒ¿õÕÏ|æ{Ogïÿùφˆý>["ð擦YLëËÕ å“~Tz¹Š–H*]`í  /~ÿ‹yq˜ yeÛS¡AÊ@¬E²ª±HÑòŸ‹ƒyïܜϓgÕⱞú曯œÎ¦ÖÅ`á÷½Þ¾µ9Ȧ§+ãæ¦r5Ó³ÎFä^¦³Þ²ÑÖ$k)Z"ˆ•X¹2}e8®íóäßøZ±¹S[áQѼ|ìÚúõ+ý\›£ƒûMëÜúÆ•µaO‰`ªs•ñ¼HX!!J޲Wôò„]Õµ>tÚÚàM`f´5‚IzØœn¤ºé¼D¡ÓÀÁîBÛ¬ IDATƒTÚ?MM—W+Ò 6«|¸ëYɬßù¥3:´"WùZ>Øê&ƒž°®k„†’]ìkÝ”3îµo¿üÁÙbºìJª:öÑuØ|çðôÁßú{kÿá_^:XLÆVó^œ †eÃn¹<<ºÛ¸úÊõÇøö­oŸŸ\Û}|¤ó¾RmÅ·Ÿ×·žú‹ÿåú§ÿsP¹Î“Ø®Ž°œ`"þÜ/ü·§ÍEAʬÏ6âã/>±÷ÎAuzFYïÎÒòèáÃÁSÑwÖ .²ñË/½|ïõGýáSIšŒ·£AÊ!Föi¦ŽOµN=<ôNYW‹e’R¢eS>|tàˆÕúÚµ†ÙšàLgêE9TÖGßÓü{ë?P|˜è}‰¼œvý׉lÅÀ—Q—x±Ë'3ˆ˜!Œì™ð¿Bc¼œ‹‰‘ûYúS?òý£Q|íÎËï-[¹-WÌ  eš+A8Ie’tINõº½+[‰PGö+†Hºè‹¢(Œ1]cýÙœ4”Æy̬P™„瞺V¿s´¼ rs'¥a±øêÑl¸ù´sËòË¿óÞ…üý7<àdÓ†•ÎÖÖ¥n1s­ ÈE¹ &¤9 q´2Œž•Î&iËZi\,L·ÞO¯::?ÇE/饩µNäº^ÚØˆ„Ôò¬ªíªªº$Ž“´rž °¶gÓ…1ÎF©zœo©áÉ+o¾ûàÞ+¦÷§å»ÿõÿ„i/Í ‘ñµ›ãý³“å›xŠ'1BläêyDZçõ.Ħ³mkBŒÈHR!a¤Åf/+¡•ÒJÁš¨†°gcáfF °ÍÔÔU–$‘b€@ÞdŠŽfjwgtû#ÏuÔóè5½ÞŸûfïú•£Ãs1¥õÉp"õSO\¹¸è.æåÍ­u¹ßüö—Éíù®ÙÝ¿õæ·IB¿?1’àgnÞ˜•NÅÄáÝ{Mú›õØîúóŸø4û¾>)>ý}/|ý÷¾ztñVëFUÍ(†7Ÿß¼~…nß’×»m•õ÷§iš­šDND*%²]‡ASÛ/ý5ï#$ižôÓ~PÆ!¢ å•´.Åj¶h–írÕFCÞ² „@‚Ç4ÓI¢dpMgFWv×÷v•lazö•_úgXµüö›jríIâF»•oîžá·¯ãõ£‹¨£=Jµ¶ñX>°n¥Ø‰ÔEkAEÊKtÖ«$A øá¨?b¤e´ÐKÅJ’ç/•&ôaЪӥ)µ³ ÚªòŽÚªëçI RNZÆPcš×!CÆQ·d(I…Õ dˆS+tÒ³áæcðÃ5±9™Ì.dy2­­«Q´J@$DÕ–3KBEî¼ã£ÓEªSj”Ž{·†•­JÛ¨„€CôPÛŒXÁ†Ž#KŠäNy4Nx=L4“v™óÊqèp…ÀŒ$ƒÊjAGNŽMÒ·Á¡YbÃBJ`…¬8FŽÆ›”t!òÃY0ËîÚÖÚï•§¿ûkÿbójÏ?}ë[¿÷êýÔæ7Þxí¬^>ÿô³Oîî;ô•‡?ð#ŸÍnZùÜŸøágÞù¯›÷/ŠrkceÊ{ËãüXø˜].— G¾±Aú¾o•\[óüÈ€8B€Ôà¼'j¹Jfµ?˜Î7oÜ´Øk €@)Qd½Îy |µ9Ê»ÖÛy ŸMç›[k6ˆ$¦ÚÇ©©hQéÐ$…‚fvQ‡ª%ø,@‡^ŒGk¾94>tžBˆ¨ÚÆÕR´:f‡ï?xtfÎÁé<Ò„ÊÙ,²ó¥k6‡ u]à@Š\hÙÅ*n­ëZkÖG=A¡®ÙwHNpwçµ{ntµv²Í¯\–dÒêþàÎó¢ŽÎË«ùÚôd–ýÉHb”¾\×ú¼Ñîø»»üÖÆì«¿þêŸÿÈÇw.\ƒ@­.Þ~ýçþö/~ë½ÙÖí'ÿý¿òçÿù?ûy!×oæùç?²÷Îk¯ö›ne/ Ö¦ŸþìÓ/ÈÏëÞ¢'ÇEºñå{_ï¥ÓÕ²}¯(Xk›½ÿwåÆîÓŸþÔV¿Hœíʪu6ÌÎ>¸sw<Çó(3ýðá#™f)"wa§èm’;Çç%î¿}|msÂÅbÎËn!LõÇÌÿ@„KÚôeàœ‹þD„ý±Õe3q9ìúaEfáºãw_~·íˆÀÌJ‘±³éâäÆOëÙ^-fr1Îú-2B€Ñlý $åÚhØÛÛÞ–»9…Õýƒóãã¥éâ`´¾w#óúå£sœwÖ È{Ã|°Ö+ôÖÖÅùóO<ÁZ>š^lîÞØØ~gk“¶î߸>Éûgm{pQ”¨{…åVÄ0›ULBÉÔVG^°½¨; €‚l”¸rMEXv£ÑÄ6áÁý÷ ­ ×2Î1Dä(‡©ÜØMŸ~>/ãX®olÍgSÍap…i…ZU³ýãESpÞ9J¬‘*ݹºÛº¶õ€Gçu[E¢'R„žŒÏ|PD‰’tlB£”Ú¼v%KòåùE9oŽ/æOl¯¯¯oÛÅ»=ÔýÔãíÔ¯wD&H²g›FŠÌG L„(K AäRV¢ãäQ\ˆ!° Ì- jî÷FZ·õ ».UJ¢*s²Üí]nŽv72}ug‹Ù1øPp°1FÆŽ»FZj‹Ä/|âÉÛ¹ùêëo^ÌÏeí‘ ]èít2ðm¬o}ß§_HL%P®¯·íj2*‘¬V+—ÓŸû™$5*ßÕy"„Y.öïåûÈ|êöúÚð©'7Sû„Î诬Î>ÈŠÞ¼¬¾ò­7ž¸þ´9>j|p "I ¤YÍœ‰(¼ñÀ‘ÚÆA$BM¤Ê‹Ù‚Ù6K90±ÖZ+B9£O§³µµa§ô¢$!"¡ÕñUû ?÷ó?ýC?ðÄÆúÁWÞZœ¯óÁ»Uñ÷~åozMÅÁ$[ÛÈæÝjæ(¦Ê"Òàè¸ÕD•&C:FéY°WLDB  @&@äˆL½b$ˆ/d—O"—ÿ DD„ˆÂÙ(eâ}ü0áVtB¹Å¢Êò>’H 0DŽÎ×@”fù$ï§(…™ˆ8ŠÄšPý+;J éGA¢[µZ&ÃQ?!ÉÎŽ]U¯¦ËŪl˶‹BcçãÐK›Vz7D2$ßv+†èºh;ÖA H=L²ÆÔÓÅ\jP"¹H”EéUµ°uÙAžjR©'šNp+ÂB†A†(¥¶¡à$ ø¨É:\Í’$R5;{”¡¿õøõ£Ù¹ªk"H3ý#ŸúÜ·¿ñÒ“ãyõ50•­®ï e”X¬­'ÉÚ8`ñèÑ¢ª/ÚvŠÙ¸,[Óm±³™ +sȲ¨Tàƒ”¥BöRñ‘=¾ùôgñ+ßšNσ᨜`*4\T¿óúk÷L›÷’F::<hL•gY€Œ¤z|÷F’õ¦‹Ò ŒÞ†n¥( e•¸¸8=” Žî?Ü]âþç_늵ϬÖÌŸø§ÿÕßù`Y6Olü'ý?:)ç¿úÿY¿XáOþègžÿøK¿ö… ]?yóÖÆæ¸6«¨„ˆâÕï¼%’ÑÑéé{wï)B¦iQJô2 É0‡T›k1Ñz<Œ(UD`‘ǽÞÞöØusðåxï…ŠáøB‚~¯(È­òïé†þ½õ—»¹—™”Î9ïÀÿúÇ%wú_]!“R*„}D D$ã%.Ù1¦IòÌÍ'÷¬.æoÎ+}ᅉݣé9œ/rÕ{|m|­ß' TèŒAuãçóùjÖôóèÚÁ-ÌÜ̖竬>ÁYãV­÷5&vâë_{`úàðü×þÅßýÙ_a]Ý÷ÝèÏüØõ…/V©§G‡ÓÄòlÀÙ Gy“f:P$ŽE6ãÑÁŪ±]ÝuùLiÉxÿƒéO|ü3?øCO?÷äî˜ Ûñ*©2!”ƒ"µ|ôU°‰’Ñû~¦£çcÛ¶¦²Mwi¨…lٸТ—  mâJDQ%(„æ\S‚µ .² 2q•‘Dg]»j¼¯öJ¦®ú;»§åi1ìÏ>~õ|i®][»¾»‘g„2ÌÚ*‹Ããé¢vF)@ÑGëjnÙvQdDÀ.X)) ®I9ÈØÅTdžqÚ¹Bÿú_øi m*źnVm•LµL)Å(â*àŽ-‚eðH*-†:••©ƒõ£Lý¥?û#"ÆÏ<ó1Ju뽌€!x¥”ÞúœÖ£I–êt-ͳUפêIam'O²­ªF€ÀÚ1*°¾žÏ‹]{þú«\W>{{]õzg³n}ûê{<8?4ËãGZõŽ/æ÷¥ñ ˆÂ{¯‰@(é‚Iz ‘H^PTíª 9Rå°õ&f2õ]g=î\éçYô®&"f!…Ž1 cHõþ‡ã›ÿGªðc{îæ'wæ‹7~ýÍqÏß|ãðøÛÊÝ[‡«å;wßîùÇn?×[uóž;›ÌN릲$4I²ùCó´‘#sd„I¡PË‘}: æKIòCó‡BÆMíâÚÚšu­Ìáb:¨½CŽiךÉÚf¢Är1 ! Êòlœe™ ªkT$rR0錄¬ì?qëV1 »ÀÍý÷§åqxâÖãBF¦Î¸UdW­Ê;wî4ŽQ¥+×E]ã$Ó°7X€Sˆˆ #ö³”R—³Mì`yaWÎ!',tÖ/úbاTõ§Û¨“¤Ÿ#IÐA&(æÑEÌa’ôu'Îl[E[[äy4ìØ€‚ˆ )p".]+'éô쎫ïõîov÷=zpøðk/}½ôÕ×ÿÁ—ð“Ÿúò×¾ôÈ“µÑ¤X“7ÿàgÿöK¿ûJßøè§?òôG+ÅâÇ~æOpÇSË®É!!;O±á8Ïýäþ»_ÏGƒÍ«k»0ÈŠ^NZ§žMÀeD2ýLv±M†ºt½ýì“×·¶Ðxñìóý'6íñÁ[¿ü¥ý/½ý¨*CÆq{}â'ºÝè/ˆï=8¥nα…gÙmëåúB©ñ§~äSÏMÖ¿ö·~wÐO:–UšB•Å@µï<—ûݾ‰.U¯ xˆ2»8­ÿ»¿ñߣ]ΫòNûVMº¡g£©«Úµ bm]ó}{:iå/Ηç{»»gUÍ((%y”>a²,‘ ­5µ16 ”Ò;粬(ÆAQ@ y®¤LÓ<Ö™®#Ëb^ÎC ëôÃãÕÕqº“ðb¾ = LFÛ{O_ÛÙÊó|'\×zX’3 ì“Ïliå—ˆ!¸à¤ T€ô”¿ö…ßj¨×Ïû6ȵoç©<ïàôõ£7ýH©ž|LŒ3%v¯­·³#Ù-¹3¹Ôxõë2,g&pÅN²ô™8ÌtÓËbùØã;_~í•&Þ¿ýô•û«d±š¯Ò'Ò«”ïgøîû¯Tñä§üæáÝÃÙ{¿­¯_û¥_ØùÔÇý0)ÆàÍâäôbÑ´çûÇÏÞþ(}`×3ô$‡ýDõ‡HÒTË4‘‰àƒ7ž<¡"I¨\+¢z»'Ä•ìäxöõëWFúÊ$÷ÈÕ™¡çËÅ÷tOÿÞúÁŠ!‚'܇1 LðG#Òÿ_ ™##0€I-þË Nfþäó¯÷4ŒJDdRBdŽ90•* `í‡Ö¬ÈZo¹`(cŒ( þáô(áf,Ãôhe,€^:éªØØ¸™¤ÅÞvNn‘‹R+¼_víÊ`êS)‹ÞÆv^P&žWØ® ªÚÕíq®Ò Þò:ÝÎgÔH±!ˆÝê›/½?¿èç½xüû_.Mºo¹iL]¶~;O{ƒÂ§ S™ìloÌ|gõ#—µh"ø^2,.ÎŽÓÉÆë žs¡T”Ò›H$´Î4®I 2£ Ìœ¥ý¡BÃîîúç~H9ˆHÔ¶Fcò]éCxTHJP#„\tíå©qÎ]ŽVJ)­õ'góó‹jUû;+Ÿ]ß/«•éNΦ=EY*llDèŠL6] 7Ñ·¾½Q]ɉ†`¬µé´„<ˆ@²Vµ±VH˜vñÍ“vc-M"lû;{[ì[ÉØuþüüœuƇ3j©M`@y4+W½ D[wž%EàWÝåÎ.Q’$­qÞ{wyPmä¶ìûxeg³J3o—i"\¶'1FBº Ã’òCGHŒ|™ˆBPJ9çÐÓw—Æ1.ÏçO\Û˜úª¶¥Zp1ARªº\Ì„&×v†.¸Øš.šIbg™¢–,Q Úж®\uÆ":D€h‚›ufG¯íï—A‹ÈݰŸG‘ƒES›ù£}»¹ÝOzU¶óåªm[8nge‚!É5–Bê™ ‰à A'*ƒžÎȱÉï|åÍ«[z zšï¶lÇÉ¥…ˆeY^JS‰išfiêŒÅÈIk¢€ˆ ²$pD!|°Ñ•½^Ok}ÉóGÄD*g»‚ žˆ„’*MY*ï½Bá½'”¤õÉÙlÿà°ó!DJË\CoÑ–†©GILzã[;q¹:^íçÅZW×±j¬Ê™ 8i-Ï(ˆH20Dá̇qç E/í§©LuïÕWOG™?ûS/J›æJ"­’$)zÃù|霦cŒ©¾e×tž¡mV­5±)m»ìZ (¯4æ)ÖÜ]þ¸ˆH™@D—…Æ]FºOÏg1ÂÎÎŽ…ìQ"Š(¥nlpÖ/Ën²±AHJ3HŒD'«ë¿uçÞ{Ìgs'HG2ñ¤•s>ˆ’L%)LR;êÈÐ4þø|Q6Þ5ËÚ cœ_Z)X`…j‡:Éš®˜7¯œ_LM·Jõ˜I@§Db]Ç›Yl—êÿùß89;vM~k÷Ó±ÖÇ¿ÿ÷øÅ§zÅòàÁÁ“7Ÿ¼2C\1Ñï~å›õÔLÆ[ͪ[»¢ÛØFo( =""b"Š|9áò¯^¿ø!ÿ‘c "3ÆH!ˆÎ4ÕEyýúµÇ¿ z½l<’ç§Õw^}ø‘§_xæé½·ß}åK/}ë´Œ{;×’<û·þÔŸVã>&I_ù$no¯ÿŸÿè£u¦ÉÓÔ |çüáÁƒ^î½?º0Hñôþ7úY2žÈ<×çËå´lJ-FŠ0íæ¢V NRa˜8²žg-DL$jÎ0"9óf<‘*É¥r \®›fUÍã"& ŒÆ™ $Œˆàó"+ ¿¨˹à8)D"p4i®uU]yß 'cgCĤŒÝÃÞÚ,TÖ[[4bæP0¥³¥µ¾sÁ—“ÑøÎÁ£·ÝM’^[7¯|{ ±¬öï5…n^7 ÛÎÊò”‘Ï—¬õh¼>.;ÔÂbžè^rvq²\UËÆv]}ýÚ–ÇÖ.ªS©ƒ±f5ŸM}…:zèÚ°”2›\˜Ì½yqOÑž]u£èk·f,ò°µ5îªU³šyg¥””¥Pˆ4óã l&ïd‡¤ïš‡¶=X,ò‘úìÿØÛ¯ýF¯C·2(½I*Û¾º÷âgž®ÊóoþÖËýµA¯¿Z,²DAƒºu¦lš<Ï{J§10vFJä²m nnocê¦ ‘edUwf+Ûz°Â×Þ3ùíëýÁ;SµUÝØKq^ ¢Ô8€óMYõúà­st¯èÚV'R%¹£t¾hÎú›ýwîûg~êÇóT¯Õp}»ß¤_ùæ[ ¤©ÌêÂ<<:Ú=|å·ãøèƒkŸ|aÁô/~ ÐÌgï£ÛJ…¶wÿþéá²,Ö7uQõ&Ö¶êŠ"ûèõüsßÿ\WÕÍÌŽ†ë“AYe[ãÙÕš·"ï“ÁÍ­­[Ã^Z×½ruLš­ ¬åFeaçêxyüÉO>qvúÎ Û ¨ò<ÕÃÏ}ú©÷ï¿—ò|³×Í›,sW®¦™f*YÛ¸=8“, q@e=»ºž‹þ¨ñ^®)o¦kÃCÙ6¤‹$‰¸³wÏÕ*EuçM*Ó´—yá)‘ZK]’dk“Ñ.–m̨7)“zeSU|OÀ÷¨ÌŒQ$#²å`ÿMÌì!b .°&Œ.9bÿZ!†K!Q¦ †à<¸È-cÌ •Œñ€ã‡ŸÃ‚õ€âý'Ã^n[ ¤½NE_{«½`áT/;]Ùsë@@ÞK…È"2 ¢.|dJ¤a£·æÏöËeÖBˆuÇ÷œ/—³Õ2’@D®Mè<‡Ct¤<&«¶ê¼]ÕqzÖ‚õ"-Ï–JÙà—ª]MÇEzQrÚ“±Ðö“´¢³ÙCnçúÕ'9”©w‰ãæ2W]Ãå¬AD„ J*S”eBˆKÃ{OD̪—]¹Œs¼ôñxïƒó£^Žˆ$eg 2³1Õ’™f&¤Kà«ääÊh|m}-IXk‘Ž>#vÎë4Ôì¿ø{ïáÝý»toÔÿ¾çn“Ob8ÔŠ‚4]d>Ñ1ÆËÍ3ŒH –Ä"͆¹¼9N¤HÚƒÃûŠWß턘чù#Ñ7È!U$r**2]$2T’¤¢—FH‰P"P4>0»%^ê:šˆ=º÷þéÝ÷NšUÇÁ¹h8ÏsAy ‘ýk/¿c¾ƒ7‡–Þ~´h¬<¹è\–…¯š•@_w!Záœë¬!dgçkã|ïêúµkeY_œ_4-´)¥CD ^ ß8± IDAT ¢óm?MÒ[¼Úe|^ð ·®>¶ÑÇŒ Ô¨âÇž6¶¨Ò4@=õ¤G7_JEÚs¶ò‚I¦Æ¾ ¾ÇKÌ|”R AòO‘I“‘#çHEì¼e¢®3¼õÖ»§§'ý~1;1 {ŸÞ¹÷à·¿&™\˜fTÕóz¹üâKßšu-J‘tMj¢ÝÚßúÈuËõ­üó·6WKwçƒGmtA¥‹EcÙöô ÕkYNJ©ËµµgÔ ²©ë^š¨TÖmpì¬sÖGÖÊ»`MP+EÚoëºîÐ9*¸Ð.¢ r4É;c 6 IFIZöM×-ç]¯ÈÛóÆßè ÔÅÔ…ºÎ'£7®g|ÒvóÑ:Œ7ó¶1ÁÛº…–S®ÚþþçyvÒƒ¥UÝñl:ïÊñè™è–©ýž¨ºeç–ãkâÞ»gÒŒFýõ–I 9]-A@iËÁ`£·ž õFÑA׬Žß<_®BÌôé;§7oæK7®A6ù(-‘ÂþѡҔhB®À™¶m#ä4 ¦¶Þ¡h‚Ìd.fÓq>99;íªÕV¿Èžœq›_Y[̧;‹zÖ‘±£ålÖ—}F9\‡‘pD£ñÆžÌjÔ½;‡ßº6ÉÖv†yÔßzûa¬{¾UAI©t¾Þô­äÒ.`Ù4'«³"òjÙ˜®eG@i:\5°vw½÷'ò‡çÇ_úòïÛ%zlÎÛÖ¡Hõ±;ÅŒÖE7‡²­s]„Œ\+¤IZìmî6í‰7µY+ŒHγPœJ9žëëI*øN!)fW·Ã^q~±èZ[¬eÆÖÁq?Ë?úܵ\·=TÊ»®ô}™˜Yc—(GŸj`’ý{Ç„”ËÑÝ÷ßyåmß^,ú™H¯|íË/WZ·žºuÿþEæžÛÞØ{ìúÞº÷ÇkÓ•nôìcçç¥îu¡Â5uwc#™¯Ú¤¨¥¶;×Êruøø•þîZÖTUKAJ 1[™èžyzÝGwzöê KšeÓSãÈYgÂ3·w¦ËÓÐ-´"Ö›ëI?ÞF=.«Gçw××6C°(ÂúúVלKÓnOÆYÚŸžßuÎu«ZÙ±’jy~qðÊþSc¤~áSô´oÚA¯o €ˆBx/@‰“+ÍÞfñèa}q¸tt,“4ÿqò×C"xð]@âßLÿ‚?È‹¸ÌÀ&¼´µ2³3öóK/ Äe¤7^ºÝ pŒÁ“þÐ Û¶ÝeHgáCmøR¡ˆ,Õ´ê|HIhk]h‚$êáビÀ½µMc#ðJù cdç¹…†!«ZÓê¡ô î`ìœFå ®–m¤ÜqÌUVU „ËÐPá#U:ïY‚fÙB ÀQhFŽbµXFŒõ§c žHER€}hÛX6Fã'Ënµ³—ƒ”>N¨3mÛzï ßïK)¢!xc¥‘Ù{ï­‹Â11i’ ™‚u§I’ ¢1F)¥²­IQ !"›¢ŸD„£`BMˆ$AA*I€¡Ë%Cô"²F2Ñ ©¼T>p’e‚rÏŽ0 &£—uÓ(çÓ“ýn߸½\u>Lœ×1‘9†y[­BlÇÈäàY(mn]»q1-'Û“a¡sY3¶D ”²®AdïÃe˜¬C$'…±Ñ ’¾ óàkˆ¢ˆˆü¡³?Ìd‡ˆP9œõB°9›cd’Q 1¦uÁ;H(•bPË.Z¡äÝû<:.#櫲é¸WÈDÉÖ:ÔRDæÈÒ{®€*^ŸWOõó}`åU?F¥XÛQ*‰˜ƒ·Á´”‘fçRdéÍã»»ïL¿ô½ü©^üí/üÆÝ7ßÙm<óÑg†ë…3¦ŸC .Ô‚[Ú»öÔjù+±u¥÷àþÛuå×'·ï¼cŸþùÝ¡çµ× ÆP»ŽÆÅ`#2z¢ËPyD )cÊbŒ12Ĉˆ*ˆ1ò¥ò]ý"†ˆ€$@#a¯ÈªÆ!š¦¦<ëgi!7Ÿ²ÔšcÄ`%Fj{kÃЩæ ío]Û\ÛJ[Æê4DsåæuÇþ`ÿäâ,\»²íÍÂU(zãQ! Ÿõ¨?„拲mMÛë§ýµ ›öàáls²ž$É{<ò,I !z0x‹Á„Ø 6Ø6Á@$ `‚”s蜈,#PFÂ4KÓ«Ú¹Ð1«Ë¡?ï}gm’&ýÁ l›¦íΗËën¬ÑÇèCI ŸÍ:+沬÷gþôOíæñåßúÂç?÷i5œŸŸ^|ßÇš¾óú+‡§‡Æ9ouÑK sتó!mlõ¥%!CÝvö쨎P9[x!ÒŪ X-Ú˜ç&J±ljž_,‹iš'½Q.‹`l…¶uÌvw¼Ú:áD)É(ö÷÷OáÚŽ'š´:6Ñvõùb£ŠMW¦aF2kKÛš®ª¹-!òxB^2·k#½9ÊZO,MS/lÓÄŸü‰?õgúgªÅüøh¿Y.ÁzݘâöcÛçê(¦~Ù×tdkUH‰Tc,G륷Ï?µ¾ Á“ì©!.NŠAꩽ˜ÓÕñ°m϶½½íí‡çç‹UŠ»˜‚vswvt¦%g C`$"¥Tˆ.KTô.Krß•"‘ØÜØT΋¾‰„ˆLŒéPfóã3ÚÛöÁÙÕ¼þÆo~s9k6\{™Âª\•‹ý‡÷ò4 fùåß}IøX¹U²ÕõM˜-u×~îÅO<ûFµ:ßð•µL§ôx9?ÙÚX÷]tJ']ÕG)¥ÉpT€ÖmeµLÓdk²¹˜/îpG&¸yuóäÑY¿?\µ¥#[6«¼§Ç…t¹šVË4“§ç«dU¯ª‹½½q^€iæÕœp·>ƒá¢í|‚ë`e!*„Ðù6h¥¢ MŒ…±PÉDIc G¹oœb0Ò±P:xJ³QÀÑ{g]]v•_’ë\iÎV¶ô`Á91¥€\©ÈîÕw¿õ÷ÿé̬Ž1hîT2fY*4êƒ0¤‘'z,¥dæ`,^¨Š(T/KEZ¨A&¶Y‚® ­i«®å¶bBBXÖe‡!ÛÕb]$–ÎZ’€‚9ö.")-¡&TÆ$ìÀ±¶š%y íd½Ÿ M¢“l[¨tzÔ½4}xýúcÿÙ_þóßyóÎo|á7eQh¹È…ÊUÛ´K­ ‘Mº¶Z^T?÷¿üWöÒ_ûÒ—~ùŸü²/«nq4ì¡„’ ˆ„B¤™ÔŠ”t½,“Ê”!ytZ~ûÍã\Ù$i³D¦IS™%}â"φ4QÖšU9“RÑÕ«À!²¬3D`;—剷Ž8•˜¦I5ù®D‚U“Ó•yóÎýýrPD¦«;››ƒM]×:#çêDçñ2S‚AËŽY æKÃ1*Bˆ6‚@RBˆ4xƒ€¬G®[Ï1a ~ep´wíý»~õ‹¿±–JØýØï?8Ž÷Vé?­[3 ðÆ«gõbú¹Û[o|îÆoýæë×6³Ùg¶÷NÔË_üú½ÞúôÕ§wUv3š3R±‡IL˜¹‘é 6š\Q·ç6Ö΄Tf™Ê :pH²$pˆAĈpeM§“ D'½ôì Æ+gýhX t$ñt~1Ѽ{mp1=Ê^\œI–÷ªÐÕΈQµÂt£t}8ì¯E½œ1 %{)©H¸>ŸšbYvØaè+Êdœ˜Ð) H m2!Æ–¡3ÁA¢1EA‚ `«:1gf©ØEK+pµ -IB¡¬#ê(F:¶¡«l4s×6™I!e¨ª™i½Æb^»bcºvÿý‹×ïÙV]ÄY¯ªˆ»{¯¼<_­7v÷/fm«ÀÉEg §­c4  1°7¾ÌR™Š¬Èú]™NÏü}“in|#¬ÞXÄh MÇ¥õ³BiÒ•‚n] Ù#eÓžIRi\S¯HÔ÷ÎDŸä)œ—ùP«ž ¶—Ù"Ù¤Ð*…ª*SòM#½Z ¥™gZG輡D{M„p𨪌ÊG7†y¿H¯åÙÆZïÖ‹?ö+–u˜©\µÓÕý×Þ͆C -E’e=BpižEï³ó¦jfeG:Ÿyögþ)¥B¸óö׎¾£¨¾_ŸŸe㤡íëO}ÖêÿõoýÃ\fDÉ¿÷ü[?_ü»óó‰Y/Ò$2@Ä®nRˆ\ƒNŠÎ”ÃE3¢°jž‚Héõta|ãõûŸþøçOåúîîÍ$¾µùÆn.²ã"µÕBD¨ËE:J,ºG|ýêõ-åƒ5?è¯,íÍ~¢ÈÕéá}™Ãd8ë'3Þèr ,Z%’ùáAÝÆ³ÃÃÁd‡w.´dQmL V4Ëf z«™É7eÝž.ë¹H%:›Ÿ¶ÿwokÛšæÿÿÙ¬v7gŸþÜþÞjì*ÇU®r*î0rhœFQ‚‚<Rx@ˆxC(€@<Љ%ˆq nä¸âØ.Ûå[®ºuû{º}ö9{ïµW7›¿cð°¯Ä’UHŒç¥©_k͹æ§ñu¾ Ê‹¾«&“jr#šŒ÷ýzLz±Þ4­k¦GŸô)wòèô¬mæÍ¤êú«!›§—‹éA‡ç>>ºs÷|Û¹˜´ØÉÍãB¡$óª9uÛÅòüô~úx¹Z§_ûÍ}}w×’/¬,\u Ág-R†šÅèÁÝêÞ[¡"Iåÿžüù‡?þ’°?Ï-§NÎPƨ×p†=Uu•sÎCU5Q#F RTrŒFCÎÐàZT˜ú¬ ÿÏŽœ8Žê9lB Á»ƒù¬±ŠGÒ\ÌÈcAâɃÐ~LƒŒ9ÉÅz ÅÀª¶Á±s³v¾ÙEbB,÷n ÑEY'GûΦmhïߺ5ìÀRaL´—*0²ÙÁr éw›þé g†fZœO«È†\ >ØÁ²¾» ¬%û(I=*#šÖ˜ Ð. Hêº.£¡d$¢I˜rªpMýóa³ºúi \7MCÎ)— ÅŒØ7µÔmÅUŒ¢•¾‹`ÁRn|h}åwÿOÿôÝ<Æ7?sûBé… 4\ß<ñ?øý·ÿÐ÷üÙ?ýCÉks›ž<¸wtòèbõÞko½œÝe5Wä˜, sL0\?í¶œË ¨º[ï*`Ç€E ˆœgEPDÄ¢DÄ ÔØ,$@D2€Û¶Ç‘ˆš¦éÇBDÉ»Æ1UÞÛfœºªÂ k`Ê2Ù®ÇIC¯}é‡þÖ; `;ŒR^ypì}µYïšj~~úJsÿÁ[ã8ž=Ùx\/Ž<;À~Ønξs±êÍìöÅz¸ì6Šä™ $ðàœ‹qœÎšÕfS%ÔêÇT9‡”=‹R4¶$]̘Á)› yÔ}Å ÂnÔÑ0î4Õ’÷ 'H\µ”4|ô´¿wt ¶yvþ°ºÀþ`zÿ+_zëh꜖¿ù—ÿKËé•7Þüæ·.ÖcÚ›q´]—Óøá¨¥Æ*nKÃ>j¨Óªuûõj_ªÉÔ:™zR·ºØõ6M;©&çë‹Ýnl«0=ò/v·ONnÝ>–xÑ¥ûË8©¢ù«Mw~EWÃxzÐÞj±vsoâ­8ǘ» Qž><ËG¡ÃêìùêkÇ7Z‚_n§U$°PVãÇo—ù«&]×—¬>°÷”Ktož=='ðÓÉ,Yçª —Wƒª™1äêüƒ{ý(çgã°§4,_${é¥<´3„eEWY‡a³:ÿäÍût³¶÷_ÿSêo~ûžÌõwÃt@³–\tÖܰa?æHs<š@!˜OæÇa=}<¬öÝUuöîöêæÑâÇþÄ?ýèÉÓ—^}ëùéCáî½1]=û蛿õ#?ò}±±0Ÿ6`_üÚ0åô²û¶³áÍW¨ïáâã§ 6iªöäxR×—çWûý²ôcß ÝrÖܽÿòv³ŠåÒ‡™A3Œ³ÅÐhîìÙe É´9P,Ûñ,ÃêÉÅ3À)Ûçét~òäôqéâf·¢½•“[‡ó¥ôäÈ)ø©†:)æÞùäq; ÓéX-g§çkP?$†˜;$vÝzóìr×4Í Q ¤í §YŽ'¾ûp&mhjŸºhX´Ãd†A»ÒæŠk(¥¨f2K¬¹”O©‡äùÿÀµBH­¤|}a@)Z°ü® Uõ:™DÕL@€ÀTDÌ®ÁÔðÿå;PÍ9“cì‹cË¢i}y¡†‘½5J¬Ò÷¢£wE%9$q]L€)ÅÑYëÀ"08ÇDšs5Iò“Ñå×*"¤u¨'“Eµ·Á!ši=›YÖÀ'ä³%•¢VƸÐX«BÃL±d‚ Þu·^:I½»ÚÍÕ9W“VVû~H%ÅÀ®ñŽ@m¬œ‰t»G6+&âœcê$õ¥Ã\ ëÐN÷»Í¤™ð”âú!›%Eo&•¢äX!ÍbX¼$-E‘£åbF4D( •={T•"Y˜+SÛqì†2ª1%É’TƸ98p¿ð ógÿÆ—«þüò¥[7k¯ÍqóÕ¯|ß{?GÓœú G¿\e‚;¯ßþ÷þýÿx0½ØŽ•»™‡ÙF|ÞŽÖ¯×åéiÕÔ@HD’@éFÉŧ¬‚ôðÉcß]NÜâp>[´@¶8šríã&y5©8)EžïäòÙæ›¿ö¬­k2mièóŸ}õÖɆÑ]Ì]ÓàlÞÌÛvÖ¶Õa šâ¶Ï=é 9¾÷Ò+¸úïþÒß:=ÝWÕøxêrÌYr.ÓÉÜ ƒkÁ ;[Üx­ª*Eˆ©¸àûqôÞOj`®˜|Å$edwí7q‘EÄ9ÌÁÛÁlaÍÑöųYØé¥Zžz‡@6–ãÃÿÜ¿ðÏgØýðq¹e}´ºü¥§Oýï¼õÕ/>¾º<::žúiJTÕ5±‚H6•㣛—W–³(äºqóy{~Þ #"0#&C3ç½óH€f–AÐ ˆIœyvàólrºëÌ*E¸"KÎ{_U!׎ba²–Õ1BNû;w¸}ñöo~§ áy'X5Û.?¸{£¤f: *G\.n }ô¹šÞ¸{ïóè¦|{~diÍ»ú ƒîÖ% Yñž%—ºnÅJt3Š'®@!i”TpŒE±ºþÃáÚ]7Å3s)¤jÜ)I!ö–µŒaìÆ GY5 §]×ïêºj kï‘ú]/6ŸûÜôû¿xçÞéáÿ¬£±”Qð- í‹uyï[¿ñwåÅ•–ÎBÞû¶i{ÆÝ¸²ê¢Á†Å‹Â~Œ[JñO~ò‡¿ò‡B(û~û«ßú6Á²Ø¸ª¶>š´¹ß*eö%´PaãfÎÓDËPtlÂD´Z¯õùYÚ'dŠÁŒ®DÅÅ|òÅWÛƒE —ί:QŠÉ­×YòÖ·U|¶w;rÐО››'ë·ÃìxØ™)(×tè´š{¼Ú\vùxH6 Äq3vв÷Ö€a©ÛÚ±GÒ”û¶®Íã‡OŸnVÃÁüȸƒ&Ò¶”X€ˆÃt»ºÝ¾—yhךּîÑz»¸¹¿YÍ‹€ojŒnÈr¶Š¢M¸ûdýüáÅËG³BöÕ×nà8”¸í'ÂíÄ{nr‰™šfy|pp$Ÿž?« ëæŠ­>œ7ûÕsyþpxò¹Ï|ôðÑ£ÓÓ«ÏË˯½|üÆíúèüá{o¿ù…ê•ϧúȪzf§ÃÕ£€9íÆó“6Þ<ž )³o›yîö÷îžôãþjµi[ò©ÄÇOÞ«êÃåÑ 6.ØGšb3¦n:™2ëÛï~gq|¼¬ŽT ë†«}4#Gä\íç7†ÙñIûä9ÃÂ8Pð©ß9GJ‘l)ƪž†|‰œâ@uHFT‡ß×Ûÿ2ýwAÉïI¾ÀïÍË|ºðø]¾À€ Kù4\äú²ŠvMß)À`ðéúÄ~7‚Ä>Õ’üƒ`h N ‘ÌŒlHf……2«BoµˆHB¤’¤vHYÂ&÷]Ž)EO<!õi縭ë¾ß[Fó^³›Z´uSWl²`_;Úôëmê.¦[ôëT²qÚŠýÊÃ÷¹|tëŽM&øúÛ‡?¯åÆ~¸™ÿàç—Ã0øºšÌÚ¢¹˜–Rp¬ÄyrÐë[z$öHTtÑN@Drí1 3#¦R08Cé¶½+ÿù_úÿÁ­?û“_žU[ÁͼE ÜL›—_?ðÝâøüñ'çgóïܹu·þì½ø³ù¯Ãùò+/3DÓbpÊÕVÜŸù³ß÷üÅêôL./&j¨å}íöžg\jBŸs `ÀÌXÆÄì-‚9/€*„ „B ìÉ__íš0[›÷¾þϼôú[Ø~<»åÎû‘9««i§ùr·;¨ëÅñ²®ÛÀÎ$ É]—=©hA(¥g"ÊN¤œY$·ôþ òÈèÍÏ´X«˜‹X½ð)2ªƒÄhL€>¤’÷ûíóÕ& 幔ʄ]m/†Â8uj´CÒ6yЉ5X|n¬râ,¡c8_=ÿ¥¿÷·^ìoþÄýÐgøF›¦ ïÿö©¯—å\ ⢩9åœošIµÇ=\­m¸Ø?êc³ðÈijpWb-RýÅ¿øouû÷‚íÿ£ç?øú7?Ú@›Ì› ‡){æ«]ö~zùb4íj_sS…ÙœEÙbãéÙ0Œ¼É´7é¦õ¼ï×5N|J›³Ó¨ ·YiÓõ»,Óf¾ʶ÷¥¸šK…v÷ps!Ô†‰`ôH·_;X^]}ëÛï–a:¿yðæ’0°K¢H6îK).”9Vµ›Ö)KEˆ0vë-˜ÄÑÙ°í üª  ^“\uujØîììì»ÏÏkœw>¢éêâEŽåãÍwn~íF©Á’E-¡¶ç—gßþäãýZëy¸ëojN<Ä\4¸µ'ëfM³¾\Ì`ê“ÊÕêìäðÎRgySŠ‘køµ£éîž¿ûñ7Þ}ü«áïƒo"’‡;ý…8¿‰¸ßíÏo½ùV†íÍ Ëù¤‹eßÊ ˜òÕf'fÙB»x´Úã°"ûr%$çët¹}.Ï·<Ÿ/ÝÄ­·ûœåÖí;F$Å:'^^^ö»Õû1§0™…vâñÖþÊ–“ï?½XŸ_Ä}œ4É7öê+ Ø£‹ó„¥j«)s…qµŠ/jϧß}(b‹ÃloÍÙ¢¹éùæ¹?XŒûtÙæó{Ùx½ë]c³…Ópçþ ³LÚªÁ"Ù>iÆqd6ÃæjIk·ßá IDAT»ÐX88*^#“k›b`ì_˜á{ÚÿòÃ%߃¹®¿¥kI¨#C%OUí€È”ˆHÑzÄëØ<20v†–JìSL)BÎèP,N¦ÍNâd¾LÃs&r©€ŽØÃí—NnÌêÆç2ø¦ +3PÉ&bŒàr‡ÃvLÌ̦`EõºO4öŠ›¤d%Mt„q³L¹Û¼òÊ„½C@dfË93Š`10(€(:""*^‹r ¥„ˆàˆ€™ÔÌÄP¢XÉ×§,€$¦b€•L$fD×™ZðˆÈd"I²zï×}çD À^tÛ©µÁ×isÕ>·ï]ÄéóP`ß›S†2V,æ±ë@.vc–Ê–ËYubc i!ûT‰è}u}K‰˜ªjÑëó˜!¢™¡F)1¥Õfí—u`‡Ó¹0ß½Õ„—¹ô«3_®wJ´ÛveIÃó4ë®ä›ïRc€’g5ÕÍér‰wÜgW{Ëùòƒ÷ÏV%ϪåbÒ¶Ía}ÜMÃÂ/ŽŽ’”,¥®[ 7­ôú`^ÀÐÀå<­Ì‚j ÌaÒ(Ù3`Q†& Èä냗^;ºè.ÿÇŸÿåŸúñ^†öâÅ µŒÐèÝo{9«ìKŸÿ­_ù¹×ïÌÜ=øüƒcÉá·ç6™zïY3H1<ƒ•6ä¯üà›>T̾nçYä“O>ùùŸûú~›MqÒNÀ‚¤‹Ùb’s€˜}Î9ŽEcC€ªJ¿ƒý×öb7ôÏâêû>ó}ûîrØo^{ån[Á~»ùðÕ—ßøÌ›wŽæßÿÁwßÿ.¤¯\­öÿÄýÒû·’ôCÚÞ½¿8Ú½–ß~ç‡6«ŽLG³¦jg)YRðd>šhc! É1 (PNålýbØå4,Є¶ ¹¥ËâD U #Dò€¬DÄFŸj‘éÚøjèB=[°«'¢GÛ÷qµßæX”ݵù–Œ+Rv„ f\Ì’êEW°Â£frïv³˜´›“A~ðèo<[Ïÿø‚ÙÑÄžožþâÏüÒPc§žZŸÒXT ‡¬ÆÁÏýfÜe)ÞÁb1MƒY:*¥bOa¢7­šjÚ93z°n·+Ád…ˆ”Wl1ŽC™Ï¦’¹»ûóCÇn¿K†a˜+4KYQ79õã˜ûØ÷6ÆŽÁX…ž\^YD¬®øäh~8¯æªëyŽ…hÔ¢}Ÿõ|º˜½úæýÿ‰/DZ¬·ºOÇ7ò0^”±kœÔuGð”%iJûœÓ%çùt!"»Ý:_tÆ8ŒýH”‡>!ìkÏÓ:qò²6±¢“Ñ\ÑIÕéìɇ—8†Ä¢ÄÜêŨ¥è&Ü?¼­viÜo¦~ŠÄ9k;9§’òÂWýåxµ»l&­««UYÉ(5ÖMÛÝöèhº~tyµYݹ{}µ’iÿðѯ=|H뇫›/-?÷…W¼üÚÐ=yï¶ÛõKo¼a²yqú(Æâë5P˜ÏŸo®VgÓË—_ºYyñž<ßZ=Ö»tú¼Çñ¥û/,Ÿ_<¹y2ñ±Ô5M|…j›në›zØ‹ ¯¶yöñéJ17Õ‚KÒ É¦óY5[,8©<[åõùÕH¸Óª¦ÃQeÈÛq¼t³ ×ÕÝWOŸ^öçˆTö“GÏ7núQ};olwÑÄÎ>›Í—ül¾œáäa7\ÅaqxPÏç–³)xvÎ ƒ(¨Î; !Tžƒ§à(#™Zú=ƒ3þáó=Å×.Ðß;Ûãÿ:¿û™?@ÈbŠÍsYˆˆ,˜çŒhçÀ•† kP†Ž\B#„¹Œ;(# ÑyY.§óƒ‰«ã˜%—"É ¨¯*WUØÅa“Ç;“_9M²^¯GÎÉyäà(EÅ“ (cÒ1AQ$²”¤Û—Ð6ÁU€ VÊ(³¦V)Å”ÑÑÿ‰dbf6$5€¢@˜®=Ej Æ¨„À`êÈÔ‚ót°Ü§±3a§Ð¢+ ¹Ñ¨s ­FVô"‚ª¥è5þ`0)h$D¿cdR5ÀÌf™}.޹¸°µs`0+ªiE€® ²î .6šKE>ØÈJŒNsIµòU·:_cÓú^3šGU3 ƒÔdH ’³úœ3QÉrç\034ç˶0êz·B‡Trf$„Ñ3ͪêøðàþÉÉâ`ROÚ‰KL:¦?]þÕÿé¯ßº{{,}Ú¿ýÎC-Æ Þºy£F–ÎÕ“~½-]$0B+e<˜O1øäñ“ùbùôÙi7ľ””RRa«I¹øâ­åkUí÷»y ¢4Šm^@êÕ.D"" Àœ‘„ˆ•bÌL`à4´ÏÚ¡)9_WW›˜ãȦìÌ90«¬T{ Ž_½y÷`Ãþ<tU¦Ãíüõ_üèå×﷯dz-Ätüä|óàÍ“Œû1nãÀž³?»º¢ÙòÎñ;7§y¸œÜš>¿¸Üo»Yu×5Õ[¯ÿIÇ’w'wÛ¨õ˜ÅŠ/¹ÙŒí~㜗¨mM5m/sür>»|>4a2ŸTãneH}/±6CÃ)Ʀ]¨M¶Û0ìÝ0DH”@Ø æ™‚‡ùÔߘVË––óÊ×ãÔÅT¬¤JÑùISùf³ÉÏwÏœ¯ï¾´¼ìN瀱<£Âiu6ŸréÖÂìü´”è*"nLëábè÷]ŸbÙí:É–‹¢2udàÙ ¡3p1[ÁƒAdz³îÉúƒƒ[õ¼i—•«êÕ¾'@q»¾ÒWvãÁÍÿÒ—®.·›Í•z9¹óòéã'OOçË“]ŒÇÍåJ,—ËÅKÐû£ÃéÉ”žŸž¿x¶R?ÅYóö')sp35F§. …/Öƒg«æîùù‹ø+ûoür|íÍW÷CËaöáÃîÁýíqí²}òtØŽ¼=‹ÓPÍû«|zÙív;&ß4xtûåædzÐŽl ÏÏŸžžÍæM¶c%)sX.ÓÍ~}¹N=å‚tt8i&¿ùoµõ,å¢ö½¬Ï·]¯m=™„ùjè{ ©Ø7¾ûÎúJ_yã³)*2¸PRžÝùöjý´ ô| %õWç›Æí™½÷Þ{fy³eæíf¾}¶Ù|öÎK³û÷¥`¤`(Ìl ¥”œsÛN˜ƒ™‰!8çP@ñ÷)Ìøžâh°Ø÷fÑÈ8Ö Î’¨„bh &ÔŽPA  À˜sÎY²€0O›ºñ‡Ývs™ŒDȃ’sì ‡nShúøÙÅÁlÞx.y0_OȈÉJј‹ ê(‚ˆ£‰J."rÃæ%EõÁšÖÐTÒ@Ó£IöÛlEÕ›™¨‚#ï}ɱZ2vzÍL20PFgh†¦×ýéÕ´}' ,fV@ż±ITõŽR”"™X‹ÈïàV-×7ï5;ƈ@jZTÙÐÌTDb±>›ÊtÖÑÕꢀcW¡«LU%gbðÌS…ÎÇn/9³ÉÁrÚ,ü‹a»ÙpàÁ×Çfª`×èÑýtPJºN$SÍÈ$Ōёˆ yöj¤`ûT¼¯A°àÜûüìéeÍ0ÆjYÍÑI{0ñ­Ãª)Ë9.ÝMÌ^ §¾ë¯BUc SªÁ­7ݺS)fƒéÙåãã;ÌÈK)ì*"f&+‰Ib  sE£‰"D,‚¤dÑ1ª ‡Ú Z±Ý¸Ç@Ê0ôû×~kYëWn rq•tÇä¼?0ˆUåã0²#vuV©ÒT‚¯‰]Ÿ#:òËêxˆ£sè«*î£C?^Pò6^T•¿N×ÈY¦ÓÙúòÌ-E 3‚úUU[™¡ãß±È À‚Æ./«e¡âjnÚ:ÌæXç.› ¾÷úýRš—?{/¹¯jDùéúYìvûãƒCçBÆ};³bW/0„ž;ìFp“Ö#Ú(±ñøÅtupÄµí»¦©\[O*×Ô&‚ž!™×’ ÁRÑk¤å‰À°° s„ÍtÒkpNÀL U®!HQ" GZµ¨·=ß/|?ޱ¯}5 óÝÐ1øÅüø½OÖÇwºªªîÞûw—»7.ÔÇýPû©/ÙRï)´ †ata>¡j²ïbÚîÏOã8ÞšÍs¦ƒÃæõûw‡íUÖò¼ÛÂÙI£…†‰¤J“óB$zóŽÍ;i qõlÝ?{¶bn¼v︔=‡|±Ú˜BÞ×TZ) q\p¬ùPC‚®d¸ywŽR±çšÌÆ~ÌC7i&hÕÓÇÛ““£ö¾ãvv0ÇjÎæØÄLÜl*¸ëw<Ž—Q|]7us“¹`&Šf&εddj(TmVÙD©Onÿèç¾Zãr2£°¨qâÄGéóîÅÕÿü3ÿƒƒº sW§¯þÔ|áz⻣qâ 3Öõ4ê¿ñÍwÞúâ—‹Á¤ŽØ£¯ëvuuUÏf¹Û-ÆíK¯ß;¾ù Lç½È•ŒEzÎÝ÷¼«‘+×T J²,9ÅÕ®6ÿðÃO6«Í^û£Òõ§ý6,ËÙ?õ¥—#$x: óEÛ÷Ý‹‹‹ËóþèðVÕÌÚå²LŒ°fY’™‘oŠ•®Û_¬ÎCåšiÓlòöró݇§4?^¿ñÖëåÏüù?Œ@yØžîÏÏ®<Ðɇï>M}|íÁkóÛÇ/½|¾òµüùz3?8|õÕW²`úîûo/ýoÜëE¿H™×ûÕêêüåwEL ž?뙫PÍÝQSP5$3cæß×;ù{Š?®í ÿ(ó{Ûwÿ¢× I@E…ÀPyô¡ ‚ªŽì¼oP5ö¶7ªÁÕB&…‰5§éz€es1 :¤¸ýÔj”!€1÷Ù̼‡ºvõ°Ý/€Bì½k P,R»*#ı'Vs 5ú>˜S€ <=^úe­¤û" ìɯšJYgÇ-: æ!Bñ„H` YYFrÈÐ ‰)(‚Za4ÇB“9¯†Þœc£P5%ç,qÈ"à-yDvXE”\a„˜ "*˜€eµDà3°ˆ#öÄÎ!«z"F  a¦˜Òf¿‡± RbF—¬ˆg_-ƒ7Ĥ9“#Çì½ó`ÒƒÖ1Öi –£ó®ÒqB{FÀémôÒ˜‘‚0’8Í– ÒÔ€œI1@æàǔٹ,ˆÌ¦ ,hVª•!æ‚ÈF”Õªi@ƒjr"`[ƒ’Ëö‚T“w´uH=c(¹DÔ1™9hUªàÈÀŒÜXÞ¼q;øú×~ýí“ÃÃWÜo*ãPĈ+kíÔy¸q<ïò ¼Ø\Ð>/§“ÆWÛ«µ7¿—äQ¥Ä:Ðs¿Í*´¤ KþðW?ÿ[oã½ïœÞ½ó²9øå_ùðÿ ?vß%¸òúAœ³€J™ÔùŠ€*Œ’ ‘s hÌPFè0x3WŠ•¢¡"‘Œ>Ô>@13fß§·ï:@d3\¯XßuÉW¡j df ˆ«ªÂÚ›çÚj¿Ýw¿ñï?zô¤®ÌŸùâR½¿ùèÙ·~ëï^%øö·>€Q\UUÀ²ÓK¬ûÁ-Æ;)D²0s=¤±šWû´ÇÁ*É¡‚”qd2xÑÞØÌ÷9çÃ0½=Y<‹zù\;uóâ=”ïníÛ^rò@Ô’+Ö0;ç¼÷×|#3ûƒéb1n7ºÁÌy1£iÔ‚C±³é¬­bšweNÇ«ý}üÍ_ÿ€ Ü8:¹sï~Qø7ÿíøxžâöïüÜßZ:6ïîß|°züAîw»³ó³gÛ‹«íåf}¾Û¯ÖêÊÐ9£œE1Ìçóò'ðìñéÏü/ez¨›ýÙŸû—þUçÆº½óèƒo?~r2…™s:ìZj«ÃC)¹¾.¥Ôïwúi˜Xª›0ëµ ŒŸÊ(ŘÙùj’ó„(×y€¥Øu•´™Rð× ñ’¯{æó9"ªÄŒˆ¢±ö5¨Ž¥ïÄLÁ¼÷áxú™›w¿ò>/IB/~óí1îþ‹ÿúû_ÿþ;|ã•'—k´â˜‡†«â<[õ ~ßG(¹b À(æúáÆÑA.C© êÆ¢BûAs°Q H"±OSÕÑ!•Tv—ûí®òÙ‡ENéÓ3ÛÝ?1D,¡‰ˆ™Î/½ºU•‹çiÛ]FÙ Ž *”¢9çL¼˜Sº¾?öõ—OŽ?;„¸IÖ7ge÷ýù?YþÐ"Veê*ë†ýlÚOÚ9ã­£?ö¹/<ºÚW!ê˜Ë¸ß€sõìf«Wëõ¯¿> ƒ©êˆðßüWÅcpäW—Ý~SJ{ª›ÙOþÔþùåŸY.6»ÕÙó'çU9œNÐyp'“j³ÛÆfó8i¼Ùt\È`ü/üÀŸûòÅŘ”ŽoÖíæò¢ª8TcÜï†RÀJ@"ÊEC¨ú}·œ-3vRâñì`Ü»‹ +Më‰j!Ä´k'U)ãááá~¿?ÿøáÅ'OÆn\ÎqÜ¿þæý“Ńͦ„iSŠ¡¡P1 ‘\Õm’1«y)êë €z»±—ýUÚíûÕÃ>ƒ‚ {êê¶ ©öŹ’ÙJê†öµŠ*Qs“\T(x#DuJ ˜©]×6#²©Ò¨fóXM›S,[F·ÙìJL’‹sÎTÉ;"0U9ªdÇ7¨Ì«U6ï‘=oKj¯ºý€Î£æ8 «PW´Æ<ÆŠÙæ”ÚªKJâªïj¬çVY*¬âv?æøôá IoÜ9‚œuL#;çK»2nÑÔÔ‡PWl»«U§¬Ä¾®P5ŽC®P­Œ ˜¨òÞW9—®ì½÷iDï§»ÍÎù(š‹ul…LHSŽÂì%™g†ÉbÑÅ‚ŽÁÐEÍÈ9)*ðºb¸žÿŸãçÜõÞÀÈ9®½ k"PC»Ö-×  Ù—ºÞ*غ—âÉ“`.Fëæ%³\Tí:ÑÔD "’©1kŽV³LM=•=SŠä›¦ ‘aß—˜i,&f¦\·Gm}ØYϯl–ÅsK¾IEF×8ö@P@< ƒˆÃA2˜\#0A#T@3bbDÀërD#ò`±dEsHu²Z*YDÙ3Uª" °#¢5EÔ Ô¼¨2Š_ë5RQS³*¸ƒ™:k «¶¦`ÙÍZÇè˜%1cÄ™¯“òdà!_×Á0©#!Âêðwb8 ‰<-×V¨kbÈõÚŸJ„H.`)ZJA¸n3A5BC€ë.ScH $;ò"æÙ—,šÄfÄÌ9™0©j‡ÉTœñµT£=[/..Žnœ vÑ̨u“©Ÿ¦®.º‹›¯ýð÷‹€Júä•¿ýs?ßNºXþÛ¿ü³»mb›ì:um}|瘗ó ]µ!Œ[îV{bàJL¬ã퓃o¿ý?ôµÏü½¯}·æÖmfµûíîÝp·7›9¹¸.9.¥¢œ¥dFtcŒÌ•÷ €–’æ‡K UUŠÉ㘼ãq@&ÓPJÖTœsˆ RDÄØ]Ë5?…$ˆjا ÆˆÁy"Ú¦ ¡# Îûº¨ªìKÍpöð;õŒc’¦¾ñßÿÕŸûßõ£+[®N·PUÚí}6„f;@U˜•h L èUÜ€G®y~µûa;a<©«IUÏ›Y%L…L3d0À-ÒiI–å@ôŒ±sôÞÕå­ ÏÀ=e¿ë:fVµœ]­æD-¦qz0#ªi×QMÄ"CQ`ðN»œÕØ#"£Çôd·UšøãY¡êËô‡ó‹}Zß<¹ç³%mÛzˆ=èâõ·Ž MÓ¸Z ò0 q%¶Þ\öï~ûýûw§`V@ò"à/O: >¬Aa c[”÷^^ìÓê´»8¯6]ÞÈb–R\̧Ó6®åÙó³éòèÑ£OŽÛ#Úmûíj7=¼7¤8_ÎÇËýÿÁÝ›üÚ¶­÷A_5Ƙs®bï}ª{ν÷ÝûJ¿gc‡8‰I …)=úüHtÓCÐCBB"€hÐBAB¢œDQ¤zvâÄö+ouî¹§ØÅ*æœcŒ¯ ±®#¤HŽ@2ŒÖnìÆÚ[kÎï7~߯V|²ÙnVûùøöõ›'O¯‡AîîÖuM2´nÓn¿´ ?¾¾)jõõÇã}DÀn~ùÅkæ´ßÝt]o®åp|Ûîûoÿöï~ðþÇ­µgì|¹_úŽ^¿þê¼Äj\›Q˜i¤a¬M=\’t'Ä’Šç<àP‰ÜÑÅK_õtço}­ñútX#IFDˆ¡áìÜ;“GN,&ä9 5ë`€ŽA½¡£_V´Ž(@ H@n€ˆ9mÖ¥:##˜Y8ŽÃ®FefH<ƒ ç@›‡wuȽ{·uVGÛo·uYªðÆBÉ$æT«ƒ&P d~·:sA.ÖãéCæ­w6¥¶³AGf|øñ+á1Tê08# I–Üà ¢û‰Z›—‘Ç”ËÒ¹$æÓ½Š¡\O•™§< œtmçÃIC%á·¾õ­¯^K%Ê"аâ|Z—³/=Ðz¤H CvÐ0[{#N§:—>$BÂ@ u$ûGoýßôÿc£þÿýs©bAÄß‘ˆHÓ? ÃD„@À€”©w3d ÑJ½Š!Y,”½w@ª5 ¥õÑ»±rŠ6Ÿ9§bˆ@(  ء2¸Z[.Ħvus5$Ÿoq7%ÙÝûf,Û)ÃrÞMh6ø€–µuSh´ÈHm´˜d˜ˆLÔA4%¢ìATˆƒÜ¨¢+‘9l©0ÑNÉyBI!Êr 5¡‰Õ¬—‹Î×ͬàˆ™2&Õ@ŽKч¦ÞØBR·4Õì-‹‹YSZ%!@ˆ Þ`ÚÜ,íŒØ-4Që êºî¦©)OË.ÈU£¥ÌÙ#úºguT(Bœš9qJ)yë ˆ‰ÌQ¥Fu2ÆÉ'221íLÈ®) Ž(Ö²?€”‰Ô M6U5ÚLÖ[]×y…‘ÉÕ ]ÅZˆµóM÷tk䉆‘ö£\op'5§@DŒq*"ròH (µ IDATÎyV;éÒU•»Ö¨þp»ÚÀãÞú0¢G) gµöÏ~òziãÒëþ¹{W¨äX÷é:æ%»ýøõgÏožlËðÿó?þÍßý“îOG,åšWß>¼Tº;Þr"Hi¶0n¸Q4†2ðTZÿêú¿øo>~8Ì×›GãÀSq;þäÇŸøü|ô¹? "† C–ô1rNH±Ÿ Î÷Ø-B¯®w9aš¶wÑw<•èåj ¨éJ|ˆ«PS5WË0Ï+z˜Ùº®Çóœ‡Í¦÷îÈ "Öµ››«¶žŠXo-IñV9N¥t#ê§ýf{žõÇÿûÿö£W¯Ç×ó*#–k¬TÒ€8wïÝÍ$ú6Üð!ŽÍA B³1–"»áñ£m_—wwëϾ8w ÊÄÁsŸ}šðÑvß=üd%Æ·|Lktn+æQ#A u*žhOëŠÖåþ cµ&Bê-„0€"áÈ jh UŽÔ›W¯…_jèÙÓMz°ºïú­û÷¯>üòåúÕoë¼<}ôøÀüå—_n÷›áÑÍ|÷Éãiûðöîîî(iW6éoçz®ýö¼,]ÓPrЫFXËá¸H³ì”°ìħ¿õ7þþûÅo×7¿ùÞ.ëÃú¾t˜øí}}ùÙéðv®«=œ*"¯zX–¯Z¯ëº¶öÃÍf³ÎK[×Q2ÔZ#OÓ~s½}:î®4—Ó»»À}ì÷±ŸàâçÅÎǸ®f›ýæÍ›7ó¼ÜÜ ïî¯ûmâI®··ç‡rýž¥Ükÿòǯ½>ôú°ž–O-±ð {#¢éÛ‹ä;¨‡šÙX2GXÜ#CÓÞèôƒ?õýg•ÍòôþÕ«+´„pÂåt>O‘÷QÎG±Ø¤2ß„"ÇD½™;‘žÛ‘›šM²Õ +lfŽ\£_ê<ÉÈTuQËœó@ÌÕ"R1`&˜Ü´"êÒ©[$Ùt7€HBÛ’Z wALõ<QHÌv7‹ˆ›«ëÖVALS€e]]zÊv­àŽ0ŽcNК!·\Q܈LÝ4Œ]cm¬µôµ¤2¥t‘Þ7’AR!îªÞÚ°™jo÷§CÁ€CÜ]¤{€ÖZkm.¥ô&„2LÓ~SRŽyÃ]ni·ðÃa>qYMËxn+!$nón3æzTˆ51{gÂ\”þûoÿ%ÎÔ|!„C|]sÙ,€\¨`È9·¥b¢”‡,aµÆLy’”Y‹÷Þƒq{µ1³yYAÀ›~]âéaffdT8°Aµ°££¡]FªµÍ¶ðx)X¹|º îS*°êZßY3lçƒ{͇ÃäjÏ6ÛùN!š€EXÙn÷›áªC‘BÅ%ž²vu¡nHX0P<#808ŒTˆÐƒZ%Ÿ¼µÄCâÞ”1âb–Õn†T,°Ñ@à8À–ÇP‚åÔÀ“!G [R’”*@±+¡§”2@"$ ÈÀ9€Ð’‡1ÚŒsµ ÑÐèHSso½‡ E†„¹'uì`sUh盫­RKŒÃnì¡Û(cÇGCy¶SNèI³2Ó^€ÃóýßýÆŸúå?ógíÈsJŒ½Wô@ò­ŒHÜÃ!‘‡²;XÃÎr©ö%pW$p÷Ì;Sl¦€HÀ„Ü{0v^ %æ1_ÎÙÛ{OŸ8=~XÚ¾xèŽk_óº$6T±”ñê þ£¿üöºl§ÍõÓ«ïþà—~öÉçÃõî>zóòS™6î`««‰D¢“Ç…v6Ì´ÀR­Kö>z±IcJei@‹ÞÐíé³GÏß6>Ÿk_33]¯Ã|‘ÃÛ³4Ì‹ÑýšÛ{€»¨uJ)³XÞ”q3¼ µq,%ç‡zWJyúì±&m{q:Î9g‘Mž6p]–¶Öyžµ«l2x æœÍì‚? M½¦¼Ñ–[ôaÿÁßûÇŸžó‡«-Ô°ŸQ ©a¸ÍnHißçí¯ü+¿òê‹W¯oßݽ;;¥Þc˜®néõ»Ó«—w¦-—qw}sûp4@HÅ '.ñ ðÅ÷>Üî7É­Þ¿™±ºÍëÆ0 ²uPYüÁ,ºÖÖfáÜZs3èO *oäzá SË[ÜC­Õk¢®Þéã“©2œ–³ýêæã¿ù~ôßÿµ¿áuÞì¿qóèú{ßù1 »ÅöÝëöíiW¶ã§_~¾4§ý£·§úz]ß¾|]0ýèo¿þ{ÿë?<ú·¾÷çâæ¨»‡wí°476lµZ;0p¹=ÞÿÞ·~áßù˜ê¡ÎVåþt\›Z×2É¿ðÜš ÛÑ\™Ã£²„$Ü »! L4Ž£ªšͧe²y]–ù½g×ßüæ5x"È9·¾23Ƴˆ˜—ÊÌ"ÂÌ)¥‹«Ñl±P Ú]}WJ.ÃÔ{—Çcõ¾ÙmcÊ Á—º0ó%…oííÒàÚ{¨·…™…YÙzUôЦ¨Þù*/ï}, Çœ|{ˆþ@›©¾õPHøøéÍÇO¿SúâËÔê9ÀÌšyEd!õÆÌŽ )]’|)Àû’Rº,(Íìò ÄËŸVkaD03pgN€˜.¿Ìœ$íZkÍ{Î;0³ÌbŽ`è!Š1Ž9çu]E„v;$ja¸5  œ%:Ìf®µŠÈe CÓêŒ?Ã赑\\‚:‰˜¤w«½€LÛq;[*~½ Wm77;€Çî"™™×uŽ Ô۳픆«þâYC¬j0ɶéÍUa> Ìé?• 01!â¬Gøÿ¿ôPˆ@t!99—Rk tàKê³Cp@†Â ¬«©÷00è¦Hà «7!4ë¥`Õˆ€ˆKàä(ý¼¶îé&#¡$³†"â%E Ò$«Y˜-‚Æô¸ÀÀR¶òx³£±;¦©lÞ{”¦KæÕÜ•¦UÃ(Ëܺ9S ~T{¯½Ù&çýãݔʔ)ÙƒÖ¹#°{GD´ÖZ7 sõÕíò,[o««j.bL€îH$ŽîÖ;B‘F±ˆƒ9E†'WÅ,™S¦ÝncXçu©]jµué™E‘1s„C”åˆêà@¡¡Ð%7ïzQ®Ž9çT#´³0øÍ³½1šS_Û’Rytsóþ“o~û/¸ÏËrY#.%ïæ>ð$DLn1—´ ˜'Ú F×nRJ¶F;Þƒ•Ù r)÷§&œÂ;Rd‡=qñ¸|¯€ E„ã"+È,@B—lODNØÅ®·ãápn½Ž\°ªþü“/z¹ÛÀC†^­ºfp÷†q^—5‚R~þôiJiíuzòøË»Û4¤Ãíá½Ç7»é  KÆÅˆDÎäÌI$‡óùÔZÔàpxhddÄ Ñ{Ýn¶HðÅËϦ1šƒ1'ºlJZsC!Ò¹õÞ‡!_¨DÆï è6Oèªr§)¯ã€‰qaZMõáÓ/«®î¾ÛNûý¶$“Äc‹«÷Ÿn“ 6‰1€ˆŽa—‡×ÌzW¡ìàÝ×@r4˜-P¨º»' ðêêŽê€:+ÞÝ>ÜΧ=È=0 …„ùñÜ–Ó<7Ý>ÍÀtYçÞtYê|nˆÑ{Eaµ03CLhf<"BDÚ,\#¬02;":š9_\¿ÇÁG„ÍËÃ…•GĵV"Ê,­­îè¦ÙÁÁ<QkkJÜ{u£icݘRbˆ¨ËiEïÌ%´ :…_|Håÿ2˜Ù¼ºZ«Í~¿ !!òkäœ}]æB’˜ÍµµõR˜¥ª¢ÚX°õŠŠ9Ø::eÏbDP( g( A¾òûeiˆ´{_Œ‚²äTFÅ®¾þ¡æûuüq‰·‚¯óåR7fÖM];d@"4íûŸ»(3ë¥D—8=¬«#À~¿¿ï‡Þðë®Ýw@Œ~®‡ÛTçE¯6a,’bÇeq,%S*݉±®e(—aW¶Ø3vU¯$9­½+4ä¾°¹E"tÀ´, œ›w2ŒCC¡D€ÚzƒR܇²ííØ×. ¹‘ƒ£ÙUÆÊ‡ò{Ü™êJ løùzD›íx÷åËývòÃ!! O·7®†|åpÎ¥Äi ð¶¢)ºfDT5'óîÝu‡ÃÝÈêv¶…79ívO3 ¬­:ºZ@к®"ÙÔ¦ÍÐ|)c)SªM/O Y,@’ÆñÞŒ€ÐΆÇ@p$ŽývÌyd›y÷x÷ú<æàY½W$ÄÛÛÛí8 ¹üÎÏÓ/ÿÒ/=ÚýêÈôüf›§æ¡z h?µã»¨g +uMnàQO‚À9‚ºSÓ^‹öfÓ´=IJ˜ÖV´Ì ™ iC’2Lè$ÊSþ:þÁÕs)‡ã»iLpl7irÅ¥J"²6¤ACb’ÁZWJ †L—ð’„´É­™"¶uËîž‘Ñ:`Š@8¯ÖMg9r]zbvsP´q3®¯çB=,#Yk+q˜5Þ_m®¯¯›vD¼½¿_êÚÝZk`pn~Q[_ÜO)‰i€2B`¸uëˆ@D’Ò²,Dÿüê¹0¨†»Sqwm+9"æ’ ìÒÙÞ× Dµµè-"†a`JbØë2‡¯½-ÓvdBU†½_’–B.IIˆÝ„“G' "º Àˆˆ7L)Bï½¶w» ¶ÐÞ™ñúz:Ì4ÂMÕݱ뀇#a>U3O­*Œ#›/­Ÿç㹩°ݩŴKîw’SŸýþ¸î®·œ@mþCÍ÷?êøãkÑ>@xä"ªŠpy­»7E„PH‰9s#³”(ÂH«BF6@3Ã’+L%´ ¾úIöØÁ`X#„wF"056¤•\Õt[ËuNBaFZÓ¡v^!¼n;úÂÞj#€Œº™¶àØ›ÜßçAøöåÍ•´oÆaÿøjwUò¶¸¨ºâù´Ú X a" K."¬.Dn¥¹FXp8`LÁ)Ëv(Îè@Ñ}l„˜%…ÅnÚpk A¢ ÞÁ] Ñz^¼Gëj`Hê¤÷Í r"^ÚM{m]€Ð3{ÆÄH3hÙL˲芃L=€wÓÀ ¤ƒ“AëáI0¥´Îá UšD x,뉋82¹Ê ƒÄPc&ö Ô*Ÿ½9µÚ ÒÑb*KÎYrÎÀ£Ää.a⥠[u7‚„±Ã®© 8”©w›WµâAU€±* y'I ‡º4”2ׯ¨cɽ·Ãñ›ï¯I*ÌÉ\‘3Ü<Þ¿÷øñõ˜¼µi‹‡¶<´ãO>MËLkÃ0¦`4%ó«e8ÅâPÎÚE$¢6h'Å„ˆ}=Oi8¯¥®?Ê£ ÂÂ8Y[/[ .œúÚS*Jf‡ÏÙüõë5šw{Û”€Ù»þÓúêfÿôæZGˆ,W77O÷{ºPÊd­¿yóî0Ÿê/òó‚Ò4Pñ}XÎã¸y8œhÑi3ò·ûÇǵzäé5ßÿ¨ã K|ù9"D¤µÎL  Ðç®MSIf ã’€‚€ˆÄ<–i(Ùº®mõ‰Ö »FT€ØC'€©ÚDyœšvë ”P„¤6j ˆ0p@#)6eªËbRd+:W×É;(–O>øþ÷¿ýüý«©ø°/?"q÷ŒŒŒ nG=Ôˆ{ûsï Q  x°b",’iÈ( ¿~™ô1áe5 ÐÝÝ„b˜Eh·®n].ì"¥D,ˆDùJšuêh+a_¡ºn›º 1Q˜‹HNaŒ°ÛïY˜òiî9u5s]:qÂAÂÙ‘†„”.Ü;^*‰#1SΙ€13Ñ¥£½ÖnˆFìä>MÛ,C¢òäÑã,ÞúÑ[«½+=¼;µ¦¨¼Å+r¤kÅDŒ%‰%6‰)>úà›kãÝv?Êà«DÏB‘(†!™¶uùàƒgÓ˜ž=¹yòôz3¥îw‘Öæ¯_ß¿~sÿîíûÛ&üùg¯^½ü jÊpóh i“¦«ü;?ùôƒ/¦©xëºj¸!¾;½é‘ÈUWá 3~þÕuFHC;D\¾v”Ra桌›Ç0Þ~öeÏó)e:/'g#p Öóõ“ɱÎúò“cëÜc(}ü"ÙÃ~sõáw¾óçþìw{}ûågo×%Nçõîö³ù|¼Ún˜ðz¿}ñôÑÍã'ßùÞ¿ÏCFá½þâ‹Û7ëyî_=|õòË„–ÈÇRöÛÝf³vãù´zði­@›®ËùxzR®‡!«ÕGöÏ?x:McÎòòõ›ãáPk÷úþð³·èˆºDÀïr’ív;LS)e¼æqÚ^ïo¶I–7ó篑dHøøz··ï  ñ%|`!f  "á¡›G„tw“$ºC]ž÷Þ ’ÀÅ}^–*‡¾½=hƒa‡1£ ²IsŠtß•ùæáŒ¾°?øòú4çÀÁqB! ò í1ˆÍ}6&ƒTǯŽÇa¼qIˆ=L&Ü?yôŸý—ÿÕðWþóóZ?œfw0À¸4@@w ÇDª"M‰1p$bN 0¯ó ÑpAD”®…"ÀAÌr¢µ7   t‰à»\ˆ#´’‡¸Eï…­:âת ë&"ÄÄ™W]Í=f#F‡HŒètæÕ œ{m’q»ÝÂHH2LÛì±.m&"A)eÚ4]»Öa*\¬;:÷®®Á `°Ûmͺ»›V¨m9וÑBy“rÚŽôœPÝ0!å2Rƒ®ºŽ|#Á¯z¬\O+_¹CÙNÃõÕöúãaP8Ç“•ú²”qûÉoüäg¿óÓßüáÏþño}zõÑǧ¿}ÕÛz[ß½’ãañqSJHt¡ó §ö妔Ón·?Ïm®Ð Ñi·Û ¹»2£‡¹š5†ááᡵvÑ<ÕÞ7»ÉT×ó\ç«q“%òL`úüųý~BŠ@~÷pPÕRJ)o/sÍZdɦa¡«ž)ù8±u'Ú ãºÖe©”¦ŒL|™Œÿôüæf7­eJWe„dqÿê´IåtZ;´î„©LÇwËñͼ®`f†H¡Þ#b]o‡a€Ýöª›»Cï}­Áfýg?ûäþîàNÛ'€~™%¡ãíáÈ¥(Á¿ýWþóý:þøýʺˆPU€øéìAèÞ˜ÂÙ@ ¡¶~:Ÿûx¡K AÀ…As†yöt7äB) ³ËáTïGtC7JY Œr}³›F^æÛ¶ÞoÓîé¶çÅôÑS¨c[zíVµ«rYºýô“WþÛðszúäú£çž<¾©­‰ä®ž_ï®7ï}ô>õúíÝé4 ¨ª2d@¾»õŸ¿ùråØ]=šë'Ÿ~öæñÕîéUB3‡¥C èµ=ê=er–ÔçCï)pè«Ú×û>^sÙøMâ4ëZ<éê#„Bˆ+Inò¸ÃŠóÜp8‰Û´7Ö—Ó0"¬÷oýÍ×ÿ$cߤÇi¿ÑEòîxX«öϾ| @Ÿk¿³¦/^¤iJž$7Üî_|§ƒ¿½½½=ÎoŽ3¡X…’sby|³›JL›§0œOóRûßÿGÿ´þjW›íU’«ëkÊôüÅG¿üÇŸnvÛy­ªúæÍ»»Û‡! ˲¼zó`Ÿ>`7ŒôðÞGO†á9¬)ïäƒo==/¯çõ\„˜$€Ñ5"²»»×ß󘲩5è0 ÁÅ @ Á¡ï}xõƒ|wµyqýÕeà<`÷óÒçe9Ó©ßÞßÝéë7Í Uå@-`]!`5§T23%*Ø@@ 1¹#09)õ®ñlœz-seo~ÞlIJOïï¶kˆ˜r–¯ñ†R½Èe.¹Ç”RrtÂâFˆØ¼zô@Úož4­æ*1 wusD\›Ê´IDˆxæÃÍ…#aé¦BÂä=€EÑ{׸Èêè´Îã8RÊÖëÚ+v¨Ëm­çó²U°Pð4¢‘Õ:ÔCŸ?òp¸Ën>úöG×/ödds¯s$))3ˆ+«u¦Óˆüt_ëÒ…(§2æRhsL=jµóÉ—u~8ÕÝ vrƒ”<7¢0_aþJ"Ñ~¥v†£ÍeÙµÃ|ž—ôëýoçåŸm½ëI,­‰üj3ü“þÆ«/o—~éW‘¦AiˆqØ~HvÝß¶Z» í†IUCÈ‹A´÷¼Í`õêjå,M­­‘HÌ.mí‘Ø™ù‘îáR…ÁÌÌç¶^@^I—õ©ªú2müšk IDAT]tîµV"’DÛçÛ ^\×õ‚·Û YÖ¥æú¨<&’&q5tèU8K²ÌŒÜ‘ˆ˜û²X}ÿú}ênÝ”ö7[´R ë”äØck+‰Iªk™Š…:Á&3­]Õb?î/¦…"ÒúšÀ{ß|Ò¬k€¶NHVÛ¯<ý&ŒÙþ(çŸþËÙî—Àß¿B@@]‚·¿é„D d‚¤PÀ­6†÷IHRÁ™Ý?FDl<í"Í€ÑPZ’.€ä"¨^QÀQ£ £ÍUOË©º¥³+§Œ¦’u´Ù×óá`–\ºæT<"²8#¯ÇÓ©?Ô#D“Ly˜& C (‚Xrºr׎a, u4„ð¾š*©ÂºžÌ;"¤,$`9ÛÀÃ%ºŸ™Ì;Xh]3DU 1pDEŽ5:(&Èî–лf2íU£‡ ^ŠU17èFFÈ„kôæÇ‚Û“ ˜,Ñ™2Õp\fèu SÀui"6Ò@‚²vYÊ”ùO®žÞ I:a÷†sÕ0ËEãÑž<¹‰@îÎÍ0{xK{ñôæ'/çßùù÷O~ãÕ?|ïé¯>¶/®7óöáËùa=W8äQQ© Kr‹üÅ»úóŸ~í窊¹HJḬ̀I„\yhõ–7òxØýÎ~úÅÞœogªÇÃZq·yr¬8nE½Ý´¬s¦åÄ}‰÷öÓýé°ÆCïp äX‹ «¥Ö[6"dΜ³—õ"D%‚ËfZUYJ)cšN¤Vû)î­çÉ#.ÏAßáŽd˜ïù¢“§T¥”Á4R¹na·f÷ïÚWo9§P¥¾ cNIT_©f†Q»Vùõƒ»#ÆÇõ¬—À½qœø¢n¹[íÝËwÐ~÷‹ÓéDDϧ”RJœÒ™’»ÂÖ‡„dJýÓ»…Êi WcÙnwòêaцÍy A´°têØ _¬õäÂhîÔÁe@Q9z4†¸¤ã»Ÿ~õw~|€Hyªû«ñ»ßùÖ·¾ñÁf4ñyÐÅß ›UTSÚm?yõ&ÖŽµ¶’¦ùaÎ0®=ê‹ñ Â0²1X,-Á r.O·»ýv€m#Ým­c¢òü›?úÍß‚o=~±ãRòÚæIÒ'Ÿ~þÞ³nn®Úüéz^ÛzŠNëÙç0Ð~B3Uµ’ÇãAM‰™Ne ÀÆ‚­ê<¯óªyÚ|mÝ#¢sƒ‡Ãy»Ù0¥:×ù|®kC‡»ÓétêÝ€´;8€ªÖÞ.*ÅÓ2˘͌¯®wwwïTû8˜F‘ív[J1³Þ»ö™ äbUH)™Ùùa–¿øïýÅÍÕ–0¢Wo5kL©‡wïÞÕZ‡ap÷îý‹×¯º› åæúš1@‰šB:Ÿ—\&áA$Õ²ÓîÑ6¥„©l7ää¼¶ÉÔ_¿Žë*>Ìýð òOíჭá Åà%m.@¾÷çÿÂEtisÐííí›W_ÕÓ¬­5ÿ*ÚÂóyÎ[­ç9“ì§ x?ž0SØx8Õ!I;Ý I¶¢ÚˆÙ£âïUzð`VM˜{ïýëk°F\x’‹-EÝÖœ£vT'@OD9E¤Q]@D8€îµ9 :´îÝT]Qb+]Íì‚,KÇQX´e”TW':G1¢¶žX;çiÓZÓÚ±HuDL䦦ê Ð{Çb:-f ÉÍoï6ã¤K?‰qºx,¼·páŒÛxýˆê²T?­Õ¥lþPÃýÿøã_|!笪˜rQ ]êd/” J AÚ¤uì9Œ1„:!1‚2œ$ bt75—Âû2$bÅ8×u¸JŒ¤µF $¡ä]I8aœ"³ä¨‡¢'5V)Q à[?ù•_ùøÅ7Æ$}^z’íá’†õÔÎó|š«9„Áz^»‘;ìxS2 9•sæK­[­UPL±®„{XSð ר¼´ºô¦àJbñ3H¹íÖºòzÑlG„»QkêÆëÚjsGéŽÚ7„€œU"aqÈ@T5CRàaÐTÕ]c­+DC`HI8oJ@4k`¬jfMûzˆDD¹ä,"$ ,X„wÓøt€Ý†·Syz-‚Kx¤ÑÜá¢}Gt¿½% d†KëE6œŠFÜUûOþêqwÜ7ÝéOì¿ýÇ÷O~ï»éßüµW·/¢©0{GG"w¼ Ö½@䌈ª½ƒwP Š0@ 7½èIûÜ[õ¾ñý_ÿõyß.ýTOóÕŸþµÿ?óäpúüÝ2ßÏÄåéýáí¹wVbŒ€qã=ÁcÜM×Û4 (™9•æ÷ózvpM¦¦«ê…a2»¼¼"Â;\ƒ¸c‚è3HÓœ¯QNßm¿…7› ¦Ò`Òn†ˆK;;„™IÉ9"Š€ "€†A´¬j]½_ºå"13™wÎŒˆ«UK¡ÝÝ"Q‰fD"hˆõ¢ð§6y`æ3ËÌ„=< Xß$¼äÕþüêÃ~<mæ»;ÄÙ½»åˆðÀ€ 0D¢07tˆK‹sÊ»›'Ož˜Ù²œ§Õ":@@¯:£7ø?¹{“%é’ëLì;ƒ»ßSæ?P@$Ð$ÄnÙ’m&­´”i%i£çÑBO 7’ɺیì¦HJ$s¡ªþ)‡ˆ¸ƒ»Ÿs´¸ùH5-˜¬Fú22-3î~>?çÀWçYöïþ¯/ÿ÷?û²zƒh§â„@£“5÷nÞ¿‘o…åQX åAͼ¶s×È ~†"\rjý0F¾Ïs}xü@ê à¥Okc½Ù·ÿöÅOÞ˜îöËyº°÷ÛÃ1ª·óŸï÷GpœnŠG33åÄ”AG nX—„I !Ú‰­”´í’çÇ#ÚB7<‚š—© ±ìûL#"Êëoì•SV³•Ìr©µ÷ÞYe®kιõ¾¬Ó&¦­uý6?¥´,‹²<<‰ldw(âÉ„)>¶O¾i’sþâí—ø€‡‡ŠH¢z{›ÆæT_<ÿÖ·¾µßïÓÃÃcK&c–½×ÞëJÑïÏû~ÒP8õÚëswg%q1!’¤»S‘€ v:д–s¼Xò—¨·§çò‡ÿN¦Z¼g¸O½^Ò6ÎX5»ƒ™™ÝûãKÕo|óSɉTHXsîJîÎÖúõ|ùüóÏýZÇŸ•_~þ8Q’I¢v2,–jÎþŒV;„8VkÑ6£ƒí¶””˜‰à œ 'p¢B8" Ñ=T7vjGÀ F0SÎ)9ÛÔ ¤IDݠDZ=Â)ƒ<Ü}µ¤ÚZk*ƒ;æÖÇñPû §Þ‚B†LDkd{wYr&'ê.B³G¬ÄÍœˆ,d<œ–ÚHr*b0„–!nÄÐåj*sJœd®ö”è¿oý£ÇøØ ÙØ )>În6O²”¬%MLÖÃ0Q …=1²‘x­!ÄÂ%ÁÐá‘3‘A!0gQ£š…²jÚl &D5X]_¼~ýï>/7ܨ_æeò¤}('4##¡4°cÞ9«DÑ»uæM fÎI”¡†°pKÒ¶ztöÚ3¡Ä9qì”D„Ãx€­GJùiËxŠ£ëáî½û<¡ºôŽÞÝ‚#"œ €ì)‹\â p‹d2­šœ¢E9‘Å ŒÞ€fá`‡“8¨™ª š$È{·Ú'3¸›<"—äL¤Ñw¹ìÆ|³O¯NÃñ0ÞG+iH¼/9×ö ZH„5A•U”¾ <}¾0ßliÍÞ\ç/ÎWÐ.ïürþ±¢|qÉÃËÿú·¿ñ¿~óóûËYA梤 Ñ63Õ§…Ýܽwˆy_"prÜÜÜ{‚ºk†aí×Ⱥ¼ûöî{ÿÅ뽿x¥Ÿüá?ŸèÑÑ×îä`Plâa"Är¾»\:ÎD &¯sç|Ünʰbà”²¾töÖ qázl¬âÞ«u§ª.ô¶>°G„­‹4¿êuÌÊ=‡ÃŸÿè‡yùi^§¸üpéÂJ$ãXÒh›¸}]×2§Ói¿ßq]Ììööör¹Œãx;îWÈí¿8~û÷~Ë¡777Ý›G[Û´Ì×/¿xww÷°žÏD ÁDTÛ²µ‚Üýp8l‘áLÌOj r, W2òŠrYÀ ÁÀÀ Ð6f$fbI#KæHîÞ ²îD$ óÄÎä{"“£yh´Öú¼? mz7'ÈSNäf~Ò¬[ô@Nì¡å”­/D›8`Bkb‹]§³å¬k áÌ”ÛìçD ³µšYÖ‚ßdý£Çh­3oç!àãì3b«PÝðÕŠˆB‰›ºÊ0[÷ðá >²ø†JÍI†’é©$ÂÖƒàkX1á0–ÀN'xe$Gâ!Wñ©×û— y¾‹Z’>œÏ’ò´ÔeíӴ̵ú •L©d‰ä]|^8AIX–ùª¤ár­—i™…µ i§”ÙIF%% ªdÕêê­ŸÑâD©wªµ­k3¨»×Ú®—ÕD²¬]ÊÀ¬ßlÝÝ M:‚’q†HZ0â±^Y}¡© ’Xº:ÅÊ̱´ªš7£wvNˆ<@úeŽÄ Ù¶ÜLDDE5N'!/J§}þæËÛÓa8ŽÃ‹±¤Œ\ÞÜéþ2÷³-m¸®ë\ç»ÇóÜúÒz¹Go­ym6¯Ëû‡·?ûå?]/^æÏZû.ä DÂ×’ŸýÅ_}ù¿ü¯ÿÛPìâí“o~öÙ‹ož!—÷ 8?Q•#ꢒKblÁÂVÝ]ŸÔð "1 s‰:ùe]¾óÝOÿÏ¿øË0 :’üÑO>ÿË¿úQ¿ÜM…ÒáŠ^±ZXÁ`‚Û Ú­3"à†0°£st‘ÀvÄd_G‡H‰ªöuÌÃr¶ËÝ0vDô꺛ûê}ÜÑjÉ e· 'êk»v‹»ïe½ÞSw&òÖÇ2ÔeAP«A¼mx˜—‰™‡\êì"$"Ë:õÞˆè|>ß¾xõìùaÐg/òͳ¡ ´±Ä6Þ^–eš¾4³‡,IrJ9÷Þ›[2&ueÅ•S=>.ù&{ЦpNKÀ,܃˜!Ä`bóÙöD0 àÄg¦L/^ÜÞÝ¿0ëa€áf·Nè «O9XH)Fw¬³6‚:¼;†\4q—µph®pæp‹A1ë7YenK£J‰I‰"Ь9!4­Óº>LËã%cX¹H1¦ý½‹iØþ,íò?­[£ÖË2RØÒ¸‡ (Ea¤`í¾:ŞᮢÅ}%²¶¸H2‹Þ]iÜšUm©ªœ™Áp£Ö,ÌDz#˜WT?ÌáäIÇÞ="˜B°½{J©õN*d…Htó7"ÍœÌô)R*6fekM î*¢ª­5Q5³ f y||ÜïËÚL(0‡;œy7ì0s¤Õa샿¿_5A£¼ž“pÞ —6Ó˜v7Çg/žïõ÷ŽÇcp,ë*…ö‡ƒ&©vËàLmàÞVûêþ4ì{0{<{öüÿò?çå°óZd7ÍïÝ.­¹p©«i.½€A¶ÖC@ˆÝl%ñ]ˆÈ|ïÛrá¤(åzþ %íîÞ·:ºÍóò÷¿ýÒ?}YWCd"&ˆ&þº?ôøøøîÝ»»‡óʉù©9ä"ˆîm zHs'3uæp€D €™b‹$ë ìÊFµF½Ì—Ë…Y#hwºF ¡I”L»1i&3ožpº=¾˜Åë<-‡Ý>•¼¶Zvc3ó«g§:׺4!K^®ï­¯ãnw]fJ™’Àx_†}Þ÷œÈÍBÝIeȾ—è"ÖÚ\©Cô›ÿiJi³²ù›/npòkòéß³h ¤0lÁaèf[BE€€€ áÝI¦Ëévß»Ù\s…—ƒB…zX°xÇqémeÒ•Ä<›xLur§ðÍ郞ÇP£·èf!ÉŸŸr9,ëÜëûwo j/ZÜÉùCÍÅÊŽÚ:(JDN’%{‡;c‰w "VŸSÉuÚ8UÁ:² ƒ$ÖUƒœØ½»÷\qÛ$'JÙi5ɪ™‰=¦.qè³cAXDð©TZ{ïJ\r&b8× –1Qµ›Óž™YŠE¬}º.ýÜv›p'ájUï/íÝÍMIrïºto}å0¡f8ÌXA}f#²7¿zØbâJʨ¿XÏ×yZ-™™h3WÔV-È;/ªÊL¹èÆ ¿A óæ±Rö„#½üÎé…±Ø<=ŽúÈ1#ŒÆ.~w|žiÜÓÍ‹=áJôÃÇ7ë;Æ'ÏÇ›C~õü”ˆ¼[»§w—iZæ¥Õê¶´ÖÃ[g„4 3º\§ÚBD"Ùý2i3ì¿õ©ÎÝ-V»ÿ«÷ƒgêÎVm½Ð\Fð@,p' Àèˆ-¨‰ r„)L'`°e#;QAÐz[e9ÓQ`7€7tÀUrmׇÇ(y,í²æŽp HãLWÎRMPLvÒ{ÇH7/´Ýp"‚Ì#Žœ#ìå ä$QȈnùµ½5{{^¾˜Írön ®Þ{ÊòÉËg㮌¥w€ŠÒ8׫wëµÝÍ×Îm®k­½]~ø“‹d5³ÞäÛžç÷ü`‘QË^U<*Qˆ sFH+pG‘÷ˆµÆŒ}úòÍÛV¯ëÚŒ t†;¢" ¡€"²çNZYTaäh‹¹³ ƒœ4qKU´6nñá™{ÍÑYJλ«_ê]SN‰³¡ àCi¾^αÎÝ«ÙÊ×]“²îj”Éf#@|¡Î%Í@È™¹sáÖ‚£Œsï*–i ¯šÇl¶9KXo hÌWö•üp¾@P{O4Z ë(ÔàBÁ|E%ÔÙ"=rΙˆ¬Úr>‹ˆ`!Uu¥èm¥Õ™9´ù0 ,—© 0â _ÞÝ¿{ê(/®ª)IwDD]zkë0ì¢Ú]í0¾¾½WJª¹m—y«Ó"i^×4¤aȉáQ_|2oÇãñõíéGýÃPþìÙ§ÖZ¯m,öÅú³7]j­Ë²˜Ù8Ž>ÝN§ç»Ý.]SÔ¹õñÕnº[šÑWŸÿÅü³ÿû–¾|vÌQyΚÖyªµKdÌóüðn<Œ·ß:îö#…H‰Ž¥ÚãtùÆ‹ñîñRëôp;Ã,T›JJéF$ui4¹Œõ¶Xƒ0 …÷ 'f}þ­×ÏãÆ>ÓDïq(GiP’$zþ0Ï×»÷¦iIœ™²’€(Ì+@×Ë*’öþÕu^—î­µ9“{ØëWŸ}ç;Ÿýö÷>;´¶3“µ>‰Žuõp6 Ê…æåqjwfÖkBHk¶®ÏÖ:õÇöá«÷´vøîþË7×»Hòæ'˜ÎËi{Ú–”O{Mðfà\Æcc>y½„ç©vP‘äÄižÛµ£›åœ>­‹…—R¾ù›Tÿxü±ÍþSýu"IœÑe±A37Ñ* …%X@ƒTÄÂ)ˆ'øÅ­í‚[7…Y8Áœ`By"ԣ‰5SE#Išò²\Þ¿ç›ÃJ–!ו¶ ¸ Ú¦b‘öÒ½žXëR“Ê“‡ §€Â™‰²«8§5z«fðÌÒÌ%Ðë"ÜÍ·Ñ3™¯jáÎAâ,5jÖDJÕ£:3 £2s¦iÚLÞZ³!ïVŽ%Ûåý¬¤p"‡1–n—î°ÆÔD@”|mµ7礬@Ë!b,4do-l&<"zЦ“3{Äu1‘Ǥ;;•ÁÌÌ‚Y‰ˆ“@dªšUEë؈cr‡ ƒj8±Q0;A´ùRûDÞ’$¢»¢k i=,ÕÀÀW×õËóã~õÞ{Ô©/-M«¹Ã¥ZçÏk¼½-3 rاËôøp½O»£_:€›aøÆóñ¿øÅãûkïýCÛ·ÖSÒ7ï”Çá[ßøÏ>ÿÕ{>½àuz|ÿæg_¼ÿ£¿j{ÝiXï}^–”…ACʇݞá÷¬oþZë¼lO\R²¬Ev7º;§C)üâ›éöôÌ "ID#bcÈÙü€Ü§ùNÌ_ßÜh–Z7Zýõ2yO$)éQækï˵÷ž³JáÛ—üZÇßùg¿ r s`kt„»3¥p)e'Bµ®ko$\J±€…/WSâëû¿ýÙÃé)z]¯šJ„ô¶Í+yË»”jLîÎ%¥ã@¼Ïegö}k½¯uZêÕêežHÇóý5“îÊp¾{ϱ´z-¾ÚÒ­¶é‰½ÛB¦kkÙq.kó¾z’<–[7|õæ q„FïýÿØøþøö9þ®u©šDZ´Zi`gmDÁAP Ená-bií¡<-“&"´Œ jÀ„X…„¤Y(‡K8È *ÔÑò軌Þë¼V<÷qØeI[v“19‘‹ B×ÌJV•q 2)rDöžjLs5)3SóÊ›q†õ.)õ°'›©'!!P0œÂÉ™aÍŒD#ˆBþð`pÖ-Á›ÐC76“U•t0‰àÙ+7ÍÙ›G§D\»4pî¾ì¨H¸·æ•ž²ž`[Z“E€qï-„I¼$Q ºÎ—ìL!˜ì*"’¢uófMœ%G,¾Z<Ì\¸›58K"YjºØ<3B(ˆÝ¹wP ‰j« 3„Ì+ÈYB%·*$RNù0À¬×jÓµ¶ÖÑšMÉ#œZ¸“k_"Âû’)‰&^ÁA‰<”x±ÆIsJHðÚ*VoW'0s x O6ÿ¤D Gÿ¨ãò€†&0‚‡C.Š™Q²Ök΂ġL1 ¥$1_ƒ¡YX „¼«áp"tFÞq­3¹“HäÄÜÁÞ{åPpD×ðâ“1š[tõ¨àÇBæ-šQ%"2³µ˜-<${g_üqYͬ÷Gw׎q—Ëàã‘J˰—¼{ýú“÷wÎ÷÷óuEg8¹ãË_¾ËwåÕ''<öq—K¾ÿýOÖu°T«-Î×ùáñjÜ…q,Cê-I‘vo&À‚0€‹Øô®„¹·Åš4ˆØ8Ðq™™sï âN«µÝT"ÄœÌ^}½.­u¿}ñ<ßè.É)óŽõ&ÝænסÕC2>ÑBÑ{^\VDŸ¯ÿêþÕ0òóÓá6Ÿ\–µöÕ<¨:ÛR§óå«_=æÝøégßÜö…0Í¢æ ÿñúïSæ?ýwüÿþ‡ÓùÚ®Ó?ûä›ÏNtؼÇéC|^/Ó|mÝjww¶÷^muï»}IID$çæÓ‡´ßK‰ë‡/~õÐ=8„J  .‹÷Jz´Ö½/¢ÝÞOÚsI‹ÛRÍš&>G w[Ïש”1%1³€›5³öüæ¥w?ŸÏm­JüìöfÍTkm­mc£e^,=²1º‰Vß¾y\×õp¼YZ½Lç4Hôù“Ï?üô/^:Ï3É®ìnF¹Ž'´Ó¹&òî<™ IDAT×g/FÖrssã i¹öîšbíÅ7öÏ“R£6©ttUÀºZªíæœòîH'ñFó¹[ò-8_®g?_ç–‚|·üœsfÒ—/_‹¤u]çùÊÒŠ8Îçùýφ;ì‡@#Š2h+©Ö%ev!?ë–×êk›–Ã(îåÐу#ÌÐ(\Aéj¿» OK;æswy{ÀºßîÇÖš0†ç{ë.ðìI2K”2¸[ëóR§è.¬*CÜ=zXt_/˺’¦ãéöqz÷üôâùé•ÓÏw%"¨}ó…yuï§Ã 2ÔÕæÚºÍ×éÁ|v©®~¹®ËÒÚ›3Y««woûýþô<‹@F¬ë´…Îü_ÿðøãïO>ö¿!(ùÚ¬Ì܈‚È‚p]-•âÚŒ ®ŠBÌãº.…)¥¤=¥µšU óRûïA=—Dq]=H†iª™R‚YZ¯á"SPws®Ð =ÈS®Ò&”ÊØ:\X† èNL ć(rc¯á‰³G(HK'u¥ŒîÌÂ¥3‚bô’rgï„îJ19‚¢‡/¾òæI¹Ù 1°˜“pHŽaÚ–"BD°ÂRWh¶#“’‹s"¢è2BÝ\È(ñ}#ÍMÔ<·`暈…hƒta),Üœ%H(À{ C«E ‡” vƒ±GefRm¬&ŸfÂC„ p ï€_yH!tºy ª9qâ´‹l !ðp†º, -³ xïò=Åá"´…¯­ž}éˆeîs‹”ÆìN@V&69q¬ª®JÉ4§ziàÓq¸^ #a娦,^}L*¨“A… #'†çÜ!!œSÛ2±6jç–ÈUÊ(  ±1…À"Ä RJ åÀöX­Û—B# áz„&}K½î‹Ë3óxÜŸÆ<œÖïüÁoëžwLåqµ‡õýWï¾|7Ÿž»ï~åñjwûÏoß-ùÃu׬¡?NÔåͺËÅ–ú0/¢AÁîÔwÉÚ’8/Ì)iansýâŪ ž¸ÓíØa­öÝáàne\ Îýq7[Sóè½U³«söBy(k]úzÞ˜†å”S!BC[ÙÉñÐÝòÀJÇS¾<®»AVž*Öù«sbaæTF¶TK)/³‹.Zü*’s´ýQ+ÞOyÿ¢|ú­Ï¾úåWÜåöæõ°¯¤}™¾ÚõvÜ%Îí™÷õàñš‡eík’PÍÈ^Õj‡Ã!Í’T×9nŽ/9G÷«rC°ÕFN½¶©_—tvwoõ“ã‰i¸öžŠR×V¯W'æër¡M‹BñgòÇ×sÏéææÙ3ݯo÷ûƒ» '³ð^ïç»’ó8ŽS[ÏŸч]ĸ;¸å¡,ë½/õþC½¹}}÷þCD÷‡$ÒZCð·¾û]ŽXÎ}i[/e§CICí«äÌFðȹVæ]=²&·6ŽBÄî=™ûYTŒÂiŒš¬¡õ.Š3 U©k7£]É—»óqØÏ%˜¸¯æ"xsº¿›DÖ¯û‰ÆÃî6œÃçOŸ%b;ýÎ~]C—õ¸Û%e3ûòþÁ)WðoT²ÿáñÇŠE l>Rk&ÏŒ}1²5¡÷JŽè0ªóHÂ舴,CȾӥöÖ†f‹14 Ú¨ë¼\‚q7®× ´…(^ºméd PbNƒp’Å.l2ªšá²²†”JäáOÙ_Ÿ! 7stk`̉LDHƒMÈ2ÿ ¯¡ˆÁe)LÞ:ÜM(ˆYNÑÝAšSÙ2ŸÂ{Cd+ùàxÚ¨;@›ºoS5=Å=«‡§ÍªÒ€` „Q(©ôÚ<902G4yšN\î¾)}U•„‰#·×ÃIuK—€m’PvCüMPº½wï[”ÃÇÅÌ"”5«jDÔZYŸÄx!„`P…oÉvÝŒæ-Äi÷G/ÌêGrâó<õp®mÒíí…sŠ /¡™Ð@d|â óã¾DDw„ˆÈÂÙò¶' ù9˜,¢¡»÷"JNpê Ž-™%¹;©îSù¨Zææ±á‰C˜î®ª`ÄèO·B„·T-­n›È×21`#ž2ƒ{ïAáî@0@!4tÐ ˜ØUØ»­ôÔ¼¡pÐ6Ê &w€ÿ#ãÔ ò.Ëò³Ÿ|sŠ]]Þ}|ÞÐõn=ÿäDzS}~|ùƒç¯Ÿ½Üßîò~?І{ÿåç_]®·¿üÅù‹1tê¾\×^ƒ-œ°Í¼0ˆ @´ÿð0“úgÝœ—'¡G¬ÚÆPoàÒÕ‰§¯oÝãf`øô ÂÇï vÇ×ß~ýêþþ»äïæëc7*zð óãå‘”þåù¿õ_ýþéå>=\º‡ÊZ¯yHÍ@®ç¯Zkî8ÜìKŠïê²Ô¾,wï׵޷»Ý®ì“Ûz¹NïïÞé0d¦|ž±»Á¹>D¬P"îFK›ò>Õy¹Ì)%eI9}ùÕ/TdŸ‡»û7\TVT²«5{‘_-çkuº<¶j,šn_¾ZSÎãnåHÆr˜¦I%¯keæRJ O)è½D ±àûý°,KNCk}¿ß»»WgBÒD‚µ-–8í§Mù¿™ýŒe`ænÈY·iïö#ƒzŸV3¢øäÕ¡—Úñ›¬šø óp À½¯];yF¥ˆ„DÜàì‘ÕD|ÜÅ1áép „“릅GxÀAy«7AP³ðVÄ!Ä„HA`pÐæø ¢NMhîO¼ |ü÷ÖÉ ìÆ›ïe©àm°‚HºÃ8˜ˆ…õŠ- Á†'T!"k.È̼E >iNŸˆâËW ¶ëØ^ÚÆ „}ý;Ûêu­µfO•E~­„rwúˆóÑáˆ`Ž‚È™‚Dálމu‡’Q0‡ñx<,ËRk;_ç§ž„æmvk²íÐî$ºU:åàk:øvµš‰ÂÜ,¶K#JM;±ˆÝÁ̤P #¢­ZoÖi;¨Pø“j‰ˆ\h«ÞûvÃð5}Ä-6àæwõIšNÀGI%øëØqÀ„œÄƒ4bÀ5ÐÍÁBAOÃ#é$[8#m {³¿.ÉçÚ¶°/u¯¤­v„8¨éîÛ6qsºLöáýºÛçéç_©]÷ƒœöùÙÍ¡d¾øäÕ~úç»|óØæÚìáºzëN!ÛÕK Ø,ÿÛßÃ3{ÂD@ " ¨&QíëØÂ¡`Oœv€ž$Óñµô[Ǩ¢ª¯{ewWÓïýþ?ÿÝüàÓÏ>eZ¿úñ¿ùéŸþyýp7H—O>“4,EFc'n­Nûç)Ú¶|yw¯‰Â»;T¹£@/óT¬§uM”زÎѯA’™×Ö£Òn£&0ó¸MµY‡Õ¸Ù?/RV—) ˆÞWPïf¥$Q,s5VSåË´)æÜ³PpÒœotôèÝS†Á/’/ÊÚ–iš² µ÷ÓñUÎyˆ|{û\’vo6·ùþÝsÉKoótÝó²ŠÇåü¸+T¯—Z³¦B§Â¹öºøTò˜sÇ®ª÷5ï•Oì åòÚ,\J: ¨ÕÖ6PéAšs$„êS–Þi"Nº/®«USÍ"{̓pNCÌ׉zwÕ\Ê@ëµ»7[Ÿ={6Žã»w±õ§ÙÁ’ÆÝíé¦.WP÷¹q·^™§:qÖQ8_ÖkÑ´¿=0¨×º,ËÚ–Í·öêÈ¢ëÚWëÕ}?ìÃS=×Ã.·z [D´Œ©·åç?þ«›Û·Bäã ¦”Ö¶<>!fFÈæi) æçÍì(6š‡mîDÂZ­Oý=µ>B w3ë½ç_û¿€è×åk 7s86˜ABĪꌈðy¨ ¯Ö[a¢p˜Ç4'âÄÒÉ_<»¹^¯ój}óŠ@ *ED$&fr³¶3+ ÑGAÛÀB)£‘´ðîîÄ­;“yg&fŠæBŒV'D›‹¾€ÎØ,6¨YÇæ µyo?¡Ù§Fhï}›¿ôn”h»±_ôÿZÌAìaš ldιN!ÝÚVž}ÃäåÚZkÄA¿–ÂÛ–€ñƒ@*›Ïô4ÕhÕ­ç°ÀÔï3ˇS8q9Þ]ïøÐi½§ò‹·ïN»u> cts÷ï|瓟¿;¿½{\V#‡FÈ ˆs 쉬}t¿¾öNOýÇ=ƒ(§ãþ[뺮ËÒ‰Xò¦®ƒ"Ü;ñãâ›>å醼؀BsJéßÿÞ ”XÈ›êrN))¥?ü7ÿÇýëM$ŸœŽþö'¯¾û[ßúþÒ.•bì}½¸×¹¶‡Ë;Š~(T×Ç4’Z§@bi­­[ì-Ãþ¹u¸3ÓÐýêÍŒƒú5¼KâÇÇÇ %Τäâ@3ôÖæó4© €^.+4 Y«"ÄIçyÝœp¯×k)…I—eI%G¸j£¶†îš¥¯Õvû#ÑH²ÓùƒJZ=R*)én7<¼»[K–”ž©Œe8 »ãûË:¿_>Nûa?L—éû÷/nn¯—YÇòêÅ륮×ùá0ŒãXNy½}}DÈtY}ZËqŸ8ɳћ E¯×w_Þ¿¾ýýÓ~üÐ# YSoK!ß•·Ãyný²¤7%÷Ö]A¬áªIÃ÷£U¯šp¹´¬eš}8œ†áÀœ$×é2ïÇUç«JI©,³M×k9î†r8ìO*{f®k_×u¿æ"BèÎ˼\¦Ú% W[Ú³Ýë]>uo‘l^—wwï”SÊ9v»V§ùzeíÁ„Ö!):j_f2â>Ùã0jÌÕ»0Ÿ?¼xŠ(61î÷<‹ˆ@ø°ïÏc ¶Ìs[WÕÌÔ@¨µîv»V-%ݨÁÑ#1 ¥Ð¼\³f–4-½º8º·-;¬Ë˜™9% s©K+<,×9 r)Ñ¥ÔVû0ÿtðÇß°ý°@lz\"²u"¢<ä÷¥«(+ˆx´‘$±B£Z7¬K,@óI¬š«;ÍÔáòÌHÎ Ô‰5y}tÏžN»VØGHŒŒ©“òóãýÃp àl´™$óÚÑt`vƒºphÚánÖ„˜)$zwäIX¬N-J$ˆD ƒ6‹\ zJ™ˆ¨' Ø`ÁЭø{ÛÊôÖ/Øn Á€Ø ›%‚€®T¶b¯¢¦%ÿ?ì½I¯$I’&ö‰ˆªÚæË{/^¬™Y•]ÕÓC@‚ÿð€'þäeä ‡=Ý]½f-Y•ë[|±EUE„ó•œ.rØX¤€;ÂMÕÜEô“oQÇÀLÐÈR‹QºÞ¹àlÆDFŠ“{#œ8®‡b'6« 2r'0É™*ÕªOC‚ê¹™b=¡2™™ÃLád. Vç\Ãù°u%5‰$ ˆr%/‰ô’šré`׆˜I*h‰…W!73‡!¤nîÎ]ˆ”ˆ¨Ú5m×@b€°»?N¥¨8j5(1¤wU­ÐÂ…“h!3avò,T{r!bò(R– `q!ø‚'ßI"r€ˆÄ+Àn @An "VÃjÞÌa6z:‡°­œ‰ä[}Ô¬4MÌy kn©:(ˆ“3(Qòâ õdÜ" ¢™1‘» ‰»«Ó±äXª€¨˜ ¼’ª×6.î—¢ÅÉ•¡dTs±ÖÍŽ–’ç©xfذYæo¿¹‹Â¨èwÅ ZÂémpöwä`Ê@Amï>ú¸õzt/ÁI•üéuÛvè2§ùXPUXVÿ'jw»]×oDäþxÎ9WÓCyؽÚï‡M!Ä Ï‚K6¨jµ:OÇß¿µó¼îÇúä‚%½ùú‹Ðóÿú—Ûxýêúæjßïon¢ÔãÇÿýÿ¡âz÷ú«ÐåýðãÃÿôþþøËñüÚÈ]/NǛݦW»þÿðuÓ>ËË9ÆTÌ=>>ƒwÏŽ"^r9¯s¢ëÝu-cÑŒ ©çN'ëûvÊs©F ^3! nl±óbÞp ?Í'd6/l*"Xáä§E«Œ“ ýƸ@´¸†ì,Øì†é<šæ>™ÆÐþf`õ’sÓâå›=ÔHx¶ºètœOÇ_[Õ‰b[Óôá4}sjû¾Hz`6íûwŸ¾{¸?¿üòÅãt®ó‰ÚWïßýZm¿¹;O¯7ýûÃ}˜†}H›Æ¹Þüø§)îCŸå”EPÃt¨Ræ6?<¾ÿÕ77?þâÙ®©¶`ˆ¿ø»ï*uW7/6á°úݦԥšR•”B^jjãÃáûãoΛͦïSßmg?Æ6Ýl_«9—ê‡Þ|x÷›¿ú‹¿žNþòöùF]D8Ö 75Ûv+IvϣΕªŸ—ÓÇw÷àˆ<Ö®iwÝÆjÑRÏÓC‚ n¯ºñ4ÏÏožc/$lfó|ï*yÊ÷›¡u?\ßl Ýu»Á´f®¨”Çüpÿ>„RZíàžß^?Ü;O…¥™—ZŠJì®_½‘iR‚ŸV33§~s³x×´Ýy.yu¿*÷¤!H»x)©/L°œúZÔkªîŽÂ«ŸX|)UgåTQÝÓ?§jÿþôÿgàêӹ޻®¯šuÔÐ4”¬:»æªêÕ”¬¤yÅnÙ‰XXs…CÕYÝT!ÒÆ”Kqư¨²²÷è<šÖiVšVˆP«)!ªðBÖ'-NU«Ÿ˜ù3r»I™¸”RáJn@৘_® \ª¦1nLÆë»"´Ê: ~91;¯Çl3 "r "v9ÁA„jµÕ˜Øíwa2ŸYx~q_`¤•¡ÎžUÁ R.÷cNn[!1VÀà…Ü b½l–ÛeÚbî‹?ù¾€VC.›ËÌkü€“ù:…2‹!j.X€•$áëÑ—Ì]˜?Š«*™9;Ie&¦O†¹æNzz|VR€¼ƒ‹;ëxwbñ§#oÍ%¥Ä̯®‡Zë4Æe®ËlµÂ”FLOðÒoÂÄÎä"•Aî JþØÐ:᪪U- ˜¹ÂŸx/ 0,OzõuÑhMOõuòò¹ ÿ\?ØÈÉ}¢€p„¹ÜÊïÙ>à€¸¯æ÷¶B)뽬;Å|G0ójôNÀçþÃmE<^=k¤fä5ÛT=-[}˜¬: ¥Z(nÕ«9ÓÁ“:PŠ_¬Û”%@ýîíÃíÆ-×ÕSeÝħNçûÇË÷‹ªìéWÀH «`qE³±@ÏèX@e !pU7ÍN*]¥ªœ¥s‰nÁ=óaž§µ6nÒ¤å?þí/à5¤òK¡P¦ãÐùó›ý§S«,¿úå÷Íà1ûÍпº}Ѽ"Ót.j‘ðË»CÍY¿=ýÅÏ~›µ.C×»6¤Ð´¢¨/^î8Z¢z}³iÓ&[³¿ïï3·aï¢D.–ŽÇ4™»5Šj„JZ6mWÕKÕB!Qtu­‹$#8Èæ†iÑÚΧq3l½‘’KBjcE´æºØÐla9+¹ È6ECn%BàRcJ‡û§il7Îu“waq„Ýî¡äãù”JyóìÙTÇîêÅ6öÝ2æë—/–{«szœòÝoÞ~ý/þÚf~7û§‡“‘Ííxöö“‡ÇƒªêŒÏ‡òxß衹êÎÓ©M¤£öFéû¼Œ°éÛïÌìû?êÚ]ŒyžÇyÛ¦ëûžüÄÔŸOç<—ÛÛÛz>Pò:i)EµHðݰƒúOò£/^Îì}ŒMŒ‹ð|>޹(¥t:/ðï†m×§Ãøëù45Òìw›/¿üQHí¢åÃÃû²ä$ײ~›¼*“o†f:U!!=—ã‡ûë Ý=ÜõÝÕ^6Cõ\–2ާãB ÂÕ­Z­V«ÖÃã™÷ûý·¿ü{«R¼·›}×ÇÇÃwÇ_ÞI¯_½Úívm/÷ç&´Ër6Ç|®EkÕ‚ZK¨¸Ö±8ãâd’dèÒy<Öbƒ!p `˜³P¸¸ºCÿé—âÿòúýì?~HÉ\ã‘æ’—Ål©p°Î¸s]%¤VjÍVÌT)Â<U©æÊY¹¢TuC¢æÚXèSvw4M»¾ØÝÁR€KµZöHœI‹ñŠf™3óšj"'†º¯”?vÿA…`w‡wj›~-îîV‰•Hɂӥ:ÚÊÀ*¹›Ã)Ò:ÚqõÕ¸ÍÖaÇe¹Œü‰9èþÙtù²žëJ®™2+ž¡¨îVLÁB"nºš^³ƒ|€ÁiòbU”ˆ˜è3Ãcõ&"¿x bv3_Ñ|‘ƒm5Î w€\-4^aìæ®¥V­™ÍBxÊ1câ'B ¹¯!/nžkUé„Ã:ª ̬U×M…>ãõ‰ªÂÄâ¾–ÑÈa%„k`'ƒ}evÌ‹*@Ã0l·R T}YžÄÌTK­•f¶,Ec€Q00ȈÅÈas#SU¬zPk5øŠÉe;Ø]EP†9I‰¼FÄBî`õæ3ã2™ƒˆ$†Æ¼®†ÝD¢ZÂïJ¬t'û*ïq†ó:êþÜv|¾˜90CmêÁ.Ì¡ÕóäÒhÎFfl < ‡¥Q‡³)…Õë€A®ÕI(Eðx8ÖÙݨfƒ+™ƒÈtl>½;à\ÏÇeªBìö.†¯Æü—]îkuÁ_{”LJ<Ñ¢°~Û8 ˜AˆŸ¦n É%y9C*dv,Ý>•q&¸8Èýà"=,d´©‰MpI&ðâË’¾½ K-EL‹§?>Ä$"èú(BZn¶Û}Û¦&Ló¬8ëTêñœÃ’|ýæÃ#y1›Ûö®iy³í¯¯{¦ÛÄt{ Þ¢‘)XúvèFÿ„ †ŽÓIˆkŒ –•]Ü̬oC uNæ,Kõl½Ã7mw½ÝLç™íû›eÉfÄî1JŠqh‡Í‹ýñ|‚99Û¢–­p==bLÅç»Çsèšã!oº>†ø¬÷qZ*aZ d>ür,Íîë/¿j[Yôå‹oÿv9;Å} Ѥ™Î¬4¨V'4?ÿ滫4§­ÜOß¿‹ÔôíÐ ÿõõ‹+]Î1ÌûÛ¯Úf3/Q¸Ïj1ÉNjã‹|õúõ²L9W­¼Ùl^\wïÞê†íÕÍõûïîŸ(ÈvØåù²¶›°jBHBõ¿ûoþ[·Ïwv>-q;Ül¯¥Ø¦öâpþôío~©˜ú«í/¾ùæã»Büòåë¡ ïŽgžlß4)5”Ò RŠÏ^¼AYN¦¶mÝÅý´ø¬sˡ雬ÓR«‡k¡Py÷¤}õêÕ¼œdçš»«Ýá\ÆÂp‘Àη ú®‘‚øöZD¤´ý1‡¶»šæS68z˜ç±nfe¦¦Ø_'FuÕ–Ãôxü0ŸÑ…€m×Üphüxü42•޶„þý»F°Ý É›ú?ñ‡n3„&Ejçqq¯S9úõwË”ƒ§oþê?dµ‡å´}vš–-iÛÔý‹?ýÉvÓt»}8<¸XÛG%Tó¡ßïy*‘eÏaˆÎ¥ØÿÛüÇþ½>Sa®%¯ Ô2C]=Ì®'[Ù÷ ò¨±mš&Žã æ°Ù "ô9€ÈLÉ—yê‡P´²„T™ª›ºQt”Dð:q7p]Šb §x…âÆ®$­EÜÉMV ù¥’©Å ,Lp'2åÕìò"]›­PÃo¡ sR_ÏÂÎTƒAÝ\ýB¼…‚Öᓯs|ÀVõ Ö¶ÀÎdæäX½«ÔT/¾Zp÷XŒ‰Ü±Ô2‹7ƒGaŽ¢Îë”ÝÈÁàõ})¥Õ$gM±-äpv3R%u¢´.V3Í8+k5«w“ÙÌ^xÃ!’ ©YÕº8Ÿ‰ÈC‘ÌëdM× æjʾVÏߊ€Ì/ôÏÒÊ6W‚Åêøùùé*®`¦ÀDdUÝanÎRŠ5 7MóæÍvY–RÊݹ.XJ)®†0sq%7·Uä¼âHkó*ª8܉„.XÔç^Û†¨DFBÄNNjNúÔ8QŒQõò±„r©Ppr55sq'9Ä!¾Ú{@@¦v‘N+3]æq%#­tXª®K…[ -äî0f#b&ar‚‘3L‘Ùmµ q—ªb”Àæ'@#G˜<¬ ÅgO‚uk!ç’fµˆw¶†Ã¨ÀÈ/ ºDk8/fÇš#ƒÏڷߎª/Kª¦x™9k&¦†I¥D“è‹dòsŠÄÌÅK`8»9\+¡m6ãT2dí׉‚0¤'f–U¥ŒÔ$!´Q³QǬ®¡j‘àjRS‡Q;ÄÓ1—r‡®‘F^º¡£Øî‡!µðb~kUÕŠ–˜Z-Ë8}Î0[Æ»÷:ýãͰýƒŸnÛÞ·;z¹yv}µë¯¶Ý(G$pP’ܧ8,§EXª•6‰Mùí‡sØì¶&r8ž6›!ÄÖ”wûáîn>ëÉkî‡Ô¦@3 ŒÔýöþÓ‡‡»C·iÝI}yû,¸äӸݴo^¾8ÏËýaÜìöo?Þ|8†¶½}ñ¯—ñd¤E½.µ<>Nu¡eÌóùq:Ì»ýÕÕÍë÷?õ©<ßÝPBÉUbPªäÙó[›ß½|þìÃwþÝÿòWß}÷v³¿ICËÁï>½¹½Ýøê«¯®÷›Z¦¶åĶŒ¹*´Í°ÛµÒíÕuю݈êt8ÄÀ·Cw%t›>^õ±ùÕ/¿×SE2ï´kBùío¾ImÓín¸¾8O3I£º\m6lVƒÌãx`Xß61ò|ûaWO ®é¢0(Ž÷ûíþt±”ìÇiZ´½¹ZïbÚívMÓÎó\îèæöæ|2B˜G-¥öi«q 1Ý-‰“²µ»«ãtÖº0ò\§Øtçóùj%8C«N¬»ÙXNÓ´ÜÞ<ÿúYräLJÃ4M¨óù|ÿ¿ýù]Û¶˜Óß¼~ó²Úýuí.†Þ ÇvRý-ËòÏC?~ïûK1þÌ]pBEä¦ 2—)—…@äD 7“Äà¹Ì!plØÌlŸËÀ¥ ¡Öjâ}j˜¬xéšØ%5öL~\òÃâ7}Úrbµ6H¨¶69¹ymBp­j.ÄŠ í€hu$±Ä…À ÄÜáÖ\"çõŽdE¹§ZŒMä«w­C–µH¨ég¤YfF~ÉQ‘ MÁƒƒ ‘X`" Ì 9 ™Ã P]©NȦƦæîz1ŸºTëDrYj³õS/Õ1ŘjÉ/^¼,„|ÓtÜlv^JÚl·Áó<šÙõõó¦&§\F–ØDîovÛ¡áÈCÓ<œçþf ÅŸÏ7û›O¦õæúZ°|ÿ‹oOÓ‡?üéÿêoÙôë/¿Øn¯–l§Óizt8=ˆSÍ£.ã<ýÕßþ,Ls3”ùqÞÅ¡¨«ÄïîåHÏnoþË?û¯Øç¶K1èÕ—¯Ü*±Y^rjb7ŒÅ6›M¿ÿöÃÝ'å*Rš†‡ýÞÌ´ÔjqÛLJåíÃC‡¶ÙôXꘒ{©›¶ût8-Æ>½bçF.µm’ ŸÎQüùóç›þy­µ.séB#¡ýþ8n7»³ÉRxØì›}[sÞ=ÛáñÞàϯöÔÄÔ7§OÇíærF úæ‹Ûù|rõÅŠr½Ù\k™·»ÄnâÜ´ëÞ•YÚlÊA) ªfV‰¼ïÓñêºã”8n›t›ºæéøðËHùz» |Þm6)ÊáîXóc—Øñ³¿èÛ&Izø4ó§÷÷òæG ·Œøpÿøã?üƒ«—Wí¶Ù¿úgèßóþãb8˜¤ñZHSž2*%Še,ëo¬gó‡HKD}RŸ`.ŒfÛå±Ú±ˆi©ˆ¤a†Å6T*sE$DÏÐŨp/¬ÅRöyëhœÕ=¯ (´a6"3Xâ+"‘ â•ÝH“ld sÍ¥*ˆ(úJqI•ÈÅCF¬.ìn•&^jµÚÉá`'7°³x"rG©Á.Žßà%Stp®lâìÊAª©²¹)”a;Ö‚!²º–®¬6 ,U{d“E3Ôjêp‡p‰1.ªEÍT]X˜Ûr^9¶ YO²^‡€³¬y{Wq'öìë—dîî ey±; ¯zÒJ!$+-|}¸‰XÀÕ±.…Äe58YcØÌš½*UåÀFX´®Äœ5EˆÉé3#ÄÝF—Mw‘1ղȳ’#\l°tõJ$?ýúµ»–ºäœÆêÆKvóX€ª•Z ¯J€z¥è&–³vS2òÖÐ87U ÁœxYºfÕ ÉFîn,Á¼–Rb"c†Y DRöìZÀ-_H˜L°&æ‘_(Ùp®¦îÆ€°ÔÝ Å•mÊÌ!H­J5²‹‘›˜©ÁrÌœ B,Ó±l»Ë‘}ÍžD­‘™b\uÔHn¦äLNLLÕª¸™9š\M„¸C`‚q,Et]ã®J¼‚=váÁ:€hY7Õ Ùb!ƒV«JE½Q,Ã:Üùá<·26Ê¡ÄiÛ-^J+Iˆ‹£Â<6^«Hz~³>“Ú^cš&·s¾£X#¥é€ö·‡{ôûíU"¹Õ65Éj©Y«!D¹„䨗5:4Ī…µ€3×\-š±š7bL™ºZTkqw»+®Åí¬úÉ«‹„â¦MˆÄtih[Ùìš®ë85‹Í&nu!ÍyšÞFÎÍã·çY)×{V¶Å›â¨¥h&-Ï®¶·»ÍínÓíìêZ̧;‹.:ÎÛ»ö6mÛ¶Ý\éR´ë¢»M³ŽËÛïîž¿xc̹êi\ 6z:ºñxx\LJ3ê»ûûù¸7$JåE_îo—ãñœOÝÐrNú8ú¹KéX§²x=Ÿ—ó™šgiØmºÛ†ÑKãûÕíÀÓFóÃÕ«ç7Û«]Îo¾~ÁV®v›.¥6a™ÆéáAvW…úÇó\ ÙB©^ãÌÍUøö»?|÷ã—Ï™ÙYÏÇñt—KÖjÖmnú~øþ~u³é檿ºÝâ4Æ&‚R`‰IØa‘ †/ôfÛ‹Õd»Ív§M·‡Ç6YKÕ9½}ûö|§Å¾×^ébË‘wç´ÝÊëë+RûâúšÔæ2¡1jh׿˜Žc©e—¾iš¦ÑZo[®ê.½“sŒQÌê4Ĩµ\·W“¶Uãb÷øxj(žï㔋Diû½µoÿáݯ~ý7_~ù£Wϯ޼~v>¾=üd¦ž±eÑ~ˆ‡û{ÝÝtÏŸ]í7ÐÝn^¨_}Øê‚Ú—×ð²Î;Çåô ñ'ÿœý{Þüðr×uŽ1Ï 7BID¼. êJ Ÿ 5D*vÑshÄJÏI )M™ˆXL®:A¨Ü–\ ÇY‹^æì¶BDNk€™‹ÿVµGä-ƒ­/®LT…À §øef_ÏgŸßE,üƒùª8YñtWöJlNÂbDÕU)\\¶°& ™™{­…ÈÍs™j-Y•8¸æª \LIÙŸÁˆ/V!ëͬŸç"DQ@ñr afε‚‘Hü| êæ+š´Ú{8àææÕm ¾ÇgJ¬›]àw^Õ<¾Nqˆe=Ђ Yäî uDa!¹{៸ ³\U%€5rA@Wr~ʈ{’ÿÀz™Ïà3´°v?”­ÀÃ*a€VÎõ6îªVÇ™™™Á¶ƒ¹KÊx8œƒ0d‰ƒ¨.…M8„FÒJ ©fä¶ö ò‹oНOÛe_l%ä0=™xÆCàËþ€Fj°È G1"×UE´~vàò‡¹‘Dr"#¸*"_Cgw<½ñ+  V”«]÷¨ŠD·ªê`‘Ȫ Gˆ‰ÄÔ/f»+^BD›e–`5'¹x¯Ò:AZç,¢à.NX!¼ÏÜ/v°05ˆV÷X»áŠk«ª#xŠlf[I^Jq«æ`¢Ô4œ6n݆†¦{}{õl¿ÙôÍõíµDvw­u>.ÇÓ8gýðø˜—Óñ“Ÿ§œ‹u›m6³Ú3AɈ44nfˆ«Í^Œ!¢ÀÊʪÕ2LM‹¹iHq±¬ fYŠ»;;Ó%þÆa~žÏeR…2sbŠ<£ëiB;Ķm$ÉöêÙÖÉn_<¯.ó¼˜áü0šU#˵ŒãxWêñññ¡Vz?§@’„†R­RøþåuúÉË7mE³IÔbˆùY×LªáÏö7?ý£?.µ~:š®ÏwÓF¶õ Bhe`àDÛ¯_ìöeê|:)eòÓ¹lv›žpϯŸ?·ªBË­ÙuQo$UO£•Q]jlbk"/ù4Íç«ÍŽ”6ÛŽ ãxôAñøXïóêÍ–y&D­îª?ÿ»_Ïói<¾ÿõ{Wp¸þâÕ5[>ªÛ”¿úí&µÛÛý³ÛWÙü4|:ŸZ9mÚTMEâÞ|1/åîñ>q:<Þ\íæÃ) 6}SëüpwªÅê»wïNç™%’4ÓòÀqãdon_²ÏI(×ÃãLJÛý³Žy<?<ûÌÒ÷½ˆ˜Ù²,]×1¨ªÏU—¥Âª ¬VW !•je©IBl““H¢fàíЧ¶ïÆJý¶ï£¼ø×_ÿäO~ÌP‹jéºíͼȦöþîátT² K˜Ï_~õBÕ¯ö»…oýÎ\Æû»û÷oº][Óÿ¯ê_þ3YÛ+0 ÝÌÔ¼I©Pqsª6aé%çâç*‰Ö „âªÅ™zB !WÌ,ÆBdÔ¦N+/¹˜€¦PB¸('8b-ØÀ¥b̼RUäb÷;8ÚQ‚šg¨ 9¹]&;ÁA ¬Âg&"8“êND‚à~y¯ÅÜåÒ«ÁýâVwê16€•9K`br¦j X%ÛîDÂ1r©æÆtáy8À]„dV¡Äân€ì"ž23†Xís„˜ ­„µÿÈÕEâj|þšÇC.]Nñ•D*e]¨Z¸§LäÆnÁ¹‰ÁÑY`¢â¦ $’°Ñtê¦÷]s"ÔD¬Û½<¿¹~ùl÷ÅM_‘ôå‹R Mõ0–q±ã˜Ï³ß¦l¼hŸ³£’0<˜‹³!Ö`à"*¼z ­^ùN(ТlBMyY<ÛãáÔ¥î´ä$íxε†\(6Ý/îNÿþïÿñËíUìeû¼¿ÙÛVæ–Ót:ÿõßþüÏÿîíöj+]ÓuÝW×1‡¥’6‘c×ô¾JÏc·9Ï#i²3ˆ›&ÝîvJŽ Ð…¶¡ª,‘S D¥j©~—b(nÓ2·m{ww7Ôeb¥¢\]í#‰šOS]ÊñxÜm:¸Ü?žæ…þñßÿÉŸþÙü‹Ÿ5M—óüøð¸£) ƒýäG?ŽRuñ—o^Ÿçq'ôòÅ«gûýÛï?Íåt>/MÛŸ‡¬o½Y– Ð?~ówSÉóìeß÷ÂÑ­f§Óyy™$ãx·¤ÔçSËÁN£×‰¬üåøóW_~½ÛíÆq,¥„–e!7‰ ,××7e^P.ÉcÓ›„ÆÌÆy M»y¶ó CÓ±yª¬Ùê„ØžÎçÅr’‚´Ý5jÒ²ù‡ûû_÷¾éž·qóâÍë͆ïï¿=>î>üúùÍBÐ<Ù”4µÍ—/¯oúÆt°ÿßýw_n¾¤&‘ ›P]Ï¢æ¬*Ä"">8 hFTN v[ ˜KâF¸ t³qéÄ‚OuqãÚŠ2X]Šk`×ÀbPMfP#p(ã¢e¨Ñ™¹i¼Ö,Fâ$ŒTªZ!{*ŸÌ …™ö•dGŽÀÜa5úå·UCuWgaTs2b6g°2ÔCX»…³+\5q¬«îvQŸ²É¥†Ð%¯⎧Škn«Ë§)Uk¤.Ö„wו—ù„\Œ3ˆHW $“»‹ µª­‘­ÎAi5äøa¯ð¹¦V3úìϾs0õR-Õmý‰^MiÅ}µ…ÿLïàÏàM­•Œ˜ÙTÄDÎ|±gv¦5¶fí6.÷{ YyŒãþݸ»_& øÂV ~éå.|d†›fw¢ RÍJ¡¹Ùó ¸ËÓr˜óhe‚S¤• Õ”‰‰Àj sf3cºôgüÄhÆIe?™™Wÿ|ãk  ƒÊ2{lŠ0„…ˆÈÙ/ê›Ëðe…oÖe\¡ž@ )?í’9à.—>ñ©ÿ`æu.Lj†&Ó²R­9¬‡„¤ª¥ZŒŒÏ™Øæ«îWPÝÜ«„•^mõ‰c¸“…Ô¬XÑÙTa«-®³9@Î%¸™Zˆ˜ÆÄ \Je'w–„FDÜ=Èo÷tÇ @0¤ÄÅP¬C²…QC¨æÅ)2Y] wWa@jj»ÛÄaŽã©§X™‹W]—(œî8N3‹¯}ÛL%—iœÌvÃf9R#1:#u©¹Ú ûmІEÑHˆ1šÑlÌØœÚD6õóX‡ææäåñxTǸä¹zÕòoþûÓm·_þø«g×Wß}|õòyuû³?ýWMßôìIL—QUcÛo¯£H>†Ä]ÛýÁ«gãt|kú8–© žkfôͦíBƒ»û_§°ï‡ÍñaN1ÞŸN!Ä é®®R×nž£*‘D7î†=!Õ‚ë~ÓG£:f]ÂRé¾LCvûwoóÓ?ùÓ¾ßNÓ¤ª!f^–¥I²,Óa\öžN§.†@h†®T-ãyÓoRÛî†ëß¿ýð1ÆŽû«ÛýŽ»ãôxïޗؤî*¦y>ýüýÇ¡Ùw1PCäÿâ_þ ¥]×\ ¥cß\ßÝç(^Ž9†fw³9q>éÑç¬Ç1Ÿ`?ú¿Yü>õ¿ól÷ƒªCºÐ„j«3‡;bX“@`€Bö`5,  MBÌ«Æ4æP*,&IJÉ`‹)ƒY¡(jîÜRÀ<ƒÉf[(Æ9⥃åJ8ˆ$Y‰äK69g ÊATn¢W+ŽÍˆS„°z¡…( bpRc¦öê Õ¢ÕÙŒ%ê¶*£’›—Á"1¯3 3çÀ^—yõ"ãW¿jbw5d]ˆÁŠQ-ˆ83ØLE<¬[‰s.B=À$–˜ÙHÖ,êdZ΃+ì rf§ÆƒEV(qˆÎ®n,ƒTx~ªBDˆ‘ô©ÆÃLW9D¥"! ¦ªF"bAÏÅÑDDÈLA wWIÂ1ÔÜW‚2s0'52Óµ¤»Z!5R ‘ÌÆîÄ® Jl‘Åà® Á! nÙŒ(†_,Šf¦n.ìäDæLm‘Uâî^.¾„úâù³j(Z§%z<äyŒu˜CD*ÙÂ`8¬ŠÂw"‘d`"‡¯aFlÊ”J± =³U] Âqpö–HµªYµ‘ÀÉ­1ÉFDÕtuñwAÅtéVÜ‹k¡ÕR\ãbXTÕÏJPqCt”áNN^ÄA›cÕŽ)¬ ‚b6³@VÌhuC#YJnS ¯¥“Õ{dq,X$ÀÕÝC€;DPQÝæD¾8AÁF!¢õQ‰( 3 †M sɨÂSNX× Nä}a&ŠÁÝëjþÆO¡!a'T3P9pe¥Ùšá>¸âçßâw£ŽÚ&˜f⣠3ó0l_¿yñÇÛmh‚º­0LÏÇó4Ïùx˜s6f¶ÂÓiŽ¡ýß¹{³^K’#Mì33wˆ³Ü-·Ê"‹,öÂa a™÷35 IDAT$@¿Z èAÒoÐ6èža³¹×’•™w=K,înfzðsn%›dCšA; …›w9'®‡ßpsû¶W‹ÚU’*ªª4Ç,]*uñÒ“s<˜:; s ±©úTæ\59I1r§\bŒ6`щ™…X„¡Æs9ÆõÁ-ÎÓ0—âüPéwÖ÷ÌlNÅ4v{‰±"‡ëë·¯r•"ƒêLóR‹².å8ª½ÛMa)!í>îO®U¼¾~±ÉóqµêÙq½é{©—ýz“²)¤\®û+I)ƾé~ÿî«}-FáÇׯ²”ýòðõ׿ºè_ÿÕÛOiͬ/„çªÿËÿú¿ýøóUÒñøo¿úúïs6áÐukxˆ1 ÙñéëRÊç?úɰ]}ñåÓuyq!‹¹×—¯·W/6»Ýã·¿ûU ñáã‡ë«þæz{ܬXÙæï¾}usùú‹7¾ò2ÔZËúz=ŽËÄ·Ó®TØl·O_½yÑõÔo/tö÷·ï÷÷ûÔui‹ #u‰—å˜: ®yÜ÷îîÝ»ñqìW›.Ä«íæj» 9Q×õû×=ŽÇªãúú唸_…mÚ¬BXÆiŸgêäaŠD2æ¬OR ‹Ðl<>=2ùë‹%Ï÷wƼ›rÚ08¼Úåq~óâeÃëë­ü`ULU—²øjÓo{ôÝJ˘§ñÍvëÇwýëTËx¬ß\lׯo®ŸžŽèå‹õ°êŽ··ÑËõz[ÆìY’WÃ_dúo¨þh­Ô–¬óL;ýt4O wGƒ Ü9¨:œÏ&•,dÑ$!²×ªuDÍÊ)¥žÉ4T}^|¦ÊÌB †v7g¹×p ET7ØÔ²ûà׌‚¡;”A&†7{ f8·v²°3©:T ÎæÅ”-"­‰ÝA,æ0%f> Du&j"÷ää!oNg P¿ÚÌ´*MÙ  Nêf!’3bPkm»;17]Aû$33q®êÄN݇jLläJ ƒ’j>)#žÕ83N np˜%bq"‚ ÌŸËJjúÛf$ÿÇ7—𸂍Ý}¢Sèü~Ã÷Ó~¦¹€4X§ÉØÙ~úª)›œÚyÚ̘O¶è-Þ'ÉçÙ&¬ž(,dädg!Ï©Ôt¿tÖàüñPjñ{¾ÛíBH)¥n³Ù\¯sÎw·˲¸˜H¨ 3ÜUÉÈÐd¡ç2»MsûÏÌ$ªÆðý­¯fÁœ' Ý7#3³*­N:‡Úž45MûÓ7Z¹µéÜNþ£ÏØ<°W'5f‚Ó)Ó±½uS–é‰ÃÈ@näD`bÀœªµÙ‹˜›ç U+Þt]NÒn)ȉÛ` 4Ù†?ž.0“·hÆö+˜[ãðÄ““† £‹¤ðÄÄ™[639ƒí q 1‚Y31œƒ¨ª¹Q”jæ)Ì^Ñê*C)‹D²>¹'á¡ûødòôd_}û]wÛÕÍzHÂëMßõþæ‡oSJEU˲,Ë2æåð4G=ŒõÛûƒ‚ún“ ^§B5ôëʵVsõaè­ê•»™^Êjš&©–:rÕ“Î|!;‘U7w·jÞ$¸ «Pä¹Q&Eõ¤ Õ0Î6O¹‡ïŸ?~÷@°®Kžˆ/¶[£8l‡pý2Ç{óŒ›~us=äx¿Û3.vGlcàoå«Ç]i½^§$_ÈKYy9^¿Ùö›aZÆÇû÷iEÝ`×oÞî¿x÷zu¼Äv®¥›íuß i¾?ªY¯åÅ«—WÃíímׇ/ß~¹®Wtæ•WÒŸÿò?]Ýܨ-BN?ùòó»Ußãhf?þÙ_å¼<Î ÷Ûóöby=Sù‡üy7¬‰(rPÕÇÇÇ©.!%¡z¨n^<ß.W«!ÅW«íÕE®%ËO“rªÙî÷«íà@‘ø³ÿþ¿#çiÜå«¡«îÓad«ê¡Sü(ûÆ¿úgžàŸûjÎå´=Zú›ˆ”R¡p:¹†š™0˜)DJ‚¹šƒõ§7Í (†^ILb&@Å–©fè¸wsæDÔƒV…†; ì^#Rb%å`çæýds(HÆyBˆ Ñ“­†S»MnfÆÔ Bjj:I†A€  ’‘nöìuQ×FH€ƒÉÎ|ÕÔÀ¦ï‘^©D„`ì'ד»È™° 0ZM#ÒX¶íÞ Pœá–bÌÆÆæ$ÕÜÕ„‘Rh×Ï$sU-˜—ØQAí)ÞÒò` |F-–øS§Oë?¹ž»MŸrÎÚõ“egC Îî™ÁÛ;Yã7ÄÍOÅüTµ·"jòØV‚´á+ 8Ì‚ÓÞ ØNL^¢ïÁ›ç‹7 ’ ƒIhQrˆAL‘çHr`€ÉˆàbðàÊæâ$¡S‚‘5ð„¨9nÀ á,'®µÆD-á¯Tc÷àD cT!rëB6ÞbðBVkãuš·žSK¸Ww˜Y+r,„èĦÖXÃÜÈ<ŸœÌŒ‰Ì¬6{µSlž 4Pr!W6cšIN šûóºmJr>™õ“œ´ôb~òFO-V° µjQš©?“¹¥ŒJªp”v„ ï $×fÕÄýD‘† œ[žNÓžÉ=@\ÃZñénP‘ÐpIU$rà$VM=›æ’4ÂVFÁ,×j’ãaºßO Xu,ÝðUŸâЧëÍEŸBß÷ývøÑ›kWs°…Õãþøx?}øn:f¯ŒÇ裋w}LÊK BiæÀ·ÙKJ)„ê|fR/ËÂ89Ã.µ4ï«Tœ­ºy` Î¹qoÔ K@»“'˜1h·We|÷~O•™9²„ˆ.yßÉú¦7øúj= ÝõÛ-©–üd“Ö2{­Ä‡£ÕÛªKMûxñq¿,¶ãÄÕu9vÉÈÆív»ÞÚ}íB—n._!Ä~Ë´^oîîÇíp„J ¬¹ÄÕ¥šLæ¿þío³ï§å0MKdˆR/¯.¦q?ù#Èr‰è°+¿üÕoc·¾¹¹ )}ýá»×¯_çÅVaxøxw8~ø£/¼“Ïÿú¯…iÞ-Ëtqqññã}=äëW¯ºÎ¯.×óaw}s1ײÄqóâb»¾ˆ˼˜«[¾\_¯o®Y©ç—‰Ý|Ù^­ó”Ç¥äÅ«¸q]uö½.³;Ë\J©w¹ZwÓ¼cÄUôÝ\£p ” ¯Rÿö³/bÀÝÝG%ÓŸÿýÏCˆ¯^½*¥äœô£¦¹¢¼\mL³0Ís>¦ì:G&¶pçWo^Ç®¯µÇ]~XIJýÝÝÝÇÛý4§áën7Ï—«M]J^–\ÿ”›òŸÿšõ‡Ÿ-þ_óÿû sFÉŸÿ† °ëº¦ôó\y wrsSGñŽº|¿¤màU˜hòç4ciB'ÁŸVéè—k÷ŠeÑ\±^‡!&RwÎmª¾xìW—†=&T±®÷–b\‚hð¦:“0Hóœ§Hº˜ÌÌ­´'lÑê©X¬=jk"†-‡¦j£yˆFõZ«\ˆ1"+€²#PŒ ¸[¨pólZf¡:;;H½F"OnîDÝÚQ«e‡ÁᾸ“¨°³•Sà4 UŠÄ0VHœE îp3”ÒddıÝ,( wv˜Í™´˜Í`÷#Ÿ©äîf®Löœ ì­ô(+ÌI%4r¨0%ó'ÀábvÑÜ¢nàp³$A¡•0XtGqkv 0¯ÆÒòf ª‰kdõ @8˜ fP>µ:`z"Ê Tͽyl<ÓhYÝ,8 Ø]ãપšƒSk3AiÓÏF'Q…TÙy¥QLÕ ©'W ”Z¯†gÓªB¦„Ú‰ÀçˆÞ‹ DjcðP`U—+J0‰$ݱ, ã@°¥qXLŒš¸ÂÍÍR…™{%•¤-ÿÖÕ‰˜)²¨T„¨*Y­¦b 1ęŠ½D—@â@d6+ *ÄnP%RŠÐr’â˜Øîĉ¤ƒ»)@JÉ æ# ‚±º8î[™›WF=Qå8“"²z%;dÌDd$U¢W:á°Ä)Vå#ÓLЖ¸'m&q.¥0 † ŠšI ¤‘‹³ÜVݘÁd0«]8wœ¤º•r¤ŠMíVÊc¨Åw•bŠýª)ÒÕåf½îSH¡‹Ú­ªÕIm‰Ü_­’¼YÙÏ^d›k¨E«-^e<Îw}øø8._,™ª‡mì;IiHÓ45z™9âÓ.í–Ê6¹\ãœ$ŒÇ9¥^+ÆìÓ°,nu»ÚbIÙcÁ|é»@æJ2YôÐw³²y¦<ÃV´ýéö°¸‹œ:(¤ªî5§u·Z÷)Èf`Nè®%a)ZU5”ƒ,ÉK=tRe8šñã¡ÐÞ„?3µÃÓRçãý;'[’ä_o¾ºÚ¬^]ßpµéø›b†øpýæAiR÷ÅgŸ_DN‚ëõ°]¯JžQ¹Û\=íÆ|¡ã®ãAŸÇì9Dþøô0ï'Õãáé°ÛÞ¼y;OeµúA? Ûz÷ðp¬>RÜOËþëoÊ| ^¥.›ëû§ùp¨¯^þ`Õ§||ŠCÿãÏ7”Âû·ÛW©û‹víÍúã¿Tåñ—ŽRJ; {]pd –¥h®‹-)I»£U+5«ú²I<&c‡©!õ©:Æ]å®u Âa̬nYgÀ8 ±gÄŽSÏqàîjnKöª‘;Ê•…œÅØÍÁâ𢤞 )3g‰­‰ÎÅsa"kN†pfº4‡æìêîfZMN€…ª:d®F.ÎltJ¹3wfA‹Zu¨jk‰›!çQB$f9i,Ïm†VóÑsòð‰` UU‚:”àfBÌíÜÙèþœÿòLÐi³ÜI›!˜¸!§—ýÞV ílé~¢ÆÂqî–¸™‘›;»œ€>£ÿ|´0z«šU>mÕÄ…ô9Ó:î“9TU½ÍÒ)ïß›rýÁ0nÝæFM;TOÿjÚ]Àa@­ú,:¡M„ ®]$fæ\©”ú´ß©qqGd6²¹º;Ú¾3ĜΠtîo9ÆÈžÅÝÌTÍX+ ∅D¦J€€˜¹!R­kàîjfßói›Âéìß‚ˆ '¹Ó'7–’%†dÎKb9‡Y­u¬…áÂr*e©ÙÔ¹·– 9“7 úçÈ@'r's4j ðž6¹àέ­tNz^¢§é%" §ÕCT±¨µ8U)M8Ü~w×Z+Uw§JÜЦjü5ólÐffEÉ›>™àF'7œªl!4h8„@§ ´Á¬ðá€D¡…$-VµÐÃ7s `F }âeÕ7«áêrX òâåg Ës­5§®pðèuÕ Eðºc^ÿ„ƒú—¹úÓ®.ÅžÇ÷ó8vµZ9¨pÒIM]•SB”’gprw@·6éÂݯW¨õdSÜÅ@nÉ*Á5u6˜ÍbUW5&Î:—eõN˜L«ŠE°{,+ŒÔÈT»@žóRÊâü°Tfކ •bJ)Æuß§ž(È“*±³W×’—|¬U³õ á8œøö¤ûÙw÷_ÿþL7›T­ô·wÖYä׿ýztч—›ízè?{ýÙÐõ¥V±{±}yQÊüݤµî§q*e3l^½|ùðððõwß¾yûËáªèRÝ–eÎK>Ly!n¢´„¦Õàùo?ûbÞ·›Õ~¿~ÿOåU Ãzd£užØµG.{½ÜuaU"vãDš¾}üV5+!L‹ LôâÅ5±;x½¹~Ü¿zÿëÏ¿ükežŽOq¯o¶óx̵. r ˆ^ÜkTàçe*?øñÍë77¿üý¯¯.®?||÷sžtÝݽ/ßüæwÛK}æùái,S¿Ù^o7iè^yQ–Ù²bè6Ë›7oú e.¦š™s|ýæeÓÓíýŸzÐþÙñ¯YüQ?ÿ¿®ñiyÄÌ"RI½Z6ËVÚÃѪçIÉæ:i) ñŠ@:iJA-³ÚcŒK¦„Nzcš5C„°0›tqµ —ÒZ†ÃJ¸ÆçJî ˜³ºmBÍFâàBÂæÐ&==ü©Y8D?ù~˜ŒÌÉ$trv…·Þ€»³5a:Íq„rÚ&X[ ™³S“?x3¨P—|Ñ|`éô5 P 6÷zâp:Ü¿·$ÿ_3逅OH?¡V?#í"žU¸Í¼á“’Ukûêɨžˆà'ËêÓ.ؼËà ÜÈa~Ò‡2"T­"âœ"]œÖó®HÔH©`Sc7¯æ (‘µ.;œ›Ï¡ùŸUòÈdÚZ8MÃz–“üÉõ®çùüºŠŸ6Ñvßšˆ¨íIÌLgw!#«!šÂµ(î÷eªK®êdâ, bìfL}aæ@ìB±€âPn4¦\`Íûž*PAÌÑPœFdXœr‘ób037Ó–AgNDjæ|Ÿ\’pÆ9óïŸ%Õ…‹jIŠf.D®X¾û9nÖóëWëRî6›«Ï_¾}ïcLC—JÍÝ*þÍ¿û²TëãEÍ 5†MË2Ü\,y캡ïÖËl÷O÷]w9•'¦Z«­ºu×õ!q Ý«—}÷jÑúáþžú«îöûºÄÙÌJ)ÇqîºUêB þío¿ÊóÓöòâ³o¦eæ~úÓŸzýøôøõßÞìÆåË/ÞÚÜM!ßÞ߯ eZbˆÂ3À¥<¥ÒaŒ}×_mÑ¥Ôu]ä»÷‡ãw?ýÙóñãíEß_mÖÒ Äì§cèhž—Wë?¿ÿ‰ñ¯Y´'Ž\·þ«ë…<_’ª©f1†º7Wƒµ“St­”l9ÔEë*ôSeàõ‹•„zÜÏLÁ²ƒ°Ì%¶ê%£6g ¤ëVýðÚ¯½ŠS º„‚8&!vuH­‚)²:³’ÕjUƒÌÌßÃXÍX:(KÛÌàä.ÕPëÀ-}´BÛ5xc º bGâr’ÅB-·8W3ôæ:çÀ»NÂ8Î4t§-G­9º›Î;ÃÙÌq –ùƒ3%ð}ýSŸÞªRs5m–æ¹q ;ïÆp8™A+Qb­0W‘öSßofÂÖÈJnáLýÔÀ"D§£º» Q«füSo;‘hk¥hààv²$i…N)u©R5j¤SÀpR¸úiyÑs ˧sð¼Ì«ÌÀ"m©7ˆA§„˜Ÿ ·À§’ý¹þ P¡jµ’­Õ9/‡iÊ%2ä0/¡KÄn–µšÈàÄJ1¹zeû¹J,D`R¬³9™±;iö OŽ(RälQ@@Í¥ŠÅ3ãä.­¬ñúÌžQxcsË97„èNZ7 „SÀi䪈"à\Kd1"w/±“BX¸#³:ó`fnî¤DA„_Øž«½êFS¢jV ‘Å (£º»¡º³zbQbιÊÞší6Áû ÈÆ¦@s²GpsWw’ ~2Pç“õ‰#ƨLc6µSòdeV«wWGmóÕJO;×­ßÖz'~´;·VP³0‘ v!u  ƒTHªEεÊDkÔ›Jõ eûæÛEØ?܇ŒäôÙÍæòªç¾n¶ýf½ê:¹ºˆÃjhøØÈªz]¯PbùÁÕ…ûë{wßô›é`jaÊ~{§‡øô8ϵÜÞ?l»µ1eóº8™Á% !-(ʉÎAÐ…àÂîqQ,ž+9v–êl> Ó$Õ#ÇÙa"…¼Æ£0+ùBulnCUÝZ88Ñ:vUÍæÚÑ™ÕÆ<̨² XïÈŽùÅ›µ™ i³½6k3‰œõ¿=îg.tø°ÏÇÅáJÕWá yṋýnÿówÿ(¶$ŠðÞ~gÇå¾ßŠHî¶Ã“w~·^õÞË«+}ÿþ·ûÝc×ùfHÜÕb)>æïóÅvÐÛ2_ Iß¾yýx÷a÷xûòíË0Äõz(ÓT§üêêõáép{8üæ«ÛÝxЉÜ~ûîöÅëËíÕå<-%õ/_\ma¡–ZŽ»ñ; _ߺÚÝ~?;¼? Ö¯/x÷ôq¶ë¿yñ³¯?Ü[Áû³ÿ°’˜§ƒy Ç.Ìó¸JYÂñ@·ß_¿z9Nû$%ÄrÈì,ŸùE)Ë8_¾ºîû´øË^0==ZIw¢ƒWó®{\Æ~½ýõoóòâêîîîý7_÷2Ä¡ŸêH‰>ûÁ‹¡w·¯ÿ’Mù/«?žŸ­²ÃQJùgßö_p¸û§†LùÔø`e­fZÝOÞ NV5ÑIýȘ´ª®{Õ­ 8&›‡Ò\…5¤Á;N«8\uÛžH$)Îê]ì\–#‹³ H%°ºT *C‡©u`Ë‹™Dƒ2PQØc¦àl{ª-~+{®Ft&×1ªª‚$‹ÓÜ"èP"1+ºªÅÕ]K&¢(Á<›+‘wN¦E—$D¬`„Àîbî O¶œì¸ æ*P(¥D0vcçê’ `vJw!g3´´XƒN¦L«×êÂ'N+Ège äî saæîŠÖú€ÒȤjB'³ŽV ¨jŒ‘¹5ÐÅܼ°ÈÁUµ*AY¢K‹-uvŽ|"¸¢5Ò Â‘Ñ2tZ7 DÅ  ÐprMu§CoÆŽš¼B]!ˆŸ—bõ…Ý¥"†˜Õ”á`Rí„#U3q°k©OÇyY|*€9i«QŸ%פCÊ)ÙJ«VjÂ%´à3,ÃÂÆrî ¨“÷¹?©CaÌ^•(xðPaÞ„ä";TÕ™xReö†È >…µÃMê™@…™›'iBðf&*3‡{da‘¬ŠHd*Õb=g9µÒBdìç-Ü)”¶51𸤠fðŠ Eg F/¥KŒg¯æì"T„Û^Ž,¦†Êi)–Ý*1K%wrjk†f%0ó,l"AÌZæ";‘K4ŠLh—¨†ªªŒz*¼ ¡"ª#'³j¡ {1e ŠàæD¥€Ì…ˆÎŒ]§”Dçà åÞ{K€j¡Pg›™Á9ÒÅð²feæîwÙYî‹,w›>ÐSðÑtÙn†×Ÿ_ÇD«®Ûôq³íNLÖdî†^”V½\^mº·ž¦%/u¯ž9×ñ¸<>yÉ2Ž¥:9Á5{ ‰@ª…(Mj!&£jk‰^ÕØK‚ê]ºtáµõÌÅàeœ;yð ðªAy ÁsIÕ±‘„§jäÙL;2s¨K£XC®<‘"³§ï23œË)dy]Z1$:E ò²ï‡¡»êˆ´æi÷ð1/yWFYõ:1Å¡6K¨À ÆšP5®ëzõá¸×§Ìwå«oïÜhèÓf‡>pôBœ§#éÞ4ÿðõåjH)Ò?¾¿û?ÿº†›«-ï0{·Ù¬n®_udw·ß1×>ç- íQ¿úîAãfsñã››«41/?þì§óþéþÝoRL]Ïý:tÎÇ:‡nóø0ñꢺMéij/C1þæ——ª™è›ýÁweÜ]^^Æ!¹[oþÿçïƒèõåÅþaßÝ=¼{˜(­B—„*Ýí…)ýæŸ~/ÄoÞþ°¿^m./«ö¹:°f¸ôóßZ]vO÷uz@OÓ¨«à®‡».àf³¾{÷..ÿ¢múß”þåyø¹Eÿ\ ‘«®î©‹`(f^"«GÀ@ÎÔ<§BroVKÒ6¤e²° ±˜ › ôëNúaUç©‹¡KNK=LM8d$¨ä¤gwÈF^h'.J¦Ž³m¥Q… ’ª·#slî“̶DH§ôt'ZS©Y©ª #H3/kȽÃjé‚Yä£!–å+§‰ IDATàL™HbÛ96¦ ºÐYi, ÑœÏpÉ3ÅXɃ’k{A€ ìzžîV¦Nj›ôÓšµÌK ]`ÑÚ'y³Zw?ã5¦Šm’pÕêgÍ}ü8È•Ð8횺Ÿ#3c93Ï4Z®Bƒf>YQçŸâOòØž'Ä´½@%vX 5ÖÐÌ3Ü›røô¦ªÎVàpROäLJ¤‰[q¸.ùé8MGŒyQ7e#Uu÷‰a¹D¤ä`ì–ëédÿ,96pµ Æâ8©:À.ÔõffµVbJfVM €YØa8÷+…æ½VJ07ˆÁÏ!´Ï¿dQPru Ä!|z£Ÿá6¨µ@îÂbhòc²†"¨ÙÂZ-xç©n¡ÏíÕÓ¹65¯3ÀT«33-…Ôœ¨R‚ˆOÂ⦉qXUæH„;™Uxuwa7ˆ7º2©ÃœÍ‰ÈBó¾k’s·Œ¸[(€Tgq‡&w"o% à€j&÷æ3D̽(„ÜT jsÇLN ƒñµcx×üyÜM-‰TÕR ¥$ÌÌ\­\e™‰ƒ"[gÕ‰Ø$ÔUÿ(‘Ü–I6÷“üü¢`%´ t±êºÈ«uzy³^iµêכ͸Á*±ŽûÑÝûºè/nÖî^²>e1õ˜k¶ÝÓái7>»"Ë’u®=Gq`‘(‘cr7!Q.Žb\¡TÌdè%Pµ0Å):QTgª–CŒÁ¥ZÍNj=D”íà–\…lQ(Á J¶)p€wr&b]e'BJtûþ£ ±{°j6{‘›Ë ¯Úõë~}™úkë’€j%ç©.îÕaqY²UÀ:báàHŠÈc­÷û¹Z)ÝÌ…Òwû½[ ¢¯^nØCdz¼Ÿî§:tÝÐßÌ•Ôýf³>÷ãôq7¾û¸»›CE—ýËKGûo~õ‹W7?øŸþÇÿýË/^ÿÝO>ËËaœvûÃ8×½Ä@¯6}ì»\—%?¬Ö‰ªm/VµN1…Nâ׿ù‡\)ŧ§ûÕ<¾¼y±äòâú¥â謡ãqÜ9–õZO;½¾~ññþn=t—Û ¶)çx{w”€”B¢hFór|X>®×ƒZ–<æÂ¤ªiá~}CE¿þæauq1ç?ùÐþsãßfýÑtÄÜü§aæfD¡©øăQLò€Îà°ˆDÏ …Ôu)òŠB´ÔIðKñˆ¤î¸‘ „⥖ˆÅ2 ÂHb¬ £Žv¦hÙ{¤™Ä¶ê‹ÐP`‹)qˆöi½ëàp51qcJWw"Rjsp&á*‹»“a±¨™ÈPÑù 0SM©€‹b™ýî8 óâÿù»Õº#Á°Šo^Þ ‘7CZ¯‹I µfJ`&1Ýt¡Ö,k“ ÿõ>+ZŽûcv@¦‡eë2Ûín—¥z­¦²Ô¬5ö‰ [•ç'-–KEäÀBæl¼ ›•:BòÉn1×jF<7Ͷ±Y˜á gãìzBœ[l¸ZÜiĵBFȬ,äyFNƒ9í®‡B»± u"Íß\¬ÿÁë…‡wû±,G9”¸»Ïß¾½\]\­/Ÿoy°Õ̫ͮÛ‚DZŽã«íúB㔃¤øþý{|¿ûŠÓ8v+ê_¬×›ÍU¿?„ý$îiž¦ãdÔ÷ŸíÆe¿;šÙ¤eÜï½j`yqyµN}ŒqHZæÃín\ ›¹VÕ9¥àœ—ZÄFƒÄ÷¿Ùéôïÿè‰ý/Œ¿¬þø“°ËÿÃ݃€w¨3ˆ™«)9ؽé"8¥ÕÚ…ºËa,Fljf™@,Sç(u1^_ÅÏ!+º\]„9¥ÜÇàäVCq¯%æR” oã¦fää ÕH½ôÅ„ S&qËnÆÂ.†BL11Hµ48;×Zê±'áfÔÀîdÎÚi À)0'wJdÎn®pu+ÌÎÌIaK cì&/™²²%IµV…Æè®jî̼ʦªjVBൠІ$ ®"*b² 'ÄRJ;ºÀ"æ ±pˆ¥c6̬‘3NrP*K»QÌL€i¶ wrÄÖ¨PcG¢4÷DŸ°@äÎÕŒ˜…°q53…¶×SWAµ‚ŒA‚›q³° 'ë½FÚ`ÈNÆ 2&ˆ-D›`¨Å‘PM¹EÓ5¹‹Is@…XÙB9™‰3<’ )©¡¸Xâ>8ØØé–‚kÃf@îóɪݥцɺqçÀ Ï9|>.Çãñ0‹œËP´d_œKè0­Åê¢DQÁ­®”;¬‚ƒ[è)x’bpsiJ“s¬X÷q•$¥8åCöšRâJZÏÆK4ñ*B6±Ï"b+uäT¢®óËaݧ°½­uÉYfÆq˜! °+¼À²š¨Q dÉÑ)º ‰¥ ”PYö…êÞ§¢5‘ÖWS„‚ÕçÒÏȵyáërö„n]¥` ® E F®ŒZk$vw¨»9ùˆPLâ©’cqgŽÞQ­•‰«œlFÉâ †Ç艼š»Rqvª.Æ=ÇÈÕ &Z]]É=†ÐåØÁM¼2‹Ô" ¡öÜkJ‘LYˆ½˜#ƒ”™Ý´9ÚEæ@¦Zb8¥+›Ð!j ÌÅ­#0gr€#(»'N­,Eu{L‚Z-ϵZ—V®Dî‰Å9kq°IB %TKqÊ€©|u÷^DbŒ)n™9t’W‰…íÕÍv;¸[M ³Ýøä¢ýZ¯ÖâµÚe°B ˬî>ç.çz8ìT}¿›æIÇã2O3ùjªq,Òm·À2ë˜C Τ^³g"3S]ɺ5ÃZò4¯6ë¡”Pkªâ»÷á˜ó–Blp…µï²ë“."Ñ¡D@ÖèÞ+3wåxŠÅzŽ#ôé¸ žõnÎ]¬x×±tòá>Tâ +á^–½Zð°¡áÅöÅöæ•ö;î#'¢yu¦Èp©ÕËólüôpLa»Út¿¸Õ+‘eZ–y²\nŽ&ºŸR°ÿë·5ç¡ë_üÝ/¿ûÍ»Û/n¶Ë´Üï$ô—«Íñq>þÃÿý?ÿäÇ_\n7˲ô›Ë««+–$ÝpuJJË^¦}`,µ\^^ÃùêõÛaÀ|<ìöºßã±t}«ÿø‡ÛìåÛwâJÆ©\¾ý¢dÛ®»¿úÑ—äu<>‘[»yÊ#USÖÛãþøÙŸåÖqw·ö˜ªf=oùß.þÂtÊÉ„ÈY±y¦¤Àà /.û‹•ÊR 1¥‹pU}9Lj%Ã`Ç )H$å%m0lú4p ‰:;s–Ð|°Bä^ˆ((ˆØ‚œ[5žlG‰9#‚šûƒ˜Dܵª¹{Œ‘@"\QjF9+¹·P9Ã8‡ xÎ9„cdF­¹yDˆ4 *2³˜bìâ¨K(Mî{XNùpun­ûvv7;‘æšÝå¿0íŸDªV"¬]Ws" ¢H`€åYz¢Ð:clßS+ ˆšY·*>iW<÷bŒn'£³óÑ… r/ÀDB(¦µ©yË)ôå“d`ÄÉH« ±Y% ÌTjmÍ“æ®~¤þÈ5‡šf¢)pOâÙÓ%Aší¹¯¡ªÖn† #†Q¨'÷T7 ÄÄRfwÇi™‹©¹WS3˜O0˜¨çê‹yn°’CXFDd24 œ[ï³ÉZýP©”ÙÌTÉ%v`©®FæL”Ä¥fu€ NŒ./ÕÅÁ̱[¹Z^&"Éj–KÉ:幪z`þ‚r5uQ±–`"ûéøêW9kxŒÚY’É 5aa0™7Š®œ£5ñ¶;ÌôÓÛ³7 É)d~F÷ÄqV›œþÏÌL”ÔÅaŠä “ºWîdÆæB§õw¶jƒkcYªSyqõ€æ:ÏLn0À¤1VSÀ”¨º“8LÆD€Á›i*@hY‰ÔlœO –´Hî´ÔÒˆ½«ôÄ<©™¡šX­éÛ4¸’³º'ÜLÝ Þt³î˲D¢B\üô:­¿H ÎH½… ‘Ág«,þ}Bck¢Õô8Þ…áÐRöÍíÿKÝÛŽÇ2O¼=–ã\é6—:»õÞ&óºÐ7á™üúÝš¢?´¦èØ‘/§þñÓöò’[[C}o}²o­÷¤ÌsŠÄæË6VWFó\Ìl]]r1Qv1†vaYEѤu!2‹vI4;Îîî^3#jÛ‘êJ¦èMò²nW@jý`XD"·]Ù²pªr`z9ïO[cçÜÖù§§mŽÈ›åp(ešË4ߪépSï~sùõt'i_·íR#‚(߬™>M³°gËý²mÛ¶N[œYìx|;—ÅË,ÓEö‡çµÖÒ¦Y•ÿøéÿüÝ?þշ߬óÃÿñÛ¼]æ·on¿u¼\>×yq÷Çç§Ëºÿíßþ­ùòý?F¨”ötÊZæßüæþ¾û®”bµâPÞ¿ûêÃWw{»üá¿+½rÅÓ÷?ÞÜÜ–ö”mÿî÷û¡þÕíÍb€¡¶5‘¾GñBæ\bÝïnn3ÂÞn§—Ã<¹óå²»gëÿÒVòϯÿHõ‡$/‡¹ïûø'Ò©°B+ÜÑNùÑŸ?â 8næ‡Ë㩘³û««„á(îîVlJ7UyM;ºOÆ]âRŠÒ³e2ÅlûV}ªœ ×ÑL($RŒ”‰0gzÌ8†%fNYÂÍѳ¥„*R1pš­˜24øIc. ’”€0ÑÕME µ”)³k|Zô0V£™ÙºïÛ¾u—åäî2s§KÚãé™™W²!ï£ýÅ— €¯½ï‘g1d´þóý§haŽWY&üÕcà—úãÊJ'Ad^ë•1 r3‘É⥖_ÚwíËŠ¥H'TÀ¸¦¯2S5%»²µ°RÌ- šäµï2¢UGi’Zføkx°¹º‰ô±;hCùø <'_¯T¾† '­ ‘º²/‡ ó‹PHt5¥™'Édfi,0íýñôÔ·ý²ã²o9Fh€Œî¥ódt°´¶we'ˆ@o¦n³Rj)¥í³&¡€âØåZšÆˆÃÇ%®}W–¡NŽž™›Á5¤½C,BHŒÞ]žðLFô¦J=©bn†Ö/f¶ï{\û\ü¥(¡N%¼"ÉÉ‘‚IŠ$‰?D·u‰™jÀzZ1 ¹P;òÕWôZ|^‹ñ/Ð’F½À@¤¡F´_Ã,¨eS!+,#ªÌ8’¤!ÒzŽAHØ5“IV9ËDÁ ̸:»8zIÉ¡À ¡@{ßè“„2j}¸ÅP(Æc 8f°¸Âi~.A3\«—½·«Î†¤'¨Œìå»9èHÊÜi–’J@v…È! ?b¼!T±$ã:²péÞÑ×ìÊôÜ{Bf ­§îÕúÞþß?>Uj)<¦j}žë<Õ¿ùðöîvªS”¢ªF•ªâhÚÓDúSìwo—ßüæÁàÙ¢mûùrúãS{>Ǿ§²¼<µýÒ{Ó†ÒöfVJ)ç.GABQÍ™ÈN%ºœ ÅŒFkÞ“êH‰eƒd¬¾,ïÍJÎë%Êj™7c½νeK–CãÏ Â%¶|VWf·0>Ÿ.§Ø~1Ÿëd^3b YXeùüyý)"{ÜÎ7}ß—›ÉoH7>ÜÝÜïç¹²ðoþ×ÌìÛåòþë»Ø-vDÄùòSÛW i_{[óù§“;ÎÓÓ”—óçZº›ö°—‹þø»ÇRÊd÷ÏmÃËw£ï777ŸžnooÿËÿö¿îÔÝÍíçOßÚ‡wïøéŒiÿüù3é>|86ÌÛÛ7߯–—7ˆ–ëãžÛ·ý…:<ýôi;MŸ?þ@•woîßïÑ~úôC(!ZÏ fØÛ_Ý>ÜÜþøÃ÷ó\üôÔÒûŸ Çø®ÿPõ®ê˜‘yM̆‰a…o¿yûœçóåÜþñbëôððÆs^?5œ‘¥+¾ä‚šµuE™¸øùÜÏ?Nõð•—&‹ˆC™Ø•i™–ÚSÙE'+­dª#.&373ZÙZÀHÚÔéëé¨+@}-ÅÊT¢A¥›Oºlôɘ‰LÛQ;ͺKƒ`"ЯÆÐë…Ñ”•4™«kÝÖˆ¬w‡b¥«mî™éîeš.½+ÂÌjÇ„ƒ>$1&E{ ªhÉ+µÖŸm)ú9RÙŒ€•âLNCöÀµ®ûâ7üy Ç/Dãÿ÷è׆†®v†ë—è—²N(¥Leޏ¨f-öá}ޤW“eÀÂ)2#£K­çdËø’1Ê2êä±®©®ž»Ø.ûö²j¼DîQÄÓü ¼¬×Ö·ž–Väœ#_ÖT¦/6ì¼*v2~ ²¹í G,ÙØQEÍÜ0‚fdpöŠÌ5ÒiSõZ2®€Õ·ïÞÐ$…¤§Çm;÷ÜÛq>†+,c˜ÑzÆð‚©aÀ&û/e1‚¹%”JEÏñ` ÅT(Ç‹°jø€©$”&‡À”—N5ÓÝ «0%Z¹–Ä"èÞ•fæ›ÑýºâF:H·nhJ… `‚¶Ö«5ÇŽ\JaÀ"MW½ éPè1u™) dp$aÈ‚,¦„!XgóºåšÊbî°hÍkëˆTlkw›Š-Eßë¨N“9š)À?V7Ň–äkÆ3%½–ÎîÅ#‚npÕ-ÉúZ†õè0OGÂÏ ôL›é,I ` ZÈk|ð¸]™ ñÅŠL *LÉ©³€ótP¶çÜóõ ìÊk‰Ýš•ÈWÖÈ<§ l>Ðç玗„Û-Ö6¯øãO?Ù¾š¡Õ\s¿)7‡ZÞµnŒÌ÷Þf¶¯Žµ`·ÒYœdYÜËÍòîRæâp&NêÈ–çˆL~útùôi{|æù¢óe¿……ð|9W»yÊH{jçÖv«åfòP4t½®]¥˜™"Ñ—[®v;…²Cƒ:GÛ#ÒjRTLeF‹‘>_ÎÎHË|\Ó¦ú¢"ëV×KÏKßCóí2…õ{AËÉ ºÌâr7•v¾x¹iÛöOÏ?}VWö5Ëýþp ±]µ`òbÆã»éþþ0Í¥˜;Ümº÷›—çËǧói—¦»¥Ù_λ–µÏÅnº[´KüðXoÞ=ŸNùc;·?üñåø|¹½™|z³L‡Ýøæ«÷ono–©ºÒøøë÷¿úíßýá¿þöï2u÷öíC”'7¿fÌïßþõo~õfY̹Ÿ^>šmqVìõ§ï_øc¹/Ï—ç§óe;áaþpxSëüôx‚¼7ü/ÿóþô|>míÿëv>ùÕÿþ³×«ϯ6~ÉÎþK_dî ûu" HhÚ–?üÃG\åk––ëåé8Uôdï…å ]X&¯‡Þƒ‹•ynjxyÄ¡ÈÎ?éS£YÞÜâ@´žJõï^|™Ëlf*vö «ˆ x‡E*SŒ`Ú#‹›†º’肃½dì |A)u@@¸öäa™†Ûu´m[@iêÑ Ë\kÈBcÛádY¼’;›ªÏ¥‰n`7EB||·”Ó%˜]Ñ®cNŪ±›Ë!“›Ür˜gsbjÈìE°¸/„)´§@3²dB°ëZ„•ÚBLVÄᛈ¶{1™”‰‘cCf1“J¥ û( 3Ñz"9¢juÖõÈ[;ôDCÀ-Ë0‰ö62ùÌ G½m¦2Wd¤¢Lh}BÎÙŠ4 JJ¤ µ† "-Cë´¸jfŒ¤eztOlfM–×Ò3‹X<ë ¹EËÓÅåü|¹\Ϋ­ëZÌ(ô¶ êf˜Z Z»,MBŽ£L›+öh‚–ioì9Âq4‚MLM+äç)h+cÅæé š CX ÍcÂHTs—ˆvPÀä`?ŸNï7Çi>,ËvÌ—çõrÙΧ‹÷bšHöÒB=‡µzT îµ)lààpFÄN²cë2¦sS\Ã㈈¨Òw?_«<¡h P=‘£¯h"TmΚ-rG/Ie*»Í~l=÷¾—©(ZŽBœr`*=¥NìÌÒÛ.7¹'8%IC>Ò•ŒˆR|ò2J«Â«±«[5À >š'‰!OWší¹WtÏD²Ëj2ºÎ“ùMgIE°Ï®L´aÆ¡2 k½“^m‚YSç0°G¯À´Ì’Æl' ”‡WæqÄFÑO[d³ÒÍl2›iKÛ×|Þò‡õR@ì툗šüê×K¹±2×ù¦¾{w{¬¬¥æš±‰)*qh­op#4Õòͷǯ¿¾5NdžŸ>>_.ûù4gðôÒö=zËߟ°51ÂBBÞÎsDÐvAL «Jm½¯UT©e—.ôÙm“L‡jµà\¬s—z˜Yôà!§@} _Z_¬”j[4„!ô¹¬¥ßV±m}l•<, ˜ 0Ñ.kãä9#æçMîɵ×óޤ|*O÷x{³TDÙb¡WŸnïKyûðð7·emç-šMó»éW½÷Ø[î-Zß.pÍŸ>>©”óÚ.;—r£æ¸Ô¿ÿÝ÷s]¼'‘óT_ÎÏïõþ6ÖZÊiÏéøÕûۇ·ÇûÛ%¶o Ûº~,œzÜýþ÷ßMK?}þA‘ƒ÷°|kÏ$Ë›wono¿¹éŸ¾ÿáÃúU–ùÒuy~º=Þ¿}øj©ÓãúôþýÛC»ü«¶ô¿@ýað¡ÃÂU”GÉ_æMý»\¿èä'Ý.ûzÙ‡¨\¡KUª¾Y–Z^Öç‹‹›áX«õÜÖìÕú4›9)/îç? ”â¥g臭³‚b¢÷H«ürZ–FXVGІ?%åJ§{ȹBró=£Ç3ôJ›ê½“9¾Ïk'”¯`»ÙØ3`iì9×Ò)£ Ф_;Õðe–23òv“êI§C`¯#>CBq5®1Œn2‘ýªÔ »šP†3ìÑÆÀ¼{c”©L€„(ƒ‰W-ÿlúÅ™"i ¦Dt¥2Oc?Ö@ùsƒ#×}ß÷b4poû—ÌÝa©üB$»žù¨ë9JÈflØAƲXÅ€™“_U¤æCÑÀþ’m¾<_.— @«Ý LµÖD@àÞf%÷Þ nîîîQ7‚…nÑ&æL–¢Ý‹QFª‡ÆHÉLqõuI°ä–™½ôŒG ! ²¦ˆíy??ž&ãíñp8ÖÛÛû»ûCo¹®ëétZ×}æAæ ÷ÝÉ!ÑÕp-üÓ^ÕõÏÆ“ƒOÏkÈŸ þÖ¢1CÁdñUm¡•«'ƆÁªÐzë#_×}L Eò¶Ñò*=Ú‘$»¡Ã r9MÈ"dryű__#‡í×)¤™”—Ñi2Q(… ­”r•‚¼Âñ2. –ƒå'Zý>zjN"á;öº”«-c0O5TçÆ²Ìî7&÷uÿò¸^Ü"éîf9ürôüç6° £…AÐÒ\i²Pd7våöš÷7…4@®™¤ÕG S”ä õwªd–R®Ó¡óÊì¹Á¼Ž×Ò(t¡a¬¿~²b Qæh™Ê˜§©¢“™¥ì´pßULvùÜ^~÷4¦4õv¹;—©~õþÍû»»»c /Ï«M,•mÛ€­x!öˆPïß|;)KFÍ´¶w²BöÒÖÓyݶýåÒÖµ]¶iŸŸsÛ÷R—í¨¯Ç[uIÙUÝ=Qž(—³b¬­F±K¡¬Þˆiš˜êÐ\lÛº”zºœZì2“B‹,vާNؼ¼ì;²{&‘²rÛ;Œ†N(°í{²Ôç—g¿ñ—ö„½ßò¦Ga”§ó“r¥z­ùæíÛÝà»_æúp¼¿}3µí\˜m?øõ›´|zú D˧ÇsY¾*u~yz¼\NØ{=¼ÿé#íe}8.ïÞ¼|ê«Mj  IDATøüÛöÇ¥Ô¯?,ó¼_¶ÞûÃÿ@Ï÷_ÿúí¯÷Óe5Õ~ûÿü=½&xøîþn~üŸþêë†ãßÿã÷r;ÞÝÇÖ¦©px:½|zy>G{|yþÏfiøï^™ù 'ð›«tF‰²ëß»þøå%åüf’sß6\²¥”5WŸ¦›ÅëÑ>|óöóóÇóiëÛt¼=Ü<<¼½P–ÞdŒ±N™»ŸŠËm‹³/yP™ºµ53¯iŒ/ÒK°’ÕèâȉDš1‰¦™&K8c€$ ƒ_„ƒc´¬«ß‘”A4p  B—HW±–yÀ”©ˆÐÝЉú…— áU´TÎ)ÌÖˆsì”1å —°SȳýRêÎòdšÖi&èÚ!IÏ>pIÙÌ £W”<‹ÌÌF²Xm»„ˆèµ–A±«À•©ê¿Œ¥ž¯þXeVÒh4ë`Ϭņ£&™Î+¾Ò~ñ×—»wIRk=5²T®VØEŽTr™ ˜C[BÁ†bPPd,ˆ¹{‘Gjv©h³h¾°´]/¡–ñr>íû.‰”»ÉÙb¿¤hœÚÀõ’¡Ó.3J~»ÌÕÜÌ”yˆ›±ËZ- íÔEY¢l°Ïõ:ž","2ww˜ \£qÁ„^Ñò¨ò“qO]³âŒ1òƒÓ¦zÈÔåb§—í‡ïOÃÝÝáx3½ÿêvòrz<Ÿ/ÛÞ£.Ö:C/óʶýr·“pÀ–ôq«bdõî^3<ÒÒ]p1Û>€ ŽÁq!]èë6:©9êpiøy.±Û'ƒ`­Rf))ùÚ-ƒDΕÕ+c[t£$ç(ÛH»*W"b”þFN×ÞUŽ”͆«(#®ÐvŠ…f#øw‚Öˆ°C^›€Š“•ÃÈ33‡SR¯ejÊ•Yk•à{ÿÄÉkýá@!=1ð¯#WMìh–ŽDCD [Â,òìIwM¢%;“9ã8Ê ‡ÚÜ„¸ z)/Óˆyîm73øõ gDDlF’æf$"=…Ä4³$ L€Ü÷ÌFÑi¢wfCÉdk­CåP3÷L=%â¶\ÔQÜÌÅêíÄÛÃ1Kyøð¦%‰xè6M7—õåîþþ´õõôðøñÓ©_È0/ç>ýþiý¯Ÿ_7ÆÞøwÿpàͯ>¼ùñÓú•ß{íäɱµËú͇_#åö»ÇÇóöÃT¸ÌõùñåãÿáÓó§7w÷ÅøÍWïoÞ?Ô%ãŸ+ùÿÅë/P䥔ŠÊ{ß;{« û¿ýÿë®/'i¤é™‡»¹Ì¶•K×¥'Ž}É-úO/Øç§­;m:ààŸžãùtqøÝÍ}õC†9…ŽKg¤éó1cë;Š¥Í37õTf1 jƒö)æ,e$ŽgšÒLH5TF‚u¢¤†TŸÌEOÛ¶9­ˆšK¿l³×m_m>6Ú3_§Á×#SDO# X•r ö©}t®s´ìoÓQ]„ŽšÉ,ÕÓ84Ì @´V'g 1\bd¦#·l–ÏõÒ°S6o¢,**]‘U°.L$ª‘Pv¸²0°&åµDHZ‰Îâ=C’“9ä `Œå­”‰t™ÛpÞó5VMjQе£ŒqDÁ(òº“–מF©EYÉH,2KrÀœÇb RDöLI¾FæÙH8ë}5€…¾mx>Nç5,ú4-/e ÛÃá9̼'@ (£X9Í×|„ÑÃÉŠ{)½÷Ì,LHéb÷±[^A݈P"YŽàßÍÊ7PôTaB»TÈùÚ3Àµ1%xLÌn@©l<Á³¥ÌldÏÓçm}Q™U¦xóÕüîÍ­¥ÖËör9Ÿ¶½§.;Ͳ&œ®=VÕ7¯ußÛ$¸*]I†Œ»†Ždkh”™¼d­ˆ„Ò · Ré‚•¨Rï=Y*4¼¦a•t§Iì9Ñzìã¥H³:O+Rf3'F[wfÖZ´­ÜR”êTvEBIó¡d Œ^e¶&‡§XhnÉŠPºÕd’ÅÌu%¶îPdÌ ‹‰îÛÞé³èëÀy5Em(¸›Ó7kœD”R¢‡AÕ=Z·RaŒTÅ«¬õ%Z7+ˆ4’ò’¸I33ŠŒˆÌ( q5ü–ÀVu™°˜•ðÒå]C©³¹`–)Eh^ƒeï¢5ŒÚ­Tr ™£Ö:ª“»²¨«õ=³›YD"ü(`–J2£uÏœÚ ´,–FE³žÖŠ¥ I* ÊBßú¥™mVÎð1tEäÇÓŽï/ÅX'ÿêí])ežÊtg–Ñ^ÎKe™€Vão"Z¢Ev³’ vžÙ³Wš/7Í9=BñûÖû%L8ž.­·1?]Âo/ëvwóíÔÎâeo/Õ]î/çµ–[í9išeÐJتžljEïdâÂbpÞî±²–K‹ºüöÝÁÅ7ÄKæ¾E¶Æ—¶Å\æ½/œ fÉÈ}=Úz^—ä¼¾;Ÿé¶+[JiÞY¦É­Å·o^²??70ÎäÛg½ôCÿqþú=®q*sÞ,‡Ó%îo}Znÿú›Êíôò¹˜Þú|¹´ÇüaÝ{{ü°v—ûïŸ÷žNñ`æ{áV‘‹ÕÓ—¢²=ö·÷‡þÒÞÜ,Ï‘¨Þ}}ûÍ\­x\"¶ç“Î¥ÌË¿j×þKô?zôÁýÍìøç;´ÿ.—˜”Eĺ®u®K9öl¡~>¯"ÔÎÏ8òý¯?üôôc§Âãq™}bÏ@ ÐÔ„™TÀEÐ¥Ä+Еq¸ÊB ©ôU»¦®8‡~Î  š˜ÃÂ#TóÂtðé|>LóÖúñîöå¼Ó­ÀÊ/¦WQ")b—A©ŽkÌHï¤ Ù&Mn´Ìâö>ö£ÑP‡þ‚LjBJzKMp.(2YŒh„ƒݯÌ(â?ví' $Z 2Á1­IÚ•vÆä?Á…}‘:ú I*Ð4ù8í!¡04({£à^K™ö­ …Æ Äèñj—xÝã¯÷íú+GùST׸šrÌg®‡?AB´3˜ñÊF›*Zk/Ú„†ýÒ†ŸÈh§Ù[K¡Ý[·”¯ ^Gk435PÈ”2•Ú«ÇYؼР¢¼Nö~‰A‡õê3Ű& ©iãáµZø° ’e ®±j–À•1™¼¸›Ï6m=¶ó9Îj{½;,s-7‡¹¸‹0|z9­ëë–½Ékí­;a`¡Á‘¢Ÿk—„dF* )ÍÍéÅ*:µÿ3É1€_¦ñ™}i¸zJÈÌ€~­< {“)F§&¯ù>$ÍŠÁF„Òõú'‹†4:sT¯æHÚÀç é!¾²w"¤Tw·ñ{&LVˆéɈNHDˆ"‡óÄà„(3ÈÐ9©­Qª²jUf×ñG± dFvÁépŒ™ðú4]‰¨ãy²AÅë<Ñ^G_÷btM Ò9Ñ‘¼"ä[‡°p‚Ðuªj`txy]oØZ?tí«ÉJ-¤ÿÌ¢ÍÝÅÑ8¥0È€…¤@— )³Lr3Ó÷º«&= »&jbe‰f2òóé‡mÛæ©ÜÝO‡ºT”ÙíþþXo&Sn:“¼)‚]E9ÏõbŸ+éÕ;a‡zœþæ~ß¶D.ÚÏÛ~+¦·[SÚ¶Å»÷Ëãi=LEܰ^¦½ >¸•§ç—£=ÄV½Î†žTt¥B~ Á½XM´‚ñÙ t9Y¬Lišf­íRj»q«„;8/ã63ÌS»6O5=½t…ÍËt›œ’Û)”.cȺ«³;UÜÛº»ð¼o}¾Ù=ÖKæbe>TØòÓù{ ¶Üò’Ÿ•eæyON‡ì_ý~]×B»]Þ¾¿۲Ňe[»9¼ô—OkæÍÃíÍóÇç•ýR]å”Ï/}²þÕþ÷…ýýoÿÎÿ¿/1#—{Xµˆˆ]f Gö———››ãáX¹LKG”Ìš†t¹ºlŒö‹²$£e2su7 ÞAíc g6Æ't×Õû¥SJh’– dÚØ‡hz5±¢˜äâýáffS}Þ×Z¦J38óOˆÔ’ŒFWމ,a\i­äð(#•ƒ«í™aÆ2D)0 ­¿º3ã ü«+CÙS{ɬ+Öž'á‚ÃÉd~õ>\UmÃ!3,IaeàÞ9¥c¢Ý{'’ ÂÝ+ÝÅ?UíðjÓ¡IJ²A²èÈP¦Ñdžˆï@šSæH“¤ávq­oZëæÿ=/”£Í=“ÀRK0‡-3[ßÖíôô|Þöm`Ùj“Ùd†¾Ñ,ÓÑlk MÍhþEéBÒ_ÍÌcð46›H£h1ž–A–… ¯Ä/‡@šÙð‡¼Ölð½@nì0`ÀøwˆÃ ^…:øT6döšKï€v¤™³µ5‰œÊd¥mù¸oÕÖÏêõXæÛ¥.þáá¶ßô­ÅÓóº­¢Åé²OËd•RHŠb¾òf¯<ŽëÃKšYkÍÒ~ñ÷dÜ´È/•±¾]ɨ’ô¡p*{õ~WíTD˜ÑݾÔƒ‚cä—Hä/Ÿfè* @"d‰)í9¬×0 )ãv”¸‚Ȥ’i7³PŽ9Ê4$dL#èÄ ú(Ì"úxeSƈp3“"˜ƒMn£»K’‰‘Fœù³í|FÔ!ŠXE’;úø#ÂÌ|¼FB÷k}ß”.0À¥¦’h½ÃŽ2ƨé»tM¸ch°ÞíÊ31‚"•H.’”}¬[YR„B“XDš2 Ý8T*I™†I‹¨âj@1¡+õØ¥fÜ/Ñ.ëÍtøÝOß­í<ëaaa=ÖÃÍR«éfö‡‡,ó cв£X‰Ö1bÃ%´õ¸óÚ;sÝ/çû¥Âò«»Å #Ûù™úl mÏxóö–õðù±±Ø¥G%Ü<`ÉÚCµNg/¥rê½gD†Er—ÜkJ>U”î“¥G$¥¤“P |FO×—î“ZÚùãy Ú¼8­”²+:ˆÖ"/{l݉Z,\ÛåÔ‘a=L=Ú%ûšÉÚ”Ù“­Ûâ³Xö-æ §§Ç5ó»ÏnæiñÛ¹úôõ·ßØìkkó×›éÛ7ózÞ\üúæ›ËÓÅiÕ}Ún23Ôµ¿||FÒQÿ ï–‰‡¥ÌõîrY×Öóeûï­±öú Ô®:ÍTr„ŒäÿÀöÇõ"9ä_}OƒW\“Ì2Ó½N7óe[÷fýåÐ |Þ¿z¿/Üv+·éLS–TÛJr÷Y¨c_pëbãVæ3´vÈfWº|™„¡ ³Œ ¨UŽq¦CÏ;BÔi:íÛr˜k/SÀ:`öÅ7Ž ×ïÐ, ^ÉÊTâRœ,Ns" ,LS)#÷dö"#•î~%dZ-cůµFß(¦ÉÌÂ$j®Éà´ -)ƒ2¯Šþ\A¤ÜÝkÉ~¥»6ŽÙ™D¿îS½àuEûùOf16ˆÞì˜C´³âÚ\ééÒl¤‘db¨…‡›•Iý3´·C‰Öګý‡ké™.L^ömsX­O"ÖŠ .Ûéñ÷ÞÕ”kï(5LÖ;DÖr<5l^j-~×e¹áôÀ#04 8Bfòõë[PÌŠ—:NŸƒaó efô°ŸGª ¦™ÅõñNˆ¨SÍ}Üÿ2A¿‹y ž+3]4¢|øj{6 …èÊ@ 4Rs”lÊœT –'`oyˆìq¹}¨_½9.Ëqoýí÷?|(93«ó¼ï{ä(¢ô3s¼ºÉ$ôˆ¨uB§âÏ÷?Ægû'BWSwÁA91Øá òµ÷–#_†Â„1¦Hú°Šgf¶!•fjûE ~®?ܽC™9ÓÚÞ ^¼"sˆ$žkAª”ÂÖçQGÒ¼ù‹íP—‰–f À,¡aJ1•9Ù€µ$CŽT§µRÚõ—RhBô£±ï}ë¨IFwôˆ×x‚4øñåñÆk‘ç,ÔÌ&KZ%_±³h†"ÔbmËR 94%–±¦J{ƒ©[l™,9r…ÆQ¡Öj1ìy>”¹×r¯ïÅœ²MîÊ’FænÀQiÌRl÷õÍË­5Z rDasXR)*ãš¼CS Ѳ·¤M}cyœ;“V‹Ô’\Í»´=ÛŽõ²nÜçðzÒÿ})k©s©‹nìv)ónªË‘Ë2Ý߇yYŽÛ>.°ã|“™ó\ÜRmÊÓó `†º¯DŸŸž·,Ú¹]Nkoº„>=¿`š>mjç½o1MG¡w ,r9§fjÙ·ï$ßû¥L%yÈ=âN‹S6’^·;Õ—’7ùà+*ìÅÓþi?÷½—¬¹ÊÙ–i2ÆÖÖ ë1ŽÈHíÝr>,{kæýé¼ KŠ'íKÝ‹ÖçörûöîqƒÊ¼÷Øqžd·Óý¾é÷?> ²ƒÉö­ãh)Ö:ÿøãÇwoï>Gf<×c9¾¹íœj?VLž~§Û¶>g¿t4ijÒËúïžÿzÕzü —èð5& ¡"F3&L”¬O“™Ó£9J½UñVJñN†Í´ž—b{,*£_Û3à7â°«–aöY§T˜³^¦Èº!·RöÖëák6%ŠÉ¼‡h;Ôét{I¡“1ÆÌŽ Û‹#JMi7Dïn1•RÍÌ"›»„$³æ´{O“'z0¼T$2€™Ó­{bÇB3’rp Ãâ‘®Ð&R°-e5#ÂéS¢UÑpm›ì2*ù:×ó'‘⎲H•Ör[æ9ˆž­ªÄ¶©”©­P°šO{ìrÒ‘ TFo€Õ:Çå G´y6¡¥šÇ|¢Ð‘™rü¡]·¨îÙ:hê0„9äf2z¶lèÀ*–½G¢¤0¯@ªcœÔÒ'6*ØÄd:ƒqÙ„ÔÉ×Kì]Õd\–7󎪪‰û8˜Õ(Ö ALâÔåÍ/’c…lBµ Í3¨p3€RîæÖa¤ÒЙ®ª,’É»y—"Ó[/‘¬XIYàÖÔ#éVßJ"“5Ó éÚó(*X ’‘:$g¤y –uå.0ÓŒöù1ÖSG>€Q{:í…±íëÒT¸t(œ,‘ŠfÑYǶhUn‘´±S@˜E…[w [‡¯“ÓH)œaeŠQ&S4- ue›Š/}ÛG¹œƒ`c#;™LòL)-̓›¶ˆL$q“uQG£ÅÉšÖ¼ÚŒŒè’“‘…¡â)g"úÔ ¹’áÈ93“®¢"*æ•°‰Cð‰0ÀÝc¯íAC:GºîX Æï5Ayo '|jÒ<ŒˆR÷RQ£¹XÒ¨¼Vy#hs (1eVÓ«Í‚­ ³R ¨W²€}0rë=¬x t7ŠX}J¨Q»° hÔMwxÁŽæ•L62ÁD€šv·Yš±(ßi6+` ¢¼Î4Ò$n£æ­óD ”kl”d5ºE$ s( Êdfh!:Ŷåp®^½7ºê*l§žŽÅhû)öÇíöf¾›qt=,*>Éf•r¹»ÝÞæãa‰àr¨"ú¶©“Xcy;ݮ떹–0Õûôùp<­õ²¶Ì|·…¤m¿?_":zÃù|Ní[Ãã˲§æ…Å›9Çãû§—Çt’*s鉳ÒÅI&K2‹y„G3¯³Ô3£]ùÛi‰£ö-—ã µÈ}‹.«Á87!L9•š–R˜;Îû ž*´'Zo™q'qΧõM³fûZq‰Î2}&J™.±F4#ÑÛR'ìeã¶YõûùÓÎçïŸk]íñlÕ|ö]íÝ׿*ŒÊy×KñãrCËRör·ßùý¿j›þÄû7^u¡Û¾6P¶äT7N†’]—Kxv“Nê*´ÎâÎbÈÝ=Øs¶ÃÀt&aµD4d¯^’êÑ§ÊØ7ôJdqZ&‰¾¯ÚÀË@.¼ô”‘{Û†;gÛ{WDZ÷´¹,¥ª÷çÉ5Šiï½ÌW§jØPuÚyÉe2òàµÈÐ"Ê8LÊŒ/Øõi"5º =23œ¥rL¯{·$¼”âtWÒ2²“‚[kÑö´\4d·„ètj2c‹Ì}RÆek±Ÿ{y¶ G‡%ÙÂdþ)»$£>v@oJÙM†Ô¶5¯å±¿xA™ËårÆÌéÚ –4MÓhûñ”X‚Åœ@ë}>3”ŠÑ –¤èÓÔ«»˜™›Ó-[‚!£ÉÝ¥hm_C%šx•(2¤ž=hÓtµ®Ì¥Ú.LuIĶ÷ÙËÀ„Ñ{—Ñ‹V^£C$)¢s8 G°ë8F^-ŒLƒÆÙ4F¼ ÑhP ¨UjÀÿi(’e75ƒ˜GºÃŠ,uaˆ¢®c\q¢,D…Wd¾“Ih¢ÆìCÀˆ—…iìs245f>-z›ŬŠ"d’x­À. ©Ü”£ä˜]Àä6’eðŠâÐf†HµØssó’3”ЬŒ’M¯ŽñÆÿFÞûôH’$Y~š¹{DfV÷üãò²à•'~ÿÃ=Kpº§ºª2#ÂÝLEäñ Õ½.Ávw4$2‰D¨«™‰Š¼÷{XœQ“RÏ·êÕšÀ=ј+]mËLU4ë–šëï%È Žãøñ~³›Á2pôlS‚ÑÆÃ…¦{ûòçjÂ’IrøÆ©¬Ùç°2̸{ïéÜ=4Dê8f fÖeKµRÐ `3?·á†Sln[œóܬûѽ5¨|Ìã~¿î» =ìœ-Yâ¬Ì¼¿½}ûö¥”±o0UÎ÷ǽþôïðŽŸOÝn·¾ßßyÝ8ÂÇ¿­¢øÿQýñ¼DïÈ£Ì3>ncûJZÓ(}¿yú2†ƒg?~>Þ ví×w&Hïðsœ2±Y5‡JGÎÇ}»^îu‚ŒªwX™$t¶P‡öÚº²4é ¶½š Ó •£¿kV˜(‹ˆnU0’glæ«zâÔæuŒäB,Ì.­erˆ ©O¨»Õ¶möP²æY³uÝ®#ºªˆ±zÌîAøÙŒói†*e¶Ú.ûu8ò| wRáFX鸘 ,ühcìØ6×qf.RB¼„1\Øçf¶Í»m¯¯zV?ÒÈo/7I××?4s"·-„(!>ßp$ãÈL3{‰°1ké,Œ±3Ý`ÇÙBôÚ|*‚ 2[ÖÊiî!eÖÙšµï»»ˆF4¾½¼¾ùvOb»]®è¤)©6 rÂÝ|óá"[N4–¢õža!³"S1³–§QO&3tX±2]éqäѲ6gx«™zk(0]MÙF2ݺzÐrwºÛÍüÉÀ…MÁ>ù+­·«*”æî´¢%X%«5D8€kå N>ºjEò8¬‰Ò’`ËMÒߪ•ºŸp¶“ZÏ)HÛ@¤ÔFÙ£Ç#e®µýÎy?Ï“T„ÉÙVgQMi—Ä‹=27ðq[ i3 K"!©–uY梞)ÐXÑö§»;ŒÝ}šDÖ•ˆBÑ|UÖ-­<îXŠ/w/U—J¥žÁ¸L/çs Ñ0¡ù$θoZ~êÖ0ÀàÀ¤–tf1Ù7! „µq¢óŒÁX@ÀŒN3̆@wkIV»?%î^g©åBÙ .¦,@¤ºUˆ•ÄÓb{°²Œm’¢¡é_š3[8Ù) ¥.ŠvT&ÙŽr™7ŒjUPYz˜ÊàhYó~šäpV“ÏRn%6º» Š-¦úwá”Ì$9·y³ÁE¡oö¬¹+—¶Ï9l˜É³ëìúþã/çýW g+¶ëcºE³{„.ùÁã~I=‡Å—˶¹:þô}À¾\/ÛÍy{yyëÂñA“c„¾ï»ÕV…ƒÖÛÅ~úÃ_¿Ž±³•ó,³ÑÝÜx¿ßçY·ýú믿ÞïÇýýaÚ3¿?òý}TZž…ô~½üùýçy<^_o^ä¬GZ6ÑØl0ÆSùS) QMó£FÎ-»³»c×ËÅÁ:æ” Ü\ºÌ+ã¨ù;îÄÅÏ£ù8wMÌðnêãqŽ÷më›ÑË>*ú­ŽGÕáþ"âýÐ^U5ýæ¶_¿W×<;Ϩ?þö}ÖÅÎØËlªÿ–ë¿Mýñy^ùw}Z¾ ÷%/þ«âRrÁk6—Âýq~¼ú}K׌Gïß©ÂÑ¿eݵ߾žòÉð‰q¾÷xËî|Û¦ï6%˜Ç `‹‘Þùã£2ãˆQw?d÷c1ç‹ ÌîÃÝïïdÛpž IDAT7šP¨ÉP¡ÊrŒoÊZ”+‚C“×’*ÝàJ×Õ6"\Ï9w¯ƒ2q¶Ü}Ø0¼°éÄS¹‘¶±kb˜TgÍïÓÝÊI“û%ó„;D¼'–c¸(yÒÌ8ì¨J÷Oqþ¡é‹¢gŠ®‚t”ÚÌ­R¿ £Åqž³ç¾¥Òh6„ LvóydfnÛåb‘€7ß‘¥ê ÷Ê–s4öõ¾øeRi8LC¶  áè,%Ý/ch¹ h!è(ÕYc×ËåÄ}lÚ ÿôº}sv[Ò¦Dv¯°Í‰î=|éu‡¬+Äáf*«é¤Sj7óáPÀ daÖRàDyÄ~¢‹š:6ÚU¾·—>8uã Còjdw¹¶Ü¤(Ùl,|¢á(ëú4}ŒvÈ$`…]Pٜتéª+ý¨žeøÍ/fê€<Ó$7+·2¤0Û e^ÞÍÓÝ@CZ­ÇÎ.¦¤Lj² Ũ”ÒÖ§¼è6Bn­òV€È¸…žÖmF7ë2!òÙñjÌQ8Al½9Ê6€%tA#I]«ÈrAG$T†6¼8"Ûº?FŠlZQÓ¬0R¢ ×1Ýä EÎŽ0Q¾ÑÜJjy?³y¯-Ü„F·¡ˆzÆÄ«$A.õ»8½±õ™h ¶×1„!a$€Þ-2{YgÒàÆEáèḯôÅpÕVèD™f./rú™]Y¹™Ì›X·Úé!x»µ»ûœ“n ưû<}œèÆ8 l^3j˜Uí ´uÍ×s`-Ÿ4ï=-Xóoìã’•6¢¤iŠ&i KN,…oµÌˆQ¥*†ò͟Ͱœrk·Ñ ºÅi>}¯èÎéšûÅ¿u'8}ã1Íá=³3ã8êQÉVSéyÙ"Ì$±æ®7ì>;,O;˜ß< ©yõzp%Ë#×ËíýìYóöíZ8ü´8õååúçù—s·ÄmÜÂe¯ÿáUÞÝçããÇyÌ:uÞ»gÇ|û8õ?~\çqñzø¨û[~;ßÇöÜèÛ¬s åÆ«´Æ5Ìß×Îïut9«·éC°ØÒöò2Æù6ú»G8(à /gfÖ‹Úîå}ý¶Ï<•5+n°ȱ=â>y¼^þ‘ïß/d¾â»Ÿ¶?Ø·­ëÅ.Ù3};®—ŸóãßôúþoÆ_ÿw)>°Îëù_¿«ìÿk2I(˜àÍâ>¸»Œ¸Ýb»l¾ Úu\!™YÄͶ—3.˜Õ}×—í²íþ²§Á—ÛVÒð¯+X4£š6˜³ÜåÑ®ƒN0ekÍ»Œé ãöz]˨¨^ò“¶fiù&œ÷»4Cqš›ÁÝèÏ9é_ׄt·u‚$ášTua„Dõï5ÚêÎê³kó ×tý,Yž€ç¬ä¿ l‹w/¥‘¿ K?£æžßœŸT1<ƒ!ÝëŸàÂz õ"5iõu(R±²NŸávQUáÛ¶mîçáà¢$€1ø7DTµ¢ˆUmh¶NÀ¨X-¹=€mÛ2sÎyœÕÝß¾ÞfP¿~ýòåÕïgýúã»eo•`îe ÿ¦µ8rN#ñ{¢±›‰\¸Ï'áêoÆÝýé¯xT, kL‚1HçÓ³RA‚CîNÃ"U­$\¿gÕrYjDösc&Ä3ÒŒ‹ÊMk‚­VyØ:3—„n3o¡3y‹U@ûúJÙchØç&AD4Ø+RµÔY »P­yžc7Çyl¢¹™ä€œ&CÕ,ÀÐZlùåØì…•_)ˆ«“ÿ¹í©«ªí¿ ÚÉžWg±,½x†ÝšÀe›£ñSöú9·ZñK<¹ªOúÖLÙ…•cbfa‹¢›†ZÎXÁÔ¾:¡h3'ÀÁZ®-`’LÈꦕ?ÁEœT™Ù°ráj‚TXj™Oóúóö\n=®°ÜnÝæÝJ¨ §…1ø„ JÁ~Žæ¸VÅHÜÂé• ¬AÒ2p¸Qr¸ÁB;[$De’ˆˆåØiž™¢e•Îòâç©I³G=¸ãr»èÑÿéñŸ/û¸îÛ>èÒœùåöÓ5n»#âíëoûqâzÝÖæÿíÇûíåK yxz=<æ=ËRÆðëõÛ×aœç£g’˜…‰Ëãq>îgeäÔy^sþá8æÌþ¿þåWXÉmv¼?ž¹’¥îI«°ýåöË/¿ô­än»Œíäfú¼È´_o?ÎÄ’¡´mÌ <¬’ažÛýþ~ûéËq<<ý|;vÙv¶ð·ËþëùÃx”¢Ý#Õ¾WÔËûãã<ÎG>’}{û¥þü·kžý¯¼ ÿÃ.é9ÚǧOO†Õy±¥†°• /¯Ã®ý:·8h%ìûè—@±S6On¾_wÚ<Ýïîm–éDK3ÌcŒ-ÉfzXU ”™6¨ÉA2»ŽE]Ô3¶MÇèî‰YªÖÓsè¨u'™ÀrÙ-/R´{¿ŠÞüAìî ô3äÞH´-«Åg›Ä%Œ¤Á†CêŰ’9ž·ór4ªÐfe{Ëf»³ŒˆXSG7›óÖJ†g@€ê³•öõБÖŸà¢,£éïû$;Çrÿ˜¨^æC˜ÈÝ̸¬¼4£ÓÃ2OS›ÐlÒIžgºéG<»½qYÀ ÒiOÊ:á‹ÅF * VwtF¯@÷¿Û> —²Ë¯o÷$¾¼^Õ2†þòø‡Ûîï÷Çûù0V£<gÕ¹Ö1ô¤‘¾jзºkúÒAp· †´6j‚Ìú¬åÆXý¨ü¾- ù’˜Ø¦€ƒ|®°Áˆt˜­™sM\Øàë&(= Ö2N7€4〈®DƒL´ÂVd£cUq‚ÖÍä$½Û häîaì Ë–¾‚ê!€à_Ý-ZKI˜DŒÞ†jøë-[g×åréùìÜÝ ­Jæ™3\f4o¨Ú…<¼›IêM¶É‚QÝZŸãç3)ýÜmC6 (“ñû9€wŽUiwŸ¾zÙŽr½øªä÷ÓJ 'Þ„…5àâÒâ,JÍÐ&Œ‚ [u-\9FmpÚií«Ýeå£q;q.£¬Ó©àÄÓSàîll)).Çlcs«V©› “ÌF÷'ô¾Ÿ UÔZŸjZ¬QÍÜÌGă9c•IRÝAƒ"ÚdOp»ÀÉP–­3˜Ï®¶Íä4Gx*ÇözÇ×/¬•×#jqÖ3ÝwÑáªj˜uf,@Œ­ìÝF?ÌtÒ+µ&†½ÉسT ¡ÚÐ3¥&Ë 1ÀQ3·èƒš®†Y+ª¯põQ+´œs5K›W!›%³ë—Ãóí1ÇD쯓|›Ì{zؾ¿þéý°yú4¶ð¿÷¸XlFËëæûð×—Ëma|ýr{½ùeý2H]ta´Ð‰£O·aÖf¤%õ¸ýüéeÝîÝ›sfÏÿíýé—³fuNôÄœõ˜õãú¿ŸùV=øüSÓláN×A¼ëo&¿Wo’²*c™KL"–ŸRQöÙ¹[š¿9¤ªZÒÁµV÷¢«ŸÈ5üõÇ[×Ñ2Òi+ L<óOÈw˜wi$x¶©]¨‹åJÏ[ÊÓ9Ý#.ûãñèÌ[ŒÕ³®n,Ç’tƒ+Ƶ`¦4I%Ôg{‚øì¯\¯×·CûõòãǪ¼î—afRl£Ïã:¶ë×ëŸþ5¥Z8¶æÒ%:m*M¾*°e³,Æ­ÉO•åÿKÿ£©3§ ñYEI*™÷àBpu¯\Ü"Òc‰/Ý…Æ|ý–«ìõÌe¢`°’@ÊPKU)ߨU<Ó‚dfPÏÎg;ÍFÎ¥•åy>¶§.+‰ºVN‰(Ùßö3æZ»¤ûùSÃüþxì×ÛeùñÛuÛ võL. :ѤÁâItÒì)›îªöø=H±ô’èZñ1®|Vv…–ÉLJxD.ôÅbØ ¸dDª ú=ŠY„&Tµž.ë´ãnÃ)'IÍÅiU&‡ ("Ñþ; X¨î^Ý/’b7m Ilò…a^Sò%?ÜR°ÈêÙ))IÝÐj„1`ZùäÖ݉%=V§Qµn™'§¨ÚzÎyÙ;³f/­X¥µ$ ‹TVpÎnà«_Ø:Ö- geµÈnÐh²D=:ÙñåË·ß~|ß¶=»—)Ö•ÙÝÍ`U²&q˜o¾Y‰ªB<¬7bH€­Dn§ÎRI_®f-u={D6Åa˜•Ýy¹nvˆ!¬Àd˜?w.âˆÃö?ûTõ0–åYÓ}ˆdØ„îÇÛ6¦q¸mJ\ü2+>îÍËø—_ÞÐÕõ—úöm_^Îáu¹à2:çÇ׿û»ëëkø6·ÛmØþöýý²]|ÛPe˜uÈ},ža7ÆÖ—×QÒ‘çÿüÇ?x\~ü˜çÛ›fžy<ºíËÛqüvÎÍ·Ç}þ‡—Ûã^þÓÏYد/î{Œ0bòœÈ•ðŠ-ë [˜¥£»2·ñâLÊe¶Å5Ž·:.ÄõbÓŠBæÖ4z\üb<î÷zýﺟVØÐÈüí×ÿ—ëßVÛòÅ –>ýR/©˜Pµš¼ý4›¤™™šÝ…à9ÿm#·†>*û· ÐADÃPm«*)º™;Ãæœ0vžÙ£÷/¯_¿ßßâê³Nò¸¶eÑ Ò”_nû)–}½^¶Aâôë8É”mt¡¶19'rªázGŸ‡¨Ë×MÀG[­žnÞØ¬Qgƒ6hÕ-þIžçÉO¤º¯¬–ÕGáâ¾8˜«*ôûùcDãs˜ò×~O} "$ ¼¥®òß“?“<°ÚZ¤‰ææÇÛÇ"ÚÇp«Ž-b{¹|¹Þþ”ßþùg^Ç ÷ò2oüzÅÓ}©2_¹¶°ª6:»Žsi_¬…®ª&7¨²í8é4úu7u4)•ò ‡Vb«u_`Ýlã2/|°š0 3ÍKÊjMŠœ°ñdöžª®döÅ·}†Õ£¥ªé€[U±ŒÝÃ,`§•è&ÊJ&ÈÃDeÖ\ŽGjlƒÛ̳ËõÀ¥LÝf½]Fe&¤„ÜÖ§wf…/›mgÛ’²Ê®9Ëâ%”ë›-C»2­!RÖ¬š§Èá~ž§Ñ"“«¥4gçò·òÛ)‹ÆÊ{ ÂQU7 †ÞY· `)5Ô¨–V¸ÿ*fjuV:˒ݪ†J*AŠÕYÚGU=]ùàrá˜_ XØÓò’u)Ÿ´\sz2UÞÃÜ@t™™gN<þ¶áLáRÜ"|XubYó[°¥ÌB‘i–276›±Zöò…4½zkÀÔÊ&Ú°‚œ²æÛ.É DQ±D©„ÀåÙž œ C„ó¨)up¼P;E•±Ó×èŒÁ Õ]-Ç£rfcøåͪYÀcÓ\¶1دs±¥FóðsNhƒ·ìd&Ýg‹ááìV'èͼžr>Ðy÷¾U‘mN{ ‚o­‚QnÛg;—UbR…aGXÄàÉ­÷óñøQö0±øã½²ÿ?Ñxõm‹½ª<ôÿáâ†Ë6ö¯/×ßÿþ_h ]nG®ÇÞ¦X™ÛcŒsŒˆ——ó|lô˸<Þ?,ç9%ñÈùq?iÛyèýûñ—_~û¸¿yN${üÓëíPéðI¶÷Íd|vtMkÙ°m¼îÈœQµÇ`!‘^îŒáQÃ’(“ÅâÿÎá\TÜÌPìGzlFzs>ePœýÆIšl„«Bž‡»ûÓ,o¸À ö*ëÚÝùTМ‰'êÐòEbI»Ÿò²ð JY¯Ö0 ³¦ù3IÆh¾ÒqÕgf€ * Š2зv¨j 2H.UŠ$¨·ÎS˜†¤@…Ì@& @XŒ€YÏóÆgHŠ>¼–¿ý9,`¸ÓVaÏXˆ¬Ê1Æu‹zLvFì*sE³Ò±ÌªœX„Âw_‚’ßÅO”çähUlÙ§ârŒqä<*ÃÆs «¿…RÔš…ËUý»ˆ×?…«ZâMš(Aæ9"2n·ÝǨ™Tñíuþ‡ãíÈGÒ­Áǧ$ÕÌŸ7Ú’á½vÅʆ¹É–$ÔÍà,µàYÕÆû™!ßÀ +&˜´L•R-€šÞO ÐÖÊVRciià‚ààæ.¨¡ì² ™›£axébWïckBû8r–xš i„Õ"FÂIæâ”;lк*i8‹í ÊUAn0Æh·r(ë éc¢ äÕýï·Ë—¯ŒËm(øë÷÷Ÿ}»?‚—¥ª]ïFmŸ…£Ü>¡!ñ˜'¥êêîÝ.ë?šjG;ëF®cí )i"a† À'KÊõmŸŒÿ§Ç—†nt«Tî¾F]ÝnEMª}M=KñížÙ4B«þXZ¦2“»7š&J'1Ö,Ì-Ü)òÄc= œì,}Û*ý_Í™‘ìÇù°X.]£ È%ß0<õ¸Ù(Zɵ ~è2Ö¬€7XàsÅR'½¨6ºà†rtµVh‹ÉªК\•D©iH€é¾¤ehû>&U ÄB:7o Cµª-ˆ¨ ³½å—ìu …ùDÂ8Õ/‡›±ˆ÷<ÚI—yïæ$P33IæWqIŸÊG ’GDöcqü×Ã$º²«ÉÐdæKŒåàËB2ú¸?¦Ü 9—w 5Âг{KenÌ‹ÿùŸ•Æùa÷{i`#þøõë]ú˜‡_oêc»Œ¦æœ+ƒ¤,Æ``vÛû#‹FŒ1oòì>’©±·ñß³þØûuÛýþžÓž·Ûvú½zjžX1(PgâúeÜ.ö…GS.ÿöòúæ?$ÕºëÝ#‚À–=Ô:«w$çO¶mvý~wÚã¾[Ü­6ï~Ý¿Qge"bÒLÁ{¿Ð¯>þðÏ}?vz Ô.6{6ÍkštÙv7:h¾Çû‚k#ǰõP·göÃUÎ>¼² ø®­ïO”WÛÛ$8ÀºÌ9÷U ãiº£H^,ÄXAï® ß²ëTÉÖN ·>Žcß^ªšÜÑ0ßœ½Æ¾²ˆTÍ©içn¤1uÁV³ÞÆDŠä&úŠ/£ñå½Í;,…„]„‰°ÓdÑ”ï„Í”Èv³†¹6wißôÈy¨î±5yµ±yC§æ#áÎ2·½•fNö’÷“Èî§ßgÃ`¾_X=çŒ1dvöôubT-¹º\fNMÛ-¢ztŒSð…¸hÙ~)®¾ˆ·,,Îó<¿\HZ©Ë6f¶&Ûh7ŒŠÑãˆâºÙTÓϳdúörENÍóÒÚÝóz^¿Íù^:Ñ/ç•Ü8ç\º>ã¹L7äâ³P€Š%‡Ëåi¹^šRƒ¶mC…êv²­±¬ÒÝïl´ºUU"7w§¦fÊ»™YA2«`^Õ’|Iyze›ÏÜÔ«S—¨6ðZ¬³t é$šÝk’%±»'d'Õn1¥üºÊL+ØÝ#ÂÀªz³ózÝKv<‹!;÷ÃÖð¦ýæ»§½ýx<>zDý¡¿Þ^¶¿{}}ûyôoã¬ñöña%<ŽŽÜê¬ó‚¸î_ò<„ÏßzÂb ,åJ"aï´jö¡°V¶õW}­TsŠÑ=e4¦ãÿ‡*ŠGÙÇ\Á¶ !³²6Í·³ÜLØš{(È´|˜ñÌ’¿fËû$eÞI »¦,r‚3»Ìƒ4‡«ýa0iËÞª{X±‡kj–µ»/n› èͼBµ|c¸C0´õ휉"m„9ûÀ Ç0-ô´Æ‚½Ší_x¢qÑk"Ü! ïÝ­3’ÿ°éÝì´ yå¬c:Íœ®§$è¢`n¥ è­&8D† XšµŸs€*/MSo¤4M°Ë\6ʶD÷ñ¢i4C ¯lFóiWð…JZÀ©HuiÁ骂z2š¶t“`3éPÁœmftšæC¨ªlƒÓÐíÕi˜ë𷚬³ŠÎê\^aBK£ø¤>}žÕ¨å±íp—‘ä0‡™˜P×zV Z]Ζ®ñ£Ò7<Ñ&èf •ra2W¢É1Æ?Üýâãår霫ëN‘-JÏ®P‹ðÂÌÊL+µ‚ö$¶P%¬V”K•3 z¸»:d&5{lcÛýxû˜Ç¤ºjär%³¯t½X¼qhå!ò²öD.<¥–ª—Ô8{RŸÌÎ~&W•Zb»ZÛ“Áº,OÂê·s±9w]•Nž«]T¿[nØ5Òp„yÊÄ2ö ¨^i¤+xÕ~ÏgdPT«+gD¬lÚr€V‰,Ô ÎÇãÌŒ´ºê¬Ü-̸ö@uÒâèSÃsþöÏÿ§‡.—˾_úö÷ÿôºUÕ¯¿éý˜çüQu¨úˆ=nÕ|?'pÂݶàX°l%ÚSé¼\´NœËßÓúkè`Köûj?Ùm¿#YjKRUµZËè»\aê` L3w7˜Q™ìk^f¤šsÕÃÇBuY“fCM÷^ ç suÇlV9,è¨ÕL`›Ø ‡–/9ÔlÞu”jZѧ¤âó‡þëCßüÓ²ŒœùœQ®N&”ªËQÖîafšÓl ^ÎÜúpÕöC+×¥§Þ¨ • Á¨õ[ùÚ{n\~.(|½iÈe4æ¾ÈͰ¹¤ÎÀ±Œê¾Åf€7ŒøØ¼yÖœ¸A¬û™‘£õÿMÛ»õH’äXšçU3wˆÌºôe€v˜ÿÿ‡öiÛ³Õ]3S’gÄ<*gXL=´½f 2ÜÜL”Bò|Ÿ ¾Ex g~mTI%* ³%•±ŒS¦&fõí–/\¿„•Úcª­µ?S0©ebzê§7¶»–×®€uSS­Bê¨H|vÞšŸÿò¯Ÿ~ú@³¯9EàÕþ¯_þ=šÔ¶;†âý°»ôöööúzUŸ¯×‹û¯¡yÙÇvó|\®»L·ã¦ÙÃüœÝÊÌA†Û¾7ÚfÙ¶9Å9çÜö×Ëëÿ²·Ûí¦ãè¸~ž÷_¾LókÝK»ãÅn{…¡qrTµí…¸’eg÷ß–ÿµ×ßWØ÷ïù€ ñéZJzãœÇ/_€†õöñôôð#½nѺÏBÛvæÑÄ*æq7V€Z]ÕäØ:ÈVw¯.1Ã^a«ªóéÎB®8ààj/ØpÒyÌÙ^ZíÇÖŠTà=g()ѵ٠ =–³BÚøp«Ue4⪡#è‹Sm?ÄÜØWçæ‡§Î€®ë¸ÏsæáÊ-FG­ùx‹½â.y†`ðî>Q <(#elªƒÞ¾Oi*ÞC=///+ï{‡´Å57ê©ö¡±ˆc€]á>^^$æ1«KÕ>¸`ExŒžø™78ÜÃŒÇã´æFFNtUþôöúÓKß¾}(2S*[ÆYIÒ#¼f«`jƒ†¤=)\¦vB¦Žâ kجtó•–ï>X’ ÂYè.±;ÌÝ×õµ$ jqrò²]þ0.ŒôïžF=Öí¹Ó 6AfÇ-AGû»,ñyÎê#|ÉGÐuW9X2™݉ncªlêº_cóÇãqy¹Î裰F'ÙT ¨6ÉZ~žyöÁ[þömºêâãϯÿüÓ‡ýõòµ_ûñÐãûñå?njŒqÉöB¿ô¤zk/H ¡×{ ´N‘~—D­kƒ RG:ɧÀ¹Ð1X«½l1Xi³Íí¹L"u’õ½-N0gyEb&¶OÏ÷º›ð1†ÃùÌÍì@Ÿsšaó-µšH o‘Âi*ªÈa¨¥äi)™íX4æè.§¡g¦üY]è‡kzÄÈ.IAÚÔ'TÔÞâòC9íÕleCÝ•YH¾¸²Ð©§Dï„ìÒ\íƒÄ¥rÈM€LÝ®­ÍQ+Þ—À¤=ËÄm}˜LNë&d6DoD“bÓmR ¹pMáÌÑ1ݾ°ýB6M¢º³5•y¢ÍK/·ÉJì<Ñç4÷Ø`qÕÕ¼ÕˆQöÒ”2fqÒØ2ä&™³O€‚=s2Â&¸»›B°a]©vÇQ¤b¸ÅKê‰Xì玂þüóËãxÈ7 otsŽ×mhLà4b™ó×;ê“#ãÑŸ~Ú^\–ç>ìÿðéb߯—¸„!¶ýbRí—íì’N¨¡aæë9‚÷ù?¾^3“5ÿ÷úéþõ6>}ÒËxäãç—ËõöùÁ_~ýÖCÇË<»0þòõöëý‘~¿×Öñ8^#N¨ãÿs)ÿÿ}ýó—ŒÌ&êüíì. ƒ€LÌÐ: #5¬§ÉÜzv§G¼]öÉïPdNT}ãØß¼‡Z^ÈÇEct^$ž4#S<9Ì¥­Bs[éÊÐD|Â-­Ÿ² uUƒmŽïk×¾o×*™]hóµè©å#( ¤î²n°ÞèB˜…¨r´‘“ª~ÇYâ3ù†„´²¶Ð‘g »÷ùj ¶Ò°i-´f3!:ÝÏÑ23ÑkFµ$XÆw7¨ÊÎ: ½šGÄ$Ô¤Øë Í Ý? dk¥`µ³ïÆr[ý?x5÷}7™·G[>nf”ÀµŸÐ#€ˆ‚`bhHeûaÆÆš²Ý2(«ÆæXëºK‘ût¡þmteÎì¸îÇQÜ̳k2× ßÌH'Îé y@Ùò'ZkUk¦ ,›ËÚôô.X)ޱk÷ûëõ²~Gë"Ëuÿxÿ ™$hffö°XË8½¦ [' Åê}©lt7£²&êqÜ®Ÿ>È8»¡ÓKŸ®/}Gæ‰'­C€ÚÈ€‘ À o ¼®˜*‰¬µ@±ò=ÓÖF+±mÛÚØ0³ªü}ÿcÝÝÛù^dÈÝNUgyü¿rò÷Ú]éjBímJ‘ iWeDŸ¬”÷rÀœ§ªß=8m´®it5{-Þ.y¢«æœ›GÍ4ãð€†6+„R™{ÏvÂÍÄ¥z¯ÌyÄÛ×oóË_þÇ+õÓ§}ûÃ6l~zÛõßLJÇ]ßnuÏälÓÚ |íøbÄ‚…¶ÔÏ7 (´Æ¦ng —8vmõ;óâoŽÙßõ?@£»»ëì|ÿt·ú¬RyLiÛ µŠ(°Í\]sV6/p`.n‹:À©öQkxs¬¸‡eceÊ–8 @ʈ„TWÍÕ…”ꂪ×:ÄïûÝÝY’D’2S†‚BÜ Î¥‰³btwµG6VA†ÍΙçRú•r¤‡°‹¦ûwÔMuC…vÐÞ WôꎠŸëtÒÚ§!EÀ  õÂæ˜ X‰R¸%Ib]ðõëá ‘ã¡b¶íÅ>L# ~(MزC ÷á‰{ªJÑs’ã,zÛ¾ÊRæ~ÙgÛ­ BvOJ¬}ßчˆÓz€UrakP‚ñ,kÏ<ÎÞƒA­S¢qÛ_ü<ÏÔÉÔðÕÒpSw·ÐÉan´‹íÂy¿ßЧ™ÇcŒ/Ç=[~Ü¿£Â}?«›þõû—ã¥Îö|üÛçÇ+û•ü0l{ùSìýþó_ºÏ±1"Я۸ tk=âaóÖ³0 TÖ% úòíp¶£v›ÛÐÜâú-ŸÿðóãvìûõæÇßî·³õÛÃ_o¯cWêëq|½?ýgö?\5;u”™9|ÎŽýíµwŸÃ›¢×pc8éò`øîóÁ뇜R̹ï;ІٽsD~’Û<v'^6]A ~÷y:­£SÖ[†Ã6w»;¥¼.œÒlš»¿>¬Í¾ ãÅí,:î÷›ï4—öjâ¡h 2»ÑéYÙ»Âêpe[-KtâÃNƒÖ¥b¼ç>£6ÆŠnö ÁcT÷¡%êÌ©!iÕ´9ܲªà½AU$/c«LHûðÈI²Ñ¹oÙRÑbt+(. dó1lCÒók„­a<:s÷Ý@¶ÌÞBºdòIøØV÷ý8HîÛ¶&üG·Q/1ŽCó8Uá ‰¯ßÎIkãé=ɰaðC‡k! bUû¶-nÛ !°e±Ý«\>ÊÈNœEsŒ™Õ,ÃÉŒÐÓ¬ÖjA߆õp (²Ë ­SUÖ{ØÖ2&7´W¯Q>‡è\㢵L‰6úˆ~Òšz…5Ì|í·Rh@°¢h¼\nçAîPÌÖ¹Ó*ÑÚKŒn Û1åí=‘“€­:ÀÆ£zØ#ì/9·ÿÈm¸ö}üüçK7>Ü÷Û¼Ýî½Ý±Ùu×sNYÉú@›e×ΦM©‘Ç€9œ…n»ÐZ?Ç#Qd›eãZƒÆfGÀr~:*9®ò5?œèÓ6psÄ8úÈ6»V†™6+'ºs vÓÍQ2³ ̲êºèpäÜF³={”ŸðÃCÝëø• #ÂÊ“0Z‹í²¢¡´Ï¢¼Óé°ÍRU\+Ñ%g4‡h©T;x-™«ßwöœÞfÉí²Ë[šÂìnµ;bÇ𠇕±à¶8Æ— —Ñ£ !•*ÂÊoÙUWk0Ø€©nV'¥'F¶«byUJv›Á óp¯­¯’R¯—ÊTݸNä¬-èà ÍÄ៦uÝ3ÃC­˜ÛÅÚ¬ä&õ7:¡—ªM>dL‡m3ö1óÎ&KªƬÖùyžË>u¹C»‘¹5ðòº{¸¯o?u÷ýøôóœsVþõ®?þaœïòÿ”úã÷¯u‘23þürî‘lA„k8¶k¼TUK÷Æõõµ¥³-¿§q¸ÅõÕVYƒ#Âñ܃šâÑ[²n[ZKÁ 3X¬¶Ü€š;DÀ/2#ì"$”ÁfûÆ uFj»FiV°öˆ6o÷ÒNïšUº…¯M‚`].Û8\R]šBÊ”5Í‘9b3(‘dÇW.¸‰vË3+_ö—›dBH–2hó ¨ZŽk®Ó6£‡ÁQFÛ·¨êõ•6X›¶Y 1âœU®ƒMRÅ‹È'Sè†`¹¤În¯Ãd$»+§ªy©*zÅE卵 È]Z)³/Z«Vw- <“û9ó‘»«kážøÎTþý0íú¹ ²”?0£ÝýÌàØ¦uk_vWZ› 뻚Jd¨æìÔƒ´4hÎÕ^'Ît €&ºúÇ8f5™«jÀÈ ¤¾À$ÑŠ õŠ6ëV¶ï/çy^÷ ¡®–T?z[»@˜UUfVÕÚQ73 Wõþúòöñão¿|Ç {_ÝäÒ öÔ¤àï›DfÖ«MÒÝ6Wøæù>’`‡Ë…]±ÑUh`XqfõQ‡ïN5”ƒfç&Xæ(öätÐÈfWaP£Ô•ˆ);Ži–$cwÝåv¬]`™äÁçïËAI³rÚ Mw¡ÌÍÌþèï5ÒÎçªA¢—nÂÍ! ³PRû‰f˜¯Ë9Éh¨JÄTnV¶:gqøö}Ö÷Ä/ÿýî|Œñ=^_/?ýéã?]ÿü_5ï_nß»Çqt>Nul²ÜÃ|:d›©9®µò(Q_Ïi|íýr=¿°]Šh‡M#{?‚èž0¸:ÌÖÒëVMØRpÒY•ÔN ºº³P`¸RûTþÐ"éÐÓF d±VnËZÜ’Æ“3Ø®¶ó&c97˜U¨$ï~oÉ6Hgëi4ÈL®µVtL£Ãx¨‚¦'ðÙ>#VäÂÇQ¤@D„ډؖ±ž1·2áE—(:pä ¬Ú\`L0õ6Øqn*Ì%ß·6&$žÃ)à¬z‡Ôé±5œ“Èù¡·+6œóÛHIÕ D;W"JÐYÕ@ªÍ`nrþ¢’ÔÄ»^¯£€Jƒ¥`R˺•³«íWã\šÃùH»wzõ†ËnE¦¡Év×¾X_ g;,&Qbæ%âêÌ™À(ç÷:¤(âfNzyаð ¥ÇÞFÖ£µ<ý:„Ýê¬iÖî³ë…0kk>±f~€V'Žy†l¿¼ê¯÷³ùiûíûôþö·ªmOûÅ:ÿáãÛnBþe½ì[üéõíÓÛµëÁýnGØ_û˜-ýæ/®Ý&» hw#ÑÔþS·Ê%ûƒÿé–gùjþö~½·K§ä hæ›Û>._1mÛºÁ%d¦Ú/e¤Y§nÛîÖ§ÈÖKPaÙ}Ê‘ûlØÙ¾—¢mQ-ùJ¨Ý„ll-Ðyˆgo)ž:sXã:q6'lÓi¢š6 HtQëÉ'¨„Y«÷iÖB÷N£YvæsÖ_t€œ,¶/-¤uà¹@¬ ƒ–ʤ!õb½ªé0T-¦¡†õyP¶ü'Ï¡ÍB…ûyô£gßõúúê¬?|üðéŸß²çöùۯ߿Ý::xéöRVp6rÜ,C›úÚÆ õ^ò¢ZŽ¢1€©ÓhÍ[D«æ´àe‰î[àÀ ÇúIÀs-®ªG·5Õ²Ú†ÏlBcÓ2Ù-Òëd ß<º¸f‹kó†’´XÉÐhŒö›Ý,G9Ð@rßñ³d‹08½_„Õÿ¨6÷& M3­Å Þë5F¯)IÑXUª°u¦[‚Ù Èêi ÊÁ¶Ê*çS€@ÁJW ší%÷Z½×ÑÂQIt\®Šìs&d`(á£6´E1ÎÙîq¹nëzœÝ-B꽸Ùh!è†ZÕoÍe΂‹™ój€yÓx¶M¦MƒàË“¥fÏJ+Àáó8»Û¨ XuiÖ̱y)½¼Otž=}³bnÚ§ºˆ"¶±ôã`â`ÜĈoy~D¼%Ìø¸@à Ýz2øèiî÷Ù`º¹æEk&íû°’K3 3j*;Ú\§™ÝžÑ­yW) wèòé§ûñ¨óDßt¼ìDwß>o~¹äo/±½¾lûÛÅô’÷š—ö«±ošåyÙFD ïmx‡Qƒ¶³IMêAûaQø_|ý}õ‡\¼€ègWx„†a7è×­÷í—ó@,ÕIæËíë1Æeóã’ŒoG ÄoO´õ-5¶°ªß u?‰ÃøµgQ€™zyýøýþ-y~œû¥Âá§[Zž¦Ï>¼šÀ¶GeGÝ{ì›Û•ÉNŽ{¶=1Žº6ÒÀh3ŸOíFžUæ¶ì 6Ü7©¾b g ·Ê’Fù—H(÷G¹; ˆó“Ð-‚Õ `œÚcÀˆLß6&z<È£}x›‰œjw7õn]5(Îï˜ê!˜šV÷¡6Cû¹;¦Ì1Ç00­’fX r˜Ë²ºh"e°µ Ö\ßpxAÈŽˆz<à¶o»Ä¦=TJQD`¢m’›pÍž¦4(ì%6´$¶Xá UæŒm­‰:çC’=M^Q‹ôݪZ+±”Ùw#Í‚a9{RagCYôÛݾ7en#–·ŒÎ½+Ú0Œ4Ðά‘«iaád“mnô† .& qÙë)‹£³+½ôͳw¶Çc¢°{œ¬Õ;1ý *²»·dáÉEº–ªFÎF s²á?™ôǿ߳ÒÜ‘Dûr º.Æ6Á&;EiáÔK»Ã+ËÀv^ð8,¿$.fe1½NånÕZ*8_7Êç[ïjÃ÷lCÜÀ¶ÖÞÉðÓtÒ{øÞt0Ä3g9§óp:ÌPp£Ô뮩RU•Ê ³KìÍ®) s™©Z‚ °f iÎióð¹áSÞæ¦®Ï¡ (Dk Í v2ø¶V¤©¦4¬»§¼0˜!øòýøíë96~þv|úôáã‡ëŸ~¶?~z9ŽÇí7ܿόqœƒÐ>Âú—y¾sÂíMs8÷û¥N¤F½„yÕ¨h4žÝR$–?ÙÕÙ%pìÙZ&e¬,tblQªÉ[‹‚;x‘e•m>û<ê¼ú¥•^ºzTuõIó¡¢ÙÙ훯:ÂX_Øü°¹y†0¡©j{gºÑgwºyÌy> 6AÉcúÛëÏ/¸gö¸ŽÇý±]®î®œxÜ#ꌰ„}>RÒÏörNûëýxäír¹H÷×ËÖóþyßÇÛ«ïãq½\ŽãöÓnÈ“á>¼ U5Í, §mpž­Ó//ÿ‰õ‡õ‹P5Ø/½½nûP™öoc²&'.;qtòÍ7åÉbªûÔñøåm\a3¯ÊrYܦŒ¼õô§Œ¬q›HoqJCÓý¸¾]Gå¬>äç/Œ¼ØKµnJ£hPØFÚ’0Ö¬=0RÑßv߆;6v£ª+óÒ±qt`nøŠìKá¹”˜mC¬‹#ÌÝ¿ÿîڥdÐf°î„l;µÉ†´Ç¨ª(\¸Ãº´âf:tºoH p³‹mfA›4»#ºN°¦}?cÛí²!âK=¦G [aàG&S’žä̵+!¹»:.ÓAZl…z’EÔEÑëò¹HÚÞ ‰–ÔÀ´Æù%ÍótÐs%²LATÕˆÀL6mÄgÎv›è Ùº V Ä<ÊÝ1ýÌÃh•±A„i¤Î^Ú»Zmy™øcK“št33U²g€5¡’"â<ç‘sø6Âç<Íä1ffž'ÝÞÝ2TµÓÌ,—þ 0‚*v*'¶m÷ÊS0ð}Ü! ŠJõÌêJÐÜ©N°šBüÐè4huS?ðeóH7· e2X±åÿüç?~»Ÿ¿|=Î47f ÃLÀ©¿¯Å‰…£D¯á€©é¶â i@-0–Ñ2³,ËJ5–ÈÆ‚\ÂXÉ 5ZTõ G>â ‘JRIÖX·ðÅi² ” JÔæ‘™Xí϶+F+³ÇpïêvUuu»oO|—Ц­Ï.Ùòãñm‹KÖ9†¯ýkÈkÙjW×'ËdC4È (9è`7‹Ï‰PÕÓ,ß¿~ým¸mÁ}‹?î/?ÿÓG"nür{üòë×oß¾HC ÅN¥š´6?>ž9Õ“P´vKÒzV¶È6@µ~ëÉZá[­”øæH‰f„Ë)õÓÖHK™ ϯQÊÛ<‡UÖÍÌ~Ÿ`Š?MzË W¦Ã4 $ 67“ú¶.3˜y4£9’EÞw;ªhì÷”“‰ÞÐÒ!¯‰lc¡ÈH69Ñ1âHÍó`¾æ˜Z(çê µdW§9áhóG¶™¶·ò¨“[°oc1s48I©;…®2ó!Þ‡ÉÔháÈØ,3ﻌáëGoy€žÇÊÅÖ ˆlÞ¸=hwŸI†Ú­¬€ð0uˆ &t·žäÑòp¡KÜd¦h®ÎÊÞ†Ö3ëµw˜¡ìÖånæÕÑ–Cí^6¿ÕcÃØ{Ôq\z˪ÌÏõv¤÷¼°=·p‡a[S`)cüæš³®#ö‚eÇÌÚ¼ÍY‡¬Ü/¡GøprO„ìRÔi'ÓËÜ(•Ó·Øq?ÎS×í§|<^ͯá÷|ŒÁ¿Î"Kâ IDATl§)jÖÈsšù•ßÛ¼9~ª‚øz¿íôó¯¿AÀZî®j¾ÔO?¸Žà_>|½ X„}ŒÞÜ„r»¸_"uÿ»*Š¿¯þˆÁbìo—“‰ç·CçÔiÐÆýå…õpnòð—1Œ¥Ìo_N*¼Óââ,ë4Ãi™ÍdtcȬªmÜêQf”>ªEx©Ôµ^)@!D©w“[£D eê0·ð‚°‰Ý#«Ê*UG쳩>ÍYô$&Öƒ³„°©9ˆdùˆÅ|œb/Ö°1Ì€1uF àôä…ãÙˆ™+Ä׎9áæþ¤(ÀPHôéœÝÑ µÛ:ÊÇ¥ÍjªrF…É(ªP|ŽY´€Ñòß×xÏ÷_x©žšé—­Äj&¬çÓÅóãe24 \o’Ëøm¾ÍZ.âIŠÝžù„œžÍ±ÙVÙ%ÑæÏ<„ënÂ÷6ÃCò~êǪׅÕ@²õW1bûýìX¦S”sv­§þV\ÀHàYz&:Hw‡ŒMÖ"]óù%''yÓ¤ÞŸ]Iܾä[lMO#Ú\Ùý8N†ûÚòøÛ®a°ñ7õ!sQübó¡l§•o×ý§ëùïÿú?NÕ™GBfm’ËÞÑðkD.ŠÃbÜ­1鿢º]FVµéÞýŸh˜‰XQÙ5p3´! LÐikú©£ ZqÕ‚7°lyÄUeÿ`b »g×êb…¡ â€SìÅ Aó ÿ§Bþpô‘²gÔ)Œ‹>Ùa¶ù€£{=f»ñ'žr¾'D»á\èXn  Jõ45}gÁXlZ 6Z0Øn‹‚ÊІv¼<ÇЙ áù9¢Ô>Vƒ&ÄáÀ²­Úšš\>PìKžì-?èéM{NÏ7ÝnäXZ>44Ãqâ˜38¦-ËÚ]­"¼;Í"s6pÔɦ™ Xô‚eÙ‰LhÆ {ÑP`Ãä¡Éáy¦ÁÖt®±æÊáÆpUŸn {bl¿=¾þt}ç#•â‚ÄÕú„Zx NÛ|ØÎªÙ \AÜô8ÊÆÊÎYžÑÝCþåëç——û—ûôëëë?\?…8ÖÊç®qñË˦ÿ%¶Éð—·Ò„}£¦CZê̾ n:©` XG½½]çã~Eí¶ AC'œsóÊ LÛC{u¡}Ž˜óx}ýX¦ïy€ã”y»ùðD4»¢ˆ­‹E¡›ãZ¶åš"£÷ìÛÕ:•n@ôlšOÃ!uæ”fár‰ã8ä‚IªVKk3ÓKÖÇý‹n¥áCvf´m„àKí¥FǪmNt ¨™[DžÉjìךrÂcƒ¦-Ž“[Óë¯â­íÌYÞZ›€ïLj~WhÉf Öp:†• UuV¿`m)?±ž±ö®Xq‡QõŒÂÌ2û™ÅeRfº 9ÓÌ­eÙl¸‰$R¹þy[ls͇Ç=#¼ŸàŠU‚¬)¡ˆÕ@}.ƒ,á'D3[íª r‘°Wª¶»ëL£÷KŠptótwÏ®µÒ(ÁžýYøø*Õmº8¼'Êf ø’´.zÁ9}íÆva±“h„0iýäw5~ßÿ#ì}™ÔB8 ¸H„™7Õèü¯ÿü_~ýúåßoŸgŸ†’]tñÙø ’,EÃú¹lR2j¡eMFôZ–ÁsRßÏ}§Fw%=íhX £ð~w4R ¡ :ËS‘j"¯……D[ØusÒ-«"b¡¤ Þ3²ë¬›Ï*‘®öˆ0»çÉwH=KN!d)Ì9___2ór¹¬ž à@®–¤ƒ« `²*”Ip.nÛ»ã·ñ4Œ”ÀãµÜF¸Œ‹Á2³jÿë¿=À¯¯oÛ§Oãõm\6üÿí§ûíãý{ÿõß¿®‚ÔEºš¦Ï·¿îŽ%O~ÆG­Q̼*Ù‹ç=éy’¸ÀÐ’ÿXrRèîÇãh‡gµ¨ˆxÿËñ##-¢ØëíÚê¼üü6‘ÿþï¿þb²®×ýõ%®;lãùoŸÿ¾ŠâïúÓlj˰Çý–8ÎÛ±ø}û®±!||–.à{{ëG“}¹øíœ9/ÍöÜÜ&¶ƒvJÑu #÷}x!Ý.[öuäÌÇñh¾R¿žŸ ¼tÀ¶o—–5GDŒq5/Üè<±[t ÐÆåeºJÙN÷u'ºì£ùe÷»ÍgÆæS#›Q1X´ÊÞíÒ¾[/6¼ÝàÙ….`šÈü,3]̦SÝ}KyÇþ8]ñÖÙ3ÛÏÓû6úmE– ª{ c(g¨'¤ˆ:{ïØÛîfg‹DІӫ‘#&1Áåêz¼^èù¤sšîêj+©½IÍ–ÛÌÊl\ãÁloE¹ašDZiQ`´¼A)³»>\½¢ÊV“QœMB k³bûd(yû‰–?뉞IŽæ”5á’nfcŸ½ dòÛ¬sszW­]¿t—ï+òá&ÀA£eÌôgUuÂ-@ƒÕäìØlì´mhÎʈqê0ôR|©KX=Åp lÈJ¤éðaœê£',ÔļŸïm“ÜÆ.úªœßú4ÛºÛ`ÈuÑÝÁ ÔC˜ÌÊÁûíËuß=º×úÔ¼¼Å?ì¿ß÷óŽ4ʺ«©¶ jÔX‰žV»ËQ•å‚ÓÐCæ·óÔ&±Ý† Xj:šqGkï”Õ³´òGJX€Ü)+βeXsÓìAËöl$‡ºË,"ñçfCKøMrzÈÅH#/¡¶`½ÞA°ª•eÝáßÕª4ûfDV¶4yDiÃÝ´@÷ªïf\[—¼qΧ‹_#üÿÿú‡o¼ÅüOœ?ªë±Dúülm¹ë±òûœ|OÙª+ëÇ»ßÞn÷¯¼ä´`¹uKë4¼ ƒƒb.-û@c6oÃÕ—PKÅ_DË[ð‘é6jŽ"xåiÃ9ãìÒA*̯çãF„٠ٵèfsÌ<Í`o8(ŠžK”Ý9Œ|z–骇û„U»­‰§*M5IÅ®²ïm¤tƒ­ï«œÃÞ+•Õ”ñ¬Dõ whM\kV;É!ª‘] ¤³Ä.9÷Œžç»©–@a!tFl"S#Ìûöx5p gäˈ¡eް½ñ‡Wq­6w˜­¬K1à uåW6ÍÉ"€2t·°é¼;7õZ¼²šêªËÌÜ}U®Gúˆ¿üϾͺ͉¾Ò®dÑù¤[ì›kl|AèaÐÌÌ.ãÎîîLÉÚ£ÓŽz9­`ö»ð˜­‚ºÚÍ ]UÞ´ŠéþÌË6š@gƒ¨BÁ7*GhÙi>Æ PW“Q@lUŠÄ0Us<÷ÂEˆˆ-hcÚ¸£"…Ö•>ÇÌnd™ù€8ºÓ­§2”pÅ®ÝD &IfÝ]À&C¢ŒI2Ó ý3t[ê†w‘°r”Y%…BɺAcdÓh-–:iœ>ë‚ØÐ‘‚¤iSª³hR[ö06P茫К#ì’ŠH5³zÚ¿䈅­h»®6‹inQ²vÖÚ½ŒÕ..Ü›)„ÉZ”u6K1üxÿÌ熸 a­0 ³ŠjW{’쎬ñU%7lc—="úëÜ¡ Zì ¹cz Ù^UsZuóûºú÷¹'èŸ wp#F¥€2<\_¬²pô\ç¯óŽÊN©Yièò›¢I°Àk‘=Â|Ì×0ÙÕäà­ì•QØA3>F÷žyòæo!ÿêffC=V~ûøòë?µ. x®¾“fá(ó[ܘ]i²dpµ5CŠTXP5̰ÔÃE¡vT0{fèBËAzk¹xù+ºÛ<ò¹"ÆoÂÝê:‰ž-3N¨}å,9‚Ü7HiW’‚³ „‰{;}µ7J³¬rYТíT),¡R‹® KºÈ—YŒC-×kÉ@Û@M Éª"‹l¡i¤Ú®Bvº‚Pö’%Ü:¬Q­•n]¾µ'‘Hm Ô Qâ¶n3!ˆWÿ­{3)õ²Ö¿¾ü/§ Š*WS•E¡†Åª+à4ëÍ%V[!qØÏ+Õ‚ÖÝ•0# 舰û´*±8|°0&Õ(yÜî³ý£_Û–Ô„Œ™Ø@š[[£4Ìù3úº®tÛ¥ðÑàvôNî]î0Z9_d‘Ý´ÞÚÝÌ®«µtNi† Õ½ øå—û¯÷÷ëÑ?þö%9@Ȫ{+å6»ÐÈÆÙÝlR9h„뼺k-adUERýúœøJ?ïÕÇÞ+¨'H©³¼ó%²=}º¥iä6Þ á¦Ôþ ¼¸ÃLÎê–Ü¿ï€:÷n(smÁÞüwŒÉëµ²ûBÀJZfEȰ#ûéFrU‰h¨Ÿ*W»sCVµh‘¬mVµÿ¥ÇêÚÕÆ¯s…SBfZxªŸÏG·SëóZµ¦¥¶ð_’ ‚ÙfÁá÷eÐ-ã0nD8a0sŸ‰j“PÑqq·|ìo%öqb©-L­}e¸F­ ó–Üäj mŽjHa m¿'£Ï†é«êºêÁ\Õ"ChÉZ©}W¥uw·6d¢ SíÜF„¤ÊîѤu Ö]1hFua&ó„ V5ÃLgЃ†–Á¬ ƒÓÇöLíÍØ+d}™·™ %¯ÌÝÖZ¯ªE®ê†õu„¼JfQ­®~î—ÃhîèN6÷ ­;±‹ëä ïDr‚I$4~^fÿxá%U]¡ýX¥µÄþb2àhÑN/çðqs7³µVw‡Y†\~æªl(¢¡É… \YÉm¼§ÉT{Ï\eõ¼1hÞ=G°öÉD=L';¹ja–á*nCž×zº{gÉÔçu?nÏT¿p!ú™Æ¢•! ’\ô¶Yvçmžëv ÉZö(|.nFUUÄ ç¹Q’08˜-7ôó£µ-‚c8¤•߯\+»{Uv.o3ü±zÑs©«ð‡oëQýñÏMÿÔO§ i꺖µß,™ž÷q{³ãø@sxw;tóµ!–½ÙÑ×u×1_¥z×ÔçÇ»Ý/ò1Æ×ªoøöÆ_F¿¡ÿG]ËÉz²~^¿Þ|­r?¾Åa÷ÖóQMi¶Ý.øfxçÛº­'ê6øGñÇ}èm¼}öu²0¢\0óÌóëywNÙu2i×.™QòæþÍèÈ”}]¹Ž>&L†*ƒ áÖšâ—’Þ$ÀÕÜyýrM™½p3!©ŒÈ#» ä°žøzžï6Àž*5¡Ü!¼ºrÑD¯îÝ‚²…vÐì€.a•âÖiÁ¨ õj¬ŠÌÝ ßTK—ãù•¸âðˆÈÏ’8ÊtZÛ+-[·q+1™¥ËòOê:bö«i®ÂÜá&áñu¿gõënÓþžc­"i»¼)1PµIn††—Nø%q• ¸ ¡È š”)Åœ¨ªbÈ=+gÁ^Õa—ޱùb ü¤ìÅ>iê¼Ò ·î&èаsrŒñýû÷ü<ïc|õMç°#OÏDë`‡ÓS “eÕÍQ10Ü%“D%ƒf x¬Ô°tÕ›‹†XÔ¢áÙ$æÆʪKr› ð¬Œt03S_ŽeëtîR+s [ëÚÉ”ÓzÃô\“æ]ràe;´z\Ca½:£¨ Yi ënïòíu&zÊÔ Tn¥ÇÆ—…A9h†fÈ@÷ö…Šê®dõóÃwúÊÉCÞäs?~$‡µàt5²»ÑK‚1Ì'©UéL¨]é2idϲÀ€‹¶rÝb3n9S’ºÕ°ŸN¦êÕPTm´&kä˜ìõ”ãhÅy]7ÊbË„ÅaëZj ¾Õ<ÚB\®/Ëu–]¡tªMʽG¥LO³¼gGÛCèÎxMB]¨vô±{M¶G›üóqFê~¹u¨6:7² Êoó|>âg_Ã&±ÛºC2$ m,›/ãZÌYwÏ >̱˜ËgñFiÈ¥ªãîOe;¦Me¥õ*”MrvGûw£ÁE€¡Î'ˆò?æú4TÙ³iéÚÇá ,´V ç÷z^w˜ É.öeDÞÚòs\$o´Û²Z-»Q×ÏÎg“¢CsÎZ}žUŒËHõ¯ëZ΋å·Éîh¡:î^%d›ûàxæR*‚ƒ}ÐéÖÝÕèÆûuä°Su¡ïî·&…gÖß®îo)·¦ù|äÙæ µÕ6W3~ûž1nV!SÓ–á³Gœ•lÞæ[_‹­R±á¸˜ó9r½ÿr%TÞŽ7W›¼ñí/ìšu£Å¥£gÍ6ûæ(WYÙyUc>PÁ7ùVo< _ëþ\‡0ÜŸwÿKŸ7ïyûOœ? "e4ú8ÞßÎN?sœ8Õr½ëK½ðv¼?cÌWžsöÇùñ6ì\ë³ßAÜ‘¬6) ß¾}=s ÐóªóÇYooo«2ƈ&®¾]³ÓÓØÕ¥£u»‘Ïþú¬qf1M5ì2E, =Ö-?GÕaöݯøåžKçµddºyå€P+Y&TäŒ1äþYUÅiœjŒ½NXûÀŸ­êñ©+îfÆí&Z«ûR`º»1+èìË4†{Hõ#Â1QQ6†ËÅÊLŠÖá2 kW‹1ÛHÞ‚‘²uunÑaó‚¶d ˜{®Ô¾8¶ÙQºÒÌP­+ÃÝÌÀñ3ì תìŽOÊ -U6``QàušÙohçYÝó…9ên¨Z½­[YJ¬µãeíE´¹Ýê9çŒhäZ œ{‘ªufõ$‡ÌeÌ‚²v43œe&3‘*]]¾'üë¼Å}I²…/¿XÃjJEóMæpÂø²ñÚv×}7$Œ1×ß=þá«Ñe»&•ÅvìÐe ¹ÉØUÙmÒv\¯b¼×¨›äóù|<>ß¿Ý7µÌ«L"ý×o÷·÷Û×××ßþú=V—аóµ?î¶úQsæ œtÄzúù¿©þêEŸ‰nU2Y¡6¤ÚáldP’ ^z[8JÕ¨H½Ž¼&’b¯ò­¥¼ˆXRa3öi›Š}SV ›sJ;Víi¹[‹”0Þìüí ‰ÐÊ*\o>¶ayQ@µT¥óZl.•Ù#b/4õm¾ÏöjŸ#¿ÿð†“O£ÍFÕ¥Êк¹@4œë¯1ü{]óÛý+Ï ïÉC;v™Ñt¶žëò¸%%¿Î^‚_™3¬«¢Ÿ§ÌÆ TÏ–—lýsÅ?Ù?÷§ã|®\9y_cÜÿøçr_gt÷¸·1Й« õ<ï´q¡ë6‘§åÇý˜0"{™‚7Ø”¦Y«HXʞ罫²V;‡+Y9ï÷Kõy^ëÒ}þQu² 6$+çå`[ãëë9ߦKYý¼Î(¨}ŸÕØeô˜n{Uêaò£¤ÕO©bgñ°…Î lÔ« 7ŸëÅÑhÎÙo¡I‰,eu]ÏÕ1Æ<šÝ`½|t_0YÛ\fíçõHVKMÜbxÃAµrÕ®N‰1Ðrøe½Ë=½!Sq÷~ŪdÑ_Œ ”ñe›pk£ñ†~ óp÷pì:6~ZÝEY%ÕççyÜn[Yµª÷Foc㎲‚"/ ; ðý§™a_\T3ûîoªÚ ‚ýÚ©Ë&ùþþ@U—vG™@Í“hu‹¥vÛ ¨°Mó%-õA‘Ú½Þ|I&òÜ@Ç—Ù?±­&’„ˆµV‚´Cînuºjƒ6x›ÅҋŇpÓbXÉ×ÿFþµ]Y¦x>¿®ëz>Ÿß¾½Ým7újÕr···û8Æ÷ßðããy’¢ÂZÜ€†&š]Úݼ¿ç”ð¡ ÃZ&d&«ZÃíUÙ…6Á@'›XTIáîÅ ­J‚Í–HYCNÒh´@å~OæßMF rG©w 7øÏï»êc—% vŠ,‡^¼߉l.UBíŽÊWðu[#Dtn‚ŠÜ×ÀëƒÛ¸ë7#ØŽoýœ?h{ æ bþ€UeD.îÀÄvS²—•Aû׃vO,Šs´ÎÝ"[u²^i.{µ['N@ r¸¡\&¾")Ý>¡øÙQ°¯LSccF^5×0cÝû™ŠRïš{š¸5PªØ¹WEcKaàÆ9$Ò·ûª½™ºíjˆÖހɈèuî–WuÛÔåâE5•-@£µW•d‹DftàX"ëE¯Q”œEË3'âëy)¢ Õ0º™Ü9dÜ;L|Âჰá9i&õU.3›þ®¯KLáB£åj„ÌLáW_¥¾:È–cHŠÂ¢u©ÚÝ 78UzøÐpT'Á RHz…9M‡t@2K…IÌÍûA¹Î~f_•Ó3÷¹½Òb”áI-êýÛÁ¾4 IDAT/õ,oãê´÷2IÉ.¯u¯¬9gkÁT-4%êye&‚Xçmø0 é{5*ÂÅ.c³­³Ñ)¥ÚFŒ˜sÎÊ;$Ë“Èîn:ä1«kU“Ek‹à+/¶švÑØÎÇs¡•*¿ý¤!P/³‡†Ü& 7˜ÈŽÓ A ÛºéîïøýÉê#àÆJ>woEÝbBY˜C{«¯vs@èŽf6®¼ˆæÆmì„€ÞÏø^kŸ˜ùz HÛ@a/zÔþoé”13Ýifµ€M·Ø¹8Ð]j*ÉJ½TV´V>Ÿ÷ã†Ôûíþ\×+§¢rï_€ÍMLÓ 󤀃mÛ¹I`Œ1ÄßY:ÝÝkÙœR“î c÷Æ}­zy[›¢ñûdð»þ)3»ëv»ÑôùùùãÇ·_~‘a™WÑÞßî÷ø3øÛ_{ïÒcµdÖFËÔ½þÃß²kÕÔhíö㆙*`iºz«» `ä‚.“¡–qÚý!Ú” R&À´ Ö{’ØsmÛ‘¼ L²¶þ±ÖöØàµÊ'zû„ª§¸2³µKe¬5 xY³eBûfßl¡në¯þB£s÷rì)’Òy6øALÕ¬Fìäßè{ÙаWù&kiU«4£1;¦ "²µYoTAMóí$Î=AQ©#h´Z;jåA+ȺMpªG‘äÅ^lu³"¯d¸™KŠð­ l3YiËNæ´âg¥‘ªáæ“vË¢PÂy^¢P­67#¤ZIÀ õBÿˆÙ·.Zóc^eàh39Ûœ n£Æè¢C£eD›i÷£“å<¡„zoqë¯Òz /~÷®W+{í z7e.hÍ^j?ÊûŒB×ÒÙ®aÏ,äu]o.o GÔy4Ü=ÿl­îúyÇû¿|ýsóÇmÍÛ¯¿®ðxÿöùý|»½c¾Ïrx_VýͬËåwüê›ßþ¨°cŒçùÑvJl+‹ôö9Âÿ¼ž¿z|öúDçô]¿ „uQºÂlNTªÚU°+Ÿ 7£™â×¾º’‘'Þæ1`B}¼}>é×ù¼Ù0ŠäÛtXYX—­ÍÀ$ùèkÇý6äs!—MÎáZÏK!y¸Xî_Üj¢Ó®ÇuMŸ›%ÃI­×Í6àN+©Rݘo “X–«·WV wBݹ®ê¼˜¹µ7É ÒÅï¨5kÂ\* Âý98v¾¼áZÀ©~¿"‹ô°Üòxž-§¡whÃ\$­!Ë6g!ž÷[w[+·OßÚJx¨F˜êŒ¶Áñ¨w›Ÿnƒ{z(¬­ö.KR‡™‚6>šÓkµµ¢»—PCΫKæhu-wÂÇjpí¶YÁ ÞÑcÊIfe„‹ªêÃß‚AtfNŒ5Œ×™å#Ú÷S’ 1¬”^¥€âhC¿27k-¢s-S÷aÂkÓA5–±¬§Ÿ(…ì€çYÕÀO¦çæ©$ɪºMÏL3_¢œ¿d÷ÿ÷Ûcšýz›ïÃ<[B"øßþåÿ•ñýÇ×÷ŸŸ'bšUжüªÑš/‹oý \<¹Ë®ª¶™ó8Ž´“²;C(ÊHĵœ^„Œ-ºÌÀ gÕî3á0”Yí–õ~r[«-À`5»§©#³ºSÉX…Ò–³vds5¸„”·V¯¥Cø…Z܉¡ÝûÒ" Ñ–”ÌËPÅöé Ú(t;¹å“1`"VªID¸…W”³ owØH©ÐNá¬ô–¹‹tz7Å•Ój[‹bÜ(è´ `Wdó®®}€ùIÀA86á×…Y7Á’V‚Ã2K%Ži,R·1Õ—rMê­½­/¶$ƒ¹Z­gx_×4wFuåë sMóÙ¦F9®:¿2år¤HF™³ 07™’íÔµ–™Ù1vu;ýèHh¡^fbÑ·ƒ ¥aü®êaó"OSoÐÝÙ…4¹Zªûœ§)©.ÐX];|tHcê,ï1lÈŸ>ÔZˆò!À|Y¥®œnnR¯ÇG,˜Á™‚{G,†Î'³ÅÔPG°P¥n9É[‘R«û3J&hìFš™¹1í& ‘fÏǺ»›¸SÔK]Ìáöfw.£L8/;›+À®U¢ÍÛ£«8¿ ~{Z»ÂHYÏL5\1LÕoM àï«Êg4sbà,‘ …t0Š;cï7FV׈§0›¯3_ý[Mt§fŸfå‡â øÒù˜ô*áꬎ5/çßòò¯²ã­dÂu鼋ÙÎGaš€gÕyŽ#À³ Ïë|{ûe®ÙWß_Ïu’¨5Ìåö…Çßúh¢:¿ÞÜÊìúkëÿ—óGÞæÃúÊ'o·»ê+ÀG;d…®J‘’ CXB¯óÉ8¼Sž™Û'hN òc­'ðUŸÑ]¥3Æuf{à Å.VñŒnwÀª®cÎÝÐGæ1ç/~|~~ÊXÄjÈÇ%±¥Ø­e¯ó·Ó†[¯,Uo¤Ó ­¾Ö2€ pçfà‰F©óÚHº²ª”ÂRÓfÁ[-Ùu- iÊk s8Ts€¨îN†A¾;Jwë#´ëÙº»Í<Å® 'pÉhõÚMÀ÷PAµŸ)‚NZ¢Ä“ºm~«ß’…ì%?´ÈlÂ@ïÝJeÇ]gil6Cý½œv÷ ¹!QUN¸Ð(q#{ŸÂ6 ({“¦z'Œ›ð]/¯è&åІÊèÖ2Ûû—Ò› bN7@ÊêVšö¤BÞ=àîÆÆ%ìä”vylP[©ªÞ¸›X»óªK(£5Ñíx(‚?ãš¿¿?cPûØŒ3Øÿýÿü{£ÉꊈªÚýwú‡3År ‹VÀ`Ñùi\Ïó!ÞãÍ-ÌÊ­ÏOzùvŸa>üë·—äôñ¢\‰ "_k,x7vÄ÷M¶Åž-4‰–“dq)ÿôVT³hM/ë…sŠÉÞH3¼L¯Û…^ì;¼‚Ú]¥’Ö Ø»ûÖ;[Úh /“¶¡µyZLëàüYxHr¥€Þ¦!IÈ[û~’è®§n£¨Ð4í¶1yer±(SaMQÆ]…©ÙbõN·á+/Žäµ3·’ÅnüîæiÒÌ.”£÷«î/ÿ•¤ì¼e·âîbÊL:mH”ihÆîFƒ ›1ûÅ­Ûÿú–Aèq¡aB7ZjÁöZÎZÕK*a¶Á!¸ ™¦&ÁoæìFgZµU²®c^hJs“jªhfp±Hßïº;¥Ý¹훤ˆîzÒYå‚»7pvÊah¥ÚÌ]Ý~Ɉ”d «vwoÒ%‘2§XAJÖÈëL¾o˜»†±Ô…¾æëfî»´º{N³DÑr¥Í£Ê-"^+fuÕϰ HU§´° ;Ek'™)œ±¤’;ëW ¨½Ÿ9¦€òÝ@Ê\®~¥œ+özWM´z½îоXaF¼œÚ$“𸞽ÒZÇqÄv;^e_´t­fË Yi­ îú'N·,œvôKŽ] Æ1‘NH#O„U µ¢ÔÊuu㱜>noGæ³û4þùû×Sn6oyf4îðu^•9Ƙá/r/ûâóv›mÊDgæàæþYçãi·ÙÖ‰eg÷—ÃîÿkÜÚ¹žþðjp‹Œ”Ÿ§Þøfeìç Ý[X£7ÏyúÛý–Эp‹øt_n 8|Ÿdl×XÞ ø®ojBìî÷û[Ëw«þ¹x~¹Û´¡íTUµÊê,ÝÆ1OØs­q[&¨Kû½Œ¦žA©£ú6Ü<åm^Zê& l3øº«¹Ð__Ÿf‘ÕGi3ø(Ì¼Õ ¬_ÓFëþJYЃ‚¡£ûÛíVÑÞ5[Å¡‘°ÚOPnkŠºîc Ý=zk¹%ÛÄ-m d¶ù«|¶ªtw¸oÚã.o£›»©©*7ú^÷ êg¿÷n`»òJ2 Õ[kÙw̆ r±ê5…%Hbu€{ž±]ô ŠUi›+*yuu.I¹ôZ¢µµ©°0qÄØð¼˜#hBÝ{þ1r¯ÂHj57ï¶*¶”Õ­þi´Ì^=òµ‹9~Îÿn¼À¶Ò˜_×Ejqÿø×"4Ða CÑŸ†4£ÏÙK?¾oÃdû½ÖºŽ1ü¿øíLV×UØ÷16‡½æßa£<»…¶ðfïdæ°ÁŸÐB4µ–ÜVÔ”Ñ6ÒKÑÍÞ÷àÍ÷|ý+~Ÿ?•Bmz¥½Jshá†l8<Ì{µóµ™Û•/MMQÂ&˜›E–©)™PåÒPŸðïßÌMt©îBÁTš©š ^–×ÉÚöÜ…W¢¾®Œö×Ü€R4õtíÁ³[t `ä[/`ÃÖ_ˆ>êÑèT»‹4jvIZ~"2æm2¸R)c9!TïqÌD‚åX†Å=5J¦0ð'q¡5H7¢€jm¼~j÷Ø:`Ùjeïºc˜ÓžÛMec¤Kõè,j¸]¹n/o”vŸ·úb ª=}ÔFƒYeÇ!Çö|T•¨ËÚÜ)¢«ͬ6öÔÄÞ2-¡ÎÕ·˜Läʃ©•kuØžVi3º[Õ‹‡é©úôJ&ý¹ÙÔ?”l_ýLAˆqeú•ËØûè0s÷ÃÝê!³«/Áœp¡íµ±ŸC&*`³ gKc87ŠU9̲ÒÌHs;˜Oî-ï«ÈYüZíp æcí=µpxl­7UÐIs¸OíV0|]µ¯uoMóÓpQˆ«óB3Ü‚‘=ÊG÷WWÖbØaløH%¦Íªk„5ŽèÙ4y˜‚Å^R¯Z Äx˜ ¶V1Ù]_ÝOÖ´²ºû°Œ Ppe†Mµ¸ëRwuUU l5Ö?–üŸ_ÿ¤þ‘çíþíÊõ~ûåB?T㘘}ûüº2Û!pq¬·cÂÆÙµdît¦[\ $˜·o÷Ùy¶]Ïsùnè'T!;.Föz;Owèý|4ª·H«™‹]Vd+}è6#‚çãùæ‹¥0¬å@¯Fõ1ì0†hõ¢„®P}r÷y?Û²ÉÀ‹çš‚õÓ8æ-®³D‡h ËNú±ø ê`üâ÷‰Ö1bðbSí.ªú5§_+«ÊÈût'ü6âq©õ0. t/f®„›ìžD­Œ~ÞL_>Ô¼»ïvë}«èÓ3ÚÆgÀ›°Üí"Ýj,óë~ðýhT{%N‚ÖõBš…BbÛ8¬ÂÌ`-­„Ë'*Gɲ۸Ð-ÙŠUW…µÝŸB£ë|N»|–;çêôùnHJ¬–à”ëêɱº²ju“£›7Jb¸G itg¶ Ábp„m^3/Œ–ëªÁÝÌmJ>×:} ÉÍnÀ:–ãv}½ê'žWÆô†u§Ç›¶œ=`Ö¨ô@ì9†Û9<Æ0óu]ë¹Ôv HÑtpÉ—Tν¬qÙ#Ã,Äü_´½Qo%Y’¤gæî'".™Y5³ØÑŒHÿÿ ´èî™®Ê$oDw7=œËš^-ôP€ö>%2™I&y#›ÙgeSÃyq»f†õ¶m¬[’AL'EË' £4¾ ål³I{Þ'Û~‡f»àì­zìº;¿Ûsêóãù¶«—ØomáS'äe]Ö®~žU•îûÞšwwûÆ×Çü*|3ä¿ëéßl—öJ3+×Óù/ÇÛõñ÷¬S(go‘àM³Ü÷ßrÆc+©ìô{€1ßïä‡5½èÿ~çµo­Ú÷yž>\&UU)—æùrǘ©Tù6$\ÐÆ5syÜZ÷s΃ Ý}Q;[ôfˆ1gÜ7LßíêÃÙW‘Œ01NçÞ½«Ã¾Ý˱Ñ?÷MÇö04¬7o™Ÿ'’Hʶ‘mVÍ݈„©M³+‘f~ÌRa@: ˜OåRœ ÆÒ†qß4š•íTØjr½{~£¸J+€î@Xö›Ç}Ω ÃM ÐÔÑgÕüìfìãîo÷†TÏ’.C·²à=Êœ05kvwÏ £2}ðl(™9¨LÖ¿¨ ²KªÂÐMR éðµqÆkaýÚb¨#d–Y(\Dr—âÍÌiT­ +çª:< kÃL7ƒÕt÷î~>ŸkIÐzÕ@u7Ý7ƒt¬| ¡¦@5g͵­c¼¤°Ò}Y’Ô–…ð²õ”§IlõJo‚mŠõ/®€hy‘lµ ƒåu¦´nšèz>ŸïÇÃÌj¦Çh «’·^gñîî•FA»…­t‡ÅÛæÝÝyNF¨_púªÿ¼Po`$ƒf1ªóoù«xßá1F´æÿôíxüb9çgýõ/¿uRdOÀ¾¼™íë:’ÆU³–_zÕˆ}½ªjyŒîÆII-Â÷xæÓÌÜ쀛™fÕº,¤ 7ã™%´– û§³»!lËI'£ÃÔT#ÕehJÒ`j‚Ð=“cˆ0pkÖ]”RZƒñ›ˆw©ifa‚Õ¬\¼Ršc¿jq¹žóV¬pF¾JÜ—[B«VÞZKÓZ;ë6$!ÂWû.€1CšÙp—äÀ2ϯjâR(0šÖbÞ„ocÁƒ‹T˜ª²›Fk,ÀµƒB³FÑ]sõ)k™{l¹;ìe(z‘¾ÅË@l1†óy_MM”òÜ-MÙ”6·û¼§3ºoF½ª%Áëkà0»_vûU†H‘0i—ô~çKC¬¤÷•ɵÄ݃2KêW|»KWÖe¥Po}•œ ŸXNfÍÏÛ@ìÌ ‘8DôÀÇm¢©ÄÕ?áê f¹|£±¡}¶i6ú´úô"å+•Dû\ü¥\yÊ*+qŒ}ÿ¥Ïk*”jú"ë  †ÆZ&Uwñ×÷7TZ÷¶Ç³çMÜÖønsFç/vôÕÛe}õÏ­oãí#®ëž¬äUUŽáŠ¡ÐÉ–´ùÖëGÎÍB Ï´b0Uû)Íc˜)ëÎî^§2 fû8Ti­án·ö´;õùùq¼?&òLÑæõçæ2ðÙ}N°aµOž?ïÛ·_Ž«NÀÙ;*ÚÚdZ¨r¡»7h·6‹^ös¢ `-[Œ¢‰®­bvtŠjyÕT%%r·mÛNn¶Prå° xaˆ›<Üçðɼº•Fj‚mÖÅêž»M5ûyÈѶ Û8; Y˜©î¿>‹áaÞ}ßSÓØ0`·2všÙ ¿ºœê 5KÝÒÜ­²l¹J—qß`ª€zPÎl°»L©:ÄH›°òûlúßO3A6‚Û™ã4³¹„ž†ê¯6Sù+vK7´Ádí+\a²fT,}„“[s¹$×üaf¯´.M²`ÃJd‹­ †”²| îQ® •y³Í¬(£5`æd—þ³’¤çó `‹!­gž›­ä õª´}qÆÖü!½î\¨uÿ2¹µ­C䪥ÅU͈€]«)‚؈µ–¼’k¯VßlE{R s÷0\׋ͣ_7ÄÿÞÕa«‹Çdèjʰn˜Y—Ô+ñJtcÿº”þsXOG´ú¾Ã5̸myó<÷1Ê+0ävW"ç»=ìñüÛÇçõÿñãÎYŒ¯ˆrH Ëif«vøÿ•&鿤5:eZ<‡ºÇ]3g¶ík>»»Š¦Ñlcu[¬zWZ$ɵFƒ±¸BÆpšPZ¿ž0ŒY¾T¨IaÔðB/ú®ú¶I¾¬ » ^vÍ`ˆ¼FMˆÃ£Jí1a¢­húfÞY¨¾¬‡9Ý 2“Œá5*¯XÌf.ÊÁ¢¬Ap§7­Ô ™2h1Š—J+ѾZfeM¶ˆÏ   ¿ Ê VÞKQJ­\/f[ÓÌêU¼M/±­h˜u“jXû¤6–-+WâØÈWS €¡vŸ&ëN¹$4؆¥Ÿ¢HÑÙ&º8¦.¢1hh¡_8íõ_Y¿°¢fhÀ¾)ßÆÚ¢–™r³Ø*õ’s^jŒ1þxÿ¯¾ Ã/o Îû*é8Œþš0+ V¨¡ÑD™.ö /ŸÌ½ìÐC;àcHrjÒngJæû0ôÕ¸›=CmëDb]Æ»kBé*¨ ;Ì››D;GܺŽÔ%aL[úQ£@w‹Ã ìûLbW –UކßhãÙc·«ÛIRé&h‹ÑdBkp;èR Ê–’jŸÀe&Úñ뼞u#ÜÝ‹}Gv·È¸i-gdË,Úr&±ð nÆò –í™Í=š ômµîj¬ÈnÌÊÛÕ­aJ¥¤áey>±=2›N~ù³üõËVs¦2s4Ɉ¸ç¼‰‹‡³‡õPÉßü—Ðêh 9LáøyÞ#¶Û²¨TÇ1 Þ’ª€{±“ë¾7LLZÀ!W’mÍ©,Žñxæ:ãøeBËe”ª*YgAå0[™ 9Z¼[[M¿'ûPߥ;3[±/«»`ιNlW—·±=/îƒÃ~¿ïM¶ÑÝ:Ž]æ±kßnø-D\Ûß»ïJ£Â@È|ßRš3ge»|ù=§Rn‘F(Ø’©Íàî‘DÒhÆí“7Ö0·ƽËî{½€KXŽªÁI§g'W `!—h½$Æê»J…[MG¡¢(¹Ìa RõõðzaÅ Ôó’WwÇ~XsÅ)$µÚ$A­^ù±v( ûŠHÕ]cì-V¥|åïà8Žî¶•:ð!Y~wÿÃxÿ:Ö“f«¹EËË»ž­WmǪyM3 °©Ã` S¸¥×9xùLpq®7pøîq?Ïëº8Ä-­šÙ?ŒUU*q%;Éaªê.Ãi tVuûX£À?deÆ]M`¥CÍy¼=îç}ßï‡ÜDͳ6E•²röõí—G!þò·ßÀ¢–ÚdxùˆÙݤ•¢¿f¦ÌôáÝÕݪǾß×3ÔEµbŒ©”™ÂH[ìeà(ƒÍYÖ`#¥+ƒ7†à&k¡XKež\ÌT…ê€Y×]‹²|ÁÖ´¨„°zØ<œa·z͘€•˜Ý+~0Z[U÷ð°gß-”ñ‚a­CU傹“ÌEHS}EÁz3˜ÔÐ2Ièà Ѵ°¾jÃçlvp ³\ÁQG¬ Pmëf}îá`¼êý¤,Lq)†ÀEFÍ>{6Ú‰v«È/s9_åZëúMй¢´Y½&q©*Â(|©MºÙOð7îaU„ÖEÄ…K$®#>€j…™"hÑu¯ý‡¾ˆ]èîk.㔡?2Ð2¥šÚb`­é:{²:hÛûñ‘·ˆp¼ºW‘ €.¢{…7w¼v*/C¡7sTßHýáüvÈÔÄ=˜¨F·ƒ†µøù)¹!̘µK}diÖ­»úg>m ²Ó£ÛzvÁ ÎFËÔN.ÊBé(À‹Ž46 •቎Æ&j¦©Cªè©R5›¨K±,‰iØGå<=‡ß6»ê÷p6õÒªæxÛhëŽbªx Ãyžfp( ó:áFïÏžû>0äò×MƈcÎ+†§¡­2ˆEeVÎî)&W^… IDAT tè11JÑã™È«ÍL0ãý-…ÌTÃǯ¼•C¸¤F²’Uf8ö÷s^6â.ŒN¤úús²?7ÌÌ»›#l]róR§íÛwä^Œ6ư¤FC·ô,ø¨ÞžôÀv7ÎC—}8푱ÁîßÏì¾íº6M÷&n=ß›;¬JÁèïÊxı_fú8Ÿãñ­ìœó‡÷/Ÿ[ÿPŽ-Þã[ßÕÏóí jýL9ÍÕ[ÖwñIUÕØÆÉ. ¶cú}Óáû²)敾€jhŒØÕ÷}½oƼTø—x# í Š9¸»òóòà0võ§ÚæiüÌtÚø˜M•½ü ”êb4Ä:Íe…Ê€ŽO;wßD£KÒd6z{p3+¿Ëü·“0ñµ«áVÎÉ~?T fbá…&úÚ= +¬Tc±Ó€­Ö>bÍCt±9Ù}¬:,êä:»§™ ¾x§´±£ä²°qxæVw iQÕûsE FÃh ŽÍîûN•SŽ…f¸«`ûpI5£nßàÖíà‰4TFt®Ü;§ 8¼îZ‹êæ!w—yÔ:vÃnï } e‰}ÖÝ*å¾ý,¥ ÝnŠV¥… ZƒH,çò=!{‹GmªªžîÁÑT°3z¡¶m‚Tg˜qÇz– ”äÇýqì=`¾bM¯^YØ]aÖÖþp)Va,€íí{¥ý¸s~<#ð/ÿõ¿TuÝuŒý°ÖìïoïoǼõóãüñqÅ8º{*@wÚ†ÆX×®y:ŒÁ(M«)4¹Ý©Ä"ÁoN*6t‰qìÊ+"r¦§1¦êì"Éj¥@ zßâÛþS…oð®*XÉ«`1ˆìΤ,«Z%1›Dn³zõŸ£²‡GÒh˜AîiÑðÄñÅ”8‚É›¨ÆG}„£uumZÅãS÷X?!¶|™éJyðÊsÛ6´¼í qÕIYºL*ËfOõ*"©nO>z|cËP¨Ùjsú`ð©k4HÌ §ËJ{a«¨4ÅÌŒRªÇZb•¸*ÖMÿîXLJœ@ëê饯qIV5¬µ†¦)Ð0q7!˜Â¥JËræn°îyW]ÎÀ:¶’í®ÖLml(ÕÞñ§Y@ß›mýÛ.dò 3™Î¼ZI'Þ+î‘myXx¶žÝ-{w?܆qö”;~ª·&'¾EP¼Ï}b˜o½©ãš1k›€¬mô좹Â\¶i«Lç®õwÕÙ•*Æv—¤~ŒzëLW›£ %›Ü¢Còè9›t×a8žü}JWÕ lfe絿ÿÒŸ¿ÿoÿû¿þí÷ïшa] 渋ÓT[×é»û´aQ—Ô¥Çïp •æuÕm6ø6þ'ÎØ ä ç ‹}w çéãcû¨tóˆv\ΦE©{˜ SxO/ß’ µŽÄ¾ ¾U‰œºô†7šánåÆaV­åšÜÌKå#²«)na3i ʦ:? °MU…Õyd¨ºHÔÍ$㈡š]^ÙÙÞ¸…lÒÅ} Ý=Ï'b`p¢- .t› ûœU™Î˜(8‚‘ÝEnî“L`ÉÄ­¶uÍ w–Õ…-kQàõÑÌr""ªûä"4ÊÚL0É-Ã(£d„u–•:LNÙêïÈ!©—ñ‚( ˆRQkƒ†B7þš“»Yä\ûQå@¬®n-&ùB4âµö:•–Hsªùy_$¹…IÕ@iV¹»¸ –\¹ª—sd9Û±a­dHVwUuåƒ]¤PKlnT¡ôB[-Ç;ºû2šìuœò/i&].©Ûýõ®¾«Æq1eZíZµ²¦à&ZÕ‹`r¹R(¬ÍGK¶ä!Â#²*» ±«\ö•DøcGr9Z^k?[[ªz{|¿t·š…ÍcIªÅûf³æÚ={BMú¶m$3Ï¿þûßÞÛ÷ã-s†¹ÒÜiìxÌð1ï̬6ÓN‹îë•Yyʼnµ2sî‘Ypײ^joúBØšåÊiý9þ&f– ³" ½â./¿É܈–™}“FÓV$íõšs‚Öw®÷“™ÙRý°æ­(É/”p3åJW}ÑÏÐXz"þ8"¿¶JÝ4£‚]ÙµW¯ñ²YC.FJÝ$zõ×õuŸ€P÷kçbÖÄn¶ŒÅ÷fË}ì*òuŽ]‡Jo=J8Q5²œ ™_eá¤7”¥ÔX)Yb}6­KLCû ´5Z¸Ð ´!–ë£ÔRUõÂÒ˜™I+ ‡äI7G«—oÆÅ3_IìðrZÉ%@eJuf:܉a¯æ< *©´úì(°-ôuIþñ3õ’I)XÃi¤d\uL49PuÅÒ1ÈFÄè¬T™YÆF—ªÅA@ =MN²¡¦&½j­,l/°š)ÂnÃÆ”s”Õ*eãáY¸©ªV%¬…F­ÄæÂÎyÂ#2“æ"†²}f³e„-å ̱xyæ2ðETw dÙÊ\Û¢‚›¹s^³G4p·,F«³‘UU˜ËGÕ AÛJ6ˆ0tÛÌ™³B¶57óf²Å½­îª³;oÍK=ÜÇ˼سŽ}+C¶&çl B±#†¤{럚Ç/ßþÛßþºí±[4»3GÇ `©D§¹ïÍÊÆþY·áf¸=¦çÇüäq&æý§Š?;ÈÃÉá¶ÝwÚ÷5}ZëœÚ~ûÈÍ:p‡§n…¹j_EM“íø¸nnÇǼ'­»ÝÊÂŒf)Iî¨>Ýnv«®A#¼Ý®  `w­w¨rNk:<Î>Ãõ6¬>rJT=g2¢ÜìîrÄu'Ds?¬¯ªÛí¦®}äUßk¨ugõxA§ƒF3ï3'ˆðW«È‡µØT>°Hè››²êžyТæ3ŸwOŽíyƒ6ªŒ$“l:f^¢Íêm %©Û[±#›§û`—YÁ®YÃËØ›)Ó}{ZSzmX½Ñ¦0)h³ªÔacé0]RªYÏr÷6,ÂV¿"`ö 1û¥®‘K¬•ôr66·äà¦;»§‡››ÂÚ8ç\3AÄ’¢UU+ïºF3½_MvJdaÙð¿R—!³gMR¯ºUÒ"ÔÝ9‹‡æf à¾oó Bßyw€ÑJÈÐk¾1,œx•”¹LmKÓA5€KUKÄÖA·77Ĭ$Ê©^ÅÞËq²‚Æx“«ª_–O’Ü÷-3ÝýêYÕ” ^_‰‡$c¿v,êJ·V†ò8Ž*~>üü|²ç·í›êuÜgÚú_ÿ->žç=õñ£ªîõ½qç*ƒ^âÛ¤@$^­cøCÞF¢hö?zcÿáeP2c4 Ÿr§´F@|ÙM^3®!° ãÞ2ÕQBclõ‡…¤‘Õ_Ÿ” ÍA”²¡n|ð•‘Yßäb»…iÍ"Ù(Iµf8`u¢×†ÐþÇùC’&h¶ Ÿ@u+NƒEwI&êÖí]U ‡™¹ºu3Ã`‚áNÍb/9D®äò—+vÐí&nÇ$š˜([uâ_è`[ÛF·¯4@E5ª»ÛÝÝé½t5`aUug®ì·»‘Ñ IÖ ”5Õ]/Ö;Q¶DÓï(Ìœ=Ó¯l°{IÝ]#"è.ÜY&e¡Õøj)˜ÉâHC .ª (õo‹"d¦wC=¯ßëÐùÑcôAÿ ”c? EpÜYÓ|ÿFÏêĵ•kÞç÷÷Ç<+¯Ö×m×…kÛ‰!Òî9>!#}õSò6»¶!Ÿd:S­lä#ÌVýšÓgöy ÷ø^j8›ËC`n#û7í”§Úæyîæ‹·µÃóL€-aÛγY6ÂÌnwsÜ%ÆÖ^Qív¡ïcðùô±UÝǘ¨}·£'Ú‘†|ʬ,ÝUm¥€p¨ñ‰>oÞnDžÀØú×¼×pµßÍD›³`‹-;myÿ¢5³ZÖcóXÔ¾Â7£Ï¶ë9°µ†"˘‹]{ËÅU3F6´ëjÛ]|Rò”ÛVÅÙÆÆ›ÙÔñz°QÍ4Þ+Æ’K(UŒÑdZ3à9‡lbS'­ŒnsÉá¯Ç _-6Úª”¢ÚÌ<¼ªgÎ=Â`bÞæAé ÌJ'¦±Úw÷œwªßÏríÞ€5³f®8¢^ÏÔ"é>oØÝDìvOk¹ÊjEüåÑ-Q^4‰ÔFÐù ¼<„ó,™µí»¨ªº[f$}~JlÈã€Û¬¢°PÀZ¨a8ŽoßîÖoŸ¿ýüñë÷o›ã›4¯—ÜãýøåµÙ™]?žÏûÎV ¼§Ì³{uÕÐ@a*ÛEÃhkê4¹ÃX{•û8«Å•|\äºR§o¾‡y••ÎëzßFÎÛ\.•ënn}lÏ\µv¦îŸc3S(·LÜŸ%läXH1µ³ˆéàxÑÊLŒÆ¼Oà€Å¶¡Z]êùéÚQ ’­鶇®ùT›Ü{ÚîA³©©ön¾r^ƤD9¹GáE“ˆ*¨Y½:ÊF±Ýn¨K]Õ>04ûö è°æî)Ë…UU’dÙ «õj’ö®€7¶’eý ³;&¢NÇ„ÙGš;jÇÕ×\ƨ¦ïÎ8ƒp¹É63¹›´ÑdHN[‹Ñ¤« ,ßzµ„ªª°†ÊïŽåžÖÕÖíÄ®§Þ<÷óç3ö½hñ}«ùjñþuÆèê«2Bf¸è÷S•—QŧÁMã(’~v50ÊÈ•.#ÂÚÜhè†RåN ewM4Y_ÝDy±mcÕíu-ž«Ñ¥&‹Æ•æúÒÎy£hc_]'‹N¡ÿ“†î^øÉ¤ˆÚVål"Õ0w†rÅœÐw5¦Á}í¨ £}Od”H˜7 "­_í¥¼D’±pr_JQ@öêE£Z¬ì¶QÒK¿[‚ÛÞ÷_k&ªÝ am;²­+Ý"æôn)W’³º$²) ȪLÁ.¡Ö‚»Ç^öýö.õ}¥»ó²½6–÷LVU†TU*3_rÓ¨e˜UÏ´1(´ÐÍV“Dw¨Z÷,6­14¶Î6ïJVStF«Damìà¦R²hh½:¯œfôPE«Úc7ÊaÈÚš dó"&Æ¿ﳫVŽ­ÛÁᎪFR›Kí$Ÿ¤+]´²¼{¸muOs"ü4^ÙÆ|ÈÏ{‚#b3–‚]kCÐ̼a¼Ñ5aS2Mh„¿`‘2o±5ÕF¾Ì¶{¨ÔÙº3C¥‚Ú+5·² ¸ÅðXUdê–%eNßÇ Ú¾µŠU @´ü^àçü±+3{‹íZT>Šä…‹ýèq÷VÙ¶3èoècXXß×D½íÓ“ýyÿÇÿõßþÔDñçæó¯s¼ïpõYP°©ö*³1<ŒÞÙ)ÇÇÏŸQ]u Ì¢Œyé}S”P3,‡_[ˆÈG<>ï{‚%œÏŸy^a{wsŒ©L-A5)z,Ü»WnÅÐÕ–cƒYͼÝÚ’üÙú)ÛÆ.6Ë«Q\€„‚ Û™S€µo¼›«òê¾ïóùߌápµÒÖêk½®êA×"$ú¢›‘L ƒZ&h6hض1¾Àb_?ë’ÁV4?Œ¥.ÕÅŽ °°[Àúî)g“WÝ'$šÏyËDò-âRªvš–É+O¼Ú—ÔËUQmÇ!ш2ø€ïð»Ëp™-³vt êXI}¦uí×Ùnd6iRQ%XÁ×j}½8m•²SÒ¨Åh¶|¤ëõ:h± ‹¯$ùJº®…Äë± ¹Ùýœ!®ïÉclën•»¿e«†ÌXUz=¥°ïû}^ß¾}ûüüü#ASê¥g—zÄX.j_DO‡™9%e¥qŒ‘³–pÂöÊ~Q½óM¿´ö"VÞ«† =éè ÃÜÌ fVøÏXæ/"Æû/ã÷ß|^óÿþÛoÿüOߎÀRXù¢‹˜=Þßÿí·«§^ùòV¾¤¡‹X§Ì—dDÈ}xhž"e\ÂÐR¿9¹Úg¥‡¡jD,Ì}©Ì^ ‡÷k/N‡¤åÑÝD”’ZÈ^_µ$w®76BƒÙݤq®¥y³Ý(²Éc뵎ÎP nR^êXøMü÷ŒÚ•r°"Zk°¯È6a1Y l(   ò(ŠÝ"{H‹(Òd(“xyM[ÝŠZ©âi‘_,"»Ç¥uƒlg‘Yµ¶j$7@”}ÿö} ¹»ïÿñÛœVIèJ¶¢ö j·è6ÈŒ¦6³ðóEÜ@Û(r²[ª˜Õ²眒³=Ô¶,PÒp' ¶I”&¿xæ0‚í-1J”œF÷n]Y¹»¹Ï|Î냥"×8îh͸åÒœD¨WëõÔÀeÔÝG^$ÍÀV†©-|Óêih§ BælÝm"] xå¼T§&€ÍømÁf fW@4¢w-™åu—°mÐÌL¤'°š2Œ T¯7¼0éf£š” ‚±6‰Áë.ĨˆÔì`gÞ«ÆjÙ¸Õ$$N“=äÏÏÓžÆ2eN´…ÅQ¼»ÃÙ³»)¶Y;øÑÝ3ɨª1‚ìS½t¦±CnÃöˆ¹tTË ”LŒ©Õ„N#½aÙc¬Ñ“6øxëš n²¢µÍçÕ,û¯j¢ø“þßQûÖo-d_ÜaœVÿ̙ܘÿÕ°mxÞø?ïâ?! Ýå[íðŸ¿oìÞÎçûD¤e·ø÷ôöcÿyÏÍn@çuÀžýiÜ£Ž5kË1¬Gæí=Qg~D]Ñ:xPŒ«½Ã‹0l㧸±XöØúè á~ؘÚÏû]ζ.Ù•q„RÓx‡£ïyóáÖgæ¤Ùñ>&ž»“¼ÌXÜÆ'ûîÞdZa¸wa²OhÎù_Æãóã3앵*¥·vJwFÄ¥»Ø÷áÝUCDYQ (p¢±¨Úʳ/’†Õž=<¯;Gnå«}Nnc,óäªPqÃË;Žo6Ëæ² *½64º­èb¸5Ôy^އ®1«®–ÚA´gÐFr‹ÑR8ÛØàf6‘¬,àv¸aH(CRÓêæ´67Ó‚‹–C@qV×ÓøÿÐöv;’%I’žˆªÚ9î‘Y?ݽ;$fA€|ÿ·"@Îbzfºª2#Ü™ª /Ì£º ÎEûMžçÏÔTE>‘daÈz¶5»ÆÚC{A¶7@ÆvèfÏ]¢0…B V´QÎÔL4êSЗEÖYëÙæ÷›ùýã‡q>Ffí¸ WbÎ>\ÛD Ôïü®foÕG»ÓZ˜ë’Õކ²ösêRY¿¼…û>ktA'}Ë™=qúp±žù}'HÑnÃw–J^ãìî1ÆõrÃ@Õó‡q~ùé¶ë_ÿåßî÷ó§Ÿ~:Æ-súØ”­n3ü÷úËÇõ|ÿø˜sZ|ã\'˜U¶Ðã¶¾”ÅêúɺhæÜ½×ìÊìq•9¾(ʺ)Ðå´4Jʬ:ã”8jt¥°Œ¤è%<£*–eÅÝü_Y•%·Û1F(tá8˜u‰òqVe`ò~šÛý·.þt«ïÓúþ¬?Æ_ú<ز÷o8}¼ëj»ÄÒµ°8&Žñµæf¥^rÝÔ>8½ÌìÔXýÜOc…Ž¡>´z-À#Þz¸ôã”)Sw1Æ9µ`Q™‡Çù6ÖûuGw"¹bŒÇ»O: m½Ú_éÕ¾äm‡„agxóš­Rõí8Ï4+ï1Ò¬¬=Æ8¶BÜ¢÷~0š[¦¾×ˆ6W[74Íñeð=|Š—uŸ~mGûðn}ÌËQçaÚ¢SìÑ€‚fY{ç‚^ß=`¶ê[Z§u=ÝÂt÷ªf«l êá?sU`FÊwùþIPUwgÓ¹Q,põȺ¹I^.¹Z.CÊT3öè‡{ÓA¨Û6Ï’ÁKîfôZ{¥£ÿáµòÞvëÏÍñÞ‹d„³¤ˆÖ½7{‰ÝJwêï*Á?4Ô[3¸¥µ`“ªnÁôBHþÞZ(n™°÷€/<×þÀÚÁ¯›·8†?ë*Ãn¿¼Þ³Ih/Y“a{vgþ Rj‰[ù( ?¬ûÍîŸdO°¸ÐV»o†F“¶3 H¾zû* ïÌ.ËYKüLhÛ¾$õHœç¸ÝŽçõñþñíííÞ]`“ì¬ÓŠ,}ñ#½7Ï9‘¾‹§ÍÃØ_ -!¨±ÿ¬m¤íˆ mpwdÀ:Jœ m®ÔŽÛÝŒ½ðff'ù;æàpØkË.`š‰ìbËòÅ'͵>/œí…€Pb{åß"ZÂ6C¢7_xléôR›e©Œ ß½05ÜüZº^IsŒ”D""ªdd4MXý  *ã"}SO¸€Ý¤`‚¾gÆ‹êÁÙѼŽ3žë;Ãy|‹ÅžE·žŸÿ*›]Õúøþxç>¿„ÓÎ/o)x®™Ò¯×ÌkÞŽYC4«ÔÕÙ…E4Že]N8G··Û¤ÞžóèøuLžè%Ovš‘À†ÿ#¶JXÞð”é•Hùb¹jƒ=a’77d>w¼'›kP±º €M¡Tk×kŸO¼}÷E„»_ª­Ï*ưð‘V­Ro‘(gw6pk–%µ­7æD²ƒliмͫ†Ê#ÌÆù¬•UØ#x »€&mi0\9*ê9È•8"ÖÖà·ž4¯êké ^f0 IDATóêN6ZHóå£ãVnBñ*p·ã-é0xË+k®çóùåë˜ïµú<‚íîpë:̯Îõí¡°§ÃçZmPöÇ÷ÿ8Îû·ù¸QêÌK{ô)”Á„'`¯õ´½8qÚa3¤~;Ïé lº÷÷\•9Nk³+ðtýÚ^vQà÷çůöÔŸö[O›j?~<×Z¥gdÌc׌‡•À‹1ý>ìæ£ªžá‹<qÕ„p7rȲCFï´®GκŸ—²‰p¿¿ò)ûšiÞêÎYg´¡[Uwšëùþ´ý|žð/1ו=S¸B¦4ve™…„êºq¥Š[¸Ý†²ò ®ÑÊã°ø.VºÌ‘¹×2¿îêî¦íyÝJ÷vßAGªÂÖ¸óÉ´“;ËÉ ïÏk¸ÝŽaÆ–J{•è0 £‡Y푨Á}'³@“vkŒ#Á쮪 uËÁmq‰ 3@Ë”xe„úîz¤haß± à ´6¦zçj wï5Á.£_&„¾!`\§} ð9/q”€Ý o`”Y>¯½—;‚p¤—¡?£ë¢›†ë¹ûŒ€» MÐ –ø‡‡¯·oiÜ ·*jk‚v*¡Ü 9ŒBµ™Á ‡öfu?î~_5Õ¦—­.Ñãf×·Gkl íë=üä•}’C?Ziìª a袻ϪªþãÂŒ]m|Þ8¾•bTÚ_“]h¹¶ µ³vlÐþYmj6±Ó†)ƒÓìÅ“\1|5î^mÏç{æõööf}ØÎ%­ÜÏ5Ôë5Í¢[*€‡ºY j‡Âî^vœ©»£ŒäkŒõ*ß¶¡¶¢ÁºÚÀÕ6¯—Y@ß´(% œèÔ%¸Ñ˜R²†Ó¨ìÜ—e•Üݸ•‚¶UANXC@& ]lj™ÜÀJšL£` D“R ¡b­úû)ÐÒKÂ*O1›% ‘˵„=’ÉL…(jO&œ«i`©ètí›Ã‚G³åz¬±¡™+¿â $ÜŸ* A@¶%¿›ñEí&ŸWWëoß~sÒi÷_ý¸··ûaõ—ït]™çoœ9®k>ÒFA°èX©ò´ÍšPc «C;ëux_•Xµ'ª5mІ5º’B©ƒ{eSÚ²¼Ú[Jmï˜á”ïX¿}¾H–Tå wˆjo ZOÉh É~—·ñwÏ`fÓ «ýæ‘ØÞœ>ñ’Ü•*Q­dâxe¼®Õmßee,8pS[%6j‹…ܲd™U£ „¤vÃd"Fö¢Ó)kx]C§ÚNE>åtŒXNBfçö&Û“3=‹"øóùã½ã0Þßô×'ÐŒ«×¬zgß4Gû—¸¬ÇÛ­ò³ùÍù6eõ[æ[ô°RfÑüp¿Ç­Ïøþýûùã×F_ÏK­H¢—A1n$'žO†U“k®h»Ce•zÌgo €àT‹„ÃoãêþžÏ:pŒ÷îµV_]|©¹ôÿ25þÿxýùëýe=ËÌßΛ—XÙZZUsBvÀon7Ž—ŸD˪•ÍÑv3DÅWܪjb>ÎìéGÛ¡Äu¡fÛ7ûQbœ—礞4Ïóm²dR÷0x¸dsÚAg>ýö4UáÍztàz<ŽóÖ`­F·ÖKýÕf¥îB=¾×qO?tܳëròÙw3sbÎË–{Ü‚U«£WµJoò°g2Lßnl¬EaÝÍfeA÷ã<ÜÖûãm“©Š!t+ÀlŒá²­Èèm¹NkR#Ý1Ð-Ôæœn ÿaÚËÁd7‘,k—DÀwÜ+ "Zr‘Ÿ0}G&4Ki¦™áæ}Âp´\j x£€2Ìî½áu 5/™ÒŽãx–ãwÁägý¢ÁeŽR+Œ´–…£ÕùÊqÓ«"ÙŸv;0oÁÐBª60d¶ƒãê-ödjgˆCUæƒ d%UUùg0tnÖF…­µÂˆØ_ÿ]±uÇæ¯ÀÕ?rHI p:;Õj3c¸{U­µÆ+>?["êõ0ű¿ch|Êœ?Q“ücÝÓå t™‡ÇŽ]m©¹…ÙÝr:ÉîuÞ|·\¸®ÕÍ1†ÈEÁXÕ?¼ýéË×ïó×_m‰aÝ*§Ql³½3s¾‚æË ÎnT*HUsì&ÄËq½ÄΊ73n®ªaUP‡™íÔÃ]Ì™Y™OêltÉh0Û¢RÙtCÄP•7'à ágÈs³ÑuŸßÀ( È嘎6”†µ»X6J›eÓt›~\I¿³w§”ªP‡ùaž4‡®Þêq±æD4YA옢7=ÓYåû¦³­ÚÙeE3màK†ÆGw—U¹ÊDÁP#mçÝA0û2êð}a¼# ra=ŽXåçýíxû‰Ç‰ëÿøáëñïï_~¹Ì¬—P¬ÎöèÐ¥‰KC#‚Þ¼ŒUÊIošÿÁšìîí# Œðêž‚¯a ¹šM·p/ó“Ö§Œ¤J¬²;eÙJÎk8[ç ÔƒmR::´¥ÇQ5Ï·Óî¦[öz|/‚èÓÍWmåªÊr¡ˆhŽ¿†T}Å kÕà22yÀnæ;®¨ ­ò­Îœ‡wùêÿÌý8Žò:wê?4ÿ¶œŠü­ùìuÝßìãã·[ü°Ú×Û_Ùæ_ÏGÖuÕÀÓØ9- Ò*ÂãîÓ±èwÙ5ŽïÏ÷Ûmø12W×ã|4üsÕ‰›7ýÜýKœó9'UÇX°eü󕸎ã|þë|ç[ Œ›œ_¡UϾÏ:ñ,.wõ$ÊÁÛ~ŽžVÏ3c=å-æÁ:…Rx9¾s®JÆ;œ®XÏq½÷ÃÇQ£[0Ól¡qoÚÇâG§Ï*G¤E‹bõAº*«ÞÁ2Kö—#°jâVµnl†Õ \{ùOµ+TNÌczÒš®0!›mî—ËXìåíöÀŠìOQDBW-CT9äH3JÖ—ætmZCèÎAlNw{;ÐÚ ºm¥Û(ŸíiB/L`ê‚¶£mJÏeaÝ'‡—Д›¤¶NåÀ®rjÊì % ‰h ùæ{qÈŽ`qXëÙ‡HºztwM…?i0‹ò[í=¤–íCeèc7„§ã(˜Ýè2òêÙ7(Í`Gmp’$Ê u-trЀ÷t­ä€Nr+¯WdL{‡­@Bêþ ñéé4¶vôÖFR ñHHãX†·µ#v6›Dz%Mz8¥6v¶š„ß­É2éBµÀ8¼{V•ÖšÇÇuYXð¸[˜7úÚh6ìO?ñå翽|<ç-§Áxy³i%2²V…Õ™îÞD©gk;úk^yööºBìçú8Ý»¼À@}fóÔ]Yê†üŒj¤ÜlIÓÝ5Ž0a9·ôð(šë-l  Ô4ˆ&….¤Y¹aµ2V9h/Ê–Ñg7Ë\D”•¹<Ô‰®PFØ5Ÿéñtâh‹•íµFšå²q̬æhÙ¥÷käþåÕ,ÈR±Ÿ† F3zÙ¨ÞGúZo?ÞÞ9ê½î8[úíè{LGレ°²Å÷ëaŠq¿aš·óöLÕLÂxÏg„m|ÜP¾òYn±={¬Òq\è_{ÛMsž8:ÿ‘õ‡£L[ïã¾Âó6ña§¦~b±Ójò·§¸j¬×’Û¨êÔk7°Ø \ZÃéÀ­ñ6ÂÕß3ßÇ@ r\ŠôˆÝ8ÌQÆÛ8³çUËÛ½¹éû«kv[ëv¶¬žÑ=˜U~çß®'÷ã‹àeXÐì6ie'2`$Ѱ1Ñ%úùvιîÀ¼z™ÁƒÔ϶T]FZA–“/$ŸûŽÚ(Pê,†škÍõvœAºf½ä”Ý d[ZË ‡üXbÏ®S-.1§­%@ LhËêªòØÝ{·ÄÚÛBIÇG¶f¼;/$ÇæƒærW» âUï͆Ñ.Z.´aœ[àûCzó{PíÇLôn÷¦È ({u4Œä26Êü—"`k_v9NÒÝ‚V¹wèžÃF£g­ñ÷&ªËd¥t'akÍ5#Z0ѺղL-ë…IÑÁá¯ä<Ä®§6ßAf"‚(UgµŽã¡©T·Úºé `O`ð’§6à ¨»ËºåT‡¢³ßsæäœ|¹1É?Lô.lð×狟C IJ4énµUôî^9ϵ¶ÏŸ¹NœÃÊÔ Ó¨çÌîÕâ×ñ53#4‚Þèª[Œ?¿}}‹ùK}[•c+"öQÞ}˜6áê÷~ŒZ…‚ÔÞ턹Q›™™üÍd]›Ž%¥9³r7“(‚˜¢UÑ8L5?Xð†Û Xm¦„_Ë-í³uÿëÞÈô¾jaWWíKkÖa0ß3·&ÂeËüsj£iíéìNP4'@mË`2™ff÷–ÓPö{^ñß{|»9ІØ÷fº[WG|ê•ë~e_ˈ½¥Ø-bQòŠ¿Kjvð°Ùx^™FãeÖi»°*3b/»zv®Éçÿüf§lè§ŸïoLjÃüétÙí‹}Ïú?ÿúËÇórÄñå ÌÅêZPŸ# å¥’K]n9äNÁŒm±H@x¬*§™ûÖmõK µ}².¡ZUy?\jî'¥vˆ$Kè·Ò±©Æ¾°;…8oKZ¦4ëÊ#EÀý@6'ÚÛo·‹|®é¢`ÑcЭ_Nv b¯^ªöb—‹ÆˆmŠk0…@@dµ;ŠqCòµ×}I>Û#wä1 ÅáB)šr³´¾*[IÓéèÕ%^Â,Å8 Ÿ}­ÌÔöDMH(X:[lg+RùòJòh±ÕaF:ÊÂvªåT±›Çím¢?Ô çY$zÎÙa1bÓ4·bîq=.1×òc³õ‘U¯¶3 FI:Eo¸^TÇ]Ø6½Œ½œ¤ÁÛ­å@Øžþ´†…Å •üÙGõcÈ{ó°ã䤗صOŸ7ª¸9ãŸ]{¾í‚oŽ'¶2m~D¿F%ÕkònNËhv·¶¸“¼±ßè8¸!5©W[Åp²£.ìéÆD4`¯YŒô’Z}.QŸ+ëç¸Ç"»«†‡hÝ}ÞÜ¢î÷Ûãñøùç«ÓæåD{ˆæãðÓ»ûãñÍç8Ž$AIaã4?ÿéËÿþë/ß¿¾Å¬r²{+^©}û7ùÄÂÑ’µ¬²*ˆèϲ€Ÿ/I¨5 W“lìí1­awpÖ븟VÕTÉÔ\©#^ó)¼°˜f¿WnþžÃŒÝÚ)ø>¼1€Ö¾‹”&Іim7!¨*5¢hÐqžV˜uÍjd3;l¨w0¡ƒM;eº·Ÿö³þ0iÿˆÜ½=ÀjƒuD``ïKö±ÅjDw…ùݤs5¹gŸê£²vR™iZkK£^J@Õέ줚2Cw1u7›S–3¯·ã<ÇíËq{;ýç{ü@ü·Ÿüöýúþ1ÿå¯Mh¸#Ôfn†p¦‹UØâ*š7 5€[VäèÖY7G›!¡©­¥ÃLÞfµºRæÑØ^{© 2¶±Þt¼èKHY]35‚„”{D¡)ó^H3s? TG·Ž®Ë¼{•ÂÃÆÍ– Õºr)\(vËx÷ßÎqÐÍ|ìPº¿ÞîY-7tºÚ@–qÑáZ}}8è\†2zòL¼ÉÝ0»`ãܱ/.¡›´Û8$€>¯‡gsêvÞºúKÜæêáîa`RU2ÖŽÂŒ÷k®±Ç€Y—áæç—Bÿ2¯ܺ­÷S®øú3iîþÛüÅZníÃd¬6Çh}€‘YPÃÝü?k¹ÿ¼þ‹ü±o„Œ#ü‡ñ¬Giâ­–ùs~Ã<™Z}Z6îç ÆÙQóx÷õþˆÙqþGËêìë|cá˜óh[dÀ¾ÜßY?t|1D­Á³ pNú%è<ÔÏcѻݿÕÊ¥ƒñez¢*,« ÞãH¬çÙSáí^#ò\ÖíÀè ´€u]¨>h5:5›SmR ·Š/m'†ÿöý#`¸üGûêü(®‰â1{UØq_ìxÂRº=o·»Ð-!+ç*έ½òx_uÞÇA\ýôóí½Jw”©½ 3Ö^´æ2qÃ…Jwœêîž«r¼Ý¶œª'ñð‰^.öÝ  »ÝWBsñðáa½r;ëo6†ªÀ¦=Ñ ÎÃ뙚Ã}°’Î6{¤dk}ày]e€±Íüöc^ßÃà6Y‹âÁ*pz‚/\ò.«æ0X ¡è«vÐ'ÃÌ¢ë¹f‡7+1¥ôŽh’.ËVa­0o—ZO—Ôlш-@‰tagQ\X묟çÝ/¥a;Ý£ W† G]{èÒìÓ¼%²«Ûè$B]›ãìÒ£`b‘‹gBífæsî@ÐÙåò¸ÙHæÕ-÷ðËÚÖÉ2ƒy½'`;ݼRE™§8SA 3Q—9l×íí^kIÒyïîÆŽCI"øS|ýxŸßž?ýôƒÝü8[ÝJ·`fWÎ?¿ÝºŸUõÿõ_äGW„ßòz ÂÞM]]rÊU´²D1@•HŠ–Æ žÕÑ";½gôLFê3ÂUu³{Úì‡ì0[i´#º-ëÂX›†Bz@ Ó§üÓA7£‡‘ªÊµÊ" psÃ*± Ú ítm(õ%^Xwº=ž!è`…·*%ï…V1F¨*OÚ‚zGd±ú^zWËÌÕ¶vÊ|h8]vÔ¦g OvÝ0ž¼VÝÇífxêBUN2d©Ñœ(8ÝÍàÖeÄá/ª=ªÚ¬F—cÎeÛ/Ò‚ˆsæÚ;¡2Ÿ~û>±–Õ·/·Ûí‡cü0þüSüÓ_âŸî×ÿþ—ÿÕâ\Â/¿]׳¾ýÇ7“w„©•p>èßÙ:Æûõ´ÛóÖ³Öm¥ã[*ü™>†¯žôÂðÍ*:Ç\™âørOó%Í^þÆzÏèÃËiKÖÂ=Vâ¸9P>Åy¿ ’}QTÍmá[lõ-…,/™ýœå+Ÿò²Ó Z$ÆíÊ6 ·ã=“Á_Ÿ×Ûùf×ÏfzÏG:]¦Ä-Ó3¬7Ÿ8Vü8ÉóüwƒÄ!¿å³Ý:né5Éö?®†Çºù‚dÏœ€FÙùuT»@¬Ö€°|ü#óo¯«€BÖÆmÏ\Íanpï»Íæêw☫ɑի]Íäôš]*³¤U÷32¬äšÙÈå¾§}{OqÕ\@ÊUvÆé& ߟç8ùÈ0ÂWð¸ñýýãv~¥ñq]œrÈW_Ï^Æ0o*™Üå_n?m•Ô¹¶«SȬîE,f©hp]—‰•7¼ÈÐØ ¨~¥QšT‚î.°¨cµ¾üðu>¯sÜ•JHö‰Õª):+03at÷Üy"®ŠêU;ró #À!8a™Îx1*øŸÏÚ9œ’*I¹³ˆk^ΗåtŒVìÒŸ$õ²hâµ¾$Dø¦x6 ¦¦5¨¤¹YpK^± ›¹%U‹jÉA˜ ¨×>Ô%TU¾úü]•’Éú•Ò Lz=ŽE«êÝ;‰$àlmH^9[S¹µ1íæ§2s‡vwíîS½NS²·™„À0ß>@I;Ìåe¦ý» »ÐÝn{×ßlžµÁü<µQ,U¾ç„ªn½éÞ‚Ú¥ß-$úûIü\b??ƒt[]•òá,ÛÛêîW|>9ª;¢æ÷OË\ÇdýË¿ü_?üøö—ÿö“AªÌ.{”ÿãüoÿö×_óšëv»IµrAPÕû§‘fZµv¥T43Ñ;ûFÙÈVwH¿_BŽ¢äÓ6òËlIƨíUm ªÒ@2ܵ»UÍ–Ô„HP fH[…†¡òÓyÄÆ–]ïæÈ@-õ¶æ"–@°Íçî¹ NP&¨S¿ŠÝ}Ïl[ŠZMvk¦bsŠõBÔË ¤5a¯Hi`϶ªúï¿6í–Ü9È]ý‡ÙܾL²ÛÔ…†PÛ ¿á7xuδc<×tŽs2+W)GÜÍB”ZÇ|Ï«~«ý×ú§øùvÜoþ\3Á¯?ÝÎ{ݾÿúí—e•6àý¬û¸sMØÁÎNï4^ÊZ/ntçœÏ ¢ÌšlŒîAT"g£X…’¯ÁQIpîe©w¸ŸÐWN¶A»«ÐE§0èƒo¾Ìw[t÷3zÏàÀ=TÔU3¢ÚZhµlfí®­‘&4­l{ƒõœ³»Ù2Øy~agÈîºÌužª6Ó07Ѥáê F)EïÕ ÁX—œ1ޱÖúÝg—« ^;,‘2ÈE‡¡Êçy@³gÕZÝ.sw@¿]"MÁ¸}™ëC–îòümø`ÔUi:¼ën±¶ÑÑô¨UÁµòmŒa¤ÛgOÊbAóq;âýz—Gd¿;®…ÖŽ:·Ç….뤄 ƒÆw=Õa®ç 3·¤íž¦Aš-Þßþ‘üustÓi}-Z9*©eF ”Œs^æü’.Í/SÃnÇxÏzo\Ù+ÿÙê3u¯.Ñt7öæž`Ûƒ«ê³dñÏónK=Ìðóÿy­üåÛó~ÞÒè4Ûøù†$ŠñÏÿüÏûÛ/ÿñÿñx¼“áG%̲õ»@½|ËÞUàKͳ­’I¯*4ZÃl|J}‰Ü}b Däpt·@ë€è­ fQ¶ µ S"ºKÎ`£« 0 H!C€»ÜÑÝ@¶S…±Í¤›y ±¹ïµ6Û±€‚;(Á€6¨ä/‹ÜæFT—mCçÔ«êåQ³ IÞF€ ÓvYñi:“bn„ìV„Ìʲ.µÈ¥vu˜™hfe½Ôú„êô¾¶¶)Æ…Yí‚uÍ3¢…kÎðfF•EZmÖ>:Èóß¾Í_~¹¾ž¼ÝÎóë͆ÑëíÇÛ×nþÌköõí£¾?FD®}© ´‰¦4Kïx†ª7²y]yœ·dåÚ~¨6ÕážÄ#;Å$½µyB¹1¼Ý]B7}ë²;­ ªCâ`„ѨÉ^òN`ù±Þô®êã¼ypÎBbŸº@L¤,"+Nªˆv{vM©h IDAT‡69E•ÚÂ]þ ÃýH„Þ´ÈCpÃc.A“ìpŒE± )¬Ww*_Ž*¨Ô8îWÍçš3×èc£’ÒàÇZ!G¨®ÝJÚÅç nôáÞö³SšJtkë•×5…ñÃýZÓ ³£‘æÖÀ³sÁÂG/Mf­»£š}!æÂa>s©³†q˜¥6þÄÏ¡C¾ up˜l.T÷—?;Îuå|.Ã8¶²½¤6£+ܬkåã¿TQüù[ÓÕ=„¼VnV€aÐܼ•jéý·5n€­NÄñõÏ·93çšþÚ«<€Ž^ Ë;`7Ù˜ Áóí~yý:¯Äm-?:á>û¦Ô\¦¤¤9 TwåÃÍŽƒÙ¨ªë2‡®µnç×7?«eiÕ9kòí%>¦ÛXÏ+ªBùÑïæmãî_lÍËA[åÄývÀza><›P€Ûí¦ì1ŽÊLŒYjf]«”…üjXê PÏF×a¼ßLס²6÷z®³â£ºç̄ڰ\tõñÓ8»y=§Û0z7à“ªUm-¬¡íY-"YGŒÔ l=æßÕÎÿ‡¶·[’dIŽôTÍÌ#2«ª{ÎÌË%EøþÏÅ.XsNwUf¸›™ò³Ø;ŽQ-ÒR%õ“™‘anªúé®Gï¦au.Çq¿aBRusìâPŒ³¥BTm¨þ€É˜ÁÙ•T¢Øýg‡Ïö53l¬)7§œà$Em_M‹äÆ”_7ÛhÒÝÍ Õ´Š“%î ,!GtŒQhUÃl¡°)Û¸"ÉlGÕUÃÏ=ÓÑnt]—Ÿ©¶Ö9ŽÎÜGŠX}%óýv¯™˜ ¯Û>év»Í9wÿÜ ûa¶Ö2³É´piO¤”úÛ5®û]U´mjŒ¸:¿rÞÎ3`ÖÊÞÖÝÎSÀ–Ènû™úóG¿Æ%C‰#xÎŒˆ0”ÐNm(Þ߯£×ïçñ¸~?Žƒ°#Μñó3oöxÿö±ÖÒ«sºìù|þù/ß¾½ýÿç_Ÿ9­ûg"¥Z]ìbŒìÊê½ù(ƒ„D[4İfÈ „å>ý´ÔvÚTi6=–™ƒ9d•lae'ïÞRÕ:2©®MqÕ¢{J·ô»·›ªˆS†l|ïÞX ôš ¶-ƒ)91\ÜmëÕ+Wn·`,ÀÊ„™Ñ²§m|~æð0øZóÆ S9×2³ˆÓÈFÂÛ”\îæ´ªX²–ýò` :åØ7`¢mƒDáDåÖj•„Î$ÜK—ÏGû¶=À »16œ8Ì)˜™×ã±_!ˆnïVÛ#°qÞ¯ç 6ÞÞ®^³a)öÇ_ÏúŸ¿¿»¿}ÜocÜñù:oÿøkÖçóç5ÿïù×ëSƒq§áÍÈd·`gwE–›Ñìšj×|Y¼ÌÄÎÇFÜ © 25:ÕŽÑ%[±ŠHW"¡a…hTZêüã6ÊœvcŒ©§¬'çÝVC€MI$ôÝÎô#³Ãâè2OÜÇ:ìG^A»·±ÉUVм„U‡Ï¡³’w»Yùz>~»ÝŸÊì~dÂÛ¬é€ç¼ØèÒýö=Ÿóù¹p÷3<3e½­iF¹ÄÏœbÆË$æ–mÅHE£ºÇy[¢«‹ê1=5ìhÙTýë³ýöÞwþ[=aÖß¹Þ#®kU7ï7ù¸:ýê'œ.¯µVÍlØÔaüößÿ퇽½‘gŽñ¹¸p‘3…Hþvðó3Ÿænádï¨aÝÌã°¯Ïë_ãííöö9®yãªùíÇ÷©ZÞçPÏûyü'Î(€²Š•}˜WÕ[û׿Ìð?)¾ o±þ¡ñin°øü·¡•&oy•²aÁ’h·aQýÇ…ã‹xÀ£Ì®þŽCúù³-Á>¾¡ú¬ë€ 'Øžyú9VŽ©ãG\ 328Ö°^ õ¹–æj÷4Øí\¼p×…çÁÕUz[Ìt´f—‹Ñ¸XëfÅå#+óà°‰kŒel2Ѭ%]ï7¯LtëéîŽa—=©Õ«:iãPŒçà¨>ˆ#5;ƒ‡`“ާHóãFßåCé­6 ½:Æ{ñ¢ß’lá0Àº¿65ºå‚Ì&ç£D+´êÂNm~í\ƒ[R °f­n,{~2€ÕœãÃk­lƒóøäS0ÉÌÝ–#nvÙ¤J€&®5ÏóȹoGšù0­*•·»;ªQ2êýu–¾ÒKn2Ë5¦º‹§Ã½ÕU¥+ÆQÚþ³½ÍnD«+b¹ƒCc•As ÏVö¢‰¦Ììk~c UÕ§‡M·›{~VÁxŽlU•ìÕ8˜¹`´pË^ã6®Ï‡-F|÷YS¢«ý…jmI‰Ý°MoîÖÊL ;<,ük^iîîl ·¹ ˆ ¥”v\ȶcA9ØbÖ(CYÃ~ð³e7ž•œʶ®ºçvÝ¢©ð±­|é~1˜ ÿúÏÜü¼ßßu¨Me9F‘Ö)#ÿüç÷¯ók^¹âÞÙÝRÃÈ» «ú| "aI6©™Çg^•)êƒÖ݉ÎaN˜g½èæ ?ÌáQuÍUrkSJ£*؃¢=¡‚ÒÌÄS±wF:-‹-·Ù ;"—V30³²emÕŽ’ÞåêCgíÈF¯ˆ”zúV‹diýÙUÔ ¹ñÈZZ“ªáì9Ù‹#Ç3ŸÑ¼YHµã-Ž2ÑZãòRãE94”ïcÚ½KÍTfv zd€¾ÉgÙTç-N¶gV˜m„èðØx=ÒQJêéÝNÊ©dQ=Êm¡Ó8-_‚Ž#ˆ9g©]ñÇz º‘óóªGÿÓÏç.ç_ó·ïq;ã<ÇÇ[üvë¯<>¿rÎúë¿}Ý»³€UM–;½rþÔ<wê:*¬Vݪ|Ý%Š â¼V©á> 4Â†à¼ÆzøÓç÷C;ëV¦éh:bá@.ä,–«nHÝÖ*VÒË:!¨ÛÄì™&FÜìˆÙÕÎêÒìwžHpÆ­‘¬Çz 6©Ó]w›ž=í°† ia™_t¯ÎJEÆa‡ŒŸ˜oº¦[7×ñVßÞîøâõxÒ ‰ŠHÊŽñf]•Èí霆‡'huàì…Šgá¸ÿæ«ÞÕZ³ÑÛØ ×lÅ [쑆÷ÇuÝÍßÓmŒÕúqœìÇÄeö<¬>ü¾†W͇©VõÊ~??VÉ–XÜÎcÙ-Þæ’´üÆ‘ÆC‡ÿkMš {˺ÆA4W¥Œ©~®¯pYkýì’á ÄuÎ.}xzp¹­îÿÌýGðÞÝ€¶ñ¹¤~\u~|ÿü9a‰ºž½ÚèJ麖¥»ŸfÏç-‡ªiÇ8nËk!ÜžÂW]çßÿäyaA8b|´q•öºõ<^@'iA:üѽ@k/P§•ĉDtyO1æté²áN=¨rïãЭ“¿¯Ÿ¸Ñ®ë:Ýf4ër‡ÑÖµNNÃGï® ©13Çy>ë:N”O°5Ö£®„¿ë®ö­I®ÂÀ`ôjvï Sµs‡.TÐRGˆÝ«ÆDˆKFóͬÞÕC$ ÚjU·5°IÊ´Ësÿ¿³çÅî>`íÀy?æõùÒ Ã¯^fÆ5°Z½†1ÀØì×8   ÜdÉ<‰k·a^ÂÉØ¿€ñ¥q°×ÉÏóNßÞuäóZkØvµ¿­ŠÆÝ¢)ò½è­;û˜¸Éf$Ñ wBnÖfe…çœÜË—îò9÷'fNrår33K.«TW½Ý¿ñK.cFÕ®)¥Ã»z±äVê–ÔXÜ t+uÁÌ}˜«[Ív¹þÙÌ|KS/®™èOBæ¯c˜Ãyv Q+ˆ=ËEo yŒíe€^U#:ªjóöfæ\çz<¿ž«ùáçÞms½…fvxøÛ{ú|ÌÇãqu³åÌ5ôÔ%˜8Ìs#ÃI¡Ým{C[=ÕKm°MÌ9`;LDÐÀª2§Ò ¼J´Ý‰Œk­R3xÑU£á0ƒÍA¯Zòfl™Â³•êWcȦþ‚æ@÷je·€<è{Î{Ÿ€!É%N”Œ ùØ5¬æxEXPUr¸ùð&-B5Ì‚àÛOI–F÷Ǭl¡áa°Õj"^l17´Ïͬ„î T¿ž¯Xæ©€_x•El• „ý‡í¦™¡E0hî…è¤*L`Kw³…VÕa¶¯³§@É’.:™j3)×üúÓÁï÷q†Þ8nïãÛÛù¼V Ÿ×2 Øû|>OqÀº*?8‚vn·l Õ»§èÇèÜáê73›Ù®Vâ ;˜öXÓÃHaòWAUe™Áݶ_Ê8RÙ2’ǺºóˆøÝ° ùIW?PÃ/3îÜn·Á(@½rFt{Û‘2õˆ)ËÅNjQÞònf·qÒ)ò©5<q=×z.Þìñóóí|7ŽTg¯¢3hîÂP™ìv Ežo8`GÆ™f ‡ðæüúãgX„½ù”´’5Lã¦ç´CåLBk&W…÷pêy=³¡a@Õ‹á™iÚpýÛÛwe³û¢ÏÏÉãôÒz™›èÞìTÇPÕr³ÖSÄ·ãVSÍi o€W½ L÷óÖ³zí9XîU×ìî¿·vÿ(þ®¯V°SPv4Æû±~/ÂQ/Ú÷ûÇ¿þþxþ!ðÄøˆûÉPâ\Öè­ó'ÐѽþÐ×)s`eŽÁ”zÀ› ¤Vg–z®žë¢s…|Ø"a2ðÍÇ*,ÉÃÚl5L8ŠN£pu 0_~8÷b·¦*‰7;]Ö]ŸZSZè®rÛ¤g EΆ&9/w7³&`ø9Ÿ+XŒ@LGE§klê¶ÔÂnI*aC( Õ¬)ÈM|J ÷OË<ÝÙ¨RÃ492Y2ÐÜL¸Ô»•$v}€êeÍÔp’N¢zˆ-Ö/ÒƒfngÖn 7ÀZ&€°†Ñ ¨¡"z¢v?KïÔ¿±sïoܹ­rR.s§ÔòB¸“zÑWm#¥L]ÐvôÇ+×0ƨʪäŽï8'r©_¦DYa5wµ7‚°m§¼wðÖd>Õ“ÅZÕÂ*7Ç.â5Ê d©M$ùvœ[[!¨Öx=1èº×••z Be]õtIÆÁ°,.Bôf›6±q„Y˜éZóUšV8ÆP5·£Ø#È/µgw¨JÝÆþE‹oto{ÎëI”$ UÝUì"L»š«ÕHÜß°Z‹š±-£™XÕßÿüÛóZU¼«bÄ~ mpÌl¸iþ ýã“ÊMÞÐÔ&^£á/³Én!ÝÖã"!®g’#HŸ•‚¼Tè;jªiV-PA‰µ·'Õb#/,Úå÷¤Äò|ñtIUï2 ß50;*H\°’Neü"à¡„$ø¢Ñ(Smx¾¸»jIÑ-¹ƒœñÒ<_Í2J°Eh¸wÖðˆ—¶òÊ othS#fMVm–W‡8àË WϤÈêW[2°êÎ>ì(óf³¥Ö®võmiÖRñj ú5@”LVÆËz²‹æÍH0»Æ´Ã_­ ½û¨ ­Ri­> Rw­Tâªúºoçñ—ß¾aõfÃÞÿ?ý|®çÕ¿ÿxÜŽˆE“6#ü0÷ÆTRÍn¨Fx; ,I½[ :ÕiÕýŽ66Cã-b«Ä—zGæÛý+ÇçqP(Ú9Ù²ÒØÆ"ŸÐÇ`læZµ§IzªÒ®ò‘©BR FÑ(÷6UÐÑ€Y;PÛe§Wÿµ}T·pzˤ³ã6½ ½z:ÁnuZmè­Ã^RŒ T8ኾ¢Í¬# $ ·‘†VÍë:üî_Ï`ä*å5Š›2ejÈÛ‰c[ãf^P¤hµêMf­ÕÕ¬vÙó4š¬Ï´‘–"Z‘3Ï3ºr7¼‡×õÕ=ÄQ€9Øo8»ôù¼V1ÆYª¦Þ»\O6¤~¶.*¿þSæúß&šBgÄŸ¿åºìÍy@oÇÇ_ÿøòÛßN=*ÆâéþçófŸ×ÉgB9Ï@X×J¬ŸµvŽiÐB^I5V;ÉOkiù*îùá*. ÍäR@\óbÂipÉ0íÉš»Ô…2“€¥iÆÓà ™K>†tÿÙuû˜_[çèÞEÇËQƵÖ=ŽØ%°d•LC@auðá먒¤Ÿ· –W«ça£á‚="@ÔÚ£m +?Y_®††sH‡LnË”À2½hz°§Ü´åJI¦…åè–º]ÕËVƒ—ÝN óúiKÖßw·ùüá:ÍÞ$Š™¶ %puÖ·âÛbiê0#o–^•Çä¤2+ Oì««ˆ´ö`˜³Ò‹¢5×uŒå¨Ì`8†þñ|Ôøýü¿~>=þøö~œçy 1>îøoù³k­õÏ¿ÿXWEÜ®¹.ó?Ú5pðçºU|®Ï¯˜ßñæÅmÇK;4oÌÚù·Os[¢âqS­ç‡È>Ú¬‰?_%9k€Å˜çs¶ \]iÝÖ4 7覾KTwÕôÌÑyžãê+ýLø³Ý§»™ÍÏÇŸÍÿúû_¿}ü6yfò7̺ýÑQ÷«¾°± Ùµ¢ó#ß~ lÍó£ã§ô켯g‡Ÿ‡¥ Çò9íóV~ÆXTœ‹Añ>žõÌL”ùXÒ§æûøá(Åqœ?þˆûÛù~X:qy”aFvÛW?Û N·y) +Ý<:d>ßrŽPëþ×^ŸµÊ©ÃÎçÝÌþxü÷ˆHéo â2X&>ãôaï½Ò?Ç%ßN™p¡¥UÏï3ñÛm|bæ¡J ÙÁv¦R}óóçã?Sqþ‰¡t»oH`…Tâãö—Æ O RUýóÏß§*iã@9®üãªOã8" _Ïç½Ñ(;ùsýèºýéüöî·žµríú¢vp…mZ¦ût.k˜ÝWßÌ%½#–ò(šŽzÖm„ÓoΩð™ŸÞ0ssž…jg Å›ì–~œ’£p‹±Ð4:×A7cwÂ*pÍbY»a#ÆÜ|¥ÊÊP!ðQ»ŠÉ ÏÔ&we6ªÙÝ]]m(¶Œ üJ×û®°&MÚåVªý¿úÙ`4¸Ñª·Ï9/tâМ3Õ-8úP]k$o&Öà¯ÚÞÍà&ÏðÜkêN5 òî&ó^Ó%£LÚæSþ-ù ˆP¸ˆ6îþJ ÷F»¹ÏJÛ;ÑzE HаðGÎa¤´™ì,h‹çôê¼b¯„¬µÀÖ^sï^.7O\n,!óÚN‘™ÓÝw‰ØÍW‡èþ–Ýõ.×7÷q ™‚l?Þfû+_Ilü*#Ý7¸qÿUÍôØu»ÉêNà0;}ÃM}³}Þ&V›vV˜l""œØ-²úx{?x`©­^pØn’1ÂÝq¾~þü| ÍÌd;KsS¢^4û×{ -„_û• UÄh¨ûuFò†ë– Åâ0Z I–{P¦êª†änUí×u8z^aÓE¸¥}¼.^™‘×õ²Ný¿ËvJKUå®ýÈ'$¨©Ìܡ€A ÑÈ5L’™¬qˆ£áÒ³fRiêaT`ᘦ]7Ã#¨ÿÑîn›;[s‘‹Ò¨m«Xf)T·¹ï::ʺۜa½qÉx‘Ôz_Nä‹é‡šküÞãÞÜeK$ @wíÈXTƒ4ã¸/XÉ]ëùSç7S UÏ>?mªk £.Iº˜4zs>ÖmøÛVX½v0îã×KÌZ]Y«Ù¢®–&Z žöRáö!Ãêñ¼êÏǧ¤8­« ÊGUq¼ºP!>13 r“m^¼%´K6õª²Ú&h¸7aîʪÝÖ›–¬É™èÙB ]èV/¸Žã¼o‡‡\ìÝÂæœlmwfÍ$Æûß5QüúËüN/x6ž£ËÌÞù¹Sñõóg½½Ýêj ýØ:IÉð¸Æ qà®ÎìŠÀ¾ÐÞŽó­O§òËFÞ‚·ÂŒ~ˆî´}vxPÍ™uðÁ‚ú·½Ôãsá„âkFu…o÷€Yײjߘ ߀•¨—bÕaeÖ\jckßeaÖ tÓ9h©;¿ê"ª½_>k FqÀé°n§ ?º–õWçavw; P9`Jx ‚a/ôuSò‚B½[µ4,VK@³úW8nعv8÷¨vÍ9LÈä¾l·Æà%öΊÀ`LTˆ"vô Žå‰î¢0 vé»6ÓÑŸ%ùKÑp“CªcÐO˜¯µ¶…Ï¡µžÇa0ºCf°^IÜ6S•f¯Ç/gDƒO¨€jÑÃ…uR$ûW½«p "!_ͬ”F u²Ùݛʸa}µóÏÝ©vißÓ· ƒÕÆX˜43#a£g/§…Ça&µTÁ`°|?“àâFñìGlÿ¿ÇžÝæ«Ý»gd/ñýhb.[od“t8Zî’е”»ŸÓùêck@ÖE˜‘€­W h›™~™ô,â9çë¯çÇ}ÜÙ¸HInnfÇãþý#îçÛûü§ÿñ{Wj;”;û8,r7O‰û~?`íùC¢Ä.AgÌ®2kÊ…aéÊ&}Ô­Þå®Ô^o6Ðô}¸ß[Š£Ötw…w£-öÀl.x¤—ìØ»d{Üî_CÀÖY;È'{qA¶®Ôû©H襑d;!;Ga”ŽcH¥ ºì¥"ÌŠý+@ü‰[k«¶‚™Üè†AÂ+ذQ†™¯‡NÞfR Û/K6h-ò¥þ¼.€À=Þʺٵ|˜h/¹4mo˜Ü¢‰•qŒ_¬9ç®±ct0æd{Ä.vXêÃKFGyãx?N‡ÿõÿö“kÚ‹2Á·I\ÔVæVUÓš˜X'-ÀØÓzx^sŒÃtÓjkx­í ™Ñ ²Ã»åmu©‡ŠÛôÃ.< "áldé‘ã<ÓÓ­F«Àˆã†ÏcË–º,èFd©ÁvYx7Q½©ù(ÁÊ|„â0rJ¥Õi»<t÷û¡cN#ØF>r~ŒXUª²¦‘G€»É¸e°£»/•Ÿ·'ºËgW -eÐV‰6fw:yÈBp ˆ òfޱÊ]qX+sitrˆN[¥ÕÅh!éMi©!÷_›O+†uVå3*¬qg\¨4(L¸iüü»&Š¿sþXV K†çÏOtÜoªÑÂÂÐWåÉ]cÈ[ןçøè¥·eD-ù£UוH´ßâŸ=nq?]}D¾¹ÝàŸ,cÉì€ÜiýcÌ·¹î¥»ÃØðL"à Z«:¢fgW®ãÁjÆ æþ¸ìšu¾½UUã‹ùø4³sÜ‹Ÿ¶øŽ˜ƒ¥¾5c[ÿÝݲYùuÜ~=Þng>nGä?æû N FGv®qU ? gŒiãºÙ¢õy =ŸZËhŽrК„ºS.IñµÜÍ×ZÎ7¸Eà [º ƒdïÂ)wV JPz§±™ :·^Œ_§ç ¹4ÑÌ7ÿ^´W{rÁÍ¢1éòïzÈ6ØDÀVkIÁ ¼W¢»¿¹¿pX;ÄHàí<®êÊ hmâV:ihôöL’’[8‘›?Ò°F$ÔP_k31Ïq«®ª¥5Ïó[¨¢ÚûŒ®lãB§ÙR³òfj“…ùO €Áp3míKð5÷‰z§Xñ ÷n_£™™‡Ÿ©ë²ŠûV©Qmì%3‚.ۦ̡=«AùFõg>‡l}+»òð7iÇÿ¶=ò­ƒÝZ@ïùcÎÞó‡sN’n6®Ç“ã¼Išµ²@V´l%ÑmŽã„‘3ƒÑ™@ÍÃ"äüõ÷×ñ6Æi§lÔʵÖívËL;â·?}sÕ?¯kAgõP³¬¿<aVíiàŠ^[Pn³Ê;ƒ¥ÇºâãìN+„ =ÆéN[ÝÄMÚ~RmØ›!ÕL?⺾Îq«ç×mÜfÍéY®Cî@4Lp³2&$±ª[mU 0m IDATÁØ)gm‹Ö/ª;`™…T«»µ4FQIÙU{ÿq§ ©îêÈ2¼V 0\R# *ÒŽŽ‚Ñþ2V…¹ÉŽÙrüê^ŽØHxñ³{Y÷G^2£ïæ˜é7)°:±m7ó/5$”RH›| þÝŒ*cÃDývëK×3;õþíûBVöyuU«Æ8ŽøãÞr„ŽÓx<ßßoh4NoÄ{ÅχwÎ+Áø¼~ä¥ê{.¦”9Wåq»ù0<=ÿñ·»û7}©믟×ú:yg™:p”ùé€ÚÖªªÏçãÑë/Šw‹‡RnE ^Ê«ÑÒn†±ÚÆ«Yžmfr,çoÏn](™¹Âºê³*…H?•7_pU¬ç»«Å¯x»]+ý°ÌyV3Xùü°¡LZÁ¹Ô†Öpw ª?ѧÚÚŒ¼„ð ps4˜8Ü«Šo»4y [¹aŒÔUç80»ÖBKÄpo­ìïG}-çÑÎ/"ªEà>ì1¯ã_óÇ• ‹óØÓÖ»}ŒÎð»~'|.a#³;ѽðjÍñDGÈ̸ÄUo)_‡$mU¥î£*ªð•Ñ6ªùq~hÅ¥Oy1üÆîÎÓþã¢ñÿ÷ùã,TâǺÿé¿T¢"{&´zܲ àð¸~.Üe9õ´CÉ/Ú©ÎDrâ-<ÐCn<Œ3úgØå =zýÀ¸YõyWy?òg;Ee4ºTåmwïãsï_¯ŽŽ4SÄŸÛ¸›„gÎÃÆGêí8y©žÓܾ0võBx½‡u8ú¸Í‹R©@z›•Ø´5?Ó¤c æ*؆‚ô `uz¾‹ªH?žÙì¡9®³m´íss£k«"!Fƒ?×Ì6Ø1H6›ÖÙNÜ–&:x`¥z7à^@ÒÕÂp™œˆ]Š!™òK=ÌÌÀ66”ê(Yx‘Ï*ÊÜŒM³ìW‚‚0cld`¬TÆ0GP7dw/»u¦3ÔH¡ü´'–×-ð?±¡“> ”£<Ë%]C†UAÏŽ¬‚EÓ¢z1vL¤k{'ÖDö¨Ðyˆ e¶ç«¶n·¡Úµê®E1¼ƒ*늠7»­£D+wO릚–ߥ>ØÆÉf2ÚîÝSÑk—Å”ù²Z“Ã[®6ˆ–Ä"’Ʊ ¬‚œDÉ[d«Z¬"³+ÅÍk–ÙcŒîfÕÍ3ÓŠV;NÀìîô»7@:ŒNI‘yž'³‡™1,\¡§ =;°G8œ·óÌ®¢-ZaÞÕ~óŸcÝœã|»;§6 >ÀnÖjF|ûËoã1ÿù_þuu½½}`¯ŒŒdk›‹C¾“½Íy]Ët¾-êQÍ4Ó!šðsãq ô n3ý·µy7Æ®á·ê–óÑ3½“˜-©ŽjcWžÂÀ(ö'îÕâ¸ÍÖæ—s€êªU{ëÓR겓•N:8;aÔ¾ä`-•­1`ßÜšÝД¥l™"`&‰jÃ×.KµSƒTç;ŽIBö]´ò(¨ÚƒÂ=“”Ô}ø1†ÍüqSˆŒs¸àÕwõ\éþ5\7ïΞ…U#ÍÝiv‡Ý‘ǼÝn>@Ž¿À#"|Ûw׺ŒîûmD˜Ñ¿ß{^R}þ|è'íß"üà¼Jý¨ú‘”.X.…ùœ+†áç—³¿ÿv¿}ÜxÕè>üÀÇíÿ<õu.»žzü¾TŠ8*¦¢£½+gtV[ã(;qŸ ËH¯ô,k­ÜaÏúÞoÇDËnu©&Pƒï_>­ÍŠPªjœ"º§¡€ G,aö¦Xt¡žò~R´üÈ@E%Ø~Ó3ª®m• †ž¼ŽÙ\AoÈ›[vÞvÃ9•|7ÑåH¤ÀНõðwX;3núˆ¤YßÞ§·zÕº˜}Öœ~q|ÖOÒì0táñîö–Û:k=BZ?>Ó­âœqØ-ï¼ìé˜5 ßçgÚ2ÀÞÚWãæ7|}ê¼?Â4ì¶òr8ò»éŠaðlÒ¼$ÕÅÓŽXÓýü9Ÿ=aÇkFæÓ{¹õ…8®øÓÜþNûéßÍ?¥µår_„Ù€Ö~ãmÌg·wºy?Ï[ëºòxíš÷ïõ„¥3ívÜóYïoo—æï=Ï#ªŸÕF§Œ“bf“îh¥¶É_Ìk:˜9í3}Œ»{\+3évûx¿rxî³Æ—úÊU·XFÕZé?Õ½‹êÛxìã<áúÊ ³‚XæÓé¦ÎI7sæ$ÑMcÕ ÷F߯Õ)‘ts´,vöœ*óAÝŠUÂêáÕÃΕ ;_‹]&9`DKÙ»'hKÇ+ð¢ÜvGª m¾™§ËØrìŒJ†$©Ü[ýûèÏàNûíãZŒã9ëîuwm³1æ®Wì Ž¦f9"Ÿ})A<,æ%ݩǃÃ)|5øí ¾womy]i‡ùÕ:Ð"MW¹·[È„1·ál5e¼ã®L"LPÖÏ×^VO÷;wò³›Ww?w¹šÕW5Ð¥áÁ›x`ævÑ>,3qp¶ésU8Þ#2ý^¡V¿ºÙY¯´œ4¶Q_pÛóˆDá¯ó[õÞ»Dö …Ú>óxþdÊEÏ ¯²@ö¥°[¸”Æ#ëÍí- 8-›¦tÞ)0£ˆ­ñ¹½ÍoËÇŽšU0\kokõÄ|ÚÃÞ;“.ƒYöðÏ:—þ3ý/zý{h³~J‘æå–ÿi÷•{-ýDõðy —>ÓÞ^°BwTLÅ\é#¯Ì=ýã,œx<§º¥ªö0x„ûº*Æ+·y–5®~¨èO™äJw”éDµ:¬Ã8ÌöZc쮂&ÙU!¾û,›Ý1o† %5)ƒŽæF‹Þ3BÈR݉’sξnu—›)$—¡µÉ&d½w+i×Mz°Q„œä¹ÂÜG ±vÞÍÒêÊLwÎ9û{¡õ/+v4·mW²|ƒÐÝ®ž°£i¢¡_Éòh›Fª¡^bÙ„ô~xÖÑ)ȺPfæå÷:þm>VÄR­ý¹÷ Swö¼ˆ¦q+<‚nÕ¿”ÝÔË’­N†ù½lz¥r¯6‹ˆþ*üÀ ”k”µÍhF“ã´òfeñó|ýûß7lZ¼Íq[¾Ü!ºÃ¤ÎêGŒç?ýÓüññzýØ×íÝþÓC³RïnF<è7µÆ’ª4b°ËKÊLμ~¡R-÷lxpòu}Ú Ö±ˆƒF­Ç·Eå~Îûyq+MíVbˆÐ‚ w5Ý^l²žãR%õ~kDØ2|qæ]{iö)i*B^ñÅWkß îÝã>ße_çmSm6ü«n+à¦iŽ]ÚÑÃݼ<ØÑ»Ón3ÈÁy<ñˆ9<ÄÞù¡W)Ÿos˜z-©s<|§•êÚî»®µò•ݪÔÞÕ âž8^-¶` }o특H®¬|ÄÙD#ª2ӌ–ê7¥6¢í½Í@wßW[ªò5ž{åZ-òh>Cê÷ß>«>ö_ßßÞÇ[üÅì¡¿Ä?ÿóóoì³Ô >v]ë3{!šä„â!4µWÐë|w§l½ù ¾‚E±”¹# f\+S/×ps"º«“nvÔ6 ãq8MâîìñèUÝañÞFð5£,´kO3Ìx½^öxñYÛdK ì…÷'ÍYÙ'ëÞ–2)ïû8wÛµÏ×Ç;îX«ñÒ¦!ÕÏvc·N£ù8šFøõù£P>L#d؆zÙXx´8ƧÇÏ(äVm±c°zmUu½3@¦:Ýáù¾?ÖËìLŒ8ö®²XuG´ý.-DÛ!¼Ñéãeâ#ÿø˜>¾ß¶°µwçB¿Èâ|r|sC¥ú¬9ì·Ìß mĤmǦÿeœ2Ö,E+×Ú¿ÃÑÅc¬Zõöľ(„)?k¾½ï,3óÌuاêŒ_h¹Gq¶%¢l½¾cxí÷c˜¿­½=N•=ãT…ò¯`û\‹–è6ÅÓÿ«]lóü9ê5Ù>~žz§?Ûž¿”—ú“ûoÇeÉ'ßbmîÃHe%ìD©ÓÐÃñ÷ Òz+ûk»wŒ ¦~8°?Y2iÚ`5š|?û,Så…ƒ#.;rž“eÂ*!çxë¶V\Vbktš±Ô«ôpƒºí#%c@VC Léq%Œf.¥uÅVŒ ­?ÚÎCO tÔk,Ònåöì„ש³Ý£na¦­ŽIeI}І®Ë+\oÛ=yJW$ øéÂÄx˜¶24lqè½R[W»£@/z”ÊýƒQœ T§é5£uÄ€Pu¥!8`£·õÊíf¨½PÂî^ôöö¡8ˆ¯"[qc‹à‚Gì]‰ÞnG3îû¢ijªPÜN»c™R‚©9Z,Ýt=Äz 2¬„8i$ÊU.bûËê@½àBá¾»‡"É„™YâvwÄn=qß—pCÇ[Ñfå-œ}qê/GÑ–ªÚÉ`ªåîÓxêÜxgƒÜ=Žy¢úµYÇ.Ÿ3.MWöxçÞÀç¿:³ª¤2CörÏ¡3¯\Õöö˜Cˆ&ÇX `ÊL×/ïãÛ[ÌÏïÿþ·UõÓt¢¤x— ê2î„d£5ÙOvFçAe«Ãþ€eÛlyW,¾ãYâ® ð<ÏÀj‡­¨+“>´“ÝGzÐx쬖½‰£MΑ^yŸq%@^2šÓ¬»©®•ñ<„hÊ µ j3Èj^“. øÛYÊüuÌrû½s)Txçôâ¬U.ÿþøŽ}ÝIß0ԗ‡‡øÑŸg¿¾O—|Úx?ܽÿzX´y«:Úæ P:N Û{a““Yü&â“Þ¶_§Ô½³vœ¯­ÞT¼?>t^¨úõùå¨Ë2u¨è¥·[?â¼ºÚøkÐÉ¥R‘n÷ê6Æ4±ËVÎŒ‡óeÙa¹tìÖ•ùç×âu9£¯>/“jxÉüzLGé·Ïõ¯k­ÿÐó-þÏ~{þ|þ—Q´Åì¿>þø¨Nη>r­ˆ³Úo»õÞãÊÉhßççÖŠ°UÓÌoKU4Ñê{=AvÎáN·æ5ܦù¨RSB u-³1Þóq¬óúì==Ì®CÍü2.]KI—ÿ7=w׫ï2É«¯%o§½íTV*ðœŽöõáײ}¸üÌž~eó$%MØ[NØ·ç+õT:òz­ñ|›Ž‡;€@òû–oH*çÉz œƒ£ÜÐDdfZzív¤7ÙGÙÕø„ÊïÏ׿ZóÏ•Ï9~üôDZ{›föžõ uÙzÑmúó—®“ß/ÿH¿4Í× VÕ‹´y÷=Í;j)m}k®ˆÝ¼>M¸ü ¿ü'ž?Ö:>=2«±-SùjbÌhÊ  dŽVy"ÛsèɵzÃìèÖ  €…ïÀePˆc¾G¡^• J…–«LP Áûe¸L’TŒßýóÝöºrЯŒ„·qÌM¨Ô§.3tw²óˆÙíN|õo-[Õ9F ©ÂÆK€wç^y2Ÿß¹®ì«1Ã[¥ˆbƒ0zuK\çÅqç<úï -yßcB¿Cì•È€š$̓ÆÌMƒÓÊ»IÝ-†®Âivuƒt÷1ØÐVß‘þ›ÁH3§Ã'Ëdº+‰w4Òð•Š"Ð áÖÞº:Í,ÌØ7ÈÞ÷&àøÂ˜9Œ6³\jGªKÕDðŠÝûfßhD«Î§â‚npPµ–À‰ü‹U4eÙa$"»ê®Ü nZ¥Ý·pÏì~qÕè/_-`_žÕÊ”î4îæA:i_`¨ÈÒ¸ ··÷äOó²d¢nM ˆ&Ôy½ _d¿?{ÅwRµÕÞæUñä7D ·¥ê.9Ó.w'óï¿N3 ôî+÷ð»Öœˆ¯ÿ}3Æ%“þaƒûŸç7Ý­jÐnIÍF‘0W}ÝËÞ|°»|‘ú»)æ« ¡Ke*W=d&72|dòZ×Þûùþ6Ý]–ÕêËlºûÝs&ð—_ÞÑùñãç—fVÊS¦1|VFS­n)/ƒœý›ŸÖBWܧ¨vëÞµ *"<†Í•À[“z”;¾Ú¤L5¿ì?]}[ëÇ4bÜ$±[Lø]²^l˜Ý7MLºÐ­ËÊé¤e•™ß¦:ì÷;÷º[j :×µÔþ˜OÎëJàx<ÒÁKæmÁÃâqDL÷av@53ü³æàã°AÁ,t«|ÃË^Ý‘¯µÎKâþLZí®Ò:÷:÷Ú%ø›u¡s„n4ùe•°¢~žg “ß²I ʺjºý¼Õ»­ ¾YD•îa‚Ñ<¸´ ]¶AÉ›Œ¿W™Mn!ºH«å²q7ùÍÕ\™xVçq†m•¿ýíÇOÔ·÷Çãñæ`>G<¿¿ÿõy¬ÖÕù¯ÿñÛöqí¼I_r ê“}ó`+hÆP×*m‰ÖpÞwáãNƒÒÀ^ÝY{QaÞ$BØî°׺™{ª=eÕÕ)§Y”z ¿Ð«3©¼aw×”w‡@wW²•Í6„?_+ÛÂŽñi•€h¶ñðhfý¬äk§úiþ„MŠøiÖè׺HáŒUÖÖEtP³[¥aï0ÞïÀ4_çízz ‰}¡‚ÚÞ #+%ÁãÇkÕÚ}ÄiÛÞföËïÞ–|¼ÎÚþ±Î~øË_ìW å#ÐÜÝ—±…pûåùv•vqK×ë*êo}\h•.KÏQ}þo(þ÷ΜDëªëx˜ñ^Xžò'Œ‡ Á#?#<€ývŒð>ÏsÐ|4víýëñé—¸+í¸‚Ílùs¼T=HôP;÷ÂM|ú°/Û;#Ž.di©bãÕÈô\ô1í÷ÊîÚ„¹| ¹…âªzŽ uk'ó¥èbŒFuç°ÐŸÐÎ8bºyí8…c|ÿ%’£,”/r{¡5HwsJ{yP‰åAšZÂýaýúxÁLÞýCÖ÷úàV—‰#Qÿ¸ÌIݬ³îX™Á27Ý<¼ZÛXüº6dy—ïµ´‚7¶…¤¹‰EÉî ¾ _I†T•­„W>X” ­íºi aNo‚T«ÿq!„Z m*&=«6Y†FÛe÷óâA’|ÅùuQ²Š¤™m÷UVø‚ØîeO/çþ²ÞÇÑdHüºr³¾ •ÓGKI¤‰tk޼[Û¸÷t$fæ  ÎaI9@Ô×{}ÇA$NºgâO”ÉWï($½oµuíÌj3ÿ;ä·g× ¢ûŽÚÐdü¶‡Ÿü* Ç=2úºÌ—Û™•çÛc¾ïÕgwE‚5îÌæý¨ªÛýÍ»p#½É–ÌÍVË\U7 ,#y[Nô?=„1èNS• mc1|Ä{wÿûo¯9çû{Ì>`~IwOÕM&ïÿò×_¿½?sãóuçu½ÊT¦âWAF.3¶+Yä`ûwÅò—$”1Ç *xÅŽ¶ö)c›fÖ„õÎ:އ€Ï×i´C‡‘tuß ”!ÐU¹(F„1HG«‹¤Û]0o¿'áÇ>–Õj¥C¾?.¡¾}?"h{÷ˆÓ‡{Ø÷ã8®ëêÇpwsäº$=Ìß,Ú7·®•½ ×uªÿíõ ZØÀÊkåɹÇÊÞf†¦-C{ÄÍéž<¶E΀¹é83Uåp¿ŸH­ˆ®ÎlIcŒû Õ®0¨¡Ó-§fh¶.ëº{ëÜyÙt",ǽãÒF8eº»HÉÅþ>ËЧØôäCºã×Õ Éѱ¥µëÓÌTþ»¢ÿv½‚?ˆžãñËãí/ßžïÏ·_F&ã_þé¿eÿÛÇÏŸŸ?Î*4=â+`r0- æ]ÝÊ4^* 7!ÑØînãrÚmâa ›c<ê7‘`#*!ÕA…¬ˆƒ "Ô-«n+(ÿ}¯ÍÚnæþ-‰Æ‡'`·òÀ\´2Ûsêø|ðšçeì£'·õkFƒÆ°ÑØ v^½{ølÙî~<ᵩ˜4/ÇÕ5 'iÚéáÞm¥¥ºÉ^ìÛ|œ?ÎEvXûÀÓ¶ÒÛ¿7§¶º.ÌÄÄcÀKcm¤ãäÌVÛKÖnoïy}ü|þòþãüca9ÌxàªX¦„Ìo›„ã¼n¾Q{Ð$Sx{àST[8߯Î^P®ÿÄóÆïa Ëù§&ÍÄ4Ü ®]¸jôñ˜ªŸYز%L "l£W6ª4V¦GΊ¹ýûx?×YK@-‡+Qu‡ªgÄy &ÆðDæJ~¼õs,C!MF½I{¡RlXR½¹Ѓì\E¹|\{k|4°8}4Ð"ʈ¶J ]fq­U˜†yfQ> ·Ö½»ûæ¼$¢ˆÔ÷/À1«LƒE6#l ¦» sT9P¹Ò`„²2އ€Ú5ç¬M@š­VUBt@6Qï´c¿j9zÂî²/Å€ewu[8ݾبÃ[–…hcw¹ u™â–9¦¬ë΄/ÿÇ…° F¾C°®én&šV—Ýd›Í旽ƗÄ;3˜KâÆê–Œ›‡“îîªNø&iŒ²»(”q ¼!¢³ÎÎÇx|#þþsKp÷ëÚÇ-&•Ê2.”ü† Ý´ˆ{ÄC5¾à´ÿßóü}ñùhB¯p1 cUÍ ÷üC4Ã×)*°²Ól|ÿË·?~Ôî¶Æ€ ®½Ž?Ÿñëo–ô'„ûïóîÖ]ÛV· µwÝ6 }åp]ׯÀV¬©«+ 2ª;“èoã™WþöùÛ?ý÷oÇ#„-6 ’¶÷’èäx®VïÝ×¥»à¤'<•@c¨ ›,uÜÚ4»O3=¹­êü|Ž ç˜sŸëÎä%f»j¸§ú ºRƒ’ºªŽãè»Êm£{9ïûv'\è‘48Œ½v–:«ŽjºÏ9Ç3æèîã8¾Åúöí¿û`Ö§OÛù"™WÏäž–•+ø1ÞbÕ«®Z;w1S{ªÙW‰—lÄ“=ò•µj¾=“XœD?sÛN~º[<ÅãÇùšq؈¼–ÙõÞ¤,äƒhGVµó"oéÀ¦›‘VlÉE%Œæ"€Âá¾»§;›µÛ‡áN´³ª6ÑúO"^DÜ%!õ¸uzfNÄn¬«ófÊÜÃF¬ÜlßÙx¡7yã §‘-e1b÷úa¦önð%,ÉÝ&é‚0þõ÷ëŸsà¿ÿ·_÷€0Bÿý_¾í¿¼}ü¼þã·?žç~õÓÊxû¤aÕ”ÈeZì‹`ô×üòÙqe6«Œ -k(ßZÖB§+¢Íº–º¢é^èêª2°¾æŠˆëæ´Å¤ë6´Óç̺>Ð`ÔíötºÛ›ç7X'%{O—²–Ô7¸Ä^õ¹YÃíðPÛ®@‹b§£V½òåÎ÷q¼q„ÛçJ0õÞmm¾Qí·Â9hØrÛ“ÑЮªA³Ölx®6»Œ+uŒ™}ÒŒª¾Öƒ®Ïë1ž{+­>Wÿúë?ýí}ÿöm­38¸"\ú¼P#`0C€í\ÚKÙ¹9žRtʼnßÀðxƒyÅùy½ÍÿLþG®úX5ŽxW.Yù±«ˆMÃp½®žþˆbý¾÷{ã¹ðk_Ç^`±Ì;â8ÆÃ_çù8ÏñM¹×g¦Ë+ÒáþÑ;r=¼÷û(¶¯ãivCºÓXx;žë@¯TaÊJl¯ý`b˪ÒÑ6ºµÐõ³!×e-#k{¨Ü z˜=ÛÚ°å~Ÿ#²š[–8f–=è±€Þ$9Yýz:;óÐ jèºm¡)6Š‚–2μQå#>nqxºÃ•Þ6ì¼<€Ð•W{”ƒÂœï{×íËøa¯ÈŠîÄ7dÙ IDAT¯4—UÒ°l¨Ý]­íæ>±vu¯Pã#X­Ýº¬Ìe¥MÙy5ó-Y#öû ©$Œé·ý« v/gå7ÚÈ:¡ l±ódÕ›ùd¤õb & ·4„ˆ‰hŸkʤB²"¬ ¨&‘PRp°ˆ,?ž«.T>šÆ\¸u;¸íIÜß¼2áA?8Á¨²k§ÝÙBnn¯Ý8Ú3Èih²SK}ÿ§ Aþ'2ån1¦}_üÏ’ÎÇ\]fQIf­CÝyíÕv—NêЗìOPÝþ>ÖÚÓwËësfêoçÇ4»×Æù'&ÆVå”î<3ªM¼å…:N΋/l¡á•Š*3.]áy¼… ôn-1÷ع˜1çÊ l G§L'·OÇ¿}ž‡=Þ˜£å1Ãò>Ëuxÿÿòþù†ÿýçÏ×¹…þˆ- %²lì*æ6«éÏô©Ø²í²(·|ïù|ïFhNŸ Ž9m µÉ½ö›=T­Q$­‡œÊ&–uöxŽ9¯@´é6ƨïðc‚êÎÇóíŽÿðYǘ!²z½NSŠüIïÓscÔØ«Ïê~–ûÚY¥×Ùç¢ïݺ¾rŽÞēֿ;³Z]f£6Ê«fʪúj™›ÿÚ¹^{¡k¡yp¼màG7U²%C[ì“vM{›î–»Û·ùå÷Ðu|õžBvfñø¹š„µðò¨ Ú¬·í¥r˜1Vì-X·Ôp±žG´Ö›Á²n"¡¼ÒÂg Ï(ÇN`κž¯=cÄpуw~÷ +¯úñi²×¿ÿö×ëñ6ý/ßÞßft\gÿó·_¯úËç™ÿ÷¿þßWÄçÌ/·ƒ÷æçNi.7VFÈÉÜ»dUn|>wf[ßÉ}ÛtD%`ŠI\‰Ö»",|c…šŠZïì“k™¢'ˆ!¾mÇÕ‹v-º?= [g3‚¹YÜÛ×™8÷Û/¿$¥.±Üš+±å¢0ÏìŠM‹ =R±÷ü<Ÿ¤Ï·$[þ¹z¬~W±ÖÜô,TT?w=lf@̱;·ö÷+óD)Æ%élùŒÔ¿¤¯¬TÏ-0ÝŸ×6{ŒÔ cró[~Ôþú\0÷ 56m>ZÚû|j’÷¶³®+hnßóêNÜœ-_/–j¸ÇÑ•ÿ‰ç᤹ÞžºÎUµŒ­ÃÍ»+)´Çx¼ Î1oëý—ñ~^é†?¸9ɽ.,øv<ÞvŒó‰EÂí ß{­¼ ‡Í9Õ‘¯=Láhmj£ÔgÄðq­«3âHI˜™×Îãñh÷Ý{ ÆM‡êî[•¥ìD <¬ä2—¼õ®Lª¼KÊî€ÂKP#jÕ1¦Ýκ&pz­aWëÀ¸µSÝ{5|kGa»‰Ö‚»ïËr—µdaáéY¨ûˆq[XÔe­þ²„<º;Y@›hemjŠŸ‡ExªÀÔ,ñ¦UMÞ Ò .ÞÍPf.vc´ž=Z=3 DÝ̦v³0ƒ1©¯\Îýó e¥ÈÃ\†Š°ƒ/u7JÑ„Y6o„¸ºÊ44í[ˆ+åœ*ó*Ðï›ü{éÁCØþck¼ßuþ¯?š¼»&_¯êïÊ¿?ªêÞ<µ+[†0 Kݼ,Ì2šÝeõÅdç½ôýú°ð&tcŠ×uq·L(¨ Ð´êf•ü+!ø?3J‚q¸Á`M¡ßgÆsšÙŸzµ¯?bf_oçýbú\h3 µt²åóá ÙV–»ËTÝMÙÞÛy§ïGæ6ÁÍaŒB÷¦æV¾¹Áh\¦×õºö_þé¯ÞW]çç˜÷ÛÞëµ4€ÿú/ÿüv¾^×þùùÑWÞ…Zt™¹;‘mn€ gßc¾H›þËWvU–çko ׈ëã5àˆ;¬`‡í®úõ[ØÃ,ÐÊýs»ê¯ã˜ñšÃop'€½×ÞE¶»g­ú <D‹k¯ÌÕ?÷xVÕzûJ‡üõy­¡AQkÃ<äC×É;¶ŠF%Ð]4nT£ÓG”Ð0Ysw3Õu/;²ÙAÑ7ÎïQéúò¾mFú…Û[ ξ=nÓ*Qí¤éØ([b…ƒüâÓ7Þ›°{ÿØjÞ¬Ê/#‘w*ûvKóËh½÷¶V Ñ$ZÝh¨ï·?·——•IvǦÝ÷`À®¾dÛoÍ.o(°Ù.wGØÞuåZ Ä¿Ÿ¯ÿèú¿ôöŒcÜ›¬&R­Sóp§xB;s š(CÓéw®l‡[˜5¸K[ýÓÑ`S@¨ÈYõÛ*‰2ìPGïЬì63>ÎfåÓžVfÉ̬±å}Z†¦úkí!t{­oóDZ¢v•£fø§-#¾_óí š¶Õ¸"áÐ*7A¹ÊçFmQs\µÖ“o Ñ·V‚ðk¯4¸ù®,5Mg¾c&Çü½Ÿþ-eV õìêÒJÌÊùåtðê~õÅðZƒ€[¹z–;V¯™:l4 ¢HE¿—l­>»6ëùÖýÿ}üoî_ÌuÃ~û×ßÙ5ˆ«+p3(ùöÈ~½}?ÌýÌ?ü¯þÿ±T{?æJí+÷ZoÇ[~•Kϙ݋F‹±J#³¿,êUµMÚ1çÜû¡= /îOù‹zÆÍÙ@îŒ#–³”FÈŠX¡ùf9w×¢šLÂÀxÒ÷¾6MXØJI›¹†Õ" î?wI ê/±ƒÕäUuúóW'Ðg`S”UæÜ#†·:»†Ù ¹Ë8ÍË<ÐèµÁ[rp«ÃÑfå“R·xlÉ«-c }stô.šŠ· F‡Íª!,¢M÷L„&}œª‹1UŠú†I uÃÌÑv[1:Â+ bñ¦Ãc,Õ°­f¸ƒ³aí»ÇÂu ÈH «o)3 žéŽp‹ðLU«wÃ-À[UYD‰ï{X“f “w{whíf+F¡Ücp;?¹ˆ1D4¬Ú9¸ ¸Æt2þ¨ƘC®ÜBU"ÓðuBUYø•{Rƒ•…°ªýÏýù:Ïã}ö´ÃÖó|»ÌZec÷îi³ÖrÃ[ Õ6ǧõ2ù8:Ûáa—Bfdæ¢Ã¦— råçǵûñüõ\[Pk‡ýgž?ü·gf¦®ϵæ_¾ȽÀ”ÎCÈÂãø4…G¿ªÒÏïçëK$Å<¾?‚ÆÄöñó@?•ûÛxÓõÃçø&)]ηٙ}KŸÛXùWÇø~vô‹¯ÏèÉÇóþ{ìúø«¿·ÙO%rC~£_…ªúèæŒ4OheÇq˜J×åjÃîøÙöÌìé`&>G›«ê Wvƒáí{Ÿ£Å·Ñ ­r÷Î:h“Ãhꌈ¸ÌP~¬+ž³S!{0¬Ñ­¢§òeJå6Ÿ·:„ìŽÐêÝíC¹ˆtÝê&•À7–•[·ìå´›æAîæ¢¾ø 47Áú+bˆë³pøŽ^–»¢q(ÈÚ´¦'?i#³BA £©{Ì+SÙ5cNÞMs]éØ.iïÓÇ@#x¤­mÕÍQ™VQTfAùJk=½Lؘ‹jÊ|{_ïöØÉå°9®j Ýec"‹dïœcf–»7 n.¯ª¶¦YÐV—™e&ܾ¾5ÜbÂʦFk•ÉBI˜Y«‚¼‰cxúeRîýÇùóûû7 $)™Ü[ìn¥ËÍCõèvÚ*uY[(%3»÷âªõÀ{¡3sëEÿ „•õ v˜'Ä.¶ÜÙÕ0Êm:ÙöæÑcðŸ?^ë·<Ïùßþê>]%™ZIjHõüö|ã·?>?Æl¤h6vgO,À‡ gï\yêëz·çXо^a¾¯î+¿ÇQ;ÚŽK׿*Gõ™µëíííS/YO’ÙVm‡!*¼YÖíÕ4ñvXÄÞûô+j>êEV¯Ø9ÊÖíº”éÃíoÚˆDÜ“é{U½ñ½Á“%kömwTûñýì½?µsò¾W¹® ™pÙ-µm—ÄQšó‘ ´«¹æ°lß9·Ë¬ÑÕJ; e!ôÐl›)hn–¨*S>§)©ß6¹ÆSI•¾u¼ÇH­NÕ´5Çbi>û\½ß~ÔËׯßFÛ^ë»ßÎ ×0oãì«ÌU2«]ÿ/mo°äH“#iª0w’‘ù×ß½;—‘Ý÷µ•žž®êÊŒ Ý €îÁ˜Ù=³—­CSò’B=Hsw úéXŒ`ù9Ç‘LÎy ãö…º¢Áð9`2Kiy5* ;hó¯ç:̽ϓÔê¬éž‡e^_·8þ½Ÿ=Â_sgt­^¯+­i:wÈMriÝêÅŸÉÛïëuàðXq¢ÏÛê|͸óeöê«Æ`KÄá›OyAÊ³Öø´¸{~Äu¿Ù¼Å5môuV)/ÆmT]Ãìå‹ÇøêOy·?˜ÖÿØøå¬?rNtƒÊy÷Ÿ_Ÿ*a á€Ý×ù0ë+‰”ò>nX5_?‡+å¾sùª(37td¢i&’Ïœ·qÎNr Ìû}„l}]+[ç·$Ù„Û-MÙY•¾àæãˆç×—çøx}~}R\µˆ6„E€ÙJ”òô…v(˜ˆ±çþj#¨LfÆapãX+­1??øæ¥¤]DYO´üZMT;‘êL™z·S«*"H­Ø.Yk¡AS¯nDÐïeP>ÆX×—‘ãp !Ûi¨¾ üe"5nÁ“~i$¤Hëýªm'ÚÍÞª*UuÅø½ÚOë µww#ªÚq34(ˆê0Œæ•]ª¥FËRµaŸ$á@h04jåÎXwS³»%lüJÄÛ¥’’hãÛU °màí—š„åÉZ’k˜¯4éØlL0Ö¶ ‚¶›rYµ·•;-› EI¯5ã8ü@]¨Ünp¿©ã6,›A²µÐüO…þöžÈК+‚ÕâpþʳýÍÛΑýóo ëïßSUo~C²öK-`ýóóyŒá¾óSw¦q˜¤ +Õjøqì_©_äÓÿ­ ´ßÆ.°[K¾ãQ7ö®;"ŽÛ¡©mòÑÖúþbÇnñÝy¤­«¿Öõ/_ÇwŒp„!º¨•©„U7¼Ký—?¾áÍ•påÌ*…ù¬[*T‚Aª»Ð¦Öß×ëË®µ®# KÔ\_v$ãeZ”P73n?sNË®r ¬La6¼Ë«Mí Á²C/¬’Z,G§0« ð°íß5c·vqŒán>×ÚÕvöÜ‘2lLuSsƒ‡W™Áan¸óiOЙVÍvQÊÞmS¯Î5"nð*%Qœ]RXmŰº {*JÜze—9èNg3YµHþÊüý=é«n° ;‹D¶½¿·C‹ïF#ÝrwuáWXp2l«K[s–މ^Q$ÙÜCɪZj×ó æn$»!ã?{½”´ªa4è£Íi$@Ôº(Còöðnd—V­mÁ+0·bn£Ùû<¢vƒSÕÇqË«w@¢Àãþ‡‘_‰uåc|œã¸Öœ¬¬rEø˜×—‹wzkzn«KD›%töu-;BRø¨Î^5«êTµõ„¢ÓD”ÔMÿz>û ,e­ìžÈ0ÝÌs`“!õÊ1ÆœÓZˆ„£)a,Ýž2 ƒ[Ñ~ô’·ªÃŒÔsM°QÝÍÚPÝ6‡ŸF{}>Ùþ\:ì8¿¯þq9I *Òì¾–èã^ãF©ðš—p¼¨†¤ rg9Ì—h#'O4dÞD¦lÅÍñ<þÁþÇf+ÏïSËnGU¡òK'ýê~ÝíÃÐQU¥¾æÏûã‘Zs.¯o§ªÔ`ç ߯#Ér^Ä4Vê^UPójNÿ~Ü/þè|¡âa~ƒÀ¨¨øÐ™Ïu÷Çê<¿–6Î`˜(Cþ|ýPõ·Ç£«–773£:ünU¨\Ã&Rû²‰!ø§2³´¦ûZéoã,È 4ØŒÑ\íÝ cÞÕªæà^÷óÞ“¹úPKefÕÎä6MØmb›•n‡vè9 è Â7É{»U7 "M±ÛþݾQØÝåŸwê0Mï0Mü/–Š&úh lM|'Â/»dÚ°ˆ2 °S±RfÖa(”äF2Œ °&aå‚Jì«3¡mP¯¼–ï CK•Wš™ÁÙ\é~Ms5ÔÒîÓ@ݺç4Õ!qår „Üê}ÙG„ÞQ´îÁLY¸»e&ÍVWªÃ7ƒ3(cK $W…‘h‰bМHünéÀ&ÈoŠÊd%eNuÿÆ„ü~æÛ¹Jv7íÝö m(Û «ÚFw›Çù8çëZBɪAZ®„4ÌÝ¢Í:Ñý]ïîyþÏå#4›ÎRKÝ­{‡ÃlË]»2S]öëÃÔ–úR¶Y `‚}»Çý6ªÏ{>ÿýßžßïg˜ºæUv¦²!rŽ1´>äã¿ÿù×ÿñãÇëã<ºc®ÂÄyPèòz€ÎÒØ¾â¢ŽÇ-ÕÏš[…”TÜÎ9ç×îà9§Ã%Y‰5Áp$P„¶_`#nŒµ¦µcåR %f òÜ)€z§ØvU% „Y ·}µ‹ÞÃ]@Ëý󥱿wÇélª™-°ÑÄ‚.u¸QÍ*ß-l!lX—¼TŽzOv(_¸!ÉÆðaÛqhë½¬æš ßsù«a!mÇMyˆ$¶t[Ä£5~mT»§Ì¶ç°AIhÑ-+“Ú˜ó24u´}ƒ]ÿieUbcg½aC.2ÐÇ-ÊZEA¸Å™í×ÑpÚ½-c0 ŸW~o‹¯ùSGfC>|Ú À5{´:ð3Rüöð¼%&%·)'–Ù¨FwÿþÇ\/©b排ï¥)dÿ—Î_vŽdU¿^/¿EV í°_E !œ9 ;ç&i1YW½¾ûç翤3fÍ8¼Ac<€–®šâˆÛùµ~˜;ÓØaŒ,˜"ìç¬{Y/V™É]V ž—¹~|ÿ׿ÿ‹VÁ²n¢R‰ê {>ìÁãU¢Þ;‰XPW: Ç¡Ã{úè°†ÚÙŽÕÐj®,Z‡YƧ\Ùæ"a,ÜZ.ExÔ€–ÑŒÝY™Ï~ºŽˆz E5l‡b `q»U/2»Òè4š*K4m±gØ€¶ì]|à]‚€Æú%ÀÀ ÔVا¬ 8Õ ªz÷?~_LÄžn¶óS t„Ü®ºHl‚;ØTQfåÊÚ)¶S5J"ËZR£Åb òˆ +f³Þ­ ·[õ@X‰0ƒÛÜzK€ê`oy^wÒMl­ ê(0«évt¤æ{sÿ»ë0犑™B·wÃÌ·°ÅffUÝn·%²ÆÞv¥`¶c  ØÍ$vwUUfì €ÙíûylèZk¸ó]~¼E£ïYúM³]êýÿ$«j?33yÜ[ AÂq»??¿v’­‹ u·7É$ñ·wïÕjõ.ÿ3‚ýýÖF3S¡ºw±"²[)1‚(¨¯µYlmP;é~ÅYÈ5>ŽãO;ŸÏþüû9Æ9N÷óg¨t'­¶Özþüqsß?Öd^·ÙW¡»JÊá‡É;Á[¥Õ蟯Kº•c€¸Ýµê¬¾#^}™ÁRÙYí’i^2ÐÂŒ´®í¯6~¢Ì‹,F¦¡/±H¡hISë¦ãˆªªû/[Ž^©&Ü$•ÊÝîS»ïha)¹¡Íù8Æò›¦u’Ý^hÓQ_]f£9«ƒá5×—ú&»¥Jhc7ö¥E½œ¨*#*'–| nmrß~ò†däÆÜmÌän³ðNµÁšØ¿}Ží}T°Ûvÿ#Õ+×f lQ*køÜˆ=; ŒÖ|Srv븧Êh¹æ!v£›Ç•i”†±Eš-j¶`Öf+~…9¢¤ÙiíFv"5Ç©¥N i½ñ‚Bwª³ŠMßÖë×ë£ :†™Øm°&<<óÅVåèK1yøñYîŸù•ÃÎÓ½S&uUÓ EkÔᬕGÜ<Îk~õêŽÔÑv<Þ: òðÈLµ@e¶Ó·4Ú°¬ 2–YUÍeçx_²r‘ø8ã¤GUýü:Gد9qK¢ª^”µµwŠã6«r­,lÙM¬½-=N§1ÿùûó¥žÏ8—y¿ú…Æ]ßú¬ç\¯{< ·ùçÌ…*­zß%½äòLªª^õ•õŒÁúÙ8£KÙ²ݘ«þ¡‚âõ¿Ôû5-,j~Àê=ôúìÈ—ž6â9¯Åã‘ÓÚŒ÷1Ýú¶~êÂøCÆ›õYŸUk{±`:F×úü“Y£Ýgt÷-]ÎòWjù8Ow³.ÏÏQ­ÕW~ÿåxEÎïÜ–©®Í×ðþ8ãûrº^™Sçz._f²Sxt1í á+<•–uÃSÍë£ÕûæpóáyÄU+"fÍ#ŽN¡<תŽóö\I`Öœq”E¿8ú54[ßòxx^ìgçé—p]eimB·(]K~@òùW‘‹QƒãDX‘ó‡SnG™·D°k^ó´!Z»=ŠüœÈ“òæ•ׯA[a„Íb],‰á4–G·–¡ªGmTX+Uù!æ³Å¨„ùÃ×ÚîÁ¸Ü·(ÜYŽÖ2¬êÕqÊN½S8–½›ÝôÜÊM4Âbª:X9ÄBX¼sÜF¾wêˆÒpÃIki¥¹G6`í»Sj ‹˜V·>)Q†r6\ËGYÜ€pþÕ¯{EÀÈ[œÂxZ‹&·¥mÊTwžÔpáݵØŽó謬fß<àÖ@9["Û Ý│N5«©žn&î -•Ÿ͒ÐÐ³Ö çcÌ™š0s²ïË(”;ß#%?„*{‡Mìl@s*‹äðhÍy%Šcœ¦º³j]¿W’f$zô75D: ifС†Qj­+=êqãúêçªãäÃ&‡|x–ÅîáÇ·;~YÃútû?nÿã¯ûñõjd«€>6L6Ë4ª0ÙK]PÉ™8;¾q¬Ê¥þúùïµkb]}ç^Ç1¸ÚÌŽsT¥4ÃiEƒ<Xjs'Þ’˜/žD:&U´´ÑbÞË´ž»Gcì´² »ˆtV¥£uvUfwà Řuò9ÿ>p+·ÆKUРÑ,`Ý&Ø28ÆW|fü$Ü?ûÑe_Ç|3â hö*;üvôšUr™®&0ÌÑÉÖ°éçcœÙÇ´‚æa[ ¤EX΃:b<[_英ÐD®BÍÖI7!¯d°Ü×a&ÅN%ØìaƒZQ$y(ÏÌ—”<çefa@¯;Ïêúª%Ëq ÓrvÁË„n7å.ê„el4l÷RV»…·Oo ÆÙ|1¿KÜCLï¯hÖ/ ›ðÏ×:̼:o~23‡{»}6Rñ* >"ª–ƒ¡f§i¨,8V*xÓê*\p–G#,*µ ž·W~Ý™X?ç×ß.¹·&DO'†ËJ®Éæ‘¶Í_6pÕgVÍæiÃP58Ï1‹–·kÎv‰íÆÎ¹7þ±$ IDATŽY¹¾é¸j<Ÿ—¼®/¡5Æ€éˆa½Ç•×lat»TÏ‹Hùü•óõœçéýª£ j}áóßu~”cÕµ Øí–Ê¿úŠúòùåæç—ß͸^.<»^æ8Göxpèë¹ðÁµ×áóúœ÷ûÇÅ,÷«?ÚÞ¼[_Zóh ÞŽCãùõeo_Pw¯~Ô ]ݯ©ëçëþÍÃ|­—™Áêi¬KKÒh{½*3û<_U´A땇‡hݬ–£º3àP.“¹Z¨ãðBÀ¶œŸfÇã´¸þö³ñ\©ã̹¾Ÿçyz~>{Þr [fÕ‘~s¡TpšYÜŽJíIÅeJh7Df/ „¹í‹ùõ°‘‹Zãkä´úˈ¯zîa£™nÏÙcöïÙJKe-§[¸y/„Ád¯ìªò€ì­li‹€5°Lsǃ©r–H: ´j#E¤‘Þsu•ôÇãž9óõÓí 8²¢éÿúo•þ¯ÿ³^W§òÇ×××1¢¬;§;ë/ÎC’h3'MªMûEí®á%Í®åMKcˆÎ¦¦««ºî4S÷.@Ô°ý0Àˆt,/¶ Üç…ÐØZ‡%¢ŠAQ:Ì»;" ¸ªí­½ÂË|e⦶+O‚•LÚxe§Î5¢¼DÀöðéHLv²ûp·w™'±/Øë\0³p[(¼µ>••aGƒ ÛÙÐ4®FËœùaqWm9( .8´Í23¿Xù]îO|E×^á$§„A& a@¼ï7r©ÕNÑÚœÍ*Öσ’ùºQ ¡º_6O»«m.AzѲݗ[.G!£õW÷ìúÁ¹,Z(¢@›Rz9H¯?k.OZHòã´¾y4‡’³¡.$𤈂§AJ¨î£?€0šó‚WÐ̶ϼ›*\R —éöYæÂü;ÝŸ¨§t´jÕé7ºûYyŽ›!,úy=mÄ0øZ]Y%Í¡QÙù¢d1LJe¯ ñÊ bŸ±ï!WÎBÖIzvÍ'Gdè,ëéÑU§WRè^-_¹ìvÖ}c&íåfã¬n¨WìÉña¥+³ïÀ`Í%¤€ÚN7«bá’{>²Ö“¼Â…®îþ]éEýa¿Z¹,b<††W-ÍÃð}û&+ÿXùòS]‹iûÑ/ÖõLjY³š“ˆ>>úž9 +-?¾¿æÏøˆçgMá!ŒePr0f§’Y=†£P³¬§ ›•¢„¢y+k>‡ çøããøRrŒ×šcŒÌ\¬â²5 2[C‘2x›!LãšÑØIß-^²¤%»­dZɦ‘Ó tš`/u­2éþÑóÏcàâS-ræu¿ô§¿~åiGdzí,áÚâ#˜€ÍR eVÕƒñJ)n6\JrÙÖY¤ÛàÝl3žmÃü‡^¨… ãf+™îZ’1ܹ£j …{ö;»Úøµ®–úqÞ@¸:eOçn7š²»U~¼CjömßÍáÑ!Ù@C’u‰07Jª [eBˆý›a±GiƒË jʹß$Ì”×%ÔqNn °+´Ûn†»ð G«Ô{p íD¸_žm`ê@ˤ¹æ4g¿ oÔ){«Y…öíÈ‚~VðĪvÀJêÀ0š;¬\¥¶âw¶uBI*À%î|{UËÌ÷Q[KQm»”«ã6¾]ý·Ç·¬'¬Æ° u?—Y¤Ï§G 3o?¡ë¯Ï¼M}‡]c]ßëè'·ËçÓòˆeÇ ¸ÍškŒ'­ÍfõÃqûà|N3B2·éHªÛÿ2ïßÈG7ûu=¯›[eÞÿŒÏu)§+ø„$Õº ¸›Ÿ²޼Jl6w¸j_1†Ì2ë€yåÔu–+þx%<Úï 5 KÒuóÕõ(Cuü4šÙà5 d“6tlVÏå/ ‘Ã76ñ7¶GÜC–mËØF‹/û _ò–†¿¼ž£ØTe€çad' Ûó±3ÂÍÃ:FWR_'˜MAsÞ|˜Ì„8ÇêšËŽf Îe†ÓjÕ ‹F Çp}O&¯²vx/­õº!YØGçeÙËg¹“áU;`„ž HÈNƒY—Žˆ ¢9å$È!_9òtëÛaí5R\fÊ\G¿žóú¾Žû·oÇèù:l¡[H#ƈÀo¼ßGÝýuë¯?>[ãUvÖ ¤ß49ÞÉ#î9ŸB—Ái™yZDµñ\æÉ·ÊžaQ•Ù²ñˆÆ)°z–Wb€\y0¨‘çÄæòT[ÇÈå~ªe¦.)<èl†}eT÷íÙÃïWÖó ,ŸÄˆq¬WÖj Gà©>cêóö/×O¶ÁÁìa@xµë)µp|Ü–Hœºy[ȰVX—­—úë'é‡áÍãZ/µã$zmSÛm¥zD¡ûF·º™b®'tÆýL¥—Žçœ×wÅ%“µ}F»ë8ª»A0lØÇÉÛóU¹ê8Ž¿üùýóëo½&ÿ÷¿¾÷;¯5V/Ë-µJ#Ø=²7owÀªÙ\¤tøÈ†¹½®<Чs *u³íÕ°Ì×pº»ñš³D3p?|hj’,ÉÜ®\)‘¼‹`¨©«Ú„Ì·°ˆ×|æ;Ì­xØ\ÙÝ·q{ÎËÝc„±ìw—"dMИ]Ø9E €h¸htÀv´¤‹¯0t÷ÓÞ¥†Æ¹„Z¼Þð¶Ý v33pP…’ ;ì¬ÝÔ%p;›­Wî„y… °j‡Ò5UI%Áª}ß®„j.¤­µ6ƒÜ¢“½3L0TöÏ+_/½Æð¶ø•-rÒ„Y(H; „;TE’PÝ‹´øµJ}'÷½© ïDÚߊÉÝî-Õ‚ÃŒîÞÝꥆ;vú­m áî¨zCÕ„vRÎÿöÈÜ­ˆ÷ÏÛ-©»?;åÆ#`Z+Km‚yÛ™ºOŠ­ñ,5:3“к›äyž¯9ývD„™ )•¤*š*5~máa[a Lñ½l‹ì$H”på’iÍçívë.vwÖc”¤EÅs/B¦•݇]U¿)j’HóM”èVfnàÄnüÙ;+O®Ýû¸+7¼_û•z«¤ã°°™ù÷ëuÞÏóù5ߤ¯8«ÖžB˜™¹3·Æyû·¿ý€t>Î9+ g‰hªÞùRÝ0l˜©Ã,ªÌY U–5ºkßÁšYÚ²éêEÕµÕ0¹Óè(Ü Öè®–ºU­Þd`IÀVϬT™¡«¶=S) Bí%Ý`ðÈê%lTm-¥wTQ¬(69©Eå{ iÎû}Œò×ß_Sëê)SŠÞ§Š*¢5üFÀn÷ççëvû³5çõôÔËòµ*ÛãÌÌÿù¯½Ýè[7þê¾y.Æ×Ëí«(þAÿ-8 ÜbüùÑÞ‰Ü}ÌL$9ŒDùyÆi2%©+W•­)˜ÿ|}:|øì Z«ú¢{øÐšX³®'qDH4Ù†åñÒµf߯ª1ÊM¦)YwƒPéº.„G|©nçí•\«Ý]6ìRuÖ#†%Â8âZ—én½=JöŒ¸4»Û>Âá_ÕŽÇ Àõœ>|V]+Ç‡ØØ-hi‚ i4çsM3 ¸‰*D¿oØ6M *2¤ I½ép¿rÓvpëðÀ| ÙÍЃµRDB¾ ,3sZg;±V~·ÑaIÍ\Þ`,ã’´ÅŽlÛ1y¦"ˆpÑÊ9Ñ.BÛ¼Øzì]a™`lGK5Ùã¦S¨0#›’Â<á Àªå¸Èö!Amè÷ž@Ï7P ,«ßÓÿpøEa+IÊØBR9Ëœî{Œ†™º<ázw5Z’³7Û¶ÃîÕ(Ñ8vŽþSõànÎPÖžíyPwëô6fe¯<Ý=ËJòÎ_øßÕŒŒ]mcsÍß¿y›Y†TRfº;ý’\= Nˆ†æüMDˆ]È™Y5û=}ÒþLømª½ßï’>?¿~þüy|§Ç/E 6Ñ“¤›£ÚvH½ÔÐêÞðø}Ô†8Z4´ÞG[T«»ÊºO]Š›¿Ö´ˆ%£•³Y†6CL}ž™î@fŽÇQkòÏÛíóóú·ÿñ·oùãŒè8h›¦‚, Š•+óúËc|?ÿùþë¿ÿýë§Žðˆ•FãÁ ]+ê2-[£¶ãjyÖ©4ì콃Êêê_Ë8šaïÂqÓU¯:Yõ®gXRIÝ}h³½Žãý™OÍ‚L2’3T6ÔD¢ù뛩œÍF6¤0µL£7îŸ%af-1Ä1,]0Ñ9¥M:ö8vÞÄõÊmMÖ²»›À¢3CÝÛàâIlo µ‡h­œ¨ðvA’™£U•Üh‘ÿ$!”m÷+6(VÆEûüü<ÐqâÈÌlƒÛ˜B‘çR{Àí¤ˆ\Õ“ày:9ª¾Zƒ~;N*zAWw$1gJpè@t’¬ºž/óêëúaf>ƒÆto4h:¯ÉÆ%ióÜäjd¥»eV¿^æÃ-`œ ÑÓRb5Bƒì;|5R l[ð·g˜cDõ-|f*Ôký·û9?—û±ºŠ*+¹Õ"Ä%9í µü•8 ²‡ß]fèçiÝBVhú ÐûŠ{È,dÜxØ(åž]ýJF°€ˆÕªÍshIƲ+­ŽóúúûÙ'ëìGàÓ:«CEÊÃ=Žñ9Öëùˆª¯j÷ðãc`ueó8¿òË¢ïãëõì½dzN_É2»Ÿõõn»ÿ?pþ²ã'Ƹÿöª—Já‘ÏNáüø³!Ug¯o·ã*M°Ð vœg^ÏN9MÜü²¦—7|-ç]{(0‘ê HªÜ*[a=gv®¾ª”þýÅFwDhx;/c)¾.Ýï;ºq=×O·XêÊ<Ãå-_皺{B\«îÇaîõé§yÄk½fÁâŒq'mΕ™ÃÇ1ÎÌä°ìŸ‚ºÑ”û 0Ìwäzw!¶`œoÙÔ•”žö ³›w¦@¬ç`‰C4Ô ` [ئzüÔ‚Ì‚÷>Jppx€Š0TºÞ2w°v“}ÚëP˜Ñáæ1|í{dg%TZ 9¹ªÉ ½Ö€©Qa<YµŽ‡«Àv+o…<Л#¶wù4—¬M9¢õÖ¹±³úà±ö¦úÃïKâ{±mÏþ‹"âš ãð»YÓZXïþ‡üPl,~—¶#•R«·²äŽ”{¿Ɉ@un„×/¬»ÿ¿´½Í–äH’¬'¢ªf€{dV§g.yßÿÕøsï™îªÊˆp¦ªÂ"«‡ îØØ§2Ó‘OÌ ÙžclÞ24Ñé »Íèø2úÞQ™îvW0÷uc$2sß÷ÇçZkŒ1÷»ô ÷Á[¬‡¾>?n1cõºíç¹öñ֢Ē(x#¾BïP«úßß~ùññqœgLÆÍE÷ÿ}¼7ÛLé2!þßóûŒ‘ÜH˜Õåô±üÀ*óqOðº6;å2°«ËD(ŠŠ-Œ£U_¿Ù×uFø [ŸÇcÛhÏ¿ÿþ:^~ÿ¶}ÿþÝAØ’”lÐp"ŒÜ§ûß~ÝùþŸ¼ž=dzút¶Ó|I—5œ6l,ŒÒ­´në h´é±*Qn7Ngšé†Ì@îReÖB|Óݸ©óK·Û_H?IݺG c· ¨¾7¦ §Gu/ôNx¯`ŽÁaî.´ìVšÂÚ‡™ Ó…Nª±‘Ùz¸'í ØäêºÃ‹éœ¤^ÌkUÕóù6`\ÚÛ’fæ—Öi¶ÿÂȯ2a4îä?t3¹™™ÀV„W—“òiãO6otЪźm·ÁŸ„!A•šû„õM«ïF¤DFGÃPe«ØfˆÉü„ªÑ)A™7úJHC±‹CȬÖÅ!3Ønrw Âèp ÃÂÆf[FЛ˜FZ«ª.¬ gwº‡ImpI 2UŸ6ànbúܲtž§ß6êóºÜ5½@!Œô9÷¸ññ|nŸ¬Á\ë"9æ×#W¯»‡ÉʼÚ]½‘Ž47cw %»Ç_Ù•íW†S€É†›º£˜/ø6¹çœ‰.®3š'[Öۘх:½{6<ÞÐR—ºTW¯ïæ^´&šMf.A8åž³Œµ.o,.™†O†ÿùùwÿÅA»>ÿñ˜¥<Ö"ž}‘Í–Þõ:Îט£,[ú•Û S§õþxüù}Ä|ü ë+~E8Í>þüÉé¯Ï÷o¿þ7÷Îk•é«ýÏOaŒb¹PWês³8®´˜CÒÞe…9óøc£·ÅUÏ7 t½ïÝZÞy·×2}zŸºà°1ê¦Ø£P4½µ aæHóbW}Îmèjߪó\ÇcL3œª-êbWv€Ýz0ê:«`Ql&ìô¡ÖŸg•»dªXŸ›‘iJ°ö¡Š\Ý^Ó.]¶äæ±M7¬ÅÏᆽ¶•»=‰™ôèww­éŸ‚™Íöǵ¹ÌÃä‰vøµê%ä!Ò‰ 6…Öuï@•ª*º¶Ù„•¡‘ÕŸjbÞ«Ý[W—¨Fƒ{ÕI^3в{Ðr@pl¨¶®ð¨†ÁØNóÕ lð< Ëi1¦ú¢…úªÖ¬žz®r¶õKZ £Ó´nZQt¯h*Re*wƒ]6»¥TЪUÃGChv‚TŒáfÞð›* h#¼ò*ä +õ0»Á?ÇhÏkqc—Tì¶8+½SÜoÓ!˜Í–»Ì(»9¨{_ĸEþ¼AébnkÁˆaÇõ¹¹òºh÷Ó•ÑÆPoyç˜sšg.ñ¦~Áº!3ѽYDohÎZ×þ‡ø~Ö·ç÷RÑÚYÞMâÔ}˜ÉMð¾áZ„¢ ÷œŠ0“fÅ=F‚ë’4/¶÷BÝ·‰J¾Ä²Ö2™IT±ÖVi7žyÈÆ¯¿>>~Ôïÿøøñççû_ÿöxŽˆkÞ1hŒÈ•]pç/®9÷ÿùñþy}¨U%ñ6uÈ«y¥^Í}#\xð€  ˆ“<ÖeD8n“i›{,·wɉA^2Iºq9V"íŠå(Lv[ÂW$ÕÑwÁí¶¸{Æ]Ý•8¸Ñ)úH´Ü›UJA¬¹ÔW-#‚Úä&tÇ z_7”åÎfÅf=ëëlÃîfCì 퓯«Ë V‰Õmn¡Wû:™SNYó*Z«œ ÊЫ ÆÙ½€ê¦mëxÁËfÓq§ÞZBeçýT_ÉÝÁV½¢Úõme…uš­5Kqá„W™¡£N”ñì¹-ÚRWÕ>®Îé m(³f Âa®ÖqѪÇè—­É1æñ­#E],í²É}dCÊŒh`‘x{ü8–PdÁïÚÔØôÚ¨*«¸O=—¬Ø%ÜÀi$ÒeL3¡,<ÆÝ mýØœ×éƒÐ'ÍóC¹ÜBΫÞã…‰91“UÝnúÆí¥Ë½ÇRñ²ÞUg·dF3ÏQô»ë8Rã§rèa·ñÔélh ·ï>¯\G-“…^;ð@8¸z­Rùí™4ò Õý|O1ߌXe2ÃQgÜ:wã3ÑòOÚ¸jƒ] £Ì1ÂØŒ™oº|ØîÝ%\4t›Ù0ÚÖy·ta]ºF8‰€ÙµpÕîV§Å ~V.ÖåðVVÖ²æÖwËüñR.I=à´¨îwõCù„ U‡Ùà®?¯©€y›Áü,&Ø>EK‘ Œ­Ý|俍k a1z´*ƒî\]m:;ãÄfw5ÀlMG«Ù­ì‘¶{XOhÜCà¼öÉš}a¨…V \óØÌ̬-Ö=Š0‚ºö­>óFzÒÖĉ»¿ZYÞ2ëF ‚ôFt™{ºß±tªœØ‹P4e«œkå4'{øC$d£ÊÉ&);+»Z7i‰€”ù…0…Dˆ¸²o3p»NZÑ…îV¥_,i‡)¸eûˆù’¨DŸ{Äé¸úlãE€r·!7•U”$~ŠºÛÝï;»GMI2ÑÙ¥½»Ñæ¯6µÌXðˆx>¢»×rp³€{›0ŽØ¬ Æaæ­êns}qþ,BTw,6Ñ?W&s äñþ1Ã=`.ëòõ™´e^t9Û½xïì [+ïÏú"ê6i°PûÊ27³q3ÜÎÊe6h¹~îUéU’u£Í%, A*³K[ì"báý—î·ëºþüóÏ㌷·Ç¶mK ÚÖ-–’©½÷°ÿþüuíüýÇûç:žú¡vÝÁô7 oØ_\øî¦»»eç­/Á¾íWFŒ.HpÐöó麯ûŸ»»ÑÅ¿®{¤D8/’ÕÆž_N(&ÊԨꆹ»WU;îõÅ—±‚"Ö$K¤Á€òuEÞC—o+¬ïhjorØ8ÎÂjnX{–¥ÝÏs‹RÉ?'hm(•Í5Q2Ž?¹Éθ­O™]° ˜ñD IDAT9hhªMeu;É~ƒÆê’qâÜ6ú¸ß#x;†û~ÅaW['§Y+ð³´¾p„LZûXðäù4LuÕZs›¸Ñ®ê°Æ°+Ë‹‹“}I²Ýnx>gŒµ«e$B|ö¥ÔT½pÚzusŠXng`KÙy8%­,³öˆ{wƒ„ʪý57[cÐ䯧Ù±_uk¤:3›Ȫ%WgC©s‹pwf¿·1a*3”gœ5({ZFçl›è Ç4¸uDxû:¯& fN­×pY]o “’uÚö¹ÞJ^µa¶ÏãÁ·ZêªÝ€GsïÏO’€K~BA¿d£O(Ã’“·.þÀï¶oØ÷cõ*ë®N˜h-u¸ŸÑJÌ–üÖlue À)­Îfe?ÊD{nöÌ×r¸ü¼.íÑ>{­·°Áó_Xtÿêœð¦O¢Hc¯ì¯ ½°û7ÛÇŽ\×µ 0'éÓ»gãç™ò Ñ—‘K‹8lÚhd¿ÀRi„XÝá¢Ñ܃s­UP€·8‘ä®§‘´õ3R\â±Ow®öŸ·ŸDÅpM¨ªúýï¿übãqÿ],‹Ã§ÚÔ·M¼ ¶1øøæôß+×.Üá8e&*iï€F0³”ªêþ€(`¸¿Ž£Ï,}¬´GˆÖÖ[ÿ³þð0Ký—ëç&ë®Çi£;Pô=»;ÍiVÎ#×…ŽÔ0ïL ›Ý€v³„ø%O²2H–ÒÙ–€Ã÷²X›µ2$Y³W•,Òku·¢ûÖa™ß¿bÑTvs D4ŒI½R-·%Éáò ¬„ E¶™£YP«%6d°K¢ûö¨Uá^zÔW. èŒ.ìÆæ v«ŒGW­vÚIÅàBv]ÐiÖݎ›E/Pe-Õ²JfõÕüF‡S…eå·l+Ùv®Ñ¯¸V=™ì—=Ç3ïò/ë.ÎIò ˜‚†¬n'*i2Ó8‰Ïuem(q9À²†Q¦.­Û!«}úæ0$µ¬’ª sëSëèí—ïÅMÈQÖ5Üv§ø€VS².ë®Æ¶¥ú0‘ð6̬×YCv{)) ev5çÂhš´ºiòá4žU#¦·W!e>6ˆkõg\  –joÚKÆßòä+ëjÚ^åʾ½É¨ì¦» RѪð•X„¡¥ºÇåW½~&„–Óž]›Ë5¬?Ï2Šž06"ø˜ÿJþØÀr¼íã—ãïãaÈP}Çß6\âÒÎyÕQ;ù€gžý '}€1ÓFôg˜Ùíñy®Œ¹GÅ»uF…»_kÆx}~>žo/¯êõ`XûïÆ2=°ŒæmÓ+po)y=ö& í(Lé9á–ö=¦—e®zÀU½ rŠÝçQþŒARiéžöm¾ýq½´{œëÍìX™f”‹(#§¿z]\hwÖñR^©ç>¬{™5Ïëûó‘×ZÔ‰8³ÇÛ™áHh<¶õqmØVU‰tT—ÑY×Ûaγ‘m]ÄG!…æÄùšÓ†9@,f™šý`%²PnsÒ§g®xè‚™µqQGw¯- #bÔ™–Ì4açàgÕ\èäÚvnô< jU¹Ñ .hYu×°RÁ†l8%Ï+ášÆçê.^'Ó®I›pkßèýº[Pô¶ª¢u€Õ.íVUÄ´^wxlXáÞ©f? ô‰æ=¬7ャš3&:³–XÝ㜓òR XÄ5„Ý]$­Ù)$aá^‡ÁnPr§Á|œ­‰0p‹Ï®‹ŒJ™o·î°$¶ÝÈÊä½þ1e¡Ûiûïëìài‹+OSsã›Pv­2FÖVnÀá<¬ZÌ6C8eø#_ßlëeGùœû]•1¬äÉ<¼å#4ßš«ëˆ¼˜O±Lc¼®eV„ÁX›Y´X­«+¶¸pz5[[ŒZê“È•nÃ-Î^á½m¼ê*Ú°Á3…;«»K@@@¡•Ü®”Ô6çÇë÷¯-~Ý7Vè š¶¥üö?|©v‚ÿþ·ßìüqçeÔV%|.gö²^ wQ--" ãÞw .õ€% {z“l½p.T‡}ÇîVé«&´ûxŸ™}®b7‹ë¾Ù›>®œÌ0 {CžUÌbËÚª¢Óð½G §Ûrt»¤ÙüSçt5`÷0u˜µxŒ’8Õž4s¿Xe”Êòeôˆi\åô -—±ÕÖõn=)¹¶ˆGÊKrÓÀr‰ @_õ4>z§Oƒ*Z)­÷9J½#Íx] öü³ßcÆãt¹–éfBÇhѭ‹ •¶Èá¾”½Œ1y^)Ãí=ÙÕ0Øöˆ‹:jĉhÙÓUp:£R´±U9ìÕ: êùïBõÇÖß¡ž#ÍOèJáÏ×ÌîbÛSAÑ´Ãú±GY]ž™Š¡®þÈêžú¦„²?б»g±iC[з¾4ê³ûCO0¸]lé}vÙFÃyâ4÷™ê™ÝÏqÖ)úslÙ㣖í3_¿eÏãš*zæ†:Rnsdÿ66_HäÁõ ÐF×¹yi]Øæ/V3ÔßtŠ ÏœŸþë/sÕÄ~]S¾æÄkåõÞúµUݶ³žð<‚µíûQï˜Ý¾ä¥ÔÆÞªQzTê1Ì?ÿqχÑxrãøøóï£ý+ùcÏ_gã3ÿŒ7•>ºß¿—>æ Rû0õEïvüÈrZ³|ذ0ÿ\ή‰×ÛcîZu}^⥊-Ð =ç8¯ƒ»y°ï5uŽ—fƒ–ךÎ[8FxÓª`öª7³ØÊ ³6´­¼– Á7«£•Ô2\.»èÆA"y½þm':¤ Øµ…úŠ{rAW›bksùjTíþ”jHt¨ËÍ61ß?9€ëu:‡uUÝͦ¶'Îõ²Ç¤cõĦÈ«VZu¿·AÓ±T-v6¤\nppXšVžjõxÜÈ,»®ënÓ%U%÷ŸÈv o§Ñ‹Q’t¡Vçô99úL²-Æ NÙFV]—’ã43´ü®k˜ÐßÍ”µõ²¶¢m1º“Xn="…žÃM4uçJÑánñøÙ$æëÜ·€ª>«ž(áëGÝ»gÝÀ†jšUVB´¯È:£ÁW¦yÓ }gƒ±ªnŒ©·Vè¬6‰“Ò @@ªåUwLj!+¿ÁYð¦ÝakÝ-“!øÓ7#Ú?çný©ª_a/ûÖÃF®:êœc SË3¬ì\U&3Ûã¯unýi³¥ÚMfmJšÖÊoß¾½¿~h–µ›ÌÌv®k]M6\_¶ Ûcù—ûøk–# 5—&5Ö5Â6]kÝØK–ÚianáG¾ÖZUšsš«»ˆF–¬™0Ú$J¥¿ÆøÚr@'éeF’ßßÿýýÿøÿçóù|{lß¿§ ɱöÁn­ênl1ªß~}üooÿñ?>þó?ÿþ:®1FAÙ„«»``k¸%*$«õóÇ3ÚUýuùpwÌ„îZich’P#ԨϺæÚ¬ÂA¯¨„išâì¼Õ(ÂÂC‰Š/4¨‘rÑòrÃhðjÓÜÝ›Ù(XþBñ¬ø–CײÛ0Œ­²Îv·0«ª9ÜúÜ[NR²KÊq3ÚIøm}Ñ5nBY%…iÜš0-?'mȼ¶.£‘™À} vCå>VÐÂ{ºu .ËÍžh­j1Ìø'dûÆð¸Žh¸û4þŽß{ ð(Œhzë•Öå>b50<™ Ž‚­sñqžËGŒ±9`[¦Ù+sãat¼üxŸ7“üwÛTíf{ Ö«þsŽê…Öƒ€u{c†®u¦-Ül8Ε˜A¨BbÓ$SÊ~¿Ì—¦éùø¦ëÈWÙüäþˆÀ#ëà¸æFŸç‡¥î­Öq½r´ ;ºdÕ£W_×eôN{/»†è%UÌÞˆ¶­V@BR¶áÓóºŽÑÏ$]þœ]¾¯â¹*ÂUÞi5æÃä¹Ö;/»åü´ç*k]më¨ÇsÖ:ÿá'¨@ß4llÖÉ«…„ç|Ðì6³/“F† $/.ÛâóõÇWÜ•›áÙ¦³ä²1ö¬ô‡_#_Wâߞߘ™9Çã8Ößþí¿¿¿®ë_©ÿ¨ž+9«ÿ°é@çqÚe yÐÌênYN)Œî^\g-9#ø˜ov¿ Mî6«Ìý šMv¯]¶Á­ÙVÞöö¯40³”ÎJe}Wüæá¼]îUÃ^½îÏ«ìxngës9ÛâN WwAîfZ(± ̶=ÞÏ|Ìu\VˆˆV§€3ÜË•ªµú³«ª¹ï/yÕjÈm›µtª^©Ãü·áÓâ̾×FGœÍÕƒº›Ìºêæ—?ê¶OU1_ëʚؒ,¢ >Ü so¶Lwîô½ÛÌ2Àœ³÷ +*n3QÙm}ä¤Â¬\=X¹îWên.g{Ã¥ÁA²[nö3/IjŠÀ Ä¡D“›–z/r ©Üh.¢š œàtWñÖƒÚí!œny£Èj\m–2SIåØM/5¿I)Tu‡Ûyœ~ƒÂ¥£–`€ôðbgå„»™ˆªjâ®?ì¿ ;2××y wØí¶¼zÉ»ªJiv+MÝHï6uÚFÐ&³v辕Œø+ø·³Ñ ¼wwýayXLº Ù`lî7 6!ºÝ {ôE7ŽŒèûÀkszå-«äÕuÛ¦`$Ìteê6g¯l‚A#n˜zþlNÓòÖ½§4”ÒÝ Íî‘Tß |ÒRA¨JUEcW™ÓXwrº¡Û\ìK‡憖@ƒ4¡]zÛÞÈ\ß\ÛøÅ‘sX÷ÁÜ€pÙ”> <|¼EÍÿøöçÇû?þøXe1j¿!n*Ýî”C¶V©ÝÙ-Wá”ÝuÉrbÁnªQ5z[4Á-ÌúÈaŒN5»ä<+‹JµÆFÑVØO'X®{5ÜÙš _P³ÁîNõ­ÿu`»¸ë6¹êhp]*Òo³ðmw¢ÕR¨2clf¨3ÛlÉÖÊp3fAw¤§`³$îBpš!ÝI]80Òë~!at9è_q{”‘8ú2oá‚Âà€u¶• F7ÚÒ•–wªê¶6 v8l© 6š¹]¹Ìlz<ݧäôn‘¼@óy´­ºî¤[–[·§FèbÂ|Á–Ê`Nc~iÉШ;+RÄ„¨ ˆµÊª†ûÛü\/#ܪmNdº)ûUc¥² æÙË3ãÃ"ÆÞÍã<öÝ!a{L©Ãaî+Uýb,Òâfu0P¹[쪡òîn^:GËi’‹÷RC0äé˜p—à°e:Õ–óË*Ùu¼Ì6²Æ¶]çRÖE`E›a¸®o£gI¦¼£ŽºÄµÔ4sÀMŵö®ï?°È¡ªUqÓBm—±G®¾¸h,tsH!ïsè3‹s¯Ã+µº;ëóãÏpãüWúo«GÄã< oÛ--÷ý]ëªiÞIÉæ|Ìá}ÐI_çe›½†Ð‡ÀKX´kµÂ6Æ\§mqž¯íù4;×fh,©« T[ ¿Vœª„ŽN̨;TgŸIzKeÞÆ³6Ñ:ð|],m†è'|Ǩsu©šIØ@g±’R|uq·÷óýÛþè3¹Yw]\W«×á»o¡‚náѰFªî“¶bŽó¸åZšó½rmóóxÑË0ÜÇ¥Wvµ³SòˆúŠ|ýmÙÕ•›¹é^1C§v`¨ÕÆ[2v¿Dè QÐжmUõz½ÜÇM袬À"®.‡ètÓ@7ʺ…êé›É;Á§s‘+äv9V†‹Öh¶|¥(Ì9i²jEXuÞf»®:0£®ª†(?½ŸcŽëºÁØá ø“?f@™œ­®¬/úE2lQêÌ;­7Hd¤¯L³6÷[VAò¯‚@ZÕñ¥{  ¼i\¦ˆàЙ¨såð;UÔnvÉ×ñëwGv)ïÏ–äf7,€»h@ý=Œ`¢PûXõöØMÈ•%‹¹ÝšFfÙ-5MµxãÜlÔNyåyÇ\«·Ç³ú4ƒ¡4xHª•€ïû–XÔ_̯ë§EÒîóJ6æ«NVEE“yˆª)í›»Ùy®ÌeîB{0 NÒÈ©Î*4H4x]ÐhøvJkŒéôs]ÛãÙ°u\ÿóÿþý·ïû>6©ò8ÜìÎ2^çšûÃÇçR™ãÛÛ„óÿ¶Ò·– Ôr:Ý×õn Ä`ÊèN‡ 7Ä¢j˜·¦,£;Ûº®ÊòÂð¸Nƒ2GÖâr|f… n0Ûÿ9en'\‰&å-ÔDŠ0p3eZ!±Å¦Û}'ðAÑ4Ô›gÀ÷ð;ò w‹v'9·nÊîý€]kµGmU§“¢);;ŠL4a«ÙY]%C"h7${@ ‡Ø¹Â¦Áô¶KÕ]ÖÍR•i>§÷Òµ@b÷‰¬!ÎØÏ>ÚõÊ«o‘/ (Ðn™y~ÿV©»ž«Vk9y \êycÚ¿è‡í”HÜJtÏ.2¡rÙ0ºÚ»‹SîdµUç9±æ®È®B—Pì2 ÑwÐØ]u]­5âmÒ®Ÿ#N·›n €/]4½¯O;Gfæ/ØÝŒ9ÝJ-åÛ> º‘çºÚ+k¡ú¡ÇQI%ÔcnU¾ͧiÖYg¨òéh´o°Zކý~fºËÆu¼Bcö69v­#/]¥îר骄Xµ‡GcV\åÝRÃÙõ0ì×ùÞÝ7. c¯º*Ûe®éíá­÷C+÷ò£ËÌB7ùþØ&²˜ÀY™²9T¬’ã•ûsÿüøûã1¯µ6ª×#Ð}]ÛYêó_É;âÐ:¨Øñ¶ÒÒ>jþã?ø¨Ëgwˇ>?ßGÆ2øqœ3¦‘hTå±G¬~*Î×¥}"ˆFM\]¥öþ—v3û×kúËXœÞ‰)m†+±?¿«?;s΄†8a›,‘¥á=¬qœ%®¶ê²\¼•)*”Ó+çrî#•ŸKzˆnc¢îÔц§TÖ€R¡úN.•ôÃ=‡¡­‡œx‹hh÷`Y§…½Àƒ- ÈªîûVòåi^è¶2ãlîG•Y %Tmnøò0øÊ›2Õ¦TŽÇëJK×b«aœkÀ†4ºëdk3p®g%él|¢×Ñ¢¥ûŸÒdǘ—Ü<á'=%¶Ñ6©ÀþZ“Üâ6øfÆk¹ØÜ5"PT•17Ø |½®Õ>'M(lº=“UꎈUw3Ó7s”¤ò40ƒßû·VµÓ(°®èÖܲ;o ¼‡ ¥›÷nørµ|A»6oÕr÷×ëµï{_ÚÚjHÖðfjtHcQÞhÁÊT¬‚Âh0vÈK²ußϽnUݽ™¹?C¶7¾í¬ãÒyªLÁðÞ›ÓÞ·aî³nxKBk[’F†¥Œ«:Îw³(±œ©8ÙW]]5‚…ZFÃ8…ÎbÈLÆÑéÕ&Àí•kl¸Ê`ÞÊN—‰d]­U.Lðz-„ 6d—$² ¡Eð¸U–*_sÛ‘ ,󯊈»Ä±M ¨5y¸>®÷úýüíÛ/m]:Ã|T•ïQ¼Ãå¶ÆÇûõíY¿óо²*ÍÂ\]KB7¶·3“B&CW«ºÎóºFl ±;Li³ª?%3÷9ØÉjÆèV[ás.u.ìx4séóažuøxN\èŽ×¨DF„*¾ÄyÉX"‹°Ñ@^kR/#F_ßÕÙ Øò¶< ß!À 9í´Ñ݃5 ’•ît*ŒCæÜÓ¨U¹6 íbj:SIHª6g!LÛ˜W×49‰j±WÐìØüµ‡Í¼°M^¨€ØkYmN[ÎÃüj™¾=¬²Z ·82KFy…;YÈ6{-5Tª9zŒ«’ ŸNÐa5ñ²†—]œrß Ûy¤øâõ´ e†¦ÅN"68eçʦ`X°O½ÛWžgøýìCØOýŽÏ3dwðËSLß?cÉ÷å5æ4(_O Žú•8u­ÀŸ³ëÑ`m# ‹}Ørì¾o柫/\íÚ·ø¸ºç–"×ö°¡Ï㜱\\¹¶ R¬zl3ÏmŒaÛËöÊUYT»¼8ævGEÛ>×Ï1qí«´ ç[ÏjÕÖ×·ÇW·½ýg[67<†¡«,˜~ȶê×7¡½¯mž–å—m¾_gÙœm}öt³YÁ4âá݇³#—™q>^¯Ç÷ß>ë£ÇxEaž øÑq>ë¸,ýÿ£vøÿ£þо|ßêđۘó×K/ mŒÀª®r÷ðYcI¼®sŸoÕªÖûvh7s\¬\ðϱÃ}îŒ9}U‡ïmø‡eºZ2vÐ^kõ•¶Tc)fX ë£çWw<6þññXVÝò¾ºè&®í ]ÚÒ­éd^‘iIkÓ¶*ÆÌÓ#évÛV·¶®ÖôÇ9 &uš:¬Èò½ÊÈ‘þÖ1J4 *N*9Í%äj 0o‚q÷Á©@¸ÙaûqWý­eÝ´«‡cS¯Fv¶qeáA8"ÿ"g!Ò­ÑFÊšë®o±èôB¶!o¸7ê[É(#æªì®°H¹[Ó¦$·•µšbXw‘V·.‚„³QMÝ 8êÀ Õ}ƒ0¨nvlÐluŸk’|»Ç¶²”Ðb€ª^•U•¥ùŒa®j~…Å«ª`43o9 õж ¬Õ°ñŒwýÎÌ›/é|JUôÛ.•PÜÀ¿Wÿn¶£ Û|®+ÍÌ-+ÆH™Ñr~tˆd£ÝH;»Ár»¾8÷“tyOl÷Œ‘wc<2›ªªhNF„Ð÷ –¯¢±u0<¡=:ä{›X4lj0ƒ0Øl/ÿÓ]n¡ÕUGÜ3F¢(©¿h˜–Æá}‹c…'|¸a[Ñp’<4&çz¯oñùàÖ1¼éMóMÓý,žPŒ¾Äe×êtSÍa7²-þ‘ßÞóËPn÷Œ+Ð(tÍA˜nì¾z)˘™eéñ ŽÂ¹ÜíÛ|íÙ»éµP˜ ¸ ÊpÕ@¬Îoób}æ'ޱÙfC“4Ê£I˜vßktÑ’Ä<ºÍáëH—F4<’%ƒ=êöj¤5‚ Ÿ(³Í¡FÝNKÞ;¶sÍJ-«NmÒëÁá.›¹^sNG¿º¡è®T{4¢ÄÛL³у‹D¼ÕKë/cè3_ÀË0¹q„&̾J£«`"`K›­tw›uUU±cŒòÏwº¥öq`<Š,Î3²ZÄSÁÂÃÒÄZ+ÅD8Âæ õ“õÙ)Åœg§ÇTÜ÷²€€½‚zLŠçõóóvŒˆIÐE£ÓVd1îT2Ðàòvvˆ I¬š(K©Xé‰9cdYÙHÆöoUßš“‰Ž­_u‡-Š£¶³¬ÐUé5ÆA†Ÿw=s¿úþ£ ±Uî¶q_9Ži£Ü'zª¯Å´˜G%Ù®f#Žè÷WÿfDZ•‡Ï!Vå9eVàì'FÏ€¬Ý@.O”vèÜ4>êÛ.bJH”$2ˆéÊYÈfíU¢c¥Õ|Îó}§Ks†Ø•ÍnHch|Ÿ ¡ÚªÃ#Þ^ôÑ…¡Ó}‹- ÕctAØ­?E×z‚{± šh šôÞvëîGhUÆù¸s}E¸óÝ®"Š0Ñ£óDŒ¿ÿ|½>ýåã;¢¢×îˆåºôGß)ÉlT~;Ï¿Î×ãüÛ—ߎXoeD£Òë90ª°júYpvÆ)º L‡]wmP¸Î¢Þ݇jz,Ž&hLbq=ÎÀÈ*g¹á÷Q"×B´)\,\o8×üÆ¡¬uØGà±Uj¾Óò¸Wk†Ž(T>¨˜TT?î¾Ðí."g…)w¯6ÚXrÙÒ|× ÎiäG™öEwÅã>Î÷D¢Ì¡°ÕýãƒwéƒG4‰‚z1£OaƒY‹d7çBòvjâà1V?ëÕiçxT3£÷˜šÍxg \·í¾õÖãù®ˆ¹¢½ÖÉÝÍ¢s¬ä<} å¾€htº[äawÍùâúÅú_p½bõÝÂÇãqAݨåбòJ¬´cüŸŽ”ªpoé¿­š:žãÙàj´ ³Y>Ñ{¶übãÔë(œŠÁ¸*ÿ>ƒsÖèLaàq¨g_±e;Ú+Àº{Ì@ÜÝGŒ+ 5ÉÇ莪Ɉ©ÏzÇøPD)ÍëBM¢ýâ÷ÇÏŠu¡›ƒžs?óüSÔé•ê4ìÑ™zR]ßO1|÷ý ?ùñqÙx¼9xúœ²ZçããqÇëó^}<¾_eÆãGöÿÖ÷_¿ÆËQD|ŒŸo<Ãê»>çÇc½Yxôíÿ÷òáÿwýáš©ªQÎóãük^÷4ÍŽÇ©y¿ú'™cžûMøããøèÇüõrÕóùÂñ<¼8ª">YsüäôÝ?[ƒ˜óïï÷¯ûøÇ™õ õsŽ]“nÿy>Y}Œiâ3{:æ}½^uÆÆfŠŸk&Ž1=â?ëý³+¡Y=ÿ’Ñ«k4&pбœ:NÛ¼|uBðcUO)‹Ä"*ø–“Ntr°KtUXÒ¸ƒd°eÀv¥Pê`Ê6Oëʺò<§P™yγ»\P¾±Ø¿Ê-š 3*æt;ëª^C%á=~w)1Úg[ħùkЇ¤­Š¤ <:BHñµr…õq>züÅÑIz¬¥°b GG™m¬@ɼ9EÉP‚F"kŸa@#F9»ÝÕ}]êM5«6‘Ñbv#€àqlL%fÒZ•0›g K"†måâ^UØ=& è5G «s9Ïó´h›•2ª«Êÿ2à0cË[þX‚%øÔïùëüvþxŽñõ¥ø^b»óvÞ.IvUwnHÛ^È‚ÕfñàÌeyx_È[,tës¬-T±i„DŽљÖN‡þ¬Ø;ÐD²Ð†w ˆ0ŒhX_(ÒÌäø¾š¸­6ÒqŒkÝŸŸ×q¶¾ÈªaÍ®¢›\ 0¯€0IÖ¦Áñl†züéykåU[–,uÚ[A\];Äq]uœ{UŒÙí›n1¾Z+Äœ“mgÀ_ûøGç¿ÿßÿ—„ûóÇ?RjÔ\Ãb¬:#œH§W±8ãXÈå1zVÑ4fÝ+5¢ü"’ŠìÙ%ô êÄC9ç§ïmQŸ<çŸçÏïÇ|ö«GÄ1õY¿î9`cD@ÕZ:®³î_ÿþíûÿþúõ3"̼óî>ÖÝíëjÔy¶¢ÿñùM³ª#¼ŽÕ?ž˜.ToŸWü7*ÿ͇{µ·âçy÷õÊçƈÙtµqòømþV­Õ±ÊsŽ Öõ>¬è–îûþ~&À6ntw=|lʹm8¸³1Þlr;¾B4(ÅÚ—ò†º#¸ÿën‚oÛz–ÂMcJUÜXVÍæ†ô 2 œWÌÎòPuŸÒN&ãkÈ2aÜ. @ï4 7Ü9 VNBø‡—·ÁÚ‡+…Æøâr#´mqܘ ›"N .¤"$ö~뢊†¡½³‰…›„à{-G‰"[_ÜWoN/) k0ª¾ŒÊÆ{ àŸ»# -ÈÚÑÔRèÓ÷µíæævíÉ¡/xÌürW9+Í(nÍóͯßáæœ’Ö¨[ÂÇÊÎnçÜšYJ¼'ndÚÚ™pW­@o t -Cö`ň£µ²ß×ýïûûñ¿þúM"ÙdVíYžª•ÑGúÛ<õð•«r÷˜ÕC&¬ÌÌônì¤g» b˜A2؆g?¬ ´ÕÛ-Ê9í¹íÕvèè&Ší].Ÿ !©zL V\î·RÒÁ¶ÐkCýawåi¿Fcd6apòdœ‰ ”lòáØ9®îŠ–³AÌ£ƒn³¢‰8à'Ç”,¡ @p¨û]÷NŒÿñW’ƒc/}·|å-áÝ ||ùö ÖÕõÔŒ&ºm©qîK Ýu¡²¿ï˜±doäìšÖ‘c”‡&có ,x×L6UlEX¡CÝ8ZÇd>â] Ò,‡œäÝ«óq<ªìLƒÝ–ƈh_úBÄ"UåJ+ü:ˆ©ÈlH,uk¢Ù2Bs $:&ŽkzRÀ{ˆ#ÉÎ^eUIKìnÚQ“+:Ï9YÝÝ…Š— GsvM‰QØbWT[’4£ *›]*xt©€RÕhæRú¸#_<Ÿ³U”êÂÊ·³áD™uþö—÷Ïûããû¯ŸŸÐp+>Ž gwf笊û÷²t}]÷°'™7›ã¿Y€üwË•ëû8â~_Y·„~ò.w¯:Žºðî~ÄÄ;C“qÎÊûÊ÷¡ø€ß÷Z]sÎ?ýéOýóz¶XÇe:݇B3ê5P¿Í«î»«ƒÕw£¬xß«NÞ™'0v$‘ݾfŒvåF½M`¤{2¨jÔU•U˜s^ïÛê)ôQÙ/ôâ@NÕœ‡¥ªºÞ·4¸]²BÙÝö¢›x­Ñœæ´”rÂlŒC-&D@Ï:æ˜gºéu#VVYm³]B8krè¡ +YªU" ·ò(DC; !W š#+P¼Žì*xžLV#ÍRÆÜºÎ;ƒÛâÙjh¯JrÀ¸®¥qÂjä<ööÍ;‰šëÇõsþö­¤†P!SˆC"JîmÙìÒ­T™ ìûæ4ÙÞ¿t{éäÙ±ŒÈÊÐ~W^„»Å°Ôíê®nilŒ¦‚h[àfþ7Hµ‚È+e##Ñf‰ÚÖNp¨ö%•¡Í)Ü ì›ßÊçy^×õ˜ó¿vMê@¶>ĨöûVöåFhPüÚÀ€£ºÜÝ(8YÝRl{¬»³a“ìw0„ ‹ ~ixƒØÝ1Áç™c ‰Ý]Àü—Bcã–«‹”¤ÿ½šHpsÚå.2$e&·â翈iÍ–­¬›ê箽^·u¯"ÕØXýñùàn×£7‚•îˆæ{…Uµ÷.×ñ÷zMïڒίú#@AtÛ:žÏÇìuÿþã—Ž9†øxìNvñØOQ«—Ûã8¿M¢>_¯;«A7BÄó1²«ÚšÀ0r•;&u¡ÍЪ»òŒƒÝwùUã˜È¶Ü®åe”Ùò>ìÞŸb»lwú9¾ ¯£{šYóm|q B3Vòhúìž™ÌîæÖ屃îPWo÷Ѷ%U•ˤf„ðüå¢Þv±Ð5†Q†·úÔD“c{`í¯:î:ºŠãý~78±ó¥0ÿˆ¨-H)³H’Ý®˜RøÊ<ªÙš…MÛØ»qÛxv‡Gî2ˆ_¥Lz1ðº^8&PEˆ¶¸*Ó…@zÖ81Ô µ’gØÝ™E³k_;Ì`öŠr€A%¢ÊåNr­éž‹±@5U˜5‡‹¶QFåíj““vÝ67@àx™–H]T½ò ƒÆ(“Ⱥz²ó&¾"¸È;ÆXk‘ªê/õ Ô dd»CôóqeUcBŠúÎ’GÄØªÅ­é ¡H±²l Œ›ï9|ìhhw³:þ¨)€F×Ý×ãç”1Ä¢W_<WÂ7Ó@G¼ïå1£w p¾V1bšr ÷cg¼Þw Kám=7Î8@–]¤-”þ¨€¾(‚]úœ”Œ”ð­5‰ZèÛM²×ýqì Ud:YœÖ˜ûZ §¦²Š#Ú}jȈìŽ(b ƒømžšG¾¯|жŸ ËùÄú‡m®ŠÞhÜþ¤ Òcr$Ž•‡õk; TŸÌ1dz‘w~‹£²‘iVÝžpg×ø9ôÉÖÔ“øËzcÕõ˜±-KŸù˜Óy¯kö·ä‡Æ?®÷NÎsŒ·?»Ì€v0F­U“ì\ÇqÌà}]1F|èºÞ*²TžÔI¢èÏ{¥tD07Þ÷kŒAüPó¥5º¿ÞïÏžb|0&Fè/Î;‹k„1þaâ|sÍ|À‰Zª‡ï»…q<Ÿþw¥×|dè¹êdÜÎÌ+ªñ7¾×±ßÇøÓññó~ýêû}Õã¯ÿvþå¯Äü­?’ p›¼r9׿ߎ6¼†¦ÑwdÂhT¤ædœìÛ®jÝ/ WÞ|Ôåë FqŒó¹Ö•ÀÇtÿ³¢”!ò/ç‡tÜüð€°¯k») ²ÑêÝÈ£š È»»#lûî¤(u©¿H˜TRÚç•¡üŠLô¡•@Ûä"uGH’k/wðÜ5ÁN¬¶½º£¹‘!3M«¹sF`í€=HX(QÃÝdìÒÀ°L‰DÁ’vL ŒÈ*Ê" 4\ÎBŒ Ñ!,ä ˜ÚpÞ½Ï!°+ÿ+þÊÚ¶hЀ3݈æ$»*ÉÝ7ù¯Ì­÷Pfñ‡l÷_f_ÿÈ/í*I‰&‚hfÜî9/ì¹9Væãˆ!©×Mw´¶rPu|íÐï°l{ÇLŠMV±6²â˜#ÂÙÈj¤ƒJȬh P{ý‹FêkEðn_íÓ¤A"À5þÙÃ{vgïè ðØM;²wù²?a·#¢ÿ(%í¿ŒxhÛð<Ϥ~ýzýûß~œÏ9‚«|aœà`( Ñb£ÆÀá1Ï®ä×µVÝ«hFïÉf{ìÀ³Ö ܳ›UjVª—j0˜wö˜5öë;ÅjTTyŸñ9ŠÒòõÓ)u' ¶'PãÀVÒì¨óôà˜/Ý)dÇÞK2^::‚Ê;‘»?l¡M­Q¤8ËE‚æ,ÊNÔêj:'Ûj‰K6­Ø½FMBŠ&š€gwKÅHƒÍˆ µåF†V£1n£¾Ïóä,–ƒçœ¼ï{è:PhÀìY+¤¡Æ6æó(¹âVeyŽÉl·Ã† Qµñ6¡Á»ºëà#¶´khd8s$Iãuoicƒc¿±UV1†ŒÎõš­p¸yhÙ¡«V°¢Åu§ƒc—¬Ö]ã}Ô ÷8ÇYñ¸Ì®fƒPÁ› pÔ<—L|áè¡9†Fó fl¦áP˜½Dðõ¡¶H…áA'ˆ¼ëã<說ny×Ôû½fú·ß2óµî‹DçÎîÚ=×Ü2n´˜.Áª~{ŒuÇŒINW8˜ÇdeJ³.Ïãó*_‡+ ŠËåg´{uÝjeLßš<¿ãyÄëÍ_×ç·¢øï=ú`t:?ß?}Ïõª{ýãáóÊÓÝù¥Âc”ÌwÞíS¬bÛþ¨÷°[SïzÍãîU9¤c.Kö}Öuê ¯Œñh3=+ÏrG(‚ùùš ½ï:˜4¸Õhé*Ïñ¨â¨x𘃯û‡FAu«W£(1”÷G,e{ &„wÒbC¸‘1r¢ÖzEÌw⃢’ÇVÖ?[Dº¬̱}¼vu®5GØÜ.ñ”T•¶-¡[¦«ËŒ¾³WƽÑâÆ(dV×=¾ÕhOÄฅ \öŸÍÝ·Üf†Qïã˜î®"KçBÓ]í2Ô@ŽžµK‰ÑUÝ Á­®(Ͻõ…¢Ê'bóÐöhr î¯òŒi'Ðm2hGekß¹d°rO¥á©u˜n…½ „ EÉî{2_ÞUŒ eÏn†*—€ˆØ¡UâW¶R$ÂîZ#À€¹gìMÊ$¤¾æ»þ€7‹Ñ`ƒÔªï7»«°ï’»þØÈõ}‚mÕ™õUâü«q†[IJóH_ø³BAPCÔ¦û½Ò @‡äjØ3â²Ý sç·2Á‹Ÿ]Eä~¶¢¨ÌCÛ!ÜðÌÎEûW®íà>=ú ¥ R5ø¯¯y_åÏrm±ç&Ã_f€†å=ò©Øhè~IÂî¯Ìðµ×WýGDUÆ2»zJ­/m 4"ˆì |;Ÿ?>ÿã?_ß;¿ý6Æìà"zFX0Š\BŽ’c²[ñú¼ õÎzwQÕísYefa–‘&—üò›ø³A¥UˆÝ¸,IÖËK^#ª±`xÊ¢CÖåÝñ.WUlˆ*/äÅôŒ‰ìå¼5.ñî>ÍN¬~L*Ü{&òUÄãTcÝk2Z„+e;¨ÝðŽSât°s«±Pœðé–t4'H{ˆ„׺CÞËìÇ7?ÊCÈûF5Õh¹w Y’ž²sç¶VTÏqê³5sqºÞªÅ>u¸l¡UW8e¬ò¡Ó1ÜÝaÄ*,HÄ AãnT¶»¦§b˜‘ªeê!ጫ®–ÚÝë1±àb(8… Wþ‰Wó2qíYÒ/¼{º&ÇQ˜«•<5³ÍçXÈW7ÕEÆüþŒûcF®Ï!ü<åˆ À¨ÐmCÑŒ¤…xFãã1V.y!Ó¤C´·ŸAÝèsã½–3?žç»Ùáf7xÔ¡_ûµ#@µ‘v[qt¯>ÀÏ¿ý½ ÌÐO>íGÂýqM&ÇÅ×µî%”¿:uÚèÎ)œNs>†ûqŽËÙU׫ºðÛoßÃÝéóÛyéGŒÏ_/Çó¼ËäȘ¯åË÷8G‡–SœŒç÷çoÿƒõï>Vž‹•ÒÌù\ãºì«5®€-Tæ}tÜ5øñíG]®WWÔ;†Ï&ºl²#ÀËSɬ+ZŽŠ‚ßíqaód9œÁŽñ-»¶'9Nk|›/]WÑ¿¿ûÐqÌÁqõšÕyµ^7Ñ3{ú,ÌäHÎ}Wîõý<ïv[+)ÇÄFÁ™ï˜´ãx,쵇·U ®ó|úà˜¥ûµ4"Å¥`p<ÚaÄ|wS˜õAUŸ+ ð·]êVÖhau€5”íIvÖTJ…M– ™·ã¨ˆÅãW7©ŽŸß3ZSä>ch„Ú q;ܸÁC\%ê0èÊÑxÞö OLeÖê{zaæÐÛÛ«±š+FŒzÀHc|+´ÏøÙ‰t *Z«ó~ÖÃ:ª„xöÎÕÓ¥î ËÕôꮈbdWjÔÞ)p“ÆÜ ˜Ñ ºÄþØ ”÷pÛ]&þâp IDATY ¥»ÓÇ\·ÅCKlê°ãR¨Ø‰`îRߨ@Ò¤eƒ-XÃPì:±†É6¬¦š0PO4ÏñûïŸÂ\Ùs*‚@ï¥Aå Œ6«£½zaî)’MK®’ €ÑÇ-jÂî@Ž«g–AbNÎ Åâsߺœ{•RRtot‰ÈƒØøàtfb:‚ý×#Æq­~¯4x¸åœ´ÍÅB[Š£»ÛîàÎn–THˤ[ÊÜ`p "»ÁIZ|DàýºçŒu÷üÞ#z<þ(Ú8Ã]·`-Ð4‘›¥7{[wŠPéüö—Ç•ë?¼ïñœÇ_¾M²c¤ˆŠøôX˜sr{Šüý||gUý~ýøýÇ{•ï¬xÌŸ}•Ö³³ sÆ<ªÙx>*-ÂJbQ Ð>¦2¸ã-K˜Ö‰CÈpºŽ.•¥(H÷RרÕ~WŪxs¾çAÁ¹Vû––Ñ¡UÍÕÙù%RÄÝNv©ì>ÄÑ%hf“hÙ)Þµ3ØlwÚU}BcŸÜw½àšÏâÕêèw]®…^sè¡G¦VÏ8Nu~ÀÿÚÞ`É­%I²T53÷ È—•]]=ÿÿo½è©¬Ì÷Èà^73…ƒ™U‹Y”Œ$rC‰@€îfªçT¯ææU¨²ÔÔ]§ÍŒËqÚ©qÝÆ«ÔäáMªÚQeéœÄs°ÁQòÕ¶Ô;ôZieV2™7¦i¹Ð]ZÅ艹s”õÑý¯°äYÚ~ËðKÉõšT/VUÀÙæwdÿO±(ôóìeŽkÕcÞýë¥Q©ò¸§üÙ¬ê²àÏ ¥Û…O1)|DY”(;ÉËš¼ñêQשéÕ«¡æ­‰äƒfã<% K‹00• ÔëZ·ñàãÖ&zÖÓFµ×Ø™%F½.⯪¿‚ø¸‡-<¯:¶a¨àWïÓ3Ž…Â×é_t*B½`Ÿ¸yÑ__†>Ì;šöû¾À~ê–ù4fÏñÓŸë¨o†øé%\÷úûê*¢Œf*ýÇóóŸxþ4ç4áz­9Ã3cõJx0´Å?r~èhsÕѼŠ·;uÕJ›ïüÎÜ[ñ(.­JkÝÜK@uöšÎC!\æVUm;û-€gç0Ìyï•u>ï÷¸Ù ê0«•ppÄYW›‡KÍ4Sû¥«$3|æ•H oÁKXy™¥róçOŸCžÏ{.â΀ÉaÇü0C‰5¸WÖÍÕ©¢ÚÆ ÏCß$.Ï=â@å™·yäUßÇq½N®n+jK\ÖÕÉh"u&3“Ûº:½¥äRØ8Ä©þ¤ F·æVãì’gî|õ2ƒÑÇ —ʺBJ½÷c„ ”Áö¦M]ûÎGÛí”®V¡X~­k°Ð•[W|,›Pn¨{§ÃÝÌÎ*kÜDÉ öömag3dUöRº3ß,N[]¥w£0ÄU‰J·Yk™J4ÍD]MÃF°›ì"«¶h£7æjKbÞ Çpol~€ÞIdÜo×ZîÞ¾c—ÜxÛ®×n+Ó®HT›Tçâ6úB‹‹$Máo5«Ô©w0¶`x{cüìƒjc²þëïFÙÔ“”µØ Ú„õªkKsT«P/È`·¢áFtæðÉ+/ScÿÔd.dUo5mï׌d!êï_ÏþCUí¹¸»í&gw#k/­À°—d½¨ªÞ«;•Þ©Ú÷󦵧…*Ây‹Ù}ëk}~þ¨ŒãÆû0] ó1< hŸ³ª: "Ììмð,SV·¿¸‡6#%h'¨-›ni@øÕ½”6"M¥:ÁÊB·ûŒ†Þ¢kucI,,l¯‹ï;°Y=%§lÊ,HCJªáSÈ<=, ëí~ô‚•­ž—Zj„Oà ÝÜJµpmr%ö*fzЩ•§¥ zt›-Aè·«²ªI˜™ûøÕÚñéÚð튿€j#Û™Ömd™ŽJJ7ÐKsŒÈõ…ÊÖaÝ›&ìÖÝèBËçX† }d8͆[a‰Ì«³÷¯5# 4ÓLš™à§ ZfFHŽMé^ÝÀŠf”GêŠN™Ÿƒ§IÀÅ +Õþ¦[Úáw4†FÇ~s‡]:ÿUÀWå–©ÇZÊ¢ÅJCL·B\aÉ64^ye—H#††Ëbõ·¸•õ2^ÈÕÛ49н¨VútHθw³ùKj תU™j¬]6|‹¬vÇÄ9ø>‡u¿vJùâ•}·{H-ôb¥î´hëÒ’z |ÞÝ{˜Ù™py»y«Öu ô E.¶Ì–c=Üöô5žW­†›Gƒ æýŸ™ÿXÃ’T5F´tÌa¹‚áÖZ\-o…4UòîD&¬dV~’'ÛÂh“µLš5K}n^bc–QÈ( óaZu5ê#Y *µÉ ~tŸõÊIG£åŸëü¸Ã³­Ê.ñˆ8îœ?»qö¸:‚V0âl)é_,¸9Ý/JŽÎØ•7OØoÇHåY}ªV”“üñó²pNc år) >x†5êE”¨öÒ¢|u§L4É Ùˆ §º¨4hFw—QÑ»þަ¥ñ3³Möcpßàm]V$Þ¥‘´O·Þ—I¥ÁÂ÷k5èÝ*õpQÍtSÇîþùáVRîOaq$ ððÁůVˆÃÔ•„TÙÖÕ¸õ„1™¥BM£÷d ¨×fZÛ¥j¢™yx6Ïâý KšZÕM‰mpƈbš]‡ÍðA¢Ô ¡z¬ÆTvŽ1/¡ReÝÁ¹OlŽÞý_)–oËJS$D[kÛ¯ÞÍ„ØíÖ¿û¤÷j*¯’Äyeu‘dÑà[ ðTpóê#ˆPÑîÞYN¬p’9Ì[Ü'š±Å}Ú“ÌŒA˜¡þ|g–»ß€H,ÊI kgç;Œþþ]X‹¾`CpëAfc½.ÀèѾŸpÀ[:-jÃ2©-<•ˆ}>Ü-Ü_¯Ðß4c šHØfçÓ!u–»Óˆ ¿7ëîáFCuCÛ=(ñ¿œ?ö7@ëp[惀¿®~k] Ùã~ïk™‰ŪRwïfP«çœãÖé~®N…YÖݼ-K`·$)xùváöe º±êÙÒÕåî›co²«õ~Y±_Q’æÑ.Œjo°ˆýÃhpu-ÑŽ7:X€ žÓl4ÃX–Öf›RÒL¢å‚Q¾»}A+ ¹T -Šï/Bê ”:ÙiÎ!ŽØ¡*ÚW]mm” n•j¿Çö)dóoöŽlßf® 6ÂÁ«r4»P]cºGóYÆ©U§DØÌfV2 Ðh…»Zò¸:i†v.áL4FÝ*®5hý tš9òelZŒ83ƒºðàSY“Q cwN§;+áø%”TÝ yX£ÿ^Ò­NÁÕAyŒ§¥{­ësC€GiÞVJ1`A°K0Ñ·k!Ñl¸Ú ³î´`™¹í26‹Í± >2I`˜™¡GÛ„\€y´¬²a6ûµ>>(Ns3 æ4‡¨îZ-X“qÙ…,\x˜³!Xû.ÎI¥¦œ-Œ€ÞFð ÈN6»ÕBwû~ëNñD;›ÓÚ  ç6Sü{ퟙÿÐáŸÙÈŒÛG~}Ùí¦ÕR$ÖU/ܬ UFÅuÑûú°H>-€ÈŸ:7žÝF36º*{â~ ªl…£ÙÔK—lÂÐ]2ÎûÃÔ}Ö®bË\ûxÞÔ¹Æto½Îs Çð³rFwæ =b¼ª~þÇÏ?ÿë÷¿ ¢«ÛA3Uër;ÑD{רR•7¿åë¼c­E3?|•õ˸Ì]FšPƱDÌä4ë6Õ×u-ÛÅû0÷ncÚ¼ˆ’KÁRP®FŒë¼lÎçëéá|Œ¯ën±a¥’Ärožm›®]Ý”«/6Bh§Ñ›D¼/2@í¨#LµÝmTß7 8Á|²›”íÕOA >÷#mÇ)ÐÝÕÐ$9ÌèU‹ÆÊz'Šnoh¡‡Ë,ÛÉô Œ6¤ fŸu58ãʶ߾ÿ¸Ü»{KÝ¥ wqd?› tUù˜p¾®eFËêì1cA‡Û" *Arö. Ú,À@ˆY¨7úžmœ&íìlw[xvñýù²?cÕ„Œã¸wã>Æ?hffA+gÍ„­à1ù« GŒ¬Ú©Ê"ÜÌTµòz†“#ÕêmóæI| 3«kef˜oîÙþϸ3›µÖm€ *ÃçG…înã>mm`ƒ»-Y5+ w÷ã÷?^瘲K¬f«ƒ4•Œ,5ÜŒ€¿¦0{øñ_¾ž}É6A Û}C¼žŸAs£zSE ¡ªvkº»"ÂD3ËùþËÈÇÌò:wKä¸ÝX]ôÏ?¾~üøéfc8U”[kIrÆqNïn¿=ßîöx¬ßü­$Ê![$šªºì²ëUÕÝ& „þ:;ª%Uö*7‹BçuÆšìÆ2ÍèšÓ=ÛNÝÆ(é•y5ÈÑûW®âèc˜]ú4€]•XoðÑM”°Ì’J€³!Ú™š²<³ ˜±%É­–úaÎaÙkÇ –›%&k·Ðz$›æÑ\’ZMlРu—%8(Ú0Ãî¥6¼G# ÕUèb`‚ëUÏ8îé±` É›E4tå-ÆVÌ«“*ì² c…£(©°yK2ÐÉõç{>Ï6ÝÀ;<ºl#ÎÍ‹ñC«2ãˆ/>A la†›E­×(/gn²Ôs?Aa˜›-VƒÌ•Ljw|uýn¹F8»\ËY €¼šÙ%¼ÔMÌ¢X ªY¸JíîsÎe™ÊSùi ÑÓ‹€—Ùb…äÝ7Fˆ—±I2²¡ìˆ› НÛǃçËà»EÿxܲžZµaÂ0\K¾ÿǬ^#ku›­yŒyf]Ep¸Õp¤ÚvÐ$TÕ#¯ñ –ÑFØçÏó¸yÌQO`åI[‘+|1ñq’­S>n*ÿ™çÛ™jÇíËrÍÛ1þrýMa·ù|Çå^˜’Ë<¼ ÿ;ÿˆ;ÑÅÒ·òyÞž@vňa¥Õ‹Ç-$ïë¡/Ôy*䯀i›ºÄbþ¬.–=€`ÕwwPm¸¦Ÿ ªÎK÷û÷çëº=nŸ×înºZýaÇù{Žãã×­jUu›Ñ†žëû|àI—!ñê5ôýùJ޾>×a÷#ÂìuU¨[øÝøº²É3n¼Aº¢òH sÈ“ƒwt]U=©zcÈ®ª+ªI‘FEÍѼã캆‹×åá^P9 Þ $o6ÏѲèŠ,–"âÉ~qåjo8­S4 %§|UÜF Âz%+¡¶6¼³Íî—Íiôg'hÏpæe÷b½&?q€ÎU>lJ¿ü#ÐЈ¬itE_‹dY\Ä'ÛÛ-Ûi¾D’AÀUÃüR%E§™¯V•p½¢-ÚHÔ@w­¯5‡3ó’W^O‰7‰H™]·¡ãþ¹§¢«FŽÉ‘êKJ±-k|™`5ˆa¥öLÖ¡tÁ=bøª=#õßq G÷åî.W‘ˆ½ÀÎz~ ß–@KÑeN1ª5h ­~¹MlÍò1|GŒã³Ë¢a¢ÍhÐ*ë¶¾ÊP;S’Mê´óJ3›s³¥in¥}®t÷'À–Ɇy«•b èá^Uæ4ƒ¤ª2»(µm¶bñbúmváóó÷yÄ1¥̂Œ¹ÛQ…¦Ò-Ár¯ZœÑ˜0mNÖ>Qõˆj™9aîÈ,IsÜZ묯 œV&_[9R KI(¬{h{ÎZ9ÊZ^ÙΣ—LCm·ñmñÓÿ娟þ×ÿ¸ºûÛÿú˜;’éÁºÜµ®¯ÆdGÁl•…¾ýö±Öüù´UD;ŠÝvš/u¶“(å"ÓH'?ᔆǀU¦Óá8z–eŠ´÷sô¨jÀ+ø{5É2¯*Ó«Â.ÃuUÌñ?qNâ¼Sº.ÂOs6ãR!eGµ-Ü=^/Ô\`Ð^<4'ãJç³®KE·áQ­ð´˜åj¨è\íÝ[™¸ÝöWõÙ…p¯21ª6lõµo×ϵ['Âb«gÜÜãw¼B<®ÑŠR‡×ð^žKöS3­‘:*îý]ËV'¨Árš7TmÆ…„ë´Òñ œð$Òp_a œ‹]~>ŸÛpi‡ˆ3tFús–NŽ/ƒñMX‡]¹d^ ‚fggUÚc²õ8&íÕ3a §Uµ /­Çúàr«Æ ä)&Àþ6'I˜ DÜF‰?y}®¯ö²àGYñàqûzÕm´ã2õjãä§©’®ÕÇà Ó1¿^Ÿ;?Û9¾‡ÙÝãáü¸O`.<þýõ\ÏúN™Úju> ×ïrÞ ½põDª‹¶¬òÖ̪kPÂXú JN]ÏŸ+¦½ò‡ÄÕÃüÛ˜Ûzæqt×O³P ŠÍ³û:Éj«qA›+ÿ‰çúÖ|fu¯J³ßF<„ε(»ÎÚÛsÅË‚tăZ!9…Õ!Âæ™¢È¢±k„¯uF\0roÒá*°9iÒ>6«À¬†Qt÷0 Þ·ùµ~ŽÇñâW¯zÜnä$××Ým°~do .Ä×—™Ã±3í™0–Áê9ÂøÔ§²/q©ÒN8§g¿‡J‚KBô˜`A—YÁÔîc-,‡€÷}À¨>¦?ó‚á~«, Q*©&G›O¿-}î+£™)@SDrc*vã_ÖÀ\é1vqP¢š,í 3L†íÂÕÆ%¬ £³Ùt‹’öñ]lX¢L5ñÞî»™åu¡­ Þ¶é8;üPÕÖD;c7( ÷h˜hKvC=~]kƒ¶Û"ÖbSR­~ØÍˆ=Ž:½öèôºÖnÓ­ý½mÃ\ì.³ªš²ÀRZß7:‡6µÞ63òïïgr+rèÑ25²%¼uhÕC’Y4hJ£m]Ø’¹µ£‚€Î"éýþ¡WÈT›‘4lè<àÍMæ„¿ê¸&¬Î‚bŽb©DwmÍGW@c{z7P eåÆÎÚÝ!îÔ„YfÍ9wÎbcO­eÜôÞë§6£#‚ðÑÝ«ªd%YŠ]Çœûòß12³Tb¯Mè¹Roß-Eúþ÷½Âõkf³£§’ÎJw h+÷ ~;½QYíd˜Ð½¶ Í"€ªÒ~½†O“N1_z.üå×ßnöúx-­µ‚Q*4:à¿¢½uqcàî™uq™yt`e%-]NïªÃÌn·|‡üQÝu›{^ý&Ö—cïô•¸®º?îÉÕ™7 ^uÍÙ@V×êÁiÖf惋éùy6Ç}ÿv›GX˜»²áw÷c埾‡‡ü¿]Ÿç£ãßÿò×ÿýû_e=éÓÆÊn‡ß†P¨Œ¡¨¤9צÉÑ·u:AÎc¼¸ÙíúùŒxã«/3 HO#h˜,sʆ5³5Lþß:Qü÷Î'²“ʲӆ¿øóůov¨;lh¿õÙ@Îëâ8âvßø¥BÊ3ŸåÃ}pÒ®áÓ®Ìë† 8¤Ââwûøô벺úµÂV ½Â,ŒŽÞâOw÷«÷r?}ÒF,;Ùø>pâ¢ÊzŒãóõ®ˆa4‡ÃMÕM§cc!²:Ï— ÖfÎÊ Ùž.ÖþÈ,êFŸ?¾|ÒF5ÒÍBÆ´eÉM±Ò˜Õ” )äò²'Œ28®l ]f¶lÑ&, ²´ÔÕ…T2耻ùnŪûaÏnfKÍ1om€tBB*»Zl¡Á°%ÃF{hCÞÛk¯lá¼ò7ßIë;Im‡¦%PUtf&ædþ¶˜ ÞýTšDBKEÈ¢hšÂ(ðÊøe,Y„Zê&ÐhÀMw“…Ìî-ÑÝiîΪºÊd¾I[T·­°Îý5ÐhÄÏõ$cî Im.Éþ°ÿÇûÙÌ ÕÝí@Ëö¢>=šfȵ–™écR°Fc…QÚm¿7æûT|Q7‘]{_ö‹^ÚJ½‹+ôé#Á”V[ü¹53ß VcVS-7ºûù|~?3;+á¾±¥$X™áD÷Þ“TîY™fxï¾ËA²j÷eFˆ)#“LN®gwÉAßcã–²·›½˜Ùf>UHQIOßd¹ï²sÑýÞ!âW.D†0",w.ø(3 ˆ2ÀŒ%fßà«Qö6+[ #ZðÂaQUOÕ‚îx0g† ÝëÊߟ?`ý1C•KÍÃIXxi5uw?n÷0‹Çc}ÔzêúʺÚRET£»7ðÞ‚{Óݳ­JÝ…Ak½á',u u­5|ç;‚8¡„¨ŽF˜Û-Òbz¬Ux®åaKýky%i›ä^„ÙÝm¶y>j—©·wèF}µÊG9Û!*eÒä;L£™Œ-ŠA; Ê­ê(²F€2j¦u!! K¢(f7Uªª‡™I¬nèj¥D¡ÞüXdÑaè½4çíD˜]D…÷±þeÚ„—nª¥.e[5w¨yÑp8mq¥y7ºq³É>³új…©pÒ† ˜ŠîÅîHM³sI‡ÙX§–t§ÂΪ’Òlxï'L(˜Ó¯ê8õ5êYf¯¼3¾z§­½ŽÃ™y•­žd¥ùÖh«ªvG¬ Ežã~´ß#t}7›ÍÂml‰9€>Ë8Çí¾ò«®3ŽùÛãNÒŽ9¿=nÇqƒ®Õ‹V¥’­°Ñù:“iìõ㼕þ¯ûÓ÷ÿõ§?^¯¿ýŸ¿^§Ôød©ª]˜ÖwÜpö«³§Cm6M\EøpНëÄALóû0µ‰•½zmQR¯¼a~àzáªauôrÔb•ú¼ó£ôîü³Î#Ÿ‰[ñ¸}¨Ÿ¿äomëv»êªªÛ4\ëÛˆ#›y‰efYAÚZåð5JtÉ|áš#523ô;¡Gú£¦ ðyX®±¨Ï뜼ÐÁñ}D¯k#”zvá#oŸ×W;bæ~“DF'ûJ›Óìu4XzAËZV~Û"Ö†ê\Uî>oUp¹WLT{u?Ô¯Ï}]†·”Îê9®¦.Y,Z×­ðîN·T«—]Ëyã,ë¢ÃÝš”gd±:_ƒÞ‹nsEbSþ:Û,@¶&¬Óº,­e³GÆ&_qº]¬D¦ã(À˜jï‘êRàñU°Ëà Óe±úò/¸%ë‚: v-÷áÍÎë9\ƒ˜-+hÝÒêË^ °(·³åâË¢½Uý0{ ´®žµžbÑÂØëås§ÛØ¥\:Žcß—_Ü×hZ£ Ok'hÝ`55ƸòÓ‡¨rµmçDªa6džâÒT@j0i™½U{vSáˆvt8ï@oT—Ð&›uìDÃ`f´N 2…Á£¬E‰ZÂiN¬‚#s=…µï(Žh²V Ë­»_î£ UòÜS:ÿ‘óäÕnª&8yÌkëJ÷YNÉÓûGåÝæ€y6Ñ0f‚%_æhÖâÙ†Û:¢Ü ¢Š.'€!€QÖò}W ù€ój°b±„Å zK±Ö`ª2pX@TÐïtW£yù\†ÕBX  ihã¶úô›†F†õݽŽiçyV¦ÛÎî†MÀSÀ°Ý\¸Ìwêº2·rÄitú¥YÀTF·ÀdLºòÿùùüÿûùçùø×ûà ~ë´4‚rœ½zð›MÄÀãšÿç?þúy¾|Ž8u—»Ü8?lR²G—Ÿεîœì„wy“ÅvÕò²Ñ,9 /ÔËùZ+îX¸"«ýâa*[Ÿ†S¸ÀA»‰QíÐêL·9F–Í€~æ´Ç0«ªÕÕÞ>Œy)p²®î*k4ªGª½ÒÒÜWÕ‹¸Ç­«,Âp¾:K×½}HU•Í.ÝÛ̜͕gàÄÒtÙhÈ…¬5xs'Gg²áµx7GBLÉhm¼Ä³u¼ç©f„w™2hÁlÊÌ«[ #MVY€™=>¹®^`Ü]´|€÷Ê;ýéñ ›«JŠÛ}2V®O¬¯Ñ3ž•Oüèñ\]¾÷Îшªž­Xú¸uô2A¥ì«ý‰Û}ßs¸ðÊT1æÁìJ«l çä»û3Ú*u<>Rœ‚hµé#cN—Ò§ó6T9 ûÓM2* ˆYU-¥Þ§4'~›×댘•*pŒ8£&qæ·‚ÁNã)¯Î¶¥yU%àõ¥µúlþ¯s­W^K}bqæ2dßYWÃÊüúòw­óµØ8nh™ù£‘†îÎ’„!ùçßžÛqÔ«#n·†pòÌ…Zé góÈœOªWðŸ×kÕ…ûÿ<=üÿ?Ì«¾õÉ«»qD¯Wv1v54­cøoϵ–d·ƒ²¾VÄóÜ~ÞëºÒ–MÊ´%T7ºŠ#LêU«bžYî~G¿$#ŒÈLtï«›vsŽÈ*Ã=ò:—uذa$Ñrá‹Ò¾¥ÂÎ×eá×Ê :úf´•h3Yl#6¬Ó#Bêâ+¹ý {ÆL2ž¼Ì1S¹‘‚Ý×—ÐRv =Ãâ.-ƒ mhu:§µŒlA­$1ÜÐÍ6É¥, ŒþŒ–ôO0 IDATÌCªë9R‡AV–ÑÂ|©­E`ýr’èUA›˜¾X;â¹ÑIÐ`•H—Qm&‚í?m™Ãä­¦-ÀÑNw‡‰Í¬T7Mƒ¤ €QÐ,3¨¹#ô™I >w” ;_Mt}=Ç-Œ`­eî˜ÓÂU½­,"hrö ‰»D£‚d`£µzC84­˜» ÙE¶·W­ºÖŠÀΓw‚‚´lsXá0Io)v_yu˜Gô¯îv;`osö û¾ê¨«YÀí×fÿ@©n¬Ù¨Ž–µz dö¿T}ª€¿JÔɽ×héa4Z¯ÌÌ»Û(£¹Á±§gŸå™Ý­Z™Ãáf{ôâvPØqwüZbmÀ+­°!†¯µÌên¹a놷Ül£ð¶£W®4s¬ß;-¡Ñˆ.í. ô~çUÊ8v¹ûÇõr4[Õ¶ÁoBÈð¦èÁvìUò÷k(ìô¾¿û>[‡gÀ€aøä”ÇùëÏói™¾œ‡û§µBeû»Æˆ Ù’­:³×Ÿÿô'Æ™«¯·ú„¿:ï™Y7Ãm¤zëâò©V–»;ËÈ`½“" af°†³eR¦…/T…µñh}”Œpù@‡4;!A eÚ b$…~kE&B¨)ÔÈ5̯.ãè‘VEoŽn:FȤ”*ÝÍwEKóêʽ-±W©ÝeÑ)3Ê-3Ý,`ìjm,s‰¨qˆv£Àªl4g øKtáÖ±uŽ-A °d‚5ni\‡/ÊlolKZŸBÌ êâ0ÈÌ0¢‹¬+k?/›nn+åwK=§g²»U’…díãs4œ&C¶‰#FÎX*C{„ÓnpèÑ¢{ht®üUHlFWçÄæ}ÿr;üþÛÇq8ýìëù·áqØ×ë¼Í›QÈtõ&k>ÏW¸ûª®ZÝ‚4×0à¼òõš+:£—!ת’ê…úÑ÷.vV×ûÊçÏõBbu}ÿþý\×k]›™{ÜýFdžïÿI¦‰˜ÝRÈtµy2ÊV½ŒÞ9ºn»U†øê< ‹0÷Á,T_´Í–XˆG=5 ‘*ñj^ÿMúúûü1>¤8µÖúºê4hst7ÊG­–ûKg[Ìc~¾Ömžëô‰ˆ`ñû÷ï_ù¹çP/““MVÝe¨émÊVÆâ”ãºj¬¶7ñ²»;[‹ƒ>Í7¹À ó1a]‰Îf•$v3,¼9\6â¶VV®ëˆI±×a0ºgíÇÔÛm)ØE¼K²î ÷!¹€ShaÖ«4óhaYÁ2­$å2£ÁìpÉ´£ãì.‡´ÔîîVÊu¹KJ¯RWu´Ø}-v›HÁÚ³}©bp7 Ò‚°-dkÂ&>Ȩª—ÚÅ ±w±@„À’›9”är Ã̰‹%+‘mm»3mN‰t°´{ÿpµ€µ©îŽaZ×â0”QfMö-”Õ¬À{Ö†iV*«ÆØR:¢Øf½C @Biڌٷ©¼­ŒtXË{ÑÝ­u‹U+öÜÚlÛfLöfˆCBC‚›¸çÐv]—ñ?[Þ€_ª6îÿ›À2wAî»»(ñ}¡§P­ßäò_›ˆ®æ¯ëGþ~ÈùU÷ :¢ ã/Z&Û¡¨nÑl»% aÝÄ^.ˆ” ÐÌ9öF£äÜŸìeѾ›6 ½Uef ö1…Й-HÝ´÷R@­MˆC{oBb˜·¹[WL Ñ„‘Ú–]r ™YîÌîˆ0Æu¶¦98Yò‚ë§Hl¹ ¨ÔTÓÀØ)58¶ˆ5·ªñþ§?­¯ëüZŸ*åùq»#*gËØÄÃ,ÕæÃ6+êþýñÇYz×gö"mÿ²ûÝ Þ%k„ªÁVõ<,ècËÊÊPÑ„=*5®ë<ì¾Fo÷ ²Ö"—íþ,”Yj%·R'Ë÷èFªAÖTC©ö6ê0EPr6z‘eÞ“#ƒr§%ªé ”*о{Ÿ‚€4“ÑÌ]ØÿýÖ&£÷I¸Ýjô¦!z­=;ì­*4;¥Æ rn_/ºÑQ&±P\¼@¹4ºae$Õ-ઠ4—qˆªk­3ÐÂYñ]G/qÌÝns?:6ä<%ºýhÛw¤Xu£Å]ºö’^ZÝ]¯2‡;} ¡ÎzšË﷠ΣW~¤]ÈÇowà ‚¯ó󿼌¾®ï¿ÝK—»õùe„,ün°+óìÆ·v©ÚÍT«»Sü|½÷ûœs{›;;«>_„(T=œ×õú÷çÉó UyÝÌÎóì{ü|~ÕÑüíþ±¨—ú3ÈÉ<ó|}­µö¡9¥r ¢ó¥–(éªú™ëûq+ðu&l\«§¢¤¨p/T£:7ü™™çý>³VõB¸Î¦Á#J†îíÛ2RUÃŒÓÛÿ™û—/ýþêÆŒnó_ü<=ζ¼¥¯ ÆÑg»ß'—Õ×ýÞg¾– =î?Ô˜³³Î×Ç]:¯ëqÜ*mq¥Vܬ[ãpfføOÀûí5ùõãÃd#Í^ÏàA?ÊP­ëëuûx<Ïë>ÇÂWG^¯äÄøHƒZ,>™©¾}Ü2³0^8ÄàR´É‚•?¾Ý­i_«[ó¡I[ò\öÊhœþÛí7¢•uùõ¬‚š#\ç4×Òô[Ó~?_9ýq'Z+O‹¸òúš´Ñ¸dŸW=4~S¬z‘d+b“™JC³ÖÐÑ9W¡y㌫¯ m º³†‹r}_yÉqÎNcÁãs<ãxdÌÿ—¶7jŽ$I’ôTÍÌ#2T÷ÌîíñHþÿ¿Fáíòf§» ™îf¦|pTÏì)ó°ñ €¨ˆŒps3ÕO/•8MÓpy“i¾Òìù¬ƒw†§šô"'ry&{&œ¥÷¦ƒy‹.4Ê×uÉ\ÒmÜr©þa›´.=[Ö4úaŽÛ;?ƒ¼#Jh;s'Ë{“ÎV§ ^Ç—Ãuƒ€ÜT‰n#FY¢¹ËIK–·÷›fw®@Д^/^aÚô¢ËFßUUL™›­ùã€Ëo•¢éÞ™ê‹B‡¿fö×´þ0˜ÅÝß:1gqÜ :BôÕë¤`.:wž(åÏDÀlãÚ=T(„˜tw_}m°™µÜ@UU%á'8g¾·²´™ „N5fæýýí™ý‚v%㚺keפÙ¿eÀ(—¬ºÝ7Œ ;Þ|+N áqšañE|qc/ 0g8ÈNvï‚W™f‹ƒ˜s’2s÷×Îà=·zØRýœóv¾m¥Ø Vêа٠‚¹dxì*(á|®ë86òšãímno3·1Çs~>ÎÇœñöö>ãZ} ‘ ŽÛ ÷ÊJ6ƒÕ5Æøõý#ãǯ¿üó_¿çï½LöÞꑚò‹p«ÓËòy;‡›â*‹ìP¥ õ™³á1‰”½¯®ÇóŒæ8ºÓC鋬%,ó‡ÀoŽë†v‚Çñ*!Æê^½Ø9Â}Xöʵn8Û­ ’£ÈÑÐQhêÁ2è#5hu’¬~0dÖŸumD°5è¬í´çˆZ¡Ôa×#2£Ež¨såt®Ã¯á‡}9¨µò•Är™.Þìæ%¹?8×m]Çì‘ZÁïÊ1Æ‘šÖa¸¤Œ£ E“µ§µ’ŠŽuëŽá#/éÒ?ΙY#î¹ËáÏúvÞ^÷¿ÊœoþÏó‰a}]3@³Ûql§ø£4?¾%îoÆøöö¾Öúx;UíJ7öš·s¬’Ù}ËÃ(äʹ¿_ýé^ë9#¼¯‹J/Üœ³ò‡3Žëó~U}¾—z¡êãþV/~þþ‚Žï¯·ý×õ˜ÏÛ·!ä|Õóqþ¶3q¡cvËv¬*K™«¦ ?›Ëj¼GØøñùn MÊif û¡VÍ5èŽãu]ß~ýó÷ïß7‹!ãß«õa‡‡8Çïvõ’Ó-oß÷¥C¿uRHçñ*užèwÄhüþˆ'ÐǨD$u÷ùœ™ÌÞÙ}u<þëq£Ùùj”œåfÃx«^-¬N”:[Õx’n4ÊØÓµ”Y— ÙÊ5:àpòpÏætë´Vô².•›Œj¬)3SiõË}?â8 ®¾VÛ{ ˜ÃMÂpÍ^•¹º¢=ޤ8Ü|Ïúº‚¶u  ¶Hw u n°,6ˆ™k±­Ôœn³‘BT—»×ç¤ @µCc$A˜TB»YXs‘Цz•Y´àà¯ç-çr"n‡ÔÖöº* 9M)-‡»‡y‹Ï¤A c ’²ÙG NÈ`ƒD}b#¹ò8ŽºZÍ߉£5¶µÈef½Zl˜ºû+*mG©5ýýîßÌÂI N:°'7I…°'©íÚö‹ ©±ª€Ú¦–:%5§ …2·¶.ZKÈúr©l?úÞ¡÷ðå‹#´G3øjÍÕ›.DÁåGwï, ^KÙN$««øˆÁ°]ôÕ€™ï¦‚Ð-©Ý}{GçëÚó»W.w-Ì®ìÆÏÎI¥Ìšrš…)µÖ:ÇÏgÊÝ”éíZÙ Sã:$ùÎ]i°/ñin#É—˜»ûP@KŸ¯çqÃ|å’53f­1×åf\ÝUa$hFÚ×°âo·õ‹¶§DÍì?ά»RÒqÄZ뺮ý5þ®‘ó‡Cd­ÿ˜LíÓÛLÛòI‰EîéOUÕßQLâ+…˜öùø~ÚqÛê“d¹VV‘4’ðŸŸIƒ$äív¬µX¸ÝÞ®ëZ-k@¶æÜÙ~ã~«©•õüü­ìííýÇ €šõš~M_Y'~À¡Á!Àîµ*VXY[þ…†Óáꋽ p©Ã7¢‡ßV,( ìe4Ý:JöööO™©²ˆµœþª×ÜrѦ âëþ6”sUѸªšx¡‚}&DÁÚ—4M@§ô•äl;Ы¡2ðàW÷w-3§8ÌLÚAyôíLѦ‚H;ÅaýVEP:Nd½z]›™ÓO÷+·eÆ‚±!6)¦á…’ª WtwQm m”y;4±[ Ý»7Ð0Ìf£Õ*é<ëF;èÏ"Vx™ó<^2Æ1<ŽÙ=»n·ÛÍÏzþõô>ïG †ßÍì6nàÇÍóu»´5ÍÝj:^Dú•4…±æ¢Š%I.[¯o·Ûªlµ;G½syÎKðïùZ9}Ø”×|±ÅšìÕ‰Tÿåß."fþff©vŸªh÷>ðýùã–A;â¹,…|ÖZ…l ?ŽÃdµi_c\?^•¯oqþñ Øäö0u抜sçùýßÿjt©i½$˜ÑvjSÍ«â dÃ3ÛÏpÔÊT¶—”*7ÔÑxŽ[xÜÁc÷ZÆûܸ«PôþÏìÌî5'ìDbšdV`W«·Æf0>À›EØÕG®ŒV”»´)¬‡{^ û\ôñ&íÖ]{¡Q»s„W]­SãÑ×%#kïeÑÃa¨.·6ë~ "qst¯åS„€YÉ«-þ—A=•e Zö,(dÞ7›¹.vkçςۊRrƒ“¥6òg0(Y†YãˆJÒ’Ö!Ì ¨<”½´V.§9úÕ«Ü_Y ˆ®³{nñ¤•°Ñt}øNÌE¢Ð%N÷-à £ ¾µ[Ë SµÀ,e·½s„Ÿš€ Ó2wòo,í/X^)ZFH¢ÁÙµk‘nQÛÐYéí´)­ö<-·Ü¨(‰JØ~½H‚­ŸuQ­¶â«ÓKhs,Лžö娄¡ ˜A3x¨ ¯¶JAM.qg=¶êÚŒ¸­1¥¾(›­ª ± ·ÆW1´K!Ks˜Ââ‹{ÒFК}Ä*¸ûÊ¿Ùßû—ú£ ¬új ñïYêV¢‘‚@$xQÍ=Áèmþ¹î ¼r]^ÇÃ\Y5W©ã°µÖç±$7¯ªVÛxÿyü1X°*ÍLPÿÍ$!A;Ž3sfÖ~ãàïNú\¦‘æÛ>ùõÝ¢‰FE´7Ôì$ÍlWW’"â«ØÝ“´»ÝnG€ØÂb°YÔÀî U’¾ä jR•D6®ª*¶S aë² nô°áJ°¯Ç|”òˆñëÇ”zv›9U)iŸº¿…ñ—Uó5¯ëÂLkö`+s€¡CêË^iº€,íµœdˆMÛlR}I7I3ƒùÕ2?P}=çŒãv«f7çp¾EéõRÓm»Æ´ŽòÃè)/s˜ÓaÝÎB¯_]kTŠm>X²;ÆÆ[Evªˆ¶– ª:n§¾âÛYBC;ô(`?’´­µ k;`¬–²Í@ÑÏÛ-‘%uUŠØ |oÞŒ´\=Ú"lU7™ •ÜcÐÖšR[Òy¿¥–¬…¹AVêçØDà=ç4Þ?n™ë<Æýþ†ó¿Ý#ê-J™$«ÚàUµ³D0ÕÙè.iqc…•°šhÐÇûý6s•ºV[q¼®õÿÛÿ5+_×u·ëǺÇ[_’tõ,fÜG.Õ«£ â¶€¶QðG{³8L·e*ÉËù£Ú\ƒ¶‚twøíüx]Ëñs‹µ‡¶×u¹ÇnW•Å—ÍuË´ÕtŒ#Ÿ×ûÛíGå¼®·8(®¹cDµz¹UXJy‹0Äó¹,L¨b\™GÛqÜ9®q†!e² ¾ž¯¥OsëU~zçh¡½îU®*XA^ÿËîêÿóøÇêÆ/4™ì<ŽÖ´ÁÖÔ"d{ù‚à ÊÃ]ŽÈ×<î݆>èp_§i'KKl°Žó¸ýž¯VÓÖ¤åBšÓÐ$„ºfXóVÙÙu;޳GËZB¸Ö1×Zê§.ùê>]gõq­©(ºÍ97{z• ² Þ¾P uxëxæ4Xš9ú&Ðy»U¯ì–ÇJ\2 fEHaGÛ{ri¶á©–aU1qçÛ1æZ‰ÃαVŸ¹Œx"vX ¤¢õañW{]èq uÇÂ9y¦E[ØY˜êk÷Dž¾g•¢X¥ž*«w3·@Õ³áî@ÒÔ݆”Š»d™m"ÈFÁÒç»ÛÿxÓá€ë+µ í=Å^”ÝÎÓDkÍØPµ‘\Ø q0vP¦ïa‰§Îa½Ú‘ªM$Üséê/K‡ym·µ$ɬ ÉÞDUuº;m5KHõ²qX+gtƒ } 47‹Ñ&ÔŽ¡Y“Ùíô-€è*3Þ€]Ý)ÀcTõjc±ÑÃmwPÂÜÂÒüZ+"ðwå;¬½.šè ÌÿCñM|¬†,H’^ØŽü¯B¶j§qTå©0²vÄÊÍÈÛæ>’ºÝŽY•4ž#Õ r2~¾võPU É ›ÅÍ?´ë2)Ú:N7‹nÌ9Gh«2ÿ¨]Z1„Æ꣭‚Þ¨L Xå–?íýº¾úmÙ%0ÜH¥ÖJãÈ+WQa½ë ~Á^ |ø r‡èvß\ãâý8¶jMmq躞ýãñD>]ýq?Ô×""Bò*€±Rfv÷{”ó¸*äñ²“ºœ4d_yuGvH’5\°l+T×˱û¬fõ ÐÆ ®UFކ‡¬9¯¹´FŒ* òî~èÕð*j; ÙF}&YÁa‰­Åá­f êgcˆÄè~£‘aUI8Ý>Ô%4%c™Šu‡—’.¡ÔÎ.n˜w5BÑ5«Hó¦‹ÞÞò¹±>¬ê”›Qt¥¢fEÝÇá虉Q=Üà¸Ý·‚êÛ·o¯×cošj™iÊi‚šyð=ªÈªì~­ÜÑ{ŸaŸŸ?k­«®™¿>^Íbô1»žóRÃg[MËuõëõªÓ^!;JÀÍŽÎ8ÇíÑ×ÓRþ ½ªGwÄ…Ë£WÍâ ƒ{Û.—_UM7²á%tV·ju„Ñìõz1hf™)¥‰îáøÛFÁ̺ŠZcx‡ªÍÌ#pÕûùöÉkí½A/3_¯àM3FÚyž¯¬ãöæÒ8ÇÇÛXù|ñç_î·;Ík­åvûË_~^xÍùùÈÁ³ÆW`ØÛçóæÇç•Õq´oòá?püƒù/8P¥.·K^IMÕðTÒÓ :ÂÌõx=0ÞŸ;ßóx›wdÍÃþŒ¶ó2ÛÀy³4£!>óÏ:/Ãñòu8ª™¶DUuÎ:ðÂ1ºâü½êÅôz\&»ÝNõ£N›•Ó(U7(k§ÍŽòœ\ë Íh‹q–e Ñ:s›ÁùcN··â¢÷ÚbÄá_uXUÿt¾»ô֥嫰cܼ͊þ^7~d–ìZÚI{\]¿eÞÇÑÏÏÛq'¬üx™¹uæl³·1ÆZ5­doƒ¿{Ïoˆuùy„ãy× ¹»·c­²bØÙ-¨ºÁÜZfÞ¿ä"jJèó,¶­'ÇÍÒb&çÌ[°ÉåÑJÈâUíZXe§ÂÁ¦’l¼3`Lh: š™ˆªvú|¼_Ì{kW9 ¼è.¶)lnåÔæîŸ|®«9܇­kµsY­&†•+ÛÜÛ«Ñ`‹ØF‡ýì»8|¥Ò6Ø:¤èê~MtÝœæ®fÁ×"hî2}×"ü¨Ó´¡i¾|¤D$æ],íùPb'ñµ'Ár_¶\½£ÑVƒ±IÏ•YfÇù ™è²ÙT»¬g[Ö±ål£Òêr׈’¤¢<,¾˜Wè®[Lô°ef£Z³ç¬åÃ<ã Y3“ÆŒ«f¡=­P5à¤w}…¼dVuÚÝF9…†U;Ž–4±Vm¸HuAYæÎp½•݆—®î6ÛìÓ]€ZÓÈ!8œy C³¦FȸØÀè2J‡ªwEŽþq=Wöç8‡7Nw¶vë+¥–†G€7XZDnóŽ{±%kÉ9¼ÚЬ‹èÛçµú/¿?üx}ÜNÿsÊ”ùpúíÍ ™¥Þ¥2ûýf·ãýÛmÎß_ä™v9y„ž<°Ê­‚^•“(/³)`C!±p²û }]) Ä‘:Q߸c©©z¨bŠ:ý v¸ŸÍ®ÊÐNYK´ – Ú ì%Ã=$¦§Ût·«>VßÀ°Ý\ÈQèœGú‰ƒeUéÌã=Sàšr9ºo~>©«®:Žû@I3˜‡—ëUOÓ5hg|É×Ãm£D@³h…à´E:=º]Ìšç8~½Ý0ä Ý} ˜™§{´°€a Àq w&´êæwtwö‘É&êû_ÑeÇp¸¥m3Ü3_îc>D\ÝUšW?«WÛªÊRY]¹Òóí< öWB‚ É×ìÌ”ê¼EájâùrµSü1_&/?Tòª6óÊ#úÙÏÇ(±­5j0Û­3ŸŒU­Z²—0VòÕQ6ÀØTëXPêw!¥ã߬ÚÝž2MùY<ƒê×-på -Ö´· Ï[¬'¤õ»Ü´·Zv½žã<ª3ä©k>yÌÒÔˆeŸ Ô®q?Ž1ÿôa}?ªÖ¤4èNüÿõ_L×_|ÿß#9ò÷W/Ô”AçíèÙ>ô¬KNÿ™þ[tz€¤¼Z¥lCi¶d4'"çúv¿IsqšÇ«™q>K0[Õ…`s‰Û¸¡Bn„ÔÀºÕ†W­æsÙµp$ßÜ"¨¾–pY“ßç÷øp^øÅ¿]R^¯ãýœ†„ ¢Ì#vÅÝÍͦè{[žZ=W”»ò?7_ð¹V¨Aµ¹삨.˜‹ñyÍQ¸gÎ¥M`€›™ˆ+º¬Ù‰®ÑeL£§´Öªj²Çqb¸šT“8ºÆJn¤(÷I¯„yx÷Ê2Ú`»£ ŠÙh £S¹ØfPж»Ý\‡‡¶Ñ=WíOzû`»RêlMð“°ÖAÝDu{“™Y 1Ђ(’{¼¯êªí ]@VÎ5¢ƒþµŒÉK47l29 ¹¼šç¤çœÝ4ºm%Gª÷ ú6¤ !7_V ø>²’F€Ê¿ÕÝÛ›ÒÎÑ%ÝLUµ¥Ü16)Uƒ$ÆŽYöD ¶UºI L²=J[q9Æ×ì?õ’,ÊŒFÊÐ*½fßãþóÜ©dB$“R효"Åvë²V)i´µ/<”À†Œiæ‡AŽfž¹NW 3cWVGZ;î¿–Ýî³Ìľm_YB+»:¬EÒ*ëëŠT¡é {×ç›ýùOçf»ŽS¥«Û)7 '~ÒˆáÙ7¿>PZ¿µfçK–‡w7Ìkå)°ÔÃ7nK|[Kª@ÛpêPsíT³Õµ)´Ø¸‘®°/pßÊkxVo]Ô¾öçqº•_—ÕLj‚ß"š ¶GÁie“¢“†'s•|Û†.§hךa 8•îl`ºf9v‚ ½š»ÊíÍóöæÎœ¹ï÷ì/Ì.‹¢s„U°ûí^9ßn÷ãW'iöº#"Híð Ð\Õ Á2 c)v©Ô]ž/ºàÖÃŒN+ªóz=ðê¹VvM‹Ä|®RN¾J΢=”›l&ë_ V•®I´)ãJuWòv{[yÍÊÌåî~%5RBr–w¢`émG‹Ž²¨KÌi% æ;ɼroI‹ÃÎ3ä5çK•wÃälU0~9ˆÉ„î§¾&f»Ý®ë²0Ñæ±Ò²l5çû9,uYæm^…mxÇçõÚéž;‰·8Á¾f»}X¹ãùv g&ÿý÷ïöÛ•ß´æ¿ü—¸ßï ³Vv¹.;üøøö/·wþ··~=®ëÇ é»Pð IDATí§ôì¹fÎÿQõÿ{ücõ‡å䈦 éÖTñZÈ L÷áD¤ýÂñ»žÙ7¨;îkŽÛ¸æ'‚¬AqÐÌ¿wm±ÌÍÂÆ šòBÆÛ¸Ö%ôÃf”Ý3îØ›œçý¨y {k®,`#÷²„8 ‡ 4³ñI,¬3 ÚÍL£®nµ9,dÜ;J Ü²åt«"UJXýF+ÅH„ï$§U¶8ÊLì‡òÇæâÖÌ#L”Ì<§¡ÙGWÕkšù%Àè;Œµ y) †’ †CÕꂈhÛ$k³–@ÎÊÛT§ŽÃ,ÀZRwWÃI•<»%«íŽ[*o°©fÓ§³¹wT73ÔÝŽ83p‡ÎK)¡áV£vTAçR«ËÂÑÚÆ=ìî<~BØËº…2…`%C}é´µ;"ø£Æîîµ6;õO©}E³AÞ­ªž³°»÷›JÁ&Aî¸ot Ølþ-:aî±7[°]`¨]m¹WÙ&‡}™Œ)ÙWµÑ ì.q“ºY™¢µ£ß{üú'’dD´, vµƒGÈ/xï¼û*íàu}jÈ£Š%ó«:6${·§êË; *×ÚâP%¹ iÿn5ØØTx© ¶_ež¬*‡;e«Ka¨Î*Ò ÜÎÜrçOTÆO`B—5 ¤à …ÍírëLU›Äí¥2.´Ì¿"Œ²F8Å™iÁŸ·ç+°ní!\û%ú–[ø»á¡™}±ê} ·¨;ßîg ýxýþoÿ>ç¥_oövŽ•W›§gó6h¡/ÈýÇE+`÷1êvŸšXÀÊáÑF4Ú¼„·qV=߈”V5a»†^B‹YU@®2è Ñæ#ªÛmÜêìП¯çy®ª“wšÐíL¨ ú/cTªT›dëî— íÒî§ ÉÑíÖn½¬d\ˆç9ÈïÚñ¾ %nFŒÛñÛó3Žaj6Z ‡;³>Qz&`póR,¯emó²~¿Ýãf×ëóùü﯃vüúÏߎ³Ù×A~%.­3ÇI.WóÆ»ƒ7¬¾>Ÿß§m·ëì¢5_­z%c×a VÐY|ñÉn³·¤wÿ0³tQÇXÞo guÐ/»ª{‰‡Ž£«†½Ò\ C8v÷UŸ•ívDÕ9 Áë`ÛrT, Hºuõ«èÕc¶ßîF¬™€UÉíCÅ?ž×øx÷³#/ÓŠc7¦êt¾9\ãý>ÎqžC¨1hÔ“-Û‘¹ÒeÙZínò|NtwfÆ…‘oå’ÈÃ4Âÿ¸žºx+G¢VÎúýõ»ŽðÛÌÌN1ò™Â†ÅrÌJØT-»:úûqû Ý³®r˜êvŽN$[K¯q˜{_úÓõKÇœã£Ö¤ç›ææPêuÞ¸Vå¼¾M®Û{ A=ß\?ßuþâ­€Lð“Ïz}²/…£àÕ Ãªóíxò·ˆlŠ|5“ê‰\¶BþÖ~ft)_ù',ûÝñ´Yó·oþqGg=óµjZ;%<øú|µæ*E)`ñD£ôöñÏëõ²BÚñ.¹´Vu™†ºÝ·Æóv?«ì™/â€vÒHd]f63Æc^º®—Èïó/ˆj½þ¼Î?~ùÓ·÷_ÞŸuÙ03ûößþéW连ÿý¯?~û|þÛ_¿ÿ'ÖqÛ¶:ŽãÇG>¯.;_Ç0{{ûvqê°fN\jÃÆ˜«Ü¼‹¤¹ºZÙ2}Q”|ø³»JrM4'¦·ÓO¯Å«ÿÏóO»¶ Z3çu¾ß¶“ådßáÝò‰\½žózÇîGÎò{I¥®s^¸Ýîëyñ8¸Û”×Ë2ìtØŽæj:S/Ðw¯ TÃOm7üh,ê5ã ÉàèÕלª–{Ùµ¨cæ!±g…`]ƒŽá—[átV…Ù‹½Ã*Ø3¡[…´{Íj«7”;q„I‰4@«˜íîîþبÀ6…oâŽÕðWVBöæ©yÇDU›ÈdÀÚ*ë*ø¬"ÀŒ2gM‡UPAsmšè/™¥Iì®-ÛØ),øÙ¯ªã>h]Uà–Én™ƒ;zõÖÃÊ”….È …®3,Ð2x°¼^ûm«YÕÝî~’—êõz};ï@u7Z¶OƒÔVrüôp쨗mÁ* ë‚!ÄõOŒ¬*¶¤ÛµjzÀØ-ŸÜq[*нÕûŠ¢ùÊLE7¶ùdÚþRZÍUm-Nd˜€6t÷%±!mŠkV¿¿½]k­fì–ѾŒ«°Ÿz5“¾Ú$«ê8U£‚¢ËòªÛ7 ®·-"hNÛ`z¥¶¡ÌÝu]×8o­Ü¦Ë/ò²lev£µáp^Ûò¿’ƒ™’UÝ&w…aý4&ÉÌÆîÜS3“óº. |ô¿æ1= 23À`¶Ý3˜›…DlVÕvÒÄyÞ5/T÷ß϶q³°—±e&¹Ñh7÷£ë±Çz÷qÐq ÆaçóÇãÊÌ×kÝn`Ã'–ê ;*ÀZ ¯ÎWwš¥Û«1Äh¸ˆ†K4¾Å¸¹=æ‚™û–ï&•Ãþ$åÎ/*¼ ´ÃòU'0V*Fì@¼•jZAãL]2gæ _x1Æ8,3ŒD¸û•ËEëvÇÛiǘææ·ó¦Âág g‡ãnöÙW#Â¥¨^™E©ÌÌy6½¡îÑ*í]tÃÇ´õ¸æóÊ×g·[¶±ç÷ÿñ?æðßM¯¬Óc´™P«á®ç¼Ü]¢Õ&ã©W%ª•D }‰åMõY…)ò<[ÝKŸ×â­kÓÿËM§/Ž®…d1V€8޼²ªúà3¹ŒcœþČቺ®|¿¿ý?ß?óOŒ‚{x–µaTë$ǰ—êiy¾OTãs-+öµÆ8Í‚¢äkÍ–»‰n³‡JÒe<îï|äqmøñù¨°¹^rºÚVnŸR÷Õ~¯ù#¶ š]µ¼Ò`Φu{ù )ò_û÷pÇ1v„œ‡\¯ç÷{Õªë:o#“Ò솈¾è °¯ùü÷Êóóó|¿}||·q^Ïçc=Ÿÿòvþz¾ýóíã«(þ¡Ÿ†oj¤U[+|¼­)owãv (ö²†xØ›¤RάsÜ®¬aÇÇa]ô°,H 2íÔɇ5]AQF7s¼¾uÃW~»½~þ¾gëW®{½ÊŽx?n²pö=­ µý m 锼œ¤F^­ðGWg}Ø¡R±A÷¨ÕÅ ÉÚÚè«{ƒ"fCÂXtk x(†™SCp˜O|øÍØ´c4ªZªÊÝM°ÒNS8¯y%šÃ-,_óÈ Öt4Y@ „ùÜKfwŸqlå•¢#Ú v8¬/IQ’`f;öÄFK½ß¼&Þ +RXtdËÚ\¥ª¡JšåÀÓºÓÍ]$ÚwŽý•½šâdÙröÇŽ·ã1 _‹­öàEfà€RWÖÉSRæ4 !=ªNÉ€Þ®Qýc$ºÙ(ùÕ^-Ba8°AæRåº.ÛúÆp»ºL²?èî2nî9À„´7£Ab» 7”}/á>»6;rSR~2)C#«—›ËŒ;7¤Ú³†êö0ÈUí…?à °r|É0 ‚£$cÀ®øjí”ÅVPï~ÜÆÌµ Ì.`"Íä„ïZâ§o–Ý»æ€î>ŽQ£¾VFG´76òÆÁÖ†×ý×ÝÀZ è¿] ²{hfQùåÑýû¹ÈÞÝ2ãî`CŒá#Wá MB©ÇˆëºRX‹¡vDwßÇÑ’YïbRêŠ@w› ýL9®*6Ü|fÑ ²Ôž'@ˆŽvçÁZW>¯Ç³yó÷Ãu ÛžnØ­a²x˜™h%©%*"~y{Wk™ã6®u]y™ýð­jM z˜oG(Ùü*p5h%Ç(—MI{›vªf±7N–X¾€ìîÑm‚•ÛP‡Û={W9Ö™ÕuƬݾöxBBÎöF€Óÿ/moÔÉ’$뙹{DV‘ÝçÌì^Aôÿÿ˜ÂÝ»3sº›¬Ìw7=$Ïînó6} ¹›Õ¬_«èr÷µWêq0‘ÝU}eÒÊL5YWŽ1ŸŸåß~®+XF¦„V³–daC˜áNSW æ´½/?žÝ—5cޏaóЖ¤@›\‘)¼Vx×iŸfÇ|I{­‚2Úƒå‰Õ(op1H/ÕÈòñ¨Võ:Þl÷‚UY^ý­ÕœFó|Þ+›Ã¡#®Ll9me½½½ül-Íý:÷||ën¢L](«ª ÷8Ì·êo?½UÛOû?¿¿}¾×z>´1ÉöÿâDã¿xþ0É$¿® Žóóœó·ñ—tîc¾]çîÝoÇ[ï30:ÔÏx€þ˜ogþPÛÇu]ó6Œ\ÿTÎe±áæZäõSã/¯ ŽÃÇþ® <¨­Ç˜ê:|rëc½~=Ù‡,_Û=ŽˆÉÃ>_…«'´ê ûìB!Æ%}RÇÛûG.±@¸sÆÕÖ¤ËT¾“ÁCí¿´z°#~Xp4ß·~óo¹ÎOß|ÔÇëÇäå}-ºÚÞZœ&úZ¥#6RÔ1æu­gxV½™äö£×¿þö6P=qgû±š6ŒiÇ4G/5ŒxTiåÞý•¸¥ºf²öϱxÜ(QBJ– €ÒcFu³”¹+Ü/ß;~]«ð®O9é(BfÕtô3üpkTf$®}Ñß=Ž•C¸\8Šê^­ÞêNh/#Ì©LÞžÜ?E¯@w÷u]´îîãq;d RªA‡ý™—¼ÿ»*Ã>±aPè­Ü~½—wšø†ÅZ¾m] €Ç®¢]äþþAãǵÊLárƒj\ó-|€×uÎ#~Öçø~h/Ciéõëcb^&›÷õÿ5¼¾{ŽÉ·ù-Ç:ŽÿÎóÇM±],âx{Ú_|•¶hÇh+‹ ïuËOüåø¶_{Ž.û|&î ]Еw ôù"Ž4_|Y%¥^¶v'•×ax„e›:r´ßŽƒ{WH²¿æ¿æ`±Ã#ˆ—Ö>Æú…o–V5zd¦^X::DUìé¹ñëoš<ð˜W=ÞŸûºÉŽc­:{?ü»*Ñù'›‹˜Çg½.\ôP†K²‡ŠAg?ž»ªcìèn+dyîúyåQ=»ßo>öÚ6­(Hvµ>3)ŒìsttPU‘ÕÝ ÝqÖîwõ¿$º‘–l"`œÝè¢Ú}àÎæb—ës$T»A×Y_³œ6ËÞszÛçñ*‰ajê¼¢´ÁÓûó Y솚e0âanÕ‡ÅY»Ý\˜Í°±÷%Š~gìÄiµô2ÀŒ§f¸P»Q¹Í̪™ˆr¶Û«öuV’N Jû¼ËDs+º;#†#ª@§v—µ8×6uwb(°i]•t“ÈÒŒÍd•º°“Š;é ˜{òV¯àN"¶®m Ù춺QxubΫõê>Ì]eJoKÒuoOê‚IÅQ&Ù‚°AtcÁH÷Ñ’©Ù‚Aaa¥Ý¨{lØí«ØòÛï‚N£ÊzSh¾ÑB£7áÖX~X!£ü4ìÍ(~«èÆù,Bc4s‚Û̶¤’Ôóñû«žˆ‡q¨À,OÓ±ï¤:wÁíPçÞ5Ç Ñ _`³IÅ­^-Ɇ`×Íå¡£ŠÈ˜ÔsŒ+÷Ê5â8S-ƒ[“RèÁnpð‚Äs„_U]Œ(3Êðñº.³ñ|E6Ì9ÿrðµ×çJåïÏÃYc>Âî›ãShT;.°]’LvtU8ÞÑßÿøøfáYÝ›ËBpH•;áÁÅÑÝqŒä5®íaž:‹B̼08â³÷9ÊGp÷1â{Ç»ó˜î4ÓAÒ˜?ŽÉnqÁ˜îîEOF Ýc¶®k·«5Gæwg!hj|¯½Wg“pó‡×™ÿøû¯ZUU;ë̽…sí3ë½ÿòa«ÏmØ®“9²z_QÛéÞfŽÌ¬)’ªs ¶KVïéç(ÕÍoý€7Ø­¤ÜÖ¾"GÉ!¬iö {=žÑ鹈YB7e|èÚ΋å«"ë#šO„F(xvlâì|S<üK¬×FzßN{XááPôËr¿QErŒseØJÏ1Fì„ܯi‡ ò@³klҠɱ^­òF€»Bó¯ã¯µk¨~3§¿+-apQ«­Êg¾³¬äïv±«©j£ÍÙÖÌv¬[È>f î~e¤î—ÎaÇ®ÓàÕDšâíY£ò»ó•—?ãõùó1Ÿ×ëg½Ó¶~9ðT‘¾4òYöù™¯ar±» µ÷nö›‡=3׃n=>>kïTÐÏŸÏñí·÷ÿÆóǰ‘×ÚçŠãˆ(Zç~}œÇmʵ#‚Óv®.¾Ï#ÕÙµd²'Nmœêêl5Dzƒ§¥‚€ôѵ Ùý™}ذÇâ‹2Ñ5¦gC°«:€! úí¹Äè¶]hUžoÇÛUz–|¨ˆA?Ö”P]"`†á­ºL"o'mHGû]ªªjÔ=üBƒÙÇÜ{Ï9»Û=ªªû à yÖÊGŒnU•õ=Ùåæf܆cf\r ùMo„Ö[>ÌÙD«£a÷ ]¸ ·ŸÆõ•? ñÀø>ÿÇïu‹ˆxÅâ XcüùòYu‹èfs /õK¥f[IweœmA4ê슘€XªZ†‰–¶{—ªkƒƒ7aÁþö|Äîöþm8mD ÚÝoûöZËÏ÷G±`™¹2³EØêöéGLÃV­íe& HÕ€9p˜;÷õñóå6ºQ¥?>rIo³ZÅ„²lâs]¯uf>æãmi®_ç˜H.ŠÜ²Wîp³³À®:÷Úm¨þîöý`g!´BˆV„7Vev_i·^µ³„Ê&=±`f-®|ÇcH·Ö¢0Et£€Ô0" Ö+Ž6ÏÊ5üM²»¾¼Åûtµ‘]©pwkß&÷˜À«¸ª˜º‰`>¤¸ó:@Gw—D [!Œ¨.“1¦µ[#tâõYk°£;L!mq}žçŒÛt?rQf’°Ì!?ŽÑ©ºŠÒÓbsy_vØúÈocŒÏRy5^Y¯Öj+3“M1‰Ñ­L|6÷™éã©ÜÜÓ"Õ½°ûõ*>0JŒëºkdÁº—Ù鸖ìPÚñúµõÉ×ëú/(þkç‡Ù‹¶Ûòê,y¨0æ1¸¡R­½¬ËÊÝc>>ºf©Î¡å•¸mhn4G$;»’$¦¡‹‹÷N{®®/h½2¬ÜçUo”ñlMØ0{Æ\6¦áU5oA¶ä}/mјÒn¥YËR»Æáfá÷^øFÙ}cŽQ;ïj”¡ø…ϘýÍâ›âZiŒ«Íz»Û¹ö¥z<n>ÌôÕÉi‰>yÉÜMo°7YfتÝC²í&ý«‚ÆgÅ=D +s%aÀˆ¾Ká­Åjª pö¸µé”„mÊQ(ªM=ú®)ZÛ-˜@C…6°÷æNÔm ŠÀµ}Zw]EŒ^äõ•ôã‘ Pý'¬ºI¿a·½Çpò" ^P•¾F3C‘ʦ†™Öè¾{3½N¡îž$߈;û HÕÒt»­ÐWdàNˆŠÖÖ²{,iLÿx}Êú8üŽÜN ÃÌ@$Eˆ‘fƒfáé®›” ÐD:H÷û,Ò½ínËR¢QP÷ã¾î‰"ª‹7&nñ™†¢Thâ†UUm%'½›ÁŒ;xcF}IB  “„xÁ( 32êî´³…êo!¥R'ƒ?Œh“…X;Sä}{q $BÛ–™É䓜YÚr£9«{­®4¹˜}Ð…–Z%UVÊü}Ìë´(qHáJXÂ>¯zÌt^4™ƒ»RU´aª®³  C·D¤Üup<³w'K¹h2X^õuâOwÑk´U[¯€œ¾å¤Ô‚öÜWRkÜ0$ëKAÝ=ç\-.åí;!õ†Øã ³Aï¼×[h h ^0€OÂëµ?P9çcÄÛõyþ7ž?>¯Ï½k¼Íj6¢eî£N²—[Ι©^n×çrŸ|ا_»?Žñx”íSÅ#ÀníZÑ1W–Ëw‡ó]kùÞöÈRÎþ¶ýWŽO|³µÝê­kü¾róå¬i?WÍ—úbߦ¯Ò‰èM:bX¼â>F-ãu]¿1ú¥PYm9ztgÏŸ~¡Ág×8üÈŸ Ã1÷úùÇ,}B ûñèàKßíPŒVÇ|ó‡>~n †Ï)=Ä-+«ËuŠ,Zùá6„ç@ >Ûš4؇‹©.OkUe¶hf&‘ô‡|4 \½_èvØ£ÎÑ}¤9£iEwEdõ¥>Ž£³Úü²Ã…!%º\©ò#7NCèÔ°1Á”ÀÆÒ›ý6v‡SCÝšý¾v ëMÉ|¤¨=Ì$nY;•4=ímå1«älK¹Û‡æVek„îƒæwŒùÚtÆ×ãS’W4¼4Ĩ‚Ú³¿û‘ÐV‰=é°Ž«mŽOÖ/fžœðo¦{vPm0óЕ/ÇÓïŽ0­7#Þ]²¹×º®«9cX„{æZ¢™ÓÍî#w©á~HuCÌieà˜s˾f>{k€Á½v˜¿·×º²v5ÍRoÍÉãçÇušüù.O§h¬b¡á(šËZiOOCµž;L½¨UË̼Ùm Sè1nœGWím8É7ù÷¶^èwÀZÊÚ*{ΧÔÀô«SØ\UŽ GS?ÉQ´Ü58Ÿ0I<`  …n'-ü…ºƒ8æ>Æ ©êÑx¼Ï¬ñz¯ë:ž¿@:Û´A‡ûîNÑ}H¨Fo÷­ä×Y ^m”¡UIY¢ú~äŽÆëu¦Ql™ ÚÞû:/€òáîÌgI‡­¯®7Ⱦ»ÙY:½«ÚlвArÀLjéÃûñ˜ïcœ?¯½^»û|··÷nÚûch¾µ¡«eÅãi šÃõýM¿åÛoÏøùããufÓõCçwÌߟ, ŠÄÒº=\åT/ _ÖÂÀxÄóãÇg¾òÛûãx»~ûæn{_cb–ú×½¯ð)â²Ü¯?ö¯ý·³×x{„F/)5Ÿƒ¼?Å«jƒõ¶Æªz9ç|(“®sÆÛ>7 ®ë¢/@ÓE¸„Ü9H³‹Ë1ÍvN,ËD?®°)W¾·*°ÅýV¾W_Çñ¿íÁ¸Èýx^G-‡€†“¦‡úëÑf“&{c´ûµ÷ø±×ÃÞ€tw« a®í+ ‚¬A3ËÔÆÝåt¶œ­È6V7Í@[ªìFØê²°¤æ.ky6ZfV‡òÿ™‚´‹E”(ÑÀ계Ÿ×ëFl ú°1ÌÑîËÕØé P÷ @«ü+:ÚÝŸŸŸî>c\¹Ú%¸v®ë“&:a÷WÐ §Ý Ϊ‚J%w‚pïòî«¿ßDYÞ„7JpA÷Ðë®Iß7£Ã:»«pÊî)Pµ¤[Uøµeë¾GŠ&¾†3n^él¡uG˜D>îïóyŒšç^×ÎóÇŒñ|Ìù˜ÕìµÌ›!Ê}?þì~öðþþþ׿üëÿû?ÿíþ¯¿ጛrU$SÖ8îw+I ö­,Þ/ñ¼>á}¬_•?¯OÃèÜ×u]¯«ÚœæÞ¼P«Õâä¨a'w»z[¸Ö)TwÎ9h”ø‰º ˆÜGµ•F×¥Ÿ@ÏëÙ¹Ú„„醇’šô ÚÚVã$&çoå’yVj›Qf0ÿ%-H¦ÔÁ0ës…<àp»ªŠ(á+Lº{ö½\ÃÊ}vƒȯKøcÓZƒq›–¡œß>×~m†ceŠzûí¹qµÃÀ4ª°(Åà¥:< m2©C)Gi¸Ý D_ù’IІŠóü¬9˜¨n„„ôk¥=¦r§šÎRåÙäƒÕ¡ Ú÷GÊqúÀb÷ÜÝÃ#:»äî^mÍ–]Yè*êî÷§b4˜ªÜuÕÒxð^¡AÒÀáѵ{¢_Yë,ø½Ï¶i@Öm×ò-³VƒÎ¯‚¿‘jßõ2Ÿ|„O¯Uf[•5îî£?bJ<÷¢ŽF†Qg»Gä']ëné™H¥ªT%fzɸz[Y`ªkj—Ç(å’‘vô®u]LŽÃÂðgLj…» a±MËÒÀ©±Ïm#<­þèO‹ƠŃ!ƒ÷±—Ë.ynÕÔàõ>’Û¹¦î³ù$*Vcß’]VSmR”fjD¤q±;˜ ´Í°ÑŒXµ%§^ªªv÷{Ö-5ª£Á†N³ ®.Ú2\¨mH­a-&u—ˆfƒVèVw£…7+™BY¦µÀ¸o4/ÔmS¶Ï/LdA™iÁl¡n0eXï›ÿ©® kÚªîÞùEÂ(P`«o†D¥~Ý}FÒÝÀ´b†»ÛCYÆ[±©dFõOoAöà¾%»÷¨û¶zºn†i8†o ä€ùW1F0Ö½¼¹[Ïuw¿U”ÆÍ§¨û³í~bTu‹’ªÕ@«á·8ïŸÞ½wj0Q7ÔCÕ,ñgBî.Uiÿ)­-ê®Þ_­ÖíZƒù¸¿mD|æj#è¬A Q m •0QªõI˜I7C¸“‘n7þ£ ËP$êièÎL%ÉÞ®æN!UÕìuÿ‡43'T²[šžêµOÅÍæ¥~Áu¿ÀÊ ·±´{ïÒí.ÜÍ쎆Œ1ì½ykq ÝâºÎô}ƒ§¿Ú=}Ók;lDº£ï£ÁŸ\7­ ¡¯õM˜}íð²A¶£»»%¢ ¸MF«¸ *’p#!䟹uÂ4t•·f¼÷Œl±ïô– ëN½TÑx7®Ç$ã°àçÇyíµÔÿòühG9›~P°Þ 6Œ0ÇÞ[nY׿þëïóÿö÷¿}Ò»PÝ.i¬.Gš¥0u3G¦B_ÃÆy®À#<Îúǵšýþx”–VAî¼'äá'¸ïÖì,v[UT{µÁqà @ÀöÞ1 ðt,(É½ë › o+&Lf!"`W1à ‘, N aˆTtGxŒñ©Mô#AÚî\¬¦.U©+¸E#¿Ùfr=¾:Ê­’tã@ÿúU53Þí|²œ˜›[Ä ­#¾Á0¸‚¯N¹îêû Î#$}®kΈ°ÝW¢Í Í{ S÷Áµ³{[êfF5ÜÁïys›én"¼ZTªRÛ‚Ç1»2«‡ÜÕZ÷v¶#Ëð¢¯ëÚâ†mgVG m˜Õ†MW´ŽeÖÙ)5£¡ZÑl4‘7½^>€MÏÞ÷™_‰¦m¬ô•Êù¤»KÝøå ú¬mfœ¥R²5eu¯fJ•/‰jB"<,ŒÜ¯ìûËg4J-À¾M€a#êë1 iø@µå8U´Ã »º¤ÿܽþÿùó_õ¿pØpåfî€h+É2v øØG¼]«„Ȭã˜w^ ô®i”T¬½/çÚÊSï«KC1;&çÚks ï¿ÇYµvá˜ÕtÈ2Ù#ɤ•¨óu=ç[+÷÷A}žÇóó ?;Äðc)?«NÔ9¯;ñ÷min=–ìË•Žù¹{¥Éâw/¨¤å0ðáÓ˜m1h¨½Â£ÎK( ¯{Ó ®ºßz:ÔF¼œg÷ˆÑ5U]b¡v'{Kêx6ØÊîv³ xûˆr/bù ’ET˜Õh‰DDQêêz<ûZÓ½áºu»”£w¢¥ÎôãP ­ˆËЂѽ¡eQc ]¸¯æŒ x· Å*HÓ¸%%º¹ê?»–¦6\Õ&­Ž6 « <ÂëZÎaù… {ëFPun;/U;^ØÇp#´ÎcN#› Ú ñ 9"Z«%w÷/§,I~ *è¤<[2Ÿqd­»  U@‚w|ÕD©ÛI·nˆA¿é÷ÅÚAw?÷ÙÓOÔ•çû8¼Y«¼f +)Qý¤¯•ÜÕ¼{¢êhxChµî^ ZPÏcf F3È­ušÌXY.ZdhÃ_V°/ |7†^{Dd檴>¯on"¥N™±½·}^eØz;ž.wé±®;žìîp+ufÆŸ™’™yßV¥n"¡ãöüþíüùÃá·û8ÌP­,ŸC÷žEèþJ/ËXeS¾°³(Aü:n€T[*¨(’©Ûëäá3uí늶ÜhÁ?ó±tcjõðÁ’ºä_”ñwíÀ0'ECE5É1}g 5Èã·Ïóß+ÿøûßÿvüþìåÅ;óûÛïw›ªªº0ç¸Òª©gâ(n§H{œ™þ†‰|3\¯s„½Í¹ãã¤""&ÐÍxÙ&Ú€¡pRkW±¿ÛQÆ b¨ÊUîûšZиòHó'3m—:ÄïŽÜۺ݆x¢„¢(¹ª`TZ-m¸ .›§ýÃ=ž=¸9YΞ½Ú(Ŷd>""®«wÅœÛxu†¢2é¹³‚9,`AéŽFY¢[°Ñ ýrRè¡õù@;È»hóØä®j[ËÜØ/š^ÚfB=Hã®w ­>ÍÅQ[ò‡T¦ äØ_ñýL â†]Æ«ú&]Vd&n*ؽœ®ÖnZsâ´ð8;9G|3ÐYávÛ¿§boèʆ^# ”™¬û¿\íÑ„t 3à¨4¦ê†¾ÚS ÑêÊl¸Áa¨š+ˆ¶¹L=|ì-ée(ºƒrB.¯¯ ?iìVªH »/Ë—nh׿'@±—éÜ_’ŠmfwvážÇº1÷yªPº›T¨-Šoîù£ÑŒD“îU¾Ã»«É}“/ÚÝ ¥/ýœ¼òl| ÊM²è7@ÈUŠ»”¸wK$Ôän3kpeÞ•&eìVÊ⡆6Öc°{fiøg] {† É^¤ŠNG£Ñm(ÉFø}ë,¾!]*6×Z1Ü÷ÞÓÂ`Dªö ?R8+ECññ˜Ìs¶_׫Íá(tƒMN U×òÃÐ ʨbµQuÜ£Æ.™y˜e×~{ÇÞZÒÏú¼üùx’®-` ÈŠÚëzõv¼ê\hŽPçÿ˜ñ£¦àç+©þÈuùf|5œ^½Óê›ó™:€«‘8–•æ–óÝØ•g™°…ê-!Â:\45î(ËË»&š[´M™‹væîp“Ìv5&u<Ä =+¤«I½:W’<¦fé)«*o5è×±Â>Ÿ½ *-GÍênçT2m‹͆óK´kzØàÑôKÿmï²#É’$Y1³¨š¹Ç}d5º ÌÿY£1@eeÞánª"ÌL³¬ìÅ,3éˆEl"`nfª*"LtÎÂïs¿çeeà™ð¶Y5Ýê÷…—Û´p'*¥tÖŸø¥Yeœ}+ÌÂ<îUëÙýొK8­u­Ê¢•¬VÕäÁÆÐltZ+í8Ý™³>–—XKehYÍèšž ƒg.; þNÙ+g&cº>Ñ>ÚTöu6ÿƒˆAX²½¯6°pÙ¼½¡xÓ9î¦;W~ÚÒ§Ìg¿9¿ÝÝv6Tœ<;ÚQ^3<œ g­$io+N=ϰ›Š1ÖU÷‡åß^¯a~éø'¿×ýËoÏ«n†S®›rZÜ|Bõ}Ü×-˜':ƒ>´Fÿ~%ÆQ†j>h€}ãÇ7Ã÷µ¾(ßþM/™þ•ü /áí|tÕ×øRY#WY« IaÜ–TvÑoÁ…Æ*Éž’M„ÔgU·V2YÙä«÷~ÔJ§Å›[d>ÀɽTWnÚј3ò±÷f^Àµ'¡4A]sØ€Âè¦:݇’ûZ ‹³j^“QfA9[“h'LEÐÄ1lˆ qò›ƒù_IHµMŠ»ÉÚ•­üzêÂ?ÞØÊ[ÆŒa2íš8'ÊJ'ëLÌZuϼ§›u•ªÏSÝæ¢ØMÝVÏ]ûu¿Z“ø«Öω;¹IYdkφ´î[0'j?é|ýiUb7˜z|ôÝ]n,Ún -ÂîØw¼/Xq÷´w– )§{æÏã‡Ú̯qUKZPVU—4ë.©Ý½¥ÌÒö“Z ¨ÃžïýÕ‰•²uüg§À½ï“]lš÷.é즛‚ì^M}î–ûp¨’Æh ¶ ¹·ÃäJ˜;i½YŸÆRv¯ø»Lº[õ%CûI[ýZl©[Øá€äF—‹8~âÂÔíaûSÓÏ*ìõ~ͺ°ÿm„W7ˆ†¾fÀ4RÀAä^ÐÊRʶ1bYfÀWø»ÒYvÝÍÃîûV¯½F—NÀµù€Ý’ªÊŽ‘•X:†™ä*ëî®æ ~¨ú&îÎ'@KÚÇ"l?ÌBjv ]Ö‚•Ÿ¦ZUÓ… £|æµà‹yµJ­c/D¹©Ñ´ªF1iwžVÑ\EîŒ0tÝ4ã^U†­¼‹¦{šˆ3gí;ºr£7G aò¸´2òF ÚÛ²Ià0©¯ÎÙ¬h³I¨–=DK˜uùsµî+ïî¾ëyĽtŒð}ÈÒÕ•~zˆÃª”UÙÕK¿¿ý¶~Ü¥j‚´ó!CJ¥aCê}Ë j$(ïDùNZ˜ùªšnßó~3­Jð„¶¦kVúãÌëƒïG™¿ê•#Á€7hç®l”Þ8ÞßÞI å°9'?Öa-ñM½¬F+sý+ç/íCßëp?D¥~¼EÕ-Þ}¦{Ø:>4Ý´n_W<NõµÑÇ@ˆJz—æd âièd—°,âÇ6¢ªÃìÝGøó¯Ù#Î÷õzxºa­*çœaÎ/öK,§•±ž€g†c®|;N–yÃ@k‹ð³Úé#¾ ’–á²Þtǧ¶èÕ+Q;¤GÒÒ.¥m+øîjúF~Wï×õ}«›úóþó|>W˜Ÿ)€f—+)z=d”5œP• ›ŠÐšsD«o””ÌÂv‘İLeÕÖ^ÔM-v‡áòînÐÍ|gÈ8]蔸Ìýtk¡Ð/ÛŠ8G(IkÆ:¼m;\¶<äËBÃ9ÑNßB&Í}‡ [UwÂNºY”åBvà0ß›ÄÞPO1´C…önªHsÐþ9fbf±¥€_71ÜZ¨â±ºVמd¸¹^‡sëjÝ{U˜«ÅIHñO«›.5sU™ ÷pv°*ºQpè²ÎØù"c7*³3ˆVƒbXw×\3·™n¥=’×$Œ îó¡/âkÔmâ0ÿZçÁ¦7¬d$Õ„5Ы«äî ý•Ý6“ÿ}¡ቔú í³îî‚•í&vÓt1Í4‘ÎuZM¡í¼Us<©¬^yWOÁÌŠ´tve›a8Ë!41ÊË¥]“}­?ºµ*kïmâëZs÷xFU­Y]²·_¾Ù[t§T²á=ØíDhHǹWQ® &ÿò럟?>ñ·ïŸyûòcâÑúV| “ZÔ‚šR•› ÷Z Jí៳E˜ÚÎó-{ö7¼‹¶ÌéöA²94 zš„»åò¶ojš‰¸jíΦìÔ¡[xvÓÌØ=[Í.Èe»·9Î8>ËwÚÊÆ¨ô¹ÆëBçqwß÷#Ý—))#¦! Ãò€lÙ”kwž­eBí@r_‡ó ëËXŽj³¢µÈ į̀»+yòJöÕZ×øË ÏæðUvƬËPƬzEðx¬9/á}ö, Ęb–ZZXïù 3-hµjýv ™î\$áXçpˆo}Ð=+qVô¦¢¦fuÝI˜«\ðfD´^÷5žïecªbXÁîû¾ò{´æK4šŒ.õ}Š2¯¬rnùçfŽ™UZ]Íá‡ÆÑœªZâÙhô3ן׎õýyKð~*ât¼º®oþo¯%c嚯ƒ5ÖPXÓêÊï—ýþË¿AnõŸÚùŽãí?P>_ƒ1ÅÃB…ÿ“ŸÿCZ;iÑ÷œôñj)â·OÖa翯‘ý½ûûq¾ k²JÇó÷Îm–lìq`YU8ðúûqãí­âHK÷Ëãsê1÷øót­ùñmNLãßçýýgô¨×Z7s9ôzÙÞðªÝ^é:ݧu°ÑÔŠž*üÙ”Y ˜b–¬aYGįyå‚Ñ ~w£ ~uÄuxûˆïù÷:£ýi×ãÙÃd¯¾¢Š€„ËHo³ï1<tg´%^O{¿:f^çÉÌ•uÚ³(Ú:ÔÖmWÏûÄCÞ3«3»Žw#üü;—‰FÆî¦É¹”I”¯,ýÍ5—¤*`‘iñæ§RÑ4i539;¬ˆä¹õ&ÇñP¹S÷üÓ §Ñ1ïFœ]E†Â'¤£aFõa¦ìA³Vp[#°Ä*T Þ «GS7•+tXºÃGø(³„¢;j²–ŒÙX¸‡€ê—ŸÉ5½‡™ÑyØh㬌1ºóÃ. ³¢ä± IDAT×¼ý©Ê*Ã1$¸» V/<¨ZJ@<ø9¯kŒY®<fÖt¥ùeJÐÅ7W(s9} 7ƒMfu•µUjÔh‹ÓbÕIµìP0õiS¨)¹Ë\B™×5Ozc-ø1JyYpxìŽôXvÜGm&‡?ºsvûxõ}]Am ˜$‡4»r=žnGiE­ÇªÇò~Ü?L¦<áŸM\f9†MWãÓ~øáï?æô_8Ú«Î^ ïa£×jUwGè­þ¨?ðvúúËõ 7ú󯞫z% Ã8ž2“ÿ1ã=ÊfŸ±Îo˜ý¡ ûåì|a¬6žè6÷ÿüü~œ˜óÆóÉ ×_ÖXßß~ØÁΧŠú_>ü^œIAŽW5`EÙîUµ2jÑŒ~Žaïßúó6+öõ’„ã­ukåÆé8$WÓ±†yu]è2` a¤¢Sj¯Õk5:O4l±Ï2÷#Õ³’“CÄÊv±¸†Éêl ÿD0ëa.Ø"¶Þì¼gª·oJÕc5»µH‹¸Ø³ïóýÛ÷ûõq_¿ïu§à4£ª»³«m„ÕVBÖFå(ÂÑdXÌu„ÇIÒÜz.zÛOГ È 0õž×ïûVRèÖO!X o#¹”% Ab8gwÏÛ;dLõ6€Aáóþðf#ì8÷°ÀiÿX¦º;`Uõññ1Σaþ5"oOÿ:äÙé³ÌnfÇÏ/NUٔ本ˆÖ0Õ`ƒ«Ê7¾[Ý[¨jkC Û2“­jqsÉüëy.®5Ûzì)4m• dI¨æþ °ä÷*²!Y Õø‡Òí'¯’.Mvc…^ÙÊ£‚Ûë«¢lX„3 ”Ø ˜rüC‰wDôcTAÔ®¦¢¶_Ï;v¥¦ ¯²<-º(pn(žû¦Å‡XµzÍÙé#ÎÝ ùªß Õê‹““±«ÃÝ…õÚ­í.FUØõ'åÌt®ZMÔº}„€¶à”S aû«Õ5‹Û'+@¢¦Ú(Û.AiËû¶JǸ•ûêÔpo°²þ„ÆaˆðÍhE[o°K²Fw‰ÈêØ[…hUE÷µ’f›Q[ÝÝ?cö_oº@fbÀü\«=Þ×Z{¥•YfAj§i0£$·›2(;Ý‹U¬Ò—™ù_{w®V·0b¸¾¬KçyXÔ÷×õ¿þ×ÿüý×÷ß¿=»h#÷´É@USÈë„ðGY?žÏó<·ãþÇ^•% ]Ë‘¾93¿Œ•z¥ açn[Õ Šäº Ù% 7Á$•ÎL„„„à-SAË¿ˆqJ6c,UUŠh° ,ÈÜ!]éà 2  ³Ù=íT.àÆkÕéwˆ WWLáÕQí™C1HUFæ‰\žÖ%c©E„N·ÂØÓkÀºgø†(Bn]Tµzô"J,š¼Ô*¼íñ@¢¿|—ÄÌ90>_/Œi#ཆ Æaknç&0"=Xµ(ƒ,c± ÚØj:³fgç} †µ_9–‰Id^™ ¸Å`»­Ãí• 4æÔªêµ,†vË’yÆv67%ƒ®º×ºã‰š/Ç:cUiÖüö|ëN¨s^Ç*}èB¾òœ#óÒÔ Á2ók°«Ö` ¿ÎâY³û%„Úª–Q0'JÐáX¯Û2ãù°r wÌÓU=ÆsÕD¡j¹9­ÑIÆæH‚ðø &, §Ð˪þ•óÏA…¼¥rL”«Šn°wt«Õ÷"饀ÇqLU »PMÙ2›ÓqÆqÜlu½+Güiwºjh°A„2óвW*Nûö°Zº;؇q8¯u³¹i¼×€l¡ä}#Ýì—lÑ$§ƒÞåzQCŒlçñV‚ó÷g©{a¶bð`wàT—\ÈR{GÜÝ<ÞFðuÏ7s)yj8Y\i9] ä"B‹r‹¹ÖlÙ8ÿÛ›Õš™¿Å1ld}¸(ÈAƒGgßQrì©NÐJeÝ¢‹(ï¢íÚY|Ð(wºE´ v5¤dݶýôÀÐG ïù)¯ö.vàkaqß7÷Ù¸û«â&:¡†g»S½õët6:Ëøó-b¼?_÷=;Çã´É1L•Ú:£G«|˜ …U°im‡ó ÿÄÝK%ϵ[—^ÂŽvï·8­¬³ÑÐTÓ<¡kÕ·óx­r†Ø )AÒ€Ÿæe_ðþ‚X€äé_eÑn˜Y³ð@:ÃÜ€£»¯†Ûê7˽Úq>›¡¡Â4ó4gó+¦`ô]G‘6„ÜûK‘½#24ØÏÀ‡»[ïøfÝLÃ,ZC‡­ª3ÆýóB®*pãÎÖ¡V´ÐËhìp¬ÐêÙ]å4÷h æ õ櫘;QêV“T͂Β7(®.™=<ˆ%+asr ¤UmlË׌fÿ?V_÷>êk‰ð I]’‰ˆ± ^•9u ÝÙÌÒhrßHÍA]Ö(3}Éw±ΫöÇŠMnÿù³›Ú$mw<ÉV‹äØåTcÎëgQ?p&övÓ¸ƒ_!6¥V‹%™µ»$4³–@Ú(—h²D– ãàx¼=yðã¾þþ÷¿¿þ|ý÷¿ü·Áþ0ó5{Dä}9ðDìÅNΩjáô·áÿ×ÿøËŸ×õýÏû×){.õk0ÝöjÒ–l᥮-",õãûë5ðoÝ)7Ñ•‹æô¸ZvÚño¿<òã?$…ñ7ùfùçªñþ¦îW]F º- Bæ®nbz6Ð]§?žÆŠêjX¥VœÖŠóX©f?§-u­FU/VKû¬n+Ãcõ¦ö´«•)?)Õ]¯òGÏÕM¿f:j§. 7º}©ãD,H Æ–Ò­ÅUtZ8«‰’;$ÜÝ×ë³5ÍÒº‘Ù‹2S;w裻E‡pìýÎךҽJUe~Äñ@ÞÀê ßO5ýÓMÿŸÿàuß›Ç0çuè« kÁb·‘n=w)¼©]„$RÞ^¦WÎI±»½E|¹ 2¥RÙÉÇ1ê^L0¬¿Äî¾ :ŒPÉÝJ·m ïµÓ“$ÃÐ¥/´I3‹U†}þÑ”Úk¥Œrl§w•@ËþÊç:+(“zƒ:¹Ýs_¨«Ê<=TÕâ#Œ ,€ ÖðÍöXºü«àcÂjT%š+ëˆáDªnßï6mfFx¢J,NÁÕ(Òa?Ã@MˆE¨-¢¹ÚÀTÆX÷l­õ‹ÈRµº[¨Î8I‡KÔL;†„¬:"´ù@³[‚ä-î¯ÓÏ.kgªKÈUÅñ1¼k¡*Þâ&–õ :nûŸ)Ñw§)ÐlI¤{Hmn¦/¼ù?–"03‚þåÛácª ëqs^Çó€|­^ëÃìØ`3ìF·Suü€4#œ&|îÕõßÔ^2BCn„šBËL©Ì ä/¿¼_s}Ö|¼U'F€Š}þaf.6¨Ì æêîu×oŽ¿üþíýýùý?þsÍ»‰3t*”×Ìl‡ Q•=´ñÙ¶3¦ãd;ÔÒ2AŽvÈpiT÷ZÀ#4k;es-@òh…0ªI-­1FfVÔAÊÕìsøè¨¾?… 3ÞâÑ©[‚[·z{ÕD'rЄje·U£d,bõ°^µ3;_t;[šéÙÕ¹\f ö ÐĈÇʕʬ¦¡>ʃʚ£ n¸Ž0Ú˜ÈRcÕPX›C”&––µÔåpŠMM#÷»Aë¬çÔç¬k¤\+Í[Tí½Òíu®õ¨ñ8w¿>¯W þpóZî’ªV˜ 6qÃh›%ØÉÊ=§û•S Þùà9˜¦VÜ×ÔÝ×ù6ìîùçãíÙ÷ƒ§jyÁÄ{ÝÚÞ¥nÕ+C#†;„ U­š%V߯#(ˆ2P¦y_w˜wžŽ‡ÇÑã³^‡ûGÍ@ÌÏùˆ§Ó`]¬øJÑéëQ­y´Y¼ÍLòã_™ÿ¸ý˜YÓZÞî~Ë ‡Ù²©£Åu+|£¼š+Æ=“úÌq¶ØÏ8¿ýöËõ1׬Ç¢>ñ;üø\K4‡©®·#šhÞ¯×y·ýr¦…ú|@,PÖβÏ5îÿûõ׆¬ñí-ö²{iV×oñ†Èø†¬î6ç3köËýåèŽÑ©Ûûï|ý­Ç› ÀúÖḭ́©Wʈ@»ˆ«-TØ'ëvZœ¡¸?ÿVÄ3cd±Ì{©Ù|/kfCP9®ãP¸_«Sý<Ÿì²µ‚6¯=–¨™ À ŸËxõúdq,ç>¢”ô𙤻׀¢· ‰\çŒvµ¥ U§ÇèU7Vyž†7ðÈõª€Mµºª5,qÁÕ;l˺…<ȪJm~§–BF’ŽR»Ù@µª)ÁðyZ‚K:eÇ‚‹¢:> ?MåEdàp¿Ö%C*-Iò˜]2ŽÇ3×î)z JWAt{¾³ñfÛR^FrÙ(+C£¸µaÎB!ë§ÄÊÐ – ±6DÕ¶FîŠÍ®ù ±`c˜³Ùí݆ìnÞOAÔF¸»µ4]ø•G.-òúT{Àa5ûð0„Ë™ô1‘úê©¢›kDó43 mʻˡà²,ko°°nObþÚ1…¤V„) "PÞx§¯¬ÚO^³š§¹Ö Øð£ •¬–ƒëk<ÈryÍ&zÃðø%°“u¡´ÝRÙ¬Z‹©èÇ(h±€þ•ž³døÈ—<$³ˆ)CÓ½.7ŒIW¸†ØècµTN¸«+Z!ˆj`W9AW­œ½˜Æ¸Ã—bʨo–šåë¬Ñb¡Š¼Ñ»!-,²•Nx‹¥äYª<¬ú(±ïÆO{×Ò[œõ^½òû_m¾Õø¶OU]f ±wúÀ0ײcܧµõêO6üâ·xûõ—÷ïëï×ßp]W/;†=3o@Ž:û•fwW+`á*ñp°Muà,yu—§¼ n_.:x%Î{­ñ;‘+ÖÜã]¾õ¨‚Äe\G ×A¾A ?6Âh³uÛ„ñíÊyAéB¸¤E zj¨v-*¯,Úuš,ÚX¾JÅùXtGåïˆÏ.«ê­CIµDO¸Ã¤þ!a˜‹ç”ï*­l÷6—ñƒƒœòùíí±ºŠiþý\kÉ»ãPO·e¹¬Â¬(²ÛÁÙpÖ·äÛËjX;³‡VÀœ½¦Ö4£ã8Ö/ìzüq^“îǯ÷úm¼yê!Ói¯çj‰ï¥7÷¯?Êì82˜ÙXøÆ¡*a°F½P5Õëp~ ÷¾î‡”*J£âø%‹®Ž³ç4ÕðÖ¯hH}Z‚m#VÓøP­!Œ×ëºïvü ·øöf¼@•îmGøUx-»ÍÕ–³ôh3•½=z]î>TuW©Îûŧésĉ>XÕ¿%¯9?ÿ-‹ÿÿ÷úcÙ’w©ÝZ0v ]ʼn./BÇ9Œþãǧ»Q"ë'Eê¸î×Z¯ï×çÛx7ó˜åa²ù†HŠìl5ôª:dâWÚ°†Ç`¤uµ5Õ!¡îõ”§±V2<ÅÚQaT§Kš+Z'E»´Ô<Üíl["ò㕺ŽV;GÐl)ZíÍ}jÖd¥ NhõœN‹ Íï•ÝÂy¦ jƒØ>Aåýz„ÑÚÑ¢JUÜ$ƒxÆ$_ƒL€I殹 ºÛ@WËæªs؈Ð?žŒÝb5 ×®{vˆ°ýi4%Þ‡—xƒ0Á²:k©;«<Ý(BUh<²—6gR«ùꞨÃbÓ´Ê]uô÷aÖèU-Æw‡§>üë§ÑM8·÷^ €nNs›´Ú!XwJÂÙ’›mEÙxÌn~-¨IÛ´ìo°¬\‚?lÞÓéî⦟þ<Ÿï]%-Í0m‹4F9$Ñ™ XAPf]R¢lû*‰²zxØW7t¿$J"ñqkŒƒ$ ³¾^ðÞo}½µÖ2³½ñYÛã@¯uû £ ÐZæ»&ã›ùf`w³ä§ucÿš»k»Ož†ÍÙ’ Ò 0èØ3Õ=6í[¸3Ûh#ðUéÔ>™Ùþ9U£µ9ªâWÙ¥8@_T{`öÅCÙ—naìÖsK=vÊ 7¡W&3§«ÜŸ†¤ÖN•8°½´¨r%|%ªÑ”ÿÒBbwU‰")ö^*Aöô˜¸Éq­õí|C÷)K½Æƾ¦´ÙYØÖ¤dòêF™`t» òÇÏ^RwK³:ø§ÕºúºÅó8~}¼5¸î±ÇmîihùWs§gO“ÇóüÍã­ð·ù窜w‹g­ûEÙ¨¯ù`ædôþbo›“•T6ºÁB­êÁN)oct{ž“të¨B3ŽªKÛ+«¢l‘m_*Œ¯â·‚Íi0Ù@5i©Uµ""<˜’YwŠXc´½½:.Ø7¤«ºÛ»qSõ²ÑF:oªAdö¦™íþœ1…Îóv—ز\Þ·õÅ8yöú¼ G0{µæ°2ëĦ¯Z‡ãÆ_C :Loqµ(k–—}í¬ Ô~£ £I@7&~³'Isåú~f";—gíY³‰éÂaNƒ°xCÜ…ÄËfƒ`[,£µêÝÆ98)_–0‰­öNu›Dƒ SP½·îBµkD¹ðú¸Õ<à¶]•ù½ÐåfÔÔÞC¾ª«Ú£­›ºO¤^}˜øÒ~šYõŸ¾Ë„®æÁj¢Í»ó÷¿2êJ Î>Ô.Ø‚f}ð„©ÝžßÆ}} 9O{Ìù9ñí‰U}¯ìe—EÄãìu?ÏWÏãoš’P:Ý;óÙ¡×\qÐ¥U-ñ1<þÂì‡/h•Ö,o3ù¬o¾ºæ\²1<ÌmÕ§¥1L<üvÖ§û¬¿&iÖæÜ-#E÷ìÊ=šL¨%ž£AÂi±™ás=‚C¸»˜¤XÄœÎö¿ÄÃpuf¼½_ÂßT /?~ÛºU¬Á8|+kgça>¶€bkÒJUkÁÃ{omŒqJSÖûræG•eÙáƒGÀV³l=iFÚj¬}X¯)u{„S]tú¦ a©Wö𣲠P¬Äb-_1à¿òQŒÌܧÿ@›°NÝ^ÌÆ6K#Ô8Â)Õpkk2IÏIª‡«ª=ñU³VY¶LýµL±ƕ÷•÷sŒRÛ°Ìåuì -‰avŸ+£vœyqÂYBCbm-i÷¶«ÇVêvÐ +¶PaÍ Á÷ Ú²çÁ,U®!c šÕO‹Ùu8BÕo8ÇB;Óvžä+‡ÕÝ>о»«úRž92´ sŠ(´õHv“ío Ïß?k@oÇ`ôŠJ_½¤ŽÔ0 n?l‡˜Ýæ_„Ú‚dºP0l¹ º••Xí³+˜G¯M@IQí*” î>ÈÙ•™3H»¢L”í§ÿî8nmltKek3bÍá4±Ó#ý_‹´¦gÄ^„¦]eB»ãˆ0bV7æçëùðoÇ4[÷’¸?Ts%Mênë&ÊІçìÖ´ÕͰ&`xX ¬zOo´{at£è»â"KQ¥_}ÌT†ÿy}x0\§9ÇO<ÜS VÛG·¿Eû¿…Ö‘Ý]¾Aé!D0Þ7“ZRÿúí¸Ö¼¥ûÇU¶øÔ;Ø@š=ŸÏîÆÌaöð±” ¸dÏzôúí/ÿþç?þøþãõ™&¬G°Êwe.ƒU¥eÙF&_ ÁR­\««#Úàò3ݪÌN1ÙúûÝZx‡!©9©•îôƒÑ+b8MÖË?EÜuP²¦)®šÍ“=]7l¾Ç*Üó¦lÄqW4T€¨Y–É#=­èê÷r³³ wÍH zš2L;^iÆùËÔ´3¥Zk¡F(RèÜl‹zS'ç©‚§=V{¯ÏÇxïòuõÃñkÚÝÝ´²§jÕ«ñÿÐöKr,I²ª™¹Gdpûö ‡KþÿQ„BÊ›žé  *3ÜÍL¹ˆºÝܽEç P¬ÈwsÕs,æ¿pý±G7»ûÈýØéý¨ùãùÄ{üúãÇüÛïûç¸àãÍi9'ìzíÏ÷ÓÒÖ¯ù× Ó¯|~¾Àùiã<Þ®2©ÜÖ²¬N›ë×5–bƱ;/hÏ8c¼*]íêæxv¿Þž‡ngþx~<¾Ï´<î&|d¾ˆ.›Ÿm‰­Ãy­æñxí5ÐŒó#—3dæò£x0Î]:FìÚoá?¯„Õ¼ú­=&ó¬WÛóGq¿ú8k)^ßûÑį¼[êºÞ0æz™Ù¾}{íþÆš½?“J†ùÏ+×áÓã þ­ù£žŠ@û™gƒu‡ûe϶r›Y'ÝmŒ%XöÁ1åŠ?ãªØxt‚È~åƒeª¯ƒè0›Ýѽs¯á&ï•¥­ôcìÄ[Î±í ˜Ñ§vk =ßD?sÅn‚îîxen&Þ“Jðî¸k4Ïž¨QÒ“)GG›;M ùÐ>ˆÝdÁü¸v¹ü|©bØ€Q²íaÑЮ G*½¡°Ö iBuVD_öEhs›ZÕPÊ%hgUéPi6dÛŒöK£lÂ+vÎÝÆ -*°’æ¦;Ö["¬¶·YùB¶u±“©v–‡ÍLFؘ¶Ön.)cú¯@u!IÊ`.錺®õ¹0ϺuŠcÌQ“^kËãUCÂܼyJê«:¬»¯üÕÕ®4JaEìêÓfÝû]„&ðùºü8l 0»;´EDGÓî3Ðc«Û”™ÞæÁx¥…±ÕΆÉÞßÇ‘™dy¼ÝÈšmÃoïø¾Ò}I5ÈâØUų¬nc„Á2—©Ùzxtë….ÚV¿ÇYùzÝÞº¥¶«}ø)"MNMbÂÔÝM åÓ®ëºkÂg×0¨™Ú{DÊûí5­„V¸7”wÞ×Í‹q¬\da )’¼c}g˜ÀõœÁ †|îýÇsÞ  ³bDí}eÌ5Î ¸ï`Z>jkãqm.Nö2°+6c?btÊez¼žU§ÉÍA†.,{'Á¡?Æhq¯>·Ómº~1þóo?ÿ2¿Uø/lœ£û© ±ç>x]²Ö[Â!ÕWSO ÍD¦^å~çÑÊ­Îëú´c¤Ž£°D;Ëþ IDATæm#ºDñÛžÿÂõǩ׆géø¤½È“@ÓÝ~þúõëû<+÷G=ÇÈaת3b®Òµ.ɾûxÿþ²©Ê?> 5sÇÉ­s|¾^v3Õ•U6ÂÀ•ùqçÞ ŸƒFÐ;1,19à#¤dm,“•F‚W–3h¶ëð%¢§qC/«[Z¼»Ý †Wÿ*C`çz-–n`·YQÙ² Õ††¢AæÃr,ÔelôU™Y~y-­×%U0^D¶Tb¶1`{%꾌\}yÐÔ'Eµd;›x'Þ ­2Î\Ê[âÞ73PƒÆn$Ã=Aýê€Üäͽ÷×$%˜:)÷¾³)N±Kk­¤Ö-|4=Ž@nŽ’KŽè»&s÷êiºE°ÕF#é,±¥êRëVùVïÎ’lFá븩JwÝøë¼É¬ò.ÝÕcÀn·0óãá|ÖçëCÿùqžç·ãİ +q]/?ßû.A5 µ”`ó¶Ÿo¿ýþoCq½®23µ^Ïõöø=÷G§^îwgÖhYµ²]vr«É eoô—Œ Œáw]¼ÚnGÂ’,Î_Ò «€­-?I‡ç¨átû öêìør¼5Í``éêüùÛâ!®âߺ>mÍÉCÏ\%>•ĽàŸ(f”zi\ôT0ÍN¢]Çã\ŸO›³ëBwùFwŒãîûƒ&°E´UÉÂǽ˹Q¹vGÈ¿<š„1fBPøÜ©’Ägå˜Z…Ðã8LÞÚ¤¼›a·°G÷júûRw°úr—æý¼hè3×–ìd»i Q¼å&ìÿÿ…W†"Ûìuü#Åô25X€,°¿–P4  ÞxÕ)Ý (oîsZVf¼Áýÿó ng;=~<»ŸÌrh9ŒÆÍJÒàS÷ÊX¢‰ÐjÒÜÀrc7ÃXl£ÅvwÑgLµK¨Ôm%YUwÏ¢»ÓÀÚ™NÝ7ó“Q?+ÇtHî^Œ۬m`¸Ã#Ë[ìbÓ‚<šéܤ»¡Ú^_B·ãW_d‹Ì¼}rÿX@u×h_Ê…ÌšN3¡*%À¬’ƒüõ±çagD¸A"êþRgB4º9K?“»¥ç9ã¦ìÇQõµúÇëÓÀŠSwF¢4-œ£S£½¹/A‚ˬ@(’ [Ã8`!åô—í•û™cnž¥Ã.GMèeW8Õ7³Eu5Ý£» ²Ý}ì½1-³ÑTÓ`îo®×1†Ÿ¬²îùósíìóoçÃçÃ0~iÌLÂ)r–©í±áÝ9¿ÿÇ¿ý¶^¯¿ÿüø?ÿŸ¿™l]Ãn+¦$“ËjC­Œê2^&í|óóhTV>HÀAsríôɪ.X¶¡ÛÌÈ=Õ‡CvíÍ‹¶Ž±©â­¨ýj7‘¤ƒ+PÀÕ]êbCÓ̧,»ÃšÒÕ=LÃZ”¬4#bÌì'þl£}=V"ö%Ÿ.¿{U=cdêuýÐîူFïÏ­òk»Âè—cûœ¯×kÎ)}ù ”ŠwP ÒqLå–GrHìª/)¹…_µŰQ «¢?×#f0P½½>Y©í9K»°Þ“Jåx~–픑˜¹_½ŠZPO»¹9–ýv¾|_¹ºnI¹™ÆY-ewçæÂÀYoU&Ö—© sËëN Rˆ-U¿Pœ5œä°¶¾žñö-wÀýíý´>ÀêdÉ®+#܆»‘ªªV¡%º{ÄîúçŽäqÕGÛúîy ¹M©…8\¼z,f¶õÞÖ<ýìÏRý+ó§—= lìI9ªQâs!î½ÃÏŸ×ïß~ûüõë<ÏaÛbì®Á°òëÒ—,)†ªþöëïß~ÿö¯ùþö÷Ÿ¯ÃZèóqæ?Žñè.„Ë•T˜5$ 4ÛNÂÉi&îa¾BÏFÄÑ…×ëtån#Þ¸¶l¸[W]jI-(l»4Ýß-ve;cU™ì]o-Kj‘=*‡ÄÆf‘e “PHë܇ûð ÍYÚ]˜ãÅm”‡iÇ“c­×Q2K¡¶Ÿ~S‡÷Bçá(-èÐç9²ª±kØ70°w;‚â]BÈ´.îΆv—Ç,¨Σ¹¤š3·dns·nô'ìkmf¶÷&y/þ¼$aw!YŲÇ Gšè¥»~¾ÔZ,QÚ•úMÔÝ2ÒN£f3÷;Çm>ÃB Ú†§éþªa,DÜ{ôêBÕ4Ý`+˜}mænŸ yt6ÌL`÷ äô|– 4cºª;Ç ëÝ‚l|]ÿ~›ÚíÆõmòÑŸ%e n,c–j'¨²@…ÝÛánÖÜaWƒ}¨»2ƒ.¥™Á{gA°¾X"ùêírÒî'tÐÚ©°ÕõT3°ûáì¾Á tºîõ2MÝÐ= ò’}íNZ²»ÛmÝ7õf[ýãC-)"®ëúŸ‡aÆÎ?ðõ¸‡ÝfŸê{ñêÎòÛa+¤d悹Óèê½w™Ý]uä8ñgLâí8*IHç[vwåÊm—{̽sfv ¶;ÕMªI‘ñu%ðëÊ¢ÞíÜ;ÓÃ;KèuË• DŒ[ˆ#8Æói¶*·´r¿Ç]*ÍTªîIÖ­ê¢HÜ {IÝv]›m{ï°ñ˜4$í.Î`¢cÎRÊãØi«Iòù|.ô÷ïßí<ô¢ªºÑËJÍÃcM÷çxJ¸þúï3ã¯ûñùãç+lz­Ëæ `½K]ªe•A¯F¹¹ÑFx¹––Ê As@ÕNµc@>ÇJÈKÙfQÆjCÏc\¹²Fˆ°¨}¿ý1 2•)¡u„«¾Èn0)ä^ôš«Áþå]V6˜Ïô¥üÞ/älñn¨e÷ç»w¥Ã Âû¡´Z•ZŠžM«Æ³òáç<ûÅ1Ú»9GÌ1W—¾ÖÏiiªînÎ%<_ýŨ°=S(B·¥C$¸3E“,0Ñ×¶  Oëµó(à¶²î:ÐÅ\®óœWWETiU{x5V'}¢€„N=_/¶w§y=ÎÈ~ÝÿG¡: ‹.ÓPÝ@Ïx£öo.€ùÊÜ™ï>sãù!oüúÀÃöj=Ûç¡Õ}u#››=FXUá‹F¸9þ¿þ*U>~û}ìóÇã<3kI<Î Mnè£íjevAÈ4Àη·ÿ¥Åÿâú£®ó˜ýë￳ºEø÷l·c<³æyþíùÙU¿=báJÙ¿`¡Ë&Ø 9³»ÜíìäÉý:Þn?_Ÿ×Q¾öúöö•/†?_∞ôâ|- ;[jî—Ávò×1;9Ç3E&ZnFã]™éAfKnÕUlرËZ‚¯kl›e¥ÚVåØ!»Î+ *fzn½ß8ž‰+ǘÓí ¿|ÈIO×VyŒEˆ¨y¬^3úGþœ<5>·W¿! Ó²£¬R"Þb)éœÁ³X`¿ŠÚ-ºù07‘û2æ#K§ n/QÕ1ühõ=á%§ß.é eUÂc‹Nñ.H6qYýv®êÚ)^$ÀHÉd7šXP“IТ*÷nŸ~+^  ª/t‚˜¼\d:Ëyëð†ùm¸mbæÊ¢™îÆÌm´PGW»™Ên«mª·›†µ»ú@˜YÁ!v³-ûD}²¤ ƒ›Ì|4¹‰¶þ:ò!8TUp¾¸Í Ý|ÞóI €7N4˜­pÙ"c`õr3—zo¯ªao&aݳnuW~tV˜Ä¤a9R¦°¾ ŠÝf`8…L¥±Í¯êÑœ2AÛž >ë󸕸êéîJ\Ùd$é#aÝÚ®!ÒâÙ(Zì·ÆVØœJl’Žp23Ñ ÖÔ±KWËE]¯p#úˆÑôÛ'ÇXÑpwùÚ½åDú´Çe«ìgHLc¯P]5ZæAÏÂê67k¥{½s ýеúÚÜò Øâ³êšMç3Õî0ßçîªÞÇV§­û4Ï€×l]³[®é"‹œçìªÌ~ýñ‰g3æ@åíïÜê ö‰>àÑòW·Ó[ôoÍë¯ã°ã›½þÇ=S>ÆûI¤,iMºs”¹™n»k×swÚñŽ{’OïÛn´îUY,§Fq®ÒÎö ¦Õ¶=ÄÓ®:T¥^ ùÛ1{¸ÿÜWu›G|ó}]4†¤ÖÂ܃u„ zuI«š•CƒÉÕÆR5j¾“)«P>xY÷/¬ØxëfKµ ‚Ÿ˜ŸçÙO«.Þ–Vî½jŸçé÷Î:À†·A¯×§Êy g(ËbË |÷ƒâùúC×[6ÚÓ¯¼føðHåiTÌ 1?éeªÀ9¶–·Î'à~Éä²…ìôé~Õ·¶Yø|®¢-äË"ªÛ|“)ÙÃÑÙmãèܹ4wßKÄ(]ã½k\¶CŒr}ÆÝþ¢‹ˆ¿<°úz|\¯Çæ äožë‚úˆ }'¹^OYÉßè1=»Ëz€™úáqæ % åqÖK ãˆË4\‡Y÷çu•ïõtX”LqÍ~>Æ–׊®Ë¿þ…ë³æ·>ÞÞÿ}ÿZ‡{ïlZS@v«óZ1¯çn?=&@ö&TXìŒ*¢|¿™tÇ´¥—Ñ®«öóʧ¿¾ÁȼXj«T›¶qÛ³àH²95TȪ´þ”ý"8êœütòýcغÎDZ´»ób?3ÆÅ7ÈÞÜÀ´«RÄ}\Žðk% ø»ÝçÐC|¡¨,à ÐF ¶0X»8aõ{ž½ö«[a8Ü.¶]—«'ß14MÕèÄ@õ­·³ã ¬«› Öm Cã»ÌªKi“5=ÕÙpC£«V-y‰ýKŽ›{"9ܨè¤Ù£v_Ÿªôa¬¾ÖsÚ žkíÍ_sfÐ*ÐCð 5 s+nгe@t–Û«1"s]û ٠ᬱ ÒŠê†m|ÜXI­24T¢q´d´½ŸKuŒÉ&¶¤Š°TîÛ½A}q(Ì uByC-ï®èÍgµv—5‘[’µ°tkÍÄݲFƒ%w…–»WÕ+·…cÜ| £ìnÝI~ô{ý‚$ÖÆ H@ wµÑNÿFÄÛs“± i6iD°ðÌ+÷>烻6´:Óè´aî׺í1F¾®03` ›Ë ÁÑ„ h«4Q2±ÁŸ÷¾I Ð$/ŒÛ2O|ÎîÝC$v׫íÛ½kz eÙƒàÍNRÓms:Ý]¸¡—MÑ@~Ö»o[žý™¥A—ŒQ™¦ø±_ÓƒÄç????ßÇa%™nšˆ»Im°Ê¸gÑúr—þ ˆTÕ-­^ô¹(©‡š„¶ÌáPKb×.I²5Nø›ÙÞäOâeãP#,ü€Y]轎ùvŸUuÓ8ÌA nBMl¹0Áa^$Ôü:°ˆÎ[%s|;³ûóùüñ÷_6¾ýþ}¾Íyçy˜/´[Âç4G3kwÂðêW3Þ¿ÍÇûñïÿñí¿ÿøãï?ý,9Í5úÖpAÖ~Œá+/‰•ÆýfUw%²Aº½»­ @¶²’êºÝ€Àô˜g »” Íñd6ÊG HA°k—§l%äv 7Â|_y•´W‹m´müX/?çs¯áa”;¼ŒÛ$3Q6,Õ+£AYa­a/ÿ=î+m¸“³¡=Uh•Ù„˜»*Óßâf8?_ûž,‚¶è&»Ã\b&jéLÖ¾Ð=ÚßV0ù¨iðé ›—åVÂñ²§?Ž”¬^ƒÉ6¢Û6‚ãxŽ0ì9þÏÜ6èöï2±²Ñ/ïUÙGÍã1ÉWÊ[v e²äÛöùxÔ°_ŸŸPç¼fCÃñ—ìj º BÀrïìĈÒnš·u¥µCeŸ™=ó­_t?_Ïâû¡~á«ÿî \d™=¦¢TFÒ#$™˜™Õð°ã·c½vc¨¢mUê;mf¥Þ²ÎŸ`šmrïë_¸þHàãZ#¸%Òâ8¯RÖðÈz{ÿ†¸ŸñƃíÞò!ßy\×ëœO„©“DwfšÛÙYq^|ôÏk_µ” å2u„šÃBµõ°¤Ô­,ÁÛFYö^qZÌãǦ:ÃHH V9‡ÇÔj_šPY}iSµ*÷FÍG×63ΑªÍ›&# cv«ÊÝåчùTûîÊnùV´*s¨20rgb:§aÞÈÂoÙrþw'‘UK¨Fõd ƒ›aÃaìî.µÂd., „n›*dõ~Å»ßHÑè*véiS½#R/÷« mˆšÃÙDÅô#ís7Ü£ªL €(ê.[¸áæUÛf5ÔÆ›ÚÅqkKwzf Íf;Ë@Ú %5ÐdíÓ‹ý¬-¡¬[xTŒW¥ÚÑ% G©}D÷Å[C¬;A&*(KÓoÓýÍp¸1‘60ªLù wóÛO"QÆ0ˆ`€·`„™í»ôq?2)CÃáh3lñŽ)„ù¥Õ÷ºð€Mú§þA.ùçúcFã>SÜŽg¼±7ÒeÙŸÏõoç${;ÂÖ.è&~¢û³«3ž¾± 웵zà b`›'¸h-Ôh!e÷ ÌЖ&,’ó¹÷ç3õžc˜n¹%åaÞº³EÕÕÝAs·j@ö@4ôís‡ 03ƒL팖îãOìwˆDæåLªwŽcNØ^{ŒñgÌŽ]EJݦA!ÝCþ;@ÐÝ€"Œ÷­_þ\ »«û QìºÏûÒýæµË/wããˆçëõÙ׫:QÍI‚ª.•ÜDŽî’”Ý 73UB¶ pÉ,uàNw3oà a@H]e†UËÜcú–^×þu}ÿ~œ#°Ìú,C¢Ww£à¢Yé}ÎéA´ŽJ‘ÿýsïnÅÒÞÛIX~ÂØæRUUX vPwZU”Ý¾Ë ršÙc7³IGw·†sç& η,ocï¨V;–­Ý‹ÍR\·KxGœÊF§.²ß"T©ôÓæ¾úû|ÜÜP‰¶Ë t~GånÖ]_¤¢A 9`ì½$zÑÕfG»{ÕR€‡ÁšÃ¡V {i0ÿ¥ëÇÔóÊç·¿v«Pašx­Õpÿu-/¼ãÝÏçºd>bmþê#í×ós_]!Û4ÓZ¥1Ï í<üÃû¹¸®w0Ð×LUPïù«gxåuxsÊÞϽÇuÎÇíÈé~DO~îë>áoã-Ì~hõ˜Õõ¿]gl?Í egì#3öäçBoÁç7Á­ýx¼o$ó:¤®ž{œi®6ÐlwÒZëJ[6f³T«yéáóõà¯ë‰êc ¡Qí+å1ÆÅÃЬ˜ôkïp}±ÃDy4Beççûù0r7^Dœ–;üœ aÈgõâ8aþV›dØ8ýèTg¹T‡|£®œç|!Õ¯pã~Hì†"iƒô€X¬4†!D{Æ5ØQeM<-‹‘kœ'»·]ÜOHäÚMÏ`›µ ÍB1|Nóº »f Õ™÷€ÁÁªžî\Ý×nbÕ¾>ΈVÉtÓ6g•lrÕÚÕ¤6Ð@ËZ*½eÃ6¬¬ '²’”›Õk ãq†™¯kÁǹѲ¯Ž¢Å°½•J— ‡X´Vß# j·uº©vp—>ë9ƘG·w™ŒYë6¾t·K)éÜå>Ú\æÓjPÙkᄵ{uÜ^Ðú%u•Z®ò»cQ&]½ÛTv‡EÍݳÊÌd¼ÐUðc…Ê-ãAÊ0aÖíÆq»~»UDƒmÊ^G8ßf®åE„]Ž+0]Þ:€û)> ·!ZÝ6ìf|ÀÝÙUµÝk«Ôã8Ò:«e]a>fÜNµVyøÐ=Cò©`V-hü÷sG/lºv혫h‚#»È’de¨~bÕ.ø0´W¹ävà8ÛÎò¿ë¿<@7:>H»%Qû•Ԝ짮gùÈzqâxŸ¹*Ù3†Wɺ!ÝëšìÁù‚ Fh"AtWKÌÑÆ½;G÷6G+ :¤òð3ÆÇÏþ¯çú¹í÷߯_çw^3°ä{ïTï9Èîr¬¾>t<ÎÆrêß¿?ºññÌŸÏtEV 7èrÏÜa`WõJ‘æêî»ÑjeاPt̑ݗ Òé +eËAÖ.צÆsåêžñІs'FpUà<ŽIŸ²¬uøYì²j«£G¾ÍÆ€E!V¯iv3Íí'òò\£ƒî`ïÄd‡²ÕsŒîl§¡œ@Öao_Ç‹;E¾Åûæ-Íša[ŽWçx](sº¤  ëZã|î'ìL]ðü´Õ¶O›ü¨kŒ¹åï…î|M{Ïk°¼€‹Àðåy0bÄ^«´37©ßG¼ïûµ¯UööXÕrmËV#õæãÑ $‡žñÆöº—²4.ëåíî6 »V{?|{áEÌ>ޚʫ¼Ú޽µ†4=E\í2«ÄÌFomøH<œ×ZËηjÂvñ¥kùçcí¢µ™±?ÔÏÚƒöˆùž™äºÚÜ{ÃóÅìCúØ'é®k’$³³†&ÿƒ3`˜7C=sû®?ž™ôáf2ö]'ê|è–y´àîD7Q+ºY†$*TÎðù®· ¼¥ µ!M‰š­J´ê!ºÄÎm´¡Ìè4͇ײ1¼æ4Ó<ü˜g[¬,w·7ÝkoÕîºjI2ó0-_-‹†›³ÑV Lg‡}¹MƒTÖ==À0ÝG-Qü3hfUef#Ðâ>Yn ±!]û—;ÉF7u9†Ñ@Âø¥)EC©nèîXË#ªûÉ+©ÛwÆø¨23»Øïæ§¾Ò—«µ; n@t@ÆÊûdPyÝó_scëe·L·È”ˆÞ2É„fìfLÝßå?ñ;œHÐh»wYw ,³£*、›¾-ÉîâŸ_Û-ÿó÷õ% é`„ßuàV§ FoSIuV5ãb6”èˆ)ˆ@t;<œWõê2c;ËPÍSŒ”ëí ëɪ !lju¹Rb ‡êλr—xgÐá |U¶9ˆit÷/ôß ÔÃ@*!Y"ZB½ÔMÐ, «úK²ÊÖWÜAÖ"ØY41QUwÃsÐÿ|7S´¾ÝÅ@Èduƒ[ÿùº‹*ÿøõ.¯V×ý×ú¾”‰ Õ`(=U Æóã©*îHèªô{ìs÷Y¿^](ƒDdÑ%L¸áëŽõE`ë*9êþÆÕšðîû$bWÝïf†=Ùì}õŽð4˜Ár‡ ˜ª›nÄ€´[tÒom×Wàv—“îýgõþùÚŸ)ìîvâ«^§<Ïóx<Ö–ºèsO ²1.݈; ¤‘©f †e¤Üµñ•ð5s3™ÅU)h¸Iÿ,õœÇøF½º^¿~¨GD÷šoÙfŒ½l¬(äeæ¯×3œ(ºù¼ýþf׌õ·çëU-#ƒ£sÐhWÞ:>ÌxOÜÚ @µÈCjÓ¨Zᔼ]´»Ðó< µ+YÕ–­L!Ù‹j×ÑHÂ#‚¦’ ѽQîû‰Ñ@µ)9(‘á»w°i²± £‡•Gpt÷²­.t<„h=™ë¹Í1ƸÂ@çm!„bØ=Ê£uŸ£wZÄ1Ô(bŒ4”A÷À“(Söö qßOP^€¹]•»ñÐæË IDATâ%s †apÓ¹öeºÜ02ÌM6cððEWàÚÈΘӖ^n͘ÝCÝË]÷}NÅ«Ér5Ü© »IÉ¥F­z¼½õnÝcÜ»:6ùú•´9ü\wZÆôòËŒ«Q>àn•i˜ÝÈU0'<ûÉ—¹\=ÂñëúÛ÷ó»Ó^Ÿ+Ž=Hb*©‹]]Ã}šïÎŒªí»›Œ„íö V$ºÙÝ#n·öMJ­^c5oÛç­Â0SËÌrðÊ<ÝcÑÍÌíÕm¥1]À®MgfÈ®&ÍÈ\ÛÂU™4# ƒ%q¡Û.“=‹*§8Z÷ߌúó†îɬƒÉíèÐB; ý¿´½Í’#K’¬§jfîȬêÓÓ³¹ ¾ÿ«‘Br¦ûTU&îf¦\DV÷pE¹Â;X¤ä" @ Ü~T?E­`æáÎyUcŒW]Fb'È Òà¨ËÐ;£vA©þE‰0™>QÖŸV>‚Â@«qÙ=÷®{Ü?·]Õª; HRW±e¢Ñ2“’3ìʼ“î“2 dm“YƧݠ‘žvà•×’@ªÄîߘÎaA *¡®ÛŠ…;6(ÞX¿Áö7˜„ÙÕ“…b½(̘×úb\Øïyþ­Q;`j€ dPtï0û’>”špu.}ñ¨”@•îö˜@«!‰‚”vÓØájïe­D¹V¤h&ôZ/ éfÃ€Ö -P£ŒŸî M 0Ë]Ã_d—¶®0³¥;†w4ʰÐnÞ]E4”€Œ‰•{_x:·Gªº›N0ÁG—p{jþyOظ(Vm~ß0wúÍl_ •KFÌEH-%„{ö_<¶Æeþì]yÑZ ¹(f;H¯Vf‰~Ë,"Ü]ÛìÖŒ Ì"Ñw5,³6FŒÛ:dæ¤ï•¿‘(4Rx´©¿þ…Ÿ?^}ýj§‡›ßŒADw›Ý˜"\$ Ü‰¯âYO9#†ÂÔ±ÉìÑúªÅyƒvÜÿöf»²e¯?ÿÓaþ ŸcL|Ùå;¹Bhî²Lñ¹ãõ*ïz6×÷Þ¿ûósüz­Ú=öúØ{SÖÑ Âd¥.oE .˶ J‹w¢vo«nÆI {I Ÿf Kðæ ïácØXσ»®çsÚ d%ê8C‡dÝJH­ ä>®õäÀ‰ÃåʦB©66•ª>Ù·CÈ|ðX?—Ìå>`çÖî®bcJެ^—Ÿ‡Ã\áqßh”µöNÉÁ·jŸv1¨ãzþ`‰›ÇVÈÊé3k^{cÚ|7X~ü,ôÂhî稷ޓ1ü8n¼®µúÞµÎzUçµ¶óÈmÐÿ$Ñãê§Ïr—Oym q ýê¶^JsQ2S6‘–FØF¡¡öÇ~{?^—,…ݶaî—«á#ÍW5ºwøçÊã|}\ †I^'möª„µö¶¢DÎ7¸®çeÂǰQUÙÛœiˆ˜!y#«î5 ±{¼¬ŸbcWw%݉áp{À5úî´Ô·jþ_öÈ¡ê-\+G8wŸÇ¤y"3Ð&TWÕ´°’KO¤Êœ@C†¯è[€Jr³« Få¦ÐàV˜#ØMèþâ$mÍfh·2”!=½¿u½@‚þ•*B3Ëݼ+™–÷0uxÜ¡©F»òkþqïV¿ ;ÊÑ^jH”»eî/EÂm?guþ³Éû2“ÞQmÝaæî} TyÜ%nd“ùmvav‹Ü]ªýî“df“_çš\Ú ˜!› îò¾¶z˜Ê´M˜ãb_wCà¿è@7ê ¤š$ªÌü6ôà÷˜äþúB˜-7ZBc£ä¡«$ÿ‰uvíI€T9çÕ‡À0ïŽî°AZÀîMo7—£:kŒq¸ã8.-»ß‚º ƒÙÊu3ÊÑm,¬QwÙôÏêmÇ€¾ÀõûEh¨«hŽ{®×˜d=sc–T;¿Ù#œW^s#)wB&à7ÇÄn”úkŠ œµtcÖªêöÜ‚»@3ÑÍÃ¥ÌT‹9LMÐà8_t‹K}Ù-áâáQŸí·ÈI-6k û+‚HÑa£”Y6ÝK5”•Ý’ÙDŒ©Ff@N0Ìi0pxÜ`“K/*×Â0‹9w!«x\`‡÷ /†ÃšÀÌ©¾­RîRÚæPw7Êk×Ûq¾öe2'Y=Ì^;;DnÔbÄ|£tÁ„V·õbKÇn¬½É0³ÂµvTc”[Ž9i]ù2ë¬Ým¿ÏÇë¹ö²qü%Këº<ʬÛ6ðb÷]²XÙÿ$Œ˜ÀØ`!6|ðz.¶KàþwÎ?Æêús{ù¿iVm1ÿx·ÊW½Ûçô&_FŒ#z/£wm8«»^Ÿc̪2Ž€©Aspꛚ)¸µÍX}¸KëyËÈ}N1U89ª>.ˆÍC~\:ä |ôºÃNUÈGöc;k])]ã„÷»[3ÍK¶·m°Si´çÞåöîôþ1¸h'<ÀÏë9üpE¬dw˜6ÕÛæQÕñvÔUíªÀæÜ5rŒ#Ìϧå·q¨ë2#šC<Å ]UO ?Ž)mÔú6ÞW^à†m· –{_ågn?mڵ˴ïð«F›‰Ö©ôˆ ·zµVï°1I+%ÄÖÜ…´M,à RÏ¥öÚ']æf¦{0óltÖ°iš[U"è ½¼[ty·L¥…"ʘÜÏÓÜd%. fŒØÈ÷%:Óíªëh‹¯åE£8h. ?ª*5² —g›l·1½uã@3²½÷A¡[º$¤?àÌnfNˆJ1»§É`èN‘bË: ä¤À&rTÅBÍK”y™t¤Z'ÆÐÕ›*«3ÏWfMß=[±sé®}©[ðá ë[&IùýäÝ|¦|Ù=ÓHzw'Ä1®»i ®++Ʊ¡#0¬ÞtÊmÅ0fWD4:v÷—C¢qü 9£‘{Ûdg7œ%޼&¾kµÄcœ×k‘ˆ»XøÜsÄ`¼²ÓЊ5F€µ¡û£žÍ²™ò 6ñÜ=;šcIØ4¤úŠu¨2ÆHn ^z0f5W•ÖºUæn’…VzHÒ Ä»“ÖO„™9šf»wÏ6Ã7vCårt°£×dé·Tc¸ºþòÇû³*ëæqFÛhIÌah›r£ýÇhjûé)_}ˆÒC%ó?æëùW¨j›œ`©^-¡Iv#ÁWî@^=µã³j5gw2×Ôú512õ²$yÚ߬2X5BûûËO÷Á´Ë™l-‹Ë- O¬êþç Àݼ[»7¶.°éÒ¾:Õk˜‚ ­>—º6ê|ÉÚ1=Þäkç¯ÞôpGÑeœíÚRõÎàÚ ¥á“úîÞ¦Tš‡‹0ºÚ6«¢³?Çà9-?—›ûé·—æ…\i‘—^ÆáÓ®šF çÛðÃw_֮ф^ÖeóR@Õå“‹Ãc”lœb§w)2æ°Ú1»ÌdÑÕ ´ÃÝÇÇ“ÇA"¼~F¯áÛÔPtÝYç<–¿™WUËãŠU Fº&žööv˜z­Úcn†ˆ×ø¶Íð^{þ|MwÍ÷ìõ'zبƧû÷vá/#è%ýd”Ê\G¤áíµ+Ä?.{aþ%/co³þ;ùëö?Þ±Uyù7«Uù‘GÙh!ˆat€ð¼è‡»üRóÈLKÄå±4»‡…;eùDý¹/T[ø¡¬µL=äÄÞÙê›ÕÕ2Yé1©ïŒSXÎ#Fwoª¢®Pw¿Y˜×Î×ÏçGøÃì­é’Mu¼Ê¼ú¸jô¥ý,ZÇãðGóe½M…3{$ߎ÷UC) 0u=ןè#@{ïý•nÚGAr‚Áb’Ôçó×1ñ›#~K6r[í&^/ƒ³yðL˧õ(~w„íÁ‹ôË<*K®‚í6Ë»ÕOeÁ\âUñÙ(¨Ôæ&”ƒîT-˜/3Ú0ú°ÒÂ`ŸõÉÝ4=š€YVÉ¡`1V0¡»k‹'h#íÖ>zeIšeMʉ¡¾]Šf)Y€ÎÑ6ï@Ü9¥ƒAÖåÉ‘†6ÊË¿ y ¤ù1â^¶««3}qåv½]ov–ÁL§’ƒn+Ë=ŠC"š2$Uygffךñ®P·ª7*hg“¢]F³ìyÊ4V¹žFÆ—ßëVlÜ‘4â=š×Zj¿·Ç㨫€t×._K"N>Ìâ¹2§Á$k@F™ 0z{À?óÒW¶ê¿¨¦¨ŽÖ¾«4½»'0e,¸¬€‚ÊÃUpP­3†™¹ý¦ô“»x½®qÄyÎY6|´ëÊÝP &rwà+‡¨v‡ùÅ,&¼Ípçÿ‘ Ü:ZéèÎËaÁã¿k‡ìb´µŠ´Ó©½*_kÐÏóq|ŒÌ=ÙÏ’Ò:»» ÍC^ QtS°†„^[bxý&¬gË­·Íô Äo•ÙA’Ç•™Úýêc¸ƒïÍ÷î;‹Z!°à)µµÐ5IÀÑp&Ð`JÞZw9­À2Wåö°?æ\ÏýÚ;÷^¥|¼ßèúªüç…ñE‡+gÄíä@•z¼ÅUþ÷?þ(]Î:¹=?ÊÈK»¼aôÕ‡yXTï›Ô¬ë¹æœµŸóx”låâÖ0Ÿc:•kÍáÕë×…áƒÙ”“ݦæ1PÝÉ{Þ÷ˆùÒz5/   mcP=»[­j£O´©¡’¨7q$Ì9S]Y î½á Æôaª+¯/ctÆI¥–™—êN–}ºå_ßâ¹^öÂcoýþª dZÜyúÂKHÓwîa.k;\YW¦U?ÈÚ鯬R û¦ÞêN`rs5Ó½×÷c¿ Úù‚lØÁZ×6’F¶¦ùÎ4·¡|GüýÇŸþiYŽ£ÖFÛf»­_hfÑ:±¯o¿dƲڵÝ Ò|Zo°ª„½P³›¥6‘Öâs²%ÞxWë.öõúý¯¯?>W‡zjâÌK“³§½*³wW;ræg§:%“+AÀàéx©ªƒAÑ«fâŒcÒo7z›šÖU(©¾ºUC£«F¹ÚÄê#5ÃÌ,^ûˆészA¶ ·vr©ÜrkßŨ÷QÜ$º³]Å6DaÜÐQ(ãºí¯îþ’h¬x‡ÊÈ–Tu<>¢ÔcëË*Ë"å°!•‡¤îfÖ©­« f“ðºòäpé™zõ™ff¶»»ÅV¡.ZdöÇ K­álô¦Ù%¶ k™ùa$Ú2c¯ µßò8dµÃ‡Ü5ªmcUíƒnÄÅÒ¸qæC²3)Óv…Sê㘠muA=`V­8ok± 9YEµKäø‚® ·µ³ÈDœ0±ëžè›nê:-àÝ©¨XyÙ<͙ʼ{øçfHt+¨(ÇÝ?;ë ÖYvc\‰[ #n.dy'êzTUT2kuÕîÄÍ7MõF£ûŒ1i!Ò—k‘Ħ!«†¹$U…Ç õÿø“Ø7èãÆMJ»N¹WÕ¸ Ÿ¿Õ¯$‰F6áǘ¿žu³ËìNÅ‘Ø@ 2ØÎß[ý~P°ÆWAtmìÚe"e·ñÉå]·–'h";Qt‘1JmÝXWMî0Þ )˜¢ ˆôÈ.5·ô\í_»EÈlƒ5Æ 'îäë¯G÷ïoË ÉۉÂÃvÊ“ëc·ãu]æ¬A» d·,Uæž°;ØÜØ` B%î C†.1<îxdÒš,©ÔN°Ý-+ÝÌl-,¤¾Øw ô½áú*T\ ·RÆ]$ ªÌãËß·àdÝKIA MR*S7³ùʬ½ì_ç8"Ü_Ôà794›»«»à ÉÔ4;æ_Ûcòý<>ÿ\ÏŸêÒEW˜,-ƒºÐa[’tŒ¡ê¾ÊMf‡§ v·ñ*5æ®B¥¹—grùT—3Æþu©Z²Vê†Ì‚F3Z„ä')ûƒÁÀ>èRã‹>’ÙeÇÐ-Þ²S¼_‰à .UuÿÆsº{Ϭè4ðð¾ÐR]ÕuÇW"`QÕ/X¬zƒ¿ám‡•ÕŒKÜîÕþ¼ü°7iª^ p„ Ö®%J^²Aãp£-µz´·ÈÊ_½-N*Všù¹˜Âvz¦u ëYù”°ã8¯×Çù6Ÿë¯m’sׄ NåųàÈ̽ꎉÞsmÖó¹%JöÞ ;ÌGû¥‘¯õeîGÀÔê{Î=§^¯½Ð ¹ÛÜU1Ý}qcî„MÓÆëó:ƒE•W²±å­½ÛÃ`…”p3³¬”^¢x_z ·AUÿ…õÿúúcퟹѻŽã-ݯoïú‡´÷eðcœ]ÙóíÇçÓ¶p€3b>_M9Å«÷¨>ÁQdzlG‡7ëÏþGžDŒ?êôpí{Do¶aŠacü¹e·®—P]û ØPŒçyüB9}¦6?çg½ñq™ÒÊôùýö•yÖûÈBISÃJ…g.“MÖìl÷¸œÅ›2ÖŸÖ0ùdÏ•Kéýä9΃A¼6¢XÏC´¬RßÂdb³¯ªI ßñ’Õz0׎êÜÜö¸žGẍxv=; äqå÷ãÍ9¼³±_®\M‰·Äcp½áÇz=ýx\ s9/íB~s?ŒT"w‹eLËö4²o{x^-F-–¦ Õò*&Üêå‡|Z½ªÛ†O¢Il_ŸèUá# ;<¬Å¾%…’4g0+•åP°»P˜öþ§?ÝMÒ»|š›ãÙŸêáñ¸v#£QÍösŒY‘ƶ*Iï‰9[»^¯Kynô¾Y¶T‹"¨Š]¡àsÇIZžª†²FY¨Ú…[¶b$Ô=3©û`ŒlAmc:¨gmD#†/‹Šr›ª:†ÝçË$£o/"t‚ÊZ’I¶ÃîÛêhV™RšÑ^Cüø ?«а*¡ú(CÖ–­„Ý-Ðdç¨ÌÒã¶43U[ÉŽXÒ…vâ\,º[î†~Ÿ¦Ü½¥ÎìnÒª'ÍuË›l§:ÁÓªà¶è­¾RsD·(Ùêi–™IS“ŒN¸›|[¾Ievž¢}æïbhò h^¹«ªïس/˜Xž-V9‚ôZûu4OrnŸ²C 5 Gœ©Î’ùxéb_Ù Ò»ÝìÜ}Ópy;†Ì M¾mûð\ ÂŒYæ%Hjk  g­Ü¯ÌƒóœsZàµÃæên*iT©ŠTŸº#q_{§ó]Ö[×5=ÁîÚ¯Çû÷_×6Bifcïê:ÂüÕÑàÞùzî=èî{Ÿøþ£Šó~kVøÊ¤ä4M­L?Þþï¸þÄŸ?>NªŒyu®îÌÃÔy!eƒ@—yŸÇ°î¼”É~Y5v»v0îièéÛð©vŸ+ím>vp)ËdÕÄœ&ùaÿ†Ê±êιM®ó˜¥_áòñتí¦a66jÄ2nõã@ôzýç0Ê­‡#þ±öaq$ ˆðî¡7ß¡çÇ£ðqr½} ëXa"Ï¡×s_eñxû~½¶gÀÆßÕ‰¼Ð !-ø)vŒ¡ˆ_òñjg™ m0`> K¥ýñaovìz :©=ÜhTÄgø[>Möãï5οîõ:¾Mò'=*³v ›»Ï Ä Ë†þöçgFØb3Þ¹GuV°Þš³vaF¼[ûçªj»Êøh<Ú¶:-ë‹);RöÿQCüÿ©?äánˆ¾¬Ê…¡¿ët­j_0»y_wûÓ{g¥¦G˜íuÓ*+汯ÌÖ²°ŒÇñÎÍÏNSÜSØŸN»t£b˜‹Ê‡¯ÏL~¸²K¯oW¿žãµô—i}½¾ÿþÌ1"„Ë ïžÆå!òS±œOöš*õXèê¤ÒÆ,ôæ«Ñ„¡6ç=ûúdupÊÍ’*É~ÞR¹4·éÏ f¬Ñâ®Èõõm|bÿêÆ¨ªªê®ë„ÔaDï'Eµðå%–TlAqçA„¹(»}5»»¥FD€hÍ‘rµ5ÞàM+H†ÏõŒ®1Æ—ÿÜMn&–Z*s‹0Á·6TM¹.´Œ€ÅMBéVßRU©æœÝw`Û—g5"V‰ä˜Þ­†¶¹ýôüúx?„K‚6Ú»Dþe iÙ&¬Ü7c.yÃĬõê4ó2¥ÃL=€cè{ø!5!6ðöö¶ºžŸ¹VÅü~œ«>ªÄqøðZÙf„5©½¯"†ùlCk+w˜Üjœ?»ïûú:UÝP«Ù!ÒïÇiS{­Ï_æüþ6þfþ>í[dx æµn¹ »ÚÍ2۪贔ÓÏãíÛßæþþïÿÇçëï?\W]¥ˆaŒk=iró-Õ›DÍq5ŒÝEºíúÞ2¥ ‹öR6##*Kµ¯F KY¤cÖ@µr]¯^†ÃdÓç´Ñ•¾ÑOÛöãï¬[4e­Q0q6ƒMšOûë½+Zo­ôá•BÂñ·çî k3j¹¶kí+³9Ï~­W£QoÑÀ­c ‘Y(¬×ÒÚ=ûä¹Íä¼E¦™éb‚å¶µ¦ÍuUó‰YöÝ„Ÿßç¹®«RÉmÇ´Ã÷ú‚;ã0ÄõYàá mv™Ç‰î=tõ®‚†ù~-|í=Ì#b_»*j cÄ^O 6°ZÁ›?n}Ó H’¿®žôùÒ\R½ññùô1=o®&¤ð’¡jVÛ8ªðDþñó£Ùpù‹£à×<øÇ§¸ºwk ­ž¤\ |¡ÿõIü__.Õqެ'¼²^'ƒócõ6ó ›F¸¶gÓ-ž#Ñ8”ãÝË•Âàjšœ.LýÞÇÊíP¡ŒÔµ#ñ áæ* P[ÑÑÖVÖź®‹K4«  ¤%Q,«òälÑ=ìWÖ³)ç`#¸ŸKsLÝÎuú¾2$o»íó$™°ˆlùxfªtµµ8`ˆÞôy`Î_Ȩ €a ¶Yh˜¼ußú+ ÙMK?÷ì9DÂvCF…÷¤áÅ»,:9"!•ÑeËAÄÝž6[§üv ’Á{rß KBÃéòæl¼j™w÷Ëüž¹ô0#áô‰¯C—o#ª@Im€Ù­W£!µ·Â^…y¼ “æ “Œ°n}%b!EPÝá÷N߀ΪNfb€}oÐÉ¿~ÿµ–›Ùëu6‹€alÝ3k‘ƒ_Π¾éìêî63/h_릕°¥°¯U®±3çð«arKZƒ°ÌÄ÷ÛtРÖj&i»™™;Í5º+ƒÃT† ¶ÜÝàbÃ)ÝîYÂhôʺ…*î†n´v®²vóÛb ÁÊð¡4ÉhA+(«:“ãÀïL£[…ÆÔ(TKápïkÝFÓd.² º¶_¿í+Fµ[•t㽂¹7Ϫî;~Î…¦Õ F1@vfí¯Î Ü›G,!ï’ãvîèŸ3ÝvÔ°Z– ~:€~ñçó:Žä*Нúã÷Þ¹ G"¡ËxE_Æè`ЄN·fGÉZÖ2è¾oª“÷%#û MÒ· IDATb0þ+™ï–Ú,nÉ L γe½Öí”N]ë–¬¶öª"ݪÔYvÎN1{Þô`èw`€ £î:†"œ~\Ïýë?ž±;þí/ot/ÁjØøZ¶µÂí¶]Jw´Ó„Ûá´?æcé‰Ýµl#×¢Á ][]r3kûõºH‘rã°áÎN€% <&I«qi•IìahVIs“7Yk·³8z—5æ‹–¬é \¥+w;E(ˆ¥p3v‹PØ7›»´³ªÊǽkì6Â}^%KºRIGöBÛXöu]1}ΪÝÝh4Ù¤h"»ÍxØå›3Ík²eð_,äìÃuÊ c+K—cÁhÛânÌ뺸©Kãí(ëçõyÇî¼¼Íñ&Æ×.=kÄÛù­|æ«Ö>á7Ù°w1ª›§:Kk]?·¿1Æ VV¸ Í}G1¶úq&Sq½žã˜’]™´‘Â<¸÷Š£Ù¯Ãß~r5 r¤>¸¥NA`J>²ÿl-ùÝÀÌdÓ ê_/T¨è§§áçqÔ&Òª]€húïÔ<ÚîÉí¬uÁ—úÚÍJ 37¹¯×‹:ÍŒŽõ0¸¼0l­¾^Vz;cVK)$·Ži9Ä3×⌠m[±pÒŠ\-˜±Õ4+ï-b4XÉ—÷q¼gê{û‰øªç§;ËüÈÙíF…Ù¦Nf]ã”Vg>S[«Óó,Ãr,/?Œ’³ÌN‡<@³_œLa¸®‡Ûm¼3ø Z=<’VYã™ß¦íé*î½aG—œ~+þúd[Ö;Y¹«ïþLÁ6¸(ØW%¡ª®UXáBÓ1Z# äê,b›uàÛÓ(P¢D—ºº†VD„À=aÕîfŽm”‡ «ÊŒÕe Íaµwï„?~©n•jß~SÜžpºœ«š­a^îÆW‰JÚ]fÆ–Š¨œãËq×J) ­~6`ð’.´ öܸÓ[ú‹§¶/Òº{ŒqK;«ŠòàlÞô9PÈT¾}ûãùãóºj8©öÛÝý{¯r?k@Ã,ÈÝ•î…Ý@é÷;,Y¾ä&•Lš·›E €fu7Ø7M¯ì_¹Á ôz­˜oÕU@mGíî3µÜcÞf&1 /jÀŒ>Á½÷ÃGIÍcÐìóùÃî´‡zÞRØcmÿí<~š¿vþýÿþyüÛ÷·ˆ©«ºûެ¾ý½‹Šl‘e4Ÿà·a~þÛbÿïÿ×ÿy]—ŸÝ鹿-TƒDøÀ‘Q¨Ñ²¡¶[dkY~™2ò~{•uúð{®·‹ÞÃFS–ƾ“Às­‰hñB/ œöª1H E$ån~õmp7cöœŽæ-î›*3°~E¹ÊJŸùi©2"ñÀû]£vã[B7¿¥$3«¬­:-L CeõÒÁ-+LCV+1“ê;×"÷,£âÚð‡oÚîÍù¾êÄy8?¯µG#õÁªÏʽµéÃÌÀmÕ몋:˪õ#ÝÍù\—ªÆÃhœ>ü¿Ö nwu©î€ä/¬Á¯?ÿŒ€³%½^¯¶c¾åºè´þ‚ñ»à“ )ÉpInh¥R‘ô\Qa6Ïì< /€ÎöÕ_ÎññóR©ÚáOà8O{ŸŸŸ¹J[&Ø¡®»Ëøïª?.ìŠ\ñ쿎○Ÿ„ëãhV?ðŠ|©âq^û1+^õèÙ“[==ãŠïïót³§ýzÙ²‘­çÛy¾Tî€y‹ÿø[çëá ¹Ñƒ|4Yf{pxiWX1Û™ þÉ×€Aòq‹èüü¸AÌcw÷x¥d󑌮ëä‹ËjÃú1?^uɲàÓæÏ© }·‚n~c².(«Z£¦™C“ ß»Ô-bªÌ Îg´Š|Zì3ÞŽ™ß«§½fneGzëªg0h+•1,ym]Ã}æèÉ‚çWœTuÔE+Ì…aèÇ@\Y{ œ›];½íß/¯É5ø«Êà'æÜó“…à’ìÎ|qzÑË –ì5˜ón^É`¨T‡žÒh|ëê…~Îlí#„Kƒ,uµ(óž 4Õð„)¤eµèã+Ò­;« b6@ß}ÇÖ ‡¦X[­Ã¦]ÙýÄø…þÿÐövKr,Ërž{DdVõ °Öæ–Œv(Š&éýßJF£txþÖ0Ó]™ẨYG2Ó/ö\†AwuWV„û÷EןÚëà·Inô«®{h-☋Zû:rÿ8'-Ûv†ØŽOTäáÅVd[í|²$ÌI~r("3!;·YÍG›“õëD˜Äˆ>dzefmA*šÑð†™Má÷ ïž9+zðÕ´Ð M:g³û2¿µ0@£0Ù4òÁQ­]2M«VÐ[{X¢¾ª@ÄûqÓ'Ž8Ø–‰&Ƭ0ÚŒ9±ºZ­[/ cVTs´$gíšæY9`4KµŒÃ˜Ÿ]ÛGàtÜ*礊ÑB·ïm1=¢ÕÝæVÀ+{xŒ­£8ž¨=Î{åæ{šA‹Â„œ=÷Þ6¸tù:N;’˾« Ÿ«¦ÞÞF;ÕæÖÆM•i®I¬}"q4Iš©Øò6åq¥wç|ÛµïV%Øt›Ö½ÐKUÎÎvÒƒ{QNá¼é±ÈUê'"H¸ìpsàEw³@f‡‘ñÄ—»®ÉyÕݪ̪CïJÑèfiËTj¦#¬%Ÿ‹5úóóùãŸ>ê÷÷oïö†µ–Jƒ~xZY7L§‡ÈNdÕ ºvÓ({LØÿñÿË¿þøõ·Ÿßeà´5Ï€¼m¯«,a&b—’¸²c³q„PWµ«·aŒ{ï_p¾aD+5('©ìò®xþøx.¨¥Ìì9^¯¦Ñ¡Ú¬o-cp÷•‚ªhÒ™©‘{†û„-Øo‹ Qzá÷xËýüØûŸ~þçûù1Vê³Z‰`9Âa´±Zh=‡8/%¬<Þê3Á1:ökýÓºáò`Ú;Ð?õ9òj+æ3;Æø;ž?ÊÿXÞÛûWçÛšøÃ¿Uðû}+^?ÇüšóŽáþ¹Ìú¥ÅyNÙ«³wÖÛñ-8תcôùz}º0ýì½·àc`ÚüùDu·Ö}¿|NÐè&Øã8Þv#èT¡êWw¿ùµKÕ~ÌVïnÎá±É½›ð£ý7¼X¹­NöˆòÓÞžõîö ÿáÒ€D_Ö‹’Ù(ÂÜ%VåÕŒÃÍ^ÏkÑ’ulKi…Ÿ#_O±5ô·KìA FŸ8¶)S¯OzŸtbõnÙÃKvk­ìoˆáRçjõKªâË2anhC 3¬9ºsw}¼QÆ2”VN3©J4˜ôaN3@{ 4³×œéŽÀ³8ÛsQ@R0ƒŸõööðzQpòë®cHvõ"\¼‰å®0ƺ›¢2Ù0xÀ&qOê%˜4jQMŠ -l‚n«´Õ×õô``@þ™×=mtd,Jrwf$'IWØxaW[×£±r;ÜÜeü°™Y“~§RÀ=þâôÕÕÁæÈ®çkÏ1Þ]÷ƒò)ØÝ[¦¼ý¥‚5³ûsÿÜ…;3±q_ó ãÈ"bâ ßÀä’”•€EÄÿµ>»E{»k.h1$ú¸oþpOƒØôtõqûÅ¿*μgícŒªmf¸c“&˜©tãhÃÑZl„[UY­Î=Ý-,¡•;áÏ1†Ïª}¿t¸½¾Ày¼Kªle›Y5šœŒ{;šTŠ»ö•ß»›Î&S‰.HNsZ˜¡Õ€VîŒü¡ÅµO·QÝ{§™Yxó : X8õj7UU­UH º%änbwA3«ûÐÆÒŒ}DxC]2Jw¥EЬ ™™¢ÖAÀÙ:o,5´‰mvÇ}PM«Ó–ªÙ†>LQ»l ³¿®: Ћ¸Åj ³¾ëÖz w(TÇ8{÷Çß~üª¿ýö#Ö†6’憸cÎn0g5‰c¼½¶‰kú†ïÿü—ã?þÿôëõÿøÏ¬§O3ú¬ÚÕÝía’°Ë|î¥\{Ú:a™'ÝE­6W ¿ÆÈ vÓ=ŒµöáæVàf+J†ô³l7¹{•Šf¡x T]—yמf‡Â1~+,x’2®¼Œýí^ìN„­n¿§}Ùo<¬7þP-ú”²æð•Y@Û4ü iÄcï2rÌžmo}þìÜ„ çbàÛÓ‚°ýL¥| ¥Âáî8*l›>T?¢'Þ| áÓ÷µÃv w…RnÖ0V¶½À¤Û°¡ªñæñºžöx/Øñ~^™hÑýý1¯ççïspÚ¶l×çóGÄû~Öqj£¶8>sš}xƒ4øîð6ŒGŒçÇÕ9Ï‘v®ÕâöãÔ¡¼¶Ð¨ïxÅ#\µ‘&ˆG;èÁ­ã©Y‘oìʬnpЦ•¥ÁÞÛ½ªAãýwíß>mtftcû?ü¶+ýó)ö 8µ;]0ØÛ|ø‘Ÿ¹óy}‡{¶y?iûzsBãÄØ]/74®ÔZB ÆÀ®ÓL-SÇ=]Ø©øñûxëu…ù=µ)¼qr™æwmåʤw´=èó86 ‡WîZW Üßû#¹Ò–¼ÍŸ²l;’b‘Ù©Í ì­®ãNÑ­u­kª EÁÌÇ„yÞåEÚ¥±3ÜÍ•Àr™¡½ŒÉªàEè&ˆóÿ§÷ªÂ¹KTGDwgæyž7!†­Õ("'öM¹Ûk¹ÿ ÷ûõïP/ ­!ûêªí 5Ð|]ÊyÓ‘›ef&ào7 ¼»ïV°$3»åÁ¢ÜØ¥{]åh Bµ7&uu›ùŒv• +U°Ý欻øu¸¼» 㦱Éy¦± YÕR|½e_ÄIæVj¹wªÔ€\2Àħ¡Õo»ÃP{¿EPzueÊî£ð=Õ1Ü;#³/;qwK%s‡†˜4&(¾dw–FaðJîf4³®f6Z©n¢¿"pКgÄò~íUZc™]¨;cmÝ%_ £úkM×ôšÎ(¼Z+Qìž  î\Ð-“°N<†¹-\«öß>~Ù1þcÀ¨{sv•ü+¶°2×ðI»¿]2×ø_ÿã×ùß~ý¨î:tyÌáî äÁ¸Ý[rb‹p!÷å~lsð¼óÒ ›ErÀ€ª*ŽHÖê…L[;ƒRmEB¦$6l±Å¤ ¦íHAð1”ÚÕUôßݦòzvin’˜5i… ›”¿Ç®ÊZíöG”;§9nv­ÌÔÕ—Ýw„ŒfMÏÍ+¥,kÑÖúîDå~Eü¥ÖAêŠ0ó^ëÕÕfGÇhO€¸5|¾ºïO\´ñˆåHÖ^=Àɯ軵Ûènæ6.YöU®„B( 4C’û*X2+Œˆ½+WŽ1nÄh@›ÿ=ù§xþÁø6ço™v­_oŸëÃÖy8]¡ds×ñ‰ñ»³ÁþáÇ?~ïù–ßžGÍsÉà¼cÕ@‰óÚE·czçÂ.ÒËÇBiÄ«ÓÍ‚’ˆ8âúõz{3¨m w™ ÂSXëûѽ³)ssèÀq²}uªÃbÿèMÎ#Á¶#¿ú´µÚ›`Á q¿®§Ï1çŒÊ¼#0¯ýoâ|³Ç€s¾^/9áv!Í»míÖ-×3 ·C½©ÞzµyRmñ–tã+¯*™)¢ÏÚÏC[}ÛìNŸ$®°-®Ê|7›î{箾ÅËe—°G‡k£Ú2Z,ŲËãK ƒiÈ+‡ÙåÅb”C6ùZW ¦þ2áÁmÝ¡Ð~G·—Ü=ÂÍ«¨òǵ>ö¾¦ç‰õÚl;˜Y¨:6ÌL¹¨{ È1<\ŸÏL+;%MЫРͲm“¹i”ÑÕPƒÛ3~>÷ÏŸëç“ÿóx{ûËèýƒ4è;Ö¦ªOÝ|ø:qu§;»©v(:ç··ß¼Ö¯ÏûøYsȱ*¬Û»¢× ëöÝ~õñ$š,½Œ5G«7ò›Ò­°BOØñªí©hìDóÇó¥ß¾•Ç3Ë­ý°µt·©Éz>C1-´Ô¯}j0!ìáú™Î†7aÞOÕRýÕaÈÆßÖ.v "¬ôÙx ½m­šŸ <ã%Y%«ø¢üê—½ê;{ï÷à1ƒ‰þé‡?ÍÃ|¿üÂQ”æ˜Û ç£.ËÏ'~ýĸ~ÿþíohŒtÃÞ?^ÐLT¯‡¿ËóÕªâëêÆÑC͆ž"Ñ%U÷±*V³ô{‰¯ëS4å$ÆÞ‹n@ï-aæ±}Ry© u g¢6ÌŸû‡éõó/||Ô3¾;Ì?iÏŠ~«þŒ3úg\‹ÝÀ|9{ï3båšÇ”>¥Ê_“5(;84!{ÂjþË{ÿ5>_xT|°^Îó÷¿ãùÃ÷jûÜO÷¡èWö.ÅŠnµÃ5ôZj½©Î|VðeµÑÓƒcü¬ëÃÖpkîJ½}ûfG¿ž×Àiè³ÖÙÛ¬"bêAZ˜÷î½wM 3ÍTaP%Ín¿c¬Ï§È;·#<Œf9œMª Ÿ`÷l `’VãÇÏ­V¹½ârÖû´;0ËUMÓ]ƒ2±MšØSé(Žý9Ç8ÇáîO®¼Ý£ä,u¾i›ê(í1Þ²suõ~¾Ç™Î°â(ÇÖn¯Æ`ªÞFDÒ´³#ì­-W…ƒih~v|Á=Pʪm9½ª.ÂweÞ[ Ó§3¤Q[ovÖZ}ü‡W-ˆÂܾÝ’7ܽªn§¼»C9èW¦[°Ä–1HIw¯jPnöö6…63©B›26ï<…ïîû/›™ßõ™Fá®Ê€2¶aM¹%ýëßiÕ~MxúÊÍúO§ÈRÉmå~åzŸ'î”åçŠ9ÌÙ­[‡Ö¤@kx ZÝÝýôtb‚Êr÷ß™íÏa&&Ùþ…¼òãåÓãR÷cZø–ž75.Z.œ© 1x¿H+wé:ÙÊ÷v­4ªG|™k(7€r>í¾ÚĽ¿ù4Ù뵯/FeîÐ#NƒI4 5¿t¶n¤ð…¢BK#Ž.¾:yWMhš0³ÎËÉŠú ÍVïµîÞ‘I˽ùes3}éï6$Sÿ~Ž9ø¹®?~(ë<ÏxäFŽN vWQÙ"ú®4Á ÓMYínï8FÚtüã¿þ["¬}àQX²ëdœôxBYÊ Ä“8ö×K{L÷ýjÊ*˜´®·sæd{#‹Mµx'cíB«SuœGVU¥»[7[^pºè”x“e£èìm¢S F™ó ÷Àð¢i5ÏÇÃë\ëÕUjuº‹´Š2'ØíyÛ9ÃcUÑFwH_+˼«á°Œû€aάPot·¥{T€¡G¡Ã¤¼^/º™O‹·Ä/kó¸>Ÿ&/ÃUé“Ü„íªê¼„1J¶û~ 9Yª;½N1D»šÝ<ŸÃHbGnt/`ÐM7Yàú8 ¶ÜJåÆiÝÈl3ªýÕÎÈ|ùqLœHŒÂ‡oѬçä;/uËæùw<X t5J·ÀÇL]ŸÁè~´ƒáö|^ÏÃí¢#àÈ0Úžu]sº›Ñ™ª½ë˜ß]¾÷ß8,[×ÛôñЯ§¢0äf“ã!ß™x›½_Ú ˆ²ÉG‡?÷>Pu™5Æ3×ú|}×ÔÁ»Xª{k™¢E䳃ÃÁ·MÁjg Ö1Kq™V—ªß|ÐNGQò½‚ŒÞwd‚GŒÌeV¡2“°ÎÉ®2WŒáaÏýrÜ=Ar7oÍ…«j;Ìb˜kW¨Q‘ùwòaß&"8Z}ä€ê~Ex¸.4[í·7 ýÆ;k„ÛÍ4r·BŠò;,k‚âÕõ‚Çð " IDATeõQýæñ¼ŠY]™É‡Œ/+7   —!¬ÜÒ,ün®“n,¡a†2K†pwšcé¶ØÓã3;ÆÜyy ‰T'>àæ²þ¼µ³’”ôcx_ ƒ{Ü{++ªDRèª6CÄkó^bß­ž¢L2„TOèæ7?gs ü¶úÑL®¥Eë1†–ž{S0kÆÿ›ôž²NEø1Gï$àâ’>×ËŒgøít¥ð¬[elèò»=kÖÖªÚd»ê’p*Û¯5ÄÓ†ˆ„ÚPné^nàèÆ¥vqÖ=‰BReX†n¸›ÑÄ}tš±wVa£}„ÃŒNÙ=+i2+ëëf!ßb6)íNÂ7Z…¾oîf6oïReíä¸5Åi;ì>-We¦Ú’$ädQàà£é Oíè’Éb‹j¡ Ë!CwXÓÍ xQȪÚÝfá!»%ƒNMåõd C°aöÆW…øåhEÕý~ØGq7Áqº¤ª/< šyÃ8RP©+¤ŒVVßölš‘(Um¡U`³³4|lhW‚æNt‡Áî¯"€§Á©Mr2ºRT›-©MݵÁӘؿýøy|¾f,á¡Wnp¸¿ÈÒ]ÆNÏkÝSCçÛ£ÿöã/ïßÿ÷ÿøŸ>>×Ç«Òܸl…ˆ\¼³\*ë,‚V ḳ-ä~}vÇ»eD­ë}ø«³T_M“õ•—ˆˆÈÌú**F/NÑt|¾“í¢ËŒ¶z§ÊO·ÝÁp„¡“ÊiUî×ë:ícl¾ZLC=h-ŠL1eW¦rÆ›lôît*ɘÇñºöôéé¯Ï:– ÑÃ| !0­MÊ‚V¶aò2âjõpl±²¯U0ôôW—clÌ«¶ÁlïAžÚ ,0ÌŸÚLóüì›lñ±V+®:†IŒ ¢Kûªmé‡Å·__z9ù}¸íÕáO-I ùlâ×µ>Œ ;ÍÖê#ܯžÇa GL<¯kû~®«c^@ÚÛòÞ§Ÿ!u÷OG|Çòƒ•!ŒÌ#?Šëµÿ(N{;ÚßM®#®Üû³£“]©óüÖ„€Y!E5™•µRß °õtC†¹z€ðáÙ¯¦Úº}˜ð‘>ìdo#Ÿµ1¢º[¡{º·÷ E#ÚÁðT§)Æù°Ú±ô}c.ojó&ç›­+OÙ½` fPµq]Iz¸jÖ2¶¾žóÌÅ{#@â2nÖreæ4ôöeËMÛØ²¬NsËÚ¹ú3ÊýÓzµ›]¸†ÌåžrDw5±<'M”Ô1ºKÆÌìÒ«>€ÑÄ9Ž×ëUfÏêyûM tsµî6ÉWCÂo£;Ä^j‰îVRÁþ4ߤ4Ôn0`!º†ÉtÁNÔðÝeÞ¸Ú'"¯ã`7wéªÕ²T“d‹f3F)+l£4ÄC6‰.ªo5€Y9—]¨BEvC% ÓK­kÉ'<^Ýff0&ÆB›;CÅVøb“•üÌ1ÇcÌcÔ¾½.æîFëèîž2`š¬W¹9‡Zû§]Æ#.™µðƒ°T˜n«/‚aá¦Éè.3Ó×Ye¡½i`×6,õ;_†!ì{pWâž~ªºÊÛÍ6lg]šÇÇØ¡!N6Ô^8–«ÚîloóÇ/è7 ©e0¿c©§í]]»ÓÚ#Ì\ji¥f!ʼ-è»2!Òo?cîm~·›êQ†B ¤y}ùin31ho¦ël›V©ÿë¿~Ìñ<ÏùÛ÷·s¦E6®ðG¸ËâZËF¤ÐwPúÊÃÇú¹ßü½wþ—ßþ²Óó¯ýþ·ÿþy½Â(„öìî¼êðgï‘{~î^È<³´HåPY5{èg]šÝµÕ~Ëþ„R»v·Û4}©V’ž¨xØ•ù(Ì­ǯÑ%ʧ9|ÆDÇ•åBO_Þ ©u}{{¯ÒU[‘Wÿ[ЈA73¥Ðu¡^¼úŒvìâˆM›¿©TØy¤9†*œ6ŠÊw×/<}">ÜÖ 92W¥¢Ì«]bI×DzõÒ*íÛliˆÞ†mGþ†®±°Ë&ÌRó¨a1lfa}VdíŽxxLJz7 DŠUÂ.¼8Õæã±k×ùáE¯õô?·åÛ«g´Æ7ë8¯¥Šs®Þ45¦ = |1âñ¦çSýˆó|ò§ }ô¢½×öaÑÕHCÏãããc¾1ßñx}þ:¾ý%®ó|µ‰#yqÖÇúq¾öÇü€ü?¦«x›}ïrZáe|<"/cÕNÕ±V}{Œá¶êzm"VÃ}W~0¥²ÓŒlˆþXkçõqM1ÖVÖùûܬd JC +zµ(dÕ( ¼E§"¢«üüiosžG8ÇóÙÚ¢ÓaÄI{íšî!Œ†uAÈVoÁ¼£ÓºÜP1ÓÃBYæ”uuËØe?ÈRg¸õ–T¦»h:¦Æ4C^›ì3 Œ¡fÇàR“`ˆ!Þ–±„àØU Iµ»Q ͯçë³b#°š¦"¯®' ptmñž2;à» 0í>FDØÉÍÜìNÎßÏe/‡©0£¹ÀzáÆÂ>ï§ÍíVüjà ’zu‚ü-Ä&tw–Ò`·é2ºU Ù ›]÷¦Éû×’¸ÓFº š¹Än T) f L¦p__u {/ÓÝMn™ÑŒ £¾Ê$ rµˆÑJ  S­qªKý'&;‰º %îÖËFLà–áY«å¨*ý{uöÃ’÷‹g…ÕôæT·Hÿ2âIÕ¬¾}rW·!MÑwÏ‚^÷p¨!µho ¯d’WäjÒˆ¾†ƒ4 HÖDª”àŒÕ»ˆkïpFÓ…®RªH š”BÀqçvÝ! Àæp[™k:€d#Œ u¨îO¿Š"%ûÒ%‹t¶G¨Ú{ïÛ×Ê?;x_GÈ›5V=æìnu7È1›Ý}¿·RÓdÙæ÷l€Ùqõãµ+O"©–ʇPj9¤åv@½TM6aðCdøò˜IjÝ‹ØyS\%k5hMÜT³Û‹{_¢rñK*LrF¢ì øûÿûq#cg®®è¯ ‚ÝŠ"£ß£¹&L[Ëò/7QÛ¤.ý:cÃ6ÔÕ4Ø-{QCƒlÉî’­™ûHÚÓ¯¿]Ï?Öó²ú½osºWá"é>æá«¶»ìeõ€™% 0‹É½ÇÔ?üÇßÿøÉ¿ýøÌÝ_ËN¸ ¼Ö%Vþu’DAkÆîg§±šøè’*Uv[iÔðîðëjdÂ}ZX`_)}®ó(-3kx‰l& ع†‡¡z@le©joŸ¯-)ŽÖ]Ìjúï‘%·¬½Ak372# 6¶Ú j _DGƒn¯A·»m2lCwSº3¯-è.ZQ†@†Aw„i¿*<2ÕÕ†{ÁÜüõ|>Ç<ü˜Ó/ÀÔÅBªµ;Ç|¬¬›Ý™=÷ÞG28âêW¤•W3,KÚ…,Ã-.unŽ{’Ì*ô3¡¹¯ë·&Xye—±,†!+hÙ9â\M2ÎxûùÇ¿Ä#`]½–™kõûû»ÚÖÞj”StMÞ¨k³C²ýl>þžü·Önn±œfå4<ÜÒ;Mµ[3Ž£¿ÙsW€(ìÞ ^5ãërœÁPÖ5‡«?Upž#ŽÃç¶ëU@ ¥uª«¶jœQÛS½iÜ&„HßÅp˜Åw½e¦]5ÆX=£í:Ò6{u%ULØõÈÚ¶z¸ïik"ã´ÎÏ-lDWzÖ>†Q:uwaÃm¨7u"ìC¯…1o.át²j G‡ÝÂL'ÜÒ)òBI-¡£kÅî·#œMÀ>ņ_ ¤b׋sz­{ƒÍcú:ÿ 6”z±I¹ã±‚)„ (a½rr„) ÔöaMÿx]9fvEÛ[Dßá?Ü··z?gö¶cw¢ËÝR¨ÙgU;¦ËeºSŸX~ÿ¡>šñ%8Q´Ürõ–¸ïXÕ¸‰Ú ¿1…U§ÚîÿO{÷«[~Ö‡ýû\~¿õ¾ûœ3¶Ç3gÜ’©ª*Q¹5QŵMv0”bC`l.ŽÒથMKUµ *½¨ 7…¶`B*ÌEA¥ÅMTšTås© •“ቱ=cÏxÆ3çìý¾kýžçùöµg0æŒç ˆßGGgfïóžõ®½Ï~×û¬ßï¹P¢‚L15­ê AYªUR{OUJ1ö ¯góL±Å€ªª&ÊRSj‘¡sÛ¯ø(©"ÑJIÙ;LîÑÏþnšjfU÷N±½³¶Hd”du5Ub¸n<‹½“€tÑ.öl¥­0ª³ôº)(,E¹±j¯bP Ê8*,j$iKËm QÝs4ö\&º÷î¿ÎØ;Z–›ï%¶}O\Ùb“"F,îUtˆš'¸¯!EV«ëTLo„ P[¬bÚTÍ,ÖÄÝÇÈ1†š4û´¤ªÚ³}Î ISÍŠ½}±êuÜf¶Ï—gUeìQ}϶¡ÈÒ®*墟2÷C« &MI+5A°f‚±27‚m%ÎëöæJ &…ªº™UØ‹MEªhA}okª (›¸N²éb¹g…üv{æ¬÷×Ì•MM ×ëë:],!å¢V{§ÚëÂǽÂPu@O@RjØRHí? „PöüÀö‚jPu!…å*â‰Û§óʺXî»8$Îîž5¼5%Ìd»\›6Ý;Wìý Üyq¡¦·ºùÇžºS# ZR”òCŒ2JmË€góM&W1méFÍLñc¢06U9häEmμò!M@(Ï¢î íHµ²°nqN¨$”Uâ‹‹XÁ*›ÀbãÛÒ4 c_!saWÌz_.$+ã¼®+šQ˜.P97lZƒ®ÅÔHnãpëÆ©*kÏØ"‰eY„cßÙµÖ¨kaŒ±‰ìRUYÄÖA¡D)¦ðâÁrÛ¶p“[ë¥Á•)²—F ÷à¶£¤2K³–¬½z€,-e4íK’)„¶cïµ]º·!+0¢ ÛÞò”7WY\,÷>³¦ÃPVÍý¼ž]¼™Íúñ°Þ¾sÑ—så 4ï a–BXØÖ„˜ra˱j…1Z[" óiÀ9Ðìú†j]‘ Ym­o>F>Wƒÿ{ôüâË’=Iëâ°˜”¦ä¶m|Ò²á¼Y³XZócÕxlý~=LNÛ:év¿b´epi‘u‚¾Üû`ŽªŠUKÕ/ ˆUÏ«f®£i[Ö¶´¶æÚé"bjr]î/‡KÛ`›^„lyPœÖA½á'ª•,LEزŽ ÃÛacœ1FÔ­<¸rV±@nù8Wã%•Ù%Gm’ý¤.Jkq«Uɶ-žÏÄYZc"Ó›Þ¬[1LNÜÛH¢7^xŒ|fåÒÕœ•Cx̺2ºÁ uKQ–Wê *Í 9´ƒdÞ(ŠWIÃzÛ²ZUÇpq¦©–·³9”4ÄžèžÖ‡rbˆJj‰+Muqv›U*líPºÆ¾Ë57n©n‹TÊ6º«©o‘"ˆÍ>–f(.d£á8B[ÁO±¤,â×o*{¾`©ÙÍ4Ù)¹_D7••BáA«WZQ¨£ra1Ê’÷—ä–á~j©CTl¦!ðQøSÆjQpMš…ù¥h+ÕÈ&ìJC ÅZû~¿º1R„ª’¶•J¨È `i‚RÏ)¹7!¸´“BŒâ²÷a´o)DtD”ªAš kÚ%ieÅý¢#Ý%+°îÜ[{›z±½oôõÀ¼c‰‹i‰eu5$o\\œ·mDè±µÖTD£T}5U¡›ë8¯*ÙFAàEZDB÷7~ìàY¸Œ®VYU‰ýnNtDÉ¢AÍ´”Tk0Ååzç|y»P½BcoŠ&ÐE…ë Å(RDèZ›îM/Ö\{÷&®±ÿ„©šèž€cd°%Ç>  A‘ÂØz@ míX溤œOi”ƒ4OMÆÞ²M(&e ƒa…ZÉ*-²—y°LÀu´ÒV^~†î]ÙHÖ"@eÙ*bØç ˆª4"Y£©DF35ÕÌdæVÙZó¥dͬp!åEª‹·Ñ‹26Ó¤Z‰gÓ‚6ASj(ŠªûøD QBÎ5"7wߗס”u¶e¹º³}ðcOô'—W=ôéÇÉ+ÙÎÇò¶YkËÓUïÌd%)"I§µJÕ1n–¶,ýÖ¢[]^žÎë8ESaÁõpô¥ ¶q榤Vëy0 k+3!TÙeŒ ;xŠFÇêz[W·Ø¿Ba5…Ô¦Z…ÑEG£–R«î¹>åÚǶ‰¶û×ã€>½ÞÙò(0áØÁ¢p‹KÒE[÷\¹w|QA–j¹ Lzƥݷ˜\×û·—oèi Ä·8¨ƒ¦ó^Üd•KÊeÓ2ï©Ëà*X!àQ¨¦Ù}¿ÉÌ,<£ëj:Fº…û2 Êú²$Å&ÝO å…Ь]VŽD_ÏxúF_2}€Ò¹YtzJ­sŠXD îƒ*3ª“X’¥V9bSGÄZç¸ï¾W½ž¹}Ž[7Îm%.Oð‹ÓºBÕÚqq³f‘™ëp'€CïÛ¶V­(,úò<ãb°ܘÃ{rTØÆj-ÛòbΟ+ßDû`] TB5ûbHX³Bimi‹¬cœÆP”Eï=x»xƆR² IB7)S±  tÑE} ®ô&(wk¦Zc¨ 7Íýžšb¶·§+ŒÁJAká8iQ± .½xŽÐnVÕ¤i ŠØ¹p%v>´ÙFÖ"¡{¥äºlÓ\%öAO-¸”Õ+ÛHuÕ¦®Ù3¢+²ˆ XEbPÌV&z1š Å ˆU„³-Õ4tOž×ÒVe¬¤_û=³Œm½hM!'–\— R“@)yÕT¢© ¤Ù¨(A9šŠ¹è‰}¢®nëzuôûJ#ÄÝ…š‘‹jY‹ )–ñTi„Á–TÉôd!¥qK*$˜Í|oeÕÅ.#µ¤Å^I!"I¨j%q=²ÕU!šîKÁIʹù(IóÌÜkhÌ2¢$UÂ$#Ï¢·šTU²D*+AÁ·Š­ª5¯2«UlµäD•z«LsS–)¡U{ßÕæd`¥ÓR0Š)–*È>ÿ·@)ÓfT¥œ-¡d¢VSÕÏLWkîµ¹šµÛ릪# ¦â¤Â, {1G]o”ˆbŸV,° މšWÉ>Ð}ŠÆs…Bk^Š-£M­Xd!˜ÌQQÍŠÙ>ì×½åJ@(4"iR…uݼ·­"Né‹cŸ VìÝ ˆLì? ¨^/k°xݲ"ÒZ+ÔV«P’HqEĪ*û*©ª\OÝ3I–‰ˆ`Ø>½X º'] A%{7{dUTŠi•Àm¡¢a ‚PDÓsD šŠ hÖY™UiæT&†p_S¨Üç'© ¹÷rÅþ)""KYbŸ0hÒ´o¹e˜ì;QT-$Á}ô û\Á^U™yÝT03¢J<* ÌŒu´ÝösÙ+ç©”g2⢙儊ûÌž½XÉÂU$´/nB¤xúiœ>~õŒ?å/כNj¾!‹,&‰½z« öÉ;ú%ÃÅ]-ó¶½.ñÔW KñÐvB¦–KR4æ^4V%…Ær©ö’_°\dfªP{éWŠè>S¢bÿqÉ,©ëa€nm,&R”J72Ó¯0"–’P «“²´Úž®¾WKI‘LÒ¡¦DD™‰ˆÆà²4¹äªe&ôÐÚ i”BP©îýÍ ÔŽ5¶å`<Åö.dm…€ÁT»yVÈHÕ­X T‰ä^ÃÕ =DJ5EËU|E a©µfåè‘*5ÀKÖ¹ŽÇž#Z-}­%æ§•­7i¾Ö°ëuQ^_ U¨Ø@i*¸zvžó6Pb (Ë &M"7m*"›šUle0W)1iE ¤wdFæXyï¤åå&èFíedl]ÑÌûEêÎ3Û‹t_ÛÁ¯Vûv½x¸sª(å ªn&8­ÇÞNç-Žý¨"uÞè¥ÀÁÛX±÷¬ÑÅzIE¥hˆë-¹± 9án® (ñíºMˆºÞ’%-º4Ð2C{ mÚ9ê*Ô›ÑÏj¦Þ` ƒ iD1j©…ô‚o§†››î_Y”¶ÈØh¡k" $úÅáÉGÊsTÂ’<¸0K€eéÔlfBDH‚Y² «#µ£l ¥Ïæ– öia]Æ·}ªûø_Ö¾³¦šŠ@tqU]cÝHnDˆhޱnÖlo3D¥Í¨-!ŒŠÌjfUNCk‡¾úøØ§?¾Ý¹ÿþ—=pëLݯGTU°ÄôÙ@2öJlc RC‰ª‹Ãñ°ôÓIŸ¾<3ki‹Žq(É’š EúžèfëP3‹,À iRd ÕƒiFäžTPä^ÿê{yÎÞåEtŸVEGyÒœ*3œOUw¯½<»U8$’ÚÞ•Yáp]ÉB¥‚Jîô­¥Ö”é7³‰8d™¨3#D!Ö\JJ˽4¬ÐR2ÐÙdl[ÈpÈP–ɲï¿jCíq¸@³@qãuÌ´„ˆ  Ú(XóQCª:ûHb/-Ëaé=c(ŒêÖ}­sin¤ÐM– ¨†êõD/ÀTŒ¢€r_N¨- Éa«RVÖÛ8õÅ·uܺõrU}êãO ­¼µË«grÏJ¿¸¹¸[ë\ÇY÷Y‡”Þ/Ô°f]°+¤FQ4XÞýr=¿ˆñÇ‚X¯ž©°¶,{=Ý`²|»sF]ZóVUÛy½Oätçj9Û±3¸·ŽÞ}ÁX3G£‘8 àí³»Y—bêqluŽu»©7Ì`ië:ˆvÞ\²îwß— ƒ9ˆ±Â®:âàPnDÕ•÷&<€tóÔý.èíj½lÔö®èWZ¡ztq;±Dµˆ+l©fÜ2OŒÐZ%†IWë­Ÿ¤®šHm L”â,D†s 4jkׯŠÌR¤–c ’% ùZMÅÎ%iÒ]›†Õ8bhåm‘!m#¹X«óYr°+TözЊÚßõU×.Ý)Œ1šœ´ ©éf}cdÕ‹šE$]UL»-ç±1èÞîXš DÔ{ÔRV‰:+ Qµ&è’×”d“"‰ó–Û¦fûèÌæm‹êÞL=·ÜsPªªí£=³€B¡²P<ªšK£r3 S%Ž9¨È\zDéBj¨m4’êл©ÇåU¡joŠU¤ššÆ),d2 YP‚F‚póQdXÑ`EV%­JÍh{úÖÞ¿¸ß%ye(!4T ‡ªZ¤UtÀ5{k#¼­± §t"¥u5CAÕ*¨â¦<=ÛÈ¡)dŸß¢ÈÜ“bÄ÷ΘZIfŠYŠPÔ©"û¹Î¥ êÞåÙŒYjŒå~¶ŽÁ‘Q [\HÁÈ4A1P`¤[s³ ²@QÏ`9ö»Ïˆ³eigອȳ=F®ßJ‹¥’n~ÚöÔŽ½pÕ\Åðl®CUã|†-Q +°/Úûdž}›– žEɽU?UÊA¬2³hîUФ£¹¸ú ªHDŠ•ÛžšèÙ{Læy½jpÉxO2²hš™$JUAVdjR¤\¶ÂʨÔÞZ§ï1OU^ç¶ò:é{&ϳ_/¸§4†Uöõ¤° «L ])Qêî* SE_±,û½}Û÷*ªªÒ•ˆLQ˜Ys¥!¶0ri@(nM¯ZݹºüÐcOìå7Ø'S«effš^·‹ÉÊ}L´ì*ÈŒ%ƒîöÐ+?­áÉ'o? lÇh‡TÐÄs@ª¬Ò^ÓÁܲT@ I"¶ ²ŒµlѽI8(dV³™](Y÷IDAT®êÜ;̈@JM÷áÌØg1”P5Ö3±¹¥»–Ö:ȤbŸüNŠâûÍÎÈXnf‘¤ªUVJ™8²ªÂ…J<›€§¾†RmD†¥œ´§Z/ۘ⊬$­¤ªÎ†h5ŒUe©\7p÷Â~6{]ƒP‹¹Õ@Ñ.šö’¾n›B6)TÜ”–×îS`¸qŽÕ ‡£±qÛNå§°CPí)ÎXM…µ‘(ˆ9ÕL]:D3YÓ¨Mn ÆF(2Ýë¹üÆc<ýÔÇ›7!t7ö%bƒò_¹êòò F%ÏY§ƒJæ–Õ­†5Ï@-ùÔ·m­¡Ö`Ç[Ï¡~Qâ«ó}• ´›/oëvgï ßml‰Þê¦ß9¯V÷¦›µ%ˆØÆRú}Ëm>½À:t9r«ÛqVÈÍå8Â×Ò-×Kã²ðFÓu_r8&íÐt=åS)K£1º3ö€ÐMëxTRâëèô›c…ºP³jeHžuàи°– /Æ`¢5 ÖæìD[/n>ª£»4Ú¢-@;hÓ¤.’%{SÎJ4ö0âÐX¬uÌ ¦)Fé'1TÊ—M—qv ü–¦®ŒÍôª„K¸”è–ªˆô3z®pf³½oõé¿Q™Ú<"„Òhb¾Ž-)ÛÕrªl­ÑÅèÙ:¸ÕèV+k$*[g‹æMÓ+,/¥*“î}¥"DÅÕ½ŒƒØbÛjCÉ×(qZ ÀŽCÂY)‘J3m'B+÷e!H®\²uxf–kUXX+ Ii„ó2®€VÐÖT‰•‘š¥*"Qj˜rÔVQd»½,úÒDÛ0ð¢ïÜÞ rUÂíÈ®Ô`…°l(´m"CW¦¸ÝÎBqß¶²‘’)C•#‡»G fI’xv\=¨ªUûeqɽ#¦‰¨jÎÃÁ×;g˦JKèvÌ–Ê2Wh‘Æu¥Ê>ëM‹*”*3BŠZ 2ˆ¹U–K€YeLpcÂL!Mt‹A’J#I–Š˜².Ò¶5ƽ-4q™)-4²²֓ܲB b•lr!Êsß²†Qmo…GáF"ÙÕLu‹@•‰8 ™¹´VUÖü,‘(À"Ò°Ô™zÑDõòê|ÃnF„ô2ßç9 8 Cü)hg)2}ð¸7^*BQnYµ÷Ú¯L1CÑí"ÎkF¶ÖD´TBôÎ6´ö¬læd¹B—ïk7·-šœÆùp8(PÛØPÒ<ÀE^ÖÍU‘"*R®ÕS¡^‚ÓØöÙÕ[?”(8l «dÖÒD 6ÆÐìbR)I÷%@ìÓ[ÈÊ,Qà m[âcñƒmB%¼©4s¤• xW…J ei¥I71—“€Ô*(hû|ÔHóÜ[Ž’KoÌW·û®¬_ãñ>ññfŸöéVofÖ ¹nZpQU†Ñ\dϼ¶’ƒj ó¼²?øÀC}ê¾ôÈ£w“ŠWjswšõÁ!”ŵñ²h9……j…áÕ‡Æ$÷>Þ{UAé𢷦ñ¥¥ÍDølüÁßè•”d%ªphÝ3-¹‘Á…ÚÛºR¤ŽV*Z{öFÖȸèÇæRU•$š¥bF­BT•‰ì[ ,ƒ…P`ªû|‘å¡QiûztÔõò8 ™µFQ €Ö<žkAí} d–¹¨9÷åc Ç{QlW«€D4‚‘×–à¢wMÕ´i Èx®ßë'ªÂžH ìÙ. øq¹s>)à­‰Š˜Ae CAT©–I  UJ¥H¼PšÁTQ4!™µ©Ûi¤›Jq]×ãáFì[sP{5;ÏÅ xkªFò¸½n]ui~pIq‚,Œ1ÆrpÏ"òT€ھЂ"S™P eF515då¾³·³S×4‘g»l)IUK†Å`ý°ŽŒ!B*•0€¦MIWêÀõö¹í©>ûVó~ôg‹‡±·ËÈÚ³9èµ·Ò½ ¹wÚ`šYbë7½k9œÇøÈgº©vÞèb*º÷»ESê¾ü ±oŒV^^»¹+3ÎâÃÅ_vÑŸ¸“fƤî¥="K_Fä^8_IƒfY™z«ÚF"¡ÒÜX’±Q Ú>D.…£"Õš™›«&Aí²0.÷ ÞÚ;⊋”‹Ví™Ò’*{?ú-È,kͨ.V×_ø Ät ©M•BÍ}œwJAµ„™°¢T¬[–Ž‘€™»ÖõÜËs?T™£jÕ4ƒµ5tìµNû&´¨Â±eXV–˜›oØÈ$D4ÐTÕ­gœÁYI ¡7jå]·ºàÕК[œ·vã`äB@ u ¡(QÑÜoq\]Y?fr1ñÌÕ<26mV[B\|¡¦”e%´™õ‘•'U½Ù}))v‘vÌ1öšK°’¢æfmdÁˆ±—¶‚¾˜õ·zÀÆAmJ¢BâÎètˆu^mP‹Ÿ n¡'?z“…ã̳£ÄšŽDyhîÇH©T‰Z.çqy.ŠªTCJ“Ãâí¼>sßÒÍô²Y–I*$[GyPlW ä¶ÜwÁÓÇ?w³›fæ±-¬àž¼É’1*š]T2 O3kÉAÈ8 ÖQ4¬fÖ›vâv?…&JVÉJ6Öé佉ÈUŽA(äàŽíúb @ÍDd;oíb5®–"Ub}PS|KK²ßfëʇªuw¯¸@ „B÷Fµ„Ö«Ž[ -£,K²¦ÝT2s…€Æ««ªu£ 4‘RšJ³\×Õ•QW_ök¥h%ÄV­”j D¶_³ïAÞ¾a!± T3{æ‹à˜ÔdX÷,ÏD€܀­œJ—ꥎªâ: àÆ‚@°*+¹ÉP³<ÈÇâdf‹êš«‹z%‹¢@¸{ÒDèÒ †²!bJÙ’µ÷c(ÀE˜¥‚¬|.þx®«½ªÖ>ß·È–h%¡ps‘Ü2´9ˆH¬(` bÍš‰Á¡EF‚,ÁpÙP­)÷þ÷Röé[æ–Å`ÙõàûÚ—¦QTw¥nUºˆÛH?Xqoނ܂5ãEgáT%ÛùF[D`MÖª$8âTýBºí—ïEÕ Q¤wÂ*†PJ”&‚}šïQÊ„**bkjmÏ.®V±UpU„(^§©ÔîmD{ß.O¨Õ¯®WʰO6âÂZkcîïÛ¸GE”û tˆwë™cÐ{ {’TÓ= ÕEPàÆÜ÷BÀ½åNEÆ©*ÖÜd[‡Ý¼á[®vyÙ¹2Ñ=eˆ„TníåæTc$«µÖzi쩪FuÉ”Pí{“…hsc‚YT)RŠ™¹¯Z‰IJE­Ä¡k“‹[ÕS¡d2‘µO%"†™‰¨"|.þ03·- MTEÒŒd€õØ÷óPæŠÌm¬é£6QÑC©i[.n_¥Ò×U(k_È.1X›á´v71ݶm¹8&k°Ö UGÙyœ¶2»½òâÐÒõé; ¾¼ïpe¥,qC¡´ç’µôÆm\%ÒR]©+š`d¢ÜÒÔrˆ.7S£DµRö.æb{¹™TOà´åm¡«;ËU=ó 5ÖýGÜ2Q”TU‘ê$D¡FE¦.ðR´Ôkä•YS—bq=3z̪;F©M=×5ö;Ó…©™co3 ”™¯çQU¾#Ï«žD ´²TÁÒ½4·¢§]kµÅTÞû¶IkýEŒ?Þ÷cëy=~š¦iš¦é·Ó—ú¦iš¦iúCgÆÓ4MÓ4Ýk3þ˜¦iš¦é^›ñÇ4MÓ4M÷ÚŒ?¦iš¦iº×fü1MÓ4MÓ½6ãiš¦išîµLÓ4MÓt¯Íøcš¦iš¦{mÆÓ4MÓ4Ýk3þ˜¦iš¦é^›ñÇ4MÓ4M÷ÚŒ?¦iš¦iº×fü1MÓ4MÓ½æÏëÑŸñÇ~Ï'"¼ÿ×^àA¦iúD/Ò svš¦Ïó‹?|ä±GïúÉÞóž÷Üõߦéwñ"½0ça§iz‘Ìý—iš¦išîµ»?þ»ÿàËÎüÇþŸºüµw?öË?zùÈO}õ›^à³>çó~Çß§iš¦išvw|Öç|Þ[¿á›_ÖÏìU÷=pË~蕾üðÿÍöÑ÷ýäßý[ÿùãÿèÝ÷þ/ÿÇçÿüÛß à½¿ô 3™¦é“ù›?øƒO>ùäK}Ó4ÝSÏ;ÿc÷Þ_ú…«÷ÿïâ±&ÚD¬½êU¯ëP‡¸˜‰ø3Ï<ýÌSºñЇÞûK¿ð©=ïišî±w¾ó>öäÇn\ÜødxàW~é—~é]ù'~â}×»~ø ¯ý[ÞòuîwyQš¦é–»_ÿ€ºúAžý¥~`k B`\Ž7ÎÏ|s fšî•̼¼¼|1Ž|:Æ6>þÉ=òÈ?½»#÷Þ}ôÑïç;¿úÏÍOÿôOjOû“¹¼¼ÌÌ{ó\Ó4ývw¼÷—~A ÒŽêGñ£´ã‚ì±Ècüò?ù¹wýêÏþÐ#ïy×åþ¯ýüÌõiº7^óÚ×}Ù›ÞüÑÇî3øÀ¾ø_òØcí>þøé[ÞñÖ·¾íSþÔ"òBþzfþê¯þêôWþã¿øÿí~ô£/äPo}ëÛþÒ·¼ãñÇŸØ?|ì±Ç¾ø_ò|à¹|ôñÇ¿ìMo~Ík_÷Bžeš¦â.—:?ës>ïgÿö+~xò±G.Ÿ~j"1¨Ý~â×ÿÈ«úôÁ:À»óÌg}ÎçÍdšîW¼âçó9#ܹsçÛ¿ý¿þïùÏ<óLïý|>Çw~çßû{ÿ±ÇûÌÏüÌ—úLgwîÜùÙŸû¹¯ýº·üë_ðoû7·Öîâ —WWïýå_~Ë×ýk^ó¯}Ó7~cïý™gžùÆoú¦?õ'ÿÔ;Þñ-7oÞ̈Ì|Å+^ñ)?ÿiš~î>ÿãüÁŸy쟾Ûí^yÿ'þу/ûÌxòca“rcÓt/eæüÀßüÑû±øÃ$—e‰ˆ?÷U_õá?/õÙý³=þøã?ô®wýìÏýÜ×}í×~Ñ}áÝä±Çû‘ùÑŸù™Ÿùëí¯©êO|ìûÉŸ|ï/ÿò¿ù¥_úÚ×¾æS{ÂÓ4=_w¿þñs?ñÛùòV|ðü‘_ÿÝ\~1×?¦éžÉÌoù–w<úØcÛ¶íŸÙ¶íÍ_þçóù¥=±ç¥ªyä‘¿úmßV¬7¼þõwwˆøÀ~ýÍ_þû·‚ä‡>ô¡ïþžïùñÿñ™ü1M/­°þñèÏõr§ßåadf²î³|LÓ=s:>üè£cŒOüä¬à€ª~Æg|ÆÛÞöÖ×½öµ/ðPçóùsS¶mûð£f柴–gš¦ÛÝ×¿ÄØ뺞~˯ÓÕí«;OÝyú£Ï<ùÁ§>òþ'ž|òeÿü¿2ë_¦éž¹yóæ›ßô¦W¿úÕÏ}ÆÝ~øá?@o·>øàŸùНøw~ÿ >nܸñðÃbYï«_ýê7¿éM7oÞ|Gž¦é…¸ûõÿâvžÖó‰¬ÜÖª‘±UÈO|äÚäæ+ÿ…¹þ1M÷Ò—ù›¿ækþüõíßþ‹¿ø‹?þ„ªþÿÃ÷þ?õSß÷}ßÿ¡}è÷s ÈÍ›7ÿÄÿãù?üËŸöàƒ/ðPîþÐC}õWÕ¼îu¯ßðàƒ|îç~î¿óŽw\^^þ/?ñŸŠó¦é.Ý}þÇÇ7¬ù'c½ëþæ˜ã7¹¸‘™ÿ1M÷ «Üwß}ÿé·~ëûßÿþÿò¯~ÛûÞ÷¾ÓéôÆ/þâ/úÂ/ü®ïþîw¿ûÝ/õ9þÌìá‡þæoúÆÏÿüÏáG{ðÁ^ÿú×ÃÛÞÖZÛ›«~ögö¿ÿïý»?ü0€ËËËý»4MÓKåî×?þ¿wë'>Äú¤9\_ý×÷ þâ¯ü‰»{–išž/wÿ£=ôÀì>üðÃßý]ßùýßÿÎ[·nh­ý…·¿ýßúʯüáþ‘—ô4“mÛ^õªW} ûŸ¾ö5¯yÓ›¾ì¹òÚ[·n½åë¾î«¾êÏ=÷€xà>ôÐíÛ·_øsMÓtwî~ýã{¿å_ÞN¿[òé÷¼ååoýßÿßÚrwO4MÓóòc?ú;ŸøÖ à¯xÅ×ý[žï‘×m33ÕOš4v<Ÿï1wo|ãÿé7¼áþûïÿg?ô÷æ·|u­µßòh­}ÿ÷ýOŸª§›¦é.ÜeüñK¿ðž¿ÿÝ_¹øÝv^€ïzÇg~÷ÿü¯üʯÜݳLÓôûÇ_xû7¿HGþÊ?ûg_¤#OÓôûÖ]Ö¿|ÎçýÉñßøïßþ7>òÏ}Éw¾ý{?úê7~ÇïøûC¯ýOÄæü—iš¦iš>ÁÝçø•ø^ÿïïúû?|ï/=÷øiš¦iš&ÜEüñž÷¼çÅ8iš^ˆé…9;MÓ‹äùÅ/p¾å4M/†é…9;MÓ‹çùżÿ×^¤ó˜¦é®½H/ÌyØiš^µFÁ;î£=t1\»’°u%…*ƯÍbÅ‹o.üë8üâ^´w…öâ&‡oW¬Z¢*f¹|Aqí’&ñ¼ÿ¨‡ÞãðÀóêèqUƒ§|îyë2מîqõêUövvÀ Ȫª°Æ¡|k;o®üë8œ¿ƒpu„i`s ¶ÏÌBÅwµ¹íô<¿öÇ35¨µÛþ®K'{ĵœ¬¿Ãìò.ß÷}§øâ§7ÙÛ®Þ\Ù7rƒð}¤”XkqZƒQDE|àÃ%_x8eпÑÝ¡W„ñÈtÜg%AsÄÞÿã|æS_%KË7õ w%ιoxõ£µ¦( {ä*÷¿ã.¢ö®¬CQ”$xq…) o¹§ÅÚÅm&Û>ÉäMPßð!ÖZ°vú·sX­)òœ+Ïk]Çih(ûȰâûqh9xÔ㋟þ"µÆIxÓòÞ$«›ú-¥œþÏd¸Âç>ý$ON¨7&x¦Ê"‹tL•;Qgûúu‚Zƒt @Š7ôfÕ9¡B©)°BÇ1ٺù —HJƒpu×ì¬k”’`}úͽýÌð_2ËR’$=¢¹U6.ú¬šàÊ…C6Q®MX_'ëÍ’í^#ˆcðÌ›‹z³Ü«¯‚ê¬ÅYûí“‹ÕÔš9WžŸ¥ÙҾډS™"/×ØÙ¯S§ôðBùæ‚Þ,€~ë¤Z Æ|Û$×;3ô6žd°¹ˆs†(.°®B†NãêwY¤ádftÒ|í¿)Ú€´‰³„µR døµ!5°Ûàe   "§ñâì:ˆ=°†Ð"ßÔ $=ê¶ •„x¡E…ò"öA8ðSÐBU‡ÁÈnûøù¤ª@:°CðJ„ ¡ôÁsàÿ5|вƒk`®‚P#ƒEÔhEAœÁH!ãP=jÕ(Ó»"{Šé]Á ØY0Mp¿|§¾â Ô·ANªß;Ñ&§Wv—Ðvñ^×+A×QÍ“ž£Ð#K·“ ¸´Dˆ:Κ®i9“!Æ-"ÍxÍ ìØPŒ‡(à…ÓàyëuÁ3ºtà…Î#LŒ“d~ØÂØ=¨_ÒCÆ]#´ú4.=σªŽËšÔbõH²‹Àüw#1:™@w’UkX} º $™‡© ÑR›¼¼ y îRÏâðÞN&´ë-’ÞIl Uå¨ ¨–¾«u]Ae¤f}LÐ¥ÈGÜÈ/Xˆ7IF+D* •*‚0ôIGCœÖBòÍŒÎB´ÉË€d¢óÔ Ãbjx!Î °5”ò1Ã>x¾;€§Y~ÖB›Q¯‰Ý=®è~Ü¥5ñbM¾;ü.R.ã·’í6ÞÌ.º¿DÞ8‡¶cjµa¸ÊPÇ`R¬úîyõ×Ôö¡“ /­AT§ßO‘ïÒ=¼ÆÙ·Å;±B¸ü"Ûך|鳊 3¤"†`÷ö9}Öã艘Fë Iö·<ÿÂs/D˜âa}‘4µˆ@ᜭB#ã+«!÷>p£gJ­Ø¿|’¿x´ÏõË‹¸ü Ö{”¦ÕîrÛí–ß•rñ|Ÿ?x†QÿN®~Çù‘åƒ?vœtŸú·{8!³T£!ÐÁ2Aøm~á½m5¿ýË ±ÔšÇø{ÿ]ÌìÜ>Ãü~X'›8®_:ǹ§šœ{Y‚»9AnoÀ\N7X¥=cneÀÏüƒìö¶xü+WY¿|7Hý­–xŒéP Ø¿´Ä7?Y#_£;÷ß+ï~gÅžûú&©(ñGÐzˆ­*Ðt^Æígo{{—ÑîþŸÑ£76|ÿú¼ÿÃðð·xé…Ž<Ú>ËûJ±ppÈÞúEZµc¸d–Ñî4ŸÓþŽó«Ê  :'=¾ùµW×[„õ%LÞCµ+>õî&a´†'$ÐÂk40EŽá.|ýþì)ø'¨·vxë})?ö“ŸÿÌ„o>>^yš_p{ô‡%Å.?ðÁ9ö‡×øÃßSíÞŠš{Š0ì@$AÎPU =RlJûÈâ©- •yŽ÷0ä¶S³l\š¡—9œ+¦Þ ÿªÅèGÍ1¿Ðç÷~mHåï‚w‚Ç¿(Xj¥ÜvºÇÆN—áÕãØî œi'é²·)9ò?T4º/là…ÇÈÓµLв¾±Nû¸óž®®ïSŒæÀŸCÊmʱå'~¦M³~•ÑØ'ôï¤ÈÏ5u'ºHµÊî+C¾žŽ´ÌÎ% f¾{ÊøõuÉ#âh!%"ºJg©à¹§+ªìõÅ£˜ÑÝd“ãàfÁ7h׃pŒ¬; [‘ç¡á¡š§ØØÐTzŸùù}4¯àôyL•ƒ0(O‚ ñüNûÌuºìnlƒ= ~ *Eš†Ôj’Ç8ÆÇTi——_è±q-@ê#×d<ÊÐÉ„¼Ø¾áô–¢Ó8L2ð9sf•ƒ‡‚ ©†#ÚË%«%Å~ “µªmÇv 'Br«Hò§Àßb¼7‹?U6×nRP+l§…Ï^d~n™çŸ–àfIÒ‡!#Ã1Dø¸¤C*WjËÊ3šƒòv:ñ)lYg¸£ñ*Ò·à¿JxgؘPuXœ=L•–„xcD˜’%ûèB2ÚJ¡ãË»qUŒVô(í&ޤ¶Ø»sÃém®m‚^á¥g*ʼ`yEQ«„Òî}°ÎÆÚû—Ž`t…•;ˆöaLYGgB„àV¡ŒñW—ˆ£[;øÌÁø=7ëI}%eYqÇ*Œ.<ϧküøÏ]æ—þIƒŸû…óœ½ÕÁhUÌÁÐ'Ž tb! I“]ðCu‰ûn·xÎç…µ-ˆNޱ®ÛAÚê´·Fhþâå«Ì­,ájë0¼Š%S2»¸ÊùójÍ€ Ü¦R@ÍQˆ=°ËHåQf†*qÀìçï2Ç&5¹ÂG?_ą̃ÛY 3į9î9-yìëu¶Ô±e,®ÚÇø!‘š°¯3„¨ ¤ÚÚc8Úæø}‹<¿¦)ü«7'¨¡t Ä6³«f–¯Î“_Süë•Ò»v‚‡~XsôŽlÑF´ +-ä ¸…~ÁÜïýéËìM¶yì³g ÷‘¡1Y¹#Ô_î1ê{|àC{4ã‚ÆS|ðï$dö"¯\P¤¦Fn¿ö ª*ÑGŠ˜ë×6I÷;ÜóФ?üc Ö.' ‡«½i>;%8u õh; ¹ãÔI~ü§¡·±ÍŸ’`“›ÓûµeNCh©µÃ$çÚºfóZF-éû^áÈñ\~~‚µ>˜¹ÏÌSîô¸íž‡>¼Æ‹ç}žøÂ1{×tÛ¸lh!ƒk븱áJo›çgàûÞ{œÓÿSŠ®WèaÈç?Úæåö`Þ‡Ñ7 Yn8¢6J$8'Ѓ-ž~ôgî½D÷Ð ‡hù¼¦¿_ÇâƒÐ¯ñBHŒ•œ¹3åð©ç_uq©àÅÇ磈Zý©=xóZq Ô,B¶)‹6››×ØÜ`}js1ƒÁ€ 8xhBÜÜ"-C3`@ٻƉƒ-þ³Ÿ¾ÌÅ«ð¹­ôæ L¡»U x"˜2-ÉáSËÜy&äÜ…M¾ñïŽS8Ÿ³÷e|øgêä…ãÒ% ‹#½Æ ;èâÚM  ŸYáíù©¿¿ˆ(Ö.ïcÓJ‚s81eÍœ‡Š—?Ìã_<͸…·Ý±Ã-g¶9yï"¿þ/î…ööÍg~ƒ eq&¢Êë„þ(Ô‚ëA>î0Óø^ ~¶‚ñ<oÙåoÿbÎSkþ£Y6>¸:\Å÷z bœõÒ[‚—ƒÜçï<ÎÌlÂÇþM›IBQÝÆãŸ?A¿Çíg¯»;ÿ „è£Ò#„gþ{û#^~z§&<ñhÎh‚lá>‹t'ÀIƒ‹Glô¯1”Ávq‰¯<òï>ïÓ9²Æ™wf7©£Ä,È&ÍxrZ3Gz ¸ [ò2!¨k²‘GÖo¡Z»àUÔƒÛøà‡}{Ž?ÿ³cŒ+X±ÅÑìrèãÌÌÔÐTvz_y/V Rjµ‚k뻨ö¬ºÄ(û•Üdœdœ\ù!:Átf&¯Óp lã”ÅWÀ»Â×ÕüÁï®ñø×w¦ü³ï!•›V; Áy`5R¼šFÖ‚ 0ÒqåÂAËñ·\¹9AÕ¥Ï4æÐìî ”EX 2¢æu Ñ^´Œ÷jHÛÄThÍꡌ™VŸßýMŸÚl€Ñ3à †|Â¥uôdBž@—%¤Æ8¢F› ˆ8~4ÆèX}œF{†¨ c÷ƒêy»[¯=a‘jÑ"¯zà{0[#ъѵÄà4Hq%ÖZ¤ðÁI0N¤Ã%s5Ð*šµE”„¯áw½® J/Æž™&@«¾J3šÒñUwäeÎþ¶¥Ñô!i@ÐæìÛ¤ȳ»è¯ïâ·v Ôm¿PlÌ¡\„dˆSÉ$aL€)ç_¼NU0œPoÄ^gã| Û{MhÍBëþÿ»vŸ†iQB{’6¶ÜøE%¡Mu‰§À9„4tKTÉÌè@ÓlLðGïò›ô¤&qÂðä«ãŒûÉG–^¦áÃþKˆô0?Uc( ¨$‘)X9–óÒ&ˆä2ÍfLTL¨‹ –êuê2„x‚Ù70‰øÿ· üÜ¿I=°¸¬‡*–9î0ã|ÿ‡7 é·ðd?ØB›}6·&|îãCÞþ®!ïž#øAÌúÆ}T²vñ6()÷¯¯ìòc?/XYÙcÿºC9ãSü—ÿsƒöás|ô7 ßKôÊÂLs¶¶bZÑàQïd°[0ìUøaE^5±&˜^JÐj­âû«LÆ)Nà$q´Ì pÇ÷çø½±šÃ”‡ØÚl²vNqõœGc:ëý°+¼œüÖùçÿ<¥>Hª)AþÚUQ„5:éƒ ð¼zl [ŠdüƒÔÒt‚›€÷Q&FÛ:žªã*á"‚¸††Ò¤ -;=¨¨’eœÚBH3M#0Šz}a“Éà‹H¯MžjæÈˆe QÁu”פÈg)‹ Õ)0Y •/šzîXà’jÛ°xzÄîÎ;<„j61Å‚:³83†}ˆÂ‚ÚBF¯o ºÒMjñ+¤ƒ3øµ 'ÆH©ðå ÉÄB9Âk(´wõ…WágU(ù¥ ÿû/w óÙ×÷¤†á"Ez™²º^A„_›#ðÚh=Fz+¨f‹°“ì^ƒªÀŸYAØe ИÖìx%U9BW;`3D1Qö–AÔaD8—€˜Cx¾G’$ C·¿Ki^:AûÍpmL’iüVLµI‹Æú f1Ù:XaˆÖÒ£,s\UPU¢»[ ›x3ÝhÔ¦N”BäA³KUF“}ˆ¨‚°9GÚÛ%𝰢O•¨¸4Vy¨†Cç7¡ù-F=d­‰ôcŒ'#ª$£OC˜’—Á¤¦€`|‡ÖÂà'PA¡3»SuB­1mªQÆ-DÜGÕ;h·s»SvI7ÁVx‘FOö }/“Â]`¼ì.ÃkA·š›%ûT“ÐBÆam‚­ºhm±fZêà\õï•òž_XÝ…8@ ÆdÓÓ,+((+P \a¨A9„ì2es¢%òžÙ†p*ÂÎÒ ˆ1¢&(*=%*nº;5NcE–¥^ì°@\«Aý¦jS–}0!8‡«àxQó@ˆ::¯C.É3¢1ÁkŒÑƒ ûSžÔö§°lƒî£Ù"Šï Ïzœƒ›G„5ü° ,<˜ÄàH7Gž `R@0•ÆÚ4#ÈiöèÛÂ/9åm%ÏC)E•lA5QŽ©(k8”—cª:~] Ë›8‚F›*4H*Œ“x!:÷Q^ £K(v †óäCþø&Õ_#+ê cˆcÂ(Á‰}ÊrB–—0T êˆ¸Àecð<¼š@O$Z[(zÈf›°U§Ò«dt g#‚™!X³‹XàHq¦…“M(¶ÉåÓûÐÍ@áÜåhÜ"q홹H>L¡Ö#˜Ø¢Ž®rDÃ#òjäy‰R )%άµcpZ£Ë¿cJ/haEMãc}˜ª¿q ‘+)%‡±D³ƒNC0>Æ*”ª!Pž£È4¤9´oBó+ôí¸Ü!ƒåçÉHÔÏùó e+ÁÅ JÖxßOÞËmoÿ„în¶ö6øÒggy¥\C›™ùN ç4Ø_ü'»Œ®GüÁ¿Z¦³ä3°×¡háËŠ,^Çœå§þÎNöù?ÿYÎ$¯Ómå#?÷<ÍZF­>OY€3cʱãk_®ñõg ¹™n›ÏüÞ˜Gø'{ÀP#Mß|Ügòç‚ÑuM{î}hÿÌQ>ûÑ/¿Ðƶ.㇒b°B1VÓb®€išÏŒ8u—ãþÛl­Ïðñ?iã…–ÛÞ"ø‘ÿbñ‡·ñü+Ãi¶ÇÔ¹tå2Ï>y’íõ5¢ú“<ðýðã?;ËÇÿvž»p*Ñ:Š$`ñÈ>‡d³?šo–¼º†0óÌ-ŸãÄ­ v÷ú&UJp•F£ÁÆå€/þÙ)\0ÁWgîòÖì1(rî•øîê™ÞÐÚ ç*liq•‚ÐCuªÒ4ØÙ8JwÙºt˜¯|úÂ&»ýE‚pAI±Õžþzm¶þ´$§ÏŽXœ‡O~2¥·[£?¨óÔc‹äEÅ©».P¯åµæN.\ºÀõ ÞÊxïýÜ,“ÉEî8{cFGZiµÜ÷CÊ<fPb'÷ñ´Ç]÷íÒj©²IÏoƒ ”Oê†l γç^äzo›¯=aHó·HjÁàfÍÒÜ 5†ÓƒlìALaòýÑu\X`U ³šÑÞ16¯jŽ˜¤¬NA`À_‡pLnëÞ³3°}µ‡sûD«cªÆéÑî<‹+%ù8†æœº€IëàMÐb‹x.¦*#v®6™éÞxQqdÙß:µMkÖGzõéýJÀÜÜ€3g}®_šxmÆé:RÔÚ]ò´@ˆ%¼V 3¹ü ö½¿m—jT}o‚ZUÕ´äÁµVkð£©BÞz`JSJÎ9‰®ÎI Ȳ!e:¢ÑhàÉú¯YóÙߘaçzÀ[ßi°eˆv— hr׊á®Çú•6Ê—8o²ÊQt±ºšæ ¦,žDJ‰ÓªƒïIP]š¡üUÛyTA«y`Ë&”l Š‹«»,®<÷\…VC´<¹½ e‹ª fAZÊj—½}Çâám²+!B–Ô£&õ™-®_xQ†ފзcm½5ï(R;Ú †Ç žyæÆ¼«–%“$ÄYŸg]à¶»šu@\§Ù‚[δyìËÂ"·c¢Pd$CA-X³‰ÞïAð TkÌÎU´Ûš—Ÿí"bù½ *a!-– ¬„¡c´;ô:óË»tÄ„[oYãÁ÷]$+B^úæ-Øô •VˆæÖTâ{89ÝO–ži±µãøÐ‡ët:í!o¹ß“¼ðõc¤}^§^D'ޏá›K»åI~âg5ãI/aõÆÔ6>š ái®œ7Œö·¿u›ˆ6o{ bc;çÒ…ÖŸPÉ1ŽùéÉD"eJÌ æ šæ8+Yî› νXRdÝ›4Ks£;ɯM{7yujµ#¤™»ÃÜÑùéf¢–±·s€ßû5Ãd7N2‡1ùü âf­÷©& z æ¸ðÍ.ž¼Èû~¤Éõ×QöãAÌ?ºÂ¥Wv¦:¨ú¢ÚÃ+;üâÿ²M«^‘Mæ™~åÿØ!hÜBÎ} ¼Ú“BosîéYÞòÞ«¼ôå·sß»®ðGÚC©ãŒ« ´ÂbÔ¯F³Q•GOŽù‡ÿô*E‘Q‹*lÖæKŸ[æÊ¥Z>߃ šr ~0½S¸Žj”]°—àWÿå.¢9æäÁÛ¹ëÞ!ÿ¿?ü­]ö÷—1Þ642(,Ù¨ "€ðË/³rüïÿ¡9^Úr|á7V.á‡~Þý‚½þ˜QyœÑþ&.ãjù—ÿl…(Øçö[Žpü-/ò ÿkOüzÁZÿFžÞ.-_²“ÉÔ½kh‡ œ¾ç¯¡ªù¨A3Z1!ß0ØZaÒ¿¯>ö -œ…fSÒíÖ§謆)-‹K5ó)ÛÃãªd¢gxâ«§øä¿Yäȉ£œyèåïMó«ü&"jx>Eš@‘Qy#(3h¤xÁ&½.ÉDQoOïP³Hé°å%œ; *„²A¢-n9¹ÀÖ•Aã‚€bX"Ó2ã·ßÅc\žžfkªƒÛ ˆÎ,õ™£ŒûçÉG)‡Vþ¿b³€dÜC6<ÀgþìFDS‚]h²DS¤€ñ ›-ŠAN:†LŒPÞíØÊ§ð Ôc^9ÿ‚UŽ®œàëdß{ à*\%(©M©¸°F£Þ ª´DÒÂSøÞ<™y´×g’Põe¯CÞsë\Å æ;gÙ³Ãx(˜ /#è`FG kDQb?z†.þâÉË´W ÂÆ&aûVÂÆCôw&,®ÔÙÞP’ìL *(Êu¤ßÁ³·aJÅìaÅÒê!.½rã8Õ v{/Sº |=Iñf}/BªSé ãr mG4ÐU !•ëáyWÐö˨Ù?ìn=ÏâòuœÛ¡¿ošßbwqê(åƒÑ=ühÂêJˆï\Ûü×\„{î^&n„\»èˆMá!xæ§þais~÷W+üh•<Ïyæé’3o¹•‡Þÿ2~T¼Í{ÞmjŠo<â1éu©b³œ£·ÌÓßnÒÛÛâÈ© ·ßeØŸÔxæ©“Àîw޳…#ˆÚˆñt0YŽÎ×¹6Ä à51ú¥í!Â:aý0Eß'¬ÍÔö±ÙIêb”f» VóÞ<Áõµ—ùÆWÛß› bºH/ĺ “±å«š¡IDATOU{QÛqÛíK>Ò¡9ßc<Þdýê„ÿ¾Ç•g%þÌ/œCGXÊ¢ TÓid;)D!ׯ[>ý‰ˆ»ÞvŒŸÿ¯süZD1˜å~ã’䪵Oº•«ÜýÖn·O¥·¨×šlowùÌÃWYÛ°pVǤ}jÁ]˜¤‡É ~³‹É%¨tŸ(^Á—+L†}*“O»ÅÄ‹Œ{-ϼÂ/>ÔÅx; Ö òžàÂó'ùÒ×ö²tÃMus‚Úzëb¨5ƒs‹Œ· ùLJ•mãª%¼F†³³Èò^ê3»$î¤KàÔ¤åÿý¿¶‰ãž¡Ã-ÄL‰4ŽgŸx…+OÏS©™Ý½N-^Ä9I¯£Vf0ãçùèx¸Ý[iÕî¤0=l0K’ a®Ù ÅØã÷~ûìo X<~Ÿjè¼>t·H//òðÇrâ¥+Øjhò¬ÁoýÊEl°B•ø bÕÀó^F—)™kAó˜™7T£¼:&‚`*.3" qE²˜jvJxñ´7P™OÀT`CY@ìãICå2P†Öë¢Åu*s©6þs@㫃WaËˤ.ÄŸíP‹I‡à"\Ïb¤F´[Œ²åÓŠ³  ð¶Š ^Ä G`ŽQˆj9{® núhݯàFôëðýÚ¢;ÁåûxU#5¥¿7ÕíÍX§èGg·àûxé2¹»Þxá”%ÈY•‚·@ÔY‡4…"xc̯ô;Ï Z)ŽþTMgC¤kcDÄÊ‹J`Œ£,“© K9¢n“ÜÓ~…¦Ê-*®#°äù˜bòÖú¨h£5ÕX€l6ï¦(/R•ª ”Â뀥ª '/!Õ[Q¶MiÏaªkຠÚ¯ŽS×§5­A gK²ñ<×îâùù bQ |‰R-¬¶h3˜&!DÚƒRàD^c(:×PW`ûè~±O\÷q:&ÏùЀ(P‘ÁTæoTk_ÆVM„·ù Xa…ÑÛ &ySÐå´‹Xˆ(È]ƒ:‹àûYŒ5Ó2 ¿ îø8}Š\\½)æþ^×Rš]Š¢ô—§}(@Ló³SmX? ¬ý0ÅàT=DëA¸J‘­OKÿý¥nÅ”{y‡È²hÎÖÑ× üÎü¯Ó×0yã·¦VJ' |„j"P¸z®z”Á¯Ïc¼6QÒ~ŠjŒžíæ@ ²6Íù>fb¾[1ákի݇.GHYaÜ8…T ¼`ŒÅI…qÓšL_4и¼„!¨†ë¦J:9-Êõ‚]H²½|š¹©Oðâ6:_ÀŽÒìï@Äê/ÐÂAU ‹Œ¤Œ(Ƴ%^(Ñã Ű A ‚-²é&S­pfž›#[Ì¡ê÷aÒëß™%œ›§ì×À5Qa†Q9TfÚÒeŽ&„ÀWQMRÈStTc&%2œÃ†Š¸®°¢O‘÷ñ‚¦Špæ t/<\­œötŠÊ™F%¯ÛB…“M¨ÒÑ«Â-¾‡µ€Õ ž‡ÐUDÌQb j#Ê¢ƒ®ºàňøÎۚʆìÂô> bày¨ ÀZ‰µAç0夆·ªÄÛà—HjÓ»5œD‚2· ›4êKä¦@g›. ßqþå8œ¾çcFˆi=U¼Z¡.v(z ²Ìñâ˜Ò/¡Ué ) Û>•Þ…jH– bÐZ` ò»ƒçµ‘Ñuˆ¶°Åu4 î=‡1®2à||/B*Ó#(·Ðû˽ˆßDj²ˆ]Âúˆ 8Õ]ƈrÊe¾‹©®‚ÊÆçß/©Í%„ ;P¥‡¯&½S@RŒÇ0Þ#¯Ñ¬O ƒ,p“!Ý™jr›tˆâ¡áÙE‡!AùÆ8JÊŽ9~‹aa9çŽ31»›®Ç$Y ¸Vƒ¸N™ï@4äØ=޳w)æ—Ñ„(‚ÍOrñ’åñoìc÷»³+`h}‰æ¬ä#?ïÓY´xá„kWO½ÁÅç–°a6§ÝÎŒ?ćÍû”t–ê¼÷ÁË,«hÍ*Î}s/}aÈpE桇[ø«Õîó+]îwű3׈‚€—ž8Á—þ¬EÁÆwœÿür“w}°Fe‡|åaÞV!œÉ!w`s«‚Ÿøñe´9ÎoþÎ9Ð!õYËßýÙ“¨Ù“¦pèàiöv%W/•¬]ìóÇ&ˆlüÞß<¨ïûPăçûÌÎÀæµ”Éþ¢ÙÀ͆²G™dWC¸ød“oîõÉ'­F›‡>ògï>Ìx¼Ê Ï`"ÊlÈÊ1ÍÏþÜ;yæ{|òw·ªÁ{>°ÀCïªÀ\åÂó‚Vû0ã¢?­uQu|¿NU%Pf´–¼õí§iÖžáO~ù q³Á{~rÌ{Ôò¹{œñzèÐeòÞI‚ŧ¸û=9APçÅRóš<ø^¿õ‹Ïóë¿úãÄáþ+,¯ÔqAŠ”uÈ[È–ÂùÖ¶AÆøÁZs9F·¦ ,E‡dr?ÞeýåeþÓ!6WDÝmîýþ÷¾;b¿?bãÂßmƒ€×d~/^ló‡Úáw~»Kž^&vâƒ8àW)¥éƒðq,²¾Ïž¿ÂÕáÛVpaÏò{¿| ^{ƒ·)âÆ­sjáAî¿W£wžå“ÿ_®°_mòÑßpÔ£„;O@+Œ&§+„€Þ›jŒóY;Îêòܲϟ|Ög«R\Þ(ùäIN[áØ±—§ÞwZ±Ïí wŸõøô'$iïm\Ü5|ìSŠ£sšÓ·]qˆò›`ÂÕð½W—ZJžþn‹å™œwÝ3K\ßÂæ³Ør‚'ñòŒ{Þ™5!Ë".ðåF‡‘RÒ/#&Á ýð"›ks<ò§wbÃý†Øü»ç~_¨×Ö¶íO ¥|rÚ+Pëi]ªkƒJÀncBº [ÓÊ55¡L;¤IÅì˜ÊmcmŸ4¹ÀÑ[‘&!ÌøŒòÌif¦LF#º³W¡Zse> @zH)Á÷Ò1; Æ–L&9XJ‘ç%I’1?¯P‘‡BÅÜ|‡²˜þÞªª@ ʲ$M*—Zøu)-H3ípníÔ:8ÅÂrÀÆ%8rû.ÍNˆ3;¯Êuo¡3¿Ç·ž¤· !UfðjHAP»L±9D¸$çìï9Œõ©ÏÚ7Ôq?ƒ\€ŒðTˆøVkp)ñ}Š?l!…3#l5šz†„(žv« Õ„¼¡K5!®ÈuÅæþ.[> ÕËìï®3Ü3øæVjîö"X5UÝ 5}åÃWX«YZŽÈóÉ´/´O’¥šápÄ•y<v 5ËËm²IEUU”ºçQèŠ4‘,hâ‡m˜ú×Ó¾ÂÎMya[âœfýŠ ×}îº?bZ`ëPÕgß^’ fØZåLj§òQ?!׆V°a‚m£Ë —útfÚx‘c’½A  Ù5-™wvÊá¦'C)º|Õ£ë‚Ú‚ÚUd”f’Ð=ü4z«ç}S…¨Ú,Ï¿°Ç©Ó§¥FùGi4ÞAÃ~€Ã§Gô“5Ru•A_“8«¾ýªÂâtNw¦Åh¼D @*0Z’¥ín„¶ãiIb•ÐîLFk5Ž T ÎåŠzS¡m‚+’o×Ò¸o*x%ýýmBÿb‹;î³Ôf@¸1µð÷<ÐâáO¼@•.à ƒªÏ í˜Jk&Ëa‚1=L5 >ïðˆõ5CüÆ€ªT8%H£ª*Œ©¾ýNYjDœ‘e%Un‘CŠ.]Á÷Õ—øÁuÙ\ëòôãñôË-‚°ËS_sìïyüèîÒV¦|޳>EX“<ñÕULÖ…Ú”˜ß~€çUJÍj‚@’)¨Øc ¤pÖCyvZ•&0Q ÐùÔ_”ÊMÛßPQæ>žoѺ«_m=ûêI}õ%'ßWx¾@Š.¯<}‚^Â]÷ù(ã8}÷“4ãÜ‹Âp™ÂäxžÂx!´¼30º›å•ÞóÁ”¢êñôc¦ˆÞ˜Æój{6ƒÏWà[p]T£Âä;ˆXáËyÊ­&ÐäÌ=%÷¼”8Χ>~¤¿ í!Ô×ÉFKdÉO=qüÑœ}kJö)Ó>û¿sñ¹ï°FOÞòH5=tî[¢hÏØ!BxÓð‡ †§@›¤A©c3œ-ðd\ކ)—™SU _ˆé¦Q>x®àRMÔ«2E£“s5é Ô_ùü%~ð#»/wyǃ#>þ¹5­œ’ F}TsžbØC ð¤Ï-<ÇêÛ4É0D¥‡¹ðlŸq_â…{h«þæA=%ñ•Cy •¾ ˆ?íeo<S¼ F• ¸õŒæ-gëù~ëw^!ßÕ´–êTž$+|§?uˆ;îÜãÉóçùê§PU«üèÏ\çþïß"Ÿœäêδ¿ ‰4B8œ›¾×â!EÑ#ð£W›fYÐ%Î6Q2 (†(/Æjá…äEŠïuÁe¸o$‰©"Œ™VàyHáOëc¨@a­Q˜>F*d8á•sš‡&>o{ܤҧ¨AZöh 9êÿoïÜ^4ËÎ2þ[kíµOß±ê«suMõqœCO¦“É8$ 1Θ"’x£¹!˜‹ èˆ0—Šà•7"È Þ$ÎÍ A$šÌÀ2fì±;Ó=}ªê®ª®úê;îÓÚ{¯åÅîàeÄÐv_Ôólö»X‡÷}Ÿ÷yÐ:™1Ÿ|ñƒyš”A¨xö§žºÎ×~w•úûE*1ùÿ?~¥r šRUcLS p®¹SëØ2‹q…cóÙ¾òõ[Ä­CþîÏSòÙ)‚Á€¤Ø#Û«Á>C°¼Éés’µ³»¼õæÓ"&K·yëçX^u¼pqƒ–A]b]õ@¡“ßÕEÙs€ðx«¡ c ”R¸ ¤ôȲ)°<˜•àÖ>E^6 鼿!VÖÿóoJÐí ˜M*Zƒ#æÙ1Ú·\~¿äüs÷yÿßg Ÿc<aê9ƒÁ2ÖdháJKgAs°»Æ|ž2É®óý·&¼÷½.ç.t¹øÅ›æN­‹‚!¤!6ð!ß½ þ>•rtdY¹øC’¼€¸±¢ÖÎKq ¥‡ðFd£íîÊ»„Ý ¦gð}GÕ½F©¨`ˆ´AÚ!TëPß¡HWˆ»3v†9ÑÊÎjÊÑ‹Ðw|r#ÇUŸÝ<÷ˆJÝßsYb ¬É‘ÎA+†ø úØzê¾®xç{3lbÀŸC6bSbã\I»ß¦ª%…3è(›ƒ­(ï-¢D›ÁêyÊt2 ãeDöy”@¹Gž$³~à /’]_‚ª³+‹ëܽm :ô=ÌÑ”ñq‰jpL?æ"¶¸Ãæé9‡û¥ñ¤iM®ÚôXEÜÑT®ôò:mð<œ«ñâÈ í/!ÝiòÙ”ÕPJ2õ‰ý˜"½jŸhJj¢v€±»ÌŇh§ŽÆ˜Äà ›öÐõ ‘×ÂfRS¨§Û$ã.çŸñ(Òˆ®AQÓò½…­oâ© T‹ Ì1&çîÝšÞb—j–Bú}ú‹ÖÂí;ûÔb‚Ë>B=Të Î]Æššhu DÀµO2—~)c–ï2ýüÁë«Ûâò•ù×ïtIë9:pTÎÐ[ó;X“©)mµI‘ïvàèžåŸßÜáþý)e¶È•+–û£C^~¹à÷ÿ,ÃX¸{eƒ|#çÆ§stçIªä×€ë$I†vÂEŽè¶É¦?|g—ÏT¾ö{†ªö9عÄw߸G–_G¯¬RÞú¬~D _å­ïüˆ—~%çÛò Ž/sùòeÞ~ó%ryžjüàê&¶¥@ ši=©ØÙ©™-US+E-0Q{TÆ£½¼€ÚY%3ªÄâÅ>¦<Çó_¾ÅöóQܲ{£Çï ¹üAÁd´­ÿ›|íÏ%cû}†d<"K„P”U !C*ÁRE1ŠÐJ£ý}êºFx*›QÂË´»… (Ç4èn‹Ú¦xáhú…HÈíM¢^…KºÓÓ¸ C,D«:Çüè?@¬Æ åmâ²6uõ±>‹1çMñBK‘Fà<Ÿ<Ÿ…+dG>">Àeª~(å5‚Ø'mƒ*œmX GS1««1‹k9ff˜u¡Õ=‡¬×' úä£{ S¼NDm:,ôºîC4Ƨ³>å¼ð‡ô»O`½{LŽ-íþóügH‡? »t:‡Ð‡0¤¨Z(­¡Ã¡Àƒ¢ØyÀX(HÇ]`¢”0Ü„… )¶I‰+  ½>E>{Œ©ÛûƒFM¬å‘Íß'X¼J!JÜD2÷F ¾@è- õ®˜QÕ)­x@2\ ò|*5Ç÷×)ŽH¬È' \@vTAQk‘ÌMpyIi¨Í"uûT£>&®,‰T!¶,²FPB°ÌñÎ=ÀGµºX5¹¨®ñœ&/ð—Ñz,K@r|´ƒîu)ËS˜ì ñJÏ;M69f4:‚h‚ssýg2/Nñ!4àY¤*±‰£vŠ!¸âòm¢¨CV¼Oká"É1ÍtXxoCºsŽÒS$› k¼¶O•-DE6Æ…§`äP«©y”âË`Þ£»‘2=¸y‰î¦’â~g c¦ †T®á÷‘rŠÖøKëˆÞE¥I|dÇÿ&·°@q„eS©ª ¨%C¬s8—ã0ãÜ€vÛé$-3a µ© [‚ÜÞ¡šßצ½3¿W¡Â„2/ xž4{ÄreŒ_þ2ùL¢Ú§©Ý?GMþé'=Å·þô¿ø«o/Ró1ñÒÒâlÄ cxyã09Ï·þò:û¯’E×ð¨»HU3ŸU¨hˆctf5wÿÿÕPKý;¤™G^ÎÍ~Wp*çx(YÜœè>ä€<Ù¥ÿNmƒë°´=$›÷@å@ éêVÆÃ˜'.x˜ªéãiÿ$h9„ò¡„ ÏùŒ;xQ 2B‚¢ÆptØby½O]€~Б8Ác gR¨Ç¬¬¯rç¶Ãy?­(ÉœÇÑ^‡ÂDD+sP[d'Q{Ü!g„«u¾Ìý‰u ü ‰š"”ÏáÏÝxþÅRØà1FØu\ü\ŸÝ-ò,žA"fHá“χû5/­5ÃÝÑÉú¸£Õ\xjÀîM°•†´Æºá?ý%gÊ&3h .œXhHg·¹òQH] J†ÔUÕŒ"z2ÖØº<‰ìÄV9°~ÓD50AF†¸ —^9Ãõ«Žý-°],ÔS<31 }ôÊ:ev̵o±±qé¹/ í>»;w9Þ¿KOwQ‘¦ª•1øUë$ð3 Mv!XÂ:˜ÂBvo)çÅ/®óù—Îòß½ÅñayA€µN½ìP2 ºE6D†°¶Üã™g÷𤦮<Ƈ·® 9¼›"\—^{…qœDþ!¢]oRŠO‰—w8Qsj{ “,rãªæÎ§–Äê.ÈNS9õ&Tv†Ð^s¥­ Ÿƒïã·;˜$ƒÃC¼^—þ@²±›%þ”0žÓéz™ž¿c{D–kfãã£.û>÷d3½`¦E3‡+„À’à˜6^òܯ:+ëÆ Ò9B·¼€ÜXÈ&P7>a ð)s( ¸îü$òÁl›ÒfX‘"|Zà¬lô+aÝ´ih?²FèÏR =ëiê¢jè”Âk¬#åôTÓ)kò<ƒ²¯îÅÈDŸDþ!¢ˆ¯#dŒ–]ʺ™‚ÎÏŸö¼]ݤ 2Bàóß·žI°ÔPS|IEND®B`‚video-qml-paint-rate.png000066400000000000000000000143161225012771600347140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/images‰PNG  IHDRKA·ÎÛsRGB®Îé pHYsÄÄ•+tIMEÛ  ##ýS1`IDAThÞÕ›é¯]×yÞŸ5íù ÷œsç{y/ÉKR¢¨Yôɰ“Xµ¢Ê‰ãÄFÒ5 4hÿ„~H€ _ú©ˆÑ¤qí:NÇPœÄ‚Û±I–KEj ÅñÎәϞÖ^S?ØN¥t€¨÷ÛÖÎÏ»ž÷}×Ú›àØÏá‡-áœøÔ kᜃŸá¶ #à4`Áˆ†3 ”‘·,äo}#­ ª6' œ[ 2F ]»­‹•5 ŒXJ”5Ž8Ê`þB]qXC}Ýš2 tnÎÕÆfuáà¶"”V¦©öýA/Ùß‹öv½ÁP¨"€_¾•QF¨Ñý¬¶°6éç yVwœ0+«c™®E¯nF;9½½²trœ5»­Å¹•Íù¥Ö‘#ó»ëþú•~w³^4SUÊ 'GÞKDÀÐÔùÞdjvë}ge½òßÙ/ƪ2Ü™k{·¡¿KlÍ©‘õ9rêLýèZãçŠë/t¶n­€Éáï1´çáx$fªÑõ廪÷¼ßáðÂs}­Àh³.8%œX‚Û‹*舠EH r88†ƒÑò1Ÿ°•áÀÆám”ùK«¦¢FòzGÞw–¼ñLkãò,âhV[M’!«Á–n³$E5E€”úcžT– ›ãý‹ìá.^~­Ò6%aFíŒuŽ©Q÷ÞÓ6úÆùoðúÔ,˜-†Î3ŽW¶Ô4œq¦¸Í4,¨Oe®²V:0OóIo£ìÙí÷+ç³´0³Ke»…sÏ®OŽû]y¨ûA#[D6eÝ·[¸‚ „‚x8¬ªr5:ðXë;½}æÁbf6€l»KQF”ca¹JÇéNs<±7üyw”» X/œÑHƒÛŽÐ6ª´*G®ê‚e\8.bÎG±À(Qe¸°°!`jgƒ$[;5>ØÚÓ£;ót$¢ã•¤ª\'õ Nè¬$a'n/B–¯s¯mM`󚂦õ£ÖBQDS˃]ÞInÓ¬¾°°»ùf}hö0¥{ Dì´Ïs&„6ð8*E¼,f"D1á^©@ã,‡r€#àšÃ JM8õ"²€fÀ€Òršñ:Ô¼$¢´¡€€ó˜€Tš pKhª Tžh¡ (I° 3‚ @=@k= ø<0CåÕèàÆpe> Üɪ¼Áê8çÎ9k-ÈÍêOŒÒ†ÎQÂáÍÙbžÆ;V+#+0Îa-”†sˆa ÷bø‘ÎX•;DaUe:T`ÆσVÎõ`=Å&h•B¢ÖäT(]ꪀºF½{üxTd¯{S Uu-Í&^ðžJý´Kkíû>PÊAAñ.¯ÂóºXÙºê¿øœ¹ð½ë£±/:ÓŠ•Ùaá £¥Ì†ÐáBþñ‡é˜Íºén-ŽÊ¬yñU{áœ;Ø ¡Ð)Qùïÿ°ê2Jæß8—üðy5èU¨_ù)bB¥Î9Kç”BëŠb­¥Œ[Èÿ–z§óƒ—g×Ì/>q¶(Ч¿²·±.´šÓê(EØbV â ßñ_,‡½Þáìêú‘ú³õ‚ò¥g&5±d“¼Ü0ú2hÆé2ÇŒŸ§éì_ÙùiAkǵQe¥dÁŒñÁ(áCGòO|ŠQ7óWä†ùú¯|Ú<ññÿü݉ç}¨¢7nÒ PBaLé ˆœ3€µ€sŽÞ\Ã|¯ŠT< ?ÿÕ—n¼þ|ÛȆ?„`ˆÓÊv'7®ìïHS&»/ý«|—929q7ŒûE>dœ7:·Rê²fZkBª+ë{±RŠs¢JóëØW'‘§¿õzÊ—1Õ+Ñ£Fê|ÈquCšwuèIÄeû™Ý+7fZ!`D©×Ù cŽ4¬ÅNl?©áØÄ<+&ŽFŠläÁL±ÚѼ_Z½æ+±;˜×z#3¸zEþð5’YwÓÿ)RZ2MÚ3•^¾í‘¡œZšº›¤Ë7.8³¯¼x £‘GJSjkº`]JÅ*\ÓVØ‘Ÿœ6Õ‹~mCæ–ES ¢&p@U ¡×ˆ¼©GÄ•p3œ6©NÔpzÉÐ7E@çæŽ¹ f-@XY–Aèý‹šþ6×yKß¾ÿÁûz›¸ÿô‰ãxáâùlóÈ¥gÝ ¯IÆ}Ph9‚¼ŠpF½y¹ß½ó!4Úå…g'°S°hWº·`ŒbÙ¤_ê²òýžÅØUQàÇ MÞrÅx¨²0®EYªÁBmtʲ,K’°·ž°ZŸV|{zùp>_ûúWäÄÑýBãáÇ/l¤óýýéR• ; ñœ$ptn¹ÿÑ_¼çÆõÃs?F)”ZÄsJ_™‡™›î‚eŽâþ÷OßuÏõ®¼¶óÚK½7Ï;¥ã ^ IEÃn¾§Aç X€‘¢(:aôŽzsGfã"Ó_ý‹CëÝ­¼â xá¿þ·‡ï~`ý[Q"/ø,\¹`R×V.>þKÓã‰ùú_VÃþjª£qnË pkmeÝð©Ïï9YS%Yºÿ¹³,ýÛߺûÏ¿Øå-‡œñƒLmÁ„À„ÖE)@Ü-×°¼te#]œ ÂÆôà` Ó’øÒËóËΑ1|?3éÎ*zÐ~è1p8úÆS×{'Ãöb‘=ï×=™•ιZóè$Û-&»ïÁÔ÷‡›ŒÆÔË_ý~s²Ÿò_~yö¨Ž×çó\p~ â`$cÎÀ2Æ”RÃÛ>tx»ë˜kM×Ƈ¤‡ðšHI-96Jµð´Ee½SïÙ½÷¬#ùêSOƒ-ÐéXó$&¤›@¶'ýŠ€„F´[">Býee#î­ìlÌZ;Ñ€µv|(«ÌÇAÈ SrÁàLzEQ¼#NCKž÷F‰çË´âí†öÄdw? }("ÍóÈæ™¿°ÿóŸêTî÷ªÜ>Ï÷3½iG$™YN»×˜zGl5µDkî´T• Á:PcE/ :aô”“:í…A³EÄðúEzò(‡³°†1‚Ê !ÒjøO¶o†¶ÕÝN ™… ‡ÜYŒÐ÷LͧC³Wê¶…‚Hî¾³ô™þÓÏ »@ÜìKÙXw@ð´¸A«cÕØ®²#'÷½Úý`1lý&‰ANP>ª××ó¾&+Ýu…åI•™v”øá‘J”»óGf¯öÖo=¡é.î_õœ4'Nðr¬Q–Çï¸ÊÄàʹ#ZvA¯Ã–×ì辪{¶ØîÀ†(Ÿ×gBµÜ_­æI”Œ'¢:<²é…ZðiRÁÄ;~Ú £Ú°›P¦êòÆõ+º];UÉþNÌéÐï®÷÷dcirë ­Oº±.¼‡I;˯t–7|_ì&«o¼Ü€húS <1ÉÌ•þø\½f¢׬_íDuÓ‹­›OÔdÀâѧÿ3ûèoœþ^dN@Y9†úÔ«‚ö|yòÞ_XߣùÖFóÙ¿µfÖ‚A7nŒ_=ý‰Oð…¼E~äîÃm÷ú÷D:â·~ºäÜæåæ“ŸüÁ¿ù™_öÖûŸû(µ'd—†Zëå•ô×'G½K«ý öF©î‡O}1ïßåLfÁ„}X•O+wX›•} µ¶[­.Ç󛛸~­÷Ú÷'Cʧʼ×FFüiùݯ¬>òÉÇ?”µëÛý ÏÌùÁŠä߇mÜj§ äó»½ÝÁŸ~6ÖtÒójìD°)Õ;ÈëOþq*F™ÌˆIøƒv 5@ e·urÔß–ð_,š/Á¶XL†ú+Ÿï£jÖ+2ãœíIU3Õ*š[Æ¿ÁtÕWeVjrêÉÿqˆ)?©OÒþÊÌoe(å;à4ý7+YÆÓ4 ëj›U1¡…;´ã Šˆùž¶N[ê‚éã¹Ê<70Ä«Òß®D½íÍW¤^ÒVbÆ 6÷ؼܮÆ×u£Â e ™v}01 £ y•;IëNAN¥ÛŒë‡?+Ó!ÈÊ­ÏRˆEÕoþö^ê òkr~iКŒË±—^<öì7\Ä‘•F=øÇwˆ J-t­^ËÏÜ;þðc oœ—_ú³´o‰úÏPû!yø‚Ô…·:óŸ~ç•By„žŒÚ£<{ÎÃÌ•kþW¿àÅ-&dÑ%¹sd®^¿òÚà[OÝ ½Ej;²Š‡zŸÖ‚*íolâ»_³.¿ßyé‡;÷Ð{i¿¿uýj³È¼<޲Ì8ví˜Ð &ñÖcO,ž\K†ûÝñN–å ÿ×#öwªxšÓ£Îìh¿Y©7Ùd¦»UþÍ_)mA7L»ú>Tñö¥yÛÕ"»ÏŸîuó¬h»°ïÓ]IúnŸúGm:öë­Wž‰³j)e™üÍŸO‹€ÜñÐXÉ^"ΠЙمXMá"B&a²øýsÁç>ßùÒW*–>©‹pmcÅDH†(:ʈÜ4ún«›‡}wf@f‡ÙéÞú}rI–)!é¬@EÔ8… EÀ¬V Bˆ8±ÙJò@s|cûBRcqZnñ©¦C¹Pf”I'Y·Û FU¥»©"T¨""ú˜µæ» ÏÃTî`îÖÖ:!Œ"ÓrÇó /¸`!ŸVÃC„I{Îôs­œˆ‚Zèbì,åÎD¦ aöŒ­Öl–ÊÁ<Ê|hjsc m 8¿éP%Êš]JºLXF–’à¬Í Ú¸õN3Ù-©:íò&Ô%§—ªôÆ2¿J¡§iÎφ!Ï»j(›Ó¿~~®uúÜËeq}Þår‚zݸ‘ÓšP.xXYë(°Æš›ß×O:®XãÊÊj{˜IçE³ótÞâh³æ̳w|P?ðh3ÏûÉ‹ßÞØÉfRÉQpxIžVÎ1#Ó…éÅGžè¥ýÎ+/ìU£´’tIê}Æ¡µrZ+¢ýÑù¥ÒòfgØ%í¾ÿ qæñ¢P“í‹âç“ËhÌV3½~‹ mþêÄÜýõ?›Íʱv“öìäá÷ÍüæoÇ¿ÿ{Ú j.° £öðc¿ÖžjŽ»¸u ßþÚßuwgÃÙe F˜Lº:·ð´³ÆÀÄJ#ŒÝtVøß)EV&wÜ3õ¡G'wýVú•?½ù}†æ-¯‡ˆ™ê°˼׌¬¶§†ôž¯ýåÅ"]=š_ï}ùаUoüW“äê‹?4o^L‘ ”eH­ˆjšåDPJ¸†!”Êe7ØÓâ¸4Æ{ãïÙ¤»óÄÇ£ÓgüQ¯·ß­ßj/5Í2ëJ™’h–„7¶.Ïò®©v©LÅ€ xõ|DÆ#gÓ|æ÷/¼›.?q¤]žmP„®*3ŒpB¬µZk¥nÚ…ÉÒzþŒg;VÐévrâp3~ª…J Z¼1íÄ:Ñ7>4”D.˜¬Íê;@¢¡ÝHF‡™h¿¼sbíXä,Ë´YÞ $=Ûsº%3Në>¤u†pჭ¥& £»`…ÖyÌ‹¡r 9%'ãZ]T“cýl@’‹ž^}é؉ž”@ÉØn7»aûE£ÌsPÚ 5|Æy,³ªAŠf#K9,¤q4sz  îÁ*ê»ÖlÁr¢˜sÛ¥{- ˆ#W½N9­ÏqzÄäè!ž¢^ê`Ò;µçæ:i&ý©7o=!3 q«E‰Ã$v¢be9¡&9ÿ²”ºð› (õ¢ž–WQŒtµ.ø¹v½#ËÐé¡UÒ˜…U‰?´g‡Àø>ŒŽ1ŸPqŤÉïÈ{q>É%³ÝY}0ƒ"n´æ¡/3%ò@®?m+£/¼”ùÒ­¯FaþäNï`0Ø\J¢ö±Ó»g¬´óÊ˯»Ü²)ÎtLÉꢶêGüÑÇã.yá™-_„:Ý«D~êÓmÍâ'¿°=Y9¬ÂV\°e’ö–gZÁTTËÒE9Ù¿Bg¶­7çjl<<`&Œó*¯‰0¤TÈ¢J‹>øš³hÚ÷…®B™¶+Ÿ :éB_VÛpÊYå‡RíÂy„Þ…ú Á~wi˜‹œÔ2?^‘¥„ƒˆ=•$fŒk­»,?°<9¤®)¼ZYZxc1u­2‡¨È-÷Òb „#ÒJ)s„=t>5Šä“½JïÛ*C8äÍHº&yŽ4 )w€!,¤ó×QLÝ„‰i{µÐÉ‘T." Õs¤bÌCå…Þ4 ç ½mý=§3Ÿ¯ytÙ &,˜ýh’9K÷$„þYî?WÊ„€R÷Z Ú…¢€¦À$0F@ R€Äp@P‘žD¯:0`̰¬×pàÛjt.ýѵš(øSpRÂóò*4À«ˆ ]Wæ@R7rtóí¤•? ã#w9È,Ã˼cf½áÐå« ü'yëÜ y+ííÆ#ħÁ–¬|e XÂŽ8oY3žß¼¥ôG—Ã路š~èLÜZ>ÌÆ5ƒ 6¤ˆu"¶OÜ8K¬µÎZXûÿÔ~üøî ävíŒèíÇ,Ð 寪tó™™kåÅ´†1ÿ@H(…sï&B#áÆóK Û[”x”RB¸Aï@P;_›©~ì1?y1åÇJ¾›²tÌ”*oïíÂX ¡˜: Òc$ö9–î턎÷›!ÿ€÷.áIyæ¾ú`z¿KTÉ(ŠeQÒëo–GOÔƒ Büج?–e„Pct®ì?ÑP™dNçYßö„Ö¨£²E¡ÈýþmEèOV”-,ɉWAg)fð9¨Ëa+€‘¼u¯“îÄÀ devices(const QByteArray &serviceType) const; QString deviceDescription(const QByteArray &serviceType, const QByteArray &device); \endcode The choice of what needs to be done depends on what the developer wishes to do with the service. \endomit \section2 Classes for service implementers. \annotatedlist multimedia_control */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/plugins/000077500000000000000000000000001225012771600305355ustar00rootroot00000000000000qml-multimedia.qdoc000066400000000000000000000172721225012771600342600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/plugins/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \group qml-multimedia \title QML Multimedia Plugin QML Support for the Qt Multimedia API. */ /*! \page qml-multimedia.html \title Qt Multimedia QML API \brief A QML API for the Qt Multimedia module. \section1 Overview The Qt Multimedia module gives developers a simplified way to use audio and video playback, and access camera functionality. The Multimedia QML API provides a QML friendly interface to these features. \section1 Types \section2 Audio \l Audio is an easy way to add audio playback to a Qt Quick scene. Qt Multimedia provides properties for control, methods (functions) and signals. The code extract below shows the creation and use of an Audio instance. \qml import QtQuick 2.0 import QtMultimedia 5.0 // ... Item { width: 640 height: 360 Audio { id: playMusic source: "music.wav" } MouseArea { id: playArea anchors.fill: parent onPressed: { playMusic.play() } } } \endqml The snippet above shows how the inclusion of \e playMusic enables audio features on the type that contains it. So that when the parent's MouseArea is clicked the \l {Audio::play()}{play()} method of Audio is run. Other typical audio control methods are available such as \l {Audio::pause}{pause()} and \l {Audio::stop()}{stop()}. Much of the getting / setting of \l Audio parameters is done through properties. These include \table 70% \header \li Property \li Description \row \li \l {Audio::source}{source} \li The source URL of the media. \row \li \l {Audio::autoLoad}{autoLoad} \li Indicates if loading of media should begin immediately. \row \li \l{Audio::playing}{playing} \li Indicates that the media is playing. \row \li \l {Audio::paused}{paused} \li The media is paused. \row \li \l{Audio::status}{status} \li The status of media loading. \row \li \l{Audio::duration}{duration} \li Amount of time in milliseconds the media will play. \row \li \l{Audio::position}{position} \li Current position in the media in milliseconds of play. \row \li \l{Audio::volume}{volume} \li Audio output volume: from 0.0 (silent) to 1.0 (maximum) \row \li \l{Audio::muted}{muted} \li Indicates audio is muted. \row \li \l{Audio::bufferProgress}{bufferProgress} \li Indicates how full the data buffer is: 0.0 (empty) to 1.0 (full). \row \li \l{Audio::seekable}{seekable} \li Indicates whether the audio position can be changed. \row \li \l{Audio::playbackRate}{playbackRate} \li The rate at which audio is played at as a multiple of the normal rate. \row \li \l{Audio::error}{error} \li An error code for the error state including NoError \row \li \l{Audio::errorString}{errorString} \li A description of the current error condition. \endtable The set of signals available allow the developer to create custom behavior when the following events occur, \table 70% \header \li Signal \li Description \row \li \l{Audio::playing}{playing} \li Called when playback is started, or when resumed from paused state. \row \li \l{Audio::paused}{paused} \li Called when playback is paused. \row \li \l{Audio::stopped}{stopped} \li Called when playback is stopped. \row \li \l{Audio::error}{error} \li Called when the specified error occurs. \endtable \section2 Camera \l Camera enables still image and video capture using QML. It has a number of properties that help setting it up. The details of using a \l Camera are described in further depth in the \l {Camera Overview} and in the corresponding reference documentation. \section2 Video Adding video playback, with sound, to a Qt Quick scene is also easy. The process is very similar to that of Audio above, in fact \l {Video} shares many of the property names, methods and signals. Here is the equivalent sample code to implement video playback in a scene \qml Video { id: video width : 800 height : 600 source: "video.avi" MouseArea { anchors.fill: parent onClicked: { video.play() } } focus: true Keys.onSpacePressed: video.paused = !video.paused Keys.onLeftPressed: video.position -= 5000 Keys.onRightPressed: video.position += 5000 } \endqml There are similar features like \l {Video::play()}{play()} with new features specific to video. In the above sample when the parent of MouseArea is clicked, an area of 800x600 pixels with an id of 'video', the source "video.avi" will play in that area. Notice also that signals for the \l Keys have been defined so that a spacebar will toggle the pause button; the left arrow will move the current position in the video to 5 seconds previously; and the right arrow will advance the current position in the video by 5 seconds. Most of the differences will obviously be about video control and information. There are many properties associated with \l {Video}, most of them deal with meta-data, control of the video media and aspects of presentation. \section2 SoundEffect \l SoundEffect provides a way to play short sound effects, like in video games. Multiple sound effect instances can be played simultaneously. You should use \l Audio for music playback. \qml import QtQuick 2.0 import QtMultimedia 5.0 Item { width: 640 height: 360 SoundEffect { id: effect source: "test.wav" } MouseArea { id: playArea anchors.fill: parent onPressed: { effect.play() } } } \endqml In the above sample the sound effect will be played when the MouseArea is clicked. For a complete description of this type, see \l SoundEffect \section1 Multimedia QML Types \annotatedlist multimedia_qml */ qtmultimedia-cpp.qdoc000066400000000000000000000034641225012771600331330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \module QtMultimedia \title Qt Multimedia C++ Classes \ingroup modules \brief The \l {Qt Multimedia} module provides audio, video, radio and camera functionality. The C++ classes provide more control over the multimedia content than the QML alternatives. If your application is serving complex use cases such as decoding media files, accessing video or audio buffers, use the C++ alternative. For more details about the complex audio, video, and camera use cases supported by the C++ classes, refer to \l {Qt Multimedia Overview}. */ qtmultimedia-examples.qdoc000066400000000000000000000031741225012771600341650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \group multimedia_examples \ingroup all-examples \title Qt Multimedia Examples \brief Demonstrates the multimedia functionality provided by Qt. The \l{Qt Multimedia} module provides low-level audio support on Linux, Windows and Mac OS X. It also provides audio plugin API to allow developers implement their own audio support for custom devices and platforms. */ qtmultimedia-index.qdoc000066400000000000000000000105201225012771600334470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page qtmultimedia-index.html \title Qt Multimedia \brief The Qt Multimedia module provides APIs for audio, video, radio, and camera-related functionality. Qt Multimedia is an essential module that provides a rich set of QML types and C++ classes to handle multimedia content. It also provides necessary APIs to access the camera and radio functionality. The \l{Qt Multimedia Widgets} module provides widget based multimedia classes. \section1 Getting Started The QML types can be imported into your applciation using the following import statement in your \c {.qml} file. \code import QtMultimedia 5.0 \endcode If you intend to use the C++ classes in your application, include the C++ definitions using the following directive: \code #include \endcode \note If you are using a few classes from this module, we recommend including those specific classes only instead of the module. To link against the corresponding C++ libraries, add the following to your \c {qmake} project file: \code QT += multimedia \endcode \section1 QML Types and C++ Classes The following is a list of important QML types and C++ classes provided by this module: \table \header \li Type \li Description \row \li \l {QtMultimedia5::Audio}{Audio} \li Add audio playback functionality to a scene \row \li \l {QtMultimedia5::Camera}{Camera} \li Access camera viewfinder frames \row \li MediaPlayer \li Add media playback functionality to a scene. It is same as Audio type, but can be used for video playback with the VideoOutput type. \row \li \l {QtMultimedia5::Radio}{Radio} \li Access radio functionality \row \li \l {QtMultimedia5::Video}{Video} \li Add Video playback functionality to a scene. It uses MediaPlayer and VideoOutput types to provide video playback functionality. \endtable \table \header \li Class \li Description \row \li QAudioOutput \li Sends audio data to an audio output device \row \li QCamera \li Access camera viewfinder. \row \li QCameraImageCapture \li Record media content. Intended to be used with QCamera to record media. \row \li QMediaPlayer \li Playback media from a source. \row \li QRadioTuner \li Access radio device. \row \li QVideoRendererControl \li Control video data. \endtable \section1 Related Information \section2 Guides \list \li \l Multimedia - overview of multimedia support in Qt \li \l{Audio Overview} \li \l{Positional Audio} \li \l{Video Overview} \li \l{Camera Overview} \li \l{Radio Overview} \endlist \section2 Platform Notes \list \li \l{BlackBerry} \endlist \section2 Reference \list \li \l{Qt Multimedia QML Types}{QML Types} \li \l{Qt Multimedia C++ Classes}{C++ Classes} \endlist \section2 Examples \list \li \l{Qt Multimedia Examples} \endlist */ qtmultimedia5.qdoc000066400000000000000000000031641225012771600324350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \qmlmodule QtMultimedia 5 \title Qt Multimedia QML Types \ingroup qmlmodules \brief Provides QML types for multimedia support. \section1 Overview The QML types for Qt Multimedia support the basic use cases such as: \list \li audio and video playback, \li access camera and radio functionality, \li record video, \li and access camera settings. \endlist \section1 QML types */ radiooverview.qdoc000066400000000000000000000062141225012771600325350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page radiooverview.html \title Radio Overview \brief An API to control system radio tuner The Qt Multimedia API provides a number of radio related classes for control over the radio tuner of the system, and gives access to Radio Data System (RDS) information for radio stations that broadcasts it. \section1 Radio Features The Radio API consists of two separate components. The radio tuner, \l QRadioTuner or the \l Radio QML type, which handles control of the radio hardware as well as tuning. The other is the radio data component, either \l QRadioData or the \l RadioData QML type, which gives access to RDS information. \section1 Radio Implementation Details The actual level of support depends on the underlying system support. It should be noted that only analog radio is supported, and the properties of the radio data component will only be populated if the system radio tuner supports RDS. \section1 Examples There are two examples showing the usage of the Radio API. One shows how to use the QRadioTuner class from C++. The other shows how to implement a similar application using QML and \l Radio. \section2 Radio Example This image shows the example using the QRadioTuner API. \image radio-example.png The example reads the frequency from the radio tuner, and sets the "Got Signal" text based on the signal strength. The buttons allow the user to tune and scan up and down the frequency band, while the slider to the side allows volume adjustments. Only the FM frequency band is used in this example. \section2 Declarative Radio Example \image declarative-radio-example.png This example has the same functionality of the regular radio example mentioned above, but it includes a nice horizontal dial showing the position of the current frequency inside the band. \section1 Reference documentation \section2 C++ Classes \annotatedlist multimedia_radio \section2 QML Types \annotatedlist multimedia_radio_qml */ videooverview.qdoc000066400000000000000000000127371225012771600325540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page videooverview.html \title Video Overview \brief Video playback \section1 Video Features Qt Multimedia offers both high and low level C++ classes for playing and manipulating video data, and QML types for playback and control. Some of these classes also overlap with both \l {Camera Overview}{camera} and \l {Audio Overview}{audio} classes, which can be useful. \section1 Video Implementation Details \target multimedia-playing-video \section2 Playing Video in C++ You can use the \l QMediaPlayer class to decode a video file, and display it using \l QVideoWidget, \l QGraphicsVideoItem, or a custom class. Here's an example of using QVideoWidget: \snippet multimedia-snippets/video.cpp Video widget And an example with QGraphicsVideoItem: \snippet multimedia-snippets/video.cpp Video graphics item \section2 Playing Video in QML You can use \l VideoOutput to render content that is provided by either a \l MediaPlayer or a \l Camera. The VideoOutput is a visual component that can be transformed or acted upon by shaders (as the \l {QML Video Shader Effects Example} shows), while all media decoding and playback control is handled by the \l MediaPlayer. Alternatively there is also a higher level \l Video type that acts as a single, visual element to play video and control playback. \section2 Working with Low Level Video Frames Qt Multimedia offers a number of low level classes to make handling video frames a bit easier. These classes are primarily used when writing code that processes video or camera frames (for example, detecting barcodes, or applying a fancy vignette effect), or needs to display video in a special way that is otherwise unsupported. The \l QVideoFrame class encapsulates a video frame and allows the contents to be mapped into system memory for manipulation or processing, while deriving a class from \l QAbstractVideoSurface allows you to receive these frames from \l QMediaPlayer and \l QCamera. \snippet multimedia-snippets/video.cpp Derived Surface and with an instance of this surface, \c myVideoSurface, you can set the surface as the \l {QMediaPlayer::setVideoOutput()}{video output} for QMediaPlayer. \snippet multimedia-snippets/video.cpp Setting surface in player Several of the built-in Qt classes offer this functionality as well, so if you decode video in your application, you can present it to classes that offer a \l QVideoRendererControl class, and in QML you can set a custom object for the source of a \l VideoOutput with either a writable \c videoSurface property (that the instance will set it's internal video surface to) or a readable \c mediaObject property with a QMediaObject derived class that implements the \l QVideoRendererControl interface. The following snippet shows a class that has a writable \c videoSurface property and receives frames through a public slot \c onNewVideoContentReceived(). These frames are then presented on the surface set in \c setVideoSurface(). \snippet multimedia-snippets/video.cpp Video producer \section2 Recording Video You can use the \l QMediaRecorder class in conjunction with other classes to record video to disk. Primarily this is used with the camera, so consult the \l {Camera Overview} for more information. \section2 Monitoring Video Frames You can use the \l QVideoProbe class to access video frames as they flow through different parts of a media pipeline when using other classes like \l QMediaPlayer, \l QMediaRecorder or \l QCamera. After creating the high level media class, you can set the source of the video probe to that instance. This can be useful for performing some video processing tasks (like barcode recognition, or object detection) while the video is rendered normally. You can not affect the video frames using this class, and they may arrive at a slightly different time than they are being rendered. Here's an example of installing a video probe while recording the camera: \snippet multimedia-snippets/media.cpp Video probe \section1 Examples There are both C++ and QML examples available. \section2 C++ Examples \annotatedlist video_examples \section2 QML Examples \annotatedlist video_examples_qml \section1 Reference Documentation \section2 C++ Classes \annotatedlist multimedia_video \section2 QML Types \annotatedlist multimedia_video_qml */ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/000077500000000000000000000000001225012771600310715ustar00rootroot00000000000000gstvideoconnector_p.h000066400000000000000000000061151225012771600352440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTVIDEOCONNECTOR_H #define QGSTVIDEOCONNECTOR_H #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_CONNECTOR \ (gst_video_connector_get_type()) #define GST_VIDEO_CONNECTOR(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_CONNECTOR, GstVideoConnector)) #define GST_VIDEO_CONNECTOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VIDEO_CONNECTOR, GstVideoConnectorClass)) #define GST_IS_VIDEO_CONNECTOR(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_CONNECTOR)) #define GST_IS_VIDEO_CONNECTOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VIDEO_CONNECTOR)) typedef struct _GstVideoConnector GstVideoConnector; typedef struct _GstVideoConnectorClass GstVideoConnectorClass; struct _GstVideoConnector { GstElement element; GstPad *srcpad; GstPad *sinkpad; gboolean relinked; gboolean failedSignalEmited; GstSegment segment; GstBuffer *latest_buffer; }; struct _GstVideoConnectorClass { GstElementClass parent_class; /* action signal to resend new segment */ void (*resend_new_segment) (GstElement * element, gboolean emitFailedSignal); }; GType gst_video_connector_get_type (void); G_END_DECLS #endif qgstappsrc_p.h000066400000000000000000000067561225012771600337070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTAPPSRC_H #define QGSTAPPSRC_H #include #include #include #include #if GST_VERSION_MAJOR < 1 #include #endif QT_BEGIN_NAMESPACE class QGstAppSrc : public QObject { Q_OBJECT public: QGstAppSrc(QObject *parent = 0); ~QGstAppSrc(); bool setup(GstElement *); bool isReady() const { return m_setup; } void setStream(QIODevice *); QIODevice *stream() const; GstAppSrc *element(); qint64 queueSize() const { return m_maxBytes; } bool& enoughData() { return m_enoughData; } bool& dataRequested() { return m_dataRequested; } unsigned int& dataRequestSize() { return m_dataRequestSize; } bool isStreamValid() const { return m_stream != 0 && m_stream->isOpen(); } private slots: void pushDataToAppSrc(); bool doSeek(qint64); void onDataReady(); void streamDestroyed(); private: static gboolean on_seek_data(GstAppSrc *element, guint64 arg0, gpointer userdata); static void on_enough_data(GstAppSrc *element, gpointer userdata); static void on_need_data(GstAppSrc *element, uint arg0, gpointer userdata); static void destroy_notify(gpointer data); void sendEOS(); QIODevice *m_stream; GstAppSrc *m_appSrc; bool m_sequential; GstAppStreamType m_streamType; GstAppSrcCallbacks m_callbacks; qint64 m_maxBytes; bool m_setup; unsigned int m_dataRequestSize; bool m_dataRequested; bool m_enoughData; bool m_forceData; }; QT_END_NAMESPACE #endif qgstbufferpoolinterface_p.h000066400000000000000000000101761225012771600364320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTBUFFERPOOLINTERFACE_P_H #define QGSTBUFFERPOOLINTERFACE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include QT_BEGIN_NAMESPACE const QLatin1String QGstBufferPoolPluginKey("bufferpool"); /*! Abstract interface for video buffers allocation. */ class QGstBufferPoolInterface { public: virtual ~QGstBufferPoolInterface() {} virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0; virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0; virtual void clear() = 0; virtual QAbstractVideoBuffer::HandleType handleType() const = 0; /*! Build an QAbstractVideoBuffer instance from GstBuffer. Returns NULL if GstBuffer is not compatible with this buffer pool. This method is called from gstreamer video sink thread. */ virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0; }; #define QGstBufferPoolInterface_iid "org.qt-project.qt.gstbufferpool/5.0" Q_DECLARE_INTERFACE(QGstBufferPoolInterface, QGstBufferPoolInterface_iid) class QGstBufferPoolPlugin : public QObject, public QGstBufferPoolInterface { Q_OBJECT Q_INTERFACES(QGstBufferPoolInterface) public: explicit QGstBufferPoolPlugin(QObject *parent = 0); virtual ~QGstBufferPoolPlugin() {} virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0; virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0; virtual void clear() = 0; virtual QAbstractVideoBuffer::HandleType handleType() const = 0; /*! Build an QAbstractVideoBuffer instance from compatible GstBuffer. Returns NULL if GstBuffer is not compatible with this buffer pool. This method is called from gstreamer video sink thread. */ virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0; }; QT_END_NAMESPACE #endif qgstcodecsinfo_p.h000066400000000000000000000052601225012771600345200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTCODECSINFO_H #define QGSTCODECSINFO_H #include #include #include QT_BEGIN_NAMESPACE class QGstCodecsInfo { public: enum ElementType { AudioEncoder, VideoEncoder, Muxer }; QGstCodecsInfo(ElementType elementType); QStringList supportedCodecs() const; QString codecDescription(const QString &codec) const; #if GST_CHECK_VERSION(0,10,31) static GstCaps* supportedElementCaps(GstElementFactoryListType elementType, GstRank minimumRank = GST_RANK_MARGINAL, GstPadDirection padDirection = GST_PAD_SRC); #endif private: QStringList m_codecs; QMap m_codecDescriptions; }; QT_END_NAMESPACE #endif qgstreameraudioinputselector_p.h000066400000000000000000000053661225012771600375310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERAUDIOINPUTSELECTOR_H #define QGSTREAMERAUDIOINPUTSELECTOR_H #include #include QT_BEGIN_NAMESPACE class QGstreamerAudioInputSelector : public QAudioInputSelectorControl { Q_OBJECT public: QGstreamerAudioInputSelector(QObject *parent); ~QGstreamerAudioInputSelector(); QList availableInputs() const; QString inputDescription(const QString& name) const; QString defaultInput() const; QString activeInput() const; public Q_SLOTS: void setActiveInput(const QString& name); private: void update(); void updateAlsaDevices(); void updateOssDevices(); void updatePulseDevices(); QString m_audioInput; QList m_names; QList m_descriptions; }; QT_END_NAMESPACE #endif // QGSTREAMERAUDIOINPUTSELECTOR_H qgstreameraudioprobecontrol_p.h000066400000000000000000000051501225012771600373300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERAUDIOPROBECONTROL_H #define QGSTREAMERAUDIOPROBECONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QGstreamerAudioProbeControl : public QMediaAudioProbeControl { Q_OBJECT public: explicit QGstreamerAudioProbeControl(QObject *parent); virtual ~QGstreamerAudioProbeControl(); #if GST_CHECK_VERSION(1,0,0) void bufferProbed(GstBuffer* buffer, GstCaps* caps); #else void bufferProbed(GstBuffer* buffer); #endif private slots: void bufferProbed(); private: QAudioBuffer m_pendingBuffer; QMutex m_bufferMutex; }; QT_END_NAMESPACE #endif // QGSTREAMERAUDIOPROBECONTROL_H qgstreamerbushelper_p.h000066400000000000000000000067661225012771600356050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERBUSHELPER_P_H #define QGSTREAMERBUSHELPER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include "qgstreamermessage_p.h" #include QT_BEGIN_NAMESPACE class QGstreamerSyncMessageFilter { public: //returns true if message was processed and should be dropped, false otherwise virtual bool processSyncMessage(const QGstreamerMessage &message) = 0; }; #define QGstreamerSyncMessageFilter_iid "org.qt-project.qt.gstreamersyncmessagefilter/5.0" Q_DECLARE_INTERFACE(QGstreamerSyncMessageFilter, QGstreamerSyncMessageFilter_iid) class QGstreamerBusMessageFilter { public: //returns true if message was processed and should be dropped, false otherwise virtual bool processBusMessage(const QGstreamerMessage &message) = 0; }; #define QGstreamerBusMessageFilter_iid "org.qt-project.qt.gstreamerbusmessagefilter/5.0" Q_DECLARE_INTERFACE(QGstreamerBusMessageFilter, QGstreamerBusMessageFilter_iid) class QGstreamerBusHelperPrivate; class QGstreamerBusHelper : public QObject { Q_OBJECT friend class QGstreamerBusHelperPrivate; public: QGstreamerBusHelper(GstBus* bus, QObject* parent = 0); ~QGstreamerBusHelper(); void installMessageFilter(QObject *filter); void removeMessageFilter(QObject *filter); signals: void message(QGstreamerMessage const& message); private: QGstreamerBusHelperPrivate* d; }; QT_END_NAMESPACE #endif qgstreamergltexturerenderer_p.h000066400000000000000000000105401225012771600373470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERGLTEXTURERENDERER_H #define QGSTREAMERGLTEXTURERENDERER_H #include #include #include #include "qgstreamervideorendererinterface_p.h" #include #include QT_BEGIN_NAMESPACE class QGLContext; class QGstreamerGLTextureRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface, public QGstreamerSyncMessageFilter, public QGstreamerBusMessageFilter { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface QGstreamerSyncMessageFilter QGstreamerBusMessageFilter) Q_PROPERTY(bool overlayEnabled READ overlayEnabled WRITE setOverlayEnabled) Q_PROPERTY(qulonglong winId READ winId WRITE setWinId) Q_PROPERTY(QRect overlayGeometry READ overlayGeometry WRITE setOverlayGeometry) Q_PROPERTY(QColor colorKey READ colorKey) Q_PROPERTY(QSize nativeSize READ nativeSize NOTIFY nativeSizeChanged) public: QGstreamerGLTextureRenderer(QObject *parent = 0); virtual ~QGstreamerGLTextureRenderer(); QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); GstElement *videoSink(); bool isReady() const; bool processBusMessage(const QGstreamerMessage &message); bool processSyncMessage(const QGstreamerMessage &message); void stopRenderer(); int framebufferNumber() const; bool overlayEnabled() const; WId winId() const; QRect overlayGeometry() const; QColor colorKey() const; QSize nativeSize() const; public slots: void renderGLFrame(int); void setOverlayEnabled(bool); void setWinId(WId id); void setOverlayGeometry(const QRect &geometry); void repaintOverlay(); signals: void sinkChanged(); void readyChanged(bool); void nativeSizeChanged(); private slots: void handleFormatChange(); void updateNativeVideoSize(); private: static void handleFrameReady(GstElement *sink, gint frame, gpointer data); static gboolean padBufferProbe(GstPad *pad, GstBuffer *buffer, gpointer user_data); GstElement *m_videoSink; QAbstractVideoSurface *m_surface; QGLContext *m_context; QSize m_nativeSize; WId m_winId; QColor m_colorKey; QRect m_displayRect; bool m_overlayEnabled; int m_bufferProbeId; QMutex m_mutex; QWaitCondition m_renderCondition; }; QT_END_NAMESPACE #endif // QGSTREAMERVIDEORENDRER_H qgstreamermessage_p.h000066400000000000000000000053011225012771600352200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERMESSAGE_P_H #define QGSTREAMERMESSAGE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class QGstreamerMessage { public: QGstreamerMessage(); QGstreamerMessage(GstMessage* message); QGstreamerMessage(QGstreamerMessage const& m); ~QGstreamerMessage(); GstMessage* rawMessage() const; QGstreamerMessage& operator=(QGstreamerMessage const& rhs); private: GstMessage* m_message; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QGstreamerMessage); #endif qgstreamermirtexturerenderer_p.h000066400000000000000000000102101225012771600375260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Canonical Ltd ** Contact: jim.hodapp@canonical.com ** ** This file is part of the Qt Toolkit. ** // TODO: Fix this license ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERMIRTEXTURERENDERER_H #define QGSTREAMERMIRTEXTURERENDERER_H #include #include #include #include #include "qgstreamervideorendererinterface_p.h" QT_BEGIN_NAMESPACE class QGstreamerMirTextureBuffer; class QGstreamerPlayerSession; class QGLContext; class QOpenGLContext; class QSurfaceFormat; class QGstreamerMirTextureRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface) public: typedef void* GstMirSink; typedef void* SurfaceTextureClientHybris; QGstreamerMirTextureRenderer(QObject *parent = 0, const QGstreamerPlayerSession *playerSession = 0); virtual ~QGstreamerMirTextureRenderer(); QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); void setPlayerSession(const QGstreamerPlayerSession *playerSession); GstElement *videoSink(); void stopRenderer(); bool isReady() const { return m_surface != 0; } signals: void sinkChanged(); void readyChanged(bool); void nativeSizeChanged(); private slots: void handleFormatChange(); void updateNativeVideoSize(); void handleFocusWindowChanged(QWindow *window); void renderFrame(); void setSurfaceTextureClient(void* surface_texture_client); private: QWindow *createOffscreenWindow(const QSurfaceFormat &format); static void handleFrameReady(GstMirSink *sink, gpointer renderer); static void handleSetSurfaceTextureClient(GstMirSink *sink, gpointer surface_texture_client, gpointer renderer); static GstPadProbeReturn padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer userData); GstElement *m_videoSink; QPointer m_surface; QPointer m_glSurface; QGLContext *m_context; QOpenGLContext *m_glContext; unsigned int m_textureId; QWindow *m_offscreenSurface; QGstreamerPlayerSession *m_playerSession; QGstreamerMirTextureBuffer *m_textureBuffer; QSize m_nativeSize; SurfaceTextureClientHybris m_surfaceTextureClient; QMutex m_mutex; }; QT_END_NAMESPACE #endif // QGSTREAMERMIRTEXTURERENDRER_H qgstreamervideoinputdevicecontrol_p.h000066400000000000000000000052721225012771600405520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOINPUTDEVICECONTROL_H #define QGSTREAMERVIDEOINPUTDEVICECONTROL_H #include #include QT_BEGIN_NAMESPACE class QGstreamerVideoInputDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT public: QGstreamerVideoInputDeviceControl(QObject *parent); ~QGstreamerVideoInputDeviceControl(); int deviceCount() const; QString deviceName(int index) const; QString deviceDescription(int index) const; int defaultDevice() const; int selectedDevice() const; public Q_SLOTS: void setSelectedDevice(int index); private: void update(); int m_selectedDevice; QStringList m_names; QStringList m_descriptions; }; QT_END_NAMESPACE #endif // QGSTREAMERAUDIOINPUTDEVICECONTROL_H qgstreamervideooverlay_p.h000066400000000000000000000066461225012771600363210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOOVERLAY_H #define QGSTREAMERVIDEOOVERLAY_H #include #include "qgstreamervideorendererinterface_p.h" QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QX11VideoSurface; class QGstreamerVideoOverlay : public QVideoWindowControl, public QGstreamerVideoRendererInterface { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface) public: QGstreamerVideoOverlay(QObject *parent = 0); ~QGstreamerVideoOverlay(); WId winId() const; void setWinId(WId id); QRect displayRect() const; void setDisplayRect(const QRect &rect); bool isFullScreen() const; void setFullScreen(bool fullScreen); QSize nativeSize() const; Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); void repaint(); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); QAbstractVideoSurface *surface() const; GstElement *videoSink(); bool isReady() const { return winId() != 0; } signals: void sinkChanged(); void readyChanged(bool); private slots: void surfaceFormatChanged(); private: void setScaledDisplayRect(); QX11VideoSurface *m_surface; GstElement *m_videoSink; Qt::AspectRatioMode m_aspectRatioMode; QRect m_displayRect; bool m_fullScreen; }; QT_END_NAMESPACE #endif qgstreamervideoprobecontrol_p.h000066400000000000000000000053501225012771600373370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOPROBECONTROL_H #define QGSTREAMERVIDEOPROBECONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QGstreamerVideoProbeControl : public QMediaVideoProbeControl { Q_OBJECT public: explicit QGstreamerVideoProbeControl(QObject *parent); virtual ~QGstreamerVideoProbeControl(); #if GST_CHECK_VERSION(1,0,0) void bufferProbed(GstBuffer* buffer, GstCaps*); #else void bufferProbed(GstBuffer* buffer); #endif void startFlushing(); void stopFlushing(); private slots: void frameProbed(); private: bool m_flushing; bool m_frameProbed; // true if at least one frame was probed QVideoFrame m_pendingFrame; QMutex m_frameMutex; }; QT_END_NAMESPACE #endif // QGSTREAMERVIDEOPROBECONTROL_H qgstreamervideorenderer_p.h000066400000000000000000000056001225012771600364330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEORENDERER_H #define QGSTREAMERVIDEORENDERER_H #include #include #include #include "qgstreamervideorendererinterface_p.h" QT_BEGIN_NAMESPACE class QGstreamerVideoRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface) public: QGstreamerVideoRenderer(QObject *parent = 0); virtual ~QGstreamerVideoRenderer(); QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); GstElement *videoSink(); void stopRenderer(); bool isReady() const { return m_surface != 0; } signals: void sinkChanged(); void readyChanged(bool); private slots: void handleFormatChange(); private: QVideoSurfaceGstSink *m_videoSink; QPointer m_surface; }; QT_END_NAMESPACE #endif // QGSTREAMERVIDEORENDRER_H qgstreamervideorendererinterface_p.h000066400000000000000000000055241225012771600403210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOOUTPUTCONTROL_H #define QGSTREAMERVIDEOOUTPUTCONTROL_H #include #include QT_BEGIN_NAMESPACE class QGstreamerVideoRendererInterface { public: virtual ~QGstreamerVideoRendererInterface(); virtual GstElement *videoSink() = 0; //stopRenderer() is called when the renderer element is stopped. //it can be reimplemented when video renderer can't detect //changes to NULL state but has to free video resources. virtual void stopRenderer() {} //the video output is configured, usually after the first paint event //(winId is known, virtual bool isReady() const { return true; } //signals: //void sinkChanged(); //void readyChanged(bool); }; #define QGstreamerVideoRendererInterface_iid "org.qt-project.qt.gstreamervideorenderer/5.0" Q_DECLARE_INTERFACE(QGstreamerVideoRendererInterface, QGstreamerVideoRendererInterface_iid) QT_END_NAMESPACE #endif qgstreamervideowidget_p.h000066400000000000000000000071721225012771600361160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOWIDGET_H #define QGSTREAMERVIDEOWIDGET_H #include #include "qgstreamervideorendererinterface_p.h" #include QT_BEGIN_NAMESPACE class QGstreamerVideoWidget; class QGstreamerVideoWidgetControl : public QVideoWidgetControl , public QGstreamerVideoRendererInterface , public QGstreamerSyncMessageFilter , public QGstreamerBusMessageFilter { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface QGstreamerSyncMessageFilter QGstreamerBusMessageFilter) public: QGstreamerVideoWidgetControl(QObject *parent = 0); virtual ~QGstreamerVideoWidgetControl(); GstElement *videoSink(); QWidget *videoWidget(); Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); bool isFullScreen() const; void setFullScreen(bool fullScreen); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); void setOverlay(); bool eventFilter(QObject *object, QEvent *event); bool processSyncMessage(const QGstreamerMessage &message); bool processBusMessage(const QGstreamerMessage &message); public slots: void updateNativeVideoSize(); signals: void sinkChanged(); void readyChanged(bool); private: void createVideoWidget(); void windowExposed(); GstElement *m_videoSink; QGstreamerVideoWidget *m_widget; WId m_windowId; Qt::AspectRatioMode m_aspectRatioMode; bool m_fullScreen; }; QT_END_NAMESPACE #endif // QGSTREAMERVIDEOWIDGET_H qgstreamervideowindow_p.h000066400000000000000000000103021225012771600361270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTREAMERVIDEOWINDOW_H #define QGSTREAMERVIDEOWINDOW_H #include #include "qgstreamervideorendererinterface_p.h" #include #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QX11VideoSurface; class QGstreamerVideoWindow : public QVideoWindowControl, public QGstreamerVideoRendererInterface, public QGstreamerSyncMessageFilter { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface QGstreamerSyncMessageFilter) Q_PROPERTY(QColor colorKey READ colorKey WRITE setColorKey) Q_PROPERTY(bool autopaintColorKey READ autopaintColorKey WRITE setAutopaintColorKey) public: QGstreamerVideoWindow(QObject *parent = 0, const char *elementName = 0); ~QGstreamerVideoWindow(); WId winId() const; void setWinId(WId id); QRect displayRect() const; void setDisplayRect(const QRect &rect); bool isFullScreen() const; void setFullScreen(bool fullScreen); QSize nativeSize() const; Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); QColor colorKey() const; void setColorKey(const QColor &); bool autopaintColorKey() const; void setAutopaintColorKey(bool); void repaint(); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); QAbstractVideoSurface *surface() const; GstElement *videoSink(); bool processSyncMessage(const QGstreamerMessage &message); bool isReady() const { return m_windowId != 0; } signals: void sinkChanged(); void readyChanged(bool); private slots: void updateNativeVideoSize(); private: #if GST_CHECK_VERSION(1,0,0) static GstPadProbeReturn padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer user_data); #else static void padBufferProbe(GstPad *pad, GstBuffer *buffer, gpointer user_data); #endif GstElement *m_videoSink; WId m_windowId; Qt::AspectRatioMode m_aspectRatioMode; QRect m_displayRect; bool m_fullScreen; QSize m_nativeSize; mutable QColor m_colorKey; int m_bufferProbeId; }; QT_END_NAMESPACE #endif qgstutils_p.h000066400000000000000000000061231225012771600335430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTUTILS_P_H #define QGSTUTILS_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include QT_BEGIN_NAMESPACE class QSize; class QVariant; class QByteArray; namespace QGstUtils { QMap gstTagListToMap(const GstTagList *list); QSize capsResolution(const GstCaps *caps); QSize capsCorrectedResolution(const GstCaps *caps); QAudioFormat audioFormatForCaps(const GstCaps *caps); #if GST_CHECK_VERSION(1,0,0) QAudioFormat audioFormatForSample(GstSample *sample); #else QAudioFormat audioFormatForBuffer(GstBuffer *buffer); #endif GstCaps *capsForAudioFormat(QAudioFormat format); void initializeGst(); QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList &codecs, const QSet &supportedMimeTypeSet); } QT_END_NAMESPACE #endif qgstvideobuffer_p.h000066400000000000000000000056431225012771600347110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTVIDEOBUFFER_P_H #define QGSTVIDEOBUFFER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include QT_BEGIN_NAMESPACE class QGstVideoBuffer : public QAbstractVideoBuffer { public: QGstVideoBuffer(GstBuffer *buffer, int bytesPerLine); QGstVideoBuffer(GstBuffer *buffer, int bytesPerLine, HandleType handleType, const QVariant &handle); ~QGstVideoBuffer(); MapMode mapMode() const; uchar *map(MapMode mode, int *numBytes, int *bytesPerLine); void unmap(); QVariant handle() const { return m_handle; } private: GstBuffer *m_buffer; int m_bytesPerLine; MapMode m_mode; QVariant m_handle; #if GST_CHECK_VERSION(1,0,0) GstMapInfo m_mapInfo; #endif }; QT_END_NAMESPACE #endif qgstxvimagebuffer_p.h000066400000000000000000000107411225012771600352360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGSTXVIMAGEBUFFER_P_H #define QGSTXVIMAGEBUFFER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qgstbufferpoolinterface_p.h" QT_BEGIN_NAMESPACE class QGstXvImageBufferPool; struct QGstXvImageBuffer { GstBuffer buffer; QGstXvImageBufferPool *pool; XvImage *xvImage; XShmSegmentInfo shmInfo; bool markedForDeletion; static GType get_type(void); static void class_init(gpointer g_class, gpointer class_data); static void buffer_init(QGstXvImageBuffer *xvimage, gpointer g_class); static void buffer_finalize(QGstXvImageBuffer * xvimage); #if !GST_CHECK_VERSION(1,0,0) static GstBufferClass *parent_class; #endif }; QT_END_NAMESPACE Q_DECLARE_METATYPE(XvImage*) QT_BEGIN_NAMESPACE class QGstXvImageBufferPool : public QObject, public QGstBufferPoolInterface { Q_OBJECT Q_INTERFACES(QGstBufferPoolInterface) friend class QGstXvImageBuffer; public: QGstXvImageBufferPool(QObject *parent = 0); virtual ~QGstXvImageBufferPool(); bool isFormatSupported(const QVideoSurfaceFormat &format) const; GType bufferType() const; GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps); void clear(); QAbstractVideoBuffer::HandleType handleType() const; QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine); virtual QStringList keys() const; private slots: void queuedAlloc(); void queuedDestroy(); void doClear(); void recycleBuffer(QGstXvImageBuffer *); void destroyBuffer(QGstXvImageBuffer *); private: void doAlloc(); Display *display() const; struct XvShmImage { XvImage *xvImage; XShmSegmentInfo shmInfo; }; QMutex m_poolMutex; QMutex m_allocMutex; QWaitCondition m_allocWaitCondition; QMutex m_destroyMutex; QVideoSurfaceFormat m_format; GstCaps *m_caps; QList m_pool; QList m_allBuffers; QList m_imagesToDestroy; Qt::HANDLE m_threadId; }; QT_END_NAMESPACE #endif qvideosurfacegstsink_p.h000066400000000000000000000142401225012771600357460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIDEOSURFACEGSTSINK_P_H #define VIDEOSURFACEGSTSINK_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include #include #include #include "qgstbufferpoolinterface_p.h" QT_BEGIN_NAMESPACE class QAbstractVideoSurface; #ifdef HAVE_XVIDEO class QGstXvImageBuffer; class QGstXvImageBufferPool; #endif class QVideoSurfaceGstDelegate : public QObject { Q_OBJECT public: QVideoSurfaceGstDelegate(QAbstractVideoSurface *surface); ~QVideoSurfaceGstDelegate(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; QVideoSurfaceFormat surfaceFormat() const; bool start(const QVideoSurfaceFormat &format, int bytesPerLine); void stop(); bool isActive(); QGstBufferPoolInterface *pool() { return m_pool; } QMutex *poolMutex() { return &m_poolMutex; } void clearPoolBuffers(); GstFlowReturn render(GstBuffer *buffer); GstBuffer *lastPrerolledBuffer() const { return m_lastPrerolledBuffer; } void setLastPrerolledBuffer(GstBuffer *lastPrerolledBuffer); // set prerolledBuffer to 0 to discard prerolled buffer private slots: void queuedStart(); void queuedStop(); void queuedRender(); void updateSupportedFormats(); private: QPointer m_surface; QList m_supportedPixelFormats; //pixel formats of buffers pool native type QList m_supportedPoolPixelFormats; QGstBufferPoolInterface *m_pool; QList m_pools; QMutex m_poolMutex; QMutex m_mutex; QWaitCondition m_setupCondition; QWaitCondition m_renderCondition; QVideoSurfaceFormat m_format; QVideoFrame m_frame; GstFlowReturn m_renderReturn; // this pointer is not 0 when there is a prerolled buffer waiting to be displayed GstBuffer *m_lastPrerolledBuffer; int m_bytesPerLine; bool m_started; bool m_startCanceled; }; class QVideoSurfaceGstSink { public: GstVideoSink parent; static QVideoSurfaceGstSink *createSink(QAbstractVideoSurface *surface); static QVideoSurfaceFormat formatForCaps(GstCaps *caps, int *bytesPerLine = 0, QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle); static void setFrameTimeStamps(QVideoFrame *frame, GstBuffer *buffer); static void handleShowPrerollChange(GObject *o, GParamSpec *p, gpointer d); private: static GType get_type(); static void class_init(gpointer g_class, gpointer class_data); static void base_init(gpointer g_class); static void instance_init(GTypeInstance *instance, gpointer g_class); static void finalize(GObject *object); static GstStateChangeReturn change_state(GstElement *element, GstStateChange transition); static GstCaps *get_caps(GstBaseSink *sink #if GST_CHECK_VERSION(1,0,0) , GstCaps* /*filterCaps*/ #endif ); static gboolean set_caps(GstBaseSink *sink, GstCaps *caps); static GstFlowReturn buffer_alloc( GstBaseSink *sink, guint64 offset, guint size, GstCaps *caps, GstBuffer **buffer); static gboolean start(GstBaseSink *sink); static gboolean stop(GstBaseSink *sink); static gboolean unlock(GstBaseSink *sink); static gboolean event(GstBaseSink *sink, GstEvent *event); static GstFlowReturn preroll(GstBaseSink *sink, GstBuffer *buffer); static GstFlowReturn render(GstBaseSink *sink, GstBuffer *buffer); private: QVideoSurfaceGstDelegate *delegate; GstCaps *lastRequestedCaps; GstCaps *lastBufferCaps; QVideoSurfaceFormat *lastSurfaceFormat; }; class QVideoSurfaceGstSinkClass { public: GstVideoSinkClass parent_class; }; QT_END_NAMESPACE #endif qx11videosurface_p.h000066400000000000000000000073101225012771600346750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/gsttools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QX11VIDEOSURFACE_H #define QX11VIDEOSURFACE_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QX11VideoSurface : public QAbstractVideoSurface { Q_OBJECT public: QX11VideoSurface(QObject *parent = 0); ~QX11VideoSurface(); WId winId() const; void setWinId(WId id); QRect displayRect() const; void setDisplayRect(const QRect &rect); QRect viewport() const; void setViewport(const QRect &rect); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); private: Display *display() const; WId m_winId; XvPortID m_portId; GC m_gc; XvImage *m_image; QList m_supportedPixelFormats; QVector m_formatIds; QRect m_viewport; QRect m_displayRect; QPair m_brightnessRange; QPair m_contrastRange; QPair m_hueRange; QPair m_saturationRange; bool findPort(); void querySupportedFormats(); int getAttribute(const char *attribute, int minimum, int maximum) const; void setAttribute(const char *attribute, int value, int minimum, int maximum); static int redistribute(int value, int fromLower, int fromUpper, int toLower, int toUpper); }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/multimedia.pro000066400000000000000000000034301225012771600303740ustar00rootroot00000000000000TARGET = QtMultimedia QT = core-private network gui QMAKE_DOCS = $$PWD/doc/qtmultimedia.qdocconf load(qt_module) INCLUDEPATH *= . PRIVATE_HEADERS += \ qmediacontrol_p.h \ qmediaobject_p.h \ qmediapluginloader_p.h \ qmediaservice_p.h \ qmediaserviceprovider_p.h \ qmediaresourcepolicyplugin_p.h \ qmediaresourcepolicy_p.h \ qmediaresourceset_p.h PUBLIC_HEADERS += \ qmediabindableinterface.h \ qmediacontrol.h \ qmediaenumdebug.h \ qmediametadata.h \ qmediaobject.h \ qmediaservice.h \ qmediaserviceproviderplugin.h \ qmediatimerange.h \ qmultimedia.h \ qtmultimediadefs.h \ SOURCES += \ qmediabindableinterface.cpp \ qmediacontrol.cpp \ qmediametadata.cpp \ qmediaobject.cpp \ qmediapluginloader.cpp \ qmediaservice.cpp \ qmediaserviceprovider.cpp \ qmediatimerange.cpp \ qmediaresourcepolicyplugin_p.cpp \ qmediaresourcepolicy_p.cpp \ qmediaresourceset_p.cpp \ qmultimedia.cpp include(audio/audio.pri) include(camera/camera.pri) include(controls/controls.pri) include(playback/playback.pri) include(radio/radio.pri) include(recording/recording.pri) include(video/video.pri) ANDROID_BUNDLED_JAR_DEPENDENCIES = \ jar/QtMultimedia-bundled.jar:org.qtproject.qt5.android.multimedia.QtAndroidMediaPlayer ANDROID_JAR_DEPENDENCIES = \ jar/QtMultimedia.jar:org.qtproject.qt5.android.multimedia.QtAndroidMediaPlayer ANDROID_LIB_DEPENDENCIES = \ plugins/mediaservice/libandroidmediaplayer.so \ lib/libQt5MultimediaQuick_p.so:Qt5Quick ANDROID_BUNDLED_FILES += \ lib/libQt5MultimediaQuick_p.so MODULE_PLUGIN_TYPES = \ mediaservice mac { LIBS += -framework AppKit -framework QuartzCore -framework QTKit } win32:LIBS += -luuid HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/000077500000000000000000000000001225012771600273065ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/playback.pri000066400000000000000000000014331225012771600316110ustar00rootroot00000000000000INCLUDEPATH += playback PUBLIC_HEADERS += \ playback/qmediacontent.h \ playback/qmediaplayer.h \ playback/qmediaplaylist.h \ playback/qmediaresource.h PRIVATE_HEADERS += \ playback/qmediaplaylist_p.h \ playback/qmediaplaylistprovider_p.h \ playback/qmediaplaylistioplugin_p.h \ playback/qmediaplaylistnavigator_p.h \ playback/qmedianetworkplaylistprovider_p.h \ playback/playlistfileparser_p.h SOURCES += \ playback/qmedianetworkplaylistprovider.cpp \ playback/qmediacontent.cpp \ playback/qmediaplayer.cpp \ playback/qmediaplaylist.cpp \ playback/qmediaplaylistioplugin.cpp \ playback/qmediaplaylistnavigator.cpp \ playback/qmediaplaylistprovider.cpp \ playback/qmediaresource.cpp \ playback/playlistfileparser.cpp playlistfileparser.cpp000066400000000000000000000465701225012771600336650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "playlistfileparser_p.h" #include #include #include "qmediaobject_p.h" #include "qmediametadata.h" QT_BEGIN_NAMESPACE namespace { class ParserBase : public QObject { Q_OBJECT public: ParserBase(QObject *parent) : QObject(parent) { } virtual void parseLine(int lineIndex, const QString& line, const QUrl& root) = 0; Q_SIGNALS: void newItem(const QVariant& content); void finished(); void error(QPlaylistFileParser::ParserError err, const QString& errorMsg); }; class M3UParser : public ParserBase { public: M3UParser(QObject *parent) : ParserBase(parent) , m_extendedFormat(false) { } /* * Extended M3U directives #EXTM3U - header - must be first line of file #EXTINF - extra info - length (seconds), title #EXTINF - extra info - length (seconds), artist '-' title Example #EXTM3U #EXTINF:123, Sample artist - Sample title C:\Documents and Settings\I\My Music\Sample.mp3 #EXTINF:321,Example Artist - Example title C:\Documents and Settings\I\My Music\Greatest Hits\Example.ogg */ void parseLine(int lineIndex, const QString& line, const QUrl& root) { if (line[0] == '#' ) { if (m_extendedFormat) { if (line.startsWith(QLatin1String("#EXTINF:"))) { m_extraInfo.clear(); int artistStart = line.indexOf(QLatin1String(","), 8); bool ok = false; int length = line.mid(8, artistStart < 8 ? -1 : artistStart - 8).trimmed().toInt(&ok); if (ok && length > 0) { //convert from second to milisecond m_extraInfo[QMediaMetaData::Duration] = QVariant(length * 1000); } if (artistStart > 0) { int titleStart = getSplitIndex(line, artistStart); if (titleStart > artistStart) { m_extraInfo[QMediaMetaData::Author] = line.mid(artistStart + 1, titleStart - artistStart - 1).trimmed(). replace(QLatin1String("--"), QLatin1String("-")); m_extraInfo[QMediaMetaData::Title] = line.mid(titleStart + 1).trimmed(). replace(QLatin1String("--"), QLatin1String("-")); } else { m_extraInfo[QMediaMetaData::Title] = line.mid(artistStart + 1).trimmed(). replace(QLatin1String("--"), QLatin1String("-")); } } } } else if (lineIndex == 0 && line.startsWith(QLatin1String("#EXTM3U"))) { m_extendedFormat = true; } } else { m_extraInfo[QLatin1String("url")] = expandToFullPath(root, line); emit newItem(QVariant(m_extraInfo)); m_extraInfo.clear(); } } int getSplitIndex(const QString& line, int startPos) { if (startPos < 0) startPos = 0; const QChar* buf = line.data(); for (int i = startPos; i < line.length(); ++i) { if (buf[i] == '-') { if (i == line.length() - 1) return i; ++i; if (buf[i] != '-') return i - 1; } } return -1; } QUrl expandToFullPath(const QUrl& root, const QString& line) { // On Linux, backslashes are not converted to forward slashes :/ if (line.startsWith(QLatin1String("//")) || line.startsWith(QLatin1String("\\\\"))) { // Network share paths are not resolved return QUrl::fromLocalFile(line); } QUrl url(line); if (url.scheme().isEmpty()) { // Resolve it relative to root if (root.isLocalFile()) return root.resolved(QUrl::fromLocalFile(line)); else return root.resolved(url); } else if (url.scheme().length() == 1) { // Assume it's a drive letter for a Windows path url = QUrl::fromLocalFile(line); } return url; } private: bool m_extendedFormat; QVariantMap m_extraInfo; }; class PLSParser : public ParserBase { public: PLSParser(QObject *parent) : ParserBase(parent) , m_state(Header) , m_count(0) , m_readFlags(0) { } enum ReadFlags { FileRead = 0x1, TitleRead = 0x2, LengthRead = 0x4, All = FileRead | TitleRead | LengthRead }; enum State { Header, Track, Footer }; /* * The format is essentially that of an INI file structured as follows: Header * [playlist] : This tag indicates that it is a Playlist File Track Entry Assuming track entry #X * FileX : Variable defining location of stream. * TitleX : Defines track title. * LengthX : Length in seconds of track. Value of -1 indicates indefinite. Footer * NumberOfEntries : This variable indicates the number of tracks. * Version : Playlist version. Currently only a value of 2 is valid. [playlist] File1=Alternative\everclear - SMFTA.mp3 Title1=Everclear - So Much For The Afterglow Length1=233 File2=http://www.site.com:8000/listen.pls Title2=My Cool Stream Length5=-1 NumberOfEntries=2 Version=2 */ inline bool containsFlag(const ReadFlags& flag) { return (m_readFlags & int(flag)) == flag; } inline void setFlag(const ReadFlags& flag) { m_readFlags |= int(flag); } void parseLine(int lineIndex, const QString& line, const QUrl&) { switch (m_state) { case Header: if (line == QLatin1String("[playlist]")) { m_state = Track; setCount(1); } break; case Track: if (!containsFlag(FileRead) && line.startsWith(m_fileName)) { m_item[QLatin1String("url")] = getValue(lineIndex, line); setFlag(FileRead); } else if (!containsFlag(TitleRead) && line.startsWith(m_titleName)) { m_item[QMediaMetaData::Title] = getValue(lineIndex, line); setFlag(TitleRead); } else if (!containsFlag(LengthRead) && line.startsWith(m_lengthName)) { //convert from seconds to miliseconds int length = getValue(lineIndex, line).toInt(); if (length > 0) m_item[QMediaMetaData::Duration] = length * 1000; setFlag(LengthRead); } else if (line.startsWith(QLatin1String("NumberOfEntries"))) { m_state = Footer; int entries = getValue(lineIndex, line).toInt(); int count = m_readFlags == 0 ? (m_count - 1) : m_count; if (entries != count) { emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist: %1, expected count = %2")). arg(line, QString::number(count))); } break; } if (m_readFlags == int(All)) { emit newItem(m_item); setCount(m_count + 1); } break; case Footer: if (line.startsWith(QLatin1String("Version"))) { int version = getValue(lineIndex, line).toInt(); if (version != 2) emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist at line[%1], expected version = 2")).arg(line)); } break; } } QString getValue(int lineIndex, const QString& line) { int start = line.indexOf('='); if (start < 0) { emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist at line[%1]:%2")).arg(QString::number(lineIndex), line)); return QString(); } return line.mid(start + 1).trimmed(); } void setCount(int count) { m_count = count; m_fileName = QString(tr("File%1")).arg(count); m_titleName = QString(tr("Title%1")).arg(count); m_lengthName = QString(tr("Length%1")).arg(count); m_item.clear(); m_readFlags = 0; } private: State m_state; int m_count; QString m_titleName; QString m_fileName; QString m_lengthName; QVariantMap m_item; int m_readFlags; }; } ///////////////////////////////////////////////////////////////////////////////////////////////// class QPlaylistFileParserPrivate : public QObject { Q_OBJECT Q_DECLARE_NON_CONST_PUBLIC(QPlaylistFileParser) public: QPlaylistFileParserPrivate() : m_source(0) , m_scanIndex(0) , m_utf8(false) , m_lineIndex(-1) , m_type(QPlaylistFileParser::UNKNOWN) , m_currentParser(0) { } void _q_handleData(); void _q_handleError(); void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg); void _q_handleParserFinished(); QNetworkReply *m_source; QByteArray m_buffer; int m_scanIndex; QUrl m_root; bool m_utf8; int m_lineIndex; QPlaylistFileParser::FileType m_type; ParserBase *m_currentParser; QNetworkAccessManager m_mgr; QPlaylistFileParser *q_ptr; private: void processLine(int startIndex, int length); }; #define LINE_LIMIT 4096 #define READ_LIMIT 64 void QPlaylistFileParserPrivate::processLine(int startIndex, int length) { Q_Q(QPlaylistFileParser); m_lineIndex++; if (!m_currentParser) { Q_ASSERT(!m_currentParser); QString mimeType = m_source->header(QNetworkRequest::ContentTypeHeader).toString(); m_type = QPlaylistFileParser::findPlaylistType(m_root.toString(), mimeType, m_buffer.constData(), m_buffer.size()); switch (m_type) { case QPlaylistFileParser::UNKNOWN: emit q->error(QPlaylistFileParser::FormatError, QString(tr("%1 playlist type is unknown")).arg(m_root.toString())); q->stop(); return; case QPlaylistFileParser::M3U: m_currentParser = new M3UParser(this); break; case QPlaylistFileParser::M3U8: m_currentParser = new M3UParser(this); m_utf8 = true; break; case QPlaylistFileParser::PLS: m_currentParser = new PLSParser(this); break; } Q_ASSERT(m_currentParser); connect(m_currentParser, SIGNAL(newItem(QVariant)), q, SIGNAL(newItem(QVariant))); connect(m_currentParser, SIGNAL(finished()), q, SLOT(_q_handleParserFinished())); connect(m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError, QString)), q, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError, QString))); } QString line; if (m_utf8) { line = QString::fromUtf8(m_buffer.constData() + startIndex, length).trimmed(); } else { line = QString::fromLatin1(m_buffer.constData() + startIndex, length).trimmed(); } if (line.isEmpty()) return; Q_ASSERT(m_currentParser); m_currentParser->parseLine(m_lineIndex, line, m_root); } void QPlaylistFileParserPrivate::_q_handleData() { Q_Q(QPlaylistFileParser); while (m_source->bytesAvailable()) { int expectedBytes = qMin(READ_LIMIT, int(qMin(m_source->bytesAvailable(), qint64(LINE_LIMIT - m_buffer.size())))); m_buffer.push_back(m_source->read(expectedBytes)); int processedBytes = 0; while (m_scanIndex < m_buffer.length()) { char s = m_buffer[m_scanIndex]; if (s == '\r' || s == '\n') { int l = m_scanIndex - processedBytes; if (l > 0) processLine(processedBytes, l); processedBytes = m_scanIndex + 1; if (!m_source) { //some error happened, so exit parsing return; } } m_scanIndex++; } if (m_buffer.length() - processedBytes >= LINE_LIMIT) { qWarning() << "error parsing playlist["<< m_root << "] with line content >= 4096 bytes."; emit q->error(QPlaylistFileParser::FormatError, tr("invalid line in playlist file")); q->stop(); return; } if (m_source->isFinished() && !m_source->bytesAvailable()) { //last line processLine(processedBytes, -1); break; } Q_ASSERT(m_buffer.length() == m_scanIndex); if (processedBytes == 0) continue; int copyLength = m_buffer.length() - processedBytes; if (copyLength > 0) { Q_ASSERT(copyLength <= READ_LIMIT); m_buffer = m_buffer.right(copyLength); } else { m_buffer.clear(); } m_scanIndex = 0; } if (m_source->isFinished()) { _q_handleParserFinished(); } } void QPlaylistFileParserPrivate::_q_handleError() { Q_Q(QPlaylistFileParser); emit q->error(QPlaylistFileParser::NetworkError, m_source->errorString()); q->stop(); } void QPlaylistFileParserPrivate::_q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg) { Q_Q(QPlaylistFileParser); emit q->error(err, errorMsg); } void QPlaylistFileParserPrivate::_q_handleParserFinished() { Q_Q(QPlaylistFileParser); bool isParserValid = (m_currentParser != 0); if (!isParserValid) emit q->error(QPlaylistFileParser::FormatNotSupportedError, tr("Empty file provided")); q->stop(); if (isParserValid) emit q->finished(); } QPlaylistFileParser::QPlaylistFileParser(QObject *parent) :QObject(parent), d_ptr(new QPlaylistFileParserPrivate) { d_func()->q_ptr = this; } QPlaylistFileParser::FileType QPlaylistFileParser::findPlaylistType(const QString& uri, const QString& mime, const void *data, quint32 size) { if (!data || !size) return UNKNOWN; FileType uriType = UNKNOWN; QString suffix = QFileInfo(uri).suffix().toLower(); if (suffix == QLatin1String("m3u")) uriType = M3U; else if (suffix == QLatin1String("m3u8")) uriType = M3U8; else if (suffix == QLatin1String("pls")) uriType = PLS; FileType mimeType = UNKNOWN; if (mime == QLatin1String("text/uri-list") || mime == QLatin1String("audio/x-mpegurl") || mime == QLatin1String("audio/mpegurl")) mimeType = QPlaylistFileParser::M3U; else if (mime == QLatin1String("application/x-mpegURL") || mime == QLatin1String("application/vnd.apple.mpegurl")) mimeType = QPlaylistFileParser::M3U8; else if (mime == QLatin1String("audio/x-scpls")) mimeType = QPlaylistFileParser::PLS; FileType bufferType = UNKNOWN; if (size >= 7 && strncmp((const char*)data, "#EXTM3U", 7) == 0) bufferType = M3U; else if (size >= 10 && strncmp((const char*)data, "[playlist]", 10) == 0) bufferType = PLS; else { // Make sure every line is a text string quint32 n; for (n = 0; n < size; n++) if (!QChar(QLatin1Char(((const char*)data)[n])).isPrint()) break; if (n == size) bufferType = M3U; } if (bufferType == M3U && (uriType == M3U8 || mimeType == M3U8)) bufferType = M3U8; if (bufferType != UNKNOWN) return bufferType; if (uriType != UNKNOWN) return uriType; if (mimeType != UNKNOWN) return mimeType; return UNKNOWN; } void QPlaylistFileParser::start(const QNetworkRequest& request, bool utf8) { Q_D(QPlaylistFileParser); stop(); d->m_type = UNKNOWN; d->m_utf8 = utf8; d->m_root = request.url(); if (d->m_root.isLocalFile() && !QFile::exists(d->m_root.toLocalFile())) { emit error(NetworkError, QString(tr("%1 does not exist")).arg(d->m_root.toString())); return; } d->m_source = d->m_mgr.get(request); connect(d->m_source, SIGNAL(readyRead()), this, SLOT(_q_handleData())); connect(d->m_source, SIGNAL(finished()), this, SLOT(_q_handleData())); connect(d->m_source, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(_q_handleError())); d->_q_handleData(); } void QPlaylistFileParser::stop() { Q_D(QPlaylistFileParser); if (d->m_currentParser) { disconnect(d->m_currentParser, SIGNAL(newItem(QVariant)), this, SIGNAL(newItem(QVariant))); disconnect(d->m_currentParser, SIGNAL(finished()), this, SLOT(_q_handleParserFinished())); disconnect(d->m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError, QString)), this, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError, QString))); d->m_currentParser->deleteLater(); d->m_currentParser = 0; } d->m_buffer.clear(); d->m_scanIndex = 0; d->m_lineIndex = -1; if (d->m_source) { disconnect(d->m_source, SIGNAL(readyRead()), this, SLOT(_q_handleData())); disconnect(d->m_source, SIGNAL(finished()), this, SLOT(_q_handleData())); disconnect(d->m_source, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(_q_handleError())); d->m_source->deleteLater(); d->m_source = 0; } } #include "moc_playlistfileparser_p.cpp" #include "playlistfileparser.moc" QT_END_NAMESPACE playlistfileparser_p.h000066400000000000000000000067571225012771600336540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PLAYLISTFILEPARSER_P_H #define PLAYLISTFILEPARSER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include "qtmultimediadefs.h" QT_BEGIN_NAMESPACE class QPlaylistFileParserPrivate; class Q_MULTIMEDIA_EXPORT QPlaylistFileParser : public QObject { Q_OBJECT public: QPlaylistFileParser(QObject *parent = 0); enum FileType { UNKNOWN, M3U, M3U8, // UTF-8 version of M3U PLS }; enum ParserError { NoError, FormatError, FormatNotSupportedError, NetworkError }; static FileType findPlaylistType(const QString& uri, const QString& mime, const void *data, quint32 size); void start(const QNetworkRequest &request, bool utf8 = false); void stop(); Q_SIGNALS: void newItem(const QVariant& content); void finished(); void error(QPlaylistFileParser::ParserError err, const QString& errorMsg); protected: QPlaylistFileParserPrivate *d_ptr; private: Q_DISABLE_COPY(QPlaylistFileParser) Q_DECLARE_PRIVATE(QPlaylistFileParser) Q_PRIVATE_SLOT(d_func(), void _q_handleData()) Q_PRIVATE_SLOT(d_func(), void _q_handleError()) Q_PRIVATE_SLOT(d_func(), void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg)) Q_PRIVATE_SLOT(d_func(), void _q_handleParserFinished()) }; QT_END_NAMESPACE #endif // PLAYLISTFILEPARSER_P_H qmediacontent.cpp000066400000000000000000000200621225012771600325660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qmediacontent.h" QT_BEGIN_NAMESPACE namespace { class QMediaContentPrivateRegisterMetaTypes { public: QMediaContentPrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } class QMediaContentPrivate : public QSharedData { public: QMediaContentPrivate(): isPlaylistOwned(false) {} QMediaContentPrivate(const QMediaResourceList &r): resources(r), isPlaylistOwned(false) {} QMediaContentPrivate(const QMediaContentPrivate &other): QSharedData(other), resources(other.resources), playlist(other.playlist), isPlaylistOwned(false) {} QMediaContentPrivate(QMediaPlaylist *pls, const QUrl &url, bool isOwn): playlist(pls), isPlaylistOwned(isOwn) { resources << QMediaResource(url); } ~QMediaContentPrivate() { if (isPlaylistOwned && !playlist.isNull()) playlist.data()->deleteLater(); } bool operator ==(const QMediaContentPrivate &other) const { return resources == other.resources && playlist == other.playlist; } QMediaResourceList resources; QPointer playlist; bool isPlaylistOwned; private: QMediaContentPrivate& operator=(const QMediaContentPrivate &other); }; /*! \class QMediaContent \brief The QMediaContent class provides access to the resources relating to a media content. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback QMediaContent is used within the multimedia framework as the logical handle to media content. A QMediaContent object is composed of one or more \l {QMediaResource}s where each resource provides the URL and format information of a different encoding of the content. A non-null QMediaContent will always have a primary or canonical reference to the content available through the canonicalUrl() or canonicalResource() methods, any additional resources are optional. Alternatively QMediaContent can represent a playlist and contain a pointer to a valid QMediaPlaylist object. In this case URL is optional and can either be empty or point to the playlist URL. */ /*! Constructs a null QMediaContent. */ QMediaContent::QMediaContent() { } /*! Constructs a media content with \a url providing a reference to the content. */ QMediaContent::QMediaContent(const QUrl &url): d(new QMediaContentPrivate) { d->resources << QMediaResource(url); } /*! Constructs a media content with \a request providing a reference to the content. This constructor can be used to reference media content via network protocols such as HTTP. This may include additional information required to obtain the resource, such as Cookies or HTTP headers. */ QMediaContent::QMediaContent(const QNetworkRequest &request): d(new QMediaContentPrivate) { d->resources << QMediaResource(request); } /*! Constructs a media content with \a resource providing a reference to the content. */ QMediaContent::QMediaContent(const QMediaResource &resource): d(new QMediaContentPrivate) { d->resources << resource; } /*! Constructs a media content with \a resources providing a reference to the content. */ QMediaContent::QMediaContent(const QMediaResourceList &resources): d(new QMediaContentPrivate(resources)) { } /*! Constructs a copy of the media content \a other. */ QMediaContent::QMediaContent(const QMediaContent &other): d(other.d) { } /*! Constructs a media content with \a playlist. \a contentUrl of a playlist is an optional parameter and can be empty. Set \a takeOwnership to true if you want QMediaContent to take ownership of the playlist. \a takeOwnership is set to false by default. */ QMediaContent::QMediaContent(QMediaPlaylist *playlist, const QUrl &contentUrl, bool takeOwnership): d(new QMediaContentPrivate(playlist, contentUrl, takeOwnership)) { } /*! Destroys the media content object. */ QMediaContent::~QMediaContent() { } /*! Assigns the value of \a other to this media content. */ QMediaContent& QMediaContent::operator=(const QMediaContent &other) { d = other.d; return *this; } /*! Returns true if \a other is equivalent to this media content; false otherwise. */ bool QMediaContent::operator==(const QMediaContent &other) const { return (d.constData() == 0 && other.d.constData() == 0) || (d.constData() != 0 && other.d.constData() != 0 && *d.constData() == *other.d.constData()); } /*! Returns true if \a other is not equivalent to this media content; false otherwise. */ bool QMediaContent::operator!=(const QMediaContent &other) const { return !(*this == other); } /*! Returns true if this media content is null (uninitialized); false otherwise. */ bool QMediaContent::isNull() const { return d.constData() == 0; } /*! Returns a QUrl that represents that canonical resource for this media content. */ QUrl QMediaContent::canonicalUrl() const { return canonicalResource().url(); } /*! Returns a QNetworkRequest that represents that canonical resource for this media content. */ QNetworkRequest QMediaContent::canonicalRequest() const { return canonicalResource().request(); } /*! Returns a QMediaResource that represents that canonical resource for this media content. */ QMediaResource QMediaContent::canonicalResource() const { return d.constData() != 0 ? d->resources.value(0) : QMediaResource(); } /*! Returns a list of alternative resources for this media content. The first item in this list is always the canonical resource. */ QMediaResourceList QMediaContent::resources() const { return d.constData() != 0 ? d->resources : QMediaResourceList(); } /*! Returns a playlist for this media content or 0 if this QMediaContent is not a playlist. */ QMediaPlaylist *QMediaContent::playlist() const { return d.constData() != 0 ? d->playlist.data() : 0; } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/qmediacontent.h000066400000000000000000000062251225012771600323170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIACONTENT_H #define QMEDIACONTENT_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaPlaylist; class QMediaContentPrivate; class Q_MULTIMEDIA_EXPORT QMediaContent { public: QMediaContent(); QMediaContent(const QUrl &contentUrl); QMediaContent(const QNetworkRequest &contentRequest); QMediaContent(const QMediaResource &contentResource); QMediaContent(const QMediaResourceList &resources); QMediaContent(const QMediaContent &other); QMediaContent(QMediaPlaylist *playlist, const QUrl &contentUrl = QUrl(), bool takeOwnership = false); ~QMediaContent(); QMediaContent& operator=(const QMediaContent &other); bool operator==(const QMediaContent &other) const; bool operator!=(const QMediaContent &other) const; bool isNull() const; QUrl canonicalUrl() const; QNetworkRequest canonicalRequest() const; QMediaResource canonicalResource() const; QMediaResourceList resources() const; QMediaPlaylist *playlist() const; private: QSharedDataPointer d; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaContent) #endif // QMEDIACONTENT_H qmedianetworkplaylistprovider.cpp000066400000000000000000000171221225012771600361450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmedianetworkplaylistprovider_p.h" #include "qmediaplaylistprovider_p.h" #include "qmediacontent.h" #include "qmediaobject_p.h" #include "playlistfileparser_p.h" QT_BEGIN_NAMESPACE class QMediaNetworkPlaylistProviderPrivate: public QMediaPlaylistProviderPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaNetworkPlaylistProvider) public: bool load(const QNetworkRequest &request); QPlaylistFileParser parser; QList resources; void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString &); void _q_handleNewItem(const QVariant& content); QMediaNetworkPlaylistProvider *q_ptr; }; bool QMediaNetworkPlaylistProviderPrivate::load(const QNetworkRequest &request) { parser.stop(); parser.start(request, false); return true; } void QMediaNetworkPlaylistProviderPrivate::_q_handleParserError(QPlaylistFileParser::ParserError err, const QString &errorMessage) { Q_Q(QMediaNetworkPlaylistProvider); QMediaPlaylist::Error playlistError = QMediaPlaylist::NoError; switch ((QPlaylistFileParser::ParserError)err) { case QPlaylistFileParser::NoError: return; case QPlaylistFileParser::FormatError: playlistError = QMediaPlaylist::FormatError; break; case QPlaylistFileParser::FormatNotSupportedError: playlistError = QMediaPlaylist::FormatNotSupportedError; break; case QPlaylistFileParser::NetworkError: playlistError = QMediaPlaylist::NetworkError; break; } emit q->loadFailed(playlistError, errorMessage); } void QMediaNetworkPlaylistProviderPrivate::_q_handleNewItem(const QVariant& content) { Q_Q(QMediaNetworkPlaylistProvider); QUrl url; if (content.type() == QVariant::Url) { url = content.toUrl(); } else if (content.type() == QVariant::Map) { url = content.toMap()[QLatin1String("url")].toUrl(); } else { return; } q->addMedia(QMediaContent(url)); } QMediaNetworkPlaylistProvider::QMediaNetworkPlaylistProvider(QObject *parent) :QMediaPlaylistProvider(*new QMediaNetworkPlaylistProviderPrivate, parent) { d_func()->q_ptr = this; connect(&d_func()->parser, SIGNAL(newItem(const QVariant&)), this, SLOT(_q_handleNewItem(const QVariant&))); connect(&d_func()->parser, SIGNAL(finished()), this, SIGNAL(loaded())); connect(&d_func()->parser, SIGNAL(error(QPlaylistFileParser::ParserError, const QString &)), this, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError, const QString &))); } QMediaNetworkPlaylistProvider::~QMediaNetworkPlaylistProvider() { } bool QMediaNetworkPlaylistProvider::isReadOnly() const { return false; } bool QMediaNetworkPlaylistProvider::load(const QNetworkRequest &request, const char *format) { Q_UNUSED(format); return d_func()->load(request); } int QMediaNetworkPlaylistProvider::mediaCount() const { return d_func()->resources.size(); } QMediaContent QMediaNetworkPlaylistProvider::media(int pos) const { return d_func()->resources.value(pos); } bool QMediaNetworkPlaylistProvider::addMedia(const QMediaContent &content) { Q_D(QMediaNetworkPlaylistProvider); int pos = d->resources.count(); emit mediaAboutToBeInserted(pos, pos); d->resources.append(content); emit mediaInserted(pos, pos); return true; } bool QMediaNetworkPlaylistProvider::addMedia(const QList &items) { Q_D(QMediaNetworkPlaylistProvider); if (items.isEmpty()) return true; int pos = d->resources.count(); int end = pos+items.count()-1; emit mediaAboutToBeInserted(pos, end); d->resources.append(items); emit mediaInserted(pos, end); return true; } bool QMediaNetworkPlaylistProvider::insertMedia(int pos, const QMediaContent &content) { Q_D(QMediaNetworkPlaylistProvider); emit mediaAboutToBeInserted(pos, pos); d->resources.insert(pos, content); emit mediaInserted(pos,pos); return true; } bool QMediaNetworkPlaylistProvider::insertMedia(int pos, const QList &items) { Q_D(QMediaNetworkPlaylistProvider); if (items.isEmpty()) return true; const int last = pos+items.count()-1; emit mediaAboutToBeInserted(pos, last); for (int i=0; iresources.insert(pos+i, items.at(i)); emit mediaInserted(pos, last); return true; } bool QMediaNetworkPlaylistProvider::removeMedia(int fromPos, int toPos) { Q_D(QMediaNetworkPlaylistProvider); Q_ASSERT(fromPos >= 0); Q_ASSERT(fromPos <= toPos); Q_ASSERT(toPos < mediaCount()); emit mediaAboutToBeRemoved(fromPos, toPos); d->resources.erase(d->resources.begin()+fromPos, d->resources.begin()+toPos+1); emit mediaRemoved(fromPos, toPos); return true; } bool QMediaNetworkPlaylistProvider::removeMedia(int pos) { Q_D(QMediaNetworkPlaylistProvider); emit mediaAboutToBeRemoved(pos, pos); d->resources.removeAt(pos); emit mediaRemoved(pos, pos); return true; } bool QMediaNetworkPlaylistProvider::clear() { Q_D(QMediaNetworkPlaylistProvider); if (!d->resources.isEmpty()) { int lastPos = mediaCount()-1; emit mediaAboutToBeRemoved(0, lastPos); d->resources.clear(); emit mediaRemoved(0, lastPos); } return true; } void QMediaNetworkPlaylistProvider::shuffle() { Q_D(QMediaNetworkPlaylistProvider); if (!d->resources.isEmpty()) { QList resources; while (!d->resources.isEmpty()) { resources.append(d->resources.takeAt(qrand() % d->resources.size())); } d->resources = resources; emit mediaChanged(0, mediaCount()-1); } } #include "moc_qmedianetworkplaylistprovider_p.cpp" QT_END_NAMESPACE qmedianetworkplaylistprovider_p.h000066400000000000000000000067751225012771600361450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIANETWORKPAYLISTPROVIDER_P_H #define QMEDIANETWORKPAYLISTPROVIDER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qmediaplaylistprovider_p.h" QT_BEGIN_NAMESPACE class QMediaNetworkPlaylistProviderPrivate; class Q_MULTIMEDIA_EXPORT QMediaNetworkPlaylistProvider : public QMediaPlaylistProvider { Q_OBJECT public: QMediaNetworkPlaylistProvider(QObject *parent=0); virtual ~QMediaNetworkPlaylistProvider(); virtual bool load(const QNetworkRequest &request, const char *format = 0); virtual int mediaCount() const; virtual QMediaContent media(int pos) const; virtual bool isReadOnly() const; virtual bool addMedia(const QMediaContent &content); virtual bool addMedia(const QList &items); virtual bool insertMedia(int pos, const QMediaContent &content); virtual bool insertMedia(int pos, const QList &items); virtual bool removeMedia(int pos); virtual bool removeMedia(int start, int end); virtual bool clear(); public Q_SLOTS: virtual void shuffle(); private: Q_DISABLE_COPY(QMediaNetworkPlaylistProvider) Q_DECLARE_PRIVATE(QMediaNetworkPlaylistProvider) Q_PRIVATE_SLOT(d_func(), void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_handleNewItem(const QVariant& content)) }; QT_END_NAMESPACE #endif // QMEDIANETWORKPAYLISTSOURCE_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/qmediaplayer.cpp000066400000000000000000001176451225012771600325050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplayer.h" #include "qvideosurfaceoutput_p.h" #include "qmediaobject_p.h" #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QMediaPlayer \brief The QMediaPlayer class allows the playing of a media source. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback The QMediaPlayer class is a high level media playback class. It can be used to playback such content as songs, movies and internet radio. The content to playback is specified as a QMediaContent object, which can be thought of as a main or canonical URL with additional information attached. When provided with a QMediaContent playback may be able to commence. \snippet multimedia-snippets/media.cpp Player QVideoWidget can be used with QMediaPlayer for video rendering and QMediaPlaylist for accessing playlist functionality. \snippet multimedia-snippets/media.cpp Movie playlist Since QMediaPlayer is a QMediaObject, you can use several of the QMediaObject functions for things like: \list \li Accessing the currently playing media's metadata (\l {QMediaObject::metaData()} and \l {QMediaMetaData}{predefined meta-data keys}) \li Checking to see if the media playback service is currently available (\l {QMediaObject::availability()}) \endlist \sa QMediaObject, QMediaService, QVideoWidget, QMediaPlaylist */ namespace { class MediaPlayerRegisterMetaTypes { public: MediaPlayerRegisterMetaTypes() { qRegisterMetaType("QMediaPlayer::State"); qRegisterMetaType("QMediaPlayer::MediaStatus"); qRegisterMetaType("QMediaPlayer::Error"); } } _registerPlayerMetaTypes; } #define MAX_NESTED_PLAYLISTS 16 class QMediaPlayerPrivate : public QMediaObjectPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaPlayer) public: QMediaPlayerPrivate() : provider(0) , control(0) , state(QMediaPlayer::StoppedState) , error(QMediaPlayer::NoError) , playlist(0) , networkAccessControl(0) , nestedPlaylists(0) {} QMediaServiceProvider *provider; QMediaPlayerControl* control; QMediaPlayer::State state; QMediaPlayer::Error error; QString errorString; QPointer videoOutput; QMediaPlaylist *playlist; QMediaNetworkAccessControl *networkAccessControl; QVideoSurfaceOutput surfaceOutput; QMediaContent rootMedia; QMediaContent pendingPlaylist; QMediaPlaylist *parentPlaylist(QMediaPlaylist *pls); bool isInChain(QUrl url); int nestedPlaylists; void setPlaylist(QMediaPlaylist *playlist); void setPlaylistMedia(); void loadPlaylist(); void disconnectPlaylist(); void connectPlaylist(); void _q_stateChanged(QMediaPlayer::State state); void _q_mediaStatusChanged(QMediaPlayer::MediaStatus status); void _q_error(int error, const QString &errorString); void _q_updateMedia(const QMediaContent&); void _q_playlistDestroyed(); void _q_handlePlaylistLoaded(); void _q_handlePlaylistLoadFailed(); }; QMediaPlaylist *QMediaPlayerPrivate::parentPlaylist(QMediaPlaylist *pls) { // This function finds a parent playlist for an item in the active chain of playlists. // Every item in the chain comes from currentMedia() of its parent. // We don't need to travers the whole tree of playlists, // but only the subtree of active ones. for (QMediaPlaylist *current = rootMedia.playlist(); current && current != pls; current = current->currentMedia().playlist()) if (current->currentMedia().playlist() == pls) return current; return 0; } bool QMediaPlayerPrivate::isInChain(QUrl url) { // Check whether a URL is already in the chain of playlists. // Also see a comment in parentPlaylist(). for (QMediaPlaylist *current = rootMedia.playlist(); current && current != playlist; current = current->currentMedia().playlist()) if (current->currentMedia().canonicalUrl() == url) { return true; } return false; } void QMediaPlayerPrivate::_q_stateChanged(QMediaPlayer::State ps) { Q_Q(QMediaPlayer); // Backend switches into stopped state every time new media is about to be loaded. // If media player has a playlist loaded make sure player doesn' stop. if (playlist && playlist->currentIndex() != -1 && ps != state && ps == QMediaPlayer::StoppedState) { if (control->mediaStatus() == QMediaPlayer::EndOfMedia || control->mediaStatus() == QMediaPlayer::InvalidMedia) { // if media player is not stopped, and // we have finished playback for the current media, // advance to the next item in the playlist Q_ASSERT(state != QMediaPlayer::StoppedState); playlist->next(); return; } else if (control->mediaStatus() == QMediaPlayer::LoadingMedia) { return; } } if (ps != state) { state = ps; if (ps == QMediaPlayer::PlayingState) q->addPropertyWatch("position"); else q->removePropertyWatch("position"); emit q->stateChanged(ps); } } void QMediaPlayerPrivate::_q_mediaStatusChanged(QMediaPlayer::MediaStatus status) { Q_Q(QMediaPlayer); switch (status) { case QMediaPlayer::StalledMedia: case QMediaPlayer::BufferingMedia: q->addPropertyWatch("bufferStatus"); emit q->mediaStatusChanged(status); break; default: q->removePropertyWatch("bufferStatus"); emit q->mediaStatusChanged(status); break; } } void QMediaPlayerPrivate::_q_error(int error, const QString &errorString) { Q_Q(QMediaPlayer); if (error == int(QMediaPlayer::MediaIsPlaylist)) { loadPlaylist(); } else { this->error = QMediaPlayer::Error(error); this->errorString = errorString; emit q->error(this->error); if (playlist) playlist->next(); } } void QMediaPlayerPrivate::_q_updateMedia(const QMediaContent &media) { Q_Q(QMediaPlayer); if (!control) return; // check if the current playlist is a top-level playlist Q_ASSERT(playlist); if (media.isNull() && playlist != rootMedia.playlist()) { // switch back to parent playlist QMediaPlaylist *pls = parentPlaylist(playlist); Q_ASSERT(pls); disconnectPlaylist(); playlist = pls; connectPlaylist(); Q_ASSERT(!pendingPlaylist.playlist()); nestedPlaylists--; Q_ASSERT(nestedPlaylists >= 0); playlist->next(); return; } if (media.playlist()) { if (nestedPlaylists < MAX_NESTED_PLAYLISTS) { nestedPlaylists++; Q_ASSERT(!pendingPlaylist.playlist()); // disconnect current playlist disconnectPlaylist(); // new playlist signals are connected // in the call to setPlaylist() in _q_handlePlaylistLoaded() playlist = media.playlist(); emit q->currentMediaChanged(media); _q_handlePlaylistLoaded(); return; } else if (playlist) { playlist->next(); } return; } const QMediaPlayer::State currentState = state; control->setMedia(media, 0); if (!media.isNull()) { switch (currentState) { case QMediaPlayer::PlayingState: control->play(); break; case QMediaPlayer::PausedState: control->pause(); break; default: break; } } _q_stateChanged(control->state()); } void QMediaPlayerPrivate::_q_playlistDestroyed() { playlist = 0; if (!control) return; control->setMedia(QMediaContent(), 0); } void QMediaPlayerPrivate::setPlaylist(QMediaPlaylist *pls) { disconnectPlaylist(); playlist = pls; setPlaylistMedia(); } void QMediaPlayerPrivate::setPlaylistMedia() { // This function loads current playlist media into backend. // If current media is a playlist, the function recursively // loads media from the playlist. // It also makes sure the correct playlist signals are connected. Q_Q(QMediaPlayer); if (playlist) { connectPlaylist(); if (playlist->currentMedia().playlist()) { if (nestedPlaylists < MAX_NESTED_PLAYLISTS) { emit q->currentMediaChanged(playlist->currentMedia()); // rewind nested playlist to start playlist->currentMedia().playlist()->setCurrentIndex(0); nestedPlaylists++; setPlaylist(playlist->currentMedia().playlist()); } else { playlist->next(); } return; } else if (control != 0) { // If we've just switched to a new playlist, // then last emited currentMediaChanged was a playlist. // Make sure we emit currentMediaChanged if new playlist has // the same media as the previous one: // sample.m3u // test.wav -- processed by backend // nested.m3u -- processed by frontend // test.wav -- processed by backend, // media is not changed, // frontend needs to emit currentMediaChanged bool isSameMedia = (control->media() == playlist->currentMedia()); control->setMedia(playlist->currentMedia(), 0); if (isSameMedia) { emit q->currentMediaChanged(control->media()); } } } else { q->setMedia(QMediaContent(), 0); } } void QMediaPlayerPrivate::loadPlaylist() { Q_Q(QMediaPlayer); Q_ASSERT(pendingPlaylist.isNull()); // Do not load a playlist if there are more than MAX_NESTED_PLAYLISTS in the chain already, // or if the playlist URL is already in the chain, i.e. do not allow recursive playlists and loops. if (nestedPlaylists < MAX_NESTED_PLAYLISTS && !q->currentMedia().canonicalUrl().isEmpty() && !isInChain(q->currentMedia().canonicalUrl())) { pendingPlaylist = QMediaContent(new QMediaPlaylist, q->currentMedia().canonicalUrl(), true); QObject::connect(pendingPlaylist.playlist(), SIGNAL(loaded()), q, SLOT(_q_handlePlaylistLoaded())); QObject::connect(pendingPlaylist.playlist(), SIGNAL(loadFailed()), q, SLOT(_q_handlePlaylistLoadFailed())); pendingPlaylist.playlist()->load(pendingPlaylist.canonicalRequest()); } else if (playlist) { playlist->next(); } } void QMediaPlayerPrivate::disconnectPlaylist() { Q_Q(QMediaPlayer); if (playlist) { QObject::disconnect(playlist, SIGNAL(currentMediaChanged(QMediaContent)), q, SLOT(_q_updateMedia(QMediaContent))); QObject::disconnect(playlist, SIGNAL(destroyed()), q, SLOT(_q_playlistDestroyed())); } } void QMediaPlayerPrivate::connectPlaylist() { Q_Q(QMediaPlayer); if (playlist) { QObject::connect(playlist, SIGNAL(currentMediaChanged(QMediaContent)), q, SLOT(_q_updateMedia(QMediaContent))); QObject::connect(playlist, SIGNAL(destroyed()), q, SLOT(_q_playlistDestroyed())); } } void QMediaPlayerPrivate::_q_handlePlaylistLoaded() { Q_Q(QMediaPlayer); if (pendingPlaylist.playlist()) { Q_ASSERT(!q->currentMedia().playlist()); // if there is an active playlist if (playlist) { Q_ASSERT(playlist->currentIndex() >= 0); disconnectPlaylist(); playlist->insertMedia(playlist->currentIndex() + 1, pendingPlaylist); playlist->removeMedia(playlist->currentIndex()); nestedPlaylists++; } else { Q_ASSERT(!rootMedia.playlist()); rootMedia = pendingPlaylist; emit q->mediaChanged(rootMedia); } playlist = pendingPlaylist.playlist(); emit q->currentMediaChanged(pendingPlaylist); } pendingPlaylist = QMediaContent(); playlist->next(); setPlaylistMedia(); switch (state) { case QMediaPlayer::PausedState: control->pause(); break; case QMediaPlayer::PlayingState: control->play(); break; case QMediaPlayer::StoppedState: break; } } void QMediaPlayerPrivate::_q_handlePlaylistLoadFailed() { pendingPlaylist = QMediaContent(); if (!control) return; if (playlist) playlist->next(); else control->setMedia(QMediaContent(), 0); } static QMediaService *playerService(QMediaPlayer::Flags flags) { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (flags) { QMediaServiceProviderHint::Features features = 0; if (flags & QMediaPlayer::LowLatency) features |= QMediaServiceProviderHint::LowLatencyPlayback; if (flags & QMediaPlayer::StreamPlayback) features |= QMediaServiceProviderHint::StreamPlayback; if (flags & QMediaPlayer::VideoSurface) features |= QMediaServiceProviderHint::VideoSurface; return provider->requestService(Q_MEDIASERVICE_MEDIAPLAYER, QMediaServiceProviderHint(features)); } else return provider->requestService(Q_MEDIASERVICE_MEDIAPLAYER); } /*! Construct a QMediaPlayer instance parented to \a parent and with \a flags. */ QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): QMediaObject(*new QMediaPlayerPrivate, parent, playerService(flags)) { Q_D(QMediaPlayer); d->provider = QMediaServiceProvider::defaultServiceProvider(); if (d->service == 0) { d->error = ServiceMissingError; } else { d->control = qobject_cast(d->service->requestControl(QMediaPlayerControl_iid)); d->networkAccessControl = qobject_cast(d->service->requestControl(QMediaNetworkAccessControl_iid)); if (d->control != 0) { connect(d->control, SIGNAL(mediaChanged(QMediaContent)), SIGNAL(currentMediaChanged(QMediaContent))); connect(d->control, SIGNAL(stateChanged(QMediaPlayer::State)), SLOT(_q_stateChanged(QMediaPlayer::State))); connect(d->control, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), SLOT(_q_mediaStatusChanged(QMediaPlayer::MediaStatus))); connect(d->control, SIGNAL(error(int,QString)), SLOT(_q_error(int,QString))); connect(d->control, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(d->control, SIGNAL(positionChanged(qint64)), SIGNAL(positionChanged(qint64))); connect(d->control, SIGNAL(audioAvailableChanged(bool)), SIGNAL(audioAvailableChanged(bool))); connect(d->control, SIGNAL(videoAvailableChanged(bool)), SIGNAL(videoAvailableChanged(bool))); connect(d->control, SIGNAL(volumeChanged(int)), SIGNAL(volumeChanged(int))); connect(d->control, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); connect(d->control, SIGNAL(seekableChanged(bool)), SIGNAL(seekableChanged(bool))); connect(d->control, SIGNAL(playbackRateChanged(qreal)), SIGNAL(playbackRateChanged(qreal))); connect(d->control, SIGNAL(bufferStatusChanged(int)), SIGNAL(bufferStatusChanged(int))); if (d->control->state() == PlayingState) addPropertyWatch("position"); if (d->control->mediaStatus() == StalledMedia || d->control->mediaStatus() == BufferingMedia) addPropertyWatch("bufferStatus"); } if (d->networkAccessControl != 0) { connect(d->networkAccessControl, SIGNAL(configurationChanged(QNetworkConfiguration)), this, SIGNAL(networkConfigurationChanged(QNetworkConfiguration))); } } } /*! Destroys the player object. */ QMediaPlayer::~QMediaPlayer() { Q_D(QMediaPlayer); if (d->service) { if (d->control) d->service->releaseControl(d->control); d->provider->releaseService(d->service); } } QMediaContent QMediaPlayer::media() const { Q_D(const QMediaPlayer); return d->rootMedia; } /*! Returns the stream source of media data. This is only valid if a stream was passed to setMedia(). \sa setMedia() */ const QIODevice *QMediaPlayer::mediaStream() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->mediaStream(); return 0; } QMediaPlaylist *QMediaPlayer::playlist() const { Q_D(const QMediaPlayer); return d->rootMedia.playlist(); } QMediaContent QMediaPlayer::currentMedia() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->media(); return QMediaContent(); } void QMediaPlayer::setPlaylist(QMediaPlaylist *playlist) { QMediaContent m(playlist, QUrl(), false); setMedia(m); } /*! Sets the network access points for remote media playback. \a configurations contains, in ascending preferential order, a list of configuration that can be used for network access. This will invalidate the choice of previous configurations. */ void QMediaPlayer::setNetworkConfigurations(const QList &configurations) { Q_D(QMediaPlayer); if (d->networkAccessControl) d->networkAccessControl->setConfigurations(configurations); } QMediaPlayer::State QMediaPlayer::state() const { return d_func()->state; } QMediaPlayer::MediaStatus QMediaPlayer::mediaStatus() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->mediaStatus(); return QMediaPlayer::UnknownMediaStatus; } qint64 QMediaPlayer::duration() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->duration(); return -1; } qint64 QMediaPlayer::position() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->position(); return 0; } int QMediaPlayer::volume() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->volume(); return 0; } bool QMediaPlayer::isMuted() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->isMuted(); return false; } int QMediaPlayer::bufferStatus() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->bufferStatus(); return 0; } bool QMediaPlayer::isAudioAvailable() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->isAudioAvailable(); return false; } bool QMediaPlayer::isVideoAvailable() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->isVideoAvailable(); return false; } bool QMediaPlayer::isSeekable() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->isSeekable(); return false; } qreal QMediaPlayer::playbackRate() const { Q_D(const QMediaPlayer); if (d->control != 0) return d->control->playbackRate(); return 0.0; } /*! Returns the current error state. */ QMediaPlayer::Error QMediaPlayer::error() const { return d_func()->error; } QString QMediaPlayer::errorString() const { return d_func()->errorString; } /*! Returns the current network access point in use. If a default contructed QNetworkConfiguration is returned this feature is not available or that none of the current supplied configurations are in use. */ QNetworkConfiguration QMediaPlayer::currentNetworkConfiguration() const { Q_D(const QMediaPlayer); if (d->networkAccessControl) return d_func()->networkAccessControl->currentConfiguration(); return QNetworkConfiguration(); } //public Q_SLOTS: /*! Start or resume playing the current source. */ void QMediaPlayer::play() { Q_D(QMediaPlayer); if (d->control == 0) { QMetaObject::invokeMethod(this, "_q_error", Qt::QueuedConnection, Q_ARG(int, QMediaPlayer::ServiceMissingError), Q_ARG(QString, tr("The QMediaPlayer object does not have a valid service"))); return; } //if playlist control is available, the service should advance itself if (d->rootMedia.playlist() && d->rootMedia.playlist()->currentIndex() == -1 && !d->rootMedia.playlist()->isEmpty()) { // switch to playing state if (d->state != QMediaPlayer::PlayingState) d->_q_stateChanged(QMediaPlayer::PlayingState); if (d->playlist != d->rootMedia.playlist()) d->setPlaylist(d->rootMedia.playlist()); Q_ASSERT(d->playlist == d->rootMedia.playlist()); emit currentMediaChanged(d->rootMedia); d->playlist->setCurrentIndex(0); } // Reset error conditions d->error = NoError; d->errorString = QString(); d->control->play(); } /*! Pause playing the current source. */ void QMediaPlayer::pause() { Q_D(QMediaPlayer); if (d->control != 0) d->control->pause(); } /*! Stop playing, and reset the play position to the beginning. */ void QMediaPlayer::stop() { Q_D(QMediaPlayer); if (d->control != 0) d->control->stop(); // If media player didn't stop in response to control. // This happens if we have an active playlist and control // media status is // QMediaPlayer::LoadingMedia, QMediaPlayer::InvalidMedia, or QMediaPlayer::EndOfMedia // see QMediaPlayerPrivate::_q_stateChanged() if (d->playlist && d->state != QMediaPlayer::StoppedState) { d->state = QMediaPlayer::StoppedState; removePropertyWatch("position"); emit stateChanged(QMediaPlayer::StoppedState); } } void QMediaPlayer::setPosition(qint64 position) { Q_D(QMediaPlayer); if (d->control == 0) return; d->control->setPosition(qMax(position, 0ll)); } void QMediaPlayer::setVolume(int v) { Q_D(QMediaPlayer); if (d->control == 0) return; int clamped = qBound(0, v, 100); if (clamped == volume()) return; d->control->setVolume(clamped); } void QMediaPlayer::setMuted(bool muted) { Q_D(QMediaPlayer); if (d->control == 0 || muted == isMuted()) return; d->control->setMuted(muted); } void QMediaPlayer::setPlaybackRate(qreal rate) { Q_D(QMediaPlayer); if (d->control != 0) d->control->setPlaybackRate(rate); } /*! Sets the current \a media source. If a \a stream is supplied; media data will be read from it instead of resolving the media source. In this case the media source may still be used to resolve additional information about the media such as mime type. Setting the media to a null QMediaContent will cause the player to discard all information relating to the current media source and to cease all I/O operations related to that media. */ void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream) { Q_D(QMediaPlayer); stop(); QMediaContent oldMedia = d->rootMedia; d->disconnectPlaylist(); d->playlist = 0; d->rootMedia = media; d->nestedPlaylists = 0; if (oldMedia != media) emit mediaChanged(d->rootMedia); if (media.playlist()) { // reset playlist to the 1st item media.playlist()->setCurrentIndex(0); d->setPlaylist(media.playlist()); } else if (d->control != 0) { d->control->setMedia(media, stream); } } /*! \internal */ bool QMediaPlayer::bind(QObject *obj) { return QMediaObject::bind(obj); } /*! \internal */ void QMediaPlayer::unbind(QObject *obj) { QMediaObject::unbind(obj); } /*! Returns the level of support a media player has for a \a mimeType and a set of \a codecs. The \a flags argument allows additional requirements such as performance indicators to be specified. */ QMultimedia::SupportEstimate QMediaPlayer::hasSupport(const QString &mimeType, const QStringList& codecs, Flags flags) { return QMediaServiceProvider::defaultServiceProvider()->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), mimeType, codecs, flags); } /*! \deprecated Returns a list of MIME types supported by the media player. The \a flags argument causes the resultant list to be restricted to MIME types which can be supported given additional requirements, such as performance indicators. This function may not return useful results on some platforms, and support for a specific file of a given mime type is not guaranteed even if the mime type is in general supported. In addition, in some cases this function will need to load all available media plugins and query them for their support, which may take some time. */ QStringList QMediaPlayer::supportedMimeTypes(Flags flags) { return QMediaServiceProvider::defaultServiceProvider()->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), flags); } /*! \fn void QMediaPlayer::setVideoOutput(QVideoWidget* output) Attach a QVideoWidget video \a output to the media player. If the media player has already video output attached, it will be replaced with a new one. */ void QMediaPlayer::setVideoOutput(QVideoWidget *output) { Q_D(QMediaPlayer); if (d->videoOutput) unbind(d->videoOutput); // We don't know (in this library) that QVideoWidget inherits QObject QObject *outputObject = reinterpret_cast(output); d->videoOutput = outputObject && bind(outputObject) ? outputObject : 0; } /*! \fn void QMediaPlayer::setVideoOutput(QGraphicsVideoItem* output) Attach a QGraphicsVideoItem video \a output to the media player. If the media player has already video output attached, it will be replaced with a new one. */ void QMediaPlayer::setVideoOutput(QGraphicsVideoItem *output) { Q_D(QMediaPlayer); if (d->videoOutput) unbind(d->videoOutput); // We don't know (in this library) that QGraphicsVideoItem (multiply) inherits QObject // but QObject inheritance depends on QObject coming first, so try this out. QObject *outputObject = reinterpret_cast(output); d->videoOutput = outputObject && bind(outputObject) ? outputObject : 0; } /*! Sets a video \a surface as the video output of a media player. If a video output has already been set on the media player the new surface will replace it. */ void QMediaPlayer::setVideoOutput(QAbstractVideoSurface *surface) { Q_D(QMediaPlayer); d->surfaceOutput.setVideoSurface(surface); if (d->videoOutput != &d->surfaceOutput) { if (d->videoOutput) unbind(d->videoOutput); d->videoOutput = 0; if (surface && bind(&d->surfaceOutput)) d->videoOutput = &d->surfaceOutput; } else if (!surface) { //unbind the surfaceOutput if null surface is set unbind(&d->surfaceOutput); d->videoOutput = 0; } } /*! \reimp */ QMultimedia::AvailabilityStatus QMediaPlayer::availability() const { Q_D(const QMediaPlayer); if (!d->control) return QMultimedia::ServiceMissing; return QMediaObject::availability(); } // Enums /*! \enum QMediaPlayer::State Defines the current state of a media player. \value StoppedState The media player is not playing content, playback will begin from the start of the current track. \value PlayingState The media player is currently playing content. \value PausedState The media player has paused playback, playback of the current track will resume from the position the player was paused at. */ /*! \enum QMediaPlayer::MediaStatus Defines the status of a media player's current media. \value UnknownMediaStatus The status of the media cannot be determined. \value NoMedia The is no current media. The player is in the StoppedState. \value LoadingMedia The current media is being loaded. The player may be in any state. \value LoadedMedia The current media has been loaded. The player is in the StoppedState. \value StalledMedia Playback of the current media has stalled due to insufficient buffering or some other temporary interruption. The player is in the PlayingState or PausedState. \value BufferingMedia The player is buffering data but has enough data buffered for playback to continue for the immediate future. The player is in the PlayingState or PausedState. \value BufferedMedia The player has fully buffered the current media. The player is in the PlayingState or PausedState. \value EndOfMedia Playback has reached the end of the current media. The player is in the StoppedState. \value InvalidMedia The current media cannot be played. The player is in the StoppedState. */ /*! \enum QMediaPlayer::Error Defines a media player error condition. \value NoError No error has occurred. \value ResourceError A media resource couldn't be resolved. \value FormatError The format of a media resource isn't (fully) supported. Playback may still be possible, but without an audio or video component. \value NetworkError A network error occurred. \value AccessDeniedError There are not the appropriate permissions to play a media resource. \value ServiceMissingError A valid playback service was not found, playback cannot proceed. \omitvalue MediaIsPlaylist */ // Signals /*! \fn QMediaPlayer::error(QMediaPlayer::Error error) Signals that an \a error condition has occurred. \sa errorString() */ /*! \fn void QMediaPlayer::stateChanged(State state) Signal the \a state of the Player object has changed. */ /*! \fn QMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status) Signals that the \a status of the current media has changed. \sa mediaStatus() */ /*! \fn void QMediaPlayer::mediaChanged(const QMediaContent &media); Signals that the media source has been changed to \a media. \sa media(), currentMediaChanged() */ /*! \fn void QMediaPlayer::currentMediaChanged(const QMediaContent &media); Signals that the current playing content has been changed to \a media. \sa currentMedia(), mediaChanged() */ /*! \fn void QMediaPlayer::playbackRateChanged(qreal rate); Signals the playbackRate has changed to \a rate. */ /*! \fn void QMediaPlayer::seekableChanged(bool seekable); Signals the \a seekable status of the player object has changed. */ // Properties /*! \property QMediaPlayer::state \brief the media player's playback state. By default this property is QMediaPlayer::Stopped \sa mediaStatus(), play(), pause(), stop() */ /*! \property QMediaPlayer::error \brief a string describing the last error condition. \sa error() */ /*! \property QMediaPlayer::media \brief the active media source being used by the player object. The player object will use the QMediaContent for selection of the content to be played. By default this property has a null QMediaContent. Setting this property to a null QMediaContent will cause the player to discard all information relating to the current media source and to cease all I/O operations related to that media. \sa QMediaContent, currentMedia() */ /*! \property QMediaPlayer::currentMedia \brief the current active media content being played by the player object. This value could be different from QMediaPlayer::media property if a playlist is used. In this case currentMedia indicates the current media content being processed by the player, while QMediaPlayer::media property contains the original playlist. \sa QMediaContent, media() */ /*! \property QMediaPlayer::playlist \brief the media playlist being used by the player object. The player object will use the current playlist item for selection of the content to be played. By default this property is set to null. If the media playlist is used as a source, QMediaPlayer::currentMedia is updated with a current playlist item. The current source should be selected with QMediaPlaylist::setCurrentIndex(int) instead of QMediaPlayer::setMedia(), otherwise the current playlist will be discarded. \sa QMediaContent */ /*! \property QMediaPlayer::mediaStatus \brief the status of the current media stream. The stream status describes how the playback of the current stream is progressing. By default this property is QMediaPlayer::NoMedia \sa state */ /*! \property QMediaPlayer::duration \brief the duration of the current media. The value is the total playback time in milliseconds of the current media. The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins, connect to the durationChanged() signal to receive status notifications. */ /*! \property QMediaPlayer::position \brief the playback position of the current media. The value is the current playback position, expressed in milliseconds since the beginning of the media. Periodically changes in the position will be indicated with the signal positionChanged(), the interval between updates can be set with QMediaObject's method setNotifyInterval(). */ /*! \property QMediaPlayer::volume \brief the current playback volume. The playback volume is a linear in effect and the value can range from 0 - 100, values outside this range will be clamped. */ /*! \property QMediaPlayer::muted \brief the muted state of the current media. The value will be true if the playback volume is muted; otherwise false. */ /*! \property QMediaPlayer::bufferStatus \brief the percentage of the temporary buffer filled before playback begins. When the player object is buffering; this property holds the percentage of the temporary buffer that is filled. The buffer will need to reach 100% filled before playback can resume, at which time the MediaStatus will be BufferedMedia. \sa mediaStatus() */ /*! \property QMediaPlayer::audioAvailable \brief the audio availabilty status for the current media. As the life time of QMediaPlayer can be longer than the playback of one QMediaContent, this property may change over time, the audioAvailableChanged signal can be used to monitor it's status. */ /*! \property QMediaPlayer::videoAvailable \brief the video availability status for the current media. If available, the QVideoWidget class can be used to view the video. As the life time of QMediaPlayer can be longer than the playback of one QMediaContent, this property may change over time, the videoAvailableChanged signal can be used to monitor it's status. \sa QVideoWidget, QMediaContent */ /*! \property QMediaPlayer::seekable \brief the seek-able status of the current media If seeking is supported this property will be true; false otherwise. The status of this property may change across the life time of the QMediaPlayer object, use the seekableChanged signal to monitor changes. */ /*! \property QMediaPlayer::playbackRate \brief the playback rate of the current media. This value is a multiplier applied to the media's standard play rate. By default this value is 1.0, indicating that the media is playing at the standard pace. Values higher than 1.0 will increase the rate of play. Values less than zero can be set and indicate the media will rewind at the multiplier of the standard pace. Not all playback services support change of the playback rate. It is framework defined as to the status and quality of audio and video while fast forwarding or rewinding. */ /*! \fn void QMediaPlayer::durationChanged(qint64 duration) Signal the duration of the content has changed to \a duration, expressed in milliseconds. */ /*! \fn void QMediaPlayer::positionChanged(qint64 position) Signal the position of the content has changed to \a position, expressed in milliseconds. */ /*! \fn void QMediaPlayer::volumeChanged(int volume) Signal the playback volume has changed to \a volume. */ /*! \fn void QMediaPlayer::mutedChanged(bool muted) Signal the mute state has changed to \a muted. */ /*! \fn void QMediaPlayer::videoAvailableChanged(bool videoAvailable) Signal the availability of visual content has changed to \a videoAvailable. */ /*! \fn void QMediaPlayer::audioAvailableChanged(bool available) Signals the availability of audio content has changed to \a available. */ /*! \fn void QMediaPlayer::bufferStatusChanged(int percentFilled) Signal the amount of the local buffer filled as a percentage by \a percentFilled. */ /*! \fn void QMediaPlayer::networkConfigurationChanged(const QNetworkConfiguration &configuration) Signal that the active in use network access point has been changed to \a configuration and all subsequent network access will use this \a configuration. */ /*! \enum QMediaPlayer::Flag \value LowLatency The player is expected to be used with simple audio formats, but playback should start without significant delay. Such playback service can be used for beeps, ringtones, etc. \value StreamPlayback The player is expected to play QIODevice based streams. If passed to QMediaPlayer constructor, the service supporting streams playback will be chosen. \value VideoSurface The player is expected to be able to render to a QAbstractVideoSurface \l {setVideoOutput()}{output}. */ #include "moc_qmediaplayer.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/qmediaplayer.h000066400000000000000000000166371225012771600321510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYER_H #define QMEDIAPLAYER_H #include #include #include #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QMediaPlaylist; class QVideoWidget; class QGraphicsVideoItem; class QMediaPlayerPrivate; class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QMediaObject { Q_OBJECT Q_PROPERTY(QMediaContent media READ media WRITE setMedia NOTIFY mediaChanged) Q_PROPERTY(QMediaContent currentMedia READ currentMedia NOTIFY currentMediaChanged) Q_PROPERTY(QMediaPlaylist * playlist READ playlist WRITE setPlaylist) Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(qint64 position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(int bufferStatus READ bufferStatus NOTIFY bufferStatusChanged) Q_PROPERTY(bool audioAvailable READ isAudioAvailable NOTIFY audioAvailableChanged) Q_PROPERTY(bool videoAvailable READ isVideoAvailable NOTIFY videoAvailableChanged) Q_PROPERTY(bool seekable READ isSeekable NOTIFY seekableChanged) Q_PROPERTY(qreal playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(MediaStatus mediaStatus READ mediaStatus NOTIFY mediaStatusChanged) Q_PROPERTY(QString error READ errorString) Q_ENUMS(State) Q_ENUMS(MediaStatus) Q_ENUMS(Error) public: enum State { StoppedState, PlayingState, PausedState }; enum MediaStatus { UnknownMediaStatus, NoMedia, LoadingMedia, LoadedMedia, StalledMedia, BufferingMedia, BufferedMedia, EndOfMedia, InvalidMedia }; enum Flag { LowLatency = 0x01, StreamPlayback = 0x02, VideoSurface = 0x04 }; Q_DECLARE_FLAGS(Flags, Flag) enum Error { NoError, ResourceError, FormatError, NetworkError, AccessDeniedError, ServiceMissingError, MediaIsPlaylist }; QMediaPlayer(QObject *parent = 0, Flags flags = 0); ~QMediaPlayer(); static QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs = QStringList(), Flags flags = 0); static QStringList supportedMimeTypes(Flags flags = 0); void setVideoOutput(QVideoWidget *); void setVideoOutput(QGraphicsVideoItem *); void setVideoOutput(QAbstractVideoSurface *surface); QMediaContent media() const; const QIODevice *mediaStream() const; QMediaPlaylist *playlist() const; QMediaContent currentMedia() const; State state() const; MediaStatus mediaStatus() const; qint64 duration() const; qint64 position() const; int volume() const; bool isMuted() const; bool isAudioAvailable() const; bool isVideoAvailable() const; int bufferStatus() const; bool isSeekable() const; qreal playbackRate() const; Error error() const; QString errorString() const; QNetworkConfiguration currentNetworkConfiguration() const; QMultimedia::AvailabilityStatus availability() const; public Q_SLOTS: void play(); void pause(); void stop(); void setPosition(qint64 position); void setVolume(int volume); void setMuted(bool muted); void setPlaybackRate(qreal rate); void setMedia(const QMediaContent &media, QIODevice *stream = 0); void setPlaylist(QMediaPlaylist *playlist); void setNetworkConfigurations(const QList &configurations); Q_SIGNALS: void mediaChanged(const QMediaContent &media); void currentMediaChanged(const QMediaContent &media); void stateChanged(QMediaPlayer::State newState); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void durationChanged(qint64 duration); void positionChanged(qint64 position); void volumeChanged(int volume); void mutedChanged(bool muted); void audioAvailableChanged(bool available); void videoAvailableChanged(bool videoAvailable); void bufferStatusChanged(int percentFilled); void seekableChanged(bool seekable); void playbackRateChanged(qreal rate); void error(QMediaPlayer::Error error); void networkConfigurationChanged(const QNetworkConfiguration &configuration); public: virtual bool bind(QObject *); virtual void unbind(QObject *); private: Q_DISABLE_COPY(QMediaPlayer) Q_DECLARE_PRIVATE(QMediaPlayer) Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QMediaPlayer::State)) Q_PRIVATE_SLOT(d_func(), void _q_mediaStatusChanged(QMediaPlayer::MediaStatus)) Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_updateMedia(const QMediaContent&)) Q_PRIVATE_SLOT(d_func(), void _q_playlistDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_handlePlaylistLoaded()) Q_PRIVATE_SLOT(d_func(), void _q_handlePlaylistLoadFailed()) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaPlayer::State) Q_DECLARE_METATYPE(QMediaPlayer::MediaStatus) Q_DECLARE_METATYPE(QMediaPlayer::Error) Q_MEDIA_ENUM_DEBUG(QMediaPlayer, State) Q_MEDIA_ENUM_DEBUG(QMediaPlayer, MediaStatus) Q_MEDIA_ENUM_DEBUG(QMediaPlayer, Error) #endif // QMEDIAPLAYER_H qmediaplaylist.cpp000066400000000000000000000507601225012771600327650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylist.h" #include "qmediaplaylist_p.h" #include "qmediaplaylistprovider_p.h" #include "qmediaplaylistioplugin_p.h" #include "qmedianetworkplaylistprovider_p.h" #include "qmediaservice.h" #include "qmediaplaylistcontrol_p.h" #include "qmediaplayercontrol.h" #include #include #include #include #include #include "qmediapluginloader_p.h" QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, playlistIOLoader, (QMediaPlaylistIOInterface_iid, QLatin1String("playlistformats"), Qt::CaseInsensitive)) namespace { class QMediaPlaylistPrivateRegisterMetaTypes { public: QMediaPlaylistPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QMediaPlaylist \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback \brief The QMediaPlaylist class provides a list of media content to play. QMediaPlaylist is intended to be used with other media objects, like QMediaPlayer. QMediaPlaylist allows to access the service intrinsic playlist functionality if available, otherwise it provides the the local memory playlist implementation. \snippet multimedia-snippets/media.cpp Movie playlist Depending on playlist source implementation, most of the playlist mutating operations can be asynchronous. \sa QMediaContent */ /*! \enum QMediaPlaylist::PlaybackMode The QMediaPlaylist::PlaybackMode describes the order items in playlist are played. \value CurrentItemOnce The current item is played only once. \value CurrentItemInLoop The current item is played repeatedly in a loop. \value Sequential Playback starts from the current and moves through each successive item until the last is reached and then stops. The next item is a null item when the last one is currently playing. \value Loop Playback restarts at the first item after the last has finished playing. \value Random Play items in random order. */ /*! Create a new playlist object for with the given \a parent. */ QMediaPlaylist::QMediaPlaylist(QObject *parent) : QObject(parent) , d_ptr(new QMediaPlaylistPrivate) { Q_D(QMediaPlaylist); d->q_ptr = this; d->networkPlaylistControl = new QMediaNetworkPlaylistControl(this); setMediaObject(0); } /*! Destroys the playlist. */ QMediaPlaylist::~QMediaPlaylist() { Q_D(QMediaPlaylist); if (d->mediaObject) d->mediaObject->unbind(this); delete d_ptr; } /*! Returns the QMediaObject instance that this QMediaPlaylist is bound too, or 0 otherwise. */ QMediaObject *QMediaPlaylist::mediaObject() const { return d_func()->mediaObject; } /*! \internal If \a mediaObject is null or doesn't have an intrinsic playlist, internal local memory playlist source will be created. */ bool QMediaPlaylist::setMediaObject(QMediaObject *mediaObject) { Q_D(QMediaPlaylist); if (mediaObject && mediaObject == d->mediaObject) return true; QMediaService *service = mediaObject ? mediaObject->service() : 0; QMediaPlaylistControl *newControl = 0; if (service) newControl = qobject_cast(service->requestControl(QMediaPlaylistControl_iid)); if (!newControl) newControl = d->networkPlaylistControl; if (d->control != newControl) { int oldSize = 0; if (d->control) { QMediaPlaylistProvider *playlist = d->control->playlistProvider(); oldSize = playlist->mediaCount(); disconnect(playlist, SIGNAL(loadFailed(QMediaPlaylist::Error,QString)), this, SLOT(_q_loadFailed(QMediaPlaylist::Error,QString))); disconnect(playlist, SIGNAL(mediaChanged(int,int)), this, SIGNAL(mediaChanged(int,int))); disconnect(playlist, SIGNAL(mediaAboutToBeInserted(int,int)), this, SIGNAL(mediaAboutToBeInserted(int,int))); disconnect(playlist, SIGNAL(mediaInserted(int,int)), this, SIGNAL(mediaInserted(int,int))); disconnect(playlist, SIGNAL(mediaAboutToBeRemoved(int,int)), this, SIGNAL(mediaAboutToBeRemoved(int,int))); disconnect(playlist, SIGNAL(mediaRemoved(int,int)), this, SIGNAL(mediaRemoved(int,int))); disconnect(playlist, SIGNAL(loaded()), this, SIGNAL(loaded())); disconnect(d->control, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode)), this, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode))); disconnect(d->control, SIGNAL(currentIndexChanged(int)), this, SIGNAL(currentIndexChanged(int))); disconnect(d->control, SIGNAL(currentMediaChanged(QMediaContent)), this, SIGNAL(currentMediaChanged(QMediaContent))); if (d->mediaObject) d->mediaObject->service()->releaseControl(d->control); } d->control = newControl; QMediaPlaylistProvider *playlist = d->control->playlistProvider(); connect(playlist, SIGNAL(loadFailed(QMediaPlaylist::Error,QString)), this, SLOT(_q_loadFailed(QMediaPlaylist::Error,QString))); connect(playlist, SIGNAL(mediaChanged(int,int)), this, SIGNAL(mediaChanged(int,int))); connect(playlist, SIGNAL(mediaAboutToBeInserted(int,int)), this, SIGNAL(mediaAboutToBeInserted(int,int))); connect(playlist, SIGNAL(mediaInserted(int,int)), this, SIGNAL(mediaInserted(int,int))); connect(playlist, SIGNAL(mediaAboutToBeRemoved(int,int)), this, SIGNAL(mediaAboutToBeRemoved(int,int))); connect(playlist, SIGNAL(mediaRemoved(int,int)), this, SIGNAL(mediaRemoved(int,int))); connect(playlist, SIGNAL(loaded()), this, SIGNAL(loaded())); connect(d->control, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode)), this, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode))); connect(d->control, SIGNAL(currentIndexChanged(int)), this, SIGNAL(currentIndexChanged(int))); connect(d->control, SIGNAL(currentMediaChanged(QMediaContent)), this, SIGNAL(currentMediaChanged(QMediaContent))); if (oldSize) emit mediaRemoved(0, oldSize-1); if (playlist->mediaCount()) { emit mediaAboutToBeInserted(0,playlist->mediaCount()-1); emit mediaInserted(0,playlist->mediaCount()-1); } } d->mediaObject = mediaObject; return true; } /*! \property QMediaPlaylist::playbackMode This property defines the order that items in the playlist are played. \sa QMediaPlaylist::PlaybackMode */ QMediaPlaylist::PlaybackMode QMediaPlaylist::playbackMode() const { return d_func()->control->playbackMode(); } void QMediaPlaylist::setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { Q_D(QMediaPlaylist); d->control->setPlaybackMode(mode); } /*! Returns position of the current media content in the playlist. */ int QMediaPlaylist::currentIndex() const { return d_func()->control->currentIndex(); } /*! Returns the current media content. */ QMediaContent QMediaPlaylist::currentMedia() const { return d_func()->playlist()->media(currentIndex()); } /*! Returns the index of the item, which would be current after calling next() \a steps times. Returned value depends on the size of playlist, current position and playback mode. \sa QMediaPlaylist::playbackMode(), previousIndex() */ int QMediaPlaylist::nextIndex(int steps) const { return d_func()->control->nextIndex(steps); } /*! Returns the index of the item, which would be current after calling previous() \a steps times. \sa QMediaPlaylist::playbackMode(), nextIndex() */ int QMediaPlaylist::previousIndex(int steps) const { return d_func()->control->previousIndex(steps); } /*! Returns the number of items in the playlist. \sa isEmpty() */ int QMediaPlaylist::mediaCount() const { return d_func()->playlist()->mediaCount(); } /*! Returns true if the playlist contains no items; otherwise returns false. \sa mediaCount() */ bool QMediaPlaylist::isEmpty() const { return mediaCount() == 0; } /*! Returns true if the playlist can be modified; otherwise returns false. \sa mediaCount() */ bool QMediaPlaylist::isReadOnly() const { return d_func()->playlist()->isReadOnly(); } /*! Returns the media content at \a index in the playlist. */ QMediaContent QMediaPlaylist::media(int index) const { return d_func()->playlist()->media(index); } /*! Append the media \a content to the playlist. Returns true if the operation is successful, otherwise return false. */ bool QMediaPlaylist::addMedia(const QMediaContent &content) { return d_func()->control->playlistProvider()->addMedia(content); } /*! Append multiple media content \a items to the playlist. Returns true if the operation is successful, otherwise return false. */ bool QMediaPlaylist::addMedia(const QList &items) { return d_func()->control->playlistProvider()->addMedia(items); } /*! Insert the media \a content to the playlist at position \a pos. Returns true if the operation is successful, otherwise false. */ bool QMediaPlaylist::insertMedia(int pos, const QMediaContent &content) { return d_func()->playlist()->insertMedia(pos, content); } /*! Insert multiple media content \a items to the playlist at position \a pos. Returns true if the operation is successful, otherwise false. */ bool QMediaPlaylist::insertMedia(int pos, const QList &items) { return d_func()->playlist()->insertMedia(pos, items); } /*! Remove the item from the playlist at position \a pos. Returns true if the operation is successful, otherwise return false. */ bool QMediaPlaylist::removeMedia(int pos) { Q_D(QMediaPlaylist); return d->playlist()->removeMedia(pos); } /*! Remove items in the playlist from \a start to \a end inclusive. Returns true if the operation is successful, otherwise return false. */ bool QMediaPlaylist::removeMedia(int start, int end) { Q_D(QMediaPlaylist); return d->playlist()->removeMedia(start, end); } /*! Remove all the items from the playlist. Returns true if the operation is successful, otherwise return false. */ bool QMediaPlaylist::clear() { Q_D(QMediaPlaylist); return d->playlist()->clear(); } bool QMediaPlaylistPrivate::readItems(QMediaPlaylistReader *reader) { while (!reader->atEnd()) playlist()->addMedia(reader->readItem()); return true; } bool QMediaPlaylistPrivate::writeItems(QMediaPlaylistWriter *writer) { for (int i=0; imediaCount(); i++) { if (!writer->writeItem(playlist()->media(i))) return false; } writer->close(); return true; } /*! Load playlist using network \a request. If \a format is specified, it is used, otherwise format is guessed from playlist name and data. New items are appended to playlist. QMediaPlaylist::loaded() signal is emitted if playlist was loaded successfully, otherwise the playlist emits loadFailed(). */ void QMediaPlaylist::load(const QNetworkRequest &request, const char *format) { Q_D(QMediaPlaylist); d->error = NoError; d->errorString.clear(); if (d->playlist()->load(request,format)) return; if (isReadOnly()) { d->error = AccessDeniedError; d->errorString = tr("Could not add items to read only playlist."); emit loadFailed(); return; } foreach (QString const& key, playlistIOLoader()->keys()) { QMediaPlaylistIOInterface* plugin = qobject_cast(playlistIOLoader()->instance(key)); if (plugin && plugin->canRead(request.url(), format)) { QMediaPlaylistReader *reader = plugin->createReader(request.url(), QByteArray(format)); if (reader && d->readItems(reader)) { delete reader; emit loaded(); return; } delete reader; } } d->error = FormatNotSupportedError; d->errorString = tr("Playlist format is not supported"); emit loadFailed(); return; } /*! Load playlist from \a location. If \a format is specified, it is used, otherwise format is guessed from location name and data. New items are appended to playlist. QMediaPlaylist::loaded() signal is emitted if playlist was loaded successfully, otherwise the playlist emits loadFailed(). */ void QMediaPlaylist::load(const QUrl &location, const char *format) { load(QNetworkRequest(location), format); } /*! Load playlist from QIODevice \a device. If \a format is specified, it is used, otherwise format is guessed from device data. New items are appended to playlist. QMediaPlaylist::loaded() signal is emitted if playlist was loaded successfully, otherwise the playlist emits loadFailed(). */ void QMediaPlaylist::load(QIODevice * device, const char *format) { Q_D(QMediaPlaylist); d->error = NoError; d->errorString.clear(); if (d->playlist()->load(device,format)) return; if (isReadOnly()) { d->error = AccessDeniedError; d->errorString = tr("Could not add items to read only playlist."); emit loadFailed(); return; } foreach (QString const& key, playlistIOLoader()->keys()) { QMediaPlaylistIOInterface* plugin = qobject_cast(playlistIOLoader()->instance(key)); if (plugin && plugin->canRead(device,format)) { QMediaPlaylistReader *reader = plugin->createReader(device,QByteArray(format)); if (reader && d->readItems(reader)) { delete reader; emit loaded(); return; } delete reader; } } d->error = FormatNotSupportedError; d->errorString = tr("Playlist format is not supported"); emit loadFailed(); return; } /*! Save playlist to \a location. If \a format is specified, it is used, otherwise format is guessed from location name. Returns true if playlist was saved successfully, otherwise returns false. */ bool QMediaPlaylist::save(const QUrl &location, const char *format) { Q_D(QMediaPlaylist); d->error = NoError; d->errorString.clear(); if (d->playlist()->save(location,format)) return true; QFile file(location.toLocalFile()); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { d->error = AccessDeniedError; d->errorString = tr("The file could not be accessed."); return false; } return save(&file, format); } /*! Save playlist to QIODevice \a device using format \a format. Returns true if playlist was saved successfully, otherwise returns false. */ bool QMediaPlaylist::save(QIODevice * device, const char *format) { Q_D(QMediaPlaylist); d->error = NoError; d->errorString.clear(); if (d->playlist()->save(device,format)) return true; foreach (QString const& key, playlistIOLoader()->keys()) { QMediaPlaylistIOInterface* plugin = qobject_cast(playlistIOLoader()->instance(key)); if (plugin && plugin->canWrite(device,format)) { QMediaPlaylistWriter *writer = plugin->createWriter(device,QByteArray(format)); if (writer && d->writeItems(writer)) { delete writer; return true; } delete writer; } } d->error = FormatNotSupportedError; d->errorString = tr("Playlist format is not supported."); return false; } /*! Returns the last error condition. */ QMediaPlaylist::Error QMediaPlaylist::error() const { return d_func()->error; } /*! Returns the string describing the last error condition. */ QString QMediaPlaylist::errorString() const { return d_func()->errorString; } /*! Shuffle items in the playlist. */ void QMediaPlaylist::shuffle() { d_func()->playlist()->shuffle(); } /*! Advance to the next media content in playlist. */ void QMediaPlaylist::next() { d_func()->control->next(); } /*! Return to the previous media content in playlist. */ void QMediaPlaylist::previous() { d_func()->control->previous(); } /*! Activate media content from playlist at position \a playlistPosition. */ void QMediaPlaylist::setCurrentIndex(int playlistPosition) { d_func()->control->setCurrentIndex(playlistPosition); } /*! \fn void QMediaPlaylist::mediaInserted(int start, int end) This signal is emitted after media has been inserted into the playlist. The new items are those between \a start and \a end inclusive. */ /*! \fn void QMediaPlaylist::mediaRemoved(int start, int end) This signal is emitted after media has been removed from the playlist. The removed items are those between \a start and \a end inclusive. */ /*! \fn void QMediaPlaylist::mediaChanged(int start, int end) This signal is emitted after media has been changed in the playlist between \a start and \a end positions inclusive. */ /*! \fn void QMediaPlaylist::currentIndexChanged(int position) Signal emitted when playlist position changed to \a position. */ /*! \fn void QMediaPlaylist::playbackModeChanged(QMediaPlaylist::PlaybackMode mode) Signal emitted when playback mode changed to \a mode. */ /*! \fn void QMediaPlaylist::mediaAboutToBeInserted(int start, int end) Signal emitted when items are to be inserted at \a start and ending at \a end. */ /*! \fn void QMediaPlaylist::mediaAboutToBeRemoved(int start, int end) Signal emitted when item are to be deleted at \a start and ending at \a end. */ /*! \fn void QMediaPlaylist::currentMediaChanged(const QMediaContent &content) Signal emitted when current media changes to \a content. */ /*! \property QMediaPlaylist::currentIndex \brief Current position. */ /*! \property QMediaPlaylist::currentMedia \brief Current media content. */ /*! \fn QMediaPlaylist::loaded() Signal emitted when playlist finished loading. */ /*! \fn QMediaPlaylist::loadFailed() Signal emitted if failed to load playlist. */ /*! \enum QMediaPlaylist::Error This enum describes the QMediaPlaylist error codes. \value NoError No errors. \value FormatError Format error. \value FormatNotSupportedError Format not supported. \value NetworkError Network error. \value AccessDeniedError Access denied error. */ #include "moc_qmediaplaylist.cpp" #include "moc_qmediaplaylist_p.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/qmediaplaylist.h000066400000000000000000000120641225012771600325040ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLIST_H #define QMEDIAPLAYLIST_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QMediaPlaylistProvider; class QMediaPlaylistPrivate; class Q_MULTIMEDIA_EXPORT QMediaPlaylist : public QObject, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) Q_PROPERTY(QMediaPlaylist::PlaybackMode playbackMode READ playbackMode WRITE setPlaybackMode NOTIFY playbackModeChanged) Q_PROPERTY(QMediaContent currentMedia READ currentMedia NOTIFY currentMediaChanged) Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged) Q_ENUMS(PlaybackMode Error) public: enum PlaybackMode { CurrentItemOnce, CurrentItemInLoop, Sequential, Loop, Random }; enum Error { NoError, FormatError, FormatNotSupportedError, NetworkError, AccessDeniedError }; QMediaPlaylist(QObject *parent = 0); virtual ~QMediaPlaylist(); QMediaObject *mediaObject() const; PlaybackMode playbackMode() const; void setPlaybackMode(PlaybackMode mode); int currentIndex() const; QMediaContent currentMedia() const; int nextIndex(int steps = 1) const; int previousIndex(int steps = 1) const; QMediaContent media(int index) const; int mediaCount() const; bool isEmpty() const; bool isReadOnly() const; bool addMedia(const QMediaContent &content); bool addMedia(const QList &items); bool insertMedia(int index, const QMediaContent &content); bool insertMedia(int index, const QList &items); bool removeMedia(int pos); bool removeMedia(int start, int end); bool clear(); void load(const QNetworkRequest &request, const char *format = 0); void load(const QUrl &location, const char *format = 0); void load(QIODevice * device, const char *format = 0); bool save(const QUrl &location, const char *format = 0); bool save(QIODevice * device, const char *format); Error error() const; QString errorString() const; public Q_SLOTS: void shuffle(); void next(); void previous(); void setCurrentIndex(int index); Q_SIGNALS: void currentIndexChanged(int index); void playbackModeChanged(QMediaPlaylist::PlaybackMode mode); void currentMediaChanged(const QMediaContent&); void mediaAboutToBeInserted(int start, int end); void mediaInserted(int start, int end); void mediaAboutToBeRemoved(int start, int end); void mediaRemoved(int start, int end); void mediaChanged(int start, int end); void loaded(); void loadFailed(); protected: bool setMediaObject(QMediaObject *object); QMediaPlaylistPrivate *d_ptr; private: Q_DECLARE_PRIVATE(QMediaPlaylist) Q_PRIVATE_SLOT(d_func(), void _q_loadFailed(QMediaPlaylist::Error, const QString &)) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaPlaylist::PlaybackMode) Q_DECLARE_METATYPE(QMediaPlaylist::Error) Q_MEDIA_ENUM_DEBUG(QMediaPlaylist, PlaybackMode) Q_MEDIA_ENUM_DEBUG(QMediaPlaylist, Error) #endif // QMEDIAPLAYLIST_H qmediaplaylist_p.h000066400000000000000000000126571225012771600327540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLIST_P_H #define QMEDIAPLAYLIST_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qmediaplaylist.h" #include "qmediaplaylistcontrol_p.h" #include "qmediaplayer.h" #include "qmediaplayercontrol.h" #include "qmedianetworkplaylistprovider_p.h" #include "qmediaobject_p.h" #include #ifdef Q_MOC_RUN # pragma Q_MOC_EXPAND_MACROS #endif QT_BEGIN_NAMESPACE class QMediaPlaylistControl; class QMediaPlaylistProvider; class QMediaPlaylistReader; class QMediaPlaylistWriter; class QMediaPlayerControl; class QMediaPlaylistPrivate { Q_DECLARE_PUBLIC(QMediaPlaylist) public: QMediaPlaylistPrivate() :mediaObject(0), control(0), networkPlaylistControl(0), error(QMediaPlaylist::NoError) { } virtual ~QMediaPlaylistPrivate() {} void _q_loadFailed(QMediaPlaylist::Error error, const QString &errorString) { this->error = error; this->errorString = errorString; emit q_ptr->loadFailed(); } void _q_mediaObjectDeleted() { Q_Q(QMediaPlaylist); mediaObject = 0; if (control != networkPlaylistControl) control = 0; q->setMediaObject(0); } QMediaObject *mediaObject; QMediaPlaylistControl *control; QMediaPlaylistProvider *playlist() const { return control->playlistProvider(); } QMediaPlaylistControl *networkPlaylistControl; bool readItems(QMediaPlaylistReader *reader); bool writeItems(QMediaPlaylistWriter *writer); QMediaPlaylist::Error error; QString errorString; QMediaPlaylist *q_ptr; }; class QMediaNetworkPlaylistControl : public QMediaPlaylistControl { Q_OBJECT public: QMediaNetworkPlaylistControl(QObject *parent) :QMediaPlaylistControl(parent) { QMediaPlaylistProvider *playlist = new QMediaNetworkPlaylistProvider(this); m_navigator = new QMediaPlaylistNavigator(playlist,this); m_navigator->setPlaybackMode(QMediaPlaylist::Sequential); connect(m_navigator, SIGNAL(currentIndexChanged(int)), SIGNAL(currentIndexChanged(int))); connect(m_navigator, SIGNAL(activated(QMediaContent)), SIGNAL(currentMediaChanged(QMediaContent))); connect(m_navigator, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode)), SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode))); } virtual ~QMediaNetworkPlaylistControl() {}; QMediaPlaylistProvider* playlistProvider() const { return m_navigator->playlist(); } bool setPlaylistProvider(QMediaPlaylistProvider *mediaPlaylist) { m_navigator->setPlaylist(mediaPlaylist); emit playlistProviderChanged(); return true; } int currentIndex() const { return m_navigator->currentIndex(); } void setCurrentIndex(int position) { m_navigator->jump(position); } int nextIndex(int steps) const { return m_navigator->nextIndex(steps); } int previousIndex(int steps) const { return m_navigator->previousIndex(steps); } void next() { m_navigator->next(); } void previous() { m_navigator->previous(); } QMediaPlaylist::PlaybackMode playbackMode() const { return m_navigator->playbackMode(); } void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { m_navigator->setPlaybackMode(mode); } private: QMediaPlaylistNavigator *m_navigator; }; QT_END_NAMESPACE #endif // QMEDIAPLAYLIST_P_H qmediaplaylistioplugin.cpp000066400000000000000000000125551225012771600345340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylistioplugin_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaPlaylistReader \internal \brief The QMediaPlaylistReader class provides an interface for reading a playlist file. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback \sa QMediaPlaylistIOPlugin */ /*! Destroys a media playlist reader. */ QMediaPlaylistReader::~QMediaPlaylistReader() { } /*! \fn QMediaPlaylistReader::atEnd() const Identifies if a playlist reader has reached the end of its input. Returns true if the reader has reached the end; and false otherwise. */ /*! \fn QMediaPlaylistReader::readItem() Reads an item of media from a playlist file. Returns the read media, or a null QMediaContent if no more media is available. */ /*! \fn QMediaPlaylistReader::close() Closes a playlist reader's input device. */ /*! \class QMediaPlaylistWriter \internal \brief The QMediaPlaylistWriter class provides an interface for writing a playlist file. \sa QMediaPlaylistIOPlugin */ /*! Destroys a media playlist writer. */ QMediaPlaylistWriter::~QMediaPlaylistWriter() { } /*! \fn QMediaPlaylistWriter::writeItem(const QMediaContent &media) Writes an item of \a media to a playlist file. Returns true if the media was written successfully; and false otherwise. */ /*! \fn QMediaPlaylistWriter::close() Finalizes the writing of a playlist and closes the output device. */ /*! \class QMediaPlaylistIOPlugin \internal \brief The QMediaPlaylistIOPlugin class provides an interface for media playlist I/O plug-ins. */ /*! Constructs a media playlist I/O plug-in with the given \a parent. */ QMediaPlaylistIOPlugin::QMediaPlaylistIOPlugin(QObject *parent) :QObject(parent) { } /*! Destroys a media playlist I/O plug-in. */ QMediaPlaylistIOPlugin::~QMediaPlaylistIOPlugin() { } /*! \fn QMediaPlaylistIOPlugin::canRead(QIODevice *device, const QByteArray &format) const Identifies if plug-in can read \a format data from an I/O \a device. Returns true if the data can be read; and false otherwise. */ /*! \fn QMediaPlaylistIOPlugin::canRead(const QUrl& location, const QByteArray &format) const Identifies if a plug-in can read \a format data from a URL \a location. Returns true if the data can be read; and false otherwise. */ /*! \fn QMediaPlaylistIOPlugin::canWrite(QIODevice *device, const QByteArray &format) const Identifies if a plug-in can write \a format data to an I/O \a device. Returns true if the data can be written; and false otherwise. */ /*! \fn QMediaPlaylistIOPlugin::createReader(QIODevice *device, const QByteArray &format) Returns a new QMediaPlaylistReader which reads \a format data from an I/O \a device. If the device is invalid or the format is unsupported this will return a null pointer. */ /*! \fn QMediaPlaylistIOPlugin::createReader(const QUrl& location, const QByteArray &format) Returns a new QMediaPlaylistReader which reads \a format data from a URL \a location. If the location or the format is unsupported this will return a null pointer. */ /*! \fn QMediaPlaylistIOPlugin::createWriter(QIODevice *device, const QByteArray &format) Returns a new QMediaPlaylistWriter which writes \a format data to an I/O \a device. If the device is invalid or the format is unsupported this will return a null pointer. */ #include "moc_qmediaplaylistioplugin_p.cpp" QT_END_NAMESPACE qmediaplaylistioplugin_p.h000066400000000000000000000110171225012771600345100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLISTIOPLUGIN_P_H #define QMEDIAPLAYLISTIOPLUGIN_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include "qmediacontent.h" QT_BEGIN_NAMESPACE class QString; class QUrl; class QByteArray; class QIODevice; class QStringList; class Q_MULTIMEDIA_EXPORT QMediaPlaylistReader { public: virtual ~QMediaPlaylistReader(); virtual bool atEnd() const = 0; virtual QMediaContent readItem() = 0; virtual void close() = 0; }; class Q_MULTIMEDIA_EXPORT QMediaPlaylistWriter { public: virtual ~QMediaPlaylistWriter(); virtual bool writeItem(const QMediaContent &content) = 0; virtual void close() = 0; }; struct Q_MULTIMEDIA_EXPORT QMediaPlaylistIOInterface { virtual bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const = 0; virtual bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const = 0; virtual bool canWrite(QIODevice *device, const QByteArray &format) const = 0; virtual QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()) = 0; virtual QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()) = 0; virtual QMediaPlaylistWriter *createWriter(QIODevice *device, const QByteArray &format) = 0; }; #define QMediaPlaylistIOInterface_iid "org.qt-project.qt.mediaplaylistio/5.0" Q_DECLARE_INTERFACE(QMediaPlaylistIOInterface, QMediaPlaylistIOInterface_iid); class Q_MULTIMEDIA_EXPORT QMediaPlaylistIOPlugin : public QObject, public QMediaPlaylistIOInterface { Q_OBJECT Q_INTERFACES(QMediaPlaylistIOInterface) public: explicit QMediaPlaylistIOPlugin(QObject *parent = 0); virtual ~QMediaPlaylistIOPlugin(); virtual bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const = 0; virtual bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const = 0; virtual bool canWrite(QIODevice *device, const QByteArray &format) const = 0; virtual QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()) = 0; virtual QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()) = 0; virtual QMediaPlaylistWriter *createWriter(QIODevice *device, const QByteArray &format) = 0; }; QT_END_NAMESPACE #endif // QMEDIAPLAYLISTIOPLUGIN_P_H qmediaplaylistnavigator.cpp000066400000000000000000000346661225012771600347070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylistnavigator_p.h" #include "qmediaplaylistprovider_p.h" #include "qmediaplaylist.h" #include "qmediaobject_p.h" #include QT_BEGIN_NAMESPACE class QMediaPlaylistNullProvider : public QMediaPlaylistProvider { public: QMediaPlaylistNullProvider() :QMediaPlaylistProvider() {} virtual ~QMediaPlaylistNullProvider() {} virtual int mediaCount() const {return 0;} virtual QMediaContent media(int) const { return QMediaContent(); } }; Q_GLOBAL_STATIC(QMediaPlaylistNullProvider, _q_nullMediaPlaylist) class QMediaPlaylistNavigatorPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaPlaylistNavigator) public: QMediaPlaylistNavigatorPrivate() :playlist(0), currentPos(-1), lastValidPos(-1), playbackMode(QMediaPlaylist::Sequential), randomPositionsOffset(-1) { } QMediaPlaylistProvider *playlist; int currentPos; int lastValidPos; //to be used with CurrentItemOnce playback mode QMediaPlaylist::PlaybackMode playbackMode; QMediaContent currentItem; mutable QList randomModePositions; mutable int randomPositionsOffset; int nextItemPos(int steps = 1) const; int previousItemPos(int steps = 1) const; void _q_mediaInserted(int start, int end); void _q_mediaRemoved(int start, int end); void _q_mediaChanged(int start, int end); QMediaPlaylistNavigator *q_ptr; }; int QMediaPlaylistNavigatorPrivate::nextItemPos(int steps) const { if (playlist->mediaCount() == 0) return -1; if (steps == 0) return currentPos; switch (playbackMode) { case QMediaPlaylist::CurrentItemOnce: return /*currentPos == -1 ? lastValidPos :*/ -1; case QMediaPlaylist::CurrentItemInLoop: return currentPos; case QMediaPlaylist::Sequential: { int nextPos = currentPos+steps; return nextPos < playlist->mediaCount() ? nextPos : -1; } case QMediaPlaylist::Loop: return (currentPos+steps) % playlist->mediaCount(); case QMediaPlaylist::Random: { //TODO: limit the history size if (randomPositionsOffset == -1) { randomModePositions.clear(); randomModePositions.append(currentPos); randomPositionsOffset = 0; } while (randomModePositions.size() < randomPositionsOffset+steps+1) randomModePositions.append(-1); int res = randomModePositions[randomPositionsOffset+steps]; if (res<0 || res >= playlist->mediaCount()) { res = qrand() % playlist->mediaCount(); randomModePositions[randomPositionsOffset+steps] = res; } return res; } } return -1; } int QMediaPlaylistNavigatorPrivate::previousItemPos(int steps) const { if (playlist->mediaCount() == 0) return -1; if (steps == 0) return currentPos; switch (playbackMode) { case QMediaPlaylist::CurrentItemOnce: return /*currentPos == -1 ? lastValidPos :*/ -1; case QMediaPlaylist::CurrentItemInLoop: return currentPos; case QMediaPlaylist::Sequential: { int prevPos = currentPos == -1 ? playlist->mediaCount() - steps : currentPos - steps; return prevPos>=0 ? prevPos : -1; } case QMediaPlaylist::Loop: { int prevPos = currentPos - steps; while (prevPos<0) prevPos += playlist->mediaCount(); return prevPos; } case QMediaPlaylist::Random: { //TODO: limit the history size if (randomPositionsOffset == -1) { randomModePositions.clear(); randomModePositions.append(currentPos); randomPositionsOffset = 0; } while (randomPositionsOffset-steps < 0) { randomModePositions.prepend(-1); randomPositionsOffset++; } int res = randomModePositions[randomPositionsOffset-steps]; if (res<0 || res >= playlist->mediaCount()) { res = qrand() % playlist->mediaCount(); randomModePositions[randomPositionsOffset-steps] = res; } return res; } } return -1; } /*! \class QMediaPlaylistNavigator \internal \brief The QMediaPlaylistNavigator class provides navigation for a media playlist. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback \sa QMediaPlaylist, QMediaPlaylistProvider */ /*! Constructs a media playlist navigator for a \a playlist. The \a parent is passed to QObject. */ QMediaPlaylistNavigator::QMediaPlaylistNavigator(QMediaPlaylistProvider *playlist, QObject *parent) : QObject(parent) , d_ptr(new QMediaPlaylistNavigatorPrivate) { d_ptr->q_ptr = this; setPlaylist(playlist ? playlist : _q_nullMediaPlaylist()); } /*! Destroys a media playlist navigator. */ QMediaPlaylistNavigator::~QMediaPlaylistNavigator() { delete d_ptr; } /*! \property QMediaPlaylistNavigator::playbackMode Contains the playback mode. */ QMediaPlaylist::PlaybackMode QMediaPlaylistNavigator::playbackMode() const { return d_func()->playbackMode; } /*! Sets the playback \a mode. */ void QMediaPlaylistNavigator::setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { Q_D(QMediaPlaylistNavigator); if (d->playbackMode == mode) return; if (mode == QMediaPlaylist::Random) { d->randomPositionsOffset = 0; d->randomModePositions.append(d->currentPos); } else if (d->playbackMode == QMediaPlaylist::Random) { d->randomPositionsOffset = -1; d->randomModePositions.clear(); } d->playbackMode = mode; emit playbackModeChanged(mode); emit surroundingItemsChanged(); } /*! Returns the playlist being navigated. */ QMediaPlaylistProvider *QMediaPlaylistNavigator::playlist() const { return d_func()->playlist; } /*! Sets the \a playlist to navigate. */ void QMediaPlaylistNavigator::setPlaylist(QMediaPlaylistProvider *playlist) { Q_D(QMediaPlaylistNavigator); if (d->playlist == playlist) return; if (d->playlist) { d->playlist->disconnect(this); } if (playlist) { d->playlist = playlist; } else { //assign to shared readonly null playlist d->playlist = _q_nullMediaPlaylist(); } connect(d->playlist, SIGNAL(mediaInserted(int,int)), SLOT(_q_mediaInserted(int,int))); connect(d->playlist, SIGNAL(mediaRemoved(int,int)), SLOT(_q_mediaRemoved(int,int))); connect(d->playlist, SIGNAL(mediaChanged(int,int)), SLOT(_q_mediaChanged(int,int))); d->randomPositionsOffset = -1; d->randomModePositions.clear(); if (d->currentPos != -1) { d->currentPos = -1; emit currentIndexChanged(-1); } if (!d->currentItem.isNull()) { d->currentItem = QMediaContent(); emit activated(d->currentItem); //stop playback } } /*! \property QMediaPlaylistNavigator::currentItem Contains the media at the current position in the playlist. \sa currentIndex() */ QMediaContent QMediaPlaylistNavigator::currentItem() const { return itemAt(d_func()->currentPos); } /*! \fn QMediaContent QMediaPlaylistNavigator::nextItem(int steps) const Returns the media that is \a steps positions ahead of the current position in the playlist. \sa nextIndex() */ QMediaContent QMediaPlaylistNavigator::nextItem(int steps) const { return itemAt(nextIndex(steps)); } /*! Returns the media that is \a steps positions behind the current position in the playlist. \sa previousIndex() */ QMediaContent QMediaPlaylistNavigator::previousItem(int steps) const { return itemAt(previousIndex(steps)); } /*! Returns the media at a \a position in the playlist. */ QMediaContent QMediaPlaylistNavigator::itemAt(int position) const { return d_func()->playlist->media(position); } /*! \property QMediaPlaylistNavigator::currentIndex Contains the position of the current media. If no media is current, the property contains -1. \sa nextIndex(), previousIndex() */ int QMediaPlaylistNavigator::currentIndex() const { return d_func()->currentPos; } /*! Returns a position \a steps ahead of the current position accounting for the playbackMode(). If the position is beyond the end of the playlist, this value returned is -1. \sa currentIndex(), previousIndex(), playbackMode() */ int QMediaPlaylistNavigator::nextIndex(int steps) const { return d_func()->nextItemPos(steps); } /*! Returns a position \a steps behind the current position accounting for the playbackMode(). If the position is prior to the beginning of the playlist this will return -1. \sa currentIndex(), nextIndex(), playbackMode() */ int QMediaPlaylistNavigator::previousIndex(int steps) const { return d_func()->previousItemPos(steps); } /*! Advances to the next item in the playlist. \sa previous(), jump(), playbackMode() */ void QMediaPlaylistNavigator::next() { Q_D(QMediaPlaylistNavigator); int nextPos = d->nextItemPos(); if ( playbackMode() == QMediaPlaylist::Random ) d->randomPositionsOffset++; jump(nextPos); } /*! Returns to the previous item in the playlist, \sa next(), jump(), playbackMode() */ void QMediaPlaylistNavigator::previous() { Q_D(QMediaPlaylistNavigator); int prevPos = d->previousItemPos(); if ( playbackMode() == QMediaPlaylist::Random ) d->randomPositionsOffset--; jump(prevPos); } /*! Jumps to a new \a position in the playlist. */ void QMediaPlaylistNavigator::jump(int position) { Q_D(QMediaPlaylistNavigator); if (position<-1 || position>=d->playlist->mediaCount()) { qWarning() << "QMediaPlaylistNavigator: Jump outside playlist range"; position = -1; } if (position != -1) d->lastValidPos = position; if (playbackMode() == QMediaPlaylist::Random) { if (d->randomModePositions[d->randomPositionsOffset] != position) { d->randomModePositions.clear(); d->randomModePositions.append(position); d->randomPositionsOffset = 0; } } if (position != -1) d->currentItem = d->playlist->media(position); else d->currentItem = QMediaContent(); if (position != d->currentPos) { d->currentPos = position; emit currentIndexChanged(d->currentPos); emit surroundingItemsChanged(); } emit activated(d->currentItem); } /*! \internal */ void QMediaPlaylistNavigatorPrivate::_q_mediaInserted(int start, int end) { Q_Q(QMediaPlaylistNavigator); if (currentPos >= start) { currentPos = end-start+1; q->jump(currentPos); } //TODO: check if they really changed emit q->surroundingItemsChanged(); } /*! \internal */ void QMediaPlaylistNavigatorPrivate::_q_mediaRemoved(int start, int end) { Q_Q(QMediaPlaylistNavigator); if (currentPos > end) { currentPos = currentPos - end-start+1; q->jump(currentPos); } else if (currentPos >= start) { //current item was removed currentPos = qMin(start, playlist->mediaCount()-1); q->jump(currentPos); } //TODO: check if they really changed emit q->surroundingItemsChanged(); } /*! \internal */ void QMediaPlaylistNavigatorPrivate::_q_mediaChanged(int start, int end) { Q_Q(QMediaPlaylistNavigator); if (currentPos >= start && currentPos<=end) { QMediaContent src = playlist->media(currentPos); if (src != currentItem) { currentItem = src; emit q->activated(src); } } //TODO: check if they really changed emit q->surroundingItemsChanged(); } /*! \fn QMediaPlaylistNavigator::activated(const QMediaContent &media) Signals that the current \a media has changed. */ /*! \fn QMediaPlaylistNavigator::currentIndexChanged(int position) Signals the \a position of the current media has changed. */ /*! \fn QMediaPlaylistNavigator::playbackModeChanged(QMediaPlaylist::PlaybackMode mode) Signals that the playback \a mode has changed. */ /*! \fn QMediaPlaylistNavigator::surroundingItemsChanged() Signals that media immediately surrounding the current position has changed. */ #include "moc_qmediaplaylistnavigator_p.cpp" QT_END_NAMESPACE qmediaplaylistnavigator_p.h000066400000000000000000000100531225012771600346530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLAYLISTNAVIGATOR_P_H #define QMEDIAPLAYLISTNAVIGATOR_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qmediaplaylistprovider_p.h" #include "qmediaplaylist.h" #include QT_BEGIN_NAMESPACE class QMediaPlaylistNavigatorPrivate; class Q_MULTIMEDIA_EXPORT QMediaPlaylistNavigator : public QObject { Q_OBJECT Q_PROPERTY(QMediaPlaylist::PlaybackMode playbackMode READ playbackMode WRITE setPlaybackMode NOTIFY playbackModeChanged) Q_PROPERTY(int currentIndex READ currentIndex WRITE jump NOTIFY currentIndexChanged) Q_PROPERTY(QMediaContent currentItem READ currentItem) public: QMediaPlaylistNavigator(QMediaPlaylistProvider *playlist, QObject *parent = 0); virtual ~QMediaPlaylistNavigator(); QMediaPlaylistProvider *playlist() const; void setPlaylist(QMediaPlaylistProvider *playlist); QMediaPlaylist::PlaybackMode playbackMode() const; QMediaContent currentItem() const; QMediaContent nextItem(int steps = 1) const; QMediaContent previousItem(int steps = 1) const; QMediaContent itemAt(int position) const; int currentIndex() const; int nextIndex(int steps = 1) const; int previousIndex(int steps = 1) const; public Q_SLOTS: void next(); void previous(); void jump(int); void setPlaybackMode(QMediaPlaylist::PlaybackMode mode); Q_SIGNALS: void activated(const QMediaContent &content); void currentIndexChanged(int); void playbackModeChanged(QMediaPlaylist::PlaybackMode mode); void surroundingItemsChanged(); protected: QMediaPlaylistNavigatorPrivate *d_ptr; private: Q_DISABLE_COPY(QMediaPlaylistNavigator) Q_DECLARE_PRIVATE(QMediaPlaylistNavigator) Q_PRIVATE_SLOT(d_func(), void _q_mediaInserted(int start, int end)) Q_PRIVATE_SLOT(d_func(), void _q_mediaRemoved(int start, int end)) Q_PRIVATE_SLOT(d_func(), void _q_mediaChanged(int start, int end)) }; QT_END_NAMESPACE #endif // QMEDIAPLAYLISTNAVIGATOR_P_H qmediaplaylistprovider.cpp000066400000000000000000000201011225012771600345220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaplaylistprovider_p.h" #include QT_BEGIN_NAMESPACE /*! \class QMediaPlaylistProvider \internal \brief The QMediaPlaylistProvider class provides an abstract list of media. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback \sa QMediaPlaylist */ /*! Constructs a playlist provider with the given \a parent. */ QMediaPlaylistProvider::QMediaPlaylistProvider(QObject *parent) :QObject(parent), d_ptr(new QMediaPlaylistProviderPrivate) { } /*! \internal */ QMediaPlaylistProvider::QMediaPlaylistProvider(QMediaPlaylistProviderPrivate &dd, QObject *parent) :QObject(parent), d_ptr(&dd) { } /*! Destroys a playlist provider. */ QMediaPlaylistProvider::~QMediaPlaylistProvider() { delete d_ptr; } /*! \fn QMediaPlaylistProvider::mediaCount() const; Returns the size of playlist. */ /*! \fn QMediaPlaylistProvider::media(int index) const; Returns the media at \a index in the playlist. If the index is invalid this will return a null media content. */ /*! Loads a playlist using network \a request. If no playlist \a format is specified the loader will inspect the URL or probe the headers to guess the format. New items are appended to playlist. Returns true if the provider supports the format and loading from the locations URL protocol, otherwise this will return false. */ bool QMediaPlaylistProvider::load(const QNetworkRequest &request, const char *format) { Q_UNUSED(request); Q_UNUSED(format); return false; } /*! Loads a playlist from from an I/O \a device. If no playlist \a format is specified the loader will probe the headers to guess the format. New items are appended to playlist. Returns true if the provider supports the format and loading from an I/O device, otherwise this will return false. */ bool QMediaPlaylistProvider::load(QIODevice * device, const char *format) { Q_UNUSED(device); Q_UNUSED(format); return false; } /*! Saves the contents of a playlist to a URL \a location. If no playlist \a format is specified the writer will inspect the URL to guess the format. Returns true if the playlist was saved successfully; and false otherwise. */ bool QMediaPlaylistProvider::save(const QUrl &location, const char *format) { Q_UNUSED(location); Q_UNUSED(format); return false; } /*! Saves the contents of a playlist to an I/O \a device in the specified \a format. Returns true if the playlist was saved successfully; and false otherwise. */ bool QMediaPlaylistProvider::save(QIODevice * device, const char *format) { Q_UNUSED(device); Q_UNUSED(format); return false; } /*! Returns true if a playlist is read-only; otherwise returns false. */ bool QMediaPlaylistProvider::isReadOnly() const { return true; } /*! Append \a media to a playlist. Returns true if the media was appended; and false otherwise. */ bool QMediaPlaylistProvider::addMedia(const QMediaContent &media) { Q_UNUSED(media); return false; } /*! Append multiple media \a items to a playlist. Returns true if the media items were appended; and false otherwise. */ bool QMediaPlaylistProvider::addMedia(const QList &items) { foreach(const QMediaContent &item, items) { if (!addMedia(item)) return false; } return true; } /*! Inserts \a media into a playlist at \a position. Returns true if the media was inserted; and false otherwise. */ bool QMediaPlaylistProvider::insertMedia(int position, const QMediaContent &media) { Q_UNUSED(position); Q_UNUSED(media); return false; } /*! Inserts multiple media \a items into a playlist at \a position. Returns true if the media \a items were inserted; and false otherwise. */ bool QMediaPlaylistProvider::insertMedia(int position, const QList &items) { for (int i=0; i &contentList); virtual bool insertMedia(int index, const QMediaContent &content); virtual bool insertMedia(int index, const QList &content); virtual bool removeMedia(int pos); virtual bool removeMedia(int start, int end); virtual bool clear(); public Q_SLOTS: virtual void shuffle(); Q_SIGNALS: void mediaAboutToBeInserted(int start, int end); void mediaInserted(int start, int end); void mediaAboutToBeRemoved(int start, int end); void mediaRemoved(int start, int end); void mediaChanged(int start, int end); void loaded(); void loadFailed(QMediaPlaylist::Error, const QString& errorMessage); protected: QMediaPlaylistProviderPrivate *d_ptr; QMediaPlaylistProvider(QMediaPlaylistProviderPrivate &dd, QObject *parent); private: Q_DECLARE_PRIVATE(QMediaPlaylistProvider) }; QT_END_NAMESPACE #endif // QMEDIAPLAYLISTSOURCE_P_H qmediaresource.cpp000066400000000000000000000256651225012771600327610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaresource.h" #include #include #include QT_BEGIN_NAMESPACE namespace { class QMediaResourcePrivateRegisterMetaTypes { public: QMediaResourcePrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QMediaResource \brief The QMediaResource class provides a description of a media resource. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_playback A media resource is composed of a \l {url()}{URL} containing the location of the resource and a set of properties that describe the format of the resource. The properties provide a means to assess a resource without first attempting to load it, and in situations where media be represented by multiple alternative representations provide a means to select the appropriate resource. Media made available by a remote services can often be available in multiple encodings or quality levels, this allows a client to select an appropriate resource based on considerations such as codecs supported, network bandwidth, and display constraints. QMediaResource includes information such as the \l {mimeType()}{MIME type}, \l {audioCodec()}{audio} and \l {videoCodec()}{video} codecs, \l {audioBitRate()}{audio} and \l {videoBitRate()}{video} bit rates, and \l {resolution()}{resolution} so these constraints and others can be evaluated. The only mandatory property of a QMediaResource is the url(). \sa QMediaContent */ /*! \typedef QMediaResourceList Synonym for \c QList \relates QMediaResource */ /*! Constructs a null media resource. */ QMediaResource::QMediaResource() { } /*! Constructs a media resource with the given \a mimeType from a \a url. */ QMediaResource::QMediaResource(const QUrl &url, const QString &mimeType) { values.insert(Url, url); values.insert(MimeType, mimeType); } /*! Constructs a media resource with the given \a mimeType from a network \a request. */ QMediaResource::QMediaResource(const QNetworkRequest &request, const QString &mimeType) { values.insert(Request, QVariant::fromValue(request)); values.insert(Url, request.url()); values.insert(MimeType, mimeType); } /*! Constructs a copy of a media resource \a other. */ QMediaResource::QMediaResource(const QMediaResource &other) : values(other.values) { } /*! Assigns the value of \a other to a media resource. */ QMediaResource &QMediaResource::operator =(const QMediaResource &other) { values = other.values; return *this; } /*! Destroys a media resource. */ QMediaResource::~QMediaResource() { } /*! Compares a media resource to \a other. Returns true if the resources are identical, and false otherwise. */ bool QMediaResource::operator ==(const QMediaResource &other) const { // Compare requests directly as QNetworkRequests are "custom types". foreach (int key, values.keys()) { switch (key) { case Request: if (request() != other.request()) return false; break; default: if (values.value(key) != other.values.value(key)) return false; } } return true; } /*! Compares a media resource to \a other. Returns true if they are different, and false otherwise. */ bool QMediaResource::operator !=(const QMediaResource &other) const { return !(*this == other); } /*! Identifies if a media resource is null. Returns true if the resource is null, and false otherwise. */ bool QMediaResource::isNull() const { return values.isEmpty(); } /*! Returns the URL of a media resource. */ QUrl QMediaResource::url() const { return qvariant_cast(values.value(Url)); } /*! Returns the network request associated with this media resource. */ QNetworkRequest QMediaResource::request() const { if(values.contains(Request)) return qvariant_cast(values.value(Request)); return QNetworkRequest(url()); } /*! Returns the MIME type of a media resource. This may be null if the MIME type is unknown. */ QString QMediaResource::mimeType() const { return qvariant_cast(values.value(MimeType)); } /*! Returns the language of a media resource as an ISO 639-2 code. This may be null if the language is unknown. */ QString QMediaResource::language() const { return qvariant_cast(values.value(Language)); } /*! Sets the \a language of a media resource. */ void QMediaResource::setLanguage(const QString &language) { if (!language.isNull()) values.insert(Language, language); else values.remove(Language); } /*! Returns the audio codec of a media resource. This may be null if the media resource does not contain an audio stream, or the codec is unknown. */ QString QMediaResource::audioCodec() const { return qvariant_cast(values.value(AudioCodec)); } /*! Sets the audio \a codec of a media resource. */ void QMediaResource::setAudioCodec(const QString &codec) { if (!codec.isNull()) values.insert(AudioCodec, codec); else values.remove(AudioCodec); } /*! Returns the video codec of a media resource. This may be null if the media resource does not contain a video stream, or the codec is unknonwn. */ QString QMediaResource::videoCodec() const { return qvariant_cast(values.value(VideoCodec)); } /*! Sets the video \a codec of media resource. */ void QMediaResource::setVideoCodec(const QString &codec) { if (!codec.isNull()) values.insert(VideoCodec, codec); else values.remove(VideoCodec); } /*! Returns the size in bytes of a media resource. This may be zero if the size is unknown. */ qint64 QMediaResource::dataSize() const { return qvariant_cast(values.value(DataSize)); } /*! Sets the \a size in bytes of a media resource. */ void QMediaResource::setDataSize(const qint64 size) { if (size != 0) values.insert(DataSize, size); else values.remove(DataSize); } /*! Returns the bit rate in bits per second of a media resource's audio stream. This may be zero if the bit rate is unknown, or the resource contains no audio stream. */ int QMediaResource::audioBitRate() const { return values.value(AudioBitRate).toInt(); } /*! Sets the bit \a rate in bits per second of a media resource's video stream. */ void QMediaResource::setAudioBitRate(int rate) { if (rate != 0) values.insert(AudioBitRate, rate); else values.remove(AudioBitRate); } /*! Returns the audio sample rate of a media resource. This may be zero if the sample size is unknown, or the resource contains no audio stream. */ int QMediaResource::sampleRate() const { return qvariant_cast(values.value(SampleRate)); } /*! Sets the audio \a sampleRate of a media resource. */ void QMediaResource::setSampleRate(int sampleRate) { if (sampleRate != 0) values.insert(SampleRate, sampleRate); else values.remove(SampleRate); } /*! Returns the number of audio channels in a media resource. This may be zero if the sample size is unknown, or the resource contains no audio stream. */ int QMediaResource::channelCount() const { return qvariant_cast(values.value(ChannelCount)); } /*! Sets the number of audio \a channels in a media resource. */ void QMediaResource::setChannelCount(int channels) { if (channels != 0) values.insert(ChannelCount, channels); else values.remove(ChannelCount); } /*! Returns the bit rate in bits per second of a media resource's video stream. This may be zero if the bit rate is unknown, or the resource contains no video stream. */ int QMediaResource::videoBitRate() const { return values.value(VideoBitRate).toInt(); } /*! Sets the bit \a rate in bits per second of a media resource's video stream. */ void QMediaResource::setVideoBitRate(int rate) { if (rate != 0) values.insert(VideoBitRate, rate); else values.remove(VideoBitRate); } /*! Returns the resolution in pixels of a media resource. This may be null is the resolution is unknown, or the resource contains no pixel data (i.e. the resource is an audio stream. */ QSize QMediaResource::resolution() const { return qvariant_cast(values.value(Resolution)); } /*! Sets the \a resolution in pixels of a media resource. */ void QMediaResource::setResolution(const QSize &resolution) { if (resolution.width() != -1 || resolution.height() != -1) values.insert(Resolution, resolution); else values.remove(Resolution); } /*! Sets the \a width and \a height in pixels of a media resource. */ void QMediaResource::setResolution(int width, int height) { if (width != -1 || height != -1) values.insert(Resolution, QSize(width, height)); else values.remove(Resolution); } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/playback/qmediaresource.h000066400000000000000000000076251225012771600325010ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARESOURCE_H #define QMEDIARESOURCE_H #include #include #include #include QT_BEGIN_NAMESPACE // Class forward declaration required for QDoc bug class QString; class Q_MULTIMEDIA_EXPORT QMediaResource { public: QMediaResource(); QMediaResource(const QUrl &url, const QString &mimeType = QString()); QMediaResource(const QNetworkRequest &request, const QString &mimeType = QString()); QMediaResource(const QMediaResource &other); QMediaResource &operator =(const QMediaResource &other); ~QMediaResource(); bool isNull() const; bool operator ==(const QMediaResource &other) const; bool operator !=(const QMediaResource &other) const; QUrl url() const; QNetworkRequest request() const; QString mimeType() const; QString language() const; void setLanguage(const QString &language); QString audioCodec() const; void setAudioCodec(const QString &codec); QString videoCodec() const; void setVideoCodec(const QString &codec); qint64 dataSize() const; void setDataSize(const qint64 size); int audioBitRate() const; void setAudioBitRate(int rate); int sampleRate() const; void setSampleRate(int frequency); int channelCount() const; void setChannelCount(int channels); int videoBitRate() const; void setVideoBitRate(int rate); QSize resolution() const; void setResolution(const QSize &resolution); void setResolution(int width, int height); private: enum Property { Url, Request, MimeType, Language, AudioCodec, VideoCodec, DataSize, AudioBitRate, VideoBitRate, SampleRate, ChannelCount, Resolution }; QMap values; }; typedef QList QMediaResourceList; QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaResource) Q_DECLARE_METATYPE(QMediaResourceList) #endif qmediabindableinterface.cpp000066400000000000000000000051611225012771600327520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QT_BEGIN_NAMESPACE /*! \class QMediaBindableInterface \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_core \brief The QMediaBindableInterface class is the base class for objects extending media objects functionality. \sa */ /*! Destroys a media helper object. */ QMediaBindableInterface::~QMediaBindableInterface() { } /*! \fn QMediaBindableInterface::mediaObject() const; Return the currently attached media object. */ /*! \fn QMediaBindableInterface::setMediaObject(QMediaObject *object); Attaches to the media \a object. Returns true if attached successfully, otherwise returns false. */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediabindableinterface.h000066400000000000000000000050101225012771600324670ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIABINDABLEINTERFACE_H #define QMEDIABINDABLEINTERFACE_H #include QT_BEGIN_NAMESPACE class QMediaObject; class Q_MULTIMEDIA_EXPORT QMediaBindableInterface { public: virtual ~QMediaBindableInterface(); virtual QMediaObject *mediaObject() const = 0; protected: friend class QMediaObject; virtual bool setMediaObject(QMediaObject *object) = 0; }; #define QMediaBindableInterface_iid \ "org.qt-project.qt.mediabindable/5.0" Q_DECLARE_INTERFACE(QMediaBindableInterface, QMediaBindableInterface_iid) QT_END_NAMESPACE #endif // QMEDIABINDABLEINTERFACE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediacontrol.cpp000066400000000000000000000105641225012771600310730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qmediacontrol.h" #include "qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QMediaControl \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_control \ingroup multimedia_core \brief The QMediaControl class provides a base interface for media service controls. Media controls provide an interface to individual features provided by a media service. Most services implement a principal control which exposes the core functionality of the service and a number of optional controls which expose any additional functionality. A pointer to a control implemented by a media service can be obtained using the \l {QMediaService::requestControl()} member of QMediaService. If the service doesn't implement a control it will instead return a null pointer. \snippet multimedia-snippets/media.cpp Request control Alternatively if the IId of the control has been declared using Q_MEDIA_DECLARE_CONTROL the template version of QMediaService::requestControl() can be used to request the service without explicitly passing the IId or using qobject_cast(). \snippet multimedia-snippets/media.cpp Request control templated Most application code will not interface directly with a media service's controls, instead the QMediaObject which owns the service acts as an intermediary between one or more controls and the application. \sa QMediaService, QMediaObject */ /*! \macro Q_MEDIA_DECLARE_CONTROL(Class, IId) \relates QMediaControl The Q_MEDIA_DECLARE_CONTROL macro declares an \a IId for a \a Class that inherits from QMediaControl. Declaring an IId for a QMediaControl allows an instance of that control to be requested from QMediaService::requestControl() without explicitly passing the IId. \snippet multimedia-snippets/media.cpp Request control templated \sa QMediaService::requestControl() */ /*! Destroys a media control. */ QMediaControl::~QMediaControl() { delete d_ptr; } /*! Constructs a media control with the given \a parent. */ QMediaControl::QMediaControl(QObject *parent) : QObject(parent) , d_ptr(new QMediaControlPrivate) { d_ptr->q_ptr = this; } /*! \internal */ QMediaControl::QMediaControl(QMediaControlPrivate &dd, QObject *parent) : QObject(parent) , d_ptr(&dd) { d_ptr->q_ptr = this; } #include "moc_qmediacontrol.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediacontrol.h000066400000000000000000000052751225012771600305430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIACONTROL_H #define QABSTRACTMEDIACONTROL_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaControlPrivate; class Q_MULTIMEDIA_EXPORT QMediaControl : public QObject { Q_OBJECT public: ~QMediaControl(); protected: QMediaControl(QObject *parent = 0); QMediaControl(QMediaControlPrivate &dd, QObject *parent = 0); QMediaControlPrivate *d_ptr; private: Q_DECLARE_PRIVATE(QMediaControl) }; template const char *qmediacontrol_iid() { return 0; } #define Q_MEDIA_DECLARE_CONTROL(Class, IId) \ template <> inline const char *qmediacontrol_iid() { return IId; } QT_END_NAMESPACE #endif // QABSTRACTMEDIACONTROL_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediacontrol_p.h000066400000000000000000000046441225012771600310610ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIACONTROL_P_H #define QABSTRACTMEDIACONTROL_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE class QMediaControl; class QMediaControlPrivate { public: virtual ~QMediaControlPrivate() {} QMediaControl *q_ptr; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaenumdebug.h000066400000000000000000000053021225012771600310250ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAENUMDEBUG_H #define QMEDIAENUMDEBUG_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. #include #include QT_BEGIN_NAMESPACE #ifndef QT_NO_DEBUG_STREAM #define Q_MEDIA_ENUM_DEBUG(Class,Enum) \ inline QDebug operator<<(QDebug dbg, Class::Enum value) \ { \ int index = Class::staticMetaObject.indexOfEnumerator(#Enum); \ dbg.nospace() << #Class << "::" << Class::staticMetaObject.enumerator(index).valueToKey(value); \ return dbg.space(); \ } #else #define Q_MEDIA_ENUM_DEBUG(Class,Enum) #endif //QT_NO_DEBUG_STREAM QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediametadata.cpp000066400000000000000000000342531225012771600311740ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediametadata.h" QT_BEGIN_NAMESPACE /* When these conditions are satisfied, QStringLiteral is implemented by gcc's statement-expression extension. However, in this file it will not work, because "statement-expressions are not allowed outside functions nor in template-argument lists". MSVC 2012 produces an internal compiler error on encountering QStringLiteral in this context. Fall back to the less-performant QLatin1String in this case. */ #if defined(Q_CC_GNU) && defined(Q_COMPILER_LAMBDA) # define Q_DEFINE_METADATA(key) const QString QMediaMetaData::key(QStringLiteral(#key)) #else # define Q_DEFINE_METADATA(key) const QString QMediaMetaData::key(QLatin1String(#key)) #endif // Common Q_DEFINE_METADATA(Title); Q_DEFINE_METADATA(SubTitle); Q_DEFINE_METADATA(Author); Q_DEFINE_METADATA(Comment); Q_DEFINE_METADATA(Description); Q_DEFINE_METADATA(Category); Q_DEFINE_METADATA(Genre); Q_DEFINE_METADATA(Year); Q_DEFINE_METADATA(Date); Q_DEFINE_METADATA(UserRating); Q_DEFINE_METADATA(Keywords); Q_DEFINE_METADATA(Language); Q_DEFINE_METADATA(Publisher); Q_DEFINE_METADATA(Copyright); Q_DEFINE_METADATA(ParentalRating); Q_DEFINE_METADATA(RatingOrganization); // Media Q_DEFINE_METADATA(Size); Q_DEFINE_METADATA(MediaType); Q_DEFINE_METADATA(Duration); // Audio Q_DEFINE_METADATA(AudioBitRate); Q_DEFINE_METADATA(AudioCodec); Q_DEFINE_METADATA(AverageLevel); Q_DEFINE_METADATA(ChannelCount); Q_DEFINE_METADATA(PeakValue); Q_DEFINE_METADATA(SampleRate); // Music Q_DEFINE_METADATA(AlbumTitle); Q_DEFINE_METADATA(AlbumArtist); Q_DEFINE_METADATA(ContributingArtist); Q_DEFINE_METADATA(Composer); Q_DEFINE_METADATA(Conductor); Q_DEFINE_METADATA(Lyrics); Q_DEFINE_METADATA(Mood); Q_DEFINE_METADATA(TrackNumber); Q_DEFINE_METADATA(TrackCount); Q_DEFINE_METADATA(CoverArtUrlSmall); Q_DEFINE_METADATA(CoverArtUrlLarge); // Image/Video Q_DEFINE_METADATA(Resolution); Q_DEFINE_METADATA(PixelAspectRatio); // Video Q_DEFINE_METADATA(VideoFrameRate); Q_DEFINE_METADATA(VideoBitRate); Q_DEFINE_METADATA(VideoCodec); Q_DEFINE_METADATA(PosterUrl); // Movie Q_DEFINE_METADATA(ChapterNumber); Q_DEFINE_METADATA(Director); Q_DEFINE_METADATA(LeadPerformer); Q_DEFINE_METADATA(Writer); // Photos Q_DEFINE_METADATA(CameraManufacturer); Q_DEFINE_METADATA(CameraModel); Q_DEFINE_METADATA(Event); Q_DEFINE_METADATA(Subject); Q_DEFINE_METADATA(Orientation); Q_DEFINE_METADATA(ExposureTime); Q_DEFINE_METADATA(FNumber); Q_DEFINE_METADATA(ExposureProgram); Q_DEFINE_METADATA(ISOSpeedRatings); Q_DEFINE_METADATA(ExposureBiasValue); Q_DEFINE_METADATA(DateTimeOriginal); Q_DEFINE_METADATA(DateTimeDigitized); Q_DEFINE_METADATA(SubjectDistance); Q_DEFINE_METADATA(MeteringMode); Q_DEFINE_METADATA(LightSource); Q_DEFINE_METADATA(Flash); Q_DEFINE_METADATA(FocalLength); Q_DEFINE_METADATA(ExposureMode); Q_DEFINE_METADATA(WhiteBalance); Q_DEFINE_METADATA(DigitalZoomRatio); Q_DEFINE_METADATA(FocalLengthIn35mmFilm); Q_DEFINE_METADATA(SceneCaptureType); Q_DEFINE_METADATA(GainControl); Q_DEFINE_METADATA(Contrast); Q_DEFINE_METADATA(Saturation); Q_DEFINE_METADATA(Sharpness); Q_DEFINE_METADATA(DeviceSettingDescription); // Location Q_DEFINE_METADATA(GPSLatitude); Q_DEFINE_METADATA(GPSLongitude); Q_DEFINE_METADATA(GPSAltitude); Q_DEFINE_METADATA(GPSTimeStamp); Q_DEFINE_METADATA(GPSSatellites); Q_DEFINE_METADATA(GPSStatus); Q_DEFINE_METADATA(GPSDOP); Q_DEFINE_METADATA(GPSSpeed); Q_DEFINE_METADATA(GPSTrack); Q_DEFINE_METADATA(GPSTrackRef); Q_DEFINE_METADATA(GPSImgDirection); Q_DEFINE_METADATA(GPSImgDirectionRef); Q_DEFINE_METADATA(GPSMapDatum); Q_DEFINE_METADATA(GPSProcessingMethod); Q_DEFINE_METADATA(GPSAreaInformation); Q_DEFINE_METADATA(PosterImage); Q_DEFINE_METADATA(CoverArtImage); Q_DEFINE_METADATA(ThumbnailImage); /*! \namespace QMediaMetaData \ingroup multimedia \inmodule QtMultimedia This namespace provides identifiers for meta-data attributes. \note Not all identifiers are supported on all platforms. Please consult vendor documentation for specific support on different platforms. \table 60% \header \li {3,1} Common attributes \header \li Value \li Description \li Type \row \li Title \li The title of the media. \li QString \row \li SubTitle \li The sub-title of the media. \li QString \row \li Author \li The authors of the media. \li QStringList \row \li Comment \li A user comment about the media. \li QString \row \li Description \li A description of the media. \li QString \row \li Category \li The category of the media. \li QStringList \row \li Genre \li The genre of the media. \li QStringList \row \li Year \li The year of release of the media. \li int \row \li Date \li The date of the media. \li QDate. \row \li UserRating \li A user rating of the media. \li int [0..100] \row \li Keywords \li A list of keywords describing the media. \li QStringList \row \li Language \li The language of media, as an ISO 639-2 code. \li QString \row \li Publisher \li The publisher of the media. \li QString \row \li Copyright \li The media's copyright notice. \li QString \row \li ParentalRating \li The parental rating of the media. \li QString \row \li RatingOrganization \li The organization responsible for the parental rating of the media. \li QString \header \li {3,1} Media attributes \row \li Size \li The size in bytes of the media. \li qint64 \row \li MediaType \li The type of the media (audio, video, etc). \li QString \row \li Duration \li The duration in millseconds of the media. \li qint64 \header \li {3,1} Audio attributes \row \li AudioBitRate \li The bit rate of the media's audio stream in bits per second. \li int \row \li AudioCodec \li The codec of the media's audio stream. \li QString \row \li AverageLevel \li The average volume level of the media. \li int \row \li ChannelCount \li The number of channels in the media's audio stream. \li int \row \li PeakValue \li The peak volume of the media's audio stream. \li int \row \li SampleRate \li The sample rate of the media's audio stream in hertz. \li int \header \li {3,1} Music attributes \row \li AlbumTitle \li The title of the album the media belongs to. \li QString \row \li AlbumArtist \li The principal artist of the album the media belongs to. \li QString \row \li ContributingArtist \li The artists contributing to the media. \li QStringList \row \li Composer \li The composer of the media. \li QStringList \row \li Conductor \li The conductor of the media. \li QString \row \li Lyrics \li The lyrics to the media. \li QString \row \li Mood \li The mood of the media. \li QString \row \li TrackNumber \li The track number of the media. \li int \row \li TrackCount \li The number of tracks on the album containing the media. \li int \row \li CoverArtUrlSmall \li The URL of a small cover art image. \li QUrl \row \li CoverArtUrlLarge \li The URL of a large cover art image. \li QUrl \row \li CoverArtImage \li An embedded cover art image. \li QImage \header \li {3,1} Image and video attributes \row \li Resolution \li The dimensions of an image or video. \li QSize \row \li PixelAspectRatio \li The pixel aspect ratio of an image or video. \li QSize \header \li {3,1} Video attributes \row \li VideoFrameRate \li The frame rate of the media's video stream. \li qreal \row \li VideoBitRate \li The bit rate of the media's video stream in bits per second. \li int \row \li VideoCodec \li The codec of the media's video stream. \li QString \row \li PosterUrl \li The URL of a poster image. \li QUrl \row \li PosterImage \li An embedded poster image. \li QImage \header \li {3,1} Movie attributes \row \li ChapterNumber \li The chapter number of the media. \li int \row \li Director \li The director of the media. \li QString \row \li LeadPerformer \li The lead performer in the media. \li QStringList \row \li Writer \li The writer of the media. \li QStringList \header \li {3,1} Photo attributes. \row \li CameraManufacturer \li The manufacturer of the camera used to capture the media. \li QString \row \li CameraModel \li The model of the camera used to capture the media. \li QString \row \li Event \li The event during which the media was captured. \li QString \row \li Subject \li The subject of the media. \li QString \row \li Orientation \li Orientation of image. \li int (degrees) \row \li ExposureTime \li Exposure time, given in seconds. \li qreal \row \li FNumber \li The F Number. \li int \row \li ExposureProgram \li The class of the program used by the camera to set exposure when the picture is taken. \li QString \row \li ISOSpeedRatings \li Indicates the ISO Speed and ISO Latitude of the camera or input device as specified in ISO 12232. \li qreal \row \li ExposureBiasValue \li The exposure bias. The unit is the APEX (Additive System of Photographic Exposure) setting. \li qreal \row \li DateTimeOriginal \li The date and time when the original image data was generated. \li QDateTime \row \li DateTimeDigitized \li The date and time when the image was stored as digital data. \li QDateTime \row \li SubjectDistance \li The distance to the subject, given in meters. \li qreal \row \li MeteringMode \li The metering mode. \li QCameraExposure::MeteringMode \row \li LightSource \li The kind of light source. \li QString \row \li Flash \li Status of flash when the image was shot. \li QCameraExposure::FlashMode \row \li FocalLength \li The actual focal length of the lens, in mm. \li qreal \row \li ExposureMode \li Indicates the exposure mode set when the image was shot. \li QCameraExposure::ExposureMode \row \li WhiteBalance \li Indicates the white balance mode set when the image was shot. \li QCameraImageProcessing::WhiteBalanceMode \row \li DigitalZoomRatio \li Indicates the digital zoom ratio when the image was shot. \li qreal \row \li FocalLengthIn35mmFilm \li Indicates the equivalent focal length assuming a 35mm film camera, in mm. \li qreal \row \li SceneCaptureType \li Indicates the type of scene that was shot. It can also be used to record the mode in which the image was shot. \li QString \row \li GainControl \li Indicates the degree of overall image gain adjustment. \li qreal \row \li Contrast \li Indicates the direction of contrast processing applied by the camera when the image was shot. \li qreal \row \li Saturation \li Indicates the direction of saturation processing applied by the camera when the image was shot. \li qreal \row \li Sharpness \li Indicates the direction of sharpness processing applied by the camera when the image was shot. \li qreal \row \li DeviceSettingDescription \li Exif tag, indicates information on the picture-taking conditions of a particular camera model. \li QString \row \li GPSLatitude \li Latitude value of the geographical position (decimal degrees). A positive latitude indicates the Northern Hemisphere, and a negative latitude indicates the Southern Hemisphere. \li double \row \li GPSLongitude \li Longitude value of the geographical position (decimal degrees). A positive longitude indicates the Eastern Hemisphere, and a negative longitude indicates the Western Hemisphere. \li double \row \li GPSAltitude \li The value of altitude in meters above sea level. \li double \row \li GPSTimeStamp \li Time stamp of GPS data. \li QDateTime \row \li GPSSatellites \li GPS satellites used for measurements. \li QString \row \li GPSStatus \li Status of GPS receiver at image creation time. \li QString \row \li GPSDOP \li Degree of precision for GPS data. \li qreal \row \li GPSSpeed \li Speed of GPS receiver movement in kilometers per hour. \li qreal \row \li GPSTrack \li Direction of GPS receiver movement. The range of values is [0.0, 360), with 0 direction pointing on either true or magnetic north, depending on GPSTrackRef. \li qreal \row \li GPSTrackRef \li Reference for movement direction. \li QChar. 'T' means true direction and 'M' is magnetic direction. \row \li GPSImgDirection \li Direction of image when captured. \li qreal The range of values is [0.0, 360). \row \li GPSImgDirectionRef \li Reference for image direction. \li QChar. 'T' means true direction and 'M' is magnetic direction. \row \li GPSMapDatum \li Geodetic survey data used by the GPS receiver. \li QString \row \li GPSProcessingMethod \li The name of the method used for location finding. \li QString \row \li GPSAreaInformation \li The name of the GPS area. \li QString \row \li ThumbnailImage \li An embedded thumbnail image. \li QImage \endtable */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediametadata.h000066400000000000000000000203431225012771600306340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAMETADATA_H #define QMEDIAMETADATA_H #include #include #include #include QT_BEGIN_NAMESPACE // Class forward declaration required for QDoc bug class QString; #define Q_DECLARE_METADATA(key) Q_MULTIMEDIA_EXPORT extern const QString key namespace QMediaMetaData { #ifdef Q_QDOC // QDoc does not like macros, so try to keep this in sync :) QString Title; QString SubTitle; QString Author; QString Comment; QString Description; QString Category; QString Genre; QString Year; QString Date; QString UserRating; QString Keywords; QString Language; QString Publisher; QString Copyright; QString ParentalRating; QString RatingOrganization; // Media QString Size; QString MediaType; QString Duration; // Audio QString AudioBitRate; QString AudioCodec; QString AverageLevel; QString ChannelCount; QString PeakValue; QString SampleRate; // Music QString AlbumTitle; QString AlbumArtist; QString ContributingArtist; QString Composer; QString Conductor; QString Lyrics; QString Mood; QString TrackNumber; QString TrackCount; QString CoverArtUrlSmall; QString CoverArtUrlLarge; // Image/Video QString Resolution; QString PixelAspectRatio; // Video QString VideoFrameRate; QString VideoBitRate; QString VideoCodec; QString PosterUrl; // Movie QString ChapterNumber; QString Director; QString LeadPerformer; QString Writer; // Photos QString CameraManufacturer; QString CameraModel; QString Event; QString Subject; QString Orientation; QString ExposureTime; QString FNumber; QString ExposureProgram; QString ISOSpeedRatings; QString ExposureBiasValue; QString DateTimeOriginal; QString DateTimeDigitized; QString SubjectDistance; QString MeteringMode; QString LightSource; QString Flash; QString FocalLength; QString ExposureMode; QString WhiteBalance; QString DigitalZoomRatio; QString FocalLengthIn35mmFilm; QString SceneCaptureType; QString GainControl; QString Contrast; QString Saturation; QString Sharpness; QString DeviceSettingDescription; // Location QString GPSLatitude; QString GPSLongitude; QString GPSAltitude; QString GPSTimeStamp; QString GPSSatellites; QString GPSStatus; QString GPSDOP; QString GPSSpeed; QString GPSTrack; QString GPSTrackRef; QString GPSImgDirection; QString GPSImgDirectionRef; QString GPSMapDatum; QString GPSProcessingMethod; QString GPSAreaInformation; QString PosterImage; QString CoverArtImage; QString ThumbnailImage; #else // Common Q_DECLARE_METADATA(Title); Q_DECLARE_METADATA(SubTitle); Q_DECLARE_METADATA(Author); Q_DECLARE_METADATA(Comment); Q_DECLARE_METADATA(Description); Q_DECLARE_METADATA(Category); Q_DECLARE_METADATA(Genre); Q_DECLARE_METADATA(Year); Q_DECLARE_METADATA(Date); Q_DECLARE_METADATA(UserRating); Q_DECLARE_METADATA(Keywords); Q_DECLARE_METADATA(Language); Q_DECLARE_METADATA(Publisher); Q_DECLARE_METADATA(Copyright); Q_DECLARE_METADATA(ParentalRating); Q_DECLARE_METADATA(RatingOrganization); // Media Q_DECLARE_METADATA(Size); Q_DECLARE_METADATA(MediaType); Q_DECLARE_METADATA(Duration); // Audio Q_DECLARE_METADATA(AudioBitRate); Q_DECLARE_METADATA(AudioCodec); Q_DECLARE_METADATA(AverageLevel); Q_DECLARE_METADATA(ChannelCount); Q_DECLARE_METADATA(PeakValue); Q_DECLARE_METADATA(SampleRate); // Music Q_DECLARE_METADATA(AlbumTitle); Q_DECLARE_METADATA(AlbumArtist); Q_DECLARE_METADATA(ContributingArtist); Q_DECLARE_METADATA(Composer); Q_DECLARE_METADATA(Conductor); Q_DECLARE_METADATA(Lyrics); Q_DECLARE_METADATA(Mood); Q_DECLARE_METADATA(TrackNumber); Q_DECLARE_METADATA(TrackCount); Q_DECLARE_METADATA(CoverArtUrlSmall); Q_DECLARE_METADATA(CoverArtUrlLarge); // Image/Video Q_DECLARE_METADATA(Resolution); Q_DECLARE_METADATA(PixelAspectRatio); // Video Q_DECLARE_METADATA(VideoFrameRate); Q_DECLARE_METADATA(VideoBitRate); Q_DECLARE_METADATA(VideoCodec); Q_DECLARE_METADATA(PosterUrl); // Movie Q_DECLARE_METADATA(ChapterNumber); Q_DECLARE_METADATA(Director); Q_DECLARE_METADATA(LeadPerformer); Q_DECLARE_METADATA(Writer); // Photos Q_DECLARE_METADATA(CameraManufacturer); Q_DECLARE_METADATA(CameraModel); Q_DECLARE_METADATA(Event); Q_DECLARE_METADATA(Subject); Q_DECLARE_METADATA(Orientation); Q_DECLARE_METADATA(ExposureTime); Q_DECLARE_METADATA(FNumber); Q_DECLARE_METADATA(ExposureProgram); Q_DECLARE_METADATA(ISOSpeedRatings); Q_DECLARE_METADATA(ExposureBiasValue); Q_DECLARE_METADATA(DateTimeOriginal); Q_DECLARE_METADATA(DateTimeDigitized); Q_DECLARE_METADATA(SubjectDistance); Q_DECLARE_METADATA(MeteringMode); Q_DECLARE_METADATA(LightSource); Q_DECLARE_METADATA(Flash); Q_DECLARE_METADATA(FocalLength); Q_DECLARE_METADATA(ExposureMode); Q_DECLARE_METADATA(WhiteBalance); Q_DECLARE_METADATA(DigitalZoomRatio); Q_DECLARE_METADATA(FocalLengthIn35mmFilm); Q_DECLARE_METADATA(SceneCaptureType); Q_DECLARE_METADATA(GainControl); Q_DECLARE_METADATA(Contrast); Q_DECLARE_METADATA(Saturation); Q_DECLARE_METADATA(Sharpness); Q_DECLARE_METADATA(DeviceSettingDescription); // Location Q_DECLARE_METADATA(GPSLatitude); Q_DECLARE_METADATA(GPSLongitude); Q_DECLARE_METADATA(GPSAltitude); Q_DECLARE_METADATA(GPSTimeStamp); Q_DECLARE_METADATA(GPSSatellites); Q_DECLARE_METADATA(GPSStatus); Q_DECLARE_METADATA(GPSDOP); Q_DECLARE_METADATA(GPSSpeed); Q_DECLARE_METADATA(GPSTrack); Q_DECLARE_METADATA(GPSTrackRef); Q_DECLARE_METADATA(GPSImgDirection); Q_DECLARE_METADATA(GPSImgDirectionRef); Q_DECLARE_METADATA(GPSMapDatum); Q_DECLARE_METADATA(GPSProcessingMethod); Q_DECLARE_METADATA(GPSAreaInformation); Q_DECLARE_METADATA(PosterImage); Q_DECLARE_METADATA(CoverArtImage); Q_DECLARE_METADATA(ThumbnailImage); #endif } #undef Q_DECLARE_METADATA QT_END_NAMESPACE #endif // QMEDIAMETADATA_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaobject.cpp000066400000000000000000000277661225012771600306750ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qmediaobject_p.h" #include #include #include #include QT_BEGIN_NAMESPACE void QMediaObjectPrivate::_q_notify() { Q_Q(QMediaObject); const QMetaObject* m = q->metaObject(); foreach (int pi, notifyProperties) { QMetaProperty p = m->property(pi); p.notifySignal().invoke( q, QGenericArgument(QMetaType::typeName(p.userType()), p.read(q).data())); } } void QMediaObjectPrivate::_q_availabilityChanged() { Q_Q(QMediaObject); // Really this should not always emit, but // we can't really tell from here (isAvailable // may not have changed, or the mediaobject's overridden // availability() may not have changed). q->availabilityChanged(q->availability()); q->availabilityChanged(q->isAvailable()); } /*! \class QMediaObject \brief The QMediaObject class provides a common base for multimedia objects. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_core It provides some basic functionality that is common to other high level classes like \l QMediaPlayer, \l QAudioDecoder and \l QCamera, including availability and meta-data functionality, as well as functionality to connect media objects with support classes like QMediaPlaylist. The higher level QMediaObject derived classes provide the actual multimedia functionality, by internally using a QMediaService. Each media object hosts a QMediaService and uses the QMediaControl interfaces implemented by the service to implement its API. These controls can be accessed from the media object if necessary, but in general the useful functionality can be accessed from the higher level classes. Most media objects when constructed will request a new QMediaService instance, but some like QMediaRecorder and QAudioRecorder will share a service with another object. \sa QMediaService, QMediaControl */ /*! Destroys this media object. */ QMediaObject::~QMediaObject() { delete d_ptr; } /*! Returns the availability of the functionality offered by this object. In some cases the functionality may not be available (for example, if the current operating system or platform does not provide the required functionality), or it may be temporarily unavailable (for example, audio playback during a phone call or similar). */ QMultimedia::AvailabilityStatus QMediaObject::availability() const { if (d_func()->service == 0) return QMultimedia::ServiceMissing; if (d_func()->availabilityControl) return d_func()->availabilityControl->availability(); return QMultimedia::Available; } /*! Returns true if the service is available for use. */ bool QMediaObject::isAvailable() const { return availability() == QMultimedia::Available; } /*! Returns the media service that provides the functionality of this multimedia object. */ QMediaService* QMediaObject::service() const { return d_func()->service; } int QMediaObject::notifyInterval() const { return d_func()->notifyTimer->interval(); } void QMediaObject::setNotifyInterval(int milliSeconds) { Q_D(QMediaObject); if (d->notifyTimer->interval() != milliSeconds) { d->notifyTimer->setInterval(milliSeconds); emit notifyIntervalChanged(milliSeconds); } } /*! Bind \a object to this QMediaObject instance. This method establishes a relationship between this media object and a helper object. The nature of the relationship depends on both parties. This methods returns true if the helper was successfully bound, false otherwise. Most subclasses of QMediaObject provide more convenient functions that wrap this functionality, so this function rarely needs to be called directly. The object passed must implement the QMediaBindableInterface interface. \sa QMediaBindableInterface */ bool QMediaObject::bind(QObject *object) { QMediaBindableInterface *helper = qobject_cast(object); if (!helper) return false; QMediaObject *currentObject = helper->mediaObject(); if (currentObject == this) return true; if (currentObject) currentObject->unbind(object); return helper->setMediaObject(this); } /*! Detach \a object from the QMediaObject instance. Unbind the helper object from this media object. A warning will be generated if the object was not previously bound to this object. \sa QMediaBindableInterface */ void QMediaObject::unbind(QObject *object) { QMediaBindableInterface *helper = qobject_cast(object); if (helper && helper->mediaObject() == this) helper->setMediaObject(0); else qWarning() << "QMediaObject: Trying to unbind not connected helper object"; } /*! Constructs a media object which uses the functionality provided by a media \a service. The \a parent is passed to QObject. This class is meant as a base class for multimedia objects so this constructor is protected. */ QMediaObject::QMediaObject(QObject *parent, QMediaService *service): QObject(parent), d_ptr(new QMediaObjectPrivate) { Q_D(QMediaObject); d->q_ptr = this; d->notifyTimer = new QTimer(this); d->notifyTimer->setInterval(1000); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); d->service = service; setupControls(); } /*! \internal */ QMediaObject::QMediaObject(QMediaObjectPrivate &dd, QObject *parent, QMediaService *service): QObject(parent), d_ptr(&dd) { Q_D(QMediaObject); d->q_ptr = this; d->notifyTimer = new QTimer(this); d->notifyTimer->setInterval(1000); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); d->service = service; setupControls(); } /*! Watch the property \a name. The property's notify signal will be emitted once every \c notifyInterval milliseconds. \sa notifyInterval */ void QMediaObject::addPropertyWatch(QByteArray const &name) { Q_D(QMediaObject); const QMetaObject* m = metaObject(); int index = m->indexOfProperty(name.constData()); if (index != -1 && m->property(index).hasNotifySignal()) { d->notifyProperties.insert(index); if (!d->notifyTimer->isActive()) d->notifyTimer->start(); } } /*! Remove property \a name from the list of properties whose changes are regularly signaled. \sa notifyInterval */ void QMediaObject::removePropertyWatch(QByteArray const &name) { Q_D(QMediaObject); int index = metaObject()->indexOfProperty(name.constData()); if (index != -1) { d->notifyProperties.remove(index); if (d->notifyProperties.isEmpty()) d->notifyTimer->stop(); } } /*! \property QMediaObject::notifyInterval The interval at which notifiable properties will update. The interval is expressed in milliseconds, the default value is 1000. \sa addPropertyWatch(), removePropertyWatch() */ /*! \fn void QMediaObject::notifyIntervalChanged(int milliseconds) Signal a change in the notify interval period to \a milliseconds. */ /*! Returns true if there is meta-data associated with this media object, else false. */ bool QMediaObject::isMetaDataAvailable() const { Q_D(const QMediaObject); return d->metaDataControl ? d->metaDataControl->isMetaDataAvailable() : false; } /*! \fn QMediaObject::metaDataAvailableChanged(bool available) Signals that the \a available state of a media object's meta-data has changed. */ /*! Returns the value associated with a meta-data \a key. See the list of predefined \l {QMediaMetaData}{meta-data keys}. */ QVariant QMediaObject::metaData(const QString &key) const { Q_D(const QMediaObject); return d->metaDataControl ? d->metaDataControl->metaData(key) : QVariant(); } /*! Returns a list of keys there is meta-data available for. */ QStringList QMediaObject::availableMetaData() const { Q_D(const QMediaObject); return d->metaDataControl ? d->metaDataControl->availableMetaData() : QStringList(); } /*! \fn QMediaObject::metaDataChanged() Signals that this media object's meta-data has changed. If multiple meta-data elements are changed, metaDataChanged(const QString &key, const QVariant &value) signal is emitted for each of them with metaDataChanged() changed emitted once. */ /*! \fn QMediaObject::metaDataChanged(const QString &key, const QVariant &value) Signal the changes of one meta-data element \a value with the given \a key. */ void QMediaObject::setupControls() { Q_D(QMediaObject); if (d->service != 0) { d->metaDataControl = qobject_cast( d->service->requestControl(QMetaDataReaderControl_iid)); if (d->metaDataControl) { connect(d->metaDataControl, SIGNAL(metaDataChanged()), SIGNAL(metaDataChanged())); connect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)), SIGNAL(metaDataChanged(QString,QVariant))); connect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), SIGNAL(metaDataAvailableChanged(bool))); } d->availabilityControl = d->service->requestControl(); if (d->availabilityControl) { connect(d->availabilityControl, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), SLOT(_q_availabilityChanged())); } } } /*! \fn QMediaObject::availabilityChanged(bool available) Signal emitted when the availability state has changed to \a available. */ /*! \fn QMediaObject::availabilityChanged(QMultimedia::AvailabilityStatus availability) Signal emitted when the availability of the service has changed to \a availability. */ #include "moc_qmediaobject.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaobject.h000066400000000000000000000072611225012771600303260ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIAOBJECT_H #define QABSTRACTMEDIAOBJECT_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaService; class QMediaBindableInterface; class QMediaObjectPrivate; class Q_MULTIMEDIA_EXPORT QMediaObject : public QObject { Q_OBJECT Q_PROPERTY(int notifyInterval READ notifyInterval WRITE setNotifyInterval NOTIFY notifyIntervalChanged) public: ~QMediaObject(); virtual bool isAvailable() const; virtual QMultimedia::AvailabilityStatus availability() const; virtual QMediaService* service() const; int notifyInterval() const; void setNotifyInterval(int milliSeconds); virtual bool bind(QObject *); virtual void unbind(QObject *); bool isMetaDataAvailable() const; QVariant metaData(const QString &key) const; QStringList availableMetaData() const; Q_SIGNALS: void notifyIntervalChanged(int milliSeconds); void metaDataAvailableChanged(bool available); void metaDataChanged(); void metaDataChanged(const QString &key, const QVariant &value); void availabilityChanged(bool available); void availabilityChanged(QMultimedia::AvailabilityStatus availability); protected: QMediaObject(QObject *parent, QMediaService *service); QMediaObject(QMediaObjectPrivate &dd, QObject *parent, QMediaService *service); void addPropertyWatch(QByteArray const &name); void removePropertyWatch(QByteArray const &name); QMediaObjectPrivate *d_ptr; private: void setupControls(); Q_DECLARE_PRIVATE(QMediaObject) Q_PRIVATE_SLOT(d_func(), void _q_notify()) Q_PRIVATE_SLOT(d_func(), void _q_availabilityChanged()) }; QT_END_NAMESPACE #endif // QABSTRACTMEDIAOBJECT_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaobject_p.h000066400000000000000000000060511225012771600306410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIAOBJECT_P_H #define QABSTRACTMEDIAOBJECT_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include "qmediaobject.h" QT_BEGIN_NAMESPACE class QMetaDataReaderControl; class QMediaAvailabilityControl; #define Q_DECLARE_NON_CONST_PUBLIC(Class) \ inline Class* q_func() { return static_cast(q_ptr); } \ friend class Class; class QMediaObjectPrivate { Q_DECLARE_PUBLIC(QMediaObject) public: QMediaObjectPrivate(): service(0), metaDataControl(0), availabilityControl(0), notifyTimer(0), q_ptr(0) {} virtual ~QMediaObjectPrivate() {} void _q_notify(); void _q_availabilityChanged(); QMediaService *service; QMetaDataReaderControl *metaDataControl; QMediaAvailabilityControl *availabilityControl; QTimer* notifyTimer; QSet notifyProperties; QMediaObject *q_ptr; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediapluginloader.cpp000066400000000000000000000113641225012771600320770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediapluginloader_p.h" #include #include #include #include #include "qmediaserviceproviderplugin.h" QT_BEGIN_NAMESPACE QMediaPluginLoader::QMediaPluginLoader(const char *iid, const QString &location, Qt::CaseSensitivity caseSensitivity): m_iid(iid) { m_location = QString::fromLatin1("/%1").arg(location); m_factoryLoader = new QFactoryLoader(m_iid, m_location, caseSensitivity); loadMetadata(); } QMediaPluginLoader::~QMediaPluginLoader() { delete m_factoryLoader; } QStringList QMediaPluginLoader::keys() const { return m_metadata.keys(); } QObject* QMediaPluginLoader::instance(QString const &key) { if (!m_metadata.contains(key)) return 0; int idx = m_metadata.value(key).first().value(QStringLiteral("index")).toDouble(); if (idx < 0) return 0; return m_factoryLoader->instance(idx); } QList QMediaPluginLoader::instances(QString const &key) { if (!m_metadata.contains(key)) return QList(); QList objects; foreach (QJsonObject jsonobj, m_metadata.value(key)) { int idx = jsonobj.value(QStringLiteral("index")).toDouble(); if (idx < 0) continue; QObject *object = m_factoryLoader->instance(idx); if (!objects.contains(object)) { objects.append(object); } } return objects; } void QMediaPluginLoader::loadMetadata() { #if !defined QT_NO_DEBUG const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; #endif #if !defined QT_NO_DEBUG if (showDebug) qDebug() << "QMediaPluginLoader: loading metadata for iid " << m_iid << " at location " << m_location; #endif if (!m_metadata.isEmpty()) { #if !defined QT_NO_DEBUG if (showDebug) qDebug() << "QMediaPluginLoader: already loaded metadata, returning"; #endif return; } QList meta = m_factoryLoader->metaData(); for (int i = 0; i < meta.size(); i++) { QJsonObject jsonobj = meta.at(i).value(QStringLiteral("MetaData")).toObject(); jsonobj.insert(QStringLiteral("index"), i); #if !defined QT_NO_DEBUG if (showDebug) qDebug() << "QMediaPluginLoader: Inserted index " << i << " into metadata: " << jsonobj; #endif QJsonArray arr = jsonobj.value(QStringLiteral("Keys")).toArray(); foreach (QJsonValue value, arr) { QString key = value.toString(); if (!m_metadata.contains(key)) { #if !defined QT_NO_DEBUG if (showDebug) qDebug() << "QMediaPluginLoader: Inserting new list for key: " << key; #endif m_metadata.insert(key, QList()); } m_metadata[key].append(jsonobj); } } } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediapluginloader_p.h000066400000000000000000000060331225012771600320600ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAPLUGINLOADER_H #define QMEDIAPLUGINLOADER_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QFactoryLoader; class QMediaServiceProviderPlugin; class Q_MULTIMEDIA_EXPORT QMediaPluginLoader { public: QMediaPluginLoader(const char *iid, const QString &suffix = QString(), Qt::CaseSensitivity = Qt::CaseSensitive); ~QMediaPluginLoader(); QStringList keys() const; QObject* instance(QString const &key); QList instances(QString const &key); private: void loadMetadata(); QByteArray m_iid; QString m_location; QMap > m_metadata; QFactoryLoader *m_factoryLoader; }; QT_END_NAMESPACE #endif // QMEDIAPLUGINLOADER_H qmediaresourcepolicy_p.cpp000066400000000000000000000077021225012771600327220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaresourcepolicy_p.h" #include "qmediapluginloader_p.h" #include "qmediaresourcepolicyplugin_p.h" #include "qmediaresourceset_p.h" namespace { class QDummyMediaPlayerResourceSet : public QMediaPlayerResourceSetInterface { public: QDummyMediaPlayerResourceSet(QObject *parent) : QMediaPlayerResourceSetInterface(parent) { } bool isVideoEnabled() const { return true; } bool isGranted() const { return true; } bool isAvailable() const { return true; } void acquire() {} void release() {} void setVideoEnabled(bool) {} }; } QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, resourcePolicyLoader, (QMediaResourceSetFactoryInterface_iid, QLatin1String("resourcepolicy"), Qt::CaseInsensitive)) Q_GLOBAL_STATIC(QObject, dummyRoot) QObject* QMediaResourcePolicy::createResourceSet(const QString& interfaceId) { QMediaResourceSetFactoryInterface *factory = qobject_cast(resourcePolicyLoader() ->instance(QLatin1String("default"))); QObject* obj = 0; if (factory) obj = factory->create(interfaceId); if (!obj) { if (interfaceId == QLatin1String(QMediaPlayerResourceSetInterface_iid)) { obj = new QDummyMediaPlayerResourceSet(dummyRoot()); } } Q_ASSERT(obj); return obj; } void QMediaResourcePolicy::destroyResourceSet(QObject* resourceSet) { if (resourceSet->parent() == dummyRoot()) { delete resourceSet; return; } QMediaResourceSetFactoryInterface *factory = qobject_cast(resourcePolicyLoader() ->instance(QLatin1String("default"))); Q_ASSERT(factory); if (!factory) return; return factory->destroy(resourceSet); } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaresourcepolicy_p.h000066400000000000000000000050731225012771600324450ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARESOURCEPOLICY_H #define QMEDIARESOURCEPOLICY_H #include #include "qtmultimediadefs.h" QT_BEGIN_NAMESPACE class Q_MULTIMEDIA_EXPORT QMediaResourcePolicy { public: //a dummy object will always be provided if the interfaceId is not supported template static T* createResourceSet(); static void destroyResourceSet(QObject* resourceSet); private: static QObject* createResourceSet(const QString& interfaceId); }; template T* QMediaResourcePolicy::createResourceSet() { return qobject_cast(QMediaResourcePolicy::createResourceSet(T::iid())); } QT_END_NAMESPACE #endif // QMEDIARESOURCEPOLICY_H qmediaresourcepolicyplugin_p.cpp000066400000000000000000000042161225012771600341360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaresourcepolicyplugin_p.h" QT_BEGIN_NAMESPACE QMediaResourcePolicyPlugin::QMediaResourcePolicyPlugin(QObject *parent) : QObject(parent) { } QMediaResourcePolicyPlugin::~QMediaResourcePolicyPlugin() { } QT_END_NAMESPACE qmediaresourcepolicyplugin_p.h000066400000000000000000000053541225012771600336070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QRESOURCEPOLICYPLUGIN_P_H #define QRESOURCEPOLICYPLUGIN_P_H #include #include QT_BEGIN_NAMESPACE struct Q_MULTIMEDIA_EXPORT QMediaResourceSetFactoryInterface { virtual QObject* create(const QString& interfaceId) = 0; virtual void destroy(QObject *resourceSet) = 0; }; #define QMediaResourceSetFactoryInterface_iid \ "org.qt-project.qt.mediaresourcesetfactory/5.0" Q_DECLARE_INTERFACE(QMediaResourceSetFactoryInterface, QMediaResourceSetFactoryInterface_iid) class Q_MULTIMEDIA_EXPORT QMediaResourcePolicyPlugin : public QObject, public QMediaResourceSetFactoryInterface { Q_OBJECT Q_INTERFACES(QMediaResourceSetFactoryInterface) public: QMediaResourcePolicyPlugin(QObject *parent = 0); ~QMediaResourcePolicyPlugin(); }; QT_END_NAMESPACE #endif // QRESOURCEPOLICYPLUGIN_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaresourceset_p.cpp000066400000000000000000000043071225012771600322730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaresourceset_p.h" QT_BEGIN_NAMESPACE QMediaPlayerResourceSetInterface::QMediaPlayerResourceSetInterface(QObject *parent) : QObject(parent) { } QString QMediaPlayerResourceSetInterface::iid() { return QLatin1String(QMediaPlayerResourceSetInterface_iid); } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaresourceset_p.h000066400000000000000000000054331225012771600317410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARESOURCESET_P_H #define QMEDIARESOURCESET_P_H #include #include QT_BEGIN_NAMESPACE #define QMediaPlayerResourceSetInterface_iid \ "org.qt-project.qt.mediaplayerresourceset/5.0" class Q_MULTIMEDIA_EXPORT QMediaPlayerResourceSetInterface : public QObject { Q_OBJECT public: virtual bool isVideoEnabled() const = 0; virtual bool isGranted() const = 0; virtual bool isAvailable() const = 0; virtual void acquire() = 0; virtual void release() = 0; virtual void setVideoEnabled(bool enabled) = 0; static QString iid(); Q_SIGNALS: void resourcesGranted(); void resourcesLost(); void resourcesDenied(); void resourcesReleased(); void availabilityChanged(bool available); protected: QMediaPlayerResourceSetInterface(QObject *parent = 0); }; QT_END_NAMESPACE #endif // QMEDIARESOURCESET_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaservice.cpp000066400000000000000000000116511225012771600310510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaservice.h" #include "qmediaservice_p.h" #include QT_BEGIN_NAMESPACE /*! \class QMediaService \brief The QMediaService class provides a common base class for media service implementations. \ingroup multimedia \ingroup multimedia_control \ingroup multimedia_core \inmodule QtMultimedia Media services provide implementations of the functionality promised by media objects, and allow multiple providers to implement a QMediaObject. To provide the functionality of a QMediaObject media services implement QMediaControl interfaces. Services typically implement one core media control which provides the core feature of a media object, and some number of additional controls which provide either optional features of the media object, or features of a secondary media object or peripheral object. A pointer to media service's QMediaControl implementation can be obtained by passing the control's interface name to the requestControl() function. \snippet multimedia-snippets/media.cpp Request control Media objects can use services loaded dynamically from plug-ins or implemented statically within an applications. Plug-in based services should also implement the QMediaServiceProviderPlugin interface. Static services should implement the QMediaServiceProvider interface. In general, implementing a QMediaService is outside of the scope of this documentation and support on the relevant mailing lists or IRC channels should be sought. \sa QMediaObject, QMediaControl */ /*! Construct a media service with the given \a parent. This class is meant as a base class for Multimedia services so this constructor is protected. */ QMediaService::QMediaService(QObject *parent) : QObject(parent) , d_ptr(new QMediaServicePrivate) { d_ptr->q_ptr = this; } /*! \internal */ QMediaService::QMediaService(QMediaServicePrivate &dd, QObject *parent) : QObject(parent) , d_ptr(&dd) { d_ptr->q_ptr = this; } /*! Destroys a media service. */ QMediaService::~QMediaService() { delete d_ptr; } /*! \fn QMediaControl* QMediaService::requestControl(const char *interface) Returns a pointer to the media control implementing \a interface. If the service does not implement the control, or if it is unavailable a null pointer is returned instead. Controls must be returned to the service when no longer needed using the releaseControl() function. */ /*! \fn T QMediaService::requestControl() Returns a pointer to the media control of type T implemented by a media service. If the service does not implement the control, or if it is unavailable a null pointer is returned instead. Controls must be returned to the service when no longer needed using the releaseControl() function. */ /*! \fn void QMediaService::releaseControl(QMediaControl *control); Releases a \a control back to the service. */ #include "moc_qmediaservice.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaservice.h000066400000000000000000000057231225012771600305210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIASERVICE_H #define QABSTRACTMEDIASERVICE_H #include #include #include #include QT_BEGIN_NAMESPACE class QMediaServicePrivate; class Q_MULTIMEDIA_EXPORT QMediaService : public QObject { Q_OBJECT public: ~QMediaService(); virtual QMediaControl* requestControl(const char *name) = 0; #ifndef QT_NO_MEMBER_TEMPLATES template inline T requestControl() { if (QMediaControl *control = requestControl(qmediacontrol_iid())) { if (T typedControl = qobject_cast(control)) return typedControl; releaseControl(control); } return 0; } #endif virtual void releaseControl(QMediaControl *control) = 0; protected: QMediaService(QObject* parent); QMediaService(QMediaServicePrivate &dd, QObject *parent); QMediaServicePrivate *d_ptr; private: Q_DECLARE_PRIVATE(QMediaService) }; QT_END_NAMESPACE #endif // QABSTRACTMEDIASERVICE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaservice_p.h000066400000000000000000000046641225012771600310430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTMEDIASERVICE_P_H #define QABSTRACTMEDIASERVICE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // QT_BEGIN_NAMESPACE class QAudioDeviceControl; class QMediaServicePrivate { public: QMediaServicePrivate(): q_ptr(0) {} virtual ~QMediaServicePrivate() {} QMediaService *q_ptr; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaserviceprovider.cpp000066400000000000000000000577471225012771600326440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qmediaservice.h" #include "qmediaserviceprovider_p.h" #include "qmediaserviceproviderplugin.h" #include "qmediapluginloader_p.h" #include "qmediaplayer.h" QT_BEGIN_NAMESPACE QMediaServiceProviderFactoryInterface::~QMediaServiceProviderFactoryInterface() { } class QMediaServiceProviderHintPrivate : public QSharedData { public: QMediaServiceProviderHintPrivate(QMediaServiceProviderHint::Type type) :type(type), features(0) { } QMediaServiceProviderHintPrivate(const QMediaServiceProviderHintPrivate &other) :QSharedData(other), type(other.type), device(other.device), mimeType(other.mimeType), codecs(other.codecs), features(other.features) { } ~QMediaServiceProviderHintPrivate() { } QMediaServiceProviderHint::Type type; QByteArray device; QString mimeType; QStringList codecs; QMediaServiceProviderHint::Features features; }; /*! \class QMediaServiceProviderHint \brief The QMediaServiceProviderHint class describes what is required of a QMediaService. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_control \ingroup multimedia_core \internal The QMediaServiceProvider class uses hints to select an appropriate media service. */ /*! \enum QMediaServiceProviderHint::Feature Enumerates features a media service may provide. \value LowLatencyPlayback The service is expected to play simple audio formats, but playback should start without significant delay. Such playback service can be used for beeps, ringtones, etc. \value RecordingSupport The service provides audio or video recording functions. \value StreamPlayback The service is capable of playing QIODevice based streams. \value VideoSurface The service is capable of renderering to a QAbstractVideoSurface output. */ /*! \enum QMediaServiceProviderHint::Type Enumerates the possible types of media service provider hint. \value Null En empty hint, use the default service. \value ContentType Select media service most suitable for certain content type. \value Device Select media service which supports certain device. \value SupportedFeatures Select media service supporting the set of optional features. */ /*! Constructs an empty media service provider hint. */ QMediaServiceProviderHint::QMediaServiceProviderHint() :d(new QMediaServiceProviderHintPrivate(Null)) { } /*! Constructs a ContentType media service provider hint. This type of hint describes a service that is able to play content of a specific MIME \a type encoded with one or more of the listed \a codecs. */ QMediaServiceProviderHint::QMediaServiceProviderHint(const QString &type, const QStringList& codecs) :d(new QMediaServiceProviderHintPrivate(ContentType)) { d->mimeType = type; d->codecs = codecs; } /*! Constructs a Device media service provider hint. This type of hint describes a media service that utilizes a specific \a device. */ QMediaServiceProviderHint::QMediaServiceProviderHint(const QByteArray &device) :d(new QMediaServiceProviderHintPrivate(Device)) { d->device = device; } /*! Constructs a SupportedFeatures media service provider hint. This type of hint describes a service which supports a specific set of \a features. */ QMediaServiceProviderHint::QMediaServiceProviderHint(QMediaServiceProviderHint::Features features) :d(new QMediaServiceProviderHintPrivate(SupportedFeatures)) { d->features = features; } /*! Constructs a copy of the media service provider hint \a other. */ QMediaServiceProviderHint::QMediaServiceProviderHint(const QMediaServiceProviderHint &other) :d(other.d) { } /*! Destroys a media service provider hint. */ QMediaServiceProviderHint::~QMediaServiceProviderHint() { } /*! Assigns the value \a other to a media service provider hint. */ QMediaServiceProviderHint& QMediaServiceProviderHint::operator=(const QMediaServiceProviderHint &other) { d = other.d; return *this; } /*! Identifies if \a other is of equal value to a media service provider hint. Returns true if the hints are equal, and false if they are not. */ bool QMediaServiceProviderHint::operator == (const QMediaServiceProviderHint &other) const { return (d == other.d) || (d->type == other.d->type && d->device == other.d->device && d->mimeType == other.d->mimeType && d->codecs == other.d->codecs && d->features == other.d->features); } /*! Identifies if \a other is not of equal value to a media service provider hint. Returns true if the hints are not equal, and false if they are. */ bool QMediaServiceProviderHint::operator != (const QMediaServiceProviderHint &other) const { return !(*this == other); } /*! Returns true if a media service provider is null. */ bool QMediaServiceProviderHint::isNull() const { return d->type == Null; } /*! Returns the type of a media service provider hint. */ QMediaServiceProviderHint::Type QMediaServiceProviderHint::type() const { return d->type; } /*! Returns the mime type of the media a service is expected to be able play. */ QString QMediaServiceProviderHint::mimeType() const { return d->mimeType; } /*! Returns a list of codes a media service is expected to be able to decode. */ QStringList QMediaServiceProviderHint::codecs() const { return d->codecs; } /*! Returns the name of a device a media service is expected to utilize. */ QByteArray QMediaServiceProviderHint::device() const { return d->device; } /*! Returns a set of features a media service is expected to provide. */ QMediaServiceProviderHint::Features QMediaServiceProviderHint::features() const { return d->features; } Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, loader, (QMediaServiceProviderFactoryInterface_iid, QLatin1String("mediaservice"), Qt::CaseInsensitive)) class QPluginServiceProvider : public QMediaServiceProvider { QMap pluginMap; public: QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &hint) { QString key(QLatin1String(type.constData())); QListplugins; foreach (QObject *obj, loader()->instances(key)) { QMediaServiceProviderPlugin *plugin = qobject_cast(obj); if (plugin) plugins << plugin; } if (!plugins.isEmpty()) { QMediaServiceProviderPlugin *plugin = 0; switch (hint.type()) { case QMediaServiceProviderHint::Null: plugin = plugins[0]; //special case for media player, if low latency was not asked, //prefer services not offering it, since they are likely to support //more formats if (type == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) { foreach (QMediaServiceProviderPlugin *currentPlugin, plugins) { QMediaServiceFeaturesInterface *iface = qobject_cast(currentPlugin); if (!iface || !(iface->supportedFeatures(type) & QMediaServiceProviderHint::LowLatencyPlayback)) { plugin = currentPlugin; break; } } } break; case QMediaServiceProviderHint::SupportedFeatures: plugin = plugins[0]; foreach (QMediaServiceProviderPlugin *currentPlugin, plugins) { QMediaServiceFeaturesInterface *iface = qobject_cast(currentPlugin); if (iface) { if ((iface->supportedFeatures(type) & hint.features()) == hint.features()) { plugin = currentPlugin; break; } } } break; case QMediaServiceProviderHint::Device: { foreach (QMediaServiceProviderPlugin *currentPlugin, plugins) { QMediaServiceSupportedDevicesInterface *iface = qobject_cast(currentPlugin); if (!iface) { // the plugin may support the device, // but this choice still can be overridden plugin = currentPlugin; } else { if (iface->devices(type).contains(hint.device())) { plugin = currentPlugin; break; } } } } break; case QMediaServiceProviderHint::ContentType: { QMultimedia::SupportEstimate estimate = QMultimedia::NotSupported; foreach (QMediaServiceProviderPlugin *currentPlugin, plugins) { QMultimedia::SupportEstimate currentEstimate = QMultimedia::MaybeSupported; QMediaServiceSupportedFormatsInterface *iface = qobject_cast(currentPlugin); if (iface) currentEstimate = iface->hasSupport(hint.mimeType(), hint.codecs()); if (currentEstimate > estimate) { estimate = currentEstimate; plugin = currentPlugin; if (currentEstimate == QMultimedia::PreferredService) break; } } } break; } if (plugin != 0) { QMediaService *service = plugin->create(key); if (service != 0) pluginMap.insert(service, plugin); return service; } } qWarning() << "defaultServiceProvider::requestService(): no service found for -" << key; return 0; } void releaseService(QMediaService *service) { if (service != 0) { QMediaServiceProviderPlugin *plugin = pluginMap.take(service); if (plugin != 0) plugin->release(service); } } QMultimedia::SupportEstimate hasSupport(const QByteArray &serviceType, const QString &mimeType, const QStringList& codecs, int flags) const { QList instances = loader()->instances(QLatin1String(serviceType)); if (instances.isEmpty()) return QMultimedia::NotSupported; bool allServicesProvideInterface = true; QMultimedia::SupportEstimate supportEstimate = QMultimedia::NotSupported; foreach(QObject *obj, instances) { QMediaServiceSupportedFormatsInterface *iface = qobject_cast(obj); if (flags) { QMediaServiceFeaturesInterface *iface = qobject_cast(obj); if (iface) { QMediaServiceProviderHint::Features features = iface->supportedFeatures(serviceType); //if low latency playback was asked, skip services known //not to provide low latency playback if ((flags & QMediaPlayer::LowLatency) && !(features & QMediaServiceProviderHint::LowLatencyPlayback)) continue; //the same for QIODevice based streams support if ((flags & QMediaPlayer::StreamPlayback) && !(features & QMediaServiceProviderHint::StreamPlayback)) continue; } } if (iface) supportEstimate = qMax(supportEstimate, iface->hasSupport(mimeType, codecs)); else allServicesProvideInterface = false; } //don't return PreferredService supportEstimate = qMin(supportEstimate, QMultimedia::ProbablySupported); //Return NotSupported only if no services are available of serviceType //or all the services returned NotSupported, otherwise return at least MaybeSupported if (!allServicesProvideInterface) supportEstimate = qMax(QMultimedia::MaybeSupported, supportEstimate); return supportEstimate; } QStringList supportedMimeTypes(const QByteArray &serviceType, int flags) const { QList instances = loader()->instances(QLatin1String(serviceType)); QStringList supportedTypes; foreach(QObject *obj, instances) { QMediaServiceSupportedFormatsInterface *iface = qobject_cast(obj); if (flags) { QMediaServiceFeaturesInterface *iface = qobject_cast(obj); if (iface) { QMediaServiceProviderHint::Features features = iface->supportedFeatures(serviceType); // If low latency playback was asked for, skip MIME types from services known // not to provide low latency playback if ((flags & QMediaPlayer::LowLatency) && !(features & QMediaServiceProviderHint::LowLatencyPlayback)) continue; //the same for QIODevice based streams support if ((flags & QMediaPlayer::StreamPlayback) && !(features & QMediaServiceProviderHint::StreamPlayback)) continue; //the same for QAbstractVideoSurface support if ((flags & QMediaPlayer::VideoSurface) && !(features & QMediaServiceProviderHint::VideoSurface)) continue; } } if (iface) { supportedTypes << iface->supportedMimeTypes(); } } // Multiple services may support the same MIME type supportedTypes.removeDuplicates(); return supportedTypes; } QList devices(const QByteArray &serviceType) const { QList res; foreach (QObject *obj, loader()->instances(QLatin1String(serviceType))) { QMediaServiceSupportedDevicesInterface *iface = qobject_cast(obj); if (iface) { res.append(iface->devices(serviceType)); } } return res; } QString deviceDescription(const QByteArray &serviceType, const QByteArray &device) { foreach (QObject *obj, loader()->instances(QLatin1String(serviceType))) { QMediaServiceSupportedDevicesInterface *iface = qobject_cast(obj); if (iface) { if (iface->devices(serviceType).contains(device)) return iface->deviceDescription(serviceType, device); } } return QString(); } }; Q_GLOBAL_STATIC(QPluginServiceProvider, pluginProvider); /*! \class QMediaServiceProvider \ingroup multimedia \ingroup multimedia_control \ingroup multimedia_core \internal \brief The QMediaServiceProvider class provides an abstract allocator for media services. */ /*! \fn QMediaServiceProvider::requestService(const QByteArray &type, const QMediaServiceProviderHint &hint) Requests an instance of a \a type service which best matches the given \a hint. Returns a pointer to the requested service, or a null pointer if there is no suitable service. The returned service must be released with releaseService when it is finished with. */ /*! \fn QMediaServiceProvider::releaseService(QMediaService *service) Releases a media \a service requested with requestService(). */ /*! \fn QMultimedia::SupportEstimate QMediaServiceProvider::hasSupport(const QByteArray &serviceType, const QString &mimeType, const QStringList& codecs, int flags) const Returns how confident a media service provider is that is can provide a \a serviceType service that is able to play media of a specific \a mimeType that is encoded using the listed \a codecs while adhering to constraints identified in \a flags. */ QMultimedia::SupportEstimate QMediaServiceProvider::hasSupport(const QByteArray &serviceType, const QString &mimeType, const QStringList& codecs, int flags) const { Q_UNUSED(serviceType); Q_UNUSED(mimeType); Q_UNUSED(codecs); Q_UNUSED(flags); return QMultimedia::MaybeSupported; } /*! \fn QStringList QMediaServiceProvider::supportedMimeTypes(const QByteArray &serviceType, int flags) const Returns a list of MIME types supported by the service provider for the specified \a serviceType. The resultant list is restricted to MIME types which can be supported given the constraints in \a flags. */ QStringList QMediaServiceProvider::supportedMimeTypes(const QByteArray &serviceType, int flags) const { Q_UNUSED(serviceType); Q_UNUSED(flags); return QStringList(); } /*! Returns the list of devices related to \a service type. */ QList QMediaServiceProvider::devices(const QByteArray &service) const { Q_UNUSED(service); return QList(); } /*! Returns the description of \a device related to \a serviceType, suitable for use by an application for display. */ QString QMediaServiceProvider::deviceDescription(const QByteArray &serviceType, const QByteArray &device) { Q_UNUSED(serviceType); Q_UNUSED(device); return QString(); } static QMediaServiceProvider *qt_defaultMediaServiceProvider = 0; /*! Sets a media service \a provider as the default. It's useful for unit tests to provide mock service. \internal */ void QMediaServiceProvider::setDefaultServiceProvider(QMediaServiceProvider *provider) { qt_defaultMediaServiceProvider = provider; } /*! Returns a default provider of media services. */ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() { return qt_defaultMediaServiceProvider != 0 ? qt_defaultMediaServiceProvider : static_cast(pluginProvider()); } /*! \class QMediaServiceProviderPlugin \inmodule QtMultimedia \brief The QMediaServiceProviderPlugin class interface provides an interface for QMediaService plug-ins. A media service provider plug-in may implement one or more of QMediaServiceSupportedFormatsInterface, QMediaServiceSupportedDevicesInterface, and QMediaServiceFeaturesInterface to identify the features it supports. */ /*! \fn QMediaServiceProviderPlugin::create(const QString &key) Constructs a new instance of the QMediaService identified by \a key. The QMediaService returned must be destroyed with release(). */ /*! \fn QMediaServiceProviderPlugin::release(QMediaService *service) Destroys a media \a service constructed with create(). */ /*! \class QMediaServiceSupportedFormatsInterface \inmodule QtMultimedia \brief The QMediaServiceSupportedFormatsInterface class interface identifies if a media service plug-in supports a media format. A QMediaServiceProviderPlugin may implement this interface. */ /*! \fn QMediaServiceSupportedFormatsInterface::~QMediaServiceSupportedFormatsInterface() Destroys a media service supported formats interface. */ /*! \fn QMediaServiceSupportedFormatsInterface::hasSupport(const QString &mimeType, const QStringList& codecs) const Returns the level of support a media service plug-in has for a \a mimeType and set of \a codecs. */ /*! \fn QMediaServiceSupportedFormatsInterface::supportedMimeTypes() const Returns a list of MIME types supported by the media service plug-in. */ /*! \class QMediaServiceSupportedDevicesInterface \inmodule QtMultimedia \brief The QMediaServiceSupportedDevicesInterface class interface identifies the devices supported by a media service plug-in. A QMediaServiceProviderPlugin may implement this interface. */ /*! \fn QMediaServiceSupportedDevicesInterface::~QMediaServiceSupportedDevicesInterface() Destroys a media service supported devices interface. */ /*! \fn QMediaServiceSupportedDevicesInterface::devices(const QByteArray &service) const Returns a list of devices supported by a plug-in \a service. */ /*! \fn QMediaServiceSupportedDevicesInterface::deviceDescription(const QByteArray &service, const QByteArray &device) Returns a description of a \a device supported by a plug-in \a service. */ /*! \class QMediaServiceFeaturesInterface \inmodule QtMultimedia \brief The QMediaServiceFeaturesInterface class interface identifies features supported by a media service plug-in. A QMediaServiceProviderPlugin may implement this interface. */ /*! \fn QMediaServiceFeaturesInterface::~QMediaServiceFeaturesInterface() Destroys a media service features interface. */ /*! \fn QMediaServiceFeaturesInterface::supportedFeatures(const QByteArray &service) const Returns a set of features supported by a plug-in \a service. */ #include "moc_qmediaserviceprovider_p.cpp" #include "moc_qmediaserviceproviderplugin.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediaserviceprovider_p.h000066400000000000000000000062741225012771600326150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIASERVICEPROVIDER_H #define QMEDIASERVICEPROVIDER_H #include #include #include #include "qmultimedia.h" #include "qmediaserviceproviderplugin.h" QT_BEGIN_NAMESPACE class QMediaService; class Q_MULTIMEDIA_EXPORT QMediaServiceProvider : public QObject { Q_OBJECT public: virtual QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &hint = QMediaServiceProviderHint()) = 0; virtual void releaseService(QMediaService *service) = 0; virtual QMultimedia::SupportEstimate hasSupport(const QByteArray &serviceType, const QString &mimeType, const QStringList& codecs, int flags = 0) const; virtual QStringList supportedMimeTypes(const QByteArray &serviceType, int flags = 0) const; virtual QList devices(const QByteArray &serviceType) const; virtual QString deviceDescription(const QByteArray &serviceType, const QByteArray &device); static QMediaServiceProvider* defaultServiceProvider(); static void setDefaultServiceProvider(QMediaServiceProvider *provider); }; QT_END_NAMESPACE #endif // QMEDIASERVICEPROVIDER_H qmediaserviceproviderplugin.h000066400000000000000000000201051225012771600334230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIASERVICEPROVIDERPLUGIN_H #define QMEDIASERVICEPROVIDERPLUGIN_H #include #include #include #include #ifdef Q_MOC_RUN # pragma Q_MOC_EXPAND_MACROS #endif QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; class QMediaService; class QMediaServiceProviderHintPrivate; class Q_MULTIMEDIA_EXPORT QMediaServiceProviderHint { public: enum Type { Null, ContentType, Device, SupportedFeatures }; enum Feature { LowLatencyPlayback = 0x01, RecordingSupport = 0x02, StreamPlayback = 0x04, VideoSurface = 0x08 }; Q_DECLARE_FLAGS(Features, Feature) QMediaServiceProviderHint(); QMediaServiceProviderHint(const QString &mimeType, const QStringList& codecs); QMediaServiceProviderHint(const QByteArray &device); QMediaServiceProviderHint(Features features); QMediaServiceProviderHint(const QMediaServiceProviderHint &other); ~QMediaServiceProviderHint(); QMediaServiceProviderHint& operator=(const QMediaServiceProviderHint &other); bool operator == (const QMediaServiceProviderHint &other) const; bool operator != (const QMediaServiceProviderHint &other) const; bool isNull() const; Type type() const; QString mimeType() const; QStringList codecs() const; QByteArray device() const; Features features() const; //to be extended, if necessary private: QSharedDataPointer d; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QMediaServiceProviderHint::Features) // Required for QDoc workaround class QString; struct Q_MULTIMEDIA_EXPORT QMediaServiceProviderFactoryInterface { virtual QMediaService* create(QString const& key) = 0; virtual void release(QMediaService *service) = 0; virtual ~QMediaServiceProviderFactoryInterface(); }; #define QMediaServiceProviderFactoryInterface_iid \ "org.qt-project.qt.mediaserviceproviderfactory/5.0" Q_DECLARE_INTERFACE(QMediaServiceProviderFactoryInterface, QMediaServiceProviderFactoryInterface_iid) // Required for QDoc workaround class QString; struct Q_MULTIMEDIA_EXPORT QMediaServiceSupportedFormatsInterface { virtual ~QMediaServiceSupportedFormatsInterface() {} virtual QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const = 0; virtual QStringList supportedMimeTypes() const = 0; }; #define QMediaServiceSupportedFormatsInterface_iid \ "org.qt-project.qt.mediaservicesupportedformats/5.0" Q_DECLARE_INTERFACE(QMediaServiceSupportedFormatsInterface, QMediaServiceSupportedFormatsInterface_iid) // Required for QDoc workaround class QString; struct Q_MULTIMEDIA_EXPORT QMediaServiceSupportedDevicesInterface { virtual ~QMediaServiceSupportedDevicesInterface() {} virtual QList devices(const QByteArray &service) const = 0; virtual QString deviceDescription(const QByteArray &service, const QByteArray &device) = 0; }; #define QMediaServiceSupportedDevicesInterface_iid \ "org.qt-project.qt.mediaservicesupporteddevices/5.0" Q_DECLARE_INTERFACE(QMediaServiceSupportedDevicesInterface, QMediaServiceSupportedDevicesInterface_iid) // Required for QDoc workaround class QString; struct Q_MULTIMEDIA_EXPORT QMediaServiceFeaturesInterface { virtual ~QMediaServiceFeaturesInterface() {} virtual QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const = 0; }; #define QMediaServiceFeaturesInterface_iid \ "org.qt-project.qt.mediaservicefeatures/5.0" Q_DECLARE_INTERFACE(QMediaServiceFeaturesInterface, QMediaServiceFeaturesInterface_iid) // Required for QDoc workaround class QString; class Q_MULTIMEDIA_EXPORT QMediaServiceProviderPlugin : public QObject, public QMediaServiceProviderFactoryInterface { Q_OBJECT Q_INTERFACES(QMediaServiceProviderFactoryInterface) public: virtual QMediaService* create(const QString& key) = 0; virtual void release(QMediaService *service) = 0; }; /*! Service with support for media playback Required Controls: QMediaPlayerControl Optional Controls: QMediaPlaylistControl, QAudioDeviceControl Video Output Controls (used by QWideoWidget and QGraphicsVideoItem): Required: QVideoOutputControl Optional: QVideoWindowControl, QVideoRendererControl, QVideoWidgetControl */ #define Q_MEDIASERVICE_MEDIAPLAYER "org.qt-project.qt.mediaplayer" /*! Service with support for recording from audio sources Required Controls: QAudioDeviceControl Recording Controls (QMediaRecorder): Required: QMediaRecorderControl Recommended: QAudioEncoderSettingsControl Optional: QMediaContainerControl */ #define Q_MEDIASERVICE_AUDIOSOURCE "org.qt-project.qt.audiosource" /*! Service with support for camera use. Required Controls: QCameraControl Optional Controls: QCameraExposureControl, QCameraFocusControl, QCameraImageProcessingControl Still Capture Controls: QCameraImageCaptureControl Video Capture Controls (QMediaRecorder): Required: QMediaRecorderControl Recommended: QAudioEncoderSettingsControl, QVideoEncoderSettingsControl, QMediaContainerControl Viewfinder Video Output Controls (used by QCameraViewfinder and QGraphicsVideoItem): Required: QVideoOutputControl Optional: QVideoWindowControl, QVideoRendererControl, QVideoWidgetControl */ #define Q_MEDIASERVICE_CAMERA "org.qt-project.qt.camera" /*! Service with support for radio tuning. Required Controls: QRadioTunerControl Recording Controls (Optional, used by QMediaRecorder): Required: QMediaRecorderControl Recommended: QAudioEncoderSettingsControl Optional: QMediaContainerControl */ #define Q_MEDIASERVICE_RADIO "org.qt-project.qt.radio" /*! Service with support for decoding audio. Required Controls: QAudioDecoderControl Optional: that streams control */ #define Q_MEDIASERVICE_AUDIODECODER "org.qt-project.qt.audiodecode" QT_END_NAMESPACE #endif // QMEDIASERVICEPROVIDERPLUGIN_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediatimerange.cpp000066400000000000000000000447011225012771600313660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "qmediatimerange.h" QT_BEGIN_NAMESPACE /*! \class QMediaTimeInterval \brief The QMediaTimeInterval class represents a time interval with integer precision. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_core An interval is specified by an inclusive start() and end() time. These must be set in the constructor, as this is an immutable class. The specific units of time represented by the class have not been defined - it is suitable for any times which can be represented by a signed 64 bit integer. The isNormal() method determines if a time interval is normal (a normal time interval has start() <= end()). A normal interval can be received from an abnormal interval by calling the normalized() method. The contains() method determines if a specified time lies within the time interval. The translated() method returns a time interval which has been translated forwards or backwards through time by a specified offset. \sa QMediaTimeRange */ /*! \fn QMediaTimeInterval::QMediaTimeInterval() Constructs an empty interval. */ QMediaTimeInterval::QMediaTimeInterval() : s(0) , e(0) { } /*! \fn QMediaTimeInterval::QMediaTimeInterval(qint64 start, qint64 end) Constructs an interval with the specified \a start and \a end times. */ QMediaTimeInterval::QMediaTimeInterval(qint64 start, qint64 end) : s(start) , e(end) { } /*! \fn QMediaTimeInterval::QMediaTimeInterval(const QMediaTimeInterval &other) Constructs an interval by taking a copy of \a other. */ QMediaTimeInterval::QMediaTimeInterval(const QMediaTimeInterval &other) : s(other.s) , e(other.e) { } /*! \fn QMediaTimeInterval::start() const Returns the start time of the interval. \sa end() */ qint64 QMediaTimeInterval::start() const { return s; } /*! \fn QMediaTimeInterval::end() const Returns the end time of the interval. \sa start() */ qint64 QMediaTimeInterval::end() const { return e; } /*! \fn QMediaTimeInterval::contains(qint64 time) const Returns true if the time interval contains the specified \a time. That is, start() <= time <= end(). */ bool QMediaTimeInterval::contains(qint64 time) const { return isNormal() ? (s <= time && time <= e) : (e <= time && time <= s); } /*! \fn QMediaTimeInterval::isNormal() const Returns true if this time interval is normal. A normal time interval has start() <= end(). \sa normalized() */ bool QMediaTimeInterval::isNormal() const { return s <= e; } /*! \fn QMediaTimeInterval::normalized() const Returns a normalized version of this interval. If the start() time of the interval is greater than the end() time, then the returned interval has the start and end times swapped. */ QMediaTimeInterval QMediaTimeInterval::normalized() const { if(s > e) return QMediaTimeInterval(e, s); return *this; } /*! \fn QMediaTimeInterval::translated(qint64 offset) const Returns a copy of this time interval, translated by a value of \a offset. An interval can be moved forward through time with a positive offset, or backward through time with a negative offset. */ QMediaTimeInterval QMediaTimeInterval::translated(qint64 offset) const { return QMediaTimeInterval(s + offset, e + offset); } /*! \fn operator==(const QMediaTimeInterval &a, const QMediaTimeInterval &b) \relates QMediaTimeRange Returns true if \a a is exactly equal to \a b. */ bool operator==(const QMediaTimeInterval &a, const QMediaTimeInterval &b) { return a.start() == b.start() && a.end() == b.end(); } /*! \fn operator!=(const QMediaTimeInterval &a, const QMediaTimeInterval &b) \relates QMediaTimeRange Returns true if \a a is not exactly equal to \a b. */ bool operator!=(const QMediaTimeInterval &a, const QMediaTimeInterval &b) { return a.start() != b.start() || a.end() != b.end(); } class QMediaTimeRangePrivate : public QSharedData { public: QMediaTimeRangePrivate(); QMediaTimeRangePrivate(const QMediaTimeRangePrivate &other); QMediaTimeRangePrivate(const QMediaTimeInterval &interval); QList intervals; void addInterval(const QMediaTimeInterval &interval); void removeInterval(const QMediaTimeInterval &interval); }; QMediaTimeRangePrivate::QMediaTimeRangePrivate() : QSharedData() { } QMediaTimeRangePrivate::QMediaTimeRangePrivate(const QMediaTimeRangePrivate &other) : QSharedData() , intervals(other.intervals) { } QMediaTimeRangePrivate::QMediaTimeRangePrivate(const QMediaTimeInterval &interval) : QSharedData() { if(interval.isNormal()) intervals << interval; } void QMediaTimeRangePrivate::addInterval(const QMediaTimeInterval &interval) { // Handle normalized intervals only if(!interval.isNormal()) return; // Find a place to insert the interval int i; for (i = 0; i < intervals.count(); i++) { // Insert before this element if(interval.s < intervals[i].s) { intervals.insert(i, interval); break; } } // Interval needs to be added to the end of the list if (i == intervals.count()) intervals.append(interval); // Do we need to correct the element before us? if(i > 0 && intervals[i - 1].e >= interval.s - 1) i--; // Merge trailing ranges while (i < intervals.count() - 1 && intervals[i].e >= intervals[i + 1].s - 1) { intervals[i].e = qMax(intervals[i].e, intervals[i + 1].e); intervals.removeAt(i + 1); } } void QMediaTimeRangePrivate::removeInterval(const QMediaTimeInterval &interval) { // Handle normalized intervals only if(!interval.isNormal()) return; for (int i = 0; i < intervals.count(); i++) { QMediaTimeInterval r = intervals[i]; if (r.e < interval.s) { // Before the removal interval continue; } else if (interval.e < r.s) { // After the removal interval - stop here break; } else if (r.s < interval.s && interval.e < r.e) { // Split case - a single range has a chunk removed intervals[i].e = interval.s -1; addInterval(QMediaTimeInterval(interval.e + 1, r.e)); break; } else if (r.s < interval.s) { // Trimming Tail Case intervals[i].e = interval.s - 1; } else if (interval.e < r.e) { // Trimming Head Case - we can stop after this intervals[i].s = interval.e + 1; break; } else { // Complete coverage case intervals.removeAt(i); --i; } } } /*! \class QMediaTimeRange \brief The QMediaTimeRange class represents a set of zero or more disjoint time intervals. \ingroup multimedia \inmodule QtMultimedia \reentrant The earliestTime(), latestTime(), intervals() and isEmpty() methods are used to get information about the current time range. The addInterval(), removeInterval() and clear() methods are used to modify the current time range. When adding or removing intervals from the time range, existing intervals within the range may be expanded, trimmed, deleted, merged or split to ensure that all intervals within the time range remain distinct and disjoint. As a consequence, all intervals added or removed from a time range must be \l{QMediaTimeInterval::isNormal()}{normal}. \sa QMediaTimeInterval */ /*! \fn QMediaTimeRange::QMediaTimeRange() Constructs an empty time range. */ QMediaTimeRange::QMediaTimeRange() : d(new QMediaTimeRangePrivate) { } /*! \fn QMediaTimeRange::QMediaTimeRange(qint64 start, qint64 end) Constructs a time range that contains an initial interval from \a start to \a end inclusive. If the interval is not \l{QMediaTimeInterval::isNormal()}{normal}, the resulting time range will be empty. \sa addInterval() */ QMediaTimeRange::QMediaTimeRange(qint64 start, qint64 end) : d(new QMediaTimeRangePrivate(QMediaTimeInterval(start, end))) { } /*! \fn QMediaTimeRange::QMediaTimeRange(const QMediaTimeInterval &interval) Constructs a time range that contains an initial interval, \a interval. If \a interval is not \l{QMediaTimeInterval::isNormal()}{normal}, the resulting time range will be empty. \sa addInterval() */ QMediaTimeRange::QMediaTimeRange(const QMediaTimeInterval &interval) : d(new QMediaTimeRangePrivate(interval)) { } /*! \fn QMediaTimeRange::QMediaTimeRange(const QMediaTimeRange &range) Constructs a time range by copying another time \a range. */ QMediaTimeRange::QMediaTimeRange(const QMediaTimeRange &range) : d(range.d) { } /*! \fn QMediaTimeRange::~QMediaTimeRange() Destructor. */ QMediaTimeRange::~QMediaTimeRange() { } /*! \fn QMediaTimeRange::operator=(const QMediaTimeRange &other) Takes a copy of the \a other time range and returns itself. */ QMediaTimeRange &QMediaTimeRange::operator=(const QMediaTimeRange &other) { d = other.d; return *this; } /*! \fn QMediaTimeRange::operator=(const QMediaTimeInterval &interval) Sets the time range to a single continuous interval, \a interval. */ QMediaTimeRange &QMediaTimeRange::operator=(const QMediaTimeInterval &interval) { d = new QMediaTimeRangePrivate(interval); return *this; } /*! \fn QMediaTimeRange::earliestTime() const Returns the earliest time within the time range. For empty time ranges, this value is equal to zero. \sa latestTime() */ qint64 QMediaTimeRange::earliestTime() const { if (!d->intervals.isEmpty()) return d->intervals[0].s; return 0; } /*! \fn QMediaTimeRange::latestTime() const Returns the latest time within the time range. For empty time ranges, this value is equal to zero. \sa earliestTime() */ qint64 QMediaTimeRange::latestTime() const { if (!d->intervals.isEmpty()) return d->intervals[d->intervals.count() - 1].e; return 0; } /*! \fn QMediaTimeRange::addInterval(qint64 start, qint64 end) \overload Adds the interval specified by \a start and \a end to the time range. \sa addInterval() */ void QMediaTimeRange::addInterval(qint64 start, qint64 end) { d->addInterval(QMediaTimeInterval(start, end)); } /*! \fn QMediaTimeRange::addInterval(const QMediaTimeInterval &interval) Adds the specified \a interval to the time range. Adding intervals which are not \l{QMediaTimeInterval::isNormal()}{normal} is invalid, and will be ignored. If the specified interval is adjacent to, or overlaps existing intervals within the time range, these intervals will be merged. This operation takes linear time. \sa removeInterval() */ void QMediaTimeRange::addInterval(const QMediaTimeInterval &interval) { d->addInterval(interval); } /*! \fn QMediaTimeRange::addTimeRange(const QMediaTimeRange &range) Adds each of the intervals in \a range to this time range. Equivalent to calling addInterval() for each interval in \a range. */ void QMediaTimeRange::addTimeRange(const QMediaTimeRange &range) { foreach(const QMediaTimeInterval &i, range.intervals()) { d->addInterval(i); } } /*! \fn QMediaTimeRange::removeInterval(qint64 start, qint64 end) \overload Removes the interval specified by \a start and \a end from the time range. \sa removeInterval() */ void QMediaTimeRange::removeInterval(qint64 start, qint64 end) { d->removeInterval(QMediaTimeInterval(start, end)); } /*! \fn QMediaTimeRange::removeInterval(const QMediaTimeInterval &interval) Removes the specified \a interval from the time range. Removing intervals which are not \l{QMediaTimeInterval::isNormal()}{normal} is invalid, and will be ignored. Intervals within the time range will be trimmed, split or deleted such that no intervals within the time range include any part of the target interval. This operation takes linear time. \sa addInterval() */ void QMediaTimeRange::removeInterval(const QMediaTimeInterval &interval) { d->removeInterval(interval); } /*! \fn QMediaTimeRange::removeTimeRange(const QMediaTimeRange &range) Removes each of the intervals in \a range from this time range. Equivalent to calling removeInterval() for each interval in \a range. */ void QMediaTimeRange::removeTimeRange(const QMediaTimeRange &range) { foreach(const QMediaTimeInterval &i, range.intervals()) { d->removeInterval(i); } } /*! \fn QMediaTimeRange::operator+=(const QMediaTimeRange &other) Adds each interval in \a other to the time range and returns the result. */ QMediaTimeRange& QMediaTimeRange::operator+=(const QMediaTimeRange &other) { addTimeRange(other); return *this; } /*! \fn QMediaTimeRange::operator+=(const QMediaTimeInterval &interval) Adds the specified \a interval to the time range and returns the result. */ QMediaTimeRange& QMediaTimeRange::operator+=(const QMediaTimeInterval &interval) { addInterval(interval); return *this; } /*! \fn QMediaTimeRange::operator-=(const QMediaTimeRange &other) Removes each interval in \a other from the time range and returns the result. */ QMediaTimeRange& QMediaTimeRange::operator-=(const QMediaTimeRange &other) { removeTimeRange(other); return *this; } /*! \fn QMediaTimeRange::operator-=(const QMediaTimeInterval &interval) Removes the specified \a interval from the time range and returns the result. */ QMediaTimeRange& QMediaTimeRange::operator-=(const QMediaTimeInterval &interval) { removeInterval(interval); return *this; } /*! \fn QMediaTimeRange::clear() Removes all intervals from the time range. \sa removeInterval() */ void QMediaTimeRange::clear() { d->intervals.clear(); } /*! \fn QMediaTimeRange::intervals() const Returns the list of intervals covered by this time range. */ QList QMediaTimeRange::intervals() const { return d->intervals; } /*! \fn QMediaTimeRange::isEmpty() const Returns true if there are no intervals within the time range. \sa intervals() */ bool QMediaTimeRange::isEmpty() const { return d->intervals.isEmpty(); } /*! \fn QMediaTimeRange::isContinuous() const Returns true if the time range consists of a continuous interval. That is, there is one or fewer disjoint intervals within the time range. */ bool QMediaTimeRange::isContinuous() const { return (d->intervals.count() <= 1); } /*! \fn QMediaTimeRange::contains(qint64 time) const Returns true if the specified \a time lies within the time range. */ bool QMediaTimeRange::contains(qint64 time) const { for (int i = 0; i < d->intervals.count(); i++) { if (d->intervals[i].contains(time)) return true; if (time < d->intervals[i].s) break; } return false; } /*! \fn operator==(const QMediaTimeRange &a, const QMediaTimeRange &b) \relates QMediaTimeRange Returns true if all intervals in \a a are present in \a b. */ bool operator==(const QMediaTimeRange &a, const QMediaTimeRange &b) { if (a.intervals().count() != b.intervals().count()) return false; for (int i = 0; i < a.intervals().count(); i++) { if(a.intervals()[i] != b.intervals()[i]) return false; } return true; } /*! \fn operator!=(const QMediaTimeRange &a, const QMediaTimeRange &b) \relates QMediaTimeRange Returns true if one or more intervals in \a a are not present in \a b. */ bool operator!=(const QMediaTimeRange &a, const QMediaTimeRange &b) { return !(a == b); } /*! \fn operator+(const QMediaTimeRange &r1, const QMediaTimeRange &r2) \relates QMediaTimeRange Returns a time range containing the union between \a r1 and \a r2. */ QMediaTimeRange operator+(const QMediaTimeRange &r1, const QMediaTimeRange &r2) { return (QMediaTimeRange(r1) += r2); } /*! \fn operator-(const QMediaTimeRange &r1, const QMediaTimeRange &r2) \relates QMediaTimeRange Returns a time range containing \a r2 subtracted from \a r1. */ QMediaTimeRange operator-(const QMediaTimeRange &r1, const QMediaTimeRange &r2) { return (QMediaTimeRange(r1) -= r2); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, const QMediaTimeRange &range) { dbg.nospace() << "QMediaTimeRange( "; foreach (const QMediaTimeInterval &interval, range.intervals()) { dbg.nospace() << "(" << interval.start() << ", " << interval.end() << ") "; } dbg.space() << ")"; return dbg; } #endif QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmediatimerange.h000066400000000000000000000107571225012771600310370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIATIMERANGE_H #define QMEDIATIMERANGE_H #include #include #include QT_BEGIN_NAMESPACE class QMediaTimeRangePrivate; class Q_MULTIMEDIA_EXPORT QMediaTimeInterval { public: QMediaTimeInterval(); QMediaTimeInterval(qint64 start, qint64 end); QMediaTimeInterval(const QMediaTimeInterval&); qint64 start() const; qint64 end() const; bool contains(qint64 time) const; bool isNormal() const; QMediaTimeInterval normalized() const; QMediaTimeInterval translated(qint64 offset) const; private: friend class QMediaTimeRangePrivate; friend class QMediaTimeRange; qint64 s; qint64 e; }; Q_MULTIMEDIA_EXPORT bool operator==(const QMediaTimeInterval&, const QMediaTimeInterval&); Q_MULTIMEDIA_EXPORT bool operator!=(const QMediaTimeInterval&, const QMediaTimeInterval&); class Q_MULTIMEDIA_EXPORT QMediaTimeRange { public: QMediaTimeRange(); QMediaTimeRange(qint64 start, qint64 end); QMediaTimeRange(const QMediaTimeInterval&); QMediaTimeRange(const QMediaTimeRange &range); ~QMediaTimeRange(); QMediaTimeRange &operator=(const QMediaTimeRange&); QMediaTimeRange &operator=(const QMediaTimeInterval&); qint64 earliestTime() const; qint64 latestTime() const; QList intervals() const; bool isEmpty() const; bool isContinuous() const; bool contains(qint64 time) const; void addInterval(qint64 start, qint64 end); void addInterval(const QMediaTimeInterval &interval); void addTimeRange(const QMediaTimeRange&); void removeInterval(qint64 start, qint64 end); void removeInterval(const QMediaTimeInterval &interval); void removeTimeRange(const QMediaTimeRange&); QMediaTimeRange& operator+=(const QMediaTimeRange&); QMediaTimeRange& operator+=(const QMediaTimeInterval&); QMediaTimeRange& operator-=(const QMediaTimeRange&); QMediaTimeRange& operator-=(const QMediaTimeInterval&); void clear(); private: QSharedDataPointer d; }; Q_MULTIMEDIA_EXPORT bool operator==(const QMediaTimeRange&, const QMediaTimeRange&); Q_MULTIMEDIA_EXPORT bool operator!=(const QMediaTimeRange&, const QMediaTimeRange&); Q_MULTIMEDIA_EXPORT QMediaTimeRange operator+(const QMediaTimeRange&, const QMediaTimeRange&); Q_MULTIMEDIA_EXPORT QMediaTimeRange operator-(const QMediaTimeRange&, const QMediaTimeRange&); #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QMediaTimeRange &); #endif QT_END_NAMESPACE #endif // QMEDIATIMERANGE_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmultimedia.cpp000066400000000000000000000071121225012771600305400ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmultimedia.h" QT_BEGIN_NAMESPACE /*! \namespace QMultimedia \ingroup multimedia \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_core \brief The QMultimedia namespace contains miscellaneous identifiers used throughout the Qt Multimedia library. */ namespace { class QMultimediaNamespacePrivateRegisterMetaTypes { public: QMultimediaNamespacePrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \enum QMultimedia::SupportEstimate Enumerates the levels of support a media service provider may have for a feature. \value NotSupported The feature is not supported. \value MaybeSupported The feature may be supported. \value ProbablySupported The feature is probably supported. \value PreferredService The service is the preferred provider of a service. */ /*! \enum QMultimedia::EncodingQuality Enumerates quality encoding levels. \value VeryLowQuality \value LowQuality \value NormalQuality \value HighQuality \value VeryHighQuality */ /*! \enum QMultimedia::EncodingMode Enumerates encoding modes. \value ConstantQualityEncoding Encoding will aim to have a constant quality, adjusting bitrate to fit. \value ConstantBitRateEncoding Encoding will use a constant bit rate, adjust quality to fit. \value AverageBitRateEncoding Encoding will try to keep an average bitrate setting, but will use more or less as needed. \value TwoPassEncoding The media will first be processed to determine the characteristics, and then processed a second time allocating more bits to the areas that need it. */ /*! \enum QMultimedia::AvailabilityStatus Enumerates Service status errors. \value Available The service is operating correctly. \value ServiceMissing There is no service available to provide the requested functionality. \value ResourceError The service could not allocate resources required to function correctly. \value Busy The service must wait for access to necessary resources. */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qmultimedia.h000066400000000000000000000056171225012771600302150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMULTIMEDIA_H #define QMULTIMEDIA_H #include #include #include #include QT_BEGIN_NAMESPACE namespace QMultimedia { enum SupportEstimate { NotSupported, MaybeSupported, ProbablySupported, PreferredService }; enum EncodingQuality { VeryLowQuality, LowQuality, NormalQuality, HighQuality, VeryHighQuality }; enum EncodingMode { ConstantQualityEncoding, ConstantBitRateEncoding, AverageBitRateEncoding, TwoPassEncoding }; enum AvailabilityStatus { Available, ServiceMissing, Busy, ResourceError }; } QT_END_NAMESPACE Q_DECLARE_METATYPE(QMultimedia::AvailabilityStatus) Q_DECLARE_METATYPE(QMultimedia::SupportEstimate) Q_DECLARE_METATYPE(QMultimedia::EncodingMode) Q_DECLARE_METATYPE(QMultimedia::EncodingQuality) #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qtmultimediadefs.h000066400000000000000000000050051225012771600312320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QTMULTIMEDIA_P_H #define QTMULTIMEDIA_P_H #include QT_BEGIN_NAMESPACE #ifndef QT_STATIC # if defined(QT_BUILD_MULTIMEDIA_LIB) # define Q_MULTIMEDIA_EXPORT Q_DECL_EXPORT # else # define Q_MULTIMEDIA_EXPORT Q_DECL_IMPORT # endif #else # define Q_MULTIMEDIA_EXPORT #endif QT_END_NAMESPACE #endif // QMULTIMEDIA_P_H qtmultimediaquicktools_headers/000077500000000000000000000000001225012771600337515ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediaqsgvideonode_p.h000066400000000000000000000066741225012771600371450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qtmultimediaquicktools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSGVIDEONODE_P_H #define QSGVIDEONODE_P_H #include #include #include #include #include QT_BEGIN_NAMESPACE const QLatin1String QSGVideoNodeFactoryPluginKey("sgvideonodes"); class Q_MULTIMEDIAQUICK_EXPORT QSGVideoNode : public QSGGeometryNode { public: QSGVideoNode(); virtual void setCurrentFrame(const QVideoFrame &frame) = 0; virtual QVideoFrame::PixelFormat pixelFormat() const = 0; void setTexturedRectGeometry(const QRectF &boundingRect, const QRectF &textureRect, int orientation); private: QRectF m_rect; QRectF m_textureRect; int m_orientation; }; class QSGVideoNodeFactoryInterface { public: virtual QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const = 0; virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0; }; #define QSGVideoNodeFactoryInterface_iid "org.qt-project.qt.sgvideonodefactory/5.0" Q_DECLARE_INTERFACE(QSGVideoNodeFactoryInterface, QSGVideoNodeFactoryInterface_iid) class QSGVideoNodeFactoryPlugin : public QObject, public QSGVideoNodeFactoryInterface { Q_OBJECT Q_INTERFACES(QSGVideoNodeFactoryInterface) public: virtual QList supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const = 0; virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0; }; QT_END_NAMESPACE #endif // QSGVIDEONODE_H qtmultimediaquickdefs_p.h000066400000000000000000000050101225012771600410330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/qtmultimediaquicktools_headers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QMULTIMEDIAQUICKDEFS_P_H #define QMULTIMEDIAQUICKDEFS_P_H #include #ifndef QT_STATIC # if defined(QT_BUILD_QTMM_QUICK_LIB) # define Q_MULTIMEDIAQUICK_EXPORT Q_DECL_EXPORT # else # define Q_MULTIMEDIAQUICK_EXPORT Q_DECL_IMPORT # endif #else # define Q_MULTIMEDIAQUICK_EXPORT #endif #endif // QMULTIMEDIAQUICKDEFS_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/000077500000000000000000000000001225012771600266165ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/qradiodata.cpp000066400000000000000000000310651225012771600314400ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qradiodata.h" #include "qmediaservice.h" #include "qmediaobject_p.h" #include "qradiodatacontrol.h" #include "qmediaserviceprovider_p.h" #include QT_BEGIN_NAMESPACE namespace { class QRadioDataPrivateRegisterMetaTypes { public: QRadioDataPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QRadioData \brief The QRadioData class provides interfaces to the RDS functionality of the system radio. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_radio The radio data object will emit signals for any changes in radio data. You can enable or disable alternative frequency with setAlternativeFrequenciesEnabled(). You can get a QRadioData instance fromt the \l{QRadioTuner::radioData()}{radioData} property from a QRadioTuner instance. \snippet multimedia-snippets/media.cpp Radio data setup Alternatively, you can pass an instance of QRadioTuner to the constructor to QRadioData. \sa {Radio Overview} */ class QRadioDataPrivate { Q_DECLARE_NON_CONST_PUBLIC(QRadioData) public: QRadioDataPrivate(); QMediaObject *mediaObject; QRadioDataControl* control; void _q_serviceDestroyed(); QRadioData *q_ptr; }; QRadioDataPrivate::QRadioDataPrivate() : mediaObject(0) , control(0) {} void QRadioDataPrivate::_q_serviceDestroyed() { mediaObject = 0; control = 0; } /*! Constructs a radio data based on a \a mediaObject and \a parent. The \a mediaObject should be an instance of \l QRadioTuner. It is preferable to use the \l{QRadioTuner::radioData()}{radioData} property on a QRadioTuner instance to get an instance of QRadioData. During construction, this class is bound to the \a mediaObject using the \l{QMediaObject::bind()}{bind()} method. */ QRadioData::QRadioData(QMediaObject *mediaObject, QObject *parent) : QObject(parent) , d_ptr(new QRadioDataPrivate) { Q_D(QRadioData); d->q_ptr = this; if (mediaObject) mediaObject->bind(this); } /*! Destroys a radio data. */ QRadioData::~QRadioData() { Q_D(QRadioData); if (d->mediaObject) d->mediaObject->unbind(this); delete d_ptr; } /*! \reimp */ QMediaObject *QRadioData::mediaObject() const { return d_func()->mediaObject; } /*! \reimp */ bool QRadioData::setMediaObject(QMediaObject *mediaObject) { Q_D(QRadioData); if (d->mediaObject) { if (d->control) { disconnect(d->control, SIGNAL(stationIdChanged(QString)), this, SIGNAL(stationIdChanged(QString))); disconnect(d->control, SIGNAL(programTypeChanged(QRadioData::ProgramType)), this, SIGNAL(programTypeChanged(QRadioData::ProgramType))); disconnect(d->control, SIGNAL(programTypeNameChanged(QString)), this, SIGNAL(programTypeNameChanged(QString))); disconnect(d->control, SIGNAL(stationNameChanged(QString)), this, SIGNAL(stationNameChanged(QString))); disconnect(d->control, SIGNAL(radioTextChanged(QString)), this, SIGNAL(radioTextChanged(QString))); disconnect(d->control, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), this, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); disconnect(d->control, SIGNAL(error(QRadioData::Error)), this, SIGNAL(error(QRadioData::Error))); QMediaService *service = d->mediaObject->service(); service->releaseControl(d->control); disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); } } d->mediaObject = mediaObject; if (d->mediaObject) { QMediaService *service = mediaObject->service(); if (service) { d->control = qobject_cast(service->requestControl(QRadioDataControl_iid)); if (d->control) { connect(d->control, SIGNAL(stationIdChanged(QString)), this, SIGNAL(stationIdChanged(QString))); connect(d->control, SIGNAL(programTypeChanged(QRadioData::ProgramType)), this, SIGNAL(programTypeChanged(QRadioData::ProgramType))); connect(d->control, SIGNAL(programTypeNameChanged(QString)), this, SIGNAL(programTypeNameChanged(QString))); connect(d->control, SIGNAL(stationNameChanged(QString)), this, SIGNAL(stationNameChanged(QString))); connect(d->control, SIGNAL(radioTextChanged(QString)), this, SIGNAL(radioTextChanged(QString))); connect(d->control, SIGNAL(alternativeFrequenciesEnabledChanged(bool)), this, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); connect(d->control, SIGNAL(error(QRadioData::Error)), this, SIGNAL(error(QRadioData::Error))); connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); return true; } } } // without QRadioDataControl discard the media object d->mediaObject = 0; d->control = 0; return false; } /*! Returns the availability of the radio data service. A long as there is a media service which provides radio functionality, then the \l{QMultimedia::AvailabilityStatus}{availability} will be that of the \l{QRadioTuner::availability()}{radio tuner}. */ QMultimedia::AvailabilityStatus QRadioData::availability() const { Q_D(const QRadioData); if (d->control == 0) return QMultimedia::ServiceMissing; return d->mediaObject->availability(); } /*! \property QRadioData::stationId \brief Current Program Identification */ QString QRadioData::stationId() const { Q_D(const QRadioData); if (d->control != 0) return d->control->stationId(); return QString(); } /*! \property QRadioData::programType \brief Current Program Type */ QRadioData::ProgramType QRadioData::programType() const { Q_D(const QRadioData); if (d->control != 0) return d->control->programType(); return QRadioData::Undefined; } /*! \property QRadioData::programTypeName \brief Current Program Type Name */ QString QRadioData::programTypeName() const { Q_D(const QRadioData); if (d->control != 0) return d->control->programTypeName(); return QString(); } /*! \property QRadioData::stationName \brief Current Program Service */ QString QRadioData::stationName() const { Q_D(const QRadioData); if (d->control != 0) return d->control->stationName(); return QString(); } /*! \property QRadioData::radioText \brief Current Radio Text */ QString QRadioData::radioText() const { Q_D(const QRadioData); if (d->control != 0) return d->control->radioText(); return QString(); } /*! \property QRadioData::alternativeFrequenciesEnabled \brief Is Alternative Frequency currently enabled */ bool QRadioData::isAlternativeFrequenciesEnabled() const { Q_D(const QRadioData); if (d->control != 0) return d->control->isAlternativeFrequenciesEnabled(); return false; } void QRadioData::setAlternativeFrequenciesEnabled( bool enabled ) { Q_D(const QRadioData); if (d->control != 0) return d->control->setAlternativeFrequenciesEnabled(enabled); } /*! Returns the error state of a radio data. \sa errorString() */ QRadioData::Error QRadioData::error() const { Q_D(const QRadioData); if (d->control != 0) return d->control->error(); return QRadioData::ResourceError; } /*! Returns a description of a radio data's error state. \sa error() */ QString QRadioData::errorString() const { Q_D(const QRadioData); if (d->control != 0) return d->control->errorString(); return QString(); } /*! \fn void QRadioData::stationIdChanged(QString stationId) Signals that the Program Identification code has changed to \a stationId */ /*! \fn void QRadioData::programTypeChanged(QRadioData::ProgramType programType) Signals that the Program Type code has changed to \a programType */ /*! \fn void QRadioData::programTypeNameChanged(QString programTypeName) Signals that the Program Type Name has changed to \a programTypeName */ /*! \fn void QRadioData::stationNameChanged(QString stationName) Signals that the Program Service has changed to \a stationName */ /*! \fn void QRadioData::alternativeFrequenciesEnabledChanged(bool enabled) Signals that automatically tuning to alternative frequencies has been enabled or disabled according to \a enabled. */ /*! \fn void QRadioData::radioTextChanged(QString radioText) Signals that the Radio Text property has changed to \a radioText */ /*! \fn void QRadioData::error(QRadioData::Error error) Signals that an \a error occurred. */ /*! \enum QRadioData::Error Enumerates radio data error conditions. \value NoError No errors have occurred. \value ResourceError There is no radio service available. \value OpenError Unable to open radio device. \value OutOfRangeError An attempt to set a frequency or band that is not supported by radio device. */ /*! \enum QRadioData::ProgramType This property holds the type of the currently playing program as transmitted by the radio station. The value can be any one of the values defined in the table below. \value Undefined \value News \value CurrentAffairs \value Information \value Sport \value Education \value Drama \value Culture \value Science \value Varied \value PopMusic \value RockMusic \value EasyListening \value LightClassical \value SeriousClassical \value OtherMusic \value Weather \value Finance \value ChildrensProgrammes \value SocialAffairs \value Religion \value PhoneIn \value Travel \value Leisure \value JazzMusic \value CountryMusic \value NationalMusic \value OldiesMusic \value FolkMusic \value Documentary \value AlarmTest \value Alarm \value Talk \value ClassicRock \value AdultHits \value SoftRock \value Top40 \value Soft \value Nostalgia \value Classical \value RhythmAndBlues \value SoftRhythmAndBlues \value Language \value ReligiousMusic \value ReligiousTalk \value Personality \value Public \value College */ #include "moc_qradiodata.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/qradiodata.h000066400000000000000000000117121225012771600311020ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QRADIODATA_H #define QRADIODATA_H #include #include #include #include QT_BEGIN_NAMESPACE class QRadioDataPrivate; class Q_MULTIMEDIA_EXPORT QRadioData : public QObject, public QMediaBindableInterface { Q_OBJECT Q_PROPERTY(QString stationId READ stationId NOTIFY stationIdChanged) Q_PROPERTY(ProgramType programType READ programType NOTIFY programTypeChanged) Q_PROPERTY(QString programTypeName READ programTypeName NOTIFY programTypeNameChanged) Q_PROPERTY(QString stationName READ stationName NOTIFY stationNameChanged) Q_PROPERTY(QString radioText READ radioText NOTIFY radioTextChanged) Q_PROPERTY(bool alternativeFrequenciesEnabled READ isAlternativeFrequenciesEnabled WRITE setAlternativeFrequenciesEnabled NOTIFY alternativeFrequenciesEnabledChanged) Q_ENUMS(Error) Q_ENUMS(ProgramType) Q_INTERFACES(QMediaBindableInterface) public: enum Error { NoError, ResourceError, OpenError, OutOfRangeError }; enum ProgramType { Undefined = 0, News, CurrentAffairs, Information, Sport, Education, Drama, Culture, Science, Varied, PopMusic, RockMusic, EasyListening, LightClassical, SeriousClassical, OtherMusic, Weather, Finance, ChildrensProgrammes, SocialAffairs, Religion, PhoneIn, Travel, Leisure, JazzMusic, CountryMusic, NationalMusic, OldiesMusic, FolkMusic, Documentary, AlarmTest, Alarm, Talk, ClassicRock, AdultHits, SoftRock, Top40, Soft, Nostalgia, Classical, RhythmAndBlues, SoftRhythmAndBlues, Language, ReligiousMusic, ReligiousTalk, Personality, Public, College }; QRadioData(QMediaObject *mediaObject, QObject *parent = 0); ~QRadioData(); QMultimedia::AvailabilityStatus availability() const; QMediaObject *mediaObject() const; QString stationId() const; ProgramType programType() const; QString programTypeName() const; QString stationName() const; QString radioText() const; bool isAlternativeFrequenciesEnabled() const; Error error() const; QString errorString() const; public Q_SLOTS: void setAlternativeFrequenciesEnabled(bool enabled); Q_SIGNALS: void stationIdChanged(QString stationId); void programTypeChanged(QRadioData::ProgramType programType); void programTypeNameChanged(QString programTypeName); void stationNameChanged(QString stationName); void radioTextChanged(QString radioText); void alternativeFrequenciesEnabledChanged(bool enabled); void error(QRadioData::Error error); protected: bool setMediaObject(QMediaObject *); QRadioDataPrivate *d_ptr; private: Q_DISABLE_COPY(QRadioData) Q_DECLARE_PRIVATE(QRadioData) Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QRadioData::Error) Q_DECLARE_METATYPE(QRadioData::ProgramType) Q_MEDIA_ENUM_DEBUG(QRadioData, Error) Q_MEDIA_ENUM_DEBUG(QRadioData, ProgramType) #endif // QRADIOPLAYER_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/qradiotuner.cpp000066400000000000000000000374621225012771600316730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qradiotuner.h" #include "qmediaservice.h" #include "qmediaobject_p.h" #include "qradiotunercontrol.h" #include "qradiodata.h" #include "qmediaserviceprovider_p.h" #include QT_BEGIN_NAMESPACE namespace { class QRadioTunerPrivateRegisterMetaTypes { public: QRadioTunerPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QRadioTuner \brief The QRadioTuner class provides an interface to the systems analog radio device. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_radio You can control the systems analog radio device using this interface, for example: \snippet multimedia-snippets/media.cpp Radio tuner The radio object will emit signals for any changes in state such as: bandChanged(), frequencyChanged(), stereoStatusChanged(), searchingChanged(), signalStrengthChanged(), volumeChanged(), mutedChanged(). You can change between the frequency bands using setBand() however it is recommended that you check to make sure the band is available first using isBandSupported(). \sa QRadioData, {Radio Overview} */ class QRadioTunerPrivate : public QMediaObjectPrivate { public: QRadioTunerPrivate():provider(0), control(0), radioData(0) {} QMediaServiceProvider *provider; QRadioTunerControl* control; QRadioData *radioData; }; /*! Constructs a radio tuner based on a media service allocated by the default media service provider. The \a parent is passed to QMediaObject. */ QRadioTuner::QRadioTuner(QObject *parent): QMediaObject(*new QRadioTunerPrivate, parent, QMediaServiceProvider::defaultServiceProvider()->requestService(Q_MEDIASERVICE_RADIO)) { Q_D(QRadioTuner); d->provider = QMediaServiceProvider::defaultServiceProvider(); if (d->service != 0) { d->control = qobject_cast(d->service->requestControl(QRadioTunerControl_iid)); if (d->control != 0) { connect(d->control, SIGNAL(stateChanged(QRadioTuner::State)), SIGNAL(stateChanged(QRadioTuner::State))); connect(d->control, SIGNAL(bandChanged(QRadioTuner::Band)), SIGNAL(bandChanged(QRadioTuner::Band))); connect(d->control, SIGNAL(frequencyChanged(int)), SIGNAL(frequencyChanged(int))); connect(d->control, SIGNAL(stereoStatusChanged(bool)), SIGNAL(stereoStatusChanged(bool))); connect(d->control, SIGNAL(searchingChanged(bool)), SIGNAL(searchingChanged(bool))); connect(d->control, SIGNAL(signalStrengthChanged(int)), SIGNAL(signalStrengthChanged(int))); connect(d->control, SIGNAL(volumeChanged(int)), SIGNAL(volumeChanged(int))); connect(d->control, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); connect(d->control, SIGNAL(stationFound(int,QString)), SIGNAL(stationFound(int,QString))); connect(d->control, SIGNAL(antennaConnectedChanged(bool)), SIGNAL(antennaConnectedChanged(bool))); connect(d->control, SIGNAL(error(QRadioTuner::Error)), SIGNAL(error(QRadioTuner::Error))); } d->radioData = new QRadioData(this, this); } } /*! Destroys a radio tuner. */ QRadioTuner::~QRadioTuner() { Q_D(QRadioTuner); if (d->radioData) delete d->radioData; if (d->service && d->control) d->service->releaseControl(d->control); d->provider->releaseService(d->service); } /*! Returns the availability of the radio tuner. */ QMultimedia::AvailabilityStatus QRadioTuner::availability() const { if (d_func()->control == 0) return QMultimedia::ServiceMissing; if (!d_func()->control->isAntennaConnected()) return QMultimedia::ResourceError; return QMediaObject::availability(); } /*! \property QRadioTuner::state Return the current radio tuner state. \sa QRadioTuner::State */ QRadioTuner::State QRadioTuner::state() const { return d_func()->control ? d_func()->control->state() : QRadioTuner::StoppedState; } /*! \property QRadioTuner::band \brief the frequency band a radio tuner is tuned to. \sa QRadioTuner::Band */ QRadioTuner::Band QRadioTuner::band() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->band(); return QRadioTuner::FM; } /*! \property QRadioTuner::frequency \brief the frequency in Hertz a radio tuner is tuned to. */ int QRadioTuner::frequency() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->frequency(); return 0; } /*! Returns the number of Hertz to increment the frequency by when stepping through frequencies within a given \a band. */ int QRadioTuner::frequencyStep(QRadioTuner::Band band) const { Q_D(const QRadioTuner); if(d->control != 0) return d->control->frequencyStep(band); return 0; } /*! Returns a frequency \a band's minimum and maximum frequency. */ QPair QRadioTuner::frequencyRange(QRadioTuner::Band band) const { Q_D(const QRadioTuner); if(d->control != 0) return d->control->frequencyRange(band); return qMakePair(0,0); } /*! \property QRadioTuner::stereo \brief whether a radio tuner is receiving a stereo signal. */ bool QRadioTuner::isStereo() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->isStereo(); return false; } /*! \property QRadioTuner::stereoMode \brief the stereo mode of a radio tuner. */ QRadioTuner::StereoMode QRadioTuner::stereoMode() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->stereoMode(); return QRadioTuner::Auto; } void QRadioTuner::setStereoMode(QRadioTuner::StereoMode mode) { Q_D(QRadioTuner); if (d->control != 0) return d->control->setStereoMode(mode); } /*! Identifies if a frequency \a band is supported by a radio tuner. Returns true if the band is supported, and false if it is not. */ bool QRadioTuner::isBandSupported(QRadioTuner::Band band) const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->isBandSupported(band); return false; } /*! Activate the radio device. */ void QRadioTuner::start() { Q_D(const QRadioTuner); if (d->control != 0) d->control->start(); } /*! Deactivate the radio device. */ void QRadioTuner::stop() { Q_D(const QRadioTuner); if (d->control != 0) d->control->stop(); } /*! \property QRadioTuner::signalStrength \brief the strength of the current radio signal as a percentage. */ int QRadioTuner::signalStrength() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->signalStrength(); return 0; } /*! \property QRadioTuner::volume \brief the volume of a radio tuner's audio output as a percentage. */ int QRadioTuner::volume() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->volume(); return 0; } /*! \property QRadioTuner::muted \brief whether a radio tuner's audio output is muted. */ bool QRadioTuner::isMuted() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->isMuted(); return false; } /*! Sets a radio tuner's frequency \a band. Changing the band will reset the \l frequency to the new band's minimum frequency. */ void QRadioTuner::setBand(QRadioTuner::Band band) { Q_D(QRadioTuner); if (d->control != 0) d->control->setBand(band); } /*! Sets a radio tuner's \a frequency. If the tuner is set to a frequency outside the current \l band, the band will be changed to one occupied by the new frequency. */ void QRadioTuner::setFrequency(int frequency) { Q_D(QRadioTuner); if (d->control != 0) d->control->setFrequency(frequency); } void QRadioTuner::setVolume(int volume) { Q_D(QRadioTuner); if (d->control != 0) d->control->setVolume(volume); } void QRadioTuner::setMuted(bool muted) { Q_D(QRadioTuner); if (d->control != 0) d->control->setMuted(muted); } /*! \property QRadioTuner::searching \brief whether a radio tuner is currently scanning for a signal. \sa searchForward(), searchBackward(), cancelSearch() */ bool QRadioTuner::isSearching() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->isSearching(); return false; } /*! \property QRadioTuner::antennaConnected \brief whether there is an antenna connected */ bool QRadioTuner::isAntennaConnected() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->isAntennaConnected(); return false; } /*! Starts a forward scan for a signal, starting from the current \l frequency. \sa searchBackward(), cancelSearch(), searching */ void QRadioTuner::searchForward() { Q_D(QRadioTuner); if (d->control != 0) d->control->searchForward(); } /*! Starts a backwards scan for a signal, starting from the current \l frequency. \sa searchForward(), cancelSearch(), searching */ void QRadioTuner::searchBackward() { Q_D(QRadioTuner); if (d->control != 0) d->control->searchBackward(); } /*! \enum QRadioTuner::SearchMode Enumerates how the radio tuner should search for stations. \value SearchFast Use only signal strength when searching. \value SearchGetStationId After finding a strong signal, wait for the RDS station id (PI) before continuing. */ /*! Search all stations in current band Emits QRadioTuner::stationFound(int, QString) for every found station. After searching is completed, QRadioTuner::searchingChanged(bool) is emitted (false). If \a searchMode is set to SearchGetStationId, searching waits for station id (PI) on each frequency. \sa searchForward(), searchBackward(), searching */ void QRadioTuner::searchAllStations(QRadioTuner::SearchMode searchMode) { Q_D(const QRadioTuner); if (d->control != 0) d->control->searchAllStations(searchMode); } /*! Stops scanning for a signal. \sa searchForward(), searchBackward(), searching */ void QRadioTuner::cancelSearch() { Q_D(QRadioTuner); if (d->control != 0) d->control->cancelSearch(); } /*! Returns the error state of a radio tuner. \sa errorString() */ QRadioTuner::Error QRadioTuner::error() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->error(); return QRadioTuner::ResourceError; } /*! Returns a description of a radio tuner's error state. \sa error() */ QString QRadioTuner::errorString() const { Q_D(const QRadioTuner); if (d->control != 0) return d->control->errorString(); return QString(); } /*! \property QRadioTuner::radioData \brief holds an instance of \l QRadioData The instance of QRadioData is already bound to this instance of QRadioTuner. */ QRadioData *QRadioTuner::radioData() const { return d_func()->radioData; } /*! \fn void QRadioTuner::bandChanged(QRadioTuner::Band band) Signals a radio tuner's \a band has changed. */ /*! \fn void QRadioTuner::frequencyChanged(int frequency) Signals that the \a frequency a radio tuner is tuned to has changed. */ /*! \fn void QRadioTuner::mutedChanged(bool muted) Signals that the \a muted state of a radio tuner's audio output has changed. */ /*! \fn void QRadioTuner::volumeChanged(int volume) Signals that the \a volume of a radio tuner's audio output has changed. */ /*! \fn void QRadioTuner::searchingChanged(bool searching) Signals that the \a searching state of a radio tuner has changed. */ /*! \fn void QRadioTuner::stereoStatusChanged(bool stereo) Signals that the \a stereo state of a radio tuner has changed. */ /*! \fn void QRadioTuner::signalStrengthChanged(int strength) Signals that the \a strength of the signal received by a radio tuner has changed. */ /*! \fn void QRadioTuner::stationFound(int frequency, QString stationId) Signals that a station was found in \a frequency with \a stationId Program Identification code. */ /*! \fn void QRadioTuner::error(QRadioTuner::Error error) Signals that an \a error occurred. */ /*! \enum QRadioTuner::State Enumerates radio tuner states. \value ActiveState The tuner is started and active. \value StoppedState The tuner device is stopped. */ /*! \enum QRadioTuner::Band Enumerates radio frequency bands. \value AM 520 to 1610 kHz, 9 or 10kHz channel spacing, extended 1610 to 1710 kHz \value FM 87.5 to 108.0 MHz, except Japan 76-90 MHz \value SW 1.711 to 30.0 MHz, divided into 15 bands. 5kHz channel spacing \value LW 148.5 to 283.5 kHz, 9kHz channel spacing (Europe, Africa, Asia) \value FM2 range not defined, used when area supports more than one FM range. */ /*! \enum QRadioTuner::Error Enumerates radio tuner error conditions. \value NoError No errors have occurred. \value ResourceError There is no radio service available. \value OpenError Unable to open radio device. \value OutOfRangeError An attempt to set a frequency or band that is not supported by radio device. */ /*! \enum QRadioTuner::StereoMode Enumerates radio tuner policy for receiving stereo signals. \value ForceStereo Provide stereo mode, converting if required. \value ForceMono Provide mono mode, converting if required. \value Auto Uses the stereo mode matching the station. */ /*! \fn void QRadioTuner::stateChanged(QRadioTuner::State state) This signal is emitted when the state changes to \a state. */ #include "moc_qradiotuner.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/qradiotuner.h000066400000000000000000000126771225012771600313410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QRADIOTUNER_H #define QRADIOTUNER_H #include #include #include #include QT_BEGIN_NAMESPACE class QRadioData; class QRadioTunerPrivate; class Q_MULTIMEDIA_EXPORT QRadioTuner : public QMediaObject { Q_OBJECT Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(Band band READ band WRITE setBand NOTIFY bandChanged) Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged) Q_PROPERTY(bool stereo READ isStereo NOTIFY stereoStatusChanged) Q_PROPERTY(StereoMode stereoMode READ stereoMode WRITE setStereoMode) Q_PROPERTY(int signalStrength READ signalStrength NOTIFY signalStrengthChanged) Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool searching READ isSearching NOTIFY searchingChanged) Q_PROPERTY(bool antennaConnected READ isAntennaConnected NOTIFY antennaConnectedChanged) Q_PROPERTY(QRadioData *radioData READ radioData CONSTANT) Q_ENUMS(State) Q_ENUMS(Band) Q_ENUMS(Error) Q_ENUMS(StereoMode) Q_ENUMS(SearchMode) public: enum State { ActiveState, StoppedState }; enum Band { AM, FM, SW, LW, FM2 }; enum Error { NoError, ResourceError, OpenError, OutOfRangeError }; enum StereoMode { ForceStereo, ForceMono, Auto }; enum SearchMode { SearchFast, SearchGetStationId }; QRadioTuner(QObject *parent = 0); ~QRadioTuner(); QMultimedia::AvailabilityStatus availability() const; State state() const; Band band() const; bool isBandSupported(Band b) const; int frequency() const; int frequencyStep(Band band) const; QPair frequencyRange(Band band) const; bool isStereo() const; void setStereoMode(QRadioTuner::StereoMode mode); StereoMode stereoMode() const; int signalStrength() const; int volume() const; bool isMuted() const; bool isSearching() const; bool isAntennaConnected() const; Error error() const; QString errorString() const; QRadioData *radioData() const; public Q_SLOTS: void searchForward(); void searchBackward(); void searchAllStations(QRadioTuner::SearchMode searchMode = QRadioTuner::SearchFast); void cancelSearch(); void setBand(Band band); void setFrequency(int frequency); void setVolume(int volume); void setMuted(bool muted); void start(); void stop(); Q_SIGNALS: void stateChanged(QRadioTuner::State state); void bandChanged(QRadioTuner::Band band); void frequencyChanged(int frequency); void stereoStatusChanged(bool stereo); void searchingChanged(bool searching); void signalStrengthChanged(int signalStrength); void volumeChanged(int volume); void mutedChanged(bool muted); void stationFound(int frequency, QString stationId); void antennaConnectedChanged(bool connectionStatus); void error(QRadioTuner::Error error); private: Q_DISABLE_COPY(QRadioTuner) Q_DECLARE_PRIVATE(QRadioTuner) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QRadioTuner::State) Q_DECLARE_METATYPE(QRadioTuner::Band) Q_DECLARE_METATYPE(QRadioTuner::Error) Q_DECLARE_METATYPE(QRadioTuner::StereoMode) Q_DECLARE_METATYPE(QRadioTuner::SearchMode) Q_MEDIA_ENUM_DEBUG(QRadioTuner, State) Q_MEDIA_ENUM_DEBUG(QRadioTuner, Band) Q_MEDIA_ENUM_DEBUG(QRadioTuner, Error) Q_MEDIA_ENUM_DEBUG(QRadioTuner, StereoMode) Q_MEDIA_ENUM_DEBUG(QRadioTuner, SearchMode) #endif // QRADIOPLAYER_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/radio/radio.pri000066400000000000000000000002361225012771600304310ustar00rootroot00000000000000INCLUDEPATH += radio PUBLIC_HEADERS += \ radio/qradiodata.h \ radio/qradiotuner.h SOURCES += \ radio/qradiodata.cpp \ radio/qradiotuner.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/000077500000000000000000000000001225012771600274745ustar00rootroot00000000000000qaudiorecorder.cpp000066400000000000000000000153211225012771600331330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qaudiorecorder.h" #include "qaudioinputselectorcontrol.h" #include "qmediaobject_p.h" #include "qmediarecorder_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QAudioRecorder \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_recording \brief The QAudioRecorder class is used for the recording of audio. The QAudioRecorder class is a high level media recording class and contains the same functionality as \l QMediaRecorder. \snippet multimedia-snippets/media.cpp Audio recorder In addition QAudioRecorder provides functionality for selecting the audio input. \snippet multimedia-snippets/media.cpp Audio recorder inputs The \l {audiorecorder}{Audio Recorder} example shows how to use this class in more detail. \sa QMediaRecorder, QAudioInputSelectorControl */ class QAudioRecorderObject : public QMediaObject { public: QAudioRecorderObject(QObject *parent, QMediaService *service) :QMediaObject(parent, service) { } ~QAudioRecorderObject() { } }; class QAudioRecorderPrivate : public QMediaRecorderPrivate { Q_DECLARE_NON_CONST_PUBLIC(QAudioRecorder) public: void initControls() { Q_Q(QAudioRecorder); audioInputSelector = 0; QMediaService *service = mediaObject ? mediaObject->service() : 0; if (service != 0) audioInputSelector = qobject_cast(service->requestControl(QAudioInputSelectorControl_iid)); if (audioInputSelector) { q->connect(audioInputSelector, SIGNAL(activeInputChanged(QString)), SIGNAL(audioInputChanged(QString))); q->connect(audioInputSelector, SIGNAL(availableInputsChanged()), SIGNAL(availableAudioInputsChanged())); } } QAudioRecorderPrivate(): QMediaRecorderPrivate(), provider(0), audioInputSelector(0) {} QMediaServiceProvider *provider; QAudioInputSelectorControl *audioInputSelector; }; /*! Constructs an audio recorder. The \a parent is passed to QMediaObject. */ QAudioRecorder::QAudioRecorder(QObject *parent): QMediaRecorder(*new QAudioRecorderPrivate, 0, parent) { Q_D(QAudioRecorder); d->provider = QMediaServiceProvider::defaultServiceProvider(); QMediaService *service = d->provider->requestService(Q_MEDIASERVICE_AUDIOSOURCE); setMediaObject(new QAudioRecorderObject(this, service)); d->initControls(); } /*! Destroys an audio recorder object. */ QAudioRecorder::~QAudioRecorder() { Q_D(QAudioRecorder); QMediaService *service = d->mediaObject ? d->mediaObject->service() : 0; QMediaObject *mediaObject = d->mediaObject; setMediaObject(0); if (service && d->audioInputSelector) service->releaseControl(d->audioInputSelector); if (d->provider && service) d->provider->releaseService(service); delete mediaObject; } /*! Returns a list of available audio inputs */ QStringList QAudioRecorder::audioInputs() const { Q_D(const QAudioRecorder); if (d->audioInputSelector) return d->audioInputSelector->availableInputs(); else return QStringList(); } /*! Returns the readable translated description of the audio input device with \a name. */ QString QAudioRecorder::audioInputDescription(const QString& name) const { Q_D(const QAudioRecorder); if (d->audioInputSelector) return d->audioInputSelector->inputDescription(name); else return QString(); } /*! Returns the default audio input name. */ QString QAudioRecorder::defaultAudioInput() const { Q_D(const QAudioRecorder); if (d->audioInputSelector) return d->audioInputSelector->defaultInput(); else return QString(); } /*! \property QAudioRecorder::audioInput \brief the active audio input name. */ /*! Returns the active audio input name. */ QString QAudioRecorder::audioInput() const { Q_D(const QAudioRecorder); if (d->audioInputSelector) return d->audioInputSelector->activeInput(); else return QString(); } /*! Set the active audio input to \a name. */ void QAudioRecorder::setAudioInput(const QString& name) { Q_D(const QAudioRecorder); if (d->audioInputSelector) return d->audioInputSelector->setActiveInput(name); } /*! \fn QAudioRecorder::audioInputChanged(const QString& name) Signal emitted when active audio input changes to \a name. */ /*! \fn QAudioRecorder::availableAudioInputsChanged() Signal is emitted when the available audio inputs change. */ #include "moc_qaudiorecorder.cpp" QT_END_NAMESPACE qaudiorecorder.h000066400000000000000000000057501225012771600326050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QAUDIORECORDER_H #define QAUDIORECORDER_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QString; class QSize; class QAudioFormat; QT_END_NAMESPACE QT_BEGIN_NAMESPACE class QAudioRecorderPrivate; class Q_MULTIMEDIA_EXPORT QAudioRecorder : public QMediaRecorder { Q_OBJECT Q_PROPERTY(QString audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged) public: QAudioRecorder(QObject *parent = 0); ~QAudioRecorder(); QStringList audioInputs() const; QString defaultAudioInput() const; QString audioInputDescription(const QString& name) const; QString audioInput() const; public Q_SLOTS: void setAudioInput(const QString& name); Q_SIGNALS: void audioInputChanged(const QString& name); void availableAudioInputsChanged(); private: Q_DISABLE_COPY(QAudioRecorder) Q_DECLARE_PRIVATE(QAudioRecorder) }; QT_END_NAMESPACE #endif // QAUDIORECORDER_H qmediaencodersettings.cpp000066400000000000000000000557121225012771600345140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediaencodersettings.h" QT_BEGIN_NAMESPACE namespace { class QMediaEncoderSettingsPrivateRegisterMetaTypes { public: QMediaEncoderSettingsPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } class QAudioEncoderSettingsPrivate : public QSharedData { public: QAudioEncoderSettingsPrivate() : isNull(true), encodingMode(QMultimedia::ConstantQualityEncoding), bitrate(-1), sampleRate(-1), channels(-1), quality(QMultimedia::NormalQuality) { } QAudioEncoderSettingsPrivate(const QAudioEncoderSettingsPrivate &other): QSharedData(other), isNull(other.isNull), encodingMode(other.encodingMode), codec(other.codec), bitrate(other.bitrate), sampleRate(other.sampleRate), channels(other.channels), quality(other.quality), encodingOptions(other.encodingOptions) { } bool isNull; QMultimedia::EncodingMode encodingMode; QString codec; int bitrate; int sampleRate; int channels; QMultimedia::EncodingQuality quality; QVariantMap encodingOptions; private: QAudioEncoderSettingsPrivate& operator=(const QAudioEncoderSettingsPrivate &other); }; /*! \class QAudioEncoderSettings \brief The QAudioEncoderSettings class provides a set of audio encoder settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_recording A audio encoder settings object is used to specify the audio encoder settings used by QMediaRecorder. Audio encoder settings are selected by constructing a QAudioEncoderSettings object, setting the desired properties and then passing it to a QMediaRecorder instance using the QMediaRecorder::setEncodingSettings() function. \snippet multimedia-snippets/media.cpp Audio encoder settings \sa QMediaRecorder, QAudioEncoderSettingsControl */ /*! Construct a null audio encoder settings object. */ QAudioEncoderSettings::QAudioEncoderSettings() :d(new QAudioEncoderSettingsPrivate) { } /*! Constructs a copy of the audio encoder settings object \a other. */ QAudioEncoderSettings::QAudioEncoderSettings(const QAudioEncoderSettings& other) :d(other.d) { } /*! Destroys an audio encoder settings object. */ QAudioEncoderSettings::~QAudioEncoderSettings() { } /*! Assigns the value of \a other to an audio encoder settings object. */ QAudioEncoderSettings& QAudioEncoderSettings::operator=(const QAudioEncoderSettings &other) { d = other.d; return *this; } /*! Determines if \a other is of equal value to an audio encoder settings object. Returns true if the settings objects are of equal value, and false if they are not of equal value. */ bool QAudioEncoderSettings::operator==(const QAudioEncoderSettings &other) const { return (d == other.d) || (d->isNull == other.d->isNull && d->encodingMode == other.d->encodingMode && d->bitrate == other.d->bitrate && d->sampleRate == other.d->sampleRate && d->channels == other.d->channels && d->quality == other.d->quality && d->codec == other.d->codec && d->encodingOptions == other.d->encodingOptions); } /*! Determines if \a other is of equal value to an audio encoder settings object. Returns true if the settings objects are not of equal value, and true if they are of equal value. */ bool QAudioEncoderSettings::operator!=(const QAudioEncoderSettings &other) const { return !(*this == other); } /*! Identifies if an audio settings object is initialized. Returns true if the settings object is null, and false if it is not. */ bool QAudioEncoderSettings::isNull() const { return d->isNull; } /*! Returns the audio encoding mode. \sa QMultimedia::EncodingMode */ QMultimedia::EncodingMode QAudioEncoderSettings::encodingMode() const { return d->encodingMode; } /*! Sets the audio encoding \a mode setting. If QMultimedia::ConstantQualityEncoding is set, the quality encoding parameter is used and bit rate is ignored, otherwise the bitrate is used. The audio codec, channels count and sample rate settings are used in all the encoding modes. \sa encodingMode(), QMultimedia::EncodingMode */ void QAudioEncoderSettings::setEncodingMode(QMultimedia::EncodingMode mode) { d->encodingMode = mode; } /*! Returns the audio codec. */ QString QAudioEncoderSettings::codec() const { return d->codec; } /*! Sets the audio \a codec. */ void QAudioEncoderSettings::setCodec(const QString& codec) { d->isNull = false; d->codec = codec; } /*! Returns the bit rate of the compressed audio stream in bits per second. */ int QAudioEncoderSettings::bitRate() const { return d->bitrate; } /*! Returns the number of audio channels. */ int QAudioEncoderSettings::channelCount() const { return d->channels; } /*! Sets the number of audio \a channels. A value of -1 indicates the encoder should make an optimal choice based on what is available from the audio source and the limitations of the codec. */ void QAudioEncoderSettings::setChannelCount(int channels) { d->isNull = false; d->channels = channels; } /*! Sets the audio bit \a rate in bits per second. */ void QAudioEncoderSettings::setBitRate(int rate) { d->isNull = false; d->bitrate = rate; } /*! Returns the audio sample rate in Hz. */ int QAudioEncoderSettings::sampleRate() const { return d->sampleRate; } /*! Sets the audio sample \a rate in Hz. A value of -1 indicates the encoder should make an optimal choice based on what is avaialbe from the audio source and the limitations of the codec. */ void QAudioEncoderSettings::setSampleRate(int rate) { d->isNull = false; d->sampleRate = rate; } /*! Returns the audio encoding quality. */ QMultimedia::EncodingQuality QAudioEncoderSettings::quality() const { return d->quality; } /*! Set the audio encoding \a quality. Setting the audio quality parameter allows backend to choose the balanced set of encoding parameters to achieve the desired quality level. The \a quality settings parameter is only used in the \l {QMultimedia::ConstantQualityEncoding}{constant quality} \l{encodingMode()}{encoding mode}. */ void QAudioEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) { d->isNull = false; d->quality = quality; } /*! Returns the value of encoding \a option. \sa setEncodingOption(), encodingOptions() */ QVariant QAudioEncoderSettings::encodingOption(const QString &option) const { return d->encodingOptions.value(option); } /*! Returns the all the encoding options as QVariantMap. \sa encodingOption(), setEncodingOptions() */ QVariantMap QAudioEncoderSettings::encodingOptions() const { return d->encodingOptions; } /*! Set the encoding \a option to \a value. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOptions() */ void QAudioEncoderSettings::setEncodingOption(const QString &option, const QVariant &value) { d->isNull = false; if (value.isNull()) d->encodingOptions.remove(option); else d->encodingOptions.insert(option, value); } /*! Replace all the encoding options with \a options. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOption() */ void QAudioEncoderSettings::setEncodingOptions(const QVariantMap &options) { d->isNull = false; d->encodingOptions = options; } class QVideoEncoderSettingsPrivate : public QSharedData { public: QVideoEncoderSettingsPrivate() : isNull(true), encodingMode(QMultimedia::ConstantQualityEncoding), bitrate(-1), frameRate(0), quality(QMultimedia::NormalQuality) { } QVideoEncoderSettingsPrivate(const QVideoEncoderSettingsPrivate &other): QSharedData(other), isNull(other.isNull), encodingMode(other.encodingMode), codec(other.codec), bitrate(other.bitrate), resolution(other.resolution), frameRate(other.frameRate), quality(other.quality), encodingOptions(other.encodingOptions) { } bool isNull; QMultimedia::EncodingMode encodingMode; QString codec; int bitrate; QSize resolution; qreal frameRate; QMultimedia::EncodingQuality quality; QVariantMap encodingOptions; private: QVideoEncoderSettingsPrivate& operator=(const QVideoEncoderSettingsPrivate &other); }; /*! \class QVideoEncoderSettings \brief The QVideoEncoderSettings class provides a set of video encoder settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_recording A video encoder settings object is used to specify the video encoder settings used by QMediaRecorder. Video encoder settings are selected by constructing a QVideoEncoderSettings object, setting the desired properties and then passing it to a QMediaRecorder instance using the QMediaRecorder::setEncodingSettings() function. \snippet multimedia-snippets/media.cpp Video encoder settings \sa QMediaRecorder, QVideoEncoderSettingsControl */ /*! Constructs a null video encoder settings object. */ QVideoEncoderSettings::QVideoEncoderSettings() :d(new QVideoEncoderSettingsPrivate) { } /*! Constructs a copy of the video encoder settings object \a other. */ QVideoEncoderSettings::QVideoEncoderSettings(const QVideoEncoderSettings& other) :d(other.d) { } /*! Destroys a video encoder settings object. */ QVideoEncoderSettings::~QVideoEncoderSettings() { } /*! Assigns the value of \a other to a video encoder settings object. */ QVideoEncoderSettings &QVideoEncoderSettings::operator=(const QVideoEncoderSettings &other) { d = other.d; return *this; } /*! Determines if \a other is of equal value to a video encoder settings object. Returns true if the settings objects are of equal value, and false if they are not of equal value. */ bool QVideoEncoderSettings::operator==(const QVideoEncoderSettings &other) const { return (d == other.d) || (d->isNull == other.d->isNull && d->encodingMode == other.d->encodingMode && d->bitrate == other.d->bitrate && d->quality == other.d->quality && d->codec == other.d->codec && d->resolution == other.d->resolution && qFuzzyCompare(d->frameRate, other.d->frameRate) && d->encodingOptions == other.d->encodingOptions); } /*! Determines if \a other is of equal value to a video encoder settings object. Returns true if the settings objects are not of equal value, and false if they are of equal value. */ bool QVideoEncoderSettings::operator!=(const QVideoEncoderSettings &other) const { return !(*this == other); } /*! Identifies if a video encoder settings object is uninitalized. Returns true if the settings are null, and false if they are not. */ bool QVideoEncoderSettings::isNull() const { return d->isNull; } /*! Returns the video encoding mode. \sa QMultimedia::EncodingMode */ QMultimedia::EncodingMode QVideoEncoderSettings::encodingMode() const { return d->encodingMode; } /*! Sets the video encoding \a mode. If QMultimedia::ConstantQualityEncoding is set, the quality encoding parameter is used and bit rate is ignored, otherwise the bitrate is used. The rest of encoding settings are respected regardless of encoding mode. \sa QMultimedia::EncodingMode */ void QVideoEncoderSettings::setEncodingMode(QMultimedia::EncodingMode mode) { d->isNull = false; d->encodingMode = mode; } /*! Returns the video codec. */ QString QVideoEncoderSettings::codec() const { return d->codec; } /*! Sets the video \a codec. */ void QVideoEncoderSettings::setCodec(const QString& codec) { d->isNull = false; d->codec = codec; } /*! Returns bit rate of the encoded video stream in bits per second. */ int QVideoEncoderSettings::bitRate() const { return d->bitrate; } /*! Sets the bit rate of the encoded video stream to \a value. */ void QVideoEncoderSettings::setBitRate(int value) { d->isNull = false; d->bitrate = value; } /*! Returns the video frame rate. */ qreal QVideoEncoderSettings::frameRate() const { return d->frameRate; } /*! \fn QVideoEncoderSettings::setFrameRate(qreal rate) Sets the video frame \a rate. A value of 0 indicates the encoder should make an optimal choice based on what is available from the video source and the limitations of the codec. */ void QVideoEncoderSettings::setFrameRate(qreal rate) { d->isNull = false; d->frameRate = rate; } /*! Returns the resolution of the encoded video. */ QSize QVideoEncoderSettings::resolution() const { return d->resolution; } /*! Sets the \a resolution of the encoded video. An empty QSize indicates the encoder should make an optimal choice based on what is available from the video source and the limitations of the codec. */ void QVideoEncoderSettings::setResolution(const QSize &resolution) { d->isNull = false; d->resolution = resolution; } /*! Sets the \a width and \a height of the resolution of the encoded video. \overload */ void QVideoEncoderSettings::setResolution(int width, int height) { d->isNull = false; d->resolution = QSize(width, height); } /*! Returns the video encoding quality. */ QMultimedia::EncodingQuality QVideoEncoderSettings::quality() const { return d->quality; } /*! Sets the video encoding \a quality. Setting the video quality parameter allows backend to choose the balanced set of encoding parameters to achieve the desired quality level. The \a quality settings parameter is only used in the \l {QMultimedia::ConstantQualityEncoding}{constant quality} \l{encodingMode()}{encoding mode}. The \a quality settings parameter is only used in the \l {QMultimedia::ConstantQualityEncoding}{constant quality} \l{encodingMode()}{encoding mode}. */ void QVideoEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) { d->isNull = false; d->quality = quality; } /*! Returns the value of encoding \a option. \sa setEncodingOption(), encodingOptions() */ QVariant QVideoEncoderSettings::encodingOption(const QString &option) const { return d->encodingOptions.value(option); } /*! Returns the all the encoding options as QVariantMap. \sa encodingOption(), setEncodingOptions() */ QVariantMap QVideoEncoderSettings::encodingOptions() const { return d->encodingOptions; } /*! Set the encoding \a option \a value. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOptions() */ void QVideoEncoderSettings::setEncodingOption(const QString &option, const QVariant &value) { d->isNull = false; if (value.isNull()) d->encodingOptions.remove(option); else d->encodingOptions.insert(option, value); } /*! Replace all the encoding options with \a options. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOption() */ void QVideoEncoderSettings::setEncodingOptions(const QVariantMap &options) { d->isNull = false; d->encodingOptions = options; } class QImageEncoderSettingsPrivate : public QSharedData { public: QImageEncoderSettingsPrivate() : isNull(true), quality(QMultimedia::NormalQuality) { } QImageEncoderSettingsPrivate(const QImageEncoderSettingsPrivate &other): QSharedData(other), isNull(other.isNull), codec(other.codec), resolution(other.resolution), quality(other.quality), encodingOptions(other.encodingOptions) { } bool isNull; QString codec; QSize resolution; QMultimedia::EncodingQuality quality; QVariantMap encodingOptions; private: QImageEncoderSettingsPrivate& operator=(const QImageEncoderSettingsPrivate &other); }; /*! \class QImageEncoderSettings \brief The QImageEncoderSettings class provides a set of image encoder settings. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera A image encoder settings object is used to specify the image encoder settings used by QCameraImageCapture. Image encoder settings are selected by constructing a QImageEncoderSettings object, setting the desired properties and then passing it to a QCameraImageCapture instance using the QCameraImageCapture::setImageSettings() function. \snippet multimedia-snippets/media.cpp Image encoder settings \sa QImageEncoderControl */ /*! Constructs a null image encoder settings object. */ QImageEncoderSettings::QImageEncoderSettings() :d(new QImageEncoderSettingsPrivate) { } /*! Constructs a copy of the image encoder settings object \a other. */ QImageEncoderSettings::QImageEncoderSettings(const QImageEncoderSettings& other) :d(other.d) { } /*! Destroys a image encoder settings object. */ QImageEncoderSettings::~QImageEncoderSettings() { } /*! Assigns the value of \a other to a image encoder settings object. */ QImageEncoderSettings &QImageEncoderSettings::operator=(const QImageEncoderSettings &other) { d = other.d; return *this; } /*! Determines if \a other is of equal value to a image encoder settings object. Returns true if the settings objects are of equal value, and false if they are not of equal value. */ bool QImageEncoderSettings::operator==(const QImageEncoderSettings &other) const { return (d == other.d) || (d->isNull == other.d->isNull && d->quality == other.d->quality && d->codec == other.d->codec && d->resolution == other.d->resolution && d->encodingOptions == other.d->encodingOptions); } /*! Determines if \a other is of equal value to a image encoder settings object. Returns true if the settings objects are not of equal value, and false if they are of equal value. */ bool QImageEncoderSettings::operator!=(const QImageEncoderSettings &other) const { return !(*this == other); } /*! Identifies if a image encoder settings object is uninitalized. Returns true if the settings are null, and false if they are not. */ bool QImageEncoderSettings::isNull() const { return d->isNull; } /*! Returns the image codec. */ QString QImageEncoderSettings::codec() const { return d->codec; } /*! Sets the image \a codec. */ void QImageEncoderSettings::setCodec(const QString& codec) { d->isNull = false; d->codec = codec; } /*! Returns the resolution of the encoded image. */ QSize QImageEncoderSettings::resolution() const { return d->resolution; } /*! Sets the \a resolution of the encoded image. An empty QSize indicates the encoder should make an optimal choice based on what is available from the image source and the limitations of the codec. */ void QImageEncoderSettings::setResolution(const QSize &resolution) { d->isNull = false; d->resolution = resolution; } /*! Sets the \a width and \a height of the resolution of the encoded image. \overload */ void QImageEncoderSettings::setResolution(int width, int height) { d->isNull = false; d->resolution = QSize(width, height); } /*! Returns the image encoding quality. */ QMultimedia::EncodingQuality QImageEncoderSettings::quality() const { return d->quality; } /*! Sets the image encoding \a quality. */ void QImageEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) { d->isNull = false; d->quality = quality; } /*! Returns the value of encoding \a option. \sa setEncodingOption(), encodingOptions() */ QVariant QImageEncoderSettings::encodingOption(const QString &option) const { return d->encodingOptions.value(option); } /*! Returns the all the encoding options as QVariantMap. \sa encodingOption(), setEncodingOptions() */ QVariantMap QImageEncoderSettings::encodingOptions() const { return d->encodingOptions; } /*! Set the encoding \a option \a value. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOptions() */ void QImageEncoderSettings::setEncodingOption(const QString &option, const QVariant &value) { d->isNull = false; if (value.isNull()) d->encodingOptions.remove(option); else d->encodingOptions.insert(option, value); } /*! Replace all the encoding options with \a options. The supported set and meaning of encoding options are system and selected codec specific. \sa encodingOption(), setEncodingOption() */ void QImageEncoderSettings::setEncodingOptions(const QVariantMap &options) { d->isNull = false; d->encodingOptions = options; } QT_END_NAMESPACE qmediaencodersettings.h000066400000000000000000000134331225012771600341530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIAENCODERSETTINGS_H #define QMEDIAENCODERSETTINGS_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QAudioEncoderSettingsPrivate; class Q_MULTIMEDIA_EXPORT QAudioEncoderSettings { public: QAudioEncoderSettings(); QAudioEncoderSettings(const QAudioEncoderSettings& other); ~QAudioEncoderSettings(); QAudioEncoderSettings& operator=(const QAudioEncoderSettings &other); bool operator==(const QAudioEncoderSettings &other) const; bool operator!=(const QAudioEncoderSettings &other) const; bool isNull() const; QMultimedia::EncodingMode encodingMode() const; void setEncodingMode(QMultimedia::EncodingMode); QString codec() const; void setCodec(const QString& codec); int bitRate() const; void setBitRate(int bitrate); int channelCount() const; void setChannelCount(int channels); int sampleRate() const; void setSampleRate(int rate); QMultimedia::EncodingQuality quality() const; void setQuality(QMultimedia::EncodingQuality quality); QVariant encodingOption(const QString &option) const; QVariantMap encodingOptions() const; void setEncodingOption(const QString &option, const QVariant &value); void setEncodingOptions(const QVariantMap &options); private: QSharedDataPointer d; }; class QVideoEncoderSettingsPrivate; class Q_MULTIMEDIA_EXPORT QVideoEncoderSettings { public: QVideoEncoderSettings(); QVideoEncoderSettings(const QVideoEncoderSettings& other); ~QVideoEncoderSettings(); QVideoEncoderSettings& operator=(const QVideoEncoderSettings &other); bool operator==(const QVideoEncoderSettings &other) const; bool operator!=(const QVideoEncoderSettings &other) const; bool isNull() const; QMultimedia::EncodingMode encodingMode() const; void setEncodingMode(QMultimedia::EncodingMode); QString codec() const; void setCodec(const QString &); QSize resolution() const; void setResolution(const QSize &); void setResolution(int width, int height); qreal frameRate() const; void setFrameRate(qreal rate); int bitRate() const; void setBitRate(int bitrate); QMultimedia::EncodingQuality quality() const; void setQuality(QMultimedia::EncodingQuality quality); QVariant encodingOption(const QString &option) const; QVariantMap encodingOptions() const; void setEncodingOption(const QString &option, const QVariant &value); void setEncodingOptions(const QVariantMap &options); private: QSharedDataPointer d; }; class QImageEncoderSettingsPrivate; class Q_MULTIMEDIA_EXPORT QImageEncoderSettings { public: QImageEncoderSettings(); QImageEncoderSettings(const QImageEncoderSettings& other); ~QImageEncoderSettings(); QImageEncoderSettings& operator=(const QImageEncoderSettings &other); bool operator==(const QImageEncoderSettings &other) const; bool operator!=(const QImageEncoderSettings &other) const; bool isNull() const; QString codec() const; void setCodec(const QString &); QSize resolution() const; void setResolution(const QSize &); void setResolution(int width, int height); QMultimedia::EncodingQuality quality() const; void setQuality(QMultimedia::EncodingQuality quality); QVariant encodingOption(const QString &option) const; QVariantMap encodingOptions() const; void setEncodingOption(const QString &option, const QVariant &value); void setEncodingOptions(const QVariantMap &options); private: QSharedDataPointer d; }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioEncoderSettings) Q_DECLARE_METATYPE(QVideoEncoderSettings) Q_DECLARE_METATYPE(QImageEncoderSettings) #endif qmediarecorder.cpp000066400000000000000000000756421225012771600331250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmediarecorder.h" #include "qmediarecorder_p.h" #include #include "qmediaobject_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QMediaRecorder \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_recording \brief The QMediaRecorder class is used for the recording of media content. The QMediaRecorder class is a high level media recording class. It's not intended to be used alone but for accessing the media recording functions of other media objects, like QRadioTuner, or QCamera. \snippet multimedia-snippets/media.cpp Media recorder \sa QAudioRecorder */ namespace { class MediaRecorderRegisterMetaTypes { public: MediaRecorderRegisterMetaTypes() { qRegisterMetaType("QMediaRecorder::State"); qRegisterMetaType("QMediaRecorder::Status"); qRegisterMetaType("QMediaRecorder::Error"); } } _registerRecorderMetaTypes; } QMediaRecorderPrivate::QMediaRecorderPrivate(): mediaObject(0), control(0), formatControl(0), audioControl(0), videoControl(0), metaDataControl(0), availabilityControl(0), settingsChanged(false), notifyTimer(0), state(QMediaRecorder::StoppedState), error(QMediaRecorder::NoError) { } #define ENUM_NAME(c,e,v) (c::staticMetaObject.enumerator(c::staticMetaObject.indexOfEnumerator(e)).valueToKey((v))) void QMediaRecorderPrivate::_q_stateChanged(QMediaRecorder::State ps) { Q_Q(QMediaRecorder); if (ps == QMediaRecorder::RecordingState) notifyTimer->start(); else notifyTimer->stop(); // qDebug() << "Recorder state changed:" << ENUM_NAME(QMediaRecorder,"State",ps); if (state != ps) { emit q->stateChanged(ps); } state = ps; } void QMediaRecorderPrivate::_q_error(int error, const QString &errorString) { Q_Q(QMediaRecorder); this->error = QMediaRecorder::Error(error); this->errorString = errorString; emit q->error(this->error); } void QMediaRecorderPrivate::_q_serviceDestroyed() { mediaObject = 0; control = 0; formatControl = 0; audioControl = 0; videoControl = 0; metaDataControl = 0; availabilityControl = 0; settingsChanged = true; } void QMediaRecorderPrivate::_q_updateActualLocation(const QUrl &location) { if (actualLocation != location) { actualLocation = location; emit q_func()->actualLocationChanged(actualLocation); } } void QMediaRecorderPrivate::_q_notify() { emit q_func()->durationChanged(q_func()->duration()); } void QMediaRecorderPrivate::_q_updateNotifyInterval(int ms) { notifyTimer->setInterval(ms); } void QMediaRecorderPrivate::applySettingsLater() { if (control && !settingsChanged) { settingsChanged = true; QMetaObject::invokeMethod(q_func(), "_q_applySettings", Qt::QueuedConnection); } } void QMediaRecorderPrivate::_q_applySettings() { if (control && settingsChanged) { settingsChanged = false; control->applySettings(); } } void QMediaRecorderPrivate::_q_availabilityChanged(QMultimedia::AvailabilityStatus availability) { Q_Q(QMediaRecorder); Q_UNUSED(error) Q_UNUSED(availability) // Really this should not always emit, but // we can't really tell from here (isAvailable // may not have changed, or the mediaobject's overridden // availability() may not have changed). q->availabilityChanged(q->availability()); q->availabilityChanged(q->isAvailable()); } void QMediaRecorderPrivate::restartCamera() { //restart camera if it can't apply new settings in the Active state QCamera *camera = qobject_cast(mediaObject); if (camera && camera->captureMode() == QCamera::CaptureVideo) { QMetaObject::invokeMethod(camera, "_q_preparePropertyChange", Qt::DirectConnection, Q_ARG(int, QCameraControl::VideoEncodingSettings)); } } /*! Constructs a media recorder which records the media produced by \a mediaObject. The \a parent is passed to QMediaObject. */ QMediaRecorder::QMediaRecorder(QMediaObject *mediaObject, QObject *parent): QObject(parent), d_ptr(new QMediaRecorderPrivate) { Q_D(QMediaRecorder); d->q_ptr = this; d->notifyTimer = new QTimer(this); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); setMediaObject(mediaObject); } /*! \internal */ QMediaRecorder::QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent): QObject(parent), d_ptr(&dd) { Q_D(QMediaRecorder); d->q_ptr = this; d->notifyTimer = new QTimer(this); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); setMediaObject(mediaObject); } /*! Destroys a media recorder object. */ QMediaRecorder::~QMediaRecorder() { delete d_ptr; } /*! Returns the QMediaObject instance that this QMediaRecorder is bound too, or 0 otherwise. */ QMediaObject *QMediaRecorder::mediaObject() const { return d_func()->mediaObject; } /*! \internal */ bool QMediaRecorder::setMediaObject(QMediaObject *object) { Q_D(QMediaRecorder); if (object == d->mediaObject) return true; if (d->mediaObject) { if (d->control) { disconnect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(_q_stateChanged(QMediaRecorder::State))); disconnect(d->control, SIGNAL(statusChanged(QMediaRecorder::Status)), this, SIGNAL(statusChanged(QMediaRecorder::Status))); disconnect(d->control, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); disconnect(d->control, SIGNAL(volumeChanged(qreal)), this, SIGNAL(volumeChanged(qreal))); disconnect(d->control, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); disconnect(d->control, SIGNAL(actualLocationChanged(QUrl)), this, SLOT(_q_updateActualLocation(QUrl))); disconnect(d->control, SIGNAL(error(int,QString)), this, SLOT(_q_error(int,QString))); } disconnect(d->mediaObject, SIGNAL(notifyIntervalChanged(int)), this, SLOT(_q_updateNotifyInterval(int))); QMediaService *service = d->mediaObject->service(); if (service) { disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); if (d->control) service->releaseControl(d->control); if (d->formatControl) service->releaseControl(d->formatControl); if (d->audioControl) service->releaseControl(d->audioControl); if (d->videoControl) service->releaseControl(d->videoControl); if (d->metaDataControl) { disconnect(d->metaDataControl, SIGNAL(metaDataChanged()), this, SIGNAL(metaDataChanged())); disconnect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)), this, SIGNAL(metaDataChanged(QString,QVariant))); disconnect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), this, SIGNAL(metaDataAvailableChanged(bool))); disconnect(d->metaDataControl, SIGNAL(writableChanged(bool)), this, SIGNAL(metaDataWritableChanged(bool))); service->releaseControl(d->metaDataControl); } if (d->availabilityControl) { disconnect(d->availabilityControl, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); service->releaseControl(d->availabilityControl); } } } d->control = 0; d->formatControl = 0; d->audioControl = 0; d->videoControl = 0; d->metaDataControl = 0; d->availabilityControl = 0; d->mediaObject = object; if (d->mediaObject) { QMediaService *service = d->mediaObject->service(); d->notifyTimer->setInterval(d->mediaObject->notifyInterval()); connect(d->mediaObject, SIGNAL(notifyIntervalChanged(int)), SLOT(_q_updateNotifyInterval(int))); if (service) { d->control = qobject_cast(service->requestControl(QMediaRecorderControl_iid)); if (d->control) { d->formatControl = qobject_cast(service->requestControl(QMediaContainerControl_iid)); d->audioControl = qobject_cast(service->requestControl(QAudioEncoderSettingsControl_iid)); d->videoControl = qobject_cast(service->requestControl(QVideoEncoderSettingsControl_iid)); QMediaControl *control = service->requestControl(QMetaDataWriterControl_iid); if (control) { d->metaDataControl = qobject_cast(control); if (!d->metaDataControl) { service->releaseControl(control); } else { connect(d->metaDataControl, SIGNAL(metaDataChanged()), SIGNAL(metaDataChanged())); connect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)), this, SIGNAL(metaDataChanged(QString,QVariant))); connect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), SIGNAL(metaDataAvailableChanged(bool))); connect(d->metaDataControl, SIGNAL(writableChanged(bool)), SIGNAL(metaDataWritableChanged(bool))); } } d->availabilityControl = service->requestControl(); if (d->availabilityControl) { connect(d->availabilityControl, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); } connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(_q_stateChanged(QMediaRecorder::State))); connect(d->control, SIGNAL(statusChanged(QMediaRecorder::Status)), this, SIGNAL(statusChanged(QMediaRecorder::Status))); connect(d->control, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); connect(d->control, SIGNAL(volumeChanged(qreal)), this, SIGNAL(volumeChanged(qreal))); connect(d->control, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); connect(d->control, SIGNAL(actualLocationChanged(QUrl)), this, SLOT(_q_updateActualLocation(QUrl))); connect(d->control, SIGNAL(error(int,QString)), this, SLOT(_q_error(int,QString))); connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); d->applySettingsLater(); return true; } } d->mediaObject = 0; return false; } return true; } /*! \property QMediaRecorder::outputLocation \brief the destination location of media content. Setting the location can fail, for example when the service supports only local file system locations but a network URL was passed. If the service does not support media recording this setting the output location will always fail. The \a location can be relative or empty; in this case the recorder uses the system specific place and file naming scheme. After recording has stated, QMediaRecorder::outputLocation() returns the actual output location. */ /*! \property QMediaRecorder::actualLocation \brief the actual location of the last media content. The actual location is usually available after recording starts, and reset when new location is set or new recording starts. */ /*! Returns true if media recorder service ready to use. \sa availabilityChanged() */ bool QMediaRecorder::isAvailable() const { return availability() == QMultimedia::Available; } /*! Returns the availability of this functionality. \sa availabilityChanged() */ QMultimedia::AvailabilityStatus QMediaRecorder::availability() const { if (d_func()->control == NULL) return QMultimedia::ServiceMissing; if (d_func()->availabilityControl) return d_func()->availabilityControl->availability(); return QMultimedia::Available; } QUrl QMediaRecorder::outputLocation() const { return d_func()->control ? d_func()->control->outputLocation() : QUrl(); } bool QMediaRecorder::setOutputLocation(const QUrl &location) { Q_D(QMediaRecorder); d->actualLocation.clear(); return d->control ? d->control->setOutputLocation(location) : false; } QUrl QMediaRecorder::actualLocation() const { return d_func()->actualLocation; } /*! Returns the current media recorder state. \sa QMediaRecorder::State */ QMediaRecorder::State QMediaRecorder::state() const { return d_func()->control ? QMediaRecorder::State(d_func()->control->state()) : StoppedState; } /*! Returns the current media recorder status. \sa QMediaRecorder::Status */ QMediaRecorder::Status QMediaRecorder::status() const { return d_func()->control ? QMediaRecorder::Status(d_func()->control->status()) : UnavailableStatus; } /*! Returns the current error state. \sa errorString() */ QMediaRecorder::Error QMediaRecorder::error() const { return d_func()->error; } /*! Returns a string describing the current error state. \sa error() */ QString QMediaRecorder::errorString() const { return d_func()->errorString; } /*! \property QMediaRecorder::duration \brief the recorded media duration in milliseconds. */ qint64 QMediaRecorder::duration() const { return d_func()->control ? d_func()->control->duration() : 0; } /*! \property QMediaRecorder::muted \brief whether a recording audio stream is muted. */ bool QMediaRecorder::isMuted() const { return d_func()->control ? d_func()->control->isMuted() : 0; } void QMediaRecorder::setMuted(bool muted) { Q_D(QMediaRecorder); if (d->control) d->control->setMuted(muted); } /*! \property QMediaRecorder::volume \brief the linear audio gain of media recorder. */ qreal QMediaRecorder::volume() const { return d_func()->control ? d_func()->control->volume() : 1.0; } void QMediaRecorder::setVolume(qreal volume) { Q_D(QMediaRecorder); if (d->control) d->control->setVolume(volume); } /*! Returns a list of supported container formats. */ QStringList QMediaRecorder::supportedContainers() const { return d_func()->formatControl ? d_func()->formatControl->supportedContainers() : QStringList(); } /*! Returns a description of a container \a format. */ QString QMediaRecorder::containerDescription(const QString &format) const { return d_func()->formatControl ? d_func()->formatControl->containerDescription(format) : QString(); } /*! Returns the selected container format. */ QString QMediaRecorder::containerFormat() const { return d_func()->formatControl ? d_func()->formatControl->containerFormat() : QString(); } /*! Returns a list of supported audio codecs. */ QStringList QMediaRecorder::supportedAudioCodecs() const { return d_func()->audioControl ? d_func()->audioControl->supportedAudioCodecs() : QStringList(); } /*! Returns a description of an audio \a codec. */ QString QMediaRecorder::audioCodecDescription(const QString &codec) const { return d_func()->audioControl ? d_func()->audioControl->codecDescription(codec) : QString(); } /*! Returns a list of supported audio sample rates. If non null audio \a settings parameter is passed, the returned list is reduced to sample rates supported with partial settings applied. This can be used to query the list of sample rates, supported by specific audio codec. If the encoder supports arbitrary sample rates within the supported rates range, *\a continuous is set to true, otherwise *\a continuous is set to false. */ QList QMediaRecorder::supportedAudioSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const { if (continuous) *continuous = false; return d_func()->audioControl ? d_func()->audioControl->supportedSampleRates(settings, continuous) : QList(); } /*! Returns a list of resolutions video can be encoded at. If non null video \a settings parameter is passed, the returned list is reduced to resolution supported with partial settings like video codec or framerate applied. If the encoder supports arbitrary resolutions within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. \sa QVideoEncoderSettings::resolution() */ QList QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous) const { if (continuous) *continuous = false; return d_func()->videoControl ? d_func()->videoControl->supportedResolutions(settings, continuous) : QList(); } /*! Returns a list of frame rates video can be encoded at. If non null video \a settings parameter is passed, the returned list is reduced to frame rates supported with partial settings like video codec or resolution applied. If the encoder supports arbitrary frame rates within the supported range, *\a continuous is set to true, otherwise *\a continuous is set to false. \sa QVideoEncoderSettings::frameRate() */ QList QMediaRecorder::supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const { if (continuous) *continuous = false; return d_func()->videoControl ? d_func()->videoControl->supportedFrameRates(settings, continuous) : QList(); } /*! Returns a list of supported video codecs. */ QStringList QMediaRecorder::supportedVideoCodecs() const { return d_func()->videoControl ? d_func()->videoControl->supportedVideoCodecs() : QStringList(); } /*! Returns a description of a video \a codec. \sa setEncodingSettings() */ QString QMediaRecorder::videoCodecDescription(const QString &codec) const { return d_func()->videoControl ? d_func()->videoControl->videoCodecDescription(codec) : QString(); } /*! Returns the audio encoder settings being used. \sa setEncodingSettings() */ QAudioEncoderSettings QMediaRecorder::audioSettings() const { return d_func()->audioControl ? d_func()->audioControl->audioSettings() : QAudioEncoderSettings(); } /*! Returns the video encoder settings being used. \sa setEncodingSettings() */ QVideoEncoderSettings QMediaRecorder::videoSettings() const { return d_func()->videoControl ? d_func()->videoControl->videoSettings() : QVideoEncoderSettings(); } /*! Sets the audio encoder \a settings. If some parameters are not specified, or null settings are passed, the encoder will choose default encoding parameters, depending on media source properties. It's only possible to change settings when the encoder is in the QMediaEncoder::StoppedState state. \sa audioSettings(), videoSettings(), containerFormat() */ void QMediaRecorder::setAudioSettings(const QAudioEncoderSettings &settings) { Q_D(QMediaRecorder); //restart camera if it can't apply new settings in the Active state d->restartCamera(); if (d->audioControl) { d->audioControl->setAudioSettings(settings); d->applySettingsLater(); } } /*! Sets the video encoder \a settings. If some parameters are not specified, or null settings are passed, the encoder will choose default encoding parameters, depending on media source properties. It's only possible to change settings when the encoder is in the QMediaEncoder::StoppedState state. \sa audioSettings(), videoSettings(), containerFormat() */ void QMediaRecorder::setVideoSettings(const QVideoEncoderSettings &settings) { Q_D(QMediaRecorder); d->restartCamera(); if (d->videoControl) { d->videoControl->setVideoSettings(settings); d->applySettingsLater(); } } /*! Sets the media \a container format. If the container format is not specified, the encoder will choose format, depending on media source properties and encoding settings selected. It's only possible to change settings when the encoder is in the QMediaEncoder::StoppedState state. \sa audioSettings(), videoSettings(), containerFormat() */ void QMediaRecorder::setContainerFormat(const QString &container) { Q_D(QMediaRecorder); d->restartCamera(); if (d->formatControl) { d->formatControl->setContainerFormat(container); d->applySettingsLater(); } } /*! Sets the \a audio and \a video encoder settings and \a container format. If some parameters are not specified, or null settings are passed, the encoder will choose default encoding parameters, depending on media source properties. It's only possible to change settings when the encoder is in the QMediaEncoder::StoppedState state. \sa audioSettings(), videoSettings(), containerFormat() */ void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio, const QVideoEncoderSettings &video, const QString &container) { Q_D(QMediaRecorder); d->restartCamera(); if (d->audioControl) d->audioControl->setAudioSettings(audio); if (d->videoControl) d->videoControl->setVideoSettings(video); if (d->formatControl) d->formatControl->setContainerFormat(container); d->applySettingsLater(); } /*! Start recording. While the recorder state is changed immediately to QMediaRecorder::RecordingState, recording may start asynchronously, with statusChanged(QMediaRecorder::RecordingStatus) signal emitted when recording starts. If recording fails error() signal is emitted with recorder state being reset back to QMediaRecorder::StoppedState. */ void QMediaRecorder::record() { Q_D(QMediaRecorder); d->actualLocation.clear(); if (d->settingsChanged) d->_q_applySettings(); // reset error d->error = NoError; d->errorString = QString(); if (d->control) d->control->setState(RecordingState); } /*! Pause recording. The recorder state is changed to QMediaRecorder::PausedState. Depending on platform recording pause may be not supported, in this case the recorder state stays unchanged. */ void QMediaRecorder::pause() { Q_D(QMediaRecorder); if (d->control) d->control->setState(PausedState); } /*! Stop recording. The recorder state is changed to QMediaRecorder::StoppedState. */ void QMediaRecorder::stop() { Q_D(QMediaRecorder); if (d->control) d->control->setState(StoppedState); } /*! \enum QMediaRecorder::State \value StoppedState The recorder is not active. \value RecordingState The recording is requested. \value PausedState The recorder is paused. */ /*! \enum QMediaRecorder::Status \value UnavailableStatus The recorder is not available or not supported by connected media object. \value UnloadedStatus The recorder is avilable but not loaded. \value LoadingStatus The recorder is initializing. \value LoadedStatus The recorder is initialized and ready to record media. \value StartingStatus Recording is requested but not active yet. \value RecordingStatus Recording is active. \value PausedStatus Recording is paused. \value FinalizingStatus Recording is stopped with media being finalized. */ /*! \enum QMediaRecorder::Error \value NoError No Errors. \value ResourceError Device is not ready or not available. \value FormatError Current format is not supported. \value OutOfSpaceError No space left on device. */ /*! \property QMediaRecorder::state \brief The current state of the media recorder. The state property represents the user request and is changed synchronously during record(), pause() or stop() calls. Recorder state may also change asynchronously when recording fails. */ /*! \property QMediaRecorder::status \brief The current status of the media recorder. The status is changed asynchronously and represents the actual status of media recorder. */ /*! \fn QMediaRecorder::stateChanged(State state) Signals that a media recorder's \a state has changed. */ /*! \fn QMediaRecorder::durationChanged(qint64 duration) Signals that the \a duration of the recorded media has changed. */ /*! \fn QMediaRecorder::actualLocationChanged(const QUrl &location) Signals that the actual \a location of the recorded media has changed. This signal is usually emitted when recording starts. */ /*! \fn QMediaRecorder::error(QMediaRecorder::Error error) Signals that an \a error has occurred. */ /*! \fn QMediaRecorder::availabilityChanged(bool available) Signals that the media recorder is now available (if \a available is true), or not. */ /*! \fn QMediaRecorder::availabilityChanged(QMultimedia::AvailabilityStatus availability) Signals that the service availability has changed to \a availability. */ /*! \fn QMediaRecorder::mutedChanged(bool muted) Signals that the \a muted state has changed. If true the recording is being muted. */ /*! \property QMediaRecorder::metaDataAvailable \brief whether access to a media object's meta-data is available. If this is true there is meta-data available, otherwise there is no meta-data available. */ bool QMediaRecorder::isMetaDataAvailable() const { Q_D(const QMediaRecorder); return d->metaDataControl ? d->metaDataControl->isMetaDataAvailable() : false; } /*! \fn QMediaRecorder::metaDataAvailableChanged(bool available) Signals that the \a available state of a media object's meta-data has changed. */ /*! \property QMediaRecorder::metaDataWritable \brief whether a media object's meta-data is writable. If this is true the meta-data is writable, otherwise the meta-data is read-only. */ bool QMediaRecorder::isMetaDataWritable() const { Q_D(const QMediaRecorder); return d->metaDataControl ? d->metaDataControl->isWritable() : false; } /*! \fn QMediaRecorder::metaDataWritableChanged(bool writable) Signals that the \a writable state of a media object's meta-data has changed. */ /*! Returns the value associated with a meta-data \a key. */ QVariant QMediaRecorder::metaData(const QString &key) const { Q_D(const QMediaRecorder); return d->metaDataControl ? d->metaDataControl->metaData(key) : QVariant(); } /*! Sets a \a value for a meta-data \a key. \note To ensure that meta data is set corretly, it should be set before starting the recording. Once the recording is stopped, any meta data set will be attached to the next recording. */ void QMediaRecorder::setMetaData(const QString &key, const QVariant &value) { Q_D(QMediaRecorder); if (d->metaDataControl) d->metaDataControl->setMetaData(key, value); } /*! Returns a list of keys there is meta-data available for. */ QStringList QMediaRecorder::availableMetaData() const { Q_D(const QMediaRecorder); return d->metaDataControl ? d->metaDataControl->availableMetaData() : QStringList(); } /*! \fn QMediaRecorder::metaDataChanged() Signals that a media object's meta-data has changed. If multiple meta-data elements are changed, metaDataChanged(const QString &key, const QVariant &value) signal is emitted for each of them with metaDataChanged() changed emitted once. */ /*! \fn QMediaRecorder::metaDataChanged(const QString &key, const QVariant &value) Signal the changes of one meta-data element \a value with the given \a key. */ #include "moc_qmediarecorder.cpp" QT_END_NAMESPACE qmediarecorder.h000066400000000000000000000173761225012771600325720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARECORDER_H #define QMEDIARECORDER_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QUrl; class QSize; class QAudioFormat; QT_END_NAMESPACE QT_BEGIN_NAMESPACE class QMediaRecorderService; class QAudioEncoderSettings; class QVideoEncoderSettings; class QMediaRecorderPrivate; class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) Q_ENUMS(State) Q_ENUMS(Status) Q_ENUMS(Error) Q_PROPERTY(QMediaRecorder::State state READ state NOTIFY stateChanged) Q_PROPERTY(QMediaRecorder::Status status READ status NOTIFY statusChanged) Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(QUrl outputLocation READ outputLocation WRITE setOutputLocation) Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(bool metaDataAvailable READ isMetaDataAvailable NOTIFY metaDataAvailableChanged) Q_PROPERTY(bool metaDataWritable READ isMetaDataWritable NOTIFY metaDataWritableChanged) public: enum State { StoppedState, RecordingState, PausedState }; enum Status { UnavailableStatus, UnloadedStatus, LoadingStatus, LoadedStatus, StartingStatus, RecordingStatus, PausedStatus, FinalizingStatus }; enum Error { NoError, ResourceError, FormatError, OutOfSpaceError }; QMediaRecorder(QMediaObject *mediaObject, QObject *parent = 0); ~QMediaRecorder(); QMediaObject *mediaObject() const; bool isAvailable() const; QMultimedia::AvailabilityStatus availability() const; QUrl outputLocation() const; bool setOutputLocation(const QUrl &location); QUrl actualLocation() const; State state() const; Status status() const; Error error() const; QString errorString() const; qint64 duration() const; bool isMuted() const; qreal volume() const; QStringList supportedContainers() const; QString containerDescription(const QString &format) const; QStringList supportedAudioCodecs() const; QString audioCodecDescription(const QString &codecName) const; QList supportedAudioSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), bool *continuous = 0) const; QStringList supportedVideoCodecs() const; QString videoCodecDescription(const QString &codecName) const; QList supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), bool *continuous = 0) const; QList supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), bool *continuous = 0) const; QAudioEncoderSettings audioSettings() const; QVideoEncoderSettings videoSettings() const; QString containerFormat() const; void setAudioSettings(const QAudioEncoderSettings &audioSettings); void setVideoSettings(const QVideoEncoderSettings &videoSettings); void setContainerFormat(const QString &container); void setEncodingSettings(const QAudioEncoderSettings &audioSettings, const QVideoEncoderSettings &videoSettings = QVideoEncoderSettings(), const QString &containerMimeType = QString()); bool isMetaDataAvailable() const; bool isMetaDataWritable() const; QVariant metaData(const QString &key) const; void setMetaData(const QString &key, const QVariant &value); QStringList availableMetaData() const; public Q_SLOTS: void record(); void pause(); void stop(); void setMuted(bool muted); void setVolume(qreal volume); Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void statusChanged(QMediaRecorder::Status status); void durationChanged(qint64 duration); void mutedChanged(bool muted); void volumeChanged(qreal volume); void actualLocationChanged(const QUrl &location); void error(QMediaRecorder::Error error); void metaDataAvailableChanged(bool available); void metaDataWritableChanged(bool writable); void metaDataChanged(); void metaDataChanged(const QString &key, const QVariant &value); void availabilityChanged(bool available); void availabilityChanged(QMultimedia::AvailabilityStatus availability); protected: QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent = 0); bool setMediaObject(QMediaObject *object); QMediaRecorderPrivate *d_ptr; private: Q_DISABLE_COPY(QMediaRecorder) Q_DECLARE_PRIVATE(QMediaRecorder) Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QMediaRecorder::State)) Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_notify()) Q_PRIVATE_SLOT(d_func(), void _q_updateActualLocation(const QUrl &)) Q_PRIVATE_SLOT(d_func(), void _q_updateNotifyInterval(int)) Q_PRIVATE_SLOT(d_func(), void _q_applySettings()) Q_PRIVATE_SLOT(d_func(), void _q_availabilityChanged(QMultimedia::AvailabilityStatus)) }; QT_END_NAMESPACE Q_DECLARE_METATYPE(QMediaRecorder::State) Q_DECLARE_METATYPE(QMediaRecorder::Status) Q_DECLARE_METATYPE(QMediaRecorder::Error) Q_MEDIA_ENUM_DEBUG(QMediaRecorder, State) Q_MEDIA_ENUM_DEBUG(QMediaRecorder, Status) Q_MEDIA_ENUM_DEBUG(QMediaRecorder, Error) #endif // QMEDIARECORDER_H qmediarecorder_p.h000066400000000000000000000065421225012771600331020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEDIARECORDER_P_H #define QMEDIARECORDER_P_H #include "qmediarecorder.h" #include "qmediaobject_p.h" #include QT_BEGIN_NAMESPACE class QMediaRecorderControl; class QMediaContainerControl; class QAudioEncoderSettingsControl; class QVideoEncoderSettingsControl; class QMetaDataWriterControl; class QMediaAvailabilityControl; class QTimer; class QMediaRecorderPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaRecorder) public: QMediaRecorderPrivate(); virtual ~QMediaRecorderPrivate() {} void applySettingsLater(); void restartCamera(); QMediaObject *mediaObject; QMediaRecorderControl *control; QMediaContainerControl *formatControl; QAudioEncoderSettingsControl *audioControl; QVideoEncoderSettingsControl *videoControl; QMetaDataWriterControl *metaDataControl; QMediaAvailabilityControl *availabilityControl; bool settingsChanged; QTimer* notifyTimer; QMediaRecorder::State state; QMediaRecorder::Error error; QString errorString; QUrl actualLocation; void _q_stateChanged(QMediaRecorder::State state); void _q_error(int error, const QString &errorString); void _q_serviceDestroyed(); void _q_updateActualLocation(const QUrl &); void _q_notify(); void _q_updateNotifyInterval(int ms); void _q_applySettings(); void _q_availabilityChanged(QMultimedia::AvailabilityStatus availability); QMediaRecorder *q_ptr; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/recording/recording.pri000066400000000000000000000005151225012771600321650ustar00rootroot00000000000000INCLUDEPATH += recording PUBLIC_HEADERS += \ recording/qaudiorecorder.h \ recording/qmediaencodersettings.h \ recording/qmediarecorder.h \ PRIVATE_HEADERS += \ recording/qmediarecorder_p.h \ SOURCES += \ recording/qaudiorecorder.cpp \ recording/qmediaencodersettings.cpp \ recording/qmediarecorder.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/000077500000000000000000000000001225012771600266265ustar00rootroot00000000000000qabstractvideobuffer.cpp000066400000000000000000000216151225012771600334650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qabstractvideobuffer_p.h" #include #include QT_BEGIN_NAMESPACE namespace { class QAbstractVideoBufferPrivateRegisterMetaTypes { public: QAbstractVideoBufferPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } /*! \class QAbstractVideoBuffer \brief The QAbstractVideoBuffer class is an abstraction for video data. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_video The QVideoFrame class makes use of a QAbstractVideoBuffer internally to reference a buffer of video data. Quite often video data buffers may reside in video memory rather than system memory, and this class provides an abstraction of the location. In addition, creating a subclass of QAbstractVideoBuffer will allow you to construct video frames from preallocated or static buffers, in cases where the QVideoFrame constructors taking a QByteArray or a QImage do not suffice. This may be necessary when implementing a new hardware accelerated video system, for example. The contents of a buffer can be accessed by mapping the buffer to memory using the map() function, which returns a pointer to memory containing the contents of the the video buffer. The memory returned by map() is released by calling the unmap() function. The handle() of a buffer may also be used to manipulate its contents using type specific APIs. The type of a buffer's handle is given by the handleType() function. \sa QVideoFrame */ /*! \enum QAbstractVideoBuffer::HandleType Identifies the type of a video buffers handle. \value NoHandle The buffer has no handle, its data can only be accessed by mapping the buffer. \value GLTextureHandle The handle of the buffer is an OpenGL texture ID. \value XvShmImageHandle The handle contains pointer to shared memory XVideo image. \value CoreImageHandle The handle contains pointer to Mac OS X CIImage. \value QPixmapHandle The handle of the buffer is a QPixmap. \value UserHandle Start value for user defined handle types. \sa handleType() */ /*! \enum QAbstractVideoBuffer::MapMode Enumerates how a video buffer's data is mapped to system memory. \value NotMapped The video buffer is not mapped to memory. \value ReadOnly The mapped memory is populated with data from the video buffer when mapped, but the content of the mapped memory may be discarded when unmapped. \value WriteOnly The mapped memory is uninitialized when mapped, but the possibly modified content will be used to populate the video buffer when unmapped. \value ReadWrite The mapped memory is populated with data from the video buffer, and the video buffer is repopulated with the content of the mapped memory when it is unmapped. \sa mapMode(), map() */ /*! Constructs an abstract video buffer of the given \a type. */ QAbstractVideoBuffer::QAbstractVideoBuffer(HandleType type) : d_ptr(0) , m_type(type) { } /*! \internal */ QAbstractVideoBuffer::QAbstractVideoBuffer(QAbstractVideoBufferPrivate &dd, HandleType type) : d_ptr(&dd) , m_type(type) { } /*! Destroys an abstract video buffer. */ QAbstractVideoBuffer::~QAbstractVideoBuffer() { delete d_ptr; } /*! Releases the video buffer. QVideoFrame calls QAbstractVideoBuffer::release when the buffer is not used any more and can be destroyed or returned to the buffer pool. The default implementation deletes the buffer instance. */ void QAbstractVideoBuffer::release() { delete this; } /*! Returns the type of a video buffer's handle. \sa handle() */ QAbstractVideoBuffer::HandleType QAbstractVideoBuffer::handleType() const { return m_type; } /*! \fn QAbstractVideoBuffer::mapMode() const Returns the mode a video buffer is mapped in. \sa map() */ /*! \fn QAbstractVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) Maps the contents of a video buffer to memory. In some cases the video buffer might be stored in video memory or otherwise inaccessible memory, so it is necessary to map the buffer before accessing the pixel data. This may involve copying the contents around, so avoid mapping and unmapping unless required. The map \a mode indicates whether the contents of the mapped memory should be read from and/or written to the buffer. If the map mode includes the \c QAbstractVideoBuffer::ReadOnly flag the mapped memory will be populated with the content of the buffer when initially mapped. If the map mode includes the \c QAbstractVideoBuffer::WriteOnly flag the content of the possibly modified mapped memory will be written back to the buffer when unmapped. When access to the data is no longer needed be sure to call the unmap() function to release the mapped memory and possibly update the buffer contents. Returns a pointer to the mapped memory region, or a null pointer if the mapping failed. The size in bytes of the mapped memory region is returned in \a numBytes, and the line stride in \a bytesPerLine. \note Writing to memory that is mapped as read-only is undefined, and may result in changes to shared data or crashes. \sa unmap(), mapMode() */ /*! \fn QAbstractVideoBuffer::unmap() Releases the memory mapped by the map() function. If the \l {QAbstractVideoBuffer::MapMode}{MapMode} included the \c QAbstractVideoBuffer::WriteOnly flag this will write the current content of the mapped memory back to the video frame. \sa map() */ /*! Returns a type specific handle to the data buffer. The type of the handle is given by handleType() function. \sa handleType() */ QVariant QAbstractVideoBuffer::handle() const { return QVariant(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, QAbstractVideoBuffer::HandleType type) { switch (type) { case QAbstractVideoBuffer::NoHandle: return dbg.nospace() << "NoHandle"; case QAbstractVideoBuffer::GLTextureHandle: return dbg.nospace() << "GLTextureHandle"; case QAbstractVideoBuffer::XvShmImageHandle: return dbg.nospace() << "XvShmImageHandle"; case QAbstractVideoBuffer::CoreImageHandle: return dbg.nospace() << "CoreImageHandle"; case QAbstractVideoBuffer::QPixmapHandle: return dbg.nospace() << "QPixmapHandle"; default: return dbg.nospace() << QString(QLatin1String("UserHandle(%1)")).arg(int(type)).toLatin1().constData(); } } QDebug operator<<(QDebug dbg, QAbstractVideoBuffer::MapMode mode) { switch (mode) { case QAbstractVideoBuffer::ReadOnly: return dbg.nospace() << "ReadOnly"; case QAbstractVideoBuffer::ReadWrite: return dbg.nospace() << "ReadWrite"; case QAbstractVideoBuffer::WriteOnly: return dbg.nospace() << "WriteOnly"; default: return dbg.nospace() << "NotMapped"; } } #endif QT_END_NAMESPACE qabstractvideobuffer.h000066400000000000000000000067061225012771600331360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTVIDEOBUFFER_H #define QABSTRACTVIDEOBUFFER_H #include #include #include QT_BEGIN_NAMESPACE class QVariant; class QAbstractVideoBufferPrivate; class Q_MULTIMEDIA_EXPORT QAbstractVideoBuffer { public: enum HandleType { NoHandle, GLTextureHandle, XvShmImageHandle, CoreImageHandle, QPixmapHandle, UserHandle = 1000 }; enum MapMode { NotMapped = 0x00, ReadOnly = 0x01, WriteOnly = 0x02, ReadWrite = ReadOnly | WriteOnly }; QAbstractVideoBuffer(HandleType type); virtual ~QAbstractVideoBuffer(); virtual void release(); HandleType handleType() const; virtual MapMode mapMode() const = 0; virtual uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) = 0; virtual void unmap() = 0; virtual QVariant handle() const; protected: QAbstractVideoBuffer(QAbstractVideoBufferPrivate &dd, HandleType type); QAbstractVideoBufferPrivate *d_ptr; // For expansion, not used currently HandleType m_type; private: Q_DECLARE_PRIVATE(QAbstractVideoBuffer) Q_DISABLE_COPY(QAbstractVideoBuffer) }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAbstractVideoBuffer::HandleType); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAbstractVideoBuffer::MapMode); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QAbstractVideoBuffer::HandleType) Q_DECLARE_METATYPE(QAbstractVideoBuffer::MapMode) #endif qabstractvideobuffer_p.h000066400000000000000000000050131225012771600334430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTVIDEOBUFFER_P_H #define QABSTRACTVIDEOBUFFER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include "qabstractvideobuffer.h" #include #include QT_BEGIN_NAMESPACE class QAbstractVideoBufferPrivate { public: QAbstractVideoBufferPrivate() {} virtual ~QAbstractVideoBufferPrivate() {} }; QT_END_NAMESPACE #endif qabstractvideosurface.cpp000066400000000000000000000310711225012771600336410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include "qabstractvideosurface.h" #include "qvideosurfaceformat.h" #include #include QT_BEGIN_NAMESPACE namespace { class QAbstractVideoSurfacePrivateRegisterMetaTypes { public: QAbstractVideoSurfacePrivateRegisterMetaTypes() { qRegisterMetaType(); } } _registerMetaTypes; } class QAbstractVideoSurfacePrivate { public: QAbstractVideoSurfacePrivate() : error(QAbstractVideoSurface::NoError), active(false) { } public: QVideoSurfaceFormat surfaceFormat; QAbstractVideoSurface::Error error; QSize nativeResolution; bool active; }; /*! \class QAbstractVideoSurface \brief The QAbstractVideoSurface class is a base class for video presentation surfaces. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_video The QAbstractVideoSurface class defines the standard interface that video producers use to inter-operate with video presentation surfaces. You can subclass this interface to receive video frames from sources like \l {QMediaPlayer}{decoded media} or \l {QCamera}{cameras} to perform your own processing. A video surface presents a continuous stream of identically formatted QVideoFrame instances, where the format of each frame is compatible with a stream format supplied when starting a presentation. Each frame may have timestamp information that can be used by the surface to decide when to display that frame. A list of pixel formats a surface can present is given by the supportedPixelFormats() function, and the isFormatSupported() function will test if a video surface format is supported. If a format is not supported the nearestFormat() function may be able to suggest a similar format. For example, if a surface supports fixed set of resolutions it may suggest the smallest supported resolution that contains the proposed resolution. The start() function takes a supported format and enables a video surface. Once started a surface will begin displaying the frames it receives in the present() function. Surfaces may hold a reference to the buffer of a presented video frame until a new frame is presented or streaming is stopped. In addition, a video surface may hold a reference to a video frame until the \l {QVideoFrame::endTime()}{end timestamp} has passed. The stop() function will disable a surface and release any video buffers it holds references to. \section2 Implementing a subclass of QAbstractVideoSurface When implementing a subclass of this interface, there are only a handful of functions to implement, broken down into two classes: \list \li Format related \li Presentation related \endlist For format related functionality, you just have to describe the pixel formats that you support (and the nearestFormat() function). For presentation related functionality, you have to implement the present() function, and the start() and stop() functions. \note You must call the base class implementation of start() and stop() in your implementation. */ /*! \enum QAbstractVideoSurface::Error This enum describes the errors that may be returned by the error() function. \value NoError No error occurred. \value UnsupportedFormatError A video format was not supported. \value IncorrectFormatError A video frame was not compatible with the format of the surface. \value StoppedError The surface has not been started. \value ResourceError The surface could not allocate some resource. */ /*! Constructs a video surface with the given \a parent. */ QAbstractVideoSurface::QAbstractVideoSurface(QObject *parent) : QObject(parent), d_ptr(new QAbstractVideoSurfacePrivate) { } /*! Destroys a video surface. */ QAbstractVideoSurface::~QAbstractVideoSurface() { } /*! \fn QAbstractVideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const Returns a list of pixel formats a video surface can present for a given handle \a type. The pixel formats returned for the QAbstractVideoBuffer::NoHandle type are valid for any buffer that can be mapped in read-only mode. Types that are first in the list can be assumed to be faster to render. */ /*! Tests a video surface \a format to determine if a surface can accept it. Returns true if the format is supported by the surface, and false otherwise. */ bool QAbstractVideoSurface::isFormatSupported(const QVideoSurfaceFormat &format) const { return supportedPixelFormats(format.handleType()).contains(format.pixelFormat()); } /*! Returns a supported video surface format that is similar to \a format. A similar surface format is one that has the same \l {QVideoSurfaceFormat::pixelFormat()}{pixel format} and \l {QVideoSurfaceFormat::handleType()}{handle type} but may differ in some of the other properties. For example, if there are restrictions on the \l {QVideoSurfaceFormat::frameSize()} {frame sizes} a video surface can accept it may suggest a format with a larger frame size and a \l {QVideoSurfaceFormat::viewport()}{viewport} the size of the original frame size. If the format is already supported it will be returned unchanged, or if there is no similar supported format an invalid format will be returned. */ QVideoSurfaceFormat QAbstractVideoSurface::nearestFormat(const QVideoSurfaceFormat &format) const { return isFormatSupported(format) ? format : QVideoSurfaceFormat(); } /*! \fn QAbstractVideoSurface::supportedFormatsChanged() Signals that the set of formats supported by a video surface has changed. \sa supportedPixelFormats(), isFormatSupported() */ /*! Returns the format of a video surface. */ QVideoSurfaceFormat QAbstractVideoSurface::surfaceFormat() const { Q_D(const QAbstractVideoSurface); return d->surfaceFormat; } /*! \fn QAbstractVideoSurface::surfaceFormatChanged(const QVideoSurfaceFormat &format) Signals that the configured \a format of a video surface has changed. \sa surfaceFormat(), start() */ /*! Starts a video surface presenting \a format frames. Returns true if the surface was started, and false if an error occurred. \note You must call the base class implementation of start() at the end of your implementation. \sa isActive(), stop() */ bool QAbstractVideoSurface::start(const QVideoSurfaceFormat &format) { Q_D(QAbstractVideoSurface); bool wasActive = d->active; d->active = true; d->surfaceFormat = format; d->error = NoError; emit surfaceFormatChanged(format); if (!wasActive) emit activeChanged(true); return true; } /*! Stops a video surface presenting frames and releases any resources acquired in start(). \note You must call the base class implementation of stop() at the start of your implementation. \sa isActive(), start() */ void QAbstractVideoSurface::stop() { Q_D(QAbstractVideoSurface); if (d->active) { d->surfaceFormat = QVideoSurfaceFormat(); d->active = false; emit activeChanged(false); emit surfaceFormatChanged(surfaceFormat()); } } /*! Indicates whether a video surface has been started. Returns true if the surface has been started, and false otherwise. */ bool QAbstractVideoSurface::isActive() const { Q_D(const QAbstractVideoSurface); return d->active; } /*! \fn QAbstractVideoSurface::activeChanged(bool active) Signals that the \a active state of a video surface has changed. \sa isActive(), start(), stop() */ /*! \fn QAbstractVideoSurface::present(const QVideoFrame &frame) Presents a video \a frame. Returns true if the frame was presented, and false if an error occurred. Not all surfaces will block until the presentation of a frame has completed. Calling present() on a non-blocking surface may fail if called before the presentation of a previous frame has completed. In such cases the surface may not return to a ready state until it has had an opportunity to process events. If present() fails for any other reason the surface should immediately enter the stopped state and an error() value will be set. A video surface must be in the started state for present() to succeed, and the format of the video frame must be compatible with the current video surface format. \sa error() */ /*! Returns the last error that occurred. If a surface fails to start(), or stops unexpectedly this function can be called to discover what error occurred. */ QAbstractVideoSurface::Error QAbstractVideoSurface::error() const { Q_D(const QAbstractVideoSurface); return d->error; } /*! Sets the value of error() to \a error. This can be called by implementors of this interface to communicate what the most recent error was. */ void QAbstractVideoSurface::setError(Error error) { Q_D(QAbstractVideoSurface); d->error = error; } /*! \property QAbstractVideoSurface::nativeResolution The native resolution of video surface. This is the resolution of video frames the surface can render with optimal quality and/or performance. The native resolution is not always known and can be changed during playback. */ QSize QAbstractVideoSurface::nativeResolution() const { Q_D(const QAbstractVideoSurface); return d->nativeResolution; } /*! Set the video surface native \a resolution. This function can be called by implementors of this interface to specify to frame producers what the native resolution of this surface is. */ void QAbstractVideoSurface::setNativeResolution(const QSize &resolution) { Q_D(QAbstractVideoSurface); if (d->nativeResolution != resolution) { d->nativeResolution = resolution; emit nativeResolutionChanged(resolution); } } /*! \fn QAbstractVideoSurface::nativeResolutionChanged(const QSize &resolution); Signals the native \a resolution of video surface has changed. */ #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, const QAbstractVideoSurface::Error& error) { switch (error) { case QAbstractVideoSurface::UnsupportedFormatError: return dbg.nospace() << "UnsupportedFormatError"; case QAbstractVideoSurface::IncorrectFormatError: return dbg.nospace() << "IncorrectFormatError"; case QAbstractVideoSurface::StoppedError: return dbg.nospace() << "StoppedError"; case QAbstractVideoSurface::ResourceError: return dbg.nospace() << "ResourceError"; default: return dbg.nospace() << "NoError"; } } #endif QT_END_NAMESPACE #include "moc_qabstractvideosurface.cpp" qabstractvideosurface.h000066400000000000000000000074311225012771600333110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QABSTRACTVIDEOSURFACE_H #define QABSTRACTVIDEOSURFACE_H #include #include QT_BEGIN_NAMESPACE class QRectF; class QVideoSurfaceFormat; class QAbstractVideoSurfacePrivate; class Q_MULTIMEDIA_EXPORT QAbstractVideoSurface : public QObject { Q_OBJECT Q_PROPERTY(QSize nativeResolution READ nativeResolution NOTIFY nativeResolutionChanged) public: enum Error { NoError, UnsupportedFormatError, IncorrectFormatError, StoppedError, ResourceError }; explicit QAbstractVideoSurface(QObject *parent = 0); ~QAbstractVideoSurface(); virtual QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const = 0; virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const; virtual QVideoSurfaceFormat nearestFormat(const QVideoSurfaceFormat &format) const; QVideoSurfaceFormat surfaceFormat() const; QSize nativeResolution() const; virtual bool start(const QVideoSurfaceFormat &format); virtual void stop(); bool isActive() const; virtual bool present(const QVideoFrame &frame) = 0; Error error() const; Q_SIGNALS: void activeChanged(bool active); void surfaceFormatChanged(const QVideoSurfaceFormat &format); void supportedFormatsChanged(); void nativeResolutionChanged(const QSize &); protected: void setError(Error error); void setNativeResolution(const QSize &resolution); private: Q_DECLARE_PRIVATE(QAbstractVideoSurface) QScopedPointer d_ptr; }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QAbstractVideoSurface::Error &); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QAbstractVideoSurface*) Q_DECLARE_METATYPE(QAbstractVideoSurface::Error) #endif qimagevideobuffer.cpp000066400000000000000000000063211225012771600327410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qimagevideobuffer_p.h" #include "qabstractvideobuffer_p.h" #include #include QT_BEGIN_NAMESPACE /*! * \class QImageVideoBuffer * \internal * * A video buffer class for a QImage. */ class QImageVideoBufferPrivate : public QAbstractVideoBufferPrivate { public: QImageVideoBufferPrivate() : mapMode(QAbstractVideoBuffer::NotMapped) { } QAbstractVideoBuffer::MapMode mapMode; QImage image; }; QImageVideoBuffer::QImageVideoBuffer(const QImage &image) : QAbstractVideoBuffer(*new QImageVideoBufferPrivate, NoHandle) { Q_D(QImageVideoBuffer); d->image = image; } QImageVideoBuffer::~QImageVideoBuffer() { } QAbstractVideoBuffer::MapMode QImageVideoBuffer::mapMode() const { return d_func()->mapMode; } uchar *QImageVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) { Q_D(QImageVideoBuffer); if (d->mapMode == NotMapped && d->image.bits() && mode != NotMapped) { d->mapMode = mode; if (numBytes) *numBytes = d->image.byteCount(); if (bytesPerLine) *bytesPerLine = d->image.bytesPerLine(); return d->image.bits(); } else { return 0; } } void QImageVideoBuffer::unmap() { Q_D(QImageVideoBuffer); d->mapMode = NotMapped; } QT_END_NAMESPACE qimagevideobuffer_p.h000066400000000000000000000052111225012771600327220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QIMAGEVIDEOBUFFER_P_H #define QIMAGEVIDEOBUFFER_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include QT_BEGIN_NAMESPACE class QImage; class QImageVideoBufferPrivate; class Q_MULTIMEDIA_EXPORT QImageVideoBuffer : public QAbstractVideoBuffer { Q_DECLARE_PRIVATE(QImageVideoBuffer) public: QImageVideoBuffer(const QImage &image); ~QImageVideoBuffer(); MapMode mapMode() const; uchar *map(MapMode mode, int *numBytes, int *bytesPerLine); void unmap(); }; QT_END_NAMESPACE #endif qmemoryvideobuffer.cpp000066400000000000000000000073701225012771600331740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qmemoryvideobuffer_p.h" #include "qabstractvideobuffer_p.h" #include QT_BEGIN_NAMESPACE class QMemoryVideoBufferPrivate : public QAbstractVideoBufferPrivate { public: QMemoryVideoBufferPrivate() : bytesPerLine(0) , mapMode(QAbstractVideoBuffer::NotMapped) { } int bytesPerLine; QAbstractVideoBuffer::MapMode mapMode; QByteArray data; }; /*! \class QMemoryVideoBuffer \brief The QMemoryVideoBuffer class provides a system memory allocated video data buffer. \internal QMemoryVideoBuffer is the default video buffer for allocating system memory. It may be used to allocate memory for a QVideoFrame without implementing your own QAbstractVideoBuffer. */ /*! Constructs a video buffer with an image stride of \a bytesPerLine from a byte \a array. */ QMemoryVideoBuffer::QMemoryVideoBuffer(const QByteArray &array, int bytesPerLine) : QAbstractVideoBuffer(*new QMemoryVideoBufferPrivate, NoHandle) { Q_D(QMemoryVideoBuffer); d->data = array; d->bytesPerLine = bytesPerLine; } /*! Destroys a system memory allocated video buffer. */ QMemoryVideoBuffer::~QMemoryVideoBuffer() { } /*! \reimp */ QAbstractVideoBuffer::MapMode QMemoryVideoBuffer::mapMode() const { return d_func()->mapMode; } /*! \reimp */ uchar *QMemoryVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) { Q_D(QMemoryVideoBuffer); if (d->mapMode == NotMapped && d->data.data() && mode != NotMapped) { d->mapMode = mode; if (numBytes) *numBytes = d->data.size(); if (bytesPerLine) *bytesPerLine = d->bytesPerLine; return reinterpret_cast(d->data.data()); } else { return 0; } } /*! \reimp */ void QMemoryVideoBuffer::unmap() { d_func()->mapMode = NotMapped; } QT_END_NAMESPACE qmemoryvideobuffer_p.h000066400000000000000000000052261225012771600331560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMEMORYVIDEOBUFFER_P_H #define QMEMORYVIDEOBUFFER_P_H #include // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // QT_BEGIN_NAMESPACE class QMemoryVideoBufferPrivate; class Q_MULTIMEDIA_EXPORT QMemoryVideoBuffer : public QAbstractVideoBuffer { Q_DECLARE_PRIVATE(QMemoryVideoBuffer) public: QMemoryVideoBuffer(const QByteArray &data, int bytesPerLine); ~QMemoryVideoBuffer(); MapMode mapMode() const; uchar *map(MapMode mode, int *numBytes, int *bytesPerLine); void unmap(); }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/qvideoframe.cpp000066400000000000000000001012741225012771600316410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideoframe.h" #include "qimagevideobuffer_p.h" #include "qmemoryvideobuffer_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace { class QVideoFramePrivateRegisterMetaTypes { public: QVideoFramePrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } class QVideoFramePrivate : public QSharedData { public: QVideoFramePrivate() : startTime(-1) , endTime(-1) , data(0) , mappedBytes(0) , bytesPerLine(0) , pixelFormat(QVideoFrame::Format_Invalid) , fieldType(QVideoFrame::ProgressiveFrame) , buffer(0) , mappedCount(0) { } QVideoFramePrivate(const QSize &size, QVideoFrame::PixelFormat format) : size(size) , startTime(-1) , endTime(-1) , data(0) , mappedBytes(0) , bytesPerLine(0) , pixelFormat(format) , fieldType(QVideoFrame::ProgressiveFrame) , buffer(0) , mappedCount(0) { } ~QVideoFramePrivate() { if (buffer) buffer->release(); } QSize size; qint64 startTime; qint64 endTime; uchar *data; int mappedBytes; int bytesPerLine; QVideoFrame::PixelFormat pixelFormat; QVideoFrame::FieldType fieldType; QAbstractVideoBuffer *buffer; int mappedCount; QMutex mapMutex; QVariantMap metadata; private: Q_DISABLE_COPY(QVideoFramePrivate) }; /*! \class QVideoFrame \brief The QVideoFrame class represents a frame of video data. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_video A QVideoFrame encapsulates the pixel data of a video frame, and information about the frame. Video frames can come from several places - decoded \l {QMediaPlayer}{media}, a \l {QCamera}{camera}, or generated programmatically. The way pixels are described in these frames can vary greatly, and some pixel formats offer greater compression opportunities at the expense of ease of use. The pixel contents of a video frame can be mapped to memory using the map() function. While mapped, the video data can accessed using the bits() function, which returns a pointer to a buffer. The total size of this buffer is given by the mappedBytes() function, and the size of each line is given by bytesPerLine(). The return value of the handle() function may also be used to access frame data using the internal buffer's native APIs (for example - an OpenGL texture handle). A video frame can also have timestamp information associated with it. These timestamps can be used by an implementation of \l QAbstractVideoSurface to determine when to start and stop displaying the frame, but not all surfaces might respect this setting. The video pixel data in a QVideoFrame is encapsulated in a QAbstractVideoBuffer. A QVideoFrame may be constructed from any buffer type by subclassing the QAbstractVideoBuffer class. \note Since video frames can be expensive to copy, QVideoFrame is explicitly shared, so any change made to a video frame will also apply to any copies. */ /*! \enum QVideoFrame::PixelFormat Enumerates video data types. \value Format_Invalid The frame is invalid. \value Format_ARGB32 The frame is stored using a 32-bit ARGB format (0xAARRGGBB). This is equivalent to QImage::Format_ARGB32. \value Format_ARGB32_Premultiplied The frame stored using a premultiplied 32-bit ARGB format (0xAARRGGBB). This is equivalent to QImage::Format_ARGB32_Premultiplied. \value Format_RGB32 The frame stored using a 32-bit RGB format (0xffRRGGBB). This is equivalent to QImage::Format_RGB32 \value Format_RGB24 The frame is stored using a 24-bit RGB format (8-8-8). This is equivalent to QImage::Format_RGB888 \value Format_RGB565 The frame is stored using a 16-bit RGB format (5-6-5). This is equivalent to QImage::Format_RGB16. \value Format_RGB555 The frame is stored using a 16-bit RGB format (5-5-5). This is equivalent to QImage::Format_RGB555. \value Format_ARGB8565_Premultiplied The frame is stored using a 24-bit premultiplied ARGB format (8-5-6-5). \value Format_BGRA32 The frame is stored using a 32-bit BGRA format (0xBBGGRRAA). \value Format_BGRA32_Premultiplied The frame is stored using a premultiplied 32bit BGRA format. \value Format_BGR32 The frame is stored using a 32-bit BGR format (0xBBGGRRff). \value Format_BGR24 The frame is stored using a 24-bit BGR format (0xBBGGRR). \value Format_BGR565 The frame is stored using a 16-bit BGR format (5-6-5). \value Format_BGR555 The frame is stored using a 16-bit BGR format (5-5-5). \value Format_BGRA5658_Premultiplied The frame is stored using a 24-bit premultiplied BGRA format (5-6-5-8). \value Format_AYUV444 The frame is stored using a packed 32-bit AYUV format (0xAAYYUUVV). \value Format_AYUV444_Premultiplied The frame is stored using a packed premultiplied 32-bit AYUV format (0xAAYYUUVV). \value Format_YUV444 The frame is stored using a 24-bit packed YUV format (8-8-8). \value Format_YUV420P The frame is stored using an 8-bit per component planar YUV format with the U and V planes horizontally and vertically sub-sampled, i.e. the height and width of the U and V planes are half that of the Y plane. \value Format_YV12 The frame is stored using an 8-bit per component planar YVU format with the V and U planes horizontally and vertically sub-sampled, i.e. the height and width of the V and U planes are half that of the Y plane. \value Format_UYVY The frame is stored using an 8-bit per component packed YUV format with the U and V planes horizontally sub-sampled (U-Y-V-Y), i.e. two horizontally adjacent pixels are stored as a 32-bit macropixel which has a Y value for each pixel and common U and V values. \value Format_YUYV The frame is stored using an 8-bit per component packed YUV format with the U and V planes horizontally sub-sampled (Y-U-Y-V), i.e. two horizontally adjacent pixels are stored as a 32-bit macropixel which has a Y value for each pixel and common U and V values. \value Format_NV12 The frame is stored using an 8-bit per component semi-planar YUV format with a Y plane (Y) followed by a horizontally and vertically sub-sampled, packed UV plane (U-V). \value Format_NV21 The frame is stored using an 8-bit per component semi-planar YUV format with a Y plane (Y) followed by a horizontally and vertically sub-sampled, packed VU plane (V-U). \value Format_IMC1 The frame is stored using an 8-bit per component planar YUV format with the U and V planes horizontally and vertically sub-sampled. This is similar to the Format_YUV420P type, except that the bytes per line of the U and V planes are padded out to the same stride as the Y plane. \value Format_IMC2 The frame is stored using an 8-bit per component planar YUV format with the U and V planes horizontally and vertically sub-sampled. This is similar to the Format_YUV420P type, except that the lines of the U and V planes are interleaved, i.e. each line of U data is followed by a line of V data creating a single line of the same stride as the Y data. \value Format_IMC3 The frame is stored using an 8-bit per component planar YVU format with the V and U planes horizontally and vertically sub-sampled. This is similar to the Format_YV12 type, except that the bytes per line of the V and U planes are padded out to the same stride as the Y plane. \value Format_IMC4 The frame is stored using an 8-bit per component planar YVU format with the V and U planes horizontally and vertically sub-sampled. This is similar to the Format_YV12 type, except that the lines of the V and U planes are interleaved, i.e. each line of V data is followed by a line of U data creating a single line of the same stride as the Y data. \value Format_Y8 The frame is stored using an 8-bit greyscale format. \value Format_Y16 The frame is stored using a 16-bit linear greyscale format. Little endian. \value Format_Jpeg The frame is stored in compressed Jpeg format. \value Format_CameraRaw The frame is stored using a device specific camera raw format. \value Format_AdobeDng The frame is stored using raw Adobe Digital Negative (DNG) format. \value Format_User Start value for user defined pixel formats. */ /*! \enum QVideoFrame::FieldType Specifies the field an interlaced video frame belongs to. \value ProgressiveFrame The frame is not interlaced. \value TopField The frame contains a top field. \value BottomField The frame contains a bottom field. \value InterlacedFrame The frame contains a merged top and bottom field. */ /*! Constructs a null video frame. */ QVideoFrame::QVideoFrame() : d(new QVideoFramePrivate) { } /*! Constructs a video frame from a \a buffer with the given pixel \a format and \a size in pixels. \note This doesn't increment the reference count of the video buffer. */ QVideoFrame::QVideoFrame( QAbstractVideoBuffer *buffer, const QSize &size, PixelFormat format) : d(new QVideoFramePrivate(size, format)) { d->buffer = buffer; } /*! Constructs a video frame of the given pixel \a format and \a size in pixels. The \a bytesPerLine (stride) is the length of each scan line in bytes, and \a bytes is the total number of bytes that must be allocated for the frame. */ QVideoFrame::QVideoFrame(int bytes, const QSize &size, int bytesPerLine, PixelFormat format) : d(new QVideoFramePrivate(size, format)) { if (bytes > 0) { QByteArray data; data.resize(bytes); // Check the memory was successfully allocated. if (!data.isEmpty()) d->buffer = new QMemoryVideoBuffer(data, bytesPerLine); } } /*! Constructs a video frame from an \a image. \note This will construct an invalid video frame if there is no frame type equivalent to the image format. \sa pixelFormatFromImageFormat() */ QVideoFrame::QVideoFrame(const QImage &image) : d(new QVideoFramePrivate( image.size(), pixelFormatFromImageFormat(image.format()))) { if (d->pixelFormat != Format_Invalid) d->buffer = new QImageVideoBuffer(image); } /*! Constructs a shallow copy of \a other. Since QVideoFrame is explicitly shared, these two instances will reflect the same frame. */ QVideoFrame::QVideoFrame(const QVideoFrame &other) : d(other.d) { } /*! Assigns the contents of \a other to this video frame. Since QVideoFrame is explicitly shared, these two instances will reflect the same frame. */ QVideoFrame &QVideoFrame::operator =(const QVideoFrame &other) { d = other.d; return *this; } /*! Destroys a video frame. */ QVideoFrame::~QVideoFrame() { } /*! Identifies whether a video frame is valid. An invalid frame has no video buffer associated with it. Returns true if the frame is valid, and false if it is not. */ bool QVideoFrame::isValid() const { return d->buffer != 0; } /*! Returns the color format of a video frame. */ QVideoFrame::PixelFormat QVideoFrame::pixelFormat() const { return d->pixelFormat; } /*! Returns the type of a video frame's handle. */ QAbstractVideoBuffer::HandleType QVideoFrame::handleType() const { return d->buffer ? d->buffer->handleType() : QAbstractVideoBuffer::NoHandle; } /*! Returns the dimensions of a video frame. */ QSize QVideoFrame::size() const { return d->size; } /*! Returns the width of a video frame. */ int QVideoFrame::width() const { return d->size.width(); } /*! Returns the height of a video frame. */ int QVideoFrame::height() const { return d->size.height(); } /*! Returns the field an interlaced video frame belongs to. If the video is not interlaced this will return WholeFrame. */ QVideoFrame::FieldType QVideoFrame::fieldType() const { return d->fieldType; } /*! Sets the \a field an interlaced video frame belongs to. */ void QVideoFrame::setFieldType(QVideoFrame::FieldType field) { d->fieldType = field; } /*! Identifies if a video frame's contents are currently mapped to system memory. This is a convenience function which checks that the \l {QAbstractVideoBuffer::MapMode}{MapMode} of the frame is not equal to QAbstractVideoBuffer::NotMapped. Returns true if the contents of the video frame are mapped to system memory, and false otherwise. \sa mapMode(), QAbstractVideoBuffer::MapMode */ bool QVideoFrame::isMapped() const { return d->buffer != 0 && d->buffer->mapMode() != QAbstractVideoBuffer::NotMapped; } /*! Identifies if the mapped contents of a video frame will be persisted when the frame is unmapped. This is a convenience function which checks if the \l {QAbstractVideoBuffer::MapMode}{MapMode} contains the QAbstractVideoBuffer::WriteOnly flag. Returns true if the video frame will be updated when unmapped, and false otherwise. \note The result of altering the data of a frame that is mapped in read-only mode is undefined. Depending on the buffer implementation the changes may be persisted, or worse alter a shared buffer. \sa mapMode(), QAbstractVideoBuffer::MapMode */ bool QVideoFrame::isWritable() const { return d->buffer != 0 && (d->buffer->mapMode() & QAbstractVideoBuffer::WriteOnly); } /*! Identifies if the mapped contents of a video frame were read from the frame when it was mapped. This is a convenience function which checks if the \l {QAbstractVideoBuffer::MapMode}{MapMode} contains the QAbstractVideoBuffer::WriteOnly flag. Returns true if the contents of the mapped memory were read from the video frame, and false otherwise. \sa mapMode(), QAbstractVideoBuffer::MapMode */ bool QVideoFrame::isReadable() const { return d->buffer != 0 && (d->buffer->mapMode() & QAbstractVideoBuffer::ReadOnly); } /*! Returns the mode a video frame was mapped to system memory in. \sa map(), QAbstractVideoBuffer::MapMode */ QAbstractVideoBuffer::MapMode QVideoFrame::mapMode() const { return d->buffer != 0 ? d->buffer->mapMode() : QAbstractVideoBuffer::NotMapped; } /*! Maps the contents of a video frame to system (CPU addressable) memory. In some cases the video frame data might be stored in video memory or otherwise inaccessible memory, so it is necessary to map a frame before accessing the pixel data. This may involve copying the contents around, so avoid mapping and unmapping unless required. The map \a mode indicates whether the contents of the mapped memory should be read from and/or written to the frame. If the map mode includes the \c QAbstractVideoBuffer::ReadOnly flag the mapped memory will be populated with the content of the video frame when initially mapped. If the map mode includes the \c QAbstractVideoBuffer::WriteOnly flag the content of the possibly modified mapped memory will be written back to the frame when unmapped. While mapped the contents of a video frame can be accessed directly through the pointer returned by the bits() function. When access to the data is no longer needed, be sure to call the unmap() function to release the mapped memory and possibly update the video frame contents. If the video frame has been mapped in read only mode, it is permissible to map it multiple times in read only mode (and unmap it a corresponding number of times). In all other cases it is necessary to unmap the frame first before mapping a second time. \note Writing to memory that is mapped as read-only is undefined, and may result in changes to shared data or crashes. Returns true if the frame was mapped to memory in the given \a mode and false otherwise. \sa unmap(), mapMode(), bits() */ bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode) { QMutexLocker lock(&d->mapMutex); if (!d->buffer) return false; if (mode == QAbstractVideoBuffer::NotMapped) return false; if (d->mappedCount > 0) { //it's allowed to map the video frame multiple times in read only mode if (d->buffer->mapMode() == QAbstractVideoBuffer::ReadOnly && mode == QAbstractVideoBuffer::ReadOnly) { d->mappedCount++; return true; } else { return false; } } Q_ASSERT(d->data == 0); Q_ASSERT(d->bytesPerLine == 0); Q_ASSERT(d->mappedBytes == 0); d->data = d->buffer->map(mode, &d->mappedBytes, &d->bytesPerLine); if (d->data) { d->mappedCount++; return true; } return false; } /*! Releases the memory mapped by the map() function. If the \l {QAbstractVideoBuffer::MapMode}{MapMode} included the QAbstractVideoBuffer::WriteOnly flag this will persist the current content of the mapped memory to the video frame. unmap() should not be called if map() function failed. \sa map() */ void QVideoFrame::unmap() { QMutexLocker lock(&d->mapMutex); if (!d->buffer) return; if (d->mappedCount == 0) { qWarning() << "QVideoFrame::unmap() was called more times then QVideoFrame::map()"; return; } d->mappedCount--; if (d->mappedCount == 0) { d->mappedBytes = 0; d->bytesPerLine = 0; d->data = 0; d->buffer->unmap(); } } /*! Returns the number of bytes in a scan line. \note For planar formats this is the bytes per line of the first plane only. The bytes per line of subsequent planes should be calculated as per the frame \l{QVideoFrame::PixelFormat}{pixel format}. This value is only valid while the frame data is \l {map()}{mapped}. \sa bits(), map(), mappedBytes() */ int QVideoFrame::bytesPerLine() const { return d->bytesPerLine; } /*! Returns a pointer to the start of the frame data buffer. This value is only valid while the frame data is \l {map()}{mapped}. Changes made to data accessed via this pointer (when mapped with write access) are only guaranteed to have been persisted when unmap() is called and when the buffer has been mapped for writing. \sa map(), mappedBytes(), bytesPerLine() */ uchar *QVideoFrame::bits() { return d->data; } /*! Returns a pointer to the start of the frame data buffer. This value is only valid while the frame data is \l {map()}{mapped}. If the buffer was not mapped with read access, the contents of this buffer will initially be uninitialized. \sa map(), mappedBytes(), bytesPerLine() */ const uchar *QVideoFrame::bits() const { return d->data; } /*! Returns the number of bytes occupied by the mapped frame data. This value is only valid while the frame data is \l {map()}{mapped}. \sa map() */ int QVideoFrame::mappedBytes() const { return d->mappedBytes; } /*! Returns a type specific handle to a video frame's buffer. For an OpenGL texture this would be the texture ID. \sa QAbstractVideoBuffer::handle() */ QVariant QVideoFrame::handle() const { return d->buffer != 0 ? d->buffer->handle() : QVariant(); } /*! Returns the presentation time (in microseconds) when the frame should be displayed. An invalid time is represented as -1. */ qint64 QVideoFrame::startTime() const { return d->startTime; } /*! Sets the presentation \a time (in microseconds) when the frame should initially be displayed. An invalid time is represented as -1. */ void QVideoFrame::setStartTime(qint64 time) { d->startTime = time; } /*! Returns the presentation time (in microseconds) when a frame should stop being displayed. An invalid time is represented as -1. */ qint64 QVideoFrame::endTime() const { return d->endTime; } /*! Sets the presentation \a time (in microseconds) when a frame should stop being displayed. An invalid time is represented as -1. */ void QVideoFrame::setEndTime(qint64 time) { d->endTime = time; } /*! Returns any extra metadata associated with this frame. */ QVariantMap QVideoFrame::availableMetaData() const { return d->metadata; } /*! Returns any metadata for this frame for the given \a key. This might include frame specific information from a camera, or subtitles from a decoded video stream. See the documentation for the relevant video frame producer for further information about available metadata. */ QVariant QVideoFrame::metaData(const QString &key) const { return d->metadata.value(key); } /*! Sets the metadata for the given \a key to \a value. If \a value is a null variant, any metadata for this key will be removed. The producer of the video frame might use this to associate certain data with this frame, or for an intermediate processor to add information for a consumer of this frame. */ void QVideoFrame::setMetaData(const QString &key, const QVariant &value) { if (!value.isNull()) d->metadata.insert(key, value); else d->metadata.remove(key); } /*! Returns a video pixel format equivalent to an image \a format. If there is no equivalent format QVideoFrame::InvalidType is returned instead. \note In general \l QImage does not handle YUV formats. */ QVideoFrame::PixelFormat QVideoFrame::pixelFormatFromImageFormat(QImage::Format format) { switch (format) { case QImage::Format_RGB32: return Format_RGB32; case QImage::Format_ARGB32: return Format_ARGB32; case QImage::Format_ARGB32_Premultiplied: return Format_ARGB32_Premultiplied; case QImage::Format_RGB16: return Format_RGB565; case QImage::Format_ARGB8565_Premultiplied: return Format_ARGB8565_Premultiplied; case QImage::Format_RGB555: return Format_RGB555; case QImage::Format_RGB888: return Format_RGB24; default: return Format_Invalid; } } /*! Returns an image format equivalent to a video frame pixel \a format. If there is no equivalent format QImage::Format_Invalid is returned instead. \note In general \l QImage does not handle YUV formats. */ QImage::Format QVideoFrame::imageFormatFromPixelFormat(PixelFormat format) { switch (format) { case Format_Invalid: return QImage::Format_Invalid; case Format_ARGB32: return QImage::Format_ARGB32; case Format_ARGB32_Premultiplied: return QImage::Format_ARGB32_Premultiplied; case Format_RGB32: return QImage::Format_RGB32; case Format_RGB24: return QImage::Format_RGB888; case Format_RGB565: return QImage::Format_RGB16; case Format_RGB555: return QImage::Format_RGB555; case Format_ARGB8565_Premultiplied: return QImage::Format_ARGB8565_Premultiplied; case Format_BGRA32: case Format_BGRA32_Premultiplied: case Format_BGR32: case Format_BGR24: return QImage::Format_Invalid; case Format_BGR565: case Format_BGR555: case Format_BGRA5658_Premultiplied: case Format_AYUV444: case Format_AYUV444_Premultiplied: case Format_YUV444: case Format_YUV420P: case Format_YV12: case Format_UYVY: case Format_YUYV: case Format_NV12: case Format_NV21: case Format_IMC1: case Format_IMC2: case Format_IMC3: case Format_IMC4: case Format_Y8: case Format_Y16: case Format_Jpeg: case Format_CameraRaw: case Format_AdobeDng: return QImage::Format_Invalid; case Format_User: return QImage::Format_Invalid; } return QImage::Format_Invalid; } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, QVideoFrame::PixelFormat pf) { switch (pf) { case QVideoFrame::Format_Invalid: return dbg.nospace() << "Format_Invalid"; case QVideoFrame::Format_ARGB32: return dbg.nospace() << "Format_ARGB32"; case QVideoFrame::Format_ARGB32_Premultiplied: return dbg.nospace() << "Format_ARGB32_Premultiplied"; case QVideoFrame::Format_RGB32: return dbg.nospace() << "Format_RGB32"; case QVideoFrame::Format_RGB24: return dbg.nospace() << "Format_RGB24"; case QVideoFrame::Format_RGB565: return dbg.nospace() << "Format_RGB565"; case QVideoFrame::Format_RGB555: return dbg.nospace() << "Format_RGB555"; case QVideoFrame::Format_ARGB8565_Premultiplied: return dbg.nospace() << "Format_ARGB8565_Premultiplied"; case QVideoFrame::Format_BGRA32: return dbg.nospace() << "Format_BGRA32"; case QVideoFrame::Format_BGRA32_Premultiplied: return dbg.nospace() << "Format_BGRA32_Premultiplied"; case QVideoFrame::Format_BGR32: return dbg.nospace() << "Format_BGR32"; case QVideoFrame::Format_BGR24: return dbg.nospace() << "Format_BGR24"; case QVideoFrame::Format_BGR565: return dbg.nospace() << "Format_BGR565"; case QVideoFrame::Format_BGR555: return dbg.nospace() << "Format_BGR555"; case QVideoFrame::Format_BGRA5658_Premultiplied: return dbg.nospace() << "Format_BGRA5658_Premultiplied"; case QVideoFrame::Format_AYUV444: return dbg.nospace() << "Format_AYUV444"; case QVideoFrame::Format_AYUV444_Premultiplied: return dbg.nospace() << "Format_AYUV444_Premultiplied"; case QVideoFrame::Format_YUV444: return dbg.nospace() << "Format_YUV444"; case QVideoFrame::Format_YUV420P: return dbg.nospace() << "Format_YUV420P"; case QVideoFrame::Format_YV12: return dbg.nospace() << "Format_YV12"; case QVideoFrame::Format_UYVY: return dbg.nospace() << "Format_UYVY"; case QVideoFrame::Format_YUYV: return dbg.nospace() << "Format_YUYV"; case QVideoFrame::Format_NV12: return dbg.nospace() << "Format_NV12"; case QVideoFrame::Format_NV21: return dbg.nospace() << "Format_NV21"; case QVideoFrame::Format_IMC1: return dbg.nospace() << "Format_IMC1"; case QVideoFrame::Format_IMC2: return dbg.nospace() << "Format_IMC2"; case QVideoFrame::Format_IMC3: return dbg.nospace() << "Format_IMC3"; case QVideoFrame::Format_IMC4: return dbg.nospace() << "Format_IMC4"; case QVideoFrame::Format_Y8: return dbg.nospace() << "Format_Y8"; case QVideoFrame::Format_Y16: return dbg.nospace() << "Format_Y16"; case QVideoFrame::Format_Jpeg: return dbg.nospace() << "Format_Jpeg"; case QVideoFrame::Format_AdobeDng: return dbg.nospace() << "Format_AdobeDng"; case QVideoFrame::Format_CameraRaw: return dbg.nospace() << "Format_CameraRaw"; default: return dbg.nospace() << QString(QLatin1String("UserType(%1)" )).arg(int(pf)).toLatin1().constData(); } } QDebug operator<<(QDebug dbg, QVideoFrame::FieldType f) { switch (f) { case QVideoFrame::TopField: return dbg.nospace() << "TopField"; case QVideoFrame::BottomField: return dbg.nospace() << "BottomField"; case QVideoFrame::InterlacedFrame: return dbg.nospace() << "InterlacedFrame"; default: return dbg.nospace() << "ProgressiveFrame"; } } static QString qFormatTimeStamps(qint64 start, qint64 end) { // Early out for invalid. if (start < 0) return QLatin1String("[no timestamp]"); bool onlyOne = (start == end); // [hh:]mm:ss.ms const int s_millis = start % 1000000; start /= 1000000; const int s_seconds = start % 60; start /= 60; const int s_minutes = start % 60; start /= 60; if (onlyOne) { if (start > 0) return QString::fromLatin1("@%1:%2:%3.%4") .arg(start, 1, 10, QLatin1Char('0')) .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')); else return QString::fromLatin1("@%1:%2.%3") .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')); } else if (end == -1) { // Similar to start-start, except it means keep displaying it? if (start > 0) return QString::fromLatin1("%1:%2:%3.%4 - forever") .arg(start, 1, 10, QLatin1Char('0')) .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')); else return QString::fromLatin1("%1:%2.%3 - forever") .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')); } else { const int e_millis = end % 1000000; end /= 1000000; const int e_seconds = end % 60; end /= 60; const int e_minutes = end % 60; end /= 60; if (start > 0 || end > 0) return QString::fromLatin1("%1:%2:%3.%4 - %5:%6:%7.%8") .arg(start, 1, 10, QLatin1Char('0')) .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')) .arg(end, 1, 10, QLatin1Char('0')) .arg(e_minutes, 2, 10, QLatin1Char('0')) .arg(e_seconds, 2, 10, QLatin1Char('0')) .arg(e_millis, 2, 10, QLatin1Char('0')); else return QString::fromLatin1("%1:%2.%3 - %4:%5.%6") .arg(s_minutes, 2, 10, QLatin1Char('0')) .arg(s_seconds, 2, 10, QLatin1Char('0')) .arg(s_millis, 2, 10, QLatin1Char('0')) .arg(e_minutes, 2, 10, QLatin1Char('0')) .arg(e_seconds, 2, 10, QLatin1Char('0')) .arg(e_millis, 2, 10, QLatin1Char('0')); } } QDebug operator<<(QDebug dbg, const QVideoFrame& f) { dbg.nospace() << "QVideoFrame(" << f.size() << "," << f.pixelFormat() << ", " << f.handleType() << ", " << f.mapMode() << ", " << qFormatTimeStamps(f.startTime(), f.endTime()).toLatin1().constData(); if (f.availableMetaData().count()) { dbg.nospace() << ", metaData: "; dbg.nospace() << f.availableMetaData(); } return dbg.nospace() << ")"; } #endif QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/qvideoframe.h000066400000000000000000000120041225012771600312760ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOFRAME_H #define QVIDEOFRAME_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QSize; class QVideoFramePrivate; class Q_MULTIMEDIA_EXPORT QVideoFrame { public: enum FieldType { ProgressiveFrame, TopField, BottomField, InterlacedFrame }; enum PixelFormat { Format_Invalid, Format_ARGB32, Format_ARGB32_Premultiplied, Format_RGB32, Format_RGB24, Format_RGB565, Format_RGB555, Format_ARGB8565_Premultiplied, Format_BGRA32, Format_BGRA32_Premultiplied, Format_BGR32, Format_BGR24, Format_BGR565, Format_BGR555, Format_BGRA5658_Premultiplied, Format_AYUV444, Format_AYUV444_Premultiplied, Format_YUV444, Format_YUV420P, Format_YV12, Format_UYVY, Format_YUYV, Format_NV12, Format_NV21, Format_IMC1, Format_IMC2, Format_IMC3, Format_IMC4, Format_Y8, Format_Y16, Format_Jpeg, Format_CameraRaw, Format_AdobeDng, Format_User = 1000 }; QVideoFrame(); QVideoFrame(QAbstractVideoBuffer *buffer, const QSize &size, PixelFormat format); QVideoFrame(int bytes, const QSize &size, int bytesPerLine, PixelFormat format); QVideoFrame(const QImage &image); QVideoFrame(const QVideoFrame &other); ~QVideoFrame(); QVideoFrame &operator =(const QVideoFrame &other); bool isValid() const; PixelFormat pixelFormat() const; QAbstractVideoBuffer::HandleType handleType() const; QSize size() const; int width() const; int height() const; FieldType fieldType() const; void setFieldType(FieldType); bool isMapped() const; bool isReadable() const; bool isWritable() const; QAbstractVideoBuffer::MapMode mapMode() const; bool map(QAbstractVideoBuffer::MapMode mode); void unmap(); int bytesPerLine() const; uchar *bits(); const uchar *bits() const; int mappedBytes() const; QVariant handle() const; qint64 startTime() const; void setStartTime(qint64 time); qint64 endTime() const; void setEndTime(qint64 time); QVariantMap availableMetaData() const; QVariant metaData(const QString &key) const; void setMetaData(const QString &key, const QVariant &value); static PixelFormat pixelFormatFromImageFormat(QImage::Format format); static QImage::Format imageFormatFromPixelFormat(PixelFormat format); private: QExplicitlySharedDataPointer d; }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QVideoFrame&); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QVideoFrame::FieldType); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QVideoFrame::PixelFormat); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QVideoFrame) Q_DECLARE_METATYPE(QVideoFrame::FieldType) Q_DECLARE_METATYPE(QVideoFrame::PixelFormat) #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/qvideoprobe.cpp000066400000000000000000000160721225012771600316570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \class QVideoProbe \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_video \brief The QVideoProbe class allows you to monitor video frames being played or recorded. \code QMediaPlayer *player = new QMediaPlayer(); QVideoProbe *probe = new QVideoProbe; connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(processFrame(QVideoFrame))); probe->setSource(player); // Returns true, hopefully. player->setVideoOutput(myVideoSurface); player->setMedia(QUrl::fromLocalFile("observation.mp4")); player->play(); // Start receving frames as they get presented to myVideoSurface \endcode This same approach works with the QCamera object as well, to receive viewfinder or video frames as they are captured. \sa QAudioProbe, QMediaPlayer, QCamera */ #include "qvideoprobe.h" #include "qmediavideoprobecontrol.h" #include "qmediaservice.h" #include "qmediarecorder.h" #include "qsharedpointer.h" #include "qpointer.h" QT_BEGIN_NAMESPACE class QVideoProbePrivate { public: QPointer source; QPointer probee; }; /*! Creates a new QVideoProbe class with \a parent. After setting the source to monitor with \l setSource(), the \l videoFrameProbed() signal will be emitted when video frames are flowing in the source media object. */ QVideoProbe::QVideoProbe(QObject *parent) : QObject(parent) , d(new QVideoProbePrivate) { } /*! Destroys this probe and disconnects from any media object. */ QVideoProbe::~QVideoProbe() { if (d->source) { // Disconnect if (d->probee) { disconnect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); } d->source.data()->service()->releaseControl(d->probee.data()); } } /*! Sets the media object to monitor to \a source. If \a source is zero, this probe will be deactivated and this function wil return true. If the media object does not support monitoring video, this function will return false. Any previously monitored objects will no longer be monitored. Passing in the same object will be ignored, but monitoring will continue. */ bool QVideoProbe::setSource(QMediaObject *source) { // Need to: // 1) disconnect from current source if necessary // 2) see if new one has the probe control // 3) connect if so // in case source was destroyed but probe control is still valid if (!d->source && d->probee) { disconnect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->probee.clear(); } if (source != d->source.data()) { if (d->source) { Q_ASSERT(d->probee); disconnect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame))); disconnect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->source.data()->service()->releaseControl(d->probee.data()); d->source.clear(); d->probee.clear(); } if (source) { QMediaService *service = source->service(); if (service) { d->probee = service->requestControl(); } if (d->probee) { connect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame))); connect(d->probee.data(), SIGNAL(flush()), this, SIGNAL(flush())); d->source = source; } } } return (!source || d->probee != 0); } /*! Starts monitoring the given \a mediaRecorder. If there is no mediaObject associated with \a mediaRecorder, or if it is zero, this probe will be deactivated and this function wil return true. If the media recorder instance does not support monitoring video, this function will return false. Any previously monitored objects will no longer be monitored. Passing in the same object will be ignored, but monitoring will continue. */ bool QVideoProbe::setSource(QMediaRecorder *mediaRecorder) { QMediaObject *source = mediaRecorder ? mediaRecorder->mediaObject() : 0; bool result = setSource(source); if (!mediaRecorder) return true; if (mediaRecorder && !source) return false; return result; } /*! Returns true if this probe is monitoring something, or false otherwise. The source being monitored does not need to be active. */ bool QVideoProbe::isActive() const { return d->probee != 0; } /*! \fn QVideoProbe::videoFrameProbed(const QVideoFrame &frame) This signal should be emitted when a video \a frame is processed in the media service. */ /*! \fn QVideoProbe::flush() This signal should be emitted when it is required to release all frames. Application must release all outstanding references to video frames. */ QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/qvideoprobe.h000066400000000000000000000050131225012771600313150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOPROBE_H #define QVIDEOPROBE_H #include #include QT_BEGIN_NAMESPACE class QMediaObject; class QMediaRecorder; class QVideoProbePrivate; class Q_MULTIMEDIA_EXPORT QVideoProbe : public QObject { Q_OBJECT public: explicit QVideoProbe(QObject *parent = 0); ~QVideoProbe(); bool setSource(QMediaObject *source); bool setSource(QMediaRecorder *source); bool isActive() const; Q_SIGNALS: void videoFrameProbed(const QVideoFrame &videoFrame); void flush(); private: QVideoProbePrivate *d; }; QT_END_NAMESPACE #endif // QVIDEOPROBE_H qvideosurfaceformat.cpp000066400000000000000000000463261225012771600333370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideosurfaceformat.h" #include #include #include #include #include QT_BEGIN_NAMESPACE namespace { class QVideoSurfaceFormatPrivateRegisterMetaTypes { public: QVideoSurfaceFormatPrivateRegisterMetaTypes() { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } } _registerMetaTypes; } class QVideoSurfaceFormatPrivate : public QSharedData { public: QVideoSurfaceFormatPrivate() : pixelFormat(QVideoFrame::Format_Invalid) , handleType(QAbstractVideoBuffer::NoHandle) , scanLineDirection(QVideoSurfaceFormat::TopToBottom) , pixelAspectRatio(1, 1) , ycbcrColorSpace(QVideoSurfaceFormat::YCbCr_Undefined) , frameRate(0.0) { } QVideoSurfaceFormatPrivate( const QSize &size, QVideoFrame::PixelFormat format, QAbstractVideoBuffer::HandleType type) : pixelFormat(format) , handleType(type) , scanLineDirection(QVideoSurfaceFormat::TopToBottom) , frameSize(size) , pixelAspectRatio(1, 1) , ycbcrColorSpace(QVideoSurfaceFormat::YCbCr_Undefined) , viewport(QPoint(0, 0), size) , frameRate(0.0) { } QVideoSurfaceFormatPrivate(const QVideoSurfaceFormatPrivate &other) : QSharedData(other) , pixelFormat(other.pixelFormat) , handleType(other.handleType) , scanLineDirection(other.scanLineDirection) , frameSize(other.frameSize) , pixelAspectRatio(other.pixelAspectRatio) , ycbcrColorSpace(other.ycbcrColorSpace) , viewport(other.viewport) , frameRate(other.frameRate) , propertyNames(other.propertyNames) , propertyValues(other.propertyValues) { } bool operator ==(const QVideoSurfaceFormatPrivate &other) const { if (pixelFormat == other.pixelFormat && handleType == other.handleType && scanLineDirection == other.scanLineDirection && frameSize == other.frameSize && pixelAspectRatio == other.pixelAspectRatio && viewport == other.viewport && frameRatesEqual(frameRate, other.frameRate) && ycbcrColorSpace == other.ycbcrColorSpace && propertyNames.count() == other.propertyNames.count()) { for (int i = 0; i < propertyNames.count(); ++i) { int j = other.propertyNames.indexOf(propertyNames.at(i)); if (j == -1 || propertyValues.at(i) != other.propertyValues.at(j)) return false; } return true; } else { return false; } } inline static bool frameRatesEqual(qreal r1, qreal r2) { return qAbs(r1 - r2) <= 0.00001 * qMin(qAbs(r1), qAbs(r2)); } QVideoFrame::PixelFormat pixelFormat; QAbstractVideoBuffer::HandleType handleType; QVideoSurfaceFormat::Direction scanLineDirection; QSize frameSize; QSize pixelAspectRatio; QVideoSurfaceFormat::YCbCrColorSpace ycbcrColorSpace; QRect viewport; qreal frameRate; QList propertyNames; QList propertyValues; }; /*! \class QVideoSurfaceFormat \brief The QVideoSurfaceFormat class specifies the stream format of a video presentation surface. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_video A video surface presents a stream of video frames. The surface's format describes the type of the frames and determines how they should be presented. The core properties of a video stream required to setup a video surface are the pixel format given by pixelFormat(), and the frame dimensions given by frameSize(). If the surface is to present frames using a frame's handle a surface format will also include a handle type which is given by the handleType() function. The region of a frame that is actually displayed on a video surface is given by the viewport(). A stream may have a viewport less than the entire region of a frame to allow for videos smaller than the nearest optimal size of a video frame. For example the width of a frame may be extended so that the start of each scan line is eight byte aligned. Other common properties are the pixelAspectRatio(), scanLineDirection(), and frameRate(). Additionally a stream may have some additional type specific properties which are listed by the dynamicPropertyNames() function and can be accessed using the property(), and setProperty() functions. */ /*! \enum QVideoSurfaceFormat::Direction Enumerates the layout direction of video scan lines. \value TopToBottom Scan lines are arranged from the top of the frame to the bottom. \value BottomToTop Scan lines are arranged from the bottom of the frame to the top. */ /*! \enum QVideoSurfaceFormat::YCbCrColorSpace Enumerates the Y'CbCr color space of video frames. \value YCbCr_Undefined No color space is specified. \value YCbCr_BT601 A Y'CbCr color space defined by ITU-R recommendation BT.601 with Y value range from 16 to 235, and Cb/Cr range from 16 to 240. Used in standard definition video. \value YCbCr_BT709 A Y'CbCr color space defined by ITU-R BT.709 with the same values range as YCbCr_BT601. Used for HDTV. \value YCbCr_xvYCC601 The BT.601 color space with the value range extended to 0 to 255. It is backward compatibile with BT.601 and uses values outside BT.601 range to represent a wider range of colors. \value YCbCr_xvYCC709 The BT.709 color space with the value range extended to 0 to 255. \value YCbCr_JPEG The full range Y'CbCr color space used in JPEG files. */ /*! Constructs a null video stream format. */ QVideoSurfaceFormat::QVideoSurfaceFormat() : d(new QVideoSurfaceFormatPrivate) { } /*! Contructs a description of stream which receives stream of \a type buffers with given frame \a size and pixel \a format. */ QVideoSurfaceFormat::QVideoSurfaceFormat( const QSize& size, QVideoFrame::PixelFormat format, QAbstractVideoBuffer::HandleType type) : d(new QVideoSurfaceFormatPrivate(size, format, type)) { } /*! Constructs a copy of \a other. */ QVideoSurfaceFormat::QVideoSurfaceFormat(const QVideoSurfaceFormat &other) : d(other.d) { } /*! Assigns the values of \a other to this object. */ QVideoSurfaceFormat &QVideoSurfaceFormat::operator =(const QVideoSurfaceFormat &other) { d = other.d; return *this; } /*! Destroys a video stream description. */ QVideoSurfaceFormat::~QVideoSurfaceFormat() { } /*! Identifies if a video surface format has a valid pixel format and frame size. Returns true if the format is valid, and false otherwise. */ bool QVideoSurfaceFormat::isValid() const { return d->pixelFormat != QVideoFrame::Format_Invalid && d->frameSize.isValid(); } /*! Returns true if \a other is the same as this video format, and false if they are different. */ bool QVideoSurfaceFormat::operator ==(const QVideoSurfaceFormat &other) const { return d == other.d || *d == *other.d; } /*! Returns true if \a other is different to this video format, and false if they are the same. */ bool QVideoSurfaceFormat::operator !=(const QVideoSurfaceFormat &other) const { return d != other.d && !(*d == *other.d); } /*! Returns the pixel format of frames in a video stream. */ QVideoFrame::PixelFormat QVideoSurfaceFormat::pixelFormat() const { return d->pixelFormat; } /*! Returns the type of handle the surface uses to present the frame data. If the handle type is \c QAbstractVideoBuffer::NoHandle, buffers with any handle type are valid provided they can be \l {QAbstractVideoBuffer::map()}{mapped} with the QAbstractVideoBuffer::ReadOnly flag. If the handleType() is not QAbstractVideoBuffer::NoHandle then the handle type of the buffer must be the same as that of the surface format. */ QAbstractVideoBuffer::HandleType QVideoSurfaceFormat::handleType() const { return d->handleType; } /*! Returns the dimensions of frames in a video stream. \sa frameWidth(), frameHeight() */ QSize QVideoSurfaceFormat::frameSize() const { return d->frameSize; } /*! Returns the width of frames in a video stream. \sa frameSize(), frameHeight() */ int QVideoSurfaceFormat::frameWidth() const { return d->frameSize.width(); } /*! Returns the height of frame in a video stream. */ int QVideoSurfaceFormat::frameHeight() const { return d->frameSize.height(); } /*! Sets the size of frames in a video stream to \a size. This will reset the viewport() to fill the entire frame. */ void QVideoSurfaceFormat::setFrameSize(const QSize &size) { d->frameSize = size; d->viewport = QRect(QPoint(0, 0), size); } /*! \overload Sets the \a width and \a height of frames in a video stream. This will reset the viewport() to fill the entire frame. */ void QVideoSurfaceFormat::setFrameSize(int width, int height) { d->frameSize = QSize(width, height); d->viewport = QRect(0, 0, width, height); } /*! Returns the viewport of a video stream. The viewport is the region of a video frame that is actually displayed. By default the viewport covers an entire frame. */ QRect QVideoSurfaceFormat::viewport() const { return d->viewport; } /*! Sets the viewport of a video stream to \a viewport. */ void QVideoSurfaceFormat::setViewport(const QRect &viewport) { d->viewport = viewport; } /*! Returns the direction of scan lines. */ QVideoSurfaceFormat::Direction QVideoSurfaceFormat::scanLineDirection() const { return d->scanLineDirection; } /*! Sets the \a direction of scan lines. */ void QVideoSurfaceFormat::setScanLineDirection(Direction direction) { d->scanLineDirection = direction; } /*! Returns the frame rate of a video stream in frames per second. */ qreal QVideoSurfaceFormat::frameRate() const { return d->frameRate; } /*! Sets the frame \a rate of a video stream in frames per second. */ void QVideoSurfaceFormat::setFrameRate(qreal rate) { d->frameRate = rate; } /*! Returns a video stream's pixel aspect ratio. */ QSize QVideoSurfaceFormat::pixelAspectRatio() const { return d->pixelAspectRatio; } /*! Sets a video stream's pixel aspect \a ratio. */ void QVideoSurfaceFormat::setPixelAspectRatio(const QSize &ratio) { d->pixelAspectRatio = ratio; } /*! \overload Sets the \a horizontal and \a vertical elements of a video stream's pixel aspect ratio. */ void QVideoSurfaceFormat::setPixelAspectRatio(int horizontal, int vertical) { d->pixelAspectRatio = QSize(horizontal, vertical); } /*! Returns the Y'CbCr color space of a video stream. */ QVideoSurfaceFormat::YCbCrColorSpace QVideoSurfaceFormat::yCbCrColorSpace() const { return d->ycbcrColorSpace; } /*! Sets the Y'CbCr color \a space of a video stream. It is only used with raw YUV frame types. */ void QVideoSurfaceFormat::setYCbCrColorSpace(QVideoSurfaceFormat::YCbCrColorSpace space) { d->ycbcrColorSpace = space; } /*! Returns a suggested size in pixels for the video stream. This is the size of the viewport scaled according to the pixel aspect ratio. */ QSize QVideoSurfaceFormat::sizeHint() const { QSize size = d->viewport.size(); if (d->pixelAspectRatio.height() != 0) size.setWidth(size.width() * d->pixelAspectRatio.width() / d->pixelAspectRatio.height()); return size; } /*! Returns a list of video format dynamic property names. */ QList QVideoSurfaceFormat::propertyNames() const { return (QList() << "handleType" << "pixelFormat" << "frameSize" << "frameWidth" << "viewport" << "scanLineDirection" << "frameRate" << "pixelAspectRatio" << "sizeHint" << "yCbCrColorSpace") + d->propertyNames; } /*! Returns the value of the video format's \a name property. */ QVariant QVideoSurfaceFormat::property(const char *name) const { if (qstrcmp(name, "handleType") == 0) { return qVariantFromValue(d->handleType); } else if (qstrcmp(name, "pixelFormat") == 0) { return qVariantFromValue(d->pixelFormat); } else if (qstrcmp(name, "frameSize") == 0) { return d->frameSize; } else if (qstrcmp(name, "frameWidth") == 0) { return d->frameSize.width(); } else if (qstrcmp(name, "frameHeight") == 0) { return d->frameSize.height(); } else if (qstrcmp(name, "viewport") == 0) { return d->viewport; } else if (qstrcmp(name, "scanLineDirection") == 0) { return qVariantFromValue(d->scanLineDirection); } else if (qstrcmp(name, "frameRate") == 0) { return qVariantFromValue(d->frameRate); } else if (qstrcmp(name, "pixelAspectRatio") == 0) { return qVariantFromValue(d->pixelAspectRatio); } else if (qstrcmp(name, "sizeHint") == 0) { return sizeHint(); } else if (qstrcmp(name, "yCbCrColorSpace") == 0) { return qVariantFromValue(d->ycbcrColorSpace); } else { int id = 0; for (; id < d->propertyNames.count() && d->propertyNames.at(id) != name; ++id) {} return id < d->propertyValues.count() ? d->propertyValues.at(id) : QVariant(); } } /*! Sets the video format's \a name property to \a value. Trying to set a read only property will be ignored. */ void QVideoSurfaceFormat::setProperty(const char *name, const QVariant &value) { if (qstrcmp(name, "handleType") == 0) { // read only. } else if (qstrcmp(name, "pixelFormat") == 0) { // read only. } else if (qstrcmp(name, "frameSize") == 0) { if (value.canConvert()) { d->frameSize = qvariant_cast(value); d->viewport = QRect(QPoint(0, 0), d->frameSize); } } else if (qstrcmp(name, "frameWidth") == 0) { // read only. } else if (qstrcmp(name, "frameHeight") == 0) { // read only. } else if (qstrcmp(name, "viewport") == 0) { if (value.canConvert()) d->viewport = qvariant_cast(value); } else if (qstrcmp(name, "scanLineDirection") == 0) { if (value.canConvert()) d->scanLineDirection = qvariant_cast(value); } else if (qstrcmp(name, "frameRate") == 0) { if (value.canConvert()) d->frameRate = qvariant_cast(value); } else if (qstrcmp(name, "pixelAspectRatio") == 0) { if (value.canConvert()) d->pixelAspectRatio = qvariant_cast(value); } else if (qstrcmp(name, "sizeHint") == 0) { // read only. } else if (qstrcmp(name, "yCbCrColorSpace") == 0) { if (value.canConvert()) d->ycbcrColorSpace = qvariant_cast(value); } else { int id = 0; for (; id < d->propertyNames.count() && d->propertyNames.at(id) != name; ++id) {} if (id < d->propertyValues.count()) { if (value.isNull()) { d->propertyNames.removeAt(id); d->propertyValues.removeAt(id); } else { d->propertyValues[id] = value; } } else if (!value.isNull()) { d->propertyNames.append(QByteArray(name)); d->propertyValues.append(value); } } } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, QVideoSurfaceFormat::YCbCrColorSpace cs) { QDebug nospace = dbg.nospace(); switch (cs) { case QVideoSurfaceFormat::YCbCr_BT601: nospace << "YCbCr_BT601"; break; case QVideoSurfaceFormat::YCbCr_BT709: nospace << "YCbCr_BT709"; break; case QVideoSurfaceFormat::YCbCr_JPEG: nospace << "YCbCr_JPEG"; break; case QVideoSurfaceFormat::YCbCr_xvYCC601: nospace << "YCbCr_xvYCC601"; break; case QVideoSurfaceFormat::YCbCr_xvYCC709: nospace << "YCbCr_xvYCC709"; break; case QVideoSurfaceFormat::YCbCr_CustomMatrix: nospace << "YCbCr_CustomMatrix"; break; default: nospace << "YCbCr_Undefined"; break; } return nospace; } QDebug operator<<(QDebug dbg, QVideoSurfaceFormat::Direction dir) { QDebug nospace = dbg.nospace(); switch (dir) { case QVideoSurfaceFormat::BottomToTop: nospace << "BottomToTop"; break; case QVideoSurfaceFormat::TopToBottom: nospace << "TopToBottom"; break; } return nospace; } QDebug operator<<(QDebug dbg, const QVideoSurfaceFormat &f) { dbg.nospace() << "QVideoSurfaceFormat(" << f.pixelFormat(); dbg.nospace() << ", " << f.frameSize(); dbg.nospace() << ", viewport=" << f.viewport(); dbg.nospace() << ", pixelAspectRatio=" << f.pixelAspectRatio(); dbg.nospace() << ", handleType=" << f.handleType(); dbg.nospace() << ", yCbCrColorSpace=" << f.yCbCrColorSpace(); dbg.nospace() << ")"; foreach(const QByteArray& propertyName, f.propertyNames()) dbg << "\n " << propertyName.data() << " = " << f.property(propertyName.data()); return dbg.space(); } #endif QT_END_NAMESPACE qvideosurfaceformat.h000066400000000000000000000110001225012771600327610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOSURFACEFORMAT_H #define QVIDEOSURFACEFORMAT_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QDebug; class QVideoSurfaceFormatPrivate; class Q_MULTIMEDIA_EXPORT QVideoSurfaceFormat { public: enum Direction { TopToBottom, BottomToTop }; enum YCbCrColorSpace { YCbCr_Undefined, YCbCr_BT601, YCbCr_BT709, YCbCr_xvYCC601, YCbCr_xvYCC709, YCbCr_JPEG, #ifndef qdoc YCbCr_CustomMatrix #endif }; QVideoSurfaceFormat(); QVideoSurfaceFormat( const QSize &size, QVideoFrame::PixelFormat pixelFormat, QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle); QVideoSurfaceFormat(const QVideoSurfaceFormat &format); ~QVideoSurfaceFormat(); QVideoSurfaceFormat &operator =(const QVideoSurfaceFormat &format); bool operator ==(const QVideoSurfaceFormat &format) const; bool operator !=(const QVideoSurfaceFormat &format) const; bool isValid() const; QVideoFrame::PixelFormat pixelFormat() const; QAbstractVideoBuffer::HandleType handleType() const; QSize frameSize() const; void setFrameSize(const QSize &size); void setFrameSize(int width, int height); int frameWidth() const; int frameHeight() const; QRect viewport() const; void setViewport(const QRect &viewport); Direction scanLineDirection() const; void setScanLineDirection(Direction direction); qreal frameRate() const; void setFrameRate(qreal rate); QSize pixelAspectRatio() const; void setPixelAspectRatio(const QSize &ratio); void setPixelAspectRatio(int width, int height); YCbCrColorSpace yCbCrColorSpace() const; void setYCbCrColorSpace(YCbCrColorSpace colorSpace); QSize sizeHint() const; QList propertyNames() const; QVariant property(const char *name) const; void setProperty(const char *name, const QVariant &value); private: QSharedDataPointer d; }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QVideoSurfaceFormat &); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QVideoSurfaceFormat::Direction); Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QVideoSurfaceFormat::YCbCrColorSpace); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QVideoSurfaceFormat) Q_DECLARE_METATYPE(QVideoSurfaceFormat::Direction) Q_DECLARE_METATYPE(QVideoSurfaceFormat::YCbCrColorSpace) #endif qvideosurfaceoutput.cpp000066400000000000000000000066171225012771600334060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideosurfaceoutput_p.h" #include #include #include /*! * \class QVideoSurfaceOutput * \internal */ QVideoSurfaceOutput::QVideoSurfaceOutput(QObject*parent) : QObject(parent) { } QVideoSurfaceOutput::~QVideoSurfaceOutput() { if (m_control) { m_control.data()->setSurface(0); m_service.data()->releaseControl(m_control.data()); } } QMediaObject *QVideoSurfaceOutput::mediaObject() const { return m_object.data(); } void QVideoSurfaceOutput::setVideoSurface(QAbstractVideoSurface *surface) { m_surface = surface; if (m_control) m_control.data()->setSurface(surface); } bool QVideoSurfaceOutput::setMediaObject(QMediaObject *object) { if (m_control) { m_control.data()->setSurface(0); m_service.data()->releaseControl(m_control.data()); } m_control.clear(); m_service.clear(); m_object.clear(); if (object) { if (QMediaService *service = object->service()) { if (QMediaControl *control = service->requestControl(QVideoRendererControl_iid)) { if ((m_control = qobject_cast(control))) { m_service = service; m_object = object; m_control.data()->setSurface(m_surface.data()); return true; } service->releaseControl(control); } } } return false; } qvideosurfaceoutput_p.h000066400000000000000000000053311225012771600333620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOSURFACEOUTPUT_P_H #define QVIDEOSURFACEOUTPUT_P_H #include #include #include QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QVideoRendererControl; class QVideoSurfaceOutput : public QObject, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) public: QVideoSurfaceOutput(QObject*parent = 0); ~QVideoSurfaceOutput(); QMediaObject *mediaObject() const; void setVideoSurface(QAbstractVideoSurface *surface); protected: bool setMediaObject(QMediaObject *object); private: QPointer m_surface; QPointer m_control; QPointer m_service; QPointer m_object; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimedia/video/video.pri000066400000000000000000000012101225012771600304420ustar00rootroot00000000000000 INCLUDEPATH += video PUBLIC_HEADERS += \ video/qabstractvideobuffer.h \ video/qabstractvideosurface.h \ video/qvideoframe.h \ video/qvideosurfaceformat.h \ video/qvideoprobe.h PRIVATE_HEADERS += \ video/qabstractvideobuffer_p.h \ video/qimagevideobuffer_p.h \ video/qmemoryvideobuffer_p.h \ video/qvideosurfaceoutput_p.h SOURCES += \ video/qabstractvideobuffer.cpp \ video/qabstractvideosurface.cpp \ video/qimagevideobuffer.cpp \ video/qmemoryvideobuffer.cpp \ video/qvideoframe.cpp \ video/qvideosurfaceformat.cpp \ video/qvideosurfaceoutput.cpp \ video/qvideoprobe.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/000077500000000000000000000000001225012771600271075ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/doc/000077500000000000000000000000001225012771600276545ustar00rootroot00000000000000qtmultimediawidgets.qdocconf000066400000000000000000000031771225012771600354110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/docinclude($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) project = QtMultimediaWidgets description = Qt Multimedia Widgets Documentation url = http://qt-project.org/doc/qt-$QT_VER/qtmultimediawidgets version = $QT_VERSION # The following parameters are for creating a qhp file, the qhelpgenerator # program can convert the qhp file into a qch file which can be opened in # Qt Assistant and/or Qt Creator. # Defines the name of the project. You cannot use operators (+, =, -) in # the name. Properties for this project are set using a qhp..property # format. qhp.projects = QtMultimediaWidgets qhp.QtMultimediaWidgets.file = qtmultimediawidgets.qhp qhp.QtMultimediaWidgets.namespace = org.qt-project.qtmultimediawidgets.$QT_VERSION_TAG qhp.QtMultimediaWidgets.indexTitle = Qt Multimedia Widgets qhp.QtMultimediaWidgets.virtualFolder = qtmultimediawidgets # For listing child nodes in Qt Creator or Assistant. qhp.QtMultimediaWidgets.subprojects = classes qhp.QtMultimediaWidgets.subprojects.classes.title = C++ Classes qhp.QtMultimediaWidgets.subprojects.classes.indexTitle = Qt Multimedia Widgets C++ Classes qhp.QtMultimediaWidgets.subprojects.classes.selectors = class fake:headerfile qhp.QtMultimediaWidgets.subprojects.classes.sortPages = true exampledirs += ../../../examples/multimediawidgets \ snippets # Specify example install dir under QT_INSTALL_EXAMPLES examplesinstallpath = multimediawidgets headerdirs += ../ imagedirs += \ sourcedirs += ../ excludedirs += depends += qtcore qtdoc qtquick qtqml qtmultimedia qtwidgets qtgui qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/doc/src/000077500000000000000000000000001225012771600304435ustar00rootroot00000000000000qtmultimediawidgets-index.qdoc000066400000000000000000000041661225012771600364360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \page qtmultimediawidgets-index.html \title Qt Multimedia Widgets \brief An essential module which provides multimedia-related widgets. Qt Multimedia Widgets provides additional multimedia-related widgets and controls. The classes expand the capabilities of the \l{Qt Multimedia} and \l{Qt Widgets} modules. \section1 Getting Started To enable Qt Multimedia Widgets in a project, add this directive into the C++ files: \code #include \endcode To link against the C++ libraries, add the following to your \c qmake project file: \code QT += multimediawidgets \endcode \section1 Related Information \section2 Reference \list \li \l{Qt Multimedia Widgets C++ Classes}{C++ Classes} \endlist \section2 Examples \list \li \l{QML Camera Example} \li \l{Camera Example} \li \l{Media Player Example} \li \l{Video Graphics Item Example} \li \l{Video Widget Example} \endlist */ qtmultimediawidgets.qdoc000066400000000000000000000032741225012771600353300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/doc/src/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of ** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! \module QtMultimediaWidgets \title Qt Multimedia Widgets C++ Classes \brief Classes provided by the Qt Multimedia Widgets module. These classes are part of the \l{Qt Multimedia Widgets} module. To enable Qt Multimedia Widgets in a project, add this directive into the C++ files: \code #include \endcode To link against the C++ libraries, add the following to your \c qmake project file: \code QT += multimediawidgets \endcode */ multimediawidgets.pro000066400000000000000000000023411225012771600332730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets# distinct from Qt Multimedia TARGET = QtMultimediaWidgets QT = core gui multimedia-private widgets-private qtHaveModule(opengl):!contains(QT_CONFIG, opengles1) { QT_PRIVATE += opengl } else { DEFINES += QT_NO_OPENGL } QMAKE_DOCS = $$PWD/doc/qtmultimediawidgets.qdocconf load(qt_module) PRIVATE_HEADERS += \ qvideowidget_p.h \ qpaintervideosurface_p.h \ PUBLIC_HEADERS += \ qtmultimediawidgetdefs.h \ qcameraviewfinder.h \ qgraphicsvideoitem.h \ qvideowidgetcontrol.h \ qvideowidget.h SOURCES += \ qcameraviewfinder.cpp \ qpaintervideosurface.cpp \ qvideowidgetcontrol.cpp \ qvideowidget.cpp mac:!ios { !simulator { PRIVATE_HEADERS += qpaintervideosurface_mac_p.h OBJECTIVE_SOURCES += qpaintervideosurface_mac.mm } LIBS += -framework AppKit -framework QuartzCore -framework QTKit } maemo6 { contains(QT_CONFIG, opengles2) { PRIVATE_HEADERS += qeglimagetexturesurface_p.h SOURCES += qeglimagetexturesurface.cpp SOURCES += qgraphicsvideoitem_maemo6.cpp LIBS += -lX11 } else { SOURCES += qgraphicsvideoitem.cpp } } !maemo* { SOURCES += qgraphicsvideoitem.cpp } HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS qcameraviewfinder.cpp000066400000000000000000000061601225012771600332330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qcameraviewfinder.h" #include "qvideowidget_p.h" #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QCameraViewfinder \brief The QCameraViewfinder class provides a camera viewfinder widget. \inmodule QtMultimediaWidgets \ingroup camera \snippet multimedia-snippets/camera.cpp Camera */ class QCameraViewfinderPrivate : public QVideoWidgetPrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraViewfinder) public: QCameraViewfinderPrivate(): QVideoWidgetPrivate() { } }; /*! Constructs a new camera viewfinder widget. The \a parent is passed to QVideoWidget. */ QCameraViewfinder::QCameraViewfinder(QWidget *parent) :QVideoWidget(*new QCameraViewfinderPrivate, parent) { } /*! Destroys a camera viewfinder widget. */ QCameraViewfinder::~QCameraViewfinder() { } /*! \reimp */ QMediaObject *QCameraViewfinder::mediaObject() const { return QVideoWidget::mediaObject(); } /*! \reimp */ bool QCameraViewfinder::setMediaObject(QMediaObject *object) { return QVideoWidget::setMediaObject(object); } QT_END_NAMESPACE #include "moc_qcameraviewfinder.cpp" qcameraviewfinder.h000066400000000000000000000053301225012771600326760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QCAMERAVIEWFINDER_H #define QCAMERAVIEWFINDER_H #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QCamera; class QCameraViewfinderPrivate; class Q_MULTIMEDIAWIDGETS_EXPORT QCameraViewfinder : public QVideoWidget { Q_OBJECT public: QCameraViewfinder(QWidget *parent = 0); ~QCameraViewfinder(); QMediaObject *mediaObject() const; protected: bool setMediaObject(QMediaObject *object); private: Q_DISABLE_COPY(QCameraViewfinder) Q_DECLARE_PRIVATE(QCameraViewfinder) }; QT_END_NAMESPACE #endif // QCAMERA_H qeglimagetexturesurface.cpp000066400000000000000000000404201225012771600344610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE //#define DEBUG_OMAPFB_SURFACE const QAbstractVideoBuffer::HandleType EGLImageTextureHandle = QAbstractVideoBuffer::HandleType(QAbstractVideoBuffer::UserHandle+3434); /*! \class QEglImageTextureSurface \internal */ /*! */ QEglImageTextureSurface::QEglImageTextureSurface(QObject *parent) : QAbstractVideoSurface(parent) , m_context(0) , m_program(0) , m_pixelFormat(QVideoFrame::Format_Invalid) , m_ready(false) , m_colorKey(49,0,49) , m_fallbackSurface(0) , m_fallbackSurfaceActive(false) { m_fallbackSurface = new QPainterVideoSurface(this); } /*! */ QEglImageTextureSurface::~QEglImageTextureSurface() { if (isActive()) stop(); } /*! */ QList QEglImageTextureSurface::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { #ifdef DEBUG_OMAPFB_SURFACE qDebug() << Q_FUNC_INFO << handleType; #endif if (handleType == EGLImageTextureHandle) { return QList() << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32; } return m_fallbackSurface->supportedPixelFormats(handleType); } const char *qt_glsl_eglTextureVertexShaderProgram = "attribute highp vec4 vertexCoordArray;\n" "attribute mediump vec2 textureCoordArray;\n" "uniform highp mat4 positionMatrix;\n" "varying mediump vec2 textureCoord;\n" "void main (void)\n" "{\n" " gl_Position = positionMatrix * vertexCoordArray;\n" " textureCoord = textureCoordArray;\n" "}"; static const char* qt_glsl_eglTextureShaderProgram = "#extension GL_OES_EGL_image_external: enable\n" "\n" "uniform samplerExternalOES texRgb;\n" "varying mediump vec2 textureCoord;\n" "\n" "void main (void)\n" "{\n" " gl_FragColor = texture2D(texRgb, textureCoord);\n" "}"; /*! */ bool QEglImageTextureSurface::start(const QVideoSurfaceFormat &format) { #ifdef DEBUG_OMAPFB_SURFACE qDebug() << Q_FUNC_INFO << format; #endif m_fallbackSurfaceActive = false; if (format.handleType() != EGLImageTextureHandle) { qWarning() << Q_FUNC_INFO << "Non EGLImageTextureHandle based format requested, fallback to QPainterVideoSurface"; connect(m_fallbackSurface, SIGNAL(activeChanged(bool)), this, SIGNAL(activeChanged(bool))); connect(m_fallbackSurface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat))); connect(m_fallbackSurface, SIGNAL(supportedFormatsChanged()), this, SIGNAL(supportedFormatsChanged())); connect(m_fallbackSurface, SIGNAL(nativeResolutionChanged(QSize)), this, SIGNAL(nativeResolutionChanged(QSize))); connect(m_fallbackSurface, SIGNAL(frameChanged()), this, SIGNAL(frameChanged())); if (m_fallbackSurface->start(format)) { m_fallbackSurfaceActive = true; QAbstractVideoSurface::start(format); } else { qWarning() << Q_FUNC_INFO << "failed to start video surface:" << m_fallbackSurface->error(); setError(m_fallbackSurface->error()); disconnect(m_fallbackSurface, SIGNAL(activeChanged(bool)), this, SIGNAL(activeChanged(bool))); disconnect(m_fallbackSurface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat))); disconnect(m_fallbackSurface, SIGNAL(supportedFormatsChanged()), this, SIGNAL(supportedFormatsChanged())); disconnect(m_fallbackSurface, SIGNAL(nativeResolutionChanged(QSize)), this, SIGNAL(nativeResolutionChanged(QSize))); disconnect(m_fallbackSurface, SIGNAL(frameChanged()), this, SIGNAL(frameChanged())); } return m_fallbackSurfaceActive; } QAbstractVideoSurface::Error error = NoError; if (isActive()) stop(); if (format.frameSize().isEmpty()) { setError(UnsupportedFormatError); } else if (m_context) { m_context->makeCurrent(); m_program = new QGLShaderProgram(m_context, this); if (!m_program->addShaderFromSourceCode(QGLShader::Vertex, qt_glsl_eglTextureVertexShaderProgram)) { qWarning("QOmapFbVideoSurface: Vertex shader compile error %s", qPrintable(m_program->log())); error = ResourceError; } if (error == NoError && !m_program->addShaderFromSourceCode(QGLShader::Fragment, qt_glsl_eglTextureShaderProgram)) { qWarning("QOmapFbVideoSurface: Vertex shader compile error %s", qPrintable(m_program->log())); error = QAbstractVideoSurface::ResourceError; } if (error == NoError) { m_program->bindAttributeLocation("textureCoordArray", 1); if(!m_program->link()) { qWarning("QOmapFbVideoSurface: Shader link error %s", qPrintable(m_program->log())); m_program->removeAllShaders(); error = QAbstractVideoSurface::ResourceError; } } if (error != QAbstractVideoSurface::NoError) { delete m_program; m_program = 0; } } if (error == QAbstractVideoSurface::NoError) { m_scanLineDirection = format.scanLineDirection(); m_frameSize = format.frameSize(); m_pixelFormat = format.pixelFormat(); m_frameSize = format.frameSize(); m_sourceRect = format.viewport(); m_ready = true; return QAbstractVideoSurface::start(format); } QAbstractVideoSurface::stop(); return false; } /*! */ void QEglImageTextureSurface::stop() { #ifdef DEBUG_OMAPFB_SURFACE qDebug() << Q_FUNC_INFO; #endif if (m_fallbackSurfaceActive) { m_fallbackSurface->stop(); m_fallbackSurfaceActive = false; disconnect(m_fallbackSurface, SIGNAL(activeChanged(bool)), this, SIGNAL(activeChanged(bool))); disconnect(m_fallbackSurface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat))); disconnect(m_fallbackSurface, SIGNAL(supportedFormatsChanged()), this, SIGNAL(supportedFormatsChanged())); disconnect(m_fallbackSurface, SIGNAL(nativeResolutionChanged(QSize)), this, SIGNAL(nativeResolutionChanged(QSize))); disconnect(m_fallbackSurface, SIGNAL(frameChanged()), this, SIGNAL(frameChanged())); m_ready = false; QAbstractVideoSurface::stop(); } if (isActive()) { if (m_context) m_context->makeCurrent(); m_frame = QVideoFrame(); m_program->removeAllShaders(); delete m_program; m_program = 0; m_ready = false; QAbstractVideoSurface::stop(); } } /*! */ bool QEglImageTextureSurface::present(const QVideoFrame &frame) { if (m_fallbackSurfaceActive) { if (m_fallbackSurface->present(frame)) { return true; } else { setError(m_fallbackSurface->error()); stop(); return false; } } if (!m_ready) { if (!isActive()) setError(StoppedError); else m_frame = frame; } else if (frame.isValid() && (frame.pixelFormat() != m_pixelFormat || frame.size() != m_frameSize)) { setError(IncorrectFormatError); qWarning() << "Received frame of incorrect format, stopping the surface"; stop(); } else { if (m_context) m_context->makeCurrent(); m_frame = frame; m_ready = false; emit frameChanged(); return true; } return false; } /*! */ int QEglImageTextureSurface::brightness() const { return m_fallbackSurface->brightness(); } /*! */ void QEglImageTextureSurface::setBrightness(int brightness) { m_fallbackSurface->setBrightness(brightness); } /*! */ int QEglImageTextureSurface::contrast() const { return m_fallbackSurface->contrast(); } /*! */ void QEglImageTextureSurface::setContrast(int contrast) { m_fallbackSurface->setContrast(contrast); } /*! */ int QEglImageTextureSurface::hue() const { return m_fallbackSurface->hue(); } /*! */ void QEglImageTextureSurface::setHue(int hue) { m_fallbackSurface->setHue(hue); } /*! */ int QEglImageTextureSurface::saturation() const { return m_fallbackSurface->saturation(); } /*! */ void QEglImageTextureSurface::setSaturation(int saturation) { m_fallbackSurface->setSaturation(saturation); } /*! */ bool QEglImageTextureSurface::isReady() const { return m_fallbackSurfaceActive ? m_fallbackSurface->isReady() : m_ready; } /*! */ void QEglImageTextureSurface::setReady(bool ready) { m_ready = ready; if (m_fallbackSurfaceActive) m_fallbackSurface->setReady(ready); } /*! */ void QEglImageTextureSurface::paint(QPainter *painter, const QRectF &target, const QRectF &sourceRect) { if (m_fallbackSurfaceActive) { m_fallbackSurface->paint(painter, target, sourceRect); return; } if (!isActive() || !m_frame.isValid()) { painter->fillRect(target, QBrush(Qt::black)); } else { const QRectF source( m_sourceRect.x() + m_sourceRect.width() * sourceRect.x(), m_sourceRect.y() + m_sourceRect.height() * sourceRect.y(), m_sourceRect.width() * sourceRect.width(), m_sourceRect.height() * sourceRect.height()); bool stencilTestEnabled = glIsEnabled(GL_STENCIL_TEST); bool scissorTestEnabled = glIsEnabled(GL_SCISSOR_TEST); painter->beginNativePainting(); if (stencilTestEnabled) glEnable(GL_STENCIL_TEST); if (scissorTestEnabled) glEnable(GL_SCISSOR_TEST); const int width = QGLContext::currentContext()->device()->width(); const int height = QGLContext::currentContext()->device()->height(); const QTransform transform = painter->deviceTransform(); const GLfloat wfactor = 2.0 / width; const GLfloat hfactor = -2.0 / height; const GLfloat positionMatrix[4][4] = { { /*(0,0)*/ GLfloat(wfactor * transform.m11() - transform.m13()), /*(0,1)*/ GLfloat(hfactor * transform.m12() + transform.m13()), /*(0,2)*/ 0.0, /*(0,3)*/ GLfloat(transform.m13()) }, { /*(1,0)*/ GLfloat(wfactor * transform.m21() - transform.m23()), /*(1,1)*/ GLfloat(hfactor * transform.m22() + transform.m23()), /*(1,2)*/ 0.0, /*(1,3)*/ GLfloat(transform.m23()) }, { /*(2,0)*/ 0.0, /*(2,1)*/ 0.0, /*(2,2)*/ -1.0, /*(2,3)*/ 0.0 }, { /*(3,0)*/ GLfloat(wfactor * transform.dx() - transform.m33()), /*(3,1)*/ GLfloat(hfactor * transform.dy() + transform.m33()), /*(3,2)*/ 0.0, /*(3,3)*/ GLfloat(transform.m33()) } }; const GLfloat vTop = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? target.top() : target.bottom() + 1; const GLfloat vBottom = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? target.bottom() + 1 : target.top(); const GLfloat vertexCoordArray[] = { GLfloat(target.left()) , GLfloat(vBottom), GLfloat(target.right() + 1), GLfloat(vBottom), GLfloat(target.left()) , GLfloat(vTop), GLfloat(target.right() + 1), GLfloat(vTop) }; const GLfloat txLeft = source.left() / m_frameSize.width(); const GLfloat txRight = source.right() / m_frameSize.width(); const GLfloat txTop = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.top() / m_frameSize.height() : source.bottom() / m_frameSize.height(); const GLfloat txBottom = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.bottom() / m_frameSize.height() : source.top() / m_frameSize.height(); const GLfloat textureCoordArray[] = { txLeft , txBottom, txRight, txBottom, txLeft , txTop, txRight, txTop }; m_program->bind(); m_program->enableAttributeArray("vertexCoordArray"); m_program->enableAttributeArray("textureCoordArray"); m_program->setAttributeArray("vertexCoordArray", vertexCoordArray, 2); m_program->setAttributeArray("textureCoordArray", textureCoordArray, 2); m_program->setUniformValue("positionMatrix", positionMatrix); m_program->setUniformValue("texRgb", 0); //map() binds the external texture m_frame.map(QAbstractVideoBuffer::ReadOnly); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //it's necessary to unbind the external texture m_frame.unmap(); m_program->release(); painter->endNativePainting(); } } /*! \fn QEglImageTextureSurface::frameChanged() */ /*! */ const QGLContext *QEglImageTextureSurface::glContext() const { return m_context; } /*! */ void QEglImageTextureSurface::setGLContext(QGLContext *context) { if (m_context == context) return; stop(); m_context = context; m_fallbackSurface->setGLContext(context); if (m_fallbackSurface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) { m_fallbackSurface->setShaderType(QPainterVideoSurface::GlslShader); } else { m_fallbackSurface->setShaderType(QPainterVideoSurface::FragmentProgramShader); } emit supportedFormatsChanged(); } void QEglImageTextureSurface::viewportDestroyed() { m_context = 0; m_fallbackSurface->viewportDestroyed(); setError(ResourceError); stop(); } #include "moc_qeglimagetexturesurface_p.cpp" QT_END_NAMESPACE qeglimagetexturesurface_p.h000066400000000000000000000102461225012771600344500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QEGLIMAGETEXTURESURFACE_P_H #define QEGLIMAGETEXTURESURFACE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QGLContext; class QGLShaderProgram; class QPainterVideoSurface; class QEglImageTextureSurface : public QAbstractVideoSurface { Q_OBJECT public: explicit QEglImageTextureSurface(QObject *parent = 0); ~QEglImageTextureSurface(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); bool isReady() const; void setReady(bool ready); void paint(QPainter *painter, const QRectF &target, const QRectF &source = QRectF(0, 0, 1, 1)); const QGLContext *glContext() const; void setGLContext(QGLContext *context); bool isOverlayEnabled() const; void setOverlayEnabled(bool enabled); QRect displayRect() const; void setDisplayRect(const QRect &rect); public Q_SLOTS: void viewportDestroyed(); Q_SIGNALS: void frameChanged(); private: QGLContext *m_context; QGLShaderProgram *m_program; QVideoFrame m_frame; QVideoFrame::PixelFormat m_pixelFormat; QVideoSurfaceFormat::Direction m_scanLineDirection; QSize m_frameSize; QRect m_sourceRect; bool m_ready; QRect m_viewport; QRect m_displayRect; QColor m_colorKey; QPainterVideoSurface *m_fallbackSurface; bool m_fallbackSurfaceActive; }; QT_END_NAMESPACE #endif qgraphicsvideoitem.cpp000066400000000000000000000261431225012771600334310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgraphicsvideoitem.h" #include "qpaintervideosurface_p.h" #include #include #include #include #include #include #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) #include #endif QT_BEGIN_NAMESPACE class QGraphicsVideoItemPrivate { public: QGraphicsVideoItemPrivate() : q_ptr(0) , surface(0) , mediaObject(0) , service(0) , rendererControl(0) , aspectRatioMode(Qt::KeepAspectRatio) , updatePaintDevice(true) , rect(0.0, 0.0, 320, 240) { } QGraphicsVideoItem *q_ptr; QPainterVideoSurface *surface; QPointer mediaObject; QMediaService *service; QVideoRendererControl *rendererControl; Qt::AspectRatioMode aspectRatioMode; bool updatePaintDevice; QRectF rect; QRectF boundingRect; QRectF sourceRect; QSizeF nativeSize; void clearService(); void updateRects(); void _q_present(); void _q_formatChanged(const QVideoSurfaceFormat &format); void _q_updateNativeSize(); void _q_serviceDestroyed(); }; void QGraphicsVideoItemPrivate::clearService() { if (rendererControl) { surface->stop(); rendererControl->setSurface(0); service->releaseControl(rendererControl); rendererControl = 0; } if (service) { QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed())); service = 0; } } void QGraphicsVideoItemPrivate::updateRects() { q_ptr->prepareGeometryChange(); if (nativeSize.isEmpty()) { //this is necessary for item to receive the //first paint event and configure video surface. boundingRect = rect; } else if (aspectRatioMode == Qt::IgnoreAspectRatio) { boundingRect = rect; sourceRect = QRectF(0, 0, 1, 1); } else if (aspectRatioMode == Qt::KeepAspectRatio) { QSizeF size = nativeSize; size.scale(rect.size(), Qt::KeepAspectRatio); boundingRect = QRectF(0, 0, size.width(), size.height()); boundingRect.moveCenter(rect.center()); sourceRect = QRectF(0, 0, 1, 1); } else if (aspectRatioMode == Qt::KeepAspectRatioByExpanding) { boundingRect = rect; QSizeF size = rect.size(); size.scale(nativeSize, Qt::KeepAspectRatio); sourceRect = QRectF( 0, 0, size.width() / nativeSize.width(), size.height() / nativeSize.height()); sourceRect.moveCenter(QPointF(0.5, 0.5)); } } void QGraphicsVideoItemPrivate::_q_present() { if (q_ptr->isObscured()) { q_ptr->update(boundingRect); surface->setReady(true); } else { q_ptr->update(boundingRect); } } void QGraphicsVideoItemPrivate::_q_updateNativeSize() { const QSize &size = surface->surfaceFormat().sizeHint(); if (nativeSize != size) { nativeSize = size; updateRects(); emit q_ptr->nativeSizeChanged(nativeSize); } } void QGraphicsVideoItemPrivate::_q_serviceDestroyed() { rendererControl = 0; service = 0; surface->stop(); } /*! \class QGraphicsVideoItem \brief The QGraphicsVideoItem class provides a graphics item which display video produced by a QMediaObject. \inmodule QtMultimediaWidgets \ingroup multimedia Attaching a QGraphicsVideoItem to a QMediaObject allows it to display the video or image output of that media object. A QGraphicsVideoItem is attached to a media object by passing a pointer to the QMediaObject to the setMediaObject() function. \snippet multimedia-snippets/video.cpp Video graphics item \b {Note}: Only a single display output can be attached to a media object at one time. \sa QMediaObject, QMediaPlayer, QVideoWidget */ /*! Constructs a graphics item that displays video. The \a parent is passed to QGraphicsItem. */ QGraphicsVideoItem::QGraphicsVideoItem(QGraphicsItem *parent) : QGraphicsObject(parent) , d_ptr(new QGraphicsVideoItemPrivate) { d_ptr->q_ptr = this; d_ptr->surface = new QPainterVideoSurface; qRegisterMetaType(); connect(d_ptr->surface, SIGNAL(frameChanged()), this, SLOT(_q_present())); connect(d_ptr->surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SLOT(_q_updateNativeSize()), Qt::QueuedConnection); } /*! Destroys a video graphics item. */ QGraphicsVideoItem::~QGraphicsVideoItem() { if (d_ptr->rendererControl) { d_ptr->rendererControl->setSurface(0); d_ptr->service->releaseControl(d_ptr->rendererControl); } delete d_ptr->surface; delete d_ptr; } /*! \property QGraphicsVideoItem::mediaObject \brief the media object which provides the video displayed by a graphics item. */ QMediaObject *QGraphicsVideoItem::mediaObject() const { return d_func()->mediaObject; } /*! \internal */ bool QGraphicsVideoItem::setMediaObject(QMediaObject *object) { Q_D(QGraphicsVideoItem); if (object == d->mediaObject) return true; d->clearService(); d->mediaObject = object; if (d->mediaObject) { d->service = d->mediaObject->service(); if (d->service) { QMediaControl *control = d->service->requestControl(QVideoRendererControl_iid); if (control) { d->rendererControl = qobject_cast(control); if (d->rendererControl) { //don't set the surface untill the item is painted //at least once and the surface is configured if (!d->updatePaintDevice) d->rendererControl->setSurface(d->surface); else update(boundingRect()); connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); return true; } if (control) d->service->releaseControl(control); } } } d->mediaObject = 0; return false; } /*! \property QGraphicsVideoItem::aspectRatioMode \brief how a video is scaled to fit the graphics item's size. */ Qt::AspectRatioMode QGraphicsVideoItem::aspectRatioMode() const { return d_func()->aspectRatioMode; } void QGraphicsVideoItem::setAspectRatioMode(Qt::AspectRatioMode mode) { Q_D(QGraphicsVideoItem); d->aspectRatioMode = mode; d->updateRects(); } /*! \property QGraphicsVideoItem::offset \brief the video item's offset. QGraphicsVideoItem will draw video using the offset for its top left corner. */ QPointF QGraphicsVideoItem::offset() const { return d_func()->rect.topLeft(); } void QGraphicsVideoItem::setOffset(const QPointF &offset) { Q_D(QGraphicsVideoItem); d->rect.moveTo(offset); d->updateRects(); } /*! \property QGraphicsVideoItem::size \brief the video item's size. QGraphicsVideoItem will draw video scaled to fit size according to its fillMode. */ QSizeF QGraphicsVideoItem::size() const { return d_func()->rect.size(); } void QGraphicsVideoItem::setSize(const QSizeF &size) { Q_D(QGraphicsVideoItem); d->rect.setSize(size.isValid() ? size : QSizeF(0, 0)); d->updateRects(); } /*! \property QGraphicsVideoItem::nativeSize \brief the native size of the video. */ QSizeF QGraphicsVideoItem::nativeSize() const { return d_func()->nativeSize; } /*! \fn QGraphicsVideoItem::nativeSizeChanged(const QSizeF &size) Signals that the native \a size of the video has changed. */ /*! \reimp */ QRectF QGraphicsVideoItem::boundingRect() const { return d_func()->boundingRect; } /*! \reimp */ void QGraphicsVideoItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_D(QGraphicsVideoItem); Q_UNUSED(option); Q_UNUSED(widget); if (d->surface && d->updatePaintDevice) { d->updatePaintDevice = false; #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) if (widget) connect(widget, SIGNAL(destroyed()), d->surface, SLOT(viewportDestroyed())); d->surface->setGLContext(const_cast(QGLContext::currentContext())); if (d->surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) { d->surface->setShaderType(QPainterVideoSurface::GlslShader); } else { d->surface->setShaderType(QPainterVideoSurface::FragmentProgramShader); } #endif if (d->rendererControl && d->rendererControl->surface() != d->surface) d->rendererControl->setSurface(d->surface); } if (d->surface && d->surface->isActive()) { d->surface->paint(painter, d->boundingRect, d->sourceRect); d->surface->setReady(true); } } /*! \reimp \internal */ QVariant QGraphicsVideoItem::itemChange(GraphicsItemChange change, const QVariant &value) { return QGraphicsItem::itemChange(change, value); } /*! \internal */ void QGraphicsVideoItem::timerEvent(QTimerEvent *event) { QGraphicsObject::timerEvent(event); } #include "moc_qgraphicsvideoitem.cpp" QT_END_NAMESPACE qgraphicsvideoitem.h000066400000000000000000000074031225012771600330740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGRAPHICSVIDEOITEM_H #define QGRAPHICSVIDEOITEM_H #include #include #include QT_BEGIN_NAMESPACE class QVideoSurfaceFormat; QT_END_NAMESPACE QT_BEGIN_NAMESPACE class QGraphicsVideoItemPrivate; class Q_MULTIMEDIAWIDGETS_EXPORT QGraphicsVideoItem : public QGraphicsObject, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) Q_PROPERTY(QMediaObject* mediaObject READ mediaObject WRITE setMediaObject) Q_PROPERTY(Qt::AspectRatioMode aspectRatioMode READ aspectRatioMode WRITE setAspectRatioMode) Q_PROPERTY(QPointF offset READ offset WRITE setOffset) Q_PROPERTY(QSizeF size READ size WRITE setSize) Q_PROPERTY(QSizeF nativeSize READ nativeSize NOTIFY nativeSizeChanged) public: QGraphicsVideoItem(QGraphicsItem *parent = 0); ~QGraphicsVideoItem(); QMediaObject *mediaObject() const; Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); QPointF offset() const; void setOffset(const QPointF &offset); QSizeF size() const; void setSize(const QSizeF &size); QSizeF nativeSize() const; QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); Q_SIGNALS: void nativeSizeChanged(const QSizeF &size); protected: void timerEvent(QTimerEvent *event); QVariant itemChange(GraphicsItemChange change, const QVariant &value); bool setMediaObject(QMediaObject *object); QGraphicsVideoItemPrivate *d_ptr; private: Q_DECLARE_PRIVATE(QGraphicsVideoItem) Q_PRIVATE_SLOT(d_func(), void _q_present()) Q_PRIVATE_SLOT(d_func(), void _q_updateNativeSize()) Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) }; QT_END_NAMESPACE #endif qgraphicsvideoitem_maemo6.cpp000066400000000000000000000322121225012771600346670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qgraphicsvideoitem.h" #include #include #include #include #include #include #include #include #include #include #include #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) #include #endif //#define ENABLE_OVERLAY namespace { //XInitThreads is necessary for gltexturesink element. //To ensure it's called before main() it's better to link to //libQtMultimedia.so directly, not when QML multimedia plugin is loaded. class InitThreads { public: InitThreads() { XInitThreads(); } } _initThreads; } Q_DECLARE_METATYPE(QVideoSurfaceFormat) QT_BEGIN_NAMESPACE class QGraphicsVideoItemPrivate { public: QGraphicsVideoItemPrivate() : q_ptr(0) , surface(0) , mediaObject(0) , service(0) , rendererControl(0) , aspectRatioMode(Qt::KeepAspectRatio) , updatePaintDevice(true) , rect(0.0, 0.0, 320, 240) { } QGraphicsVideoItem *q_ptr; QEglImageTextureSurface *surface; QPointer mediaObject; QMediaService *service; QVideoRendererControl *rendererControl; Qt::AspectRatioMode aspectRatioMode; bool updatePaintDevice; QRectF rect; QRectF boundingRect; QRectF sourceRect; QSizeF nativeSize; void clearService(); void updateRects(); void _q_present(); void _q_formatChanged(const QVideoSurfaceFormat &format); void _q_updateNativeSize(); void _q_serviceDestroyed(); }; void QGraphicsVideoItemPrivate::clearService() { if (rendererControl) { surface->stop(); rendererControl->setSurface(0); service->releaseControl(rendererControl); rendererControl = 0; } if (service) { QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed())); service = 0; } } void QGraphicsVideoItemPrivate::updateRects() { q_ptr->prepareGeometryChange(); if (nativeSize.isEmpty()) { //this is necessary for item to receive the //first paint event and configure video surface. boundingRect = rect; } else if (aspectRatioMode == Qt::IgnoreAspectRatio) { boundingRect = rect; sourceRect = QRectF(0, 0, 1, 1); } else if (aspectRatioMode == Qt::KeepAspectRatio) { QSizeF size = nativeSize; size.scale(rect.size(), Qt::KeepAspectRatio); boundingRect = QRectF(0, 0, size.width(), size.height()); boundingRect.moveCenter(rect.center()); sourceRect = QRectF(0, 0, 1, 1); } else if (aspectRatioMode == Qt::KeepAspectRatioByExpanding) { boundingRect = rect; QSizeF size = rect.size(); size.scale(nativeSize, Qt::KeepAspectRatio); sourceRect = QRectF( 0, 0, size.width() / nativeSize.width(), size.height() / nativeSize.height()); sourceRect.moveCenter(QPointF(0.5, 0.5)); } } void QGraphicsVideoItemPrivate::_q_present() { if (q_ptr->isObscured()) { q_ptr->update(boundingRect); surface->setReady(true); } else { q_ptr->update(boundingRect); } } void QGraphicsVideoItemPrivate::_q_updateNativeSize() { QSize size = surface->surfaceFormat().sizeHint(); if (size.isEmpty()) size = rendererControl->property("nativeSize").toSize(); if (nativeSize != size) { nativeSize = size; updateRects(); emit q_ptr->nativeSizeChanged(nativeSize); } } void QGraphicsVideoItemPrivate::_q_serviceDestroyed() { rendererControl = 0; service = 0; surface->stop(); } /* \class QGraphicsVideoItem \brief The QGraphicsVideoItem class provides a graphics item which display video produced by a QMediaObject. \inmodule QtMultimediaWidgets \ingroup multimedia Attaching a QGraphicsVideoItem to a QMediaObject allows it to display the video or image output of that media object. A QGraphicsVideoItem is attached to a media object by passing a pointer to the QMediaObject to the setMediaObject() function. \code player = new QMediaPlayer(this); QGraphicsVideoItem *item = new QGraphicsVideoItem; player->setVideoOutput(item); graphicsView->scene()->addItem(item); graphicsView->show(); player->setMedia(video); player->play(); \endcode \b {Note}: Only a single display output can be attached to a media object at one time. \sa QMediaObject, QMediaPlayer, QVideoWidget */ /* Constructs a graphics item that displays video. The \a parent is passed to QGraphicsItem. */ QGraphicsVideoItem::QGraphicsVideoItem(QGraphicsItem *parent) : QGraphicsObject(parent) , d_ptr(new QGraphicsVideoItemPrivate) { d_ptr->q_ptr = this; d_ptr->surface = new QEglImageTextureSurface(this); qRegisterMetaType(); connect(d_ptr->surface, SIGNAL(frameChanged()), this, SLOT(_q_present())); connect(d_ptr->surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SLOT(_q_updateNativeSize()), Qt::QueuedConnection); } /* Destroys a video graphics item. */ QGraphicsVideoItem::~QGraphicsVideoItem() { if (d_ptr->rendererControl) { d_ptr->rendererControl->setSurface(0); d_ptr->service->releaseControl(d_ptr->rendererControl); } delete d_ptr->surface; delete d_ptr; } /* \property QGraphicsVideoItem::mediaObject \brief the media object which provides the video displayed by a graphics item. */ QMediaObject *QGraphicsVideoItem::mediaObject() const { return d_func()->mediaObject; } /* \internal */ bool QGraphicsVideoItem::setMediaObject(QMediaObject *object) { Q_D(QGraphicsVideoItem); if (object == d->mediaObject) return true; d->clearService(); d->mediaObject = object; if (d->mediaObject) { d->service = d->mediaObject->service(); if (d->service) { QMediaControl *control = d->service->requestControl(QVideoRendererControl_iid); if (control) { d->rendererControl = qobject_cast(control); if (d->rendererControl) { connect(d->rendererControl, SIGNAL(nativeSizeChanged()), this, SLOT(_q_updateNativeSize()), Qt::QueuedConnection); d->_q_updateNativeSize(); //don't set the surface untill the item is painted //at least once and the surface is configured if (!d->updatePaintDevice) d->rendererControl->setSurface(d->surface); else update(boundingRect()); connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); return true; } if (control) d->service->releaseControl(control); } } } d->mediaObject = 0; return false; } /* \property QGraphicsVideoItem::aspectRatioMode \brief how a video is scaled to fit the graphics item's size. */ Qt::AspectRatioMode QGraphicsVideoItem::aspectRatioMode() const { return d_func()->aspectRatioMode; } void QGraphicsVideoItem::setAspectRatioMode(Qt::AspectRatioMode mode) { Q_D(QGraphicsVideoItem); d->aspectRatioMode = mode; d->updateRects(); } /* \property QGraphicsVideoItem::offset \brief the video item's offset. QGraphicsVideoItem will draw video using the offset for its top left corner. */ QPointF QGraphicsVideoItem::offset() const { return d_func()->rect.topLeft(); } void QGraphicsVideoItem::setOffset(const QPointF &offset) { Q_D(QGraphicsVideoItem); d->rect.moveTo(offset); d->updateRects(); } /* \property QGraphicsVideoItem::size \brief the video item's size. QGraphicsVideoItem will draw video scaled to fit size according to its fillMode. */ QSizeF QGraphicsVideoItem::size() const { return d_func()->rect.size(); } void QGraphicsVideoItem::setSize(const QSizeF &size) { Q_D(QGraphicsVideoItem); d->rect.setSize(size.isValid() ? size : QSizeF(0, 0)); d->updateRects(); } /* \property QGraphicsVideoItem::nativeSize \brief the native size of the video. */ QSizeF QGraphicsVideoItem::nativeSize() const { return d_func()->nativeSize; } /* \fn QGraphicsVideoItem::nativeSizeChanged(const QSizeF &size) Signals that the native \a size of the video has changed. */ /* \reimp */ QRectF QGraphicsVideoItem::boundingRect() const { return d_func()->boundingRect; } /* \reimp */ void QGraphicsVideoItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_D(QGraphicsVideoItem); Q_UNUSED(option); Q_UNUSED(widget); if (d->surface && d->rendererControl && d->updatePaintDevice) { d->updatePaintDevice = false; if (widget) d->rendererControl->setProperty("winId", qulonglong(widget->winId())); #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) if (widget) connect(widget, SIGNAL(destroyed()), d->surface, SLOT(viewportDestroyed())); d->surface->setGLContext(const_cast(QGLContext::currentContext())); #endif if (d->rendererControl->surface() != d->surface) d->rendererControl->setSurface(d->surface); } //overlay doesn't work reliably //check if the item is obscured: #ifdef ENABLE_OVERLAY if (!isObscured()) { bool obscured = false; if (scene()) { foreach (QGraphicsItem *item, scene()->items(mapToScene(boundingRect()), Qt::IntersectsItemBoundingRect) ) { if (item->flags() & QGraphicsItem::ItemHasNoContents) continue; if (item == this) break; if (collidesWithItem(item)) { obscured = true; break; } } } d->rendererControl->setProperty("overlayEnabled", !obscured); } if (d->rendererControl->property("overlayEnabled").toBool()) { QTransform transform = painter->combinedTransform(); QRect overlayRect = transform.mapRect(d->boundingRect).toRect(); d->rendererControl->setProperty("overlayGeometry", overlayRect); QMetaObject::invokeMethod(d->rendererControl, "repaintOverlay"); painter->fillRect(d->boundingRect, d->rendererControl->property("colorKey").value()); } else #endif //ENABLE_OVERLAY { if (d->surface && d->surface->isActive()) { d->surface->paint(painter, d->boundingRect, d->sourceRect); d->surface->setReady(true); } } } /* \reimp \internal */ QVariant QGraphicsVideoItem::itemChange(GraphicsItemChange change, const QVariant &value) { return QGraphicsItem::itemChange(change, value); } /* \internal */ void QGraphicsVideoItem::timerEvent(QTimerEvent *event) { QGraphicsObject::timerEvent(event); } #include "moc_qgraphicsvideoitem.cpp" QT_END_NAMESPACE qpaintervideosurface.cpp000066400000000000000000001527451225012771600337750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qpaintervideosurface_p.h" #include "qpaintervideosurface_mac_p.h" #include #include #include #include #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) #include #include #ifndef GL_CLAMP_TO_EDGE #define GL_CLAMP_TO_EDGE 0x812F #endif #endif #include QT_BEGIN_NAMESPACE QVideoSurfacePainter::~QVideoSurfacePainter() { } class QVideoSurfaceGenericPainter : public QVideoSurfacePainter { public: QVideoSurfaceGenericPainter(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const; bool isFormatSupported(const QVideoSurfaceFormat &format) const; QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format); void stop(); QAbstractVideoSurface::Error setCurrentFrame(const QVideoFrame &frame); QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source); void updateColors(int brightness, int contrast, int hue, int saturation); private: QList m_imagePixelFormats; QVideoFrame m_frame; QSize m_imageSize; QImage::Format m_imageFormat; QVideoSurfaceFormat::Direction m_scanLineDirection; }; QVideoSurfaceGenericPainter::QVideoSurfaceGenericPainter() : m_imageFormat(QImage::Format_Invalid) , m_scanLineDirection(QVideoSurfaceFormat::TopToBottom) { m_imagePixelFormats << QVideoFrame::Format_RGB32 #ifndef QT_OPENGL_ES // The raster formats should be a subset of the GL formats. << QVideoFrame::Format_RGB24 #endif << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_RGB565; } QList QVideoSurfaceGenericPainter::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { switch (handleType) { case QAbstractVideoBuffer::QPixmapHandle: case QAbstractVideoBuffer::NoHandle: return m_imagePixelFormats; default: ; } return QList(); } bool QVideoSurfaceGenericPainter::isFormatSupported(const QVideoSurfaceFormat &format) const { switch (format.handleType()) { case QAbstractVideoBuffer::QPixmapHandle: return true; case QAbstractVideoBuffer::NoHandle: return m_imagePixelFormats.contains(format.pixelFormat()) && !format.frameSize().isEmpty(); default: ; } return false; } QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::start(const QVideoSurfaceFormat &format) { m_frame = QVideoFrame(); m_imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); m_imageSize = format.frameSize(); m_scanLineDirection = format.scanLineDirection(); const QAbstractVideoBuffer::HandleType t = format.handleType(); if (t == QAbstractVideoBuffer::NoHandle) { if (m_imageFormat != QImage::Format_Invalid #ifdef QT_OPENGL_ES && format.pixelFormat() != QVideoFrame::Format_RGB24 #endif && !m_imageSize.isEmpty()) { return QAbstractVideoSurface::NoError; } } else if (t == QAbstractVideoBuffer::QPixmapHandle) { return QAbstractVideoSurface::NoError; } return QAbstractVideoSurface::UnsupportedFormatError; } void QVideoSurfaceGenericPainter::stop() { m_frame = QVideoFrame(); } QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::setCurrentFrame(const QVideoFrame &frame) { m_frame = frame; return QAbstractVideoSurface::NoError; } QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::paint( const QRectF &target, QPainter *painter, const QRectF &source) { if (!m_frame.isValid()) { painter->fillRect(target, Qt::black); return QAbstractVideoSurface::NoError; } if (m_frame.handleType() == QAbstractVideoBuffer::QPixmapHandle) { painter->drawPixmap(target, m_frame.handle().value(), source); } else if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { QImage image( m_frame.bits(), m_imageSize.width(), m_imageSize.height(), m_frame.bytesPerLine(), m_imageFormat); if (m_scanLineDirection == QVideoSurfaceFormat::BottomToTop) { const QTransform oldTransform = painter->transform(); painter->scale(1, -1); painter->translate(0, -target.bottom()); painter->drawImage( QRectF(target.x(), 0, target.width(), target.height()), image, source); painter->setTransform(oldTransform); } else { painter->drawImage(target, image, source); } m_frame.unmap(); } else if (m_frame.isValid()) { return QAbstractVideoSurface::IncorrectFormatError; } else { painter->fillRect(target, Qt::black); } return QAbstractVideoSurface::NoError; } void QVideoSurfaceGenericPainter::updateColors(int, int, int, int) { } #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) #ifndef Q_OS_MAC # ifndef APIENTRYP # ifdef APIENTRY # define APIENTRYP APIENTRY * # else # define APIENTRY # define APIENTRYP * # endif # endif #else # define APIENTRY # define APIENTRYP * #endif #ifndef GL_TEXTURE0 # define GL_TEXTURE0 0x84C0 # define GL_TEXTURE1 0x84C1 # define GL_TEXTURE2 0x84C2 #endif #ifndef GL_PROGRAM_ERROR_STRING_ARB # define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #endif #ifndef GL_UNSIGNED_SHORT_5_6_5 # define GL_UNSIGNED_SHORT_5_6_5 33635 #endif class QVideoSurfaceGLPainter : public QVideoSurfacePainter { public: QVideoSurfaceGLPainter(QGLContext *context); ~QVideoSurfaceGLPainter(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const; bool isFormatSupported(const QVideoSurfaceFormat &format) const; QAbstractVideoSurface::Error setCurrentFrame(const QVideoFrame &frame); QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source); void updateColors(int brightness, int contrast, int hue, int saturation); void viewportDestroyed(); protected: void initRgbTextureInfo(GLenum internalFormat, GLuint format, GLenum type, const QSize &size); void initYuv420PTextureInfo(const QSize &size); void initYv12TextureInfo(const QSize &size); #ifndef QT_OPENGL_ES typedef void (APIENTRY *_glActiveTexture) (GLenum); _glActiveTexture glActiveTexture; #endif QList m_imagePixelFormats; QList m_glPixelFormats; QMatrix4x4 m_colorMatrix; QVideoFrame m_frame; QGLContext *m_context; QAbstractVideoBuffer::HandleType m_handleType; QVideoSurfaceFormat::Direction m_scanLineDirection; QVideoSurfaceFormat::YCbCrColorSpace m_colorSpace; GLenum m_textureFormat; GLuint m_textureInternalFormat; GLenum m_textureType; int m_textureCount; static const uint Max_Textures = 3; GLuint m_textureIds[Max_Textures]; int m_textureWidths[Max_Textures]; int m_textureHeights[Max_Textures]; int m_textureOffsets[Max_Textures]; bool m_yuv; }; QVideoSurfaceGLPainter::QVideoSurfaceGLPainter(QGLContext *context) : m_context(context) , m_handleType(QAbstractVideoBuffer::NoHandle) , m_scanLineDirection(QVideoSurfaceFormat::TopToBottom) , m_colorSpace(QVideoSurfaceFormat::YCbCr_BT601) , m_textureFormat(0) , m_textureInternalFormat(0) , m_textureType(0) , m_textureCount(0) , m_yuv(false) { #ifndef QT_OPENGL_ES glActiveTexture = (_glActiveTexture)m_context->getProcAddress(QLatin1String("glActiveTexture")); #endif memset(m_textureIds, 0, sizeof(m_textureIds)); memset(m_textureWidths, 0, sizeof(m_textureWidths)); memset(m_textureHeights, 0, sizeof(m_textureHeights)); memset(m_textureOffsets, 0, sizeof(m_textureOffsets)); } QVideoSurfaceGLPainter::~QVideoSurfaceGLPainter() { } void QVideoSurfaceGLPainter::viewportDestroyed() { m_context = 0; } QList QVideoSurfaceGLPainter::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { switch (handleType) { case QAbstractVideoBuffer::NoHandle: return m_imagePixelFormats; case QAbstractVideoBuffer::QPixmapHandle: case QAbstractVideoBuffer::GLTextureHandle: return m_glPixelFormats; default: ; } return QList(); } bool QVideoSurfaceGLPainter::isFormatSupported(const QVideoSurfaceFormat &format) const { if (format.frameSize().isEmpty()) { return false; } else { switch (format.handleType()) { case QAbstractVideoBuffer::NoHandle: return m_imagePixelFormats.contains(format.pixelFormat()); case QAbstractVideoBuffer::QPixmapHandle: case QAbstractVideoBuffer::GLTextureHandle: return m_glPixelFormats.contains(format.pixelFormat()); default: ; } } return false; } QAbstractVideoSurface::Error QVideoSurfaceGLPainter::setCurrentFrame(const QVideoFrame &frame) { m_frame = frame; if (m_handleType == QAbstractVideoBuffer::GLTextureHandle) { m_textureIds[0] = frame.handle().toInt(); glBindTexture(GL_TEXTURE_2D, m_textureIds[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } else if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { m_context->makeCurrent(); for (int i = 0; i < m_textureCount; ++i) { glBindTexture(GL_TEXTURE_2D, m_textureIds[i]); glTexImage2D( GL_TEXTURE_2D, 0, m_textureInternalFormat, m_textureWidths[i], m_textureHeights[i], 0, m_textureFormat, m_textureType, m_frame.bits() + m_textureOffsets[i]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } m_frame.unmap(); } else if (m_handleType != QAbstractVideoBuffer::QPixmapHandle && m_frame.isValid()) { return QAbstractVideoSurface::IncorrectFormatError; } return QAbstractVideoSurface::NoError; } QAbstractVideoSurface::Error QVideoSurfaceGLPainter::paint( const QRectF &target, QPainter *painter, const QRectF &source) { if (!m_frame.isValid()) { painter->fillRect(target, Qt::black); return QAbstractVideoSurface::NoError; } if (m_frame.handleType() == QAbstractVideoBuffer::QPixmapHandle) { painter->drawPixmap(target, m_frame.handle().value(), source); } else if (m_frame.isValid()) { return QAbstractVideoSurface::IncorrectFormatError; } else { painter->fillRect(target, Qt::black); } return QAbstractVideoSurface::NoError; } void QVideoSurfaceGLPainter::updateColors(int brightness, int contrast, int hue, int saturation) { const qreal b = brightness / 200.0; const qreal c = contrast / 100.0 + 1.0; const qreal h = hue / 100.0; const qreal s = saturation / 100.0 + 1.0; const qreal cosH = qCos(M_PI * h); const qreal sinH = qSin(M_PI * h); const qreal h11 = 0.787 * cosH - 0.213 * sinH + 0.213; const qreal h21 = -0.213 * cosH + 0.143 * sinH + 0.213; const qreal h31 = -0.213 * cosH - 0.787 * sinH + 0.213; const qreal h12 = -0.715 * cosH - 0.715 * sinH + 0.715; const qreal h22 = 0.285 * cosH + 0.140 * sinH + 0.715; const qreal h32 = -0.715 * cosH + 0.715 * sinH + 0.715; const qreal h13 = -0.072 * cosH + 0.928 * sinH + 0.072; const qreal h23 = -0.072 * cosH - 0.283 * sinH + 0.072; const qreal h33 = 0.928 * cosH + 0.072 * sinH + 0.072; const qreal sr = (1.0 - s) * 0.3086; const qreal sg = (1.0 - s) * 0.6094; const qreal sb = (1.0 - s) * 0.0820; const qreal sr_s = sr + s; const qreal sg_s = sg + s; const qreal sb_s = sr + s; const float m4 = (s + sr + sg + sb) * (0.5 - 0.5 * c + b); m_colorMatrix(0, 0) = c * (sr_s * h11 + sg * h21 + sb * h31); m_colorMatrix(0, 1) = c * (sr_s * h12 + sg * h22 + sb * h32); m_colorMatrix(0, 2) = c * (sr_s * h13 + sg * h23 + sb * h33); m_colorMatrix(0, 3) = m4; m_colorMatrix(1, 0) = c * (sr * h11 + sg_s * h21 + sb * h31); m_colorMatrix(1, 1) = c * (sr * h12 + sg_s * h22 + sb * h32); m_colorMatrix(1, 2) = c * (sr * h13 + sg_s * h23 + sb * h33); m_colorMatrix(1, 3) = m4; m_colorMatrix(2, 0) = c * (sr * h11 + sg * h21 + sb_s * h31); m_colorMatrix(2, 1) = c * (sr * h12 + sg * h22 + sb_s * h32); m_colorMatrix(2, 2) = c * (sr * h13 + sg * h23 + sb_s * h33); m_colorMatrix(2, 3) = m4; m_colorMatrix(3, 0) = 0.0; m_colorMatrix(3, 1) = 0.0; m_colorMatrix(3, 2) = 0.0; m_colorMatrix(3, 3) = 1.0; if (m_yuv) { QMatrix4x4 colorSpaceMatrix; switch (m_colorSpace) { case QVideoSurfaceFormat::YCbCr_JPEG: colorSpaceMatrix = QMatrix4x4( 1.0, 0.000, 1.402, -0.701, 1.0, -0.344, -0.714, 0.529, 1.0, 1.772, 0.000, -0.886, 0.0, 0.000, 0.000, 1.0000); break; case QVideoSurfaceFormat::YCbCr_BT709: case QVideoSurfaceFormat::YCbCr_xvYCC709: colorSpaceMatrix = QMatrix4x4( 1.164, 0.000, 1.793, -0.5727, 1.164, -0.534, -0.213, 0.3007, 1.164, 2.115, 0.000, -1.1302, 0.0, 0.000, 0.000, 1.0000); break; default: //BT 601: colorSpaceMatrix = QMatrix4x4( 1.164, 0.000, 1.596, -0.8708, 1.164, -0.392, -0.813, 0.5296, 1.164, 2.017, 0.000, -1.081, 0.0, 0.000, 0.000, 1.0000); } m_colorMatrix = m_colorMatrix * colorSpaceMatrix; } } void QVideoSurfaceGLPainter::initRgbTextureInfo( GLenum internalFormat, GLuint format, GLenum type, const QSize &size) { m_yuv = false; m_textureInternalFormat = internalFormat; m_textureFormat = format; m_textureType = type; m_textureCount = 1; // Note: ensure this is always <= Max_Textures m_textureWidths[0] = size.width(); m_textureHeights[0] = size.height(); m_textureOffsets[0] = 0; } void QVideoSurfaceGLPainter::initYuv420PTextureInfo(const QSize &size) { int bytesPerLine = (size.width() + 3) & ~3; int bytesPerLine2 = (size.width() / 2 + 3) & ~3; m_yuv = true; m_textureInternalFormat = GL_LUMINANCE; m_textureFormat = GL_LUMINANCE; m_textureType = GL_UNSIGNED_BYTE; m_textureCount = 3; // Note: ensure this is always <= Max_Textures m_textureWidths[0] = bytesPerLine; m_textureHeights[0] = size.height(); m_textureOffsets[0] = 0; m_textureWidths[1] = bytesPerLine2; m_textureHeights[1] = size.height() / 2; m_textureOffsets[1] = bytesPerLine * size.height(); m_textureWidths[2] = bytesPerLine2; m_textureHeights[2] = size.height() / 2; m_textureOffsets[2] = bytesPerLine * size.height() + bytesPerLine2 * size.height()/2; } void QVideoSurfaceGLPainter::initYv12TextureInfo(const QSize &size) { int bytesPerLine = (size.width() + 3) & ~3; int bytesPerLine2 = (size.width() / 2 + 3) & ~3; m_yuv = true; m_textureInternalFormat = GL_LUMINANCE; m_textureFormat = GL_LUMINANCE; m_textureType = GL_UNSIGNED_BYTE; m_textureCount = 3; // Note: ensure this is always <= Max_Textures m_textureWidths[0] = bytesPerLine; m_textureHeights[0] = size.height(); m_textureOffsets[0] = 0; m_textureWidths[1] = bytesPerLine2; m_textureHeights[1] = size.height() / 2; m_textureOffsets[1] = bytesPerLine * size.height() + bytesPerLine2 * size.height()/2; m_textureWidths[2] = bytesPerLine2; m_textureHeights[2] = size.height() / 2; m_textureOffsets[2] = bytesPerLine * size.height(); } #ifndef QT_OPENGL_ES # ifndef GL_FRAGMENT_PROGRAM_ARB # define GL_FRAGMENT_PROGRAM_ARB 0x8804 # define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 # endif // Paints an RGB32 frame static const char *qt_arbfp_xrgbShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP xrgb;\n" "TEX xrgb.xyz, fragment.texcoord[0], texture[0], 2D;\n" "MOV xrgb.w, matrix[3].w;\n" "DP4 result.color.x, xrgb.zyxw, matrix[0];\n" "DP4 result.color.y, xrgb.zyxw, matrix[1];\n" "DP4 result.color.z, xrgb.zyxw, matrix[2];\n" "END"; // Paints an ARGB frame. static const char *qt_arbfp_argbShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP argb;\n" "TEX argb, fragment.texcoord[0], texture[0], 2D;\n" "MOV argb.w, matrix[3].w;\n" "DP4 result.color.x, argb.zyxw, matrix[0];\n" "DP4 result.color.y, argb.zyxw, matrix[1];\n" "DP4 result.color.z, argb.zyxw, matrix[2];\n" "TEX result.color.w, fragment.texcoord[0], texture, 2D;\n" "END"; // Paints an RGB(A) frame. static const char *qt_arbfp_rgbShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP rgb;\n" "TEX rgb, fragment.texcoord[0], texture[0], 2D;\n" "MOV rgb.w, matrix[3].w;\n" "DP4 result.color.x, rgb, matrix[0];\n" "DP4 result.color.y, rgb, matrix[1];\n" "DP4 result.color.z, rgb, matrix[2];\n" "TEX result.color.w, fragment.texcoord[0], texture, 2D;\n" "END"; // Paints a YUV420P or YV12 frame. static const char *qt_arbfp_yuvPlanarShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP yuv;\n" "TEX yuv.x, fragment.texcoord[0], texture[0], 2D;\n" "TEX yuv.y, fragment.texcoord[0], texture[1], 2D;\n" "TEX yuv.z, fragment.texcoord[0], texture[2], 2D;\n" "MOV yuv.w, matrix[3].w;\n" "DP4 result.color.x, yuv, matrix[0];\n" "DP4 result.color.y, yuv, matrix[1];\n" "DP4 result.color.z, yuv, matrix[2];\n" "END"; // Paints a YUV444 frame. static const char *qt_arbfp_xyuvShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP ayuv;\n" "TEX ayuv, fragment.texcoord[0], texture[0], 2D;\n" "MOV ayuv.x, matrix[3].w;\n" "DP4 result.color.x, ayuv.yzwx, matrix[0];\n" "DP4 result.color.y, ayuv.yzwx, matrix[1];\n" "DP4 result.color.z, ayuv.yzwx, matrix[2];\n" "END"; // Paints a AYUV444 frame. static const char *qt_arbfp_ayuvShaderProgram = "!!ARBfp1.0\n" "PARAM matrix[4] = { program.local[0..2]," "{ 0.0, 0.0, 0.0, 1.0 } };\n" "TEMP ayuv;\n" "TEX ayuv, fragment.texcoord[0], texture[0], 2D;\n" "MOV ayuv.x, matrix[3].w;\n" "DP4 result.color.x, ayuv.yzwx, matrix[0];\n" "DP4 result.color.y, ayuv.yzwx, matrix[1];\n" "DP4 result.color.z, ayuv.yzwx, matrix[2];\n" "TEX result.color.w, fragment.texcoord[0], texture, 2D;\n" "END"; class QVideoSurfaceArbFpPainter : public QVideoSurfaceGLPainter { public: QVideoSurfaceArbFpPainter(QGLContext *context); QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format); void stop(); QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source); private: typedef void (APIENTRY *_glProgramStringARB) (GLenum, GLenum, GLsizei, const GLvoid *); typedef void (APIENTRY *_glBindProgramARB) (GLenum, GLuint); typedef void (APIENTRY *_glDeleteProgramsARB) (GLsizei, const GLuint *); typedef void (APIENTRY *_glGenProgramsARB) (GLsizei, GLuint *); typedef void (APIENTRY *_glProgramLocalParameter4fARB) ( GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); typedef void (APIENTRY *_glActiveTexture) (GLenum); _glProgramStringARB glProgramStringARB; _glBindProgramARB glBindProgramARB; _glDeleteProgramsARB glDeleteProgramsARB; _glGenProgramsARB glGenProgramsARB; _glProgramLocalParameter4fARB glProgramLocalParameter4fARB; GLuint m_programId; QSize m_frameSize; }; QVideoSurfaceArbFpPainter::QVideoSurfaceArbFpPainter(QGLContext *context) : QVideoSurfaceGLPainter(context) , m_programId(0) { glProgramStringARB = (_glProgramStringARB) m_context->getProcAddress( QLatin1String("glProgramStringARB")); glBindProgramARB = (_glBindProgramARB) m_context->getProcAddress( QLatin1String("glBindProgramARB")); glDeleteProgramsARB = (_glDeleteProgramsARB) m_context->getProcAddress( QLatin1String("glDeleteProgramsARB")); glGenProgramsARB = (_glGenProgramsARB) m_context->getProcAddress( QLatin1String("glGenProgramsARB")); glProgramLocalParameter4fARB = (_glProgramLocalParameter4fARB) m_context->getProcAddress( QLatin1String("glProgramLocalParameter4fARB")); m_imagePixelFormats << QVideoFrame::Format_RGB32 << QVideoFrame::Format_BGR32 << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_RGB24 << QVideoFrame::Format_BGR24 << QVideoFrame::Format_RGB565 << QVideoFrame::Format_AYUV444 << QVideoFrame::Format_YUV444 << QVideoFrame::Format_YV12 << QVideoFrame::Format_YUV420P; m_glPixelFormats << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32; } QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfaceFormat &format) { Q_ASSERT(m_textureCount == 0); QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError; m_context->makeCurrent(); const char *program = 0; if (format.handleType() == QAbstractVideoBuffer::NoHandle) { switch (format.pixelFormat()) { case QVideoFrame::Format_RGB32: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_xrgbShaderProgram; break; case QVideoFrame::Format_BGR32: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_rgbShaderProgram; break; case QVideoFrame::Format_ARGB32: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_argbShaderProgram; break; case QVideoFrame::Format_RGB24: initRgbTextureInfo(GL_RGB8, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_rgbShaderProgram; break; case QVideoFrame::Format_BGR24: initRgbTextureInfo(GL_RGB8, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_xrgbShaderProgram; break; case QVideoFrame::Format_RGB565: initRgbTextureInfo(GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, format.frameSize()); program = qt_arbfp_rgbShaderProgram; break; case QVideoFrame::Format_YUV444: initRgbTextureInfo(GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_xyuvShaderProgram; m_yuv = true; break; case QVideoFrame::Format_AYUV444: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); program = qt_arbfp_ayuvShaderProgram; m_yuv = true; break; case QVideoFrame::Format_YV12: initYv12TextureInfo(format.frameSize()); program = qt_arbfp_yuvPlanarShaderProgram; break; case QVideoFrame::Format_YUV420P: initYuv420PTextureInfo(format.frameSize()); program = qt_arbfp_yuvPlanarShaderProgram; break; default: break; } } else if (format.handleType() == QAbstractVideoBuffer::GLTextureHandle) { switch (format.pixelFormat()) { case QVideoFrame::Format_RGB32: case QVideoFrame::Format_ARGB32: m_yuv = false; m_textureCount = 1; program = qt_arbfp_rgbShaderProgram; break; default: break; } } else if (format.handleType() == QAbstractVideoBuffer::QPixmapHandle) { m_handleType = QAbstractVideoBuffer::QPixmapHandle; return QAbstractVideoSurface::NoError; } if (!program) { error = QAbstractVideoSurface::UnsupportedFormatError; } else { glGenProgramsARB(1, &m_programId); GLenum glError = glGetError(); if (glError != GL_NO_ERROR) { qWarning("QPainterVideoSurface: ARBfb Shader allocation error %x", int(glError)); m_textureCount = 0; m_programId = 0; error = QAbstractVideoSurface::ResourceError; } else { glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_programId); glProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, qstrlen(program), reinterpret_cast(program)); if ((glError = glGetError()) != GL_NO_ERROR) { const GLubyte* errorString = glGetString(GL_PROGRAM_ERROR_STRING_ARB); qWarning("QPainterVideoSurface: ARBfp Shader compile error %x, %s", int(glError), reinterpret_cast(errorString)); glDeleteProgramsARB(1, &m_programId); m_textureCount = 0; m_programId = 0; error = QAbstractVideoSurface::ResourceError; } else { m_handleType = format.handleType(); m_scanLineDirection = format.scanLineDirection(); m_frameSize = format.frameSize(); m_colorSpace = format.yCbCrColorSpace(); if (m_handleType == QAbstractVideoBuffer::NoHandle) glGenTextures(m_textureCount, m_textureIds); } } } return error; } void QVideoSurfaceArbFpPainter::stop() { if (m_context) { m_context->makeCurrent(); if (m_handleType != QAbstractVideoBuffer::GLTextureHandle) glDeleteTextures(m_textureCount, m_textureIds); glDeleteProgramsARB(1, &m_programId); } m_textureCount = 0; m_programId = 0; m_handleType = QAbstractVideoBuffer::NoHandle; } QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::paint( const QRectF &target, QPainter *painter, const QRectF &source) { if (!m_frame.isValid()) { painter->fillRect(target, Qt::black); return QAbstractVideoSurface::NoError; } const QAbstractVideoBuffer::HandleType h = m_frame.handleType(); if (h == QAbstractVideoBuffer::NoHandle || h == QAbstractVideoBuffer::GLTextureHandle) { bool stencilTestEnabled = glIsEnabled(GL_STENCIL_TEST); bool scissorTestEnabled = glIsEnabled(GL_SCISSOR_TEST); painter->beginNativePainting(); if (stencilTestEnabled) glEnable(GL_STENCIL_TEST); if (scissorTestEnabled) glEnable(GL_SCISSOR_TEST); const float txLeft = source.left() / m_frameSize.width(); const float txRight = source.right() / m_frameSize.width(); const float txTop = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.top() / m_frameSize.height() : source.bottom() / m_frameSize.height(); const float txBottom = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.bottom() / m_frameSize.height() : source.top() / m_frameSize.height(); const float tx_array[] = { txLeft , txBottom, txRight, txBottom, txLeft , txTop, txRight, txTop }; const GLfloat v_array[] = { GLfloat(target.left()) , GLfloat(target.bottom() + 1), GLfloat(target.right() + 1), GLfloat(target.bottom() + 1), GLfloat(target.left()) , GLfloat(target.top()), GLfloat(target.right() + 1), GLfloat(target.top()) }; glEnable(GL_FRAGMENT_PROGRAM_ARB); glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_programId); glProgramLocalParameter4fARB( GL_FRAGMENT_PROGRAM_ARB, 0, m_colorMatrix(0, 0), m_colorMatrix(0, 1), m_colorMatrix(0, 2), m_colorMatrix(0, 3)); glProgramLocalParameter4fARB( GL_FRAGMENT_PROGRAM_ARB, 1, m_colorMatrix(1, 0), m_colorMatrix(1, 1), m_colorMatrix(1, 2), m_colorMatrix(1, 3)); glProgramLocalParameter4fARB( GL_FRAGMENT_PROGRAM_ARB, 2, m_colorMatrix(2, 0), m_colorMatrix(2, 1), m_colorMatrix(2, 2), m_colorMatrix(2, 3)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_textureIds[0]); if (m_textureCount == 3) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_textureIds[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, m_textureIds[2]); glActiveTexture(GL_TEXTURE0); } glVertexPointer(2, GL_FLOAT, 0, v_array); glTexCoordPointer(2, GL_FLOAT, 0, tx_array); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisable(GL_FRAGMENT_PROGRAM_ARB); painter->endNativePainting(); return QAbstractVideoSurface::NoError; } return QVideoSurfaceGLPainter::paint(target, painter, source); } #endif static const char *qt_glsl_vertexShaderProgram = "attribute highp vec4 vertexCoordArray;\n" "attribute highp vec2 textureCoordArray;\n" "uniform highp mat4 positionMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " gl_Position = positionMatrix * vertexCoordArray;\n" " textureCoord = textureCoordArray;\n" "}\n"; // Paints an RGB32 frame static const char *qt_glsl_xrgbShaderProgram = "uniform sampler2D texRgb;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(texture2D(texRgb, textureCoord.st).bgr, 1.0);\n" " gl_FragColor = colorMatrix * color;\n" "}\n"; // Paints an ARGB frame. static const char *qt_glsl_argbShaderProgram = "uniform sampler2D texRgb;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(texture2D(texRgb, textureCoord.st).bgr, 1.0);\n" " color = colorMatrix * color;\n" " gl_FragColor = vec4(color.rgb, texture2D(texRgb, textureCoord.st).a);\n" "}\n"; // Paints an RGB(A) frame. static const char *qt_glsl_rgbShaderProgram = "uniform sampler2D texRgb;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(texture2D(texRgb, textureCoord.st).rgb, 1.0);\n" " color = colorMatrix * color;\n" " gl_FragColor = vec4(color.rgb, texture2D(texRgb, textureCoord.st).a);\n" "}\n"; // Paints a YUV420P or YV12 frame. static const char *qt_glsl_yuvPlanarShaderProgram = "uniform sampler2D texY;\n" "uniform sampler2D texU;\n" "uniform sampler2D texV;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(\n" " texture2D(texY, textureCoord.st).r,\n" " texture2D(texU, textureCoord.st).r,\n" " texture2D(texV, textureCoord.st).r,\n" " 1.0);\n" " gl_FragColor = colorMatrix * color;\n" "}\n"; // Paints a YUV444 frame. static const char *qt_glsl_xyuvShaderProgram = "uniform sampler2D texRgb;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(texture2D(texRgb, textureCoord.st).gba, 1.0);\n" " gl_FragColor = colorMatrix * color;\n" "}\n"; // Paints a AYUV444 frame. static const char *qt_glsl_ayuvShaderProgram = "uniform sampler2D texRgb;\n" "uniform mediump mat4 colorMatrix;\n" "varying highp vec2 textureCoord;\n" "void main(void)\n" "{\n" " highp vec4 color = vec4(texture2D(texRgb, textureCoord.st).gba, 1.0);\n" " color = colorMatrix * color;\n" " gl_FragColor = vec4(color.rgb, texture2D(texRgb, textureCoord.st).r);\n" "}\n"; class QVideoSurfaceGlslPainter : public QVideoSurfaceGLPainter { public: QVideoSurfaceGlslPainter(QGLContext *context); QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format); void stop(); QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source); private: QGLShaderProgram m_program; QSize m_frameSize; }; QVideoSurfaceGlslPainter::QVideoSurfaceGlslPainter(QGLContext *context) : QVideoSurfaceGLPainter(context) , m_program(context) { m_imagePixelFormats << QVideoFrame::Format_RGB32 << QVideoFrame::Format_BGR32 << QVideoFrame::Format_ARGB32 #ifndef QT_OPENGL_ES << QVideoFrame::Format_RGB24 << QVideoFrame::Format_BGR24 #endif << QVideoFrame::Format_RGB565 << QVideoFrame::Format_YUV444 << QVideoFrame::Format_AYUV444 << QVideoFrame::Format_YV12 << QVideoFrame::Format_YUV420P; m_glPixelFormats << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32; } QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurfaceFormat &format) { Q_ASSERT(m_textureCount == 0); QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError; m_context->makeCurrent(); const char *fragmentProgram = 0; if (format.handleType() == QAbstractVideoBuffer::NoHandle) { switch (format.pixelFormat()) { case QVideoFrame::Format_RGB32: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_xrgbShaderProgram; break; case QVideoFrame::Format_BGR32: initRgbTextureInfo(GL_RGB, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_rgbShaderProgram; break; case QVideoFrame::Format_ARGB32: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_argbShaderProgram; break; #ifndef QT_OPENGL_ES case QVideoFrame::Format_RGB24: initRgbTextureInfo(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_rgbShaderProgram; break; case QVideoFrame::Format_BGR24: initRgbTextureInfo(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_argbShaderProgram; break; #endif case QVideoFrame::Format_RGB565: initRgbTextureInfo(GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, format.frameSize()); fragmentProgram = qt_glsl_rgbShaderProgram; break; case QVideoFrame::Format_YUV444: initRgbTextureInfo(GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_xyuvShaderProgram; m_yuv = true; break; case QVideoFrame::Format_AYUV444: initRgbTextureInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, format.frameSize()); fragmentProgram = qt_glsl_ayuvShaderProgram; m_yuv = true; break; case QVideoFrame::Format_YV12: initYv12TextureInfo(format.frameSize()); fragmentProgram = qt_glsl_yuvPlanarShaderProgram; break; case QVideoFrame::Format_YUV420P: initYuv420PTextureInfo(format.frameSize()); fragmentProgram = qt_glsl_yuvPlanarShaderProgram; break; default: break; } } else if (format.handleType() == QAbstractVideoBuffer::GLTextureHandle) { switch (format.pixelFormat()) { case QVideoFrame::Format_RGB32: case QVideoFrame::Format_ARGB32: m_yuv = false; m_textureCount = 1; fragmentProgram = qt_glsl_rgbShaderProgram; break; default: break; } } else if (format.handleType() == QAbstractVideoBuffer::QPixmapHandle) { m_handleType = QAbstractVideoBuffer::QPixmapHandle; return QAbstractVideoSurface::NoError; } if (!fragmentProgram) { error = QAbstractVideoSurface::UnsupportedFormatError; } else if (!m_program.addShaderFromSourceCode(QGLShader::Vertex, qt_glsl_vertexShaderProgram)) { qWarning("QPainterVideoSurface: Vertex shader compile error %s", qPrintable(m_program.log())); error = QAbstractVideoSurface::ResourceError; } else if (!m_program.addShaderFromSourceCode(QGLShader::Fragment, fragmentProgram)) { qWarning("QPainterVideoSurface: Shader compile error %s", qPrintable(m_program.log())); error = QAbstractVideoSurface::ResourceError; m_program.removeAllShaders(); } else if(!m_program.link()) { qWarning("QPainterVideoSurface: Shader link error %s", qPrintable(m_program.log())); m_program.removeAllShaders(); error = QAbstractVideoSurface::ResourceError; } else { m_handleType = format.handleType(); m_scanLineDirection = format.scanLineDirection(); m_frameSize = format.frameSize(); m_colorSpace = format.yCbCrColorSpace(); if (m_handleType == QAbstractVideoBuffer::NoHandle) glGenTextures(m_textureCount, m_textureIds); } return error; } void QVideoSurfaceGlslPainter::stop() { if (m_context) { m_context->makeCurrent(); if (m_handleType != QAbstractVideoBuffer::GLTextureHandle) glDeleteTextures(m_textureCount, m_textureIds); } m_program.removeAllShaders(); m_textureCount = 0; m_handleType = QAbstractVideoBuffer::NoHandle; } QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::paint( const QRectF &target, QPainter *painter, const QRectF &source) { if (!m_frame.isValid()) { painter->fillRect(target, Qt::black); return QAbstractVideoSurface::NoError; } const QAbstractVideoBuffer::HandleType h = m_frame.handleType(); if (h == QAbstractVideoBuffer::NoHandle || h == QAbstractVideoBuffer::GLTextureHandle) { bool stencilTestEnabled = glIsEnabled(GL_STENCIL_TEST); bool scissorTestEnabled = glIsEnabled(GL_SCISSOR_TEST); painter->beginNativePainting(); if (stencilTestEnabled) glEnable(GL_STENCIL_TEST); if (scissorTestEnabled) glEnable(GL_SCISSOR_TEST); const int width = QGLContext::currentContext()->device()->width(); const int height = QGLContext::currentContext()->device()->height(); const QTransform transform = painter->deviceTransform(); const GLfloat wfactor = 2.0 / width; const GLfloat hfactor = -2.0 / height; const GLfloat positionMatrix[4][4] = { { /*(0,0)*/ GLfloat(wfactor * transform.m11() - transform.m13()), /*(0,1)*/ GLfloat(hfactor * transform.m12() + transform.m13()), /*(0,2)*/ 0.0, /*(0,3)*/ GLfloat(transform.m13()) }, { /*(1,0)*/ GLfloat(wfactor * transform.m21() - transform.m23()), /*(1,1)*/ GLfloat(hfactor * transform.m22() + transform.m23()), /*(1,2)*/ 0.0, /*(1,3)*/ GLfloat(transform.m23()) }, { /*(2,0)*/ 0.0, /*(2,1)*/ 0.0, /*(2,2)*/ -1.0, /*(2,3)*/ 0.0 }, { /*(3,0)*/ GLfloat(wfactor * transform.dx() - transform.m33()), /*(3,1)*/ GLfloat(hfactor * transform.dy() + transform.m33()), /*(3,2)*/ 0.0, /*(3,3)*/ GLfloat(transform.m33()) } }; const GLfloat vertexCoordArray[] = { GLfloat(target.left()) , GLfloat(target.bottom() + 1), GLfloat(target.right() + 1), GLfloat(target.bottom() + 1), GLfloat(target.left()) , GLfloat(target.top()), GLfloat(target.right() + 1), GLfloat(target.top()) }; const GLfloat txLeft = source.left() / m_frameSize.width(); const GLfloat txRight = source.right() / m_frameSize.width(); const GLfloat txTop = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.top() / m_frameSize.height() : source.bottom() / m_frameSize.height(); const GLfloat txBottom = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.bottom() / m_frameSize.height() : source.top() / m_frameSize.height(); const GLfloat textureCoordArray[] = { txLeft , txBottom, txRight, txBottom, txLeft , txTop, txRight, txTop }; m_program.bind(); m_program.enableAttributeArray("vertexCoordArray"); m_program.enableAttributeArray("textureCoordArray"); m_program.setAttributeArray("vertexCoordArray", vertexCoordArray, 2); m_program.setAttributeArray("textureCoordArray", textureCoordArray, 2); m_program.setUniformValue("positionMatrix", positionMatrix); if (m_textureCount == 3) { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_textureIds[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_textureIds[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, m_textureIds[2]); glActiveTexture(GL_TEXTURE0); m_program.setUniformValue("texY", 0); m_program.setUniformValue("texU", 1); m_program.setUniformValue("texV", 2); } else { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_textureIds[0]); m_program.setUniformValue("texRgb", 0); } m_program.setUniformValue("colorMatrix", m_colorMatrix); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_program.release(); painter->endNativePainting(); return QAbstractVideoSurface::NoError; } return QVideoSurfaceGLPainter::paint(target, painter, source); } #endif /*! \class QPainterVideoSurface \internal */ /*! */ QPainterVideoSurface::QPainterVideoSurface(QObject *parent) : QAbstractVideoSurface(parent) , m_painter(0) #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) , m_glContext(0) , m_shaderTypes(NoShaders) , m_shaderType(NoShaders) #endif , m_brightness(0) , m_contrast(0) , m_hue(0) , m_saturation(0) , m_pixelFormat(QVideoFrame::Format_Invalid) , m_colorsDirty(true) , m_ready(false) { } /*! */ QPainterVideoSurface::~QPainterVideoSurface() { if (isActive()) m_painter->stop(); delete m_painter; } /*! */ QList QPainterVideoSurface::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { if (!m_painter) const_cast(this)->createPainter(); return m_painter->supportedPixelFormats(handleType); } /*! */ bool QPainterVideoSurface::isFormatSupported(const QVideoSurfaceFormat &format) const { if (!m_painter) const_cast(this)->createPainter(); return m_painter->isFormatSupported(format); } /*! */ bool QPainterVideoSurface::start(const QVideoSurfaceFormat &format) { if (isActive()) m_painter->stop(); if (!m_painter) createPainter(); if (format.frameSize().isEmpty()) { setError(UnsupportedFormatError); } else { QAbstractVideoSurface::Error error = m_painter->start(format); if (error != QAbstractVideoSurface::NoError) { setError(error); } else { m_pixelFormat = format.pixelFormat(); m_frameSize = format.frameSize(); m_sourceRect = format.viewport(); m_colorsDirty = true; m_ready = true; return QAbstractVideoSurface::start(format); } } QAbstractVideoSurface::stop(); return false; } /*! */ void QPainterVideoSurface::stop() { if (isActive()) { m_painter->stop(); m_ready = false; QAbstractVideoSurface::stop(); } } /*! */ bool QPainterVideoSurface::present(const QVideoFrame &frame) { if (!m_ready) { if (!isActive()) setError(StoppedError); } else if (frame.isValid() && (frame.pixelFormat() != m_pixelFormat || frame.size() != m_frameSize)) { setError(IncorrectFormatError); stop(); } else { QAbstractVideoSurface::Error error = m_painter->setCurrentFrame(frame); if (error != QAbstractVideoSurface::NoError) { setError(error); stop(); } else { m_ready = false; emit frameChanged(); return true; } } return false; } /*! */ int QPainterVideoSurface::brightness() const { return m_brightness; } /*! */ void QPainterVideoSurface::setBrightness(int brightness) { m_brightness = brightness; m_colorsDirty = true; } /*! */ int QPainterVideoSurface::contrast() const { return m_contrast; } /*! */ void QPainterVideoSurface::setContrast(int contrast) { m_contrast = contrast; m_colorsDirty = true; } /*! */ int QPainterVideoSurface::hue() const { return m_hue; } /*! */ void QPainterVideoSurface::setHue(int hue) { m_hue = hue; m_colorsDirty = true; } /*! */ int QPainterVideoSurface::saturation() const { return m_saturation; } /*! */ void QPainterVideoSurface::setSaturation(int saturation) { m_saturation = saturation; m_colorsDirty = true; } /*! */ bool QPainterVideoSurface::isReady() const { return m_ready; } /*! */ void QPainterVideoSurface::setReady(bool ready) { m_ready = ready; } /*! */ void QPainterVideoSurface::paint(QPainter *painter, const QRectF &target, const QRectF &source) { if (!isActive()) { painter->fillRect(target, QBrush(Qt::black)); } else { if (m_colorsDirty) { m_painter->updateColors(m_brightness, m_contrast, m_hue, m_saturation); m_colorsDirty = false; } const QRectF sourceRect( m_sourceRect.x() + m_sourceRect.width() * source.x(), m_sourceRect.y() + m_sourceRect.height() * source.y(), m_sourceRect.width() * source.width(), m_sourceRect.height() * source.height()); QAbstractVideoSurface::Error error = m_painter->paint(target, painter, sourceRect); if (error != QAbstractVideoSurface::NoError) { setError(error); stop(); } } } /*! \fn QPainterVideoSurface::frameChanged() */ #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) /*! */ const QGLContext *QPainterVideoSurface::glContext() const { return m_glContext; } /*! */ void QPainterVideoSurface::setGLContext(QGLContext *context) { if (m_glContext == context) return; m_glContext = context; m_shaderTypes = NoShaders; if (m_glContext) { //Set a dynamic property to access the OpenGL context this->setProperty("GLContext", QVariant::fromValue(m_glContext->contextHandle())); m_glContext->makeCurrent(); const QByteArray extensions(reinterpret_cast(glGetString(GL_EXTENSIONS))); #ifndef QT_OPENGL_ES if (extensions.contains("ARB_fragment_program")) m_shaderTypes |= FragmentProgramShader; #endif if (QGLShaderProgram::hasOpenGLShaderPrograms(m_glContext) #ifndef QT_OPENGL_ES_2 && extensions.contains("ARB_shader_objects") #endif ) m_shaderTypes |= GlslShader; } ShaderType type = (m_shaderType & m_shaderTypes) ? m_shaderType : NoShaders; if (type != m_shaderType || type != NoShaders) { m_shaderType = type; if (isActive()) { m_painter->stop(); delete m_painter; m_painter = 0; m_ready = false; setError(ResourceError); QAbstractVideoSurface::stop(); } emit supportedFormatsChanged(); } } /*! \enum QPainterVideoSurface::ShaderType \value NoShaders \value FragmentProgramShader \value HlslShader */ /*! \typedef QPainterVideoSurface::ShaderTypes */ /*! */ QPainterVideoSurface::ShaderTypes QPainterVideoSurface::supportedShaderTypes() const { return m_shaderTypes; } /*! */ QPainterVideoSurface::ShaderType QPainterVideoSurface::shaderType() const { return m_shaderType; } /*! */ void QPainterVideoSurface::setShaderType(ShaderType type) { if (!(type & m_shaderTypes)) type = NoShaders; if (type != m_shaderType) { m_shaderType = type; if (isActive()) { m_painter->stop(); delete m_painter; m_painter = 0; m_ready = false; setError(ResourceError); QAbstractVideoSurface::stop(); } else { delete m_painter; m_painter = 0; } emit supportedFormatsChanged(); } } #endif void QPainterVideoSurface::viewportDestroyed() { if (m_painter) { m_painter->viewportDestroyed(); setError(ResourceError); stop(); delete m_painter; m_painter = 0; } } void QPainterVideoSurface::createPainter() { Q_ASSERT(!m_painter); #ifdef Q_OS_MAC if (m_glContext) m_glContext->makeCurrent(); m_painter = new QVideoSurfaceCoreGraphicsPainter(m_glContext != 0); return; #endif #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) switch (m_shaderType) { #ifndef QT_OPENGL_ES case FragmentProgramShader: Q_ASSERT(m_glContext); m_glContext->makeCurrent(); m_painter = new QVideoSurfaceArbFpPainter(m_glContext); break; #endif case GlslShader: Q_ASSERT(m_glContext); m_glContext->makeCurrent(); m_painter = new QVideoSurfaceGlslPainter(m_glContext); break; default: m_painter = new QVideoSurfaceGenericPainter; break; } #else m_painter = new QVideoSurfaceGenericPainter; #endif } #include "moc_qpaintervideosurface_p.cpp" QT_END_NAMESPACE qpaintervideosurface_mac.mm000066400000000000000000000257061225012771600344400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qpaintervideosurface_mac_p.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE extern CGContextRef qt_mac_cg_context(const QPaintDevice *pdev); //qpaintdevice_mac.cpp QVideoSurfaceCoreGraphicsPainter::QVideoSurfaceCoreGraphicsPainter(bool glSupported) : ciContext(0) , m_imageFormat(QImage::Format_Invalid) , m_scanLineDirection(QVideoSurfaceFormat::TopToBottom) { //qDebug() << "QVideoSurfaceCoreGraphicsPainter, GL supported:" << glSupported; ciContext = 0; m_imagePixelFormats << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_ARGB32_Premultiplied << QVideoFrame::Format_BGR32 << QVideoFrame::Format_RGB24 << QVideoFrame::Format_RGB565 << QVideoFrame::Format_RGB555 << QVideoFrame::Format_ARGB8565_Premultiplied; m_supportedHandles << QAbstractVideoBuffer::NoHandle << QAbstractVideoBuffer::CoreImageHandle; if (glSupported) m_supportedHandles << QAbstractVideoBuffer::GLTextureHandle; } QVideoSurfaceCoreGraphicsPainter::~QVideoSurfaceCoreGraphicsPainter() { [(CIContext*)ciContext release]; } QList QVideoSurfaceCoreGraphicsPainter::supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const { return m_supportedHandles.contains(handleType) ? m_imagePixelFormats : QList(); } bool QVideoSurfaceCoreGraphicsPainter::isFormatSupported(const QVideoSurfaceFormat &format) const { return m_supportedHandles.contains(format.handleType()) && m_imagePixelFormats.contains(format.pixelFormat()) && !format.frameSize().isEmpty(); } QAbstractVideoSurface::Error QVideoSurfaceCoreGraphicsPainter::start(const QVideoSurfaceFormat &format) { m_frame = QVideoFrame(); m_imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); m_imageSize = format.frameSize(); m_scanLineDirection = format.scanLineDirection(); return m_supportedHandles.contains(format.handleType()) && ((m_imageFormat != QImage::Format_Invalid) || (format.handleType() == QAbstractVideoBuffer::GLTextureHandle)) && !m_imageSize.isEmpty() ? QAbstractVideoSurface::NoError : QAbstractVideoSurface::UnsupportedFormatError; } void QVideoSurfaceCoreGraphicsPainter::stop() { m_frame = QVideoFrame(); } QAbstractVideoSurface::Error QVideoSurfaceCoreGraphicsPainter::setCurrentFrame(const QVideoFrame &frame) { m_frame = frame; return QAbstractVideoSurface::NoError; } QAbstractVideoSurface::Error QVideoSurfaceCoreGraphicsPainter::paint( const QRectF &target, QPainter *painter, const QRectF &source) { if (m_frame.handleType() == QAbstractVideoBuffer::CoreImageHandle) { //Non OpenGL CI rendering is disabled for now since qt_mac_cg_context is moved to platform plugin #ifdef ENABLE_CORE_GRAPHICS_VIDEO_RENDERING if (painter->paintEngine()->type() == QPaintEngine::CoreGraphics ) { CIImage *img = (CIImage*)(m_frame.handle().value()); if (img) { CGContextRef cgContext = qt_mac_cg_context(painter->device()); if (cgContext) { painter->beginNativePainting(); CGRect sRect = CGRectMake(source.x(), source.y(), source.width(), source.height()); CGRect dRect = CGRectMake(target.x(), target.y(), target.width(), target.height()); NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCIImage:img]; if (m_scanLineDirection == QVideoSurfaceFormat::TopToBottom) { CGContextSaveGState( cgContext ); CGContextTranslateCTM(cgContext, 0, dRect.origin.y + CGRectGetMaxY(dRect)); CGContextScaleCTM(cgContext, 1, -1); CGContextDrawImage(cgContext, dRect, [bitmap CGImage]); CGContextRestoreGState(cgContext); } else { CGContextDrawImage(cgContext, dRect, [bitmap CGImage]); } [bitmap release]; painter->endNativePainting(); return QAbstractVideoSurface::NoError; } } } else #endif if (painter->paintEngine()->type() == QPaintEngine::OpenGL2 || painter->paintEngine()->type() == QPaintEngine::OpenGL) { CIImage *img = (CIImage*)(m_frame.handle().value()); if (img) { CGLContextObj cglContext = CGLGetCurrentContext(); if (cglContext) { if (!ciContext) { CGLContextObj cglContext = CGLGetCurrentContext(); NSOpenGLPixelFormat *nsglPixelFormat = [NSOpenGLView defaultPixelFormat]; CGLPixelFormatObj cglPixelFormat = static_cast([nsglPixelFormat CGLPixelFormatObj]); ciContext = [CIContext contextWithCGLContext:cglContext pixelFormat:cglPixelFormat options:nil]; [(CIContext*)ciContext retain]; } CGRect sRect = CGRectMake(source.x(), source.y(), source.width(), source.height()); CGRect dRect = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? CGRectMake(target.x(), target.y()+target.height(), target.width(), -target.height()) : CGRectMake(target.x(), target.y(), target.width(), target.height()); painter->beginNativePainting(); [(CIContext*)ciContext drawImage:img inRect:dRect fromRect:sRect]; painter->endNativePainting(); return QAbstractVideoSurface::NoError; } } } } if (m_frame.handleType() == QAbstractVideoBuffer::GLTextureHandle && (painter->paintEngine()->type() == QPaintEngine::OpenGL2 || painter->paintEngine()->type() == QPaintEngine::OpenGL)) { painter->beginNativePainting(); GLuint texture = m_frame.handle().toUInt(); glDisable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); const float txLeft = source.left() / m_frame.width(); const float txRight = source.right() / m_frame.width(); const float txTop = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.top() / m_frame.height() : source.bottom() / m_frame.height(); const float txBottom = m_scanLineDirection == QVideoSurfaceFormat::TopToBottom ? source.bottom() / m_frame.height() : source.top() / m_frame.height(); glBegin(GL_QUADS); QRectF rect = target; glTexCoord2f(txLeft, txBottom); glVertex2f(rect.topLeft().x(), rect.topLeft().y()); glTexCoord2f(txRight, txBottom); glVertex2f(rect.topRight().x() + 1, rect.topRight().y()); glTexCoord2f(txRight, txTop); glVertex2f(rect.bottomRight().x() + 1, rect.bottomRight().y() + 1); glTexCoord2f(txLeft, txTop); glVertex2f(rect.bottomLeft().x(), rect.bottomLeft().y() + 1); glEnd(); painter->endNativePainting(); return QAbstractVideoSurface::NoError; } //fallback case, software rendering if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { QImage image( m_frame.bits(), m_imageSize.width(), m_imageSize.height(), m_frame.bytesPerLine(), m_imageFormat); if (m_scanLineDirection == QVideoSurfaceFormat::BottomToTop) { const QTransform oldTransform = painter->transform(); painter->scale(1, -1); painter->translate(0, -target.bottom()); painter->drawImage( QRectF(target.x(), 0, target.width(), target.height()), image, source); painter->setTransform(oldTransform); } else { painter->drawImage(target, image, source); } m_frame.unmap(); } else if (m_frame.isValid()) { return QAbstractVideoSurface::IncorrectFormatError; } else { painter->fillRect(target, Qt::black); } return QAbstractVideoSurface::NoError; } void QVideoSurfaceCoreGraphicsPainter::updateColors(int, int, int, int) { } QT_END_NAMESPACE qpaintervideosurface_mac_p.h000066400000000000000000000065601225012771600345720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QPAINTERVIDEOSURFACE_MAC_P_H #define QPAINTERVIDEOSURFACE_MAC_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qpaintervideosurface_p.h" #include #include QT_BEGIN_NAMESPACE class QVideoSurfaceCoreGraphicsPainter : public QVideoSurfacePainter { public: QVideoSurfaceCoreGraphicsPainter(bool glSupported); ~QVideoSurfaceCoreGraphicsPainter(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const; bool isFormatSupported(const QVideoSurfaceFormat &format) const; QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format); void stop(); QAbstractVideoSurface::Error setCurrentFrame(const QVideoFrame &frame); QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source); void updateColors(int brightness, int contrast, int hue, int saturation); private: void* ciContext; QList m_imagePixelFormats; QVideoFrame m_frame; QSize m_imageSize; QImage::Format m_imageFormat; QVector m_supportedHandles; QVideoSurfaceFormat::Direction m_scanLineDirection; }; QT_END_NAMESPACE #endif qpaintervideosurface_p.h000066400000000000000000000125431225012771600337500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QPAINTERVIDEOSURFACE_P_H #define QPAINTERVIDEOSURFACE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QGLContext; QT_END_NAMESPACE QT_USE_NAMESPACE QT_BEGIN_NAMESPACE class QVideoSurfacePainter { public: virtual ~QVideoSurfacePainter(); virtual QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType) const = 0; virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0; virtual QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format) = 0; virtual void stop() = 0; virtual QAbstractVideoSurface::Error setCurrentFrame(const QVideoFrame &frame) = 0; virtual QAbstractVideoSurface::Error paint( const QRectF &target, QPainter *painter, const QRectF &source) = 0; virtual void updateColors(int brightness, int contrast, int hue, int saturation) = 0; virtual void viewportDestroyed() {} }; class Q_AUTOTEST_EXPORT QPainterVideoSurface : public QAbstractVideoSurface { Q_OBJECT public: explicit QPainterVideoSurface(QObject *parent = 0); ~QPainterVideoSurface(); QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const; bool isFormatSupported(const QVideoSurfaceFormat &format) const; bool start(const QVideoSurfaceFormat &format); void stop(); bool present(const QVideoFrame &frame); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); bool isReady() const; void setReady(bool ready); void paint(QPainter *painter, const QRectF &target, const QRectF &source = QRectF(0, 0, 1, 1)); #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) const QGLContext *glContext() const; void setGLContext(QGLContext *context); enum ShaderType { NoShaders = 0x00, FragmentProgramShader = 0x01, GlslShader = 0x02 }; Q_DECLARE_FLAGS(ShaderTypes, ShaderType) ShaderTypes supportedShaderTypes() const; ShaderType shaderType() const; void setShaderType(ShaderType type); #endif public Q_SLOTS: void viewportDestroyed(); Q_SIGNALS: void frameChanged(); private: void createPainter(); QVideoSurfacePainter *m_painter; #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) QGLContext *m_glContext; ShaderTypes m_shaderTypes; ShaderType m_shaderType; #endif int m_brightness; int m_contrast; int m_hue; int m_saturation; QVideoFrame::PixelFormat m_pixelFormat; QSize m_frameSize; QRect m_sourceRect; bool m_colorsDirty; bool m_ready; }; #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) Q_DECLARE_OPERATORS_FOR_FLAGS(QPainterVideoSurface::ShaderTypes) #endif QT_END_NAMESPACE #endif qtmultimediawidgetdefs.h000066400000000000000000000050661225012771600337550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #ifndef QTMULTIMEDIAWIDGETS_P_H #define QTMULTIMEDIAWIDGETS_P_H #include QT_BEGIN_NAMESPACE #ifndef QT_STATIC # if defined(QT_BUILD_MULTIMEDIAWIDGETS_LIB) # define Q_MULTIMEDIAWIDGETS_EXPORT Q_DECL_EXPORT # else # define Q_MULTIMEDIAWIDGETS_EXPORT Q_DECL_IMPORT # endif #else # define Q_MULTIMEDIAWIDGETS_EXPORT #endif QT_END_NAMESPACE #endif // QMULTIMEDIAWIDGETS_P_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/qvideowidget.cpp000066400000000000000000000631471225012771600323210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideowidget_p.h" #include "qpaintervideosurface_p.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace Qt; QT_BEGIN_NAMESPACE QVideoWidgetControlBackend::QVideoWidgetControlBackend( QMediaService *service, QVideoWidgetControl *control, QWidget *widget) : m_service(service) , m_widgetControl(control) { connect(control, SIGNAL(brightnessChanged(int)), widget, SLOT(_q_brightnessChanged(int))); connect(control, SIGNAL(contrastChanged(int)), widget, SLOT(_q_contrastChanged(int))); connect(control, SIGNAL(hueChanged(int)), widget, SLOT(_q_hueChanged(int))); connect(control, SIGNAL(saturationChanged(int)), widget, SLOT(_q_saturationChanged(int))); connect(control, SIGNAL(fullScreenChanged(bool)), widget, SLOT(_q_fullScreenChanged(bool))); QBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); layout->addWidget(control->videoWidget()); widget->setLayout(layout); } void QVideoWidgetControlBackend::releaseControl() { m_service->releaseControl(m_widgetControl); } void QVideoWidgetControlBackend::setBrightness(int brightness) { m_widgetControl->setBrightness(brightness); } void QVideoWidgetControlBackend::setContrast(int contrast) { m_widgetControl->setContrast(contrast); } void QVideoWidgetControlBackend::setHue(int hue) { m_widgetControl->setHue(hue); } void QVideoWidgetControlBackend::setSaturation(int saturation) { m_widgetControl->setSaturation(saturation); } void QVideoWidgetControlBackend::setFullScreen(bool fullScreen) { m_widgetControl->setFullScreen(fullScreen); } Qt::AspectRatioMode QVideoWidgetControlBackend::aspectRatioMode() const { return m_widgetControl->aspectRatioMode(); } void QVideoWidgetControlBackend::setAspectRatioMode(Qt::AspectRatioMode mode) { m_widgetControl->setAspectRatioMode(mode); } QRendererVideoWidgetBackend::QRendererVideoWidgetBackend( QMediaService *service, QVideoRendererControl *control, QWidget *widget) : m_service(service) , m_rendererControl(control) , m_widget(widget) , m_surface(new QPainterVideoSurface) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_updatePaintDevice(true) { connect(this, SIGNAL(brightnessChanged(int)), m_widget, SLOT(_q_brightnessChanged(int))); connect(this, SIGNAL(contrastChanged(int)), m_widget, SLOT(_q_contrastChanged(int))); connect(this, SIGNAL(hueChanged(int)), m_widget, SLOT(_q_hueChanged(int))); connect(this, SIGNAL(saturationChanged(int)), m_widget, SLOT(_q_saturationChanged(int))); connect(m_surface, SIGNAL(frameChanged()), this, SLOT(frameChanged())); connect(m_surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)), this, SLOT(formatChanged(QVideoSurfaceFormat))); m_rendererControl->setSurface(m_surface); } QRendererVideoWidgetBackend::~QRendererVideoWidgetBackend() { delete m_surface; } void QRendererVideoWidgetBackend::releaseControl() { m_service->releaseControl(m_rendererControl); } void QRendererVideoWidgetBackend::clearSurface() { m_rendererControl->setSurface(0); } void QRendererVideoWidgetBackend::setBrightness(int brightness) { m_surface->setBrightness(brightness); emit brightnessChanged(brightness); } void QRendererVideoWidgetBackend::setContrast(int contrast) { m_surface->setContrast(contrast); emit contrastChanged(contrast); } void QRendererVideoWidgetBackend::setHue(int hue) { m_surface->setHue(hue); emit hueChanged(hue); } void QRendererVideoWidgetBackend::setSaturation(int saturation) { m_surface->setSaturation(saturation); emit saturationChanged(saturation); } Qt::AspectRatioMode QRendererVideoWidgetBackend::aspectRatioMode() const { return m_aspectRatioMode; } void QRendererVideoWidgetBackend::setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; m_widget->updateGeometry(); } void QRendererVideoWidgetBackend::setFullScreen(bool) { } QSize QRendererVideoWidgetBackend::sizeHint() const { return m_surface->surfaceFormat().sizeHint(); } void QRendererVideoWidgetBackend::showEvent() { } void QRendererVideoWidgetBackend::hideEvent(QHideEvent *) { #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) m_updatePaintDevice = true; m_surface->setGLContext(0); #endif } void QRendererVideoWidgetBackend::resizeEvent(QResizeEvent *) { updateRects(); } void QRendererVideoWidgetBackend::moveEvent(QMoveEvent *) { } void QRendererVideoWidgetBackend::paintEvent(QPaintEvent *event) { QPainter painter(m_widget); if (m_widget->testAttribute(Qt::WA_OpaquePaintEvent)) { QRegion borderRegion = event->region(); borderRegion = borderRegion.subtracted(m_boundingRect); QBrush brush = m_widget->palette().window(); QVector rects = borderRegion.rects(); for (QVector::iterator it = rects.begin(), end = rects.end(); it != end; ++it) { painter.fillRect(*it, brush); } } if (m_surface->isActive() && m_boundingRect.intersects(event->rect())) { m_surface->paint(&painter, m_boundingRect, m_sourceRect); m_surface->setReady(true); } else { #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) if (m_updatePaintDevice && (painter.paintEngine()->type() == QPaintEngine::OpenGL || painter.paintEngine()->type() == QPaintEngine::OpenGL2)) { m_updatePaintDevice = false; m_surface->setGLContext(const_cast(QGLContext::currentContext())); if (m_surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) { m_surface->setShaderType(QPainterVideoSurface::GlslShader); } else { m_surface->setShaderType(QPainterVideoSurface::FragmentProgramShader); } } #endif } } void QRendererVideoWidgetBackend::formatChanged(const QVideoSurfaceFormat &format) { m_nativeSize = format.sizeHint(); updateRects(); m_widget->updateGeometry(); m_widget->update(); } void QRendererVideoWidgetBackend::frameChanged() { m_widget->update(m_boundingRect); } void QRendererVideoWidgetBackend::updateRects() { QRect rect = m_widget->rect(); if (m_nativeSize.isEmpty()) { m_boundingRect = QRect(); } else if (m_aspectRatioMode == Qt::IgnoreAspectRatio) { m_boundingRect = rect; m_sourceRect = QRectF(0, 0, 1, 1); } else if (m_aspectRatioMode == Qt::KeepAspectRatio) { QSize size = m_nativeSize; size.scale(rect.size(), Qt::KeepAspectRatio); m_boundingRect = QRect(0, 0, size.width(), size.height()); m_boundingRect.moveCenter(rect.center()); m_sourceRect = QRectF(0, 0, 1, 1); } else if (m_aspectRatioMode == Qt::KeepAspectRatioByExpanding) { m_boundingRect = rect; QSizeF size = rect.size(); size.scale(m_nativeSize, Qt::KeepAspectRatio); m_sourceRect = QRectF( 0, 0, size.width() / m_nativeSize.width(), size.height() / m_nativeSize.height()); m_sourceRect.moveCenter(QPointF(0.5, 0.5)); } } QWindowVideoWidgetBackend::QWindowVideoWidgetBackend( QMediaService *service, QVideoWindowControl *control, QWidget *widget) : m_service(service) , m_windowControl(control) , m_widget(widget) , m_aspectRatioMode(Qt::KeepAspectRatio) { connect(control, SIGNAL(brightnessChanged(int)), m_widget, SLOT(_q_brightnessChanged(int))); connect(control, SIGNAL(contrastChanged(int)), m_widget, SLOT(_q_contrastChanged(int))); connect(control, SIGNAL(hueChanged(int)), m_widget, SLOT(_q_hueChanged(int))); connect(control, SIGNAL(saturationChanged(int)), m_widget, SLOT(_q_saturationChanged(int))); connect(control, SIGNAL(fullScreenChanged(bool)), m_widget, SLOT(_q_fullScreenChanged(bool))); connect(control, SIGNAL(nativeSizeChanged()), m_widget, SLOT(_q_dimensionsChanged())); control->setWinId(widget->winId()); } QWindowVideoWidgetBackend::~QWindowVideoWidgetBackend() { } void QWindowVideoWidgetBackend::releaseControl() { m_service->releaseControl(m_windowControl); } void QWindowVideoWidgetBackend::setBrightness(int brightness) { m_windowControl->setBrightness(brightness); } void QWindowVideoWidgetBackend::setContrast(int contrast) { m_windowControl->setContrast(contrast); } void QWindowVideoWidgetBackend::setHue(int hue) { m_windowControl->setHue(hue); } void QWindowVideoWidgetBackend::setSaturation(int saturation) { m_windowControl->setSaturation(saturation); } void QWindowVideoWidgetBackend::setFullScreen(bool fullScreen) { m_windowControl->setFullScreen(fullScreen); } Qt::AspectRatioMode QWindowVideoWidgetBackend::aspectRatioMode() const { return m_windowControl->aspectRatioMode(); } void QWindowVideoWidgetBackend::setAspectRatioMode(Qt::AspectRatioMode mode) { m_windowControl->setAspectRatioMode(mode); } QSize QWindowVideoWidgetBackend::sizeHint() const { return m_windowControl->nativeSize(); } void QWindowVideoWidgetBackend::showEvent() { m_windowControl->setWinId(m_widget->winId()); m_windowControl->setDisplayRect(m_widget->rect()); #if defined(Q_WS_WIN) m_widget->setUpdatesEnabled(false); #endif } void QWindowVideoWidgetBackend::hideEvent(QHideEvent *) { #if defined(Q_WS_WIN) m_widget->setUpdatesEnabled(true); #endif } void QWindowVideoWidgetBackend::moveEvent(QMoveEvent *) { m_windowControl->setDisplayRect(m_widget->rect()); } void QWindowVideoWidgetBackend::resizeEvent(QResizeEvent *) { m_windowControl->setDisplayRect(m_widget->rect()); } void QWindowVideoWidgetBackend::paintEvent(QPaintEvent *event) { if (m_widget->testAttribute(Qt::WA_OpaquePaintEvent)) { QPainter painter(m_widget); painter.fillRect(event->rect(), m_widget->palette().window()); } m_windowControl->repaint(); event->accept(); } #if defined(Q_WS_WIN) bool QWindowVideoWidgetBackend::winEvent(MSG *message, long *) { if (message->message == WM_PAINT) m_windowControl->repaint(); return false; } #endif void QVideoWidgetPrivate::setCurrentControl(QVideoWidgetControlInterface *control) { if (currentControl != control) { currentControl = control; currentControl->setBrightness(brightness); currentControl->setContrast(contrast); currentControl->setHue(hue); currentControl->setSaturation(saturation); currentControl->setAspectRatioMode(aspectRatioMode); } } void QVideoWidgetPrivate::clearService() { if (service) { QObject::disconnect(service, SIGNAL(destroyed()), q_func(), SLOT(_q_serviceDestroyed())); if (widgetBackend) { QLayout *layout = q_func()->layout(); for (QLayoutItem *item = layout->takeAt(0); item; item = layout->takeAt(0)) { item->widget()->setParent(0); delete item; } delete layout; widgetBackend->releaseControl(); delete widgetBackend; widgetBackend = 0; } else if (rendererBackend) { rendererBackend->clearSurface(); rendererBackend->releaseControl(); delete rendererBackend; rendererBackend = 0; } else { windowBackend->releaseControl(); delete windowBackend; windowBackend = 0; } currentBackend = 0; currentControl = 0; service = 0; } } bool QVideoWidgetPrivate::createWidgetBackend() { if (QMediaControl *control = service->requestControl(QVideoWidgetControl_iid)) { if (QVideoWidgetControl *widgetControl = qobject_cast(control)) { widgetBackend = new QVideoWidgetControlBackend(service, widgetControl, q_func()); setCurrentControl(widgetBackend); return true; } service->releaseControl(control); } return false; } bool QVideoWidgetPrivate::createWindowBackend() { if (QMediaControl *control = service->requestControl(QVideoWindowControl_iid)) { if (QVideoWindowControl *windowControl = qobject_cast(control)) { windowBackend = new QWindowVideoWidgetBackend(service, windowControl, q_func()); currentBackend = windowBackend; setCurrentControl(windowBackend); return true; } service->releaseControl(control); } return false; } bool QVideoWidgetPrivate::createRendererBackend() { if (QMediaControl *control = service->requestControl(QVideoRendererControl_iid)) { if (QVideoRendererControl *rendererControl = qobject_cast(control)) { rendererBackend = new QRendererVideoWidgetBackend(service, rendererControl, q_func()); currentBackend = rendererBackend; setCurrentControl(rendererBackend); return true; } service->releaseControl(control); } return false; } void QVideoWidgetPrivate::_q_serviceDestroyed() { if (widgetBackend) delete q_func()->layout(); delete widgetBackend; delete windowBackend; delete rendererBackend; widgetBackend = 0; windowBackend = 0; rendererBackend = 0; currentControl = 0; currentBackend = 0; service = 0; } void QVideoWidgetPrivate::_q_brightnessChanged(int b) { if (b != brightness) emit q_func()->brightnessChanged(brightness = b); } void QVideoWidgetPrivate::_q_contrastChanged(int c) { if (c != contrast) emit q_func()->contrastChanged(contrast = c); } void QVideoWidgetPrivate::_q_hueChanged(int h) { if (h != hue) emit q_func()->hueChanged(hue = h); } void QVideoWidgetPrivate::_q_saturationChanged(int s) { if (s != saturation) emit q_func()->saturationChanged(saturation = s); } void QVideoWidgetPrivate::_q_fullScreenChanged(bool fullScreen) { if (!fullScreen && q_func()->isFullScreen()) q_func()->showNormal(); } void QVideoWidgetPrivate::_q_dimensionsChanged() { q_func()->updateGeometry(); q_func()->update(); } /*! \class QVideoWidget \brief The QVideoWidget class provides a widget which presents video produced by a media object. \ingroup multimedia \inmodule QtMultimediaWidgets Attaching a QVideoWidget to a QMediaObject allows it to display the video or image output of that media object. A QVideoWidget is attached to media object by passing a pointer to the QMediaObject in its constructor, and detached by destroying the QVideoWidget. \snippet multimedia-snippets/video.cpp Video widget \b {Note}: Only a single display output can be attached to a media object at one time. \sa QMediaObject, QMediaPlayer, QGraphicsVideoItem */ /*! Constructs a new video widget. The \a parent is passed to QWidget. */ QVideoWidget::QVideoWidget(QWidget *parent) : QWidget(parent, 0) , d_ptr(new QVideoWidgetPrivate) { d_ptr->q_ptr = this; } /*! \internal */ QVideoWidget::QVideoWidget(QVideoWidgetPrivate &dd, QWidget *parent) : QWidget(parent, 0) , d_ptr(&dd) { d_ptr->q_ptr = this; QPalette palette = QWidget::palette(); palette.setColor(QPalette::Background, Qt::black); setPalette(palette); } /*! Destroys a video widget. */ QVideoWidget::~QVideoWidget() { d_ptr->clearService(); delete d_ptr; } /*! \property QVideoWidget::mediaObject \brief the media object which provides the video displayed by a widget. */ QMediaObject *QVideoWidget::mediaObject() const { return d_func()->mediaObject; } /*! \internal */ bool QVideoWidget::setMediaObject(QMediaObject *object) { Q_D(QVideoWidget); if (object == d->mediaObject) return true; d->clearService(); d->mediaObject = object; if (d->mediaObject) d->service = d->mediaObject->service(); if (d->service) { if (d->createWidgetBackend()) { // Nothing to do here. } else if ((!window() || !window()->testAttribute(Qt::WA_DontShowOnScreen)) && d->createWindowBackend()) { if (isVisible()) d->windowBackend->showEvent(); } else if (d->createRendererBackend()) { if (isVisible()) d->rendererBackend->showEvent(); } else { d->service = 0; d->mediaObject = 0; return false; } connect(d->service, SIGNAL(destroyed()), SLOT(_q_serviceDestroyed())); } else { d->mediaObject = 0; return false; } return true; } /*! \property QVideoWidget::aspectRatioMode \brief how video is scaled with respect to its aspect ratio. */ Qt::AspectRatioMode QVideoWidget::aspectRatioMode() const { return d_func()->aspectRatioMode; } void QVideoWidget::setAspectRatioMode(Qt::AspectRatioMode mode) { Q_D(QVideoWidget); if (d->currentControl) { d->currentControl->setAspectRatioMode(mode); d->aspectRatioMode = d->currentControl->aspectRatioMode(); } else { d->aspectRatioMode = mode; } } /*! \property QVideoWidget::fullScreen \brief whether video display is confined to a window or is fullScreen. */ void QVideoWidget::setFullScreen(bool fullScreen) { Q_D(QVideoWidget); Qt::WindowFlags flags = windowFlags(); if (fullScreen) { d->nonFullScreenFlags = flags & (Qt::Window | Qt::SubWindow); flags |= Qt::Window; flags &= ~Qt::SubWindow; setWindowFlags(flags); showFullScreen(); } else { flags &= ~(Qt::Window | Qt::SubWindow); //clear the flags... flags |= d->nonFullScreenFlags; //then we reset the flags (window and subwindow) setWindowFlags(flags); showNormal(); } } /*! \fn QVideoWidget::fullScreenChanged(bool fullScreen) Signals that the \a fullScreen mode of a video widget has changed. \sa fullScreen() */ /*! \property QVideoWidget::brightness \brief an adjustment to the brightness of displayed video. Valid brightness values range between -100 and 100, the default is 0. */ int QVideoWidget::brightness() const { return d_func()->brightness; } void QVideoWidget::setBrightness(int brightness) { Q_D(QVideoWidget); int boundedBrightness = qBound(-100, brightness, 100); if (d->currentControl) d->currentControl->setBrightness(boundedBrightness); else if (d->brightness != boundedBrightness) emit brightnessChanged(d->brightness = boundedBrightness); } /*! \fn QVideoWidget::brightnessChanged(int brightness) Signals that a video widgets's \a brightness adjustment has changed. \sa brightness() */ /*! \property QVideoWidget::contrast \brief an adjustment to the contrast of displayed video. Valid contrast values range between -100 and 100, the default is 0. */ int QVideoWidget::contrast() const { return d_func()->contrast; } void QVideoWidget::setContrast(int contrast) { Q_D(QVideoWidget); int boundedContrast = qBound(-100, contrast, 100); if (d->currentControl) d->currentControl->setContrast(boundedContrast); else if (d->contrast != boundedContrast) emit contrastChanged(d->contrast = boundedContrast); } /*! \fn QVideoWidget::contrastChanged(int contrast) Signals that a video widgets's \a contrast adjustment has changed. \sa contrast() */ /*! \property QVideoWidget::hue \brief an adjustment to the hue of displayed video. Valid hue values range between -100 and 100, the default is 0. */ int QVideoWidget::hue() const { return d_func()->hue; } void QVideoWidget::setHue(int hue) { Q_D(QVideoWidget); int boundedHue = qBound(-100, hue, 100); if (d->currentControl) d->currentControl->setHue(boundedHue); else if (d->hue != boundedHue) emit hueChanged(d->hue = boundedHue); } /*! \fn QVideoWidget::hueChanged(int hue) Signals that a video widgets's \a hue has changed. \sa hue() */ /*! \property QVideoWidget::saturation \brief an adjustment to the saturation of displayed video. Valid saturation values range between -100 and 100, the default is 0. */ int QVideoWidget::saturation() const { return d_func()->saturation; } void QVideoWidget::setSaturation(int saturation) { Q_D(QVideoWidget); int boundedSaturation = qBound(-100, saturation, 100); if (d->currentControl) d->currentControl->setSaturation(boundedSaturation); else if (d->saturation != boundedSaturation) emit saturationChanged(d->saturation = boundedSaturation); } /*! \fn QVideoWidget::saturationChanged(int saturation) Signals that a video widgets's \a saturation has changed. \sa saturation() */ /*! Returns the size hint for the current back end, if there is one, or else the size hint from QWidget. */ QSize QVideoWidget::sizeHint() const { Q_D(const QVideoWidget); if (d->currentBackend) return d->currentBackend->sizeHint(); else return QWidget::sizeHint(); } /*! \reimp Current event \a event. Returns the value of the baseclass QWidget::event(QEvent *event) function. */ bool QVideoWidget::event(QEvent *event) { Q_D(QVideoWidget); if (event->type() == QEvent::WindowStateChange) { if (windowState() & Qt::WindowFullScreen) { if (d->currentControl) d->currentControl->setFullScreen(true); if (!d->wasFullScreen) emit fullScreenChanged(d->wasFullScreen = true); } else { if (d->currentControl) d->currentControl->setFullScreen(false); if (d->wasFullScreen) emit fullScreenChanged(d->wasFullScreen = false); } } return QWidget::event(event); } /*! \reimp Handles the show \a event. */ void QVideoWidget::showEvent(QShowEvent *event) { Q_D(QVideoWidget); QWidget::showEvent(event); // The window backend won't work for re-directed windows so use the renderer backend instead. if (d->windowBackend && window()->testAttribute(Qt::WA_DontShowOnScreen)) { d->windowBackend->releaseControl(); delete d->windowBackend; d->windowBackend = 0; d->createRendererBackend(); } if (d->currentBackend) d->currentBackend->showEvent(); } /*! \reimp Handles the hide \a event. */ void QVideoWidget::hideEvent(QHideEvent *event) { Q_D(QVideoWidget); if (d->currentBackend) d->currentBackend->hideEvent(event); QWidget::hideEvent(event); } /*! \reimp Handles the resize \a event. */ void QVideoWidget::resizeEvent(QResizeEvent *event) { Q_D(QVideoWidget); QWidget::resizeEvent(event); if (d->currentBackend) d->currentBackend->resizeEvent(event); } /*! \reimp Handles the move \a event. */ void QVideoWidget::moveEvent(QMoveEvent *event) { Q_D(QVideoWidget); if (d->currentBackend) d->currentBackend->moveEvent(event); } /*! \reimp Handles the paint \a event. */ void QVideoWidget::paintEvent(QPaintEvent *event) { Q_D(QVideoWidget); if (d->currentBackend) { d->currentBackend->paintEvent(event); } else if (testAttribute(Qt::WA_OpaquePaintEvent)) { QPainter painter(this); painter.fillRect(event->rect(), palette().window()); } } #if defined(Q_WS_WIN) /*! \internal */ bool QVideoWidget::winEvent(MSG *message, long *result) { return d_func()->windowBackend && d_func()->windowBackend->winEvent(message, result) ? true : QWidget::winEvent(message, result); } #endif #include "moc_qvideowidget.cpp" #include "moc_qvideowidget_p.cpp" QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/qvideowidget.h000066400000000000000000000111741225012771600317570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOWIDGET_H #define QVIDEOWIDGET_H #include #include #include QT_BEGIN_NAMESPACE class QMediaObject; class QVideoWidgetPrivate; class Q_MULTIMEDIAWIDGETS_EXPORT QVideoWidget : public QWidget, public QMediaBindableInterface { Q_OBJECT Q_INTERFACES(QMediaBindableInterface) Q_PROPERTY(QMediaObject* mediaObject READ mediaObject WRITE setMediaObject) Q_PROPERTY(bool fullScreen READ isFullScreen WRITE setFullScreen NOTIFY fullScreenChanged) Q_PROPERTY(Qt::AspectRatioMode aspectRatioMode READ aspectRatioMode WRITE setAspectRatioMode) Q_PROPERTY(int brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged) Q_PROPERTY(int contrast READ contrast WRITE setContrast NOTIFY contrastChanged) Q_PROPERTY(int hue READ hue WRITE setHue NOTIFY hueChanged) Q_PROPERTY(int saturation READ saturation WRITE setSaturation NOTIFY saturationChanged) public: QVideoWidget(QWidget *parent = 0); ~QVideoWidget(); QMediaObject *mediaObject() const; #ifdef Q_QDOC bool isFullScreen() const; #endif Qt::AspectRatioMode aspectRatioMode() const; int brightness() const; int contrast() const; int hue() const; int saturation() const; QSize sizeHint() const; public Q_SLOTS: void setFullScreen(bool fullScreen); void setAspectRatioMode(Qt::AspectRatioMode mode); void setBrightness(int brightness); void setContrast(int contrast); void setHue(int hue); void setSaturation(int saturation); Q_SIGNALS: void fullScreenChanged(bool fullScreen); void brightnessChanged(int brightness); void contrastChanged(int contrast); void hueChanged(int hue); void saturationChanged(int saturation); protected: bool event(QEvent *event); void showEvent(QShowEvent *event); void hideEvent(QHideEvent *event); void resizeEvent(QResizeEvent *event); void moveEvent(QMoveEvent *event); void paintEvent(QPaintEvent *event); bool setMediaObject(QMediaObject *object); #if defined(Q_WS_WIN) bool winEvent(MSG *message, long *result); #endif QVideoWidget(QVideoWidgetPrivate &dd, QWidget *parent); QVideoWidgetPrivate *d_ptr; private: Q_DECLARE_PRIVATE(QVideoWidget) Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_brightnessChanged(int)) Q_PRIVATE_SLOT(d_func(), void _q_contrastChanged(int)) Q_PRIVATE_SLOT(d_func(), void _q_hueChanged(int)) Q_PRIVATE_SLOT(d_func(), void _q_saturationChanged(int)) Q_PRIVATE_SLOT(d_func(), void _q_fullScreenChanged(bool)) Q_PRIVATE_SLOT(d_func(), void _q_dimensionsChanged()) }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/qvideowidget_p.h000066400000000000000000000175541225012771600323060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOWIDGET_P_H #define QVIDEOWIDGET_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include "qvideowidget.h" #ifndef QT_NO_OPENGL #include #endif #include "qpaintervideosurface_p.h" #include QT_BEGIN_NAMESPACE class QMediaService; class QVideoWidgetControlInterface { public: virtual ~QVideoWidgetControlInterface() {} virtual void setBrightness(int brightness) = 0; virtual void setContrast(int contrast) = 0; virtual void setHue(int hue) = 0; virtual void setSaturation(int saturation) = 0; virtual void setFullScreen(bool fullScreen) = 0; virtual Qt::AspectRatioMode aspectRatioMode() const = 0; virtual void setAspectRatioMode(Qt::AspectRatioMode mode) = 0; }; class QVideoWidgetBackend : public QObject, public QVideoWidgetControlInterface { Q_OBJECT public: virtual QSize sizeHint() const = 0; virtual void showEvent() = 0; virtual void hideEvent(QHideEvent *event) = 0; virtual void resizeEvent(QResizeEvent *event) = 0; virtual void moveEvent(QMoveEvent *event) = 0; virtual void paintEvent(QPaintEvent *event) = 0; }; class QVideoWidgetControl; class QVideoWidgetControlBackend : public QObject, public QVideoWidgetControlInterface { Q_OBJECT public: QVideoWidgetControlBackend(QMediaService *service, QVideoWidgetControl *control, QWidget *widget); void releaseControl(); void setBrightness(int brightness); void setContrast(int contrast); void setHue(int hue); void setSaturation(int saturation); void setFullScreen(bool fullScreen); Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); private: QMediaService *m_service; QVideoWidgetControl *m_widgetControl; }; class QVideoRendererControl; class QRendererVideoWidgetBackend : public QVideoWidgetBackend { Q_OBJECT public: QRendererVideoWidgetBackend(QMediaService *service, QVideoRendererControl *control, QWidget *widget); ~QRendererVideoWidgetBackend(); void releaseControl(); void clearSurface(); void setBrightness(int brightness); void setContrast(int contrast); void setHue(int hue); void setSaturation(int saturation); void setFullScreen(bool fullScreen); Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); QSize sizeHint() const; void showEvent(); void hideEvent(QHideEvent *event); void resizeEvent(QResizeEvent *event); void moveEvent(QMoveEvent *event); void paintEvent(QPaintEvent *event); Q_SIGNALS: void fullScreenChanged(bool fullScreen); void brightnessChanged(int brightness); void contrastChanged(int contrast); void hueChanged(int hue); void saturationChanged(int saturation); private Q_SLOTS: void formatChanged(const QVideoSurfaceFormat &format); void frameChanged(); private: void updateRects(); QMediaService *m_service; QVideoRendererControl *m_rendererControl; QWidget *m_widget; QPainterVideoSurface *m_surface; Qt::AspectRatioMode m_aspectRatioMode; QRect m_boundingRect; QRectF m_sourceRect; QSize m_nativeSize; bool m_updatePaintDevice; }; class QVideoWindowControl; class QWindowVideoWidgetBackend : public QVideoWidgetBackend { Q_OBJECT public: QWindowVideoWidgetBackend(QMediaService *service, QVideoWindowControl *control, QWidget *widget); ~QWindowVideoWidgetBackend(); void releaseControl(); void setBrightness(int brightness); void setContrast(int contrast); void setHue(int hue); void setSaturation(int saturation); void setFullScreen(bool fullScreen); Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); QSize sizeHint() const; void showEvent(); void hideEvent(QHideEvent *event); void resizeEvent(QResizeEvent *event); void moveEvent(QMoveEvent *event); void paintEvent(QPaintEvent *event); #if defined(Q_WS_WIN) bool winEvent(MSG *message, long *result); #endif private: QMediaService *m_service; QVideoWindowControl *m_windowControl; QWidget *m_widget; Qt::AspectRatioMode m_aspectRatioMode; QSize m_pixelAspectRatio; }; class QMediaService; class QVideoOutputControl; class QVideoWidgetPrivate { Q_DECLARE_PUBLIC(QVideoWidget) public: QVideoWidgetPrivate() : q_ptr(0) , mediaObject(0) , service(0) , widgetBackend(0) , windowBackend(0) , rendererBackend(0) , currentControl(0) , currentBackend(0) , brightness(0) , contrast(0) , hue(0) , saturation(0) , aspectRatioMode(Qt::KeepAspectRatio) , nonFullScreenFlags(0) , wasFullScreen(false) { } QVideoWidget *q_ptr; QPointer mediaObject; QMediaService *service; QVideoWidgetControlBackend *widgetBackend; QWindowVideoWidgetBackend *windowBackend; QRendererVideoWidgetBackend *rendererBackend; QVideoWidgetControlInterface *currentControl; QVideoWidgetBackend *currentBackend; int brightness; int contrast; int hue; int saturation; Qt::AspectRatioMode aspectRatioMode; Qt::WindowFlags nonFullScreenFlags; bool wasFullScreen; bool createWidgetBackend(); bool createWindowBackend(); bool createRendererBackend(); void setCurrentControl(QVideoWidgetControlInterface *control); void clearService(); void _q_serviceDestroyed(); void _q_brightnessChanged(int brightness); void _q_contrastChanged(int contrast); void _q_hueChanged(int hue); void _q_saturationChanged(int saturation); void _q_fullScreenChanged(bool fullScreen); void _q_dimensionsChanged(); }; QT_END_NAMESPACE #endif qvideowidgetcontrol.cpp000066400000000000000000000141151225012771600336320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qvideowidgetcontrol.h" #include "private/qmediacontrol_p.h" QT_BEGIN_NAMESPACE /*! \class QVideoWidgetControl \brief The QVideoWidgetControl class provides a media control which implements a video widget. \inmodule QtMultimediaWidgets \ingroup multimedia-serv The videoWidget() property of QVideoWidgetControl provides a pointer to a video widget implemented by the control's media service. This widget is owned by the media service and so care should be taken not to delete it. \snippet multimedia-snippets/video.cpp Video widget control QVideoWidgetControl is one of number of possible video output controls. The interface name of QVideoWidgetControl is \c org.qt-project.qt.videowidgetcontrol/5.0 as defined in QVideoWidgetControl_iid. \sa QMediaService::requestControl(), QVideoWidget */ /*! \macro QVideoWidgetControl_iid \c org.qt-project.qt.videowidgetcontrol/5.0 Defines the interface name of the QVideoWidgetControl class. \relates QVideoWidgetControl */ /*! Constructs a new video widget control with the given \a parent. */ QVideoWidgetControl::QVideoWidgetControl(QObject *parent) :QMediaControl(parent) { } /*! Destroys a video widget control. */ QVideoWidgetControl::~QVideoWidgetControl() { } /*! \fn QVideoWidgetControl::isFullScreen() const Returns true if the video is shown using the complete screen. */ /*! \fn QVideoWidgetControl::setFullScreen(bool fullScreen) Sets whether a video widget is in \a fullScreen mode. */ /*! \fn QVideoWidgetControl::fullScreenChanged(bool fullScreen) Signals that the \a fullScreen state of a video widget has changed. */ /*! \fn QVideoWidgetControl::aspectRatioMode() const Returns how video is scaled to fit the widget with respect to its aspect ratio. */ /*! \fn QVideoWidgetControl::setAspectRatioMode(Qt::AspectRatioMode mode) Sets the aspect ratio \a mode which determines how video is scaled to the fit the widget with respect to its aspect ratio. */ /*! \fn QVideoWidgetControl::brightness() const Returns the brightness adjustment applied to a video. Valid brightness values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::setBrightness(int brightness) Sets a \a brightness adjustment for a video. Valid brightness values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::brightnessChanged(int brightness) Signals that a video widget's \a brightness adjustment has changed. */ /*! \fn QVideoWidgetControl::contrast() const Returns the contrast adjustment applied to a video. Valid contrast values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::setContrast(int contrast) Sets the contrast adjustment for a video widget to \a contrast. Valid contrast values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::contrastChanged(int contrast) Signals that a video widget's \a contrast adjustment has changed. */ /*! \fn QVideoWidgetControl::hue() const Returns the hue adjustment applied to a video widget. Value hue values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::setHue(int hue) Sets a \a hue adjustment for a video widget. Valid hue values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::hueChanged(int hue) Signals that a video widget's \a hue adjustment has changed. */ /*! \fn QVideoWidgetControl::saturation() const Returns the saturation adjustment applied to a video widget. Value saturation values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::setSaturation(int saturation) Sets a \a saturation adjustment for a video widget. Valid saturation values range between -100 and 100, the default is 0. */ /*! \fn QVideoWidgetControl::saturationChanged(int saturation) Signals that a video widget's \a saturation adjustment has changed. */ /*! \fn QVideoWidgetControl::videoWidget() Returns the QWidget. */ #include "moc_qvideowidgetcontrol.cpp" QT_END_NAMESPACE qvideowidgetcontrol.h000066400000000000000000000064651225012771600333100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/multimediawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QVIDEOWIDGETCONTROL_H #define QVIDEOWIDGETCONTROL_H #include #include #include QT_BEGIN_NAMESPACE class QVideoWidgetControlPrivate; class Q_MULTIMEDIAWIDGETS_EXPORT QVideoWidgetControl : public QMediaControl { Q_OBJECT public: virtual ~QVideoWidgetControl(); virtual QWidget *videoWidget() = 0; virtual Qt::AspectRatioMode aspectRatioMode() const = 0; virtual void setAspectRatioMode(Qt::AspectRatioMode mode) = 0; virtual bool isFullScreen() const = 0; virtual void setFullScreen(bool fullScreen) = 0; virtual int brightness() const = 0; virtual void setBrightness(int brightness) = 0; virtual int contrast() const = 0; virtual void setContrast(int contrast) = 0; virtual int hue() const = 0; virtual void setHue(int hue) = 0; virtual int saturation() const = 0; virtual void setSaturation(int saturation) = 0; Q_SIGNALS: void fullScreenChanged(bool fullScreen); void brightnessChanged(int brightness); void contrastChanged(int contrast); void hueChanged(int hue); void saturationChanged(int saturation); protected: QVideoWidgetControl(QObject *parent = 0); }; #define QVideoWidgetControl_iid "org.qt-project.qt.videowidgetcontrol/5.0" Q_MEDIA_DECLARE_CONTROL(QVideoWidgetControl, QVideoWidgetControl_iid) QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/000077500000000000000000000000001225012771600250475ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/000077500000000000000000000000001225012771600264675ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/android.pro000066400000000000000000000000751225012771600306330ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += mediaplayer \ jar qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/000077500000000000000000000000001225012771600272435ustar00rootroot00000000000000AndroidManifest.xml000066400000000000000000000005071225012771600327570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/bundledjar.pro000066400000000000000000000001121225012771600320710ustar00rootroot00000000000000TARGET = QtMultimedia-bundled CONFIG += bundled_jar_file include(jar.pri) distributedjar.pro000066400000000000000000000000471225012771600327260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jarTARGET = QtMultimedia include(jar.pri) qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/jar.pri000066400000000000000000000007151225012771600305360ustar00rootroot00000000000000load(qt_build_paths) CONFIG += java DESTDIR = $$MODULE_BASE_OUTDIR/jar API_VERSION = android-11 JAVACLASSPATH += $$PWD/src JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTexture.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java # install target.path = $$[QT_INSTALL_PREFIX]/jar INSTALLS += target qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/jar.pro000066400000000000000000000000771225012771600305450ustar00rootroot00000000000000TEMPLATE=subdirs SUBDIRS += distributedjar.pro bundledjar.pro qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/000077500000000000000000000000001225012771600300325ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/000077500000000000000000000000001225012771600306215ustar00rootroot00000000000000qtproject/000077500000000000000000000000001225012771600325555ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/orgqt5/000077500000000000000000000000001225012771600332665ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtprojectandroid/000077500000000000000000000000001225012771600347065ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtproject/qt5multimedia/000077500000000000000000000000001225012771600370405ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtproject/qt5/androidQtAndroidMediaPlayer.java000066400000000000000000000300541225012771600437070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtMultimedia module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ package org.qtproject.qt5.android.multimedia; import java.io.IOException; import java.lang.String; // API is level is < 9 unless marked otherwise. import android.app.Activity; import android.content.Context; import android.media.MediaPlayer; import android.net.Uri; import android.util.Log; public class QtAndroidMediaPlayer extends MediaPlayer { // Native callback functions for MediaPlayer native public void onErrorNative(int what, int extra, long id); native public void onBufferingUpdateNative(int percent, long id); native public void onInfoNative(int what, int extra, long id); native public void onMediaPlayerInfoNative(int what, int extra, long id); native public void onVideoSizeChangedNative(int width, int height, long id); private Uri mUri = null; private final long mID; private boolean mMuted = false; private boolean mPreparing = false; private boolean mInitialized = false; private int mVolume = 100; private static final String TAG = "Qt MediaPlayer"; private static Context mApplicationContext = null; final int MEDIA_PLAYER_INVALID_STATE = 1; final int MEDIA_PLAYER_PREPARING = 2; final int MEDIA_PLAYER_READY = 3; final int MEDIA_PLAYER_DURATION = 4; final int MEDIA_PLAYER_PROGRESS = 5; final int MEDIA_PLAYER_FINISHED = 6; // Activity set by Qt on load. static public void setActivity(final Activity activity) { try { mApplicationContext = activity.getApplicationContext(); } catch(final Exception e) { Log.d(TAG, e.getMessage()); } } private class ProgressWatcher implements Runnable { @Override public void run() { final int duratation = getDuration(); int currentPosition = getCurrentPosition(); try { while (duratation >= currentPosition && isPlaying()) { onMediaPlayerInfoNative(MEDIA_PLAYER_PROGRESS, currentPosition, mID); Thread.sleep(1000); currentPosition = getCurrentPosition(); } } catch (final InterruptedException e) { Log.d(TAG, e.getMessage()); return; } } } /** * MediaPlayer OnErrorListener */ private class MediaPlayerErrorListener implements MediaPlayer.OnErrorListener { @Override public boolean onError(final MediaPlayer mp, final int what, final int extra) { reset(); onErrorNative(what, extra, mID); return true; } } /** * MediaPlayer OnBufferingListener */ private class MediaPlayerBufferingListener implements MediaPlayer.OnBufferingUpdateListener { private int mBufferPercent = -1; @Override public void onBufferingUpdate(final android.media.MediaPlayer mp, final int percent) { // Avoid updates when percent is unchanged. // E.g., we keep getting updates when percent == 100 if (mBufferPercent == percent) return; onBufferingUpdateNative((mBufferPercent = percent), mID); } } /** * MediaPlayer OnCompletionListener */ private class MediaPlayerCompletionListener implements MediaPlayer.OnCompletionListener { @Override public void onCompletion(final MediaPlayer mp) { onMediaPlayerInfoNative(MEDIA_PLAYER_FINISHED, 0, mID); reset(); } } /** * MediaPlayer OnInfoListener */ private class MediaPlayerInfoListener implements MediaPlayer.OnInfoListener { @Override public boolean onInfo(final MediaPlayer mp, final int what, final int extra) { onInfoNative(what, extra, mID); return true; } } /** * MediaPlayer OnPreparedListener */ private class MediaPlayerPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(final MediaPlayer mp) { onMediaPlayerInfoNative(MEDIA_PLAYER_DURATION, getDuration(), mID); onMediaPlayerInfoNative(MEDIA_PLAYER_READY, 0, mID); mPreparing = false; } } /** * MediaPlayer OnSeekCompleteListener */ private class MediaPlayerSeekCompleteListener implements MediaPlayer.OnSeekCompleteListener { @Override public void onSeekComplete(final MediaPlayer mp) { onMediaPlayerInfoNative(MEDIA_PLAYER_PROGRESS, getCurrentPosition(), mID); } } /** * MediaPlayer OnVideoSizeChangedListener */ private class MediaPlayerVideoSizeChangedListener implements MediaPlayer.OnVideoSizeChangedListener { @Override public void onVideoSizeChanged(final MediaPlayer mp, final int width, final int height) { onVideoSizeChangedNative(width, height, mID); } } public QtAndroidMediaPlayer(final long id) { super(); mID = id; setOnBufferingUpdateListener(new MediaPlayerBufferingListener()); setOnCompletionListener(new MediaPlayerCompletionListener()); setOnInfoListener(new MediaPlayerInfoListener()); setOnSeekCompleteListener(new MediaPlayerSeekCompleteListener()); setOnVideoSizeChangedListener(new MediaPlayerVideoSizeChangedListener()); setOnErrorListener(new MediaPlayerErrorListener()); } @Override public void start() { if (!mInitialized) { onMediaPlayerInfoNative(MEDIA_PLAYER_INVALID_STATE, 0, mID); return; } if (mApplicationContext == null) return; if (mPreparing) return; if (isPlaying()) return; try { super.start(); Thread progressThread = new Thread(new ProgressWatcher()); progressThread.start(); } catch (final IllegalStateException e) { reset(); Log.d(TAG, e.getMessage()); } } @Override public void pause() { if (!isPlaying()) return; try { super.pause(); } catch (final IllegalStateException e) { reset(); Log.d(TAG, e.getMessage()); } } @Override public void stop() { if (!mInitialized) return; try { super.stop(); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } finally { reset(); } } @Override public void seekTo(final int msec) { if (!mInitialized) return; try { super.seekTo(msec); onMediaPlayerInfoNative(MEDIA_PLAYER_PROGRESS, msec, mID); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } } @Override public boolean isPlaying() { boolean playing = false; if (!mInitialized) return playing; try { playing = super.isPlaying(); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } return playing; } public void setMediaPath(final String path) { if (mInitialized) reset(); try { mPreparing = true; onMediaPlayerInfoNative(MEDIA_PLAYER_PREPARING, 0, mID); mUri = Uri.parse(path); setDataSource(mApplicationContext, mUri); mInitialized = true; setOnPreparedListener(new MediaPlayerPreparedListener()); prepareAsync(); } catch (final IOException e) { mPreparing = false; onErrorNative(MEDIA_ERROR_UNKNOWN, /* MEDIA_ERROR_UNSUPPORTED= */ -1010, mID); } catch (final IllegalArgumentException e) { Log.d(TAG, e.getMessage()); } catch (final SecurityException e) { Log.d(TAG, e.getMessage()); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } catch (final NullPointerException e) { Log.d(TAG, e.getMessage()); } } @Override public int getCurrentPosition() { int currentPosition = 0; if (!mInitialized) return currentPosition; try { currentPosition = super.getCurrentPosition(); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } return currentPosition; } @Override public int getDuration() { int duration = 0; if (!mInitialized) return duration; try { duration = super.getDuration(); } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } return duration; } private float adjustVolume(final int volume) { if (volume < 1) return 0.0f; if (volume > 98) return 1.0f; return (float) (1-(Math.log(100-volume)/Math.log(100))); } public void setVolume(int volume) { if (volume < 0) volume = 0; if (volume > 100) volume = 100; float newVolume = adjustVolume(volume); try { super.setVolume(newVolume, newVolume); if (!mMuted) mVolume = volume; } catch (final IllegalStateException e) { Log.d(TAG, e.getMessage()); } } public int getVolume() { return mVolume; } public void mute(final boolean mute) { mMuted = mute; setVolume(mute ? 0 : mVolume); } public boolean isMuted() { return mMuted; } @Override public void reset() { mInitialized = false; super.reset(); } } QtSurfaceTexture.java000066400000000000000000000053771225012771600431750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtMultimedia module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ package org.qtproject.qt5.android.multimedia; import android.graphics.SurfaceTexture; public class QtSurfaceTexture implements SurfaceTexture.OnFrameAvailableListener { public SurfaceTexture surfaceTexture; private int texID; public QtSurfaceTexture(int texName) { texID = texName; surfaceTexture = new SurfaceTexture(texName); surfaceTexture.setOnFrameAvailableListener(this); } public void getTransformMatrix(float[] mtx) { surfaceTexture.getTransformMatrix(mtx); } public void updateTexImage() { surfaceTexture.updateTexImage(); } public void onFrameAvailable(SurfaceTexture surfaceTexture) { notifyFrameAvailable(texID); } private static native void notifyFrameAvailable(int id); } QtSurfaceTextureHolder.java000066400000000000000000000062621225012771600443250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtMultimedia module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ package org.qtproject.qt5.android.multimedia; import android.view.SurfaceHolder; import android.view.Surface; import android.graphics.Rect; import android.graphics.Canvas; public class QtSurfaceTextureHolder implements SurfaceHolder { private Surface surfaceTexture; public QtSurfaceTextureHolder(Surface surface) { surfaceTexture = surface; } public void addCallback(SurfaceHolder.Callback callback) { } public Surface getSurface() { return surfaceTexture; } public Rect getSurfaceFrame() { return new Rect(); } public boolean isCreating() { return false; } public Canvas lockCanvas(Rect dirty) { return new Canvas(); } public Canvas lockCanvas() { return new Canvas(); } public void removeCallback(SurfaceHolder.Callback callback) { } public void setFixedSize(int width, int height) { } public void setFormat(int format) { } public void setKeepScreenOn(boolean screenOn) { } public void setSizeFromLayout() { } public void setType(int type) { } public void unlockCanvasAndPost(Canvas canvas) { } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/000077500000000000000000000000001225012771600307635ustar00rootroot00000000000000mediaplayer.json000066400000000000000000000000621225012771600340710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer{ "Keys": ["org.qt-project.qt.mediaplayer"] } mediaplayer.pro000066400000000000000000000012341225012771600337220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayerTARGET = androidmediaplayer QT += multimedia-private gui-private platformsupport-private network PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = QAndroidMediaPlayerServicePlugin load(qt_plugin) HEADERS += \ qandroidmediaplayercontrol.h \ qandroidmediaservice.h \ qandroidmetadatareadercontrol.h \ qandroidmediaserviceplugin.h \ qandroidvideorendercontrol.h \ qandroidvideooutput.h SOURCES += \ qandroidmediaplayercontrol.cpp \ qandroidmediaservice.cpp \ qandroidmetadatareadercontrol.cpp \ qandroidmediaserviceplugin.cpp \ qandroidvideorendercontrol.cpp OTHER_FILES += mediaplayer.json include (../wrappers/wrappers.pri) qandroidmediaplayercontrol.cpp000066400000000000000000000337671225012771600370470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qandroidmediaplayercontrol.h" #include "jmediaplayer.h" #include "qandroidvideooutput.h" QT_BEGIN_NAMESPACE QAndroidMediaPlayerControl::QAndroidMediaPlayerControl(QObject *parent) : QMediaPlayerControl(parent), mMediaPlayer(new JMediaPlayer), mCurrentState(QMediaPlayer::StoppedState), mCurrentMediaStatus(QMediaPlayer::NoMedia), mMediaStream(0), mVideoOutput(0), mSeekable(true), mBufferPercent(-1), mAudioAvailable(false), mVideoAvailable(false), mBuffering(false), mMediaPlayerReady(false), mPendingPosition(-1) { connect(mMediaPlayer, SIGNAL(bufferingUpdate(qint32)), this, SLOT(onBufferChanged(qint32))); connect(mMediaPlayer, SIGNAL(info(qint32, qint32)), this, SLOT(onInfo(qint32, qint32))); connect(mMediaPlayer, SIGNAL(error(qint32, qint32)), this, SLOT(onError(qint32, qint32))); connect(mMediaPlayer, SIGNAL(mediaPlayerInfo(qint32, qint32)), this, SLOT(onMediaPlayerInfo(qint32, qint32))); connect(mMediaPlayer, SIGNAL(videoSizeChanged(qint32,qint32)), this, SLOT(onVideoSizeChanged(qint32,qint32))); } QAndroidMediaPlayerControl::~QAndroidMediaPlayerControl() { delete mMediaPlayer; } QMediaPlayer::State QAndroidMediaPlayerControl::state() const { return mCurrentState; } QMediaPlayer::MediaStatus QAndroidMediaPlayerControl::mediaStatus() const { return mCurrentMediaStatus; } qint64 QAndroidMediaPlayerControl::duration() const { return (mCurrentMediaStatus == QMediaPlayer::InvalidMedia || mCurrentMediaStatus == QMediaPlayer::NoMedia) ? 0 : mMediaPlayer->getDuration(); } qint64 QAndroidMediaPlayerControl::position() const { if (!mMediaPlayerReady) return mPendingPosition < 0 ? 0 : mPendingPosition; return mMediaPlayer->getCurrentPosition(); } void QAndroidMediaPlayerControl::setPosition(qint64 position) { if (!mSeekable) return; const int seekPosition = (position > INT_MAX) ? INT_MAX : position; if (!mMediaPlayerReady) { mPendingPosition = seekPosition; Q_EMIT positionChanged(seekPosition); return; } mMediaPlayer->seekTo(seekPosition); mPendingPosition = -1; } int QAndroidMediaPlayerControl::volume() const { return mMediaPlayer->volume(); } void QAndroidMediaPlayerControl::setVolume(int volume) { mMediaPlayer->setVolume(volume); Q_EMIT volumeChanged(volume); } bool QAndroidMediaPlayerControl::isMuted() const { return mMediaPlayer->isMuted(); } void QAndroidMediaPlayerControl::setMuted(bool muted) { mMediaPlayer->setMuted(muted); Q_EMIT mutedChanged(muted); } int QAndroidMediaPlayerControl::bufferStatus() const { return mBufferPercent; } bool QAndroidMediaPlayerControl::isAudioAvailable() const { return mAudioAvailable; } bool QAndroidMediaPlayerControl::isVideoAvailable() const { return mVideoAvailable; } bool QAndroidMediaPlayerControl::isSeekable() const { return mSeekable; } QMediaTimeRange QAndroidMediaPlayerControl::availablePlaybackRanges() const { return mAvailablePlaybackRange; } void QAndroidMediaPlayerControl::updateAvailablePlaybackRanges() { if (mBuffering) { const qint64 pos = position(); const qint64 end = (duration() / 100) * mBufferPercent; mAvailablePlaybackRange.addInterval(pos, end); } else if (mSeekable) { mAvailablePlaybackRange = QMediaTimeRange(0, duration()); } else { mAvailablePlaybackRange = QMediaTimeRange(); } Q_EMIT availablePlaybackRangesChanged(mAvailablePlaybackRange); } qreal QAndroidMediaPlayerControl::playbackRate() const { return 1.0f; } void QAndroidMediaPlayerControl::setPlaybackRate(qreal rate) { Q_UNUSED(rate); } QMediaContent QAndroidMediaPlayerControl::media() const { return mMediaContent; } const QIODevice *QAndroidMediaPlayerControl::mediaStream() const { return mMediaStream; } void QAndroidMediaPlayerControl::setMedia(const QMediaContent &mediaContent, QIODevice *stream) { mMediaContent = mediaContent; mMediaStream = stream; const QString uri = mediaContent.canonicalUrl().toString(); if (!uri.isEmpty()) mMediaPlayer->setDataSource(uri); else setMediaStatus(QMediaPlayer::NoMedia); Q_EMIT mediaChanged(mMediaContent); resetBufferingProgress(); // reset some properties setAudioAvailable(false); setVideoAvailable(false); setSeekable(true); } void QAndroidMediaPlayerControl::setVideoOutput(QAndroidVideoOutput *videoOutput) { if (mVideoOutput) mVideoOutput->stop(); mVideoOutput = videoOutput; } void QAndroidMediaPlayerControl::play() { if (!mMediaPlayerReady) { mPendingState = QMediaPlayer::PlayingState; if (mCurrentState == QMediaPlayer::StoppedState && !mMediaContent.isNull() && mCurrentMediaStatus != QMediaPlayer::LoadingMedia) { setMedia(mMediaContent, 0); } return; } mMediaPlayer->play(); setState(QMediaPlayer::PlayingState); } void QAndroidMediaPlayerControl::pause() { if (!mMediaPlayerReady) { mPendingState = QMediaPlayer::PausedState; return; } mMediaPlayer->pause(); setState(QMediaPlayer::PausedState); } void QAndroidMediaPlayerControl::stop() { mMediaPlayer->stop(); setState(QMediaPlayer::StoppedState); } void QAndroidMediaPlayerControl::onInfo(qint32 what, qint32 extra) { Q_UNUSED(extra); switch (what) { case JMediaPlayer::MEDIA_INFO_UNKNOWN: break; case JMediaPlayer::MEDIA_INFO_VIDEO_TRACK_LAGGING: // IGNORE break; case JMediaPlayer::MEDIA_INFO_VIDEO_RENDERING_START: break; case JMediaPlayer::MEDIA_INFO_BUFFERING_START: mPendingState = mCurrentState; setState(QMediaPlayer::PausedState); setMediaStatus(QMediaPlayer::StalledMedia); break; case JMediaPlayer::MEDIA_INFO_BUFFERING_END: setMediaStatus(mBufferPercent == 100 ? QMediaPlayer::BufferedMedia : QMediaPlayer::BufferingMedia); flushPendingStates(); break; case JMediaPlayer::MEDIA_INFO_BAD_INTERLEAVING: break; case JMediaPlayer::MEDIA_INFO_NOT_SEEKABLE: setSeekable(false); break; case JMediaPlayer::MEDIA_INFO_METADATA_UPDATE: Q_EMIT metaDataUpdated(); break; } } void QAndroidMediaPlayerControl::onMediaPlayerInfo(qint32 what, qint32 extra) { switch (what) { case JMediaPlayer::MEDIA_PLAYER_INVALID_STATE: setError(what, QStringLiteral("Error: Invalid state")); break; case JMediaPlayer::MEDIA_PLAYER_PREPARING: setMediaStatus(QMediaPlayer::LoadingMedia); setState(QMediaPlayer::StoppedState); break; case JMediaPlayer::MEDIA_PLAYER_READY: if (mBuffering) { setMediaStatus(mBufferPercent == 100 ? QMediaPlayer::BufferedMedia : QMediaPlayer::BufferingMedia); } else { setMediaStatus(QMediaPlayer::LoadedMedia); mBufferPercent = 100; Q_EMIT bufferStatusChanged(mBufferPercent); updateAvailablePlaybackRanges(); } setAudioAvailable(true); mMediaPlayerReady = true; flushPendingStates(); break; case JMediaPlayer::MEDIA_PLAYER_DURATION: Q_EMIT durationChanged(extra); break; case JMediaPlayer::MEDIA_PLAYER_PROGRESS: Q_EMIT positionChanged(extra); break; case JMediaPlayer::MEDIA_PLAYER_FINISHED: setState(QMediaPlayer::StoppedState); setMediaStatus(QMediaPlayer::EndOfMedia); break; } } void QAndroidMediaPlayerControl::onError(qint32 what, qint32 extra) { QString errorString; QMediaPlayer::Error error = QMediaPlayer::ResourceError; switch (what) { case JMediaPlayer::MEDIA_ERROR_UNKNOWN: errorString = QLatin1String("Error:"); break; case JMediaPlayer::MEDIA_ERROR_SERVER_DIED: errorString = QLatin1String("Error: Server died"); error = QMediaPlayer::ServiceMissingError; break; } switch (extra) { case JMediaPlayer::MEDIA_ERROR_IO: // Network OR file error errorString += QLatin1String(" (I/O operation failed)"); error = QMediaPlayer::NetworkError; setMediaStatus(QMediaPlayer::InvalidMedia); break; case JMediaPlayer::MEDIA_ERROR_MALFORMED: errorString += QLatin1String(" (Malformed bitstream)"); error = QMediaPlayer::FormatError; setMediaStatus(QMediaPlayer::InvalidMedia); break; case JMediaPlayer::MEDIA_ERROR_UNSUPPORTED: errorString += QLatin1String(" (Unsupported media)"); error = QMediaPlayer::FormatError; setMediaStatus(QMediaPlayer::InvalidMedia); break; case JMediaPlayer::MEDIA_ERROR_TIMED_OUT: errorString += QLatin1String(" (Timed out)"); break; case JMediaPlayer::MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: errorString += QLatin1String(" (Unable to start progressive playback')"); error = QMediaPlayer::FormatError; setMediaStatus(QMediaPlayer::InvalidMedia); break; } setError(error, errorString); } void QAndroidMediaPlayerControl::onBufferChanged(qint32 percent) { mBuffering = true; mBufferPercent = percent; Q_EMIT bufferStatusChanged(mBufferPercent); updateAvailablePlaybackRanges(); if (mBufferPercent == 100) setMediaStatus(QMediaPlayer::BufferedMedia); } void QAndroidMediaPlayerControl::onVideoSizeChanged(qint32 width, qint32 height) { if (width == 0 || height == 0) return; setVideoAvailable(true); if (mVideoOutput) { if (!mMediaPlayer->display()) mMediaPlayer->setDisplay(mVideoOutput->surfaceHolder()); if (mMediaPlayer->display()) mVideoOutput->setVideoSize(QSize(width, height)); } } void QAndroidMediaPlayerControl::setState(QMediaPlayer::State state) { if (mCurrentState == state) return; if (state == QMediaPlayer::StoppedState) { if (mVideoOutput) mVideoOutput->stop(); resetBufferingProgress(); mMediaPlayerReady = false; mPendingPosition = -1; Q_EMIT positionChanged(0); } mCurrentState = state; Q_EMIT stateChanged(mCurrentState); } void QAndroidMediaPlayerControl::setMediaStatus(QMediaPlayer::MediaStatus status) { if (mCurrentMediaStatus == status) return; if (status == QMediaPlayer::NoMedia || status == QMediaPlayer::InvalidMedia) Q_EMIT durationChanged(0); mCurrentMediaStatus = status; Q_EMIT mediaStatusChanged(mCurrentMediaStatus); } void QAndroidMediaPlayerControl::setError(int error, const QString &errorString) { setState(QMediaPlayer::StoppedState); Q_EMIT QMediaPlayerControl::error(error, errorString); } void QAndroidMediaPlayerControl::setSeekable(bool seekable) { if (mSeekable == seekable) return; mSeekable = seekable; Q_EMIT seekableChanged(mSeekable); } void QAndroidMediaPlayerControl::setAudioAvailable(bool available) { if (mAudioAvailable == available) return; mAudioAvailable = available; Q_EMIT audioAvailableChanged(mAudioAvailable); } void QAndroidMediaPlayerControl::setVideoAvailable(bool available) { if (mVideoAvailable == available) return; mVideoAvailable = available; Q_EMIT videoAvailableChanged(mVideoAvailable); } void QAndroidMediaPlayerControl::resetBufferingProgress() { mBuffering = false; mBufferPercent = 0; mAvailablePlaybackRange = QMediaTimeRange(); Q_EMIT bufferStatusChanged(mBufferPercent); } void QAndroidMediaPlayerControl::flushPendingStates() { switch (mPendingState) { case QMediaPlayer::PlayingState: if (mPendingPosition > -1) setPosition(mPendingPosition); play(); break; case QMediaPlayer::PausedState: pause(); break; case QMediaPlayer::StoppedState: stop(); break; } } QT_END_NAMESPACE qandroidmediaplayercontrol.h000066400000000000000000000112471225012771600365010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDMEDIAPLAYERCONTROL_H #define QANDROIDMEDIAPLAYERCONTROL_H #include #include QT_BEGIN_NAMESPACE class JMediaPlayer; class QAndroidVideoOutput; class QAndroidMediaPlayerControl : public QMediaPlayerControl { Q_OBJECT public: explicit QAndroidMediaPlayerControl(QObject *parent = 0); ~QAndroidMediaPlayerControl() Q_DECL_OVERRIDE; QMediaPlayer::State state() const Q_DECL_OVERRIDE; QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; qint64 duration() const Q_DECL_OVERRIDE; qint64 position() const Q_DECL_OVERRIDE; int volume() const Q_DECL_OVERRIDE; bool isMuted() const Q_DECL_OVERRIDE; int bufferStatus() const Q_DECL_OVERRIDE; bool isAudioAvailable() const Q_DECL_OVERRIDE; bool isVideoAvailable() const Q_DECL_OVERRIDE; bool isSeekable() const Q_DECL_OVERRIDE; QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; qreal playbackRate() const Q_DECL_OVERRIDE; void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; QMediaContent media() const Q_DECL_OVERRIDE; const QIODevice *mediaStream() const Q_DECL_OVERRIDE; void setMedia(const QMediaContent &mediaContent, QIODevice *stream) Q_DECL_OVERRIDE; void setVideoOutput(QAndroidVideoOutput *videoOutput); Q_SIGNALS: void metaDataUpdated(); public Q_SLOTS: void setPosition(qint64 position) Q_DECL_OVERRIDE; void play() Q_DECL_OVERRIDE; void pause() Q_DECL_OVERRIDE; void stop() Q_DECL_OVERRIDE; void setVolume(int volume) Q_DECL_OVERRIDE; void setMuted(bool muted) Q_DECL_OVERRIDE; private Q_SLOTS: void onError(qint32 what, qint32 extra); void onInfo(qint32 what, qint32 extra); void onMediaPlayerInfo(qint32 what, qint32 extra); void onBufferChanged(qint32 percent); void onVideoSizeChanged(qint32 width, qint32 height); private: JMediaPlayer *mMediaPlayer; QMediaPlayer::State mCurrentState; QMediaPlayer::MediaStatus mCurrentMediaStatus; QMediaContent mMediaContent; QIODevice *mMediaStream; QAndroidVideoOutput *mVideoOutput; bool mSeekable; int mBufferPercent; bool mAudioAvailable; bool mVideoAvailable; bool mBuffering; QMediaTimeRange mAvailablePlaybackRange; bool mMediaPlayerReady; QMediaPlayer::State mPendingState; qint64 mPendingPosition; void setState(QMediaPlayer::State state); void setMediaStatus(QMediaPlayer::MediaStatus status); void setError(int error, const QString &errorString); void setSeekable(bool seekable); void setAudioAvailable(bool available); void setVideoAvailable(bool available); void updateAvailablePlaybackRanges(); void resetBufferingProgress(); void flushPendingStates(); }; QT_END_NAMESPACE #endif // QANDROIDMEDIAPLAYERCONTROL_H qandroidmediaservice.cpp000066400000000000000000000067361225012771600356060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qandroidmediaservice.h" #include "qandroidmediaplayercontrol.h" #include "qandroidmetadatareadercontrol.h" #include "qandroidvideorendercontrol.h" QT_BEGIN_NAMESPACE QAndroidMediaService::QAndroidMediaService(QObject *parent) : QMediaService(parent) , mVideoRendererControl(0) { mMediaControl = new QAndroidMediaPlayerControl; mMetadataControl = new QAndroidMetaDataReaderControl; connect(mMediaControl, SIGNAL(mediaChanged(QMediaContent)), mMetadataControl, SLOT(onMediaChanged(QMediaContent))); connect(mMediaControl, SIGNAL(metaDataUpdated()), mMetadataControl, SLOT(onUpdateMetaData())); } QAndroidMediaService::~QAndroidMediaService() { delete mMediaControl; delete mMetadataControl; delete mVideoRendererControl; } QMediaControl *QAndroidMediaService::requestControl(const char *name) { if (qstrcmp(name, QMediaPlayerControl_iid) == 0) return mMediaControl; if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) return mMetadataControl; if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!mVideoRendererControl) { mVideoRendererControl = new QAndroidVideoRendererControl; mMediaControl->setVideoOutput(mVideoRendererControl); return mVideoRendererControl; } } return 0; } void QAndroidMediaService::releaseControl(QMediaControl *control) { if (control == mVideoRendererControl) { mMediaControl->setVideoOutput(0); delete mVideoRendererControl; mVideoRendererControl = 0; } } QT_END_NAMESPACE qandroidmediaservice.h000066400000000000000000000052101225012771600352350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDMEDIASERVICE_H #define QANDROIDMEDIASERVICE_H #include QT_BEGIN_NAMESPACE class QAndroidMediaPlayerControl; class QAndroidMetaDataReaderControl; class QAndroidVideoRendererControl; class QAndroidMediaService : public QMediaService { Q_OBJECT public: explicit QAndroidMediaService(QObject *parent = 0); ~QAndroidMediaService() Q_DECL_OVERRIDE; QMediaControl* requestControl(const char *name) Q_DECL_OVERRIDE; void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; private: QAndroidMediaPlayerControl *mMediaControl; QAndroidMetaDataReaderControl *mMetadataControl; QAndroidVideoRendererControl *mVideoRendererControl; }; QT_END_NAMESPACE #endif // QANDROIDMEDIASERVICE_H qandroidmediaserviceplugin.cpp000066400000000000000000000066241225012771600370210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qandroidmediaserviceplugin.h" #include "qandroidmediaservice.h" #include "jmediaplayer.h" #include "jsurfacetexture.h" #include "jsurfacetextureholder.h" #include QT_BEGIN_NAMESPACE QAndroidMediaServicePlugin::QAndroidMediaServicePlugin() { } QAndroidMediaServicePlugin::~QAndroidMediaServicePlugin() { } QMediaService *QAndroidMediaServicePlugin::create(const QString &key) { if (key == QStringLiteral(Q_MEDIASERVICE_MEDIAPLAYER)) return new QAndroidMediaService; qWarning() << "Android service plugin: unsupported key:" << key; return 0; } void QAndroidMediaServicePlugin::release(QMediaService *service) { delete service; } QMediaServiceProviderHint::Features QAndroidMediaServicePlugin::supportedFeatures(const QByteArray &service) const { if (service == Q_MEDIASERVICE_MEDIAPLAYER) return QMediaServiceProviderHint::VideoSurface; return QMediaServiceProviderHint::Features(); } Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/) { typedef union { JNIEnv *nativeEnvironment; void *venv; } UnionJNIEnvToVoid; UnionJNIEnvToVoid uenv; uenv.venv = NULL; if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) return JNI_ERR; JNIEnv *jniEnv = uenv.nativeEnvironment; if (!JMediaPlayer::initJNI(jniEnv) || !JSurfaceTexture::initJNI(jniEnv) || !JSurfaceTextureHolder::initJNI(jniEnv)) { return JNI_ERR; } return JNI_VERSION_1_4; } QT_END_NAMESPACE qandroidmediaserviceplugin.h000066400000000000000000000054011225012771600364560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDMEDIASERVICEPLUGIN_H #define QANDROIDMEDIASERVICEPLUGIN_H #include QT_BEGIN_NAMESPACE class QMediaService; class QAndroidMediaService; class QAndroidMediaServicePlugin : public QMediaServiceProviderPlugin , public QMediaServiceFeaturesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceFeaturesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "mediaplayer.json") public: QAndroidMediaServicePlugin(); ~QAndroidMediaServicePlugin(); QMediaService* create(QString const& key) Q_DECL_OVERRIDE; void release(QMediaService *service) Q_DECL_OVERRIDE; QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; }; QT_END_NAMESPACE #endif // QANDROIDMEDIASERVICEPLUGIN_H qandroidmetadatareadercontrol.cpp000066400000000000000000000224641225012771600375060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qandroidmetadatareadercontrol.h" #include "jmediametadataretriever.h" #include #include #include QT_BEGIN_NAMESPACE // Genre name ordered by ID // see: http://id3.org/id3v2.3.0#Appendix_A_-_Genre_List_from_ID3v1 static const char* qt_ID3GenreNames[] = { "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall" }; QAndroidMetaDataReaderControl::QAndroidMetaDataReaderControl(QObject *parent) : QMetaDataReaderControl(parent) , m_available(false) , m_retriever(0) { m_retriever = new JMediaMetadataRetriever; if (!m_retriever->isValid()) { delete m_retriever; m_retriever = 0; } } QAndroidMetaDataReaderControl::~QAndroidMetaDataReaderControl() { if (m_retriever) { m_retriever->release(); delete m_retriever; } } bool QAndroidMetaDataReaderControl::isMetaDataAvailable() const { return m_available; } QVariant QAndroidMetaDataReaderControl::metaData(const QString &key) const { return m_metadata.value(key); } QStringList QAndroidMetaDataReaderControl::availableMetaData() const { return m_metadata.keys(); } void QAndroidMetaDataReaderControl::onMediaChanged(const QMediaContent &media) { if (!m_retriever) return; m_mediaContent = media; updateData(); } void QAndroidMetaDataReaderControl::onUpdateMetaData() { if (!m_retriever || m_mediaContent.isNull()) return; updateData(); } void QAndroidMetaDataReaderControl::updateData() { m_metadata.clear(); if (!m_mediaContent.isNull()) { if (m_retriever->setDataSource(m_mediaContent.canonicalUrl())) { QString mimeType = m_retriever->extractMetadata(JMediaMetadataRetriever::MimeType); if (!mimeType.isNull()) m_metadata.insert(QMediaMetaData::MediaType, mimeType); bool isVideo = !m_retriever->extractMetadata(JMediaMetadataRetriever::HasVideo).isNull() || mimeType.startsWith(QStringLiteral("video")); QString string = m_retriever->extractMetadata(JMediaMetadataRetriever::Album); if (!string.isNull()) m_metadata.insert(QMediaMetaData::AlbumTitle, string); string = m_retriever->extractMetadata(JMediaMetadataRetriever::AlbumArtist); if (!string.isNull()) m_metadata.insert(QMediaMetaData::AlbumArtist, string); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Artist); if (!string.isNull()) { m_metadata.insert(isVideo ? QMediaMetaData::LeadPerformer : QMediaMetaData::ContributingArtist, string.split('/', QString::SkipEmptyParts)); } string = m_retriever->extractMetadata(JMediaMetadataRetriever::Author); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Author, string.split('/', QString::SkipEmptyParts)); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Bitrate); if (!string.isNull()) { m_metadata.insert(isVideo ? QMediaMetaData::VideoBitRate : QMediaMetaData::AudioBitRate, string.toInt()); } string = m_retriever->extractMetadata(JMediaMetadataRetriever::CDTrackNumber); if (!string.isNull()) m_metadata.insert(QMediaMetaData::TrackNumber, string.toInt()); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Composer); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Composer, string.split('/', QString::SkipEmptyParts)); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Date); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Date, QDateTime::fromString(string, QStringLiteral("yyyyMMddTHHmmss.zzzZ")).date()); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Duration); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Duration, string.toLongLong()); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Genre); if (!string.isNull()) { // The genre can be returned as an ID3v2 id, get the name for it in that case if (string.startsWith('(') && string.endsWith(')')) { bool ok = false; int genreId = string.mid(1, string.length() - 2).toInt(&ok); if (ok && genreId >= 0 && genreId <= 125) string = QLatin1String(qt_ID3GenreNames[genreId]); } m_metadata.insert(QMediaMetaData::Genre, string); } string = m_retriever->extractMetadata(JMediaMetadataRetriever::Title); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Title, string); string = m_retriever->extractMetadata(JMediaMetadataRetriever::VideoHeight); if (!string.isNull()) { int height = string.toInt(); int width = m_retriever->extractMetadata(JMediaMetadataRetriever::VideoWidth).toInt(); m_metadata.insert(QMediaMetaData::Resolution, QSize(width, height)); } string = m_retriever->extractMetadata(JMediaMetadataRetriever::Writer); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Writer, string.split('/', QString::SkipEmptyParts)); string = m_retriever->extractMetadata(JMediaMetadataRetriever::Year); if (!string.isNull()) m_metadata.insert(QMediaMetaData::Year, string.toInt()); } } bool oldAvailable = m_available; m_available = !m_metadata.isEmpty(); if (m_available != oldAvailable) Q_EMIT metaDataAvailableChanged(m_available); Q_EMIT metaDataChanged(); } QT_END_NAMESPACE qandroidmetadatareadercontrol.h000066400000000000000000000054511225012771600371500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDMETADATAREADERCONTROL_H #define QANDROIDMETADATAREADERCONTROL_H #include #include QT_BEGIN_NAMESPACE class JMediaMetadataRetriever; class QAndroidMetaDataReaderControl : public QMetaDataReaderControl { Q_OBJECT public: explicit QAndroidMetaDataReaderControl(QObject *parent = 0); ~QAndroidMetaDataReaderControl() Q_DECL_OVERRIDE; bool isMetaDataAvailable() const Q_DECL_OVERRIDE; QVariant metaData(const QString &key) const Q_DECL_OVERRIDE; QStringList availableMetaData() const Q_DECL_OVERRIDE; public Q_SLOTS: void onMediaChanged(const QMediaContent &media); void onUpdateMetaData(); private: void updateData(); QMediaContent m_mediaContent; bool m_available; QVariantMap m_metadata; JMediaMetadataRetriever *m_retriever; }; QT_END_NAMESPACE #endif // QANDROIDMETADATAREADERCONTROL_H qandroidvideooutput.h000066400000000000000000000045031225012771600351700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDVIDEOOUTPUT_H #define QANDROIDVIDEOOUTPUT_H #include #include #include QT_BEGIN_NAMESPACE class QAndroidVideoOutput { public: QAndroidVideoOutput() { } virtual ~QAndroidVideoOutput() { } virtual jobject surfaceHolder() = 0; virtual void setVideoSize(const QSize &size) = 0; virtual void stop() = 0; }; QT_END_NAMESPACE #endif // QANDROIDVIDEOOUTPUT_H qandroidvideorendercontrol.cpp000066400000000000000000000266741225012771600370600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qandroidvideorendercontrol.h" #include #include "jsurfacetextureholder.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE static const GLfloat g_vertex_data[] = { -1.f, 1.f, 1.f, 1.f, 1.f, -1.f, -1.f, -1.f }; static const GLfloat g_texture_data[] = { 0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f }; class TextureVideoBuffer : public QAbstractVideoBuffer { public: TextureVideoBuffer(GLuint textureId) : QAbstractVideoBuffer(GLTextureHandle) , m_textureId(textureId) {} virtual ~TextureVideoBuffer() {} MapMode mapMode() const { return NotMapped; } uchar *map(MapMode, int*, int*) { return 0; } void unmap() {} QVariant handle() const { return QVariant::fromValue(m_textureId); } private: GLuint m_textureId; }; class ImageVideoBuffer : public QAbstractVideoBuffer { public: ImageVideoBuffer(const QImage &image) : QAbstractVideoBuffer(NoHandle) , m_image(image) , m_mode(NotMapped) { } MapMode mapMode() const { return m_mode; } uchar *map(MapMode mode, int *, int *) { if (mode != NotMapped && m_mode == NotMapped) { m_mode = mode; return m_image.bits(); } return 0; } void unmap() { m_mode = NotMapped; } private: QImage m_image; MapMode m_mode; }; QAndroidVideoRendererControl::QAndroidVideoRendererControl(QObject *parent) : QVideoRendererControl(parent) , m_surface(0) , m_offscreenSurface(0) , m_glContext(0) , m_fbo(0) , m_program(0) , m_useImage(false) , m_androidSurface(0) , m_surfaceTexture(0) , m_surfaceHolder(0) , m_externalTex(0) { } QAndroidVideoRendererControl::~QAndroidVideoRendererControl() { if (m_glContext) m_glContext->makeCurrent(m_offscreenSurface); if (m_surfaceTexture) { QJNILocalRef surfaceTex = m_surfaceTexture->surfaceTexture(); QJNIObject obj(surfaceTex.object()); obj.callMethod("release"); delete m_surfaceTexture; m_surfaceTexture = 0; } if (m_androidSurface) { m_androidSurface->callMethod("release"); delete m_androidSurface; m_androidSurface = 0; } if (m_surfaceHolder) { delete m_surfaceHolder; m_surfaceHolder = 0; } if (m_externalTex) glDeleteTextures(1, &m_externalTex); delete m_fbo; delete m_program; delete m_glContext; delete m_offscreenSurface; } QAbstractVideoSurface *QAndroidVideoRendererControl::surface() const { return m_surface; } void QAndroidVideoRendererControl::setSurface(QAbstractVideoSurface *surface) { if (surface == m_surface) return; if (m_surface && m_surface->isActive()) m_surface->stop(); m_surface = surface; if (m_surface) m_useImage = !m_surface->supportedPixelFormats(QAbstractVideoBuffer::GLTextureHandle).contains(QVideoFrame::Format_BGR32); } jobject QAndroidVideoRendererControl::surfaceHolder() { if (m_surfaceHolder) return m_surfaceHolder->object(); QOpenGLContext *currContext = QOpenGLContext::currentContext(); // If we don't have a GL context in the current thread, create one and share it // with the render thread GL context if (!currContext && !m_glContext) { m_offscreenSurface = new QOffscreenSurface; QSurfaceFormat format; format.setSwapBehavior(QSurfaceFormat::SingleBuffer); m_offscreenSurface->setFormat(format); m_offscreenSurface->create(); QOpenGLContext *shareContext = 0; if (m_surface) shareContext = qobject_cast(m_surface->property("GLContext").value()); m_glContext = new QOpenGLContext; m_glContext->setFormat(m_offscreenSurface->requestedFormat()); if (shareContext) m_glContext->setShareContext(shareContext); if (!m_glContext->create()) return 0; // if sharing contexts is not supported, fallback to image rendering and send the bits // to the video surface if (!m_glContext->shareContext()) m_useImage = true; } if (m_glContext) m_glContext->makeCurrent(m_offscreenSurface); glGenTextures(1, &m_externalTex); m_surfaceTexture = new JSurfaceTexture(m_externalTex); if (m_surfaceTexture->isValid()) { connect(m_surfaceTexture, SIGNAL(frameAvailable()), this, SLOT(onFrameAvailable())); QJNILocalRef surfaceTex = m_surfaceTexture->surfaceTexture(); m_androidSurface = new QJNIObject("android/view/Surface", "(Landroid/graphics/SurfaceTexture;)V", surfaceTex.object()); m_surfaceHolder = new JSurfaceTextureHolder(m_androidSurface->object()); } else { delete m_surfaceTexture; m_surfaceTexture = 0; glDeleteTextures(1, &m_externalTex); } if (m_surfaceHolder) return m_surfaceHolder->object(); return 0; } void QAndroidVideoRendererControl::setVideoSize(const QSize &size) { if (m_nativeSize == size) return; m_nativeSize = size; delete m_fbo; m_fbo = 0; } void QAndroidVideoRendererControl::stop() { if (m_surface && m_surface->isActive()) m_surface->stop(); m_nativeSize = QSize(); } void QAndroidVideoRendererControl::onFrameAvailable() { if (m_glContext) m_glContext->makeCurrent(m_offscreenSurface); m_surfaceTexture->updateTexImage(); if (!m_nativeSize.isValid()) return; renderFrameToFbo(); QAbstractVideoBuffer *buffer = 0; QVideoFrame frame; if (m_useImage) { buffer = new ImageVideoBuffer(m_fbo->toImage().mirrored()); frame = QVideoFrame(buffer, m_nativeSize, QVideoFrame::Format_RGB32); } else { buffer = new TextureVideoBuffer(m_fbo->texture()); frame = QVideoFrame(buffer, m_nativeSize, QVideoFrame::Format_BGR32); } if (m_surface && frame.isValid()) { if (m_surface->isActive() && (m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat() || m_surface->nativeResolution() != frame.size())) { m_surface->stop(); } if (!m_surface->isActive()) { QVideoSurfaceFormat format(frame.size(), frame.pixelFormat(), m_useImage ? QAbstractVideoBuffer::NoHandle : QAbstractVideoBuffer::GLTextureHandle); m_surface->start(format); } if (m_surface->isActive()) m_surface->present(frame); } } void QAndroidVideoRendererControl::renderFrameToFbo() { createGLResources(); m_fbo->bind(); glViewport(0, 0, m_nativeSize.width(), m_nativeSize.height()); m_program->bind(); m_program->enableAttributeArray(0); m_program->enableAttributeArray(1); m_program->setUniformValue("frameTexture", GLuint(0)); m_program->setUniformValue("texMatrix", m_surfaceTexture->getTransformMatrix()); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, g_vertex_data); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, g_texture_data); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); m_program->disableAttributeArray(0); m_program->disableAttributeArray(1); m_program->release(); glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0); m_fbo->release(); glFinish(); } void QAndroidVideoRendererControl::createGLResources() { if (!m_fbo) m_fbo = new QOpenGLFramebufferObject(m_nativeSize); if (!m_program) { m_program = new QOpenGLShaderProgram; QOpenGLShader *vertexShader = new QOpenGLShader(QOpenGLShader::Vertex, m_program); vertexShader->compileSourceCode("attribute highp vec4 vertexCoordsArray; \n" \ "attribute highp vec2 textureCoordArray; \n" \ "uniform highp mat4 texMatrix; \n" \ "varying highp vec2 textureCoords; \n" \ "void main(void) \n" \ "{ \n" \ " gl_Position = vertexCoordsArray; \n" \ " textureCoords = (texMatrix * vec4(textureCoordArray, 0.0, 1.0)).xy; \n" \ "}\n"); m_program->addShader(vertexShader); QOpenGLShader *fragmentShader = new QOpenGLShader(QOpenGLShader::Fragment, m_program); fragmentShader->compileSourceCode("#extension GL_OES_EGL_image_external : require \n" \ "varying highp vec2 textureCoords; \n" \ "uniform samplerExternalOES frameTexture; \n" \ "void main() \n" \ "{ \n" \ " gl_FragColor = texture2D(frameTexture, textureCoords); \n" \ "}\n"); m_program->addShader(fragmentShader); m_program->bindAttributeLocation("vertexCoordsArray", 0); m_program->bindAttributeLocation("textureCoordArray", 1); m_program->link(); } } QT_END_NAMESPACE qandroidvideorendercontrol.h000066400000000000000000000064351225012771600365160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDVIDEORENDERCONTROL_H #define QANDROIDVIDEORENDERCONTROL_H #include #include "qandroidvideooutput.h" #include "jsurfacetexture.h" QT_BEGIN_NAMESPACE class QOpenGLContext; class QOffscreenSurface; class QOpenGLFramebufferObject; class QOpenGLShaderProgram; class JSurfaceTextureHolder; class QAndroidVideoRendererControl : public QVideoRendererControl, public QAndroidVideoOutput { Q_OBJECT public: explicit QAndroidVideoRendererControl(QObject *parent = 0); ~QAndroidVideoRendererControl() Q_DECL_OVERRIDE; QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; jobject surfaceHolder() Q_DECL_OVERRIDE; void setVideoSize(const QSize &size) Q_DECL_OVERRIDE; void stop() Q_DECL_OVERRIDE; private Q_SLOTS: void onFrameAvailable(); private: void setupSurface(); void renderFrameToFbo(); void createGLResources(); QAbstractVideoSurface *m_surface; QOffscreenSurface *m_offscreenSurface; QOpenGLContext *m_glContext; QOpenGLFramebufferObject *m_fbo; QOpenGLShaderProgram *m_program; bool m_useImage; QSize m_nativeSize; QJNIObject *m_androidSurface; JSurfaceTexture *m_surfaceTexture; JSurfaceTextureHolder *m_surfaceHolder; uint m_externalTex; }; QT_END_NAMESPACE #endif // QANDROIDVIDEORENDERCONTROL_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/000077500000000000000000000000001225012771600303325ustar00rootroot00000000000000jmediametadataretriever.cpp000066400000000000000000000104041225012771600356400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "jmediametadataretriever.h" #include #include #include QT_BEGIN_NAMESPACE static jobject g_activity = 0; JMediaMetadataRetriever::JMediaMetadataRetriever() : QJNIObject("android/media/MediaMetadataRetriever") { if (!g_activity) { QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); g_activity = static_cast(nativeInterface->nativeResourceForIntegration("QtActivity")); } } JMediaMetadataRetriever::~JMediaMetadataRetriever() { } QString JMediaMetadataRetriever::extractMetadata(MetadataKey key) { QString value; QJNILocalRef metadata = callObjectMethod("extractMetadata", "(I)Ljava/lang/String;", jint(key)); if (!metadata.isNull()) value = qt_convertJString(metadata.object()); return value; } void JMediaMetadataRetriever::release() { callMethod("release"); } bool JMediaMetadataRetriever::setDataSource(const QUrl &url) { QAttachedJNIEnv env; bool loaded = false; QJNILocalRef string = qt_toJString(url.toString()); QJNILocalRef uri = callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", string.object()); if (env->ExceptionCheck()) { env->ExceptionClear(); } else { callMethod("setDataSource", "(Landroid/content/Context;Landroid/net/Uri;)V", g_activity, uri.object()); if (env->ExceptionCheck()) env->ExceptionClear(); else loaded = true; } return loaded; } bool JMediaMetadataRetriever::setDataSource(const QString &path) { QAttachedJNIEnv env; bool loaded = false; callMethod("setDataSource", "(Ljava/lang/String;)V", qt_toJString(path).object()); if (env->ExceptionCheck()) env->ExceptionClear(); else loaded = true; return loaded; } QT_END_NAMESPACE jmediametadataretriever.h000066400000000000000000000056601225012771600353150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef JMEDIAMETADATARETRIEVER_H #define JMEDIAMETADATARETRIEVER_H #include #include QT_BEGIN_NAMESPACE class JMediaMetadataRetriever : public QJNIObject { public: enum MetadataKey { Album = 1, AlbumArtist = 13, Artist = 2, Author = 3, Bitrate = 20, CDTrackNumber = 0, Compilation = 15, Composer = 4, Date = 5, DiscNumber = 14, Duration = 9, Genre = 6, HasAudio = 16, HasVideo = 17, Location = 23, MimeType = 12, NumTracks = 10, Title = 7, VideoHeight = 19, VideoWidth = 18, VideoRotation = 24, Writer = 11, Year = 8 }; JMediaMetadataRetriever(); ~JMediaMetadataRetriever(); QString extractMetadata(MetadataKey key); void release(); bool setDataSource(const QUrl &url); bool setDataSource(const QString &path); }; QT_END_NAMESPACE #endif // JMEDIAMETADATARETRIEVER_H jmediaplayer.cpp000066400000000000000000000160561225012771600334350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "jmediaplayer.h" #include #include #include #include namespace { jclass mediaPlayerClass = 0; QMap mplayers; } QT_BEGIN_NAMESPACE bool JMediaPlayer::mActivitySet = false; JMediaPlayer::JMediaPlayer() : QObject() , QJNIObject(mediaPlayerClass, "(J)V", reinterpret_cast(this)) , mId(reinterpret_cast(this)) , mDisplay(0) { mplayers.insert(mId, this); if (!mActivitySet) { QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); jobject activity = static_cast(nativeInterface->nativeResourceForIntegration("QtActivity")); QJNIObject::callStaticMethod(mediaPlayerClass, "setActivity", "(Landroid/app/Activity;)V", activity); mActivitySet = true; } } JMediaPlayer::~JMediaPlayer() { mplayers.remove(mId); } void JMediaPlayer::onError(qint32 what, qint32 extra) { Q_EMIT error(what, extra); } void JMediaPlayer::onBufferingUpdate(qint32 percent) { Q_EMIT bufferingUpdate(percent); } void JMediaPlayer::onInfo(qint32 what, qint32 extra) { Q_EMIT info(what, extra); } void JMediaPlayer::onMediaPlayerInfo(qint32 what, qint32 extra) { Q_EMIT mediaPlayerInfo(what, extra); } void JMediaPlayer::onVideoSizeChanged(qint32 width, qint32 height) { Q_EMIT videoSizeChanged(width, height); } int JMediaPlayer::getCurrentPosition() { return callMethod("getCurrentPosition"); } int JMediaPlayer::getDuration() { return callMethod("getDuration"); } bool JMediaPlayer::isPlaying() { return callMethod("isPlaying"); } int JMediaPlayer::volume() { return callMethod("getVolume"); } bool JMediaPlayer::isMuted() { return callMethod("isMuted"); } void JMediaPlayer::play() { callMethod("start"); } void JMediaPlayer::pause() { callMethod("pause"); } void JMediaPlayer::stop() { callMethod("stop"); } void JMediaPlayer::seekTo(qint32 msec) { callMethod("seekTo", "(I)V", jint(msec)); } void JMediaPlayer::setMuted(bool mute) { callMethod("mute", "(Z)V", jboolean(mute)); } void JMediaPlayer::setDataSource(const QString &path) { QJNILocalRef string = qt_toJString(path); callMethod("setMediaPath", "(Ljava/lang/String;)V", string.object()); } void JMediaPlayer::setVolume(int volume) { callMethod("setVolume", "(I)V", jint(volume)); } void JMediaPlayer::setDisplay(jobject surfaceHolder) { mDisplay = surfaceHolder; callMethod("setDisplay", "(Landroid/view/SurfaceHolder;)V", mDisplay); } QT_END_NAMESPACE static void onErrorNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong id) { Q_UNUSED(env); Q_UNUSED(thiz); JMediaPlayer *const mp = mplayers[id]; if (!mp) return; mp->onError(what, extra); } static void onBufferingUpdateNative(JNIEnv *env, jobject thiz, jint percent, jlong id) { Q_UNUSED(env); Q_UNUSED(thiz); JMediaPlayer *const mp = mplayers[id]; if (!mp) return; mp->onBufferingUpdate(percent); } static void onInfoNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong id) { Q_UNUSED(env); Q_UNUSED(thiz); JMediaPlayer *const mp = mplayers[id]; if (!mp) return; mp->onInfo(what, extra); } static void onMediaPlayerInfoNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong id) { Q_UNUSED(env); Q_UNUSED(thiz); JMediaPlayer *const mp = mplayers[id]; if (!mp) return; mp->onMediaPlayerInfo(what, extra); } static void onVideoSizeChangedNative(JNIEnv *env, jobject thiz, jint width, jint height, jlong id) { Q_UNUSED(env); Q_UNUSED(thiz); JMediaPlayer *const mp = mplayers[id]; if (!mp) return; mp->onVideoSizeChanged(width, height); } QT_BEGIN_NAMESPACE bool JMediaPlayer::initJNI(JNIEnv *env) { jclass jClass = env->FindClass("org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer"); if (jClass) { mediaPlayerClass = static_cast(env->NewGlobalRef(jClass)); JNINativeMethod methods[] = { {"onErrorNative", "(IIJ)V", reinterpret_cast(onErrorNative)}, {"onBufferingUpdateNative", "(IJ)V", reinterpret_cast(onBufferingUpdateNative)}, {"onInfoNative", "(IIJ)V", reinterpret_cast(onInfoNative)}, {"onMediaPlayerInfoNative", "(IIJ)V", reinterpret_cast(onMediaPlayerInfoNative)}, {"onVideoSizeChangedNative", "(IIJ)V", reinterpret_cast(onVideoSizeChangedNative)} }; if (env->RegisterNatives(mediaPlayerClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { return false; } } return true; } QT_END_NAMESPACE jmediaplayer.h000066400000000000000000000102471225012771600330760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QANDROIDMEDIAPLAYER_H #define QANDROIDMEDIAPLAYER_H #include #include QT_BEGIN_NAMESPACE class JMediaPlayer : public QObject, public QJNIObject { Q_OBJECT public: JMediaPlayer(); ~JMediaPlayer(); enum MediaError { // What MEDIA_ERROR_UNKNOWN = 1, MEDIA_ERROR_SERVER_DIED = 100, // Extra MEDIA_ERROR_IO = -1004, MEDIA_ERROR_MALFORMED = -1007, MEDIA_ERROR_UNSUPPORTED = -1010, MEDIA_ERROR_TIMED_OUT = -110, MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200 }; enum MediaInfo { MEDIA_INFO_UNKNOWN = 1, MEDIA_INFO_VIDEO_TRACK_LAGGING = 700, MEDIA_INFO_VIDEO_RENDERING_START = 3, MEDIA_INFO_BUFFERING_START = 701, MEDIA_INFO_BUFFERING_END = 702, MEDIA_INFO_BAD_INTERLEAVING = 800, MEDIA_INFO_NOT_SEEKABLE = 801, MEDIA_INFO_METADATA_UPDATE = 802 }; enum MediaPlayerInfo { MEDIA_PLAYER_INVALID_STATE = 1, MEDIA_PLAYER_PREPARING = 2, MEDIA_PLAYER_READY = 3, MEDIA_PLAYER_DURATION = 4, MEDIA_PLAYER_PROGRESS = 5, MEDIA_PLAYER_FINISHED = 6 }; int getCurrentPosition(); int getDuration(); bool isPlaying(); int volume(); bool isMuted(); jobject display() { return mDisplay; } void play(); void pause(); void stop(); void seekTo(qint32 msec); void setMuted(bool mute); void setDataSource(const QString &path); void setVolume(int volume); void setDisplay(jobject surfaceHolder); void onError(qint32 what, qint32 extra); void onBufferingUpdate(qint32 percent); void onInfo(qint32 what, qint32 extra); void onMediaPlayerInfo(qint32 what, qint32 extra); void onVideoSizeChanged(qint32 width, qint32 height); static bool initJNI(JNIEnv *env); Q_SIGNALS: void error(qint32 what, qint32 extra); void bufferingUpdate(qint32 percent); void completion(); void info(qint32 what, qint32 extra); void mediaPlayerInfo(qint32 what, qint32 extra); void videoSizeChanged(qint32 width, qint32 height); private: jlong mId; jobject mDisplay; static bool mActivitySet; }; QT_END_NAMESPACE #endif // QANDROIDMEDIAPLAYER_H jsurfacetexture.cpp000066400000000000000000000075071225012771600342130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "jsurfacetexture.h" #include QT_BEGIN_NAMESPACE static jclass g_qtSurfaceTextureClass = 0; static QHash g_objectMap; // native method for QtSurfaceTexture.java static void notifyFrameAvailable(JNIEnv* , jobject, int id) { JSurfaceTexture *obj = g_objectMap.value(id, 0); if (obj) Q_EMIT obj->frameAvailable(); } JSurfaceTexture::JSurfaceTexture(unsigned int texName) : QObject() , QJNIObject(g_qtSurfaceTextureClass, "(I)V", jint(texName)) , m_texID(int(texName)) { if (m_jobject) g_objectMap.insert(int(texName), this); } JSurfaceTexture::~JSurfaceTexture() { if (m_jobject) g_objectMap.remove(m_texID); } QMatrix4x4 JSurfaceTexture::getTransformMatrix() { QAttachedJNIEnv env; QMatrix4x4 matrix; jfloatArray array = env->NewFloatArray(16); callMethod("getTransformMatrix", "([F)V", array); env->GetFloatArrayRegion(array, 0, 16, matrix.data()); env->DeleteLocalRef(array); return matrix; } void JSurfaceTexture::updateTexImage() { callMethod("updateTexImage"); } QJNILocalRef JSurfaceTexture::surfaceTexture() { return getObjectField("surfaceTexture", "Landroid/graphics/SurfaceTexture;"); } static JNINativeMethod methods[] = { {"notifyFrameAvailable", "(I)V", (void *)notifyFrameAvailable} }; bool JSurfaceTexture::initJNI(JNIEnv *env) { jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTexture"); if (env->ExceptionCheck()) env->ExceptionClear(); if (clazz) { g_qtSurfaceTextureClass = static_cast(env->NewGlobalRef(clazz)); if (env->RegisterNatives(g_qtSurfaceTextureClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { return false; } } return true; } QT_END_NAMESPACE jsurfacetexture.h000066400000000000000000000047541225012771600336610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef JSURFACETEXTURE_H #define JSURFACETEXTURE_H #include #include #include QT_BEGIN_NAMESPACE class JSurfaceTexture : public QObject, public QJNIObject { Q_OBJECT public: explicit JSurfaceTexture(unsigned int texName); ~JSurfaceTexture(); QMatrix4x4 getTransformMatrix(); void updateTexImage(); QJNILocalRef surfaceTexture(); static bool initJNI(JNIEnv *env); Q_SIGNALS: void frameAvailable(); private: int m_texID; }; QT_END_NAMESPACE #endif // JSURFACETEXTURE_H jsurfacetextureholder.cpp000066400000000000000000000047771225012771600354170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "jsurfacetextureholder.h" QT_BEGIN_NAMESPACE static jclass g_qtSurfaceTextureHolderClass = 0; JSurfaceTextureHolder::JSurfaceTextureHolder(jobject surface) : QJNIObject(g_qtSurfaceTextureHolderClass, "(Landroid/view/Surface;)V", surface) { } bool JSurfaceTextureHolder::initJNI(JNIEnv *env) { jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder"); if (env->ExceptionCheck()) env->ExceptionClear(); if (clazz) g_qtSurfaceTextureHolderClass = static_cast(env->NewGlobalRef(clazz)); return true; } QT_END_NAMESPACE jsurfacetextureholder.h000066400000000000000000000043531225012771600350520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappers/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef JSURFACETEXTUREHOLDER_H #define JSURFACETEXTUREHOLDER_H #include QT_BEGIN_NAMESPACE class JSurfaceTextureHolder : public QJNIObject { public: JSurfaceTextureHolder(jobject surface); static bool initJNI(JNIEnv *env); }; QT_END_NAMESPACE #endif // JSURFACETEXTUREHOLDER_H wrappers.pri000066400000000000000000000005321225012771600326320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/android/wrappersQT += platformsupport-private INCLUDEPATH += $$PWD HEADERS += \ $$PWD/jmediaplayer.h \ $$PWD/jsurfacetexture.h \ $$PWD/jsurfacetextureholder.h \ $$PWD/jmediametadataretriever.h SOURCES += \ $$PWD/jmediaplayer.cpp \ $$PWD/jsurfacetexture.cpp \ $$PWD/jsurfacetextureholder.cpp \ $$PWD/jmediametadataretriever.cpp qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/000077500000000000000000000000001225012771600275345ustar00rootroot00000000000000audiocapture.json000066400000000000000000000000621225012771600330330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture{ "Keys": ["org.qt-project.qt.audiosource"] } audiocapture.pro000066400000000000000000000012661225012771600326710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocaptureTARGET = qtmedia_audioengine QT += multimedia-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = AudioCaptureServicePlugin load(qt_plugin) HEADERS += audioencodercontrol.h \ audiocontainercontrol.h \ audiomediarecordercontrol.h \ audioinputselector.h \ audiocaptureservice.h \ audiocaptureserviceplugin.h \ audiocapturesession.h \ audiocaptureprobecontrol.h SOURCES += audioencodercontrol.cpp \ audiocontainercontrol.cpp \ audiomediarecordercontrol.cpp \ audioinputselector.cpp \ audiocaptureservice.cpp \ audiocaptureserviceplugin.cpp \ audiocapturesession.cpp \ audiocaptureprobecontrol.cpp OTHER_FILES += \ audiocapture.json audiocaptureprobecontrol.cpp000066400000000000000000000047201225012771600353020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiocaptureprobecontrol.h" AudioCaptureProbeControl::AudioCaptureProbeControl(QObject *parent): QMediaAudioProbeControl(parent) { } AudioCaptureProbeControl::~AudioCaptureProbeControl() { } void AudioCaptureProbeControl::bufferProbed(const char *data, quint32 size, const QAudioFormat& format) { if (!format.isValid()) return; QAudioBuffer audioBuffer = QAudioBuffer(QByteArray::fromRawData(data, size), format); QMetaObject::invokeMethod(this, "audioBufferProbed", Qt::QueuedConnection, Q_ARG(QAudioBuffer, audioBuffer)); } audiocaptureprobecontrol.h000066400000000000000000000045471225012771600347560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOCAPTUREPROBECONTROL_H #define AUDIOCAPTUREPROBECONTROL_H #include #include #include QT_USE_NAMESPACE class AudioCaptureProbeControl : public QMediaAudioProbeControl { Q_OBJECT public: explicit AudioCaptureProbeControl(QObject *parent); virtual ~AudioCaptureProbeControl(); void bufferProbed(const char *data, quint32 size, const QAudioFormat& format); }; #endif audiocaptureservice.cpp000066400000000000000000000066631225012771600342420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiocaptureservice.h" #include "audiocapturesession.h" #include "audioinputselector.h" #include "audioencodercontrol.h" #include "audiocontainercontrol.h" #include "audiomediarecordercontrol.h" #include "audiocaptureprobecontrol.h" AudioCaptureService::AudioCaptureService(QObject *parent): QMediaService(parent) { m_session = new AudioCaptureSession(this); m_encoderControl = new AudioEncoderControl(m_session); m_containerControl = new AudioContainerControl(m_session); m_mediaControl = new AudioMediaRecorderControl(m_session); m_inputSelector = new AudioInputSelector(m_session); } AudioCaptureService::~AudioCaptureService() { delete m_encoderControl; delete m_containerControl; delete m_inputSelector; delete m_mediaControl; delete m_session; } QMediaControl *AudioCaptureService::requestControl(const char *name) { if (qstrcmp(name,QMediaRecorderControl_iid) == 0) return m_mediaControl; if (qstrcmp(name,QAudioEncoderSettingsControl_iid) == 0) return m_encoderControl; if (qstrcmp(name,QAudioInputSelectorControl_iid) == 0) return m_inputSelector; if (qstrcmp(name,QMediaContainerControl_iid) == 0) return m_containerControl; if (qstrcmp(name,QMediaAudioProbeControl_iid) == 0) { AudioCaptureProbeControl *probe = new AudioCaptureProbeControl(this); m_session->addProbe(probe); return probe; } return 0; } void AudioCaptureService::releaseControl(QMediaControl *control) { Q_UNUSED(control) } audiocaptureservice.h000066400000000000000000000052621225012771600337010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOCAPTURESERVICE_H #define AUDIOCAPTURESERVICE_H #include #include "qmediaservice.h" class AudioCaptureSession; class AudioEncoderControl; class AudioContainerControl; class AudioMediaRecorderControl; class AudioInputSelector; QT_USE_NAMESPACE class AudioCaptureService : public QMediaService { Q_OBJECT public: AudioCaptureService(QObject *parent = 0); ~AudioCaptureService(); QMediaControl *requestControl(const char *interface); void releaseControl(QMediaControl *control); private: AudioCaptureSession *m_session; AudioEncoderControl *m_encoderControl; AudioContainerControl *m_containerControl; AudioInputSelector *m_inputSelector; AudioMediaRecorderControl *m_mediaControl; }; #endif audiocaptureserviceplugin.cpp000066400000000000000000000045011225012771600354460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "audiocaptureserviceplugin.h" #include "audiocaptureservice.h" #include "qmediaserviceproviderplugin.h" QMediaService* AudioCaptureServicePlugin::create(QString const& key) { if (key == QLatin1String(Q_MEDIASERVICE_AUDIOSOURCE)) return new AudioCaptureService; return 0; } void AudioCaptureServicePlugin::release(QMediaService *service) { delete service; } audiocaptureserviceplugin.h000066400000000000000000000045531225012771600351220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOCAPTURESERVICEPLUGIN_H #define AUDIOCAPTURESERVICEPLUGIN_H #include "qmediaserviceproviderplugin.h" QT_USE_NAMESPACE class AudioCaptureServicePlugin : public QMediaServiceProviderPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "audiocapture.json") public: QMediaService* create(QString const& key); void release(QMediaService *service); }; #endif // AUDIOCAPTURESERVICEPLUGIN_H audiocapturesession.cpp000066400000000000000000000303751225012771600342620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qmediarecorder.h" #include "audiocapturesession.h" #include "audiocaptureprobecontrol.h" void FileProbeProxy::startProbes(const QAudioFormat &format) { m_format = format; } void FileProbeProxy::stopProbes() { m_format = QAudioFormat(); } void FileProbeProxy::addProbe(AudioCaptureProbeControl *probe) { QMutexLocker locker(&m_probeMutex); if (m_probes.contains(probe)) return; m_probes.append(probe); } void FileProbeProxy::removeProbe(AudioCaptureProbeControl *probe) { QMutexLocker locker(&m_probeMutex); m_probes.removeOne(probe); } qint64 FileProbeProxy::writeData(const char *data, qint64 len) { if (m_format.isValid()) { QMutexLocker locker(&m_probeMutex); foreach (AudioCaptureProbeControl* probe, m_probes) probe->bufferProbed(data, len, m_format); } return QFile::writeData(data, len); } AudioCaptureSession::AudioCaptureSession(QObject *parent): QObject(parent) { m_deviceInfo = new QAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice()); m_audioInput = 0; m_position = 0; m_state = QMediaRecorder::StoppedState; m_format.setSampleRate(8000); m_format.setChannelCount(1); m_format.setSampleSize(8); m_format.setSampleType(QAudioFormat::UnSignedInt); m_format.setCodec("audio/pcm"); wavFile = true; } AudioCaptureSession::~AudioCaptureSession() { stop(); if(m_audioInput) delete m_audioInput; } QAudioDeviceInfo* AudioCaptureSession::deviceInfo() const { return m_deviceInfo; } QAudioFormat AudioCaptureSession::format() const { return m_format; } bool AudioCaptureSession::isFormatSupported(const QAudioFormat &format) const { if(m_deviceInfo) { if(format.codec().contains(QLatin1String("audio/x-wav"))) { QAudioFormat fmt = format; fmt.setCodec("audio/pcm"); return m_deviceInfo->isFormatSupported(fmt); } else return m_deviceInfo->isFormatSupported(format); } return false; } bool AudioCaptureSession::setFormat(const QAudioFormat &format) { if(m_deviceInfo) { QAudioFormat fmt = format; if(m_deviceInfo->isFormatSupported(fmt)) { m_format = fmt; if(m_audioInput) delete m_audioInput; m_audioInput = 0; QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); for(int i=0;ideviceName().toLocal8Bit().constData(), devices.at(i).deviceName().toLocal8Bit().constData()) == 0) { m_audioInput = new QAudioInput(devices.at(i),m_format); connect(m_audioInput,SIGNAL(stateChanged(QAudio::State)),this,SLOT(stateChanged(QAudio::State))); connect(m_audioInput,SIGNAL(notify()),this,SLOT(notify())); break; } } } else { m_format = m_deviceInfo->preferredFormat(); qWarning()<<"failed to setFormat using preferred..."; } } return false; } QStringList AudioCaptureSession::supportedContainers() const { QStringList list; if(m_deviceInfo) { if (m_deviceInfo->supportedCodecs().size() > 0) { list << "audio/x-wav"; list << "audio/pcm"; } } return list; } QString AudioCaptureSession::containerDescription(const QString &formatMimeType) const { if(m_deviceInfo) { if (formatMimeType.contains(QLatin1String("audio/pcm"))) return tr("RAW file format"); if (formatMimeType.contains(QLatin1String("audio/x-wav"))) return tr("WAV file format"); } return QString(); } void AudioCaptureSession::setContainerFormat(const QString &formatMimeType) { if (!formatMimeType.contains(QLatin1String("audio/x-wav")) && !formatMimeType.contains(QLatin1String("audio/pcm")) && !formatMimeType.isEmpty()) return; if(m_deviceInfo) { if (!m_deviceInfo->supportedCodecs().contains(QLatin1String("audio/pcm"))) return; if (formatMimeType.isEmpty() || formatMimeType.contains(QLatin1String("audio/x-wav"))) { wavFile = true; m_format.setCodec("audio/pcm"); } else { wavFile = false; m_format.setCodec(formatMimeType); } } } QString AudioCaptureSession::containerFormat() const { if(wavFile) return QString("audio/x-wav"); return QString("audio/pcm"); } QUrl AudioCaptureSession::outputLocation() const { return m_actualSink; } bool AudioCaptureSession::setOutputLocation(const QUrl& sink) { m_sink = m_actualSink = sink; return true; } qint64 AudioCaptureSession::position() const { return m_position; } int AudioCaptureSession::state() const { return int(m_state); } QDir AudioCaptureSession::defaultDir() const { QStringList dirCandidates; #if defined(Q_WS_MAEMO_6) dirCandidates << QLatin1String("/home/user/MyDocs"); #endif dirCandidates << QDir::home().filePath("Documents"); dirCandidates << QDir::home().filePath("My Documents"); dirCandidates << QDir::homePath(); dirCandidates << QDir::currentPath(); dirCandidates << QDir::tempPath(); foreach (const QString &path, dirCandidates) { QDir dir(path); if (dir.exists() && QFileInfo(path).isWritable()) return dir; } return QDir(); } QString AudioCaptureSession::generateFileName(const QDir &dir, const QString &ext) const { int lastClip = 0; foreach(QString fileName, dir.entryList(QStringList() << QString("clip_*.%1").arg(ext))) { int imgNumber = fileName.mid(5, fileName.size()-6-ext.length()).toInt(); lastClip = qMax(lastClip, imgNumber); } QString name = QString("clip_%1.%2").arg(lastClip+1, 4, //fieldWidth 10, QLatin1Char('0')).arg(ext); return dir.absoluteFilePath(name); } void AudioCaptureSession::record() { if(!m_audioInput) { setFormat(m_format); } m_actualSink = m_sink; if (m_actualSink.isEmpty()) { QString ext = wavFile ? QLatin1String("wav") : QLatin1String("raw"); m_actualSink = generateFileName(defaultDir(), ext); } if(m_actualSink.toLocalFile().length() > 0) file.setFileName(m_actualSink.toLocalFile()); else file.setFileName(m_actualSink.toString()); if(m_audioInput) { if(m_state == QMediaRecorder::StoppedState) { if(file.open(QIODevice::WriteOnly)) { memset(&header,0,sizeof(CombinedHeader)); memcpy(header.riff.descriptor.id,"RIFF",4); header.riff.descriptor.size = 0xFFFFFFFF; // This should be updated on stop(), filesize-8 memcpy(header.riff.type,"WAVE",4); memcpy(header.wave.descriptor.id,"fmt ",4); header.wave.descriptor.size = 16; header.wave.audioFormat = 1; // for PCM data header.wave.numChannels = m_format.channelCount(); header.wave.sampleRate = m_format.sampleRate(); header.wave.byteRate = m_format.sampleRate()*m_format.channelCount()*m_format.sampleSize()/8; header.wave.blockAlign = m_format.channelCount()*m_format.sampleSize()/8; header.wave.bitsPerSample = m_format.sampleSize(); memcpy(header.data.descriptor.id,"data",4); header.data.descriptor.size = 0xFFFFFFFF; // This should be updated on stop(),samples*channels*sampleSize/8 if (wavFile) file.write((char*)&header,sizeof(CombinedHeader)); file.startProbes(m_format); m_audioInput->start(qobject_cast(&file)); } else { emit error(1,QString("can't open source, failed")); m_state = QMediaRecorder::StoppedState; emit stateChanged(m_state); } } } m_state = QMediaRecorder::RecordingState; } void AudioCaptureSession::pause() { if(m_audioInput) m_audioInput->stop(); m_state = QMediaRecorder::PausedState; } void AudioCaptureSession::stop() { if(m_audioInput) { m_audioInput->stop(); file.stopProbes(); file.close(); if (wavFile) { qint32 fileSize = file.size()-8; file.open(QIODevice::ReadWrite | QIODevice::Unbuffered); file.read((char*)&header,sizeof(CombinedHeader)); header.riff.descriptor.size = fileSize; // filesize-8 header.data.descriptor.size = fileSize-44; // samples*channels*sampleSize/8 file.seek(0); file.write((char*)&header,sizeof(CombinedHeader)); file.close(); } m_position = 0; } m_state = QMediaRecorder::StoppedState; } void AudioCaptureSession::addProbe(AudioCaptureProbeControl *probe) { file.addProbe(probe); } void AudioCaptureSession::removeProbe(AudioCaptureProbeControl *probe) { file.removeProbe(probe); } void AudioCaptureSession::stateChanged(QAudio::State state) { switch(state) { case QAudio::ActiveState: emit stateChanged(QMediaRecorder::RecordingState); break; default: if(!((m_state == QMediaRecorder::PausedState)||(m_state == QMediaRecorder::StoppedState))) m_state = QMediaRecorder::StoppedState; emit stateChanged(m_state); break; } } void AudioCaptureSession::notify() { m_position += m_audioInput->notifyInterval(); emit positionChanged(m_position); } void AudioCaptureSession::setCaptureDevice(const QString &deviceName) { m_captureDevice = deviceName; if(m_deviceInfo) delete m_deviceInfo; m_deviceInfo = 0; QList devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); for(int i = 0; i < devices.size(); i++) { if(qstrcmp(m_captureDevice.toLocal8Bit().constData(), devices.at(i).deviceName().toLocal8Bit().constData())==0){ m_deviceInfo = new QAudioDeviceInfo(devices.at(i)); return; } } m_deviceInfo = new QAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice()); } audiocapturesession.h000066400000000000000000000115771225012771600337320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOCAPTURESESSION_H #define AUDIOCAPTURESESSION_H #include #include #include #include #include "audioencodercontrol.h" #include "audioinputselector.h" #include "audiomediarecordercontrol.h" #include #include #include QT_USE_NAMESPACE class AudioCaptureProbeControl; class FileProbeProxy: public QFile { public: void startProbes(const QAudioFormat& format); void stopProbes(); void addProbe(AudioCaptureProbeControl *probe); void removeProbe(AudioCaptureProbeControl *probe); protected: virtual qint64 writeData(const char *data, qint64 len); private: QAudioFormat m_format; QList m_probes; QMutex m_probeMutex; }; class AudioCaptureSession : public QObject { Q_OBJECT public: AudioCaptureSession(QObject *parent = 0); ~AudioCaptureSession(); QAudioFormat format() const; QAudioDeviceInfo* deviceInfo() const; bool isFormatSupported(const QAudioFormat &format) const; bool setFormat(const QAudioFormat &format); QStringList supportedContainers() const; QString containerFormat() const; void setContainerFormat(const QString &formatMimeType); QString containerDescription(const QString &formatMimeType) const; QUrl outputLocation() const; bool setOutputLocation(const QUrl& sink); qint64 position() const; int state() const; void record(); void pause(); void stop(); void addProbe(AudioCaptureProbeControl *probe); void removeProbe(AudioCaptureProbeControl *probe); public slots: void setCaptureDevice(const QString &deviceName); signals: void stateChanged(QMediaRecorder::State state); void positionChanged(qint64 position); void error(int error, const QString &errorString); private slots: void stateChanged(QAudio::State state); void notify(); private: QDir defaultDir() const; QString generateFileName(const QDir &dir, const QString &ext) const; FileProbeProxy file; QString m_captureDevice; QUrl m_sink; QUrl m_actualSink; QMediaRecorder::State m_state; QAudioInput *m_audioInput; QAudioDeviceInfo *m_deviceInfo; QAudioFormat m_format; qint64 m_position; bool wavFile; // WAV header stuff struct chunk { char id[4]; quint32 size; }; struct RIFFHeader { chunk descriptor; char type[4]; }; struct WAVEHeader { chunk descriptor; quint16 audioFormat; // PCM = 1 quint16 numChannels; quint32 sampleRate; quint32 byteRate; quint16 blockAlign; quint16 bitsPerSample; }; struct DATAHeader { chunk descriptor; // quint8 data[]; }; struct CombinedHeader { RIFFHeader riff; WAVEHeader wave; DATAHeader data; }; CombinedHeader header; }; #endif audiocontainercontrol.cpp000066400000000000000000000052571225012771600345770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiocontainercontrol.h" #include "audiocapturesession.h" AudioContainerControl::AudioContainerControl(QObject *parent) :QMediaContainerControl(parent) { m_session = qobject_cast(parent); } AudioContainerControl::~AudioContainerControl() { } QStringList AudioContainerControl::supportedContainers() const { return m_session->supportedContainers(); } QString AudioContainerControl::containerFormat() const { return m_session->containerFormat(); } void AudioContainerControl::setContainerFormat(const QString &formatMimeType) { m_session->setContainerFormat(formatMimeType); } QString AudioContainerControl::containerDescription(const QString &formatMimeType) const { return m_session->containerDescription(formatMimeType); } audiocontainercontrol.h000066400000000000000000000050361225012771600342370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOCONTAINERCONTROL_H #define AUDIOCONTAINERCONTROL_H #include "qmediacontainercontrol.h" #include #include class AudioCaptureSession; QT_USE_NAMESPACE class AudioContainerControl : public QMediaContainerControl { Q_OBJECT public: AudioContainerControl(QObject *parent); virtual ~AudioContainerControl(); QStringList supportedContainers() const; QString containerFormat() const; void setContainerFormat(const QString &formatMimeType); QString containerDescription(const QString &formatMimeType) const; private: AudioCaptureSession* m_session; }; #endif audioencodercontrol.cpp000066400000000000000000000115011225012771600342210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audioencodercontrol.h" #include "audiocapturesession.h" #include #include AudioEncoderControl::AudioEncoderControl(QObject *parent) :QAudioEncoderSettingsControl(parent) { m_session = qobject_cast(parent); QT_PREPEND_NAMESPACE(QAudioFormat) fmt; fmt.setSampleSize(8); fmt.setChannelCount(1); fmt.setSampleRate(8000); fmt.setSampleType(QT_PREPEND_NAMESPACE(QAudioFormat)::SignedInt); fmt.setCodec("audio/pcm"); fmt.setByteOrder(QAudioFormat::LittleEndian); m_session->setFormat(fmt); m_settings.setEncodingMode(QMultimedia::ConstantQualityEncoding); m_settings.setCodec("audio/pcm"); m_settings.setBitRate(8000); m_settings.setChannelCount(1); m_settings.setSampleRate(8000); m_settings.setQuality(QMultimedia::LowQuality); } AudioEncoderControl::~AudioEncoderControl() { } QStringList AudioEncoderControl::supportedAudioCodecs() const { QStringList list; if (m_session->supportedContainers().size() > 0) list.append("audio/pcm"); return list; } QString AudioEncoderControl::codecDescription(const QString &codecName) const { if (codecName.contains(QLatin1String("audio/pcm"))) return tr("PCM audio data"); return QString(); } QList AudioEncoderControl::supportedSampleRates(const QAudioEncoderSettings &, bool *continuous) const { if (continuous) *continuous = false; return m_session->deviceInfo()->supportedSampleRates(); } QAudioEncoderSettings AudioEncoderControl::audioSettings() const { return m_settings; } void AudioEncoderControl::setAudioSettings(const QAudioEncoderSettings &settings) { QAudioFormat fmt = m_session->format(); if (settings.encodingMode() == QMultimedia::ConstantQualityEncoding) { if (settings.quality() == QMultimedia::LowQuality) { fmt.setSampleSize(8); fmt.setChannelCount(1); fmt.setSampleRate(8000); fmt.setSampleType(QAudioFormat::UnSignedInt); } else if (settings.quality() == QMultimedia::NormalQuality) { fmt.setSampleSize(16); fmt.setChannelCount(1); fmt.setSampleRate(22050); fmt.setSampleType(QAudioFormat::SignedInt); } else { fmt.setSampleSize(16); fmt.setChannelCount(1); fmt.setSampleRate(44100); fmt.setSampleType(QAudioFormat::SignedInt); } } else { fmt.setChannelCount(settings.channelCount()); fmt.setSampleRate(settings.sampleRate()); if (settings.sampleRate() == 8000 && settings.bitRate() == 8000) { fmt.setSampleType(QAudioFormat::UnSignedInt); fmt.setSampleSize(8); } else { fmt.setSampleSize(16); fmt.setSampleType(QAudioFormat::SignedInt); } } fmt.setCodec("audio/pcm"); m_session->setFormat(fmt); m_settings = settings; } audioencodercontrol.h000066400000000000000000000053031225012771600336710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOENCODERCONTROL_H #define AUDIOENCODERCONTROL_H #include "qaudioencodersettingscontrol.h" #include #include #include class AudioCaptureSession; QT_USE_NAMESPACE class AudioEncoderControl : public QAudioEncoderSettingsControl { Q_OBJECT public: AudioEncoderControl(QObject *parent); virtual ~AudioEncoderControl(); QStringList supportedAudioCodecs() const; QString codecDescription(const QString &codecName) const; QList supportedSampleRates(const QAudioEncoderSettings &, bool *continuous = 0) const; QAudioEncoderSettings audioSettings() const; void setAudioSettings(const QAudioEncoderSettings&); private: AudioCaptureSession* m_session; QAudioEncoderSettings m_settings; }; #endif audioinputselector.cpp000066400000000000000000000066101225012771600341060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiocapturesession.h" #include "audioinputselector.h" #include AudioInputSelector::AudioInputSelector(QObject *parent) :QAudioInputSelectorControl(parent) { m_session = qobject_cast(parent); update(); m_audioInput = defaultInput(); } AudioInputSelector::~AudioInputSelector() { } QList AudioInputSelector::availableInputs() const { return m_names; } QString AudioInputSelector::inputDescription(const QString& name) const { QString desc; for(int i = 0; i < m_names.count(); i++) { if (m_names.at(i).compare(name) == 0) { desc = m_names.at(i); break; } } return desc; } QString AudioInputSelector::defaultInput() const { return QAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice()).deviceName(); } QString AudioInputSelector::activeInput() const { return m_audioInput; } void AudioInputSelector::setActiveInput(const QString& name) { if (m_audioInput.compare(name) != 0) { m_audioInput = name; m_session->setCaptureDevice(name); emit activeInputChanged(name); } } void AudioInputSelector::update() { m_names.clear(); m_descriptions.clear(); QList devices; devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); for(int i = 0; i < devices.size(); ++i) { m_names.append(devices.at(i).deviceName()); m_descriptions.append(devices.at(i).deviceName()); } } audioinputselector.h000066400000000000000000000052171225012771600335550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOINPUTSELECTOR_H #define AUDIOINPUTSELECTOR_H #include #include "qaudioinputselectorcontrol.h" class AudioCaptureSession; QT_USE_NAMESPACE class AudioInputSelector : public QAudioInputSelectorControl { Q_OBJECT public: AudioInputSelector(QObject *parent); virtual ~AudioInputSelector(); QList availableInputs() const; QString inputDescription(const QString& name) const; QString defaultInput() const; QString activeInput() const; public Q_SLOTS: void setActiveInput(const QString& name); private: void update(); QString m_audioInput; QList m_names; QList m_descriptions; AudioCaptureSession* m_session; }; #endif // AUDIOINPUTSELECTOR_H audiomediarecordercontrol.cpp000066400000000000000000000115221225012771600354120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "audiocapturesession.h" #include "audiomediarecordercontrol.h" #include AudioMediaRecorderControl::AudioMediaRecorderControl(QObject *parent) :QMediaRecorderControl(parent) , m_state(QMediaRecorder::StoppedState) , m_prevStatus(QMediaRecorder::UnloadedStatus) { m_session = qobject_cast(parent); connect(m_session,SIGNAL(positionChanged(qint64)),this,SIGNAL(durationChanged(qint64))); connect(m_session,SIGNAL(stateChanged(QMediaRecorder::State)), this,SLOT(updateStatus())); connect(m_session,SIGNAL(error(int,QString)),this,SLOT(handleSessionError(int,QString))); } AudioMediaRecorderControl::~AudioMediaRecorderControl() { } QUrl AudioMediaRecorderControl::outputLocation() const { return m_session->outputLocation(); } bool AudioMediaRecorderControl::setOutputLocation(const QUrl& sink) { return m_session->setOutputLocation(sink); } QMediaRecorder::State AudioMediaRecorderControl::state() const { return (QMediaRecorder::State)m_session->state(); } QMediaRecorder::Status AudioMediaRecorderControl::status() const { static QMediaRecorder::Status statusTable[3][3] = { //Stopped recorder state: { QMediaRecorder::LoadedStatus, QMediaRecorder::FinalizingStatus, QMediaRecorder::FinalizingStatus }, //Recording recorder state: { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus }, //Paused recorder state: { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus } }; return statusTable[m_state][m_session->state()]; } qint64 AudioMediaRecorderControl::duration() const { return m_session->position(); } bool AudioMediaRecorderControl::isMuted() const { return false; } qreal AudioMediaRecorderControl::volume() const { //TODO: implement muting and audio gain return 1.0; } void AudioMediaRecorderControl::setState(QMediaRecorder::State state) { if (m_state == state) return; m_state = state; switch (state) { case QMediaRecorder::StoppedState: m_session->stop(); break; case QMediaRecorder::PausedState: m_session->pause(); break; case QMediaRecorder::RecordingState: m_session->record(); break; } updateStatus(); } void AudioMediaRecorderControl::setMuted(bool) { } void AudioMediaRecorderControl::setVolume(qreal volume) { if (!qFuzzyCompare(volume, qreal(1.0))) qWarning() << "Media service doesn't support recorder audio gain."; } void AudioMediaRecorderControl::updateStatus() { QMediaRecorder::Status newStatus = status(); if (m_prevStatus != newStatus) { m_prevStatus = newStatus; emit statusChanged(m_prevStatus); } } void AudioMediaRecorderControl::handleSessionError(int code, const QString &description) { emit error(code, description); setState(QMediaRecorder::StoppedState); } audiomediarecordercontrol.h000066400000000000000000000056341225012771600350660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/audiocapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AUDIOMEDIARECORDERCONTROL_H #define AUDIOMEDIARECORDERCONTROL_H #include #include "qmediarecorder.h" #include "qmediarecordercontrol.h" class AudioCaptureSession; QT_USE_NAMESPACE class AudioMediaRecorderControl : public QMediaRecorderControl { Q_OBJECT public: AudioMediaRecorderControl(QObject *parent = 0); ~AudioMediaRecorderControl(); QUrl outputLocation() const; bool setOutputLocation(const QUrl &sink); QMediaRecorder::State state() const; QMediaRecorder::Status status() const; qint64 duration() const; bool isMuted() const; qreal volume() const; void applySettings() {} public slots: void setState(QMediaRecorder::State state); void setMuted(bool); void setVolume(qreal volume); private slots: void updateStatus(); void handleSessionError(int code, const QString &description); private: AudioCaptureSession* m_session; QMediaRecorder::State m_state; QMediaRecorder::Status m_prevStatus; }; #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/000077500000000000000000000000001225012771600275445ustar00rootroot00000000000000avfoundation.pro000066400000000000000000000000771225012771600327100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundationTEMPLATE = subdirs SUBDIRS += camera \ mediaplayer qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/000077500000000000000000000000001225012771600307745ustar00rootroot00000000000000avfaudioinputselectorcontrol.h000066400000000000000000000057041225012771600371140ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFAUDIOINPUTSELECTORCONTROL_H #define AVFAUDIOINPUTSELECTORCONTROL_H #include #include #import QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFAudioInputSelectorControl : public QAudioInputSelectorControl { Q_OBJECT public: AVFAudioInputSelectorControl(AVFCameraService *service, QObject *parent = 0); ~AVFAudioInputSelectorControl(); QList availableInputs() const; QString inputDescription(const QString &name) const; QString defaultInput() const; QString activeInput() const; public Q_SLOTS: void setActiveInput(const QString &name); public: //device changed since the last createCaptureDevice() bool isDirty() const { return m_dirty; } AVCaptureDevice *createCaptureDevice(); private: AVFCameraService *m_service; QString m_activeInput; bool m_dirty; QStringList m_devices; QMap m_deviceDescriptions; }; QT_END_NAMESPACE #endif avfaudioinputselectorcontrol.mm000066400000000000000000000075331225012771600373000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfaudioinputselectorcontrol.h" #include "avfcameraservice.h" #import QT_USE_NAMESPACE AVFAudioInputSelectorControl::AVFAudioInputSelectorControl(AVFCameraService *service, QObject *parent) : QAudioInputSelectorControl(parent) , m_service(service) , m_dirty(true) { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; for (AVCaptureDevice *device in videoDevices) { QString deviceId = QString::fromUtf8([[device uniqueID] UTF8String]); m_devices << deviceId; m_deviceDescriptions.insert(deviceId, QString::fromUtf8([[device localizedName] UTF8String])); } m_activeInput = m_devices.first(); } AVFAudioInputSelectorControl::~AVFAudioInputSelectorControl() { } QList AVFAudioInputSelectorControl::availableInputs() const { return m_devices; } QString AVFAudioInputSelectorControl::inputDescription(const QString &name) const { return m_deviceDescriptions.value(name); } QString AVFAudioInputSelectorControl::defaultInput() const { return m_devices.first(); } QString AVFAudioInputSelectorControl::activeInput() const { return m_activeInput; } void AVFAudioInputSelectorControl::setActiveInput(const QString &name) { if (name != m_activeInput) { m_activeInput = name; m_dirty = true; Q_EMIT activeInputChanged(m_activeInput); } } AVCaptureDevice *AVFAudioInputSelectorControl::createCaptureDevice() { m_dirty = false; AVCaptureDevice *device = 0; if (!m_activeInput.isEmpty()) { device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String: m_activeInput.toUtf8().constData()]]; } if (!device) device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; return device; } #include "moc_avfaudioinputselectorcontrol.cpp" avfcamera.json000066400000000000000000000000551225012771600335350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera{ "Keys": ["org.qt-project.qt.camera"] } avfcameracontrol.h000066400000000000000000000055521225012771600344230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFCAMERACONTROL_H #define AVFCAMERACONTROL_H #include #include QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFCameraControl : public QCameraControl { Q_OBJECT public: AVFCameraControl(AVFCameraService *service, QObject *parent = 0); ~AVFCameraControl(); QCamera::State state() const; void setState(QCamera::State state); QCamera::Status status() const; QCamera::CaptureModes captureMode() const; void setCaptureMode(QCamera::CaptureModes); bool isCaptureModeSupported(QCamera::CaptureModes mode) const; bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const; private Q_SLOTS: void updateStatus(); private: AVFCameraService *m_service; AVFCameraSession *m_session; QCamera::State m_state; QCamera::Status m_lastStatus; QCamera::CaptureModes m_captureMode; }; QT_END_NAMESPACE #endif avfcameracontrol.mm000066400000000000000000000106221225012771600345770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfcameracontrol.h" #include "avfcamerasession.h" #include "avfcameraservice.h" QT_USE_NAMESPACE AVFCameraControl::AVFCameraControl(AVFCameraService *service, QObject *parent) : QCameraControl(parent) , m_service(service) , m_session(service->session()) , m_state(QCamera::UnloadedState) , m_lastStatus(QCamera::UnloadedStatus) , m_captureMode(QCamera::CaptureStillImage) { connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateStatus())); } AVFCameraControl::~AVFCameraControl() { } QCamera::State AVFCameraControl::state() const { return m_state; } void AVFCameraControl::setState(QCamera::State state) { if (m_state == state) return; m_state = state; m_session->setState(state); Q_EMIT stateChanged(m_state); updateStatus(); } QCamera::Status AVFCameraControl::status() const { static QCamera::Status statusTable[3][3] = { { QCamera::UnloadedStatus, QCamera::UnloadingStatus, QCamera::StoppingStatus }, //Unloaded state { QCamera::LoadingStatus, QCamera::LoadedStatus, QCamera::StoppingStatus }, //Loaded state { QCamera::LoadingStatus, QCamera::StartingStatus, QCamera::ActiveStatus } //ActiveState }; return statusTable[m_state][m_session->state()]; } void AVFCameraControl::updateStatus() { QCamera::Status newStatus = status(); if (m_lastStatus != newStatus) { qDebugCamera() << "Camera status changed: " << m_lastStatus << " -> " << newStatus; m_lastStatus = newStatus; Q_EMIT statusChanged(m_lastStatus); } } QCamera::CaptureModes AVFCameraControl::captureMode() const { return m_captureMode; } void AVFCameraControl::setCaptureMode(QCamera::CaptureModes mode) { if (m_captureMode == mode) return; if (!isCaptureModeSupported(mode)) { Q_EMIT error(QCamera::NotSupportedFeatureError, tr("Requested capture mode is not supported")); return; } m_captureMode = mode; Q_EMIT captureModeChanged(mode); } bool AVFCameraControl::isCaptureModeSupported(QCamera::CaptureModes mode) const { //all the capture modes are supported, including QCamera::CaptureStillImage | QCamera::CaptureVideo return (mode & (QCamera::CaptureStillImage | QCamera::CaptureVideo)) == mode; } bool AVFCameraControl::canChangeProperty(QCameraControl::PropertyChangeType changeType, QCamera::Status status) const { Q_UNUSED(changeType); Q_UNUSED(status); return true; } #include "moc_avfcameracontrol.cpp" avfcameradebug.h000066400000000000000000000042351225012771600340260ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFDEBUG_H #define AVFDEBUG_H #include "qtmultimediadefs.h" #include QT_USE_NAMESPACE //#define AVF_DEBUG_CAMERA #ifdef AVF_DEBUG_CAMERA #define qDebugCamera qDebug #else #define qDebugCamera QT_NO_QDEBUG_MACRO #endif #endif avfcamerametadatacontrol.h000066400000000000000000000051161225012771600361200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFCAMERAMETADATACONTROL_H #define AVFCAMERAMETADATACONTROL_H #include QT_BEGIN_NAMESPACE class AVFCameraService; class AVFCameraMetaDataControl : public QMetaDataWriterControl { Q_OBJECT public: AVFCameraMetaDataControl(AVFCameraService *service, QObject *parent=0); virtual ~AVFCameraMetaDataControl(); bool isMetaDataAvailable() const; bool isWritable() const; QVariant metaData(const QString &key) const; void setMetaData(const QString &key, const QVariant &value); QStringList availableMetaData() const; private: AVFCameraService *m_service; QMap m_tags; }; QT_END_NAMESPACE #endif avfcamerametadatacontrol.mm000066400000000000000000000054501225012771600363030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcamerametadatacontrol.h" #include "avfcamerasession.h" #include "avfcameraservice.h" QT_USE_NAMESPACE //metadata support is not implemented yet AVFCameraMetaDataControl::AVFCameraMetaDataControl(AVFCameraService *service, QObject *parent) :QMetaDataWriterControl(parent), m_service(service) { } AVFCameraMetaDataControl::~AVFCameraMetaDataControl() { } bool AVFCameraMetaDataControl::isMetaDataAvailable() const { return !m_tags.isEmpty(); } bool AVFCameraMetaDataControl::isWritable() const { return false; } QVariant AVFCameraMetaDataControl::metaData(const QString &key) const { return m_tags.value(key); } void AVFCameraMetaDataControl::setMetaData(const QString &key, const QVariant &value) { m_tags.insert(key, value); } QStringList AVFCameraMetaDataControl::availableMetaData() const { return m_tags.keys(); } #include "moc_avfcamerametadatacontrol.cpp" avfcameraservice.h000066400000000000000000000071131225012771600343760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFCAMERASERVICE_H #define AVFCAMERASERVICE_H #include #include #include QT_BEGIN_NAMESPACE class QCameraControl; class AVFCameraControl; class AVFCameraMetaDataControl; class AVFVideoWindowControl; class AVFVideoWidgetControl; class AVFVideoRendererControl; class AVFMediaRecorderControl; class AVFImageCaptureControl; class AVFCameraSession; class AVFVideoDeviceControl; class AVFAudioInputSelectorControl; class AVFCameraService : public QMediaService { Q_OBJECT public: AVFCameraService(QObject *parent = 0); ~AVFCameraService(); QMediaControl* requestControl(const char *name); void releaseControl(QMediaControl *control); AVFCameraSession *session() const { return m_session; } AVFCameraControl *cameraControl() const { return m_cameraControl; } AVFVideoDeviceControl *videoDeviceControl() const { return m_videoDeviceControl; } AVFAudioInputSelectorControl *audioInputSelectorControl() const { return m_audioInputSelectorControl; } AVFCameraMetaDataControl *metaDataControl() const { return m_metaDataControl; } AVFMediaRecorderControl *recorderControl() const { return m_recorderControl; } AVFImageCaptureControl *imageCaptureControl() const { return m_imageCaptureControl; } private: AVFCameraSession *m_session; AVFCameraControl *m_cameraControl; AVFVideoDeviceControl *m_videoDeviceControl; AVFAudioInputSelectorControl *m_audioInputSelectorControl; AVFVideoRendererControl *m_videoOutput; AVFCameraMetaDataControl *m_metaDataControl; AVFMediaRecorderControl *m_recorderControl; AVFImageCaptureControl *m_imageCaptureControl; }; QT_END_NAMESPACE #endif avfcameraservice.mm000066400000000000000000000111131225012771600345530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "avfcameraservice.h" #include "avfcameracontrol.h" #include "avfcamerasession.h" #include "avfvideodevicecontrol.h" #include "avfaudioinputselectorcontrol.h" #include "avfcamerametadatacontrol.h" #include "avfmediarecordercontrol.h" #include "avfimagecapturecontrol.h" #include "avfvideorenderercontrol.h" #include "avfmediarecordercontrol.h" #include "avfimagecapturecontrol.h" #include #include QT_USE_NAMESPACE AVFCameraService::AVFCameraService(QObject *parent): QMediaService(parent), m_videoOutput(0) { m_session = new AVFCameraSession(this); m_cameraControl = new AVFCameraControl(this); m_videoDeviceControl = new AVFVideoDeviceControl(this); m_audioInputSelectorControl = new AVFAudioInputSelectorControl(this); m_metaDataControl = new AVFCameraMetaDataControl(this); m_recorderControl = new AVFMediaRecorderControl(this); m_imageCaptureControl = new AVFImageCaptureControl(this); } AVFCameraService::~AVFCameraService() { m_cameraControl->setState(QCamera::UnloadedState); if (m_videoOutput) { m_session->setVideoOutput(0); delete m_videoOutput; m_videoOutput = 0; } //delete controls before session, //so they have a chance to do deinitialization delete m_imageCaptureControl; //delete m_recorderControl; delete m_metaDataControl; delete m_cameraControl; delete m_session; } QMediaControl *AVFCameraService::requestControl(const char *name) { if (qstrcmp(name, QCameraControl_iid) == 0) return m_cameraControl; if (qstrcmp(name, QVideoDeviceSelectorControl_iid) == 0) return m_videoDeviceControl; if (qstrcmp(name, QAudioInputSelectorControl_iid) == 0) return m_audioInputSelectorControl; //metadata support is not implemented yet //if (qstrcmp(name, QMetaDataWriterControl_iid) == 0) // return m_metaDataControl; if (qstrcmp(name, QMediaRecorderControl_iid) == 0) return m_recorderControl; if (qstrcmp(name, QCameraImageCaptureControl_iid) == 0) return m_imageCaptureControl; if (!m_videoOutput) { if (qstrcmp(name, QVideoRendererControl_iid) == 0) m_videoOutput = new AVFVideoRendererControl(this); if (m_videoOutput) { m_session->setVideoOutput(m_videoOutput); return m_videoOutput; } } return 0; } void AVFCameraService::releaseControl(QMediaControl *control) { if (m_videoOutput == control) { m_videoOutput = 0; m_session->setVideoOutput(0); delete control; } } #include "moc_avfcameraservice.cpp" avfcameraserviceplugin.h000066400000000000000000000054371225012771600356240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFSERVICEPLUGIN_H #define AVFSERVICEPLUGIN_H #include #include QT_BEGIN_NAMESPACE class AVFServicePlugin : public QMediaServiceProviderPlugin, public QMediaServiceSupportedDevicesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "avfcamera.json") public: AVFServicePlugin(); QMediaService* create(QString const& key); void release(QMediaService *service); QList devices(const QByteArray &service) const; QString deviceDescription(const QByteArray &service, const QByteArray &device); private: void updateDevices() const; mutable QList m_cameraDevices; mutable QMap m_cameraDescriptions; }; QT_END_NAMESPACE #endif avfcameraserviceplugin.mm000066400000000000000000000067501225012771600360050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "avfcameraserviceplugin.h" #include "avfcameraservice.h" #include #import QT_BEGIN_NAMESPACE AVFServicePlugin::AVFServicePlugin() { } QMediaService* AVFServicePlugin::create(QString const& key) { if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) return new AVFCameraService; else qWarning() << "unsupported key:" << key; return 0; } void AVFServicePlugin::release(QMediaService *service) { delete service; } QList AVFServicePlugin::devices(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { if (m_cameraDevices.isEmpty()) updateDevices(); return m_cameraDevices; } return QList(); } QString AVFServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { if (m_cameraDevices.isEmpty()) updateDevices(); return m_cameraDescriptions.value(device); } return QString(); } void AVFServicePlugin::updateDevices() const { m_cameraDevices.clear(); m_cameraDescriptions.clear(); NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in videoDevices) { QByteArray deviceId([[device uniqueID] UTF8String]); m_cameraDevices << deviceId; m_cameraDescriptions.insert(deviceId, QString::fromUtf8([[device localizedName] UTF8String])); } } QT_END_NAMESPACE avfcamerasession.h000066400000000000000000000064601225012771600344250ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFCAMERASESSION_H #define AVFCAMERASESSION_H #include #include #import @class AVFCameraSessionObserver; QT_BEGIN_NAMESPACE class AVFCameraControl; class AVFCameraService; class AVFVideoRendererControl; class AVFCameraSession : public QObject { Q_OBJECT public: AVFCameraSession(AVFCameraService *service, QObject *parent = 0); ~AVFCameraSession(); void setVideoOutput(AVFVideoRendererControl *output); AVCaptureSession *captureSession() const { return m_captureSession; } QCamera::State state() const; QCamera::State requestedState() const { return m_state; } bool isActive() const { return m_active; } public Q_SLOTS: void setState(QCamera::State state); void processRuntimeError(); void processSessionStarted(); void processSessionStopped(); Q_SIGNALS: void readyToConfigureConnections(); void stateChanged(QCamera::State newState); void activeChanged(bool); void error(int error, const QString &errorString); private: void attachInputDevices(); AVFCameraService *m_service; AVFVideoRendererControl *m_videoOutput; QCamera::State m_state; bool m_active; AVCaptureSession *m_captureSession; AVCaptureDeviceInput *m_videoInput; AVCaptureDeviceInput *m_audioInput; AVFCameraSessionObserver *m_observer; }; QT_END_NAMESPACE #endif avfcamerasession.mm000066400000000000000000000211341225012771600346020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfcamerasession.h" #include "avfcameraservice.h" #include "avfcameracontrol.h" #include "avfvideorenderercontrol.h" #include "avfvideodevicecontrol.h" #include "avfaudioinputselectorcontrol.h" #include #include #include #include #include QT_USE_NAMESPACE @interface AVFCameraSessionObserver : NSObject { @private AVFCameraSession *m_session; AVCaptureSession *m_captureSession; } - (AVFCameraSessionObserver *) initWithCameraSession:(AVFCameraSession*)session; - (void) processRuntimeError:(NSNotification *)notification; - (void) processSessionStarted:(NSNotification *)notification; - (void) processSessionStopped:(NSNotification *)notification; @end @implementation AVFCameraSessionObserver - (AVFCameraSessionObserver *) initWithCameraSession:(AVFCameraSession*)session { if (!(self = [super init])) return nil; self->m_session = session; self->m_captureSession = session->captureSession(); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processRuntimeError:) name:AVCaptureSessionRuntimeErrorNotification object:m_captureSession]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processSessionStarted:) name:AVCaptureSessionDidStartRunningNotification object:m_captureSession]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processSessionStopped:) name:AVCaptureSessionDidStopRunningNotification object:m_captureSession]; return self; } - (void) processRuntimeError:(NSNotification *)notification { Q_UNUSED(notification); QMetaObject::invokeMethod(m_session, "processRuntimeError", Qt::AutoConnection); } - (void) processSessionStarted:(NSNotification *)notification { Q_UNUSED(notification); QMetaObject::invokeMethod(m_session, "processSessionStarted", Qt::AutoConnection); } - (void) processSessionStopped:(NSNotification *)notification { Q_UNUSED(notification); QMetaObject::invokeMethod(m_session, "processSessionStopped", Qt::AutoConnection); } @end AVFCameraSession::AVFCameraSession(AVFCameraService *service, QObject *parent) : QObject(parent) , m_service(service) , m_state(QCamera::UnloadedState) , m_active(false) , m_videoInput(nil) , m_audioInput(nil) { m_captureSession = [[AVCaptureSession alloc] init]; m_observer = [[AVFCameraSessionObserver alloc] initWithCameraSession:this]; //configuration is commited during transition to Active state [m_captureSession beginConfiguration]; } AVFCameraSession::~AVFCameraSession() { if (m_videoInput) { [m_captureSession removeInput:m_videoInput]; [m_videoInput release]; } if (m_audioInput) { [m_captureSession removeInput:m_audioInput]; [m_audioInput release]; } [m_observer release]; [m_captureSession release]; } void AVFCameraSession::setVideoOutput(AVFVideoRendererControl *output) { m_videoOutput = output; if (output) output->configureAVCaptureSession(m_captureSession); } QCamera::State AVFCameraSession::state() const { if (m_active) return QCamera::ActiveState; return m_state == QCamera::ActiveState ? QCamera::LoadedState : m_state; } void AVFCameraSession::setState(QCamera::State newState) { if (m_state == newState) return; qDebugCamera() << Q_FUNC_INFO << m_state << " -> " << newState; QCamera::State oldState = m_state; m_state = newState; //attach audio and video inputs during Unloaded->Loaded transition if (oldState == QCamera::UnloadedState) { attachInputDevices(); } if (m_state == QCamera::ActiveState) { Q_EMIT readyToConfigureConnections(); [m_captureSession commitConfiguration]; [m_captureSession startRunning]; } if (oldState == QCamera::ActiveState) { [m_captureSession stopRunning]; [m_captureSession beginConfiguration]; } Q_EMIT stateChanged(m_state); } void AVFCameraSession::processRuntimeError() { qWarning() << tr("Runtime camera error"); Q_EMIT error(QCamera::CameraError, tr("Runtime camera error")); } void AVFCameraSession::processSessionStarted() { qDebugCamera() << Q_FUNC_INFO; if (!m_active) { m_active = true; Q_EMIT activeChanged(m_active); Q_EMIT stateChanged(state()); } } void AVFCameraSession::processSessionStopped() { qDebugCamera() << Q_FUNC_INFO; if (m_active) { m_active = false; Q_EMIT activeChanged(m_active); Q_EMIT stateChanged(state()); } } void AVFCameraSession::attachInputDevices() { //Attach video input device: if (m_service->videoDeviceControl()->isDirty()) { if (m_videoInput) { [m_captureSession removeInput:m_videoInput]; [m_videoInput release]; m_videoInput = 0; } AVCaptureDevice *videoDevice = m_service->videoDeviceControl()->createCaptureDevice(); NSError *error = nil; m_videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if (!m_videoInput) { qWarning() << "Failed to create video device input"; } else { if ([m_captureSession canAddInput:m_videoInput]) { [m_videoInput retain]; [m_captureSession addInput:m_videoInput]; } else { qWarning() << "Failed to connect video device input"; } } } //Attach audio input device: if (m_service->audioInputSelectorControl()->isDirty()) { if (m_audioInput) { [m_captureSession removeInput:m_audioInput]; [m_audioInput release]; m_audioInput = 0; } AVCaptureDevice *audioDevice = m_service->audioInputSelectorControl()->createCaptureDevice(); NSError *error = nil; m_audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; if (!m_audioInput) { qWarning() << "Failed to create audio device input"; } else { [m_audioInput retain]; [m_captureSession addInput:m_audioInput]; } } } #include "moc_avfcamerasession.cpp" avfimagecapturecontrol.h000066400000000000000000000060361225012771600356370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFIMAGECAPTURECONTROL_H #define AVFIMAGECAPTURECONTROL_H #import #include #include "avfstoragelocation.h" QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFCameraControl; class AVFImageCaptureControl : public QCameraImageCaptureControl { Q_OBJECT public: AVFImageCaptureControl(AVFCameraService *service, QObject *parent = 0); ~AVFImageCaptureControl(); bool isReadyForCapture() const; QCameraImageCapture::DriveMode driveMode() const { return QCameraImageCapture::SingleImageCapture; } void setDriveMode(QCameraImageCapture::DriveMode ) {} int capture(const QString &fileName); void cancelCapture(); private Q_SLOTS: void updateCaptureConnection(); void updateReadyStatus(); private: AVFCameraService *m_service; AVFCameraSession *m_session; AVFCameraControl *m_cameraControl; bool m_ready; int m_lastCaptureId; AVCaptureStillImageOutput *m_stillImageOutput; AVCaptureConnection *m_videoConnection; AVFStorageLocation m_storageLocation; }; QT_END_NAMESPACE #endif avfimagecapturecontrol.mm000066400000000000000000000220541225012771600360170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfimagecapturecontrol.h" #include "avfcamerasession.h" #include "avfcameraservice.h" #include "avfcameracontrol.h" #include #include #include #include QT_USE_NAMESPACE AVFImageCaptureControl::AVFImageCaptureControl(AVFCameraService *service, QObject *parent) : QCameraImageCaptureControl(parent) , m_service(service) , m_session(service->session()) , m_cameraControl(service->cameraControl()) , m_ready(false) , m_lastCaptureId(0) , m_videoConnection(nil) { m_stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; [m_stillImageOutput setOutputSettings:outputSettings]; [outputSettings release]; connect(m_cameraControl, SIGNAL(captureModeChanged(QCamera::CaptureModes)), SLOT(updateReadyStatus())); connect(m_cameraControl, SIGNAL(statusChanged(QCamera::Status)), SLOT(updateReadyStatus())); connect(m_session, SIGNAL(readyToConfigureConnections()), SLOT(updateCaptureConnection())); } AVFImageCaptureControl::~AVFImageCaptureControl() { } bool AVFImageCaptureControl::isReadyForCapture() const { return m_videoConnection && m_cameraControl->captureMode().testFlag(QCamera::CaptureStillImage) && m_cameraControl->status() == QCamera::ActiveStatus; } void AVFImageCaptureControl::updateReadyStatus() { if (m_ready != isReadyForCapture()) { m_ready = !m_ready; qDebugCamera() << "ReadyToCapture status changed:" << m_ready; Q_EMIT readyForCaptureChanged(m_ready); } } int AVFImageCaptureControl::capture(const QString &fileName) { m_lastCaptureId++; if (!isReadyForCapture()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, m_lastCaptureId), Q_ARG(int, QCameraImageCapture::NotReadyError), Q_ARG(QString, tr("Camera not ready"))); return m_lastCaptureId; } QString actualFileName = m_storageLocation.generateFileName(fileName, QCamera::CaptureStillImage, QLatin1String("img_"), QLatin1String("jpg")); qDebugCamera() << "Capture image to" << actualFileName; int captureId = m_lastCaptureId; [m_stillImageOutput captureStillImageAsynchronouslyFromConnection:m_videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) { if (error) { QStringList messageParts; messageParts << QString::fromUtf8([[error localizedDescription] UTF8String]); messageParts << QString::fromUtf8([[error localizedFailureReason] UTF8String]); messageParts << QString::fromUtf8([[error localizedRecoverySuggestion] UTF8String]); QString errorMessage = messageParts.join(" "); qDebugCamera() << "Image capture failed:" << errorMessage; QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, captureId), Q_ARG(int, QCameraImageCapture::ResourceError), Q_ARG(QString, errorMessage)); } else { qDebugCamera() << "Image captured:" << actualFileName; //we can't find the exact time the image is exposed, //but image capture is very fast on desktop, so emit it here QMetaObject::invokeMethod(this, "imageExposed", Qt::QueuedConnection, Q_ARG(int, captureId)); NSData *nsJpgData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; QByteArray jpgData = QByteArray::fromRawData((const char *)[nsJpgData bytes], [nsJpgData length]); //Generate snap preview as downscalled image { QBuffer buffer(&jpgData); QImageReader imageReader(&buffer); QSize imgSize = imageReader.size(); int downScaleSteps = 0; while (imgSize.width() > 800 && downScaleSteps < 8) { imgSize.rwidth() /= 2; imgSize.rheight() /= 2; downScaleSteps++; } imageReader.setScaledSize(imgSize); QImage snapPreview = imageReader.read(); QMetaObject::invokeMethod(this, "imageCaptured", Qt::QueuedConnection, Q_ARG(int, captureId), Q_ARG(QImage, snapPreview)); } qDebugCamera() << "Image captured" << actualFileName; QFile f(actualFileName); if (f.open(QFile::WriteOnly)) { if (f.write(jpgData) != -1) { QMetaObject::invokeMethod(this, "imageSaved", Qt::QueuedConnection, Q_ARG(int, captureId), Q_ARG(QString, actualFileName)); } else { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, captureId), Q_ARG(int, QCameraImageCapture::OutOfSpaceError), Q_ARG(QString, f.errorString())); } } else { QString errorMessage = tr("Could not open destination file:\n%1").arg(actualFileName); QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, captureId), Q_ARG(int, QCameraImageCapture::ResourceError), Q_ARG(QString, errorMessage)); } } }]; return captureId; } void AVFImageCaptureControl::cancelCapture() { //not supported } void AVFImageCaptureControl::updateCaptureConnection() { if (!m_videoConnection && m_cameraControl->captureMode().testFlag(QCamera::CaptureStillImage)) { qDebugCamera() << Q_FUNC_INFO; AVCaptureSession *captureSession = m_session->captureSession(); if ([captureSession canAddOutput:m_stillImageOutput]) { [captureSession addOutput:m_stillImageOutput]; for (AVCaptureConnection *connection in m_stillImageOutput.connections) { for (AVCaptureInputPort *port in [connection inputPorts]) { if ([[port mediaType] isEqual:AVMediaTypeVideo] ) { m_videoConnection = connection; break; } } if (m_videoConnection) break; } } updateReadyStatus(); } } #include "moc_avfimagecapturecontrol.cpp" avfmediarecordercontrol.h000066400000000000000000000067551225012771600360060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIARECORDERCONTROL_H #define AVFMEDIARECORDERCONTROL_H #include #include #import #include "avfstoragelocation.h" @class AVFMediaRecorderDelegate; QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraControl; class AVFCameraService; class AVFMediaRecorderControl : public QMediaRecorderControl { Q_OBJECT public: AVFMediaRecorderControl(AVFCameraService *service, QObject *parent = 0); ~AVFMediaRecorderControl(); QUrl outputLocation() const; bool setOutputLocation(const QUrl &location); QMediaRecorder::State state() const; QMediaRecorder::Status status() const; qint64 duration() const; bool isMuted() const; qreal volume() const; void applySettings(); public Q_SLOTS: void setState(QMediaRecorder::State state); void setMuted(bool muted); void setVolume(qreal volume); void handleRecordingStarted(); void handleRecordingFinished(); void handleRecordingFailed(const QString &message); private Q_SLOTS: void reconnectMovieOutput(); void updateStatus(); private: AVFCameraControl *m_cameraControl; AVFCameraSession *m_session; bool m_connected; QUrl m_outputLocation; QMediaRecorder::State m_state; QMediaRecorder::Status m_lastStatus; bool m_recordingStarted; bool m_recordingFinished; bool m_muted; qreal m_volume; AVCaptureMovieFileOutput *m_movieOutput; AVFMediaRecorderDelegate *m_recorderDelagate; AVFStorageLocation m_storageLocation; }; QT_END_NAMESPACE #endif avfmediarecordercontrol.mm000066400000000000000000000256261225012771600361660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfmediarecordercontrol.h" #include "avfcamerasession.h" #include "avfcameraservice.h" #include "avfcameracontrol.h" #include #include #include QT_USE_NAMESPACE @interface AVFMediaRecorderDelegate : NSObject { @private AVFMediaRecorderControl *m_recorder; } - (AVFMediaRecorderDelegate *) initWithRecorder:(AVFMediaRecorderControl*)recorder; - (void) captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections; - (void) captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections error:(NSError *)error; @end @implementation AVFMediaRecorderDelegate - (AVFMediaRecorderDelegate *) initWithRecorder:(AVFMediaRecorderControl*)recorder { if (!(self = [super init])) return nil; self->m_recorder = recorder; return self; } - (void) captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { Q_UNUSED(captureOutput); Q_UNUSED(fileURL); Q_UNUSED(connections) QMetaObject::invokeMethod(m_recorder, "handleRecordingStarted", Qt::QueuedConnection); } - (void) captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections error:(NSError *)error { Q_UNUSED(captureOutput); Q_UNUSED(fileURL); Q_UNUSED(connections) if (error) { QStringList messageParts; messageParts << QString::fromUtf8([[error localizedDescription] UTF8String]); messageParts << QString::fromUtf8([[error localizedFailureReason] UTF8String]); messageParts << QString::fromUtf8([[error localizedRecoverySuggestion] UTF8String]); QString errorMessage = messageParts.join(" "); QMetaObject::invokeMethod(m_recorder, "handleRecordingFailed", Qt::QueuedConnection, Q_ARG(QString, errorMessage)); } else { QMetaObject::invokeMethod(m_recorder, "handleRecordingFinished", Qt::QueuedConnection); } } @end AVFMediaRecorderControl::AVFMediaRecorderControl(AVFCameraService *service, QObject *parent) : QMediaRecorderControl(parent) , m_cameraControl(service->cameraControl()) , m_session(service->session()) , m_connected(false) , m_state(QMediaRecorder::StoppedState) , m_lastStatus(QMediaRecorder::UnloadedStatus) , m_recordingStarted(false) , m_recordingFinished(false) , m_muted(false) , m_volume(1.0) { m_movieOutput = [[AVCaptureMovieFileOutput alloc] init]; m_recorderDelagate = [[AVFMediaRecorderDelegate alloc] initWithRecorder:this]; connect(m_cameraControl, SIGNAL(stateChanged(QCamera::State)), SLOT(updateStatus())); connect(m_cameraControl, SIGNAL(statusChanged(QCamera::Status)), SLOT(updateStatus())); connect(m_cameraControl, SIGNAL(captureModeChanged(QCamera::CaptureModes)), SLOT(reconnectMovieOutput())); reconnectMovieOutput(); } AVFMediaRecorderControl::~AVFMediaRecorderControl() { if (m_movieOutput) [m_session->captureSession() removeOutput:m_movieOutput]; [m_recorderDelagate release]; } QUrl AVFMediaRecorderControl::outputLocation() const { return m_outputLocation; } bool AVFMediaRecorderControl::setOutputLocation(const QUrl &location) { m_outputLocation = location; return location.scheme() == QLatin1String("file") || location.scheme().isEmpty(); } QMediaRecorder::State AVFMediaRecorderControl::state() const { return m_state; } QMediaRecorder::Status AVFMediaRecorderControl::status() const { QMediaRecorder::Status status = m_lastStatus; //bool videoEnabled = m_cameraControl->captureMode().testFlag(QCamera::CaptureVideo); if (m_cameraControl->status() == QCamera::ActiveStatus && m_connected) { if (m_state == QMediaRecorder::StoppedState) { if (m_recordingStarted && !m_recordingFinished) status = QMediaRecorder::FinalizingStatus; else status = QMediaRecorder::LoadedStatus; } else { status = m_recordingStarted ? QMediaRecorder::RecordingStatus : QMediaRecorder::StartingStatus; } } else { //camera not started yet status = m_cameraControl->state() == QCamera::ActiveState && m_connected ? QMediaRecorder::LoadingStatus: QMediaRecorder::UnloadedStatus; } return status; } void AVFMediaRecorderControl::updateStatus() { QMediaRecorder::Status newStatus = status(); if (m_lastStatus != newStatus) { qDebugCamera() << "Camera recorder status changed: " << m_lastStatus << " -> " << newStatus; m_lastStatus = newStatus; Q_EMIT statusChanged(m_lastStatus); } } qint64 AVFMediaRecorderControl::duration() const { if (!m_movieOutput) return 0; return qint64(CMTimeGetSeconds(m_movieOutput.recordedDuration) * 1000); } bool AVFMediaRecorderControl::isMuted() const { return m_muted; } qreal AVFMediaRecorderControl::volume() const { return m_volume; } void AVFMediaRecorderControl::applySettings() { } void AVFMediaRecorderControl::setState(QMediaRecorder::State state) { if (m_state == state) return; qDebugCamera() << Q_FUNC_INFO << m_state << " -> " << state; switch (state) { case QMediaRecorder::RecordingState: { if (m_connected) { m_state = QMediaRecorder::RecordingState; m_recordingStarted = false; m_recordingFinished = false; QString outputLocationPath = m_outputLocation.scheme() == QLatin1String("file") ? m_outputLocation.path() : m_outputLocation.toString(); QUrl actualLocation = QUrl::fromLocalFile( m_storageLocation.generateFileName(outputLocationPath, QCamera::CaptureVideo, QLatin1String("clip_"), QLatin1String("mp4"))); qDebugCamera() << "Video capture location:" << actualLocation.toString(); NSString *urlString = [NSString stringWithUTF8String:actualLocation.toString().toUtf8().constData()]; NSURL *fileURL = [NSURL URLWithString:urlString]; [m_movieOutput startRecordingToOutputFileURL:fileURL recordingDelegate:m_recorderDelagate]; Q_EMIT actualLocationChanged(actualLocation); } else { Q_EMIT error(QMediaRecorder::FormatError, tr("Recorder not configured")); } } break; case QMediaRecorder::PausedState: { Q_EMIT error(QMediaRecorder::FormatError, tr("Recording pause not supported")); return; } break; case QMediaRecorder::StoppedState: { m_state = QMediaRecorder::StoppedState; [m_movieOutput stopRecording]; } } updateStatus(); Q_EMIT stateChanged(m_state); } void AVFMediaRecorderControl::setMuted(bool muted) { if (m_muted != muted) { m_muted = muted; Q_EMIT mutedChanged(muted); } } void AVFMediaRecorderControl::setVolume(qreal volume) { if (m_volume != volume) { m_volume = volume; Q_EMIT volumeChanged(volume); } } void AVFMediaRecorderControl::handleRecordingStarted() { m_recordingStarted = true; updateStatus(); } void AVFMediaRecorderControl::handleRecordingFinished() { m_recordingFinished = true; updateStatus(); } void AVFMediaRecorderControl::handleRecordingFailed(const QString &message) { m_recordingFinished = true; if (m_state != QMediaRecorder::StoppedState) { m_state = QMediaRecorder::StoppedState; Q_EMIT stateChanged(m_state); } updateStatus(); Q_EMIT error(QMediaRecorder::ResourceError, message); } void AVFMediaRecorderControl::reconnectMovieOutput() { //adding movie output causes high CPU usage even when while recording is not active, //connect it only while video capture mode is enabled AVCaptureSession *captureSession = m_session->captureSession(); if (!m_connected && m_cameraControl->captureMode().testFlag(QCamera::CaptureVideo)) { if ([captureSession canAddOutput:m_movieOutput]) { [captureSession addOutput:m_movieOutput]; m_connected = true; } else { Q_EMIT error(QMediaRecorder::ResourceError, tr("Could not connect the video recorder")); qWarning() << "Could not connect the video recorder"; } } else if (m_connected && !m_cameraControl->captureMode().testFlag(QCamera::CaptureVideo)) { [captureSession removeOutput:m_movieOutput]; m_connected = false; } updateStatus(); } #include "moc_avfmediarecordercontrol.cpp" avfstoragelocation.h000066400000000000000000000051351225012771600347640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFSTORAGE_H #define AVFSTORAGE_H #include "qtmultimediadefs.h" #include #include QT_BEGIN_NAMESPACE class AVFStorageLocation { public: AVFStorageLocation(); ~AVFStorageLocation(); QString generateFileName(const QString &requestedName, QCamera::CaptureMode mode, const QString &prefix, const QString &ext) const; QDir defaultDir(QCamera::CaptureMode mode) const; QString generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const; private: mutable QMap m_lastUsedIndex; }; QT_END_NAMESPACE #endif avfstoragelocation.mm000066400000000000000000000115521225012771600351460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfstoragelocation.h" #include "QtCore/qstandardpaths.h" QT_BEGIN_NAMESPACE AVFStorageLocation::AVFStorageLocation() { } AVFStorageLocation::~AVFStorageLocation() { } /*! * Generate the actual file name from user requested one. * requestedName may be either empty (the default dir and naming theme is used), * points to existing dir (the default name used) * or specify the full actual path. */ QString AVFStorageLocation::generateFileName(const QString &requestedName, QCamera::CaptureMode mode, const QString &prefix, const QString &ext) const { if (requestedName.isEmpty()) return generateFileName(prefix, defaultDir(mode), ext); if (QFileInfo(requestedName).isDir()) return generateFileName(prefix, QDir(requestedName), ext); return requestedName; } QDir AVFStorageLocation::defaultDir(QCamera::CaptureMode mode) const { QStringList dirCandidates; if (mode == QCamera::CaptureVideo) { dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MoviesLocation); } else { dirCandidates << QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); } dirCandidates << QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); dirCandidates << QDir::homePath(); dirCandidates << QDir::currentPath(); dirCandidates << QDir::tempPath(); Q_FOREACH (const QString &path, dirCandidates) { if (QFileInfo(path).isWritable()) return QDir(path); } return QDir(); } QString AVFStorageLocation::generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const { QString lastClipKey = dir.absolutePath()+QLatin1Char(' ')+prefix+QLatin1Char(' ')+ext; int lastClip = m_lastUsedIndex.value(lastClipKey, 0); if (lastClip == 0) { //first run, find the maximum clip number during the fist capture Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(ext))) { int imgNumber = fileName.mid(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt(); lastClip = qMax(lastClip, imgNumber); } } //don't just rely on cached lastClip value, //someone else may create a file after camera started while (true) { QString name = QString("%1%2.%3").arg(prefix) .arg(lastClip+1, 4, //fieldWidth 10, QLatin1Char('0')) .arg(ext); QString path = dir.absoluteFilePath(name); if (!QFileInfo(path).exists()) { m_lastUsedIndex[lastClipKey] = lastClip+1; return path; } lastClip++; } return QString(); } QT_END_NAMESPACE avfvideodevicecontrol.h000066400000000000000000000056371225012771600354650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEODEVICECONTROL_H #define AVFVIDEODEVICECONTROL_H #include #include #import QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFVideoDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT public: AVFVideoDeviceControl(AVFCameraService *service, QObject *parent = 0); ~AVFVideoDeviceControl(); int deviceCount() const; QString deviceName(int index) const; QString deviceDescription(int index) const; int defaultDevice() const; int selectedDevice() const; public Q_SLOTS: void setSelectedDevice(int index); public: //device changed since the last createCaptureDevice() bool isDirty() const { return m_dirty; } AVCaptureDevice *createCaptureDevice(); private: AVFCameraService *m_service; int m_selectedDevice; bool m_dirty; QStringList m_devices; QStringList m_deviceDescriptions; }; QT_END_NAMESPACE #endif avfvideodevicecontrol.mm000066400000000000000000000074261225012771600356450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfcameradebug.h" #include "avfvideodevicecontrol.h" #include "avfcameraservice.h" QT_USE_NAMESPACE AVFVideoDeviceControl::AVFVideoDeviceControl(AVFCameraService *service, QObject *parent) : QVideoDeviceSelectorControl(parent) , m_service(service) , m_selectedDevice(0) , m_dirty(true) { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in videoDevices) { m_devices << QString::fromUtf8([[device uniqueID] UTF8String]); m_deviceDescriptions << QString::fromUtf8([[device localizedName] UTF8String]); } } AVFVideoDeviceControl::~AVFVideoDeviceControl() { } int AVFVideoDeviceControl::deviceCount() const { return m_devices.size(); } QString AVFVideoDeviceControl::deviceName(int index) const { return m_devices[index]; } QString AVFVideoDeviceControl::deviceDescription(int index) const { return m_deviceDescriptions[index]; } int AVFVideoDeviceControl::defaultDevice() const { return 0; } int AVFVideoDeviceControl::selectedDevice() const { return m_selectedDevice; } void AVFVideoDeviceControl::setSelectedDevice(int index) { if (index != m_selectedDevice) { m_dirty = true; m_selectedDevice = index; Q_EMIT selectedDeviceChanged(index); Q_EMIT selectedDeviceChanged(m_devices[index]); } } AVCaptureDevice *AVFVideoDeviceControl::createCaptureDevice() { m_dirty = false; AVCaptureDevice *device = 0; if (!m_devices.isEmpty()) { QString deviceId = m_devices.at(m_selectedDevice); device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String: deviceId.toUtf8().constData()]]; } if (!device) device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; return device; } #include "moc_avfvideodevicecontrol.cpp" avfvideorenderercontrol.h000066400000000000000000000060401225012771600360210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEORENDERERCONTROL_H #define AVFVIDEORENDERERCONTROL_H #include #include #include #import @class AVFCaptureFramesDelegate; QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFVideoRendererControl; class AVFVideoRendererControl : public QVideoRendererControl { Q_OBJECT public: AVFVideoRendererControl(QObject *parent = 0); ~AVFVideoRendererControl(); QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); void configureAVCaptureSession(AVCaptureSession *captureSession); void syncHandleViewfinderFrame(const QVideoFrame &frame); Q_SIGNALS: void surfaceChanged(QAbstractVideoSurface *surface); private Q_SLOTS: void handleViewfinderFrame(); private: QAbstractVideoSurface *m_surface; AVFCaptureFramesDelegate *m_viewfinderFramesDelegate; AVCaptureSession *m_captureSession; AVCaptureVideoDataOutput *m_videoDataOutput; QVideoFrame m_lastViewfinderFrame; QMutex m_vfMutex; }; QT_END_NAMESPACE #endif avfvideorenderercontrol.mm000066400000000000000000000164111225012771600362060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideorenderercontrol.h" #include "avfcamerasession.h" #include "avfcameraservice.h" #include "avfcameradebug.h" #include #include #include QT_USE_NAMESPACE class CVPixelBufferVideoBuffer : public QAbstractVideoBuffer { public: CVPixelBufferVideoBuffer(CVPixelBufferRef buffer) : QAbstractVideoBuffer(NoHandle) , m_buffer(buffer) , m_mode(NotMapped) { CVPixelBufferRetain(m_buffer); } virtual ~CVPixelBufferVideoBuffer() { CVPixelBufferRelease(m_buffer); } MapMode mapMode() const { return m_mode; } uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) { if (mode != NotMapped && m_mode == NotMapped) { CVPixelBufferLockBaseAddress(m_buffer, 0); if (numBytes) *numBytes = CVPixelBufferGetDataSize(m_buffer); if (bytesPerLine) *bytesPerLine = CVPixelBufferGetBytesPerRow(m_buffer); m_mode = mode; return (uchar*)CVPixelBufferGetBaseAddress(m_buffer); } else { return 0; } } void unmap() { if (m_mode != NotMapped) { m_mode = NotMapped; CVPixelBufferUnlockBaseAddress(m_buffer, 0); } } private: CVPixelBufferRef m_buffer; MapMode m_mode; }; @interface AVFCaptureFramesDelegate : NSObject { @private AVFVideoRendererControl *m_renderer; } - (AVFCaptureFramesDelegate *) initWithRenderer:(AVFVideoRendererControl*)renderer; - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection; @end @implementation AVFCaptureFramesDelegate - (AVFCaptureFramesDelegate *) initWithRenderer:(AVFVideoRendererControl*)renderer { if (!(self = [super init])) return nil; self->m_renderer = renderer; return self; } - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { Q_UNUSED(connection); Q_UNUSED(captureOutput); CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); int width = CVPixelBufferGetWidth(imageBuffer); int height = CVPixelBufferGetHeight(imageBuffer); QAbstractVideoBuffer *buffer = new CVPixelBufferVideoBuffer(imageBuffer); QVideoFrame frame(buffer, QSize(width, height), QVideoFrame::Format_RGB32); m_renderer->syncHandleViewfinderFrame(frame); } @end AVFVideoRendererControl::AVFVideoRendererControl(QObject *parent) : QVideoRendererControl(parent) , m_surface(0) { m_viewfinderFramesDelegate = [[AVFCaptureFramesDelegate alloc] initWithRenderer:this]; } AVFVideoRendererControl::~AVFVideoRendererControl() { [m_captureSession removeOutput:m_videoDataOutput]; [m_viewfinderFramesDelegate release]; } QAbstractVideoSurface *AVFVideoRendererControl::surface() const { return m_surface; } void AVFVideoRendererControl::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { m_surface = surface; Q_EMIT surfaceChanged(surface); } } void AVFVideoRendererControl::configureAVCaptureSession(AVCaptureSession *captureSession) { m_captureSession = captureSession; m_videoDataOutput = [[[AVCaptureVideoDataOutput alloc] init] autorelease]; // Configure video output dispatch_queue_t queue = dispatch_queue_create("vf_queue", NULL); [m_videoDataOutput setSampleBufferDelegate:m_viewfinderFramesDelegate queue:queue]; dispatch_release(queue); // Specify the pixel format m_videoDataOutput.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; [m_captureSession addOutput:m_videoDataOutput]; } //can be called from non main thread void AVFVideoRendererControl::syncHandleViewfinderFrame(const QVideoFrame &frame) { QMutexLocker lock(&m_vfMutex); if (!m_lastViewfinderFrame.isValid()) { static QMetaMethod handleViewfinderFrameSlot = metaObject()->method( metaObject()->indexOfMethod("handleViewfinderFrame()")); handleViewfinderFrameSlot.invoke(this, Qt::QueuedConnection); } m_lastViewfinderFrame = frame; } void AVFVideoRendererControl::handleViewfinderFrame() { QVideoFrame frame; { QMutexLocker lock(&m_vfMutex); frame = m_lastViewfinderFrame; m_lastViewfinderFrame = QVideoFrame(); } if (m_surface && frame.isValid()) { if (m_surface->isActive() && m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat()) m_surface->stop(); if (!m_surface->isActive()) { QVideoSurfaceFormat format(frame.size(), frame.pixelFormat()); if (!m_surface->start(format)) { qWarning() << "Failed to start viewfinder m_surface, format:" << format; } else { qDebugCamera() << "Viewfinder started: " << format; } } if (m_surface->isActive()) m_surface->present(frame); } } #include "moc_avfvideorenderercontrol.cpp" camera.pro000066400000000000000000000022601225012771600326670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/camera# Avoid clash with a variable named `slots' in a Quartz header CONFIG += no_keywords TARGET = qavfcamera QT += multimedia-private network PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = AVFServicePlugin load(qt_plugin) LIBS += -framework AppKit -framework AudioUnit \ -framework AudioToolbox -framework CoreAudio \ -framework QuartzCore -framework AVFoundation \ -framework CoreMedia OTHER_FILES += avfcamera.json DEFINES += QMEDIA_AVF_CAMERA HEADERS += \ avfcameradebug.h \ avfcameraserviceplugin.h \ avfcameracontrol.h \ avfvideorenderercontrol.h \ avfcamerametadatacontrol.h \ avfimagecapturecontrol.h \ avfmediarecordercontrol.h \ avfcameraservice.h \ avfcamerasession.h \ avfstoragelocation.h \ avfvideodevicecontrol.h \ avfaudioinputselectorcontrol.h \ OBJECTIVE_SOURCES += \ avfcameraserviceplugin.mm \ avfcameracontrol.mm \ avfvideorenderercontrol.mm \ avfcamerametadatacontrol.mm \ avfimagecapturecontrol.mm \ avfmediarecordercontrol.mm \ avfcameraservice.mm \ avfcamerasession.mm \ avfstoragelocation.mm \ avfvideodevicecontrol.mm \ avfaudioinputselectorcontrol.mm \ qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/000077500000000000000000000000001225012771600320405ustar00rootroot00000000000000avfdisplaylink.h000066400000000000000000000052531225012771600351570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFDISPLAYLINK_H #define AVFDISPLAYLINK_H #include #include #include QT_BEGIN_NAMESPACE class AVFDisplayLink : public QObject { Q_OBJECT public: explicit AVFDisplayLink(QObject *parent = 0); virtual ~AVFDisplayLink(); bool isValid() const; bool isActive() const; public Q_SLOTS: void start(); void stop(); Q_SIGNALS: void tick(const CVTimeStamp &ts); public: void displayLinkEvent(const CVTimeStamp *); protected: virtual bool event(QEvent *); private: CVDisplayLinkRef m_displayLink; QMutex m_displayLinkMutex; bool m_pendingDisplayLinkEvent; bool m_isActive; CVTimeStamp m_frameTimeStamp; }; QT_END_NAMESPACE #endif // AVFDISPLAYLINK_H avfdisplaylink.mm000066400000000000000000000115001225012771600353310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfdisplaylink.h" #include #ifdef QT_DEBUG_AVF #include #endif QT_USE_NAMESPACE static CVReturn CVDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) { Q_UNUSED(displayLink); Q_UNUSED(inNow); Q_UNUSED(flagsIn); Q_UNUSED(flagsOut); AVFDisplayLink *link = (AVFDisplayLink *)displayLinkContext; link->displayLinkEvent(inOutputTime); return kCVReturnSuccess; } AVFDisplayLink::AVFDisplayLink(QObject *parent) : QObject(parent) , m_pendingDisplayLinkEvent(false) , m_isActive(false) { // create display link for the main display CVDisplayLinkCreateWithCGDisplay(kCGDirectMainDisplay, &m_displayLink); if (m_displayLink) { // set the current display of a display link. CVDisplayLinkSetCurrentCGDisplay(m_displayLink, kCGDirectMainDisplay); // set the renderer output callback function CVDisplayLinkSetOutputCallback(m_displayLink, &CVDisplayLinkCallback, this); } } AVFDisplayLink::~AVFDisplayLink() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif if (m_displayLink) { CVDisplayLinkStop(m_displayLink); CVDisplayLinkRelease(m_displayLink); m_displayLink = NULL; } } bool AVFDisplayLink::isValid() const { return m_displayLink != 0; } bool AVFDisplayLink::isActive() const { return m_isActive; } void AVFDisplayLink::start() { if (m_displayLink && !m_isActive) { CVDisplayLinkStart(m_displayLink); m_isActive = true; } } void AVFDisplayLink::stop() { if (m_displayLink && m_isActive) { CVDisplayLinkStop(m_displayLink); m_isActive = false; } } void AVFDisplayLink::displayLinkEvent(const CVTimeStamp *ts) { // This function is called from a // thread != gui thread. So we post the event. // But we need to make sure that we don't post faster // than the event loop can eat: m_displayLinkMutex.lock(); bool pending = m_pendingDisplayLinkEvent; m_pendingDisplayLinkEvent = true; m_frameTimeStamp = *ts; m_displayLinkMutex.unlock(); if (!pending) qApp->postEvent(this, new QEvent(QEvent::User), Qt::HighEventPriority); } bool AVFDisplayLink::event(QEvent *event) { switch (event->type()){ case QEvent::User: { m_displayLinkMutex.lock(); m_pendingDisplayLinkEvent = false; CVTimeStamp ts = m_frameTimeStamp; m_displayLinkMutex.unlock(); Q_EMIT tick(ts); return false; } break; default: break; } return QObject::event(event); } avfmediaplayer.json000066400000000000000000000000621225012771600356430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer{ "Keys": ["org.qt-project.qt.mediaplayer"] } avfmediaplayercontrol.h000066400000000000000000000062341225012771600365310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIAPLAYERCONTROL_H #define AVFMEDIAPLAYERCONTROL_H #include #include QT_BEGIN_NAMESPACE class AVFMediaPlayerSession; class AVFMediaPlayerControl : public QMediaPlayerControl { Q_OBJECT public: explicit AVFMediaPlayerControl(QObject *parent = 0); ~AVFMediaPlayerControl(); void setSession(AVFMediaPlayerSession *session); QMediaPlayer::State state() const; QMediaPlayer::MediaStatus mediaStatus() const; QMediaContent media() const; const QIODevice *mediaStream() const; void setMedia(const QMediaContent &content, QIODevice *stream); qint64 position() const; qint64 duration() const; int bufferStatus() const; int volume() const; bool isMuted() const; bool isAudioAvailable() const; bool isVideoAvailable() const; bool isSeekable() const; QMediaTimeRange availablePlaybackRanges() const; qreal playbackRate() const; void setPlaybackRate(qreal rate); public Q_SLOTS: void setPosition(qint64 pos); void play(); void pause(); void stop(); void setVolume(int volume); void setMuted(bool muted); private: AVFMediaPlayerSession *m_session; }; QT_END_NAMESPACE #endif // AVFMEDIAPLAYERCONTROL_H avfmediaplayercontrol.mm000066400000000000000000000123241225012771600367100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfmediaplayercontrol.h" #include "avfmediaplayersession.h" QT_USE_NAMESPACE AVFMediaPlayerControl::AVFMediaPlayerControl(QObject *parent) : QMediaPlayerControl(parent) { } AVFMediaPlayerControl::~AVFMediaPlayerControl() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif } void AVFMediaPlayerControl::setSession(AVFMediaPlayerSession *session) { m_session = session; connect(m_session, SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64))); connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); connect(m_session, SIGNAL(stateChanged(QMediaPlayer::State)), this, SIGNAL(stateChanged(QMediaPlayer::State))); connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); connect(m_session, SIGNAL(volumeChanged(int)), this, SIGNAL(volumeChanged(int))); connect(m_session, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); connect(m_session, SIGNAL(audioAvailableChanged(bool)), this, SIGNAL(audioAvailableChanged(bool))); connect(m_session, SIGNAL(videoAvailableChanged(bool)), this, SIGNAL(videoAvailableChanged(bool))); connect(m_session, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString))); } QMediaPlayer::State AVFMediaPlayerControl::state() const { return m_session->state(); } QMediaPlayer::MediaStatus AVFMediaPlayerControl::mediaStatus() const { return m_session->mediaStatus(); } QMediaContent AVFMediaPlayerControl::media() const { return m_session->media(); } const QIODevice *AVFMediaPlayerControl::mediaStream() const { return m_session->mediaStream(); } void AVFMediaPlayerControl::setMedia(const QMediaContent &content, QIODevice *stream) { m_session->setMedia(content, stream); Q_EMIT mediaChanged(content); } qint64 AVFMediaPlayerControl::position() const { return m_session->position(); } qint64 AVFMediaPlayerControl::duration() const { return m_session->duration(); } int AVFMediaPlayerControl::bufferStatus() const { return m_session->bufferStatus(); } int AVFMediaPlayerControl::volume() const { return m_session->volume(); } bool AVFMediaPlayerControl::isMuted() const { return m_session->isMuted(); } bool AVFMediaPlayerControl::isAudioAvailable() const { return m_session->isAudioAvailable(); } bool AVFMediaPlayerControl::isVideoAvailable() const { return m_session->isVideoAvailable(); } bool AVFMediaPlayerControl::isSeekable() const { return m_session->isSeekable(); } QMediaTimeRange AVFMediaPlayerControl::availablePlaybackRanges() const { return m_session->availablePlaybackRanges(); } qreal AVFMediaPlayerControl::playbackRate() const { return m_session->playbackRate(); } void AVFMediaPlayerControl::setPlaybackRate(qreal rate) { m_session->setPlaybackRate(rate); } void AVFMediaPlayerControl::setPosition(qint64 pos) { m_session->setPosition(pos); } void AVFMediaPlayerControl::play() { m_session->play(); } void AVFMediaPlayerControl::pause() { m_session->pause(); } void AVFMediaPlayerControl::stop() { m_session->stop(); } void AVFMediaPlayerControl::setVolume(int volume) { m_session->setVolume(volume); } void AVFMediaPlayerControl::setMuted(bool muted) { m_session->setMuted(muted); } avfmediaplayermetadatacontrol.h000066400000000000000000000052531225012771600402320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIAPLAYERMETADATACONTROL_H #define AVFMEDIAPLAYERMETADATACONTROL_H #include QT_BEGIN_NAMESPACE class AVFMediaPlayerSession; class AVFMediaPlayerMetaDataControl : public QMetaDataReaderControl { Q_OBJECT public: explicit AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent = 0); virtual ~AVFMediaPlayerMetaDataControl(); bool isMetaDataAvailable() const; bool isWritable() const; QVariant metaData(const QString &key) const; QStringList availableMetaData() const; private Q_SLOTS: void updateTags(); private: AVFMediaPlayerSession *m_session; QMap m_tags; void *m_asset; }; QT_END_NAMESPACE #endif // AVFMEDIAPLAYERMETADATACONTROL_H avfmediaplayermetadatacontrol.mm000066400000000000000000000152601225012771600404130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfmediaplayermetadatacontrol.h" #include "avfmediaplayersession.h" #include #import QT_USE_NAMESPACE AVFMediaPlayerMetaDataControl::AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent) : QMetaDataReaderControl(parent) , m_session(session) , m_asset(0) { QObject::connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(updateTags())); } AVFMediaPlayerMetaDataControl::~AVFMediaPlayerMetaDataControl() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif } bool AVFMediaPlayerMetaDataControl::isMetaDataAvailable() const { return !m_tags.isEmpty(); } bool AVFMediaPlayerMetaDataControl::isWritable() const { return false; } QVariant AVFMediaPlayerMetaDataControl::metaData(const QString &key) const { return m_tags.value(key); } QStringList AVFMediaPlayerMetaDataControl::availableMetaData() const { return m_tags.keys(); } void AVFMediaPlayerMetaDataControl::updateTags() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif AVAsset *currentAsset = (AVAsset*)m_session->currentAssetHandle(); //Don't read the tags from the same asset more than once if (currentAsset == m_asset) { return; } m_asset = currentAsset; //Since we've changed assets, clear old tags m_tags.clear(); NSArray *metadataFormats = [currentAsset availableMetadataFormats]; for ( NSString *format in metadataFormats) { #ifdef QT_DEBUG_AVF qDebug() << "format: " << [format UTF8String]; #endif NSArray *metadataItems = [currentAsset metadataForFormat:format]; for (AVMetadataItem* item in metadataItems) { NSString *keyString = [item commonKey]; NSString *value = [item stringValue]; if (keyString.length != 0) { //Process "commonMetadata" tags here: if ([keyString isEqualToString:AVMetadataCommonKeyTitle]) { m_tags.insert(QMediaMetaData::Title, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyCreator]) { m_tags.insert(QMediaMetaData::Author, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) { m_tags.insert(QMediaMetaData::SubTitle, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyDescription]) { m_tags.insert(QMediaMetaData::Description, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyPublisher]) { m_tags.insert(QMediaMetaData::Publisher, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyContributor]) { m_tags.insert(QMediaMetaData::ContributingArtist, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyCreationDate]) { m_tags.insert(QMediaMetaData::Date, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyType]) { m_tags.insert(QMediaMetaData::MediaType, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyLanguage]) { m_tags.insert(QMediaMetaData::Language, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyCopyrights]) { m_tags.insert(QMediaMetaData::Copyright, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyAlbumName]) { m_tags.insert(QMediaMetaData::AlbumTitle, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyAuthor]) { m_tags.insert(QMediaMetaData::Author, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyArtist]) { m_tags.insert(QMediaMetaData::AlbumArtist, QString([value UTF8String])); } else if ([keyString isEqualToString: AVMetadataCommonKeyArtwork]) { m_tags.insert(QMediaMetaData::PosterUrl, QString([value UTF8String])); } } if ([format isEqualToString:AVMetadataFormatID3Metadata]) { //TODO: Process ID3 metadata } else if ([format isEqualToString:AVMetadataFormatiTunesMetadata]) { //TODO: Process iTunes metadata } else if ([format isEqualToString:AVMetadataFormatQuickTimeUserData]) { //TODO: Process QuickTime metadata } } } Q_EMIT metaDataChanged(); } avfmediaplayerservice.h000066400000000000000000000051651225012771600365130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIAPLAYERSERVICE_H #define AVFMEDIAPLAYERSERVICE_H #include QT_BEGIN_NAMESPACE class AVFMediaPlayerSession; class AVFMediaPlayerControl; class AVFMediaPlayerMetaDataControl; class AVFVideoOutput; class AVFMediaPlayerService : public QMediaService { public: explicit AVFMediaPlayerService(QObject *parent = 0); ~AVFMediaPlayerService(); QMediaControl* requestControl(const char *name); void releaseControl(QMediaControl *control); private: AVFMediaPlayerSession *m_session; AVFMediaPlayerControl *m_control; QMediaControl *m_videoOutput; AVFMediaPlayerMetaDataControl *m_playerMetaDataControl; }; QT_END_NAMESPACE #endif // AVFMEDIAPLAYERSERVICE_H avfmediaplayerservice.mm000066400000000000000000000100701225012771600366640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfmediaplayerservice.h" #include "avfmediaplayersession.h" #include "avfmediaplayercontrol.h" #include "avfmediaplayermetadatacontrol.h" #include "avfvideooutput.h" #include "avfvideorenderercontrol.h" #ifndef QT_NO_WIDGETS #include "avfvideowidgetcontrol.h" #endif QT_USE_NAMESPACE AVFMediaPlayerService::AVFMediaPlayerService(QObject *parent) : QMediaService(parent) , m_videoOutput(0) { m_session = new AVFMediaPlayerSession(this); m_control = new AVFMediaPlayerControl(this); m_control->setSession(m_session); m_playerMetaDataControl = new AVFMediaPlayerMetaDataControl(m_session, this); connect(m_control, SIGNAL(mediaChanged(QMediaContent)), m_playerMetaDataControl, SLOT(updateTags())); } AVFMediaPlayerService::~AVFMediaPlayerService() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif delete m_session; } QMediaControl *AVFMediaPlayerService::requestControl(const char *name) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << name; #endif if (qstrcmp(name, QMediaPlayerControl_iid) == 0) return m_control; if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) return m_playerMetaDataControl; if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!m_videoOutput) m_videoOutput = new AVFVideoRendererControl(this); m_session->setVideoOutput(qobject_cast(m_videoOutput)); return m_videoOutput; } #ifndef QT_NO_WIDGETS if (qstrcmp(name, QVideoWidgetControl_iid) == 0) { if (!m_videoOutput) m_videoOutput = new AVFVideoWidgetControl(this); m_session->setVideoOutput(qobject_cast(m_videoOutput)); return m_videoOutput; } #endif return 0; } void AVFMediaPlayerService::releaseControl(QMediaControl *control) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << control; #endif if (m_videoOutput == control) { AVFVideoRendererControl *renderControl = qobject_cast(m_videoOutput); if (renderControl) renderControl->setSurface(0); m_videoOutput = 0; m_session->setVideoOutput(0); delete control; } } avfmediaplayerserviceplugin.h000066400000000000000000000057551225012771600377370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIAPLAYERSERVICEPLUGIN_H #define AVFMEDIAPLAYERSERVICEPLUGIN_H #include #include QT_BEGIN_NAMESPACE class AVFMediaPlayerServicePlugin : public QMediaServiceProviderPlugin , public QMediaServiceSupportedFormatsInterface , public QMediaServiceFeaturesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedFormatsInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "avfmediaplayer.json") public: explicit AVFMediaPlayerServicePlugin(); QMediaService* create(QString const& key); void release(QMediaService *service); QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const; QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const; QStringList supportedMimeTypes() const; private: void buildSupportedTypes(); QStringList m_supportedMimeTypes; }; QT_END_NAMESPACE #endif // AVFMEDIAPLAYERSERVICEPLUGIN_H avfmediaplayerserviceplugin.mm000066400000000000000000000073031225012771600401100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfmediaplayerserviceplugin.h" #include #include "avfmediaplayerservice.h" #import QT_USE_NAMESPACE AVFMediaPlayerServicePlugin::AVFMediaPlayerServicePlugin() { buildSupportedTypes(); } QMediaService *AVFMediaPlayerServicePlugin::create(const QString &key) { #ifdef QT_DEBUG_AVF qDebug() << "AVFMediaPlayerServicePlugin::create" << key; #endif if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) return new AVFMediaPlayerService; qWarning() << "unsupported key: " << key; return 0; } void AVFMediaPlayerServicePlugin::release(QMediaService *service) { delete service; } QMediaServiceProviderHint::Features AVFMediaPlayerServicePlugin::supportedFeatures(const QByteArray &service) const { if (service == Q_MEDIASERVICE_MEDIAPLAYER) return QMediaServiceProviderHint::VideoSurface; else return QMediaServiceProviderHint::Features(); } QMultimedia::SupportEstimate AVFMediaPlayerServicePlugin::hasSupport(const QString &mimeType, const QStringList &codecs) const { Q_UNUSED(codecs); if (m_supportedMimeTypes.contains(mimeType)) return QMultimedia::ProbablySupported; return QMultimedia::MaybeSupported; } QStringList AVFMediaPlayerServicePlugin::supportedMimeTypes() const { return m_supportedMimeTypes; } void AVFMediaPlayerServicePlugin::buildSupportedTypes() { //Populate m_supportedMimeTypes with mimetypes AVAsset supports NSArray *mimeTypes = [AVURLAsset audiovisualMIMETypes]; for (NSString *mimeType in mimeTypes) { m_supportedMimeTypes.append(QString::fromUtf8([mimeType UTF8String])); } #ifdef QT_DEBUG_AVF qDebug() << "AVFMediaPlayerServicePlugin::buildSupportedTypes"; qDebug() << "Supported Types: " << m_supportedMimeTypes; #endif } avfmediaplayersession.h000066400000000000000000000127731225012771600365410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFMEDIAPLAYERSESSION_H #define AVFMEDIAPLAYERSESSION_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class AVFMediaPlayerService; class AVFVideoOutput; class AVFMediaPlayerSession : public QObject { Q_OBJECT public: AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent = 0); virtual ~AVFMediaPlayerSession(); void setVideoOutput(AVFVideoOutput *output); void *currentAssetHandle(); QMediaPlayer::State state() const; QMediaPlayer::MediaStatus mediaStatus() const; QMediaContent media() const; const QIODevice *mediaStream() const; void setMedia(const QMediaContent &content, QIODevice *stream); qint64 position() const; qint64 duration() const; int bufferStatus() const; int volume() const; bool isMuted() const; bool isAudioAvailable() const; bool isVideoAvailable() const; bool isSeekable() const; QMediaTimeRange availablePlaybackRanges() const; qreal playbackRate() const; public Q_SLOTS: void setPlaybackRate(qreal rate); void setPosition(qint64 pos); void play(); void pause(); void stop(); void setVolume(int volume); void setMuted(bool muted); void processEOS(); void processLoadStateChange(); void processPositionChange(); void processMediaLoadError(); void processCurrentItemChanged(); Q_SIGNALS: void positionChanged(qint64 position); void durationChanged(qint64 duration); void stateChanged(QMediaPlayer::State newState); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void volumeChanged(int volume); void mutedChanged(bool muted); void audioAvailableChanged(bool audioAvailable); void videoAvailableChanged(bool videoAvailable); void error(int error, const QString &errorString); private: class ResourceHandler { public: ResourceHandler():resource(0) {} ~ResourceHandler() { clear(); } void setResourceFile(const QString &file) { if (resource) { if (resource->fileName() == file) return; delete resource; rawData.clear(); } resource = new QResource(file); } bool isValid() const { return resource && resource->isValid() && resource->data() != 0; } const uchar *data() { if (!isValid()) return 0; if (resource->isCompressed()) { if (rawData.size() == 0) rawData = qUncompress(resource->data(), resource->size()); return (const uchar *)rawData.constData(); } return resource->data(); } qint64 size() { if (data() == 0) return 0; return resource->isCompressed() ? rawData.size() : resource->size(); } void clear() { delete resource; rawData.clear(); } QResource *resource; QByteArray rawData; }; AVFMediaPlayerService *m_service; AVFVideoOutput *m_videoOutput; QMediaPlayer::State m_state; QMediaPlayer::MediaStatus m_mediaStatus; QIODevice *m_mediaStream; QMediaContent m_resources; ResourceHandler m_resourceHandler; bool m_muted; bool m_tryingAsync; int m_volume; qreal m_rate; qint64 m_duration; bool m_videoAvailable; bool m_audioAvailable; void *m_observer; }; QT_END_NAMESPACE #endif // AVFMEDIAPLAYERSESSION_H avfmediaplayersession.mm000066400000000000000000000657111225012771600367230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfmediaplayersession.h" #include "avfmediaplayerservice.h" #include "avfvideooutput.h" #import QT_USE_NAMESPACE //AVAsset Keys static NSString* const AVF_TRACKS_KEY = @"tracks"; static NSString* const AVF_PLAYABLE_KEY = @"playable"; //AVPlayerItem keys static NSString* const AVF_STATUS_KEY = @"status"; //AVPlayer keys static NSString* const AVF_RATE_KEY = @"rate"; static NSString* const AVF_CURRENT_ITEM_KEY = @"currentItem"; static void *AVFMediaPlayerSessionObserverRateObservationContext = &AVFMediaPlayerSessionObserverRateObservationContext; static void *AVFMediaPlayerSessionObserverStatusObservationContext = &AVFMediaPlayerSessionObserverStatusObservationContext; static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMediaPlayerSessionObserverCurrentItemObservationContext; @interface AVFMediaPlayerSessionObserver : NSObject { @private AVFMediaPlayerSession *m_session; AVPlayer *m_player; AVPlayerItem *m_playerItem; AVPlayerLayer *m_playerLayer; NSURL *m_URL; bool m_audioAvailable; bool m_videoAvailable; } @property (readonly, getter=player) AVPlayer* m_player; @property (readonly, getter=playerItem) AVPlayerItem* m_playerItem; @property (readonly, getter=playerLayer) AVPlayerLayer* m_playerLayer; @property (readonly, getter=audioAvailable) bool m_audioAvailable; @property (readonly, getter=videoAvailable) bool m_videoAvailable; @property (readonly, getter=session) AVFMediaPlayerSession* m_session; - (AVFMediaPlayerSessionObserver *) initWithMediaPlayerSession:(AVFMediaPlayerSession *)session; - (void) setURL:(NSURL *)url; - (void) unloadMedia; - (void) prepareToPlayAsset:(AVURLAsset *)asset withKeys:(NSArray *)requestedKeys; - (void) assetFailedToPrepareForPlayback:(NSError *)error; - (void) playerItemDidReachEnd:(NSNotification *)notification; - (void) playerItemTimeJumped:(NSNotification *)notification; - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; - (void) detatchSession; - (void) dealloc; @end @implementation AVFMediaPlayerSessionObserver @synthesize m_player, m_playerItem, m_playerLayer, m_audioAvailable, m_videoAvailable, m_session; - (AVFMediaPlayerSessionObserver *) initWithMediaPlayerSession:(AVFMediaPlayerSession *)session { if (!(self = [super init])) return nil; self->m_session = session; return self; } - (void) setURL:(NSURL *)url { if (m_URL != url) { [m_URL release]; m_URL = [url copy]; //Create an asset for inspection of a resource referenced by a given URL. //Load the values for the asset keys "tracks", "playable". AVURLAsset *asset = [AVURLAsset URLAssetWithURL:m_URL options:nil]; NSArray *requestedKeys = [NSArray arrayWithObjects:AVF_TRACKS_KEY, AVF_PLAYABLE_KEY, nil]; // Tells the asset to load the values of any of the specified keys that are not already loaded. [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{ dispatch_async( dispatch_get_main_queue(), ^{ [self prepareToPlayAsset:asset withKeys:requestedKeys]; }); }]; } } - (void) unloadMedia { [m_player setRate:0.0]; [m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY]; [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:m_playerItem]; [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemTimeJumpedNotification object:m_playerItem]; m_playerItem = 0; } - (void) prepareToPlayAsset:(AVURLAsset *)asset withKeys:(NSArray *)requestedKeys { //Make sure that the value of each key has loaded successfully. for (NSString *thisKey in requestedKeys) { NSError *error = nil; AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error]; #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << [thisKey UTF8String] << " status: " << keyStatus; #endif if (keyStatus == AVKeyValueStatusFailed) { [self assetFailedToPrepareForPlayback:error]; return; } } //Use the AVAsset playable property to detect whether the asset can be played. #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << "isPlayable: " << [asset isPlayable]; #endif if (!asset.playable) { //Generate an error describing the failure. NSString *localizedDescription = NSLocalizedString(@"Item cannot be played", @"Item cannot be played description"); NSString *localizedFailureReason = NSLocalizedString(@"The assets tracks were loaded, but could not be made playable.", @"Item cannot be played failure reason"); NSDictionary *errorDict = [NSDictionary dictionaryWithObjectsAndKeys: localizedDescription, NSLocalizedDescriptionKey, localizedFailureReason, NSLocalizedFailureReasonErrorKey, nil]; NSError *assetCannotBePlayedError = [NSError errorWithDomain:@"StitchedStreamPlayer" code:0 userInfo:errorDict]; [self assetFailedToPrepareForPlayback:assetCannotBePlayedError]; return; } m_audioAvailable = false; m_videoAvailable = false; //Check each track of asset for audio and video content NSArray *tracks = [asset tracks]; for (AVAssetTrack *track in tracks) { if ([track hasMediaCharacteristic:AVMediaCharacteristicAudible]) m_audioAvailable = true; if ([track hasMediaCharacteristic:AVMediaCharacteristicVisual]) m_videoAvailable = true; } //At this point we're ready to set up for playback of the asset. //Stop observing our prior AVPlayerItem, if we have one. if (m_playerItem) { //Remove existing player item key value observers and notifications. [self unloadMedia]; } //Create a new instance of AVPlayerItem from the now successfully loaded AVAsset. m_playerItem = [AVPlayerItem playerItemWithAsset:asset]; //Observe the player item "status" key to determine when it is ready to play. [m_playerItem addObserver:self forKeyPath:AVF_STATUS_KEY options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverStatusObservationContext]; //When the player item has played to its end time we'll toggle //the movie controller Pause button to be the Play button [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:m_playerItem]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemTimeJumped:) name:AVPlayerItemTimeJumpedNotification object:m_playerItem]; //Clean up old player if we have one if (m_player) { [m_player setRate:0.0]; [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY]; [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; [m_player release]; m_player = 0; [m_playerLayer release]; m_playerLayer = 0; //Will have been released } //Get a new AVPlayer initialized to play the specified player item. m_player = [AVPlayer playerWithPlayerItem:m_playerItem]; [m_player retain]; //Set the initial volume on new player object if (self.session) m_player.volume = m_session->volume() / 100.0f; //Create a new player layer if we don't have one already if (!m_playerLayer) { m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:m_player]; [m_playerLayer retain]; m_playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; //Get the native size of the new item, and reset the bounds of the player layer AVAsset *asset = m_playerItem.asset; if (asset) { NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if ([tracks count]) { AVAssetTrack *videoTrack = [tracks objectAtIndex:0]; m_playerLayer.anchorPoint = CGPointMake(0.0f, 0.0f); m_playerLayer.bounds = CGRectMake(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height); } } } //Observe the AVPlayer "currentItem" property to find out when any //AVPlayer replaceCurrentItemWithPlayerItem: replacement will/did //occur. [m_player addObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverCurrentItemObservationContext]; //Observe the AVPlayer "rate" property to update the scrubber control. [m_player addObserver:self forKeyPath:AVF_RATE_KEY options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverRateObservationContext]; } -(void) assetFailedToPrepareForPlayback:(NSError *)error { Q_UNUSED(error) QMetaObject::invokeMethod(m_session, "processMediaLoadError", Qt::AutoConnection); #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; qDebug() << [[error localizedDescription] UTF8String]; qDebug() << [[error localizedFailureReason] UTF8String]; qDebug() << [[error localizedRecoverySuggestion] UTF8String]; #endif } - (void) playerItemDidReachEnd:(NSNotification *)notification { Q_UNUSED(notification) if (self.session) QMetaObject::invokeMethod(m_session, "processEOS", Qt::AutoConnection); } - (void) playerItemTimeJumped:(NSNotification *)notification { Q_UNUSED(notification) if (self.session) QMetaObject::invokeMethod(m_session, "processPositionChange", Qt::AutoConnection); } - (void) observeValueForKeyPath:(NSString*) path ofObject:(id)object change:(NSDictionary*)change context:(void*)context { //AVPlayerItem "status" property value observer. if (context == AVFMediaPlayerSessionObserverStatusObservationContext) { AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue]; switch (status) { //Indicates that the status of the player is not yet known because //it has not tried to load new media resources for playback case AVPlayerStatusUnknown: { //QMetaObject::invokeMethod(m_session, "processLoadStateChange", Qt::AutoConnection); } break; case AVPlayerStatusReadyToPlay: { //Once the AVPlayerItem becomes ready to play, i.e. //[playerItem status] == AVPlayerItemStatusReadyToPlay, //its duration can be fetched from the item. if (self.session) QMetaObject::invokeMethod(m_session, "processLoadStateChange", Qt::AutoConnection); } break; case AVPlayerStatusFailed: { AVPlayerItem *playerItem = (AVPlayerItem *)object; [self assetFailedToPrepareForPlayback:playerItem.error]; if (self.session) QMetaObject::invokeMethod(m_session, "processLoadStateChange", Qt::AutoConnection); } break; } } //AVPlayer "rate" property value observer. else if (context == AVFMediaPlayerSessionObserverRateObservationContext) { //QMetaObject::invokeMethod(m_session, "setPlaybackRate", Qt::AutoConnection, Q_ARG(qreal, [m_player rate])); } //AVPlayer "currentItem" property observer. //Called when the AVPlayer replaceCurrentItemWithPlayerItem: //replacement will/did occur. else if (context == AVFMediaPlayerSessionObserverCurrentItemObservationContext) { AVPlayerItem *newPlayerItem = [change objectForKey:NSKeyValueChangeNewKey]; if (m_playerItem != newPlayerItem) { m_playerItem = newPlayerItem; //Get the native size of the new item, and reset the bounds of the player layer //AVAsset *asset = m_playerItem.asset; AVAsset *asset = [m_playerItem asset]; if (asset) { NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if ([tracks count]) { AVAssetTrack *videoTrack = [tracks objectAtIndex:0]; m_playerLayer.anchorPoint = CGPointMake(0.0f, 0.0f); m_playerLayer.bounds = CGRectMake(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height); } } } if (self.session) QMetaObject::invokeMethod(m_session, "processCurrentItemChanged", Qt::AutoConnection); } else { [super observeValueForKeyPath:path ofObject:object change:change context:context]; } } - (void) detatchSession { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif m_session = 0; } - (void) dealloc { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY]; [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; [m_player release]; [m_playerLayer release]; [self unloadMedia]; [m_URL release]; [super dealloc]; } @end AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent) : QObject(parent) , m_service(service) , m_videoOutput(0) , m_state(QMediaPlayer::StoppedState) , m_mediaStatus(QMediaPlayer::NoMedia) , m_mediaStream(0) , m_muted(false) , m_tryingAsync(false) , m_volume(100) , m_rate(1.0) , m_duration(0) , m_videoAvailable(false) , m_audioAvailable(false) { m_observer = [[AVFMediaPlayerSessionObserver alloc] initWithMediaPlayerSession:this]; } AVFMediaPlayerSession::~AVFMediaPlayerSession() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif //Detatch the session from the sessionObserver (which could still be alive trying to communicate with this session). [(AVFMediaPlayerSessionObserver*)m_observer detatchSession]; [(AVFMediaPlayerSessionObserver*)m_observer release]; } void AVFMediaPlayerSession::setVideoOutput(AVFVideoOutput *output) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << output; #endif if (m_videoOutput == output) return; //Set the current output layer to null to stop rendering if (m_videoOutput) { m_videoOutput->setLayer(0); } m_videoOutput = output; if (m_videoOutput && m_state != QMediaPlayer::StoppedState) m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); } void *AVFMediaPlayerSession::currentAssetHandle() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif AVAsset *currentAsset = [[(AVFMediaPlayerSessionObserver*)m_observer playerItem] asset]; return currentAsset; } QMediaPlayer::State AVFMediaPlayerSession::state() const { return m_state; } QMediaPlayer::MediaStatus AVFMediaPlayerSession::mediaStatus() const { return m_mediaStatus; } QMediaContent AVFMediaPlayerSession::media() const { return m_resources; } const QIODevice *AVFMediaPlayerSession::mediaStream() const { return m_mediaStream; } void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *stream) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << content.canonicalUrl(); #endif m_resources = content; m_mediaStream = stream; QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus; if (content.isNull() || content.canonicalUrl().isEmpty()) { [(AVFMediaPlayerSessionObserver*)m_observer unloadMedia]; m_mediaStatus = QMediaPlayer::NoMedia; if (m_state != QMediaPlayer::StoppedState) Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState); if (m_mediaStatus != oldMediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus); Q_EMIT positionChanged(position()); return; } else { m_mediaStatus = QMediaPlayer::LoadingMedia; if (m_mediaStatus != oldMediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus); } //Load AVURLAsset //initialize asset using content's URL NSString *urlString = [NSString stringWithUTF8String:content.canonicalUrl().toEncoded().constData()]; NSURL *url = [NSURL URLWithString:urlString]; [(AVFMediaPlayerSessionObserver*)m_observer setURL:url]; } qint64 AVFMediaPlayerSession::position() const { AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; if (!playerItem) return 0; CMTime time = [playerItem currentTime]; return static_cast(float(time.value) / float(time.timescale) * 1000.0f); } qint64 AVFMediaPlayerSession::duration() const { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; if (!playerItem) return 0; CMTime time = [playerItem duration]; return static_cast(float(time.value) / float(time.timescale) * 1000.0f); } int AVFMediaPlayerSession::bufferStatus() const { //BUG: bufferStatus may be relevant? #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif return 100; } int AVFMediaPlayerSession::volume() const { return m_volume; } bool AVFMediaPlayerSession::isMuted() const { return m_muted; } bool AVFMediaPlayerSession::isAudioAvailable() const { return [(AVFMediaPlayerSessionObserver*)m_observer audioAvailable]; } bool AVFMediaPlayerSession::isVideoAvailable() const { return [(AVFMediaPlayerSessionObserver*)m_observer videoAvailable]; } bool AVFMediaPlayerSession::isSeekable() const { return true; } QMediaTimeRange AVFMediaPlayerSession::availablePlaybackRanges() const { AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; if (playerItem) { QMediaTimeRange timeRanges; NSArray *ranges = [playerItem loadedTimeRanges]; for (NSValue *timeRange in ranges) { CMTimeRange currentTimeRange = [timeRange CMTimeRangeValue]; qint64 startTime = qint64(float(currentTimeRange.start.value) / currentTimeRange.start.timescale * 1000.0); timeRanges.addInterval(startTime, startTime + qint64(float(currentTimeRange.duration.value) / currentTimeRange.duration.timescale * 1000.0)); } if (!timeRanges.isEmpty()) return timeRanges; } return QMediaTimeRange(0, duration()); } qreal AVFMediaPlayerSession::playbackRate() const { return m_rate; } void AVFMediaPlayerSession::setPlaybackRate(qreal rate) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << rate; #endif if (qFuzzyCompare(m_rate, rate)) return; m_rate = rate; AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; if (player != 0 && m_state == QMediaPlayer::PlayingState) { [player setRate:m_rate]; } } void AVFMediaPlayerSession::setPosition(qint64 pos) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << pos; #endif if ( !isSeekable() || pos == position()) return; AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; if (!playerItem) return; if (duration() > 0) pos = qMin(pos, duration()); CMTime newTime = [playerItem currentTime]; newTime.value = (pos / 1000.0f) * newTime.timescale; [playerItem seekToTime:newTime]; //reset the EndOfMedia status position is changed after playback is finished if (m_mediaStatus == QMediaPlayer::EndOfMedia) processLoadStateChange(); } void AVFMediaPlayerSession::play() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << "currently: " << m_state; #endif if (m_state == QMediaPlayer::PlayingState) return; m_state = QMediaPlayer::PlayingState; if (m_videoOutput) { m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); } //reset the EndOfMedia status if the same file is played again if (m_mediaStatus == QMediaPlayer::EndOfMedia) { setPosition(0); processLoadStateChange(); } if (m_mediaStatus == QMediaPlayer::LoadedMedia || m_mediaStatus == QMediaPlayer::BufferedMedia) [[(AVFMediaPlayerSessionObserver*)m_observer player] play]; //processLoadStateChange(); Q_EMIT stateChanged(m_state); } void AVFMediaPlayerSession::pause() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << "currently: " << m_state; #endif if (m_state == QMediaPlayer::PausedState) return; m_state = QMediaPlayer::PausedState; if (m_videoOutput) { m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); } //reset the EndOfMedia status if the same file is played again if (m_mediaStatus == QMediaPlayer::EndOfMedia) processLoadStateChange(); [[(AVFMediaPlayerSessionObserver*)m_observer player] pause]; //processLoadStateChange(); Q_EMIT stateChanged(m_state); } void AVFMediaPlayerSession::stop() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << "currently: " << m_state; #endif if (m_state == QMediaPlayer::StoppedState) return; m_state = QMediaPlayer::StoppedState; m_rate = 0.0f; [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate]; setPosition(0); if (m_videoOutput) { m_videoOutput->setLayer(0); } processLoadStateChange(); Q_EMIT stateChanged(m_state); Q_EMIT positionChanged(position()); } void AVFMediaPlayerSession::setVolume(int volume) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << volume; #endif if (m_volume == volume) return; m_volume = volume; AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; if (player) { [[(AVFMediaPlayerSessionObserver*)m_observer player] setVolume:m_volume / 100.0f]; } Q_EMIT volumeChanged(m_volume); } void AVFMediaPlayerSession::setMuted(bool muted) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << muted; #endif if (m_muted == muted) return; m_muted = muted; [[(AVFMediaPlayerSessionObserver*)m_observer player] setMuted:m_muted]; Q_EMIT mutedChanged(muted); } void AVFMediaPlayerSession::processEOS() { //AVPlayerItem has reached end of track/stream #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif Q_EMIT positionChanged(position()); m_mediaStatus = QMediaPlayer::EndOfMedia; Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState); Q_EMIT mediaStatusChanged(m_mediaStatus); } void AVFMediaPlayerSession::processLoadStateChange() { AVPlayerStatus currentStatus = [[(AVFMediaPlayerSessionObserver*)m_observer player] status]; #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << currentStatus; #endif QMediaPlayer::MediaStatus newStatus = QMediaPlayer::NoMedia; bool isPlaying = (m_state != QMediaPlayer::StoppedState); if (currentStatus == AVPlayerStatusReadyToPlay) { qint64 currentDuration = duration(); if (m_duration != currentDuration) Q_EMIT durationChanged(m_duration = currentDuration); if (m_audioAvailable != isAudioAvailable()) Q_EMIT audioAvailableChanged(m_audioAvailable = !m_audioAvailable); if (m_videoAvailable != isVideoAvailable()) Q_EMIT videoAvailableChanged(m_videoAvailable = !m_videoAvailable); newStatus = isPlaying ? QMediaPlayer::BufferedMedia : QMediaPlayer::LoadedMedia; if (m_state == QMediaPlayer::PlayingState && [(AVFMediaPlayerSessionObserver*)m_observer player]) { [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate]; [[(AVFMediaPlayerSessionObserver*)m_observer player] play]; } } if (newStatus != m_mediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus = newStatus); } void AVFMediaPlayerSession::processPositionChange() { Q_EMIT positionChanged(position()); } void AVFMediaPlayerSession::processMediaLoadError() { Q_EMIT error(QMediaPlayer::FormatError, tr("Failed to load media")); Q_EMIT mediaStatusChanged(m_mediaStatus = QMediaPlayer::InvalidMedia); Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState); } void AVFMediaPlayerSession::processCurrentItemChanged() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif AVPlayerLayer *playerLayer = [(AVFMediaPlayerSessionObserver*)m_observer playerLayer]; if (m_videoOutput && m_state != QMediaPlayer::StoppedState) { m_videoOutput->setLayer(playerLayer); } } avfvideoframerenderer.h000066400000000000000000000062341225012771600365040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEOFRAMERENDERER_H #define AVFVIDEOFRAMERENDERER_H #include #include #include #include @class CARenderer; @class AVPlayerLayer; QT_BEGIN_NAMESPACE class QOpenGLFramebufferObject; class QWindow; class QOpenGLContext; class QAbstractVideoSurface; class QGLWidget; class AVFVideoFrameRenderer : public QObject { public: AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent = 0); #ifndef QT_NO_WIDGETS AVFVideoFrameRenderer(QGLWidget *glWidget, const QSize &size, QObject *parent = 0); #endif virtual ~AVFVideoFrameRenderer(); GLuint renderLayerToTexture(AVPlayerLayer *layer); QImage renderLayerToImage(AVPlayerLayer *layer); private: QOpenGLFramebufferObject* initRenderer(AVPlayerLayer *layer); void renderLayerToFBO(AVPlayerLayer *layer, QOpenGLFramebufferObject *fbo); CARenderer *m_videoLayerRenderer; #ifndef QT_NO_WIDGETS QGLWidget *m_glWidget; #endif QAbstractVideoSurface *m_surface; QOpenGLFramebufferObject *m_fbo[2]; QWindow *m_offscreenSurface; QOpenGLContext *m_glContext; QSize m_targetSize; uint m_currentBuffer; bool m_isContextShared; }; QT_END_NAMESPACE #endif // AVFVIDEOFRAMERENDERER_H avfvideoframerenderer.mm000066400000000000000000000174361225012771600366740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideoframerenderer.h" #include #include #include #ifndef QT_NO_WIDGETS #include #endif #ifdef QT_DEBUG_AVF #include #endif #import #import QT_USE_NAMESPACE AVFVideoFrameRenderer::AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent) : QObject(parent) , m_videoLayerRenderer(0) , m_surface(surface) , m_glContext(0) , m_currentBuffer(1) , m_isContextShared(true) { m_fbo[0] = 0; m_fbo[1] = 0; //Create Hidden QWindow surface to create context in this thread m_offscreenSurface = new QWindow(); m_offscreenSurface->setSurfaceType(QWindow::OpenGLSurface); //Needs geometry to be a valid surface, but size is not important m_offscreenSurface->setGeometry(0, 0, 1, 1); m_offscreenSurface->create(); } #ifndef QT_NO_WIDGETS AVFVideoFrameRenderer::AVFVideoFrameRenderer(QGLWidget *glWidget, const QSize &size, QObject *parent) : QObject(parent) , m_videoLayerRenderer(0) , m_glWidget(glWidget) , m_surface(0) , m_offscreenSurface(0) , m_glContext(0) , m_targetSize(size) , m_currentBuffer(1) , m_isContextShared(true) { m_fbo[0] = 0; m_fbo[1] = 0; //Create Hidden QWindow surface to create context in this thread m_offscreenSurface = new QWindow(); m_offscreenSurface->setSurfaceType(QWindow::OpenGLSurface); //Needs geometry to be a valid surface, but size is not important m_offscreenSurface->setGeometry(0, 0, 1, 1); m_offscreenSurface->create(); } #endif AVFVideoFrameRenderer::~AVFVideoFrameRenderer() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif [m_videoLayerRenderer release]; delete m_fbo[0]; delete m_fbo[1]; delete m_offscreenSurface; delete m_glContext; } GLuint AVFVideoFrameRenderer::renderLayerToTexture(AVPlayerLayer *layer) { //Is layer valid if (!layer) return 0; //If the glContext isn't shared, it doesn't make sense to return a texture for us if (m_offscreenSurface && !m_isContextShared) return 0; QOpenGLFramebufferObject *fbo = initRenderer(layer); if (!fbo) return 0; renderLayerToFBO(layer, fbo); m_glContext->doneCurrent(); return fbo->texture(); } QImage AVFVideoFrameRenderer::renderLayerToImage(AVPlayerLayer *layer) { //Is layer valid if (!layer) { return QImage(); } QOpenGLFramebufferObject *fbo = initRenderer(layer); if (!fbo) return QImage(); renderLayerToFBO(layer, fbo); QImage fboImage = fbo->toImage().mirrored(); m_glContext->doneCurrent(); return fboImage; } QOpenGLFramebufferObject *AVFVideoFrameRenderer::initRenderer(AVPlayerLayer *layer) { //Get size from AVPlayerLayer m_targetSize = QSize(layer.bounds.size.width, layer.bounds.size.height); //Make sure we have an OpenGL context to make current if (!m_glContext) { //Create OpenGL context and set share context from surface QOpenGLContext *shareContext = 0; if (m_surface) { //QOpenGLContext *renderThreadContext = 0; shareContext = qobject_cast(m_surface->property("GLContext").value()); #ifndef QT_NO_WIDGETS } else { shareContext = m_glWidget->context()->contextHandle(); #endif } m_glContext = new QOpenGLContext(); m_glContext->setFormat(m_offscreenSurface->requestedFormat()); if (shareContext) { m_glContext->setShareContext(shareContext); m_isContextShared = true; } else { #ifdef QT_DEBUG_AVF qWarning("failed to get Render Thread context"); #endif m_isContextShared = false; } if (!m_glContext->create()) { qWarning("failed to create QOpenGLContext"); return 0; } } //Need current context m_glContext->makeCurrent(m_offscreenSurface); //Create the CARenderer if needed if (!m_videoLayerRenderer) { m_videoLayerRenderer = [CARenderer rendererWithCGLContext: CGLGetCurrentContext() options: nil]; [m_videoLayerRenderer retain]; } //Set/Change render source if needed if (m_videoLayerRenderer.layer != layer) { m_videoLayerRenderer.layer = layer; m_videoLayerRenderer.bounds = layer.bounds; } //Do we have FBO's already? if ((!m_fbo[0] && !m_fbo[0]) || (m_fbo[0]->size() != m_targetSize)) { delete m_fbo[0]; delete m_fbo[1]; m_fbo[0] = new QOpenGLFramebufferObject(m_targetSize); m_fbo[1] = new QOpenGLFramebufferObject(m_targetSize); } //Switch buffer target m_currentBuffer = !m_currentBuffer; return m_fbo[m_currentBuffer]; } void AVFVideoFrameRenderer::renderLayerToFBO(AVPlayerLayer *layer, QOpenGLFramebufferObject *fbo) { //Start Rendering //NOTE: This rendering method will NOT work on iOS as there is no CARenderer in iOS if (!fbo->bind()) { qWarning("AVFVideoRender FBO failed to bind"); return; } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, m_targetSize.width(), m_targetSize.height()); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0f, m_targetSize.width(), m_targetSize.height(), 0.0f, 0.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); [m_videoLayerRenderer beginFrameAtTime:CACurrentMediaTime() timeStamp:NULL]; [m_videoLayerRenderer addUpdateRect:layer.bounds]; [m_videoLayerRenderer render]; [m_videoLayerRenderer endFrame]; glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glFinish(); //Rendering needs to be done before passing texture to video frame fbo->release(); } avfvideooutput.h000066400000000000000000000044441225012771600352240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEOOUTPUT_H #define AVFVIDEOOUTPUT_H #include QT_BEGIN_NAMESPACE class AVFVideoOutput { public: virtual ~AVFVideoOutput() {} virtual void setLayer(void *playerLayer) = 0; }; #define AVFVideoOutput_iid \ "org.qt-project.qt.AVFVideoOutput/5.0" Q_DECLARE_INTERFACE(AVFVideoOutput, AVFVideoOutput_iid) QT_END_NAMESPACE #endif // AVFVIDEOOUTPUT_H avfvideooutput.mm000066400000000000000000000037121225012771600354030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideooutput.h" QT_USE_NAMESPACE avfvideorenderercontrol.h000066400000000000000000000057741225012771600371020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEORENDERERCONTROL_H #define AVFVIDEORENDERERCONTROL_H #include #include #include #include "avfvideooutput.h" #import QT_BEGIN_NAMESPACE class AVFDisplayLink; class AVFVideoFrameRenderer; class AVFVideoRendererControl : public QVideoRendererControl, public AVFVideoOutput { Q_OBJECT Q_INTERFACES(AVFVideoOutput) public: explicit AVFVideoRendererControl(QObject *parent = 0); virtual ~AVFVideoRendererControl(); QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); void setLayer(void *playerLayer); private Q_SLOTS: void updateVideoFrame(const CVTimeStamp &ts); Q_SIGNALS: void surfaceChanged(QAbstractVideoSurface *surface); private: void setupVideoOutput(); QMutex m_mutex; QAbstractVideoSurface *m_surface; void *m_playerLayer; AVFVideoFrameRenderer *m_frameRenderer; AVFDisplayLink *m_displayLink; QSize m_nativeSize; bool m_enableOpenGL; }; QT_END_NAMESPACE #endif // AVFVIDEORENDERERCONTROL_H avfvideorenderercontrol.mm000066400000000000000000000205611225012771600372530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideorenderercontrol.h" #include "avfdisplaylink.h" #include "avfvideoframerenderer.h" #include #include #include #include #import QT_USE_NAMESPACE class TextureVideoBuffer : public QAbstractVideoBuffer { public: TextureVideoBuffer(GLuint textureId) : QAbstractVideoBuffer(GLTextureHandle) , m_textureId(textureId) {} virtual ~TextureVideoBuffer() {} MapMode mapMode() const { return NotMapped; } uchar *map(MapMode, int*, int*) { return 0; } void unmap() {} QVariant handle() const { return QVariant::fromValue(m_textureId); } private: GLuint m_textureId; }; class QImageVideoBuffer : public QAbstractVideoBuffer { public: QImageVideoBuffer(const QImage &image) : QAbstractVideoBuffer(NoHandle) , m_image(image) , m_mode(NotMapped) { } MapMode mapMode() const { return m_mode; } uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) { if (mode != NotMapped && m_mode == NotMapped) { m_mode = mode; return m_image.bits(); } else return 0; } void unmap() { m_mode = NotMapped; } private: QImage m_image; MapMode m_mode; }; AVFVideoRendererControl::AVFVideoRendererControl(QObject *parent) : QVideoRendererControl(parent) , m_surface(0) , m_playerLayer(0) , m_frameRenderer(0) , m_enableOpenGL(false) { m_displayLink = new AVFDisplayLink(this); connect(m_displayLink, SIGNAL(tick(CVTimeStamp)), SLOT(updateVideoFrame(CVTimeStamp))); } AVFVideoRendererControl::~AVFVideoRendererControl() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif m_displayLink->stop(); if (m_playerLayer) [(AVPlayerLayer*)m_playerLayer release]; } QAbstractVideoSurface *AVFVideoRendererControl::surface() const { return m_surface; } void AVFVideoRendererControl::setSurface(QAbstractVideoSurface *surface) { #ifdef QT_DEBUG_AVF qDebug() << "Set video surface" << surface; #endif //When we have a valid surface, we can setup a frame renderer //and schedule surface updates with the display link. if (surface == m_surface) return; QMutexLocker locker(&m_mutex); if (m_surface && m_surface->isActive()) m_surface->stop(); m_surface = surface; //If the surface changed, then the current frame renderer is no longer valid if (m_frameRenderer) delete m_frameRenderer; //If there is now no surface to render too if (m_surface == 0) { m_displayLink->stop(); return; } //Surface changed, so we need a new frame renderer m_frameRenderer = new AVFVideoFrameRenderer(m_surface, this); //Check for needed formats to render as OpenGL Texture m_enableOpenGL = m_surface->supportedPixelFormats(QAbstractVideoBuffer::GLTextureHandle).contains(QVideoFrame::Format_BGR32); //If we already have a layer, but changed surfaces start rendering again if (m_playerLayer && !m_displayLink->isActive()) { m_displayLink->start(); } } void AVFVideoRendererControl::setLayer(void *playerLayer) { if (m_playerLayer == playerLayer) return; [(AVPlayerLayer*)playerLayer retain]; [(AVPlayerLayer*)m_playerLayer release]; m_playerLayer = playerLayer; //If there is no layer to render, stop scheduling updates if (m_playerLayer == 0) { m_displayLink->stop(); return; } setupVideoOutput(); //If we now have both a valid surface and layer, start scheduling updates if (m_surface && !m_displayLink->isActive()) { m_displayLink->start(); } } void AVFVideoRendererControl::updateVideoFrame(const CVTimeStamp &ts) { Q_UNUSED(ts) AVPlayerLayer *playerLayer = (AVPlayerLayer*)m_playerLayer; if (!playerLayer) { qWarning("updateVideoFrame called without AVPlayerLayer (which shouldn't happen"); return; } if (!playerLayer.readyForDisplay) return; if (m_enableOpenGL) { GLuint textureId = m_frameRenderer->renderLayerToTexture(playerLayer); //Make sure we got a valid texture if (textureId == 0) { qWarning("renderLayerToTexture failed"); return; } QAbstractVideoBuffer *buffer = new TextureVideoBuffer(textureId); QVideoFrame frame = QVideoFrame(buffer, m_nativeSize, QVideoFrame::Format_BGR32); if (m_surface && frame.isValid()) { if (m_surface->isActive() && m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat()) m_surface->stop(); if (!m_surface->isActive()) { QVideoSurfaceFormat format(frame.size(), frame.pixelFormat(), QAbstractVideoBuffer::GLTextureHandle); format.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); if (!m_surface->start(format)) { //Surface doesn't support GLTextureHandle qWarning("Failed to activate video surface"); } } if (m_surface->isActive()) m_surface->present(frame); } } else { //fallback to rendering frames to QImages QImage frameData = m_frameRenderer->renderLayerToImage(playerLayer); if (frameData.isNull()) { qWarning("renterLayerToImage failed"); return; } QAbstractVideoBuffer *buffer = new QImageVideoBuffer(frameData); QVideoFrame frame = QVideoFrame(buffer, m_nativeSize, QVideoFrame::Format_ARGB32_Premultiplied); if (m_surface && frame.isValid()) { if (m_surface->isActive() && m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat()) m_surface->stop(); if (!m_surface->isActive()) { QVideoSurfaceFormat format(frame.size(), frame.pixelFormat(), QAbstractVideoBuffer::NoHandle); if (!m_surface->start(format)) { qWarning("Failed to activate video surface"); } } if (m_surface->isActive()) m_surface->present(frame); } } } void AVFVideoRendererControl::setupVideoOutput() { AVPlayerLayer *playerLayer = (AVPlayerLayer*)m_playerLayer; if (playerLayer) m_nativeSize = QSize(playerLayer.bounds.size.width, playerLayer.bounds.size.height); } avfvideowidget.h000066400000000000000000000054271225012771600351510ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEOWIDGET_H #define AVFVIDEOWIDGET_H #include #include QT_BEGIN_NAMESPACE class QOpenGLShaderProgram; class AVFVideoWidget : public QGLWidget { public: AVFVideoWidget(QWidget *parent, const QGLFormat &format); virtual ~AVFVideoWidget(); void initializeGL(); void resizeGL(int w, int h); void paintGL(); void setTexture(GLuint texture); QSize sizeHint() const; void setNativeSize(const QSize &size); void setAspectRatioMode(Qt::AspectRatioMode mode); private: QRect displayRect() const; GLuint m_textureId; QSize m_nativeSize; Qt::AspectRatioMode m_aspectRatioMode; QOpenGLShaderProgram *m_shaderProgram; QMatrix4x4 m_transformMatrix; int m_matrixLocation; int m_vertexCoordEntry; int m_textureCoordEntry; }; QT_END_NAMESPACE #endif // AVFVIDEOWIDGET_H avfvideowidget.mm000066400000000000000000000144321225012771600353270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideowidget.h" #include #include QT_USE_NAMESPACE AVFVideoWidget::AVFVideoWidget(QWidget *parent, const QGLFormat &format) : QGLWidget(format, parent) , m_textureId(0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_shaderProgram(0) { setAutoFillBackground(false); } AVFVideoWidget::~AVFVideoWidget() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif delete m_shaderProgram; } void AVFVideoWidget::initializeGL() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); m_shaderProgram = new QOpenGLShaderProgram; static const char *textureVertexProgram = "uniform highp mat4 matrix;\n" "attribute highp vec3 vertexCoordEntry;\n" "attribute highp vec2 textureCoordEntry;\n" "varying highp vec2 textureCoord;\n" "void main() {\n" " textureCoord = textureCoordEntry;\n" " gl_Position = matrix * vec4(vertexCoordEntry, 1);\n" "}\n"; static const char *textureFragmentProgram = "uniform sampler2D texture;\n" "varying highp vec2 textureCoord;\n" "void main() {\n" " gl_FragColor = texture2D(texture, textureCoord);\n" "}\n"; m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, textureVertexProgram); m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, textureFragmentProgram); m_shaderProgram->link(); } void AVFVideoWidget::resizeGL(int w, int h) { glViewport(0, 0, GLsizei(w), GLsizei(h)); updateGL(); } void AVFVideoWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT); if (!m_textureId) return; QRect targetRect = displayRect(); GLfloat x1 = targetRect.left(); GLfloat x2 = targetRect.right(); GLfloat y1 = targetRect.bottom(); GLfloat y2 = targetRect.top(); GLfloat zValue = 0; const GLfloat textureCoordinates[] = { 0, 0, 1, 0, 1, 1, 0, 1 }; const GLfloat vertexCoordinates[] = { x1, y1, zValue, x2, y1, zValue, x2, y2, zValue, x1, y2, zValue }; //Set matrix to transfrom geometry values into gl coordinate space. m_transformMatrix.setToIdentity(); m_transformMatrix.scale( 2.0f / size().width(), 2.0f / size().height() ); m_transformMatrix.translate(-size().width() / 2.0f, -size().height() / 2.0f); m_shaderProgram->bind(); m_vertexCoordEntry = m_shaderProgram->attributeLocation("vertexCoordEntry"); m_textureCoordEntry = m_shaderProgram->attributeLocation("textureCoordEntry"); m_matrixLocation = m_shaderProgram->uniformLocation("matrix"); //attach the data! glEnableVertexAttribArray(m_vertexCoordEntry); glEnableVertexAttribArray(m_textureCoordEntry); glVertexAttribPointer(m_vertexCoordEntry, 3, GL_FLOAT, GL_FALSE, 0, vertexCoordinates); glVertexAttribPointer(m_textureCoordEntry, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinates); m_shaderProgram->setUniformValue(m_matrixLocation, m_transformMatrix); glBindTexture(GL_TEXTURE_2D, m_textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glBindTexture(GL_TEXTURE_2D, 0); glDisableVertexAttribArray(m_vertexCoordEntry); glDisableVertexAttribArray(m_textureCoordEntry); m_shaderProgram->release(); } void AVFVideoWidget::setTexture(GLuint texture) { m_textureId = texture; if (isVisible()) { makeCurrent(); updateGL(); } } QSize AVFVideoWidget::sizeHint() const { return m_nativeSize; } void AVFVideoWidget::setNativeSize(const QSize &size) { m_nativeSize = size; } void AVFVideoWidget::setAspectRatioMode(Qt::AspectRatioMode mode) { if (m_aspectRatioMode != mode) { m_aspectRatioMode = mode; update(); } } QRect AVFVideoWidget::displayRect() const { QRect displayRect = rect(); if (m_aspectRatioMode == Qt::KeepAspectRatio) { QSize size = m_nativeSize; size.scale(displayRect.size(), Qt::KeepAspectRatio); displayRect = QRect(QPoint(0, 0), size); displayRect.moveCenter(rect().center()); } return displayRect; } avfvideowidgetcontrol.h000066400000000000000000000064751225012771600365560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef AVFVIDEOWIDGETCONTROL_H #define AVFVIDEOWIDGETCONTROL_H #include #include "avfvideooutput.h" #import QT_BEGIN_NAMESPACE class AVFDisplayLink; class AVFVideoWidget; class AVFVideoFrameRenderer; class AVFVideoWidgetControl : public QVideoWidgetControl, public AVFVideoOutput { Q_OBJECT Q_INTERFACES(AVFVideoOutput) public: AVFVideoWidgetControl(QObject *parent = 0); virtual ~AVFVideoWidgetControl(); void setLayer(void *playerLayer); QWidget *videoWidget(); bool isFullScreen() const; void setFullScreen(bool fullScreen); Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); int brightness() const; void setBrightness(int brightness); int contrast() const; void setContrast(int contrast); int hue() const; void setHue(int hue); int saturation() const; void setSaturation(int saturation); private Q_SLOTS: void updateVideoFrame(const CVTimeStamp &ts); private: void setupVideoOutput(); AVFDisplayLink *m_displayLink; AVFVideoWidget *m_videoWidget; AVFVideoFrameRenderer *m_frameRenderer; QSize m_nativeSize; Qt::AspectRatioMode m_aspectRatioMode; bool m_fullscreen; int m_brightness; int m_contrast; int m_hue; int m_saturation; void *m_playerLayer; }; QT_END_NAMESPACE #endif // AVFVIDEOWIDGETCONTROL_H avfvideowidgetcontrol.mm000066400000000000000000000133071225012771600367300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "avfvideowidgetcontrol.h" #include "avfvideowidget.h" #include "avfvideoframerenderer.h" #include "avfdisplaylink.h" #ifdef QT_DEBUG_AVF #include #endif #import QT_USE_NAMESPACE AVFVideoWidgetControl::AVFVideoWidgetControl(QObject *parent) : QVideoWidgetControl(parent) , m_frameRenderer(0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullscreen(false) , m_brightness(0) , m_contrast(0) , m_hue(0) , m_saturation(0) , m_playerLayer(0) { QGLFormat format = QGLFormat::defaultFormat(); format.setSwapInterval(1); // Vertical sync (avoid tearing) format.setDoubleBuffer(true); m_videoWidget = new AVFVideoWidget(0, format); m_displayLink = new AVFDisplayLink(this); connect(m_displayLink, SIGNAL(tick(CVTimeStamp)), this, SLOT(updateVideoFrame(CVTimeStamp))); } AVFVideoWidgetControl::~AVFVideoWidgetControl() { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif m_displayLink->stop(); if (m_playerLayer) [(AVPlayerLayer*)m_playerLayer release]; delete m_videoWidget; } void AVFVideoWidgetControl::setLayer(void *playerLayer) { #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << playerLayer; #endif if (m_playerLayer == playerLayer) return; [(AVPlayerLayer*)playerLayer retain]; [(AVPlayerLayer*)m_playerLayer release]; m_playerLayer = playerLayer; //If there is no layer to render, stop scheduling updates if (m_playerLayer == 0) { m_displayLink->stop(); return; } setupVideoOutput(); //make sure we schedule updates if (!m_displayLink->isActive()) { m_displayLink->start(); } } QWidget *AVFVideoWidgetControl::videoWidget() { return m_videoWidget; } bool AVFVideoWidgetControl::isFullScreen() const { return m_fullscreen; } void AVFVideoWidgetControl::setFullScreen(bool fullScreen) { m_fullscreen = fullScreen; } Qt::AspectRatioMode AVFVideoWidgetControl::aspectRatioMode() const { return m_aspectRatioMode; } void AVFVideoWidgetControl::setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; m_videoWidget->setAspectRatioMode(mode); } int AVFVideoWidgetControl::brightness() const { return m_brightness; } void AVFVideoWidgetControl::setBrightness(int brightness) { m_brightness = brightness; } int AVFVideoWidgetControl::contrast() const { return m_contrast; } void AVFVideoWidgetControl::setContrast(int contrast) { m_contrast = contrast; } int AVFVideoWidgetControl::hue() const { return m_hue; } void AVFVideoWidgetControl::setHue(int hue) { m_hue = hue; } int AVFVideoWidgetControl::saturation() const { return m_saturation; } void AVFVideoWidgetControl::setSaturation(int saturation) { m_saturation = saturation; } void AVFVideoWidgetControl::updateVideoFrame(const CVTimeStamp &ts) { Q_UNUSED(ts) AVPlayerLayer *playerLayer = (AVPlayerLayer*)m_playerLayer; if (!playerLayer) { qWarning("updateVideoFrame called without AVPlayerLayer (which shouldn't happen)"); return; } //Don't try to render a layer that is not ready if (!playerLayer.readyForDisplay) return; GLuint textureId = m_frameRenderer->renderLayerToTexture(playerLayer); //Make sure we have a valid texture if (textureId == 0) { qWarning("renderLayerToTexture failed"); return; } m_videoWidget->setTexture(textureId); } void AVFVideoWidgetControl::setupVideoOutput() { CGRect layerBounds = [(AVPlayerLayer*)m_playerLayer bounds]; m_nativeSize = QSize(layerBounds.size.width, layerBounds.size.height); m_videoWidget->setNativeSize(m_nativeSize); if (m_frameRenderer) delete m_frameRenderer; m_frameRenderer = new AVFVideoFrameRenderer(m_videoWidget, m_nativeSize, this); } mediaplayer.pro000066400000000000000000000023251225012771600350010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/avfoundation/mediaplayerload(qt_build_config) #DEFINES += QT_DEBUG_AVF # Avoid clash with a variable named `slots' in a Quartz header CONFIG += no_keywords TARGET = qavfmediaplayer QT += multimedia-private network PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = AVFMediaPlayerServicePlugin load(qt_plugin) LIBS += -framework AVFoundation -framework CoreMedia DEFINES += QMEDIA_AVF_MEDIAPLAYER HEADERS += \ avfmediaplayercontrol.h \ avfmediaplayermetadatacontrol.h \ avfmediaplayerservice.h \ avfmediaplayersession.h \ avfmediaplayerserviceplugin.h \ avfvideorenderercontrol.h \ avfdisplaylink.h \ avfvideoframerenderer.h \ avfvideooutput.h OBJECTIVE_SOURCES += \ avfmediaplayercontrol.mm \ avfmediaplayermetadatacontrol.mm \ avfmediaplayerservice.mm \ avfmediaplayerserviceplugin.mm \ avfmediaplayersession.mm \ avfvideorenderercontrol.mm \ avfdisplaylink.mm \ avfvideoframerenderer.mm \ avfvideooutput.mm qtHaveModule(widgets) { QT += multimediawidgets-private opengl HEADERS += \ avfvideowidgetcontrol.h \ avfvideowidget.h OBJECTIVE_SOURCES += \ avfvideowidgetcontrol.mm \ avfvideowidget.mm } OTHER_FILES += \ avfmediaplayer.json qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/000077500000000000000000000000001225012771600271675ustar00rootroot00000000000000bbserviceplugin.cpp000066400000000000000000000071641225012771600330070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/**************************************************************************** ** ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbserviceplugin.h" #ifndef Q_OS_BLACKBERRY_TABLET #include "bbcameraservice.h" #include "bbvideodeviceselectorcontrol.h" #endif #include "bbmediaplayerservice.h" #include QT_BEGIN_NAMESPACE BbServicePlugin::BbServicePlugin() { } QMediaService *BbServicePlugin::create(const QString &key) { #ifndef Q_OS_BLACKBERRY_TABLET if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) return new BbCameraService(); #endif if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) return new BbMediaPlayerService(); return 0; } void BbServicePlugin::release(QMediaService *service) { delete service; } QMediaServiceProviderHint::Features BbServicePlugin::supportedFeatures(const QByteArray &service) const { Q_UNUSED(service) return QMediaServiceProviderHint::Features(); } QList BbServicePlugin::devices(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { if (m_cameraDevices.isEmpty()) updateDevices(); return m_cameraDevices; } return QList(); } QString BbServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { if (m_cameraDevices.isEmpty()) updateDevices(); for (int i = 0; i < m_cameraDevices.count(); i++) if (m_cameraDevices[i] == device) return m_cameraDescriptions[i]; } return QString(); } void BbServicePlugin::updateDevices() const { #ifndef Q_OS_BLACKBERRY_TABLET BbVideoDeviceSelectorControl::enumerateDevices(&m_cameraDevices, &m_cameraDescriptions); #endif if (m_cameraDevices.isEmpty()) { qWarning() << "No camera devices found"; } } QT_END_NAMESPACE qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/bbserviceplugin.h000066400000000000000000000061461225012771600325320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBRSERVICEPLUGIN_H #define BBRSERVICEPLUGIN_H #include QT_BEGIN_NAMESPACE class BbServicePlugin : public QMediaServiceProviderPlugin, public QMediaServiceSupportedDevicesInterface, public QMediaServiceFeaturesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "blackberry_mediaservice.json") public: BbServicePlugin(); QMediaService *create(const QString &key) Q_DECL_OVERRIDE; void release(QMediaService *service) Q_DECL_OVERRIDE; QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; QList devices(const QByteArray &service) const Q_DECL_OVERRIDE; QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; QVariant deviceProperty(const QByteArray &service, const QByteArray &device, const QByteArray &property) Q_DECL_OVERRIDE; private: void updateDevices() const; mutable QList m_cameraDevices; mutable QStringList m_cameraDescriptions; }; QT_END_NAMESPACE #endif qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/blackberry.pro000066400000000000000000000006061225012771600320330ustar00rootroot00000000000000TARGET = qtmedia_blackberry QT += multimedia-private gui-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = BbServicePlugin load(qt_plugin) LIBS += -lscreen HEADERS += bbserviceplugin.h SOURCES += bbserviceplugin.cpp include(common/common.pri) !blackberry-playbook { include(camera/camera.pri) } include(mediaplayer/mediaplayer.pri) OTHER_FILES += blackberry_mediaservice.json blackberry_mediaservice.json000066400000000000000000000001161225012771600346410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry{ "Keys": ["org.qt-project.qt.camera", "org.qt-project.qt.mediaplayer"] } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/000077500000000000000000000000001225012771600304175ustar00rootroot00000000000000bbcameraaudioencodersettingscontrol.cpp000066400000000000000000000063561225012771600403560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameraaudioencodersettingscontrol.h" #include "bbcamerasession.h" QT_BEGIN_NAMESPACE BbCameraAudioEncoderSettingsControl::BbCameraAudioEncoderSettingsControl(BbCameraSession *session, QObject *parent) : QAudioEncoderSettingsControl(parent) , m_session(session) { } QStringList BbCameraAudioEncoderSettingsControl::supportedAudioCodecs() const { return QStringList() << QLatin1String("none") << QLatin1String("aac") << QLatin1String("raw"); } QString BbCameraAudioEncoderSettingsControl::codecDescription(const QString &codecName) const { if (codecName == QLatin1String("none")) return tr("No compression"); else if (codecName == QLatin1String("aac")) return tr("AAC compression"); else if (codecName == QLatin1String("raw")) return tr("PCM uncompressed"); return QString(); } QList BbCameraAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const { Q_UNUSED(settings); Q_UNUSED(continuous); // no API provided by BB10 yet return QList(); } QAudioEncoderSettings BbCameraAudioEncoderSettingsControl::audioSettings() const { return m_session->audioSettings(); } void BbCameraAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings) { m_session->setAudioSettings(settings); } QT_END_NAMESPACE bbcameraaudioencodersettingscontrol.h000066400000000000000000000053421225012771600400150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAAUDIOENCODERSETTINGSCONTROL_H #define BBCAMERAAUDIOENCODERSETTINGSCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraAudioEncoderSettingsControl : public QAudioEncoderSettingsControl { Q_OBJECT public: explicit BbCameraAudioEncoderSettingsControl(BbCameraSession *session, QObject *parent = 0); QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; QList supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameracapturebufferformatcontrol.cpp000066400000000000000000000050761225012771600402000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameracapturebufferformatcontrol.h" QT_BEGIN_NAMESPACE BbCameraCaptureBufferFormatControl::BbCameraCaptureBufferFormatControl(QObject *parent) : QCameraCaptureBufferFormatControl(parent) { } QList BbCameraCaptureBufferFormatControl::supportedBufferFormats() const { return (QList() << QVideoFrame::Format_Jpeg); } QVideoFrame::PixelFormat BbCameraCaptureBufferFormatControl::bufferFormat() const { return QVideoFrame::Format_Jpeg; } void BbCameraCaptureBufferFormatControl::setBufferFormat(QVideoFrame::PixelFormat format) { Q_UNUSED(format) // Do nothing, we support only Jpeg for now } QT_END_NAMESPACE bbcameracapturebufferformatcontrol.h000066400000000000000000000047271225012771600376470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERACAPTUREBUFFERFORMATCONTROL_H #define BBCAMERACAPTUREBUFFERFORMATCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraCaptureBufferFormatControl : public QCameraCaptureBufferFormatControl { Q_OBJECT public: explicit BbCameraCaptureBufferFormatControl(QObject *parent = 0); QList supportedBufferFormats() const Q_DECL_OVERRIDE; QVideoFrame::PixelFormat bufferFormat() const Q_DECL_OVERRIDE; void setBufferFormat(QVideoFrame::PixelFormat format) Q_DECL_OVERRIDE; }; QT_END_NAMESPACE #endif bbcameracapturedestinationcontrol.cpp000066400000000000000000000056111225012771600400320ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameracapturedestinationcontrol.h" #include "bbcamerasession.h" QT_BEGIN_NAMESPACE BbCameraCaptureDestinationControl::BbCameraCaptureDestinationControl(BbCameraSession *session, QObject *parent) : QCameraCaptureDestinationControl(parent) , m_session(session) { connect(m_session, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations)), this, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations))); } bool BbCameraCaptureDestinationControl::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const { return m_session->isCaptureDestinationSupported(destination); } QCameraImageCapture::CaptureDestinations BbCameraCaptureDestinationControl::captureDestination() const { return m_session->captureDestination();; } void BbCameraCaptureDestinationControl::setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) { m_session->setCaptureDestination(destination); } QT_END_NAMESPACE bbcameracapturedestinationcontrol.h000066400000000000000000000051761225012771600375050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERACAPTUREDESTINATIONCONTROL_H #define BBCAMERACAPTUREDESTINATIONCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraCaptureDestinationControl : public QCameraCaptureDestinationControl { Q_OBJECT public: explicit BbCameraCaptureDestinationControl(BbCameraSession *session, QObject *parent = 0); bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Q_DECL_OVERRIDE; QCameraImageCapture::CaptureDestinations captureDestination() const Q_DECL_OVERRIDE; void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameracontrol.cpp000066400000000000000000000064021225012771600342030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameracontrol.h" #include "bbcamerasession.h" QT_BEGIN_NAMESPACE BbCameraControl::BbCameraControl(BbCameraSession *session, QObject *parent) : QCameraControl(parent) , m_session(session) { connect(m_session, SIGNAL(statusChanged(QCamera::Status)), this, SIGNAL(statusChanged(QCamera::Status))); connect(m_session, SIGNAL(stateChanged(QCamera::State)), this, SIGNAL(stateChanged(QCamera::State))); connect(m_session, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString))); connect(m_session, SIGNAL(captureModeChanged(QCamera::CaptureModes)), this, SIGNAL(captureModeChanged(QCamera::CaptureModes))); } QCamera::State BbCameraControl::state() const { return m_session->state(); } void BbCameraControl::setState(QCamera::State state) { m_session->setState(state); } QCamera::CaptureModes BbCameraControl::captureMode() const { return m_session->captureMode(); } void BbCameraControl::setCaptureMode(QCamera::CaptureModes mode) { m_session->setCaptureMode(mode); } QCamera::Status BbCameraControl::status() const { return m_session->status(); } bool BbCameraControl::isCaptureModeSupported(QCamera::CaptureModes mode) const { return m_session->isCaptureModeSupported(mode); } bool BbCameraControl::canChangeProperty(PropertyChangeType /* changeType */, QCamera::Status /* status */) const { return false; } QT_END_NAMESPACE bbcameracontrol.h000066400000000000000000000052741225012771600336560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERACONTROL_H #define BBCAMERACONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraControl : public QCameraControl { Q_OBJECT public: explicit BbCameraControl(BbCameraSession *session, QObject *parent = 0); QCamera::State state() const Q_DECL_OVERRIDE; void setState(QCamera::State state) Q_DECL_OVERRIDE; QCamera::Status status() const Q_DECL_OVERRIDE; QCamera::CaptureModes captureMode() const Q_DECL_OVERRIDE; void setCaptureMode(QCamera::CaptureModes) Q_DECL_OVERRIDE; bool isCaptureModeSupported(QCamera::CaptureModes mode) const Q_DECL_OVERRIDE; bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameraexposurecontrol.cpp000066400000000000000000000211401225012771600357720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameraexposurecontrol.h" #include "bbcamerasession.h" #include QT_BEGIN_NAMESPACE BbCameraExposureControl::BbCameraExposureControl(BbCameraSession *session, QObject *parent) : QCameraExposureControl(parent) , m_session(session) , m_requestedExposureMode(QCameraExposure::ExposureAuto) { connect(m_session, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(statusChanged(QCamera::Status))); } bool BbCameraExposureControl::isParameterSupported(ExposureParameter parameter) const { switch (parameter) { case QCameraExposureControl::ISO: return false; case QCameraExposureControl::Aperture: return false; case QCameraExposureControl::ShutterSpeed: return false; case QCameraExposureControl::ExposureCompensation: return false; case QCameraExposureControl::FlashPower: return false; case QCameraExposureControl::FlashCompensation: return false; case QCameraExposureControl::TorchPower: return false; case QCameraExposureControl::SpotMeteringPoint: return false; case QCameraExposureControl::ExposureMode: return true; case QCameraExposureControl::MeteringMode: return false; default: return false; } } QVariantList BbCameraExposureControl::supportedParameterRange(ExposureParameter parameter, bool *continuous) const { if (parameter != QCameraExposureControl::ExposureMode) // no other parameter supported by BB10 API at the moment return QVariantList(); if (m_session->status() != QCamera::ActiveStatus) // we can query supported exposure modes only with active viewfinder return QVariantList(); if (continuous) *continuous = false; int supported = 0; camera_scenemode_t modes[20]; const camera_error_t result = camera_get_scene_modes(m_session->handle(), 20, &supported, modes); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve supported scene modes:" << result; return QVariantList(); } QVariantList exposureModes; for (int i = 0; i < supported; ++i) { switch (modes[i]) { case CAMERA_SCENE_AUTO: exposureModes << QVariant::fromValue(QCameraExposure::ExposureAuto); break; case CAMERA_SCENE_SPORTS: exposureModes << QVariant::fromValue(QCameraExposure::ExposureSports); break; case CAMERA_SCENE_CLOSEUP: exposureModes << QVariant::fromValue(QCameraExposure::ExposurePortrait); break; case CAMERA_SCENE_ACTION: exposureModes << QVariant::fromValue(QCameraExposure::ExposureSports); break; case CAMERA_SCENE_BEACHANDSNOW: exposureModes << QVariant::fromValue(QCameraExposure::ExposureBeach) << QVariant::fromValue(QCameraExposure::ExposureSnow); break; case CAMERA_SCENE_NIGHT: exposureModes << QVariant::fromValue(QCameraExposure::ExposureNight); break; default: break; } } return exposureModes; } QVariant BbCameraExposureControl::requestedValue(ExposureParameter parameter) const { if (parameter != QCameraExposureControl::ExposureMode) // no other parameter supported by BB10 API at the moment return QVariant(); return QVariant::fromValue(m_requestedExposureMode); } QVariant BbCameraExposureControl::actualValue(ExposureParameter parameter) const { if (parameter != QCameraExposureControl::ExposureMode) // no other parameter supported by BB10 API at the moment return QVariantList(); if (m_session->status() != QCamera::ActiveStatus) // we can query actual scene modes only with active viewfinder return QVariantList(); camera_scenemode_t sceneMode = CAMERA_SCENE_DEFAULT; const camera_error_t result = camera_get_scene_mode(m_session->handle(), &sceneMode); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve scene mode:" << result; return QVariant(); } switch (sceneMode) { case CAMERA_SCENE_AUTO: return QVariant::fromValue(QCameraExposure::ExposureAuto); case CAMERA_SCENE_SPORTS: return QVariant::fromValue(QCameraExposure::ExposureSports); case CAMERA_SCENE_CLOSEUP: return QVariant::fromValue(QCameraExposure::ExposurePortrait); case CAMERA_SCENE_ACTION: return QVariant::fromValue(QCameraExposure::ExposureSports); case CAMERA_SCENE_BEACHANDSNOW: return (m_requestedExposureMode == QCameraExposure::ExposureBeach ? QVariant::fromValue(QCameraExposure::ExposureBeach) : QVariant::fromValue(QCameraExposure::ExposureSnow)); case CAMERA_SCENE_NIGHT: return QVariant::fromValue(QCameraExposure::ExposureNight); default: return QVariant(); } } bool BbCameraExposureControl::setValue(ExposureParameter parameter, const QVariant& value) { if (parameter != QCameraExposureControl::ExposureMode) // no other parameter supported by BB10 API at the moment return false; if (m_session->status() != QCamera::ActiveStatus) // we can set actual scene modes only with active viewfinder return false; camera_scenemode_t sceneMode = CAMERA_SCENE_DEFAULT; if (value.isValid()) { m_requestedExposureMode = value.value(); emit requestedValueChanged(QCameraExposureControl::ExposureMode); switch (m_requestedExposureMode) { case QCameraExposure::ExposureAuto: sceneMode = CAMERA_SCENE_AUTO; break; case QCameraExposure::ExposureSports: sceneMode = CAMERA_SCENE_SPORTS; break; case QCameraExposure::ExposurePortrait: sceneMode = CAMERA_SCENE_CLOSEUP; break; case QCameraExposure::ExposureBeach: sceneMode = CAMERA_SCENE_BEACHANDSNOW; break; case QCameraExposure::ExposureSnow: sceneMode = CAMERA_SCENE_BEACHANDSNOW; break; case QCameraExposure::ExposureNight: sceneMode = CAMERA_SCENE_NIGHT; break; default: sceneMode = CAMERA_SCENE_DEFAULT; break; } } const camera_error_t result = camera_set_scene_mode(m_session->handle(), sceneMode); if (result != CAMERA_EOK) { qWarning() << "Unable to set scene mode:" << result; return false; } emit actualValueChanged(QCameraExposureControl::ExposureMode); return true; } void BbCameraExposureControl::statusChanged(QCamera::Status status) { if (status == QCamera::ActiveStatus || status == QCamera::LoadedStatus) emit parameterRangeChanged(QCameraExposureControl::ExposureMode); } QT_END_NAMESPACE bbcameraexposurecontrol.h000066400000000000000000000055521225012771600354500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAEXPOSURECONTROL_H #define BBCAMERAEXPOSURECONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraExposureControl : public QCameraExposureControl { Q_OBJECT public: explicit BbCameraExposureControl(BbCameraSession *session, QObject *parent = 0); virtual bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; virtual QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const Q_DECL_OVERRIDE; virtual QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; virtual QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; virtual bool setValue(ExposureParameter parameter, const QVariant& value) Q_DECL_OVERRIDE; private Q_SLOTS: void statusChanged(QCamera::Status status); private: BbCameraSession *m_session; QCameraExposure::ExposureMode m_requestedExposureMode; }; QT_END_NAMESPACE #endif bbcameraflashcontrol.cpp000066400000000000000000000103701225012771600352200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameraflashcontrol.h" #include "bbcamerasession.h" #include QT_BEGIN_NAMESPACE BbCameraFlashControl::BbCameraFlashControl(BbCameraSession *session, QObject *parent) : QCameraFlashControl(parent) , m_session(session) , m_flashMode(QCameraExposure::FlashAuto) { } QCameraExposure::FlashModes BbCameraFlashControl::flashMode() const { return m_flashMode; } void BbCameraFlashControl::setFlashMode(QCameraExposure::FlashModes mode) { if (m_flashMode == mode) return; if (m_session->status() != QCamera::ActiveStatus) // can only be changed when viewfinder is active return; if (m_flashMode == QCameraExposure::FlashVideoLight) { const camera_error_t result = camera_config_videolight(m_session->handle(), CAMERA_VIDEOLIGHT_OFF); if (result != CAMERA_EOK) qWarning() << "Unable to switch off video light:" << result; } m_flashMode = mode; if (m_flashMode == QCameraExposure::FlashVideoLight) { const camera_error_t result = camera_config_videolight(m_session->handle(), CAMERA_VIDEOLIGHT_ON); if (result != CAMERA_EOK) qWarning() << "Unable to switch on video light:" << result; } else { camera_flashmode_t flashMode = CAMERA_FLASH_AUTO; if (m_flashMode.testFlag(QCameraExposure::FlashAuto)) flashMode = CAMERA_FLASH_AUTO; else if (mode.testFlag(QCameraExposure::FlashOff)) flashMode = CAMERA_FLASH_OFF; else if (mode.testFlag(QCameraExposure::FlashOn)) flashMode = CAMERA_FLASH_ON; const camera_error_t result = camera_config_flash(m_session->handle(), flashMode); if (result != CAMERA_EOK) qWarning() << "Unable to configure flash:" << result; } } bool BbCameraFlashControl::isFlashModeSupported(QCameraExposure::FlashModes mode) const { bool supportsVideoLight = false; if (m_session->handle() != CAMERA_HANDLE_INVALID) { supportsVideoLight = camera_has_feature(m_session->handle(), CAMERA_FEATURE_VIDEOLIGHT); } return (mode == QCameraExposure::FlashOff || mode == QCameraExposure::FlashOn || mode == QCameraExposure::FlashAuto || ((mode == QCameraExposure::FlashVideoLight) && supportsVideoLight)); } bool BbCameraFlashControl::isFlashReady() const { //TODO: check for flash charge-level here?!? return true; } QT_END_NAMESPACE bbcameraflashcontrol.h000066400000000000000000000050741225012771600346720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAFLASHCONTROL_H #define BBCAMERAFLASHCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraFlashControl : public QCameraFlashControl { Q_OBJECT public: explicit BbCameraFlashControl(BbCameraSession *session, QObject *parent = 0); QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; bool isFlashReady() const Q_DECL_OVERRIDE; private: BbCameraSession *m_session; QCameraExposure::FlashModes m_flashMode; }; QT_END_NAMESPACE #endif bbcamerafocuscontrol.cpp000066400000000000000000000276771225012771600352640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcamerafocuscontrol.h" #include "bbcamerasession.h" #include QT_BEGIN_NAMESPACE BbCameraFocusControl::BbCameraFocusControl(BbCameraSession *session, QObject *parent) : QCameraFocusControl(parent) , m_session(session) , m_focusMode(QCameraFocus::FocusModes()) , m_focusPointMode(QCameraFocus::FocusPointAuto) , m_customFocusPoint(QPointF(0, 0)) { } QCameraFocus::FocusModes BbCameraFocusControl::focusMode() const { camera_focusmode_t focusMode = CAMERA_FOCUSMODE_OFF; const camera_error_t result = camera_get_focus_mode(m_session->handle(), &focusMode); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve focus mode from camera:" << result; return QCameraFocus::FocusModes(); } switch (focusMode) { case CAMERA_FOCUSMODE_EDOF: return QCameraFocus::HyperfocalFocus; case CAMERA_FOCUSMODE_MANUAL: return QCameraFocus::ManualFocus; case CAMERA_FOCUSMODE_AUTO: return QCameraFocus::AutoFocus; case CAMERA_FOCUSMODE_MACRO: return QCameraFocus::MacroFocus; case CAMERA_FOCUSMODE_CONTINUOUS_AUTO: return QCameraFocus::ContinuousFocus; case CAMERA_FOCUSMODE_CONTINUOUS_MACRO: // fall through case CAMERA_FOCUSMODE_OFF: // fall through default: return QCameraFocus::FocusModes(); } } void BbCameraFocusControl::setFocusMode(QCameraFocus::FocusModes mode) { if (m_focusMode == mode) return; camera_focusmode_t focusMode = CAMERA_FOCUSMODE_OFF; if (mode == QCameraFocus::HyperfocalFocus) focusMode = CAMERA_FOCUSMODE_EDOF; else if (mode == QCameraFocus::ManualFocus) focusMode = CAMERA_FOCUSMODE_MANUAL; else if (mode == QCameraFocus::AutoFocus) focusMode = CAMERA_FOCUSMODE_AUTO; else if (mode == QCameraFocus::MacroFocus) focusMode = CAMERA_FOCUSMODE_MACRO; else if (mode == QCameraFocus::ContinuousFocus) focusMode = CAMERA_FOCUSMODE_CONTINUOUS_AUTO; const camera_error_t result = camera_set_focus_mode(m_session->handle(), focusMode); if (result != CAMERA_EOK) { qWarning() << "Unable to set focus mode:" << result; return; } m_focusMode = mode; emit focusModeChanged(m_focusMode); } bool BbCameraFocusControl::isFocusModeSupported(QCameraFocus::FocusModes mode) const { if (m_session->state() == QCamera::UnloadedState) return false; if (mode == QCameraFocus::HyperfocalFocus) return false; //TODO how to check? else if (mode == QCameraFocus::ManualFocus) return camera_has_feature(m_session->handle(), CAMERA_FEATURE_MANUALFOCUS); else if (mode == QCameraFocus::AutoFocus) return camera_has_feature(m_session->handle(), CAMERA_FEATURE_AUTOFOCUS); else if (mode == QCameraFocus::MacroFocus) return camera_has_feature(m_session->handle(), CAMERA_FEATURE_MACROFOCUS); else if (mode == QCameraFocus::ContinuousFocus) return camera_has_feature(m_session->handle(), CAMERA_FEATURE_AUTOFOCUS); return false; } QCameraFocus::FocusPointMode BbCameraFocusControl::focusPointMode() const { return m_focusPointMode; } void BbCameraFocusControl::setFocusPointMode(QCameraFocus::FocusPointMode mode) { if (m_session->status() != QCamera::ActiveStatus) return; if (m_focusPointMode == mode) return; m_focusPointMode = mode; emit focusPointModeChanged(m_focusPointMode); if (m_focusPointMode == QCameraFocus::FocusPointAuto) { //TODO: is this correct? const camera_error_t result = camera_set_focus_regions(m_session->handle(), 0, 0); if (result != CAMERA_EOK) { qWarning() << "Unable to set focus region:" << result; return; } emit focusZonesChanged(); } else if (m_focusPointMode == QCameraFocus::FocusPointCenter) { // get the size of the viewfinder int viewfinderWidth = 0; int viewfinderHeight = 0; if (!retrieveViewfinderSize(&viewfinderWidth, &viewfinderHeight)) return; // define a 40x40 pixel focus region in the center of the viewfinder camera_region_t focusRegion; focusRegion.left = (viewfinderWidth / 2) - 20; focusRegion.top = (viewfinderHeight / 2) - 20; focusRegion.width = 40; focusRegion.height = 40; camera_error_t result = camera_set_focus_regions(m_session->handle(), 1, &focusRegion); if (result != CAMERA_EOK) { qWarning() << "Unable to set focus region:" << result; return; } // re-set focus mode to apply focus region changes camera_focusmode_t focusMode = CAMERA_FOCUSMODE_OFF; result = camera_get_focus_mode(m_session->handle(), &focusMode); camera_set_focus_mode(m_session->handle(), focusMode); emit focusZonesChanged(); } else if (m_focusPointMode == QCameraFocus::FocusPointFaceDetection) { //TODO: implement later } else if (m_focusPointMode == QCameraFocus::FocusPointCustom) { updateCustomFocusRegion(); } } bool BbCameraFocusControl::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const { if (m_session->state() == QCamera::UnloadedState) return false; if (mode == QCameraFocus::FocusPointAuto) { return camera_has_feature(m_session->handle(), CAMERA_FEATURE_AUTOFOCUS); } else if (mode == QCameraFocus::FocusPointCenter) { return camera_has_feature(m_session->handle(), CAMERA_FEATURE_REGIONFOCUS); } else if (mode == QCameraFocus::FocusPointFaceDetection) { return false; //TODO: implement via custom region in combination with face detection in viewfinder } else if (mode == QCameraFocus::FocusPointCustom) { return camera_has_feature(m_session->handle(), CAMERA_FEATURE_REGIONFOCUS); } return false; } QPointF BbCameraFocusControl::customFocusPoint() const { return m_customFocusPoint; } void BbCameraFocusControl::setCustomFocusPoint(const QPointF &point) { if (m_customFocusPoint == point) return; m_customFocusPoint = point; emit customFocusPointChanged(m_customFocusPoint); updateCustomFocusRegion(); } QCameraFocusZoneList BbCameraFocusControl::focusZones() const { if (m_session->state() == QCamera::UnloadedState) return QCameraFocusZoneList(); camera_region_t regions[20]; int supported = 0; int asked = 0; camera_error_t result = camera_get_focus_regions(m_session->handle(), 20, &supported, &asked, regions); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve focus regions:" << result; return QCameraFocusZoneList(); } // retrieve width and height of viewfinder int viewfinderWidth = 0; int viewfinderHeight = 0; if (m_session->captureMode() & QCamera::CaptureStillImage) result = camera_get_photovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, &viewfinderWidth, CAMERA_IMGPROP_HEIGHT, &viewfinderHeight); else if (m_session->captureMode() & QCamera::CaptureVideo) result = camera_get_videovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, &viewfinderWidth, CAMERA_IMGPROP_HEIGHT, &viewfinderHeight); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve viewfinder size:" << result; return QCameraFocusZoneList(); } QCameraFocusZoneList list; for (int i = 0; i < asked; ++i) { const int x = regions[i].left; const int y = regions[i].top; const int width = regions[i].width; const int height = regions[i].height; QRectF rect(static_cast(x)/static_cast(viewfinderWidth), static_cast(y)/static_cast(viewfinderHeight), static_cast(width)/static_cast(viewfinderWidth), static_cast(height)/static_cast(viewfinderHeight)); list << QCameraFocusZone(rect, QCameraFocusZone::Focused); //TODO: how to know if a zone is unused/selected/focused?!? } return list; } void BbCameraFocusControl::updateCustomFocusRegion() { // get the size of the viewfinder int viewfinderWidth = 0; int viewfinderHeight = 0; if (!retrieveViewfinderSize(&viewfinderWidth, &viewfinderHeight)) return; // define a 40x40 pixel focus region around the custom focus point camera_region_t focusRegion; focusRegion.left = qMax(0, static_cast(m_customFocusPoint.x() * viewfinderWidth) - 20); focusRegion.top = qMax(0, static_cast(m_customFocusPoint.y() * viewfinderHeight) - 20); focusRegion.width = 40; focusRegion.height = 40; camera_error_t result = camera_set_focus_regions(m_session->handle(), 1, &focusRegion); if (result != CAMERA_EOK) { qWarning() << "Unable to set focus region:" << result; return; } // re-set focus mode to apply focus region changes camera_focusmode_t focusMode = CAMERA_FOCUSMODE_OFF; result = camera_get_focus_mode(m_session->handle(), &focusMode); camera_set_focus_mode(m_session->handle(), focusMode); emit focusZonesChanged(); } bool BbCameraFocusControl::retrieveViewfinderSize(int *width, int *height) { if (!width || !height) return false; camera_error_t result = CAMERA_EOK; if (m_session->captureMode() & QCamera::CaptureStillImage) result = camera_get_photovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, width, CAMERA_IMGPROP_HEIGHT, height); else if (m_session->captureMode() & QCamera::CaptureVideo) result = camera_get_videovf_property(m_session->handle(), CAMERA_IMGPROP_WIDTH, width, CAMERA_IMGPROP_HEIGHT, height); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve viewfinder size:" << result; return false; } return true; } QT_END_NAMESPACE bbcamerafocuscontrol.h000066400000000000000000000061401225012771600347070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAFOCUSCONTROL_H #define BBCAMERAFOCUSCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraFocusControl : public QCameraFocusControl { Q_OBJECT public: explicit BbCameraFocusControl(BbCameraSession *session, QObject *parent = 0); QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; QPointF customFocusPoint() const Q_DECL_OVERRIDE; void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; private: void updateCustomFocusRegion(); bool retrieveViewfinderSize(int *width, int *height); BbCameraSession *m_session; QCameraFocus::FocusModes m_focusMode; QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_customFocusPoint; }; QT_END_NAMESPACE #endif bbcameraimagecapturecontrol.cpp000066400000000000000000000066521225012771600366010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameraimagecapturecontrol.h" #include "bbcamerasession.h" QT_BEGIN_NAMESPACE BbCameraImageCaptureControl::BbCameraImageCaptureControl(BbCameraSession *session, QObject *parent) : QCameraImageCaptureControl(parent) , m_session(session) { connect(m_session, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool))); connect(m_session, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(m_session, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage))); connect(m_session, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SIGNAL(imageMetadataAvailable(int,QString,QVariant))); connect(m_session, SIGNAL(imageAvailable(int,QVideoFrame)), this, SIGNAL(imageAvailable(int,QVideoFrame))); connect(m_session, SIGNAL(imageSaved(int,QString)), this, SIGNAL(imageSaved(int,QString))); connect(m_session, SIGNAL(imageCaptureError(int,int,QString)), this, SIGNAL(error(int,int,QString))); } bool BbCameraImageCaptureControl::isReadyForCapture() const { return m_session->isReadyForCapture(); } QCameraImageCapture::DriveMode BbCameraImageCaptureControl::driveMode() const { return m_session->driveMode(); } void BbCameraImageCaptureControl::setDriveMode(QCameraImageCapture::DriveMode mode) { m_session->setDriveMode(mode); } int BbCameraImageCaptureControl::capture(const QString &fileName) { return m_session->capture(fileName); } void BbCameraImageCaptureControl::cancelCapture() { m_session->cancelCapture(); } QT_END_NAMESPACE bbcameraimagecapturecontrol.h000066400000000000000000000051231225012771600362360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAIMAGECAPTURECONTROL_H #define BBCAMERAIMAGECAPTURECONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraImageCaptureControl : public QCameraImageCaptureControl { Q_OBJECT public: explicit BbCameraImageCaptureControl(BbCameraSession *session, QObject *parent = 0); bool isReadyForCapture() const Q_DECL_OVERRIDE; QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; int capture(const QString &fileName) Q_DECL_OVERRIDE; void cancelCapture() Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameraimageprocessingcontrol.cpp000066400000000000000000000123031225012771600373000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameraimageprocessingcontrol.h" #include "bbcamerasession.h" #include QT_BEGIN_NAMESPACE BbCameraImageProcessingControl::BbCameraImageProcessingControl(BbCameraSession *session, QObject *parent) : QCameraImageProcessingControl(parent) , m_session(session) { } bool BbCameraImageProcessingControl::isParameterSupported(ProcessingParameter parameter) const { return (parameter == QCameraImageProcessingControl::WhiteBalancePreset); } bool BbCameraImageProcessingControl::isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const { if (parameter != QCameraImageProcessingControl::WhiteBalancePreset) return false; if (m_session->handle() == CAMERA_HANDLE_INVALID) return false; int supported = 0; camera_whitebalancemode_t modes[20]; const camera_error_t result = camera_get_whitebalance_modes(m_session->handle(), 20, &supported, modes); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve supported whitebalance modes:" << result; return false; } QSet supportedModes; for (int i = 0; i < supported; ++i) { switch (modes[i]) { case CAMERA_WHITEBALANCEMODE_AUTO: supportedModes.insert(QCameraImageProcessing::WhiteBalanceAuto); break; case CAMERA_WHITEBALANCEMODE_MANUAL: supportedModes.insert(QCameraImageProcessing::WhiteBalanceManual); break; default: break; } } return supportedModes.contains(value.value()); } QVariant BbCameraImageProcessingControl::parameter(ProcessingParameter parameter) const { if (parameter != QCameraImageProcessingControl::WhiteBalancePreset) return QVariant(); if (m_session->handle() == CAMERA_HANDLE_INVALID) return QVariant(); camera_whitebalancemode_t mode; const camera_error_t result = camera_get_whitebalance_mode(m_session->handle(), &mode); if (result != CAMERA_EOK) { qWarning() << "Unable to retrieve current whitebalance mode:" << result; return QVariant(); } switch (mode) { case CAMERA_WHITEBALANCEMODE_AUTO: return QVariant::fromValue(QCameraImageProcessing::WhiteBalanceAuto); case CAMERA_WHITEBALANCEMODE_MANUAL: return QVariant::fromValue(QCameraImageProcessing::WhiteBalanceManual); default: return QVariant(); } } void BbCameraImageProcessingControl::setParameter(ProcessingParameter parameter, const QVariant &value) { if (parameter != QCameraImageProcessingControl::WhiteBalancePreset) return; if (m_session->handle() == CAMERA_HANDLE_INVALID) return; camera_whitebalancemode_t mode = CAMERA_WHITEBALANCEMODE_DEFAULT; switch (value.value()) { case QCameraImageProcessing::WhiteBalanceAuto: mode = CAMERA_WHITEBALANCEMODE_AUTO; break; case QCameraImageProcessing::WhiteBalanceManual: mode = CAMERA_WHITEBALANCEMODE_MANUAL; break; default: break; } const camera_error_t result = camera_set_whitebalance_mode(m_session->handle(), mode); if (result != CAMERA_EOK) qWarning() << "Unable to set whitebalance mode:" << result; } QT_END_NAMESPACE bbcameraimageprocessingcontrol.h000066400000000000000000000052351225012771600367530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERAIMAGEPROCESSINGCONTROL_H #define BBCAMERAIMAGEPROCESSINGCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraImageProcessingControl : public QCameraImageProcessingControl { Q_OBJECT public: explicit BbCameraImageProcessingControl(BbCameraSession *session, QObject *parent = 0); bool isParameterSupported(ProcessingParameter) const Q_DECL_OVERRIDE; bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Q_DECL_OVERRIDE; QVariant parameter(ProcessingParameter parameter) const Q_DECL_OVERRIDE; void setParameter(ProcessingParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameralockscontrol.cpp000066400000000000000000000054361225012771600352450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameralockscontrol.h" #include "bbcamerasession.h" QT_BEGIN_NAMESPACE BbCameraLocksControl::BbCameraLocksControl(BbCameraSession *session, QObject *parent) : QCameraLocksControl(parent) , m_session(session) { connect(m_session, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason)), this, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason))); } QCamera::LockTypes BbCameraLocksControl::supportedLocks() const { return m_session->supportedLocks(); } QCamera::LockStatus BbCameraLocksControl::lockStatus(QCamera::LockType lock) const { return m_session->lockStatus(lock); } void BbCameraLocksControl::searchAndLock(QCamera::LockTypes locks) { m_session->searchAndLock(locks); } void BbCameraLocksControl::unlock(QCamera::LockTypes locks) { m_session->unlock(locks); } QT_END_NAMESPACE bbcameralockscontrol.h000066400000000000000000000050131225012771600347010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BBCAMERALOCKSCONTROL_H #define BBCAMERALOCKSCONTROL_H #include QT_BEGIN_NAMESPACE class BbCameraSession; class BbCameraLocksControl : public QCameraLocksControl { Q_OBJECT public: explicit BbCameraLocksControl(BbCameraSession *session, QObject *parent = 0); QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; private: BbCameraSession *m_session; }; QT_END_NAMESPACE #endif bbcameramediarecordercontrol.cpp000066400000000000000000000124221225012771600367300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/src/plugins/blackberry/camera/**************************************************************************** ** ** Copyright (C) 2013 Research In Motion ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "bbcameramediarecordercontrol.h" #include "bbcamerasession.h" #include #include #include
82˜$9hoøžéAÛ£Í Á·µæ«É£‹K™!——,™Wƒ£Ž«Oµ”À"͸ÚéÝ÷Õª$¶1]>ÀI¥S×[-b…fÉhîhòfàbÎ\ÙT-Kü?~3ö%¨áìùë®ÜýÎKÂڶ䬤1žÀ™b—#—™úœò¢Íªa´}¿çË_ÙŸç\öKˆ"?0úöHHRîYÂ_¦c†eWecß^¶XÃP-G'<ê/µ"ÌyøºéãÛÉέÂзi®©¦¸ µœµšÁšÚœõ û¦Ï®G¸2ÃXÏzÜSêœø U0#T0}õ2&V& Âûsí…ß?ÒæÅ»ºö°Ë¨d¢â\›àšpœ ˆ¥â¬ëµsÀEÌ#ÙÊæôôX© ò,\9DyNÀVD]æaŒd)eºcF`ßZ¡S±J>@4¯'ì Šý3ï4áÔÓZǼ²®© £Lž†›ÉšœnŸ¸¤Ü«³´¿Àʃ×å9óœ÷ÿl+ù7cCpMìUª\ˆamdIedß`±[§TæKœAý5F)¹œ 8ÿØðÆâLÕ®È0½ ³vª›£ žž›¤š¸›Óžç£Ùª„³¼½KÉ÷Õ}ã—ñüÿa|*²6DBL.U#\:aYdoexdwa}\£U MæBe7Ä*E.Ç]ò9ä¥ÖçÉB¾ñ³+«¤ëž°›~š[›Bž$£è©k²€¼ôÇŠÔâð~þî º(‡5?A¤KT¨[ó`Gd“eÐdb6]ˆVND¬8,¬š2¾óŠåÞ×Ë:¿Á´Ï«‘¤.ŸÁ›\š›¾s¢©l±b»¼Æ@Ó­à¼î%ýž Ú'z4S@ÞJåS9[´`8dµe!ebá]YW O%E×9[-õè}õ½æüØÌÀ~µc¬ú¤iŸÍ›:š·šAÍ¡A¨}°WºšÅ Òmßxíãûd ¯{&3x?'JVSÔZ{`.dØeqeüb…^#X÷O,Fõ:‹./!'º6öãçÚýÌõÀ3¶ñ¬^¥¡ŸÙ›šhšÈœ+¡{§–¯S¹ÄàÐ6Þ<ì¨ú1 Šj%‡2Ÿ>qIÇRoZA` d÷e½erc$_çXÜP.G <µ/e"bôh÷éÛõÍÎÁë¶‚­Æ¥ÝŸè›û™šTœŽ ¹¦²®S¸göÏÝëoùÿfY$1Å=ºH6RZ`dffçcÁ_ªYÁQ/H&=à0œ#ž0œø.ê1ÜîΩ¢·®,¦ õ›Ú™Ñ™Û›ìŸð¥È­K·HÂ…ÎÄÛ¿é.øÅ:B#’0ç<H¤Q YË_d8fYffdj`zZ³R@IO>2ã$ë{ßùcëQÝòÏÃa¸©®–¦S œµ™}™X›>Ÿ¥Î¬1¶Á?ÍpÚeèÕöuù"‚/ø;7GQ.Y‰_õcZf«fèdaS[²S_JŠ?j3@&Oß <û±ìŠÞÑŠÄ7¹T¯§  œ™1™Üš“žC¤Ð«µÙ¿íËÙüækõ£Ó Z.ñ:VFNP¦X2_Ðchfíf\e¼a"\©TyKÁ@¹4Ÿ'·I ¡ü îÏß<Җź°£§ÿ Hœ—™ù˜qšù}£âª´ª¾¦Ê·×šåô±M0-å9oEOXÏ^žcif g¿eObà\U‚LèA÷5î(¦ úýXï á`ӜƻͰ4¨b¡{œ˜™É˜šlÅ¢ªÿ²‹½qÉqÖJä³òa\,æ8‘DØN‡Wo^mcgfMgf×b’]fVzMüB"7)*Uî >ÿ’ð6âtÔ”ÇØ»±½¨À¡¬œœ™Ÿ˜¼™ëœ¢7©²…¼UÈGÕã|ñ.ßB+û7ÆC0NW^=cbfrgjfMc,^#WTNïC)8?+t^ªñ@ãlÕtÈž¼%²@©¢ãœ¬™‡˜|™†œ”¡Œ¨J±¡»[Ç<Ôÿá^ðÿà 1 * 7ïBvMjVž]ìb8frg’fc¤^¿WOÌD 9L,’9ØòhäˆÖ~É‘½ü²÷©±¢O˜h™Fœ*¡ù§’°ÇºcÆ*ÓÚà*ïÓý† øÝ(ï5èA‹L Uù\obæeLgšfÔc_NXÊO¨E:d-ÀwÔ#ô°åÅ׫ʧ¾õ³Ïªc£×IšË˜e™œÈ j§Ø¯æ¹`Å Ò¡ßáí~ü- ¢’'´4Ä@…K½T=\Þa„egšfdj_àXˆPF(;Ž.!Í5ˆõçÙòËÖ¿µ¼«'¤ož±š™g™á›c Õ¦¯ù¸MÄ×ÐUÞ‚ìû¾ 71&e3Ž?mJÊSt[Caeäf™f9dÑ_yYPQG@<Æ/U"1¥üö‚è‚ÚEÍÁ¶¯¬ï¤Ÿ›3™d™©›öŸ6¦G®¸/ÙÏÿÜë ùHÅÌ$2X>YIÝR³Z³`½d¼f§f}dJ`#Z)R„Hg= 1³# uøôéåÛ’Î?Â,·“­¥¥ŒŸg›L™F™U›nŸ{¥_­ï¶úÁGΕۡé"øËQh#É0,=RHRZ;`{d²fÕfâdä`ðZ$S¨I®>o2+%%§üùpëNÝàÏkÃ0¸j®J¦ûŸŸ›J™ ™àšÃžž¤R¬¹µ¢ÀÓÌ Ú è‰ö6Éö!r/ù;IG(QcYÍ_Hdºfg_e™aÙ[Ã2¸œ®«¦Š Xœ+ššœüŸè¥§­·ôÁÎAÛ'é‚÷ rp"º/ <(GÒPÙX__c¨eâe d.`^Z¹RhIš>‡2o%”@ ¼úSìQÞþОÄs¹¶¯™§G¡àœ|š&šà›¢ŸX¥ã¬¶ØÀÙÌäÙ´çö…ï÷ T.Á:ýEÎOXk^ëbjeÜe-I€R'Zú_Úc´ee:có^ÀXÀPG <Á/€"/³÷bé‡ÛjÎOÂu·®\¦v €œš¬šÖœ¡§¯¸ŒÃÁÏñÜÖê(ùœéÂ#â0=çGUQY_!c)e%ec_Y3QÀGÚ<¹0œ#ÆùÎêöÜÔÏ­ÃÀ¸E¯n§b¡B"››ÿ ä¦˜®ñ·ÀÂÌÎÖÛœéÕ÷7xN"r/ž;•FPX#^Ybd¾dáb_9Y Q`H©=³1¼$܃úGìsÞMÑź…°Œ¨Y¢ ž¼›t›5÷ ¥¦"®H·æÁÅÍ©ÚMèlö»ñÅ í-':3E×NâV+]aúc_dºb_†Y%RI–>Î2þ%jX üßí àßҜƄ»Ï±¯©P£ÑžJœÈ›MÒ D¦‡­u¶àÀ’ÌMÙÑæ×ôEM,›8ÂCŠMÀU9\Ô`zcd¶bR_ZÛR J¹?4v' Íý ïÈáŒÔ2Èú¼³Îª9¤€Ÿ»œ÷›;} ¯¥´¬iµ ¿$Ëº× åóFsQ–*ÿ6KB?L¨T[[5`cdâbÂ_±ZÌS4KA¨5#)Éà ®ÿ~ñšãHÖÎÉl¾_´Ø«¥  ö›óœðŸß¤¦«"´'¾ÉöÕEã(ñYÿŽ }Þ(k5ä@ K²S¦ZÄ_ób!dIcn` [÷T–L¨B`7ù*³Ó dóiå÷×TËÁ¿zµµ¬ž¥\  ¶›jœ#ŸÑ£]ª¥²~¼µÇÔPá0ïgý­ ·='ø3§? JôR-Z”_ c„dóc\aÌ\\V+NeD<9ê,®Í=õ"ç†Ù±ÌåÀ_¶U­ø¥l Ïœ3›¢›ž‹¢â¨ý°²ºÏÅÒUß:íûá Â%²2œ>CIoRñY¢_cc!eÔd{b%^åWÞO8F$;Þ.£!¸f÷öµèêÚßÍÖÁ·¿­¦F bœ‚š°šìœ)¡S§I¯ã¸îÃ2ÐoÝaë¿ù?•x$Ÿ1Ç=¯HRæYÜ_ácàeÏe®cˆ_qYŠQüGö<´0s#y}øêÜÔΉ·ù­¦üŸØ›»™±™º›ËŸÐ¥ª­0·1Âsιۻé3øÕUh#Ä0$=IH÷QýY0`qd©fÌfÙdÛ`åZS™Iœ>X2%~Ìù8ëÝ›Ï Ãà·®ô¥¥ŸJ›ù˜¿˜šŠžr¤5¬­µ§ÀëÌ:ÚNèÞöŸD" 0ž<÷GÛQZ`òdZg©gÝeb&\mTüJ@Á3p&U» íú9ìêÝLФÃ5¸:®è¥iŸßšc˜˜º™ˆU£«n´a¿¤Ë÷Øç¹õQ¯!^/<šG©QZ£`@eÏgDhšfÛb]uUL&Aæ4’'pÉ êûí¶ÞùÐ0Äž¸~®¦`Ÿ±š˜Œ—&™×œ‹¢%ª~³d¾ Êò׿½ô¡så ¬.;!GPQØY`Meþg“hgfc¿]0VâLBÎ5(a¸ Òüüí„ß´ÑÖÄ*¹ï®Y¦•ŸÆš˜`—ܘoœ¢‰©Ì²Ÿ½ÌÉ×.åÔó¹‘ â-È:}FÄPgY9`eçgœh1g®c$^²V}M¶B”6W)C¢ Àýéîlà“Ò¦Å鹘¯é¦  ›<˜w—ИBœº¡©A²ù¼É@ÖJäãòÁ•í,ß9£EþO¸X¦_¢d“gjh#gÄc_^WýMUCP7,*. Çþ÷ï{ážÓ©ÆÝºy°³§¸ «›¨˜¾—ñ˜;œ‹¡Æ¨Å±Z¼NÈcÕTãÚñ¨sìÊ+Ä8–DO×Wá^ÿcgh÷fÃc‰^eW{NúC8+2¸óÿ.ñ·âÙÔÛǼ‰±¨¨¡]œ2™˜$™@œa¡n¨@±«»xÇjÔ>â«ðhÿ'›{*}7`CãMÓVÿ]Cc„f±gÄfÁcº^ÆW O¸D9 ,\ûHòä:Ö2ÉF½µ²¶©v¢Ä™}˜P™8œ%¡ý§Ÿ°Ûº~ÆKÓÿàTïþý³ % )6B¯LÀU]…bøeYg¢f×c_HXÁOE:V-±iÆô¤å»×£Ê ¾ñ³Ìªa£×JšÌ˜f™œÇ h§Õ¯á¹XÅÿÑ”ßÑílü Œ{'œ4¬@mK§T)\Íaweg—fdr_îXœP©FH;´..!ýi¾õIçUÙ)Ì À7µè«M¤ŽžÇš™j™Û›R ¹¦ï®É¸Ä–Ð Þ4ìÁúi áÜ%3@?&J‹S?[aýdÔf—fEdì_¡Y†QÄG<0¶"šl÷òèïÚ­ÍpÁx¶ý¬0¥;Ÿ;›F™e™™›ÕŸ¦®¯·ÑÂ/ϋܞê ùÆCM$š1ç=òH‚RgZw`“d¥f£fŒdl`XZoRÛHÍ=1/$$§ù€êoÜϺ·÷­ú¥ÑŸš›l™S™M›SŸN¥­ž¶šÁÚÍÛ!é›÷@ÅÞ"C0­<ÜG–Q©Yë_;dƒf¸f×dë`[LSàIõ>Ä2Š%Ž súêëÊÝ[Ðãä¸×®¯¦W ï›™C™ ›àž¬¤S¬¬µ†ÀªÌØÙÌç=öâl’! /Ž;ÜF»P÷Xe_äc]fÃfeXa£[TÎJ@ð3Î&âv ÓûEíߘÑŨ¹¶¯e§à Gœµ™5™Êšlž ¤ƒ«³´i¿oˆØjæÒôt8 Ä-c:ÓEÙO@XÞ^c=fØf^eÕaQ\îTÓK.A65+(Oê Hý³îxààÒ2ưº–°¨`¡”œË™™tšãN£šª¢³5¾Ê×ôäVóù“×{,89ÍDþN”We^Lc0fg¾ejb]âUïLmB’6›)Ín Éþ*ðÝá,Ô^ǵ»o±¿¨Õ¡ÒœÒ™ä˜ šF€¢Ÿ©~²ï¼½È©ÕrãÎñup.+ 8ÉC&NíVò]c+f5g(fcç]ÞVN²Cò7+NóJ ñ@ãuՆȶ¼D²d©F¢×™²˜¤™«œ´¡§¨_±°»cÇ<ÔùáRðüþ¬ î)í6ÐBXMOV†]Øb*figf¢c°^ÒW,OêDC9s,»d·óä¨Ö™É¤½³ù©©¢>Ó™z˜:™œí ·§L°~ºÆãÒ–àìîœýY ÖÈ(ç5ïA LÅU,]°b4f¦gþf?dw_ÀX¸I{S[Ãaþe'h3h#fbâ[æS6J?Ž2%Ò?ùƒê7Ü¥ÎÂöï¬Ê¤ž.ší—È—Á™ËÔ£»«WµvÀßÌQÚ‡è6÷Ï #º0W=µHšRÓZ4aœeõg3hTfbbq\¢TK@¶3R&' ¦úéë•ÝóÏKÃß·é­¥&Ÿ¥š3˜Û— ™wM£«t´k¿±ËÙ%çÅõ™T«!S/<€G‡QçYu`e›ghff«bð\SUýKAê4§'– 3üyí!ßsÑ·Ä/¹¯¡¦üŸJ›¡˜˜›™9Ö¢Vª’³Z¾vʧשå3ôù¯ ½-ƒ:FCPÌX‰_WdgÊg^fàbb]ÿUßL1B,6)  âý/ïÕàÓLƨºl°Í§÷ œ,™_˜ª™g¢«©­²A½-É6Öä‡ò<ëG,ß8‘DàN•W„^‰c‹fxgMfcÓ]¯VÊMRC~7‹*¼X«ÿñ£âßÔúÇ9¼×± ©¢ßœ¿™°˜¹™Ôœð¡ô¨»±¼ÒǰÔmâÄðiÿo:*)7úBpMTVy]¹bùe)gCfJcP^mWÅN…Dã8,m#†áòä°ÖµÉÓ½I³Mª £®Mšü˜¿™•œn¡0¨º°ÝºgÆÓ·àõîŠý, h(o5aALUp\íaneâf@fcÖ^4XÉOÀEO:¯-$ òcÃô]æ}ØjËg¿´´†«¤tžÓš>™¾™Oœæ h§¶¯¤¹þÄŠÑß-í¶ûT ½¥&Ä3Ø? JåSw[0aðd¥fFfÖc__ûXÉPõF±;8/Ê!­+Žö!è1ÚÍáÀ¶¨¬ü¤'ŸH›t™³™œ\ £¦º®v¸¥Ã ÐlÝ€ëýù™ %:2m>]IÑR—Z‡`ƒdvfUf"dç_¼Y¿QHÿ<©0V#KÓ7øÄéÄÛ€Î<Â:·°­Ò¥ÇŸ°› ™¤™º›ÙŸê¥Ï­]·e«ÎòÛóégøy€#Ï0 =5HÒQÈYë_dHf_fdd``hZ›R"I->ö1¼$ÃTºùAë4ÝÛÏ|ÃX¸§®¦b œÔ™¢™ƒ›nŸN¥­j¶MÁuÍ£Ú“èüö”""ƒ/î;!GãPYQ_³cfXfd¼`óZRSJ.?3ó% ¨ û–ìÞÑ¡Ä`¹Ž¯^§ú ƒœš°™c›ŸÓ¤_¬žµ_ÀjÌ€Ù_ç¼õOÌæ V.Õ:"FPDX»^FcÍeDf¨dad[ëS¿J@4'3Ü LüÐí²ß=ÒµÅ\ºm°¨’¡óœVšÉ™O›àži¤Í«æ´…¿rËpØ;æŒô“³.-¿9#E O‚W^Ñbƒe&f¶dpIRâYs_c´dJd×ai]WOSE=:ú-É î²]ö;è•Ú²ÍÓÁ8·®¦ó 7{›È›žl¢¡¨š°/º.Å]Ñ}ÞKìúÏñ›$ˆ1s= HWQèX¬^…b`d2dýaÍ]¶WÙO^Fw;\/K"‰]øìé;ÜDÏIɸ;¯§¯¡·¼›È›Üí¡å§¥¯¹ÕÃÝÏßÜ–ê¼ø/é"í/ú;ÐF7PþWþ]b3dIdWbh^XìP¦Gì<ö0$U3çùºëöÝáÐÁÄÓ¹Q°k¨K¢žÑ›˜›g5¡î¦u®¢·GÂ+ÎÛ¸èØö'\.!S.Š:‘E0O6Wx]Öa:d–dêb=_¢Y7R"I‘>¼2à%? ËûŒí¬ßrÒ$Æ»C±©·¢5ž­›-›·œD À¥­¶ŽÀUÌ)ÙÇæèôDÐ,89xDVNŸV']ÎazdeµcH`çZ°SÆJX@4Ï'3 ©ýOïKáåÓcǼ²›©ï¢%žU›š×›&Ÿk¤‹«b´Á¾sÊ;רäórÚòp+ 8‰C¨M5V]ñaãdÊe¡doaC\9UtL"Bx6³)ã hÿððÄâ/ÕwÈݼŸ²ñ©£óàšÚ™æšþ£ ª¿²½©ÈlÕ ãFñÌÿU”@*7ÈB$MñU].b_e‚f‘e‘b’]¬VNÇC)8f+ÁïWòäBÖXɇ½³%ªù¢®bš$™ý™çœÔ¡ª¨F±{»Ç×Ó€áÈïeþ qH)I62BÄLÈU]tbÚe0gmf—c»^óWbO3E9Ú,.ß7ƒóå%×ʾf³Jªê¢mñ™†˜4™ù›Å €§°/ºÂÅ„Ò3àˆî9ýù |v(Ÿ5²ApL¡U]©b:f¹ggid«_üX~P^FÏ:.] L‚ôóåë׳ʾ¿³zªñ¢L§™˜¡˜E›õŸ˜¦ ¯%¹¯ÄmÑßzí6ü  ³'ù4,A LbUü\³bif h‘güd[`ÄY[QKGÈ;/`!DnõÏæ²ØaË"¿3´Ïª$£]•™â—L˜ÑšcŸì¥I®O¸ÉÃ|Ð&Þì@û ½à&:4„@€KòT¬\„b\f!hÈgTeÒ`XZ RH¡<÷/T"þAhöÁç™Ù8Ìä¿Ý´]«”£¬Â™ì—2˜“šŸk¥©­“·õ“Ï-Ý|ë5ú ³ß%G3£?µJCT\bfûgÉg}e!aÍZ¢RÊHy=è0Z#b÷èè¹ÚMÍçÀʵ.¬E¤9ž)š)˜D˜zš¾žû¤­Ô¶Â’ÎÜLêöøÅj›$ 2{>¥IPSJ[ka’eªg¨geba?[CS—In>2‘$dÄüøYê&Ü®Î7·D­6¥þž¾š‹˜q˜oš|žƒ¤c¬õµÁ]Í»ÚÙèn÷/Ð#‚0=IHRwIàRšZ~`ndUf)fëc§_sYnQÃG¥€2V%j oú÷ëæÝ†ÐÄé¸'¯§· Uœø™¬™t›FŸ¥®¬¶ÑÀìÌÚøç_ö÷w’!þ.x;½F“PÇX/_¨cf~fÌdaY[ÉS†J¿?­3Ž&¦>  ûíòÞwÑíÄ•¹ª¯`§â RœÇ™N™ëš”ž8¤¹«ï´¬¿·ËÒØ¹æ$õÈYŒ .±:FP}X_ºc\fëfceÍa;\ÊT Kí@é4Ñ'ê| Ñü6î÷ß^Ò±Å2º°§§ú ;œ‚™Ý˜OšÑR£³ªÐ³y¾wÊ‹×råäó•9„,-ë9}E¦O3Xö^ÌcœfXgûeŒb]ËU»LB%6)/» þXïáKÓ|ÆØºš°ø§¡3œL™{˜Ã™|¢¾©Á²V½EÉPÖ4äªòez=,9ÑD!O×WÅ^ÇcÃfªgvf.câ]¯VºM1CJ7D*bí .ÿtð â;ÔOÇŠ»(±_¨]¡Fœ5™:˜Z™œÉ¡ì¨Ô±Q¼/È.Õ ãñBsK+C8DŠNeWz^¤cÉfØgÌfªc‚^oW–N$DQ8Y+€ LŠñã1Õ.ÈM¼Ë±à¨¹¡|œC™!˜™)œ?¡A¨ ±o»7Ç&Ôùágð'ÿë gO*[7HC×MÒV ^Xc£fÙgôføcô^XJOôD99T,Š!d ò#ä6Ö"É,½‘²ˆ©A¢àœƒ™:˜ ™ö›æ Å§m°³ºaÆ9Óúà[ïþÔ SC)\6ZBMVk]ÛbJf¥gæfd3_gXÐO›Eý92-}$s¶ó9åH×+Ê%¾w³Vªó¢sô™†˜2™õ›¾ w§û¯º¬ÅiÒà_îýÀ ;,(L5WAL9U©\8bÈeGg®fdJ_¥X5P$F§:ú-_ |ËôTæcØAË1¿s´=«À£"žšï˜u™œ° @§œ¯š¹Å¡Ñ.ßeíûû¦ '-4B@KITÓ[€a3eØfgfâcW_ÜX•P¬FT;È.K!!”ðõç’ÙlÌQÀ‚µ6¬¤ßž›a™¼™+œŸ §4¯¹LÄÆÐ4ÞQìÔúp ÜÊ%ô2?îIGSïZ¿`™dhf$fÎcq_&Y QNG<·/Y"IÐ:÷ÑèâÚ´Í‹Á§¶?­†¥¢Ÿ³›Ì™÷™4œv ¨¦©®P¸kÿÏÝë€ùwh$œ1Î=ÀH7RZý_dfõeÔc­_–Y®QH=Ù0›#¤=²øLêXÜÏßÂÞ·T®r¦` >œ"ššœ$ ¦ì­b·PÂέۘé÷÷åß"#0n<€GQYE_„c¾eéed`;2%<å_úöëöݦÐKÄ&¹p¯[§¡´œZš šÒ›Ÿ[¥ð¬2¶óÀûÌ Úàç2ö¶#,!‰.ö:1FP2Xš^c–efcdº`[¥S}JÓ?ß3Ý&Æ AüÏí¼ßOÒÏÅ|º‘°A¨·¡ušá™_›åžc¤»«È´Z¿;Ë.Øðå8ô¾6UÓ,h9ÔDÝNMWù]¿b†e?fædƒa'\îTýK‚A³5Ï(Ñ IþÊïžáÔdÇÝ»¶±%©U¢j}šž™ÐšžI£cª9³½YÉ0Öàã"ò¬3l+Ð7sC¸MkV_]pbƒe‰f|eabI]MV“MFC7Ó*+ì^ÏñˆãÔÕúÈ<½Ø²ªë¢´{šO™7š.%¢©¢±Ø»oÇ,ÔÍá ð›þ3 ˆN)?6B›L’UÍ\)bˆeÙffBcl^¬W&OE€9Ï,6ûgÆódå‹×ƒÊ¾ï³Øªy£úvš™ ™Rœ ¡¬§°$º™Å=ÒÏß î üI ¸£'À4Í@‹KÁTA\ãaŠe#g¥fd|_õX PªFE;¬.!!êPŸõ$ç)ÙöËÑ¿ø´¤«¤Ažyš¾˜™› u¦²®•¸êÃwÐûÝ0ìÌú„ &[3–?‰JùS·[™ae[ggÉdj`ZñQ!HÛ™I=S1[Laoeƒggae6a[SjIA>Õ1f$:šÓø0êþÛ†ÎÂØ¶­¥Ûžšm˜W˜Zšmž{¤c¬þµÁzÍáÚ é«÷w!_#å0n=¹HŠR¯Zþ`Ve gÑgæeëaô[T–J‰?23Ò%¬ <úŠëBÝ­Ïõ·Î­‘¥)Ÿ¸šT˜ ˜Û™¿¡£b«Ú´Ù¿$Ì~ÙŸç?öÌ"Á/l<ÝGÚQ.Z¯`:e¸ghcf—bË\U¶KÆ@…43'v ŸûÞìÞÑÐĸ}®¦xŸÓš;˜½—]™Æ¢`ª¶³˜¾ÎÊØ3æÓô­vÞ .k;G-Q²Ye`%eØgphêfNc¯])VäLBä5¡(Šé ý9îÅß÷ÑÅj¹*¯Ž¦ÁŸèš˜i—Ö˜[œä¡V©Š²Q½qɬֿä_ó@”n-]:FpP#Y`ùdßgªhVgécw^WøMCC07ÿ)ôW vþïá4Ó9Æiº°<§A 7›8˜T—˜â›=¡„¨±4¼7È[Õ]ãòñÑ«4 ,'9E|OWXh_Šd¡gŸhgEd_ÕWÞNOD^8H+SÅëÿñ‡â”Ô„Ç™»±"¨ü Ã›’˜z—€˜ž›Æ Û§¹°3»ÇÔþáðUÿ+¸¯*È7ÀCXNYW•^æc0gchygvdj_pX«OIE€9,³;oòäÖóÈï¼H²4©â¡yœ™Æ—“˜z›i H§ó¯<ºïÅÏÒ˜àïÈý— ##)L6\BM:V¢]#c£fh^g•dÃ_YqPAF¥:Ù- À;ô¯å«×yÊ]¾–³[ªÝ¢B§™˜±˜[› ´¦'¯>¹ÃÄ{Ñ$ßví(üî {ƒ'¾4æ@¿KU£\Ybf¶gCg¸d#`œYDQHGÚ;6/ž!X®ìõ_çRÙÌØ¿î´Š«Ü£ ž7šs˜Ç˜2›¨Ÿ¦L®/¸…ÃÐÝ×ëyú7 ÅØ%&3j?fJàS§[’a„egg2gçd`EZ&R^H=¢0*#üa¦÷éþÚ¥ÍRÁC¶´¬Ô¤Íž¾š¼˜Ñ˜ýš5Ÿb¥f­·>§ÎÜ3êÇø€1$•1÷=I¾R·ZÙ`e&g/g"eaøZSxIe>2³$š UùÀêšÜ+Ϲ†·Ê­¸¥{Ÿ2›ô˜Ì˜¼š¸ž­¤|¬ûµûÀAÍŽÚžè'÷Ýu£"0ž<åG¶QàY7`œd÷f±‡¨—¡‘œ™¢˜Í™ K¢r©Z²Õ¼­È¥Õxãßñ=›_+B8D^N$W&^>cSfUg>fcç]ÓVüMCÅ7Ù*­ÿÿRññâ'Õ<Ès¼²3©!¢öœÍ™¸˜»™Ñœê¡ë¨±± ¼ÊÇ«ÔmâÈðrÿ‚P*C7CŽMsV–]Óbf9gJfIcD^VW¢NVD§8Ò+Æ tòä<ÖAÉc½ß²ë©·¢gšÙ˜²™Ÿœ¡j¨ ±F»æÆ®Ó\á©ïKþõ \4)76B±L³Uù\\bÀegQfzcŸ^ÙWKO!E9Õ,1ìO¦ó=å_×UÊa¾Ã³°ªX£áhšþ˜«™kœ0¡á§\°sºôÅ¢Ò<àzîý» & (5AÉKíTX\äaseôf^fµc_kXPÿE:ì-] &èôzæØsËg¿ª´t«õ£Sž­š™’™#œ» A§“¯‡¹éÄ}Ñß4íÇûp âÔ&ü3@äJ.TÂ[{a9eëf†f d_YßPüFª;!/¤!xç<öÄçÉÙ•ÌkÀ‹µ-¬¤±žÙš™Z™º›" |¦¦®w¸»Ã8ЮÝÕëfú “˜%Û2? J}S@[*aegÏf‰d8`ôYÝQHç>IáRÖZó`e5g8g#eaèZ÷RWI:>Ú1v$U¿ùeê:ÜÇÎS·d­V¥ŸÜš§˜‹˜‡š’ž—¤v¬¶ÁrÍÒÚóè÷Sù3#·0?=ŠH]R„Z×`3e‚g¸gÓeÞaí[T›J“?A3å%Ã$ Vú¤ë[ÝÅÏ)ÃÈ·Ý­œ¥0ŸºšQ˜˜Ð™°Ž£M«Ã´Á¿ ÌhÙ‹ç.öÃ"Â/s<êGíQGZÌ`\eÝgDhfÂbõ\FUÜKç@¡4I'$| ûÓìmÞ´ÐðÃc¸I®×¥9Ÿ‘š÷—y—™ÑœŒ¢,ªŠ³u¾¶Ê Ø1æÝôĘ !Ö.­;NG~QZ½`}e/hÃh8g”cë]ZV M'Bí5›(uÆ ØüûízߢѺĹÀ®!¦UŸ~š¶— —‚˜œ©¡*©n²F½xÉÆÖêä›óŽsþã-Û:¡FùP¬YŽ`{eYhi·g;d¶^EWNCC7Ò)± þ ïàÒ˜ÅùZ¯“¦žŸœš©—Ô–!˜‰›ü [¨‚±@¼_ÈžÕ¹ãgò\IâÛ,ë9ÍEFPY%`;eBh,iôg dB_õWßN0D 8ì*Ù1?ÿRð¶á¸Ó Æ²º,°E§+ ›æ—æ–˜F› Ç§É°f»hÇÔ—â8ñ&°´+Õ8ÎDbOZX‡_Ädõg iÿgØd¤_X‘OE9ø+ù_uˆñèâÞԴǯ» ±¨Å t›-˜—÷— ›' 6§°ŽºrÆ€Óvá ððþÜ €*Â7ÓCƒNœWî^Sd¯gðhhe `YIPßE : -®ÃòäÖÌȰ¼ò±È¨d¡ë›z˜"—ê—ÏšÁŸ§¦]¯´¹yÅmÒNàÓî°ýš B\)Ÿ6ÆB’MÌVC^ÐcWgÆhhGel`YýP¸F; .K ÏøôhåJ×Êνô²ª©!¢œá˜[—󗨚jŸ"¦¬®Û¸{ÄPÑ߈íXü; ã(U5‘AyLÓUp]'cÜf{hügbeº`Z«Q’Gž>šM˜u˜·šŸJ¥e­+·jÂçÎcÜ•ê6ùù’µ$2w>‘I-S[-aIeWgMg-eaÜZâR·1T$6¥îø]ê=Ü×ÎrÂL· ­Ÿ¥tŸ=›™ú˜ùšŸ¥Ü¬b¶dÁ«ÍôÚýè|÷&®Ë"20ž<ÏG‹QŸYã_5d€f·fÚdó`[aSýI?ò2Â%Ðd ÈúIì1ÞÉÐXĹQ¯(§Í _œö™ž™X›ŸÕ¤f¬¨µjÀt̉Ùdç½õJÀÓ ;.²:øEÒOX‚^ c’e fsdÓ`=[ÐS°J@"4)'e ¡ü5î'à¿ÒCÆóº ±º¨0¢ŒçšMšÃ›AŸ³¤þ«û´}¿LË+Ø×å ôzÜåM,Î8(D N‚V#]áa£d\ed¬`\[2TVKó@@5{(äÄ bþ ðâÔȳ¼­²9ª‚£«žÍ›öš,œgŸ–¤Ÿ«]´¢¾:ÊçÖiäyòΈ*7€B”LUæ[Õ`ÍcÀd©c`|[‘TðKÆAG6°)@@õÿ¬ñ®ãDÖ³É<¾´„«£¤Ÿ‹œ}›xœxŸl¤;«Á³Ó½;É¿ÕãñSÿ– “)˜5AIKñSæZ`-cUdtc`µ[U’L–BB7Ï*~•[óå¬× Ë€¿Bµˆ¬€¥N  Ì›“œ_Ÿ ¤¾ª³þ¼AÈ¥ÔêáÊïÿý> =´']4ö?CJS*Zr_Êb"drc¾`\‹UGMrC>8ç+«ÑŸ`ô]æßØ,̆À*¶M­¦À Qã›|œŸ¯£$ªV²¼AÇŽÓÂà˜îÈü ˜&V3 ?wIfRªY_¡b%d¢ca˜\6VN]DC9ÿ,Ñþ͈õyçéÙÍ[ÁÞ¶Û­ƒ¦ü aÇ›5œ©ž£g©y±#»3ÆoÒ™ßkížûè ÿš%s2F>ÖHìQYYö^§bWdÿcŸaE]WOeE_:).!1û«öŠèãÚüÍÂu·J®Ç¦¡K„›Ç›žY¢†¨z° ºÅ8Ñ[Þ-ìfú½èœ$’1ˆ=?H€QYå^Äb£dwdBb^óWPŠF—;o/O"}@â÷­éìÛæÎݸ»® §&¡.7›K›iˆ¡‘§e¯Û¸ÃÃåÏÝÒêùwµ„#š0µ<–GQÍXÊ^Ûbëdðdébá^ìX*QÂGæ<Í0¶#æ¤9ùñêÝïÏÂÃ̸H¯f§O¡#ùšÚšÈœ¹ ˜¦H®Ÿ·nÂ~ÎŽÛ\éŸ÷`G"}/½;ÈFcP^X^ÕbeUec¨_àYERÿH>>:22%h$ °úXìeÞ!ÑÏį¹ý¯é§¡;Úš…š>œüŸ­¥2­e¶Á Í ÚÒçöŠéæ 9.œ:ÐE™OÆW,^ªb(ešeücY`ÁZSS4J•?¬3¶&ø¸ @üÜíÕßuÒƺºÚ°”¨¢yÞšPšÐ›YŸÖ¤,¬5µÂ¿œË†Ø<æyôñZiÕ,Y9´D«N W¥][beÀe\dñ`Ž[QT_Kæ@5?(‘Z âývï_áçÓSÇå»Ù±a©«¢Ø›8š~›Ìž¤6«´u¾-ÊüÖ äÒòH·ÕX+ú7{CM-Vþ\íaàdÉe¡dpaF\>U{L,B‡6Æ)-ŽÿñùâlÕ»È)½ò²Jª_£SžC›<šE›Yžf£Tªþ²7½ÊÈ{Õ ã-ñžÿ:Ñ)63BL>UD\ka™d½eÒdÜaë\V†McCâ7@+½ 2¾òäîÖ"Êm¾ ´5«¤Óžˆ›Fš›í¢{©õ±¼rÇÔ~á•ïþw ­X(25ù@oK^T—[ö`]d½e ePb–]÷V•N›D=9¶,G6ÌRôæ^ØuË›¿µ ¬µ¤:Ÿµ›8šËšj ¢¨Û°ÁºƉÒðßüígüå *î&è3Õ?wJ˜S[ž`AdÜefeãb_^òW¼OèEª:;.Ü Òfâõ“çÂٷ̵ÀûµÀ¬5¥ŸÀ›š`šÈœ2¡ˆ§©¯k¹›ÄÑYÞaìÎúX ±%¬2Â>’IæRŒZ\`9dfÓe‡c7_ùXîP?G<Æ/v"sx÷é-ÛÎØÁñ¶…­Å¥ØŸÝ›é™š5œi Œ¦®¸'ÃqÏ·Ü´êù¯ $F1=~HRßYé_dffdó_ìYRH–=\1"$-Å4ùÇêÇÜ~Ï0ø®‡¦^ %œñ™Î™½›³Ÿœ¥Z­Ã¶©ÁÑÍþÚêèN÷ßR["³/<=GöP YS_­cfHf{d¦`ÝZ+’M¸òÍã Ö&É[½é²ªâ¢ \š'™šøœê¡Å¨d±›»5Ç÷Óááïyþ vF)?6 BªL§Uç\Fb¨eúf6f`c†^ÁW5OE€9Ç,&âFžó6åX×MÊW¾·³¡ªF£ÍPšä˜Ž™Lœ¡Á§<°UºÙÅŠÒ)àmî ý¼ /(75?AõK!U”\&bºe?g«fdR_³XGP9F¿:.w 3Øô[æbØ7Ë¿T´«Œ£å;š¡˜!™·›V æ¦E¯H¹»ÄbÑûÞAíèû¥ ,0'h4‘@kK½TW\bÎeyg g†dö_sYQ%G¹;/!9ŽÌõ>ç1ÙíË·¿Ï´o«Å£û.šs˜Ò˜I›ÌŸD¦Ž®€¸æÃ„ÐÞ`ì ûÓ f{&È3@ûJiT\öaÐe™gGgÛdc`öY´QÊGj<Ð/="÷JöêçÏÙ{Ì4À7µÀ«ÿ£ž8šd˜«˜ ›zŸÞ¥®ú·TÃéÏyݼëiú3 Íë%C3‘?”JTÝ[Éa¸e–gXge`BZR7HägIûRßZë`þdgòfÉd”`iZhR»H•=/1Ê#¬køáéÊÛqηk­€¥lŸM›;™?™X›}Ÿ—¥‡­#·8ÂÎæÛ÷ézø$¨º#1j=‚H!RZ4``dfŽf†ds`lZRI>¾1w$sü\ùßêÑÜzÏ Ã¸]®_¦3 ø›Æ™¦™››˜ŸŠ¥Q­Å¶µÁèÍÛé~÷‹–"í/Jƒ2^%w ŠúìÞ¸ÐVÄ*¹n¯U§¡¨œLššÅ›’ŸS¥ë¬1¶öÀÍÚíçAöÇ4=!™.;9FP/X^c{eâe7d…`ßZaS3J…?3‹&Àv öû‹íßÒ¬Ågº‹°L¨Ô¡D´š2š¿›TŸß¤B¬Wµï¿ÓËÅØ‚æÄô@ª¹#-£9øDçN=WÏ]zb'eÇeXdá`s[+T/K­@Ü4ù'G ”ý'ïážÓǨ»¢±3©†¢¾òš3šƒ›Üž-¤Z«=´ª¾iÊ>×çäó”"£+C8¿CÜMfV0]beáe°duaA\/UcL B\6“)òÀ FÿÐð¨âÕeÈÓ¼œ²ö©£žüšý™›+žC£<ªò²7½ØÈ–Õ1ãbñßÿ^’3*ú6¥BöLºUÁ\çae2f?e@bC]cVÂMŽCû7E+®|úqò/ä{ÖžÉÛ½m³ªf£ žÔš•™išL.¢ø¨…±©»1ÇàÓtá§ï1þÄ Ý(Ñ5®A8L7U|\ãaNe¬föe/cf^²W8O"E¤9û,h2¡ôŸåÄ׹ʾ´ÿªš£ž‰š ™¦™Rœ¡¢§ °º‡Å+Ò½ßøí‘ü> °Ÿ'Á4Ó@•KÏTS\øa¡eJÃS¸[ÒaðeýgïgÆeaZ[MSIT>Ö1T$døÛéÛΛÁ^¶ ¬’¤^ž$šû—í—û™ž5¤,¬ÖµÁrÍéÚ"éÐ÷ªa©#91É=IîR[ca¹eÿg)h7f3b2\RT½J¤?@3Ó%¡õú]ë ÝoÏÎÂk·€­A¥Ùžiš˜Â—™™„m£7«¹´Â¿Ì{Ù§çQö-îH"ñ/ <HRjZê`seígMhf½bê\5UÆKÎ@…4,'a „û¿ì^Þ¬ÐïÃj¸X®ï¥XŸ¸š%˜®—S™Ë¢kªÇ³¯¾êÊ8ØUæ÷ôÒ™!».ƒ;G9QµY``e¿gNh¿fcu]éUŸLÈAœ5Y(E¨ ÐüîžßÜÑ Åi¹8¯ª¦íŸ"›c˜¾—6™ÄœU¢Ì©³É½çÉ×(å¾ó“ZÇ-j:FUPóXÃ_¢dvg1hÏfWcÜ]yVVM¢B“6j)jÜ þEïÖà Ó'Æpº#°u§“  ›·˜æ—1™’œ÷¡D©S²õ¼óÈÖäˆòS‡X,B9E^OX_dgþgËfc4^ýVNuC‰7}*•Tÿ“ð#âNÔ\Ç‘»)±[¨T¡8œ"™#˜>™oœ¤¡Â¨¦±¼øÇôÔÏâ@ñþÿ»,+ý7ÓCIN(WB^sc f¹g·f c…^W´NPD‹8 +Ôm·ýñã±Õ±ÈмL²[©-¢åœ ™m˜T™PœQ¡<¨ï°<»ìÆÅÓƒáÞïŒþB ²’)›6‡BMVa]Àbflg¡fÂcÝ^ XtO?E£9Ý,/ß9‡óå2×!Ê(¾…³oª£œ#š¹˜g™)œñ ¦§$°@ºÆÅyÒà\îûü© (5%AÙKUu\be$g“fðcF_®XKPGFØ:7.¨ o×+õ¸æÉØ¤Ë¿Ê´Š«¤Sž šû˜l™ñ›} ÷¦?¯*¹ƒÄÑ’ÞÀìQûû qg&—3»?”JëS[Xa(eìf›f6dÉ_lY@QnG*<¯/<"ŒäöjèkÚ/ÍûÀ ¶ž¬ß¤ùž ›%™V™››éŸ(¦9®ñ·ÉÏîÜëù8¶¾$2O>SIÚRµZ¹`ÉdÎf¾fšdm`KZVR·Hž=F1ï#ÝZ±ø.êÜÃÎjÂO·®­¶¥“Ÿc›<™*™-›:Ÿ=¥­œ¶ ÁæÍ0Û9é¸÷bë#p0Ü<HÊQÞY!`rd»fïfe!a=[€SJ%?ð2³%³8 ŒúýëÖÝ_ÐßÖ¸¿®¦+ ¹›O™ø˜¸š„žI¤ê«?µÀ:ÌjÙaçÙõ…L!Ò.e;ÅF¶PY‡_d¦fgeÕa.\©TnK«@š4w'‰ hüÎí‘ßýÑWÅá¹Ö¯j§É œi™Ï˜Kš×`£Éªë³˜¾—ʬגåô®M“5-í9yEO$Xã^¶c„f?gãevb ]¿U¶LB16*)Nä 8þ”ïFá—ÓÎÆ-»ñ°O¨s¡‚œ”™¹˜õ™B¢Á©²²3½ÉÖÙã=òéæ¡+z8.DN=W5^DcQfKg.fÿbÏ]¸VàMtC«7Á*ù›ñÿHñëâ$Õ<Èu¼ ²8©%¢ùœÏ™¶˜µ™ÆœÙ¡Õ¨•±ë»¢Ç~Ô;â’ð9ÿå H*7çBeMQV~]ÆbfDgcfocx^—WïN¯D 9=,Œ<—ëòƒä©Ö¥É¼½*³'ªá¢~šÇ˜Š™bœ=¡¨“°¿ºQÆÓ´àýîýJ ·™(©5¢AGL`U¾\;bºe*gƒfÈc_[XãOÎEN: - Å)|ô æ!ØËý¾F´«¢£ žršæ˜q™œ¶ J§ª¯ª¹Å·ÑEß~íüà 7)'P4g@0KrTÿ[¯ace gšfd‹_YÇPÜF€;ð.m!<¨üõƒçŠÙXÌ3ÀXµ¬]¤•žÆš™Y™Â›3 •¦Ç®Ÿ¸èÃiÐáÝ ì›úG ÄÅ%36?#JSI[*aeïf¶fgd`ÇY«QèG°<>0Ñ"¯"u÷õèìÚ£Í`Áa¶à¬¥Ÿ›™9™m›ªŸÛ¥à­·µÂÏ|Ü—ê!ùÎSe$¹1 >I³R›Z®`ÌdÞfÛfÂdŸ`†Z˜RýHè=‘1:$&ŸðøfêLÜëΈÂe·¹­¹¥ŒŸT›&™™ ›Ÿ¥ì¬r¶wÁ¿Í Ûéž÷NÝ#o0á<HÚQóY9`ŒdÖf g)e;aT[“S!J.?ô2±%ª) wúãë¶Ý<иÃn¸–®e¦ •›/™Þ˜£šwžD¤î«Kµ,ÀXÌÙçöÀZ!/ª;GöP@Y»_FdÉf6gŒeÔa \TGKx@[4.'6» üjí,ߘÑõÄ„¹€¯§‰ ã›D™º˜Hšå£ùª,´é¾÷ÊØæô2Õ º-m:ðE PƒX1_òc­fSgáe^bÝ\{U]L³A´5ž(µB ýéîœàñÒ0Æšºm°Ü§¡9œd™£˜ú™bÊ¢ª³·½§É±Ö’äó³\±g,69ÝDOÅW¤^™c‰feg(fÙbŠ]UV`MÚBø6ú)"· ÿYðþá>ÔbÇ«»W±›¨¥¡˜œ™š˜½™óœ+¢J©+² ¼rÈeÕ5ãšñJùZ"+ 8ÐC5NW^4cTfagVf7c^ W>NÛC81+k `²ñNã€ÕŽÈ¼¼H²f©G¢Ö™±˜£™©œ²¡¤¨[±ª»[Ç1Ôëá@ðçþ“ øÌ)Æ6¤B(MVQ]¡bòe1gZfpc‚^ªW OÓD69q,Æ|Ý4óÎäöÖóÉ ¾u³oª$£¼Qšö˜±™~œO¡ ¨°¯º6ÆèÒƒàÁîXýý b>(I5?AãKüT]\ÞadeÜf?fcÜ^=XÔOÎE_:Á-7 yÚôuæ–ØƒË¿Î´¡«*¤žîšY™Ø™iœþ §Ë¯¶¹ Å•Ñ ß/í³ûL ®‘&ª3·?zJºSG[û`·djf f˜c"_ÀX‘PÂF„;/­!š"ö0èLÚ,ÍÁD¶ò¬O¥ƒŸ«›Û™špœÆ  §¯Î¸òÃMПݢëú˜ôÙ$þ1>ýH`RZü_îcÚe¶e‚cJ_%Y1QšGl2z%Ƙ 8ûòìßÙÑ’Å{ºÍ°º¨m¢žš›8›àœ‹ &¦’­©¶=ÁÍöÙ›ç¿õY; v-Ä9æD¢NÆV']¤a'd¢dc_Z­R¬I.?h3˜&ç –üWîtà5ÓàÆ³»è±´©?£¬žœ›õœn Ö¥­ûµeÀÌÙØdætô¿üà$,‚8»C“MÙUb\ a¼cgd cª_ZZ6SbJ @i4¸'81 êý¯ïÉáÔÈӼ벓ª÷£8Ÿpœ¬›ñœ8 p¥~¬=µ€¿˵×*å*óm§‘á*R7¤B›LU·[Œ`lcHdcì_ÌZÔS*Kù@w5à(u| <ÿñã¼Õ@Éà½Ø³Z«”¤©Ÿ±œ½›ÑœçŸñ¤Ó«j´‰¾üɇÖéãÝñXK«)36¢A¼KMT)[+`;cHdLcN`[[ŽT LüA—6*¼ÌOòVäìÖWÊØ¾«´¬¥øŸÐœª›œtŸP¤«y³w½ÎÈEÕ™â†ðÃþ ~(!5±@ñJ­S·Zê_,ckd¡cÒ` \jU MCÓ7f+-î¤ó›åØgËÅ¿pµž¬|¥/ Ôœ{›+œâž£ªj²I¼‡ÇëÓ4áï^ý­ ÀN'4Å?/JSTZº_0c£d doa×\^V%NUD#9È,…YõçæLÙy̱À1¶0­Ü¥[ Êœ<›¹›>ž¾¢#©J± »0Æ‚ÒÁß§ííûI p&ý2Ø>nIˆRõY_cSe\eVcM_VYQ!H<=1ø#ÌSùýêÝÞϣฯ"§¡ÍœœšxšcœS 3¦å­A·Â.ÎHÛ ép÷ìJ>"‚/Ï;çFP•XÐ^ cme¬eÜc`>Z¢RYI”>‰2y%¦X ÙúuìvÞ%ÑÇÄ›¹Ý¯¾§h¡þœ”š9ší›¨ŸX¥Ý¬¶ÆÀÂÌÈÙ”çßõ^ÈÏ -.›:ÚE®OåWU^Ûb`eØe@dŸ` [œS}JÜ?ï3õ&1ê küþíïß†Ò Æ¸ºÏ°¨ø¡Wµš!šž›"Ÿ¤ò«û´‰¿eËRØ æMôË:OÂ,M9¯D¬NW³]ob,eÜe}da´[xT†K AC5d(µ{ þïuáùÓaÇð»ß±d©©¢Óûš.šq›½ž¤$«þ³a¾ÊèÖŒä¾ò5¥ÄH+ì7mCM!Vô\äaØdÁe›dkaB\;UzL,B‡6È)1–ÿ&ñãyÕÊÈ:½³^ªt£jžZ›Tš^›qž~£jª³J½ÚȉÕã3ñ ÿ3Å)6BeL!U#\Fard”e¨d²aÁ\ðUaMACÄ7'+ª”-Àò˜äÿÖ:ʾ3´b«H¤ ŸÂ›ƒšQ›*žþ¢³©(²1¼™Ç%Ô”á¡ïþn ˜9( 5Æ@2KTL[¥` dge·dýaG]®VSNcD9–,52Ölô>æ–ØºËî¿mµp¬#¥®Ÿ,œ¯š@›Úq¢í¨-±»AÆ©ÒüßôíJü³ ä”&|3Y?îISjZý_žc:eÊdPbÙ]{WXOšEs:.Ú ë›3öþçFÚQÍcÁ¹¶‹­ ¦X —œÚš(›Ø¡¨°Â¹ÒÄÑJÞ/ìzúáÝ$à1à=¡HèQˆYX_:ceîd¸b‚^bXyPïFõ;Å/"ÁzøÑéÜðÎÛ¸Ÿ®à¦ï ëœèšñš¡§ë®]¸CÃdÏÜVêœø Q+#P0zç2ã%Ò XûõìõÞ Ñ;ź<°¨¬¡1·šJší›—Ÿ6¥¬¬Óµ{ÀmÌkÙ2çzõùdp Ô-K:“EsO·W4^Èb[eàeUdÁ`6[ÒSºJ@44<'w- ©ü6îà¬Ò$ÆÈºÔ°z¨æ¡:šó™i›éža¤µ«À´Q¿2Ë'Øêå6ô¿;^Þ,v9äDíN\W^Èb‰e;fÚdma\ÁTÃK »¯(Ï5×A‹L±U]Ÿb%f˜gñf3dm_·X4PF:Á- ¿LôÈåÊמʆ¾Â³Šª£tÙ™Q˜ã˜›A å¦Y¯p¹õÄ­ÑVß©í[ü! ­´'í4AéK4UÅ\ub%fÃgGg²d`€YQG›;ë.H!øE{õèæ×Ø‘Ë[¿t´«o£©á™,˜’˜›šŸ¦k®d¸ÑÃwÐÞaìûá z•&é3.@'KšTV\3bfág“g,e¸`NZR'HÇ<,0—"NœÌö,èÚ§ÌQÀFµ¾«ì£÷þ™˜L˜ššöžJ¥u­L·Â,ϹÜýê®ù€&T%Á2'?DJáSË[ØaêeëgÑgœeXa[SAI>~1ú#¼ 9øŽéWÛÞÍiÁ8¶†¬†¤`ž4š˜˜2š]ž‚¤‚¬4¶dÁÙÍRÛŠé6ø »û#€1>FI S%[ca©eßgúgúeéaÜ[òSUJ6?Ï2`%0‡²ùýê¶Ü%Ï’Â>·c­4¥Ýž~š-˜÷—Ü™ÔÉ£œ«%µ3À‹ÌïÙè½ö’Kš"50×<=H,RpZà`YeÄghJflb\ÓT^Kb@4À&žý )ûmìÞqÐÁÃJ¸H®í¥eŸÓšN˜ã—”™X£Ãª#´ ¿H˕خæKõÝ:!ê.§;.GDQ´YS`ýdœg!hŠfßb3]£UVL~AR5(i –üÕísß¹ÑðÄY¹1¯¬¦÷Ÿ4›|˜Þ—\™ïœƒ¢ý©6³ü½ÊO×Wåéóº}å¨-}:#F]PõXÀ_šdjg!h»f@cÂ]^V9M„Bu6K)L¾ ïý*ï½àòÒÆ]º°g§‡ —›°˜á—/™’œú¡I©[²½ÉÖäžòl3¥x,d9'E‚O@X5_;d9ghèfœcJ^WN{Cˆ7u*…5ÿmðöáÔ#ÇR»ç°¨ ¡ñ›Ý˜à—ÿ˜6œr¡š¨‡± ¼ñÇùÔáâ`ñ+örV+Y87D³N—W´^åcg$hgûcÓ^ÀWäNoD—8™+¸=s§ñ$ã8Õ)È=¼°±¹¨ˆ¡Aœ™Õ—ǘћä ä§­°»ÞÆÒÓ¬á#ðíþ¼ E:*U7QCïMùV?^œcôf6h[ggdj_~XÆOpE²9Ç,ô·äòUäVÖ/É#½s²U©ù¡…œ™¼—˜\›C §À¯º¸Å™ÒeàÕîŸýu )I6eB'MZVÍ]XcáfSh¨gãd`PY½P‡Fã: .H Û7ô›å†×DʾC³û©q¢Íœ,™ —2˜Þš—ŸE¦Å®ê¸€ÄKÑ ßqí;ü ¼Ú'*5gAPL­UM] cÅfjhòg^e½`%Z¹Q¥G<^/¨!CzšõïæÆØiË¿ ´®ªö¢!L™—ì—gšñžr¥Ê­Í·FÃûÏ©Ý ìÑú´ f˜&4`@oK÷TÆ\³b¡fzh5hÓe`aõZ±RÀHU=¬0#«ãýöFè Ú’Ì%Àµg«£|u™‚—®—÷™Rž¨¤×¬·¶¯ÎMÜ£êiùQS%×2S?†J7T2\Pbofzhgh6fóa´[˜SËI>î1Z$ G^øéPÛÂÍ8Áõµ2¬"¤ï¸™•——¨™Ôý£¬¾µùÀ|ÍÛMé øòµ$Ÿ14>‡I\S[ËafVhvhwfebU\eTÀJ—?$3¨%i±Ëùë®Ü Ïj·­ã¤žšÁ—†—i™`W£.«½´Ò¿4Ì£ÙÙç‹öo6•"@0ð \û“ì.ÞxйÃ3¸!®¸¥#Ÿ„šô——(™çœ§¢Kª¬³˜¾ØÊ+ØLæóôÓŸ !Ë.˜;0GWQÙYˆ`CeñgƒhøfWc³])VàL BÜ5—(€ß ý3îÁß÷ÑÅq¹5¯›¦ÑŸúš/˜~—ë˜oœö¡e©–²W½rɨִäMó(øpD-.:êE;PìXÐ_Ãd«gzh+gÆc[^WïMCC;7*ƒ «þÛï^áӊƾºX°§“ …›€˜”—Ř œ\¡–¨•±*¼È6Õ*ã´ñ‡Xؾ+Á8DOóW_0dQgZhEgdæ^ÆWàN`D~8w+?oñëâýÔðǼ{±‰¨\¡œà˜¼—´˜Å›Þ ä§³°»ìÆäÓÀá8ðÿÒ YM*e7]CøMþV@^šcîf-hOgXdZ_lXµO_E¢9º,ë{¶èò_äeÖCÉ>½“²{©#¢³œF™î—²˜Ž›t I§ê¯+ºÖÅ®ÒràÙî˜ýd ïî(6)BãL Vy]ÿbƒfôgIg…d¹_ûXpPDF«:ã-, ÏLôÀå½×‹Êo¾§³lªí¢R·™/˜Á˜l›  Æ¦;¯S¹ÙÄ’Ñ<ßíBü ”š'Ó4ù@ÎKUª\Zb fªg0gd`rYQG;ô.X!d£õçÙÏË ¿¿´e«Â£ÿ8š‚˜å˜_›ãŸZ¦¢®¸ñÈÐÞSìöú² <G&‹3Ã?°JTÌ[£aeLggŸd3`ÔY£QËG<ù/z"J°úösègÚÍßÀèµq¬­¤ÃžÒšî˜!™j›½Ÿ¦®Ý·ÈÏõÜë§ùWÚæ$12x>zIþRÒZÐ`ÖdÑf·f‡dN`!Z!RxHV=÷0›#‡\øÞéÓÛ„Î7Â,·š­µ¥¥Ÿ‰›v™x™›¬Ÿ¾¥¤­5·?‰ÎÒÛ×éNøìen#¿0=(HÇQ½Yá_d>fVf\dY`bZ—R I/>û1Å$ÑgÓù`ëXÝЬ̸߮ئ  Wœšß™½›£Ÿ}¥,­‡¶_Á|ÍÚ€èÛöeÓØ!./;¸FsPŒXÙ^;cšeée)da`¥ZSÕI?3&8ë kûíß©ÑBÅ ºC°¨³¡8¾šPšò›šŸ6¥¨¬ÉµkÀVÌKÙ çGõ» x-æ9'EOAW½]Rbédueôcl`ñZŸSœJ@G4h'¾ %ýËîËàmÓ÷Æ©»¾±j©Ö¢%žp›Äš$œŠŸä¤¬ù´a¿Ëß×vå–óõJI«+)8„CMìU™\fa:deÈc„`L[³¼ªõ£ Ÿœ*›FœgŸ}¤l«´@¾ÂÉ]ÖÏãÓñ llØ)l6åAL¡Tƒ[‹`Ÿc®d´c¶`Â[óTmL[Bñ6k* Í„òä×nÊå¾­´û«ý¤×Ÿ£œq›Iœ%Ÿ÷£¦ª³½WÈÉÔâðFþŽ ”(½4X@¦JqS‹ZÐ_%cxdÃcaX\ÈU}MŸCd8,Áߥ]ôRæÌØÌdÀ¶­ä¥€  –›*œÃžS£Ä©ô±¸»ÞÆ,Ócà=îsü¼ Í^&'3è>cIbR¶Y9_Îbddñcya]³VžNñDß9¡-w ¤p%ö èqÚ˜ÍÃÁ1·®¨¦¡Rœ›î›Hž›¢Ó¨Ï°fºeŔѴÞì³ú !É$²1š=CHuQYÀ^”bid6dûaÃ]¦WÂOAFS;1/"S!Ð÷©éõÛüÎÃA¸ö®N§s¡Ž›¤›Ãߡ㧰¯¹ûÃÐÝâêùh˜W#`0n(,5AKŒTÔ[@a³dfreºb^bWýNþD™9 -’vÿzô1ænØyË•¿ÿ´ï«”¤Ÿ‰› ššš9Ø¡`¨¯°˜ºêÅhÒÓßåíSüÕ ã&ß3Í?oJSýZ“`3dËeTeÎbG^ØW¡OÍE:#.Æ ÁZÞõ–çÎÙÌÌÕÀ&¶ö¬u¥ËŸœcšÁš-š¡ð§°Ì¹öÄQÑžÞ—ìõúm ³~%†2‡>CIƒRZ×_¦coe+eÙb‡^KXDPžFŠ;A/"ÀM÷é:Û,Î ÂV·®]¦‡  œ¼šæšS¡u§b¯ñ¸ñÃ'ÐUÝ7ë„ùó8 $16=HrQ/Y_ceeôbØ^ÑXþP†Gœ›õš¸œ~ 3¦º­ë¶˜Á‡Í}Ú5èiöÎ!B.:¯EdO~WÒ]@b°deqcÇ_-Z¿R¤I ?+3A&‘b üû¬íºßo񮧼±à¨q¢è[›×šaœïŸo¥Å¬ËµRÀ#ÌÙªæ×ô=“Žæ,U9›D}NÉVR]øa¡dAeÓc``ùZºSÈJR@Ž4º'ì „ý'ï"á½Ó=Çã»ê±†©â¢!ž\› šó›MŸœ¤Æ«¤´ ¿ÂÊŽ×,åUóÁ$4¨+:8¨C·M4Vò\Ía®d„eLd aÒ[½TðK™Aì5()Žd õþŠðoâíÔIÈǼ¡² ª5£?žD›Sšs›œž¾£Àª|³Æ½gÉ%Ö¼ãæñZÍó„*97ÏB M¸U¨\¸aÍd×eÐd¾a°\ÂUMÚBB7‹*÷ÌSÙñ§ãÖBɘ½F³‚ªy£Pž"›šïšê㢿©\²‹¼ÈÊÔ[â‡ðÿ† Ãp)F6BkLEUf\§aíd(fPekb†]¼V/N D‡8Ý+N"¡óÐä×/Ê_¾ã³òª»£bž›±™ršB¢Ì¨I±`»ÛÆÓ á8ï½ýN Ÿg(^5@AÐK×T%\–a eufËecS^¬W>O4EÂ9$-›nåMôòåØË!¿}´a«û£sžåšd™÷™œœE¡Ú§9°6ºžÅ6Ò»ßéíuü z]'s4z@3KfTã[ƒa*eÃfGf¹c$_¢XSPcF;u.ó Æ6õ ç0Ù Ìï¿!µØ«B¤‰žÉš™y™ñ›p Þ¦¯þ¸PÄÙÐWÞ„ìûÄ ?=&t3¢?…JçS•[iaCegÇfhd`¦YzQ§G`<à/f":¤ðöjè^ÚÍÓÀÙµ_¬–¤§ž±šÈ˜÷˜<›ŒŸÑ¥é­¬·çÂ_ÏÔÜÿê™ùTå%[2²>ÄIXS=[Ha[eagNg$eí`¿Z»RIÛ=l1ý#Ò5røÕé«Û=ÎÏÁ¤¶õ¬ô¤Êž˜št˜i˜wš”žª¤™¬:¶ZÁ¿Í)ÛSéô÷¿g¢#$1©=îHºRÙZ"ate·gâgñeðaó[T‹Jy?3º%‘íúdëÝ‚ÏåÂ…·œ­]¥ôžš˜Ó—¤™‰l£0««´®¿þË]Ù…ç-öÊ'"Ó/ˆ<H RjZô`ˆehyhÇfÿb6]ŠU!L.Aè4'h½ Ùû íœÞÛÐ Äu¸P®Ñ¥%ŸošÇ—;—Θyœ'¢¼©³ö½1ʄשåXôD!  w.];GUQôYÂ`šechiœgd{^ýV»MæB¶6i)D’ ý´î$à8Ò8Åi¹¯G¦YŸ_št—¦–û—k›å L¨{±@¼fÈ­ÕÐã†òƒx-2:FœP{YŠ`¥e±hŸihheµ_eXJO“Dy88+_[ÿYð©á”ÓeÆaºÅ¯È¦™Ÿ^š2—%–=—uš»Ÿô¦ü¯£º²ÆëÓ âÄðÍÿÙ˜¾+9EÖOïX<`•eàh jiôeÇ`¤Y¯PF:ä,Êíñ"ãìÔ•Çb»“°`§øŸ‚š—Ó•³–µ™Éž×¥¸®?¹6Å^Òsà,ï<þV ,o*Ö7DOKXÌ_\eÞh?jyif“a›ZÌQUGl;N.? ‰xZó~ä0Ö»Èe¼n±¨x Ñš8—¾•l–>™&ž ¥Å­,¸ÄÑ!ßÒíáü á7)¶6CNW:_õd¤h4jœißf b=[”R>HqÑ1#$»âæ÷éºÚ"Í’ÀLµ‹«£W-™—(—V™šÜ£ü«Ñµ'ÁÂÍbÛÀ鑸ˆX³$O2å>5JT\Wb“fºhÁh©f{bN\CT‚J>?²2 %ÍùEêéÛIΫÁQ¶v¬N¤ž±™u—W—Y™o…£{«'µXÀÒÌVÚœè\÷Hp#1º=IS@[ŸafWhŒh£f¥b§\ÉT3K@¯3<&L gúŸëBÝšÏíÂ~·‡­=¥ÊžOšå———f™J.£óªq´w¿ËË.ÙYçöâ¥"¯/c<ÝGâQ>ZÅ`VeÙgAhfÄbû\PUëKü@½4m'Q² ÝûíÀÞÑUÄи¼®N¦²Ÿ ›m˜ê—ƒ™/Ü¢lª·³¾¶Êó×ÿå‘ô^u (.ì:}F P YÒ_’dIgèglfÝbN]ÛU«LîAÜ5³(·2 ný¸î\à¥ÒÚÅ=º °w§¯ Õ›™G˜¥™†¢Ü©ð²“½É¢ÖŒäó¿pˆ,Y9EEOíWÍ^Àc¯fˆgJfùb§]oVyMðB7*6Ë ÿnðâUÔyÇûo±³¨»¡­œ¢™ª˜É™úœ,¢D©²Š¼TÈ?Õãbñ ± Î*²7vCÛM¬V»]äb f$g%fc^ WMNûCJ8u+ÀqÒ0òÖãÖ!ÉQ½Ú²ô©Ì¢ˆBš ™ë™ÜœÎ¡©¨G±~»Ç×Ó{á¾ïSþñ L)6îAvLqU±\bteÉf f9cf^ªW'O E‰9Ý,H„êóŽå»×ºÊ;3´"«É£NžÍšZ™ú™¬œ`¡ÿ§e°iºÕÅnÒóßî¦ü? w'ƒ4@-KUTÇ[]aûdf fycã^aXP)FÒ:J.Ó ±.–õ4çRÙ9Ì-Àkµ,¬ ¤íž2›‚™ä™XœÑ 7§j¯>¹‚ÄùÐeÞìþú— þé%3.?J[S[Ñ`ªdyf5fßcƒ_8YQ`G/<Æ/f"SÖ;÷Íè×Ú¢ÍqÁ…¶­T¥hŸq›ƒ™©™á›! Q¦S®ü·ÃvÏÍÜÛêVùõjl$±1õ=øH€R^Zf`|dˆfffdB`,ZAR¬Hž=P1$ø}Úø\êNÜøÎ Â†·ã­ê¥ÄŸ‘›f™O™M›UŸR¥&­§¶¦ÁèÍ.Û4é°÷Xàü"c0Ï<H¾QÔY`id³fèfea6[xS J?ä2¥%¢$ vúäëºÝAпÃt¸®k¦  ˜›0™Ý˜¡šrž>¤æ«Bµ"ÀM̆نçö»W!/´;G QXYØ_hdïf`gºebQ\¿TvK¥@„4S'TÒ üpí(ߊÑÝÄa¹S¯ç¦H š›ô˜d˜í™‡!£œªÒ³”¾©ÊÔ×ÏåSôÅ Ë-:#FLPÕX’__d%gÓghfébj]VãL1B(6)Š Äý ï¥àäÒ Æ`º°w§œ °›Ë˜þ—L™®œ¢a©o²½ É%Öäœòf)˜j,U9EuO5X-_8d:g&höf¯cd^/W6N§C¹7ª*½;nÿ¥ð*âJÔMÇu»±%¨¡ê›Ê˜À—Ô˜þ›/¡L¨0±­»ŒÇÔvâõðÂÿ‘+8úC…NyW§^ëc(gOhXgId2_.X`OöD&9.,QÖ 7ò¬ã´Õ—È™¼ú±î¨§¡Hœï˜­—‡˜{›w d§°rº1ÆÓðàeï0þ •—)Á6ÏB‚M¤V^{cïfMhŽg¶dÔ_Y_PFo:’-É[“¾ó)å×êÉͽ³Ò©[¢Ëœ=™Ä—h˜&›îŸ©¦4¯a¹ýÄÊчßìí¯üƒ *(j5“AiL±U=]åbŒfh•gñdB` Y-QGŒ;Ï.!Ä6õžæŠØBË ¿*´Ðª0£r´™ ˜z˜›™Ÿ#¦®‚¸÷äÐFÞ–ìKû °Ç&4T@DK®T`\2bfÉgpgÿd‚`ZËQÞG|<à/L"Z’öûçâÙÌGÀKµÓ«¤*žAšh˜¨˜›gŸÂ¥ñ­É·ãÏ)ÝcëúÊ_z%Ó2"?*J°S„[|azeig?gýd¯`lZRRŽHR=×0_#0”Ö÷Bé%ÛÈÍpÁ]¶É¬ä¤ÚžÇšÂ˜Ö˜›8Ÿe¥i­·C®ÎÜ=êÒøŒ=$ 1> IÂR·ZÕ`üdggeæ`ÏZàRDI+>Ð1r$XÉùê_Üõ΋Â`·®­¨¥wŸ;› ™ð˜íšöžø¤Ñ¬[¶cÁ¯ÍÛé›÷Oâ #y0î<&HèQZF`—dÞfg)e6aJ[„S J?Ö2%… NúºëŽÝЗÃQ¸€®V¦þŸ˜›<™õ˜Åš£žz¤,¬‘µxÀ©ÌäÙäçaö¥Ò!P/Ù;*G QDY®_)d›føf?eya¹[TÌJø?Ø3«&¶A ˜ûíÖÞTÑÄÄh¹z¯/§± "œ™™#™Äšrž¤ž«Ø´—¿¥ËÂØ©æõ·Fv ý-•:üEøOTXæ^Œc-f»f5e¢a\©TˆKÞ@å4Ú'  ýyîIà¾ÒÆ«º °1¨Š¡Íœši™ÔšKž¼£ «´¦¾ŠÊ‚×Lå¡ó4¼ì|,$9£D¾NAWÿ]Õbªepf#eÊav\CUVLÝA6*)p( œþðçáSԢǼè±Q©|¢Œšš¶™äšžT£jª;³š½PÉ"ÖÍã ò @Ú*•70CoMV ]b%e(feþaè\ðU;MöBV7—*üÌOÐñœãûÕ4ɉ½7³sªk£Cž›ó™âšÝÔ¢®©G²s¼ýÇ©Ô6â\ðÔþR Š3)6ÂA)LU(\ma¹düe-eSbz]¾V?N,D·8,œ~ óOåœ×ºÊì¾p´{«<¤Ùžm› š¹št.¢Î¨2±.»ÆÓà¦îý— Ûš'‹4l@KTi[ë`vdøejeÎb2^­WbO|E-:°-F 5ÅAõõæ*Ù(Ì3À‰µ`¬é¤JŸ ›þ™mšëœk¡Õ§°Û¹ʼnÑêÞ÷ìgûï D&-37?øI;SÍZŠ`Qdf¿e^cù^§XŠPÊFœ;7/Þ!ÔcÖöxè“ÚpÍTÁ|¶!­s¥œŸ¸›Ü™šYœ¥ à¦ê®™¸ºÃÐhÝoëâùuÜÍ$2/>IRUZF`Dd9ffîc¸_‘YšQúGå<“0D#>É1øÁéÃÛ‚ÎAÂ@·¸­Ü¥ÓŸ½›°™¶™Ï›ñŸ¦í­·ŠÂÕÎÜ$ê›ø9±º# 1Z=mHRùY`Bddfsfmd^`ZZ€RúHù=µ1o$kòPùÐê¾ÜcÏÃá·5®2¦ Ã›Ž™m™a›`ŸU¥!­œ¶”ÁÑÍÛé÷4ºÔ"90£<ÓGŽQ Yá_0dvf¨fÄdÔ`íZ-S½IÎ>˜2[%\ã<ú´ë”Ý(дÃy¸³®“¦D ç›’™Q™'› Ÿâ¤–¬ûµáÀÍEÚ@è¶ö\æ "z/õ;7GQ2Y_öcYf¦fÞd a=[–S=Ja?=3&¨ û|ìXÞåÐfĹF¯§® 9œË™p™+›òž²¤L¬™µiÀƒÌ¨Ù”çÿõ#E!¹.9;†FcPžX _Šcfkf½daR[ÆS‡JÅ?·3&»Y ÂûBí$ß±Ñ0Åâ¹°¿§I¡¿œ:šÇ™f›Ÿ³¤0¬`µÀÌÙôæKõÙRk Ú-[:«E‘OØWV^êb{eýeldÒ`A[ÖS·J@'4*'b •ü%îà¦Ò'ÆÕºì°ž¨¢xÙšHšÈ›PŸÎ¤&¬1µÀ¿œË‡Ø?æ{ôòYeÌ,J9D‹NáVr]bÌdnedŒ`#[áSëJq@ª4Ñ'+þ ”ý7ï3áÏÓRÇü» ²ª© £Sž”›ßš7œ•Ÿç¤¬ð´S¿ËÉ×]å{óØ+)‰+8`C[MÄUo\:a dÖd•cP`[T@Kõ@Z5ª() Êþð‰â+Õ¬ÈL½H³Òª¤9ŸRœo›—œÂŸá¤×«‚´´¾8ÊÓÖBä@ò…ƺ*›6BL—Te[X`XcTdGc8`6[[TËK³AF6Á)cs9þñ ä¬Ö#ʲ¾”´ý«¥ öœÞ›Íœ¿Ÿ£¤a«Ö³Õ½+ÉœÕéâÌðþþ4 &Š(5š@ÉJtSnZ“_Ébþc-cZ`”[óTšL´Bu7+ÙÖ¢ó®åCئËÀ×µ­¦À mœÊœ}Ÿ$¤¨ªæ²³¼ÝÇ*ÔZá(ïNý‚ zî&™38?IiR˜Y÷^jbÞcNcº`1\ËU¨MòCÝ8 ,|µ’\õ^çÞÙ%ÍrÁ·®Ä¦F¡³œŽœŸl£¶©¿±_»aÆÒ©ßjíŒûÆ ÍY%$2ì=rH‚QìX‰^e¾f*fƒcØ^AXàOàEu:Û-S "“ñôˆæ£Ø‰Ë€¿Ä´«¤mžÄš(™¢™/œÁ B§¯~¹ÚÄjÑëÞí¨ûO À±&Ú3ö?ÇJT¬[ja.eæfˆfd_4YüP GÓ;P/×!® vöþçÚÌÌžÀ¹µV¬¤¤Ìžìš™Z™°› _¦€®G¸ƒÃùÏg݉ëúÀ>C%†2Ä>½I7S[ô`ïdàf»fd>`ZÿQMH$=¾0\#B¹øé€Û0ÎâÁ×¶G­d¥WŸ?›2™9™V›|Ÿ—¥†­!·6‹ÎàÛñésø¢¶#1n=ŒH1R-ZU`‰d´fËfÍdÄ`ÆZñRoIp>-2æ$áe¾ù7ëÝ·ÏLø`®L¦  ¸›n™9™›Ÿâ¤›¬¶ìÀÍQÚJè¾öbê "y/ò;4GQ1Y_þcff¼fýd3aq[ÕSˆJ¸?ž3y&" ‚ûûìÖÞ^ÑØÄ„¹ž¯Y§à TœÌ™V™ôšžž@¤¾«ð´§¿«Ë¾Øœæýô—F Ç-Z:¿EºOX¬^Vcýe“fea \¬T–Kù@ 5 (<æ RýÌî àÓwÆ»ñ°{¨Ë¡=š†™ášIž«£ëªä³g¾>Ê*×ëä7óÅIy ,·8>DbNñV¼]¢b‰eaf'eáaŸ\~U£L:Bz6¡)ð® 'ÿ£ðpâ×ÔÈ…¼K²¤©½¢¹²š¸™Ñšõ£ªÖ²$½ÍÈ“Õ4ãkñíÿo¦H*7·BMÇUÊ\ìae.f8e5b6]TV²M~Cí7:+¨|òEäšÖÇÉ ¾§³Ïª¯£nž'›ë™¿š ¢B©Æ±à»ZÇúÓ}áŸïþ” Ó†(g53A­KžTÙ[8aŸdýeJe‹bÍ](WÁNÁD]9Ð,[DÔUôæVØhË‹¿ü´ñ«›¤Ÿ—›šªšIç¡m¨¹°ŸºíÅhÒÏßÝíHüÇ Ó&Î3½?bJ…S÷Z’`8dÖeeeçbg^ÿWÎOFÇ:^.!ÿ˜öÍçþÙõÌôÀ:¶ÿ¬q¥¹Ÿô›6š‡šæœG¡“§©¯`¹„ÄÞÐ+Þ(ìŒú ]6%M2`>0I„R-Z`åcÃe‘eQc_ÞXáPAG0<æ/¤"®MË÷sé‘ÛjÎEÂ`·ó­/¦= <œ?šRštœš ¯¦“®¸ÃXÏÜêÞøcÁ¯#ä0=HQ{YŠ_©cÄeÏeÊcÀ_ÅYùQƒH•=h1:$Pòjùë ÝÇÏ|Ãk¸Í®Ô¦© lœ3š šó›âŸÃ¥y­Û¶¸ÁÙÍþÚäèB÷Í;@"”/ò;GÐPäX+_…cÛe fTd€`·ZSÈIú>å2È%æˆ øúìoÞ ÑšÄ]¹¯^§û …œš°™a›ŸÍ¤W¬”µSÀ]ÌsÙRç±õFÆå Y.Þ:2FPcXâ^ucf‚fídKa±[;TK_@`4P't yüðíÄß?Ò¦Å<º;°Ø§>¡œã™I™ÅšMžÐ£2«L´ð¾åÊî×Èå*ôË]–,-Ø9YErOðW¥^pc7fìf‹eb®\`UWLÁAÕ5Ò(ú• ïýSï áfӦƻްF¨v¡œ­™Ý˜$š|Ó¢ ª³½rÉoÖEä¬òXþR ,Ü8‰DÓN„Wp^rcpfZg-fíb¬]…VœM CH7P*|aÿ²ðQâ‰Ô£Çà»~±³¨­¡œv™q˜…™¬œ×¡ë¨Ã±1¼ÈñÔÃâ-ñäÿ â*Û7³C-NW2^jcžf¿gÅf¶c¡^¡WÚNyDµ8Ê+ü‘Õò›ãµÕ©È¼¼,²0©õ¡¢œS™˜ù˜ð›î Û§°âºœÆÓJáµïuþ= Á¶)Ò6ÓByMVá]Nc·f hDgdd|_£XÿO»E :0-iÿ<móÞäÜ֯ɜ½á²µ©J¢ÄœA™Ô—ƒ˜K› ä¦w¯®¹QÅ&ÒèßRîýî ‡–(Ó5ùAÈL V]+cÇfMhµgeE`“YQçFN;. X³ôæõרÊp¾Œ³4ªš¢äœ0™’—˜®šXŸø¥l®‡¸ÄÜЗÞíÍû° \…'á4+A#LUA]cÙfŽh%hžeazZRH‚<Â/ "¡Ñçõ2çüØ‘Ë6¿+´©ªâ¢þœ™Q—¥—š›ž¥o­r·î§Ï\ÝÅë˜ú‡ D„&ý3g@„KUó\ëbâfÂhƒh%f´aH[S I=ì0=#Ø÷Qè Ú…Ì Àá´;«M£@4™>—g—°™ žd¤˜¬|¶ßÁ„Î*ÜŠêYùK`%í2q?¬JcTd\…b§f´h¡hof*bç[ÇSôI¡> 2n$L[ø“é?ÛªÍÁÒµ ¬÷£Á‰™f—a—{™©Ö£á« µáÀjÍùÚHé øúÃ$¶1P>¦I~S¤[îaÌ ÿ_ðüá6ÔRÇ–»<±|¨¡qœf™o˜’™Èœ¢!©²{¼QÈGÕã…ñ9ìR+ 8×CANW%^Mcqf‚gzf_c?^7WkNDD8\+“1Îñeã՗Ⱦ¼B²Z©3¢òœ³™‡˜t™uœz¡i¨±m» ÇùÓ¶áð¾þr à½)Â6ªB9M7Vw]Ñb+fsg¢f½cÓ^ýW_O%E…9º,³ TóáäúÖèÉï½L³7ªß¢jô™˜C™ œÚ –§°BºÑÅŽÒ6àƒî+ýâ \L(l5wA/L\UÎ\_bñetgÞf2d_ÜXmP]Fß:1.’ J¤êôjænØ?Ë!¿T´«‚£Õ$š„˜ü˜Š›" ª¦¯þ¸jÄ Ñ¡Þãì‰ûF Ï×&4G@+K‰T2\üaËeŠg0g¿dD`ÕY•Q­GR<½/1"óM‹öúçæÙ–ÌQÀUµÝ«¤0žBšd˜ ˜óšRŸ§¥Ð­£·îÂvÏúÜ4ëÛù¡;]%¾2?,J¿S [¦a³e°g“g]eaßZÍR IÓ=W1Û#¤ý2øŽé^ÛìÍ}ÁR¶¤¬¦¤‚žWš;˜9˜Ršyž›¤–¬C¶nÁÞÍRÛ…é-øþ¬é#m1ñ=4IüR[Wa eÛgúgÿeòaê[TkJO?ê2}%M¤ÎùëËÜ6ÏžÂD·b­,¥Îžgš˜Ò—±™¤”£d«ë´ø¿R̸Ùåçöl,…"*0×RhH=’0#Õ0l÷Öè¸Ú]Í Áüµo¬”¤”žŽš•˜µ˜íš0Ÿi¥x­2·eÂÖÎFÜnêùÀRo$Ï1+>DIáRÐZè` eggeà`ÆZÖR:I">È1n$WÍùêrÜϩ‚·Ó­Ï¥žŸb›/™™› Ÿ¥Ó¬Q¶MÁÍÒÚ×èS÷ü…£" 0}<´GvQ’YÞ_8d‹fËföda>[ŽS-JL?#3ò%ü‹ èú`ì?ÞÌÐOĹ0¯û¦• œ«™K™›Àžx¤ ¬QµÀ.ÌNÙ6çŸõ>Æí h.ó:LF9P…X_›c,fªfera×[`T3K@€4o'’0 ”ü îÞßXÒÀÅUºS°ï§T¡£œö™Z™ÓšXž×£5«J´ç¾×ÊÚ×­å ô¢.añ,˜9E*O¦WZ^&cîe§fJeáa{\6U7L¬AÍ5×( ¶ þŽïTáºÓÇw»N±¼¨ï¡ &šS™”šä1£_ªJ³Ã½“É~ÖAä“ò,¾ÿ¤+g8DDNëVÐ]ÎbÌe¹f‘eZb%] V5MÎB 7**o ‡ÿñð¨âøÔ'Èw¼&²h©l¢U?š8™Fšeƒ¢‡©K²£¼XÈ/Õãâ/ñÉÿc³n*N7CsMFVY]ˆb¸e×fâeÛbÓ]åV3NìCC8w+É€çHòñã+Ö>Én½ö²ªä¢Uš™ú™èœÙ¡³¨R±‰»$ÇæÓáÒïkþ j:)46BŸL›UÛ\9bšeëf&fOcu^°W$OþDq9º,ÚBžó;åb×\Êl¾Ñ³Àªk£ö}š™À™œC¡ò§k°€ºþÅ©Ò@à{îý¶ (5A»KÞTI\ÔadeæfRfªcþ^dXPýEŽ:ð-c /œöôŠæ£Ø‡Ë|¿À´‹« ¤jžÃš*™¦™5œÊ M§œ¯¹ëÄ{ÑýÞ*í¸û\ ˸&Ý3ó?¾JT—[Na e¾fZfãcf_ùX¿PãF–;/Ÿ!{òPöáçïÙÃÌ¡Àȵq¬Ì¤Ÿ,›c™®™ œr Ç¦ë®´¸îÃ`ÐÉÝãëdú sh%›2Ç>­ISÌZ¬`—dwfDfþc±_sYfQ²G‹<*0Ï"ÀE«÷<éDÛ ÎÕÁâ¶k­¡¥­Ÿ¬›´™Î™û›0 U¦K®é·üÂLϙܜêù¤ $L1Š=ŠHRíYö_ dffdî_âYR|H}=?1$ ¡ù¥ê¨ÜcÏøy®Š¦l =œšý™ö›÷Ÿé¥¯­· Â5ÎbÛLé¬÷7¡ "ê/;Z2=%_ „úìÞÌÐqÄL¹–¯§8¡Úœš2šö›ÀŸ~¥­R¶ÁÍ"Úòç?ö¾$'!}.á:FÚOXb^ØbMeµe d^`»ZBSJp?3‚&¿{ üí˜ß<ÒÍÅŒºµ°x¨¢säšašî›Ÿ ¥h¬yµ ÀëËרæÊô?¢ª-‡9ÖDÀNWž]Ebïded¥`7[ñSøJz@®4Ð'$ñ €ýïá¦Ó!ÇûDZa©¼¢ü7›~šÓ›0Ÿ‚¤°«’´ü¾·Ê‡×(åTóÂ'8¬+>8¬CºM6Vò\Ìa«d€eFdaË[¶TéK’Aç5%)f úþ’ð{âýÔ^Èß¼¼²+ªV£bžh›yš—›¿žß£Þª–³Ú½vÉ-Ö½ãßñL·Ö_* 7BÔL}Uj\xad˜e”d†a~\–UòL¿B17„*ûÛnþñÖãAÖƒÉཔ³ÔªÍ£¥žv›Pš:›/ž£ñ©‚²¥¼&ÈÉÔMâkðÛþQ ‚%)ó5©A LãT\EadÏeÿd#bJ]ŒVNùC„8é+jLÚ]ó!åpבÊǾO´_«&¤Éžd› šÀš„H¢ñ¨_±e»ÐÆdÓßàþîtýù A(ñ4Ð@_KgTº[1a°d$f‡eÚb-^–W9O@Eß9R-ع<¯ô[æŒØˆË•¿î´Í«a¤Ïž6›¨™,šÁœY¡Ý§+°ºnÅ÷Ñnßíü© ê&4 @ÇJTˆ[5aéd‘f&f¨c%_´XvP–FG;Ä.M!)¡ÿõ‘ç¡ÙwÌWÀµ.¬Œ¤Åžöš3™†™ì›Z ¸¦ç®º¸Ä~ÐôÝìªúV ÒÓ%3G?6J¤S`[Ca-e gÒfƒd+`ßYÁQùG¼œI?S3[Oaqe†g‚gee:a[SlIB>Ô1c$4’Çø êëÛoÎôÁº¶ü¬ë¤³žsšA˜*˜-šAžP¤;¬ÙµøÀ_ÍÍÚýè¥÷y-t#1•=éHÂRïZEa¢eñg$he2Ù$ŽÏèø&êÖÛBαÁc¶”¬v¤3žì™¶—ž—£™»Ñ£Å«nµ™À Í‰ÚÆè|÷^p# 1¤=ÿHÞR[haÇehIh^fabe\ŠTùJã?‚3&å9 \úžëJݪÏÞ·®­i¥ûž„š˜Ï—ž™€b£$«´ž¿ìËIÙmçöè¥ü!¢/Q<ÇGÈQ Z¥`4e¶ghjf¢bÛ\3UÐKå@©4\'C¨ Õûí¿ÞÑXÄԸ®U¦¹Ÿ›u˜ò—‹™7ã¢sª¾³”¾¾Êü× æœôk'… :.ÿ:’F·P9Yë_­ddgh…fôbb]ìU¸LöAß5°(®! Vý™î7àyҨźί7§l ‘›¿˜˜f™ÛœS¢°©Í²{½É¢Öšäóè¦Õ,´9gE²O_XB_7d%gûg¶f\cÿ]ºV³MC$7*"¢ Ûþð¬áÛÓïÆ*»Ë°¨ ¡û›ò˜ÿ—(™gœª¡Ö¨Ç±M¼3È:Õãšñ`$™v+p8GD»N—W­^Øcýf hÿfÜc³^ŸWÅNQD{8€+¤-g ñ"ã:Õ0ÈG¼½±É¨™¡Sœ™æ—Ö˜Þ›ì è§®°»ÕÆÄÓ™á ðÑþ #*17,CÌMØV"^„câf*hVgjdu_‘XáO“EÜ9ø,+¼ö&ó˜ä˜ÖnÉ_½ª²†©"¢¤œ*™Æ—~˜O›* ÷¦‘¯Í¹uÅMÒà~îDý ¯»(ô5BáLV›]3cÉfIh­g÷d5`€YûPÑF8;k.® F€§ô æñשÊu¾–³Bª«¢øœG™ª—+˜ÆšoŸ ¦}®”¸ÄßÐ•Þøì¾ûš @c'¹4ÿ@óK]U ]Úb¦f^høgweè`bZRH‡<Ò/%"Ç"övçIÙåË¿‡´«?£Xq™Ÿ—é—PšÇž6¥|­n·ÙÂÏ%Ý~ëAú" Ô &|3â?ýJ“Tr\qbrf_h/hâe…a.[ýRIÄ=)1#<{™÷âè£Ú&ͱÀ„µÙ«ã£Ë±™©—¿—ñ™5žu¤¬Z¶¤Á0Î¿Û êÈøªe«$42·>õI´SÀ[ða$fFhKh3f bâ[ßS)Jò>t2ñ$¯÷ùXê ÜyÎèÁš¶È¬¦¤^žšÔ—´—±™ÁΣº«Zµ~ÀëÌ`Ú™èJ÷)ç9#Ô0q=ÏH³RêZIa¯ehAh`fkbx\¥TK @²3K&u šúÜë‡ÝåÏ=Ãзڭ¥Ÿšš)˜Ò—˜™rJ£«t´n¿µË Ù,çÍõ¢^¶!^/<ŠG‘QðY}`e ghhfªbî\OUöKAà4›'ˆò #üiíßcѨÄ!¹ ¯—¦ôŸD›ž˜˜Ÿ™@á¢dª£³n¾ÊÀ×ÄåOôÌ& Ø-œ:0FVPÜX•_^dgÇgUfÑbM]åUÀL B6ä(ðq ²ýï¦àïÒ#Æ„ºM°´§æ œ*™e˜¹™ ‡¢Ó©Þ²x½jÉxÖ\äÎò…3G,9ÇDOºWŸ^™cŽfpg9fïb¥]vV‡MC)70*[õ GÿœðCâ„Ô§Çî»—±×¨Û¡Èœ·™¹˜Ò™ýœ)¢;©²w¼=È#ÕçâBñèÿé­*”7ZCÂM—V«]Ùbf#g)fc^WcNDf8“+ßñNòòã(Ö7Éb½ç²ü©Ï¢…:šþ˜Ø™Äœ²¡ˆ¨#±W»ïÆ®ÓSá–ï-þÎ -þ(ú5ÞAmLpU·\b‰eåf,fac”^ÝW^OEEÄ9-„L»ôºåáרÊâ¾>´#«À£:ž¯š2™È™qœ¡µ§°º~ÅÒßÊíVüõ \>'V4^@KOTÐ[va"eÃfPfÊc@_ÈX…P FM;Ç.N!) ÿõ’ç£Ù{Ì]Àе7¬—¤Ðž›=™Ž™ñ›[ µ¦Þ®«¸êÃ`ÐÎÝíëtú މ%Â2ô>áINS [ñ`ádÅf•fQd`ÇY·QHÓÙ1‰${øLùÃê§ÜCÏܲ·ÿ­õ¥¿Ÿ|›B™™› Ÿ¥Î¬K¶FÁ‡ÍÎÚÖèV÷’µ"%0š<ÕGœQ»Y`bd´fðfe0aQ[—S,J@? 3Í%ËN  úìãÝiÐçܸĮ’¦0 À›X™™Éššže¤ ¬fµEÀnÌ¢ÙžçöÇ]!/ž;÷FßP#Y˜_dšfgTe—aß[JTÿJ/@4æ&ðy Ëû3íýÞrÑÚÄt¹}¯(§  œw™û˜•š?žä£g«¢´d¿v˘؈æûô§A{ .¯:!F&P‹X#_Îcrfg{eåaS\áT¶KAü4ä'ü ãüIî àsÒÉÅLº:°Æ§¡aœª™™zšý}£Þªù³ž¾—ʥׄåíó•.o -¾9EEcOåWž^lc5fëf‹eb­\_UUL¿AÓ5Ð(ú— ôý[ïáxÓ¾Æ/»±u¨¬¡Íœò™)™všÒ,£iªa³ç½Åɼֈääò‚\,À8YDŽN+W^óbáe¾f…e5AK‡TÈ[-a™düeNe’b×]5WÏNÑDn9á,lTãcôæcØtË•¿µû«¤¤'Ÿ ›"š´šTó¡y¨Æ°­ºûÅvÒÜßêíTüÑ Ù&Ò3¾?_J~SíZ„`&dÁeMeÌbJ^àW®OßE§:>.æ ä€ö¾çõÙñÌ÷ÀC¶ ­†¥ÓŸœZš¯št¡Á§×¯Œ¹¯ÄÑMÞEì¢ú e5%D2O>IcRZÓ_²c‹eWecÒ^¤XªPG<À/‡"šCÌ÷é§Û‹Îp”·0®s¦‡ ‰œš¢šÂœå õ¦Ñ®S¸GÃwϡ܃êÔøJšz#£0Ï<ÀG=QY _>cYegehcf_vY¶QOHq=U19$b¡ùMëdÝ/ÐñÃë¸T¯`§7¡ùœ¼šŒšjœL ¦À­·ÕÁßÍìÚºè÷tÍ¿!/R;nFP.Xv^Ôb2eƒeÇc`SZËR—Iæ>î2ï%*é tûíßÉÑgÅ5ºl°@¨Ú¡\Ýšjšœ¨Ÿ=¥¨¬Äµ`ÀGÌ9Ùõæ2õ¨  p-ä9,EOWWÚ]xbeªe/d¬`3[ãSßJW@4›'ç­ 7ýÎî¿àQÓÊÆl»r±©m¢±òš@š›Ÿ^¤•«ƒ´÷¾½Ê˜×Då{óób{÷+8DN”VR]+beÙešdQa\ðTL¶Aþ5.)‰T ÚþeðAâ¶Ô È„¼Z²Â©é¢òøš š-›[žƒ£ŒªO³¡½KÉÖ²ãåñcÞ ¥*a7þB@MñUå\÷a efeûaê\øUGMCg7©* ÚY×ñãöÕ(Éw½³UªG£žéšÄ™²š­§¢…©%²X¼ëÇ¢Ô:âmðòþ| Áw)V6B‹LmU”\Ûa'eef‘e­bÉ]þVoNIDÀ8,zF½*óÙä×$ÊJ¾Å³Ëª‹£*žÅšm™)šöœÆ¡~¨ý°»—ÆAÓÕà ï™ý4 ‘e(h5VAñKU\\ÖaUeÅf!fjc®^X—OŠE:m-ܤkôæØ Ë¿U´,«º£'žš™“™4œÜ q§Ò¯Ô¹CÅãÑtß®íHüõ k^'„4›@dK¥T/\ÜaŒe.g¸f-d™_YÃPÍFg;Ë.=!b«õ)ç(ÙïËĿ洎«ë£&ž]š£˜™w›÷Ÿi¦¬®–¸ôÉÐÞSì÷ú¶ CR&œ3Ú?ÌJgÞdr`ZÝQÿG«<0’"T¬æöOè2ÚÚÌŠÀƒµþ«.¤:žAšY˜Š˜Õš.Ÿ}¥¢­t·¾ÂGÏÍÜ ë¶ù‚"K%²2?,JÅSª[´aÃeÂg¦goe*aìZÕRIÐ=N1Ì#ãøjé7ÛÃÍSÁ)¶~¬„¤ežAš.˜5˜Xš‹ž¸¤¿¬v¶¬Á&΢ÛÜ鉸] F$Å1B>|I8SC[ua­eÔgàgÑe°a•[SóIÉ>Y2ã$®/ù~ê<ܵÎ.Âè¶­¥Àžwš=˜˜š(ž2¤¬´µÐÀ4Í ÚÎèt÷Fø<#Ê0Y=ªH‚R¬Za\eªgÝgôeûa\0T§Jš?C3â%½ Lú›ëSÝÀÏ'ÃË·å­«¥EŸÖšt˜,˜šäÇ£‡«ÿ´ü¿EÌšÙ·çQöÏ"³/T<¼G¯QúYq`ôdjgÇg f:bm\¿TZKn@34ê&×C zûÉì|ÞÝÐ3ÄÀ¸¿®d¦ÛŸE›º˜G˜ï™©a£ûªM´(¿Tˑؚæ'õìì .B;ÀFÏP:YÕ_~dg§gfqbÎ\JU LAA%5õ'öq °üî±ßÒNÅŹ©¯/§ Ä›™q˜í™z£vª¡³X¾dʆ×zåöó±^°\-:°EÙOcX!_òc»fpg f”b]ÄU®L B6û(¡ ìýCïñàAÓzÆÞº©°¨B¡^œ€™·˜šeÅ¢ ª ³œ½…ɉÖcäÌòzp",î8“DÓNyWY^Nc@fgæebS]%V8MºBã6ï)!à ÿ|ð-âyÔ§Çû»°±ý¨ ¢š ™0šd—¢°©ˆ²ò¼¸ÈÕ]ã±ñOë9î*Ä7xCÎMŽV]¦b¿eÇfºeœb~]{V¸MaC­7Ø*%ÛE®ñaãªÕÐȽ´²æ©×¢­šd™\šck¢X©²K¼ídzÔXâ—ð&ÿ¹ ¼)œ6_BÊL¥UÄ\b@erfežb­]ÖVÅ£Ñ÷Þ÷ìYûÓ ã%ç2ã>˜IÏRYZ `Ïc‹e9eÙbx^.XPgFG;ô.­!¸]çö èÓÚÇÍ¿Áû¶²­¦I nœ˜šÐšZ¡Š§†¯"¹.ÄpШݒëæùY r$†1š=mHÉQ}Y`_TcFe*ec×^ÁXßPZGc<30 #+Þoø&êOÜ2ÏÃ.¸¿®õ¦ù êœÝšÜšèœõ ï¦·®$¸Ã#Ï>ÜêWøÄ é"0=<2G¶P—X¬^×bee1cA_cY¶QaH•=Š1$¶xúÄëâݲÐwÄq¹Ù¯à§±¡j#›æš¶œˆ I¦Û­·ÍÁÅÍÁÚ~èµöhO!‰.Ò:êE˜O¨Wò]Ubºdedc°_ Z•RrIÓ>í2&O »ûmí€ß;Òäźºø°Ï¨j¢êg›íš€œ ¥ù¬¶À_Ì=Ùäæ õo¿²-g9¤D|N¾V=]Úa{deŸc'`¼Z{SŠJ@U4†'éÆ fýïá¿ÓJÇû» ²³©£^žŸ›éš>œ™Ÿç¤¬è´G¿õÊ·×Jågóƃ+8jCnMáU—\maJdeèc«`x[kT©K^AÀ5 )‚j ÿ³ð©â7Õ£È.½³‡ª¶£ÃžÉ›Öšð›Ÿ'¤«Ç³þ½‹É3Ö´ãÇñ%‚”*¶6>BpLU\a'd7e:d6a9\_UÉL¥B'7Œ*¥Dò*ä ÖìÉP¾ ´L«F¤Ÿç›ºšš›ƒžf£)ª©²»¼*ȺÔ+â7ð–þü µ(x5'A„KYTy[¾`dWe’dÄaú\NVâMâC‚8ü+’‰*¿ó“åñ×Ë]¿ë´þ«Å¤eŸú›–š@›õ¦¢<©”±ƒ»ÖÆRÓµà¼îýŒ Ào'Q4$@«J¯S[{`d~eîdSb¹]8WóNEÏ9]-ÿüš&õéæ.Ù=ÌXÀ¼µ¢¬8¥¥Ÿœnšåšhë¡V¨‰°WºÅøÑOßQí³û, q7&73.?ÝI SŽZ9`òc£eFeÚbn^X÷O8F ;®.^!_üö3èbÚTÍLÁжE­­¥êŸœOš”šèœ>¡€§Ž¯=¹[İÐúÝõëXúÙ-%#2;>IiRZò_Úc½eeSc_åXéPJG8<î/«"³PÌ÷réÛeÎ>ÂW·ê­&¦4 4œ:šOšuœŸ ¹¦¢®1¸6Ãvϲܦê ùðß#1J=BHÄQY¥_½cÐeÒeÃc¯_ªYÔQUH^=(1ó#¡ù±ê¸ÜwÏ1Ã'¸‘®¢¦‚ Rœ'š šœ ð¥³­"· Â5ÎcÛNé°÷<©«"ú/Ot2O%h xúìøÝÐ6ĹF¯(§× sœšÅ™‰›VŸ¥²¬ýµÇÀÚÌöÙØç8öËE\!Æ.>;ƒFZP‘Xý^}cøecf»da^[ÚS£Jé?ã3Ï&ò“ ýû{íXßßÑTÅù¹°¶§.¡‘œ÷™n™ùšž ¤Œ«¯´Y¿RË]Ø6æ–ô1»ëu-:†EOþW¤^`cf¿fQeÖa_\ UûKbAv5t(¡C ¥ýïÙà@ÓÆ»å°\¨š¡Âœë™&™všÕ1£mªf³ì½Èɾ։äãò[,Ã8^D—N9W^ cfåf´esb4]V1MÁBö6*Mù ]ÿÄðzâÉÔøÇJ¼û±@©G¢3 š™/šQr¢x©>²˜¼NÈ%ÕÚâ&ñ¿ÿY¨c*B7CgM;VO]€b³eÖfåeãbá]ùVNN Dl8§+½*ò<äy֌ɻ½@³Tª$£Õ‚š>™šîœÐ¡™¨(±N»ÙÆ‹Ó#á[ïéý‚ Ú¦(Ÿ5ƒALUe\ÒaEe«fþe@c^ÕWeOYEæ9G-¾‘qôæ@Ø9ËC¿´~«¤‡žóšj™õ™œ.¡¸§ °û¹VÅáÑ[ß~íü˜ ø×&í3õ?²JìSt[!aØd„ff¦c*_ÁXP·Fs;ü.‘!xúcöýçÚïÌÓÀþµ¨¬¥3ŸY›‰™Ì™ œy Á¦×®’¸¾Ã#ЀÝë ú¡ %72h>VIÈRŽZ~`{dofQf!dê_ÂYÊQ)H=À0p#iòXøäéãÛÎWÂO·À­Û¥ÉŸ©›‘™‹™˜›®Ÿ¶¥“­·Â^΢ۢéøµ1@#˜0ô<HÂQÆYú_=dxf¡fµdÀ`ÕZS£Iµ>‚2H%LØ5ú¯ë’Ý'дÃy¸°®Œ¦7 Ò›u™+™öšÍžœ¤D¬Ÿµ}À£ÌÕÙÍçCöì}©!'/±;GìP/Y¤_)d§fgdeªaõ[cTKM@14'— æûJíß}ÑÜÄm¹k¯ §x Ô›7™¯˜?šß|£úª1´ñ¾Ë*Ø æôUýI î-¥:-FIPÅXu_6dðf“gf•b ]¢U{LÅAº5—(¡ _ý«îPà™ÒÌÅ-ºø¯b§— »›ç˜*˜‰™ûœp¢Ë©æ²‘½–É·Ö®ä4óý½'ð,Ð9„EÑOXb_WdBghÌfmc ^½V­M C 7ë)òg –þËïTá{Ó‰ÆÁº`°›§¢ ˜›—˜°—æ˜4œ‰¡È¨Î±j¼eÈ‚Õ}ã òå¹=$,&9EtOKXX_vdŠg„h^g dÙ^¥W©ND8+s”ÿ¸ð*â6Ô&Ç=»¹°Ð§² ƒ›^˜T—i˜™›Ô ý§ð°~»pljԅâñüÿßvs+8…DOX<_{d°gÉhÂgŸdq_SXiOãDö8á+çRm…ñéâãԾǽ»±¨Þ ‘›O˜'— ˜6›W j§J°Èº®Æ¾Ó´áHð.ÿ¸Ä*ñ7ûC¤N´Wü^Vd§gÜhñgédÔ_ÍXùO…E¨9ž,­9Oò¬ãœÕiÈW¼¥±Š¨6¡Ï›q˜-— ˜›  §Ë¯3ºÆÓðà{ï\þD èú)27KCN*WŠ^þcjg½hðge`&YmPFL:V-vó2óä{Ö@É!½^²/©Ä¡BœÆ˜c— ˜øšÝŸµ¦^¯¨¹`ÅHÒà˜îlýM î)A6eB1MjVã]tcgthÊge4`oYÙP Fù: .W è@ô¡å×KÊ ¾L³ª€¢ßœA™¹—O˜þšºŸj¦ë®¹¦ÄoÑ)ßíQü' ÂØ'5OA.L€U]Éb{fh™ge\`ÄYYQIGÇ;/d! QõçæÐ؆ËK¿b´«Y£’Ê™˜{˜úš†Ÿ¦X®Q¸¿ÃdÐÞLìþúÊ b{&Ì3@KyT4\bñeÀgtge¡`;ZR!HÉ<60©"iÀùöbèEÚìÌÀ–µ¬B¤MžSšh˜—˜Þš1Ÿz¥™­b·¤Â$Ï¡ÜÕêwù:Òó$U2±>ÉIaSI[Wametgdg;eaÙZÕR$Iø=‹1$õZšøêØÛlÎÂØ¶*­*¥ŸÎš¨˜š˜¤š¼žË¤´¬L¶bÁ½ÍÛ;éÐ÷,[#Ó0M=ŠHORiZ¯`ÿdDgqg†eaš[ÌSLJK?3¯%š KúªërÝíÏaø2®ý¥›Ÿ,›È˜{˜Fš!žø£««µÀ:Ì€ÙçöÙ€Â!V/ô;[GQQ¢Y"`¯d3g gôe7b}\äT’K¸@4U'OÅ üVí ßgѶÄ8¹)¯½¦ r›Î˜B˜Ï™n £ŒªÇ³¾§ÊÖ×Õå\ô Ô, Ý-¡:5F^PæX¡_ld/gÛgmfìbi]VÝL*B6û(~ ¸ýþîœàÜÒÆ\º°y§¡ ¸›Ö˜ ˜\™Áœ)¢w©†²'½"É;Ö,ä®òu5 n,U9EkO'X_ dghÓfŠc=^WNC“7†*œWÿ“ðâEÔOÇ~»±=¨0¡œô˜ð—™5œh¡†¨j±æ»ÃÇÃÔ¤âñäÿ«& +8ïCpN[W€^»cðfhgdæ^àWOªDÝ8ê+¡Ýò–ãªÕšÈ©¼²©Ü¡‰œ;™˜ã˜Ü›Ü Ê§°ÕºÆrÓ=á§ïeþ+ ¬ž)·6´BVMgV¸]"cŠfÞgg9dT_€XáO¤Eþ9,-oX•óå×úÉð½=³ª²¢/­™>˜ê˜«›v 0§¶¯Ý¹oÅ1Òáß6îèüª /,(X5pA4LlUê\…b!f«ggudÆ_&Y·P¦F';u.Ñ „×õæ‹ØTË.¿Y´ «x£Ä šh˜Ü˜g›ûŸ‚¦Ù®Õ¸BÄåÐ|ÞÀìiû) ´À&46@K~T)\öaÇeˆg/gÀdF`ØY™Q²GX<Ä/9"ýY™ö è÷ÙªÌgÀnµø«6¤Pžeš‰˜Å˜›xŸÌ¥ó­Ä· ÃÏÝCëâù¡4N%¦2÷>JSg[fameegEgeÊ`‘Z‚RÇH“= 1®#ƒé+ø–éuÛβÁ•¶õ¬¥ëžÉš´˜¶˜Ñšøž¥ ­®¶ÍÁ/Γ۳éGø™À#-1›=ÉH}R†Z¹`÷d)gDgHe?a>[dSÙIÐ>‚2.%Ž×ù@ëÝžÏ$Ãå·®ü¥¯ŸV›™Ì˜ªš”žx¤6¬¦µ—ÀÐÌÚè›öMã"/XÕ^c(f¾f?e³a-\ÊT°K A5(Aå MýÃî“àÓeÆïºß°i¨»¡õœ1š|™ÛšGž¬£ðªì³r¾KÊ:×ûäHóÕX†,½8?D_NèV®]ŽbneAfe·as\OUrLBJ6s)Ɖ ÿðcâÓÔ$È—¼h²Í©ñ¢÷úš š)›Sžw£zª9³„½(ÉæÕãªñ·G*û6‘BÍL{Um\a—d¦e¥dœa˜\µUMèB_7¹*6¶Mò,äœÖäÉE¾ü³=«7¤ ŸÚ›¯š›{ž_£#ª£²´¼!ȯÔâ$ð}þÝ øˆ(D5ê@@KT)[j`¶cþd9dma¨\V¡M¬CY8ã+Š“HòóÛåLØËÞ¿|µž¬p¥ ´œQ›ù›§žN£Ö©²ö»/ÇÓÔà»îúüH [é&­3d?ÑI¿RZm_ëbhdÜcJaÀ\UV*NkDI9þ,Ëó¿xõiçÚÙÍQÁ×¶Ù­…¦¡kÔ›Eœ»ž*£z©Š±1»=ÆtÒ–ßaí‹ûÌ Ùk%92>‹HšQY›^Ibúc¤cIaõ\ÀVÈN8EB:. !K)ìößèJÛtΠ ¸é®m§½¡ö,œhœ¨žá¢þ¨Ý°Wº:ÅNÑTÞì$ú^m$å0Æe‘fÏeýb)^lWéNÌDI9œ,ÑB¨óLå{×{ʾù³ìª˜£#ž«š@™ê™§œg¡¨ˆ°™ºÆ»ÒNà†îý½ $(5A¿KãTN\ÚakeífYf±c_iXPüEŠ:è-W „ÙôfæxØWËG¿†´L«Ê£&žšæ˜d™÷›’ §v¯q¹ÛÄxÑßDíâû– 'A4d@:K‰T"\Ýa›eKgâfbdÚ__YQ$GÁ;(/™![·ûõrçgÙ$Ìž«ï£žGš˜Ô˜?›¶Ÿ ¦^®D¸ŸÃ5ÐÃÝì­ús "&v3À?ÀJÒ1D$ø9Tø–éKÛ¾Í6Áóµ/¬¤ê³™—ˆ— ™Ìö£ý«¹µ÷À}Í ÛWéøÐ($Å1`>¸I’Sº[bWf”h²h±f›b…\TáJ¯?23«%aœ«ùÚêvÜËγ¶Ä¬„¤žµ™^—&—™ £îª‰´¬¿Ì›Ùàç£ö—mÚ"’0O=ÍHÒR)[¨a,fžhñh%gAcZ]U Lø@—4$'ç) 5û[ìçÝ#ÐXÃÈ·®­?¥¦žšx——¶˜}œH¢ù©h³c¾³ÊØJæõòÎH!/î;G¿QFZù`µebhòhag¹c ^xV#M?B6±(ŒÝ ñüî˜ßÂÑÜÄ)¹å®F¦xŸŸšÓ—$—“˜œ¨¡©W²!½EÉ…Ö›ä?ó%þ€]-O:FjP!Y `eëg¼hngd›^EW*N{Co7D*>§ Éþòïoá‹ÓƺºO°€§} h›]˜k—˜˜Û›&¡\¨X±ë»ÞÇôÔèârñH Š+’8uDôNÚWù^+dVgih`g>d_X$O®DÔ8Ô+òu¨ÙñSãcÕPÈ^¼Ë±Í¨”¡Dœù˜Ä—«˜©›° £§a°»º{ÆdÓ5á¤ïhþ3 º°)Î6ÏBvM‹Vß]Lc·fhIgmd‰_¶XPÛE4:`-¢@…¾ó7å;×ʾI³ª®¢$™™"˜Å˜›A ô¦s¯”¹"ÅàÑßáí“üV Þß'50AüK>UÇ\nbf®g,g“dñ_^YüP÷F‚;Ù.>!öMŽõçÙÄË—¿¹´a«Á£þ8š‚˜ä˜]›ßŸT¦™®„¸âÃvÐÞ<ìÝú— +&p3ª?™JT¾[ša|ePg g±dM`õYËQúG³<10·"ˆï9÷°è ÚRÍ Á ¶¬¾¤ÉžÍšÝ˜™B›‰ŸÅ¥Õ­·ÁÂ/ϛܾêOù‹Ÿ$ô1G>UIçRËZ×`ídøfìfÊd`{Z„RáHÄ=g1 $óiºø1êܼÎ_ÂB·Ÿ­§¥„ŸW›3™%™-›@ŸI¥(­µ¶¾Á ÎYÛféè÷“7#›0=-HàQëY"`gd¢fÉfÚdà`ïZ'S¯I¹>~2<%:ÀúësÝЗÃ`¸®¦5 Û›ˆ™J™ ›ŸÜ¤Ž¬òµÕÀÍ4Ú+èžöAÈé!Y/Ò;GçPYt_ãcLf¢fãdaV[¹SjJ™?3Y&l cûÝìºÞEÑÂÄs¹“¯U§ã _œà™s™›Îžz¤¬;µú¿ÌÙýæ`õú£ .©:FñO@XÅ^^cóewfædKa¶[ETKt@z4p'š? «ü(îà‚Òïʼnº°-¨•¡çœ<š ™›ž¤t«…´¿ËØËåô­.VÛ,v9çDòNdW^Òb”eGfèd|a\ÔTÙKUA~5‘(Ó‰ ÿý€ïWáÍÓ(Ç«»‘±©O¢vœšÐ™›iž¶£áªÆ³6¾üÉÙÖ‹äÌòQÏúŠ+78ÀCêMVS]Cb5efíd´a\mUŸLCB6Á)â bÿæð·â!ÕjÈÓ¼™²ñ©£žõšö™ ›(žB£=ªõ²=½ßÈžÕ:ãkñçÿc•2*õ6šBæL¢U£\Ãaçdf eb]!V€MLC»7 +yOÖXò!ä{Ö¬É÷½™³Çª®£už5›šÝ𯬢w©²"¼¢ÇFÔÍáñïiþè %Õ(²5xAëKÔT\Ya´dfEewb«]ùV„NxD9p,òÓ\Ùó•åÚ×ïÊ¿´Ž«C¤Ôž]›ï™“šE÷¡‘¨ñ°êºKÆÖÒMàhîÞüe ²y't4_@ýJT{[a™d#f›ecl^éWŸO·Ee:ä-u ]åYõç/Ù$Ì%Àqµ?¬À¤Ÿj›Ä™0š¬œ,¡˜§Ï¯¥¹êÄaÑÊÞàìZûí M/&K3^?)JsS [Ï`šd\f f¨cA_ëXÇPGÈ;Z/õ!àbÉö^ènÚ@ÍÁ7¶Ô¬ ¥CŸ\›™µ™ÿ›O ‘¦¢®Z¸‡ÃîÏNÝdëäù†ûû$:2v>oIêR¸Z°`²d©fŒf[d!`ôYóQIH(=È0k#UÐ'ø¦é™ÛGÎ÷Áè¶U­m¥\Ÿ@›.™2™L›pŸŠ¥z­·-†ÎßÛöéø/¼Ø#:1ž=ÂHnRnZ˜`Îdùf g eü`õZSˆI{>)2Ó$½0yùâê¸ÜEÏÏ•·Ó­»¥wŸ)›å˜¸˜¤šž‘¤_¬ßµàÀ*Í|Ú‘è ÷Þ}³"50¾< HãQZo`Öd3gxg¤eÀaá[%T´J¿?33&!’ Ðú)ìéÝYÐÀÃ`¸t®.¦»Ÿ;›Æ˜h˜%šñ»£d«Ä´ª¿ÞË!Ù.ç¼õ+s!/´;%G$QY `¡d.g¤gfKb˜\U·Kâ@¼4„'÷ 5ü‡í:ß—ÑåÄe¹T¯ç¦G ˜›ó˜d˜ï™‹&££ªÛ³¾²ÊÜ×ÕåVôÀ ¹-t:F!P¡XU_dØf€gfŽb ]©U‰LÝAÛ5Ã(Øb ­ýï´àÓDƬº}°ë§"¡Eœn™«˜šfË¢ª³®½šÉ Ö|äçò”9‰:,9¨DæN‹Wi^]cMf*gñe¦b\]-V@MÃBë6÷)*Ë &ÿ…ð5âԯǼµ±ÿ¨ ¢ú™™#šS‚¢—©k²Ò¼•ÈvÕ4ã‡ñ$¿Å*7TC®MtVy]˜b¸eÈfÃe®b˜]žVâM“Cæ7+i$ûñ¯ãöÕÉX½ó²ª£Ò›šs™^šYT¢4©Ö±¼¥Ç`Ôýá5ð¾þM •O)06ùAjLNUw\ÀaeOf}eb½]÷VoNPDÏ8(,sönó)åp׊ʺ¾=´J«¤±žL›ò™©šn2¢Ý¨J±P»ºÆLÓÅàßîQýÑ Ë'¶4Ž@KTg[Ú`WdÌe0eˆbá]SWOEÄ9H-â×qúô¼æÙÌ3Àžµ‹¬)¥ŸŸœxš÷š ¢z¨¯°º¶ÅÒnßhíÃû2 k&&3?¦IËRBZä_–cBeâdxb^¾W§OôE×:‰.K!a­öwè»ÚÂÍÍÁ·å­W¦› Íœ›B›ŒÔ¡¨û¯‘¹“ÄÈÐòÝËë úlŸ\$]1]=HiQYæ^Ñb¼dždvbP^BXjPóF <ï/Ú"܃øRê’ÜŠÏ}ë¸J¯Œ§˜¡›}›‚…¡q§'¯€¸KÃPÏQÜ ê5ø‡·|"/¨;FPÝWî]bHdodŽb¯^åXOQHd=w1‰$ß¿qúAìwÞ[Ñ1Å8º©°´¨„¢9žç›œ›Z¡½¦3®P·æÁ½Í˜Ú5èMö—Éš Á-ü9 E³NÃV]€aôccdÉb0_ªYSRRIÕ>3H&·¦ ^ü(îOàÓÍÆ©»æ±¹©I£»ž$œ’›€ æ¥­¶jÀÌÖØ]æiô²íÐ,t8°CMÙUh\aÒc†d2cÛ_”ZwSªJZ@¼4 (ƒ 9þ÷ïâ´Ô?Èì¼ó²‰ªÚ£ Ÿ.œW›‹œÂŸì¤î«¤´á¾pÊ׎ä–òä.**7…B™L Uï[á`ÝcÔdÀc¦`˜[¯TLãAa6Å)QHõÿ¢ñ˜ã!Ö‚Éþ½Ï³*«=¤,Ÿœûšñ›ïžã£¶ªC³_½ÕÈiÕÛâåð>ÿ› ³<)ð5ŒAÕK–T [Ï`d;e`d}a \âUfMXCì7^+îá‚óôäZ×’ÊÞ¾|´¡«|¤1ŸÛ›ŽšO›žâ¢©ù±û»^ÇçÓWáfïÌý> q(ø4Á@;K/Tn[Ô`Bd©eeJb–]üVžN§DL9Æ,WEØ\ôæaØsË•¿µû«¤¤'Ÿ¡›#š·šYû¡†¨×°ÄºÆ›Ò àî’ü d.',4@ÀJàSL[ß`{d feýbk^îW¨OÄEu:ö-‡ oöhõç:Ù-Ì,ÀvµC¬Ã¤Ÿm›È™6šµœ8¡¨§ã¯¿¹Å„ÑóÞ í‹û d&3?VJ›S-[æ`¨d^ff’c_¹XˆPµFq;ø.‹!oîRöèçûÙÓ̵Àßµ‹¬ç¤ŸK›ƒ™Ñ™1œ˜ ï¦¯à¸Ä’ÐýÝìžú> ¯¥%Ø2?æIJSýZ×`ºd’fTfdª__YDQƒGM<Þ/v"ZÕ1÷ºè¼Ú€ÍJÁZ¶è¬&¥<ŸI›b™™Ò› Z¦i®!¸N÷ÏÝ4ë¹ù_Úß$#2d>`IßR¯Z¨`«d£f…fRd`çYåQ9H=´0V#@¼ø–éŒÛ@ÎöÁî¶b­ƒ¥{Ÿh›_™l™Ž›ºŸÚ¥Ï­n·‡ÂßÎ6ÜGêÊøqò$U1¨=»HTRBZZ`d˜ffds`cZ~RíHá=“1D$9ºùê}Ü"ÏŦ·ÿ­¦ÙŸ£›v™]™Z›bŸ_¥2­´¶²ÁôÍ:Û>é¹÷^âú"[0Â<íG£Q°Yì_5dwf¤f¼dÊ`áZ S¯IÁ>Œ2Q%Uà=ú·ëœÝ3ÐÂʸ٦¦W ù›¡™]™.› ŸÝ¤Š¬çµÄÀêÌÚ è|ö¢Â!2/®;óFÈPúX^_ÔcCfŸfçd$ah[ÓSŠJ¿?ª3ˆ&Ÿ6 ™ûíîÞvÑðÄœ¹µ¯o§ô gœÞ™g™›®žP¤Í«ÿ´µ¿¹ËÌØªæ õ¥+T Ô-f:ÉEÂOX¯^Vcúef eaù[–T|KÛ@ê4ç'½ (ý¢îvàîÒPÆÝºÑ°`¨µ¡ôœ4š„™çšWžÀ£«´’¾oÊa×&åuó‹ºJ,ô8vD•NWà]¼b™egf"eÑa„\YUsLB86W) Z ÏþKðâÔÌÇ:¼²j©¢•œš°™Öš ž7£Gª³m½!ÉðÕšãÖñ\ß´*u7C\MV]b1e;f3eb ]VhM%C†7È*,ùxõñ¼ãÖHÉ–½=³rªc£5ž›Ù™Ãš¹­¢…©²I¼ÔÇ‚Ôâ;ð·þ9 w&)ÿ5ÀA-LU5\aÏdfHenb—]ÙVZNDDÍ8/,¬ŠóOå˜×³Êâ¾c´m«.¤Êž`›ÿ™¯šm*¢Î¨6±6»›Æ*Ó¡àºî-ý­ ò¯'ž4|@ KTk[æ`kdæeRe°b^„W5OLEû9~- šõ׿ÙÌ1À’µt¬ ¥uŸÖ›>š¶š;Á¡/¨d°6ºqÅÜÑ5ß8íû ]$&%3?ÌIýRZ,`æc™e>eÖbn^XPHF";Ë.€!‰-¶öpè¤Ú›Í—Á×¶“­ú¥5 `œšÎšd¡š§š¯;¹KÄÐÊݵë ú|Ó$¥1µ=…HÝQŒYk_ZcFe%eøbÊ^°XÊPBGH<0ë" ¿Pø ê5ÜÏý¸²®í¦ö ìœãšèšøœ ¡§Ó®C¸'ÃGÏbÜ6ê{øæ-#*0SYŒQ4He=X1K$‚EÝù•ë¸ÝŒÐWÄX¹Ç¯×§°¡r4››Ùœ´ }¦®X·ÂÎÛÌè÷h±“!Ç.;FºO¿Wý]Sb«dùd;cz_ÊYHRIs>‡2•%௠LûíßÝÑÅqº¼°¢¨M¢ßn››«œS ë¥W­o¶ÁãÌÉÙvç¢õQ? †-à9EÖNWq]÷a‚dewcç_fZS J…?¶3Ú&4 ªüZîdàÓ«Æl»‘±M©Ê¢+žˆ›îšaœØŸC¥„¬wµí¿¯ËØ æEô¨ýúW,Í8D NgV]¸atd'eÎcn`[íS K¦@ñ4((k þ­ï§á>Ô¸ÇV¼S²â©1£`žŠ›¾šþ›FŸ„¤œ«k´Á¾kÊ+׿äáòH¨·-+Â77CPM×U¡\‹a{dbe;d aä[àT$LÜA?6‡)ø× nÿñîâkÕÅÈ=½³oªŒ£‡ž}›|š‰›Ÿž¯£žªH³½ÉÂÕLãlñØÿEiù)±6MB‘LIUF\ea‹d¨eµd·a¿\åUNM%C 7ú*tUæròDä¦ÖÝÉ-¾Ò³«ê£°žn›6š›òÓ¢–©²4¼¬ÇJÔÊáèïYþÔ ¹(“5WAÉK²Tä[9a—dêe.edb›]íV|NtD9t,ùÜhçó¤åé×þÊ&¿´›«O¤Þže›õ™—šG÷¡¨í°åºDÆÏÒEà`îÖü^ «t'p4\@üJT}[ ažd*f£e cv^ôW©OÁEo:î-} dë]õç0Ù#Ì"Àmµ:¬¹¤Ÿ`›¹™%š¡œ!¡§Ä¯›¹àÄXÑÃÞÚìUûé J-&K3_?*JuS[Ò`žd`ff¬cE_îXËPGÌ;]/ù!ãgÍöcèsÚFÍÁ?¶Ü¬)¥MŸg›Š™Â™ œ\ ¦­®e¸ÃõÏSÝfëäùƒõñ$-2f>[IÓRžZ“`“d‰fkf9dÿ_ÒYÔQ,H=²0Y#IÉ&ø¬é¤ÛZηz­˜¥ŒŸt›f™l™‡›«ŸÄ¥±­J·]¯ÎÜê‘ø9»Í#&1=šHç1™$ `ùÖêºÜUÏìÂÀ· ®ÿ¥ÆŸ›F™ ™› Ÿ¥Î¬L¶HÁŠÍÓÚÝè_÷ Æ"70¯<ìG³QÒY`ydÊfg'e=aY[›S+J9?þ2º%². {úãë´Ý6бÃd¸‹®Y¦øŸ‹›&™Ù˜¢š{žN¤þ«cµKÀ~̾ÙÄçIöŸ×!`/ó;PG9Q~Yñ_rdêfKg“eËa\fT K/@4Ç&Ã= ‚ûÝìœÞÑhÄý¸¯­¦' ’›™”˜:šñ¥£9«…´Z¿˵ظæ>õü¦ð Ž.;;µF¿P&Y¾_edgˆgõeOb«\%UåKAý4Ì'ÍG †ü×í†ßÞÑ%Åž¹„¯ §c ª›ú˜a˜ã™w £‚ª¶³v¾ŠÊµ×±å6ôø« ³-w: F4P¼Xw_Bdg°g@f½b9]ÑU«L÷Aì5È(ÑN ‹ýÕîxà¿ÒñÅPº°‚§¶ Ù›™F˜£™‡¢ß©÷²Ÿ½ É»Ö­ä-óï§ Ê,¡9NE’O9X_dìf½gsfc³]kVcMÈBÓ6Á)Ö[ šþáï{á´ÓÔÆ»Ê°¨'¡&œ,™H˜™Êœ¢N©G²Ó¼»ÈÃÕ¦ãòÙ“ûÇ+°8rDÑN–W”^§c´f¬g‰fRc^ôV N‘C¶7»*ár¸ÿñ•âÄÔÔǼœ±È¨¹¡”œs™g˜t™–œ¼¡Ì¨ ± ¼ÖÇÅÔ”âûð°ÿfÒ§*Ÿ7uCíMÐVñ])c_fgŠf~co^uWµN]D£8Â+¡ò?òÓãúÕüȽ–²£©p¢#Ø™ž˜~™qœh¡K¨ô°7»ßÆ®Ódá·ï_þ zV)[6FBØLÜU"]„bçe9gtf›c½^õWdO8E¥9è,Bû\²óHåi×^Êi¾É³´ª[£âfšù˜£™`œ!¡Î§D°WºÓÅ|ÒàIîÞü‚ êË'Ü4Û@ŠK°T\¯aEeÍfAf¢cÿ^pXPF¼:).§ }óVõñæÙöËì¿/µö«q¤Çž›o™Ü™ZœÝ L§‡¯b¹«Ä'ѕޯì-ûÄ ' &-3C?J^SüZÁ`‘dWf f®cM_þXáP"Gó;/1"$°÷»èÑÚ©Í…Á¦¶C­Ž¥®ŸÁ›Ü™šEœ‡ ¸¦·®\¸sÃÄÏÝë{ùkZ$Œ1¼=¬H#RðYë_ôcöeèeÊc¦_“Y¯Q$H#=å0ª#·SÊøgêsÜ9ÏüÂû·p®¦y Uœ6š&š'œ. %¦ï­a·MÂwΣۋéç÷lÐÈ" 0U>%2%+ÖTúïëóݧÐQÄ1¹¯r§/¡×œƒš<šœÖŸ™¥2­w¶:ÁCÍRÚ%ètöôZ\!±.;BFP)X„^óbbeÂed\`±Z0SÿIN?U3R&‡> ¿ûVíNßðÑÅAºk°3¨Á¡9±š7šÍ›kŸþ¤i¬†µ&ÀÌ ÙÌæõü t-ð9AE*OyW^¢bDe×e[dÕ`Z[TúJk@4Ÿ'ã  !ý±îšà&ÓšÆ8»;±×¨6¢|Áššw›äžI¤Š«‚´¿ÒÊ·×må®ó.¤ÄD,ß8SDeNàV˜]kb@ef½dha\íTL—AÒ5ö(E ƒþðÝáPԥǼ÷±e©“¢§¸š×™›Ež}£–ªj³Ë½…ÉYÖäEòÌN‚+Ù7tC±M[VF]LbUePf9ebñ\íU*M×B(7[*±rèÿ]ñãtÕ¦È÷¼¤²á©Ý¢¼™šƒ™‚š›¢Œ©>²ƒ¼(ÈîÔ•âÕðdÿ÷ Bû)Û6ŸB MåU]?b}e­fÈeÓbÜ]ÿV^N%D‹8Ë+&åP´ò]ä”Ö¡ÉǽE³Qª£Âhš™ê™Èœ¨¡r¨±/»ÀÆ{Óá`ïûý¡ ß(å5ÕAoL}UÐ\Bb¶egif£cØ^!XŸOEù9C-¢\» ô™å®×”ÊŽ¾Ü³³ªE£¸(š¨˜A™ï›¤ H§¹¯Ë¹JÅûÑ›ßãí‹üF ÆÂ'ñ4 AÙKU¦\Obûe–gg‚dã_RYñPìFv;Ë.,!á2mõÞæÑØŽËZ¿u´«r£¬ä™-˜‘˜›—Ÿ¦d®\¸ÈÃmÐ ÞXì ûÜ y—&ï39@8K°Tr\Tb9f hÂg_eí`…ZFR\Hú<\0Á"r·ßö4èÚšÌ8À!µŽ«°£±°™Á—ï—9š’žæ¤­î¶DÂÜÎsÜÃê‚ùdZ%Ø2P?J-T&\Bb`fkhYh)fèaª[‘SÅI{>ë1Y$ F]ø›éMÛ¼Í/Áèµ!¬ ¤Ô™™r—h—}™¦Í£Ó«ŽµËÀPÍÝÚ+éð÷à¬$ª1J>¨I‰S¸[ bcf§hÌhÒfÃb³\ÂTKê?o3é%žÙåùë§ÜöÎBÂ϶֬¤ž«™K— —é˜ßœ×¢³ªI´h¿×ËTÙšç`öW3¦"f0+=³HÂR$[®aœ¢³©"³¾qÊÙ׿Òô˱6!/ó; GÚQlZ(aíe¡h6i©gdV^ÀVgM~B;6ß(¯õ ýüîŠß§ÑµÄö¸¨®¦+ŸLš}—Ë–<˜Ç›Y¡×¨²í¼ÉlÖ‘äDó9#³ž-:lFÍPŠYw`pe[h(iÔgedî^ŠW`N C‚7D*+€ þ§ïá ÓÆ9ºÆ¯ô¦ïŸÝš×—î–&˜x›Ô ¨.±Ø»âÇÕã½ñ§Ž$,19E¡OˆX£_ÏdïgôhÙg£dd_6X>O¬D¶8›+#?ñ§â©Ô‹Ç“»þ°¨Ñ Œ›Q˜/—.˜F›i {§X°Òº²Æ»Óªá5ðÿò Š*³7¹C^NmW¶^djg¨hÇgÍdÇ_ÑXP®Eä9ï,’¾áòIäAÖɽK²(©É¡Rœà˜…—G˜$›  ä¦Š¯Ñ¹„ÅfÒ4à¦îqýI áí($6CB M?V¶]GcÕfMh©gëd"`gYÝP°F;H.‹ &dôøåèרÊ}¾§³\ªÎ¢#x™â—g˜›¯ŸL¦¹®Ì¸OÄÑ³Þ íÄû’ *>'‡4¿@§KU­\rb:fïg‰g e`Z³Q¼GQ<®/"ÊPö¸çŸÙNÌ Àµ›«Ü£ûšB˜ˆ˜åšOŸ­¥à­¼·ÜÏ$Ý`ëúÌc€%Û2-?8JÁS™[•a—e‹geg(eß` Z‹RËH’=1¤#uØøé`ÛýÍÁ¶ã¬ó¤Üž½šª˜¯˜Ìšõž¥ ­²¶ÒÁ5ΚۺéNø ŸÅ#11=ÊH}R„Z¶`òd"gv2#%…Îù9ëÝšÏ!Ãä·®¦´Ÿ]›™×˜¶š¢žˆ¤G¬¸µªÀäÌ'Ú.è±öcù'"£/(¯õ¦{ ð›m™ý˜¥šZž ¤–«Ø´¡¿·ËÜØÌæ>õè}² =.×:@F£î›šV™&š硱¨?±f»ñƤÓ=áuïþœ ó¿(·5˜A&L(Up\ÙaFe¦fñe,cd^²W9O%E«9-vD·ôÁåì×èÊ÷¾W´@«á£`žÙš_™ù™¥œT¡ï§R°Sº½ÅVÒÜßî’ü- l'|4}@.KZTÐ[ia effŠcó^pX!P3FØ:M.Ð ª"…õç9ÙÌÀJµ ¬~¤Íž›f™Í™FœÅ 2§l¯G¹’Äфޥì*ûÉ 4"&K3i?>J’S4[þ`Ðd—fIfécƒ_-YQ>G<‘/'" ŠêözèƒÚOÍ"Á;¶Ò¬¥8ŸM›l™ ™ç›5 t¦„®;¸fÃÌÏ,Ý@ëÁùb××$2S>LIÉR™Z’`–d‘fwfJd`íYòQNH3=Ú0„#u÷UøÚéÒÛ…Î:Â.·œ­¶¥¤Ÿ…›p™o™‚›ŸŸ¯¥•­%·0Â|ÎÈÛÑéMøñq‚#Ü07=VHýQûY'`_df¬f³d°`¸ZéRlIq>32ð$îtÎùHë.ÝÇÏ[Ã)¸l®V¦ ¼›p™8™›þžÞ¤—¬¶éÀÍSÚOèÇöoú"’/fI S[aDe]g]gEe a[SkIL>ê1…$cÎùyêQÜâÎsÂC·­„¥OŸ›Þ˜Ã˜¾šÇžÈ¤¢¬,¶4ÁÍÔÚçèr÷'½æ"Y0Ñ<HÓQðY;`’dßfg7eKaf[¨S8JH?3Ð%ÍO ¡úìçÝoÐïç¸Ò®¢¦B Ó›k™™Úš©žq¤¬gµ>À`ÌŒÙçðõ•!I!Ä.L;ŸF„PÆX<_ÄcFfµfe_aµ[0T÷J9@/4'5Ò 6ü°í‰ß Ò|ź*°Ô§I¡©œ š€™››ž'¤«¬´O¿BËEØækôý~¤%-»9%E(OW2^ëb£eLfâdna\¶TµK,AQ5c(£[ ÓýWï2á­ÓÇ™»†± ©Q¢~ªšä™/›„žÓ£ÿªä³S¾ÊïÖäÙòXÏô}+$8¨CÍM]V.]b eòeÇd’ac\UUL9BŽ6É),ý †ÿñìâ^լȽã²;ªQ£Gž7›2š<›Qž_£Mªø²1½ÃÈtÕã$ñ“ÿ-Â)6"BmL-U2\ZaŠd°eÈdÖaé\VŽMpCõ7X+ÛÃZëò¿ä!×VÊ¢¾@´g«E¤ýž¬›cš)›øÃ¢r©à±ã»GÇÑÓ@áMï²ý" Sü'Ö4Ÿ@K TO[¸`+d™eødLb£]WÃNÚDŒ9-²«IÖôœæåØùËÀ†µs¬¥†Ÿï›^šÜšeî¡^¨”°fº¡Å ÒcßdíÆû> F&E3:?èIS˜ZD`üc¯eReéb^+XPQF(;Í.~!¢öVèƒÚsÍhÁ¢¶W­¹¥ïŸœCš€šËœ¡Q§V¯þ¸ÄeЪݣëú†Ü»$Ý1ü=ÚH>RùYá_ØcÉe«e~cL_-Y>Q«G£œU \¦4®µ·­ÂãÎÜêjøôZR#“0Ø<âGwQfY†_¶cáeûed`ZTRåHü=Ñ1¤$¸UÇùYëVÝЮøã®Û¦¢ WœšÛ™¸›Ÿv¥&­ƒ¶^Á~Í¥ÚŽèñöƒú "h/Ñ;GÈPèX<_¡cfQfdÀ`ýZaSJG?13&+Ç 0û±ì–Þ(Ñ­Äe¹‹¯R§å fœë™™,›âž¤¬TµÀ Ì:Ùç‚õ¥Ë H.Ö:2F"PsXú^“c)f¬fe|aã[nTBK@Ž4{'›5 •üîÔßHÒ©Å8º2°È§)¡uœÆ™)™¢š(ž«£ «(´Í¾ÄÊÐ×­åô¸NŒ&-Ö9[ExOùW²^cIfÿf e1bÄ\vUlLÕAé5ä( ¥ ýý_ïáoӮƻã°J¨y¡‘œ®™Ý˜$š{Ñ¢ ª³‹½lÉiÖ=ä¢òMñCù+Ê8uD½NlWW^WcUf?gfÓb“]nVˆMC:7G*xhÿ¾ðdâ£ÔÂǼ©±ã¨á¡Èœ±™­˜Á™èœ¢"©ö±^¼&ÈÕØâ9ñæÿ“öÂ*°7}CíMÈVà]cAf^gbfSc@^EW„N+Dq8’+ÐtÈò®ãÙÕÞȽ€²‘©c¢Ô™Ÿ˜ƒ™{œw¡^¨ ±T»ÇÕÓŽáæï‘þC ±)•6€BMVV]´bf^g‘f°cÉ^öW[O$E†9½, º^óìä×÷Éÿ½^³Kªõ¢‚š­˜c™.œÿ ¾§G°mºýźÒaà­îSý {f(5‚A1LUU½\CbËeCg¢fìc0_…XPùEx:Ç-) äBôæ)ØËû¾?´ «”£û`šÔ˜`™œ© A§¥¯ª¹ÅÁÑUß“í0üá XL't4‹@RK’T\Åasegšf dw_óX P«FG;¯.%!ïV¨õ0ç9Ù Ì쿵ͫ6¤|ž¼š ™p™ê›m ß¦!¯¹\ÄèÐhÞ—ì)ûÕ NG&z3¡?}JÖS{[EaeØf…fd­_KYQDGü;|/"ßQ¨ö0è4ÚüÌÎÀ赃¬Ñ¤øž›D™†™Ý›; Œ¦­®t¸¯Ã$Ðݰë9úßXV%“2È>·I'SçZÎ`¾d¢fqf,dÞ_žYQÔG¥<<0Ø"¿;–÷éÛÚÍÁ¤¶)­\¥fŸg›r™’™Æ› 3¦5®á·ÃbϽÜÐêPùôns$»1>I‹RfZk`{dfrfOd#`ZRsH]=1´#§)‡ø êܲÎcÂT·¿­Õ¥ÀŸŸ›‡™ƒ™”›®Ÿ½¥¡­1·;†ÎÑÛÙéUøøv†#Ý06=RHõQðY`Kdvffdˆ`ŠZ·R6I8>÷1³$°7”ùëûÜ›Ï6à ¸Y®M¦ Ê›Š™^™G›;Ÿ&¥è¬Z¶KÁͽڻè2÷×^{"æ/X»IjSh[Œa¶eÐgÐgµeŠae[gS·I‰>2 $lÄóøGê ÜŠÎ Â˶­ó¤·žtš?˜%˜%š6žC¤+¬ÆµãÀGͲÚßèƒ÷TH#Ô0c=³H‹R¶Z age·gëgfb\GTÀJ´?^3ý%Ø6 dú¯ëdÝÌÏ.ÃË·ß­¥0Ÿ¹šO˜˜Ì™ª†£C«¶´±¿úËPÙoçöá›ï!“/@<¶G·QZ–`(e¬ghff¡bÝ\7U×Kí@³4f'N² Þû íÃÞÑVÄθ·®G¦§Ÿûš[˜Õ—k™Á¢Pª›³s¾ŸÊà×ñåŠô^ … A. ;§FÓP[Y`Úd–g8h¾f.cœ]%VïL*B 6Ø(Ð< iý£î8àqÒ–Å빫¯ §: Y›‚˜Ä—#™—œ¢n©Ž²?½KÉsÖräÿòИ Ù,Á9}EÐO…Xo_jd\g5hófšc=^öVíMPCV7=*Ià õþ-ð·áßÓìÆ!»»°ñ§ð Ü›Ï˜Ú—™>œ¡®¨Ÿ±'¼ÈÕãñHˆg+e8>D´N“Wª^×cýfhgàc¸^¥WÌNZD…8Œ+±=zµñ:ãVÕOÈi¼â±ñ¨Ä¡œ?™˜™ œ¡¨Ó°.»îÆÖÓ¢á ðÇþ‰ ì)û6ìBM„VÆ]!czf¿géfþc _-X…OAE–9À,¦ó7ó½äÒֽɽ³ ª·¢FÖ™x˜3™œÛ Ÿ§.°[ºðųÒ_à¯îXý †r(Œ5A?LaUÈ\MbÔeKg©fòc5_‹XPF€:Ñ-5 óT¥ô2æEØ'Ë¿c´2«º£"ž…šø˜™œÁ S§°¯®¹ųÑ>ßríü­  ')4;@þJÎI$SÊZ™`qd@fýe§cM_YíP2G<£/J"?Ë:÷×èíÚÄÍ ÁÁ¶^­©¥ÉŸÝ›ù™'šeœ© Û¦Ü®‚¸›ÃíÏ8Ý7ë¡ù,Œw$¤1Ï=¸H'RìYÞ_Ýc×e¿e—cj_NYbQÐGÊ<ˆ0K#Vómøê"ÜïμÂÈ·J®u¦q ]œNšPšaœw ~¦T®Ó·ÈÂûÎ,Üêtø÷VG#€0½<¾GLQ3YK_tc™e®e´cµ_ÄYR–H±=Œ1f$ƒ,ªùHëSÝÐÈø¸¯§ñ ±œušGš*œ ì¥š­ô¶ÉÁàÍüÚØè-÷¯"]/´;ÕF†P–XÚ^2cˆeÎed4`pZ×RIÊ>¿2­%Ö„ û–ìÞ7ÑÑĹׯ°§S¡âœrššÁ›yŸ'¥«¬àµ–À•ÌŸÙqçÃõJ»Ë 2.ª:ñEÎOX…^cefƒdå`O[ßS½J@"4 'R uüûíßßhÒÞÅ€º‹°1¨ž¡õœMš´™.›³ž1¤‹«›´3¿ËØáå4ôÅGqù,˜9 EO‘WA^cÎe„f'e¼aW\ULA°5¼(õ¡ þ}ïEá¬ÓøÆk»A±¯¨á¡ûœšB™‚šÐ£Iª4³¬½~ÉjÖ/ä„ò!¸þ©+s8D^N Wù]ÿbf÷fÕe¢bq]ZV„MCV7q*°Y¸ÿñÃâÕ'Èi¼²<©1¢ é™Ö˜Ú™ðœ¢©É±!¼ÙǶÔsâÊðpÿ|J*=7CMvVŸ]âb%fVgpfvcy^‘WãNœDð8,ed²òDäfÖ_És½ß²Ü©–¢5Ô™…˜N™,œ¡á§z°±ºOÆÓÌà!ïÎýˆ í(6B²LÐU1]®b,f˜gêf'd\_£XPøEg:§-ú§ø9ô·å½×“ʾ¾³ˆª£uÜ™U˜ç˜›C æ¦X¯l¹ïĤÑJßšíJü —'Õ4û@ÐKU®\`bfµgJ—Su[yaƒe}g^g%eà`£ZRÐH–=1£#rÑ øréMÛæÍ„Ág¶È¬Ú¤Åž©š›˜§˜Ìšþž(¥)­Ù¶ÂsÎáÛ ê¨øj.$›1>.IÚRØZþ`,eLgTgCe$a [S}I`>þ1™$wà ùƒêWÜäÎqÂ=·ƒ­v¥?ŸÿšË˜°˜­š¸ž½¤›¬+¶:ÁÍêÚé—÷Vó##0=YH!R>Z‡`Úd!gQghepa[²S3J2?é2˜%ƒõ8ú™ëdÝâÏ[ø7® ¦®ŸG›ë˜§˜{š^ž<¤÷«gµZÀ—ÌàÙïçzö7Ù"ž/0<ŠGpQ¯Y`—dg_gŸeÏa\YTúJ@ä3¥&ž \û¹ì{ÞëÐOÄê¸ö®¨¦) œ›™¬˜XšžË£a«¯´„¿§ËÙØ×æWõ¯ï ƒ.&;•F–PóXƒ_"dºf-ì9nE†OX´^zc†IËRcZ'`øcÃe~e+cÕ^”X‡PØFº;f/" ¼9÷äèÛèÍÎÁõ¶—­ä¥ œ/šWšŽœÊ ó¦ê®†¸•ÃÞÏ!Ýë~ùcM$|1ª=™HRÜY×_ácæeÙe¼cš_ˆY¥QH=Û0ž#©B¶øNêWÜÏ×ÂÓ·D®^¦H "œšõ™ø› ÿ¥Î­I·=ÂrΩۜéø— #Z0®<ÈGmQlYœ_Ûcf=fRd^`wZ¹RNIf>:2 %­úœëŒÝ.ÐÈڸޮǦ 'œÕ™”™h›FŸ¥Å¬"¶þÀ!ÍMÚ=è©öEÇã!O/Æ;GØPYd_Õc?f–fÙdaP[µSgJ—?|3V&hü [ûÑì«Þ2Ñ«ÄX¹s¯1§» 4œ²™D™ëšŸžM¤×«µÚ¿ìË Ùöæcõ˜Ç M.â:FF>P•X _¾cVfÚfIeªa\—TgK°@¨4'©= –üîÉß8Ò•Å!º°¬§ ¡Xœª™™Ššž›£« ´Ê¾ÆÊ×׸å"ôÉb¡<-ì9pE‹O X¿^‰cNfg›e'b¶\cUULºAË5Ä(ê„ ÝýAïüàXÓ›Æ »Ü°K¨€¡ œÄ™ú˜Gš¤ÿ¢=ª8³Â½£ÉŸÖqäÒòw_ ,Ó8tD²NWW7^.c"fgÑeŒbI]!V:MÃBò6*;à =ÿŸðPâœÔÉǼʱ©¢ þ™™šFq¢©Q²µ¼uÈUÕãfñ¤÷³*’7PC±MVŒ]´bÜeôföeçb×]àV(NÙC+8Z+©]Â#òÍãÖÉP½Ü²ø©Ò¢L𙸙êœÞ¡º¨Z±’»,ÇíÓ“áÖïmþ f3)*6 B‘L‹UË\)bŠeÝffHcr^²W,O E…9Ô,<oÏópå™×•Ê¥¾´õªš£žŸš,™Î™‚œ9¡Ü§G°PºÁÅaÒíßî®üN ³“'§4©@\K‰T\ša:eÎfMfºc"_XMP]F;q.ò È=›õ0çDÙ"Ì ÀAµú«f¤¬žëš5™•™œ~ å¦¯ñ¸9Ä·Ð*ÞLìÕúx ëâ%3??"J…S7[aódËfŽf>dç_žY…QÆG’<$0½"¢u÷úè÷Ú³ÍtÁx¶ù¬)¥/Ÿ*›0™J™y›±ŸÜ¥Ú­‚·¢ÂÏ\Üqê÷ø¡#4$‰1Þ=óHR}Z—`½dÙfáfÓdº`¬ZÈR7I*>Û1‰$yôFùºêœÜ5ÏË·æ­Ù¥žŸW›™ñ˜ßšÙžË¤–¬¶ ÁMÍ–Ú¡è%÷Øm™"0’<ØG«QÖY0`˜döf?gpe“a½[ T¥J»?‡3H&A¼ ûfì-Þ£Ðį¸Á®y¦ y›û˜“˜Cšž¿£Y««´ƒ¿ªËáØãæhõ$Ë!¬.U;ËFÓP7YÍ_sdg–gf`b¾\:UýK6A5î'ñm ­üÿí­ßÒGÅ»¹›¯§j ¨›í˜J˜À™IÑ¢=ªf³¾)ÊM×DåÆóˆ=˜P-:½EóO‹XW_5d gËgpfc’]=V(MƒB…6l)|ý ;þ‚ïá[ÓÆÎºƒ°Õ§ð ù›™.˜n™Âœ¢X©X²ë¼ÙÈæÕÎãGòÃ,ù+á8¢DÿNÂW½^Íc×fËg¥fjc,^WN›C½7¾*áo²ÿ÷ð‹â¸ÔÅÇ÷»Š±´¨¤¡}œ[™M˜Y™zœ ¡®¨‚±ì»·Ç¦ÔuâÝð“ÿK¸*‰7cCÞMÆVê](ccfŠg™f“cˆ^”WÙN†DÏ8ó+2Õ'sòä*Ö(ÉC½¸²¾©…¢0Ü™š˜q™\œK¡&¨È°»¨ÆtÓ'áyï!þÒ @!)+6B·LÂU]}béeEgˆf¸cã^!X–OoEß9$-6•æówå’×Ê‚¾Ø³»ªX£ÖQšÜ˜~™4œð ™§ °º›ÅFÒÞßî·üc Ó½'Ø4á@™KÈT@\Øaueg{fßc=_­XQPTFë:P.Æ ’ýUõäæöØÒ˾¿÷´¶«+¤|žÇš™™œ–  §Q¯8¹Äѓ޼ìIûî `R&}3?rJÅSf[,aùd»fhfd–_9YQ?Gÿ;ˆ/"ýxØögèqÚ>ÍÁ/¶Ê¬¥7ŸO›r™©™ò›B ‚¦’®H¸qÃÔÏ1ÝAë¼ùWÇ¿$ù1/>"I™RdZZ`\dUf2ÿ$"ÎNúìëóݬÐZÄ?¹“¯ˆ§H¡ôœ¡š[š$œóŸ³¥F­…¶AÁAÍGÚèSöÈ#!d.½:åE¡OÁW^‰bûdaeºc`qZÿRáID?`3s&¿ $üÑíÝß‘Ò1Æýº0±ü¨‹¢ÿo›èšmœöŸp¥¿¬¼µ:ÀÌÕØræ“ôî9*w,Þ8DúMCVÌ\sa"dÉdgc`ªZ~S¢JD@š4á'YJ ýý»ïÏá€ÔÈɼݲ€ªà£ŸPœ‰›Êœ  @¥J¬µC¿ÐÊp×áäÞòV>Ž*7TBOL¿Tv[S`=c$dcâ_ÑZéSNK.A½56)Ûð ¾ÿŽñªã[ÖãɆ¾|´û«.¥8 3.œ/0 !¥ê«e´h¾¿É.ÖuãOñtÿ› {Ì(H5¯@ÅJXS:ZG_fb‡c¤bÁ_íZCTäKûA½6d*0eK+óNåý×{Ë ÀçµD­O¦+¡ô¹œH ¥«Õ³¥½ÌÈÕ6âôïþ úM'Õ3N?I2R:Ys^Âacfb¸_[£TuL»B¦7q+[¨Ÿˆô­æVÙÉÌEÁ·D®*§Ý¡xž¦< Ã¤$«>³å¼éÇÔáÆîÊüß »&¬2;>†HYQ…Xæ]_aÞb\bÛ_i[UM}C‡8l,jÄîõÎçlÚÎÍ3ÂÚ·ø®º§F¢ºž&• b¤ª•²¼ ÇÓà¹í¹ûÑ µ%È1o=ÖGÉPXž]>aäb‰b.`ß[³UÉMKDj9^-f ÆÄ¨ö½èJÛ•ÎáÂj¸f¯¨m¢»žK–ŸÕ£ô©Ñ±F»Æ&Òß½ìÃúåÙV$1Û]‡VND–8,Œv •ó_å´×ÙÊ¿›´««q¤Ÿ¨›Gšöš±j¢©i±b»¿ÆEÓ´àÄî/ý¨ åœ'†4`@ìJôSH[Ã`IdÇe4e•b÷]qW&O@Eó9x- ›õ׿ÙÌ-Àеi¬ú¤bŸ¿›%ššš¡¡¨D°ºVÅÅÑ$ß.íšû m>&I3K?J@SËZ`@døe e8cÎ^xXWP•Fe;/§! 2©öOèqÚTÍ?Án¶­t¥¤ŸÇ›ñ™-šxœÈ §¯¿¸àÃ8Ј݌ëùù†çÒ$þ1'>IzR;Z)`$dfúeÌc™_vY„QêGÜ<’0L#PäUøíé÷۽΄·þ­!¦ ý›é™æ™õ›  ¦é­k·fŸÎÙÛÎé6øÇ55#~0Í<àGQxY¢_Ücf4fFdP`hZ«RBI]>52%¸'ú´ëªÝQÐðÃÆ¸ ¯÷¦¯ Tœþ™¸™„›XŸ!¥Á¬¶ßÀôÌÚôçSöä\p!Ö.I;ŠF]PXø^tcíeVf¬dú`Q[ÏS›Jä?â3Ô&ý¤ ü˜í|ß ÒƒÅ-º@°ð§i¡Ìœ0š¤™*›»žD¤§«À´^¿LËJØæhôöt˜-¯9E!OŒW2^ðb®e\fødŠa!\ÜTßKXA€5’(Ò‡ ûýzïOáÂÓÇ›»}±ö¨3¢Uvš¦™èš6ž£§ªŠ³ø½½É›ÖOä“òŸÒj+ 8´CéMŠVk]gbeeVf4ebÜ\ÐUM°Bÿ61*ˆKÅÿ?ñãcÕÈ÷¼«²ñ©õ¢Û¾š®™±šÀÍ¢¾©m²¯¼MÈ Õªâàðeÿì ,Ù)­6fBÆL˜U¯\åaeMfheub„]®VNêC]8¬+égÝò˜äáÖÿÉ5¾Á³Øª©£Xž›¹™šY/¢í¨n±‡»ǧÓ1áZïÛýf ±q(`5:AÁK¿T\oaßdCf•e×b^rWOÿD’9û,zV×Jôúå0Ø5ËL¿³´¡«D¤Äž<›¿™Ušúœ¢¡3¨Œ°‚ºáÅmÒæßîƒü h:'A48@âJTy[a®dBfÃe4c¡^$XÜOöE¤:".± •‡õ+çQÙ?Ì9ÀµG¬Ã¤Ÿd›º™$šžœ¡‰§À¯˜¹ÞÄWÑÂÞÛìWûë L/&L3_?)JqS [Ç`dMføec$_ÉX¡PÖFš;)/Ã!­1™ö2èFÚÍÿÀ&¶Í¬$¥SŸx›§™ê™?œš æ¦¯À¸ñÃ\нÝÒëOúêXL%2¬>“IýR·Z›`ˆdkf:föc«_nYaQ¬Gƒ<0À"­.Ž÷éÛÞͤÁ®¶4­h¥sŸs›}™™Ð›  :¦;®æ·ÃfÏÁÜÔêUùúu|$Æ1>IžR|Zƒ`•dffmdA`!Z,RŒHr=1Á#®+øþéíÛ—ÎAÂ,·‘­¡¥‡Ÿb›H™C™T›pŸ‚¥j­·ÂdκÛÌéRø‹¦#1l=‘H>R?Zl`¥dÒfêfêdß`ÜZSvIn>!2Ï$¾6‚ùñêÌÜ]Ïë¶·ø­ä¥¤ŸX›™ì˜ØšÓžÆ¤“¬¶ÁWͤڴè>÷õ޼"70·<ýGÌQóYG`¨dýfQŒY `“dg|gÌe bM\¯TZK}@R4'‡ ÇûíÕÞ9ÑĹ¯´¦" ƒ›ì˜m˜š´^£êª/´þ¾ËRØSæÚô›I˜ ?.õ:yFPY«_adg£gf‰bó\{UFL†Ar5H(MÉ ýWîàQÒŽÅû¹Ó¯K§ Ã›™R˜¿™?À¢$ªF³ö½ýÉ×åóP_-ç9‰EÂO]X._dëf°g[fób‰]9V*M‹B“6)” \þ§ïFá…Ó¬Æûº²°¨¡%œ2™U˜’™ãœ6¢o©j²÷¼àÈçÕÉã<ò÷­Ù+½8zDÔN•W^žc¨fžgyfAc^âVüM‚C©7°*Ùm¶ÿñ™âËÔÞǼª±×¨É¡¤œ‚™u˜™¡œÄ¡Ñ¨¢± ¼ÑǼԈâìðŸÿS¼*‡7]CÖMºVÜ]cPfug‚fzco^yW½NiD³8Ö+º ZòïãÖÉ4½¬²·©¢0ᙣ˜~™mœa¡?¨å°%»ËÆ™ÓMá ïHþø eD)L6:BÐL×U!]‡bîeCgf«cÏ^XxOLE¸9ù,Qd¶óGåd×SÊY¾µ³œª>£ÂDšÖ˜€™=œ¡°§)°BºÃÅsÒàPîíüš ó' 5AÆKñTb\ôaŠegfÞc4_œX9P5FÆ:%.– ]Æõ©æ»Ø˜Ë†¿Â´…«þ£Už§š™{™œ” §_¯M¹ªÄ:ѽÞìì~û' ›&»3Û?¯JT[^a'eâf‰fd§_BYQ7Gî;o/ú!ÔI¢ö,è2ÚüÌÎÀ鵄¬Ð¤õž›9™v™Æ› g¦€®@¸sÃàÏGÝaëæùŠ%B2}>tIîRºZ¯`°d¦fˆfWd`òYôQNH1=Ø0#sõUøÜéÖÛŒÎBÂ9·©­Ä¥³Ÿ•›€™}™Ž›§Ÿ´¥”­·$Âiή۰é$øÂ;G#›0ô<H·Q¶Yä_"dXf}fŽd—`«ZêR|I‘>c2/%<Ð7ú¼ëªÝJÐâñ¸ñ®Õ¦ˆ (œÎ™…™O›#Ÿì¤¬Þµ¯ÀÈÌêÙÒç6öÎMh!Ö.Q;™FtP®X_žcfŠfäd3a‹[ TÓJ@4'" *ü¥íßÒrź°Ã§3¡Žœì™[™Þšlžõ£Z«v´¿ ËØéåGôálž--Ñ9KE^OÕW†^NcfÇfgeúa\GUDL¶AÒ5Ø( ® þ}ï?áŸÓåÆR»#±Œ¨º¡Ðœè™™Ošè¢ª³|½OÉ?Öäaòžêœ+l8DcNW ^c"fgþeÐb¢]V»MSCŽ7©*æçÿBñèâ%Õ?Èy¼²<©)¢üœÏ™´˜±™ÀœÑ¡Ê¨ˆ±Ý»”ÇpÔ.â‡ð1ÿß G*7øB|MpV¤]óbAf}g¡f±c½^ÝW5OóDJ9x,¿f¸óŠä£Ö‘ɘ½ø²æ©’¢!±™T˜™à›¸ ~§°?ºÙÅ¡ÒUà­î_ý £œ(Ã5ÔA‘LÁU4]ÆbWfÖg;g‰dÍ_!Y§PŠFÿ:B.• >ˆÀô1æ'ØìÊþ쳟ª £Z¨™˜ƒ˜›µŸG¦ª®³¸.ÄàІÞÚì’ûa û'b4¢@“KüT­\~bQfh¶gAe¿`HZüQH<ø/Z" Q}öÙç³ÙRÌþ¿õ´p«¢£³Á™á—˜sšØž5¥h­H·¡Â8ÏÍÜëÐù¨S†%ö2_?~JT\b#f"hhÍe…aC[(S]I>Ž1$¿ 0ø~éAÛÂÍHÁ¶^¬Z¤1žšç—æ—š,žS¤V¬ ¶>Á·Í5Ûré$øÿµú#…1>XI$S@[„aÍeh%h'fb \ T‚Jb?ù2‡%S¦ÍùëÇÜ1ϘÂ>·^­*¥Îžiš˜Ú—¼™°¢£t«û´ÀaÌÅÙïç–ön){"0À<+HRhZÝ`[eËg!hZfb©\ðT~K†@>4è&È( Tû˜ìAÞ™ÐçÃn¸h® ¦~Ÿçš\˜ì——™V£µª´ô¾*Ëq؆æõï«!´.q;ùFQ‚Y$`ÓdwghqfÌb(] U[L‹Ah5/(&– Êüî²ßüÑ6Å¡¹z¯ô¦= w›º˜˜™£¢ª@³ü½ Ê7×3å»ó‚;šV-%:ÇEþO•Xa_>dgÐgrfc]7V MxBy6^)nï .þvïáUÓ|ÆÏº‰°à§¡ œ!™L˜™èœB¢ƒ©„²½ÉÖöãkò'Ý@,æ8ŸDôN®W¡^©c¬f™gmf-cë]ÁVÕMUCx7{*¢5~ÿËðfâœÔ³Ç±À¨º¡œ„™˜”™¼œè¡ü¨Ó±A¼ ÈüÔÊâ/ñáÿ”úÊ*»7‹CüMØVñ]"cQflgnf]cG^HW„N)Dl8Š+ÆhºòŸãÊÕÏÈô¼u²ˆ©]¢Ô™¢˜Š™†œ†¡p¨"±l»ÇñÓ¬áð¯þa Í©)¬6”B"MV]]¶bfVg„fžc²^ÛWš˜õ˜t›ýŸy¦Ç®º¸Ä»ÐNÞì6ûö ‚&Õ3 @ùJaT\åa¼eƒg0gÆdP`æY©QÄGk<×/J" e¡öè÷Ù¥Ì^Àaµç«!¤8žKšn˜ª˜ÿš`Ÿ·¥ã­º·Ã’ÏÝTëûùÂ\}%Û22?AJÎS©[¨a­e¡g|g=eñ`®Z”RÍHŒ= 1‹#S¬â÷AéÛ«ÍEÁ$¶‚¬‘¤{ž_šR˜_˜†š»žê¤ñ¬¨¶ÛÁQÎÉÛþ饸rM$Æ1<>pI'S.[]a“e¹gÆg¸eša[ŽSéIÅ>[2ë$»Eù˜êZÜÔÎM·9­¥Òž‚š@˜˜ šž¤ï«€µ”ÀòÌXÚ‚è&÷ø«ó"†0=yH\R”Z÷`ceÁgh-fDb]\–TK@È3m&J© ÕúìËÝ+ЂÃ¸®Ç¥IŸÁšF˜ä—ž™k7£åªL´;¿zËÊØåæ‚õVo!/Ö;YGjQÖYo`e¯g/h“fãb3]ŸUOLtAE5(ïV ‚üÀí\ß¢ÑØÄ@¹¯‘¦ÛŸ›_˜À—=™Ïœc¢Ý©³Ü½úÉ0×:åÏó£jÖž-y:&FfPYÙ_»d’gQhófc^©VˆMÕBÈ6Ÿ)ž 9þmïøà#Ó6Æuº°b§r r›{˜—ܘ2œ¡Ò¨Û±y¼uÈ’Õ‹ãòì¼;,9ñDbO7XC_adwgthTgdÝ^²WÀN5DI89+HÀêÿñâžÔÇ¥»±.¨¡Ë›˜˜|—˜š›¿ Ñ§¬°#»ÿÆÔêánðCÿ«¦*Ä7ÁC_NfW©^dRgŒh¨g«d£_­XêO‰EÀ9Ë,ïqŸÄò.ä(ÖûÈê¼6²©¶¡@œÎ˜t—7˜›üŸÖ¦~¯Ç¹|Å`Ò0à¦îuýQ îÿ(<6_B+MgVã]yc g‡hæg+ec`¨YQìFM;z.· J~ ôýåáוÊ^¾z³$ªŠ¢Ôœ ™—ÿ—˜š?ŸÚ¥I®_¸ééÐ_ÞÃìŠûi 9'”4à@ÛKMU]Ûb²fthh¢ea¢ZPRTHâ<40Œ"2oöáç°ÙEÌç¿Ô´G«q£z‚™—Õ—)šŒžè¤­ý¶YÂóÎŒÜÝê›ùz-h%á2R?{J"T\+bDfLh6hfÃa‡[pS©Id>Ü1R$ Tuø¾é{ÛõÍrÁ3¶t¬e¤1žø™Ð—Ä—Ô™ö¤¬¼µêÀ_ÍÛÚéÉ÷¦`¬#>1Ñ=#IúR#[saÊeh=hLfIbH\iTÕJ¼?Y3ì%º 2úuë#Ý…ÏãÂ~·‘­P¥åžrš ˜Ä——™}b£'«¥´©¿úËZÙ‚ç(öÁ"Â/r<èGêQBZÆ`TeÔg:hƒf¸bí\@UÙKé@§4U'7– ¾ûýìžÞíÐ0Ä©¸•®'¦ŒŸåšJ˜Ê—g™Ê¢`ª²³¾ÁÊØæ·ôP´ n.7;ÌFòPtY%`äd—g0h¬fcy]ùU»LîAÌ5“(‡ñ ýYîñß/Ò[Å·¹¯ì¦& R›ˆ˜×—C™ÅœJ¢µ©à²›½¯ÉÝÖáäqóBt=-:ÌEP¸X’_{d[g!hËf`cð]™V€MÕBÏ6¬)±& Wþ‘ï!áQÓiƬºW° §´ ·›Ã˜ç—'™~œÙ¡©$²À¼¹ÈÐÕÃãHòÛO&,9àDBO X_d ghåf¢c[^)W3N§C»7¯*ÄE{ÿ´ð=â`ÔgÇ“»#±L¨=¡œÿ˜ú—™@œt¡”¨y±ö»ÔÇÖÔ¸â2ñùÿÀ:+8üCzN_W^³câfúg÷fÜc»^®WÙNkDš8¢+ÉT‘ÊñMãfÕ\Ès¼é±ô¨Ä¡~œ<™˜™œ¡¨Õ°4»øÆåÓ¶á%ðåþ¬ +**7CµM¸Vù]Qc¦fæg gd_2XO0Ey9—,Îe¨áò_ämÖSÉT½°²ž©L¢áœy™%˜í˜Ì›³ ‰§*°jºÆéÒ©à ïÆýŒ  ),65BæLVk]ébffÎggRd_½X.PþEc:š-ã‡Ñ ô„å‡×\ÊH¾‰³Wªâ¢QÀ™A˜Þ˜’›O ý¦y¯˜¹#ÅàÑŒßáí“üW àã'55ALDUÌ\qbf¬g&g‰dâ_IYáPÕFZ;ª. !¼LõÂæºØËT¿y´'«Œ£Òšk˜Ù˜^›îŸq¦Ä®¼¸'ÄÇÐ]Þ¡ìIû –¢&æ3@KhT\åa¸e{g%g¸dA`ÕY˜Q´G\<Ê/A"e§öè Ú¾Ì|À…µ¬O¤jž€š¤˜à˜4›“Ÿå¥ ®Û· áÏÝMëèù£0E%˜2å>ëIqSF[AaDe9ggÝd™`_ZQR˜Hg=÷0Š#eÑøŒésÛÎÁÁ¬¶­+¥Ÿþšî˜ö˜›=Ÿ\¥Q­ó¶ÂmÎËÛåéqø$±Î#01“=¶H`R_Zˆ`½dçfûfùdì`èZ SƒI}>22ä$×S¥ùëùÜÏ!Ãï·3®¦ÞŸ›I™™ýšížÕ¤•¬¶õÀ+ÍiÚièâö‹9"ª/#XÈ^gcfŒfenaà[vTVK°@»4¶'㊠÷üsîKàÈÒ0ÆÅºÀ°W¨µ¡üœDš›™›|žë£8«<´È¾¥Ê—×Zå¦ó2²Ûc,9~D“NWÌ] bte:fïd˜aG\U1L¿Aø5)h( ¤þ(ðÿárÔÈÇA¼²‡©µ¢ÇÖšñ™›Vžˆ£™ªe³½½lÉ6ÖØã ò‡ÿ(º*n7C:MáUË\ÔaádãeÕd¼a¨\µUMÇB.7x*ç¿LØñ®ãÖZɹ½p³´ª²£žf›Fš6›0ž%£û©²´¼6ÈØÔZâuðàþQ |)ß5ŽAéKºTÔ[aXd–eÅdêa]ZVâMÖCk8Ü+jZöˆó\å¹×èÊ*¿½´Ö«£¤JŸç›Šš<›÷¯¢J©¦±™»íÆiÓÌàÑî.ý™ Èq'N4@›J™SæZ[`ÜcXeÇd,b”]W×NþDÁ9X- ´Kõçhـ̣À¶ù¬’¥ _œÂš3›­%¢ƒ¨§°eºŒÅâÑ&ßíeûÍ »%°2ž>HIvRùY©_jc'eÙd€b)^êWãO?F/;ì.¶!ц÷åè#Û ÎÂ_·®x¦¨ Æœæš›H~¡ž§‡¯¹ Ä;ÐcÝ?ë†ùï/ý#1%=þGbQ Y_ceeúbå^ãXQ£G½<œ0~#©cöø®êÔܯυÔ¸¯9§)¡ášÊš¿œ· ¦S®°·…˜άÛ}éÃ÷4…l"¡/à;èF‚PyX§^éb+e`eˆc«_ÞY?RõH0>)2%P ”ú:ìFÞѯĹ߯ͧ„¡%Çšvš4œ÷Ÿ­¥8­p¶'Á#Í)Úòç9ö´!j.Î:FÉOóWV^ÏbGe±e d``¿ZGSJu?‚3ƒ&¼t õû‹í€ßÒ©Åcº†°E¨Ë¡:ªš(š·›NŸÜ¤C¬]µû¿åËߨ¤æíôpâ÷g-ì9DE4OŠW^Ábgeþe…da…[-T K@ª4µ'ò§ ý¦î‡à ÓwÆ» ±¢¨þ¡B‡šÛ™B›´ž¤h«h´ò¾Îʾ׀åÌóX؉,+9¤D¸N4Wë]»b‰eIfõd”a8\þT L‰A´5È(» ,þ¥ïsáàÓ1Ç©»„±÷¨-¢Kjš˜™Úš*žv££ªŒ³¾ÐÉ·ÖuäÂòUá¸+s8 D=NÛV¶]«bŸe‚fQebÕ\¶UÙLmB§6Å) ½ (ÿ˜ðWâ°ÔêÇG¼²V©j¢d_ši™‰š¸å¢÷©Ç²)½æÈÂÕyãÅñ[ï6å*¶7eC¶MtVp]‡bže¥f—eyb[]XV•M>CŠ7µ*¹#Œñ@ã‰Õ¯Èõ¼–²Ê©½¢•mšT™Pš]j¢^©²^¼ÈÔÔâÇð]ÿõ E*æ6«BMòU]Gb‚e­fÂeÈbÌ]èVANDf8¢+üº'ò:äwÖ‹É»½C³Yª-£ã–šX™0š¢Ô¨k±š»,ÇæÓ„áÁïRþë A )þ5ÙA^LVU“\ïaNe fÜec1^qWëNËDF9—,Ë=¤óKå|×Ê›¾ ´«³£DžÐšj™šØœ›¡H¨»°ËºBÆäÒpà î+ýÄ ó'ø4é@‰K¡T\…aeŠfòeIcœ^X¤O¦E?:ª-( ÿyàô‚æ¨Ø›Ë¿î´Å«P¤¸ž›„™š•œ*¡«§ö¯á¹7Å¿Ñ6ßWíÙûp ѱ&È3Ó?’JÎSW[a¿dlffŽc_ªXuPŸFZ;â.w!^áJöççÚÞÌÆÀöµ¦¬¥?Ÿm›¥™ð™Lœ­ ý¦¯Û¸ ÄtÐÓÝãë\úñXF%r2™>{IßR—Zx`edIffÜc–_aY]Q³G•<=0ë"äqÝ÷ré}ÛEη ­Ð¥ÔŸË›É™Ú™û›$ =¦(®º·Ä ÏPÜMê¼øO½º#þ0D=LHÝQÆYÞ_d$f2f/d$`'ZWRÛHæ=±1y$…ˆùëÝÁÏkÃO¸¦®¤¦p ,œî™À™¥›’Ÿr¥)­Œ¶mÁ’ͼڨè ÷ $"/è;GØPõXE_¦cfPfŠd»`÷ZZSJB?-3&,Ë 8û½ì¦Þ;ÑÃÄ~¹¦¯o§¡ƒœšœ™C›õžž¤ ¬VµÀÌ%Ùç^õòr“ .•:ïEßO0X¹^Vcñe{fòd]aÐ[fTGK¡@¬4¥'Ñw áü[î0àªÒÆ º™°-¨ˆ¡Íœšl™ØšPžÃ£«´²¾™Ê”×bå¹óQݦ,S9ÖDõN{W;^cèe®f_eb¨\nUyL÷A6-)e vþãï¤áÔDǬ»v±Ø¨ý¡ š6™iš¬í¢ªó²e½0ÉÖÛã/òÌe®^+-8ÙC%NÝVÒ]àbíeêfÑe§b~]oVŸM=C}7*ߌìÿLñøâ:ÕZÈš¼8²h©Z¢2 šó˜ó™¢©Ð±$¼ÙDzÔkâ¿ðbÿ h4*%7ùBqMXV]Ábf3gLfRcT^mW¿NxDÎ8ü+FòJœò2äXÖVÉo½á²ã©£¢H홤˜s™Wœ@¡¨³°ìºÆXÓ áaï þà 8 )46.BÒLçU>]²b&fˆgÐfd._kXÜO¯E:R-¡JšÛó[åd×@Ê2¾y³MªÝ¢PÄ™J˜ê˜¢›c §“¯´¹CÅÒ²ß î¿ü† (M5oA=LU]®bSfåg\g»d`oYÿPêFe;«.þ ¥ëõ„æpØ)Ëô¾´µª£W˜™í—_˜êš‚Ÿ¦o®w¸óçÐQÞ«ìiû@ ã']4¥@ŸKUÉ\ bwf;hâgmeê`pZ R%H³<0_"Ceö¸ç‰Ù!ÌÅ¿·´.«^£o~™¢—ä—Bš°ž¥W­D·«ÂQÏôÜMëú÷®ê%b3Ï?òJTw\~b‡f{hQh f°a[[,SMIñ=S1´#\”ª÷ëè£ÚÍžÀhµµ«·£˜x™l—€—±™ö8¤W¬(¶yÁΨÛÿéÈø·~Ñ$f2ô>=JT\Lbƒf¥h©hf\b-\T\J?Š2ö$¢Øæøê»ÛÎ}Á$¶J¬#¤ÙŒ™S—:—A™^z£x«,µeÀèÌuÚÅèŽ÷‚U¹#d1>vI`S™[÷aXf¥hÓháfØbÏ\ãT?K@œ3&Ï úAëØÜ%ÏpÂû¶­µ¤DžÎ™k—&—™õœé¢ÁªT´o¿ÙËRÙ“çSöF‹"F0=ŠH”RóZyaf€hÜhg=c_]œULA¸4K'W gûìÞXÐŒÃú·Þ­l¥Ðž-šš—%—И“œY¢ªp³h¾´ÊØDæùôçÁ9!/Ü;}G«Q1Zã`žeJhØhGgžcð]ZVM Bä5‘(k¼ ÑüöíyߥÑÂĹӮ8¦pŸœš×—.—¥˜4œÉ¡F©†²W½‚ÉÇÖãäŠórMΪ-™:XF©PXY7`#ehÆhjgöc{^WíM0C7á)Ñ1 Mþsïîà ÓÆDºâ¯§) %›,˜M—Ž˜è›H¡”¨¦±M¼TÈ{Õ~ãòôÍT>,A9EOeXq_dŸg˜hrg3dí^ºWÀN.D:8#+- ÇÿïðgâxÔkÇ…»±¨ù Å››˜ˆ—”˜¸›å ÿ§á°^»>ÇEÔ.â²ð„ÿYãÖ*ë7ÝCnNiW^æc)gThbgXdD_CXxOEC9M,qø,ZòÐãÙÕ½ÈÀ¼ ²©Í¡oœ™Ñ—«˜œ›– €§4°†ºAÆ&Óõàcï(þö €z)6¤BQMlVÇ]:c«fhEgmd‹_ºXPßE7:b-¢>·ó.å1×Ê÷½=³ª¦¢™™&˜Ï˜›X §™¯Á¹UÅÒÌß%îÚüž &&(U5nA4LmUë\†b"f«ggrdÁ_Y®PœF;g.Ä vÊ õ„æƒØOË-¿\´«†£Ø'š‡˜™›) ´¦ ¯ ¹xÄÑ®Þðì“ûM ÑÓ& 45@KgT\ÇaeCgâfjdê_wY5QNGô;e/à!«^öÝçÚÙžÌmÀ‡µ#¬s¤ŸžÄš÷˜A™ › a¦Œ®\¸ ÃВݹëHúôqt%´2ì>ÜIMS [õ`ådÉf—fQd`ÃY±QøGÊs2]%…5 µúRìVÞ Ñ°Ä‹¹Õ¯¿§r¡°š]šœÛŸ¥­M¶ÁúÌüÙÁçöy×Ò ".‚:²EyO¢W^býdneÑc/`šZ0SJ?ž3³&ÿË _üî àºÒQÆ»>±©…¢ïV›ÆšCœÅŸ9¥„¬µû¿ÃË™Ø:æ`ôÂf,×8!D N]Vð\¢aYde¬cK`øZÍSñJ@â4"(’z "þÔïÚá}ÔÈ«¼°²Fª™£Ëžõ›%›`œŸŸÒ¤Ü«š´ß¾tÊלä§ò÷A<ž*#7‹B˜LUá[Ì`Ác²d™c|`k[€TàK¸A;6¥)8:òÿ«ñ®ãEÖ´É=¾´ƒ« ¤—Ÿ‚œp›hœcŸS¤« ³­½É”Õñâäð&ÿk jÜ(y5A8KéSçZ`Ccvd¡cÇ`ø[LUçLóB¤76+çþÂ}óyåÿ×T˺¿nµ£¬‰¥D îœš›NœŸ¶£Dª²h¼¡ÇþÓ?á ïXý ¦+'ä3‘?ôIØRZs_èb]dÊc2a¢\2VNAD9Ï,šÂEõ6ç¦ÙÝÌÁ£¶¥­R¦Ï :¥›œž£U©i±»'ÆdÒŽß`í“ûÝ ô%h2;>ÌHäQTYô^©b^d d±a]]%W)O“E“:d.E!xGùöÛè4ÛKÎd½·‹®§B¡pœ›Ð› žD¢b¨G°É¹·ÄÙÐïÝ·ëèù9_$ 1=ÃG Q³X^}bndWd7b^XGPØFù;ä/Õ"áŒø^êŸÜ—ϊö¸T¯”§Ÿ¡“…›€›…‰¡w§0¯Œ¸\ÃfÏmÜ-ê^ø·î¹"Ï/ï;×FPP)X9^`b‰d¨d½bÒ^úXUQ HH=I1I$Œ[ýù¾ëèÝÃÐ’Ä•¹°¨ì¡«h›/›Ö ˜¦*®e·ÂÎ ÛÂèõöV~!².ô:F©O±Wó]Lb¨dúd?c_ÔYTR(I>”2¡%ê· QûíßÔÑ‚Å^º¤°…¨,¢ºF›Üšœ' Á¥/­K¶æÀÉ̶Ùjçžõ _V ¦- :@EOEW¶]AbÍdOeÃc1`¬ZPSDJ¶?Ü3ö&D ¡üCîAàãÒoÆ%»@±ô¨k¢Ç!›‡šû›vŸæ¤/¬+µ¬¿{Ë[Ø æ>ô±#Ž,9pDkNÏVp]-bíd¡eFdâ`ˆ[RTgKô@05X(®y þ—ïáÔpÇÿ»î±s©¸¢á›8šz›Åž ¤*«´g¾ÊðÖ–äÊòD·Úb+ 8C¶MKV ]b eóeÌd›ao\cUœLGBš6Ñ)/ú |ÿñÒâ:Õ€È弦²ø©£úéšä™ñš ž£ªÌ²½´ÈuÕãHñÉÿL…**ô6¢B÷L¼UÄ\ëae5fBeAbB]_V¼M…Cð78+ oífò%äuÖœÉÞ½w³œª}£>žúšÂ™š†n¢;©Ë±ñ»wÇ#Ô³áàï`þé .ç(Ë5˜ALþT2\ˆaäd4fre¢bÑ]WŸND9x,óÎQÉóåÂ×ÕÊü¾t´u«,¤ÀžM›å™ŽšFþ¡ž¨±»gÆöÒnàŠîý† Ï‘'†4j@KTk[ì`vdöeeeÆb'^ŸWQOgE:—-, ¬+õâæÙ!Ì3À‘µq¬¥mŸÍ›5š­š3¹¡(¨_°3ºqÅÞÑ:ß@í§û# k3&53,?ÛI SŒZ6`ícže?eÓbf^XñO4F ;¯.b!h “öMè‚ÚzÍyÁ¼¶|­è¥( YœšÔš&x¡´§»¯a¹uľÐüÝêë?ú²÷Å$Ô1ß=ªHûQ£Yy_`cDeeäb­^‹XžPG<Ú/«"Ê|øÉéøÛâÎËÂò·Ž®Ò¦ä ãœåšóš (¡/§¯z¸dÈϧÜ~êÃø.sI#g0Šy2ƒ%˘ 2ûæìýÞ¾ÑpÅQºœ°‚¨-¢ÀO›éšœ8 Ó¥A­\¶õÀÕ̾ÙnçõTE -î9!EìNWŽ]b¥d(eŸc`‘Z;S5J®?Ý3ÿ&V* ÃümîràÓ«Æf»ƒ±8©®¢ ž_›Àš-œ¡Ÿ¥G¬9µ¯¿rËGØêåô}ÙÞC,Ä8DNzV]ßa¤d_e d³`d[:T[Kõ@>5r(Ôª >þÛïËáWÔÆÇX¼H²Ë©£2žR›{š´›õž.¤C«´g¾ÊØÖräœò v’+·79C`MõUÌ\Âa½d­eŽdeaB\AU…L;B™6Ü)E§ÿ4ñ ã}ÕÈÈ1½õ²HªX£Hž3›)š0›BžO£>ªê²&½¾ÈuÕ ã4ñ¬ÿ'Xø)½6gB¹L~U†\¯aÝdÿeeb]@V¤MuCç76+¥yüzò=äÖºÉý½–³»ª›£Yž›Ù™°š–{¢E©Ò±õ»yÇ$Ô²áßï`þé 0ë(Ò5¢ALUF\žaýdOfŽe¾bí]4W¶N D%9€,ôÇC²ó`å˜×¢Ê¿¾0´)«Ú£jžôšŠ™5šïœ¬¡S¨Â°Ìº>ÆÜÒeà’îý² ä'ê4ß@ƒKŸT\aeœf fdc»^&XÇOÊEb:Ë-E ‹ìô†æ¤ØË†¿Î´›«¤}ž×š=™¹™HœÜ ^§­¯¹úÄ‹Ñ ß:íÊûp àÐ&÷3@ÞJ(T½[wa7eéf†fd_!YäPG¯;'/©!{é<öÁçÃÙ‹Ì^Àzµ¬k¤—ž½šð˜9™˜› [¦†®Y¸ Ã!КÝÇë]ú –¢%ì2-?(J¢Sj[YaOe8g gÄdt`/ZRTH=¡0,#g¬÷éÛ¥ÍNÁ<¶¨¬Ã¤¸ž¥šŸ˜±˜ÜšŸ@¥E­÷¶%“ÎÜ.êËøŽ*U$Ã10>\I S [6aheŒg—g‰elaW[gSÆI¦>A2×$­ Bù™ê^ÜÜÎX·F­'¥ÞžšI˜˜šž ¤ç«uµ‡ÀâÌGÚpè÷çœç"~0={HdR£Z a~eãg-h[fwb”\ÐTUKR@4¢&{Ó øú5ìÙÝ-ÐxÃü·õ­–¥ Ÿxšò—‡—9™Ê¢vªß³Ò¾ËqؘæCõ'öd!%/ó;‹G±Q/ZÛ`‘e9hÅh2g‡cÙ]DVïL BÏ5|(W¨ ¼üßí`߉ѣÄ︫® ¦>Ÿfš—ð–d˜ñ›…¡©E²½JÉ—Ö»änócLÜÈ-È:—FúP¹Y§`¡eŒhZih•d_´W…NÀCš7S*0z }þˆïçàæÒÎÅä¹d¯…¦vŸ[šO—b–˜—ëšK ›§¶°m»ˆÇÈÔéâ¡ñ¥§Xl,›9ŸEi1¯#<[Y÷†è,Ú—ÌÀÒ´« £î˜î–—S™«¤6¬¶„Á/ÎÝÛEêùìF%Þ2n?´JuT\©bÓfæhØhªffb$\T/JÙ>>2ž$@oxø¨éMÛ±ÍÁ˵ý«ä£©m™F—?—W™…²£½«~µÂÀNÍàÚ3éû÷í»$·1U>¯IŠS²[ÿaOf‹h©h§f‘b{\…TÙJ¨?.3ª%d¤¸ùíêÜìÎFÂâ¶ù¬À¤ažü™©—t—]™[Y£7«Í´é¿QÌÄÙþç´ö™a¾"f0=‚HyRÃZ6a±ehihšf¶bÒ\ UK‰@54Ò&§ü û[ìýÝQÐÃ#¸®Â¥;Ÿªš'˜¿—s™<£°ª´¿C˓دæNõ#ã@!ï.«;0GDQ²YN`öd“gh}fÑb$]”UILsAJ5 (o ¢üçí‹ßØÑѹ`¯à¦. n›·˜˜”™#²¢%ªU³¾$ÊM×IåÎó’H¤[-&:ÃEõO‰XQ_+dýf¹g[fëbz]$VMmBs6^)tü Aþï5ázÓ§Æþº»°¨3¡@œQ™x˜¶™Y¢‘©‡²½òÈòÕÊã5òæ’í«+‡8=D‘NMWE^Sc^fVg7fcÔ]¼VâMvC¬7Á*úžöÿOñõâ2ÕNÈŠ¼%²T©E¢ó™Ü˜Û™ìœþ¡÷¨³±¼¶Ç‹Ô@âð.ÿÐ *ñ)ß6¯B&M V4]xb¾eôff$c2^WW¹N‚Dé8),…B­ó´äèÖñɾгªO£ïŒš7™÷™Çœš¡V¨Ù°õºwÆ#Ó¸àîî|ý rE(F53AÍKÞT7\²a3e¦ffTc ^X›O—E+:’- âZÁôcæ‰Ø}˿Ӵ««9¤£ž›s™ô™‡œ¡Ÿ§ë¯×¹.ŶÑ-ßOíÒûj Ì®&Ç3Ó?•JÔS`[aÎd~ff¨c/_ÉX–PÂF~;/›!iöèÚðÌÒÀûµ¥¬þ¤/ŸV›‡™Ë™!œ} È¦â® ¸ÑÃ:Кݭë*úÅ3)%^2>{IêR¬Z˜`d}fWfdß_¯Y­QHå<Š03#%ª ø–é”ÛOΠ·€­¢¥šŸ„›x™™š›¾ŸÔ¥¿­T·b°ÎþÛêƒø&¤²#1`=zHRZ<`odšf±f³d«`®ZÚRYIZ>2Ò$ÌP¨ù ëÝÏ1Ãÿ·B®,¦éŸ—›M™™ùšæžÊ¤ˆ¬öµåÀÍ[Ú^èÜöŠF"¿/A<ŒGcQ•Y÷_hdÐf#g_eŽaÂ[T¾JÞ?³3z&zú Eû©ìpÞäÐLÄê¸÷®¨¦( ˜›™ ˜Fšý¯£A«Š´[¿|˭جæ.õéØ v.#;ŸF­PY¸_fd gœgfybß\dU.LlAW5,(1­ íü;îåß5ÒqÅݹ´¯+§n ¡›Û˜-˜˜™–¢û©³Ï½ØÉúÖòävó<÷[-ô9 EäO‰Xd_Pd5gh´fRcì]ŸV‘MðBô6Û)èd šþ×ïhá–Ó«Æèº‹°Ë§Ó È›Æ˜Ú— ™Qœœ¡Ñ¨Ê±Y¼GÈVÕCãÅñ’[Ö¶+³8‹DÿNÛWî^d6g@h,gdÑ^´WÐNSDt8p+Š >oñìâÿÔñǼ{±‡¨Y¡œØ˜±—¨˜·›Î Ò§ ° »ÚÆÒÓ¯á*ð÷þÉ TL*i7gCNWY^¸cgShyg…d‰_œXåOŽEÏ9ä,›ÐüòkäiÖ?É1½~²\©ý¡…œ™³—r˜J›, §¡¯ä¹‘ÅnÒ7à¥îmýB ×á(63BøL.V¥]5cÃfZR7Hè<]0×"ù6÷¡è†Ú-ÍÞÀÖµP¬|¤„ž†š—˜Á˜›QŸ”¥®­r·®Â)Ï¡ÜÐêlù*¾Û$82>£I7S[&a9e>g*geÈ`›Z—RçH½=R1è#Ã.tøâéÃÛ`ÎÿÁà¶>­I¥+Ÿ›é˜æ˜úšŸ1¥ ­¼¶ÕÁ0ÎŽÛ¨é7øí¡# 1u= HRRXZ‰`Ådöfge a[/S¥I>Q2ÿ$íe±ùë÷܇ÏÃÚ·®ÿ¥ºŸi›"™ñ˜×šÊž¶¤|¬óµëÀ*ÍqÚ{èÿö²Fr"ê/i<¯G€QªY`hdÄf g;e]a†[ÔSoJˆ?W3&Ÿ ðú[ì.Þ°Ð'ÄÖ¸÷®¼¦R ×›e™™Áš‡žG¤ã«4µÀ(ÌUÙJç¿õhú*!¬.<;˜F†PÑXO_ÞcgfÝf'Wì IüºíŠßÒkź°¬§¡tœÓ™E™Ëš^žì£W«x´"¿Ë&Øæ`ôû‡·B-â9UE`OÏWv^3cíe—f,eµaD\ôTìKZAv5~(´_ ÌýDïá„ÓÜÆ]»B±¿¨¢+Vš™Ýš6žŠ£½ªª³#¾ðÉÖÖäØòdè­+^8ëCN¯V„]tbfeJfeâa¬\–UÅLfB°6Þ)3÷ sÿóðÀâ&ÕkÈм‘²ä©ö¢êؙۚçšž£ªÅ² ½ªÈiÕã4ñ±ÿ0d*Ì6wBÉLU•\½aêd fe#b,]RV¹MC8W+ʤ,®òväÍÖùÉ>¾×³ûªØ£“žG›šÓ𭆢B©Á±Ô»IÇäÓdá‚ïõýs ±d(F5AK…TÄ['a“dõeGeŒbÒ]2WÎNÒDp9å,qZéiô%æfØuË”¿µò«—¤ŸŠ›š–š2ΡS¨ž°„ºÓÅPÒºßËí;ü¿ Ö&Ø3Í?wJ S[¶``df“ec•^+XøO%Fç:w.! ™ö¼çåÙÓÌÉÀ¶Å¬3¥vŸ¯›ï™Aš¢œ¡Y§v¯6¹dÄÉÐ"Þ,ìú* ˆm%2¬>„IßRZd`Hd$fîe§c[_ YQgGF<ì/˜"‘‹÷$é3ÛÎÑÁä¶q­«¥ºŸ¼›Ç™ã™œH o¦f®¸ÃmϼÜÂê7ùÏ?=$~1¿=ÀHHR$Z-`CdPfJf1d`ûYRHv=+1á#ÜeÇøOêFÜ÷Φ“·ø­¦éŸ¾›œ™™“›¢Ÿ¦¥€­·ÂKΑەéø°0B#0ü<HËQÎYÿ_=drf“fŸd `«ZßRdIl>/2í$ëqÌùFë,ÝÇÏ]Ã-¸r®`¦ Ð›Š™X™<›,Ÿ¥Ó¬C¶2ÁhÍ¥Ú¤è÷ÄLl"Ø/L<‡GMQmY¼_dnf¯fÙd÷`[jSJ?ñ2»%ÀJ ¤úì÷݆РÄɸù®Î¦s  œ§™Z™"›öžÃ¤j¬ÃµŸÀÃÌòÙççXöû„¨!/š;âFºPíXR_Çc5ffÕdaN[´SgJ—?}3X&l cûÝì»ÞGÑÇÄz¹¯b§õ vœü™•™C›üž®¤:¬yµ;ÀIÌcÙEç§õ>¾Ü O.Ð:FPAX·^AcÆe9fšdï`M[ÐS Jí?î3â& µ 'ü®í•ß&Ò¥ÅUºo°(¨ª¡…šš”›.Ÿ¿¤*¬Iµë¿ÙËÖØžæèôkÛîZ-Ù9+EObWé]ˆb'e¸e8d°`2[ÚSÏJ@@d4y'Á… ý§î›à4Ó¶Æc»u±©Ž¢â4›’šÿ›tŸÝ¤¬µ¿VË/ØÕåôlÉÍ1,®8D÷MVVó\­ald!eÉck`[îSK­@û47(£… (þÕï×áwÔúÇ ¼¥²<ª‘£Æžô›*›kœ°Ÿé¤û«À´ ¿¦ÊV××äåò6wÕ*T7´B¸L.Ué[Ç`®c‘dic>`[)T~KLAÈ5-)¾À {ÿ:ñFãèÕeÉþ½î³i«›¤¨Ÿ¨œ¬›¹œÈŸÊ¤¥«5´M¾ºÉ?ÖãñÇÿôT)Ý5NAlKTæZñ_ c"d3cA`][ŸT*L+BÕ6d*4ÌòÚäv×äÊf¿7µŒ¬’¥m 7œÓœ¦Ÿl¤ «f³L½‹ÈéÔ'âÿï*þ^ R½'Z4ç?)JëRþY@_“bèc6cƒ`Ü[XUMMC#8Ö+¦Ø²~ô†æÙgÌÈÀq¶—­h¦ ¡–"œ²œFŸÏ£5ªX²¼#Ç`Ó„àKînü¤ ¢"&Û2Ž>üHñQ{2‡%Ð 7ûéìþÞ½ÑlÅJº‘°s¨¢ª6›Íšqœ ³¥!­=¶ØÀ»Ì¨Ù]ç’õþUN  -:?EOJW¿]MbÞddeÜcN`ÍZtSkJß?4#'r= ÍünîiàÓÆA»V±©s¢È›xšä›WŸ¿¤¬ö´q¿;ËØÀåóóeÊÙH,Ñ84D6N£VN]bád¡eRdû`­[ƒT£K;A€5¯( Ú gþûïâádÔÈÇP¼6²¯©è¢ž›=šp›«žà£óª¿³¾ÅÉÖ,ä]òÔHlù*§76ChMVë\ìaòdìeÕd³a–\™UßL–Bô64*˜hìÿpñ?ã£ÕâÈ>½ô²:ª<£žþšè™äšíó¢Ü©„²¾¼VÈÕ§âØðYÿÝ Æ)š6SB´LˆU \ØaeEfcerbƒ]®VNëC^8¬+å`ÓòŠäÏÖéɾ£³¶ª„£1žÙšŽ™Wš/¢É¨O±m»ïÆ›Ó,á_ïèý} Ñ›(“5uAL UV\Ãa6e›fìe-cj^¾WJO:EÃ9 -’`Ó7ôØåØ÷Ê¿[´>«Ø£OžÂšB™Ö™}œ(¡¿§ ° º‹Å%Ò­ßÞímü x]'w4€@)I¹RœZ©`ÁdÎfÇfªd„`iZzRßHÊ=u1 $ãø^êJÜïÎ’Ât·Ï­Ó¥«Ÿw›L™5™3›<Ÿ:¥­‘¶ÁÓÍÛé›÷BÉä"I0´<äG Q´Y÷_Hd’fÇfédÿ`[eSýI?æ2¯%¶B žúìö݇ÐÄ̸ü®Ï¦q œš™D™›Íž¤+¬xµHÀḃÙsçÞõ~*!¢.(;|FbP§X _¬c4fªf ebaÀ[BTKY@U4B'd iüãíºß9Ò¦ÅAºF°é§T¡ªœšm™êšsžõ£T«j´¿ôÊô×Äåô®4`é,‰9ÿDO…W5^übÃezfe·aU\UL™AÂ5Ö(É ;þ·ï‡áöÓIÇ»ž±©D¢^wšŸ™Ùšža£‚ª]³Æ½†É_ÖäRòÙ])+ã7{CµM\VC]GbNeHf/e bë\éU*MÜB37m*Ì•‘ñZã¸ÕòÈI½ù²9ª6£žíšÒ™ÈšËÊ¢¬©N²‚¼ÈÆÔXâ„ðÿ »f)96ôAYL1UQ\’aÙdfAe`b]¾V:N D¦8,ƒaëló-åz×™Ê;S´b«'¤Èža›š¶šu3¢Ø¨?±?»£Æ0Ó¥à¼î,ý« îª'˜4u@KTe[â`idèeVe·b^“WGOaE:˜-1 #¸9õòæ-Ù2ÌCÀžµ{¬ ¥nŸÈ›*š›š™¡¨2°º9Å¢ÑüÞíhûç 3& 3 ?ÆISZG` dÊeyec¹^mXWP F|;"/Õ!Øtôö£èÊڳ͠Áж|­Ó¥þŸœ=šoš¯œò "§¯¿¸ÐÃÐ\ÝRë³ù5o$–1»= H RÑYÃ_ÄcÁe®eŒcf_QYmQâGã<¨0p#"ø?êQÜÏäÂé·c®…¦v Wœ<š1š6œ@ ;¦®}·kÂ˜ÎÆÛ°éø–ûõ"90„<•G3Q,YW_”cÍeõe d`=Z‡R%IH>'2%¾3úÅëÀÝlÐÄç¸0¯§Õ {œ%šà™¬›€ŸI¥é¬8¶ÁÍ8Úèxö‘!õ.f;£FsP¢X_{cîePfŸdå`3[©SlJ­?£3&®O ºû:íß§Ñ"Åι毧¡‹œü™~™›µžO¤Å«ð´¡¿ Ë°ØŒæìô‡< Á-Z:ÄEÅO(XÂ^qcf·f;e³a0\ÎT´KA5(8Ö 5ý£îjàÔÒ(ƧºŽ°¨[¡œÉ™™ušåR£ ª©³?¾+Ê.×åkó­ôš,Z9ñD"OºWŠ^qcSf#gÜe„b-]óUùLqBŽ6‘)»T ¨þð®á÷Ó$Çw»-±|¨¡Žœ™¦˜Ó™T¢{©d²à¼¸È°Õ„ãíñŸN¯w+]8 D‚NMWS^pcŠfg{fTc)^W=NÏC8+=ÓcñöâÕ%ÈM¼Ó±ï¨Î¡–œb™A˜;™Jœ_¡_¨&±‡»KÇ6Ôâoð+ÿì eK*W7DCÔMÐV ^^c­fèggd_%XpOEd9,¶K‹Ãò?äJÖ.É-½‡²s©¢²œI™õ—¼˜œ›„ ]§°EºôÅÐÒ—àïÄý“ "$)Q6dBMKV¶]ߨíqüM ï (X5AtLÌUf]cÐfnhígRe¨`Z”QyGê;$/i!ÿ3Põ¤æ{ØËվݳpª¿¢òœ'™r—Û—bšøž†¥ê­ù·~Ã>ÐöÝ_ì/û Î'o4Ê@ÕKWU]cäf¯h[héeeaçZ‘RŽH=Y0¤";hyö¼ç{ÙÌ™¿|´èª £™>—}—Û™Lž¸¤þ¬ó¶dÂÏÃÜ(ëûùì¯ø%{3ó?KÅT³\ÀbÌfÂh™hPfôaœ[hSƒI!>|1Ö#v¦µ÷îèŸÚÍŽÀTµ«œ£{Y™L—_—‘™Ö¤:¬ ¶`Á÷Í“Ûëé¶ø¦nÂ$W2ç>/J÷S \@bwf›h h…fWb*\T_J?•2%·òù;êãÛGέÁW¶€¬Z¤žÂ™‡—k—m™ƒ™£Ž«9µhÀàÌbÚ§èd÷Nq#1·=IS9[—aûeMh‚h˜f›b\¿T*K@§34&ûF bú›ë>Ý–ÏêÂ|·†­<¥ÊžPšç—™—j™O4£úªz´¿ÖË:Ùfçöðµ"¿/s<íGñQLZÑ``eágFhŽfÂbö\GUÞKë@¨4T'5“ ºûùì›ÞêÐ.Ώ˜®-¦”ŸðšY˜Ü—{™.ã¢zªÍ³«¾ÜÊ Ø3æËô\» o.2;ÂFâP]Y `Âdpgh~fãbG]ÇUŠLÀA¡5m(fØ ýPîðß7ÒlÅÒ¹¤¯§X Š›Å˜˜†™ Œ¢õ©³Ñ½ÞÉ×ýäƒóId"-õ9›EØOvXI_-d gÎgyfc¥]TVCM¢B§6‘)£& fþ®ïKáˆÓ«Æùº­°ý§¡œ&™H˜„™Óœ%¢^©X²å¼ÎÈÖÕ·ã+òçžÍ+³8rDÏN’WŽ^¡c®f¦g„fOc^öVNšCÃ7Ë*õ‰Òÿñ³ââÔòÇ$¼·±ß¨Ì¡¢œ{™h˜n™‰œ§¡¯¨{±ß»¤ÇÔXâ¼ðoÿ%’j*f7CCÂM¯VÚ]c_fŽg¤f¥c¢^´WÿN°Dý8#,dX¡ò0äOÖGÉZ½Ç²Ä©¢"Å™y˜F™(œ¡ä§°ººZÆ&ÓÙà/ïÛý“ ó( 6B®LÈU%]Ÿbf‚gÓfdB_‰XPáES:—-î ö=ôÁåÍשʚ¾Ý³¬ª5£Ÿš˜™¸›g §q¯¹ûĨÑFߎí5üñ sr'¥4Æ@˜KâTu\'bÞeƒggˆdõ_rYQ&G¼;/Š!H¢äõZçPÙÌÙ¿ñ´«à£ž;šv˜Ê˜4›ªŸ¦N®1¸‰ÃФÝàë…úF Øî%@3ˆ?‡JTÎ[¼a°e”g_geº`kZHRzH4=±00#ùU÷÷èÔÚrÍÁÿµh¬‚¤wžeša˜w˜¦šâž¥"­Û¶†ÎýÛ/êÓøœ>m$à1P>}I.S/[Xa‰e«g³g¢eag[sSÍI©>@2Ñ$¤3ùˆêMÜÊÎF·8­¥ÖžˆšH˜#˜šž¤ü«Žµ¢ÀÍfÚè3÷·ÿ"’0)=ƒHeRZþ`ieÅgh/fCbZ\’TK @»3]&7“ ½úì®Ý ÐbÃó·ø­§¥+Ÿ¥š,˜Î—™_2£åªS´J¿ËçØ ç®õˆL«!\/<œG®QZ­`NeâgZh´fúb>]žUALYA5Ì'­ *ü_íõÞ5ÑhÄи©®(¦yŸ¾š˜€— ™°œW¢ä©1³ ¾>ʇףåHô*üq ?.;ÇFQ›Yb`5eúg¤h/g¡c^”VXMŠBb6)b }ý¤î$àJÒ]Å ¹P¯¢¦ÅŸÚšý—<—š˜œ¡ø¨%²æ¼É?ÖSäøòà¿G--):øE[PY`ehßh—g5dË^tWXN¥C’7^*O¬ ÂþÞïNá]ÓSÆuº°*§!  ›þ——A˜›ã '¨3±Ø»ßÇ Õã´ñž†,-9E O‰X¦_ÓdôgùhÞg§df_5X:O¤D©8ˆ+†êñ{âxÔWÇ]»Ç°Ì§› Z›#˜— ˜.›[ x§a°èºÕÆêÓåá|ðcÿMíö*!8(DÌNØW_qd½gîhÿgódÜ_ÓXüO‡E©9Ÿ,®;Qò¯ã ÕmÈ[¼¨±Œ¨7¡Î›m˜%—þ—ôšõŸé¦¬¯ºÞÅÚÒÀàHï&þ ±Å)ÿ6CÛMWn^ëcag¾hüge2`TY¦PVF˜:«-ÒS{—óóäÜÖœÉu½©²o©ö¡fœÚ˜g—˜Ùš¬Ÿt¦ ¯H¹óÄÐÑœßîáüÁ d}(Ä5óAËLVŸ]CcäfohÛg-er`ÂYAQGƒ;·.ù ‘ÉîôMæ1ØåÊ­¾É³pªÓ¢d™Á—;˜ÐšrŸ¦q®¸ļÐjÞÆì…ûZ ù'g4©@šKU±\bNf hªg1eª`/ZàQèG|<×/:"í9jöÍç¯ÙYÌÀµ—«Ô£ð š2˜v˜Óš<Ÿ›¥Î­«·ÿÂŽÏÝWëúÇ`%Û2/?:JÄS›[—a˜e‹geg'eÜ`›Z†RÄHŠ=1œ#nÑø}é]ÛüÍŸÁ†¶ê¬þ¤éžÌš¼˜Ã˜âš Ÿ,¥#­Ç¶æÁFΨÛÅéTø œ½##1‹=²HaRdZ“`Ídüfgea[m2!%“åùWë4ÝÇÏSøW®;¦ðŸ˜›G™ ™äšÊž¦¤\¬Äµ«ÀÛÌÚè‡ö0¾ä![/Ü;'GQ6Y_d…fâf*eea¨[TÄJõ?Û3´&ÄU °û!íõÞtÑåĈ¹˜¯J§È 3œ¤™'™Àšež¤«³´l¿sË‹ØoæØô{ = É-g:ÖEÛOAXÞ^cÕI[S1[-a1e(ggÑd`XZMR–Hg=ú0#kØ"ø•é|Û!ÎÉÁ´¶­0¥Ÿ›ï˜õ˜›9ŸW¥L­í¶ ÂfÎÄÛßékø®Ì#11–=»HgRhZ“`Édõf g eý`ùZS“I‹>?2î$ÞX¦ùëòÜ…ÏÃÝ·®¦ÂŸq›*™ø˜ÜšÍž¶¤x¬ëµÞÀÍ[Ú`èßöŽH"¿/?<…GYQ‡Yä_Pd´fg=eia[õSšJ½?•3b&hð Dû±ìƒÞÑuĹ5¯ð¦x ð›o™™©š_ž¤›«Ý´¤¿¹ËÝØËæ<õåy­ 8.Ó:gÎdT`æY¦Q½G`<Ê/;"úQŒö÷çÞÙ‹ÌBÀCµÇ«¤ž'šH˜ƒ˜×š8Ÿ¥¼­“·ãÂpÏùÜ9ëåù±Qx%Þ2~IHSc[¤aëe!h;h9f%b\#TJX?è2o%4€ŸùÞê‹ÜîÎPÂñ¶ ­Ö¤xžš¿—ˆ—n™hb£<«Ï´ç¿MÌ¿Ùøç®ö•`Á"o0#=™H˜RêZfaèe[h°hæfc%]aUâKØ@~4'Þ' :ûfì÷Ý8ÐqÃã·Ë­\¥Äž#š“— —͘‘œY¢ªs³l¾ºÊØNæõöÒM!/ø;œGÍQWZ aÊexh iygÐc!^ŠV2MIB6¯(ƒÌ ØüôímßÑ¡Ä縞®ú¥)ŸNšƒ—Õ–I˜×›l¡í¨1²½<Ɍֳähó_JÛÇ-Ç:•FöP³YŸ`–e~hHiðg|d_–WfNŸCy73*^ eþuïÚààÒÐÅî¹w¯¢¦œŸŠš‡—¡–ß—8› ð§ ±Ã»ÜÇÕ3ããñÝÓv|,›9EPY%`PemhmiIhe»_}XsOÍDÂ8‘+}ÐÖÿÜð2â"ÔõÆñºS°S§ Ýš¨—–œ—ÆšýŸ&§°±º®ÆÔÓßá‡ðÿy(?+v8ˆD6OIX‘_êd7hgithceD`2YQPÏEã9Ë,Ë+8>òãoÕ.ȼP±*¨Ì \›÷—­–…—|šŸ{¦E¯±¹‹Å“Ò‡àï þ ·Û)%7QC NYWÍ^TdÓg8izhŸeµ`ÕY#QÌF;.) µÀó åâÖŽÉV½w²+©¢¡œj˜ê–Œ—LšŸà¥y®¹¸jÄOÑ'ߨíˆüz 0](¹5ýAëLJVè] cRgíhghÃeaeZæQ¾G#

€1þ#ÁCø›éhÛôÍ„ÁY¶­¬²¤‘žjšS˜V˜sšžžÃ¤Á¬o¶šÁÎyÛ§éHø´å#\1Ñ=I¾RÈZû`6edgyguebaV[pSÚIÄ>j2 %ëV–ùøêÈÜPÏÕ˜·Ô­º¥vŸ'›ä˜¸˜¤šŸž’¤`¬àµàÀ'ÍvÚ†è÷È`" 0‰<ÏGŸQÇY`~d×fgDeba†[ÏSfJ{?F3&‡ ×úCìÞšÐÄÆ¸ê®´¦M Ø›k™™Ðš›ž_¤ÿ«Sµ*ÀLÌyÙoçãõ‹H!Ç.R;ªF’P×XO_ØcZfÉf"eoaÁ[8TùJ6@&4'´ ü…íXßÖÑCÅâ¹í¯˜§¡rœÚ™U™åšž¤‹«µ´e¿dËtØQæ³ôPÛ -*:–E˜OþWš^Kcøe•fe—a\ºT¤KA5(Cè PýÇî–à ÓfÆîºÝ°g¨·¡ñœ-šz™ÛšIž²£ûªü³ˆ¾hÊ]×&åzó˜Ì`, 9’D³N;Wÿ]Ûbµe€f6eàa\YUkLðA65)u' ”þ ðÐá4Ô|Çè»¶±©B¢P^š|™®šî*£Iª%³½SÉ2Öëã5òÇV•:+8¢CæM–V…]Žb˜e’fxePb)]VUMúBC7m*»sàÿNñãWÕƒÈϼx²³©®¢ŒjšW™Xšiz¢q©(²t¼ÈìÔ™âßðtÿ \*û6ÁB,MV%]^bšeÆfÞeäbé]W`N#D„8¿+Ò:œòCäyևɮ½.³<ª£³^š™è™Êœ¯¡~¨±A»ÕÆ’Ó6á{ïþº õ(ø5ãAyLƒUÑ\>b­e gUf‹c¼^X}O]EÔ9-~;ñóƒåž×ŠÊ‹¾ß³¾ªW£ÑHšÏ˜m™œØ §ò¯º‚Å/ÒËßî°üc ÛÎ'ó4AÇKÿT\bÂeUgÐf6d“_YŸPœF);ƒ.ì ©KõÈæÈØ“Ëm¿–´F«®£ô7šŠ˜ö˜x› ƒ¦Ò®Ç¸.ÄËÐ^Þ ìGû “ &å3@ KpT!\õaÌe’g@gÖd``öY¹QÔGz<å/X"oªöèûÙ§Ì\À\µÞ«¤)ž8šW˜˜âš@Ÿ•¥¿­”·áÂkÏòÜ/ëÙù¢@e%È2$?8JÌS­[³a¾e¹gšgaeaÜZÆRIÃ=D1Å#ŒãøréBÛÑÍdÁ<¶“¬š¤{žVš@˜E˜dš’ž¹¤º¬k¶šÁ ΃۷é^ø-×$1 >DIS[La‹e»gÒgÍe¹aª[¿S"J? 25%e–ùèê§ÜÏ“ÂF·s­K¥ûž¡šV˜$˜ šžü£Ï«WµbÀ·ÌÚ9è×ö¥Uœ"/0È<%H RJZ³`'eŽgÛgf0bT\šT)K3@ï3Ÿ&†î $ûrì'Þ‹ÐåÃx¸~®*¦©Ÿ›™˜0˜à™¢c£«\´=¿n˯ؼæKõÂ!µ.f;ãFðPXYñ_™d6g½g)f„bß\ZULOA35(} ¼ü îºßÒUÅʹ«¯-§| »›™_˜Õ™]å¢Oªu³(¾/ÊN×?åºóu"v&-ì9…EµOHX_ëcÀf€g(f¾bT]VúL`Bn6b) \þ±ï\á¦ÓÖÆ0»î°G¨f¡qœ€™¢˜Ý™)u¢¦©–²½ôÈíÕÀã%òÑyÏ‹+e8DmN*W"^2c@fÆêÒà¶îHýç H!(*5AÂKÝTA\ÆaPeÎf7fcâ^KXéOêE:é-c 5© õ¤æÁتˢ¿ç´±«0¤ŠžÞš=™°™6œÀ 8§{¯`¹³Ä9ѲÞ×ì`û n]&…3£?vJÉSi[0aÿdÃfrfd¥_KY"QUG< /2"ŒèörèwÚ>Í Á¶²¬õ¤Ÿ›;™k™¯›ûŸ9¦I®¸-Ã•ÏøÜë˜ù?¼Ã$ 2R>TIÛR´Z¶`ÄdÇfµfŽd^`:ZBRŸH„=)1Ð#¼7ø êøÛ ÎIÂ2·”­¢¥„Ÿ[›;™1™<›RŸ^¥@­Ï¶ÚÁ'ÎwÛ…éø´=Y#½0$=NHR ZA`„d¾fâfñdó`ÿZ2SµIº>y22%*ªýùnëKÝÛÏfÃ+¸d®E¦øŸž›L™™êšÐž¯¤i¬ÔµÀÀõÌ3Ú5è²ö`ò"—/c_ Y/Q­G¹<‰0_#},¶øfê†Ü]Ï1Ã@¸Ã®ë¦à Âœ§š™š˜œš Š¦J®±·Â«ÎÇÛžéê÷_³œ"Ñ/<G¬P XÉ^cDete–c´_ãY@RòH+>!2%F Œú3ìAÞþЮǹâ¯Ò§Š¡,Κ}š9œúŸ­¥5­i¶ÁÍÚÖçöŒêå 7.™:ËE”OÀW&^¤b#e–eúcX`ÃZXSV]beöeÓd¥a}\tU±L_Bµ6î)Nÿ"ñóâ[՟ȽÀ²ª£ žóšé™ñšž£ª¹²û¼™ÈWÕóâ&ñ§ÿ)c *Ø6‰BáL«U¹\æae˜Z˜‘šÖž¥+­ð¶0²Î4Üpêùî–É$=2­>×I‚S|[›a¿eÒgËg¨euaH[ASŠIT>Ú1^$$w£øõéºÛ;ξÁ„¶È¬½¤‹žSš,˜ ˜/šPžk¤c¬ ¶7Á§ÍÛRéý÷Ñ‚Ä#K1Ò=IâRýZ@a‰eÃgâgæeØaÎ[çSMJ0?Ì2`%2ŒºùëÃÜ6ϦÂU·}­R¥þž¢šU˜!˜ šžú£Î«XµeÀ¼ÌÚDèåöµg¯"C0Ü<9HRZZÀ`/e‘gÙgf!b>\}TK@¾3g&J® àú.ìâÝGÐ¥Ã<¸H®ý¥„Ÿ›‹˜.˜ë™»‰£7«ž´‹¿ÇËÙ(ç½õˆ<‹!,/Ø;MGOQ«Y6`ÍdXgËg#fib°\UÁKä@¶4v'jÚ ü^í ßdѯÄ.¹¯°¦ g›Æ˜=˜Ï™t£žªß³«¾ËÊþ׿‹ôPY .Å:SFrPðX¡_`dg¶g;f­b]®U€LÅAµ5Ž(• QýŸîFà“ÒÌÅ3º°v§³ ß›™\˜Á™7¯¢ ª%³Î½ÎÉçÖÕäPó ¾Ð, 9DE€OXõ^Ýc¿f‹g>fßb~]8V2MœB­6¡)¿L •þæïŠáÍÓöÆH»þ°O¨g¡kœs™˜Æ™Y¢‰©z²ý¼ÜÈÙÕ°ãòËxÔ•+t8-D„NCW<^McZfSg4fcÏ]µVÙMiC›7­*âÖÿ+ñÎâ Õ#È_¼û±,© ¢üœÙ™É˜Ñ™ëœ¢ ©Ò±/¼ëÇËÔŠââð‡ÿ/W*D7C„McV‚]»bóeg+f)c$^7W…NîËüh ʦ'´4°@]K‚Tð[‚ae¥ffcâ^WXPF¯: .¢ {ôZõ÷æÙÿËö¿:µ¬}¤Óž"›{™é™gœê Z§–¯s¹½Ä:Ñ©ÞÅìEûÜ @&&F3\?)JuS[Ó`Ÿdbff±cK_÷XÕPGÝ;r/"Šöö‘è¦Ú|ÍYÁ|¶­i¥ŒŸ£›Ã™õ™8œ€ ·¦½®g¸…ÃÜÏ,Ý0ë ù1–‡$¹1ê=ÙHNRZ`dffÞcµ_Y³Q#H=Û0›#¤<°øJêUÜÏÚÂÙ·N®k¦X 5œš š œ ¦Û­P·=ÂjΘۂéà÷hÏÉ"0[T29%] …úì ÞÑÐwÄQ¹š¯„§9¡Ùœzš*šé›¯Ÿh¥õ¬1¶ëÀëÌôÙÁç öŠïó K.³:êE·OçWO^ÎbNeÀe$d€`éZ{S]J¾?Õ3ß&!á iüîýßœÒ'ÆÝºú°±¨,¢ŽíšYšÓ›TŸÉ¤¬µœ¿nËOØþå3ô¥ },9[DTN¶VX]bÖdŒe5dÖ`‚[TTqKAM5(ൠJþçïØáfÔ×Çj¼\²á©$£Hžf›ŽšÄ›Ÿ4¤C« ´X¾ûɶÖFäfòÌ-?º*W7ÔB÷L‹Ud\^a_dXeCd(a\$U{LEB¹6*zºñ¤ã!ÖwÉé½±³«¤úžÚ›Ášµ›°ž¤£vª³ ½—È-Õ â«ðÿe  )À5_A«KoT}[±`ïc'eSdwa¢\íUzMvC8+*)ÓtóWåÄ×ËS¿ó´¬ñ¤¢ŸFœðš¥›cž£´© ²ú»GǺÓá ï\ýº Ûv'D4@uJfS¦Z`‡cúdbdÁa&]§VgNDV9ó,§·k õéæGÙmÌ À¶­¾¥; ©œ›–›žœ¢©*±ìºÆgÒ¨ßíØû5 ]&ê2Æ>\IvRãY_*cÔdrdbŸ]RW@O“E|:7.!!Ý€öUè¤Ú¶ÍÌÁ&·ù­v¦Ä =›†›Ø'¢]¨Z°ô¹úÄ2Ñ]Þ6ìvúÒ¸$±1§=^HQ4Yü^Øb²d‚dHb^ïWPF‰;_/>"l0Ô÷¢éåÛãÎà¸ˮ §C¡Q`›y›œ¾¡É§ž¯¹úÃÐ.Ýùê1ùŒÀƒ#Ž0œdŽdÕb_qYùQÖH9>Z2u%ͪ Uûí=ß ÒÊŶº ±ø¨ª¢@žÒ›k›µ J¦°­Á¶OÁ"ÍþÙžç¾õR2 k-¹9ÛD—N¼V]a"dždc_Z®R®I0?i3˜&þâ ŽüKîeà"ÓÈÆ—»È±©£‚žæ›R›ÈœA «¥é¬×µFÀÌÈØ\ætôÉþL,´8÷CÙM'V¶\dadÇdjc `¶ZŒS±JQ@¤4å'W@ éýï¥áKÔÓǼ‰²$ª}£¶žç› ›dœ­Ÿê¤¬Ê´¿ºÊo×÷ä óc³²+7C M…UC\"a déd¾c`h[hT²KtAá58)¸© SÿñüâÕýȉ½m³àª ¤Ÿœ›+œCŸP¤9«Ù³¾†É"Ö—ã ñòÿEMÃ)`6âAL°T›[ª`ÄcØdácä`ð[ U–L€B7ƒ*Í{òpäôÖMʽ¾´Ê«É¤¢Ÿnœ?›œüžÕ£‹ªý²þ¼ZÈÖÔ2â(ðpþÀ ÎP(5ž@íJ¶SÍZ`\c¦dçc"ae\ÉUpM†C>8Ó+…™W ôùåqØ¶Ë À«µÍ¬ž¥D Ûœt›œ¾ž_£à©²ñ»%ÇÓ¿à¢îÞü* =Ì&’3L?¾I±RøYl_òbvdòcgaä\VYNžD96- )ò§õ‘çúÙ(Í^Áضέn¦Þ ;™›ÿ›kžÑ¢©&±ÊºÕÅÒ5ßí9û… Ÿ@%2û=•H·Q2YÞ^Ÿb`ddËaƒ]UWcOÕEÝ:´.™!ÏŸQ÷0é…Û—Î©Âø·½®'§^¡~ž›Æ›õ ¢3¨ °…¹jąЗÝ[ëŠùÛ»#º0¼<ƒGØPŠXr^pbodfdUbE^MX‹P'GQ€I$S[5aZergrgYe4a[!S}I\>ù1’$nÕùwêIÜÕÎ_Â)·l­[¥ ŸÚš¡˜˜vš{žy¤R¬ÜµæÀ8͑ګè?÷¢Ú"]0å<2H R7Z’`ødSg—gÁeÝaþ[ATÐJÛ?œ3P&>® ìúDìÞoÐÔÃo¸~®2¦¸Ÿ1›´˜N˜šÆˆ£(«´`¿ËÎØØæeõ)Ø%!Ç.v;òFþPgY`¨dGgÎgÅ«¹…¯ÿ¦G ›À˜˜Š™•¢ª)³à½îÉ×å–ó]{;-:¹EùOšXp_Wd6gþg«fDcÚ]‰VxMÔBÖ6¼)ÉF ~þ¾ïQá„ÓÆßºˆ°Í§Û Ö›Ù˜ó—(™rœÁ¡ù¨ó±ƒ¼qÈÕiãèñ°uéÃ+¹8ŠD÷NÊWÖ^÷cghüfÍc™^zW–ND<8;+ZàRñ×âóÔïǼ±£¨~¡Cœ™ï—ì˜ÿ›¡ ¨î°V»#ÇÔíá`ð#ÿë kW*g7WCêMèV$^wcÆfÿgg$d$_6XO+Eq9Ž,ÃY›ÕòTäbÖIÉL½ª²™©H¢Þœv™"˜é˜Æ›¬ €§°\ºÆÔÒ‘àðî¨ýl îå(6BÅLéUP]ÒbTfÃggVdŒ_ÑXKP$F‘:Î- ÈSôÎåÐףʌ¾Ç³ª£vÚ™P˜à˜†›6 ×¦F¯X¹ÙÄŒÑ0ßí-üï x}'µ4Û@±KÿT“\Gbþe£g.g¢d `…Y,Q/GÀ;/‚!;‘ÎõAç4ÙðË»¿Ò´p«Å£÷'šg˜À˜0›¬Ÿ¦]®G¸¤Ã:ÐÉÝ ì°ús &j3°?ªJ"Tå[Ìa·e“gUgeŸ`HZRHHý—I:S.[Ialeg}g`e6a[SpIJ>á1u$L°ìøMêܪÎ5·G­;¥ŸÅš“˜y˜wš„ž‹¤k¬ýµÁeÍÃÚáèx÷:Ü#‘0=[H+RPZ¢`þdNgˆg¨e¹aÐ[ T“J˜?T3&ód ¥úìÇÝ=ЫÃS¸n®0¦ÄŸJ›Û˜ƒ˜CšžÝ£…«ã´Æ¿õË2Ù8ç¾õx[!í.Œ;öFðPFYÍ_cdñfigÊebo\åT£KÙ@¿4•'ž" müÌí‰ßîÑCÅɹ»¯N§¬ ù›L™´˜2šÁL£¸ªÝ³Œ¾ŽÊ¥×ŒåüóªIŽ/-æ9oE‘OXÒ^¢cnf'gÊe]bó\§U L B"6 )Jç Bþ§ï`áºÓùÆ`»+±¨¹¡Ìœá™™BšÖ¢ªé²`½0ÉÖßã4òÐg­X+#8ÊCNÃV³]½bÇeÂf©ebZ]QVˆM.Cy7¥*ô¯ñHã™ÕÆÈ½¹²ñ©è¢Á˜š|™tšy}¢e©²J¼äÇ Ô<ârð÷þ Äv)Q6B{LXUz\¼ae@fje‡b¥]ÞVVN8D¹8,Žiïmó,åwוÊɾO´^«$¤Çžb›š»š|<¢â¨J±J»®Æ:Ó­àÂî0ý« é '‰4a@ëJðSA[¹`qIžRZË_‡c?eêd‹b,^æWØO-F;Í.“!ª]ôöºèùÚùÍýÁB·®i¦¡ Éœòš(›h§¡Ï§À¯Q¹PăЭ݉ëÎù3m2$;1E=HhQYú^ïbädÎd­b^‚X­P6GN<.0#D¥øjêžÜ‹ÏrÔ¸)¯`§c¡P>›5›79¡&§à®>¸ÃÏ*Üïé&ø†Ä–"µ/Ü;ÍFOP0XI^xb©dÑdíb _8Y˜QRH”=˜1š$߬Mú ì2ÞÑÏÄʹ2°7¨¢¶g›!›æœ­ b¦è­·ÂÁ®ÍŸÚSèöá' !C.Œ:¥EUOkW»]%b“d÷dOc¥_ ZžR…Iî>3*&~R ñû¤í·ßpÒÆçº±î¨¢ùm›êšsœ €¥Õ¬Ùµ]À,ÌÙ®æØô<‰Þ,L9‘DsN¾VH]îa™d:eÏc^`úZ½SÎJ[@›4É'( ˜ý=ï9áÓÓRÇ÷»û±•©í¢)ž_›Ÿšì›AŸ‹¤¯«‰´ê¾Êf×å(ó“ö|+8‚C–MVÝ\Àa©d‡eWdaï[ãTLÎA(6j)Ô® @ÿÕð¹â4ÕȽز:ªY£YžR›Všh›…žš£ª@³½ÉÌÕ\ã‚ñòÿd‹*Ù6vB¼LsUp\Ža±dËeÕdÓa×\øU\M.C£7ø*mIÕ]ò+ä‰Ö¾É ¾¯³ÞªÆ£žM›šòšÙ½¢…©²,¼ªÇLÔÑáôïjþé %Ô(±5wAéKÓT\Xa´dfDewbª]÷VNtD9j,êÉQÌó‡åÊ×ÞÊ¿}´|«2¤ÄžN›ã™‰š?ô¡’¨ö°óºXÆèÒbàîûü„ Ó›'—4‚@K5T—[a¬d1f£ecf^ÝWŒOEE:¿-J .´%õÏæûØòËö¿Gµ¬£¤Ÿ^›Á™7š½œG¡½§ü¯Ü¹'ŤÑß+í§û8 –s&Š3•?VJ•S"[×`•dHféexc_¡XrP¢Fc;ï.‡!qöaöþçÚôÌÛÀ ¶¸¬¥MŸz›°™ú™Vœ· §&¯è¸ćÐéÝûëvú xg%•2¼>ISµZ’`zdXf#fÛcŒ_MY>Q‰G`<þ/¢"’{÷ éÛÛͦÁµ¶A­z¥‰Ÿ››™½™ò›. ]¦]®¸$ÃÏÖÜäê`ùÿuw$»1ý=þH„R]Za`qdwfifGd`ýY RoHZ=1³#¦(…øêýÛ­Î\ÂK·³­Ç¥¯Ÿ‹›q™l™{›•Ÿ£¥ˆ­·$ÂrÎÁÛÎéNøö{#î0N=pHRZF`~d¬fÅfÉdÀ`ÁZëReIa>2Í$À=ùëàÜtÏÃÑ·®¦¿Ÿr›/™™ìšäžÔ¤ž¬¶ÁXÍ£Ú°è7÷샰")0¨<ìG¼QãY7`˜dîf.gVepa[ÓScJp?43î%ã[ ¢úìÐÝKпÃk¸‹®Q¦êŸu› ™¶˜zšMž¤È«)µÀAÌ€Ù†ç öÆg£!0/É;+GQgYâ_ldìfVg¨eéa/\–TFKo@J4'• Ýû;íúÞeÑÁÄR¹Q¯ó¦d Å›.™­˜DšêŽ£«N´¿(ËPØEæ¿ôtZ ö-£: F0P¡XE_úc©fCgÆe8b­\AULkAg5O(fõ Fý¥î_à¾Òƺ_°Ü§#¡VœŽ™Ú˜<š¯£qª³¾Ê×éäPóø•Û,@9ÕDOšWh^Mc/fþf¸eab ]×UãLbBˆ6”)Éo Ðþ7ðñáHÔ‚ÇỢ±ú¨¢š2™\š•̢橾²'½éÈÉÕƒãÐñfù>ë*¸7dC²MlVf]|b’ešferbY][VŸMPC¥7Ù*1ñe×ñ“ãäÕÉX½û².ª£ð¿š›™Ššˆƒ¢c©²9¼ÍÇ„ÔâNðÑþY œO)+6íAZL9U_\¥añd2f`eb£]ßVZN>DÂ8,˜sùvó4å}ךÊ˾P´]«!¤Âž\›ÿ™´šu6¢Ý¨G±J»°Æ?Ó¶àÎî?ý¾ º'¦4€@ KTb[Ú`[dÓe;e–bò]gWO-EÜ9`-ùìƒõÇæ ÙÌ/À”µ|¬¥†Ÿë›XšÔš]å¡V¨°_º›ÅÒ^ß_íÁû8 z=&93+?ÔIÿR{Z!`Ôce e²bD^íWÎOFé:.D!Mò}ö:èsÚoÍrÁ¹¶}­í¥1 fœ šèš=’¡Ñ§Ù¯‚¹˜ÄâÐ!Þìdú×ç$ó1ü=ÃHR´Y…_gcDeeØbš^rX~PéFä;¨/u">Í÷‡é¶Û¡Î¸·Z®¤¦¾ ÇœÒšëš8¡K§+¯®¸¤ÃÓÏûÜÚê&ù–Þµ#Ò0ñ<ÔGBQ Y_ceecö^÷X*Q¸GÑ<¯0#¸pù¶êÚܵϋÚ¸¯B§6¡öšäšÞœÜ Ç¦‚®ä·¼ÂÓÎéÛºéÿ÷mº›"É/þ;üF‰PtX”^Èbüd#e=cS_{YÑQHµ=ª1$Ò‘#úÓëìÝ·ÐvÄk¹Ï¯Ó§¡¡X›Õš§œ| B¦Ú­·ÙÁØÍÜÚ¡èßöMŸ‹!Ê.;-FÙOçW,^ˆbäd4exc¶_Z~RLI>©2®%ðµ GûóìߺÑdÅ>º‚°b¨ ¢š(›Âšiœ ´¥(­I¶éÀÑÌÂÙzç±õum ¼-:REOPW½]CbÊdGe¶c`–Z6S&J–?»3Ô&#ð „ü*î-àÕÒgÆ$»G±©¢åF›±š+œ«Ÿ¥i¬gµç¿´ËØ9æhôÓ/2”,9`DON¨V?]òaªdVeõcŽ`1[ûSK¢@ä4(rG Ýý~ïuá ÔƒÇ!¼²±©£7žf› šç›6Ÿz¤š«p´Í¾}ÊC×ÜäókÎÞT+é7\CrMöU¼\¢adneBd aá[ÙTLÌA+6q)ྠTÿîðÖâUÕ°È+½³dª„£„ž}›š›©ž»£¬ªX³‘½#ÉÒÕ[ãzñäÿOpþ)²6KBLBU=\Ya~d™e¥d§a¯\×UAMC—7ô*qVêzòOä´ÖîÉ@¾ç³«¤Çž…›Lš"›žà¢ © ²4¼¨ÇAÔ¼áÕïCþ¹ ï™(q54A¦KTÃ[a|dÔeeXb–]ïV„N‚D9,’ôÔåØ0ËV¿Ë´Æ«u¤þž~›š¡šHð¡¨Ô°ÄºÆ Òà&î™ü k4'34#@ÈJéSW[ì`‹d!f¥ec^XÕOöE¬:1.Æ °9¬õSçyÙgÌ_À¡µe¬Ù¤%Ÿh›´™š‚œõ V§‚¯Q¹ŽÄÑgÞ}ìøú ôÞ%3#?úIRSûZÌ`§dyf7fãcˆ_>Y$QfG4<Ê/g"QÐ1÷¿èÅÚ‹ÍVÁf¶ó¬.¥@ŸG›Y™€™º›üŸ1¦8®è·ÃqÏÐÜçêlù“$ê15>>IËR«Z¶`ÊdÔfÉf¨d}`]ZhRÇH«=P1ô#ÜS¢øêþÛžÎ>·w­|¥WŸ'›™ó˜ûšŸ¥þ¬¶ ÁôÍLÛdéñ÷©?g#Ø0L=ƒHBRVZ–`ád!gJg[e]ag[–SJ?Ã2p%ZÊ úmë8Ý·Ï0Ã䷮᥇Ÿ"›È˜†˜]šCž$¤â«UµLÀÌÙÙìç|ö>å$"³/K<ªG•QÙYK`Êd=g™gÛe bB\˜T7KP@4×&Ê< yûÍì…ÞëÐEÄÕ¸Ö®}¦ôŸ]›Ð˜[˜š¶j£þªK´!¿Hˀ؅æõÏ}Ê m.;žF®PY»_idggfubÚ\]U%LbAM5#(*© ìü?îïßFÒŠÅÿ¹Þ¯^§ª å›'™˜ï™qó¢Vªv³"¾$Ê<×'åóSüLù,¼9SEƒOXÞ^»c“fVgf›b6]íUçLSBf6`)„ mþÈïxáÇÓüÆY»±v¨˜¡¤œ´™Ö˜šZ¥¢Ó©À²>½É ÖÖã5òÚ{Ê+Q8ÿCKNWò]übfüfÜe¬b}]hV”M-Ck7‰*ËyÜÿ@ñòâ;ÕbÈ«¼R²Œ©‡¢gHš8™=šSh¢c©²n¼ÈêÔ˜âÝðqÿS *é6©BMäUû\/bfeŽf£e¨b­]ÌV*NóC[8 +ËB³òjä±ÖÏɾ•³±ªˆ£?žòš°™‚šbB¢©‘±°»0Ç×ÓcáŒï þ‘ ×(v5FAÃK¶Tñ[Oa´dfWe’bÎ]$W¶N°DG9µ,<!¯/ôîå5ØKËs¿ê´ç«™¤&Ÿ©›5šÐšy ¢®¨±ëº<ƸÒà)îü Eþ&í3Î?cJvS×Zb`øcˆe ebö]†WQOEI:ä-‘ —<Íõ“çÙÙåÌûÀX¶4­½¥ iœ¼š›‡ð¡A¨X° º)ÅvѵޟìíúT ŠF%@24>æHR«Yg_5ceÀdvb.^þWPqFo;9/"6ô•÷aé¤Û£Î£Âá·–®ñ¦¡-B›`›ˆ®¡¼§“¯ ¹ñÃÐ$Ýíê"ù{¬m#u0‚E2j%͵ kû8íhß@ÒÆ÷ºN±=©í¢€ž œœ›5ΠT¦«­«¶(Áê̵ÙFçWõŸÕ®ä,19UDNFV¶\EaÜcndøb‚_ZäRþI˜?é3.'¦š Rýï4áðÓÇT¼v²*ª›£êž0œ{›Ïœ% l¥ˆ¬Uµ¥¿BËñ×påyóÄôH+½7C MsU"\ô`Ïc¦dsc<`[T\KA‘5í(tl ÿÕðÙâtÕëȽk³äª¤#Ÿ'œ0›Dœ]Ÿk¤S«ô³¾ É;Ö¯ã·ñ ]fÝ){6ÿA.LÒT¿[Ð`ìce da\GU»LŸB*7–*$ÃfòNäÆÖÊw¾.´n«d¤5Ÿü›É𤛇žd£!ª²ª¼ȤÔâð~þå ¤(l5AK[T€[Ë` dne­dáa]oVNDŸ8,§™3Âóåä× ËA¿È´Ô«•¤1ŸÂ›\š›»o¢ ©g±^»¹Æ>Ó­à¿î+ý¦ æ '4j@ùJTY[Ö`[dØeDe¢bÿ]tW#O6Eá9_-ñÜiäô˜æÐØÒËâ¿@µ ¬µ¤#Ÿˆ›ö™wšš¡¨]°Bº‘ÅÒß—íü ôÊ&×3×?J¿S?[ä`“d7fÈeHcÅ^TXP­ISàZÉ`¼d£ftf1dæ_¨Y—QßG±I¥RƒZŒ`Ÿd§fšfxdL`+Z6R–H|=#1Ë#¹6Žø êüÛ¨ÎTÂ@·¦­¸¥ŸŸ{›a™\™l›‡Ÿ–¥|­·ÂiιÛÅéEøìp„#à0>=]HRZ-`cdf©f¬d¥`¨ZÔRRIS>2Ë$ÆJ¤ùëݤÏ=ø[®L¦ Æ›„™V™=›0Ÿ¥Ú¬J¶9Ánͩڦè÷ÀFb"Ì/=I`RúYÁ_—cie-eäb›^hXjPÌFÀ;}/E"\ ˜÷SéƒÛqÎa·6®†¦¥ ²œÃšàš 4¡J§+¯¯¸¥ÃÓÏúÜ×ê!ùÔ©#Ä0á<ÃG1QúXõ^ceecü^Y?QÕGö<Ü0Å#õ³Jùë+ÝÐÜÃé¸g¯‡§r¡G›üšèœÕ °¦Y®ª·qÂwÎ~ÛBé{÷á'"2/j;mFPûW*^qb¹d÷d)cZ_œY RÖH%>22:%‚Q ïú¨ìÅÞÑJÅ6º‹°}¨5¢Ón››Âœu ¦‹­ª¶FÁ'ÍÚ¼ççõFŽv ¶- :.EíNWt]ñardëdXcÂ_;ZàRØIQ?‚3§&à ƒü8îJàÿÒŸÆh»”±X©Ü¢Dž¦››ˆœ m¥¯¬¡µÀÓË Ø:æYôµøM,½8DïMCVÙ\aGdùdŸcA`ðZÇSìJŒ@Ý4(‹p þÃïÅáeÔæÇ‰¼‹²ªn£žžÇ›øš5œwŸ®¤¾«ƒ´Ð¾oÊ$×­äÄò v|ê*y7éBþL„UN\;a/deücÖ`º[ÃTLÙAJ6 ) ¯ÿTñDãÉÕ)É¥½y³Ùªó£éž×›ÌšÎ›×žÙ£¸ªQ³x½øÈ–Õã ñ~ÿß ø)26ËALÊTÍ[ô`$dNejd~a˜\ÓUPMI{R-Z `ùcße¶e}cA_YQ€Gp<&0â"è‚ú÷›é°Û€ÎQÂa·ê­¦ œšš5œV g¦I®Ó·ÔÂÏNÜCêªø7Ÿ—#Ø0="H²QœYµ_Þcffd`ZIRÒHá=¯1{$‰"‘ù ëÝËÏuÃX¸¯®«¦w 1œò™Ã™§›”Ÿu¥,­¶rÁ™ÍÅÚ³è÷°)9"˜/<3GóPY__¿cfdfšdÅ`ûZYSJ2?3ñ%Ÿ û…ìjÞüЂÄ=¹f¯1§É OœÛ™x™)›æž›¤*¬mµ3ÀDÌbÙIç±õNÖü w.;ZFEP‘X_£c0f«fejaÉ[LTK`@Y4A']õ TüÆí–ßÒtÅ º °©§¡jœÅ™4™¸šJž×£C«h´¿Ë%Øænô§áu-:šE¬O!XÌ^‹cFfíf~eb…\)ULqA{5o(‘) ýåî¢àÓKÆ¿º›°¨R¡~œ®™ò˜Mš¸"£nªw³¾ûÉ×ÜäEóð’ÞŠ,N9êD O»WŽ^wc[f,gåeŒb4]÷UüLpB‹6‹)³J œþõï¡áëÓÇn»(±{¨”¡—œŸ™º˜î™4|¢©©—²½óÈíÕÁã)òÙ„à +~87DNLWE^UcafYg9fcÏ]±VÑM]C‹7˜*Èb±ÿñ âÖÔíÇ'¼Á±ò¨æ¡Äœ¥™™˜§™Èœí¡ú¨Ì±4¼üÇçÔ²âñÆÿyà±*¥7wCìMËVè]cOfngtfecR^UW“N8D{8˜+ÓtÃò¤ãËÕÎÈð¼m²~©P¢ Ä™’˜y™tœu¡a¨±`»ÇêÓ§áð±þe Õ³)¹6£B2M1Vo]Éb!fgg”f¬c¾^åWCOEa9”,Þ‰Þ*ó¸äÔÖÆÉÒ½6³)ªÙ¢nš¨˜g™:œ¡Ú§k°˜º-ÆïÒšàéîýC ¶ž(³5±AZLvU×\UbÔeCg™fÛc_dXçOÌEF:‘-ñ« Yôäåø×ÜÊÔ¾´óª‚£ð\šØ˜k™œÁ ]§Æ¯Î¹CÅèÑ|ß¹íTü vf'‰4›@]K˜T\Áakeg‹fücf_âXPœF;;¦. !î[±õ>çKÙ"ÌÀ6µë«U¤šžÙš$™†™ú›v á¦¯ö¸CÄÅÐ;Þ`ìêúŽ õ%%3J?'JƒS-[ÿ`Ød§fbf dª_[Y=QyGD<×/r"[Û>÷ÎèØÚ£ÍsÁˆ¶­\¥sŸ›”™½™÷›8 i¦k®¸/Ã†ÏØÜßêTùêWO$Š1Å=¾H>RZ`%d.f%f dê_ÙYöQkHi=)1ë#ô‹üø’ê—ÜTÏøo®‚¦e 7œšö™ï›ïŸà¥¤­·ûÁ$ÎPÛ9é˜÷"Œ‹"Ö/)‰2o%“= ¸úNìKÞ÷ЗÄk¹®¯‘§?¡Øœtš𨛙ŸO¥Ú¬¶ÎÀÎÌØÙ¨çõõvàç D.°:ìE½OñW\^Ýb^eÑe5d`÷Z†SeJÁ?Ô3Ù&Ð SüéíÞßyÒÆµºÑ°ˆ¨¢iÍš>š¿›GŸÅ¤¬'µ¶¿‘Ë}Ø5æsôíXhÕ,Y9´DªNW¢]Wb e·eRdã`[?TKKÐ@5'(yA Êý^ïIáÔÓCÇٻѱ^©­¢à›Lš˜›íž9¤a«A´ª¾eÊ7×Ýäó„ò Œ+)8£C¾MEV ]òaÛd¹e†dJa\U7LàA26l)Π +ÿºð˜âÕeÈÛ¼­²ª1£4ž2›;šU›xž–£”ªM³”½4ÉðÕ‡ã²ñ'œÅY*7­BîL¡U—\¬aÇd×e×dËaÄ\ÛU4MýBi7¶*%ü† òÚã:ÖsÉÆ½q³¨ª›£mž9›šøšìÝ¢²©G²p¼÷Ç¢Ô.âUðÎþN ‰6) 6ÌA6LU:\aÎdfAecbˆ]ÆVBN(D«8,€YÝWóåX×pÊž¾´*«ì£Œž%›Ê™šG¢¼¨0±=»¯ÆKÓÐà÷îwý U(5û@KTó[laìd`fÁec`^ÅWaOaEù9c-á¹4žôBækØaËh¿½´™«*¤—žþšq™ø™‘œ.¡·§ °ÿ¹^ÅïÑoß™í#ü )'+49@úJ6T¾[jaeÂfSfÐcG_ÏXŠP¢FK;À.A!…ÝõhçsÙDÌ"ÀJµö«U¤žÄš™^™Ë›@ ¦¦Ý®º¸ ÄÐÞ=ìÔú†  &O3†?uJáS›[za_e6göfžd=`çY¿QíG¦<#0¥"sÕ÷‰èsÚÍÒÀ̵G¬s¤{ž|š˜¶˜÷šEŸ‰¥¤­j·ªÂ)ϦÜÜê€ùGä %r2Õ>òIS|[Ža§e¯gžgse9a[úR?I>Œ1$×-\ø²ézÛΈÁT¶ž¬˜¤lž:š˜˜&šLžn¤k¬¶IÁ¿Í:Ûué&ø·þ#‹1>bI0SP[•aáeh:h;f*b\-TŠJd?ô2{%>ˆ¦ùãêÜïÎNÂФqž š¸—‚—j™fc£@«Ö´ó¿\ÌÒÙèÉö³€ä"“0F=¼H¹R [aÿekhºhéfc]KUÃK²@P4Þ&¢æ õúì¯ÝðÏ+á·Ž­'¥—žš|——Ϙ¡œw¢2ª«³±¾ ËvذænõcA¼!‰/_<üG#R ZHaöe“hiog³cñ]GVÞLåA–51(ú= Eü`íÛÞÑÄn¸3® ¥ãžšh—Ò–^˜œ±¡H©¡²‹½ÏÉ-×^åôþ‹ o.b;!GoQZê`Çe“hAiÌgkI S[a@eVgUgá1}$]É ùuêNÜàÎrÂC·­„¥OŸ›Þ˜Á˜¼šÅžÅ¤ž¬'¶/Á|ÍÏÚãèn÷%¼æ"\0Ö<HÝQüYI`¢dñf*gLeaa}[¿SNJ\?"3ß%ØV £ú ìßÝaÐÜÃŽ¸´®¦ ¨›>™é˜«šzžC¤è«AµÀEÌyÙtçîõœ2d!é.y;ÕFÁP Y…_d“fg\e§a÷[jT(K`@I4$'4 üƒíNßÃÑ)ÅÀ¹Ä¯i§Ú 9œ™™¤š@ž×£M«y´.¿2ËHØ,æ•ô:Í “-7:«E·O$XÇ^c3fÔf`eÞa`\UíKMA[5U(} }ýëî³àÓoÆíºÑ°P¨—¡Çœú™>™˜šÿc£§ª¥³0¾Ê×Óä,óÇX•2,ë8{D©N>W^÷bßeµfwe+bâ\¶UÏLXBŠ6¡)á øþfð%âԻǼڱ0©G¢ECšQ™sš¥Ô¢æ©¸²½×ȲÕhã³ñHÛ!Ð*¡7RC¥MfVf]‚bŸe­f¦eb{]VÆMxCÌ7þ*R {æñšãáÕÉB½Û²ªì¢¶~šT™?š:5¢©»±ö»‘ÇQÔôá3ðÃþZ ¬n)Y6+B¥L’UÂ\beeªfÚeúb^OWÁNšD9\,Ëüdó åA×IÊh¾Ú³Øª£'žºšZ™šÔœœ¡N¨Ç°ÛºUÆûÒŠà¼îIýã ?(5 A©KÀT\ a'e¡ff[c¬^X®O­EC:ª-$ ønÓôqæ”Ø„˃¿Ò´¦«0¤—ž÷šc™ã™vœ ¡§ß¯Í¹(ųÑ0ßVíÞû{ áÇ&ã3ò?¶JöS‚[3aídšf3fºc;_ÎX”P¹Fn;î.|![Ö7öÌçÞٵ̗Àµn¬Ì¤Ÿ0›i™·™œ} Ó¦ø®Â¸ýÃoÐÙÝóëvú †}%±2Þ>ÅI.SçZÈ`³d”f`fdË_ŒY|QÅGš<40Ô"À?ž÷)é)ÛéÍ­Á´¶7­g¥nŸj›o™‰™¶›ëŸ¦®²·ÍÂ&Ï|Ü‹ê ù«&.${1Æ=ÒHdRJZ\`{df‘f~da`QZkRÛHÐ=„18$/³ùê~Ü$Ïɪ·®¦ÙŸ¡›q™T™M›PŸH¥­”¶ÁÍÍÛéŒ÷2¸Ò"90¥<×G”QªYð_DdfÈfêda"[iSJ?æ2­%±9 ‘úìáÝnÐñë¸×®¨¦H Ø›p™™Ýš«žr¤¬iµAÀd̓ىçþõ¨:h!é.x;ÒF½PY€_ d‘fg]eªaý[rT1Kj@U40'@Ì !üˆíPßÀÑ Å²¹¯¯M§· œl™Þ˜gšþ’£«2´è¾ïÊ Øõåfô´÷•-G:ËEåOaX_Ùc˜fDgØe\bâ\†UnLÉAÐ5¾(Úi ¸ýïÄàÓSƺº‡°ñ§"¡@œb™™˜è™I©¢î©ñ²„½pÉwÖVäÅòy%:,9ÀD O¼W¦^¦c¡fˆgVfcÌ]ŸV°M/CQ7T*z Wÿ¤ð@âuÔÇÉ»f±š¨”¡wœ^™Y˜n™—œÃ¡Ø¨²±!¼ñÇäÔ·â"ñÚÿ“Ú*Ô7­C(N W/^icŸfÁgÉf¼cª^­WèN‹DÉ8á+­ó4ò¼ã×ÕÌÈß¼N²O©¢¼œi™*˜™÷›ï Õ§ƒ°ÏºÆ^Ó"á‡ïBþ †x)“6“B:MQV¨]c‰fäg%gOdq_£X PÑE.:]-¡A‡¿ó7å:×Êþ½B³ª¤¢™˜¸˜s›8 î¦q¯—¹)ÅîÑ¡ßüí´ü~ (K5nA>L‚U ]°bVfégagÁd`yY QúFx;Á.!à Bõ¯æŸØ[Ë)¿G´íªM£ŽÎ™ ˜˜›£Ÿ(¦®}¸íÖÐ4Þì3ûþ •­&ü3=@0KžTT\,bfÎg}ge›`/ZïQH©<0~":ŒÃö)è Ú²ÌdÀ`µß«¤#ž0šM˜ƒ˜Óš/Ÿ¥©­{·ÆÂNÏÒÜ ë³ùz8%™2ô>J›S|[ƒaeŽgrg>eý`ÆZ·RüHÆ=P1Û#¬Kø°éŠÛ"μÁš¶õ¬ÿ¤áž¼š£˜£˜»šàžý¤ò¬•¶´ÁÎ{Ûé2øï‡¯#1=½HsR|Z±`ïd"g=gBe9a8[^SÔIÌ>2,%ŽÙùCëݧÏ/Ãò·-®¦ÅŸn›!™ê˜Éšµžš¤X¬Èµ¸ÀðÌ0Ú3è±ö_ð"‘/ÖÉÞ½“³ÓªÎ£¦žv›Pš8›*ž£æ©r²¼ ȨÔ%â=ð¦þ Aß(ª5^AÀK™T»[aTde×db=]ŽV ND¹8/,À³NÞó­åØ*Ëa¿è´ó«±¤HŸÕ›gš›´]¢ë¨=±&»tÆìÒNàUî·ü* d'4æ?zJSïZz`d¢e$e›b^¢WlOšE_:õ- œ:ÂõçºÙ»ÌÆÀ¶é¬h¥¼ŸœQš®š¡Õ§ò¯¯¹ØÄ3Ñ‚Þìáú^ ª}%2˜>^I©RGZ`êc½e€e5cè^¯XªPGê;›/V"]ûz÷$éEÛ#ÎÂ&·Â­¦ (œ7šUš‚œ´ Ó¦Â®U¸]ßÏÜÜÐê2ù¸$31f=ZHØQ­Y±_ÆcÕeÓeÂc«_¤YÌQKHS=1è#ø– ù¦ê®ÜmÏ(ø‰®š¦z Jœššü›ùŸé¥¬­·Â/Î\ÛHé«÷9§ª"ú/R‚2[%r }úì÷ݘÐ/Äü¸8¯§Ä _œþ™¯™s›@Ÿ¥Ÿ¬ìµ¹ÀÏÌïÙÕç9öÐOj!Ø.S;›FuP®X_šcffÔdap[èS¬Jì?à3Æ&ã~ âû[í5߸Ñ*Åιޯ§¡mœ×™T™æš„ž¤’«¾´p¿rË…ØeæËôkú, ¸-W:ÈEÎO8X×^‹c:f×f^eØaU\óTØK3A<50(Sí Hý²îtàÚÒ*Æ¥ºˆ°¨N¡œ·™™`šÏ<£Šª”³+¾Ê×õä[ó¡é‘,R9êDO¶W‡^ocRf#gÜe…b/]õUýLuB”6—)Ã^ ³þð½áÔ6Ç‹»C±”¨©¡©œ«™Á˜î™-m¢’©x²ñ¼ÆÈ¹Õˆãëñ˜Bœ]+>8ûCWNW^8cOfSg?fcï]ÞV N¢CÚ7ð*(Çmñ ã>ÕPȃ¼²8© ¢îœ¿™¢˜ž™­œÀ¡»¨|±Õ»ÇnÔ0âŒð8ÿé R'*"7ÿB€MoV]åb,fag}f…c‰^¢WôN¬D9+,ro½òOäqÖkÉ€½î²í©ª¢L˜o™Pœ7¡ ¨¥°ÜºzÆCÓôàFïïý¢ ù( 6B¢LµU ]~bñeSgfÒc_BX¹O“E:F-ŸS­úó…åš×Ê~¾Ï³«ªC£½5š½˜^™œÐ {§ñ¯ºˆÅ9Ò×ßî¾üp ç×'ø4AÁKóTl\b e,g fÿcW_¿X[PVFã:?.« mÐõ¨æ´ØŒËu¿®´n«å£;žšî˜f™ô›‰  §`¯U¹¹ÄQÑÛÞíªûX ÐÇ&õ3@æJ3TÊ[„aDeõffd“_!YßPúF¤;/˜!i×+ö²ç¹Ù†Ì_Àƒµ*¬…¤»žëš(™{™ã›S µ¦æ®¼¸Ä„ÐúÝ!ì¯úX ÐÌ%32?J}S/[aèd¼fzf#dÅ_tYSQŒGQ<Ü/p"PÇ!÷¨èªÚmÍ8ÁI¶Ù¬¥2ŸB›^™™Ô›" b¦s®,¸[ÃÄÏ(ÝAëÅùjâä$&2c>\I×R¤Zš`™dŽfnf:dý_ÍYËQHý<ž0C#0° ø’éÛEÎÂý¶u­š¥•Ÿ…›™Ž™±›ÝŸü¥ð­·£ÂøÎLÜYê×øyõÿ#N1=¬HAR+Z@`adyf}fldR`CZ_RÏHÅ=z1/$'«ùŠêzÜ#ÏÊ®· ®¦éŸµ›Š™s™q›xŸv¥I­Ê¶ÈÁ ÎMÛPéÉ÷lï#e0Ê<ôG§Q³Yî_6dvf¢f¹dÅ`ÚZS¦Iµ>2C%EÎ)ú¢ë…ÝШÃp¸ª®‹¦< Þ›ˆ™F™›øžÎ¤~¬àµÃÀîÌ"Úè‘ö7Ãé!^/Þ;(GQ4Yš_d}f×feTa’[õS¥JÑ?±3…&‘ uûäìµÞ3ѤÄH¹[¯§“ œ}™ ™«š[ž¤«Ì´¿£ËÆØµæ'õÒj¢ 1.Ñ:@FCP¦X=_æcŠfg’eüaj\øTÍKA5ú'  óüUîàuÒÄÅ@º&°ª§÷ 1œq™Ä˜/šª"£}ª“³5¾-Ê=× åŽó>â0Û,Ÿ98EkOXÑ^µc”f_gf´bV]VM„Bš6–)¹L šþïï—áÜÓÇV» ±W¨j¡gœi™~˜¬™ìœ.¢V©@²½¼—È‘ÕfãÑñ…7›e+P8D|NLWW^yc™f¤g–fucP^BWpND=8O+bªñ;ã`ÕcÈ…¼²©î¡«œj™=˜*™,œ3¡&¨à°4»îÆÏÓ•áúï²þq ëÔ)å6ÚBuM~VÈ]+cfÛgg.dD_mXÌOŒEä9-Rñ9tóðäøÖÕÉʽ³ð©ˆ¢‚™˜¾˜›L §‘¯»¹QÅÒÍß*îâü¬ 9>(s5”A`L¡U&]ÈbjfùgmgÉd`zY QôFo;µ. !²ú,õ—æ…Ø@Ë ¿(´Îª-£n­™˜m˜ôš†Ÿ ¦g®g¸ÜÈÐ*Þ|ì4û ¡¾&4Y@RKÄT\Zb7fh±gGeÏ`aZR2HÎ<00—"K•Ãö èùÙ˜ÌAÀ4µ¬«Ù£å환<˜‹šéž?¥l­D·—Â'϶Üûê­ù€&T%Á2&?CJßSÇ[ÔaäeägÉg“eOa[üR7I÷=v1ô#· 9øé\ÛåÍsÁE¶–¬˜¤tžJš0˜0˜Kšvž›¤™¬I¶wÁéÍ`Û”é<ø ¹õ#v1ö=5IøR [IaŒeÁgÛgÛeÊa½[ÕS:J?¹2N%!}¬ùüê¸Ü,ÏÂM·u­J¥öž™šI˜˜û™ò磹«@µLÀ¢ÌÚ(èÊöœQœ"40Ò<5H!RcZÐ`Ge±gh4fVbz\½TJKO@4°&‘ò ûeìÞmÐÀÃJ¸I®ð¥jŸØšT˜é—š™_#£Éª)´¿M˚زæNõ"à=!í.ª;2GIQ¹YY`e¥g+h•fëb?]°UeLAa5 (v ¢üàí{ß¿ÑóÄY¹-¯¥¦ìŸ&›j˜È—B™Òœd¢Û©³Ö½óÉ(×0åÄó—]È-j:FUPôXÆ_§d~gBáLôUI]ºb*fˆgÍfüc%_aXÒO¥E:M-¡Q¨ñózåŽ×tÊp¾Á³Ÿª8£³,šµ˜W™œË u§ë¯º€Å/ÒËß î¬ü[ λ'Ù4ä@KÎTF\Þa{egfâc?_­XPPRFè:M. ŽúSõäæ÷Ø×ËÅ¿µÄ«<¤‘žàš<™­™2œ¼ 5§z¯a¹µÄ=Ñ·ÞÝìfû p\&3—?cJ­SE[aÇdf&fºcH_çX¹PéF©;4/Ë!³5ö6èLÚ&ÍÁ2¶Ü¬6¥gŸ›À™šYœ³ ü¦¯Î¸úÃ]жÝÁë5úÆ)%<2`>?I¢RWZ7`#dfÙe›cW_%Y$Q~Ge<0È"É_Ô÷té‰Û\Î1ÂH·Ù­¦" #œ)šAšiœ– ²¦ž®0¸6Ãxϵܪê ù“òÞ#1D=8H¶Q‹Y_£c²e°eŸc‰_‚Y¬Q-H8=1Ô#éŒ ùªê¹Ü€ÏCÃB¸´®Í¦µ ŒœgšRšLœK <¦þ­j·OÂtΚÛ}éÔ÷V¸­"ï/8 2%(ÓQúìëïÝ£ÐLÄ+¹z¯j§&¡Îœxš2šû›ÌŸ¥)­p¶6ÁAÍSÚ*è|öjp!É./;cF)PPX­^cŽeïe?d‡`ÙZUS Jj?k3a&= ¶ûEí5ßÎÑVź2°ò§{¡îœcšç™}›Ÿ±¤!¬Cµê¿ÞËàØ®æõ‹! ˜-":€EuOÏWb^ c³eLfÒdMaÏ[uTeKÍ@å4é'Ì ;ý¹îàÓhÆôºä°o¨¿¡øœ2š|™ÙšDž©£íªê³s¾PÊD× å_óöƒ»T,9•D¿NQW^cêe¾f~e0bä\·UÌLTB‚6–)Ñ| ßþHðâWÔÇ绢±ó¨¢ý™ ™+š^¢¦©|²å¼ªÈÕPã§ñHé=ú*Ù7—CøMÄVÏ]óbf*g&fcù]úV7NßC'8J+6æñ„ã¶ÕÃÈí¼s²Š©a¢Û™ª˜™Šœ‡¡o¨±d»ÇãÓ›áòïœþN ¼š)¡6B!M$Vj]Ëb,f{g²fÔcð^X†OOE±9ç,4ß2xóå×úÉù½N³0ªÏ¢RÔ™h˜™Ù›¤ ]§ã¯º™ÅYÒàYîýÇ IC(m5ABLxUò\‹b$f«ggpd½_Y¨P”F;\.¶ f¶óôiæcØ+Ë¿0´äªR£ í™K˜Ä˜T›ïŸ}¦Û®Þ¸RÄüÐ›Þæì•û[ ëú&?4u@\K¼Te\-bùe³gSgÚdV`ÞY“Q¡G<™I8S&[;aWeegYg4eaØZ×R'Iû=1$ôX–øûéÒÛeÎûÁÒ¶&­(¥ŸÔš´˜¬˜½šÜžó¤ã¬ƒ¶ ÁÎgÛ‰é øà}©#1=ÃH}RŠZÁ`e5gPgSeHaC[eSÕIÆ>q2%ûiªù ëÝÜcÏæÂ§·ß­Â¥yŸ&›ß˜¯˜˜šž¤N¬ÍµÎÀÍhÚ}è ÷Ègœ"0¥<òGÉQ÷YR`¹dgYg…e¢aÄ[ T™J¦?i3 &† Éú'ììÝbÐÐÃv¸®Q¦äŸi›ú˜¡˜aš1žý£§«µë¿Ì[Ùbçéõ¤G…!/±;G QXY×_ddçfTg¨eía5\ŸTQK|@Y4'')© òûQíß}ÑÚÄk¹j¯ §} Þ›F™Ä˜Zšž¢£$«^´ ¿3ËWØIæÀôpO æ-:FP€X!_Ôc€fg™e b\UðKBAB5.(JÞ 5ý›î\àÂÒÆ’ºz°ÿ§L¡†œÄ™™|šñd£¶ªÃ³[¾HÊJ×åó³ðŒ,@9ÊDîNyW=^cñe¹fkeb·\~UŠL B26C)~+ ”þðËá.ÔtÇá»°±©>¢M]š|™¯šï,£Jª%³Ž½OÉ+Ößã%ò²;t+Ó7pC¯M[VF]NbWeRf;ebö\óU3MãB87o*Ë’‹ñSã°ÕéÈ@½ò²4ª4£žñšÚ™ÔšÛߢƩl²£¼8ÈíÔâ®ð*ÿ© â‰)X6BlL>UV\ŽaÍdf$e;bU]‹VNáCb8À+;¥(óîäA×hʤ¾4´M«¤Éžn›šÛš¥n¢©‹±’»ûÆ‹Óáïˆý @ô'Ù4¬@0K-Tw[å`^dÎe/eƒbØ]GWñNE®9/-Å·MÒô‘æÔØãËÿ¿gµR¬ï¤dŸÎ›?šÀšMÛ¡P¨Œ°dº¥ÅÒrßyíßû[ ¢h&h3]? J7SµZ\`d½e[eëbz^XûO9F ;©.V!Vñrö%èTÚEÍ=Á{¶5­¥ÙŸœ=š‚šÕœ+¡l§y¯'¹FÄšÐäÝàëDúÆù$22> IhRZû_écÑe¨eqc6_ YQyGj<"0ß"ç‚û÷é³Û„ÎVÂh·ñ­$¦) œš(šDœf y¦\®ç·èÂ&ÏbÜXê¾øK²©#è0)=.H¼Q¢Y¸_Ýcýe fdý_Z1R¶HÂ=1W$cûhùøêôÜ¥ÏQÃ8¸’®“¦c $œê™Ã™®›¡Ÿ‰¥G­²¶šÁÆÍ÷ÚéèT÷ëeu"Ó/9‰ISÙZÓ`ØdÒf·f‰dQ`&Z(R€H`=1¥# `øÝéÌÛwÎ" ·r­ƒ¥hŸB›&™™,›EŸR¥6­Ç¶ÔÁ#ÎuÛ…é ø¸Db#É04=bHR&Za`¨dæfg!e'a6[kSðIõ>´2l%aÜ)ú”ëiÝðÏpÃ*¸W®,¦ÒŸj› ™Ã˜‘šnžD¤ö«\µEÀy̹ٿçDöû™Ò!\/ñ;PG=Q†Yþ_…dgkg»eûa?\¥TTK{@T4'— Ûû4íîÞTѪÄ4¹-¯É¦3 Ž›ñ˜k˜þ™¢D£Çª´Ì¾æÊØæ•ôTU ÿ-»:GFfPåX—_Ydg·g@f·b/]ÂU™LâAÖ5²(»8 wýÂîfà®ÒáÅAº °s§§ É›ó˜4˜Ž™ýœm¢Â©×²|½zɔքäóÅ~â¦,93E~O,X_ dúfÔg”f@cè]ªVªMC(7*4º ùþ>ðÕáÔ Ç^»±>¨C¡3œ(™4˜Z™•œÓ¡ú¨ä±d¼BÈAÕãñLsG+98DuNKW[^‚c¥f²g¦f…c`^RWNDI8[+Œ$n·ñJãrÕxÈŸ¼#²<©¢ÚœŸ™w˜i™oœy¡m¨(±{»1ÇÔÏá+ðÚþŽ û×)Ù6¾BIMBV|]Ðb$ffgf¤c´^ÙW6OùDV9‰,ÖƒÛ*ó»äÚÖÏÉÞ½D³8ªê¢~š·˜t™Eœ¡Þ§j°’º#ÆàÒ†àÐîrý" ’x(Œ5ŠA4LQUµ\6b»e/gŒfÔc_lX÷OãEe:·- Ü?‘ôæ3ØË ¿T´#«¬£žwšê˜t™œ¶ H§§¯¦¹űÑ?ßwíüº .'E4\@$KfTó[¢aVeýff d_Y½PÓFy;ë.j!;©öŠç”ÙeÌBÀjµ¬s¤­žßš™s™Ü›L ­¦Ü®±¸÷ÃtÐçÝ ì—ú> ´°%è2?ÿIgS[ý`ädÀfˆf;dç_¢YŒQÏGž<40Ï"·3÷éÛÙÍÁ¥¶*­\¥eŸb›j™…™´›êŸ¦ ®°·Ê ÏtÜêùø˜$Y1¡=©H8RZ-`KdbfefVd?`5ZXRÐHÏ=1N$RâJùÖêÐÜ€Ï-øs®x¦M œÝ™º™¨›ŸŸ‰¥G­±¶—ÁÀÍíÚÙè<÷Ì>F"›/ú;!GÖPéX/_‡cÛefRd~`¶ZSÌI?ó2Ü%« $û¶ì­ÞRÑéIJ¹é¯¿§_¡éœušš¸›jŸ¥‹¬¸µdÀYÌZÙ!çiõçPY º--:sEPO‘W ^¡b6e¾e8dª`([ÎSÃJ5@[4r'¾… ý®î¥à?ÓÂÆn»~±%©Ž¢Ü&›{šÝ›GŸ¤¤Û«Å´5¿óÊÃ×cåŒóõR[Å+L8®C±M"VÓ\¤azdHe dÄ`Š[wT®K]A»5)x_ ÿªð¢â4Õ¤È4½³—ªË£Ýžç›÷šœ4ŸK¤<«ä³¾É=Öµã¾ñbhÚ)s6ñALµT›[¥`»cËdÑcÒ`Þ[U…LpB7{*Ôˆò‚ä ×kÊྦྷ´õ«ö¤ÐŸœm›Fœ$Ÿø£©ª³ ½aÈÔÔ'âðSþš  (Å4]@§JnS„ZÅ_ccd©cê`5\¡USMsC68Ö+“²{7ô1æ±ØýËWÀüµ!­ó¥™ -Û`œŸš£ªF²¼7Ç…Óºà‘îÂü ’&P3?pI_R¤Y_œb"d¡ca\?V"NoDY9-ò#öµõªçÚTÍ“Á·®·¦-¡Ží›UœÁž&£l©t±»ÆKÒiß1í[û ­B%2æ=uHŒQüXž^UbdÀcka]ìVøNjEs:M.6!sJ÷ðèRÛrÎ’Âò·Ç®B§‰¡»ë›"œ_ž˜¢µ¨˜°ºÅÑ.Þïëú`|%$1=³GòPŒX[^Ab(ddàa»]°WÞOmF;y/m"®ƒ6øê]ÜbÏcÞ¸K¯›§¶¡º¼›Æ›Ùê¡ã§§¯ ¹àÃîÏöܵêâø6d$#-0><G}PCX?^Rbfdrdtbv^ŽXÚP‚G¶<®0ª#ëº`ù(ë\ÝCÐ!Ä6¹¹¯Ý§Ê¡ u›S›<&¡ý¦¢®î·°Â±Î³Ûré¦÷H!"J/};|FPX+^mb¯dçdc>_yYäQ¥Hì=ò1ô$6þ˜úLìgÞ/ÑêÄ×¹/°&¨ä¡‹0›ášžœ` ¦–­Ç¶uÁgÍaÚèXöÄ !Q.¨:ÏEŒO¬W^xbëdRe«c`bZîRÌI+?A3M&’W æûŠíß8ÒÐÅ–ºÄ°Œ¨¢›ƒšœ§Ÿ0¥¬¢µ6ÀÌÙ¹æôôhËÒ5-­9úDáN0Wº]^bee'dª`7[ëSìJg@”4°'ÿÆ Oýçî×àhÓáÆ‚»†±!©¢Â›Nšª›Ÿj¤ «Œ´¿ÅÊŸ×Iåóõbyò+ˆ8øCNƒV=]bíd»ezd/aì[ÍTõK“AÞ5)n> ÉþZð=âºÔÈ—¼t²ä©£"ž.›Ešl›œžÆ£Íª³Ý½‚ÉBÖÚãòvæ”*B7ÒBM­U–\ža­d±e¦da\’UçL®B7j*Þ¼NÞñ¸ã%ÖkÉͽ†³ÌªÌ£ªž‚›bšR›Kž?£ª§²Ë¼KÈëÔkâ„ðíþ[ ƒ)á5AåK³TÉ[aGd‚e®dÑaø\=VÃM¶CJ8»+I:ØmóCå¤××Ê¿µ´Ô«§¤UŸø›¡šY›žØ¢x©Ù±Ï»&ǤÓá ïfýÏ ù's48@°J¤SæZQ`Çc8eœd÷aU]ÏV‡N¨De9ù,¤«WòôÆæÙ@ÌoÀçµá¬‰¥ xœìšm›÷~¢ê¨±âºÆlҳߢíðûR ~,&3ð>‡I¡RZ§_Pcödd!b´]bWJO—E|:1.ö Éiö:è‡Ú–Í«Á·×­T¦£ àœ ›k›¿¢K¨L°ê¹óÄ/Ñ]Þ:ì~úÞÊ$Å1¾=wH¸QQY_øbÓd¢dhb0^X%P›F£;u/Q"{;Ú÷¤éáÛÚÎѸ°®§¡'2›H›hˆ¡‘§f¯Ý¸ÅÃæÏÝÐêùp«v#‰0 <}GçP­X§^¶bÅdÉdÃb¼^ÊX Q¨GÒ<À0±#é°Nùë>Ý!Ðüù‘¯µ§£¡zP›1›¡à¦‡®Ô·—™ΛÛYéŒ÷ì,"+/];[FíOßW ^Nb“dÏdc1_sYæQ°H>2%k> áúŸìÂÞ’ÑRÅCº°“¨O¢ðŽ›4›åœ˜ :¦¬­Ê¶cÁ@Í$ÚÌçñõKŽp ª-÷9EÒNôVR]ÍaLdÄd2c_ZÁR½I;?r3ž&ä üKîdà ÓÆÆ”»Å±Œ©£|žÞ›H›¼œ2 ˜¥Ó¬½µ(ÀÞË¡Ø1æFô—ÛÇ,z8½C MðUƒ\7aòc§dRcû_²Z“SÃJo@Î4(™ @þýï â¸ÔDÈò¼û²“ªç£Ÿ@œm›¤œÝŸ ¥ ¬Ã´¿Ê/×¥ä¨òð3'„*7fBoLíT±[š`c~decH`8[OT±K‹A6~)Öÿ“ñœã7Ö¬É;¾´«°¤®ŸŸœ”›’œ“Ÿˆ¤X«ß³ñ½YÉÝÕ;ã.ñnÿ° ¬)®5.A[KTôZ`7c]dyc’`µ[ýTŒLŽB67Á*mDóå×íÊ`¿!µh¬`¥. îœ°›{œJŸ¤±ª³ú¼BȬÔöáÜïþY ]×'ƒ4@mJ9STZ›_òbGd“cÛ`+\USMwC=8Þ+œ¼„?ô7æµØÿËWÀùµ­î¥“ '½›\œŸ›£ªQ²¼LÇ¡ÓÜà¹îðü6 CÍ&3A?­I›RÛYI_ÈbEdºc)aŸ\4V NHD%9Ø,£É’Hõ7ç¥ÙÛÌÁ ¶£­R¦Ò A±›+œ«ž$£©Ÿ±T»oÆµÒæß¿íöûC [õ%É2–>I*RŒY_¾b_döc†a]ËV¹N Eú9¹-‹ ³y(ö ègڈͮÁ·þ­¦í ;Š›ã›Ež£¢ç¨ï°“º ÅÝÑ ßâìûv œG%12>»HäQdY_Öb–dKdöa¥]lWlOÏEÇ:.`!…Dèö¹èÛ ÎÂi·0®¡¦á A›~›Æ ¢;¨3°Ê¹ÎÄÑ4ÞìXú½ôµ$¸1¹=zHÂQbY1_cðdÁd†bK^&X6P¥F£;k/<"[¢÷`é“ÛƒÎs¢·I®™¦¹ ÇœÚšúš'V¡r§Z¯æ¸äÃÐLÝ2ë…ùúG!$?1_=@HªQmY__ac`eOe0c _üXQ—Gœ¯2~%‰ {úøëÜÝqÐüþ¸ò®Ê¦q œ¦™X™›ðžº¤_¬¶µÀ²ÌßÙÔçFöëx !/Ÿ;ðFÑPY~_ÿcxfÝf-eoa·[#TÚJ @ñ3È&Õa ·û"íïÞgÑÐÄm¹w¯#§œ œr™õ˜š8žÛ£^«˜´Y¿jËØ}æñôŸ;y .µ:+F6P X?_ðcšf/g®ebŽ\UöKBA<5!(6à ýpî)à‡ÒÑÅHº)°¨§ò (œe™µ˜š˜£jª³$¾Ê/×å…ó7Þ-Ú,Ÿ99ElOXÒ^µc’f[g f«bK]VMqB†6)¢5 ƒþÚïƒáËÓùÆN»±[¨u¡yœ‚™Ÿ˜Ô™c¢‘©²ÿ¼ÛÈÕÕªãòÁmÉ‹+j8%D~N?W<^Qcbf_gEfcè]ÒVùMŒCÀ7Ó*§úÿLñìâ"Õ7Èm¼²,©¢ëœÁ™©˜©™¼œÓ¡Ñ¨”±î»¨Ç‡ÔHâ¢ðLÿù ^/*&7þBzMeV]ÔbfJgdfkcn^ˆWÛN–Dí8,goÂòZäրɚ½ ³ªÎ¢qšÈ˜“™qœT¡"¨¸°éº€ÆBÓëà5ï×ýƒ îÍ(Ù5ÍAkL}UÓ\Gb¾e%gtf±cè^2X´O˜E:a-Âå:ôÌåæ×ÑÊϾ ´úªŽ£žqšð˜…™.œÜ x§ß¯æ¹XÅúÑ‹ßÄí[ü vc'ƒ4’@RKŒT\´a_eüf‚fõcb_àX‘P¡FB;°.,!ýkÂõOç\Ù1ÌÀBµô«Y¤šžÔš™x™è›_ Å¦û®Ô¸ÄŸÐÞ:ìÆúl âÜ%3=?!J„S7[aòdÉf‹f9dà_–Y{Q»G†<0²"—n÷÷è÷Ú¸Í}Á‡¶ ­B¥MŸN›Y™w™©›äŸ¦®´·ÒÂ,ςܑêù¯'-$w1À=ÉHYR=ZN`ldfƒfrdX`LZkRàHÛ=—1Q$PÛ>ùÄê¸ÜdÏ Ãð·I®J¦ Þ›¨™ƒ™r›iŸU¥­„¶oÁÍÑÚÄè0÷ÉDV"¶/õÖ[ þ-Ž:îEåO=XÍ^rcf¥f"e”a \¦TŠKç@ó4ì'¹ ý”îbàÓÒ/Ƶº¢°+¨z¡²œí™9™™šžp£¹ª¼³J¾.Ê(×÷äRóïƒÁa,9®DÝNtWF^0cfïf±ecb]êUÿL„B±6Á)ùŸ þþbðâdÔ”Çè»±ç¨ô¡èœÞ™å˜š0^¢q©E²­¼rÈWÕãsñ¾Û*Á7‡CïMÄV×]c1fLgOf@c/^6WxN#Dl8+ÒyÏ!ò¹ããÕçȽ„²©\¢ ¿™ƒ˜_™OœC¡#¨Ë° »¶ÆˆÓAášïHþ v])o6hBMVn]ßbOf¬gñf dH_‚XðOÁE':_-«S¡àó]åd×=Ê,¾o³?ªÌ¢:©™*˜Å˜w›3 ß¦Y¯v¹žÑkßÂíxü@ ÏÙ'5=ALaUô\¦bXføg}gédK`¹YVQMGÒ; /z!&nŸõçìØžË^¿m´«S£‚¯™ï—J˜¿šAŸ¸¥®ù·cÃЦÝöë¯úƒ 'M&®3@ KT^\Mb?fhãge(aËZ˜R¸H_=È03#è0X÷­èzÚ Í¡À‚µä«ú£íݙޗû—3š{ž½¤Ø¬£¶éÁrÎüÛAêöøÐ‚¿$>2¸>íI¢S¦[ÏaýehhfÔa­[ªSöIÂ>I2Ë$ŽÜùKêÜ{ÎðÁ¨¶Ü¬À¤|ž3šù—Û—Ù™éö£à«~µžÀÍyÚ­èZ÷3í9#Ï0h=ÂH¢RÖZ2a—eìg&hDfPb^\ŒTKø?Ÿ3;&j ’ú×ë…ÝåÏ@ÃÕ·â­˜¥#Ÿ¥š5˜ß—¦™W£«‚´z¿ÂËÙ8çØõ¬h¿!g/<’G˜Q÷Y‚`e¤ghifªbì\KUñK AÖ4'zâ üUíûÞLÑĹð®~¦ÜŸ-›‰˜þ—™4Ø¢`ª¥³u¾˜ÊÑ×Úåjô6ñN .Ê:_F†P YÃ_‰dFgêgsféb]]îUÀLBó5É(ÍE ~ýÅîfàªÒÛÅ9º°k§Ÿ Â›î˜0˜Ž™ÿœq¢É©à²ˆ½‡É¢Ö’äóÒŠë«,„91EwO X_ócßf´gpfc¾]}V|MèBú6ï) • Ùþ#ðÀáûÓÇa» ±R¨_¡WœT™g˜“™Óœ¢?©+²«¼ˆÈ…Õ^ãËñ‚5šd+M8DuN@WF^cc|fglfDc^W-N¿Có7+6Ñlñã6ÕEÈu¼²(©¢Þœ¯™”˜’™£œ¹¡¸¨|±×»”ÇvÔ:â˜ðFÿø a6*17 C‹MxV£]éb,f^gvfzcz^WÞN”Då8,TüQŸò3äWÖTÉl½Þ²á©£¢Jñ™ª˜|™bœN¡%¨Ä°ÿº ÆkÓápïþÌ <)-6!B½LÌU]ŠbøeTg—fÆcï^+XOqEÝ9-q#{ÇóRåh×PÊO¾£³ƒª£žšª˜Q™ œÑ ƒ§°º¥Å\ÒàJîñü¨ "(75FAL2U©\>bÖe\gÊf"dr_ÒXePWFÛ:-. H¢èôhæmØ?Ë#¿X´«Œ£â6šš˜™«›G Õ¦2¯3¹¤ÄIÑáÞ%íËûˆ 'K4u@QK¥TC\bÂesg gŒd`‡Y9QFGá;E/²!qÊ ö~çqÙ+Ì󿵟«î£žDš}˜Ð˜:›°Ÿ¦W®<¸•Ã)жÝôë›ú_ ò &[3¢?ŸJTß[Èaµe’gVge `IZRFHù÷¤èƒÚ%ÍÎÀ¿µ2¬W¤XžSš_˜„˜ÃšŸR¥l­3·tÂõÎuÜ­êTù¿é$U2»>ÜI~So[…a¡e®g¡gzeEa[SXI%>¯17$[Žøçé³Û:ÎÄÁ¶Ù¬Ò¤£žmšG˜:˜Hšfž¤r¬¶;Á¥ÍÛEéë÷»h¦#,1³=úHÇRæZ.a~eÀgçgôeïaï[T€Jl?3¨%~ÚúUë ÝzÏ⇷¤­l¥ Ÿš?˜ü—Ó™¼££j«æ´é¿8̓ٶçWö+ã5"Õ/~<íGçQ9Z·`?eºghbf•bÉ\U´KÅ@†46'~ ªûìì‘ÞäÐ*ħ¸–®*¦‘ŸëšQ˜Ñ—m™Í¢aª±³Œ¾»Êþ׿ªô~@¤ ^.(;ÀFéPoY%`èd¡g@hÃf1c]#VëL$B6Ð(Æ1 ]ý–î*àbÒ‡ÅÚ¹š¯ú¦' E›n˜¯— ™œø¡W©x²+½8ÉaÖbäóòÇ“Ý,Ê9‹EäOžXŽ_Žd…gch$gÎcs^.W%N‡C‹7n*ué ÿDðÅáãÓ寻ž°É§½ Ÿ›‰˜Œ—¬˜ä›#¡N¨@±Ë»·ÇÇÔ¸â@ñësb+q8[DãNÒWú^5dhg„hgfdA_/XTOÝD9þ+’½åñUãZÕ<È?¼¡±š¨W¡ÿ›®˜t—X˜U›] S§°wº@Æ5Óáïaþ< ÒØ)7CÊMëVJ^Àc2gŒhÉgìd`*Y‚P9F„: -ÐZ‹¯óå×ÄÉ¡½Õ²™©¢‡œõ˜y—˜ÕšŸX¦ä®¹³Ä†ÑIß¶í‚ü` (k5¢A†LÜUv],càfhhheÁ`&Z·Q¡GÍIŒS›[Ïaf0hЎø®¾¥:Ÿ¬š,˜Æ—}™H£Àª'´¿YË«ØÉæjõBb!/Ð;WGkQÙYt`e¶g6h™fèb6] UNLpA?5ù'äI sü°íLß’ÑÉÄ4¹¯Œ¦ÛŸ›i˜Ð—T™íœ‡¢ªE³¾4Êm×yåôâ§ Ñ-¥:IFPYÚ_®dxg)h½f;c¶]KV MeBQ6#) ¾ýùîŒàÃÒäÅ4ºî¯H§n …›¥˜ß—5™ œ¢g©€²+½1ÉTÖOäÚò©o߯,—9TE©O`XL_Id=ghÙf‚c'^ãVÜM@CG70*=¸ ëþ%ð±áÚÓéÆ »¾°÷§ù é›à˜ð—™^œ¥¡×¨Í±Y¼EÈQÕ<ã»ñ…Là+™8mDÝN´WÃ^åcghîfÀcŒ^lW‡N D,8*+HÎ@ñÆâäÔâǼ†±¡¨¡Mœ™˜ ™$œE¡R¨'±•»fÇ^Ô7â¬ðoÿ6³š*¤7CN W<^‚cÄfðggùcê^ïW+OÌD9,JÛTòÕãèÕÖÈâ¼K²H©¢¯œZ™˜÷˜ê›å Î§°Ðº‡ÆiÓ2á›ïXþ ¡“)­6¬BPMbV´]c‡fÛgg4dM_wXÖO–Eì9-Wô:tóïä÷ÖÔÉ˽³ø©•¢š™2˜ä˜®› C§Ò¯ºÅfÒàyî/ýõ |y(¤5¸AwL©U]¯b@f¿g"gnd±_Y‡PhFÝ: .t m©ô æØêÊ˾þ³¼ª4£é™T˜Ú˜w› ·¦¯+¹¦ÄVÑ÷ÞDíñû´ >F'4¬@‡KÙTt\.bêe•g'g¢d`YTIìRÕZç`eg gìdÃ`¤Z¯R Ið=“15$ÜøOê2ÜÐÎmÂJ· ­¡¥xŸC›™™›Ÿ¥ó¬}¶ƒÁÎÍÛ)é­÷[ç#q0ß<HÍQáY"`qd·fèfea+[kSûI ?Õ2—%— uúêëÇÝVÐÝܸͮ¤¦K á›€™1™øšÊž•¤9¬µgÀˆÌ³Ù¥çö·@e!Ý.`;°F‘PÐXA_ÅcDf°feTa§[ TåJ&@4'» ü™írßõÑgÅ º°Â§8¡™œþ™t™ýš’ž ¤Š«ª´P¿EËJØævô µ8-Ð9;E@O©WK^c¼eefúd„a\ÈTÄK8A[5i(¦Z ÎýNï%áÓüÆ‚»m±î¨4¢`ŒšÆ™›hž¹£èªÏ³A¾ÊæÖ˜äØò\ØŽ+88¿CæMyVK]9b*efâdªax\gU›LCB”6Ê)(ô yÿñØâFÕ’Èþ¼Æ²ª5£,ž›š+›DžX£Kªû²9½ÒȈÕãAñ´ÿ(Rè)¦6GBLLUN\qašdºeÊdÐaÛ\VqMLCÊ7(+¦‹ ¯ò„äèÖ!Êr¾´F«,¤ïž¨›jš;›ží¢¦©²*¼•Ç$Ô–á¦ï þx ¤G(5Ö@CK*T][¶`dveÄd bQ]¶VZNgD9—,4/Ògô8æØ²Ëå¿eµg¬¥¥Ÿ$œ¨š9›Ôl¢é¨)±»?ƨÒüßõíLüµ ç˜&€3]?òISnZ`¡c>eÍdSbÛ]}WYO›Et:.Ú ë›3öýçEÚPÍbÁ¸¶Š­¦W –œÙš'›€×¡¨°Á¹ÑÄÑJÞ/ìzúáÝ$à1á=¡HéQˆYX_:ceîd¸b‚^bXyPïFõ;Å/"ÁzøÑéÜðÎÛ¸Ÿ®à¦ð ìœéšóš¡§í®`¸FÃgÏ„ÜYêŸø S-#Q0{À2½%÷³ =ûßìåÞ–Ñ7Å ºG°"¨Å¡QÝšvšœÍŸo¥ç¬¶·À§Ì¢Ùeç§õ ƒ‡ á-N:EbO›W^™b#e edt`åZSfJË?ä3ð&1ð uü îà›Ò!ÆÓºì° ¨¢{ÜšIšÈ›OŸÌ¤#¬-µ½¿šËˆØCæ„ônñ,x9ÔDËN)WÂ]tb'eÌeadì`[8T:K¶@á4ù'B ƒýï÷à}ÓëÆ»{± ©b¢žØš šz›Ýž:¤s«c´Ý¾©Ê‹×?å~óþt•,´8+D?N½Vy]Ob'eðe©dVa \ÞTúKŒAÈ5í(= ~þðÞáTÔ­Ç*¼²z©­¢ÆÝšš9›{ž¸£Ôª«³¾ÊÉžÖIä…òƒ¯A+ò7C±MNV*]"be fãd²a…\wU­LTB£6Ö)/ö tÿõðÅâ+ÕqÈ×¼š²ï©£úîšð™›$žA£@ªý²I½ðȶÕWãñÄd*(7ÍBMÑUÍ\çaefeb÷\VZMC}7À*%ósññ·ãÖDÉ”½=³uªi£=ž›ë™ÛšØÒ¢±©P²ƒ¼ÈÈÔ\âŠðÿŒ Éu)K6BjLBU^\›aÝdf7eMbd]—VNãC^8µ+(þ‚þò½ä ×,Êe¾ó³ «Þ£ž9›ï™·šb¢©œ±±»)ÇÉÓMárïìýq µo(V5)AªK¡Tá[Ea¯df\eœbÛ]3WÇNÂDX9Ä,G)±,ôãå#Ø1ËQ¿Â´¸«d¤ìžl›õ™š:ä¡v¨Ï°ÃºƦÒà1î¥ü, x@'<4)@ÉJæSN[Ý`vdfƒeòb`^äW¡OÀEu:û-“ ‚Šõ:çkÙcÌhÀ¶µ†¬¥`Ÿ®›škšáœZ¡½§ê¯¶¹ïÄZÑ·ÞÀì-û³ Þ%ñ2û>¿IS›Z\`)dïe¤eJcî^¥XPÚFµ;Z/ " ¡÷ÄèåÚÇÍ­ÁÖ¶{­Ì¥ðŸœ#šPš‹œË ø¦ò®¸¡ÃêÏ-Ý$ë‡ù fL$v1Ÿ=‰HûQÄY¼_ÃcÅe¸eœc{_lYQH =×0£#·ZØøzêÜWÏà ¸—®´¦  zœXšEšAœB 2¦ô­_·CÂfΉÛjéÀ÷@Ÿ“"Ô/<.GÏPÌXý^Bc…e¹eÞcþ_-Z‰R9In>_2L%x* ­úLìQÞѭĈ¹Ð¯¹§j¡£šMšœÄŸv¥ü¬0¶ãÀÜÌÞÙ¦çëõdÇÈ .†:¾EO¿W+^®b3e«edw`æZ~SfJÌ?è3ø&> Œü(î"àÀÒJÆÿº±Ì¨D¢¡ûšbšÖ›RŸÂ¤ ¬µ‡¿UË3Øàåô„èô_,ä8BD?N¥VK] bÓdŽea.\@U™LeBÙ61*¯˜6Óñºã3Ö†Éó½¶³« ¤ñžÌ›¯šŸ›–ž‡£Wªã²ÿ¼uÈ Õ€âðêþM kú(µ5YAªKsT†[¿`d?eod–aÄ\V MC;8¶+NJñómåÕ× ËX¿ò´¬ã¤ŽŸ-œÑš‚›;žï¢†©Ý±É»ÇŠÓåàáî6ý™ ¿a'64ü?wJoS·Z)`¨c#e’d÷a`]åV¨NÓD™95-æò¡=õçgل̬À¶ ­©¥ }œäšW›ÓM¢¬¨Ð°ŽºµÅ ÒMß:íˆûí Õ%Æ2°>UI~RüY§_cceÇdib ^ÉW¾OF;».ƒ!Qéö°èðÚïÍòÁ7·õ­[¦“ ¹œáš›U”¡½§¯¯B¹CÄ{Ш݈ëÓù>~J$Z1j==H™QNY5_.c&eeðbÎ^ÁXèPkG|ƒIýRÇZ»`¸dªf‡fPd`ÜY×Q(H=Ÿ0@#*¦ÿ÷éxÛ-ÎåÁß¶T­w¥qŸ_›Y™g™‹›¸ŸÙ¥Ï­p·‰ÂâÎ:ÜLêÏøwù$\1°=ÃH]RJZb`†d f¤f“dw`gZ€RíHà=1?$2² ù…êqÜϷ˜·ñ­õ¥ÍŸ˜›m™W™W›bŸc¥:­À¶ÂÁÎQÛYéÖ÷~#~0ä< HÀQÊY`Ed€f¦f·d½`ÌZSŠI”>Y2%÷ùqëUÝîÏ‚ÃO¸’®|¦7 ä›™™c™B›,Ÿ¥È¬3¶ÁMÍ…Úèóö–8"£/ÞÑÐYĹI¯§¾ Oœç™‘™O›ŸÙ¤t¬ÀµŽÀ¥ÌÆÙ®çö¬,G!µ.0;wFOP†Xð^mcåeKfždæ`7[®SsJµ?­3™&¼` ÏûTí:ßÌÑNź!°à§j¡ßœWšß™z›Ÿ»¤1¬ZµÀÿËÙÔæ%õ¯$; ©-*:|EeO°W4^ÏbgeòejdÚ`R[ñSÜJC@\4g'¥_ ßüpî\àîÒjÆ» ±É¨6¢‹àšAš³›-Ÿž¤é«è´l¿?Ë#ØÖåô†ïÿm,õ8SDON´VV]bÔd‰e/dÍ`u[CT\Kî@05_(½ $þÂïµáFÔºÇS¼L²Ù©%£Sž|›®šï›6Ÿs¤‹«X´®¾UÊפäÂò$€Šú*‹7ûBM“U[\Ca3de÷cÌ`¬[°TþKÂA26‰) ù ¡ÿLñDãÑÕ9É¿½œ³«(¤'Ÿœ›œ+Ÿ-¤ « ³Â½:ÉÎÕ;ã>ñŒÿÜ äZ)ú5AµK_TT[p`—c»dÔcè`\FUÎLÈBh7é*Œ—Róþä‚רÊC¿ý´<¬-¥õŸ¯œl›1œüž¾£]ª¸²£¼êÇTÔ á‰ïÇý ž'S4ù?SJ,SWZ­_cxdÔc,aŒ\ VÏMÿCÏ8y,=^'ÞôÐæDÙÌÉÀX¶e­¦¨ !™›œ ž£~©±S»lưÒÞß³íæû/ DÚ%­2y>IRwY _·bbdd¢aE]WOgEc:1.!BÅö©èÛ!Î?·q®ë¦3¡e—›Ð›žL¢m¨S°×¹ÆÄéÐÿÝÆëöùFl$1=ËGQ»X–^‡bzdddFb+^)X]PñF<0ô"2¬ø|ê»Ü°ÏŸÃƸ^¯—§š¡…o›b›]X¡>§ð®F¸ÃÏÜÙé øg£t"“/½;±F8PX>^vb¯dÞdc&_]YÃQ‚HÉ=Ï1Ò$á}ú6ìTÞ ÑÞÄϹ*°#¨â¡Š/›ßš›œZ  ¦‹­¹¶cÁSÍIÚè<ö§ûî 6.:ºE|O¢W^|b÷dfeÈc$`ŽZ"SJj?…3“&Ùž *üÊíÇßkÒúŵºØ°”¨¢|ãšUš×›aŸà¤7¬BµÑ¿­ËšØSæ“ô{ý,„9âDÛN;W×]bDeíe†da­[iTnKë@5/(v3 ¯ý7ïá“ÓöÆ»n±ó¨;¢i–šÑ™›xžË£ýªé³`¾,Ê×Éäó›Oã+•8!DLNâVµ]¢beof:eøa¹\™U¼LQB6­)ô© ÿ‰ðJâ¥ÔßÇ=¼ú±K©]¢UMšT™qšœÆ¢Ô©¢²½½È™ÕPãžñ7ÏÑ*©7aC¼M„VŒ]®bÑeãfàeÌb·]»VýMªCø7"+lÝñ„ã¿ÕÔȽ•²´©“¢Všì˜Ö™ÓœÒ¡º¨g±¬»UÇ#ÔÖá&ðÉþs ׬)©6‹BM VI] bùe@gpfŒc£^ÏW4OýD`9™,êšóAóÑäîÖßÉè½H³5ªß¢lø™•˜J™œå ¤§-°TºæÅ¥ÒPà¡îKý s(•5 AXL„Uõ\ƒbf‘göfDdŠ_áXiPQFË:.n q²ô-æ-ØüÊÞ¾´ÎªF£žô™]˜Þ˜w› ®¦¯¹’Ä>ÑÝÞ(íÕû˜ $-'k4™@xKÐTo\/bñe¢g:gºd/`±YbQmGšt˜Ã˜)››Ÿ¦:®¸pÃЈÝÃëfú& ¶Ë%3b?_JÛS¢[a€ecg.gád‰`I¶R¢Z¸`×dëfêfÒd¯`—ZªRIû=¥1O$=¸ ù„êmÜϰ·ç­é¥¾Ÿˆ›Z™B™>›EŸA¥­”¶‘ÁÑÍÛé÷3¶Ì".0”<ÀGwQˆYÇ_d\f‘f±dÇ`çZ0SËIç>½2%›/ ”úìÞ›Ð-Äõ¸/¯ §· Pœî™ž™`›-Ÿï¤‰¬ÔµžÀ±ÌÎÙ¯çö /!˜.;RF)P_XË^KcÈe5fdâ`>[ÁS’Já?å3Ý& ¹ /üºí¥ß8Ò¸Åhº€°6¨²¡šô™{› Ÿ¤ð«µ›¿€ËtØ6æ|ôþo†ø,9ßDØN8WÓ]ˆb=eæeda§[dTmKï@ 5>(R ØýiïQáÙÓEÇٻαX©¤¢Õ›;š„›Õž¤D« ´…¾>Ê ×°äàòS¿ÚY+÷7rCMVç\ÒaÂd§e|dIa\UTLBc6¦)ì ~ÿñ÷âqÕÈÈ=½ ³lª‡£‚žv›tš€›–ž¤£‘ª9³o½þÈ«Õ2ãNñ·ÿ AÎ)‚6B^LU\1aXdve‡dŽa›\ÈU8MCœ7+„p £òäêÖ*Ê‚¾-´b«N¤ŸÔ›ššn›Kž$£Þ©W²c¼ÍÇ[ÔËáØï9þ£ Ëh(35ê@QK0T[[¬`d[e¢dÞa]|VN DÆ8F,ßÙ{ôäå?ØhË£¿+µ7¬÷¤ŽŸœ­šM›ø ¢,©{±a»«ÆÓ|à|î×üC t!'4×?_JfS»Z:`ÅcKeÃd0bŸ](WíNEÝ9u-! 'Îbõ-çxٌ̫À¶ú¬¥üŸZœ¾š/›¬'¢‰¨±°uº¢ÅþÑIß>í”û :õ%ë2Ù>IªR'ZÐ_‡c9eÞdwb^ÂW¬OøEÙ:ˆ.E!V•öYè—ژ͞Áè¶®­¦c ˜œÐš›hº¡ö§û¯Ÿ¹±ÄöÐ0ÞìkúÙá$é1î=²HüQYl_Kc'eöd¸bz^QX^PÉFÄ;‰/X"t%·÷té¦Û”΄²·X®¦¦Ä Ñœàšýš&Q¡g§I¯Ï¸ÆÃöÏ ÝþêJù¹ÿÔ#î0 =êGTQY _ceeýbç^ãXQG³<Ž0l#“JÛø‘ê¶Ü’ÏiÃ{¸¯*§!¡êšÝšÜœÞ Î¦®ó·ÏÂéÎÜÖéøÛ½"ë/ <GªP“X±^ãbe8eOcc_‡YÚQ„H¶=§1—$ȃú¿ëÕÝœÐYÄL¹­¯¯§|¡2êš®š€œW ¦·­ü¶¼Á¿ÍÇÚ‘èÕöH “!×.);HFûOXY^»bepe¶c÷_FZÀRIÛ>ä2ä%Ý gû í ß»ÑYÅ'º_°4¨Ñ¡VÛšlš œ³ŸN¥¿¬áµƒÀoÌgÙ'çiõâGN ®-!:gEEO‰W^œb3e½e7d©`&[ÊSºJ'@G4X'œZ Ýüpî^àïÒiÆ»±»¨"¢p½šš›õž`¤§«£´&¿ûÊâ×›åÜó]Óòp, 9{D‰NW¶]…bVefËdqa\îTL‘AÈ5è(4ò lþíïÂá2Ô†Çý»Õ±B©p¢„•šµ™çš&ž`£zªQ³µ½rÉKÖüã?òÊQŠ++ì7‹CÍM|Vk]ubefieFb$]V\MCU7„*Ö‘pñ)ãxÕ¢È뼲ũ¹¢‘gšL™EšNX¢G©ø±>¼äÇ®ÔYâŸð5ÿÏ #æ)Ð6žBMùU!]gb¯eçf fc*^QW²N{Dà8,v/”ñòä½ÖÀÉÛ½M³Mª£¦Ašì˜®™ƒœ\¡ ¨¬°ÔºcÆÓÁàï¦ýR ¾ (°5©AOLiUÈ\FbÆe6gfÔc_dXëOÓEP:ž-ÿºfôðåØáÊÔ¾´èªp£Ø=š³˜@™ã› '§Ž¯—¹ ŵÑNß‘í3üê hb'‘4®@|KÃTQ\b³eVgáfVdÁ_gõf”d)`ËY›QÃGw<ñ/r"@¦ïögèZÚÍÒÀÚµd¬ ¤¸žÉšç˜™j›ÁŸ ¦)®ð·,äÏÝ>ëÑùƒ%`2¦>¥I&SöZí`ídàf½f„dB` ZRNH#=»0W#<³ø‡é{Û-ÎãÁܶQ­t¥nŸ]›X™h™Œ›ºŸÜ¥Ò­s·ŒÂäÎ:ÜJêÊønì÷#G1—=¦H;R%Z:`[dsfwffdL`>Z\RÎHÆ=}15$0¹ùŸê•ÜBÏíÂÖ·6®?¦ é›¿™¨™¥›«Ÿ¥¥u­ð¶çÁ!Î\ÛVéÅ÷^Öá"60‘<°G[Q_Y“_ÕcfD2%&¿,ú¶ë«ÝRÐòÃɸ¯§¾ jœšÝ™²›Ÿa¥ ­a¶6ÁQÍsÚXè¶öE¸Ä! /ˆ;¹F|PœXï^Vc¹e fLd„`ÇZ3SïI+? 3 &3Ü SûâìÕÞuÑÅ˹ü¯Í§g¡íœvšš¶›hŸ¥¬¼µmÀgÌmÙ:çˆõ z‡ ì-a:§E„OÃW;^ÉbVeÖeEd¬`[µSœJÿ?4!'` Ÿü4î&à¾ÒAÆðº±¶¨+¢ˆãšLšÃ›CŸ¹¤¬ µ’¿gËLØÿå8ô®$,9pDhNÉVh]!bÞde1dË`p[:TPKß@5K(¦x þ§ï™á)ÔÇ7¼0²½© £:že›™šÜ›&Ÿg¤‚«S´­¾XÊׯäÑò8—¥+¬7C4M¹U\iaWd>edé`Å[ÅT LÌA66‡)ë ÿ1ñ$ã¬ÕÉ’½m³Õª÷£öží›ëšõ›Ÿ ¤ñªŽ³·½7ÉÓÕIãSñ©ÿ‹)/6ºAðK›T[©`Îcídd a#\\UÚLÊB`7Ø*rs%ÒòÃäBוÊý¾·´÷«ë¤¸Ÿwœ;› œßž«£Uª¼²³¼È{ÔÒáÄï þZ jð'§4L@¤JxS›Zé_Ecždîc7a‰\ûU°MÒC”82,ëÅxôgæÛØÌgÀþµ­Ú¥s ûœ„›œ¯ž@£²©ã±©»ÑÆ"Ó[à7îpü» Î`&+3ì>gIeR¸Y:_Íbadìcpaü\¥VNÞDÊ9‹-_ ‹Xöøç^ڈͷÁ*·®«¦¡`°›œgžÀ¢ý¨ü°–º—ÅÈÑèÞ´ìäú/ Jì$Ï1°=QH{QþX´^bKddÌaŽ]jWOüE ;è.Ò! Ý‘÷oéÃÛÒÎàÂ*¸ê®M§}¡–®›Î›ö¢&¨ú¯l¹MÄdÐsÝ5ëcù³Ý•#•0šý¾î–àÓsÆÿºð°{¨Ë¡>š‡™åšOž´£øªö³€¾]ÊR×åqó —Ðj,9¬DÕNgW3^cúeËf‡e4bä\±UÁLBBk6y)¯T ³þðÎá!ÔVǰ»l±¿¨×¡ÖœØ™ë˜šQŒ¢­©Ž²½ÑȿՊãèñ‘8P+08íCJNW^2cLfSgBfcù]ëVN³Cì7+9Ø)xñãBÕNÈ{¼²&©¢Ðœ›™z˜q™}œŽ¡ˆ¨I±£»`ÇCÔ âlð ÿÙ K+*07C¢M›VÓ]$csf®gÏfÛcà^ùWIOýDK9p,­K“ÓòXäkÖVÉ\½»²¬©\¢òœŠ™5˜ü˜Ù›½ ‘§/°lºÆåÒ¢àï¼ý ý(!6,BàLVk]íbnfÛg-ggd™_ÚXNP!Fˆ:¿- «ó+ô åž×nÊS¾³UªØ¢?§™"˜¸˜f› É¦B¯^¹éĦÑT߬íbü, »Å'5(AþKIUÙ\ˆb7fÓgUg¾d`‡Y"QGœ;ë.G!öC{õéæÙØ•Ëa¿}´!«~£»ö™C˜«˜+›·Ÿ6¦ˆ®€¸ëÃŽÐ'Þpìûä x‹&×3@KqT&\üaÕežgLgâdl`ZÄQßG„<ï/b""{·ö$è Ú»ÌtÀwµþ«8¤Pžcš†˜Â˜›vŸÌ¥õ­É·ÙÏÝPëñù²E^%µ2? J”Si[dadeVg/gðd¦`eZORŽHU=Ý0h#<¡ä÷Ré6ÛÙÍÁn¶Ù¬ô¤èžÔšÍ˜ß˜›=Ÿi¥j­·A«ÎÜ7êËø„5$˜1ø=I»R°ZÎ`ödggeä`ÍZàRDI,>Ñ1t$ZÌù„êaÜøÎŽÂc·±­ª¥yŸ<› ™ñ˜îš÷žø¤Ñ¬[¶bÁ¯ÍÛé›÷Oâ#y0î<&HèQZF`—dÞfg)e6aJ[„S J?Ö2Ž%„ Nú¹ëŽÝЗÃR¸®W¦ÿŸ™›=™ö˜Æš¤ž{¤-¬’µyÀªÌåÙåçbö¥Ó!P/Ø;(GQAY¬_%d—fôf:eta³[TÇJò?Ó3¦&²> •ûíÖÞTÑÆÄk¹¯5§¸ *œ¢™.™Ïš}ž&¤ª«ä´£¿°ËÌØ³æõ½Jx ü-’:öEðOJXÙ^}cf¨f!eŒaþ[“TqKÉ@Ñ4Ç'ð“ úürîFà¿Ò#Æ´º®°C¨Ÿ¡æœ/šˆ™ôšmžß£/«7´Ç¾©ÊŸ×få¶óDÇò{,9–D«N(Wà]±beDfôd˜aC\U#L­Aâ5)L …þ ðàáTÔ«Ç'¼²t©§¢½Òšó™%›bž™£¯ª³Û½ÉZÖýã1ò¬"JÙ*‰7CLMîUÒ\ÔaÜdØeÄd¦aŽ\–UãL¢B7Q*¿™'¶ñãýÕDɨ½d³®ª³£–žr›XšM›KžD£ª´²Û¼]ÈÕâšðÿp —/)ñ5›AðK»TÐ[aHde¬dÍaó\8V½M°CE8¶+E7ÖkóBå¤××Ê¿¶´Ô«¦¤RŸô›œšQ›žÌ¢j©È±¼»ÇŽÓñàõîPýº æ'e4/@«J¤SìZ]`ÙcQe»db~]ýV¹NÝDœ91-Ûበõïæ?ÙYÌÀíµÜ¬z¥íŸRœ»š2›³2¢—¨Á°†º´ÅÒYßLí û Bû%ï2Ü>‚I¬R(ZÒ_‹c?eçd„b!^×WÅOFú:­.n!/Âö…èÁÚ¾ÍÀÁ·Ã­,¦g ’œÀšûšBŠ¡»§¶¯R¹]ÄÐÓݺë ú{¿Ž$Ÿ1¯=€HØQˆYh_YcFe'eúbÌ^²XÌPBGG<0ä"°<øðéÜ÷ÎÖÂñ·ƒ®º¦Á ·œ¯šµšÈœß ã¦¶®/¸ÃGÏnÜNêŸøjO#|0¯<¦G*Q Y_>c^eqeuct_„YÃQZHy=X17$Zù2ëCÝÐÆÃ¼¸$¯0§¡Îœ–šlšSœ> ¦Ë­%·ûÁÎ-ÛéY÷Ø92"y/É;äFP—XÔ^$cre±eßc`=ZžRQIˆ>z2e%= ¼úUìUÞÑ¥Ä{¹À¯¤§T¡ðœš:š÷›¼Ÿu¥­B¶ÿÀÍÚäç4ö¶!(!ƒ.í:$FðOX~^öbleÓe)dw`ÐZQS!Jq?v3q&¤V ÔûfíZß÷уÅ?ºe°)¨µ¡+£š(š¿›_Ÿô¤b¬ƒµ&ÀÌÙØæ"õ£" Œ- :XE?O‹W^«bGeÔeQdÅ`B[åSÔJ?@]4j'«g èüzîfà÷ÒrÆ»$±É¨4¢†Øš6š¦›ŸŽ¤Ø«×´\¿1ËØÎå ô†ô ~, 9oDpNÙV€]@be¹e^dû` [jT~K AD5j(¿‰ þ§ïáԃǼ²©Õ¢ž)›]š¡›íž2¤S«+´Œ¾AÊ ×¬äÙòJ´ÍJ+æ7`C{MVÐ\¹a§dŠe_d*aþ[õT2LåAB6†)óÏ cÿüðââ`Õ¼È6½ ³pª‘£’žŒ›š¡›»žÎ£¾ªi³¡½1ÉÝÕdã~ñãÿIdì)™6,BgLU \"aBdYecdeam\—UMãBf7Ë*RAá}ò_äÑÖÊx¾+´h«[¤*Ÿî›ºš“›tžO£ ª„²¼÷Ç‚ÔîáõïPþ´ Õk(05à@AKTA[Ž`æc9ed¼aþ\^VÿM D·8=,ÞÞˆ$ôýå^Ø‹ËÉ¿Tµa¬ ¥¶Ÿ?œÌšg› žª¢-©r±O»ÆùÒMàEî™üÿ ,Ö&¸3?J&S„Z `¤c7e½d9b¹]RW'ObE4:Ú-‘ ŸMäõ¯çøÙÍÁv¶N­Ó¥* rœ¾š›zÜ¡&¨7°æ¹ÅMÑŒÞxìÊú8 v;%?2?>ýHBRÜY¤_~cTeeÙb–^hXpP×FÎ;/Z"q¬÷déÛyÎbŠ·)®p¦‡ Œœ•š«šÎœô §æ®j¸bÔÏÂܧêûøtǪ#Õ0=õGrQJYS_oc‡e‘ec„_YÄQTHl=E1$<æfùëÝ×ϒƸì®ö¦Í ‘œYš0šœ á¥“­ð¶ÉÁåÍÛæè?÷Æ02"ƒ/ß;GºPÎX_qcÈefFdu`¯ZSÇIý>ë2Ñ%ò– û“ì‚ÞÑ­Äo¹ž¯n§¡œš´™b›ŸÇ¤N¬ˆµEÀLÌ`Ù=ç›õ/®Í B.È:FPSXÕ^kcþefídOa¹[FTKp@t4g'. •ü îâß]ÒÄÅYºW°ò§V¡¤œö™Z™ÑšVžÕ£3«I´è¾ÙÊÝ׳åô­<q-­9+ECO¿Wt^@cf¿faeõa\DUAL²AÎ5Ó(© þyï;ážÓæÆW»,±š¨Î¡êœ š8™}šÑ"£UªE³Â½—ɇÖMä¤ò?Ô¼+8DYNÿVà]ÛbÕe¾f’eWb]V'M½Bø6*\ wÿãðžâòÔ%È{¼/²x©¢o^š[™mšŽ®¢²©v²Ì¼ÈQÕãFñØÿk³e*;7óBOMV%]Mbwe’f™e‘b‰]›VíMªC8C+_Ð>òóã9ÖYÉ•½)³Lª-£ï®š{™]šN?¢©²±ä»wÇ/ÔËáðþ" p0)6ëAfLTU‡\Úa1ezf¯eÔbù]5W­NŒD9Z,Ç• yó'å`×lʾ´«À£Zžîš™Dš С€¨÷°»Æ Óªà×î^ýñ G(5û@“K¢Tú[uaõdifÊecg^ÊWeOdEû9e-ã»8¤ôKæwØqË{¿Õ´µ«K¤½ž(›ž™(šÃœb¡ë§>°/ºŠÅҎ߯í0üÄ ú& 4 @¿JðSm[a¹dXfäe_cÖ^`X P@Fô:u.!êmÙõzç›Ù‚ÌuÀ²µq¬â¤,Ÿl›¶™š‚œõ V§‚¯P¹ÄþÐdÞwìðúƒ äÉ%ê2?ÔI&SÈZ“`id6fðe™c=_óXÛP Gô;‘/7",¸'÷ÄèÚÚ°ÍÁ­¶J­”¥´ŸÇ›ã™šOœ“ Æ¦È®o¸‰ÃÝÏ+Ý-ë›ù*Ž}$®1Þ=ÌHAR Z`dfíeÈc_‚Y—QHþ<º0y#ø'ê3ÜúξÂÁ·:®\¦O 3œšš œ1 2¦®‚·v©ÎÜÛÊé+øµ#W0Ÿ<¬GEQ9Y^_”cÅeçeùc`ZbRýH>ü1×$ôšú«ë­ÝaÐ Äï¸B¯7§ú ©œ[šší›ÆŸ‘¥1­~¶HÁWÍmÚEè™ö…‰!Þ.A;pF1PSX«^cƒeàe-ds`ÅZ@S JX?\3U&‰= ¼ûRíIßéÑyÅ8ºa°&¨³¡) š$š·›SŸã¤L¬fµÀìËâØ£æçôeÑàJ-É9E O]Wì]”b=eÙefdê`x[,T,K¦@Ò4ì'7ú ýïüà‡ÓøÆ’»± ©u¢®åš(šz›Öž)¤W«=´«¾kÊA×êä ó˜$¥+C8¾CÚMbV+]bûdÙe¨dna;\)U_L B]6—)úË Uÿãð¿â3Õ„Èõ¼Á²ª6£0ž%›$š3›Lž_£Rª³?½×ÈÕãFñ¹ÿ.Zò)²6VB£LbUh\Ža»dßeòdûa]3V MzC÷7R+̬;ÃòäêÖÊa¾ü³ «ü£µžf› šêš¿’¢H©À±Í»<ÇÑÓJácïÒýM ‡9(5è@fK]TŸ[axdàe9e…bÓ]:WÞNéD9 -‹¡ô_æ¢Ø°Ëο8µ%¬Å¤=Ÿ«›!š¦š9Ë¡F¨‡°dºªÅÒß‹íöûu ¿ˆ&Š3€?.J\SÙZ€`3dßezec•^7XPKF;´.]!YñoöèIÚ8Í-Áh¶ ­†¥ÀŸí›!šeš·œ ¡N§[¯ ¹)Ä~ÐÊÝÇë.ú² ê$ 2*>IhRZ`ôcàe»eˆcP_+Y7QžG‘—g—°™ žd¤˜¬}¶ßÁ„Î*ÜŠêZùKa%í2r?¬JcTd\…b§f´h¡hof*bæ[ÆSóI > 2m$JZø’é>Û©ÍÁѵ ¬ö£À‰™e—`—{™©Ö£á«¡µâÀkÍúÚIéøüÅ$¹1S>©I€S¦[ða>fyh•h“f}bg\rTÇJ˜? 3ž%Yœ²ùêêÜìÎIÂæ¶ÿ¬Ç¤ižš³—~—h™ec£A«Ö´ò¿YÌÌÙèºöžeÂ"j0=„HzRÄZ6a°ehgh–f±bÌ\U†K@*4Æ&šî ûKìíÝAÐø®´¥/Ÿ š˜º—r™> £¹ª"´¿XˬØËæmõFe!/Ò;VGhQÓYl`e§g$h…fÒb]†U3LUA$5à'Í5 cü¤íEß‘ÑÎÄ>¹¯£¦÷Ÿ>›˜û—‚™¹¢9ªv³@¾_ʓךå(ôô° É-”:.F\PéX¨_vd;gègzf÷bt] VäL/B"6ü(} ·ýýîœàÞÒ Æeº(°Š§· Ó›÷˜2˜‡™ðœ[¢¬©½²^½YÉoÖ]äÚòšRµx,U9ESOXë^åcÚf¸g|f-cÛ]¢V¨MC27**IÕ ÿbðýá3ÔMÇŽ»1±n¨r¡_œR™Z˜|™±œé¡ ©î±f¼=È5Õ ãwñ.åM+8ÜCIN!W4^^c…f˜g’fwcY^QW…N!D\8s+¨D‘Ûñnã–՚Ƚ¼>²Q©&¢ãœ¡™r˜\™[œ^¡L¨±P»ÇÝÓœáùï¨þ_ б)¹6¦B9MJ˜S~[‰a›eŸg‰gZeaêZÞR%Ið=z1$Ñ-døÂé“Û Î°Áƒ¶Ò¬Ñ¤¨žwšU˜M˜^šž™¤¬3¶WÁÀÍ/Û\éøÍx³#61º=þHÈRäZ*axe¸gÝgéeãaâ[TrJ^?3š%qÍüùIëÝnÏ×Â}·›­c¥Ÿ—š;˜ø—Ñ™½¦£n«î´ó¿EÌ£ÙÉçmöCþR"ô/ž< HRYZÕ`[eÔg2hsf¡bÎ\U­K¶@p4'öR xû´ìUÞ¤ÐèÃd¸R®é¥SŸ²š˜¦—L™¢bª¿³§¾ãÊ4ØSæ÷ôÖ¡ !Ë.˜;0GWQØY‡`Beîg€hófPc©]VÏLôAÂ5y(]¸ ÖüîßÁÑäÄ9¹ý®e¦žŸËš˜\—ј_œñ¡l©¨²v½žÉáÖùäžóƒ\ܶ-£:`F°P^Y;`&ehÄhfgîcp^WÛMCü6Á)­ þAï¹àÓÒן¥¯ã¦ïŸîšú—!—i˜Ë›5¡Œ¨¨±[¼nÈ¢Õ±ãTò>"²£,­9‹EPÖXß_÷dhñh¿gsd_ÙWÍN(D!8ö*ìLbÿzðäáéÓÓÆæº`°w§Z -› ˜—"˜Y›š Ë§Æ°\»WÇxÔzâñé…ˆ+©8£D9O4Xe_¦dÝgøhógÒd¥_ˆXŸOE+9,„³ñã ÕßÇØ»4±(¨å ›C˜—˜ ›$ -§°yºWÆaÓRáâïÅþ¯ Q`*“7¥CXNtWÉ^2d“gÛhh e `YTPðE":&-@¸ÚòòOä;ÖÉå¼%²ú¨’¡œŸ˜B—˜ãšÎŸ¬¦Z¯ª¹hÅUÒ.à­î…ýi $)d6‹BWM‘V ^šc&g™hîg'eT`ŒYôP¸F ;0.d ð?ôœåƒ×<Ê ¾5³ë©a¢½œ™‘—%˜ÓšŽŸ>¦¿®æ¸}ÄIÑßoí7ü ³Ï'5SA7LU-]åbœf?hÅg0eŽ`øYQGý;D/–!:{¦õçêØ™ËW¿f´þªO£²™ö—V˜ÏšVŸÑ¥ ®¸„Ã)ÐÆÝìÇú– 3Q&§3ò?ðJiT,\b÷eÎgŠg-eÄ`eZ2RUH=r0ç"©9÷ èÚ%ÍÑÀƵ<¬e¤ižhšu˜›˜Ùš$Ÿe¥z­<·vÂîÎdÜ’ê/ù$2a>zIS[a4eDg=geô`ÔZÝR9I>º1X$;¬õødêCÜÝÎuÂN·Ÿ­œ¥mŸ3›™ê˜çšïžî¤Ä¬I¶LÁ“ÍßÚêèm÷©Ì"90­<åG©QÅY`hd¹fõfe6aY[£S²ž¼\È;ÕøâLñíÿŽä¤*‡7IC¯M‚V”]Àbëeg fübì]õV:NéC78a+ªY¸ò·ãìÕýÈ*½²²Ì©¥¢b šî˜Ó™ËœÆ¡ª¨S±•»:ÇÔ·áð¥þN ±„)€6bBêLäU]xbÑegKficƒ^³WOèDP9Ž,å›ûQóèä ×ʾ|³pª!£³Dšå˜™iœ9¡ö§|°Ÿº)ÆáÒ‚àÇîeý ~a(s5pAL6U™\b¡egtf¿c_[XèOÖEY:®- ×<ôæ5ØË¿Z´,«µ£ž„šø˜ƒ™"œÇ [§º¯»¹(ÅÆÑTß‹í"üÍ @/'S4g@,KkTô[ŸaOeòf~föcg_éXžP°FT;Ä.A!ØõdçqÙFÌ'ÀTµ¬k¤«žåš,™‰™ù›q Ø¦¯è¸2ijÐ)ÞNìÙú óê%3D?$JƒS0[aàd°flfdµ_eYEQ€GI<Ø/p"UÒ0÷½èÃÚŠÍXÁk¶ü¬<¥SŸ`›x™£™â›' ^¦f®¸9×ÏñÜë{ù‹ˆ$Ç1>þH}RPZO`Zd\fKf'dü_àYñQYHK=ÿ0µ#³@©ø8ê8Üòά£·®+¦ ò›Õ™Ê™Ò›àŸá¥µ­4·,ÂdΜےéú÷Œüþ"K0œ<³GVQSY€_¾c÷ef5dD`aZ¨RDId>A2%2ÔGúÙëÔÝÐ$Äþ¸H¯5§î •œ?šø™Ã›•ŸZ¥õ¬?¶ÁÍ)ÚèVöÜIQ!­.;LFP@X ^c‹eñeGd•`ïZrSEJ–?Ÿ3&Òˆ üœíß,Ò¶Åoº°N¨Ò¡>ªš#š¬›=ŸÃ¤!¬3µÇ¿¨Ë˜ØTæ•ô{Œø,|9ÕDÉN%W¾]pb$eÌeedö`[PT[Kà@57(‰R ÛýpïZáãÓRÇæ»Û±e©¯¢Þ ›?š„›Òž¤9«´t¾)ÊöÖ—äÆò9¦ÂC+å7dC‡MVê\ÜaÒd¾ešdnaH\EU‡L=Bœ6à)K#²ÿCñã’ÕàÈK½³dªt£cžK›>š?›KžQ£7ªÚ² ½›ÈHÕÒâôðdÿ× ž)a6 B_L'U6\ga dÏeïdb]RVÉM¬C18’+ôƒ óÖä-×WÊ—¾*´E«¤Çžm›šÜš¨r¢ ©‘±™»Ç–Óá)ïšý X(ù4Ï@VKWT¢[aŽdÿe_e²b^pWO"EÇ9@-ζC½ôræ«Ø¯ËÁ¿!µ¬š¤ Ÿp›ß™`šðœ¡ý§A°$ºpÅíÑZßpíçût ̤&´3¸?sJ¬S3[â`›dKfèetcý^™XiP˜FX;ã.{!eéTöïçÚâÌÇÀòµ¬ø¤*ŸS›…™Ë™#œ Ï¦ë®­¸áÃMвÝÉëJúé[U%Ž2Á>°I!SãZÎ`Äd¯f†fId`ËYÁQHæ<0#Ö÷VéKÛþͳÁª¶­>¥5Ÿ"›™'™J›wŸš¥’­6·T³ÎÜ-êºømû$z1Ü=ÿH§R£ZÊ`ûd g.g%ea[S†Ir>2¼$  Où³ê…ÜÏ”ÂX·”­{¥7Ÿéš§˜}˜lšjžc¤7¬¾µÈÀÍtÚ“è,÷óÜ"h0ùZIåRÀZÅ`ÒdÔfÀf—dd`=ZBRH=#1É#¶3ø êܱÎbÂS·¾­Õ¥ÁŸ ›‰™†™—›±Ÿ¾¥ ­,·2ÂxξÛÀé3øÏFM#0ï<H¢Q˜Y½_ðcf6f=d<`HZ€R I>í1º$ÊdÔùeëaÝнâ¸ù®ö¦Á |œ;š šë›ÓŸ®¥]­¹¶‘Á¬ÍÌÚ¬è÷Šóó!B/›;¾FqP‚XÇ^ cve½eõc%`cZÌRˆIÆ>¿2²%á• û¶ì¸ÞhÑ ÅÞ¹ °¨©¡=Ñšrš#œÙŸƒ¥­/¶ÛÀÎÌËÙçÎõC¡ž ñ-U:ŠEVO†Wï]pbódieÑc3`£ZTIüRôZa?e[g_gKe)a[SyIZ>ö1$iÏ ùnê>ÜÈÎQ·\­L¥ŸÎš—˜y˜ušžƒ¤b¬òµÁ\Í»ÚÛèt÷:ß#›0"=mH?RgZº`ehg g¿eÎaá[TšJ™?N3ú%àJ „úÚë™Ý Ðtø2®ó¥ˆŸ›¦˜S˜šòÆ£x«á´Ð¿ ÌUÙfç÷õ¼h°!I/ì;XGRQ¦Y)`¹d?g­gfDbŠ\ïTKÂ@—4['TÊ üZíßmѽÄA¹5¯Ë¦1 ‡›ç˜]˜í™/£°ªë³±¾ÊÊö×ñåsô1Þ. ×-’:F;P¹Xk_.défgf–b]«UˆLØAÔ5¸(ÊQ ˜ýíîšàëÒ&ƺ]°Ê§¡$œN™Œ˜ã™K³¢þ©³ ½ÉšÖ{äéò›E™O,9ÅDO®W^…cwfVgfÒb‡]WVhMèB 7*Dà 4ÿŽð7â|Ô¢Çí»š±Ý¨ä¡ÔœÅ™É˜ä™=¢P©$²‹¼PÈ6ÕøâQñöÿšó´*™7\CÂM•V§]Óbÿegfc^WVNDY8‡+Ó†èFòëã"Ö3É_½æ²ü©Ð¢ˆ=š™Þ™Êœ¸¡¨*±_»öƵÓYáœï3þÓ 1)ý5àAnLpU·\b‡eãf*f_c‘^ÚW[OBEÂ9-J¹ô¸åß××Êâ¾>´#«À£:ž°š2™É™qœ¡µ§°ºÅÒßËíWüö \?'V4^@KOTÐ[va"eÃfPfÊc@_ÈX…P FM;Ç.N!) ÿõ’ç£Ù{Ì]Àе7¬—¤Ðž›=™Ž™ñ›[ µ¦Þ®«¸êÃ`ÐÎÝíëtú މ%Â2ô>áINS [ñ`ádÅf•fQd`ÇY·QHÓÙ1‰${øLùÃê§ÜCÏܲ·ÿ­õ¥¿Ÿ|›B™™› Ÿ¥Î¬K¶FÁ‡ÍÎÚÖèV÷’µ"%0š<ÕGœQ»Y`bd´fðfe0aQ[—S,J@? 3Í%ËN  úìãÝiÐçܸĮ’¦0 À›X™™Éššže¤ ¬fµEÀnÌ¢ÙžçöÇ]!/ž;÷FßP#Y˜_dšfgTe—aß[JTÿJ/@4æ&ðy Ëû3íýÞrÑÚÄt¹}¯(§  œw™û˜•š?žä£g«¢´d¿v˘؈æûô§A{ .¯:!F&P‹X#_Îcrfg{eåaS\áT¶KAü4ä'ü ãüIî àsÒÉÅLº:°Æ§¡aœª™™zšý}£Þªù³ž¾—ʥׄåíó•.o -¾9EEcOåWž^lc5fëf‹eb­\_UUL¿AÓ5Ð(ú— ôý[ïáxÓ¾Æ/»±u¨¬¡Íœò™)™všÒ,£iªa³ç½Åɼֈääò‚\,À8YDŽN+W^óbáe¾f…e5AK‡TÈ[-a™düeNe’b×]5WÏNÑDn9á,lTãcôæcØtË•¿µû«¤¤'Ÿ ›"š´šTó¡y¨Æ°­ºûÅvÒÜßêíTüÑ Ù&Ò3¾?_J~SíZ„`&dÁeMeÌbJ^àW®OßE§:>.æ ä€ö¾çõÙñÌ÷ÀC¶ ­†¥ÓŸœZš¯št¡Á§×¯Œ¹¯ÄÑMÞEì¢ú e5%D2O>IcRZÓ_²c‹eWecÒ^¤XªPG<À/‡"šCÌ÷é§Û‹Îp”·0®s¦‡ ‰œš¢šÂœå õ¦Ñ®S¸GÃwϡ܃êÔøJšz#£0Ï<ÀG=QY _>cYegehcf_vY¶QOHq=U19$b¡ùMëdÝ/ÐñÃë¸T¯`§7¡ùœ¼šŒšjœL ¦À­·ÕÁßÍìÚºè÷tÍ¿!/R;nFP.Xv^Ôb2eƒeÇc`SZËR—Iæ>î2ï%*é tûíßÉÑgÅ5ºl°@¨Ú¡\Ýšjšœ¨Ÿ=¥¨¬Äµ`ÀGÌ9Ùõæ2õ¨  p-ä9,EOWWÚ]xbeªe/d¬`3[ãSßJW@4›'ç­ 7ýÎî¿àQÓÊÆl»r±©m¢±òš@š›Ÿ^¤•«ƒ´÷¾½Ê˜×Då{óób{÷+8DN”VR]+beÙešdQa\ðTL¶Aþ5.)‰T ÚþeðAâ¶Ô È„¼Z²Â©é¢òøš š-›[žƒ£ŒªO³¡½KÉÖ²ãåñcÞ ¥*a7þB@MñUå\÷a efeûaê\øUGMCg7©* ÚY×ñãöÕ(Éw½³UªG£žéšÄ™²š­§¢…©%²X¼ëÇ¢Ô:âmðòþ| Áw)V6B‹LmU”\Ûa'eef‘e­bÉ]þVoNIDÀ8,zF½*óÙä×$ÊJ¾Å³Ëª‹£*žÅšm™)šöœÆ¡~¨ý°»—ÆAÓÕà ï™ý4 ‘e(h5VAñKU\\ÖaUeÅf!fjc®^X—OŠE:m-ܤkôæØ Ë¿U´,«º£'žš™“™4œÜ q§Ò¯Ô¹CÅãÑtß®íHüõ k^'„4›@dK¥T/\ÜaŒe.g¸f-d™_YÃPÍFg;Ë.=!b«õ)ç(ÙïËĿ洎«ë£&ž]š£˜™w›÷Ÿi¦¬®–¸ôÉÐÞSì÷ú¶ CR&œ3Ú?ÌJgÞdr`ZÝQÿG«<0’"T¬æöOè2ÚÚÌŠÀƒµþ«.¤:žAšY˜Š˜Õš.Ÿ}¥¢­t·¾ÂGÏÍÜ ë¶ù‚"K%²2?,JÅSª[´aÃeÂg¦goe*aìZÕRIÐ=N1Ì#ãøjé7ÛÃÍSÁ)¶~¬„¤ežAš.˜5˜Xš‹ž¸¤¿¬v¶¬Á&΢ÛÜ鉸] F$Å1B>|I8SC[ua­eÔgàgÑe°a•[SóIÉ>Y2ã$®/ù~ê<ܵÎ.Âè¶­¥Àžwš=˜˜š(ž2¤¬³µÏÀ3ÍŸÚÍès÷E÷<#É0Y=ªH‚R­Za^e¬gàgøeÿa \5T¬JŸ?H3ç%Â! QúžëVÝÁÏ(ÃÊ·ã­§¥@ŸÐšm˜#˜õ™Ùº£z«ñ´î¿7ÌÙªçEöÇ"¯/S<½G³QZ{`ezgÚgfQb†\ÚTuK‰@O4'ïY ŽûÙìˆÞåÐ7Ä¿¸¹®Y¦ÊŸ/›Ÿ˜(˜Ì™‚8£Ïª ´û¾'ËfØqæõËÖ .:;ÀF×PJYí_ŸdFgÕgJf«b ]ŒUNL…Ah56(4© ãü,îÒß Ò[Åǹ ¯§a ˜›Ø˜0˜£™(¯¢ªA³ø½Ê)×"å¦ói ~9-:ªEãO}XK_,dgÆgmfc“]@V.M‹B6x)Š Nþ—ï6átÓšÆêº °ó§¡œ%™I˜ˆ™Úœ.¢i©e²ô¼ÞÈæÕÉã=òù¯Ü+Á8DÙN›W•^¥c¯f¥gfJc^ìVNC´7»*åxÁÿ ñ¤âÔÔåǼ®±Ù¨É¡¡œ}™m˜v™“œ³¡½¨‹±ñ»·Ç¡ÔlâÐð‚ÿ7¢x*r7LCÉM²VÙ]cWfƒg•f“c^WæN–Dâ8,Ií?‹òä?Ö:ÉR½Ã²Å©‡¢-Ô™˜_™Dœ/¡¨¥°ßº€ÆKÓýàPïúý® )6 B­LÁU]‹bÿecg¯fæc_[XÕO±E$:i-ÃyÔ!ô«å¾×¢Ê›¾ç³½ªN£¿.š­˜D™ï›¡ A§®¯º¹3ÅÝÑvß·íXü „y'¡4¹@KÁTJ\ôa£eBgËf>dª_&YÔPßF{;ã.W!„ÒõTçWÙ"Ìú¿µÆ«"¤[žŽšÏ˜&™“› o¦¥®¸ÐÃVÐÔÝì˜úJ ËÑ%3M?>J®Sm[Ra>egèfœdG`ÿYåQ#Hë#2Ô$ÆB”ùëçÜ}ÏÃÚ·®¦ÅŸt›,™ù˜ÛšÉž®¤m¬ÜµËÀÍ?ÚAè½öjú""š/I’ReZc`mdnf\f7d `ìYûQaHO=1²#«4˜ø!êÜÒ·Âz·æ­ü¥äŸ¿›¢™˜™¢›´Ÿ¹¥“­·ÂYΜۛéø«%1#‡0á<ÿG¨Q©YØ_dNfrfƒdŠ`œZØRgIx>E2%¦ úŒëxÝа¸Ʈ°¦i œÃ™…™\›=Ÿ¥Â¬!¶ÿÀ%ÍRÚBè®öJËå!O/Ã;GÏPùXV_Ãc+f€fÁdø`7[œSPJ?i3G&]ö Zû×ì·ÞDÑÄÄw¹™¯\§ë hœê™~™&›Úž†¤ ¬GµÀÌ)Ù çnõ ޳ ..¹:FPPXÔ^lcffïdQa¹[ETKl@n4`'†' ŽüîÞß\ÒÆÅ_ºb°¨k¡¿œš€™ýš‡ž ¤l«…´%¿ËØíåHôßg•-¾91E>O®WW^cÓefe¢a2\ãTÛKIAe5k(ŸI ³ý*ï÷àfÓ½Æ=»"± ¨å¡@š™Òš3ž£ÌªÃ³E¾Ê ×Ñä#ó·Cz,Ç8TD~NWà]Èb®e…fHeüa´\‹U¥L2Bg6)Äw ãþVðâxԹǼã±>©[¢^ašs™ššÏ£ªë²O½ ÉéÕŸãèñ{ Nø*Ä7nCºMtVl]€b•ešf‹embP]OVŽM:C‰7¸* Ã0›ñRãœÕÃȽ¨²Ù©É¢œnšO™EšJP¢<©ë±/¼ÓÇ›ÔDâˆðÿ¶ Ê)³6€BõLÚU]GbŽeÇfêeüb ^5W™NdDÍ8,l,—úò äÕÖßɾz³ªC£æ†š5™ù™Îœ§¡h¨ñ°»›ÆMÓçà"ïµýS ²…(‡5rA LUk\ßaWeÁffZcš^ïW|OmEö9R-Äeôæ)ØË&¿~´^«ö£kžÚšV™ç™Šœ0¡Â§°º}ÅÒ’ß¼íDüß A '348@ïJ!Tž[@aéd‡ff‰cþ^…XBP^F;Œ.!ûzãõçžÙ‚ÌsÀ­µi¬×¤Ÿ[›£™ý™iœÙ 7§a¯,¹gÄÖÐ:ÞLìÅúW ¹ %Ã2Þ>³I S°Z`^d1fóe¤cP_YÿPKG'<Ê/w"qs÷é'ÛüÍÕÁñ¶‡­Ê¥àŸê›ú™šMœƒ ©¦®8¸FÃÏÓÜÌê4ù¾ $B1v=kHèQ¼Y¿_ÒcßeÛeÈc¯_¦YÍQLHT=1ê#üœù³ê¾ÜÏ@Ã9¸§®»¦ž oœDš)šœ ¦Â­*· Â/ÎTÛ7é÷yt"¼/ <%GÍPÒX _Wc eÚed'`XZµReI™>ˆ2q%˜E ÁúYìWÞÑ£Äw¹¸¯™§E¡ÜœtššÓ›’ŸE¥Î¬¶¿À¿ÌÉÙšçéõlÙä E.¶:÷EÍOXv^üb‚eùe_d½`%[´S‘Jì?ú3û&2æ `üîíØßiÒæÅ‘º£°P¨Ä¡ }šé™f›ížk¤Ä«Ó´h¿LËBØæRôÚTuó,‰9ôDúNgW^ÏbŽe?fÞdqa \ÆTÊKDAl5}(½p ãý`ï3á¥ÓýÆ|»]±×¨¢9]š‘™Ùš-ž~£®ªš³¾áÉÉÖˆäÖòiö0Î+Š8 DVNöVÒ]Èb¾e£fte6bú\ÜUÿL’BË6ç))Ø ?ÿ¨ðaâ³ÔäÇ9¼ì±5©@¢1#š%™>šg¢Ÿ©n²Ñ¼‘ÈrÕ0ã…ñ%ÆØ*¹7xCÚM¨Vµ]Ûbfgfúbá]áVNÄC 8++llÁñ`ã“Õ¡ÈϼX²u©S¢Ý™µ˜¦™ªœ³¡¦¨_±±»fÇBÔâ^ð ÿÁ . * 7ïBxMoV¦]öbDfg f¬c±^ËWOÒD!9G,‡'s·ò?äWÖFÉR½·²®©e¢¡™U˜#™œó Í§r°µº`Æ7Ó÷àYïþÖ WK)h6lBM0V‹]ÿbrfÐgg=d__‘XöO¼E:C-„!eœóå×ìÉÛ½"³ø©¢„™˜Ã˜‰›Y §©¯Ú¹xÅGÒàeî$ýñ ‡(»5ØAžL×UR]èb|füg_g©dè_5Y²P‹Fö:..v W‡ôòååקʾ«³dªÙ¢3Ž™ü—ˆ˜-›ÝŸ‚¦÷®¹œÄ\Ñ ßjí(üù ’¦'ë4AÿKUUï\§b^fh‰g÷dX`ÄY_QSGÔ;/u!b‘õõæÜØŽËQ¿d´ÿªT£ŠÀ™ ˜m˜ìšwŸø¥L®H¸¸ÃbÐÞSì ûÛ x–&ì33@.K¢T^\;bfæg˜g/e¹`MZ R"HÁ<%0"F”Åö&èÚ¦ÌSÀKµÆ«÷£žš.˜e˜¶šŸj¥–­m·½ÂKÏÕÜëÃù0Y%¿2?5JËS®[µaÁe¾g ghe"aåZÏR IÏ=Q1Ó#›ó'ø„éVÛæÍzÁS¶ª¬±¤‘žlšU˜X˜tšŸžÄ¤Á¬n¶™ÁÎyÛ¨éKø¼ñ#l1æ= IÞRïZ'aieœg¶g¶e§a[¸S!J ?¬2G% ‚¸ùëÐÜIÏ¿Âr·­s¥ŸÁšp˜8˜š žû£Æ«FµJÀ˜ÌñÙè©öt#j"þ/š<ûGèQ,Z`e‰gàgfGbu\ÃTZKi@+4Þ&Ç0 cû®ì]޺Рĕ¸®0¦¢Ÿ›x˜˜¦™^£­ª´Þ¾ËPØaæöôÆ‚Þ ‘.S;áFQ|Y(`âdg&h fcj]éU«LßA¾5…(yä ýLîâßÒIÅ¢¹h¯Ð¦ -›_˜ª—™œ¢z©¤²_½tÉ¥Ö­äCóêa6-":áE5PëXÓ_Ìd¹ghCgácy^'WNeC[72*-• ·þÞïXápÓoƘº(°V§O 8›+˜9—f˜­›ü 8¨<±Ù»ØÇúÔýâ—ñ|_óí+9óD~OlX‘_ÆdðgiïgÂd‹_dXrOäDï8Ó+Ò7K^ñ»â°Ô…Ç~»Ú°Ñ§ >›÷—˖—՚õŸ§é¯iºTÆjÓháð÷þî ¹*÷7DÐNóWN_»dhdi‡hŒe‚`‚Y²P>F^:N-R´¾¾òäÙÕˆÈW¼…±J¨Ö O›Ô—t–9—šŸÿ¥À®&¹üÄÒþßî–ý cš)û6>C$NuW_Ÿd3hªiýh.fMasZÂQjGž;œ.¨ ô5åòÖ„É1½8²Ó¨2¡~›Ó—F–Ý––™cž+¥Ê­¸ÕÃÍлÞUíPü_ 3~(ø5YBbMÙV^Wdh»i:i—fßa+[žRcH±<Ã/Þ!HN=õeæØŒÊ¾³y©°¡Ñ›ú—?–©–6™Ùz¤ö¬!·Ç«ωÝìû) e'ö4tAžL;V^ dúgÌixigrbä[yS\IÂ=è0#…oö‰ç"Ù…Ëø¾¼³ ª¢œ ˜&–d–ƘA½£¬&¶µÁ‡ÎZÜçêâùüéY&4Ÿ@ìK®U´]ÔcígêiÂitg c¤\YTXJÕ> 2=$³·™÷¥è+ÚuÌÊ¿l´—ª}¢Hœ˜––Q˜¤œü¢6«)µ ÀaÍ*Û±é­øÏÉM%3É?7K UN]˜cÝgj jèg©ce];UWKì?53s%ïôÏøÐéCÛuÍ­À.µ3«ð¢œ4˜ó•Ù•æ—œ?¢Vª*´‡¿3ÌìÙkèe÷‹#$ü1Ò>aJnTÆ\;c®gj8jCh0d^VQLAd4µ&=H "úë€ÜžÎ¼Á¶ÿ«”£ ˜–Å•¢—œ› ¡©;³w¾˪Øç ö,4Ó"½0©=VI†S\¤bDgÍi0jlhŠdŸ^ÉV0MB‰5ô'‘© ŠûƒìâÝòÏûÂB·­r¤½™f–é•“—[›-¡ë¨l²½ìÉpׯå¤ô¼Àc!W/V<HhR [Ôa¢f[iñiahµdý^YWñMôB6+)ä ýîaßiÑdÄ•¸9®…¥¨žÄ™ò–B–¶—G›â k¨¹±¼ÞÈ<Örä6ó<5ÔÍ-×:°FQÝYÎ`Ée´hi'h³d4_ÉW–NÍC¤7\*9… ‹þšïáÓøÅº¡¯Í¦ÉŸ¸š´—Ζ ˜`›À  ¨"±Ð»ÞÇÕãÀñ«“(,19EšO}X”_¼dØgÚh¼g„dC_XODš8‚+ŠúBñ´â¿Ô¬Ç½»2±@¨¡Ú›¤˜‡—ˆ˜¢›Ã Ò§ª°»óÆñÓÑáNðÿê pa*v7iCþMþV:^ŒcÚfh/g4d2_CX‹O7E}9š,Ði­êòlä~ÖiÉp½Ò²Ä©v¢¨™U˜™÷›Ù ¨§A°wºÆÝÒŽàâîýC ¹£(¹5·A`L|UÛ\YbØeGgžfác_oXöOßE^:°- Ö;‘ô#æ<Ø$Ë ¿m´B«Ð£<ž¤š™¤™Bœä t§Î¯Ç¹+ÅÀÑCßoíûûš å&ÿ3 @ÉJT‰[3aædf f¢c _°XvP›FR;×.j!PÓ?öÝçúÙÝÌÊÀÿµ´¬¥XŸŠ›Æ™šrœÔ $§?¯ý¸*ÄŒÐäÝìë[úæC&%H2e>=IšRIZ$` dïeÀe‚cA_YQuGb<0Ô"Ýz÷÷é¹Û‘Îj‚·®M¦X SœSšašœ  ¯¦®¸ Ã=ÏmÜUê­ø*i#™0Ì<ÄGGQ%Y5_Wcweˆe‹cŠ_›YÛQsH”=v1X$0¸ùaëuÝ<ÐûÃñ¸X¯a§5¡õœ¶šƒš_œ? ¦±­þ¶ÄÁÍÍÚÚ¨èîöb»­!ñ.B;_FP!Xi^Éb)e|eÂc`RZÍRœIí>ø2û%9ú ‡û,í2ßâÑÅOº†°Y¨ò¡rñš|šœ³ŸD¥«¬ÂµZÀ<Ì)ÙáæõŒëîK-¾9EèN1W·]Wbúd’edž`,[âSåJd@•4¶' Õ dýÿîóàˆÓǤ»¨±B©¢Ü›^š²›Ÿa¤«r´Ü¾™Êj× å=ó®-§+?8´CÉMLV]òaØd´edEa\U6LáA76s)Ù® <ÿÍð­â%Õ{Èð¼Á²!ª?£=ž6›9šL›hž~£tª&³e½ÿȵÕGãnñáÿU*Ñ6rBºLuUu\–a¾dÛeèdêað\V{MOCÆ7+’oû‚òNäªÖÛÉ%¾Å³ïªÒ£“žM›šå牐f©é±¼{ÇÔœá¼ï1þ° íŸ(~5IAÁK±Té[FaªdfMeˆbÅ]W­N¨D=9ª,/œôÒåØ"ËD¿µ´­«Y¤áža›ê™…š.Ø¡j¨Ã°·ºÆ›Òà)î ü) xC'C44@ØJøSe[÷`“d%f¥ec„^XÃOàE’:.¨ ‘õ6ç_ÙQÌNÀ–µ`¬Ü¤0Ÿ{›Ï™6š­œ(¡§Á¯“¹ÔÄGÑ®ÞÁì9ûÊ ( &%38?JMSèZ«`xdNI¿RƒZq`jdZf6fdÂ_“Y’QêG˨2]%PÉú}ëPÝ×ÏXøD®¦ÉŸh›™Ò˜ªšžq¤-¬µÀÌÌÚè¥ö^û0"µ/A<•GuQ¯Y`‹döfJg†e³aä[8T×Jñ?¿3€&zô :û™ì]ÞÐÐ7Äո宙¦ ”›™ª˜XšžÑ£j«º´‘¿¶ËêØéækõ#Å!›.?;®F¯P Yœ_;dÒfSg¼ebr\îT²Kí@Ø4°'»A Œüêí¦ß Ò]Åà¹Ï¯_§» œW™½˜:šÈS£¿ªå³•¾™Ê±×šå ôº[¡B-ø9E¡O$XÝ^ªcrf&gÄeQbá\ULçAø5ñ(° þkï%áÓÀÆ+»ü°f¨˜¡³œÑ™™HšŸó¢)ª³ž½xÉlÖ7ä‘ò0ɸ+~8D^NWê]çbãeÎf¤ekb4]VBMÙB77*}0šÿñÂâÕHÈœ¼N²“©š¢„nšf™sšŽ§¢¥©a²°¼[È'ÕÐâñœÿ)m*ñ6¨BMÒUâ\bAeefveyb}]VüMÇC38|+ä²/§òdä±ÖÕɾ¦³Æª¡£Zž›Î™ š]¢!©¦±Á»>ÇáÓháïþŠ Ì‚(f55A°K£Tß[>a¤dfLe‹bÊ]#W¹N¶DP9Á,J2ÁBôæFØZË€¿õ´ï«ž¤&Ÿ¦›-šÅšj¢™¨é°Óº$Æ Òàî}üø 9÷&ë3Ñ?lJ„SëZz`d¨e,e£b^ªWsO Ee:ú-¢  ?Çõ…çÃÙÇÌÕÀ+¶­…¥ßŸ,œšàšN¼¡¨2°ï¹ÅqѼ޳ìûƒ Æ%‘2Ž>GIƒRZÏ_šc`eeÄbo^/X'P~Fh;/à!ñœ*÷æèÛ ÎÂ=·ð­L¦{ ™œ»šëš(e¡Ž§‚¯¹ÄXЋÝqëÁù2xI$^1r=HH¦Q\YB_9c-eeïbÈ^´XÕPQG\<-0#&Újø"êLÜ/ÏÃ,¸¾®ö¦ü ðœæšéšøœ ¡ §Ö®I¸/ÃRÏqÜHê‘øÿJ&#K0v(2$%_! ´úaìuÞ7ÑìÄÓ¹'°¨Õ¡y›Ìš‰œJ ü¥‚­´¶cÁWÍRÚèKö¸ ÿ E.œ:ÂE~OWõ]fb×d>e–cê_KZØR·I?/3>&†O âû‹í“ßDÒâÅ®ºâ°°¨D¢¾6›¹šJœáŸk¥Ë¬ÚµkÀEÌ-ÙÝæõ|ÖÔ,-™9ÜDºNÿV€]b»dOeÕcV`âZ—SšJ@L4p'ǘ -ýÑîÍàlÓòÆ »±±X©À¢ žV›©š œrŸÎ¤¬î´]¿Ëí׎å¸ó"‹ö+}8ßCáMOVý\Éašd`edË`†[fT‘K3Aƒ5¾(%ÿ •þ3ð#â­ÔÈ¥¼² ªE£_žt›’š¿›óž¤(«é³4¾ÕÉÖ äBò¬*«*O7ÕBM›U{\|aƒd€epdVaD\SU§LnBÜ6-*¤…°ñãÖMÉ´½s³¾ªÃ£¦ž‚›gš[›YžQ£)ªÀ²æ¼iÈ Õâ«ðÿ‡ ²M)6ÁALéT\:a|dµeßdþa!]aVáMÌCX8À+D+¾Góåg×Ê̾Z´p«<¤äžƒ›+šãš§i¢©{±}»âÆpÓæàýîmýë +å'Ð4©@4K:T‹[adøe_e·b^W,O›ISÓZÁ`ºd¨ffGd`ÐYÉQHó<00#”ì÷nécÛÎËÁ¶5­U¥KŸ6›,™7™X›ƒŸ£¥˜­9·T°ΠÜ#ê­ø]è$a1Á=áHˆRƒZ¨`Ùdþf geñ`åZSpI`> 2³$œWùÁê™Ü(Ï´Â}·¿­ª¥jŸ›à˜·˜¦š£žš¤k¬ïµòÀ>͑ڧè7÷õ”É"J0Ñ<HòQZy`Þd8gzg£e½aÜ[T«J´?s3&&ƒ ÁúìÛÝLдÃU¸j®&¦´Ÿ5›Â˜f˜$šò¾£g«È´°¿åË)Ù6çÄõ‡2z!/»;+G*Q„Y `¤d0g¥gfKb—\UµKß@¹4'|ó 2ü„í7ß”ÑâÄc¹R¯å¦F —›ò˜c˜î™‹&££ªÛ³ž¾³ÊÝ×ÖåWôÀ ¹-u:F!P¡XU_dØf€gfŽb ]©U‰LÝAÛ5Ã(Øb ­ýï´àÓDƬº}°ë§"¡Eœn™«˜šfË¢ª³®½šÉ Ö|äçò”9‰:,9¨DæN‹Wi^]cMf*gñe¦b\]-V@MÃBë6÷)*Ë &ÿ…ð5âԮǼµ±ÿ¨ ¢ú™™#šS‚¢—©k²Ò¼•ÈvÕ4ã‡ñ$¿Å*7UC®MtVy]˜b¸eÈfÃe­b˜]žVâM“Cæ7+i#úñ®ãöÕÉX½ó²ª£Ò›šr™^šYT¢4©Ö±¼¥ÇaÔýá5ð¾þM –O)16ùAjLNUw\ÀaeOf}eb½]÷VoNPDÏ8(,œsõnó)åo׉ʹ¾=´J«¤±žL›ò™©šn2¢Ü¨J±P»ºÆLÓÅàßîRýÑ Ì'¶4Ž@KTh[Û`XdÌe1eˆbá]SWOEÄ9H-â×qùô¼æÙÌ2ÀµŠ¬(¥žŸœxšöš ¢y¨¯°~º¶ÅÒnßiíÃû2 l&&3?§IÌRCZå_—cDeãdyb^¿W¨OõEØ:Š.L!b­övè»ÚÁÍÍÁ·ä­V¦š Ìœ›A›‹Ó¡¨ú¯¹’ÄÈÐñÝËë úlŸ]$]1]=HjQYç^Òb¾dŸdwbQ^CXlPõF<ñ/Ü"Ý„øSê’ÜŠÏ}ê¸I¯‹§—¡Œ›{›€ƒ¡o§%¯~¸IÃOÏOÜ ê3ø†¶{"Œ/§;FPÝWï]bIdpdb°^çXQQHg=y1Œ$áÁsúCìyÞ]Ñ2Å9º©°µ¨„¢8žç›››X¡»¦1®N·ãÁºÍ–Ú3èKö•ǘ ¿-ú9 E±NÂV]€aôccdÊb1_«YURTIØ>3K&º© aü+îRàÓÐÆ«»è±º©K£¼ž$œ’› å¥­¶hÀÌÓØZæfô¯êÍ,q8­CŠMÖUe\aÐc…d1cÛ_”ZxS«J[@½4(† <þúï â·ÔCÈï¼ö²ªÞ£ Ÿ0œZ›œÃŸí¤î«¤´à¾oÊ׌ä”òá+'Œ*7B•LUë[Ý`ÚcÐd½c¤`–[­T LâAa6Æ)QJ÷ÿ¤ñ›ã$ֆɾӳ.«B¤0Ÿœÿšõ›òžæ£¹ªE³a½ÖÈjÕÛâåð=ÿš ±9)í5‰AÒK’T›[Ê`d6e\dyaœ\ÞUcMUCê7\+ìá‚óõä\×”Êá¾´¥«€¤5Ÿà›“šS›žæ¢‘©ý±þ»aÇêÓYáhïÍý? r(÷4À@9K,Tk[Ð`>d¤eûdEb‘]÷V™N¢DG9Â,SAÕZôæ`ØsË–¿µü«¦¤*Ÿ¤›'š»š^¢‹¨Ü°ÉºÆ Òà$î–ü g0'.4@ÀJßSK[Ý`xd f‰eùbf^éW£O¿Eo:ð-‚ jñdõ ç7Ù*Ì)ÀtµB¬Â¤Ÿm›É™8š¸œ<¡¬§è¯Ä¹ÅŠÑøÞí‘û& ‡i&„3”?ZJžS/[è`¨d^ffc_¶X…P°Fl;ó.†!ièLöâçöÙḬ̂ÀÛµ†¬ä¤ŸH›‚™Ð™1œ™ ñ¦¯ä¸!Ä–ÐÞì£úD µ«%Þ2 ?ìIOS[Ü`¾d•fWfd«__YCQGK<Û/r"VÐ+÷´è¶ÚzÍDÁS¶â¬ ¥7ŸD›]™Œ™Î› X¦h®!¸OøÏÝ7ë½ùdßä$)2j>fIåR¶Z¯`±d¨fŠfWd`ëYçQ:H=´0U#?¹ø’éˆÛ;ÎðÁè¶\­}¥tŸa›Y™f™ˆ›µŸÕ¥Ê­k·„ÂÝÎ5ÜGêÊørô$X1¬=ÀHZRHZa`…dŸf¤f”dy`iZ„RòHå=—1G$;»ùê|Ü Ï£·û­ý¥ÓŸ›o™W™S›[ŸX¥,­®¶­ÁïÍ5Û:é¶÷\áù"\0Ã<ïG¦Q´Yð_:d|fªfÃdÐ`çZ&S¶IÇ>’2W%Zä@ú»ëžÝ4ÐÃʸĮ¤¦T õ›™X™)›Ÿ×¤ƒ¬àµ¾ÀãÌÚèvö¾!//«;òFÈPûX__ÖcEf£fëd)an[ÙS‘JÆ?°3&¦= ŸûíôÞ{ÑôÄŸ¹·¯q§õ gœÝ™f™›ªžK¤È«ù´¯¿³ËÅØ£æõž%M Î-`:ÄE¾OX­^Ucùef eaü[™TKà@ð4í'Ä /ý¨î}àôÒVÆãº×°e¨º¡÷œ7š†™èšWž¿£«´¾kÊ\× åoóÿ„³C,í8oDŽNWÚ]·b•ecfeÏa„\YUsLB;6[)¤_ ÕþQðâˆÔÓÇA¼²q©”¢›¡šµ™Úš ž:£Iª³n½ ÉïÕ—ãÓñXÚ®*o7CVM V]b*e5f-eb ]VeM#C…7È*,úzùñÀãÖMÉœ½C³yªj£;ž›à™Éš¿³¢Š©"²M¼×Ç„Ôâ<ð·þ8 u#)û5¼A'LU/\xaÈd fAehb]ÓVTN?DÈ8+,©ˆóOå™×µÊå¾g´r«3¤Ðžf›š¶št1¢Õ¨<±<»¡Æ/Ó¥à¾î/ý° ó¯'4{@ KTg[â`fdáeLeªb^W/OFEõ9y- —õÔæÙÌ1À’µu¬ ¥vŸ×›@š¸š>Ä¡2¨g°9ºtÅßÑ8ß;í û `'&(3?ÏIÿR‚Z.`ècœeAeØbp^XPIF#;Ë.!‰,µönè¡Ú—Í“ÁÒ¶­ô¥. XœˆšÅš[¡‘§’¯3¹CĉÐÄݱëú{Õ$©1»=HçQ—Yw_hcVe6e cÛ^ÁXÛPRGX<%0ø"ÈVø ê5ÜÏ÷¸¥®Ý¦ã ÖœÌšÎšÝœî ì¦·®(¸Ã/ÏMÜ$êløÛ&#+0YÅ2Ï%Þ tû"í1ßêÑ“Åjº«°‡¨)¢±7›Èšgœ  ž¥­¶·À–Ì€Ù3çeõÏ& p-Ö9EäNW–](b¼dFeÃc:`¾ZkShJâ?42'‡W íü’î’à4Ó¿Ær»‰±7©§¢ûK›¦šœ}Ÿá¤¬ µ‚¿EËؾåëóV¶¿),®8D NvV ]æa±dre$dÏ`„[^T‚KAh5(ÿÕ hþðñázÔåÇr¼^²Ü©£7žP›tš§›âž¤$«ì³?¾çɨÖ@ägòÖA]á*‡7 C8MÒU°\­a¯d¨e‘dqaW\^UªLhBÎ6*†`ïÿñYãÈÕÉw½5³‚ª‰£pžQ›<š7›<ž=£ª¾²î¼zÈ&Õ±âÔðFÿ½ ì‹)S6BZL'U:\oa«dÞeÿdb/]eVÛM½C@8Ÿ+ú‡ óÒä&×NÊ‹¾´6«¤µž\› šÍš›g¢©±™»ÇÓá6ïªý+ m&(5æ@lKkT´["a™dfbe°bÿ]fWOE°9&-±˜$ŸôTæØ•Ë«¿µ÷«“¤Ÿu›ë™ršž¡¨g°MºœÅ҆ߛíü˜ ë½&Æ3Â?uJ¥S$[Ê`zd"f·e>cÁ^YX'PUF;¤.@!0¼/öÕçøÙàÌÑÀ ¶Á¬(¥gŸš›Ö™$š‚œå 4§P¯¹>Ä£ÐþÝ ì|ú mU%{2œ>xI×R‰Ze`Md,fúe·co_7Y1Q…Gg<0½"·E³÷LéZÛ'ÎöÁ·‘­È¥ÓŸÑ›Ö™í™œF f¦W®ð·þÂJÏ’Ü’êù•ü#<1}=~HRçYô_d$f&fdÿ_õYR’H“=T1$®ù§ê¥ÜZÏ Ãù·]®h¦D œå™Ë™Ã›ÄŸ¸¥­ö¶çÁÎOÛCé®÷C¹Â"0s<•GCQKY„_Ícf@f^ds`“ZÝRxI–>o2B%TìVúÞëÎÝoÐÄØ¸¯ÿ¦² Uœý™·™…›\Ÿ)¥Í¬"¶÷ÀÍ7Ú è…ö–¬!/…;ÂFP»X_ŠcõeOf•dÑ`[‚SñH8RÕY _|cUe!eáb¡^vXPìFæ;«/x"“CÓ÷é¼Û¦Î¸·W®œ¦± ´œ¹šÊšéœ¡§ì®i¸XÂϧ܄êÐøAj#0¸<§G#QûX_$c@ePeScT_fY©QEHj=Q18$c§ùUëmÝ9ÐûÃõ¸_¯j§A¡Äš“šoœP  ¦Â­·ÕÁÞÍìÚ¹èÿötÎÀ!/U;rF#P4X|^Ûb9e‹eÏc `YZÑRœIè>ï2í%'ã kû í ߺÑVÅ"ºW°*¨Ã¡EÇšUšò›–Ÿ-¥œ¬»µ[ÀEÌ<Ùüæ>õ¸) Œ-:OE3O}W^Ÿb=eÏeQdË`O[ùSñJc@‡4›'á¡ $ýµî à-Ó¡Æ?»A±Û¨8¢{½š šj›Óž3¤o«b´Ý¾ªÊ‹×?å~óþt•,¸81DINÌV]jbHefÚdaL\)UMLåA'6P)£f ãþeð9â¥ÔóÇb¼0²©±¢µ¶šÄ™äšž8£@ª³Z½ ÉÔÕ{ãµñ:¿÷™*_7CSMV ])bHeZfZeMbB]SV¥MdCÆ7+h0©òÜã+ÖRÉ”½.³Wª;£ÿÀš™mš\J¢©´±à»nÇ!Ô·áëïsþ P)ú5ÍALL?Uy\Óa3e†fÅeöb%^lWîNÖDZ9´,'÷pÛó†å¹×½ÊÕ¾>´0«Ú£ažâšo™šÁœu¡¨x°zºåÅ|Òà*î±üI ¦'‹4‡@4K\TÎ[eae•ff€cé^fXP-FÔ:K.Ñ ­)Žõ*çFÙ,ÌÀZµ¬¤Úž›n™Ò™GœÂ *§_¯6¹|Ä÷ÐfÞƒìû¡ ù%!3A?JpS[å`½dŠfDfìc_>Y!Q_G+<¿/["EÆ)÷ºèÃÚŽÍ^Ás¶­F¥^Ÿj›€™ª™ç›+ `¦e®¸5Ã’ÏëÜùêuù†…$Ç1>I†R]Z_`ldqfcfAd`üY RtHd=1È#ÁI«ø4ê-ÜáΓ…·î­¦çŸ¿› ™”™››«Ÿ¯¥ˆ­ · ÂKÎŽÛéø%#|0×<öG Q¢YÓ_dLfqfƒdŒ`ŸZÜRlI~>L2%¯ú–ë‚Ý"к̸Ю¹¦r œÊ™Œ™b›AŸ¥Å¬#¶Á#ÍOÚ?è©öDÄÝ!F/¹;÷FÄPîXJ_·cfuf·dî`.[•SJJ}?g3F&^ø _ûÝì¿ÞMÑÎă¹¥¯i§ø uœ÷™‹™2›åž¤¬Oµ ÀÌ+Ù çmõˆ¬ %.¯:FöODXÈ^`cóevfädGa°[>TKh@k4_'†) ’ü îäßcÒÎÅhºk° ¨u¡Éœ šˆ™›Žž¤q«ˆ´(¿ËØíåFôÜd‘-º9-E9OªWT^cÑe}fe a1\âTÛKIAe5k(ŸI ³ý)ïöàeÓ»Æ:»±œ¨à¡ ;šz™Íš.ž‹£Èª¿³C¾Ê ×Óä&ó¼I‚,Ò8`DŒNWï]Öb½e“fUeb¾\“U«L5Bg6~)¾n ØþGðâeԣǼ˱%©B¢FJš^™ˆšÀö¢ªç²O½ÉòÕ¬ãúñ‘%j+å7CÝM–V]Ÿb°e²fŸe|bY]RV‹M1Cz7£*î£ tñ(ãqÕ–Èܼ}²±©¥¢}Tš<™8šES¢G©ý±H¼óÇÂÔpâ¹ðQÿí A*ê6µB&MV)]hb¨eÙfôeþb^&W‚NFD§8â+:ô[»ò_ä’ÖœÉÀ½<³Fª £µ[š™Ý™ºœ›¡f¨ø°$»µÆpÓáUïïý” øÐ(Õ5ÃA\LiU»\-b¡egUf‘cÈ^X–O|Eù9H-­mÓ)ô¼åØ×Ãʾ´îª‚£õdšã˜x™!œÐ l§Ô¯Ü¹QÅõщßÅíaü …v'›4°@vKµT<\æa”e4g½f1d_YÈPÔFp;Ø.L!xÄõFçGÙÌç¿ µ°« ¤Cžuš¶˜ ™{›ñŸZ¦“®s¸ÆÃQÐÔÝì¤ú\ äñ%93y?oJåS§[a~e_g(gÛdƒ`7ZRMH =0#èL÷þèãÚˆÍ3Á"¶¬®¤¥ž”š‘˜¥˜Ñš Ÿ8¥=­ï¶Â‰ÎøÛ!ê¼ø}@$­1>CIóRôZaSezg‰g€ehaX[oSÕI½>_2ü$Ú@{ùØê¢Ü#Ï¡Â]·­o¥"ŸËš˜N˜5š+ž¤é«jµmÀ»ÌÚ.èÅö8{" 0¤<HëQ,Zš`eg×gf>bl\ºTRKc@&4Û&Æ1 fû³ìdÞÂÐÄž¸™®9¦«Ÿ›˜˜©™^£¨ªø³Ó¾ÿÊ?ØMæàô­hà u.7;ÆFæPcY`Ídgh—fcj]îUµLîAÑ5(– 6ýuîàLÒxÅÒ¹™¯ÿ¦4 Y›‡˜Î—2™ªœ&¢ˆ©«²_½mÉ–Ö•ä$óõ¼-ü,â9œEíO X†_~dlgBhüfŸc=^óVæMECF7)*2¨ ×þ ð“á¸ÓÃÆöº°Å§Ã °›¤˜°—Ú˜œ`¡‘¨‡±¼ÈÕã†ñW&¦+’8rDïNÓWð^ dJg\hQg.d_ìW O”D·8´+ÎN~«ñ#ã0ÕÈ'¼“±•¨]¡œÈ˜˜—…˜‹›™ —§^°ÃºÆ†ÓcáÞï®þ… *;7BCìMWW^Ác'guh¦g½dÊ_æX5PäE(:?-kó$Ió°ä¤ÖoÉT½“²d©õ¡nœì˜—1˜ýšÕŸ ¦;¯x¹#ÅÒÌß>î ýì ¤(é5BíL4V½]`cÿfˆhógCe…`ÓYOQ%GŠ;º.÷ мÚô3æؾʾ”³5ª”¢Öœ™w—ð—…š)ŸÃ¥1®H¸ÓÖÐOÞ·ìƒûg @' 4ï@íKaU]ðbÄf„h%h©eaœZCR?HÄ<0^"ü2NöœçhÙýËŸ¿´«9£L_™‡—Í—0š£ž¥U­F·±Â[ÏÝ\ë#ú ¾ø%n3Ù?øJ’Tt\wb{fjhJËSÒ[üa*fEhBh"fðaÁ[µS÷I¹>52­$f¬Éø êÁÛ3ΨÁ`¶—¬¤BžšÒ—À—Ë™ê¤þ«¬µÛÀRÍÑÚéÆ÷§e´#I1Þ=2I S1[aÓehÑ{Äí¸Ï®X¦²Ÿ›\˜Ñ—c™ ´¢AªŒ³d¾‘ÊÓ׿å€ôV ?. ;¨FÔP\Y`Ùd“g2hµf"cŒ]V×L Bí5´(¨ =ývî àDÒlÅĹˆ¯î¦# J›{˜Æ—.™¬œ.¢—©Á²|½‘ÉÀÖÅäXó,ög6-:ÐEPÇX¦_•dygDhòf‰c^ÅV¬MCø6Ó)ÔD pþ¤ï,áUÓeÆ ºD°…§‘ ›’˜±—ì˜?œ˜¡Û¨â±¼{È–ÕŽãòî¾;,9ìDZO,X5_OdagZh5gùc¶^‡W’ND8+Œ¸ÿæðbâxÔoÇ» ±'¨ ¡Ø›¯˜—ª˜Ï›ü ¨ù°v»WÇ^ÔGâÊðÿrüï*8öC‡NWµ^ýc?ghhtggdP_KX|OE>9C,bã<ò¬ã°ÕÈŽ¼ë±Ý¨“¡4œÚ˜——r˜g›f T§°iº,ÆÓòàkï:þ ¦«)×6çBœM¾V^•cgch¢gÆdà_ YcPFj:‰-»I~¥ó å×ÉÉ«½å²°©:¢«œ™©—P˜›ÞŸž¦-¯`¹ÅÓÑ–ßîÇüŸ ;N(5»A’LÜUg]c´fDh·ge^`¸Y@Q"G”;Ñ.!»ù"õ…ækØ Ëæ¾ÿ³¢ª£A‚™×—G˜ÒšjŸö¥V®\¸ÖÈÐ0Þ†ìBû ´Ó&(4n@eKÕT\eb?fh±gCeÈ`WZR#H¿< 0ˆ"=ŠºöèøÙ›ÌIÀBµ¿«ñ£ž š(˜`˜°šŸb¥‹­`·­Â8Ï¿Üüê¦ùp4%˜2õ> J¢S†[ažežg…gSeaÞZÑRIã=n1ú#Ë-jøÎé§Û=ÎÕÁ°¶­¥ížÂš¥˜ ˜²šÒžé¤Ø¬v¶ÁîÍNÛléÿ÷ºQy#é0Z=HFRUZ`Õdg4gAeAaJ[ySùIù>´2h%\×%ú’ëjÝöÏ|Ã<¸q®M¦ûŸš›C™ÿ˜Òš±žˆ¤9¬œµ€À¬ÌâÙÜçSöûˆ¯!'/ª;öFÒP Yv_ñcgfÉfeXa¢[TÌJ@ò3Ó&ë„ æû^í8ß½Ñ2Åٹ쯟§¡…œò™q™› ž5¤¦«Ì´w¿pËyØMæ§ô:»à_-ò9XEVO¸WS^c¶eWfædjaõ[¤TKA/5=({0 §ý+ïá„ÓèÆu»e±î¨:¢lšÜ™,›‡žÚ£ «ô³f¾,Ê׸äõòuì˜+>8¿CáMoV=](be÷eÉda^\MUƒL-B€6º)ì uÿñÜâNÕÈ ½×²1ªH£@ž2›/š;›Ržb£Rªý²7½ËÈ|Õ ã-ñœÿ 5Ê)‡6(BsL1U6\]aŒd²eÈdÕaç\VŒMmCò7U+ØÀWçò¼ä×TÊ ¾?´f«D¤üž¬›cš(›øÄ¢r©á±ä»HÇÒÓ@áNï²ý" Tý'×4Ÿ@K TO[¸`+d™eødLb£]WÃNÚDŒ9-²«IÖôœæåØùËÀ†µs¬¥†Ÿï›^šÜšeî¡^¨”°fº¡Å ÒcßdíÆû> F&E3:?èIS˜ZD`üc¯eReéb^+XPQF(;Í.~!¢öVèƒÚsÍhÁ¢¶W­¹¥ïŸœCš€šËœ¡Q§V¯þ¸ÄeЪݣëú†Ü»$Ý1ü=ÚH>RùYá_ØcÉe«e~cL_-Y>Q«G£œU \¦4®µ·­ÂãÎÜêjøôZR#“0Ø<âGwQfY†_¶cáeûed`ZTRåHü=Ñ1¤$¸UÇùYëVÝЮøã®Û¦¢ WœšÛ™¸›Ÿv¥&­ƒ¶^Á~Í¥ÚŽèñöƒú "h/Ñ;GÈPèX<_¡cfQfdÀ`ýZaSJG?13&+Ç 0û±ì–Þ(Ñ­Äe¹‹¯R§å fœë™™,›âž¤¬TµÀ Ì:Ùç‚õ¥Ë H.Ö:2F"PsXú^“c)f¬fe|aã[nTBK@Ž4{'›5 •üîÔßHÒ©Å8º2°È§)¡uœÆ™)™¢š(ž«£ «(´Í¾ÄÊÐ×­åô¸NŒ&-Ö9[ExOùW²^cIfÿf e1bÄ\vUlLÕAé5ä( ¥ ýý_ïáoӮƻã°J¨y¡‘œ®™Ý˜$š{Ñ¢ ª³‹½lÉiÖ=ä¢òMñCù+Ê8uD½NlWW^WcUf?gfÓb“]nVˆMC:7G*xhÿ¾ðdâ£ÔÂǼ©±ã¨á¡Èœ±™­˜Á™èœ¢"©ö±^¼&ÈÕØâ9ñæÿ“öÂ*°7}CíMÈVà]cAf^gbfSc@^EW„N+Dq8’+ÐtÈò®ãÙÕÞȽ€²‘©c¢Ô™Ÿ˜ƒ™{œw¡^¨ ±T»ÇÕÓŽáæï‘þC ±)•6€BMVV]´bf^g‘f°cÉ^öW[O$E†9½, º^óìä×÷Éÿ½^³Kªõ¢‚š­˜c™.œÿ ¾§G°mºýźÒaà­îSý {f(5‚A1LUU½\CbËeCg¢fìc0_…XPùEx:Ç-) äBôæ)ØËû¾?´ «”£û`šÔ˜`™œ© A§¥¯ª¹ÅÁÑUß“í0üá XL't4‹@RK’T\Åasegšf dw_óX P«FG;¯.%!ïV¨õ0ç9Ù Ì쿵ͫ6¤|ž¼š ™p™ê›m ß¦!¯¹\ÄèÐhÞ—ì)ûÕ NG&z3¡?}JÖS{[EaeØf…fd­_KYQDGü;|/"ßQ¨ö0è4ÚüÌÎÀ赃¬Ñ¤øž›D™†™Ý›; Œ¦­®t¸¯Ã$Ðݰë9úßXV%“2È>·I'SçZÎ`¾d¢fqf,dÞ_žYQÔG¥<<0Ø"¿;–÷éÛÚÍÁ¤¶)­\¥fŸg›r™’™Æ› 3¦5®á·ÃbϽÜÐêPùôns$»1>I‹RfZk`{dfrfOd#`ZRsH]=1´#§)‡ø êܲÎcÂT·¿­Õ¥ÀŸŸ›‡™ƒ™”›®Ÿ½¥¡­1·;†ÎÑÛÙéUøøv†#Ý06=RHõQðY`Kdvffdˆ`ŠZ·R6I8>÷1³$°7”ùëûÜ›Ï6à ¸Y®M¦ Ê›Š™^™G›;Ÿ&¥è¬Z¶KÁͽڻè2÷×^{"æ/XºIiSh[Œa·eÒgÒg·eai[kS¼IŽ>2¦$rÊùøLêÜÎ Âζ ­ó¤¶žqš;˜˜š.ž8¤ ¬ºµÕÀ9ͤÚÐèu÷Gø=#Ê0[=®HˆR¶Z ame¿g÷gfb-\]T×JÍ?x3&ñO |úÆëxÝÝÏ;ÃÕ·ä­ž¥,Ÿ°šA˜í—´™Žg£«‘´‰¿ÑË'ÙFççõ¼xÐ!y/,<§G¯QZ`5eÁg3h‰fÊb ]kUL'Aî4£'‰ë üQíïÞ8ÑsÄã¸Ã®H¦žŸèš>˜®—;™Üœ€¢ ªO³#¾Mʎנå;ôÝJ .æ:‹FÃPYY`ôd½glhþfycò]ƒVSM“By6D):¢ Éýûî…à²ÒÊź¿¯§, 9›Q˜ƒ—Ò˜8œ£¡÷¨²»¼ÃÈêÕëã~òW)¨‡,€9OE¶OX€_‘d˜g‡hWgdÂ^‰WŠNôCþ7å*îaŠÿµð/âDÔ;ÇY»Û°÷§Û ¬›†˜x—ˆ˜°›à ý§ã°b»EÇOÔ:âÀð•ÿløî*8úCŽN‹WÂ^dTgh‘gˆdw_vX«OBEs9{,œMuòäãåÕÀȺ¼²û¨¨¡?œÛ˜Ž—^˜H›; §Ï¯ºÙÅÀÒ’àïÒý© >F)w6ŽBLMxVå]jcìfYh¨gÞd `CY®PwFÓ:ÿ-< Ò 7ô å‘×TÊ.¾^³ª•¢ôœU™Ê—[˜›»Ÿd¦Þ®û¸‰ÄJÑþÞ\íüì †š'á4A÷KOUí\¨bdf h›gew`ìYŽQŠG^ISùZa=eVgVg?eaÿZ SiIJ>è1ƒ$bÌùuêLÜÜÎlÂ;·„­y¥CŸ›Ð˜´˜°š¹ž»¤–¬"¶-Á}ÍÔÚëèy÷4Ïý"u0ó<3HýQZk`ÄdgJgie{a’[ÏSYJb?!3Ø%ÊA ‡úëë¶Ý3ЩÃW¸y®B¦ÜŸj›™®˜sšGž¤Â«#µÀ:ÌwÙ}çö¼\™!'/Á;%GQfYå_sd÷ffg¼ebM\¸TkK—@t4A'BÀ ü_íß~ÑÓÄ\¹R¯ë¦Q ¨›™|˜ š¨E£Ãªû³¾¾ÔÊý×÷åxô5â3 Ý-š:'FHPÊX€_Fdg­g—ö™¾ž¥®V¸ ÄõÐÕÞbíOüQ Z(Ë5%B)MžVR^dâgŒiiyfËa#[¡RsHÌ<ê/"‚…õ°æ^ØÙÊf¾H³¶©ä¡ù›˜L–§–$™¶G¤³¬Ð¶iÂAÏÝ£ë˜ú« ‹í&†4AFLòUá]êcìgÓi–i5g¼bC\ëSàIU>‡1·#.6÷3èÃÙÌ|¿.´hª_¢:œ˜–9–€˜ßœA£„«~µúÀ¾Í‡Û êù"‘%J3ù?\K9U[]™cÓgòiëi¾gwc,]ýTK§?ï2.%­µ•øœéÛPÍ‘Àµ*«ñ¢›œH˜–þ•˜Bœw¢’ªi´Ç¿sÌ+Ú§è÷¾¼I$2ç>mJqT¾\*c“gãi jhöcÖ]ÎU Lº@4l&ö äùãêPÜvΞÁ ¶õ«•£—˜2–ó•Ú—Þ›ê¡Þ©’³Ó¾fË Ùxçfö…‡#1ã=„I§S\ªb;gµi j7hGdO^mVÊL˜A5x'( ûìl݄ϘÂì¶»¬;¤—ó˜f–ý•¼—˜›}¡M©à²¾|Ê ØkæNõim "ú/î<¦HäRt[)bßfiüiQh‰d·^øVwMbBõ5p(; "üí|ވЋÃÈ·|­Ý¤žN™š– – —U›¡À¨1²7½—É×aå:ôQVü ö.ü;ËG%RÔZ¬aˆfOiôirhÒd&_ŒW,N5Cá6q))T ?ý8îŽßŒÑ{Ä ¸7®v¥Œžœ™À––s—þš– ¨o±W¼ŸÈÖHäó.7çñ- ;õFnQ?Z;a?f/iýi¥h-e¨_2XòNDÝ7*Fy gþ]ïªàšÒvÅ‚¹ü®¦ Ÿ÷™ó––T—·š( Š§¸°»­ÇþÔ.ãóñ ½Ñ,ý9ûEP}Y›`ÄeÝhÕi§h[e`²X™OãDÇ8…+a¦ŸÿšðæáÏÓÆ–ºø¯ù¦ÉŸš`—Q–h—šàŸ§°¼ºÄÆöÓ â¼ð»ÿºm†+½8ÍDwO…XÆ_eZhihee;`Y2P¦E²9“,éóùñIã.ÕòÇÚ»$±¨³ O›õ—·–›—š­Ÿ°¦ƒ¯÷¹ÕÅáÒÖàmïYþL ú*W7yC;NhWÎ^HdºgiHhaem`„YÌPqF¨:°-ÌCatóÈä«ÖdÉ9½i²,©²¡!œ–˜$—Ò—šuŸB¦à®"¹ÓÄ·Ñ‹ßîÞüÆ p‘(Þ5BòLAVÐ]ycg«hhle±`Z}QTG¹;é.&!·èõ[æ7ØâÊ ¾²³Pªª¢éœ*™€—ô—ƒš!Ÿµ¥®-¸²ÃoÐ"Þ…ìLû+ Õÿ&]4¬@«K"Uß\ºb•f\hh•eažZPRYHê<@0›"Dƒ§öûçÌÙcÌÀô´h«“£¦™Á—ù—Lš¯ž ¥<­·vÂÏ¥Üòê­ùˆ7n%â2N?rJT\b'f)hhÙe”aT[;SrI,>¤1$ÖDø‘éSÛÒÍVÁ¶g¬`¤5žšå—â—û™%žJ¤K¬ÿµ2Á«Í)Ûgéøö­õ#‚1>ZI(SG[aÙeh4h7f'b\0T‘Jo?3%W¦Éù ë¹ÜÏ‚Â#·?­¥¨žBšë—±—“™Š£T«á´ô¿SÌ¿Ùòç¡ö‚F¢"I0÷) t ‡ý§î"àAÒNŹ8¯ˆ¦¨Ÿ½šà— —€˜ú›|¡é¨²á¼ÉDÖ]äóòÕ_G-D:FsP3Y#` ehâh”g,d¼^_W8+ƒ ÿ¿ð-â7Ô$Ç9»´°Ë§¬ |›W˜L—a˜›È ï§ß°j»YÇmÔdâôðÑÿ°A:+R8FDÖNÍWü^=dug”h”g{dW_EXiOðD9 ,"œÅëñ[ã_ÕAÈF¼ª±¥¨f¡œÆ˜’—{˜~›‹ ‡§N°²º~ÆtÓPáÌï›þp ý) 7%CÌMßV0^–cøfDhrg‡d“_¯XÿO°Eø9-EÕ>ó°ä°Ö‡Éz½Æ²£©A¢ÅœL™é—¡˜r›M §°¯è¹ŒÅ^Òàî?ý ˜š(É5áA¢LÖUL]ÞbnfìgNg˜dØ_(Y©PˆFù:9.Š 2}µô)æ#ØìÊɾù³³ª(£Õ™=˜¿˜X›üŸ‘¦ö®ÿ¸xÄ%ÑÅÞí¿ûƒ 'Y4‰@iKÃTd\&bëe g;g¿d9`¿YuQ„G!<†/õ!´ Lö¾ç®ÙeÌ(À5µÇ«¤1žPš~˜Å˜#›‹Ÿè¥®ð·>ÃÇÏJÝ€ë úßp‡%Û2'?,J±Sƒ[{ayeigAge·`wZbR¢Hi=ò0}#Q¶ø÷déEÛå͉Áp¶Õ¬é¤Õž¹š«˜³˜ÔšŸ%¥ ­È¶ìÁRκÛÝétø1Éñ#^1Ë=øHªR°Zà`eGg]g[eKaC[bSÐIÀ>j2%óa£ùëÕÜZÏÜ›·Ñ­±¥eŸ›Ã˜Ž˜sšežR¤¬—µ”ÀÛÌ+Ú?èÏöŽ1k"ó/ƒ<ÙG»QôY\`Ðd9g‹gÃeìa\iTK@ß3™&Œþ =û”ìPÞºÐÄ®¸¶®b¦àŸO›É˜[˜šÁ{£«f´@¿j˦حæ8õüªù œ.N;ÍFÜPHYæ_‘d4g¿g0fbî\kU.LeAH5( Éüî½ß ÒKʹ”¯§Y ’›Ô˜-˜¡™(°¢ªF³þ½ Ê2×,å²ów/K-:¿EùO”Xc_DdgÝg„fc§]RVhIòRÏZÕ`ådëfÚfµd†`cZkRÈH­=R1÷#ã]±ø+êܽÎcÂH·¥­®¥‹Ÿ\›6™%™)›7Ÿ;¥­œ¶ŸÁåÍ/Û7é´÷]äÿ"d0Î<ýG¶QÈY `Yd fÔfóda%[kSJ?è2±%·C Ÿúìö݇РÄʸù®Ë¦k û›‘™9™öš½ž}¤¬aµ/ÀGÌjÙUç¿õ^æ !†.;fFOP™X_ªc8fµfe{aà[iT=KŒ@4~'¤E ¬ü$îúßuÒÝÅsºp° ¨l¡·œšb™ÓšPžÆ£«%´¸¾Ê–×`å³óFÌû‰,19¯DÊNMW ^ãbºeƒf8eâa’\bUxLB86U)V ÊþEðâzÔÄÇ1¼þ±_©¢‡‹šœ™Àšï£&ªï²F½öÈÃÕjã¤ñ)­ä…*I7ïB:MõUó\b/eCfFe=b6]NV¦MmC×7 +‰[Ý[ò ävÖ£É꽇³±ª•£Wž›Û™³š˜{¢A©É±æ»cÇÔŒá¯ï'þ¨ ç›(|5HAÁK²Tì[Ja°d fWe–bÕ]/WÅNÃD]9Î,W=ËJôæHØXËz¿é´Þ«‡¤ Ÿƒ›š˜š8Ø¡`¨®°—ºèÅeÒÐßáíPüÒ ä&â3Ô?zJŸS[®`Tdóe€ec^XßO FÐ:a.!ø‹ö¶çãÙÕÌÐÀ¶Õ¬F¥ŸÉ› š_šÁœ&¡w§”¯Q¹}ÄÞÐ4Þ9ì¥ú- †e%ƒ2š>nIÅRoZD`&dfÊe„c9_YúPOG2<Ý/" “÷1éEÛÎìÁ·“­Ï¥ÞŸà›ê™š1œc …¦x®¸"Ãm϶ܶê%ù¸$$\1›=›H#RZ `%d6f5f"d`ùYRH‰=E1$Žóø|êtÜ$ÏÑ»·®$¦ÿŸË› ™ˆ™„›‰Ÿ„¥T­Ò¶ÌÁ ÎKÛLéÄ÷gê#c0Ë<øG¯QÀYÿ_Ld‘fÁfÜdì`[CSÒIá>¨2i%fé<ú­ë†ÝЕÃR¸®X¦ÿŸ˜›:™ñ˜Àšœžr¤#¬ˆµqÀ¤ÌâÙççjö ¼ò!y/ J§Sš[²aÐeÝgÏg§eoa>[4SzIC>É1L$i—øìé´Û7νÁ†¶Í¬Ã¤’žZš2˜%˜2šPžh¤[¬¶'Á’ÍÛ5éÝ÷¯^Ÿ#'1°=úHÈRêZ3a…eÈgðgýeùaø[TˆJs?3­%‚Ý úVë ÝzÏ⇷¤­m¥ Ÿ šD˜˜Ú™Ä­£t«ñ´ô¿CÌžÙÀç`ö2é8"Ö/{<çGÝQ+Z¦`+e£ghEfvb©\ûT•K¦@i4'k œûäìÞèÐ5ĸ¸­®H¦µŸ›˜˜¡™S£—ªä³½¾çÊ$Ø0æÁôFŸ P.;žF½P:Yè_¥dXgôgtfâbO]ØU¥LåAÏ5¢(¤ Tý›î<àƒÒµÅºá¯L§ƒ ©›Ö˜˜z™ìœ`¢¸©Ð²x½xÉ’ÖƒäóÄ|ß¡,|9-EwO$X _dôfÐg’fAcî]´V¹M+CB7:*Yä (ÿqð â@ÔXÇ—»8±q¨q¡[œI™L˜h™˜œË¡å¨Ã±7¼ ÈýÔÏâ8ñîÿ£ ß*Ò7¤CNöV^Dcuf“g˜f‰cw^{WºNaD¦8Æ+¥öCòØãþÕÿȽ—²¢©l¢Í™˜k™YœL¡*¨Ï°»²ÆÓ3á…ï-þÞ L,)66&BÀLËU]…bñeMg‘fÂcí^-X£O}Eï94-H§øó‰å£×ŽÊ¾ä³Ãª]£×OšÖ˜s™%œÝ §ñ¯ÿ¹xÅ!Ò·ßôíü; ¬˜'·4Ã@€K´T1\Ðaseg‡fñcV_ËXuP}F;€.ø Å0†õç"ÙúË῵ͫ;¤„žÈ𙀙û›| í¦-¯¹bÄéÐeÞìûÅ 90&`3†?aJºSa[-aeÈfzfd¯_UY,Q]G<£/3"‰ãömèqÚ9ÍÁ¶µ¬û¤Ÿ1›S™‰™Ô›' k¦®=¸nÃÚÏ?ÝXëÝùùú$:2u>lIæR±Z¥`£d—fvf@d`ÒYÏQ#H=¢0F#4³ø–éÛHÎÂÿ¶v­š¥”Ÿƒ›|™‰™ª›ÕŸó¥å­·–ÂêÎ=ÜIêÆøiæð#@1= H7R"Z9`]dwf}fndU`HZfR×HÏ=…1:$2·ù•ê…Ü.ÏÔ¸·®¦ñŸ¼›‘™y™w›~Ÿ|¥O­Ñ¶ÏÁÎUÛXéÑ÷u÷ #m0Ñ<ùG«QµYí_2dof˜f«d³`ÅZÿR‰I•>\2%¤ÿùxë\ÝôÏ…ÃP¸®w¦/ Ù›‹™Q™.›Ÿö¤¯¬¶Á5ÍoÚmèåö;"­/&«w´8¿KËoØaæÙôŠ*k .®:(F6P£XD_öc¢f8g¶e$b”\$UùKCA;5(0º ýdîàxÒÁÅ9º°›§ç  œ`™´˜!šŸ£{ª–³>¾<ÊQ×9å­ó`V-Æ9]E‹OXæ^Âc˜fYgf™b1]äUÚL@BO6D)bò ?þ•ï@á‹Ó¼Æ»×°3¨V¡dœx™ ˜à™3†¢¿©·²A½%É%ÖÿãjòÈ"à+¹8mD½NtWf^mcqf`g8füb¿]œV·M>Ci7t*£>Žÿáðƒâ¾ÔÙǼ¸±î¨ç¡Éœ®™§˜·™Úœ¢ ©Þ±D¼ ÈðÔ·âñÂÿoМ*‹7ZCÊM§VÂ]÷b*fJgSfIc<^EW‹N8D„8«+ð™òGòâãÖÉ=½½²Î©ž¢SšÎ˜«™œœ¡n¨±P»ñÆ»Ójá·ïXþ g>)?6&BµL¶Uú\\b¿egNfxc^ØWKO#E•9Ü,;ø]·óQåv×mÊ{¾Þ³Ëªs£û€š™¾™{œ;¡ç§\°nºéÅ‘Ò$à\îïü‘ ÷Ö'å4â@ŽK±T\ªa1I—RPZ5`&dfèe¯cq_EYIQ¨G”è2à%Í RûðìñÞžÑ;Å ºC°¨·¡>ÅšXšú›¢Ÿ=¥¯¬ÐµqÀ\ÌQÙçNõÃ&) †-÷9;EO\WÛ]sbeed˜`[ÌSÈJA@n4‹'Û¦ 5ýÒîÈàaÓàÆ‡»‘±1©“¢Ù›hšÂ›$Ÿ|¤®«”´¿¿Ê‘×4åbóÒ8KÀ+S8ÃCÔMQV]íaÎd¦eod/aø[åTLÄA6V)¼“ #ÿ·ðšâÕnÈæ¼º²ª>£?ž;›@šT›ržŠ£€ª2³r½ ÉÂÕSãzñìÿ_ˆ*Ú6zBÂL}U}\žaÆdãeñdóaú\V…MZCÐ7&+›v…òOä¨Ö×ɾ¹³àª¿£|ž3›ó™Åš£¢?©Â±Û»UÇöÓ{áŸïþ áš(5SAÔKÌT \qaÜd=fŒeÌb ^eWøNñD…9î,mHÉ;ôêåØ!Ë5¿˜´‚«!¤›ž›™šÀœe¡ô§K°Aº Å/Ò¬ßÒíVüî O-'A4G@K5T¶[\a e¬f:f¶c-_¶XsPF<;µ.;!Šèõxç‡Ù]Ì=Àhµ¬s¤¬žÝš™n™Ô›B ¡¦Ï®£¸éÃgÐÝÝì•úB ÀÃ%3=?/J Sa[Ia8egçfždK`ZëQ)Hﶯ¬Ï¤Èž¸šµ˜Ê˜öš.Ÿ\¥`­·=©ÎÜ>êØø—0V$À1*>QIýRûZ"aQetg~goeRa=[NS¯I‘>.2Ç$ =ù™êcÜåÎeÂ$·\­A¥üž­šl˜D˜6š7ž4¤ ¬šµ©ÀÍaÚ†è$÷ñ ä"t0 =bHDR|ZÞ`Keªgðgf4bP\TK@Ç3n&N® Ýú%ìÔÝ4Ќø!®Ï¥PŸÇšJ˜ç— ™m8£åªL´;¿{ËËØçæ†õ[v!$/ß;cGuQáY{` e¹g8hšfèb5]žUKLlA95ò'Ü? hü£í=ßѶĹ÷®s¦ÀŸ›L˜²—5™Íœh¢é©)³÷½ÊY×håôÛ¤ Û-µ:^F›P6Y`Ûdªg^hõfvcó]ˆV\MŸBˆ6V)M· ßýïœàÉÒáÅ&ºÖ¯%§B P›h˜™—è˜Nœº¡©'²Ó¼ÛÈÖä”òl<¸”,‰9TE·O|Xv_€dgih3gæc’^SWONµC»7 *¨Fÿtðóá Ô Ç3»¿°æ§Ö ´››˜š—·˜í›)¡R¨B±Ë»µÇÄÔ²â9ñ àfS+_8GDÌN¸WÝ^dFg_hYgãIÕ3È>¼©±ª¨q¡#œÛ˜«—™˜Ÿ›® ¬§t°Úº¦ÆœÓxáòïÀþ” "*>7@CåMõVA^¥cgJhsg„d‹_¢XìO˜EÛ9ñ,ªß óyäwÖMÉ?½‹²j© ¢’œ™Á—˜[›> §¶¯ú¹©Å‡ÒQà¿î‡ý\ ñù(-6HB M&JÜSÞ[b,fAh:hfÝaª[šSØI—>2…$=øàé–Û ÎÁ9¶s¬^¤%žé™¾—±—Á™å¤¬·µëÀgÍêÚ.éè÷Ìß#v1 >aI8S`[­aÿe?hbhgfYbL\_T½J–?&3«%m¶Ñù ë´ÜÏp ·$­é¤‡žšÈ—Ž—r™jc£<«Í´ä¿H̹Ùðç¤ö‰Q°"[0 =~HxRÇZ?a¾e-hh³fÒbð\,U®K§@Q4ë&» 'û\ì÷ÝCІÃ¸ö­’¥Ÿmšå—y—+™óœ½¢jªÔ³É¾ËiØæ;õëV!/Ý;pGQ Z¯``ehŠhòfEc•]V¬LËA•5I(,ˆ ¨üÙíiߢÑÌÄ(¹õ®e¦§ŸÜš˜{—ö˜‡œ¢˜©Ó²Ÿ½ÃÉ×å¯óŒ[Р-ƒ:7F~P#Yû_àd»g{hgªc1^ÐV¬M÷Bæ6¸)³ Eþuïüà#Ó3Æpº°X§g g›p˜‘—ј'œƒ¡É¨Ó±s¼pÈÕ‡ãòè¸6,9èDWO+X5_QdfgbhAgdÉ^ŸW®N%D<8/+B½ìÿñ™â¯Ô¦ÇÀ»=±R¨.¡ö›Å˜ª—­˜Ç›é ø§Ð°B»ÇÔöárð?ÿ˜‹*¢7˜C/N1Wo^ÂcgIheghdb_nX°OTE‘9£,ÎZ¿ò3ä6ÖÉ ½b²I©ó¡„œ™Å—˜m›W 0§×¯ºÌŪÒsàßî£ýt )66KBM6V¥].c´f&h}gºdî_0Y¥PwFÜ:.V õ6gôÕåËבÊl¾œ³XªÐ¢+‡™õ—˜"›ÏŸo¦Þ®ó¸wÄ/ÑÚÞ0íèû´ IZ'Ÿ4Ó@·KUµ\vb:fëg‚ges`òY Q¦G:<•/ú!°ÿ6öŸç†Ù6Ìò¿ú´‡«Ë£ì š7˜˜ßšKŸ¬¥á­À·Ã¥Ï/ÝnëúÞw–%ò2F?QJÛS³[¯a±e¤g~g?eô`³ZœRÙHœ=!1§#uÔøuéOÛèÍ…Áf¶Ä¬Ò¤¹ž˜š…˜Š˜§šÑžó¤ì¬”¶¸ÁΈۮéGø£Î#@1²=äH›R§ZÜ`eNgigmeca`[ƒSöIê>˜2?%'–Ùù=ë Ý’ÏÃÏ·®ß¥Ÿ4›ã˜©˜†šržW¤¬‹µ€À¾ÌÚèšöRï#"¦/2<…GfQŸY`~dëfCg‚e´aê[DTéJ @ß3§&§( tûØìŸÞÑ~Ĺ*¯Û¦\ Í›E™Ó˜xš,žÛ£h«¬´w¿Ë¹Ø­æ%õÔp« =.Þ:MFPP±XF_ícŒfgŒeñaZ\äT¶Kÿ@ö4Û'ò‚ Öü<îþßfÒ»Å?º.°»§¡Wœ ™þ˜ršõu£Öªñ³–¾Ê×|ååóŒ&f-·9>E]OàW›^jc5fífe!b¶\iUaLÍAâ5á( © þmï*áˆÓÍÆ;»±}¨²¡Ðœò™&™pšÊ"£\ªS³Ø½µÉ«ÖxäÔòt Qø+º8UDN-W^úbêeÉf‘eJb]ÛUôL}B­6Á)ý§ ÿsð,âԸǼб"©9¢76šF™lš¡Ö¢ï©Ç²0½ôÈ×Õ”ãäñ~^ +Ý7‹CÙM“VŠ]œb­e­f˜esbO]EV|MCf7Ž*ØŒõÿ^ñã`Õ‰ÈÓ¼z²´©¯¢nš]™bšwŒ¢†©B²’¼AÈÕÀâñ›ÿ28*7ÓB7M V]Jbze›f¦e¡b›]¯VN¼C8P+¨eÒ;òìã/ÖJɃ½³7ª£Ù™ši™NšC:¢©º±ò»ŒÇLÔîá-ð¿þV ©l)W6(B¡LŒU»\bWe—fÂeÝbö]&W’NeDÕ8,€EµóÆäþÖ Ê/¾ª³±ªt£ž¸šf™*šÿœÖ¡–¨±>»ÄÆsÓ áBïÑýk Å”(5vALU\\Éa:efìe)cb^²W9O%Eª9-s?±ô·åâ×ÝÊë¾L´6«Ø£YžÖš_™þ™¯œc¡¨l°rºâÅÒ à9îÅüb Å¡'°4­@ZK€Tï[ae£ff|cÚ^LXôOüE™:.ƒ XÍ/õÈæåØÌËÿµÐ«O¤©žýš]™Ò™Zœç a§¨¯¹æÄnÑéÞí—û7 ¡Œ&®3Å?JØSm['aêd fBfÐcY_óX¿PèF¡;%/³!“ nöÿçÚá̽Àⵈ¬ß¤Ÿ5›g™®™œg ¸¦×®œ¸ÓÃCЪÝÃëEúåWP%‡2·>£ISÎZµ`¦df`f dØ_ŸY•QãG½<\0#îpÑ÷\é\ÛÎÝÁá¶a­¥ŽŸ„›ƒ™–™¼›êŸ ¦ý­š·®ÂÏPÜYêÒøpèî#91…=’H'RZ(`LdhfqfgdT`MZsRìHì=«1h$hõXùÞêÒÜ}Ï#ø\®[¦+ ë›³™™{›qŸ\¥­Œ¶wÁ§ÍÛÚÐè=÷ÖRd"Ã/*IIwRùY©_jc'eÙd€b(^éWãO>F.;ë.µ!ц÷åè#Û ÎÂ_·®x¦¨ Æœæš›H~¡ž§‡¯¹ Ä;ÐcÝ?ë†ùï/ý#1%=þGaQ Y_ce eùbã^áXQ Gº<™0|#§aõø­êÓܯυÕ¸¯<§-¡ çšÐšÆœ¿ ¥¦[®¹·Â¡Î´Û„éÉ÷9‰o"¢/ß;åF|PrXž^ÞbeRexcš_ÌY-RãH>2 %AýŠú3ìBÞѲė¹é¯Ú§•¡:ÞššPœ Ì¥W­¶EÁ@ÍCÚ èMöÃ!!j.É:öE¹OÞW;^¯b#eŠeâc3`‘ZSñII?Y3^&›Y àû}íyßÒ²Åsºž°e¨ò¡gÝš`šò›ŒŸ¥¬šµ5ÀÌÙÏæõ‹ôÿe-ß9-EO`Wæ]…b$e·e8d±`4[ÝSÓJC@f4x'½| ÿü’îàÓˆÆ,»5±×¨>¢ŒÙš4šŸ›Ÿ¤È«Æ´J¿Ëؾåþó}ï ƒ,9D…NóVž]bb(eàe†d#aÆ[TK#AW5u(Á‚ þŒïkáéÓLÇÕ»Á±C©‡¢±ÙššW›ªž÷£"«´t¾8Ê×Ãäó‚û"¬+S8ÖCùM†VS]:b#eþeÇd…aH\,UULñA66b)·{ ùþ}ðQâ¿ÔȼO²²©Ö¢Þäš÷™›Nž{£‰ªS³¬½]É*ÖÑã òŒ ;Õ*7)CfMVý\befüdÜa¿\ÀUM·B7J*©sòÿqñ<ãœÕØÈ3½é²/ª3£žüšì™îšý £ø©¦²æ¼ƒÈ@ÕÛâ ñÿIï)¼6lBÃL‹U—\Ãaòdf%e(b.]OV°M}Cì78+¤vøtò7ä‹ÖµÉú½–³¾ª¢£ež#›í™Éš³œ¢i©ø±¼¢ÇKÔØáð~þ Cö(Ô5›A LôT"\qaÇdfIesbž]ãVdNOD×87,³ŽóKå‘תÊ×¾V´_«¤»žQ›ò™¤šd%¢Í¨9±>»¨Æ<Ó¹à×îOýÔ Ý'Ï4¯@>KHTœ[a”d fpeÆb^ŠW1O=Eâ9Z-èÏ[ÔôˆæÀØÄË׿7µ¬²¤#ŸŠ›û™}𠡍_°@º‹ÅÒmß~íïûv Æ•&3˜?JJzSùZ `Rdüe•ec¦^CXPJF;¦.I!@ÓMöùç"ÚÍÁA¶ü¬e¥¤Ÿ×›š\š¶œ¡[§p¯&¹KĦÐöÝ÷ë_úå<%92S>*I…R4Z`úcÝe°euc5_YQpG_<0Ó"Üyõ÷šé´ÛŠÎaÂw·®<¦D =œ;šHšdœ… ”¦s®ø·óÂ)Ï]ÜIê¦ø(†s#©0â<àGiQLY`_†c¨e»e¿c¾_ÎY R¡H½=š1w$–@ÀùaëmÝ,ÐãÃÒ¸1¯4§¡¾œ{šGš"œ Ó¥w­Ç¶’Á¡Í´ÚˆèÖöS´¯!û.S;xF0PGX–^úb]e³eûc<`ŠZSÐI?$3"&Z œû9í8ßâÑzÅBºs°A¨Õ¡RÍšUšì›‰Ÿ¥‚¬šµ4ÀÌÙÂæÿôtØÞ@-¶9EçN4W¼]_beže*d®`>[õSùJy@«4Í' í |ýï á¡ÓǾ»Á±[©µ¢ó-›ršÄ›Ÿn¤˜«x´Þ¾–Êb×å+ó—û €+8ƒC•MV×\¸ažd{eJdaá[ÖTLÆA$6j)Ú¹ RÿïðÚâ\Õ¼È:½³yªœ£ž˜›ššª›ÂžÒ£Àªg³›½'ÉÏÕQãhñÊÿ-FÍ)z6 BJLûTó[a4dQeadjay\©UMC‹7õ*€s³ò•ä×Kʧ¾V´«z¤AŸþ›Áš‘›jž<£ï©`²c¼ÅÇJÔ²á¶ïþq “+(ó4¨@KïS[r`Óc/e~dÅa]zV#N7Dê8v,ÊgôAæŸØÊËÀ‰µ‘¬I¥×ŸXœÝšn› ž ¢©X±-»gÆËÒàî_üà ï™&|3T?äIõRWZå_ƒce©d-b³]TW0OrEK:ö-³ Æxöàç+Ú:ÍPÁ«¶‚­¦Y œåš9›—ó¡7¨B°ë¹ÿÄEÑ}Þcì¯ú P%2>ÉH R¥Ym_Gceêd«bl^CXQP¾F½;…/X"x-Â÷‚é¶Û¦Î–Â÷g®²¦Ë ÒœÚšïš2¡?§¯•¸„íÏÐܪêóøa©#¡0Æ<¯G&QøXý^c-e8e6c2_@Y€QH=="1 $5í|ù,ëHÝÐßÃÞ¸N¯_§<¡Íš¢š…œk B¦é­:·ÂÎ Ûïè5÷ªò!2/~;–FAPLX^äb:e„eÀcö_;Z¬RpI·>¹2´%ê¤ ,ûÍìÑÞ€Ñ Åñ¹-°¨¨¡3½šUšü›©ŸJ¥Á¬èµÀÌ}ÙAç†õiq Ñ-D:ŠEgO¨W#^¶bJeÐeFdµ`-[ÍSºJ#@@4M'ŽJ Ëü]îIàÚÒUÆúº±ª¨¢d´šš›öžd¤®«­´4¿ Ëô×­åïópå~,9‚DNW°]zbFef±dSaý[ÊTßKjA¢5Ã(Ó RþÙï´á+ԆǼæ±[©‘¢¬Äšé™ ›bžž£¹ª³ñ½©É|Ö&äaòã`Ž"+Ø7kC¢MFV+]-b2e*feìaÊ\ÈU MºB7J*¨qîÿlñ5ã“ÕÍÈ%½×²ª£úךÀ™¼šÄÊ¢´©]²™¼2ÈíÔˆâ¼ð?ÿÆ ¶)6JB°LˆU¥\áa"eWfzeŽb£]ÓV@ND8Þ+J•ó¾ä×ÊF¾É³×ªž£Džäš‘™Qš ï¡§¨$±:»´ÆXÓäàï—ý* ~H(C5)A¾KÊT\–ae„fâe0c{^ÜWuOrE:n-é¿9¡ôDæmØbËh¿¼´—«(¤”žúšk™ñ™ˆœ#¡ª§û¯ì¹HÅÕÑRßxíÿû› ä&þ3 @ËJT‘[?aõdŸf5f¸c6_ÆXŠP«F];Ü.g!D¾ö²çÃÙ›Ì}À©µV¬µ¤îž›Z™«™œy Ô¦ý®Ë¸ ÄÐîÝ ì“ú6 ©¡%Ö2?êIQS[æ`Íd©fpf#dÏ_‰YrQ´G‚<0¯"•j÷ñèðÚ¯ÍtÁ}¶­9¥EŸH›V™y™°›ðŸ$¦)®Ø·þÂaÏÀÜÖêZùˆ$Ó1>!I¬R‰Z`¡d§f™fudH`'Z1RHw=1Æ#´1‰øêøÛ¤ÎPÂ=·£­¶¥žŸz›`™\™m›‰Ÿ™¥€­· ÂpÎÁÛÎéNø÷{#ë0I=hHR Z3`hd“f©f©dž`ZÆR@I>>ø1¯$§*‚ùýêäÜ‚ÏÃó·@®6¦ÿŸ»›€™Z™I›CŸ4¥ý¬v¶lÁ§ÍèÚêèc÷ «"0~<±GnQ„YÉ_dgff¾dÔ`òZ8SÍIã>³2{% júäëÈÝ]Ðêð¸é®È¦v œ»™u™D›Ÿð¤›¬÷µÓÀ÷Ì%Úè„ö"¦Â!//§;çF·PäXB_±cfof±dè`'[ŒS@Jr?[3:&Rì TûÔì¹ÞKÑÐĉ¹±¯z§¡“œšµ™b›ŸÉ¤R¬µKÀSÌgÙDç õ1¬Æ 4.²:þEßO X–^!c©e!f†dá`E[ÏS¦Jù?4ü&,Û QüÜíÅßWÒÖÅ„º›°P¨Ì¡1™šš–›&Ÿ®¤¬$µ½¿¤Ë™Ø[æ¡ô!¤-–9îDàN7WÊ]ub e¿eMdÓ`b[TK”@Á4Ý'*ñ zýïá“Ó Ç­»±±L©ª¢ì,›wšÑ›3Ÿ‹¤½«¤´¿ÐÊ¡×CåpóÜ>Kº+F8­C´M'VÛ\­a„dRedÊ`[uT¨KRA«5í(\> Üþ€ðvâÕuȽñ²mª¥£½žÍ›åš œ4ŸT¤P«´>¾ÎÉwÖ÷ãò_´¼/*Ç6ABdLûTØ[Ù`ãcèdâcÕ`Ó[öT`L>BÆ62*ÅÂt$òä¦ÖʾK´¡«¬¤ŸiœE›,œŸû£ºª2³8½˜ÈÕtâið®þú ~((5½@KÄSÓZ `Qc”dÏcaB\£UHM]C8¬+`w9ðóååbØ­ËÀ­µÔ¬©¥S íœˆ›,œÔžt£ô©1²¼1LJÓÃà¢îÙü" 0¼&37?¨I›RâYX_ßbgdæc`aâ\‚VcN­D”9P-" MÑõ¼ç&ÚS͇Áþ¶ï­‰¦ó Iž›û›^ž»¢û¨ý°™ºÅÏÑñÞ¾ìïú; Wû$ß1Á=cHQYÍ^›bid0dða´]“W­O)F:;/": º÷”éãÛëÎòÂ5¸ë®E§j¡y†›œ›ºÕ¡×§£¯¹ëÃÿÏ ÝÎêþøT„E#P0a<:G¢PiXf^{b‘džd£b¨^ÂXQºGð<ê0æ#'õ™ù]ëŒÝmÐCÄO¹È¯á§Â¡ŠQ›"›ýœÚ £¦=®~·7Â1Î.Ûëè÷ƒÊ¬!à.";1FÖOÝW^vbÑd!eec¦_÷YuRGI>­2·%üÄ YûíßÊÑpÅFº„°^¨þ¡„ ›šš8œÜŸr¥Þ¬úµ–À{ÌmÙ'çbõÖ69 •-:KE(OlWë]„be«e)dŸ` [ÉS¾J/@S4f'­m òü…îsàÓ|Æ»%±Å¨)¢s¼ššz›êžS¤—«’´¿éÊÑ׊åÍóQÉëm, 9D’N WÅ]—bje/fádˆa5\UL AÔ5ð(7ð eþáï±áÔkÇß»´±©K¢^p𑙯šžG£gªD³¯½sÉSÖ äWòéw¶[+!8ÃCNµV£]«b³e¬fedb:],V^MþBC7g*°bÉÿ1ñåâ/ÕWÈŸ¼D²|©t¢R/š™ š4I¢E©²V¼ÈÞÔ”âãðÿ#|A*,7ùBkMLVm]ªbèeg*f-c.^FW™NTD«8Ý+*Ú7ò)äTÖWÉu½ì²ó©·¢`šÀ˜™tœ]¡1¨Ì°» ÆgÓáfï þ¿ /)!6B¸LËU!]”bfkg¶fìc_\XÓO¬E:[-°_µûóå×kÊ`¾¨³|ª £}í™o˜ ™¼›v §—¯¯¹5ÅìÑ’ßáíüN ÓÓ'5"AïK2Uº\bb f£g"g‰dæ_RYîPæFn;Â.#!Ø+hõÜæÓØ•Ëg¿ˆ´0«‘£Ñš^˜Æ˜F›ÑŸO¦ž®“¸ûÚÐ/Þtìûà o€&È3@óJ]T\èaÂeŒg=g×de`ÿYÆQåG<0x"=šÚöJè5ÚåÌžÀ¡µ%¬^¤qž€š˜Ò˜›wŸÄ¥å­¯·ðÂnÏçÜë±ùlû%g2·>ÁILS'[(a0e,ggÞd `mZeR³H‡=1´#“OøÃé¬ÛQÎùÁä¶J­^¥HŸ)›™™.›QŸi¥V­ð¶Â[αÛÃéHøô|“#ñ0P=qHRZB`xd¦f¾fÂd»`¿ZìRlIo>/2ì$éqÍùJë4ÝÒÏlÃ@¸‰®x¦9 ë›¤™o™O›9Ÿ¥Ð¬5¶ÁCÍsÚeèÑölê"e/Ó; GÑPôXI_°cfbf dÓ`[wS,Jb?O32&Qò `ûçìÑÞhÑòÄ®¹×¯¡§5¡µœ8šË™p›ŸÂ¤?¬nµÀÌ#ÙõæGõÑF[ È-H:˜E€OÊWN^èbe f…dö`p[TýJe@€4Œ'Ê„ ý‘îzàÓÆ!»(±È¨-¢xÚš›òžY¤œ«“´¿àÊÂ×så®ó(—¯',»8'D2N¨V\]+bþdÅe|d+aâ[¼TàK{AÂ5ó(P ­þAð&â§Ô ÈŽ¼p²å©£.ž>›Yš„›·žâ£ëª¬³ù½ÉZÖîãò‚ì *87ÃBóL”Uy\~aŠdŒe€dja\\oUÇL‘B7U*βIàñ¿ã2Ö~Éä½¢³ìªï£Ïž¨›Ššy›rže£8ªÈ²è¼dÈÕ|âðôþ] )Ö5~AÓKžT²[ë`,dfe’dµaÜ\"V©MC38¥+5(Ç]ó5å˜×ÍÊ¿¯´Ð«¥¤TŸù›¥š^›"žá¢„©ç±à»:ǺÓ!á'ï…ýï Á'˜4]@ÕJÉS [r`æcSe³db`]ÔV…NŸDU9á,„„)½ôŒæßØýË)À¡µš¬E¥ÆŸ;œµš=›Ða¢Ø¨±èº#Æ‹ÒßßÙí2üž Óˆ&t3U?îISpZ`¦cBeÑdTbÙ]wWOO‹E^:.· ÂlÿõÆç ÚÍ'Á¶V­Ù¥0 yœÇš"›‰ï¡>¨T°º'Åxѻުìýúk §i%h2b>IRRáY_hc0eêd˜bF^ XPaFO; /Ð!æ•'÷çèÛÎÂN·®c¦” µœÙš ›H†¡¯§¢¯7¹<ÄwШ݌ëÛùIŒZ$l1|=NH¨QZY<_/c eeÚb¯^™X·P1G:< 0à"¶Gøê,ÜÏö¸¬®è¦ó ìœæšîš¡§î®c¸MÃrÏ”Ümê¶ø%oJ#n0—<…GÿPÖXß^ûbe#e$c"_2YsQ H1=1þ#*ãsù%ëCÝÐàÃâ¸V¯m§O¡ìšÈš±œ y¦&®|·JÂYÎiÛ8é}÷îA+"d/§;´FSPQX„^ÎbeRe€c©_âYIRID>A29%o+ ¸ú`ìmÞ)Ñ×ĸ¹°ò§§¡EäššJœ  º¥@­s¶%ÁÍÚáç#ö™÷ô E.§:ÙE¡OÌW/^ªb%e”eôcM`²ZASJ}?‘3™&Ù— ü¹í²ßRÒßÅ™º»°w¨ú¡dÍšCšÉ›WŸÚ¤6¬FµÙ¿¹Ë¨Ødæ¦ô#¢-—9òDèNEWÞ]bCeéed a [YT]KÚ@5(e$ £ý-ïáÓ÷Æ…»w±ÿ¨J¢{ªšç™5›žá£«û³o¾8Ê×Ìäó”>Î+z8D+N¾V]|bkeKfeÚa \†U¯LKBŽ6µ)Á 6ÿ¯ðvâÕÔÈu¼3²„©•¢‹š™—šºÜ¢á©¤²ú¼«È|Õ*ãoñÿÿ׈*^7CpM;VG]ob™e´f»e²b¨]¹VNÂC8R+§aË1òÝãÖ0Éb½í²ªß¢™Qš™÷™åœÖ¡¯¨N±…» ÇãÓŠáÑïlþ pC)@6%B³L³Uø\Zb¿egRf}c¤^àWTO,E9ã,?ùZ®óBå`×PÊW¾±³—ª8£º:šÊ˜q™,œí œ§°-º°ÅbÒàFîèüš ÿ'5,AçKU\(bÃeMgÀfds_ÙXrPiFó:K.² oÍõ˜æžØoËR¿„´=«¯£ÿMšª˜™ª›? Ä¦¯¹zÄѪÞéìŠûC ÇË&40@KhT \Ïa˜eRgóf~dÿ_YKQbG$I¯RŒZ’`£d¨f˜ftdF`$Z.RHt=1Æ#¶6’øê ܹÎiÂZ·Å­Û¥ÆŸ¥›™‰™š›´ŸÂ¥¤­2·:ƒÎËÛÐéGøæak#¾0=*HÊQÁYå_dAfXf[dU`[Z‹RI>ß1¤$ª;¢ù*ëÝÊÏoÃP¸¥®¡¦m +œî™Ä™­›ŸŸ†¥B­«¶’Á¼ÍëÚÚèA÷ÔJU"®/<7GíPþXB_–cåe#fNdq`ŸZöRŸIÊ>¯2%¨J »úHì<ÞàÐxÄG¹„¯d§¡ªœGšõ™´›|Ÿ9¥Í¬¶ÕÀàÌôÙÍç$ö­+!‹.ù:5FP3X™^cŠeòeJd˜`òZsSDJ“?™3“&Æx ôû†íyßÒŸÅYº|°=¨Å¡7ªš*š»›TŸã¤K¬dµÀéËߨ æäôaÌÚB-¿9EúNJWÕ]xbe´e=d½`G[øSõJn@™4´'È RýêîÜàpÓìÆ»˜±7©˜¢ß"›qšÏ›5Ÿ¤Æ«°´!¿âʵ×ZåˆóöYg×+c8ÉCÐMCVö\Æa›dge$dÚ`™[~T­KSA¨5æ(Q/ Èþið[âèÔTÈâ¼Ì²Gª£—ž©›Âšé›Ÿ;¤;«ó³4¾ÊÉyÖÿãòsÏÜT*ð6nB“L+U \ ade dú`ó[UrLIBÉ6-*·­WòñãuÖÑÉF¾´e«p¤WŸ2œ›œóžÝ£¤ª&³6½ È(ÕŽâðÛþ. =¾(k5AIK T[H`‰cÅdöc!aU\«UDMMCú7…+.<õ¦ó–åØYË´¿\µˆ¬e¥ »œb›œÉžw£ªP².¼lÇÎÓáýî;ýˆ ™%'å3™?JëR&Z_c|décQaÀ\NVNWD/9Þ,¥ÉEõ2ç ÙÕÌÁ™¶›­H¦Æ 3Ÿ›œž£[©s±"»6ÆuÒ¡ßuí¨ûò ¢%x2I>ÖHêQUYñ^ bPdøc™a@]WOjEi:8.!LÑö¶èÛ1ÎP¯·…®§L¡µ›ñ›4žr¢–¨°ºõÄÑ.Þôë#úo‘=$.1 =ÖGQ³Xƒ^jbRd2d bå]ÚWP”F³;œ/"ËMø#êkÜkÏfܸC¯§¢¡Ÿ›› ›®¹¡®§m¯Î¸¡Ã­ÏµÜtê¤øú-ò"0<üFmP=XD^bbd˜d¥b±^ÓX'QÖG= 1 $L½ùë¬Ý‰Ð]Äe¹Û¯ð§Î¡”X›'›Ü ¦¦?®·;Â7Î5Ûóè*÷Ø»!ð.2;BFæOëW)^bÖd"ebc_èYaR-I}>‰2%Î’ #ûÍìÚÞ’Ñ:źT°2¨Ø¡fôšš5œãŸ„¥ú¬ ¶ÆÀµÌ¯Ùpç²õ+Ž“ ï-^:ŸExOµW+^¹bHeÉe9d¢`[¯S–Jú?4'T ‰üîàÒ Æ¯º»°b¨Ï¡%zšß™U›ÖžO¤¥«°´D¿'ËØåå4ôÂBjï,9EO…W5^übÂeyfe±aL\U L€A£5®(å ÷ýiï0á–ÓáÆT»+±™¨Í¡éœš5™yšÌ£Oª?³¾½•ɇÖQä¬òMè2ß+ª8PD”NAW)^*c(fgêe¯bt]SVrMÿB/7A*voÿÈðpâ°ÔÐǼ¶±î¨ê¡Îœ´™­˜¾™áœ¢©æ±M¼ÈýÔÇâ(ñ×ÿˆî¾*²7…CúMÚVù]0cef†gfƒcr^xW·N]D 8½+ö”à'òµãÕÕÐÈé¼^²e©-¢Üœ™R˜1™%œ ¡¨·°»µÆÓSáµïmþ- ¨•)ª6¤BEMTV¤]cvfËgg'dC_oXÑO”Eî9-^ýDóûä×ßÉÔ½ ³û©•¢’™%˜Ó˜™›g &§²¯ß¹xÅAÒøßUî ýÕ `b(’5­AsL«U(]ÁbYfÞgHgšdá_7Y¾P¢F;Z.¬ TžÔôEæ;ØËؾ´·ª'£xÉ™-˜«˜B›äŸy¦Þ®é¸dÄÑ¹Þ í½û… ''k4Ÿ@ƒKßT‚\Eb f½gUgÕdI`ÊYxQ€GgêdŠ`4Z R7Hí’I'S [a,e3g!gødÃ`—Z–RçH¿=U1ì#É5|øêéËÛhÎÂé¶E­P¥2Ÿ ›î˜ê˜ýšŸ3¥ ­¼¶ÔÁ/Όۦé4øê|Ÿ#1r=HORVZ‡`Ädõfge a[/S¥Iž>Q2ÿ$îe±ùëøÜ‡ÏÃÚ·®ÿ¥ºŸi›"™ñ˜×šÊž¶¤|¬óµëÀ*ÍrÚ|èÿö²Gr"ê/i<®GQ©Y`gdÃf g:e\a…[ÓSnJ‡?V3&ž ïú[ì-Þ°Ð(ÄØ¸ù®¿¦T Û›i™ ™ÆšŒžM¤é«9µÀ-ÌZÙNçÂõkü*!¬.:;•FPËXH_Öc^fÒf1eƒaÚ[VTK]@P44'Mä Cü¶íˆßÒnÅ º°¶§'¡ƒœå™X™ßštž¤m«´7¿/Ë9ØæmôŽºA-Ý9LERO½Wa^cÑexf e“a!\ÑTÉK9AW5a(šJ ¼ý9ïá…ÓãÆj»U±Ø¨ ¢Oš¼™ ›hž½£ðªÝ³S¾ÊÿÖ´äöò{÷ ¬+U8ÙCýMŒVY]Cb.e fÛdžag\QUL%Bs6¦)Ï TÿÞð¶â'ÕwÈè¼´²ª.£,ž$›(š<›Zžr£jª³^½øÈ¯ÕAãgñÙÿJq*¼6XBœLRUM\jaŽd¨e³dµa¼\âULM%C£7+fýòiäÑÖÊe¾´E«0¤ùž¸›šT›3ž £È©C²P¼»ÇJÔ»áÉï*þ• ¾\()5â@JK,TZ[®` dde¯dïa4]–V8NDDî8r, °FôæsØ›ËÑ¿Uµ\¬¥£Ÿ'œ¯šE›å‚¢©G±#»dÆÏÒ%àîwüà Á&§3?J$S†Z`®cEeÎdMbÎ]iW?OzEL:ñ-§ ´`õõ¾çÚÍ$Á~¶T­Ø¥. uœÁš›|ß¡)¨;°ë¹ÅSÑ’ÞìÑú> {?%B2@>ûH=RÔY™_nc@ee¾bv^EXJP®F£;c/-"Fõ…÷AérÛaÎQ€·(®x¦˜ §œºšÙš4¡N§4¯¾¸¹ÃîÏÝÿêPùÄé# 1*=H}QFY?_IcQeKe8c!_YJQÑGã<¹0’#²aéø–ê±Ü„ÏQÃZ¸Ö®÷¦æ Âœ¢šš‹œŒ |¦=®¦·‡Â¨ÎÉÛ¦éø÷sν"ø/:î1Ó$ù§(úÇëÎ݇Ð7Ĺq¯i§,¡ÜœŽšOš!œøŸÃ¥b­¯¶xÁ†Í›ÚqèÃöD««!ý.[;…F@P\X¬^cseÆe dD`‹ZüR¾I?ü2ï%Ì JûßìØÞ}ÑÅܹ°ä§‚¡ ”š-š×›‰Ÿ0¥¯¬ßµÀŠÌÙ\çªõ,š¦ .}:ÁE›O×WK^Õb]eØeAd¡` [žS}JÚ?ë3î&(Þ ]üîíÞßtÒ÷ŨºÁ°u¨ñ¡U¹š,š¯›;Ÿ¾¤¬,µÁ¿£Ë–ØUæ™ô†š -Ž9èDÜN7WÌ]zb(eÊeZdâ`r[(T)K¤@Ï4è'2õ zý ïöà‚ÓõÆ‘»±'©€¢ÀýšGš¢›Ÿ`¤–«‚´ö¾¼Ê–×AåwóíYpé+}8ìCúMsV+]ÿa×d£e_daÎ[­TÕKtA¿5ô(T' ¶þLð3â¶ÔÈ ¼…²û©0£GžY›vš¡›Öž¤ «Î³¾¾ÉzÖ ä1ò *D7ÊBôLUo\natdqe_dEa2\BU—L_BÏ6#*œ‚·ñœãÖgÉÔ½™³ëªö£Þž¾›§š››ž“£iªü²½šÈ5Õ®â¿ðÿƒ ¡/)ç5ˆAÕK˜T¥[Ö`dFemdŒa±\õU|MqC 8~+ °Ló+å•×ÐÊ ¿¿´å«¿¤rŸœÇš›Dž£¢©²ô»IÇÃÓ"á"ïxýÜ ¢'u47@¬JŸSàZJ`Ác4e™döaV]ÓVŽN±Dq9-³»gõÔæ*ÙHÌsÀæµÚ¬|¥óŸ\œÉšC›ÇG¢®¨Ù°žºÌÅ&Òoßaí³û Q&û2å>ŠI²R-ZÖ_ŽcBeéd†b$^ÚWÉOFÿ:³.t!ˆ6ÈöŠèÅÚÁÍÁÁ·¾­$¦\ ‚œ¬šäš'j¡˜§¯)¹2ÄqЦÝëáùTœp$‡1ž=vH×QYy_tckeUe2c _úXQ–Gž#YŒø9êVÜ+Ïþ ¸Ž®¶¦­ ‘œyšošsœ| s¦<®¬·”»ÎáÛÄéøšùë")0n2ú$Á:úÐëÎÝ}Ð!Äü¸F¯2§ê œ8šð™º›‹ŸQ¥í¬9¶ÁÍ/Úèjöøm~!â.S;‘FbP’Xø^qcæeLfždç`9[²SxJ»?´3 &Ãe ÑûRí3ß¾Ñ8Åâ¹ø¯­§+¡•œš™›±žG¤º«â´¿ŒË™ØsæÒôkó £-<:§E©OXª^\c f¦f/eªa+\ÍT·KA'5#(Mï SýÄîàüÒSÆÕº½°A¨Œ¡Àœø™A™Ÿš žs£¼ª¿³N¾2Ê-×üäWóô‡Åb,9©DÔNfW2^c÷eÈfƒe/bÞ\«U»L>Bi6y)³\ Áþ,ðêáDÔÇã»§±© ¢%+šB™nš©â¢þ©Ù²C½ÉéÕ¤ãóñ‰b+Û7…CÑM‰V]‘b£e¥f“erbR]NVŠM4C7¯*ÿ¹'”ñLãšÕÃÈ ½°²å©Ú¢±ˆšm™fšnw¢d©²W¼ùÇ¿Ôdâ¤ð3ÿÆ Ë)«6pBÜL¸UØ\bVe‰f§eµbÃ]êVNNDˆ8Î+2ølØòˆäÈÖÝÉ ¾³¢ªo£žÇš~™Jš&¢È¨R±t»ûƪÓ>ásïýý’ æ®(¢5A L UP\¶a!efÈec8^†W OùD€9Û,N•ÿó§åØ×ÙÊî¾U´E«í£sžôš™#šÕœ‹¡+¨“°˜ºÆ Ò&àQîÙüq Τ'­4¥@MKmTØ[faúdfôeVc´^'XÏOÙEy:è-i B¼"õÁæãØÐËË¿µâ«e¤Ãž›}™ô™}œ ¡…§Ì¯²¹ÅŒÑß%í©ûD ª&­3¿?…JÉSZ[aÏd‚f!f¯c6_ÏXœPÆF€;/—!zø\öòçÚÝÌ¿À赓¬î¤"ŸM›‚™Ì™(œŠ Û¦û®À¸÷ÃeÐÊÝáë`úüj^%2¼>£I SÄZ¦`“dvfEfd·_{YpQ¾G—<60Û"ËP³÷BéFÛ ÎÐÁÙ¶]­Ž¥•Ÿ›”™«™Õ› +¦!®¿·ÕÂ(ÏxÜ€êøø•  $U1=¥H5RZ,`KdbfffVd?`4ZURËHÇ=„1?$>Ê.ùµêªÜVÏÿÂä·?®B¦ Ü›©™‰™{›xŸh¥/­£¶“ÁÇÍÿÚøèg÷”"ô/[<ŠGEQ[Y¢_úcKf‰fµdÖ`[TSøI?ù2Í%Þs ÖúUì9ÞÍÐUĹ?¯§ª 4œÄ™e™›Úž’¤#¬gµ.À?Ì]ÙCç©õEÊï i.ò:KF7PƒX_šc,f¬fexaß[jT@K@‘4‚'¦E ©üîñßjÒÎÅ`ºZ°ñ§P¡šœæ™D™µš3ž¬£«´¬¾˜Ê˜×jåÅó`ï'½,k9ðDO—WX^1cfÎf€e$bÌ\“UžLBF6U)Ž8 þ ðÉá$ÔbÇŻб娢 š!™Jšƒ¹¢Ó©«²½ÖÈ·ÕtãÄñ^öAõ*Ë7€C×MœV ]¿bßeðfìeØbÄ]ËVNÀC8A+‘F­ò»ãøÕÉA½Î²é©Ã¢9š™à™ÏœÀ¡˜¨5±k»ÇÃÓhá¬ïDþå D)6ùA‰LUÖ\>bªegPf‡cº^XƒOiEæ98-ŸcÍ'ô¿åß×ÎÊѾ%´«–£ žwšó˜…™)œÒ g§È¯È¹4ÅÐÑ\ß‘í%üÍ >,'P4d@,KnTû[¬ace g¢f#dž_)YçPG­;"/¤!wæ:öÂçÇÙ‘ÌfÀ„µ$¬v¤¡žÆšö˜<™–›øŸL¦p®:¸yÃñÏb݆ëúÂBJ%‘2Ò>ÎIKS[aegãf­dm`:Z4RƒH[=õ0’#vë<øµé¡ÛJÎôÁß¶E­X¥@Ÿ›™™›3ŸF¥0­Æ¶ØÁ+΂ەéøÍZy#à0J=wH,R7Zo`´dïfg$e'a3[fSéIî>«2c%XÕ#úëgÝñÏtÃ0¸a®8¦áŸ|›™Ø˜§š„žZ¤ ¬oµUÀ†ÌÂÙÃçCöõÁ!E/Õ;.GQ[YÐ_UdÒf:gŠeÍa\~T2K`@A4' ëûMíß~ÑÝÄn¹m¯§| Ù›=™¶˜Fšæ‚£þª3´ð¾Ë"Øæ‹ô>à& Å-x:ûEPŒX;_ûcµf[géefbå\‚UdL¹Aº5¤(»G “ýìîàñÒ/Ƙºh°Ö§ ¡/œX™•˜ê™Q·¢ª ³¢½’ÉœÖ~äîò¢N¥^,19ÛD OËW¯^§c›f{gBföbª]wVƒMþB7*D× "ÿrðâMÔkÇ®»S±‘¨“¡€œp™u˜“™Äœø¡©ò±f¼9È.ÕãjñÔ< +þ7ÎC=NW.^[c†fœg™f‚cf^aW–N3Dn8„+¸Rœãñrã–Õ•È´¼/²>©¢Èœƒ™R˜;™9œ<¡,¨ã°5»ìÆÌÓ‘áôïªþh áÉ)Ø6ÌBdMlV³]csf¿gðf d_EX¢OaE·9ã,%ÅLóÌäÙֻɶ½ ³ì©¢š™5˜ê˜µ›Š N§Þ¯º©ÅsÒ)à…î<ý ‰†(²5ÇA‡L¹U/]ÂbTfÓg7g„dÇ_YœP}Fð:2.ƒ +u­ôæØàÊ»¾é³¢ª£lÁ™)˜¬˜H›îŸ‡¦ñ®ÿ¸~Ä1ÑØÞ+íàû« >O'“4Ç@ªKU§\gb)fÙgmgédY`ÔY}QG JÃS²[ÆaÝeãgÎge\a"[SKI >‰1$ÆBø–é^ÛäÍoÁ?¶Ž¬¤jžAš(˜*˜Hšužž¤¡¬T¶‡ÁýÍwÛ¯éZø-Ú$•1>NI S[RaŽe»gÍgÄe«a—[§SJã>{2 %Þ:kù¿êÜýÎwÂ1·e­G¥ÿž°šo˜H˜;š>ž=¤¬§µ·ÀÍpÚ“è/÷ù¢á"j0÷feòaÊ\ÀUùL¤Bô6(*GÃÿAñ ãmÕ¬È ½Ä²ª£žìšá™èšû £ý©®²ï¼ŒÈIÕãâñ’ÿHì)µ6cB¸L~U‰\³aãdfeb(]MV³M†Cû7M+À˜¡òhä¿ÖìÉ1¾Í³ôªÔ£’žJ› šàšÀž¢`©ä±ü»uÇÔ–áµï)þ§ â’(p58A®K›TÑ[*aŒdäe,egb£]úVŽNŠD#9”,–ôÙå"Ø9Ëb¿Ú´Ø«‹¤Ÿ››(šÄšm¢¦¨ú°éº=ƽÒ(à8î¤ü" e%'4@œJ´S[§`?dÏeOeÂb5^ÀWƒOªEh:÷-— &¨õ_ç—Ù•ÌžÀïµÁ¬B¥™Ÿå›7ššš {¡Ö§û¯¾¹îÄPÑ¥Þ¦ì û‹ Ù¬%»2Ä>‡IÍReZ)`ûcÆee.cÙ^˜XŒPÞFÀ;m/#")ÅD÷ðèÛõÍÛÁ·¥­ò¥ #œ:š`š–œÎ õ¦é®‚¸ÃÒÏÝëgùëF-$Y1†=tHêQ¸Yµ_ÁcÉeÁe©cŒ_€Y¤Q!H'=ð0»#Ínçø…ê“ÜXÏø†®¦„ Zœ4ššœ  ¦Ï­=·%ÂNÎyÛaéÀ÷I±¯"ù/Kp2O%l ƒúì Þ²ÐNĹ`¯B§ñ Œœ+šÛ™œ›eŸ$¥º¬¶ÇÀÕÌíÙËç'ö¶-A!¨.;bF9PpXÜ^]cÚeGf¢dò`L[ËS˜Jâ?à3Ñ&ø üínßøÑqź+°Û§T¡¹œ š—™"›¹žH¤³«Ó´z¿pËwØKæ¥ô:¿èl-:qEuOÝW}^3cæe‰feša"\ËT¼K%A:5<(l zýïî»à*ÓÆ»è°i¨°¡áœšW™°šžx£»ª¸³B¾!Ê×ãä<ó×i¦E,þ8D½NSW$^ còeÇf‡e8bë\¼UÏLTB€6‘)Ér Ôþ<ðõáJÔ‚Çß»œ±ñ¨ ¢ š™Eš}µ¢Ñ©­²½ãÈÊÕŒãâñ‚ o&+ý7²CNÈVÇ]ßböeûfëeÉb¦]žVÓMuC¸7Ú*É(…ñ.ãmՈȼZ²„©p¢@šô˜í™øœ¢ú¨³±¼²Ç†Ô=âŽð/ÿÔ 2þ)ð6ÄB?M(VR]˜bßeg3f?cH^gWÁN‚Dà8,g{Óòpä›ÖžÉ»½/³3ªó¢—:šì˜¶™“œs¡?¨Ñ°ÿº“ÆQÓ÷à=ïÛý„ ëÇ(Ï5ÀA\LkU¿\1b¦e gYf”cË^X–O{E÷9F-«kÑ(ô¾åÛ×ÊÊ̾!´«˜£ž„𙡙Mœÿ ž§°º‚Å$Ò´ßìíü' ”|'–4Ÿ@YK‹T\¥aHeÞf]fÊc1_ªXWPcF;p.í ¿1õ ç4ÙÌý¿5µò«c¤¯žôšF™­™&œ¦ §O¯-¹zÄûÐpÞ“ìûº '&?3^?4J‰S,[õ`ÈdfCfåc€_,Y QCG <œ/6" ¢÷›è©ÚyÍOÁk¶­N¥nŸ‚› ™Ñ™œ] •¦®K¸mÃÈÏÝ%ëšù/™Ž$Ä1ø=êHbR.Z&`+d)ffñcÅ_ªY¾Q+H!=Ü0™#Ÿ5§ø?êIÜ ÏÎÂÍ·C®b¦Q 0œš šœ ¦æ­]·LÂ{Ωۓéñ÷xÜÔ"0_42%BñsúìÞÒÐ~Ä`¹°¯¡§[¡§š[šœåŸž¥+­e¶ÁÍÚàç#ö˜õî =.›:ÉEŽO¶W^b e{eÝc:`¥Z;S"JŠ?©3¾& Õ iüîà¾ÒSÆ»9±ö¨w¢Ü>›ªš"œ Ÿ¥X¬PµË¿’ËiØ æ5ô›óóR,Ë8DNmV ]Æa†d>eéc`A[T?Kß@/5k(×· VþþïùáÔÈ¢¼™²"ªg£ž«›Òšœ=Ÿk¤t«2´z¾ÊÇÖNäeòÃ'›*27ªBÉLZU1\)a*d$edù`é[ýTXL(B¡6þ)ƒs½ñ¬ã.Ö‰Éþ½É³ «.¤Ÿú›ášÕ›ÑžÄ£•ª"³=½²ÈFÕ·âÁðÿw Ž)Ë5hA±KrT~[®`êceHdha\×UaMZCõ7n+©Ió*å—×ÕÊ&¿È´ð«Ì¤Ÿ+œÚš–›[ž£¼©²¼iÇäÓEáFïý 'Å'–4V@ÈJ¶SòZW`Çc2e‘dåa=]±VdND79Æ,lo¯ô‚æØØùË(À¢µž¬J¥ÍŸCœ¾šG›Úk¢â¨±ñº,Æ“Òæßàí9ü¥ Û&|3^?øIS|Z`´cReâdfbë]‰WaOœEn:.à ÌsöÅçÚ ÍÁl¶=­¼¥ Tœžš÷š\À¡¨%°Û¹üÄPÑ—ÞŒìåúZ žh%p2s>2IuR ZÐ_¢cpe/eáb’^WXRP¬F—;L/ "ÁH÷ýè)ÛÎÂ1·Ú­.¦S iœ„š®šåœ¡F§9¯Ð¸ØÃÐSÝAëšùgE$f1ˆ=jHÔQ–Y‡_ˆc„ereQc,_Y8Q±G¶<0M#c Œø5êNÜ!ÏñÂþ·®ª¦¤ Œœxšsš~œ ‹¦Z®Ñ·¿ÂêÎÜúéRøÒ.#V0”<—G'QY/_^c‰e¥e±c¸_ÎYR«HÌ=«1‰$©SÑùpëyÝ6ÐêÃÖ¸3¯4§¡»œyšEš"œ Ú¥ƒ­Ø¶©Á½Í×Ú²è÷ˆîì!;/”;¹FoPƒXÌ^)c„eÐe d?`€ZëR¨Iæ>Þ2Î%ù¨ %û»ìµÞ[Ñóľ¹õ¯Ë§k¡öœ‚ššÉ›|Ÿ%¥¥¬Õµ‡À̇ÙUç£õ'•£ .~:ÄE¡OáWY^çbueôebdÈ`7[ÍS±J@$4)'c •ü#î àÒÆÁºÏ°y¨é¡@˜šþ™t›õžl¤¿«Ç´U¿2Ë"Øàå&ô©<·,J9´DºN(WÒ]•bYef´dOañ[·TÅKJA|5™(㢠þ¦ï‚áûÓYÇÝ»Á±<©x¢š¹šæ™$›mž°£Òª®³¾ÒɨÖUä‘ò¼M+ÿ7ŽC¿M]V;]5b3e$feÖa¯\¦UâLŽBâ6*u>½ÿ>ñ ãmÕ¬È ½Ä² ª£ýâšÔ™×šæó¢á©²Î¼iÈ%Õ¿âñðqÿô /Ø)¨6]BºL‰U\Ða e5fPe]bl]—VNÖCK8+ ß_Øò–äáÖÊ9¾Æ³ßª°£`ž ›À™ˆš^3¢ï¨o±†»Ç£Ó+áSïÓý] ¨i(X53A¼K½T\saådMf£eéb.^‹W!OE³9-yùjôæJØKË]¿½´¤«@¤¸ž(›£™2šÐœp¡û§O°@º›Å&Òžß¿í?üÒ .'4@ÍJþS|[ aÌdmfûexcñ^}X>P_F;“."!„ìõˆç¢ÙƒÌoÀ¥µ[¬Ä¤Ÿ>›‚™Ù™Bœ°  §8¯¹EĺÐ$Þ?ìÀú] ʼ%ê2?ðIPS[Ù`»d’fUfd®_fYNQ‘G_<ô/"wôR÷ÝèßÚ¡ÍiÁt¶þ¬5¥DŸI›X™|™´›ôŸ'¦-®Ü·ÃcÏÂÜÙê]ùƒ$Ú1$>,I¹R™Z£`·dÁfµf”dj`JZVR¶Hœ=B1è#ÓLŸøêܦÎJÂ.·Œ­•¥tŸG›%™™#›9ŸF¥)­»¶ÊÁÎqÛ…éøÁQs#Ý0J=zH2R?Zx`¼döfg%e#a*[VSÒIÎ>„23% •ÝùDëÝÏÃÛ·®ë¥›Ÿ?›î˜´˜“š€žg¤+¬¡µ›ÀÝÌ*Ú<èÊö‡)c"ë/z<ÐG±QëYR`Åd.g~gµeÝa\UTëJý?Â3y&iÙ ûkì&ÞÐðǸ®A¦ÃŸ8›¸˜Q˜šÈŠ£-«ˆ´k¿žËâØñæ‚õKýN!ò.£;G*QY$`Çd^gÜg@fbá\PUL+A5Ã'¶$ WüíBßÑÏÄA¹"¯¦¦úŸA›’˜ü—ƒ™¹¢9ªw³B¾cʛפå7ôÉ. ì-¼:\FPYâ_²dxg%hµf/c§]8V MKB46)ýj —ýÐîbà—ҸꝧF _›‚˜¿—™Šœÿ¡]©|².½;ÉeÖgäùòΛç,Ô9•EìO¥X‘_Žd€gYhg¸cU^ WùMSCP7.*0Ÿ Èþöïxá˜ÓžÆÎºf°š§š ‰›‚˜”—Ę œ]¡˜¨š±2¼,ÈGÕ@ãÏñ¨}ì+ñ8ÏDHO$X7_\dwgyh\g&dç^¼WÉN=DM8:+F¹àÿñ}âŒÔ|Ç’» ±¨ü Æ›™˜…—˜´›â ý§â°b»FÇQÔ>âÆðÿvû*8D™N“WÆ^ dLgsh{gidN_EXpOE)9*,EÄðò‰ãŽÕoÈq¼Ò±Ê¨†¡-œÛ˜ —„˜€›‡ }§?°žºfÆXÓ2á¬ïzþP àà)7 C¸MÏV#^cõfEhwgd _¾XPÃE :(-Zé!Nó½ä»ÖÉ~½Ç²¡©;¢½œB™Ü—“˜c›>  §¢¯Û¹ÅVÒà~î@ý ž¤(Ö5ðA³LèU_]ðb€füg\g¤dá_,YªP„Fñ:-.y dšô æØÍÊ«¾Ü³˜ª£lÆ™4˜¼˜]› ¤¦¯ ¹ŸÄRÑöÞFíöûº FO'Š4µ@ŽKàTx\0bêe“g"gšd`„Y0Q6GÌ;+/—!T®ñõhç`Ù!Ìð¿ µ®«¤;žmš­˜™v›ïŸ[¦˜®z¸ÐÃ]ÐáÝì°úf êñ%33j?WJÂSz[Va9egÌfud`ÁYœQÐG<0£"~îA÷Áè»ÚxÍ;ÁE¶Î¬¥Ÿ#›8™c™¢›ëŸ%¦2®ç·ÃxÏÚÜñêuù”˜$Þ1 >I¢RwZw`d‚fnfGd`õYRbHM=ú0ª#¡)ŒøêÜÌÎ…Â}·î­ ¦øŸÙ›Ã™¿™Î›åŸî¥Ë­R·Q‘ÎÐÛÊé7øÌ=>#‰0Ö<èGƒQxY›_Îcûef d"`2ZnRþH>è1º$ÍkÞùrëpÝ#ÐÎó¸ ¯§Ï †œCššì›ÐŸ¨¥T­¬¶ÁšÍ¸Ú–èîötÞà!1/;´FlP‚XÌ^+c†eÓedE`‡ZôR²Iò>ì2Þ% ¾ >ûÖìÓÞ|ÑÅ㹰󧔡ªšCšì›ŸA¥¼¬æµ‘À…̃ÙIçõ qw Õ-E:†E_O›W^Ÿb-e¯e!d‹`[ŸS‹Jõ?4#'h* ²üKî@àÚÒ_Æ»#±Ò¨D¢ôšWšÊ›DŸ´¤ý«ú´}¿NË0ØàåôŽ÷w,9aD`NÈVn]0bôd­eVd÷`¡[pT‰KAZ5„(Ü© 5þÉï±á6ÔŸÇ+¼²—©Ø¢û›Eš›Ãžÿ£«ê³F¾÷ÉÁÖaä‘òw—+Ç7NCxMVì\äaâdÔe¶dŽal\jU­LbB¿6*f9ÁÿJñ ãŠÕÐÈ5½ó²@ªJ£4ž› š ›ž!£ ª´²î¼„È:ÕÎâûðuÿó *Î)›6LB§LtU†\¹añdf9eGbX]„VïMÆC<8+ÿÓTÎòŒä×ÖøÉ0¾½³Ôª¦£Vž›¶™~šU,¢ê¨k±…»ǨÓ4á`ïãýr Á†(y5XAäKçT2\ŸaeyfÍecR^ªW;O0E¿9!-˜kãKôïåØË¿y´[«ô£jžÚšV™è™Šœ1¡Ä§!°ºƒÅÒŸßÍíZüû cI'c4n@,KdTæ[a9eØfbfÙcI_ËX€P“F7;¨.&!÷e¼õGçRÙ%ÌÀ0µÞ«A¤ž·šü˜X™É›A «¦ä®Ã¸Ä›ÐÞIìßú &S3ˆ?tJÞS•[raUe*gèfd.`ÙY±QáGœ<0¡"sÚ!÷—è…Ú5ÍìÀêµi¬˜¤¢ž¥šµ˜Þ˜›iŸª¥¿­€·ºÂ1ϧÜÔêpù.Âá$A2œ>³ILS4[Da[edgUg.eù`ÍZÊRIì=~1$äG„øçé½ÛOÎâÁ·¶­¥ßž¯šŒ˜˜š­žÄ¤´¬T¶sÁÖÍ>ÛeéøÈkŸ#1˜=ÖHšR±Zò`MIÓR¬Z®`»d¾f¬f†dV`3Zu22%.² úë_ÝóÏÃH¸„®f¦ ¿›m™/™›ëžÇ¤|¬ãµÊÀúÌ2Ú.è¦öOÛ"v/õ;»–ÆÓàŽîõül §]'F4 @­J·S[`d™e etbÞ]`WO@Eý9Œ-0 -ÌXõç`ÙṅÀéµÌ¬^¥ÇŸ"œ„šóšoê¡L¨u°:ºiÅÈÑßíhûÙ Ù%Õ2Ê>yI«R0Zâ_¢c^e e¯bR^ XþOQF8;ì.®!Ámþö¾è÷ÚðÍíÁ,·å­G¦z œÃšöš4r¡›§¯ ¹"Ä[ЊÝkë·ù#d1$C1T=(H†QUÿ[ã`Ðc¸d•co`T[_TµKƒAü5^)éä —ÿLñMããÕTÉà½Ã³2«X¤ZŸQœM›Tœ_Ÿ`¤;«Ï³í½cÉóÕ^ã]ñ¨ÿõ úm) 6ŽA¾KfTW[o`“c²dÇcÖ`ï[+U­L¢B<7¸*W]Äò¹ä<×’Êý¾º´ü«ó¤ÂŸ„œJ›œñž¿£lªÖ²Ï¼%ÈÔ÷áìï5þ‡ ™!(Ù4~@ÖJ©SÊZ`mcÁd dMa—\V«MÂCz8 ,»É€*ôæ~Ø·ËÀ•µ«¬r¥ œœ.›Ê›ož£©Ñ±¨»ãÆFÓ’à€îÊü% Gæ&»3„?JSWZÔ_`cédfdÛaS]èV¹NòDÄ9k-% 9îõcç¸ÙÓÌ÷Àb¶K­à¥I ¢œþšg›ÙI¢Ÿ¨»°rº’ÅâÑ!ß íXû½ ñ¨%2‹>6IdRèY™_[ceËdqb^ÙWÑO*F;Ò.™!±cùö¼èùÚõÍôÁ5·ï­S¦ˆ ¬œÓš›Hˆ¡³§§¯=¹CÄ~бݕëäùS˜g$z1Œ=_H»QpYT_Jc=e"eûbÒ^½XÛPVG^<-0# Ñ^øê8ÜÏô ¸›®Ð¦Ó Äœ¸š¹šÈœÚ Ú¦¨®¸Ã-ÏQÜ/ê~øôF*#X0‹<„G QìX_'cLecelcq_‡YÌQhHŒ=q1U$}0¸ùaëtÝ;ÐúÃð¸W¯a§7¡øœ¼ššmœR '¦Ï­!·íÁüÍÛàè*÷¡ûî!//|;”F>PFX…^Ùb,eqe¨cÚ_ZˆRII>2‡%¿{ û«ìµÞlÑÅï¹5°¨Æ¡\ñš“šCœùŸ¡¥­H¶ñÀáÌÛÙšç×õI¥  ñ-T:ˆESOƒWì]nbòdieÓc6`§ZAS,J•?µ3É&Ü lüîà¶ÒGÆ»&±â¨b¢Ç+›™šœ˜Ÿ¥]¬]µá¿±ËØ<æmôÛ9>¡,9oD_N¹VP]bºdged`?[TK­@î4(yM âý‚ïwá ÔƒÇ ¼²®©ÿ¢2ža›™šà›-Ÿq¤«e´Â¾qÊ6×Îäôò]¿ÏE+Ú7MCcMèU¯\•a‚dde:daÝ[×TLÏA16z)ìÍ gÿñîâpÕÎÈK½"³‡ª¨£¨ž¡›¢š±›ÉžØ£Æªm³¢½/É×Õ[ãsñÖÿ:TÛ)‰6BWLUý[a9dSe_dcan\™U MéBn7Ó*[Kë‡òhäÙÖ Ê~¾0´l«^¤,Ÿð›»š“›tžO£ ª…²‘¼údžÔóáüïXþ¼ Þu(:5ê@JK#TG[’`èc8e{d´aó\OVìMõC8 ,½¼dÿóÙå;ØkË«¿:µM¬¥®Ÿ>œÔšw›#žÊ¢V©¢±†»ÌÆ;Ó’àîáüF p'ò3À?CJES—Z`œc!ešdbz]WÑNEÍ9l- ,ÛvõGç™Ù²ÌÕÀ@¶*­Á¥, ‰œéšU›Ì@¢›¨»°vº™ÅìÑ-ßígûÌ ÿµ%¨2”>;IgRçY”_Sc e¼d`b^ÅW¼OF;¿.‰!¤Zôö½èþÚÎÂK· ®s¦« Óœüš2›r²¡Ú§Ì¯]¹]ēоݛëâùH„K$U1`=-HƒQ3Y_cúdád½b˜^ŠX°P3GE<0ÿ"*ç€ø@êqÜZÏ?Ã_¸ó®+§/¡› ›¡§Ò®9¸Ã*Ï>Ü êKø²öÎ"ò/<G“PtX‹^·bädec0_WY®Q_H—=‘1‰$ÅŠ"úÙëùÝÉÐùì¯ñ§¾¡u)›éšµœƒ @¦Ï­·ºÁ°ÍªÚfèöQ:!w.Ã:ßEO¥Wô]\bÇd'ezcÊ_*Z¶R–Iø>3'&tC Üû‹í™ßOÒòźù°É¨]¢ÖL›ËšXœèŸk¥Ã¬ÊµRÀ$ÌÙ¬æØô>“ä,R9˜DyNÅVN]õaŸdAeÖce`[ÆSØJg@§4×'9 ®ýUïRáîÓoǼ²³© £Ežy›¶šÿ›OŸ”¤²«…´ß¾‹ÊK×ßäÿòc¿Ê;+Ë7;CNMÑU—\~aldQe*dû`Ö[ÖTLÛAC6’) ð ÿ/ñãŸÕýÈx½L³­ªÉ£Âž²›«š°›½žÂ£¥ªB³l½ðÈ‘Õã!ñÿã þˆ);6ÔALÔT×[þ`/dYevdŠa¥\àU^MKCÛ7J+ØÌmóåäO׋Êݾ´©«ˆ¤@Ÿî›£šd›/žõ¢©²¼]ÇÞÓEáKï¨ý ;Þ'³4v@ìJÝS[ƒ`öcceÃdbq]æV˜N³Dj9÷,››?Óô æðØ Ì3À¥µ˜¬<¥¶Ÿ#œ•š› )¢˜¨Í°œºÓÅ8ÒŠß„íßûO ‹G&=3)?ÏIöRoZ`Çctee§b<^çWËOFì:•.L!VüˆöEè|ÚuÍuÁ¸¶w­â¥  Oœ‚šÄšb¡§¡¯G¹\Ä¦ÐæÝ×ë0ú©ôÉ$à1ô=ÇH!RÑY°_žcˆede1cý^ÛXíPZGU<0à"óšøÊééÛÃΜ³·A®w¦} sœlšušŒœ¨ ²¦‹® ¸Ã3ÏcÜLê¦ø&‚n#£0Ü<ÙGbQEYY_~c e±e´c±_½YøQ‰H¡=z1Q$lù*ë3ÝïϥÔ¸õ®û¦Î œUš)šœûŸÙ¥‹­ê¶ÄÁáÍÛåè?÷Ç24"„/ß;G¶PÇX _bcµeùe+dU`‹ZëRœIÏ>¼2¡%Âh ÝúlìaÞÑšÄd¹¯w§¡¯œDšê™¡›bŸ¥§¬æµ¦À¯ÌÃÙžç÷õ…ü!y.ð:6FPJX¹^=c¾e.fŒdà`=[ÀSJÜ?Ý3Ð&ú¡ ü–ízßÒ‚Å-ºC°ö§r¡ÚœDš¾™L›äžu¤â«µª¿ŸË¤ØvæÌô]Ýÿ|- :qEkOÊWa^ c·eQfØdSaÔ[xTfKÌ@á4ã' 1ý®î„àþÒbÆñºæ°v¨Í¡ Oš¡™›xžå£0«3´À¾¡Ê–×^å°óBÈ÷†,.9¬DÇNHW^Øbªemfe½ac\)U5LµAà5ó(1â PþÆï‘áùÓFǺ»±ý¨-¢E^š†™Âš žS£{ª_³Ñ½šÉÖ:ä†ò¥á‚+@8ÛCN¼VŸ]œbšeˆfbe-bû\æUM°Bò6*b‡ÿ÷ð´â Õ?È”¼H²Ž©–¢‚mšg™vš”°¢±©r²Æ¼wÈHÕ÷â=ñÐÿd®d*=7øBXM'V7]db’e±f»e¶b°]ÄVNÑC-8e+¼xãJò÷ã6ÖMÉ€½ ³'ªÿ¢ºsš;™šõ¡Ì¨h±œ»3ÇðÓ“áÓïgþ ]()6úALzU¸\bueÆff-cV^•W OìDd9´,áP³óVå„׃ʙ¾´õª¢£.žµšJ™ô™°œn¡¨ˆ°•º Æ«Ò8àhîôü îÅ'Ï4Å@lK‹Tó[~ae”ffecÁ^2XÚOãEƒ:ô-v QÍ6õØæüØìËê¿4µ¬‡¤äž:›š™š’œ¡§Ë¯¨¹òÄnÑÛÞóìmûþ [9&P3]? JbSôZ®`rd-f×epc_¯XPÊF˜;1/×!Í^Óöyè™Ú|ÍeÁ”¶?­˜¥ÆŸè›šIš‘œÜ §¯Â¸ÛÃ+ÐsÝmëÑùU­Ž$±1Ó=³HR×YÂ_¼c±e—eocC_*YCQ¶G·<~0I#_Šø4êQÜ&Ïú ¸®¼¦·  œŒš†šŽœš “¦[®Ë·°ÂÒÎóÛÎéø’åÌ"þ/6<6GÅP±XÑ^c9e_eyc_¶Y RºHï=ã1Ö$ ÇWúìÞàКĉ¹å¯à§¤¡Qþš¶š{œD ü¥‡­½¶nÁcÍ^ÚèUöÀ!E.˜:¼EvO”Wì]^bÑd;e—cð_WZëRÑI8?Y3o&¾Ž 'üÔíßß‘Ò/Æøº'±ï¨z¢êW›ÍšOœÖŸO¥Ÿ¬žµÀëËÄØiæ“ô÷MH¡,9^DEN˜V)]×a‹d5eÓck`[ÜSöJ‹@Ò4(lH åýŒïˆá#Ô ÇB¼C²×©)£]žŠ›ÁšœNŸ¤¦«u´Ë¾tÊ2×ÄääòG¥±$+·7)C?MÅU\xahdPe*dý`Ù[ØTLÛAB6)è ƒÿ ñ ã‹ÕçÈa½4³•ª±£¬žŸ››š¥›·žÃ£¬ªQ³„½ɸÕ=ãWñ¾ÿ&EÒ)†6 BcLU\7a^d}ed”a \ËU9MC–7ö*w^õ‡ò_äÅÖÊU¾þ³0«¤ãž¢›jšB›$ž£Ä©E²Y¼ÎÇfÔááøïcþ× ®(5>A©K‹T·[a_d®eíd bV]§V6N.DÅ84,¾§:Áó‡å××öÊ)¿¬´¶«v¤Ÿ£›>šéš¢Y¢÷¨Y±S»³Æ<Ó­àÂî1ý® ï©'–4r@ÿJT[[Õ`WdÑe9e”bï]bWO"EÍ9L-ßÍ^Þô—æÔØÜËó¿Wµ>¬Ø¤LŸ¶›(š¬š>Ñ¡N¨‘°rº¼Å4қߩíüš å¯&±3¥?PJxSïZ`6dÖefeçbf^úWÆOôE¶:G.è Þrïõ çÐÙÆÌÇÀ¶Ù¬R¥¢Ÿæ›3ššüœk¡Ä§è¯«¹ÜÄ@Ñ—Þ›ìû… Ö«%¼2Å>‰IÎReZ'`õc¼esecÀ^yXgP´F‘;:/í!ñ ÷»èâÚË͸Áé¶•­î¥ 9œ]š’šÔœ¡L§K¯í¸ÿÃIЊÝ~ëÜùY«‡$¥1Á=œHþQ¶Yœ_’cƒeee9c _íXQuGt<90#ÄJøùéÜöÎÑÂé·x®®¦´ ©œ¡š¨š¼œÔ Ù¦¬®&¸Ã>ÏeÜDê”ø Z<#g0–<‹G QèX÷^c9eLeQcS_fYªQFHl=S1;$f­ù\ëvÝDРĹu¯„§_¡%ëš¾šœ S¦÷­D· ÂÎÛäè%÷“äÎ! /O;bFPXK^ bõd?e{c´_ýYsR=IŒ>—2›%Ý£ 7ûäìõÞ°Ñ\Å8º~°`¨ ¢˜&›¿šeœ ª¥­7¶ÓÀ¶Ì£ÙXç‹õöKB ‘-õ9+EüN3W¦]3bÄdJeÃc7`¸ZcS^J×?4&'{L ãüŠî‹à/Ó»Æp»ˆ±7©§¢üL›¦šœ|ŸÞ¤¬µx¿9Ë Ø®åÙóB¡©,™8ùCúMfV]Ýa¬dre)dÚ`”[sTK>A5Æ(+ —þ2ðâ¦Ô È–¼|²ô©*£@žQ›lš–›Èžò£úª»³¾ªÉgÖüã#ò’ÿ¨*T7âBM»U¤\¬a»d¿e´dža\ŸUóL¸B"7n*ݶBÍñ ãÖDɽO³ª‡£_ž1›šüšõë¢Ä©\²‡¼ȽÔKâsðìþl §S)*6èARL0UT\›açd(fXezb]ÚVUN8Dº8,Š`áWóåP×dÊŽ¾ ´«Î£jž›¡™Všß¡¨±»‚Æ!Ó©àÔîZýî D(5AK²T\ae‘f÷eLcž^X¢O¢E9: - ícÆôbæƒØpËn¿¹´‹«¤xžÖšB™Â™Uœî t§Æ¯¹¹Å«Ñ.ß\íëû ÿí&4'@ñJ7TÇ[|a7eäf|fÿc{_YÆPàF‹;ÿ.€!R¿öšçŸÙlÌCÀeµ ¬c¤—žÄšÿ˜Q™¸›( ‰¦»®“¸ÞÃbÐÝÝ ìžúO ÐÕ%3O??J­Si[Ka4egÓfd&`×Y¶QìG­<30¾"•M÷Çè¹ÚmÍ'Á(¶¨¬Ø¤ážãšò˜™T›šŸÖ¥å­Ÿ·ÐÂ@Ï­ÜÑêcù£¹$2d>tISêZö` eggÜdª`ƒZ…RÚHµ=P1ê#É7€øïéÐÛmÎ Âë¶F­N¥-Ÿ›å˜Þ˜ïš Ÿ"¥­«¶ÄÁ!΀۞é0øë‚ª#1‰=»HrR~Z´`ôd(gDgHe>a;[^SÏIÂ>n2%ùg¨ù ëÙÜ^Ïß·ӭ³¥hŸ›Ê˜˜˜€švžh¤5¬µµ¸ÀÍXÚpè÷Åi¤",0¹< HèQZ{`ædEgŒg¹eÖa÷[:TÇJÐ?Ž3?&)– Ñú&ìâÝOгÃP¸a®¦¤Ÿ$›¯˜R˜šß«£X«»´¦¿ßË'Ù9çÌõ”D‘!0/Ú;MGNQªY4`ËdVgÉg"fhb¯\UÁKä@¶4v'iØ üZíß\Ñ¥Ä"¹¯Ÿ¦ S›°˜&˜·™Zþ¢…ªÇ³•¾¶Êì×óå€ôI[ .Ñ:cFˆP Y¿_‚d5A­K²Tÿ[naãdMf¤eìb3^’W+O*EÂ90-µ–•ôIæƒØŒË¥¿ µû«¤ŸŽ› ššš6Ò¡W¨¢°ˆºÕÅPÒ·ßÄí/ü¬ ñ´&­3™?:JZSÈZ_`de)e©b)^ÁW’OÇE’:/.Ü à„öÒçÚÍ%Áz¶M­Î¥$ jœ¶š›tØ¡$¨8°è¹ÅQÑÞ{ìÊú4 m,%)2!>ÖHR¡Y`_0cýd¾dub-^ýWPnFj;3/",éˆ÷Té–ەΖÂÖ·®ê¦¡/I›m›šÆ¡Û§¸¯6¹"ÄDÐ]Ý*ëbù»ìª#¯0·<ƒGÜP’X{^zb{drd`bP^WX”P/GYk/"A/^;GFÃO¡W¸]éadMdsbš^×XGQHg=~1”$íσúTì‹ÞpÑGÅNº¿°Ê¨›¢Ožþ›´›r/¡Ø¦O®n·ÂÝͺÚXèpöºì» á-:$EÈNÓV]ƒaðcWdµb_…Y&RI™>Ð2&jV üÖíþßÌÒ„Æf»«±‡©#£ žœ“›ž ¦Y­M¶¿ÀyÌ?ÙÍæßô+gHˆ,á8DæM$V¤\CaëcŒd$cº_`Z1SRJò?E4Š'ñ £ý`ïsá%Ô¹Çq¼†²-ª‘£ÔžœO›šœèŸ(¥@¬ µY¿÷Ê©×-å<ó×Ð.+­7 CMƒU<\aûcØd«cy`R[RTK_AÍ5%)¦˜ Bÿððìâ~ÕìÈw½Z³Ëªõ£üžû›ÿšœ&Ÿ3¤«¾³ì½pÉÖŠã˜ññÿK[Ù)6 B?LéTÛ[ñ`d)e5d9aE\rUäLÆBN7·*A3ÖtòXäÊÖÊq¾#´_«Q¤Ÿã›®š†›hžD£ª~²Œ¼øÇˆÔùáðiþÓ û˜(b5A~K\T„[Ò`*d{e½dôa/]‡VND¼84,ƸSáó­åØ%ËZ¿Þ´ç«¥¤<ŸÉ›^š›³a¢ö¨N±?»•ÆÓ€àŽîøüq °j'X46@ÈJÖS2[´`AdÆe:e¡b ^ˆW@O]E:˜-2 $·7õîæ'Ù)Ì7À‘µl¬ù¤^Ÿ¸›šš•¡¨;°ºQÅÃÑ&ß3í¢û) {O&\3^?JSSÜZŽ`Kdÿe¢e5cÅ^hXAPxFB;×.y!lúnöè5ÚÍÁ:¶ì¬N¥†Ÿ³›é™1šŠœç 3§K¯¹4ĘÐóÝþërú fP%y2›>yIÙRŒZh`Pd/fûe¶cj_/Y$QtGP<ò/›"ƒ÷é$ÛïͽÁζ\­–¥¦Ÿª›·™×™ œE p¦n®¸.ÆÏÚÜåê^ùúml$®1ï=îHsRLZP``dgfZf9d`òYRgHT=1±#¦*ˆø êܳÎcÂS·¼­Ï¥·Ÿ“›y™s™›šŸ¨¥‹­·'ÂsÎÂÛÍéMøõyŽ#ì0K=mHRZC`|dªfÄfÇd¿`ÀZêRdIa>2Í$À=ùëàÜtÏÃÑ·®¦¿Ÿr›/™™ìšäžÔ¤ž¬¶ÁXÍ£Ú°è7÷샰")0¨<ìG¼QãY7`˜dîf.gVepa[ÓScJp?43î%ã[ ¢úìÐÝKпÃk¸‹®Q¦êŸu› ™¶˜zšMž¤È«)µÀAÌ€Ù†ç öÆf£!0/É;+GQgYâ_ldìfVg¨eéa/\–TFKo@J4'• Ýû;íúÞeÑÁÄR¹Q¯ó¦d Å›.™­˜DšêŽ£«N´¿(ËPØEæ¿ôtZ ö-£: F1P¡XE_úc©fCgÆe8b­\AULkAg5O(fõ Fý¥î_à¾Òƺ_°Ü§#¡VœŽ™Ú˜<š¯£qª³¾Ê×éäPóø•Û,@9ÕDOšWh^Mc/fþf¸eab ]×UãLbBˆ6”)Éo Ðþ7ðñáHÔ‚ÇỢ±ú¨¢š2™\š•̢橾²'½éÈÉÕƒãÐñfù>ë*¸7dC²MmVf]|b’ešferbY][VŸMPC¥7Ù*1ñd×ñ“ããÕÉX½û².ª£ð¿š›™Šš‡ƒ¢c©²9¼ÍÇ„ÔâNðÑþY œO)+6íAZL:U_\¦añd2f`eb£]ßVZN?DÂ8,˜sùvó4å}ךÊ˾P´]«!¤Âž\›ÿ™´šu6¢Ý¨G±J»°Æ?Ó¶àÎî?ý¾ º'¦4€@ KTb[Ú`ZdÓe;e–bò]gWO-EÜ9`-ùìƒõÇæ ÙÌ/À”µ|¬¥†Ÿì›XšÔš]æ¡V¨°`º›ÅÒ^ß`íÁû9 {=&93+?ÕIÿR{Z!`Ôc‚e e²bD^íWÎOFé:.D!Mò}ö:èsÚoÍrÁ¹¶}­í¥1 fœŸšèš<’¡Ð§Ù¯‚¹˜ÄâÐ ÞìdúÖæ$ó1ü=ÃHR³Y…_gcEeeØb›^rXPéFä;¨/u">Î÷ˆé·Û¢Î¸·[®¥¦¾ ÇœÓšìš8¡K§+¯¯¸¤ÃÓÏûÜÚê&ù–Þ´#Ò0ñ<ÔGBQ Y_ceecö^÷X)Q·GÑ<¯0#¸où¶êÚܵϊÚ¸¯B§5¡öšäšÞœÜ Ç¦‚®ä·¼ÂÓÎéÛºéÿ÷mºœ"Ê/ÿ;üFŠPuX”^Ébüd#e=cT_{YÒQ€Hµ=ª1$Ò‘#úÓëìݶÐvÄk¹Î¯Ò§ ¡X›Ôš¦œ| B¦Ù­·ØÁØÍÜÚ èßöLŸ‹!É.;-FÙOæW+^‡bäd5ewc¶_Z~RLI>©2®%ðµ Hûóìß»ÑdÅ>º‚°c¨ ¢š(›Âšjœ µ¥(­I¶êÀÑÌÂÙzç±õvm ¼-:REOPW¼]BbÊdGeµc`•Z6S&J•?º3Ô&#ï ƒü*î-àÔÒfÆ#»F±©€¢äE›±š+œªŸ¥i¬gµç¿´ËØ9æhôÓ/2”,9`DON¨V@]óaªdWeöc`2[üSK£@å4(rH Þýïuá ÔƒÇ!¼²±©£7žf› šç›5Ÿz¤š«o´Ì¾|ÊB×ÛäójÍÝS+è7[CqMõU¼\¡aŒdneBd aá[ØTLÌA+6q)ß¾ UÿîðÖâUÕ±È,½³dª…£…ž~›š›ªž¼£­ªX³’½$ÉÓÕ\ãzñåÿPqÿ)³6LBŽLBU=\Ya~d™e¥d§a¯\×UAMC–7ó*qUêyòNä³ÖíÉ?¾æ³«¤Æž„›Jš!›žß¢Ÿ©²4¼¨Ç@Ô¼áÕïCþº ï˜(q55A¦KTÃ[a}dÕeeYb—]ðV…NƒD9,“ôÕåØ0ËV¿Ì´Ç«u¤þž~›š¢šIð¡¨Ô°ÅºÆŸÒà&î™ü j3'24#@ÇJèSV[ì`Šd f¤ecŒ^XÔOõE«:1.Å °9«õSçyÙfÌ_À¢µe¬Ù¤%Ÿh›µ™š‚œö W§ƒ¯Q¹ÄÑhÞ~ìùú õß%3#?ûISSüZÍ`¨dyf7fãc‰_>Y%QfG5<Ê/f"PÐ1÷¿èÄÚŠÍVÁe¶ò¬-¥?ŸG›X™~™¹›ûŸ0¦7®æ· ÃpÏÐÜæêkù“$ê15>>IËR«Zµ`ÊdÕfÉf¨d}`]ZiRÈH¬=P1ô#ÝT£øêÿÛŸÎ?·x­}¥XŸ(›™ó˜üšŸ¥þ¬¶¡ÁõÍLÛdéñ÷©?g#Ø0L=ƒHBRVZ–`ád!gIgYe\af[•SJ ?Â2o%YÉ úlë7ݶÏ/Ã㷮᥇Ÿ"›È˜†˜]šCž$¤â«VµLÀÌÚÙíç}ö?å%"´/L<«G–QÚYL`Ëd>g™gÜebC\˜T7KP@4Ø&Ê< yûÎì†ÞëÐEÄÕ¸Ö®|¦óŸ\›Ð˜[˜ÿ™µi£þªK´ ¿GËØ„æ õÎ|É m.;F®PY»_idggfubÙ\\U%LcAM5#(*© íü@îïßFҋź߯_§« æ›(™˜ð™rô¢Wªw³#¾%Ê=×(åóSüLù,¼9SEƒOXÞ^»c’fVgfšb5]íUçLRBe6_)„ lþÇïwáÆÓûÆX»±u¨˜¡£œ³™Õ˜šZ¤¢Ò©À²>½É ÖÖã5òÛ{Ë+Q8ÿCLNWó]ýbfýfÝe­b~]jV•M.Ck7Š*ÌyÜÿAñóâ<ÕcÈ«¼R²Œ©‡¢gGš8™>šSg¢b©²m¼ÈéÔ—âÝðpÿQ *è6¨B MâUú\/beef¢e§b­]ÌV)NòC[8 +ÊB³òjä±ÖÏɾ–³²ªˆ£?žòš²™ƒšcC¢ ©’±°»1ÇØÓdáï þ’ ב(w5FAÃK·Tò[Oa´dfWe’bÎ]#WµN°DF9´,;!¯/ôíå4ØJËr¿é´æ«˜¤%Ÿ¨›4šÏšx¢­¨ÿ°êº<ƸÒà)îü Eþ&í3Í?cJvSØZb`øc‰e ebö]‡WRO‚EJ:ä-’ ˜=Îõ”çÚÙæÌüÀX¶4­¾¥ iœ¼š›ˆñ¡A¨X° º)ÅvÑ´ÞžììúT ŠE%?24>åHR©Yf_4ce¿dub-^þWPpFn;9/"5ô”÷aé¤Û£Î£Âá·–®ñ¦¡-B›a›‰®¡¼§”¯ ¹òÃÐ$Ýîê$ù|­m#v0ƒF2j%Ͷ lû9íhß@ÒÆøºN±=©î¢ž œ›6Ï U¦«­¬¶(Áë̵ÙFçWõŸÕ¯ã,09UDNFVµ\DaÜcndøb_ZãRýI˜?è3-'¦š Qýï3áïÓÇS¼u²*ª›£êž0œ{›Ïœ& l¥ˆ¬Uµ¥¿CËò×påzóÅõI+½7C MsU"\ô`Ðc¦dsc<`[T\KA‘5í(tl ÿÕðÙâtÕêÈ~½k³äª¤"Ÿ&œ0›Dœ\Ÿj¤S«ó³¾ŸÉ:Ö®ã·ñ \eÜ){6ÿA-LÑT¿[Ð`ëce da\GUºLŸB*7–*%ÃfòOäÆÖÊw¾/´n«d¤5Ÿý›Ê𤛇žd£"ªž²«¼ȤÔâ ð~þå ¥(l5A€K[T[Ë` dme­dáa]nVNDŸ8,§˜3ÁóŽåä× Ë@¿Ç´Ó«•¤0ŸÂ›\š›»o¢ ©g±]»¹Æ?Ó­à¾î+ý¦ æ '4j@ùJTZ[Ö`\dÙeEe¢b^uW$O7Eâ9_-ñÜjäô˜æÐØÒËã¿@µ ¬µ¤#Ÿ‡›ö™wšš¡¨]°Aº‘ÅÒ~ß–íüœ óÉ&Ö3×?ŒJ¾S>[ä`“d7fÈeHcÄ^TXP¬ISàZÉ`¼d£ftf2dæ_¨Y˜QßG²I¤RƒZŒ`Ÿd§fšfxdK`+Z6R•H|=#1Ë#¹6ø êüÛ¨ÎTÂ@·¦­¸¥ŸŸ{›a™\™l›‡Ÿ—¥|­·ÂiιÛÅéEøíp„#à0>=]HRZ-`cd‘f©f­d¥`¨ZÔRRIS>2Ë$ÆJ¤ùëݤÏ=øZ®L¦ Å›„™V™=›0Ÿ¥Ù¬J¶9Ánͩڦè÷ÀEb"Ì/=IbRýYÅ_cqe7eðb¨^vXyPÜFÏ;/T"j¤÷]é‹ÛwÎd·4®€¦ §œµšÐš÷œ ¡4§¯˜¸Ã»ÏäÜÂê ù}Å#»0Ý<ÂG4QY_c$e)e"c_#Y_QöG=þ0æ#Ðcùë=ÝÐäÃì¸d¯~§c¡3›ÞšÅœ¯ ‡¦.®}·DÂKÎSÛéU÷¾ í! /^;iFPX<^‰bØdeUcŠ_ÐYERI_>k2s%¸ƒ ûÏìæÞ¨Ñ[Å=ºŠ°r¨!¢¶H›åšŽœ: ×¥G­d¶þÀßÌÉÙyç¨õ \L •-ò9"EëNW‰]bde•c`‡Z1S-J¨?Ø3ý&W- Êüwîà+Ó¿Æ{»›±Q©È¢#žy›×šCœ³Ÿ¥R¬>µ®¿lË;Ø×åûó^µµ,’8êCáMEVê\­avd7eêc˜`Q[0T\KAS5’(þß |þ!ðâªÔȱ¼¢²#ªb£€ž˜›¸šå›ŸD¤J«´N¾éÉÖ(äDò¦“*27´BÛLuUS\Ta[d[eNd9a+\@U›LiBß68*¶ž;×ñ»ã2ÖÉ꽪³õªø£Ùž°›š}›sžc£2ª¿²Ü¼UÈïÔhâ{ðÞþH m)È5tAÎKŸTº[ú`Cd…e¹dãa]]VêMãC|8ï+q ŸópåÊ×õÊ2¿¿´Ñ«˜¤7ŸÍ›iš›É|¢©m±^»³Æ1Ó—à îýw ¯c'J4#@°JºS[“`d¥ee‡bô]zW:O`E:¯-S Oíuõ4çsÙzÌ‹À嵿¬H¥¦Ÿø›Qš¸š+Ÿ¡ü§!°ä¹ÅsÑÄÞÂì$ûŸ é·%Â2Æ>„IÇR\Z`íc·eqecÊ^ŠX€PÔF¹;h/!"*ÊK÷úèÛÎêÁ·¶­¦! 1œEšišœœÑ ô¦ä®x¸€ÃÁÏüÜíêKùÍ& $81e=THÍQY_®cºe·e¥c_‰Y³Q6HB=1á#÷›ù·êÆÜŠÏJÃD¸²®Æ¦§ wœKš.š!œ ¦¿­%·Â'ÎKÛ.é‡÷ rm"·/ <$GÏPÖX_`c«eçed7`iZÆRvI©>—2~%£N Èú]ìXÞÑžÄo¹­¯Œ§6¡Ìœcš šÂ›Ÿ5¥À¬úµµÀ¸ÌÅÙ˜çêõpßí P.Â:FÛOXƒ^cŒefedÀ`%[±S‹Jâ?î3ì& Ò LüÙíÄßVÒÕÅ‚º˜°I¨Â¡$†šø™z›ŸŠ¤è«û´“¿yËpØ4æ~ô{–-œ9þDûN^Wû]±bfe f¢d-a¿[uTuKí@5'(j$ Ÿý&ïá„ÓêÆy»k±ö¨D¢y®šð™E›¥žþ£5«$´¾jÊM×åEóÊElõ+š8D5N¼V]`b@efÒd†a@\U+´ŸòhäÀÖîÉ3¾Í³ñªÏ£‰ž=›û™Ê𦀢>©¾±Ô»LÇëÓnáïþŠ Ì„(j5;A»K²Tó[WaÃd%fue·bù]UWëNèD9ì,pP×Nôæ:ØBËZ¿Á´®«P¤ÍžA›À™Pšðœ‘¡¨o°_º¸Å?Ò´ßÐíKüÚ 1'4@ÀJîSj[ a¶dWfæedcÞ^mX2PVF;“.&! ‘ýõç»ÙžÌŒÀõz¬â¤"ŸX›˜™ë™Oœ¸ §4¯û¸3Ä¡ÐÞì•ú- –…%±2×>¸ISÎZ«`“dqfÔ2¢%­= úìüÝÐÄÚ¸ ¯â¦‡ œ¶™c™%›óž¸¤W¬¨µ{À˜ÌÀÙ®çöºAd!Ú.];«F‹PÉX9_»c8f¢f÷d@a[TÅJ@ò3Õ&î… æû]í4ßµÑ'Å˹ۯ‹§¡oœÝ™]™òš“ž/¤§«Ö´Š¿Ë¡Øæåôƒ< Â-[:ÄEÄO$X»^fc f¢f"e”a \¦TˆKâ@ë4á'¨ ý~îLà¿ÒƧºš°)¨¡Ãœ ša™ÎšHž¾£«"´º¾¥Ê¦×xåÔóoý3Ç,r9óD OWF^cáeœfAeÙat\/U0L¤AÄ5Ì(¨ þïFá¬ÓøÆm»F±¹¨ñ¡4šh™±šž\£’ª„³¾ÙÉÈÖŽäâòz Hè+£89DkNWÝ]Ìbºe—f^ebÒ\«UÆLSB†6Ÿ)ߎ ÷þeð$â~ԻǼݱ5©P¢RUšh™šÈþ¢ªï²X½ÉüÕ·ãò›/t +ì7•CßM”V‡]•b¢ežf†e]b6]*V^MCE7l*µjÓÿ=ñôâAÕmȹ¼c²¡©Ÿ¢‚ešX™ašz“¢‘©Q²¥¼WÈ*ÕÜâ%ñ¼ÿT¢\*97øB[M+V<]ib–e´f»e²b¨]¸VN»C8F+˜Q¹òËã Ö#ÉY½é² ªé¢¬mš?™&š¢û¨¢±à»€ÇEÔïá4ðÌþj ÃŒ)}6SBÑLÀUñ\@beÑfüec*^WW¾NŒDõ87,’O¶ó¶ääÖèɾx³yª6£Ôqš™ß™´œŒ¡O¨Ú°»ŒÆDÓãà%ï¾ýd É£(«5œA9LJU¡\beøfJf‰cÄ^X—O~Eü9M-³sÙ0ôÄåß×ËÊʾ´øª£žsšó˜Š™5œç †§ð¯ú¹pÅÒ«ßèíƒü0 ¤“'µ4Å@†K¿T@\ãaŠe"g£fdt_êX’P˜F/;’.!Ê/}õçÙ×˵¿à´‘«ø£<žzšÈ˜-™¨›+ Ÿ¦ã®Ì¸'ĹÐ@ÞvìûÉ LR&’3Æ?°JTÊ[¢aeMgg¥d<`ßY°QÚG< 0Š"W»÷tèbÚÍÊÀɵI¬{¤‡žŒšŸ˜Ê˜ ›ZŸ¥´­w·±Â*Ï ÜÎêkù)¾Ý$>2š>²IMS8[JadeqgegBeaêZëR?I>«1?${¹øêðÛ~Î Âݶ'­¥íž³š…˜p˜sš„ž¤t¬ ¶ Á{ÍÝÚÿè™÷_<#¾0D=H^R„ZÕ`1e€g·gÔeâaõ[*T¬Jª?^3&ìT Œúßë›ÝÐnà ¸!®Ý¥lŸïš~˜&˜è™º‹£:«¡´¿ËËÙ*çÀõ‹?!3/á;ZG`QÂYR`ïdgûgZf¦bó\^UL4A5É'»' ZüŸíCßÑÎÄ>¹¯Ÿ¦ðŸ3›˜ç—h™þœ•¢ªI³¾,Ê`×gåøóÈŠñ²-‡:-FgPYÌ_§dyg2hÏfVcÛ]xVUM¡B”6k)kÜ þDïÓàÓÆdº°`§z ‚›”˜¾—™aœÃ¡ ©²»¼ºÈÖÕÎãXò)ôlG,<9 EpO:X<_Pd[gOh&gæc ^oWyNìCþ7ï*{«ÿÝð]âvÔqÇ‘»±0¨¡ã›¹˜§—±˜Ô›ý ¨ò°j»FÇHÔ-â­ð|ÿNÖÉ*Þ7ÑCeNcWœ^êc3gdhxgtdg_kX¥OAEw9‚,§,^ˆòøãùÕÓÈ̼!² ©´¡Hœá˜—]˜C›3 §Ã¯ºÊű҄àùîÇý¡ :E){6—BZM‹Vý]‡c g}hÏge3`mYÖPFõ:.R á6ô•å|×6ʾ,³à©S¢«œ™w—˜°šhŸ¦“®¸¸OÄÑÛÞGíüö ŸÄ'5^AOL´U]]"cåf’h"h•eù`gZÿQïGi<©/ò!‹¿Ùõ(çøØ‘Ë;¿4´¶ªò¢1™f—¹—*šªž$¥t­r·çšÏHݪëvú` T&Ê33@OKäTÂ\¾b»f¢hkhf¯aN[S(IÂ=1u#L_÷ŸèXÚÔÌYÀ(µ{«…£oW™T—q—¬™úD¤k¬C¶›Á6ÎÔÛ.êúøê²%–2"?gJ*T8\hb™f¶h´h’f\b(\TMJ?s2Ü$†»Çøøé›ÛûÍ^Á¶.¬¤Àu™?—(—2™Qp£p«'µbÀéÌxÚËè–÷ŽcÊ#x1%>I|S¸[b{fÊhùhgÿbõ\UaK2@·3.&à ú>ëÎÜÏWÂÛ¶Ù¬ˆ¤ž–™/—è–Øµœ«¢†ª´=¿®Ë/ÙyçCö@"œ"b0-=»HÏR6[ÃaUfÓh2ing’c°]èUbLPAê4q',c eû~ìýÝ,ÐSô·­¥ožÇ™1—»–g˜-œú¡®©#³'¾Êð×/æõôôÞg!B/(<ÖGRZVafÂhPi»g dU^´VRM^B6­(u´ ¶üÉí;ßWÑfΏ`®¾¥ðžšV—°–-˜Å›e¡ð¨?²"½_ɏֿä¢óŠ .;ÎF(QÜY¿`«e‡hEiàg`dØ^cW)NZC-7â)¿ þ'ï’à¡Ò›ÅŹ[¯”¦žŸ›š§—Ñ–˜‚›ò O¨r±-¼Hȃ՛ãEò6!·­,¼9žEPðXû_e hißg“d>_úWïNJDC8+p†ÿ ð âÔøÆ »ƒ°˜§x H›#˜—.˜^›˜ À§²°?»0ÇHÔAâÔðµÿ—-++H8AD×NÔW _Qdg¶h½gªd_XªO7E]9Z,rí:ò¦ã¦Õ‚È~¼Ù±Ê¨€¡ œÆ˜„—_˜T›R @§û¯SºÆÓ×àMïþï €‚)­6»BnMVð]icÞf=h€g«dÌ_ýX`P#F|:¥-ã|¼îó_å[×+ʾP³ª¥¢‚™˜¢˜W› Æ¦D¯e¹òıÑ`ß·ílü2 ¾Ä'û4AðK7UÄ\pbfºgR$©1þ=I«R—Z­`ÎdäfåfÐd±`œZ²RI >·1b$QÍ ù—ê~Üϸ’·ä­ß¥®Ÿq›<™™›Ÿ ¥Û¬Y¶UÁ–ÍÜÚãèa÷ ˜¹"%0˜<ÑG•Q²Yÿ_Yd«fèfe,aP[›S4JL?3ã%ål Áú2ì Þ’ÐÄĸꮴ¦N ×›i™™Éš‘žS¤ð«AµÀ6ÌcÙYçÎõx fcó]äVNªCä7û*3Ó&yñãJÕ\ÈŽ¼²D©+¢ùœÉ™¬˜§™¶œÈ¡Ã¨ƒ±Ú»“ÇqÔ1âŒð7ÿæ L *7ôBtMaVŽ]ÖbfPgmfucz^”WçN¢Dø8&,ptÅòZäÖ|É”½³ªÃ¢fš»˜†™eœI¡¨¯°âº{Æ>Óêà6ïÚýˆ õÖ(ã5ØAxLŠUá\VbÌe3g‚f½có^$z1µ=¯H/RZ`d!ffÿcÞ_ÍYêQ`H^=1â#ì…øøê˜ÜYÏø®˜¦ Vœ2ššœ ¦Ó­A·(ÂOÎwÛ[é´÷7™"Ò/<-GÌPÈXø^;c{e¬eÏcí_ZrR!IU>G24%b úAìKÞÑ´Ä–¹æ¯Õ§Ž¡1Õš…šBœ ¹¥A­u¶&ÁÍÚÛçö‰á× ".}:¨EjOWð]hbãdRe´c`~ZSþIh?‰3 &ï¾ Uüî à¸ÒRÆ»B±©‹¢ö]›ÎšKœÌŸ@¥Š¬…µÀÉËžØ@æfôÉp,ã8.DNnV]¶andeÃcb`[âSK @î4*(–y þÆïÆácÔâÇ„¼„²ªc£’ž¹›èš#œcŸ˜¤§«k´¶¾TÊ×ä§òYaÐ*a7ÓBëLuUD\5a.dedå`Î[ÛT1LûAo6É)K9Ýÿ‚ñrãõÕRÉʽ™³ôª¤÷žÞ›ÌšÆ›ÉžÃ£›ª.³P½ÌÈfÕÝâìðJÿ« ÇS)6§AñK²T¼[ë`#dTexd“a´\ôUuMeC÷7f+ôæ„óóäW×ÊØ¾u´˜«q¤%ŸÏ›€š@› žÒ¢|©è±é»LÇÖÓEáUï¼ý/ e(ï4»@8K.Tq[Ù`Ldµee]b¬]W¹NÄDi9ä,ubôuô2æt؂ˠ¿ µú«ž¤Ÿ› š›š8Ö¡]¨¬°—ºëÅnÒÞßöímü÷ I'4@ÂJëS`[û`žd8f¾e4c¦^-XéOFµ:3.À ¢"Œõ+çKÙ2Ì&Àdµ&¬š¤éž1›ƒ™ë™dœä R§¯l¹¹Ä;ѲÞÖì_û p`&‹3ª?JÑSq[5aeÀfhfýc‰_$YðPGÊ;F/Ì!¢cöèçèÙ®Ì~À˜µ3¬‚¤­žÑš™L™¬› r¦¡®w¸ÂÃGÐÅÝõëúE ÌÙ%!3`?UJÉSŠ[naXe4göf¡d@`ëYÁQîG¤<0ž"hÈ ÷xèaÚ ÍÁÀ¾µ=¬p¤~ž‡š ˜Ó˜›wŸÆ¥ë­º·Ã‰Ï ÝDëéù¯Gg%Å2?*J¶S[aegXgeÅ`}Z]R’HL=Ç0D# a—÷øèÑÚkÍ Áôµ^¬z¤ržfšj˜‰˜Ãš ŸK¥d­+·mÂïÎqÜ«êUù"Åò$^2Å>åI…Ss[…a›e¡gŒg]eaæZÕRIÙ=[1Ü#£ù*ø…éTÛâÍuÁL¶£¬¬¤žnš\˜f˜Šš¾žì¤ó¬«¶ßÁWÎÑÛê¯ø}$Y$Ð1D>tI&S([Paeg¡gŠecaB[GSšIp>2$\¸ëøBê ÜÎÂܶ­¥Üž šr˜_˜fš}ž¤|¬¶9ÁÍÛ2éÒ÷E~#ÿ0=ÃHŒR§Zë`8ewgœg¨e£a£[ÈS9J)?Ñ2r%P¶îùFë Ý„Ïú­·×­­¥WŸøš¥˜k˜Jš:ž%¤í«iµhÀ²ÌÚè±öv\"é/|<ÕGºQöY_`Ôd=ggÇeïa\iTK@Û3•&†ù 8û‘ìNÞºÐĵ¸¿®o¦ðŸd›á˜v˜#šáœ£6«ˆ´a¿‰ËÁØÅæKõ ±ù •.@;·F¿P%Y¼_cdg‰gøeVb·\6UüK8A"5ø'€ ÅüîÎß'ÒoÅæ¹È¯K§™ Ö›™t˜ç™kî¢Sªt³#¾&ÊA×/å¨óac-Ü9xE­ODX_òcÍf”gAfÜbw].V%MBœ6)¬9 þÑïtá¶ÓÝÆ,»à°-¨B¡BœF™_˜™Õœ¢I©7²¹¼˜È–ÕoãÝñ•J¯{+f8-D“NbWl^cªf´g¤f€cX^HWsND;8L+{Z ñ1ãVÕYÈ{¼û±©å¡£œd™8˜&™)œ1¡%¨à°5»ïÆÑÓ˜áýïµþt í×)ç6ÜBvMVÈ]+cfÛgg,dC_lXËO‹Eä9-Rò:uóòäúÖ×Éͽ³ó©Œ¢†™˜Á˜ƒ›N  §’¯»¹QÅÒÌß(îàü© 5;(o5A\LœU!]ÄbffögkgÇd`yY QôFo;·. !´ü/õšæˆØCË¿,´Ñª0£q°™˜o˜õš‡Ÿ¦g®g¸ÛÇÐ)Þ{ì2û Ÿ¼&4W@PKÂT}\Xb6fh°gFeÏ`aZR2HÏ<00˜"K–Ãö!èúÙ˜ÌAÀ5µ¬«Ú£å환<˜Œšéž?¥l­D·—Â'϶Üûê­ù€&T%Á2&?CJßSÇ[ÔaäeägÉg”eOa[ýR8Iø=w1õ#¸ :øé\ÛåÍrÁD¶•¬–¤qžGš,˜,˜Fšqž•¤”¬C¶rÁäÍ[Ûé9ø ¸õ#w1ù=9IþR[Qa–eÌgçgèe×aË[ãSGJ*?Å2Y%+„±ùþê¸Ü)Ï—ÂD·j­<¥åž…š4˜ý—â™ÙÍ£ «(µ5ÀÌðÙè¾ö”M":0Ü &§Ú¯.ºìÅ×Ò«à"ïïýÇ \b)‘6¥B^M…Vë]jcåfIh‘g¿dâ_YyP€I÷RÀZ±`¬dœfxf@dÿ_ÍYÉQHü<Ÿ0F#6ºø¦é¥ÛbÎ"Â#·ž­Æ¥ÂŸ²›ª™¶™Ô›ûŸ¦ý­‘·œÂåÎ-Ü-êžø5¦¦#ì04=>HÐQºYÑ_øcf%f!d`ZFRËHÖ=¡1k$xùëÝÈÏwÃa¸¿®Ã¦– Wœšö™ß›ÏŸ²¥i­Ì¶«ÁÌÍòÚ×è5÷¿+."€/Û;ÿF³PÄX _`c´eùe-dZ`“ZöR¬Iã>Õ2¿%æ‘ ûŸì˜Þ>ÑÖÄ¢¹Ú¯²§T¡áœpšš¼›qŸ¥¬Îµ€À{ÌÙOçœõš ÿ-u:»E™OÙWS^ãbseõegdÐ`D[ßSÇJ+@C4L'‰B ÁüPî;àËÒEÆêºô°™¨¢R¡šþ™k›âžO¤˜«–´¿ðÊØ×‘åÒóSÈçe,ý8oD~N÷V­]~bQefÍdxa*\ÿTL­Aë5)b% ¤þ)ðârÔÆÇ<¼²z©¢¢®·šÌ™óš%žR£_ª(³~½.ÉúÕŸãØñ[ܯ*q7C\MV]'bCeTfReDb9]KVžM^CÂ7+h3¯'òæã6Ö^É¡½;³bªD£žÃšŒ™hšR;¢ ©š±Á»JÇøÓ‹á¼ïBþÑ à(Î5¦A*L%Uf\Êa3e‘fÛecP^¢W.OEª9 -UÎ8ôÞå ØË¿t´X«ó£jžÚšV™æ™†œ)¡¸§°ºfÅ÷Ñvßží&ü ' '#4.@îJ)T²[_ae¾fTfØcW_èX¬PÏF‚;/Œ!iá?öÐçÝÙ°ÌŒÀ°µU¬¬¤Ûž›2™w™Ð›0 €¦ ®f¸žÃÐ{ݘë úÆ?A%2¼>³I+SöZé`ædØf¶f€d@`Z R\H7=Õ0u#^×-ø«éœÛJÎùÁê¶U­l¥XŸ9›$™%™:›YŸn¥X­î¶ÿÁRΦ۷é<øér#ï0T={H+R1Zc`¢d×føfea [:SºI½>z21%'¥÷ùgëBÝÑÏZøU®4¦åŸˆ›3™ô˜Ëš¯ž‹¤B¬«µ•ÀÉÌÚè†ö6Êø!v/þ;OG.QiYÓ_Md¾fgae™a×[8TåJ @é3¸&½C “ûúìÃÞ9Ñ¡Ä>¹I¯÷¦s Þ›Q™Ø˜wš$žÍ£T«“´Y¿n˔؇æþô®KŠ .Æ:˜@™Vœr¡x¨E±ª»rÇ`Ô0âœðWÿŒn*u7[CåMÚV ^XcŸfÒgëfícé^øW?OëD29O,‡ e£ò'ä;Ö(É1½•²Š©@¢Ýœ{™.˜û˜ß›Ê ¢§F°†º/ÆÓÂà"ïÚýœ )/65BãLVc]ßb[fÃggIdy_ºX.PFm:¨-÷ î-ôªå°×‡Ês¾´³ª £tÝ™Y˜î˜™›M ñ¦c¯w¹øÄ«ÑMß™íDü ††'¸4Ù@©KðT\.bßeg g|dæ__YQG£;/q!2ÖõQçMÙÌ俵¨«¤9žkš¬˜™r›êŸS¦®m¸ÀÃJÐÌÝþë˜úM ÒÚ%3Y?JJ»Sy[]aHe&gífŸdG`ýYàQHáë1ž$”mùçêÏÜmÏÃÝ·)®¦äŸœ›]™1™›Ÿø¤¹¬*¶ÁN͉چèýö¢*I"¶/,IvRÌ7Ùùæ<õ·) -:OE2OzWþ]šb7eÇeGdÀ`C[íSãJV@{4'ט ý±îŸà/Ó§ÆH»N±ë¨L¢’ך(š‰›óžT¤«ƒ´ü¾Çʧ×Wå’ó€œ,³8'D9N¶Vr]Jb$eòe¯dba\øTLµAø5$)zA ÃþKð$â˜ÔìÇb¼7²Ÿ©Ç¢ÑÙší™›Džo£|ªC³™½HÉÖ¸ãðñqñ$À*7CbMV ]b2eJ‹S`[[a]ePg*gíd£`dZORŽHT=Ü0f#8›Ü÷Gé(ÛÉÍnÁW¶À¬Ø¤Êžµš®˜À˜êš!ŸO¥T­·6Â¥ÎÜ?êÛøœ5\$Æ1->RIúRóZaÚ1p$I®ëøMêÜ«Î7·M­B¥ŸÓš¥˜˜“š¦ž²¤™¬1¶IÁ¦Í Û-éÇ÷Œ/d#â0b=£HkRˆZÎ`e_g‰g˜e˜až[ÇS=J1?Ý2%bÉú[ëÝ—Ï Ã»·ã­´¥[Ÿ÷š ˜b˜>š*ž¤×«RµPÀšÌîÙèžöeS"ä/}<ÛGÅQZs`ìdYg®gèeb>\‹T"K2@ö3«&˜ ?û‘ìHޮРĜ¸¢®M¦ËŸ<›·˜K˜ù™¸v£«j´H¿v˵ØÀæMõÁ!².a;ÝFéPPYé_d,g±gfvbÑ\JU L>A 5ï'ïi ¨üøí§ßýÑBʹœ¯ §r ³›ý˜]˜×™cî¢\ª†³<¾GÊh×\åÚó–D˜I- :¥EÓObX'_ÿcÏfŠg-f½bN]ûUêLJBS6C)]ê 4þ‰ï2á} »Ê°&¨J¡Zœn™–˜×™){¢²©©²0½ÉÖåãLòú£úµ+Œ8?DŽNFW:^DcLfAgfìb·]VÃMVCŒ7¢*ÜÜÿ8ñáâ"ÕAÈ‚¼"²U©K¢&šï˜ò™¢©Õ±'¼ÙÇ®Ôbâ¯ðKÿê A*ì6·B(M V+]jbªeÛf÷ec ^0WNWD¾8ÿ+]Œóòžä×Öçɾ³›ªb£ ž®š_™$šùœÐ¡¨±/»°ÆYÓéàï¢ý5 ‰R(I5,A¼KÃT\„aûdgfÀe cQ^°WIOFEÝ9I-ʧ)›ôIæ}Ø~Ë¿ñ´×«r¤éžV›Ï™Yšòœ¡¨^°GºšÅ҉ߟíüž ï¿&Å3¾?mJ™S[´``df”ec˜^.XûO*Fí:~.!¦ öÏçûÙìÌçÀ*¶ì¬]¥¤Ÿà›#švšÙœ=¡Ž§©¯e¹ÄíÐ?Þ@ì¨ú+ ~W%n2>LIR@Z`ìcÂeˆe?cô^»X¶PGö;¦/`"f‚÷,éLÛ+Î Â1·Î­¦0 <œNšoš œÔ ÷¦ç®}¸†ÃÉÏÝøêXùÛ5$G1s=`HÕQ¢Y_¨c®e¤eŠcl_^Y€QûG=È0“#¤FÁøaêrÜ;Ïø{®™¦ˆ gœJš=šAœK F¦®‰·x¦ÎÕÛÁé ø© #M0—<¦GBQ8Y__—cËeíeÿc ` ZcRûH>ï1Å$Úyëù|ëwÝ%ÐËè¸ø®í¦¯ `œšÝ™·›™Ÿq¥­{¶UÁvÍÚ‡èìö€ù "l/Ø;GÓPõXJ_°cf`f›dÌ`[hSJF?,3&´ û•ìvÞцÄ;¹`¯'§º <œÄ™^™ ›Èž|¤ ¬PµÀ,ÌOÙ:ç¨õKÙ!‰.;yFlP½XB_ØcifæfMe¦a\„TMK@€4a't Xü¿íƒßðÑKÅֹͯc§Å œl™Ö˜Xšêy£éª´Ç¾ÎÊê××åLôÿ£ì-I:ÓEôOwX._øc¼fjgf„b ]«ULçAç5Ð(ãk ²ýï­àøÒ,ÆŒºS°¸§æ œ$™\˜­™x¢Ã©Ï²k½aÉsÖ]äØò—N²v,U9 E[OXû^úcófÖgžfRc^ËVÐMBCV7K*dê &ÿgðøá$Ô3Çi»±5¨/¡œ™˜ ™SœŒ¡®¨–±¼õÇ÷ÔÙâSñàY:+<8D—N}W^ÒcghgÿcÞ^ÒWýND½8Ä+èq©Þñ[ãmÕ\Èk¼Ø±Û¨¡¡Qœ™Ñ—¹˜¸›¿ µ§u°Ñº•Æ‚ÓWáËï“þb ìæ)7 C±MÅV^ƒcéf:hng‰d›_½XPÉE:5-iú4aóÐäÍ֞Ɋ½Î²£©8¢³œ1™Å—u˜>› ×¦k¯¡¹DÅÒÙßAîýÙ o|(·5ÜAªLëUo] cªf3hžgñd8`‹YQîF];˜.â ÀìôRæ=ØöÊþⳌªñ¢:‚™Þ—W˜éšˆŸ¦€®‹¸ Ä¿ÐiÞÂì~ûQ ï '\4ž@KúT«\|bMf h®g7e³`:ZìQõGŠ<ä/F"ö?möÌçªÙNÌÿ¿ü´~«·£Ïä™ ˜M˜©šŸt¥«­Œ·æÂ|ÏÝVëúÙ|¦% 3h?|JTë[ëaïeãg»gye)aáZÁRôH¬=$1ž#_±à÷9é Û˜Í-Á¶c¬o¤Wž9š+˜8˜_š–žÆ¤Ð¬‰¶¿Á8δÛìé–øgJ$Æ1@>wI1S;[la£eÌgÚgÍe¯a—[¤SÿIÙ>n2ý$Ë$Rù¢êaÜÙÎP·8­¥Íž{š8˜˜šž¤æ«xµÀìÌSÚ~è#÷öªó"†0=yH\R“Zõ``e¼gÿg&fœ¡Ó§]°ƒºÆÌÒpà¸îYý w](r5qAL=U£\)b±e*gfÛc#_XPFˆ:ß-I qÅôTæhØIË=¿€´L«Ï£0žšø˜y™œª 5§‹¯ƒ¹èÄ€Ñß;íÐûz íÞ&4@ëJ3TÅ[|a8eçf€fd„_YÓPñFž;/›!qã;öÇçÐÙ ÌzÀŸµF¬Ÿ¤Óžÿš8™†™è›Q «¦Ô®£¸äÃ]ÐÍÝîëwú “%Ç2ø>áIKS[æ`Ïd­fwf,dÙ_•YQÃG’<&0Á"¨#÷éÛÆÍ‹Á”¶­O¥[Ÿ]›i™Š™À›þŸ.¦1®Ý·ÿÂ^ϺÜÌêMùðjp$¸1ý=IŠRfZl`}d„fwfVd+` ZRHj=1Ã#·:—øêÜÀÎpÂ`·É­Þ¥ÇŸ£›‰™ƒ™’›«Ÿ¸¥š­)·1Â{ÎÆÛÎéIøìk{#Ò0,=HHíQçY`Ddof‡f‰d‚`„Z±R/I1>ð1«$¨/‹ù ëóÜ“Ï/øU®K¦ Î›‘™h™U›MŸ;¥­w¶kÁ¤ÍãÚãè\÷ˆ¤" 0{<°GpQ‰YÑ_'duf¯fÒdê` [QSçIý>Ë2‘%“ súèëÅÝSÐÚØ¸É® ¦G à›™6™›Úž«¤W¬¶µ—ÀÁÌ÷Ùòçjö¥Ï!K/Ð;GýP6Y _dŠfçf-eea£[T±JÚ?·3‡&Ž iûÓì¡ÞÑŠÄ-¹@¯ö¦z ï›k™ü˜¤š[ž¤ž«ä´±¿ÌË÷Øìæeõ¯é x.;F~PÚXh_dfgŠeåaC\ÂT‰KÈ@µ4‘'Ÿ' vüÖí•ßüÑRÅØ¹Ê¯]§¼  œ^™È˜JšÜl£Üª´½¾ÅÊâ×ÐåFôùœåˆ-?:ÇEåOeX_àc fLgßeabä\…UjLÂAÄ5¯(ÇS  ýùîªàýÒ:Æ£ºu°ã§¡>œh™§˜þ™gÏ¢ª&³À½±É¼ÖžäóÁkÀu,D9éD)OÍWª^œcˆf`g fÍbz]AVIM¿BÛ6Û)– äþ8ðÞá ÔGÇ“»C±Œ¨š¡“œ™ ˜È™A¢d©I²Â¼—ÈŒÕ]ãÂñr}B+'8èCHNW^7cRfYgIf&c^óV"N¼C÷7+Iê>‘ñ0ãdÕuȦ¼6²Y©>¢ Ö™¶˜­™·œÄ¡»¨u±È»|ÇUÔâgðÿ¹ ð)è6ÃBCM2Vb]­bøe2gUfdcp^’WîN°D9E,–I¨ÿò™äÂÖÁÉÚ½K³Jª£¤Ašî˜²™ˆœc¡(¨µ°ÝºkÆ$ÓÅàï£ýI ¯Š(“5…A"L5U\b€eìfBf…cÅ^X¤O’E:o-ܤoô æ*ØË¿r´O«ä£VžÄš>™Î™qœ¡ª§°ºjÅÒ„ß°í;üÚ ?!'74>@÷J+Tª[Ma÷d•ff—c _‘XLPgF;.!úwÞõyç•ÙxÌgÀ µ\¬Ê¤ŸO›˜™õ™bœÕ 5§b¯0¹nÄàÐGÞ\ìÖúk ζ%Ù2ô>ÈISÃZ‘`jd:føe¥cM_YòP:G<°/Y"PÞM÷ëèÛÖͱÁ϶i­°¥ËŸÚ›ñ™šQœ »¦·®X¸lûÏÝëkù÷YG$x1¨=™HRÞYÙ_ãcçeÚe½c›_‰Y§QH=â0©#·UÍøkêyÜ@Ïøz®—¦„ `œAš1š1œ7 .¦ö­g·PÂyΣۈéâ÷fȾ"ÿ/H42%BñrúìÞËÐvÄU¹¤¯“§L¡ñœ—šJš œÖŸ‘¥!­^¶ÁÍ Úëç3ö®!b.Å:öE½OçWI^Âb;e¨ed^`ÃZQS0J?¤3¯&ñ² =üÚí×ßzÒ ÆÅºç°¤¨%¢òšcšâ›hŸâ¤4¬8µ¿¿’Ëtst_qsoundeffect.cpp000066400000000000000000000260121225012771600357300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/integration/qsoundeffect/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include "qsoundeffect.h" class tst_QSoundEffect : public QObject { Q_OBJECT public: tst_QSoundEffect(QObject* parent=0) : QObject(parent) {} public slots: void init(); void cleanup(); private slots: void initTestCase(); void testSource(); void testLooping(); void testVolume(); void testMuting(); void testPlaying(); void testStatus(); void testDestroyWhilePlaying(); void testDestroyWhileRestartPlaying(); void testSetSourceWhileLoading(); void testSetSourceWhilePlaying(); void testSupportedMimeTypes(); void testCorruptFile(); private: QSoundEffect* sound; QUrl url; // test.wav: pcm_s16le, 48000 Hz, stereo, s16 QUrl url2; // test_tone.wav: pcm_s16le, 44100 Hz, mono QUrl urlCorrupted; // test_corrupted.wav: corrupted }; void tst_QSoundEffect::init() { sound->stop(); sound->setSource(QUrl()); sound->setLoopCount(1); sound->setVolume(1.0); sound->setMuted(false); } void tst_QSoundEffect::cleanup() { } void tst_QSoundEffect::initTestCase() { // Only perform tests if audio device exists QStringList mimeTypes = sound->supportedMimeTypes(); if (mimeTypes.empty()) QSKIP("No audio devices available"); QString testFileName = QStringLiteral("test.wav"); QString fullPath = QFINDTESTDATA(testFileName); QVERIFY2(!fullPath.isEmpty(), qPrintable(QStringLiteral("Unable to locate ") + testFileName)); url = QUrl::fromLocalFile(fullPath); testFileName = QStringLiteral("test_tone.wav"); fullPath = QFINDTESTDATA(testFileName); QVERIFY2(!fullPath.isEmpty(), qPrintable(QStringLiteral("Unable to locate ") + testFileName)); url2 = QUrl::fromLocalFile(fullPath); testFileName = QStringLiteral("test_corrupted.wav"); fullPath = QFINDTESTDATA(testFileName); QVERIFY2(!fullPath.isEmpty(), qPrintable(QStringLiteral("Unable to locate ") + testFileName)); urlCorrupted = QUrl::fromLocalFile(fullPath); sound = new QSoundEffect(this); QVERIFY(sound->source().isEmpty()); QVERIFY(sound->loopCount() == 1); QVERIFY(sound->volume() == 1); QVERIFY(sound->isMuted() == false); } void tst_QSoundEffect::testSource() { QSignalSpy readSignal(sound, SIGNAL(sourceChanged())); sound->setSource(url); sound->setVolume(0.1f); QCOMPARE(sound->source(),url); QCOMPARE(readSignal.count(),1); QTestEventLoop::instance().enterLoop(1); sound->play(); QTest::qWait(3000); } void tst_QSoundEffect::testLooping() { sound->setSource(url); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); QSignalSpy readSignal_Count(sound, SIGNAL(loopCountChanged())); QSignalSpy readSignal_Remaining(sound, SIGNAL(loopsRemainingChanged())); sound->setLoopCount(5); sound->setVolume(0.1f); QCOMPARE(sound->loopCount(),5); QCOMPARE(readSignal_Count.count(),1); sound->play(); // test.wav is about 200ms, wait until it has finished playing 5 times QTestEventLoop::instance().enterLoop(3); QTRY_COMPARE(sound->loopsRemaining(), 0); QCOMPARE(readSignal_Remaining.count(),5); } void tst_QSoundEffect::testVolume() { QSignalSpy readSignal(sound, SIGNAL(volumeChanged())); sound->setVolume(0.5); QCOMPARE(sound->volume(),0.5); QTest::qWait(20); QCOMPARE(readSignal.count(),1); } void tst_QSoundEffect::testMuting() { QSignalSpy readSignal(sound, SIGNAL(mutedChanged())); sound->setMuted(true); QCOMPARE(sound->isMuted(),true); QTest::qWait(20); QCOMPARE(readSignal.count(),1); } void tst_QSoundEffect::testPlaying() { sound->setLoopCount(QSoundEffect::Infinite); sound->setVolume(0.1f); //valid source sound->setSource(url); QTestEventLoop::instance().enterLoop(1); sound->play(); QTestEventLoop::instance().enterLoop(1); QTRY_COMPARE(sound->isPlaying(), true); sound->stop(); //empty source sound->setSource(QUrl()); QTestEventLoop::instance().enterLoop(1); sound->play(); QTestEventLoop::instance().enterLoop(1); QTRY_COMPARE(sound->isPlaying(), false); //invalid source sound->setSource(QUrl((QLatin1String("invalid source")))); QTestEventLoop::instance().enterLoop(1); sound->play(); QTestEventLoop::instance().enterLoop(1); QTRY_COMPARE(sound->isPlaying(), false); sound->setLoopCount(1); // TODO: What if one of the tests fail? } void tst_QSoundEffect::testStatus() { sound->setSource(QUrl()); QCOMPARE(sound->status(), QSoundEffect::Null); //valid source sound->setSource(url); QTestEventLoop::instance().enterLoop(1); QCOMPARE(sound->status(), QSoundEffect::Ready); //empty source sound->setSource(QUrl()); QTestEventLoop::instance().enterLoop(1); QCOMPARE(sound->status(), QSoundEffect::Null); //invalid source sound->setLoopCount(QSoundEffect::Infinite); sound->setSource(QUrl(QLatin1String("invalid source"))); QTestEventLoop::instance().enterLoop(1); QCOMPARE(sound->status(), QSoundEffect::Error); } void tst_QSoundEffect::testDestroyWhilePlaying() { QSoundEffect *instance = new QSoundEffect(); instance->setSource(url); instance->setVolume(0.1f); QTestEventLoop::instance().enterLoop(1); instance->play(); QTest::qWait(500); delete instance; QTestEventLoop::instance().enterLoop(1); } void tst_QSoundEffect::testDestroyWhileRestartPlaying() { QSoundEffect *instance = new QSoundEffect(); instance->setSource(url); instance->setVolume(0.1f); QTestEventLoop::instance().enterLoop(1); instance->play(); QTest::qWait(1000); //restart playing instance->play(); delete instance; QTestEventLoop::instance().enterLoop(1); } void tst_QSoundEffect::testSetSourceWhileLoading() { for (int i = 0; i < 10; i++) { sound->setSource(url); QVERIFY(sound->status() == QSoundEffect::Loading || sound->status() == QSoundEffect::Ready); sound->setSource(url); // set same source again QVERIFY(sound->status() == QSoundEffect::Loading || sound->status() == QSoundEffect::Ready); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); // make sure it switches to ready state sound->play(); QVERIFY(sound->isPlaying()); sound->setSource(QUrl()); QCOMPARE(sound->status(), QSoundEffect::Null); sound->setSource(url2); QVERIFY(sound->status() == QSoundEffect::Loading || sound->status() == QSoundEffect::Ready); sound->setSource(url); // set different source QVERIFY(sound->status() == QSoundEffect::Loading || sound->status() == QSoundEffect::Ready); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); sound->play(); QVERIFY(sound->isPlaying()); sound->stop(); sound->setSource(QUrl()); QCOMPARE(sound->status(), QSoundEffect::Null); } } void tst_QSoundEffect::testSetSourceWhilePlaying() { for (int i = 0; i < 10; i++) { sound->setSource(url); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); sound->play(); QVERIFY(sound->isPlaying()); sound->setSource(url); // set same source again QCOMPARE(sound->status(), QSoundEffect::Ready); QVERIFY(sound->isPlaying()); // playback doesn't stop, URL is the same sound->play(); QVERIFY(sound->isPlaying()); sound->setSource(QUrl()); QCOMPARE(sound->status(), QSoundEffect::Null); sound->setSource(url2); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); sound->play(); QVERIFY(sound->isPlaying()); sound->setSource(url); // set different source QTRY_COMPARE(sound->status(), QSoundEffect::Ready); QVERIFY(!sound->isPlaying()); // playback stops, URL is different sound->play(); QVERIFY(sound->isPlaying()); sound->stop(); sound->setSource(QUrl()); QCOMPARE(sound->status(), QSoundEffect::Null); } } void tst_QSoundEffect::testSupportedMimeTypes() { QStringList mimeTypes = sound->supportedMimeTypes(); QVERIFY(!mimeTypes.empty()); QVERIFY(mimeTypes.indexOf(QLatin1String("audio/wav")) != -1 || mimeTypes.indexOf(QLatin1String("audio/x-wav")) != -1 || mimeTypes.indexOf(QLatin1String("audio/wave")) != -1 || mimeTypes.indexOf(QLatin1String("audio/x-pn-wav")) != -1); } void tst_QSoundEffect::testCorruptFile() { for (int i = 0; i < 10; i++) { QSignalSpy statusSpy(sound, SIGNAL(statusChanged())); sound->setSource(urlCorrupted); QVERIFY(!sound->isPlaying()); QVERIFY(sound->status() == QSoundEffect::Loading || sound->status() == QSoundEffect::Error); QTRY_COMPARE(sound->status(), QSoundEffect::Error); QCOMPARE(statusSpy.count(), 2); sound->play(); QVERIFY(!sound->isPlaying()); sound->setSource(url); QTRY_COMPARE(sound->status(), QSoundEffect::Ready); sound->play(); QVERIFY(sound->isPlaying()); } } QTEST_MAIN(tst_QSoundEffect) #include "tst_qsoundeffect.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/runautotests.py000077500000000000000000000163701225012771600300550ustar00rootroot00000000000000#! /usr/bin/env python ############################################################################# ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the build configuration tools of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################# import sys; import re; import os; import subprocess; import errno; instructions = "This script can be used as follows:\n\ a) if run from tests/auto without any arguments it runs unit tests and then integration tests\n\ b) if run from tests/auto/unit, it runs unit tests\n\ c) if run from tests/auto/integration, it runs integration tests\n\ d) if run from tests/auto with \"unit\" it runs unit tests, and correspondingly for \"integration\"" # Colors red="\033[41;37m"; redfg="\033[31m"; norm="\033[0m"; green="\033[32m"; grey="\033[37m"; yellow="\033[33m"; # Variables curtest = ""; numpasses = [0]; numfails = [0]; numcrashes = 0; numx = [0]; runTests = [] notRunTests = [] # Do not run the tests in these directories. exclusionList = ["qdeclarativevideo", "qmultimedia_common"] # Helper function for replacing stuffs def print_color_string(string, color, match, index): if index > 0: print string[:match.start(index)] + color + string[match.start(index):match.end(index)] + norm + string[match.end(index):], else: print color + string[:-1] + norm # AWK translation awkfoo = [ (re.compile("\*\*\*\*\*\*\*\*\* Start testing of (\S+)"), yellow, 1, curtest), (re.compile("^(PASS) "), green, 1, numpasses), (re.compile("^(FAIL!) "), red, 0, numfails), (re.compile("^(XFAIL) "), redfg, 1, numx), (re.compile("^(XPASS) "), redfg, 1, numx), (re.compile("^(QFATAL) "), red, 0, numx), (re.compile("^(QDEBUG) "), grey, 0, None), (re.compile("^(QWARN) "), yellow, 1, None), (re.compile("\*\*\*\*\*\*\*\*\* Finished testing of (\S+)"), yellow, 1, curtest), ] # # This method runs the test cases, color codes the output from the test cases and adds up the passes, # fails etc. # def resultSummary(arg): try: pp = subprocess.Popen(arg, shell=False,stderr=subprocess.STDOUT,stdout=subprocess.PIPE); p = pp.stdout; try: while True: line = p.readline() if len(line) == 0: break for (re, color, index, var) in awkfoo: m = re.match(line) if m: break if m: print_color_string(line, color, m, index) if isinstance(var, list): var[0] = var[0] + 1; else: var = m.groups(index) else: print line, finally: rc = p.close(); pp.wait(); if pp.returncode < 0: print red + "Error: '%s' exited with signal %d" % (arg, -pp.returncode) + norm numcrashes = numcrashes + 1 except OSError, e: if e.errno == errno.ENOENT: print red + "Test '%s' not found." % arg + norm; else: print red + "Got an exception running '%s': %s " % (arg, e.strerror) + norm numcrashes = numcrashes + 1 # # This method finds the test cases that should be run and runs them. # def runAllTests(test): for filename in os.listdir(test): if(re.search("^q", filename)): #Skip the dir if it is in the exclusion list. exclude = False for dir in exclusionList: if(re.search(dir, filename)): exclude = True if(not(exclude)): #Set path to this if on Windows if(os.name=="nt"): exePath = test+"\\"+filename+"\\debug\\tst_"+filename+".exe" #Set path on OS X if(sys.platform=="darwin"): exePath = test +"/"+filename+"/tst_"+filename if not (os.path.exists(exePath)): exePath = test + "/"+filename+"/tst_"+filename+".app/Contents/MacOS/tst_"+filename #Set path to this if on Unix else: exePath = test +"/"+filename+"/tst_"+filename if(os.path.exists(exePath)): runTests.append(filename) resultSummary(exePath); else: notRunTests.append(filename) arguments = sys.argv[1:] count = len(arguments) # Find the current working directory. cwd = os.getcwd() if(count == 0): if re.search("auto$", cwd): x = 0 runAllTests("unit") runAllTests("integration") elif re.search("unit$", cwd): runAllTests(cwd) elif re.search("integration$", cwd): runAllTests(cwd) else: print "You are running this script from the wrong directory! " + instructions exit() elif(count == 1): if os.path.exists(sys.argv[1]): runAllTests(sys.argv[1]) else: print sys.argv[1] + " test cases do not exist! " + instructions exit() else: print "You have passed too many arguments! " + instructions exit() print "Total of all tests: %d passes, %d failures, %d unexpected, %d badnesses." % (numpasses[0], numfails[0], numx[0], numcrashes); if runTests: print "The following test cases were run: " for testCase in runTests: print testCase else: print "No test cases were run!" if notRunTests: print "The following test cases could not be run: " for testCase in notRunTests: print testCase else: print "All test cases were run." qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/000077500000000000000000000000001225012771600256705ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/multimedia.pro000066400000000000000000000015331225012771600305460ustar00rootroot00000000000000 TEMPLATE = subdirs SUBDIRS += \ qabstractvideobuffer \ qabstractvideosurface \ qaudiorecorder \ qaudioformat \ qaudionamespace \ qcamera \ qcameraimagecapture \ qmediabindableinterface \ qmediacontainercontrol \ qmediacontent \ qmediaobject \ qmediaplayer \ qmediaplaylist \ qmediaplaylistnavigator \ qmediapluginloader \ qmediarecorder \ qmediaresource \ qmediaservice \ qmediaserviceprovider \ qmediatimerange \ qmetadatareadercontrol \ qmetadatawritercontrol \ qradiodata \ qradiotuner \ qvideoencodersettingscontrol \ qvideoframe \ qvideosurfaceformat \ qwavedecoder \ qaudiobuffer \ qdeclarativeaudio \ qaudiodecoder \ qaudioprobe \ qvideoprobe \ qsamplecache disabled { SUBDIRS += \ qdeclarativevideo } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/multimediawidgets.pro000066400000000000000000000005071225012771600321350ustar00rootroot00000000000000 TEMPLATE = subdirs SUBDIRS += \ qcameraviewfinder \ qcamerawidgets \ qmediaplayerwidgets \ # Tests depending on private interfaces should only be built if # these interfaces are exported. contains (QT_CONFIG, private_tests) { SUBDIRS += \ qgraphicsvideoitem \ qpaintervideosurface \ qvideowidget } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideobuffer/000077500000000000000000000000001225012771600320755ustar00rootroot00000000000000qabstractvideobuffer.pro000066400000000000000000000002601225012771600367430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideobufferCONFIG += testcase TARGET = tst_qabstractvideobuffer QT += core multimedia-private testlib SOURCES += tst_qabstractvideobuffer.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qabstractvideobuffer.cpp000066400000000000000000000120411225012771600376170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideobuffer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include // Adds an enum, and the stringized version #define ADD_ENUM_TEST(x) \ QTest::newRow(#x) \ << QAbstractVideoBuffer::x \ << QString(QLatin1String(#x)); class tst_QAbstractVideoBuffer : public QObject { Q_OBJECT public: tst_QAbstractVideoBuffer(); ~tst_QAbstractVideoBuffer(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void handleType_data(); void handleType(); void handle(); void mapMode(); void mapModeDebug_data(); void mapModeDebug(); }; class QtTestVideoBuffer : public QAbstractVideoBuffer { public: QtTestVideoBuffer(QAbstractVideoBuffer::HandleType type) : QAbstractVideoBuffer(type) {} MapMode mapMode() const { return QAbstractVideoBuffer::ReadWrite; } uchar *map(MapMode, int *, int *) { return 0; } void unmap() {} }; tst_QAbstractVideoBuffer::tst_QAbstractVideoBuffer() { } tst_QAbstractVideoBuffer::~tst_QAbstractVideoBuffer() { } void tst_QAbstractVideoBuffer::initTestCase() { } void tst_QAbstractVideoBuffer::cleanupTestCase() { } void tst_QAbstractVideoBuffer::init() { } void tst_QAbstractVideoBuffer::cleanup() { } void tst_QAbstractVideoBuffer::handleType_data() { QTest::addColumn("type"); QTest::addColumn("stringized"); ADD_ENUM_TEST(NoHandle); ADD_ENUM_TEST(GLTextureHandle); ADD_ENUM_TEST(XvShmImageHandle); ADD_ENUM_TEST(QPixmapHandle); ADD_ENUM_TEST(CoreImageHandle); // User handles are different QTest::newRow("user1") << QAbstractVideoBuffer::UserHandle << QString::fromLatin1("UserHandle(1000)"); QTest::newRow("user2") << QAbstractVideoBuffer::HandleType(QAbstractVideoBuffer::UserHandle + 1) << QString::fromLatin1("UserHandle(1001)"); } void tst_QAbstractVideoBuffer::handleType() { QFETCH(QAbstractVideoBuffer::HandleType, type); QFETCH(QString, stringized); QtTestVideoBuffer buffer(type); QCOMPARE(buffer.handleType(), type); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << type; } void tst_QAbstractVideoBuffer::handle() { QtTestVideoBuffer buffer(QAbstractVideoBuffer::NoHandle); QVERIFY(buffer.handle().isNull()); } void tst_QAbstractVideoBuffer::mapMode() { QtTestVideoBuffer maptest(QAbstractVideoBuffer::NoHandle); QVERIFY2(maptest.mapMode() == QAbstractVideoBuffer::ReadWrite, "ReadWrite Failed"); } void tst_QAbstractVideoBuffer::mapModeDebug_data() { QTest::addColumn("mapMode"); QTest::addColumn("stringized"); ADD_ENUM_TEST(NotMapped); ADD_ENUM_TEST(ReadOnly); ADD_ENUM_TEST(WriteOnly); ADD_ENUM_TEST(ReadWrite); } void tst_QAbstractVideoBuffer::mapModeDebug() { QFETCH(QAbstractVideoBuffer::MapMode, mapMode); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << mapMode; } QTEST_MAIN(tst_QAbstractVideoBuffer) #include "tst_qabstractvideobuffer.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideosurface/000077500000000000000000000000001225012771600322545ustar00rootroot00000000000000qabstractvideosurface.pro000066400000000000000000000002621225012771600373030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideosurfaceCONFIG += testcase TARGET = tst_qabstractvideosurface QT += core multimedia-private testlib SOURCES += tst_qabstractvideosurface.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qabstractvideosurface.cpp000066400000000000000000000331001225012771600401540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qabstractvideosurface/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include class tst_QAbstractVideoSurface : public QObject { Q_OBJECT public: tst_QAbstractVideoSurface(); ~tst_QAbstractVideoSurface(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void setError(); void isFormatSupported_data(); void isFormatSupported(); void nearestFormat_data(); void nearestFormat(); void start_data(); void start(); void nativeResolution(); void supportedFormatsChanged(); }; typedef QMap SupportedFormatMap; Q_DECLARE_METATYPE(SupportedFormatMap) class QtTestVideoSurface : public QAbstractVideoSurface { Q_OBJECT public: explicit QtTestVideoSurface(QObject *parent = 0) : QAbstractVideoSurface(parent) {} explicit QtTestVideoSurface(SupportedFormatMap formats, QObject *parent = 0) : QAbstractVideoSurface(parent), supportedFormats(formats) {} QList supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const { return supportedFormats.values(handleType); } bool present(const QVideoFrame &) { return false; } using QAbstractVideoSurface::setError; /* adding protected setNativeResolution*/ using QAbstractVideoSurface::setNativeResolution; /* fun to generate supportedFormatsChanged signal */ QList supportedPixelFormatsChange(QList formats) { supportedFormats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32); QList supportedFormats = supportedPixelFormats(); if (supportedFormats.count() != formats.count()) { emit supportedFormatsChanged(); } return supportedFormats; } private: SupportedFormatMap supportedFormats; }; tst_QAbstractVideoSurface::tst_QAbstractVideoSurface() { } tst_QAbstractVideoSurface::~tst_QAbstractVideoSurface() { } void tst_QAbstractVideoSurface::initTestCase() { } void tst_QAbstractVideoSurface::cleanupTestCase() { } void tst_QAbstractVideoSurface::init() { } void tst_QAbstractVideoSurface::cleanup() { } void tst_QAbstractVideoSurface::setError() { qRegisterMetaType(); QtTestVideoSurface surface; QCOMPARE(surface.error(), QAbstractVideoSurface::NoError); QTest::ignoreMessage(QtDebugMsg, "NoError"); qDebug() << QAbstractVideoSurface::NoError; surface.setError(QAbstractVideoSurface::StoppedError); QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError); QTest::ignoreMessage(QtDebugMsg, "StoppedError"); qDebug() << QAbstractVideoSurface::StoppedError; surface.setError(QAbstractVideoSurface::ResourceError); QCOMPARE(surface.error(), QAbstractVideoSurface::ResourceError); QTest::ignoreMessage(QtDebugMsg, "ResourceError"); qDebug() << QAbstractVideoSurface::ResourceError; surface.setError(QAbstractVideoSurface::NoError); QCOMPARE(surface.error(), QAbstractVideoSurface::NoError); QTest::ignoreMessage(QtDebugMsg, "NoError"); qDebug() << QAbstractVideoSurface::NoError; surface.setError(QAbstractVideoSurface::UnsupportedFormatError); QCOMPARE(surface.error(), QAbstractVideoSurface::UnsupportedFormatError); QTest::ignoreMessage(QtDebugMsg, "UnsupportedFormatError"); qDebug() << QAbstractVideoSurface::UnsupportedFormatError; surface.setError(QAbstractVideoSurface::IncorrectFormatError); QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError); QTest::ignoreMessage(QtDebugMsg, "IncorrectFormatError"); qDebug() << QAbstractVideoSurface::IncorrectFormatError; } void tst_QAbstractVideoSurface::isFormatSupported_data() { QTest::addColumn("supportedFormats"); QTest::addColumn("format"); QTest::addColumn("supported"); SupportedFormatMap formats; QTest::newRow("no formats: rgb32") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB32) << false; QTest::newRow("no formats: yv12") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12) << false; QTest::newRow("no formats: rgb32 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle) << false; QTest::newRow("no formats: rgb24 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB24, QAbstractVideoBuffer::GLTextureHandle) << false; formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32); formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24); formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YUV444); formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB32); QTest::newRow("supported: rgb32") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB32) << true; QTest::newRow("supported: rgb24") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB24) << true; QTest::newRow("unsupported: yv12") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12) << false; QTest::newRow("supported: rgb32 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle) << true; QTest::newRow("unsupported: rgb24 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB24, QAbstractVideoBuffer::GLTextureHandle) << false; QTest::newRow("unsupported: yv12 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_YV12, QAbstractVideoBuffer::GLTextureHandle) << false; formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12); formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24); QTest::newRow("supported: yv12") << formats << QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12) << true; QTest::newRow("supported: rgb24 gl") << formats << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB24, QAbstractVideoBuffer::GLTextureHandle) << true; } void tst_QAbstractVideoSurface::isFormatSupported() { QFETCH(SupportedFormatMap, supportedFormats); QFETCH(QVideoSurfaceFormat, format); QFETCH(bool, supported); QtTestVideoSurface surface(supportedFormats); QCOMPARE(surface.isFormatSupported(format), supported); } void tst_QAbstractVideoSurface::nearestFormat_data() { isFormatSupported_data(); } void tst_QAbstractVideoSurface::nearestFormat() { QFETCH(SupportedFormatMap, supportedFormats); QFETCH(QVideoSurfaceFormat, format); QFETCH(bool, supported); QtTestVideoSurface surface(supportedFormats); QCOMPARE(surface.nearestFormat(format) == format, supported); } void tst_QAbstractVideoSurface::start_data() { QTest::addColumn("format"); QTest::newRow("rgb32") << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB32); QTest::newRow("yv12") << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_YV12); QTest::newRow("rgb32 gl") << QVideoSurfaceFormat( QSize(800, 600), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); } void tst_QAbstractVideoSurface::start() { QFETCH(QVideoSurfaceFormat, format); QtTestVideoSurface surface; surface.setError(QAbstractVideoSurface::ResourceError); QSignalSpy formatSpy(&surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat))); QSignalSpy activeSpy(&surface, SIGNAL(activeChanged(bool))); QVERIFY(!surface.isActive()); QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat()); QVERIFY(surface.start(format)); QVERIFY(surface.isActive()); QCOMPARE(surface.surfaceFormat(), format); QCOMPARE(formatSpy.count(), 1); QCOMPARE(qvariant_cast(formatSpy.last().at(0)), format); QCOMPARE(activeSpy.count(), 1); QCOMPARE(activeSpy.last().at(0).toBool(), true); // Starting twice won't change active // XXX should this also not emit surfaceFormatChanged? QVERIFY(surface.start(format)); QCOMPARE(activeSpy.count(), 1); QVERIFY(surface.isActive()); // error() is reset on a successful start. QCOMPARE(surface.error(), QAbstractVideoSurface::NoError); surface.stop(); QVERIFY(!surface.isActive()); QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat()); QCOMPARE(formatSpy.count(), 3); QCOMPARE(qvariant_cast(formatSpy.last().at(0)), QVideoSurfaceFormat()); QCOMPARE(activeSpy.count(), 2); QCOMPARE(activeSpy.last().at(0).toBool(), false); // Stopping a stopped surface shouldn't hurt surface.stop(); QVERIFY(!surface.isActive()); QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat()); QCOMPARE(formatSpy.count(), 3); QCOMPARE(qvariant_cast(formatSpy.last().at(0)), QVideoSurfaceFormat()); QCOMPARE(activeSpy.count(), 2); QCOMPARE(activeSpy.last().at(0).toBool(), false); } // Test nativeResolution property void tst_QAbstractVideoSurface::nativeResolution() { QtTestVideoSurface surface; QSignalSpy spy(&surface, SIGNAL(nativeResolutionChanged(QSize))); QSize size1 = surface.nativeResolution(); QVERIFY(size1.width() == -1); QVERIFY(size1.height() == -1); QVERIFY(spy.count() == 0); QSize res(100,150); surface.setNativeResolution(res); QVERIFY(spy.count() == 1); QSize size2 = qvariant_cast(spy.at(0).at(0)); QVERIFY(size2.width() == 100); QVERIFY(size2.height() == 150); // Setting again should not emit surface.setNativeResolution(res); QVERIFY(spy.count() == 1); size2 = qvariant_cast(spy.at(0).at(0)); QVERIFY(size2.width() == 100); QVERIFY(size2.height() == 150); spy.clear(); } // QAbstractVideoSurface's supported Formats Changed Signal void tst_QAbstractVideoSurface::supportedFormatsChanged() { SupportedFormatMap formatMap; formatMap.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24); QtTestVideoSurface surface(formatMap); QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); QList formats = surface.supportedPixelFormats(); QVERIFY(formats.count() == 1); QVERIFY(spy.count() == 0); // user defined implementation for generation of supportedFormatsChanged signal QList newFormats = surface.supportedPixelFormatsChange(formats); QVERIFY(newFormats.count() == (formats.count() + 1)); QVERIFY(spy.count() == 1); spy.clear(); } QTEST_MAIN(tst_QAbstractVideoSurface) #include "tst_qabstractvideosurface.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiobuffer/000077500000000000000000000000001225012771600303445ustar00rootroot00000000000000qaudiobuffer.pro000066400000000000000000000005561225012771600334710ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiobuffer#------------------------------------------------- # # Project created by QtCreator 2012-02-02T23:40:38 # #------------------------------------------------- QT += multimedia testlib QT -= gui TARGET = tst_qaudiobuffer CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += tst_qaudiobuffer.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudiobuffer.cpp000066400000000000000000000323031225012771600343400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiobuffer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include class tst_QAudioBuffer : public QObject { Q_OBJECT public: tst_QAudioBuffer(); ~tst_QAudioBuffer(); private Q_SLOTS: void ctors(); void assign(); void constData() const; void data_const() const; void data(); void durations(); void durations_data(); void stereoSample(); private: QAudioFormat mFormat; QAudioBuffer *mNull; QAudioBuffer *mEmpty; QAudioBuffer *mFromArray; }; tst_QAudioBuffer::tst_QAudioBuffer() { // Initialize some common buffers mFormat.setChannelCount(2); mFormat.setSampleSize(16); mFormat.setSampleType(QAudioFormat::UnSignedInt); mFormat.setSampleRate(10000); mFormat.setCodec("audio/pcm"); QByteArray b(4000, 0x80); mNull = new QAudioBuffer; mEmpty = new QAudioBuffer(500, mFormat); // 500 stereo frames of 16 bits -> 2KB mFromArray = new QAudioBuffer(b, mFormat); } tst_QAudioBuffer::~tst_QAudioBuffer() { delete mNull; delete mEmpty; delete mFromArray; } void tst_QAudioBuffer::ctors() { // Null buffer QVERIFY(!mNull->isValid()); QVERIFY(mNull->constData() == 0); QVERIFY(mNull->data() == 0); QVERIFY(((const QAudioBuffer*)mNull)->data() == 0); QCOMPARE(mNull->duration(), 0LL); QCOMPARE(mNull->byteCount(), 0); QCOMPARE(mNull->sampleCount(), 0); QCOMPARE(mNull->frameCount(), 0); QCOMPARE(mNull->startTime(), -1LL); // Empty buffer QVERIFY(mEmpty->isValid()); QVERIFY(mEmpty->constData() != 0); QVERIFY(mEmpty->data() != 0); QVERIFY(((const QAudioBuffer*)mEmpty)->data() != 0); QCOMPARE(mEmpty->sampleCount(), 1000); QCOMPARE(mEmpty->frameCount(), 500); QCOMPARE(mEmpty->duration(), 50000LL); QCOMPARE(mEmpty->byteCount(), 2000); QCOMPARE(mEmpty->startTime(), -1LL); // bytearray buffer QVERIFY(mFromArray->isValid()); QVERIFY(mFromArray->constData() != 0); QVERIFY(mFromArray->data() != 0); QVERIFY(((const QAudioBuffer*)mFromArray)->data() != 0); /// 4000 bytes at 10KHz, 2ch, 16bit = 40kBps -> 0.1s QCOMPARE(mFromArray->duration(), 100000LL); QCOMPARE(mFromArray->byteCount(), 4000); QCOMPARE(mFromArray->sampleCount(), 2000); QCOMPARE(mFromArray->frameCount(), 1000); QCOMPARE(mFromArray->startTime(), -1LL); // Now some invalid buffers QAudioBuffer badFormat(1000, QAudioFormat()); QVERIFY(!badFormat.isValid()); QVERIFY(badFormat.constData() == 0); QVERIFY(badFormat.data() == 0); QVERIFY(((const QAudioBuffer*)&badFormat)->data() == 0); QCOMPARE(badFormat.duration(), 0LL); QCOMPARE(badFormat.byteCount(), 0); QCOMPARE(badFormat.sampleCount(), 0); QCOMPARE(badFormat.frameCount(), 0); QCOMPARE(badFormat.startTime(), -1LL); QAudioBuffer badArray(QByteArray(), mFormat); QVERIFY(!badArray.isValid()); QVERIFY(badArray.constData() == 0); QVERIFY(badArray.data() == 0); QVERIFY(((const QAudioBuffer*)&badArray)->data() == 0); QCOMPARE(badArray.duration(), 0LL); QCOMPARE(badArray.byteCount(), 0); QCOMPARE(badArray.sampleCount(), 0); QCOMPARE(badArray.frameCount(), 0); QCOMPARE(badArray.startTime(), -1LL); QAudioBuffer badBoth = QAudioBuffer(QByteArray(), QAudioFormat()); QVERIFY(!badBoth.isValid()); QVERIFY(badBoth.constData() == 0); QVERIFY(badBoth.data() == 0); QVERIFY(((const QAudioBuffer*)&badBoth)->data() == 0); QCOMPARE(badBoth.duration(), 0LL); QCOMPARE(badBoth.byteCount(), 0); QCOMPARE(badBoth.sampleCount(), 0); QCOMPARE(badBoth.frameCount(), 0); QCOMPARE(badBoth.startTime(), -1LL); } void tst_QAudioBuffer::assign() { // TODO Needs strong behaviour definition } void tst_QAudioBuffer::constData() const { const void *data = mEmpty->constData(); QVERIFY(data != 0); const unsigned int *idata = reinterpret_cast(data); QCOMPARE(*idata, 0U); const QAudioBuffer::S8U *sdata = mEmpty->constData(); QVERIFY(sdata); QCOMPARE(sdata->left, (unsigned char)0); QCOMPARE(sdata->right, (unsigned char)0); // The bytearray one should be 0x80 data = mFromArray->constData(); QVERIFY(data != 0); idata = reinterpret_cast(data); QEXPECT_FAIL("", "Unsigned 16bits are cleared to 0x8080 currently", Continue); QCOMPARE(*idata, 0x80008000); sdata = mFromArray->constData(); QCOMPARE(sdata->left, (unsigned char)0x80); QCOMPARE(sdata->right, (unsigned char)0x80); } void tst_QAudioBuffer::data_const() const { const void *data = ((const QAudioBuffer*)mEmpty)->data(); QVERIFY(data != 0); const unsigned int *idata = reinterpret_cast(data); QCOMPARE(*idata, 0U); const QAudioBuffer::S8U *sdata = ((const QAudioBuffer*)mEmpty)->constData(); QVERIFY(sdata); QCOMPARE(sdata->left, (unsigned char)0); QCOMPARE(sdata->right, (unsigned char)0); // The bytearray one should be 0x80 data = ((const QAudioBuffer*)mFromArray)->data(); QVERIFY(data != 0); idata = reinterpret_cast(data); QEXPECT_FAIL("", "Unsigned 16bits are cleared to 0x8080 currently", Continue); QCOMPARE(*idata, 0x80008000); sdata = ((const QAudioBuffer*)mFromArray)->constData(); QCOMPARE(sdata->left, (unsigned char)0x80); QCOMPARE(sdata->right, (unsigned char)0x80); } void tst_QAudioBuffer::data() { void *data = mEmpty->data(); QVERIFY(data != 0); unsigned int *idata = reinterpret_cast(data); QCOMPARE(*idata, 0U); QAudioBuffer::S8U *sdata = mEmpty->data(); QVERIFY(sdata); QCOMPARE(sdata->left, (unsigned char)0); QCOMPARE(sdata->right, (unsigned char)0); // The bytearray one should be 0x80 data = mFromArray->data(); QVERIFY(data != 0); idata = reinterpret_cast(data); QEXPECT_FAIL("", "Unsigned 16bits are cleared to 0x8080 currently", Continue); QCOMPARE(*idata, 0x80008000); sdata = mFromArray->data(); QCOMPARE(sdata->left, (unsigned char)0x80); QCOMPARE(sdata->right, (unsigned char)0x80); } void tst_QAudioBuffer::durations() { QFETCH(int, channelCount); QFETCH(int, sampleSize); QFETCH(int, frameCount); int sampleCount = frameCount * channelCount; QFETCH(QAudioFormat::SampleType, sampleType); QFETCH(int, sampleRate); QFETCH(qint64, duration); QFETCH(int, byteCount); QAudioFormat f; f.setChannelCount(channelCount); f.setSampleType(sampleType); f.setSampleSize(sampleSize); f.setSampleRate(sampleRate); f.setCodec("audio/pcm"); QAudioBuffer b(frameCount, f); QCOMPARE(b.frameCount(), frameCount); QCOMPARE(b.sampleCount(), sampleCount); QCOMPARE(b.duration(), duration); QCOMPARE(b.byteCount(), byteCount); } void tst_QAudioBuffer::durations_data() { QTest::addColumn("channelCount"); QTest::addColumn("sampleSize"); QTest::addColumn("frameCount"); QTest::addColumn("sampleType"); QTest::addColumn("sampleRate"); QTest::addColumn("duration"); QTest::addColumn("byteCount"); QTest::newRow("M8_1000_8K") << 1 << 8 << 1000 << QAudioFormat::UnSignedInt << 8000 << 125000LL << 1000; QTest::newRow("M8_2000_8K") << 1 << 8 << 2000 << QAudioFormat::UnSignedInt << 8000 << 250000LL << 2000; QTest::newRow("M8_1000_4K") << 1 << 8 << 1000 << QAudioFormat::UnSignedInt << 4000 << 250000LL << 1000; QTest::newRow("S8_1000_8K") << 2 << 8 << 500 << QAudioFormat::UnSignedInt << 8000 << 62500LL << 1000; QTest::newRow("SF_1000_8K") << 2 << 32 << 500 << QAudioFormat::Float << 8000 << 62500LL << 4000; QTest::newRow("4x128_1000_16K") << 4 << 128 << 250 << QAudioFormat::SignedInt << 16000 << 15625LL << 16000; } void tst_QAudioBuffer::stereoSample() { // Uninitialized (should default to zero level for type) QAudioBuffer::S8U s8u; QAudioBuffer::S8S s8s; QAudioBuffer::S16U s16u; QAudioBuffer::S16S s16s; QAudioBuffer::S32F s32f; QCOMPARE(s8u.left, (unsigned char) 0x80); QCOMPARE(s8u.right, (unsigned char) 0x80); QCOMPARE(s8u.average(), (unsigned char) 0x80); QCOMPARE(s8s.left, (signed char) 0x00); QCOMPARE(s8s.right, (signed char) 0x00); QCOMPARE(s8s.average(), (signed char) 0x0); QCOMPARE(s16u.left, (unsigned short) 0x8000); QCOMPARE(s16u.right, (unsigned short) 0x8000); QCOMPARE(s16u.average(), (unsigned short) 0x8000); QCOMPARE(s16s.left, (signed short) 0x0); QCOMPARE(s16s.right, (signed short) 0x0); QCOMPARE(s16s.average(), (signed short) 0x0); QCOMPARE(s32f.left, 0.0f); QCOMPARE(s32f.right, 0.0f); QCOMPARE(s32f.average(), 0.0f); // Initialized QAudioBuffer::S8U s8u2(34, 145); QAudioBuffer::S8S s8s2(23, -89); QAudioBuffer::S16U s16u2(500, 45000); QAudioBuffer::S16S s16s2(-10000, 346); QAudioBuffer::S32F s32f2(500.7f, -123.1f); QCOMPARE(s8u2.left, (unsigned char) 34); QCOMPARE(s8u2.right, (unsigned char) 145); QCOMPARE(s8u2.average(), (unsigned char) 89); QCOMPARE(s8s2.left, (signed char) 23); QCOMPARE(s8s2.right,(signed char) -89); QCOMPARE(s8s2.average(), (signed char) -33); QCOMPARE(s16u2.left, (unsigned short) 500); QCOMPARE(s16u2.right, (unsigned short) 45000); QCOMPARE(s16u2.average(), (unsigned short) 22750); QCOMPARE(s16s2.left, (signed short) -10000); QCOMPARE(s16s2.right, (signed short) 346); QCOMPARE(s16s2.average(), (signed short) (-5000 + 173)); QCOMPARE(s32f2.left, 500.7f); QCOMPARE(s32f2.right, -123.1f); QCOMPARE(s32f2.average(), (500.7f - 123.1f)/2); // Assigned s8u = s8u2; s8s = s8s2; s16u = s16u2; s16s = s16s2; s32f = s32f2; QCOMPARE(s8u.left, (unsigned char) 34); QCOMPARE(s8u.right, (unsigned char) 145); QCOMPARE(s8u.average(), (unsigned char) 89); QCOMPARE(s8s.left, (signed char) 23); QCOMPARE(s8s.right, (signed char) -89); QCOMPARE(s8s.average(), (signed char) -33); QCOMPARE(s16u.left, (unsigned short) 500); QCOMPARE(s16u.right, (unsigned short) 45000); QCOMPARE(s16u.average(), (unsigned short) 22750); QCOMPARE(s16s.left, (signed short) -10000); QCOMPARE(s16s.right, (signed short) 346); QCOMPARE(s16s.average(), (signed short) (-5000 + 173)); QCOMPARE(s32f.left, 500.7f); QCOMPARE(s32f.right, -123.1f); QCOMPARE(s32f.average(), (500.7f - 123.1f)/2); // Cleared s8u.clear(); s8s.clear(); s16u.clear(); s16s.clear(); s32f.clear(); QCOMPARE(s8u.left, (unsigned char) 0x80); QCOMPARE(s8u.right, (unsigned char) 0x80); QCOMPARE(s8u.average(), (unsigned char) 0x80); QCOMPARE(s8s.left, (signed char) 0x00); QCOMPARE(s8s.right, (signed char) 0x00); QCOMPARE(s8s.average(), (signed char) 0x0); QCOMPARE(s16u.left, (unsigned short) 0x8000); QCOMPARE(s16u.right, (unsigned short) 0x8000); QCOMPARE(s16u.average(), (unsigned short) 0x8000); QCOMPARE(s16s.left, (signed short) 0x0); QCOMPARE(s16s.right, (signed short) 0x0); QCOMPARE(s16s.average(), (signed short) 0x0); QCOMPARE(s32f.left, 0.0f); QCOMPARE(s32f.right, 0.0f); QCOMPARE(s32f.average(), 0.0f); } QTEST_APPLESS_MAIN(tst_QAudioBuffer); #include "tst_qaudiobuffer.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiodecoder/000077500000000000000000000000001225012771600305005ustar00rootroot00000000000000qaudiodecoder.pro000066400000000000000000000010111225012771600337440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiodecoder#------------------------------------------------- # # Project created by QtCreator 2012-02-07T15:27:07 # #------------------------------------------------- QT += multimedia multimedia-private testlib gui TARGET = tst_qaudiodecoder CONFIG += testcase no_private_qt_headers_warning TEMPLATE = app INCLUDEPATH += \ ../../../../src/multimedia/audio include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockdecoder.pri) SOURCES += tst_qaudiodecoder.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudiodecoder.cpp000066400000000000000000000277321225012771600346420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiodecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qaudiodecoder.h" #include "mockaudiodecoderservice.h" #include "mockmediaserviceprovider.h" class tst_QAudioDecoder : public QObject { Q_OBJECT public: tst_QAudioDecoder(); private Q_SLOTS: void init(); void ctors(); void read(); void stop(); void format(); void source(); void readAll(); void nullControl(); void nullService(); private: MockAudioDecoderService *mockAudioDecoderService; MockMediaServiceProvider *mockProvider; }; tst_QAudioDecoder::tst_QAudioDecoder() { } void tst_QAudioDecoder::init() { mockAudioDecoderService = new MockAudioDecoderService(this); mockProvider = new MockMediaServiceProvider(mockAudioDecoderService); QMediaServiceProvider::setDefaultServiceProvider(mockProvider); } void tst_QAudioDecoder::ctors() { QAudioDecoder d; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.sourceFilename(), QString("")); d.setSourceFilename(""); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.sourceFilename(), QString("")); } void tst_QAudioDecoder::read() { QAudioDecoder d; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); // Starting with empty source == error d.start(); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(readySpy.count(), 0); QCOMPARE(bufferChangedSpy.count(), 0); QCOMPARE(errorSpy.count(), 1); // Set the source to something d.setSourceFilename("Blah"); QCOMPARE(d.sourceFilename(), QString("Blah")); readySpy.clear(); errorSpy.clear(); bufferChangedSpy.clear(); d.start(); QCOMPARE(d.state(), QAudioDecoder::DecodingState); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read QAudioBuffer b = d.read(); QVERIFY(!b.isValid()); // Read again with no parameter b = d.read(); QVERIFY(!b.isValid()); // Wait a while QTRY_COMPARE(d.bufferAvailable(), 1); QVERIFY(d.bufferAvailable()); b = d.read(); QVERIFY(b.format().isValid()); QVERIFY(b.isValid()); QVERIFY(b.format().channelCount() == 1); QVERIFY(b.sampleCount() == 4); QVERIFY(readySpy.count() >= 1); QVERIFY(errorSpy.count() == 0); if (d.bufferAvailable()) { QVERIFY(bufferChangedSpy.count() == 1); } else { QVERIFY(bufferChangedSpy.count() == 2); } } void tst_QAudioDecoder::stop() { QAudioDecoder d; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); // Starting with empty source == error d.start(); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QCOMPARE(readySpy.count(), 0); QCOMPARE(bufferChangedSpy.count(), 0); QCOMPARE(errorSpy.count(), 1); // Set the source to something d.setSourceFilename("Blah"); QCOMPARE(d.sourceFilename(), QString("Blah")); readySpy.clear(); errorSpy.clear(); bufferChangedSpy.clear(); d.start(); QCOMPARE(d.state(), QAudioDecoder::DecodingState); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read QAudioBuffer b = d.read(); QVERIFY(!b.isValid()); // Read again with no parameter b = d.read(); QVERIFY(!b.isValid()); // Wait a while QTRY_COMPARE(d.bufferAvailable(), 1); QVERIFY(d.bufferAvailable()); // Now stop d.stop(); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); } void tst_QAudioDecoder::format() { QAudioDecoder d; QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); // Set the source to something d.setSourceFilename("Blah"); QCOMPARE(d.sourceFilename(), QString("Blah")); readySpy.clear(); errorSpy.clear(); bufferChangedSpy.clear(); d.start(); QCOMPARE(d.state(), QAudioDecoder::DecodingState); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read QAudioBuffer b = d.read(); QVERIFY(!b.isValid()); // Read again with no parameter b = d.read(); QVERIFY(!b.isValid()); // Wait a while QTRY_COMPARE(d.bufferAvailable(), 1); b = d.read(); QVERIFY(d.audioFormat() == b.format()); // Setting format while decoding is forbidden QAudioFormat f(d.audioFormat()); f.setChannelCount(2); d.setAudioFormat(f); QVERIFY(d.audioFormat() != f); QVERIFY(d.audioFormat() == b.format()); // Now stop, and set something specific d.stop(); d.setAudioFormat(f); QVERIFY(d.audioFormat() == f); // Decode again d.start(); QTRY_COMPARE(d.bufferAvailable(), 1); b = d.read(); QVERIFY(d.audioFormat() == f); QVERIFY(b.format() == f); } void tst_QAudioDecoder::source() { QAudioDecoder d; QVERIFY(d.sourceFilename().isEmpty()); QVERIFY(d.sourceDevice() == 0); QFile f; d.setSourceDevice(&f); QVERIFY(d.sourceFilename().isEmpty()); QVERIFY(d.sourceDevice() == &f); d.setSourceFilename("Foo"); QVERIFY(d.sourceFilename() == QString("Foo")); QVERIFY(d.sourceDevice() == 0); d.setSourceDevice(0); QVERIFY(d.sourceFilename().isEmpty()); QVERIFY(d.sourceDevice() == 0); d.setSourceFilename("Foo"); QVERIFY(d.sourceFilename() == QString("Foo")); QVERIFY(d.sourceDevice() == 0); d.setSourceFilename(QString()); QVERIFY(d.sourceFilename() == QString()); QVERIFY(d.sourceDevice() == 0); } void tst_QAudioDecoder::readAll() { QAudioDecoder d; d.setSourceFilename("Foo"); QVERIFY(d.state() == QAudioDecoder::StoppedState); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy bufferAvailableSpy(&d, SIGNAL(bufferAvailableChanged(bool))); d.start(); int i = 0; forever { QVERIFY(d.state() == QAudioDecoder::DecodingState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(durationSpy.count(), 1); QVERIFY(finishedSpy.isEmpty()); QTRY_VERIFY(bufferAvailableSpy.count() >= 1); if (d.bufferAvailable()) { QAudioBuffer b = d.read(); QVERIFY(b.isValid()); QCOMPARE(b.startTime() / 1000, d.position()); QVERIFY(!positionSpy.isEmpty()); QList arguments = positionSpy.takeLast(); QCOMPARE(arguments.at(0).toLongLong(), b.startTime() / 1000); i++; if (i == MOCK_DECODER_MAX_BUFFERS) { QCOMPARE(finishedSpy.count(), 1); QCOMPARE(stateSpy.count(), 2); QVERIFY(d.state() == QAudioDecoder::StoppedState); QList arguments = stateSpy.takeLast(); QVERIFY(arguments.at(0).toInt() == (int)QAudioDecoder::StoppedState); QVERIFY(!d.bufferAvailable()); QVERIFY(!bufferAvailableSpy.isEmpty()); arguments = bufferAvailableSpy.takeLast(); QVERIFY(arguments.at(0).toBool() == false); break; } } else QTest::qWait(30); } } void tst_QAudioDecoder::nullControl() { mockAudioDecoderService->setControlNull(); QAudioDecoder d; QVERIFY(d.error() == QAudioDecoder::ServiceMissingError); QVERIFY(!d.errorString().isEmpty()); QVERIFY(d.hasSupport("MIME") == QMultimedia::MaybeSupported); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.sourceFilename().isEmpty()); d.setSourceFilename("test"); QVERIFY(d.sourceFilename().isEmpty()); QFile f; QVERIFY(d.sourceDevice() == 0); d.setSourceDevice(&f); QVERIFY(d.sourceDevice() == 0); QAudioFormat format; format.setChannelCount(2); QVERIFY(!d.audioFormat().isValid()); d.setAudioFormat(format); QVERIFY(!d.audioFormat().isValid()); QVERIFY(!d.read().isValid()); QVERIFY(!d.bufferAvailable()); QVERIFY(d.position() == -1); QVERIFY(d.duration() == -1); d.start(); QVERIFY(d.error() == QAudioDecoder::ServiceMissingError); QVERIFY(!d.errorString().isEmpty()); QVERIFY(d.state() == QAudioDecoder::StoppedState); d.stop(); } void tst_QAudioDecoder::nullService() { mockProvider->service = 0; QAudioDecoder d; QVERIFY(d.error() == QAudioDecoder::ServiceMissingError); QVERIFY(!d.errorString().isEmpty()); QVERIFY(d.hasSupport("MIME") == QMultimedia::MaybeSupported); QVERIFY(d.state() == QAudioDecoder::StoppedState); QVERIFY(d.sourceFilename().isEmpty()); d.setSourceFilename("test"); QVERIFY(d.sourceFilename().isEmpty()); QFile f; QVERIFY(d.sourceDevice() == 0); d.setSourceDevice(&f); QVERIFY(d.sourceDevice() == 0); QAudioFormat format; format.setChannelCount(2); QVERIFY(!d.audioFormat().isValid()); d.setAudioFormat(format); QVERIFY(!d.audioFormat().isValid()); QVERIFY(!d.read().isValid()); QVERIFY(!d.bufferAvailable()); QVERIFY(d.position() == -1); QVERIFY(d.duration() == -1); d.start(); QVERIFY(d.error() == QAudioDecoder::ServiceMissingError); QVERIFY(!d.errorString().isEmpty()); QVERIFY(d.state() == QAudioDecoder::StoppedState); d.stop(); } QTEST_MAIN(tst_QAudioDecoder) #include "tst_qaudiodecoder.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioformat/000077500000000000000000000000001225012771600303635ustar00rootroot00000000000000qaudioformat.pro000066400000000000000000000002401225012771600335150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioformatCONFIG += testcase TARGET = tst_qaudioformat QT += core multimedia-private testlib SOURCES += tst_qaudioformat.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudioformat.cpp000066400000000000000000000320501225012771600343750ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioformat/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include //TESTED_COMPONENT=src/multimedia class tst_QAudioFormat : public QObject { Q_OBJECT public: tst_QAudioFormat(QObject* parent=0) : QObject(parent) {} private slots: void checkNull(); void checkSampleSize(); void checkCodec(); void checkByteOrder(); void checkSampleType(); void checkEquality(); void checkAssignment(); void checkSampleRate(); void checkChannelCount(); void checkSizes(); void checkSizes_data(); void debugOperator(); void debugOperator_data(); }; void tst_QAudioFormat::checkNull() { // Default constructed QAudioFormat is invalid. QAudioFormat audioFormat0; QVERIFY(!audioFormat0.isValid()); // validity is transferred QAudioFormat audioFormat1(audioFormat0); QVERIFY(!audioFormat1.isValid()); audioFormat0.setSampleRate(44100); audioFormat0.setChannelCount(2); audioFormat0.setSampleSize(16); audioFormat0.setCodec("audio/pcm"); audioFormat0.setSampleType(QAudioFormat::SignedInt); QVERIFY(audioFormat0.isValid()); } void tst_QAudioFormat::checkSampleSize() { QAudioFormat audioFormat; audioFormat.setSampleSize(16); QVERIFY(audioFormat.sampleSize() == 16); } void tst_QAudioFormat::checkCodec() { QAudioFormat audioFormat; audioFormat.setCodec(QString::fromLatin1("audio/pcm")); QVERIFY(audioFormat.codec() == QString::fromLatin1("audio/pcm")); } void tst_QAudioFormat::checkByteOrder() { QAudioFormat audioFormat; audioFormat.setByteOrder(QAudioFormat::LittleEndian); QVERIFY(audioFormat.byteOrder() == QAudioFormat::LittleEndian); QTest::ignoreMessage(QtDebugMsg, "LittleEndian"); qDebug() << QAudioFormat::LittleEndian; audioFormat.setByteOrder(QAudioFormat::BigEndian); QVERIFY(audioFormat.byteOrder() == QAudioFormat::BigEndian); QTest::ignoreMessage(QtDebugMsg, "BigEndian"); qDebug() << QAudioFormat::BigEndian; } void tst_QAudioFormat::checkSampleType() { QAudioFormat audioFormat; audioFormat.setSampleType(QAudioFormat::SignedInt); QVERIFY(audioFormat.sampleType() == QAudioFormat::SignedInt); QTest::ignoreMessage(QtDebugMsg, "SignedInt"); qDebug() << QAudioFormat::SignedInt; audioFormat.setSampleType(QAudioFormat::Unknown); QVERIFY(audioFormat.sampleType() == QAudioFormat::Unknown); QTest::ignoreMessage(QtDebugMsg, "Unknown"); qDebug() << QAudioFormat::Unknown; audioFormat.setSampleType(QAudioFormat::UnSignedInt); QVERIFY(audioFormat.sampleType() == QAudioFormat::UnSignedInt); QTest::ignoreMessage(QtDebugMsg, "UnSignedInt"); qDebug() << QAudioFormat::UnSignedInt; audioFormat.setSampleType(QAudioFormat::Float); QVERIFY(audioFormat.sampleType() == QAudioFormat::Float); QTest::ignoreMessage(QtDebugMsg, "Float"); qDebug() << QAudioFormat::Float; } void tst_QAudioFormat::checkEquality() { QAudioFormat audioFormat0; QAudioFormat audioFormat1; // Null formats are equivalent QVERIFY(audioFormat0 == audioFormat1); QVERIFY(!(audioFormat0 != audioFormat1)); // on filled formats audioFormat0.setSampleRate(8000); audioFormat0.setChannelCount(1); audioFormat0.setSampleSize(8); audioFormat0.setCodec("audio/pcm"); audioFormat0.setByteOrder(QAudioFormat::LittleEndian); audioFormat0.setSampleType(QAudioFormat::UnSignedInt); audioFormat1.setSampleRate(8000); audioFormat1.setChannelCount(1); audioFormat1.setSampleSize(8); audioFormat1.setCodec("audio/pcm"); audioFormat1.setByteOrder(QAudioFormat::LittleEndian); audioFormat1.setSampleType(QAudioFormat::UnSignedInt); QVERIFY(audioFormat0 == audioFormat1); QVERIFY(!(audioFormat0 != audioFormat1)); audioFormat0.setSampleRate(44100); QVERIFY(audioFormat0 != audioFormat1); QVERIFY(!(audioFormat0 == audioFormat1)); } void tst_QAudioFormat::checkAssignment() { QAudioFormat audioFormat0; QAudioFormat audioFormat1; audioFormat0.setSampleRate(8000); audioFormat0.setChannelCount(1); audioFormat0.setSampleSize(8); audioFormat0.setCodec("audio/pcm"); audioFormat0.setByteOrder(QAudioFormat::LittleEndian); audioFormat0.setSampleType(QAudioFormat::UnSignedInt); audioFormat1 = audioFormat0; QVERIFY(audioFormat1 == audioFormat0); QAudioFormat audioFormat2(audioFormat0); QVERIFY(audioFormat2 == audioFormat0); } /* sampleRate() API property test. */ void tst_QAudioFormat::checkSampleRate() { QAudioFormat audioFormat; QVERIFY(audioFormat.sampleRate() == -1); audioFormat.setSampleRate(123); QVERIFY(audioFormat.sampleRate() == 123); } /* channelCount() API property test. */ void tst_QAudioFormat::checkChannelCount() { // channels is the old name for channelCount, so // they should always be equal QAudioFormat audioFormat; QVERIFY(audioFormat.channelCount() == -1); QVERIFY(audioFormat.channelCount() == -1); audioFormat.setChannelCount(123); QVERIFY(audioFormat.channelCount() == 123); QVERIFY(audioFormat.channelCount() == 123); audioFormat.setChannelCount(5); QVERIFY(audioFormat.channelCount() == 5); QVERIFY(audioFormat.channelCount() == 5); } void tst_QAudioFormat::checkSizes() { QFETCH(QAudioFormat, format); QFETCH(int, frameSize); QFETCH(int, byteCount); QFETCH(int, frameCount); QFETCH(qint64, durationForByte); QFETCH(int, byteForFrame); QFETCH(qint64, durationForByteForDuration); QFETCH(int, byteForDuration); QFETCH(int, framesForDuration); QCOMPARE(format.bytesPerFrame(), frameSize); // Byte input QCOMPARE(format.framesForBytes(byteCount), frameCount); QCOMPARE(format.durationForBytes(byteCount), durationForByte); // Framecount input QCOMPARE(format.bytesForFrames(frameCount), byteForFrame); QCOMPARE(format.durationForFrames(frameCount), durationForByte); // Duration input QCOMPARE(format.bytesForDuration(durationForByteForDuration), byteForDuration); QCOMPARE(format.framesForDuration(durationForByte), frameCount); QCOMPARE(format.framesForDuration(durationForByteForDuration), framesForDuration); } void tst_QAudioFormat::checkSizes_data() { QTest::addColumn("format"); QTest::addColumn("frameSize"); QTest::addColumn("byteCount"); QTest::addColumn("durationForByte"); QTest::addColumn("frameCount"); // output of sampleCountforByte, input for byteForFrame QTest::addColumn("byteForFrame"); QTest::addColumn("durationForByteForDuration"); // input for byteForDuration QTest::addColumn("byteForDuration"); QTest::addColumn("framesForDuration"); QAudioFormat f; QTest::newRow("invalid") << f << 0 << 0 << 0LL << 0 << 0 << 0LL << 0 << 0; f.setByteOrder(QAudioFormat::LittleEndian); f.setChannelCount(1); f.setSampleRate(8000); f.setCodec("audio/pcm"); f.setSampleSize(8); f.setSampleType(QAudioFormat::SignedInt); qint64 qrtr = 250000LL; qint64 half = 500000LL; qint64 one = 1000000LL; qint64 two = 2000000LL; // No rounding errors with mono 8 bit QTest::newRow("1ch_8b_8k_signed_4000") << f << 1 << 4000 << half << 4000 << 4000 << half << 4000 << 4000; QTest::newRow("1ch_8b_8k_signed_8000") << f << 1 << 8000 << one << 8000 << 8000 << one << 8000 << 8000; QTest::newRow("1ch_8b_8k_signed_16000") << f << 1 << 16000 << two << 16000 << 16000 << two << 16000 << 16000; // Mono 16bit f.setSampleSize(16); QTest::newRow("1ch_16b_8k_signed_8000") << f << 2 << 8000 << half << 4000 << 8000 << half << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_16000") << f << 2 << 16000 << one << 8000 << 16000 << one << 16000 << 8000; // Rounding errors QTest::newRow("1ch_16b_8k_signed_8001") << f << 2 << 8001 << half << 4000 << 8000 << half << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration1") << f << 2 << 8000 << half << 4000 << 8000 << half + 1 << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration2") << f << 2 << 8000 << half << 4000 << 8000 << half + 124 << 8000 << 4000; QTest::newRow("1ch_16b_8k_signed_8000_duration3") << f << 2 << 8000 << half << 4000 << 8000 << half + 125 << 8002 << 4001; QTest::newRow("1ch_16b_8k_signed_8000_duration4") << f << 2 << 8000 << half << 4000 << 8000 << half + 126 << 8002 << 4001; // Stereo 16 bit f.setChannelCount(2); QTest::newRow("2ch_16b_8k_signed_8000") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_16000") << f << 4 << 16000 << half << 4000 << 16000 << half << 16000 << 4000; // More rounding errors // First rounding bytes QTest::newRow("2ch_16b_8k_signed_8001") << f << 4 << 8001 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8002") << f << 4 << 8002 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8003") << f << 4 << 8003 << qrtr << 2000 << 8000 << qrtr << 8000 << 2000; // Then rounding duration // 8khz = 125us per frame QTest::newRow("2ch_16b_8k_signed_8000_duration1") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 1 << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8000_duration2") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 124 << 8000 << 2000; QTest::newRow("2ch_16b_8k_signed_8000_duration3") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 125 << 8004 << 2001; QTest::newRow("2ch_16b_8k_signed_8000_duration4") << f << 4 << 8000 << qrtr << 2000 << 8000 << qrtr + 126 << 8004 << 2001; } void tst_QAudioFormat::debugOperator_data() { QTest::addColumn("format"); QTest::addColumn("stringized"); // A small sampling QAudioFormat f; QTest::newRow("plain") << f << QString::fromLatin1("QAudioFormat(-1Hz, -1bit, channelCount=-1, sampleType=Unknown, byteOrder=LittleEndian, codec=\"\") "); f.setSampleRate(22050); f.setByteOrder(QAudioFormat::LittleEndian); f.setChannelCount(4); f.setCodec("audio/pcm"); f.setSampleType(QAudioFormat::Float); QTest::newRow("float") << f << QString::fromLatin1("QAudioFormat(22050Hz, -1bit, channelCount=4, sampleType=Float, byteOrder=LittleEndian, codec=\"audio/pcm\") "); f.setSampleType(QAudioFormat::UnSignedInt); QTest::newRow("unsigned") << f << QString::fromLatin1("QAudioFormat(22050Hz, -1bit, channelCount=4, sampleType=UnSignedInt, byteOrder=LittleEndian, codec=\"audio/pcm\") "); f.setSampleRate(44100); QTest::newRow("44.1 unsigned") << f << QString::fromLatin1("QAudioFormat(44100Hz, -1bit, channelCount=4, sampleType=UnSignedInt, byteOrder=LittleEndian, codec=\"audio/pcm\") "); f.setByteOrder(QAudioFormat::BigEndian); QTest::newRow("44.1 big unsigned") << f << QString::fromLatin1("QAudioFormat(44100Hz, -1bit, channelCount=4, sampleType=UnSignedInt, byteOrder=BigEndian, codec=\"audio/pcm\") "); } void tst_QAudioFormat::debugOperator() { QFETCH(QAudioFormat, format); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << format; } QTEST_MAIN(tst_QAudioFormat) #include "tst_qaudioformat.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudionamespace/000077500000000000000000000000001225012771600310275ustar00rootroot00000000000000qaudionamespace.pro000066400000000000000000000002461225012771600346330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudionamespaceCONFIG += testcase TARGET = tst_qaudionamespace QT += core multimedia-private testlib SOURCES += tst_qaudionamespace.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudionamespace.cpp000066400000000000000000000074521225012771600355150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudionamespace/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include "qaudio.h" // Adds an enum, and the stringized version #define ADD_ENUM_TEST(x) \ QTest::newRow(#x) \ << QAudio::x \ << QString(QLatin1String(#x)); class tst_QAudioNamespace : public QObject { Q_OBJECT private slots: void debugError(); void debugError_data(); void debugState(); void debugState_data(); void debugMode(); void debugMode_data(); }; void tst_QAudioNamespace::debugError_data() { QTest::addColumn("error"); QTest::addColumn("stringized"); ADD_ENUM_TEST(NoError); ADD_ENUM_TEST(OpenError); ADD_ENUM_TEST(IOError); ADD_ENUM_TEST(UnderrunError); ADD_ENUM_TEST(FatalError); } void tst_QAudioNamespace::debugError() { QFETCH(QAudio::Error, error); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << error; } void tst_QAudioNamespace::debugState_data() { QTest::addColumn("state"); QTest::addColumn("stringized"); ADD_ENUM_TEST(ActiveState); ADD_ENUM_TEST(SuspendedState); ADD_ENUM_TEST(StoppedState); ADD_ENUM_TEST(IdleState); } void tst_QAudioNamespace::debugState() { QFETCH(QAudio::State, state); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << state; } void tst_QAudioNamespace::debugMode_data() { QTest::addColumn("mode"); QTest::addColumn("stringized"); ADD_ENUM_TEST(AudioInput); ADD_ENUM_TEST(AudioOutput); } void tst_QAudioNamespace::debugMode() { QFETCH(QAudio::Mode, mode); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << mode; } QTEST_MAIN(tst_QAudioNamespace) #include "tst_qaudionamespace.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioprobe/000077500000000000000000000000001225012771600302025ustar00rootroot00000000000000qaudioprobe.pro000066400000000000000000000004221225012771600331550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioprobeCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qaudioprobe QT += multimedia-private testlib SOURCES += tst_qaudioprobe.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockrecorder.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudioprobe.cpp000066400000000000000000000130761225012771600340420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudioprobe/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include //TESTED_COMPONENT=src/multimedia #include "mockmediaserviceprovider.h" #include "mockmediarecorderservice.h" #include "mockmediaobject.h" QT_USE_NAMESPACE class tst_QAudioProbe: public QObject { Q_OBJECT public slots: void init(); void cleanup(); private slots: void testNullService(); void testNullControl(); void testRecorder(); void testRecorderDeleteRecorder(); void testRecorderDeleteProbe(); void testMediaObject(); private: QAudioRecorder *recorder; MockMediaRecorderControl *mockMediaRecorderControl; MockMediaRecorderService *mockMediaRecorderService; MockMediaServiceProvider *mockProvider; }; void tst_QAudioProbe::init() { mockMediaRecorderControl = new MockMediaRecorderControl(this); mockMediaRecorderService = new MockMediaRecorderService(this, mockMediaRecorderControl); mockProvider = new MockMediaServiceProvider(mockMediaRecorderService); mockProvider->deleteServiceOnRelease = true; recorder = 0; QMediaServiceProvider::setDefaultServiceProvider(mockProvider); } void tst_QAudioProbe::cleanup() { delete recorder; delete mockProvider; delete mockMediaRecorderControl; mockMediaRecorderControl = 0; mockMediaRecorderService = 0; mockProvider = 0; recorder = 0; } void tst_QAudioProbe::testNullService() { mockProvider->service = 0; recorder = new QAudioRecorder; QVERIFY(!recorder->isAvailable()); QCOMPARE(recorder->availability(), QMultimedia::ServiceMissing); QAudioProbe probe; QVERIFY(!probe.isActive()); QVERIFY(!probe.setSource(recorder)); QVERIFY(!probe.isActive()); delete recorder; recorder = 0; QVERIFY(!probe.isActive()); } void tst_QAudioProbe::testNullControl() { mockMediaRecorderService->hasControls = false; recorder = new QAudioRecorder; QVERIFY(!recorder->isAvailable()); QCOMPARE(recorder->availability(), QMultimedia::ServiceMissing); QAudioProbe probe; QVERIFY(!probe.isActive()); QVERIFY(!probe.setSource(recorder)); QVERIFY(!probe.isActive()); delete recorder; recorder = 0; QVERIFY(!probe.isActive()); } void tst_QAudioProbe::testRecorder() { recorder = new QAudioRecorder; QVERIFY(recorder->isAvailable()); QAudioProbe probe; QVERIFY(!probe.isActive()); QVERIFY(probe.setSource(recorder)); QVERIFY(probe.isActive()); probe.setSource((QMediaRecorder*)0); QVERIFY(!probe.isActive()); } void tst_QAudioProbe::testRecorderDeleteRecorder() { recorder = new QAudioRecorder; QVERIFY(recorder->isAvailable()); QAudioProbe probe; QVERIFY(!probe.isActive()); QVERIFY(probe.setSource(recorder)); QVERIFY(probe.isActive()); delete recorder; recorder = 0; QVERIFY(!probe.isActive()); probe.setSource((QMediaRecorder*)0); QVERIFY(!probe.isActive()); } void tst_QAudioProbe::testRecorderDeleteProbe() { recorder = new QAudioRecorder; QVERIFY(recorder->isAvailable()); QAudioProbe *probe = new QAudioProbe; QVERIFY(!probe->isActive()); QVERIFY(probe->setSource(recorder)); QVERIFY(probe->isActive()); delete probe; QVERIFY(recorder->isAvailable()); } void tst_QAudioProbe::testMediaObject() { QMediaObject *object = new MockMediaObject(0, mockMediaRecorderService); QVERIFY(object->isAvailable()); QAudioProbe probe; QVERIFY(!probe.isActive()); QVERIFY(probe.setSource(object)); QVERIFY(probe.isActive()); probe.setSource((QMediaObject*)0); QVERIFY(!probe.isActive()); delete object; } QTEST_GUILESS_MAIN(tst_QAudioProbe) #include "tst_qaudioprobe.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiorecorder/000077500000000000000000000000001225012771600307005ustar00rootroot00000000000000qaudiorecorder.pro000066400000000000000000000004301225012771600343500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiorecorderCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qaudiorecorder QT += multimedia-private testlib SOURCES += tst_qaudiorecorder.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockrecorder.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qaudiorecorder.cpp000066400000000000000000000144111225012771600352300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qaudiorecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include //TESTED_COMPONENT=src/multimedia #include "mockmediaserviceprovider.h" #include "mockmediarecorderservice.h" QT_USE_NAMESPACE class tst_QAudioRecorder: public QObject { Q_OBJECT public slots: void init(); void cleanup(); private slots: void testNullService(); void testNullControl(); void testAudioSource(); void testDevices(); void testAvailability(); void testAvailableAudioInputChangedSignal(); private: QAudioRecorder *audiosource; MockMediaRecorderService *mockMediaRecorderService; MockMediaServiceProvider *mockProvider; }; void tst_QAudioRecorder::init() { mockMediaRecorderService = new MockMediaRecorderService(this, new MockMediaRecorderControl(this)); mockProvider = new MockMediaServiceProvider(mockMediaRecorderService); audiosource = 0; QMediaServiceProvider::setDefaultServiceProvider(mockProvider); } void tst_QAudioRecorder::cleanup() { delete mockMediaRecorderService; delete mockProvider; delete audiosource; mockMediaRecorderService = 0; mockProvider = 0; audiosource = 0; } void tst_QAudioRecorder::testNullService() { mockProvider->service = 0; QAudioRecorder source; QVERIFY(!source.isAvailable()); QCOMPARE(source.availability(), QMultimedia::ServiceMissing); QCOMPARE(source.audioInputs().size(), 0); QCOMPARE(source.defaultAudioInput(), QString()); QCOMPARE(source.audioInput(), QString()); } void tst_QAudioRecorder::testNullControl() { mockMediaRecorderService->hasControls = false; QAudioRecorder source; QVERIFY(!source.isAvailable()); QCOMPARE(source.availability(), QMultimedia::ServiceMissing); QCOMPARE(source.audioInputs().size(), 0); QCOMPARE(source.defaultAudioInput(), QString()); QCOMPARE(source.audioInput(), QString()); QCOMPARE(source.audioInputDescription("blah"), QString()); QSignalSpy deviceNameSpy(&source, SIGNAL(audioInputChanged(QString))); source.setAudioInput("blah"); QCOMPARE(deviceNameSpy.count(), 0); } void tst_QAudioRecorder::testAudioSource() { audiosource = new QAudioRecorder; QCOMPARE(audiosource->mediaObject()->service(),(QMediaService *) mockMediaRecorderService); } void tst_QAudioRecorder::testDevices() { audiosource = new QAudioRecorder; QList devices = audiosource->audioInputs(); QVERIFY(devices.size() > 0); QVERIFY(devices.at(0).compare("device1") == 0); QVERIFY(audiosource->audioInputDescription("device1").compare("dev1 comment") == 0); QVERIFY(audiosource->defaultAudioInput() == "device1"); QVERIFY(audiosource->isAvailable() == true); QSignalSpy checkSignal(audiosource, SIGNAL(audioInputChanged(QString))); audiosource->setAudioInput("device2"); QVERIFY(audiosource->audioInput().compare("device2") == 0); QVERIFY(checkSignal.count() == 1); QVERIFY(audiosource->isAvailable() == true); } void tst_QAudioRecorder::testAvailability() { QAudioRecorder source; QVERIFY(source.isAvailable()); QCOMPARE(source.availability(), QMultimedia::Available); } void tst_QAudioRecorder::testAvailableAudioInputChangedSignal() { // The availabilityChangedSignal is implemented in QAudioRecorder. SO using it to test the signal. audiosource = new QAudioRecorder; /* Spy the signal availableInputsChanged and audioInputchanged */ QSignalSpy changed(mockMediaRecorderService->mockAudioInputSelector, SIGNAL(availableInputsChanged())); QSignalSpy audioInputchange(audiosource, SIGNAL(availableAudioInputsChanged())); /* Add the end points and verify if the available end point changed signal is emitted. */ QMetaObject::invokeMethod(mockMediaRecorderService->mockAudioInputSelector, "addInputs"); QVERIFY(changed.count() == 1); QVERIFY(audioInputchange.count() == 1); /* Now try removes */ changed.clear(); audioInputchange.clear(); QMetaObject::invokeMethod(mockMediaRecorderService->mockAudioInputSelector, "removeInputs"); QVERIFY(changed.count() == 1); QVERIFY(audioInputchange.count() == 1); } QTEST_GUILESS_MAIN(tst_QAudioRecorder) #include "tst_qaudiorecorder.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamera/000077500000000000000000000000001225012771600273015ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamera/qcamera.pro000066400000000000000000000003511225012771600314330ustar00rootroot00000000000000CONFIG += testcase TARGET = tst_qcamera QT += multimedia-private testlib include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockcamera.pri) SOURCES += tst_qcamera.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamera/tst_qcamera.cpp000066400000000000000000002224101225012771600323110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mockcameraservice.h" #include "mockmediaserviceprovider.h" #include "mockvideosurface.h" #include "mockvideorenderercontrol.h" #include "mockvideowindowcontrol.h" QT_USE_NAMESPACE class tst_QCamera: public QObject { Q_OBJECT public slots: void initTestCase(); void init(); void cleanup(); private slots: void testSimpleCamera(); void testSimpleCameraWhiteBalance(); void testSimpleCameraExposure(); void testSimpleCameraFocus(); void testSimpleCameraCapture(); void testSimpleCameraLock(); void testSimpleCaptureDestination(); void testSimpleCaptureFormat(); void testCameraWhiteBalance(); void testCameraExposure(); void testCameraFocus(); void testCameraCapture(); void testCameraCaptureMetadata(); void testImageSettings(); void testCameraLock(); void testCameraLockCancel(); void testCameraEncodingProperyChange(); void testCaptureDestination(); void testCaptureFormat(); void testConstructorWithDefaultProvider(); void testCaptureMode(); void testIsCaptureModeSupported(); void testRequestedLocks(); void testSupportedLocks(); void testQCameraIsAvailable(); void testQCameraIsNotAvailable(); void testSearchAndLockWithLockTypes(); void testSetCaptureMode(); void testUnlockWithType(); void testCaptureModeChangedSignal(); void testLockStatusChangedWithTypesSignal(); void testErrorSignal(); void testError(); void testErrorString(); void testStatus(); void testLockType(); void testLockChangeReason(); // Test cases to for QCameraFocus void testCameraFocusIsAvailable(); void testFocusModes(); void testOpticalAndDigitalZoomChanged(); void testMaxOpticalZoomChangedSignal(); void testMaxDigitalZoomChangedSignal(); void testfocusZonesChangedSignal(); // Test cases for QCameraControl class. void testCameraControl(); void testCaptureModeChanged_signal(); void testEnumsOfQCameraControl(); // Test case for QCameraImageProcessing class void testContrast(); void testDenoisingLevel(); void testIsAvailable(); void testSaturation(); void testSharpeningLevel(); void testEnumOfQCameraImageProcessing(); void testSetVideoOutput(); void testSetVideoOutputNoService(); void testSetVideoOutputNoControl(); void testSetVideoOutputDestruction(); void testEnumDebug(); // constructor for QCameraImageProceesing void testImageProcessingControl(); // Signals test cases for QCameraExposure void testSignalApertureChanged(); void testSignalExposureCompensationChanged(); void testSignalIsoSensitivityChanged(); void testSignalShutterSpeedChanged(); void testSignalFlashReady(); // test constructor void testExposureControlConstructor(); private: MockSimpleCameraService *mockSimpleCameraService; MockCameraService *mockCameraService; MockMediaServiceProvider *provider; }; void tst_QCamera::initTestCase() { } void tst_QCamera::init() { provider = new MockMediaServiceProvider; mockSimpleCameraService = new MockSimpleCameraService; mockCameraService = new MockCameraService; provider->service = mockCameraService; QMediaServiceProvider::setDefaultServiceProvider(provider); } void tst_QCamera::cleanup() { delete provider; delete mockCameraService; delete mockSimpleCameraService; } void tst_QCamera::testSimpleCamera() { provider->service = mockSimpleCameraService; QCamera camera; QCOMPARE(camera.service(), (QMediaService*)mockSimpleCameraService); QCOMPARE(camera.state(), QCamera::UnloadedState); camera.start(); QCOMPARE(camera.state(), QCamera::ActiveState); camera.stop(); QCOMPARE(camera.state(), QCamera::LoadedState); camera.unload(); QCOMPARE(camera.state(), QCamera::UnloadedState); camera.load(); QCOMPARE(camera.state(), QCamera::LoadedState); } void tst_QCamera::testSimpleCameraWhiteBalance() { provider->service = mockSimpleCameraService; QCamera camera; //only WhiteBalanceAuto is supported QVERIFY(!camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceAuto)); QVERIFY(!camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceCloudy)); QCOMPARE(camera.imageProcessing()->whiteBalanceMode(), QCameraImageProcessing::WhiteBalanceAuto); camera.imageProcessing()->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceCloudy); QCOMPARE(camera.imageProcessing()->whiteBalanceMode(), QCameraImageProcessing::WhiteBalanceAuto); QCOMPARE(camera.imageProcessing()->manualWhiteBalance()+1.0, 1.0); camera.imageProcessing()->setManualWhiteBalance(5000); QCOMPARE(camera.imageProcessing()->manualWhiteBalance()+1.0, 1.0); } void tst_QCamera::testSimpleCameraExposure() { provider->service = mockSimpleCameraService; QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); QVERIFY(cameraExposure != 0); QVERIFY(!cameraExposure->isExposureModeSupported(QCameraExposure::ExposureAuto)); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureAuto); cameraExposure->setExposureMode(QCameraExposure::ExposureManual);//should be ignored QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureAuto); QVERIFY(!cameraExposure->isFlashModeSupported(QCameraExposure::FlashOff)); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashOff); QCOMPARE(cameraExposure->isFlashReady(), false); cameraExposure->setFlashMode(QCameraExposure::FlashOn); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashOff); QVERIFY(!cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringAverage)); QVERIFY(!cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringSpot)); QVERIFY(!cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringMatrix)); QCOMPARE(cameraExposure->meteringMode(), QCameraExposure::MeteringMatrix); cameraExposure->setMeteringMode(QCameraExposure::MeteringSpot); QCOMPARE(cameraExposure->meteringMode(), QCameraExposure::MeteringMatrix); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF()); cameraExposure->setSpotMeteringPoint(QPointF(0.5f, 0.5f)); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF()); QCOMPARE(cameraExposure->exposureCompensation(), 0.0); cameraExposure->setExposureCompensation(2.0); QCOMPARE(cameraExposure->exposureCompensation(), 0.0); QCOMPARE(cameraExposure->isoSensitivity(), -1); QVERIFY(cameraExposure->supportedIsoSensitivities().isEmpty()); cameraExposure->setManualIsoSensitivity(100); QCOMPARE(cameraExposure->isoSensitivity(), -1); cameraExposure->setAutoIsoSensitivity(); QCOMPARE(cameraExposure->isoSensitivity(), -1); QVERIFY(cameraExposure->aperture() < 0); QVERIFY(cameraExposure->supportedApertures().isEmpty()); cameraExposure->setAutoAperture(); QVERIFY(cameraExposure->aperture() < 0); cameraExposure->setManualAperture(5.6); QVERIFY(cameraExposure->aperture() < 0); QVERIFY(cameraExposure->shutterSpeed() < 0); QVERIFY(cameraExposure->supportedShutterSpeeds().isEmpty()); cameraExposure->setAutoShutterSpeed(); QVERIFY(cameraExposure->shutterSpeed() < 0); cameraExposure->setManualShutterSpeed(1/128.0); QVERIFY(cameraExposure->shutterSpeed() < 0); } void tst_QCamera::testSimpleCameraFocus() { provider->service = mockSimpleCameraService; QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::AutoFocus)); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::ContinuousFocus)); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::InfinityFocus)); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); QTest::ignoreMessage(QtWarningMsg, "Focus mode selection is not supported"); cameraFocus->setFocusMode(QCameraFocus::ContinuousFocus); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); QCOMPARE(cameraFocus->maximumOpticalZoom(), 1.0); QCOMPARE(cameraFocus->maximumDigitalZoom(), 1.0); QCOMPARE(cameraFocus->opticalZoom(), 1.0); QCOMPARE(cameraFocus->digitalZoom(), 1.0); QTest::ignoreMessage(QtWarningMsg, "The camera doesn't support zooming."); cameraFocus->zoomTo(100.0, 100.0); QCOMPARE(cameraFocus->opticalZoom(), 1.0); QCOMPARE(cameraFocus->digitalZoom(), 1.0); QVERIFY(!cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointAuto)); QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); QTest::ignoreMessage(QtWarningMsg, "Focus points mode selection is not supported"); cameraFocus->setFocusPointMode( QCameraFocus::FocusPointCenter ); QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); QCOMPARE(cameraFocus->customFocusPoint(), QPointF(0.5, 0.5)); QTest::ignoreMessage(QtWarningMsg, "Focus points selection is not supported"); cameraFocus->setCustomFocusPoint(QPointF(1.0, 1.0)); QCOMPARE(cameraFocus->customFocusPoint(), QPointF(0.5, 0.5)); } void tst_QCamera::testSimpleCameraCapture() { provider->service = mockSimpleCameraService; QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(!imageCapture.isReadyForCapture()); QVERIFY(!imageCapture.isAvailable()); QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); QSignalSpy errorSignal(&imageCapture, SIGNAL(error(int, QCameraImageCapture::Error,QString))); imageCapture.capture(QString::fromLatin1("/dev/null")); QCOMPARE(errorSignal.size(), 1); QCOMPARE(imageCapture.error(), QCameraImageCapture::NotSupportedFeatureError); QVERIFY(!imageCapture.errorString().isEmpty()); } void tst_QCamera::testSimpleCameraLock() { provider->service = mockSimpleCameraService; QCamera camera; QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockExposure), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockFocus), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockWhiteBalance), QCamera::Unlocked); QSignalSpy lockedSignal(&camera, SIGNAL(locked())); QSignalSpy lockFailedSignal(&camera, SIGNAL(lockFailed())); QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason))); camera.searchAndLock(); QCOMPARE(camera.lockStatus(), QCamera::Locked); QCOMPARE(camera.lockStatus(QCamera::LockExposure), QCamera::Locked); QCOMPARE(camera.lockStatus(QCamera::LockFocus), QCamera::Locked); QCOMPARE(camera.lockStatus(QCamera::LockWhiteBalance), QCamera::Locked); QCOMPARE(lockedSignal.count(), 1); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); camera.unlock(); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockExposure), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockFocus), QCamera::Unlocked); QCOMPARE(camera.lockStatus(QCamera::LockWhiteBalance), QCamera::Unlocked); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); } void tst_QCamera::testSimpleCaptureDestination() { provider->service = mockSimpleCameraService; QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isCaptureDestinationSupported(QCameraImageCapture::CaptureToFile)); QVERIFY(!imageCapture.isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer)); QVERIFY(!imageCapture.isCaptureDestinationSupported( QCameraImageCapture::CaptureToBuffer | QCameraImageCapture::CaptureToFile)); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToFile); imageCapture.setCaptureDestination(QCameraImageCapture::CaptureToBuffer); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToFile); } void tst_QCamera::testSimpleCaptureFormat() { provider->service = mockSimpleCameraService; QCamera camera; QCameraImageCapture imageCapture(&camera); QCOMPARE(imageCapture.bufferFormat(), QVideoFrame::Format_Invalid); QVERIFY(imageCapture.supportedBufferFormats().isEmpty()); imageCapture.setBufferFormat(QVideoFrame::Format_AdobeDng); QCOMPARE(imageCapture.bufferFormat(), QVideoFrame::Format_Invalid); } void tst_QCamera::testCaptureDestination() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isCaptureDestinationSupported(QCameraImageCapture::CaptureToFile)); QVERIFY(imageCapture.isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer)); QVERIFY(!imageCapture.isCaptureDestinationSupported( QCameraImageCapture::CaptureToBuffer | QCameraImageCapture::CaptureToFile)); QSignalSpy destinationChangedSignal(&imageCapture, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations))); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToFile); imageCapture.setCaptureDestination(QCameraImageCapture::CaptureToBuffer); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToBuffer); QCOMPARE(destinationChangedSignal.size(), 1); QCOMPARE(destinationChangedSignal.first().first().value(), QCameraImageCapture::CaptureToBuffer); //not supported combination imageCapture.setCaptureDestination(QCameraImageCapture::CaptureToBuffer | QCameraImageCapture::CaptureToFile); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToBuffer); QCOMPARE(destinationChangedSignal.size(), 1); } void tst_QCamera::testCaptureFormat() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy formatChangedSignal(&imageCapture, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat))); QCOMPARE(imageCapture.bufferFormat(), QVideoFrame::Format_Jpeg); QCOMPARE(imageCapture.supportedBufferFormats().size(), 3); imageCapture.setBufferFormat(QVideoFrame::Format_AdobeDng); QCOMPARE(imageCapture.bufferFormat(), QVideoFrame::Format_AdobeDng); QCOMPARE(formatChangedSignal.size(), 1); QCOMPARE(formatChangedSignal.first().first().value(), QVideoFrame::Format_AdobeDng); imageCapture.setBufferFormat(QVideoFrame::Format_Y16); QCOMPARE(imageCapture.bufferFormat(), QVideoFrame::Format_AdobeDng); QCOMPARE(formatChangedSignal.size(), 1); } void tst_QCamera::testCameraCapture() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(!imageCapture.isReadyForCapture()); QSignalSpy capturedSignal(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QSignalSpy errorSignal(&imageCapture, SIGNAL(error(int, QCameraImageCapture::Error,QString))); imageCapture.capture(QString::fromLatin1("/dev/null")); QCOMPARE(capturedSignal.size(), 0); QCOMPARE(errorSignal.size(), 1); QCOMPARE(imageCapture.error(), QCameraImageCapture::NotReadyError); errorSignal.clear(); camera.start(); QVERIFY(imageCapture.isReadyForCapture()); QCOMPARE(errorSignal.size(), 0); imageCapture.capture(QString::fromLatin1("/dev/null")); QTRY_COMPARE(capturedSignal.size(), 1); QCOMPARE(errorSignal.size(), 0); QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); } void tst_QCamera::testCameraCaptureMetadata() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,QString,QVariant))); QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString))); camera.start(); int id = imageCapture.capture(QString::fromLatin1("/dev/null")); QTRY_COMPARE(savedSignal.size(), 1); QCOMPARE(metadataSignal.size(), 3); QVariantList metadata = metadataSignal[0]; QCOMPARE(metadata[0].toInt(), id); QCOMPARE(metadata[1].toString(), QMediaMetaData::FocalLengthIn35mmFilm); QCOMPARE(metadata[2].value().toInt(), 50); metadata = metadataSignal[1]; QCOMPARE(metadata[0].toInt(), id); QCOMPARE(metadata[1].toString(), QMediaMetaData::DateTimeOriginal); QDateTime captureTime = metadata[2].value().value(); QVERIFY(qAbs(captureTime.secsTo(QDateTime::currentDateTime()) < 5)); //it should not takes more than 5 seconds for signal to arrive here metadata = metadataSignal[2]; QCOMPARE(metadata[0].toInt(), id); QCOMPARE(metadata[1].toString(), QLatin1String("Answer to the Ultimate Question of Life, the Universe, and Everything")); QCOMPARE(metadata[2].value().toInt(), 42); } void tst_QCamera::testCameraWhiteBalance() { QSet whiteBalanceModes; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceAuto; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceFlash; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceTungsten; MockCameraService service; service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceFlash); service.mockImageProcessingControl->setSupportedWhiteBalanceModes(whiteBalanceModes); service.mockImageProcessingControl->setParameter( QCameraImageProcessingControl::ColorTemperature, QVariant(34)); provider->service = &service; QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QCOMPARE(cameraImageProcessing->whiteBalanceMode(), QCameraImageProcessing::WhiteBalanceFlash); QVERIFY(camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceAuto)); QVERIFY(camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceFlash)); QVERIFY(camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceTungsten)); QVERIFY(!camera.imageProcessing()->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceCloudy)); cameraImageProcessing->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceTungsten); QCOMPARE(cameraImageProcessing->whiteBalanceMode(), QCameraImageProcessing::WhiteBalanceTungsten); cameraImageProcessing->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceManual); QCOMPARE(cameraImageProcessing->whiteBalanceMode(), QCameraImageProcessing::WhiteBalanceManual); QCOMPARE(cameraImageProcessing->manualWhiteBalance(), 34.0); cameraImageProcessing->setManualWhiteBalance(432.0); QCOMPARE(cameraImageProcessing->manualWhiteBalance(), 432.0); } void tst_QCamera::testCameraExposure() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); QVERIFY(cameraExposure != 0); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureAuto)); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureAuto); // Test Cases For QCameraExposure QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureManual)); cameraExposure->setExposureMode(QCameraExposure::ExposureManual); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureManual); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureNight)); cameraExposure->setExposureMode(QCameraExposure::ExposureNight); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureNight); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureBacklight)); cameraExposure->setExposureMode(QCameraExposure::ExposureBacklight); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureBacklight); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureSpotlight )); cameraExposure->setExposureMode(QCameraExposure::ExposureSpotlight); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureSpotlight); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureSports )); cameraExposure->setExposureMode(QCameraExposure::ExposureSports); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureSports); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureSnow )); cameraExposure->setExposureMode(QCameraExposure::ExposureSnow); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureSnow); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureBeach )); cameraExposure->setExposureMode(QCameraExposure::ExposureBeach); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureBeach); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureLargeAperture )); cameraExposure->setExposureMode(QCameraExposure::ExposureLargeAperture); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureLargeAperture); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureSmallAperture )); cameraExposure->setExposureMode(QCameraExposure::ExposureSmallAperture); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureSmallAperture); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposurePortrait )); cameraExposure->setExposureMode(QCameraExposure::ExposurePortrait); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposurePortrait); QVERIFY(cameraExposure->isExposureModeSupported(QCameraExposure::ExposureModeVendor )); cameraExposure->setExposureMode(QCameraExposure::ExposureModeVendor); QCOMPARE(cameraExposure->exposureMode(), QCameraExposure::ExposureModeVendor); cameraExposure->setFlashMode(QCameraExposure::FlashAuto); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashAuto); QCOMPARE(cameraExposure->isFlashReady(), true); cameraExposure->setFlashMode(QCameraExposure::FlashRedEyeReduction); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashRedEyeReduction); cameraExposure->setFlashMode(QCameraExposure::FlashOn); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashOn); cameraExposure->setFlashMode(QCameraExposure::FlashFill); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashFill); cameraExposure->setFlashMode(QCameraExposure::FlashTorch); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashTorch); cameraExposure->setFlashMode(QCameraExposure::FlashSlowSyncFrontCurtain); QCOMPARE(cameraExposure->flashMode(), QCameraExposure::FlashSlowSyncFrontCurtain); QVERIFY(!cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringAverage)); QVERIFY(cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringSpot)); QVERIFY(cameraExposure->isMeteringModeSupported(QCameraExposure::MeteringMatrix)); cameraExposure->setMeteringMode(QCameraExposure::MeteringMatrix); QCOMPARE(cameraExposure->meteringMode(), QCameraExposure::MeteringMatrix); //MeteringAverage is not supported, metering mode should not be changed cameraExposure->setMeteringMode(QCameraExposure::MeteringAverage); QCOMPARE(cameraExposure->meteringMode(), QCameraExposure::MeteringMatrix); cameraExposure->setMeteringMode(QCameraExposure::MeteringSpot); QCOMPARE(cameraExposure->meteringMode(), QCameraExposure::MeteringSpot); cameraExposure->setSpotMeteringPoint(QPointF(0.5f, 0.25f)); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF(0.5f, 0.25f)); cameraExposure->setSpotMeteringPoint(QPointF(0.25f, 56.3f)); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF(0.5f, 0.25f)); cameraExposure->setSpotMeteringPoint(QPointF(0, 0)); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF(0, 0)); cameraExposure->setSpotMeteringPoint(QPointF(1, 1)); QCOMPARE(cameraExposure->spotMeteringPoint(), QPointF(1, 1)); QCOMPARE(cameraExposure->exposureCompensation(), 0.0); cameraExposure->setExposureCompensation(2.0); QCOMPARE(cameraExposure->exposureCompensation(), 2.0); int minIso = cameraExposure->supportedIsoSensitivities().first(); int maxIso = cameraExposure->supportedIsoSensitivities().last(); QVERIFY(cameraExposure->isoSensitivity() > 0); QCOMPARE(cameraExposure->requestedIsoSensitivity(), -1); QVERIFY(minIso > 0); QVERIFY(maxIso > 0); cameraExposure->setManualIsoSensitivity(minIso); QCOMPARE(cameraExposure->isoSensitivity(), minIso); cameraExposure->setManualIsoSensitivity(maxIso*10); QCOMPARE(cameraExposure->isoSensitivity(), maxIso); QCOMPARE(cameraExposure->requestedIsoSensitivity(), maxIso*10); cameraExposure->setManualIsoSensitivity(-10); QCOMPARE(cameraExposure->isoSensitivity(), minIso); QCOMPARE(cameraExposure->requestedIsoSensitivity(), -10); cameraExposure->setAutoIsoSensitivity(); QCOMPARE(cameraExposure->isoSensitivity(), 100); QCOMPARE(cameraExposure->requestedIsoSensitivity(), -1); QCOMPARE(cameraExposure->requestedAperture(), -1.0); qreal minAperture = cameraExposure->supportedApertures().first(); qreal maxAperture = cameraExposure->supportedApertures().last(); QVERIFY(minAperture > 0); QVERIFY(maxAperture > 0); QVERIFY(cameraExposure->aperture() >= minAperture); QVERIFY(cameraExposure->aperture() <= maxAperture); cameraExposure->setAutoAperture(); QVERIFY(cameraExposure->aperture() >= minAperture); QVERIFY(cameraExposure->aperture() <= maxAperture); QCOMPARE(cameraExposure->requestedAperture(), -1.0); cameraExposure->setManualAperture(0); QCOMPARE(cameraExposure->aperture(), minAperture); QCOMPARE(cameraExposure->requestedAperture()+1.0, 1.0); cameraExposure->setManualAperture(10000); QCOMPARE(cameraExposure->aperture(), maxAperture); QCOMPARE(cameraExposure->requestedAperture(), 10000.0); cameraExposure->setAutoAperture(); QCOMPARE(cameraExposure->requestedAperture(), -1.0); QCOMPARE(cameraExposure->requestedShutterSpeed(), -1.0); qreal minShutterSpeed = cameraExposure->supportedShutterSpeeds().first(); qreal maxShutterSpeed = cameraExposure->supportedShutterSpeeds().last(); QVERIFY(minShutterSpeed > 0); QVERIFY(maxShutterSpeed > 0); QVERIFY(cameraExposure->shutterSpeed() >= minShutterSpeed); QVERIFY(cameraExposure->shutterSpeed() <= maxShutterSpeed); cameraExposure->setAutoShutterSpeed(); QVERIFY(cameraExposure->shutterSpeed() >= minShutterSpeed); QVERIFY(cameraExposure->shutterSpeed() <= maxShutterSpeed); QCOMPARE(cameraExposure->requestedShutterSpeed(), -1.0); cameraExposure->setManualShutterSpeed(0); QCOMPARE(cameraExposure->shutterSpeed(), minShutterSpeed); QCOMPARE(cameraExposure->requestedShutterSpeed()+1.0, 1.0); cameraExposure->setManualShutterSpeed(10000); QCOMPARE(cameraExposure->shutterSpeed(), maxShutterSpeed); QCOMPARE(cameraExposure->requestedShutterSpeed(), 10000.0); cameraExposure->setAutoShutterSpeed(); QCOMPARE(cameraExposure->requestedShutterSpeed(), -1.0); } void tst_QCamera::testCameraFocus() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QVERIFY(cameraFocus->isFocusModeSupported(QCameraFocus::AutoFocus)); QVERIFY(cameraFocus->isFocusModeSupported(QCameraFocus::ContinuousFocus)); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::InfinityFocus)); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); cameraFocus->setFocusMode(QCameraFocus::ManualFocus); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); cameraFocus->setFocusMode(QCameraFocus::ContinuousFocus); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::ContinuousFocus); QVERIFY(cameraFocus->maximumOpticalZoom() >= 1.0); QVERIFY(cameraFocus->maximumDigitalZoom() >= 1.0); QCOMPARE(cameraFocus->opticalZoom(), 1.0); QCOMPARE(cameraFocus->digitalZoom(), 1.0); cameraFocus->zoomTo(0.5, 1.0); QCOMPARE(cameraFocus->opticalZoom(), 1.0); QCOMPARE(cameraFocus->digitalZoom(), 1.0); cameraFocus->zoomTo(2.0, 0.5); QCOMPARE(cameraFocus->opticalZoom(), 2.0); QCOMPARE(cameraFocus->digitalZoom(), 1.0); cameraFocus->zoomTo(2.0, 2.5); QCOMPARE(cameraFocus->opticalZoom(), 2.0); QCOMPARE(cameraFocus->digitalZoom(), 2.5); cameraFocus->zoomTo(2000000.0, 1000000.0); QVERIFY(qFuzzyCompare(cameraFocus->opticalZoom(), cameraFocus->maximumOpticalZoom())); QVERIFY(qFuzzyCompare(cameraFocus->digitalZoom(), cameraFocus->maximumDigitalZoom())); QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointAuto)); QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointCenter)); QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointCustom)); QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); cameraFocus->setFocusPointMode( QCameraFocus::FocusPointCenter ); QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointCenter); cameraFocus->setFocusPointMode( QCameraFocus::FocusPointFaceDetection ); QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointCenter); QCOMPARE(cameraFocus->customFocusPoint(), QPointF(0.5, 0.5)); cameraFocus->setCustomFocusPoint(QPointF(1.0, 1.0)); QCOMPARE(cameraFocus->customFocusPoint(), QPointF(1.0, 1.0)); } void tst_QCamera::testImageSettings() { QImageEncoderSettings settings; QVERIFY(settings.isNull()); QVERIFY(settings == QImageEncoderSettings()); QCOMPARE(settings.codec(), QString()); settings.setCodec(QLatin1String("codecName")); QCOMPARE(settings.codec(), QLatin1String("codecName")); QVERIFY(!settings.isNull()); QVERIFY(settings != QImageEncoderSettings()); settings = QImageEncoderSettings(); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); settings.setQuality(QMultimedia::HighQuality); QCOMPARE(settings.quality(), QMultimedia::HighQuality); QVERIFY(!settings.isNull()); settings = QImageEncoderSettings(); QCOMPARE(settings.resolution(), QSize()); settings.setResolution(QSize(320,240)); QCOMPARE(settings.resolution(), QSize(320,240)); settings.setResolution(800,600); QCOMPARE(settings.resolution(), QSize(800,600)); QVERIFY(!settings.isNull()); settings = QImageEncoderSettings(); settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); QVariantMap options; options.insert(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); options.remove(QLatin1Literal("encoderOption")); settings.setEncodingOptions(options); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QImageEncoderSettings()); settings = QImageEncoderSettings(); QVERIFY(settings.isNull()); QCOMPARE(settings.codec(), QString()); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); QCOMPARE(settings.resolution(), QSize()); QVERIFY(settings.encodingOptions().isEmpty()); { QImageEncoderSettings settings1; QImageEncoderSettings settings2; QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } { QImageEncoderSettings settings1; QImageEncoderSettings settings2(settings1); QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } QImageEncoderSettings settings1; QImageEncoderSettings settings2; settings1 = QImageEncoderSettings(); settings1.setResolution(800,600); settings2 = QImageEncoderSettings(); settings2.setResolution(QSize(800,600)); QVERIFY(settings1 == settings2); settings2.setResolution(QSize(400,300)); QVERIFY(settings1 != settings2); settings1 = QImageEncoderSettings(); settings1.setCodec("codec1"); settings2 = QImageEncoderSettings(); settings2.setCodec("codec1"); QVERIFY(settings1 == settings2); settings2.setCodec("codec2"); QVERIFY(settings1 != settings2); settings1 = QImageEncoderSettings(); settings1.setQuality(QMultimedia::NormalQuality); settings2 = QImageEncoderSettings(); settings2.setQuality(QMultimedia::NormalQuality); QVERIFY(settings1 == settings2); settings2.setQuality(QMultimedia::LowQuality); QVERIFY(settings1 != settings2); settings1 = QImageEncoderSettings(); settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); settings2 = QImageEncoderSettings(); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } void tst_QCamera::testCameraLock() { QCamera camera; camera.focus()->setFocusMode(QCameraFocus::AutoFocus); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QSignalSpy lockedSignal(&camera, SIGNAL(locked())); QSignalSpy lockFailedSignal(&camera, SIGNAL(lockFailed())); QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason))); camera.searchAndLock(); QCOMPARE(camera.lockStatus(), QCamera::Searching); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); QTRY_COMPARE(camera.lockStatus(), QCamera::Locked); QCOMPARE(lockedSignal.count(), 1); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); camera.searchAndLock(); QCOMPARE(camera.lockStatus(), QCamera::Searching); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); camera.unlock(); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); } void tst_QCamera::testCameraLockCancel() { MockCameraService service; provider->service = &service; QCamera camera(0, provider); camera.focus()->setFocusMode(QCameraFocus::AutoFocus); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QSignalSpy lockedSignal(&camera, SIGNAL(locked())); QSignalSpy lockFailedSignal(&camera, SIGNAL(lockFailed())); QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason))); camera.searchAndLock(); QCOMPARE(camera.lockStatus(), QCamera::Searching); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); camera.unlock(); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); } void tst_QCamera::testCameraEncodingProperyChange() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State))); QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); camera.start(); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 1); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); camera.setCaptureMode(QCamera::CaptureVideo); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); //backens should not be stopped since the capture mode is Video imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 0); camera.setCaptureMode(QCamera::CaptureStillImage); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); stateChangedSignal.clear(); statusChangedSignal.clear(); //the settings change should trigger camera stop/start imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); //the settings change should trigger camera stop/start only once camera.setCaptureMode(QCamera::CaptureVideo); camera.setCaptureMode(QCamera::CaptureStillImage); imageCapture.setEncodingSettings(QImageEncoderSettings()); imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); } void tst_QCamera::testSetVideoOutput() { MockVideoSurface surface; QCamera camera; camera.setViewfinder(reinterpret_cast(0)); camera.setViewfinder(reinterpret_cast(0)); QCOMPARE(mockCameraService->rendererRef, 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); QCOMPARE(mockCameraService->rendererRef, 1); camera.setViewfinder(reinterpret_cast(0)); QVERIFY(mockCameraService->rendererControl->surface() == 0); //rendererControl is released QCOMPARE(mockCameraService->rendererRef, 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); QCOMPARE(mockCameraService->rendererRef, 1); camera.setViewfinder(reinterpret_cast(0)); QVERIFY(mockCameraService->rendererControl->surface() == 0); //rendererControl is released QCOMPARE(mockCameraService->rendererRef, 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); QCOMPARE(mockCameraService->rendererRef, 1); } void tst_QCamera::testSetVideoOutputNoService() { MockVideoSurface surface; provider->service = 0; QCamera camera; camera.setViewfinder(&surface); // Nothing we can verify here other than it doesn't assert. } void tst_QCamera::testSetVideoOutputNoControl() { MockVideoSurface surface; MockCameraService service; service.rendererRef = 1; provider->service = &service; QCamera camera; camera.setViewfinder(&surface); QVERIFY(service.rendererControl->surface() == 0); } void tst_QCamera::testSetVideoOutputDestruction() { MockVideoSurface surface; MockCameraService service; provider->service = &service; { QCamera camera; camera.setViewfinder(&surface); QVERIFY(service.rendererControl->surface() == &surface); QCOMPARE(service.rendererRef, 1); } QVERIFY(service.rendererControl->surface() == 0); QCOMPARE(service.rendererRef, 0); } void tst_QCamera::testEnumDebug() { QTest::ignoreMessage(QtDebugMsg, "QCamera::ActiveState "); qDebug() << QCamera::ActiveState; QTest::ignoreMessage(QtDebugMsg, "QCamera::ActiveStatus "); qDebug() << QCamera::ActiveStatus; QTest::ignoreMessage(QtDebugMsg, "QCamera::CaptureVideo "); qDebug() << QCamera::CaptureVideo; QTest::ignoreMessage(QtDebugMsg, "QCamera::CameraError "); qDebug() << QCamera::CameraError; QTest::ignoreMessage(QtDebugMsg, "QCamera::Unlocked "); qDebug() << QCamera::Unlocked; QTest::ignoreMessage(QtDebugMsg, "QCamera::LockAcquired "); qDebug() << QCamera::LockAcquired; QTest::ignoreMessage(QtDebugMsg, "QCamera::NoLock "); qDebug() << QCamera::NoLock; QTest::ignoreMessage(QtDebugMsg, "QCamera::LockExposure "); qDebug() << QCamera::LockExposure; } void tst_QCamera::testCameraControl() { MockCameraControl *m_cameraControl=new MockCameraControl(this); QVERIFY(m_cameraControl != NULL); } /* Test case for constructor with default provider */ void tst_QCamera::testConstructorWithDefaultProvider() { QCamera *camera = new QCamera(0); QVERIFY(camera != NULL); QCOMPARE(camera->state(), QCamera::UnloadedState); delete camera; } /* captureModeChanged Signal test case. */ void tst_QCamera::testCaptureModeChanged_signal() { MockCameraControl *m_cameraControl= new MockCameraControl(this); QSignalSpy spy(m_cameraControl, SIGNAL(captureModeChanged(QCamera::CaptureModes))); QVERIFY(spy.size() == 0); m_cameraControl->setCaptureMode(QCamera::CaptureVideo); QVERIFY(spy.size() == 1); m_cameraControl->setCaptureMode(QCamera::CaptureStillImage); QVERIFY(spy.size() == 2); } /* Test case for captureMode */ void tst_QCamera::testCaptureMode() { QCamera camera; QVERIFY(camera.captureMode() == QCamera::CaptureStillImage); camera.setCaptureMode(QCamera::CaptureVideo); QVERIFY(camera.captureMode() == QCamera::CaptureVideo); } /* Test case for isCaptureModeSupported */ void tst_QCamera::testIsCaptureModeSupported() { QCamera camera; QVERIFY(camera.isCaptureModeSupported(QCamera::CaptureStillImage) == true); QVERIFY(camera.isCaptureModeSupported(QCamera::CaptureVideo) == true); } /* Test case for requestedLocks. LockType is stored in OR combination so all types of combinations are verified here.*/ void tst_QCamera::testRequestedLocks() { QCamera camera; QCOMPARE(camera.requestedLocks(),QCamera::NoLock); camera.searchAndLock(QCamera::LockExposure); QCOMPARE(camera.requestedLocks(),QCamera::LockExposure); camera.unlock(); camera.searchAndLock(QCamera::LockFocus); QCOMPARE(camera.requestedLocks(),QCamera::LockFocus ); camera.unlock(); camera.searchAndLock(QCamera::LockWhiteBalance); QCOMPARE(camera.requestedLocks(),QCamera::LockWhiteBalance); camera.unlock(); camera.searchAndLock(QCamera::LockExposure |QCamera::LockFocus ); QCOMPARE(camera.requestedLocks(),QCamera::LockExposure |QCamera::LockFocus ); camera.searchAndLock(QCamera::LockWhiteBalance); QCOMPARE(camera.requestedLocks(),QCamera::LockExposure |QCamera::LockFocus|QCamera::LockWhiteBalance ); camera.unlock(QCamera::LockExposure); QCOMPARE(camera.requestedLocks(),QCamera::LockFocus|QCamera::LockWhiteBalance ); camera.unlock(QCamera::LockFocus); camera.searchAndLock(QCamera::LockExposure |QCamera::LockWhiteBalance ); QCOMPARE(camera.requestedLocks(),QCamera::LockExposure|QCamera::LockWhiteBalance ); } /* Test case for supportedLocks() */ void tst_QCamera::testSupportedLocks() { QCamera camera; QCOMPARE(camera.supportedLocks(),QCamera::LockExposure | QCamera::LockFocus); } /* Test case for isAvailable */ void tst_QCamera::testQCameraIsAvailable() { QCamera camera; QVERIFY(camera.isAvailable()); QVERIFY(camera.availability() == QMultimedia::Available); } void tst_QCamera::testQCameraIsNotAvailable() { provider->service = 0; QCamera camera("random"); QCOMPARE(camera.error(), QCamera::ServiceMissingError); QVERIFY(!camera.isAvailable()); QCOMPARE(camera.availability(), QMultimedia::ServiceMissing); } /* Test case for searchAndLock ( QCamera::LockTypes locks ) */ void tst_QCamera::testSearchAndLockWithLockTypes() { QCamera camera; QCOMPARE(camera.lockStatus(), QCamera::Unlocked); /* Spy the signals */ QSignalSpy lockedSignal(&camera, SIGNAL(locked())); QSignalSpy lockFailedSignal(&camera, SIGNAL(lockFailed())); QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason))); QSignalSpy lockStatusChangedSignalWithType(&camera, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason))); /* search and lock the camera with QCamera::LockExposure and verify if the signal is emitted correctly */ camera.searchAndLock(QCamera::LockExposure); QCOMPARE(camera.lockStatus(), QCamera::Locked); QCOMPARE(lockedSignal.count(), 1); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); } /* Test case for setCaptureMode() */ void tst_QCamera::testSetCaptureMode() { QCamera camera; /* Set the capture mode and verify if it set correctly */ camera.setCaptureMode(QCamera::CaptureVideo); QVERIFY(camera.captureMode() == QCamera::CaptureVideo); camera.setCaptureMode(QCamera::CaptureStillImage); QVERIFY(camera.captureMode() == QCamera::CaptureStillImage); } /* Test case for unlock (QCamera::LockTypes) */ void tst_QCamera::testUnlockWithType() { QCamera camera; QCOMPARE(camera.lockStatus(), QCamera::Unlocked); /* Spy the signal */ QSignalSpy lockedSignal(&camera, SIGNAL(locked())); QSignalSpy lockFailedSignal(&camera, SIGNAL(lockFailed())); QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason))); QSignalSpy lockStatusChangedSignalWithType(&camera, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason))); /* lock the camera with QCamera::LockExposure and Verify if the signal is emitted correctly */ camera.searchAndLock(QCamera::LockExposure); QCOMPARE(camera.lockStatus(), QCamera::Locked); QCOMPARE(lockedSignal.count(), 1); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); /* Clear the signal */ lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); lockStatusChangedSignalWithType.clear(); /* Unlock the camera and verify if the signal is emitted correctly */ camera.unlock(QCamera::LockExposure); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); QCamera::LockType lockType = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(0)); QCamera::LockStatus lockStatus = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(1)); QVERIFY(lockType == QCamera::LockExposure); QVERIFY(lockStatus == QCamera::Unlocked); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); lockStatusChangedSignalWithType.clear(); /* Lock the camera with QCamera::LockFocus */ camera.searchAndLock(QCamera::LockFocus); lockedSignal.clear(); lockFailedSignal.clear(); lockStatusChangedSignal.clear(); lockStatusChangedSignalWithType.clear(); /* Unlock the camera and Verify if the signal is emitted correctly */ camera.unlock(QCamera::LockFocus); QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(lockedSignal.count(), 0); QCOMPARE(lockFailedSignal.count(), 0); QCOMPARE(lockStatusChangedSignal.count(), 1); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); lockType = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(0)); lockStatus = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(1)); QVERIFY(lockType == QCamera::LockFocus); QVERIFY(lockStatus == QCamera::Unlocked); } /* Test case for signal captureModeChanged(QCamera::CaptureModes) */ void tst_QCamera::testCaptureModeChangedSignal() { QCamera camera; QVERIFY(camera.captureMode() == QCamera::CaptureStillImage); qRegisterMetaType("QCamera::CaptureModes"); /* Spy the signal */ QSignalSpy lockCaptureModeChangedSignal(&camera, SIGNAL(captureModeChanged(QCamera::CaptureModes))); /* set the capture mode and Verify if the signal is emitted */ camera.setCaptureMode(QCamera::CaptureVideo); QVERIFY(camera.captureMode() == QCamera::CaptureVideo); QCOMPARE(lockCaptureModeChangedSignal.count(), 1); QCamera::CaptureModes lockCaptureMode = qvariant_cast(lockCaptureModeChangedSignal.at(0).at(0)); QVERIFY(lockCaptureMode == QCamera::CaptureVideo); } /* Test case for signal lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason) */ void tst_QCamera::testLockStatusChangedWithTypesSignal() { QCamera camera; QCOMPARE(camera.lockStatus(), QCamera::Unlocked); /* Spy the signal lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason) */ QSignalSpy lockStatusChangedSignalWithType(&camera, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason))); /* Lock the camera with type QCamera::LockExposure */ camera.searchAndLock(QCamera::LockExposure); /* Verify if the signal is emitted and lock status is set correclty */ QCOMPARE(camera.lockStatus(), QCamera::Locked); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); QCamera::LockType lockType = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(0)); QCamera::LockStatus lockStatus = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(1)); QVERIFY(lockType == QCamera::LockExposure); QVERIFY(lockStatus == QCamera::Locked); lockStatusChangedSignalWithType.clear(); /* Unlock the camera */ camera.unlock(); /* Verify if the signal is emitted and lock status is set correclty */ QCOMPARE(camera.lockStatus(), QCamera::Unlocked); QCOMPARE(lockStatusChangedSignalWithType.count(), 1); lockType = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(0)); lockStatus = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(1)); QVERIFY(lockType == QCamera::LockExposure); QVERIFY(lockStatus == QCamera::Unlocked); } /* Test case for verifying if error signal generated correctly */ void tst_QCamera::testErrorSignal() { MockCameraService service; provider->service = &service; QCamera camera; QSignalSpy spyError(&camera, SIGNAL(error(QCamera::Error))); /* Set the QCameraControl error and verify if the signal is emitted correctly in QCamera */ service.mockControl->setError(QCamera::CameraError,QString("Camera Error")); QVERIFY(spyError.count() == 1); QCamera::Error err = qvariant_cast(spyError.at(0).at(0)); QVERIFY(err == QCamera::CameraError); spyError.clear(); /* Set the QCameraControl error and verify if the signal is emitted correctly in QCamera */ service.mockControl->setError(QCamera::InvalidRequestError,QString("InvalidRequestError Error")); QVERIFY(spyError.count() == 1); err = qvariant_cast(spyError.at(0).at(0)); QVERIFY(err == QCamera::InvalidRequestError); spyError.clear(); /* Set the QCameraControl error and verify if the signal is emitted correctly in QCamera */ service.mockControl->setError(QCamera::NotSupportedFeatureError,QString("NotSupportedFeatureError Error")); QVERIFY(spyError.count() == 1); err = qvariant_cast(spyError.at(0).at(0)); QVERIFY(err == QCamera::NotSupportedFeatureError); } /* Test case for verifying the QCamera error */ void tst_QCamera::testError() { MockCameraService service; provider->service = &service; QCamera camera; /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::CameraError,QString("Camera Error")); QVERIFY(camera.error() == QCamera::CameraError); /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::InvalidRequestError,QString("InvalidRequestError Error")); QVERIFY(camera.error() == QCamera::InvalidRequestError); /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::NotSupportedFeatureError,QString("NotSupportedFeatureError Error")); QVERIFY(camera.error() == QCamera::NotSupportedFeatureError); } /* Test the error strings for QCamera class */ void tst_QCamera::testErrorString() { MockCameraService service; provider->service = &service; QCamera camera; /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::CameraError,QString("Camera Error")); QVERIFY(camera.errorString() == QString("Camera Error")); /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::InvalidRequestError,QString("InvalidRequestError Error")); QVERIFY(camera.errorString() == QString("InvalidRequestError Error")); /* Set the QCameraControl error and verify if it is set correctly in QCamera */ service.mockControl->setError(QCamera::NotSupportedFeatureError,QString("NotSupportedFeatureError Error")); QVERIFY(camera.errorString() == QString("NotSupportedFeatureError Error")); } /* Test case for verifying Status of QCamera. */ void tst_QCamera::testStatus() { MockCameraService service; provider->service = &service; QCamera camera; /* Set the QCameraControl status and verify if it is set correctly in QCamera */ service.mockControl->setStatus(QCamera::StartingStatus); QVERIFY(camera.status() == QCamera::StartingStatus); /* Set the QCameraControl status and verify if it is set correctly in QCamera */ service.mockControl->setStatus(QCamera::StandbyStatus); QVERIFY(camera.status() == QCamera::StandbyStatus); /* Set the QCameraControl status and verify if it is set correctly in QCamera */ service.mockControl->setStatus(QCamera::LoadingStatus); QVERIFY(camera.status() == QCamera::LoadingStatus); /* Set the QCameraControl status and verify if it is set correctly in QCamera */ service.mockControl->setStatus(QCamera::UnavailableStatus); QVERIFY(camera.status() == QCamera::UnavailableStatus); } /* Test case for verifying default locktype QCamera::NoLock */ void tst_QCamera::testLockType() { QCamera camera; QCOMPARE(camera.requestedLocks(),QCamera::NoLock); } /* Test case for QCamera::LockChangeReason with QCamera::LockAcquired */ void tst_QCamera::testLockChangeReason() { MockCameraService service; provider->service = &service; QCamera camera; QSignalSpy lockStatusChangedSignalWithType(&camera, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus, QCamera::LockChangeReason))); /* Set the lockChangeReason */ service.mockLocksControl->setLockChangeReason(QCamera::LockAcquired); /* Verify if lockChangeReson is eqaul toQCamera::LockAcquired */ QCOMPARE(lockStatusChangedSignalWithType.count(), 1); QCamera::LockChangeReason LockChangeReason = qvariant_cast(lockStatusChangedSignalWithType.at(0).at(2)); QVERIFY(LockChangeReason == QCamera::LockAcquired); } /* All the enums test case for QCameraControl class*/ void tst_QCamera::testEnumsOfQCameraControl() { MockCameraControl *m_cameraControl = new MockCameraControl(this); bool result; // In still mode, can't change much QVERIFY(m_cameraControl->captureMode() == QCamera::CaptureStillImage); result = m_cameraControl->canChangeProperty(MockCameraControl::CaptureMode, QCamera::ActiveStatus); QVERIFY(!result); result = m_cameraControl->canChangeProperty(MockCameraControl::ImageEncodingSettings, QCamera::ActiveStatus); QVERIFY(!result); result = m_cameraControl->canChangeProperty(MockCameraControl::VideoEncodingSettings, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::Viewfinder, QCamera::ActiveStatus); QVERIFY(!result); // In video mode can change image encoding settings m_cameraControl->setCaptureMode(QCamera::CaptureVideo); result = m_cameraControl->canChangeProperty(MockCameraControl::ImageEncodingSettings, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::VideoEncodingSettings, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::Viewfinder, QCamera::ActiveStatus); QVERIFY(!result); // Flip the allow everything bit m_cameraControl->m_propertyChangesSupported = true; result = m_cameraControl->canChangeProperty(MockCameraControl::CaptureMode, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::ImageEncodingSettings, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::VideoEncodingSettings, QCamera::ActiveStatus); QVERIFY(result); result = m_cameraControl->canChangeProperty(MockCameraControl::Viewfinder, QCamera::ActiveStatus); QVERIFY(result); } // Test case for QCameraImageProcessing class void tst_QCamera::testContrast() { QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QVERIFY(cameraImageProcessing->contrast() ==0); cameraImageProcessing->setContrast(0.123); QCOMPARE(cameraImageProcessing->contrast(), 0.123); cameraImageProcessing->setContrast(4.56); QCOMPARE(cameraImageProcessing->contrast(), 4.56); } void tst_QCamera::testDenoisingLevel() { QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QCOMPARE(cameraImageProcessing->denoisingLevel()+1 , 1.0); cameraImageProcessing->setDenoisingLevel(-0.3); QCOMPARE(cameraImageProcessing->denoisingLevel() , -0.3); cameraImageProcessing->setDenoisingLevel(0.3); QCOMPARE(cameraImageProcessing->denoisingLevel() , 0.3); } void tst_QCamera::testIsAvailable() { QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QVERIFY(cameraImageProcessing->isAvailable() == true); } void tst_QCamera::testSaturation() { QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QCOMPARE(cameraImageProcessing->saturation()+1.0, 1.0); cameraImageProcessing->setSaturation(0.5); QCOMPARE(cameraImageProcessing->saturation(), 0.5); cameraImageProcessing->setSaturation(-0.5); QCOMPARE(cameraImageProcessing->saturation(), -0.5); } void tst_QCamera::testSharpeningLevel() { QCamera camera; QCameraImageProcessing *cameraImageProcessing = camera.imageProcessing(); QCOMPARE(cameraImageProcessing->sharpeningLevel()+1 , 1.0); cameraImageProcessing->setSharpeningLevel(-0.3); QCOMPARE(cameraImageProcessing->sharpeningLevel() , -0.3); cameraImageProcessing->setSharpeningLevel(0.3); QCOMPARE(cameraImageProcessing->sharpeningLevel() , 0.3); } void tst_QCamera::testEnumOfQCameraImageProcessing() { QSet whiteBalanceModes; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceManual; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceAuto; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceSunlight; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceCloudy; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceShade; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceTungsten; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceFluorescent; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceFlash; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceSunset; whiteBalanceModes << QCameraImageProcessing::WhiteBalanceVendor; MockCameraService service; service.mockImageProcessingControl->setSupportedWhiteBalanceModes(whiteBalanceModes); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceManual); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceManual)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceManual); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceAuto); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceAuto)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceAuto); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceSunlight); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceSunlight)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceSunlight); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceCloudy); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceCloudy)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceCloudy); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceShade); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceShade)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceShade); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceTungsten); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceTungsten)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceTungsten); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceFluorescent); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceFluorescent)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceFluorescent); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceFlash); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceFlash)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceFlash); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceSunset); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceSunset)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceSunset); service.mockImageProcessingControl->setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceVendor); QVERIFY(service.mockImageProcessingControl->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceVendor)); QVERIFY(service.mockImageProcessingControl->whiteBalanceMode() == QCameraImageProcessing::WhiteBalanceVendor); } //Added test cases for QCameraFocus void tst_QCamera::testCameraFocusIsAvailable() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QVERIFY(cameraFocus->isAvailable()); } //Added this code to cover QCameraFocus::HyperfocalFocus and QCameraFocus::MacroFocus //As the HyperfocalFocus and MacroFocus are not supported we can not set the focus mode to these Focus Modes void tst_QCamera::testFocusModes() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::HyperfocalFocus)); QVERIFY(!cameraFocus->isFocusModeSupported(QCameraFocus::MacroFocus)); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); cameraFocus->setFocusMode(QCameraFocus::HyperfocalFocus); QVERIFY(cameraFocus->focusMode()!= QCameraFocus::HyperfocalFocus); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); cameraFocus->setFocusMode(QCameraFocus::MacroFocus); QVERIFY(cameraFocus->focusMode()!= QCameraFocus::MacroFocus); QCOMPARE(cameraFocus->focusMode(), QCameraFocus::AutoFocus); } void tst_QCamera::testOpticalAndDigitalZoomChanged() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QSignalSpy spy1(cameraFocus,SIGNAL(digitalZoomChanged(qreal))); QSignalSpy spy2(cameraFocus,SIGNAL(opticalZoomChanged(qreal))); QVERIFY(spy1.count() == 0); QVERIFY(spy2.count() == 0); cameraFocus->zoomTo(2.0,3.0); QVERIFY(spy1.count() == 1); QVERIFY(spy2.count() == 1); } void tst_QCamera::testMaxDigitalZoomChangedSignal() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QSignalSpy spy(cameraFocus,SIGNAL(maximumDigitalZoomChanged(qreal))); QVERIFY(spy.count() == 0); cameraFocus->zoomTo(5.0,6.0); QVERIFY(spy.count() == 1); } void tst_QCamera::testMaxOpticalZoomChangedSignal() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QSignalSpy spy(cameraFocus,SIGNAL(maximumOpticalZoomChanged(qreal))); QVERIFY(spy.count() == 0); cameraFocus->zoomTo(5.0,6.0); QVERIFY(spy.count() == 1); } void tst_QCamera::testfocusZonesChangedSignal() { QCamera camera; QCameraFocus *cameraFocus = camera.focus(); QVERIFY(cameraFocus != 0); QSignalSpy spy(cameraFocus,SIGNAL(focusZonesChanged())); cameraFocus->setCustomFocusPoint(QPointF(0.1, 0.1)); QVERIFY(spy.count() == 1); } // test constructor for abstract class of ImageProcessingControl void tst_QCamera :: testImageProcessingControl() { QObject parent; MockImageProcessingControl processCtrl(&parent); } void tst_QCamera::testSignalApertureChanged() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); //create camera expose instance QVERIFY(cameraExposure != 0); QSignalSpy spyApertureChanged(cameraExposure , SIGNAL(apertureChanged(qreal))); QSignalSpy spyApertureRangeChanged(cameraExposure , SIGNAL(apertureRangeChanged())); QVERIFY(spyApertureChanged.count() ==0); cameraExposure->setManualAperture(10.0);//set the ManualAperture to 10.0 QTest::qWait(100); QVERIFY(spyApertureChanged.count() ==1); QVERIFY(spyApertureRangeChanged.count() ==1); } void tst_QCamera::testSignalExposureCompensationChanged() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); //create camera expose instance QVERIFY(cameraExposure != 0); QSignalSpy spyExposureCompensationChanged(cameraExposure , SIGNAL(exposureCompensationChanged(qreal))); QVERIFY(spyExposureCompensationChanged.count() ==0); QVERIFY(cameraExposure->exposureCompensation() != 800); cameraExposure->setExposureCompensation(2.0); QTest::qWait(100); QVERIFY(cameraExposure->exposureCompensation() == 2.0); QCOMPARE(spyExposureCompensationChanged.count(),1); // Setting the same should not result in a signal cameraExposure->setExposureCompensation(2.0); QTest::qWait(100); QVERIFY(cameraExposure->exposureCompensation() == 2.0); QCOMPARE(spyExposureCompensationChanged.count(),1); } void tst_QCamera::testSignalIsoSensitivityChanged() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); //create camera expose instance QVERIFY(cameraExposure != 0); QSignalSpy spyisoSensitivityChanged(cameraExposure , SIGNAL(isoSensitivityChanged(int))); QVERIFY(spyisoSensitivityChanged.count() ==0); cameraExposure->setManualIsoSensitivity(800); //set the manualiso sentivity to 800 QTest::qWait(100); QVERIFY(spyisoSensitivityChanged.count() ==1); } void tst_QCamera::testSignalShutterSpeedChanged() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); //create camera expose instance QVERIFY(cameraExposure != 0); QSignalSpy spySignalShutterSpeedChanged(cameraExposure , SIGNAL(shutterSpeedChanged(qreal))); QSignalSpy spySignalShutterSpeedRangeChanged(cameraExposure , SIGNAL(shutterSpeedRangeChanged())); QVERIFY(spySignalShutterSpeedChanged.count() ==0); cameraExposure->setManualShutterSpeed(2.0);//set the ManualShutterSpeed to 2.0 QTest::qWait(100); QVERIFY(spySignalShutterSpeedChanged.count() ==1); QVERIFY(spySignalShutterSpeedRangeChanged.count() ==1); } void tst_QCamera::testSignalFlashReady() { QCamera camera; QCameraExposure *cameraExposure = camera.exposure(); //create camera expose instance QVERIFY(cameraExposure != 0); QSignalSpy spyflashReady(cameraExposure,SIGNAL(flashReady(bool))); QVERIFY(spyflashReady.count() ==0); QVERIFY(cameraExposure->flashMode() ==QCameraExposure::FlashAuto); cameraExposure->setFlashMode(QCameraExposure::FlashOff);//set theFlashMode to QCameraExposure::FlashOff QVERIFY(cameraExposure->flashMode() ==QCameraExposure::FlashOff); QVERIFY(spyflashReady.count() ==1); } // test constructor void tst_QCamera::testExposureControlConstructor() { // To check changes in abstract classes's pure virtual functions MockCameraExposureControl obj; } QTEST_MAIN(tst_QCamera) #include "tst_qcamera.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraimagecapture/000077500000000000000000000000001225012771600316705ustar00rootroot00000000000000qcameraimagecapture.pro000066400000000000000000000004071225012771600363340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraimagecaptureCONFIG += testcase TARGET = tst_qcameraimagecapture QT += multimedia-private testlib SOURCES += \ tst_qcameraimagecapture.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockcamera.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qcameraimagecapture.cpp000066400000000000000000000327021225012771600372130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraimagecapture/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** Author : Vijay/Avinash Reviewer Name Date Coverage ( Full / Test Case IDs ). --------------------------------------------------------------------------- Initial review of test cases. ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mockcameraservice.h" #include "mockmediaserviceprovider.h" QT_USE_NAMESPACE class NullService: public QMediaService { Q_OBJECT public: NullService(): QMediaService(0) { } ~NullService() { } QMediaControl* requestControl(const char *iid) { Q_UNUSED(iid); return 0; } void releaseControl(QMediaControl*) {} }; class tst_QCameraImageCapture: public QObject { Q_OBJECT public slots: void initTestCase(); void init(); void cleanup(); void cleanupTestCase(); private slots: void constructor(); void mediaObject(); void deleteMediaObject(); void isReadyForCapture(); void capture(); void cancelCapture(); void encodingSettings(); void errors(); void error(); void imageCaptured(); void imageExposed(); void imageSaved(); void readyForCaptureChanged(); void supportedResolutions(); void imageCodecDescription(); void supportedImageCodecs(); void cameraImageCaptureControl(); private: MockCameraService *mockcameraservice; MockMediaServiceProvider *provider; }; void tst_QCameraImageCapture::initTestCase() { provider = new MockMediaServiceProvider; QMediaServiceProvider::setDefaultServiceProvider(provider); } void tst_QCameraImageCapture::init() { mockcameraservice = new MockCameraService; provider->service = mockcameraservice; } void tst_QCameraImageCapture::cleanup() { delete mockcameraservice; mockcameraservice = 0; } void tst_QCameraImageCapture::cleanupTestCase() { delete provider; } //MaemoAPI-1823:test QCameraImageCapture Constructor void tst_QCameraImageCapture::constructor() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); } //MaemoAPI-1824:test mediaObject void tst_QCameraImageCapture::mediaObject() { NullService mymockcameraservice ; provider->service = &mymockcameraservice; QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.mediaObject() == NULL); provider->service = mockcameraservice; QCamera camera1; QCameraImageCapture imageCapture1(&camera1); QMediaObject *medobj1 = imageCapture1.mediaObject(); QCOMPARE(medobj1, &camera1); } void tst_QCameraImageCapture::deleteMediaObject() { provider->service = new MockCameraService; QCamera *camera = new QCamera; QCameraImageCapture *capture = new QCameraImageCapture(camera); QVERIFY(capture->mediaObject() == camera); QVERIFY(capture->isAvailable()); delete camera; delete provider->service; //capture should detach from camera QVERIFY(capture->mediaObject() == 0); QVERIFY(!capture->isAvailable()); capture->capture(); delete capture; } //MaemoAPI-1825:test isReadyForCapture void tst_QCameraImageCapture::isReadyForCapture() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(); QTRY_VERIFY(imageCapture.isReadyForCapture()); camera.stop(); } //MaemoAPI-1826:test capture void tst_QCameraImageCapture::capture() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); QVERIFY(imageCapture.capture() == -1); camera.start(); QVERIFY(imageCapture.isReadyForCapture() == true); QTest::qWait(300); QVERIFY(imageCapture.capture() != -1); camera.stop(); } //MaemoAPI-1827:test cancelCapture void tst_QCameraImageCapture::cancelCapture() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QSignalSpy spy1(&imageCapture, SIGNAL(imageSaved(int,QString))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(); QTRY_VERIFY(imageCapture.isReadyForCapture()); QVERIFY(spy.count() == 1 && spy1.count() == 1); spy.clear(); spy1.clear(); camera.stop(); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(); imageCapture.cancelCapture(); QTRY_VERIFY(imageCapture.isReadyForCapture()); QVERIFY(spy.count() == 0 && spy1.count() == 0); camera.stop(); } //MaemoAPI-1828:test encodingSettings //MaemoAPI-1829:test set encodingSettings void tst_QCameraImageCapture::encodingSettings() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.encodingSettings() == QImageEncoderSettings()); QImageEncoderSettings settings; settings.setCodec("JPEG"); settings.setQuality(QMultimedia::NormalQuality); imageCapture.setEncodingSettings(settings); QVERIFY(!imageCapture.encodingSettings().isNull()); QVERIFY(imageCapture.encodingSettings().codec() == "JPEG"); QVERIFY(imageCapture.encodingSettings().quality() == QMultimedia::NormalQuality); } //MaemoAPI-1838:test supportedImageCodecs void tst_QCameraImageCapture::supportedImageCodecs() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(!imageCapture.supportedImageCodecs().isEmpty()); } //MaemoAPI-1836:test supportedResolutions void tst_QCameraImageCapture::supportedResolutions() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.supportedResolutions().count() == 2); QImageEncoderSettings settings1; settings1.setCodec("PNG");; settings1.setResolution(320, 240); int result = imageCapture.supportedResolutions(settings1).count(); QVERIFY(result == 1); } //MaemoAPI-1837:test imageCodecDescription void tst_QCameraImageCapture::imageCodecDescription() { QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.imageCodecDescription(" ").isNull()); QVERIFY(imageCapture.imageCodecDescription("PNG").isNull() == false); } //MaemoAPI-1830:test errors void tst_QCameraImageCapture::errors() { MockSimpleCameraService mockSimpleCameraService ; provider->service = &mockSimpleCameraService; QCamera camera1; QCameraImageCapture imageCapture1(&camera1); QVERIFY(imageCapture1.isAvailable() == false); imageCapture1.capture(QString::fromLatin1("/dev/null")); QVERIFY(imageCapture1.error() == QCameraImageCapture::NotSupportedFeatureError); QVERIFY2(!imageCapture1.errorString().isEmpty(), "Device does not support images capture"); QVERIFY(imageCapture1.availability() == QMultimedia::ServiceMissing); provider->service = mockcameraservice; QCamera camera; QCameraImageCapture imageCapture(&camera); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.error() == QCameraImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); QVERIFY(imageCapture.availability() == QMultimedia::Available); imageCapture.capture(); QVERIFY(imageCapture.error() == QCameraImageCapture::NotReadyError); QVERIFY2(!imageCapture.errorString().isEmpty(), "Could not capture in stopped state"); QVERIFY(imageCapture.availability() == QMultimedia::Available); } //MaemoAPI-1831:test error void tst_QCameraImageCapture::error() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString))); imageCapture.capture(); QTest::qWait(30); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast(spy.at(0).at(0)) == -1); QVERIFY(qvariant_cast(spy.at(0).at(1)) == QCameraImageCapture::NotReadyError); QVERIFY(qvariant_cast(spy.at(0).at(2)) == "Could not capture in stopped state"); spy.clear(); } //MaemoAPI-1832:test imageCaptured void tst_QCameraImageCapture::imageCaptured() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(); QTRY_VERIFY(imageCapture.isReadyForCapture()); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast(spy.at(0).at(0)) > 0); QImage image = qvariant_cast(spy.at(0).at(1)); QVERIFY(image.isNull() == true); spy.clear(); camera.stop(); } //MaemoAPI-1833:test imageExposed void tst_QCameraImageCapture::imageExposed() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(imageExposed(int))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(); QTRY_VERIFY(imageCapture.isReadyForCapture()); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast(spy.at(0).at(0)) > 0); spy.clear(); camera.stop(); } //MaemoAPI-1834:test imageSaved void tst_QCameraImageCapture::imageSaved() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(imageSaved(int,QString))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); imageCapture.capture(QString::fromLatin1("/usr/share")); QTRY_VERIFY(imageCapture.isReadyForCapture()); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast(spy.at(0).at(0)) > 0); QVERIFY(qvariant_cast(spy.at(0).at(1)) == "/usr/share"); spy.clear(); camera.stop(); } //MaemoAPI-1835:test readyForCaptureChanged void tst_QCameraImageCapture::readyForCaptureChanged() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy spy(&imageCapture, SIGNAL(readyForCaptureChanged(bool))); QVERIFY(imageCapture.isReadyForCapture() == false); imageCapture.capture(); QTest::qWait(100); QVERIFY(spy.count() == 0); QVERIFY2(!imageCapture.errorString().isEmpty(),"Could not capture in stopped state" ); camera.start(); QTest::qWait(100); imageCapture.capture(); QTest::qWait(100); QVERIFY(spy.count() == 2); QVERIFY(spy.at(0).at(0).toBool() == false); QVERIFY(spy.at(1).at(0).toBool() == true); camera.stop(); spy.clear(); } //MaemoAPI-1853:test cameraImageCapture control constructor void tst_QCameraImageCapture::cameraImageCaptureControl() { MockCameraControl ctrl; MockCaptureControl capctrl(&ctrl); } QTEST_MAIN(tst_QCameraImageCapture) #include "tst_qcameraimagecapture.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraviewfinder/000077500000000000000000000000001225012771600313645ustar00rootroot00000000000000qcameraviewfinder.pro000066400000000000000000000004431225012771600355240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraviewfinderCONFIG += testcase TARGET = tst_qcameraviewfinder QT += multimedia-private multimediawidgets-private testlib include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockcamera.pri) SOURCES += tst_qcameraviewfinder.cpp QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qcameraviewfinder.cpp000066400000000000000000000071251225012771600364040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcameraviewfinder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qcameraviewfinder.h" #include "qcamera.h" #include "qmediaobject.h" #include "mockcameraservice.h" #include "mockmediaserviceprovider.h" class tst_QCameraViewFinder : public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); private slots: void testConstructor(); void testMediaObject(); private: MockCameraService *mockcameraservice; MockMediaServiceProvider *provider; QCamera *camera; QCameraViewfinder *viewFinder; }; void tst_QCameraViewFinder::initTestCase() { provider = new MockMediaServiceProvider; mockcameraservice = new MockCameraService; provider->service = mockcameraservice; QMediaServiceProvider::setDefaultServiceProvider(provider); camera = new QCamera; viewFinder = new QCameraViewfinder(); } void tst_QCameraViewFinder::cleanupTestCase() { delete mockcameraservice; delete provider; } void tst_QCameraViewFinder::testConstructor() { /* Verify whether the object is created or not */ QVERIFY(viewFinder != NULL); QCOMPARE(viewFinder->isVisible(),false); QCOMPARE(viewFinder->isEnabled(),true); viewFinder->show(); } void tst_QCameraViewFinder::testMediaObject() { QVERIFY(viewFinder != NULL); viewFinder->show(); /* Sets the QVideoWidget based camera viewfinder.*/ camera->setViewfinder(viewFinder); QCOMPARE(viewFinder->isVisible(),true); /* Return the currently attached media object.*/ QMediaObject *media = viewFinder->mediaObject(); /* Verifying the object */ QCOMPARE(media, camera); } QTEST_MAIN(tst_QCameraViewFinder) #include "tst_qcameraviewfinder.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamerawidgets/000077500000000000000000000000001225012771600306705ustar00rootroot00000000000000qcamerawidgets.pro000066400000000000000000000004361225012771600343360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamerawidgetsCONFIG += testcase TARGET = tst_qcamerawidgets QT += multimedia-private multimediawidgets-private testlib include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockcamera.pri) SOURCES += tst_qcamerawidgets.cpp QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qcamerawidgets.cpp000066400000000000000000000236151225012771600352160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qcamerawidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mockcameraservice.h" #include "mockmediaserviceprovider.h" #include "mockvideosurface.h" #include "mockvideorenderercontrol.h" #include "mockvideowindowcontrol.h" QT_USE_NAMESPACE class tst_QCameraWidgets: public QObject { Q_OBJECT public slots: void initTestCase(); void init(); void cleanup(); void cleanupTestCase(); private slots: void testCameraEncodingProperyChange(); void testSetVideoOutput(); void testSetVideoOutputNoService(); void testSetVideoOutputNoControl(); private: MockCameraService *mockCameraService; MockMediaServiceProvider *provider; }; void tst_QCameraWidgets::initTestCase() { provider = new MockMediaServiceProvider; QMediaServiceProvider::setDefaultServiceProvider(provider); } void tst_QCameraWidgets::init() { mockCameraService = new MockCameraService; provider->service = mockCameraService; } void tst_QCameraWidgets::cleanup() { delete mockCameraService; provider->service = 0; } void tst_QCameraWidgets::cleanupTestCase() { delete provider; } void tst_QCameraWidgets::testCameraEncodingProperyChange() { QCamera camera; QCameraImageCapture imageCapture(&camera); QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State))); QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); camera.start(); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 1); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); camera.setCaptureMode(QCamera::CaptureVideo); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); //backens should not be stopped since the capture mode is Video imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 0); camera.setCaptureMode(QCamera::CaptureStillImage); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); stateChangedSignal.clear(); statusChangedSignal.clear(); //the settings change should trigger camera stop/start imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); //the settings change should trigger camera stop/start only once camera.setCaptureMode(QCamera::CaptureVideo); camera.setCaptureMode(QCamera::CaptureStillImage); imageCapture.setEncodingSettings(QImageEncoderSettings()); imageCapture.setEncodingSettings(QImageEncoderSettings()); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); QCOMPARE(camera.state(), QCamera::ActiveState); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); stateChangedSignal.clear(); statusChangedSignal.clear(); //setting the viewfinder should also trigger backend to be restarted: camera.setViewfinder(new QGraphicsVideoItem()); QCOMPARE(camera.state(), QCamera::ActiveState); QCOMPARE(camera.status(), QCamera::LoadedStatus); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 1); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); mockCameraService->mockControl->m_propertyChangesSupported = true; //the changes to encoding settings, //capture mode and encoding parameters should not trigger service restart stateChangedSignal.clear(); statusChangedSignal.clear(); camera.setCaptureMode(QCamera::CaptureVideo); camera.setCaptureMode(QCamera::CaptureStillImage); imageCapture.setEncodingSettings(QImageEncoderSettings()); imageCapture.setEncodingSettings(QImageEncoderSettings()); camera.setViewfinder(new QGraphicsVideoItem()); QCOMPARE(stateChangedSignal.count(), 0); QCOMPARE(statusChangedSignal.count(), 0); } void tst_QCameraWidgets::testSetVideoOutput() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; QCamera camera; camera.setViewfinder(&widget); qDebug() << widget.mediaObject(); QVERIFY(widget.mediaObject() == &camera); camera.setViewfinder(&item); QVERIFY(widget.mediaObject() == 0); QVERIFY(item.mediaObject() == &camera); camera.setViewfinder(reinterpret_cast(0)); QVERIFY(item.mediaObject() == 0); camera.setViewfinder(&widget); QVERIFY(widget.mediaObject() == &camera); camera.setViewfinder(reinterpret_cast(0)); QVERIFY(widget.mediaObject() == 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); camera.setViewfinder(reinterpret_cast(0)); QVERIFY(mockCameraService->rendererControl->surface() == 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); camera.setViewfinder(&widget); QVERIFY(mockCameraService->rendererControl->surface() == 0); QVERIFY(widget.mediaObject() == &camera); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == &surface); QVERIFY(widget.mediaObject() == 0); } void tst_QCameraWidgets::testSetVideoOutputNoService() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; provider->service = 0; QCamera camera; camera.setViewfinder(&widget); QVERIFY(widget.mediaObject() == 0); camera.setViewfinder(&item); QVERIFY(item.mediaObject() == 0); camera.setViewfinder(&surface); // Nothing we can verify here other than it doesn't assert. } void tst_QCameraWidgets::testSetVideoOutputNoControl() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; mockCameraService->rendererRef = 1; mockCameraService->windowRef = 1; QCamera camera; camera.setViewfinder(&widget); QVERIFY(widget.mediaObject() == 0); camera.setViewfinder(&item); QVERIFY(item.mediaObject() == 0); camera.setViewfinder(&surface); QVERIFY(mockCameraService->rendererControl->surface() == 0); } QTEST_MAIN(tst_QCameraWidgets) #include "tst_qcamerawidgets.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativeaudio/000077500000000000000000000000001225012771600313565ustar00rootroot00000000000000qdeclarativeaudio.pro000066400000000000000000000007021225012771600355060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativeaudioCONFIG += testcase TARGET = tst_qdeclarativeaudio QT += multimedia-private qml testlib HEADERS += \ ../../../../src/imports/multimedia/qdeclarativeaudio_p.h \ ../../../../src/imports/multimedia/qdeclarativemediametadata_p.h SOURCES += \ tst_qdeclarativeaudio.cpp \ ../../../../src/imports/multimedia/qdeclarativeaudio.cpp INCLUDEPATH += ../../../../src/imports/multimedia DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qdeclarativeaudio.cpp000066400000000000000000001004051225012771600363630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativeaudio/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=plugins/declarative/multimedia #include #include "qdeclarativeaudio_p.h" #include "qdeclarativemediametadata_p.h" #include #include #include #include #include #include class tst_QDeclarativeAudio : public QObject { Q_OBJECT public slots: void initTestCase(); private slots: void nullPlayerControl(); void nullMetaDataControl(); void nullService(); void source(); void autoLoad(); void playing(); void paused(); void duration(); void position(); void volume(); void muted(); void bufferProgress(); void seekable(); void playbackRate(); void status(); void metaData_data(); void metaData(); void error(); void loops(); }; Q_DECLARE_METATYPE(QDeclarativeAudio::Error); class QtTestMediaPlayerControl : public QMediaPlayerControl { Q_OBJECT public: QtTestMediaPlayerControl(QObject *parent = 0) : QMediaPlayerControl(parent) , m_state(QMediaPlayer::StoppedState) , m_mediaStatus(QMediaPlayer::NoMedia) , m_duration(0) , m_position(0) , m_playbackRate(1.0) , m_volume(100) , m_bufferStatus(0) , m_muted(false) , m_audioAvailable(false) , m_videoAvailable(false) , m_seekable(false) { } QMediaPlayer::State state() const { return m_state; } void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); } QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; } void updateMediaStatus(QMediaPlayer::MediaStatus status) { emit mediaStatusChanged(m_mediaStatus = status); } void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state) { m_mediaStatus = status; m_state = state; emit mediaStatusChanged(m_mediaStatus); emit stateChanged(m_state); } qint64 duration() const { return m_duration; } void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); } qint64 position() const { return m_position; } void setPosition(qint64 position) { emit positionChanged(m_position = position); } int volume() const { return m_volume; } void setVolume(int volume) { emit volumeChanged(m_volume = volume); } bool isMuted() const { return m_muted; } void setMuted(bool muted) { emit mutedChanged(m_muted = muted); } int bufferStatus() const { return m_bufferStatus; } void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); } bool isAudioAvailable() const { return m_audioAvailable; } void setAudioAvailable(bool available) { emit audioAvailableChanged(m_audioAvailable = available); } bool isVideoAvailable() const { return m_videoAvailable; } void setVideoAvailable(bool available) { emit videoAvailableChanged(m_videoAvailable = available); } bool isSeekable() const { return m_seekable; } void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); } QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); } qreal playbackRate() const { return m_playbackRate; } void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); } QMediaContent media() const { return m_media; } const QIODevice *mediaStream() const { return 0; } void setMedia(const QMediaContent &media, QIODevice *) { m_media = media; m_mediaStatus = m_media.isNull() ? QMediaPlayer::NoMedia : QMediaPlayer::LoadingMedia; emit mediaChanged(m_media); emit mediaStatusChanged(m_mediaStatus); } void play() { m_state = QMediaPlayer::PlayingState; if (m_mediaStatus == QMediaPlayer::EndOfMedia) updateMediaStatus(QMediaPlayer::LoadedMedia); emit stateChanged(m_state); } void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); } void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); } void emitError(QMediaPlayer::Error err, const QString &errorString) { emit error(err, errorString); } private: QMediaPlayer::State m_state; QMediaPlayer::MediaStatus m_mediaStatus; qint64 m_duration; qint64 m_position; qreal m_playbackRate; int m_volume; int m_bufferStatus; bool m_muted; bool m_audioAvailable; bool m_videoAvailable; bool m_seekable; QMediaContent m_media; }; class QtTestMetaDataControl : public QMetaDataReaderControl { Q_OBJECT public: QtTestMetaDataControl(QObject *parent = 0) : QMetaDataReaderControl(parent) { } bool isMetaDataAvailable() const { return true; } QVariant metaData(const QString &key) const { return m_metaData.value(key); } void setMetaData(const QString &key, const QVariant &value) { m_metaData.insert(key, value); emit metaDataChanged(); } QStringList availableMetaData() const { return m_metaData.keys(); } private: QMap m_metaData; }; class QtTestMediaService : public QMediaService { Q_OBJECT public: QtTestMediaService( QtTestMediaPlayerControl *playerControl, QtTestMetaDataControl *metaDataControl, QObject *parent) : QMediaService(parent) , playerControl(playerControl) , metaDataControl(metaDataControl) { } QMediaControl *requestControl(const char *name) { if (qstrcmp(name, QMediaPlayerControl_iid) == 0) return playerControl; else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) return metaDataControl; else return 0; } void releaseControl(QMediaControl *) {} QtTestMediaPlayerControl *playerControl; QtTestMetaDataControl *metaDataControl; }; class QtTestMediaServiceProvider : public QMediaServiceProvider { Q_OBJECT public: QtTestMediaServiceProvider() : service(new QtTestMediaService( new QtTestMediaPlayerControl(this), new QtTestMetaDataControl(this), this)) { setDefaultServiceProvider(this); } QtTestMediaServiceProvider(QtTestMediaService *service) : service(service) { setDefaultServiceProvider(this); } QtTestMediaServiceProvider( QtTestMediaPlayerControl *playerControl, QtTestMetaDataControl *metaDataControl) : service(new QtTestMediaService(playerControl, metaDataControl, this)) { setDefaultServiceProvider(this); } ~QtTestMediaServiceProvider() { setDefaultServiceProvider(0); } QMediaService *requestService( const QByteArray &type, const QMediaServiceProviderHint & = QMediaServiceProviderHint()) { requestedService = type; return service; } void releaseService(QMediaService *) {} inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; } inline QtTestMetaDataControl *metaDataControl() { return service->metaDataControl; } QtTestMediaService *service; QByteArray requestedService; }; void tst_QDeclarativeAudio::initTestCase() { qRegisterMetaType(); } void tst_QDeclarativeAudio::nullPlayerControl() { QtTestMetaDataControl metaDataControl; QtTestMediaServiceProvider provider(0, &metaDataControl); QDeclarativeAudio audio; audio.classBegin(); QCOMPARE(audio.source(), QUrl()); audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.source(), QUrl("http://example.com")); QCOMPARE(audio.playbackState(), audio.StoppedState); audio.play(); QCOMPARE(audio.playbackState(), audio.StoppedState); audio.pause(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(audio.duration(), 0); QCOMPARE(audio.position(), 0); audio.seek(10000); QCOMPARE(audio.position(), 10000); QCOMPARE(audio.volume(), qreal(1.0)); audio.setVolume(0.5); QCOMPARE(audio.volume(), qreal(0.5)); QCOMPARE(audio.isMuted(), false); audio.setMuted(true); QCOMPARE(audio.isMuted(), true); QCOMPARE(audio.bufferProgress(), qreal(0)); QCOMPARE(audio.isSeekable(), false); QCOMPARE(audio.playbackRate(), qreal(1.0)); QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); QCOMPARE(audio.error(), QDeclarativeAudio::ServiceMissing); } void tst_QDeclarativeAudio::nullMetaDataControl() { QtTestMediaPlayerControl playerControl; QtTestMediaServiceProvider provider(&playerControl, 0); QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QVERIFY(audio.metaData()); } void tst_QDeclarativeAudio::nullService() { QtTestMediaServiceProvider provider(0); QDeclarativeAudio audio; audio.classBegin(); QCOMPARE(audio.source(), QUrl()); audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.source(), QUrl("http://example.com")); QCOMPARE(audio.playbackState(), audio.StoppedState); audio.play(); QCOMPARE(audio.playbackState(), audio.StoppedState); audio.pause(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(audio.duration(), 0); QCOMPARE(audio.position(), 0); audio.seek(10000); QCOMPARE(audio.position(), 10000); QCOMPARE(audio.volume(), qreal(1.0)); audio.setVolume(0.5); QCOMPARE(audio.volume(), qreal(0.5)); QCOMPARE(audio.isMuted(), false); audio.setMuted(true); QCOMPARE(audio.isMuted(), true); QCOMPARE(audio.bufferProgress(), qreal(0)); QCOMPARE(audio.isSeekable(), false); QCOMPARE(audio.playbackRate(), qreal(1.0)); QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); QCOMPARE(audio.error(), QDeclarativeAudio::ServiceMissing); QVERIFY(audio.metaData()); } void tst_QDeclarativeAudio::source() { const QUrl url1("http://example.com"); const QUrl url2("file:///local/path"); const QUrl url3; QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(sourceChanged())); audio.setSource(url1); QCOMPARE(audio.source(), url1); QCOMPARE(provider.playerControl()->media().canonicalUrl(), url1); QCOMPARE(spy.count(), 1); audio.setSource(url2); QCOMPARE(audio.source(), url2); QCOMPARE(provider.playerControl()->media().canonicalUrl(), url2); QCOMPARE(spy.count(), 2); audio.setSource(url3); QCOMPARE(audio.source(), url3); QCOMPARE(provider.playerControl()->media().canonicalUrl(), url3); QCOMPARE(spy.count(), 3); } void tst_QDeclarativeAudio::autoLoad() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(autoLoadChanged())); QCOMPARE(audio.isAutoLoad(), true); audio.setAutoLoad(false); QCOMPARE(audio.isAutoLoad(), false); QCOMPARE(spy.count(), 1); audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.source(), QUrl("http://example.com")); audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); audio.stop(); audio.setAutoLoad(true); audio.setSource(QUrl("http://example.com")); audio.pause(); QCOMPARE(spy.count(), 2); QCOMPARE(audio.playbackState(), audio.PausedState); } void tst_QDeclarativeAudio::playing() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); QSignalSpy playingSpy(&audio, SIGNAL(playing())); QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); int stateChanged = 0; int playing = 0; int stopped = 0; audio.componentComplete(); audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.playbackState(), audio.StoppedState); // play() when stopped. audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(playingSpy.count(), ++playing); QCOMPARE(stoppedSpy.count(), stopped); // stop() when playing. audio.stop(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(playingSpy.count(), playing); QCOMPARE(stoppedSpy.count(), ++stopped); // stop() when stopped. audio.stop(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), stateChanged); QCOMPARE(playingSpy.count(), playing); QCOMPARE(stoppedSpy.count(), stopped); audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(playingSpy.count(), ++playing); QCOMPARE(stoppedSpy.count(), stopped); // play() when playing. audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), stateChanged); QCOMPARE(playingSpy.count(), playing); QCOMPARE(stoppedSpy.count(), stopped); } void tst_QDeclarativeAudio::paused() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); QSignalSpy pausedSpy(&audio, SIGNAL(paused())); int stateChanged = 0; int pausedCount = 0; audio.componentComplete(); audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.playbackState(), audio.StoppedState); // play() when stopped. audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(pausedSpy.count(), pausedCount); // pause() when playing. audio.pause(); QCOMPARE(audio.playbackState(), audio.PausedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(pausedSpy.count(), ++pausedCount); // pause() when paused. audio.pause(); QCOMPARE(audio.playbackState(), audio.PausedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(stateChangedSpy.count(), stateChanged); QCOMPARE(pausedSpy.count(), pausedCount); // stop() when paused. audio.stop(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(pausedSpy.count(), pausedCount); // pause() when stopped. audio.pause(); QCOMPARE(audio.playbackState(), audio.PausedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(pausedSpy.count(), ++pausedCount); // play() when paused. audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(pausedSpy.count(), pausedCount); } void tst_QDeclarativeAudio::duration() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(durationChanged())); QCOMPARE(audio.duration(), 0); provider.playerControl()->setDuration(4040); QCOMPARE(audio.duration(), 4040); QCOMPARE(spy.count(), 1); provider.playerControl()->setDuration(-129); QCOMPARE(audio.duration(), -129); QCOMPARE(spy.count(), 2); provider.playerControl()->setDuration(0); QCOMPARE(audio.duration(), 0); QCOMPARE(spy.count(), 3); // Unnecessary duration changed signals aren't filtered. provider.playerControl()->setDuration(0); QCOMPARE(audio.duration(), 0); QCOMPARE(spy.count(), 4); } void tst_QDeclarativeAudio::position() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(positionChanged())); QCOMPARE(audio.position(), 0); // QDeclarativeAudio won't bound set positions to the duration. A media service may though. QCOMPARE(audio.duration(), 0); audio.seek(450); QCOMPARE(audio.position(), 450); QCOMPARE(provider.playerControl()->position(), qint64(450)); QCOMPARE(spy.count(), 1); audio.seek(-5403); QCOMPARE(audio.position(), 0); QCOMPARE(provider.playerControl()->position(), qint64(0)); QCOMPARE(spy.count(), 2); audio.seek(-5403); QCOMPARE(audio.position(), 0); QCOMPARE(provider.playerControl()->position(), qint64(0)); QCOMPARE(spy.count(), 2); // Check the signal change signal is emitted if the change originates from the media service. provider.playerControl()->setPosition(450); QCOMPARE(audio.position(), 450); QCOMPARE(spy.count(), 3); connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); provider.playerControl()->updateState(QMediaPlayer::PlayingState); QTestEventLoop::instance().enterLoop(2); QVERIFY(spy.count() > 3 && spy.count() < 6); // 4 or 5 provider.playerControl()->updateState(QMediaPlayer::PausedState); QTestEventLoop::instance().enterLoop(1); QVERIFY(spy.count() < 6); } void tst_QDeclarativeAudio::volume() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(volumeChanged())); QCOMPARE(audio.volume(), qreal(1.0)); audio.setVolume(0.7); QCOMPARE(audio.volume(), qreal(0.7)); QCOMPARE(provider.playerControl()->volume(), 70); QCOMPARE(spy.count(), 1); audio.setVolume(0.7); QCOMPARE(audio.volume(), qreal(0.7)); QCOMPARE(provider.playerControl()->volume(), 70); QCOMPARE(spy.count(), 1); provider.playerControl()->setVolume(30); QCOMPARE(audio.volume(), qreal(0.3)); QCOMPARE(spy.count(), 2); } void tst_QDeclarativeAudio::muted() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(mutedChanged())); QCOMPARE(audio.isMuted(), false); audio.setMuted(true); QCOMPARE(audio.isMuted(), true); QCOMPARE(provider.playerControl()->isMuted(), true); QCOMPARE(spy.count(), 1); provider.playerControl()->setMuted(false); QCOMPARE(audio.isMuted(), false); QCOMPARE(spy.count(), 2); audio.setMuted(false); QCOMPARE(audio.isMuted(), false); QCOMPARE(provider.playerControl()->isMuted(), false); QCOMPARE(spy.count(), 2); } void tst_QDeclarativeAudio::bufferProgress() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(bufferProgressChanged())); QCOMPARE(audio.bufferProgress(), qreal(0.0)); provider.playerControl()->setBufferStatus(20); QCOMPARE(audio.bufferProgress(), qreal(0.2)); QCOMPARE(spy.count(), 1); provider.playerControl()->setBufferStatus(20); QCOMPARE(audio.bufferProgress(), qreal(0.2)); QCOMPARE(spy.count(), 2); provider.playerControl()->setBufferStatus(40); QCOMPARE(audio.bufferProgress(), qreal(0.4)); QCOMPARE(spy.count(), 3); connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); provider.playerControl()->updateMediaStatus( QMediaPlayer::BufferingMedia, QMediaPlayer::PlayingState); QTestEventLoop::instance().enterLoop(2); QVERIFY(spy.count() > 3 && spy.count() < 6); // 4 or 5 provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); QTestEventLoop::instance().enterLoop(1); QVERIFY(spy.count() < 6); } void tst_QDeclarativeAudio::seekable() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(seekableChanged())); QCOMPARE(audio.isSeekable(), false); provider.playerControl()->setSeekable(true); QCOMPARE(audio.isSeekable(), true); QCOMPARE(spy.count(), 1); provider.playerControl()->setSeekable(true); QCOMPARE(audio.isSeekable(), true); QCOMPARE(spy.count(), 2); provider.playerControl()->setSeekable(false); QCOMPARE(audio.isSeekable(), false); QCOMPARE(spy.count(), 3); } void tst_QDeclarativeAudio::playbackRate() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(&audio, SIGNAL(playbackRateChanged())); QCOMPARE(audio.playbackRate(), qreal(1.0)); audio.setPlaybackRate(0.5); QCOMPARE(audio.playbackRate(), qreal(0.5)); QCOMPARE(provider.playerControl()->playbackRate(), qreal(0.5)); QCOMPARE(spy.count(), 1); provider.playerControl()->setPlaybackRate(2.0); QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); QCOMPARE(spy.count(), 2); audio.setPlaybackRate(2.0); QCOMPARE(audio.playbackRate(), qreal(2.0)); QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); QCOMPARE(spy.count(), 3); } void tst_QDeclarativeAudio::status() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy statusChangedSpy(&audio, SIGNAL(statusChanged())); QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); // Set media, start loading. provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadingMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Loading); QCOMPARE(statusChangedSpy.count(), 1); // Finish loading. provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadedMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Loaded); QCOMPARE(statusChangedSpy.count(), 2); // Play, start buffering. provider.playerControl()->updateMediaStatus( QMediaPlayer::StalledMedia, QMediaPlayer::PlayingState); QCOMPARE(audio.status(), QDeclarativeAudio::Stalled); QCOMPARE(statusChangedSpy.count(), 3); // Enough data buffered to proceed. provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); QCOMPARE(statusChangedSpy.count(), 4); // Errant second buffering status changed. provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); QCOMPARE(statusChangedSpy.count(), 4); // Buffer full. provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Buffered); QCOMPARE(statusChangedSpy.count(), 5); // Buffer getting low. provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); QCOMPARE(statusChangedSpy.count(), 6); // Buffer full. provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); QCOMPARE(audio.status(), QDeclarativeAudio::Buffered); QCOMPARE(statusChangedSpy.count(), 7); // Finished. provider.playerControl()->updateMediaStatus( QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); QCOMPARE(audio.status(), QDeclarativeAudio::EndOfMedia); QCOMPARE(statusChangedSpy.count(), 8); } void tst_QDeclarativeAudio::metaData_data() { QTest::addColumn("propertyName"); QTest::addColumn("propertyKey"); QTest::addColumn("value"); QTest::newRow("title") << QByteArray("title") << QMediaMetaData::Title << QVariant(QString::fromLatin1("This is a title")); QTest::newRow("genre") << QByteArray("genre") << QMediaMetaData::Genre << QVariant(QString::fromLatin1("rock")); QTest::newRow("trackNumber") << QByteArray("trackNumber") << QMediaMetaData::TrackNumber << QVariant(8); } void tst_QDeclarativeAudio::metaData() { QFETCH(QByteArray, propertyName); QFETCH(QString, propertyKey); QFETCH(QVariant, value); QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy spy(audio.metaData(), SIGNAL(metaDataChanged())); const int index = audio.metaData()->metaObject()->indexOfProperty(propertyName.constData()); QVERIFY(index != -1); QMetaProperty property = audio.metaData()->metaObject()->property(index); QCOMPARE(property.read(&audio), QVariant()); property.write(audio.metaData(), value); QCOMPARE(property.read(audio.metaData()), QVariant()); QCOMPARE(provider.metaDataControl()->metaData(propertyKey), QVariant()); QCOMPARE(spy.count(), 0); provider.metaDataControl()->setMetaData(propertyKey, value); QCOMPARE(property.read(audio.metaData()), value); QCOMPARE(spy.count(), 1); } void tst_QDeclarativeAudio::error() { const QString errorString = QLatin1String("Failed to open device."); QtTestMediaServiceProvider provider; QDeclarativeAudio audio; audio.classBegin(); audio.componentComplete(); QSignalSpy errorSpy(&audio, SIGNAL(error(QDeclarativeAudio::Error,QString))); QSignalSpy errorChangedSpy(&audio, SIGNAL(errorChanged())); QCOMPARE(audio.error(), QDeclarativeAudio::NoError); QCOMPARE(audio.errorString(), QString()); provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString); QCOMPARE(audio.error(), QDeclarativeAudio::ResourceError); QCOMPARE(audio.errorString(), errorString); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 1); // Changing the source resets the error properties. audio.setSource(QUrl("http://example.com")); QCOMPARE(audio.error(), QDeclarativeAudio::NoError); QCOMPARE(audio.errorString(), QString()); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 2); // But isn't noisy. audio.setSource(QUrl("file:///file/path")); QCOMPARE(audio.error(), QDeclarativeAudio::NoError); QCOMPARE(audio.errorString(), QString()); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 2); } void tst_QDeclarativeAudio::loops() { QtTestMediaServiceProvider provider; QDeclarativeAudio audio; QSignalSpy loopsChangedSpy(&audio, SIGNAL(loopCountChanged())); QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); int stateChanged = 0; int loopsChanged = 0; int stoppedCount = 0; audio.classBegin(); audio.componentComplete(); QCOMPARE(audio.playbackState(), audio.StoppedState); //setLoopCount(3) when stopped. audio.setLoopCount(3); QCOMPARE(audio.loopCount(), 3); QCOMPARE(loopsChangedSpy.count(), ++loopsChanged); //play till end audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(stoppedSpy.count(), stoppedCount); // play() when playing. audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), stateChanged); QCOMPARE(stoppedSpy.count(), stoppedCount); provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), stateChanged); QCOMPARE(stoppedSpy.count(), stoppedCount); //play to end provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); QCOMPARE(stoppedSpy.count(), stoppedCount); //play to end provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(stoppedSpy.count(), ++stoppedCount); // stop when playing audio.play(); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(stoppedSpy.count(), stoppedCount); provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); audio.stop(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(stoppedSpy.count(), ++stoppedCount); //play() with infinite loop audio.setLoopCount(-1); QCOMPARE(audio.loopCount(), -1); QCOMPARE(loopsChangedSpy.count(), ++loopsChanged); audio.play(); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); QCOMPARE(audio.playbackState(), audio.PlayingState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(stateChangedSpy.count(), stateChanged); // stop() when playing in infinite loop. audio.stop(); QCOMPARE(audio.playbackState(), audio.StoppedState); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(stateChangedSpy.count(), ++stateChanged); QCOMPARE(stoppedSpy.count(), ++stoppedCount); qDebug() << "Testing version 5"; } QTEST_MAIN(tst_QDeclarativeAudio) #include "tst_qdeclarativeaudio.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativevideo/000077500000000000000000000000001225012771600313635ustar00rootroot00000000000000qdeclarativevideo.pro000066400000000000000000000011341225012771600355200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativevideoCONFIG += testcase TARGET = tst_qdeclarativevideo QT += multimedia-private qml testlib HEADERS += \ ../../../../src/imports/multimedia/qdeclarativevideo_p.h \ ../../../../src/imports/multimedia/qdeclarativemediabase_p.h \ ../../../../src/imports/multimedia/qdeclarativemediametadata_p.h SOURCES += \ tst_qdeclarativevideo.cpp \ ../../../../src/imports/multimedia/qdeclarativevideo.cpp \ ../../../../src/imports/multimedia/qdeclarativemediabase.cpp INCLUDEPATH += ../../../../src/imports/multimedia QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qdeclarativevideo.cpp000066400000000000000000001046261225012771600364060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qdeclarativevideo/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=plugins/declarative/multimedia #include #include "qdeclarativevideo_p.h" #include #include #include #include #include #include #include #include #include #include class tst_QDeclarativeVideo : public QObject { Q_OBJECT public slots: void initTestCase(); private slots: void nullPlayerControl(); void nullService(); void playing(); void paused(); void error(); void hasAudio(); void hasVideo(); void fillMode(); void geometry(); }; Q_DECLARE_METATYPE(QDeclarativeVideo::Error); class QtTestMediaPlayerControl : public QMediaPlayerControl { Q_OBJECT public: QtTestMediaPlayerControl(QObject *parent = 0) : QMediaPlayerControl(parent) , m_state(QMediaPlayer::StoppedState) , m_mediaStatus(QMediaPlayer::NoMedia) , m_duration(0) , m_position(0) , m_playbackRate(1.0) , m_volume(50) , m_bufferStatus(0) , m_muted(false) , m_audioAvailable(false) , m_videoAvailable(false) , m_seekable(false) { } QMediaPlayer::State state() const { return m_state; } void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); } QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; } void updateMediaStatus(QMediaPlayer::MediaStatus status) { emit mediaStatusChanged(m_mediaStatus = status); } void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state) { m_mediaStatus = status; m_state = state; emit mediaStatusChanged(m_mediaStatus); emit stateChanged(m_state); } qint64 duration() const { return m_duration; } void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); } qint64 position() const { return m_position; } void setPosition(qint64 position) { emit positionChanged(m_position = position); } int volume() const { return m_volume; } void setVolume(int volume) { emit volumeChanged(m_volume = volume); } bool isMuted() const { return m_muted; } void setMuted(bool muted) { emit mutedChanged(m_muted = muted); } int bufferStatus() const { return m_bufferStatus; } void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); } bool isAudioAvailable() const { return m_audioAvailable; } void setAudioAvailable(bool available) { emit audioAvailableChanged(m_audioAvailable = available); } bool isVideoAvailable() const { return m_videoAvailable; } void setVideoAvailable(bool available) { emit videoAvailableChanged(m_videoAvailable = available); } bool isSeekable() const { return m_seekable; } void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); } QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); } qreal playbackRate() const { return m_playbackRate; } void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); } QMediaContent media() const { return m_media; } const QIODevice *mediaStream() const { return 0; } void setMedia(const QMediaContent &media, QIODevice *) { m_media = media; m_mediaStatus = m_media.isNull() ? QMediaPlayer::NoMedia : QMediaPlayer::LoadingMedia; emit mediaChanged(m_media); emit mediaStatusChanged(m_mediaStatus); } void play() { emit stateChanged(m_state = QMediaPlayer::PlayingState); } void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); } void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); } void emitError(QMediaPlayer::Error err, const QString &errorString) { emit error(err, errorString); } private: QMediaPlayer::State m_state; QMediaPlayer::MediaStatus m_mediaStatus; qint64 m_duration; qint64 m_position; qreal m_playbackRate; int m_volume; int m_bufferStatus; bool m_muted; bool m_audioAvailable; bool m_videoAvailable; bool m_seekable; QMediaContent m_media; }; class QtTestRendererControl : public QVideoRendererControl { public: QtTestRendererControl(QObject *parent ) : QVideoRendererControl(parent), m_surface(0) {} QAbstractVideoSurface *surface() const { return m_surface; } void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } private: QAbstractVideoSurface *m_surface; }; class QtTestWindowControl : public QVideoWindowControl { public: QtTestWindowControl(QObject *parent) : QVideoWindowControl(parent) , m_winId(0) , m_repaintCount(0) , m_brightness(0) , m_contrast(0) , m_saturation(0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullScreen(0) { } WId winId() const { return m_winId; } void setWinId(WId id) { m_winId = id; } QRect displayRect() const { return m_displayRect; } void setDisplayRect(const QRect &rect) { m_displayRect = rect; } bool isFullScreen() const { return m_fullScreen; } void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } int repaintCount() const { return m_repaintCount; } void setRepaintCount(int count) { m_repaintCount = count; } void repaint() { ++m_repaintCount; } QSize nativeSize() const { return m_nativeSize; } void setNativeSize(const QSize &size) { m_nativeSize = size; emit nativeSizeChanged(); } Qt::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; } void setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; } int brightness() const { return m_brightness; } void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); } int contrast() const { return m_contrast; } void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); } int hue() const { return m_hue; } void setHue(int hue) { emit hueChanged(m_hue = hue); } int saturation() const { return m_saturation; } void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); } private: WId m_winId; int m_repaintCount; int m_brightness; int m_contrast; int m_hue; int m_saturation; Qt::AspectRatioMode m_aspectRatioMode; QRect m_displayRect; QSize m_nativeSize; bool m_fullScreen; }; class QtTestMediaService : public QMediaService { Q_OBJECT public: QtTestMediaService( QtTestMediaPlayerControl *playerControl, QtTestRendererControl *rendererControl, QtTestWindowControl *windowControl, QObject *parent) : QMediaService(parent) , playerControl(playerControl) , rendererControl(rendererControl) , windowControl(windowControl) { } QMediaControl *requestControl(const char *name) { if (qstrcmp(name, QMediaPlayerControl_iid) == 0) return playerControl; else if (qstrcmp(name, QVideoRendererControl_iid) == 0) return rendererControl; else if (qstrcmp(name, QVideoWindowControl_iid) == 0) return windowControl; else return 0; } void releaseControl(QMediaControl *) {} QtTestMediaPlayerControl *playerControl; QtTestRendererControl *rendererControl; QtTestWindowControl *windowControl; }; class QtTestMediaServiceProvider : public QMediaServiceProvider { Q_OBJECT public: QtTestMediaServiceProvider() : service( new QtTestMediaService( new QtTestMediaPlayerControl(this), new QtTestRendererControl(this), new QtTestWindowControl(this), this)) { setDefaultServiceProvider(this); } QtTestMediaServiceProvider(QtTestMediaService *service) : service(service) { setDefaultServiceProvider(this); } QtTestMediaServiceProvider( QtTestMediaPlayerControl *playerControl, QtTestRendererControl *rendererControl, QtTestWindowControl *windowControl) : service(new QtTestMediaService(playerControl, rendererControl, windowControl, this)) { setDefaultServiceProvider(this); } ~QtTestMediaServiceProvider() { setDefaultServiceProvider(0); } QMediaService *requestService( const QByteArray &type, const QMediaServiceProviderHint & = QMediaServiceProviderHint()) { requestedService = type; return service; } void releaseService(QMediaService *) {} inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; } inline QtTestRendererControl *rendererControl() { return service->rendererControl; } QtTestMediaService *service; QByteArray requestedService; }; void tst_QDeclarativeVideo::initTestCase() { qRegisterMetaType(); } void tst_QDeclarativeVideo::nullPlayerControl() { QtTestMediaServiceProvider provider(0, 0, 0); QDeclarativeVideo video; video.classBegin(); QCOMPARE(video.source(), QUrl()); video.setSource(QUrl("http://example.com")); QCOMPARE(video.source(), QUrl("http://example.com")); QCOMPARE(video.isPlaying(), false); video.setPlaying(true); QCOMPARE(video.isPlaying(), true); video.setPlaying(false); video.play(); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); video.pause(); QCOMPARE(video.isPaused(), false); video.setPaused(true); QCOMPARE(video.isPaused(), true); QCOMPARE(video.duration(), 0); QCOMPARE(video.position(), 0); video.setPosition(10000); QCOMPARE(video.position(), 10000); QCOMPARE(video.volume(), qreal(1.0)); video.setVolume(0.5); QCOMPARE(video.volume(), qreal(0.5)); QCOMPARE(video.isMuted(), false); video.setMuted(true); QCOMPARE(video.isMuted(), true); QCOMPARE(video.bufferProgress(), qreal(0)); QCOMPARE(video.isSeekable(), false); QCOMPARE(video.playbackRate(), qreal(1.0)); QCOMPARE(video.hasAudio(), false); QCOMPARE(video.hasVideo(), false); QCOMPARE(video.status(), QDeclarativeVideo::NoMedia); QCOMPARE(video.error(), QDeclarativeVideo::ServiceMissing); } void tst_QDeclarativeVideo::nullService() { QtTestMediaServiceProvider provider(0); QDeclarativeVideo video; video.classBegin(); QCOMPARE(video.source(), QUrl()); video.setSource(QUrl("http://example.com")); QCOMPARE(video.source(), QUrl("http://example.com")); QCOMPARE(video.isPlaying(), false); video.setPlaying(true); QCOMPARE(video.isPlaying(), true); video.setPlaying(false); video.play(); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); video.pause(); QCOMPARE(video.isPaused(), false); video.setPaused(true); QCOMPARE(video.isPaused(), true); QCOMPARE(video.duration(), 0); QCOMPARE(video.position(), 0); video.setPosition(10000); QCOMPARE(video.position(), 10000); QCOMPARE(video.volume(), qreal(1.0)); video.setVolume(0.5); QCOMPARE(video.volume(), qreal(0.5)); QCOMPARE(video.isMuted(), false); video.setMuted(true); QCOMPARE(video.isMuted(), true); QCOMPARE(video.bufferProgress(), qreal(0)); QCOMPARE(video.isSeekable(), false); QCOMPARE(video.playbackRate(), qreal(1.0)); QCOMPARE(video.hasAudio(), false); QCOMPARE(video.hasVideo(), false); QCOMPARE(video.status(), QDeclarativeVideo::NoMedia); QCOMPARE(video.error(), QDeclarativeVideo::ServiceMissing); QCOMPARE(video.metaObject()->indexOfProperty("title"), -1); QCOMPARE(video.metaObject()->indexOfProperty("genre"), -1); QCOMPARE(video.metaObject()->indexOfProperty("description"), -1); } void tst_QDeclarativeVideo::playing() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); video.setSource(QUrl("http://example.com")); QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged())); QSignalSpy startedSpy(&video, SIGNAL(started())); QSignalSpy stoppedSpy(&video, SIGNAL(stopped())); int playingChanged = 0; int started = 0; int stopped = 0; QCOMPARE(video.isPlaying(), false); // setPlaying(true) when stopped. video.setPlaying(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(false) when playing. video.setPlaying(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), ++stopped); // play() when stopped. video.play(); QCOMPARE(video.isPlaying(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(stoppedSpy.count(), stopped); // stop() when playing. video.stop(); QCOMPARE(video.isPlaying(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), ++stopped); // stop() when stopped. video.stop(); QCOMPARE(video.isPlaying(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(false) when stopped. video.setPlaying(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), stopped); video.setPlaying(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(true) when playing. video.setPlaying(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), stopped); // play() when playing. video.play(); QCOMPARE(video.isPlaying(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(stoppedSpy.count(), stopped); } void tst_QDeclarativeVideo::paused() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); video.setSource(QUrl("http://example.com")); QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged())); QSignalSpy pausedChangedSpy(&video, SIGNAL(pausedChanged())); QSignalSpy startedSpy(&video, SIGNAL(started())); QSignalSpy pausedSpy(&video, SIGNAL(paused())); QSignalSpy resumedSpy(&video, SIGNAL(resumed())); QSignalSpy stoppedSpy(&video, SIGNAL(stopped())); int playingChanged = 0; int pausedChanged = 0; int started = 0; int paused = 0; int resumed = 0; int stopped = 0; QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); // setPlaying(true) when stopped. video.setPlaying(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(true) when playing. video.setPaused(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(true) when paused. video.setPaused(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // pause() when paused. video.pause(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(false) when paused. video.setPaused(false); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), ++resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(false) when playing. video.setPaused(false); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // pause() when playing. video.pause(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(false) when paused. video.setPlaying(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), ++stopped); // setPaused(true) when stopped and paused. video.setPaused(true); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(false) when stopped and paused. video.setPaused(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(true) when stopped. video.setPaused(true); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(true) when stopped and paused. video.setPlaying(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // play() when paused. video.play(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), ++resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPaused(true) when playing. video.setPaused(true); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // stop() when paused. video.stop(); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), ++stopped); // setPaused(true) when stopped. video.setPaused(true); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // stop() when stopped and paused. video.stop(); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // pause() when stopped. video.pause(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(false) when paused. video.setPlaying(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), ++stopped); // pause() when stopped and paused. video.pause(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(pausedSpy.count(), ++paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); // setPlaying(false) when paused. video.setPlaying(false); QCOMPARE(video.isPlaying(), false); QCOMPARE(video.isPaused(), true); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), pausedChanged); QCOMPARE(startedSpy.count(), started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), ++stopped); // play() when stopped and paused. video.play(); QCOMPARE(video.isPlaying(), true); QCOMPARE(video.isPaused(), false); QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); QCOMPARE(playingChangedSpy.count(), ++playingChanged); QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); QCOMPARE(startedSpy.count(), ++started); QCOMPARE(pausedSpy.count(), paused); QCOMPARE(resumedSpy.count(), resumed); QCOMPARE(stoppedSpy.count(), stopped); } void tst_QDeclarativeVideo::error() { const QString errorString = QLatin1String("Failed to open device."); QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); QSignalSpy errorSpy(&video, SIGNAL(error(QDeclarativeVideo::Error,QString))); QSignalSpy errorChangedSpy(&video, SIGNAL(errorChanged())); QCOMPARE(video.error(), QDeclarativeVideo::NoError); QCOMPARE(video.errorString(), QString()); provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString); QCOMPARE(video.error(), QDeclarativeVideo::ResourceError); QCOMPARE(video.errorString(), errorString); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 1); // Changing the source resets the error properties. video.setSource(QUrl("http://example.com")); QCOMPARE(video.error(), QDeclarativeVideo::NoError); QCOMPARE(video.errorString(), QString()); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 2); // But isn't noisy. video.setSource(QUrl("file:///file/path")); QCOMPARE(video.error(), QDeclarativeVideo::NoError); QCOMPARE(video.errorString(), QString()); QCOMPARE(errorSpy.count(), 1); QCOMPARE(errorChangedSpy.count(), 2); } void tst_QDeclarativeVideo::hasAudio() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); QSignalSpy spy(&video, SIGNAL(hasAudioChanged())); QCOMPARE(video.hasAudio(), false); provider.playerControl()->setAudioAvailable(true); QCOMPARE(video.hasAudio(), true); QCOMPARE(spy.count(), 1); provider.playerControl()->setAudioAvailable(true); QCOMPARE(video.hasAudio(), true); QCOMPARE(spy.count(), 2); provider.playerControl()->setAudioAvailable(false); QCOMPARE(video.hasAudio(), false); QCOMPARE(spy.count(), 3); } void tst_QDeclarativeVideo::hasVideo() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); QSignalSpy spy(&video, SIGNAL(hasVideoChanged())); QCOMPARE(video.hasVideo(), false); provider.playerControl()->setVideoAvailable(true); QCOMPARE(video.hasVideo(), true); QCOMPARE(spy.count(), 1); provider.playerControl()->setVideoAvailable(true); QCOMPARE(video.hasVideo(), true); QCOMPARE(spy.count(), 2); provider.playerControl()->setVideoAvailable(false); QCOMPARE(video.hasVideo(), false); QCOMPARE(spy.count(), 3); } void tst_QDeclarativeVideo::fillMode() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); QList children = video.childItems(); QCOMPARE(children.count(), 1); QGraphicsVideoItem *videoItem = qgraphicsitem_cast(children.first()); QVERIFY(videoItem != 0); QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectFit); video.setFillMode(QDeclarativeVideo::PreserveAspectCrop); QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectCrop); QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatioByExpanding); video.setFillMode(QDeclarativeVideo::Stretch); QCOMPARE(video.fillMode(), QDeclarativeVideo::Stretch); QCOMPARE(videoItem->aspectRatioMode(), Qt::IgnoreAspectRatio); video.setFillMode(QDeclarativeVideo::PreserveAspectFit); QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectFit); QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatio); } void tst_QDeclarativeVideo::geometry() { QtTestMediaServiceProvider provider; QDeclarativeVideo video; video.classBegin(); video.componentComplete(); QList children = video.childItems(); QCOMPARE(children.count(), 1); QGraphicsVideoItem *videoItem = qgraphicsitem_cast(children.first()); QVERIFY(videoItem != 0); { // Surface setup is deferred until after the first paint. QImage image(320, 240, QImage::Format_RGB32); QPainter painter(&image); videoItem->paint(&painter, 0); } QAbstractVideoSurface *surface = provider.rendererControl()->surface(); //video item can use overlay, QAbstractVideoSurface is not used than. if (surface) { QVideoSurfaceFormat format(QSize(640, 480), QVideoFrame::Format_RGB32); QVERIFY(surface->start(format)); QCoreApplication::processEvents(); QCOMPARE(video.implicitWidth(), qreal(640)); QCOMPARE(video.implicitHeight(), qreal(480)); } video.setWidth(560); video.setHeight(328); QCOMPARE(videoItem->size().width(), qreal(560)); QCOMPARE(videoItem->size().height(), qreal(328)); } QTEST_MAIN(tst_QDeclarativeVideo) #include "tst_qdeclarativevideo.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qgraphicsvideoitem/000077500000000000000000000000001225012771600315575ustar00rootroot00000000000000qgraphicsvideoitem.pro000066400000000000000000000003151225012771600361100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qgraphicsvideoitemCONFIG += testcase TARGET = tst_qgraphicsvideoitem QT += multimedia-private multimediawidgets-private testlib SOURCES += tst_qgraphicsvideoitem.cpp QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qgraphicsvideoitem.cpp000066400000000000000000000451631225012771600367760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qgraphicsvideoitem/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include "qgraphicsvideoitem.h" #include #include "qmediaobject.h" #include "qmediaservice.h" #include #include "qvideorenderercontrol.h" #include #include #include #include #include QT_USE_NAMESPACE class tst_QGraphicsVideoItem : public QObject { Q_OBJECT public slots: void initTestCase(); private slots: void nullObject(); void nullService(); void noOutputs(); void serviceDestroyed(); void mediaObjectDestroyed(); void setMediaObject(); void show(); void aspectRatioMode(); void offset(); void size(); void nativeSize_data(); void nativeSize(); void boundingRect_data(); void boundingRect(); void paint(); }; Q_DECLARE_METATYPE(const uchar *) Q_DECLARE_METATYPE(Qt::AspectRatioMode) class QtTestRendererControl : public QVideoRendererControl { public: QtTestRendererControl() : m_surface(0) { } QAbstractVideoSurface *surface() const { return m_surface; } void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } private: QAbstractVideoSurface *m_surface; }; class QtTestVideoService : public QMediaService { Q_OBJECT public: QtTestVideoService( QtTestRendererControl *renderer) : QMediaService(0) , rendererRef(0) , rendererControl(renderer) { } ~QtTestVideoService() { delete rendererControl; } QMediaControl *requestControl(const char *name) { if (qstrcmp(name, QVideoRendererControl_iid) == 0 && rendererControl) { rendererRef += 1; return rendererControl; } else { return 0; } } void releaseControl(QMediaControl *control) { Q_ASSERT(control); if (control == rendererControl) { rendererRef -= 1; if (rendererRef == 0) rendererControl->setSurface(0); } } int rendererRef; QtTestRendererControl *rendererControl; }; class QtTestVideoObject : public QMediaObject { Q_OBJECT public: QtTestVideoObject(QtTestRendererControl *renderer) : QMediaObject(0, new QtTestVideoService(renderer)) { testService = qobject_cast(service()); } QtTestVideoObject(QtTestVideoService *service): QMediaObject(0, service), testService(service) { } ~QtTestVideoObject() { delete testService; } QtTestVideoService *testService; }; class QtTestGraphicsVideoItem : public QGraphicsVideoItem { public: QtTestGraphicsVideoItem(QGraphicsItem *parent = 0) : QGraphicsVideoItem(parent) , m_paintCount(0) { } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { ++m_paintCount; QTestEventLoop::instance().exitLoop(); QGraphicsVideoItem::paint(painter, option, widget); } bool waitForPaint(int secs) { const int paintCount = m_paintCount; QTestEventLoop::instance().enterLoop(secs); return m_paintCount != paintCount; } int paintCount() const { return m_paintCount; } private: int m_paintCount; }; void tst_QGraphicsVideoItem::initTestCase() { qRegisterMetaType(); } void tst_QGraphicsVideoItem::nullObject() { QGraphicsVideoItem item(0); QVERIFY(item.boundingRect().isEmpty()); } void tst_QGraphicsVideoItem::nullService() { QtTestVideoService *service = 0; QtTestVideoObject object(service); QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; object.bind(item); QVERIFY(item->boundingRect().isEmpty()); item->hide(); item->show(); QGraphicsScene graphicsScene; graphicsScene.addItem(item); QGraphicsView graphicsView(&graphicsScene); graphicsView.show(); } void tst_QGraphicsVideoItem::noOutputs() { QtTestRendererControl *control = 0; QtTestVideoObject object(control); QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; object.bind(item); QVERIFY(item->boundingRect().isEmpty()); item->hide(); item->show(); QGraphicsScene graphicsScene; graphicsScene.addItem(item); QGraphicsView graphicsView(&graphicsScene); graphicsView.show(); } void tst_QGraphicsVideoItem::serviceDestroyed() { QtTestVideoObject object(new QtTestRendererControl); QGraphicsVideoItem item; object.bind(&item); QCOMPARE(object.testService->rendererRef, 1); QtTestVideoService *service = object.testService; object.testService = 0; delete service; QCOMPARE(item.mediaObject(), static_cast(&object)); QVERIFY(item.boundingRect().isEmpty()); } void tst_QGraphicsVideoItem::mediaObjectDestroyed() { QtTestVideoObject *object = new QtTestVideoObject(new QtTestRendererControl); QGraphicsVideoItem item; object->bind(&item); QCOMPARE(object->testService->rendererRef, 1); delete object; object = 0; QCOMPARE(item.mediaObject(), static_cast(object)); QVERIFY(item.boundingRect().isEmpty()); } void tst_QGraphicsVideoItem::setMediaObject() { QMediaObject *nullObject = 0; QtTestVideoObject object(new QtTestRendererControl); QGraphicsVideoItem item; QCOMPARE(item.mediaObject(), nullObject); QCOMPARE(object.testService->rendererRef, 0); object.bind(&item); QCOMPARE(item.mediaObject(), static_cast(&object)); QCOMPARE(object.testService->rendererRef, 1); QVERIFY(object.testService->rendererControl->surface() == 0); { // Surface setup is deferred until after the first paint. QImage image(320, 240, QImage::Format_RGB32); QPainter painter(&image); item.paint(&painter, 0); } QVERIFY(object.testService->rendererControl->surface() != 0); object.unbind(&item); QCOMPARE(item.mediaObject(), nullObject); QCOMPARE(object.testService->rendererRef, 0); QVERIFY(object.testService->rendererControl->surface() == 0); item.setVisible(false); object.bind(&item); QCOMPARE(item.mediaObject(), static_cast(&object)); QCOMPARE(object.testService->rendererRef, 1); QVERIFY(object.testService->rendererControl->surface() != 0); } void tst_QGraphicsVideoItem::show() { QtTestVideoObject object(new QtTestRendererControl); QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; object.bind(item); // Graphics items are visible by default QCOMPARE(object.testService->rendererRef, 1); QVERIFY(object.testService->rendererControl->surface() == 0); item->hide(); QCOMPARE(object.testService->rendererRef, 1); item->show(); QCOMPARE(object.testService->rendererRef, 1); QVERIFY(object.testService->rendererControl->surface() == 0); QGraphicsScene graphicsScene; graphicsScene.addItem(item); QGraphicsView graphicsView(&graphicsScene); graphicsView.show(); QVERIFY(item->paintCount() || item->waitForPaint(1)); QVERIFY(object.testService->rendererControl->surface() != 0); QVERIFY(item->boundingRect().isEmpty()); QVideoSurfaceFormat format(QSize(320,240),QVideoFrame::Format_RGB32); QVERIFY(object.testService->rendererControl->surface()->start(format)); QCoreApplication::processEvents(); QVERIFY(!item->boundingRect().isEmpty()); } void tst_QGraphicsVideoItem::aspectRatioMode() { QGraphicsVideoItem item; QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatio); item.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(item.aspectRatioMode(), Qt::IgnoreAspectRatio); item.setAspectRatioMode(Qt::KeepAspectRatioByExpanding); QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatioByExpanding); item.setAspectRatioMode(Qt::KeepAspectRatio); QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatio); } void tst_QGraphicsVideoItem::offset() { QGraphicsVideoItem item; QCOMPARE(item.offset(), QPointF(0, 0)); item.setOffset(QPointF(-32.4, 43.0)); QCOMPARE(item.offset(), QPointF(-32.4, 43.0)); item.setOffset(QPointF(1, 1)); QCOMPARE(item.offset(), QPointF(1, 1)); item.setOffset(QPointF(12, -30.4)); QCOMPARE(item.offset(), QPointF(12, -30.4)); item.setOffset(QPointF(-90.4, -75)); QCOMPARE(item.offset(), QPointF(-90.4, -75)); } void tst_QGraphicsVideoItem::size() { QGraphicsVideoItem item; QCOMPARE(item.size(), QSizeF(320, 240)); item.setSize(QSizeF(542.5, 436.3)); QCOMPARE(item.size(), QSizeF(542.5, 436.3)); item.setSize(QSizeF(-43, 12)); QCOMPARE(item.size(), QSizeF(0, 0)); item.setSize(QSizeF(54, -9)); QCOMPARE(item.size(), QSizeF(0, 0)); item.setSize(QSizeF(-90, -65)); QCOMPARE(item.size(), QSizeF(0, 0)); item.setSize(QSizeF(1000, 1000)); QCOMPARE(item.size(), QSizeF(1000, 1000)); } void tst_QGraphicsVideoItem::nativeSize_data() { QTest::addColumn("frameSize"); QTest::addColumn("viewport"); QTest::addColumn("pixelAspectRatio"); QTest::addColumn("nativeSize"); QTest::newRow("640x480") << QSize(640, 480) << QRect(0, 0, 640, 480) << QSize(1, 1) << QSizeF(640, 480); QTest::newRow("800x600, (80,60, 640x480) viewport") << QSize(800, 600) << QRect(80, 60, 640, 480) << QSize(1, 1) << QSizeF(640, 480); QTest::newRow("800x600, (80,60, 640x480) viewport, 4:3") << QSize(800, 600) << QRect(80, 60, 640, 480) << QSize(4, 3) << QSizeF(853, 480); } void tst_QGraphicsVideoItem::nativeSize() { QFETCH(QSize, frameSize); QFETCH(QRect, viewport); QFETCH(QSize, pixelAspectRatio); QFETCH(QSizeF, nativeSize); QtTestVideoObject object(new QtTestRendererControl); QGraphicsVideoItem item; object.bind(&item); QCOMPARE(item.nativeSize(), QSizeF()); QSignalSpy spy(&item, SIGNAL(nativeSizeChanged(QSizeF))); QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); format.setViewport(viewport); format.setPixelAspectRatio(pixelAspectRatio); { // Surface setup is deferred until after the first paint. QImage image(320, 240, QImage::Format_RGB32); QPainter painter(&image); item.paint(&painter, 0); } QVERIFY(object.testService->rendererControl->surface() != 0); QVERIFY(object.testService->rendererControl->surface()->start(format)); QCoreApplication::processEvents(); QCOMPARE(item.nativeSize(), nativeSize); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last().first().toSizeF(), nativeSize); object.testService->rendererControl->surface()->stop(); QCoreApplication::processEvents(); QVERIFY(item.nativeSize().isEmpty()); QCOMPARE(spy.count(), 2); QVERIFY(spy.last().first().toSizeF().isEmpty()); } void tst_QGraphicsVideoItem::boundingRect_data() { QTest::addColumn("frameSize"); QTest::addColumn("offset"); QTest::addColumn("size"); QTest::addColumn("aspectRatioMode"); QTest::addColumn("expectedRect"); QTest::newRow("640x480: (0,0 640x480), Keep") << QSize(640, 480) << QPointF(0, 0) << QSizeF(640, 480) << Qt::KeepAspectRatio << QRectF(0, 0, 640, 480); QTest::newRow("800x600, (0,0, 640x480), Keep") << QSize(800, 600) << QPointF(0, 0) << QSizeF(640, 480) << Qt::KeepAspectRatio << QRectF(0, 0, 640, 480); QTest::newRow("800x600, (0,0, 640x480), KeepByExpanding") << QSize(800, 600) << QPointF(0, 0) << QSizeF(640, 480) << Qt::KeepAspectRatioByExpanding << QRectF(0, 0, 640, 480); QTest::newRow("800x600, (0,0, 640x480), Ignore") << QSize(800, 600) << QPointF(0, 0) << QSizeF(640, 480) << Qt::IgnoreAspectRatio << QRectF(0, 0, 640, 480); QTest::newRow("800x600, (100,100, 640x480), Keep") << QSize(800, 600) << QPointF(100, 100) << QSizeF(640, 480) << Qt::KeepAspectRatio << QRectF(100, 100, 640, 480); QTest::newRow("800x600, (100,-100, 640x480), KeepByExpanding") << QSize(800, 600) << QPointF(100, -100) << QSizeF(640, 480) << Qt::KeepAspectRatioByExpanding << QRectF(100, -100, 640, 480); QTest::newRow("800x600, (-100,-100, 640x480), Ignore") << QSize(800, 600) << QPointF(-100, -100) << QSizeF(640, 480) << Qt::IgnoreAspectRatio << QRectF(-100, -100, 640, 480); QTest::newRow("800x600, (0,0, 1920x1024), Keep") << QSize(800, 600) << QPointF(0, 0) << QSizeF(1920, 1024) << Qt::KeepAspectRatio << QRectF(832.0 / 3, 0, 4096.0 / 3, 1024); QTest::newRow("800x600, (0,0, 1920x1024), KeepByExpanding") << QSize(800, 600) << QPointF(0, 0) << QSizeF(1920, 1024) << Qt::KeepAspectRatioByExpanding << QRectF(0, 0, 1920, 1024); QTest::newRow("800x600, (0,0, 1920x1024), Ignore") << QSize(800, 600) << QPointF(0, 0) << QSizeF(1920, 1024) << Qt::IgnoreAspectRatio << QRectF(0, 0, 1920, 1024); QTest::newRow("800x600, (100,100, 1920x1024), Keep") << QSize(800, 600) << QPointF(100, 100) << QSizeF(1920, 1024) << Qt::KeepAspectRatio << QRectF(100 + 832.0 / 3, 100, 4096.0 / 3, 1024); QTest::newRow("800x600, (100,-100, 1920x1024), KeepByExpanding") << QSize(800, 600) << QPointF(100, -100) << QSizeF(1920, 1024) << Qt::KeepAspectRatioByExpanding << QRectF(100, -100, 1920, 1024); QTest::newRow("800x600, (-100,-100, 1920x1024), Ignore") << QSize(800, 600) << QPointF(-100, -100) << QSizeF(1920, 1024) << Qt::IgnoreAspectRatio << QRectF(-100, -100, 1920, 1024); } void tst_QGraphicsVideoItem::boundingRect() { QFETCH(QSize, frameSize); QFETCH(QPointF, offset); QFETCH(QSizeF, size); QFETCH(Qt::AspectRatioMode, aspectRatioMode); QFETCH(QRectF, expectedRect); QtTestVideoObject object(new QtTestRendererControl); QGraphicsVideoItem item; object.bind(&item); item.setOffset(offset); item.setSize(size); item.setAspectRatioMode(aspectRatioMode); QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); { // Surface setup is deferred until after the first paint. QImage image(320, 240, QImage::Format_RGB32); QPainter painter(&image); item.paint(&painter, 0); } QVERIFY(object.testService->rendererControl->surface() != 0); QVERIFY(object.testService->rendererControl->surface()->start(format)); QCoreApplication::processEvents(); QCOMPARE(item.boundingRect(), expectedRect); } static const uchar rgb32ImageData[] = { 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 }; void tst_QGraphicsVideoItem::paint() { QtTestVideoObject object(new QtTestRendererControl); QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; object.bind(item); QGraphicsScene graphicsScene; graphicsScene.addItem(item); QGraphicsView graphicsView(&graphicsScene); graphicsView.show(); QVERIFY(item->waitForPaint(1)); QPainterVideoSurface *surface = qobject_cast( object.testService->rendererControl->surface()); if (!surface) QSKIP("QGraphicsVideoItem is not QPainterVideoSurface based"); QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); QVERIFY(surface->start(format)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); QVERIFY(item->waitForPaint(1)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); frame.map(QAbstractVideoBuffer::WriteOnly); memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); frame.unmap(); QVERIFY(surface->present(frame)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), false); QVERIFY(item->waitForPaint(1)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); } QTEST_MAIN(tst_QGraphicsVideoItem) #include "tst_qgraphicsvideoitem.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediabindableinterface/000077500000000000000000000000001225012771600324725ustar00rootroot00000000000000qmediabindableinterface.pro000066400000000000000000000004211225012771600377340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediabindableinterfaceCONFIG += testcase TARGET = tst_qmediabindableinterface QT += multimedia-private testlib SOURCES += \ tst_qmediabindableinterface.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockrecorder.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediabindableinterface.cpp000066400000000000000000000112471225012771600406200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediabindableinterface/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include "mockmediacontainercontrol.h" #include "mockmetadatawritercontrol.h" #include "mockmediarecordercontrol.h" #include "mockmediaobject.h" QT_USE_NAMESPACE class TestBindableService : public QMediaService { Q_OBJECT public: TestBindableService(QObject *parent, QMediaControl *control): QMediaService(parent), mockControl(control), hasControls(true) { mockContainerControl = new MockMediaContainerControl(parent); //Creating the object for Media mockMetaDataControl = new MockMetaDataWriterControl(parent); //Creating the object for MetaData } QMediaControl* requestControl(const char *name) { if (hasControls && qstrcmp(name,QMediaRecorderControl_iid) == 0) return mockControl; if (hasControls && qstrcmp(name,QMediaContainerControl_iid) == 0) return mockContainerControl; if (hasControls && qstrcmp(name, QMetaDataWriterControl_iid) == 0) return mockMetaDataControl; return 0; } void releaseControl(QMediaControl*) {} //Initialising the objects for the media QMediaControl *mockControl; QMediaContainerControl *mockContainerControl; MockMetaDataWriterControl *mockMetaDataControl; bool hasControls; }; class tst_QMediaBindableInterface:public QObject { Q_OBJECT private slots: void init() { } void cleanup() { } void testMediaObject() //Verifying the mediaobject api { MockMediaRecorderControl recorderControl(0); TestBindableService service(0, &recorderControl); service.mockMetaDataControl->populateMetaData(); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QMediaObject *obj = recorder.mediaObject(); QVERIFY(obj != NULL); QVERIFY(obj->isAvailable()); } void testDestructor() //Invoking the destructor { MockMediaRecorderControl recorderControl(0); TestBindableService service(0, &recorderControl); service.mockMetaDataControl->populateMetaData(); MockMediaObject object(0, &service); QMediaRecorder *recorder = new QMediaRecorder(&object); QVERIFY(recorder->isAvailable()); delete recorder; recorder = NULL; } }; QTEST_MAIN(tst_QMediaBindableInterface) #include "tst_qmediabindableinterface.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontainercontrol/000077500000000000000000000000001225012771600324345ustar00rootroot00000000000000qmediacontainercontrol.pro000066400000000000000000000003421225012771600376420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontainercontrolCONFIG += testcase TARGET = tst_qmediacontainercontrol QT += multimedia-private testlib SOURCES += tst_qmediacontainercontrol.cpp include (../qmultimedia_common/mockcontainer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediacontainercontrol.cpp000066400000000000000000000060231225012771600405200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontainercontrol/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include "qmediacontainercontrol.h" #include "qmediarecorder.h" #include "../qmultimedia_common/mockmediacontainercontrol.h" //MaemoAPI- class tst_QMediaContainerControl :public QObject { Q_OBJECT private slots: //to test the constructor void tst_mediacontainercontrol() { QObject obj; MockMediaContainerControl control(&obj); QStringList strlist=control.supportedContainers(); QStringList strlist1; strlist1 << "wav" << "mp3" << "mov"; QVERIFY(strlist[0]==strlist1[0]); //checking with "wav" mime type QVERIFY(strlist[1]==strlist1[1]); //checking with "mp3" mime type QVERIFY(strlist[2]==strlist1[2]); //checking with "mov" mime type control.setContainerFormat("wav"); const QString str("wav"); QVERIFY2(control.containerFormat() == str,"Failed"); const QString str1("WAV format"); QVERIFY2(control.containerDescription("wav") == str1,"FAILED"); } }; QTEST_MAIN(tst_QMediaContainerControl); #include "tst_qmediacontainercontrol.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontent/000077500000000000000000000000001225012771600305235ustar00rootroot00000000000000qmediacontent.pro000066400000000000000000000002441225012771600340210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontentCONFIG += testcase TARGET = tst_qmediacontent QT += multimedia-private network testlib SOURCES += tst_qmediacontent.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediacontent.cpp000066400000000000000000000156151225012771600347050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediacontent/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include //TESTED_COMPONENT=src/multimedia QT_USE_NAMESPACE class tst_QMediaContent : public QObject { Q_OBJECT private slots: void testNull(); void testUrlCtor(); void testRequestCtor(); void testResourceCtor(); void testResourceListCtor(); void testCopy(); void testAssignment(); void testEquality(); void testResources(); void testPlaylist(); }; void tst_QMediaContent::testNull() { QMediaContent media; QCOMPARE(media.isNull(), true); QCOMPARE(media.canonicalUrl(), QUrl()); QCOMPARE(media.canonicalResource(), QMediaResource()); QCOMPARE(media.resources(), QMediaResourceList()); } void tst_QMediaContent::testUrlCtor() { QMediaContent media(QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); } void tst_QMediaContent::testRequestCtor() { QNetworkRequest request(QUrl("http://example.com/movie.mov")); request.setAttribute(QNetworkRequest::User, QVariant(1234)); QMediaContent media(request); QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalRequest(),request); QCOMPARE(media.canonicalResource().request(), request); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); } void tst_QMediaContent::testResourceCtor() { QMediaContent media(QMediaResource(QUrl("http://example.com/movie.mov"))); QCOMPARE(media.canonicalResource(), QMediaResource(QUrl("http://example.com/movie.mov"))); } void tst_QMediaContent::testResourceListCtor() { QMediaResourceList resourceList; resourceList << QMediaResource(QUrl("http://example.com/movie.mov")); QMediaContent media(resourceList); QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); } void tst_QMediaContent::testCopy() { QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); QMediaContent media2(media1); QVERIFY(media1 == media2); } void tst_QMediaContent::testAssignment() { QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); QMediaContent media2; QMediaContent media3; media2 = media1; QVERIFY(media2 == media1); media2 = media3; QVERIFY(media2 == media3); } void tst_QMediaContent::testEquality() { QMediaContent media1; QMediaContent media2; QMediaContent media3(QMediaResource(QUrl("http://example.com/movie.mov"))); QMediaContent media4(QMediaResource(QUrl("http://example.com/movie.mov"))); QMediaContent media5(QMediaResource(QUrl("file:///some/where/over/the/rainbow.mp3"))); // null == null QCOMPARE(media1 == media2, true); QCOMPARE(media1 != media2, false); // null != something QCOMPARE(media1 == media3, false); QCOMPARE(media1 != media3, true); // equiv QCOMPARE(media3 == media4, true); QCOMPARE(media3 != media4, false); // not equiv QCOMPARE(media4 == media5, false); QCOMPARE(media4 != media5, true); } void tst_QMediaContent::testResources() { QMediaResourceList resourceList; resourceList << QMediaResource(QUrl("http://example.com/movie-main.mov")); resourceList << QMediaResource(QUrl("http://example.com/movie-big.mov")); QMediaContent media(resourceList); QMediaResourceList res = media.resources(); QCOMPARE(res.size(), 2); QCOMPARE(res[0], QMediaResource(QUrl("http://example.com/movie-main.mov"))); QCOMPARE(res[1], QMediaResource(QUrl("http://example.com/movie-big.mov"))); } void tst_QMediaContent::testPlaylist() { QMediaContent media(QUrl("http://example.com/movie.mov")); QVERIFY(media.canonicalUrl().isValid()); QVERIFY(!media.playlist()); { QPointer playlist(new QMediaPlaylist); media = QMediaContent(playlist.data(), QUrl("http://example.com/sample.m3u"), true); QVERIFY(media.canonicalUrl().isValid()); QCOMPARE(media.playlist(), playlist.data()); media = QMediaContent(); // Make sure playlist is destroyed by QMediaContent QTRY_VERIFY(!playlist); } { QMediaPlaylist *playlist = new QMediaPlaylist; media = QMediaContent(playlist, QUrl("http://example.com/sample.m3u"), true); // Delete playlist outside QMediaContent delete playlist; QVERIFY(!media.playlist()); media = QMediaContent(); } { QPointer playlist(new QMediaPlaylist); media = QMediaContent(playlist.data(), QUrl(), false); QVERIFY(!media.canonicalUrl().isValid()); QCOMPARE(media.playlist(), playlist.data()); media = QMediaContent(); QVERIFY(playlist); delete playlist.data(); } } QTEST_MAIN(tst_QMediaContent) #include "tst_qmediacontent.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaobject/000077500000000000000000000000001225012771600303175ustar00rootroot00000000000000qmediaobject.pro000066400000000000000000000004221225012771600334070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaobjectCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qmediaobject QT += multimedia-private testlib include (../qmultimedia_common/mockrecorder.pri) include (../qmultimedia_common/mock.pri) SOURCES += tst_qmediaobject.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaobject.cpp000066400000000000000000000360301225012771600342670ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaobject/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include "mockmediarecorderservice.h" #include "mockmediaserviceprovider.h" #include "mockmetadatareadercontrol.h" #include "mockavailabilitycontrol.h" class QtTestMediaObjectService : public QMediaService { Q_OBJECT public: QtTestMediaObjectService(QObject *parent = 0, MockAvailabilityControl *availability = 0) : QMediaService(parent) , availabilityControl(availability) , metaDataRef(0) , hasMetaData(true) { } QMediaControl *requestControl(const char *iid) { if (hasMetaData && qstrcmp(iid, QMetaDataReaderControl_iid) == 0) return &metaData; else if (qstrcmp(iid, QMediaAvailabilityControl_iid) == 0) return availabilityControl; else return 0; } void releaseControl(QMediaControl *) { } MockMetaDataReaderControl metaData; MockAvailabilityControl *availabilityControl; int metaDataRef; bool hasMetaData; }; QT_USE_NAMESPACE class tst_QMediaObject : public QObject { Q_OBJECT private slots: void propertyWatch(); void notifySignals_data(); void notifySignals(); void notifyInterval_data(); void notifyInterval(); void nullMetaDataControl(); void isMetaDataAvailable(); void metaDataChanged(); void metaData_data(); void metaData(); void availability(); void service(); private: void setupNotifyTests(); }; class QtTestMediaObject : public QMediaObject { Q_OBJECT Q_PROPERTY(int a READ a WRITE setA NOTIFY aChanged) Q_PROPERTY(int b READ b WRITE setB NOTIFY bChanged) Q_PROPERTY(int c READ c WRITE setC NOTIFY cChanged) Q_PROPERTY(int d READ d WRITE setD) public: QtTestMediaObject(QMediaService *service = 0): QMediaObject(0, service), m_a(0), m_b(0), m_c(0), m_d(0) {} using QMediaObject::addPropertyWatch; using QMediaObject::removePropertyWatch; int a() const { return m_a; } void setA(int a) { m_a = a; } int b() const { return m_b; } void setB(int b) { m_b = b; } int c() const { return m_c; } void setC(int c) { m_c = c; } int d() const { return m_d; } void setD(int d) { m_d = d; } Q_SIGNALS: void aChanged(int a); void bChanged(int b); void cChanged(int c); private: int m_a; int m_b; int m_c; int m_d; }; void tst_QMediaObject::propertyWatch() { QtTestMediaObject object; object.setNotifyInterval(0); QEventLoop loop; connect(&object, SIGNAL(aChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); connect(&object, SIGNAL(bChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); connect(&object, SIGNAL(cChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy aSpy(&object, SIGNAL(aChanged(int))); QSignalSpy bSpy(&object, SIGNAL(bChanged(int))); QSignalSpy cSpy(&object, SIGNAL(cChanged(int))); QTestEventLoop::instance().enterLoop(1); QCOMPARE(aSpy.count(), 0); QCOMPARE(bSpy.count(), 0); QCOMPARE(cSpy.count(), 0); int aCount = 0; int bCount = 0; int cCount = 0; object.addPropertyWatch("a"); QTestEventLoop::instance().enterLoop(1); QVERIFY(aSpy.count() > aCount); QCOMPARE(bSpy.count(), 0); QCOMPARE(cSpy.count(), 0); QCOMPARE(aSpy.last().value(0).toInt(), 0); aCount = aSpy.count(); object.setA(54); object.setB(342); object.setC(233); QTestEventLoop::instance().enterLoop(1); QVERIFY(aSpy.count() > aCount); QCOMPARE(bSpy.count(), 0); QCOMPARE(cSpy.count(), 0); QCOMPARE(aSpy.last().value(0).toInt(), 54); aCount = aSpy.count(); object.addPropertyWatch("b"); object.addPropertyWatch("d"); object.removePropertyWatch("e"); object.setA(43); object.setB(235); object.setC(90); QTestEventLoop::instance().enterLoop(1); QVERIFY(aSpy.count() > aCount); QVERIFY(bSpy.count() > bCount); QCOMPARE(cSpy.count(), 0); QCOMPARE(aSpy.last().value(0).toInt(), 43); QCOMPARE(bSpy.last().value(0).toInt(), 235); aCount = aSpy.count(); bCount = bSpy.count(); object.removePropertyWatch("a"); object.addPropertyWatch("c"); object.addPropertyWatch("e"); QTestEventLoop::instance().enterLoop(1); QCOMPARE(aSpy.count(), aCount); QVERIFY(bSpy.count() > bCount); QVERIFY(cSpy.count() > cCount); QCOMPARE(bSpy.last().value(0).toInt(), 235); QCOMPARE(cSpy.last().value(0).toInt(), 90); bCount = bSpy.count(); cCount = cSpy.count(); object.setA(435); object.setC(9845); QTestEventLoop::instance().enterLoop(1); QCOMPARE(aSpy.count(), aCount); QVERIFY(bSpy.count() > bCount); QVERIFY(cSpy.count() > cCount); QCOMPARE(bSpy.last().value(0).toInt(), 235); QCOMPARE(cSpy.last().value(0).toInt(), 9845); bCount = bSpy.count(); cCount = cSpy.count(); object.setA(8432); object.setB(324); object.setC(443); object.removePropertyWatch("c"); object.removePropertyWatch("d"); QTestEventLoop::instance().enterLoop(1); QCOMPARE(aSpy.count(), aCount); QVERIFY(bSpy.count() > bCount); QCOMPARE(cSpy.count(), cCount); QCOMPARE(bSpy.last().value(0).toInt(), 324); QCOMPARE(cSpy.last().value(0).toInt(), 9845); bCount = bSpy.count(); object.removePropertyWatch("b"); QTestEventLoop::instance().enterLoop(1); QCOMPARE(aSpy.count(), aCount); QCOMPARE(bSpy.count(), bCount); QCOMPARE(cSpy.count(), cCount); } void tst_QMediaObject::setupNotifyTests() { QTest::addColumn("interval"); QTest::addColumn("count"); QTest::newRow("single 750ms") << 750 << 1; QTest::newRow("single 600ms") << 600 << 1; QTest::newRow("x3 300ms") << 300 << 3; QTest::newRow("x5 180ms") << 180 << 5; } void tst_QMediaObject::notifySignals_data() { setupNotifyTests(); } void tst_QMediaObject::notifySignals() { QFETCH(int, interval); QFETCH(int, count); QtTestMediaObject object; object.setNotifyInterval(interval); object.addPropertyWatch("a"); QSignalSpy spy(&object, SIGNAL(aChanged(int))); QTestEventLoop::instance().enterLoop(1); QCOMPARE(spy.count(), count); } void tst_QMediaObject::notifyInterval_data() { setupNotifyTests(); } void tst_QMediaObject::notifyInterval() { QFETCH(int, interval); QtTestMediaObject object; QSignalSpy spy(&object, SIGNAL(notifyIntervalChanged(int))); object.setNotifyInterval(interval); QCOMPARE(object.notifyInterval(), interval); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last().value(0).toInt(), interval); object.setNotifyInterval(interval); QCOMPARE(object.notifyInterval(), interval); QCOMPARE(spy.count(), 1); } void tst_QMediaObject::nullMetaDataControl() { const QString titleKey(QLatin1String("Title")); const QString title(QLatin1String("Host of Seraphim")); QtTestMediaObjectService service; service.hasMetaData = false; QtTestMediaObject object(&service); QSignalSpy spy(&object, SIGNAL(metaDataChanged())); QCOMPARE(object.isMetaDataAvailable(), false); QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), QString()); QCOMPARE(object.availableMetaData(), QStringList()); QCOMPARE(spy.count(), 0); } void tst_QMediaObject::isMetaDataAvailable() { QtTestMediaObjectService service; service.metaData.setMetaDataAvailable(false); QtTestMediaObject object(&service); QCOMPARE(object.isMetaDataAvailable(), false); QSignalSpy spy(&object, SIGNAL(metaDataAvailableChanged(bool))); service.metaData.setMetaDataAvailable(true); QCOMPARE(object.isMetaDataAvailable(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.at(0).at(0).toBool(), true); service.metaData.setMetaDataAvailable(false); QCOMPARE(object.isMetaDataAvailable(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.at(1).at(0).toBool(), false); } void tst_QMediaObject::metaDataChanged() { QtTestMediaObjectService service; QtTestMediaObject object(&service); QSignalSpy changedSpy(&object, SIGNAL(metaDataChanged())); QSignalSpy changedWithValueSpy(&object, SIGNAL(metaDataChanged(QString, QVariant))); service.metaData.setMetaData("key", "Value"); QCOMPARE(changedSpy.count(), 1); QCOMPARE(changedWithValueSpy.count(), 1); QCOMPARE(changedWithValueSpy.last()[0], QVariant("key")); QCOMPARE(changedWithValueSpy.last()[1].value(), QVariant("Value")); service.metaData.setMetaData("key", "Value"); QCOMPARE(changedSpy.count(), 1); QCOMPARE(changedWithValueSpy.count(), 1); service.metaData.setMetaData("key2", "Value"); QCOMPARE(changedSpy.count(), 2); QCOMPARE(changedWithValueSpy.count(), 2); QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2")); QCOMPARE(changedWithValueSpy.last()[1].value(), QVariant("Value")); } void tst_QMediaObject::metaData_data() { QTest::addColumn("artist"); QTest::addColumn("title"); QTest::addColumn("genre"); QTest::newRow("") << QString::fromLatin1("Dead Can Dance") << QString::fromLatin1("Host of Seraphim") << QString::fromLatin1("Awesome"); } void tst_QMediaObject::metaData() { QFETCH(QString, artist); QFETCH(QString, title); QFETCH(QString, genre); QtTestMediaObjectService service; service.metaData.populateMetaData(); QtTestMediaObject object(&service); QVERIFY(object.availableMetaData().isEmpty()); service.metaData.m_data.insert(QMediaMetaData::AlbumArtist, artist); service.metaData.m_data.insert(QMediaMetaData::Title, title); service.metaData.m_data.insert(QMediaMetaData::Genre, genre); QCOMPARE(object.metaData(QMediaMetaData::AlbumArtist).toString(), artist); QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), title); QStringList metaDataKeys = object.availableMetaData(); QCOMPARE(metaDataKeys.size(), 3); QVERIFY(metaDataKeys.contains(QMediaMetaData::AlbumArtist)); QVERIFY(metaDataKeys.contains(QMediaMetaData::Title)); QVERIFY(metaDataKeys.contains(QMediaMetaData::Genre)); } void tst_QMediaObject::availability() { { QtTestMediaObject nullObject(0); QCOMPARE(nullObject.isAvailable(), false); QCOMPARE(nullObject.availability(), QMultimedia::ServiceMissing); } { QtTestMediaObjectService service; QtTestMediaObject object(&service); QCOMPARE(object.isAvailable(), true); QCOMPARE(object.availability(), QMultimedia::Available); } { MockAvailabilityControl available(QMultimedia::Available); QtTestMediaObjectService service(0, &available); QtTestMediaObject object(&service); QSignalSpy availabilitySpy(&object, SIGNAL(availabilityChanged(bool))); QSignalSpy availabilityStatusSpy(&object, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus))); QCOMPARE(object.isAvailable(), true); QCOMPARE(object.availability(), QMultimedia::Available); available.setAvailability(QMultimedia::Busy); QCOMPARE(object.isAvailable(), false); QCOMPARE(object.availability(), QMultimedia::Busy); QCOMPARE(availabilitySpy.count(), 1); QCOMPARE(availabilityStatusSpy.count(), 1); available.setAvailability(QMultimedia::Available); QCOMPARE(object.isAvailable(), true); QCOMPARE(object.availability(), QMultimedia::Available); QCOMPARE(availabilitySpy.count(), 2); QCOMPARE(availabilityStatusSpy.count(), 2); } { MockAvailabilityControl available(QMultimedia::Busy); QtTestMediaObjectService service(0, &available); QtTestMediaObject object(&service); QSignalSpy availabilitySpy(&object, SIGNAL(availabilityChanged(bool))); QSignalSpy availabilityStatusSpy(&object, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus))); QCOMPARE(object.isAvailable(), false); QCOMPARE(object.availability(), QMultimedia::Busy); available.setAvailability(QMultimedia::Available); QCOMPARE(object.isAvailable(), true); QCOMPARE(object.availability(), QMultimedia::Available); QCOMPARE(availabilitySpy.count(), 1); QCOMPARE(availabilityStatusSpy.count(), 1); } } void tst_QMediaObject::service() { // Create the mediaobject with service. QtTestMediaObjectService service; QtTestMediaObject mediaObject1(&service); // Get service and Compare if it equal to the service passed as an argument in mediaObject1. QMediaService *service1 = mediaObject1.service(); QVERIFY(service1 != NULL); QCOMPARE(service1,&service); // Create the mediaobject with empty service and verify that service() returns NULL. QtTestMediaObject mediaObject2; QMediaService *service2 = mediaObject2.service(); QVERIFY(service2 == NULL); } QTEST_GUILESS_MAIN(tst_QMediaObject) #include "tst_qmediaobject.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayer/000077500000000000000000000000001225012771600303455ustar00rootroot00000000000000qmediaplayer.pro000066400000000000000000000004271225012771600334700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayerCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qmediaplayer QT += network multimedia-private testlib SOURCES += tst_qmediaplayer.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockplayer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaplayer.cpp000066400000000000000000001142651225012771600343520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayer/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mockmediaserviceprovider.h" #include "mockmediaplayerservice.h" #include "mockvideosurface.h" QT_USE_NAMESPACE class AutoConnection { public: AutoConnection(QObject *sender, const char *signal, QObject *receiver, const char *method) : sender(sender), signal(signal), receiver(receiver), method(method) { QObject::connect(sender, signal, receiver, method); } ~AutoConnection() { QObject::disconnect(sender, signal, receiver, method); } private: QObject *sender; const char *signal; QObject *receiver; const char *method; }; class tst_QMediaPlayer: public QObject { Q_OBJECT public slots: void initTestCase_data(); void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void testNullService(); void testValid(); void testMedia(); void testDuration(); void testPosition(); void testVolume(); void testMuted(); void testIsAvailable(); void testVideoAvailable(); void testBufferStatus(); void testSeekable(); void testPlaybackRate(); void testError(); void testErrorString(); void testService(); void testPlay(); void testPause(); void testStop(); void testMediaStatus(); void testPlaylist(); void testNetworkAccess(); void testSetVideoOutput(); void testSetVideoOutputNoService(); void testSetVideoOutputNoControl(); void testSetVideoOutputDestruction(); void testPositionPropertyWatch(); void debugEnums(); void testPlayerFlags(); void testDestructor(); void testSupportedMimeTypes(); private: MockMediaServiceProvider *mockProvider; MockMediaPlayerService *mockService; QMediaPlayer *player; }; void tst_QMediaPlayer::initTestCase_data() { QTest::addColumn("valid"); QTest::addColumn("state"); QTest::addColumn("status"); QTest::addColumn("mediaContent"); QTest::addColumn("duration"); QTest::addColumn("position"); QTest::addColumn("seekable"); QTest::addColumn("volume"); QTest::addColumn("muted"); QTest::addColumn("videoAvailable"); QTest::addColumn("bufferStatus"); QTest::addColumn("playbackRate"); QTest::addColumn("error"); QTest::addColumn("errorString"); QTest::newRow("invalid") << false << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << QMediaContent() << qint64(0) << qint64(0) << false << 0 << false << false << 0 << qreal(0) << QMediaPlayer::NoError << QString(); QTest::newRow("valid+null") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << QMediaContent() << qint64(0) << qint64(0) << false << 0 << false << false << 50 << qreal(0) << QMediaPlayer::NoError << QString(); QTest::newRow("valid+content+stopped") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << QMediaContent(QUrl("file:///some.mp3")) << qint64(0) << qint64(0) << false << 50 << false << false << 0 << qreal(1) << QMediaPlayer::NoError << QString(); QTest::newRow("valid+content+playing") << true << QMediaPlayer::PlayingState << QMediaPlayer::LoadedMedia << QMediaContent(QUrl("file:///some.mp3")) << qint64(10000) << qint64(10) << true << 50 << true << false << 0 << qreal(1) << QMediaPlayer::NoError << QString(); QTest::newRow("valid+content+paused") << true << QMediaPlayer::PausedState << QMediaPlayer::LoadedMedia << QMediaContent(QUrl("file:///some.mp3")) << qint64(10000) << qint64(10) << true << 50 << true << false << 0 << qreal(1) << QMediaPlayer::NoError << QString(); QTest::newRow("valud+streaming") << true << QMediaPlayer::PlayingState << QMediaPlayer::LoadedMedia << QMediaContent(QUrl("http://example.com/stream")) << qint64(10000) << qint64(10000) << false << 50 << false << true << 0 << qreal(1) << QMediaPlayer::NoError << QString(); QTest::newRow("valid+error") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << QMediaContent(QUrl("http://example.com/stream")) << qint64(0) << qint64(0) << false << 50 << false << false << 0 << qreal(0) << QMediaPlayer::ResourceError << QString("Resource unavailable"); } void tst_QMediaPlayer::initTestCase() { qRegisterMetaType("QMediaPlayer::State"); qRegisterMetaType("QMediaPlayer::Error"); qRegisterMetaType("QMediaPlayer::MediaStatus"); qRegisterMetaType("QMediaContent"); } void tst_QMediaPlayer::cleanupTestCase() { } void tst_QMediaPlayer::init() { mockService = new MockMediaPlayerService; mockProvider = new MockMediaServiceProvider(mockService); QMediaServiceProvider::setDefaultServiceProvider(mockProvider); player = new QMediaPlayer; } void tst_QMediaPlayer::cleanup() { delete player; delete mockProvider; delete mockService; } void tst_QMediaPlayer::testNullService() { mockProvider->service = 0; QMediaPlayer player; const QIODevice *nullDevice = 0; QCOMPARE(player.media(), QMediaContent()); QCOMPARE(player.mediaStream(), nullDevice); QCOMPARE(player.state(), QMediaPlayer::StoppedState); QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); QCOMPARE(player.duration(), qint64(-1)); QCOMPARE(player.position(), qint64(0)); QCOMPARE(player.volume(), 0); QCOMPARE(player.isMuted(), false); QCOMPARE(player.isVideoAvailable(), false); QCOMPARE(player.bufferStatus(), 0); QCOMPARE(player.isSeekable(), false); QCOMPARE(player.playbackRate(), qreal(0)); QCOMPARE(player.error(), QMediaPlayer::ServiceMissingError); QCOMPARE(player.isAvailable(), false); QCOMPARE(player.availability(), QMultimedia::ServiceMissing); { QFETCH_GLOBAL(QMediaContent, mediaContent); QSignalSpy spy(&player, SIGNAL(currentMediaChanged(QMediaContent))); QFile file; player.setMedia(mediaContent, &file); QCOMPARE(player.currentMedia(), QMediaContent()); QCOMPARE(player.media(), mediaContent); QCOMPARE(player.mediaStream(), nullDevice); QCOMPARE(spy.count(), 0); } { QSignalSpy stateSpy(&player, SIGNAL(stateChanged(QMediaPlayer::State))); QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); player.play(); QCOMPARE(player.state(), QMediaPlayer::StoppedState); QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); QCOMPARE(stateSpy.count(), 0); QCOMPARE(statusSpy.count(), 0); player.pause(); QCOMPARE(player.state(), QMediaPlayer::StoppedState); QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); QCOMPARE(stateSpy.count(), 0); QCOMPARE(statusSpy.count(), 0); player.stop(); QCOMPARE(player.state(), QMediaPlayer::StoppedState); QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); QCOMPARE(stateSpy.count(), 0); QCOMPARE(statusSpy.count(), 0); } { QFETCH_GLOBAL(int, volume); QFETCH_GLOBAL(bool, muted); QSignalSpy volumeSpy(&player, SIGNAL(volumeChanged(int))); QSignalSpy mutingSpy(&player, SIGNAL(mutedChanged(bool))); player.setVolume(volume); QCOMPARE(player.volume(), 0); QCOMPARE(volumeSpy.count(), 0); player.setMuted(muted); QCOMPARE(player.isMuted(), false); QCOMPARE(mutingSpy.count(), 0); } { QFETCH_GLOBAL(qint64, position); QSignalSpy spy(&player, SIGNAL(positionChanged(qint64))); player.setPosition(position); QCOMPARE(player.position(), qint64(0)); QCOMPARE(spy.count(), 0); } { QFETCH_GLOBAL(qreal, playbackRate); QSignalSpy spy(&player, SIGNAL(playbackRateChanged(qreal))); player.setPlaybackRate(playbackRate); QCOMPARE(player.playbackRate(), qreal(0)); QCOMPARE(spy.count(), 0); } { QMediaPlaylist playlist; player.setPlaylist(&playlist); QSignalSpy mediaSpy(&player, SIGNAL(mediaChanged(QMediaContent))); QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); playlist.addMedia(QUrl("http://example.com/stream")); playlist.addMedia(QUrl("file:///some.mp3")); playlist.setCurrentIndex(0); QCOMPARE(playlist.currentIndex(), 0); QCOMPARE(player.currentMedia(), QMediaContent()); QCOMPARE(player.media().playlist(), &playlist); QCOMPARE(mediaSpy.count(), 0); QCOMPARE(statusSpy.count(), 0); playlist.next(); QCOMPARE(playlist.currentIndex(), 1); QCOMPARE(player.currentMedia(), QMediaContent()); QCOMPARE(player.media().playlist(), &playlist); QCOMPARE(mediaSpy.count(), 0); QCOMPARE(statusSpy.count(), 0); } } void tst_QMediaPlayer::testValid() { /* QFETCH_GLOBAL(bool, valid); mockService->setIsValid(valid); QCOMPARE(player->isValid(), valid); */ } void tst_QMediaPlayer::testMedia() { QFETCH_GLOBAL(QMediaContent, mediaContent); mockService->setMedia(mediaContent); QCOMPARE(player->currentMedia(), mediaContent); QBuffer stream; player->setMedia(mediaContent, &stream); QCOMPARE(player->currentMedia(), mediaContent); QCOMPARE((QBuffer*)player->mediaStream(), &stream); } void tst_QMediaPlayer::testDuration() { QFETCH_GLOBAL(qint64, duration); mockService->setDuration(duration); QVERIFY(player->duration() == duration); } void tst_QMediaPlayer::testPosition() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(bool, seekable); QFETCH_GLOBAL(qint64, position); QFETCH_GLOBAL(qint64, duration); mockService->setIsValid(valid); mockService->setSeekable(seekable); mockService->setPosition(position); mockService->setDuration(duration); QVERIFY(player->isSeekable() == seekable); QVERIFY(player->position() == position); QVERIFY(player->duration() == duration); if (seekable) { { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); player->setPosition(position); QCOMPARE(player->position(), position); QCOMPARE(spy.count(), 0); } mockService->setPosition(position); { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); player->setPosition(0); QCOMPARE(player->position(), qint64(0)); QCOMPARE(spy.count(), position == 0 ? 0 : 1); } mockService->setPosition(position); { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); player->setPosition(duration); QCOMPARE(player->position(), duration); QCOMPARE(spy.count(), position == duration ? 0 : 1); } mockService->setPosition(position); { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); player->setPosition(-1); QCOMPARE(player->position(), qint64(0)); QCOMPARE(spy.count(), position == 0 ? 0 : 1); } } else { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); player->setPosition(position); QCOMPARE(player->position(), position); QCOMPARE(spy.count(), 0); } } void tst_QMediaPlayer::testVolume() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(int, volume); mockService->setVolume(volume); QVERIFY(player->volume() == volume); if (valid) { { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); player->setVolume(10); QCOMPARE(player->volume(), 10); QCOMPARE(spy.count(), 1); } { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); player->setVolume(-1000); QCOMPARE(player->volume(), 0); QCOMPARE(spy.count(), 1); } { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); player->setVolume(100); QCOMPARE(player->volume(), 100); QCOMPARE(spy.count(), 1); } { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); player->setVolume(1000); QCOMPARE(player->volume(), 100); QCOMPARE(spy.count(), 0); } } } void tst_QMediaPlayer::testMuted() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(bool, muted); QFETCH_GLOBAL(int, volume); if (valid) { mockService->setMuted(muted); mockService->setVolume(volume); QVERIFY(player->isMuted() == muted); QSignalSpy spy(player, SIGNAL(mutedChanged(bool))); player->setMuted(!muted); QCOMPARE(player->isMuted(), !muted); QCOMPARE(player->volume(), volume); QCOMPARE(spy.count(), 1); } } void tst_QMediaPlayer::testVideoAvailable() { QFETCH_GLOBAL(bool, videoAvailable); mockService->setVideoAvailable(videoAvailable); QVERIFY(player->isVideoAvailable() == videoAvailable); } void tst_QMediaPlayer::testBufferStatus() { QFETCH_GLOBAL(int, bufferStatus); mockService->setBufferStatus(bufferStatus); QVERIFY(player->bufferStatus() == bufferStatus); } void tst_QMediaPlayer::testSeekable() { QFETCH_GLOBAL(bool, seekable); mockService->setSeekable(seekable); QVERIFY(player->isSeekable() == seekable); } void tst_QMediaPlayer::testPlaybackRate() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(qreal, playbackRate); if (valid) { mockService->setPlaybackRate(playbackRate); QVERIFY(player->playbackRate() == playbackRate); QSignalSpy spy(player, SIGNAL(playbackRateChanged(qreal))); player->setPlaybackRate(playbackRate + 0.5f); QCOMPARE(player->playbackRate(), playbackRate + 0.5f); QCOMPARE(spy.count(), 1); } } void tst_QMediaPlayer::testError() { QFETCH_GLOBAL(QMediaPlayer::Error, error); mockService->setError(error); QVERIFY(player->error() == error); } void tst_QMediaPlayer::testErrorString() { QFETCH_GLOBAL(QString, errorString); mockService->setErrorString(errorString); QVERIFY(player->errorString() == errorString); } void tst_QMediaPlayer::testIsAvailable() { QCOMPARE(player->isAvailable(), true); QCOMPARE(player->availability(), QMultimedia::Available); } void tst_QMediaPlayer::testService() { /* QFETCH_GLOBAL(bool, valid); mockService->setIsValid(valid); if (valid) QVERIFY(player->service() != 0); else QVERIFY(player->service() == 0); */ } void tst_QMediaPlayer::testPlay() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(QMediaContent, mediaContent); QFETCH_GLOBAL(QMediaPlayer::State, state); mockService->setIsValid(valid); mockService->setState(state); mockService->setMedia(mediaContent); QVERIFY(player->state() == state); QVERIFY(player->currentMedia() == mediaContent); QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); player->play(); if (!valid || mediaContent.isNull()) { QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(spy.count(), 0); } else { QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(spy.count(), state == QMediaPlayer::PlayingState ? 0 : 1); } } void tst_QMediaPlayer::testPause() { QFETCH_GLOBAL(bool, valid); QFETCH_GLOBAL(QMediaContent, mediaContent); QFETCH_GLOBAL(QMediaPlayer::State, state); mockService->setIsValid(valid); mockService->setState(state); mockService->setMedia(mediaContent); QVERIFY(player->state() == state); QVERIFY(player->currentMedia() == mediaContent); QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); player->pause(); if (!valid || mediaContent.isNull()) { QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(spy.count(), 0); } else { QCOMPARE(player->state(), QMediaPlayer::PausedState); QCOMPARE(spy.count(), state == QMediaPlayer::PausedState ? 0 : 1); } } void tst_QMediaPlayer::testStop() { QFETCH_GLOBAL(QMediaContent, mediaContent); QFETCH_GLOBAL(QMediaPlayer::State, state); mockService->setState(state); mockService->setMedia(mediaContent); QVERIFY(player->state() == state); QVERIFY(player->currentMedia() == mediaContent); QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); player->stop(); if (mediaContent.isNull() || state == QMediaPlayer::StoppedState) { QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(spy.count(), 0); } else { QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(spy.count(), 1); } } void tst_QMediaPlayer::testMediaStatus() { QFETCH_GLOBAL(int, bufferStatus); int bufferSignals = 0; player->setNotifyInterval(10); mockService->setMediaStatus(QMediaPlayer::NoMedia); mockService->setBufferStatus(bufferStatus); AutoConnection connection( player, SIGNAL(bufferStatusChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy statusSpy(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); QSignalSpy bufferSpy(player, SIGNAL(bufferStatusChanged(int))); QCOMPARE(player->mediaStatus(), QMediaPlayer::NoMedia); mockService->setMediaStatus(QMediaPlayer::LoadingMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::LoadingMedia); QCOMPARE(statusSpy.count(), 1); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::LoadingMedia); mockService->setMediaStatus(QMediaPlayer::LoadedMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::LoadedMedia); QCOMPARE(statusSpy.count(), 2); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::LoadedMedia); // Verify the bufferStatusChanged() signal isn't being emitted. QTestEventLoop::instance().enterLoop(1); QCOMPARE(bufferSpy.count(), 0); mockService->setMediaStatus(QMediaPlayer::StalledMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::StalledMedia); QCOMPARE(statusSpy.count(), 3); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::StalledMedia); // Verify the bufferStatusChanged() signal is being emitted. QTestEventLoop::instance().enterLoop(1); QVERIFY(bufferSpy.count() > bufferSignals); QCOMPARE(bufferSpy.last().value(0).toInt(), bufferStatus); bufferSignals = bufferSpy.count(); mockService->setMediaStatus(QMediaPlayer::BufferingMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::BufferingMedia); QCOMPARE(statusSpy.count(), 4); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::BufferingMedia); // Verify the bufferStatusChanged() signal is being emitted. QTestEventLoop::instance().enterLoop(1); QVERIFY(bufferSpy.count() > bufferSignals); QCOMPARE(bufferSpy.last().value(0).toInt(), bufferStatus); bufferSignals = bufferSpy.count(); mockService->setMediaStatus(QMediaPlayer::BufferedMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::BufferedMedia); QCOMPARE(statusSpy.count(), 5); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::BufferedMedia); // Verify the bufferStatusChanged() signal isn't being emitted. QTestEventLoop::instance().enterLoop(1); QCOMPARE(bufferSpy.count(), bufferSignals); mockService->setMediaStatus(QMediaPlayer::EndOfMedia); QCOMPARE(player->mediaStatus(), QMediaPlayer::EndOfMedia); QCOMPARE(statusSpy.count(), 6); QCOMPARE(qvariant_cast(statusSpy.last().value(0)), QMediaPlayer::EndOfMedia); } void tst_QMediaPlayer::testPlaylist() { QMediaContent content0(QUrl(QLatin1String("test://audio/song1.mp3"))); QMediaContent content1(QUrl(QLatin1String("test://audio/song2.mp3"))); QMediaContent content2(QUrl(QLatin1String("test://video/movie1.mp4"))); QMediaContent content3(QUrl(QLatin1String("test://video/movie2.mp4"))); QMediaContent content4(QUrl(QLatin1String("test://image/photo.jpg"))); mockService->setIsValid(true); mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::NoMedia); QMediaPlaylist *playlist = new QMediaPlaylist; player->setPlaylist(playlist); QCOMPARE(player->media().playlist(), playlist); QSignalSpy stateSpy(player, SIGNAL(stateChanged(QMediaPlayer::State))); QSignalSpy mediaSpy(player, SIGNAL(currentMediaChanged(QMediaContent))); // Test the player does nothing with an empty playlist attached. player->play(); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(player->currentMedia(), QMediaContent()); QCOMPARE(stateSpy.count(), 0); QCOMPARE(mediaSpy.count(), 0); playlist->addMedia(content0); playlist->addMedia(content1); playlist->addMedia(content2); playlist->addMedia(content3); // Test changing the playlist position, changes the current media, but not the playing state. playlist->setCurrentIndex(1); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 0); QCOMPARE(mediaSpy.count(), 1); // Test playing starts with the current media. player->play(); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(mediaSpy.count(), 1); // Test pausing doesn't change the current media. player->pause(); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::PausedState); QCOMPARE(stateSpy.count(), 2); QCOMPARE(mediaSpy.count(), 1); // Test stopping doesn't change the current media. player->stop(); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 3); QCOMPARE(mediaSpy.count(), 1); // Test when the player service reaches the end of the current media, the player moves onto // the next item without stopping. player->play(); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 4); QCOMPARE(mediaSpy.count(), 1); mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); QCOMPARE(player->currentMedia(), content2); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 4); QCOMPARE(mediaSpy.count(), 2); // Test skipping the current media doesn't change the state. playlist->next(); QCOMPARE(player->currentMedia(), content3); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 4); QCOMPARE(mediaSpy.count(), 3); // Test changing the current media while paused doesn't change the state. player->pause(); mockService->setMediaStatus(QMediaPlayer::BufferedMedia); QCOMPARE(player->currentMedia(), content3); QCOMPARE(player->state(), QMediaPlayer::PausedState); QCOMPARE(stateSpy.count(), 5); QCOMPARE(mediaSpy.count(), 3); playlist->previous(); QCOMPARE(player->currentMedia(), content2); QCOMPARE(player->state(), QMediaPlayer::PausedState); QCOMPARE(stateSpy.count(), 5); QCOMPARE(mediaSpy.count(), 4); // Test changing the current media while stopped doesn't change the state. player->stop(); mockService->setMediaStatus(QMediaPlayer::LoadedMedia); QCOMPARE(player->currentMedia(), content2); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 6); QCOMPARE(mediaSpy.count(), 4); playlist->next(); QCOMPARE(player->currentMedia(), content3); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 6); QCOMPARE(mediaSpy.count(), 5); // Test the player is stopped and the current media cleared when it reaches the end of the last // item in the playlist. player->play(); QCOMPARE(player->currentMedia(), content3); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 7); QCOMPARE(mediaSpy.count(), 5); // Double up the signals to ensure some noise doesn't destabalize things. mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); QCOMPARE(player->currentMedia(), QMediaContent()); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 8); QCOMPARE(mediaSpy.count(), 6); // Test starts playing from the start of the playlist if there is no current media selected. player->play(); QCOMPARE(player->currentMedia(), content0); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 9); // one notification is for playlist and another is for the first media in the playlist QCOMPARE(mediaSpy.count(), 8); // Test deleting the playlist stops the player and clears the media it set. delete playlist; QCOMPARE(player->currentMedia(), QMediaContent()); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 10); QCOMPARE(mediaSpy.count(), 9); // Test the player works as normal with the playlist removed. player->play(); QCOMPARE(player->currentMedia(), QMediaContent()); QCOMPARE(player->state(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 10); QCOMPARE(mediaSpy.count(), 9); player->setMedia(content1); player->play(); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(stateSpy.count(), 11); QCOMPARE(mediaSpy.count(), 10); // Test the player can bind to playlist again playlist = new QMediaPlaylist; player->setPlaylist(playlist); QCOMPARE(player->currentMedia(), QMediaContent()); QCOMPARE(player->state(), QMediaPlayer::StoppedState); playlist->addMedia(content0); playlist->addMedia(content1); playlist->addMedia(content2); playlist->addMedia(content3); playlist->setCurrentIndex(1); QCOMPARE(player->currentMedia(), content1); QCOMPARE(player->state(), QMediaPlayer::StoppedState); // Test attaching the new playlist, // player should detach the current one QMediaPlaylist *playlist2 = new QMediaPlaylist; playlist2->addMedia(content1); playlist2->addMedia(content2); playlist2->addMedia(content3); playlist2->setCurrentIndex(2); player->play(); player->setPlaylist(playlist2); QCOMPARE(player->currentMedia(), playlist2->currentMedia()); QCOMPARE(player->state(), QMediaPlayer::StoppedState); playlist2->setCurrentIndex(1); QCOMPARE(player->currentMedia(), playlist2->currentMedia()); { QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); playlist.addMedia(content3); playlist.setCurrentIndex(1); // playlist resets to the first item player->setPlaylist(&playlist); QCOMPARE(player->playlist(), &playlist); QCOMPARE(player->currentMedia(), content1); } //playlist should be detached now QVERIFY(player->playlist() == 0); QCOMPARE(player->currentMedia(), QMediaContent()); // Test when the player service encounters an invalid media, the player moves onto // the next item without stopping { QSignalSpy ss(player, SIGNAL(stateChanged(QMediaPlayer::State))); QSignalSpy ms(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); // playlist index is set to 0 when it is loaded into media player player->setPlaylist(playlist); player->play(); QCOMPARE(ss.count(), 1); mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::InvalidMedia); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QCOMPARE(player->mediaStatus(), QMediaPlayer::InvalidMedia); QCOMPARE(ss.count(), 1); QCOMPARE(ms.count(), 1); // NOTE: status should begin transitioning through to BufferedMedia. QCOMPARE(player->currentMedia(), content1); } delete playlist; delete playlist2; } void tst_QMediaPlayer::testPlayerFlags() { MockMediaServiceProvider provider(0, true); QMediaPlayer::Flag flags = QMediaPlayer::LowLatency; QMediaServiceProviderHint::Feature feature; if (flags & QMediaPlayer::LowLatency) { /* if the flag is low latency set the low latency play back for the service provider */ feature = QMediaServiceProviderHint::LowLatencyPlayback; const QByteArray service(Q_MEDIASERVICE_MEDIAPLAYER); const QMediaServiceProviderHint providerHint(feature); /* request service for the service provider */ provider.requestService(service,providerHint); /* Constructs a SupportedFeatures media service provider hint. */ QMediaServiceProviderHint servicepro(feature); /* compare the flag value */ QVERIFY(servicepro.features() == QMediaServiceProviderHint::LowLatencyPlayback); } /* The player is expected to play QIODevice based streams. If passed to QMediaPlayer constructor, the service supporting streams playback will be chosen. */ flags = QMediaPlayer::StreamPlayback; /* Construct a QMediaPlayer that uses the playback service from provider, parented to parent and with flags.*/ if (flags & QMediaPlayer::StreamPlayback) { /* if the flag is stream play back set the stream play back for the service provider */ feature = QMediaServiceProviderHint::StreamPlayback; const QByteArray service(Q_MEDIASERVICE_MEDIAPLAYER); const QMediaServiceProviderHint providerHint(feature); /* request service for the service provider */ provider.requestService(service,providerHint); /* Constructs a SupportedFeatures media service provider hint. */ QMediaServiceProviderHint servicepro(feature); /* compare the flag value */ QVERIFY(servicepro.features() == QMediaServiceProviderHint::StreamPlayback); } } void tst_QMediaPlayer::testDestructor() { //don't use the same service as tst_QMediaPlayer::player mockProvider->service = new MockMediaPlayerService; mockProvider->deleteServiceOnRelease = true; /* create an object for player */ QMediaPlayer *victim = new QMediaPlayer; /* check whether the object is created */ QVERIFY(victim); /* delete the instance (a crash is a failure :) */ delete victim; //service is released QVERIFY(mockProvider->service == 0); mockProvider->deleteServiceOnRelease = false; } void tst_QMediaPlayer::testNetworkAccess() { QNetworkConfigurationManager manager; QList configs = manager.allConfigurations(); if (configs.count() >= 1) { QSignalSpy spy(player, SIGNAL(networkConfigurationChanged(QNetworkConfiguration))); int index = qFloor((configs.count())/2); player->setNetworkConfigurations(configs); mockService->selectCurrentConfiguration(configs.at(index)); QVERIFY(spy.count() == 1); QList args = spy.takeFirst(); QNetworkConfiguration config = args.at(0).value(); QCOMPARE(config.identifier() , configs.at(index).identifier()); QCOMPARE(player->currentNetworkConfiguration().identifier() , config.identifier()); } // invalidate current network configuration QSignalSpy spy(player, SIGNAL(networkConfigurationChanged(QNetworkConfiguration))); mockService->selectCurrentConfiguration(QNetworkConfiguration()); QVERIFY(spy.count() == 1); QList args = spy.takeFirst(); QNetworkConfiguration config = args.at(0).value(); QVERIFY(config.isValid() == false); QVERIFY(player->currentNetworkConfiguration().isValid() == false); } void tst_QMediaPlayer::testSetVideoOutput() { MockVideoSurface surface; player->setVideoOutput(reinterpret_cast(0)); player->setVideoOutput(reinterpret_cast(0)); QCOMPARE(mockService->rendererRef, 0); player->setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); QCOMPARE(mockService->rendererRef, 1); player->setVideoOutput(reinterpret_cast(0)); QVERIFY(mockService->rendererControl->surface() == 0); //rendererControl is released QCOMPARE(mockService->rendererRef, 0); player->setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); QCOMPARE(mockService->rendererRef, 1); player->setVideoOutput(reinterpret_cast(0)); QVERIFY(mockService->rendererControl->surface() == 0); //rendererControl is released QCOMPARE(mockService->rendererRef, 0); player->setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); QCOMPARE(mockService->rendererRef, 1); } void tst_QMediaPlayer::testSetVideoOutputNoService() { MockVideoSurface surface; MockMediaServiceProvider provider(0, true); QMediaServiceProvider::setDefaultServiceProvider(&provider); QMediaPlayer player; player.setVideoOutput(&surface); // Nothing we can verify here other than it doesn't assert. } void tst_QMediaPlayer::testSetVideoOutputNoControl() { MockVideoSurface surface; MockMediaPlayerService service; service.rendererRef = 1; MockMediaServiceProvider provider(&service); QMediaServiceProvider::setDefaultServiceProvider(&provider); QMediaPlayer player; player.setVideoOutput(&surface); QVERIFY(service.rendererControl->surface() == 0); } void tst_QMediaPlayer::testSetVideoOutputDestruction() { MockVideoSurface surface; { QMediaPlayer player; player.setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); QCOMPARE(mockService->rendererRef, 1); } QVERIFY(mockService->rendererControl->surface() == 0); QCOMPARE(mockService->rendererRef, 0); } void tst_QMediaPlayer::testPositionPropertyWatch() { QMediaContent content0(QUrl(QLatin1String("test://audio/song1.mp3"))); QMediaContent content1(QUrl(QLatin1String("test://audio/song2.mp3"))); mockService->setIsValid(true); mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::NoMedia); QMediaPlaylist *playlist = new QMediaPlaylist; playlist->addMedia(content0); playlist->addMedia(content1); player->setPlaylist(playlist); player->setNotifyInterval(5); player->play(); QSignalSpy positionSpy(player, SIGNAL(positionChanged(qint64))); playlist->next(); QCOMPARE(player->state(), QMediaPlayer::PlayingState); QTRY_VERIFY(positionSpy.count() > 0); playlist->next(); QCOMPARE(player->state(), QMediaPlayer::StoppedState); positionSpy.clear(); QTRY_COMPARE(positionSpy.count(), 0); delete playlist; } void tst_QMediaPlayer::debugEnums() { QTest::ignoreMessage(QtDebugMsg, "QMediaPlayer::PlayingState "); qDebug() << QMediaPlayer::PlayingState; QTest::ignoreMessage(QtDebugMsg, "QMediaPlayer::NoMedia "); qDebug() << QMediaPlayer::NoMedia; QTest::ignoreMessage(QtDebugMsg, "QMediaPlayer::NetworkError "); qDebug() << QMediaPlayer::NetworkError; } void tst_QMediaPlayer::testSupportedMimeTypes() { QStringList mimeList = QMediaPlayer::supportedMimeTypes(QMediaPlayer::LowLatency); // This is empty on some platforms, and not on others, so can't test something here at the moment. } QTEST_GUILESS_MAIN(tst_QMediaPlayer) #include "tst_qmediaplayer.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayerwidgets/000077500000000000000000000000001225012771600317345ustar00rootroot00000000000000qmediaplayerwidgets.pro000066400000000000000000000005071225012771600364450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayerwidgetsCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qmediaplayerwidgets QT += network multimedia-private multimediawidgets-private testlib widgets SOURCES += tst_qmediaplayerwidgets.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockplayer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaplayerwidgets.cpp000066400000000000000000000126401225012771600373220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplayerwidgets/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include "mockmediaserviceprovider.h" #include "mockmediaplayerservice.h" #include "mockvideosurface.h" QT_USE_NAMESPACE class tst_QMediaPlayerWidgets: public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void testSetVideoOutput(); void testSetVideoOutputNoService(); void testSetVideoOutputNoControl(); private: MockMediaServiceProvider *provider; MockMediaPlayerService *mockService; }; void tst_QMediaPlayerWidgets::initTestCase() { provider = new MockMediaServiceProvider; QMediaServiceProvider::setDefaultServiceProvider(provider); } void tst_QMediaPlayerWidgets::cleanupTestCase() { delete provider; } void tst_QMediaPlayerWidgets::init() { mockService = new MockMediaPlayerService; provider->service = mockService; } void tst_QMediaPlayerWidgets::cleanup() { } void tst_QMediaPlayerWidgets::testSetVideoOutput() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; QMediaPlayer player; player.setVideoOutput(&widget); QVERIFY(widget.mediaObject() == &player); player.setVideoOutput(&item); QVERIFY(widget.mediaObject() == 0); QVERIFY(item.mediaObject() == &player); player.setVideoOutput(reinterpret_cast(0)); QVERIFY(item.mediaObject() == 0); player.setVideoOutput(&widget); QVERIFY(widget.mediaObject() == &player); player.setVideoOutput(reinterpret_cast(0)); QVERIFY(widget.mediaObject() == 0); player.setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); player.setVideoOutput(reinterpret_cast(0)); QVERIFY(mockService->rendererControl->surface() == 0); player.setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); player.setVideoOutput(&widget); QVERIFY(mockService->rendererControl->surface() == 0); QVERIFY(widget.mediaObject() == &player); player.setVideoOutput(&surface); QVERIFY(mockService->rendererControl->surface() == &surface); QVERIFY(widget.mediaObject() == 0); } void tst_QMediaPlayerWidgets::testSetVideoOutputNoService() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; provider->service = 0; QMediaPlayer player; player.setVideoOutput(&widget); QVERIFY(widget.mediaObject() == 0); player.setVideoOutput(&item); QVERIFY(item.mediaObject() == 0); player.setVideoOutput(&surface); // Nothing we can verify here other than it doesn't assert. } void tst_QMediaPlayerWidgets::testSetVideoOutputNoControl() { QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; MockMediaPlayerService service; service.rendererRef = 1; service.windowRef = 1; provider->service = &service; QMediaPlayer player; player.setVideoOutput(&widget); QVERIFY(widget.mediaObject() == 0); player.setVideoOutput(&item); QVERIFY(item.mediaObject() == 0); player.setVideoOutput(&surface); QVERIFY(service.rendererControl->surface() == 0); } QTEST_MAIN(tst_QMediaPlayerWidgets) #include "tst_qmediaplayerwidgets.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/000077500000000000000000000000001225012771600307125ustar00rootroot00000000000000qmediaplaylist.pro000066400000000000000000000006101225012771600343740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylistCONFIG += testcase TARGET = tst_qmediaplaylist include (../qmultimedia_common/mockplaylist.pri) QT += multimedia-private testlib HEADERS += \ ../../../../src/plugins/m3u/qm3uhandler.h SOURCES += \ tst_qmediaplaylist.cpp \ ../../../../src/plugins/m3u/qm3uhandler.cpp INCLUDEPATH += ../../../../src/plugins/m3u TESTDATA += testdata/* DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/testdata/000077500000000000000000000000001225012771600325235ustar00rootroot00000000000000test.m3u000066400000000000000000000002201225012771600340430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/testdata#comment http://test.host/path http://test.host/path testfile testdir/testfile /testdir/testfile file://path/name#suffix testfile2#suffix testfile000066400000000000000000000000001225012771600341740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/testdatatestfile2#suffix000066400000000000000000000000001225012771600355460ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/testdatatst_qmediaplaylist.cpp000066400000000000000000000645131225012771600352640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylist/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qmediaservice.h" #include "qmediaplaylist.h" #include #include #include #include #include "qm3uhandler.h" //TESTED_COMPONENT=src/multimedia #include "mockplaylistservice.h" #include "mockmediaplaylistcontrol.h" #include "mockmediaplaylistsourcecontrol.h" #include "mockreadonlyplaylistprovider.h" QT_USE_NAMESPACE class MockReadOnlyPlaylistObject : public QMediaObject { Q_OBJECT public: MockReadOnlyPlaylistObject(QObject *parent = 0) :QMediaObject(parent, new MockPlaylistService) { } }; class tst_QMediaPlaylist : public QObject { Q_OBJECT public slots: void init(); void cleanup(); void initTestCase(); private slots: void construction(); void append(); void insert(); void clear(); void removeMedia(); void currentItem(); void saveAndLoad(); void loadM3uFile(); void playbackMode(); void playbackMode_data(); void shuffle(); void readOnlyPlaylist(); void setMediaObject(); void testCurrentIndexChanged_signal(); void testCurrentMediaChanged_signal(); void testLoaded_signal(); void testMediaChanged_signal(); void testPlaybackModeChanged_signal(); void testEnums(); void mediaPlayListProvider(); // TC for Abstract control classes void mediaPlayListControl(); void mediaPlayListSourceControl(); private: QMediaContent content1; QMediaContent content2; QMediaContent content3; }; void tst_QMediaPlaylist::init() { } void tst_QMediaPlaylist::initTestCase() { qRegisterMetaType(); content1 = QMediaContent(QUrl(QLatin1String("file:///1"))); content2 = QMediaContent(QUrl(QLatin1String("file:///2"))); content3 = QMediaContent(QUrl(QLatin1String("file:///3"))); } void tst_QMediaPlaylist::cleanup() { } void tst_QMediaPlaylist::construction() { QMediaPlaylist playlist; QCOMPARE(playlist.mediaCount(), 0); QVERIFY(playlist.isEmpty()); } void tst_QMediaPlaylist::append() { QMediaPlaylist playlist; QVERIFY(!playlist.isReadOnly()); playlist.addMedia(content1); QCOMPARE(playlist.mediaCount(), 1); QCOMPARE(playlist.media(0), content1); QSignalSpy aboutToBeInsertedSignalSpy(&playlist, SIGNAL(mediaAboutToBeInserted(int,int))); QSignalSpy insertedSignalSpy(&playlist, SIGNAL(mediaInserted(int,int))); playlist.addMedia(content2); QCOMPARE(playlist.mediaCount(), 2); QCOMPARE(playlist.media(1), content2); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); QCOMPARE(aboutToBeInsertedSignalSpy.first()[0].toInt(), 1); QCOMPARE(aboutToBeInsertedSignalSpy.first()[1].toInt(), 1); QCOMPARE(insertedSignalSpy.count(), 1); QCOMPARE(insertedSignalSpy.first()[0].toInt(), 1); QCOMPARE(insertedSignalSpy.first()[1].toInt(), 1); aboutToBeInsertedSignalSpy.clear(); insertedSignalSpy.clear(); QMediaContent content4(QUrl(QLatin1String("file:///4"))); QMediaContent content5(QUrl(QLatin1String("file:///5"))); playlist.addMedia(QList() << content3 << content4 << content5); QCOMPARE(playlist.mediaCount(), 5); QCOMPARE(playlist.media(2), content3); QCOMPARE(playlist.media(3), content4); QCOMPARE(playlist.media(4), content5); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); QCOMPARE(aboutToBeInsertedSignalSpy[0][0].toInt(), 2); QCOMPARE(aboutToBeInsertedSignalSpy[0][1].toInt(), 4); QCOMPARE(insertedSignalSpy.count(), 1); QCOMPARE(insertedSignalSpy[0][0].toInt(), 2); QCOMPARE(insertedSignalSpy[0][1].toInt(), 4); aboutToBeInsertedSignalSpy.clear(); insertedSignalSpy.clear(); playlist.addMedia(QList()); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 0); QCOMPARE(insertedSignalSpy.count(), 0); } void tst_QMediaPlaylist::insert() { QMediaPlaylist playlist; QVERIFY(!playlist.isReadOnly()); playlist.addMedia(content1); QCOMPARE(playlist.mediaCount(), 1); QCOMPARE(playlist.media(0), content1); playlist.addMedia(content2); QCOMPARE(playlist.mediaCount(), 2); QCOMPARE(playlist.media(1), content2); QSignalSpy aboutToBeInsertedSignalSpy(&playlist, SIGNAL(mediaAboutToBeInserted(int,int))); QSignalSpy insertedSignalSpy(&playlist, SIGNAL(mediaInserted(int,int))); playlist.insertMedia(1, content3); QCOMPARE(playlist.mediaCount(), 3); QCOMPARE(playlist.media(0), content1); QCOMPARE(playlist.media(1), content3); QCOMPARE(playlist.media(2), content2); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); QCOMPARE(aboutToBeInsertedSignalSpy.first()[0].toInt(), 1); QCOMPARE(aboutToBeInsertedSignalSpy.first()[1].toInt(), 1); QCOMPARE(insertedSignalSpy.count(), 1); QCOMPARE(insertedSignalSpy.first()[0].toInt(), 1); QCOMPARE(insertedSignalSpy.first()[1].toInt(), 1); aboutToBeInsertedSignalSpy.clear(); insertedSignalSpy.clear(); QMediaContent content4(QUrl(QLatin1String("file:///4"))); QMediaContent content5(QUrl(QLatin1String("file:///5"))); playlist.insertMedia(1, QList() << content4 << content5); QCOMPARE(playlist.media(0), content1); QCOMPARE(playlist.media(1), content4); QCOMPARE(playlist.media(2), content5); QCOMPARE(playlist.media(3), content3); QCOMPARE(playlist.media(4), content2); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); QCOMPARE(aboutToBeInsertedSignalSpy[0][0].toInt(), 1); QCOMPARE(aboutToBeInsertedSignalSpy[0][1].toInt(), 2); QCOMPARE(insertedSignalSpy.count(), 1); QCOMPARE(insertedSignalSpy[0][0].toInt(), 1); QCOMPARE(insertedSignalSpy[0][1].toInt(), 2); aboutToBeInsertedSignalSpy.clear(); insertedSignalSpy.clear(); playlist.insertMedia(1, QList()); QCOMPARE(aboutToBeInsertedSignalSpy.count(), 0); QCOMPARE(insertedSignalSpy.count(), 0); } void tst_QMediaPlaylist::currentItem() { QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); QCOMPARE(playlist.currentIndex(), -1); QCOMPARE(playlist.currentMedia(), QMediaContent()); QCOMPARE(playlist.nextIndex(), 0); QCOMPARE(playlist.nextIndex(2), 1); QCOMPARE(playlist.previousIndex(), 1); QCOMPARE(playlist.previousIndex(2), 0); playlist.setCurrentIndex(0); QCOMPARE(playlist.currentIndex(), 0); QCOMPARE(playlist.currentMedia(), content1); QCOMPARE(playlist.nextIndex(), 1); QCOMPARE(playlist.nextIndex(2), -1); QCOMPARE(playlist.previousIndex(), -1); QCOMPARE(playlist.previousIndex(2), -1); playlist.setCurrentIndex(1); QCOMPARE(playlist.currentIndex(), 1); QCOMPARE(playlist.currentMedia(), content2); QCOMPARE(playlist.nextIndex(), -1); QCOMPARE(playlist.nextIndex(2), -1); QCOMPARE(playlist.previousIndex(), 0); QCOMPARE(playlist.previousIndex(2), -1); QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); playlist.setCurrentIndex(2); QCOMPARE(playlist.currentIndex(), -1); QCOMPARE(playlist.currentMedia(), QMediaContent()); } void tst_QMediaPlaylist::clear() { QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); playlist.clear(); QVERIFY(playlist.isEmpty()); QCOMPARE(playlist.mediaCount(), 0); } void tst_QMediaPlaylist::removeMedia() { QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); playlist.addMedia(content3); QSignalSpy aboutToBeRemovedSignalSpy(&playlist, SIGNAL(mediaAboutToBeRemoved(int,int))); QSignalSpy removedSignalSpy(&playlist, SIGNAL(mediaRemoved(int,int))); playlist.removeMedia(1); QCOMPARE(playlist.mediaCount(), 2); QCOMPARE(playlist.media(1), content3); QCOMPARE(aboutToBeRemovedSignalSpy.count(), 1); QCOMPARE(aboutToBeRemovedSignalSpy.first()[0].toInt(), 1); QCOMPARE(aboutToBeRemovedSignalSpy.first()[1].toInt(), 1); QCOMPARE(removedSignalSpy.count(), 1); QCOMPARE(removedSignalSpy.first()[0].toInt(), 1); QCOMPARE(removedSignalSpy.first()[1].toInt(), 1); aboutToBeRemovedSignalSpy.clear(); removedSignalSpy.clear(); playlist.removeMedia(0,1); QVERIFY(playlist.isEmpty()); QCOMPARE(aboutToBeRemovedSignalSpy.count(), 1); QCOMPARE(aboutToBeRemovedSignalSpy.first()[0].toInt(), 0); QCOMPARE(aboutToBeRemovedSignalSpy.first()[1].toInt(), 1); QCOMPARE(removedSignalSpy.count(), 1); QCOMPARE(removedSignalSpy.first()[0].toInt(), 0); QCOMPARE(removedSignalSpy.first()[1].toInt(), 1); playlist.addMedia(content1); playlist.addMedia(content2); playlist.addMedia(content3); playlist.removeMedia(0,1); QCOMPARE(playlist.mediaCount(), 1); QCOMPARE(playlist.media(0), content3); } void tst_QMediaPlaylist::saveAndLoad() { QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); playlist.addMedia(content3); QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QVERIFY(playlist.errorString().isEmpty()); QBuffer buffer; buffer.open(QBuffer::ReadWrite); bool res = playlist.save(&buffer, "unsupported_format"); QVERIFY(!res); QVERIFY(playlist.error() == QMediaPlaylist::FormatNotSupportedError); QVERIFY(!playlist.errorString().isEmpty()); QSignalSpy errorSignal(&playlist, SIGNAL(loadFailed())); playlist.load(&buffer, "unsupported_format"); QCOMPARE(errorSignal.size(), 1); QVERIFY(playlist.error() != QMediaPlaylist::NoError); QVERIFY(!playlist.errorString().isEmpty()); res = playlist.save(QUrl::fromLocalFile(QLatin1String("tmp.unsupported_format")), "unsupported_format"); QVERIFY(!res); QVERIFY(playlist.error() != QMediaPlaylist::NoError); QVERIFY(!playlist.errorString().isEmpty()); errorSignal.clear(); playlist.load(QUrl::fromLocalFile(QLatin1String("tmp.unsupported_format")), "unsupported_format"); QCOMPARE(errorSignal.size(), 1); QVERIFY(playlist.error() == QMediaPlaylist::FormatNotSupportedError); QVERIFY(!playlist.errorString().isEmpty()); res = playlist.save(&buffer, "m3u"); QVERIFY(res); QVERIFY(buffer.pos() > 0); buffer.seek(0); QMediaPlaylist playlist2; playlist2.load(&buffer, "m3u"); QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), playlist2.mediaCount()); QCOMPARE(playlist.media(0), playlist2.media(0)); QCOMPARE(playlist.media(1), playlist2.media(1)); QCOMPARE(playlist.media(3), playlist2.media(3)); res = playlist.save(QUrl::fromLocalFile(QLatin1String("tmp.m3u")), "m3u"); QVERIFY(res); playlist2.clear(); QVERIFY(playlist2.isEmpty()); playlist2.load(QUrl::fromLocalFile(QLatin1String("tmp.m3u")), "m3u"); QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), playlist2.mediaCount()); QCOMPARE(playlist.media(0), playlist2.media(0)); QCOMPARE(playlist.media(1), playlist2.media(1)); QCOMPARE(playlist.media(3), playlist2.media(3)); } void tst_QMediaPlaylist::loadM3uFile() { QMediaPlaylist playlist; // Try to load playlist that does not exist in the testdata folder QString testFileName = QFINDTESTDATA("testdata"); playlist.load(QUrl::fromLocalFile(testFileName + "/missing_file.m3u")); QVERIFY(playlist.error() != QMediaPlaylist::NoError); testFileName = QFINDTESTDATA("testdata/test.m3u"); playlist.load(QUrl::fromLocalFile(testFileName)); QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), 7); QCOMPARE(playlist.media(0).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); QCOMPARE(playlist.media(1).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); testFileName = QFINDTESTDATA("testdata/testfile"); QCOMPARE(playlist.media(2).canonicalUrl(), QUrl::fromLocalFile(testFileName)); testFileName = QFINDTESTDATA("testdata"); QCOMPARE(playlist.media(3).canonicalUrl(), QUrl::fromLocalFile(testFileName + "/testdir/testfile")); QCOMPARE(playlist.media(4).canonicalUrl(), QUrl(QLatin1String("file:///testdir/testfile"))); QCOMPARE(playlist.media(5).canonicalUrl(), QUrl(QLatin1String("file://path/name#suffix"))); //ensure #2 suffix is not stripped from path testFileName = QFINDTESTDATA("testdata/testfile2#suffix"); QCOMPARE(playlist.media(6).canonicalUrl(), QUrl::fromLocalFile(testFileName)); // check ability to load from QNetworkRequest QSignalSpy loadSpy(&playlist, SIGNAL(loaded())); QSignalSpy loadFailedSpy(&playlist, SIGNAL(loadFailed())); playlist.load(QNetworkRequest(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.m3u")))); QTRY_VERIFY(!loadSpy.isEmpty()); QVERIFY(loadFailedSpy.isEmpty()); } void tst_QMediaPlaylist::playbackMode_data() { QTest::addColumn("playbackMode"); QTest::addColumn("expectedPrevious"); QTest::addColumn("pos"); QTest::addColumn("expectedNext"); QTest::newRow("Sequential, 0") << QMediaPlaylist::Sequential << -1 << 0 << 1; QTest::newRow("Sequential, 1") << QMediaPlaylist::Sequential << 0 << 1 << 2; QTest::newRow("Sequential, 2") << QMediaPlaylist::Sequential << 1 << 2 << -1; QTest::newRow("Loop, 0") << QMediaPlaylist::Loop << 2 << 0 << 1; QTest::newRow("Loop, 1") << QMediaPlaylist::Loop << 0 << 1 << 2; QTest::newRow("Lopp, 2") << QMediaPlaylist::Loop << 1 << 2 << 0; QTest::newRow("ItemOnce, 1") << QMediaPlaylist::CurrentItemOnce << -1 << 1 << -1; QTest::newRow("ItemInLoop, 1") << QMediaPlaylist::CurrentItemInLoop << 1 << 1 << 1; // Bit difficult to test random this way } void tst_QMediaPlaylist::playbackMode() { QFETCH(QMediaPlaylist::PlaybackMode, playbackMode); QFETCH(int, expectedPrevious); QFETCH(int, pos); QFETCH(int, expectedNext); QMediaPlaylist playlist; playlist.addMedia(content1); playlist.addMedia(content2); playlist.addMedia(content3); QCOMPARE(playlist.playbackMode(), QMediaPlaylist::Sequential); QCOMPARE(playlist.currentIndex(), -1); playlist.setPlaybackMode(playbackMode); QCOMPARE(playlist.playbackMode(), playbackMode); playlist.setCurrentIndex(pos); QCOMPARE(playlist.currentIndex(), pos); QCOMPARE(playlist.nextIndex(), expectedNext); QCOMPARE(playlist.previousIndex(), expectedPrevious); playlist.next(); QCOMPARE(playlist.currentIndex(), expectedNext); playlist.setCurrentIndex(pos); playlist.previous(); QCOMPARE(playlist.currentIndex(), expectedPrevious); } void tst_QMediaPlaylist::shuffle() { QMediaPlaylist playlist; QList contentList; for (int i=0; i<100; i++) { QMediaContent content(QUrl::fromLocalFile(QString::number(i))); contentList.append(content); playlist.addMedia(content); } playlist.shuffle(); QList shuffledContentList; for (int i=0; i() << content1 << content2)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(!playlist.insertMedia(1, content1)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(!playlist.insertMedia(1, QList() << content1 << content2)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(!playlist.removeMedia(1)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(!playlist.removeMedia(0,2)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(!playlist.clear()); QCOMPARE(playlist.mediaCount(), 3); //but it is still allowed to append/insert an empty list QVERIFY(playlist.addMedia(QList())); QVERIFY(playlist.insertMedia(1, QList())); playlist.shuffle(); //it's still the same QCOMPARE(playlist.media(0), content1); QCOMPARE(playlist.media(1), content2); QCOMPARE(playlist.media(2), content3); QCOMPARE(playlist.media(3), QMediaContent()); //load to read only playlist should fail, //unless underlaying provider supports it QBuffer buffer; buffer.open(QBuffer::ReadWrite); buffer.write(QByteArray("file:///1\nfile:///2")); buffer.seek(0); QSignalSpy errorSignal(&playlist, SIGNAL(loadFailed())); playlist.load(&buffer, "m3u"); QCOMPARE(errorSignal.size(), 1); QCOMPARE(playlist.error(), QMediaPlaylist::AccessDeniedError); QVERIFY(!playlist.errorString().isEmpty()); QCOMPARE(playlist.mediaCount(), 3); errorSignal.clear(); playlist.load(QUrl::fromLocalFile(QLatin1String("tmp.m3u")), "m3u"); QCOMPARE(errorSignal.size(), 1); QCOMPARE(playlist.error(), QMediaPlaylist::AccessDeniedError); QVERIFY(!playlist.errorString().isEmpty()); QCOMPARE(playlist.mediaCount(), 3); } void tst_QMediaPlaylist::setMediaObject() { MockReadOnlyPlaylistObject mediaObject; QMediaPlaylist playlist; QVERIFY(playlist.mediaObject() == 0); QVERIFY(!playlist.isReadOnly()); mediaObject.bind(&playlist); QCOMPARE(playlist.mediaObject(), qobject_cast(&mediaObject)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(playlist.isReadOnly()); mediaObject.unbind(&playlist); QVERIFY(playlist.mediaObject() == 0); QCOMPARE(playlist.mediaCount(), 0); QVERIFY(!playlist.isReadOnly()); mediaObject.bind(&playlist); QCOMPARE(playlist.mediaObject(), qobject_cast(&mediaObject)); QCOMPARE(playlist.mediaCount(), 3); QVERIFY(playlist.isReadOnly()); } void tst_QMediaPlaylist::testCurrentIndexChanged_signal() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist QSignalSpy spy(&playlist, SIGNAL(currentIndexChanged(int))); QVERIFY(spy.size()== 0); QCOMPARE(playlist.currentIndex(), -1); //set the current index for playlist. playlist.setCurrentIndex(0); QVERIFY(spy.size()== 1); //verify the signal emission. QCOMPARE(playlist.currentIndex(), 0); //verify the current index of playlist //set the current index for playlist. playlist.setCurrentIndex(1); QVERIFY(spy.size()== 2); //verify the signal emission. QCOMPARE(playlist.currentIndex(), 1); //verify the current index of playlist } void tst_QMediaPlaylist::testCurrentMediaChanged_signal() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist QSignalSpy spy(&playlist, SIGNAL(currentMediaChanged(QMediaContent))); QVERIFY(spy.size()== 0); QCOMPARE(playlist.currentIndex(), -1); QCOMPARE(playlist.currentMedia(), QMediaContent()); //set the current index for playlist. playlist.setCurrentIndex(0); QVERIFY(spy.size()== 1); //verify the signal emission. QCOMPARE(playlist.currentIndex(), 0); //verify the current index of playlist QCOMPARE(playlist.currentMedia(), content1); //verify the current media of playlist //set the current index for playlist. playlist.setCurrentIndex(1); QVERIFY(spy.size()== 2); //verify the signal emission. QCOMPARE(playlist.currentIndex(), 1); //verify the current index of playlist QCOMPARE(playlist.currentMedia(), content2); //verify the current media of playlist } void tst_QMediaPlaylist::testLoaded_signal() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist playlist.addMedia(content3); //set the media to playlist QSignalSpy spy(&playlist, SIGNAL(loaded())); QVERIFY(spy.size()== 0); QBuffer buffer; buffer.open(QBuffer::ReadWrite); //load the playlist playlist.load(&buffer,"m3u"); QVERIFY(spy.size()== 1); //verify the signal emission. } void tst_QMediaPlaylist::testMediaChanged_signal() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; QSignalSpy spy(&playlist, SIGNAL(mediaChanged(int,int))); // Add media to playlist playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist playlist.addMedia(content3); //set the media to playlist // Adds/inserts do not cause change signals QVERIFY(spy.size() == 0); // Now change the list playlist.shuffle(); QVERIFY(spy.size() == 1); spy.clear(); //create media. QMediaContent content4(QUrl(QLatin1String("file:///4"))); QMediaContent content5(QUrl(QLatin1String("file:///5"))); //insert media to playlist playlist.insertMedia(1, content4); playlist.insertMedia(2, content5); // Adds/inserts do not cause change signals QVERIFY(spy.size() == 0); // And again playlist.shuffle(); QVERIFY(spy.size() == 1); } void tst_QMediaPlaylist::testPlaybackModeChanged_signal() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist playlist.addMedia(content3); //set the media to playlist QSignalSpy spy(&playlist, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode))); QVERIFY(playlist.playbackMode()== QMediaPlaylist::Sequential); QVERIFY(spy.size() == 0); // Set playback mode to the playlist playlist.setPlaybackMode(QMediaPlaylist::CurrentItemOnce); QVERIFY(playlist.playbackMode()== QMediaPlaylist::CurrentItemOnce); QVERIFY(spy.size() == 1); // Set playback mode to the playlist playlist.setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); QVERIFY(playlist.playbackMode()== QMediaPlaylist::CurrentItemInLoop); QVERIFY(spy.size() == 2); // Set playback mode to the playlist playlist.setPlaybackMode(QMediaPlaylist::Sequential); QVERIFY(playlist.playbackMode()== QMediaPlaylist::Sequential); QVERIFY(spy.size() == 3); // Set playback mode to the playlist playlist.setPlaybackMode(QMediaPlaylist::Loop); QVERIFY(playlist.playbackMode()== QMediaPlaylist::Loop); QVERIFY(spy.size() == 4); // Set playback mode to the playlist playlist.setPlaybackMode(QMediaPlaylist::Random); QVERIFY(playlist.playbackMode()== QMediaPlaylist::Random); QVERIFY(spy.size() == 5); } void tst_QMediaPlaylist::testEnums() { //create an instance of QMediaPlaylist class. QMediaPlaylist playlist; playlist.addMedia(content1); //set the media to playlist playlist.addMedia(content2); //set the media to playlist playlist.addMedia(content3); //set the media to playlist QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QBuffer buffer; buffer.open(QBuffer::ReadWrite); // checking for QMediaPlaylist::FormatNotSupportedError enum QVERIFY(!playlist.save(&buffer, "unsupported_format")); QVERIFY(playlist.error() == QMediaPlaylist::FormatNotSupportedError); playlist.load(&buffer,"unsupported_format"); QVERIFY(playlist.error() == QMediaPlaylist::FormatNotSupportedError); } // MaemoAPI-1849:test QMediaPlayListControl constructor void tst_QMediaPlaylist::mediaPlayListControl() { // To check changes in abstract classe's pure virtual functions QObject parent; MockMediaPlaylistControl plylistctrl(&parent); } // MaemoAPI-1850:test QMediaPlayListSourceControl constructor void tst_QMediaPlaylist::mediaPlayListSourceControl() { // To check changes in abstract classe's pure virtual functions QObject parent; MockPlaylistSourceControl plylistsrcctrl(&parent); } // MaemoAPI-1852:test constructor void tst_QMediaPlaylist::mediaPlayListProvider() { // srcs of QMediaPlaylistProvider is incomplete QObject parent; MockReadOnlyPlaylistProvider provider(&parent); } QTEST_MAIN(tst_QMediaPlaylist) #include "tst_qmediaplaylist.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylistnavigator/000077500000000000000000000000001225012771600326255ustar00rootroot00000000000000qmediaplaylistnavigator.pro000066400000000000000000000002611225012771600402240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylistnavigatorCONFIG += testcase TARGET = tst_qmediaplaylistnavigator QT += multimedia-private testlib SOURCES += tst_qmediaplaylistnavigator.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaplaylistnavigator.cpp000066400000000000000000000437221225012771600411110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaplaylistnavigator/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include QT_USE_NAMESPACE class tst_QMediaPlaylistNavigator : public QObject { Q_OBJECT public slots: void init(); void cleanup(); private slots: void construction(); void setPlaylist(); void linearPlayback(); void loopPlayback(); void currentItemOnce(); void currentItemInLoop(); void randomPlayback(); void testItemAt(); void testNextIndex(); void testPreviousIndex(); void testCurrentIndexChangedSignal(); void testPlaybackModeChangedSignal(); void testSurroundingItemsChangedSignal(); void testActivatedSignal(); }; void tst_QMediaPlaylistNavigator::init() { qRegisterMetaType("QMediaPlaylist::PlaybackMode"); qRegisterMetaType("QMediaContent"); } void tst_QMediaPlaylistNavigator::cleanup() { } void tst_QMediaPlaylistNavigator::construction() { QMediaNetworkPlaylistProvider playlist; QCOMPARE(playlist.mediaCount(), 0); QMediaPlaylistNavigator navigator(&playlist); QVERIFY(navigator.currentItem().isNull()); QCOMPARE(navigator.currentIndex(), -1); } void tst_QMediaPlaylistNavigator::setPlaylist() { QMediaPlaylistNavigator navigator(0); QVERIFY(navigator.playlist() != 0); QCOMPARE(navigator.playlist()->mediaCount(), 0); QCOMPARE(navigator.playlist()->media(0), QMediaContent()); QVERIFY(navigator.playlist()->isReadOnly() ); QMediaNetworkPlaylistProvider playlist; QCOMPARE(playlist.mediaCount(), 0); navigator.setPlaylist(&playlist); QCOMPARE(navigator.playlist(), (QMediaPlaylistProvider*)&playlist); QCOMPARE(navigator.playlist()->mediaCount(), 0); QVERIFY(!navigator.playlist()->isReadOnly() ); } void tst_QMediaPlaylistNavigator::linearPlayback() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Sequential); QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); navigator.jump(0);//it's ok to have warning here QVERIFY(navigator.currentItem().isNull()); QCOMPARE(navigator.currentIndex(), -1); QMediaContent content1(QUrl(QLatin1String("file:///1"))); playlist.addMedia(content1); navigator.jump(0); QVERIFY(!navigator.currentItem().isNull()); QCOMPARE(navigator.currentIndex(), 0); QCOMPARE(navigator.currentItem(), content1); QCOMPARE(navigator.nextItem(), QMediaContent()); QCOMPARE(navigator.nextItem(2), QMediaContent()); QCOMPARE(navigator.previousItem(), QMediaContent()); QCOMPARE(navigator.previousItem(2), QMediaContent()); QMediaContent content2(QUrl(QLatin1String("file:///2"))); playlist.addMedia(content2); QCOMPARE(navigator.currentIndex(), 0); QCOMPARE(navigator.currentItem(), content1); QCOMPARE(navigator.nextItem(), content2); QCOMPARE(navigator.nextItem(2), QMediaContent()); QCOMPARE(navigator.previousItem(), QMediaContent()); QCOMPARE(navigator.previousItem(2), QMediaContent()); navigator.jump(1); QCOMPARE(navigator.currentIndex(), 1); QCOMPARE(navigator.currentItem(), content2); QCOMPARE(navigator.nextItem(), QMediaContent()); QCOMPARE(navigator.nextItem(2), QMediaContent()); QCOMPARE(navigator.previousItem(), content1); QCOMPARE(navigator.previousItem(2), QMediaContent()); navigator.jump(0); navigator.next(); QCOMPARE(navigator.currentIndex(), 1); navigator.next(); QCOMPARE(navigator.currentIndex(), -1); navigator.next();//jump to the first item QCOMPARE(navigator.currentIndex(), 0); navigator.previous(); QCOMPARE(navigator.currentIndex(), -1); navigator.previous();//jump to the last item QCOMPARE(navigator.currentIndex(), 1); } void tst_QMediaPlaylistNavigator::loopPlayback() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Loop); QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); navigator.jump(0); QVERIFY(navigator.currentItem().isNull()); QCOMPARE(navigator.currentIndex(), -1); QMediaContent content1(QUrl(QLatin1String("file:///1"))); playlist.addMedia(content1); navigator.jump(0); QVERIFY(!navigator.currentItem().isNull()); QCOMPARE(navigator.currentIndex(), 0); QCOMPARE(navigator.currentItem(), content1); QCOMPARE(navigator.nextItem(), content1); QCOMPARE(navigator.nextItem(2), content1); QCOMPARE(navigator.previousItem(), content1); QCOMPARE(navigator.previousItem(2), content1); QMediaContent content2(QUrl(QLatin1String("file:///2"))); playlist.addMedia(content2); QCOMPARE(navigator.currentIndex(), 0); QCOMPARE(navigator.currentItem(), content1); QCOMPARE(navigator.nextItem(), content2); QCOMPARE(navigator.nextItem(2), content1); //loop over end of the list QCOMPARE(navigator.previousItem(), content2); QCOMPARE(navigator.previousItem(2), content1); navigator.jump(1); QCOMPARE(navigator.currentIndex(), 1); QCOMPARE(navigator.currentItem(), content2); QCOMPARE(navigator.nextItem(), content1); QCOMPARE(navigator.nextItem(2), content2); QCOMPARE(navigator.previousItem(), content1); QCOMPARE(navigator.previousItem(2), content2); navigator.jump(0); navigator.next(); QCOMPARE(navigator.currentIndex(), 1); navigator.next(); QCOMPARE(navigator.currentIndex(), 0); navigator.previous(); QCOMPARE(navigator.currentIndex(), 1); navigator.previous(); QCOMPARE(navigator.currentIndex(), 0); } void tst_QMediaPlaylistNavigator::currentItemOnce() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::CurrentItemOnce); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::CurrentItemOnce); QCOMPARE(navigator.currentIndex(), -1); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); QCOMPARE(navigator.currentIndex(), -1); navigator.next(); QCOMPARE(navigator.currentIndex(), -1); navigator.jump(1); QCOMPARE(navigator.currentIndex(), 1); navigator.next(); QCOMPARE(navigator.currentIndex(), -1); navigator.next(); QCOMPARE(navigator.currentIndex(), -1); navigator.previous(); QCOMPARE(navigator.currentIndex(), -1); navigator.jump(1); navigator.previous(); QCOMPARE(navigator.currentIndex(), -1); } void tst_QMediaPlaylistNavigator::currentItemInLoop() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::CurrentItemInLoop); QCOMPARE(navigator.currentIndex(), -1); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); QCOMPARE(navigator.currentIndex(), -1); navigator.next(); QCOMPARE(navigator.currentIndex(), -1); navigator.jump(1); navigator.next(); QCOMPARE(navigator.currentIndex(), 1); navigator.next(); QCOMPARE(navigator.currentIndex(), 1); navigator.previous(); QCOMPARE(navigator.currentIndex(), 1); navigator.previous(); QCOMPARE(navigator.currentIndex(), 1); } void tst_QMediaPlaylistNavigator::randomPlayback() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); playlist.shuffle(); QCOMPARE(navigator.currentIndex(), -1); navigator.next(); int pos1 = navigator.currentIndex(); navigator.next(); int pos2 = navigator.currentIndex(); navigator.next(); int pos3 = navigator.currentIndex(); QVERIFY(pos1 != -1); QVERIFY(pos2 != -1); QVERIFY(pos3 != -1); navigator.previous(); QCOMPARE(navigator.currentIndex(), pos2); navigator.next(); QCOMPARE(navigator.currentIndex(), pos3); navigator.next(); int pos4 = navigator.currentIndex(); navigator.previous(); QCOMPARE(navigator.currentIndex(), pos3); navigator.previous(); QCOMPARE(navigator.currentIndex(), pos2); navigator.previous(); QCOMPARE(navigator.currentIndex(), pos1); navigator.previous(); int pos0 = navigator.currentIndex(); QVERIFY(pos0 != -1); navigator.next(); navigator.next(); navigator.next(); navigator.next(); QCOMPARE(navigator.currentIndex(), pos4); } void tst_QMediaPlaylistNavigator::testItemAt() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Adding the media to the playlist QMediaContent content = QMediaContent(QUrl(QLatin1String("file:///1"))); playlist.addMedia(content); //Currently it is not pointing to any index , Returns Null mediacontent QCOMPARE(navigator.currentIndex(), -1); QCOMPARE(navigator.itemAt(navigator.currentIndex()),QMediaContent()); navigator.next(); //Points to the added media int pos1 = navigator.currentIndex(); QCOMPARE(content,navigator.itemAt(pos1)); } void tst_QMediaPlaylistNavigator::testNextIndex() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); playlist.shuffle(); //Currently it is not pointing to any index QCOMPARE(navigator.currentIndex(), -1); navigator.next(); int pos1 = navigator.currentIndex(); //Pointing to the next index navigator.next(); int pos2 = navigator.currentIndex(); navigator.next(); int pos3 = navigator.currentIndex(); //Pointing to the previous index navigator.previous(); QCOMPARE(navigator.nextIndex(1), pos3); navigator.previous(); QCOMPARE(navigator.nextIndex(1), pos2); QCOMPARE(navigator.nextIndex(2), pos3); navigator.previous(); QCOMPARE(navigator.nextIndex(1), pos1); } void tst_QMediaPlaylistNavigator::testPreviousIndex() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); playlist.shuffle(); //Currently it is not pointing to any index QCOMPARE(navigator.currentIndex(), -1); //pointing to next index navigator.next(); int pos1 = navigator.currentIndex(); navigator.next(); int pos2 = navigator.currentIndex(); navigator.next(); int pos3 = navigator.currentIndex(); QCOMPARE(navigator.previousIndex(1), pos2); QCOMPARE(navigator.previousIndex(2), pos1); navigator.next(); QCOMPARE(navigator.previousIndex(1), pos3); } void tst_QMediaPlaylistNavigator::testCurrentIndexChangedSignal() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Creating a QSignalSpy object for currentIndexChanged() signal QSignalSpy spy(&navigator,SIGNAL(currentIndexChanged(int))); QVERIFY(spy.count() == 0); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); //Currently it is not pointing to any index QCOMPARE(navigator.currentIndex(), -1); navigator.next(); QVERIFY(spy.count() == 1); int pos1 = navigator.currentIndex(); //Pointing to the next index navigator.next(); QVERIFY(navigator.previousIndex(1) == pos1); QVERIFY(spy.count() == 2); } void tst_QMediaPlaylistNavigator::testPlaybackModeChangedSignal() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Creating a QSignalSpy object for currentIndexChanged() signal QSignalSpy spy(&navigator,SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode))); QVERIFY(spy.count() == 0); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); //set the play back mode to sequential navigator.setPlaybackMode(QMediaPlaylist::Sequential); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Sequential); QVERIFY(spy.count() == 1); //set the play back mode to loop navigator.setPlaybackMode(QMediaPlaylist::Loop); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Loop); QVERIFY(spy.count() == 2); } void tst_QMediaPlaylistNavigator::testSurroundingItemsChangedSignal() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Creating a QSignalSpy object for surroundingItemsChanged()signal QSignalSpy spy(&navigator,SIGNAL(surroundingItemsChanged())); QVERIFY(spy.count() == 0); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); QVERIFY(spy.count() == 1); //set the play back mode to sequential navigator.setPlaybackMode(QMediaPlaylist::Sequential); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Sequential); QVERIFY(spy.count() == 2); //Point to the next index navigator.next(); QVERIFY(spy.count() == 3); } void tst_QMediaPlaylistNavigator::testActivatedSignal() { QMediaNetworkPlaylistProvider playlist; QMediaPlaylistNavigator navigator(&playlist); navigator.setPlaybackMode(QMediaPlaylist::Random); QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); QCOMPARE(navigator.currentIndex(), -1); //Creating a QSignalSpy object for surroundingItemsChanged()signal QSignalSpy spy(&navigator,SIGNAL(activated(QMediaContent))); QVERIFY(spy.count() == 0); //Adding the media to the playlist playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); playlist.shuffle(); //Point to the next index navigator.next(); QVERIFY(spy.count() == 1); //Jump to 0th item navigator.jump(0); QVERIFY(spy.count() == 2); //move to previous item navigator.previous(); QVERIFY(spy.count() == 3); } QTEST_MAIN(tst_QMediaPlaylistNavigator) #include "tst_qmediaplaylistnavigator.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediapluginloader/000077500000000000000000000000001225012771600315365ustar00rootroot00000000000000qmediapluginloader.pro000066400000000000000000000004751225012771600360550ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediapluginloaderCONFIG += testcase TARGET = tst_qmediapluginloader QT += multimedia-private testlib SOURCES += tst_qmediapluginloader.cpp wince* { PLUGIN_DEPLOY.sources = $$OUTPUT_DIR/plugins/mediaservice/*.dll PLUGIN_DEPLOY.path = mediaservice DEPLOYMENT += PLUGIN_DEPLOY } DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediapluginloader.cpp000066400000000000000000000075721225012771600367360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediapluginloader/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include QT_USE_NAMESPACE class tst_QMediaPluginLoader : public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); private slots: void testInstance(); void testInstances(); void testInvalidKey(); private: QMediaPluginLoader *loader; }; void tst_QMediaPluginLoader::initTestCase() { loader = new QMediaPluginLoader(QMediaServiceProviderFactoryInterface_iid, QLatin1String("mediaservice"), Qt::CaseInsensitive); } void tst_QMediaPluginLoader::cleanupTestCase() { delete loader; } void tst_QMediaPluginLoader::testInstance() { const QStringList keys = loader->keys(); if (keys.isEmpty()) // Test is invalidated, skip. QSKIP("No plug-ins available"); foreach (const QString &key, keys) QVERIFY(loader->instance(key) != 0); } void tst_QMediaPluginLoader::testInstances() { const QStringList keys = loader->keys(); if (keys.isEmpty()) // Test is invalidated, skip. QSKIP("No plug-ins available"); foreach (const QString &key, keys) QVERIFY(loader->instances(key).size() > 0); } // Last so as to not interfere with the other tests if there is a failure. void tst_QMediaPluginLoader::testInvalidKey() { const QString key(QLatin1String("invalid-key")); // This test assumes there is no 'invalid-key' in the key list, verify that. if (loader->keys().contains(key)) QSKIP("a plug-in includes the invalid key"); QVERIFY(loader->instance(key) == 0); // Test looking up the key hasn't inserted it into the list. See QMap::operator[]. QVERIFY(!loader->keys().contains(key)); QVERIFY(loader->instances(key).isEmpty()); QVERIFY(!loader->keys().contains(key)); } QTEST_MAIN(tst_QMediaPluginLoader) #include "tst_qmediapluginloader.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediarecorder/000077500000000000000000000000001225012771600306565ustar00rootroot00000000000000qmediarecorder.pro000066400000000000000000000004251225012771600343100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediarecorderCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qmediarecorder QT += multimedia-private testlib SOURCES += tst_qmediarecorder.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockrecorder.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediarecorder.cpp000066400000000000000000001547101225012771600351730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediarecorder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mockmediarecorderservice.h" #include "mockmediaobject.h" QT_USE_NAMESPACE class tst_QMediaRecorder: public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); private slots: void testNullService(); void testNullControls(); void testDeleteMediaObject(); void testError(); void testSink(); void testRecord(); void testMute(); void testVolume(); void testAudioDeviceControl(); void testAudioEncodeControl(); void testMediaFormatsControl(); void testVideoEncodeControl(); void testEncodingSettings(); void testAudioSettings(); void testVideoSettings(); void testSettingsApplied(); void nullMetaDataControl(); void isMetaDataAvailable(); void isWritable(); void metaDataChanged(); void metaData_data(); void metaData(); void setMetaData_data(); void setMetaData(); void testAudioSettingsCopyConstructor(); void testAudioSettingsOperatorNotEqual(); void testAudioSettingsOperatorEqual(); void testAudioSettingsOperatorAssign(); void testAudioSettingsDestructor(); void testAvailabilityStatus(); void testIsAvailable(); void testMediaObject(); void testEnum(); void testVideoSettingsQuality(); void testVideoSettingsEncodingMode(); void testVideoSettingsCopyConstructor(); void testVideoSettingsOperatorAssignment(); void testVideoSettingsOperatorNotEqual(); void testVideoSettingsOperatorComparison(); void testVideoSettingsDestructor(); private: QAudioEncoderSettingsControl* encode; QAudioInputSelectorControl* audio; MockMediaObject *object; MockMediaRecorderService*service; MockMediaRecorderControl *mock; QMediaRecorder *capture; QVideoEncoderSettingsControl* videoEncode; }; void tst_QMediaRecorder::initTestCase() { qRegisterMetaType("QMediaRecorder::State"); qRegisterMetaType("QMediaRecorder::Error"); mock = new MockMediaRecorderControl(this); service = new MockMediaRecorderService(this, mock); object = new MockMediaObject(this, service); capture = new QMediaRecorder(object); audio = qobject_cast(service->requestControl(QAudioInputSelectorControl_iid)); encode = qobject_cast(service->requestControl(QAudioEncoderSettingsControl_iid)); videoEncode = qobject_cast(service->requestControl(QVideoEncoderSettingsControl_iid)); } void tst_QMediaRecorder::cleanupTestCase() { delete capture; delete object; delete service; delete mock; } void tst_QMediaRecorder::testNullService() { const QString id(QLatin1String("application/x-format")); MockMediaObject object(0, 0); QMediaRecorder recorder(&object); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(recorder.duration(), qint64(0)); QCOMPARE(recorder.supportedContainers(), QStringList()); QCOMPARE(recorder.containerDescription(id), QString()); QCOMPARE(recorder.supportedAudioCodecs(), QStringList()); QCOMPARE(recorder.audioCodecDescription(id), QString()); QCOMPARE(recorder.supportedAudioSampleRates(), QList()); QCOMPARE(recorder.supportedVideoCodecs(), QStringList()); QCOMPARE(recorder.videoCodecDescription(id), QString()); bool continuous = true; QCOMPARE(recorder.supportedResolutions(QVideoEncoderSettings(), &continuous), QList()); QCOMPARE(continuous, false); continuous = true; QCOMPARE(recorder.supportedFrameRates(QVideoEncoderSettings(), &continuous), QList()); QCOMPARE(continuous, false); QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); QCOMPARE(recorder.containerFormat(), QString()); QVERIFY(!recorder.isMuted()); recorder.setMuted(true); QVERIFY(!recorder.isMuted()); } void tst_QMediaRecorder::testNullControls() { const QString id(QLatin1String("application/x-format")); MockMediaRecorderService service(0, 0); service.hasControls = false; MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(recorder.duration(), qint64(0)); QCOMPARE(recorder.supportedContainers(), QStringList()); QCOMPARE(recorder.containerDescription(id), QString()); QCOMPARE(recorder.supportedAudioCodecs(), QStringList()); QCOMPARE(recorder.audioCodecDescription(id), QString()); QCOMPARE(recorder.supportedAudioSampleRates(), QList()); QCOMPARE(recorder.supportedVideoCodecs(), QStringList()); QCOMPARE(recorder.videoCodecDescription(id), QString()); bool continuous = true; QCOMPARE(recorder.supportedResolutions(QVideoEncoderSettings(), &continuous), QList()); QCOMPARE(continuous, false); continuous = true; QCOMPARE(recorder.supportedFrameRates(QVideoEncoderSettings(), &continuous), QList()); QCOMPARE(continuous, false); QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); QCOMPARE(recorder.containerFormat(), QString()); recorder.setOutputLocation(QUrl("file://test/save/file.mp4")); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.actualLocation(), QUrl()); QAudioEncoderSettings audio; audio.setCodec(id); audio.setQuality(QMultimedia::LowQuality); QVideoEncoderSettings video; video.setCodec(id); video.setResolution(640, 480); recorder.setEncodingSettings(audio, video, id); QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); QCOMPARE(recorder.containerFormat(), QString()); QSignalSpy spy(&recorder, SIGNAL(stateChanged(QMediaRecorder::State))); recorder.record(); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(spy.count(), 0); recorder.pause(); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(spy.count(), 0); recorder.stop(); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(spy.count(), 0); } void tst_QMediaRecorder::testDeleteMediaObject() { MockMediaRecorderControl *mock = new MockMediaRecorderControl(this); MockMediaRecorderService *service = new MockMediaRecorderService(this, mock); MockMediaObject *object = new MockMediaObject(this, service); QMediaRecorder *capture = new QMediaRecorder(object); QVERIFY(capture->mediaObject() == object); QVERIFY(capture->isAvailable()); delete object; delete service; delete mock; QVERIFY(capture->mediaObject() == 0); QVERIFY(!capture->isAvailable()); delete capture; } void tst_QMediaRecorder::testError() { const QString errorString(QLatin1String("format error")); QSignalSpy spy(capture, SIGNAL(error(QMediaRecorder::Error))); QCOMPARE(capture->error(), QMediaRecorder::NoError); QCOMPARE(capture->errorString(), QString()); mock->error(QMediaRecorder::FormatError, errorString); QCOMPARE(capture->error(), QMediaRecorder::FormatError); QCOMPARE(capture->errorString(), errorString); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last()[0].value(), QMediaRecorder::FormatError); } void tst_QMediaRecorder::testSink() { capture->setOutputLocation(QUrl("test.tmp")); QUrl s = capture->outputLocation(); QCOMPARE(s.toString(), QString("test.tmp")); QCOMPARE(capture->actualLocation(), QUrl()); //the actual location is available after record capture->record(); QCOMPARE(capture->actualLocation().toString(), QString("test.tmp")); capture->stop(); QCOMPARE(capture->actualLocation().toString(), QString("test.tmp")); //setOutputLocation resets the actual location capture->setOutputLocation(QUrl()); QCOMPARE(capture->actualLocation(), QUrl()); capture->record(); QCOMPARE(capture->actualLocation(), QUrl::fromLocalFile("default_name.mp4")); capture->stop(); QCOMPARE(capture->actualLocation(), QUrl::fromLocalFile("default_name.mp4")); } void tst_QMediaRecorder::testRecord() { QSignalSpy stateSignal(capture,SIGNAL(stateChanged(QMediaRecorder::State))); QSignalSpy statusSignal(capture,SIGNAL(statusChanged(QMediaRecorder::Status))); QSignalSpy progressSignal(capture, SIGNAL(durationChanged(qint64))); capture->record(); QCOMPARE(capture->state(), QMediaRecorder::RecordingState); QCOMPARE(capture->error(), QMediaRecorder::NoError); QCOMPARE(capture->errorString(), QString()); QCOMPARE(stateSignal.count(), 1); QCOMPARE(stateSignal.last()[0].value(), QMediaRecorder::RecordingState); QTestEventLoop::instance().enterLoop(1); QCOMPARE(capture->status(), QMediaRecorder::RecordingStatus); QVERIFY(!statusSignal.isEmpty()); QCOMPARE(statusSignal.last()[0].value(), QMediaRecorder::RecordingStatus); statusSignal.clear(); QVERIFY(progressSignal.count() > 0); capture->pause(); QCOMPARE(capture->state(), QMediaRecorder::PausedState); QCOMPARE(stateSignal.count(), 2); QTestEventLoop::instance().enterLoop(1); QCOMPARE(capture->status(), QMediaRecorder::PausedStatus); QVERIFY(!statusSignal.isEmpty()); QCOMPARE(statusSignal.last()[0].value(), QMediaRecorder::PausedStatus); statusSignal.clear(); capture->stop(); QCOMPARE(capture->state(), QMediaRecorder::StoppedState); QCOMPARE(stateSignal.count(), 3); QTestEventLoop::instance().enterLoop(1); QCOMPARE(capture->status(), QMediaRecorder::LoadedStatus); QVERIFY(!statusSignal.isEmpty()); QCOMPARE(statusSignal.last()[0].value(), QMediaRecorder::LoadedStatus); statusSignal.clear(); mock->stop(); QCOMPARE(stateSignal.count(), 3); } void tst_QMediaRecorder::testMute() { QSignalSpy mutedChanged(capture, SIGNAL(mutedChanged(bool))); QVERIFY(!capture->isMuted()); capture->setMuted(true); QCOMPARE(mutedChanged.size(), 1); QCOMPARE(mutedChanged[0][0].toBool(), true); QVERIFY(capture->isMuted()); capture->setMuted(false); QCOMPARE(mutedChanged.size(), 2); QCOMPARE(mutedChanged[1][0].toBool(), false); QVERIFY(!capture->isMuted()); capture->setMuted(false); QCOMPARE(mutedChanged.size(), 2); } void tst_QMediaRecorder::testVolume() { QSignalSpy volumeChanged(capture, SIGNAL(volumeChanged(qreal))); QCOMPARE(capture->volume(), 1.0); capture->setVolume(2.0); QCOMPARE(volumeChanged.size(), 1); QCOMPARE(volumeChanged[0][0].toReal(), 2.0); QCOMPARE(capture->volume(), 2.0); capture->setVolume(1.0); QCOMPARE(volumeChanged.size(), 2); QCOMPARE(volumeChanged[1][0].toReal(), 1.0); QCOMPARE(capture->volume(), 1.0); capture->setVolume(1.0); QCOMPARE(volumeChanged.size(), 2); } void tst_QMediaRecorder::testAudioDeviceControl() { QSignalSpy readSignal(audio,SIGNAL(activeInputChanged(QString))); QVERIFY(audio->availableInputs().size() == 3); QVERIFY(audio->defaultInput().compare("device1") == 0); audio->setActiveInput("device2"); QTestEventLoop::instance().enterLoop(1); QVERIFY(audio->activeInput().compare("device2") == 0); QVERIFY(readSignal.count() == 1); QVERIFY(audio->inputDescription("device2").compare("dev2 comment") == 0); } void tst_QMediaRecorder::testAudioEncodeControl() { QStringList codecs = capture->supportedAudioCodecs(); QVERIFY(codecs.count() == 2); QVERIFY(capture->audioCodecDescription("audio/pcm") == "Pulse Code Modulation"); QList rates; rates << 8000 << 11025 << 22050 << 44100; QCOMPARE(capture->supportedAudioSampleRates(), rates); } void tst_QMediaRecorder::testMediaFormatsControl() { QCOMPARE(capture->supportedContainers(), QStringList() << "wav" << "mp3" << "mov"); QCOMPARE(capture->containerDescription("wav"), QString("WAV format")); QCOMPARE(capture->containerDescription("mp3"), QString("MP3 format")); QCOMPARE(capture->containerDescription("ogg"), QString()); } void tst_QMediaRecorder::testVideoEncodeControl() { bool continuous = false; QList sizes = capture->supportedResolutions(QVideoEncoderSettings(), &continuous); QCOMPARE(sizes.count(), 2); QCOMPARE(continuous, true); QList rates = capture->supportedFrameRates(QVideoEncoderSettings(), &continuous); QCOMPARE(rates.count(), 3); QCOMPARE(continuous, false); QStringList vCodecs = capture->supportedVideoCodecs(); QVERIFY(vCodecs.count() == 2); QCOMPARE(capture->videoCodecDescription("video/3gpp"), QString("video/3gpp")); } void tst_QMediaRecorder::testEncodingSettings() { QAudioEncoderSettings audioSettings = capture->audioSettings(); QCOMPARE(audioSettings.codec(), QString("audio/pcm")); QCOMPARE(audioSettings.bitRate(), 128*1024); QCOMPARE(audioSettings.sampleRate(), 8000); QCOMPARE(audioSettings.quality(), QMultimedia::NormalQuality); QCOMPARE(audioSettings.channelCount(), -1); QCOMPARE(audioSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); QVideoEncoderSettings videoSettings = capture->videoSettings(); QCOMPARE(videoSettings.codec(), QString()); QCOMPARE(videoSettings.bitRate(), -1); QCOMPARE(videoSettings.resolution(), QSize()); QCOMPARE(videoSettings.frameRate(), 0.0); QCOMPARE(videoSettings.quality(), QMultimedia::NormalQuality); QCOMPARE(videoSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); QString format = capture->containerFormat(); QCOMPARE(format, QString()); audioSettings.setCodec("audio/mpeg"); audioSettings.setSampleRate(44100); audioSettings.setBitRate(256*1024); audioSettings.setQuality(QMultimedia::HighQuality); audioSettings.setEncodingMode(QMultimedia::AverageBitRateEncoding); videoSettings.setCodec("video/3gpp"); videoSettings.setBitRate(800); videoSettings.setFrameRate(24*1024); videoSettings.setResolution(QSize(800,600)); videoSettings.setQuality(QMultimedia::HighQuality); audioSettings.setEncodingMode(QMultimedia::TwoPassEncoding); format = QString("mov"); capture->setAudioSettings(audioSettings); capture->setVideoSettings(videoSettings); capture->setContainerFormat(format); QCOMPARE(capture->audioSettings(), audioSettings); QCOMPARE(capture->videoSettings(), videoSettings); QCOMPARE(capture->containerFormat(), format); } void tst_QMediaRecorder::testAudioSettings() { QAudioEncoderSettings settings; QVERIFY(settings.isNull()); QVERIFY(settings == QAudioEncoderSettings()); QCOMPARE(settings.codec(), QString()); settings.setCodec(QLatin1String("codecName")); QCOMPARE(settings.codec(), QLatin1String("codecName")); QVERIFY(!settings.isNull()); QVERIFY(settings != QAudioEncoderSettings()); settings = QAudioEncoderSettings(); QCOMPARE(settings.bitRate(), -1); settings.setBitRate(128000); QCOMPARE(settings.bitRate(), 128000); QVERIFY(!settings.isNull()); settings = QAudioEncoderSettings(); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); settings.setQuality(QMultimedia::HighQuality); QCOMPARE(settings.quality(), QMultimedia::HighQuality); QVERIFY(!settings.isNull()); settings = QAudioEncoderSettings(); QCOMPARE(settings.sampleRate(), -1); settings.setSampleRate(44100); QCOMPARE(settings.sampleRate(), 44100); QVERIFY(!settings.isNull()); settings = QAudioEncoderSettings(); QCOMPARE(settings.channelCount(), -1); settings.setChannelCount(2); QCOMPARE(settings.channelCount(), 2); QVERIFY(!settings.isNull()); settings = QAudioEncoderSettings(); settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); QVariantMap options; options.insert(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); options.remove(QLatin1Literal("encoderOption")); settings.setEncodingOptions(options); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QAudioEncoderSettings()); settings = QAudioEncoderSettings(); QVERIFY(settings.isNull()); QCOMPARE(settings.codec(), QString()); QCOMPARE(settings.bitRate(), -1); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); QCOMPARE(settings.sampleRate(), -1); QVERIFY(settings.encodingOptions().isEmpty()); { QAudioEncoderSettings settings1; QAudioEncoderSettings settings2; QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } { QAudioEncoderSettings settings1; QAudioEncoderSettings settings2(settings1); QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } QAudioEncoderSettings settings1; settings1.setBitRate(1); QAudioEncoderSettings settings2; settings2.setBitRate(1); QVERIFY(settings1 == settings2); settings2.setBitRate(2); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setChannelCount(1); settings2 = QAudioEncoderSettings(); settings2.setChannelCount(1); QVERIFY(settings1 == settings2); settings2.setChannelCount(2); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setCodec("codec1"); settings2 = QAudioEncoderSettings(); settings2.setCodec("codec1"); QVERIFY(settings1 == settings2); settings2.setCodec("codec2"); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings2 = QAudioEncoderSettings(); settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); QVERIFY(settings1 == settings2); settings2.setEncodingMode(QMultimedia::TwoPassEncoding); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setQuality(QMultimedia::NormalQuality); settings2 = QAudioEncoderSettings(); settings2.setQuality(QMultimedia::NormalQuality); QVERIFY(settings1 == settings2); settings2.setQuality(QMultimedia::LowQuality); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setSampleRate(1); settings2 = QAudioEncoderSettings(); settings2.setSampleRate(1); QVERIFY(settings1 == settings2); settings2.setSampleRate(2); QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); settings2 = QAudioEncoderSettings(); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testVideoSettings() { QVideoEncoderSettings settings; QVERIFY(settings.isNull()); QVERIFY(settings == QVideoEncoderSettings()); QCOMPARE(settings.codec(), QString()); settings.setCodec(QLatin1String("codecName")); QCOMPARE(settings.codec(), QLatin1String("codecName")); QVERIFY(!settings.isNull()); QVERIFY(settings != QVideoEncoderSettings()); settings = QVideoEncoderSettings(); QCOMPARE(settings.bitRate(), -1); settings.setBitRate(128000); QCOMPARE(settings.bitRate(), 128000); QVERIFY(!settings.isNull()); settings = QVideoEncoderSettings(); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); settings.setQuality(QMultimedia::HighQuality); QCOMPARE(settings.quality(), QMultimedia::HighQuality); QVERIFY(!settings.isNull()); settings = QVideoEncoderSettings(); QCOMPARE(settings.frameRate(), qreal()); settings.setFrameRate(30000.0/10001); QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(30000.0/10001))); settings.setFrameRate(24.0); QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(24.0))); QVERIFY(!settings.isNull()); settings = QVideoEncoderSettings(); QCOMPARE(settings.resolution(), QSize()); settings.setResolution(QSize(320,240)); QCOMPARE(settings.resolution(), QSize(320,240)); settings.setResolution(800,600); QCOMPARE(settings.resolution(), QSize(800,600)); QVERIFY(!settings.isNull()); settings = QVideoEncoderSettings(); settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); QVariantMap options; options.insert(QLatin1Literal("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); options.remove(QLatin1Literal("encoderOption")); settings.setEncodingOptions(options); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QVideoEncoderSettings()); settings = QVideoEncoderSettings(); QVERIFY(settings.isNull()); QCOMPARE(settings.codec(), QString()); QCOMPARE(settings.bitRate(), -1); QCOMPARE(settings.quality(), QMultimedia::NormalQuality); QCOMPARE(settings.frameRate(), qreal()); QCOMPARE(settings.resolution(), QSize()); QVERIFY(settings.encodingOptions().isEmpty()); { QVideoEncoderSettings settings1; QVideoEncoderSettings settings2; QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } { QVideoEncoderSettings settings1; QVideoEncoderSettings settings2(settings1); QCOMPARE(settings2, settings1); settings2 = settings1; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); settings1.setQuality(QMultimedia::HighQuality); QVERIFY(settings2.isNull()); QVERIFY(!settings1.isNull()); QVERIFY(settings1 != settings2); } QVideoEncoderSettings settings1; settings1.setBitRate(1); QVideoEncoderSettings settings2; settings2.setBitRate(1); QVERIFY(settings1 == settings2); settings2.setBitRate(2); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setResolution(800,600); settings2 = QVideoEncoderSettings(); settings2.setResolution(QSize(800,600)); QVERIFY(settings1 == settings2); settings2.setResolution(QSize(400,300)); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setCodec("codec1"); settings2 = QVideoEncoderSettings(); settings2.setCodec("codec1"); QVERIFY(settings1 == settings2); settings2.setCodec("codec2"); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings2 = QVideoEncoderSettings(); settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); QVERIFY(settings1 == settings2); settings2.setEncodingMode(QMultimedia::TwoPassEncoding); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setQuality(QMultimedia::NormalQuality); settings2 = QVideoEncoderSettings(); settings2.setQuality(QMultimedia::NormalQuality); QVERIFY(settings1 == settings2); settings2.setQuality(QMultimedia::LowQuality); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setFrameRate(1); settings2 = QVideoEncoderSettings(); settings2.setFrameRate(1); QVERIFY(settings1 == settings2); settings2.setFrameRate(2); QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); settings2 = QVideoEncoderSettings(); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testSettingsApplied() { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); MockMediaObject object(0, &service); //if the media recorder is not configured after construction //the settings are applied in the next event loop QMediaRecorder recorder(&object); QCOMPARE(recorderControl.m_settingAppliedCount, 0); QTRY_COMPARE(recorderControl.m_settingAppliedCount, 1); QVideoEncoderSettings videoSettings; videoSettings.setResolution(640,480); recorder.setVideoSettings(videoSettings); QAudioEncoderSettings audioSettings; audioSettings.setQuality(QMultimedia::HighQuality); recorder.setAudioSettings(audioSettings); recorder.setContainerFormat("mkv"); QCOMPARE(recorderControl.m_settingAppliedCount, 1); QTRY_COMPARE(recorderControl.m_settingAppliedCount, 2); //encoder settings are applied before recording if changed audioSettings.setQuality(QMultimedia::VeryHighQuality); recorder.setAudioSettings(audioSettings); QCOMPARE(recorderControl.m_settingAppliedCount, 2); recorder.record(); QCOMPARE(recorderControl.m_settingAppliedCount, 3); recorder.stop(); //applySettings is not called if setting has not changes recorder.record(); QCOMPARE(recorderControl.m_settingAppliedCount, 3); } void tst_QMediaRecorder::nullMetaDataControl() { const QString titleKey(QLatin1String("Title")); const QString title(QLatin1String("Host of Seraphim")); MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); service.hasControls = false; MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QSignalSpy spy(&recorder, SIGNAL(metaDataChanged())); QCOMPARE(recorder.isMetaDataAvailable(), false); QCOMPARE(recorder.isMetaDataWritable(), false); recorder.setMetaData(QMediaMetaData::Title, title); QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), QString()); QCOMPARE(recorder.availableMetaData(), QStringList()); QCOMPARE(spy.count(), 0); } void tst_QMediaRecorder::isMetaDataAvailable() { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); service.mockMetaDataControl->setMetaDataAvailable(false); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QCOMPARE(recorder.isMetaDataAvailable(), false); QSignalSpy spy(&recorder, SIGNAL(metaDataAvailableChanged(bool))); service.mockMetaDataControl->setMetaDataAvailable(true); QCOMPARE(recorder.isMetaDataAvailable(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.at(0).at(0).toBool(), true); service.mockMetaDataControl->setMetaDataAvailable(false); QCOMPARE(recorder.isMetaDataAvailable(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.at(1).at(0).toBool(), false); } void tst_QMediaRecorder::isWritable() { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); service.mockMetaDataControl->setWritable(false); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QSignalSpy spy(&recorder, SIGNAL(metaDataWritableChanged(bool))); QCOMPARE(recorder.isMetaDataWritable(), false); service.mockMetaDataControl->setWritable(true); QCOMPARE(recorder.isMetaDataWritable(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.at(0).at(0).toBool(), true); service.mockMetaDataControl->setWritable(false); QCOMPARE(recorder.isMetaDataWritable(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.at(1).at(0).toBool(), false); } void tst_QMediaRecorder::metaDataChanged() { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QSignalSpy changedSpy(&recorder, SIGNAL(metaDataChanged())); QSignalSpy changedWithValueSpy(&recorder, SIGNAL(metaDataChanged(QString,QVariant))); service.mockMetaDataControl->setMetaData("key", "Value"); QCOMPARE(changedSpy.count(), 1); QCOMPARE(changedWithValueSpy.count(), 1); QCOMPARE(changedWithValueSpy.last()[0], QVariant("key")); QCOMPARE(changedWithValueSpy.last()[1].value(), QVariant("Value")); service.mockMetaDataControl->setMetaData("key", "Value"); QCOMPARE(changedSpy.count(), 1); QCOMPARE(changedWithValueSpy.count(), 1); service.mockMetaDataControl->setMetaData("key2", "Value"); QCOMPARE(changedSpy.count(), 2); QCOMPARE(changedWithValueSpy.count(), 2); QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2")); QCOMPARE(changedWithValueSpy.last()[1].value(), QVariant("Value")); } void tst_QMediaRecorder::metaData_data() { QTest::addColumn("artist"); QTest::addColumn("title"); QTest::addColumn("genre"); QTest::addColumn("custom"); QTest::newRow("") << QString::fromLatin1("Dead Can Dance") << QString::fromLatin1("Host of Seraphim") << QString::fromLatin1("Awesome") << QString::fromLatin1("Something else"); } void tst_QMediaRecorder::metaData() { QFETCH(QString, artist); QFETCH(QString, title); QFETCH(QString, genre); QFETCH(QString, custom); MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); service.mockMetaDataControl->populateMetaData(); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QVERIFY(object.availableMetaData().isEmpty()); service.mockMetaDataControl->m_data.insert(QMediaMetaData::AlbumArtist, artist); service.mockMetaDataControl->m_data.insert(QMediaMetaData::Title, title); service.mockMetaDataControl->m_data.insert(QMediaMetaData::Genre, genre); service.mockMetaDataControl->m_data.insert(QLatin1String("CustomEntry"), custom ); QCOMPARE(recorder.metaData(QMediaMetaData::AlbumArtist).toString(), artist); QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), title); QStringList metaDataKeys = recorder.availableMetaData(); QCOMPARE(metaDataKeys.size(), 4); QVERIFY(metaDataKeys.contains(QMediaMetaData::AlbumArtist)); QVERIFY(metaDataKeys.contains(QMediaMetaData::Title)); QVERIFY(metaDataKeys.contains(QMediaMetaData::Genre)); QVERIFY(metaDataKeys.contains(QLatin1String("CustomEntry"))); } void tst_QMediaRecorder::setMetaData_data() { QTest::addColumn("title"); QTest::newRow("") << QString::fromLatin1("In the Kingdom of the Blind the One eyed are Kings"); } void tst_QMediaRecorder::setMetaData() { QFETCH(QString, title); MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service(0, &recorderControl); service.mockMetaDataControl->populateMetaData(); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); recorder.setMetaData(QMediaMetaData::Title, title); QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), title); QCOMPARE(service.mockMetaDataControl->m_data.value(QMediaMetaData::Title).toString(), title); } void tst_QMediaRecorder::testAudioSettingsCopyConstructor() { /* create an object for AudioEncodersettings */ QAudioEncoderSettings audiosettings; QVERIFY(audiosettings.isNull()); /* setting the desired properties for the AudioEncoder */ audiosettings.setBitRate(128*1000); audiosettings.setChannelCount(4); audiosettings.setCodec("audio/pcm"); audiosettings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings.setQuality(QMultimedia::LowQuality); audiosettings.setSampleRate(44100); /* Copy constructor */ QAudioEncoderSettings other(audiosettings); QVERIFY(!(other.isNull())); /* Verifying whether data is copied properly or not */ QVERIFY(other.bitRate() == audiosettings.bitRate()); QVERIFY(other.sampleRate() == audiosettings.sampleRate()); QVERIFY(other.channelCount() == audiosettings.channelCount()); QCOMPARE(other.codec(), audiosettings.codec()); QVERIFY(other.encodingMode() == audiosettings.encodingMode()); QVERIFY(other.quality() == audiosettings.quality()); } void tst_QMediaRecorder::testAudioSettingsOperatorNotEqual() { /* create an object for AudioEncodersettings */ QAudioEncoderSettings audiosettings1; QVERIFY(audiosettings1.isNull()); QAudioEncoderSettings audiosettings2; QVERIFY(audiosettings2.isNull()); /* setting the desired properties to for the AudioEncoder */ audiosettings1.setBitRate(128*1000); audiosettings1.setChannelCount(4); audiosettings1.setCodec("audio/pcm"); audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings1.setQuality(QMultimedia::LowQuality); audiosettings1.setSampleRate(44100); /* setting the desired properties for the AudioEncoder */ audiosettings2.setBitRate(128*1000); audiosettings2.setChannelCount(4); audiosettings2.setCodec("audio/pcm"); audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings2.setQuality(QMultimedia::LowQuality); audiosettings2.setSampleRate(44100); /* verify the both are equal or not */ QVERIFY(!(audiosettings1 != audiosettings2)); /* Modify the settings value for one object */ audiosettings2.setBitRate(64*1000); audiosettings2.setEncodingMode(QMultimedia::ConstantQualityEncoding); /* verify the not equal opertor */ QVERIFY(audiosettings1 != audiosettings2); QVERIFY(audiosettings2.bitRate() != audiosettings1.bitRate()); QVERIFY(audiosettings2.encodingMode() != audiosettings1.encodingMode()); } void tst_QMediaRecorder::testAudioSettingsOperatorEqual() { /* create an object for AudioEncodersettings */ QAudioEncoderSettings audiosettings1; QVERIFY(audiosettings1.isNull()); /* setting the desired properties to for the AudioEncoder */ audiosettings1.setBitRate(128*1000); audiosettings1.setChannelCount(4); audiosettings1.setCodec("audio/pcm"); audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings1.setQuality(QMultimedia::LowQuality); audiosettings1.setSampleRate(44100); QAudioEncoderSettings audiosettings2; QVERIFY(audiosettings2.isNull()); /* setting the desired properties for the AudioEncoder */ audiosettings2.setBitRate(128*1000); audiosettings2.setChannelCount(4); audiosettings2.setCodec("audio/pcm"); audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings2.setQuality(QMultimedia::LowQuality); audiosettings2.setSampleRate(44100); /* verify both the values are same or not */ QVERIFY(audiosettings1 == audiosettings2); audiosettings2.setChannelCount(2); QVERIFY(audiosettings1 != audiosettings2); } void tst_QMediaRecorder::testAudioSettingsOperatorAssign() { /* create an object for AudioEncodersettings */ QAudioEncoderSettings audiosettings1; QVERIFY(audiosettings1.isNull()); /* setting the desired properties for the AudioEncoder */ audiosettings1.setBitRate(128*1000); audiosettings1.setChannelCount(4); audiosettings1.setCodec("audio/pcm"); audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); audiosettings1.setQuality(QMultimedia::LowQuality); audiosettings1.setSampleRate(44100); QAudioEncoderSettings audiosettings2; audiosettings2 = audiosettings1; /* Verifying whether data is copied properly or not */ QVERIFY(audiosettings2.bitRate() == audiosettings1.bitRate()); QVERIFY(audiosettings2.sampleRate() == audiosettings1.sampleRate()); QVERIFY(audiosettings2.channelCount() == audiosettings1.channelCount()); QCOMPARE(audiosettings2.codec(), audiosettings1.codec()); QVERIFY(audiosettings2.encodingMode() == audiosettings1.encodingMode()); QVERIFY(audiosettings2.quality() == audiosettings1.quality()); } void tst_QMediaRecorder::testAudioSettingsDestructor() { /* Creating null object for the audioencodersettings */ QAudioEncoderSettings * audiosettings = new QAudioEncoderSettings; /* Verifying the object is null or not */ QVERIFY(audiosettings->isNull()); /* delete the allocated memory */ delete audiosettings; } /* availability() API test. */ void tst_QMediaRecorder::testAvailabilityStatus() { { MockMediaRecorderService service(0, 0); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QCOMPARE(recorder.availability(), QMultimedia::ServiceMissing); QCOMPARE(recorder.isAvailable(), false); } { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service1(0, &recorderControl); service1.mockMetaDataControl->populateMetaData(); MockMediaObject object1(0, &service1); QMediaRecorder recorder1(&object1); QCOMPARE(recorder1.availability(), QMultimedia::Available); QCOMPARE(recorder1.isAvailable(), true); } { MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service1(0, &recorderControl, 0); service1.mockMetaDataControl->populateMetaData(); MockMediaObject object1(0, &service1); QMediaRecorder recorder1(&object1); QCOMPARE(recorder1.availability(), QMultimedia::Available); QCOMPARE(recorder1.isAvailable(), true); } { MockMediaRecorderControl recorderControl(0); MockAvailabilityControl availability(QMultimedia::Available); MockMediaRecorderService service1(0, &recorderControl, &availability); service1.mockMetaDataControl->populateMetaData(); MockMediaObject object1(0, &service1); QMediaRecorder recorder1(&object1); QSignalSpy spy(&object1, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus))); QCOMPARE(recorder1.availability(), QMultimedia::Available); QCOMPARE(recorder1.isAvailable(), true); availability.setAvailability(QMultimedia::Busy); QCOMPARE(recorder1.availability(), QMultimedia::Busy); QCOMPARE(recorder1.isAvailable(), false); QCOMPARE(spy.count(), 1); availability.setAvailability(QMultimedia::Available); QCOMPARE(recorder1.availability(), QMultimedia::Available); QCOMPARE(recorder1.isAvailable(), true); QCOMPARE(spy.count(), 2); } } /* isAvailable() API test. */ void tst_QMediaRecorder::testIsAvailable() { MockMediaRecorderService service(0, 0); MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QCOMPARE(recorder.isAvailable(), false); MockMediaRecorderControl recorderControl(0); MockMediaRecorderService service1(0, &recorderControl); service1.mockMetaDataControl->populateMetaData(); MockMediaObject object1(0, &service1); QMediaRecorder recorder1(&object1); QCOMPARE(recorder1.isAvailable(), true); } /* mediaObject() API test. */ void tst_QMediaRecorder::testMediaObject() { MockMediaRecorderService service(0, 0); service.hasControls = false; MockMediaObject object(0, &service); QMediaRecorder recorder(&object); QMediaObject *medobj = recorder.mediaObject(); QVERIFY(medobj == NULL); QMediaObject *medobj1 = capture->mediaObject(); QVERIFY(medobj1 != NULL); } /* enum QMediaRecorder::ResourceError property test. */ void tst_QMediaRecorder::testEnum() { const QString errorString(QLatin1String("resource error")); QSignalSpy spy(capture, SIGNAL(error(QMediaRecorder::Error))); QCOMPARE(capture->error(), QMediaRecorder::NoError); QCOMPARE(capture->errorString(), QString()); mock->error(QMediaRecorder::ResourceError, errorString); QCOMPARE(capture->error(), QMediaRecorder::ResourceError); QCOMPARE(capture->errorString(), errorString); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last()[0].value(), QMediaRecorder::ResourceError); } /* Test the QVideoEncoderSettings quality API*/ void tst_QMediaRecorder::testVideoSettingsQuality() { /* Create the instance*/ QVideoEncoderSettings settings; QVERIFY(settings.isNull()); QVERIFY(settings == QVideoEncoderSettings()); /* Verify the default value is intialised correctly*/ QCOMPARE(settings.quality(), QMultimedia::NormalQuality); /* Set all types of Quality parameter and Verify if it is set correctly*/ settings.setQuality(QMultimedia::HighQuality); QCOMPARE(settings.quality(), QMultimedia::HighQuality); QVERIFY(!settings.isNull()); settings.setQuality(QMultimedia::VeryLowQuality); QCOMPARE(settings.quality(), QMultimedia::VeryLowQuality); settings.setQuality(QMultimedia::LowQuality); QCOMPARE(settings.quality(), QMultimedia::LowQuality); settings.setQuality(QMultimedia::VeryHighQuality); QCOMPARE(settings.quality(), QMultimedia::VeryHighQuality); } /* Test QVideoEncoderSettings encodingMode */ void tst_QMediaRecorder::testVideoSettingsEncodingMode() { /* Create the instance*/ QVideoEncoderSettings settings; QVERIFY(settings.isNull()); QVERIFY(settings == QVideoEncoderSettings()); /* Verify the default values are initialised correctly*/ QCOMPARE(settings.encodingMode(), QMultimedia::ConstantQualityEncoding); QVERIFY(settings.isNull()); /* Set each type of encoding mode and Verify if it is set correctly*/ settings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); QCOMPARE(settings.encodingMode(),QMultimedia::ConstantBitRateEncoding); QVERIFY(!settings.isNull()); settings.setEncodingMode(QMultimedia::AverageBitRateEncoding); QCOMPARE(settings.encodingMode(), QMultimedia::AverageBitRateEncoding); settings.setEncodingMode(QMultimedia::TwoPassEncoding); QCOMPARE(settings.encodingMode(), QMultimedia::TwoPassEncoding); } /* Test QVideoEncoderSettings copy constructor */ void tst_QMediaRecorder::testVideoSettingsCopyConstructor() { /* Create the instance and initialise it*/ QVideoEncoderSettings settings1; settings1.setCodec(QLatin1String("codecName")); settings1.setBitRate(128000); settings1.setQuality(QMultimedia::HighQuality); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings1.setFrameRate(30000.0/10001); settings1.setResolution(QSize(320,240)); /* Create another instance with instance1 as argument*/ QVideoEncoderSettings settings2(settings1); /* Verify if all the parameters are copied correctly*/ QCOMPARE(settings2 != settings1, false); QCOMPARE(settings2.codec(), QLatin1String("codecName")); QCOMPARE(settings2.bitRate(), 128000); QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); QCOMPARE(settings2.resolution(), QSize(320,240)); QCOMPARE(settings2.quality(), QMultimedia::HighQuality); /* Verify both the instances are equal*/ QCOMPARE(settings2, settings1); QVERIFY(!settings2.isNull()); } /* Test QVideoEncoderSettings Overloaded Operator assignment*/ void tst_QMediaRecorder::testVideoSettingsOperatorAssignment() { /* Create two instances.*/ QVideoEncoderSettings settings1; QVideoEncoderSettings settings2; QCOMPARE(settings2, settings1); QVERIFY(settings2.isNull()); /* Initialize all the parameters */ settings1.setCodec(QLatin1String("codecName")); settings1.setBitRate(128000); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings1.setFrameRate(30000.0/10001); settings1.setResolution(QSize(320,240)); settings1.setQuality(QMultimedia::HighQuality); /* Assign one object to other*/ settings2 = settings1; /* Verify all the parameters are copied correctly*/ QCOMPARE(settings2, settings1); QCOMPARE(settings2.codec(), QLatin1String("codecName")); QCOMPARE(settings2.bitRate(), 128000); QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); QCOMPARE(settings2.resolution(), QSize(320,240)); QCOMPARE(settings2.quality(), QMultimedia::HighQuality); QCOMPARE(settings2, settings1); QVERIFY(!settings2.isNull()); } /* Test QVideoEncoderSettings Overloaded OperatorNotEqual*/ void tst_QMediaRecorder::testVideoSettingsOperatorNotEqual() { /* Create the instance and set the bit rate and Verify objects with OperatorNotEqual*/ QVideoEncoderSettings settings1; settings1.setBitRate(1); QVideoEncoderSettings settings2; settings2.setBitRate(1); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setBitRate(2); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); /* Verify Resolution with not equal operator*/ settings1 = QVideoEncoderSettings(); settings1.setResolution(800,600); settings2 = QVideoEncoderSettings(); settings2.setResolution(QSize(800,600)); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setResolution(QSize(400,300)); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); /* Verify Codec with not equal operator*/ settings1 = QVideoEncoderSettings(); settings1.setCodec("codec1"); settings2 = QVideoEncoderSettings(); settings2.setCodec("codec1"); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setCodec("codec2"); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); /* Verify EncodingMode with not equal operator*/ settings1 = QVideoEncoderSettings(); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings2 = QVideoEncoderSettings(); settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setEncodingMode(QMultimedia::TwoPassEncoding); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); /* Verify Quality with not equal operator*/ settings1 = QVideoEncoderSettings(); settings1.setQuality(QMultimedia::NormalQuality); settings2 = QVideoEncoderSettings(); settings2.setQuality(QMultimedia::NormalQuality); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setQuality(QMultimedia::LowQuality); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); /* Verify FrameRate with not equal operator*/ settings1 = QVideoEncoderSettings(); settings1.setFrameRate(1); settings2 = QVideoEncoderSettings(); settings2.setFrameRate(1); /* OperatorNotEqual returns false when both objects are equal*/ QCOMPARE(settings1 != settings2, false); settings2.setFrameRate(2); /* OperatorNotEqual returns true when both objects are not equal*/ QVERIFY(settings1 != settings2); } /* Test QVideoEncoderSettings Overloaded comparison operator*/ void tst_QMediaRecorder::testVideoSettingsOperatorComparison() { /* Create the instance and set the bit rate and Verify objects with comparison operator*/ QVideoEncoderSettings settings1; settings1.setBitRate(1); QVideoEncoderSettings settings2; settings2.setBitRate(1); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setBitRate(2); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); /* Verify resolution with comparison operator*/ settings1 = QVideoEncoderSettings(); settings1.setResolution(800,600); settings2 = QVideoEncoderSettings(); settings2.setResolution(QSize(800,600)); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setResolution(QSize(400,300)); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); /* Verify Codec with comparison operator*/ settings1 = QVideoEncoderSettings(); settings1.setCodec("codec1"); settings2 = QVideoEncoderSettings(); settings2.setCodec("codec1"); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setCodec("codec2"); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); /* Verify EncodingMode with comparison operator*/ settings1 = QVideoEncoderSettings(); settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); settings2 = QVideoEncoderSettings(); settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setEncodingMode(QMultimedia::TwoPassEncoding); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); /* Verify Quality with comparison operator*/ settings1 = QVideoEncoderSettings(); settings1.setQuality(QMultimedia::NormalQuality); settings2 = QVideoEncoderSettings(); settings2.setQuality(QMultimedia::NormalQuality); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setQuality(QMultimedia::LowQuality); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); /* Verify FrameRate with comparison operator*/ settings1 = QVideoEncoderSettings(); settings1.setFrameRate(1); settings2 = QVideoEncoderSettings(); settings2.setFrameRate(1); /* Comparison operator returns true when both objects are equal*/ QVERIFY(settings1 == settings2); settings2.setFrameRate(2); /* Comparison operator returns false when both objects are not equal*/ QCOMPARE(settings1 == settings2, false); } /* Test the destuctor of the QVideoEncoderSettings*/ void tst_QMediaRecorder::testVideoSettingsDestructor() { /* Create the instance on heap and verify if object deleted correctly*/ QVideoEncoderSettings *settings1 = new QVideoEncoderSettings(); QVERIFY(settings1 != NULL); QVERIFY(settings1->isNull()); delete settings1; /* Create the instance on heap and initialise it and verify if object deleted correctly.*/ QVideoEncoderSettings *settings2 = new QVideoEncoderSettings(); QVERIFY(settings2 != NULL); settings2->setCodec(QString("codec")); QVERIFY(!settings2->isNull()); delete settings2; } QTEST_GUILESS_MAIN(tst_QMediaRecorder) #include "tst_qmediarecorder.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaresource/000077500000000000000000000000001225012771600307005ustar00rootroot00000000000000qmediaresource.pro000066400000000000000000000002471225012771600343560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaresourceCONFIG += testcase TARGET = tst_qmediaresource QT += network multimedia-private testlib SOURCES += tst_qmediaresource.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaresource.cpp000066400000000000000000000560051225012771600352350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaresource/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include "qmediaresource.h" QT_USE_NAMESPACE class tst_QMediaResource : public QObject { Q_OBJECT private slots: void constructNull(); void construct_data(); void construct(); void setResolution(); void equality(); void copy(); void assign(); void constructorRequest(); void copyConstructor(); }; void tst_QMediaResource::constructNull() { QMediaResource resource; QCOMPARE(resource.isNull(), true); QCOMPARE(resource.url(), QUrl()); QCOMPARE(resource.request(), QNetworkRequest()); QCOMPARE(resource.mimeType(), QString()); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); } void tst_QMediaResource::construct_data() { QTest::addColumn("url"); QTest::addColumn("request"); QTest::addColumn("mimeType"); QTest::addColumn("language"); QTest::addColumn("audioCodec"); QTest::addColumn("videoCodec"); QTest::addColumn("dataSize"); QTest::addColumn("audioBitRate"); QTest::addColumn("sampleRate"); QTest::addColumn("channelCount"); QTest::addColumn("videoBitRate"); QTest::addColumn("resolution"); QTest::newRow("audio content") << QUrl(QString::fromLatin1("http:://test.com/test.mp3")) << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.mp3"))) << QString::fromLatin1("audio/mpeg") << QString::fromLatin1("eng") << QString::fromLatin1("mp3") << QString() << qint64(5465433) << 128000 << 44100 << 2 << 0 << QSize(); QTest::newRow("image content") << QUrl(QString::fromLatin1("http:://test.com/test.jpg")) << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.jpg"))) << QString::fromLatin1("image/jpeg") << QString() << QString() << QString() << qint64(23600) << 0 << 0 << 0 << 0 << QSize(640, 480); QTest::newRow("video content") << QUrl(QString::fromLatin1("http:://test.com/test.mp4")) << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.mp4"))) << QString::fromLatin1("video/mp4") << QString() << QString::fromLatin1("aac") << QString::fromLatin1("h264") << qint64(36245851) << 96000 << 44000 << 5 << 750000 << QSize(720, 576); QTest::newRow("thumbnail") << QUrl(QString::fromLatin1("file::///thumbs/test.png")) << QNetworkRequest(QUrl(QString::fromLatin1("file::///thumbs/test.png"))) << QString::fromLatin1("image/png") << QString() << QString() << QString() << qint64(2360) << 0 << 0 << 0 << 0 << QSize(128, 128); } void tst_QMediaResource::construct() { QFETCH(QUrl, url); QFETCH(QNetworkRequest, request); QFETCH(QString, mimeType); QFETCH(QString, language); QFETCH(QString, audioCodec); QFETCH(QString, videoCodec); QFETCH(qint64, dataSize); QFETCH(int, audioBitRate); QFETCH(int, sampleRate); QFETCH(int, channelCount); QFETCH(int, videoBitRate); QFETCH(QSize, resolution); { QMediaResource resource(url); QCOMPARE(resource.isNull(), false); QCOMPARE(resource.url(), url); QCOMPARE(resource.mimeType(), QString()); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); } { QMediaResource resource(url, mimeType); QCOMPARE(resource.isNull(), false); QCOMPARE(resource.url(), url); QCOMPARE(resource.request(), request); QCOMPARE(resource.mimeType(), mimeType); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); resource.setLanguage(language); resource.setAudioCodec(audioCodec); resource.setVideoCodec(videoCodec); resource.setDataSize(dataSize); resource.setAudioBitRate(audioBitRate); resource.setSampleRate(sampleRate); resource.setChannelCount(channelCount); resource.setVideoBitRate(videoBitRate); resource.setResolution(resolution); QCOMPARE(resource.language(), language); QCOMPARE(resource.audioCodec(), audioCodec); QCOMPARE(resource.videoCodec(), videoCodec); QCOMPARE(resource.dataSize(), dataSize); QCOMPARE(resource.audioBitRate(), audioBitRate); QCOMPARE(resource.sampleRate(), sampleRate); QCOMPARE(resource.channelCount(), channelCount); QCOMPARE(resource.videoBitRate(), videoBitRate); QCOMPARE(resource.resolution(), resolution); } { QMediaResource resource(request, mimeType); QCOMPARE(resource.isNull(), false); QCOMPARE(resource.url(), url); QCOMPARE(resource.request(), request); QCOMPARE(resource.mimeType(), mimeType); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); resource.setLanguage(language); resource.setAudioCodec(audioCodec); resource.setVideoCodec(videoCodec); resource.setDataSize(dataSize); resource.setAudioBitRate(audioBitRate); resource.setSampleRate(sampleRate); resource.setChannelCount(channelCount); resource.setVideoBitRate(videoBitRate); resource.setResolution(resolution); QCOMPARE(resource.language(), language); QCOMPARE(resource.audioCodec(), audioCodec); QCOMPARE(resource.videoCodec(), videoCodec); QCOMPARE(resource.dataSize(), dataSize); QCOMPARE(resource.audioBitRate(), audioBitRate); QCOMPARE(resource.sampleRate(), sampleRate); QCOMPARE(resource.channelCount(), channelCount); QCOMPARE(resource.videoBitRate(), videoBitRate); QCOMPARE(resource.resolution(), resolution); } } void tst_QMediaResource::setResolution() { QMediaResource resource( QUrl(QString::fromLatin1("file::///thumbs/test.png")), QString::fromLatin1("image/png")); QCOMPARE(resource.resolution(), QSize()); resource.setResolution(QSize(120, 80)); QCOMPARE(resource.resolution(), QSize(120, 80)); resource.setResolution(QSize(-1, 23)); QCOMPARE(resource.resolution(), QSize(-1, 23)); resource.setResolution(QSize(-43, 34)); QCOMPARE(resource.resolution(), QSize(-43, 34)); resource.setResolution(QSize(64, -1)); QCOMPARE(resource.resolution(), QSize(64, -1)); resource.setResolution(QSize(64, -83)); QCOMPARE(resource.resolution(), QSize(64, -83)); resource.setResolution(QSize(-12, -83)); QCOMPARE(resource.resolution(), QSize(-12, -83)); resource.setResolution(QSize()); QCOMPARE(resource.resolution(), QSize(-1, -1)); resource.setResolution(120, 80); QCOMPARE(resource.resolution(), QSize(120, 80)); resource.setResolution(-1, 23); QCOMPARE(resource.resolution(), QSize(-1, 23)); resource.setResolution(-43, 34); QCOMPARE(resource.resolution(), QSize(-43, 34)); resource.setResolution(64, -1); QCOMPARE(resource.resolution(), QSize(64, -1)); resource.setResolution(64, -83); QCOMPARE(resource.resolution(), QSize(64, -83)); resource.setResolution(-12, -83); QCOMPARE(resource.resolution(), QSize(-12, -83)); resource.setResolution(-1, -1); QCOMPARE(resource.resolution(), QSize()); } void tst_QMediaResource::equality() { QMediaResource resource1( QUrl(QString::fromLatin1("http://test.com/test.mp4")), QString::fromLatin1("video/mp4")); QMediaResource resource2( QUrl(QString::fromLatin1("http://test.com/test.mp4")), QString::fromLatin1("video/mp4")); QMediaResource resource3( QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); QMediaResource resource4( QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); QMediaResource resource5( QUrl(QString::fromLatin1("http://test.com/test.mp3")), QString::fromLatin1("audio/mpeg")); QNetworkRequest request(QUrl("http://test.com/test.mp3")); QString requestMimeType("audio/mp3"); QMediaResource requestResource1(request, requestMimeType); QMediaResource requestResource2(request, requestMimeType); QCOMPARE(requestResource1 == requestResource2, true); QCOMPARE(requestResource1 != requestResource2, false); QCOMPARE(requestResource1 != resource5, true); QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); QCOMPARE(resource3 == resource4, true); QCOMPARE(resource3 != resource4, false); QCOMPARE(resource1 == resource3, false); QCOMPARE(resource1 != resource3, true); QCOMPARE(resource1 == resource5, false); QCOMPARE(resource1 != resource5, true); resource1.setAudioCodec(QString::fromLatin1("mp3")); resource2.setAudioCodec(QString::fromLatin1("aac")); // Not equal differing audio codecs. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource1.setAudioCodec(QString::fromLatin1("aac")); // Equal. QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setVideoCodec(QString()); // Equal. QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setVideoCodec(QString::fromLatin1("h264")); // Not equal differing video codecs. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource2.setVideoCodec(QString::fromLatin1("h264")); // Equal. QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource2.setDataSize(0); // Equal. QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setDataSize(546423); // Not equal differing video codecs. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource2.setDataSize(546423); // Equal. QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setAudioBitRate(96000); resource1.setSampleRate(48000); resource2.setSampleRate(44100); resource1.setChannelCount(0); resource1.setVideoBitRate(900000); resource2.setLanguage(QString::fromLatin1("eng")); // Not equal, audio bit rate, sample rate, video bit rate, and // language. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource2.setAudioBitRate(96000); resource1.setSampleRate(44100); // Not equal, differing video bit rate, and language. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource2.setVideoBitRate(900000); resource1.setLanguage(QString::fromLatin1("eng")); // Equal QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setResolution(QSize()); // Equal QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource2.setResolution(-1, -1); // Equal QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); resource1.setResolution(QSize(-640, -480)); // Not equal, differing resolution. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource1.setResolution(QSize(640, 480)); resource2.setResolution(QSize(800, 600)); // Not equal, differing resolution. QCOMPARE(resource1 == resource2, false); QCOMPARE(resource1 != resource2, true); resource1.setResolution(800, 600); // Equal QCOMPARE(resource1 == resource2, true); QCOMPARE(resource1 != resource2, false); /* equality tests for constructor of QMediaresource(QNetworkrequest,mimeType)*/ QNetworkRequest request2(QUrl(QString::fromLatin1("http://test.com/test.mp4"))); QUrl url(QString::fromLatin1("http://test.com/test.mp4")); QString mimeType(QLatin1String("video/mp4")); QMediaResource resource6(request2,mimeType); QMediaResource resource7(request2,mimeType); QVERIFY(resource6.request()==request2); QVERIFY(resource6.mimeType()==mimeType); QVERIFY(resource7.request()==request2); QVERIFY(resource7.mimeType()==mimeType); QVERIFY(resource6.request()==resource7.request()); QVERIFY(resource6.mimeType()==resource7.mimeType()); QVERIFY(resource6==resource7); /*for copy constructor*/ QMediaResource resource8(resource7); QVERIFY(resource8.request()==request2); QVERIFY(resource8.mimeType()==mimeType); QVERIFY(resource7.request()==request2); QVERIFY(resource7.mimeType()==mimeType); QVERIFY(resource8.request()==resource7.request()); QVERIFY(resource8.mimeType()==resource7.mimeType()); QVERIFY(resource8==resource7); /*for assign constructor*/ QMediaResource resource9(request2,mimeType); QMediaResource resource10=resource9; QVERIFY(resource10.request()==request2); QVERIFY(resource10.mimeType()==mimeType); QVERIFY(resource9.request()==request2); QVERIFY(resource9.mimeType()==mimeType); QVERIFY(resource8.request()==resource7.request()); QVERIFY(resource8.mimeType()==resource7.mimeType()); QVERIFY(resource8==resource7); } void tst_QMediaResource::copy() { const QUrl url(QString::fromLatin1("http://test.com/test.mp4")); const QString mimeType(QLatin1String("video/mp4")); const QString amrCodec(QLatin1String("amr")); const QString mp3Codec(QLatin1String("mp3")); const QString aacCodec(QLatin1String("aac")); const QString h264Codec(QLatin1String("h264")); QMediaResource original(url, mimeType); original.setAudioCodec(amrCodec); QMediaResource copy(original); QCOMPARE(copy.url(), url); QCOMPARE(copy.mimeType(), mimeType); QCOMPARE(copy.audioCodec(), amrCodec); QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); original.setAudioCodec(mp3Codec); QCOMPARE(copy.audioCodec(), amrCodec); QCOMPARE(original == copy, false); QCOMPARE(original != copy, true); copy.setAudioCodec(aacCodec); copy.setVideoCodec(h264Codec); QCOMPARE(copy.url(), url); QCOMPARE(copy.mimeType(), mimeType); QCOMPARE(original.audioCodec(), mp3Codec); } void tst_QMediaResource::assign() { const QUrl url(QString::fromLatin1("http://test.com/test.mp4")); const QString mimeType(QLatin1String("video/mp4")); const QString amrCodec(QLatin1String("amr")); const QString mp3Codec(QLatin1String("mp3")); const QString aacCodec(QLatin1String("aac")); const QString h264Codec(QLatin1String("h264")); QNetworkRequest request(QUrl(QString::fromLatin1("http://test.com/test.mp4"))); const qint64 dataSize(23600); int audioBitRate = 1, sampleRate = 2, channelCount = 3, videoBitRate = 4; QSize resolution(QSize(640, 480)); QString language("eng"); QMediaResource copy(QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); QMediaResource original(url, mimeType); original.setAudioCodec(amrCodec); copy = original; QCOMPARE(copy.url(), url); QCOMPARE(copy.mimeType(), mimeType); QCOMPARE(copy.audioCodec(), amrCodec); QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); original.setAudioCodec(mp3Codec); QCOMPARE(copy.audioCodec(), amrCodec); QCOMPARE(original == copy, false); QCOMPARE(original != copy, true); copy.setAudioCodec(aacCodec); copy.setVideoCodec(h264Codec); QCOMPARE(copy.url(), url); QCOMPARE(copy.mimeType(), mimeType); QCOMPARE(original.audioCodec(), mp3Codec); /* for constructor of QMediaresource(QNetworkrequest,mimeType)*/ QMediaResource copy1(QNetworkRequest(QUrl(QString::fromLatin1("file:///thumbs/test.jpg")))); QMediaResource original1(request, mimeType); original1.setAudioCodec(amrCodec); original1.setLanguage(QString("eng")); original1.setVideoCodec(h264Codec); original1.setDataSize(dataSize); original1.setAudioBitRate(audioBitRate); original1.setSampleRate(sampleRate); original1.setChannelCount(channelCount); original1.setVideoBitRate(videoBitRate); original1.setResolution(resolution); copy1 = original1; QCOMPARE(original1 == copy1, true); } // Constructor for request without passing mimetype. void tst_QMediaResource::constructorRequest() { //Initialise the request and url. QNetworkRequest request(QUrl(QString::fromLatin1("http:://test.com/test.mp3"))); QUrl url(QString::fromLatin1("http:://test.com/test.mp3")); // Create the instance with request as parameter. QMediaResource resource(request); // Verify all the parameters of objects. QCOMPARE(resource.isNull(), false); QCOMPARE(resource.url(), url); QCOMPARE(resource.request(), request); QCOMPARE(resource.mimeType(), QString()); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); } // Copy constructor with all the parameter and copy constructor for constructor with request and mimetype as parameter. void tst_QMediaResource::copyConstructor() { // Initialise all the parameters. const QUrl url(QString::fromLatin1("http://test.com/test.mp4")); const QString mimeType(QLatin1String("video/mp4")); const QString amrCodec(QLatin1String("amr")); const QString h264Codec(QLatin1String("h264")); const qint64 dataSize(23600); int audioBitRate = 1, sampleRate = 2, channelCount = 3, videoBitRate = 4; QSize resolution(QSize(640, 480)); QString language("eng"); // Create the instance with url and mimetype. QMediaResource original(url, mimeType); // Set all the parameters. original.setAudioCodec(amrCodec); original.setLanguage(QString("eng")); original.setVideoCodec(h264Codec); original.setDataSize(dataSize); original.setAudioBitRate(audioBitRate); original.setSampleRate(sampleRate); original.setChannelCount(channelCount); original.setVideoBitRate(videoBitRate); original.setResolution(resolution); // Copy the instance to new object. QMediaResource copy(original); // Verify all the parameters of the copied object. QCOMPARE(copy.url(), url); QCOMPARE(copy.mimeType(), mimeType); QCOMPARE(copy.audioCodec(), amrCodec); QCOMPARE(copy.language(), language ); QCOMPARE(copy.videoCodec(), h264Codec); QCOMPARE(copy.dataSize(), dataSize); QCOMPARE(copy.audioBitRate(), audioBitRate); QCOMPARE(copy.sampleRate(), sampleRate); QCOMPARE(copy.channelCount(), channelCount); QCOMPARE(copy.videoBitRate(), videoBitRate); QCOMPARE(copy.resolution(), resolution); // Compare both the objects are equal. QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); // Initialise the request parameter. QNetworkRequest request1(QUrl(QString::fromLatin1("http://test.com/test.mp4"))); // Constructor with rerquest and mimetype. QMediaResource original1(request1, mimeType); // Copy the object and verify if both are eqaul or not. QMediaResource copy1(original1); QCOMPARE(copy1.url(), url); QCOMPARE(copy1.mimeType(), mimeType); QCOMPARE(copy1.request(), request1); QCOMPARE(original1 == copy1, true); } QTEST_MAIN(tst_QMediaResource) #include "tst_qmediaresource.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaservice/000077500000000000000000000000001225012771600305115ustar00rootroot00000000000000qmediaservice.pro000066400000000000000000000002341225012771600337740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceCONFIG += testcase TARGET = tst_qmediaservice QT += multimedia-private testlib SOURCES += tst_qmediaservice.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaservice.cpp000066400000000000000000000223061225012771600346540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaservice/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include QT_BEGIN_NAMESPACE class QtTestMediaService; class QtTestMediaControlA : public QMediaControl { Q_OBJECT }; #define QtTestMediaControlA_iid "com.nokia.QtTestMediaControlA" Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlA, QtTestMediaControlA_iid) class QtTestMediaControlB : public QMediaControl { Q_OBJECT }; #define QtTestMediaControlB_iid "com.nokia.QtTestMediaControlB" Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlB, QtTestMediaControlB_iid) class QtTestMediaControlC : public QMediaControl { Q_OBJECT }; #define QtTestMediaControlC_iid "com.nokia.QtTestMediaControlC" Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlC, QtTestMediaControlA_iid) // Yes A. class QtTestMediaControlD : public QMediaControl { Q_OBJECT }; #define QtTestMediaControlD_iid "com.nokia.QtTestMediaControlD" Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlD, QtTestMediaControlD_iid) //unimplemented service #define QtTestMediaControlE_iid "com.nokia.QtTestMediaControlF" class QtTestMediaControlE : public QMediaControl { Q_OBJECT }; /* implementation of child class by inheriting The QMediaService base class for media service implementations. */ class QtTestMediaService : public QMediaService { Q_OBJECT public: int refA; int refB; int refC; QtTestMediaControlA controlA; QtTestMediaControlB controlB; QtTestMediaControlC controlC; //constructor QtTestMediaService(): QMediaService(0), refA(0), refB(0), refC(0) { } //requestControl() pure virtual function of QMediaService class. QMediaControl *requestControl(const char *name) { if (strcmp(name, QtTestMediaControlA_iid) == 0) { refA += 1; return &controlA; } else if (strcmp(name, QtTestMediaControlB_iid) == 0) { refB += 1; return &controlB; } else if (strcmp(name, QtTestMediaControlC_iid) == 0) { refA += 1; return &controlA; } else { return 0; } } //releaseControl() pure virtual function of QMediaService class. void releaseControl(QMediaControl *control) { if (control == &controlA) refA -= 1; else if (control == &controlB) refB -= 1; else if (control == &controlC) refC -= 1; } //requestControl() function of QMediaService class. using QMediaService::requestControl; }; /* Test case implementation for QMediaService class which provides a common base class for media service implementations.*/ class tst_QMediaService : public QObject { Q_OBJECT private slots: void tst_destructor(); void tst_releaseControl(); void tst_requestControl(); void tst_requestControlTemplate(); void initTestCase(); void control_iid(); void control(); }; /*MaemoAPI-1668 :destructor property test. */ void tst_QMediaService::tst_destructor() { QtTestMediaService *service = new QtTestMediaService; delete service; } void tst_QMediaService::initTestCase() { } /*MaemoAPI-1669 :releaseControl() API property test. */ void tst_QMediaService::tst_releaseControl() { //test class instance creation QtTestMediaService service; //Get a pointer to the media control implementing interface and verify. QMediaControl* controlA = service.requestControl(QtTestMediaControlA_iid); QCOMPARE(controlA, &service.controlA); service.releaseControl(controlA); //Controls must be returned to the service when no longer needed QVERIFY(service.refA == 0); //Get a pointer to the media control implementing interface and verify. QMediaControl* controlB = service.requestControl(QtTestMediaControlB_iid); QCOMPARE(controlB, &service.controlB); service.releaseControl(controlB); //Controls must be returned to the service when no longer needed QVERIFY(service.refB == 0); } /*MaemoAPI-1670 :requestControl() API property test. */ void tst_QMediaService::tst_requestControl() { //test class instance creation QtTestMediaService service; //Get a pointer to the media control implementing interface and verify. QMediaControl* controlA = service.requestControl(QtTestMediaControlA_iid); QCOMPARE(controlA, &service.controlA); service.releaseControl(controlA); //Controls must be returned to the service when no longer needed //Get a pointer to the media control implementing interface and verify. QMediaControl* controlB = service.requestControl(QtTestMediaControlB_iid); QCOMPARE(controlB, &service.controlB); service.releaseControl(controlB); //Controls must be returned to the service when no longer needed //If the service does not implement the control, a null pointer is returned instead. QMediaControl* controlE = service.requestControl(QtTestMediaControlE_iid); QVERIFY(!controlE); //should return null pointer service.releaseControl(controlE); //Controls must be returned to the service when no longer needed //If the service is unavailable a null pointer is returned instead. QMediaControl* control = service.requestControl(""); QVERIFY(!control); //should return null pointer service.releaseControl(control); //Controls must be returned to the service when no longer needed } /*MaemoAPI-1671 :requestControl() API property test. */ void tst_QMediaService::tst_requestControlTemplate() { //test class instance creation QtTestMediaService service; //Get a pointer to the media control of type T implemented by a media service. QtTestMediaControlA *controlA = service.requestControl(); QCOMPARE(controlA, &service.controlA); service.releaseControl(controlA); //Get a pointer to the media control of type T implemented by a media service. QtTestMediaControlB *controlB = service.requestControl(); QCOMPARE(controlB, &service.controlB); service.releaseControl(controlB); QVERIFY(!service.requestControl()); // Faulty implementation returns A. QCOMPARE(service.refA, 0); // Verify the control was released. QVERIFY(!service.requestControl()); // No control of that type. } void tst_QMediaService::control_iid() { const char *nullString = 0; // Default implementation. QCOMPARE(qmediacontrol_iid(), nullString); // Partial template. QVERIFY(qstrcmp(qmediacontrol_iid(), QtTestMediaControlA_iid) == 0); } void tst_QMediaService::control() { QtTestMediaService service; QtTestMediaControlA *controlA = service.requestControl(); QCOMPARE(controlA, &service.controlA); service.releaseControl(controlA); QtTestMediaControlB *controlB = service.requestControl(); QCOMPARE(controlB, &service.controlB); service.releaseControl(controlB); QVERIFY(!service.requestControl()); // Faulty implementation returns A, but is wrong class QCOMPARE(service.refA, 0); // Verify the control was released. QVERIFY(!service.requestControl()); // No control of that type. } QT_END_NAMESPACE QT_USE_NAMESPACE QTEST_MAIN(tst_QMediaService) #include "tst_qmediaservice.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/000077500000000000000000000000001225012771600322645ustar00rootroot00000000000000mockservice.h000066400000000000000000000044761225012771600347030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKSERVICE_H #define MOCKSERVICE_H #include class MockMediaService : public QMediaService { Q_OBJECT public: MockMediaService(const QString& name, QObject *parent = 0) : QMediaService(parent) { setObjectName(name); } ~MockMediaService() {} QMediaControl* requestControl(const char *) {return 0;} void releaseControl(QMediaControl *) {} }; #endif // MOCKSERVICE_H mockserviceplugin1/000077500000000000000000000000001225012771600360175ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovidermockserviceplugin1.cpp000066400000000000000000000073161225012771600423440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "../mockservice.h" class MockServicePlugin1 : public QMediaServiceProviderPlugin, public QMediaServiceSupportedFormatsInterface, public QMediaServiceSupportedDevicesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedFormatsInterface) Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "mockserviceplugin1.json") public: QStringList keys() const { return QStringList() << QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER); } QMediaService* create(QString const& key) { if (keys().contains(key)) return new MockMediaService("MockServicePlugin1"); else return 0; } void release(QMediaService *service) { delete service; } QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const { if (codecs.contains(QLatin1String("mpeg4"))) return QMultimedia::NotSupported; if (mimeType == "audio/ogg") { return QMultimedia::ProbablySupported; } return QMultimedia::MaybeSupported; } QStringList supportedMimeTypes() const { return QStringList("audio/ogg"); } QList devices(const QByteArray &service) const { Q_UNUSED(service); QList res; return res; } QString deviceDescription(const QByteArray &service, const QByteArray &device) { if (devices(service).contains(device)) return QString(device)+" description"; else return QString(); } }; #include "mockserviceplugin1.moc" mockserviceplugin1.json000066400000000000000000000000621225012771600425220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1{ "Keys": ["org.qt-project.qt.mediaplayer"] } mockserviceplugin1.pro000066400000000000000000000010331225012771600423500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1TARGET = mockserviceplugin1 QT += multimedia-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = MockServicePlugin1 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} win32 { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { DESTDIR = ../release/$${PLUGIN_TYPE} } } HEADERS += ../mockservice.h SOURCES += mockserviceplugin1.cpp OTHER_FILES += mockserviceplugin1.json target.path = $$[QT_INSTALL_TESTS]/tst_qmediaserviceprovider/$${PLUGIN_TYPE} DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 mockserviceplugin2/000077500000000000000000000000001225012771600360205ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovidermockserviceplugin2.cpp000066400000000000000000000070411225012771600423410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "../mockservice.h" class MockServicePlugin2 : public QMediaServiceProviderPlugin, public QMediaServiceSupportedFormatsInterface, public QMediaServiceFeaturesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedFormatsInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "mockserviceplugin2.json") public: QStringList keys() const { return QStringList() << QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER) << QLatin1String(Q_MEDIASERVICE_RADIO); } QMediaService* create(QString const& key) { if (keys().contains(key)) return new MockMediaService("MockServicePlugin2"); else return 0; } void release(QMediaService *service) { delete service; } QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const { Q_UNUSED(codecs); if (mimeType == "audio/wav") return QMultimedia::PreferredService; return QMultimedia::NotSupported; } QStringList supportedMimeTypes() const { return QStringList("audio/wav"); } QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const { if (service == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) return QMediaServiceProviderHint::LowLatencyPlayback; else return 0; } }; #include "mockserviceplugin2.moc" mockserviceplugin2.json000066400000000000000000000001151225012771600425230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2{ "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.radio"] } mockserviceplugin2.pro000066400000000000000000000010331225012771600423520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2TARGET = mockserviceplugin2 QT += multimedia-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = MockServicePlugin2 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} win32 { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { DESTDIR = ../release/$${PLUGIN_TYPE} } } HEADERS += ../mockservice.h SOURCES += mockserviceplugin2.cpp OTHER_FILES += mockserviceplugin2.json target.path = $$[QT_INSTALL_TESTS]/tst_qmediaserviceprovider/$${PLUGIN_TYPE} DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 mockserviceplugin3/000077500000000000000000000000001225012771600360215ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovidermockserviceplugin3.cpp000066400000000000000000000064301225012771600423440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "../mockservice.h" class MockServicePlugin3 : public QMediaServiceProviderPlugin, public QMediaServiceSupportedDevicesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "mockserviceplugin3.json") public: QStringList keys() const { return QStringList() << QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER) << QLatin1String(Q_MEDIASERVICE_AUDIOSOURCE); } QMediaService* create(QString const& key) { if (keys().contains(key)) return new MockMediaService("MockServicePlugin3"); else return 0; } void release(QMediaService *service) { delete service; } QList devices(const QByteArray &service) const { QList res; if (service == QByteArray(Q_MEDIASERVICE_AUDIOSOURCE)) res << "audiosource1" << "audiosource2"; return res; } QString deviceDescription(const QByteArray &service, const QByteArray &device) { if (devices(service).contains(device)) return QString(device)+" description"; else return QString(); } }; #include "mockserviceplugin3.moc" mockserviceplugin3.json000066400000000000000000000001231225012771600425240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3{ "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiosource"] } mockserviceplugin3.pro000066400000000000000000000010331225012771600423540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3TARGET = mockserviceplugin3 QT += multimedia-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = MockServicePlugin3 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} win32 { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { DESTDIR = ../release/$${PLUGIN_TYPE} } } HEADERS += ../mockservice.h SOURCES += mockserviceplugin3.cpp OTHER_FILES += mockserviceplugin3.json target.path = $$[QT_INSTALL_TESTS]/tst_qmediaserviceprovider/$${PLUGIN_TYPE} DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 mockserviceplugin4/000077500000000000000000000000001225012771600360225ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovidermockserviceplugin4.cpp000066400000000000000000000071211225012771600423440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "../mockservice.h" class MockServicePlugin4 : public QMediaServiceProviderPlugin, public QMediaServiceSupportedFormatsInterface, public QMediaServiceFeaturesInterface { Q_OBJECT Q_INTERFACES(QMediaServiceSupportedFormatsInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "mockserviceplugin4.json") public: QStringList keys() const { return QStringList() << QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER); } QMediaService* create(QString const& key) { if (keys().contains(key)) return new MockMediaService("MockServicePlugin4"); else return 0; } void release(QMediaService *service) { delete service; } QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const { if (codecs.contains(QLatin1String("jpeg2000"))) return QMultimedia::NotSupported; if (supportedMimeTypes().contains(mimeType)) return QMultimedia::ProbablySupported; return QMultimedia::MaybeSupported; } QStringList supportedMimeTypes() const { return QStringList() << "video/mp4" << "video/quicktime"; } QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const { if (service == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) return QMediaServiceProviderHint::StreamPlayback; else return 0; } }; #include "mockserviceplugin4.moc" mockserviceplugin4.json000066400000000000000000000000621225012771600425300ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4{ "Keys": ["org.qt-project.qt.mediaplayer"] } mockserviceplugin4.pro000066400000000000000000000010331225012771600423560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4TARGET = mockserviceplugin4 QT += multimedia-private PLUGIN_TYPE=mediaservice PLUGIN_CLASS_NAME = MockServicePlugin4 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} win32 { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { DESTDIR = ../release/$${PLUGIN_TYPE} } } HEADERS += ../mockservice.h SOURCES += mockserviceplugin4.cpp OTHER_FILES += mockserviceplugin4.json target.path = $$[QT_INSTALL_TESTS]/tst_qmediaserviceprovider/$${PLUGIN_TYPE} DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 qmediaserviceprovider.pro000066400000000000000000000003221225012771600373200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceproviderTEMPLATE = subdirs CONFIG += ORDERED SUBDIRS += \ mockserviceplugin1 \ mockserviceplugin2 \ mockserviceplugin3 \ mockserviceplugin4 \ test # no special install rule for subdir INSTALLS = test/000077500000000000000000000000001225012771600331645ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovidertest.pro000066400000000000000000000005771225012771600346760ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/testCONFIG += testcase TARGET = ../tst_qmediaserviceprovider QT += multimedia-private testlib SOURCES += ../tst_qmediaserviceprovider.cpp win32 { CONFIG(debug, debug|release) { TARGET = ../../debug/tst_qmediaserviceprovider } else { TARGET = ../../release/tst_qmediaserviceprovider } } mac: CONFIG -= app_bundle DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediaserviceprovider.cpp000066400000000000000000000241231225012771600402010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediaserviceprovider/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include QT_USE_NAMESPACE class MockMediaServiceProvider : public QMediaServiceProvider { QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &) { Q_UNUSED(type); return 0; } void releaseService(QMediaService *service) { Q_UNUSED(service); } }; class tst_QMediaServiceProvider : public QObject { Q_OBJECT public slots: void initTestCase(); private slots: void testDefaultProviderAvailable(); void testObtainService(); void testHasSupport(); void testSupportedMimeTypes(); void testProviderHints(); private: QObjectList plugins; }; void tst_QMediaServiceProvider::initTestCase() { // QMediaPluginLoader::setStaticPlugins(QLatin1String("mediaservice"), plugins); QCoreApplication::setLibraryPaths(QStringList() << QCoreApplication::applicationDirPath()); } void tst_QMediaServiceProvider::testDefaultProviderAvailable() { // Must always be a default provider available QVERIFY(QMediaServiceProvider::defaultServiceProvider() != 0); } void tst_QMediaServiceProvider::testObtainService() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QMediaService *service = 0; // Player service = provider->requestService(Q_MEDIASERVICE_MEDIAPLAYER); QVERIFY(service != 0); provider->releaseService(service); } void tst_QMediaServiceProvider::testHasSupport() { MockMediaServiceProvider mockProvider; QCOMPARE(mockProvider.hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), QMultimedia::MaybeSupported); QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), QMultimedia::MaybeSupported); QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/ogg", QStringList()), QMultimedia::ProbablySupported); //while the service returns PreferredService, provider should return ProbablySupported QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/wav", QStringList()), QMultimedia::ProbablySupported); //even while all the plugins with "hasSupport" returned NotSupported, //MockServicePlugin3 has no "hasSupport" interface, so MaybeSupported QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/avi", QStringList() << "mpeg4"), QMultimedia::MaybeSupported); QCOMPARE(provider->hasSupport(QByteArray("non existing service"), "video/ogv", QStringList()), QMultimedia::NotSupported); QCOMPARE(QMediaPlayer::hasSupport("video/ogv"), QMultimedia::MaybeSupported); QCOMPARE(QMediaPlayer::hasSupport("audio/ogg"), QMultimedia::ProbablySupported); QCOMPARE(QMediaPlayer::hasSupport("audio/wav"), QMultimedia::ProbablySupported); //test low latency flag support QCOMPARE(QMediaPlayer::hasSupport("audio/wav", QStringList(), QMediaPlayer::LowLatency), QMultimedia::ProbablySupported); //plugin1 probably supports audio/ogg, it checked because it doesn't provide features iface QCOMPARE(QMediaPlayer::hasSupport("audio/ogg", QStringList(), QMediaPlayer::LowLatency), QMultimedia::ProbablySupported); //Plugin4 is not checked here, sine it's known not support low latency QCOMPARE(QMediaPlayer::hasSupport("video/quicktime", QStringList(), QMediaPlayer::LowLatency), QMultimedia::MaybeSupported); //test streaming flag support QCOMPARE(QMediaPlayer::hasSupport("video/quicktime", QStringList(), QMediaPlayer::StreamPlayback), QMultimedia::ProbablySupported); //Plugin2 is not checked here, sine it's known not support streaming QCOMPARE(QMediaPlayer::hasSupport("audio/wav", QStringList(), QMediaPlayer::StreamPlayback), QMultimedia::MaybeSupported); //ensure the correct media player plugin is chosen for mime type QMediaPlayer simplePlayer(0, QMediaPlayer::LowLatency); QCOMPARE(simplePlayer.service()->objectName(), QLatin1String("MockServicePlugin2")); QMediaPlayer mediaPlayer; QVERIFY(mediaPlayer.service()->objectName() != QLatin1String("MockServicePlugin2")); QMediaPlayer streamPlayer(0, QMediaPlayer::StreamPlayback); QCOMPARE(streamPlayer.service()->objectName(), QLatin1String("MockServicePlugin4")); } void tst_QMediaServiceProvider::testSupportedMimeTypes() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QVERIFY(provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/ogg")); QVERIFY(!provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/mp3")); } void tst_QMediaServiceProvider::testProviderHints() { { QMediaServiceProviderHint hint; QVERIFY(hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::Null); QVERIFY(hint.device().isEmpty()); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), 0); } { QByteArray deviceName(QByteArray("testDevice")); QMediaServiceProviderHint hint(deviceName); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::Device); QCOMPARE(hint.device(), deviceName); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), 0); } { QMediaServiceProviderHint hint(QMediaServiceProviderHint::LowLatencyPlayback); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::SupportedFeatures); QVERIFY(hint.device().isEmpty()); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), QMediaServiceProviderHint::LowLatencyPlayback); } { QMediaServiceProviderHint hint(QMediaServiceProviderHint::RecordingSupport); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::SupportedFeatures); QVERIFY(hint.device().isEmpty()); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), QMediaServiceProviderHint::RecordingSupport); } { QString mimeType(QLatin1String("video/ogg")); QStringList codecs; codecs << "theora" << "vorbis"; QMediaServiceProviderHint hint(mimeType,codecs); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.mimeType(), mimeType); QCOMPARE(hint.codecs(), codecs); QMediaServiceProviderHint hint2(hint); QVERIFY(!hint2.isNull()); QCOMPARE(hint2.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint2.device().isEmpty()); QCOMPARE(hint2.mimeType(), mimeType); QCOMPARE(hint2.codecs(), codecs); QMediaServiceProviderHint hint3; QVERIFY(hint3.isNull()); hint3 = hint; QVERIFY(!hint3.isNull()); QCOMPARE(hint3.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint3.device().isEmpty()); QCOMPARE(hint3.mimeType(), mimeType); QCOMPARE(hint3.codecs(), codecs); QCOMPARE(hint, hint2); QCOMPARE(hint3, hint2); QMediaServiceProviderHint hint4(mimeType,codecs); QCOMPARE(hint, hint4); QMediaServiceProviderHint hint5(mimeType,QStringList()); QVERIFY(hint != hint5); } } QTEST_MAIN(tst_QMediaServiceProvider) #include "tst_qmediaserviceprovider.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediatimerange/000077500000000000000000000000001225012771600310245ustar00rootroot00000000000000qmediatimerange.pro000066400000000000000000000002411225012771600346200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediatimerangeCONFIG += testcase TARGET = tst_qmediatimerange QT += multimedia-private testlib SOURCES += tst_qmediatimerange.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmediatimerange.cpp000066400000000000000000000502611225012771600355030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmediatimerange/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include QT_USE_NAMESPACE class tst_QMediaTimeRange: public QObject { Q_OBJECT public slots: private slots: void testCtor(); void testIntervalCtor(); void testGetters(); void testAssignment(); void testIntervalNormalize(); void testIntervalTranslate(); void testIntervalContains(); void testEarliestLatest(); void testContains(); void testAddInterval(); void testAddTimeRange(); void testRemoveInterval(); void testRemoveTimeRange(); void testClear(); void testComparisons(); void testArithmetic(); }; void tst_QMediaTimeRange::testIntervalCtor() { //Default Ctor for Time Interval /* create an instance for the time interval and verify the default cases */ QMediaTimeInterval tInter; QVERIFY(tInter.isNormal()); QVERIFY(tInter.start() == 0); QVERIFY(tInter.end() == 0); // (qint, qint) Ctor time interval /* create an instace of QMediaTimeInterval passing start and end times and verify the all possible scenario's*/ QMediaTimeInterval time(20,50); QVERIFY(time.isNormal()); QVERIFY(time.start() == 20); QVERIFY(time.end() == 50); // Copy Ctor Time interval QMediaTimeInterval other(time); QVERIFY(other.isNormal() == time.isNormal()); QVERIFY(other.start() == time.start()); QVERIFY(other.end() == time.end()); QVERIFY(other.contains(20) == time.contains(20)); QVERIFY(other == time); } void tst_QMediaTimeRange::testIntervalContains() { QMediaTimeInterval time(20,50); /* start() <= time <= end(). Returns true if the time interval contains the specified time. */ QVERIFY(!time.contains(10)); QVERIFY(time.contains(20)); QVERIFY(time.contains(30)); QVERIFY(time.contains(50)); QVERIFY(!time.contains(60)); QMediaTimeInterval x(20, 10); // denormal // Check denormal ranges QVERIFY(!x.contains(5)); QVERIFY(x.contains(10)); QVERIFY(x.contains(15)); QVERIFY(x.contains(20)); QVERIFY(!x.contains(25)); QMediaTimeInterval y = x.normalized(); QVERIFY(!y.contains(5)); QVERIFY(y.contains(10)); QVERIFY(y.contains(15)); QVERIFY(y.contains(20)); QVERIFY(!y.contains(25)); } void tst_QMediaTimeRange::testCtor() { // Default Ctor QMediaTimeRange a; QVERIFY(a.isEmpty()); // (qint, qint) Ctor QMediaTimeRange b(10, 20); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Interval Ctor QMediaTimeRange c(QMediaTimeInterval(30, 40)); QVERIFY(!c.isEmpty()); QVERIFY(c.isContinuous()); QVERIFY(c.earliestTime() == 30); QVERIFY(c.latestTime() == 40); // Abnormal Interval Ctor QMediaTimeRange d(QMediaTimeInterval(20, 10)); QVERIFY(d.isEmpty()); // Copy Ctor QMediaTimeRange e(b); QVERIFY(!e.isEmpty()); QVERIFY(e.isContinuous()); QVERIFY(e.earliestTime() == 10); QVERIFY(e.latestTime() == 20); QVERIFY(e == b); } void tst_QMediaTimeRange::testGetters() { QMediaTimeRange x; // isEmpty QVERIFY(x.isEmpty()); x.addInterval(10, 20); // isEmpty + isContinuous QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); x.addInterval(30, 40); // isEmpty + isContinuous + intervals + start + end QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 20); QVERIFY(x.intervals()[1].start() == 30); QVERIFY(x.intervals()[1].end() == 40); } void tst_QMediaTimeRange::testAssignment() { QMediaTimeRange x; // Range Assignment x = QMediaTimeRange(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 20); // Interval Assignment x = QMediaTimeInterval(30, 40); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 40); // Shared Data Check QMediaTimeRange y; y = x; y.addInterval(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 40); } void tst_QMediaTimeRange::testIntervalNormalize() { QMediaTimeInterval x(20, 10); QVERIFY(!x.isNormal()); QVERIFY(x.start() == 20); QVERIFY(x.end() == 10); QMediaTimeInterval y = x.normalized(); QVERIFY(y.isNormal()); QVERIFY(y.start() == 10); QVERIFY(y.end() == 20); QVERIFY(x != y); } void tst_QMediaTimeRange::testIntervalTranslate() { QMediaTimeInterval x(10, 20); x = x.translated(10); QVERIFY(x.start() == 20); QVERIFY(x.end() == 30); /* verifying the backward through time with a negative offset.*/ x = x.translated(-10); QVERIFY(x.start() == 10); QVERIFY(x.end() == 20); } void tst_QMediaTimeRange::testEarliestLatest() { // Test over a single interval QMediaTimeRange x(30, 40); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 40); // Test over multiple intervals x.addInterval(50, 60); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 60); } void tst_QMediaTimeRange::testContains() { // Test over a single interval QMediaTimeRange x(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.contains(15)); QVERIFY(x.contains(10)); QVERIFY(x.contains(20)); QVERIFY(!x.contains(25)); // Test over multiple intervals x.addInterval(40, 50); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.contains(15)); QVERIFY(x.contains(45)); QVERIFY(!x.contains(30)); // Test over a concrete interval QMediaTimeInterval y(10, 20); QVERIFY(y.contains(15)); QVERIFY(y.contains(10)); QVERIFY(y.contains(20)); QVERIFY(!y.contains(25)); } void tst_QMediaTimeRange::testAddInterval() { // All intervals Overlap QMediaTimeRange x; x.addInterval(10, 40); x.addInterval(30, 50); x.addInterval(20, 60); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // 1 adjacent interval, 1 encompassed interval x = QMediaTimeRange(); x.addInterval(10, 40); x.addInterval(20, 30); x.addInterval(41, 50); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 50); // 1 overlapping interval, 1 disjoint interval x = QMediaTimeRange(); x.addInterval(10, 30); x.addInterval(20, 40); x.addInterval(50, 60); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 40); QVERIFY(x.intervals()[1].start() == 50); QVERIFY(x.intervals()[1].end() == 60); // Identical Add x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 20); // Multi-Merge x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.addInterval(50, 60); x.addInterval(15, 55); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // Interval Parameter - All intervals Overlap x = QMediaTimeRange(); x.addInterval(QMediaTimeInterval(10, 40)); x.addInterval(QMediaTimeInterval(30, 50)); x.addInterval(QMediaTimeInterval(20, 60)); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // Interval Parameter - Abnormal Interval x = QMediaTimeRange(); x.addInterval(QMediaTimeInterval(20, 10)); QVERIFY(x.isEmpty()); } void tst_QMediaTimeRange::testAddTimeRange() { // Add Time Range uses Add Interval internally, // so in this test the focus is on combinations of number // of intervals added, rather than the different types of // merges which can occur. QMediaTimeRange a, b; // Add Single into Single a = QMediaTimeRange(10, 30); b = QMediaTimeRange(20, 40); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 40); // Add Multiple into Single a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 60); b = QMediaTimeRange(20, 50); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 60); // Add Single into Multiple a = QMediaTimeRange(20, 50); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 60); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 60); // Add Multiple into Multiple a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 70); a.addInterval(80, 100); b = QMediaTimeRange(); b.addInterval(20, 50); b.addInterval(60, 90); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 100); // Add Nothing to Single a = QMediaTimeRange(); b = QMediaTimeRange(10, 20); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Add Single to Nothing a = QMediaTimeRange(10, 20); b = QMediaTimeRange(); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Add Nothing to Nothing a = QMediaTimeRange(); b = QMediaTimeRange(); b.addTimeRange(a); QVERIFY(b.isEmpty()); } void tst_QMediaTimeRange::testRemoveInterval() { // Removing an interval, causing a split QMediaTimeRange x; x.addInterval(10, 50); x.removeInterval(20, 40); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 19); QVERIFY(x.intervals()[1].start() == 41); QVERIFY(x.intervals()[1].end() == 50); // Removing an interval, causing a deletion x = QMediaTimeRange(); x.addInterval(20, 30); x.removeInterval(10, 40); QVERIFY(x.isEmpty()); // Removing an interval, causing a tail trim x = QMediaTimeRange(); x.addInterval(20, 40); x.removeInterval(30, 50); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 20); QVERIFY(x.latestTime() == 29); // Removing an interval, causing a head trim x = QMediaTimeRange(); x.addInterval(20, 40); x.removeInterval(10, 30); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 31); QVERIFY(x.latestTime() == 40); // Identical Remove x = QMediaTimeRange(); x.addInterval(10, 20); x.removeInterval(10, 20); QVERIFY(x.isEmpty()); // Multi-Trim x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.removeInterval(15, 35); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 14); QVERIFY(x.intervals()[1].start() == 36); QVERIFY(x.intervals()[1].end() == 40); // Multi-Delete x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.addInterval(50, 60); x.removeInterval(10, 60); QVERIFY(x.isEmpty()); // Interval Parameter - Removing an interval, causing a split x = QMediaTimeRange(); x.addInterval(10, 50); x.removeInterval(QMediaTimeInterval(20, 40)); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 19); QVERIFY(x.intervals()[1].start() == 41); QVERIFY(x.intervals()[1].end() == 50); // Interval Parameter - Abnormal Interval x = QMediaTimeRange(); x.addInterval(10, 40); x.removeInterval(QMediaTimeInterval(30, 20)); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 40); } void tst_QMediaTimeRange::testRemoveTimeRange() { // Remove Time Range uses Remove Interval internally, // so in this test the focus is on combinations of number // of intervals removed, rather than the different types of // deletions which can occur. QMediaTimeRange a, b; // Remove Single from Single a = QMediaTimeRange(10, 30); b = QMediaTimeRange(20, 40); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 31); QVERIFY(b.latestTime() == 40); // Remove Multiple from Single a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 60); b = QMediaTimeRange(20, 50); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 31); QVERIFY(b.latestTime() == 39); // Remove Single from Multiple a = QMediaTimeRange(20, 50); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 60); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(!b.isContinuous()); QVERIFY(b.intervals().count() == 2); QVERIFY(b.intervals()[0].start() == 10); QVERIFY(b.intervals()[0].end() == 19); QVERIFY(b.intervals()[1].start() == 51); QVERIFY(b.intervals()[1].end() == 60); // Remove Multiple from Multiple a = QMediaTimeRange(); a.addInterval(20, 50); a.addInterval(50, 90); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 70); b.addInterval(80, 100); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(!b.isContinuous()); QVERIFY(b.intervals().count() == 2); QVERIFY(b.intervals()[0].start() == 10); QVERIFY(b.intervals()[0].end() == 19); QVERIFY(b.intervals()[1].start() == 91); QVERIFY(b.intervals()[1].end() == 100); // Remove Nothing from Single a = QMediaTimeRange(); b = QMediaTimeRange(10, 20); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Remove Single from Nothing a = QMediaTimeRange(10, 20); b = QMediaTimeRange(); b.removeTimeRange(a); QVERIFY(b.isEmpty()); // Remove Nothing from Nothing a = QMediaTimeRange(); b = QMediaTimeRange(); b.removeTimeRange(a); QVERIFY(b.isEmpty()); } void tst_QMediaTimeRange::testClear() { QMediaTimeRange x; // Clear Nothing x.clear(); QVERIFY(x.isEmpty()); // Clear Single x = QMediaTimeRange(10, 20); x.clear(); QVERIFY(x.isEmpty()); // Clear Multiple x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.clear(); QVERIFY(x.isEmpty()); } void tst_QMediaTimeRange::testComparisons() { // Interval equality QVERIFY(QMediaTimeInterval(10, 20) == QMediaTimeInterval(10, 20)); QVERIFY(QMediaTimeInterval(10, 20) != QMediaTimeInterval(10, 30)); QVERIFY(!(QMediaTimeInterval(10, 20) != QMediaTimeInterval(10, 20))); QVERIFY(!(QMediaTimeInterval(10, 20) == QMediaTimeInterval(10, 30))); // Time range equality - Single Interval QMediaTimeRange a(10, 20), b(20, 30), c(10, 20); QVERIFY(a == c); QVERIFY(!(a == b)); QVERIFY(a != b); QVERIFY(!(a != c)); // Time Range Equality - Multiple Intervals QMediaTimeRange x, y, z; x.addInterval(10, 20); x.addInterval(30, 40); x.addInterval(50, 60); y.addInterval(10, 20); y.addInterval(35, 45); y.addInterval(50, 60); z.addInterval(10, 20); z.addInterval(30, 40); z.addInterval(50, 60); QVERIFY(x == z); QVERIFY(!(x == y)); QVERIFY(x != y); QVERIFY(!(x != z)); } void tst_QMediaTimeRange::testArithmetic() { QMediaTimeRange a(10, 20), b(20, 30); // Test += a += b; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 30); // Test -= a -= b; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 19); // Test += and -= on intervals a -= QMediaTimeInterval(10, 20); a += QMediaTimeInterval(40, 50); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 40); QVERIFY(a.latestTime() == 50); // Test Interval + Interval a = QMediaTimeInterval(10, 20) + QMediaTimeInterval(20, 30); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 30); // Test Range + Interval a = a + QMediaTimeInterval(30, 40); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 40); // Test Interval + Range a = QMediaTimeInterval(40, 50) + a; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 50); // Test Range + Range a = a + QMediaTimeRange(50, 60); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 60); // Test Range - Interval a = a - QMediaTimeInterval(50, 60); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 49); // Test Range - Range a = a - QMediaTimeRange(40, 50); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 39); // Test Interval - Range b = QMediaTimeInterval(0, 20) - a; QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 0); QVERIFY(b.latestTime() == 9); // Test Interval - Interval a = QMediaTimeInterval(10, 20) - QMediaTimeInterval(15, 30); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 14); } QTEST_MAIN(tst_QMediaTimeRange) #include "tst_qmediatimerange.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatareadercontrol/000077500000000000000000000000001225012771600324155ustar00rootroot00000000000000qmetadatareadercontrol.pro000066400000000000000000000003421225012771600376040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatareadercontrolCONFIG += testcase TARGET = tst_qmetadatareadercontrol QT += multimedia-private testlib SOURCES += tst_qmetadatareadercontrol.cpp include (../qmultimedia_common/mockcontainer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmetadatareadercontrol.cpp000066400000000000000000000106401225012771600404620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatareadercontrol/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "mockmetadatareadercontrol.h" class tst_QMetaDataReaderControl : public QObject { Q_OBJECT private slots: // Test case for QMetaDataReaderControl void metaDataReaderControlConstructor(); void metaDataReaderControlAvailableMetaData(); void metaDataReaderControlIsMetaDataAvailable(); void metaDataReaderControlMetaData(); void metaDataReaderControlMetaDataAvailableChangedSignal(); void metaDataReaderControlMetaDataChangedSignal(); }; QTEST_MAIN(tst_QMetaDataReaderControl); /* Test case for constructor. */ void tst_QMetaDataReaderControl::metaDataReaderControlConstructor() { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); delete metaData; } /* Test case for availableMetaData() */ void tst_QMetaDataReaderControl::metaDataReaderControlAvailableMetaData() { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); metaData->availableMetaData() ; delete metaData; } /* Test case for availableMetaData */ void tst_QMetaDataReaderControl::metaDataReaderControlIsMetaDataAvailable () { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); metaData->availableMetaData(); delete metaData; } /* Test case for metaData */ void tst_QMetaDataReaderControl::metaDataReaderControlMetaData () { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); metaData->metaData(QMediaMetaData::Title); delete metaData; } /* Test case for signal metaDataAvailableChanged */ void tst_QMetaDataReaderControl::metaDataReaderControlMetaDataAvailableChangedSignal () { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); QSignalSpy spy(metaData,SIGNAL(metaDataAvailableChanged(bool))); metaData->setMetaDataAvailable(true); QVERIFY(spy.count() == 1); delete metaData; } /* Test case for signal metaDataChanged */ void tst_QMetaDataReaderControl::metaDataReaderControlMetaDataChangedSignal () { MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl(); QVERIFY(metaData !=NULL); QSignalSpy spy(metaData,SIGNAL(metaDataChanged())); metaData->metaDataChanged(); QVERIFY(spy.count () == 1); delete metaData; } #include "tst_qmetadatareadercontrol.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatawritercontrol/000077500000000000000000000000001225012771600324675ustar00rootroot00000000000000qmetadatawritercontrol.pro000066400000000000000000000003411225012771600377270ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatawritercontrolCONFIG += testcase TARGET = tst_qmetadatawritercontrol QT += multimedia-private testlib SOURCES += tst_qmetadatawritercontrol.cpp include (../qmultimedia_common/mockcontainer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qmetadatawritercontrol.cpp000066400000000000000000000057111225012771600406110ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmetadatawritercontrol/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qmetadatawritercontrol.h" #include "mockmetadatawritercontrol.h" class tst_QMetaDataWriterControl: public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); private slots: void constructor(); }; void tst_QMetaDataWriterControl::initTestCase() { } void tst_QMetaDataWriterControl::cleanupTestCase() { } //MaemoAPI-1862:test constructor void tst_QMetaDataWriterControl::constructor() { QMetaDataWriterControl *mock = new MockMetaDataWriterControl(); mock->availableMetaData(); mock->isMetaDataAvailable(); mock->isWritable(); mock->metaData(QMediaMetaData::Title); mock->setMetaData(QMediaMetaData::Title, QVariant()); ((MockMetaDataWriterControl*)mock)->setWritable(); ((MockMetaDataWriterControl*)mock)->setMetaDataAvailable(); delete mock; } QTEST_MAIN(tst_QMetaDataWriterControl); #include "tst_qmetadatawritercontrol.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/000077500000000000000000000000001225012771600315535ustar00rootroot00000000000000mock.pri000066400000000000000000000004131225012771600331370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_commonINCLUDEPATH += $$PWD \ ../../../src/multimedia \ HEADERS *= \ ../qmultimedia_common/mockmediaserviceprovider.h \ ../qmultimedia_common/mockmediaservice.h \ ../qmultimedia_common/mockmediaobject.h \ ../qmultimedia_common/mockavailabilitycontrol.h mockaudiodecodercontrol.h000066400000000000000000000142351225012771600365540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAUDIODECODERCONTROL_H #define MOCKAUDIODECODERCONTROL_H #include "qmediacontrol.h" #include "qaudiodecodercontrol.h" #include #include "qaudiobuffer.h" #include #include #define MOCK_DECODER_MAX_BUFFERS 10 QT_BEGIN_NAMESPACE class MockAudioDecoderControl : public QAudioDecoderControl { Q_OBJECT public: MockAudioDecoderControl(QObject *parent = 0) : QAudioDecoderControl(parent) , mState(QAudioDecoder::StoppedState) , mDevice(0) , mPosition(-1) , mSerial(0) { mFormat.setChannelCount(1); mFormat.setSampleSize(8); mFormat.setSampleRate(1000); mFormat.setCodec("audio/x-raw"); mFormat.setSampleType(QAudioFormat::UnSignedInt); } QAudioDecoder::State state() const { return mState; } QString sourceFilename() const { return mSource; } QAudioFormat audioFormat() const { return mFormat; } void setAudioFormat(const QAudioFormat &format) { if (mFormat != format) { mFormat = format; emit formatChanged(mFormat); } } void setSourceFilename(const QString &fileName) { mSource = fileName; mDevice = 0; stop(); } QIODevice* sourceDevice() const { return mDevice; } void setSourceDevice(QIODevice *device) { mDevice = device; mSource.clear(); stop(); } // When decoding we decode to first buffer, then second buffer // we then stop until the first is read again and so on, for // 5 buffers void start() { if (mState == QAudioDecoder::StoppedState) { if (!mSource.isEmpty()) { mState = QAudioDecoder::DecodingState; emit stateChanged(mState); emit durationChanged(duration()); QTimer::singleShot(50, this, SLOT(pretendDecode())); } else { emit error(QAudioDecoder::ResourceError, "No source set"); } } } void stop() { if (mState != QAudioDecoder::StoppedState) { mState = QAudioDecoder::StoppedState; mSerial = 0; mPosition = 0; mBuffers.clear(); emit stateChanged(mState); emit bufferAvailableChanged(false); } } QAudioBuffer read() { QAudioBuffer a; if (mBuffers.length() > 0) { a = mBuffers.takeFirst(); mPosition = a.startTime() / 1000; emit positionChanged(mPosition); if (mBuffers.isEmpty()) emit bufferAvailableChanged(false); if (mBuffers.isEmpty() && mSerial >= MOCK_DECODER_MAX_BUFFERS) { mState = QAudioDecoder::StoppedState; emit finished(); emit stateChanged(mState); } else QTimer::singleShot(50, this, SLOT(pretendDecode())); } return a; } bool bufferAvailable() const { return mBuffers.length() > 0; } qint64 position() const { return mPosition; } qint64 duration() const { return (sizeof(mSerial) * MOCK_DECODER_MAX_BUFFERS * qint64(1000)) / (mFormat.sampleRate() * mFormat.channelCount()); } private slots: void pretendDecode() { // Check if we've reached end of stream if (mSerial >= MOCK_DECODER_MAX_BUFFERS) return; // We just keep the length of mBuffers to 3 or less. if (mBuffers.length() < 3) { QByteArray b(sizeof(mSerial), 0); memcpy(b.data(), &mSerial, sizeof(mSerial)); qint64 position = (sizeof(mSerial) * mSerial * qint64(1000000)) / (mFormat.sampleRate() * mFormat.channelCount()); mSerial++; mBuffers.push_back(QAudioBuffer(b, mFormat, position)); emit bufferReady(); if (mBuffers.count() == 1) emit bufferAvailableChanged(true); } } public: QAudioDecoder::State mState; QString mSource; QIODevice *mDevice; QAudioFormat mFormat; qint64 mPosition; int mSerial; QList mBuffers; }; QT_END_NAMESPACE #endif // QAUDIODECODERCONTROL_H mockaudiodecoderservice.h000066400000000000000000000056231225012771600365350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAUDIODECODERSERVICE_H #define MOCKAUDIODECODERSERVICE_H #include "qmediaservice.h" #include "mockaudiodecodercontrol.h" class MockAudioDecoderService : public QMediaService { Q_OBJECT public: MockAudioDecoderService(QObject *parent = 0) : QMediaService(parent) { mockControl = new MockAudioDecoderControl(this); validControl = mockControl; } ~MockAudioDecoderService() { delete mockControl; } QMediaControl* requestControl(const char *iid) { if (qstrcmp(iid, QAudioDecoderControl_iid) == 0) return mockControl; return 0; } void releaseControl(QMediaControl *control) { Q_UNUSED(control); } void setControlNull() { mockControl = 0; } void setControlValid() { mockControl = validControl; } MockAudioDecoderControl *mockControl; MockAudioDecoderControl *validControl; }; #endif // MOCKAUDIODECODERSERVICE_H mockaudioencodercontrol.h000066400000000000000000000070311225012771600365620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAUDIOENCODERCONTROL_H #define MOCKAUDIOENCODERCONTROL_H #include "qaudioencodersettingscontrol.h" class MockAudioEncoderControl : public QAudioEncoderSettingsControl { Q_OBJECT public: MockAudioEncoderControl(QObject *parent): QAudioEncoderSettingsControl(parent) { m_codecs << "audio/pcm" << "audio/mpeg"; m_descriptions << "Pulse Code Modulation" << "mp3 format"; m_audioSettings.setCodec("audio/pcm"); m_audioSettings.setBitRate(128*1024); m_audioSettings.setSampleRate(8000); m_freqs << 8000 << 11025 << 22050 << 44100; } ~MockAudioEncoderControl() {} QAudioEncoderSettings audioSettings() const { return m_audioSettings; } void setAudioSettings(const QAudioEncoderSettings &settings) { m_audioSettings = settings; } QList supportedChannelCounts(const QAudioEncoderSettings & = QAudioEncoderSettings()) const { QList list; list << 1 << 2; return list; } QList supportedSampleRates(const QAudioEncoderSettings & = QAudioEncoderSettings(), bool *continuous = 0) const { if (continuous) *continuous = false; return m_freqs; } QStringList supportedAudioCodecs() const { return m_codecs; } QString codecDescription(const QString &codecName) const { return m_descriptions.value(m_codecs.indexOf(codecName)); } private: QAudioEncoderSettings m_audioSettings; QStringList m_codecs; QStringList m_descriptions; QList m_freqs; }; #endif // MOCKAUDIOENCODERCONTROL_H mockaudioinputselector.h000066400000000000000000000067221225012771600364500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAUDIOINPUTSELECTOR_H #define MOCKAUDIOINPUTSELECTOR_H #include "qaudioinputselectorcontrol.h" class MockAudioInputSelector : public QAudioInputSelectorControl { Q_OBJECT public: MockAudioInputSelector(QObject *parent): QAudioInputSelectorControl(parent) { m_names << "device1" << "device2" << "device3"; m_descriptions << "dev1 comment" << "dev2 comment" << "dev3 comment"; m_audioInput = "device1"; emit availableInputsChanged(); } ~MockAudioInputSelector() {} QList availableInputs() const { return m_names; } QString inputDescription(const QString& name) const { QString desc; for (int i = 0; i < m_names.count(); i++) { if (m_names.at(i).compare(name) == 0) { desc = m_descriptions.at(i); break; } } return desc; } QString defaultInput() const { return m_names.at(0); } QString activeInput() const { return m_audioInput; } public Q_SLOTS: void setActiveInput(const QString& name) { m_audioInput = name; emit activeInputChanged(name); } void addInputs() { m_names << "device4"; emit availableInputsChanged(); } void removeInputs() { m_names.clear(); emit availableInputsChanged(); } private: QString m_audioInput; QList m_names; QList m_descriptions; }; #endif // MOCKAUDIOINPUTSELECTOR_H mockaudioprobecontrol.h000066400000000000000000000044321225012771600362540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAUDIOPROBECONTROL_H #define MOCKAUDIOPROBECONTROL_H #include "qmediaaudioprobecontrol.h" class MockAudioProbeControl : public QMediaAudioProbeControl { Q_OBJECT public: MockAudioProbeControl(QObject *parent): QMediaAudioProbeControl(parent) { } ~MockAudioProbeControl() {} private: }; #endif // MOCKAUDIOPROBECONTROL_H mockavailabilitycontrol.h000066400000000000000000000052321225012771600365740ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKAVAILABILITYCONTROL_H #define MOCKAVAILABILITYCONTROL_H #include class MockAvailabilityControl : public QMediaAvailabilityControl { Q_OBJECT public: MockAvailabilityControl(QMultimedia::AvailabilityStatus available) : m_availability(available) { } QMultimedia::AvailabilityStatus availability() const { return m_availability; } void setAvailability(QMultimedia::AvailabilityStatus availability) { if (m_availability != availability) { m_availability = availability; emit availabilityChanged(availability); } } QMultimedia::AvailabilityStatus m_availability; }; #endif // MOCKAVAILABILITYCONTROL_H mockcamera.pri000066400000000000000000000015431225012771600343150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common# Camera related mock backend files INCLUDEPATH += $$PWD \ ../../../src/multimedia \ ../../../src/multimedia/video \ ../../../src/multimedia/camera HEADERS *= \ ../qmultimedia_common/mockcameraservice.h \ ../qmultimedia_common/mockcameraflashcontrol.h \ ../qmultimedia_common/mockcameralockscontrol.h \ ../qmultimedia_common/mockcamerafocuscontrol.h \ ../qmultimedia_common/mockcamerazoomcontrol.h \ ../qmultimedia_common/mockcameraimageprocessingcontrol.h \ ../qmultimedia_common/mockcameraimagecapturecontrol.h \ ../qmultimedia_common/mockcameraexposurecontrol.h \ ../qmultimedia_common/mockcameracapturedestinationcontrol.h \ ../qmultimedia_common/mockcameracapturebuffercontrol.h \ ../qmultimedia_common/mockimageencodercontrol.h \ ../qmultimedia_common/mockcameracontrol.h \ include(mockvideo.pri) mockcameracapturebuffercontrol.h000066400000000000000000000057661225012771600401440ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERACAPTUREBUFFERCONTROL_H #define MOCKCAMERACAPTUREBUFFERCONTROL_H #include "qcameracapturebufferformatcontrol.h" class MockCaptureBufferFormatControl : public QCameraCaptureBufferFormatControl { Q_OBJECT public: MockCaptureBufferFormatControl(QObject *parent = 0): QCameraCaptureBufferFormatControl(parent), m_format(QVideoFrame::Format_Jpeg) { } QList supportedBufferFormats() const { return QList() << QVideoFrame::Format_Jpeg << QVideoFrame::Format_RGB32 << QVideoFrame::Format_AdobeDng; } QVideoFrame::PixelFormat bufferFormat() const { return m_format; } void setBufferFormat(QVideoFrame::PixelFormat format) { if (format != m_format && supportedBufferFormats().contains(format)) { m_format = format; emit bufferFormatChanged(m_format); } } private: QVideoFrame::PixelFormat m_format; }; #endif // MOCKCAMERACAPTUREBUFFERCONTROL_H mockcameracapturedestinationcontrol.h000066400000000000000000000061631225012771600412040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERACAPTUREDESTINATIONCONTROL_H #define MOCKCAMERACAPTUREDESTINATIONCONTROL_H #include class MockCaptureDestinationControl : public QCameraCaptureDestinationControl { Q_OBJECT public: MockCaptureDestinationControl(QObject *parent = 0): QCameraCaptureDestinationControl(parent), m_destination(QCameraImageCapture::CaptureToFile) { } bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const { return destination == QCameraImageCapture::CaptureToBuffer || destination == QCameraImageCapture::CaptureToFile; } QCameraImageCapture::CaptureDestinations captureDestination() const { return m_destination; } void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) { if (isCaptureDestinationSupported(destination) && destination != m_destination) { m_destination = destination; emit captureDestinationChanged(m_destination); } } private: QCameraImageCapture::CaptureDestinations m_destination; }; #endif // MOCKCAMERACAPTUREDESTINATIONCONTROL_H mockcameracontrol.h000066400000000000000000000116351225012771600353560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERACONTROL_H #define MOCKCAMERACONTROL_H #include "qcameracontrol.h" class MockCameraControl : public QCameraControl { friend class MockCaptureControl; Q_OBJECT public: MockCameraControl(QObject *parent = 0): QCameraControl(parent), m_state(QCamera::UnloadedState), m_captureMode(QCamera::CaptureStillImage), m_status(QCamera::UnloadedStatus), m_propertyChangesSupported(false) { } ~MockCameraControl() {} void start() { m_state = QCamera::ActiveState; } virtual void stop() { m_state = QCamera::UnloadedState; } QCamera::State state() const { return m_state; } void setState(QCamera::State state) { if (m_state != state) { m_state = state; switch (state) { case QCamera::UnloadedState: m_status = QCamera::UnloadedStatus; break; case QCamera::LoadedState: m_status = QCamera::LoadedStatus; break; case QCamera::ActiveState: m_status = QCamera::ActiveStatus; break; default: emit error(QCamera::NotSupportedFeatureError, "State not supported."); return; } emit stateChanged(m_state); emit statusChanged(m_status); } } QCamera::Status status() const { return m_status; } QCamera::CaptureModes captureMode() const { return m_captureMode; } void setCaptureMode(QCamera::CaptureModes mode) { if (m_captureMode != mode) { if (m_state == QCamera::ActiveState && !m_propertyChangesSupported) return; m_captureMode = mode; emit captureModeChanged(mode); } } bool isCaptureModeSupported(QCamera::CaptureModes mode) const { return mode == QCamera::CaptureStillImage || mode == QCamera::CaptureVideo; } QCamera::LockTypes supportedLocks() const { return QCamera::LockExposure | QCamera::LockFocus | QCamera::LockWhiteBalance; } bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const { Q_UNUSED(status); if (changeType == QCameraControl::ImageEncodingSettings && m_captureMode == QCamera::CaptureVideo) return true; else if (changeType== QCameraControl::VideoEncodingSettings) return true; else return m_propertyChangesSupported; } /* helper method to emit the signal error */ void setError(QCamera::Error err, QString errorString) { emit error(err, errorString); } /* helper method to emit the signal statusChaged */ void setStatus(QCamera::Status newStatus) { m_status = newStatus; emit statusChanged(newStatus); } QCamera::State m_state; QCamera::CaptureModes m_captureMode; QCamera::Status m_status; bool m_propertyChangesSupported; }; #endif // MOCKCAMERACONTROL_H mockcameraexposurecontrol.h000066400000000000000000000253431225012771600371520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERAEXPOSURECONTROL_H #define MOCKCAMERAEXPOSURECONTROL_H #include "qcameraexposurecontrol.h" class MockCameraExposureControl : public QCameraExposureControl { Q_OBJECT public: MockCameraExposureControl(QObject *parent = 0): QCameraExposureControl(parent), m_aperture(2.8), m_shutterSpeed(0.01), m_isoSensitivity(100), m_meteringMode(QCameraExposure::MeteringMatrix), m_exposureCompensation(0), m_exposureMode(QCameraExposure::ExposureAuto), m_flashMode(QCameraExposure::FlashAuto), m_spot(0.5, 0.5) { m_isoRanges << 100 << 200 << 400 << 800; m_apertureRanges << 2.8 << 4.0 << 5.6 << 8.0 << 11.0 << 16.0; m_shutterRanges << 0.001 << 0.01 << 0.1 << 1.0; m_exposureRanges << -2.0 << 2.0; QList exposureModes; exposureModes << QCameraExposure::ExposureAuto << QCameraExposure::ExposureManual << QCameraExposure::ExposureBacklight << QCameraExposure::ExposureNight << QCameraExposure::ExposureSpotlight << QCameraExposure::ExposureSports << QCameraExposure::ExposureSnow << QCameraExposure:: ExposureLargeAperture << QCameraExposure::ExposureSmallAperture << QCameraExposure::ExposurePortrait << QCameraExposure::ExposureModeVendor << QCameraExposure::ExposureBeach; foreach (QCameraExposure::ExposureMode mode, exposureModes) m_exposureModes << QVariant::fromValue(mode); m_meteringModes << QVariant::fromValue(QCameraExposure::MeteringMatrix) << QVariant::fromValue(QCameraExposure::MeteringSpot); } ~MockCameraExposureControl() {} bool isParameterSupported(ExposureParameter parameter) const { switch (parameter) { case QCameraExposureControl::ExposureMode: case QCameraExposureControl::MeteringMode: case QCameraExposureControl::ExposureCompensation: case QCameraExposureControl::ISO: case QCameraExposureControl::Aperture: case QCameraExposureControl::ShutterSpeed: case QCameraExposureControl::SpotMeteringPoint: return true; default: return false; } } QVariant requestedValue(ExposureParameter param) const { return m_requestedParameters.value(param); } QVariant actualValue(ExposureParameter param) const { switch (param) { case QCameraExposureControl::ExposureMode: return QVariant::fromValue(m_exposureMode); case QCameraExposureControl::MeteringMode: return QVariant::fromValue(m_meteringMode); case QCameraExposureControl::ExposureCompensation: return QVariant(m_exposureCompensation); case QCameraExposureControl::ISO: return QVariant(m_isoSensitivity); case QCameraExposureControl::Aperture: return QVariant(m_aperture); case QCameraExposureControl::ShutterSpeed: return QVariant(m_shutterSpeed); case QCameraExposureControl::SpotMeteringPoint: return QVariant(m_spot); default: return QVariant(); } } QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const { *continuous = false; QVariantList res; switch (parameter) { case QCameraExposureControl::ExposureCompensation: *continuous = true; return m_exposureRanges; case QCameraExposureControl::ISO: return m_isoRanges; case QCameraExposureControl::Aperture: *continuous = true; return m_apertureRanges; case QCameraExposureControl::ShutterSpeed: *continuous = true; return m_shutterRanges; case QCameraExposureControl::ExposureMode: return m_exposureModes; case QCameraExposureControl::MeteringMode: return m_meteringModes; default: break; } return res; } // Added valueChanged and parameterRangeChanged signal bool setValue(ExposureParameter param, const QVariant& value) { if (!isParameterSupported(param)) return false; if (m_requestedParameters.value(param) != value) { m_requestedParameters.insert(param, value); emit requestedValueChanged(param); } switch (param) { case QCameraExposureControl::ExposureMode: { QCameraExposure::ExposureMode mode = value.value(); if (mode != m_exposureMode && m_exposureModes.contains(value)) { m_exposureMode = mode; emit actualValueChanged(param); } } break; case QCameraExposureControl::MeteringMode: { QCameraExposure::MeteringMode mode = value.value(); if (mode != m_meteringMode && m_meteringModes.contains(value)) { m_meteringMode = mode; emit actualValueChanged(param); } } break; case QCameraExposureControl::ExposureCompensation: { m_res.clear(); m_res << -4.0 << 4.0; qreal exposureCompensationlocal = qBound(-2.0, value.toReal(), 2.0); if (actualValue(param).toReal() != exposureCompensationlocal) { m_exposureCompensation = exposureCompensationlocal; emit actualValueChanged(param); } if (m_exposureRanges.last().toReal() != m_res.last().toReal()) { m_exposureRanges.clear(); m_exposureRanges = m_res; emit parameterRangeChanged(param); } } break; case QCameraExposureControl::ISO: { m_res.clear(); m_res << 20 << 50; qreal exposureCompensationlocal = 100*qRound(qBound(100, value.toInt(), 800)/100.0); if (actualValue(param).toReal() != exposureCompensationlocal) { m_isoSensitivity = exposureCompensationlocal; emit actualValueChanged(param); } if (m_isoRanges.last().toInt() != m_res.last().toInt()) { m_isoRanges.clear(); m_isoRanges = m_res; emit parameterRangeChanged(param); } } break; case QCameraExposureControl::Aperture: { m_res.clear(); m_res << 12.0 << 18.0 << 20.0; qreal exposureCompensationlocal = qBound(2.8, value.toReal(), 16.0); if (actualValue(param).toReal() != exposureCompensationlocal) { m_aperture = exposureCompensationlocal; emit actualValueChanged(param); } if (m_apertureRanges.last().toReal() != m_res.last().toReal()) { m_apertureRanges.clear(); m_apertureRanges = m_res; emit parameterRangeChanged(param); } } break; case QCameraExposureControl::ShutterSpeed: { m_res.clear(); m_res << 0.12 << 1.0 << 2.0; qreal exposureCompensationlocal = qBound(0.001, value.toReal(), 1.0); if (actualValue(param).toReal() != exposureCompensationlocal) { m_shutterSpeed = exposureCompensationlocal; emit actualValueChanged(param); } if (m_shutterRanges.last().toReal() != m_res.last().toReal()) { m_shutterRanges.clear(); m_shutterRanges = m_res; emit parameterRangeChanged(param); } } break; case QCameraExposureControl::SpotMeteringPoint: { static QRectF valid(0, 0, 1, 1); if (valid.contains(value.toPointF())) { m_spot = value.toPointF(); emit actualValueChanged(param); return true; } return false; } default: return false; } return true; } private: qreal m_aperture; qreal m_shutterSpeed; int m_isoSensitivity; QCameraExposure::MeteringMode m_meteringMode; qreal m_exposureCompensation; QCameraExposure::ExposureMode m_exposureMode; QCameraExposure::FlashModes m_flashMode; QVariantList m_isoRanges,m_apertureRanges, m_shutterRanges, m_exposureRanges, m_res, m_exposureModes, m_meteringModes; QPointF m_spot; QMap m_requestedParameters; }; #endif // MOCKCAMERAEXPOSURECONTROL_H mockcameraflashcontrol.h000066400000000000000000000061621225012771600363730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERAFLASHCONTROL_H #define MOCKCAMERAFLASHCONTROL_H #include "qcameraflashcontrol.h" class MockCameraFlashControl : public QCameraFlashControl { Q_OBJECT public: MockCameraFlashControl(QObject *parent = 0): QCameraFlashControl(parent), m_flashMode(QCameraExposure::FlashAuto) { } ~MockCameraFlashControl() {} QCameraExposure::FlashModes flashMode() const { return m_flashMode; } void setFlashMode(QCameraExposure::FlashModes mode) { if (isFlashModeSupported(mode)) { m_flashMode = mode; } emit flashReady(true); } //Setting the values for Flash mode bool isFlashModeSupported(QCameraExposure::FlashModes mode) const { return (mode || (QCameraExposure::FlashAuto | QCameraExposure::FlashOff | QCameraExposure::FlashOn | QCameraExposure::FlashFill |QCameraExposure::FlashTorch |QCameraExposure::FlashSlowSyncFrontCurtain | QCameraExposure::FlashRedEyeReduction)); } bool isFlashReady() const { return true; } private: QCameraExposure::FlashModes m_flashMode; }; #endif // MOCKCAMERAFLASHCONTROL_H mockcamerafocuscontrol.h000066400000000000000000000104661225012771600364170ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERAFOCUSCONTROL_H #define MOCKCAMERAFOCUSCONTROL_H #include "qcamerafocuscontrol.h" #include "qcamerafocus.h" class MockCameraFocusControl : public QCameraFocusControl { Q_OBJECT public: MockCameraFocusControl(QObject *parent = 0): QCameraFocusControl(parent), m_focusMode(QCameraFocus::AutoFocus), m_focusPointMode(QCameraFocus::FocusPointAuto), m_focusPoint(0.5, 0.5) { m_zones << QCameraFocusZone(QRectF(0.45, 0.45, 0.1, 0.1)); } ~MockCameraFocusControl() {} QCameraFocus::FocusModes focusMode() const { return m_focusMode; } void setFocusMode(QCameraFocus::FocusModes mode) { if (isFocusModeSupported(mode)) m_focusMode = mode; } bool isFocusModeSupported(QCameraFocus::FocusModes mode) const { return mode == QCameraFocus::AutoFocus || mode == QCameraFocus::ContinuousFocus; } QCameraFocus::FocusPointMode focusPointMode() const { return m_focusPointMode; } void setFocusPointMode(QCameraFocus::FocusPointMode mode) { if (isFocusPointModeSupported(mode)) m_focusPointMode = mode; } bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const { switch (mode) { case QCameraFocus::FocusPointAuto: case QCameraFocus::FocusPointCenter: case QCameraFocus::FocusPointCustom: return true; default: return false; } } QPointF customFocusPoint() const { return m_focusPoint; } void setCustomFocusPoint(const QPointF &point) { m_focusPoint = point; focusZonesChange(0.50, 0.50, 0.3, 0.3); } QCameraFocusZoneList focusZones() const { return m_zones; } // helper function to emit Focus Zones Changed signals void focusZonesChange(qreal left, qreal top, qreal width, qreal height) { QCameraFocusZone myZone(QRectF(left, top, width, height)); if (m_zones.last().area() != myZone.area()) { m_zones.clear(); m_zones << myZone; emit focusZonesChanged(); } } private: QCameraFocus::FocusModes m_focusMode; QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_focusPoint; // to emit focus zone changed signal QCameraFocusZoneList m_zones; }; #endif // MOCKCAMERAFOCUSCONTROL_H mockcameraimagecapturecontrol.h000066400000000000000000000111051225012771600377350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERACAPTURECONTROL_H #define MOCKCAMERACAPTURECONTROL_H #include #include #include #include "qcameraimagecapturecontrol.h" #include "qcameracontrol.h" #include "mockcameracontrol.h" class MockCaptureControl : public QCameraImageCaptureControl { Q_OBJECT public: MockCaptureControl(MockCameraControl *cameraControl, QObject *parent = 0) : QCameraImageCaptureControl(parent), m_cameraControl(cameraControl), m_captureRequest(0), m_ready(true), m_captureCanceled(false) { } ~MockCaptureControl() { } QCameraImageCapture::DriveMode driveMode() const { return QCameraImageCapture::SingleImageCapture; } void setDriveMode(QCameraImageCapture::DriveMode) {} bool isReadyForCapture() const { return m_ready && m_cameraControl->state() == QCamera::ActiveState; } int capture(const QString &fileName) { if (isReadyForCapture()) { m_fileName = fileName; m_captureRequest++; emit readyForCaptureChanged(m_ready = false); QTimer::singleShot(5, this, SLOT(captured())); return m_captureRequest; } else { emit error(-1, QCameraImageCapture::NotReadyError, QLatin1String("Could not capture in stopped state")); } return -1; } void cancelCapture() { m_captureCanceled = true; } private Q_SLOTS: void captured() { if (!m_captureCanceled) { emit imageCaptured(m_captureRequest, QImage()); emit imageMetadataAvailable(m_captureRequest, QMediaMetaData::FocalLengthIn35mmFilm, QVariant(50)); emit imageMetadataAvailable(m_captureRequest, QMediaMetaData::DateTimeOriginal, QVariant(QDateTime::currentDateTime())); emit imageMetadataAvailable(m_captureRequest, QLatin1String("Answer to the Ultimate Question of Life, the Universe, and Everything"), QVariant(42)); } if (!m_ready) { emit readyForCaptureChanged(m_ready = true); emit imageExposed(m_captureRequest); } if (!m_captureCanceled) emit imageSaved(m_captureRequest, m_fileName); m_captureCanceled = false; } private: MockCameraControl *m_cameraControl; QString m_fileName; int m_captureRequest; bool m_ready; bool m_captureCanceled; }; #endif // MOCKCAMERACAPTURECONTROL_H mockcameraimageprocessingcontrol.h000066400000000000000000000126751225012771600404630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERAIMAGEPROCESSINGCONTROL_H #define MOCKCAMERAIMAGEPROCESSINGCONTROL_H #include "qcameraimageprocessingcontrol.h" class MockImageProcessingControl : public QCameraImageProcessingControl { Q_OBJECT public: MockImageProcessingControl(QObject *parent = 0) : QCameraImageProcessingControl(parent) { m_supportedWhiteBalance.insert(QCameraImageProcessing::WhiteBalanceAuto); } QCameraImageProcessing::WhiteBalanceMode whiteBalanceMode() const { return m_whiteBalanceMode; } void setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceMode mode) { m_whiteBalanceMode = mode; } bool isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceMode mode) const { return m_supportedWhiteBalance.contains(mode); } void setSupportedWhiteBalanceModes(QSet modes) { m_supportedWhiteBalance = modes; } bool isParameterSupported(ProcessingParameter parameter) const { switch (parameter) { case ContrastAdjustment: case BrightnessAdjustment: case SharpeningAdjustment: case SaturationAdjustment: case DenoisingAdjustment: case ColorTemperature: case WhiteBalancePreset: return true; default : return false; } } bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const { if (parameter != WhiteBalancePreset) return false; return m_supportedWhiteBalance.contains(value.value()); } QVariant parameter(ProcessingParameter parameter) const { switch (parameter) { case ContrastAdjustment: return m_contrast; case SaturationAdjustment: return m_saturation; case BrightnessAdjustment: return m_brightness; case SharpeningAdjustment: return m_sharpeningLevel; case DenoisingAdjustment: return m_denoising; case ColorTemperature: return m_manualWhiteBalance; case WhiteBalancePreset: return QVariant::fromValue(m_whiteBalanceMode); default: return QVariant(); } } void setParameter(ProcessingParameter parameter, const QVariant &value) { switch (parameter) { case ContrastAdjustment: m_contrast = value; break; case SaturationAdjustment: m_saturation = value; break; case BrightnessAdjustment: m_brightness = value; break; case SharpeningAdjustment: m_sharpeningLevel = value; break; case DenoisingAdjustment: m_denoising = value; break; case ColorTemperature: m_manualWhiteBalance = value; break; case WhiteBalancePreset: m_whiteBalanceMode = value.value(); break; default: break; } } private: QCameraImageProcessing::WhiteBalanceMode m_whiteBalanceMode; QSet m_supportedWhiteBalance; QVariant m_manualWhiteBalance; QVariant m_contrast; QVariant m_sharpeningLevel; QVariant m_saturation; QVariant m_brightness; QVariant m_denoising; }; #endif // MOCKCAMERAIMAGEPROCESSINGCONTROL_H mockcameralockscontrol.h000066400000000000000000000120151225012771600364030ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERALOCKCONTROL_H #define MOCKCAMERALOCKCONTROL_H #include #include "qcameralockscontrol.h" class MockCameraLocksControl : public QCameraLocksControl { Q_OBJECT public: MockCameraLocksControl(QObject *parent = 0): QCameraLocksControl(parent), m_focusLock(QCamera::Unlocked), m_exposureLock(QCamera::Unlocked) { } ~MockCameraLocksControl() {} QCamera::LockTypes supportedLocks() const { return QCamera::LockExposure | QCamera::LockFocus; } QCamera::LockStatus lockStatus(QCamera::LockType lock) const { switch (lock) { case QCamera::LockExposure: return m_exposureLock; case QCamera::LockFocus: return m_focusLock; default: return QCamera::Unlocked; } } void searchAndLock(QCamera::LockTypes locks) { if (locks & QCamera::LockExposure) { QCamera::LockStatus newStatus = locks & QCamera::LockFocus ? QCamera::Searching : QCamera::Locked; if (newStatus != m_exposureLock) emit lockStatusChanged(QCamera::LockExposure, m_exposureLock = newStatus, QCamera::UserRequest); } if (locks & QCamera::LockFocus) { emit lockStatusChanged(QCamera::LockFocus, m_focusLock = QCamera::Searching, QCamera::UserRequest); QTimer::singleShot(5, this, SLOT(focused())); } } void unlock(QCamera::LockTypes locks) { if (locks & QCamera::LockFocus && m_focusLock != QCamera::Unlocked) { emit lockStatusChanged(QCamera::LockFocus, m_focusLock = QCamera::Unlocked, QCamera::UserRequest); } if (locks & QCamera::LockExposure && m_exposureLock != QCamera::Unlocked) { emit lockStatusChanged(QCamera::LockExposure, m_exposureLock = QCamera::Unlocked, QCamera::UserRequest); } } /* helper method to emit the signal with LockChangeReason */ void setLockChangeReason (QCamera::LockChangeReason lockChangeReason) { emit lockStatusChanged(QCamera::NoLock, QCamera::Unlocked, lockChangeReason); } private slots: void focused() { if (m_focusLock == QCamera::Searching) { emit lockStatusChanged(QCamera::LockFocus, m_focusLock = QCamera::Locked, QCamera::UserRequest); } if (m_exposureLock == QCamera::Searching) { emit lockStatusChanged(QCamera::LockExposure, m_exposureLock = QCamera::Locked, QCamera::UserRequest); } } private: QCamera::LockStatus m_focusLock; QCamera::LockStatus m_exposureLock; }; #endif // MOCKCAMERALOCKCONTROL_H mockcameraservice.h000066400000000000000000000154301225012771600353330ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERASERVICE_H #define MOCKCAMERASERVICE_H #include "qmediaservice.h" #include "../qmultimedia_common/mockcameraflashcontrol.h" #include "../qmultimedia_common/mockcameralockscontrol.h" #include "../qmultimedia_common/mockcamerafocuscontrol.h" #include "../qmultimedia_common/mockcamerazoomcontrol.h" #include "../qmultimedia_common/mockcameraimageprocessingcontrol.h" #include "../qmultimedia_common/mockcameraimagecapturecontrol.h" #include "../qmultimedia_common/mockcameraexposurecontrol.h" #include "../qmultimedia_common/mockcameracapturedestinationcontrol.h" #include "../qmultimedia_common/mockcameracapturebuffercontrol.h" #include "../qmultimedia_common/mockimageencodercontrol.h" #include "../qmultimedia_common/mockcameracontrol.h" #include "../qmultimedia_common/mockvideosurface.h" #include "../qmultimedia_common/mockvideorenderercontrol.h" #include "../qmultimedia_common/mockvideowindowcontrol.h" class MockSimpleCameraService : public QMediaService { Q_OBJECT public: MockSimpleCameraService(): QMediaService(0) { mockControl = new MockCameraControl(this); } ~MockSimpleCameraService() { } QMediaControl* requestControl(const char *iid) { if (qstrcmp(iid, QCameraControl_iid) == 0) return mockControl; return 0; } void releaseControl(QMediaControl*) {} MockCameraControl *mockControl; }; class MockCameraService : public QMediaService { Q_OBJECT public: MockCameraService(): QMediaService(0) { mockControl = new MockCameraControl(this); mockLocksControl = new MockCameraLocksControl(this); mockExposureControl = new MockCameraExposureControl(this); mockFlashControl = new MockCameraFlashControl(this); mockFocusControl = new MockCameraFocusControl(this); mockZoomControl = new MockCameraZoomControl(this); mockCaptureControl = new MockCaptureControl(mockControl, this); mockCaptureBufferControl = new MockCaptureBufferFormatControl(this); mockCaptureDestinationControl = new MockCaptureDestinationControl(this); mockImageProcessingControl = new MockImageProcessingControl(this); mockImageEncoderControl = new MockImageEncoderControl(this); rendererControl = new MockVideoRendererControl(this); windowControl = new MockVideoWindowControl(this); rendererRef = 0; windowRef = 0; } ~MockCameraService() { } QMediaControl* requestControl(const char *iid) { if (qstrcmp(iid, QCameraControl_iid) == 0) return mockControl; if (qstrcmp(iid, QCameraLocksControl_iid) == 0) return mockLocksControl; if (qstrcmp(iid, QCameraExposureControl_iid) == 0) return mockExposureControl; if (qstrcmp(iid, QCameraFlashControl_iid) == 0) return mockFlashControl; if (qstrcmp(iid, QCameraFocusControl_iid) == 0) return mockFocusControl; if (qstrcmp(iid, QCameraZoomControl_iid) == 0) return mockZoomControl; if (qstrcmp(iid, QCameraImageCaptureControl_iid) == 0) return mockCaptureControl; if (qstrcmp(iid, QCameraCaptureBufferFormatControl_iid) == 0) return mockCaptureBufferControl; if (qstrcmp(iid, QCameraCaptureDestinationControl_iid) == 0) return mockCaptureDestinationControl; if (qstrcmp(iid, QCameraImageProcessingControl_iid) == 0) return mockImageProcessingControl; if (qstrcmp(iid, QImageEncoderControl_iid) == 0) return mockImageEncoderControl; if (qstrcmp(iid, QVideoRendererControl_iid) == 0) { if (rendererRef == 0) { rendererRef += 1; return rendererControl; } } if (qstrcmp(iid, QVideoWindowControl_iid) == 0) { if (windowRef == 0) { windowRef += 1; return windowControl; } } return 0; } void releaseControl(QMediaControl *control) { if (control == rendererControl) rendererRef -= 1; if (control == windowControl) windowRef -= 1; } MockCameraControl *mockControl; MockCameraLocksControl *mockLocksControl; MockCaptureControl *mockCaptureControl; MockCaptureBufferFormatControl *mockCaptureBufferControl; MockCaptureDestinationControl *mockCaptureDestinationControl; MockCameraExposureControl *mockExposureControl; MockCameraFlashControl *mockFlashControl; MockCameraFocusControl *mockFocusControl; MockCameraZoomControl *mockZoomControl; MockImageProcessingControl *mockImageProcessingControl; MockImageEncoderControl *mockImageEncoderControl; MockVideoRendererControl *rendererControl; MockVideoWindowControl *windowControl; int rendererRef; int windowRef; }; #endif // MOCKCAMERASERVICE_H mockcamerazoomcontrol.h000066400000000000000000000101641225012771600362570ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKCAMERAZOOMCONTROL_H #define MOCKCAMERAZOOMCONTROL_H #include "qcamerazoomcontrol.h" class MockCameraZoomControl : public QCameraZoomControl { Q_OBJECT public: MockCameraZoomControl(QObject *parent = 0): QCameraZoomControl(parent), m_opticalZoom(1.0), m_digitalZoom(1.0), m_maxOpticalZoom(3.0), m_maxDigitalZoom(4.0) { } ~MockCameraZoomControl() {} qreal maximumOpticalZoom() const { return m_maxOpticalZoom; } qreal maximumDigitalZoom() const { return m_maxDigitalZoom; } qreal currentOpticalZoom() const { return m_opticalZoom; } qreal currentDigitalZoom() const { return m_digitalZoom; } qreal requestedOpticalZoom() const { return m_opticalZoom; } qreal requestedDigitalZoom() const { return m_digitalZoom; } void zoomTo(qreal optical, qreal digital) { optical = qBound(1.0, optical, maximumOpticalZoom()); digital = qBound(1.0, digital, maximumDigitalZoom()); if (!qFuzzyCompare(digital, m_digitalZoom)) { m_digitalZoom = digital; emit requestedDigitalZoomChanged(m_digitalZoom); emit currentDigitalZoomChanged(m_digitalZoom); } if (!qFuzzyCompare(optical, m_opticalZoom)) { m_opticalZoom = optical; emit requestedOpticalZoomChanged(m_opticalZoom); emit currentOpticalZoomChanged(m_opticalZoom); } maxOpticalDigitalZoomChange(4.0, 5.0); } // helper function to emit maximum Optical and Digital Zoom Changed signals void maxOpticalDigitalZoomChange(qreal maxOptical, qreal maxDigital) { if (maxOptical != m_maxOpticalZoom) { m_maxOpticalZoom = maxOptical; emit maximumOpticalZoomChanged(m_maxOpticalZoom); } if (maxDigital != m_maxDigitalZoom) { m_maxDigitalZoom = maxDigital; emit maximumDigitalZoomChanged(m_maxDigitalZoom); } } private: qreal m_opticalZoom; qreal m_digitalZoom; qreal m_maxOpticalZoom; qreal m_maxDigitalZoom; }; #endif // MOCKCAMERAZOOMCONTROL_H mockcontainer.pri000066400000000000000000000003511225012771600350430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_commonINCLUDEPATH *= $$PWD \ ../../../src/multimedia \ HEADERS *= \ ../qmultimedia_common/mockmediacontainercontrol.h \ ../qmultimedia_common/mockmetadatawritercontrol.h \ ../qmultimedia_common/mockmetadatareadercontrol.h mockdecoder.pri000066400000000000000000000004411225012771600344660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common# Audio decoder related mock backend files INCLUDEPATH += $$PWD \ ../../../src/multimedia \ ../../../src/multimedia/audio \ ../../../src/multimedia/controls HEADERS *= \ ../qmultimedia_common/mockaudiodecoderservice.h \ ../qmultimedia_common/mockaudiodecodercontrol.h mockimageencodercontrol.h000066400000000000000000000074451225012771600365540ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKIMAGEENCODERCONTROL_H #define MOCKIMAGEENCODERCONTROL_H #include "qimageencodercontrol.h" class MockImageEncoderControl : public QImageEncoderControl { public: MockImageEncoderControl(QObject *parent = 0) : QImageEncoderControl(parent) { m_settings = QImageEncoderSettings(); } QList supportedResolutions(const QImageEncoderSettings & settings = QImageEncoderSettings(), bool *continuous = 0) const { if (continuous) *continuous = true; QList resolutions; if (settings.resolution().isValid()) { if (settings.resolution() == QSize(160,160) || settings.resolution() == QSize(320,240)) resolutions << settings.resolution(); if (settings.quality() == QMultimedia::HighQuality && settings.resolution() == QSize(640,480)) resolutions << settings.resolution(); } else { resolutions << QSize(160, 120); resolutions << QSize(320, 240); if (settings.quality() == QMultimedia::HighQuality) resolutions << QSize(640, 480); } return resolutions; } QStringList supportedImageCodecs() const { QStringList codecs; codecs << "PNG" << "JPEG"; return codecs; } QString imageCodecDescription(const QString &codecName) const { if (codecName == "PNG") return QString("Portable Network Graphic"); if (codecName == "JPEG") return QString("Joint Photographic Expert Group"); return QString(); } QImageEncoderSettings imageSettings() const { return m_settings; } void setImageSettings(const QImageEncoderSettings &settings) { m_settings = settings; } private: QImageEncoderSettings m_settings; }; #endif // MOCKIMAGEENCODERCONTROL_H mockmediacontainercontrol.h000066400000000000000000000063761225012771600371160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIACONTAINERCONTROL_H #define MOCKMEDIACONTAINERCONTROL_H #include #include "qmediacontainercontrol.h" #include #include #include QT_USE_NAMESPACE class MockMediaContainerControl : public QMediaContainerControl { Q_OBJECT public: MockMediaContainerControl(QObject *parent): QMediaContainerControl(parent) { m_supportedContainers.append("wav"); m_supportedContainers.append("mp3"); m_supportedContainers.append("mov"); m_descriptions.insert("wav", "WAV format"); m_descriptions.insert("mp3", "MP3 format"); m_descriptions.insert("mov", "MOV format"); } virtual ~MockMediaContainerControl() {}; QStringList supportedContainers() const { return m_supportedContainers; } QString containerFormat() const { return m_format; } void setContainerFormat(const QString &formatMimeType) { if (m_supportedContainers.contains(formatMimeType)) m_format = formatMimeType; } QString containerDescription(const QString &formatMimeType) const { return m_descriptions.value(formatMimeType); } private: QStringList m_supportedContainers; QMap m_descriptions; QString m_format; }; #endif // MOCKMEDIACONTAINERCONTROL_H mockmedianetworkaccesscontrol.h000066400000000000000000000057041225012771600400010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIANETWORKACCESSCONTROL_H #define MOCKMEDIANETWORKACCESSCONTROL_H #include "qmedianetworkaccesscontrol.h" #include "qnetworkconfiguration.h" class MockNetworkAccessControl : public QMediaNetworkAccessControl { friend class MockMediaPlayerService; public: MockNetworkAccessControl() {} ~MockNetworkAccessControl() {} void setConfigurations(const QList &configurations) { _configurations = configurations; _current = QNetworkConfiguration(); } QNetworkConfiguration currentConfiguration() const { return _current; } private: void setCurrentConfiguration(QNetworkConfiguration configuration) { if (_configurations.contains(configuration)) emit configurationChanged(_current = configuration); else emit configurationChanged(_current = QNetworkConfiguration()); } QList _configurations; QNetworkConfiguration _current; }; #endif // MOCKMEDIANETWORKACCESSCONTROL_H mockmediaobject.h000066400000000000000000000043211225012771600347650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIAOBJECT_H #define MOCKMEDIAOBJECT_H #include "qmediaobject.h" class MockMediaObject : public QMediaObject { Q_OBJECT public: MockMediaObject(QObject *parent, QMediaService *service): QMediaObject(parent, service) { } }; #endif // MOCKMEDIAOBJECT_H mockmediaplayercontrol.h000066400000000000000000000123601225012771600364160ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIAPLAYERCONTROL_H #define MOCKMEDIAPLAYERCONTROL_H #include "qmediaplayercontrol.h" class MockMediaPlayerControl : public QMediaPlayerControl { friend class MockMediaPlayerService; public: MockMediaPlayerControl() : QMediaPlayerControl(0) , _state(QMediaPlayer::StoppedState) , _mediaStatus(QMediaPlayer::NoMedia) , _error(QMediaPlayer::NoError) , _duration(0) , _position(0) , _volume(100) , _muted(false) , _bufferStatus(0) , _audioAvailable(false) , _videoAvailable(false) , _isSeekable(true) , _playbackRate(qreal(1.0)) , _stream(0) , _isValid(false) {} QMediaPlayer::State state() const { return _state; } QMediaPlayer::MediaStatus mediaStatus() const { return _mediaStatus; } qint64 duration() const { return _duration; } qint64 position() const { return _position; } void setPosition(qint64 position) { if (position != _position) emit positionChanged(_position = position); } int volume() const { return _volume; } void setVolume(int volume) { emit volumeChanged(_volume = volume); } bool isMuted() const { return _muted; } void setMuted(bool muted) { if (muted != _muted) emit mutedChanged(_muted = muted); } int bufferStatus() const { return _bufferStatus; } bool isAudioAvailable() const { return _audioAvailable; } bool isVideoAvailable() const { return _videoAvailable; } bool isSeekable() const { return _isSeekable; } QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(_seekRange.first, _seekRange.second); } void setSeekRange(qint64 minimum, qint64 maximum) { _seekRange = qMakePair(minimum, maximum); } qreal playbackRate() const { return _playbackRate; } void setPlaybackRate(qreal rate) { if (rate != _playbackRate) emit playbackRateChanged(_playbackRate = rate); } QMediaContent media() const { return _media; } void setMedia(const QMediaContent &content, QIODevice *stream) { _stream = stream; _media = content; if (_state != QMediaPlayer::StoppedState) { _mediaStatus = _media.isNull() ? QMediaPlayer::NoMedia : QMediaPlayer::LoadingMedia; emit stateChanged(_state = QMediaPlayer::StoppedState); emit mediaStatusChanged(_mediaStatus); } emit mediaChanged(_media = content); } QIODevice *mediaStream() const { return _stream; } void play() { if (_isValid && !_media.isNull() && _state != QMediaPlayer::PlayingState) emit stateChanged(_state = QMediaPlayer::PlayingState); } void pause() { if (_isValid && !_media.isNull() && _state != QMediaPlayer::PausedState) emit stateChanged(_state = QMediaPlayer::PausedState); } void stop() { if (_state != QMediaPlayer::StoppedState) emit stateChanged(_state = QMediaPlayer::StoppedState); } QMediaPlayer::State _state; QMediaPlayer::MediaStatus _mediaStatus; QMediaPlayer::Error _error; qint64 _duration; qint64 _position; int _volume; bool _muted; int _bufferStatus; bool _audioAvailable; bool _videoAvailable; bool _isSeekable; QPair _seekRange; qreal _playbackRate; QMediaContent _media; QIODevice *_stream; bool _isValid; QString _errorString; }; #endif // MOCKMEDIAPLAYERCONTROL_H mockmediaplayerservice.h000066400000000000000000000154131225012771600364000ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKPLAYERSERVICE_H #define MOCKPLAYERSERVICE_H #include "qmediaservice.h" #include "mockmediaplayercontrol.h" #include "mockmediastreamscontrol.h" #include "mockmedianetworkaccesscontrol.h" #include "mockvideorenderercontrol.h" #include "mockvideoprobecontrol.h" #include "mockvideowindowcontrol.h" class MockMediaPlayerService : public QMediaService { Q_OBJECT public: MockMediaPlayerService():QMediaService(0) { mockControl = new MockMediaPlayerControl; mockStreamsControl = new MockStreamsControl; mockNetworkControl = new MockNetworkAccessControl; rendererControl = new MockVideoRendererControl; rendererRef = 0; mockVideoProbeControl = new MockVideoProbeControl; windowControl = new MockVideoWindowControl; windowRef = 0; } ~MockMediaPlayerService() { delete mockControl; delete mockStreamsControl; delete mockNetworkControl; delete rendererControl; delete mockVideoProbeControl; delete windowControl; } QMediaControl* requestControl(const char *iid) { if (qstrcmp(iid, QMediaPlayerControl_iid) == 0) { return mockControl; } else if (qstrcmp(iid, QVideoRendererControl_iid) == 0) { if (rendererRef == 0) { rendererRef += 1; return rendererControl; } } else if (qstrcmp(iid, QMediaVideoProbeControl_iid) == 0) { return mockVideoProbeControl; } if (qstrcmp(iid, QVideoWindowControl_iid) == 0) { if (windowRef == 0) { windowRef += 1; return windowControl; } } if (qstrcmp(iid, QMediaNetworkAccessControl_iid) == 0) return mockNetworkControl; return 0; } void releaseControl(QMediaControl *control) { if (control == rendererControl) rendererRef -= 1; if (control == windowControl) windowRef -= 1; } void setState(QMediaPlayer::State state) { emit mockControl->stateChanged(mockControl->_state = state); } void setState(QMediaPlayer::State state, QMediaPlayer::MediaStatus status) { mockControl->_state = state; mockControl->_mediaStatus = status; emit mockControl->mediaStatusChanged(status); emit mockControl->stateChanged(state); } void setMediaStatus(QMediaPlayer::MediaStatus status) { emit mockControl->mediaStatusChanged(mockControl->_mediaStatus = status); } void setIsValid(bool isValid) { mockControl->_isValid = isValid; } void setMedia(QMediaContent media) { mockControl->_media = media; } void setDuration(qint64 duration) { mockControl->_duration = duration; } void setPosition(qint64 position) { mockControl->_position = position; } void setSeekable(bool seekable) { mockControl->_isSeekable = seekable; } void setVolume(int volume) { mockControl->_volume = volume; } void setMuted(bool muted) { mockControl->_muted = muted; } void setVideoAvailable(bool videoAvailable) { mockControl->_videoAvailable = videoAvailable; } void setBufferStatus(int bufferStatus) { mockControl->_bufferStatus = bufferStatus; } void setPlaybackRate(qreal playbackRate) { mockControl->_playbackRate = playbackRate; } void setError(QMediaPlayer::Error error) { mockControl->_error = error; emit mockControl->error(mockControl->_error, mockControl->_errorString); } void setErrorString(QString errorString) { mockControl->_errorString = errorString; emit mockControl->error(mockControl->_error, mockControl->_errorString); } void selectCurrentConfiguration(QNetworkConfiguration config) { mockNetworkControl->setCurrentConfiguration(config); } void reset() { mockControl->_state = QMediaPlayer::StoppedState; mockControl->_mediaStatus = QMediaPlayer::UnknownMediaStatus; mockControl->_error = QMediaPlayer::NoError; mockControl->_duration = 0; mockControl->_position = 0; mockControl->_volume = 0; mockControl->_muted = false; mockControl->_bufferStatus = 0; mockControl->_videoAvailable = false; mockControl->_isSeekable = false; mockControl->_playbackRate = 0.0; mockControl->_media = QMediaContent(); mockControl->_stream = 0; mockControl->_isValid = false; mockControl->_errorString = QString(); mockNetworkControl->_current = QNetworkConfiguration(); mockNetworkControl->_configurations = QList(); } MockMediaPlayerControl *mockControl; MockStreamsControl *mockStreamsControl; MockNetworkAccessControl *mockNetworkControl; MockVideoRendererControl *rendererControl; MockVideoProbeControl *mockVideoProbeControl; MockVideoWindowControl *windowControl; int windowRef; int rendererRef; }; #endif // MOCKPLAYERSERVICE_H mockmediaplaylistcontrol.h000066400000000000000000000101341225012771600367600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIAPLAYLISTCONTROL_H #define MOCKMEDIAPLAYLISTCONTROL_H #include #include #include "mockreadonlyplaylistprovider.h" // Hmm, read only. class MockMediaPlaylistControl : public QMediaPlaylistControl { Q_OBJECT public: MockMediaPlaylistControl(QObject *parent) : QMediaPlaylistControl(parent) { m_navigator = new QMediaPlaylistNavigator(new MockReadOnlyPlaylistProvider(this), this); } ~MockMediaPlaylistControl() { } QMediaPlaylistProvider* playlistProvider() const { return m_navigator->playlist(); } bool setPlaylistProvider(QMediaPlaylistProvider *newProvider) { bool bMediaContentChanged = false; int i = 0; for (; i < playlistProvider()->mediaCount(); i++) { if (playlistProvider()->media(i).canonicalUrl().toString() != newProvider->media(i).canonicalUrl().toString()) { bMediaContentChanged = true; break; } } if (playlistProvider()->mediaCount() != newProvider->mediaCount() || bMediaContentChanged ) { emit playlistProviderChanged(); emit currentMediaChanged(newProvider->media(i)); } m_navigator->setPlaylist(newProvider); return true; } int currentIndex() const { return m_navigator->currentIndex(); } void setCurrentIndex(int position) { if (position != currentIndex()) emit currentIndexChanged(position); m_navigator->jump(position); } int nextIndex(int steps) const { return m_navigator->nextIndex(steps); } int previousIndex(int steps) const { return m_navigator->previousIndex(steps); } void next() { m_navigator->next(); } void previous() { m_navigator->previous(); } QMediaPlaylist::PlaybackMode playbackMode() const { return m_navigator->playbackMode(); } void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { if (playbackMode() != mode) emit playbackModeChanged(mode); m_navigator->setPlaybackMode(mode); } private: QMediaPlaylistNavigator *m_navigator; }; #endif // MOCKMEDIAPLAYLISTCONTROL_H mockmediaplaylistsourcecontrol.h000066400000000000000000000050771225012771600402130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIAPLAYLISTSOURCECONTROL_H #define MOCKMEDIAPLAYLISTSOURCECONTROL_H #include class MockPlaylistSourceControl : public QMediaPlaylistSourceControl { Q_OBJECT public: MockPlaylistSourceControl(QObject *parent) : QMediaPlaylistSourceControl(parent), m_playlist(0) { } ~MockPlaylistSourceControl() { } void setPlaylist(QMediaPlaylist *playlist) { m_playlist = playlist; } QMediaPlaylist *playlist() const { return m_playlist; } private: QMediaPlaylist *m_playlist; }; #endif // MOCKMEDIAPLAYLISTSOURCECONTROL_H mockmediarecordercontrol.h000066400000000000000000000113031225012771600367230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKRECORDERCONTROL_H #define MOCKRECORDERCONTROL_H #include #include "qmediarecordercontrol.h" class MockMediaRecorderControl : public QMediaRecorderControl { Q_OBJECT public: MockMediaRecorderControl(QObject *parent = 0): QMediaRecorderControl(parent), m_state(QMediaRecorder::StoppedState), m_status(QMediaRecorder::LoadedStatus), m_position(0), m_muted(false), m_volume(1.0), m_settingAppliedCount(0) { } QUrl outputLocation() const { return m_sink; } bool setOutputLocation(const QUrl &sink) { m_sink = sink; return true; } QMediaRecorder::State state() const { return m_state; } QMediaRecorder::Status status() const { return m_status; } qint64 duration() const { return m_position; } bool isMuted() const { return m_muted; } qreal volume() const { return m_volume; } void applySettings() { m_settingAppliedCount++; } using QMediaRecorderControl::error; public slots: void record() { m_state = QMediaRecorder::RecordingState; m_status = QMediaRecorder::RecordingStatus; m_position=1; emit stateChanged(m_state); emit statusChanged(m_status); emit durationChanged(m_position); QUrl actualLocation = m_sink.isEmpty() ? QUrl::fromLocalFile("default_name.mp4") : m_sink; emit actualLocationChanged(actualLocation); } void pause() { m_state = QMediaRecorder::PausedState; m_status = QMediaRecorder::PausedStatus; emit stateChanged(m_state); emit statusChanged(m_status); } void stop() { m_position=0; m_state = QMediaRecorder::StoppedState; m_status = QMediaRecorder::LoadedStatus; emit stateChanged(m_state); emit statusChanged(m_status); } void setState(QMediaRecorder::State state) { switch (state) { case QMediaRecorder::StoppedState: stop(); break; case QMediaRecorder::PausedState: pause(); break; case QMediaRecorder::RecordingState: record(); break; } } void setMuted(bool muted) { if (m_muted != muted) emit mutedChanged(m_muted = muted); } void setVolume(qreal volume) { if (!qFuzzyCompare(m_volume, volume)) emit volumeChanged(m_volume = volume); } public: QUrl m_sink; QMediaRecorder::State m_state; QMediaRecorder::Status m_status; qint64 m_position; bool m_muted; qreal m_volume; int m_settingAppliedCount; }; #endif // MOCKRECORDERCONTROL_H mockmediarecorderservice.h000066400000000000000000000110351225012771600367050ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKSERVICE_H #define MOCKSERVICE_H #include "qmediaservice.h" #include "mockaudioencodercontrol.h" #include "mockmediarecordercontrol.h" #include "mockvideoencodercontrol.h" #include "mockaudioinputselector.h" #include "mockmediacontainercontrol.h" #include "mockmetadatawritercontrol.h" #include "mockavailabilitycontrol.h" #include "mockaudioprobecontrol.h" class MockMediaRecorderService : public QMediaService { Q_OBJECT public: MockMediaRecorderService(QObject *parent = 0, QMediaControl *control = 0, MockAvailabilityControl *availability = 0): QMediaService(parent), mockControl(control), mockAvailabilityControl(availability), hasControls(true) { mockAudioInputSelector = new MockAudioInputSelector(this); mockAudioEncoderControl = new MockAudioEncoderControl(this); mockFormatControl = new MockMediaContainerControl(this); mockVideoEncoderControl = new MockVideoEncoderControl(this); mockMetaDataControl = new MockMetaDataWriterControl(this); mockAudioProbeControl = new MockAudioProbeControl(this); } QMediaControl* requestControl(const char *name) { if (hasControls && qstrcmp(name,QAudioEncoderSettingsControl_iid) == 0) return mockAudioEncoderControl; if (hasControls && qstrcmp(name,QAudioInputSelectorControl_iid) == 0) return mockAudioInputSelector; if (hasControls && qstrcmp(name,QMediaRecorderControl_iid) == 0) return mockControl; if (hasControls && qstrcmp(name,QMediaContainerControl_iid) == 0) return mockFormatControl; if (hasControls && qstrcmp(name,QVideoEncoderSettingsControl_iid) == 0) return mockVideoEncoderControl; if (hasControls && qstrcmp(name, QMetaDataWriterControl_iid) == 0) return mockMetaDataControl; if (hasControls && qstrcmp(name, QMediaAvailabilityControl_iid) == 0) return mockAvailabilityControl; if (hasControls && qstrcmp(name, QMediaAudioProbeControl_iid) == 0) return mockAudioProbeControl; return 0; } void releaseControl(QMediaControl*) { } QMediaControl *mockControl; QAudioInputSelectorControl *mockAudioInputSelector; QAudioEncoderSettingsControl *mockAudioEncoderControl; QMediaContainerControl *mockFormatControl; QVideoEncoderSettingsControl *mockVideoEncoderControl; MockMetaDataWriterControl *mockMetaDataControl; MockAvailabilityControl *mockAvailabilityControl; MockAudioProbeControl *mockAudioProbeControl; bool hasControls; }; #endif // MOCKSERVICE_H mockmediaservice.h000066400000000000000000000053761225012771600351720ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIASERVICE_H #define MOCKMEDIASERVICE_H #include "qmediaservice.h" #include Q_DECLARE_METATYPE(QMediaControl *) class MockMediaService : public QMediaService { Q_OBJECT public: MockMediaService(QObject *parent, QMediaControl *control): QMediaService(parent), mockControl(control) {} MockMediaService(QObject *parent, QMap controls): QMediaService(parent), mockControl(0), mockControls(controls) {} QMediaControl* requestControl(const char *key) { if (mockControl) return mockControl; else return mockControls.value(key); } void releaseControl(QMediaControl*) {} QMediaControl *mockControl; QMap mockControls; }; #endif // MOCKMEDIASERVICE_H mockmediaserviceprovider.h000066400000000000000000000053051225012771600367350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIASERVICEPROVIDER_H #define MOCKMEDIASERVICEPROVIDER_H #include "private/qmediaserviceprovider_p.h" #include "qmediaservice.h" // Simple provider that lets you set the service class MockMediaServiceProvider : public QMediaServiceProvider { public: MockMediaServiceProvider(QMediaService* s = 0, bool del=false) : service(s), deleteServiceOnRelease(del) { } QMediaService *requestService(const QByteArray &, const QMediaServiceProviderHint &) { return service; } void releaseService(QMediaService *service) { if (deleteServiceOnRelease) { delete service; this->service = 0; } } QMediaService *service; bool deleteServiceOnRelease; }; #endif // MOCKMEDIASERVICEPROVIDER_H mockmediastreamscontrol.h000066400000000000000000000060761225012771600366070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMEDIASTREAMSCONTROL_H #define MOCKMEDIASTREAMSCONTROL_H #include "qmediastreamscontrol.h" class MockStreamsControl : public QMediaStreamsControl { public: MockStreamsControl(QObject *parent = 0) : QMediaStreamsControl(parent) {} int streamCount() { return _streams.count(); } void setStreamCount(int count) { _streams.resize(count); } StreamType streamType(int index) { return _streams.at(index).type; } void setStreamType(int index, StreamType type) { _streams[index].type = type; } QVariant metaData(int index, const QString &key) { return _streams.at(index).metaData.value(key); } void setMetaData(int index, const QString &key, const QVariant &value) { _streams[index].metaData.insert(key, value); } bool isActive(int index) { return _streams.at(index).active; } void setActive(int index, bool state) { _streams[index].active = state; } private: struct Stream { Stream() : type(UnknownStream), active(false) {} StreamType type; QMap metaData; bool active; }; QVector _streams; }; #endif // MOCKMEDIASTREAMSCONTROL_H mockmetadatareadercontrol.h000066400000000000000000000063031225012771600370650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMETADATAREADERCONTROL_H #define MOCKMETADATAREADERCONTROL_H #include "qmetadatareadercontrol.h" class MockMetaDataReaderControl : public QMetaDataReaderControl { Q_OBJECT public: MockMetaDataReaderControl(QObject *parent = 0) : QMetaDataReaderControl(parent) , m_available(false) { } bool isMetaDataAvailable() const { return m_available; } void setMetaDataAvailable(bool available) { if (m_available != available) emit metaDataAvailableChanged(m_available = available); } QStringList availableMetaData() const { return m_data.keys(); } QVariant metaData(const QString &key) const { return m_data.value(key); } void setMetaData(const QString &key, const QVariant &value) { if (m_data[key] != value) { if (value.isNull()) m_data.remove(key); else m_data[key] = value; emit metaDataChanged(key, value); emit metaDataChanged(); } } using QMetaDataReaderControl::metaDataChanged; void populateMetaData() { m_available = true; } bool m_available; QMap m_data; }; #endif // MOCKMETADATAREADERCONTROL_H mockmetadatawritercontrol.h000066400000000000000000000070711225012771600371420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKMETADATAWRITERCONTROL_H #define MOCKMETADATAWRITERCONTROL_H #include #include #include "qmetadatawritercontrol.h" class MockMetaDataWriterControl : public QMetaDataWriterControl { Q_OBJECT public: MockMetaDataWriterControl(QObject *parent = 0) : QMetaDataWriterControl(parent) , m_available(false) , m_writable(false) { } bool isMetaDataAvailable() const { return m_available; } void setMetaDataAvailable(bool available) { if (m_available != available) emit metaDataAvailableChanged(m_available = available); } QStringList availableMetaData() const { return m_data.keys(); } bool isWritable() const { return m_writable; } void setWritable(bool writable) { emit writableChanged(m_writable = writable); } QVariant metaData(const QString &key) const { return m_data.value(key); }//Getting the metadata from Multimediakit void setMetaData(const QString &key, const QVariant &value) { if (m_data[key] != value) { if (value.isNull()) m_data.remove(key); else m_data[key] = value; emit metaDataChanged(key, value); emit metaDataChanged(); } } using QMetaDataWriterControl::metaDataChanged; void populateMetaData() { m_available = true; } void setWritable() { emit writableChanged(true); } void setMetaDataAvailable() { emit metaDataAvailableChanged(true); } bool m_available; bool m_writable; QMap m_data; }; #endif // MOCKMETADATAWRITERCONTROL_H mockplayer.pri000066400000000000000000000006611225012771600343610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_commonINCLUDEPATH *= $$PWD \ ../../../src/multimedia \ ../../../src/multimedia/audio \ ../../../src/multimedia/video \ HEADERS *= \ ../qmultimedia_common/mockmediaplayerservice.h \ ../qmultimedia_common/mockmediaplayercontrol.h \ ../qmultimedia_common/mockmediastreamscontrol.h \ ../qmultimedia_common/mockmedianetworkaccesscontrol.h \ ../qmultimedia_common/mockvideoprobecontrol.h include(mockvideo.pri) mockplaylist.pri000066400000000000000000000004421225012771600347230ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_commonINCLUDEPATH *= $$PWD \ ../../../src/multimedia \ HEADERS *= \ ../qmultimedia_common/mockmediaplaylistsourcecontrol.h \ ../qmultimedia_common/mockmediaplaylistcontrol.h \ ../qmultimedia_common/mockreadonlyplaylistprovider.h \ ../qmultimedia_common/mockplaylistservice.h mockplaylistservice.h000066400000000000000000000051021225012771600357370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKPLAYLISTSERVICE_H #define MOCKPLAYLISTSERVICE_H #include "qmediaservice.h" #include "mockmediaplaylistcontrol.h" class MockPlaylistService : public QMediaService { Q_OBJECT public: MockPlaylistService():QMediaService(0) { mockControl = new MockMediaPlaylistControl(this); } ~MockPlaylistService() { } QMediaControl* requestControl(const char *iid) { if (qstrcmp(iid, QMediaPlaylistControl_iid) == 0) return mockControl; return 0; } void releaseControl(QMediaControl *) { } MockMediaPlaylistControl *mockControl; }; #endif // MOCKPLAYLISTSERVICE_H mockradio.pri000066400000000000000000000002511225012771600341560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common # Radio related mock backend files INCLUDEPATH += . HEADERS += \ ../qmultimedia_common/mockradiotunercontrol.h \ ../qmultimedia_common/mockradiodatacontrol.h mockradiodatacontrol.h000066400000000000000000000100131225012771600360430ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKRADIODATACONTROL_H #define MOCKRADIODATACONTROL_H #include "qradiodatacontrol.h" class MockRadioDataControl : public QRadioDataControl { Q_OBJECT public: MockRadioDataControl(QObject *parent): QRadioDataControl(parent), m_err(QRadioData::NoError), m_errstr("") { } using QRadioDataControl::error; QRadioData::Error error() const { return m_err; } QString errorString() const { return m_errstr; } QString stationId() const { return m_stationId; } QRadioData::ProgramType programType() const { return m_programType; } QString programTypeName() const { return m_programTypeName; } QString stationName() const { return m_stationName; } QString radioText() const { return m_radioText; } void setAlternativeFrequenciesEnabled(bool enabled) { m_alternativeFrequenciesEnabled = enabled; emit alternativeFrequenciesEnabledChanged(m_alternativeFrequenciesEnabled); } bool isAlternativeFrequenciesEnabled() const { return m_alternativeFrequenciesEnabled; } void forceRT( QString text ) { m_radioText = text; emit radioTextChanged(m_radioText); } void forceProgramType( int pty ) { m_programType = static_cast(pty); emit programTypeChanged(m_programType); } void forcePTYN( QString ptyn ) { m_programTypeName = ptyn; emit programTypeNameChanged(m_programTypeName); } void forcePI( QString pi ) { m_stationId = pi; emit stationIdChanged(m_stationId); } void forcePS( QString ps ) { m_stationName = ps; emit stationNameChanged(m_stationName); } public: QString m_radioText; QRadioData::ProgramType m_programType; QString m_programTypeName; QString m_stationId; QString m_stationName; bool m_alternativeFrequenciesEnabled; QRadioData::Error m_err; QString m_errstr; }; #endif // MOCKRADIODATACONTROL_H mockradiotunercontrol.h000066400000000000000000000152051225012771600362770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKRADIOTUNERCONTROL_H #define MOCKRADIOTUNERCONTROL_H #include "qradiotunercontrol.h" class MockRadioTunerControl : public QRadioTunerControl { Q_OBJECT public: MockRadioTunerControl(QObject *parent): QRadioTunerControl(parent), m_active(false), m_searching(false),m_muted(false),m_stereo(true), m_volume(100),m_signal(0),m_frequency(0), m_band(QRadioTuner::FM),m_err(QRadioTuner::NoError), m_errstr("") { } using QRadioTunerControl::error; QRadioTuner::State state() const { return m_active ? QRadioTuner::ActiveState : QRadioTuner::StoppedState; } QRadioTuner::Band band() const { return m_band; } void setBand(QRadioTuner::Band b) { if (b == QRadioTuner::FM2 || b == QRadioTuner::LW) { m_err = QRadioTuner::OutOfRangeError; m_errstr.clear(); m_errstr = QString("band and range not supported"); } else { m_err = QRadioTuner::NoError; m_errstr.clear(); m_band = b; emit bandChanged(m_band); } emit error(m_err); } bool isBandSupported(QRadioTuner::Band b) const { if (b == QRadioTuner::FM || b == QRadioTuner::AM) return true; return false; } int frequency() const { return m_frequency; } QPair frequencyRange(QRadioTuner::Band) const { return qMakePair(1,2); } int frequencyStep(QRadioTuner::Band) const { return 1; } void setFrequency(int frequency) { if (frequency >= 148500000) { m_err = QRadioTuner::OutOfRangeError; m_errstr.clear(); m_errstr = QString("band and range not supported"); } else { m_err = QRadioTuner::NoError; m_errstr.clear(); m_frequency = frequency; emit frequencyChanged(m_frequency); } emit error(m_err); } bool isStereo() const { return m_stereo; } void setStereo(bool stereo) { emit stereoStatusChanged(m_stereo = stereo); } QRadioTuner::StereoMode stereoMode() const { return m_stereoMode; } void setStereoMode(QRadioTuner::StereoMode mode) { m_stereoMode = mode; } QRadioTuner::Error error() const { return m_err; } QString errorString() const { return m_errstr; } int signalStrength() const { return m_signal; } int volume() const { return m_volume; } void setVolume(int volume) { m_volume = volume; emit volumeChanged(m_volume); } bool isMuted() const { return m_muted; } void setMuted(bool muted) { m_muted = muted; emit mutedChanged(m_muted); } bool isSearching() const { return m_searching; } void searchForward() { m_searching = true; emit searchingChanged(m_searching); } void searchBackward() { m_searching = true; emit searchingChanged(m_searching); } void cancelSearch() { m_searching = false; emit searchingChanged(m_searching); } void findNewStation( int frequency, QString stationId ) { setFrequency(frequency); emit stationFound( frequency, stationId ); } void searchAllStations(QRadioTuner::SearchMode searchMode = QRadioTuner::SearchFast) { QString programmeIdentifiers[3] = { "", "", "" }; if ( searchMode == QRadioTuner::SearchGetStationId ) { programmeIdentifiers[0] = QString("MockProgramPI1"); programmeIdentifiers[1] = QString("MockProgramPI2"); programmeIdentifiers[2] = QString("MockProgramPI3"); } m_searching = true; emit searchingChanged(m_searching); findNewStation(88300000, programmeIdentifiers[0]); findNewStation(95100000, programmeIdentifiers[1]); findNewStation(103100000, programmeIdentifiers[2]); m_searching = false; emit searchingChanged(m_searching); } void start() { if (!m_active) { m_active = true; emit stateChanged(state()); } } void stop() { if (m_active) { m_active = false; emit stateChanged(state()); } } public: bool m_active; bool m_searching; bool m_muted; bool m_stereo; int m_volume; int m_signal; int m_frequency; QRadioTuner::StereoMode m_stereoMode; QRadioTuner::Band m_band; QRadioTuner::Error m_err; QString m_errstr; }; #endif // MOCKRADIOTUNERCONTROL_H mockreadonlyplaylistprovider.h000066400000000000000000000053441225012771600376770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKREADONLYPLAYLISTPROVIDER_H #define MOCKREADONLYPLAYLISTPROVIDER_H #include class MockReadOnlyPlaylistProvider : public QMediaPlaylistProvider { Q_OBJECT public: MockReadOnlyPlaylistProvider(QObject *parent) :QMediaPlaylistProvider(parent) { m_items.append(QMediaContent(QUrl(QLatin1String("file:///1")))); m_items.append(QMediaContent(QUrl(QLatin1String("file:///2")))); m_items.append(QMediaContent(QUrl(QLatin1String("file:///3")))); } int mediaCount() const { return m_items.size(); } QMediaContent media(int index) const { return index >=0 && index < mediaCount() ? m_items.at(index) : QMediaContent(); } private: QList m_items; }; #endif // MOCKREADONLYPLAYLISTPROVIDER_H mockrecorder.pri000066400000000000000000000010311225012771600346620ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_commonINCLUDEPATH *= $$PWD \ ../../../src/multimedia \ ../../../src/multimedia/audio \ ../../../src/multimedia/video \ HEADERS *= \ ../qmultimedia_common/mockmediarecorderservice.h \ ../qmultimedia_common/mockmediarecordercontrol.h \ ../qmultimedia_common/mockvideoencodercontrol.h \ ../qmultimedia_common/mockaudioencodercontrol.h \ ../qmultimedia_common/mockaudioinputselector.h \ ../qmultimedia_common/mockaudioprobecontrol.h \ # We also need all the container/metadata bits include(mockcontainer.pri) mockvideo.pri000066400000000000000000000004421225012771600341700ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common# video related mock backend files INCLUDEPATH += $$PWD \ ../../../src/multimedia \ ../../../src/multimedia/video HEADERS *= \ ../qmultimedia_common/mockvideosurface.h \ ../qmultimedia_common/mockvideorenderercontrol.h \ ../qmultimedia_common/mockvideowindowcontrol.h mockvideoencodercontrol.h000066400000000000000000000066341225012771600365770ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKVIDEOENCODERCONTROL_H #define MOCKVIDEOENCODERCONTROL_H #include "qvideoencodersettingscontrol.h" class MockVideoEncoderControl : public QVideoEncoderSettingsControl { Q_OBJECT public: MockVideoEncoderControl(QObject *parent): QVideoEncoderSettingsControl(parent) { m_videoCodecs << "video/3gpp" << "video/H264"; m_sizes << QSize(320,240) << QSize(640,480); m_framerates << 30 << 15 << 1; } ~MockVideoEncoderControl() {} QVideoEncoderSettings videoSettings() const { return m_videoSettings; } void setVideoSettings(const QVideoEncoderSettings &settings) { m_videoSettings = settings; }; QList supportedResolutions(const QVideoEncoderSettings & = QVideoEncoderSettings(), bool *continuous = 0) const { if (continuous) *continuous = true; return m_sizes; } QList supportedFrameRates(const QVideoEncoderSettings & = QVideoEncoderSettings(), bool *continuous = 0) const { if (continuous) *continuous = false; return m_framerates; } QStringList supportedVideoCodecs() const { return m_videoCodecs; } QString videoCodecDescription(const QString &codecName) const { return codecName; } private: QVideoEncoderSettings m_videoSettings; QStringList m_videoCodecs; QList m_sizes; QList m_framerates; }; #endif // MOCKVIDEOENCODERCONTROL_H mockvideoprobecontrol.h000066400000000000000000000044361225012771600362650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKVIDEOPROBECONTROL_H #define MOCKVIDEOPROBECONTROL_H #include "qmediavideoprobecontrol.h" class MockVideoProbeControl : public QMediaVideoProbeControl { Q_OBJECT public: MockVideoProbeControl(QObject *parent = 0): QMediaVideoProbeControl(parent) { } ~MockVideoProbeControl() {} private: }; #endif // MOCKVIDEOPROBECONTROL_H mockvideorenderercontrol.h000066400000000000000000000046431225012771600367640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKVIDEORENDERERCONTROL_H #define MOCKVIDEORENDERERCONTROL_H #include "qvideorenderercontrol.h" class MockVideoRendererControl : public QVideoRendererControl { public: MockVideoRendererControl(QObject *parent = 0) : QVideoRendererControl(parent), m_surface(0) {} QAbstractVideoSurface *surface() const { return m_surface; } void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } QAbstractVideoSurface *m_surface; }; #endif // MOCKVIDEORENDERERCONTROL_H mockvideosurface.h000066400000000000000000000045611225012771600352040ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKVIDEOSURFACE_H #define MOCKVIDEOSURFACE_H #include "qabstractvideosurface.h" class MockVideoSurface : public QAbstractVideoSurface { public: QList supportedPixelFormats( QAbstractVideoBuffer::HandleType = QAbstractVideoBuffer::NoHandle) const { return QList(); } bool present(const QVideoFrame &) { return false; } }; #endif // MOCKVIDEOSURFACE_H mockvideowindowcontrol.h000066400000000000000000000056221225012771600364630ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qmultimedia_common/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MOCKVIDEOWINDOWCONTROL_H #define MOCKVIDEOWINDOWCONTROL_H #include "qvideowindowcontrol.h" class MockVideoWindowControl : public QVideoWindowControl { public: MockVideoWindowControl(QObject *parent = 0) : QVideoWindowControl(parent) {} WId winId() const { return 0; } void setWinId(WId) {} QRect displayRect() const { return QRect(); } void setDisplayRect(const QRect &) {} bool isFullScreen() const { return false; } void setFullScreen(bool) {} void repaint() {} QSize nativeSize() const { return QSize(); } Qt::AspectRatioMode aspectRatioMode() const { return Qt::KeepAspectRatio; } void setAspectRatioMode(Qt::AspectRatioMode) {} int brightness() const { return 0; } void setBrightness(int) {} int contrast() const { return 0; } void setContrast(int) {} int hue() const { return 0; } void setHue(int) {} int saturation() const { return 0; } void setSaturation(int) {} }; #endif // MOCKVIDEOWINDOWCONTROL_H qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qpaintervideosurface/000077500000000000000000000000001225012771600321135ustar00rootroot00000000000000qpaintervideosurface.pro000066400000000000000000000007261225012771600370060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qpaintervideosurfaceCONFIG += testcase TARGET = tst_qpaintervideosurface QT += multimedia-private multimediawidgets-private testlib qtHaveModule(opengl) { QT += opengl } else { DEFINES += QT_NO_OPENGL } SOURCES += tst_qpaintervideosurface.cpp QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = precise ]"):DEFINES+=UBUNTU_PRECISE_PANGOLIN win32:contains(QT_CONFIG, angle): CONFIG += insignificant_test # QTBUG-28542 tst_qpaintervideosurface.cpp000066400000000000000000001202621225012771600376600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qpaintervideosurface/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) #include #include #endif QT_USE_NAMESPACE class tst_QPainterVideoSurface : public QObject { Q_OBJECT private slots: void cleanup() {} void cleanupTestCase() {} void colors(); void supportedFormat_data(); void supportedFormat(); void present_data(); void present(); void presentOpaqueFrame(); #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) void shaderType(); void shaderTypeStarted_data(); void shaderTypeStarted(); void shaderSupportedFormat_data(); void shaderSupportedFormat(); void shaderPresent_data(); void shaderPresent(); void shaderPresentOpaqueFrame_data(); void shaderPresentOpaqueFrame(); void shaderPresentGLFrame_data(); void shaderPresentGLFrame(); #endif }; Q_DECLARE_METATYPE(const uchar *) #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) Q_DECLARE_METATYPE(QPainterVideoSurface::ShaderType); class QtTestGLVideoBuffer : public QAbstractVideoBuffer { public: QtTestGLVideoBuffer() : QAbstractVideoBuffer(GLTextureHandle) , m_textureId(0) { glGenTextures(1, &m_textureId); } ~QtTestGLVideoBuffer() { glDeleteTextures(1, &m_textureId); } GLuint textureId() const { return m_textureId; } QVariant handle() const { return m_textureId; } uchar *map(MapMode, int *, int *) { return 0; } void unmap() {} MapMode mapMode() const { return NotMapped; } private: GLuint m_textureId; }; #endif class QtTestOpaqueVideoBuffer : public QAbstractVideoBuffer { public: QtTestOpaqueVideoBuffer() : QAbstractVideoBuffer(UserHandle) {} uchar *map(MapMode, int *, int *) { return 0; } void unmap() {} MapMode mapMode() const { return NotMapped; } }; void tst_QPainterVideoSurface::colors() { QPainterVideoSurface surface; QCOMPARE(surface.brightness(), 0); QCOMPARE(surface.contrast(), 0); QCOMPARE(surface.hue(), 0); QCOMPARE(surface.saturation(), 0); surface.setBrightness(56); QCOMPARE(surface.brightness(), 56); surface.setContrast(43); QCOMPARE(surface.contrast(), 43); surface.setHue(-84); QCOMPARE(surface.hue(), -84); surface.setSaturation(100); QCOMPARE(surface.saturation(), 100); } static const uchar rgb32ImageData[] = { 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 }; static const uchar argb32ImageData[] = { 0x00, 0xff, 0x00, 0x00, 0xcc, 0x00, 0xff, 0xcc, 0x77, 0x00, 0x00, 0x77, 0x00, 0xff, 0xff, 0x00 }; static const uchar rgb24ImageData[] = { 0x00, 0xff, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0xcc, 0x77, 0xff, 0x77, 0x00, 0x00 }; static const uchar rgb565ImageData[] = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }; static const uchar yuvPlanarImageData[] = { 0x00, 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, }; void tst_QPainterVideoSurface::supportedFormat_data() { QTest::addColumn("handleType"); QTest::addColumn("pixelFormat"); QTest::addColumn("frameSize"); QTest::addColumn("supportedPixelFormat"); QTest::addColumn("supportedFormat"); QTest::newRow("rgb32 640x480") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB32 << QSize(640, 480) << true << true; QTest::newRow("rgb32 -640x480") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB32 << QSize(-640, 480) << true << false; QTest::newRow("rgb24 1024x768") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB24 << QSize(1024, 768) #ifndef QT_OPENGL_ES << true << true; #else << false << false; #endif QTest::newRow("rgb24 -1024x-768") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB24 << QSize(-1024, -768) #ifndef QT_OPENGL_ES << true #else << false #endif << false; QTest::newRow("rgb565 0x0") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB565 << QSize(0, 0) << true << false; QTest::newRow("YUV420P 640x480") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_YUV420P << QSize(640, 480) << false << false; QTest::newRow("YUV420P 640x-480") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_YUV420P << QSize(640, -480) << false << false; QTest::newRow("Y8 640x480") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_Y8 << QSize(640, 480) << false << false; QTest::newRow("Texture: rgb32 640x480") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB32 << QSize(640, 480) << false << false; QTest::newRow("Texture: rgb32 -640x480") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB32 << QSize(-640, 480) << false << false; QTest::newRow("rgb565 32x32") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB565 << QSize(32, 32) << true << true; QTest::newRow("rgb565 0x0") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB565 << QSize(0, 0) << true << false; QTest::newRow("argb32 256x256") << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_ARGB32 << QSize(256, 256) << true << true; QTest::newRow("Texture: rgb24 1024x768") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB24 << QSize(1024, 768) << false << false; QTest::newRow("Texture: rgb24 -1024x-768") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB24 << QSize(-1024, -768) << false << false; QTest::newRow("Texture: YUV420P 640x480") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_YUV420P << QSize(640, 480) << false << false; QTest::newRow("Texture: YUV420P 640x-480") << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_YUV420P << QSize(640, -480) << false << false; QTest::newRow("User Buffer: rgb32 256x256") << QAbstractVideoBuffer::UserHandle << QVideoFrame::Format_RGB32 << QSize(256, 256) << false << false; #if !defined(Q_OS_MAC) QTest::newRow("Pixmap: rgb32 640x480") << QAbstractVideoBuffer::QPixmapHandle << QVideoFrame::Format_RGB32 << QSize(640, 480) << true << true; QTest::newRow("Pixmap: YUV420P 640x480") << QAbstractVideoBuffer::QPixmapHandle << QVideoFrame::Format_YUV420P << QSize(640, 480) << false << true; #endif } void tst_QPainterVideoSurface::supportedFormat() { QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QSize, frameSize); QFETCH(bool, supportedPixelFormat); QFETCH(bool, supportedFormat); QPainterVideoSurface surface; const QList pixelFormats = surface.supportedPixelFormats(handleType); QCOMPARE(pixelFormats.contains(pixelFormat), supportedPixelFormat); QVideoSurfaceFormat format(frameSize, pixelFormat, handleType); QCOMPARE(surface.isFormatSupported(format), supportedFormat); QCOMPARE(surface.start(format), supportedFormat); } void tst_QPainterVideoSurface::present_data() { QTest::addColumn("pixelFormatA"); QTest::addColumn("frameSizeA"); QTest::addColumn("frameDataA"); QTest::addColumn("bytesA"); QTest::addColumn("bytesPerLineA"); QTest::addColumn("pixelFormatB"); QTest::addColumn("frameSizeB"); QTest::addColumn("frameDataB"); QTest::addColumn("bytesB"); QTest::addColumn("bytesPerLineB"); QTest::newRow("rgb32 -> argb32") << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_ARGB32 << QSize(2, 2) << static_cast(argb32ImageData) << int(sizeof(argb32ImageData)) << 8; #ifndef QT_OPENGL_ES QTest::newRow("rgb32 -> rgb24") << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_RGB24 << QSize(2, 2) << static_cast(rgb24ImageData) << int(sizeof(rgb24ImageData)) << 8; #endif QTest::newRow("rgb32 -> rgb565") << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_RGB565 << QSize(2, 2) << static_cast(rgb565ImageData) << int(sizeof(rgb565ImageData)) << 4; #ifndef QT_OPENGL_ES QTest::newRow("rgb24 -> rgb565") << QVideoFrame::Format_RGB24 << QSize(2, 2) << static_cast(rgb24ImageData) << int(sizeof(rgb24ImageData)) << 8 << QVideoFrame::Format_RGB565 << QSize(2, 2) << static_cast(rgb565ImageData) << int(sizeof(rgb565ImageData)) << 4; #endif } void tst_QPainterVideoSurface::present() { QFETCH(QVideoFrame::PixelFormat, pixelFormatA); QFETCH(QSize, frameSizeA); QFETCH(const uchar *, frameDataA); QFETCH(int, bytesA); QFETCH(int, bytesPerLineA); QFETCH(QVideoFrame::PixelFormat, pixelFormatB); QFETCH(QSize, frameSizeB); QFETCH(const uchar *, frameDataB); QFETCH(int, bytesB); QFETCH(int, bytesPerLineB); QPainterVideoSurface surface; QImage image(320, 240, QImage::Format_RGB32); QSignalSpy frameSpy(&surface, SIGNAL(frameChanged())); const QList pixelFormats = surface.supportedPixelFormats(); { // Test painting before started. QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QVideoSurfaceFormat formatA(frameSizeA, pixelFormatA); QVERIFY(surface.start(formatA)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); { // Test painting before receiving a frame. QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.error(), QAbstractVideoSurface::NoError); QVideoFrame frameA(bytesA, frameSizeA, bytesPerLineA, pixelFormatA); frameA.map(QAbstractVideoBuffer::WriteOnly); memcpy(frameA.bits(), frameDataA, frameA.mappedBytes()); frameA.unmap(); QVERIFY(surface.present(frameA)); QCOMPARE(surface.isReady(), false); QCOMPARE(frameSpy.count(), 1); { QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); { // Test repainting before receiving another frame. QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); // Not ready. QVERIFY(!surface.present(frameA)); QCOMPARE(frameSpy.count(), 1); surface.setReady(true); QCOMPARE(surface.isReady(), true); QVERIFY(surface.present(frameA)); QCOMPARE(frameSpy.count(), 2); // Try switching to a different format after starting. QVideoSurfaceFormat formatB(frameSizeB, pixelFormatB); QVERIFY(surface.start(formatB)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QVideoFrame frameB(bytesB, frameSizeB, bytesPerLineB, pixelFormatB); frameB.map(QAbstractVideoBuffer::WriteOnly); memcpy(frameB.bits(), frameDataB, frameB.mappedBytes()); frameB.unmap(); QVERIFY(surface.present(frameB)); QCOMPARE(surface.isReady(), false); QCOMPARE(frameSpy.count(), 3); { QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QVERIFY(surface.isActive()); surface.stop(); QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); // Try presenting a frame while stopped. QVERIFY(!surface.present(frameB)); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError); // Try presenting a frame with a different format. QVERIFY(surface.start(formatB)); QVERIFY(!surface.present(frameA)); QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError); } void tst_QPainterVideoSurface::presentOpaqueFrame() { QPainterVideoSurface surface; QImage image(320, 240, QImage::Format_RGB32); QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); QVERIFY(surface.start(format)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QVideoFrame frame(new QtTestOpaqueVideoBuffer, QSize(64, 64), QVideoFrame::Format_RGB32); if (surface.present(frame)) { QPainter painter(&image); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError); } #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1) void tst_QPainterVideoSurface::shaderType() { QPainterVideoSurface surface; QGLWidget widget; widget.makeCurrent(); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders); surface.setGLContext(const_cast(widget.context())); QCOMPARE(surface.glContext(), widget.context()); { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); surface.setShaderType(QPainterVideoSurface::NoShaders); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(spy.count(), 0); } #ifndef QT_OPENGL_ES if (surface.supportedShaderTypes() & QPainterVideoSurface::FragmentProgramShader) { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); surface.setShaderType(QPainterVideoSurface::FragmentProgramShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::FragmentProgramShader); QCOMPARE(spy.count(), 1); surface.setShaderType(QPainterVideoSurface::FragmentProgramShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::FragmentProgramShader); QCOMPARE(spy.count(), 1); } #endif if (surface.supportedShaderTypes() & QPainterVideoSurface::GlslShader) { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); surface.setShaderType(QPainterVideoSurface::GlslShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::GlslShader); QCOMPARE(spy.count(), 1); surface.setShaderType(QPainterVideoSurface::GlslShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::GlslShader); QCOMPARE(spy.count(), 1); } { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); surface.setGLContext(const_cast(widget.context())); QCOMPARE(surface.glContext(), widget.context()); QCOMPARE(spy.count(), 0); } surface.setGLContext(0); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders); { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); surface.setShaderType(QPainterVideoSurface::NoShaders); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(spy.count(), 0); #ifndef QT_OPENGL_ES surface.setShaderType(QPainterVideoSurface::FragmentProgramShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(spy.count(), 0); #endif surface.setShaderType(QPainterVideoSurface::GlslShader); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(spy.count(), 0); } } void tst_QPainterVideoSurface::shaderTypeStarted_data() { QTest::addColumn("shaderType"); #ifndef QT_OPENGL_ES QTest::newRow("ARBfp") << QPainterVideoSurface::FragmentProgramShader; #endif QTest::newRow("GLSL") << QPainterVideoSurface::GlslShader; } void tst_QPainterVideoSurface::shaderTypeStarted() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); QGLWidget widget; widget.makeCurrent(); QPainterVideoSurface surface; surface.setGLContext(const_cast(widget.context())); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); surface.setShaderType(shaderType); QCOMPARE(surface.shaderType(), shaderType); QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32))); { QSignalSpy spy(&surface, SIGNAL(activeChanged(bool))); surface.setShaderType(QPainterVideoSurface::NoShaders); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.isActive(), false); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last().value(0).toBool(), false); } QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32))); { QSignalSpy spy(&surface, SIGNAL(activeChanged(bool))); surface.setShaderType(QPainterVideoSurface::NoShaders); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.isActive(), true); QCOMPARE(spy.count(), 0); surface.setShaderType(shaderType); QCOMPARE(surface.shaderType(), shaderType); QCOMPARE(surface.isActive(), false); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last().value(0).toBool(), false); } QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32))); { QSignalSpy spy(&surface, SIGNAL(activeChanged(bool))); surface.setShaderType(shaderType); QCOMPARE(surface.shaderType(), shaderType); QCOMPARE(surface.isActive(), true); QCOMPARE(spy.count(), 0); surface.setGLContext(0); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.isActive(), false); QCOMPARE(spy.count(), 1); QCOMPARE(spy.last().value(0).toBool(), false); } } void tst_QPainterVideoSurface::shaderSupportedFormat_data() { QTest::addColumn("shaderType"); QTest::addColumn("handleType"); QTest::addColumn("pixelFormat"); QTest::addColumn("frameSize"); QTest::addColumn("supportedPixelFormat"); QTest::addColumn("supportedFormat"); QList > types; #ifndef QT_OPENGL_ES types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")); #endif types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")); QPair type; foreach (type, types) { QTest::newRow((type.second + "rgb32 640x480").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB32 << QSize(640, 480) << true << true; QTest::newRow((type.second + "rgb32 -640x480").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB32 << QSize(-640, 480) << true << false; QTest::newRow((type.second + "rgb565 32x32").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB565 << QSize(32, 32) << true << true; QTest::newRow((type.second + "rgb565 0x0").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB565 << QSize(0, 0) << true << false; QTest::newRow((type.second + "argb32 256x256").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_ARGB32 << QSize(256, 256) << true << true; QTest::newRow((type.second + "rgb24 1024x768").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB24 << QSize(1024, 768) #ifndef QT_OPENGL_ES << true << true; #else << false << false; #endif QTest::newRow((type.second + "rgb24 -1024x-768").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_RGB24 << QSize(-1024, -768) #ifndef QT_OPENGL_ES << true #else << false #endif << false; #ifndef Q_OS_MAC QTest::newRow((type.second + "YUV420P 640x480").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_YUV420P << QSize(640, 480) << true << true; QTest::newRow((type.second + "YUV420P 640x-480").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_YUV420P << QSize(640, -480) << true << false; #endif QTest::newRow((type.second + "Y8 640x480").constData()) << type.first << QAbstractVideoBuffer::NoHandle << QVideoFrame::Format_Y8 << QSize(640, 480) << false << false; QTest::newRow((type.second + "Texture: rgb32 640x480").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB32 << QSize(640, 480) << true << true; QTest::newRow((type.second + "Texture: rgb32 -640x480").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB32 << QSize(-640, 480) << true << false; #ifndef Q_OS_MAC QTest::newRow((type.second + "Texture: rgb565 32x32").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB565 << QSize(32, 32) << false << false; QTest::newRow((type.second + "Texture: rgb565 0x0").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB565 << QSize(0, 0) << false << false; #endif QTest::newRow((type.second + "Texture argb32 256x256").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_ARGB32 << QSize(256, 256) << true << true; #ifndef Q_OS_MAC QTest::newRow((type.second + "Texture: rgb24 1024x768").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB24 << QSize(1024, 768) << false << false; QTest::newRow((type.second + "Texture: rgb24 -1024x-768").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_RGB24 << QSize(-1024, -768) << false << false; QTest::newRow((type.second + "Texture: YUV420P 640x480").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_YUV420P << QSize(640, 480) << false << false; QTest::newRow((type.second + "Texture: YUV420P 640x-480").constData()) << type.first << QAbstractVideoBuffer::GLTextureHandle << QVideoFrame::Format_YUV420P << QSize(640, -480) << false << false; #endif QTest::newRow(type.second + "User Buffer: rgb32 256x256") << type.first << QAbstractVideoBuffer::UserHandle << QVideoFrame::Format_RGB32 << QSize(256, 256) << false << false; } } void tst_QPainterVideoSurface::shaderSupportedFormat() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QSize, frameSize); QFETCH(bool, supportedPixelFormat); QFETCH(bool, supportedFormat); QGLWidget widget; widget.makeCurrent(); QPainterVideoSurface surface; surface.setGLContext(const_cast(widget.context())); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type not supported on this platform"); surface.setShaderType(shaderType); if (surface.shaderType() != shaderType) QSKIP("Shader type couldn't be set"); const QList pixelFormats = surface.supportedPixelFormats(handleType); QCOMPARE(pixelFormats.contains(pixelFormat), supportedPixelFormat); QVideoSurfaceFormat format(frameSize, pixelFormat, handleType); QCOMPARE(surface.isFormatSupported(format), supportedFormat); QCOMPARE(surface.start(format), supportedFormat); } void tst_QPainterVideoSurface::shaderPresent_data() { QTest::addColumn("shaderType"); QTest::addColumn("pixelFormatA"); QTest::addColumn("frameSizeA"); QTest::addColumn("frameDataA"); QTest::addColumn("bytesA"); QTest::addColumn("bytesPerLineA"); QTest::addColumn("pixelFormatB"); QTest::addColumn("frameSizeB"); QTest::addColumn("frameDataB"); QTest::addColumn("bytesB"); QTest::addColumn("bytesPerLineB"); QList > types; #ifndef QT_OPENGL_ES types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")); #endif types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")); QPair type; foreach (type, types) { QTest::newRow((type.second + "rgb32 -> argb32").constData()) << type.first << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_ARGB32 << QSize(2, 2) << static_cast(argb32ImageData) << int(sizeof(argb32ImageData)) << 8; QTest::newRow((type.second + "rgb32 -> rgb565").constData()) << type.first << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_RGB565 << QSize(2, 2) << static_cast(rgb565ImageData) << int(sizeof(rgb565ImageData)) << 4; #ifndef Q_OS_MAC QTest::newRow((type.second + "rgb32 -> yuv420p").constData()) << type.first << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8 << QVideoFrame::Format_YUV420P << QSize(8, 8) << static_cast(yuvPlanarImageData) << int(sizeof(yuvPlanarImageData)) << 8; QTest::newRow((type.second + "yv12 -> rgb32").constData()) << type.first << QVideoFrame::Format_YV12 << QSize(8, 8) << static_cast(yuvPlanarImageData) << int(sizeof(yuvPlanarImageData)) << 8 << QVideoFrame::Format_RGB32 << QSize(2, 2) << static_cast(rgb32ImageData) << int(sizeof(rgb32ImageData)) << 8; #endif } } void tst_QPainterVideoSurface::shaderPresent() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); QFETCH(QVideoFrame::PixelFormat, pixelFormatA); QFETCH(QSize, frameSizeA); QFETCH(const uchar *, frameDataA); QFETCH(int, bytesA); QFETCH(int, bytesPerLineA); QFETCH(QVideoFrame::PixelFormat, pixelFormatB); QFETCH(QSize, frameSizeB); QFETCH(const uchar *, frameDataB); QFETCH(int, bytesB); QFETCH(int, bytesPerLineB); QGLWidget widget; widget.makeCurrent(); QPainterVideoSurface surface; surface.setGLContext(const_cast(widget.context())); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); surface.setShaderType(shaderType); if (surface.shaderType() != shaderType) QSKIP("Shader type couldn't be set"); QSignalSpy frameSpy(&surface, SIGNAL(frameChanged())); { // Test painting before starting the surface. QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.error(), QAbstractVideoSurface::NoError); QVideoSurfaceFormat formatA(frameSizeA, pixelFormatA); QVERIFY(surface.start(formatA)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); // Test painting before receiving a frame. { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QVideoFrame frameA(bytesA, frameSizeA, bytesPerLineA, pixelFormatA); frameA.map(QAbstractVideoBuffer::WriteOnly); memcpy(frameA.bits(), frameDataA, frameA.mappedBytes()); frameA.unmap(); QVERIFY(surface.present(frameA)); QCOMPARE(surface.isReady(), false); QCOMPARE(frameSpy.count(), 1); { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); { // Test repainting before receiving another frame. QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); // Not ready. QVERIFY(!surface.present(frameA)); QCOMPARE(frameSpy.count(), 1); surface.setReady(true); QCOMPARE(surface.isReady(), true); QVERIFY(surface.present(frameA)); QCOMPARE(frameSpy.count(), 2); // Try switching to a different format after starting. QVideoSurfaceFormat formatB(frameSizeB, pixelFormatB); QVERIFY(surface.start(formatB)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QVideoFrame frameB(bytesB, frameSizeB, bytesPerLineB, pixelFormatB); frameB.map(QAbstractVideoBuffer::WriteOnly); memcpy(frameB.bits(), frameDataB, frameB.mappedBytes()); frameB.unmap(); QVERIFY(surface.present(frameB)); QCOMPARE(surface.isReady(), false); QCOMPARE(frameSpy.count(), 3); { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); surface.stop(); QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); // Try presenting a frame while stopped. QVERIFY(!surface.present(frameB)); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError); // Try stopping while already stopped. surface.stop(); QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); // Try presenting a frame with a different format. QVERIFY(surface.start(formatB)); QVERIFY(!surface.present(frameA)); QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError); } void tst_QPainterVideoSurface::shaderPresentOpaqueFrame_data() { QTest::addColumn("shaderType"); #ifndef QT_OPENGL_ES QTest::newRow("ARBfp") << QPainterVideoSurface::FragmentProgramShader; #endif QTest::newRow("GLSL") << QPainterVideoSurface::GlslShader; } void tst_QPainterVideoSurface::shaderPresentOpaqueFrame() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); QGLWidget widget; widget.makeCurrent(); QPainterVideoSurface surface; surface.setGLContext(const_cast(widget.context())); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); surface.setShaderType(shaderType); if (surface.shaderType() != shaderType) QSKIP("Shader type couldn't be set"); QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); QVERIFY(surface.start(format)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QVideoFrame frame(new QtTestOpaqueVideoBuffer, QSize(64, 64), QVideoFrame::Format_RGB32); if (surface.present(frame)) { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), false); QCOMPARE(surface.isReady(), false); QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError); } void tst_QPainterVideoSurface::shaderPresentGLFrame_data() { QTest::addColumn("shaderType"); #ifndef QT_OPENGL_ES QTest::newRow("ARBfp") << QPainterVideoSurface::FragmentProgramShader; #endif QTest::newRow("GLSL") << QPainterVideoSurface::GlslShader; } void tst_QPainterVideoSurface::shaderPresentGLFrame() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); QGLWidget widget; widget.makeCurrent(); QPainterVideoSurface surface; surface.setGLContext(const_cast(widget.context())); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); surface.setShaderType(shaderType); if (surface.shaderType() != shaderType) QSKIP("Shader type couldn't be set"); QVideoSurfaceFormat format( QSize(2, 2), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); QVERIFY(surface.start(format)); QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), true); QtTestGLVideoBuffer *buffer = new QtTestGLVideoBuffer; glBindTexture(GL_TEXTURE_2D, buffer->textureId()); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb32ImageData); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); QVideoFrame frame(buffer, QSize(2, 2), QVideoFrame::Format_RGB32); QVERIFY(surface.present(frame)); { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); { QPainter painter(&widget); surface.paint(&painter, QRect(0, 0, 320, 240)); } QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); } #endif QTEST_MAIN(tst_QPainterVideoSurface) #include "tst_qpaintervideosurface.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiodata/000077500000000000000000000000001225012771600300015ustar00rootroot00000000000000qradiodata.pro000066400000000000000000000004121225012771600325520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiodataCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qradiodata QT += multimedia-private testlib SOURCES += tst_qradiodata.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockradio.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qradiodata.cpp000066400000000000000000000165151225012771600334410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiodata/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include "mockmediaserviceprovider.h" #include "mockmediaservice.h" #include "mockavailabilitycontrol.h" #include "mockradiotunercontrol.h" #include "mockradiodatacontrol.h" QT_USE_NAMESPACE class tst_QRadioData: public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); private slots: void testNullService(); void testNullControl(); void testAlternativeFrequencies(); void testRadioDataUpdates(); private: MockAvailabilityControl *mockAvailability; MockRadioTunerControl *mockTuner; MockRadioDataControl *mockData; MockMediaService *service; MockMediaServiceProvider *provider; QRadioTuner * radio; QRadioData *radioData; }; void tst_QRadioData::initTestCase() { qRegisterMetaType("QRadioData::ProgramType"); mockAvailability = new MockAvailabilityControl(QMultimedia::Available); mockTuner = new MockRadioTunerControl(this); mockData = new MockRadioDataControl(this); QMap map; map.insert(QRadioTunerControl_iid, mockTuner); map.insert(QRadioDataControl_iid, mockData); map.insert(QMediaAvailabilityControl_iid, mockAvailability); service = new MockMediaService(this, map); provider = new MockMediaServiceProvider(service); QMediaServiceProvider::setDefaultServiceProvider(provider); radio = new QRadioTuner; radioData = radio->radioData(); QVERIFY(radioData->availability() == QMultimedia::Available); } void tst_QRadioData::cleanupTestCase() { QVERIFY(radioData->error() == QRadioData::NoError); QVERIFY(radioData->errorString().isEmpty()); delete radio; delete service; delete provider; delete mockAvailability; } void tst_QRadioData::testNullService() { const QPair nullRange(0, 0); MockMediaServiceProvider nullProvider(0); QMediaServiceProvider::setDefaultServiceProvider(&nullProvider); QRadioTuner radio; QRadioData *nullRadioData = radio.radioData(); QVERIFY(nullRadioData == 0); QRadioData radioData(&radio); QCOMPARE(radioData.error(), QRadioData::ResourceError); QCOMPARE(radioData.errorString(), QString()); QCOMPARE(radioData.stationId(), QString()); QCOMPARE(radioData.programType(), QRadioData::Undefined); QCOMPARE(radioData.programTypeName(), QString()); QCOMPARE(radioData.stationName(), QString()); QCOMPARE(radioData.radioText(), QString()); QCOMPARE(radioData.isAlternativeFrequenciesEnabled(), false); } void tst_QRadioData::testNullControl() { const QPair nullRange(0, 0); MockMediaService service(0, 0); MockMediaServiceProvider provider(&service); QMediaServiceProvider::setDefaultServiceProvider(&provider); QRadioTuner radio; QRadioData *radioData = radio.radioData(); QCOMPARE(radioData->error(), QRadioData::ResourceError); QCOMPARE(radioData->errorString(), QString()); QCOMPARE(radioData->stationId(), QString()); QCOMPARE(radioData->programType(), QRadioData::Undefined); QCOMPARE(radioData->programTypeName(), QString()); QCOMPARE(radioData->stationName(), QString()); QCOMPARE(radioData->radioText(), QString()); QCOMPARE(radioData->isAlternativeFrequenciesEnabled(), false); { QSignalSpy spy(radioData, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); radioData->setAlternativeFrequenciesEnabled(true); QCOMPARE(radioData->isAlternativeFrequenciesEnabled(), false); QCOMPARE(spy.count(), 0); } } void tst_QRadioData::testAlternativeFrequencies() { QSignalSpy readSignal(radioData, SIGNAL(alternativeFrequenciesEnabledChanged(bool))); radioData->setAlternativeFrequenciesEnabled(true); QTestEventLoop::instance().enterLoop(1); QVERIFY(radioData->isAlternativeFrequenciesEnabled() == true); QVERIFY(readSignal.count() == 1); } void tst_QRadioData::testRadioDataUpdates() { QSignalSpy rtSpy(radioData, SIGNAL(radioTextChanged(QString))); QSignalSpy ptyPTYSpy(radioData, SIGNAL(programTypeChanged(QRadioData::ProgramType))); QSignalSpy ptynSpy(radioData, SIGNAL(programTypeNameChanged(QString))); QSignalSpy piSpy(radioData, SIGNAL(stationIdChanged(QString))); QSignalSpy psSpy(radioData, SIGNAL(stationNameChanged(QString))); mockData->forceRT("Mock Radio Text"); mockData->forceProgramType(static_cast(QRadioData::Sport)); mockData->forcePTYN("Mock Programme Type Name"); mockData->forcePI("Mock Programme Identification"); mockData->forcePS("Mock Programme Service"); QTestEventLoop::instance().enterLoop(1); QVERIFY(rtSpy.count() == 1); QVERIFY(ptyPTYSpy.count() == 1); QVERIFY(ptynSpy.count() == 1); QVERIFY(piSpy.count() == 1); QVERIFY(psSpy.count() == 1); QCOMPARE(radioData->radioText(), QString("Mock Radio Text")); QCOMPARE(radioData->programType(), QRadioData::Sport); QCOMPARE(radioData->programTypeName(), QString("Mock Programme Type Name")); QCOMPARE(radioData->stationId(), QString("Mock Programme Identification")); QCOMPARE(radioData->stationName(), QString("Mock Programme Service")); } QTEST_GUILESS_MAIN(tst_QRadioData) #include "tst_qradiodata.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiotuner/000077500000000000000000000000001225012771600302255ustar00rootroot00000000000000qradiotuner.pro000066400000000000000000000004141225012771600332240ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiotunerCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qradiotuner QT += multimedia-private testlib SOURCES += tst_qradiotuner.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockradio.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qradiotuner.cpp000066400000000000000000000320641225012771600341060ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qradiotuner/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include "mockmediaserviceprovider.h" #include "mockmediaservice.h" #include "mockradiotunercontrol.h" #include "mockavailabilitycontrol.h" QT_USE_NAMESPACE class tst_QRadioTuner: public QObject { Q_OBJECT public slots: void initTestCase(); void cleanupTestCase(); void init(); private slots: void testNullService(); void testNullControl(); void testBand(); void testFrequency(); void testMute(); void testSearch(); void testVolume(); void testSignal(); void testStereo(); void testSearchAllStations(); void errorSignal(); private: MockRadioTunerControl *mock; MockAvailabilityControl *mockAvailability; MockMediaService *service; MockMediaServiceProvider *provider; QRadioTuner *radio; }; void tst_QRadioTuner::initTestCase() { qRegisterMetaType("QRadioTuner::State"); qRegisterMetaType("QRadioTuner::Band"); mock = new MockRadioTunerControl(this); mockAvailability = new MockAvailabilityControl(QMultimedia::Available); QMap map; map.insert(QRadioTunerControl_iid, mock); map.insert(QMediaAvailabilityControl_iid, mockAvailability); service = new MockMediaService(this, map); provider = new MockMediaServiceProvider(service); QMediaServiceProvider::setDefaultServiceProvider(provider); radio = new QRadioTuner; QVERIFY(radio->service() != 0); QVERIFY(radio->isAvailable()); QVERIFY(radio->availability() == QMultimedia::Available); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); QCOMPARE(radio->state(), QRadioTuner::StoppedState); radio->start(); QVERIFY(radio->availability() == QMultimedia::Available); QCOMPARE(radio->state(), QRadioTuner::ActiveState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value(), QRadioTuner::ActiveState); } void tst_QRadioTuner::cleanupTestCase() { QVERIFY(radio->error() == QRadioTuner::NoError); QVERIFY(radio->errorString().isEmpty()); QSignalSpy stateSpy(radio, SIGNAL(stateChanged(QRadioTuner::State))); radio->stop(); QVERIFY(radio->availability() == QMultimedia::Available); QCOMPARE(radio->state(), QRadioTuner::StoppedState); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.first()[0].value(), QRadioTuner::StoppedState); delete radio; delete service; delete provider; delete mockAvailability; } void tst_QRadioTuner::init() { QMediaServiceProvider::setDefaultServiceProvider(provider); } void tst_QRadioTuner::testNullService() { const QPair nullRange(0, 0); MockMediaServiceProvider provider(0); QMediaServiceProvider::setDefaultServiceProvider(&provider); QRadioTuner radio; QVERIFY(!radio.isAvailable()); radio.start(); QCOMPARE(radio.error(), QRadioTuner::ResourceError); QCOMPARE(radio.errorString(), QString()); QCOMPARE(radio.band(), QRadioTuner::FM); QCOMPARE(radio.isBandSupported(QRadioTuner::AM), false); QCOMPARE(radio.isBandSupported(QRadioTuner::FM), false); QCOMPARE(radio.frequency(), 0); QCOMPARE(radio.frequencyStep(QRadioTuner::AM), 0); QCOMPARE(radio.frequencyStep(QRadioTuner::FM), 0); QCOMPARE(radio.frequencyRange(QRadioTuner::AM), nullRange); QCOMPARE(radio.frequencyRange(QRadioTuner::FM), nullRange); QCOMPARE(radio.isStereo(), false); QCOMPARE(radio.stereoMode(), QRadioTuner::Auto); QCOMPARE(radio.signalStrength(), 0); QCOMPARE(radio.volume(), 0); QCOMPARE(radio.isMuted(), false); QCOMPARE(radio.isSearching(), false); radio.stop(); } void tst_QRadioTuner::testNullControl() { const QPair nullRange(0, 0); MockMediaService service(0, 0); MockMediaServiceProvider provider(&service); QMediaServiceProvider::setDefaultServiceProvider(&provider); QRadioTuner radio; QVERIFY(!radio.isAvailable()); radio.start(); QCOMPARE(radio.error(), QRadioTuner::ResourceError); QCOMPARE(radio.errorString(), QString()); QCOMPARE(radio.band(), QRadioTuner::FM); QCOMPARE(radio.isBandSupported(QRadioTuner::AM), false); QCOMPARE(radio.isBandSupported(QRadioTuner::FM), false); QCOMPARE(radio.frequency(), 0); QCOMPARE(radio.frequencyStep(QRadioTuner::AM), 0); QCOMPARE(radio.frequencyStep(QRadioTuner::FM), 0); QCOMPARE(radio.frequencyRange(QRadioTuner::AM), nullRange); QCOMPARE(radio.frequencyRange(QRadioTuner::FM), nullRange); { QSignalSpy bandSpy(&radio, SIGNAL(bandChanged(QRadioTuner::Band))); QSignalSpy frequencySpy(&radio, SIGNAL(frequencyChanged(int))); radio.setFrequency(107500); QCOMPARE(radio.band(), QRadioTuner::FM); QCOMPARE(radio.frequency(), 0); QCOMPARE(bandSpy.count(), 0); QCOMPARE(frequencySpy.count(), 0); radio.setBand(QRadioTuner::AM); QCOMPARE(radio.band(), QRadioTuner::FM); QCOMPARE(radio.frequency(), 0); QCOMPARE(bandSpy.count(), 0); QCOMPARE(frequencySpy.count(), 0); } QCOMPARE(radio.isStereo(), false); QCOMPARE(radio.stereoMode(), QRadioTuner::Auto); radio.setStereoMode(QRadioTuner::ForceStereo); QCOMPARE(radio.stereoMode(), QRadioTuner::Auto); QCOMPARE(radio.signalStrength(), 0); QCOMPARE(radio.volume(), 0); QCOMPARE(radio.isMuted(), false); { QSignalSpy volumeSpy(&radio, SIGNAL(volumeChanged(int))); QSignalSpy muteSpy(&radio, SIGNAL(mutedChanged(bool))); radio.setVolume(76); QCOMPARE(radio.volume(), 0); QCOMPARE(volumeSpy.count(), 0); radio.setMuted(true); QCOMPARE(radio.isMuted(), false); QCOMPARE(muteSpy.count(), 0); } QCOMPARE(radio.isSearching(), false); { QSignalSpy spy(&radio, SIGNAL(searchingChanged(bool))); radio.searchBackward(); QCOMPARE(radio.isSearching(), false); QCOMPARE(spy.count(), 0); radio.searchForward(); QCOMPARE(radio.isSearching(), false); QCOMPARE(spy.count(), 0); radio.searchAllStations(); QCOMPARE(radio.isSearching(), false); QCOMPARE(spy.count(), 0); radio.cancelSearch(); QCOMPARE(radio.isSearching(), false); QCOMPARE(spy.count(), 0); } radio.stop(); } void tst_QRadioTuner::testBand() { QVERIFY(radio->isBandSupported(QRadioTuner::FM)); QVERIFY(!radio->isBandSupported(QRadioTuner::SW)); if(radio->isBandSupported(QRadioTuner::AM)) { QSignalSpy readSignal(radio, SIGNAL(bandChanged(QRadioTuner::Band))); radio->setBand(QRadioTuner::AM); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->band() == QRadioTuner::AM); QVERIFY(readSignal.count() == 1); } } void tst_QRadioTuner::testFrequency() { QSignalSpy readSignal(radio, SIGNAL(frequencyChanged(int))); radio->setFrequency(104500000); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->frequency() == 104500000); QVERIFY(readSignal.count() == 1); QVERIFY(radio->frequencyStep(QRadioTuner::FM) == 1); QPair test = radio->frequencyRange(QRadioTuner::FM); QVERIFY(test.first == 1); QVERIFY(test.second == 2); } void tst_QRadioTuner::testMute() { QSignalSpy readSignal(radio, SIGNAL(mutedChanged(bool))); radio->setMuted(true); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->isMuted()); QVERIFY(readSignal.count() == 1); } void tst_QRadioTuner::testSearch() { QSignalSpy readSignal(radio, SIGNAL(searchingChanged(bool))); QVERIFY(!radio->isSearching()); radio->searchForward(); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->isSearching()); QVERIFY(readSignal.count() == 1); radio->cancelSearch(); QTestEventLoop::instance().enterLoop(1); QVERIFY(!radio->isSearching()); QVERIFY(readSignal.count() == 2); radio->searchBackward(); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->isSearching()); QVERIFY(readSignal.count() == 3); radio->cancelSearch(); QVERIFY(!radio->isSearching()); } void tst_QRadioTuner::testVolume() { QVERIFY(radio->volume() == 100); QSignalSpy readSignal(radio, SIGNAL(volumeChanged(int))); radio->setVolume(50); QTestEventLoop::instance().enterLoop(1); QVERIFY(radio->volume() == 50); QVERIFY(readSignal.count() == 1); } void tst_QRadioTuner::testSignal() { QVERIFY(radio->signalStrength() == 0); // There is no set of this only a get, do nothing else. } void tst_QRadioTuner::testStereo() { /* no set function to toggle stereo status; cannot emit stereoStatusChanged() signal */ QVERIFY(radio->isStereo()); radio->setStereoMode(QRadioTuner::ForceMono); QVERIFY(radio->stereoMode() == QRadioTuner::ForceMono); } void tst_QRadioTuner::testSearchAllStations() { QSignalSpy foundSpy(radio, SIGNAL(stationFound(int,QString))); QSignalSpy completeSpy(radio, SIGNAL(searchingChanged(bool))); radio->searchAllStations(QRadioTuner::SearchGetStationId); QTestEventLoop::instance().enterLoop(1); QCOMPARE(radio->frequency(), 103100000 ); QCOMPARE(foundSpy.count(), 3); QVERIFY(qvariant_cast(foundSpy.at(2).at(0)) == 103100000 ); QVERIFY(qvariant_cast(foundSpy.at(2).at(1)) == QString("MockProgramPI3") ); QCOMPARE(completeSpy.count(), 2); } // QRadioTuner's errorsignal void tst_QRadioTuner::errorSignal() { qRegisterMetaType("QRadioTuner::Error"); QObject obj; MockRadioTunerControl dctrl(&obj); MockMediaService service(&obj, &dctrl); MockMediaServiceProvider provider(&service); QMediaServiceProvider::setDefaultServiceProvider(&provider); QRadioTuner radio; QSignalSpy spy(&radio, SIGNAL(error(QRadioTuner::Error))); QVERIFY(radio.service() != 0); QVERIFY(radio.isAvailable()); radio.start(); radio.setBand(QRadioTuner::FM); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast(spy.at(0).at(0)) == QRadioTuner::NoError); QVERIFY(radio.error() == QRadioTuner::NoError); QVERIFY(radio.error() != QRadioTuner::OpenError); QVERIFY(radio.errorString().isEmpty()); spy.clear(); /* emits QRadioTuner::OutOfRangeError if band is set to FM2 or LW and frequency set to >= 148500000 */ radio.setBand(QRadioTuner::LW); radio.setBand(QRadioTuner::FM2); radio.setFrequency(148500000); QVERIFY(spy.count() == 3); QVERIFY(qvariant_cast(spy.at(0).at(0)) == QRadioTuner::OutOfRangeError); QVERIFY(qvariant_cast(spy.at(1).at(0)) == QRadioTuner::OutOfRangeError); QVERIFY(qvariant_cast(spy.at(2).at(0)) == QRadioTuner::OutOfRangeError); QVERIFY(radio.error() == QRadioTuner::OutOfRangeError); QVERIFY2(!radio.errorString().isEmpty(), "band and range not supported"); spy.clear(); radio.stop(); } QTEST_GUILESS_MAIN(tst_QRadioTuner) #include "tst_qradiotuner.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecache/000077500000000000000000000000001225012771600303165ustar00rootroot00000000000000qsamplecache.pro000066400000000000000000000003201225012771600334020ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecacheCONFIG += no_private_qt_headers_warning testcase TARGET = tst_qsamplecache QT += multimedia-private testlib SOURCES += tst_qsamplecache.cpp TESTDATA += testdata/* DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecache/testdata/000077500000000000000000000000001225012771600321275ustar00rootroot00000000000000test.wav000066400000000000000000002542501225012771600335560ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecache/testdataRIFF XWAVEfmt D¬ˆXdata|X¬Áò&Ç3Ž@xLµV·^*dgSgpe”a\U·LC8Û+~7bWòœã‰ÕŒÈè¼Í²]ª¢£ªžx›+š»š[ù¡¥¨9±»bÇbÔ5âˆðÿi më(£5\AéKUo\úaxeÆfïeåbÝ]îVQN:DÓ8],ýù†îó„å×xÊu¾å³îªÃ£ƒž3›æ™—š@ß¡^¨«°¡ºÆ¿Òbà¬îJýâ 3æ'Ç4“@K*Tš[4aßd€föe^c¥^X‹O€E:-( ¾;õëæÙðËÞ¿µÛ«]¤Îž6›¸™AšØœa¡Í§ú¯Ã¹ÿÄsÑæÞíœûE °•&¢3£?JJ~SüZ³`yd?föe–c2_ËXP¹Fo;ñ.…!v ‡ö6è[Ú=ÍÁ<¶Ø¬#¥NŸq›«™ù™^œÁ §!¯×¸ïÃFГݜëú±'%X2€>cI¿RnZK`3d!fþeÐc_zYzQÝG±š¬™-›²ž8¤“«¬´I¿8Ë9Ø æ^ôñp“-«9EOW6^÷b¶eafýdˆa\ÎTÊK=Ad5n(²^ ÖýNï#á’ÓíÆg»S±É¨¢;eš¤™éšHž•£Êª±³-¾÷ÉáÖœäèòw/Ë+v8 D0NÍVž]’b‚eff6eøa½\ UÇL_B 6Æ)Ð Fÿ¿ð…âèÔ"Ȉ¼@²—©¦¢ž—š—™´šÕú¢ý©¿²½¾ÈŒÕ5ãtñÿÿ‹Êu*B7ðBBMV])bNeffgedbU]mV½M|CÝ7+|?½+òìã9Ö]É£½9³`ªG£žÎš˜™}šm^¢4©Ì±ù»ˆÇ:ÔÐáðˆþ ` )6ÕAKL:Ui\Àaeef—eÆbî]/W¯N“D9m,ä°2žóRå×™ÊÀ¾1´2«ç£zž›¢™Lš Å¡r¨Ù°çºNÆïÒhàšîý¨ ÷Ç'Å4´@MKkTÅ[PaÕd[fÄe&c~^òWšO¨EG:Á-@ *¡õ¹æçØÚËß¿.µ¬Œ¤ðžH›¯™#š¯œ6¡²§î¯Ó¹ÅœÑ ß$í û3 n&…3?SJS![Ö`•dJfîe~c_«X†P´F|; /¤!–Šö&è>Ú ÍÁ0¶Þ¬3¥kŸŽ›¿™šQœ² ð¦¯À¸ïÃPЩݸë*ú¾&%C2g>NI·RsZX`Od3ffÓc—_fYhQÂGªà2Ã%Øx åúnìYÞøÐƒÄK¹|¯R§ò ‚œš·™k›)Ÿä¤k¬³µoÀ{Ì•ÙnçÐõ^Ýõ e.â:-FPNXÉ^ScØeVf³dao[TÍJ$@$4'Eì YüÞí¹ßFÒ´Å[ºg° ¨…¡×œ;š¨™&›¶ž7¤š«°´M¿<Ë8ØæYôìk”-®9E#O“W6^öb±e^fød‡a\ÒTÌKDAd5t(¬a ÏýLïá”ÓèÆr»N±Õ¨¢?bš ™èšCž•£Èªµ³.¾üÉâÖžäèòuý-Æ+z8D7NÌV¢]•beff4eóa½\žUÇLbB 6Ë)Ñ Gÿºð†âãÔ"ȇ¼A²™©§¢¢•š›™°šÕ÷¢û©¾²½ÁÈŒÕ8ãtñ†Îo*B7îBBMV ]*bPeffje_bW]jV¼MzCà7+@»/òëã5Öaɽ9³bªD£ žÍ𙙀šj`¢1©Ë±ù»†Ç;ÔÒáð‹þ b)6ÒAKL8Uk\½ae`feÄbî]/W®N’D9o,ß¶/¢óQåŽ×›Ê½¾3´/«æ£{ž›¡™Pš Ê¡m¨Þ°áºRÆêÒlà•îý¦ ûÃ'É4¯@RKhTÄ[PaÕd[fÅe'c~^óW˜OªED:Ã-? (£õºæçØÚËß¿0µ¬Ž¤ìžL›¬™&š­œ8¡²§î¯Ô¹ÅžÑ ß#í¢û1 o&‚3?SJS$[Ñ`—dJfíe€c _°X‚P·Fz; /¤!—Šö%è@ÚÍÁ2¶Ù¬9¥gŸŽ›Á™šUœ° ñ¦ ¯Â¸íÃRЧݹë)ú¿#%?2k>KIºRpZ[`Ld4ffÑcš_cYkQÁG©GõP YS_«cþeAfqd˜`ÊZ$SÐIý>á2Â%Øy æúlìZÞ÷ЃÄL¹|¯Q§õ }œš³™m›+ŸÞ¤s¬«µtÀzÌ“ÙqçÎõ_Ýô e.ã:,FPLXÌ^OcÝeQf¸dat[ýSÐJ!@'4'Gé \üÜí»ßDÒµÅ[ºe°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë=Øæ_ôèm“-¯9E$O‘W9^ób³e]fúd„a\ËTÔK=Ak5n(¯_ ÐýKï"áÓñÆi»U±Ï¨¢MI¸RrZZ`Ld5ffÔc—_gYgQÃG©¸–®¦f /œî™Ë™´›§ŸŽ¥G­´¶•ÁÂÍíÚÛèC÷ÕIY"¬/<á2Â%Ùx åúmìZÞöІÄH¹~¯R§ñ ƒœš¶™l›)Ÿä¤l¬±µpÀ{Ì•ÙnçÐõ_Üõ e.á:0FPQXÈ^RcÚeTfµdar[üSÓJ@&4'Bð WüÝí»ßCÒ¸ÅXºg°¨€¡Ýœ6šª™&›µž8¤š«¯´N¿:Ë;Øæ\ôén’-¯9E#O’W7^õb³e\fúd„a\ÎTÏKAAh5p(°] ÐýNïá—ÓçÆq»Q±Ï¨¢6lš—™ïš>ž˜£Æª¶³.¾úÉæÖšäêòuû0Å+y8D4NÎV£]’b„edf4eõa»\UËL]B¥6Ç)Ò Dÿ¾ð„ââÔ%ȃ¼D²˜©§¢¢•š›™°šÕ÷¢û©¾²½¾ÈÕ5ãwñþÿÆv*>7ïBCMV ]*bOehfgebbU]jV½MzCÞ7+|Dº/òêã7Ö_Éž½9³bªD£ žÍš™™šl]¢4©Ê±ù»†Ç;ÔÐáðˆþ ^#)þ5ØAGL:Uk\¼ae_fžeÃbî]0W­N’D9l,ã²3žóUåŠ×žÊ¼¾2´1«ä£}ž›¢™Nš È¡q¨Ù°æºNÆíÒjà–îý§ øÇ'Å4³@PKfTÈ[LaØdYfÆe&c^òWšO¦EJ:»-G "§õ»æåØÜËÞ¿0µ¬Œ¤ïžH›¯™%š­œ9¡¯§ñ¯Ò¹ÅœÑ ß$í û2 n&ƒ3‘?OJ“S[×`”dJfïe}c_®XƒP¶F|;/ª!ˆö$èCÚÍÁ0¶Ú¬8¥hŸŽ›Á™šTœ° ô¦ ¯Ä¸ìÃRЩݵë-ú») %D2f>PI¶RsZY`Ld7ffÔc˜_dYlQ¾G¬ä2¾%Üw æúlìZÞ÷ЄÄK¹{¯T§ñ œš¸™i›-ŸÞ¤p¬°µpÀ}ÌÙtçËõbÛõ e.â:/FPQXÆ^ScÜeQf¹dau[ýSÏJ$@#4'Dî Wüàí¸ßEÒ·ÅXºh° ¨‚¡Úœ;š¥™)›³ž9¤š«®´P¿8Ë=Øæ[ôëk•-¯9E"O“W7^õb²e^f÷d‡a\ÐTÎKCAd5t(­_ ÑýJï!á‘ÓëÆp»O±Ô¨¢=ešž™êšAž–£Çª·³+¾ÿÉàÖŸäéòr+È+x8D5NÍV¤]b‡e`f9eïaÀ\›UÊL`B¡6Ê)Ò Eÿ½ð„âãÔ$È„¼C²™©¦¢¤“šœ™°šÕö¢þ©º²½½ÈÕ5ãwñþÿÇt*?7ïBCMV ]+bOehfheabU]kV»M}CÜ7+|C».òëã7Ö^É ½6³dªC£ žÌšš™~šl_¢2©Ì±ö»‰Ç9ÔÓáð‰þ a)6ÒALL7Ul\¾aedf™eÆbí]0W­N“D9l,ã²3žóUå‹×ʼ¾2´1«å£|ž›¢™Nš É¡o¨Û°äºOÆíÒjà–îý¦ úÅ'Æ4³@OKhTÅ[OaÖd[fÄe'c^òWšO¦EJ:¼-F "¨õ½æäØÝËÝ¿0µ¬¤ížK›¬™&š®œ7¡²§ï¯Ò¹ÅÑ ß%íŸû3 m&†3Œ?TJS [Ö`”dJfîe~c_®X‚P¹Fw; /¥!“‡ö'è?ÚÍÁ0¶Þ¬2¥mŸŒ›¿™šQœ² ñ¦ ¯Á¸ðÃNЫݴë.ú¼%%?2k>LI¹RpZ\`Jd8f fÖc–_fYjQ¿G¬â2Â%×{ ãúnìZÞöÐ…ÄJ¹|¯S§ñ ‚œš¸™i›-ŸÞ¤q¬®µqÀ|Ì“ÙoçÑõ\ßó f.á:0FPQXÇ^ScÚeTfµdar[ÿSÏJ"@%4'Fê \üÚí½ßCÒ¶Å[ºe° ¨‚¡Ûœ8šª™%›µž9¤˜«±´N¿9Ë;Øæ\ôén‘-°9E(OŽW:^ôb²e^fød‡a\ÐTÐK@Ah5p(¯_ ÏýNïá•ÓéÆo»R±Ð¨¢:hšš™íš>žš£Äª¹³)¾ÊßÖ¡äåòxù2Ã+z8D5NÏV¡]“bƒedf6eòa½\UÈL`B¤6Ç)Ð Eÿ¾ð„ââÔ&ȼF²–©©¢¡–šš™°šÖõ¢ý©¾²½ÁÈŒÕ9ãtñ‡Ío*C7íBCMV].bLeifie^bY]hV¼M}CÛ7+|B½,òìã6Ö`Éœ½<³^ªH£ žÎš™™šl^¢4©Ç±ý»ƒÇ>ÔÏáð‰þ c)6ÎAOL4Un\»ae_feÃbï]/W­N”D9p,Þ¶0¡óRåכʾ¾1´1«æ£zž›¢™Oš Ê¡l¨Þ°âºSÆçÒoà’îý¥ ùÆ'Ç4°@TKbTË[KaØdYfÈe"c„^îWœO¥EJ:½-E #§õ½æåØÛËß¿0µ¬¤îžH›±™"š°œ6¡±§ñ¯Ð¹ Å™Ñ ß#í û3 Žo&ƒ3?PJ’S[Ù`’dKfîe}c_«X…P¶Fz; /£!–‰ö%è@ÚÍÁ0¶Û¬7¥gŸ‘›½™šUœ¬ ÷¦¯Æ¸ëÃRШݷë,ú¼&%@2i>OIµRuZW`Nd4ffÒcš_cYkQÀGªã2À%Úx æúkì]ÞóЈÄG¹~¯R§ò ‚œš¶™l›)Ÿä¤k¬²µoÀ|Ì”ÙoçÐõ]ßò h.ß:1F PSXÅ^TcÛePf»d aw[üSÎJ&@!4'Cë ]üÚí½ßAÒ¹ÅXºh° ¨¡Üœ9š§™(›³ž:¤˜«±´M¿;Ë:Øæ\ôén“-°9E'OW9^ôb²e_födˆa\ÐTÏKAAg5q(¯^ ÑýKï á‘ÓìÆm»S±Ð¨¢;dš ™çšEž“£Éªµ³.¾üÉáÖ äæòwû.Æ+z8D8NÊV¥]‘b„eef4eôa¼\UÉL_B¤6Ç)Ò BÿÁð€âçÔ!È…¼D²—©©¢¡”š™®š×ö¢û©¾²½¿ÈŽÕ6ãwñÿÿ‹Ér*B7ëBFMV ]*bOegfie`bV]jV¼M|CÜ7+zEº/òêã7Ö_Éž½9³aªF£ žÎš™™~šn[¢6©È±ú»†Ç<ÔÏáðˆþ a)6ÒALL7Ul\½aecf›eÅbì]2WªN—D9r,ß´1 óSåלʻ¾4´/«ç£zž›¢™Nš Æ¡r¨Ù°æºNÆìÒkà•îý¦ øÈ'Å4²@QKeTÉ[KaÚdWfÉe!c„^îWO¥EH:À-A (¢õ»æåØÜËÞ¿/µ¬Š¤ðžH›®™%š¯œ6¡²§ï¯Ò¹Å›Ñ ß"í£û/ ‘m&„3?RJS![Õ`”dKfìec _®XƒP·Fz; /¥!“…ö(è?ÚÍÁ0¶Ú¬8¥hŸ›¿™šUœ¯ ô¦ ¯Ã¸îÃPЫݴë,ú½%%>2k>KIºRrZX`Md6ff×c“_jYeQÅG§¦'®¹·ÁÂÏKÜGê·øIº³#ú0?=FHÛQ¿YÚ_ýcf,f#d`ZHRÍHÓ=1c$oqùÿêøÜ®ÏTÃA¸”®¦g -œð™Ë™´›¥Ÿ¥H­³¶—ÁÀÍìÚàè=÷ÙHW"°/<=GöP YP_®cûeEfnd™`ÊZ#SÑIü>ã2¿%Üu èúkì\ÞôІÄJ¹|¯S§ò €œš¶™k›,ŸÞ¤r¬¬µtÀyÌ”ÙpçÏõ_Üõ d.ã:.FPOXÉ^QcÜeQf¹dat[ýSÐJ"@&4'Iè ]üÛí¼ßAÒºÅWºg°¨¡Üœ9š§™(›´ž8¤™«±´M¿;Ë8Ø æWôðg—-°9E$O‘W8^ôb²e`fõd‰a\ÒTÌKDAe5q(±[ ÓýJïá“ÓêÆp»P±Ñ¨¢:fšž™éšCž”£Éª´³/¾úÉåÖ›äëòsü0Ä+z8D6NÌV¥]b‡eaf7eóa¼\UÉL_B¥6Æ)Î Iÿ¹ðˆâàÔ&È‚¼F²”©¬¢Ÿ–šœ™®š×ö¢û©¿²½ÃÈŠÕ;ãrñˆÌp*C7ëBFMV ]'bReffhecbR]nV¹M}CÝ7+~B¼-òìã6Ö^É ½8³aªH£žÒ𖙀šl^¢3©É±û»ƒÇ?ÔÎáðŠþ ` )6ÒAML5Un\»ae`fœeÅbì]2W¬N‘D9g,é®3 óRåŽ×›Ê¾¾0´2«å£{ž›¡™Pš Ë¡k¨à°ßºTÆéÒmà”îý¥ ûÅ'Ç4±@QKfTÈ[KaÚdXfÆe'c|^õW˜O§EI:¾-C %¥õºæçØÚËß¿0µ¬‹¤ñžF›°™$š®œ9¡®§ô¯Ì¹#Å™Ñ ß&íû4 m&…3?TJŽS![Ö`’dMfìec_­X„PµF};/©!‘†ö)è<Ú"ÍÁ2¶Û¬6¥iŸŽ›À™šWœ« ø¦¯Å¸íÃPЫݴë-ú½$%=2k>NI¶RsZZ`Id:f fÖc–_fYhQÃG©GôPYP_¬cþeBfpd˜`ÊZ#SÓIù>æ2¼%Ýw åúnìXÞùЂÄL¹{¯S§ó œšµ™k›,Ÿà¤o¬¯µpÀ}Ì“ÙoçÐõ]àñ g.á:/FPOXÈ^ScÚeSf·daw[ùSÓJ!@$4'Cì [üÜí»ßCÒ·ÅYºg° ¨¡Ûœ9š©™%›·ž4¤ž«­´P¿9Ë:Øæ[ôëk•-²9E&OW7^öb±e`föd†a\ÐTÍKEAb5u(­^ ÒýJï!áÓìÆo»Q±Ñ¨¢8jšš™ëšBž•£Èª¶³,¾ýÉâÖäëòrþ-Æ+z8D6NÍV¢]•b€egf2eõa½\œUÉL`B¢6Ë)Ô Dÿ½ð†âàÔ'ȼF²–©©¢¢”šœ™®šØô¢þ©»²½½È‘Õ3ãyñþÿ‹Êq*B7íBDMV ])bPegfie_bX]hV½M}CÚ7+zEº/òéã9Ö]ÉŸ½:³_ªH£ žÍš›™}šn]¢2©Ì±÷»‰Ç8ÔÓáð‰þ _)6ÑAML7Uj\¿aebfœeÃbï]/W­N”D9o,ß·-¤óPåכʼ¾3´0«ç£yž › ™Oš È¡o¨Ý°áºRÆêÒmà”îý£ üÅ'Æ4³@NKiTÆ[Ma×dZfÆe&c^ñW›O¦EI:¿-A '¤õ»ææØÙËâ¿-µ¬Œ¤ïžH›¯™%š¬œ;¡­§ó¯Ð¹Å›Ñ ß&ížû4 m&„3?RJS [Õ`”dKfíec_¯X‚P·Fz; /¨!‘‡ö&èAÚÍÁ/¶Ü¬7¥gŸ›À™šVœ® ô¦ ¯Â¸ïÃOЫݵë+ú¿#%@2g>QI´RuZW`Nd4ffÑc™_eYhQÃG©¦)®¶·ÅÂÏMÜHêµøK¸´#ü0<=IH×QÃYØ_ýcf'f)d`ZJRÈHØ=›1d$oqùÿêúÜ«ÏWÃ>¸—®›¦h +œô™Æ™¸›£Ÿ¥H­²¶˜Á¿ÍïÚÛèA÷ØGY"®/<=GöP YS_«cýeCfodš`ÈZ%SÐIü>ã2¿%Ûx äúoìXÞøÐ„ÄJ¹|¯S§ò œš´™m›)Ÿâ¤o¬®µrÀzÌ•ÙoçÏõ^Þô e.â:-FPMXÌ^NcÞePf¹dau[üSÑJ!@&4'Fë ZüÝí¼ßAÒºÅUºj° ¨¡Ûœ:š¦™(›´ž8¤š«±´K¿=Ë8Øæ\ôèo-­9E"O“W6^öb²e]fùd…a\ÐTÍKDAd5s(®^ ÑýLïá“ÓêÆo»Q±Ó¨¢;hš™™îš@ž•£Êª²³0¾úÉåÖ›äëòrþ.Å+z8D5NÍV£]’b…ebf6eòa¾\œUÊL^B¤6Ç)Ð Fÿ¼ðƒâæÔ!ȇ¼A²˜©¨¢¢–š™™²šÓù¢ú©¾²½¿ÈŽÕ7ãtñ‰Ês*>7ðBBMV ]&bUeafme_bV]jV»M~CÚ7 +xE».òëã6Ö_Éž½:³aªD£žÉšž™|šm_¢1©Ë±ú»…Ç=ÔÏáðŠþ `)6ÐAOL3Uo\¼aedf˜eÈbë]2W¬N’D9k,ä³/£óOå’×—ÊÁ¾/´0«è£yž ›¢™Nš Ì¡k¨ß°áºRÆêÒlà•îý§ øÇ'Å4³@PKfTÈ[KaÚdXfÇe%c~^ôW™O§EI:»-H ªõ¾æåØÛËÞ¿1µ¬¤ížI›¯™#š°œ6¡²§ï¯Ó¹ÅžÑß'ížû3 m&…3?QJS![Ô`•dKfìec _®X„PµF|; /¨!’Šö#èCÚÍÁ0¶Ü¬5¥jŸ›Á™šUœ­ ö¦¯Æ¸ìÃQЩݶë+ú¾%%A2h>OI¶RsZY`Ld7f fØc’_jYeQÅG§=IHØQÂY×_ÿcf+f'd`ZFRÌHÖ=™1i$i mùëøÜ­ÏUÃ@¸–®›¦h -œï™Í™°›ªŸŒ¥I­´¶“ÁÄÍëÚÞè@÷×IW"¯/<>GöP YS_©cf@frd˜`ÉZ%SÏIý>â2Á%Ùz ãúnìZÞõЇÄI¹|¯S§ð „œš·™k›*Ÿâ¤n¬¯µqÀ}ÌÙtçËõaÝó f.â:-FPOXÈ^RcÚeSf·dar[þSÎJ$@$4'Dì ZüÞí¹ßEÒµÅ[ºe°¨~¡Þœ6šª™%›·ž5¤«­´O¿;Ë7Ø æYôìl“-¯9E!O•W5^õb³e\fúd…a\ÑTÍKBAh5n(³Z ÔýHï"á‘ÓêÆq»N±Õ¨¢?bš¡™çšCž–£Æª·³,¾þÉàÖ äæòvý-Æ+y8D6NÌV£]’b„eef3eõa»\UÊL_B£6È)Ò Eÿ½ðƒâäÔ$È„¼D²–©©¢¡–𛙝šÖö¢ü©½²½¾ÈÕ6ãvñÿÿŒÈs*A7ìBEMV ]+bOeffje`bV]jV¼M{CÞ7+~A¼.òëã6Ö`Éœ½<³^ªI£žÐš™™~šm]¢3©Ë±ù»…Ç=ÔÏáð‰þ c)6ÐAML6Ul\½aeafœeÃbï]/W®N’D9n,à¶.£óQå×ʼ¾2´1«å£|ž›£™Nš É¡n¨Ü°ãºPÆëÒmà”îý¥ úÅ'È4°@RKeTÈ[LaÙdXfÈe"cƒ^ïWœO¦EH:¾-D $¦õ»ææØÜËÜ¿2µ¬¤ìžK›«™)š©œ<¡®§ñ¯Ò¹ÅœÑ ß#í¢û0 ‘m&ƒ3‘?OJ’S[Ö`”dKfíec_­X…PµF|; /¦!“†ö)è<Ú!ÍÁ0¶Ý¬4¥kŸŒ›Â™ÿ™Vœ® ô¦ ¯Ã¸ìÃRЩݶë,ú¼&%A2i>MI¸RqZ[`Kd7ffÖc”_iYeQÆG§¸˜®š¦h -œï™Ì™³›§Ÿ¥J­°¶šÁ½ÍñÚÙèD÷ÔJW"¯/<=GõP YQ_­cýeBfqd–`ÌZ#SÑIü>â2À%Ûw æúmìYÞøÐ‚ÄM¹z¯T§ñ ‚œš·™j›,Ÿà¤o¬°µoÀ~Ì‘ÙqçÏõ^Þó f.á:/FPOXÉ^QcÜeRf·dau[ûSÒJ!@$4'Cí ZüÛí¾ß@ÒºÅWºg°¨¡Ýœ8š§™*›°ž=¤–«²´M¿9Ë<Øæ]ôél”-¯9E#O’W7^õb²e^fød†a\ÑTÌKEAc5t(­_ ÐýKï!áÓíÆl»S±Ò¨¢>bš ™èšCž–£Æª·³,¾ýÉâÖžäèòuý,É+v8 D3NÎV£]“b‚eff2e÷a¹\ UÆLbB¢6È)Ð Fÿ½ðƒâåÔ"È…¼C²—©ª¢ –šš™°šÖ÷¢ú©¿²½ÂÈ‹Õ9ãtñŒÇt*@7íBDMV ](bQeefjeabU]jV¼M{CÞ7+|Cº1òèã9Ö\É ½9³bªC£ žËšœ™}šn[¢5©Ê±ø»ˆÇ9ÔÒáðŠþ a )6×AFLKI¼RmZ_`Gd:f fÙc“_iYeQÆG¥¦(®¹·¿Â ÏEÜNê±øN¶µ#ú0==JH×QÂYØ_þcf,f%d`ZFRÌHÕ=›1g$koùëúܬÏUÃ?¸—®š¦k )œó™É™³›©Ÿ‹¥K­±¶—ÁÀÍïÚÚèC÷ÔLT"±/<ä2¾%Üw æúlì[ÞôЈÄG¹¯P§ó œš·™i›-Ÿß¤p¬®µrÀzÌ•ÙnçÐõ_Üõ d.ã:.FPOXÉ^RcÚeSf·dau[ûSÑJ"@%4'Eê ]üÚí¾ß@Ò¹ÅXºg°¨~¡Ýœ8š©™&›µž7¤›«¯´N¿;Ë8Ø æXôíj•-°9E$O’W5^øb¯e`f÷d…a\ÍTÑK?Ai5o(±\ ÒýKïá“ÓêÆo»Q±Ò¨¢=cš ™çšEž’£Êª¶³*¾ÊßÖ äçòvû/Æ+x8D5NÎV¢]”beff4eõa»\UÉL`B£6È)Ñ Fÿ¼ð„âäÔ#È…¼C²—©©¢ ˜š˜™²šÔ÷¢ü©½²½¿ÈŽÕ7ãuñ‰Ëq*A7ïBAMV]+bQedfle^bV]kV»M|CÝ7+}B¼-òìã7Ö]ÉŸ½;³^ªI£žÐš˜™šl_¢1©Í±ö»ˆÇ;ÔÐáð‰þ b)6ÒAKL8Uk\½aebf™eÈbê]2W­N‘D9l,â³2žóVåŠ×žÊ»¾4´.«è£yž ›Ÿ™RšÉ¡p¨Ú°åºPÆéÒoà’îý¤ úÇ'Ä4µ@MKiTÅ[OaÖd[fÅe$c‚^ïWœO¦EI:¼-G ¬õÁæáØÞËÜ¿2µ¬Œ¤ïžH›¯™&š«œ;¡­§ó¯Ð¹ÅœÑ ß$íŸû3 n&„3?PJ“S[Ö`•dHfñe|c_­XƒP¸Fx; /£!—Œö#èBÚÍÁ1¶Û¬6¥jŸŒ›Ã™ý™Yœª ù¦¯Ç¸êÃSШݷë+ú½%%@2j>KIºRpZ\`Jd7ffÔc—_fYhQÃG©=HHÙQÁY×_df.f#d`ZHRÌHÓ=ž1c$opùÿêûܪÏWÃ>¸—®œ¦g ,œò™È™¶›¥ŸŽ¥J­±¶—ÁÁÍíÚÝèA÷ÔMT"±/<à2Â%Øy æúlìZÞöÐ…ÄK¹{¯S§ñ ‚œš¶™l›)Ÿâ¤n¬°µpÀ}Ì‘ÙsçËõcÙø a.å:.FPQXÆ^TcÚeSf¶dau[úSÔJ@)4'Eí Xüßí¹ßDÒ·ÅYºf°¨¡Üœ9š§™)›²ž:¤—«³´L¿;Ë9Øæ\ôén-®9E&OW:^ôb±e_f÷dˆa\ÒTËKFAc5t(¬` ÐýKï!áÓìÆn»R±Ñ¨¢;ešž™êšAž–£Èª´³/¾ûÉãÖžäçòvû0Å+y8D6NÍV£]’b„edf5eóa¼\ŸUÆLcBŸ6Ì)Ó Eÿ¼ð…âãÔ"ȇ¼B²—©ª¢Ÿ˜š™™±šÔù¢ø©Á²½ÀÈŽÕ6ãvñŠÈt*?7ðBAMV ]+bOegfie`bV]kV»M|CÝ7+@¾,òìã6Ö^É ½9³`ªF£ žÌš™zšp[¢5©É±ù»ˆÇ8ÔÔáðŠþ b)6ÎANL7Uj\¿aecfšeÅbí]1W¬N”D9n,â´/£óOåךʽ¾3´.«é£xž › ™Pš É¡o¨Ü°âºRÆéÒnà”îý¥ úÆ'Æ4³@NKiTÅ[OaÖdZfÆe$cƒ^îWžO¢EM:º-H !§õ¼ææØÛËÞ¿0µ¬Ž¤ížJ›­™%š®œ9¡®§ó¯Î¹"Å—Ñß"í û3 Žo&ƒ3?PJ’S[Ö`“dLfíe~c_©X‰P±F;/ª!†ö'è@ÚÍÁ.¶Þ¬4¥jŸ›Á™šVœ­ ö¦¯È¸éÃTШݵë.úº)%B2h>OI¶RsZY`Kd:f fÙc’_jYfQÅG¦¸–®œ¦h ,œñ™É™µ›¦ŸŽ¥I­±¶˜ÁÀÍíÚÞè>÷ÚFY"®/<;GøP YT_ªcf?frd˜`ÈZ(SËI?Ý2Ä%Øx çúkì[ÞöÐ…ÄI¹¯O§õ œš´™m›*Ÿà¤q¬¬µtÀzÌ“ÙpçÏõ_Ýô e.á:1F PQXÉ^PcÝeQf·das[þSÐJ!@&4'Gë [üÜíºßEÒµÅ[ºf° ¨‚¡Úœ:š§™(›³ž:¤—«³´L¿:Ë<Øæ_ôèn’-¯9E$O’W7^õb²e]fúd„a\ÏTÎKCAe5s(­_ ÑýJï á’ÓëÆo»Q±Ñ¨¢;fš™êšCž“£Êª³³/¾ýÉàÖ äæòwû/Å+z8D5NÎV¢]“bƒedf5eôa¼\UÈLaB¡6Ë)Ñ Gÿ»ð…âäÔ"È…¼C²™©¦¢¥‘šž™®š×õ¢þ©º²½»È’Õ3ãyñþÿ‹Ér*B7íBCMV ]-bMehfheabV]iV¾MxCâ7+€A¼.òëã6Ö_ÉŸ½8³cªC£ žËšœ™}šm]¢4©É±ú»†Ç;ÔÑáð‹þ c)6ÑAKL:Uh\ÀaeafeÃbî]0W­N“D9n,â³1 óTå‹×žÊº¾5´/«å£}ž›¤™Nš Ê¡m¨Ý°âºSÆèÒoà’îý¥ úÇ'Ä4´@OKgTÈ[JaÛdVfÊe"c‚^ïWO¤EK:¼-E $¦õ½æäØÝËÝ¿0µ¬Œ¤ðžF›±™#š¯œ7¡±§ï¯Ô¹ÅžÑ ß%í¡û0 ’j&‡3?SJS![Ô`•dJfíe€c_­X„PµF{; /£!–Šö$èBÚÍÁ1¶Ú¬7¥iŸ›Á™šVœ® ô¦ ¯Â¸ïÃOЬݳë-ú½$%=2l>KIºRpZ[`Kd7ffÔc˜_cYmQ½G®¦(®¸·ÂÂÏNÜEê¸øI¸¶#ø0@=GHØQÃYÖ_df-f#d`ZKRÈH×=›1e$noùëùÜ«ÏXÃ<¸™®™¦k (œö™Å™·›¦Ÿ¥I­³¶–ÁÀÍðÚØèG÷ÐNT"±/<=GõP YP_­cüeDfnd›`ÆZ'SÎIþ>â2¿%Üv çúlìZÞöІÄH¹¯P§ô €œš¸™j›,Ÿà¤o¬®µsÀyÌ–ÙnçÏõ`Ûö d.ã:-FPOXÈ^ScÚeSf¶dar[þSÑJ@)4'Hê [üÝíºßEÒ´Å\ºd°¨€¡Ûœ9š§™(›´ž9¤™«°´N¿:Ë:Øæ\ôèp-¯9E&OW9^óbµe\fùd…a\ÐTÎKCAd5t(­_ ÏýMïá‘ÓîÆj»U±Ï¨¢9hš›™ëšCž’£Ìª±³1¾úÉãÖžäèòuû0Å+y8D4NÏV¡]”b‚eff2e÷a¹\ UÇL_B¦6Ä)Í Gÿ½ðƒâäÔ$ȃ¼D²—©©¢¡–š™™±šÖö¢û©¿²½ÁÈŒÕ8ãvñÿÿŠÊs*?7ðB@MV ])bQeefjeabT]mV¸MCÜ7+€>¿,òëã8Ö]É ½8³aªF£ žÏš˜™€šk^¢3©Ë±ø»ˆÇ8ÔÔáðŒþ d)6ÓAJL9Ui\Àaeef™eÅbî]/W®N’D9k,å°4óWå‰×ŸÊº¾3´1«æ£zž › ™Pš Ë¡m¨Ü°äºOÆìÒmà‘îý¡ ýÄ'Æ4´@NKhTÇ[KaÚdXfÇe%c^òWšO§EH:¾-D $¦õ»ææØÚËà¿/µ¬¤ìžL›¬™%š¯œ7¡±§ð¯Ð¹ÅœÑ ß#í¡û1 ‘l&„3‘?NJ”S[Õ`–dHfïec_®X‚P¸Fy; /¤!•‰ö%è@ÚÍÁ2¶Ù¬8¥hŸŽ›Á™šVœ­ ô¦ ¯Á¸ðÃNЬݳë.ú»&%=2m>II»RpZZ`Md4ffÓc—_fYiQÁG«=IH×QÁYÚ_üc f'f(d`ZGRÌHÓ=ž1d$nqùüêþܨÏZÃ;¸™®™¦j ,œð™Ë™³›§ŸŽ¥H­³¶–ÁÂÍëÚÞèA÷ÕLT"°/<â2Á%Ùy åúlì\ÞóЉÄF¹¯R§ð …œš¹™i›-ŸÞ¤s¬«µtÀyÌ•ÙoçÏõ`Û÷ b.ä:-FPOXÈ^RcÛeRf¸dat[þSÏJ#@$4'Eì [üÛí½ß@ÒºÅWºh°¨¡Ýœ8š¨™'›´ž9¤™«±´L¿<Ë8ØæZôël“-°9E&OW8^öb°e_fød†a\ÑTÍKCAf5q(°\ ÓýIï"áÓìÆm»S±Ñ¨¢=dš™íš=žš£Åª¶³.¾ûÉäÖ›äìòqÿ,Ç+y8D6NÌV¤]‘b„eef3e÷a¸\ UÇLaB¢6Ê)Õ Bÿ¿ðƒâãÔ&ȼG²”©ª¢¢”šœ™¯šÖö¢ü©½²½ÀÈÕ7ãvñÿÿŒÇv*=7ðBAMV ],bMehfhebbT]lVºM}CÜ7+}Cº/òëã5ÖbÉš½=³_ªF£ žÍ𙙀šk^¢3©Ê±ù»‡Ç:ÔÒáðþ e)6ÏAOL3Up\¹ae^fžeÃbï].W¯N‘D9m,â³0£óOå’זʾ-´5«ã£}ž›£™Mš È¡p¨Ú°åºNÆíÒkà•îý¤ ûÅ'Ç4±@QKfTÇ[MaØdXfÉe!c…^ìWŸO£EK:½-D %¤õ¹æéØØËá¿-µ¬Œ¤îžI›®™%š®œ8¡¯§ñ¯Ó¹ÅŸÑß'íŸû2 ‘k&‡3Œ?SJS [Õ`•dJfíec_­X„P¶Fz; /¤!•Šö#èCÚÍÁ1¶Ù¬9¥fŸ‘›¾™šTœ® õ¦ ¯Á¸ðÃNЫݷë'úà %>2j>OI´RvZU`Qd2ffÓc—_fYiQÁG¬¸˜®š¦h .œî™Î™°›©ŸŒ¥J­²¶—ÁÀÍîÚÛèB÷ÖJV"°/â2Â%Øz äúmìZÞ÷ЃÄL¹{¯S§ñ ƒœš¸™i›-Ÿß¤p¬¯µoÀÌÙtçÌõ`Üõ e.â:/FPRXÅ^Vc×eVf´dar[þSÐJ#@#4'Bî ZüÛí¾ßAÒ·ÅZºe°¨€¡Úœ;š¥™)›µž6¤œ«¯´L¿>Ë6Ø æYôìl’-¬9 E"O“W6^öb²e\fûdƒa\ÎTÐK?Ak5l(³\ ÑýLïá‘ÓîÆj»V±Í¨¢8hš›™ìš@ž—£Çª¶³,¾ýÉâÖžäèòuû1Â+|8D8NËV¥]b‡ebf6eôa¹\¢UÃLfB6Í)Ô Dÿ½ð„âäÔ"ȇ¼@²›©¥¢¤”š›™°šÕø¢ú©¾²½¿ÈÕ5ãwñÿÿŒÇu*=7òB?MV]+bPeffie`bW]hV¾M{CÜ7+zEº/òêã7Ö_ɽ<³^ªH£ žÍšœ™{šp[¢5©É±ù»‡Ç:ÔÒáð‹þ d)6ÑALL8Uk\¼ae`feÄbì]2W«N•D9n,á´0£óOåיʿ¾2´.«ê£už›š™UšÌ¡l¨Þ°áºRÆêÒlà–îý¥ ûÄ'É4°@RKdTÊ[JaÛdVfÉe#c^ðWœO¥EJ:¼-E $§õ½æäØÝËÝ¿1µ¬¤îžJ›¬™'š¬œ9¡±§î¯Õ¹Å¡Ñß(ížû3 m&…3Ž?SJŽS"[Ô`•dKfìe€c_­X…PµF|;/¨!’†ö(è=Ú"ÍÁ2¶Û¬6¥iŸŽ›À™šUœ® ô¦ ¯Ã¸îÃOЫݵë+ú¿#%>2j>MI¸RrZY`Md4ffÒc—_gYgQÃG«¦(®¸·ÁÂÏKÜIê´øM´¹#ö0B=EHÚQÀYÙ_þcf*f&d`ZGRÎHÑ=¡1_$srùÿêùܬÏWÃ=¸˜®š¦j *œó™È™¶›¥ŸŽ¥I­²¶—ÁÀÍîÚÜèB÷ÔKV"°/<á2Ã%Ö{ äúmì[ÞôЇÄH¹¯O§õ ~œš³™n›'Ÿä¤m¬±µpÀ{Ì”ÙoçÏõ`Ûö d.â:/FPPXÈ^RcÜePfºdaw[úSÓJ @&4'Fë [üÜí»ßCÒ·ÅZºf° ¨¡Üœ7š«™#›¸ž5¤œ«®´P¿8Ë<Øæ]ôén‘-­9E$O‘W8^ôb²e^fød†a\ÑTÌKFAa5v(«a ÏýMïá‘ÓîÆj»W±Í¨¢;eš™ìš?ž˜£Æª¶³-¾ýÉáÖŸäçòvû/Æ+x8 D3NÐV ]–beif0eøa¸\¡UÆLbB¡6É)Ñ Fÿ½ðƒâåÔ!ȇ¼B²—©ª¢Ÿ—š›™­šÚò¢ÿ©»²½¾ÈÕ6ãuñˆÌp*B7íBDMV ])bQeefke^bX]iV¼M|CÜ7+zF¸0òëã6Ö^É ½7³dªC£ žËš™|šm^¢2©Ë±ù»†Ç:ÔÔáðþ f)6ÐAML7Uj\¿aecfšeÄbï]/W®N’D9o,à¶-¤óPåךʾ¾1´1«æ£zž › ™QšΡi¨à°áºQÆëÒlà”îý£ ûÅ'Ç4²@PKgTÇ[LaÙdXfÇe&c~^óW™O¦EK:»-F #¥õºææØÜËÜ¿2µ¬¤ïžG›¯™&š«œ<¡¬§ô¯Ï¹ÅšÑß!í£û/ ‘n&‚3’?MJ•S[Ø`’dMfëec _­X†P´F|; /¨!„ö(è@ÚÍÁ0¶Û¬7¥hŸŽ›Á™ÿ™Wœ¬ ö¦ ¯Â¸ïÃPШݺë%úÃ"%@2i>MI·RtZX`Nd4ffÖc•_hYgQÂG«=JHÕQÅYÔ_df-f$d`ZHRÌHÔ=œ1f$kmùëûܪÏWÃ?¸–®›¦i ,œï™Í™°›¬Ÿˆ¥N­­¶›Á¾ÍïÚÜèA÷ÕKU"²/<>GöP YS_©cf?fsd–`ËZ#SÑIý>á2Á%Ùy æúlìZÞöЄÄM¹z¯S§ñ ‚œš¶™l›)Ÿã¤l¬²µoÀ}Ì’ÙpçÏõ`Úø a.å:.FPRXÆ^TcÙeUf´daq[ÿSÐJ @(4'Ié [üÝíºßDÒ¶Å[ºd°¨¡Üœ:š¥™*›²ž:¤˜«²´K¿=Ë8Øæ[ôêm“-°9E#O“W6^öb±e_föd‰a\ÒTÎKAAh5p(¯_ ÏýMïá“ÓëÆm»T±Î¨¢9fšž™êšAž—£Åª¸³,¾ýÉáÖ äåòxú/Ç+w8D6NÌV¥]‘bƒeef4eõa»\žUÈL`B£6È)Ò Dÿ¾ð‚âæÔ"È…¼C²—©©¢¢”šœ™®šØõ¢ü©¾²½ÂÈŒÕ7ãwñþÿŒÈs*@7ïBBMV ](bReefje`bV]iV¾MyCß7+}Cº0òèã:Ö\ÉŸ½;³_ªF£ žÌšœ™}šm\¢5©É±ú»…Ç<ÔÐáð‰þ a)6ÔAIL9Uk\½aeaf›eÅbî]0W¬N”D9p,àµ-¦óMå’יʼ¾5´-«è£{ž›¤™Mš È¡p¨Û°äºPÆêÒmà•îý¦ ùÆ'Ç4²@NKiTÅ[NaØdXfÈe$c^óW˜OªEF:¿-C $¨õÀæáØßËÜ¿0µ¬‹¤ðžG›¯™%š¯œ5¡³§î¯Ô¹Å›Ñ ß&ížû5 o&‚3‘?PJ‘S![Ò`™dFfñe|c_¬X…P´F|; /¦!“†ö)è<Ú!ÍÁ0¶Ý¬5¥hŸ›¾™šVœ« ø¦¯Æ¸ìÃPЫݵë+ú¿#%=2l>KI¹RrZY`Ld7f f×c”_iYfQÄG¨¦)®··ÃÂÏNÜDê»øF»²#ü0==IHØQÁYØ_df,f%d`ZHRÌHÔ=1c$oqùþêúܬÏWÃ=¸˜®™¦k *œò™É™´›¨ŸŒ¥J­²¶•ÁÃÍíÚÛèC÷ÔJX"®/<=GöP YR_¬cýeCfod™`ÉZ&SÎIþ>á2Á%Úx æúlìZÞ÷ЃÄM¹z¯S§ò €œš²™p›&Ÿä¤n¬®µsÀzÌ”ÙpçÍõbÙù a.ä:.FPQXÇ^ScÚeTfµdas[üSÓJ@'4'Eì ZüÝíºßEÒ´Å]ºc°¨~¡Üœ:š¦™)›³ž9¤™«°´N¿:Ë:Øæ\ôèpŽ-¬9E'OW<^ñb´e]fùd…a\ÎTÏKBAf5r(¯] ÑýLïá”ÓêÆn»R±Ñ¨¢MI¸RsZX`Nd3ffÒcš_bYlQ¿G«GõP YR_«cýeDfndš`ÉZ#SÒIü>â2À%Ùz äúnìYÞõЇÄI¹|¯S§ð ƒœš´™m›(Ÿã¤o¬®µrÀ{Ì“ÙqçÌõcÙ÷ d.à:2F PQXÈ^RcÛeRf¸dax[øSÕJ@&4'Bð WüÞíºßDÒ¶Å[ºe°¨¡Ýœ7š©™(›²ž;¤–«³´L¿;Ë:ØæZôìk“-­9 E!O”W5^÷b°e`föd‡a\ÎTÐKBAe5s(¬b ÍýOïá”ÓêÆo»Q±Ò¨¢>cšŸ™éšBž•£Éª´³/¾úÉäÖäèòuü/Ä+|8D8NÌV¢]•beff3eõa»\ŸUÆLbB¡6Ê)Ò Dÿ¿ð‚âäÔ%È‚¼F²•©ª¢¡•šš™²šÓù¢ù©¿²½¿ÈÕ8ãtñ‰Êq*C7êBGMV ]+bNehfie^bY]gV¿MzCÜ7+yE»,òîã4Ö_É¡½5³eªB£žËš›™}šm_¢1©Ì±÷»ˆÇ:ÔÒáðŒþ c)6ÑALL7Uk\¾aebf›eÄbï].W¯N’D9o,ß·-¤óPåמʺ¾5´.«ç£zž ›¡™Oš É¡n¨Ý°âºQÆëÒkà–îý¨ öË'Á4¶@MKhTÈ[KaÙdXfÈe#c‚^ïWœO¦EI:½-E $¤õ¹æçØÛËÞ¿0µ¬Œ¤ïžI›®™$š¯œ8¡¯§ó¯Î¹ ÅœÑ ß&íŸû2 m&ƒ3’?MJ–S[Ø`”dHfòe{c_«X†P³F~;/©!‘†ö'è@ÚÍÁ1¶Ú¬8¥gŸ›¾™šVœ¬ ö¦ ¯Â¸ðÃMЭݴë+ú¿"%<2l>LI·RtZX`Ld8f fÖc•_gYhQÄG§ã2¾%Üv èújì]ÞóЇÄJ¹{¯U§î …œš·™k›*Ÿâ¤n¬¯µrÀzÌ–ÙmçÑõ]ßò g.à:1F PRXÆ^ScÛeRf·das[üSÒJ @&4'Bï WüßíºßCÒ¸ÅWºi° ¨‚¡Ûœ7šª™&›µž8¤™«°´O¿8Ë=Øæ`ôåq-­9E#OW;^ðb·e[fùd†a\ÒTÍKDAc5s(¯] ÓýIï á’ÓëÆo»P±Ó¨¢=dšŸ™çšFž‘£Ëªµ³+¾ÊÞÖ¡äçòuý,É+u8 D4NÍV£]’bƒeff3eôa¼\žUÈL`B¢6É)Ñ Fÿ¼ð„âäÔ"Ȇ¼C²—©©¢ —šš™°šÖõ¢ý©½²½ÁÈ‹Õ:ãsñ‰Ét*?7ïBCMV ],bNegfje_bW]iV½M{CÝ7+{D».òëã7Ö]É¡½7³cªD£ žËšž™yšrX¢8©Æ±ü»…Ç;ÔÑáð‹þ d)6ÐAML6Uk\¿aebfœeÃbî]1W¬N”D9m,â´0¢óPåטÊÁ¾.´4«ã£|ž›¡™Oš È¡o¨Ý°àºUÆæÒqà‘îý¥ úÆ'Ç4°@QKfTÈ[LaØdYfÇe$c^ðWœO¥EJ:½-D %¤õºæçØÚËß¿0µ¬¤ëžL›¬™%š®œ9¡®§ó¯Ï¹ Å›Ñ ß%íŸû3 m&…3?PJ‘S[×`“dLfëec _®XƒP¸Fx; /£!–ˆö'è>Ú!ÍÁ3¶Ù¬8¥hŸŽ›Á™þ™Yœ« ö¦ ¯Â¸ïÃPЩݷë*ú¿#%>2k>LI¸RsZX`Od2ffÔc•_iYeQÅG¨¸—®œ¦g -œð™Ê™´›¨ŸŒ¥I­³¶•ÁÃÍìÚÜèA÷×IV"±/<@GôP YS_«cþeCfmd`ÅZ(SÎIý>ã2¿%Úz ãúpìVÞùЄÄJ¹~¯P§ó œš·™k›)Ÿã¤m¬±µpÀ{Ì”ÙoçÐõ^Þó f.á:/FPPXÈ^RcÚeTfµdar[ýSÑJ!@%4'Dë ]üÙí¾ßAÒ·Å[ºd°¨}¡Þœ8š§™)›³ž9¤™«±´K¿>Ë7ØæYôìk”-®9E$O‘W8^ôb³e]fúd‚a\ÌTÑKAAf5q(°] ÑýLïá•ÓéÆo»Q±Ò¨¢=cšŸ™éšCž”£Êª²³1¾ùÉåÖ›äëòr*É+v8 D5NÌV¤]’bƒeef4eóa¾\œUÉL`B¢6É)Ñ Fÿ¼ð…ââÔ%ȃ¼E²–©©¢¢”šœ™®šØõ¢û©À²½ÄȉÕ:ãuñÿÿÆu*>7ðBBMV ]+bNehfhebbT]lVºM|CÝ7+}C¹1òèã9Ö]ÉŸ½9³aªF£ žÎš™™~šn[¢6©È±ú»‡Ç8ÔÔáðŒþ c)6ÐALL7Uk\¿aegf”eËbê]0W¯ND9l,ã²1¡óRåŽ×›Ê½¾2´0«ç£yž › ™Oš È¡o¨Ü°ãºQÆêÒmà“îý¤ ûÄ'È4°@SKeTÆ[OaÕd]fÄe&c~^óWšO¦EJ:¼-F "¨õ¼æçØÙËá¿-µ¬‹¤ðžH›­™'š¬œ:¡¯§ð¯Ò¹Å›Ñ ß"í¢û1 m&…3?TJS[Ø`dPféec_­X„P¶F{; /§!‘ˆö%èBÚÍÁ.¶Ý¬5¥iŸ›¼™šPœ² ò¦ ¯Ä¸ìÃRШݷë+ú½&%B2g>PIµRuZW`Nd4ffÓc˜_eYiQÂG©=GHÚQ¿YÛ_ücf*f%d`ZJRÉHÖ=œ1e$moùëøÜ¬ÏXÃ;¸œ®•¦m )œô™Æ™¸›£Ÿ¥I­°¶˜ÁÁÍìÚÞè@÷ÕLU"°/<=GöP YR_«cýeDfnd›`ÇZ&SÏIþ>à2Ã%×z åúlì[ÞöЄÄL¹z¯T§ñ œš³™o›&Ÿå¤l¬±µpÀ|Ì“ÙpçÎõaÚø a.å:-FPSXÄ^Vc×eUfµdao[TÍJ#@&4'Eë \üÛí¼ßCÒµÅ]ºc°¨¡Ýœ8š§™(›³ž:¤™«¯´O¿9Ë:ØæXôîi•-¯9E#O’W7^õb²e^fød…a\ÏTÎKCAd5t(¬b ÌýPïá•ÓêÆm»T±Ï¨¢:ešž™êšAž—£Æª·³-¾ûÉäÖœäêòtü0Ä+y8 D3NÑVž]—beif0eøa¸\¡UÅLcB¡6Ê)Ó Dÿ¾ð„ââÔ&ȼG²•©©¢¢”šœ™¯šÖ÷¢ú©À²½ÂÈŒÕ7ãwñþÿŒÈs*@7îBDMV ])bPeffke]bZ]fV¿MyCß7+}C¹1òèã:Ö\ÉŸ½:³_ªH£ žÍšœ™{šo\¢4©Ê±ú»„Ç>ÔÎáð‰þ d)6ÐALL7Uk\½aebfšeÆbë]3W«N”D9l,ã²3žóUå‹×œÊ¾¾0´2«å£|ž›¤™Lš Ç¡p¨Û°ãºRÆéÒnà’îý¤ üÄ'Ç4±@QKfTÉ[JaÚdWfÈe$c^ðW›O¦EI:¾-C &£õ»ææØÚËà¿-µ¬ˆ¤óžD›³™ š²œ5¡²§ð¯Ð¹ Å™Ñ ß$ížû5 Œp&„3Ž?QJ’S[×`“dLfëe‚c _°XƒP¶F{; /¨!‘…ö(è?ÚÍÁ/¶Ü¬6¥iŸ›Â™þ™Xœ¬ õ¦ ¯Ä¸ìÃSЦݹë)ú¿$%>2k>MI¶RuZW`Md7f fÖc•_hYgQÃG©÷ØGZ"¬/<;GõPYO_®cüeCfpd˜`ÊZ$SÏI?Ý2Å%Ö{ åúkì\ÞôЇÄI¹}¯Q§ó œš·™j›*Ÿã¤m¬°µqÀ{Ì”ÙoçÐõ\áñ g.á:-FPLXÌ^OcÜeSfµdat[ûSÓJ@'4'Eì Yüßí¸ßFÒµÅYºh° ¨‚¡Ûœ8šª™$›·ž6¤›«°´M¿;Ë9ØæZôël“-®9E"O“W7^öb±e^f÷dˆa\ÒTÌKDAe5r(®_ ÐýKï!áÓíÆl»S±Ñ¨¢=dšž™éšCž“£Ëª³³.¾ýÉàÖ äçòuý.Å+{8D7NÍV¢]”b‚eef4eôa¼\UÊL]B¦6Æ)Ñ Eÿ½ð…ââÔ%È‚¼F²•©«¢Ÿ˜š–™µšÒù¢ú©½²½¿ÈŽÕ7ãtñŠÈt*?7ïBBMV]/bKejfgebbU]iV¾MyCà7+~A½+òïã4Ö`Éž½8³cªC£žÇš¡™xšp\¢4©Ê±ù»‡Ç9ÔÔáð‹þ a)6ÒALL7Uk\¾aebfšeÅbî]0W­N’D9n,â²2 óSåכʾ¾1´1«å£|ž›¢™Nš Æ¡r¨Ù°åºPÆêÒmà•îý¨ ÷È'Æ4±@PKhTÅ[PaÔd\fÅe%c^ðW›O¦EI:¾-C &£õ¹æçØÛËß¿/µ¬¤îžJ›­™%š¯œ6¡²§ï¯Ó¹Å›Ñ ß&íû5 o&„3Ž?RJS![Ó`–dKfêe„c _±XƒP´F;/©!‘ˆö%èAÚÍÁ0¶Û¬7¥hŸ›¿™šVœ­ õ¦ ¯Ä¸ìÃRЩݵë,ú¾$%?2i>MIºRoZ]`Hd9f f×c”_hYgQÂG¬=FHÜQ½YÛ_ýcf,f#d`ZJRÊHÕ=1c$ptùüêüÜ«ÏVÃ>¸˜®™¦k *œò™É™µ›¦ŸŽ¥I­±¶˜ÁÀÍîÚÜèA÷ÕKU"±/<à2Á%Úx æúmìXÞùЂÄM¹{¯Q§ô €œš¹™e›2ŸÚ¤t¬¬µsÀzÌ•ÙnçÐõ_Üö c.ã:.FPPXÇ^ScÚeTfµdau[úSÔJ@&4'Fë \üÚí½ßAÒ¹ÅYºe°¨¡Ûœ<š£™+›²ž9¤›«­´Q¿8Ë:ØæZôëm‘-­9E%OW:^ób³e^fød…a\ÑTÍKCAe5q(°^ ÐýLïá’ÓëÆo»P±Ó¨¢OI¸RpZ\`Jd9f fØc”_gYjQ¿G­=IH×QÂYØ_þcf+f%d`ZIRÊHÕ=œ1f$lnùë÷Ü®ÏTÃA¸•®›¦i +œó™Ç™·›£Ÿ‘¥G­³¶—Á¿ÍïÚÛèB÷ÖHY"­/<á2Á%Úw èúiì^ÞóІÄL¹y¯V§ï ‚œšµ™l›+Ÿß¤p¬°µoÀ~Ì‘ÙqçÏõ^Þó g.à:0FPRXÅ^Vc×eVf³das[ýSÐJ"@#4'Cí YüÝíºßFÒ´Å[ºe°¨€¡Üœ8š¨™(›³ž9¤™«°´N¿:Ë:Øæ[ôëk•-³9E(OŽW9^õb±e^fùd…a\ÑTÍKCAf5q(®` ÏýMïá•ÓèÆq»P±Ò¨¢:gšœ™ëšBž”£Éªµ³-¾üÉäÖ›äëòsý.Æ+x8 D4NÎV£]‘b…ecf5eõaº\ UÅLcB¡6É)Ï Hÿºð†ââÔ$È…¼B²˜©©¢ —š™™±šÖõ¢ý©¼²½ÀÈŒÕ8ãtñŠÈt*>7òB?MV]+bOehffeebQ]mV»MzCá7+€@¼/òêã8Ö]ÉŸ½9³bªD£ žÌš›™}šm^¢2©Ì±÷»‡Ç;ÔÑáðŒþ c)6ÔAJL7Um\»ae_fžeÁbò]*W´NŒD9h,æ°3 óQåיʾ¾2´0«æ£|ž›¤™Nš Ë¡k¨ß°áºRÆêÒmà“îý£ üÅ'Æ4²@PKgTÇ[NaÕd\fÄe'c^òW˜O©EH:¾-D #¦õ¹æèØØËá¿/µ¬¤ížJ›®™%š®œ8¡°§ð¯Ò¹ÅÑ ß$í û3 Žo&ƒ3?SJŽS"[Ô`•dJfîe~c_­X„P¶F{; /¨!‘…ö)è=Ú!ÍÁ1¶Û¬7¥hŸ›¿™šXœ« ÷¦¯Æ¸ìÃQЩݷë(úÃ%>2j>NI¶RsZY`Md6ffÕc–_hYfQÄG¨=HHØQÂY×_df/f!d`ZGRÎHÑ=Ÿ1c$osùüêþܨÏYÃ<¸˜®›¦i +œò™É™´›¨ŸŒ¥I­³¶–ÁÁÍîÚÚèD÷ÓMS"²/<>GöP YQ_­cýeBfpd˜`ËZ#SÑIû>ã2Á%Ùy åúlì\ÞôЇÄI¹|¯T§ï …œš¸™j›+Ÿá¤o¬¯µqÀ{Ì”ÙoçÏõ`Û÷ b.å:+FPLXË^PcÜeRf·das[ýSÐJ"@&4'Gê \üÛí½ß@ÒºÅWºh°¨€¡Úœ;š¦™)›³ž9¤˜«²´L¿;Ë:ØæZôíi–-°9E$O‘W8^ôb´e[fûdƒa\ÎTÏKBAe5u(ªb ÍýNïá‘ÓíÆl»S±Ò¨¢@aš ™éšAž˜£Åª¸³+¾þÉáÖŸäçòwù2Ã+z8D4NÏV¡]“b„edf4eõaº\ UÇL`B£6È)Ò Eÿ¼ð„âäÔ#Ȇ¼A²™©§¢£•šš™±šÔø¢û©¾²½ÀÈÕ8ãtñ‰Ét*>7ðBBMV],bNehfie_bW]hV¿MzCÜ7+xH·1òèã9Ö]É ½8³bªC£žÊšœ™~šjb¢.©Î±÷»ˆÇ:ÔÒáðŒþ d)6ÐALL8Uj\¿aedf™eÆbí]0W­N“D9m,ã²1¡óRåŽ×šÊ¾¾2´/«è£xž › ™QšË¡m¨Ü°äºPÆëÒmà“îý¥ úÅ'È4¯@SKfTÆ[MaØdXfÉe#c^ðW›O¦EJ:¼-F "¨õ¼æçØØËâ¿,µ¬‹¤ïžH›®™&š­œ8¡±§ï¯Ó¹ÅœÑ ß%í û2 m&…3Ž?SJŽS"[Ô`•dJfíe€c _¯X‚P¸Fx; /¦!’…ö(è?ÚÍÁ/¶Ý¬5¥iŸ›¾™šSœ° ó¦ ¯Ã¸íÃRЧݹë(úÁ"%>2k>LI¸RrZZ`Kd8f f×c–_fYiQÁGªã2¾%Ýv çúkì\ÞóЉÄG¹~¯Q§ò ‚œš¶™k›*Ÿâ¤n¬°µpÀ|Ì“ÙqçÌõbÚ÷ d.á:0F PSXÆ^ScÛeRf¶daq[ÿSÐJ @(4'Gë [üÚí¾ß@Ò¹ÅZºc°¨}¡Ýœ:š¥™+›°ž<¤—«³´J¿>Ë5Ø æXôìk”-²9E'OŽW;^òb´e]fød†a\ÑTÎKBAe5r(®a ÎýLïá‘ÓîÆk»U±Í¨¢9fš™êšBž–£Çªµ³.¾üÉâÖžäèòvú1Ã+z8 D3NÐVŸ]–b€ehf1e÷a¹\ UÆLbB¡6Ê)Ó Dÿ½ð…ââÔ%ȃ¼C²™©§¢¢–š™™±šÖõ¢ý©¾²½ÃÈŠÕ:ãtñ‹Èt*?7ïBBMV ]+bOegfhebbT]lVºM|CÝ7+}Cº0òçã;Ö[É¢½6³dªC£ žÎš™™šm]¢3©Ê±ù»ˆÇ8ÔÕáðŒþ a)6ÔAHL;Uh\¿ae_fŸeÀbò]-W®N“D9n,â³0£óOå‘טʿ¾1´1«æ£zž›¡™Pš È¡p¨Ú°äºQÆêÒmà”îý§ ùÆ'Æ4²@PKhTÅ[Na×dYfÈe#c^ñWšO§EH:¾-E #¦õ»æçØÙËà¿/µ¬¤ížK›¬™'š«œ;¡®§ñ¯Ó¹Å Ñß%í¡û/ “k&†3Ž?QJ‘S [Õ`”dKfíe€c _®XƒP¸Fy; /¦!’†ö'è@ÚÍÁ,¶ß¬4¥jŸŽ›¿™šTœ° ò¦ ¯Á¸ñÃMЬݳë.ú»(%A2h>OIµRvZV`Nd5ffÖc”_hYhQÁG¬à2Â%Ùy åúmìZÞõІÄK¹z¯U§ð œš²™n›*Ÿà¤p¬®µqÀ}Ì’ÙpçÏõ^ßó e.â:.FPNXÊ^PcÝeQf·dau[ûSÓJ@&4'Eì YüÝí¼ßBÒ¹ÅVºi° ¨ƒ¡Ùœ;š¥™*›²ž;¤–«´´J¿<Ë;Øæ_ôæq-­9E%O‘W8^õb°e`f÷d†a\ÌTÓK>Ai5p(®` ÏýLï á‘ÓëÆo»Q±Ò¨¢7ðBBMV ](bReefke_bV]iV¾M{CÜ7+zEº.òìã5ÖaÉ›½=³]ªJ£žÑš—™šj_¢2©Ë±ù»…Ç=ÔÏáðˆþ a)6ÒAKL8Uj\Àaedf›eÃbð].W®N“D9n,á´0¢óQåŽ×›Ê½¾2´0«æ£{ž›¢™Mš Æ¡q¨Û°ãºQÆêÒmà”îý¤ úÇ'Å4³@PKeTÊ[JaÚdWfÉe"c‚^ñW™O©EF:À-B &¤õ¹æèØÚËß¿/µ¬¤îžJ›¬™'š«œ<¡¬§ô¯Î¹ Å›Ñ ß$í û2 n&ƒ3?QJS![Ó`—dHfïec _¯XƒP¶F{; /¥!–Œö!èDÚÍÁ1¶Ù¬9¥fŸ‘›½™šTœ® õ¦ ¯Â¸ïÃOЬݳë-ú½$%<2k>NI¶RuZW`Ld8f fØc“_iYgQÂGª=HHØQÃYÖ_df,f&d`ZFRÌHÔ=1d$npùëùܬÏVÃ>¸˜®š¦h -œð™Ë™³›¨ŸŒ¥J­²¶–ÁÂÍíÚÛèC÷ÔKU"²/ß2Å%Ô~ àúqìXÞöІÄJ¹{¯U§î …œš·™k›*Ÿã¤l¬±µpÀ|Ì”ÙoçÏõ_Ýô e.â:/FPSXÄ^Vc×eVf´dar[ýSÑJ!@%4'Dì ZüÜí¼ßCÒ·ÅXºh° ¨€¡Ýœ7š©™'›³ž:¤˜«²´L¿<Ë8Øæ[ôên‘-®9E$O‘W7^öb±e_f÷d†a\ÏTÏKBAe5t(«b ÍýNïá“ÓêÆp»O±Ó¨¢¿,òìã8ÖZɤ½4³fªA£žÈš ™xšq[¢4©Ê±ù»†Ç;ÔÒáðŽþ f)6ÑAKL9Uh\Àae`fžeÂbï]/W®N’D9m,à·,¦óNåךʽ¾3´/«ç£{ž›¤™Mš Ê¡m¨Ý°ãºPÆëÒlà–îý§ øÇ'Ç4±@OKjTÂ[RaÕdYfÈe"cƒ^ïWœO¥EI:¿-A (¢õºææØÛËÞ¿0µ¬¤ížK›«™)š©œ<¡®§ñ¯Ò¹Å›Ñ ß!í£û0 ‘l&…3?PJ’S [Ô`—dFfñe~c_®X„P´F};/¨!’‡ö'è?ÚÍÁ/¶Ý¬5¥hŸ‘›¼™šQœ² ñ¦ ¯Á¸ïÃOЫݵë+ú¿#%B2f>QIµRrZ[`Kd7ffÕc•_jYcQÈG¤å2¿%Úx åúnìYÞ÷ЄÄJ¹~¯P§ô €œšµ™l›*Ÿâ¤n¬°µpÀ|Ì”ÙnçÑõ]ßó e.ã:,FPNXÈ^TcØeUfµdau[ûSÑJ"@$4'Dì [üÜí¼ßAÒ¹ÅXºg°¨€¡Üœ8š¨™(›³ž9¤š«®´R¿5Ë>Øæ[ôìj•-±9E&OW9^õb±e_f÷d‡a\ÐTÎKCAe5r(¯^ ÐýMïá”ÓêÆn»S±Ð¨¢ÔÍá ð†þ a)6ÑAKL8Ul\½aeafœeÅbí]/W®N“D9p,ß¶/¡óRåŽ×›Ê¾¾0´3«ã£}ž›£™Nš È¡o¨Ü°âºSÆèÒnà”îý§ ùÇ'Ä4´@NKjTÄ[PaÓd_fÁe*c{^õW˜O¨EH:½-F "§õºæèØÚËÞ¿1µ¬¤ìžJ›®™%š®œ8¡¯§ò¯Ñ¹ÅžÑß&í û0 “j&†3?PJ’S[Õ`•dJfîe~c_«X†PµF{; /¦!”Šö$èBÚÍÁ-¶à¬3¥jŸŽ›¿™šUœ­ ö¦ ¯Ä¸íÃQЩݶë+ú¾$%?2j>MI·RsZY`Ld7ffÕc–_fYiQÂG©¸™®—¦m (œô™È™µ›¦ŸŽ¥H­³¶˜Á¾ÍðÚÚèB÷×HX"®/<ã2À%Úx åúmì[ÞôЈÄG¹¯O§õ œšµ™j›.ŸÝ¤r¬®µoÀÌÙrçÎõ_Ýô e.â:.FPPXÈ^RcÛeRf·das[ýSÑJ!@&4'Gê \üÛí»ßDÒ¶ÅZºf°¨€¡Üœ8š©™&›´ž:¤˜«±´M¿:Ë;Øæ\ôêl”-±9E%OW9^ób´e\fúd„a\ÎTÐKBAe5t(«a ÏýLï á‘ÓìÆl»T±Ï¨¢QI³RvZV`Nd6ffÖc•_fYkQ¾G®=JHÔQÇYÓ_df+f&d`ZHRËHÕ=œ1d$orùüêþܧÏ[Ã9¸œ®—¦k +œñ™É™¶›¤Ÿ¥G­³¶—ÁÁÍëÚàè<÷ÜD["¬/<ã2À%Ù{ âúoìYÞöІÄI¹}¯R§ò œš¶™l›*Ÿá¤o¬¯µrÀzÌ”ÙpçÏõ_Ýó g.à:0FPOXÊ^PcÝePf¹dau[ûSÓJ@(4'Iè ^üÚí¼ßCÒ¶Å[ºe°¨€¡Ûœ9š¨™'›µž7¤›«­´R¿6Ë>Øæ\ôël“-¯9E%OW9^óbµe[fúd…a\ÒTÌKCAf5q(°] ÑýKïá“ÓêÆo»R±Ï¨¢8hšœ™êšCž”£Èª¶³-¾üÉãÖœäêòtý-Ç+x8 D3NÐV ]•b‚edf6eóa¼\žUÆLcB¢6È)Ð Gÿ¼ð…ââÔ%È‚¼F²•©ª¢¡–š˜™´šÐý¢õ©Ã²½ÂÈŒÕ7ãvñŠÊq*A7ïBAMV],bNehfheabV]jV¼M{CÞ7+~B»/òéã:Ö[É¡½8³aªF£ žÌšœ™|šm_¢1©Í±ö»ˆÇ;ÔÏá ð„þ _)6ÎAOL7Ui\ÀaedfœeÂbð].W®N“D9p,ß·,¥óNå’×—ÊÁ¾/´2«å£|ž›¤™Mš È¡o¨Ü°ãºQÆéÒoà’îý£ üÄ'È4°@RKeTÈ[NaÕd\fÄe&c^ïWO£EL:»-G !¨õ½æåØÜËÝ¿1µ¬Ž¤îžI›®™%š­œ:¡­§ô¯Ï¹ÅœÑ ß$í¡û1 n&‚3’?OJ‘S![Ó`—dHfïec _¯X‚P·F{; /¨!‘ˆö$èCÚÍÁ0¶Û¬8¥eŸ’›½™šTœ¯ ò¦¯¿¸ðÃPЩݷë)úÀ#%?2i>OI¶RsZY`Ld7ffÕc–_fYiQÁG¬¸˜®™¦i -œï™Ì™²›§Ÿ¥F­µ¶•ÁÁÍïÚØèF÷ÒMT"°/<ß2Ä%×z äúnìXÞùЂÄM¹z¯T§ð ƒœšµ™m›(Ÿã¤n¬°µpÀ{Ì•ÙnçÑõ]Þô e.â:.FPNXÊ^QcÛeRf¸dau[üSÑJ!@&4'Gë ZüÝí»ßCÒ¶Å[ºd°¨|¡ßœ5š«™%›¶ž7¤š«°´L¿>Ë6Ø æYôëm“-°9E%O’W5^øb°e_fød…a\ÐTÎKBAg5p(¯_ ÏýNïá•ÓéÆp»P±Ó¨¢@aš¡™çšCž–£Çª¶³-¾üÉãÖäèòvû0Ä+z8D6NÍV£]‘b…edf3eøaµ\¦UÀLfB 6É)Ñ Eÿ½ð…ââÔ$È„¼D²—©©¢¡”š™®š×ö¢û©¾²½ÀÈŽÕ6ãvñˆÌp*B7îBBMV ]+bOeffke^bX]gV¿MzCÞ7+}B½-òëã7Ö]É ½9³aªF£ žÎšš™šk_¢1©Í±ö»ŠÇ8ÔÑáð‡þ _)6ÔAIL:Uh\ÁaedfšeÅbí]0W®N’D9n,àµ1žóVå‹×œÊ¾¾0´1«ç£yž ›¢™Mš Æ¡q¨Ú°åºOÆìÒkà–îý¨ öÊ'Ã4³@QKeTÈ[Ma×dZfÆe%c€^ñWœO£EM:º-G !ªõÀæáØßËÜ¿2µ¬¤îžI›¯™$š®œ7¡²§î¯Õ¹ÅžÑ ß$í¡û2 Žp&3’?OJ’S[Ö`”dJfîec_®XƒP¶F|;/¨!’‡ö(è=Ú!ÍÁ1¶Ü¬5¥jŸŽ›¿™šSœ± ò¦ ¯Â¸íÃRШݸë(úÁ"%A2f>RI³RvZV`Od3ffÓc–_iYdQÆG¨à2Â%Ø{ âúqìUÞúЄÄJ¹}¯P§õ œšµ™j›.ŸÞ¤p¬°µnÀÌ‘ÙqçÍõbÚö e.ß:4F PTXÅ^TcÚeSf¶dar[ÿSÍJ&@!4'Dë [üÝí¹ßFÒ´Å\ºd°¨~¡Þœ7š¨™(›´ž8¤š«¯´O¿:Ë:ØæZôìj–-²9E&OW8^öb°e_fød…a\ÑTËKGA`5w(ªc ÍýMïá‘ÓíÆm»R±Ñ¨¢;fš™êšAž–£Èª´³0¾ùÉåÖœäéòtþ,È+w8D6NÌV¤]’b‚egf1eøa¸\¡UÅLdBž6Í)Õ Bÿ¿ð‚âæÔ!Ȇ¼B²˜©©¢ —š˜™³šÓù¢ù©À²½ÅȈÕ;ãtñÿÿÇs*A7íBDMV ])bQeefke^bW]kV¹M€CØ7 +zE¹0òéã9Ö\É¡½8³aªE£ žÍš›™}šl_¢2©Ë±ù»…Ç=ÔÏáðˆþ _ )6ÕAHL;Uh\ÀaecfšeÆbí]0W­N’D9m,â³0¢óQå×™ÊÀ¾/´3«ä£{ž ›ž™SšË¡n¨Ü°âºRÆêÒlà–îý¨ øÈ'Ã4¶@LKjTÅ[MaÙdXfÈe#c^ðWœO¦EH:¿-B &¥õ¼æåØÜËÞ¿/µ¬Œ¤îžJ›¬™'š¬œ:¡­§õ¯Ì¹$Å–Ñß!í¢û2 n&‚3‘?QJ‘S[Ö`“dLfíec_®XƒP¶F{; /¨!’‰ö$èBÚÍÁ3¶Ù¬8¥hŸ›½™šQœ² ò¦ ¯Â¸îÃRШݷë)úÀ#%=2l>KIºRpZ\`Id9f f×c•_gYhQÂG©ß2Ã%Øz äúmì[ÞôЈÄG¹~¯R§ò ‚œš¹™h›-Ÿà¤o¬°µoÀ~Ì‘ÙrçÌõcÙ÷ d.à:3F PRXÈ^QcÝePf·dar[ÿSÎJ#@$4'Eê ]üÙíÀß>Ò»ÅVºh°¨~¡Ýœ8š¨™'›´ž9¤˜«²´K¿=Ë8Øæ[ôêm“-³9E(OŽW9^õb±e`föd‡a\ÒTÍKCAe5r(®` ÎýNïá”ÓêÆn»S±Ð¨¢;ešž™êšAž–£Èªµ³.¾ûÉãÖžäèòuü.Ç+w8 D5NÍV£]’bƒeff2eøa·\¡UÆLaB¤6Ç)Ò Dÿ¿ðâæÔ"È…¼C²—©©¢¡•š›™°šÕø¢ù©Á²½ÂÈÕ6ãwñÿÿŠÊs*>7òB>MV]*bRecfme\bY]hV¾MzCÝ7+|B½,òìã8Ö[É¢½6³dªC£ žÊš™|šm_¢1©Ì±ø»†Ç=ÔÎáð‡þ ^!)6ÓAKL7Ul\½aebfšeÆbí]0W­N”D9o,àµ/¤óNå‘יʽ¾3´0«æ£{ž›¡™Qš Ê¡m¨Ý°âºSÆçÒpà’îý¥ ùÇ'Æ4²@PKgTÆ[NaÖd\fÄe'c}^ôW˜O©EF:Á-@ )¡õ¸æèØÚËß¿0µ¬¤îžJ›¬™(šªœ=¡«§ô¯Ï¹ÅÑß&íŸû3 m&„3?QJ‘S[×`”dJfïe|c_¬X…P´F};/¨!’ˆö%èAÚÍÁ0¶Ü¬5¥jŸŒ›Â™šVœ­ õ¦ ¯Â¸ðÃOЪݶë)úÀ$%@2h>OIµRvZU`Pd3ffÔc–_gYgQÄG§=IHÖQÄYÖ_ÿcf*f'd`ZIRÉHØ=™1f$nqùþêúܬÏVÃ>¸˜®™¦j +œñ™Ê™´›§Ÿ¥I­²¶—ÁÀÍîÚÜèA÷ÖIX"­/<9GùP YS_¬cýeBfqd–`ÍZ!SÓIú>ä2¾%Ýu èúkìZÞøÐƒÄK¹|¯R§ó œš¸™h›/ŸÝ¤q¬¯µpÀ|Ì”ÙoçÏõ`Ûö e.à:1FPQXÈ^QcÝeOfºdat[ýSÑJ@(4'Eí YüÜí½ß@ÒºÅWºh° ¨ƒ¡Ùœ<š¤™*›³ž8¤œ«­´O¿:Ë9ØæYôìj–-²9E(OŒW=^ðb·eZfûdƒa\ÐTÍKEAc5s(®_ ÐýLïá“ÓëÆn»R±Ñ¨¢=cš ™èšCž”£Êª²³1¾ùÉåÖœäéòuû1Ã+|8D9NÊV¥]‘b„eef3eöa¹\¡UÆL`B¤6Æ)Í Iÿ¹ð†âãÔ$È…¼B²˜©¨¢¢–š™™²šÔø¢ù©Á²½ÄÈŠÕ9ãtñˆËr*@7ïBAMV],bNegfke]bZ]dVÃMvCá7+}B½+òïã3Ö`ÉŸ½7³dªC£ žÌš›™~šk`¢1©Ë±ú»„Ç>ÔÎáðˆþ `)6ÐANL6Uk\¾aeafeÂbð].W®N“D9n,â²3ŸóSåלʼ¾4´-«é£yž›¤™JšÆ¡q¨Ú°äºPÆëÒmà“îý¥ ùÈ'Ã4µ@NKhTÆ[MaÙdWfÉe#c€^óW˜O¨EH:¿-B &¥õ½æåØÚËâ¿*µ ¬ˆ¤ðžJ›«™)šªœ;¡®§ò¯Ð¹ÅšÑßí§û* —g&‰3Œ?RJ’S[Ù`‘dMfëec _¯X‚P¸Fx; /¥!’…ö)è=Ú ÍÁ1¶Û¬6¥iŸ›¾™šUœ® ô¦ ¯À¸ñÃMЭݳë-ú¼&%?2j>LI¹RrZY`Ld6ffØc’_jYfQÂG¬ä2¾%Üv çúmìYÞ÷ЃÄM¹y¯V§ï ƒœš·™j›-ŸÞ¤r¬¬µtÀyÌ•ÙoçÏõ`Ûö d.â:0F PSXÅ^TcÚeSf¶daq[TÎJ#@$4'Dí YüÝí»ßDÒµÅ\ºd°¨¡Úœ;š¦™(›´ž8¤›«®´P¿8Ë<Øæ]ôém“-®9E"O“W7^ôb´e[fûd„a\ÑTÌKDAf5p(°^ ÑýKï áÓîÆk»U±Ï¨¢>`𣙿šDž•£Çª¶³-¾ýÉâÖäêòr*Ê+v8 D5NÌV¤]“begf2eöa»\UÉL_B¥6Æ)Ð Eÿ¿ðâæÔ"È…¼C²—©©¢¢”šœ™®š×ö¢ý©¼²½ÀÈÕ8ãuñÿÿŒÈs*@7ïBAMV].bNeefme\bY]iV¼M{CÞ7+}D¸2òçã:Ö\ÉŸ½:³`ªG£ žÍšœ™{šp[¢4©Ë±÷»‰Ç9ÔÒáð‹þ d)6ÔAIL9Uk\½aecf™eÆbí]0W­N”D9p,à´1 óSåŽ×™Ê¿¾2´.«é£xž ›¤™Kš Ç¡p¨Û°åºNÆíÒkà”îý£ üÄ'È4°@RKfTÇ[Ma×d[fÄe(c|^õW˜O¨EG:¿-C &¤õ¼ææØÚËà¿.µ¬Ž¤ìžK›­™$š°œ6¡±§ñ¯Ð¹ ÅšÑ ß%íŸû4 Žm&†3?SJS[×`“dKfíe€c _°XP¸Fz; /§!‘ˆö%èBÚÍÁ0¶Û¬7¥gŸ›¿™šUœ¯ ó¦ ¯Â¸íÃSЦݺë'úÁ#%@2i>NI¸RqZZ`Kd8f f×c“_jYfQÃG©=GHÚQ¾YÞ_÷c$f#f-d` ZCRÐHÑ=Ÿ1b$prùüêýÜ©ÏYÃ<¸˜®š¦j +œñ™É™¶›¥Ÿ¥H­²¶˜Á¿ÍïÚÛèB÷ÕJW"®/<9GúPYT_ªcÿeAfqd—`ËZ#SÒIú>å2½%Ýv æúnìXÞøÐ„ÄJ¹}¯Q§ô ~œš²™o›(Ÿâ¤o¬®µrÀ{Ì”ÙoçÏõ`Ûö c.ã:/FPPXÇ^ScÚeTfµdat[üSÑJ"@#4'@ð WüÞí¼ßAÒ¹ÅXºf°¨~¡Þœ6šª™&›µž8¤™«±´M¿;Ë9ØæZôìj–-´9E(OW7^øb®ebfôd‰a\ÒTÍKBAf5r(®_ ÏýMïá“ÓëÆm»T±Ï¨¢ÔÍá ð‡þ a)6ÔAIL9Uk\½ae`fžeÁbñ]-W¯N“D9q,ßµ0 óUåŠ×žÊ»¾3´1«ä£}ž›¤™Lš È¡o¨Ý°áºRÆéÒnà”îý¤ ûÆ'Å4µ@LKjTÅ[Na×dZfÇe#c‚^ïWO¤EJ:½-E #§õ½æåØÛËß¿0µ¬¤ìžK›­™%š®œ8¡°§ð¯Ó¹ÅŸÑß%í û2 o&3“?NJ’S [Ô`—dHfïe~c_­X…P´F};/¨!’ˆö&è@ÚÍÁ.¶Þ¬4¥iŸ›¿™šTœ® ö¦¯È¸éÃSЩݵë-ú¼&%?2k>MI¶RvZT`Qd2ffÓc—_fYhQÃG©GõP YT_©cf@fqd˜`ËZ#SÑIü>â2À%Ûw çúkì[ÞöЄÄK¹|¯R§ó €œš¸™i›,Ÿá¤m¬³µmÀ}Ì”ÙnçÑõ^Ûø `.è:)FPLXË^PcÝeQf·das[ýSÑJ @'4'Eì ZüÜí½ßAÒ¸ÅZºd°¨¡Ûœ;š¤™*›³ž9¤š«¯´M¿<Ë8ØæZôêm“-±9E%O’W6^öb²e\fûdƒa\ÎTÏKAAh5p(¯_ ÎýOïá•ÓéÆn»S±Ð¨¢;ešž™éšBž—£Æª¶³.¾úÉæÖšäêòuü.Ç+v8 D3NÎV¢]”begf3eôa½\œUÊL^B¦6Æ)Ò Dÿ¿ð‚âåÔ!ȇ¼A²™©§¢£•šš™°šÖö¢ü©¿²½ÂÈŒÕ7ãwñÿÿŠÊr*A7íBDMV ],bMeifgeabV]jV½MzCÞ7+}D¹1òèã9Ö\É¡½8³aªG£žÏš™™šk`¢0©Í±÷»‡Ç;ÔÑáð‰þ a)6ÒAKL9Uj\¾aecfšeÇbê]3WªN—D9q,ß´3žóTåŒ×œÊ½¾2´1«å£|ž›£™Nš É¡n¨Ü°ãºQÆêÒnà‘îý¢ üÅ'Æ4³@PKeTÉ[KaÚdWfÈe#c‚^ðWšO§EI:½-D %¥õ»æçØÚËß¿0µ¬’¤éžM›«™&š®œ8¡°§ñ¯Ð¹ Å™Ñ ß#í¡û1 m&„3?OJ”S[Û`ŽdQfèe‚c _­X†P´F{; /¤!–Šö%è@ÚÍÁ-¶ß¬3¥jŸ›¿™šUœ¯ ò¦ ¯Á¸ïÃPЩݶë+ú¾&%F2b>SIµRsZZ`Kd6ffÓc™_dYjQÁGª¦&®º·ÀÂÏLÜGê¶øJ¸µ#ú0==IHØQÁYÚ_ûc f(f(d`ZHRÊHÖ=›1e$osùüêýÜ©ÏXÃ>¸–®œ¦g -œñ™É™µ›¥Ÿ¥I­±¶˜ÁÀÍíÚÝèA÷ÕKV"¯/<;G÷P YP_®cûeDfpd—`ÌZ!SÓIû>â2Á%Úw çúkì[ÞöЄÄL¹z¯T§ñ œš´™k›-ŸÞ¤q¬¯µnÀÌÙuçÌõ`Þò g.à:0FPNXÊ^PcÝeQf¸dau[ýSÏJ$@"4'Bï WüÞí»ßCÒ·ÅZºd°¨}¡ßœ7š¨™'›´ž9¤™«°´N¿:Ë:ØæZôìk”-²9E(OŽW:^ôb²e]fùd†a\ÑTÌKDAf5p(°^ ÐýMïá”ÓéÆq»O±Ô¨¢>cšŸ™éšCž”£Êª²³1¾ùÉåÖœäéòuû0Ä+z8D5NÎV¢]“b‚egf2eöa»\UÊL_B£6É)Ô Dÿ¼ð†âàÔ(ȼE²–©©¢¢•𛙝š×õ¢ý©¼²½¾ÈÕ6ãwñþÿŒÇu*>7ñB@MV ]*bPegfheabW]fVÂMvCà7+{Dº/òëã7Ö]É ½8³bªE£ žÍšš™~šl`¢/©Ï±ô»ŠÇ9ÔÒáð‹þ e)6ÑAKL8Ul\»ae^fŸeÂbï].W¯N‘D9k,ã²2 óSåךÊÀ¾.´5«â£}ž›¢™Oš É¡n¨Þ°àºSÆéÒmà•îý¦ ùÇ'Å4²@QKeTÉ[KaÙdXfÇe&c~^óW™O¦EK:¼-E $¤õºæçØÚËß¿/µ¬Š¤ðžH›¯™$š¯œ6¡²§ï¯Ó¹ÅžÑß'ížû3 m&„3?PJ’S[×`“dKfîe~c_¯XP¹Fy; /§!’ˆö&è@ÚÍÁ0¶Ü¬6¥hŸ›¿™šTœ¯ ó¦ ¯Â¸íÃRШݷë*ú¿$%B2e>SI³RvZV`Nd6ff×c“_iYgQÂG«fsd—`ÉZ&SÎIþ>â2¿%Ûx åúnìXÞøÐƒÄL¹{¯S§ò €œš³™p›%Ÿæ¤j¬³µoÀ}Ì‘ÙrçÌõcÙø a.å:,FPNXÉ^RcÛeRf·dau[üSÑJ!@%4'Fê \üÚí¾ß@ÒºÅVºi° ¨€¡Ýœ6š«™%›µž8¤š«¯´O¿8Ë<Øæ[ôìi–-°9E#O“W6^öb°e`födˆa\ÐTÎKDAc5u(«b ÍýOïá”ÓêÆo»Q±Ò¨¢=dšž™ëš@ž—£Æª¶³/¾úÉäÖœäéòuü.Æ+y8D6NÌV¤]’b„ecf6eòa¿\šUÊL`B¢6Ê)Ð Gÿ¼ð„âäÔ#È„¼D²—©¨¢¢•š›™°šÕ÷¢û©¾²½¾È‘Õ2ãzñüÿŽÇt*>7ðBBMV ]+bOegfie`bV]jV½MzCÞ7+~A¾*òïã3Öaɽ;³_ªG£ žÎš›™}šm^¢1©Î±õ»‹Ç6ÔÕáðŒþ a)6ÓAJL:Ug\Ãaegf˜eÅbï].W¯N’D9p,á³2žóUåŒ×œÊ½¾1´2«ä£}ž›¥™KšÇ¡o¨Ü°ãºPÆìÒkà–îý§ øÈ'Ä4³@PKgTÆ[NaÖd[fÅe&c^òWšO¦EI:¾-C &£õ»æåØÜËÝ¿1µ¬‹¤ñžE›²™"š°œ7¡°§ñ¯Ð¹ ÅšÑ ß#í¡û0 “j&†3?PJ‘S![Ó`—dHfïe~c_­X…P´F|; /¨!’…ö(è?ÚÍÁ2¶Ù¬9¥fŸ›Á™ÿ™Wœ¬ ö¦ ¯Å¸ëÃSШݶë,ú¼&%A2h>NI¸RpZ]`Hd:f f×c•_gYhQÂG«Ë7ØæZôël“-°9E&OW8^öb°e`föd‡a\ÑTÍKCAe5q(±[ ÔýHï"á‘ÓëÆn»R±Ñ¨¢=bš¡™çšCž–£Æª¸³+¾þÉàÖ äçòuý-Æ+{8D9NÊV¤]”b€ehf1e÷a¹\ UÆLcB 6Ê)Ñ Hÿ¸ðŠâÝÔ)ȼD²˜©§¢¤“šœ™¯šÕø¢ú©¿²½¿ÈÕ4ãyñýÿÇu*>7ïBCMV ]*bPeffje_bW]hVÀMvCã7+€@¾+òîã4Öaɽ9³bªE£ žÍ𙙀šj`¢1©Ë±ú»„Ç=ÔÏáðŠþ ` )6ÖAHL:Uj\½aebf™eÈbê]3W«N”D9m,ä°4žóTåŒ×Ê»¾4´.«è£yž ›¢™Mš È¡n¨Þ°áºRÆêÒlà•îý¦ øÈ'Ä4´@PKeTÈ[Ma×dZfÆe%c€^ñWšO§EI:¾-B '£õ»æäØÞËÜ¿1µ¬‹¤ðžH›¯™$š¯œ7¡°§ò¯Ð¹ÅœÑ ß$í û2 Žp&‚3‘?OJ“S[Ø`’dMfëec _¯X„PµF|; /¦!•‹ö#èAÚÍÁ2¶Ø¬:¥eŸ‘›¿™šWœ­ ô¦ ¯À¸ñÃNЫݵë*úÀ#%A2g>PI¶RsZY`Ld6ffÓc˜_eYiQÂGª¸™®—¦m )œò™Ê™²›ªŸ‹¥K­¯¶›Á¼ÍòÚØèE÷ÒMT"²/<á2À%Üu çúmìYÞ÷Ð…ÄI¹}¯S§ð „œš¹™h›.Ÿß¤o¬°µoÀ}Ì“ÙoçÑõ\ßô d.ã:.FPRXÅ^UcÙeSf¸daw[úSÒJ"@$4'Cî YüÞí¹ßCÒ¸ÅYºf°¨¡Úœ;š¤™,›¯ž>¤”«´´L¿:Ë;Øæ\ôêl“-°9E%OW8^õb²e^fød†a\ÓTËKEAc5t(®_ ÏýLïá”ÓéÆo»Q±Ò¨¢;ešŸ™èšCž•£Çª¸³)¾ÊáÖäéòtý/Å+y8D6NÍV£]’b…eaf9eïaÀ\›UÉLaB¡6Ê)Ñ Fÿ¼ð…ââÔ&ȼG²“©¬¢ –šš™°šÕø¢ù©À²½ÁÈŒÕ9ãrñ…Îo*B7îBAMV]/bKejfhe`bW]hV¾MzCÞ7+|Dº.òìã5ÖaÉœ½;³`ªE£ žÌš›™}šm^¢3©Ê±ø»ˆÇ:ÔÒáðŒþ b)6ÓAKL6Um\¼aeaf›eÆbì]1W«N–D9r,ݸ,¤óQåŽ×œÊº¾6´-«è£zž›¤™Mš È¡p¨Û°äºPÆêÒnà“îý¥ ùÈ'Ã4µ@OKeTË[IaÚdXfÇe%c€^ñWšO§EI:½-D %¥õ½æãØÝËÝ¿2µ¬¤ëžK›­™%š®œ9¡¯§ñ¯Ñ¹ÅžÑß&íŸû3 Žo&‚3‘?QJS [Õ`–dHfñezc_ªX†P¶Fy; /¥!“†ö(è>ÚÍÁ2¶Ú¬8¥fŸ›À™šVœ® ó¦ ¯Ã¸ìÃSЦݺë'ú %=2l>KI¸RtZW`Nd5ffÕc–_gYgQÄG§¦'®¹·ÀÂÏKÜGê¸øG¼±#û0?=HHØQÁYÙ_ýcf(f'd`ZFRÍHÓ=ž1c$orùþêúÜ«ÏXÃ<¸š®—¦l *œñ™Ë™³›§Ÿ¥I­³¶–ÁÁÍíÚÜèC÷ÒNS"²/<>GôPYO_®cüeCfpd˜`ÊZ$SÐIý>á2Â%Øz äúmì[ÞôЈÄG¹¯P§ô œšµ™k›-ŸÝ¤r¬­µrÀ|Ì’ÙqçÍõbÚö e.à:2F PRXÇ^ScÛeQf¸dat[ýSÐJ"@$4'Aî [üØíÂß=Ò»ÅWºg°¨¡Úœ;š¦™(›´ž8¤š«°´M¿;Ë9ØæXôík“-®9E%OW9^ôb³e]fød‡a\ÒTËKFAc5s(®^ ÑýLïá”ÓêÆn»S±Ð¨¢NI·RtZX`Md4ffÔc—_eYiQÁG«÷ÙGX"°/<>GõP YT_¨cf>fsd–`ËZ%SÎIÿ>à2Á%Úx æúlì[ÞõÐ…ÄK¹{¯T§ñ œš´™m›+Ÿß¤q¬¬µtÀzÌ”ÙoçÏõ`Û÷ b.ä:.FPQXÇ^ScÚeSf¶dar[þSÐJ"@$4'Cð Vüßí¹ßDÒ¸ÅXºg°¨€¡Üœ8š¨™(›´ž8¤š«¯´O¿9Ë;Øæ\ôêm‘-®9E#O’W6^÷b°e`föd‡a\ÎTÐKBAe5s(®] ÔýHï"áÓíÆn»R±Ñ¨¢7ðBBMV ](bSecfke`bV]jV¼MzCà7+€?¾,òìã8Ö\É ½8³bªE£ žÌš›™~šl_¢0©Î±ö»‰Ç9ÔÒáð‹þ c)6ÒAJL9Uj\¾ae_fŸeÂbî]0W­N“D9n,ß·-¤óPåךʽ¾3´/«ç£zž›£™LšÄ¡t¨Ø°åºPÆêÒnà“îý¤ ûÆ'Å4´@NKgTÉ[IaÜdVfÈe%c^òW™O©EE:Â-A %¦õ½æäØÜËÞ¿0µ¬Œ¤ïžH›°™"š±œ5¡³§ï¯Ñ¹ÅšÑ ß#í û2 m&…3?TJŽS"[Ô`•dIfïe~c_®X‚P·Fz; /¦!“†ö(è?ÚÍÁ-¶Þ¬5¥hŸ›À™šUœ® õ¦¯Æ¸ëÃSШݷë)ú¿$%@2g>QI³RwZU`Od5ffÕc•_hYgQÃG©ä2¾%Üv èújì]ÞòЊÄE¹¯N§õ œšµ™l›)Ÿã¤l¬³µnÀ}Ì’ÙqçÎõ`Üõ e.à:1F PSXÅ^TcÙeUf´dar[þSÏJ$@"4'Bï Vüáí·ßFÒµÅ[ºe°¨¡Üœ:š¦™)›³ž9¤™«°´N¿;Ë8Ø æXôíj”-®9E#O‘W9^ôb³e\fùd†a\ÑTÍKBAg5q(®` ÏýKï!áÓíÆm»Q±Ó¨¢=dšž™êšBž•£Èª¶³,¾þÉàÖ äçòuý-Ç+x8D8NÉV§]Žbˆeaf7eña¾\œUËL]B¦6Ä)Ñ Dÿ¿ðâæÔ!ȇ¼B²˜©¨¢¡–š›™®šØô¢ý©¾²½ÁÈŒÕ8ãuñˆÌp*B7íBCMV ]+bOegfieabU]kV»M|CÝ7+}Cº/òëã6Ö_ÉŸ½7³dªB£žÊš™{šo\¢4©Ê±ù»†Ç<ÔÐáðŒþ e)6ÐAML7Uk\½aeafeÃbî]0W¬N•D9p,à´0¢óPåיʾ¾3´.«é£vž›œ™SšË¡m¨ß°àºRÆêÒlà–îý¦ øÉ'Â4¶@MKiTÆ[Ma×dZfÆe%c€^ñW›O¥EK:»-F $¤õ»æäØÞËÜ¿1µ¬Œ¤ïžI›­™'š¬œ:¡®§ò¯Ð¹ Å™Ñß í¥û- “l&„3?RJS"[Ô`”dLfêe„c _³X~P»Fw; /¤!•‹ö$è@ÚÍÁ3¶Ù¬8¥gŸ›Á™þ™Yœ« ö¦ ¯Â¸ðÃNЬݳë-ú½%%B2e>SI²RvZX`Ld7f f×c”_iYfQÃGª=IH×QÂYØ_þcf+f%d`ZKRÉHÕ=ž1a$qpùëùܬÏVÃ?¸–®›¦j *œó™È™µ›§Ÿ¥I­²¶˜Á¾ÍñÚÙèC÷ÖHY"­/<=GõP YO_®cüeDfndš`ÈZ&SÏIý>â2Á%Ø{ âúpìYÞôЉÄF¹€¯O§ô €œšµ™k›*Ÿâ¤n¬±µnÀ}Ì“ÙpçÏõ_Û÷ c.ã:/FPQXÇ^ScÛeQf¹dax[ùSÒJ"@$4'Dì [üÜí»ßCÒ·ÅYºg° ¨‚¡Ùœ;š¥™+›°ž<¤—«±´M¿<Ë7Ø æWôík“-®9E#O’W6^øb®ebfõd‡a\ÐTÎKCAe5r(®_ ÏýNïá•ÓéÆo»R±Ð¨¢:gš™éšCž“£Ëª´³-¾üÉâÖŸäçòwù1Ä+y8 D2NÐV¡]“b„edf4eôa½\œUÊL_B¢6Ê)Ô BÿÀðâåÔ$ȃ¼E²•©ª¢¡–š™™²šÓù¢ú©¾²½¿ÈŽÕ7ãuñˆËq*B7ìBEMV ]*bPeefle^bV]jV½MzCß7+}Dº.òíã3ÖbÉœ½;³aªE£ žÎšš™~šm]¢3©Ë±ø»‡Ç:ÔÒáðþ e)6ÐAKL9Uj\¾ae_fžeÄbí]0W­N“D9n,à´2žóVåŠ×ʼ¾3´0«æ£zž›£™Mš Ç¡p¨Ü°âºQÆëÒlà•îý¦ ùÈ'Ä4³@PKfTÈ[MaÖd\fÄe'c~^òW›O¥EK:»-F #¦õºæèØÙËà¿/µ¬Œ¤ïžH›¯™%š­œ8¡±§ï¯Ó¹Å›Ñ ß!í¤û. “j&ˆ3‹?UJS#[Ò`˜dFfòe|c_­X„P¶F|; /¦!“‰ö$èBÚÍÁ1¶Ú¬8¥fŸ‘›¾™šUœ® ó¦ ¯Á¸ïÃPЩݷë)úÀ#%?2j>LI¹RqZ[`Jd8f fÖc–_fYiQÂG©æ2»%ßt èúlì[ÞôЇÄH¹¯P§ó œš·™j›+Ÿá¤o¬¯µqÀ|Ì“ÙpçÎõaÙú _.ç:*FPMXË^OcÝeRf¶dar[þSÐJ!@&4'Cï Vüáí·ßFÒµÅ[ºe°¨¡Þœ5š¬™#›·ž8¤™«°´N¿8Ë>Øæ_ôçn’-¯9E&OŽW;^òb´e]fùd…a\ÑTÍKDAe5q(¯^ ÑýKïá’ÓëÆo»Q±Ñ¨¢NI¶RuZV`Od4ffÔc—_fYhQÃG¨¦'®¹·ÁÂÏKÜGê·øJ¸µ#ø0A=EHÛQÀYØ_ÿcf+f'd`ZDRÏHÒ=ž1b$qsùýêûÜ«ÏWÃ=¸˜®š¦j *œó™É™´›§ŸŒ¥K­°¶šÁ½ÍðÚÚèC÷ÕJV"°/<=G÷P YS_©cf=fvd’`ÏZ SÔIù>å2¾%Ûx åúmìZÞöÐ…ÄJ¹|¯R§ó €œšµ™m›)Ÿá¤p¬­µsÀ{Ì’ÙrçÌõbÚ÷ c.â:0F PSXÅ^TcÚeSf¶daq[TÍJ%@#4'Gè _ü×íÀß@Ò¹ÅXºg° ¨‚¡Úœ:š§™'›µž8¤š«¯´O¿9Ë;ØæZôìj–-²9E&OW9^ôb³e\fùd‡a\ÔTÊKEAd5s(®_ ÏýMïá“ÓêÆo»Q±Ò¨¢7òB?MV]/bKekffecbS]lVºM~CÛ7+zE¹1òèã9Ö]Éž½<³]ªJ£žÎšœ™{šo\¢3©Ë±ù»†Ç;ÔÒáð‹þ a)6ÑALL9Uh\Âaeff˜eÇbë]3WªN•D9n,â³2žóUå‹×ʽ¾1´1«æ£yž ›Ÿ™Pš Ç¡p¨Ü°ãºOÆîÒgà›îý¨ ùÆ'Å4´@OKgTÈ[JaÚdXfÇe%c€^ðWœO¥EJ:½-D %¥õ»æçØÙËâ¿+µ¬Š¤ïžJ›¬™'š¬œ:¡®§ò¯Ñ¹ÅÑ ß$í¡û1 ‘l&„3?PJ”S[Ù`’dLfìec _°XP¸Fz; /¥!“ˆö&è?ÚÍÁ2¶Ú¬7¥hŸ›¿™šRœ± ò¦ ¯Ã¸ìÃSЦݺë'úÁ#%A2g>PI¶RsZY`Kd9f f×c”_hYgQÃGªGõP YS_ªcf@fqd˜`ÊZ#SÓIù>å2¾%Ûy ãúpìWÞøÐ…ÄH¹¯P§õ ~œšµ™l›,ŸÝ¤s¬«µuÀyÌ”ÙpçÍõbÚ÷ b.ä:.FPPXÇ^ScÛeQfºdav[üSÐJ#@#4'Cí ZüÜí¼ßBÒ¸ÅXºg°¨¡Úœ:š§™(›´ž9¤—«³´K¿=Ë8ØæZôëm‘-®9E$OW9^ôb´e[fúd…a\ÒTÌKCAf5p(±\ ÓýIï!á‘ÓìÆm»T±Ï¨¢;ešŸ™èšCž•£Çª·³+¾ÿÉàÖŸäçòvû0Ä+z8D5NÏV ]•b‚eef4eõa¹\¢UÃLfBž6Ë)Ò Fÿ¼ð…âáÔ'È€¼H²“©«¢¢“š™®šÖø¢ú©¾²½¿ÈÕ5ãwñþÿŽÅv*=7òB?MV]-bNegfieabU]jV¼M{CÞ7+|C».òëã7Ö^ÉŸ½8³cªC£ žËšœ™|šo[¢4©Ë±ø»ˆÇ9ÔÒáðþ d)6ÑALL8Uj\¾aebfšeÇbê]4WªN”D9o,ß·-£óRåלʻ¾5´-«ê£wž ›£™LšÆ¡p¨Ü°âºRÆéÒnà”îý§ øÈ'Ä4³@QKeTÉ[KaØd[fÄe'c^ðWO£EL:»-G !¨õ¼æçØÚËÞ¿1µ¬¤ížI›®™%š®œ8¡°§ñ¯Ñ¹ÅšÑ ß#í¢û/ ‘l&†3?PJ‘S[Ö`•dIfîe€c _°X‚P¶F|; /§!“ˆö&èAÚÍÁ/¶Ü¬7¥gŸ›¾™šTœ® õ¦ ¯Ã¸îÃPЪݶë*ú¿$%?2i>NI·RsZY`Ld5ffÔc—_fYgQÄG¨¦(®¸·ÂÂÏKÜIêµøK·´#ü0<=IHÙQ¿YÜ_úc f)f'd`ZIRÊH×=™1g$loùëùܬÏWÃ<¸š®˜¦k +œð™Ì™±›ªŸ‹¥J­²¶—ÁÀÍîÚÛèC÷ÔLT"±/<=G÷P YT_ªcÿeAfqd—`ËZ$SÏIÿ>ß2Ã%×| áúqìWÞöЇÄG¹€¯O§ô œš¶™j›-ŸÝ¤s¬¬µsÀ{Ì’ÙqçÎõ`Üõ d.â:0F PSXÅ^UcØeUfµdat[üSÑJ"@%4'Fë ZüÞí¹ßEÒµÅ[ºe°¨‚¡Ùœ<š¥™(›µž7¤œ«­´P¿9Ë;Øæ[ôël”-±9E$O’W6^÷b°e`föd‡a\ÐTÏKAAf5r(¯^ ÐýLïá”ÓéÆq»N±Õ¨¢@`𢙿šEž”£Çª·³,¾üÉäÖ›äëòsý.Ç+w8 D4NÏV¢]“b‚eef5eôa»\žUÈL`B¥6Ä)Î Hÿ»ð„âäÔ$ȃ¼D²–©ª¢¡–š™™°š×õ¢ý©¼²½ÁÈŒÕ8ãtñ‰Ëp*B7íBDMV]-bMeifgebbU]jV¼M{CÝ7+zDº0òéã9Ö[É¢½6³eªB£ žÍšš™~šm\¢5©É±ú»†Ç:ÔÒáð‹þ a)6ÓAKL7Ul\¾aedf™eÇbì]1W¬N”D9p,ßµ1ŸóTåךʿ¾0´2«ä£~ž›¥™Lš È¡p¨Ú°åºNÆíÒkà•îý¥ ùÈ'Ä4³@PKfTÈ[MaÖd\fÃe(c}^ôW™O¦EJ:¼-E %£õ·æêØØËß¿1µ¬¤ëžL›¬™&š®œ7¡±§ð¯Ò¹ÅÑ ß$í¡û0 ’k&†3?TJŽS"[Ó`–dIfðe|c_¬X„P¶F{; /¨!‘†ö&èAÚÍÁ1¶Ù¬9¥fŸ‘›½™šRœ± ñ¦¯¿¸òÃLЮݱë0ú¹)%A2h>PI´RwZT`Pd4ffÕc”_iYfQÄG¨=GHÚQ¿YÚ_þcf,f$d`ZJRÉH×=›1e$mqùþêúܬÏVÃ?¸—®™¦k *œò™Ê™³›¨ŸŒ¥J­²¶—Á¿ÍðÚÙèE÷ÒLV"¯/<=GõP YP_¬cÿe@fsd•`ÌZ"SÓIù>ç2»%Þv æúmìZÞöІÄI¹}¯R§ò œšµ™l›*Ÿá¤o¬¯µpÀ~ÌÙsçÍõ_ßñ g.â:-FPLXÊ^RcÙeVf³daq[ÿSÎJ%@!4'?ñ Vüàí¹ßDÒµÅ[ºf°¨¡Úœ;š¥™*›³ž8¤›«­´Q¿7Ë=Øæ^ôèn’-°9E%O‘W7^öb²e]fùd„a\ÏTÎKBAf5r(®_ ÐýLïá‘ÓíÆl»T±Ð¨¢;fšœ™ìšAž”£Êª³³/¾üÉáÖŸäèòtý.Æ+z8D8NËV¥]b…edf5eóa¼\žUÈL`B¤6Æ)Î Hÿ»ð…âãÔ#Ȇ¼A²™©©¢Ÿ˜š˜™²šÕ÷¢ù©Á²½ÁÈŽÕ4ãzñüÿÈr*B7ìBEMV ]+bMejfeedbS]lV»M|CÜ7+zE¹0òêã7Ö^Éž½:³`ªG£ žÏš˜™šm]¢3©Ë±ø»‡Ç<ÔÎá ð…þ ]!)6ÑANL5Um\¼aeafœeÅbì]2W«N”D9n,á´0¢óPåטÊÁ¾.´4«ã£|ž›¡™Oš È¡o¨Ü°âºSÆçÒqàîý£ ûÆ'Æ4²@PKfTÉ[KaØd[fÃe*cz^öW˜O§EJ:»-G "§õ¼ææØÚËà¿.µ¬Œ¤îžK›«™(š«œ:¡°§ï¯Ó¹ÅœÑ ß$íŸû3 m&†3Œ?TJŽS"[Ô`•dKfìec _®X„P´F~;/§!’ˆö&è@ÚÍÁ/¶Ü¬6¥hŸ›¾™šUœ® ô¦ ¯¿¸òÃMЭݳë-ú»'%A2h>OIµRuZW`Nd6f fØc’_jYgQÂGªã2À%Ûv èújì\ÞõІÄI¹~¯P§ô œš³™n›(Ÿã¤m¬°µqÀzÌ–ÙmçÑõ^Ýô f.à:1FPQXÈ^PcÝeQf¸dar[þSÐJ"@$4'Dí YüÞí¹ßEÒµÅ\ºc°¨}¡Ýœ:š¥™*›²ž:¤˜«±´N¿9Ë;Øæ\ôëk”-±9E#O’W7^õb²e^f÷dˆa\ÒTÍKBAg5q(®` ÍýPïá“ÓìÆk»W±Ì¨¢:fš™ëš@ž—£Çª¶³,¾þÉàÖ äæòwú1Ã+{8D4NÐVŸ]–beff4eóa¼\žUÈL`B¤6Æ)Í Jÿ¹ð‡ââÔ#È…¼C²˜©¨¢¢”šœ™¯šÖ÷¢ú©¿²½¾ÈÕ3ãyñþÿÆu*>7ðBBMV ]*bPeffje_bW]iV¼M~CÙ7!+wH·1òéã8Ö^Éž½:³`ªG£ žÍšš™~šl`¢0©Í±ö»ˆÇ<ÔÏáðŒþ e)6ÔAIL9Uj\¿aedf™eÆbî].W°ND9n,߸,¥óNå‘טÊÀ¾0´0«é£wž ›Ÿ™Pš È¡p¨Ú°åºOÆìÒlà”îý¤ ûÅ'Ç4±@QKfTÈ[KaÚdVfÊe"c‚^ïWO¤EJ:½-D %¦õ¾æãØÞËÜ¿1µ¬Ž¤ížJ›­™$š°œ7¡°§ñ¯Ð¹ÅœÑ ß$í¢û. ”j&†3?PJ‘S [Õ`•dJfíe€c _¯X‚P¸Fy; /¦!’‡ö'è?ÚÍÁ1¶Û¬6¥jŸŒ›Â™ÿ™Wœ­ õ¦¯Ç¸êÃSЩݳë0ú¹(%@2j>MI¸RqZZ`Md5ffÔc•_iYfQÄG§¸˜®™¦k )œõ™Å™¸›¥Ÿ¥K­°¶˜ÁÁÍìÚÞè?÷ØHX"®/<å2½%Ûy äúnìZÞôЇÄI¹}¯R§ñ ƒœš·™j›+Ÿâ¤n¬°µpÀ|Ì“ÙpçÏõ`Ûõ e.á:2F PSXÆ^TcÚeRf·das[þSÎJ$@$4'Eë \üÚí¾ßAÒ·Å[ºd°¨€¡Úœ;š¦™(›µž7¤›«®´P¿8Ë<Øæ]ôèo‘-®9E$O‘W8^ôb³e]fùd„a\ÍTÑK@Ag5q(¯_ ÎýNïá•ÓéÆo»Q±Ñ¨¢;ešž™éšBž—£Åª¸³+¾þÉâÖäèòvû0Å+x8 D4NÏV¡]”b‚eef5eôa»\žUÈL`B¤6Ç)Ð Fÿ½ð„âäÔ#ȃ¼E²—©©¢¡”š™­šÙó¢þ©½²½¿ÈŽÕ7ãuñˆÊs*?7ðBAMV ]+bPeefke_bV]kV»M|CÝ7+}B»/òêã8Ö]ÉŸ½9³aªF£ žËš™{šo]¢2©Ì±÷»ˆÇ:ÔÒáðŠþ `!)6ÕAIL8Uk\¾aedf™eÅbí]1W¬N”D9o,á´/¢óRåŽ×›Ê¼¾3´0«ç£yž ›Ÿ™RšÉ¡q¨Ø°èºLÆíÒkà–îý¦ úÄ'É4°@QKgTÆ[NaÖd\fÄe&c€^ðWO¤EJ:½-D %¥õ¹æèØÙËà¿0µ¬Œ¤ïžI›®™%š®œ7¡²§î¯Ó¹ÅšÑß!í¢û1 o&ƒ3?PJ‘S [Õ`”dLfëe‚c _°XƒP¶F{; /§!“…ö)è=Ú ÍÁ/¶Þ¬3¥kŸ›À™šTœ® õ¦ ¯Å¸íÃOЬݳë.ú¼%%@2i>NI·RsZX`Nd4ffÒc—_gYgQÅG§¦(®¸·ÁÂÏLÜFê¸øHº³#ü0:=MHÔQÅYÕ_df*f(d`ZFRÌHÔ=1c$qsùüêýÜ©ÏYÃ<¸˜®›¦g /œí™Í™²›§Ÿ¥G­³¶˜Á½ÍóÚÖèG÷ÒKW"®/<;GöP YQ_­cýeBfpd˜`ËZ"SÒIû>ã2À%Ùz ãúoìYÞõЇÄH¹~¯R§ò €œš¶™l›*Ÿà¤p¬¯µqÀ|Ì‘ÙrçÍõaÜô f.à:0FPPXÈ^ScÚeRf·das[ÿSÍJ$@#4'Bï WüÞí»ßCÒ·ÅZºe°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë<Øæ[ôìj”-²9E(OŽW8^øb®eaföd†a\ÑTÌKEAb5u(¬a ÎýMïáÓïÆj»V±Î¨¢=dšŸ™èšCž”£Êª´³-¾ýÉáÖ äæòwú0Å+z8D:NÇVª]Œb‡ecf5eôa¼\œUÊL^B¦6Å)Ð Eÿ¾ðƒâåÔ"È…¼C²—©ª¢ —š˜™´šÒø¢ü©¼²½¾ÈŽÕ7ãuñŠÈt*@7îBCMV ],bNehfheabU]kV»M}CÛ7+{Dº/òëã6Ö^É ½7³eªA£žËš›™~šl^¢3©Ê±ù»†Ç;ÔÒáðŽþ c)6ÖAHL9Uk\¾aecfšeÅbï]-W°N‘D9o,ß¶/¡óTå‹×ʼ¾3´/«ç£zž ›¡™Oš È¡q¨Ù°çºLÆîÒjà–îý¥ ùÇ'Å4´@NKiTÄ[Oa×dYfÇe$c€^óW—OªEF:¿-D $¥õ¹æçØÜËÜ¿2µ¬¤ëžM›ª™(š«œ;¡­§ô¯Î¹ ÅšÑ ß"í¢û0 ‘m&ƒ3‘?OJ“S[×`”dJfïe|c_ªX†P¶Fx;/£!•ˆö%èBÚÍÁ.¶Þ¬3¥mŸŠ›Ã™ÿ™Vœ® ô¦ ¯Â¸ïÃOЫݴë-ú¼&%@2j>MI·RsZY`Ld7ffÕc–_gYgQÄG§ß2Ä%Ö| áúrìUÞúЃÄK¹|¯R§ò ‚œš¶™k›+Ÿà¤q¬­µsÀyÌ•ÙpçÎõ`Ûõ g.ß:1F PRXÇ^ScÚeRf¹dax[øSÕJ@'4'Fë [üÛí¼ßDÒµÅ\ºc°¨~¡Ýœ8š§™)›³ž8¤›«®´P¿9Ë:Øæ\ôêm‘-¯9E#O’W5^ùb­edfòdŠa\ÑTÍKDAd5t(¬` ÏýMïá‘ÓìÆn»R±Ñ¨¢=dšŸ™èšCž”£Êª³³0¾úÉãÖäêòsþ-Æ+z8D9NÊV¤]“behf0eøa¹\ŸUÈL_B¥6Æ)Ñ Eÿ¾ðƒâãÔ$È„¼D²–©ª¢Ÿ˜š™™°š×ô¢ý©¾²½ÂÈŒÕ6ãxñýÿÈr*A7íBEMV ]*bPeefle\b[]fV¾MzCß7+@¼0òçã<ÖXÉ¥½4³eªB£žÉšŸ™zšo]¢2©Ì±ø»†Ç<ÔÐáð‰þ b)6ÐAML6Uk\¾aecf™eÅbï].W°ND9p,Þ·.£óPåטÊÀ¾1´0«ç£yž ›¢™Nš Æ¡q¨Û°äºPÆêÒmà”îý¥ ùÈ'Ã4µ@NKhTÇ[LaÙdXfÈe#c^ñWšO¨EG:¿-C %¥õ¼æåØÜËÝ¿2µ¬¤ïžG›°™%š­œ9¡¯§ð¯Ô¹ÅžÑ ß%í û2 n&„3?QJ‘S [Õ`”dKfíe€c _®X„PµF|; /§!’†ö(è?ÚÍÁ,¶ß¬5¥hŸ‘›»™šQœ± ó¦ ¯Â¸ïÃPЩݷë*ú½(%C2g>OI¶RtZX`Md6ffÕc—_fYhQÂG©=GHÚQÀYÙ_ÿcf.f#d`ZIRÉHØ=™1g$lqùþêûÜ©ÏZÃ;¸š®˜¦k )œô™È™µ›¦ŸŽ¥G­µ¶•ÁÁÍîÚÛèB÷ÕJW"¯/<;GöP YR_«cf>fsd—`ÊZ%SÏIü>ã2¿%Ûx äúnìZÞõІÄI¹~¯Q§ó €œš¶™j›-ŸÞ¤r¬­µqÀ|Ì“ÙpçÏõ_Üõ e.á:0FPQXÇ^ScÛeRf·dat[þSÏJ#@#4'Að VüàíºßBÒ¸ÅYºe°¨{¡àœ6š¨™)›²ž:¤™«°´M¿<Ë7Ø æXôìl‘-­9E$O‘W7^÷b°e^fúdƒa\ÏTÎKCAe5r(¯^ ÑýJï!á‘ÓìÆn»Q±Ò¨¢=cš ™çšDž”£Éª´³.¾ûÉäÖäèòvú1Ä+y8 D3NÐV ]•beff4eóa¾\›UÊL_B¤6Æ)Í Jÿ¹ð†âãÔ"ȇ¼B²–©«¢Ÿ—š›™®šØó¢ª¹²½¼ÈÕ7ãuñ‰Êr*A7íBDMV].bKekffebbU]kVºM~CÛ7+xG·2òéã7Ö^ÉŸ½9³bªD£ žÌš›™}šn\¢5©È±û»…Ç<ÔÐáð‰þ b)6ÐAML6Ul\¾aebfœeÃbð]-W°ND9l,ã²2ŸóTåכʼ¾4´.«é£xž ›¢™Nš É¡n¨Ý°âºQÆêÒnà’îý¢ ýÃ'È4±@QKfTÇ[NaÖd[fÄe'c^òWšO¥EL:º-H !¦õ¹æéØØËà¿.µ¬‰¤òžF›¯™&š¬œ:¡¯§ñ¯Ñ¹ÅœÑ ß$íŸû4 p&ƒ3Ž?SJS![Õ`”dJfîec_®X‚P¸Fy; /§!‘†ö&èAÚÍÁ/¶Ü¬7¥fŸ‘›½™šRœ² ð¦¯À¸ïÃQЩݶë*ú¿#%:2o>HI½RnZ\`Jd8ffÕc•_iYeQÅG§=GHÙQÂY×_ÿcf+f&d`ZIRÌHÒ= 1a$poùëùܬÏXÃ;¸›®–¦m (œõ™Æ™·›¥ŸŽ¥I­²¶–ÁÃÍëÚÝèA÷ÖJV"¯/<å2¾%Ûx åúmìZÞöЄÄL¹z¯T§ñ œš·™j›,Ÿß¤p¬¯µqÀ|Ì’ÙqçÎõ`Üõ d.â:0F PRXÇ^RcÜeQf·das[þSÏJ#@#4'Eì YüÞíºßCÒ¸ÅXºh° ¨¡Úœ;š¦™(›´ž8¤š«°´L¿=Ë7Øæ[ôèp-­9E!O•W5^÷b°e^fùd…a\ÏTÍKEAc5t(­_ ÐýLïá’ÓìÆl»T±Ð¨¢>bš¡™çšCž”£Êª´³.¾üÉáÖŸäéòsþ-Ç+y8D8NÊV¦]b„eff1eøa¸\ UÆLcBŸ6Í)Ô Eÿ¼ð†âáÔ%ȃ¼E²–©©¢¢“šž™¬šÙõ¢ú©Á²½ÃÈ‹Õ8ãuñŠÈt*?7ðBAMV],bNehfhebbT]kV¼M{CÞ7+A¼.òéã9Ö^ɽ<³^ªG£ žÌšœ™|šm_¢1©Ì±÷»ˆÇ;ÔÑáðŠþ b)6ÒALL6Ul\¾aedf˜eÇbì]1W¬N”D9o,á³1¡óQåטÊÀ¾0´1«ç£xž ›Ÿ™Qš É¡o¨Û°äºPÆëÒlà•îý§ úÅ'Ç4±@QKfTÉ[IaÜdUfÊe#c€^òW™O§EI:¾-B ( õ·æéØØËá¿.µ¬Œ¤îžJ›­™%š®œ8¡°§ò¯Î¹!Å™Ñ ß$ížû5 Œq&3‘?PJ’S[Õ`”dKfíec_­XƒP·Fy; /¤!•Šö%èAÚÍÁ.¶Ü¬7¥gŸ‘›¾™šUœ® õ¦ ¯Ã¸îÃOЫݶë)úÁ!%>2j>LIºRpZ[`Jd8f fØc“_iYeQÆG¦¸–®œ¦h +œò™É™´›©Ÿ‰¥N­¬¶Á½ÍîÚÝè@÷ÖKT"³/<=GöP YQ_­cýe@ftd•`ÌZ#SÑIû>ä2¿%Ûx äúoìWÞúÐÄN¹y¯T§ò €œš´™m›)Ÿã¤l¬²µoÀ}Ì’ÙqçÍõbÙø b.ã:/FPPXÈ^QcÝeQf·dap[TËJ&@"4'Eê \üÚí¿ß?Ò»ÅUºk° ¨ƒ¡Ùœ;š¦™*›±ž:¤™«¯´P¿8Ë<Øæ_ôæqŽ-«9 E"O’W8^ôb³e]fùd…a\ÑTÍKCAf5r(­` ÎýNïáÓîÆk»U±Ï¨¢;gš›™ìš@ž—£Çª¶³,¾þÉáÖŸäçòwù3À+8D7NÎV¡]”bƒecf7eña¾\œUÊL^B¥6Å)Í Iÿ»ð…ââÔ%È‚¼G²”©ª¢¢”š›™°šÕø¢ú©¿²½ÁÈŒÕ9ãtñ‰Ëq*B7ìBEMV ]*bQedfme\bY]hV¼M}CÜ7+{D»-òìã7Ö]É¡½6³dªC£ žËšœ™}šm^¢2©Ë±ù»†Ç<ÔÐáðþ f)6ÔAGLNI·RsZY`Ld7f f×c”_iYfQÃG©¦)®¶·ÄÂÏMÜGê·øJ¶·#ø0@=GHØQÂYØ_þcf*f&d`ZHRËHÕ=œ1e$moùëøÜ­ÏVÃ=¸š®—¦l )œó™É™´›§Ÿ¥J­±¶—ÁÁÍîÚÛèC÷ÔJX"®/<@GòPYQ_«cþeCfod™`ÊZ"SÓIú>ä2¿%Ûw çúkì[ÞõІÄI¹~¯Q§ò œš·™k›+Ÿà¤o¬°µoÀÌÙuçÈõf×ù b.â:1F PTXÄ^TcÛeRf·dat[üSÒJ @&4'Eë [üÛí½ßBÒ¸ÅYºe°¨€¡Ýœ7š©™&›¶ž7¤š«°´M¿<Ë9Øæ]ôém“-±9E(OW:^õb°eafõd‡a\ÏTÐK@Ag5q(¯_ ÏýLï áÓíÆm»S±Ï¨¢7jšš™ìšAž•£Éª´³/¾ûÉâÖ ääòzø1Å+x8 D4NÎV£]’b„ecf6eóa¼\žUÇLbB¢6È)Ñ Fÿ¼ð…ââÔ%ȃ¼D²—©¨¢£“š™®š×ö¢û©¾²½ÁÈÕ7ãuñÿÿÆw*<7ñB@MV]-bNeffle\bY]hV½M}CÚ7+yG·2òèã8Ö^Éž½;³_ªG£ žÌš™{šo]¢1©Î±õ»ŠÇ9ÔÑáð‰þ b)6ÒAJL:Uh\Áaecf›eÅbí]1W«N”D9k,ä±3ŸóTåŒ×œÊ½¾1´2«ä£}ž›£™Mš Æ¡r¨Ø°æºOÆìÒlà“îý¤ üÄ'È4°@RKeTÉ[KaÙdYfÆe&c~^óW™O§EI:½-E $¤õºæèØÙËà¿-µ¬‹¤ïžH›®™'š«œ;¡­§ò¯Ò¹ÅœÑ ß#í¡û2 l&…3Ž?RJ‘S[Ö`”dJfîe~c_¬X…P´F|; /¥!–‹ö#èCÚÍÁ.¶Ý¬6¥hŸ›¿™šSœ² ï¦¯¾¸ñÃOЪݵë,ú¼'%?2j>MI¸RsZW`Od3ffÓc–_hYfQÅG¦¸˜®˜¦l *œñ™Ë™³›¦Ÿ¥E­¶¶”ÁÂÍíÚÜèC÷ÒMU"¯/<8GúPYU_©cf?fsd–`ÌZ"SÑIý>á2Â%Øy æúlì[ÞõІÄI¹}¯R§ò ‚œš·™j›-ŸÝ¤s¬­µpÀÌÙtçËõbÛö d.â:.FPPXÈ^RcÛeRf·dau[ûSÔJ@'4'Eí ZüÛí½ßBÒ·ÅZºf° ¨ƒ¡Øœ<š¦™'›µž8¤™«²´J¿>Ë7ØæZôëk•-°9E$O‘W8^õb±e_fød…a\ÐTÎKCAe5q(°] ÒýJï á’ÓëÆn»R±Ñ¨¢>cšž™êšAž—£Çªµ³-¾ýÉâÖžäçòvü.Ç+v8 D2NÑVŸ]•begf3eôa¼\UÉL_B¤6È)Ñ Eÿ½ð…âãÔ#È…¼C²˜©§¢£”šœ™¯šÕø¢ú©¾²½¼È“Õ2ãxñˆÌq*A7îBCMV]&bTebfme^bW]jV»M}CÜ7+{E¹0òéã8Ö^Éž½:³`ªG£ žÎ𙙀šk^¢3©Ê±ù»‡Ç:ÔÓáðŽþ e)6ÓAKL8Uk\¾aedfšeÅbî]/W­N”D9o,á³1¡óRåŽ×™ÊÀ¾/´3«å£zž ›¡™Nš Ç¡q¨Ú°äºPÆëÒlà•îý¥ úÆ'Å4´@OKgTÇ[LaÙdXfÈe#c‚^ðWšO¨EG:¿-D #§õ¼æåØÛËß¿0µ¬¤îžI›¯™$š®œ8¡°§ñ¯Ñ¹ÅœÑ ß'íû5 o&ƒ3?PJ’S[Õ`•dJfíec _°XƒPµF~;/©!‘‡ö&è?ÚÍÁ1¶Û¬5¥jŸŽ›À™šTœ¯ ô¦ ¯Å¸ëÃSЧݸë)úÁ!%<2l>LI¸RsZX`Nd3ffÐcš_eYhQÃG¨â2¾%Ýv æúnìWÞùЄÄI¹~¯P§ô œš·™k›+Ÿá¤m¬²µnÀÌÙtçËõcØù a.å:-FPPXÈ^RcÛeRf·daq[TÍJ$@%4'Gê \üÛí¼ßCÒ¶Å[ºd°¨€¡Úœ;š¦™'›¶ž6¤›«±´K¿=Ë7Ø æYôíi•-°9E#O“W4^ùb°e^fùdƒa\ÎTÏKBAe5r(¯^ ÑýLïá”ÓêÆo»R±Ñ¨¢?a𢙿šDž•£Çª·³+¾ÿÉàÖŸäèòuü/Å+z8D5NÍV¤]‘b…ebf7eòa½\œUËL]B¦6Æ)Ó Cÿ¿ð‚âåÔ#ȃ¼F²•©©¢£’šž™®šÖö¢ý©¼²½¾ÈÕ3ã{ñûÿŽÇs*A7íBDMV].bKekffebbU]jV½M{CÝ7+}A¾,òìã6Ö_ɽ;³`ªE£ žÌš›™}šm]¢4©É±û»„Ç=ÔÏáð‡þ _)6ÎAPL3Uo\»ae`fœeÄbî]0W¬N•D9p,ßµ1ŸóUåŠ×žÊ»¾3´0«æ£{ž›¢™Oš É¡o¨Û°äºPÆëÒmà“îý¥ úÇ'Ä4´@OKgTÈ[JaÜdUfÊe!cƒ^ðW›O¦EI:½-E #¦õºæèØØËá¿-µ¬Š¤ñžF›°™$š®œ:¡¬§ô¯Ï¹ Å›Ñ ß%íŸû3 k&ˆ3‹?TJS![Ô`–dIfîec _°XP¸Fy; /¥!“ˆö%èAÚÍÁ.¶Þ¬3¥jŸ›¿™šTœ® ö¦¯Æ¸êÃTЧݷë+ú½'%B2h>NI·RsZY`Ld6ffÕc–_fYjQÀG¬ä2¾%Ûy äúnìYÞöІÄJ¹{¯U§ï ƒœšµ™m›)Ÿâ¤n¬¯µrÀ{Ì”ÙoçÎõaÛö e.à:1F PRXÇ^ScÚeSf·dat[ýSÐJ"@%4'Eì ZüÜí¼ßBÒ¸ÅYºf°¨¡Úœ;š¥™*›²ž:¤˜«±´M¿;Ë9ØæXôík”-®9E$O‘W9^òbµe\fødˆa\ÔTÊKEAd5s(®^ ÑýJï"áŽÓïÆk»T±Ð¨¢;fš™ëš@ž–£Èª¶³,¾þÉßÖ¢äåòvý-Ç+x8D5NÎV¡]•begf1e÷a¹\¡UÆLaB£6Æ)Ï Gÿ¼ð„âãÔ$È…¼B²™©§¢¡—šš™°šÖõ¢ü©¿²½ÂÈ‹Õ8ãuñŠÉr*B7ìBFMV ](bQegfheabU]kV»M}CÛ7+{E¸1òèã9Ö^Éž½9³bªD£ žËš›™~šl_¢1©Í±ö»‰Ç9ÔÓáðŽþ f)6ÑAKL9Uj\¾aebfœeÄbí]0W®N‘D9i,æ¯5óWåˆ× Ê¸¾7´-«é£xž ›Ÿ™RšË¡m¨Ü°äºPÆëÒlà”îý¥ ùÈ'Ã4µ@NKiTÅ[Na×dZfÆe&c~^óW™O§EJ:»-G !¨õ»æçØÚËß¿/µ¬¤ïžH›®™%š®œ8¡±§ï¯Ò¹Å›Ñ ß%ížû5 Œp&ƒ3?RJS [Ö`“dLfëe‚c _±X€P¹Fx; /¦!’‡ö&è@ÚÍÁ1¶Û¬6¥iŸŽ›À™šTœ° ò¦¯¾¸òÃMЭݲë.ú¼%%;2o>HI½RmZ^`Hd9ffÔc˜_eYhQÄG§¸—®›¦h -œñ™É™µ›¦ŸŽ¥I­²¶—ÁÀÍíÚÝèB÷ÕJV"¯/<:GùPYU_©cÿeBfpd™`ÉZ$SÐIþ>á2Á%Úw æúnìWÞûÐÄO¹y¯T§ò €œš¶™j›-ŸÞ¤q¬®µqÀ|Ì“ÙoçÐõ_Üö b.æ:*FPOXÇ^TcÙeSf·dau[ûSÒJ @&4'Eë [üÜí»ßDÒ¶ÅZºf° ¨‚¡Ûœ8š©™&›µž9¤˜«°´O¿:Ë9ØæYôík“-¯9E$O‘W9^ób´e\fødˆa\ÒTÍKCAe5s(­` ÎýOïá”ÓêÆo»Q±Ò¨¢OI·RrZY`Md5ffÔc–_hYfQÄG©ß2Ã%×{ äúnìXÞøÐƒÄK¹}¯Q§ô ~œš´™m›)Ÿâ¤n¬°µpÀ|Ì’ÙsçÊõdÙö e.á:0FPQXÇ^ScÚeTfµdas[üSÓJ@'4'Eí Xüßí¹ßDÒ·ÅYºg° ¨‚¡Ùœ<š¥™)›³ž9¤™«±´L¿=Ë7Øæ\ôén’-¯9E#O’W6^÷b°e`föd†a\ÎTÐKBAc5w(¨e ËýOïá”ÓéÆp»P±Ò¨¢;fš™éšCž”£Êª´³-¾þÉàÖŸäèòuü0Ã+{8D6NÎV¡]•beff3eõa»\ŸUÇLaB¢6É)Ò Eÿ½ð„âãÔ$È„¼C²˜©¨¢¢•šš™²šÓø¢û©¾²½¿ÈŽÕ6ãwñÿÿ‹Èu*<7ôB=MV]*bQeefke^bW]jV¼M{CÞ7+Bº/òëã6Ö`ɽ:³aªE£ žËš™zšp\¢3©Ë±ø»†Ç=ÔÎáðˆþ `)6ÒALL8Ui\ÀaecfšeÅbî]0W¬N”D9r,ݸ-£óPåיʿ¾1´0«ç£zž›¢™Oš Ì¡k¨ß°áºQÆëÒlà•îý¦ ùÇ'Å4³@OKhTÅ[PaÔd\fÅe%c€^òW™O§EJ:¼-E $¥õ¹æèØÙËà¿/µ¬¤ížL›ª™)šªœ;¡¯§ð¯Ó¹ÅŸÑß&í û1 n&ƒ3?QJS![Ô`•dJfîec_­X…PµF|; /¦!“‰ö$èAÚÍÁ0¶Ü¬5¥jŸŽ›¾™šRœ± ò¦ ¯Á¸ñÃMЬݴë,ú¾%%A2h>NI¸RrZY`Md5ff×c“_iYfQÃGªà2À%Ûx åúnìYÞõЈÄF¹¯N§ö ~œšµ™l›+Ÿà¤o¬°µoÀÌŽÙuçËõbÚö d.â:0F PSXÅ^TcÚeSf·dav[úSÔJ@(4'Gì Xüßí¹ßDÒ¸ÅXºe°¨~¡Ýœ9š¥™,›®ž?¤”«³´M¿:Ë:ØæYôíj•-¯9E"O”W5^÷b°e_fød…a\ÏTÐK@Ah5p(¯_ ÏýMïá‘ÓîÆi»W±Î¨¢=aš¢™çšCž–£Çªµ³.¾ûÉäÖœäêòsý/Ä+{8D7NËV¥]b†ecf5eôaº\ UÆLcB 6Ê)Ó Eÿ¼ð…ââÔ%È„¼C²—©ª¢Ÿ˜š˜™³šÓø¢ú©¿²½ÁÈ‹Õ8ãvñŠÉr*B7ìBEMV ](bRedfle^bV]lV¹MCÚ7+{D»-òìã7Ö]É¡½6³cªE£ žÍš›™{šp[¢5©Ê±÷»ˆÇ;ÔÑáð‹þ c)6ÓAKL7Ul\½aebf›eÄbî]1W«N”D9l,ä±2 óTå‹×ʼ¾2´2«ä£|ž›¢™Nš Å¡r¨Ú°ãºRÆéÒmà•îý¦ úÅ'Ç4²@OKhTÇ[LaÙdWfÉe"cƒ^ïWœO¥EJ:½-E #¦õ½æãØÞËÛ¿2µ¬Ž¤ëžN›¨™*šªœ;¡¯§ð¯Ñ¹Å›Ñ ß#í û3 Žo&ƒ3?RJS [Õ`”dJfðe|c_ªX‡P³F~;/¨!’ˆö%èAÚÍÁ2¶Ù¬9¥gŸ›¿™šUœ­ ö¦¯Æ¸ëÃRЩݵë-ú¼%%>2k>LI¸RrZ[`Id:f fÙc“_iYgQÂGªå2¼%Þu çúnìWÞøÐ„ÄK¹|¯S§ñ œš´™m›*Ÿà¤p¬®µrÀzÌ•ÙnçÐõ_Üö b.æ:+FPOXÇ^TcÚeSf¶daq[TÎJ$@#4'Eê ^üØí¾ßBÒ·ÅZºe°¨}¡àœ5šª™&›µž8¤™«±´L¿<Ë9Øæ[ôëk•-°9E#O“W6^öb±e^fød†a\ÑTÌKEAc5t(­_ ÐýLï áÓîÆk»T±Ñ¨¢>cšŸ™éšBž•£Éª´³.¾üÉâÖŸäæòwû/Å+y8D5NÎV¡]”b‚eff3eõa»\ŸUÅLdBŸ6Ì)Ñ Fÿ¼ð„âåÔ È‰¼?²›©¦¢¢–š™™²šÔø¢ú©¾²½¿ÈŽÕ7ãtñˆÉt*>7ñBAMV ]+bNeiffecbT]jV½MzCß7+~B»/òéã:ÖZɤ½3³gª@£žÊšœ™}šm]¢4©É±ú»†Ç;ÔÑáð‹þ b)6ÐAML6Ul\½aeafœeÄbí]1W­N’D9n,á´/£óQåŽ×›Ê¼¾4´.«é£wž › ™Pš Ê¡m¨ß°àºSÆèÒnà•îý¨ ÷È'Ä4´@NKjTÄ[OaÕd\fÄe(c}^óW™O§EI:¾-D #§õ¾æäØÜËÞ¿/µ¬Ž¤ìžL›«™'š¬œ;¡¬§ö¯Ë¹#Å™Ñ ß&íû4 m&…3?PJ’S[Õ`–dIfîec_®XƒP¶F|;/¨!’ˆö%èAÚÍÁ-¶à¬1¥nŸŠ›Á™šRœ± ò¦ ¯Â¸ïÃOЫݴë.úº)%B2i>LIºRoZ]`Id7ffÓc˜_fYgQÄG¨GöP YR_«cþeCfndš`ÉZ$SÑIû>ä2¾%Ûx åúoìWÞøÐ„ÄK¹|¯R§ò ‚œšµ™l›*Ÿâ¤n¬°µoÀ~Ì‘ÙqçÐõ\àò f.â:.FPPXÈ^RcÜePf¹dau[üSÑJ!@&4'Gê \üÛí¼ßCÒ¶Å[ºd°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë<Øæ[ôëk•-±9E(OW<^ñbµe[fûd„a\ÐTÎKBAg5p(°] ÒýIï#áŽÓîÆl»T±Ï¨¢9gšž™èšDž”£Èª¶³-¾üÉãÖžäæòy÷3Â+|8D6NÍV¡]•begf2eöa¹\¡UÅLbB£6Æ)Î Hÿ¼ðƒâåÔ"È…¼D²–©©¢¢”š™­šØô¢þ©½²½ÀÈÕ7ãwñþÿŒÈs*@7îBCMV],bNegfje_bW]iV¼M|CÜ7+zE¹0òêã7Ö^ÉŸ½8³dªC£ žÎš˜™šk]¢3©Ì±ö»‹Ç5ÔÖáð‹þ ` )6ÔAJL8Uk\¾aecfšeÅbï].W¯ND9m,áµ.¤óOå‘×—ÊÁ¾/´2«æ£zž›¡™Pš É¡n¨Ý°áºTÆæÒqà‘îý¥ ùÇ'Å4³@OKhTÆ[NaÖd[fÄe(c}^ôW˜O¨EH:¾-E "©õ¿æãØÜËà¿-µ¬‰¤ñžH›®™&š¬œ:¡¯§ñ¯Ñ¹ÅšÑ ß$íŸû4 Žn&„3?PJ”S[Ù`‘dLfîe}c_­XƒP¸Fx; /¥!”‹ö#èBÚÍÁ0¶Ý¬4¥jŸŽ›¿™šUœ­ ö¦¯Æ¸ëÃRЩݵë-ú½$%@2j>MI¸RpZ]`Hd:f fÖc—_dYjQÂG©ã2À%Úx æúlìZÞøÐÄO¹x¯U§ò œš´™l›*Ÿâ¤n¬¯µrÀyÌ–ÙoçÍõbÚ÷ c.ã:-FPNXÉ^RcÚeSf·daw[øSÕJ@'4'Fê \üÛí¼ßDÒµÅ[ºe°¨¡Úœ:š¦™*›±ž;¤˜«°´O¿8Ë<Øæ\ôém’-¬9E$O‘W8^õb±e_fød…a\ÑTÌKFAa5v(¬_ ÑýKïá“ÓéÆq»N±Õ¨¢?cšŸ™çšEž“£Êªµ³+¾ÊÞÖ¡äçòuü.Æ+y8D5NÌV¤]’b„edf4eôa½\œUÊL^B¥6Ç)Ð Fÿ½ð„âãÔ%ȼH²“©«¢¡•š›™°šÕ÷¢û©¿²½ÁÈÕ6ãwñÿÿ‹És*?7ïBCMV ],bMejffebbU]kV»M|CÝ7+}B¼-òìã6Ö_ÉŸ½7³dªB£žÉš™|šm_¢1©Ì±ø»‡Ç:ÔÒáð‹þ a)6ÓAKL8Uj\¿aebfœeÄbí]2WªN–D9q,Þ·.¢óRåכʽ¾3´0«æ£zž ›¡™Oš É¡o¨Ü°ãºPÆêÒnà’îý£ ûÅ'Æ4²@RKdTÉ[KaÙdYfÇe#c‚^ðW›O¦EI:¾-C &¤õ¼æäØÝËÝ¿1µ¬¤ížK›¬™'š¬œ8¡²§ï¯Ò¹ÅšÑß!í£û0 p&3‘?QJS [Õ`•dIfïe~c_¯XP¹Fx; /¦!’‡ö%èCÚÍÁ-¶Þ¬5¥gŸ‘›¾™šSœ¯ ô¦ ¯À¸ñÃMЭݳë-ú¼'%C2g>OI¶RsZY`Ld8f f×c”_hYhQÁG¬fud”`ÌZ$SÐIü>ã2¿%Ú{ âúoìYÞõЇÄI¹}¯R§ñ ‚œš¶™l›*Ÿá¤n¬±µoÀ~ÌÙsçÌõbÛô g.ß:2F PSXÆ^TcÙeTf´dar[ýSÐJ#@#4'Cí [üÚí¾ß?Ò»ÅXºe°¨~¡Þœ7š©™&›µž9¤˜«²´L¿;Ë;Øæ]ôêl“-¯9E#O’W6^øb¯e`f÷d…a\ÎTÏKBAe5s(­a ÍýNïá’ÓíÆk»T±Ð¨¢=cšŸ™êšAž–£Èªµ³-¾þÉàÖ äæòvý-Ç+w8 D4NÍV¤]‘b„eff1e÷a»\UÊL^B¤6É)Ö @ÿÂðâçÔ!È…¼E²”©¬¢Ÿ–𛙝š×õ¢ý©¼²½¿ÈÕ8ãtñ‰Ês*?7ðB@MV],bOeefke_bW]iV½MzCÞ7+{D»,òîã4Ö`ÉŸ½7³dªB£ žÌš›™}šm]¢3©Ë±ø»‡Ç;ÔÐáð‹þ b)6ÒALL6Ul\½aecfšeÅbí]0W®N’D9o,àµ0 óTå‹×ʽ¾0´5«ß£ž›£™Oš Ê¡o¨Û°äºOÆìÒlà•îý¨ ÷É'Ä4±@TKaTÎ[FaÜdWfÈe$c€^òW˜O©EH:½-F !¨õ¼ææØÙËá¿.µ¬Œ¤îžJ›­™&š­œ8¡±§ð¯Ò¹ÅÑ ß'íû5 p&‚3?RJŽS#[Ó`–dJfìec _±X€P¹Fx; /¤!”‡ö'è?ÚÍÁ4¶Ø¬9¥gŸŽ›Á™ÿ™Xœ¬ õ¦ ¯Ã¸îÃQШݷë+ú¾%%C2f>QIµRsZZ`Kd7ffÕc—_eYjQÀG«¦(®¸·ÂÂÏMÜGê·øJ¶·#ø0A=DHÜQ½YÝ_úc f)f&d`ZHRÌHÓ=ž1c$opùÿêúÜ«ÏXÃ<¸š®˜¦j +œò™É™¶›¤Ÿ¥F­¶¶“ÁÄÍëÚÝèB÷ÔLU"°/<;GùPYU_©cfAfpd˜`ÊZ%SÏIþ>à2Ã%Ö} àúrìVÞùЂÄN¹x¯V§ð œš·™i›.ŸÜ¤s¬­µrÀ{Ì“ÙpçÎõaÚø b.â:1F PTXÅ^ScÜePf¹dav[ùSÕJ@)4'Gê \üÛí¼ßCÒ¶Å[ºd°¨~¡Üœ:š¦™)›²ž:¤™«°´N¿9Ë;Øæ]ôèo‘-±9E'OW8^õb±e^fùd…a\ÎTÏKBAf5r(®_ ÏýMïá’ÓíÆl»R±Ñ¨¢9iš™™íšAž•£Çª·³,¾þÉàÖŸäçòwú0Å+y8 D3NÎV¤]‘b†eaf7eòa¾\›UÊL`B¢6Ê)Ô Dÿ¾ð‚âæÔ!Ȇ¼D²”©­¢˜šš™°šÔù¢ù©¿²½¾ÈÕ7ãtñ‰Êr*@7ïBCMV ])bQeffieabU]jV½MyCà7+}Cº0òèã:Ö[É¡½9³`ªG£ žÍšœ™|šo\¢3©Ë±ø»‡Ç;ÔÑáð‹þ b)6ÐAML6Um\¼ae`f›eÇbé]6W¨N–D9n,áµ/¢óRåלʼ¾3´0«æ£|ž›¥™KšÇ¡p¨Ú°äºQÆéÒpàîý¤ úÆ'Æ4²@QKeTÉ[JaÚdXfÈe#c^ðWœO¥EJ:¼-E %¤õ¹æçØÛËß¿/µ¬Œ¤ïžI›®™%š­œ9¡¯§ò¯Ð¹Å›Ñ ß$í û2 m&„3?RJS[×`’dNfêec _®X„PµF|;/©!†ö'è@ÚÍÁ0¶Ü¬6¥gŸ›¿™šTœ® õ¦ ¯Ã¸îÃPЪݶë*ú¿$%@2i>NI·RrZ[`Jd8f f×c”_hYgQÃG©â2À%Ù{ âúpìWÞùЂÄL¹|¯R§ó €œš·™j›,Ÿà¤o¬¯µpÀ~ÌÙtçÊõcÚö e.à:1F PSXÅ^TcÙeTf¶dar[þSÏJ$@#4'Eê ^üÙí¼ßDÒµÅ\ºd°¨‚¡Úœ:š¦™)›²ž;¤˜«±´L¿<Ë8ØæZôëk•-±9E&OW9^ôb²e^fùd…a\ÐTÌKGAa5v(«a ÎýOïá–ÓèÆp»R±Ï¨¢9išš™ìš@ž–£Éª´³.¾üÉáÖŸäèòvû/Ä+|8D:NÈV§]b„edf4eõa»\žUÇLbB¡6Ê)Ð Hÿºð‡âàÔ&È‚¼F²–©§¢¤“šœ™±šÒû¢ø©À²½ÀÈÕ4ãyñþÿŠÊr*A7ïBAMV ]*bPeffieabU]kVºMCÙ7!+wH¶3òçã:Ö\ÉŸ½;³^ªH£ žËšŸ™yšp[¢5©È±ü»„Ç<ÔÐáðŠþ b)6ÐAOL4Uo\ºaeafœeÄbî]0W«N—D9r,Þµ0¢óQåיʿ¾1´0«è£xž › ™QšË¡m¨Ý°âºRÆêÒlà–îý© öÉ'Ä4´@OKfTÈ[LaÙdXfÈe#c^ñWšO§EI:¼-F #¦õ¼æåØÛËß¿.µ¬‹¤ížL›ª™)š«œ:¡¯§ñ¯Ñ¹Å›Ñ ß#í¡û1 m&…3?PJ“S[Ù`’dLfìec _°XƒPµF};/§!”‹ö"èEÚÍÁ,¶Þ¬5¥iŸ›¿™šUœ¯ ó¦ ¯Á¸ïÃPЩݷë*ú¾%%A2h>OI¶RtZW`Od4ffÕc”_jYeQÅG§¦(®¹·¿Â ÏIÜJêµøK¶¸#õ0C=EHÚQÀYÚ_ûc!f'f'd`ZKRÈH×=›1e$mpùÿêûÜ©ÏYÃ;¸›®—¦l *œð™Í™°›«Ÿ‰¥M­®¶›Á½ÍðÚÚèC÷ÔLT"²/å2½%Ýv æúlì\ÞôЇÄG¹€¯O§õ œš¹™g›/ŸÝ¤r¬­µsÀzÌ”ÙpçÍõcÙ÷ d.à:2F PQXÈ^QcÝePf¸das[ýSÑJ @(4'Dî YüÝí»ßCÒ¶Å\ºc°¨€¡Üœ8š©™$›¹ž4¤œ«¯´M¿<Ë8ØæYôël•-°9E'OW;^ñb´e]fødˆa\ÒTÌKCAf5r(®^ ÑýKï á‘ÓìÆm»S±Ð¨¢QIµRsZY`Md4ffÐcš_cYkQÀG¬ä2¿%Úx æúlì\ÞóЇÄJ¹{¯T§ñ €œš²™o›(Ÿã¤m¬°µpÀ}Ì’ÙqçÎõ`Û÷ b.ä:.FPOXÈ^RcÜeRf·dau[ýSÐJ#@"4'Bï XüÝí»ßCÒ¸ÅXºh° ¨ƒ¡Ùœ;š¦™(›´ž9¤™«°´N¿:Ë:Øæ\ôéo-°9E'OŽW:^ób³e^fød†a\ÑTÍKDAc5u(¬a ÎýLï á‘ÓíÆl»S±Ñ¨¢>a𢙿šEž“£Éªµ³.¾ûÉäÖ›äëòtû1Ã+z8D5NÌV¦]Žb‡edf2eøa¸\ŸUÊL]B¥6È)Õ AÿÁðâåÔ#ȃ¼G²“©­¢˜šš™¯š×õ¢ü©¾²½ÀÈÕ7ãvñŠÉt*>7ðBBMV ])bPegfhebbU]jV¼M|CÜ7+zEº.òëã7Ö^ÉŸ½9³`ªH£žÎšš™šk`¢/©Î±ö»ŠÇ7ÔÔáðŒþ b)6ÑAML6Ul\¾aecf™eÆbí]0W®N’D9o,àµ0 óSåŽ×šÊ¾¾2´/«è£yž ›¢™Mš Å¡s¨Ø°æºOÆëÒlà”îý¢ ýÄ'Ç4²@PKeTÊ[JaÚdXfÆe&c^òWšO¦EI:¿-B &¥õÀæáØÞËÞ¿.µ¬‹¤ïžJ›¬™'š«œ;¡®§ó¯Î¹!ÅšÑ ß%íŸû2 ‘l&„3?PJ’S[Õ`”dLfëe‚c _®X…P´F|; /¥!–‹ö#èBÚÍÁ/¶Ý¬4¥lŸ‹›Â™ÿ™Wœ­ ö¦¯Å¸íÃOЭݲë.ú½#%?2h>QI³RvZW`Md6ffÔc˜_dYkQÀG«â2¿%Üv çúlìZÞ÷ЃÄM¹y¯U§ñ œšµ™l›+Ÿá¤n¬¯µrÀzÌ–ÙmçÐõ_Ýô f.ß:2F PRXÇ^RcÛeRf·dau[ûSÒJ @&4'Fë [üÜí»ßDÒµÅ\ºc°¨~¡Üœ8š¨™'›¶ž6¤š«±´L¿<Ë8Øæ\ôém’-¯9E&OŽW;^òb´e^f÷d…a\ÍTÒK?Ag5r(®_ ÐýKï!áÓíÆl»T±Ð¨¢;fš™ëš@ž—£Çªµ³.¾ûÉäÖäèòuü/Å+z8D5NÎV¢]“bƒeef3eöaº\ UÅLdBž6Î)Õ BÿÀðâçÔȈ¼A²™©¨¢¡•šœ™®šØô¢þ©»²½½È‘Õ4ãwñ‰Ër*?7ðBBMV ](bReefje_bW]jV¼M{CÞ7+A»0òèã:Ö[É¡½8³aªF£ žÌšœ™{šo]¢2©Í±ö»ˆÇ;ÔÏáð‰þ a)6ÔAKL7Ul\¼aeafeÂbï]0W¬N•D9o,â²3ŸóSåלʼ¾3´0«å£}ž›¤™Mš È¡o¨Ü°áºTÆèÒnà“îý¥ úÆ'Å4´@OKgTÆ[OaÖdZfÆe%c^ôW—O¨EI:¼-F #¦õ»ææØÛËß¿0µ¬¤îžI›¯™#š¯œ7¡²§î¯Ô¹ÅŸÑ ß&ížû3 l&…3?QJ‘S[Õ`•dKfìec _±X€PºFw;/£!•†ö)è=Ú!ÍÁ2¶Ù¬9¥fŸ›À™ÿ™Xœ« ÷¦ ¯Ã¸îÃPЪݶë*ú¿$%@2i>NI·RsZX`Nd4ffÖc“_jYfQÁG­æ2½%Üw çújì]ÞóЈÄH¹}¯R§ò ƒœš¹™i›,Ÿà¤p¬®µqÀ~ÌÙtçËõaÝô e.â:.FPPXÈ^RcÛeRf·das[ýSÑJ!@&4'Hè _üØí¿ß@Ò¹ÅXºg°¨€¡Üœ9š§™(›³ž:¤˜«±´M¿<Ë7Ø æWôðh•-­9!E O”W6^öb±e_föd‰a\ÒTÍKCAg5o(±[ ÕýGï#áÓîÆj»W±Ì¨¢7hšœ™ëšAž–£Çª·³+¾þÉáÖŸäçòvü-Ç+y8D8NËV¢]–beif0e÷aº\ŸUÇLaB¢6É)Ò Dÿ¾ð„ââÔ&ȼF²•©¬¢šš–™³šÕö¢ü©¾²½ÂÈ‹Õ9ãuñÿÿŒÈr*C7ëBEMV ])bQedfme\bZ]fV¾M|CÜ7+|B¼.òëã7Ö]É ½8³bªE£ žÌšœ™}šl_¢1©Í±÷»ˆÇ9ÔÓáð‹þ ` )6ÔAIL:Ui\¿aebfœeÄbí]1W¬N“D9m,â´/¢óRåלʼ¾3´/«é£vž ›™SšË¡n¨Ü°ãºPÆìÒkà•îý¥ ûÄ'È4°@SKdTÉ[KaÚdVfÊe"c^òW™O§EI:¼-G !©õ½ææØÙËâ¿,µ¬ˆ¤òžG›¯™$š¯œ6¡²§ð¯Ð¹ Å™Ñ ß"í¤û- ”i&ˆ3Œ?TJŽS"[Ó`—dGfòezc_©X‡PµFz; /¤!”‡ö'è?ÚÍÁ1¶Û¬7¥gŸ›¾™šTœ® õ¦ ¯Å¸ìÃQЪݵë+ú¿#%@2h>OI¶RtZX`Md6ffÖc•_gYiQÁG«ä2¿%Úy ãúpìXÞ÷Ð…ÄI¹~¯P§õ ~œš´™l›+Ÿß¤q¬­µsÀzÌ”ÙpçÍõbÚ÷ c.ã:-FPNXÊ^PcÜeQfºdau[ûSÑJ#@$4'Dí ZüÜí¼ßBÒ¸ÅZºe°¨€¡Ûœ:š§™'›µž7¤š«±´K¿>Ë6Ø æWôîj”-®9E%OW:^òbµe\fùd…a\ÏTÐK@Ah5q(®_ ÐýLïá’ÓëÆo»P±Ô¨ ¢A`š£™åšEž“£Êª´³/¾ùÉæÖ›äëòsü/Å+z8D3NÏV¢]’b…ecf4eöa¹\¡UÄLeBž6Ì)Ñ Gÿ»ð…âäÔ"Ȇ¼B²˜©¨¢¢•š›™°šÔù¢ù©À²½ÂÈŒÕ8ãtñ‰Ét*>7ðBCMV ](bPegfhebbT]kV»M}CÛ7+{Dº/òêã8Ö]É ½8³bªE£ žÏš—™‚ši`¢2©É±ü»ƒÇ>ÔÎáðˆþ _ )6ÐAOL3Uo\¼aebf›eÄbï]/W­N“D9o,àµ/¢óRåכʿ¾/´3«å£zž ›Ÿ™Pš È¡p¨Ú°äºPÆëÒmà“îý¤ üÄ'Ç4²@OKiTÄ[Oa×dYfÇe$c€^óW—OªEF:À-B &£õ¸æèØÙËà¿/µ¬‹¤ðžG›°™#š°œ5¡´§ì¯Ö¹Å Ñß&ížû3 m&„3Ž?SJS [Õ`“dMfìec_­X„PµF|; /§!“‰ö$èBÚÍÁ/¶Ü¬5¥kŸ‹›Ä™ý™Xœ¬ õ¦ ¯Ã¸íÃQЩݶë+ú½'%C2f>OI·RsZX`Od1ffÐc›_cYiQÃG§¦(®¸·ÁÂÏKÜHê·øH¹µ#ú0>=HH×QÃYØ_þcf+f$d`ZJRËHÔ=1d$moùëùܬÏVÃ?¸–®œ¦h +œó™Ç™·›¥ŸŽ¥H­³¶–ÁÂÍìÚÞè?÷×IW"°/<=GöP YQ_®cûeEfnd˜`ËZ#SÑIü>â2Á%Ùy åúlì]ÞòЈÄJ¹y¯X§ì …œš¶™k›,ŸÞ¤r¬­µrÀ{Ì”ÙoçÐõ^Ýô f.á:0F PSXÄ^Wc×eTf¶dau[ûSÑJ!@&4'Eê ]üÚí½ßBÒ·ÅZºf°¨¡Úœ;š¥™*›²ž:¤˜«±´M¿;Ë:Øæ[ôìk”-®9 E!O”W5^÷b±e^fød†a\ÒTËKEAc5t(®] ÒýJï!á‘ÓëÆm»T±Ð¨¢7ñB?M V]0bKeifie_bW]jV»M}CÜ7+~@¿*òîã4Öaɽ9³bªD£ žÍ𙙀šk^¢3©Ê±ú»†Ç;ÔÐáð‰þ a)6ÐANL5Um\¼aeafœeÄbí]1W¬N”D9m,ã²2 óSåŒ×Ê»¾4´/«æ£{ž›¡™Oš È¡p¨Û°âºSÆéÒmà•îý¨ ÷É'Ã4µ@NKgTÈ[LaØdYfÇe$c^ðWœO¤EK:½-C &£õ¹æçØÚËß¿0µ¬‹¤ñžF›°™%š¬œ:¡¯§ñ¯Ò¹ÅšÑß"í¢û0 m&…3?PJ“S[Ù`’dKfïe|c_ªX†PµFz; /¢!—†ö*è:Ú%ÍýÀ5¶×¬:¥fŸ‘›½™šUœ® õ¦ ¯Â¸ïÃOЫݵë+ú¾$%?2j>LI¹RqZ[`Kd6ffÕc—_eYjQÀG«¦(®¸·ÂÂÏNÜGê¶øJ¸´#û0>=GHÚQÀYÙ_þcf+f%d`ZGRÌHÔ=œ1e$nrùýêûܬÏVÃ>¸—®š¦j ,œï™Ì™²›¨Ÿ¥I­³¶•ÁÃÍëÚÞèA÷ÕLS"³/<@GôP YP_­cüeDfod™`ÈZ&SÏIý>â2À%Úx åúnìYÞ÷ЃÄL¹{¯S§ó ~œš³™m›*Ÿá¤n¬±µoÀ}Ì’ÙqçÎõ_Ýô f.á:/FPPXÉ^PcÝePf¹dat[ûSÓJ@'4'Eì [üÚí¾ß@ÒºÅWºg°¨¡Úœ<š¢™-›°ž<¤—«±´M¿:Ë<Øæ\ôêl”-°9E$O“W5^÷b±e]fúd„a\ÑTÍKCAe5r(°\ ÓýIï!á’ÓêÆo»Q±Ò¨¢:hš™™ïš>ž˜£Çªµ³-¾ýÉáÖ äæòwú0Å+x8 D5NÍV£]“b€ejf.eúa·\¡UÆLaB¢6É)Ó CÿÀðâåÔ#È„¼E²–©©¢¡–šš™°šÕø¢ú©¾²½¾ÈÕ5ãvñ‹Çv*=7ñBAMV ],bOeffje_bW]jV»M}CÛ7+{Dº/òêã8Ö]É ½8³aªG£ žÎšš™~šl_¢2©Ë±ø»‡Ç;ÔÑáðŠþ c)6ÑALL7Ul\¼ae`fœeÄbî]0W­N“D9p,ß¶/¢óPå‘×—ÊÁ¾0´0«è£xž ›¡™Oš Ê¡m¨Ý°âºRÆêÒlà•îý© öÊ'Â4µ@NKiTÅ[OaÕd\fÄe'c~^óW™O¨EG:¿-C %¥õ½æâØßËÛ¿2µ¬¤îžI›®™%š­œ:¡®§ò¯Ñ¹ÅŸÑß'íœû5 Žp&3’?LJ—S[Ù`‘dMfëe‚c _¯X‚P¸Fy; /¥!’†ö'è@ÚÍÁ0¶Ú¬8¥gŸ›¾™šRœ± ó¦ ¯Á¸ðÃMЮݲë.ú»(%B2h>NI·RsZY`Ld7f f×c”_iYfQÃGªæ2¼%Ýx ãúpìXÞöІÄJ¹|¯S§ñ œš¶™k›*Ÿâ¤l¬´µlÀÌÙtçËõbÚ÷ c.ä:,FPNXÉ^ScÙeTfµdat[üSÑJ!@%4'Cí ZüÜí¼ßBÒ¸ÅWºi° ¨‚¡Ûœ9š§™(›³ž:¤˜«²´K¿=Ë8ØæZôìk”-¯9E%OW8^öb¯ebfôd‰a\ÐTÎKCAd5t(¬` ÏýMïá“ÓêÆn»S±Ð¨¢;dš ™çšEž’£Êª¶³+¾ÿÉßÖ¡äåòxù1Å+x8 D2NÐV¡]“b…ebf6eôaº\¡UÄLdB 6Ê)Ò Dÿ¿ðâæÔ"È„¼E²•©ª¢¡•šœ™­šÙó¢ÿ©»²½¿ÈŽÕ7ãuñ‹Ér*B7ëBGMV ]*bPeefle]bX]jV»M|CÝ7+}Cº/òéã:Ö[É¢½6³cªE£ žÏš˜™€šj`¢1©Ì±÷»ˆÇ:ÔÒáð‹þ a )6ÕAIL9Uk\½aebf›eÄbî]/W¯ND9j,ä³0¡óTåŠ×ŸÊº¾3´1«ä£}ž›£™Nš Ç¡q¨Ú°åºOÆëÒlà•îý¦ úÅ'Ç4±@RKdTÊ[JaÚdXfÈe#c^ñW›O¥EJ:¼-G "¦õºæéØØËá¿.µ¬¤ïžH›¯™#š°œ6¡³§ì¯Ö¹ÅŸÑß%í¡û0 ’l&ƒ3“?LJ•S[×`“dLfìec_ªXˆP²F}; /¥!•Šö%èAÚÍÁ/¶Ü¬7¥gŸ›¾™šRœ² ñ¦ ¯Â¸íÃQЪݵë-ú»'%@2i>MI¸RrZZ`Ld5ffÔc—_fYiQÀG­â2Á%Ùz ãúnìZÞõЇÄH¹~¯Q§ó €œš´™m›)Ÿã¤m¬±µoÀ|Ì”ÙoçÐõ^Ýô e.ã:-FPOXÈ^RcÜePfºdau[üSÑJ!@'4'Gê \üÜí»ßBÒ¸ÅYºg° ¨¡Ûœ:š¦™)›²ž;¤—«²´L¿<Ë9Øæ]ôèo‘-¯9E&OW:^ób³e^f÷d‡a\ÐTÎKCAe5r(¯^ ÐýMïá’ÓíÆk»T±Ð¨¢NI¸RqZ[`Jd9f fÙc’_iYhQÀG¬á2Á%Ùz ãúpìVÞúЂÄL¹|¯Q§ó ‚œš¹™h›.ŸÝ¤s¬«µtÀ{Ì‘ÙtçÊõcÛô f.á:/FPQXÇ^ScÚeRf¸dav[ûSÑJ"@#4'Bî Xüßí¸ßFÒ´Å]ºc°¨¡Ûœ;š¦™(›´ž7¤›«¯´N¿;Ë9Øæ[ôëk–-²9E&OW:^ób³e^f÷d†a\ÎTÐKAAe5t(¬a ÎýMïá“ÓìÆl»S±Ñ¨¢=dšž™êšAž–£Çª·³,¾ýÉáÖ äæòwú1Ä+z8D5NÎV¢]”b€eif0e÷aº\žUÈLbB 6Ë)Ô Cÿ¿ð‚âåÔ"È…¼D²–©©¢¡—š˜™³šÒù¢ú©¿²½ÀÈÕ7ãuñˆÌp*B7íBCMV],bPedfme]bW]jV¼M{CÞ7+}Cº/òëã6Ö`É›½=³^ªG£ žÊš™{šo]¢3©Ê±ù»‡Ç;ÔÑáðŒþ a!)ÿ5ÖAIL9Uk\¾aeef˜eÇbí]/W¯ND9k,ã³/¤óOå‘טʿ¾1´0«ç£{ž›¥™JšÄ¡r¨Ù°æºOÆëÒkà—îý© öÈ'Æ4±@QKgTÆ[NaÖd[fÅe'c}^ôW˜O©EF:À-C $§õ¾æãØÝËÞ¿/µ¬Š¤ïžK›«™(š«œ9¡±§ï¯Ó¹Å›Ñ ß#í¡û2 m&†3?SJS[Ö`•dHfòezc_«X…P¶Fz; /¥!”†ö(è>ÚÍÁ1¶Ú¬8¥fŸ’›¼™šQœ± ó¦ ¯Ã¸îÃOЬݳë.ú»&%@2i>MI·RtZX`Md5ffÕc—_eYjQÀG«=IH×QÂYØ_ÿcf-f#d`ZLRÉHÕ=ž1b$opùëùܬÏVÃ=¸›®•¦n (œó™Ê™³›§ŸŽ¥H­³¶—ÁÀÍîÚÜèA÷ÖJV"°/<ä2À%Ùy åúlì[ÞöЄÄK¹|¯R§ó œšº™f›0ŸÝ¤q¬®µqÀ|Ì“ÙpçÎõ`Ýô e.â:.FPQXÆ^Uc×eVf´dar[þSÏJ#@$4'Dì [üÛí½ßAÒ¸ÅZºe°¨~¡Ýœ8š¨™(›³ž9¤š«®´P¿9Ë9Ø æWôïh–-°9E"O“W6^öb²e^f÷d‡a\ÒTÌKDAe5q(°] ÑýLïá“ÓëÆn»R±Ñ¨¢=ešœ™íš>ž™£Åª·³,¾þÉáÖžäèòuý,É+u8 D2NÎV£]’b„edf4eõaº\ UÅLdB 6Ê)Ñ Eÿ¿ð‚âåÔ"È…¼C²˜©¨¢¢–š˜™³šÓø¢ü©¼²½¿ÈŽÕ6ãwñÿÿŠÌn*E7êBFMV ]*bNeifgebbU]jV¼M{CÞ7+}C»-òíã5Ö_ÉŸ½8³cªD£ žÍš›™}šm^¢1©Í±÷»‡Ç<ÔÏáð‰þ `!)6ÕAIL9Ul\¼ae`feÄbî]/W®N‘D9l,ã²1¡óRåŽ×›Ê¼¾5´-«è£zž›¤™Lš Æ¡r¨Ø°çºLÆïÒià—îý¦ úÆ'Æ4²@PKgTÇ[Ma×d[fÄe'c^ñW›O¥EL:º-H ¨õ»ææØÛËÞ¿0µ¬‹¤îžK›«™(š¬œ8¡±§ð¯Ñ¹Å›Ñ ß%íŸû3 m&…3?QJS [Õ`•dJfíe€c _°X‚P·Fz; /§!’†ö(è>Ú ÍÁ2¶Û¬6¥iŸŽ›¿™šSœ¯ õ¦ ¯Å¸ìÃQЩݸë(úÁ"%A2f>QI´RuZY`Jd9f fÙc“_iYfQÃGªã2¿%Ûw çúkì\ÞôЇÄH¹¯O§õ œš·™j›+Ÿà¤q¬­µrÀ|Ì‘ÙsçÌõaÛö d.â:.FPPXÈ^RcÛeQf¹dau[ûSÒJ @'4'Eì ZüÝíºßDÒ·ÅYºg° ¨€¡Þœ5š«™&›³ž;¤—«±´N¿:Ë9Ø æWôîi–-±9E&OW9^õb±e_fød„a\ÍTÑK@Ah5p(®a ÍýOïá”ÓëÆm»S±Ð¨¢=cšŸ™éšBž–£Èª´³/¾úÉåÖ›äëòsý/Ã+|8D6NÍV¢]“bƒeff1eøa¸\ UÈL_B¤6È)Ó CÿÀðâåÔ$ȼI²‘©®¢ž—š™™±šÖö¢û©¾²½ÁÈÕ7ãuñŠËp*C7ëBFMV ]'bReefje`bV]iV½M{CÞ7+}B¼.òëã6Ö_Éž½:³`ªG£ žÎšš™~šm]¢3©Ê±ú»…Ç=ÔÎáð‡þ a)6ÐAML7Uk\½ae_fžeÂbî]3W©N–D9m,ã³0¢óQåיʿ¾0´2«æ£yž ›Ÿ™Qš È¡p¨Ú°åºPÆêÒnà’îý¥ ùÇ'Å4²@RKdTÊ[IaÛdWfÉe"c‚^ðW›O¦EJ:¼-F "§õ½æäØÜËÞ¿0µ¬Ž¤ížJ›®™$š®œ9¡¯§ò¯Ð¹ÅŸÑß)íû3 n&ƒ3?RJŽS#[Ò`—dJfìec _¯X„PµF{; /¦!”Šö#èCÚÍÁ.¶Ý¬5¥jŸ›Á™šUœ¯ ô¦ ¯Â¸ïÃNЬݵë+ú¾$%?2j>LI¹RrZY`Md5ffÔc–_hYfQÅG§=IH×QÃYÖ_df+f%d`ZIRËHÔ=1d$noùëùÜ­ÏVÃ=¸š®–¦n (œó™Ê™²›©Ÿ‹¥L­°¶—ÁÁÍîÚÚèD÷ÓLV"¯/<>GôPYO_®cüeBfqd˜`ÉZ%SÏIý>ä2¾%Úy äúpìXÞöÐ…ÄJ¹}¯S§ð ƒœš¹™h›.ŸÝ¤r¬­µrÀ|Ì‘ÙrçÌõcÚõ f.ß:2F PRXÆ^TcÚeRf·das[þSÏJ#@$4'Cî YüÝí»ßBÒ¹ÅWºh°¨¡Þœ6šª™&›µž8¤™«±´M¿:Ë;Øæ]ôén‘-¯9E&OW9^õb±e_f÷d‡a\ÐTÎKCAe5s(®] ÒýJï"áÓíÆl»T±Ð¨¢MI¸RrZZ`Kd7ffÖc–_dYlQ¾G­ä2¿%Ûw çúkì\ÞôІÄJ¹|¯S§ñ ‚œš¶™k›+Ÿá¤n¬±µnÀÌ‘ÙpçÏõ_Ýõ c.ã:/FPQXÆ^TcÙeTf¶dat[üSÐJ$@!4'@ð XüÜí½ßAÒ¸Å[ºb°¨|¡Þœ9š¦™)›²ž;¤—«³´J¿>Ë6Ø æWôïh–-°9E$O‘W7^öb²e]fúd‚a\ÍTÏKCAe5q(°^ ÏýOïá–ÓêÆn»R±Ñ¨¢>bš¡™çšBž˜£Äªº³*¾ýÉâÖžäèòvú0Æ+w8 D3NÎV£]’bƒegf1eöa»\UÊL_B£6É)Ó Eÿ»ð‡âàÔ&ȃ¼E²•©ª¢¡•šœ™¯šÕø¢ù©Á²½ÄȈÕ<ãrñŠÉs*?7ñB?MV]+bQeefje`bU]kV»M}CÜ7+|B¼.òëã6ÖaÉ›½<³_ªG£ žÏš™™šl]¢3©Ì±÷»ˆÇ:ÔÐáðˆþ ^!)6ÖAHL9Uk\½ae`fžeÁbñ]-W¯N’D9p,Þ·.¢óRåŽ×›Ê½¾2´0«æ£|ž›£™Nš È¡o¨Ü°ãºQÆéÒnà”îý§ øÈ'Å4²@PKgTÇ[MaØdXfÈe$c€^ñWœO£EN:¸-I !§õ¼æçØÚËÞ¿1µ¬¤ížI›¯™$š®œ9¡®§ó¯Ð¹ÅŸÑß)íœû4 l&…3Ž?RJ‘S[Õ`•dJfíe€c _¯X‚P·F{; /¨!‘ˆö%èAÚÍÁ.¶Ý¬6¥hŸ›¾™šVœ® ô¦ ¯Â¸ïÃOЫݴë-ú½%%@2j>LI¹RrZX`Nd5ff×c”_hYgQÃG©÷ØHX"¯/<>GõP YT_¨cf>frd™`ÈZ&SÏIü>ä2¾%Ýt êúiì]ÞóЉÄF¹¯R§ï †œš¹™i›,Ÿà¤o¬°µoÀ~Ì‘ÙqçÎõ`Û÷ b.ä:.FPPXÉ^PcÞePf·dar[þSÐJ!@&4'Fê ]üÙí¾ßAÒ¸ÅYºf°¨¡Ýœ7šª™%›·ž5¤«­´P¿9Ë:ØæZôên-«9 E"O“W7^õb±e`födˆa\ÐTÎKDAc5v(©b ÏýKï"áŽÓïÆj»V±Í¨¢:fšœ™íš=ž›£Ãª¸³-¾ûÉäÖ›äëòsþ,Ç+y8D7NÊV¥]’bƒeef4eóa½\žUÆLcBŸ6Ì)Ñ Gÿºð†âãÔ"ȇ¼@²š©§¢£“šœ™¯šÖ÷¢û©¾²½ÂÈ‹Õ9ãtñ‰Ëq*A7íBEMV ](bRecfoeZb[]fV¾M{CÝ7+}B¼,òîã4Ö`Éž½9³aªG£žÏš™™šm]¢2©Ì±÷»ŠÇ7ÔÔáðþ d)6ÒALL6Um\¼aeaf›eÅbï]-W°ND9l,ã²2 óRåיʿ¾0´2«å£{ž›¢™MšÄ¡s¨Ù°åºPÆêÒmà”îý¤ ûÅ'Ç4±@RKdTÊ[JaÚdWfÊe c„^îWžO£EK:¼-E %¤õ¼ææØÛËÞ¿0µ¬Ž¤ížJ›­™&š­œ8¡±§ï¯Ó¹ÅÑ ß%íŸû3 Žo&‚3‘?PJ’S[Ö`•dIfïe~c_°XP»Fv;/¤!”‹ö"èDÚÍÁ0¶Û¬6¥jŸŒ›Â™ÿ™Wœ¬ ö¦ ¯Ä¸îÃNЭݲë/ú»&%C2f>PIµRtZY`Ld7f fÙc‘_lYdQÄGª¸—®›¦h -œð™É™¶›¥Ÿ¥G­´¶•ÁÃÍëÚÞè@÷ÖJV"±/à2Â%Ùw èújì]ÞóЇÄI¹}¯R§ñ ‚œš¶™l›)Ÿâ¤m¬²µnÀ~Ì‘ÙqçÎõaÚ÷ c.ã:.FPPXÈ^ScÙeUf´dar[ÿSÎJ$@"4'Bï Wüßí¹ßEÒµÅ\ºc°¨|¡ßœ7š¨™)›²ž9¤š«¯´O¿:Ë8Ø æYôìk“-¯9E"O”W4^ùb®e`fød…a\ÏTÍKFAa5v(«` ÑýJï!áÓìÆn»Q±Ó¨¢=dšž™êšBž•£Éª³³0¾ùÉåÖäèòuü.Ç+x8D5NÎV¢]’b…ebf7eóa»\ŸUÆLbB¢6È)Ï Gÿ¼ð…âáÔ'ȼF²–©©¢ ™š–™´šÒú¢ø©Â² ½ÄÈŠÕ9ãuñÿÿŽÃz*97óBAMV ])bPegfhebbT]lVºM}CÜ7+|C».òëã6Ö`ɽ:³aªD£ žÌšš™šk^¢4©É±ú»†Ç;ÔÑáðŠþ d)6ÔAGLPI´RuZX`Md5ffÔc–_hYeQÆG¦à2Ã%Ö{ åúlì\ÞòЉÄG¹€¯O§ó œš·™k›)Ÿã¤m¬±µpÀ{Ì”ÙoçÏõ`Üô f.à:1FPPXÉ^PcÞeOfºdau[ýSÏJ$@"4'Cì \üÙí¿ß?Ò»ÅVºi° ¨‚¡Ùœ<š¥™)›´ž7¤›«¯´N¿;Ë9ØæZôël“-°9E'OW<^ñb¶eZfûd„a\ÑTÍKCAe5s(­a ÍýNïá’ÓíÆl»R±Ò¨¢7ðBAMV ])bRedfle]bY]fVÀMyCß7+~A¼/òéã8Ö^ɽ=³]ªH£ žÎš›™|šn^¢1©Î±ó»Ç5Ô×áÿïŽþ d)6ÎAOL5Uk\Àaeef˜eÆbî]0W¬N”D9p,àµ.£óQåךʽ¾3´/«è£yž›£™Nš Ë¡l¨Ý°ãºQÆêÒnà’îý¦ ùÇ'Ä4´@OKgTÇ[LaØd[fÃe(c}^ôW˜O¨EH:¾-D $¤õ¸æêØ×Ëá¿.µ¬Œ¤ïžI›®™$š¯œ6¡³§î¯Ó¹ÅœÑ ß%í û2 n&„3Ž?TJS#[Ó`–dIfïe}c_­XƒP¶F|;/©!‡ö%èCÚÍÁ/¶Ü¬6¥iŸ›Â™þ™Xœ¬ õ¦ ¯À¸ðÃOЫݴë-ú¼%%?2j>MI¶RtZY`Md4ffÒc™_fYgQÄG¨=IH×QÂYÙ_üc f'f)d`ZIRÊHÖ=›1e$moùÿêúܬÏVÃ>¸˜®™¦k *œò™É™µ›¥Ÿ¥I­±¶˜ÁÀÍìÚßè>÷ØIV"°/<=GöP YR_«cÿe@frd—`ÊZ%SÏIý>â2À%Ûw æúmìYÞøÐ‚ÄM¹{¯R§ô ~œš´™l›,ŸÞ¤r¬¬µtÀyÌ•ÙnçÑõ]Þó g.ß:2F PSXÅ^UcÙeSf·dat[ýSÐJ"@%4'Fë [üÜí»ßCÒ·ÅZºe°¨¡Ýœ8š©™$›¸ž4¤Ÿ««´R¿6Ë=Øæ^ôço-­9E!O”W6^öb±e^fød†a\ÏTÎKDAc5u(«a ÎýOïá”ÓêÆn»S±Ð¨¢SI²RwZW`Ld8f fÙc“_hYhQÂGª=IH×QÂYØ_ÿcf+f%d`ZGRÌHÓ= 1a$prùÿêùܬÏWÃ<¸›®–¦m )œò™Ë™²›¨ŸŽ¥G­¶¶’ÁÄÍìÚÜèC÷ÔJW"¯/<=GõP YR_«cÿe@fsd•`ÍZ!SÓIû>â2Á%Ùy æúkì\ÞôЈÄG¹¯Q§ñ …œ š»™g›-Ÿá¤n¬°µpÀ|Ì“ÙqçÍõaÛö c.ä:,FPLXÌ^NcßeOf¹dat[ûSÔJ@*4'Gë ZüÝí»ßCÒ·ÅYºg° ¨‚¡Ùœ;š§™'›µž8¤˜«²´M¿9Ë>Øæaôåq-®9E$O’W8^ób´e\fùd‡a\ÒTÌKEAd5r(¯^ ÐýLïá’ÓìÆm»Q±Ó¨¢>cšž™êšBž•£Éª´³.¾üÉâÖžäèòvú0Æ+v8 D1NÐV£]b†ebf6eôa»\ŸUÆLbB¢6É)Ñ Fÿ¼ð…âäÔ Èˆ¼A²™©¨¢ ˜š—™´šÒø¢ü©¼²½¿ÈÕ8ãtñˆÌo*D7ìBCMV]-bMeiffecbU]jV½MyCß7+@¼/òèã;ÖZÉ¢½6³eªA£žÉš™}šm]¢4©É±ú»…Ç<ÔÑáð‹þ d)6ÎANL7Uj\ÀaecfœeÃbï]/W­N”D9o,á³3óVåŠ×žÊ»¾4´.«è£zž›¦™JšÆ¡q¨Û°âºSÆæÒrà‘îý¥ úÅ'È4°@QKgTÇ[LaØdYfÈe#c^ðWœO¦EH:¿-B '¢õ·æêØÙËß¿/µ¬Œ¤ñžG›®™%š®œ8¡±§ï¯Ó¹ÅÑ ß#í¡û2 Žp&3’?OJ’S[Õ`–dIfîec_®XƒP·Fz; /¥!”‰ö$èCÚÍÁ-¶ß¬3¥jŸ›¾™šTœ­ ÷¦¯Ä¸îÃOЫݵë,ú¼'%C2g>NI¸RqZ\`Hd;f fÖc—_eYjQÁGª¦)®¶·ÄÂÏNÜEê¹øG»³#ù0@=GHÙQÀYÚ_ûc!f'f(d`ZCRÒHÎ=¡1b$noùÿêûÜ©ÏZÃ:¸œ®–¦l )œó™È™·›£Ÿ¥H­±¶šÁ½ÍðÚÛèB÷ÕJW"°/<æ2º%àt çúnìWÞøÐ†ÄG¹¯L§ø }œš´™l›*Ÿâ¤n¬°µpÀ{Ì•ÙnçÐõ_Üô g.ß:2F PQXÇ^Uc×eWf²dap[ÿSÐJ!@%4'Cî XüÞíºßDÒ¶ÅZºf°¨€¡Üœ9š§™'›¶ž5¤ž«¬´P¿:Ë9ØæZôìk•-²9E(OW<^ñbµe[fûdƒa\ÎTÏKBAg5p(°\ ÓýJï!áÓìÆn»Q±Ó¨¢=cš ™èšCž•£Èª¶³+¾ÿÉßÖ¡äèòq)É+y8D8NÌV¢]”b‚eef5eóa¼\UÊL^B¦6Ä)Î Hÿ»ð„âäÔ$È‚¼G²“©¬¢Ÿ—šš™°šÕ÷¢û©¿²½ÁÈŒÕ9ãsñˆÊs*?7ðBAMV].bLeifhe`bW]jV»M}CÚ7 +yF¸0òêã8Ö\É¡½7³cªD£ žÌš›™}šm^¢2©Ì±ö»ŠÇ8ÔÓáðŠþ c)6ÏAML7Uk\¾aebf›eÆbì]1W¬N“D9n,à·,¥óNå‘יʿ¾0´1«æ£zž ›ž™TšÏ¡j¨à°ßºTÆèÒoà“îý¦ øÉ'Ã4µ@NKgTÈ[KaÚdXfÆe&c^òW™O¨EG:À-B $¨õ¾æåØÙËã¿*µ¬Š¤ïžJ›«™(š¬œ9¡°§ï¯Ó¹ÅœÑ ß&íœû8 ‰t&3’?OJ“S[×`’dMfêe„c_´X~PºFy; /§!’‡ö'è>ÚÍÁ1¶Ú¬9¥dŸ“›½™šXœ© ú¦¯Å¸îÃNЭݳë,ú¾$%A2h>NI·RsZY`Md5ffÕc–_gYhQÂG©ß2Ã%Ùx æúlì[ÞõІÄH¹¯P§õ ~œšµ™k›-ŸÞ¤q¬®µpÀ~Ì‘ÙrçÍõ_Þó g.à:0FPQXÈ^RcÛeRf·dap[TÌJ'@ 4'Dê ]üÚí¾ß@ÒºÅVºi° ¨‚¡Úœ:š§™'›µž8¤™«²´J¿>Ë8ØæZôìj–-±9E%OW8^öb°e`födˆa\ÒTÌKEAd5r(®_ ÐýLïá’ÓêÆq»N±Õ¨¢?bš ™èšCž•£Èªµ³-¾ýÉáÖŸäèòtý.Æ+x8 D1NÒVŸ]”bƒeef4eôa»\ŸUÇLaB£6È)Ñ Fÿ¼ð„âäÔ#Ȇ¼A²˜©©¢ ™š–™³šÔ÷¢ü©½²½ÀÈŒÕ9ãsñˆËp*D7êBFMV ]+bNegfje^bY]hV¼M}CÛ7+{C¼-òìã6Ö^É ½7³cªD£ žËš›™~šl_¢1©Ì±ø»‡Ç:ÔÑáð‹þ c)6ÒAKL8Uj\¿aedfšeÄbð],W±ND9m,â³2žóUåŒ×œÊ¼¾3´/«è£yž›£™Mš Ç¡q¨Ù°æºNÆìÒmà’îý¥ ùÈ'Ä4²@RKeTÈ[MaÖd\fÃe(c~^òWšO¦EI:¾-D $¦õ¼ææØÛËß¿/µ¬¤ížK›¬™(šªœ;¡­§ó¯Ð¹ Å™Ñ ß$íŸû4 Žn&„3?QJS![Ô`–dIfíe€c _¯XƒPµF|; /¦!“‰ö&è?ÚÍÁ2¶Ú¬7¥hŸ›À™ÿ™Xœ« ø¦¯Å¸íÃPЪݶë*úÀ"%?2i>OIµRtZZ`Jd9f fÖc—_dYkQÀG«GõP YQ_­cüeDfmdœ`ÇZ&SÎIÿ>à2Á%Ûv èújì[Þ÷ЄÄK¹|¯Q§ô €œš·™j›,Ÿß¤q¬­µrÀ|Ì‘ÙtçÊõcÚö d.ã:-FPOXÈ^ScÚeRf¸dav[úSÔJ@*4'Ié \üÛí½ß@ÒºÅVºi° ¨€¡Üœ8š¨™(›³ž9¤š«¯´N¿;Ë8Ø æYôên‘-®9E&OW;^ñbµe\fùd†a\ÒTÌKEAc5t(­_ ÐýKï!á‘ÓëÆn»Q±Ó¨¢=dšž™êšAž—£Æª·³,¾þÉàÖ äæòwû/Å+z8D6NËV¦]b‡ebf5eôa¼\UÊL]B§6Ä)Ð Eÿ¾ð‚âæÔ!Ȇ¼B²˜©©¢ ˜š—™´šÒø¢ü©½²½½È‘Õ3ãyñþÿŒÈt*=7òB@MV],bOeffje`bV]jV¼M{CÞ7+{E¸2òèã9Ö\ÉŸ½;³^ªI£žÎš›™|šn^¢2©Ë±ù»†Ç;ÔÑáðŠþ `)6ÒALL6Ul\½aecfšeÆbë]3WªN–D9o,â²2 óQåיʿ¾0´2«å£{ž›¡™Oš É¡n¨Ü°ãºQÆêÒmà”îý¦ ùÇ'Å4²@QKfTÈ[LaØdYfÇe$c^ðW›O§EH:¾-D $¦õ»ææØÜËÜ¿3µÿ«‘¤êžM›«™'š¬œ:¡®§ó¯Ï¹ÅœÑ ß%ížû4 m&†3‹?UJS [Õ`•dJfíec _±XP·F{; /¦!“ˆö$èDÚÍÁ.¶Ý¬5¥jŸŒ›Â™šUœ® õ¦ ¯Ä¸ìÃQЪݶë+ú¾$%A2g>PI¶RsZX`Md7ffÕc–_fYiQÂG©á2Á%Úw çúkì\ÞõÐ…ÄK¹z¯U§ð ƒœš¶™k›+Ÿá¤o¬®µsÀx̘ÙkçÓõ\Þõ c.å:+FPOXÈ^ScÚeRf¸dav[úSÓJ @&4'Fë [üÝí¹ßFÒ´Å\ºe°¨‚¡Øœ<š¥™*›³ž8¤š«¯´O¿:Ë9ØæXôïh–-°9E$O‘W8^õb²e\fûdƒa\ÎTÏKBAg5p(°] ÑýLïá”ÓéÆp»P±Ó¨¢@`š£™åšEž”£Èªµ³.¾üÉâÖžäçòwú0Ä+|8D;NÇV©]b‡ecf4eöa¹\ UÆLbB¢6È)Ï Iÿ¹ð‡ââÔ"Ȉ¼?²›©¦¢£”šœ™®š×ö¢ü©½²½¿ÈÕ5ãwñÿÿŠÌo*B7îBBMV]+bOehfhe`bW]hV¿MxCà7+~A¼/òéã9Ö\É ½:³_ªG£ žÍš›™}šm^¢1©Í±ö»‰Ç:ÔÑáðŠþ b)6ÕAHL:Uj\½ae_fŸeÀbò],W°N’D9p,ß¶/¡óSåŒ×ʼ¾2´1«å£|ž›£™Mš Ê¡m¨Þ°àºSÆéÒnà“îý¦ ùÇ'Æ4±@QKfTÈ[LaØdYfÇe$c^ñW™O¨EG:À-B &£õ¹æèØÙËà¿/µ¬¤îžH›°™#š¯œ8¡°§ð¯Ó¹Å¡Ñß*í›û6 n&…3Ž?RJ‘S[×`“dLfìe€c _¯XƒPµF};/§!”ö"èBÚÍÁ4¶Ø¬8¥hŸŽ›À™šUœ® õ¦ ¯Ä¸íÃRЧݸë)ú¿%%@2j>MI¸RrZY`Ld7ffÔc˜_eYiQÂG©ã2¿%Ýt êúiì\ÞõЄÄK¹|¯R§ó œš´™m›(Ÿã¤l¬±µoÀ}Ì“ÙpçÐõ_Ýô e.à:1F PUXÄ^UcÛeRf¹dau[ûSÑJ @%4'Fí ZüÝí»ßCÒ¶ÅZºc°¨¡Ýœ9š©™'›¶ž7¤™«°´K¿<Ë7Øæ\ôêo“-¯9E$OW7^öb°ecfõd‹a\ÑTÎK>Ah5m(±] ÓýLï"á’ÓìÆm»Q±Ï¨¢IžRhZk`pdff6fðc–_MY?QG‚<@0# Ã-øºé¦ÛWη­Æ¥ßŸö›šš5œD ;¦®‚·‚ÂÖÎ7ÜUêäøŠ÷á#1$=H’Q‚Y³_ûcEfhfrdV`9Z>R™H‹=O1+$Z°ùNëMÝÙÏdøP®A¦ œô™šœ Ø¥f­Ÿ¶RÁ`ÍŽÚ™è/÷þ›Á"0N<=GÀP¦Xä^NcÐeSf¹d a<[}SíIÙ>„2D%c* Ûú¥ìÌÞ|Ñûĉ¹u¯ÿ¦r ñ›£™†™‹›–Ÿq¥­¶ŒÀAÌÙÍæ;õ×P!ù.’;ÀFTP:XN^¨beÎe†dKa\ÂTŠKž@64À&Ž ›ûyíÈßÆÒŠÆ@»±\¨K¡0œH™·˜}š‹ž–¤t¬ºµGÀÎË<ØwåSóÉq@-{:KFdP|XŽ^Œb¯dýd«c©`÷[yUMÏBÀ60)•f @ü“í¿ßþÒTÇ¿¼7³´ªk£–š™Þ—­˜1œQ¢¿ªü´uÀ¢ÌÙ»å~ò‹ÿ ^)œ7EQ­Zoa(eìeSdü`²\ïW×R1MHFW=1´"Þõü”è¯Õ_Ær¼þ¸G¼vÅ÷Ò‹âÌñ­þ˜ '  test2.wav000066400000000000000000002542501225012771600336400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecache/testdataRIFF XWAVEfmt D¬ˆXdata|X¬Áò&Ç3Ž@xLµV·^*dgSgpe”a\U·LC8Û+~7bWòœã‰ÕŒÈè¼Í²]ª¢£ªžx›+š»š[ù¡¥¨9±»bÇbÔ5âˆðÿi më(£5\AéKUo\úaxeÆfïeåbÝ]îVQN:DÓ8],ýù†îó„å×xÊu¾å³îªÃ£ƒž3›æ™—š@ß¡^¨«°¡ºÆ¿Òbà¬îJýâ 3æ'Ç4“@K*Tš[4aßd€föe^c¥^X‹O€E:-( ¾;õëæÙðËÞ¿µÛ«]¤Îž6›¸™AšØœa¡Í§ú¯Ã¹ÿÄsÑæÞíœûE °•&¢3£?JJ~SüZ³`yd?föe–c2_ËXP¹Fo;ñ.…!v ‡ö6è[Ú=ÍÁ<¶Ø¬#¥NŸq›«™ù™^œÁ §!¯×¸ïÃFГݜëú±'%X2€>cI¿RnZK`3d!fþeÐc_zYzQÝG±š¬™-›²ž8¤“«¬´I¿8Ë9Ø æ^ôñp“-«9EOW6^÷b¶eafýdˆa\ÎTÊK=Ad5n(²^ ÖýNï#á’ÓíÆg»S±É¨¢;eš¤™éšHž•£Êª±³-¾÷ÉáÖœäèòw/Ë+v8 D0NÍVž]’b‚eff6eøa½\ UÇL_B 6Æ)Ð Fÿ¿ð…âèÔ"Ȉ¼@²—©¦¢ž—š—™´šÕú¢ý©¿²½¾ÈŒÕ5ãtñÿÿ‹Êu*B7ðBBMV])bNeffgedbU]mV½M|CÝ7+|?½+òìã9Ö]É£½9³`ªG£žÎš˜™}šm^¢4©Ì±ù»ˆÇ:ÔÐáðˆþ ` )6ÕAKL:Ui\Àaeef—eÆbî]/W¯N“D9m,ä°2žóRå×™ÊÀ¾1´2«ç£zž›¢™Lš Å¡r¨Ù°çºNÆïÒhàšîý¨ ÷Ç'Å4´@MKkTÅ[PaÕd[fÄe&c~^òWšO¨EG:Á-@ *¡õ¹æçØÚËß¿.µ¬Œ¤ðžH›¯™#š¯œ6¡²§î¯Ó¹ÅœÑ ß$í û3 n&…3?SJS![Ö`•dJfîe~c_«X†P´F|; /¤!–Šö&è>Ú ÍÁ0¶Þ¬3¥kŸŽ›¿™šQœ² ð¦¯À¸ïÃPЩݸë*ú¾&%C2g>NI·RsZX`Od3ffÓc—_fYhQÂGªà2Ã%Øx åúnìYÞøÐƒÄK¹|¯R§ò ‚œš·™k›)Ÿä¤k¬³µoÀ{Ì•ÙnçÐõ^Ýõ e.â:-FPNXÉ^ScØeVf³dao[TÍJ$@$4'Eì YüÞí¹ßFÒ´Å[ºg° ¨…¡×œ;š¨™&›¶ž7¤š«°´M¿<Ë8ØæYôìk”-®9E#O“W6^öb±e^fød‡a\ÒTÌKDAd5t(¬a ÏýLïá”ÓèÆr»N±Õ¨¢?bš ™èšCž•£Èªµ³.¾üÉâÖžäèòuý-Æ+z8D7NÌV¢]•beff4eóa½\žUÇLbB 6Ë)Ñ Gÿºð†âãÔ"ȇ¼A²™©§¢¢•š›™°šÕ÷¢û©¾²½ÁÈŒÕ8ãtñ†Îo*B7îBBMV ]*bPeffje_bW]jV¼MzCà7+@»/òëã5Öaɽ9³bªD£ žÍ𙙀šj`¢1©Ë±ù»†Ç;ÔÒáð‹þ b)6ÒAKL8Uk\½ae`feÄbî]/W®N’D9o,ß¶/¢óQåŽ×›Ê½¾3´/«æ£{ž›¡™Pš Ê¡m¨Þ°áºRÆêÒlà•îý¦ ûÃ'É4¯@RKhTÄ[PaÕd[fÅe'c~^óW˜OªED:Ã-? (£õºæçØÚËß¿0µ¬Ž¤ìžL›¬™&š­œ8¡²§î¯Ô¹ÅžÑ ß#í¢û1 o&‚3?SJS$[Ñ`—dJfíe€c _°X‚P·Fz; /¤!—Šö%è@ÚÍÁ2¶Ù¬9¥gŸŽ›Á™šUœ° ñ¦ ¯Â¸íÃRЧݹë)ú¿#%?2k>KIºRpZ[`Ld4ffÑcš_cYkQÁG©GõP YS_«cþeAfqd˜`ÊZ$SÐIý>á2Â%Øy æúlìZÞ÷ЃÄL¹|¯Q§õ }œš³™m›+ŸÞ¤s¬«µtÀzÌ“ÙqçÎõ_Ýô e.ã:,FPLXÌ^OcÝeQf¸dat[ýSÐJ!@'4'Gé \üÜí»ßDÒµÅ[ºe°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë=Øæ_ôèm“-¯9E$O‘W9^ób³e]fúd„a\ËTÔK=Ak5n(¯_ ÐýKï"áÓñÆi»U±Ï¨¢MI¸RrZZ`Ld5ffÔc—_gYgQÃG©¸–®¦f /œî™Ë™´›§ŸŽ¥G­´¶•ÁÂÍíÚÛèC÷ÕIY"¬/<á2Â%Ùx åúmìZÞöІÄH¹~¯R§ñ ƒœš¶™l›)Ÿä¤l¬±µpÀ{Ì•ÙnçÐõ_Üõ e.á:0FPQXÈ^RcÚeTfµdar[üSÓJ@&4'Bð WüÝí»ßCÒ¸ÅXºg°¨€¡Ýœ6šª™&›µž8¤š«¯´N¿:Ë;Øæ\ôén’-¯9E#O’W7^õb³e\fúd„a\ÎTÏKAAh5p(°] ÐýNïá—ÓçÆq»Q±Ï¨¢6lš—™ïš>ž˜£Æª¶³.¾úÉæÖšäêòuû0Å+y8D4NÎV£]’b„edf4eõa»\UËL]B¥6Ç)Ò Dÿ¾ð„ââÔ%ȃ¼D²˜©§¢¢•š›™°šÕ÷¢û©¾²½¾ÈÕ5ãwñþÿÆv*>7ïBCMV ]*bOehfgebbU]jV½MzCÞ7+|Dº/òêã7Ö_Éž½9³bªD£ žÍš™™šl]¢4©Ê±ù»†Ç;ÔÐáðˆþ ^#)þ5ØAGL:Uk\¼ae_fžeÃbî]0W­N’D9l,ã²3žóUåŠ×žÊ¼¾2´1«ä£}ž›¢™Nš È¡q¨Ù°æºNÆíÒjà–îý§ øÇ'Å4³@PKfTÈ[LaØdYfÆe&c^òWšO¦EJ:»-G "§õ»æåØÜËÞ¿0µ¬Œ¤ïžH›¯™%š­œ9¡¯§ñ¯Ò¹ÅœÑ ß$í û2 n&ƒ3‘?OJ“S[×`”dJfïe}c_®XƒP¶F|;/ª!ˆö$èCÚÍÁ0¶Ú¬8¥hŸŽ›Á™šTœ° ô¦ ¯Ä¸ìÃRЩݵë-ú») %D2f>PI¶RsZY`Ld7ffÔc˜_dYlQ¾G¬ä2¾%Üw æúlìZÞ÷ЄÄK¹{¯T§ñ œš¸™i›-ŸÞ¤p¬°µpÀ}ÌÙtçËõbÛõ e.â:/FPQXÆ^ScÜeQf¹dau[ýSÏJ$@#4'Dî Wüàí¸ßEÒ·ÅXºh° ¨‚¡Úœ;š¥™)›³ž9¤š«®´P¿8Ë=Øæ[ôëk•-¯9E"O“W7^õb²e^f÷d‡a\ÐTÎKCAd5t(­_ ÑýJï!á‘ÓëÆp»O±Ô¨¢=ešž™êšAž–£Çª·³+¾ÿÉàÖŸäéòr+È+x8D5NÍV¤]b‡e`f9eïaÀ\›UÊL`B¡6Ê)Ò Eÿ½ð„âãÔ$È„¼C²™©¦¢¤“šœ™°šÕö¢þ©º²½½ÈÕ5ãwñþÿÇt*?7ïBCMV ]+bOehfheabU]kV»M}CÜ7+|C».òëã7Ö^É ½6³dªC£ žÌšš™~šl_¢2©Ì±ö»‰Ç9ÔÓáð‰þ a)6ÒALL7Ul\¾aedf™eÆbí]0W­N“D9l,ã²3žóUå‹×ʼ¾2´1«å£|ž›¢™Nš É¡o¨Û°äºOÆíÒjà–îý¦ úÅ'Æ4³@OKhTÅ[OaÖd[fÄe'c^òWšO¦EJ:¼-F "¨õ½æäØÝËÝ¿0µ¬¤ížK›¬™&š®œ7¡²§ï¯Ò¹ÅÑ ß%íŸû3 m&†3Œ?TJS [Ö`”dJfîe~c_®X‚P¹Fw; /¥!“‡ö'è?ÚÍÁ0¶Þ¬2¥mŸŒ›¿™šQœ² ñ¦ ¯Á¸ðÃNЫݴë.ú¼%%?2k>LI¹RpZ\`Jd8f fÖc–_fYjQ¿G¬â2Â%×{ ãúnìZÞöÐ…ÄJ¹|¯S§ñ ‚œš¸™i›-ŸÞ¤q¬®µqÀ|Ì“ÙoçÑõ\ßó f.á:0FPQXÇ^ScÚeTfµdar[ÿSÏJ"@%4'Fê \üÚí½ßCÒ¶Å[ºe° ¨‚¡Ûœ8šª™%›µž9¤˜«±´N¿9Ë;Øæ\ôén‘-°9E(OŽW:^ôb²e^fød‡a\ÐTÐK@Ah5p(¯_ ÏýNïá•ÓéÆo»R±Ð¨¢:hšš™íš>žš£Äª¹³)¾ÊßÖ¡äåòxù2Ã+z8D5NÏV¡]“bƒedf6eòa½\UÈL`B¤6Ç)Ð Eÿ¾ð„ââÔ&ȼF²–©©¢¡–šš™°šÖõ¢ý©¾²½ÁÈŒÕ9ãtñ‡Ío*C7íBCMV].bLeifie^bY]hV¼M}CÛ7+|B½,òìã6Ö`Éœ½<³^ªH£ žÎš™™šl^¢4©Ç±ý»ƒÇ>ÔÏáð‰þ c)6ÎAOL4Un\»ae_feÃbï]/W­N”D9p,Þ¶0¡óRåכʾ¾1´1«æ£zž›¢™Oš Ê¡l¨Þ°âºSÆçÒoà’îý¥ ùÆ'Ç4°@TKbTË[KaØdYfÈe"c„^îWœO¥EJ:½-E #§õ½æåØÛËß¿0µ¬¤îžH›±™"š°œ6¡±§ñ¯Ð¹ Å™Ñ ß#í û3 Žo&ƒ3?PJ’S[Ù`’dKfîe}c_«X…P¶Fz; /£!–‰ö%è@ÚÍÁ0¶Û¬7¥gŸ‘›½™šUœ¬ ÷¦¯Æ¸ëÃRШݷë,ú¼&%@2i>OIµRuZW`Nd4ffÒcš_cYkQÀGªã2À%Úx æúkì]ÞóЈÄG¹~¯R§ò ‚œš¶™l›)Ÿä¤k¬²µoÀ|Ì”ÙoçÐõ]ßò h.ß:1F PSXÅ^TcÛePf»d aw[üSÎJ&@!4'Cë ]üÚí½ßAÒ¹ÅXºh° ¨¡Üœ9š§™(›³ž:¤˜«±´M¿;Ë:Øæ\ôén“-°9E'OW9^ôb²e_födˆa\ÐTÏKAAg5q(¯^ ÑýKï á‘ÓìÆm»S±Ð¨¢;dš ™çšEž“£Éªµ³.¾üÉáÖ äæòwû.Æ+z8D8NÊV¥]‘b„eef4eôa¼\UÉL_B¤6Ç)Ò BÿÁð€âçÔ!È…¼D²—©©¢¡”š™®š×ö¢û©¾²½¿ÈŽÕ6ãwñÿÿ‹Ér*B7ëBFMV ]*bOegfie`bV]jV¼M|CÜ7+zEº/òêã7Ö_Éž½9³aªF£ žÎš™™~šn[¢6©È±ú»†Ç<ÔÏáðˆþ a)6ÒALL7Ul\½aecf›eÅbì]2WªN—D9r,ß´1 óSåלʻ¾4´/«ç£zž›¢™Nš Æ¡r¨Ù°æºNÆìÒkà•îý¦ øÈ'Å4²@QKeTÉ[KaÚdWfÉe!c„^îWO¥EH:À-A (¢õ»æåØÜËÞ¿/µ¬Š¤ðžH›®™%š¯œ6¡²§ï¯Ò¹Å›Ñ ß"í£û/ ‘m&„3?RJS![Õ`”dKfìec _®XƒP·Fz; /¥!“…ö(è?ÚÍÁ0¶Ú¬8¥hŸ›¿™šUœ¯ ô¦ ¯Ã¸îÃPЫݴë,ú½%%>2k>KIºRrZX`Md6ff×c“_jYeQÅG§¦'®¹·ÁÂÏKÜGê·øIº³#ú0?=FHÛQ¿YÚ_ýcf,f#d`ZHRÍHÓ=1c$oqùÿêøÜ®ÏTÃA¸”®¦g -œð™Ë™´›¥Ÿ¥H­³¶—ÁÀÍìÚàè=÷ÙHW"°/<=GöP YP_®cûeEfnd™`ÊZ#SÑIü>ã2¿%Üu èúkì\ÞôІÄJ¹|¯S§ò €œš¶™k›,ŸÞ¤r¬¬µtÀyÌ”ÙpçÏõ_Üõ d.ã:.FPOXÉ^QcÜeQf¹dat[ýSÐJ"@&4'Iè ]üÛí¼ßAÒºÅWºg°¨¡Üœ9š§™(›´ž8¤™«±´M¿;Ë8Ø æWôðg—-°9E$O‘W8^ôb²e`fõd‰a\ÒTÌKDAe5q(±[ ÓýJïá“ÓêÆp»P±Ñ¨¢:fšž™éšCž”£Éª´³/¾úÉåÖ›äëòsü0Ä+z8D6NÌV¥]b‡eaf7eóa¼\UÉL_B¥6Æ)Î Iÿ¹ðˆâàÔ&È‚¼F²”©¬¢Ÿ–šœ™®š×ö¢û©¿²½ÃÈŠÕ;ãrñˆÌp*C7ëBFMV ]'bReffhecbR]nV¹M}CÝ7+~B¼-òìã6Ö^É ½8³aªH£žÒ𖙀šl^¢3©É±û»ƒÇ?ÔÎáðŠþ ` )6ÒAML5Un\»ae`fœeÅbì]2W¬N‘D9g,é®3 óRåŽ×›Ê¾¾0´2«å£{ž›¡™Pš Ë¡k¨à°ßºTÆéÒmà”îý¥ ûÅ'Ç4±@QKfTÈ[KaÚdXfÆe'c|^õW˜O§EI:¾-C %¥õºæçØÚËß¿0µ¬‹¤ñžF›°™$š®œ9¡®§ô¯Ì¹#Å™Ñ ß&íû4 m&…3?TJŽS![Ö`’dMfìec_­X„PµF};/©!‘†ö)è<Ú"ÍÁ2¶Û¬6¥iŸŽ›À™šWœ« ø¦¯Å¸íÃPЫݴë-ú½$%=2k>NI¶RsZZ`Id:f fÖc–_fYhQÃG©GôPYP_¬cþeBfpd˜`ÊZ#SÓIù>æ2¼%Ýw åúnìXÞùЂÄL¹{¯S§ó œšµ™k›,Ÿà¤o¬¯µpÀ}Ì“ÙoçÐõ]àñ g.á:/FPOXÈ^ScÚeSf·daw[ùSÓJ!@$4'Cì [üÜí»ßCÒ·ÅYºg° ¨¡Ûœ9š©™%›·ž4¤ž«­´P¿9Ë:Øæ[ôëk•-²9E&OW7^öb±e`föd†a\ÐTÍKEAb5u(­^ ÒýJï!áÓìÆo»Q±Ñ¨¢8jšš™ëšBž•£Èª¶³,¾ýÉâÖäëòrþ-Æ+z8D6NÍV¢]•b€egf2eõa½\œUÉL`B¢6Ë)Ô Dÿ½ð†âàÔ'ȼF²–©©¢¢”šœ™®šØô¢þ©»²½½È‘Õ3ãyñþÿ‹Êq*B7íBDMV ])bPegfie_bX]hV½M}CÚ7+zEº/òéã9Ö]ÉŸ½:³_ªH£ žÍš›™}šn]¢2©Ì±÷»‰Ç8ÔÓáð‰þ _)6ÑAML7Uj\¿aebfœeÃbï]/W­N”D9o,ß·-¤óPåכʼ¾3´0«ç£yž › ™Oš È¡o¨Ý°áºRÆêÒmà”îý£ üÅ'Æ4³@NKiTÆ[Ma×dZfÆe&c^ñW›O¦EI:¿-A '¤õ»ææØÙËâ¿-µ¬Œ¤ïžH›¯™%š¬œ;¡­§ó¯Ð¹Å›Ñ ß&ížû4 m&„3?RJS [Õ`”dKfíec_¯X‚P·Fz; /¨!‘‡ö&èAÚÍÁ/¶Ü¬7¥gŸ›À™šVœ® ô¦ ¯Â¸ïÃOЫݵë+ú¿#%@2g>QI´RuZW`Nd4ffÑc™_eYhQÃG©¦)®¶·ÅÂÏMÜHêµøK¸´#ü0<=IH×QÃYØ_ýcf'f)d`ZJRÈHØ=›1d$oqùÿêúÜ«ÏWÃ>¸—®›¦h +œô™Æ™¸›£Ÿ¥H­²¶˜Á¿ÍïÚÛèA÷ØGY"®/<=GöP YS_«cýeCfodš`ÈZ%SÐIü>ã2¿%Ûx äúoìXÞøÐ„ÄJ¹|¯S§ò œš´™m›)Ÿâ¤o¬®µrÀzÌ•ÙoçÏõ^Þô e.â:-FPMXÌ^NcÞePf¹dau[üSÑJ!@&4'Fë ZüÝí¼ßAÒºÅUºj° ¨¡Ûœ:š¦™(›´ž8¤š«±´K¿=Ë8Øæ\ôèo-­9E"O“W6^öb²e]fùd…a\ÐTÍKDAd5s(®^ ÑýLïá“ÓêÆo»Q±Ó¨¢;hš™™îš@ž•£Êª²³0¾úÉåÖ›äëòrþ.Å+z8D5NÍV£]’b…ebf6eòa¾\œUÊL^B¤6Ç)Ð Fÿ¼ðƒâæÔ!ȇ¼A²˜©¨¢¢–š™™²šÓù¢ú©¾²½¿ÈŽÕ7ãtñ‰Ês*>7ðBBMV ]&bUeafme_bV]jV»M~CÚ7 +xE».òëã6Ö_Éž½:³aªD£žÉšž™|šm_¢1©Ë±ú»…Ç=ÔÏáðŠþ `)6ÐAOL3Uo\¼aedf˜eÈbë]2W¬N’D9k,ä³/£óOå’×—ÊÁ¾/´0«è£yž ›¢™Nš Ì¡k¨ß°áºRÆêÒlà•îý§ øÇ'Å4³@PKfTÈ[KaÚdXfÇe%c~^ôW™O§EI:»-H ªõ¾æåØÛËÞ¿1µ¬¤ížI›¯™#š°œ6¡²§ï¯Ó¹ÅžÑß'ížû3 m&…3?QJS![Ô`•dKfìec _®X„PµF|; /¨!’Šö#èCÚÍÁ0¶Ü¬5¥jŸ›Á™šUœ­ ö¦¯Æ¸ìÃQЩݶë+ú¾%%A2h>OI¶RsZY`Ld7f fØc’_jYeQÅG§=IHØQÂY×_ÿcf+f'd`ZFRÌHÖ=™1i$i mùëøÜ­ÏUÃ@¸–®›¦h -œï™Í™°›ªŸŒ¥I­´¶“ÁÄÍëÚÞè@÷×IW"¯/<>GöP YS_©cf@frd˜`ÉZ%SÏIý>â2Á%Ùz ãúnìZÞõЇÄI¹|¯S§ð „œš·™k›*Ÿâ¤n¬¯µqÀ}ÌÙtçËõaÝó f.â:-FPOXÈ^RcÚeSf·dar[þSÎJ$@$4'Dì ZüÞí¹ßEÒµÅ[ºe°¨~¡Þœ6šª™%›·ž5¤«­´O¿;Ë7Ø æYôìl“-¯9E!O•W5^õb³e\fúd…a\ÑTÍKBAh5n(³Z ÔýHï"á‘ÓêÆq»N±Õ¨¢?bš¡™çšCž–£Æª·³,¾þÉàÖ äæòvý-Æ+y8D6NÌV£]’b„eef3eõa»\UÊL_B£6È)Ò Eÿ½ðƒâäÔ$È„¼D²–©©¢¡–𛙝šÖö¢ü©½²½¾ÈÕ6ãvñÿÿŒÈs*A7ìBEMV ]+bOeffje`bV]jV¼M{CÞ7+~A¼.òëã6Ö`Éœ½<³^ªI£žÐš™™~šm]¢3©Ë±ù»…Ç=ÔÏáð‰þ c)6ÐAML6Ul\½aeafœeÃbï]/W®N’D9n,à¶.£óQå×ʼ¾2´1«å£|ž›£™Nš É¡n¨Ü°ãºPÆëÒmà”îý¥ úÅ'È4°@RKeTÈ[LaÙdXfÈe"cƒ^ïWœO¦EH:¾-D $¦õ»ææØÜËÜ¿2µ¬¤ìžK›«™)š©œ<¡®§ñ¯Ò¹ÅœÑ ß#í¢û0 ‘m&ƒ3‘?OJ’S[Ö`”dKfíec_­X…PµF|; /¦!“†ö)è<Ú!ÍÁ0¶Ý¬4¥kŸŒ›Â™ÿ™Vœ® ô¦ ¯Ã¸ìÃRЩݶë,ú¼&%A2i>MI¸RqZ[`Kd7ffÖc”_iYeQÆG§¸˜®š¦h -œï™Ì™³›§Ÿ¥J­°¶šÁ½ÍñÚÙèD÷ÔJW"¯/<=GõP YQ_­cýeBfqd–`ÌZ#SÑIü>â2À%Ûw æúmìYÞøÐ‚ÄM¹z¯T§ñ ‚œš·™j›,Ÿà¤o¬°µoÀ~Ì‘ÙqçÏõ^Þó f.á:/FPOXÉ^QcÜeRf·dau[ûSÒJ!@$4'Cí ZüÛí¾ß@ÒºÅWºg°¨¡Ýœ8š§™*›°ž=¤–«²´M¿9Ë<Øæ]ôél”-¯9E#O’W7^õb²e^fød†a\ÑTÌKEAc5t(­_ ÐýKï!áÓíÆl»S±Ò¨¢>bš ™èšCž–£Æª·³,¾ýÉâÖžäèòuý,É+v8 D3NÎV£]“b‚eff2e÷a¹\ UÆLbB¢6È)Ð Fÿ½ðƒâåÔ"È…¼C²—©ª¢ –šš™°šÖ÷¢ú©¿²½ÂÈ‹Õ9ãtñŒÇt*@7íBDMV ](bQeefjeabU]jV¼M{CÞ7+|Cº1òèã9Ö\É ½9³bªC£ žËšœ™}šn[¢5©Ê±ø»ˆÇ9ÔÒáðŠþ a )6×AFLKI¼RmZ_`Gd:f fÙc“_iYeQÆG¥¦(®¹·¿Â ÏEÜNê±øN¶µ#ú0==JH×QÂYØ_þcf,f%d`ZFRÌHÕ=›1g$koùëúܬÏUÃ?¸—®š¦k )œó™É™³›©Ÿ‹¥K­±¶—ÁÀÍïÚÚèC÷ÔLT"±/<ä2¾%Üw æúlì[ÞôЈÄG¹¯P§ó œš·™i›-Ÿß¤p¬®µrÀzÌ•ÙnçÐõ_Üõ d.ã:.FPOXÉ^RcÚeSf·dau[ûSÑJ"@%4'Eê ]üÚí¾ß@Ò¹ÅXºg°¨~¡Ýœ8š©™&›µž7¤›«¯´N¿;Ë8Ø æXôíj•-°9E$O’W5^øb¯e`f÷d…a\ÍTÑK?Ai5o(±\ ÒýKïá“ÓêÆo»Q±Ò¨¢=cš ™çšEž’£Êª¶³*¾ÊßÖ äçòvû/Æ+x8D5NÎV¢]”beff4eõa»\UÉL`B£6È)Ñ Fÿ¼ð„âäÔ#È…¼C²—©©¢ ˜š˜™²šÔ÷¢ü©½²½¿ÈŽÕ7ãuñ‰Ëq*A7ïBAMV]+bQedfle^bV]kV»M|CÝ7+}B¼-òìã7Ö]ÉŸ½;³^ªI£žÐš˜™šl_¢1©Í±ö»ˆÇ;ÔÐáð‰þ b)6ÒAKL8Uk\½aebf™eÈbê]2W­N‘D9l,â³2žóVåŠ×žÊ»¾4´.«è£yž ›Ÿ™RšÉ¡p¨Ú°åºPÆéÒoà’îý¤ úÇ'Ä4µ@MKiTÅ[OaÖd[fÅe$c‚^ïWœO¦EI:¼-G ¬õÁæáØÞËÜ¿2µ¬Œ¤ïžH›¯™&š«œ;¡­§ó¯Ð¹ÅœÑ ß$íŸû3 n&„3?PJ“S[Ö`•dHfñe|c_­XƒP¸Fx; /£!—Œö#èBÚÍÁ1¶Û¬6¥jŸŒ›Ã™ý™Yœª ù¦¯Ç¸êÃSШݷë+ú½%%@2j>KIºRpZ\`Jd7ffÔc—_fYhQÃG©=HHÙQÁY×_df.f#d`ZHRÌHÓ=ž1c$opùÿêûܪÏWÃ>¸—®œ¦g ,œò™È™¶›¥ŸŽ¥J­±¶—ÁÁÍíÚÝèA÷ÔMT"±/<à2Â%Øy æúlìZÞöÐ…ÄK¹{¯S§ñ ‚œš¶™l›)Ÿâ¤n¬°µpÀ}Ì‘ÙsçËõcÙø a.å:.FPQXÆ^TcÚeSf¶dau[úSÔJ@)4'Eí Xüßí¹ßDÒ·ÅYºf°¨¡Üœ9š§™)›²ž:¤—«³´L¿;Ë9Øæ\ôén-®9E&OW:^ôb±e_f÷dˆa\ÒTËKFAc5t(¬` ÐýKï!áÓìÆn»R±Ñ¨¢;ešž™êšAž–£Èª´³/¾ûÉãÖžäçòvû0Å+y8D6NÍV£]’b„edf5eóa¼\ŸUÆLcBŸ6Ì)Ó Eÿ¼ð…âãÔ"ȇ¼B²—©ª¢Ÿ˜š™™±šÔù¢ø©Á²½ÀÈŽÕ6ãvñŠÈt*?7ðBAMV ]+bOegfie`bV]kV»M|CÝ7+@¾,òìã6Ö^É ½9³`ªF£ žÌš™zšp[¢5©É±ù»ˆÇ8ÔÔáðŠþ b)6ÎANL7Uj\¿aecfšeÅbí]1W¬N”D9n,â´/£óOåךʽ¾3´.«é£xž › ™Pš É¡o¨Ü°âºRÆéÒnà”îý¥ úÆ'Æ4³@NKiTÅ[OaÖdZfÆe$cƒ^îWžO¢EM:º-H !§õ¼ææØÛËÞ¿0µ¬Ž¤ížJ›­™%š®œ9¡®§ó¯Î¹"Å—Ñß"í û3 Žo&ƒ3?PJ’S[Ö`“dLfíe~c_©X‰P±F;/ª!†ö'è@ÚÍÁ.¶Þ¬4¥jŸ›Á™šVœ­ ö¦¯È¸éÃTШݵë.úº)%B2h>OI¶RsZY`Kd:f fÙc’_jYfQÅG¦¸–®œ¦h ,œñ™É™µ›¦ŸŽ¥I­±¶˜ÁÀÍíÚÞè>÷ÚFY"®/<;GøP YT_ªcf?frd˜`ÈZ(SËI?Ý2Ä%Øx çúkì[ÞöÐ…ÄI¹¯O§õ œš´™m›*Ÿà¤q¬¬µtÀzÌ“ÙpçÏõ_Ýô e.á:1F PQXÉ^PcÝeQf·das[þSÐJ!@&4'Gë [üÜíºßEÒµÅ[ºf° ¨‚¡Úœ:š§™(›³ž:¤—«³´L¿:Ë<Øæ_ôèn’-¯9E$O’W7^õb²e]fúd„a\ÏTÎKCAe5s(­_ ÑýJï á’ÓëÆo»Q±Ñ¨¢;fš™êšCž“£Êª³³/¾ýÉàÖ äæòwû/Å+z8D5NÎV¢]“bƒedf5eôa¼\UÈLaB¡6Ë)Ñ Gÿ»ð…âäÔ"È…¼C²™©¦¢¥‘šž™®š×õ¢þ©º²½»È’Õ3ãyñþÿ‹Ér*B7íBCMV ]-bMehfheabV]iV¾MxCâ7+€A¼.òëã6Ö_ÉŸ½8³cªC£ žËšœ™}šm]¢4©É±ú»†Ç;ÔÑáð‹þ c)6ÑAKL:Uh\ÀaeafeÃbî]0W­N“D9n,â³1 óTå‹×žÊº¾5´/«å£}ž›¤™Nš Ê¡m¨Ý°âºSÆèÒoà’îý¥ úÇ'Ä4´@OKgTÈ[JaÛdVfÊe"c‚^ïWO¤EK:¼-E $¦õ½æäØÝËÝ¿0µ¬Œ¤ðžF›±™#š¯œ7¡±§ï¯Ô¹ÅžÑ ß%í¡û0 ’j&‡3?SJS![Ô`•dJfíe€c_­X„PµF{; /£!–Šö$èBÚÍÁ1¶Ú¬7¥iŸ›Á™šVœ® ô¦ ¯Â¸ïÃOЬݳë-ú½$%=2l>KIºRpZ[`Kd7ffÔc˜_cYmQ½G®¦(®¸·ÂÂÏNÜEê¸øI¸¶#ø0@=GHØQÃYÖ_df-f#d`ZKRÈH×=›1e$noùëùÜ«ÏXÃ<¸™®™¦k (œö™Å™·›¦Ÿ¥I­³¶–ÁÀÍðÚØèG÷ÐNT"±/<=GõP YP_­cüeDfnd›`ÆZ'SÎIþ>â2¿%Üv çúlìZÞöІÄH¹¯P§ô €œš¸™j›,Ÿà¤o¬®µsÀyÌ–ÙnçÏõ`Ûö d.ã:-FPOXÈ^ScÚeSf¶dar[þSÑJ@)4'Hê [üÝíºßEÒ´Å\ºd°¨€¡Ûœ9š§™(›´ž9¤™«°´N¿:Ë:Øæ\ôèp-¯9E&OW9^óbµe\fùd…a\ÐTÎKCAd5t(­_ ÏýMïá‘ÓîÆj»U±Ï¨¢9hš›™ëšCž’£Ìª±³1¾úÉãÖžäèòuû0Å+y8D4NÏV¡]”b‚eff2e÷a¹\ UÇL_B¦6Ä)Í Gÿ½ðƒâäÔ$ȃ¼D²—©©¢¡–š™™±šÖö¢û©¿²½ÁÈŒÕ8ãvñÿÿŠÊs*?7ðB@MV ])bQeefjeabT]mV¸MCÜ7+€>¿,òëã8Ö]É ½8³aªF£ žÏš˜™€šk^¢3©Ë±ø»ˆÇ8ÔÔáðŒþ d)6ÓAJL9Ui\Àaeef™eÅbî]/W®N’D9k,å°4óWå‰×ŸÊº¾3´1«æ£zž › ™Pš Ë¡m¨Ü°äºOÆìÒmà‘îý¡ ýÄ'Æ4´@NKhTÇ[KaÚdXfÇe%c^òWšO§EH:¾-D $¦õ»ææØÚËà¿/µ¬¤ìžL›¬™%š¯œ7¡±§ð¯Ð¹ÅœÑ ß#í¡û1 ‘l&„3‘?NJ”S[Õ`–dHfïec_®X‚P¸Fy; /¤!•‰ö%è@ÚÍÁ2¶Ù¬8¥hŸŽ›Á™šVœ­ ô¦ ¯Á¸ðÃNЬݳë.ú»&%=2m>II»RpZZ`Md4ffÓc—_fYiQÁG«=IH×QÁYÚ_üc f'f(d`ZGRÌHÓ=ž1d$nqùüêþܨÏZÃ;¸™®™¦j ,œð™Ë™³›§ŸŽ¥H­³¶–ÁÂÍëÚÞèA÷ÕLT"°/<â2Á%Ùy åúlì\ÞóЉÄF¹¯R§ð …œš¹™i›-ŸÞ¤s¬«µtÀyÌ•ÙoçÏõ`Û÷ b.ä:-FPOXÈ^RcÛeRf¸dat[þSÏJ#@$4'Eì [üÛí½ß@ÒºÅWºh°¨¡Ýœ8š¨™'›´ž9¤™«±´L¿<Ë8ØæZôël“-°9E&OW8^öb°e_fød†a\ÑTÍKCAf5q(°\ ÓýIï"áÓìÆm»S±Ñ¨¢=dš™íš=žš£Åª¶³.¾ûÉäÖ›äìòqÿ,Ç+y8D6NÌV¤]‘b„eef3e÷a¸\ UÇLaB¢6Ê)Õ Bÿ¿ðƒâãÔ&ȼG²”©ª¢¢”šœ™¯šÖö¢ü©½²½ÀÈÕ7ãvñÿÿŒÇv*=7ðBAMV ],bMehfhebbT]lVºM}CÜ7+}Cº/òëã5ÖbÉš½=³_ªF£ žÍ𙙀šk^¢3©Ê±ù»‡Ç:ÔÒáðþ e)6ÏAOL3Up\¹ae^fžeÃbï].W¯N‘D9m,â³0£óOå’זʾ-´5«ã£}ž›£™Mš È¡p¨Ú°åºNÆíÒkà•îý¤ ûÅ'Ç4±@QKfTÇ[MaØdXfÉe!c…^ìWŸO£EK:½-D %¤õ¹æéØØËá¿-µ¬Œ¤îžI›®™%š®œ8¡¯§ñ¯Ó¹ÅŸÑß'íŸû2 ‘k&‡3Œ?SJS [Õ`•dJfíec_­X„P¶Fz; /¤!•Šö#èCÚÍÁ1¶Ù¬9¥fŸ‘›¾™šTœ® õ¦ ¯Á¸ðÃNЫݷë'úà %>2j>OI´RvZU`Qd2ffÓc—_fYiQÁG¬¸˜®š¦h .œî™Î™°›©ŸŒ¥J­²¶—ÁÀÍîÚÛèB÷ÖJV"°/â2Â%Øz äúmìZÞ÷ЃÄL¹{¯S§ñ ƒœš¸™i›-Ÿß¤p¬¯µoÀÌÙtçÌõ`Üõ e.â:/FPRXÅ^Vc×eVf´dar[þSÐJ#@#4'Bî ZüÛí¾ßAÒ·ÅZºe°¨€¡Úœ;š¥™)›µž6¤œ«¯´L¿>Ë6Ø æYôìl’-¬9 E"O“W6^öb²e\fûdƒa\ÎTÐK?Ak5l(³\ ÑýLïá‘ÓîÆj»V±Í¨¢8hš›™ìš@ž—£Çª¶³,¾ýÉâÖžäèòuû1Â+|8D8NËV¥]b‡ebf6eôa¹\¢UÃLfB6Í)Ô Dÿ½ð„âäÔ"ȇ¼@²›©¥¢¤”š›™°šÕø¢ú©¾²½¿ÈÕ5ãwñÿÿŒÇu*=7òB?MV]+bPeffie`bW]hV¾M{CÜ7+zEº/òêã7Ö_ɽ<³^ªH£ žÍšœ™{šp[¢5©É±ù»‡Ç:ÔÒáð‹þ d)6ÑALL8Uk\¼ae`feÄbì]2W«N•D9n,á´0£óOåיʿ¾2´.«ê£už›š™UšÌ¡l¨Þ°áºRÆêÒlà–îý¥ ûÄ'É4°@RKdTÊ[JaÛdVfÉe#c^ðWœO¥EJ:¼-E $§õ½æäØÝËÝ¿1µ¬¤îžJ›¬™'š¬œ9¡±§î¯Õ¹Å¡Ñß(ížû3 m&…3Ž?SJŽS"[Ô`•dKfìe€c_­X…PµF|;/¨!’†ö(è=Ú"ÍÁ2¶Û¬6¥iŸŽ›À™šUœ® ô¦ ¯Ã¸îÃOЫݵë+ú¿#%>2j>MI¸RrZY`Md4ffÒc—_gYgQÃG«¦(®¸·ÁÂÏKÜIê´øM´¹#ö0B=EHÚQÀYÙ_þcf*f&d`ZGRÎHÑ=¡1_$srùÿêùܬÏWÃ=¸˜®š¦j *œó™È™¶›¥ŸŽ¥I­²¶—ÁÀÍîÚÜèB÷ÔKV"°/<á2Ã%Ö{ äúmì[ÞôЇÄH¹¯O§õ ~œš³™n›'Ÿä¤m¬±µpÀ{Ì”ÙoçÏõ`Ûö d.â:/FPPXÈ^RcÜePfºdaw[úSÓJ @&4'Fë [üÜí»ßCÒ·ÅZºf° ¨¡Üœ7š«™#›¸ž5¤œ«®´P¿8Ë<Øæ]ôén‘-­9E$O‘W8^ôb²e^fød†a\ÑTÌKFAa5v(«a ÏýMïá‘ÓîÆj»W±Í¨¢;eš™ìš?ž˜£Æª¶³-¾ýÉáÖŸäçòvû/Æ+x8 D3NÐV ]–beif0eøa¸\¡UÆLbB¡6É)Ñ Fÿ½ðƒâåÔ!ȇ¼B²—©ª¢Ÿ—š›™­šÚò¢ÿ©»²½¾ÈÕ6ãuñˆÌp*B7íBDMV ])bQeefke^bX]iV¼M|CÜ7+zF¸0òëã6Ö^É ½7³dªC£ žËš™|šm^¢2©Ë±ù»†Ç:ÔÔáðþ f)6ÐAML7Uj\¿aecfšeÄbï]/W®N’D9o,à¶-¤óPåךʾ¾1´1«æ£zž › ™QšΡi¨à°áºQÆëÒlà”îý£ ûÅ'Ç4²@PKgTÇ[LaÙdXfÇe&c~^óW™O¦EK:»-F #¥õºææØÜËÜ¿2µ¬¤ïžG›¯™&š«œ<¡¬§ô¯Ï¹ÅšÑß!í£û/ ‘n&‚3’?MJ•S[Ø`’dMfëec _­X†P´F|; /¨!„ö(è@ÚÍÁ0¶Û¬7¥hŸŽ›Á™ÿ™Wœ¬ ö¦ ¯Â¸ïÃPШݺë%úÃ"%@2i>MI·RtZX`Nd4ffÖc•_hYgQÂG«=JHÕQÅYÔ_df-f$d`ZHRÌHÔ=œ1f$kmùëûܪÏWÃ?¸–®›¦i ,œï™Í™°›¬Ÿˆ¥N­­¶›Á¾ÍïÚÜèA÷ÕKU"²/<>GöP YS_©cf?fsd–`ËZ#SÑIý>á2Á%Ùy æúlìZÞöЄÄM¹z¯S§ñ ‚œš¶™l›)Ÿã¤l¬²µoÀ}Ì’ÙpçÏõ`Úø a.å:.FPRXÆ^TcÙeUf´daq[ÿSÐJ @(4'Ié [üÝíºßDÒ¶Å[ºd°¨¡Üœ:š¥™*›²ž:¤˜«²´K¿=Ë8Øæ[ôêm“-°9E#O“W6^öb±e_föd‰a\ÒTÎKAAh5p(¯_ ÏýMïá“ÓëÆm»T±Î¨¢9fšž™êšAž—£Åª¸³,¾ýÉáÖ äåòxú/Ç+w8D6NÌV¥]‘bƒeef4eõa»\žUÈL`B£6È)Ò Dÿ¾ð‚âæÔ"È…¼C²—©©¢¢”šœ™®šØõ¢ü©¾²½ÂÈŒÕ7ãwñþÿŒÈs*@7ïBBMV ](bReefje`bV]iV¾MyCß7+}Cº0òèã:Ö\ÉŸ½;³_ªF£ žÌšœ™}šm\¢5©É±ú»…Ç<ÔÐáð‰þ a)6ÔAIL9Uk\½aeaf›eÅbî]0W¬N”D9p,àµ-¦óMå’יʼ¾5´-«è£{ž›¤™Mš È¡p¨Û°äºPÆêÒmà•îý¦ ùÆ'Ç4²@NKiTÅ[NaØdXfÈe$c^óW˜OªEF:¿-C $¨õÀæáØßËÜ¿0µ¬‹¤ðžG›¯™%š¯œ5¡³§î¯Ô¹Å›Ñ ß&ížû5 o&‚3‘?PJ‘S![Ò`™dFfñe|c_¬X…P´F|; /¦!“†ö)è<Ú!ÍÁ0¶Ý¬5¥hŸ›¾™šVœ« ø¦¯Æ¸ìÃPЫݵë+ú¿#%=2l>KI¹RrZY`Ld7f f×c”_iYfQÄG¨¦)®··ÃÂÏNÜDê»øF»²#ü0==IHØQÁYØ_df,f%d`ZHRÌHÔ=1c$oqùþêúܬÏWÃ=¸˜®™¦k *œò™É™´›¨ŸŒ¥J­²¶•ÁÃÍíÚÛèC÷ÔJX"®/<=GöP YR_¬cýeCfod™`ÉZ&SÎIþ>á2Á%Úx æúlìZÞ÷ЃÄM¹z¯S§ò €œš²™p›&Ÿä¤n¬®µsÀzÌ”ÙpçÍõbÙù a.ä:.FPQXÇ^ScÚeTfµdas[üSÓJ@'4'Eì ZüÝíºßEÒ´Å]ºc°¨~¡Üœ:š¦™)›³ž9¤™«°´N¿:Ë:Øæ\ôèpŽ-¬9E'OW<^ñb´e]fùd…a\ÎTÏKBAf5r(¯] ÑýLïá”ÓêÆn»R±Ñ¨¢MI¸RsZX`Nd3ffÒcš_bYlQ¿G«GõP YR_«cýeDfndš`ÉZ#SÒIü>â2À%Ùz äúnìYÞõЇÄI¹|¯S§ð ƒœš´™m›(Ÿã¤o¬®µrÀ{Ì“ÙqçÌõcÙ÷ d.à:2F PQXÈ^RcÛeRf¸dax[øSÕJ@&4'Bð WüÞíºßDÒ¶Å[ºe°¨¡Ýœ7š©™(›²ž;¤–«³´L¿;Ë:ØæZôìk“-­9 E!O”W5^÷b°e`föd‡a\ÎTÐKBAe5s(¬b ÍýOïá”ÓêÆo»Q±Ò¨¢>cšŸ™éšBž•£Éª´³/¾úÉäÖäèòuü/Ä+|8D8NÌV¢]•beff3eõa»\ŸUÆLbB¡6Ê)Ò Dÿ¿ð‚âäÔ%È‚¼F²•©ª¢¡•šš™²šÓù¢ù©¿²½¿ÈÕ8ãtñ‰Êq*C7êBGMV ]+bNehfie^bY]gV¿MzCÜ7+yE»,òîã4Ö_É¡½5³eªB£žËš›™}šm_¢1©Ì±÷»ˆÇ:ÔÒáðŒþ c)6ÑALL7Uk\¾aebf›eÄbï].W¯N’D9o,ß·-¤óPåמʺ¾5´.«ç£zž ›¡™Oš É¡n¨Ý°âºQÆëÒkà–îý¨ öË'Á4¶@MKhTÈ[KaÙdXfÈe#c‚^ïWœO¦EI:½-E $¤õ¹æçØÛËÞ¿0µ¬Œ¤ïžI›®™$š¯œ8¡¯§ó¯Î¹ ÅœÑ ß&íŸû2 m&ƒ3’?MJ–S[Ø`”dHfòe{c_«X†P³F~;/©!‘†ö'è@ÚÍÁ1¶Ú¬8¥gŸ›¾™šVœ¬ ö¦ ¯Â¸ðÃMЭݴë+ú¿"%<2l>LI·RtZX`Ld8f fÖc•_gYhQÄG§ã2¾%Üv èújì]ÞóЇÄJ¹{¯U§î …œš·™k›*Ÿâ¤n¬¯µrÀzÌ–ÙmçÑõ]ßò g.à:1F PRXÆ^ScÛeRf·das[üSÒJ @&4'Bï WüßíºßCÒ¸ÅWºi° ¨‚¡Ûœ7šª™&›µž8¤™«°´O¿8Ë=Øæ`ôåq-­9E#OW;^ðb·e[fùd†a\ÒTÍKDAc5s(¯] ÓýIï á’ÓëÆo»P±Ó¨¢=dšŸ™çšFž‘£Ëªµ³+¾ÊÞÖ¡äçòuý,É+u8 D4NÍV£]’bƒeff3eôa¼\žUÈL`B¢6É)Ñ Fÿ¼ð„âäÔ"Ȇ¼C²—©©¢ —šš™°šÖõ¢ý©½²½ÁÈ‹Õ:ãsñ‰Ét*?7ïBCMV ],bNegfje_bW]iV½M{CÝ7+{D».òëã7Ö]É¡½7³cªD£ žËšž™yšrX¢8©Æ±ü»…Ç;ÔÑáð‹þ d)6ÐAML6Uk\¿aebfœeÃbî]1W¬N”D9m,â´0¢óPåטÊÁ¾.´4«ã£|ž›¡™Oš È¡o¨Ý°àºUÆæÒqà‘îý¥ úÆ'Ç4°@QKfTÈ[LaØdYfÇe$c^ðWœO¥EJ:½-D %¤õºæçØÚËß¿0µ¬¤ëžL›¬™%š®œ9¡®§ó¯Ï¹ Å›Ñ ß%íŸû3 m&…3?PJ‘S[×`“dLfëec _®XƒP¸Fx; /£!–ˆö'è>Ú!ÍÁ3¶Ù¬8¥hŸŽ›Á™þ™Yœ« ö¦ ¯Â¸ïÃPЩݷë*ú¿#%>2k>LI¸RsZX`Od2ffÔc•_iYeQÅG¨¸—®œ¦g -œð™Ê™´›¨ŸŒ¥I­³¶•ÁÃÍìÚÜèA÷×IV"±/<@GôP YS_«cþeCfmd`ÅZ(SÎIý>ã2¿%Úz ãúpìVÞùЄÄJ¹~¯P§ó œš·™k›)Ÿã¤m¬±µpÀ{Ì”ÙoçÐõ^Þó f.á:/FPPXÈ^RcÚeTfµdar[ýSÑJ!@%4'Dë ]üÙí¾ßAÒ·Å[ºd°¨}¡Þœ8š§™)›³ž9¤™«±´K¿>Ë7ØæYôìk”-®9E$O‘W8^ôb³e]fúd‚a\ÌTÑKAAf5q(°] ÑýLïá•ÓéÆo»Q±Ò¨¢=cšŸ™éšCž”£Êª²³1¾ùÉåÖ›äëòr*É+v8 D5NÌV¤]’bƒeef4eóa¾\œUÉL`B¢6É)Ñ Fÿ¼ð…ââÔ%ȃ¼E²–©©¢¢”šœ™®šØõ¢û©À²½ÄȉÕ:ãuñÿÿÆu*>7ðBBMV ]+bNehfhebbT]lVºM|CÝ7+}C¹1òèã9Ö]ÉŸ½9³aªF£ žÎš™™~šn[¢6©È±ú»‡Ç8ÔÔáðŒþ c)6ÐALL7Uk\¿aegf”eËbê]0W¯ND9l,ã²1¡óRåŽ×›Ê½¾2´0«ç£yž › ™Oš È¡o¨Ü°ãºQÆêÒmà“îý¤ ûÄ'È4°@SKeTÆ[OaÕd]fÄe&c~^óWšO¦EJ:¼-F "¨õ¼æçØÙËá¿-µ¬‹¤ðžH›­™'š¬œ:¡¯§ð¯Ò¹Å›Ñ ß"í¢û1 m&…3?TJS[Ø`dPféec_­X„P¶F{; /§!‘ˆö%èBÚÍÁ.¶Ý¬5¥iŸ›¼™šPœ² ò¦ ¯Ä¸ìÃRШݷë+ú½&%B2g>PIµRuZW`Nd4ffÓc˜_eYiQÂG©=GHÚQ¿YÛ_ücf*f%d`ZJRÉHÖ=œ1e$moùëøÜ¬ÏXÃ;¸œ®•¦m )œô™Æ™¸›£Ÿ¥I­°¶˜ÁÁÍìÚÞè@÷ÕLU"°/<=GöP YR_«cýeDfnd›`ÇZ&SÏIþ>à2Ã%×z åúlì[ÞöЄÄL¹z¯T§ñ œš³™o›&Ÿå¤l¬±µpÀ|Ì“ÙpçÎõaÚø a.å:-FPSXÄ^Vc×eUfµdao[TÍJ#@&4'Eë \üÛí¼ßCÒµÅ]ºc°¨¡Ýœ8š§™(›³ž:¤™«¯´O¿9Ë:ØæXôîi•-¯9E#O’W7^õb²e^fød…a\ÏTÎKCAd5t(¬b ÌýPïá•ÓêÆm»T±Ï¨¢:ešž™êšAž—£Æª·³-¾ûÉäÖœäêòtü0Ä+y8 D3NÑVž]—beif0eøa¸\¡UÅLcB¡6Ê)Ó Dÿ¾ð„ââÔ&ȼG²•©©¢¢”šœ™¯šÖ÷¢ú©À²½ÂÈŒÕ7ãwñþÿŒÈs*@7îBDMV ])bPeffke]bZ]fV¿MyCß7+}C¹1òèã:Ö\ÉŸ½:³_ªH£ žÍšœ™{šo\¢4©Ê±ú»„Ç>ÔÎáð‰þ d)6ÐALL7Uk\½aebfšeÆbë]3W«N”D9l,ã²3žóUå‹×œÊ¾¾0´2«å£|ž›¤™Lš Ç¡p¨Û°ãºRÆéÒnà’îý¤ üÄ'Ç4±@QKfTÉ[JaÚdWfÈe$c^ðW›O¦EI:¾-C &£õ»ææØÚËà¿-µ¬ˆ¤óžD›³™ š²œ5¡²§ð¯Ð¹ Å™Ñ ß$ížû5 Œp&„3Ž?QJ’S[×`“dLfëe‚c _°XƒP¶F{; /¨!‘…ö(è?ÚÍÁ/¶Ü¬6¥iŸ›Â™þ™Xœ¬ õ¦ ¯Ä¸ìÃSЦݹë)ú¿$%>2k>MI¶RuZW`Md7f fÖc•_hYgQÃG©÷ØGZ"¬/<;GõPYO_®cüeCfpd˜`ÊZ$SÏI?Ý2Å%Ö{ åúkì\ÞôЇÄI¹}¯Q§ó œš·™j›*Ÿã¤m¬°µqÀ{Ì”ÙoçÐõ\áñ g.á:-FPLXÌ^OcÜeSfµdat[ûSÓJ@'4'Eì Yüßí¸ßFÒµÅYºh° ¨‚¡Ûœ8šª™$›·ž6¤›«°´M¿;Ë9ØæZôël“-®9E"O“W7^öb±e^f÷dˆa\ÒTÌKDAe5r(®_ ÐýKï!áÓíÆl»S±Ñ¨¢=dšž™éšCž“£Ëª³³.¾ýÉàÖ äçòuý.Å+{8D7NÍV¢]”b‚eef4eôa¼\UÊL]B¦6Æ)Ñ Eÿ½ð…ââÔ%È‚¼F²•©«¢Ÿ˜š–™µšÒù¢ú©½²½¿ÈŽÕ7ãtñŠÈt*?7ïBBMV]/bKejfgebbU]iV¾MyCà7+~A½+òïã4Ö`Éž½8³cªC£žÇš¡™xšp\¢4©Ê±ù»‡Ç9ÔÔáð‹þ a)6ÒALL7Uk\¾aebfšeÅbî]0W­N’D9n,â²2 óSåכʾ¾1´1«å£|ž›¢™Nš Æ¡r¨Ù°åºPÆêÒmà•îý¨ ÷È'Æ4±@PKhTÅ[PaÔd\fÅe%c^ðW›O¦EI:¾-C &£õ¹æçØÛËß¿/µ¬¤îžJ›­™%š¯œ6¡²§ï¯Ó¹Å›Ñ ß&íû5 o&„3Ž?RJS![Ó`–dKfêe„c _±XƒP´F;/©!‘ˆö%èAÚÍÁ0¶Û¬7¥hŸ›¿™šVœ­ õ¦ ¯Ä¸ìÃRЩݵë,ú¾$%?2i>MIºRoZ]`Hd9f f×c”_hYgQÂG¬=FHÜQ½YÛ_ýcf,f#d`ZJRÊHÕ=1c$ptùüêüÜ«ÏVÃ>¸˜®™¦k *œò™É™µ›¦ŸŽ¥I­±¶˜ÁÀÍîÚÜèA÷ÕKU"±/<à2Á%Úx æúmìXÞùЂÄM¹{¯Q§ô €œš¹™e›2ŸÚ¤t¬¬µsÀzÌ•ÙnçÐõ_Üö c.ã:.FPPXÇ^ScÚeTfµdau[úSÔJ@&4'Fë \üÚí½ßAÒ¹ÅYºe°¨¡Ûœ<š£™+›²ž9¤›«­´Q¿8Ë:ØæZôëm‘-­9E%OW:^ób³e^fød…a\ÑTÍKCAe5q(°^ ÐýLïá’ÓëÆo»P±Ó¨¢OI¸RpZ\`Jd9f fØc”_gYjQ¿G­=IH×QÂYØ_þcf+f%d`ZIRÊHÕ=œ1f$lnùë÷Ü®ÏTÃA¸•®›¦i +œó™Ç™·›£Ÿ‘¥G­³¶—Á¿ÍïÚÛèB÷ÖHY"­/<á2Á%Úw èúiì^ÞóІÄL¹y¯V§ï ‚œšµ™l›+Ÿß¤p¬°µoÀ~Ì‘ÙqçÏõ^Þó g.à:0FPRXÅ^Vc×eVf³das[ýSÐJ"@#4'Cí YüÝíºßFÒ´Å[ºe°¨€¡Üœ8š¨™(›³ž9¤™«°´N¿:Ë:Øæ[ôëk•-³9E(OŽW9^õb±e^fùd…a\ÑTÍKCAf5q(®` ÏýMïá•ÓèÆq»P±Ò¨¢:gšœ™ëšBž”£Éªµ³-¾üÉäÖ›äëòsý.Æ+x8 D4NÎV£]‘b…ecf5eõaº\ UÅLcB¡6É)Ï Hÿºð†ââÔ$È…¼B²˜©©¢ —š™™±šÖõ¢ý©¼²½ÀÈŒÕ8ãtñŠÈt*>7òB?MV]+bOehffeebQ]mV»MzCá7+€@¼/òêã8Ö]ÉŸ½9³bªD£ žÌš›™}šm^¢2©Ì±÷»‡Ç;ÔÑáðŒþ c)6ÔAJL7Um\»ae_fžeÁbò]*W´NŒD9h,æ°3 óQåיʾ¾2´0«æ£|ž›¤™Nš Ë¡k¨ß°áºRÆêÒmà“îý£ üÅ'Æ4²@PKgTÇ[NaÕd\fÄe'c^òW˜O©EH:¾-D #¦õ¹æèØØËá¿/µ¬¤ížJ›®™%š®œ8¡°§ð¯Ò¹ÅÑ ß$í û3 Žo&ƒ3?SJŽS"[Ô`•dJfîe~c_­X„P¶F{; /¨!‘…ö)è=Ú!ÍÁ1¶Û¬7¥hŸ›¿™šXœ« ÷¦¯Æ¸ìÃQЩݷë(úÃ%>2j>NI¶RsZY`Md6ffÕc–_hYfQÄG¨=HHØQÂY×_df/f!d`ZGRÎHÑ=Ÿ1c$osùüêþܨÏYÃ<¸˜®›¦i +œò™É™´›¨ŸŒ¥I­³¶–ÁÁÍîÚÚèD÷ÓMS"²/<>GöP YQ_­cýeBfpd˜`ËZ#SÑIû>ã2Á%Ùy åúlì\ÞôЇÄI¹|¯T§ï …œš¸™j›+Ÿá¤o¬¯µqÀ{Ì”ÙoçÏõ`Û÷ b.å:+FPLXË^PcÜeRf·das[ýSÐJ"@&4'Gê \üÛí½ß@ÒºÅWºh°¨€¡Úœ;š¦™)›³ž9¤˜«²´L¿;Ë:ØæZôíi–-°9E$O‘W8^ôb´e[fûdƒa\ÎTÏKBAe5u(ªb ÍýNïá‘ÓíÆl»S±Ò¨¢@aš ™éšAž˜£Åª¸³+¾þÉáÖŸäçòwù2Ã+z8D4NÏV¡]“b„edf4eõaº\ UÇL`B£6È)Ò Eÿ¼ð„âäÔ#Ȇ¼A²™©§¢£•šš™±šÔø¢û©¾²½ÀÈÕ8ãtñ‰Ét*>7ðBBMV],bNehfie_bW]hV¿MzCÜ7+xH·1òèã9Ö]É ½8³bªC£žÊšœ™~šjb¢.©Î±÷»ˆÇ:ÔÒáðŒþ d)6ÐALL8Uj\¿aedf™eÆbí]0W­N“D9m,ã²1¡óRåŽ×šÊ¾¾2´/«è£xž › ™QšË¡m¨Ü°äºPÆëÒmà“îý¥ úÅ'È4¯@SKfTÆ[MaØdXfÉe#c^ðW›O¦EJ:¼-F "¨õ¼æçØØËâ¿,µ¬‹¤ïžH›®™&š­œ8¡±§ï¯Ó¹ÅœÑ ß%í û2 m&…3Ž?SJŽS"[Ô`•dJfíe€c _¯X‚P¸Fx; /¦!’…ö(è?ÚÍÁ/¶Ý¬5¥iŸ›¾™šSœ° ó¦ ¯Ã¸íÃRЧݹë(úÁ"%>2k>LI¸RrZZ`Kd8f f×c–_fYiQÁGªã2¾%Ýv çúkì\ÞóЉÄG¹~¯Q§ò ‚œš¶™k›*Ÿâ¤n¬°µpÀ|Ì“ÙqçÌõbÚ÷ d.á:0F PSXÆ^ScÛeRf¶daq[ÿSÐJ @(4'Gë [üÚí¾ß@Ò¹ÅZºc°¨}¡Ýœ:š¥™+›°ž<¤—«³´J¿>Ë5Ø æXôìk”-²9E'OŽW;^òb´e]fød†a\ÑTÎKBAe5r(®a ÎýLïá‘ÓîÆk»U±Í¨¢9fš™êšBž–£Çªµ³.¾üÉâÖžäèòvú1Ã+z8 D3NÐVŸ]–b€ehf1e÷a¹\ UÆLbB¡6Ê)Ó Dÿ½ð…ââÔ%ȃ¼C²™©§¢¢–š™™±šÖõ¢ý©¾²½ÃÈŠÕ:ãtñ‹Èt*?7ïBBMV ]+bOegfhebbT]lVºM|CÝ7+}Cº0òçã;Ö[É¢½6³dªC£ žÎš™™šm]¢3©Ê±ù»ˆÇ8ÔÕáðŒþ a)6ÔAHL;Uh\¿ae_fŸeÀbò]-W®N“D9n,â³0£óOå‘טʿ¾1´1«æ£zž›¡™Pš È¡p¨Ú°äºQÆêÒmà”îý§ ùÆ'Æ4²@PKhTÅ[Na×dYfÈe#c^ñWšO§EH:¾-E #¦õ»æçØÙËà¿/µ¬¤ížK›¬™'š«œ;¡®§ñ¯Ó¹Å Ñß%í¡û/ “k&†3Ž?QJ‘S [Õ`”dKfíe€c _®XƒP¸Fy; /¦!’†ö'è@ÚÍÁ,¶ß¬4¥jŸŽ›¿™šTœ° ò¦ ¯Á¸ñÃMЬݳë.ú»(%A2h>OIµRvZV`Nd5ffÖc”_hYhQÁG¬à2Â%Ùy åúmìZÞõІÄK¹z¯U§ð œš²™n›*Ÿà¤p¬®µqÀ}Ì’ÙpçÏõ^ßó e.â:.FPNXÊ^PcÝeQf·dau[ûSÓJ@&4'Eì YüÝí¼ßBÒ¹ÅVºi° ¨ƒ¡Ùœ;š¥™*›²ž;¤–«´´J¿<Ë;Øæ_ôæq-­9E%O‘W8^õb°e`f÷d†a\ÌTÓK>Ai5p(®` ÏýLï á‘ÓëÆo»Q±Ò¨¢7ðBBMV ](bReefke_bV]iV¾M{CÜ7+zEº.òìã5ÖaÉ›½=³]ªJ£žÑš—™šj_¢2©Ë±ù»…Ç=ÔÏáðˆþ a)6ÒAKL8Uj\Àaedf›eÃbð].W®N“D9n,á´0¢óQåŽ×›Ê½¾2´0«æ£{ž›¢™Mš Æ¡q¨Û°ãºQÆêÒmà”îý¤ úÇ'Å4³@PKeTÊ[JaÚdWfÉe"c‚^ñW™O©EF:À-B &¤õ¹æèØÚËß¿/µ¬¤îžJ›¬™'š«œ<¡¬§ô¯Î¹ Å›Ñ ß$í û2 n&ƒ3?QJS![Ó`—dHfïec _¯XƒP¶F{; /¥!–Œö!èDÚÍÁ1¶Ù¬9¥fŸ‘›½™šTœ® õ¦ ¯Â¸ïÃOЬݳë-ú½$%<2k>NI¶RuZW`Ld8f fØc“_iYgQÂGª=HHØQÃYÖ_df,f&d`ZFRÌHÔ=1d$npùëùܬÏVÃ>¸˜®š¦h -œð™Ë™³›¨ŸŒ¥J­²¶–ÁÂÍíÚÛèC÷ÔKU"²/ß2Å%Ô~ àúqìXÞöІÄJ¹{¯U§î …œš·™k›*Ÿã¤l¬±µpÀ|Ì”ÙoçÏõ_Ýô e.â:/FPSXÄ^Vc×eVf´dar[ýSÑJ!@%4'Dì ZüÜí¼ßCÒ·ÅXºh° ¨€¡Ýœ7š©™'›³ž:¤˜«²´L¿<Ë8Øæ[ôên‘-®9E$O‘W7^öb±e_f÷d†a\ÏTÏKBAe5t(«b ÍýNïá“ÓêÆp»O±Ó¨¢¿,òìã8ÖZɤ½4³fªA£žÈš ™xšq[¢4©Ê±ù»†Ç;ÔÒáðŽþ f)6ÑAKL9Uh\Àae`fžeÂbï]/W®N’D9m,à·,¦óNåךʽ¾3´/«ç£{ž›¤™Mš Ê¡m¨Ý°ãºPÆëÒlà–îý§ øÇ'Ç4±@OKjTÂ[RaÕdYfÈe"cƒ^ïWœO¥EI:¿-A (¢õºææØÛËÞ¿0µ¬¤ížK›«™)š©œ<¡®§ñ¯Ò¹Å›Ñ ß!í£û0 ‘l&…3?PJ’S [Ô`—dFfñe~c_®X„P´F};/¨!’‡ö'è?ÚÍÁ/¶Ý¬5¥hŸ‘›¼™šQœ² ñ¦ ¯Á¸ïÃOЫݵë+ú¿#%B2f>QIµRrZ[`Kd7ffÕc•_jYcQÈG¤å2¿%Úx åúnìYÞ÷ЄÄJ¹~¯P§ô €œšµ™l›*Ÿâ¤n¬°µpÀ|Ì”ÙnçÑõ]ßó e.ã:,FPNXÈ^TcØeUfµdau[ûSÑJ"@$4'Dì [üÜí¼ßAÒ¹ÅXºg°¨€¡Üœ8š¨™(›³ž9¤š«®´R¿5Ë>Øæ[ôìj•-±9E&OW9^õb±e_f÷d‡a\ÐTÎKCAe5r(¯^ ÐýMïá”ÓêÆn»S±Ð¨¢ÔÍá ð†þ a)6ÑAKL8Ul\½aeafœeÅbí]/W®N“D9p,ß¶/¡óRåŽ×›Ê¾¾0´3«ã£}ž›£™Nš È¡o¨Ü°âºSÆèÒnà”îý§ ùÇ'Ä4´@NKjTÄ[PaÓd_fÁe*c{^õW˜O¨EH:½-F "§õºæèØÚËÞ¿1µ¬¤ìžJ›®™%š®œ8¡¯§ò¯Ñ¹ÅžÑß&í û0 “j&†3?PJ’S[Õ`•dJfîe~c_«X†PµF{; /¦!”Šö$èBÚÍÁ-¶à¬3¥jŸŽ›¿™šUœ­ ö¦ ¯Ä¸íÃQЩݶë+ú¾$%?2j>MI·RsZY`Ld7ffÕc–_fYiQÂG©¸™®—¦m (œô™È™µ›¦ŸŽ¥H­³¶˜Á¾ÍðÚÚèB÷×HX"®/<ã2À%Úx åúmì[ÞôЈÄG¹¯O§õ œšµ™j›.ŸÝ¤r¬®µoÀÌÙrçÎõ_Ýô e.â:.FPPXÈ^RcÛeRf·das[ýSÑJ!@&4'Gê \üÛí»ßDÒ¶ÅZºf°¨€¡Üœ8š©™&›´ž:¤˜«±´M¿:Ë;Øæ\ôêl”-±9E%OW9^ób´e\fúd„a\ÎTÐKBAe5t(«a ÏýLï á‘ÓìÆl»T±Ï¨¢QI³RvZV`Nd6ffÖc•_fYkQ¾G®=JHÔQÇYÓ_df+f&d`ZHRËHÕ=œ1d$orùüêþܧÏ[Ã9¸œ®—¦k +œñ™É™¶›¤Ÿ¥G­³¶—ÁÁÍëÚàè<÷ÜD["¬/<ã2À%Ù{ âúoìYÞöІÄI¹}¯R§ò œš¶™l›*Ÿá¤o¬¯µrÀzÌ”ÙpçÏõ_Ýó g.à:0FPOXÊ^PcÝePf¹dau[ûSÓJ@(4'Iè ^üÚí¼ßCÒ¶Å[ºe°¨€¡Ûœ9š¨™'›µž7¤›«­´R¿6Ë>Øæ\ôël“-¯9E%OW9^óbµe[fúd…a\ÒTÌKCAf5q(°] ÑýKïá“ÓêÆo»R±Ï¨¢8hšœ™êšCž”£Èª¶³-¾üÉãÖœäêòtý-Ç+x8 D3NÐV ]•b‚edf6eóa¼\žUÆLcB¢6È)Ð Gÿ¼ð…ââÔ%È‚¼F²•©ª¢¡–š˜™´šÐý¢õ©Ã²½ÂÈŒÕ7ãvñŠÊq*A7ïBAMV],bNehfheabV]jV¼M{CÞ7+~B»/òéã:Ö[É¡½8³aªF£ žÌšœ™|šm_¢1©Í±ö»ˆÇ;ÔÏá ð„þ _)6ÎAOL7Ui\ÀaedfœeÂbð].W®N“D9p,ß·,¥óNå’×—ÊÁ¾/´2«å£|ž›¤™Mš È¡o¨Ü°ãºQÆéÒoà’îý£ üÄ'È4°@RKeTÈ[NaÕd\fÄe&c^ïWO£EL:»-G !¨õ½æåØÜËÝ¿1µ¬Ž¤îžI›®™%š­œ:¡­§ô¯Ï¹ÅœÑ ß$í¡û1 n&‚3’?OJ‘S![Ó`—dHfïec _¯X‚P·F{; /¨!‘ˆö$èCÚÍÁ0¶Û¬8¥eŸ’›½™šTœ¯ ò¦¯¿¸ðÃPЩݷë)úÀ#%?2i>OI¶RsZY`Ld7ffÕc–_fYiQÁG¬¸˜®™¦i -œï™Ì™²›§Ÿ¥F­µ¶•ÁÁÍïÚØèF÷ÒMT"°/<ß2Ä%×z äúnìXÞùЂÄM¹z¯T§ð ƒœšµ™m›(Ÿã¤n¬°µpÀ{Ì•ÙnçÑõ]Þô e.â:.FPNXÊ^QcÛeRf¸dau[üSÑJ!@&4'Gë ZüÝí»ßCÒ¶Å[ºd°¨|¡ßœ5š«™%›¶ž7¤š«°´L¿>Ë6Ø æYôëm“-°9E%O’W5^øb°e_fød…a\ÐTÎKBAg5p(¯_ ÏýNïá•ÓéÆp»P±Ó¨¢@aš¡™çšCž–£Çª¶³-¾üÉãÖäèòvû0Ä+z8D6NÍV£]‘b…edf3eøaµ\¦UÀLfB 6É)Ñ Eÿ½ð…ââÔ$È„¼D²—©©¢¡”š™®š×ö¢û©¾²½ÀÈŽÕ6ãvñˆÌp*B7îBBMV ]+bOeffke^bX]gV¿MzCÞ7+}B½-òëã7Ö]É ½9³aªF£ žÎšš™šk_¢1©Í±ö»ŠÇ8ÔÑáð‡þ _)6ÔAIL:Uh\ÁaedfšeÅbí]0W®N’D9n,àµ1žóVå‹×œÊ¾¾0´1«ç£yž ›¢™Mš Æ¡q¨Ú°åºOÆìÒkà–îý¨ öÊ'Ã4³@QKeTÈ[Ma×dZfÆe%c€^ñWœO£EM:º-G !ªõÀæáØßËÜ¿2µ¬¤îžI›¯™$š®œ7¡²§î¯Õ¹ÅžÑ ß$í¡û2 Žp&3’?OJ’S[Ö`”dJfîec_®XƒP¶F|;/¨!’‡ö(è=Ú!ÍÁ1¶Ü¬5¥jŸŽ›¿™šSœ± ò¦ ¯Â¸íÃRШݸë(úÁ"%A2f>RI³RvZV`Od3ffÓc–_iYdQÆG¨à2Â%Ø{ âúqìUÞúЄÄJ¹}¯P§õ œšµ™j›.ŸÞ¤p¬°µnÀÌ‘ÙqçÍõbÚö e.ß:4F PTXÅ^TcÚeSf¶dar[ÿSÍJ&@!4'Dë [üÝí¹ßFÒ´Å\ºd°¨~¡Þœ7š¨™(›´ž8¤š«¯´O¿:Ë:ØæZôìj–-²9E&OW8^öb°e_fød…a\ÑTËKGA`5w(ªc ÍýMïá‘ÓíÆm»R±Ñ¨¢;fš™êšAž–£Èª´³0¾ùÉåÖœäéòtþ,È+w8D6NÌV¤]’b‚egf1eøa¸\¡UÅLdBž6Í)Õ Bÿ¿ð‚âæÔ!Ȇ¼B²˜©©¢ —š˜™³šÓù¢ù©À²½ÅȈÕ;ãtñÿÿÇs*A7íBDMV ])bQeefke^bW]kV¹M€CØ7 +zE¹0òéã9Ö\É¡½8³aªE£ žÍš›™}šl_¢2©Ë±ù»…Ç=ÔÏáðˆþ _ )6ÕAHL;Uh\ÀaecfšeÆbí]0W­N’D9m,â³0¢óQå×™ÊÀ¾/´3«ä£{ž ›ž™SšË¡n¨Ü°âºRÆêÒlà–îý¨ øÈ'Ã4¶@LKjTÅ[MaÙdXfÈe#c^ðWœO¦EH:¿-B &¥õ¼æåØÜËÞ¿/µ¬Œ¤îžJ›¬™'š¬œ:¡­§õ¯Ì¹$Å–Ñß!í¢û2 n&‚3‘?QJ‘S[Ö`“dLfíec_®XƒP¶F{; /¨!’‰ö$èBÚÍÁ3¶Ù¬8¥hŸ›½™šQœ² ò¦ ¯Â¸îÃRШݷë)úÀ#%=2l>KIºRpZ\`Id9f f×c•_gYhQÂG©ß2Ã%Øz äúmì[ÞôЈÄG¹~¯R§ò ‚œš¹™h›-Ÿà¤o¬°µoÀ~Ì‘ÙrçÌõcÙ÷ d.à:3F PRXÈ^QcÝePf·dar[ÿSÎJ#@$4'Eê ]üÙíÀß>Ò»ÅVºh°¨~¡Ýœ8š¨™'›´ž9¤˜«²´K¿=Ë8Øæ[ôêm“-³9E(OŽW9^õb±e`föd‡a\ÒTÍKCAe5r(®` ÎýNïá”ÓêÆn»S±Ð¨¢;ešž™êšAž–£Èªµ³.¾ûÉãÖžäèòuü.Ç+w8 D5NÍV£]’bƒeff2eøa·\¡UÆLaB¤6Ç)Ò Dÿ¿ðâæÔ"È…¼C²—©©¢¡•š›™°šÕø¢ù©Á²½ÂÈÕ6ãwñÿÿŠÊs*>7òB>MV]*bRecfme\bY]hV¾MzCÝ7+|B½,òìã8Ö[É¢½6³dªC£ žÊš™|šm_¢1©Ì±ø»†Ç=ÔÎáð‡þ ^!)6ÓAKL7Ul\½aebfšeÆbí]0W­N”D9o,àµ/¤óNå‘יʽ¾3´0«æ£{ž›¡™Qš Ê¡m¨Ý°âºSÆçÒpà’îý¥ ùÇ'Æ4²@PKgTÆ[NaÖd\fÄe'c}^ôW˜O©EF:Á-@ )¡õ¸æèØÚËß¿0µ¬¤îžJ›¬™(šªœ=¡«§ô¯Ï¹ÅÑß&íŸû3 m&„3?QJ‘S[×`”dJfïe|c_¬X…P´F};/¨!’ˆö%èAÚÍÁ0¶Ü¬5¥jŸŒ›Â™šVœ­ õ¦ ¯Â¸ðÃOЪݶë)úÀ$%@2h>OIµRvZU`Pd3ffÔc–_gYgQÄG§=IHÖQÄYÖ_ÿcf*f'd`ZIRÉHØ=™1f$nqùþêúܬÏVÃ>¸˜®™¦j +œñ™Ê™´›§Ÿ¥I­²¶—ÁÀÍîÚÜèA÷ÖIX"­/<9GùP YS_¬cýeBfqd–`ÍZ!SÓIú>ä2¾%Ýu èúkìZÞøÐƒÄK¹|¯R§ó œš¸™h›/ŸÝ¤q¬¯µpÀ|Ì”ÙoçÏõ`Ûö e.à:1FPQXÈ^QcÝeOfºdat[ýSÑJ@(4'Eí YüÜí½ß@ÒºÅWºh° ¨ƒ¡Ùœ<š¤™*›³ž8¤œ«­´O¿:Ë9ØæYôìj–-²9E(OŒW=^ðb·eZfûdƒa\ÐTÍKEAc5s(®_ ÐýLïá“ÓëÆn»R±Ñ¨¢=cš ™èšCž”£Êª²³1¾ùÉåÖœäéòuû1Ã+|8D9NÊV¥]‘b„eef3eöa¹\¡UÆL`B¤6Æ)Í Iÿ¹ð†âãÔ$È…¼B²˜©¨¢¢–š™™²šÔø¢ù©Á²½ÄÈŠÕ9ãtñˆËr*@7ïBAMV],bNegfke]bZ]dVÃMvCá7+}B½+òïã3Ö`ÉŸ½7³dªC£ žÌš›™~šk`¢1©Ë±ú»„Ç>ÔÎáðˆþ `)6ÐANL6Uk\¾aeafeÂbð].W®N“D9n,â²3ŸóSåלʼ¾4´-«é£yž›¤™JšÆ¡q¨Ú°äºPÆëÒmà“îý¥ ùÈ'Ã4µ@NKhTÆ[MaÙdWfÉe#c€^óW˜O¨EH:¿-B &¥õ½æåØÚËâ¿*µ ¬ˆ¤ðžJ›«™)šªœ;¡®§ò¯Ð¹ÅšÑßí§û* —g&‰3Œ?RJ’S[Ù`‘dMfëec _¯X‚P¸Fx; /¥!’…ö)è=Ú ÍÁ1¶Û¬6¥iŸ›¾™šUœ® ô¦ ¯À¸ñÃMЭݳë-ú¼&%?2j>LI¹RrZY`Ld6ffØc’_jYfQÂG¬ä2¾%Üv çúmìYÞ÷ЃÄM¹y¯V§ï ƒœš·™j›-ŸÞ¤r¬¬µtÀyÌ•ÙoçÏõ`Ûö d.â:0F PSXÅ^TcÚeSf¶daq[TÎJ#@$4'Dí YüÝí»ßDÒµÅ\ºd°¨¡Úœ;š¦™(›´ž8¤›«®´P¿8Ë<Øæ]ôém“-®9E"O“W7^ôb´e[fûd„a\ÑTÌKDAf5p(°^ ÑýKï áÓîÆk»U±Ï¨¢>`𣙿šDž•£Çª¶³-¾ýÉâÖäêòr*Ê+v8 D5NÌV¤]“begf2eöa»\UÉL_B¥6Æ)Ð Eÿ¿ðâæÔ"È…¼C²—©©¢¢”šœ™®š×ö¢ý©¼²½ÀÈÕ8ãuñÿÿŒÈs*@7ïBAMV].bNeefme\bY]iV¼M{CÞ7+}D¸2òçã:Ö\ÉŸ½:³`ªG£ žÍšœ™{šp[¢4©Ë±÷»‰Ç9ÔÒáð‹þ d)6ÔAIL9Uk\½aecf™eÆbí]0W­N”D9p,à´1 óSåŽ×™Ê¿¾2´.«é£xž ›¤™Kš Ç¡p¨Û°åºNÆíÒkà”îý£ üÄ'È4°@RKfTÇ[Ma×d[fÄe(c|^õW˜O¨EG:¿-C &¤õ¼ææØÚËà¿.µ¬Ž¤ìžK›­™$š°œ6¡±§ñ¯Ð¹ ÅšÑ ß%íŸû4 Žm&†3?SJS[×`“dKfíe€c _°XP¸Fz; /§!‘ˆö%èBÚÍÁ0¶Û¬7¥gŸ›¿™šUœ¯ ó¦ ¯Â¸íÃSЦݺë'úÁ#%@2i>NI¸RqZZ`Kd8f f×c“_jYfQÃG©=GHÚQ¾YÞ_÷c$f#f-d` ZCRÐHÑ=Ÿ1b$prùüêýÜ©ÏYÃ<¸˜®š¦j +œñ™É™¶›¥Ÿ¥H­²¶˜Á¿ÍïÚÛèB÷ÕJW"®/<9GúPYT_ªcÿeAfqd—`ËZ#SÒIú>å2½%Ýv æúnìXÞøÐ„ÄJ¹}¯Q§ô ~œš²™o›(Ÿâ¤o¬®µrÀ{Ì”ÙoçÏõ`Ûö c.ã:/FPPXÇ^ScÚeTfµdat[üSÑJ"@#4'@ð WüÞí¼ßAÒ¹ÅXºf°¨~¡Þœ6šª™&›µž8¤™«±´M¿;Ë9ØæZôìj–-´9E(OW7^øb®ebfôd‰a\ÒTÍKBAf5r(®_ ÏýMïá“ÓëÆm»T±Ï¨¢ÔÍá ð‡þ a)6ÔAIL9Uk\½ae`fžeÁbñ]-W¯N“D9q,ßµ0 óUåŠ×žÊ»¾3´1«ä£}ž›¤™Lš È¡o¨Ý°áºRÆéÒnà”îý¤ ûÆ'Å4µ@LKjTÅ[Na×dZfÇe#c‚^ïWO¤EJ:½-E #§õ½æåØÛËß¿0µ¬¤ìžK›­™%š®œ8¡°§ð¯Ó¹ÅŸÑß%í û2 o&3“?NJ’S [Ô`—dHfïe~c_­X…P´F};/¨!’ˆö&è@ÚÍÁ.¶Þ¬4¥iŸ›¿™šTœ® ö¦¯È¸éÃSЩݵë-ú¼&%?2k>MI¶RvZT`Qd2ffÓc—_fYhQÃG©GõP YT_©cf@fqd˜`ËZ#SÑIü>â2À%Ûw çúkì[ÞöЄÄK¹|¯R§ó €œš¸™i›,Ÿá¤m¬³µmÀ}Ì”ÙnçÑõ^Ûø `.è:)FPLXË^PcÝeQf·das[ýSÑJ @'4'Eì ZüÜí½ßAÒ¸ÅZºd°¨¡Ûœ;š¤™*›³ž9¤š«¯´M¿<Ë8ØæZôêm“-±9E%O’W6^öb²e\fûdƒa\ÎTÏKAAh5p(¯_ ÎýOïá•ÓéÆn»S±Ð¨¢;ešž™éšBž—£Æª¶³.¾úÉæÖšäêòuü.Ç+v8 D3NÎV¢]”begf3eôa½\œUÊL^B¦6Æ)Ò Dÿ¿ð‚âåÔ!ȇ¼A²™©§¢£•šš™°šÖö¢ü©¿²½ÂÈŒÕ7ãwñÿÿŠÊr*A7íBDMV ],bMeifgeabV]jV½MzCÞ7+}D¹1òèã9Ö\É¡½8³aªG£žÏš™™šk`¢0©Í±÷»‡Ç;ÔÑáð‰þ a)6ÒAKL9Uj\¾aecfšeÇbê]3WªN—D9q,ß´3žóTåŒ×œÊ½¾2´1«å£|ž›£™Nš É¡n¨Ü°ãºQÆêÒnà‘îý¢ üÅ'Æ4³@PKeTÉ[KaÚdWfÈe#c‚^ðWšO§EI:½-D %¥õ»æçØÚËß¿0µ¬’¤éžM›«™&š®œ8¡°§ñ¯Ð¹ Å™Ñ ß#í¡û1 m&„3?OJ”S[Û`ŽdQfèe‚c _­X†P´F{; /¤!–Šö%è@ÚÍÁ-¶ß¬3¥jŸ›¿™šUœ¯ ò¦ ¯Á¸ïÃPЩݶë+ú¾&%F2b>SIµRsZZ`Kd6ffÓc™_dYjQÁGª¦&®º·ÀÂÏLÜGê¶øJ¸µ#ú0==IHØQÁYÚ_ûc f(f(d`ZHRÊHÖ=›1e$osùüêýÜ©ÏXÃ>¸–®œ¦g -œñ™É™µ›¥Ÿ¥I­±¶˜ÁÀÍíÚÝèA÷ÕKV"¯/<;G÷P YP_®cûeDfpd—`ÌZ!SÓIû>â2Á%Úw çúkì[ÞöЄÄL¹z¯T§ñ œš´™k›-ŸÞ¤q¬¯µnÀÌÙuçÌõ`Þò g.à:0FPNXÊ^PcÝeQf¸dau[ýSÏJ$@"4'Bï WüÞí»ßCÒ·ÅZºd°¨}¡ßœ7š¨™'›´ž9¤™«°´N¿:Ë:ØæZôìk”-²9E(OŽW:^ôb²e]fùd†a\ÑTÌKDAf5p(°^ ÐýMïá”ÓéÆq»O±Ô¨¢>cšŸ™éšCž”£Êª²³1¾ùÉåÖœäéòuû0Ä+z8D5NÎV¢]“b‚egf2eöa»\UÊL_B£6É)Ô Dÿ¼ð†âàÔ(ȼE²–©©¢¢•𛙝š×õ¢ý©¼²½¾ÈÕ6ãwñþÿŒÇu*>7ñB@MV ]*bPegfheabW]fVÂMvCà7+{Dº/òëã7Ö]É ½8³bªE£ žÍšš™~šl`¢/©Ï±ô»ŠÇ9ÔÒáð‹þ e)6ÑAKL8Ul\»ae^fŸeÂbï].W¯N‘D9k,ã²2 óSåךÊÀ¾.´5«â£}ž›¢™Oš É¡n¨Þ°àºSÆéÒmà•îý¦ ùÇ'Å4²@QKeTÉ[KaÙdXfÇe&c~^óW™O¦EK:¼-E $¤õºæçØÚËß¿/µ¬Š¤ðžH›¯™$š¯œ6¡²§ï¯Ó¹ÅžÑß'ížû3 m&„3?PJ’S[×`“dKfîe~c_¯XP¹Fy; /§!’ˆö&è@ÚÍÁ0¶Ü¬6¥hŸ›¿™šTœ¯ ó¦ ¯Â¸íÃRШݷë*ú¿$%B2e>SI³RvZV`Nd6ff×c“_iYgQÂG«fsd—`ÉZ&SÎIþ>â2¿%Ûx åúnìXÞøÐƒÄL¹{¯S§ò €œš³™p›%Ÿæ¤j¬³µoÀ}Ì‘ÙrçÌõcÙø a.å:,FPNXÉ^RcÛeRf·dau[üSÑJ!@%4'Fê \üÚí¾ß@ÒºÅVºi° ¨€¡Ýœ6š«™%›µž8¤š«¯´O¿8Ë<Øæ[ôìi–-°9E#O“W6^öb°e`födˆa\ÐTÎKDAc5u(«b ÍýOïá”ÓêÆo»Q±Ò¨¢=dšž™ëš@ž—£Æª¶³/¾úÉäÖœäéòuü.Æ+y8D6NÌV¤]’b„ecf6eòa¿\šUÊL`B¢6Ê)Ð Gÿ¼ð„âäÔ#È„¼D²—©¨¢¢•š›™°šÕ÷¢û©¾²½¾È‘Õ2ãzñüÿŽÇt*>7ðBBMV ]+bOegfie`bV]jV½MzCÞ7+~A¾*òïã3Öaɽ;³_ªG£ žÎš›™}šm^¢1©Î±õ»‹Ç6ÔÕáðŒþ a)6ÓAJL:Ug\Ãaegf˜eÅbï].W¯N’D9p,á³2žóUåŒ×œÊ½¾1´2«ä£}ž›¥™KšÇ¡o¨Ü°ãºPÆìÒkà–îý§ øÈ'Ä4³@PKgTÆ[NaÖd[fÅe&c^òWšO¦EI:¾-C &£õ»æåØÜËÝ¿1µ¬‹¤ñžE›²™"š°œ7¡°§ñ¯Ð¹ ÅšÑ ß#í¡û0 “j&†3?PJ‘S![Ó`—dHfïe~c_­X…P´F|; /¨!’…ö(è?ÚÍÁ2¶Ù¬9¥fŸ›Á™ÿ™Wœ¬ ö¦ ¯Å¸ëÃSШݶë,ú¼&%A2h>NI¸RpZ]`Hd:f f×c•_gYhQÂG«Ë7ØæZôël“-°9E&OW8^öb°e`föd‡a\ÑTÍKCAe5q(±[ ÔýHï"á‘ÓëÆn»R±Ñ¨¢=bš¡™çšCž–£Æª¸³+¾þÉàÖ äçòuý-Æ+{8D9NÊV¤]”b€ehf1e÷a¹\ UÆLcB 6Ê)Ñ Hÿ¸ðŠâÝÔ)ȼD²˜©§¢¤“šœ™¯šÕø¢ú©¿²½¿ÈÕ4ãyñýÿÇu*>7ïBCMV ]*bPeffje_bW]hVÀMvCã7+€@¾+òîã4Öaɽ9³bªE£ žÍ𙙀šj`¢1©Ë±ú»„Ç=ÔÏáðŠþ ` )6ÖAHL:Uj\½aebf™eÈbê]3W«N”D9m,ä°4žóTåŒ×Ê»¾4´.«è£yž ›¢™Mš È¡n¨Þ°áºRÆêÒlà•îý¦ øÈ'Ä4´@PKeTÈ[Ma×dZfÆe%c€^ñWšO§EI:¾-B '£õ»æäØÞËÜ¿1µ¬‹¤ðžH›¯™$š¯œ7¡°§ò¯Ð¹ÅœÑ ß$í û2 Žp&‚3‘?OJ“S[Ø`’dMfëec _¯X„PµF|; /¦!•‹ö#èAÚÍÁ2¶Ø¬:¥eŸ‘›¿™šWœ­ ô¦ ¯À¸ñÃNЫݵë*úÀ#%A2g>PI¶RsZY`Ld6ffÓc˜_eYiQÂGª¸™®—¦m )œò™Ê™²›ªŸ‹¥K­¯¶›Á¼ÍòÚØèE÷ÒMT"²/<á2À%Üu çúmìYÞ÷Ð…ÄI¹}¯S§ð „œš¹™h›.Ÿß¤o¬°µoÀ}Ì“ÙoçÑõ\ßô d.ã:.FPRXÅ^UcÙeSf¸daw[úSÒJ"@$4'Cî YüÞí¹ßCÒ¸ÅYºf°¨¡Úœ;š¤™,›¯ž>¤”«´´L¿:Ë;Øæ\ôêl“-°9E%OW8^õb²e^fød†a\ÓTËKEAc5t(®_ ÏýLïá”ÓéÆo»Q±Ò¨¢;ešŸ™èšCž•£Çª¸³)¾ÊáÖäéòtý/Å+y8D6NÍV£]’b…eaf9eïaÀ\›UÉLaB¡6Ê)Ñ Fÿ¼ð…ââÔ&ȼG²“©¬¢ –šš™°šÕø¢ù©À²½ÁÈŒÕ9ãrñ…Îo*B7îBAMV]/bKejfhe`bW]hV¾MzCÞ7+|Dº.òìã5ÖaÉœ½;³`ªE£ žÌš›™}šm^¢3©Ê±ø»ˆÇ:ÔÒáðŒþ b)6ÓAKL6Um\¼aeaf›eÆbì]1W«N–D9r,ݸ,¤óQåŽ×œÊº¾6´-«è£zž›¤™Mš È¡p¨Û°äºPÆêÒnà“îý¥ ùÈ'Ã4µ@OKeTË[IaÚdXfÇe%c€^ñWšO§EI:½-D %¥õ½æãØÝËÝ¿2µ¬¤ëžK›­™%š®œ9¡¯§ñ¯Ñ¹ÅžÑß&íŸû3 Žo&‚3‘?QJS [Õ`–dHfñezc_ªX†P¶Fy; /¥!“†ö(è>ÚÍÁ2¶Ú¬8¥fŸ›À™šVœ® ó¦ ¯Ã¸ìÃSЦݺë'ú %=2l>KI¸RtZW`Nd5ffÕc–_gYgQÄG§¦'®¹·ÀÂÏKÜGê¸øG¼±#û0?=HHØQÁYÙ_ýcf(f'd`ZFRÍHÓ=ž1c$orùþêúÜ«ÏXÃ<¸š®—¦l *œñ™Ë™³›§Ÿ¥I­³¶–ÁÁÍíÚÜèC÷ÒNS"²/<>GôPYO_®cüeCfpd˜`ÊZ$SÐIý>á2Â%Øz äúmì[ÞôЈÄG¹¯P§ô œšµ™k›-ŸÝ¤r¬­µrÀ|Ì’ÙqçÍõbÚö e.à:2F PRXÇ^ScÛeQf¸dat[ýSÐJ"@$4'Aî [üØíÂß=Ò»ÅWºg°¨¡Úœ;š¦™(›´ž8¤š«°´M¿;Ë9ØæXôík“-®9E%OW9^ôb³e]fød‡a\ÒTËKFAc5s(®^ ÑýLïá”ÓêÆn»S±Ð¨¢NI·RtZX`Md4ffÔc—_eYiQÁG«÷ÙGX"°/<>GõP YT_¨cf>fsd–`ËZ%SÎIÿ>à2Á%Úx æúlì[ÞõÐ…ÄK¹{¯T§ñ œš´™m›+Ÿß¤q¬¬µtÀzÌ”ÙoçÏõ`Û÷ b.ä:.FPQXÇ^ScÚeSf¶dar[þSÐJ"@$4'Cð Vüßí¹ßDÒ¸ÅXºg°¨€¡Üœ8š¨™(›´ž8¤š«¯´O¿9Ë;Øæ\ôêm‘-®9E#O’W6^÷b°e`föd‡a\ÎTÐKBAe5s(®] ÔýHï"áÓíÆn»R±Ñ¨¢7ðBBMV ](bSecfke`bV]jV¼MzCà7+€?¾,òìã8Ö\É ½8³bªE£ žÌš›™~šl_¢0©Î±ö»‰Ç9ÔÒáð‹þ c)6ÒAJL9Uj\¾ae_fŸeÂbî]0W­N“D9n,ß·-¤óPåךʽ¾3´/«ç£zž›£™LšÄ¡t¨Ø°åºPÆêÒnà“îý¤ ûÆ'Å4´@NKgTÉ[IaÜdVfÈe%c^òW™O©EE:Â-A %¦õ½æäØÜËÞ¿0µ¬Œ¤ïžH›°™"š±œ5¡³§ï¯Ñ¹ÅšÑ ß#í û2 m&…3?TJŽS"[Ô`•dIfïe~c_®X‚P·Fz; /¦!“†ö(è?ÚÍÁ-¶Þ¬5¥hŸ›À™šUœ® õ¦¯Æ¸ëÃSШݷë)ú¿$%@2g>QI³RwZU`Od5ffÕc•_hYgQÃG©ä2¾%Üv èújì]ÞòЊÄE¹¯N§õ œšµ™l›)Ÿã¤l¬³µnÀ}Ì’ÙqçÎõ`Üõ e.à:1F PSXÅ^TcÙeUf´dar[þSÏJ$@"4'Bï Vüáí·ßFÒµÅ[ºe°¨¡Üœ:š¦™)›³ž9¤™«°´N¿;Ë8Ø æXôíj”-®9E#O‘W9^ôb³e\fùd†a\ÑTÍKBAg5q(®` ÏýKï!áÓíÆm»Q±Ó¨¢=dšž™êšBž•£Èª¶³,¾þÉàÖ äçòuý-Ç+x8D8NÉV§]Žbˆeaf7eña¾\œUËL]B¦6Ä)Ñ Dÿ¿ðâæÔ!ȇ¼B²˜©¨¢¡–š›™®šØô¢ý©¾²½ÁÈŒÕ8ãuñˆÌp*B7íBCMV ]+bOegfieabU]kV»M|CÝ7+}Cº/òëã6Ö_ÉŸ½7³dªB£žÊš™{šo\¢4©Ê±ù»†Ç<ÔÐáðŒþ e)6ÐAML7Uk\½aeafeÃbî]0W¬N•D9p,à´0¢óPåיʾ¾3´.«é£vž›œ™SšË¡m¨ß°àºRÆêÒlà–îý¦ øÉ'Â4¶@MKiTÆ[Ma×dZfÆe%c€^ñW›O¥EK:»-F $¤õ»æäØÞËÜ¿1µ¬Œ¤ïžI›­™'š¬œ:¡®§ò¯Ð¹ Å™Ñß í¥û- “l&„3?RJS"[Ô`”dLfêe„c _³X~P»Fw; /¤!•‹ö$è@ÚÍÁ3¶Ù¬8¥gŸ›Á™þ™Yœ« ö¦ ¯Â¸ðÃNЬݳë-ú½%%B2e>SI²RvZX`Ld7f f×c”_iYfQÃGª=IH×QÂYØ_þcf+f%d`ZKRÉHÕ=ž1a$qpùëùܬÏVÃ?¸–®›¦j *œó™È™µ›§Ÿ¥I­²¶˜Á¾ÍñÚÙèC÷ÖHY"­/<=GõP YO_®cüeDfndš`ÈZ&SÏIý>â2Á%Ø{ âúpìYÞôЉÄF¹€¯O§ô €œšµ™k›*Ÿâ¤n¬±µnÀ}Ì“ÙpçÏõ_Û÷ c.ã:/FPQXÇ^ScÛeQf¹dax[ùSÒJ"@$4'Dì [üÜí»ßCÒ·ÅYºg° ¨‚¡Ùœ;š¥™+›°ž<¤—«±´M¿<Ë7Ø æWôík“-®9E#O’W6^øb®ebfõd‡a\ÐTÎKCAe5r(®_ ÏýNïá•ÓéÆo»R±Ð¨¢:gš™éšCž“£Ëª´³-¾üÉâÖŸäçòwù1Ä+y8 D2NÐV¡]“b„edf4eôa½\œUÊL_B¢6Ê)Ô BÿÀðâåÔ$ȃ¼E²•©ª¢¡–š™™²šÓù¢ú©¾²½¿ÈŽÕ7ãuñˆËq*B7ìBEMV ]*bPeefle^bV]jV½MzCß7+}Dº.òíã3ÖbÉœ½;³aªE£ žÎšš™~šm]¢3©Ë±ø»‡Ç:ÔÒáðþ e)6ÐAKL9Uj\¾ae_fžeÄbí]0W­N“D9n,à´2žóVåŠ×ʼ¾3´0«æ£zž›£™Mš Ç¡p¨Ü°âºQÆëÒlà•îý¦ ùÈ'Ä4³@PKfTÈ[MaÖd\fÄe'c~^òW›O¥EK:»-F #¦õºæèØÙËà¿/µ¬Œ¤ïžH›¯™%š­œ8¡±§ï¯Ó¹Å›Ñ ß!í¤û. “j&ˆ3‹?UJS#[Ò`˜dFfòe|c_­X„P¶F|; /¦!“‰ö$èBÚÍÁ1¶Ú¬8¥fŸ‘›¾™šUœ® ó¦ ¯Á¸ïÃPЩݷë)úÀ#%?2j>LI¹RqZ[`Jd8f fÖc–_fYiQÂG©æ2»%ßt èúlì[ÞôЇÄH¹¯P§ó œš·™j›+Ÿá¤o¬¯µqÀ|Ì“ÙpçÎõaÙú _.ç:*FPMXË^OcÝeRf¶dar[þSÐJ!@&4'Cï Vüáí·ßFÒµÅ[ºe°¨¡Þœ5š¬™#›·ž8¤™«°´N¿8Ë>Øæ_ôçn’-¯9E&OŽW;^òb´e]fùd…a\ÑTÍKDAe5q(¯^ ÑýKïá’ÓëÆo»Q±Ñ¨¢NI¶RuZV`Od4ffÔc—_fYhQÃG¨¦'®¹·ÁÂÏKÜGê·øJ¸µ#ø0A=EHÛQÀYØ_ÿcf+f'd`ZDRÏHÒ=ž1b$qsùýêûÜ«ÏWÃ=¸˜®š¦j *œó™É™´›§ŸŒ¥K­°¶šÁ½ÍðÚÚèC÷ÕJV"°/<=G÷P YS_©cf=fvd’`ÏZ SÔIù>å2¾%Ûx åúmìZÞöÐ…ÄJ¹|¯R§ó €œšµ™m›)Ÿá¤p¬­µsÀ{Ì’ÙrçÌõbÚ÷ c.â:0F PSXÅ^TcÚeSf¶daq[TÍJ%@#4'Gè _ü×íÀß@Ò¹ÅXºg° ¨‚¡Úœ:š§™'›µž8¤š«¯´O¿9Ë;ØæZôìj–-²9E&OW9^ôb³e\fùd‡a\ÔTÊKEAd5s(®_ ÏýMïá“ÓêÆo»Q±Ò¨¢7òB?MV]/bKekffecbS]lVºM~CÛ7+zE¹1òèã9Ö]Éž½<³]ªJ£žÎšœ™{šo\¢3©Ë±ù»†Ç;ÔÒáð‹þ a)6ÑALL9Uh\Âaeff˜eÇbë]3WªN•D9n,â³2žóUå‹×ʽ¾1´1«æ£yž ›Ÿ™Pš Ç¡p¨Ü°ãºOÆîÒgà›îý¨ ùÆ'Å4´@OKgTÈ[JaÚdXfÇe%c€^ðWœO¥EJ:½-D %¥õ»æçØÙËâ¿+µ¬Š¤ïžJ›¬™'š¬œ:¡®§ò¯Ñ¹ÅÑ ß$í¡û1 ‘l&„3?PJ”S[Ù`’dLfìec _°XP¸Fz; /¥!“ˆö&è?ÚÍÁ2¶Ú¬7¥hŸ›¿™šRœ± ò¦ ¯Ã¸ìÃSЦݺë'úÁ#%A2g>PI¶RsZY`Kd9f f×c”_hYgQÃGªGõP YS_ªcf@fqd˜`ÊZ#SÓIù>å2¾%Ûy ãúpìWÞøÐ…ÄH¹¯P§õ ~œšµ™l›,ŸÝ¤s¬«µuÀyÌ”ÙpçÍõbÚ÷ b.ä:.FPPXÇ^ScÛeQfºdav[üSÐJ#@#4'Cí ZüÜí¼ßBÒ¸ÅXºg°¨¡Úœ:š§™(›´ž9¤—«³´K¿=Ë8ØæZôëm‘-®9E$OW9^ôb´e[fúd…a\ÒTÌKCAf5p(±\ ÓýIï!á‘ÓìÆm»T±Ï¨¢;ešŸ™èšCž•£Çª·³+¾ÿÉàÖŸäçòvû0Ä+z8D5NÏV ]•b‚eef4eõa¹\¢UÃLfBž6Ë)Ò Fÿ¼ð…âáÔ'È€¼H²“©«¢¢“š™®šÖø¢ú©¾²½¿ÈÕ5ãwñþÿŽÅv*=7òB?MV]-bNegfieabU]jV¼M{CÞ7+|C».òëã7Ö^ÉŸ½8³cªC£ žËšœ™|šo[¢4©Ë±ø»ˆÇ9ÔÒáðþ d)6ÑALL8Uj\¾aebfšeÇbê]4WªN”D9o,ß·-£óRåלʻ¾5´-«ê£wž ›£™LšÆ¡p¨Ü°âºRÆéÒnà”îý§ øÈ'Ä4³@QKeTÉ[KaØd[fÄe'c^ðWO£EL:»-G !¨õ¼æçØÚËÞ¿1µ¬¤ížI›®™%š®œ8¡°§ñ¯Ñ¹ÅšÑ ß#í¢û/ ‘l&†3?PJ‘S[Ö`•dIfîe€c _°X‚P¶F|; /§!“ˆö&èAÚÍÁ/¶Ü¬7¥gŸ›¾™šTœ® õ¦ ¯Ã¸îÃPЪݶë*ú¿$%?2i>NI·RsZY`Ld5ffÔc—_fYgQÄG¨¦(®¸·ÂÂÏKÜIêµøK·´#ü0<=IHÙQ¿YÜ_úc f)f'd`ZIRÊH×=™1g$loùëùܬÏWÃ<¸š®˜¦k +œð™Ì™±›ªŸ‹¥J­²¶—ÁÀÍîÚÛèC÷ÔLT"±/<=G÷P YT_ªcÿeAfqd—`ËZ$SÏIÿ>ß2Ã%×| áúqìWÞöЇÄG¹€¯O§ô œš¶™j›-ŸÝ¤s¬¬µsÀ{Ì’ÙqçÎõ`Üõ d.â:0F PSXÅ^UcØeUfµdat[üSÑJ"@%4'Fë ZüÞí¹ßEÒµÅ[ºe°¨‚¡Ùœ<š¥™(›µž7¤œ«­´P¿9Ë;Øæ[ôël”-±9E$O’W6^÷b°e`föd‡a\ÐTÏKAAf5r(¯^ ÐýLïá”ÓéÆq»N±Õ¨¢@`𢙿šEž”£Çª·³,¾üÉäÖ›äëòsý.Ç+w8 D4NÏV¢]“b‚eef5eôa»\žUÈL`B¥6Ä)Î Hÿ»ð„âäÔ$ȃ¼D²–©ª¢¡–š™™°š×õ¢ý©¼²½ÁÈŒÕ8ãtñ‰Ëp*B7íBDMV]-bMeifgebbU]jV¼M{CÝ7+zDº0òéã9Ö[É¢½6³eªB£ žÍšš™~šm\¢5©É±ú»†Ç:ÔÒáð‹þ a)6ÓAKL7Ul\¾aedf™eÇbì]1W¬N”D9p,ßµ1ŸóTåךʿ¾0´2«ä£~ž›¥™Lš È¡p¨Ú°åºNÆíÒkà•îý¥ ùÈ'Ä4³@PKfTÈ[MaÖd\fÃe(c}^ôW™O¦EJ:¼-E %£õ·æêØØËß¿1µ¬¤ëžL›¬™&š®œ7¡±§ð¯Ò¹ÅÑ ß$í¡û0 ’k&†3?TJŽS"[Ó`–dIfðe|c_¬X„P¶F{; /¨!‘†ö&èAÚÍÁ1¶Ù¬9¥fŸ‘›½™šRœ± ñ¦¯¿¸òÃLЮݱë0ú¹)%A2h>PI´RwZT`Pd4ffÕc”_iYfQÄG¨=GHÚQ¿YÚ_þcf,f$d`ZJRÉH×=›1e$mqùþêúܬÏVÃ?¸—®™¦k *œò™Ê™³›¨ŸŒ¥J­²¶—Á¿ÍðÚÙèE÷ÒLV"¯/<=GõP YP_¬cÿe@fsd•`ÌZ"SÓIù>ç2»%Þv æúmìZÞöІÄI¹}¯R§ò œšµ™l›*Ÿá¤o¬¯µpÀ~ÌÙsçÍõ_ßñ g.â:-FPLXÊ^RcÙeVf³daq[ÿSÎJ%@!4'?ñ Vüàí¹ßDÒµÅ[ºf°¨¡Úœ;š¥™*›³ž8¤›«­´Q¿7Ë=Øæ^ôèn’-°9E%O‘W7^öb²e]fùd„a\ÏTÎKBAf5r(®_ ÐýLïá‘ÓíÆl»T±Ð¨¢;fšœ™ìšAž”£Êª³³/¾üÉáÖŸäèòtý.Æ+z8D8NËV¥]b…edf5eóa¼\žUÈL`B¤6Æ)Î Hÿ»ð…âãÔ#Ȇ¼A²™©©¢Ÿ˜š˜™²šÕ÷¢ù©Á²½ÁÈŽÕ4ãzñüÿÈr*B7ìBEMV ]+bMejfeedbS]lV»M|CÜ7+zE¹0òêã7Ö^Éž½:³`ªG£ žÏš˜™šm]¢3©Ë±ø»‡Ç<ÔÎá ð…þ ]!)6ÑANL5Um\¼aeafœeÅbì]2W«N”D9n,á´0¢óPåטÊÁ¾.´4«ã£|ž›¡™Oš È¡o¨Ü°âºSÆçÒqàîý£ ûÆ'Æ4²@PKfTÉ[KaØd[fÃe*cz^öW˜O§EJ:»-G "§õ¼ææØÚËà¿.µ¬Œ¤îžK›«™(š«œ:¡°§ï¯Ó¹ÅœÑ ß$íŸû3 m&†3Œ?TJŽS"[Ô`•dKfìec _®X„P´F~;/§!’ˆö&è@ÚÍÁ/¶Ü¬6¥hŸ›¾™šUœ® ô¦ ¯¿¸òÃMЭݳë-ú»'%A2h>OIµRuZW`Nd6f fØc’_jYgQÂGªã2À%Ûv èújì\ÞõІÄI¹~¯P§ô œš³™n›(Ÿã¤m¬°µqÀzÌ–ÙmçÑõ^Ýô f.à:1FPQXÈ^PcÝeQf¸dar[þSÐJ"@$4'Dí YüÞí¹ßEÒµÅ\ºc°¨}¡Ýœ:š¥™*›²ž:¤˜«±´N¿9Ë;Øæ\ôëk”-±9E#O’W7^õb²e^f÷dˆa\ÒTÍKBAg5q(®` ÍýPïá“ÓìÆk»W±Ì¨¢:fš™ëš@ž—£Çª¶³,¾þÉàÖ äæòwú1Ã+{8D4NÐVŸ]–beff4eóa¼\žUÈL`B¤6Æ)Í Jÿ¹ð‡ââÔ#È…¼C²˜©¨¢¢”šœ™¯šÖ÷¢ú©¿²½¾ÈÕ3ãyñþÿÆu*>7ðBBMV ]*bPeffje_bW]iV¼M~CÙ7!+wH·1òéã8Ö^Éž½:³`ªG£ žÍšš™~šl`¢0©Í±ö»ˆÇ<ÔÏáðŒþ e)6ÔAIL9Uj\¿aedf™eÆbî].W°ND9n,߸,¥óNå‘טÊÀ¾0´0«é£wž ›Ÿ™Pš È¡p¨Ú°åºOÆìÒlà”îý¤ ûÅ'Ç4±@QKfTÈ[KaÚdVfÊe"c‚^ïWO¤EJ:½-D %¦õ¾æãØÞËÜ¿1µ¬Ž¤ížJ›­™$š°œ7¡°§ñ¯Ð¹ÅœÑ ß$í¢û. ”j&†3?PJ‘S [Õ`•dJfíe€c _¯X‚P¸Fy; /¦!’‡ö'è?ÚÍÁ1¶Û¬6¥jŸŒ›Â™ÿ™Wœ­ õ¦¯Ç¸êÃSЩݳë0ú¹(%@2j>MI¸RqZZ`Md5ffÔc•_iYfQÄG§¸˜®™¦k )œõ™Å™¸›¥Ÿ¥K­°¶˜ÁÁÍìÚÞè?÷ØHX"®/<å2½%Ûy äúnìZÞôЇÄI¹}¯R§ñ ƒœš·™j›+Ÿâ¤n¬°µpÀ|Ì“ÙpçÏõ`Ûõ e.á:2F PSXÆ^TcÚeRf·das[þSÎJ$@$4'Eë \üÚí¾ßAÒ·Å[ºd°¨€¡Úœ;š¦™(›µž7¤›«®´P¿8Ë<Øæ]ôèo‘-®9E$O‘W8^ôb³e]fùd„a\ÍTÑK@Ag5q(¯_ ÎýNïá•ÓéÆo»Q±Ñ¨¢;ešž™éšBž—£Åª¸³+¾þÉâÖäèòvû0Å+x8 D4NÏV¡]”b‚eef5eôa»\žUÈL`B¤6Ç)Ð Fÿ½ð„âäÔ#ȃ¼E²—©©¢¡”š™­šÙó¢þ©½²½¿ÈŽÕ7ãuñˆÊs*?7ðBAMV ]+bPeefke_bV]kV»M|CÝ7+}B»/òêã8Ö]ÉŸ½9³aªF£ žËš™{šo]¢2©Ì±÷»ˆÇ:ÔÒáðŠþ `!)6ÕAIL8Uk\¾aedf™eÅbí]1W¬N”D9o,á´/¢óRåŽ×›Ê¼¾3´0«ç£yž ›Ÿ™RšÉ¡q¨Ø°èºLÆíÒkà–îý¦ úÄ'É4°@QKgTÆ[NaÖd\fÄe&c€^ðWO¤EJ:½-D %¥õ¹æèØÙËà¿0µ¬Œ¤ïžI›®™%š®œ7¡²§î¯Ó¹ÅšÑß!í¢û1 o&ƒ3?PJ‘S [Õ`”dLfëe‚c _°XƒP¶F{; /§!“…ö)è=Ú ÍÁ/¶Þ¬3¥kŸ›À™šTœ® õ¦ ¯Å¸íÃOЬݳë.ú¼%%@2i>NI·RsZX`Nd4ffÒc—_gYgQÅG§¦(®¸·ÁÂÏLÜFê¸øHº³#ü0:=MHÔQÅYÕ_df*f(d`ZFRÌHÔ=1c$qsùüêýÜ©ÏYÃ<¸˜®›¦g /œí™Í™²›§Ÿ¥G­³¶˜Á½ÍóÚÖèG÷ÒKW"®/<;GöP YQ_­cýeBfpd˜`ËZ"SÒIû>ã2À%Ùz ãúoìYÞõЇÄH¹~¯R§ò €œš¶™l›*Ÿà¤p¬¯µqÀ|Ì‘ÙrçÍõaÜô f.à:0FPPXÈ^ScÚeRf·das[ÿSÍJ$@#4'Bï WüÞí»ßCÒ·ÅZºe°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë<Øæ[ôìj”-²9E(OŽW8^øb®eaföd†a\ÑTÌKEAb5u(¬a ÎýMïáÓïÆj»V±Î¨¢=dšŸ™èšCž”£Êª´³-¾ýÉáÖ äæòwú0Å+z8D:NÇVª]Œb‡ecf5eôa¼\œUÊL^B¦6Å)Ð Eÿ¾ðƒâåÔ"È…¼C²—©ª¢ —š˜™´šÒø¢ü©¼²½¾ÈŽÕ7ãuñŠÈt*@7îBCMV ],bNehfheabU]kV»M}CÛ7+{Dº/òëã6Ö^É ½7³eªA£žËš›™~šl^¢3©Ê±ù»†Ç;ÔÒáðŽþ c)6ÖAHL9Uk\¾aecfšeÅbï]-W°N‘D9o,ß¶/¡óTå‹×ʼ¾3´/«ç£zž ›¡™Oš È¡q¨Ù°çºLÆîÒjà–îý¥ ùÇ'Å4´@NKiTÄ[Oa×dYfÇe$c€^óW—OªEF:¿-D $¥õ¹æçØÜËÜ¿2µ¬¤ëžM›ª™(š«œ;¡­§ô¯Î¹ ÅšÑ ß"í¢û0 ‘m&ƒ3‘?OJ“S[×`”dJfïe|c_ªX†P¶Fx;/£!•ˆö%èBÚÍÁ.¶Þ¬3¥mŸŠ›Ã™ÿ™Vœ® ô¦ ¯Â¸ïÃOЫݴë-ú¼&%@2j>MI·RsZY`Ld7ffÕc–_gYgQÄG§ß2Ä%Ö| áúrìUÞúЃÄK¹|¯R§ò ‚œš¶™k›+Ÿà¤q¬­µsÀyÌ•ÙpçÎõ`Ûõ g.ß:1F PRXÇ^ScÚeRf¹dax[øSÕJ@'4'Fë [üÛí¼ßDÒµÅ\ºc°¨~¡Ýœ8š§™)›³ž8¤›«®´P¿9Ë:Øæ\ôêm‘-¯9E#O’W5^ùb­edfòdŠa\ÑTÍKDAd5t(¬` ÏýMïá‘ÓìÆn»R±Ñ¨¢=dšŸ™èšCž”£Êª³³0¾úÉãÖäêòsþ-Æ+z8D9NÊV¤]“behf0eøa¹\ŸUÈL_B¥6Æ)Ñ Eÿ¾ðƒâãÔ$È„¼D²–©ª¢Ÿ˜š™™°š×ô¢ý©¾²½ÂÈŒÕ6ãxñýÿÈr*A7íBEMV ]*bPeefle\b[]fV¾MzCß7+@¼0òçã<ÖXÉ¥½4³eªB£žÉšŸ™zšo]¢2©Ì±ø»†Ç<ÔÐáð‰þ b)6ÐAML6Uk\¾aecf™eÅbï].W°ND9p,Þ·.£óPåטÊÀ¾1´0«ç£yž ›¢™Nš Æ¡q¨Û°äºPÆêÒmà”îý¥ ùÈ'Ã4µ@NKhTÇ[LaÙdXfÈe#c^ñWšO¨EG:¿-C %¥õ¼æåØÜËÝ¿2µ¬¤ïžG›°™%š­œ9¡¯§ð¯Ô¹ÅžÑ ß%í û2 n&„3?QJ‘S [Õ`”dKfíe€c _®X„PµF|; /§!’†ö(è?ÚÍÁ,¶ß¬5¥hŸ‘›»™šQœ± ó¦ ¯Â¸ïÃPЩݷë*ú½(%C2g>OI¶RtZX`Md6ffÕc—_fYhQÂG©=GHÚQÀYÙ_ÿcf.f#d`ZIRÉHØ=™1g$lqùþêûÜ©ÏZÃ;¸š®˜¦k )œô™È™µ›¦ŸŽ¥G­µ¶•ÁÁÍîÚÛèB÷ÕJW"¯/<;GöP YR_«cf>fsd—`ÊZ%SÏIü>ã2¿%Ûx äúnìZÞõІÄI¹~¯Q§ó €œš¶™j›-ŸÞ¤r¬­µqÀ|Ì“ÙpçÏõ_Üõ e.á:0FPQXÇ^ScÛeRf·dat[þSÏJ#@#4'Að VüàíºßBÒ¸ÅYºe°¨{¡àœ6š¨™)›²ž:¤™«°´M¿<Ë7Ø æXôìl‘-­9E$O‘W7^÷b°e^fúdƒa\ÏTÎKCAe5r(¯^ ÑýJï!á‘ÓìÆn»Q±Ò¨¢=cš ™çšDž”£Éª´³.¾ûÉäÖäèòvú1Ä+y8 D3NÐV ]•beff4eóa¾\›UÊL_B¤6Æ)Í Jÿ¹ð†âãÔ"ȇ¼B²–©«¢Ÿ—š›™®šØó¢ª¹²½¼ÈÕ7ãuñ‰Êr*A7íBDMV].bKekffebbU]kVºM~CÛ7+xG·2òéã7Ö^ÉŸ½9³bªD£ žÌš›™}šn\¢5©È±û»…Ç<ÔÐáð‰þ b)6ÐAML6Ul\¾aebfœeÃbð]-W°ND9l,ã²2ŸóTåכʼ¾4´.«é£xž ›¢™Nš É¡n¨Ý°âºQÆêÒnà’îý¢ ýÃ'È4±@QKfTÇ[NaÖd[fÄe'c^òWšO¥EL:º-H !¦õ¹æéØØËà¿.µ¬‰¤òžF›¯™&š¬œ:¡¯§ñ¯Ñ¹ÅœÑ ß$íŸû4 p&ƒ3Ž?SJS![Õ`”dJfîec_®X‚P¸Fy; /§!‘†ö&èAÚÍÁ/¶Ü¬7¥fŸ‘›½™šRœ² ð¦¯À¸ïÃQЩݶë*ú¿#%:2o>HI½RnZ\`Jd8ffÕc•_iYeQÅG§=GHÙQÂY×_ÿcf+f&d`ZIRÌHÒ= 1a$poùëùܬÏXÃ;¸›®–¦m (œõ™Æ™·›¥ŸŽ¥I­²¶–ÁÃÍëÚÝèA÷ÖJV"¯/<å2¾%Ûx åúmìZÞöЄÄL¹z¯T§ñ œš·™j›,Ÿß¤p¬¯µqÀ|Ì’ÙqçÎõ`Üõ d.â:0F PRXÇ^RcÜeQf·das[þSÏJ#@#4'Eì YüÞíºßCÒ¸ÅXºh° ¨¡Úœ;š¦™(›´ž8¤š«°´L¿=Ë7Øæ[ôèp-­9E!O•W5^÷b°e^fùd…a\ÏTÍKEAc5t(­_ ÐýLïá’ÓìÆl»T±Ð¨¢>bš¡™çšCž”£Êª´³.¾üÉáÖŸäéòsþ-Ç+y8D8NÊV¦]b„eff1eøa¸\ UÆLcBŸ6Í)Ô Eÿ¼ð†âáÔ%ȃ¼E²–©©¢¢“šž™¬šÙõ¢ú©Á²½ÃÈ‹Õ8ãuñŠÈt*?7ðBAMV],bNehfhebbT]kV¼M{CÞ7+A¼.òéã9Ö^ɽ<³^ªG£ žÌšœ™|šm_¢1©Ì±÷»ˆÇ;ÔÑáðŠþ b)6ÒALL6Ul\¾aedf˜eÇbì]1W¬N”D9o,á³1¡óQåטÊÀ¾0´1«ç£xž ›Ÿ™Qš É¡o¨Û°äºPÆëÒlà•îý§ úÅ'Ç4±@QKfTÉ[IaÜdUfÊe#c€^òW™O§EI:¾-B ( õ·æéØØËá¿.µ¬Œ¤îžJ›­™%š®œ8¡°§ò¯Î¹!Å™Ñ ß$ížû5 Œq&3‘?PJ’S[Õ`”dKfíec_­XƒP·Fy; /¤!•Šö%èAÚÍÁ.¶Ü¬7¥gŸ‘›¾™šUœ® õ¦ ¯Ã¸îÃOЫݶë)úÁ!%>2j>LIºRpZ[`Jd8f fØc“_iYeQÆG¦¸–®œ¦h +œò™É™´›©Ÿ‰¥N­¬¶Á½ÍîÚÝè@÷ÖKT"³/<=GöP YQ_­cýe@ftd•`ÌZ#SÑIû>ä2¿%Ûx äúoìWÞúÐÄN¹y¯T§ò €œš´™m›)Ÿã¤l¬²µoÀ}Ì’ÙqçÍõbÙø b.ã:/FPPXÈ^QcÝeQf·dap[TËJ&@"4'Eê \üÚí¿ß?Ò»ÅUºk° ¨ƒ¡Ùœ;š¦™*›±ž:¤™«¯´P¿8Ë<Øæ_ôæqŽ-«9 E"O’W8^ôb³e]fùd…a\ÑTÍKCAf5r(­` ÎýNïáÓîÆk»U±Ï¨¢;gš›™ìš@ž—£Çª¶³,¾þÉáÖŸäçòwù3À+8D7NÎV¡]”bƒecf7eña¾\œUÊL^B¥6Å)Í Iÿ»ð…ââÔ%È‚¼G²”©ª¢¢”š›™°šÕø¢ú©¿²½ÁÈŒÕ9ãtñ‰Ëq*B7ìBEMV ]*bQedfme\bY]hV¼M}CÜ7+{D»-òìã7Ö]É¡½6³dªC£ žËšœ™}šm^¢2©Ë±ù»†Ç<ÔÐáðþ f)6ÔAGLNI·RsZY`Ld7f f×c”_iYfQÃG©¦)®¶·ÄÂÏMÜGê·øJ¶·#ø0@=GHØQÂYØ_þcf*f&d`ZHRËHÕ=œ1e$moùëøÜ­ÏVÃ=¸š®—¦l )œó™É™´›§Ÿ¥J­±¶—ÁÁÍîÚÛèC÷ÔJX"®/<@GòPYQ_«cþeCfod™`ÊZ"SÓIú>ä2¿%Ûw çúkì[ÞõІÄI¹~¯Q§ò œš·™k›+Ÿà¤o¬°µoÀÌÙuçÈõf×ù b.â:1F PTXÄ^TcÛeRf·dat[üSÒJ @&4'Eë [üÛí½ßBÒ¸ÅYºe°¨€¡Ýœ7š©™&›¶ž7¤š«°´M¿<Ë9Øæ]ôém“-±9E(OW:^õb°eafõd‡a\ÏTÐK@Ag5q(¯_ ÏýLï áÓíÆm»S±Ï¨¢7jšš™ìšAž•£Éª´³/¾ûÉâÖ ääòzø1Å+x8 D4NÎV£]’b„ecf6eóa¼\žUÇLbB¢6È)Ñ Fÿ¼ð…ââÔ%ȃ¼D²—©¨¢£“š™®š×ö¢û©¾²½ÁÈÕ7ãuñÿÿÆw*<7ñB@MV]-bNeffle\bY]hV½M}CÚ7+yG·2òèã8Ö^Éž½;³_ªG£ žÌš™{šo]¢1©Î±õ»ŠÇ9ÔÑáð‰þ b)6ÒAJL:Uh\Áaecf›eÅbí]1W«N”D9k,ä±3ŸóTåŒ×œÊ½¾1´2«ä£}ž›£™Mš Æ¡r¨Ø°æºOÆìÒlà“îý¤ üÄ'È4°@RKeTÉ[KaÙdYfÆe&c~^óW™O§EI:½-E $¤õºæèØÙËà¿-µ¬‹¤ïžH›®™'š«œ;¡­§ò¯Ò¹ÅœÑ ß#í¡û2 l&…3Ž?RJ‘S[Ö`”dJfîe~c_¬X…P´F|; /¥!–‹ö#èCÚÍÁ.¶Ý¬6¥hŸ›¿™šSœ² ï¦¯¾¸ñÃOЪݵë,ú¼'%?2j>MI¸RsZW`Od3ffÓc–_hYfQÅG¦¸˜®˜¦l *œñ™Ë™³›¦Ÿ¥E­¶¶”ÁÂÍíÚÜèC÷ÒMU"¯/<8GúPYU_©cf?fsd–`ÌZ"SÑIý>á2Â%Øy æúlì[ÞõІÄI¹}¯R§ò ‚œš·™j›-ŸÝ¤s¬­µpÀÌÙtçËõbÛö d.â:.FPPXÈ^RcÛeRf·dau[ûSÔJ@'4'Eí ZüÛí½ßBÒ·ÅZºf° ¨ƒ¡Øœ<š¦™'›µž8¤™«²´J¿>Ë7ØæZôëk•-°9E$O‘W8^õb±e_fød…a\ÐTÎKCAe5q(°] ÒýJï á’ÓëÆn»R±Ñ¨¢>cšž™êšAž—£Çªµ³-¾ýÉâÖžäçòvü.Ç+v8 D2NÑVŸ]•begf3eôa¼\UÉL_B¤6È)Ñ Eÿ½ð…âãÔ#È…¼C²˜©§¢£”šœ™¯šÕø¢ú©¾²½¼È“Õ2ãxñˆÌq*A7îBCMV]&bTebfme^bW]jV»M}CÜ7+{E¹0òéã8Ö^Éž½:³`ªG£ žÎ𙙀šk^¢3©Ê±ù»‡Ç:ÔÓáðŽþ e)6ÓAKL8Uk\¾aedfšeÅbî]/W­N”D9o,á³1¡óRåŽ×™ÊÀ¾/´3«å£zž ›¡™Nš Ç¡q¨Ú°äºPÆëÒlà•îý¥ úÆ'Å4´@OKgTÇ[LaÙdXfÈe#c‚^ðWšO¨EG:¿-D #§õ¼æåØÛËß¿0µ¬¤îžI›¯™$š®œ8¡°§ñ¯Ñ¹ÅœÑ ß'íû5 o&ƒ3?PJ’S[Õ`•dJfíec _°XƒPµF~;/©!‘‡ö&è?ÚÍÁ1¶Û¬5¥jŸŽ›À™šTœ¯ ô¦ ¯Å¸ëÃSЧݸë)úÁ!%<2l>LI¸RsZX`Nd3ffÐcš_eYhQÃG¨â2¾%Ýv æúnìWÞùЄÄI¹~¯P§ô œš·™k›+Ÿá¤m¬²µnÀÌÙtçËõcØù a.å:-FPPXÈ^RcÛeRf·daq[TÍJ$@%4'Gê \üÛí¼ßCÒ¶Å[ºd°¨€¡Úœ;š¦™'›¶ž6¤›«±´K¿=Ë7Ø æYôíi•-°9E#O“W4^ùb°e^fùdƒa\ÎTÏKBAe5r(¯^ ÑýLïá”ÓêÆo»R±Ñ¨¢?a𢙿šDž•£Çª·³+¾ÿÉàÖŸäèòuü/Å+z8D5NÍV¤]‘b…ebf7eòa½\œUËL]B¦6Æ)Ó Cÿ¿ð‚âåÔ#ȃ¼F²•©©¢£’šž™®šÖö¢ý©¼²½¾ÈÕ3ã{ñûÿŽÇs*A7íBDMV].bKekffebbU]jV½M{CÝ7+}A¾,òìã6Ö_ɽ;³`ªE£ žÌš›™}šm]¢4©É±û»„Ç=ÔÏáð‡þ _)6ÎAPL3Uo\»ae`fœeÄbî]0W¬N•D9p,ßµ1ŸóUåŠ×žÊ»¾3´0«æ£{ž›¢™Oš É¡o¨Û°äºPÆëÒmà“îý¥ úÇ'Ä4´@OKgTÈ[JaÜdUfÊe!cƒ^ðW›O¦EI:½-E #¦õºæèØØËá¿-µ¬Š¤ñžF›°™$š®œ:¡¬§ô¯Ï¹ Å›Ñ ß%íŸû3 k&ˆ3‹?TJS![Ô`–dIfîec _°XP¸Fy; /¥!“ˆö%èAÚÍÁ.¶Þ¬3¥jŸ›¿™šTœ® ö¦¯Æ¸êÃTЧݷë+ú½'%B2h>NI·RsZY`Ld6ffÕc–_fYjQÀG¬ä2¾%Ûy äúnìYÞöІÄJ¹{¯U§ï ƒœšµ™m›)Ÿâ¤n¬¯µrÀ{Ì”ÙoçÎõaÛö e.à:1F PRXÇ^ScÚeSf·dat[ýSÐJ"@%4'Eì ZüÜí¼ßBÒ¸ÅYºf°¨¡Úœ;š¥™*›²ž:¤˜«±´M¿;Ë9ØæXôík”-®9E$O‘W9^òbµe\fødˆa\ÔTÊKEAd5s(®^ ÑýJï"áŽÓïÆk»T±Ð¨¢;fš™ëš@ž–£Èª¶³,¾þÉßÖ¢äåòvý-Ç+x8D5NÎV¡]•begf1e÷a¹\¡UÆLaB£6Æ)Ï Gÿ¼ð„âãÔ$È…¼B²™©§¢¡—šš™°šÖõ¢ü©¿²½ÂÈ‹Õ8ãuñŠÉr*B7ìBFMV ](bQegfheabU]kV»M}CÛ7+{E¸1òèã9Ö^Éž½9³bªD£ žËš›™~šl_¢1©Í±ö»‰Ç9ÔÓáðŽþ f)6ÑAKL9Uj\¾aebfœeÄbí]0W®N‘D9i,æ¯5óWåˆ× Ê¸¾7´-«é£xž ›Ÿ™RšË¡m¨Ü°äºPÆëÒlà”îý¥ ùÈ'Ã4µ@NKiTÅ[Na×dZfÆe&c~^óW™O§EJ:»-G !¨õ»æçØÚËß¿/µ¬¤ïžH›®™%š®œ8¡±§ï¯Ò¹Å›Ñ ß%ížû5 Œp&ƒ3?RJS [Ö`“dLfëe‚c _±X€P¹Fx; /¦!’‡ö&è@ÚÍÁ1¶Û¬6¥iŸŽ›À™šTœ° ò¦¯¾¸òÃMЭݲë.ú¼%%;2o>HI½RmZ^`Hd9ffÔc˜_eYhQÄG§¸—®›¦h -œñ™É™µ›¦ŸŽ¥I­²¶—ÁÀÍíÚÝèB÷ÕJV"¯/<:GùPYU_©cÿeBfpd™`ÉZ$SÐIþ>á2Á%Úw æúnìWÞûÐÄO¹y¯T§ò €œš¶™j›-ŸÞ¤q¬®µqÀ|Ì“ÙoçÐõ_Üö b.æ:*FPOXÇ^TcÙeSf·dau[ûSÒJ @&4'Eë [üÜí»ßDÒ¶ÅZºf° ¨‚¡Ûœ8š©™&›µž9¤˜«°´O¿:Ë9ØæYôík“-¯9E$O‘W9^ób´e\fødˆa\ÒTÍKCAe5s(­` ÎýOïá”ÓêÆo»Q±Ò¨¢OI·RrZY`Md5ffÔc–_hYfQÄG©ß2Ã%×{ äúnìXÞøÐƒÄK¹}¯Q§ô ~œš´™m›)Ÿâ¤n¬°µpÀ|Ì’ÙsçÊõdÙö e.á:0FPQXÇ^ScÚeTfµdas[üSÓJ@'4'Eí Xüßí¹ßDÒ·ÅYºg° ¨‚¡Ùœ<š¥™)›³ž9¤™«±´L¿=Ë7Øæ\ôén’-¯9E#O’W6^÷b°e`föd†a\ÎTÐKBAc5w(¨e ËýOïá”ÓéÆp»P±Ò¨¢;fš™éšCž”£Êª´³-¾þÉàÖŸäèòuü0Ã+{8D6NÎV¡]•beff3eõa»\ŸUÇLaB¢6É)Ò Eÿ½ð„âãÔ$È„¼C²˜©¨¢¢•šš™²šÓø¢û©¾²½¿ÈŽÕ6ãwñÿÿ‹Èu*<7ôB=MV]*bQeefke^bW]jV¼M{CÞ7+Bº/òëã6Ö`ɽ:³aªE£ žËš™zšp\¢3©Ë±ø»†Ç=ÔÎáðˆþ `)6ÒALL8Ui\ÀaecfšeÅbî]0W¬N”D9r,ݸ-£óPåיʿ¾1´0«ç£zž›¢™Oš Ì¡k¨ß°áºQÆëÒlà•îý¦ ùÇ'Å4³@OKhTÅ[PaÔd\fÅe%c€^òW™O§EJ:¼-E $¥õ¹æèØÙËà¿/µ¬¤ížL›ª™)šªœ;¡¯§ð¯Ó¹ÅŸÑß&í û1 n&ƒ3?QJS![Ô`•dJfîec_­X…PµF|; /¦!“‰ö$èAÚÍÁ0¶Ü¬5¥jŸŽ›¾™šRœ± ò¦ ¯Á¸ñÃMЬݴë,ú¾%%A2h>NI¸RrZY`Md5ff×c“_iYfQÃGªà2À%Ûx åúnìYÞõЈÄF¹¯N§ö ~œšµ™l›+Ÿà¤o¬°µoÀÌŽÙuçËõbÚö d.â:0F PSXÅ^TcÚeSf·dav[úSÔJ@(4'Gì Xüßí¹ßDÒ¸ÅXºe°¨~¡Ýœ9š¥™,›®ž?¤”«³´M¿:Ë:ØæYôíj•-¯9E"O”W5^÷b°e_fød…a\ÏTÐK@Ah5p(¯_ ÏýMïá‘ÓîÆi»W±Î¨¢=aš¢™çšCž–£Çªµ³.¾ûÉäÖœäêòsý/Ä+{8D7NËV¥]b†ecf5eôaº\ UÆLcB 6Ê)Ó Eÿ¼ð…ââÔ%È„¼C²—©ª¢Ÿ˜š˜™³šÓø¢ú©¿²½ÁÈ‹Õ8ãvñŠÉr*B7ìBEMV ](bRedfle^bV]lV¹MCÚ7+{D»-òìã7Ö]É¡½6³cªE£ žÍš›™{šp[¢5©Ê±÷»ˆÇ;ÔÑáð‹þ c)6ÓAKL7Ul\½aebf›eÄbî]1W«N”D9l,ä±2 óTå‹×ʼ¾2´2«ä£|ž›¢™Nš Å¡r¨Ú°ãºRÆéÒmà•îý¦ úÅ'Ç4²@OKhTÇ[LaÙdWfÉe"cƒ^ïWœO¥EJ:½-E #¦õ½æãØÞËÛ¿2µ¬Ž¤ëžN›¨™*šªœ;¡¯§ð¯Ñ¹Å›Ñ ß#í û3 Žo&ƒ3?RJS [Õ`”dJfðe|c_ªX‡P³F~;/¨!’ˆö%èAÚÍÁ2¶Ù¬9¥gŸ›¿™šUœ­ ö¦¯Æ¸ëÃRЩݵë-ú¼%%>2k>LI¸RrZ[`Id:f fÙc“_iYgQÂGªå2¼%Þu çúnìWÞøÐ„ÄK¹|¯S§ñ œš´™m›*Ÿà¤p¬®µrÀzÌ•ÙnçÐõ_Üö b.æ:+FPOXÇ^TcÚeSf¶daq[TÎJ$@#4'Eê ^üØí¾ßBÒ·ÅZºe°¨}¡àœ5šª™&›µž8¤™«±´L¿<Ë9Øæ[ôëk•-°9E#O“W6^öb±e^fød†a\ÑTÌKEAc5t(­_ ÐýLï áÓîÆk»T±Ñ¨¢>cšŸ™éšBž•£Éª´³.¾üÉâÖŸäæòwû/Å+y8D5NÎV¡]”b‚eff3eõa»\ŸUÅLdBŸ6Ì)Ñ Fÿ¼ð„âåÔ È‰¼?²›©¦¢¢–š™™²šÔø¢ú©¾²½¿ÈŽÕ7ãtñˆÉt*>7ñBAMV ]+bNeiffecbT]jV½MzCß7+~B»/òéã:ÖZɤ½3³gª@£žÊšœ™}šm]¢4©É±ú»†Ç;ÔÑáð‹þ b)6ÐAML6Ul\½aeafœeÄbí]1W­N’D9n,á´/£óQåŽ×›Ê¼¾4´.«é£wž › ™Pš Ê¡m¨ß°àºSÆèÒnà•îý¨ ÷È'Ä4´@NKjTÄ[OaÕd\fÄe(c}^óW™O§EI:¾-D #§õ¾æäØÜËÞ¿/µ¬Ž¤ìžL›«™'š¬œ;¡¬§ö¯Ë¹#Å™Ñ ß&íû4 m&…3?PJ’S[Õ`–dIfîec_®XƒP¶F|;/¨!’ˆö%èAÚÍÁ-¶à¬1¥nŸŠ›Á™šRœ± ò¦ ¯Â¸ïÃOЫݴë.úº)%B2i>LIºRoZ]`Id7ffÓc˜_fYgQÄG¨GöP YR_«cþeCfndš`ÉZ$SÑIû>ä2¾%Ûx åúoìWÞøÐ„ÄK¹|¯R§ò ‚œšµ™l›*Ÿâ¤n¬°µoÀ~Ì‘ÙqçÐõ\àò f.â:.FPPXÈ^RcÜePf¹dau[üSÑJ!@&4'Gê \üÛí¼ßCÒ¶Å[ºd°¨€¡Ûœ:š¦™)›³ž9¤™«°´O¿8Ë<Øæ[ôëk•-±9E(OW<^ñbµe[fûd„a\ÐTÎKBAg5p(°] ÒýIï#áŽÓîÆl»T±Ï¨¢9gšž™èšDž”£Èª¶³-¾üÉãÖžäæòy÷3Â+|8D6NÍV¡]•begf2eöa¹\¡UÅLbB£6Æ)Î Hÿ¼ðƒâåÔ"È…¼D²–©©¢¢”š™­šØô¢þ©½²½ÀÈÕ7ãwñþÿŒÈs*@7îBCMV],bNegfje_bW]iV¼M|CÜ7+zE¹0òêã7Ö^ÉŸ½8³dªC£ žÎš˜™šk]¢3©Ì±ö»‹Ç5ÔÖáð‹þ ` )6ÔAJL8Uk\¾aecfšeÅbï].W¯ND9m,áµ.¤óOå‘×—ÊÁ¾/´2«æ£zž›¡™Pš É¡n¨Ý°áºTÆæÒqà‘îý¥ ùÇ'Å4³@OKhTÆ[NaÖd[fÄe(c}^ôW˜O¨EH:¾-E "©õ¿æãØÜËà¿-µ¬‰¤ñžH›®™&š¬œ:¡¯§ñ¯Ñ¹ÅšÑ ß$íŸû4 Žn&„3?PJ”S[Ù`‘dLfîe}c_­XƒP¸Fx; /¥!”‹ö#èBÚÍÁ0¶Ý¬4¥jŸŽ›¿™šUœ­ ö¦¯Æ¸ëÃRЩݵë-ú½$%@2j>MI¸RpZ]`Hd:f fÖc—_dYjQÂG©ã2À%Úx æúlìZÞøÐÄO¹x¯U§ò œš´™l›*Ÿâ¤n¬¯µrÀyÌ–ÙoçÍõbÚ÷ c.ã:-FPNXÉ^RcÚeSf·daw[øSÕJ@'4'Fê \üÛí¼ßDÒµÅ[ºe°¨¡Úœ:š¦™*›±ž;¤˜«°´O¿8Ë<Øæ\ôém’-¬9E$O‘W8^õb±e_fød…a\ÑTÌKFAa5v(¬_ ÑýKïá“ÓéÆq»N±Õ¨¢?cšŸ™çšEž“£Êªµ³+¾ÊÞÖ¡äçòuü.Æ+y8D5NÌV¤]’b„edf4eôa½\œUÊL^B¥6Ç)Ð Fÿ½ð„âãÔ%ȼH²“©«¢¡•š›™°šÕ÷¢û©¿²½ÁÈÕ6ãwñÿÿ‹És*?7ïBCMV ],bMejffebbU]kV»M|CÝ7+}B¼-òìã6Ö_ÉŸ½7³dªB£žÉš™|šm_¢1©Ì±ø»‡Ç:ÔÒáð‹þ a)6ÓAKL8Uj\¿aebfœeÄbí]2WªN–D9q,Þ·.¢óRåכʽ¾3´0«æ£zž ›¡™Oš É¡o¨Ü°ãºPÆêÒnà’îý£ ûÅ'Æ4²@RKdTÉ[KaÙdYfÇe#c‚^ðW›O¦EI:¾-C &¤õ¼æäØÝËÝ¿1µ¬¤ížK›¬™'š¬œ8¡²§ï¯Ò¹ÅšÑß!í£û0 p&3‘?QJS [Õ`•dIfïe~c_¯XP¹Fx; /¦!’‡ö%èCÚÍÁ-¶Þ¬5¥gŸ‘›¾™šSœ¯ ô¦ ¯À¸ñÃMЭݳë-ú¼'%C2g>OI¶RsZY`Ld8f f×c”_hYhQÁG¬fud”`ÌZ$SÐIü>ã2¿%Ú{ âúoìYÞõЇÄI¹}¯R§ñ ‚œš¶™l›*Ÿá¤n¬±µoÀ~ÌÙsçÌõbÛô g.ß:2F PSXÆ^TcÙeTf´dar[ýSÐJ#@#4'Cí [üÚí¾ß?Ò»ÅXºe°¨~¡Þœ7š©™&›µž9¤˜«²´L¿;Ë;Øæ]ôêl“-¯9E#O’W6^øb¯e`f÷d…a\ÎTÏKBAe5s(­a ÍýNïá’ÓíÆk»T±Ð¨¢=cšŸ™êšAž–£Èªµ³-¾þÉàÖ äæòvý-Ç+w8 D4NÍV¤]‘b„eff1e÷a»\UÊL^B¤6É)Ö @ÿÂðâçÔ!È…¼E²”©¬¢Ÿ–𛙝š×õ¢ý©¼²½¿ÈÕ8ãtñ‰Ês*?7ðB@MV],bOeefke_bW]iV½MzCÞ7+{D»,òîã4Ö`ÉŸ½7³dªB£ žÌš›™}šm]¢3©Ë±ø»‡Ç;ÔÐáð‹þ b)6ÒALL6Ul\½aecfšeÅbí]0W®N’D9o,àµ0 óTå‹×ʽ¾0´5«ß£ž›£™Oš Ê¡o¨Û°äºOÆìÒlà•îý¨ ÷É'Ä4±@TKaTÎ[FaÜdWfÈe$c€^òW˜O©EH:½-F !¨õ¼ææØÙËá¿.µ¬Œ¤îžJ›­™&š­œ8¡±§ð¯Ò¹ÅÑ ß'íû5 p&‚3?RJŽS#[Ó`–dJfìec _±X€P¹Fx; /¤!”‡ö'è?ÚÍÁ4¶Ø¬9¥gŸŽ›Á™ÿ™Xœ¬ õ¦ ¯Ã¸îÃQШݷë+ú¾%%C2f>QIµRsZZ`Kd7ffÕc—_eYjQÀG«¦(®¸·ÂÂÏMÜGê·øJ¶·#ø0A=DHÜQ½YÝ_úc f)f&d`ZHRÌHÓ=ž1c$opùÿêúÜ«ÏXÃ<¸š®˜¦j +œò™É™¶›¤Ÿ¥F­¶¶“ÁÄÍëÚÝèB÷ÔLU"°/<;GùPYU_©cfAfpd˜`ÊZ%SÏIþ>à2Ã%Ö} àúrìVÞùЂÄN¹x¯V§ð œš·™i›.ŸÜ¤s¬­µrÀ{Ì“ÙpçÎõaÚø b.â:1F PTXÅ^ScÜePf¹dav[ùSÕJ@)4'Gê \üÛí¼ßCÒ¶Å[ºd°¨~¡Üœ:š¦™)›²ž:¤™«°´N¿9Ë;Øæ]ôèo‘-±9E'OW8^õb±e^fùd…a\ÎTÏKBAf5r(®_ ÏýMïá’ÓíÆl»R±Ñ¨¢9iš™™íšAž•£Çª·³,¾þÉàÖŸäçòwú0Å+y8 D3NÎV¤]‘b†eaf7eòa¾\›UÊL`B¢6Ê)Ô Dÿ¾ð‚âæÔ!Ȇ¼D²”©­¢˜šš™°šÔù¢ù©¿²½¾ÈÕ7ãtñ‰Êr*@7ïBCMV ])bQeffieabU]jV½MyCà7+}Cº0òèã:Ö[É¡½9³`ªG£ žÍšœ™|šo\¢3©Ë±ø»‡Ç;ÔÑáð‹þ b)6ÐAML6Um\¼ae`f›eÇbé]6W¨N–D9n,áµ/¢óRåלʼ¾3´0«æ£|ž›¥™KšÇ¡p¨Ú°äºQÆéÒpàîý¤ úÆ'Æ4²@QKeTÉ[JaÚdXfÈe#c^ðWœO¥EJ:¼-E %¤õ¹æçØÛËß¿/µ¬Œ¤ïžI›®™%š­œ9¡¯§ò¯Ð¹Å›Ñ ß$í û2 m&„3?RJS[×`’dNfêec _®X„PµF|;/©!†ö'è@ÚÍÁ0¶Ü¬6¥gŸ›¿™šTœ® õ¦ ¯Ã¸îÃPЪݶë*ú¿$%@2i>NI·RrZ[`Jd8f f×c”_hYgQÃG©â2À%Ù{ âúpìWÞùЂÄL¹|¯R§ó €œš·™j›,Ÿà¤o¬¯µpÀ~ÌÙtçÊõcÚö e.à:1F PSXÅ^TcÙeTf¶dar[þSÏJ$@#4'Eê ^üÙí¼ßDÒµÅ\ºd°¨‚¡Úœ:š¦™)›²ž;¤˜«±´L¿<Ë8ØæZôëk•-±9E&OW9^ôb²e^fùd…a\ÐTÌKGAa5v(«a ÎýOïá–ÓèÆp»R±Ï¨¢9išš™ìš@ž–£Éª´³.¾üÉáÖŸäèòvû/Ä+|8D:NÈV§]b„edf4eõa»\žUÇLbB¡6Ê)Ð Hÿºð‡âàÔ&È‚¼F²–©§¢¤“šœ™±šÒû¢ø©À²½ÀÈÕ4ãyñþÿŠÊr*A7ïBAMV ]*bPeffieabU]kVºMCÙ7!+wH¶3òçã:Ö\ÉŸ½;³^ªH£ žËšŸ™yšp[¢5©È±ü»„Ç<ÔÐáðŠþ b)6ÐAOL4Uo\ºaeafœeÄbî]0W«N—D9r,Þµ0¢óQåיʿ¾1´0«è£xž › ™QšË¡m¨Ý°âºRÆêÒlà–îý© öÉ'Ä4´@OKfTÈ[LaÙdXfÈe#c^ñWšO§EI:¼-F #¦õ¼æåØÛËß¿.µ¬‹¤ížL›ª™)š«œ:¡¯§ñ¯Ñ¹Å›Ñ ß#í¡û1 m&…3?PJ“S[Ù`’dLfìec _°XƒPµF};/§!”‹ö"èEÚÍÁ,¶Þ¬5¥iŸ›¿™šUœ¯ ó¦ ¯Á¸ïÃPЩݷë*ú¾%%A2h>OI¶RtZW`Od4ffÕc”_jYeQÅG§¦(®¹·¿Â ÏIÜJêµøK¶¸#õ0C=EHÚQÀYÚ_ûc!f'f'd`ZKRÈH×=›1e$mpùÿêûÜ©ÏYÃ;¸›®—¦l *œð™Í™°›«Ÿ‰¥M­®¶›Á½ÍðÚÚèC÷ÔLT"²/å2½%Ýv æúlì\ÞôЇÄG¹€¯O§õ œš¹™g›/ŸÝ¤r¬­µsÀzÌ”ÙpçÍõcÙ÷ d.à:2F PQXÈ^QcÝePf¸das[ýSÑJ @(4'Dî YüÝí»ßCÒ¶Å\ºc°¨€¡Üœ8š©™$›¹ž4¤œ«¯´M¿<Ë8ØæYôël•-°9E'OW;^ñb´e]fødˆa\ÒTÌKCAf5r(®^ ÑýKï á‘ÓìÆm»S±Ð¨¢QIµRsZY`Md4ffÐcš_cYkQÀG¬ä2¿%Úx æúlì\ÞóЇÄJ¹{¯T§ñ €œš²™o›(Ÿã¤m¬°µpÀ}Ì’ÙqçÎõ`Û÷ b.ä:.FPOXÈ^RcÜeRf·dau[ýSÐJ#@"4'Bï XüÝí»ßCÒ¸ÅXºh° ¨ƒ¡Ùœ;š¦™(›´ž9¤™«°´N¿:Ë:Øæ\ôéo-°9E'OŽW:^ób³e^fød†a\ÑTÍKDAc5u(¬a ÎýLï á‘ÓíÆl»S±Ñ¨¢>a𢙿šEž“£Éªµ³.¾ûÉäÖ›äëòtû1Ã+z8D5NÌV¦]Žb‡edf2eøa¸\ŸUÊL]B¥6È)Õ AÿÁðâåÔ#ȃ¼G²“©­¢˜šš™¯š×õ¢ü©¾²½ÀÈÕ7ãvñŠÉt*>7ðBBMV ])bPegfhebbU]jV¼M|CÜ7+zEº.òëã7Ö^ÉŸ½9³`ªH£žÎšš™šk`¢/©Î±ö»ŠÇ7ÔÔáðŒþ b)6ÑAML6Ul\¾aecf™eÆbí]0W®N’D9o,àµ0 óSåŽ×šÊ¾¾2´/«è£yž ›¢™Mš Å¡s¨Ø°æºOÆëÒlà”îý¢ ýÄ'Ç4²@PKeTÊ[JaÚdXfÆe&c^òWšO¦EI:¿-B &¥õÀæáØÞËÞ¿.µ¬‹¤ïžJ›¬™'š«œ;¡®§ó¯Î¹!ÅšÑ ß%íŸû2 ‘l&„3?PJ’S[Õ`”dLfëe‚c _®X…P´F|; /¥!–‹ö#èBÚÍÁ/¶Ý¬4¥lŸ‹›Â™ÿ™Wœ­ ö¦¯Å¸íÃOЭݲë.ú½#%?2h>QI³RvZW`Md6ffÔc˜_dYkQÀG«â2¿%Üv çúlìZÞ÷ЃÄM¹y¯U§ñ œšµ™l›+Ÿá¤n¬¯µrÀzÌ–ÙmçÐõ_Ýô f.ß:2F PRXÇ^RcÛeRf·dau[ûSÒJ @&4'Fë [üÜí»ßDÒµÅ\ºc°¨~¡Üœ8š¨™'›¶ž6¤š«±´L¿<Ë8Øæ\ôém’-¯9E&OŽW;^òb´e^f÷d…a\ÍTÒK?Ag5r(®_ ÐýKï!áÓíÆl»T±Ð¨¢;fš™ëš@ž—£Çªµ³.¾ûÉäÖäèòuü/Å+z8D5NÎV¢]“bƒeef3eöaº\ UÅLdBž6Î)Õ BÿÀðâçÔȈ¼A²™©¨¢¡•šœ™®šØô¢þ©»²½½È‘Õ4ãwñ‰Ër*?7ðBBMV ](bReefje_bW]jV¼M{CÞ7+A»0òèã:Ö[É¡½8³aªF£ žÌšœ™{šo]¢2©Í±ö»ˆÇ;ÔÏáð‰þ a)6ÔAKL7Ul\¼aeafeÂbï]0W¬N•D9o,â²3ŸóSåלʼ¾3´0«å£}ž›¤™Mš È¡o¨Ü°áºTÆèÒnà“îý¥ úÆ'Å4´@OKgTÆ[OaÖdZfÆe%c^ôW—O¨EI:¼-F #¦õ»ææØÛËß¿0µ¬¤îžI›¯™#š¯œ7¡²§î¯Ô¹ÅŸÑ ß&ížû3 l&…3?QJ‘S[Õ`•dKfìec _±X€PºFw;/£!•†ö)è=Ú!ÍÁ2¶Ù¬9¥fŸ›À™ÿ™Xœ« ÷¦ ¯Ã¸îÃPЪݶë*ú¿$%@2i>NI·RsZX`Nd4ffÖc“_jYfQÁG­æ2½%Üw çújì]ÞóЈÄH¹}¯R§ò ƒœš¹™i›,Ÿà¤p¬®µqÀ~ÌÙtçËõaÝô e.â:.FPPXÈ^RcÛeRf·das[ýSÑJ!@&4'Hè _üØí¿ß@Ò¹ÅXºg°¨€¡Üœ9š§™(›³ž:¤˜«±´M¿<Ë7Ø æWôðh•-­9!E O”W6^öb±e_föd‰a\ÒTÍKCAg5o(±[ ÕýGï#áÓîÆj»W±Ì¨¢7hšœ™ëšAž–£Çª·³+¾þÉáÖŸäçòvü-Ç+y8D8NËV¢]–beif0e÷aº\ŸUÇLaB¢6É)Ò Dÿ¾ð„ââÔ&ȼF²•©¬¢šš–™³šÕö¢ü©¾²½ÂÈ‹Õ9ãuñÿÿŒÈr*C7ëBEMV ])bQedfme\bZ]fV¾M|CÜ7+|B¼.òëã7Ö]É ½8³bªE£ žÌšœ™}šl_¢1©Í±÷»ˆÇ9ÔÓáð‹þ ` )6ÔAIL:Ui\¿aebfœeÄbí]1W¬N“D9m,â´/¢óRåלʼ¾3´/«é£vž ›™SšË¡n¨Ü°ãºPÆìÒkà•îý¥ ûÄ'È4°@SKdTÉ[KaÚdVfÊe"c^òW™O§EI:¼-G !©õ½ææØÙËâ¿,µ¬ˆ¤òžG›¯™$š¯œ6¡²§ð¯Ð¹ Å™Ñ ß"í¤û- ”i&ˆ3Œ?TJŽS"[Ó`—dGfòezc_©X‡PµFz; /¤!”‡ö'è?ÚÍÁ1¶Û¬7¥gŸ›¾™šTœ® õ¦ ¯Å¸ìÃQЪݵë+ú¿#%@2h>OI¶RtZX`Md6ffÖc•_gYiQÁG«ä2¿%Úy ãúpìXÞ÷Ð…ÄI¹~¯P§õ ~œš´™l›+Ÿß¤q¬­µsÀzÌ”ÙpçÍõbÚ÷ c.ã:-FPNXÊ^PcÜeQfºdau[ûSÑJ#@$4'Dí ZüÜí¼ßBÒ¸ÅZºe°¨€¡Ûœ:š§™'›µž7¤š«±´K¿>Ë6Ø æWôîj”-®9E%OW:^òbµe\fùd…a\ÏTÐK@Ah5q(®_ ÐýLïá’ÓëÆo»P±Ô¨ ¢A`š£™åšEž“£Êª´³/¾ùÉæÖ›äëòsü/Å+z8D3NÏV¢]’b…ecf4eöa¹\¡UÄLeBž6Ì)Ñ Gÿ»ð…âäÔ"Ȇ¼B²˜©¨¢¢•š›™°šÔù¢ù©À²½ÂÈŒÕ8ãtñ‰Ét*>7ðBCMV ](bPegfhebbT]kV»M}CÛ7+{Dº/òêã8Ö]É ½8³bªE£ žÏš—™‚ši`¢2©É±ü»ƒÇ>ÔÎáðˆþ _ )6ÐAOL3Uo\¼aebf›eÄbï]/W­N“D9o,àµ/¢óRåכʿ¾/´3«å£zž ›Ÿ™Pš È¡p¨Ú°äºPÆëÒmà“îý¤ üÄ'Ç4²@OKiTÄ[Oa×dYfÇe$c€^óW—OªEF:À-B &£õ¸æèØÙËà¿/µ¬‹¤ðžG›°™#š°œ5¡´§ì¯Ö¹Å Ñß&ížû3 m&„3Ž?SJS [Õ`“dMfìec_­X„PµF|; /§!“‰ö$èBÚÍÁ/¶Ü¬5¥kŸ‹›Ä™ý™Xœ¬ õ¦ ¯Ã¸íÃQЩݶë+ú½'%C2f>OI·RsZX`Od1ffÐc›_cYiQÃG§¦(®¸·ÁÂÏKÜHê·øH¹µ#ú0>=HH×QÃYØ_þcf+f$d`ZJRËHÔ=1d$moùëùܬÏVÃ?¸–®œ¦h +œó™Ç™·›¥ŸŽ¥H­³¶–ÁÂÍìÚÞè?÷×IW"°/<=GöP YQ_®cûeEfnd˜`ËZ#SÑIü>â2Á%Ùy åúlì]ÞòЈÄJ¹y¯X§ì …œš¶™k›,ŸÞ¤r¬­µrÀ{Ì”ÙoçÐõ^Ýô f.á:0F PSXÄ^Wc×eTf¶dau[ûSÑJ!@&4'Eê ]üÚí½ßBÒ·ÅZºf°¨¡Úœ;š¥™*›²ž:¤˜«±´M¿;Ë:Øæ[ôìk”-®9 E!O”W5^÷b±e^fød†a\ÒTËKEAc5t(®] ÒýJï!á‘ÓëÆm»T±Ð¨¢7ñB?M V]0bKeifie_bW]jV»M}CÜ7+~@¿*òîã4Öaɽ9³bªD£ žÍ𙙀šk^¢3©Ê±ú»†Ç;ÔÐáð‰þ a)6ÐANL5Um\¼aeafœeÄbí]1W¬N”D9m,ã²2 óSåŒ×Ê»¾4´/«æ£{ž›¡™Oš È¡p¨Û°âºSÆéÒmà•îý¨ ÷É'Ã4µ@NKgTÈ[LaØdYfÇe$c^ðWœO¤EK:½-C &£õ¹æçØÚËß¿0µ¬‹¤ñžF›°™%š¬œ:¡¯§ñ¯Ò¹ÅšÑß"í¢û0 m&…3?PJ“S[Ù`’dKfïe|c_ªX†PµFz; /¢!—†ö*è:Ú%ÍýÀ5¶×¬:¥fŸ‘›½™šUœ® õ¦ ¯Â¸ïÃOЫݵë+ú¾$%?2j>LI¹RqZ[`Kd6ffÕc—_eYjQÀG«¦(®¸·ÂÂÏNÜGê¶øJ¸´#û0>=GHÚQÀYÙ_þcf+f%d`ZGRÌHÔ=œ1e$nrùýêûܬÏVÃ>¸—®š¦j ,œï™Ì™²›¨Ÿ¥I­³¶•ÁÃÍëÚÞèA÷ÕLS"³/<@GôP YP_­cüeDfod™`ÈZ&SÏIý>â2À%Úx åúnìYÞ÷ЃÄL¹{¯S§ó ~œš³™m›*Ÿá¤n¬±µoÀ}Ì’ÙqçÎõ_Ýô f.á:/FPPXÉ^PcÝePf¹dat[ûSÓJ@'4'Eì [üÚí¾ß@ÒºÅWºg°¨¡Úœ<š¢™-›°ž<¤—«±´M¿:Ë<Øæ\ôêl”-°9E$O“W5^÷b±e]fúd„a\ÑTÍKCAe5r(°\ ÓýIï!á’ÓêÆo»Q±Ò¨¢:hš™™ïš>ž˜£Çªµ³-¾ýÉáÖ äæòwú0Å+x8 D5NÍV£]“b€ejf.eúa·\¡UÆLaB¢6É)Ó CÿÀðâåÔ#È„¼E²–©©¢¡–šš™°šÕø¢ú©¾²½¾ÈÕ5ãvñ‹Çv*=7ñBAMV ],bOeffje_bW]jV»M}CÛ7+{Dº/òêã8Ö]É ½8³aªG£ žÎšš™~šl_¢2©Ë±ø»‡Ç;ÔÑáðŠþ c)6ÑALL7Ul\¼ae`fœeÄbî]0W­N“D9p,ß¶/¢óPå‘×—ÊÁ¾0´0«è£xž ›¡™Oš Ê¡m¨Ý°âºRÆêÒlà•îý© öÊ'Â4µ@NKiTÅ[OaÕd\fÄe'c~^óW™O¨EG:¿-C %¥õ½æâØßËÛ¿2µ¬¤îžI›®™%š­œ:¡®§ò¯Ñ¹ÅŸÑß'íœû5 Žp&3’?LJ—S[Ù`‘dMfëe‚c _¯X‚P¸Fy; /¥!’†ö'è@ÚÍÁ0¶Ú¬8¥gŸ›¾™šRœ± ó¦ ¯Á¸ðÃMЮݲë.ú»(%B2h>NI·RsZY`Ld7f f×c”_iYfQÃGªæ2¼%Ýx ãúpìXÞöІÄJ¹|¯S§ñ œš¶™k›*Ÿâ¤l¬´µlÀÌÙtçËõbÚ÷ c.ä:,FPNXÉ^ScÙeTfµdat[üSÑJ!@%4'Cí ZüÜí¼ßBÒ¸ÅWºi° ¨‚¡Ûœ9š§™(›³ž:¤˜«²´K¿=Ë8ØæZôìk”-¯9E%OW8^öb¯ebfôd‰a\ÐTÎKCAd5t(¬` ÏýMïá“ÓêÆn»S±Ð¨¢;dš ™çšEž’£Êª¶³+¾ÿÉßÖ¡äåòxù1Å+x8 D2NÐV¡]“b…ebf6eôaº\¡UÄLdB 6Ê)Ò Dÿ¿ðâæÔ"È„¼E²•©ª¢¡•šœ™­šÙó¢ÿ©»²½¿ÈŽÕ7ãuñ‹Ér*B7ëBGMV ]*bPeefle]bX]jV»M|CÝ7+}Cº/òéã:Ö[É¢½6³cªE£ žÏš˜™€šj`¢1©Ì±÷»ˆÇ:ÔÒáð‹þ a )6ÕAIL9Uk\½aebf›eÄbî]/W¯ND9j,ä³0¡óTåŠ×ŸÊº¾3´1«ä£}ž›£™Nš Ç¡q¨Ú°åºOÆëÒlà•îý¦ úÅ'Ç4±@RKdTÊ[JaÚdXfÈe#c^ñW›O¥EJ:¼-G "¦õºæéØØËá¿.µ¬¤ïžH›¯™#š°œ6¡³§ì¯Ö¹ÅŸÑß%í¡û0 ’l&ƒ3“?LJ•S[×`“dLfìec_ªXˆP²F}; /¥!•Šö%èAÚÍÁ/¶Ü¬7¥gŸ›¾™šRœ² ñ¦ ¯Â¸íÃQЪݵë-ú»'%@2i>MI¸RrZZ`Ld5ffÔc—_fYiQÀG­â2Á%Ùz ãúnìZÞõЇÄH¹~¯Q§ó €œš´™m›)Ÿã¤m¬±µoÀ|Ì”ÙoçÐõ^Ýô e.ã:-FPOXÈ^RcÜePfºdau[üSÑJ!@'4'Gê \üÜí»ßBÒ¸ÅYºg° ¨¡Ûœ:š¦™)›²ž;¤—«²´L¿<Ë9Øæ]ôèo‘-¯9E&OW:^ób³e^f÷d‡a\ÐTÎKCAe5r(¯^ ÐýMïá’ÓíÆk»T±Ð¨¢NI¸RqZ[`Jd9f fÙc’_iYhQÀG¬á2Á%Ùz ãúpìVÞúЂÄL¹|¯Q§ó ‚œš¹™h›.ŸÝ¤s¬«µtÀ{Ì‘ÙtçÊõcÛô f.á:/FPQXÇ^ScÚeRf¸dav[ûSÑJ"@#4'Bî Xüßí¸ßFÒ´Å]ºc°¨¡Ûœ;š¦™(›´ž7¤›«¯´N¿;Ë9Øæ[ôëk–-²9E&OW:^ób³e^f÷d†a\ÎTÐKAAe5t(¬a ÎýMïá“ÓìÆl»S±Ñ¨¢=dšž™êšAž–£Çª·³,¾ýÉáÖ äæòwú1Ä+z8D5NÎV¢]”b€eif0e÷aº\žUÈLbB 6Ë)Ô Cÿ¿ð‚âåÔ"È…¼D²–©©¢¡—š˜™³šÒù¢ú©¿²½ÀÈÕ7ãuñˆÌp*B7íBCMV],bPedfme]bW]jV¼M{CÞ7+}Cº/òëã6Ö`É›½=³^ªG£ žÊš™{šo]¢3©Ê±ù»‡Ç;ÔÑáðŒþ a!)ÿ5ÖAIL9Uk\¾aeef˜eÇbí]/W¯ND9k,ã³/¤óOå‘טʿ¾1´0«ç£{ž›¥™JšÄ¡r¨Ù°æºOÆëÒkà—îý© öÈ'Æ4±@QKgTÆ[NaÖd[fÅe'c}^ôW˜O©EF:À-C $§õ¾æãØÝËÞ¿/µ¬Š¤ïžK›«™(š«œ9¡±§ï¯Ó¹Å›Ñ ß#í¡û2 m&†3?SJS[Ö`•dHfòezc_«X…P¶Fz; /¥!”†ö(è>ÚÍÁ1¶Ú¬8¥fŸ’›¼™šQœ± ó¦ ¯Ã¸îÃOЬݳë.ú»&%@2i>MI·RtZX`Md5ffÕc—_eYjQÀG«=IH×QÂYØ_ÿcf-f#d`ZLRÉHÕ=ž1b$opùëùܬÏVÃ=¸›®•¦n (œó™Ê™³›§ŸŽ¥H­³¶—ÁÀÍîÚÜèA÷ÖJV"°/<ä2À%Ùy åúlì[ÞöЄÄK¹|¯R§ó œšº™f›0ŸÝ¤q¬®µqÀ|Ì“ÙpçÎõ`Ýô e.â:.FPQXÆ^Uc×eVf´dar[þSÏJ#@$4'Dì [üÛí½ßAÒ¸ÅZºe°¨~¡Ýœ8š¨™(›³ž9¤š«®´P¿9Ë9Ø æWôïh–-°9E"O“W6^öb²e^f÷d‡a\ÒTÌKDAe5q(°] ÑýLïá“ÓëÆn»R±Ñ¨¢=ešœ™íš>ž™£Åª·³,¾þÉáÖžäèòuý,É+u8 D2NÎV£]’b„edf4eõaº\ UÅLdB 6Ê)Ñ Eÿ¿ð‚âåÔ"È…¼C²˜©¨¢¢–š˜™³šÓø¢ü©¼²½¿ÈŽÕ6ãwñÿÿŠÌn*E7êBFMV ]*bNeifgebbU]jV¼M{CÞ7+}C»-òíã5Ö_ÉŸ½8³cªD£ žÍš›™}šm^¢1©Í±÷»‡Ç<ÔÏáð‰þ `!)6ÕAIL9Ul\¼ae`feÄbî]/W®N‘D9l,ã²1¡óRåŽ×›Ê¼¾5´-«è£zž›¤™Lš Æ¡r¨Ø°çºLÆïÒià—îý¦ úÆ'Æ4²@PKgTÇ[Ma×d[fÄe'c^ñW›O¥EL:º-H ¨õ»ææØÛËÞ¿0µ¬‹¤îžK›«™(š¬œ8¡±§ð¯Ñ¹Å›Ñ ß%íŸû3 m&…3?QJS [Õ`•dJfíe€c _°X‚P·Fz; /§!’†ö(è>Ú ÍÁ2¶Û¬6¥iŸŽ›¿™šSœ¯ õ¦ ¯Å¸ìÃQЩݸë(úÁ"%A2f>QI´RuZY`Jd9f fÙc“_iYfQÃGªã2¿%Ûw çúkì\ÞôЇÄH¹¯O§õ œš·™j›+Ÿà¤q¬­µrÀ|Ì‘ÙsçÌõaÛö d.â:.FPPXÈ^RcÛeQf¹dau[ûSÒJ @'4'Eì ZüÝíºßDÒ·ÅYºg° ¨€¡Þœ5š«™&›³ž;¤—«±´N¿:Ë9Ø æWôîi–-±9E&OW9^õb±e_fød„a\ÍTÑK@Ah5p(®a ÍýOïá”ÓëÆm»S±Ð¨¢=cšŸ™éšBž–£Èª´³/¾úÉåÖ›äëòsý/Ã+|8D6NÍV¢]“bƒeff1eøa¸\ UÈL_B¤6È)Ó CÿÀðâåÔ$ȼI²‘©®¢ž—š™™±šÖö¢û©¾²½ÁÈÕ7ãuñŠËp*C7ëBFMV ]'bReefje`bV]iV½M{CÞ7+}B¼.òëã6Ö_Éž½:³`ªG£ žÎšš™~šm]¢3©Ê±ú»…Ç=ÔÎáð‡þ a)6ÐAML7Uk\½ae_fžeÂbî]3W©N–D9m,ã³0¢óQåיʿ¾0´2«æ£yž ›Ÿ™Qš È¡p¨Ú°åºPÆêÒnà’îý¥ ùÇ'Å4²@RKdTÊ[IaÛdWfÉe"c‚^ðW›O¦EJ:¼-F "§õ½æäØÜËÞ¿0µ¬Ž¤ížJ›®™$š®œ9¡¯§ò¯Ð¹ÅŸÑß)íû3 n&ƒ3?RJŽS#[Ò`—dJfìec _¯X„PµF{; /¦!”Šö#èCÚÍÁ.¶Ý¬5¥jŸ›Á™šUœ¯ ô¦ ¯Â¸ïÃNЬݵë+ú¾$%?2j>LI¹RrZY`Md5ffÔc–_hYfQÅG§=IH×QÃYÖ_df+f%d`ZIRËHÔ=1d$noùëùÜ­ÏVÃ=¸š®–¦n (œó™Ê™²›©Ÿ‹¥L­°¶—ÁÁÍîÚÚèD÷ÓLV"¯/<>GôPYO_®cüeBfqd˜`ÉZ%SÏIý>ä2¾%Úy äúpìXÞöÐ…ÄJ¹}¯S§ð ƒœš¹™h›.ŸÝ¤r¬­µrÀ|Ì‘ÙrçÌõcÚõ f.ß:2F PRXÆ^TcÚeRf·das[þSÏJ#@$4'Cî YüÝí»ßBÒ¹ÅWºh°¨¡Þœ6šª™&›µž8¤™«±´M¿:Ë;Øæ]ôén‘-¯9E&OW9^õb±e_f÷d‡a\ÐTÎKCAe5s(®] ÒýJï"áÓíÆl»T±Ð¨¢MI¸RrZZ`Kd7ffÖc–_dYlQ¾G­ä2¿%Ûw çúkì\ÞôІÄJ¹|¯S§ñ ‚œš¶™k›+Ÿá¤n¬±µnÀÌ‘ÙpçÏõ_Ýõ c.ã:/FPQXÆ^TcÙeTf¶dat[üSÐJ$@!4'@ð XüÜí½ßAÒ¸Å[ºb°¨|¡Þœ9š¦™)›²ž;¤—«³´J¿>Ë6Ø æWôïh–-°9E$O‘W7^öb²e]fúd‚a\ÍTÏKCAe5q(°^ ÏýOïá–ÓêÆn»R±Ñ¨¢>bš¡™çšBž˜£Äªº³*¾ýÉâÖžäèòvú0Æ+w8 D3NÎV£]’bƒegf1eöa»\UÊL_B£6É)Ó Eÿ»ð‡âàÔ&ȃ¼E²•©ª¢¡•šœ™¯šÕø¢ù©Á²½ÄȈÕ<ãrñŠÉs*?7ñB?MV]+bQeefje`bU]kV»M}CÜ7+|B¼.òëã6ÖaÉ›½<³_ªG£ žÏš™™šl]¢3©Ì±÷»ˆÇ:ÔÐáðˆþ ^!)6ÖAHL9Uk\½ae`fžeÁbñ]-W¯N’D9p,Þ·.¢óRåŽ×›Ê½¾2´0«æ£|ž›£™Nš È¡o¨Ü°ãºQÆéÒnà”îý§ øÈ'Å4²@PKgTÇ[MaØdXfÈe$c€^ñWœO£EN:¸-I !§õ¼æçØÚËÞ¿1µ¬¤ížI›¯™$š®œ9¡®§ó¯Ð¹ÅŸÑß)íœû4 l&…3Ž?RJ‘S[Õ`•dJfíe€c _¯X‚P·F{; /¨!‘ˆö%èAÚÍÁ.¶Ý¬6¥hŸ›¾™šVœ® ô¦ ¯Â¸ïÃOЫݴë-ú½%%@2j>LI¹RrZX`Nd5ff×c”_hYgQÃG©÷ØHX"¯/<>GõP YT_¨cf>frd™`ÈZ&SÏIü>ä2¾%Ýt êúiì]ÞóЉÄF¹¯R§ï †œš¹™i›,Ÿà¤o¬°µoÀ~Ì‘ÙqçÎõ`Û÷ b.ä:.FPPXÉ^PcÞePf·dar[þSÐJ!@&4'Fê ]üÙí¾ßAÒ¸ÅYºf°¨¡Ýœ7šª™%›·ž5¤«­´P¿9Ë:ØæZôên-«9 E"O“W7^õb±e`födˆa\ÐTÎKDAc5v(©b ÏýKï"áŽÓïÆj»V±Í¨¢:fšœ™íš=ž›£Ãª¸³-¾ûÉäÖ›äëòsþ,Ç+y8D7NÊV¥]’bƒeef4eóa½\žUÆLcBŸ6Ì)Ñ Gÿºð†âãÔ"ȇ¼@²š©§¢£“šœ™¯šÖ÷¢û©¾²½ÂÈ‹Õ9ãtñ‰Ëq*A7íBEMV ](bRecfoeZb[]fV¾M{CÝ7+}B¼,òîã4Ö`Éž½9³aªG£žÏš™™šm]¢2©Ì±÷»ŠÇ7ÔÔáðþ d)6ÒALL6Um\¼aeaf›eÅbï]-W°ND9l,ã²2 óRåיʿ¾0´2«å£{ž›¢™MšÄ¡s¨Ù°åºPÆêÒmà”îý¤ ûÅ'Ç4±@RKdTÊ[JaÚdWfÊe c„^îWžO£EK:¼-E %¤õ¼ææØÛËÞ¿0µ¬Ž¤ížJ›­™&š­œ8¡±§ï¯Ó¹ÅÑ ß%íŸû3 Žo&‚3‘?PJ’S[Ö`•dIfïe~c_°XP»Fv;/¤!”‹ö"èDÚÍÁ0¶Û¬6¥jŸŒ›Â™ÿ™Wœ¬ ö¦ ¯Ä¸îÃNЭݲë/ú»&%C2f>PIµRtZY`Ld7f fÙc‘_lYdQÄGª¸—®›¦h -œð™É™¶›¥Ÿ¥G­´¶•ÁÃÍëÚÞè@÷ÖJV"±/à2Â%Ùw èújì]ÞóЇÄI¹}¯R§ñ ‚œš¶™l›)Ÿâ¤m¬²µnÀ~Ì‘ÙqçÎõaÚ÷ c.ã:.FPPXÈ^ScÙeUf´dar[ÿSÎJ$@"4'Bï Wüßí¹ßEÒµÅ\ºc°¨|¡ßœ7š¨™)›²ž9¤š«¯´O¿:Ë8Ø æYôìk“-¯9E"O”W4^ùb®e`fød…a\ÏTÍKFAa5v(«` ÑýJï!áÓìÆn»Q±Ó¨¢=dšž™êšBž•£Éª³³0¾ùÉåÖäèòuü.Ç+x8D5NÎV¢]’b…ebf7eóa»\ŸUÆLbB¢6È)Ï Gÿ¼ð…âáÔ'ȼF²–©©¢ ™š–™´šÒú¢ø©Â² ½ÄÈŠÕ9ãuñÿÿŽÃz*97óBAMV ])bPegfhebbT]lVºM}CÜ7+|C».òëã6Ö`ɽ:³aªD£ žÌšš™šk^¢4©É±ú»†Ç;ÔÑáðŠþ d)6ÔAGLPI´RuZX`Md5ffÔc–_hYeQÆG¦à2Ã%Ö{ åúlì\ÞòЉÄG¹€¯O§ó œš·™k›)Ÿã¤m¬±µpÀ{Ì”ÙoçÏõ`Üô f.à:1FPPXÉ^PcÞeOfºdau[ýSÏJ$@"4'Cì \üÙí¿ß?Ò»ÅVºi° ¨‚¡Ùœ<š¥™)›´ž7¤›«¯´N¿;Ë9ØæZôël“-°9E'OW<^ñb¶eZfûd„a\ÑTÍKCAe5s(­a ÍýNïá’ÓíÆl»R±Ò¨¢7ðBAMV ])bRedfle]bY]fVÀMyCß7+~A¼/òéã8Ö^ɽ=³]ªH£ žÎš›™|šn^¢1©Î±ó»Ç5Ô×áÿïŽþ d)6ÎAOL5Uk\Àaeef˜eÆbî]0W¬N”D9p,àµ.£óQåךʽ¾3´/«è£yž›£™Nš Ë¡l¨Ý°ãºQÆêÒnà’îý¦ ùÇ'Ä4´@OKgTÇ[LaØd[fÃe(c}^ôW˜O¨EH:¾-D $¤õ¸æêØ×Ëá¿.µ¬Œ¤ïžI›®™$š¯œ6¡³§î¯Ó¹ÅœÑ ß%í û2 n&„3Ž?TJS#[Ó`–dIfïe}c_­XƒP¶F|;/©!‡ö%èCÚÍÁ/¶Ü¬6¥iŸ›Â™þ™Xœ¬ õ¦ ¯À¸ðÃOЫݴë-ú¼%%?2j>MI¶RtZY`Md4ffÒc™_fYgQÄG¨=IH×QÂYÙ_üc f'f)d`ZIRÊHÖ=›1e$moùÿêúܬÏVÃ>¸˜®™¦k *œò™É™µ›¥Ÿ¥I­±¶˜ÁÀÍìÚßè>÷ØIV"°/<=GöP YR_«cÿe@frd—`ÊZ%SÏIý>â2À%Ûw æúmìYÞøÐ‚ÄM¹{¯R§ô ~œš´™l›,ŸÞ¤r¬¬µtÀyÌ•ÙnçÑõ]Þó g.ß:2F PSXÅ^UcÙeSf·dat[ýSÐJ"@%4'Fë [üÜí»ßCÒ·ÅZºe°¨¡Ýœ8š©™$›¸ž4¤Ÿ««´R¿6Ë=Øæ^ôço-­9E!O”W6^öb±e^fød†a\ÏTÎKDAc5u(«a ÎýOïá”ÓêÆn»S±Ð¨¢SI²RwZW`Ld8f fÙc“_hYhQÂGª=IH×QÂYØ_ÿcf+f%d`ZGRÌHÓ= 1a$prùÿêùܬÏWÃ<¸›®–¦m )œò™Ë™²›¨ŸŽ¥G­¶¶’ÁÄÍìÚÜèC÷ÔJW"¯/<=GõP YR_«cÿe@fsd•`ÍZ!SÓIû>â2Á%Ùy æúkì\ÞôЈÄG¹¯Q§ñ …œ š»™g›-Ÿá¤n¬°µpÀ|Ì“ÙqçÍõaÛö c.ä:,FPLXÌ^NcßeOf¹dat[ûSÔJ@*4'Gë ZüÝí»ßCÒ·ÅYºg° ¨‚¡Ùœ;š§™'›µž8¤˜«²´M¿9Ë>Øæaôåq-®9E$O’W8^ób´e\fùd‡a\ÒTÌKEAd5r(¯^ ÐýLïá’ÓìÆm»Q±Ó¨¢>cšž™êšBž•£Éª´³.¾üÉâÖžäèòvú0Æ+v8 D1NÐV£]b†ebf6eôa»\ŸUÆLbB¢6É)Ñ Fÿ¼ð…âäÔ Èˆ¼A²™©¨¢ ˜š—™´šÒø¢ü©¼²½¿ÈÕ8ãtñˆÌo*D7ìBCMV]-bMeiffecbU]jV½MyCß7+@¼/òèã;ÖZÉ¢½6³eªA£žÉš™}šm]¢4©É±ú»…Ç<ÔÑáð‹þ d)6ÎANL7Uj\ÀaecfœeÃbï]/W­N”D9o,á³3óVåŠ×žÊ»¾4´.«è£zž›¦™JšÆ¡q¨Û°âºSÆæÒrà‘îý¥ úÅ'È4°@QKgTÇ[LaØdYfÈe#c^ðWœO¦EH:¿-B '¢õ·æêØÙËß¿/µ¬Œ¤ñžG›®™%š®œ8¡±§ï¯Ó¹ÅÑ ß#í¡û2 Žp&3’?OJ’S[Õ`–dIfîec_®XƒP·Fz; /¥!”‰ö$èCÚÍÁ-¶ß¬3¥jŸ›¾™šTœ­ ÷¦¯Ä¸îÃOЫݵë,ú¼'%C2g>NI¸RqZ\`Hd;f fÖc—_eYjQÁGª¦)®¶·ÄÂÏNÜEê¹øG»³#ù0@=GHÙQÀYÚ_ûc!f'f(d`ZCRÒHÎ=¡1b$noùÿêûÜ©ÏZÃ:¸œ®–¦l )œó™È™·›£Ÿ¥H­±¶šÁ½ÍðÚÛèB÷ÕJW"°/<æ2º%àt çúnìWÞøÐ†ÄG¹¯L§ø }œš´™l›*Ÿâ¤n¬°µpÀ{Ì•ÙnçÐõ_Üô g.ß:2F PQXÇ^Uc×eWf²dap[ÿSÐJ!@%4'Cî XüÞíºßDÒ¶ÅZºf°¨€¡Üœ9š§™'›¶ž5¤ž«¬´P¿:Ë9ØæZôìk•-²9E(OW<^ñbµe[fûdƒa\ÎTÏKBAg5p(°\ ÓýJï!áÓìÆn»Q±Ó¨¢=cš ™èšCž•£Èª¶³+¾ÿÉßÖ¡äèòq)É+y8D8NÌV¢]”b‚eef5eóa¼\UÊL^B¦6Ä)Î Hÿ»ð„âäÔ$È‚¼G²“©¬¢Ÿ—šš™°šÕ÷¢û©¿²½ÁÈŒÕ9ãsñˆÊs*?7ðBAMV].bLeifhe`bW]jV»M}CÚ7 +yF¸0òêã8Ö\É¡½7³cªD£ žÌš›™}šm^¢2©Ì±ö»ŠÇ8ÔÓáðŠþ c)6ÏAML7Uk\¾aebf›eÆbì]1W¬N“D9n,à·,¥óNå‘יʿ¾0´1«æ£zž ›ž™TšÏ¡j¨à°ßºTÆèÒoà“îý¦ øÉ'Ã4µ@NKgTÈ[KaÚdXfÆe&c^òW™O¨EG:À-B $¨õ¾æåØÙËã¿*µ¬Š¤ïžJ›«™(š¬œ9¡°§ï¯Ó¹ÅœÑ ß&íœû8 ‰t&3’?OJ“S[×`’dMfêe„c_´X~PºFy; /§!’‡ö'è>ÚÍÁ1¶Ú¬9¥dŸ“›½™šXœ© ú¦¯Å¸îÃNЭݳë,ú¾$%A2h>NI·RsZY`Md5ffÕc–_gYhQÂG©ß2Ã%Ùx æúlì[ÞõІÄH¹¯P§õ ~œšµ™k›-ŸÞ¤q¬®µpÀ~Ì‘ÙrçÍõ_Þó g.à:0FPQXÈ^RcÛeRf·dap[TÌJ'@ 4'Dê ]üÚí¾ß@ÒºÅVºi° ¨‚¡Úœ:š§™'›µž8¤™«²´J¿>Ë8ØæZôìj–-±9E%OW8^öb°e`födˆa\ÒTÌKEAd5r(®_ ÐýLïá’ÓêÆq»N±Õ¨¢?bš ™èšCž•£Èªµ³-¾ýÉáÖŸäèòtý.Æ+x8 D1NÒVŸ]”bƒeef4eôa»\ŸUÇLaB£6È)Ñ Fÿ¼ð„âäÔ#Ȇ¼A²˜©©¢ ™š–™³šÔ÷¢ü©½²½ÀÈŒÕ9ãsñˆËp*D7êBFMV ]+bNegfje^bY]hV¼M}CÛ7+{C¼-òìã6Ö^É ½7³cªD£ žËš›™~šl_¢1©Ì±ø»‡Ç:ÔÑáð‹þ c)6ÒAKL8Uj\¿aedfšeÄbð],W±ND9m,â³2žóUåŒ×œÊ¼¾3´/«è£yž›£™Mš Ç¡q¨Ù°æºNÆìÒmà’îý¥ ùÈ'Ä4²@RKeTÈ[MaÖd\fÃe(c~^òWšO¦EI:¾-D $¦õ¼ææØÛËß¿/µ¬¤ížK›¬™(šªœ;¡­§ó¯Ð¹ Å™Ñ ß$íŸû4 Žn&„3?QJS![Ô`–dIfíe€c _¯XƒPµF|; /¦!“‰ö&è?ÚÍÁ2¶Ú¬7¥hŸ›À™ÿ™Xœ« ø¦¯Å¸íÃPЪݶë*úÀ"%?2i>OIµRtZZ`Jd9f fÖc—_dYkQÀG«GõP YQ_­cüeDfmdœ`ÇZ&SÎIÿ>à2Á%Ûv èújì[Þ÷ЄÄK¹|¯Q§ô €œš·™j›,Ÿß¤q¬­µrÀ|Ì‘ÙtçÊõcÚö d.ã:-FPOXÈ^ScÚeRf¸dav[úSÔJ@*4'Ié \üÛí½ß@ÒºÅVºi° ¨€¡Üœ8š¨™(›³ž9¤š«¯´N¿;Ë8Ø æYôên‘-®9E&OW;^ñbµe\fùd†a\ÒTÌKEAc5t(­_ ÐýKï!á‘ÓëÆn»Q±Ó¨¢=dšž™êšAž—£Æª·³,¾þÉàÖ äæòwû/Å+z8D6NËV¦]b‡ebf5eôa¼\UÊL]B§6Ä)Ð Eÿ¾ð‚âæÔ!Ȇ¼B²˜©©¢ ˜š—™´šÒø¢ü©½²½½È‘Õ3ãyñþÿŒÈt*=7òB@MV],bOeffje`bV]jV¼M{CÞ7+{E¸2òèã9Ö\ÉŸ½;³^ªI£žÎš›™|šn^¢2©Ë±ù»†Ç;ÔÑáðŠþ `)6ÒALL6Ul\½aecfšeÆbë]3WªN–D9o,â²2 óQåיʿ¾0´2«å£{ž›¡™Oš É¡n¨Ü°ãºQÆêÒmà”îý¦ ùÇ'Å4²@QKfTÈ[LaØdYfÇe$c^ðW›O§EH:¾-D $¦õ»ææØÜËÜ¿3µÿ«‘¤êžM›«™'š¬œ:¡®§ó¯Ï¹ÅœÑ ß%ížû4 m&†3‹?UJS [Õ`•dJfíec _±XP·F{; /¦!“ˆö$èDÚÍÁ.¶Ý¬5¥jŸŒ›Â™šUœ® õ¦ ¯Ä¸ìÃQЪݶë+ú¾$%A2g>PI¶RsZX`Md7ffÕc–_fYiQÂG©á2Á%Úw çúkì\ÞõÐ…ÄK¹z¯U§ð ƒœš¶™k›+Ÿá¤o¬®µsÀx̘ÙkçÓõ\Þõ c.å:+FPOXÈ^ScÚeRf¸dav[úSÓJ @&4'Fë [üÝí¹ßFÒ´Å\ºe°¨‚¡Øœ<š¥™*›³ž8¤š«¯´O¿:Ë9ØæXôïh–-°9E$O‘W8^õb²e\fûdƒa\ÎTÏKBAg5p(°] ÑýLïá”ÓéÆp»P±Ó¨¢@`š£™åšEž”£Èªµ³.¾üÉâÖžäçòwú0Ä+|8D;NÇV©]b‡ecf4eöa¹\ UÆLbB¢6È)Ï Iÿ¹ð‡ââÔ"Ȉ¼?²›©¦¢£”šœ™®š×ö¢ü©½²½¿ÈÕ5ãwñÿÿŠÌo*B7îBBMV]+bOehfhe`bW]hV¿MxCà7+~A¼/òéã9Ö\É ½:³_ªG£ žÍš›™}šm^¢1©Í±ö»‰Ç:ÔÑáðŠþ b)6ÕAHL:Uj\½ae_fŸeÀbò],W°N’D9p,ß¶/¡óSåŒ×ʼ¾2´1«å£|ž›£™Mš Ê¡m¨Þ°àºSÆéÒnà“îý¦ ùÇ'Æ4±@QKfTÈ[LaØdYfÇe$c^ñW™O¨EG:À-B &£õ¹æèØÙËà¿/µ¬¤îžH›°™#š¯œ8¡°§ð¯Ó¹Å¡Ñß*í›û6 n&…3Ž?RJ‘S[×`“dLfìe€c _¯XƒPµF};/§!”ö"èBÚÍÁ4¶Ø¬8¥hŸŽ›À™šUœ® õ¦ ¯Ä¸íÃRЧݸë)ú¿%%@2j>MI¸RrZY`Ld7ffÔc˜_eYiQÂG©ã2¿%Ýt êúiì\ÞõЄÄK¹|¯R§ó œš´™m›(Ÿã¤l¬±µoÀ}Ì“ÙpçÐõ_Ýô e.à:1F PUXÄ^UcÛeRf¹dau[ûSÑJ @%4'Fí ZüÝí»ßCÒ¶ÅZºc°¨¡Ýœ9š©™'›¶ž7¤™«°´K¿<Ë7Øæ\ôêo“-¯9E$OW7^öb°ecfõd‹a\ÑTÎK>Ah5m(±] ÓýLï"á’ÓìÆm»Q±Ï¨¢IžRhZk`pdff6fðc–_MY?QG‚<@0# Ã-øºé¦ÛWη­Æ¥ßŸö›šš5œD ;¦®‚·‚ÂÖÎ7ÜUêäøŠ÷á#1$=H’Q‚Y³_ûcEfhfrdV`9Z>R™H‹=O1+$Z°ùNëMÝÙÏdøP®A¦ œô™šœ Ø¥f­Ÿ¶RÁ`ÍŽÚ™è/÷þ›Á"0N<=GÀP¦Xä^NcÐeSf¹d a<[}SíIÙ>„2D%c* Ûú¥ìÌÞ|Ñûĉ¹u¯ÿ¦r ñ›£™†™‹›–Ÿq¥­¶ŒÀAÌÙÍæ;õ×P!ù.’;ÀFTP:XN^¨beÎe†dKa\ÂTŠKž@64À&Ž ›ûyíÈßÆÒŠÆ@»±\¨K¡0œH™·˜}š‹ž–¤t¬ºµGÀÎË<ØwåSóÉq@-{:KFdP|XŽ^Œb¯dýd«c©`÷[yUMÏBÀ60)•f @ü“í¿ßþÒTÇ¿¼7³´ªk£–š™Þ—­˜1œQ¢¿ªü´uÀ¢ÌÙ»å~ò‹ÿ ^)œ7EQ­Zoa(eìeSdü`²\ïW×R1MHFW=1´"Þõü”è¯Õ_Ær¼þ¸G¼vÅ÷Ò‹âÌñ­þ˜ '  tst_qsamplecache.cpp000066400000000000000000000161371225012771600342730ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qsamplecache/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include class tst_QSampleCache : public QObject { Q_OBJECT public: public slots: private slots: void testCachedSample(); void testNotCachedSample(); void testEnoughCapacity(); void testNotEnoughCapacity(); void testInvalidFile(); private: }; void tst_QSampleCache::testCachedSample() { QSampleCache cache; QSignalSpy loadingSpy(&cache, SIGNAL(isLoadingChanged())); QSample* sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); loadingSpy.clear(); QSample* sampleCached = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QCOMPARE(sample, sampleCached); // sample is cached QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); // loading thread still starts, but does nothing in this case QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sample->release(); sampleCached->release(); } void tst_QSampleCache::testNotCachedSample() { QSampleCache cache; QSignalSpy loadingSpy(&cache, SIGNAL(isLoadingChanged())); QSample* sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sample->release(); QVERIFY(!cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); } void tst_QSampleCache::testEnoughCapacity() { QSampleCache cache; QSignalSpy loadingSpy(&cache, SIGNAL(isLoadingChanged())); QSample* sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); // make sure sample is loaded QTRY_VERIFY(!cache.isLoading()); int sampleSize = sample->data().size(); sample->release(); cache.setCapacity(sampleSize * 2); QVERIFY(!cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); loadingSpy.clear(); sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sample->release(); QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); // load another sample and make sure first sample is not destroyed loadingSpy.clear(); QSample* sampleOther = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test2.wav"))); QVERIFY(sampleOther); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sampleOther->release(); QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test2.wav")))); loadingSpy.clear(); QSample* sampleCached = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QCOMPARE(sample, sampleCached); // sample is cached QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test2.wav")))); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sampleCached->release(); } void tst_QSampleCache::testNotEnoughCapacity() { QSampleCache cache; QSignalSpy loadingSpy(&cache, SIGNAL(isLoadingChanged())); QSample* sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); // make sure sample is loaded QTRY_VERIFY(!cache.isLoading()); int sampleSize = sample->data().size(); sample->release(); cache.setCapacity(sampleSize / 2); // unloads all samples QVERIFY(!cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); loadingSpy.clear(); sample = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav"))); QVERIFY(sample); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sample->release(); QVERIFY(cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); // load another sample to force sample cache to destroy first sample loadingSpy.clear(); QSample* sampleOther = cache.requestSample(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test2.wav"))); QVERIFY(sampleOther); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sampleOther->release(); QVERIFY(!cache.isCached(QUrl::fromLocalFile(QFINDTESTDATA("testdata/test.wav")))); } void tst_QSampleCache::testInvalidFile() { QSampleCache cache; QSignalSpy loadingSpy(&cache, SIGNAL(isLoadingChanged())); QSample* sample = cache.requestSample(QUrl::fromLocalFile("invalid")); QVERIFY(sample); QTRY_COMPARE(sample->state(), QSample::Error); QTRY_COMPARE(loadingSpy.count(), 2); QTRY_VERIFY(!cache.isLoading()); sample->release(); QVERIFY(!cache.isCached(QUrl::fromLocalFile("invalid"))); } QTEST_MAIN(tst_QSampleCache) #include "tst_qsamplecache.moc" qvideoencodersettingscontrol/000077500000000000000000000000001225012771600336225ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unitqvideoencodersettingscontrol.pro000066400000000000000000000003011225012771600423470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoencodersettingscontrolCONFIG += testcase TARGET = tst_qvideoencodersettingscontrol QT += multimedia-private testlib SOURCES += \ tst_qvideoencodersettingscontrol.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qvideoencodersettingscontrol.cpp000066400000000000000000000066251225012771600432420ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoencodersettingscontrol/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include "qvideoencodersettingscontrol.h" class MyVideEncoderControl: public QVideoEncoderSettingsControl { Q_OBJECT public: MyVideEncoderControl(QObject *parent = 0 ):QVideoEncoderSettingsControl(parent) { } ~MyVideEncoderControl() { } QList supportedResolutions(const QVideoEncoderSettings &settings,bool *continuous = 0) const { Q_UNUSED(settings); Q_UNUSED(continuous); return (QList()); } QList supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const { Q_UNUSED(settings); Q_UNUSED(continuous); return (QList()); } QStringList supportedVideoCodecs() const { return QStringList(); } QString videoCodecDescription(const QString &codecName) const { Q_UNUSED(codecName) return QString(); } QVideoEncoderSettings videoSettings() const { return QVideoEncoderSettings(); } void setVideoSettings(const QVideoEncoderSettings &settings) { Q_UNUSED(settings); } }; class tst_QVideoEncoderSettingsControl: public QObject { Q_OBJECT private slots: void constructor(); }; void tst_QVideoEncoderSettingsControl::constructor() { QObject parent; MyVideEncoderControl control(&parent); } QTEST_MAIN(tst_QVideoEncoderSettingsControl) #include "tst_qvideoencodersettingscontrol.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoframe/000077500000000000000000000000001225012771600301725ustar00rootroot00000000000000qvideoframe.pro000066400000000000000000000002361225012771600331400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoframeCONFIG += testcase TARGET = tst_qvideoframe QT += core multimedia-private testlib SOURCES += tst_qvideoframe.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qvideoframe.cpp000066400000000000000000001162111225012771600340150ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoframe/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include // Adds an enum, and the stringized version #define ADD_ENUM_TEST(x) \ QTest::newRow(#x) \ << QVideoFrame::x \ << QString(QLatin1String(#x)); class tst_QVideoFrame : public QObject { Q_OBJECT public: tst_QVideoFrame(); ~tst_QVideoFrame(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void create_data(); void create(); void createInvalid_data(); void createInvalid(); void createFromBuffer_data(); void createFromBuffer(); void createFromImage_data(); void createFromImage(); void createFromIncompatibleImage(); void createNull(); void destructor(); void copy_data(); void copy(); void assign_data(); void assign(); void map_data(); void map(); void mapImage_data(); void mapImage(); void imageDetach(); void formatConversion_data(); void formatConversion(); void metadata(); void debugType_data(); void debugType(); void debug_data(); void debug(); void debugFormat_data(); void debugFormat(); void isMapped(); void isReadable(); void isWritable(); }; Q_DECLARE_METATYPE(QImage::Format) class QtTestVideoBuffer : public QObject, public QAbstractVideoBuffer { Q_OBJECT public: QtTestVideoBuffer() : QAbstractVideoBuffer(NoHandle) {} explicit QtTestVideoBuffer(QAbstractVideoBuffer::HandleType type) : QAbstractVideoBuffer(type) {} MapMode mapMode() const { return NotMapped; } uchar *map(MapMode, int *, int *) { return 0; } void unmap() {} }; tst_QVideoFrame::tst_QVideoFrame() { } tst_QVideoFrame::~tst_QVideoFrame() { } void tst_QVideoFrame::initTestCase() { } void tst_QVideoFrame::cleanupTestCase() { } void tst_QVideoFrame::init() { } void tst_QVideoFrame::cleanup() { } void tst_QVideoFrame::create_data() { QTest::addColumn("size"); QTest::addColumn("pixelFormat"); QTest::addColumn("bytes"); QTest::addColumn("bytesPerLine"); QTest::newRow("64x64 ARGB32") << QSize(64, 64) << QVideoFrame::Format_ARGB32 << 16384 << 256; QTest::newRow("32x256 YUV420P") << QSize(32, 256) << QVideoFrame::Format_YUV420P << 13288 << 32; } void tst_QVideoFrame::create() { QFETCH(QSize, size); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(int, bytes); QFETCH(int, bytesPerLine); QVideoFrame frame(bytes, size, bytesPerLine, pixelFormat); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.handle(), QVariant()); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::createInvalid_data() { QTest::addColumn("size"); QTest::addColumn("pixelFormat"); QTest::addColumn("bytes"); QTest::addColumn("bytesPerLine"); QTest::newRow("64x64 ARGB32 0 size") << QSize(64, 64) << QVideoFrame::Format_ARGB32 << 0 << 45; QTest::newRow("32x256 YUV420P negative size") << QSize(32, 256) << QVideoFrame::Format_YUV420P << -13288 << 32; } void tst_QVideoFrame::createInvalid() { QFETCH(QSize, size); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(int, bytes); QFETCH(int, bytesPerLine); QVideoFrame frame(bytes, size, bytesPerLine, pixelFormat); QVERIFY(!frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.handle(), QVariant()); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::createFromBuffer_data() { QTest::addColumn("handleType"); QTest::addColumn("size"); QTest::addColumn("pixelFormat"); QTest::newRow("64x64 ARGB32 no handle") << QAbstractVideoBuffer::NoHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32; QTest::newRow("64x64 ARGB32 gl handle") << QAbstractVideoBuffer::GLTextureHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32; QTest::newRow("64x64 ARGB32 user handle") << QAbstractVideoBuffer::UserHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32; } void tst_QVideoFrame::createFromBuffer() { QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(QSize, size); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QVideoFrame frame(new QtTestVideoBuffer(handleType), size, pixelFormat); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), handleType); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::createFromImage_data() { QTest::addColumn("size"); QTest::addColumn("imageFormat"); QTest::addColumn("pixelFormat"); QTest::newRow("64x64 RGB32") << QSize(64, 64) << QImage::Format_RGB32 << QVideoFrame::Format_RGB32; QTest::newRow("12x45 RGB16") << QSize(12, 45) << QImage::Format_RGB16 << QVideoFrame::Format_RGB565; QTest::newRow("19x46 ARGB32_Premultiplied") << QSize(19, 46) << QImage::Format_ARGB32_Premultiplied << QVideoFrame::Format_ARGB32_Premultiplied; } void tst_QVideoFrame::createFromImage() { QFETCH(QSize, size); QFETCH(QImage::Format, imageFormat); QFETCH(QVideoFrame::PixelFormat, pixelFormat); const QImage image(size.width(), size.height(), imageFormat); QVideoFrame frame(image); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::createFromIncompatibleImage() { const QImage image(64, 64, QImage::Format_Mono); QVideoFrame frame(image); QVERIFY(!frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_Invalid); QCOMPARE(frame.size(), QSize(64, 64)); QCOMPARE(frame.width(), 64); QCOMPARE(frame.height(), 64); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::createNull() { // Default ctor { QVideoFrame frame; QVERIFY(!frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_Invalid); QCOMPARE(frame.size(), QSize()); QCOMPARE(frame.width(), -1); QCOMPARE(frame.height(), -1); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadOnly)); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadWrite)); QVERIFY(!frame.map(QAbstractVideoBuffer::WriteOnly)); QCOMPARE(frame.isMapped(), false); frame.unmap(); // Shouldn't crash QCOMPARE(frame.isReadable(), false); QCOMPARE(frame.isWritable(), false); } // Null buffer (shouldn't crash) { QVideoFrame frame(0, QSize(1024,768), QVideoFrame::Format_ARGB32); QVERIFY(!frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_ARGB32); QCOMPARE(frame.size(), QSize(1024, 768)); QCOMPARE(frame.width(), 1024); QCOMPARE(frame.height(), 768); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadOnly)); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadWrite)); QVERIFY(!frame.map(QAbstractVideoBuffer::WriteOnly)); QCOMPARE(frame.isMapped(), false); frame.unmap(); // Shouldn't crash QCOMPARE(frame.isReadable(), false); QCOMPARE(frame.isWritable(), false); } } void tst_QVideoFrame::destructor() { QPointer buffer = new QtTestVideoBuffer; { QVideoFrame frame(buffer, QSize(4, 1), QVideoFrame::Format_ARGB32); } QVERIFY(buffer.isNull()); } void tst_QVideoFrame::copy_data() { QTest::addColumn("handleType"); QTest::addColumn("size"); QTest::addColumn("pixelFormat"); QTest::addColumn("fieldType"); QTest::addColumn("startTime"); QTest::addColumn("endTime"); QTest::newRow("64x64 ARGB32") << QAbstractVideoBuffer::GLTextureHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32 << QVideoFrame::TopField << qint64(63641740) << qint64(63641954); QTest::newRow("64x64 ARGB32") << QAbstractVideoBuffer::GLTextureHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32 << QVideoFrame::BottomField << qint64(63641740) << qint64(63641954); QTest::newRow("32x256 YUV420P") << QAbstractVideoBuffer::UserHandle << QSize(32, 256) << QVideoFrame::Format_YUV420P << QVideoFrame::InterlacedFrame << qint64(12345) << qint64(12389); QTest::newRow("1052x756 ARGB32") << QAbstractVideoBuffer::NoHandle << QSize(1052, 756) << QVideoFrame::Format_ARGB32 << QVideoFrame::ProgressiveFrame << qint64(12345) << qint64(12389); QTest::newRow("32x256 YUV420P") << QAbstractVideoBuffer::UserHandle << QSize(32, 256) << QVideoFrame::Format_YUV420P << QVideoFrame::InterlacedFrame << qint64(12345) << qint64(12389); } void tst_QVideoFrame::copy() { QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(QSize, size); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QVideoFrame::FieldType, fieldType); QFETCH(qint64, startTime); QFETCH(qint64, endTime); QPointer buffer = new QtTestVideoBuffer(handleType); { QVideoFrame frame(buffer, size, pixelFormat); frame.setFieldType(QVideoFrame::FieldType(fieldType)); frame.setStartTime(startTime); frame.setEndTime(endTime); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), handleType); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), fieldType); QCOMPARE(frame.startTime(), startTime); QCOMPARE(frame.endTime(), endTime); { QVideoFrame otherFrame(frame); QVERIFY(!buffer.isNull()); QVERIFY(otherFrame.isValid()); QCOMPARE(otherFrame.handleType(), handleType); QCOMPARE(otherFrame.pixelFormat(), pixelFormat); QCOMPARE(otherFrame.size(), size); QCOMPARE(otherFrame.width(), size.width()); QCOMPARE(otherFrame.height(), size.height()); QCOMPARE(otherFrame.fieldType(), fieldType); QCOMPARE(otherFrame.startTime(), startTime); QCOMPARE(otherFrame.endTime(), endTime); otherFrame.setEndTime(-1); QVERIFY(!buffer.isNull()); QVERIFY(otherFrame.isValid()); QCOMPARE(otherFrame.handleType(), handleType); QCOMPARE(otherFrame.pixelFormat(), pixelFormat); QCOMPARE(otherFrame.size(), size); QCOMPARE(otherFrame.width(), size.width()); QCOMPARE(otherFrame.height(), size.height()); QCOMPARE(otherFrame.fieldType(), fieldType); QCOMPARE(otherFrame.startTime(), startTime); QCOMPARE(otherFrame.endTime(), qint64(-1)); } QVERIFY(!buffer.isNull()); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), handleType); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), fieldType); QCOMPARE(frame.startTime(), startTime); QCOMPARE(frame.endTime(), qint64(-1)); // Explicitly shared. } QVERIFY(buffer.isNull()); } void tst_QVideoFrame::assign_data() { QTest::addColumn("handleType"); QTest::addColumn("size"); QTest::addColumn("pixelFormat"); QTest::addColumn("fieldType"); QTest::addColumn("startTime"); QTest::addColumn("endTime"); QTest::newRow("64x64 ARGB32") << QAbstractVideoBuffer::GLTextureHandle << QSize(64, 64) << QVideoFrame::Format_ARGB32 << QVideoFrame::TopField << qint64(63641740) << qint64(63641954); QTest::newRow("32x256 YUV420P") << QAbstractVideoBuffer::UserHandle << QSize(32, 256) << QVideoFrame::Format_YUV420P << QVideoFrame::InterlacedFrame << qint64(12345) << qint64(12389); } void tst_QVideoFrame::assign() { QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(QSize, size); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QVideoFrame::FieldType, fieldType); QFETCH(qint64, startTime); QFETCH(qint64, endTime); QPointer buffer = new QtTestVideoBuffer(handleType); QVideoFrame frame; { QVideoFrame otherFrame(buffer, size, pixelFormat); otherFrame.setFieldType(fieldType); otherFrame.setStartTime(startTime); otherFrame.setEndTime(endTime); frame = otherFrame; QVERIFY(!buffer.isNull()); QVERIFY(otherFrame.isValid()); QCOMPARE(otherFrame.handleType(), handleType); QCOMPARE(otherFrame.pixelFormat(), pixelFormat); QCOMPARE(otherFrame.size(), size); QCOMPARE(otherFrame.width(), size.width()); QCOMPARE(otherFrame.height(), size.height()); QCOMPARE(otherFrame.fieldType(), fieldType); QCOMPARE(otherFrame.startTime(), startTime); QCOMPARE(otherFrame.endTime(), endTime); otherFrame.setStartTime(-1); QVERIFY(!buffer.isNull()); QVERIFY(otherFrame.isValid()); QCOMPARE(otherFrame.handleType(), handleType); QCOMPARE(otherFrame.pixelFormat(), pixelFormat); QCOMPARE(otherFrame.size(), size); QCOMPARE(otherFrame.width(), size.width()); QCOMPARE(otherFrame.height(), size.height()); QCOMPARE(otherFrame.fieldType(), fieldType); QCOMPARE(otherFrame.startTime(), qint64(-1)); QCOMPARE(otherFrame.endTime(), endTime); } QVERIFY(!buffer.isNull()); QVERIFY(frame.isValid()); QCOMPARE(frame.handleType(), handleType); QCOMPARE(frame.pixelFormat(), pixelFormat); QCOMPARE(frame.size(), size); QCOMPARE(frame.width(), size.width()); QCOMPARE(frame.height(), size.height()); QCOMPARE(frame.fieldType(), fieldType); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), endTime); frame = QVideoFrame(); QVERIFY(buffer.isNull()); QVERIFY(!frame.isValid()); QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_Invalid); QCOMPARE(frame.size(), QSize()); QCOMPARE(frame.width(), -1); QCOMPARE(frame.height(), -1); QCOMPARE(frame.fieldType(), QVideoFrame::ProgressiveFrame); QCOMPARE(frame.startTime(), qint64(-1)); QCOMPARE(frame.endTime(), qint64(-1)); } void tst_QVideoFrame::map_data() { QTest::addColumn("size"); QTest::addColumn("mappedBytes"); QTest::addColumn("bytesPerLine"); QTest::addColumn("pixelFormat"); QTest::addColumn("mode"); QTest::newRow("read-only") << QSize(64, 64) << 16384 << 256 << QVideoFrame::Format_ARGB32 << QAbstractVideoBuffer::ReadOnly; QTest::newRow("write-only") << QSize(64, 64) << 16384 << 256 << QVideoFrame::Format_ARGB32 << QAbstractVideoBuffer::WriteOnly; QTest::newRow("read-write") << QSize(64, 64) << 16384 << 256 << QVideoFrame::Format_ARGB32 << QAbstractVideoBuffer::ReadWrite; } void tst_QVideoFrame::map() { QFETCH(QSize, size); QFETCH(int, mappedBytes); QFETCH(int, bytesPerLine); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QAbstractVideoBuffer::MapMode, mode); QVideoFrame frame(mappedBytes, size, bytesPerLine, pixelFormat); QVERIFY(!frame.bits()); QCOMPARE(frame.mappedBytes(), 0); QCOMPARE(frame.bytesPerLine(), 0); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); QVERIFY(frame.map(mode)); // Mapping multiple times is allowed in ReadOnly mode if (mode == QAbstractVideoBuffer::ReadOnly) { const uchar *bits = frame.bits(); QVERIFY(frame.map(QAbstractVideoBuffer::ReadOnly)); QVERIFY(frame.isMapped()); QCOMPARE(frame.bits(), bits); frame.unmap(); //frame should still be mapped after the first nested unmap QVERIFY(frame.isMapped()); QCOMPARE(frame.bits(), bits); //re-mapping in Write or ReadWrite modes should fail QVERIFY(!frame.map(QAbstractVideoBuffer::WriteOnly)); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadWrite)); } else { // Mapping twice in ReadWrite or WriteOnly modes should fail, but leave it mapped (and the mode is ignored) QVERIFY(!frame.map(mode)); QVERIFY(!frame.map(QAbstractVideoBuffer::ReadOnly)); } QVERIFY(frame.bits()); QCOMPARE(frame.mappedBytes(), mappedBytes); QCOMPARE(frame.bytesPerLine(), bytesPerLine); QCOMPARE(frame.mapMode(), mode); frame.unmap(); QVERIFY(!frame.bits()); QCOMPARE(frame.mappedBytes(), 0); QCOMPARE(frame.bytesPerLine(), 0); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); } void tst_QVideoFrame::mapImage_data() { QTest::addColumn("size"); QTest::addColumn("format"); QTest::addColumn("mode"); QTest::newRow("read-only") << QSize(64, 64) << QImage::Format_ARGB32 << QAbstractVideoBuffer::ReadOnly; QTest::newRow("write-only") << QSize(15, 106) << QImage::Format_RGB32 << QAbstractVideoBuffer::WriteOnly; QTest::newRow("read-write") << QSize(23, 111) << QImage::Format_RGB16 << QAbstractVideoBuffer::ReadWrite; } void tst_QVideoFrame::mapImage() { QFETCH(QSize, size); QFETCH(QImage::Format, format); QFETCH(QAbstractVideoBuffer::MapMode, mode); QImage image(size.width(), size.height(), format); QVideoFrame frame(image); QVERIFY(!frame.bits()); QCOMPARE(frame.mappedBytes(), 0); QCOMPARE(frame.bytesPerLine(), 0); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); QVERIFY(frame.map(mode)); QVERIFY(frame.bits()); QCOMPARE(frame.mappedBytes(), image.byteCount()); QCOMPARE(frame.bytesPerLine(), image.bytesPerLine()); QCOMPARE(frame.mapMode(), mode); frame.unmap(); QVERIFY(!frame.bits()); QCOMPARE(frame.mappedBytes(), 0); QCOMPARE(frame.bytesPerLine(), 0); QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); } void tst_QVideoFrame::imageDetach() { const uint red = qRgb(255, 0, 0); const uint blue = qRgb(0, 0, 255); QImage image(8, 8, QImage::Format_RGB32); image.fill(red); QCOMPARE(image.pixel(4, 4), red); QVideoFrame frame(image); QVERIFY(frame.map(QAbstractVideoBuffer::ReadWrite)); QImage frameImage(frame.bits(), 8, 8, frame.bytesPerLine(), QImage::Format_RGB32); QCOMPARE(frameImage.pixel(4, 4), red); frameImage.fill(blue); QCOMPARE(frameImage.pixel(4, 4), blue); // Original image has detached and is therefore unchanged. QCOMPARE(image.pixel(4, 4), red); } void tst_QVideoFrame::formatConversion_data() { QTest::addColumn("imageFormat"); QTest::addColumn("pixelFormat"); QTest::newRow("QImage::Format_RGB32 | QVideoFrame::Format_RGB32") << QImage::Format_RGB32 << QVideoFrame::Format_RGB32; QTest::newRow("QImage::Format_ARGB32 | QVideoFrame::Format_ARGB32") << QImage::Format_ARGB32 << QVideoFrame::Format_ARGB32; QTest::newRow("QImage::Format_ARGB32_Premultiplied | QVideoFrame::Format_ARGB32_Premultiplied") << QImage::Format_ARGB32_Premultiplied << QVideoFrame::Format_ARGB32_Premultiplied; QTest::newRow("QImage::Format_RGB16 | QVideoFrame::Format_RGB565") << QImage::Format_RGB16 << QVideoFrame::Format_RGB565; QTest::newRow("QImage::Format_ARGB8565_Premultiplied | QVideoFrame::Format_ARGB8565_Premultiplied") << QImage::Format_ARGB8565_Premultiplied << QVideoFrame::Format_ARGB8565_Premultiplied; QTest::newRow("QImage::Format_RGB555 | QVideoFrame::Format_RGB555") << QImage::Format_RGB555 << QVideoFrame::Format_RGB555; QTest::newRow("QImage::Format_RGB888 | QVideoFrame::Format_RGB24") << QImage::Format_RGB888 << QVideoFrame::Format_RGB24; QTest::newRow("QImage::Format_MonoLSB") << QImage::Format_MonoLSB << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_Indexed8") << QImage::Format_Indexed8 << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_ARGB6666_Premultiplied") << QImage::Format_ARGB6666_Premultiplied << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_ARGB8555_Premultiplied") << QImage::Format_ARGB8555_Premultiplied << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_RGB666") << QImage::Format_RGB666 << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_RGB444") << QImage::Format_RGB444 << QVideoFrame::Format_Invalid; QTest::newRow("QImage::Format_ARGB4444_Premultiplied") << QImage::Format_ARGB4444_Premultiplied << QVideoFrame::Format_Invalid; QTest::newRow("QVideoFrame::Format_BGRA32") << QImage::Format_Invalid << QVideoFrame::Format_BGRA32; QTest::newRow("QVideoFrame::Format_BGRA32_Premultiplied") << QImage::Format_Invalid << QVideoFrame::Format_BGRA32_Premultiplied; QTest::newRow("QVideoFrame::Format_BGR32") << QImage::Format_Invalid << QVideoFrame::Format_BGR32; QTest::newRow("QVideoFrame::Format_BGR24") << QImage::Format_Invalid << QVideoFrame::Format_BGR24; QTest::newRow("QVideoFrame::Format_BGR565") << QImage::Format_Invalid << QVideoFrame::Format_BGR565; QTest::newRow("QVideoFrame::Format_BGR555") << QImage::Format_Invalid << QVideoFrame::Format_BGR555; QTest::newRow("QVideoFrame::Format_BGRA5658_Premultiplied") << QImage::Format_Invalid << QVideoFrame::Format_BGRA5658_Premultiplied; QTest::newRow("QVideoFrame::Format_AYUV444") << QImage::Format_Invalid << QVideoFrame::Format_AYUV444; QTest::newRow("QVideoFrame::Format_AYUV444_Premultiplied") << QImage::Format_Invalid << QVideoFrame::Format_AYUV444_Premultiplied; QTest::newRow("QVideoFrame::Format_YUV444") << QImage::Format_Invalid << QVideoFrame::Format_YUV444; QTest::newRow("QVideoFrame::Format_YUV420P") << QImage::Format_Invalid << QVideoFrame::Format_YUV420P; QTest::newRow("QVideoFrame::Format_YV12") << QImage::Format_Invalid << QVideoFrame::Format_YV12; QTest::newRow("QVideoFrame::Format_UYVY") << QImage::Format_Invalid << QVideoFrame::Format_UYVY; QTest::newRow("QVideoFrame::Format_YUYV") << QImage::Format_Invalid << QVideoFrame::Format_YUYV; QTest::newRow("QVideoFrame::Format_NV12") << QImage::Format_Invalid << QVideoFrame::Format_NV12; QTest::newRow("QVideoFrame::Format_NV21") << QImage::Format_Invalid << QVideoFrame::Format_NV21; QTest::newRow("QVideoFrame::Format_IMC1") << QImage::Format_Invalid << QVideoFrame::Format_IMC1; QTest::newRow("QVideoFrame::Format_IMC2") << QImage::Format_Invalid << QVideoFrame::Format_IMC2; QTest::newRow("QVideoFrame::Format_IMC3") << QImage::Format_Invalid << QVideoFrame::Format_IMC3; QTest::newRow("QVideoFrame::Format_IMC4") << QImage::Format_Invalid << QVideoFrame::Format_IMC4; QTest::newRow("QVideoFrame::Format_Y8") << QImage::Format_Invalid << QVideoFrame::Format_Y8; QTest::newRow("QVideoFrame::Format_Y16") << QImage::Format_Invalid << QVideoFrame::Format_Y16; QTest::newRow("QVideoFrame::Format_Jpeg") << QImage::Format_Invalid << QVideoFrame::Format_Jpeg; QTest::newRow("QVideoFrame::Format_CameraRaw") << QImage::Format_Invalid << QVideoFrame::Format_CameraRaw; QTest::newRow("QVideoFrame::Format_AdobeDng") << QImage::Format_Invalid << QVideoFrame::Format_AdobeDng; QTest::newRow("QVideoFrame::Format_User") << QImage::Format_Invalid << QVideoFrame::Format_User; QTest::newRow("QVideoFrame::Format_User + 1") << QImage::Format_Invalid << QVideoFrame::PixelFormat(QVideoFrame::Format_User + 1); } void tst_QVideoFrame::formatConversion() { QFETCH(QImage::Format, imageFormat); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QCOMPARE(QVideoFrame::pixelFormatFromImageFormat(imageFormat) == pixelFormat, imageFormat != QImage::Format_Invalid); QCOMPARE(QVideoFrame::imageFormatFromPixelFormat(pixelFormat) == imageFormat, pixelFormat != QVideoFrame::Format_Invalid); } void tst_QVideoFrame::metadata() { // Simple metadata test QVideoFrame f; QCOMPARE(f.availableMetaData(), QVariantMap()); f.setMetaData("frob", QVariant("string")); f.setMetaData("bar", QVariant(42)); QCOMPARE(f.metaData("frob"), QVariant("string")); QCOMPARE(f.metaData("bar"), QVariant(42)); QVariantMap map; map.insert("frob", QVariant("string")); map.insert("bar", QVariant(42)); QCOMPARE(f.availableMetaData(), map); f.setMetaData("frob", QVariant(56)); QCOMPARE(f.metaData("frob"), QVariant(56)); f.setMetaData("frob", QVariant()); QCOMPARE(f.metaData("frob"), QVariant()); QCOMPARE(f.availableMetaData().count(), 1); f.setMetaData("frob", QVariant("")); // empty but not null QCOMPARE(f.availableMetaData().count(), 2); } #define TEST_MAPPED(frame, mode) \ do { \ QVERIFY(frame.bits()); \ QVERIFY(frame.isMapped()); \ QCOMPARE(frame.mappedBytes(), 16384); \ QCOMPARE(frame.bytesPerLine(), 256); \ QCOMPARE(frame.mapMode(), mode); \ } while (0) #define TEST_UNMAPPED(frame) \ do { \ QVERIFY(!frame.bits()); \ QVERIFY(!frame.isMapped()); \ QCOMPARE(frame.mappedBytes(), 0); \ QCOMPARE(frame.bytesPerLine(), 0); \ QCOMPARE(frame.mapMode(), QAbstractVideoBuffer::NotMapped); \ } while (0) void tst_QVideoFrame::isMapped() { QVideoFrame frame(16384, QSize(64, 64), 256, QVideoFrame::Format_ARGB32); const QVideoFrame& constFrame(frame); TEST_UNMAPPED(frame); TEST_UNMAPPED(constFrame); QVERIFY(frame.map(QAbstractVideoBuffer::ReadOnly)); TEST_MAPPED(frame, QAbstractVideoBuffer::ReadOnly); TEST_MAPPED(constFrame, QAbstractVideoBuffer::ReadOnly); frame.unmap(); TEST_UNMAPPED(frame); TEST_UNMAPPED(constFrame); QVERIFY(frame.map(QAbstractVideoBuffer::WriteOnly)); TEST_MAPPED(frame, QAbstractVideoBuffer::WriteOnly); TEST_MAPPED(constFrame, QAbstractVideoBuffer::WriteOnly); frame.unmap(); TEST_UNMAPPED(frame); TEST_UNMAPPED(constFrame); QVERIFY(frame.map(QAbstractVideoBuffer::ReadWrite)); TEST_MAPPED(frame, QAbstractVideoBuffer::ReadWrite); TEST_MAPPED(constFrame, QAbstractVideoBuffer::ReadWrite); frame.unmap(); TEST_UNMAPPED(frame); TEST_UNMAPPED(constFrame); } void tst_QVideoFrame::isReadable() { QVideoFrame frame(16384, QSize(64, 64), 256, QVideoFrame::Format_ARGB32); QVERIFY(!frame.isMapped()); QVERIFY(!frame.isReadable()); QVERIFY(frame.map(QAbstractVideoBuffer::ReadOnly)); QVERIFY(frame.isMapped()); QVERIFY(frame.isReadable()); frame.unmap(); QVERIFY(frame.map(QAbstractVideoBuffer::WriteOnly)); QVERIFY(frame.isMapped()); QVERIFY(!frame.isReadable()); frame.unmap(); QVERIFY(frame.map(QAbstractVideoBuffer::ReadWrite)); QVERIFY(frame.isMapped()); QVERIFY(frame.isReadable()); frame.unmap(); } void tst_QVideoFrame::isWritable() { QVideoFrame frame(16384, QSize(64, 64), 256, QVideoFrame::Format_ARGB32); QVERIFY(!frame.isMapped()); QVERIFY(!frame.isWritable()); QVERIFY(frame.map(QAbstractVideoBuffer::ReadOnly)); QVERIFY(frame.isMapped()); QVERIFY(!frame.isWritable()); frame.unmap(); QVERIFY(frame.map(QAbstractVideoBuffer::WriteOnly)); QVERIFY(frame.isMapped()); QVERIFY(frame.isWritable()); frame.unmap(); QVERIFY(frame.map(QAbstractVideoBuffer::ReadWrite)); QVERIFY(frame.isMapped()); QVERIFY(frame.isWritable()); frame.unmap(); } void tst_QVideoFrame::debugType_data() { QTest::addColumn("fieldType"); QTest::addColumn("stringized"); ADD_ENUM_TEST(ProgressiveFrame); ADD_ENUM_TEST(InterlacedFrame); ADD_ENUM_TEST(TopField); ADD_ENUM_TEST(BottomField); } void tst_QVideoFrame::debugType() { QFETCH(QVideoFrame::FieldType, fieldType); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << fieldType; } void tst_QVideoFrame::debug_data() { QTest::addColumn("frame"); QTest::addColumn("stringized"); QVideoFrame f; QTest::newRow("default") << f << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, [no timestamp])"); QVideoFrame f2; f2.setStartTime(12345); f2.setEndTime(8000000000LL); QTest::newRow("times") << f2 << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, 0:00:00.12345 - 2:13:20.00)"); QVideoFrame f3; f3.setFieldType(QVideoFrame::ProgressiveFrame); QTest::newRow("times prog") << f3 << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, [no timestamp])"); QVideoFrame f4; f4.setFieldType(QVideoFrame::TopField); QTest::newRow("times top") << f4 << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, [no timestamp])"); QVideoFrame f5; f5.setFieldType(QVideoFrame::TopField); f5.setEndTime(90000000000LL); QTest::newRow("end but no start") << f5 << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, [no timestamp])"); QVideoFrame f6; f6.setStartTime(12345000000LL); f6.setEndTime(80000000000LL); QTest::newRow("times big") << f6 << QString::fromLatin1("QVideoFrame(QSize(-1, -1) , Format_Invalid, NoHandle, NotMapped, 3:25:45.00 - 22:13:20.00)"); QVideoFrame g(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); QTest::newRow("more valid") << g << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, [no timestamp])"); QVideoFrame g2(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g2.setStartTime(9000000000LL); g2.setEndTime(9000000000LL); QTest::newRow("more valid") << g2 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, @2:30:00.00)"); QVideoFrame g3(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g3.setStartTime(900000LL); g3.setEndTime(900000LL); QTest::newRow("more valid single timestamp") << g3 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, @00:00.900000)"); QVideoFrame g4(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g4.setStartTime(200000000LL); g4.setEndTime(300000000LL); QTest::newRow("more valid") << g4 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, 03:20.00 - 05:00.00)"); QVideoFrame g5(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g5.setStartTime(200000000LL); QTest::newRow("more valid until forever") << g5 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, 03:20.00 - forever)"); QVideoFrame g6(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g6.setStartTime(9000000000LL); QTest::newRow("more valid for long forever") << g6 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, 2:30:00.00 - forever)"); QVideoFrame g7(0, QSize(320,240), 640, QVideoFrame::Format_ARGB32); g7.setStartTime(9000000000LL); g7.setMetaData("bar", 42); QTest::newRow("more valid for long forever + metadata") << g7 << QString::fromLatin1("QVideoFrame(QSize(320, 240) , Format_ARGB32, NoHandle, NotMapped, 2:30:00.00 - forever, metaData: QMap((\"bar\", QVariant(int, 42) ) ) )"); } void tst_QVideoFrame::debug() { QFETCH(QVideoFrame, frame); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << frame; } void tst_QVideoFrame::debugFormat_data() { QTest::addColumn("format"); QTest::addColumn("stringized"); ADD_ENUM_TEST(Format_Invalid); ADD_ENUM_TEST(Format_ARGB32); ADD_ENUM_TEST(Format_ARGB32_Premultiplied); ADD_ENUM_TEST(Format_RGB32); ADD_ENUM_TEST(Format_RGB24); ADD_ENUM_TEST(Format_RGB565); ADD_ENUM_TEST(Format_RGB555); ADD_ENUM_TEST(Format_ARGB8565_Premultiplied); ADD_ENUM_TEST(Format_BGRA32); ADD_ENUM_TEST(Format_BGRA32_Premultiplied); ADD_ENUM_TEST(Format_BGR32); ADD_ENUM_TEST(Format_BGR24); ADD_ENUM_TEST(Format_BGR565); ADD_ENUM_TEST(Format_BGR555); ADD_ENUM_TEST(Format_BGRA5658_Premultiplied); ADD_ENUM_TEST(Format_AYUV444); ADD_ENUM_TEST(Format_AYUV444_Premultiplied); ADD_ENUM_TEST(Format_YUV444); ADD_ENUM_TEST(Format_YUV420P); ADD_ENUM_TEST(Format_YV12); ADD_ENUM_TEST(Format_UYVY); ADD_ENUM_TEST(Format_YUYV); ADD_ENUM_TEST(Format_NV12); ADD_ENUM_TEST(Format_NV21); ADD_ENUM_TEST(Format_IMC1); ADD_ENUM_TEST(Format_IMC2); ADD_ENUM_TEST(Format_IMC3); ADD_ENUM_TEST(Format_IMC4); ADD_ENUM_TEST(Format_Y8); ADD_ENUM_TEST(Format_Y16); ADD_ENUM_TEST(Format_Jpeg); ADD_ENUM_TEST(Format_CameraRaw); ADD_ENUM_TEST(Format_AdobeDng); // User enums are formatted differently QTest::newRow("user 1000") << QVideoFrame::Format_User << QString::fromLatin1("UserType(1000)"); QTest::newRow("user 1005") << QVideoFrame::PixelFormat(QVideoFrame::Format_User + 5) << QString::fromLatin1("UserType(1005)"); } void tst_QVideoFrame::debugFormat() { QFETCH(QVideoFrame::PixelFormat, format); QFETCH(QString, stringized); QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << format; } QTEST_MAIN(tst_QVideoFrame) #include "tst_qvideoframe.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoprobe/000077500000000000000000000000001225012771600302075ustar00rootroot00000000000000qvideoprobe.pro000066400000000000000000000005001225012771600331640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoprobeCONFIG += testcase no_private_qt_headers_warning TARGET = tst_qvideoprobe QT += multimedia-private testlib SOURCES += tst_qvideoprobe.cpp include (../qmultimedia_common/mock.pri) include (../qmultimedia_common/mockrecorder.pri) include (../qmultimedia_common/mockplayer.pri) DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qvideoprobe.cpp000066400000000000000000000127321225012771600340520ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideoprobe/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include //TESTED_COMPONENT=src/multimedia #include "mockmediaserviceprovider.h" #include "mockmediarecorderservice.h" #include "mockmediaplayerservice.h" #include "mockmediaobject.h" QT_USE_NAMESPACE class tst_QVideoProbe: public QObject { Q_OBJECT public slots: void init(); void cleanup(); private slots: void testNullService(); void testPlayer(); void testPlayerDeleteRecorder(); void testPlayerDeleteProbe(); void testRecorder(); private: QMediaPlayer *player; MockMediaPlayerService *mockMediaPlayerService; MockMediaServiceProvider *mockProvider; MockMediaRecorderControl *mockMediaRecorderControl; MockMediaRecorderService *mockMediaRecorderService; MockMediaServiceProvider *mockProviderRecorder; }; void tst_QVideoProbe::init() { mockMediaPlayerService = new MockMediaPlayerService(); mockProvider = new MockMediaServiceProvider(mockMediaPlayerService); mockProvider->deleteServiceOnRelease = true; player = 0; mockMediaRecorderControl = new MockMediaRecorderControl(this); mockMediaRecorderService = new MockMediaRecorderService(this, mockMediaRecorderControl); mockProviderRecorder = new MockMediaServiceProvider(mockMediaRecorderService); mockProviderRecorder->deleteServiceOnRelease = true; QMediaServiceProvider::setDefaultServiceProvider(mockProvider); } void tst_QVideoProbe::cleanup() { delete player; delete mockProvider; mockMediaPlayerService = 0; mockProvider = 0; player = 0; delete mockMediaRecorderControl; delete mockProviderRecorder; mockMediaRecorderControl = 0; mockMediaRecorderService = 0; mockProviderRecorder = 0; } void tst_QVideoProbe::testNullService() { mockProvider->service = 0; player = new QMediaPlayer; QVERIFY(!player->isAvailable()); QCOMPARE(player->availability(), QMultimedia::ServiceMissing); QVideoProbe probe; QVERIFY(!probe.isActive()); QVERIFY(!probe.setSource(player)); QVERIFY(!probe.isActive()); delete player; player = 0; QVERIFY(!probe.isActive()); } void tst_QVideoProbe::testPlayer() { player = new QMediaPlayer; QVERIFY(player->isAvailable()); QVideoProbe probe; QVERIFY(!probe.isActive()); QVERIFY(probe.setSource(player)); QVERIFY(probe.isActive()); probe.setSource((QMediaPlayer*)0); QVERIFY(!probe.isActive()); } void tst_QVideoProbe::testPlayerDeleteRecorder() { player = new QMediaPlayer; QVERIFY(player->isAvailable()); QVideoProbe probe; QVERIFY(!probe.isActive()); QVERIFY(probe.setSource(player)); QVERIFY(probe.isActive()); delete player; player = 0; QVERIFY(!probe.isActive()); probe.setSource((QMediaPlayer*)0); QVERIFY(!probe.isActive()); } void tst_QVideoProbe::testPlayerDeleteProbe() { player = new QMediaPlayer; QVERIFY(player->isAvailable()); QVideoProbe *probe = new QVideoProbe; QVERIFY(!probe->isActive()); QVERIFY(probe->setSource(player)); QVERIFY(probe->isActive()); delete probe; QVERIFY(player->isAvailable()); } void tst_QVideoProbe::testRecorder() { QMediaServiceProvider::setDefaultServiceProvider(mockProviderRecorder); QAudioRecorder recorder; QVERIFY(recorder.isAvailable()); QVideoProbe probe; QVERIFY(!probe.isActive()); QVERIFY(!probe.setSource(&recorder)); // No QMediaVideoProbeControl available QVERIFY(!probe.isActive()); } QTEST_GUILESS_MAIN(tst_QVideoProbe) #include "tst_qvideoprobe.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideosurfaceformat/000077500000000000000000000000001225012771600317415ustar00rootroot00000000000000qvideosurfaceformat.pro000066400000000000000000000002561225012771600364600ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideosurfaceformatCONFIG += testcase TARGET = tst_qvideosurfaceformat QT += core multimedia-private testlib SOURCES += tst_qvideosurfaceformat.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qvideosurfaceformat.cpp000066400000000000000000001035621225012771600373400ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideosurfaceformat/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include // Adds an enum, and the stringized version #define ADD_ENUM_TEST(x) \ QTest::newRow(#x) \ << QVideoSurfaceFormat::x \ << QString(QLatin1String(#x)); class tst_QVideoSurfaceFormat : public QObject { Q_OBJECT public: tst_QVideoSurfaceFormat(); ~tst_QVideoSurfaceFormat(); public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void constructNull(); void construct_data(); void construct(); void frameSize_data(); void frameSize(); void viewport_data(); void viewport(); void scanLineDirection_data(); void scanLineDirection(); void frameRate_data(); void frameRate(); void pixelAspectRatio_data(); void pixelAspectRatio(); void sizeHint_data(); void sizeHint(); void yCbCrColorSpaceEnum_data(); void yCbCrColorSpaceEnum (); void staticPropertyNames(); void dynamicProperty(); void compare(); void copy(); void assign(); void isValid(); void copyAllParameters (); void assignAllParameters (); void propertyEdgeCases(); void debugOperator(); void debugOperator_data(); }; tst_QVideoSurfaceFormat::tst_QVideoSurfaceFormat() { } tst_QVideoSurfaceFormat::~tst_QVideoSurfaceFormat() { } void tst_QVideoSurfaceFormat::initTestCase() { } void tst_QVideoSurfaceFormat::cleanupTestCase() { } void tst_QVideoSurfaceFormat::init() { } void tst_QVideoSurfaceFormat::cleanup() { } void tst_QVideoSurfaceFormat::constructNull() { QVideoSurfaceFormat format; QVERIFY(!format.isValid()); QCOMPARE(format.handleType(), QAbstractVideoBuffer::NoHandle); QCOMPARE(format.pixelFormat(), QVideoFrame::Format_Invalid); QCOMPARE(format.frameSize(), QSize()); QCOMPARE(format.frameWidth(), -1); QCOMPARE(format.frameHeight(), -1); QCOMPARE(format.viewport(), QRect()); QCOMPARE(format.scanLineDirection(), QVideoSurfaceFormat::TopToBottom); QCOMPARE(format.frameRate(), 0.0); QCOMPARE(format.pixelAspectRatio(), QSize(1, 1)); QCOMPARE(format.yCbCrColorSpace(), QVideoSurfaceFormat::YCbCr_Undefined); } void tst_QVideoSurfaceFormat::construct_data() { QTest::addColumn("frameSize"); QTest::addColumn("pixelFormat"); QTest::addColumn("handleType"); QTest::addColumn("valid"); QTest::newRow("32x32 rgb32 no handle") << QSize(32, 32) << QVideoFrame::Format_RGB32 << QAbstractVideoBuffer::NoHandle << true; QTest::newRow("1024x768 YUV444 GL texture") << QSize(32, 32) << QVideoFrame::Format_YUV444 << QAbstractVideoBuffer::GLTextureHandle << true; QTest::newRow("32x32 invalid no handle") << QSize(32, 32) << QVideoFrame::Format_Invalid << QAbstractVideoBuffer::NoHandle << false; QTest::newRow("invalid size, rgb32 no handle") << QSize() << QVideoFrame::Format_RGB32 << QAbstractVideoBuffer::NoHandle << false; QTest::newRow("0x0 rgb32 no handle") << QSize(0,0) << QVideoFrame::Format_RGB32 << QAbstractVideoBuffer::NoHandle << true; } void tst_QVideoSurfaceFormat::construct() { QFETCH(QSize, frameSize); QFETCH(QVideoFrame::PixelFormat, pixelFormat); QFETCH(QAbstractVideoBuffer::HandleType, handleType); QFETCH(bool, valid); QRect viewport(QPoint(0, 0), frameSize); QVideoSurfaceFormat format(frameSize, pixelFormat, handleType); QCOMPARE(format.handleType(), handleType); QCOMPARE(format.property("handleType").value(), handleType); QCOMPARE(format.pixelFormat(), pixelFormat); QCOMPARE(format.property("pixelFormat").value(), pixelFormat); QCOMPARE(format.frameSize(), frameSize); QCOMPARE(format.frameWidth(), frameSize.width()); QCOMPARE(format.property("frameWidth").toInt(), frameSize.width()); QCOMPARE(format.frameHeight(), frameSize.height()); QCOMPARE(format.property("frameHeight").toInt(), frameSize.height()); QCOMPARE(format.isValid(), valid); QCOMPARE(format.viewport(), viewport); QCOMPARE(format.scanLineDirection(), QVideoSurfaceFormat::TopToBottom); QCOMPARE(format.frameRate(), 0.0); QCOMPARE(format.pixelAspectRatio(), QSize(1, 1)); QCOMPARE(format.yCbCrColorSpace(), QVideoSurfaceFormat::YCbCr_Undefined); } void tst_QVideoSurfaceFormat::frameSize_data() { QTest::addColumn("initialSize"); QTest::addColumn("newSize"); QTest::newRow("grow") << QSize(64, 64) << QSize(1024, 1024); QTest::newRow("shrink") << QSize(1024, 1024) << QSize(64, 64); QTest::newRow("unchanged") << QSize(512, 512) << QSize(512, 512); } void tst_QVideoSurfaceFormat::frameSize() { QFETCH(QSize, initialSize); QFETCH(QSize, newSize); { QVideoSurfaceFormat format(initialSize, QVideoFrame::Format_RGB32); format.setFrameSize(newSize); QCOMPARE(format.frameSize(), newSize); QCOMPARE(format.property("frameSize").toSize(), newSize); QCOMPARE(format.frameWidth(), newSize.width()); QCOMPARE(format.property("frameWidth").toInt(), newSize.width()); QCOMPARE(format.frameHeight(), newSize.height()); QCOMPARE(format.property("frameHeight").toInt(), newSize.height()); } { QVideoSurfaceFormat format(initialSize, QVideoFrame::Format_RGB32); format.setProperty("frameSize", newSize); QCOMPARE(format.frameSize(), newSize); QCOMPARE(format.property("frameSize").toSize(), newSize); QCOMPARE(format.frameWidth(), newSize.width()); QCOMPARE(format.property("frameWidth").toInt(), newSize.width()); QCOMPARE(format.frameHeight(), newSize.height()); QCOMPARE(format.property("frameHeight").toInt(), newSize.height()); } } void tst_QVideoSurfaceFormat::viewport_data() { QTest::addColumn("initialSize"); QTest::addColumn("viewport"); QTest::addColumn("newSize"); QTest::addColumn("expectedViewport"); QTest::newRow("grow reset") << QSize(64, 64) << QRect(8, 8, 48, 48) << QSize(1024, 1024) << QRect(0, 0, 1024, 1024); QTest::newRow("shrink reset") << QSize(1024, 1024) << QRect(8, 8, 1008, 1008) << QSize(64, 64) << QRect(0, 0, 64, 64); QTest::newRow("unchanged reset") << QSize(512, 512) << QRect(8, 8, 496, 496) << QSize(512, 512) << QRect(0, 0, 512, 512); } void tst_QVideoSurfaceFormat::viewport() { QFETCH(QSize, initialSize); QFETCH(QRect, viewport); QFETCH(QSize, newSize); QFETCH(QRect, expectedViewport); { QRect initialViewport(QPoint(0, 0), initialSize); QVideoSurfaceFormat format(initialSize, QVideoFrame::Format_RGB32); format.setViewport(viewport); QCOMPARE(format.viewport(), viewport); QCOMPARE(format.property("viewport").toRect(), viewport); format.setFrameSize(newSize); QCOMPARE(format.viewport(), expectedViewport); QCOMPARE(format.property("viewport").toRect(), expectedViewport); } { QVideoSurfaceFormat format(initialSize, QVideoFrame::Format_RGB32); format.setProperty("viewport", viewport); QCOMPARE(format.viewport(), viewport); QCOMPARE(format.property("viewport").toRect(), viewport); } } void tst_QVideoSurfaceFormat::scanLineDirection_data() { QTest::addColumn("direction"); QTest::addColumn("stringized"); ADD_ENUM_TEST(TopToBottom); ADD_ENUM_TEST(BottomToTop); } void tst_QVideoSurfaceFormat::scanLineDirection() { QFETCH(QVideoSurfaceFormat::Direction, direction); QFETCH(QString, stringized); { QVideoSurfaceFormat format(QSize(16, 16), QVideoFrame::Format_RGB32); format.setScanLineDirection(direction); QCOMPARE(format.scanLineDirection(), direction); QCOMPARE( qvariant_cast(format.property("scanLineDirection")), direction); } { QVideoSurfaceFormat format(QSize(16, 16), QVideoFrame::Format_RGB32); format.setProperty("scanLineDirection", qVariantFromValue(direction)); QCOMPARE(format.scanLineDirection(), direction); QCOMPARE( qvariant_cast(format.property("scanLineDirection")), direction); } QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << direction; } void tst_QVideoSurfaceFormat::yCbCrColorSpaceEnum_data() { QTest::addColumn("colorspace"); QTest::addColumn("stringized"); ADD_ENUM_TEST(YCbCr_BT601); ADD_ENUM_TEST(YCbCr_BT709); ADD_ENUM_TEST(YCbCr_xvYCC601); ADD_ENUM_TEST(YCbCr_xvYCC709); ADD_ENUM_TEST(YCbCr_JPEG); ADD_ENUM_TEST(YCbCr_CustomMatrix); ADD_ENUM_TEST(YCbCr_Undefined); } /* Test case for Enum YCbCr_BT601, YCbCr_xvYCC709 */ void tst_QVideoSurfaceFormat::yCbCrColorSpaceEnum() { QFETCH(QVideoSurfaceFormat::YCbCrColorSpace, colorspace); QFETCH(QString, stringized); { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setYCbCrColorSpace(colorspace); QCOMPARE(format.yCbCrColorSpace(), colorspace); QCOMPARE(qvariant_cast(format.property("yCbCrColorSpace")), colorspace); } { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setProperty("yCbCrColorSpace", qVariantFromValue(colorspace)); QCOMPARE(format.yCbCrColorSpace(), colorspace); QCOMPARE(qvariant_cast(format.property("yCbCrColorSpace")), colorspace); } QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData()); qDebug() << colorspace; } void tst_QVideoSurfaceFormat::frameRate_data() { QTest::addColumn("frameRate"); QTest::newRow("null") << qreal(0.0); QTest::newRow("1/1") << qreal(1.0); QTest::newRow("24/1") << qreal(24.0); QTest::newRow("15/2") << qreal(7.5); } void tst_QVideoSurfaceFormat::frameRate() { QFETCH(qreal, frameRate); { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setFrameRate(frameRate); QCOMPARE(format.frameRate(), frameRate); QCOMPARE(qvariant_cast(format.property("frameRate")), frameRate); } { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setFrameRate(frameRate); format.setProperty("frameRate", frameRate); QCOMPARE(format.frameRate(), frameRate); QCOMPARE(qvariant_cast(format.property("frameRate")), frameRate); } } void tst_QVideoSurfaceFormat::pixelAspectRatio_data() { QTest::addColumn("aspectRatio"); QTest::newRow("1:1") << QSize(1, 1); QTest::newRow("4:3") << QSize(4, 3); QTest::newRow("16:9") << QSize(16, 9); } void tst_QVideoSurfaceFormat::pixelAspectRatio() { QFETCH(QSize, aspectRatio); { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setPixelAspectRatio(aspectRatio); QCOMPARE(format.pixelAspectRatio(), aspectRatio); QCOMPARE(format.property("pixelAspectRatio").toSize(), aspectRatio); } { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setPixelAspectRatio(aspectRatio.width(), aspectRatio.height()); QCOMPARE(format.pixelAspectRatio(), aspectRatio); QCOMPARE(format.property("pixelAspectRatio").toSize(), aspectRatio); } { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); format.setProperty("pixelAspectRatio", aspectRatio); QCOMPARE(format.pixelAspectRatio(), aspectRatio); QCOMPARE(format.property("pixelAspectRatio").toSize(), aspectRatio); } } void tst_QVideoSurfaceFormat::sizeHint_data() { QTest::addColumn("frameSize"); QTest::addColumn("viewport"); QTest::addColumn("aspectRatio"); QTest::addColumn("sizeHint"); QTest::newRow("(0, 0, 1024x768), 1:1") << QSize(1024, 768) << QRect(0, 0, 1024, 768) << QSize(1, 1) << QSize(1024, 768); QTest::newRow("0, 0, 1024x768), 4:3") << QSize(1024, 768) << QRect(0, 0, 1024, 768) << QSize(4, 3) << QSize(1365, 768); QTest::newRow("(168, 84, 800x600), 1:1") << QSize(1024, 768) << QRect(168, 84, 800, 600) << QSize(1, 1) << QSize(800, 600); QTest::newRow("(168, 84, 800x600), 4:3") << QSize(1024, 768) << QRect(168, 84, 800, 600) << QSize(4, 3) << QSize(1066, 600); QTest::newRow("(168, 84, 800x600), 4:0") << QSize(1024, 768) << QRect(168, 84, 800, 600) << QSize(4, 0) << QSize(800, 600); } void tst_QVideoSurfaceFormat::sizeHint() { QFETCH(QSize, frameSize); QFETCH(QRect, viewport); QFETCH(QSize, aspectRatio); QFETCH(QSize, sizeHint); QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_RGB32); format.setViewport(viewport); format.setPixelAspectRatio(aspectRatio); QCOMPARE(format.sizeHint(), sizeHint); QCOMPARE(format.property("sizeHint").toSize(), sizeHint); } void tst_QVideoSurfaceFormat::staticPropertyNames() { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); QList propertyNames = format.propertyNames(); QVERIFY(propertyNames.contains("handleType")); QVERIFY(propertyNames.contains("pixelFormat")); QVERIFY(propertyNames.contains("frameSize")); QVERIFY(propertyNames.contains("frameWidth")); QVERIFY(propertyNames.contains("viewport")); QVERIFY(propertyNames.contains("scanLineDirection")); QVERIFY(propertyNames.contains("frameRate")); QVERIFY(propertyNames.contains("pixelAspectRatio")); QVERIFY(propertyNames.contains("yCbCrColorSpace")); QVERIFY(propertyNames.contains("sizeHint")); QCOMPARE(propertyNames.count(), 10); } void tst_QVideoSurfaceFormat::dynamicProperty() { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); QCOMPARE(format.property("integer"), QVariant()); QCOMPARE(format.property("size"), QVariant()); QCOMPARE(format.property("string"), QVariant()); QCOMPARE(format.property("null"), QVariant()); QList propertyNames = format.propertyNames(); QCOMPARE(propertyNames.count(QByteArray("integer")), 0); QCOMPARE(propertyNames.count(QByteArray("string")), 0); QCOMPARE(propertyNames.count(QByteArray("size")), 0); QCOMPARE(propertyNames.count(QByteArray("null")), 0); format.setProperty("string", QString::fromLatin1("Hello")); format.setProperty("integer", 198); format.setProperty("size", QSize(43, 65)); QCOMPARE(format.property("integer").toInt(), 198); QCOMPARE(format.property("size").toSize(), QSize(43, 65)); QCOMPARE(format.property("string").toString(), QString::fromLatin1("Hello")); propertyNames = format.propertyNames(); QCOMPARE(propertyNames.count(QByteArray("integer")), 1); QCOMPARE(propertyNames.count(QByteArray("string")), 1); QCOMPARE(propertyNames.count(QByteArray("size")), 1); format.setProperty("integer", 125423); format.setProperty("size", QSize(1, 986)); QCOMPARE(format.property("integer").toInt(), 125423); QCOMPARE(format.property("size").toSize(), QSize(1, 986)); QCOMPARE(format.property("string").toString(), QString::fromLatin1("Hello")); propertyNames = format.propertyNames(); QCOMPARE(propertyNames.count(QByteArray("integer")), 1); QCOMPARE(propertyNames.count(QByteArray("string")), 1); QCOMPARE(propertyNames.count(QByteArray("size")), 1); format.setProperty("string", QVariant()); format.setProperty("size", QVariant()); format.setProperty("null", QVariant()); QCOMPARE(format.property("integer").toInt(), 125423); QCOMPARE(format.property("size"), QVariant()); QCOMPARE(format.property("string"), QVariant()); QCOMPARE(format.property("null"), QVariant()); propertyNames = format.propertyNames(); QCOMPARE(propertyNames.count(QByteArray("integer")), 1); QCOMPARE(propertyNames.count(QByteArray("string")), 0); QCOMPARE(propertyNames.count(QByteArray("size")), 0); QCOMPARE(propertyNames.count(QByteArray("null")), 0); } void tst_QVideoSurfaceFormat::compare() { QVideoSurfaceFormat format1( QSize(16, 16), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); QVideoSurfaceFormat format2( QSize(16, 16), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); QVideoSurfaceFormat format3( QSize(32, 32), QVideoFrame::Format_YUV444, QAbstractVideoBuffer::GLTextureHandle); QVideoSurfaceFormat format4( QSize(16, 16), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::UserHandle); QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); QCOMPARE(format1 == format3, false); QCOMPARE(format1 != format3, true); QCOMPARE(format1 == format4, false); QCOMPARE(format1 != format4, true); format2.setFrameSize(1024, 768); // Not equal, frame size differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format1.setFrameSize(1024, 768); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format1.setViewport(QRect(0, 0, 800, 600)); format2.setViewport(QRect(112, 84, 800, 600)); // Not equal, viewports differ. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format1.setViewport(QRect(112, 84, 800, 600)); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format2.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); // Not equal scan line direction differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format1.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format1.setFrameRate(7.5); // Not equal frame rate differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format2.setFrameRate(qreal(7.50001)); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format2.setPixelAspectRatio(4, 3); // Not equal pixel aspect ratio differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format1.setPixelAspectRatio(QSize(4, 3)); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format2.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_xvYCC601); // Not equal yuv color space differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format1.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_xvYCC601); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format1.setProperty("integer", 12); // Not equal, property mismatch. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format2.setProperty("integer", 45); // Not equal, integer differs. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format2.setProperty("integer", 12); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format1.setProperty("string", QString::fromLatin1("Hello")); format2.setProperty("size", QSize(12, 54)); // Not equal, property mismatch. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); format2.setProperty("string", QString::fromLatin1("Hello")); format1.setProperty("size", QSize(12, 54)); // Equal. QCOMPARE(format1 == format2, true); QCOMPARE(format1 != format2, false); format1.setProperty("string", QVariant()); // Not equal, property mismatch. QCOMPARE(format1 == format2, false); QCOMPARE(format1 != format2, true); } void tst_QVideoSurfaceFormat::copy() { QVideoSurfaceFormat original( QSize(1024, 768), QVideoFrame::Format_ARGB32, QAbstractVideoBuffer::GLTextureHandle); original.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); QVideoSurfaceFormat copy(original); QCOMPARE(copy.handleType(), QAbstractVideoBuffer::GLTextureHandle); QCOMPARE(copy.pixelFormat(), QVideoFrame::Format_ARGB32); QCOMPARE(copy.frameSize(), QSize(1024, 768)); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); copy.setScanLineDirection(QVideoSurfaceFormat::TopToBottom); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::TopToBottom); QCOMPARE(original.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(original == copy, false); QCOMPARE(original != copy, true); } void tst_QVideoSurfaceFormat::assign() { QVideoSurfaceFormat copy( QSize(64, 64), QVideoFrame::Format_AYUV444, QAbstractVideoBuffer::UserHandle); QVideoSurfaceFormat original( QSize(1024, 768), QVideoFrame::Format_ARGB32, QAbstractVideoBuffer::GLTextureHandle); original.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); copy = original; QCOMPARE(copy.handleType(), QAbstractVideoBuffer::GLTextureHandle); QCOMPARE(copy.pixelFormat(), QVideoFrame::Format_ARGB32); QCOMPARE(copy.frameSize(), QSize(1024, 768)); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); copy.setScanLineDirection(QVideoSurfaceFormat::TopToBottom); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::TopToBottom); QCOMPARE(original.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(original == copy, false); QCOMPARE(original != copy, true); } /* Test case for api isValid */ void tst_QVideoSurfaceFormat::isValid() { /* When both pixel format and framesize is not valid */ QVideoSurfaceFormat format; QVERIFY(!format.isValid()); /* When framesize is valid and pixel format is not valid */ format.setFrameSize(64,64); QVERIFY(format.frameSize() == QSize(64,64)); QVERIFY(!format.pixelFormat()); QVERIFY(!format.isValid()); /* When both the pixel format and framesize is valid. */ QVideoSurfaceFormat format1(QSize(32, 32), QVideoFrame::Format_AYUV444); QVERIFY(format1.isValid()); /* When pixel format is valid and frame size is not valid */ format1.setFrameSize(-1,-1); QVERIFY(!format1.frameSize().isValid()); QVERIFY(!format1.isValid()); } /* Test case for copy constructor with all the parameters. */ void tst_QVideoSurfaceFormat::copyAllParameters() { /* Create the instance and set all the parameters. */ QVideoSurfaceFormat original( QSize(1024, 768), QVideoFrame::Format_ARGB32, QAbstractVideoBuffer::GLTextureHandle); original.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); original.setViewport(QRect(0, 0, 1024, 1024)); original.setFrameRate(qreal(15.0)); original.setPixelAspectRatio(QSize(320,480)); original.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_BT709); /* Copy the original instance to copy and verify if both the instances have the same parameters. */ QVideoSurfaceFormat copy(original); QCOMPARE(copy.handleType(), QAbstractVideoBuffer::GLTextureHandle); QCOMPARE(copy.pixelFormat(), QVideoFrame::Format_ARGB32); QCOMPARE(copy.frameSize(), QSize(1024, 768)); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(copy.viewport(), QRect(0, 0, 1024, 1024)); QCOMPARE(copy.frameRate(), qreal(15.0)); QCOMPARE(copy.pixelAspectRatio(), QSize(320,480)); QCOMPARE(copy.yCbCrColorSpace(), QVideoSurfaceFormat::YCbCr_BT709); /* Verify if both the instances are eqaul */ QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); } /* Test case for copy constructor with all the parameters. */ void tst_QVideoSurfaceFormat::assignAllParameters() { /* Create the instance and set all the parameters. */ QVideoSurfaceFormat copy( QSize(64, 64), QVideoFrame::Format_AYUV444, QAbstractVideoBuffer::UserHandle); copy.setScanLineDirection(QVideoSurfaceFormat::TopToBottom); copy.setViewport(QRect(0, 0, 640, 320)); copy.setFrameRate(qreal(7.5)); copy.setPixelAspectRatio(QSize(640,320)); copy.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_BT601); /* Create the instance and set all the parameters. */ QVideoSurfaceFormat original( QSize(1024, 768), QVideoFrame::Format_ARGB32, QAbstractVideoBuffer::GLTextureHandle); original.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); original.setViewport(QRect(0, 0, 1024, 1024)); original.setFrameRate(qreal(15.0)); original.setPixelAspectRatio(QSize(320,480)); original.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_BT709); /* Assign the original instance to copy and verify if both the instancess have the same parameters. */ copy = original; QCOMPARE(copy.handleType(), QAbstractVideoBuffer::GLTextureHandle); QCOMPARE(copy.pixelFormat(), QVideoFrame::Format_ARGB32); QCOMPARE(copy.frameSize(), QSize(1024, 768)); QCOMPARE(copy.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); QCOMPARE(copy.viewport(), QRect(0, 0, 1024, 1024)); QCOMPARE(copy.frameRate(), qreal(15.0)); QCOMPARE(copy.pixelAspectRatio(), QSize(320,480)); QCOMPARE(copy.yCbCrColorSpace(), QVideoSurfaceFormat::YCbCr_BT709); /* Verify if both the instances are eqaul */ QCOMPARE(original == copy, true); QCOMPARE(original != copy, false); } void tst_QVideoSurfaceFormat::propertyEdgeCases() { // Test setting read only properties doesn't change anything QVideoSurfaceFormat original( QSize(1024, 768), QVideoFrame::Format_ARGB32, QAbstractVideoBuffer::GLTextureHandle); original.setProperty("handleType", QAbstractVideoBuffer::UserHandle); QCOMPARE(original.handleType(), QAbstractVideoBuffer::GLTextureHandle); original.setProperty("pixelFormat", QVideoFrame::Format_AYUV444); QCOMPARE(original.pixelFormat(), QVideoFrame::Format_ARGB32); original.setProperty("frameWidth", 512); QCOMPARE(original.frameWidth(), 1024); original.setProperty("frameHeight", 77); QCOMPARE(original.frameHeight(), 768); original.setProperty("sizeHint", QSize(512, 384)); QCOMPARE(original.sizeHint(), QSize(1024,768)); // Now test setting some r/w properties with the wrong data type original.setProperty("frameSize", QColor(Qt::red)); QCOMPARE(original.frameSize(), QSize(1024, 768)); original.setProperty("viewport", QColor(Qt::red)); QCOMPARE(original.viewport(), QRect(0, 0, 1024, 768)); original.setScanLineDirection(QVideoSurfaceFormat::BottomToTop); original.setProperty("scanLineDirection", QColor(Qt::red)); QCOMPARE(original.scanLineDirection(), QVideoSurfaceFormat::BottomToTop); original.setFrameRate(32); original.setProperty("frameRate", QSize(32, 43)); QCOMPARE(original.frameRate(), qreal(32)); original.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_BT709); original.setProperty("yCbCrColorSpace", QSize(43,43)); QCOMPARE(original.yCbCrColorSpace(), QVideoSurfaceFormat::YCbCr_BT709); original.setPixelAspectRatio(53, 45); original.setProperty("pixelAspectRatio", QColor(Qt::red)); QCOMPARE(original.pixelAspectRatio(), QSize(53, 45)); } #define ADDDEBUGTEST(format, w, h, r) \ QTest::newRow(#format "-" #w "x" #h "@" #r) \ << QVideoFrame::Format_ ##format \ << "Format_" #format \ << QSize(w, h) \ << r; void tst_QVideoSurfaceFormat::debugOperator_data() { // This is not too exhaustive QTest::addColumn("format"); QTest::addColumn("formatString"); QTest::addColumn("frameSize"); QTest::addColumn("frameRate"); // could be double, but formatting is unstable ADDDEBUGTEST(Invalid, 100, 200, 3); ADDDEBUGTEST(ARGB32,101, 201, 4); ADDDEBUGTEST(ARGB32_Premultiplied, 100, 202, 5); ADDDEBUGTEST(RGB32, 8, 16, 30); ADDDEBUGTEST(RGB24, 8, 16, 30); ADDDEBUGTEST(RGB565, 8, 16, 30); ADDDEBUGTEST(RGB555, 8, 16, 30); ADDDEBUGTEST(ARGB8565_Premultiplied, 8, 16, 30); ADDDEBUGTEST(BGRA32, 8, 16, 30); ADDDEBUGTEST(BGRA32_Premultiplied, 8, 16, 30); ADDDEBUGTEST(BGR32, 8, 16, 30); ADDDEBUGTEST(BGR24, 8, 16, 30); ADDDEBUGTEST(BGR565, 8, 16, 30); ADDDEBUGTEST(BGR555, 8, 16, 30); ADDDEBUGTEST(BGRA5658_Premultiplied, 8, 16, 30); ADDDEBUGTEST(AYUV444, 8, 16, 30); ADDDEBUGTEST(AYUV444, 8, 16, 31); ADDDEBUGTEST(AYUV444_Premultiplied, 8, 16, 30); ADDDEBUGTEST(YUV444, 8, 16, 30); ADDDEBUGTEST(YUV420P, 8, 16, 30); ADDDEBUGTEST(YV12, 8, 16, 30); ADDDEBUGTEST(UYVY, 8, 16, 30); ADDDEBUGTEST(YUYV, 8, 16, 30); ADDDEBUGTEST(NV12, 8, 16, 30); ADDDEBUGTEST(NV12, 80, 16, 30); ADDDEBUGTEST(NV21, 8, 16, 30); ADDDEBUGTEST(IMC1, 8, 16, 30); ADDDEBUGTEST(IMC2, 8, 16, 30); ADDDEBUGTEST(IMC3, 8, 16, 30); ADDDEBUGTEST(IMC3, 8, 160, 30); ADDDEBUGTEST(IMC4, 8, 16, 30); ADDDEBUGTEST(Y8, 8, 16, 30); ADDDEBUGTEST(Y16, 8, 16, 30); ADDDEBUGTEST(Jpeg, 8, 16, 30); ADDDEBUGTEST(CameraRaw, 8, 16, 30); ADDDEBUGTEST(AdobeDng, 8, 16, 30); // User is special QTest::newRow("User-0x0@0)") << QVideoFrame::Format_User << "UserType(1000)" << QSize() << 0; } void tst_QVideoSurfaceFormat::debugOperator() { QFETCH(QVideoFrame::PixelFormat, format); QFETCH(QString, formatString); QFETCH(QSize, frameSize); QFETCH(int, frameRate); QString templateOutput = QString("QVideoSurfaceFormat(%1, QSize(%2, %3) , viewport=QRect(0,1 800x600) , pixelAspectRatio=QSize(320, 200) " ", handleType=GLTextureHandle, yCbCrColorSpace=YCbCr_BT709)\n" " handleType = QVariant(QAbstractVideoBuffer::HandleType, ) \n" " pixelFormat = QVariant(QVideoFrame::PixelFormat, ) \n" " frameSize = QVariant(QSize, QSize(%4, %5) ) \n" " frameWidth = QVariant(int, %6) \n" " viewport = QVariant(QRect, QRect(0,1 800x600) ) \n" " scanLineDirection = QVariant(QVideoSurfaceFormat::Direction, ) \n" " frameRate = QVariant(%7, %8) \n" " pixelAspectRatio = QVariant(QSize, QSize(320, 200) ) \n" " sizeHint = QVariant(QSize, QSize(1280, 600) ) \n" " yCbCrColorSpace = QVariant(QVideoSurfaceFormat::YCbCrColorSpace, ) ") .arg(formatString) .arg(frameSize.width()) .arg(frameSize.height()) .arg(frameSize.width()) .arg(frameSize.height()) .arg(frameSize.width()) .arg(sizeof(qreal) == sizeof(double) ? "double" : "float") .arg(frameRate); QVideoSurfaceFormat vsf(frameSize, format, QAbstractVideoBuffer::GLTextureHandle); vsf.setViewport(QRect(0,1, 800, 600)); vsf.setPixelAspectRatio(QSize(320, 200)); vsf.setYCbCrColorSpace(QVideoSurfaceFormat::YCbCr_BT709); vsf.setFrameRate(frameRate); QTest::ignoreMessage(QtDebugMsg, templateOutput.toLatin1().constData()); qDebug() << vsf; } QTEST_MAIN(tst_QVideoSurfaceFormat) #include "tst_qvideosurfaceformat.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideowidget/000077500000000000000000000000001225012771600303635ustar00rootroot00000000000000qvideowidget.pro000066400000000000000000000003011225012771600335130ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideowidgetCONFIG += testcase TARGET = tst_qvideowidget QT += multimedia-private multimediawidgets-private testlib SOURCES += tst_qvideowidget.cpp QT+=widgets DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qvideowidget.cpp000066400000000000000000001450471225012771600344100ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qvideowidget/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include "qvideowidget.h" #include "qmediaobject.h" #include "qmediaservice.h" #include #include "qvideowindowcontrol.h" #include "qvideowidgetcontrol.h" #include "qvideorenderercontrol.h" #include #include #include QT_USE_NAMESPACE class tst_QVideoWidget : public QObject { Q_OBJECT private slots: void nullObject(); void nullService(); void noOutputs(); void serviceDestroyed(); void objectDestroyed(); void setMediaObject(); void showWindowControl(); void fullScreenWindowControl(); void aspectRatioWindowControl(); void sizeHintWindowControl_data() { sizeHint_data(); } void sizeHintWindowControl(); void brightnessWindowControl_data() { color_data(); } void brightnessWindowControl(); void contrastWindowControl_data() { color_data(); } void contrastWindowControl(); void hueWindowControl_data() { color_data(); } void hueWindowControl(); void saturationWindowControl_data() { color_data(); } void saturationWindowControl(); void showWidgetControl(); void fullScreenWidgetControl(); void aspectRatioWidgetControl(); void sizeHintWidgetControl_data() { sizeHint_data(); } void sizeHintWidgetControl(); void brightnessWidgetControl_data() { color_data(); } void brightnessWidgetControl(); void contrastWidgetControl_data() { color_data(); } void contrastWidgetControl(); void hueWidgetControl_data() { color_data(); } void hueWidgetControl(); void saturationWidgetControl_data() { color_data(); } void saturationWidgetControl(); void showRendererControl(); void fullScreenRendererControl(); void aspectRatioRendererControl(); void sizeHintRendererControl_data(); void sizeHintRendererControl(); void brightnessRendererControl_data() { color_data(); } void brightnessRendererControl(); void contrastRendererControl_data() { color_data(); } void contrastRendererControl(); void hueRendererControl_data() { color_data(); } void hueRendererControl(); void saturationRendererControl_data() { color_data(); } void saturationRendererControl(); void paintRendererControl(); private: void sizeHint_data(); void color_data(); }; Q_DECLARE_METATYPE(Qt::AspectRatioMode) Q_DECLARE_METATYPE(const uchar *) class QtTestWindowControl : public QVideoWindowControl { public: QtTestWindowControl() : m_winId(0) , m_repaintCount(0) , m_brightness(0) , m_contrast(0) , m_saturation(0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullScreen(0) { } WId winId() const { return m_winId; } void setWinId(WId id) { m_winId = id; } QRect displayRect() const { return m_displayRect; } void setDisplayRect(const QRect &rect) { m_displayRect = rect; } bool isFullScreen() const { return m_fullScreen; } void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } int repaintCount() const { return m_repaintCount; } void setRepaintCount(int count) { m_repaintCount = count; } void repaint() { ++m_repaintCount; } QSize nativeSize() const { return m_nativeSize; } void setNativeSize(const QSize &size) { m_nativeSize = size; emit nativeSizeChanged(); } Qt::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; } void setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; } int brightness() const { return m_brightness; } void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); } int contrast() const { return m_contrast; } void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); } int hue() const { return m_hue; } void setHue(int hue) { emit hueChanged(m_hue = hue); } int saturation() const { return m_saturation; } void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); } private: WId m_winId; int m_repaintCount; int m_brightness; int m_contrast; int m_hue; int m_saturation; Qt::AspectRatioMode m_aspectRatioMode; QRect m_displayRect; QSize m_nativeSize; bool m_fullScreen; }; class QtTestWidgetControl : public QVideoWidgetControl { public: QtTestWidgetControl() : m_brightness(1.0) , m_contrast(1.0) , m_hue(1.0) , m_saturation(1.0) , m_aspectRatioMode(Qt::KeepAspectRatio) , m_fullScreen(false) { } bool isFullScreen() const { return m_fullScreen; } void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } Qt::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; } void setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; } int brightness() const { return m_brightness; } void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); } int contrast() const { return m_contrast; } void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); } int hue() const { return m_hue; } void setHue(int hue) { emit hueChanged(m_hue = hue); } int saturation() const { return m_saturation; } void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); } void setSizeHint(const QSize &size) { m_widget.setSizeHint(size); } QWidget *videoWidget() { return &m_widget; } private: class Widget : public QWidget { public: QSize sizeHint() const { return m_sizeHint; } void setSizeHint(const QSize &size) { m_sizeHint = size; updateGeometry(); } private: QSize m_sizeHint; } m_widget; int m_brightness; int m_contrast; int m_hue; int m_saturation; Qt::AspectRatioMode m_aspectRatioMode; QSize m_sizeHint; bool m_fullScreen; }; class QtTestRendererControl : public QVideoRendererControl { public: QtTestRendererControl() : m_surface(0) { } QAbstractVideoSurface *surface() const { return m_surface; } void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } private: QAbstractVideoSurface *m_surface; }; class QtTestVideoService : public QMediaService { Q_OBJECT public: QtTestVideoService( QtTestWindowControl *window, QtTestWidgetControl *widget, QtTestRendererControl *renderer) : QMediaService(0) , windowRef(0) , widgetRef(0) , rendererRef(0) , windowControl(window) , widgetControl(widget) , rendererControl(renderer) { } ~QtTestVideoService() { delete windowControl; delete widgetControl; delete rendererControl; } QMediaControl *requestControl(const char *name) { if (qstrcmp(name, QVideoWindowControl_iid) == 0) { if (windowControl) { windowRef += 1; return windowControl; } } else if (qstrcmp(name, QVideoWidgetControl_iid) == 0) { if (widgetControl) { widgetRef += 1; return widgetControl; } } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (rendererControl) { rendererRef += 1; return rendererControl; } } return 0; } void releaseControl(QMediaControl *control) { Q_ASSERT(control); if (control == windowControl) windowRef -= 1; else if (control == widgetControl) widgetRef -= 1; else if (control == rendererControl) rendererRef -= 1; } int windowRef; int widgetRef; int rendererRef; QtTestWindowControl *windowControl; QtTestWidgetControl *widgetControl; QtTestRendererControl *rendererControl; }; class QtTestVideoObject : public QMediaObject { Q_OBJECT public: QtTestVideoObject( QtTestWindowControl *window, QtTestWidgetControl *widget, QtTestRendererControl *renderer): QMediaObject(0, new QtTestVideoService(window, widget, renderer)) { testService = qobject_cast(service()); } QtTestVideoObject(QtTestVideoService *service): QMediaObject(0, service), testService(service) { } ~QtTestVideoObject() { delete testService; } QtTestVideoService *testService; }; void tst_QVideoWidget::nullObject() { QVideoWidget widget; widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QVERIFY(widget.sizeHint().isEmpty()); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setFullScreen(true); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), true); widget.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::IgnoreAspectRatio); { QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); widget.setBrightness(100); QCOMPARE(widget.brightness(), 100); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), 100); widget.setBrightness(100); QCOMPARE(widget.brightness(), 100); QCOMPARE(spy.count(), 1); widget.setBrightness(-120); QCOMPARE(widget.brightness(), -100); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), -100); } { QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); widget.setContrast(100); QCOMPARE(widget.contrast(), 100); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), 100); widget.setContrast(100); QCOMPARE(widget.contrast(), 100); QCOMPARE(spy.count(), 1); widget.setContrast(-120); QCOMPARE(widget.contrast(), -100); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), -100); } { QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); widget.setHue(100); QCOMPARE(widget.hue(), 100); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), 100); widget.setHue(100); QCOMPARE(widget.hue(), 100); QCOMPARE(spy.count(), 1); widget.setHue(-120); QCOMPARE(widget.hue(), -100); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), -100); } { QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); widget.setSaturation(100); QCOMPARE(widget.saturation(), 100); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), 100); widget.setSaturation(100); QCOMPARE(widget.saturation(), 100); QCOMPARE(spy.count(), 1); widget.setSaturation(-120); QCOMPARE(widget.saturation(), -100); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), -100); } } void tst_QVideoWidget::nullService() { QtTestVideoObject object(0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QVERIFY(widget.sizeHint().isEmpty()); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setFullScreen(true); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), true); widget.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::IgnoreAspectRatio); widget.setBrightness(100); QCOMPARE(widget.brightness(), 100); widget.setContrast(100); QCOMPARE(widget.contrast(), 100); widget.setHue(100); QCOMPARE(widget.hue(), 100); widget.setSaturation(100); QCOMPARE(widget.saturation(), 100); } void tst_QVideoWidget::noOutputs() { QtTestVideoObject object(0, 0, 0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QVERIFY(widget.sizeHint().isEmpty()); widget.setFullScreen(true); QCOMPARE(widget.isFullScreen(), true); widget.setBrightness(100); QCOMPARE(widget.brightness(), 100); widget.setContrast(100); QCOMPARE(widget.contrast(), 100); widget.setHue(100); QCOMPARE(widget.hue(), 100); widget.setSaturation(100); QCOMPARE(widget.saturation(), 100); } void tst_QVideoWidget::serviceDestroyed() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(new QtTestWindowControl, new QtTestWidgetControl, 0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setBrightness(100); widget.setContrast(100); widget.setHue(100); widget.setSaturation(100); delete object.testService; object.testService = 0; QCOMPARE(widget.mediaObject(), static_cast(&object)); QCOMPARE(widget.brightness(), 100); QCOMPARE(widget.contrast(), 100); QCOMPARE(widget.hue(), 100); QCOMPARE(widget.saturation(), 100); widget.setFullScreen(true); QCOMPARE(widget.isFullScreen(), true); } void tst_QVideoWidget::objectDestroyed() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject *object = new QtTestVideoObject( new QtTestWindowControl, new QtTestWidgetControl, 0); QVideoWidget widget; object->bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(object->testService->windowRef, 0); QCOMPARE(object->testService->widgetRef, 1); QCOMPARE(object->testService->rendererRef, 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setBrightness(100); widget.setContrast(100); widget.setHue(100); widget.setSaturation(100); // Delete the media object without deleting the service. QtTestVideoService *service = object->testService; object->testService = 0; delete object; object = 0; QCOMPARE(widget.mediaObject(), static_cast(object)); QCOMPARE(widget.brightness(), 100); QCOMPARE(widget.contrast(), 100); QCOMPARE(widget.hue(), 100); QCOMPARE(widget.saturation(), 100); widget.setFullScreen(true); QCOMPARE(widget.isFullScreen(), true); delete service; } void tst_QVideoWidget::setMediaObject() { QMediaObject *nullObject = 0; QtTestVideoObject windowObject(new QtTestWindowControl, 0, 0); QtTestVideoObject widgetObject(0, new QtTestWidgetControl, 0); QtTestVideoObject rendererObject(0, 0, new QtTestRendererControl); QVideoWidget widget; widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.mediaObject(), nullObject); QCOMPARE(windowObject.testService->windowRef, 0); QCOMPARE(widgetObject.testService->widgetRef, 0); QCOMPARE(rendererObject.testService->rendererRef, 0); windowObject.bind(&widget); QCOMPARE(widget.mediaObject(), static_cast(&windowObject)); QCOMPARE(windowObject.testService->windowRef, 1); QCOMPARE(widgetObject.testService->widgetRef, 0); QCOMPARE(rendererObject.testService->rendererRef, 0); QVERIFY(windowObject.testService->windowControl->winId() != 0); widgetObject.bind(&widget); QCOMPARE(widget.mediaObject(), static_cast(&widgetObject)); QCOMPARE(windowObject.testService->windowRef, 0); QCOMPARE(widgetObject.testService->widgetRef, 1); QCOMPARE(rendererObject.testService->rendererRef, 0); QCoreApplication::processEvents(QEventLoop::AllEvents); QCOMPARE(widgetObject.testService->widgetControl->videoWidget()->isVisible(), true); QCOMPARE(windowObject.testService->windowRef, 0); QCOMPARE(widgetObject.testService->widgetRef, 1); QCOMPARE(rendererObject.testService->rendererRef, 0); rendererObject.bind(&widget); QCOMPARE(widget.mediaObject(), static_cast(&rendererObject)); QCOMPARE(windowObject.testService->windowRef, 0); QCOMPARE(widgetObject.testService->widgetRef, 0); QCOMPARE(rendererObject.testService->rendererRef, 1); QVERIFY(rendererObject.testService->rendererControl->surface() != 0); rendererObject.unbind(&widget); QCOMPARE(widget.mediaObject(), nullObject); QCOMPARE(windowObject.testService->windowRef, 0); QCOMPARE(widgetObject.testService->widgetRef, 0); QCOMPARE(rendererObject.testService->rendererRef, 0); } void tst_QVideoWidget::showWindowControl() { QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setNativeSize(QSize(240, 180)); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QVERIFY(object.testService->windowControl->winId() != 0); QVERIFY(object.testService->windowControl->repaintCount() > 0); widget.resize(640, 480); QCOMPARE(object.testService->windowControl->displayRect(), QRect(0, 0, 640, 480)); widget.move(10, 10); QCOMPARE(object.testService->windowControl->displayRect(), QRect(0, 0, 640, 480)); widget.hide(); } void tst_QVideoWidget::showWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, new QtTestWidgetControl, 0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->widgetControl->videoWidget()->isVisible(), true); widget.resize(640, 480); widget.move(10, 10); widget.hide(); QCOMPARE(object.testService->widgetControl->videoWidget()->isVisible(), false); } void tst_QVideoWidget::showRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QVERIFY(object.testService->rendererControl->surface() != 0); widget.resize(640, 480); widget.move(10, 10); widget.hide(); } void tst_QVideoWidget::aspectRatioWindowControl() { QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setAspectRatioMode(Qt::IgnoreAspectRatio); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); // Test the aspect ratio defaults to keeping the aspect ratio. QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); // Test the control has been informed of the aspect ratio change, post show. widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); QCOMPARE(object.testService->windowControl->aspectRatioMode(), Qt::KeepAspectRatio); // Test an aspect ratio change is enforced immediately while visible. widget.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::IgnoreAspectRatio); QCOMPARE(object.testService->windowControl->aspectRatioMode(), Qt::IgnoreAspectRatio); // Test an aspect ratio set while not visible is respected. widget.hide(); widget.setAspectRatioMode(Qt::KeepAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); widget.show(); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); QCOMPARE(object.testService->windowControl->aspectRatioMode(), Qt::KeepAspectRatio); } void tst_QVideoWidget::aspectRatioWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, new QtTestWidgetControl, 0); object.testService->widgetControl->setAspectRatioMode(Qt::IgnoreAspectRatio); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); // Test the aspect ratio defaults to keeping the aspect ratio. QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); // Test the control has been informed of the aspect ratio change, post show. widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); QCOMPARE(object.testService->widgetControl->aspectRatioMode(), Qt::KeepAspectRatio); // Test an aspect ratio change is enforced immediately while visible. widget.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::IgnoreAspectRatio); QCOMPARE(object.testService->widgetControl->aspectRatioMode(), Qt::IgnoreAspectRatio); // Test an aspect ratio set while not visible is respected. widget.hide(); widget.setAspectRatioMode(Qt::KeepAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); widget.show(); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); QCOMPARE(object.testService->widgetControl->aspectRatioMode(), Qt::KeepAspectRatio); } void tst_QVideoWidget::aspectRatioRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); // Test the aspect ratio defaults to keeping the aspect ratio. QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); // Test the control has been informed of the aspect ratio change, post show. widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); // Test an aspect ratio change is enforced immediately while visible. widget.setAspectRatioMode(Qt::IgnoreAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::IgnoreAspectRatio); // Test an aspect ratio set while not visible is respected. widget.hide(); widget.setAspectRatioMode(Qt::KeepAspectRatio); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); widget.show(); QCOMPARE(widget.aspectRatioMode(), Qt::KeepAspectRatio); } void tst_QVideoWidget::sizeHint_data() { QTest::addColumn("size"); QTest::newRow("720x576") << QSize(720, 576); } void tst_QVideoWidget::sizeHintWindowControl() { QFETCH(QSize, size); QtTestVideoObject object(new QtTestWindowControl, 0, 0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QVERIFY(widget.sizeHint().isEmpty()); object.testService->windowControl->setNativeSize(size); QCOMPARE(widget.sizeHint(), size); } void tst_QVideoWidget::sizeHintWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(QSize, size); QtTestVideoObject object(0, new QtTestWidgetControl, 0); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QVERIFY(widget.sizeHint().isEmpty()); object.testService->widgetControl->setSizeHint(size); QCOMPARE(widget.sizeHint(), size); } void tst_QVideoWidget::sizeHintRendererControl_data() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QTest::addColumn("frameSize"); QTest::addColumn("viewport"); QTest::addColumn("pixelAspectRatio"); QTest::addColumn("expectedSize"); QTest::newRow("640x480") << QSize(640, 480) << QRect(0, 0, 640, 480) << QSize(1, 1) << QSize(640, 480); QTest::newRow("800x600, (80,60, 640x480) viewport") << QSize(800, 600) << QRect(80, 60, 640, 480) << QSize(1, 1) << QSize(640, 480); QTest::newRow("800x600, (80,60, 640x480) viewport, 4:3") << QSize(800, 600) << QRect(80, 60, 640, 480) << QSize(4, 3) << QSize(853, 480); } void tst_QVideoWidget::sizeHintRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(QSize, frameSize); QFETCH(QRect, viewport); QFETCH(QSize, pixelAspectRatio); QFETCH(QSize, expectedSize); QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); format.setViewport(viewport); format.setPixelAspectRatio(pixelAspectRatio); QVERIFY(object.testService->rendererControl->surface()->start(format)); QCOMPARE(widget.sizeHint(), expectedSize); } void tst_QVideoWidget::fullScreenWindowControl() { QtTestVideoObject object(new QtTestWindowControl, 0, 0); QVideoWidget widget; object.bind(&widget); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); Qt::WindowFlags windowFlags = widget.windowFlags(); QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); // Test showing full screen with setFullScreen(true). widget.setFullScreen(true); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->windowControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toBool(), true); // Test returning to normal with setFullScreen(false). widget.setFullScreen(false); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->windowControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test showing full screen with showFullScreen(). widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->windowControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 3); QCOMPARE(spy.value(2).value(0).toBool(), true); // Test returning to normal with showNormal(). widget.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->windowControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); QCOMPARE(spy.value(3).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. widget.setFullScreen(false); QCOMPARE(object.testService->windowControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); widget.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->windowControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setFullScreen(true); QCOMPARE(object.testService->windowControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); widget.showFullScreen(); QCOMPARE(object.testService->windowControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); // Test if the window control exits full screen mode, the widget follows suit. object.testService->windowControl->setFullScreen(false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 6); QCOMPARE(spy.value(5).value(0).toBool(), false); // Test if the window control enters full screen mode, the widget does nothing. object.testService->windowControl->setFullScreen(false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 6); } void tst_QVideoWidget::fullScreenWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, new QtTestWidgetControl, 0); QVideoWidget widget; object.bind(&widget); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); Qt::WindowFlags windowFlags = widget.windowFlags(); QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); // Test showing full screen with setFullScreen(true). widget.setFullScreen(true); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->widgetControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toBool(), true); // Test returning to normal with setFullScreen(false). widget.setFullScreen(false); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->widgetControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test showing full screen with showFullScreen(). widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->widgetControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 3); QCOMPARE(spy.value(2).value(0).toBool(), true); // Test returning to normal with showNormal(). widget.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(object.testService->widgetControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); QCOMPARE(spy.value(3).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. widget.setFullScreen(false); QCOMPARE(object.testService->widgetControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); widget.showNormal(); QCOMPARE(object.testService->widgetControl->isFullScreen(), false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setFullScreen(true); QCOMPARE(object.testService->widgetControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); widget.showFullScreen(); QCOMPARE(object.testService->widgetControl->isFullScreen(), true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); // Test if the window control exits full screen mode, the widget follows suit. object.testService->widgetControl->setFullScreen(false); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 6); QCOMPARE(spy.value(5).value(0).toBool(), false); // Test if the window control enters full screen mode, the widget does nothing. object.testService->widgetControl->setFullScreen(false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 6); } void tst_QVideoWidget::fullScreenRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); Qt::WindowFlags windowFlags = widget.windowFlags(); QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); // Test showing full screen with setFullScreen(true). widget.setFullScreen(true); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toBool(), true); // Test returning to normal with setFullScreen(false). widget.setFullScreen(false); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test showing full screen with showFullScreen(). widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 3); QCOMPARE(spy.value(2).value(0).toBool(), true); // Test returning to normal with showNormal(). widget.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); QCOMPARE(spy.value(3).value(0).toBool(), false); QCOMPARE(widget.windowFlags(), windowFlags); // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. widget.setFullScreen(false); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); widget.showNormal(); QCOMPARE(widget.isFullScreen(), false); QCOMPARE(spy.count(), 4); // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. widget.showFullScreen(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); widget.setFullScreen(true); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); widget.showFullScreen(); QCOMPARE(widget.isFullScreen(), true); QCOMPARE(spy.count(), 5); } void tst_QVideoWidget::color_data() { QTest::addColumn("controlValue"); QTest::addColumn("value"); QTest::addColumn("expectedValue"); QTest::newRow("12") << 0 << 12 << 12; QTest::newRow("-56") << 87 << -56 << -56; QTest::newRow("100") << 32 << 100 << 100; QTest::newRow("1294") << 0 << 1294 << 100; QTest::newRow("-102") << 34 << -102 << -100; } void tst_QVideoWidget::brightnessWindowControl() { QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setBrightness(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); // Test the video widget resets the controls starting brightness to the default. QCOMPARE(widget.brightness(), 0); QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); // Test the video widget sets the brightness value, bounded if necessary and emits a changed // signal. widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(object.testService->windowControl->brightness(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); // Test the changed signal isn't emitted if the value is unchanged. widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(object.testService->windowControl->brightness(), expectedValue); QCOMPARE(spy.count(), 1); // Test the changed signal is emitted if the brightness is changed internally. object.testService->windowControl->setBrightness(controlValue); QCOMPARE(widget.brightness(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::brightnessWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, new QtTestWidgetControl, 0); object.testService->widgetControl->setBrightness(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.brightness(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(object.testService->widgetControl->brightness(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(object.testService->widgetControl->brightness(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->widgetControl->setBrightness(controlValue); QCOMPARE(widget.brightness(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::brightnessRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setBrightness(value); QCOMPARE(widget.brightness(), expectedValue); QCOMPARE(spy.count(), 1); } void tst_QVideoWidget::contrastWindowControl() { QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setContrast(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.contrast(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.contrast(), 0); QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(object.testService->windowControl->contrast(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(object.testService->windowControl->contrast(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->windowControl->setContrast(controlValue); QCOMPARE(widget.contrast(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::contrastWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, new QtTestWidgetControl, 0); object.testService->widgetControl->setContrast(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.contrast(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.contrast(), 0); QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(object.testService->widgetControl->contrast(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(object.testService->widgetControl->contrast(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->widgetControl->setContrast(controlValue); QCOMPARE(widget.contrast(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::contrastRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setContrast(value); QCOMPARE(widget.contrast(), expectedValue); QCOMPARE(spy.count(), 1); } void tst_QVideoWidget::hueWindowControl() { QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setHue(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.hue(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.hue(), 0); QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(object.testService->windowControl->hue(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(object.testService->windowControl->hue(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->windowControl->setHue(controlValue); QCOMPARE(widget.hue(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::hueWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, new QtTestWidgetControl, 0); object.testService->widgetControl->setHue(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.hue(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.hue(), 0); QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(object.testService->widgetControl->hue(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(object.testService->widgetControl->hue(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->widgetControl->setHue(controlValue); QCOMPARE(widget.hue(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::hueRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setHue(value); QCOMPARE(widget.hue(), expectedValue); QCOMPARE(spy.count(), 1); } void tst_QVideoWidget::saturationWindowControl() { QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(new QtTestWindowControl, 0, 0); object.testService->windowControl->setSaturation(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.saturation(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.saturation(), 0); QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(object.testService->windowControl->saturation(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(object.testService->windowControl->saturation(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->windowControl->setSaturation(controlValue); QCOMPARE(widget.saturation(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::saturationWidgetControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, controlValue); QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, new QtTestWidgetControl, 0); object.testService->widgetControl->setSaturation(controlValue); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); QCOMPARE(widget.saturation(), 0); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QCOMPARE(widget.saturation(), 0); QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(object.testService->widgetControl->saturation(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(object.testService->widgetControl->saturation(), expectedValue); QCOMPARE(spy.count(), 1); object.testService->widgetControl->setSaturation(controlValue); QCOMPARE(widget.saturation(), controlValue); QCOMPARE(spy.count(), 2); QCOMPARE(spy.value(1).value(0).toInt(), controlValue); } void tst_QVideoWidget::saturationRendererControl() { #ifdef Q_OS_MAC QSKIP("QTBUG-26481 - Crashes on Mac"); #endif QFETCH(int, value); QFETCH(int, expectedValue); QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(spy.count(), 1); QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); widget.setSaturation(value); QCOMPARE(widget.saturation(), expectedValue); QCOMPARE(spy.count(), 1); } static const uchar rgb32ImageData[] = { 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 }; void tst_QVideoWidget::paintRendererControl() { QtTestVideoObject object(0, 0, new QtTestRendererControl); QVideoWidget widget; object.bind(&widget); widget.setWindowFlags(Qt::X11BypassWindowManagerHint); widget.resize(640,480); widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QPainterVideoSurface *surface = qobject_cast( object.testService->rendererControl->surface()); QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); QVERIFY(surface->start(format)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); QCoreApplication::processEvents(QEventLoop::AllEvents); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); frame.map(QAbstractVideoBuffer::WriteOnly); memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); frame.unmap(); QVERIFY(surface->present(frame)); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), false); QTRY_COMPARE(surface->isReady(), true); QCOMPARE(surface->isActive(), true); QCOMPARE(surface->isReady(), true); } QTEST_MAIN(tst_QVideoWidget) #include "tst_qvideowidget.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/000077500000000000000000000000001225012771600303415ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/data/000077500000000000000000000000001225012771600312525ustar00rootroot00000000000000corrupt_datadesc_1_16_8000.le.wav000066400000000000000000000077141225012771600370450ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFÄWAVEfmt @€>eata ê=:`Sãg™vž~sþx‘kåW?ˆ"åôä‹Çj­(˜‰!Ø€Kˆ—U¬ÎÆâä¸j#@YªlÛyºà}Zt°cÜL<1|„òQÓÚ¶óž(§‚,€é…”“S¨ÚÂtá%Ö!{?0YMmzä})rÐ_.GÑ)¢ ½èPÉw­—¾‡€ìù‹žÜ¶×Ôäõ¼7ãR*iixˆ~Øs·aËHÅ*³ Þç©Ç[«þ”8†!€>ƒc¾£ä¾àÞaí"B«\·pÁ|àÇyÙjT)7QóhÑⲚ݈ € ‚ð -¼¹Ü›" B¾]ãq}}šx7gqNŽ/ç +é$Ç‚©¥’l„€å…Ÿ•þ­ÍnðI70Ukl{þ£zckiS˜4i·ì†ÉŪ “_„€Œ†Y—±²ÑVöæH>”[Qq}a`vOc¸Gê%ÅwÛB¹'¨‰€¹‚ l§ÏÆnë(6«UÂm?|Ëx{eÔIu'q4Û<¸Ç›~ˆ>€Üƒ“›¬ ÎLôÂÑ?^Îs×~~šqgZ¡::·íÞÇR§C‚%ŸŒz£‰Ã«éù7‹X¦pâ}ã~ys¬\«<‘î`Ç>¦ŽƒÌ ò§ ÊÓñ/ô@D`çu—C|+lßP -™Û%¶˜È…€ˆíœ™¼«ãì Þ5ª¿ŒA€Á†eŸ›Æ”ö(ÛR…qqrz cßùеv‰‚A¢à+(cbsVCãýö¸“ŠÀš¡à)2db¬q4?øt³¸‡zƒf¨~êè3Žký:j41«ç¦¦‚r‰|¸ÞFv™}‘Z¢$Ξ” €È—âÓŒ¤_ç~Irà=»ó¾­Ÿ„%‡µ´KýGãvÅ|FVßDůŽ¡Ãä2‡lÑ¥d¡$×c˜€>—µÕ3$–dÙ•k /µàžX€;“ÈÏþÇa¢ñl†0TáÐB€n”ÄÒ#eòiù(£Ø±— €c›ß80~mdz^žÇp=‚bª½õzEIx@zBJ®û¸®Iƒ°‹ÂÄ×Ë^”Ckÿ)ïÖ•q€.¢-ìÜ>)v\{åKÈûS­‚+Ž˜Ë% fõ bL4ÅèŠo„µE³Uc~þn.GØC”߀?§<öÝI\{uX9QãNš€8¡î:D¬yév×<=掛€ ¡cï½Ez{u­8¹à•—€§èøUNX}õoF,åÒhƒx´` \Ô›d†˜¾*†ÈŠ„Êw%m~µOíø¥3€KœËëèE{!rë-ÚÑÑ„”¼îV½Ma² F¯Ñ€J›åïÿMÀ~Öf–Õ´¤6˜ÅëjKh~gðY´fµ™9ïøN&»cŸ Æ­]€; yúCXý/Zbý¢<€H­¶ /e~àI6çГ„$Â|'ŠsZw0CÊe†ú\áœF=~aev ÿ©€#© Qe~êD‘ÞûrˆÒl:¤{[kÙö®€&§= ûe’}±@ø×@Š´Œ*ÞGã~%`bÿßžoö»&VuWs!o·­€³£<fÉ|à:Ïï…/”ð¢WÉDL¨áÖŒ¬‹†ß]KÃW—î´’j‡›ÕˆC÷~~\+õÄ•é…ÒA·~ ]"õ6•ƒ†ÌÔoDOY^î‘މÞBMüyOíà‡Š`lî“ZÙ~(?VÍ¡ƒ0ºi.y'öµ €ì±’#ïw6k+„MÑTEÈ Q*ßeˆV•ÂûéeNzN(D´€N¸É-|Ea¬ópÝŒšìN]0}A1“º €&µø+|`Üïºm-ö×d®y¤"œ¬sÇ AÑìKyÓ+ƒO¤HávŒhºú”‘üßó0ex€Ó¥ƒRÕ×O4ˆ7†»€Ö½Ì:›KiÏ"­°(Ç|%Yuß …<¢ +yŒa’êsˆœœv½e?ð>Š®™ÁÁuSfBðà‰×š›5w\c‡êp‡ÄŸ0fzG\ßȃO©M) ~ýOkΞ€¾¸?<þ=ˆ¹—€mÏcR }r"½¢5‡*îžhªqÓÿŽ]˜6´y‰ZØkƒ¶@=ì25I¯=ƒèâoc.t°Žšè|ûQÊ€ È“P]|„$™¢´lwò[zÕ„€ÁÐKE}©M™oE KyžV¾Ì€è̇WŸx¶%ŽƒØ$,.?²:„‹îŒn/fùß8ο†NT{ΫF='«Ö7~©‘ˆ‡ÿ9wÖVÈÇ~€ðܹfl^æŸÂÀ_R®x(±ˆ{«=’~t«’œ¦*þ¥+®’Ë8¦»ŒÄ@}EA}¬’‰úê{vE‹¯uˆè¡{–E鮉¥ Š|Ažª·‹5=~89 £‘‡Ãâ+™"š?.‰@ލwBe{©Û„ĽbX¿p-〼Úülø\£ÂÖƒ3ÿÞ{1>õ¢”Å(žd’ŠÔ²XQHsãä€vàÎqS۳Êeë` (Ž~®IO.sØá€+é¸vQGn¦”ò.~Q$ƒ{Ìbi‹[v¹ó‰ô?U‡©ÀŠbäaà¿ã‡qü#ª†"Ä2f«\›·qŒ¼$Ú~Ÿàì׎r]IÉ¢ œwA#vƒßô€»þÇ~+"Šî¿2fHYâ¯a“¾6fyÇå‘€ þ>0‡”Éæm“L¡ó ”LvmÈRˆó"Å}+ó€!øË~†s…LÒ"t>§”j³œa YÆ©…œðJlcÁH03ÐwÐØ‡„ ê}6î«€³ð{€:øŒ&|ì-~ó©‚äÉ|ýÓƒfà|J -„ôß!|Þ•ƒAã}©?‚iêš~ˆ¿€‹õÒ^€ºµ)ó:×ý|Aßá…N,ïu|ÈÍìC¯ht°Í ˜[•SÊ™Bº(p®5)ˆ~Üv}y€ì~äù…ö1Ñp"¹ïœËZÅPè”ÉÅÁw FËük$åþ†m8;kE­Ð©>iš:h‡æÀ#öƒç-±o¾±´§>i8—…¬îñÅç ˆ?@‰bÞð¾ xÁ€‹‰w ½p¡Ïfu7„åø~‹Ôâ’úW(IŠEèîõà€QOIŒßäù˜àŒŽOTJ‰Åî/IÓÆ–ä`9 zV»«©r/D€{*òh휃Í‹ëŒÿUŽB&„Aêxk´à³ys…—GBOï‡}û»zè¶»³ëyØý©‡ÁP‰Cƒ¡¥r×£ã˵\Ü™SkAÙ=æR?‡@Ðu|¦øËéñÔc ýrÌ”†!Tñ8D€v*Á^¤‹PýEví£ÍÓ´ZÄ!±j|4臗oŠ ’‡Z…+˜€(BsF$i(ž[b‡\ko‘fø/uöœHåX{ê¨^Õ—~=´¦ÈÚ(¾÷¾ïƸ‚É˺³ïαÜ~rϲ K͹´}ƒÈÙ¹íCÁ°ÁÛÍ·ŒÌ“~¬´Ú0{j Yì¤tC”h]jô‰x[‹‚’1óE €KÄ*Ž„ºb ’NužåÔ©=‹ÀæËñ|sŸiö¨kþ‡$%PK €¢Pž‡‹¹q"è9¬ç'´Oß—t‰LÊN€§T·€’iyƒÐÄ|ˆ˜$ Y)€!PÃo“{ÓǵÐwŒ½#BÂ(i+í1±Tˆž/GV€Ö\ÌýĦúý£îX€%_‚÷–­62šÌ¾G/ƒÚnUÚÉhv½‡<:–ó~Ô«ÌÿëSEØkGÛ|ÌÛr˃”KY*¨í~b“Ä)è+{’ø~¿¦q LD–‡áyr··ùöQUƒ=uùÀkð‡W2‚½ssÂ¥ðòUƒ/v—»…úÌL·†T{M­2K;Ó›äš*´£¡}Öˆ%LQöóÄ¢m€corrupt_fmtdesc_1_16_8000.le.wav000066400000000000000000000077141225012771600367220ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFÄWAVEfms2B42C$#ECeeFTd$3$2C%@data ê=:`Sãg™vž~sþx‘kåW?ˆ"åôä‹Çj­(˜‰!Ø€Kˆ—U¬ÎÆâä¸j#@YªlÛyºà}Zt°cÜL<1|„òQÓÚ¶óž(§‚,€é…”“S¨ÚÂtá%Ö!{?0YMmzä})rÐ_.GÑ)¢ ½èPÉw­—¾‡€ìù‹žÜ¶×Ôäõ¼7ãR*iixˆ~Øs·aËHÅ*³ Þç©Ç[«þ”8†!€>ƒc¾£ä¾àÞaí"B«\·pÁ|àÇyÙjT)7QóhÑⲚ݈ € ‚ð -¼¹Ü›" B¾]ãq}}šx7gqNŽ/ç +é$Ç‚©¥’l„€å…Ÿ•þ­ÍnðI70Ukl{þ£zckiS˜4i·ì†ÉŪ “_„€Œ†Y—±²ÑVöæH>”[Qq}a`vOc¸Gê%ÅwÛB¹'¨‰€¹‚ l§ÏÆnë(6«UÂm?|Ëx{eÔIu'q4Û<¸Ç›~ˆ>€Üƒ“›¬ ÎLôÂÑ?^Îs×~~šqgZ¡::·íÞÇR§C‚%ŸŒz£‰Ã«éù7‹X¦pâ}ã~ys¬\«<‘î`Ç>¦ŽƒÌ ò§ ÊÓñ/ô@D`çu—C|+lßP -™Û%¶˜È…€ˆíœ™¼«ãì Þ5ª¿ŒA€Á†eŸ›Æ”ö(ÛR…qqrz cßùеv‰‚A¢à+(cbsVCãýö¸“ŠÀš¡à)2db¬q4?øt³¸‡zƒf¨~êè3Žký:j41«ç¦¦‚r‰|¸ÞFv™}‘Z¢$Ξ” €È—âÓŒ¤_ç~Irà=»ó¾­Ÿ„%‡µ´KýGãvÅ|FVßDůŽ¡Ãä2‡lÑ¥d¡$×c˜€>—µÕ3$–dÙ•k /µàžX€;“ÈÏþÇa¢ñl†0TáÐB€n”ÄÒ#eòiù(£Ø±— €c›ß80~mdz^žÇp=‚bª½õzEIx@zBJ®û¸®Iƒ°‹ÂÄ×Ë^”Ckÿ)ïÖ•q€.¢-ìÜ>)v\{åKÈûS­‚+Ž˜Ë% fõ bL4ÅèŠo„µE³Uc~þn.GØC”߀?§<öÝI\{uX9QãNš€8¡î:D¬yév×<=掛€ ¡cï½Ez{u­8¹à•—€§èøUNX}õoF,åÒhƒx´` \Ô›d†˜¾*†ÈŠ„Êw%m~µOíø¥3€KœËëèE{!rë-ÚÑÑ„”¼îV½Ma² F¯Ñ€J›åïÿMÀ~Öf–Õ´¤6˜ÅëjKh~gðY´fµ™9ïøN&»cŸ Æ­]€; yúCXý/Zbý¢<€H­¶ /e~àI6çГ„$Â|'ŠsZw0CÊe†ú\áœF=~aev ÿ©€#© Qe~êD‘ÞûrˆÒl:¤{[kÙö®€&§= ûe’}±@ø×@Š´Œ*ÞGã~%`bÿßžoö»&VuWs!o·­€³£<fÉ|à:Ïï…/”ð¢WÉDL¨áÖŒ¬‹†ß]KÃW—î´’j‡›ÕˆC÷~~\+õÄ•é…ÒA·~ ]"õ6•ƒ†ÌÔoDOY^î‘މÞBMüyOíà‡Š`lî“ZÙ~(?VÍ¡ƒ0ºi.y'öµ €ì±’#ïw6k+„MÑTEÈ Q*ßeˆV•ÂûéeNzN(D´€N¸É-|Ea¬ópÝŒšìN]0}A1“º €&µø+|`Üïºm-ö×d®y¤"œ¬sÇ AÑìKyÓ+ƒO¤HávŒhºú”‘üßó0ex€Ó¥ƒRÕ×O4ˆ7†»€Ö½Ì:›KiÏ"­°(Ç|%Yuß …<¢ +yŒa’êsˆœœv½e?ð>Š®™ÁÁuSfBðà‰×š›5w\c‡êp‡ÄŸ0fzG\ßȃO©M) ~ýOkΞ€¾¸?<þ=ˆ¹—€mÏcR }r"½¢5‡*îžhªqÓÿŽ]˜6´y‰ZØkƒ¶@=ì25I¯=ƒèâoc.t°Žšè|ûQÊ€ È“P]|„$™¢´lwò[zÕ„€ÁÐKE}©M™oE KyžV¾Ì€è̇WŸx¶%ŽƒØ$,.?²:„‹îŒn/fùß8ο†NT{ΫF='«Ö7~©‘ˆ‡ÿ9wÖVÈÇ~€ðܹfl^æŸÂÀ_R®x(±ˆ{«=’~t«’œ¦*þ¥+®’Ë8¦»ŒÄ@}EA}¬’‰úê{vE‹¯uˆè¡{–E鮉¥ Š|Ažª·‹5=~89 £‘‡Ãâ+™"š?.‰@ލwBe{©Û„ĽbX¿p-〼Úülø\£ÂÖƒ3ÿÞ{1>õ¢”Å(žd’ŠÔ²XQHsãä€vàÎqS۳Êeë` (Ž~®IO.sØá€+é¸vQGn¦”ò.~Q$ƒ{Ìbi‹[v¹ó‰ô?U‡©ÀŠbäaà¿ã‡qü#ª†"Ä2f«\›·qŒ¼$Ú~Ÿàì׎r]IÉ¢ œwA#vƒßô€»þÇ~+"Šî¿2fHYâ¯a“¾6fyÇå‘€ þ>0‡”Éæm“L¡ó ”LvmÈRˆó"Å}+ó€!øË~†s…LÒ"t>§”j³œa YÆ©…œðJlcÁH03ÐwÐØ‡„ ê}6î«€³ð{€:øŒ&|ì-~ó©‚äÉ|ýÓƒfà|J -„ôß!|Þ•ƒAã}©?‚iêš~ˆ¿€‹õÒ^€ºµ)ó:×ý|Aßá…N,ïu|ÈÍìC¯ht°Í ˜[•SÊ™Bº(p®5)ˆ~Üv}y€ì~äù…ö1Ñp"¹ïœËZÅPè”ÉÅÁw FËük$åþ†m8;kE­Ð©>iš:h‡æÀ#öƒç-±o¾±´§>i8—…¬îñÅç ˆ?@‰bÞð¾ xÁ€‹‰w ½p¡Ïfu7„åø~‹Ôâ’úW(IŠEèîõà€QOIŒßäù˜àŒŽOTJ‰Åî/IÓÆ–ä`9 zV»«©r/D€{*òh휃Í‹ëŒÿUŽB&„Aêxk´à³ys…—GBOï‡}û»zè¶»³ëyØý©‡ÁP‰Cƒ¡¥r×£ã˵\Ü™SkAÙ=æR?‡@Ðu|¦øËéñÔc ýrÌ”†!Tñ8D€v*Á^¤‹PýEví£ÍÓ´ZÄ!±j|4臗oŠ ’‡Z…+˜€(BsF$i(ž[b‡\ko‘fø/uöœHåX{ê¨^Õ—~=´¦ÈÚ(¾÷¾ïƸ‚É˺³ïαÜ~rϲ K͹´}ƒÈÙ¹íCÁ°ÁÛÍ·ŒÌ“~¬´Ú0{j Yì¤tC”h]jô‰x[‹‚’1óE €KÄ*Ž„ºb ’NužåÔ©=‹ÀæËñ|sŸiö¨kþ‡$%PK €¢Pž‡‹¹q"è9¬ç'´Oß—t‰LÊN€§T·€’iyƒÐÄ|ˆ˜$ Y)€!PÃo“{ÓǵÐwŒ½#BÂ(i+í1±Tˆž/GV€Ö\ÌýĦúý£îX€%_‚÷–­62šÌ¾G/ƒÚnUÚÉhv½‡<:–ó~Ô«ÌÿëSEØkGÛ|ÌÛr˃”KY*¨í~b“Ä)è+{’ø~¿¦q LD–‡áyr··ùöQUƒ=uùÀkð‡W2‚½ssÂ¥ðòUƒ/v—»…úÌL·†T{M­2K;Ó›äš*´£¡}Öˆ%LQöóÄ¢m€corrupt_fmtstring_1_16_8000.le.wav000066400000000000000000000077141225012771600373120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFÄWAVEfmt #B4CeTb42D5CT6Tdata ê=:`Sãg™vž~sþx‘kåW?ˆ"åôä‹Çj­(˜‰!Ø€Kˆ—U¬ÎÆâä¸j#@YªlÛyºà}Zt°cÜL<1|„òQÓÚ¶óž(§‚,€é…”“S¨ÚÂtá%Ö!{?0YMmzä})rÐ_.GÑ)¢ ½èPÉw­—¾‡€ìù‹žÜ¶×Ôäõ¼7ãR*iixˆ~Øs·aËHÅ*³ Þç©Ç[«þ”8†!€>ƒc¾£ä¾àÞaí"B«\·pÁ|àÇyÙjT)7QóhÑⲚ݈ € ‚ð -¼¹Ü›" B¾]ãq}}šx7gqNŽ/ç +é$Ç‚©¥’l„€å…Ÿ•þ­ÍnðI70Ukl{þ£zckiS˜4i·ì†ÉŪ “_„€Œ†Y—±²ÑVöæH>”[Qq}a`vOc¸Gê%ÅwÛB¹'¨‰€¹‚ l§ÏÆnë(6«UÂm?|Ëx{eÔIu'q4Û<¸Ç›~ˆ>€Üƒ“›¬ ÎLôÂÑ?^Îs×~~šqgZ¡::·íÞÇR§C‚%ŸŒz£‰Ã«éù7‹X¦pâ}ã~ys¬\«<‘î`Ç>¦ŽƒÌ ò§ ÊÓñ/ô@D`çu—C|+lßP -™Û%¶˜È…€ˆíœ™¼«ãì Þ5ª¿ŒA€Á†eŸ›Æ”ö(ÛR…qqrz cßùеv‰‚A¢à+(cbsVCãýö¸“ŠÀš¡à)2db¬q4?øt³¸‡zƒf¨~êè3Žký:j41«ç¦¦‚r‰|¸ÞFv™}‘Z¢$Ξ” €È—âÓŒ¤_ç~Irà=»ó¾­Ÿ„%‡µ´KýGãvÅ|FVßDůŽ¡Ãä2‡lÑ¥d¡$×c˜€>—µÕ3$–dÙ•k /µàžX€;“ÈÏþÇa¢ñl†0TáÐB€n”ÄÒ#eòiù(£Ø±— €c›ß80~mdz^žÇp=‚bª½õzEIx@zBJ®û¸®Iƒ°‹ÂÄ×Ë^”Ckÿ)ïÖ•q€.¢-ìÜ>)v\{åKÈûS­‚+Ž˜Ë% fõ bL4ÅèŠo„µE³Uc~þn.GØC”߀?§<öÝI\{uX9QãNš€8¡î:D¬yév×<=掛€ ¡cï½Ez{u­8¹à•—€§èøUNX}õoF,åÒhƒx´` \Ô›d†˜¾*†ÈŠ„Êw%m~µOíø¥3€KœËëèE{!rë-ÚÑÑ„”¼îV½Ma² F¯Ñ€J›åïÿMÀ~Öf–Õ´¤6˜ÅëjKh~gðY´fµ™9ïøN&»cŸ Æ­]€; yúCXý/Zbý¢<€H­¶ /e~àI6çГ„$Â|'ŠsZw0CÊe†ú\áœF=~aev ÿ©€#© Qe~êD‘ÞûrˆÒl:¤{[kÙö®€&§= ûe’}±@ø×@Š´Œ*ÞGã~%`bÿßžoö»&VuWs!o·­€³£<fÉ|à:Ïï…/”ð¢WÉDL¨áÖŒ¬‹†ß]KÃW—î´’j‡›ÕˆC÷~~\+õÄ•é…ÒA·~ ]"õ6•ƒ†ÌÔoDOY^î‘މÞBMüyOíà‡Š`lî“ZÙ~(?VÍ¡ƒ0ºi.y'öµ €ì±’#ïw6k+„MÑTEÈ Q*ßeˆV•ÂûéeNzN(D´€N¸É-|Ea¬ópÝŒšìN]0}A1“º €&µø+|`Üïºm-ö×d®y¤"œ¬sÇ AÑìKyÓ+ƒO¤HávŒhºú”‘üßó0ex€Ó¥ƒRÕ×O4ˆ7†»€Ö½Ì:›KiÏ"­°(Ç|%Yuß …<¢ +yŒa’êsˆœœv½e?ð>Š®™ÁÁuSfBðà‰×š›5w\c‡êp‡ÄŸ0fzG\ßȃO©M) ~ýOkΞ€¾¸?<þ=ˆ¹—€mÏcR }r"½¢5‡*îžhªqÓÿŽ]˜6´y‰ZØkƒ¶@=ì25I¯=ƒèâoc.t°Žšè|ûQÊ€ È“P]|„$™¢´lwò[zÕ„€ÁÐKE}©M™oE KyžV¾Ì€è̇WŸx¶%ŽƒØ$,.?²:„‹îŒn/fùß8ο†NT{ΫF='«Ö7~©‘ˆ‡ÿ9wÖVÈÇ~€ðܹfl^æŸÂÀ_R®x(±ˆ{«=’~t«’œ¦*þ¥+®’Ë8¦»ŒÄ@}EA}¬’‰úê{vE‹¯uˆè¡{–E鮉¥ Š|Ažª·‹5=~89 £‘‡Ãâ+™"š?.‰@ލwBe{©Û„ĽbX¿p-〼Úülø\£ÂÖƒ3ÿÞ{1>õ¢”Å(žd’ŠÔ²XQHsãä€vàÎqS۳Êeë` (Ž~®IO.sØá€+é¸vQGn¦”ò.~Q$ƒ{Ìbi‹[v¹ó‰ô?U‡©ÀŠbäaà¿ã‡qü#ª†"Ä2f«\›·qŒ¼$Ú~Ÿàì׎r]IÉ¢ œwA#vƒßô€»þÇ~+"Šî¿2fHYâ¯a“¾6fyÇå‘€ þ>0‡”Éæm“L¡ó ”LvmÈRˆó"Å}+ó€!øË~†s…LÒ"t>§”j³œa YÆ©…œðJlcÁH03ÐwÐØ‡„ ê}6î«€³ð{€:øŒ&|ì-~ó©‚äÉ|ýÓƒfà|J -„ôß!|Þ•ƒAã}©?‚iêš~ˆ¿€‹õÒ^€ºµ)ó:×ý|Aßá…N,ïu|ÈÍìC¯ht°Í ˜[•SÊ™Bº(p®5)ˆ~Üv}y€ì~äù…ö1Ñp"¹ïœËZÅPè”ÉÅÁw FËük$åþ†m8;kE­Ð©>iš:h‡æÀ#öƒç-±o¾±´§>i8—…¬îñÅç ˆ?@‰bÞð¾ xÁ€‹‰w ½p¡Ïfu7„åø~‹Ôâ’úW(IŠEèîõà€QOIŒßäù˜àŒŽOTJ‰Åî/IÓÆ–ä`9 zV»«©r/D€{*òh휃Í‹ëŒÿUŽB&„Aêxk´à³ys…—GBOï‡}û»zè¶»³ëyØý©‡ÁP‰Cƒ¡¥r×£ã˵\Ü™SkAÙ=æR?‡@Ðu|¦øËéñÔc ýrÌ”†!Tñ8D€v*Á^¤‹PýEví£ÍÓ´ZÄ!±j|4臗oŠ ’‡Z…+˜€(BsF$i(ž[b‡\ko‘fø/uöœHåX{ê¨^Õ—~=´¦ÈÚ(¾÷¾ïƸ‚É˺³ïαÜ~rϲ K͹´}ƒÈÙ¹íCÁ°ÁÛÍ·ŒÌ“~¬´Ú0{j Yì¤tC”h]jô‰x[‹‚’1óE €KÄ*Ž„ºb ’NužåÔ©=‹ÀæËñ|sŸiö¨kþ‡$%PK €¢Pž‡‹¹q"è9¬ç'´Oß—t‰LÊN€§T·€’iyƒÐÄ|ˆ˜$ Y)€!PÃo“{ÓǵÐwŒ½#BÂ(i+í1±Tˆž/GV€Ö\ÌýĦúý£îX€%_‚÷–­62šÌ¾G/ƒÚnUÚÉhv½‡<:–ó~Ô«ÌÿëSEØkGÛ|ÌÛr˃”KY*¨í~b“Ä)è+{’ø~¿¦q LD–‡áyr··ùöQUƒ=uùÀkð‡W2‚½ssÂ¥ðòUƒ/v—»…úÌL·†T{M­2K;Ó›äš*´£¡}Öˆ%LQöóÄ¢m€empty.wav000066400000000000000000000000001225012771600330360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/datagendata.sh000077500000000000000000000053151225012771600331410ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/data#!/bin/bash ############################################################################# ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is the build configuration utility of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################# # Generate some simple test data. Uses "sox". endian="" endian_extn="" for channel in 1 2; do if [ $channel -eq 1 ]; then endian="little" endian_extn="le" fi if [ $channel -eq 2 ]; then endian="big" endian_extn="be" fi for samplebits in 8 16 32; do for samplerate in 44100 8000; do if [ $samplebits -ne 8 ]; then sox -n --endian "${endian}" -c ${channel} -b ${samplebits} -r ${samplerate} isawav_${channel}_${samplebits}_${samplerate}_${endian_extn}.wav synth 0.25 sine 300-3300 else sox -n -c ${channel} -b ${samplebits} -r ${samplerate} isawav_${channel}_${samplebits}_${samplerate}.wav synth 0.25 sine 300-3300 fi done done done isawav_1_16_44100_le.wav000066400000000000000000000531161225012771600351500ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFFVWAVEfmt D¬ˆXdata"V,ËÁƒ f!òœVç!%ó(g,´/û2609<ú>±ANDÇF!IWKjMXO QÃRj;b8<5þ1§.8+´'$p µë2I W `glýsù{õˆñíºéãåâ[Þ®Ú׎ÓÐÆÌ‡ÉdÆ]ÃvÀ¬½»€¸¶ã³Í±à¯®€¬«È©­¨À§ÿ¦l¦¦Ï¥Ç¥ë¥>¦À¦p§M¨Y©ªó«ƒ­=¯!±/³eµÁ·Cºë¼µ¿¡Â¬Å×È̃ÏÓ–ÖAÚÞÓá´å¦é¢í©ñ¸õÌùäýù î Ù¾•d"!Ñ$l(ö+g/Â26-97<#?ðAD&GIÍKçMÛO¥QHS¿T V,W XèXYíY+Z±]³©µ¸¸ºz½`ÀkØÆäÉPÍØÐzÔ4ØÜêßããêçì"ðNô~øµüï ! 5 AE=)!Ñ$ˆ(+,·/*3‚6½9Ù<Õ?°BfEøGcJ¦LÁN±PvRTzU·VÆW¥XTYÒY Z¥A¦D|G$JLæNýPßRTVGWQX!YºYZ•;8q4©0Á,¼(š$a ±?¾6 ¥yüå÷UóÍîQêáåƒá9ÝÙìÔîÐÍSɹÅHÂý¾à»ï¸.¶Ÿ³A±¯(­n«í©¥¨™§É¦5¦Þ¥Ã¥ç¥G¦æ¦¿§Ö¨(ªµ«|­}¯²± ´Á¶”¹™¼Ë¿+õÆfÊ>Î7ÒQÖ‰ÚÚÞCãÀçQììð•õCúûþ£3Ä IÇ5“Ü"'(+%/3¿6W:È=A-DGÝIlLÈNïPàR˜TV_WjX:YÍY#Zî¤éå¢àAÜö×ÉÓ¹ÏËËÈ^ÄåÀ™½{º·Ô´M²ÿ¯ê­ ¬lª©ã§ü¦T¦ì¥Ä¥Ý¥6¦Ð¦«§Å¨ª²«…­“¯Ü±^´·º#½uÀõßÇsËoÏÓÏ×,ܤà3å×é‹îNóøêü¼p! Éiùyä!9&t*Ž.Œ2f6:¤=A5D8GJ¤L O9Q.SèTfV§WªXlYðY3Z5ZøYzY»X¾W€VULSWQ'O¾LJHGH1EîAz>Ô:73á.™*0&©!O„© Óáÿíúýõñ6ìgçªâÞxÙ Õ¹Ð‘ÌŽÈ·Ä Á”½Nº?·g´Ì±m¯M­n«Ñ©x¨c§”¦ ¦Ê¥Ð¥¦°¦‹§­¨ª¿«­­Ý¯M²û´å·»e¾õÁ·Å¨ÉÆÍ ÒwÖÛ±ßwäTéCîBóMø\ýroX >ÛŒ($¥(-D1[5I9 =ž@þC+GJÛL[OœQœS^UÚVXYµYZ=ZZ¦YñXõW³V-UcSTQOyL¯IªFkCö?O§O¨ª©N«7­g¯Ú±Ž´‚·³º¾ÀÁ—ŢɨÍ:ÒÂÖnÛ:à åê.ïPôyù­þÐÜç æÖ²y!$&²*/b3|7k;(?´B F$IL¦NQ&SU–VâWèX¤YZÈ;ÄkÀÒ¼q¹M¶h³Å°e®L¬|ªô¨¸§È¦&¦Ñ¥Ê¥¦©¦§¾¨;ª¬®q°³ôµ¹}¼ÀóÃÈ@̬ÐCÕÚáÞÜãõèî[ó¢øòý@n— µÄ¿¢!i&+“/ì38<å?yCÔFóIÓLpOÊQÝS¨U)W^XHYåY2Z3ZãYFY^X%W¢UÒSºQ[OµLÍI£F:C–?»;ª7h3÷.]*ž%» ¼¤w: ñ¢Rü÷»ñ€ìVçAâGÝjرÓÏ¸ÊÆ|¯¾»Å·±´à±U¯­«p©¨§J¦Þ¥Å¥ÿ¥‰¦f§’¨ªÜ«õ­Z°³üµ3¹®¼fÀZÄ…ÈâÌqÑ*Ö Û à0åkê¹ïõ‚úôÿRœ â;G9$ )¹-?2–6¾:²>nBïE1I2LîNbQŽSnUWGXk:06Ä1)-a(v#jAÿªH Ýkþüø“ó5îæè­ãŽÞŒÙ°ÔúÏqËÇö ¿_»ò·È´å±L¯ÿ¬«P©ó§ê¦4¦Ô¥Ê¥¦·¦­§ø¨•ª†¬Å®T±-´P·¹ºe¾OÂwÆÖÊhÏ*ÔÙ)Þ^ã®èîóù¦þˆ ïE‹¸Ê#º(…-&2˜6Ø:á>¯B?FI—LYOÏQøSÒU\W“XuYZ;ZZ«YâXÅWTVTzRPfMjJ'GŸCÖ?Ï;Ž73n.˜)˜$w5Øhç ]Îþ?ù¸ó:îÌèvã;Þ Ù+Ô`ÏÄÊ[Æ,Â7¾„º·í³±€®A¬Tª»¨y§Ž¦ý¥Å¥æ¥a¦5§a¨æ©¿«î­o°@³^¶Æ¹u½gÁ™ÅÊ©ÎÓ‚Ø®Ýþâkèîíˆó,ùÜþsü €òTšÃ$Ç)¦.U3Ó7<(@øCƒGÉJÇMwPØRèT¤V XYÑY.Z3ZÞY/Y)XÉVUS©PùMûJ³G DK@3<Þ7R3. )„$Dãh×6 ŒÝý0øŠòòìkçÿá®Ü‚×ÒªÍÉÄoÀ‚¼Ù¸zµg²£¯3­«R©ç§×¦#¦Ì¥Ó¥7¦ú¦¨‘©f«’­°ê²¶‡¹G½KÁ”ÅÊÙÎÌÓíØ9Þ¨ã7éÞî™ô^ú.è -¹0‰!Á&Ó+¹0k5é9,>0BïEhI•LuOR;TV§W×X©Y!Z:ZöYTYVXûVEU6SÐPN K±G D@ê;z7Î2í-Ú(#9´` žÓü:özðÉê-å¯ßRÚÕÐ=ËŸÆ?¾Eº¶¶u³†°ì­ª«Â©9¨ §@¦Õ¥Ë¥#¦Ü¦ö§p©H«|­ °ð²+¶µ¹Œ½®ÁƸʙϮÔõÙdßûä­êyðTö?ü%îµ j ”þ#@)V.>3î7d<˜@ˆD/H‰K’NHQ¦S«URWX‰YZ;ZZiYoXWZUCSÒPNéJxG¸C¯?_;Í62û,Ä'a"Ö-h «¿ÿÒùìóîLèŸâݬ×pÒhÍ—Èij¿ª»ê·~´d±¢®;¬2ª‰¨B§_¦à¥Æ¥¦Æ¦Ü§X©5«r­°³Q¶ô¹æ½$¨ÆoËsЭÕÛ®àiæAì1ò/ø<þ3 ùÅ}!‰&Ò+í0Ï5x:à>CÚFcJšMzPS)UóV[X_YZ‘BšFJJ¤MŸP8SlU8WX“YZ9ZçY'YùW`V^TóQ$OòKcH{D=@°;Ù6¾1e,Ô&!'ðµm#üÜõ¡ïzénã…ÝÇ×;ÒèÌÓÇþRºz¶ý²á¯*­Úªø¨§|¦è¥Æ¥¦Ú¦ ¨³©Å«C®*±v´#¸,¼‹À>Å=Ê€ÏÕ¿Ú¨à¾æòìCó¡ù q² æØ$ƒ*ù/25,:Ú>=CIGýJTNGQÔS÷U®WöXÎY4Z'Z¨Y¸XUWƒUESœP‹MJEFB–=Ä8¨3K.±(â"æÂ‚+ Ç\ýõö™ðPê#äÞ9ØÒÍíÇÃn¾,ºE¶½²š¯á¬”ª·¨M§W¦×¥Ï¥<¦!§|¨Iªˆ¬8¯Q²Óµ¸¹ù½”ÂǺÌ7Òô×äÝäJê¯ð(÷­ý7Ÿ õ:^_#0)Ï.04N9!>¥BÒF¢JNQ¹SëU¬WúXÓY6Z"Z—Y•XW5UÙRPÝLDIGEð@A†CÙGÃK@OIRÙTíV‚X–Y&Z1Z·Y¹X8W6U·R¼OKLiHDg?U:ë42/2)ô"â#Mi‚ú¢óÔì#æ—ß<ÙÓ;Í©Çkˆ½ ¹÷´U±+®|«M©¢§}¦à¥Í¥C¦A§É¨Öªd­r°û³ù·d¼9ÁpÆÿËàÑØmÞåÎë³ò­ùµ¢zBçe"°(¾.…4ÿ9!?æCCH3L±O¶R>UDWÇXÂY4ZZ}YTX¥VoT¹Q…NØJ·F*B7=å7;2E,&‘è+ ,&ý#ö/ïTèžáÛÇÔºÎúȎ¾ܹ¢µÝ±’®Ç«€©À§Œ¦ä¥Ë¥A¦C§Ô¨íªŽ­²°T´o¸ü¼ôÁQÇÍÓaÙòß´æ¡í®ôÌûð÷ éÄy%O+[17ƒ<ŽA4FkJ/NyQAT†VEXxYZ4Z¾Y¸X(W UiRDO K„GöBü=Ÿ8ç2Ý,Œ&û7J? !ûüÚõÇîÐçÿà`ÚüÓàÍȟ½길´±Æ­«ë¨O§D¦Ë¥æ¥”¦Õ§¥©¬ì®Z²H¶±º‹¿ÐÄxÊxÐÈÖ\Ý+ä)ëIòùÅíâ“# *?0%6µ;å@­EJãMCQ"TvV?XxYZ3Z³Y XýVËT RÈNK¿F Bä<[7v1>+¾$ûʇCúóßëÙäÿÝ\×þÐîÊ5ÅÞ¿òºx¶{²þ® ¬£©Î§Œ¦â¥Î¥T¦r§%©m«D®§±Žµõ¹Ò¾!ÄÕÉæÏKÖøÜáãûê:òùõ?rˆQ$Ü* 17¬<àA¥FôJÆNRØTW²XÀY6ZZ[Y X#VªS£PMþHnDh?ø9"4ó-u'² ·G é…ü'õÚí«æ§ßÙØQÒÌ2ƲÀŸ»·æ²M¯?¬Å©Þ§’¦â¥Ï¥Y¦§C©ž«® ²¶œº ¿ÅõÊ2ÑÂךޮåðìWôÑûW >A '™-×3º9;?ODíH M§P¶S4VXjYZ2Z«Y…XÅVlTQNÿIxEu@;$5é.Z(ƒ!p-È MÊüKõßí’æqߊØéљ˥ÅÀ»b¶G²¶®¸«P©†§Y¦Í¥æ¥ ¦ü§÷©¬½¯~³É·™¼ãÁ ÇÃÍCÔÛ(ârééð{ø¶(„¸·$v+é18¹=CÑG"LëO%SÉUÔWAY Z7Z¿Y¤XèVTQNJgEM@¾:Ã4h.¶'¼ „– úWû¼ó7ìÔä¤Ý²Ö лÉÏÃS¾N¹Ë´Õ°o­£ªu¨ê¦¦Æ¥.¦@§÷¨Q«I®Ú±þµ®ºà¿‹Å¤Ë!ÒõØàoçùî¤öbþ%Á >™¼#¢*71t7L=²BGLàO(SÖUåWPYZ3Z©YxX¢V)TQdM$IZD?P9!3”,±%†ŽÝ]øªðé§ásÚ‡Óî̵ÆéÀ•»Ã¶|²É®°«:©i§B¦È¥ù¥Ù¦f¨šªt­í°µ¤¹Ñ¾}ÄœÊ%ÑØ;ß­æSîöøýÑ… &œÞ#Ý*‹1Ü7Á=4C%HŽLdP¢S?V9XˆY+Z"ZkYXûUHSôOLƒGvBé<ã6r0£)‚"„à êü.ôjìÌäaÝ9ÖdÏìÈáÂL½:¸¶³Ç¯w¬Ê©É§u¦Ò¥ä¥¦¦¨?ª­°”´>¹v¾1ÄdÊÑØPßâæ¦îŽöþzK–í$û+´2 9ò>^DDIšMXQtTëV¶XÒY\8¶1¦*9#Žp 9úúÄò©ê½âÛ­Ó«ÌÆý¿nºsµ±j­nª(¨£¦Ý¥Û¥¦"¨fªd­±wµzºÀ<ÆãÌúÓsÛ<ãFë}óÔû-c €s*$’+Ÿ2@9g?EJzN:RLU£W?YZ.Z€YXßUõRTOKF‰@p:Ö3Ë,[%™•b ±üXôìä.Ü¥Ô|ÍÁÆ…ÀÔº¼µI±…­xª*¨ž¦Ú¥à¥®¦F¨¢ª½­‘±¶B» Á]Ç3ÎzÕ"ÝåMí¬õ&þžì×&;.;5Å;ËAAGLIPÅSˆV‹XÇYöCCIéMÜQU‹W8YZ+ZmYáWŠUmR’NJÄDè>y8ˆ1 *W">çd Ë0ø¦ï@çß3ײϠȼ²¶þ±®ÅªS¨®¦Ý¥à¥¹¦f¨äª)®4²÷¶i¼|Â#ÉNÐê×çß3è¸ðcù ¼ :¢#f+Â2ª9 @ÔEúJqO-S&VTX±Y:ZïYÍXÙVTPCLEGšAS;~4,-l%Qñ\ «íú<ò«éNá;Ù„Ñ=ÊuÃ@½¬·Æ²œ®4«›¨Ö¦é¥Ö¥¡¦D¨¾ª®²ì¶r¼žÂ_É©Ðg؇à÷è ñjúI Ÿ +%ø,V48;ŒAAGLLžP-TñVàXúY7ZšY!XÔU²RÇNJºD®> 8Û03)%!Ã&^„þ¬õîì\äÜÔ̆Š¿3¹ ´›¯õ«!©%§¦Ê¥n¦ò§Tª­–±c¶ì»ÂðÈJÐ ØZàçè¬ñ›ú` šÔ%±-5 <`BHMQQÆTiW1YZ$ZLY“WÿT•Q_MeH´B[«Ô®A³z¸s¾Å^Ì,ÔqÜåî÷Y„ RÙ#,Ã3ö:‘AG³LQ´TkWKõOÓSÏVáXZ1ZiY¯WUxQMÈGÃA ;°3È+e#¢•UÿþªõqìkãµÚdÒ‘ÊNô¼Ò¶¼±­#ª¸§A¦Ä¥B¦¹§(ª†­Ê±ë¶Ø¼ÃÕÊ¿Ò*Ûýãíwöíÿ] ™¥e$Â,¤4ô;£B—HÄMRŒUX£Y;ZØYzX&VáR´NªIÓC<=ú5.À%øÜˆ Ÿ÷?îå,Ü­ÓªË:Ät½i·-²Í­VªÓ§L¦Ä¥>¦¸§0ª­÷±1·>½ Ä…Ë—Ó)Ü$åoîé÷„ Xw@&Ÿ.{6½=QD#J#OCSwV´XõY5ZrY±WóTBQ©L3Gï@ï9I2*_!KñjÓûEòàè¼ßõÖ¥ÎáÆÄ¿c¹Í³¯I«t¨ž¦Ï¥¦G§‹©Ï¬±(¶"¼æÂ^ÊvÒÛ#ä„í÷Óp ã# &Š.6Ø=}D\JbO‚S­VÜXZ+ZFY[WoTŒPºK FŠ?M8j0÷'Æ> Úø8ïÇå¢ÜçÓ¬ËÄ!½û¶°±M­â©{§¦É¥‡¦Q¨#«ö®¿³n¹ò¿9Ç,ϵ׸àêÂóýf zœ#T,Œ4$< C*IqNÌR0V’XìY5ZqYŸWÅTëPLiFà?”80( ¥ý 0YøšîåÕÛ ÓÄÊ!Ã9¼¶ç° ¬Y©§ò¥Ü¥Ý¦ï¨¬2°NµQ»*ÂÁÉÒÕÚäºí’÷†Z x‹''018‘?.FôKÓP»TžWtY7ZäY{XVRüM‰H3B;53º*¹!N–±»úÕðç²Ý°Ô6Ì]Ä?½ñ¶ˆ±­¦©G§¦Õ¥Ç¦Ò¨ñ«°DµY»JÂÊaÒTÛ¾ä€î{øŽ~ EÉè(‹1’9æ@mGMÏQ…U.XÂY;Z—YØWU QmE’K¼PÓTÌW›Y§6.½$ûÚ ü§ñpçŽÝ!ÔJË)ÃØ»qµ °»«Ž¨¦Ç¥7¦à§¼ªÂ®â³ º,Á(ÉåÑCÛ$åeïßùuèö"[,*5@=…DÞJ5PwT•WƒY;Z¹YXUQÒK™En>f6¡-;$T“ûð3æ@ÜËÒóÉÙÁšºQ´¯ñªý§C¦Å¥Š¦Œ¨Å«-°°µ>¼¿ÃÌ-ÕÚÞézó$þÍ>o7'x09Ý@ÆG²MŒRBVÆXZZâXoVÇRøMH+AY9¹0i'ŒDµþ[óßèµÞÕçˇÃ¼sµñ¯‘«a¨o¦Ã¥`¦B¨f«¼¯9µÇ»P÷ËàÔ§ÞêèóJþ «ôÔ'$1Å9•AzHWNS²VY'ZùYƒXËUØQ»L…FM?-7B.¬$SúÄï@åÛ„Ñ”ÈoÀ5¹³é­ªW§÷¥å¥#§­©w­v²˜¸Æ¿åÇÖÐzÚªäCïúÚ]„$$.7H?ŒFÉLìQàU–XZ ZïXrV²R½M§Gƒ@n8ƒ/å%º$M]û}ð×å‘ÛÕÑÅȆÀ6¹ñ²Ï­ä©A§í¥ð¥J§ö©ë­³m¹ÒÀ'ÉPÒ'ÜæQñSü_2Äë&€0^9eAuHsNISäV5Y1ZÚY*X,UçPoKÓD1=¤4L+M!Íô íáõúêdàEÖÈÌÄ;¼oµÁ¯K«¨C¦È¥©¦è¨y¬R±^·†¾®Æ¹ÏÙâã²îÇùø½%æ.ÿ7A@ŒGÁMÊR‘V Y*ZìYMXYUQ–KïD:=”4 +!`f >õêgß:Õ·ËÃ9»€´ô®§ª¬§¦Ù¥§š©…­¹²!¹¥À'ɇҜÜBçKòýÖá ç(2m;dCRJP£TÞW½Y7ZLYüVRS[N,HÚ@…8M/W%ÊЖGùî%ã«ØÎηʼn½g¶o°¹«W¨X¦Å¥¡¦é¨’¬‘±Ï·5¿¤ÇûÐÛÅåáð@üœÉ±(ï1õ:CJúO—TÞWÁY7Z>YÜVSþM¨G,@ª7C.$d@às÷)ì/á²ÖàÌÝÃÓ»á´%¯·ª©§ ¦à¥,§è© ®„³>ºÂúÊ·Ô,ß)ê„õ v ©~"Ä,U6?²Fê4¼*ÊGe\ücð¯äwÙíÎDŦ¼;µ'¯†ªl§ê¥¦Á§«î¯;¶Ý½²Æ“ÐNÛ·æ”òµþÔ ©"ï,÷6@ðG’NÌS…W¬Y6Z"YrV4RzL\Eþ<„3)ñ<1úùí=â ×”ÌÃ¥º}³¼­{©Ð¦Ç¥f¦ª¨Š¬ó±Í¸÷ÀLÊŸÔÂß}ëž÷ÝòÂ'ª1\;üC]K^QäU×X)ZÓYÚW@TO~HŒ@h7>-<"—… @þòæƒÚ³ÏÆÅî¼Uµ¯lªR§à¥¦ ¨œ«Å°k·p¿¬ÈôÒÞÞéöxǹ3&ö0Ó:˜CK9QÓUÒX*ZÐYÉWTÚNH@µ6],0!_( Áüjð\äÓØÎ-Äs»´ ®¢©Û¦Æ¥l¦È¨Ï¬n²Š¹Â©ËTÖÍáÛíHúÄ øP*Ý4j>ÊFÐM]SRW Y7ZY?VÃQµK4Db;l1&ש1«õXétÝ9ÒàÇ›¾œ¶°ýªœ§ñ¥¦ß§n«¤°g·–¿ É’ÓùÞ ë÷)­Ìc(13=¥EñLÀRóVvYÇFN¹S®WÔY!Z‘X-UP7Iã@67b,¢ 3WRújíåàÕÊ)À¡·›°?«©§î¥¦#¨ ¬µ±¹ÚÁÿË<×Zãð$ýC c#û.˜9CK{Q:V+Y;ZgY³V(RäKD¶:(0”$9Y :þ#ñ[ä)ØÏ̊“¹²M¬G¨"¦é¥§6«¢°Ã·rÀ€ÊµÕ×ážîÈû "B. 9œBÃJTQ(V&Y;ZcYŸVRžK›C#:j/ª#$ Ýü«ïÔâÖJËÁF¸±s«»§ï¥¦:¨G¬'²¼¹ÜÂUÍêØ_ågòÂÿ ûd&õ1t<£ERMRSƒWÍY!Z~XìTOTH“?l5*×í¢@öéh܅Ыż ´¨­©s¦Ì¥%§yª´¯»¶c¿~ÉÐÔáîƒûû'ß"Ð.º9^CˆKR²VsY9ZþXÇU¨P¼I+A$7â+¢­JÉ÷uê›Ý…Ñzƹ¼z´ï­>©¦É¥§sªº¯Ô¶˜¿ÔÉJÕ¾ááîlü P$ 0ë:{D€LÏR>W·Y(ZŽXóTlOH?³4)‡QÁ$ôËæÚÎTÃñ¹(²'¬¨¦¦¨;¬H² º—ÃvÎzÚ`ç×ô–-]ç)y5Ö?»H÷O^UÎX4Z‡YÉV RgKC9Ñ-|!`ÈùoëNÞ÷Ѱƽ¼[´¾­ ©c¦Ò¥`§«¢°!¸RÁÿËå×Àä?òã D (á3…>²G6OßTX)Z©Y WfRÏKnCw9$.¹!Ëêø4ëùÝÑ8ÆB¼å³Y­Ã¨A¦á¥©§«v±A¹À·ÍãÙûæ¯ôªyã›*N6¼@¡IÆPV/Y'HÍOsUõX;Z=YV™P)Iá?ú4»(ty %ÿÕðæâ´Õ’ÉѾ¹µ„®a©v¦Ó¥~§m«‡±¥¹“ÃÏÍÛzéÁ÷:n""ù.Ÿ:ÉD3M§SùW ZÓYNW‹R«KÙBP8S,0>Ùaô4æ¯Ø-ÌÁu·È¯0ªÒ¦Å¥§«ª€°h¸/•ÍMÚèZöùaw3½&ù‰ Ñû2íßÔÑÐÅY»·²&¬Ô§á¥Y¦;©s®ÞµI¿vÊ×ÒäJó!Úr,¥8XCW3D&I 2ú@ëãÜÏyÃ$¹Í°®ªù¦Ã¥§÷ª;±¹¹8ÄgÐõÝwìûº ‚š'•4@ÏIrQÌV´YZèWAS>LCý7R+h©~ÿTðšá½Ó#Ç%¼³=¬Ç§Ø¥¦¸©k¯q·ŽÁzÍÛÚPéoøÈÑ,%}2Z>sH{P5VxY+ZFXÙSMôCð8F,S7ëðâ ÔRÇ8¼³0¬º§Ô¥¦ç©Ä¯÷·IÂgÎþÛ¢êëùa vÕ&4×?¿IQæVÄYZ¦W¸R_KÑAS6?)óÚ hüíBÞsÐÄa¹Í°‘ªÚ¦Ç¥`§˜«T²^»tÆ@Ódáqðûÿ|oƒ,H9^DpM:T‡X7Z:Y˜UkOãF><Î/ð! ˜ôÌäaÖ4É©½´Ñ¬¨á¥r¦³©¯Ù·R§ÎÜgëöú ßc(®5bA!K¡R¦W Z·Y³VQüH²>„2Ì$öt¾öNçØË6¿HµŸ­y¨ý¥A¦D©ï®·zÁÊͧۡêKú r(†5UA(K³R·WZ¨Y„V·PsHô=1 #™îõ›åëÖ}ɽ½´¬¬ä§×¥•¦ªM°ú¸ÞãÐäÞ.î þà =»+ß8DDŒMoTµXÕ1¶#t‰wôÁäèÕdȤ¼ ³ã«i§Å¥§«î±A»ÊÆ,Ô÷âµòß×5"0A=H“P„V²YZsWRJ²?B3,%áá°õÐåÈÖÉ#½\³¬{§Ç¥þ¦«þ±k»ǛԌãpó¸É8#†1<>ðHFQþVáYÛYèV#Q¸Hï=1²""ï¤òÅâÚÓaÆËºz±¼ªÍ¦Î¥È§­¬Q´y¾ÊÊãØGèyøäí((68B3L¬SgX8ZYöTN‘DÎ8'+ ŸûTë¹ÛOÍ–À÷µÐ­h¨ì¥t¦û©e°{¹ðÄbÒaáfñî]"¶0´=¦H,QýVèYÏY¶V²PûGØ<§/Ü ôwõïûßÑÂÃz¸š¯t©=¦¦ô¨Í®j·‚²όމî&ÿÀ¹§.!%0e=‹H4QWòYºYiVP Gƒ;ê-¹w±ýþìòÜÎÁ¶Ã­J¨á¥¦|ªY±úºÇÕ§ä4õ²…&5¦AL»S‡X¨ã­˜¶ÂÂÏKßðl¢&#b2Â?ÌJSHX9ZÔX$TUL¯A—4Š%Õnò‡áÂѵÃé·Î®¾¨ò¥ˆ¦{ª¦±Å»uÈ@×—çÜøg wz+ä9 FÁOeVÌYÓY}VãOIF:”+{V Êø„ç(×WÈ »±\ªx¦ü¥î¨2¯Œ¸£ÄþÒãHôóN¼'±6CáM=U^YZcWYQ4HM<.ô NûÔé2Ù Êø¼w²ñª²¦ä¥’¨¡®Ö·ÙÃ/ÒRâšócæx'Œ6†CêMMUiYZ?W Q¸Gš;,-üª áùUè²×ŸÈ´»p±>ªe¦ ¦;©Ï¯‹¹ ÆÕÔPåßö¿1¥*o9þEÒO‹VáY³YVñNÇDè7Ö(&‚™ô#ãÌÒ@Ä ¸±®¨á¥Æ¦8«³é½nË Û#ì þ=!,1,?¬J:S|X³0£ DGýdëRÚÀÊO½ˆ²Üªœ¦ò¥é¨b¯¹±Å¤ÔXå#÷L û“+r:öF§PWZcY UnM›B5n%?= ð¨ÞˆÎgÀÛ´]¬C§È¥ú§Ä­ë¶óÑ?âôK<$)j8bEŽOzVåY¤Y¼URNµCR6µ&€g(ñ„ß2ÏáÀ*µ…¬R§Ç¥ø§Ë­·IÃÒÃâ±ô *A9(F+PâVZoY&UVMRBŽ4™$ÕîæÜ¿Ìº¾m³Q«¿¦é¥Ø¨o¯j¹ZƺÕàæùœ ‡:.=>InR,X{/Õß ]úèÏÖDǺ诩ö¥¦¦ «6³‘¾¶Ì Ýâîwâp%p5-CN¯U«Y×Y5VæN>D¬6Å&6¼#ð5Þ·Í_¿Ê³x«Ç¦ë¥î¨¯¯ê¹)ÇÞÖZèãú• žW0û>ñJ°SØX1Z¨WZQŠG£:4+äu²ôiâfÑh¶ó¬q§Æ¥ ¨$®Ñ·§ÄÔpåú÷Ù &3.B=§IÝRxX:ZXRvHµ;T,œõ*ãûÑÏÂS¶­y§Æ¥¨8®¸ùÄÔæÄøÈ -;/:>|JySÊX2ZW,Q"Gó9.*ŒÐÒòeà_ÏÀv´È«Û¦è¥ý¨ö¯‡º4ÈeØ\êTý]—"N3½AAMRU—YÛYV€N`C:5°$}tÿpìIÚÕÉлݰ}©¦ ¦E«Ã³¸¿™ÎºßVò‘p8*:`GnQÏW9ZŒXÝRkI¤<-¦eõœâ)ÑÙÁ]µH¬ §Ü¥Ò¨Ç¯nºHȵØïê+þeÊ#“4ôBJN VÜYŽY'UÖLü@#2û KñúÑçËÕ¹ÅW¸C®ú§Ä¥À§Ô­¼·Å ÕçJú¿ x ¸1«@¢LU‰YÜYV,N¯B4#dñü¢é]×ûÆE¹Ý®C¨Ç¥Š§u­E·ƒÄÔ­æþù› } Ò1Ù@ÔL9U›YËYÀU­MîA3Ì!íVûõç¶ÕvÅû·é­¿§Å¥¨˜®þ¸ÆÆO×ÇéWýý½#Ô4jCÎNtVZEYHTEK«>/5ó 3öìâÑ^Á¸´°«³¦¦­©±½øËZÝið>Æ$*ƒ:H,RSX:ZÈWQF~8¾'[“í®Ú–É!»°Î¨Õ¥C§­Ö¶;Ä’Ôç¼ú¨È!L3QBN VïY]YlT\K›>È.ª! #õ­á±ÏÀš³äª_¦G¦ª-³‹¿Ïá¤ôÂVƒ.k>?KcT\YíY VëMëA©2à u \ù•åÓ߬µ+¬Ø¦ú¥©‘±w½°ÌƒÞò<”,á<"J´SY Z}VšNÅB˜3Ñ!W!ú5æ’Ó+ÃÔµ;¬Ú¦ý¥­©½±Æ½-Í*ßÔò.“-Î=êJBTWYêYîU˜MQAº1™Ü ÷”ãÑüÀ´«d¦M¦Ìª¬³wÀ‡Ðã ÷~ Cv1"A€MçUéYSY)T®J[=á,ð|ñÄÝÎˈ¼½° ©Ø¥R§c­À·ÞÅ×Oê¿þ)Œ&ù7‚FiQXÉ&ÛïÑU„+n<#JðSIYèYÀU M:@þ/3ÕýóÆßGÍ}½A±:©Ü¥S§­9¸ÃÆbØ(ì±8):ÄHSôXZPVðM\AD1 õ»àξ’±a©á¥F§~­4¸ÓÆ“ØyìxSç)=;^I‡S(YõYÜUM#@¬/›öãòÞöË@¼@°ž¨È¥å§Ü®Kº’ÉÝÛ&ðT!x-X>ÌKU¿YwYBTkJx²LöUZ½XR{Fž6u#'ú÷Hâ_Îv½”°„¨Ä¥¨°v½nÎjâ>ø|Ç#î6ÂFMRÙXZ¯U%Lö=ÿ+V>ë(ÖÌÃ!µ «-¦Ò¦õ¬4¸áÇÛuð߯á0BO[W{LúUZ‰XmQ.E“4¦ © ûóÞDÊß¹ê­'§¦ ª¦´wÃ(Öë2°-Ž?ˆMœV1Z XOPuCN2ð§áðÛ•Ç··w¬“¦j¦¬·±ÆÚìïÔ6®1CPîW3Z¯V—M‚?U-:ÄêXÕªÂó³(ªë¥†§ß®~»”Ìá{÷„…$$8'H}SoY’YæSÅHê8W%UOøÉá8Í÷»&¯¡§ä¥ªà³²ÂÕ6ë? 0.V@GNW;ZrWêN4A2/;)ìdÖ\ÃS´Kªî¥†§þ®Ö»8ÍúáÀø&­9uIeTÁY)Y«R­Fþ5µ!. äógÝ5É«¸â¬¨¦g¦(¬…·ÅÇÉÛCò£ G É4ÆERöXÝY¿TòI.:€&9Ùøñá͘»½®`§ÿ¥µª3µÄÄ^ئî%,(2ËC×PrXZ™USKò;}(GÐú²ã|Φ¼f¯£§ë¥Zª¨´Ä²× î¥Ìî1±CÔPwX Z}UK‚;Ú'uÛùªâ|ÍÅ»Á®V§¦ñª¾µ®Å¬ÙQð5$4ƒERYËY`TIÊ8‡$¸ óõÞÞÊ ¹í¬š¦ƒ¦«¬¥¸ŸÉjÞõv W$¨8I]TÎYúXñQ,E‘3Vùïm؃ÄÅ´Pªä¥Ò§ö¯Ã½BÐ"æÚý£ß+?ÎMW=ZW¬MÖ>Š+*Gý“å¼ÏP½Ÿ¯¤§ò¥ªªxµ™ÅçÙñð s †5ÐFSoYmY S¿Fd56 ¸˜ð‘ÙGÅ2µ|ªè¥Ï§°¾ÚÐ ç ÿU-k@áN°W1Z7VLYù)–ÈùnágË]¹³¬c¦é¦>®Ò»¢Î8åãý²®-6AÇOEXZéTNI8‘"a fñ„Ù˜Ä8´®©Æ¥Õ¨²bÂéÖ¤î² ý5ÆG TÕY¶X¿PŠB0/-HÿoæÏo¼®ý¦\¦´¬Œ¹äËNâû1¨+Á?çNìWZHUÎI8æ"€ Fñ/Ù ÄÁ³\©Ä¥C©•³îÃÙ1ñ† ð" 8ãIZU!ZÒW™N/?Ë*¸ùêàŽÊk¸ò« ¦q§È¯ƒ¾sÒê[R 3ÃEòRYY…QyC0Ñ”ÿ^æ1Ïæ» ®À¦™¦­=»eΊåÖþ6/CQQY—YûR·EØ2á¨7é™Ñ¸½+¯&§O¦º¬ä¹ÀÌÄãý§I.1BÆPÔXµYSS2F]3] yé¸Ñº½¯§Y¦ê¬EºYÍ’äþ¶U/CjQYYšRòD¢1A¶ç…Ïë»è­¥¦¿¦6®o¼=ÐèÃJ2±ES«YØXµPãA¡-–¾û>â4ˈ¸Ê« ¦Æ§Ú°ˆÀ„Õ îd!ã7ÅI‡U/ZTW5M¥<' ôðÚïÄß³.©Æ¥ò©[µ ÇÝôö&Ð)ó>ÖNXÿYRTGÁ4‚ıé}Ñ6½“®Ó¦¡¦®\¼wЛèÅŸ4G TòY9XO?Ñ)ö¨ö"Ý”Æè´¦©Ä¥š©Ö´‡Æ%ÝÉö'þ)J?,OPXæYËS‚F+3oTçÏ»(­V¦A§Ø¯\¿|Ôbíì¸!‹8ˆJV<(Ú(ô~ÚÄõ²”¨Þ¥«É·ÚÊœâýü›0TD™RŸYÃXPa@ù*ÄýöýÜÆG´0©É¥fª›¶[Éøà\û*é.ƒC$RYìXrPÑ@j+%=÷ÝÆ8´©Ì¥‹ªö¶ïÉÅáUü#Û/TD²R­Y¡X¤O?©)õòÚ3ÄÖ²l¨ê¥Ž«Ô¸ŽÌóäÑÿžý2ÌF7T Z¼W~M<<ƒ%` 5ðtÖwÀ?°I§g¦²­€¼|ѹêðŠ !8§J^VóŸ•(Û>\O•XªY€RºCµ._ úEßÇô´[©Ê¥˜ªT·ÕÊHãpþµ‚2©FETZ†WÖL;®# ‚í·Ó ¾…®›¦§Ú¯*ÀwÖ¯ðW ¿&Œ=›NQXÇYÓRDý.uãùäÞýÆv´ ©Õ¥#«w¸‘ÌŽåb5«HyU9ZsVJ€7=`èûÎ;º¬ø¥h¨1³QÅ Ý&øìÃ-HCgR±YoXÁN‹=t&® ÆïjÕ¿ ¯º¦þ¦Ï¯\À×°ñ­ G( ?ÇOÛXgYYQwAE+äÞôêÙ¡ÂE±‡§\¦à­a½XÓ°íÈ Ø$^<N1XÊY®R‹CÔ-©÷EÜuÄp²þ§%¦­$¼ÜÑìS #u;MûWßYöRðC=.É÷`ÜqÄ_²î§.¦H­¼‚Ò÷ìT ¯$h<7NOX¶YAR­B,èŠõ1ڕ±`§¦ˆ®®¾[ÕHðÑ (*?P Y+YfP¡?€(S ÍðËÕý¾±®ˆ¦Z§±¶ÂˆÚ%ö¸V-sCÌRÝYëW#M›:+"IÁéuÏ º²«Ú¥$©8µåÈ'âwþî•4îHíU;ZiUïG)31¦üoàlÇ(´¨ú¥ˆ¬œ»²Ñ…ì^ ,%*=õN³XgYùPF@ü( œðLÕX¾#®T¦À§A²ÉÄkݨù}ó0lF§T2ZrVÎIŠ5¿ÿ~âòȵü¨è¥,¬'»KÑPì_ ^%„=LOßX;YTP?>'T 7îóÒ^¼Ø¬¦—¨R´ÿÇ‹áPþ**5¥InV0Z€T÷E0'û÷¦Ûñ1§Á¦»¯3ÁMÙ‰õÎ .yD¯SZüV³J6‹‹ÿ—â¼È½´¹¨þ¥Õ¬Š¼pÓï ™(Y@EQ‘YUX³MÉ:–!Ì|çÆÌ‹·ªÈ¥/«²¹ÅÏ ë”%¨= OYøXQO$=b$´-êÿιӪĥwªk¸&ÎFéæ³#œ<OßX#YÀOº=%@˜êAÏ3¹ÙªÄ¥‡ªœ¸ÎÐé”x$R=‡OYëXO%{é+Í+·‹©â¥œ¬û¼Õ0òâŒ-÷DuT9Z”UGQ0úQõá׿ϭ¦Ë¨§µ/ËÞæ…u#;=ïOYYeX&Më8 ¨ÿLá‚Æp²n§Í¦ž°ÃÃúÝ9üäS6nKµW¹Y9Q1?»%Òýè×Ì·¶:©ù¥Z­€¾k×$õ-¾0‹GïU.ZÈSwC++À ®î¨Ñ!ºâªÅ¥a«»ÓSðxµ,ªDwT;ZAU FŸ.^òÌÔe¼¬Í¥Xª/¹‡Ðšíä ‹*C§S-ZãUHG0"ÚóÖ;½~¬Ö¥ªµ¸ýÏíƒ Z* C«S-ZÎU G¬/ƒó<Õ¼¬Ì¥ª¤¹^ÑÐîW ,fDtT;ZUqEa-Ã6ð“Ò}ºëªÅ¥´«¼©Ô«òW­/$GíU(ZSS?B)» ë Î"·7©¦ö­ÀÚÜøwú4ûJ¸W YnPG=…"xùãòÇá²h§ø¦£±ÆÈáE‚ ³;|O_Y"XåK.6±ùùÿÚ¥À9®¦.©9·lÎßëã [*sCT9ZUE,E=îoП¸Ñ©é¥g­^¿‡Ù–ø˜e5vKXkYƒO‡;ü_±àüÄǰ§¦ê§i´’ÊçµÎ&ê@ÌRZøUÕF¨.~8ðòѹ4ªÜ¥­þ¾CÙŒøÇ¾5ÖK5X@YÕNC:/5þqÞÃn¯D¦·¨w¶ÂÍ’ë í*5D³T:ZT CQ)3 Áé.ÌWµ5¨†¦€°ßÄ÷à&)!Ä<|P»YGWnIþ1eójÔ$»áªÌ¥Ž¬L¾¯ØHøÑ6@LpXYåM‡8´8ûXÛOÀ©­é¥ªœ¹}ÒnñH¢0—HõVÔYÏP==!ú“àVİ[¦¢¨‘¶QÎµì´ Ì,æE¹UZƒRã?·$¡èãïÆ™±Æ¦ì§é´ÿËê& ›*bDýT5ZNS3AQ&BYåÈ;²ó¦´§i´_Ëvé¦ M*:DöT4Z@SA÷%À¾ämÇʱ˦ò§µ|Ìíê: Ç+gE—U!ZbRf?¿#43âDÅ_°b¦±¨þ¶WÏcîâ/àGÍVÒYƒP"ÀtÜÅýbt<õPöY+VF ,² ¨éÍʉ³6§˜§§´ˆÌÎë$.ŸGäV¶Y¯O5:_rúNÙ¸½¬«È¥è¬ ÀkÜøýÐû<_Q ZºUEW*„ Nç¨È²³¦W¨¾¶ËÏèïNý1tJXýXëL¨5‘,ô~ÓK¹m©5¦"°ÄÅôãC‘'CÖT,ZQRe>R!WÿrÝÀ­É¥Â«+¾KÚüL <þPZÆUâDÒ)‘æRÇÿ°a¦©¤¸×ÒÄó‰à57M#YÕW}I50ÂðìôÌ´m§§Õ´eÍ‘ízÙ0õI XøXšLÅ4òEÑo·|¨³¦Z²·ÉCéE \-šGW„YuN7JUõúÓB¹=©W¦ ±·Çõæÿ n+QF”VºYIOÏ8´¬ö Õ󹂩A¦°°>Ç{æ¦ I+HFšVµY$Ox8*þõWÔ]¹7©b¦Q±\ÈùçN Î,qG$WuYNš6ÂdóöÑž·q¨Ì¦õ² Ë]ëÙø/·IXÖXØK3nãîüÍØ´b§³§ÉµrϰðYÂ4òL1Y‹WEHµ- kèÈ@±S¦s©)ºÕÕ(ø³Ò:ÁP Z;U CP&Ž9àáÁO­Æ¥x¬`ÀVÞ¨¨$ÔA©T"ZeQÈ;·ù‰ÖŒº‘©O¦M±ÒÈ"é ç.CIXËXuK2ƾìÇË"³Ã¦§¨‰¸ÛÓIö>ï9gPZ@UÔB°%€åÞ–Àw¬È¥œ­½ÂÀá«›(ûDKV·Y²Nú6b(ò(Ðᵘ§¡§¶aЄòÙc7úNÊY VZD'NYàˆÁà¬Ä¥a­~ªáÔÿ(kEV•YþM¥5†ð!Îf´§R¨þ·„Ó_ö×Ð:!Q&Z[T³@c"fþ©Ú½ƒª¦„°Èûè© ÿ/oJ–XX Iâ- zæÆE¯ä¥€«1¿°ÝñÑ%ZC¼U×YOþ6ÏøðŸÎ„´§r¨ˆ¸žÔø¾•î+HèWXJÆ.h æ,Ån®Ê¥¿¬#Â>â}+ÞGÚW£XJ².1 »åÒÄ/®Ç¥­ÖÂFã¿›,·H1XPXI -+ ¬ãÃ2­Å¥)®çÄ æ» H/–JÖX‡WàFÅ)Rëß%À›«ð¥%°yÈ›ê‡3`MžY VLC¥$ÿpÚ¼©‹¦Z³ÊÍ+ñ5 9ÂP+Z”S#>¢Ù÷Ó·¢§ú§ ¸ÕªùwŽ?UTZ´O7šiî]˽±*¦ºª£¾PÞ)¦FW»XóIÚ-{ dãr™¬Ô¥]¯ÇäéQµ3½MÀY†UÑA."Tü!×V¹a¨\§|¶ÓÁ÷¹> TZ»O×6ñcí7ÊÞ°ü¥–««À_Ả,MI–X§W¨F±(?1݃½ªq¦S³[Ζò<1;IR:ZQÒ9g¦ð¸ÌE²3¦Êª1¿£ßc+œHgXÐWîFÞ(3êÜ&½Õ©’¦´¤ÏWô6ì7ôêìpÉ,°ß¥|¬ÍÂ¡ä¢ k0 LuYV‚Bn"ÝûÖ%¸È§¨ù¸R×eýå#—C‘V2YùJ.T OâèÀw«¦Å±[ÌÍð%Ñ:TR:ZöPN8çƒí É°Ø¥Ó¬¶Ã-æ’ K2pMÍYÿTì?˜e÷ÓѵƦ˜©½kÝ{ *ˆHˆX~WŸES& ÿüØÝ¹K¨­§-¸—Öý $DãVîXÄIK,8ìÞ¾÷© ¦µ´xÑS÷âY@MUªYLˆ0 Uã=Áj«"¦x²Îbó9§= TþYNNB3!9æ\Ãl¬î¥4±Ì ñ±ANDÇF!IWKjMXO QÃRj;b8<5þ1§.8+´'$p µë2I W `glýsù{õˆñíºéãåâ[Þ®Ú׎ÓÐÆÌ‡ÉdÆ]ÃvÀ¬½»€¸¶ã³Í±à¯®€¬«È©­¨À§ÿ¦l¦¦Ï¥Ç¥ë¥>¦À¦p§M¨Y©ªó«ƒ­=¯!±/³eµÁ·Cºë¼µ¿¡Â¬Å×È̃ÏÓ–ÖAÚÞÓá´å¦é¢í©ñ¸õÌùäýù î Ù¾•d"!Ñ$l(ö+g/Â26-97<#?ðAD&GIÍKçMÛO¥QHS¿T V,W XèXYíY+Z±]³©µ¸¸ºz½`ÀkØÆäÉPÍØÐzÔ4ØÜêßããêçì"ðNô~øµüï ! 5 AE=)!Ñ$ˆ(+,·/*3‚6½9Ù<Õ?°BfEøGcJ¦LÁN±PvRTzU·VÆW¥XTYÒY Z¥A¦D|G$JLæNýPßRTVGWQX!YºYZ•;8q4©0Á,¼(š$a ±?¾6 ¥yüå÷UóÍîQêáåƒá9ÝÙìÔîÐÍSɹÅHÂý¾à»ï¸.¶Ÿ³A±¯(­n«í©¥¨™§É¦5¦Þ¥Ã¥ç¥G¦æ¦¿§Ö¨(ªµ«|­}¯²± ´Á¶”¹™¼Ë¿+õÆfÊ>Î7ÒQÖ‰ÚÚÞCãÀçQììð•õCúûþ£3Ä IÇ5“Ü"'(+%/3¿6W:È=A-DGÝIlLÈNïPàR˜TV_WjX:YÍY#Zî¤éå¢àAÜö×ÉÓ¹ÏËËÈ^ÄåÀ™½{º·Ô´M²ÿ¯ê­ ¬lª©ã§ü¦T¦ì¥Ä¥Ý¥6¦Ð¦«§Å¨ª²«…­“¯Ü±^´·º#½uÀõßÇsËoÏÓÏ×,ܤà3å×é‹îNóøêü¼p! Éiùyä!9&t*Ž.Œ2f6:¤=A5D8GJ¤L O9Q.SèTfV§WªXlYðY3Z5ZøYzY»X¾W€VULSWQ'O¾LJHGH1EîAz>Ô:73á.™*0&©!O„© Óáÿíúýõñ6ìgçªâÞxÙ Õ¹Ð‘ÌŽÈ·Ä Á”½Nº?·g´Ì±m¯M­n«Ñ©x¨c§”¦ ¦Ê¥Ð¥¦°¦‹§­¨ª¿«­­Ý¯M²û´å·»e¾õÁ·Å¨ÉÆÍ ÒwÖÛ±ßwäTéCîBóMø\ýroX >ÛŒ($¥(-D1[5I9 =ž@þC+GJÛL[OœQœS^UÚVXYµYZ=ZZ¦YñXõW³V-UcSTQOyL¯IªFkCö?O§O¨ª©N«7­g¯Ú±Ž´‚·³º¾ÀÁ—ŢɨÍ:ÒÂÖnÛ:à åê.ïPôyù­þÐÜç æÖ²y!$&²*/b3|7k;(?´B F$IL¦NQ&SU–VâWèX¤YZÈ;ÄkÀÒ¼q¹M¶h³Å°e®L¬|ªô¨¸§È¦&¦Ñ¥Ê¥¦©¦§¾¨;ª¬®q°³ôµ¹}¼ÀóÃÈ@̬ÐCÕÚáÞÜãõèî[ó¢øòý@n— µÄ¿¢!i&+“/ì38<å?yCÔFóIÓLpOÊQÝS¨U)W^XHYåY2Z3ZãYFY^X%W¢UÒSºQ[OµLÍI£F:C–?»;ª7h3÷.]*ž%» ¼¤w: ñ¢Rü÷»ñ€ìVçAâGÝjرÓÏ¸ÊÆ|¯¾»Å·±´à±U¯­«p©¨§J¦Þ¥Å¥ÿ¥‰¦f§’¨ªÜ«õ­Z°³üµ3¹®¼fÀZÄ…ÈâÌqÑ*Ö Û à0åkê¹ïõ‚úôÿRœ â;G9$ )¹-?2–6¾:²>nBïE1I2LîNbQŽSnUWGXk:06Ä1)-a(v#jAÿªH Ýkþüø“ó5îæè­ãŽÞŒÙ°ÔúÏqËÇö ¿_»ò·È´å±L¯ÿ¬«P©ó§ê¦4¦Ô¥Ê¥¦·¦­§ø¨•ª†¬Å®T±-´P·¹ºe¾OÂwÆÖÊhÏ*ÔÙ)Þ^ã®èîóù¦þˆ ïE‹¸Ê#º(…-&2˜6Ø:á>¯B?FI—LYOÏQøSÒU\W“XuYZ;ZZ«YâXÅWTVTzRPfMjJ'GŸCÖ?Ï;Ž73n.˜)˜$w5Øhç ]Îþ?ù¸ó:îÌèvã;Þ Ù+Ô`ÏÄÊ[Æ,Â7¾„º·í³±€®A¬Tª»¨y§Ž¦ý¥Å¥æ¥a¦5§a¨æ©¿«î­o°@³^¶Æ¹u½gÁ™ÅÊ©ÎÓ‚Ø®Ýþâkèîíˆó,ùÜþsü €òTšÃ$Ç)¦.U3Ó7<(@øCƒGÉJÇMwPØRèT¤V XYÑY.Z3ZÞY/Y)XÉVUS©PùMûJ³G DK@3<Þ7R3. )„$Dãh×6 ŒÝý0øŠòòìkçÿá®Ü‚×ÒªÍÉÄoÀ‚¼Ù¸zµg²£¯3­«R©ç§×¦#¦Ì¥Ó¥7¦ú¦¨‘©f«’­°ê²¶‡¹G½KÁ”ÅÊÙÎÌÓíØ9Þ¨ã7éÞî™ô^ú.è -¹0‰!Á&Ó+¹0k5é9,>0BïEhI•LuOR;TV§W×X©Y!Z:ZöYTYVXûVEU6SÐPN K±G D@ê;z7Î2í-Ú(#9´` žÓü:özðÉê-å¯ßRÚÕÐ=ËŸÆ?¾Eº¶¶u³†°ì­ª«Â©9¨ §@¦Õ¥Ë¥#¦Ü¦ö§p©H«|­ °ð²+¶µ¹Œ½®ÁƸʙϮÔõÙdßûä­êyðTö?ü%îµ j ”þ#@)V.>3î7d<˜@ˆD/H‰K’NHQ¦S«URWX‰YZ;ZZiYoXWZUCSÒPNéJxG¸C¯?_;Í62û,Ä'a"Ö-h «¿ÿÒùìóîLèŸâݬ×pÒhÍ—Èij¿ª»ê·~´d±¢®;¬2ª‰¨B§_¦à¥Æ¥¦Æ¦Ü§X©5«r­°³Q¶ô¹æ½$¨ÆoËsЭÕÛ®àiæAì1ò/ø<þ3 ùÅ}!‰&Ò+í0Ï5x:à>CÚFcJšMzPS)UóV[X_YZ‘BšFJJ¤MŸP8SlU8WX“YZ9ZçY'YùW`V^TóQ$OòKcH{D=@°;Ù6¾1e,Ô&!'ðµm#üÜõ¡ïzénã…ÝÇ×;ÒèÌÓÇþRºz¶ý²á¯*­Úªø¨§|¦è¥Æ¥¦Ú¦ ¨³©Å«C®*±v´#¸,¼‹À>Å=Ê€ÏÕ¿Ú¨à¾æòìCó¡ù q² æØ$ƒ*ù/25,:Ú>=CIGýJTNGQÔS÷U®WöXÎY4Z'Z¨Y¸XUWƒUESœP‹MJEFB–=Ä8¨3K.±(â"æÂ‚+ Ç\ýõö™ðPê#äÞ9ØÒÍíÇÃn¾,ºE¶½²š¯á¬”ª·¨M§W¦×¥Ï¥<¦!§|¨Iªˆ¬8¯Q²Óµ¸¹ù½”ÂǺÌ7Òô×äÝäJê¯ð(÷­ý7Ÿ õ:^_#0)Ï.04N9!>¥BÒF¢JNQ¹SëU¬WúXÓY6Z"Z—Y•XW5UÙRPÝLDIGEð@A†CÙGÃK@OIRÙTíV‚X–Y&Z1Z·Y¹X8W6U·R¼OKLiHDg?U:ë42/2)ô"â#Mi‚ú¢óÔì#æ—ß<ÙÓ;Í©Çkˆ½ ¹÷´U±+®|«M©¢§}¦à¥Í¥C¦A§É¨Öªd­r°û³ù·d¼9ÁpÆÿËàÑØmÞåÎë³ò­ùµ¢zBçe"°(¾.…4ÿ9!?æCCH3L±O¶R>UDWÇXÂY4ZZ}YTX¥VoT¹Q…NØJ·F*B7=å7;2E,&‘è+ ,&ý#ö/ïTèžáÛÇÔºÎúȎ¾ܹ¢µÝ±’®Ç«€©À§Œ¦ä¥Ë¥A¦C§Ô¨íªŽ­²°T´o¸ü¼ôÁQÇÍÓaÙòß´æ¡í®ôÌûð÷ éÄy%O+[17ƒ<ŽA4FkJ/NyQAT†VEXxYZ4Z¾Y¸X(W UiRDO K„GöBü=Ÿ8ç2Ý,Œ&û7J? !ûüÚõÇîÐçÿà`ÚüÓàÍȟ½길´±Æ­«ë¨O§D¦Ë¥æ¥”¦Õ§¥©¬ì®Z²H¶±º‹¿ÐÄxÊxÐÈÖ\Ý+ä)ëIòùÅíâ“# *?0%6µ;å@­EJãMCQ"TvV?XxYZ3Z³Y XýVËT RÈNK¿F Bä<[7v1>+¾$ûʇCúóßëÙäÿÝ\×þÐîÊ5ÅÞ¿òºx¶{²þ® ¬£©Î§Œ¦â¥Î¥T¦r§%©m«D®§±Žµõ¹Ò¾!ÄÕÉæÏKÖøÜáãûê:òùõ?rˆQ$Ü* 17¬<àA¥FôJÆNRØTW²XÀY6ZZ[Y X#VªS£PMþHnDh?ø9"4ó-u'² ·G é…ü'õÚí«æ§ßÙØQÒÌ2ƲÀŸ»·æ²M¯?¬Å©Þ§’¦â¥Ï¥Y¦§C©ž«® ²¶œº ¿ÅõÊ2ÑÂךޮåðìWôÑûW >A '™-×3º9;?ODíH M§P¶S4VXjYZ2Z«Y…XÅVlTQNÿIxEu@;$5é.Z(ƒ!p-È MÊüKõßí’æqߊØéљ˥ÅÀ»b¶G²¶®¸«P©†§Y¦Í¥æ¥ ¦ü§÷©¬½¯~³É·™¼ãÁ ÇÃÍCÔÛ(ârééð{ø¶(„¸·$v+é18¹=CÑG"LëO%SÉUÔWAY Z7Z¿Y¤XèVTQNJgEM@¾:Ã4h.¶'¼ „– úWû¼ó7ìÔä¤Ý²Ö лÉÏÃS¾N¹Ë´Õ°o­£ªu¨ê¦¦Æ¥.¦@§÷¨Q«I®Ú±þµ®ºà¿‹Å¤Ë!ÒõØàoçùî¤öbþ%Á >™¼#¢*71t7L=²BGLàO(SÖUåWPYZ3Z©YxX¢V)TQdM$IZD?P9!3”,±%†ŽÝ]øªðé§ásÚ‡Óî̵ÆéÀ•»Ã¶|²É®°«:©i§B¦È¥ù¥Ù¦f¨šªt­í°µ¤¹Ñ¾}ÄœÊ%ÑØ;ß­æSîöøýÑ… &œÞ#Ý*‹1Ü7Á=4C%HŽLdP¢S?V9XˆY+Z"ZkYXûUHSôOLƒGvBé<ã6r0£)‚"„à êü.ôjìÌäaÝ9ÖdÏìÈáÂL½:¸¶³Ç¯w¬Ê©É§u¦Ò¥ä¥¦¦¨?ª­°”´>¹v¾1ÄdÊÑØPßâæ¦îŽöþzK–í$û+´2 9ò>^DDIšMXQtTëV¶XÒY\8¶1¦*9#Žp 9úúÄò©ê½âÛ­Ó«ÌÆý¿nºsµ±j­nª(¨£¦Ý¥Û¥¦"¨fªd­±wµzºÀ<ÆãÌúÓsÛ<ãFë}óÔû-c €s*$’+Ÿ2@9g?EJzN:RLU£W?YZ.Z€YXßUõRTOKF‰@p:Ö3Ë,[%™•b ±üXôìä.Ü¥Ô|ÍÁÆ…ÀÔº¼µI±…­xª*¨ž¦Ú¥à¥®¦F¨¢ª½­‘±¶B» Á]Ç3ÎzÕ"ÝåMí¬õ&þžì×&;.;5Å;ËAAGLIPÅSˆV‹XÇYöCCIéMÜQU‹W8YZ+ZmYáWŠUmR’NJÄDè>y8ˆ1 *W">çd Ë0ø¦ï@çß3ײϠȼ²¶þ±®ÅªS¨®¦Ý¥à¥¹¦f¨äª)®4²÷¶i¼|Â#ÉNÐê×çß3è¸ðcù ¼ :¢#f+Â2ª9 @ÔEúJqO-S&VTX±Y:ZïYÍXÙVTPCLEGšAS;~4,-l%Qñ\ «íú<ò«éNá;Ù„Ñ=ÊuÃ@½¬·Æ²œ®4«›¨Ö¦é¥Ö¥¡¦D¨¾ª®²ì¶r¼žÂ_É©Ðg؇à÷è ñjúI Ÿ +%ø,V48;ŒAAGLLžP-TñVàXúY7ZšY!XÔU²RÇNJºD®> 8Û03)%!Ã&^„þ¬õîì\äÜÔ̆Š¿3¹ ´›¯õ«!©%§¦Ê¥n¦ò§Tª­–±c¶ì»ÂðÈJÐ ØZàçè¬ñ›ú` šÔ%±-5 <`BHMQQÆTiW1YZ$ZLY“WÿT•Q_MeH´B[«Ô®A³z¸s¾Å^Ì,ÔqÜåî÷Y„ RÙ#,Ã3ö:‘AG³LQ´TkWKõOÓSÏVáXZ1ZiY¯WUxQMÈGÃA ;°3È+e#¢•UÿþªõqìkãµÚdÒ‘ÊNô¼Ò¶¼±­#ª¸§A¦Ä¥B¦¹§(ª†­Ê±ë¶Ø¼ÃÕÊ¿Ò*Ûýãíwöíÿ] ™¥e$Â,¤4ô;£B—HÄMRŒUX£Y;ZØYzX&VáR´NªIÓC<=ú5.À%øÜˆ Ÿ÷?îå,Ü­ÓªË:Ät½i·-²Í­VªÓ§L¦Ä¥>¦¸§0ª­÷±1·>½ Ä…Ë—Ó)Ü$åoîé÷„ Xw@&Ÿ.{6½=QD#J#OCSwV´XõY5ZrY±WóTBQ©L3Gï@ï9I2*_!KñjÓûEòàè¼ßõÖ¥ÎáÆÄ¿c¹Í³¯I«t¨ž¦Ï¥¦G§‹©Ï¬±(¶"¼æÂ^ÊvÒÛ#ä„í÷Óp ã# &Š.6Ø=}D\JbO‚S­VÜXZ+ZFY[WoTŒPºK FŠ?M8j0÷'Æ> Úø8ïÇå¢ÜçÓ¬ËÄ!½û¶°±M­â©{§¦É¥‡¦Q¨#«ö®¿³n¹ò¿9Ç,ϵ׸àêÂóýf zœ#T,Œ4$< C*IqNÌR0V’XìY5ZqYŸWÅTëPLiFà?”80( ¥ý 0YøšîåÕÛ ÓÄÊ!Ã9¼¶ç° ¬Y©§ò¥Ü¥Ý¦ï¨¬2°NµQ»*ÂÁÉÒÕÚäºí’÷†Z x‹''018‘?.FôKÓP»TžWtY7ZäY{XVRüM‰H3B;53º*¹!N–±»úÕðç²Ý°Ô6Ì]Ä?½ñ¶ˆ±­¦©G§¦Õ¥Ç¦Ò¨ñ«°DµY»JÂÊaÒTÛ¾ä€î{øŽ~ EÉè(‹1’9æ@mGMÏQ…U.XÂY;Z—YØWU QmE’K¼PÓTÌW›Y§6.½$ûÚ ü§ñpçŽÝ!ÔJË)ÃØ»qµ °»«Ž¨¦Ç¥7¦à§¼ªÂ®â³ º,Á(ÉåÑCÛ$åeïßùuèö"[,*5@=…DÞJ5PwT•WƒY;Z¹YXUQÒK™En>f6¡-;$T“ûð3æ@ÜËÒóÉÙÁšºQ´¯ñªý§C¦Å¥Š¦Œ¨Å«-°°µ>¼¿ÃÌ-ÕÚÞézó$þÍ>o7'x09Ý@ÆG²MŒRBVÆXZZâXoVÇRøMH+AY9¹0i'ŒDµþ[óßèµÞÕçˇÃ¼sµñ¯‘«a¨o¦Ã¥`¦B¨f«¼¯9µÇ»P÷ËàÔ§ÞêèóJþ «ôÔ'$1Å9•AzHWNS²VY'ZùYƒXËUØQ»L…FM?-7B.¬$SúÄï@åÛ„Ñ”ÈoÀ5¹³é­ªW§÷¥å¥#§­©w­v²˜¸Æ¿åÇÖÐzÚªäCïúÚ]„$$.7H?ŒFÉLìQàU–XZ ZïXrV²R½M§Gƒ@n8ƒ/å%º$M]û}ð×å‘ÛÕÑÅȆÀ6¹ñ²Ï­ä©A§í¥ð¥J§ö©ë­³m¹ÒÀ'ÉPÒ'ÜæQñSü_2Äë&€0^9eAuHsNISäV5Y1ZÚY*X,UçPoKÓD1=¤4L+M!Íô íáõúêdàEÖÈÌÄ;¼oµÁ¯K«¨C¦È¥©¦è¨y¬R±^·†¾®Æ¹ÏÙâã²îÇùø½%æ.ÿ7A@ŒGÁMÊR‘V Y*ZìYMXYUQ–KïD:=”4 +!`f >õêgß:Õ·ËÃ9»€´ô®§ª¬§¦Ù¥§š©…­¹²!¹¥À'ɇҜÜBçKòýÖá ç(2m;dCRJP£TÞW½Y7ZLYüVRS[N,HÚ@…8M/W%ÊЖGùî%ã«ØÎηʼn½g¶o°¹«W¨X¦Å¥¡¦é¨’¬‘±Ï·5¿¤ÇûÐÛÅåáð@üœÉ±(ï1õ:CJúO—TÞWÁY7Z>YÜVSþM¨G,@ª7C.$d@às÷)ì/á²ÖàÌÝÃÓ»á´%¯·ª©§ ¦à¥,§è© ®„³>ºÂúÊ·Ô,ß)ê„õ v ©~"Ä,U6?²Fê4¼*ÊGe\ücð¯äwÙíÎDŦ¼;µ'¯†ªl§ê¥¦Á§«î¯;¶Ý½²Æ“ÐNÛ·æ”òµþÔ ©"ï,÷6@ðG’NÌS…W¬Y6Z"YrV4RzL\Eþ<„3)ñ<1úùí=â ×”ÌÃ¥º}³¼­{©Ð¦Ç¥f¦ª¨Š¬ó±Í¸÷ÀLÊŸÔÂß}ëž÷ÝòÂ'ª1\;üC]K^QäU×X)ZÓYÚW@TO~HŒ@h7>-<"—… @þòæƒÚ³ÏÆÅî¼Uµ¯lªR§à¥¦ ¨œ«Å°k·p¿¬ÈôÒÞÞéöxǹ3&ö0Ó:˜CK9QÓUÒX*ZÐYÉWTÚNH@µ6],0!_( Áüjð\äÓØÎ-Äs»´ ®¢©Û¦Æ¥l¦È¨Ï¬n²Š¹Â©ËTÖÍáÛíHúÄ øP*Ý4j>ÊFÐM]SRW Y7ZY?VÃQµK4Db;l1&ש1«õXétÝ9ÒàÇ›¾œ¶°ýªœ§ñ¥¦ß§n«¤°g·–¿ É’ÓùÞ ë÷)­Ìc(13=¥EñLÀRóVvYÇFN¹S®WÔY!Z‘X-UP7Iã@67b,¢ 3WRújíåàÕÊ)À¡·›°?«©§î¥¦#¨ ¬µ±¹ÚÁÿË<×Zãð$ýC c#û.˜9CK{Q:V+Y;ZgY³V(RäKD¶:(0”$9Y :þ#ñ[ä)ØÏ̊“¹²M¬G¨"¦é¥§6«¢°Ã·rÀ€ÊµÕ×ážîÈû "B. 9œBÃJTQ(V&Y;ZcYŸVRžK›C#:j/ª#$ Ýü«ïÔâÖJËÁF¸±s«»§ï¥¦:¨G¬'²¼¹ÜÂUÍêØ_ågòÂÿ ûd&õ1t<£ERMRSƒWÍY!Z~XìTOTH“?l5*×í¢@öéh܅Ыż ´¨­©s¦Ì¥%§yª´¯»¶c¿~ÉÐÔáîƒûû'ß"Ð.º9^CˆKR²VsY9ZþXÇU¨P¼I+A$7â+¢­JÉ÷uê›Ý…Ñzƹ¼z´ï­>©¦É¥§sªº¯Ô¶˜¿ÔÉJÕ¾ááîlü P$ 0ë:{D€LÏR>W·Y(ZŽXóTlOH?³4)‡QÁ$ôËæÚÎTÃñ¹(²'¬¨¦¦¨;¬H² º—ÃvÎzÚ`ç×ô–-]ç)y5Ö?»H÷O^UÎX4Z‡YÉV RgKC9Ñ-|!`ÈùoëNÞ÷Ѱƽ¼[´¾­ ©c¦Ò¥`§«¢°!¸RÁÿËå×Àä?òã D (á3…>²G6OßTX)Z©Y WfRÏKnCw9$.¹!Ëêø4ëùÝÑ8ÆB¼å³Y­Ã¨A¦á¥©§«v±A¹À·ÍãÙûæ¯ôªyã›*N6¼@¡IÆPV/Y'HÍOsUõX;Z=YV™P)Iá?ú4»(ty %ÿÕðæâ´Õ’ÉѾ¹µ„®a©v¦Ó¥~§m«‡±¥¹“ÃÏÍÛzéÁ÷:n""ù.Ÿ:ÉD3M§SùW ZÓYNW‹R«KÙBP8S,0>Ùaô4æ¯Ø-ÌÁu·È¯0ªÒ¦Å¥§«ª€°h¸/•ÍMÚèZöùaw3½&ù‰ Ñû2íßÔÑÐÅY»·²&¬Ô§á¥Y¦;©s®ÞµI¿vÊ×ÒäJó!Úr,¥8XCW3D&I 2ú@ëãÜÏyÃ$¹Í°®ªù¦Ã¥§÷ª;±¹¹8ÄgÐõÝwìûº ‚š'•4@ÏIrQÌV´YZèWAS>LCý7R+h©~ÿTðšá½Ó#Ç%¼³=¬Ç§Ø¥¦¸©k¯q·ŽÁzÍÛÚPéoøÈÑ,%}2Z>sH{P5VxY+ZFXÙSMôCð8F,S7ëðâ ÔRÇ8¼³0¬º§Ô¥¦ç©Ä¯÷·IÂgÎþÛ¢êëùa vÕ&4×?¿IQæVÄYZ¦W¸R_KÑAS6?)óÚ hüíBÞsÐÄa¹Í°‘ªÚ¦Ç¥`§˜«T²^»tÆ@Ódáqðûÿ|oƒ,H9^DpM:T‡X7Z:Y˜UkOãF><Î/ð! ˜ôÌäaÖ4É©½´Ñ¬¨á¥r¦³©¯Ù·R§ÎÜgëöú ßc(®5bA!K¡R¦W Z·Y³VQüH²>„2Ì$öt¾öNçØË6¿HµŸ­y¨ý¥A¦D©ï®·zÁÊͧۡêKú r(†5UA(K³R·WZ¨Y„V·PsHô=1 #™îõ›åëÖ}ɽ½´¬¬ä§×¥•¦ªM°ú¸ÞãÐäÞ.î þà =»+ß8DDŒMoTµXÕ1¶#t‰wôÁäèÕdȤ¼ ³ã«i§Å¥§«î±A»ÊÆ,Ô÷âµòß×5"0A=H“P„V²YZsWRJ²?B3,%áá°õÐåÈÖÉ#½\³¬{§Ç¥þ¦«þ±k»ǛԌãpó¸É8#†1<>ðHFQþVáYÛYèV#Q¸Hï=1²""ï¤òÅâÚÓaÆËºz±¼ªÍ¦Î¥È§­¬Q´y¾ÊÊãØGèyøäí((68B3L¬SgX8ZYöTN‘DÎ8'+ ŸûTë¹ÛOÍ–À÷µÐ­h¨ì¥t¦û©e°{¹ðÄbÒaáfñî]"¶0´=¦H,QýVèYÏY¶V²PûGØ<§/Ü ôwõïûßÑÂÃz¸š¯t©=¦¦ô¨Í®j·‚²όމî&ÿÀ¹§.!%0e=‹H4QWòYºYiVP Gƒ;ê-¹w±ýþìòÜÎÁ¶Ã­J¨á¥¦|ªY±úºÇÕ§ä4õ²…&5¦AL»S‡X¨ã­˜¶ÂÂÏKßðl¢&#b2Â?ÌJSHX9ZÔX$TUL¯A—4Š%Õnò‡áÂѵÃé·Î®¾¨ò¥ˆ¦{ª¦±Å»uÈ@×—çÜøg wz+ä9 FÁOeVÌYÓY}VãOIF:”+{V Êø„ç(×WÈ »±\ªx¦ü¥î¨2¯Œ¸£ÄþÒãHôóN¼'±6CáM=U^YZcWYQ4HM<.ô NûÔé2Ù Êø¼w²ñª²¦ä¥’¨¡®Ö·ÙÃ/ÒRâšócæx'Œ6†CêMMUiYZ?W Q¸Gš;,-üª áùUè²×ŸÈ´»p±>ªe¦ ¦;©Ï¯‹¹ ÆÕÔPåßö¿1¥*o9þEÒO‹VáY³YVñNÇDè7Ö(&‚™ô#ãÌÒ@Ä ¸±®¨á¥Æ¦8«³é½nË Û#ì þ=!,1,?¬J:S|X³0£ DGýdëRÚÀÊO½ˆ²Üªœ¦ò¥é¨b¯¹±Å¤ÔXå#÷L û“+r:öF§PWZcY UnM›B5n%?= ð¨ÞˆÎgÀÛ´]¬C§È¥ú§Ä­ë¶óÑ?âôK<$)j8bEŽOzVåY¤Y¼URNµCR6µ&€g(ñ„ß2ÏáÀ*µ…¬R§Ç¥ø§Ë­·IÃÒÃâ±ô *A9(F+PâVZoY&UVMRBŽ4™$ÕîæÜ¿Ìº¾m³Q«¿¦é¥Ø¨o¯j¹ZƺÕàæùœ ‡:.=>InR,X{/Õß ]úèÏÖDǺ诩ö¥¦¦ «6³‘¾¶Ì Ýâîwâp%p5-CN¯U«Y×Y5VæN>D¬6Å&6¼#ð5Þ·Í_¿Ê³x«Ç¦ë¥î¨¯¯ê¹)ÇÞÖZèãú• žW0û>ñJ°SØX1Z¨WZQŠG£:4+äu²ôiâfÑh¶ó¬q§Æ¥ ¨$®Ñ·§ÄÔpåú÷Ù &3.B=§IÝRxX:ZXRvHµ;T,œõ*ãûÑÏÂS¶­y§Æ¥¨8®¸ùÄÔæÄøÈ -;/:>|JySÊX2ZW,Q"Gó9.*ŒÐÒòeà_ÏÀv´È«Û¦è¥ý¨ö¯‡º4ÈeØ\êTý]—"N3½AAMRU—YÛYV€N`C:5°$}tÿpìIÚÕÉлݰ}©¦ ¦E«Ã³¸¿™ÎºßVò‘p8*:`GnQÏW9ZŒXÝRkI¤<-¦eõœâ)ÑÙÁ]µH¬ §Ü¥Ò¨Ç¯nºHȵØïê+þeÊ#“4ôBJN VÜYŽY'UÖLü@#2û KñúÑçËÕ¹ÅW¸C®ú§Ä¥À§Ô­¼·Å ÕçJú¿ x ¸1«@¢LU‰YÜYV,N¯B4#dñü¢é]×ûÆE¹Ý®C¨Ç¥Š§u­E·ƒÄÔ­æþù› } Ò1Ù@ÔL9U›YËYÀU­MîA3Ì!íVûõç¶ÕvÅû·é­¿§Å¥¨˜®þ¸ÆÆO×ÇéWýý½#Ô4jCÎNtVZEYHTEK«>/5ó 3öìâÑ^Á¸´°«³¦¦­©±½øËZÝið>Æ$*ƒ:H,RSX:ZÈWQF~8¾'[“í®Ú–É!»°Î¨Õ¥C§­Ö¶;Ä’Ôç¼ú¨È!L3QBN VïY]YlT\K›>È.ª! #õ­á±ÏÀš³äª_¦G¦ª-³‹¿Ïá¤ôÂVƒ.k>?KcT\YíY VëMëA©2à u \ù•åÓ߬µ+¬Ø¦ú¥©‘±w½°ÌƒÞò<”,á<"J´SY Z}VšNÅB˜3Ñ!W!ú5æ’Ó+ÃÔµ;¬Ú¦ý¥­©½±Æ½-Í*ßÔò.“-Î=êJBTWYêYîU˜MQAº1™Ü ÷”ãÑüÀ´«d¦M¦Ìª¬³wÀ‡Ðã ÷~ Cv1"A€MçUéYSY)T®J[=á,ð|ñÄÝÎˈ¼½° ©Ø¥R§c­À·ÞÅ×Oê¿þ)Œ&ù7‚FiQXÉ&ÛïÑU„+n<#JðSIYèYÀU M:@þ/3ÕýóÆßGÍ}½A±:©Ü¥S§­9¸ÃÆbØ(ì±8):ÄHSôXZPVðM\AD1 õ»àξ’±a©á¥F§~­4¸ÓÆ“ØyìxSç)=;^I‡S(YõYÜUM#@¬/›öãòÞöË@¼@°ž¨È¥å§Ü®Kº’ÉÝÛ&ðT!x-X>ÌKU¿YwYBTkJx²LöUZ½XR{Fž6u#'ú÷Hâ_Îv½”°„¨Ä¥¨°v½nÎjâ>ø|Ç#î6ÂFMRÙXZ¯U%Lö=ÿ+V>ë(ÖÌÃ!µ «-¦Ò¦õ¬4¸áÇÛuð߯á0BO[W{LúUZ‰XmQ.E“4¦ © ûóÞDÊß¹ê­'§¦ ª¦´wÃ(Öë2°-Ž?ˆMœV1Z XOPuCN2ð§áðÛ•Ç··w¬“¦j¦¬·±ÆÚìïÔ6®1CPîW3Z¯V—M‚?U-:ÄêXÕªÂó³(ªë¥†§ß®~»”Ìá{÷„…$$8'H}SoY’YæSÅHê8W%UOøÉá8Í÷»&¯¡§ä¥ªà³²ÂÕ6ë? 0.V@GNW;ZrWêN4A2/;)ìdÖ\ÃS´Kªî¥†§þ®Ö»8ÍúáÀø&­9uIeTÁY)Y«R­Fþ5µ!. äógÝ5É«¸â¬¨¦g¦(¬…·ÅÇÉÛCò£ G É4ÆERöXÝY¿TòI.:€&9Ùøñá͘»½®`§ÿ¥µª3µÄÄ^ئî%,(2ËC×PrXZ™USKò;}(GÐú²ã|Φ¼f¯£§ë¥Zª¨´Ä²× î¥Ìî1±CÔPwX Z}UK‚;Ú'uÛùªâ|ÍÅ»Á®V§¦ñª¾µ®Å¬ÙQð5$4ƒERYËY`TIÊ8‡$¸ óõÞÞÊ ¹í¬š¦ƒ¦«¬¥¸ŸÉjÞõv W$¨8I]TÎYúXñQ,E‘3Vùïm؃ÄÅ´Pªä¥Ò§ö¯Ã½BÐ"æÚý£ß+?ÎMW=ZW¬MÖ>Š+*Gý“å¼ÏP½Ÿ¯¤§ò¥ªªxµ™ÅçÙñð s †5ÐFSoYmY S¿Fd56 ¸˜ð‘ÙGÅ2µ|ªè¥Ï§°¾ÚÐ ç ÿU-k@áN°W1Z7VLYù)–ÈùnágË]¹³¬c¦é¦>®Ò»¢Î8åãý²®-6AÇOEXZéTNI8‘"a fñ„Ù˜Ä8´®©Æ¥Õ¨²bÂéÖ¤î² ý5ÆG TÕY¶X¿PŠB0/-HÿoæÏo¼®ý¦\¦´¬Œ¹äËNâû1¨+Á?çNìWZHUÎI8æ"€ Fñ/Ù ÄÁ³\©Ä¥C©•³îÃÙ1ñ† ð" 8ãIZU!ZÒW™N/?Ë*¸ùêàŽÊk¸ò« ¦q§È¯ƒ¾sÒê[R 3ÃEòRYY…QyC0Ñ”ÿ^æ1Ïæ» ®À¦™¦­=»eΊåÖþ6/CQQY—YûR·EØ2á¨7é™Ñ¸½+¯&§O¦º¬ä¹ÀÌÄãý§I.1BÆPÔXµYSS2F]3] yé¸Ñº½¯§Y¦ê¬EºYÍ’äþ¶U/CjQYYšRòD¢1A¶ç…Ïë»è­¥¦¿¦6®o¼=ÐèÃJ2±ES«YØXµPãA¡-–¾û>â4ˈ¸Ê« ¦Æ§Ú°ˆÀ„Õ îd!ã7ÅI‡U/ZTW5M¥<' ôðÚïÄß³.©Æ¥ò©[µ ÇÝôö&Ð)ó>ÖNXÿYRTGÁ4‚ıé}Ñ6½“®Ó¦¡¦®\¼wЛèÅŸ4G TòY9XO?Ñ)ö¨ö"Ý”Æè´¦©Ä¥š©Ö´‡Æ%ÝÉö'þ)J?,OPXæYËS‚F+3oTçÏ»(­V¦A§Ø¯\¿|Ôbíì¸!‹8ˆJV<(Ú(ô~ÚÄõ²”¨Þ¥«É·ÚÊœâýü›0TD™RŸYÃXPa@ù*ÄýöýÜÆG´0©É¥fª›¶[Éøà\û*é.ƒC$RYìXrPÑ@j+%=÷ÝÆ8´©Ì¥‹ªö¶ïÉÅáUü#Û/TD²R­Y¡X¤O?©)õòÚ3ÄÖ²l¨ê¥Ž«Ô¸ŽÌóäÑÿžý2ÌF7T Z¼W~M<<ƒ%` 5ðtÖwÀ?°I§g¦²­€¼|ѹêðŠ !8§J^VóŸ•(Û>\O•XªY€RºCµ._ úEßÇô´[©Ê¥˜ªT·ÕÊHãpþµ‚2©FETZ†WÖL;®# ‚í·Ó ¾…®›¦§Ú¯*ÀwÖ¯ðW ¿&Œ=›NQXÇYÓRDý.uãùäÞýÆv´ ©Õ¥#«w¸‘ÌŽåb5«HyU9ZsVJ€7=`èûÎ;º¬ø¥h¨1³QÅ Ý&øìÃ-HCgR±YoXÁN‹=t&® ÆïjÕ¿ ¯º¦þ¦Ï¯\À×°ñ­ G( ?ÇOÛXgYYQwAE+äÞôêÙ¡ÂE±‡§\¦à­a½XÓ°íÈ Ø$^<N1XÊY®R‹CÔ-©÷EÜuÄp²þ§%¦­$¼ÜÑìS #u;MûWßYöRðC=.É÷`ÜqÄ_²î§.¦H­¼‚Ò÷ìT ¯$h<7NOX¶YAR­B,èŠõ1ڕ±`§¦ˆ®®¾[ÕHðÑ (*?P Y+YfP¡?€(S ÍðËÕý¾±®ˆ¦Z§±¶ÂˆÚ%ö¸V-sCÌRÝYëW#M›:+"IÁéuÏ º²«Ú¥$©8µåÈ'âwþî•4îHíU;ZiUïG)31¦üoàlÇ(´¨ú¥ˆ¬œ»²Ñ…ì^ ,%*=õN³XgYùPF@ü( œðLÕX¾#®T¦À§A²ÉÄkݨù}ó0lF§T2ZrVÎIŠ5¿ÿ~âòȵü¨è¥,¬'»KÑPì_ ^%„=LOßX;YTP?>'T 7îóÒ^¼Ø¬¦—¨R´ÿÇ‹áPþ**5¥InV0Z€T÷E0'û÷¦Ûñ1§Á¦»¯3ÁMÙ‰õÎ .yD¯SZüV³J6‹‹ÿ—â¼È½´¹¨þ¥Õ¬Š¼pÓï ™(Y@EQ‘YUX³MÉ:–!Ì|çÆÌ‹·ªÈ¥/«²¹ÅÏ ë”%¨= OYøXQO$=b$´-êÿιӪĥwªk¸&ÎFéæ³#œ<OßX#YÀOº=%@˜êAÏ3¹ÙªÄ¥‡ªœ¸ÎÐé”x$R=‡OYëXO%{é+Í+·‹©â¥œ¬û¼Õ0òâŒ-÷DuT9Z”UGQ0úQõá׿ϭ¦Ë¨§µ/ËÞæ…u#;=ïOYYeX&Më8 ¨ÿLá‚Æp²n§Í¦ž°ÃÃúÝ9üäS6nKµW¹Y9Q1?»%Òýè×Ì·¶:©ù¥Z­€¾k×$õ-¾0‹GïU.ZÈSwC++À ®î¨Ñ!ºâªÅ¥a«»ÓSðxµ,ªDwT;ZAU FŸ.^òÌÔe¼¬Í¥Xª/¹‡Ðšíä ‹*C§S-ZãUHG0"ÚóÖ;½~¬Ö¥ªµ¸ýÏíƒ Z* C«S-ZÎU G¬/ƒó<Õ¼¬Ì¥ª¤¹^ÑÐîW ,fDtT;ZUqEa-Ã6ð“Ò}ºëªÅ¥´«¼©Ô«òW­/$GíU(ZSS?B)» ë Î"·7©¦ö­ÀÚÜøwú4ûJ¸W YnPG=…"xùãòÇá²h§ø¦£±ÆÈáE‚ ³;|O_Y"XåK.6±ùùÿÚ¥À9®¦.©9·lÎßëã [*sCT9ZUE,E=îoП¸Ñ©é¥g­^¿‡Ù–ø˜e5vKXkYƒO‡;ü_±àüÄǰ§¦ê§i´’ÊçµÎ&ê@ÌRZøUÕF¨.~8ðòѹ4ªÜ¥­þ¾CÙŒøÇ¾5ÖK5X@YÕNC:/5þqÞÃn¯D¦·¨w¶ÂÍ’ë í*5D³T:ZT CQ)3 Áé.ÌWµ5¨†¦€°ßÄ÷à&)!Ä<|P»YGWnIþ1eójÔ$»áªÌ¥Ž¬L¾¯ØHøÑ6@LpXYåM‡8´8ûXÛOÀ©­é¥ªœ¹}ÒnñH¢0—HõVÔYÏP==!ú“àVİ[¦¢¨‘¶QÎµì´ Ì,æE¹UZƒRã?·$¡èãïÆ™±Æ¦ì§é´ÿËê& ›*bDýT5ZNS3AQ&BYåÈ;²ó¦´§i´_Ëvé¦ M*:DöT4Z@SA÷%À¾ämÇʱ˦ò§µ|Ìíê: Ç+gE—U!ZbRf?¿#43âDÅ_°b¦±¨þ¶WÏcîâ/àGÍVÒYƒP"ÀtÜÅýbt<õPöY+VF ,² ¨éÍʉ³6§˜§§´ˆÌÎë$.ŸGäV¶Y¯O5:_rúNÙ¸½¬«È¥è¬ ÀkÜøýÐû<_Q ZºUEW*„ Nç¨È²³¦W¨¾¶ËÏèïNý1tJXýXëL¨5‘,ô~ÓK¹m©5¦"°ÄÅôãC‘'CÖT,ZQRe>R!WÿrÝÀ­É¥Â«+¾KÚüL <þPZÆUâDÒ)‘æRÇÿ°a¦©¤¸×ÒÄó‰à57M#YÕW}I50ÂðìôÌ´m§§Õ´eÍ‘ízÙ0õI XøXšLÅ4òEÑo·|¨³¦Z²·ÉCéE \-šGW„YuN7JUõúÓB¹=©W¦ ±·Çõæÿ n+QF”VºYIOÏ8´¬ö Õ󹂩A¦°°>Ç{æ¦ I+HFšVµY$Ox8*þõWÔ]¹7©b¦Q±\ÈùçN Î,qG$WuYNš6ÂdóöÑž·q¨Ì¦õ² Ë]ëÙø/·IXÖXØK3nãîüÍØ´b§³§ÉµrϰðYÂ4òL1Y‹WEHµ- kèÈ@±S¦s©)ºÕÕ(ø³Ò:ÁP Z;U CP&Ž9àáÁO­Æ¥x¬`ÀVÞ¨¨$ÔA©T"ZeQÈ;·ù‰ÖŒº‘©O¦M±ÒÈ"é ç.CIXËXuK2ƾìÇË"³Ã¦§¨‰¸ÛÓIö>ï9gPZ@UÔB°%€åÞ–Àw¬È¥œ­½ÂÀá«›(ûDKV·Y²Nú6b(ò(Ðᵘ§¡§¶aЄòÙc7úNÊY VZD'NYàˆÁà¬Ä¥a­~ªáÔÿ(kEV•YþM¥5†ð!Îf´§R¨þ·„Ó_ö×Ð:!Q&Z[T³@c"fþ©Ú½ƒª¦„°Èûè© ÿ/oJ–XX Iâ- zæÆE¯ä¥€«1¿°ÝñÑ%ZC¼U×YOþ6ÏøðŸÎ„´§r¨ˆ¸žÔø¾•î+HèWXJÆ.h æ,Ån®Ê¥¿¬#Â>â}+ÞGÚW£XJ².1 »åÒÄ/®Ç¥­ÖÂFã¿›,·H1XPXI -+ ¬ãÃ2­Å¥)®çÄ æ» H/–JÖX‡WàFÅ)Rëß%À›«ð¥%°yÈ›ê‡3`MžY VLC¥$ÿpÚ¼©‹¦Z³ÊÍ+ñ5 9ÂP+Z”S#>¢Ù÷Ó·¢§ú§ ¸ÕªùwŽ?UTZ´O7šiî]˽±*¦ºª£¾PÞ)¦FW»XóIÚ-{ dãr™¬Ô¥]¯ÇäéQµ3½MÀY†UÑA."Tü!×V¹a¨\§|¶ÓÁ÷¹> TZ»O×6ñcí7ÊÞ°ü¥–««À_Ả,MI–X§W¨F±(?1݃½ªq¦S³[Ζò<1;IR:ZQÒ9g¦ð¸ÌE²3¦Êª1¿£ßc+œHgXÐWîFÞ(3êÜ&½Õ©’¦´¤ÏWô6ì7ôêìpÉ,°ß¥|¬ÍÂ¡ä¢ k0 LuYV‚Bn"ÝûÖ%¸È§¨ù¸R×eýå#—C‘V2YùJ.T OâèÀw«¦Å±[ÌÍð%Ñ:TR:ZöPN8çƒí É°Ø¥Ó¬¶Ã-æ’ K2pMÍYÿTì?˜e÷ÓѵƦ˜©½kÝ{ *ˆHˆX~WŸES& ÿüØÝ¹K¨­§-¸—Öý $DãVîXÄIK,8ìÞ¾÷© ¦µ´xÑS÷âY@MUªYLˆ0 Uã=Áj«"¦x²Îbó9§= TþYNNB3!9æ\Ãl¬î¥4±Ì ñdata ^®G)ž:`IS_YÂYbUÂK >j,g³ùì*ØÎÅĶ,¬‹¦\¦š«¶ū׿ìAü(-Â>˜LìU ZÀXRKF-6¸" ö~àoÌ”» ¯¢§á¥î©Ž³1ÂâÔzêpÞ¿,ã> M^V(Z.XyPŽC-2|ÉšïrÙÒÅ ¶9«¦§3®ëºqÌááøPn&:ßI¼TßYéXÝQ0E²3–Kqï±Ø­ÄдJªß¥ò§b°¤¾±Ñ5èo02.A=OØW+ZÿU–K§;P' ˆ÷˜ßÊm¸0¬@¦§Ä®ª¼ÇϬæÿ¦.ÙAPgXüY½TûH˜7Ý!x Dð@ØKóú¨Æ¥Ï©Ê´çÅÁÛ¬ô4P&‡; L—V;Z©VLY;¼%þ óAÚvÄ‘³ ©É¥&ªÌµÑǪÞxøˆÛ*»?SOTXèYèSÂF3à¿gç$Ï» ­D¦r§|°±À”ÖSðE Ú$Q;žL=W*ZUmH;54zwç ÎDºJ¬¦#¨t²ÄjÛMöÏb+A×P)Y2YëPAö*ÆñôÚÓÂk±“§X¦Þ­‚½ºÓsî´ %æ/&{ ­ë С¹ùªÅ¥¦ª*¹¯ÏÏë Â&R?êPŽY2XîLö8{zWâÇ7³Â§¦Ù¯–£ÜíújÜ4SJ.WïY$R²@ˆ'¥ ƒêçÍ@·\©÷¥’­O¿ Ù´÷_3ªIWëYÈQš?‡%ÁçkÊp´ö§¦«°äÄÉà± u;lOdY XpK&5õ›÷Dؾm¬Ê¥«³»xÕ õ»b3pJºW|YXO :ü@ýÐÜÁá­ç¥Pªº–Ô·ô74aK@X YM37"{÷ôÖ'¼òªÕ¥¨­\Á4ÞîÿE!â=ÐQZU”Dµ)´]æ²ÇE±r¦ì¨n¸´Òêó®Ó5+MYÛWsI0?ììË ³§¨Ý¶ѤòÞ5‹MQY[WÏG -* sçˆÇ…°"¦$ªý»ãØ/ü¸">ÉR:Z (üÁز»á©G¦§± ÊÉë©q2 LYfWGÚ*NvâŠÂ­Ä¥ ®~Äiåß .„IhX!XHu,wíâi¼¬Í¥û®²ÆÚè+2”LpYeVÝC%…ÿöÙC»©ë¦7µrÑtöíì=·SZæOÌ6mTìÚȼ¯Ð¥­SÄ%ç•ï2ÀMÙYÒT„?êuöÂÐ8´z¦fªB¿á Ð.‚KsYÅUAe\÷ôÐû³X¦üªÁäÕ ž2:N ZSÚ;ÒÌî=É ¯Â¥}¯@Êðä’=…T½YL<.‚IÝr»P¨/¨+»LÝ â.¡LçY©S);Ÿ?ë]År¬"¦û³ÓDü&@GºX[V“@%Bñ Éa®Ú¥+²•Ð ú¬$ÁF³X3V·?V¸îÇŬ.¦û´ÏÕÄ-+kKàYùR78å¥ã/¾©¨}¨Î½•ã9š8US»YJ.(5üÑœ±Å¥°°ÃÏ+ûx'ÎI½YSI7` úß±º;§Æª…ÄñíÝZBÝW—VÈ>x+èÀÖ¨Ó¨$ÀÁèb“? WOW4@ÄÏèÀ©¨0©šÁeë¨jB.XÅU½;žá†ºÙ¦K¬tÉ;ö€%JZ‡P60=Ó+±Õ¥œ´uÙ~ u6ÒSYUD­ÎêÀ.¨]ªÆUó$ùIZbOì,Ûü«Íž­¦¦þº«äfAmXyT6ØŽÖ ²×¥æµhÝËê< WVü9x :Ù<³Ê¥Yµ"Ý+°=WVU“7´>Õ¦°¦5¹êãΚCUYžQÜ.jüËg«<¨ÍÂMò/&M(Z²H|Ã鼈¦s¯uÔ¬‘9¥VÐU"7#;Ñ´­C§^ÀMð‘%pM Z¤FûåãÔ·Ñ¥´õÞP¯C¯YOœ'‚ñÀ §®›ÔÇ ª<'XïR¯.Üø–Å`¨l¬}ÐÂ.:ŒW³SÌ/~ùŽÅ5¨õ¬DÒ‚ Ä@ÌÂò¥ïºWöä6Y'JãÏA¨Y²qè¿+EVWPâïØ)«÷­àv$ÌS4S¤"ñÝí¬Q¬ÜÜô!S¸SH#ôݬ¬Ó¬»ÞZ$@T*RõÙŒªª¯¸åž+ýVÊM2ŽÏˆ§¶aò7­Y"E£ÂÂ¥ªÁÝÎD®Y=6oðl´m¨ÔpRdSRÿÖ©³ãï›6ÕYÊB /½3¦­Ê}åMþU %sÛªU²ï÷6úY@û^¹5§áÑöRVQêóÍs¦&½rÚEàX.ã(¬T°üìï6Z¼=tõœ´˜©ÇÜ-)öWÉGÎþ¼»¦³ÑrÝT–M} eÃã¥6ËÀ„RSPi¬ÆÃ¥ÏÈ€ÖQÄP¶cÆÈ¥/ÊÕSOS…¦’ϤÏUJ-¨»±§vÙ)ÛXFB+÷ü²(¬™è£74Z¨4ªä¦ªÅµeý÷FWN Ïè¥óÆ$TèKéÀ¹ ©<á34Zî5:äß©r¸íãK S;yÃ~¦¬Öe*–YÅ;/êq«]¶ÄrKmSaÁ3§ܽ04ZÕ3Aßϧ‚¿;ZSÄJÉþ̳õ­ó¾CçVÔÆ}¦§Ù309Zþ08Ú…¦ŒÆxŸWØ@í«x¹ð ëQAKýv±@±æütK|Q °·“¬×òÝEÝTj¼6ªÑìVBYV´¾h©ÕêgAŒV?¾Ë©Îì=C‡U»‘«ÐòˆGãR ¹µb¯ûü¦MŸMÂü¯z¶Z 4TtDoìý¨=Âl)Yä5èØË¥ÔÀ1¼Yß =Äž¨”ì»E°R2Ô±¿´ U AääɦÌö+Za#ÀÄø¨ÞïûHyOÈû¼¬ ½4BY2$ÑR¦›ãÍA¯Scϯ5¹È¹X•3›Ñj¦¬å+D¼Q þ˜¬$¿³ZH(ÈŹ©˜öÖNUGõ蟦Òÿ5‰Wt ›²Ä·ÄlYü,\È[©S÷&PIDfâÒ¥ÜÛØ?­RVüˆªmÆX,@Yyn´V·±íYg&¸À×­èÙVÓ4.ͪ¨øýQ??Øe¦ÉìîLäEìàÆ¥ðäÃHþIÂæÒ¥dà;FíKxéí¥ß¼EüKêèÛ¥Óà]G)JåÀ¥çåçJFÞ(¦pî¾OT?RÔõ§úöTì4[È~¬G Y5&z»<µþZ¸Ÿ¯²Ã`1¶U´úz§èØüD›I±ßg¦ÈôT'4þļ¯5:Z^Ÿ¯¼ÅÓ5ÒRåïØ¥6è¢O;<ʲ­©;Zå®ʱ;NœäE¦®÷bV½*cºOºî*$V ö¦ÂèjQB5üÁ‚´b#øW®ûq¦ãå´P{54ÁßµÙ&®V)õÑ¥ßîÝTn+X¸6¿£4EPââV§SÕYÕÊ«»ÔÇH‰>‘dzH%3V*ð奩úÑX7#­hÓI¯< ÄÆ¶í,{RÚãö§d 5ZµÓ¦ŠêkUv$İ¥Î[GÍ<(Âû¹®3Mc×ò¬ÁüVlíʦ1:Z¦¼ôçX©Kä°TÏ"0®*×OW.´0Í4IË6©¹ÆD <1¾uÁ@@2@+Áí¾8>²A9Âc¾!>OAQÁ¹¿ÿ?þ>…¾ÜC˜:$º©È©H²3–´øÐNÕ)™®nÜXTºQ©AëÄX0 !¦€ýFZWøÇ¦ªW6â ­P),M¢Ëʺ?n;~·§Ð—Pœ!¢©îÈY'¦¬¡VÄݪ°/3iDé½’ÊlNT#c©£ñ>Zøê§œî⯠>Ä-¨²sU’ËþÈ‚T£^¨Œ.ß;‘­TöoXiÓfÃRã¨=/¶9²«?ý-V+ʱÍwWÃ÷S®á?&¦_öH¡´lìZYëӎƺU0û®HA¾!Ó¥ð!´@A­þìSçÀ6ÝKZ&Ü2ÂîT<úì¯dF&þ¦Ý1 0š¦~LC%­ÞzP­¸åìÜW&ÇãÙFZÜÖQÊåXæ=¾ÝTõ`µMOä8¯%I´ 6«*CjŨß= f§³9« µ¦õ6E#n¦Ñ5ö#l¦J6Ë"«¦`8³N§í;°˜¨¼@–骊FA ЮÈL¸þÝ´ÉR0ñ°½™WâÑÉ(ZîÑ¢Ù,YÂídS´«¿Gì©‘5Ï¥4í©ÃHÐÿ·–Vˆà”ÏûYŒÃÎï;P,®ˆ…8Î¥ 7ï…®YQ1ë6É>ZJÄ*òhM»ª— ,+¾§®G×úf¿üYEÊ@íN™ªv#&æ©ìMíÌ|YHº÷ˆ=Ð¥ä>LÛ¼ZµÅµ÷âEL¦Ã8s )ºçYÆÅ§ùJCÞ¥Ó>Rÿ|ÂZgºß .4ȧãM<åÚýR™ª¤,ŸÁ·Z‹À$6¨èOÞcäOL‰¦Í=÷ùßËWà¬ù*Ò´¼ÕY¶ûR‰³nZ^¼ ˆ&°°ÔXÀÞ )¹¯pY¼¾[æ$d²ÐZ¸Tû» X^²å( ÎÅdXì¤A‰±A¡ODª§ÇFv#"I9óWKv kM¼[YOŒ'!Q—ÚÃR(=T7ƒU¡3¸V‘¹WÇŽXu:Yv¹YaßZ"8Z}Ç7ZØ Z‡q±Y',Y¢q}X¨$¢WÖ¬VÕÞmUÑVT“RîèPÑæO¨5Mf´ÿJÍ*¼HæUFŸúÊCÄÉAtóS>†­i;ta8 £=5Úþ1 ‚§.Âm8+¯ÿ³'G$Ÿ—p w;µÃrëj¾ÞJ3¸ÇH CPW g·`z gR5lý2:rùÚ{õ »ˆñû0íeºé›Tâå¼çâ7ZÞI±­Ú”©×dÊÓ¬åЩ¸Å̇ÉÝacÆŽ‚\ÃjìsÀØ)«½ ¥»oÌ~¸ôä¶[?â³Æ÷̱"?߯5®1[~¬: «$áÆ©¬¨•̾§Íþý¦¹j¦è5¦5ÖÍ¥«Ä¥¸Þ饵\=¦¿¦ÙÌn§„6L¨W©iŽª°~ò«>ê­ÄZ<¯»  ±C7.³œ¢cµ™RÀ·‹‚Bº–é¼è…³¿Ù¥ŸÂÒµ«ÅýóÖÈÕõÌ’Ø‚ÏûÓ¹¨•ÖƒAÚ7ÒÞõºÒáãø´åì¥é ¢íÌ6©ñx·õ©ÍùÄ÷ãýõ1=1ù LÙí “ÂØ½p–â±cDÎ!!ì·Ð$eÁl(ÜŒõ+uh/N Ã2‡¥6I-9¼Ã7<È‚$?¶®ñAùÂDÎ'G[IWÎK:ìèMÎ]ÜO@9§QPòHS";ÀT° V£2-W¥‚!Xå¸èXð´‚YYÌîYyü,ZÓÚëŰÒÂ)CÙ¿!Ÿ½…¥OºOÝÁ·¨ZµÈl³j\±º¯•„Y­uÙÅ«7_ª(q'©:¨à¥D§z ›¦µ "¦½ÂÙ¥™Â¥Î~Ü¥( '¦W½£¦¨ÄP§øL.¨êþ;©˜Oyª~›å«±=€­¡@H¯¸í<±[ø\³¯Ÿ§µü<¸N ·ºÊy½Ïq`ÀDëj÷´—ƧäÉ)mOÍ ¦ÖÐuyÔc3ØçÜh>êßµ{âãEêçOpìêÑ!ðõÆLô»~ø«ã´üÄ÷îDË >õ! £ä5 fASDEœ= Z)?Q!J3Ñ$çòˆ(T,,ÌÏ·/Õ*3 X‚6¹ƒ½9Ò¿Ù<¨Ö?—"°B•ïfE¡øG>öcJ!€§Lo÷ÁNì@²PwR½T—özUU:¸V8„ÆW]~¥XYRTYbÞÒYI‚ ZºK=Z¾Ö(Z ]ãY»lYETÅXîFíWÊåVÕ>­UŠYFTw±RØAîPºËþN›µãLažJ,"/HŸ#˜EÊuÚBD—÷?¡ ñ<‡zÈ9•6:3<ô“/zõ+?=(ó·n$Á{‹ •¶•€îF{~[±T1 Å’×ÂVœ¿Ì.¼O³r¹Tß¶ÚVu´ÉC6²QU#°®è=®Œ‡¬Îÿªû©©êÞƒ¨ò°§üOЦDC¦û饃ÜÃ¥:Ò¥¥¥¦= ‹¦pD5§Wç¨ì¥#©fÅfªœ×Û«zÇ­N X¯–8]±ù«³œœðµ#Y|¸ÂÀ1»ï ¾#ÐÁ†*?Ä—nŒÇ%›ûÊbÔ‰ÎEë5ÒïüÕoÝÙ¤†ÔÝòeàávdþå› ,ê~gîu&­ò;üöâ,Oû‚©ÿæœê¦‘ÃS E+~²¢ç>ºiÓÅcÀ ±ö©$‡e~(d=,9™â/Zàm3Ü60¾+:’šZ=xg@$=OCDiF¬H`kK4XdMH/OÏülQ]?,SIE¼TT¸Vð JW¥_FX±1Yœ·¦YÎÞ ZV9Z5a4Z‰ûYÍŽY/+îXÖX›ÙWÙUûXmT"wÐRŽGQðÇOÜL¦W„J`ìH/SET¯|BNú~?)Ò[<6ñ9ÉF¬5o¸#2)]}.C»*÷¢ß&ª®ì"ÿ»ä¤Êo;Ÿý…f…z"Û—Õ xi‚L|+XbÓüD±|ø¨ú)ô0ÖÝï¶Ïšë·zcçW:ã…ï!ß3°ÛË-×ÈlUÓó ˜Ïóg÷Ëý†uÈx”Å*²ÖÁн¾#æË»Íº¹md¶—ñ³´¬±7ö–¯’¢±­5÷ý«[ÿ|ª÷È/©¨YÁ3§‰@†¦&?¦¼ÞÎ¥l™Å¥Ø>ó¥)X¦+™ó¦¬Úŧ? Ψ®ý ªo~«­w%­[?ÿ®Ÿ5 ±TÞG³&´µÓpN¸šK»O ¾bÕ!Á³dİ<ËÇrûUË•dÏ› ÌÒJÁ²Ö¨>´Ú›€ÌÞ¼óúâ̳:çxà‹ë }èïdçQô7Àøþè7ýZü¦öaû·ªP êwžÓ åßQ 6ƒNÊßl Îx#Š=p'47P+J/ÀÁ2 ØN6ñK»9øë=ºÉ+@×+CÌ_F§m±H.”3K¼òˆMBp¯O@¦Q¤kS&åþT–£^V,BŠW^À€X¦ AYÙ?ÌY¹F Zøk=Zw…#ZPŸÒYçÂJYqLŒXŽ~—WmVbQ UE^yS³ç±Qd¸O¨öŒMRæ1K-¨H‹hñERCy@I$Ï<Ø6u9L÷5W2 '˜.sh»*|ªÃ&G_³"‘(*SÖQ¦A §Dc|G/±$JïžL¼£æN-TýP=àRžŽTÁÍVµHHW/µQX(È"YºY6ÅZ õZ–;qƒ84q4÷è©0êëÁ,Z-¼(È9›$bÊa þ“èm°µ.>ˆÄ¾¼5 K<¤±4ÉxüæHä÷ô§Tó*ëÌîBPê¯1áå½,ƒá>ò8ÝïmÙëhëÔ¦µíЩøÍÄãQÉð¸ÅŽ¥FÂ>Lý¾]:ß»øî¸‹?-¶íJ³Ä}@±Ãs¯-»&­d²l«@”ë©°€¤¨éW˜§¤ûǦ ë3¦cÊÜ¥Ô²Â¥Ö æ¥”ƒF¦IEä¦ß˜¾§àfÕ¨ü’'ªVô« |{­é{¯×±±Ñ¸´…¬¿¶{l“¹•¬—¼ŒÅÊ¿˜K*ÃÁ'´ÆêeÊ4ú<Ϊ7Ò»ÖPÖzaˆÚn½ÙÞŠSCã"PÀçiòOìyìðµp•õçå”L¢àËÔ?Üxþõ×»ÊÇÓC<¸Ïš1ÊËoÈ&Û]Ä­áäÀ„˜½Ýyº›~Œ·ƒ Ò´w¢L²¡úý¯ïç­9å ¬dqkªÃš©7­á§Pú¦ÓR¦Öƒê¥ŠÃ¥xæÛ¥³x5¦!LϦ¡D©§“¥Â¨8åªÊ±«hûƒ­7—’¯ºWÛ±§Ö\´·>…º¤"½‰ÝsÀ óÃ`»žÇá"sËÍËnÏwÓ)ÄÍ×Þâ*Ü ¢£à’Ÿ2å¼ðÖéÈŠî3Móø}ÁêüP¼Týo:_ ¯­Éå hô5ùSÁxcØä!*ð8&-hs*êÎ.ÅŸŒ2³£e6Îf:—¤=A”6D/À8GúëJtW¥Lþm Oaú9Q†å.SÄéTgûfVºŸ§W|é©X)mY šðY3à3ZEÀ6ZùY—èzY­†¼X̾WQHVHÝU±MS&XQZ(O¿S¿L J¼ HGOŸ=DyŠATù•=)oý9Àd:6m—O2"Æ?.7â *Úç¼%"öO!<Ê+þ.ö”ÕaÅÝý þ{.ÌÊZrI†ûò´ö|éñŒ'í!8sèúÍÏã,¡@ß`(ÉÚé¤lÖ^n.ÒIœÎð\ʨ•HÆÆ@¢Âf )¿£­ß»/–ȸß5æµç²:³.+Ȱ |®'e•¬ïwت‰ [©Ag¨hp#§„k¦ãõ¥xfÄ¥óžÖ¥ÿå,¦ÿ´Æ¦U¤§æĨÝ:&ª™>É«{q¬­íͯé·,²k‹Æ´ š·r£¤º€Šä½ ôVÁ+ŸùÄý¢ÉÈ 6ÄÌyuæÐù,Õ•Ùt’Þ4=»â-÷qçûF=ì­ñ>Sþõ¬æêúDZáÿ/Æîm“ M`vomÓBÖt1í!8Tx%v)Ó)ü%.ŒÍ)2¡6îÕí9¾Š‘=´ÖAË_NDJEbGþ AJŒ¹éL7YO]*Q¿ç„SÉ%>UÒ¸VÿðW>bèX\öœY¯ZÅWHi'1E?ÅîAÈËy>œâÔ:Œª7¡3> â.¾¿™*[X0&=©!Í›OÌ3„£I©ˆ‹Â #ÂÓ'²àÿ1íú² ýõ4ñÆ!6ì!ôfçûFªâÖÞ¸9wÙÒÕĹÐÎÌlbÈ2ƵÄVì Á9Ü’½!?MºFÓ=·Åñf´/˱³ l¯L­ÍÍl«¿ÍÏ©Phv¨ðÆa§áß’¦^ ¦êÞÈ¥B‡Î¥·¦r»¯¦¨ÒЧ2ݭª²Ž½«_ß«­ ”Û¯Û©K²-•ù´!ÿã·ê»3§c¾>ÚóÁt¶Å‡Ó§És|ÅÍ»© ÒÜ`wÖöâÛš°ßW wä›ËSé Dî­Bó”–LøÆB[ýݱq­Øn§aX ¢@>|¥Û (;1($Pƒ¦(:¸-V¨C1bZ[5¤~I9vÉ =l¤ž@9ÿCÃ+G   J2ÚÛLè[O‡œQØžSàA^U+cÛV„’X›RY¤=¶Y BZVf=Z¾ZÕ¥§YþòX§öW%´Vb`-Ug°bS›UQ…OsMzL¼Ð¯I½DªFÙõkCol÷?[O¦ÐœÛ¥­ÔÃ¥¬ö¥{t¦y~<§Ø£N¨©©8êL«¹6­Öf¯S·Ø±ð/´}Õ€·h²±ºôѾɮ¿Á©%—Å© É’G×ÍÕí8ÒEùÁÖ{ÄmÛ*¢9àáêåþ²ê@à.ïÂPôšxùö»¬þ+ýϯXÜ*Ðç `WåG9ÖðŲ´ y!Ž÷$&-R²*ìû/åía3¼D}79¸k;ß*?™ô´Bà FB%I}NLÜì¦N¹qQ¿9'SòUx©–V2IäW0éXjò¤YbZýw=Zö–Zž«YJýñXŒüîWY¤¢V§UXw2SÓFQÕ,¬N9L…(I•²ùEUPšB”¯?G×5;Î67|ù3R²¯.ݯ.*š”‰%<[Ä £äâ°aénåÛ2ɾ DE–[Ëf«4ý`ø»BÚò,ʺíiHªèO­ãÇÞ’ÎýÙ‹TÕs+ÎÐE=p̉ù=ÈÎ;ÄêûjÀ«Ѽ¥p¹ƒbL¶¬>g³äðšzd®ß_K¬&;zª–ûò¨ö§âǦÕg$¦ÕÏ¥gɥ処̧¦` Œ§Y`½¨¾;ª¬¬.å® p°Õ÷³¨¿óµÕ‹¹É3|¼a)Àï!óÃÓÿÇæ>ÌÝS«ÐLÒBÕÖ›ÿÙfßÞV$ÜãmŒóèyZî^q[󬢸¶òòýÙŸ?©÷mÅz— Ùxµç(Ä|`¿>C¢!9wi&Ù+¤…’/ácì3ã8)(<ëçä?§yCZÕF/ôIÌÓL¢MqOùÊQúùÝSŠ©UÍ*W¶ó_X]NIY5~åY¢ª3Z³›3Z…!åY¿mHY«ó]X4V&WÚ£¢U öÓSbí»Q\O´¬¶L¾©ÍI¤·£F›[;C¤©—?µ˜»;Ž ª7)"h3vì÷.î¿]*E¶%Àà» —¼},¤R)wª: “ñœN¢›Qü›e÷x7»ñ%€ìêUç¤Aâ–UFÝ¡jØÙª°ÓÑmÏŽ·Ê¡öÆP—{Â箾ëÚ»hJÅ·²y°´=ß±Ï8T¯æÔ­T(«))o©ñS¨È)§x‚H¦œgÝ¥ Ä¥Ÿêü¥ •‡¦dd§RC‘¨‰«ª²wÚ«¼ó­„X°PÙ³>>úµ33¹IA­¼’ÕeÀ`"YÄ•óƒÈ4Iâ̰=pÑ-Ï)Ö K Ûùî à\ /å=jê°0¹ïçŠõOúIÞôÿÆSëü› ­·á €ki;ºG÷:$‰d )åd¹-¤W>2w5—6@¿:%5³>9"oB½ïE„Í1I+2L+JîN”FcQÅ5Sã–oUlW~³GXý¨Y~fIXÆW^³nU1E‹S³Q[Qn”àNð[L=IòBÇE1:Bo>99k:šœ06žÃ1w/(-d—b(Jw#tPj Ä@{Jÿ禪®×G cÊÛH’kþƒ5üø.È’ó5X4î‡æåèžw¬ã/åŒÞ~ŒÙÁ¬®Ô¿^ùÏü„pË«’ÇX‡õÂ^ ¿þ^»aúð· ZÇ´°iä±.ÛJ¯ÕUý¬„ þªã O©qò§®Iè¦é3¦­Ó¥‚ËÈ¥5B¦ð–µ¦¬ã«§ŽÔö¨¼”ªÙÉ„¬%Ä®oºR±É(,´O·]¥·º• c¾¡NÂ[æuÆ©›ÔÊ8vgÏæZ)ÔcÙ]d)ÞŠº]ãЄ®èV îœpó¹Êùƒ;¦þd,Šdˆ ÎÇî$èDŽòŠ=ì·óAÊ#Kkº(w†-ç®&2Ÿ‰™6+Ù:ï+â>™>°B2L@F*VŽIžŽ—Lµ¿XOØXÏQœçøSí3ÓUóˆ\Wm“XúuY}ÖZ h]S÷Íþ¬>?ù{¶óÉ9î,gÌèÂuãFo:Þ­‚ÙÊ*Ô _Ïë,ÃÊíõZÆ6ï*Â]#7¾ç¯ƒºè)·ß-ì³0б)®¬”?¬¤¤RªGº¨Ÿ'x§³¦dÐû¥'\Ã¥lä¥ÄO_¦€E3§`¨Åä©Zˆ¾«‘í­/n°þ×>³«#]¶Ò Źìpt½a~fÁ¹b˜Å“ÊNî¨Îp¬~ÓA+‚سխÝÜüâ¨ÞièXïíÖÒ‡óû\,ùèÛþytr}û }«ƒò¶S8 šŽÃ$XpÈ)³¦.ñœU3Ÿ!Ô7Ù¶<"G)@É÷C11„G-OÊJJDÇMl·wPôÙR_×èT—ѤVÿL Xy›YÅÏÑY©Î/Z[m4Z•3ßY@±0Y‚)XD·ÉVºlUˆ'Sþ‰©PSúMk7üJÃõ²GþY!Dæ K@#ª3S0Bù–ðEh;iIK´–LÓªuO^&R193¨[î7œœc<®K˜@‡ÃˆD:¾/H¹.ŠK•o“N™ IQi!§SÕ«U„TW™¾žXGš‰Y=Zb=ZF£ZŒŠjY”oXE€WÈZUØDS}¡ÒPÈïNmáéJÆØxGI^¹Cš’¯?,¡_;šRÎ6êi2.>û,ŸÄ'&È`"ú×Áþ,¸Èh>Ç ó[«Æ¿ÿHVÒùlÌëótîqaKèÁqžâ·jÝø ª×*pÒ‹gÍÉ–ÈßMÄ6'²¿±Y¨»¨hê·ù¬|´c±¢"¡®u(:¬cØ0ªœÀ‡¨£ª@§j]¦~ÍÞ¥ëçÅ¥§‚¦>îĦ‡íÛ§´ W©è4«§q­¶ °Å-³áüP¶ŸPó¹,Vå½k#ÂÔ"¨ÆÚoË=rÐVo¬Õ²¤ÛQx­à·>hæl1@ìÆ0ò–/øÊ¨<þðc3‰T mÅùåüŸ}ñ{!ÔJ‰&ª­Ò+còì0ûƒÐ5D`y:¤ á>ýwCú7ÛF3qdJ´µšM‰zP€S¡)UŒ€óVdÇ[X˜aYj¡ZÎ =Z6¼ZÛç‚Y½X•4WžrxU‰[SìÅßPf*NCŠ×J÷¦QGj/zCç”U?€Qè:Ët76í.H1â ,«Å&©ú ’B½™F•»KJ§¤M?DŸP_Í8SúmU— :W=àœXç”YZ¨*:Z_èYZ(YãÐúW•ÄaVÍ®^TÚóQ52$OµèòKKôcHÙe{D?'>@!±;_Ú6k„¾1ñe,bþÓ&±R!zì&.Go¯ð°é´émk‹"üŸÛõ¦ ï;oyéO§mã?ö„ÝÚµÆ×ÂD:Ò–€æÌ§ZÒÇzÃ8‚¾¶QºQÏx¶`øû²Œà¯¶(­èÙªyXö¨ïÝ€§‚,{¦‘öæ¥ÕæÄ¥¥q=CRJG,zþJúSN ˜GQHoÔSøUyã®WõC÷XÀÎYjÄ4Z'(Z_(©YU¸X6VW’„U(FS¦ìœP5§ŒM=öJ§FFóèBø…–=½Ä82~©3œhK.Z!±(ïöá"¤$åƒÂ)¿Ÿ+ #vÆÛZ\ýöÛôöfx˜ð³@Oêz—!äÇWÞ^8Ø|äŒÒ!×ÍÝiìÇì¬Ããèm¾?m+º<·C¶/¼²­l™¯)Ï߬Áô’ªn¶¨GÇK§èV¦IÖ¥´@Í¥§];¦åݧã)z¨ÍHªòˆ¬Øn6¯ ¶P²øðѵӧ¶¹æ¥ø½¡“˜;€Ç¾m¹Ìè×6ÒáËò×ÃäÝîä^åÐ¥BùÒF¾ã¢JmÍNôSQ³aºSþ6ìU©­WB+ûX|ÔYñï6ZÏ"ZÏ—Yœl–X$ÔWŠß5U‚ÑÚRÏPº/ÞLSMDIò‹HE^ð@#A<GA7` ÷16¸i,Q &FÉ¢ ¯ÌxvÏ*¤úÀ 7DÀ¦¼Ó”3úQ€±óKV?í¥¨åæ±,­à?;žÚZ!ÁÔ¦ÓϼÉ#£Ä¯Ú¿â—g»¤Q·Ÿž³dæQ°9ñq­(ó«pÇ©þÙ§ãr¦ZòߥNŒÈ¥¸],¦aª §È¿d¨z˜6ªž0~¬49¯¨gc²2&ùµ"õ¹¢dR¾¿ Ã$èÈs͇™Ó¤hõØh ßÔºRå.‚½ë;Gò<€áø_Œÿöì!‹Ÿ ìˆ -i˜£ ¢Y¬%C;‡+œÝ&1wy…6_9š;æB_@.ÍDoÞH¿L—õÓOž§®Rè÷U̪W– X—YPÕ#Z•£5Z;³ËY®ææX%Õ‡WS®°Up`cS„X£P ØsM†uÙI·ØELDwAÐк<,ù©7=K2äÓ¦,ÒžÃ&ª ]b4]õÿæk Ïfñ'gæù›0àò<Rì­ÀÞåYKßC†lÙü2Óœ“ÏÍhàeȆIÃfI‚¾ùºZÙ ¶/åj²+6¯œs¬Së%ª1ßQ¨óåù¦ á¦òRÅ¥Òê¥óU¦[0µ§×¿W©v«­ ®Ùˆ±´¯–´…}€¸7€Ð¼ÇÕÁ­ŠŒÆëË”Ñ[×%h¨Ýjïäpî„êYt(ñ1Þß÷´è¦þJ6jmx MEœ•U j_¹”%€ ‹+¹sE1~ʺ6tä;éÞ¹@\5E»DOIjâM ²IPÊ Sãµ€Uö)iW‚©ÕX¤ÐÄYûn4Z`X$Z™ò“Y'Q„X pöV¹¤ìTwiR¿zpOs¯L†Ý-Hö^îC¶M?p­P:²ÿÿ4Ųb/ᤀ)ÓNb#¬QâΓ¼üõ£p@ ÕÁ|³Á´ûý1òôðè>îÙ˜¤ç0ç,áæ8áÚìÎÊÔ§…òÎ aÉ qÄÁ¦2¿ÉˤºFØ{¶9ƽ²ƒzp¯ê˜¬(à:ªyZ¨âÇú¦¸}¦’Ä¥Ü&ð¥å¹ ¦$ÝÔ§h‹‹©ìÕÁ«ä+u®¿9¡±£áAµ ”Q¹z§Ê½‡¦ÂCÞÇ¢ÃiÍßAÓ;<\Ù"ê°ß€–7ænäìկ󶤋úv1™Jõd™ô¨Æ.¥/Ž"ô·º(õÿ­.;]4«EÁ9^Ñ>TɆCOèÙG«ÄKºAO7½IRÖXÚT±îV`ãƒX¹ —YxÞ&ZšÞ1ZS¸Yë<ºXrl9WSk7Uw„·RȼO!çKL{jiHŒOD¿~g?à U:…Zë4Z2/V2)$Wô"Ñn°Qã"´#6ÀL‰‘h:úû¡óå>Ôì„"æÊö–ß)n;Ùù™ÓHÂ:ÍýݧÇãpiÂ~}‡½ï“ ¹™Šö´ŸÓT±`è)®ºúz«UýK©§Æ §Ü¡{¦ÎõÞ¥'QË¥qžA¦n¦@§YÑǨ-&Ôªl‹c­5Xq°÷ù³~0÷·¸ýc¼ëÆ8Á¾"oÆjZþËc«ÞÑN–؃mÞ1åÐKÍëL³ò¤­ù»µ8¢¤Hz?êA@|ç f"ů(h¾.òþ…4ð :¡:"?±RæCW˜CHy4Lä±O<)·R”ö>UÕ´EWlÞÇXM ÃYÌÆ5ZsäZË”~YÅfUXh9¥Vž#pTg³¹QEˆ…NŒÂØJr~¸FçI+B©§7=]gå7R<2HFE,‰' &l¬‘(Ÿè…SÁ?+ ·,¦³%ý9ë"ö#Â.ïxåSèŒ9áã Û×ÏÅÔ4:¹Î¶ùÈa+ŽÃÙ\¾ÚwÚ¹¦¡µâ×Û±4è®Ï’Å«4`~©E+¿§î´Š¦Tã¥RæÉ¥¼4?¦Û)B§^Ò¨à­ëª挭Xµ°°XS´* n¸­û¼ÓóÁ_PÇJ›ÍÙÓ’Ñ`Ùºïðß•l´æ¾¡íSÕ¬ôŒ Ëû«5ñ%éö Ÿ*é£gÄb…y±‚%<"O+##[18š7㚃ô„Gð`öBÍÕü={ÜŸ8½è2=fÞ,ôoŒ&ÁüÚ7štJa? º tûü»gÙõÄHÇî³(Ðç”*ÿà¯}_Ú•ºûÓ·rÞÍ8uÈ jžÂ–޽6鸮¶´4)þ°ï£Å­Ky«âXé¨ÇÄM§ ÑB¦LÊ¥GËä¥v›’¦L0Ó§›í£©½â¬Ihë®ÌïY²ÌàG¶ì#°º¨YŠ¿ÜüÏÄþ wÊ ôwжHÇÖ°\Ýôj*ä÷(ëZ´Hòjç€ùjźóìá`šà(ⵓ#nè *ãÝ>0>d%6# ¶;вå@² ­E YJläM EQåé"Tj¯wVÃ;@X3×xY!ÓZ¦3ZÃù³Y¸Œ¡XÜéýVP’ËT¬Ü Râ>ÉNN¸KÜÀFZ B³å<†[7€Dv1 ~>+;¼¾$@I—¸úS¼ÈÈ4‡ü}BúÍ^ó.ßë)›Øä£þÝ \׳ýÐϧìÊ=Æ3ÅÝ´Ü¿†ðº˜®w¶h¸y² °ý®Þ] ¬ 9¢©Ý̧‡½Š¦ ëߥ¾”Í¥ºWS¦†Jq§bã$©yZl«\ C®W¥±×ŸŒµÄó¹CѾ~ºÄoÔÉøåϘOJÖíîöÜÉàã úêÝh9ò}ùY>õM>‚r²©KÞ‡ï©P$aèÛ*ä»!1£à7З­<ÖaàAo!¦Fž4õJíyÇN*NRWÓÙTèWúù²XèâÀY-‡7ZÛÄZ"°[YßX X_®#V)àªS‹»£P†qMà¡ÿHYToDXài?ð÷9[i"4:[ó-Àu'“² N[·‡^ðºF ÷éÎ¥…ü‚&õÿ1ÙíVªælW¦ß¨_ÙØ:OÒ²RÌÏ{0ÆŽ±ÀTµž»ôg·¼ ä²LwK¯yƒ>¬&é°oݧó`‘¦0âà¥PõÍ¥úJX¦‹Ò§B©!¿œ«V‹®† ²Iº¶¦›šºÂàž¿=4Å`îóÊÍ0ÑB<Á×Ö™Þ¯p­å ðìøýVô)°Ðû•ËW_^ A_ Eƒ=Ú¢@ ”O'O™-‚×3"”º9¦Â;?ÅKODe‘íHo` M`-¨PÚ÷¶SUŸ4VgXÝjYµ“Z~ù2Z¢íªYûà…X¦ôÅVå¨mTqIQ«aN¯DJ5sxEÜv@s…;5„$5øûè.‹Z(I ƒ!RpÀu-2&È ` MúÉüðÞJõxÞíwj‘æïpß —‰ØMûçÑÝϗ˲·¤Å¦0Àã“ÿº?Ü`¶›ÌE²ç›µ®©2·«~ÐO©I„§ÅW¦ìÓÌ¥Îtä¥CÔž¦yÊú§@ ö©‡`¬|ÿ»¯&Æ|³ yÈ·ŸF˜¼•âÁe2ŸÇÒCÂÍœBÔ.;ÛÒ…'â1NrévéðEðyø{ß`¶K(„æ„2ê·mþ·$ ²v+õè1ê©8Zç¸=A‚C{yÒG:”#L®9ìOq7&Sê¼ÊUr´ÕW­]BY1ÑZ78Zäè¿Y2»¤Xµ†éV:’Tí}žQ­ëN~JîhEñ$N@;œ¾:0“Ã4V»g.ò‹¶'µ0¼ U1…7Ö c– ÝØù§ÜVû«½»ó†#6ì0<ÔäZT£Ý# ±Öˆó е³ºÉ„ÐÎÃ7Q¾ðM¹×ßÊ´y}Ó°%cn­'0¢ªot¨n—è¦yq¦÷Ä¥Á\-¦M¦>§Nõ¨Ê9O«Â@G®OÙ±BýµÚ÷¬ºøÄÞ¿ª8ŠÅ}†£Ëu£ ÒÐ9ôØ’³àj´mçÔ=øîª£ö?Waþy>$TXÀ ì>ô˜Å½#›R¢*ÿN81u˜u7„L=wí²Bƒ+žG·@L/KáO4P)SªÝÖUäÃåW¦(QYQÛZ!°4ZK™ªY“yXwg¢V¡)T)QV²dMQ¿$IT[Džø?÷½O9ý!3Z„“, ;°%M…|áFŽ6ÿÝ{;ÄX]øªðD駦á[#sÚg†Ó§í̆d´ÆrfèÀ!ï“»ú³Á¶O±z²9¬Ç®õ¯«1¹8©ëág§|A¦“HÆ¥—ù¥ýئ8µd¨ ‰™ªû1s­Ëì°?ÿ´ü¦£¹Z6оhU|Äv£›Ê‰C$ÑeØÚ}:ߺP¬æõšRîÎö­øý^ÉÐø^… Ç”%fœ}îÞ#®hÝ*Dƒ‹1íæÛ7 Â=<4C¯&HƒÛŽLíteP £Sßc@Vã!9X¢hˆYX,Z‡£"Z©õkY«X´öûUuàHS õOLçüƒG\ÀvBlèó>ÏÚ^DEIòךM”eXQ–‹uT(DìV¥K·X›äÒY`¸ŠPд&O#Ê-1ä„4wÐÔ:R6¯@´ FMÐJjÓO%ñ“R·}U6ºWòFCYjÂZzö1ZUê”YžE@XGÄ6V\3|S-ýPÇî LócG¬Ê'B;›cU]8ºé¶19H¦*¨:#'þweŽ™+p œ8zCùú½Ãò̰©ê>p¼â;' ÛK¬Ó=÷©Ìí5Æçü¿¹ülºvúrµ0H±œi­lªÿp'¨îÝ ¦&ÈÛ¥ÿXÚ¥Æzœ¦ïA!¨ueª&×c­®‚±²Mvµ½—xºÓ'Àš0;ÆèeâÌäùÓì~rÛ·Q;ãºFë§ê|ócŽÓû#7-Ãáb Ðö€RsF¯)$h“+“ÿŸ2Èî@9YÚf?¯mEë5JWTzNÒ;R²ŒLUy¤W`j?YY‘ZfÙ.Z:â€Y@¾XfŠàU´uõR~ UOLpKÃnFè‰@·”p:Õ»Ö3G Ê,T‚[%þ¯™…å•Hëa ´mޱüÑÜXôr¨ì :äNö-ÜûȤԒøzÍ\ÀÆzzƒÀåÒºì}»µ|oH±ò „­¾övª4(¨¢ðœ¦Ù¥u§Þ¥™­¦’ÌD¨l[ ªf¼­ì±ØS¶<„@»%ÄÁ„}\Çã£2Î*¢xÕˆÜ ÝÏåéûLí½¤«õ]*&þÌIžðì„ÝiØB8Ö&¡;.úB;5:!Æ;1¶ÌARwBGLûLÊnIPÊÆS¼5‰Vë)‹XKYÈY³žj÷C¸©CI ¸éMý7ÝQëDUÄõ‹WŒ9Y"ãZþ˜+Z¢zmY£áWâÈŠU¡„nRét“N0pJt·ÅDo,é>UIz8(›‡1™T!*ù3X"¢Š>x·æÓyd Ø1Ë×N/ø«‡¤ï£6?ç)·ßÖˆ2×þý°Ï)üŸÈJ'Â}¼$,±¶ûý±Õ]®±RΝKQ¨[Á¬¦û‡Û¥Ï ߥUo¸¦qúd¨b âªôÙ(®p3²R#ö¶Š2h¼0:{Â9"ÉILÐL™éׯ!çßÛ¢2èÑû·ðß„bù¯V©î» 4/:%² £#öØe+gAÂ2tÄ©9y @êyÔE'óúJ|WrO3R.Sz:'VØ”TXö²Y';Z/ïYíÍXkFÚVÅ2TîCŽP‰mDL€ÁDGáÜšAÎT;²4ï+-Ÿ3l%o R3îð"\ XÚ©C1íúCè;òÓ’ªé=2Ná­˜:Ù½ƒÑ…è;ÊÂKuÃï?½«·–RŲÀé™®Ý 3«$晨;[Ô¦cµç¥™ÄÕ¥K´Ÿ¦ÿ-C¨x&½ª):®¢1²ƒäë¶åq¼`œÂ#À^ÉÐ&¨Ðâ2fØt ‡à/QõèÍžñ„jú¤Ia„ -OŸIÔ ‰,%—ø,ߪV4 B9;›dŒAá¾BGtLLþÈžPäŸ-TE ñV³láX`;úY>8Z´šYÎÖ"X°ÒÓU‘9³R}ÈN‹,J‡)ºDß}¯>¤? 8$Û0•Ú2)FÖ$!õÄÃÍ%u^vA„þ~s¬õ#tíì=`\ädÜJzԪ̢U…Å)+ ¿31¹±Œ´›š¯²\ô«Ñã©Òì#§ØÍ¦.eÈ¥Êîl¦ˆñ§¹‘SªoIŒ­Õö”±Mƒb¶\ê»^´Â]ŽîÈÅIÐÔ»؉YàªoæèÛÛ«ñzêšú`cŽ`Š_ ?Ç,.™Â#Ô%™å±-d5Öô <Ç`BuH!#MKIQQ8ÑÆT\ÄiWQ2Y ´ZM_%ZêçLY'2”WÖ)U¼#–Q”9_M¢ÿdH|k´B¾òZ"¦åÌg§p8’©ï›¬Âþ{°¥ *µéŸšºÆ±¾À˜Â‡Çç\ãÎV•¿Ö-fßkò¥çÜ„ðálŒù¢¬§(¡ [=wU—u„x%eÜv-‡¯59<ìÖpB*4HŸ>MqÈ„Q™öùTM–W­¼QYqm(Zë0Z!yY[ @WF·€TöçPëJ|L|lKGÚaAþÿÍ:=H¡3£î+hÖÇ#šìC¯!x;a{ âçd§kL÷˜ Iîâ tå:äâܼ†¬ÔпæÌÐԥŌ<ý¾ Sþ¸Qf¹³4<¯'“«hÔǨ—/â¦hE祊)Ú¥ª4»¦¼_ˆ¨îfÖå³+Üð>¬Ó›©Ë ¼9ÄîÌr½uqh·W_+²›tË­_ÀTªçÒ§åRJ¦‘³Â¥xž<¦la·§¢â.ªpœ­M¬ö±µ 1·øt=½àÞ Äƒ@„Ëo—•Ó¡)Ü/3#åý%né÷ÿƒå* òmXÈív.õ?&ÍŸ.= {6ÎÁ½=‡RQD&&$J^‚$Oc‚DSwÁwVšø´X;võYÌ-5Z$TsY‰h±WC‚ôTϵCQc¾©L$3GSuï@ŽIð9ùáI2W–*å\_!°Kñƒ j«„ÒûÞÎEòFàè¥ ¼ßìçôևȣÎo}áÆGÄ¿\ža¹íË˳ù¯í”G«3¯r¨g6¦Ó‹Í¥9¹¦&F§Ã»Š©0Ûͬô¶±£š&¶‚y!¼ åÂíÊ]ÊduÒ¾Ûò!äGÓƒín÷Ì‹Ò Æ{‹Úøz‘7ï°Æåái¡ÜÏ7åÓ¢L«Ëó Ä ½€Âú¶Í®± øL­{ â©{Ky§T„¦4È¥59…¦¯4P¨Æâ"«º0ö®“Ƚ³Y´l¹yìð¿Ä$8ÇÍ+϶"´×^„·àþ ê¹!Âó|ý[fˆÛ ްy¯ïœ#íT,yš‹4Vî$bâ±ÓصãÆÏ0Ê[ÇÙ¯¿AÚ¸ùùô²®–OFªÆÈš§™õ¦­OË¥ÕG®¦jIÀ¨ª›û«|ÅT°¾µÎà$¼ŒtÃW´’Ë«WeÔfÎÝÎò¬çOáñ¬°Dü0mº̸µo£±$9â-R•{6ÕŒ\>%…mEÀ¼“K«M¼PТÓTaÍWðΜY«n=ZEœ«YitéWä!üT•|íP„ÌÊKFE¥Eý‹‘>áf§6t·.¯­½$°ðúö¢Ú—zÓØ ü—¢¦ñ“pçÊêÝŒÏ Ô;ÁIËâ¬'Ã^™Ö»]ipµî- °@Nº«F²Œ¨*&ަšÅ¥¾‚6¦˜|ß§ÌQ»ªlÀ®Há³ù ºGu+Á=Ô'ÉëäÑäÙCÛ‡Õ#å¼.eïQÆÞùT¯tBHèyÛ5 ö"â”Z,­›)5^‘@=l:†D(ûÞJ…:6P íwT·Õ•Wm3„Yè;þ·g6aù¡-X;$K®TXi “³ŠûÔÒ~ð"2æ„?ܸ„ÉÒy<òɺŸØÁQ왺¨ÈO´¤î¯J𪷻ü§!jA¦«pÄ¥;–ˆ¦¶¹Š¨¸#Å«êz+°)í¯µe=¼„Û¾ÃsdÌœ1,ÕQ©ÙÞÑGéò²yó„$þdmÍÆ=+ov-8'Dçx0VL9£,Ý@íÆÆGñ²M‘R˜BV€(ÇXîFZ×ZÖãâX ÁoV»ÜÇRtóøMŸºH_ì*AµìX9¶M¹0aÜi'ewŒ@°CsÙ´]þ¦ô[óªÊÞè_Ò³Þ3ÖÿÔ3ßåËèC‡Ã1#¼f}rµjÅï¯Q«q½_¨¿Ãn¦XÂ¥ô_¦’7A¨³d«A»¯ž@8µ(oÆ»¿ OÃçâ¶ËkßÔ:¦Þ¤Aéèƒ}ódeIþ®d è骜ôzÔ'c«$1ìÑÅ9é•A¢¿zHñXNØÒSÁû²VE›YD(Ze×ùY^lƒXÃëÊUåóØQøD¼L~†Fi…N?„ò-7U¡B.Á¥¬$È;!xáR;Îú&ÞÃï,l@åÛÕ†ƒÑªE“ÈPºnÀ°¤4¹³ÿ²ì£ç­¯Qÿ© V§»õ¥ÃH䥨"§'«©(\v­õu²üØ—¸›Å¿ÚãÇ+ÿÔÐ_ÐxÚþ*©äâ/Cï#OúD=ØÚF]-[…$k$.’‰7Ç.H?šŒF dÊLé¹íQ•(áUɯ–XœZi!Z&§ïXå¾rVëc³RÌÖ¾M¤§Gסƒ@QÑm8sƒ/#læ%ºÆ¹…Q$·äLó\ûµæ|ðÉfÖåñ‘ÛF^ÔÑ'ÆÄÈ*…Àºš4¹¹aï²H¤Í­¶õâ©w ?§Ì¾ë¥*Tï¥Y5I§ÙÚõ©‹!ê­(ö³$m¹CéÐÀ¤&É(‚OÒY'Ü#ŒæZ QñúãRüú÷]n<2’lÄ%ë&0Ã0^¸^9;eAÉÉuHNtN.AJS¥OäV³‡5Y¸F3ZG³ÚY|^+X },UÞæçP†nK±íÓDÆÏ1=ËX¤4 ŽL+ýM!™ÉÍB=õ qƒí áõ@úê-ncà…EÖ=ÇÌo‚ Ä5;¼Æãmµ $Á¯ˆfJ«:[¨yÎB¦fZÆ¥‚g¨¦zÚæ¨ðx¬àáP±c¥\·vþ„¾B@®ÆO…¸ÏÆhÙruáã°d²îÆù8Aø!¹ÿ닽Ž%uXæ.ƒ'ë4ŒŸ¼*„PÊá¡F¥eg,\üôWbðÿ¢®ä*KvÙµðìÎMùBÅ*ؤ¼¹£:µœa&¯Äù„ªCwk§D‚é¥ ¦V¼À§öK«í¯[F9¶Ãiܽ屯­‘ÐKgMÛÿ¼¶æù“òç´þàRÔ y¨ky"É®î,ø%ø6#é@ NñGzÝ’N¦FÌS&¯…WÁ¬YÃÓ7Z8#Y޹sVVß4RcPzL a]Eçÿ<äD…3ÿà)̉òX=Æ1çúí«øíë<âúדÌ|} Ã>£ºb|³ºµº­Ñz©ÞàΦ&ÌÅ¥;éd¦Ã騨hÙˆ¬]“ñ±?Õ˸Z«õÀ‚KÊžÔúÂßÑ…|ë ž÷I•ÝNyò£'¼Èª1‘¥];wüCó7^K!æ_Q =åUý×X™„*Zç5ÕY¬ ÚWÃ@T.ÜOµô~HÌæŒ@Nšh7C>-rÄ;"kÉ–¿ö„ …m@þ3\òÇ׿ƒÚdÚ±Ïw'ÅÅ 3í¼ÃTµ-ίçSkª(³P§ÍdÞ¥…¡¦åH¨¹ýš«ºݨj·éßn¿IªÈšPóÒ<ÑÞ¡¹ÝétŠö2ZxœVÆ/¹Å3&uåö0„ãÓ:OH˜C‘KZ]9Q‹ÓUm…ÓXF˜*ZÞÑY#ÊW>Tò(ÛN$éHc@m¶6 ‹^,}H0!ö_’' ÏÁümOiðTL[ä~ÒØº.ÎsÛ+Äÿs»s4´

×·ÉFÍsÐM !]SÃSW¡§ Yý8Z½GYמ@V% ÄQdZ¶KiZ4D2Íb;5?l1¿¢&¬ ØH&©Rw0  «õmoXéfßsÝN9Ò§—ßÇÐW›¾àsš¶R;°ýÁüªë¤š§VMð¥Cy¦õ“ݧ4l«H㢰1f·v"–¿QÅÉôE‘Ór9øÞö”ë1Z€÷,ã)41®`vÌ×Oc(:S036þ=·°¦EµòL»xÀRwÿóVÃÚvYuªtÍQTKÃÙ(`ºÊDâ²~!ù¬t Ũøà[¦‡ Ì¥wƧ’n:ª 3"¯JÍ·µž~Ö½ uVÇÔÒÞ4¦ÝTÿé²YÒö‹ÐFf _žèû):Ä4È•>€0ÈFýéN.»S·w¯WôhÕY"Zt-’Xûj.U†1P„ 8I3µã@»›67íýb,þŸ¢ d3ìüV7Rú¨K¬ô|F¨ l ¦.祥<›§zP5«AР°À÷Á·*½pÀʸ÷´ÕÁÕáoHžî‚ÈûïÈ ­xòå~"âåB.µ 9‚B±5ÄJ±'UQ5 )V('YÍG?WᇷY4(ZãnX=zôTÂÏlO&ÌH˜s?;˜³4U);‡<‡Qô„ÀI¾#ô¹îÊæ»úÚ¾`Îp¦SÊ"ð¹|—&²ÿ@&¬‹¨ê˜¦>¶¦3¨§ä9¬—F²˜Gºª–ÃIÍtÎΡyÚ£B_çGïÖô%–½´-IZ]ªç)CÇy5%fÖ?zµ»H;øO¸2^U,lÏXI35ZïˆYÞÊVÊÉ R+ÖgK=Ckò9šBÑ-2Å|!òñ_/åÈ€µùûÍnë0’NÞLöÑÆ”®ÆSg¼¼´ëZ´/½­§ ©ùŸa¦LjÑ¥Ÿ?^§ì«ð °¨Ì ¸mQÁð;þ˳Väך<ÀäÕÿ>ò§ß â |8D÷ó (ðSá3®D…>Ç”³GA7OÐàT.X®Ñ*ZÄ©Yë8WvgR~åÏKêOoC ¿w9#$.F&¹!•œ€]ËO}êøºÈ3ëTùÝsý‹Ñx7Æy®@¼3¶ä³ñW­¼lÁ¨ÍO?¦² à¥5¨§?ù‹«ìu±ƒÆ@¹ ¿Â<„µÍeßâÙùúæÛY¯ôŽ©ÿ¬xª¨âymš*Š£O6R½@’R¡Iž.ÇP.µVã_/Y2=Z²Ô$Yv‰êU@þ¢PFKlId|s@‡¡í5´"*U÷E´ãº‡ùÌKæÒó•ñ!æÈÙ?×ëÌÀéÂ&˜¸o½æ° µ«Ò¤d§³sÐ¥ìbl¦Áà5©TŠ®f¢µG[¹½Ú×È?YÇӸÔà!%îÀI,ü‹8 ·–ôŽ$%D*m1Ùý‡<3¾+FñrNZ».Töe5X¾&Z™ÛËYÓŸPW!ôµR@Lê‚C(Ë|9Sàó-æzJ!@Ïž¬Ö¼´·÷ZtËé·hܘäÏ.ÄWN«º1‹|²©^6¬D‘ÿ§n õ¥™§"¦Kñ‰¨²S­ à¹³‘Á<¼MKpƨ(ÒýSÙÞ¬¶sìh1úqçÈÑɰ $9ó‡0 ãÒ;6ʦEoƒÄM‚;ùS9X±kZÇëÐYCŽVWPO²RsÆLÈìmC0E-9¢Ý-‚ï¯ .c2ôñ§s´ö+ °è«N@Û²K¹ÎcxlÃJ%¢¹š±øê‡«À“§ÚA×¥é³^¦Ð6'©öŸ®BÙ(µÿŒ¾EÆ­È–Ò«Ô‰EÅá”B¡ïmîý-3 zA®¬e'ßM±3Yȵ>º(H™ÿÍO¯sU“÷õXR0Y$šVoIšP`*IòFá?Ìqú4æ­»(¦t×íx ª%ÿà ÕðÜæâý°²Õ‡‘É\¹Ð¾ß·µ¨Û‚®³¿`©ý™t¦ 9Ñ¥.Ò|§³k«4™†±4¤¹Íó‘ÃNº Ï¥•ÌÛ£)zéÍÀ÷FY9®ÿnÚp""‚Tù.Ä¥Ÿ:¸ÓÉD4Ms¨SðÖùWž Z­ÕÓYnmNWLŒRƒ¬K)5ÚBoP8èÙR,/m0ní>2DÚu,aô½23æAP®ØØó+ÌÿÀ’hs·¶¤Ç¯Øm/ª®ѦìMÃ¥‰;§éÙ©ªØ~°5x3ƽ&СùÙ‰ "#Ñû¶á2íÈäßö*ÔÑ®CÏÅé…W»Suµ²‡æ$¬jnÓ§ÒêߥÉÞW¦ôÛ9© }q®þ@ݵ~|H¿ yuÊÒ×±×ÑäžèIóÜ|!¬ñÚ#I ¸Jr,y±¥8ýGXCð=Ló­S;¼¹WƒÀZ•“ÜY¬ÕMW¹eR.„CKŸ˜Bìõ%7¦Ã³*­¤ys²:Ðäÿƒ6ñÈ©­âG5Õ`.šÈŒR¥½òñ}´Oþc­™EЍúÚ¦òW¦mƒ¨Ž:[­ä>w´ê¦½>:¨ÈÈ(0ÕÈçâzµkñ·Ï[²®0ß»“?/+d”œ7dŠB¥û§KüA¸R>¨†W÷ýòY¥¹éYÌkW˜ˆRô¡bK˜w*BçÝ 7 ?’*þîÖ:ÓN×s`ÿ^¦tð®%õá°HÔÕ ÏÇ]â¼Âϳ«Dجã¯.¨‡Ê󥲆9¦bNý¨Ÿô-®^¥µU31¿.ƒ‹ÊŒœf×À©cåWA#ô–™4 ‚ÿ w Ó½õ-°Œ0:j/ÑDyÞŠM·& T‹z`XŸþ-ZùyYG IV'ß±PŽªÚH9jú>N©W31dD&‘)ÛƒI ôÔ0úÅ@ëÚ¢âÜ$ÙÏFrxÃÌ;#¹*z˰j ­ª– ÷¦Ù®Â¥7ó§Ùõª¤¹9±Þ#¸¹;•6ijyfÐwâóÝ wìð“û¨^¹ 7ùŠ¡š'Î3•4åö@Ù8ÏIµsQ`þÌV¯Ø´YX²Z|éW9ÈAS%™>L<ùCr°ý7øªQ+Ã\ii¡©È}ÿ)iSðšá]ȼӸƒ!ÇDˆ$¼<³œÕ;¬¢Ƨ‚þÖ¥o~¦&Á¶© Íj¯]¤p·1ŽÁÔ[yÍ0‰ÚÚJePé¬nøRæÈ¦7Ò÷Q,%Ð}2D[>ñuHx{Pœ¼6VÒôxYµ,ZÖ«GX·ãÚSšÊMçCõC¤Oð8XF,¢ÖS ¶X7>‰ëð€â:« ÔFvPÇpr7¼>ç³Ï/¬Þ›¸§ ðÒ¥厦[äå©îÁ¯lÊõ·Ž(GÂÄøfÎqýÛðW¢êA÷êù.®`  ÌuáHÕ&—4»1×?9žI<šQ…çVÜ@ÅY¹¾Z©'§W‡K¹RÀY_K<=ÑAKCT64P?)]Ïò8ÌÚ ŒŸgüÐí WAÞÿ`qÐ^³Ä@M_¹{½Ì°ZÔª[ŠÙ¦è•Å¥&^§«Z—«‰ùR²D€\»WìrÆ‚ñ>Ó@ÚcáÉÉpð€¹úÿ…ï{žp‰9„,‹xH9,³^D\qM‰(;T=iˆXì‡7Z=÷:Yð™U¿ïlOz2äFHi?<>ƒÎ/V!ð!¤( Q—!ôÑËäÀ^`Ö°,3ÉÛg¨½-Ç´y¨Ð¬1Ÿ¨‘_à¥×€p¦<+²©ØŽ¯Ø·'Qš¢¦ÎÔ}ÜEBfëÅ«õú(. pMß5½b(¹R¯59ácA‡"KöW¢Rù§W˜ Zç­¸Y.®³V-]QñÑüHÖR³>Uñƒ2-Ì$ðçõÞ´sBÁ½öžùMç‘tœØZÈËŠn5¿¬ÉFµ‰Ì­\Jw¨Ýóû¥Gž@¦¾\C©&$·íyÁ°ˆÉÍ5§ÛýY¡ê—òJúnÕ BrC"(’K†5SVAk)K™Ú³R ¸WÇZn©Yz0„Vø=¸Pì΀¼+Eß80eDD¦CŒMÀpT6ÔµX{îNùC!E¦úÚ9UÆ,ç6JÖÚƒòþEïb‘µß”[ÑþvÄìÒm¹ðq›°’•Gªÿ¤¦—ýÒ¥¢ò×§»¥¬'´Û=ì½CÍÚÉ5‚×<Êræ²ô4önVHÂqv!%õ€3CNa?‡±¹I)ÌÀQ%ñ7W¿ïY›¨ÓYwáVÁ%2QHÙðHà a>jJÖ1¿—¶#ÖFsgˆ{ßvôsZÁäºèÕÊëcÈŠ5¤¼ñ~³™.á«Î)h§fÄ¥Dè§~ý«¢ë챸A»¨ÙÉÆB ,ÔªþöâȪ´òïíÞ/-×®/6"§’0qàA= HF¸“P²ó…V·ý³Y Zm~sW¯_R£J¯²?™†B3ùJ,%˜êá8ÁáݯõHöÏå'’ÇÖðTɾ±"½id[³äE¬ñrz§˜oÅ¥ý¦S¿«ôCü±#ci»ÔAÇ}¶™Ô¤2‹ãgXoóB߸ømÉTë8#ʇ12E<>þðH_ŽGQZZþVcâY|ÜY€êVÐ}$Q5¹H·%ï=^'1’ò±"\y!S—ï^£òXäÄâ]=ÚÓ÷º`ƤKʺüx±5¥»ªD̦W.Í¥ÉàÆ§êb«¬íO´L‚w¾ÝŸÉÊÊ|âØ2Fè¯èxø»ñäíÁn((Z]6^—9B >4L ®Sr(hX‘‘8Z³TY­ÔöT6N‚‘D|±Î8»U(+Åê"à F#Ÿû€pTë£>¸ÛLOÍ/•ÀH÷µŸ"Э×gg¨qR륣2s¦0ú©,|d°Åz¹âLðĽbÒDl`áBFeñŠ~î9‰]Ú>"ðs¶0Ïδ=T§HuN-Q%ÌþVKèY-%ÐYŸ*¶VšÄ³PxðûGÍ;Ø<®=¨/(Ü G°ó¬Ûv‘¨ôï#Äúß“‚ÑMÂÃoŸx¸ŸR™¯Íds©’;¦†¦2Ìò¨@wÌ®µi·í<Âu±Ïi¾‹Þ-‰î‹Ž%ÿfß¿Ò,ºÔh¨.6A<8WGyBPD:vV„Ø»YÌ*öY§Ø!W¤VQ¼ÆH•ȹ=ã‘0â¿!¨êÄxÀ,Óˆð6Ajà‹_ÑÎìÃ,LJ¸@W–¯§h©¢4¦È¦´©XŒ¯yßÝ·W6(ÃàÎŒÐû™ß"Åïg‡'':ðµ>!¶—%0à?e=!Ë‹Hµº4QØWt$ôYˆ3»YIjV™%P;, GÚÿ‚;%»ê-Ñx¹ƒ9vür°ý9šýìFæñÜêÎ {Á[¶Ø¥Á­ŸIH¨7dߥ3Kœ¦d{ª–ìW±»Ñøº.4Çc.Õ 7¦äC3õŒGø±1Þ„&üð50ä¦ApL[Ï»S¼ˆX±KߺðSdl“?¢©ñ%#}]b2Ÿ'Ã?ŽÌJ¢´SÄHX>I:Z%’ÕXy+%T ×ULè­¯AÀç—4C¸‰%áYÔ Xmò†áÖóÀÑU´Ã’Åç·†CÍ®§Z¼¨Pñ¥]‡¦3zªy^¤±Ïû¢tÈÝý?×¹–ç[¿Úøj¥g ¸2w)Úz+ÓÁã9žS!F%ÂO0eVØÝÌYÍœÔY’°}V™äO²%JF×Ð:8ÿ”+;¾z’ÓU PÊøîTƒçx@'×^%VÈù~Ÿ»ÄN€±N[ªuqw¦¡|û¥ýGí¨„}1¯¬g‹¸œž¡Äj0ýÒ¥ã”üFô®ÚòNŽz¼'“?°6?|CÔâMŸ?>UÆ_YURZ¹EdW îYQà65HijL<‚”.ë3 ô ÖºMûÕúÓé©ê1ÙJë Ê_O÷¼þÁu²=ÙïªRu°¦pFã¥,i¨ZÚŸ®@ðÔ·Z¾×Ãøþ.ÒØQâ"¡˜ó7CcY怰w'…TŒ6ʆCúáêMW‡NUèjYzãZ'Ï?W ¤ QŸ:¸G»¯š;,-’ üàâ© ©¼áùýŠTèD±×¿;žÈe>²»ÿqo±"Ï<ªd¦º ¦l:©yçίu¤Š¹y Æ3ÔÔª{Oå³:ÞölC¿O’1ab¥*:Jo9åÜþEÑŽÓOq”‹V9ÓáY¢´YV¸AòNÈDbóè7ãbÖ(<^&bÄ.á˜ô1î!ã‰ëËÒ­1>Ä„Æ ¸¦°®š¸‹¨ÞlߥŦÈ57«Ð³EMé½$ŒlËf¡ ÛvU#ì3 þzïú=!Dý,1­Ú+?s¹¬Jm\:Sï|X²}=Z"tiX^™S1`mJŠhÑ>Ü€³0OQ£ æðCøªFý=TcëbòPÚ¡¿ÊÀhM½‰R‡²g•Ûª ›¦·Žñ¥ÚC託›`¯¨5¹s„°Åžr£Ô½DXåŸû"÷ 'L Ï«ûež“+T[q:z*÷FB§P‡"WñôZxçcYX” U©nM@3œBÄs5››n%“c?ž<× ð&¥§Þx݆Î[kfÀˆ-Ú´ÍìZ¬6‰B§øýÆ¥Þ+ù§âJíuÓé¶U¥Ãz²ÑüŒ>âZ„ôðÒJUÙ;šF%)ô j8ÃwcEåWŽO‡{VQºåYKÒ¤Y ½U©¢SNƒð¶CžfS6Ì©µ& Õš«fë³'ñ´Å‚ßê 2Ï BáÀ½ß(µX7„¬ô"Q§AÒÅ¥5!ö§ê[É­TG·­HÃ%|Ò%æÂâ] ±ôPv Î}×*Â}A9¶(F–,PY›ãV@ZÀoYŽ]&U<WM¸SBzé4 7™$êû½Ô”ÿ€îF·åÜw¿ÌÉ•¹¾Ý]l³ÆƒP«ß·¾¦›è¥ÇبÈn¯h°h¹­SYÆ.¹ÕàæñXùø¾› ¼ü†þ7:.{Ý=Ò?I'$oR¸_-XX­Ñ{/öùÔFß 1e]úg‡èÚúÎÖiCÇ,3º˜!è¯Wò©"Fõ¥A ¤¦*É«;5³¤7¾?…µÌGM ÝM&áî!vê”â‡9q%­&q5ÃÍ-C7¶N{¢°Uøs«YcÇ×Y©5VüUçNaÜ>DÊÞ¬6áîÅ&Ë|5Ûô»’"ð!4Þø ¶Í£‘]¿•ȳJòv«mÃŦ¿èè¥Euì¨ü»®¯u¾è¹)¿'ÇtÞÖ°BZèãbãú5ó” wzŸoW0Ÿ8ü>ŒàñJ°St»ÙX_1ZüR©W¾ZQu¥ŠG–î£:4+ åâSuvo±ô¶EhâfÑJfÂÏǶðò¬0˜o§9Å¥e ¨!e#®9WÑ·§›¥Ä}cÔ>på ú÷ÁÙ &݃3.ìbA=?E¨I­¡ÝRÜ(yX˜C¿¦|JízSìÌÊX­2Z]™žW—|,Q‚‚"G+Gò9´R/*FfŒ²xдÐòÖ‹dàë^Ïg€À&7u´ŒƒÆ«ÁÙ¦bÖæ¥&äû¨Qáô¯"–…ºßÞ2ÈŸÈdØ€X\êdTý\ÝΖ"ÎèN3 ½Aiý@M»ÙRU{Ë—Y›ÜÛY‚V+ NãxaC£';5Ö3°$q}î9tÿÄînìh^IÚ°|ÔÉ>—Ï»*ܰ80|©LÁ¦cž¦D«3γë·¿…ä˜ÎÀÿ¹ß RVò>:‘¨;qG·8*f±: Å`GoQDÉÏW­=9ZñŒX ÞR‘+lIͤ<ìY-<º‚¦Åždõá,œâs)ÑW×ÁB[µr‰G¬(§(PÛ¥ÿ÷Ш±œÆ¯1?mº¼ FÈ`´³ØÕïê*C*þÂfjÊ#ål“4ý¨ôBRJNkŒ Vq|ÜY}vY›¹'Uã÷ÕL /ü@Ô€#27êú ŸKzåðúÃóÏçÀSËÕ0¹·Å»,U¸¹#B®Ç‚ø§Q»Â¥8&¾§˜‡Ò­‚F»·Î¥Å. Õ{çj¾Iúî¾ Øëx j¸1ª°«@Ã3£L¿°UÑÔ‰Y‹·ÝY_,V*©,NÛ°B'}4¦#ccR#ñü#b¡ézS[×0:úƤJC¹ÉÛ® B¨1†Æ¥Õ®ˆ§†Zt­áúC·ƒ‚Ä/&ÔÐ)­æÁÂýù¡H› ÕQ| ˜®Ò1ý_Ù@¦øÔL„o9UížœYªýËYíÀÀU ­M¸~îA‰Ï3x‚Í!Tí]ÒUûÝ õç¬~µÕ&'uÅú·³§è­YB½§¢:Ã¥L¨<—®Žéü¸†ÅÆ àM׫ɯéHBWýò~üF¾#Õ4w&jCkÏNËûuVÃZsZEYtAHTâdFKl­«>7 /6È@ó ¾‚3öȳêâëÑ‘€]Á–¸¶´íH®«„²²¦ë°¦‡1¬©\F±çø½ *øËÞùXÝ«iðaä=0ÅÑb$*ó2ƒ:bèH:-Rù»SX#ž;Z´ÉWÊRQ¼\F^8Wܾ'i ÀT[ð “íƒ>­Ú€š•ɵX!»+°BͨýÔ¥s_A§Ï­‹÷Ô¶áE:Ä¿~Ôêçªj¼ú—Ö§…È!®~L3ügQBu¥N²k Vì+ðYÜ]YÆ1mTÕî\K¿æ›>|É.“ª! ÒZ#õêq¬áó°Ï*BÀ€™³PRãªBâ]¦"ÓE¦S²›ª ",³x Š¿!«Ïàákö¤ô®ÊÁýŠV2©ƒ.ºÙk>ÅÑ@K“¼cT•\YÜîYgß Va1ëMVìA='©2ûƒà |ût ¢²[ù •嬗Ó˜OÞ»:ªµl¡)¬ÙÚצCù¥Òò›©W×±äu½Žp°Ìë=‚Þ.ò°ñ;ãlö”,0·à<:¨"JZgµScY\¶ Z#ã}Ve›N.óÆB‚ؘ3ôæÑ!4„Vê2 ú†›3æ’‘Ó‘*Ãe Òµš“8¬üñئ“û¥Mv«©då»±µŽÂÝ+ÍG•)ßðËÓò ¡-qé<[“-ß§Î=ëJMCTªXY6 ëY«;ïU®}™M7 RA+§º1ƒ€™ ôÛ sõ€÷QR“ãÏÑQûÀô^‡«ñb¦Î[K¦ ˪T2«³êkuÀõۆБÖãj& ÷©~ ICƒv1Üd#AÛ€MWçUœûêY_9TYÕ*T®J\=P`á,gK8`ñìö{ñBÙÃÝÃÍË$ȇ¼û¾¼°9 © 7×¥Ù2P§áab­3·¿·Ô3ÞÅÑi×ÛINêbƾþÊl(œÃŒ&®Nú7È‚F]àiQiX‡š°\Wœ¨x$Æ¥ 1ä§ŒŽÛ®M½Jº[j’ÉOhÜÛë×%ðý·TˆX!Ç x-];X>Y¶ÌK;ïUüfÀY8ÈwY£BT»ójJ«2xáv“ÝÍ´»a½dz°¡¶º¨A»Å¥G”¨Øx¯!‘‘»Ï§¬ËLÒÓÞ€Õòóe*¹ ’ÛÙ:2i˰B‡ŽKO}LW;Z¥êWô©{P){[D/%=4›Ý!ó €}!öo_ààÏ4pͤô¼RÚe°+_‚¨÷ßÂ¥„©Q¨`v °lQz¼˜¯æÌÒÆYàt¬õ ¡  >GÏ J8 4áû‘³Lõ öUêZr$¾XLöRû,{F?‹Ÿ6Z1v#}Â&êÊù÷ðáFâØ/^ÎYZu½Ëð“°j.ƒ¨B·Â¥Á~¨Ü1ް^±t½‘'m΋Üjâwª>ø&õ{ÑöÆ#«ï6¯iÂF3uNRísÚXVZ³Ž¯UYö%Lá°ö=ÔBÿ+XÉUN«=-Dëjß&ÖÝ Ìâ0 µä– «d}+¦!AѦ¶@ó¬.<3¸¨[àÇq^ÛÖtð¸JßlÆýQâ0‘)BŒéO*\WyãÛ¦1(¦o¡ « @8µþäÄí£Ö…\Îë¼J>OïpSe-DÂ?¾wM êAVR"ZOjXû0QmêDòEV4tò} WB› « ô\¸;ÞWi…Êw*%º#C%® PE§|>ø¥ÛQªtB´‚n—ÂÇÕ Êê`´£dG,¤Ò1>ÛÇ{L üU{ËZ ‹XzmQ /EÓK”4⦠`¨ ®Ôúó– Þ¨iCÊ© Þ¹¤}è­a&§2¦YžªÞᤴë‹vÃ5'Ö-*ë‡Ö1=#±ã=-º?ö€‰MeáœVª†1Zðì X—NOP*uCÓ1N2‡ðOJ¨nþßð@ Ûp"”Ç+ݵ·¥Æv¬Â¯‘¦p½h¦B‡¬é]ÿ¶eѰƨòÚÙ,ìïè"ÓbF6=®1ULC—°PÃçïWji4Zó¯Va˜Mƒ?‘CU-• :TÒŒëLÃê¯VÕ,[©ÂRò³ƒð%ªªUé¥dƒ§\]Ý®ž}»â’ÌŸ¡ẗz÷n¿…$t$85Ý'H <~SwoY±z’Y4çSs?ÆH<€ê8UW%½ðT±çNø›)ÈáDÔ6Í)!ö»m¶%¯ §öáâ¥)Wª8wß³1œ±Â—¼ŒÕÜL5ëÓ?É %0./}V@)HN€×W¾’ì¬/ô˜¦1F¦W©¬ñœ¤¸¾ižÉ'ŠiÞHxõw ÆV$%u¨89þIga^T@ÏY‚ûX"òQè2-E:Ì3IûUŽÿøø&ï@@lØ4œÄ£Ã´1Oªp™â¥\³Ï§¤Øõ¯ôvý„€AÐ ß æ%jÚý k£ÞÌà+™Ê?~…ÎM˜–W鼊+,}*¬³Fýü“åŽx»ÏmÚO½¦ž¯éB£§/ ð¥âö¨ªÜÅvµÎÚ—ÅzMæÙ´ððz  {œs r„†5½ÑFÖSŒÝoYQümYî¥ S¯Ï¿Fc`d5|T6 ׸•t˜ðöÙòÀFÅó‰1µíûyªbkæ¥àͧ¤’°<¾•ÚÐéˆ ç ë ÿ#Ћ U-Iýj@H›áNk'±W(2Z*¼7ViØLg½Y<¯ÝO(sM\õˆ#ùH»háB¬àËT‰ºHj­Ÿ4´¦Òyx¦ÆƒÀ¬•Q¹º ™Ê ‰àAÞÁ÷Q†Ê‹2'Äâs;¿óhKz÷æU{*Z¤1àW¡^2OŒ±¿@”-”žû„áþÊòÁæ‘ÆwÐÐò¥½YG­¯Ùæ–§ñú¥ÁûªE;¶‰úéÆÇžÌÛ‡^óö-Ý $d#RW8Í-IܨT7ðYz€žX$!ËPá%C«Q0  ØÏØž€éè°ÍÒúp¿=Ö°Ój¨±üÙ¥ðjLªp5µ¾zÅrÓ4Ú&Ãñj_ j "¾­Y7oø€H2ÂLTˆ&ÜYÉåÂXrQ4Ø_C­~¨0õ…Pþ×­PˆéÚ¹Ò¾J¿·­°\.ý§‰4ᥑ¦…ªËV‘µ„,5Æ­y/Ûm:óòÙŽ® Qµq#ÓB”8þ0IlîTpOZdà]XðÊPNüÐA%q—._°ÛQsRÿö“ÓæãC7ÐâÀ2½±Ø5¯‘‘Q§85¦.ù¹«m$µ·3q-ɹœÍÞoøöE9Î.]Z' Xô;©@ LlõdVS:Z•=Wïù¥M©,>FJú)±³–ÆÇù‰}náÄ0fˇ¡\¹,岬ø^b¦ÚÃ禵\<®a#Ñ»™ Î 8åçâýŸþ±Oe®-¨T6A¤rÇO}’EXÛFZW¤êT7aOI@O8[ð"¾ôa ~Äeñm„Ù+ü–Äi/7´¡¬©deÅ¥µÔ¨Kœ²[+aÂåmèÖ‚“£î-²Ø* )Æý5^ÄÅGBÎ T ”ÖY=ã¶Xã_¿PÏ…ŠBx0/ÑÍ,Ÿ)HÿSoæ§ŽÏ}Šn¼$µ‹®ð ý¦É2Z¦Þг¬K˜Š¹àãË`Nâ×-ûº¸1kn¨+ÉÁ?é?çNðHíWä!Z´HUj|ÎIê§8ARç"Ü{€ ØEñf_.Ù§ Ä‹ô¿³‰][© *Â¥øXB©…”³Z°íû‡Ùñ_0ñ޽… —vï":| 8–XãIË[U’§!ZñçÑWDQšNQZ0?À)Ë*/|Ôg¸ùã3éàŽÊ äi¸Yìð«›ö¦lÑo§n…ǯOm‚¾yzrÒ,ìê·U[h÷Q|13(ìÂEŸºòR¾:‘Y¯¸YïÐ…QüzCÖâ00ÂÐS”ÿb?]æVs/Ïܧå»Ku ®¶=¿¦à«—¦Â›­îÛ;»rdÎ# Šå`“Õþx´6?/`ÍC3ŠRQ,—YΘYwºüRva¸EŸfØ2†`ᕨ\ƒ7éƒV˜Ñ¦¶½>Û)¯E`%§7§M¦ö©¹¬©Sã¹§;¿Ì­Ããgý…§úæI.ó°2BæŸÆPkªÔX_¶YHÒSSCn2F1Ÿ]3ç4]+Y ^Áxé)·Ñ ¹½÷߯Ö/§œÆW¦Á·è¬òCDºþ†Wͧ§‘ä`€þ.Œ¶˜[U/"ÌCÌmkQËøYu(‚Y­ÔšR)òDœ £1Ÿ[Afóµ‹óçQ°„ÏØïé»ïç­Û¤¦à¿¦°±5®Àœm¼;<ФÍÿçM—ÃUÌI%2k6²ESWç«Yõ´ÙX9µP£<äAϧ¡-gY•ÃŽ¾ûÜ=âšO3Ë¥¶†¸·ÚȫȻ¦üħ&„Ù° 1ˆÀ‹®ƒÕ> î=±fd!ää7›¥ÆI¼Œ‡U‚¹/Z„aUWj–6M”¥OÛÖNP¿X‰¾ÿYM!RT¶G˜Á4>p‚¨fÃ<»°é%}ÑÄ5½Í)’®Í…Ò¦ÞôŸ¦·×®²[¼ÅuÐQÝšèqUÅÏQŸM54™ G³* T;ãòYCÊ9XðàO—:?ÎÑ)ð>öXÕ§öPÄ!Ýc²’Æ¢Hç´7ˤ©qSÂ¥Ž)™©ubÕ´` †ÆU $ÝÿýÇökM&w*þ)ÍJ?C-O#QX—€æYOáËSÍÂFÙ+3ø¤n[Tÿàç`ÐÏÀ•»]P'­ ÑU¦Öý?§ÁñÖ¯p[¿þ“|Ô>SaíÉñë¸!VŒ8W‰J‹)V±¼p<(ôòÙè(ôjT}ÚÚ±Ć<ô²ŒÂ‘¨†CÜ¥xt«’žÇ··ÚÊ„œâFüü9g›œ_0p[TD¯ ™RzãŸY5ÅXÔàPvaa@žù*½Ä³ûöɃûÜÄÆ# F´}š.©…NÈ¥ZdªüÈš¶ÈNZÉ<8÷à?k\û´7* {è.xÔ‚CJ=%Rða€Y„‹ìXG+rPá×Ñ@T“j+(Ó$,=÷îÝÊ×ƪ7´°ö©c÷Ê¥õ‹ª~gõ¶ºgîɽÄáÅlUü÷Ö"ímÜ/àŒUD_o³RE”®YÚá¡X á¤O¦?Öü©)›MIbõBñÚ-2ÄGLÔ²¨ok¨Ñ­é¥yžŒ«¾ýÒ¸N½ÌïîñäŒÑÿs_žþ2 „ÌFÝ’7T}ñ ZÀ©¼W›`Mîj<<™ ƒ%Ka ¾Ü3ðNŠrÖÔÊuÀd>°ÅH§ÉRf¦˜]±­y¼ á{Ѵ͸ê"áï!ù‰ ËÅ!8V§J C_V‰ð2»6ÑÈþV/(Ûè4ÐÏ̲-»(DÛ¬× *¦U±¼§im±kà^Â*RýØY™=ó Øž$¼•(—Û>(k\O &–XoÞªYõíR±©ºCXµ.ÿ*_@Ð úDßàÇUÐó´âsZ©V=È¥|O–ªïR·2ŠÔÊqrHã²oþ\µÍÝ‚2X5ªF§FTŸZg†WÏn×Lí;A¤®#é d‚íGøµÓuQ¾œ°ƒ®'¶š¦î–§‘›Ù¯aT)À÷NvÖõ®ðvW ¾¿&ßõ‹=2œNHSX‰ÈYJíÓR’_DRÌý. Æt[RãùPyãÞÇnýÆJJu´üÔ ©…Ó¥ÁØ «Äu¸‹ÿÌ)=åv¿„•aç5S«H/yU`?:Zž®sVÆ#‚J<7 Š=¡K³á_èØúÎ^‡:º»V¬µ÷¥“lf¨,¹/³¬LPÅ"r Ýž%øCÂì¡OÃ-€IC¾«gRÃl²Y ³pX”‰ÁN%^Œ=¦-u&Qó­ õÅï ÐhÕ2r¿š ¯¢ï¸¦¯ºü¦Eί?+[À®×à1°ñ½¬ _-G(ï ?ë‘ÇOþYÜXL–gY’lZQùÞwAÐüD+5är­Þô}+êÙ ÂøÙD±!Ë…§fqZ¦ÓìÞ­"ª_½¾JXÓ_'¯íŽ{È `›Ø$ë<^<€ÂN´]2Xî‹ËY³©®RÏ2‹CÄ Õ-0ï¨yÝŽ÷—EÜe¶sÄØ*p²RWü§É9#¦îç­z#¼{ŒÚÑŽE삤RñÀ #¨‰u;ÐÆM¨\üW„>àYÑ÷R¤ðC<ã=.¿7Ö—É÷Ñ^Ü´ËpÄQì]² Ñí§Þ.,¦PàF­޼N£ÒÐöì£)T 7ð¯$Hi<§ 7Nß‹OX@¶Y_œARޝ­BИ,JéäÿˆõÑ/ÚÇ¥“Â,æ ±t¥^§â~¦jý†® ­¾­4ZÕÛ)Hð‡QÐ µy(/œ*?Î0PI1 YÂ+Y£FgP2?¡?©&€(±ÛR 7 ÍðZ ÊÕs]ü¾´î¯®*߆¦EóW§)±î&¶Â.:‡ÚQÏ$öF¹é8W-¾rCÁžÍR¹JÞYžYëWF$M¼›:›+"ðHmSÀéÌøsÏ® ºî0°«n³Ù¥þ2#©è²7µãÈ[)'âO[wþ‘ïÙ|•4]ïH¹šíU©ZúP;ˆF@P´ü(„½ '*8S ³6îÉñÒüº]¼"â׬»Ñ¦gÞ•¨heQ´;ˆýÇËá¥ÎOþ Š)±+5æI¡oVs×0Z¢=T†ï÷Eâ 0²'»tû÷Ò…¥Û-ŠÃ/@ÿ° 0§}¨¿¦``¹¯«Ø1ÁDMÙºP‰õú˜ÎWo .*.zDUk°SsBZ5*ýVòѳJpL‚6Të‹úŸ‹ÿ@ê•âœ]ºÈgn»´óý·¨pËü¥,ÓÓ¬ʼn¼M£oÓ·ï ‘ ¿ ™(-Z@MàEQÇû‘Y½VX¾„´MˆÐÈ:ù–!ÖëËo6{ç‹ìÅÌÖª‰·÷| ª¨ñÆ¥·‘-«¯ø°¹äÃÏ´ 뼞“ÞÔ%µ×§=£~ O‰dY¢‡øX‰ˆQOå¸$=;…b$-æ³×9-êEþÎ.¹[ðÒª_·Â¥mçuªÊj¸J¬$Î@¨%og{øé:Ç*Íoq*·aȉ©È¸à¥r}›¬Ù¿ù¼C4ÕûW/òѯ⎒Œ-Cn÷DZŠvTã8Z ª•UŽGù¥Q0´?ú¼%Qõðƒà×׿a έ¹ô¦¥xɨäN¦µ-R.ËVÞæðN„ÓTu#l<=~=ðO°ZY¸jeX…7&Mí ë8H\ Ñ·§ÿZ€KáºÆ6$o²Ðm§Àp˦°ñÁÂÃ2‚úÝÁû8ü&õãðHS6œ¥mKF/¶W:û¹Yæô9Qª0?³Êº%œÒ9²ûèRºÖÌïá¶¶ð\8© ?÷¥TX­CÔ¾T½i×J$õ<‹-¡[¾0ÂŒGo ðUœ.Z¡ÈS \xCC,+o¿ |1¯îVK¨Ñ€ ºµ9⪤ÝÃ¥@`«Ì©»W“Ó}RðÝ^xfÚ´,¿hªD‡kwTÞ£;Z¿dî¶Ie”¨½§y¦Âï°t·Æâ)ä”»¯g&ïǺAr?ÛS‚x=Zo÷S#çAÊ’&?Í)J4ä3ÁÆ<ýç°¹™t¦ƒå¦¨#31·ó Ðñ±ïáí­w1±É‹I9O§W–aY5ž{NG¾y8.w]±ø€ ñ× Iݼ‹^O«Â8Ë¥—/­<À܆sÜ_ÄÃý!bZ€t<ðïõPÔõöYlW,V£ŒFö¨ ,p0² ±=¨é{{ÌÊΈ³ÔD4§÷Ú–§o¦´¨‡ÌHïÍë®$.ÑÉ GÕÓåV¥+·YÙ¯O„¼5:ý¯_™Åqú0ZMÙÅP·½ñ"««¾ŒÆ¥«Læ¬X¼ÀÈGkܦêøýNÿÐÂ…ûË R!Ô¿Vÿd)qÝU`œÀ%æ­vZÇ¥GõÀ«gR*¾…úJÚÅüüî~LSï <Ý|þP•Z†qÇUàãD·'Ò)iovéæ RÇzÞþ°ÆB`¦ç[ ©~£¸²JÖÒØkÄóy‰©àß5L8M…™$Y¾HÕW¢©}I Ò50ºþÁR¯ïì®bóÌ Ž´ñ´k§‹¨€§­Ô´QeÍpÚ‘íGÊz)Ù0 öIØ XP`ùXÌI›LMTÅ4™Ï; òËEDÑ+0m·Äx{¨+²¦Š¢Y²¬#¶É¤bCé,ÕE A\-(þ™G†—W¾„Y¨¼uN³¤7sÓJh¾Tõ„ÙùÓÆó@¹ÄÇ;©3gV¦û ±¶£¶Çg_ôæ›þ èn+$ RFé”Vmä»Y hJOµ.Ð8¶è³3#¬ö¬ Õ€ò¹IQ©÷b?¦.º®°—à=ÇYFzæÖ5¦ ¶êI+í&HFQdšVI ¶Y¯$O÷Nx8\ *âLýõð—VÔ›I\¹Ÿ 6©±P`¦ÎqP±®[ȹ ùçsæM Ž_Ï,3rGîY$WÿcuYü; Nãè™6²-½ÒcóªNõÑR<œ·fép¨¥Ê¦Ýkô²è ˉþ\ëôÙÙA–ø/ê”·IšX~ÖXyØKÖ°3νnZãîb+ü; ×´:`§~ ³§YÐǵœçpÏáÞ¯ðmYÆ“Â4¥òL»2Y_ÄŒWáFH4¶-^ yjè^ÅÈlí>±S¦{;r©: (ºŒcÔÕª‹'ø¹†³ ¤Ò:GœÂPÐý ZÇ»fw¬Ê-_À¤XUÞá§Ža¨$¸ÊÔA6aªTî#Z9óeQìÖÈ;z·Êù”-‰ÖÃ]‹º‰Ç©5‹M¦_TL±ëÒÐÈnR!éV _Ïç.UvDIRÊX¸ÈËX¿ûuKq¯2qŸÅ 1¾ì!óÆËZÛ ³my¦*¦¨ÁƇ¸–ÐÚÓ„Iö/B?ƒÁï9ÖßgPõ‹Zö^AUæãÔBùɱ%±ãé©ãÞ£k•À¢¹u¬œÌÅ¥ó,œ­h‡¼Â)ï¾áP”«(p›(<ÒûDâ‹LV„&¸Y£³NÈú6jb¿¹'ò!»'Ðràµëv—§‹oŸ§$sþµw`Ð`Q„òÜ%Ù6žc7—ûNÏËYé¼ Vg[DÇ™Œ'°ºN©ÓXàE‡ÁȻެW’Ã¥½Ö_­!~‘©áQ+Ôßÿ(XkEUÆVÓ–Y }þMªÈ¥5D†›9ð}&!ΈÈd´Mñ §é¹P¨àý·¢çƒÓFŸ_öi×4‡Ð:˜*!QTE&ZŸß[T#…³@»c"X fþ§À¨Ú>v½=¶‚ªË¦§ö‚°$ÈV½úè© © =0•÷oJÑ—X¸çXÊŸ IÀÿá-ˆ² ×.yæ7·Æ›·C¯@Æâ¥0e~«80¿°š¯ÝñÓ¹Ñ%C[Cï»UˆQØYæ{Oî`ÿ6]ÏAžöð¼1žÎkÙ‚´co§¡p¨sÕ‡¸S žÔåãÿ÷oŒ¾wH–<JJR{wæÄýNåQ–Ä vð .kUyIi:bXO3XJLòH’z4-W_· Á¼‹ä¢ÝÄRëÝ­ÆpÃ¥³­,­ý ÖÂ" ãm{>¶ýî+˜{HPÀéW¼eXÉþJj2Æ.ìÿg ¨— æÉ+Åhm®·IÉ¥#}¾¬{Ä"ÂC_>âÄIÐý|+v»ÝGèXÚWw¤X“\J6б.#³0 1¢ºåcÓÐÄÛ-®B1Å¥èr­>ÕÂc%Eã…”¾(iœ,Q¢¶HÇ1X“ÐPX+ÛIu¤ -†’+ à ¬ã•ÑÃP—1­¦RÄ¥ä'® ÀæÄ^¹ æ¼ ¨èH/¡–J±P×XÈôˆWŠâàFæåÅ))&R»ûéßµ$À.c™«ö‹î¥*P$°xÈH^šê}dfˆ3X@aM»ãžYƒÐ V/MC÷+¦$<ÿAGoÚa¼?œ©xp‰¦äY³ÇÉÍ„Ÿ*ñ7{5(é 9ÚXÃPð'-Zô¯”SÿG#>]ž¢“³Ø÷À£~Ó0„·{¡§Ò²ø§³ ¸J‡ÿÔ«ªùÒçv3?bVTPÛZ}µOZò78¤š¡~iîR\ËaN¼±Òó(¦t̸ª”^¢¾µäOÞ•Õ)U§F¾WƒÍ»XåtôIÚ-+| à#cãùÅp°“˜¬sZÒ¥Ï%[¯-š Tñ³ZêÀ»OìØ6' ð.bbíÏ@6Ê iܰºYû¥‰•«fšªÀMÅ^ágª¹Ç¢,bÅMI•ê—X¤ç§W ©F…±(ãÄ>‹¬/ÝzÏ‚½0¯ª,o¦ *S³u¨ZÎÇ –ò&í;õ]1;+wJRò7ÔóÑ#êì°oÉÄÂ*°¥ªÝ¥,f{¬c_ÌÂE äò£ ³k0ö L9£vYxZVá‚Bx‡n"ùkÝû[±ÖÆÎ$¸È³Æ§Š¨4½ø¸ Q×9eýgå#(˜Cs3’V:3YœúJ™‘.ÿ[T %$OâúþæÀù†u«è5¦ cıù[ÌSnÌð§?%¦Ò:YQUR“n:Z0÷PñM8q çb.ƒíWŸÉø°<ëÖ¥ÏÈѬ±FµÃà˜,æ­’ ¨ÍK2’[qMÌÍY•zÿTõÏì?” ™e™d÷ʼnÒÑÆµÆ$Ŧ‰—©ý½:µjÝŒrzt¡*¦KˆH£JˆX²Ë~W Eé@S&ȵ ÿJ“ûØ©Yܹ³6I¨4¬¬§v',¸ 3—Ö\ýª‰ $4DP}ãVÓïX íÄITlK,¥¿7ŠìêÞaоa{õ©ð ¦àM´´£Jwч9S÷ ¶âØY@V™MUk{«Y•¤L –ˆ0‹ f²Uãk0<Á9®h«û› ¦Dtw²ˆ/ηßbóÉX9<ê§=ˆû T5ÉþY¶rNNòÐA3¬!P88敼ZÃøj¬ãëì¥@3±plÌC6ñP<ñ<Á2RS:5ZlÉ$Oõû4“”dùç'DćØÕ¬;Ôߥ}Ȱ@ákËLè‚ðl¿´Êoí;|„AS%ÔZp/Oµea4êj=[<çÓÃÆZ¬É륡?±ƒ5MÌ7 ´ñÞAù03û<¸é×SAÄZ–7N3ÃÍ2íŸ8 Mqüäw¤" j¬«fȦ9Ñ•²SœÎw—ô{ÀÚ;D@?@/ÿT< ´Y HhLO#Â/A>~ XDNá®|G¿kJª…à“¦&®í´ïiqÒ{4ùEM!*†žB½ÊŠV$‡Y«fIq!+ƒÎšÜ¿j»Îh£¨ëx”§# }¸Ýçî×Íüÿ©’7'Y–áFu4X:<žW—È=E‚BÅ$$sÏü¥mzÕzͶ2ˆ §Y¦r©A н[d;ßR§a=n.o•ºKI'šY ÿ+UŠKW?ú‰z°áó+Õ¯ÍK…ͱ7yó¥Ùš¬eÄ?yès‹eÀ÷©6 »PÝS=ZYé4Qièy7TßORì]é‰Å[}ê¬^>è¥û‡±_y_Íb»ó¯¨š¢w?6QUH„Y¤c7K¡ôX-*_`Þ‡Ý+¼¼øɨmö§4 ½¸3˽ØbÀôîì(`¡VHnÅXêu¿Vi±B‘ʼ ±Bô÷ÂÔЬ·ˆ³ÿÔ2¦õ”¡«®†¸ÂÓ¯¥æêgÈ5”•dP=Zó5Qi007f—Œ†Lè`ÓôÃá]6¬ O¦¹NÕ²ˆÕÙÏ(Ì÷èM Ôz[B˜;«Vh¤ÆX#P4Hª©l(û¢J}ÂמÙâ·¤B<§SY©¢ÿ̽z;Ià·Ü %ðœ0A|MD3ýYÆåxSEJF;À„_vöì½ÜpÇè­tÓ¥Nê° ÜÌaö¶óÙÎ-†¿Z@ö.æUi^,Y}9zI’Ž *æÅ_\ Ùq–¸Ìük§µ}$©AІ½9àM.˜ H—è0GÓMè)ZökSùë5:ÒCÿ¹#ëEcÛű&í¬DKý¥J‰K²bÑtϰº÷ „ ”‡òB+m WîÁnX‹qºF±&â%9:±ü MlÔ3ØBµÓ ›¦Â۪؆-æ§Wu“'l6îqQeøYo¸þOA¦¤3(Ù2 1¯°âÅâÇ¿[ €©¤•k§ÅW"· àpØisawav_1_32_8000_le.wav000066400000000000000000000176201225012771600350650ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFF|WAVEfmt (þÿ@}  €ª8›qfactÐdata@{Å]*þ­ HG)”öž:~`I®Sèê^YÏ!ÃYdébU*êÂK æ >aj,ô¤fî—²#ãøìðÙ(ØDgÍÅ_TÃ¶Õ ,¬½‰¦bƒ[¦r ™«þ ¶$tÅp«×SæìÔJ@ üÌ )-0Ã>ï'™LõíUˆ± Z¤ñÁXÒRŨKFTã-6gX¸"h Ï›öà }àlmnÌa£’»ñ|¯˜ §Ÿˆß¥Ó6í©þÖ³€—0«]áÔUÜyêupPnÞa-¿,vã>ýú Mãu_VhB)Zhë.X4?{PôªŽCÐ^-2 \|WÓÉbsšïQqÙÃ~ÐÅ'¦ ¶h¨7«Ä𦠧X¾2®Aó麅pÌQ%áóóáøa&PÞ”n&1:ÏdàI«½TFÌÞYˆêXÊ•ÝQݨ0EÎu²3L—Koûpï °Ø–«Ä©ÉδÀiHªƒÃÝ¥wíð§÷Xa°>»£¾Ž¡°Ñ î4èŸCoUÜ/³›2.¨¼A¯Ù=OFDÚW«-,Z«ÉV!Ú–KÚ?§;Ú¼P'B šˆ÷D—ßÙʈl¸kü-¬ºê=¦@§¾®Â®Ò¨¼Ž|ÆÏõ›«æxÿ.Ô¦.B¥ÙAýœP¹gXCèüYG«½Tü3ûHŽ0™74Þ!ù(x [XDðÆÑ>Ø“þJÃ+l³¬Õø¨&Å¥HΩË0É´Û”æÅ©–ÀÛ  «ôƒõ4O}Q&–‡;d¼ Lè7˜Vã{:0&N©{ Ûø¬ëëÓÐgÍŸ¹ªp÷ªþüÃ¥ ¤ªV (¹ÏծϨ>Î늀 õ+Ã&ñÃS?†/ëP2¼ŽYäw3XcTïL‚Êö8ˆ{ÁÁyçV⑌Ç[6³9LÁ§W•¦Z{ׯg_”Âò¢ÜŸìúÐjŸoÜ4g«SJM¼.W3}ðY^Y%R_б@7çˆ'$ì£ Ö;ƒêËæÍ¦@·€ˆ[©Ÿ÷¥n-­Æ®M¿ôZ ÙS³÷5FïJ`3Ei«IðWQ3ìY6¥ÈQ]’›?Q4‡%óÀ1çkhjÊCo´œô§‹¡›¦÷•©°—2ãÄ«0ÉàIΰÆ ø&u;s:mO,adY ¼ X8ìpKÄø&5þ„õQi›÷¯fCØX ¾cPk¬™òÈ¥Ô«ù²»ÞÇvÕMÙ õÓ<º¹ãb3hõpJº»W­Y|Y˜ZO ¾Ÿ:²^üsÌ@ý§zÏÜi>Ááß­¯×å¥þNª‰·œº­•Ô)ÿµôòüW74©ubKå´AX^ YG…‚M¨=37NË"S*{÷;§óÖ}‹&¼œÓðª$+Ô¥ÊE¨­•&[ÁÈ}3ÞUÔíÿimìŠ{ëË.Ÿ³I§rí¨}ܶЫÑZ~£òèiÚÐÞ5Tñ‹M£þRY:O[Wj>ÐGØ\ ->ò) vsç/Ö‡Çyȃ°ìp!¦¿î"ªü»LâØX/üÌ?¹`×">ŸëÉR¶5;ZÌ@k Öª'üTkÀØI²»Gíß©ûE¦‘q¥±»" ÊÅOÈëC8¨èóq2!Œ L]ŒYÓÝfWGA+Ú*^€Nuñuâ²å‰Âz¨­â¥ƃ®=º}Ä«^iåžÆß 9.ëý„IÖ}iXèY"XSKHÎt,wx¤&íâÍahÂ|n»¬ÌñÊ¥c¤ú®8”°Æ˜bÙèæöÿuä*20”L×AqYˆfVø®ÝCçr%ÀÉ„ÿeöÙ 'C»w)©×è¦ò96µá.qÑïŽtö4Úìë\ŘÅp¬` ¦Öû³ZìÿÒŒDüft&œ¶@G]%ºX“Œ[VÈÿ“@ýy%ï·AñꪟÉí`®ÉkØ¥†¬)²הЊi ú),¬$Å'ÂF]‚³XôR3VPt·?ÃÄV·î”ËÇÖlĬÞà,¦eú´HnÍÕƒàÃû.+ökKçåáYBKúRB78˜<åyL¤ãç-¾M‡§¨àr|¨æ°Í½h•ãq8~›8(éTS h»Y·oJ ….(Œ5ülÑ"òš±XsÄ¥*“¯°ÖéÂÏÿ+ûê[x'Ì1ÏI{n¾Y-jSÔ}I7è¶` Ä•øßj°º÷:§,¤Äªž„Ä ÛðíláÝà`[BkÓÝWr˜V»É>Ñnxá*èë"À*)Õ¨q²Ñ¨r#ÀæNÀè6åa«^”?hC WïãOWðB5@â_ÃÊ Îè| ÀÅÛ§¨ ¨.©ª!™ÁwãdëÓЧõXjB;.X–ÓÅUmн;!H¢QáÈĺÓ5ئd I¬æ—sÉL;ö¡O€%¨`Jß3ZáuˆP”ì50ÛÞ ÷x<Óë[*±èâÓ¥ûp›´6ætÙ-á} b#v6~üÒSèY5&VDW«¬ÔyÍêD~À -¨B^\ª¾àƾµUó««$E%ùI`Zó¸bOØöì,ˆÇÛü;â©Í T­Ýž¤¦¦3üºi˜ªä͵ƒfA ÉmXÄyTsž6Ü£×Å;ŽÖx ²gÍÕ¥K`䵫›gÝñ“ÊÓÄé<ß¼ WóÜV¼Ôû9½†w ¹²8ÙQá:³òÉ¥jŽXµ~‹?ÍõÊÂó_ð¥hìíºù¢VöÊä63¼Y-î'JÚãnƒŒÏ,ù@¨'W²€q蘗¿+éFVý WPkâ™GîØÕÿ'«ó4ö­(¼àöLw$ÍÌS±ÿ4S ‘¤"šñ݉<ì¬P¬B)ÜÜˉô!ìSpЏS¢rH#¢¼óÝØG«¬•Ҭ谺ÞaäZ$ ATgT*RµõÙG'‹ª“%©¯¶·å­Ÿ+3ŸþVÃöÊMKo2€›Ïz ‡§×¶z°`òÈÀ7{²­Y¶´"E2—£HŽÂÀ¥ ݨÁåãÛz•ÎD]‘®YEû=6 !oð¢Lj´Ãik¨ØŒÔX:pšRl[dS‘CQ¢/þÖ©}³VBãï¼ê›6"_ÕYbÊBħ.½Ì"1¦E¬ÊPú| –æM»"ÿUó¨ %e†rÛG€ªêåS²‘ïé,ø67ÚûY^@;Ù€ûàÎ\¹ØJ4§)®àÑþ†ÍõRC:VQ££êR òÍ2¡r¦‰%½^rr©ÚE¤áX[r.¶Éã:L'¬J×R°(©ûìaôï6–Z„ƒ¼=Šæsõš´c–©‹ÆÜÿ(-)±x÷WnÊGÓ4λ ý¼KŠº¦á—±Ñzr€…ÞT¶—M@Í| ®ÐcÃ%¿á¥µ05ËwpÀCÜ…R0çRPs¦i¢àªÆ Â¥s¶ÍÈ š–nÖQ²§ÄPß’¶û1bÆ›SÇ¥f+.ÊMÉÔãtS/sOŸR¯„¦L ‘Ïà¤{5ÐUÎcJö1,8«§»ï¯§:ÁuÙ'Ù)ŒÛXÚ¥GBâc*÷óMü²¦@'¬I†˜è°I¤7U]5ZÍ©4:*ªäª¤ª¼áõֺdýJv÷F(0W®O .ÏªÃæ¥œFòÆ#$ëàT¬ÌèK«‹è³¿¹aI ©h•:áÉë3É4Z'í5j:ä2`Ý©5Cq¸šüì*_ãKF‰¡SžŒ;€hxÃÿý|¦ÞÁ¬Ö we*ü—Y9Æ;Ð/ê9­o«X„[¶Íà ©qK¿žmSôö_âäÁ[…1§µMÜK”½0X$6Zj†Ô3‹œ@ß¶¯Í§±Ç€¿&<t³ZSõpÄJ­]ÉþÍÇʳ۶ô­/oó_¿Cž…èVæeÔí°Æ[Š{¦ N¦ÙtÕ30:Z>þ0K<8Ú/„¦y(‹Æ9¹w) WáìØ@ŠTíÛ «!w¹EÉï ¬NìQb9BKÁ9ý—¾t±Ûü>±.Âåü·uKPÇ|Qj… ®&¯·#+’¬5·ÖòòÝE„ÞT6‹TØh¼Œ¦4ª ¢ÐìÝWBM§YV°ñDz¾}8g©˜<Ôê5egA´ŒV©t>¾FÊ©7Í샊=CˆUkº²»sk«ò­Ðò(ˆG-ÂãRÿø Æ©·µ”Da¯\Ðúü^‹§M0t M|†ÂüR.¯§x¶J×Z ‹s5TUuDìRnìïåû¨Ÿ<»kÄW*YÑ¢ä5«íçØ(ªÉ¥aÔ—šÀ1‹Ï¼Y‘?ß Î=ĨôÌ“ì§L¼EFî°Rwo2ËÒ±­Ç¾´Ú¶ 4ÅUÁT Aãä \Ȧ°É‹Ì¦«÷+#ZÁLa#¥¿Ä«÷¨@nÞïúüH„OzO~BÈûO½º¬0Ò½¿©4_ÃCYB±2’Ï#ÑdP¦£ šãk{ÍAæT°S¿ëbµÍ¯ø5¹q"ȺX]î”3·¢šÑ1Çh¦µ3«åÛé+D˜¼Q qþÔ–¬¯"¿q†³ô^ZÞH(Á:ÇÅ?¸©ð—ö×NìUGhµôè‘ ¦©ŒÒéôÿ5°¤‰WB:t “¦š²àæÂ·‚¸ÄÚÅlY®ý,ÅåZÈAØY©#_S÷Ût'Pµ‰IDÈódâٳХÑ<ÛÛ&Ù?pR­R;Vü%膪NmÆq#Y,™‘AYÒy`Öl´dT·½°~«îYåg&­}·ÀÊ£Õ­ *èÐ8ÚV«eÓ4Io-Íÿ©¨K(øcÇýQD?WÛ>Øud¦\ÈìgoîLgåEÆíëàzÃÄ¥µïäè&ÄHç½þIõÝÁæÈ Ð¥èÒbà(bHÇg„³ZI%s4Vy@*ð«ä¥ðʨúæ»ÑX›7’!­êfÓÿLIóA°<´ Ä(tĶlÛí,Iƒ|RËcÙã2´õ§Ý¾c …T5Z¨\´ƒ!Ѧó2Šê-7kUÈ×v$mò°ò‘¤ÎµÜ[G´Í<Õ+'ÂÞù¹&¿®3{´‘Mb×^rð¬¡wÁìNýVBkíDõǦu¢1Í!;Z‡r`O ¦Ð»ôÜÈçXâÁxw©°»Jä›°T:{Ï" /®cØ)×îÁO¹W.Ú·´w/Í€Ø4I0 Ë6Œß§¹©jÆ øDº"¡<±?/¾­sÁsË@@/è2@®l*ÁfSì¾3´8>w>²A8Â3Tb¾Â">¹ôOAj¨PÁ–®¸¿2äÿ?Ÿþ>ñ׃¾ñšÃœCq{™: $º‹¨¨Èy©Hrí±37'”´H øÐèEN4ÐÕ)œ—® *mܽYTSª¹ZAO©ÇFAë)”ÄX (1 Φ,ˆ€ý€4GZ¨¬Vø·6Ʀ“y©e)W5âd­)ôO)-O,MLr¡ËG‹Èº'û?Òn;bö}·Ï §Ðú˜PH7œ!íã ©Õ*îDDÊYr1P&¦Fæ«M¢VébÃݫǩ°±£/3ãþiDj7è½å"‘ʳmNT#qb©_>¢ñ¡¬>ZVåø|!ê§òÉ›&c=PPšWÌä•ȽˆÑEfý /D€(­«èò‰±Y1;ýwBM§7¦•²õÌOâ…ëÉÖÝLÁ²jJ¦x'Ka©@a®õK”-Z¨VÿëþÕ¬fï0JûB(ŸÉ·‡¿ì×-ØVJ¦b@8¦jªp=#ÐáÄ-$¼‹¨ý ²(tsUê§‘Ë¥9ýÈ邃T/ ¤‡]¨D.Ù>à;Á…­n*Sö¸IpXRÝhÓ¼ÁeÃcÝR#áâ¿¥¨v >/Ê3·9:豫±ñ?ýT".VL‡*ÊRv°Ís.wWѾÂ÷ÖPR®”sâ?a¿&ˆ¦f}_öG÷H—Ÿ´ˆakì‡v[Y³êÓîïŒÆ«8»UV@0ûÿP®$HAŒú¾!>êÐ¥†ð!†´@¿>­nþW@íS2ôåÀ¥r5ݲpLZ³%Üx”1ÂXïT#Ú;ú¯½ë¯œ eFÝ.&‡vü¦UAÞ1bù 04Y™¦¯~ƒsMC³v$­áyÝ}{PÚj¬¸Q!åìÆªÝWŽ?%Ç÷áÙ×uGZï¹ÛÖVHPÊüåXù ~æ&I<¾ÛÝT?¯õtt_µÆÊMOBãã‡)7¯Z&I€9´ $™4«¨´*CôÑi‚§Ä¨…`à=ÞL Ê­d§Âü³9&ã« í¼³¦[Òõ6pvD#“ëk¦¨}Ñ5Z²ö#*\j¦sJ6»Ë"TQ©¦‰ò`8N³ÁM§v*î;D5°2f–¨øp½@3Ù•øçªÙœŠFä´@ ̶ήs—ÉL÷¸þ Ü´MUÉRß00ñrÊ®½Œ_™W¸câö(ÑÉ]')Z\líÑJàÙÖ-Yè®ÂyêíÉdS‘b´ƒvªŠ\¿G#ê©J ’5ã¡Í¥u¤4»þ‡q쩊gÄHÐÿäkÀ·6§–V]̇à@[’Ïí¹üY/‹Ã‚ÉÌï¶]ZøIÄÃü)òáCiM¯µºªdÌ– Sv,+Jþ¼§Óô®G~(×úFe¿düYW-DÊÁ¨@íןNz¯—ªb¦v#:‡&BAå©§ëìM·í«¤Ì=}Yë@Hº·¼÷˜õ‡=Ý(Ï¥2ä> {L]>Ú¼U¸ZŽAµÅwµ÷çãETÅJ¦cÄ8vÖs Ï0(ºG‘çY<èÅÅï§ù€äJC¦CÝ¥ÄiÓ>K‚Qÿÿ{ÂOZ=¤eº”ß •†/4ÿƧÌ|ãM{;<å éÚàþR -˜ªZH¥,‚ìŸÅ|À·ÔÐZa ŠÀ× $w~6­Š¨IéO®ÙÞŸFbäÐüOL‘³‡¦zjÍ=4|÷ùEŸÞËmÔW“à¬Â|ù*±ÔѽȲ¼}áÕY¯¯¶¥}û 6R1,ˆ³¸nZÀa\¼É< f¬ˆ&cᯰ·XÕXxã}À¢ZÞ f)™û·¯‘.qY·»¾£ÃZÿcæ$¹“c²J8ÐZè²¸ŽŽËTDÿú»†g X™S^²Åä(ˆ XÍÅ*eXPë¤ÌÄ=B^xêÈ,xäVÝBË T¬BÊÓHM(’Üisawav_1_8_44100.wav000066400000000000000000000254751225012771600344200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFF5+WAVEfmt D¬D¬data+€ƒˆ‹“–šž¡¥©¬¯²¶¹¼¾ÁÄÅÈÊÍÏÑÑÓÕÖרØÙÙÙÙÙÙÙ××ÕÕÓÑÏÎÌÊÈÅÃÀ½»¸´±®«¨¤ ™–‘‰…‚}zurnjfb_[XTPMJGDA?<98531/.,+*)(''''('(()*,,.02468:=@DGILPSW[_bfjnrvy~‚‡‹‘–™¡¥©¬¯²¶¸¼¿ÁÄÆÉÌÍÏÐÒÔÕ×רØÙÚÙÚØØØØÖÕÓÒÐÎÌÊÈÅÃÀ½¹·´±­ª¥¢ž›—“Ž‹‡‚~zvsnjgc_[XTPMJFCA><86410/,,**)(((''''()+,-.02469;?ADGJNQUY]`dhlpuy}†‰‘•™¡¤©¬¯³¶¹½¿ÂÅÇÉÌÎÐÑÓÔÕרÙÙÙÚÙØØØ×ÖÕÔÓÐÎËÉÇÄÂÀ¼¹µ²¯¬¨¤¡™•Œˆƒ€|wsokhc^[WTPLIFC@=98631/.,+*(((&''((()*,,.13469<>BEGLNSW[^bfkosx|€„ˆŒ”™œ ¤¨«°³¶º½ÀÂÆÈÊÍÏÐÒÓÕÕרØÙÙÙØÙØÖÖÕÓÒÐÎËÊÇÅÁ¾¼¸µ²®ª§£Ÿ›–’މ…}xuqlgd`\XTQLIEB@<:7531.,+*)(('&&'')**+-./1479@DHKOSV\_chlrv{„ˆ–šž¢§«¯²·¹½ÁÄÇÊËÎÐÒÓÕ×רÙÚÙÙÙÙ××ÔÓÑÐÎËÈÅÂÀ¼¹¶±­©¥¡œ˜“‰†}xtojf`\XUPLHEA?;9631/-,*(((((''()*+,.0358;=AEHLPTY]`fjotx}‚‡‹”˜¡¥ª¯²¶¹¼ÁÃÆÉÌÎÐÒÓÕ×רØÙÙÙÙÙ×ÖÔÒÐÎÍÊÇÃÁ½¹µ±­ª¦ —“ŽŠ„€|vrmid_[WROJGD@<:6410.,**)('''(()*+,/1359;?AFJMQVY_chmrv{…‰Ž“—œ¡¥©®²µº½ÀÄÇÊËÏÑÓÔÖרÙÙÙÙÙ××ÖÔÓÑÏÍÊÇľº·²¯ª¦¡œ˜“Š„€{vrmhd^ZVRMIEB?:8521.,+*)((''(()*+-/1358<>CGJNSW\aeiosx}‚ˆ‘–›ž¤¨­°µ¸¼¿ÃÆÉÌÏÑÓÔ×רÙÙÙÙØØ×ÖÔÓÐÎËÉÆÃÀ¼¸´¯«¦¢ž™”‹…€|vqlhb]ZUQLID@>:8420.,**'''''((**,.1258;@CFJNSW\afkoty~ƒˆŽ“˜œ¡¦«¯³·º¾ÂÅÈËÎÐÒÔÕÖ×ÙÙÙÙÙØ×ÕÔÓÐÎËÇÅ¿»¶²®ª¥ œ—’Œˆƒ}xsnic_[VQNIEB>:742/.,*)('''(')*,-0147:>BEIMRV[_diotx}ƒˆŽ’˜œ¢¦«¯³·¼¿ÂÆÉÌÎÑÓÕÖרÙÙÚÙØØÖÕÓÑÏÌÉÆÃ¿»·³¯«¦ œ–‘Œ‡‚|wrlhc]YTPLFD?<8530.,+*)'''(((*+-.148:=@FINRW\`fkou{€†Š–šŸ¤¨­²¶º¾ÂÅÈËÍÑÓÔÖרÙÙÚÙÙØÖÕÓÑÎÌÉÄÁ¾ºµ±­¨£ž™”މ„~ysnid_ZUPLGC@<8520/,+(('&&('(*,.0358<@CGKQUY^dinsy„‰Ž”šž¤¨¬²¶»¿ÃÆÈÌÏÑÒÕ××ØÙØÙÙØØÖÓÑÏÍÊÆÃ¿º·³®©¥Ÿš•Š„~ztoid^ZTQLGC>;8420-,*(('&'((**-/247;>BFJOTY^chntz…‹•šŸ¤¨¯³·»¿ÃÆÉÍÐÒÔÕרÙÚÙÙÙ×ÖÕÒÐÍÊÆÃÀ¼·³®©¤Ÿ™”‰„~xrnhc^YROJF@>9741.,*)('&''()+-/147;?BGKPTY^cjnuz€†‹‘—œ¡§«°´¸½ÁÅÈÌÏÒÓÕÖ×ÙÙÙÚØØÖÔÓÐÍÊÇÄ¿»·²®¨¤ž˜’ˆƒ}vqke`ZUQLGB?<852/-+*(''''()*,.147:?BGKPU[_ekpv|‚ˆŽ“˜ž¤©­³·¼ÀÃÈÊÍÐÔÕרÙÙÙØØ×ÕÕÓÐÍÊÆÄ¿º·²­§¡œ˜’Œ†ztnhb^XRNID@<8520-+*)(&''((*,/047;?CGLQV[agmsx~„Š•› §¬±µº¾ÂÆÊÌÏÒÔÖ×ÙØÙÙØ×ÖÕÒÐÍÊÆÃ¿º¶±¬¦ ›–Šƒ~xrlfa[VQKGC>:731.,+)('''')+,.147:@CGMRW]bhnt{€†‘—ž£¨­²·¼ÀÄÇËÎÑÔÖÖØÙÙÙØØ×ÔÒÐÍÊÇÿºµ°«¦¡š•‰ƒ|wqke_YSOJD@<852/-+)('''')*+.047:?CGMQW[chnuz‡“™Ÿ¥ª¯µ¹¾ÁÆÉÍÏÒÕÖØÙÙÚÙØ×ÕÓÑÎÌÇÿ¼¶±¬¦¢›•ˆ‚|vpjd^XSMHD?;742.+*)'(((')*,/358:72/-*)(''')*,.159>CGLRY_fksz€ˆŽ•œ¢¨®´¹¿ÃÈËÏÒÔÖØÙÙÙØØÕÓÑÎÊÆÁ¼·±¬¥ ™’Š„}voha[UOJE@;62/-+)''''(*,.259>CINTYagnu{ƒŠ‘˜ž¥«²¶¼ÀÅÊÎÑÓÕ×ÙÙÙÙØÖÔÒÎËǽ¸²¬¦ ˜’‹„}voha[TOID?:52/-*)(&('(*,027;@FKRW^dlry€ˆ–œ¤©°¶»ÀÅÉÍÐÓÕ×ÙÙÙØØÖÔÒÎÉÅÁ¼·±ª¤ž–‰{sme_XRKFA;84/-+('(''(+,/26;?EKQV]dksyˆ–¤«°¶½ÂÇÊÎÑÔÕÙÙÙØÙ×ÕÓÏÌÈÿ¹³­§ š’Œƒ}ung`YSMGA=84/-+)''('(*,037<@FKRX_fmt|ƒ‹‘™Ÿ¦­³¹¾ÃÈÍÐÒÕרÙÙÙ×ÖÓÑÍÊÄ¿º´®¨¡š“‹…}ung`YSLGA<740-*)(''()+-148>CHNU[bjpy€ˆŽ–ž¤ª²·½ÂÇËÏÓÔרÚÙÙ×ÖÓÑÍÉÅÀºµ®§¡˜’Šƒ|sle_WQJD?;62/,)('''(),/37;@FLRY`gov~†Ž•œ£ª°·½ÂÇËÎÒÔרÙÙÙ×ÖÔÑÌÈþ¹³«¥ž—‡€yqib[TMGB<740-*(('')),/16;@EKRY_hnw~†–¤ª±·½ÂÈËÐÓÕ×ÙÙÙÙ×ÕÓÏËÆÂ½·°©¢š“Œ„{tme^WOJC>:41-+(''&()+.16;?ELRX`gnw†–¤¬²¹¿ÃÉÌÐÓÖØÙÙÙ×ÖÓÑÍÊÄ¿¹³­¥Ÿ–†wphaXRLE@:52.+)'''()+.16;@EKRYaipwˆ—Ÿ§­´»¿ÅÉÎÒÔ×ÙØÙØØÕÒÏËÆÁ»µ°¨ ™‘‰‚zqibZSMF?;63.+)(''()+/26;@ELS[bjrz‚Š’™¡©¯¶¼ÁÇËÏÓÖ×ÙÚÙØÖÔÑÍÈľ¸±ª¢›“Œƒ{skc\UMGA;62/,*(''(),.26<@GNT\dkt|„Œ•œ£«²¹¾ÅÉÎÑÔרÙÙÙ×ÕÒÎÊÆÀ¹´¬¥•Ž…}tme\UOGA<61/,)('''),/2683/,((''(*.27;BIQYakt|†— ©±¸¾ÆËÏÒÕØÙÚÙ×ÔÑÌÇÁº³«£›’‰wmc[SKE=83.+('''),/38>DKS\dmv€‰’œ¤­´¼ÂÈÍÑÔ×ÙÙÙØÕÓÎȽ¶®¦œ“Šxne]UMD>83/,)''()+/38>ELT]foxŠ”¦®¶¾ÄÉÎÒÕØÙÙØ×ÕÐÌÆÀ¹±ª¡˜…|ri`WPH@:5/-)(''(*.28>CKS\enwŠ”¥®µ½ÃÊÎÒÕ×ÙÙØ×ÓÐËÅ¿¸°§ž•‚yof]TLD>83.+)''(),05:AHOWaju~ˆ‘𣫴»ÂÈÍÓÕ×ØÙØÖÔÐÌÆ¿¸°¨Ÿ•Œƒyne]SKC<72-*('')*-1682.+((&(*-17=CKT\eox‚— ©±¸ÁÇÍÑÔ×ÙÙÙ×ÔÐËÆ¿·°§ž“Š€vlcZQIA:40,)'''),/59AIQYclw€Š•ž§¯¸¿ÆÌÑÔ×ØÙØ×ÔÐËÆ¾·¯¦œ“‰tkaWPH?93/+('''*-17=CLT^gq{†š£¬´¼ÃÉÏÓÖØÚÙ×ÖÒÍÇÁ¹²¨ž–‹wmbYPH@93/+('''),17=DLU^ir|†‘›¤­µ¾ÄÊÏÔ×ÙÙÙÖÔÐÊĽ¶­¥š‘‡|rg^ULE=71-)(''),/5:BIS[epz…™£¬´½ÃÊÏÓ×ÙÙØÖÔÐËÆ¾¶­£š†{pf]SKB<50,*''(*,17=DMU^is~‰“¦°¸ÁÈÍÒÕØÚÚØÖÒÍÇÁ¹°§œ“‰~ti_UME=70,)('(),16=DMU`it‰“ž§°ºÁÈÎÒÖØÙÙ×ÕÑËǾ¶­¤›†{pf\RIA:4/+('')+.3:AHQ[epz„𤭶¾ÆÌÑÕØÙØØÕÒÍÇÀ¹¯¥œ‘†{pf\RIA:4/+(''(+/4:BJR]fr}ˆ’œ§°¹ÁÈÎÒÖØÙØØÔÏËý´ª¡–ŒvkaWNE=61,)''(*-28@GQZdpz„𤮷ÀÇÍÑÖÙÙÙØÔÑÊĽ´ª¡–‹€uk`ULC<50,)''(*.3:AJS^hs~‰”ž¨²»ÃÉÏÔØØØÙÖÒÍÇÀ¸¯¥š…yndYPG>71,)(''*-29AIR[fp}ˆ“§²ºÂÉÏÔÖÙÙØÖÑÌÇ¿·®¤™ƒxlaWMD<50,)&((+/4;BLU`kv˜¢­µ¾ÆÍÒÕØÚÙ×ÓÏÊû±§’‡{peZPG?71,*''(*/3;BJT_iu€Œ—¢¬¶¿ÆÌÒÖ×ÚÙÖÔÏÉÁ¹¯¥š„ymaWND<5/+('&),06=EOYcnz†‘œ§±ºÃÊÐÔØÙÙØÕÑÊÅ»³©ž“‡|peZPG>70,)''(+0560,(&'(,18?GQ\hs‹–¡­¶¿ÇÎÓÖÙÚ×ÖÑÌŽ³¨ž’†{ncXMC<4.+'''*-29AKU_lxƒ›§±¼ÄÊÑÕØÚÙ×ÔÎÈ¿·­¢–Šsf[QF>6/+)((),18@JS_jvƒŽš¥°ºÃÊÑÕØÙÙ×ÓÎÇ¿¶¬¡•ˆ|qeZNF<5/+('').4:CMWboz†“ž©´½ÆÍÓÖØÙ×ÕÒÊú±¦š‚vi^SI?81+(('*-28@IT`kx…‘œ¨³¼ÅÌÑÖÙÚØÕÑÌÄ»±¦šŽ‚vj^SG?71,(''*-3:BLVcnz‡”Ÿ«µ¿ÇÎÓרÙ×ÕÏÉÁ·­¢•‰}pdXMD;3.*'''+06>HR]iv„›¨³½ÅÌÑÖÙÚØÕÑËù®¤—Š~qdYOD<3-)('(+07>HR_jw„‘œ©´½ÆÎÓרÙ×ÔÏÈ¿¶¬ “‡znaVJA82+)'().3:CMXdp|‹—£¯¸ÁËÐÖÙÙØÖÑËĺ¯¤˜‹~qdYMD;4-)'&(,29AJWbo|‰–£®¸ÂÊÑÕØÙÙÖÑ˹¯£—Š|pcWLC:2,)'().3;DNYfs€Žš¦±¼ÅÌÓÖØÙ×ÓÏÈ¿µ©ƒwi]RF=5/+(&)+18@JUan|‰–£®ºÃËÑÕØÙ×ÕÐÈÀ·ª “…xj^RG>5.+''(,28AJVbo|Š—¤°»ÃÌÒÖÙÙØÓÎÈ¿´©œ‚tgZOD;2-)'&).4;DOZhu‚©µ¿ÉÏÔØÙÙÕÒʸ­¢”†yk_RG>5/+('(,29AMYerŽ›§³¾ÇÎÔ×ÙÙÕÑËù®¢”‡yk^RG=5.*'&(-2;DOZhu‚‘ª¶ÀÉÐÔÙÙØÕÐÈÀµ©œtgYMC:3+(&'+.6?IUao|‹—¥±½ÆÍÓ×ÙÙÖÒËù®¢”†xj]QD<3-*'')-5>GS`l{‰–£°»ÅÍÔØÙÙ×ÑËù­ ’…vi\PD:2-)'(*/6?IUbo~š§³¾ÇÏÕØÙÙÕÐÈ¿µ©›€qdWJ?7/*''),2;DO\jx‡•¢¯ºÅÍÓ×ÙØÕÒ˸« ‘ƒtfYLB81+'&),2:CN[iw…“ ­¹ÃÌÒÖÙÙ×ÒËÁ·«ž‚sfXK@70*''(,3;EQ]kzˆ—¤±¼ÆÎÔØÚØÔÐÈ¿²¦™Š|n_SF<3-('(*07@KXet‚Ÿ¬¸ÃËÒ×ÚÚÖÑËÁ·«œ€rcVI=5.*&'*.5?JVcqŽª·ÂËÑÖÙÙÖÑËÁ¶ªŽ€qbVH>4.*''*.6?KXft„’¡­ºÄÍÓØÚÙÕÏɾ³¥˜‰{k]OE:1,'')+3:EQ^m{Šš§´¿ÊÑ×ÙÚÖÒË·«pbUH<4.)''+08BN[jxˆ–¤±½ÈÐÕÙÙØÓ̸¬ž€rbUH>4-)'(,09CO\kz‰˜§³¿ÉÑÖÙÙ×ÒÊÀµªšŒ}m_QE:2,(&(,4;HSbp€ž¬¸ÄÍÔ×ÙØÔÎÅ»¯¢”„tfWJ>5.('(*18CP]l|Šš¨´ÁÊÑ×ÙÙÖÑÉ¿³¥–‡wgZL@60*('*08CN]kzŠ™¨¶ÀÊÒÖÙÙÖÐȼ±£•„ufWK?5.*'(,2:DQ`n~«¹ÃÌÔØÙØÔÎź­žp`QE:2+'&(-5>JWfv†–¥²¿ÉÑ×ÙÙ×Ñǽ±£”…teVI>5-)'(+34-('(-43-'&).8CQ_p’¢²¿ÊÓØÙØÔÌÁ´¥•„sbRD80*'(+2=JXhyŠ›«¹ÅÎÕÙÙÕÎÆ¹«›‹xhXI<2,'&*09FTct‡—§¶ÂÍÕÙÙÖÐÈ»®ž|jZJ>3,('*09ESbt†—§¶ÃÍÔÙÙÖÐǺ¬œŒ{iYI<1+''+0:GVfw‰šª¹ÆÏÖÙØÔÏĸ©—†udTE90*'',4?L\l¡±¿ÊÓ×Ù×Òʾ° }l\K?3-(&*0:FUfwŠ›«ºÆÏÖÚØÔÌ´¥”‚q_PA5.(')/8DRct†˜©¸ÅÏÕÙÙÔε§•„q`PB6-)')/8DSbu‡™ª¹ÆÐÖØÙÔÌ´¤“€o]N?4,(&*0:HVgz‹®¼ÈÑ×ÙØÓɽ¯žŒzhWH;1*'(,4?N]o‚”¥µÂÍÕÙÙÕÎÄ·¦•ƒq_N@5,''*0;HXi{ °¾ËÒØÚ×ÐÇ»¬š‡ubQC7.(()/9ETgw‹®½ÈÒØÙ×ÑÇ»¬œ‰vcSD8.)')/8GUfyŒž¯½ÊÒØÙÖÐǹª™…raPA5.('*1M_r†š¬¼ÉÓØÙÖγ¡zfTD7-(&+3>N_s‡›­½ÊÓÙÙÕÍÁ±ŸŒwdRB5,(',5AQdxŒŸ²ÀÍÕØØÔʼ­š…q_L=1*'(.9FXj~“¦·ÆÐ×Ù×ÐÅ·¤‘}hUE7.(&+3?Obu‰°ÀÍÕÙÙÓʼ¬˜„p\J;0)')0;J\o…™ª¼ÉÓØÙÕÍ¿¯œ‰taM?2*'(/9HYm•©ºÈÒØØÖÌÁ±Ÿ‰uaO?2*'(/8GYl‚–©ºÈÓÙÚÕÍ¿®œ‡s_L<1*')1;J]p…š­½ËÔÙØÔɼ«—‚nZH9/('*3@PcxŒ ³ÂÏÖÚ×Ñĵ£{eRA4+'(.9FXm‚—«¼ÉÓÙÙÔʽ«˜ƒnZH8/('+4ARez£¶ÄÑØÙÖÍÁ±žˆs_L=0)'*1=Nau‹¡²ÃÏ×Ù×Ïó ŒwaO>2)')0=L_t‰Ÿ²ÂÏÖÙ×Ïô¡ŒwbO>1*')2>M`u‹ ³ÄÐ×Ù×ϰžˆs^K;0('*3@Qez‘¥¸ÈÒØØÔ˽¬—lXE7,('-8EXmƒ˜­¾ÌÕÙØÑÆ¶£ŽxbO>1*'*1>Ocy£¶ÆÒØÙÕ˽¬—jWD6+'(.9H[q‡°ÂÎÖÙ×βˆq\J9.(',6EVl‚˜¬¾ËÕÙØÐij ‹u_K;/('+5DUk—¬½ËÖÙØÐų ‹t_K;/(',6DWl‚˜­¿ÍÖÙ×вžˆq[I8-''-8H[p‡±ÂÏ×ÚÕÌ¿­˜kUC5+')/0*'+6EXn…œ±ÃÏØØÔË»§‘ydM=/(&,6GZqˆŸ´ÅÑØÙÔɸ¥Žv_K:.('/9J_v£¸ÈÓÙ×ÐųŸ‡oXE5+')1?Qf~–¬¿ÍÖÙ×;«•~fP>1)'+6GZq‰ µÆÒÙØÒÆ´ ‰qZG6+')2?Qg—­ÀÎ×ÙÖ˼§’ybL;.((.:J`w¦¼ËÕÙÖÎÀ­—fQ>0(',7G\tŒ£·ÉÓÙØÐðš‚jT@1((,6GZr‹¡¶ÇÓÙØÐðš‚jS@1)(,6G[s‹£¸ÈÔÚØÏ®˜€gQ>0(',9J_w§»ÌÕÙÖͽª’{bL9.''0Rh‚›²ÅÒÙ×ÐÁ­–|cM:-')2AVnˆ¡·ÉÔÙÖ̼§Žt[E5*&+7G^w‘©¾ÎÖÙÓÇ´„jR>0('0=Qiƒ³ÇÓØ×v]F5+'+5G^w‘ª¿Î×ÙÓų›gO<.'(1AUn‡¡·ÊÕÙÖ˹£ŠoW@2('-;Og›´ÆÔÙ×ͽ¨t[D4*',8Kc}—°ÃÒÙ×Ï¿ª‘x]G5+'+8Ja{–®ÂÑÙØÐÁ«’w]G5+',9La|—¯ÄÒØØÏ¿ªu[E3*(-:Me€›²ÆÓÚ×̼¥‹pVA1)(/>Rk†Ÿ¸ÉÖÚÔȶž…iO<.()2DYtŽ©¾ÏØÙÒî•z`I6*'+9Kd™²ÅÓÙ×̺£‰mT?/('1AWqŒ¦½ÎרÓï•z_H5*&,9NfœµÇÔÙÕÊ·Ÿ„iO;-'*4G^x”­ÂÒÙ×ϼ¦ŒpV?0((0AXr¨¾ÏØØÐÀ«‘uZD1((.>TnŠ¥»ÍØÙÒî“w\E4*(.=Rlˆ£»ÍרÒí”x]E4*'.=Tm‰¤¼ÍרѬ‘u[D2('0@VpŒ¨¾ÎØØÏ¿§ŽqW@/()2DZv’­ÂÒÙ×ͺ¢†jP;,'*6Icš´ÉÔÙÔdz™}`H5)'-=Sl‰¥¼ÍØØÐÀ©ŽqV?/')2E^{–°ÆÔÙÖȶœ~bJ7*&,SoŒ¨ÀÐÙ×ͺ¡…hN8+',;Plˆ¥¼ÐÙØÏ½¤ˆjP:,',9Oj‡£»ÎØÙν¥ˆkO:,',:Ojˆ¤½ÎØØÏ¼£‡jN9+',;Rm‹¦¿ÐÙÖ̹ ‚eK6*'.?Vr¬ÃÓÚÕÉ´š|_E3((1D\y—²ÈÕÚÓÄ­‘sW@.&*6Jfƒ¡ºÍØØÏ½¤†iL7+'-=Uq«ÃÓÙÖȳ—y\B1')4Hc€ž·Ì×ÙÏ¿¥‡iN9*&-=Vr‘­ÄÓÙÕÆ°“uY@/')6Lg†¤¼ÏÙØÌ¹žbG3)(1E^{šµË×ØÐ¾¦ˆiN8*'/?Xu”°ÇÕÙÓ«ŽoS;,',.'+:QmŒªÂÒÚÕÆ¯’sV=.',:Ro«ÃÓÚÓÅ­pS;,'-=Vs’¯ÆÕÙÒÁ©‹lO8*&.AZy™µÊ×ØÐ¾¢ƒeI4('3Fb »ÏØ×˶™y\B0(*9Ol‹ªÂÒÚÕĬŽoQ9+&/@Zy˜µÊ×ÙκŸaE1'(5Khˆ¦ÀÒÙÕÆ®‘qR:+'.@Zx˜µËØØÎ¹ž~_C1')7OkŒªÃÔÙÓ©‹kL7)(2Fa¡»ÐØ×ȱ”sU<+(.?Yx™¶ËØÙ͸œ{\B/(+:Sq’°ÈÖÙм¡aE2()7OmެÅÔÙÑÀ¤…dH3((6Mj‹«ÄÔÙÒÁ¦†fH3()5LjŠªÃÔÙÒÀ¦†eH3()7MkŒ«ÅÕÙѾ¤ƒcE1'*8Pn®ÇÖÙϼŸ~^B0(,-'.A\~Ÿ¼ÑÙÕΉgI3()8Qp’²ÊÖØÌµ—tT:*'1Fd†§ÂÔÙѽ ^A.',@[|ž¼ÐÙÕÄ©ˆfG2(*:Tt–¶ÌØ×ɯmN6))6Nn‘°É×ØÍ´•sR9)(2KiŒ­ÇÖÙη—vU:*'2HgЬÅÕÙι™vV;+'1HfŠªÅÖØÎ·™uT:*'1Ih‹¬ÆÖÙͶ–sR8)(4Kl°É×ØË²’oO6((7Pq”´ÌØÖÈ­ŒhJ2'+:Vy›ºÏØÕ¦„`C/'-A^‚¤ÁÔÙлœyW<*'2Ij¯È××˲mL4():Twš¹ÏÙÔÂ¥‚_A-&/Cb…¨ÅÖÙζ–rQ7)(8Qs–·ÎÙÕĨ„aB.'.Dc†¨ÅÖÙ͵“oO5()9TwšºÑÙÓ¿¢~[>,'1HjްÉרɭ‹fH0'-A^‚¦ÂÔÙζ•qO5)*9Uxœ»ÑÙÓ½žyW:*(4Np•¶ÎÙÔÂ¥]?,'1Hk²ÌØÖƪ†bB.'/FeŠ­ÉØØÉ­‰eE.(-Dcˆ¬ÇØ×É®‹gF0'.Cc‡«ÇרɝŠgE0'/Cdˆ­È××È­‰dD.'/FfŒ®ÉØ×Æ©…aA,'1Ij³ÍØÕ¤Z=+(4Nq–¸ÏÚÓ½wU8()9VyŸ¾ÓÙÏ·”nM3(,@_ƒ©Æ×ØÉ­ŠdD-'1Hj³ÍÙÕÁ¡|X:))7Ty¾ÓÙз”nJ2(,Bbˆ¬É×ׯ¨ƒ]>+'4Os™»ÒÙк—pM2'+?a†ªÈØ×Ũ‚]>+(5Pt›¼ÒÙз”lI1'-De‹°ËØÔ¢|W9)):X}¤ÃÖÙÊ®‰cB-'3Mq˜»ÒØÑ¸•nK1'.Df²ÍÙÓ¿žxR6'+>^„ªÈØ×Å¥Z;))9W}¤ÄÕØÉ«†`>+(6RxŸÀÔÙ˰‹dA,'3Os›½ÔÙͲŽgD.'2Mq˜¼ÓØÎ´hE.'2Kq™»ÒØÏ³gE-'2Mrš¼ÓÙͲŽfD-(4Ot¿ÔÙ̯‰a@+(6Ty¡ÂÕ×É«„\<*(:Y§ÅØ×Ť}V7)*?`ˆ­ËÙÔ¿œtN2&.Ei‘¶ÐÚз’jF.'2Ntœ¿ÕØÊ­†^=))9Y©ÈÙÕ xR5',Cg´ÐÚз‘iE-'5Qw ÂÖØÇ§X8(*>`‰°ÍÙÒ»–mH/'3NtœÀÕ×È©‚Z9)*?`‰±ÍÙÓ¹•lG/'3Pw ÂÖ×Ç¥|V5(,Bg¶ÑÙϳŒb@*(8Yisawav_1_8_8000.wav000066400000000000000000000037741225012771600343350ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFôWAVEfmt @@dataД©ºÈÒØÙÔ˾­˜ƒlYG7-''-7FXm„˜­¿ÌÔÙØÑŶ¢v`M<0('+4CUj˜¬¾ÍÕÙØÏ±‡pZF7,'(/;Mbx§¹ÈÔØÙÐijž‡pZF6,')1@Ri—­ÀÏ×ÙÕË»§xaK9,((0=Pg€—®ÁÐÖÙÓÈ·¡ŠqYE4*'+6G\tަ»ÌÖÙÖ̺¦s[E4+'+6H`x’ª¿Îרӯ³›hP<.')2AXp‹¤»Ì×ÙÔÇ´œƒhO;.')3E]v’«ÁÐØØÐÀ«uZC2)'/?To‹¥½Í×ÙÑÁ¬’uZC2('0AXt‘«ÂÑÙ×Ì»¡…iN9,'+9Oi‡£»ÎØÙо¦ŠlP:,&+;PlЧ¿ÐÙ×˸žbH4)'0D^|™´ÊÖÙÑÁ§‰kN8+'.@Zw–³ÉÖÙѾ¦†gK6)'2Ea »ÏØ×Ê´—wY?.',=Vu•³É×ØÏº~]A.'+d¸ÓØÉ¨|R2&1Q{§ÉÙÒ·`;(,EnœÁØÖ¾—h@**@i—¿ÕÖ¿˜j@)*Ck›Á×Ô»‘b;(-Jv¥ÉÙа‚T2'6[жӨěkA)+Ft¤ÉÙά}O.('0Uˆ¸ÖÕ¶…Q/)Ap¦ÌÙÇšd8'6`•ÃÙΨqA(/UŠ»ÖÒ®zF*.Q†º×Ó°yF*-S‰¼ØÑªsA(2[“ÃÙÌŸg9':j¢ÍÙÀU.)I€¶ÖÓ¬s@'5bÊÙÁU-+M‡»×Ρg7'?u¯ÔÔ¯u@'7h¤Ï×·}D(3cŸÍع€F(3c¡ÎØ·}C'6i§ÑÕ°s='=v²ÖТd3)JˆÁÙÅŽP*1`ŸÏÖ±s;'A}¹ØÈ“S*0`¡ÑÖ¬l5(KŠÄÚ¾C';v¶ØÉ‘P*4h«ÕÏY,.a¤ÓÓ£_.-]¢ÓÓ£^.._¥ÓÑžY+1f«ÖÍ•P)7r·ØÅ†C'B…ÄØ¶p6*UÒÒžX*4pµØÂ>(K“ÍÕ¥\+3p¶ÙÀ|;)RœÒÑ—N(>‚ÅØ­c-1nµÙ½v5*]¨×Ç„>(RžÔÍŽD'L˜ÒÐ’G'I–ÑÐ’G&K—ÓÏC'PžÔÊ…=(Z©ØÂw4-i·Ùµd,7}ÆÖ O'G—ÓË…:*a³Ù¶d+:„ËÓ”C(W©Ù»j,8‚ËÒ“C(\°Ù³_)A‘ÒÊ5/sÃÖ›G'Z¯Ù±Z'HœÖÀn,:‹ÐÊ}23}Êщ8.sÅÕ>,mÁÕ•@+kÀÖ•?+mÃÕ;-sÇщ60}ÌÍ}18‹ÔÄm*CÙµY'U±Ø¡E*lÅÒ†25‹ÔÁe(N¬Ù£E)pÉÎ{.>™Ø±Q'dÁÓ…1:•Ø´R(fÄÐ~-?ŸÙ¨F+wÍÇi(RµÖ38–جI*xÐÄc'\¿Ñ|+G¬Ø“58˜Ú¦B.‡Ö´M*xѾY'mÌÅa'fÈÉg&`ÅËi'`ÅËi(aÇÉf&fÊÆ_&oпU){ÔµI-Š×¥<6Ù“1E°Õ{(YÄÈ`'uÒ´F0”Ù•1FµÑp'iϺK/’Ù”/K»Îe(xÖª;<«Õv&iѵC5£Ö|'fеB7¦Öv'oÔ«9@´Ðc(…Ù”-UǾH3¥Õp'{Øš/SȼD8¬Ñd(ŒÚ†(kÔ¤2OƼC;³ÌW.Ön'‰Ù'uØ”+dÔ¢0Xέ6Oɶ:Gļ?B¿¿C@½ÁC?¾ÁB@¿¿@Cº;Iȳ5QÍ©/]Ôœ+lØŒ'~Ùx)’Õb/©ÌL<¾»9QС*oÙ‚'Õ^2²Ä?L΢+qÙx(žÏM?ů.jÙ~(ÏJBʦ*vÙl.±Â9YÖˆ(™ÏIGÏš(‰ÕT=Ȥ)‚×X;Ǥ)…ÖS?Ëœ'ÒIKÓŠ(¤Æ7aÙo0½­)ƒÔKJÓ…*®»/w×TDш*¯¹,}ÖKNÖx0¿¦'˜È6mØTGÕ|/À¡(¢¿.~ÒB^Ù\CÔ{1Æ—(²°(šÃ.ƒÏ9m×GZÙXLÙf?Ôu6΂0È,•*½›)¹ (¶£(µ¤'¶¢'·Ÿ)¼›*Á“,Å‹0Ì5Ñq>ÖbKÙSYÙBmÓ6„Ç+œµ'´+È€9ÕaPÙDpÐ/”¸'·•/ÐlJÙErÌ, «)Æ{AÙKmÍ,¤¦+ÍmMÙ;†½'¾ƒ>ÚFwÅ'¸Š;ÙFzÃ&¾€DÙ;Œ³)Íe[Ò,¬’8Ù@…µ)Ï_eË(¾{LÖ.ª>Ù7›Ÿ5Ú>‘¦1ØAލ0Ø@‘¥4Ú9œ™=Ø4©‰G×&ÁjfÂ-È\isawav_2_16_44100_be.wav000066400000000000000000001261601225012771600351370ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFX¬hWAVEfmt ¬D±data¬D++ËËÁÀ ‚ ‚ff!!òòœUU!æ!ç%€%‚(ô(ó,g,g/´/µ2û2û669191<<>ú>ûA±A±DNDNFÇFÇI"I!KWKWMjMjOXOYQ QRÃRÃTS>S;h;i8`8a5=5=1ÿ1ÿ.¦.¦+9+8'³'´$$ p p´µìë33 I I W Waaggýmýlùrùrõ{õ{ñ‰ñ‰ížížéºéºåãåâââÞZÞZÚ®Ú®××ÓÓÐÐÌÆÌÆÉˆÉˆÆdÆeÃ]Ã]ÀuÀt½¬½¬»»¸€¸€¶¶³ã³â±Î±Î¯à¯ß®®¬€¬€« «©È©È¨®¨­§¿§À¦þ¦ÿ¦l¦l¦¦¥Ï¥Ï¥Å¥Æ¥ë¥ê¦>¦>¦À¦À§p§p¨N¨M©W©Xªª«ô«ô­ƒ­ƒ¯=¯=±!±"³/³/µdµe·Á·ÁºCºD¼ë¼ê¿µ¿´Â Â Å¬Å¬ÈØÈØÌÌ Ï„ÏƒÓÓÖ–Ö–ÚAÚAÞÞáÓáÔåµå¶é¦é¦í¢í¢ñªñ©õ·õ¸ùÌùÍýäýå ø ù î îØÙ½½–—dc!!!"$Ð$Ñ(m(l+õ+õ/h/g2Ã2Ä669,9,<8<6?$?$AòAñDDG'G&IIKÎKÍMèMçOÛOÜQ¦Q§SHSIT¿T¿V V W,W,X!X XèXèYY‚YîYîZ-Z,Z±>³^³^µ©µ©¸¸º¸º¸½z½zÀaÀaÃlÃlƘƙÉåÉåÍPÍPÐÖÐÖÔzÔzØ4Ø4ÜÜßëßêãããâçêçëììð"ð"ôMôLøø~üµüµïî  " " 6 6AAED=>))!!$Ñ$Ñ(‰(‰,,,-/¸/¸3*3*66‚9½9¼<Ù<Ù?Õ?ÖB°B¯EfEfG÷G÷JcJbL¦L§NÁNÁP±P²RvRwTTUzUzV·V·WÅWÅX¥X¥YTYSYÑYÒZ ZZ®?¬ˆ¬‰««©ª©©¨…¨…§’§’¦Ñ¦Ò¦D¦D¥ë¥ë¥Ä¥Ä¥Ô¥Ó¦¦¦Œ¦Œ§5§6¨¨©%©$ªhªg«Ý«Ý­‚­ƒ¯Z¯X±^±^³’³‘µñµñ¸}¸~»2»3¾¾ÁÁÄ?Ä?ÇÇŒÊûÊü΋΋Ò6Ò6ÕþÕýÙÝÙÞÝÕÝÕáàááåÿåÿê-ê,îgîhò®ò­öýöüûPûOÿ©ÿ©ëê S S~~¢£ººÅÆ À À$©$©(~(~,<,=/â/ã3m3m6Û6Û:+:+=Z=[@g@gCOCOFFH«H«KKMdMdO~O~QlQlS+S+T»T»VVWHWHXEXEYYY¦Y¥Z Z Z8Z8Z3Z3YúYúYŽYŽXîXíXXWWUØU×TlTlRÐRÐQQOOLÛLÛJƒJƒHGÿERESB}B|?~?}<[<[995¬5¬2$2#.|.}*»*»&ß&ß"í"ìååÊÊŸžff"" Ö Õ‚ƒ++üÓüÓø|ø}ô*ô*ïßïÝëœë›çdçdã:ã:ß"ß#ÛÛ×.×.ÓVÓWÏ™Ï™ËøËøÈvÈvÅÅÁ×Áؾ¿¾¿»Í»Í¹¹¶e¶e³ò³ò±­±­¯˜¯—­³­²¬«ÿª~ª~©0©0¨¨§5§5¦‡¦ˆ¦¦¥Ð¥Ð¥Æ¥Ç¥õ¥ô¦X¦Y¦õ¦ô§Ç§È¨Ï¨Ïª ª «€«­'­&¯¯± ± ³I³Iµµµµ¸O¸O»»¾¾Á#Á#ÄeÄeÇÌÇÌËWËVÏÏÒÌÒÌÖ³Ö´ÚµÚ´ÞÍÞÍâûâûç;ç;ëŒëŒïéïéôSôRøÀøÁý8ý7§§üû P Qžžäå  NOll#x#x'p'p+O+P//2Á2Á6N6N9»9»==@+@+C,C+FFH°H±K2K3MˆM‡O¯O®Q¥Q¦SkSkTþTþV]V^WˆW‰X€X€Y@Y@YËYËZZZ|>|A¥A¦D¦D§G|G|J$J$LLNåNåPüPýRàRßTTVVWGWGXQXPY!Y"YºY¹ZZZî>î;–;–884q4p0ª0©,Á,Á(»(½$›$› b a°±>?¿¾ 5 5¤¥üxüy÷å÷äóTóUîÍîÍêPêPåáåâáƒá„Ý9Ý9ÙÙÔìÔìÐîÐîÍÍÉRÉSźźÂGÂG¾ÿ¾þ»à»à¸ï¸ï¶.¶.³Ÿ³ž±A±A¯¯­(­)«n«n©ì©ì¨¦¨¦§™§™¦É¦É¦5¦5¥Þ¥Þ¥Ã¥Ä¥ç¥ç¦G¦H¦æ¦æ§À§À¨Ö¨Öª(ª(«¶«µ­|­|¯|¯|±³±²´´ ¶À¶Á¹”¹•¼™¼˜¿Ì¿ËÃ*Ã+ƴƵÊfÊgÎ=Î=Ò7Ò7ÖRÖQÚ‰Ú‰ÞÚÞÚãDãCçÁçÁìQìPðìðíõ•õ•úCúCþûþü£¢33 Å ÅJJÇÈ56’“"Ü"Ü''+(+(/%/$336¿6¿:W:W=Ç=ÈAAD.D-GGIÝIÞLmLmNÈNÈPðPïRàRàT˜TšVVW_W_XkXkY:Y:YÍYÍZ#Z#Z;Zî>é¤é¦ååà¢à¢Ü@Ü@×÷×öÓÉÓÈϹϹËËËÊÈÈÄ_Ä_ÀåÀ彘½˜ºzº{··Ž´Ó´Ò²N²N¯ÿ¯þ­é­é¬ ¬ ªmªm© ©§ã§â¦û¦û¦T¦T¥ì¥ë¥Ä¥Ä¥Ý¥Ý¦7¦6¦Ð¦Ð§ª§«¨Ä¨Äªª«²«²­„­†¯“¯”±Ü±Ý´^´^··ºº½$½$ÀuÀtÃôÃôÇŸÇ ËtËtÏpÏoÓŽÓŽ×Î×ÎÜ+Ü,à¤à¤å3å3éØé×î‹îŠóMóNøøüëüë¼¼pp ! ÊÉhhùùxx!ä!ä&9&9*s*s..2Œ2Œ6e6e::=¤=¤AAD5D6G8G8JJL¥L¤O O Q9Q9S.S.TèTèVfVfW¦W¨X©X©YkYlYðYðZ3Z3Z5Z6Y÷YøYzYzX¼X¼W½W½VVUUSLSMQWQWO'O(L¾L¿JJGGGGD=DññõÿõþúêúëÿâÿáÇÆ “ ”`_ÓÒut!!%x%x)Ó)Ó..2)2)669í9î=‘=’AADMDNGbGaJAJALéLéOXOXQQŒS„S…UH>E1E0AîAï>y>y:Ô:Ô7733.â.á*™*™&0&1!¨!©PO„„ª¨ à ÃÔÓÿàÿáúíúíõýõþññì7ì5çhçgâªâ«ÞÞÙwÙxÕÕклÌÌÈŽÈĶĶÁ Á ½”½”ºNºN·>·?´h´h±Ì±Ë¯m¯m­M­M«n«n©Ñ©Ñ¨w¨w§c§c¦”¦“¦ ¦ ¥Ë¥Ê¥Ï¥Ï¦¦¦±¦°§‹§Œ¨®¨¬ªª«¾«¿­­­­¯Ý¯Ü²L²L´ú´û·å·æ» »¾e¾dÁõÁõÅ·Å·É¨É©ÍÆÍÆÒ Ò ÖxÖxÛÛ߱߱äwäxéTéTîDîDóBóCøMøMý\ý\rroo Y Y>>ÛÛ$'$((¥(¦--1C1D5Z5[9H9I= = @ž@CÿCÿG+G+J JLÛLÜO[OZQ›QœSžSU]U]VÚVÚXXYYYµY¶ZZZ=Z+ç+ç'k'j"Ï"ÏEF__hh e dWWEDû3û3ö#ö#ññììç3ç1âXâYÝ–Ý—ØðØñÔkÔjÐÐËÊËÊǷǶÃÒÃÑÀÀ¼œ¼¹S¹S¶C¶C³p³o°Ú°Û®†®†¬u¬tª¨ª¨©"©!§á§â¦í¦í¦@¦?¥Ý¥Ü¥Ä¥Å¥÷¥ø¦v¦v§>§>¨O¨P©«©ª«O«N­8­7¯h¯h±Ú±Ú´Ž´··‚º²º²¾¾ÁÀÁÀÅ™Å˜É¡É¡ÍØÍØÒ9Ò:ÖÃÖÃÛoÛnà:à:å!å êêï0ï/ôQôPùyùxþ­þ­ÐÐÜÛ ç èååÖÖ²²!y!y&$&$*²*²//3a3a7}7};k;k?)?)B´B´F F I$I$LLN¦N¦QQS'S'UUV–V–WäWãXèXèY¤Y¤ZZZ=Z2=6—6–:¾:¾>³>²BnBoEïEïI1I1L1L2NîNîQbQbSŽSŽUoUoWWXFXGY;Y;YßYàZ1Z1Z2Z2YáYáY=Y=XIXHWWUnUnSŠS‰QZQ[NàNàLLIIEÇEÇB9B:>o>n:k:j606/1Ä1Ä-'-((b(b#w#vjjAAÿÿª« G HÜÜþlþkøýøüó“ó’î5î5èæèçã­ã¬ÞÞŽÙÙÔ¯Ô¯ÏúÏùËqËqÇÇÂ÷Âö¿ ¿ »_»_·ò·ñ´È´È±å±å¯L¯L¬þ¬ÿªÿªÿ©O©P§ó§ó¦é¦é¦3¦5¥Ô¥Õ¥Ê¥Ë¦¦¦¶¦¶§­§­¨÷¨øª•ª–¬†¬†®Å®Å±S±T´-´.·P·Pº¸º¸¾d¾dÂOÂOÆvÆwÊÖÊÕÏhÏhÔ*Ô*ÙÙÞ*Þ)ã^ã^è¯è¯îîóó‘ùùþ§þ¦ ˆ ˆîîED‹Š¸¸#Ê#Ê(º(º-…-…2&2&6™6š:Ø:Ø>â>áB°B¯F?F?IŽIL—L–OXOXQÎQÏSøSùUÒUÒW[W\X’X’YuYuZZZ,>,B0B0EðEðIhIiL•L•OuOuRRT;T;VVW§W§X×XÖYªYªZ Z!Z:Z;YõYõYTYSXUXVVúVúUFUES6S7PÐPÑNNK K G°G±D D @@;ì;ë7z7z2Î2Î-í-í(Ú(Û##89µ´ a ažžÓÒüüö:ö:ðzðyêÉêÈå-å-߯߮ÚRÚQÕÕÐÐË=Ë=Æ Æ Â>Â?¾¾ºEºF¶µ¶¶³u³t°‡°‡­ì­ì«««ª©Ã©Ã¨9¨8§ § ¦@¦A¥Õ¥Õ¥Ì¥Ì¦#¦#¦Ü¦Ü§÷§÷©p©p«H«H­}­}° ° ²ð²ð¶*¶*¹µ¹´½½Á­Á­ÆÆʸʸϙϚԯԮÙôÙõßeßdäúäûê¬ê­ðzðyöUöTü@ü@&&ïï ´ ´jj  ••#ý#ý)?)@.W.W3=3>7î7íà>áCCFÚFÚJcJcM™M™PzPyRÿSU(U)VóVóX[X[Y`Y_ZZZ:>:B‘B‘F™F™JKJKM¤M£PŸPžS8S8UlUlW:W:X›XœY“Y“ZZZ9Z:YçYçY'Y'WúWúVaVaT^T^QóQòO#O$KòKòHcHcD{D{@>@=;°;°6Ù6Ú1¾1¾,d,e&Ó&Ô!!''ðñµ´nmü#ü"õÛõÛï¡ï¡ézézãnãm݆݅×Ç×ÈÒ;Ò;ÌæÌçÇÔÇÓÃþ„¾ƒºSºS¶y¶z²ü²ü¯á¯á­)­*ªÛªÚ¨÷¨÷§‚§¦|¦|¥é¥é¥Æ¥Æ¦¦¦Ú¦Ú¨¨©²©±«Å«Ä®C®C±)±*´u´v¸"¸#¼,¼,ÀÀŒÅ>Å?Ê<Ê<Ï€ÏÕÕÚ¾Ú¾à¨à¨æ¾æ½ìóìòóBóCù¢ù¡ qq ³ ²æå$Ø$Ø*ƒ*ƒ/ù/ù5354:,:,>Û>ÛC=C=GJGIJþJþNTNSQFQGSÓSÔU÷U÷W¯W®XöXöYÎYÍZ3Z4Z'Z'Y¨Y©X·X·WUWUU„U„SESEPœP›MŒMŒJJFEFFBB=•=—8Ä8Ä3¨3©.K.K(±(°"á"âåå‚ + ,ÇÆý\ý\öõöõð™ð™êPêPä"ä"ÞÞØ9Ø9ÒÒŽÍÍÇíÇìÃþo¾oº,º,¶E¶E²½²½¯›¯š¬á¬àª“ª•¨·¨·§L§L¦W¦X¥×¥×¥Î¥Ï¦<¦<§!§"¨{¨{ªIªI¬ˆ¬‰¯8¯8²Q²RµÓµÓ¹¸¹¸½ú½ù””ÇÇ̺̺Ò7Ò8×ó×óÝåÝåääêJêKð°ð¯÷(÷(ý­ý­67 ž Ÿöõ99^_#^#^)1)1.Ð.Ï40409M9N>!>!B¤B¥FÒFÑJ¢J¢NNQQSºSºUëUëW¬W¬XúXúYÓYÓZ6Z6Z!Z"Y—Y—X•X•WWU5U5RÛRÚPPLÝLÝIDICEHEH@ð@ïÑ>ÑC†C†GÙGÙKÄKÄO@O@RIRITÙTÙVíVîXƒXƒY–Y—Z&Z&Z1Z1Y·Y·X¸X¹W9W9U7U6R·R·O¼O»LKLKHiHiDD?g?g:U:U4ë4ê/1/2)2)1"ô"ô‚âã##MMhhúúó¢ó£ìÕìÔæ#æ#ߘߘÙ;Ù<ÓÓÍ;Í;ǩǨÂjÂj½ˆ½ˆ¹ ¹ ´ø´ø±U±V®*®+«|«|©N©M§¢§¢¦|¦}¥ß¥á¥Ì¥Ì¦C¦C§B§B¨É¨ÉªÖªÕ­e­e°r°r³ú³û·ø·ù¼e¼dÁ9Á:ÆoÆoËÿËÿÑßÑߨØÞnÞnå å ëÎëÎò³ò´ù­ù­µµ¢¡zzBAçè"f"f(¯(°.½.¾4…4…::?!?!CåCåHBHCL4L4O±O°RµR¶U>U=WEWDXÇXÇYÂYÂZ5Z4ZZY~Y}XTXTV¥V¥TpToQ¹Q¹N…N„JØJØF¸F·B*B*=7=77å7ä2;2<,E,E& & ‘’èè + ,,+ý&ý&ö#ö"ï/ï/èUèTážáÛÛÔÆÔÆÎºÎºÈùÈúÃþ‚¾‚¹Û¹Üµ¢µ¢±Ý±Þ®‘®’«Æ«Ç©€©§À§À¦Œ¦Œ¥å¥å¥Ë¥Ë¦A¦A§C§D¨Ó¨Ôªíªì­­Ž°±°±´U´T¸o¸o¼ü¼üÁõÁôÇQÇQÍÍÓÓÙaÙbßòßñæµæµí¢í¢ô­ô­ûËûËññ ö ÷ééÄÄzy%%+O+O1Z1[77<ƒ<ƒAŽAF4F4JkJkN0N/QxQxTATAV‡V‡XDXEYvYxZZZ4Z4Y¾Y½XºX¹W(W(U U RiRjODOCK K G„G…BöBõ=ý=ý8Ÿ8Ÿ2è2ç,Þ,Ý&Œ&Œüü87JJ ? ?!!üûüûõÙõÚîÈîÈçÑçÑááÚ`Ú`ÓüÓüÍßÍßÈÈžŸ½½Ž¸ê¸ê´·´¸°ÿ°þ­Ç­Æ««¨ê¨ë§O§N¦D¦D¥Ì¥Ê¥æ¥æ¦”¦”§Ô§Õ©¥©¤¬¬®í®ì²[²[¶I¶Hº°º±¿Š¿‹ÄÑÄÑÊxÊxÐxÐxÖÈÖÉÝ]Ý]ä+ä*ë(ë(òIòIù‚ùÅÅííâá#“#”* * 0>0>6%6$;¶;¶@å@åE¬E¬JJMãMäQDQDT"T"VvVwX?X>YxYxZZZ3Z3Y²Y³X¡X¡VýVþTÊTÊR R NÈNÈKKF¿F¿BB <ä<ä7\7[1v1v+>+?$¿$¾úûÈȇ‡úBúBóóëàëßäÙäØÞÝÿ×]×^ÐþÐþÊîÊîÅ4Å5¿Þ¿Ýºñºñ¶x¶y²z²{®þ®þ¬ ¬ ©¤©¤§Í§Î¦‹¦¥á¥á¥Ï¥Î¦T¦U§s§s©&©&«n«n®C®D±§±¦µŽµ¹ô¹ô¾Ó¾ÓÄ!Ä!ÉÕÉÔÏæÏæÖKÖLÜøÜ÷ãáãàêûêúò9ò:ù‘ùöö>>rq‘‘‡ˆ$P$P*Û*Û1"1"77<­<­AßAàF¥F¦JôJóNÇNÆRRTÙTÚWWX²X²YÀYÀZ6Z7ZZYZY[X X V"V#SªS©P£P£MMHÿIDoDn?i?i9÷9÷4"4"-ô-ó't't ² ²·· G Féêü…ü†õ&õ&íÚíÚæ«æ«ß¦ß§ØÙØÚÒOÒPÌÌÆ0Æ1À²À²» » ··²å²å¯L¯M¬?¬?©Å©Ä§Þ§Þ¦’¦“¥â¥â¥Ï¥Ï¦Y¦Y§‚§©C©C«ž«ž®®Œ² ² ¶¶ºœºœ¿ ¿ŸÅÅÊôÊõÑ2Ñ1×Á×ÂÞ™Þšå­å®ìñìðôWôXûÑûÑWX à   == @ A''-š-˜3Ö3×9¹9º?;?˜˜#½#½*¢*¢18187u7u=K=KB²B²GGžLLOàOáS)S(UÖUÖWåWåYPYPZZZ3Z3YªY©XxXyV¢V¢T)T)QQMdMcI#I$D[D[??9O9O3!3",“,”%°%¯……ŽÞÞø]ø^ðªðªééá¨á§ÚtÚtÓ‡Ó‡ÌîÌîÆµÆµÀéÀ黕»•¶Â¶Ã²|²|®É®È«±«°©9©:§h§i¦A¦B¥Ç¥È¥ú¥ú¦Ú¦Ú¨f¨fªšª›­u­t°î°îµµ¹¥¹¤¾Ñ¾ÑÄ}Ä}ÊÊÑ%Ñ%ØØß<ß;æ­æ­îSîSööýøýøÑÑ † …%&œ#Þ#ß*Ý*Ü1‹1Œ7Û7Ü=Â=ÂC4C3H%H%LLŽPdPdS¢S£V@V?X7X8Y‡Y‡Z+Z,Z!Z!YkYkXXUüUûSHSHOôOõLLG„G‚BvBv<ç<ç6â6â0r0r)£)£"‚"ƒ„„  Ãêêüü ô.ô-ìjìkäËäÌÝaÝ`Ö9Ö:ÏdÏdÈìÈìÂàÂà½L½L¸;¸;³¶³¶¯Ç¯Ç¬v¬v©Ê©Ë§Ç§È¦t¦t¥Ò¥Ó¥ä¥ä¦¦¦¦¨¨ª?ª>­­ °°‚´•´”¹>¹>¾u¾uÄ1Ä1ÊdÊdÑÑØØßQßQæáæáî§î¨öŽöŽþŽþŽz{KK––$î$í+û+ü2¶2´9 9 >ó>óD^D^ICIDMšMšQXQXTtTuVëVêX¶X¶YÒYÒZŠ>Š8]8]1¶1¶*§*¦#:#9‚‚ŽŽ p p89úùúúòÄòÄêªêªâ½â½ÛÛӬӬ̪̫ÆÆ¿ü¿ýºnºmµtµs±±­j­kªnªm¨(¨)¦¢¦£¥Ý¥Ý¥Û¥Û¦¦¨#¨#ªfªf­d­d±±µwµxºyºyÀÀÆ<Æ=ÌâÌãÓúÓùÛsÛtã<ã<ëFëFó}ó~ûÓûÔ-- c c€€ts$)$)+“+“2Ÿ2 9@9@?g?fEEJJNzNyR;R:UKULW£W£Y>Y>ZZZ.Z.YY€XXUßUàRõRôOTOTKKFF@‰@‰:p:o3Ö3Ö,Ê,Ë%\%[™™•– b bü±ü±ôYôYììääÜ/Ü.Ô¥Ô¥Í{Í{ÆÁÆÀÀ„À…ºÔºÓµ¼µ¼±I±I­…­…ªxªx¨)¨)¦¦ž¥Ú¥Ú¥à¥à¦®¦¯¨F¨Eª¢ª¢­½­¼±‘±¶¶»B»AÁ ÁÇ]Ç]Î4Î4ÕyÕyÝ Ý"ååíMíNõ¬õ¬þ&þ&žžìí&Ö&Ö.<.;5:5;;Å;ÆAËAÌGBGALLPHPHSÅSÅVˆVˆXŠXŠYÇYÇZ;Z>CöC÷IBICMéMéQÜQÝUUW‹W‹Y8Y8ZZZ*Z+YlYlWáWàU‰UŠRnRmN’N’JJDÅDÅ>è>è8y8z1‡1‡*!*""W"W>>çç d eËÌø/ø/ï¥ï¥ç@ç?ßß×3×3ϲϱȢȠ¼¼¶±¶³±ý±þ®®ªÅªÆ¨R¨R¦­¦®¥Ý¥Þ¥á¥à¦¹¦º¨f¨fªãªã®)®*²4²5¶÷¶÷¼i¼jÂ|Â|É#É#ÐMÐM×ê×êßèßèè3è3ð¸ð¸ùcùc  ½ ¼::#¢#£+e+e2Â2Â9©9©@ @ EÔEÔJúJúOrOrS-S-V%V&XTXTY±Y°Z;Z;YîYíXÍXÍVÙVÙTTPPLDLDGDGDA›Aš;S;T4~4~-,-+%l%lRRñð ] \©ªúîúîò<ò=é«é«áOáOÙ;Ù;Ñ…Ñ…Ê=Ê=ÃvÃv½@½A·¬·­²Æ²Ç®š®›«4«4¨›¨œ¦Õ¦Ö¥é¥é¥×¥×¦¡¦¡¨D¨Eª¾ª¾®® ²²¶ì¶í¼r¼rÂÂÉ_É`ШЩØgØgà‡àˆèöèöñŸñŸújújHJ ŸŸ  %+%,,÷,÷4U4V;9;9AŒA‹GBGBLLLKPPžT-T,VñVñXàXáYùYùZ7Z7YšY™X"X"UÓUÓR²R²NÇNÇJJDºD¹>®>¯8 8 0Ú0Û)3)2!$!$ÄÄ%&__þ„þ…õ¬õ¬ìîìîä]ä]ÜÜÔÔÌÌņŅ¿ ¿ ¹2¹3´´ ¯›¯›«õ«ö© ©!§&§%¦¦¥É¥É¦n¦n§ó§óªUªT­­±–±–¶d¶d»ë»ìÂÂÈðÈïÐJÐJØ!Ø!àZàZèçèçñ¬ñ¬ú›úšŽ _ _™˜%Ó%Ô-±-°55< < B_B_HHMMQQQPTÆTÆWiWiY1Y1ZZZ%Z$YLYKW“W“TÿUQ•Q•M^M_HdHdB´B´<[­=ªª§½§¾¦N¦N¥Ä¥Å¦#¦"§i§j©“©“¬œ¬›°|°}µ+µ+ºœº›ÀÀÀÀLjljÎäÎäÖÀÖÀßßç¦ç§ð†ð…ùŒù¨¨ ¡ ¢ww%x%x-w-w55<<BpBpH4H4M>M>Q„QƒTùTùW•W•YPYQZ'Z'ZZYYW?W?T€T€PæPæL{L{GKGKAaAa:Î:Í3¡3 +í+í#Ç#ÈDDxx | {fe÷M÷LîJîJåtåuÜãÜäÔ®Ô­ÌçÌçŧŦ¾þ¾ÿ¸ÿ¸ÿ³º³º¯=¯=«”«”¨É¨É¦ã¦ä¥è¥è¥Û¥Û¦½¦½¨‰¨Š«>«>®Ô®Ô³A³A¸{¸z¾s¾sÅÅÌ^Ì^Ô,Ô,ÜqÜqååîî÷÷XX ƒ ƒ€€RR#Ú#Ú,,3Â3Â:õ:öAA‘GGL³L³QQT³T³WkWkY¦>§¸§¹ª0ª0­ž­±÷±÷·1·2½?½?Ä Ä Ë…Ë…Ó–Ó–Ü)Ü)å$å$îoîo÷ê÷ꄃ  XYww&@&?. .Ÿ6z6{=½=½DPDQJ#J"O$O#SDSCVwVwX´X³YõYõZ4Z4YrYrW°W±TóTôQBQCL©L©G2G1@î@ï9ð9ï2I2H**!_!_KKññjjûÓûÓòFòFèàèà߼߼ÖöÖöΥΥÆâÆâ¿Å¿Å¹b¹b³Í³Ì¯¯«I«I¨t¨t¦ž¦Ÿ¥Ï¥Î¦¦§G§G©©‹¬Ï¬Ï±±¶'¶(¼"¼"ÂåÂåÊ^Ê^ÒvÒvÛÛä"ä"íƒíƒ÷÷ÒÓ q pää"#& & .‰.‰6~6~=Ø=ØD}D}J\J[ObOaS‚SV®V®XÜXÝZZZ*Z*YFYFWZW[ToTpP‹PŒKºKºF F ?‰?ˆ8M8M0k0j'÷'øÆÆ ? ?‘‘øÚøÚï8ï7åÆåÇÜ¢Ü¢ÓæÓæË«Ë¬ÄÄ ½!½!¶ü¶ü±¯±±­N­M©ã©ã§{§z¦¦¥Ê¥Ê¦‡¦†¨Q¨Q«$«$®÷®÷³¿³¾¹m¹n¿ò¿òÇ9Ç9Ï,Ï,×µ×µà¸à¸êêóÃóÂýŽýfg  zy#œ#,U,T4‹4‹<$<$C C I,I,NqNqRÌRÌV1V0X“X“YëYëZ6Z6YqYqWŸW TÆTÆPëPìLLFjFj?à?ß8”8”0œ0((  ¥¥ ü ý./øZøYîšî›ååÛÕÛÕÓÓÊÄÊÅÃ!Ã"¼8¼9¶¶°æ°æ¬Ÿ¬¡©[©Z§§¥ò¥ò¥Ü¥Ü¦Ü¦Ü¨ï¨ð¬¬°3°2µNµN»P»QÂ)Â)ÉÂÉÂÒÒÚÕÚÕääí¹íº÷’÷’†† Y Ywy'Œ'Œ0)0)8182?’?‘F.F-KöKõPÓPÓTºTºWžWžYtYsZ7Z7YäYåX|X|VVRRMýMýH‰H‰B2B3;;3435*¹*¹!¹!¹NN–—±°úºú»ðÕðÕççݱݲ԰ԱÌ7Ì5Ä]Ä^½>½>¶ð¶ñ±‡±‡­­©¦©¥§G§H¦¦¥Ö¥Õ¦Ç¦Æ¨Ò¨Ñ«ò«ò°°µDµE»Z»YÂJÂJÉþÉÿÒaÒaÛUÛTä¿ä¾î€î€øzø{  DEÉÉ(è(é1‹1‹9‘9‘@ç@åGnGnMMQÏQÏU…U…X/X/YÃYÃZ°>µµ»Û»Úà à ËËÓ¯Ó°ÜñÜñæ¨æ¨ð¶ð¶ú÷úøLLuuee##,3,44Ò4Ò<Ã<ÃCîCíJ8J8OOSÞSàWWY7Y7Z-Z-Y÷Y÷X™X˜VVRnRnM·M¸GÿGÿAUAU9Ð9Ð1Š1‹(Ÿ(ž*)KK $ %Ø×ö†ö‡ìTìTâcâbØÔØÓÏÇÏÈÇ]Ç\¿°¿°¸Ü¸Û²ö²ö®®ªGªG§œ§›¦¦¥Ì¥Í¦¯¦¯¨Á¨Á«ý«ý°V°VµÀµÀ¼%¼%ÃuÃt˓˓ÔfÔfÝÏÝÏç¬ç¬ñáñáüDüEºº$±$±-â-á6{6{>[>\EmEmK’K”P»P»TÓTÒWÌWÌYœYœZ>‘6¨6§..$½$¾ûûÚÛü ü ñ§ñ§çpçqÝŽÝÔ!Ô!ËJËJÃ(Ã(»×»Øµrµq° ° «¼«»¨Ž¨Ž¦¦¥Æ¥Ç¦7¦8§à§àª¼ª½®Á®Â³â³âº º Á+Á,É(É(ÑåÑäÛEÛDå$å%ïeïfùßùÞttéè"ö"õ,Z,Z5)5)=?=@D…D†JÝJÞP5P6TwTwW”W•YƒYƒZ;Z;YºYºXXUUQQKÓKÒE™Eš>m>o6g6g-¢-¡$;$:TT““ûûð~ðæ2æ2Ü@Ü@ÒÊÒÊÉòÉôÁÚÁÙº›ºš´Q´Q¯¯ªñªñ§þ§ý¦C¦C¥Å¥Æ¦‰¦Š¨Œ¨Œ«Ç«Æ°-°,µ±µ±¼?¼>ÿÃÀÌÌÕ,Õ-ÞÚÞÙééózóyþ%þ$ÍÍ==on'8'80y0x99@Ü@ÜGÆGÆM²M²RŒRŒVBVAXÆXÆZZZZXáXâVoVnRÆRÇMøMùHHA*A+9X9X0¹0¸'i'iŒDCµµþþó\ó\èßèßÞ´ÞµÕÕËçËæÃˆÃˆ¼¼µsµs¯ñ¯ð««¨a¨a¦p¦p¥Ä¥Ã¦`¦a¨B¨C«e«e¯¼¯¼µ:µ9»Ç»ÈÃQÃP˸˸ÔàÔàÞ¦Þ§èêèêó‚ó‚þJþJ  ««ôô'Ô'Ô1$1$9Å9ÅA•A–HzHzNYNXSSV±V²YYZ'Z(YøYùXƒX‚UÊUÊQØQØL¼L¼F…F†?M?N7-7..B.B$¬$­ŽSRú‚ú‚ïÄïÄåAå@Û Û Ñ„Ñ„È”È”ÀpÀo¹6¹6³³­è­éª©ÿ§W§W¥÷¥÷¥å¥å§#§#©¬©¬­w­w²x²w¸™¸™¿Æ¿ÆÇäÇäÐÖÐÖÚyÚzä©ä©ïCïDúúÛÛ]]$…$†.%.$77?H?GFŒF‹LÊLÉQíQíUáUáX–X•ZZZ Z XîXïVrVrR²R²M¾M¾G§G§@ƒ@ƒ8n8m/ƒ/‚%æ%纹$$LMû]û]ð}ð~å×åÖÛ‘Û’ÑÕÑÔÈÅÈÅÀ†À†¹6¹5²ð²ñ­Î­Ï©ã©ä§@§A¥í¥í¥ð¥ð§J§J©ö©÷­ë­ë³³¹n¹nÀÒÀÑÉ'É&ÒOÒQÜ(Ü'æŒæñQñQüTüS^^22ÄÃ&ë&ê0€09^9^AdAeHvHuNsNsSISIVãVãY4Y4Z2Z2YÚYÚX*X*U+U+PæPçKoKnDÓDÒ=1=14¤4£+L+L!M!MÎÍ ö ôííõâõáêûêúàdàdÖEÖFÌÈÌÈÄļ<¼=µoµn¯Ã¯Â«K«L¨¨¦D¦D¥Ç¥È¦©¦ª¨è¨ç¬y¬y±Q±R·^·^¾†¾…ƯƯϸϹققãâãâî³î³ùÆùÆùøÿ½¾%%.æ.å88@A@AG‹G‹MÁMÁRÊRËV‘V’Y Y Z+Z+YìYëXMXNUYUXQQK–K—DïDð=;=;4•4•+ + !!`` g f>>õõêêßgßfÕ;Õ;˶˶Âÿû9»9´‚´®ó®óª§ª§§­§­¦¦¥Ù¥Ù§ §©š©š­„­…²¸²¸¹ ¹!À¦À¥É'É'Ò‡Ò‡ÜÜœçCçBòJòJýŽýŽ×Öá៟(ç(ç2Ž2Ž;m;oCeCdJQJRPPT£T£WÞWÞY½Y½Z8Z8YLYKVüVüSRSRN[N\H+H+@Û@Ú8†8…/M/M%W%XÉÊÐÑ–•ùGùGîîã%ã&ثثÎÎÎÎÅ·Å·½Š½‰¶h¶i°p°p«¹«¹¨W¨W¦Y¦X¥Æ¥Å¦¡¦¡¨è¨è¬’¬’±‘±‘·Ï·Ï¿5¿5ǤǥÐüÐüÛÛåÄåÅðàðàüAü@Éɱ±( (1ï1ï:ô:õCCJJOúOùT–T—WÝWÝYÁYÁZ7Z7Y?Y?VÛVÛSSMþMþG©G©@,@-7«7ª.C.C$$dd?@àà÷t÷uì)ì*á0á0Ö³Ö²ÌßÌàÃÝÃݻӻӴá´á¯%¯%ª·ª¸§©§©¦ ¦ ¥à¥ß§+§+©é©è® ® ³…³…º?º?ÂÂÊúÊùÔ¶Ô·ß+ß,ê)ê)õ„õ„  w v©¨"~"},Ã,Ä6T6T??F²F²M(>(4ê4ê*½*¼ÊÊGFeeü\ü\ðbðcä¯ä¯ÙvÙwÎîÎîÅDÅE¼¥¼¦µ<µ;¯(¯'ª†ª†§m§l¥ë¥ê¦¦§Â§Ã««¯î¯ï¶:¶:½Ý½ÝƲƲВВÛNÛNæ·æ·ò”ò”þµþµ Õ Õ¨¨"",ï,î6÷6÷@@GðGðN’N“SÌSÌW…W…Y¬Y«Z7Z6Y"Y"VrVsR4R3LyLyE\E]<þ<þ3…3…))òò>=21ú úíøíùâ=â<× × Ì”Ì”Ãú¤º¤³~³}­»­»©{©{¦Ð¦Ð¥Ç¥Ç¦f¦g¨ª¨ª¬‰¬Š±ò±ò¸Í¸ÍÀöÀ÷ÊLÊMÔŸÔŸßÂßÃë|ë}÷ž÷žÞÞòòÂÂ''1«1ª;];]CûCûK]K^Q_Q_UäUäX×XØZ)Z)YÔYÓWÙWÙT@T?OOH~H~@Œ@Œ7h7h-=->";";—– … „þAþ@òòææÚ„Ú„Ï³Ï³ÅÆÅżî¼îµUµT¯ ¯ ªlªl§R§R¥ß¥à¦¦¨ ¨ «œ«°Å°Å·j·j¿o¿oȫȬÒôÒôÞÞéÞéÞööyxÆÆ¸º&4&30÷0÷:Ó:ÔC—C—KKQ8Q9UÓUÓXÒXÓZ*Z)YÑYÑWÉWÉTTNÚNÙHH@@6¶6µ,],^!0!0`` ( (üÁüÀðiðiä[ä\ØÓØÒÎÎÄ-Ä-»t»t´´®® ©¡©¢¦Û¦Ü¥Ç¥È¦l¦l¨Ç¨È¬Ï¬Î²n²n¹Š¹‰ÂÂ˪˩ÖSÖSáÎáÎíÛíÛúIúHÄÄ  øø*P*Q4Þ4Ý>j>jFÉFÉMÐMÏS\S]WSWSY YŸZ6Z7YYV@V@QÃQÃKµK¶D4D3;c;c1k1k&&ר¨ª01õ«õ«éXéYÝuÝtÒ9Ò9ÇßÇྜ¾œ¶›¶›°°ªþªý§œ§œ¥ñ¥ñ¦¦§ß§Þ«m«n°¤°¤·g·g¿—¿–É É Ó’Ó‘ÞùÞùë ë ÷÷**®®ÌÍ(d(d3/3/==E¦E¦LòLòR¿RÀVóVóYvYvZQ>JØJØBêBê9Ÿ9Ÿ/(/(#¹#º è èþþñ/ñ0ä£ä¤Ø¥Ø¥ÍuÍuÃLÃLºbºb²ã²ã¬ú¬ú¨Æ¨Æ¦]¦]¥Î¥Ì§§ª;ª<¯"¯#µ¹µ¸½×½ØÇWÇWÒÒݦݧêêöÒöÒÑР ))44>>FÈFÇNNSºS»W¯W¯YÔYÕZ!Z!X’X‘U-U-PPI7I7@ã@ã7676,b,b ¢ ¢33WWúRúQíkíjàäàäÕÕÊÊÀ)À*·¡· °›°›«>«?§ª§©¥í¥í¦¦¨"¨#¬ ¬ ±µ±µ¹¹ÁÚÁÛËÿËÿ×<×=ãYãZððý$ý$ C C#c#c.û.û9˜9™CCKKQ|Q|V:V:Y*Y+Z;Z;YhYhV²V²R)R*KåKåDD:µ:µ0(0($“$•89 Z Yþ:þ9ñ$ñ#ä\ä\Ø)Ø*ÌÎÌÏŠŠ¹“¹“²²¬M¬L¨H¨G¦"¦"¥ç¥é§§«7«6°¢°¢·Â·ÃÀrÀrʀʀյյáÖáÖîžîŸûÈûÈ "".C.A9 9 BBœJÃJÃQTQTV(V(Y&Y&Z©>¦€¦€¥Ê¥Ê§§ªsªs¯º¯º¶Ô¶Õ¿—¿˜ÉÔÉÔÕLÕJá¾á¾îáîàükül  OP$$0 0:ë:ëDzD{L‚LRÏRÎW?W?Y·Y·Z(Z'XŽXTôTóOkOlHH??4³4³))‡‡QRÁÁô$ô%æËæÊÚÚÎÎÃTÃT¹ò¹ñ²(²'¬'¬'¨¨¦¦¦¦¨¨¬:¬;²H²Hº º רÎvÎvÚzÚ{ç_ç_ôØô×––..]])ç)ç5y5x?Ö?ÖHºHºO÷O÷U]U]XÎXÎZ4Z4Y‡Y†VÉVÉR R KhKgCC99-Ñ-Ñ!}!|__ÉÉùù ëoëoÞOÞOÑ÷Ñ÷ƯƯ¼½¼½´[´\­½­¾© © ¦c¦c¥Ó¥Ò§_§`««°¢°£¸!¸"ÁRÁRËÿËÿ×å×ääÀäÁò?ò? â âDC( ( 3à3à>…>…G²G³O7O6TáTàXŽXZ*Z*Y¨Y¨WW RgRfKÏKÏCnCn9w9x.$.$!¸!¹€€ËËøêøëë4ë4ÝúÝúÑŒÑÆ8Æ7¼A¼B³æ³æ­Y­Y¨Ã¨Ã¦@¦@¥á¥á§©§©««Œ±w±v¹B¹BÂÀÂÀͷͶÙãÙãæûæüô°ô°ª©xyâã*›*›6O6O@¼@¼I I PÆPÇUÿVY.Y.ZÆqÆqÒÒÞÚÞÚìuìtúúÉɰ°$ $ 0‡0ˆ;Ò;ÒE¦E¦MÄMÄSùSùXXZZYÐYÏWUWUR²R±LLCmCm9,9--- ° °òñö´öµè±è±ÛAÛ@κκÃmÃm¹£¹£±›±›«ˆ«Š§•§•¥Ù¥Ù¦`¦_©(©(®!® µ+µ*¾¾ȯȯԬԬáÆáÆï¡ï¢ýíýî 3 3'e'e3±3±>´>µH(H'OÎOÍUrUsXõXõZ;Z;Y=Y=VVP™P™I*I)?á?á4ù4ú(»(»tt y yÿ%ÿ%ðÖðÔâçâæÕ³Õ´É’É’¾Ò¾Òµ¸µ¹®„®ƒ©b©b¦v¦v¥Ò¥Ò§~§~«m«m±ˆ±ˆ¹¥¹¥Ã“ÓÏÏÛÎÛÍé{é{÷À÷À99no"""!.ù.ù:Ÿ:žDÉDÉM3M3S§S§WùWøZ Z YÓYÓWMWNR‹R‹K¬K«BÙBÙ8O8O,S,R10??ÚÛôaôbæ3æ3ددÌ,Ì-ÁÁ·u·u¯É¯Éª0ª0¦Ó¦Ò¥Ä¥Ä§§ª«ª«°€°¸i¸hÂ0Â/͕͕ÚLÚMèèö[ö[øùaa!;!;.A.@::DeDeLóLóS†S…WëWëZ Z YÒYÒWDWDRpRpKvKuB‚Bƒ7Ò7Ò+ª+ª]^DD»¼ó'ó&äääå×Z×YÊÜÊܿſŶ]¶]®å®å©©¦‚¦‚¥Ñ¥Ñ§ƒ§ƒ«Œ«Œ±Ô±Ôº,º-ÄcÄdÐ.Ð/ÝAÝBëBëBùÑùÒŒ‹ðñ$»$»1’1’==G G OOUUXÕXÔZ:Z:Y=Y=UäUãPCPBHH>Ñ>Ó3w3w&½&¼ùù Š ŠûÑûÒí3í2ßßÑÕÑÕÅÐÅлY»X²·²·¬&¬&§Ô§Ô¥â¥â¦Y¦Y©<©<®r®sµÞµÞ¿I¿JÊwÊu××äÒäÒóIóJ""ÛÛ  ,r,r8¥8¥CXCWL=L=SSW¹W¹ZZYÜYÜWMWLRdRdKCKCBB7%7%*²*³²²ÿåÿåññâ®â®ÕÕțț½¦½¦´´~­f­f¨Œ¨‹¦¦¦¦¨…¨„­\­\´x´x½§½¦È©È¨Õ1Õ1âèâçñlñl[[00”“+/+/7œ7B‰B‰K§K¨R·R·W…W…YòYòYèYéWlWkR‡RˆKaKbB*B*7!7 *‘*‘×ÖNNÿaÿaðuðváõáõÔHÔIÇÏÇмã¼ä³Ñ³Ð¬Ú¬Ø¨0¨0¥õ¥õ¦:¦:¨þ¨ÿ®/®/µ¦µ¦¿2¿3ʋʌ×g×gåeådô#ô$54 w v-ö-õ:0:0DÑDÑMŠM‹T T X`X`Z-Z-YyYyVHVHP±P²HÚHÚ>ù>ù3X3X&D&C J Jú1ú0ë@ë@ÜãÜãÏÏ€ÃzÃz¹$¹$°Í°Ìª¯ª¯¦ø¦ø¥Ä¥Ä§§ªöªø±;±;¹º¹¹Ä7Ä7ÐgÐhÝôÝõìwìxûû º º‚'›'š4”4”@@IÏIÎQsQsVÌVÌY´Y³ZZWéWéSASAL?L>CC7ý7ý+R+Qih©©ÿ~ÿ}ðSðTášášÓ½Ó¾Ç#Ç"¼&¼%³³¬=¬=§Ç§Ç¥Ø¥Ø¦¦©¸©·¯l¯k·r·rÁÁŽÍzÍ{ÚÚÚÚéQéPøoønÉÉÒÒ%,%,2}2}>Z>ZHsHtPzP{V5V6YwYwZ+Z+XFXGSÛSÚMMCôCô8ñ8ï,E,ETS€€77ðìðìââÔ ÔÇPÇQ¼8¼8³³¬0¬0§¹§º¥Ô¥Õ¦¦©ç©æ¯Â¯Ã·÷·÷ÂHÂHÎhÎhÛþÛþê¢ê£ùëùë a avv&Õ&Ô44?×?ÖI¾I¾QQVçVçYÄYÅZZW¦W¦R¸R¹K_K_AÐAÑ6T6T)?)>óò Û ÚühügííÞBÞBÐsÐrÄĹ`¹`°Î°Îª‘ª‘¦Û¦Ú¥Ç¥Ç§`§`«˜«™²T²S»]»]ÆsÆsÓ@Ó?ácádðqðqÿúÿû||pp,„,„9H9HD^D^MpMpT:T:XˆX‡Z6Z7Y:Y:U˜U˜OlOlFäFä/Î/Î!ï!ð  ——ôôäÌäËÖaÖbÉ4É4½©½©´´¬Ñ¬Ñ¨¨¥á¥â¦r¦q©³©´¯¯·Ù·ØÂRÂRΧΧÜ~Ü~ëfëfúöúõ ßÞ(b(b5®5®AcAcK!K!R¡R¡W¦W¦Z Z Y¸Y·V²V³QQHûHü>²>³2„2ƒ$Ë$Ìööstö¾ö¾çMçNØØËË¿6¿6µHµH­Ÿ­Ÿ¨y¨x¥ý¥ý¦A¦B©D©D®ï®ï··Á{ÁzÍÊÍÊÛ¨Û¨ê¢ê¢úKúK rr((5…5…AUAVK'K(R³R³W¸W·ZZY©Y¨VƒV‚P·P·HsHr=ô=ô1Ž1Ž# # š™îíõõå›å›ÖëÖëÉ}É~½½½¼´ ´¬­¬­§å§å¥Ø¥Ø¦–¦–ªª°M°M¸ú¸úÃßÃÞУУÞäÞäî.î.þ þ à ß>>+¼+»8à8ßDCDCM‹M‹TnTpXµXµZ;ZN>E E 9Ú9Ú,Æ,ÆIJÛÛþòþòïïß¶ß¶Ñ\Ñ\ÄwÄw¹o¹n°°œªHªI¦¦¦¦¥Ô¥Ô§Ù§Ù¬§¬§´´½í½ìÉÛÉÛ׃׃æsætö6ö5II%!%!33?`?aI¹I¹QÀQÁW7W7YïYîYÒYÒVáVàQ1Q1HñHð>`>`1Ö1Ö#¶#¶ss‰ˆôwôwäÁäÂÕèÕéÈeÈd¼¦¼¥³ ³ «â«ã§j§j¥Æ¥Å§§««±î±î»B»BÆÊÆÊÔ,Ô-â÷â÷òµòµßÞר"6"500=A=AHHP“P“V…V†Y³Y´ZZWrWsRRJJ?±?±3B3B%+%,âââáõ¯õ°åÐåÑÖÇÖÈÉɽ$½$³\³]¬¬§{§{¥Æ¥Æ¦þ¦ÿ««±þ±ý»j»jÇÇÔ›Ô›ãŒãŒóoóo¹¹ÉÉ#9#91‡1‡><>;HïHïQGQGVýVýYáYáYÛYÛVéVèQ#Q$H¹H¹=ï=ï11"²"²!"ïïò£ò£âÅâÅÓÛÓÚÆaÆaºËºË±z±zª½ª½¦Í¦Í¥Î¥Î§È§È¬­¬­´Q´Q¾y¾xÊÊÊËØâØãèFèFøyøyååíì()('66B9B8L3L2S¬S­XgXgZ7Z8YYTõTöNND‘D‘8Î8Î+(+( ûŸûŸëTëUÛ¹Û¹ÍOÍPÀ–À–µøµø­Ò­Ñ¨i¨i¥ì¥ì¦u¦t©û©û°e°e¹{¹{ÄñÄòÒcÒcáaá`ñfñeîî]^""0¶0¶=´=³H¦H¦Q-Q-VþVþYçYèYÏYÏV´VµP³P³GûGû<×<×/§/§ Û ÜóôxwïõïõßüßûÑÑÃÃÃøy¸y¯›¯š©t©u¦=¦<¦¦¨ó¨ô®Î®Í·j·j‚‚ϱϳތތî‰îŠÿ&ÿ%Á¿¹¹.§.¨<<GWGVPAPAVuVuY»Y»YõYõW!W QVQUHÅHÅ=¹=¹0‘0‘!¿!¿ÅÄ,-ð‰ð‰àkàkÑ`Ñ`ÃíÃí¸ˆ¸‰¯˜¯–©i©j¦6¦5¦¦©©¯¯·à·ßÃ*Ã)ÐÐߛߛïÅï҇::!>!?0%0%=d=eHŒH‹Q4Q3WWYòYóYºYºVjViPPG G ;ƒ;‚-ë-꺹vvý±ý±ìýìþÜóÜóÎÎÁÁ¶¶­Ã­Ã¨I¨J¥á¥á¦¦žª}ª|±Z±YºùºúÇÇÕÕä¦ä§õ3õ3²±&„&…55A¦A¦LLS»S»X‡X‡Zû3û3êSêRÚ6Ú7ËtËs¾¾‘´´¬4¬5§e§d¥Ä¥Ä§c§c¬3¬3´´ ¾ž¾žËËÚjÚkê ê û¢û¢ Æ Æ]\,é,è:Ú:ÚF±F±PPVqVpYÆYÆYáYáVÀVÀP~P~GTGT;•;–-¯-¯  w xüPüQëJëJÛÛÌÌ¿¿´L´L¬Z¬Y§q§p¥Ä¥Ä§b§a¬>¬<´(´(¾Ý¾ÝËôËóÚöÚöëUëUüzüy ½ ¾fg-ø-÷;Þ;ÝG™G˜PºPºVëVëYòYñY¯Y¯V'V'OwOwEàEà9·9·+o+pŽ © ©ù\ù]èNèMØØÉaÉ`¼§¼¦²j²j««¦Ê¦Ê¥Ø¥Ø¨=¨=­ä­ä¶—¶—ÂÂÏÂÏÂßLßLððll¢¢#&#%2a2b?Â?ÃJËJËSSXHXHZ9Z9XÕXÔT%T$LULUA¯A®4–4—%Š%‰ÔÔònòná†á‡ÑÁÑÂõõ·é·è®Î®Ï¨½¨½¥ó¥ó¦ˆ¦ˆª{ª{±¥±¦»Ã»ÅÈuÈu×A×@ç—ç—øÛøÛ g gwv+z+z9ä9ãF!F OÁOÁVdVdYËYÌYÓYÓV}V|OäOãFIFI::+”+•zz U VøËøËçƒçƒ×(×(ÈWÈW» »¡±±‚ª\ª]¦x¦x¥ü¥ý¨î¨î¯3¯3¸¸‹Ä¢Ä¢ÒþÒýããôFôGóóNN'¼'¼6°6°CCŽMáMáUW?Q Q G·G·;š;›-+-,ûü ª ªùâùâèUèUײײȟȟ»³»³±p±qª>ª>¦e¦e¦ ¦ ©<©;¯Ð¯Ð¹Œ¹ŒÆ Æ ÔÕÔÕåPåPößöÞ¿¿11*¤*¥9n9oEþEþOÓOÓV‹V‹YáYáY³Y³VVNñNñDÈDÇ7è7ç(Õ(Ö&%‚ô™ô™ã"ã"ÒÌÒÍÄ@Ä>¸ ¸ ®²®±¨Œ¨¥á¥á¦Ç¦Æ«8«8³ ³½ê½ëËmËnÛ Û ì$ì$þ þ !=!=1,1-?+?+J¬J«S9S9X|X{ZÑ>Ñ0³0³ ¢ £DDýFýGëcëdÚQÚRʿʿ½O½N²‰²ˆªÝªÜ¦¦œ¥ó¥ò¨ê¨é¯a¯b¹¹űűԤԤåXåY÷#÷# L Lûû+“+“:q:qFöFöP§P¦WWZ ZYcYcUU MmMmB›Bœ55%n%o??=<ð"ð"ީާΈ·ÀhÀh´Ú´Û¬\¬\§D§D¥È¥È§ú§ú­Å­Ä¶ë¶ëÃÃѳѲâ?â?ôôKK<<)%)$8j8jEcEcOŽOŽVzVzYåYäY¤Y¤U¼U¼NSNSC¶C¶6S6S&µ&µggñ(ñ(߃߃Ï3Ï3ÀâÀâµ+µ*¬…¬…§S§R¥Ç¥Æ§÷§÷­Ê­Ê··ÃIÃIÒÒâÄâÃô±ô²  **9A9AF(F(P+P,VãVãZZYnYnU&U%MVMVBSBR44$™$™ÕÕîîÜçÜæÌÀÌ¿¾º¾º³m³m«Q«R¦¿¦¿¥é¥ê¨Ú¨Ù¯o¯p¹j¹jÆZÆYÕ¹Õºæàæàùù › ›††.:.:==I>I>RnRoX,X,Z;Z">#/{/{ÕÕ à ßú^ú]èèÖÐÖÐÇDÇDºº¯é¯é©©¥÷¥ö¦¦¦¥«« ³6³5¾’¾’Ì¶Ì¶Ý Ý îáîáuvââ%q%q5q5qC-C-NNU¯U°YªYªY×Y×V5V4NçNæD=D>6¬6¬&Å&Æ55¼¼ð"ð#Þ5Þ5ͷͶ¿^¿^³É³É«x«x¦È¦Ç¥é¥ê¨í¨í¯°¯°¹é¹êÇ)Ç(ÖßÖßèZè[úãúä – ”ŸŸ0W0X>û>üJñJðS°S°XÙXÙZ0Z1W¨W¨QZQZGŠGŠ:¤:£+3+3åäuvô²ô²âiâhÑgÑgÂgÂh¶¶¬õ¬ô§p§p¥Ç¥Æ¨ ¨ ®$®$·Ò·ÒĦħÔÔåpåp÷û÷ú Ù Ù&&.3.3=@=AI§I§RÝRÝXxXyZ;Z:>:J|J|SzSzXÊXÊZ2Z2WWQ+Q,G"G!9ò9ñ*/*.ŒŒÑÑòÑòÐàdàdÏ_Ï_À‚À´v´v«Ç«Ç¦Ú¦Û¥è¥è¨ü¨ý¯ö¯õº†º†È4È4ØeØfê]ê\ýUýT\\"—"–3N3NA¼A¼MAM@URUQY—Y—YÚYÚVVN€N€CaCa5:5:$¯$°~}ÿtÿtìoìoÚIÚIÉÕÉջѻаްݩ}©}¦¦¦Ÿ¦Ÿ«E«E³Ä³Ä¿·¿·Î™Î™ß»ßºòWòV’‘qr*8*9::G`G`QnQnWÏWÏZ8Z9XŒXŒRÝRÜIlIk<¤<¤--‚‚§§õdõeââœÑ*Ñ)ÁØÁص]µ\¬I¬I§ § ¥Ü¥Ý¨Ò¨Ò¯Ç¯ÇºoºnÈHÈGششêðêïþ+þ+ff#Ê#Ê4’4“BõBôNJNIV V YÛYÜYŽYU'U&LÕLÔ@û@ü2#2# ú ûJKúñúñçÐçÐÕÌÕËŸŹ¸V¸V®C®D§ù§ù¥Ä¥Ä§¾§¿­Ó­Ó·¼·¼ÅÅÕ Õ ççúIúI ¿ ¿ x y1¸1¸@¬@«L£L£U UY‰Y‰YÜYÝVVN,N,B¯B¯44##bcüòüñé¢é¢×\×\ÆüÆû¹D¹D®Ý®Ü¨C¨D¥È¥È§‰§Š­u­t·E·EÄ‚Ä‚Ô‘Ô‘æ®æ­ùÿùþ › œ { }1Ñ1Ó@Ø@ÙLÔLÕU9U9YœYœYËYËUÀU¿M¬M¬AíAî33!Í!ÍíîûUûVçõçõÕ¶Õ¶ÅvÅv·ú·û­ê­ê§¾§¾¥Å¥Ä¨¨®™®˜¸þ¸þÆÆÆÇ×O×NéÇéÇýWýXüý#¾#¾4Õ4ÕCiCjNÍNÍVuVuZZYEYDTGTHKFKF>«>¬//56 ó óö4ö4âëâëÑÑÁ^Á^´·´¸«°«°¦³¦´¦¦©®©­±±€½½ËùËøÝYÝZðiðj>=ÅÅ*$*%:ƒ:‚HHR,R,XSXSZ:Z;WÈWÈQQFF€88~'¾'¿[[í“í”گڮɗɖ»"»"°°¨Ï¨Î¥Ö¥Õ§C§B­­¶Ö¶ÕÄ;Ä;Ô‘Ô‘ççú¼ú¼¨§!È!È3L3LBPBQNNVVYðYïY]Y[TlTlK\K\>›>›.È.ɪª ! !õ#õ$á­á¬Ï±Ï±ÀÀ³š³šªäªä¦_¦_¦G¦Gªª³-³-¿‹¿‹ÏÏááô¥ô¤ÂÂWW.ƒ.„>k>kK@K@TbTbY\Y[YìYíV V MêMêAëAì2¨2© à à u uù\ù[å–å–ÓÓÂßÂßµ«µª¬+¬+¦Ù¦Ù¥û¥ú©©±’±’½x½v̱̲ނނòò;;,•,”<à<áJ"J!S´S´YYZ Z V}V}NšN›BÆBÇ3˜3˜!Ò!ÑVVú!ú æ5æ4Ó’Ó’Ã+Ã+µÓµÔ¬9¬9¦Ú¦Ú¥ü¥ü©¬©­±¼±½½Å½ÅÍ,Í,ß+ß*òÔòÔ-.-“-“=Î=ÏJëJêTBTBYXYXYéYêUîUïM˜M™ARAR1º1º™š Ü Ü÷‚÷ã“ã“ÑÑÀüÀü´´««¦d¦d¦L¦LªÌªË³¬³¬ÀvÀvЇЈãã÷ ÷ ~ ~CC1u1vA#A"MMUæUçYêYêYTYST*T)J­J­=[=[,á,áòòñ|ñ{ÝÄÝÄËÏËμ‰¼ˆ°¾°¾© © ¥Ù¥Ù§P§Q­b­d·Á·ÀÅßÅß××êNêOþ¾þ¿((&Œ&Œ7ú7ùF‚F‚QhQiXXZÛ&Û&ïïÐÑUV+„+„X>XKÌKÌUUYÀYÀYvYwTBTAJjJjÙ>ÙL³L²UõUõZ Z X½X½RRFzFz6Ÿ6Ÿ#v#v'&÷ú÷ùâGâGÎ_Î_½w½v°•°”¨…¨ƒ¥Ä¥Ä¨¨°°½u½vÎnÎnâlâkø?ø?{|#Ç#Ç6ð6ïFÂFÂRMRMXÚXÚZZU¯U¯L&L%=ö=ö+ÿ+ÿUU>=ëëÖ(Ö'ÃÌÃ̵ µ!« « ¦,¦-¦Ó¦Ò¬ô¬ô¸4¸5ÇáÇáÛÛðuðuß߯Æ0â0âBBOOW\WZZ;Z?pq--??MMVAVAZ!Z"XiXiQ1Q0DêDé4V4V } ~ š ›ôôÞ=Þ<ʆʅº&º&®&®&§F§G¥ú¥ùªSªS´´™˜ÕÕê꣤,,>2>1L{L{UúUûZZX‰XŠQmQmE.E/4”4“ ¦ § ¨ §óûóûÞÞÊDÊD¹ß¹ß­ê­ê§'§'¦ ¦ ª ªŸ´¥´¦ÃxÃwÖ'Ö(ë‚ë‚12±±--Œ?Ž?ŽM‰M‰VœVœZ0Z1X X PNPNCtCu2N2Mðð©¨ðàðàÛ Û Ç•Ç”····¬w¬x¦’¦’¦i¦j¬¬··Æ²Æ±ÚÚïìïìÓÓ661®1®CBÿPPWîWðZ3Z3V°V¯M˜M—?‚?‚-T-U:9ŒêÄêÃÕWÕWǻ³ó³óª'ª'¥ë¥ë§„§†®Þ®Þ»~»̓̔áá÷{÷z„…$†$…8$8$H&H(S~S}YnYnY’Y‘SæSæHÅHÅ8é8é%W%WUUøOøOáÈáÉÍ7Í8»÷»÷¯(¯&§¡§ ¥ä¥äªª³á³à²³ÕÕë6ë5??  ././@V@UNHNHWWZÖ>Õ+‹+Š)*ýGýFå”å“ϼϼ½P½Q¯Ÿ¯Ÿ§¥§¤¥ò¥óª©ªªµwµxŘŘÙçÙçðððï   s s5†5…FÐFÐSSYoYnYmYmS S F¿F¿5d5c 6 6¸¹ð˜ð™ÙÙ‘ÅHÅGµ2µ2ª{ª{¥è¥ç§Î§Î°°¾¾ÐÛÐÛç ç ÿ ÿ -T-T@j@jNàNàW±W°Z1Z1V7V7LL*>+)û)ú–—ùÇùÈáoáoËfËg¹^¹^¬´¬´¦c¦d¦é¦é®=®=»Ò»ÒΡΡå8å8ýãýâ²±-®-®A5A5OÆOÇXDXEZZTéTéIOIO88"‘" b bñfñfممėė´9´9©®©®¥Ç¥Æ¨Ö¨Ö²²ÂbÂbÖéÖéî¤î¤±²  5ü5þGÄGÅT T YÖYÖX¶XµP¿P¾BŠBŠ////,-ÿHÿHæpæpÏϼo¼o®®Œ¦þ¦ÿ¦[¦\¬´¬´¹‹¹‹ËåËåâOâOûû22+©+¨?Á?ÁNæNæWìWìZZUHUGIÎIÎ88"ç"ç € €ñFñGÙ/Ù/Ä!Ä!³À³Á©\©\¥Ã¥Ã©C©D³”³–ÃïÃîÙÙñ1ñ1 † †"ï"ï8 8 IãIãUZU[Z!Z WÑWÑN™N™?0?/*Ë*Ëù¸ù¸àêàêÊʸk¸k«ñ«ò¦ ¦ §r§q¯É¯É¾ƒ¾ƒÒtÒsêê[[RR33EÂEÂRñRòYY‘YYQ…Q…CzCz00ÑÑÿ”ÿ”æ^æ]Ï0Ï0»æ»ç® ® ¦À¦À¦˜¦˜­œ­»=»=ÎeÎeå‹å‹þÖþÕ67//CCQQQRYYY˜Y˜RüRýE¸E¸2Ø2Øáᨨé8é7љљ½¶½·¯+¯+§&§&¦N¦O¬º¬º¹ä¹åÌÀÌ¿ãÄãÄýý¨§.I.IB2B1PÆPÆXÓXÔY¶Y¶SSSSF2F13]3]]]  éyézѸѸ½º½º¯¯§§¦Y¦X¬ê¬êºEºEÍWÍXä’ä‘þþ·¶/U/TCCQkQkYYYYR™R›DòDñ1¢1£BBµ·ççÏ…Ï…»ë»ê­è­è¦¦¦¦¦À¦À®6®7¼o¼oÐ=Ð=èçÿÃÃJJ2Ž2E±E²SSY«YªXÙXØP´P´AäAã-¡-¡•–û¿û¾â>â>Ë4Ë5¸ˆ¸‡«Ê«Ê¦ ¦ §Æ§Å°Ú°ÚÀŠÀ‰Õ…Õ…î î !d!d7ä7ãIÆIÆU†U‡Z/Z/WUWTM6M6<¤<¥''ô ô ÚðÚñÄïÄð³ß³Þ©.©.¥Æ¥Æ©ò©òµZµ[Ç Ç ÝÝŒöõöô%&)Ð)Ð>ó>ôNÖNÕXXYÿYþTQTRGŒG4Á4Á‚ÄÃé±é±Ñ~Ñ}½7½7®“®“¦Ó¦Ô¦¡¦¡®®¼]¼\ÐvÐvèœè›ÅÅŸŸ44GG T T YòYòX9X9OO??)Ð)Ñö÷ö¨ö¨Ý"Ý"ƓƓ´é´è©¦©¥¥Ã¥Ä©›©š´×´×ƇƇÝ$Ý%öÈöÈ&&)þ)þ?J?IO-O,XPXQYæYåSÊSÊFF€3+3+ooTUççÏÏ»»­(­)¦W¦W§B§A¯Ø¯Ø¿\¿]Ô~Ô}íaíaìì!·!¸8‹8ŒJˆJˆVVZ>(<(<ÚÙô)ô)Ú}Ú~ÄIJõ²õ¨’¨“¥Ý¥Ý««·É·ÉÊÚÊÚâœâœüüüü››00DTDTR˜R™Y YžXÄXÄPP@a@`*ù*ùÄÄöüöüÜüÜüÆÆ´G´G©0©0¥É¥Éªeªe¶›¶œÉ[É[àøà÷û]û\**.ç.çC‚C‚R$R$YY€XìXëPqPq@Ñ@Ò+k+j%$÷=÷=ÝÝÆÆ´8´8©©¥Ì¥ÍªŒªŒ¶ö¶öÉïÉîáÄáÅüUüV"#/Ý/ÜDUDTR³R²Y®Y®X¡X¡O¤O¤??€)©)©õõÚòÚòÄ2Ä3²Ö²Õ¨l¨l¥ê¥ê«Ž«Ž¸Ô¸ÔÌÌŽäòäòÿÐÿÑžž2þ2þFÌFÌT7T7Z Z W¼W¼M~M~<<<<%ƒ%„ a að4ð4ÖsÖsÀwÀw°?°?§J§I¦g¦g­²­²¼€¼€Ñ}Ñ|ê¹ê¹ðñ ‰ ‰8!8!J¦J¦V_V^Zó>ŸŸ(•(•>Û>ÛO[O[X•X”YªYªRRCºC¹.µ.µ^_ú ú ßDßEÇÇ´õ´ô©\©[¥É¥Éª—ª˜·T·SÊÕÊÕãHãHþpþo¶¶2ƒ2‚F©FªTFTFZZW…W…LÖLÖ;;#¯#®  í‚í‚Ó·Ó·¾ ¾ ®…®…¦œ¦›§§¯Û¯ÛÀ)À*ÖvÖxð¯ð¯ W W&¿&À=‹=ŒN›N›XRXRYÇYÈRÒRÓDD.ý.ýutùãùäÞåÞäÆþÆþ´v´v© © ¥Ô¥Õ«"«"¸v¸vÌ’Ì‘ååaa55H«H«UyUyZ9Z:VsVsJJ7€7>>è`èaÎúÎúº;º<¬¬¥ø¥ø¨h¨g³0³1ÅQÅQÝ Ý ø%ø%íì-Ã-ÃCHCIRgRgY±Y²XoXpNÀNÁ=Œ=‹&t&u ­ ­ïÆïÇÕiÕj¿¿¯ ¯ ¦º¦¹¦ÿ¦ý¯Ï¯ÏÀ[À\××ñ¯ñ± ­ ¬(G(G? ? OÇOÆXÛXÜYgYgQZQZAwAw+D+DääôßôßÙëÙê¡ ±E±E§‡§†¦[¦[­à­à½`½aÓYÓXí°í° É É$Ù$Ù<]<]NNX2X1YËYÊR­R®CŠCŠ-Õ-Õ©©÷÷ÜFÜFÄtÄt²q²q§ý§þ¦$¦%­­¼%¼$ÑÛÑÛììSR# # ;t;uM€MWüWûYàYßR÷RöCðCð.=.=÷Ê÷ÉÜ`Ü_ÄqÄr²`²^§ï§ï¦-¦.­H­H¼¼Ò‚Ò‚ìøì÷ T T$¯$°'? S Tî7î7ÒóÒò¼_¼_¬Ù¬Ù¦¦¨–¨—´S´RÇþÇþáŒá‹þPþO))5+5+I¥I¥VnVnZ/Z/T€TE÷E÷00''÷ü÷ûÛ¥Û¦Ãðÿ±§2§1¦À¦Á¯º¯ºÁ2Á2ÙMÙNõ‰õŠÎÎ. . DyDyS¯S°ZZVýVüJ²J³6‚6‚ŒŒÿŒÿŒâ—â—ȻȻ´½´¼¨¹¨¹¥þ¥þ¬Õ¬Õ¼‹¼‹ÓpÓqïï ‘ ‘(™(˜@Z@ZQFQEY‘YXVXUM´M´:È:É!—!–ÌÌç|ç{ÌÇÌÇ·‹·Šªª¥È¥Ç«/«/¹²¹±ÏÅÏÄë ë “”%%=§=§OŸOŸYYXøXøOPOQ=$=$$b$b´´ê.ê.ÏÎÿ¹¹ªÕªÔ¥Ä¥Äªvªw¸l¸lÎ%Î%éGéFçç#³#³<<œOOXÞXßY#Y$OÀOÀ=º=º%%AAê˜ê˜ÏAÏA¹3¹3ªÙªÙ¥Ã¥Äª†ª‡¸›¸›Î΂éÐéД•$y$y=R=RO‡O‡YYXëXëOO<‘<#p#qnnè´èµÍ…Í…·Ý·Üªª¥Ê¥Ê«b«aºKºKÐâÐâì¯ì¯ ž 'I'J?©?©QQY‘Y‘X;X;M0M09¥9¥¾½SSä£ä£ÉöÉ÷µ@µA¨Î¨Ï¦¦­1­1½½ÕRÕQñÓñÔïï,1,1C‰CŠSoSoZZVÆVÆIÒIÓ4®4®¬¬ûÌûËÞ`Þ`ıı±›±›§B§C¦Ó¦Ó°Z°ZÂÍÂÍÜÜùsùs~~2Ø2×HHV,V-Z/Z/TTD£D¢-w-x22òüòüÖ9Ö9¾$¾#­s­s¦ ¦ ¨Ã¨ÃµQµQÊLÊMå[å[nn!!:é:êN1N2X°X¯Y4Y3O©Oª=#=$#´#´::èè̉̊¶Û¶Ý©v©w¥â¥á¬ˆ¬ˆ¼«¼«ÔzÔzñ=ñ=·¶,R,SCáCáSÅSÅZ'Z'VPVOH©H©2½2¾ø²ø±Û,Û,Á×Á×¯š¯š¦‹¦‹§¸§¸²ÿ²ÿÇÇáÁáÀÿäÿä8 8 LÌLÍX2X2YƒY‚P•P•>j>j%%{{ééÍ+Í+·,·+©Œ©Š¥ã¥â¬œ¬¼ú¼ûÕÕò0ò/ãâ-Œ-ŒD÷DöTuTvZ7Z8U”U•GG 0R0QúúõPõR×á×á¿¿­Ï­Ï¦¦¨Ê¨Êµ¨µ¨Ë.Ë/æÞæÞ……#u#u=;=;OïOïYYYYXdXdM%M&8ê8ë  ÿ§ÿ¨áLáLƃƂ²o²p§n§n¦Ì¦Í°ž°žÃÄÃÃÝüÝûü:ü9ãä6R6SKlKmWµWµY¹Y¹Q8Q9?0?0%º%ºÒÓèüèûÌ×ÌØ¶¸¶·©9©9¥ø¥ø­Y­Y¾€¾×k×iõ%õ%--0¾0½GŠG‹UïUïZ.Z.SÇSÈCxCx+++, ¾ ¿î°î¯Ñ©Ñ©º º!ªãªã¥Ä¥Å«b«a»»ÓÓðRðRxx,µ,µDªDªTvTvZ;Z:UAUAFF .Ÿ. ŒŒò_ò_ÔÌÔͼe¼e¬¬¥Í¥ÎªYªX¹/¹.ЇЇí™íš å ä*‹*‹CCS¨S¨Z,Z,UãUâGHGG00"#óÚóÚÖÖ½;½;¬~¬~¥Õ¥Õªª¸µ¸¶ÏýÏüíí ƒ ƒ*Z*[C C S«S«Z-Z.UÏUÎG G /¬/¬‚ƒóóÕ;Õ;¼Ž¼¬¬¥Ì¥Ìªª¹¤¹¤Ñ^Ñ^îÐîÏWW, ,DfDgTsTsZûûà“à“ÄUÄV°°¦[¦[¨¢¨¡¶‘¶‘ÎPÎQì´ìµ µ µ,Ë,ËEæEæU¸U¹Z ZR„Rƒ?ã?ã$·$¸ ¡ãèãèÆïÆï±™±˜¦Æ¦Å§ë§ì´è´éËÿËÿêê & %*š*šDbDbTýTþZ4Z5SNSNA3A4&Q&QCBåYåXÈȲ<²<¦ó¦ó§´§µ´i´jË^Ë^éwéw ¦ ¦*N*MD:D:TõTõZ4Z4SAS@AA%ø%øÁÁä¾ä¿ÇmÇm±Ê±Ê¦Ë¦Ì§ñ§ñµµÌ|Ì}êíêî : ;+Ç+ÇEgEgU—U—Z!Z!RcRb?f?f#¿#¿23â4â3ÅEÅE°_°_¦c¦b¨°¨²¶þ¶ÿÏWÏWîcîcãâ//GàGßVÎVÎYÒYÓPƒPƒ<"<"yyþxþxݩݩÁ“Á•®®¥í¥ìª2ª2ºZºZÔ&Ô&ô ô ––44K`K`XIXIYYMgMh77!!÷¬÷¬×[×[¼¬¼­«X«X¥É¥É¬Ê¬Ë¿g¿fÛÛû×ûÖ'):d:dOŠOŠYŸYžWÀ=ÜtÜtýÄýÄbbd>e!R!RÿVÿVÝqÝqÀÀž­­¥É¥É«Á«Â¾*¾+ÚLÚKüüLM< < PþPýZZUÆUÇDâDâ)Ò)Ò‘ææÇSÇS±±¦b¦a© © ¸£¸¤Ò×Ò×óÄóňˆ5à5ßM8M7Y$Y$WÔWÔI}I}0606ÁÂìðìðÌõÌó´´§l§m§§‚´Õ´ÕÍfÍeí“í’{{0Ù0ÚIöIõX X XøXøL›Lš4Å4ÅòòÑDÑE·n·n¨}¨}¦³¦³²Z²[ɶɸéDéC E F-\-\G™G™WWY„Y„NuNu77KKõUõUÓúÓú¹B¹A©=©<¦W¦X± ± ǸǸæõæô ÿ þ+n+nFQFRV“V“Y»Y»OJOI8Ï8г´ö­ö­Õ Õ ¹ô¹ó©ƒ©‚¦@¦@°¯°¯Ç>Ç>æ{æz § ¦+I+JFGFGV™VšYµYµO#O#8x8x**õýõþÔWÔW¹^¹^©6©7¦a¦a±Q±QÈ\È\çùçú N N,Ï,ÏGrGqW#W#YtYtN N6™6™ÁÁódódÑöÑö··ž¨r¨r¦Ì¦Ë²õ²õË Ë ë]ë^ÙÚ/ù/øI·I¶XXXÖXÕKØKØ33ooîãîãÍýÍý´×´Ø§a§a§µ§´µÈµÉÏrÏrð°ð°YZ4Á4ÃLòLòY1Y2WŒWŒHEHE-µ-¶  èjèkȀȱ?±@¦T¦T©s©tº)º)ÕÕÕÕø(ø'³´:Ò:ÒPÁPÁZ Z U?+î+ïHHWèWéXœXJJ.Å.Å h hææ Å,Å,®n®n¥Ê¥Ë¬¿¬¿Â#Â#â?â@+}+|GÝGÝWÙWÙX£X£JJ.±.² 1 1å»åºÄÑÄÒ®0®/¥Æ¥Ç­­ÂÖÂÖãEãE¿¿,,œH¶HµX0X0XPXPII - - + +ã¬ã­Ãí2­2¥Å¥Å®*®(ÄèÄçæ æ ¼ ¼/H/HJ–J–X×XÖWˆW‰FßFà)Æ)ÅRRßëßêÀ&À&«›«š¥ð¥ð°$°%ÈxÈyêšê›3ˆ3‡MaM`YYžV V CMCM$¦$¦ÿ‚ÿ‚ÚpÚp¼¼©©¦Š¦Š³Z³ZÍÊÍËñ*ñ*559 9 PÂPÂZ-Z-S“S”>#>#£¢÷Ø÷ØÓÓ··§¢§£§ú§ú¸ ¸ÕÕù«ù«vv?Ž?TUTUZZO´O´77š›îiîjË\Ë\±¾±½¦)¦)ª¹ªº¾£¾£ÞPÞQ))F§F¦WWXºX»IóIô-Ú-Û | |ãdãcÂrÂr¬™¬™¥Ô¥Ó¯\¯]Ç€ÇéäéäPP3¶3¶M¾M¾Y¿YÀU†U†AÑAÒ"-".üTüT×!×!¹W¹W¨c¨b§]§\¶{¶|ÓÓ÷Á÷Á>º>ºT T ZZO¼O»6×6ØððíbíbÊ7Ê7°Ý°Ý¥ü¥ü«—«–À¬À«á_á_º¹,¡,¢IMIMX—X–W§W§F¨F©(±(²??Ý0Ý1½„½„ªª¦o¦p³T³TÎ[Î[ò—ò–;;;1;1RIRJZ:Z;QQ9Ñ9Òggð¦ð¦Ì¸Ì·²D²D¦4¦4ªÊªÊ¿1¿2ߢߣ+b+bHœH›XgXiWÐWÐFïFî(Þ(Þ22ÜêÜê½'½&©Õ©Õ¦“¦’´´ϥϤôWôW57<ì<íSOSOZ*Z)P1P17>7>ôôìëìëÉpÉp°,°,¥ß¥ß¬|¬|ÂÌÂÎä¡ä¡ ¢ £0k0kL LYvYvVVB‚B‚"o"nûÝûÞÖÖ¸&¸%§Ç§Ç¨¨¸ù¸ú×Q×Qýeýe#å#åC—C—V’V‘Y3Y2JúJù.‘.‘ T TâOâPÀèÀè«v«v¦¦±Å±ÅÌ\Ì\ðÍðÍ&&:Ñ:ÑRURTZ:Z9P÷Pö8M8Næçí„í„ÉŸÉŸ°°¥Ø¥Ø¬Ó¬Óõöæ-æ- ’ ’2K2KMpMpYÌYÌTÿTÿ?ì?ëš™÷e÷eÑÓÑÓµµ¦Æ¦Æ©™©™½½ÝjÝlz{*¡*¡HˆH‡X‡X‡WW}E EŸ&S&Sÿ ÿ¡ØüØü¹Ý¹Ý¨J¨J§®§®¸-¸-Ö˜Ö˜ýý$ $ DDVâVâXïXïIÅIÄ,J,K88ÞëÞì¾¾ ©÷©÷¦¡¦¢´µ´µÑxÑx÷S÷Sââ@Y@XUMUMYªYªLL0ˆ0‰  ãUãVÁ<Á=«i«j¦!¦"²x²yÎÎóbóc99=§=§T T YþYýNMNN3B3B""æ9æ8Ã\Ã\¬l¬l¥î¥ï±4±4ÌÌññ <<SRSRZZO$O$4Ž4Ž””çƒçƒÄEÄE¬×¬×¥à¥á°Ê°ÉËmËlðƒðƒµ´;î;íSASAZZOO4a4`==ççÃÓÃÓ¬‘¬’¥ì¥í±A±@ÌMÌNñ´ñ´ùù<û<úSÖS×ZZN6N72Í2Í 8 8äýäþÂ$Â$«®«­¦¦²—²–ÎÎô˜ô˜ÚÛ???@TþTýY³Y³LhLh/Á/ ~ ~áOáN¿H¿HªLªK¦”¦•´î´îÒrÒrù5ù5!L!NBBžVŠVŠXÿYI~I~+ + ÜÜ»l»l¨¥¨¥§–§•¸}¸~×ð×ïÿÿ'6'7FàFáX4X3WWE$Ä$ÄüÐüÏÕzÕz¶Î¶Î§ § ©s©s½Œ½‹ß<ß<§§.n.nKºKºY˜Y™U+U+?W?W‰‰óâóâͰͰ±Î±Î¥ô¥ô¬›¬›ÄfÄeèyèzee6©6©PºPºZ=Z©Z©Z½Î½ÍàJàI € 0œ0œM|M|YýYüSxSx;F;F„…ì÷ìöÇqÇr­è­é¥Ô¥Ô°ë°ëÌÝÌÝó·ó·-.@Z@ZUæUæY+Y+IyIy* * ÆÅÙ Ù ¸—¸—§m§n©&©%½‡½ˆàà ˜ ˜0è0çMÓMÒZZSS:5:5ÿÿëëÅÝÅܬî¬î¥ÿ¥ÿ²L²MÏuÏv÷÷ „ „BòBòW W XnXmFºFº%â%âü²ü±ÔmÔmµDµC¦œ¦œªÜªÜÂÂææuu6k6kQpQpY÷Y÷OþOý3¤3¤ 2 3â±â±¿É¿È©©§m§l·#·#ØrØqisawav_2_16_8000_be.wav000066400000000000000000000175541225012771600350640ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFXdWAVEfmt @}data@^^®­)G)G:Ÿ:ŸI_I_S~SY^Y^YÃYÁUbUbKÂKÂ> > ,i,iff³³ìùìùØ)Ø*ÅÎÅζĶĬ,¬-¦Š¦‹¦]¦\«š«š¶¶ÅÅ׬׫ìçìæ@@üü-)-(>Â>ÂL˜L˜UìUëZ Z XÂXÁRRFJFK6.6-"·"·  öö€à}à}ÌoÌp»“»“¯ ¯ §¡§¢¥á¥à©î©î³³ŽÂ1Â1ÔâÔâêzê{ppÞÞ,¿,¿>â>âM M V_V_Z)Z)X.X-PzPzCŽCŽ2-2,||ÊÊï›ï›ÙrÙqÅÒÅÒ¶ ¶ «8«8¦¦§§®4®4ºìºêÌqÌqá‘áøáøâPP&n&n::IßIàT¼T¼YÞYÝXéXéQÝQÜE0E/3²3²——KKïqïqذذĭĭ´Ð´ÐªIªJ¥à¥Þ§ò§ñ°b°b¾¥¾¤Ñ°Ñ±è5è5op/0.2.2AAO=O>WÙWÚZ+Z+VVK—K–;§;¦'P'P  ÷ˆ÷ˆß—ߘÊʸm¸l¬/¬/¦?¦?§§®Ä®Ã¼ª¼ªÏÈÏÇæ¬æ¬ÿÿ.¦.¦AÙAÙPPXgXfYýYûT¼T¼HúHú7˜7˜!Ý!Þ x wðEðEØ@Ø@ÃLÃK³³¨ù¨ú¥Æ¥Ç©Ï©Ð´É´ÊÅèÅçÛÂÛÁô«ô«64&Q&P;‡;‡L L V—V–Z;Z­>­&/&/ { |ë®ë­Ð й ¹ ªùªø¥Å¥Åª¥ª¦¹*¹)ϯϰëÎëÏ  &Ã&Â?S?SPëPëYYX3X3LïLï8ö8ö||zyâWâWÇdz8³8§Â§Â¦¦¯Ø¯Ù••ܣܣúìúìki4Ü4ÜJSJSW.W.YïYïR$R%@±@±'‰'‰ ¤ ¤êƒê„ÍèÍç·A·A©\©\¥ø¥÷­‘­‘¿N¿NÙ Ù ÷³÷³3`3`IªIªWWYëYëQÈQÈ?›?›%‡%†ÁÁçç ÊkÊk´p´q§õ§ö¦¦°ª°«ÄäÄäàÊàɱ±  ;t;uOlOlYdYcX XKoKp5'5&õõ÷œ÷œØDØD¾ ¾ ¬m¬l¥Ê¥Ê««»²»³ÕwÕwõ õ ºº3b3bJpJpW»W»Y{Y|OYOY:Ÿ:ŸüûýAýAÜÐÜÐÁÁ­á­á¥æ¥çªPªPººÔ•Ô•ô¶ô¶4747KbKaXAXAY Y M‚Mƒ7273#"÷{÷{ÖôÖô¼'¼'ªòªò¥Õ¥Õ­©­©Á[Á\Þ4Þ4ÿîÿí!E!E=â=âQÏQÏZZUUD”D“)µ)µ´´æ]æ]dzdz±E±E¦s¦r¨ì¨ë¸n¸nÒ´Ò´óêóê­®5Ó5ÒM+M+YYWÚWÛIsIs/ÿ/ÿ>?ììËìË쳡³ §§¨¨¶Þ¶ÞÑÑò¤ò¤5Þ5ÞMŒM‹YQYRWZWZGÏGÐ- - * *çsçtLjlj°„°…¦#¦"ª$ª$»ý»þØãØãü0ü0¹¹>!>"RÉRÉZ;Z:SÆ>Ç ü(ü(ØÁØÂ»´»´©à©á¦G¦G±¦±§Ê!Ê!ëÉëÉ©¨2r2qL L YYWfWfGG*Ù*ÚONâwâvŠŠ­­¥Ä¥Ã® ® Ä~Ä~åiåj à ß..I„I„XiXiX!X!HœH,u,txyâíâíÂiÂi¬½¬½¥Ì¥Ì®ü®üƱƱèÚèÚ2+2*L“L“YpYpVeVeCÝCÝ%%ÿ„ÿ„Ù÷Ù÷»D»D©©¦ê¦êµ8µ7ÑrÑrötöuíí=ë=ìS·S·ZZOåOæ6Ì6ÌmmìTìSÈÙÈØ¯»¯¼¥Ñ¥Ð­­ÄRÄSç%ç%••2î2ïMÁMÁYØYÙTÒTÒ?„?„ëêöuöuÐÁÐÁ´8´9¦{¦{ªfªf¿B¿Aáá  .Ñ.ÐK‚KYsYtUÅUÄAAef÷]÷]ÐõÐô³ü³ü¦X¦XªüªüÁÁää Õ Õ2ž2žN;N;Z Z S€S€;Û;ÛÒÓîÌîËÉ>É>¯ ¯ ¥Â¥Â¯|¯}Ê@Ê@ððåå=’=‘T„T„Y½Y½LL.=.=‚‚ÝHÝI»r»r¨Q¨Q¨.¨.»,»,ÝLÝK  .â.áL¡L¡YçYçS©S©;);)žžë?ë?Å]Å\¬r¬r¦"¦!³ü³ûÓÓüEüE&&G@G@X¹X¹V[V[@”@“&%ñCñCÉ É ®b®`¥Ú¥Ú²+²+ЕЖú!ú $¬$«FÁFÁX²X²V2V2?·?·VVî·î¸ÇǬƬŦ.¦.´ü´ûÕÏÕÍÄÃ+.+.KkKlYáYáRùRù8787ååã¥ã¤¾.¾.¨¨¨¨¨}¨~½Ï½Ïã•ã•898š8šSUSTY»Y»JJ(.(/ü6ü5Ñѱœ±œ¥Å¥Å°±°°ÏÄÏÄû+û+'w'xIÏIÎY½Y¾SS7H7J ` aßùßøº±º±§<§<ªÆªÅÄ…Ä…íòíñÞÝBZBZWÝWÝV—V˜>È>Èxyè,è+ÀÀ¨Ö¨Ö¨Ó¨ÓÀ$À$èÀèÁbb?”?”W W WPWP@5@5ÃÃèÏèÎÀÀ¨©¨©©0©/ÁšÁšëeëe¨§BiBjX-X-UÅUÅ;½;¼ážážº†º…¦Ù¦Ù¬K¬KÉtÉtö;ö;%€%JJZZPˆP‡0505 Ó=Ó=±,±,¥Õ¥Õ´œ´œÙuÙu ~ ~6u6vSÒSÒYYDVDU¬¬êÎêÎÀÀ¨/¨/ª]ª]ÆÆóVóV$$IøIøZZObOa,ì,íüÜüÝͪͫ­ž­ž¦¦¦¦ºýºýä«ä¬žAeAeXmXlTzTx66Ø×ÖŽÖŽ² ² ¥Ö¥ÖµåµåÝhÝhÊË<é<éW WVV9û9û w wÙ:Ù9³<³;¥Ê¥ÊµYµYÝ#Ý#,,=°=°WWUVUV7“7“³´Õ>Õ>°¦°¦¦¦¹6¹6ãêãéÎÎCšCšYTYUQQž.Ý.ÝüjükËË«g«g¨=¨=ÂÍÂÌòNòM&.&.MMZ(Z(H²H³||éÂé¼¼¦ˆ¦ˆ¯s¯sÔtÔt««9’9’V¤V¤UÐUÑ7!7"##Ñ:Ñ:­´­µ§B§BÀ_À_ðMðM%‘%’MpMpZZ F¤F¤ûûãäãå·Ô·Ô¥Ñ¥Ñ´´ŽÞõÞõPPC¯C°Y¯Y¯OO'œ'ñ‚ñ‚ÀÀ§ § ®ž®žÔœÔœ Ç Æ<«<«X(X'RîRî.¯.¯øÝøÝÅ–Å—¨a¨`¬l¬kÐ}Ð}ÂÂ:.:/W‹WŒS³S³/Ë/Ëù~ù~ÅŽÅŽ¨5¨6¬õ¬õÒDÒC <Å<ÅXsXtQÇQÇ+ + óWóXÀ}À}¦Ç¦Æ°Š°‰Ú6Ú5úûCìCíY÷Y÷L.L.ÓÓæ•æ•·}·}¥È¥È¸Ô¸Ôé(é'"¦"§MâMâY—Y˜@²@± 8 9Ô-Ô-­.­.¨¨ŒÈzÈyÿ¿ÿÀ6Ü6ÜW'W&SDSE,,€òûòû¾Ï¾Ð¦9¦:³Î³ÎââKxKxYìYìBB È ÇÓ}Ó|¬Z¬Y©y©yÌeÌeìì<˜<˜YYNËNÊ""æNæNµ¾µ¿¦¦¾R¾Rôô.í.íTßTßUDUD/•/”ô‡ô‡¾}¾~¦¦¶U¶Uè_è_%%P¸P¸WÿWþ7.7/ýýÄ5Ä5¦Ô¦Ô²´²³âªâª  NŠN‰XÊXÊ9Ä9Äÿ¾ÿ¾Å±Å²§ § ²b²bâ·â¶ É ÊO8O8XeXe7›7œüKüJ™˜¦\¦\µWµWè¥è¤''R‘R‘VZVZ0F0Fò©ò¨»j»j¥Ç¥È¼”¼“ôàôá2s2rW%W%Q Q "Í"Íã1ã2±Ô±Ô§–§–ÉáÉáA(A(Z*Z*EÛEÛ88Ï;Ï:©©¯D¯Dß%ß%רP PWdWd1Ò1Ôòxòyºº¥é¥èÀïÀïý)ý(:Ÿ:ŸY†Y…I´Iµ""Ò\Ò[©«©«®Ø®×ßß!^!^Q\Q\V5V5,ù,øë†ë…´þ´þ¦ü¦ûÉlÉl ª ©DjDkZ%Z%>ë>ì??ÂËÂÌ¥ò¥òºïºïöVöW6ä6ãYYJ'J'ããÏϨB¨B²X²Wèrèq+À+¿VEVEPWPVáâØîØï«)«)­÷­øàà$w$wSÌSËS4S4"¤"¤ÝñÝò¬í¬í¬Q¬RÜÝÜÜ!ô!õSSS·S¸#H#HÝõÝô¬¬¬¬¬Ó¬ÔÞ¼Þ¼$[$ZT@T@R*R)õöÙÙªŒªŒ¯ª¯ªå¹å¸+Ÿ+ŸVþVýMÊMÊ22ÏŽÏŽ§‰§ˆ¶¶òaò`77Y­Y­E"E"¤¤ÂÂ¥Á¥ÁÁªÁªÜÛDÎDÍY®Y­6=6>ðoðp´l´k¨m¨lÔŽÔppRRScSdQQÖÿÖþ©©³€³€ïãïä6œ6œYÔYÕBÉBÉ ½/½0¦2¦2ʮʭ}}MåMæUþUþ% % ÛsÛsªª²U²Uïï6ø6øYûYú@@ûû‚¹^¹]§5§5ÑáÑâRõRõQUQUêêÍóÍó¦s¦t½&½&rrEÙEÚXàXá..ãã¬(¬(°T°Tìüìû6ï6ïZZ=»=½õuõt´›´œ©—©—ÜÆÜÆ)-)-WöW÷GÉGÉÎμý¼þ¦»¦¼Ñ²Ñ³rrTÝTÞM–M– } }ÃdÃe¥ã¥âË6Ë5ÀÁR…R†PSPRjiƬƫ¥Ä¥ÃÈÎÈ΀€QÕQÖPÄPͶÆbÆc¥É¥ÉÊ/Ê/ÔÕSSOORR†…¦¦Ï’Ï‘¤¤UÏUÏJJ-,»¨»©§°§±ÙwÙv)Ž)XÚXÚBGBG÷*÷+²þ²ý¬)¬(è™è™7¤7¤Z4Z44©4©äªäªª¥ª¦µÅµÅýeýeF÷F÷WW O NÏÏ¥é¥èÆóÆó$$TTKèKèéé¹Á¹À© © á:á;33Z3Z45í5îä;ä;©Þ©Þ¸r¸rííKãKãS¡S ;;ÃyÃy¦~¦}Ö­Ö­*e*eY–Y–;Æ;Åê/ê/«q«q¶\¶]ÄÄKpKqSlSl_`ÁÁ§2§3ÜÜ0½0½Z5Z53Ô3ÓßAß@§Ï§Ï¿‚¿<Â=kkY)Y)5ã5äØèØè¥Ë¥ÊÔÔ1À1ÀY¼Y» ß ßÄ>Ä=¨Ÿ¨žì”ì”E¼E»R°R°23±Ô±Ô´¿´¿  UUA A ääää¦É¦ÊÌÌŒ+÷+øZZ#a#aÄÁÄÀ¨ø¨øïßïÞHûHûOzOyûÈûɬ¼¬¼½ ½ 44YCYB22Ñ$Ñ$¦R¦Qã›ã›AÌAÌS°S¯cc¯Î¯Î¹6¹6ÈÈX¹X¹3•3”ћћ¦j¦jå¬å«D+D+Q¼Q¼þþ¬˜¬˜¿#¿#³²ZZ(H(HÅÈÅÈ©º©¹ö˜ö˜N×NÖGUGUèõèõ¦ž¦žÒÒ65þW‰W‰ t u²›²œ·Ä·ÄÅÅYlYm,ý,þÈ[È[©[©[÷S÷TP'P&DIDIâeâf¥Ò¥ÑÛÝÛÜ?Ø?ØR¬R¬üVüWªˆªˆÆnÆn,Y,YYAYAyy´n´m·V·U°±YîYí&g&hÀ¹À¹­×­×èèVÚVÙ4Ó4ÓÍ.Í.¨ª¨«øøQüQý??Ø?Ø@¦d¦eìÊìÈLîLíEåEåàìàí¥Æ¥ÆäðäðHÃHÃIþIýæÃæÂ¥Ñ¥ÑàbàcFˆ>ˆÇdz³%I%HV4V2ð*ð*¥æ¥åú¨ú©XÑXÑ76­"­"ÓgÓgII<°<¯Ä Ä ¶Æ¶Æ,í,íR|R|ãÙãÚ§÷§ö c cZ4Z4´´¦Ò¦ÒêŠêŠUjUj$w$v°Ä°ÄΥΦG[G[<Í<ÍÂ(Â'¹û¹û3¯3®MM‘×c×c¬ò¬ñÁÁVüVýíkíl¦È¦É12Z:Z;¦¦ô»ô¼XæXç©©äKäJT°T±"Ï"Ï®0®0×*×+OO.W.W´´Í0Í0I3I46Ë6ʹ¨¹¨ÆÆDD< < ¾0¾0ÁtÁu@?@@@2@2Á+Á+¾î¾í>8>8A±A±Â9Â8¾c¾c>!>!APAOÁQÁQ¿º¿º?ÿ?ÿ>ý>þ¾„¾…ÃÃCœC›:™:™º%º$ȩȪH©H©3±3±´•´•ÐùÐøNN)Ô)Õ®˜®™ÜmÜnTXTX¹¹©P©PëBëAXÃXÄ 2 1¦ ¦!ý€ý€ZGZEøWøW¦Ç¦ÇªªWWâ5â6­­ )O)PM+M+ˢˡºÉºÉ??;m;m··ШШP˜P˜!›!œ©¢©¢îîYÊYÉ ¦'¦'««V¡V¡ÝÃÝݪ°«3/3/DiDi½é½éʑʑNmNl#S#S©c©cñ£ñ¢Z>Z=øø§ë§ê›œP=P=ÌYÌY½Ê½ÉEÐEÐ/ / ­*­*è«è¬Y°Y°ý;ý;§N§N•–OÌOËÉìÉìÁMÁNJJ''©b©cõ¯õ®Z-Z,ëÿëÿ¬Ö¬×0ï0ïBB·Ê·Ë×î×îV×V×cb¦9¦:qpP;P;ÇôÇõũŨOO77¦N¦L * *VVÓˆÓ‰¼Ÿ¼ŸHéHé$$§§ÜÛW°W¯×ž×žº}º}GÀG¿%%§v§uÿþVÈVÈÓTÓU¾ž¾žLL¸¸¦¦ª©RARAÇXÇYʆʇSûSû | |¦Ê¦Ê$*$*FNFM¶Â¶ÃááZZî?î?¯á¯á> > -Ä-Ĩ¨Œ²²UsUsË’Ë’ÈþÈþTƒTƒ£¤¨^¨_.Œ.Œ;à;à­­öSöTXoXoÓiÓiÃgÃgRRã⨨/>/>9·9¶«³«²ý@ý@V-V-Ê,Ê+ͱͱWvWv÷Ã÷îR®T?â?â&&¦¦_`HöH÷´¡´ ìkìlYZYZÓêÓêÆŽÆŽUºUºû0û1®®AGAG!¿!¿¥Ò¥Ò!ð!ð@´@´­?­@þþSíSìÀèÀçÝ6Ý5ZLZKÜ&Ü%Â2Â2TîTïú<ú<¯í¯íFeFe%&¦þ¦þ1Ý1Þ0 0 ¦›¦š~~CLCM­%­%ÝÞPzP{¸­¸­ìåìåWÜWÜÇ&Ç&ÙãÙãZFZFÖÜÖÜÊPÊPXäXäææ¾=¾=TÞTÝõõµaµ`OMOMää¯9¯8I%I% ´ ´«5«6C*C)jj¨Æ¨Æ=à=à  §f§f9³9´ « ¬¦µ¦µ6õ6õ#D#C¦m¦m5Ð5Ñ#÷#ö¦l¦l6J6J"Ë"˦«¦ª8`8`²³§N§N;í;î°°¨—¨˜@¼@¼••ªèªèFŠFŠ A A®Ï®ÐLÉLÉþ¹þ·´Þ´ÝRÈRÈñ0ñ0½°½¯W˜W™ââÉÒÉÒZ(Z(ÑîÑï٢١Y,Y,ÂÂííSdSc´´©ªG¿G¾©ì©ë5’5’¥Î¥Ï44©í©îHÄHÃÿÐÿзÁ·ÁV–V•àˆàˆÏ“Ï“YüYüËÌïÎïÍP;P;®-®-ˆˆ8†8…¥Î¥Í7 7Ÿï®…QZQZë0ë0É6É5Z>Z>ÄJÄJò+ò+MiMhª½ª» – –+,+,§¾§¾G¯G®ú×úØ¿e¿fYûYûÊEÊEíAíANNª™ª˜#v#v&&©ç©æMìMìííÌÌY|Y|ºHºI÷ø=‡=‡¥Ð¥Ð>ä>ãLL¼Û¼ÛZZŵŷ÷¶÷µEãEã¦L¦K8Ä8Ä t sº(º)YçYçÅÆÅÆù§ù§CJCJ¥Þ¥Þ>Ò>ÒÿQÿQÂ|Â}ZZºfºf ß Þ4/40§É§ÉMãMãå=å<ÚÚRýRþª™ª™,¥,¥ Ÿ·Â·ÁZZÀŒÀŒ$$66¨¨OèOèÞÞ äbäcLOLO¦‰¦‰=Í=ÍùøùøËßËàWW¬à¬á*ù*ùÒѼ´¼³YÕYÕ¶¶ûüRR³‰³‰ZnZm¼]¼^  &ˆ&ˆ°°°°XÔXÔÀÀ Þ ß))¯¹¯¸YqYq¾½¾½[[$ç$æ²e²eZÏZϸ¸UU»ü»üX X²`²`(ä(ä  ÅÏÅÎXeXe¤ì¤ìB=B=êêäxäxBÜBÞ¬T¬VHÔHÓܓܒisawav_2_32_44100_be.wav000066400000000000000000002543301225012771600351360ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFXXÄWAVEfmt (ÿþ¬Db   €ª8›qfact+dataXˆ+¡]+¡]Êõ"Êõ"ÀáuÀáu ‚In ‚Inf¡Âf¡Â Ãô ÃôòÈEòÈEœV!œV!UÆéUÆé!çS!çS%^%^(óöŠ(óöŠ,gÕP,gÕP/´È¶/´È¶2ûó2ûó6Ì™6Ì™91Ì91Ì<©<©>û+E>û+EA±‰AA±‰ADO¡DO¡FǧªFǧªI"#vI"#vKWó9KWó9Mk vMk vOY[¼OY[¼Q!'ŒQ!'ŒRÃÚ—RÃÚ—T=(T=(Uƒ7Uƒ7V¸3¡V¸3¡W¹‘W¹‘XŽÇXŽÇY:uY:uY¹vY¹vZßaZßaZ8"Z8"Z7Ç}Z7Ç}Z ØZ ØY±q‡Y±q‡Y,'Y,'X}q¢X}q¢W¢$¨W¢$¨V¬ÖV¬ÖUmÞÕUmÞÕTVÑTVÑR“R“PèîPèîOæÑOæÑM5¨M5¨Jÿ´fJÿ´fH¼*ÍH¼*ÍFUæFUæCÊúŸCÊúŸAÉÄAÉÄ>Sót>Sót;i­†;i­†8at8at5=£ 5=£ 1þÚ1þÚ.§‚ .§‚ +8mÂ+8mÂ'³ÿ¯'³ÿ¯$G$G p—Ÿ p—Ÿµ;wµ;wërÃërþj¾j3JÞ3JÞ HǸ HǸ WPC WPC`·g`·gg zg zýl5Rýl5Rùr:2ùr:2õ{Úõ{Úñˆ» ñˆ» í0ûí0ûéºeéºeåâT›åâT›âç¼âç¼ÞZ7ÞZ7Ú­±IÚ­±Iש”ש”ÓÊdÓÊdÐå¬Ðå¬ÌŸ©ÌŸ©É‡ɇÆcaÝÆcaÝÃ\‚ŽÃ\‚ŽÀsìjÀsìj½«)ؽ«)Ø»¥ »¥ ¸~Ìo¸~Ìo¶äô¶äô³â?[³â?[±Ì÷ƱÌ÷Ưß?"¯ß?"®5®5¬~[1¬~[1« :« :©Æá$©Æá$¨¬¨¬§¾Ì•§¾Ì•¦ýþͦýþͦj¹¦j¹¦5è¦5è¥ÍÖ5¥ÍÖ5¥Ä«¥Ä«¥éÞ¸¥éÞ¸¦=\µ¦=\µ¦¿¦¿§nÌÙ§nÌÙ¨L6„¨L6„©W©WªŽiªŽi«ò~°«ò~°­ê>­ê>¯*Åë>*ÂÒ°ÂÒ°¿ÙC)¿ÙC)½Ÿ!½Ÿ!ºO¥…ºO¥…·ÁÝO·ÁÝOµZ¨µZ¨³lȳlȱ\j±\j¯º¯º­Y„•­Y„•«ÅÙu«ÅÙuª_7ª_7©'q(©'q(¨:¨:§D¥à§D¥à¦› z¦› z¦" µ¦" µ¥Ù½¥Ù½¥Â™¥Â™¥Ü~Î¥Ü~Φ' (¦' (¦£½W¦£½W§PĨ§PĨ¨.Lø¨.Lø©;þê©;þêªyO˜ªyO˜«å›~«å›~­€=±­€=±¯H@¡¯H@¡±<í¸±<í¸³\ø[³\ø[µ§Ÿ¯µ§Ÿ¯¸<ü¸<üº· Nº· N½yʽyÊÀ`qÏÀ`qÏÃjëDÃjëDÆ—´·Æ—´·Éä§Éä§ÍOm)ÍOm)ÐÖ¦ ÐÖ¦ ÔyuÔyuØ3cØ3cÜçÜçßê>hßê>hãâ{µãâ{µçêEçêEìpOìpOð!Ñêð!ÑêôLÆõôLÆõø~»ø~»ü´ã«ü´ã«î÷Äî÷Ä ËD ËD !õ> !õ> 5ä£ 5ä£AfAfEDSEDS=œ=œ)Z )Z !Q?!Q?$Ñ3J$Ñ3J(ˆòç(ˆòç,,T,,T/·ÏÌ/·ÏÌ3*Õ3*Õ6‚X 6‚X 9½ƒ¹9½ƒ¹<Ù¿Ò<Ù¿Ò?Ö¨?Ö¨B°"—B°"—Efï•Efï•Gø¡Gø¡Jcö>Jcö>L§€!L§€!NÁ÷oNÁ÷oP²@ìP²@ìRwRwT½T½Uzö—Uzö—V¸:UV¸:UWÆ„8WÆ„8X¥~]X¥~]YTRYYTRYYÒÞbYÒÞbZ ‚IZ ‚IZ=KºZ=KºZ(Ö¾Z(Ö¾Yã] Yã] Yl»Yl»XÅTEXÅTEWíFîWíFîVåÊVåÊU­>ÕU­>ÕTFYŠTFYŠR±wR±wPîAØPîAØNþ˺Nþ˺Lãµ›Lãµ›JžaJžaH/",H/",E˜#ŸE˜#ŸBÚuÊBÚuÊ?÷—D?÷—D<ñ ¡<ñ ¡9Èz‡9Èz‡6•6•3:3:/“ôå…Å>å…Â×’Â×’¿œV¿œV¼.̼.̹r³O¹r³O¶ßT¶ßT´uVÚ´uVÚ²6Cɲ6Cɰ#UQ°#UQ®=è®®=讬‡Œ¬‡ŒªÿΪÿΩ©û©©û¨ƒÞꨃÞê§°ò§°ò¦ÐOü¦ÐOü¦CD¦CD¥éû¥éû¥Ã܃¥Ã܃¥Ò:¥Ò:¦¥¥¦¥¥¦‹ =¦‹ =§5Dp§5Dp¨çW¨çW©#¥ì©#¥ìªfÅfªfÅf«Ûל«Ûל­Çz­Çz¯X N¯X N±]8–±]8–³«ù³«ùµðœœµðœœ¸|Y#¸|Y#»1À»1À¾ ï¾ ïÁÐ#ÁÐ#Ä?*†Ä?*†ÇŒn—ÇŒn—Êû›%Êû›%ΉÔbΉÔbÒ5ëEÒ5ëEÕüïÕüïÙÝoÙÝoÝÔ†¤ÝÔ†¤áàeòáàeòåþdvåþdvê, ›ê, ›îg~îg~ò­&uò­&uöü;öü;ûO,âûO,âÿ©‚ÿ©‚êœæêœæ‘¦‘¦ Sà SÃ~+E~+E¢²¢²º>çº>çÅÓiÅÓi Àc Àc$©ö±$©ö±(~e‡(~e‡,=d,=d/â™9/â™93màZ3màZ6Ü6Ü:+¾0:+¾0=Zš’=Zš’@gx@gxCO=$CO=$FiDFiDH¬H¬Kk`Kk`MdX4MdX4O/HO/HQlüÏQlüÏS,?]S,?]T¼EIT¼EIV¸TV¸TWJ ðWJ ðXF_¥XF_¥Y1±Y1±Y¦·œY¦·œZ ÞÎZ ÞÎZ9VZ9VZ4a5Z4a5Yû‰Yû‰YŽÍYŽÍXî+/Xî+/XÖXÖWÙ›WÙ›UÙUÙTmXûTmXûRÐw"RÐw"QGŽQGŽOÇðOÇðLÜLÜJ„W¦J„W¦Hì`Hì`ES/ES/B|¯TB|¯T?~úN?~úN<[Ò)<[Ò)9ñ69ñ65¬FÉ5¬FÉ2#¸o2#¸o.}]).}])*»C*»C&ߢ÷&ߢ÷"쮪"쮪ä»ÿä»ÿʤʤŸ;oŸ;of…ýf…ý"z…"z… Õ—Û Õ—Û‚ix‚ix+|L+|LüÓbXüÓbXø|±Dø|±Dô)ú¨ô)ú¨ïÝÖ0ïÝÖ0ëšÏ¶ëšÏ¶çcz·çcz·ã:Wã:Wß!ï…ß!ï…Û°3Û°3×-Ë×-ËÓUlÈÓUlÈϘ óϘ óË÷góË÷góÈu†ýÈu†ýÅ”xÅ”xÁÖ²*ÁÖ²*¾½Ð¾½Ð»Ëæ#»Ëæ#¹ºÍ¹ºÍ¶dm¶dm³ñ—³ñ—±¬´±¬´¯–ö7¯–ö7­±¢’­±¢’«ý÷5«ý÷5ª|ÿ[ª|ÿ[©/È÷©/È÷¨¨§3ÁY§3ÁY¦†@‰¦†@‰¦?&¦?&¥ÎÞ¼¥ÎÞ¼¥Å™l¥Å™l¥ó>Ø¥ó>ئX)¦X)¦ó™+¦ó™+§ÅÚ¬§ÅÚ¬¨Î ?¨Î ?ª ý®ª ý®«~o«~o­%w­­%w­®ÿ?[®ÿ?[± 5Ÿ± 5Ÿ³GÞT³GÞTµ´&µ´&¸NpÓ¸NpÓ»Kš»Kš¾ O¾ OÁ!ÕbÁ!ÕbÄd³Äd³ÇË<°ÇË<°ËUûrËUûrÏd•Ïd•ÒÌ ›ÒÌ ›Ö²ÁJÖ²ÁJÚ´>¨Ú´>¨ÞÌ€›ÞÌ€›âúó¼âúó¼ç:³Ìç:³Ìë‹àxë‹àxïè} ïè} ôQçdôQçdøÀ7øÀ7ý7èþý7èþ¦üZ¦üZûaöûaö Pª· Pª·žwêžwêå Óå Ó Qß QßNƒ6Nƒ6lßÊlßÊ#xÎ #xÎ 'p=Š'p=Š+P74+P74/J/J2ÁÀ2ÁÀ6NØ 6NØ 9»Kñ9»Kñ=ëø=ëø@+ɺ@+ɺC+×C+×F_ÌF_ÌH±m§H±m§K3”.K3”.Mˆò¼Mˆò¼O¯pBO¯pBQ¦@Q¦@Sk¤Sk¤Tþå&Tþå&V^£–V^£–WŠB,WŠB,X€À^X€À^YA ¦YA ¦YÌ?ÙYÌ?ÙZ F¹Z F¹Z=køZ=køZ#…wZ#…wYÒŸPYÒŸPYJÂçYJÂçXŒLqXŒLqW—~ŽW—~ŽVmVmU QbU QbSy^ESy^EQ±ç³Q±ç³O¸dO¸dMŒö¨MŒö¨K1æRK1æRH¨-H¨-Eñh‹Eñh‹CRCR@y@y<Ï$I<Ï$I9u6Ø9u6Ø5÷L5÷L2W2W.˜' .˜' *»hs*»hs&ê|&ê|"³_G"³_G‘‘S*(S*(l<l<¯rë¯rë Jòj JòjݤݤjM¨jM¨ÿó³¬ÿó³¬û|£Úû|£Ú÷éé÷ééò˜Uò˜Uî0¯lî0¯léÓÃSéÓÃSå„Oïå„OïáEqáEqÝÄ‹Ýċ٠٠Õ{Õ{Ѱ²Ñ°²ÍYáÍYáɲ?`ɲ?`Æ-`NÆ-`NÂÌÙçÂÌÙç¿’ÉC¿’ÉC¼^b¼^b¹š‚¾¹š‚¾¶à6ã¶à6ã´T,Á´T,Á±ø.±ø.¯Í²¯Í²­ÖE7­ÖE7¬"#¬"#ª…‘ª…‘©.Ì©.̨§¨§§'ó¯§'ó¯¦yÄY¦yÄY¦¶¦¶¥Ê5'¥Ê5'¥Év¥Év¦É7¦É7¦vJ¦vJ§#ˆ%§#ˆ%¨ l,¨ l,©*!@©*!@ª‚_yª‚_y¬î.¬î.­ØU­ØU¯Óûg¯Óûg²6ʲ6Ê´gé´gé¶û¹¶û¹¹¿á¹¿á¼²r²¼²r²¿Ðð-¿Ðð-ÃùÃùÆŠåµÆŠåµÊ"½Ê"½ÍÜšUÍÜšUѸ”Ѹ”Õ³EúÕ³EúÙÊ ÙÊ Ýú®õÝú®õâAÅâAÅæ_€æ_€ë yjë yjï„ßGï„ßGô ;<ô ;<øš9øš9ý,[ý,[Æ"Æ"J3J3 ¹6k ¹6k'²('²(‰Å˜‰Å˜âaèâaè*µ“*µ“ cÎ cÎ$†zŠ$†zŠ(”G(”G,‡ÝI,‡ÝI0`al0`al4hÈ4hÈ7´È7´È;*¥Ÿ;*¥Ÿ>|w>|wA¦QÖA¦QÖD§ D§ G|cG|cJ$±/J$±/LžïLžïN棼N棼PýT-PýT-Rà=Rà=TŽžTŽžVÍÁVÍÁWHHµWHHµXQµ/XQµ/Y"È(Y"È(YºYºZÅ6ZÅ6Z<õ Z<õ Z'/Z'/Y×-vY×-vYMFsYMFsX‰”$X‰”$WŒ£ÂWŒ£ÂVVìÿVVìÿTé5çTé5çSDOýSDOýQi;æQi;æOYèOYèM8ÞM8ÞJžûJžûG÷àeG÷àeE!¤«E!¤«Bþ_Bþ_>îês>îês;–Z;–Z8ƒq8ƒq4q44q40©è÷0©è÷,Áëê,Áëê(¼-Z(¼-Z$›9È$›9È aÊb aÊb“þ“þ°mè°mè>.µ>.µ¾Äˆ¾Äˆ 5¼ 5¼¤Ý8ò>ÙmïÙmïÔëhëÔëhëÐíµ¦Ðíµ¦Íø©Íø©ÉQãÄÉQãÄŸðŸðÂF¥ŽÂF¥Ž¾ýL>¾ýL>»ß:]»ß:]¸îø¸îø¶-?‹¶-?‹³Jí³Jí±@}ı@}įsïsí&»-­&»-«l²d«l²d©ë”@©ë”@¨¤€°¨¤€°§˜W駘Wé¦Çû¤¦Çû¤¦3ë ¦3ë ¥ÜÊc¥ÜÊc¥Â²Ô¥Â²Ô¥æ Ö¥æ Ö¦Fƒ”¦Fƒ”¦äEI¦äEI§¾˜ß§¾˜ß¨Õfà¨Õfàª'’üª'’ü«´ÃV«´ÃV­{| ­{| ¯{é¯{é±±×±±×´¸Ñ´¸Ñ¶¿¬…¶¿¬…¹“l{¹“l{¼—¬•¼—¬•¿ÊÅŒ¿ÊÅŒÃ*K˜Ã*K˜Æ´'ÁÆ´'ÁÊeêÊeêÎ<ú4Î<ú4Ò7ªÒ7ªÖPÖ»ÖPÖ»ÚˆazÚˆazÞÙ½nÞÙ½nãCSŠãCSŠçÀP"çÀP"ìOòiìOòiðìyðìyõ•pµõ•pµúC<çúC<çþûAoþûAo¢é…¢é…3K03K0 ÄcÆ ÄcÆJlùJlùÇ„?Ç„?5=P5=P“¶“¶"ÜFG"ÜFG'B/'B/+(a÷+(a÷/%V4/%V438Õ38Õ6¿gÎ6¿gÎ:W…Ú:W…Ú=ÈÎu=ÈÎuAReAReD.O€D.O€G0ËG0ËIÞS“IÞS“LmnáLmnáNÉNÉPðE¹PðE¹RàØÇRàØÇTšÄTšÄVVW`;W`;XkHoXkHoY:ÍçY:ÍçYÍË~YÍË~Z$ Z$ Z=*åZ=*åZ ìZ ìY·–Y·–YYX=Õ[X=Õ[W&YžW&YžUÓK¸UÓK¸TE|™TE|™R}ñÈR}ñÈP}ÀúP}ÀúNFHñNFHñKØåçKØåçI7HóI7HóFc„Fc„C^D•C^D•@*ÀÝ@*ÀÝ<ÊÈ©<ÊÈ©9@†à9@†à5Žv 5Žv 1¶ÿÂ1¶ÿÂ-¼Òj-¼Òj)¢°)¢°%kN%kN!6!6¯ò¯ò2I~2I~£XB£XBAA ^4M ^4M®nó®nóú-#ú-#üD»‚üD»‚÷‘Z†÷‘Z†òã\§òã\§î=þíî=þí餛餛å>Øå>Øà¢L”à¢L”Ü?ÔËÜ?ÔË×õþx×õþxÓÇÊ»ÓÇʻϸº…>½"¤½"¤Às݉Às݉Ãó Ãó Çž»`Çž»`Ës"áËs"áÏnËÍÏnËÍÓwÓw×ÍÄ)×ÍÄ)Ü*âÞÜ*âÞ࣢ à£¢ å2Ÿ’å2Ÿ’éÖð¼éÖð¼îŠÈîŠÈóM3óM3øøüêÁ}üêÁ}¼P¼PoýToýT _: _:É­¯É­¯h åh åù5ôù5ôxÁSxÁS!äØc!äØc&8ð*&8ð**sh-*sh-.Îê.Îê2ŒŸÅ2ŒŸÅ6e£³6e£³:fÎ:fÎ=¤—=¤—AAD6”D6”G8À/G8À/JëúJëúL¥WtL¥WtO mþO mþQ9úaQ9úaS.å†S.å†TéÄTéÄVfûgVfûgW§ŸºW§ŸºX©é|X©é|Ym)Ym)Yðš Yðš Z3à3Z3à3Z6ÀEZ6ÀEYùYùYzè—Yzè—X¼†­X¼†­W¾ÌW¾ÌVHQVHQUÝHUÝHSM±SM±QX&QX&O(ZO(ZL¿S¿L¿S¿J J GH ¼GH ¼D=ŸOD=ŸOAŠyAŠy=•ùT=•ùT9ýo)9ýo)6:dÀ6:dÀ2O—m2O—m.?Æ".?Æ"* â7* â7%¼çÚ%¼çÚ!Oö"!Oö"Ê<Ê<.þ+.þ+”ö”öÅaÕÅaÕ ýÝ ýÝ.{þ.{þZÊÌZÊÌû†Irû†Irö´òö´òñé|ñé|í'Œí'Œès8!ès8!ãÏÍúãÏÍúß@¡,ß@¡,ÚÉ(`ÚÉ(`Öl¤éÖl¤éÒ.n^Ò.n^ΜIΜIÊ\ðÊ\ðÆH•¨ÆH•¨Â¢@ÆÂ¢@Æ¿) f¿) f»ß­£»ß­£¸È–/¸È–/µæ5ßµæ5ß³:²ç³:²ç°È+.°È+.®| ®| ¬•e'¬•e'ªØwïªØwï©[ ‰©[ ‰¨gA¨gA§#ph§#ph¦k„¦k„¥õã¥õã¥Äfx¥Äfx¥Öžó¥Öžó¦,åÿ¦,åÿ¦Æ´ÿ¦Æ´ÿ§¤U§¤U¨Äæ¨Äæª&:ݪ&:Ý«É>™«É>™­¬q{­¬q{¯Íí¯Íí²,·é²,·é´Æ‹k´Æ‹k·š ·š º¤£rº¤£r½äŠ€½äŠ€ÁVô ÁVô ÄùŸ+ÄùŸ+ÈÉ¢ýÈÉ¢ýÌÄ6 ÌÄ6 ÐæuyÐæuyÕ,ùÕ,ùٕٕޒtÞ’tâ»=4â»=4çq÷-çq÷-ì=Fûì=Fûñ­ñ­õþS>õþS>úêæ¬úêæ¬ÿá±Çÿá±ÇÆ/Æ/ “mî “mî`M`MovovÓmÓmtÖBtÖB!í1!í1%xT8%xT8)Ó)v)Ó)v.%ü.%ü2)ÍŒ2)ÍŒ6¡6¡9íÕî9íÕî=‘о=‘оAÖ´AÖ´DN_ËDN_ËGbEJGbEJJA þJA þL鹌L鹌OY7OY7Q*]Q*]S„ç¿S„ç¿U>%ÉU>%ÉV¸ÒV¸ÒWðÿWðÿXèb>Xèb>Yœö\Yœö\Z¯Z¯Z¤H>¤E1'iE1'iAîÅ?AîÅ?>yËÈ>yËÈ:Ôâœ:Ôâœ7ªŒ7ªŒ3¡3¡.â >.â >*™¿¾*™¿¾&0X[&0X[!©=!©=ÍÍO›O›„3Ì„3Ì©I£©I£ ‹ˆ ‹ˆÓÂ#ÓÂ#ÿà²'ÿà²'úí1úí1õý ²õý ²ñ4ñ4ì6!Æì6!Æçfô!çfô!âªFûâªFûÞÖÞÖÙw9¸Ùw9¸ÕÒÕÒйÄйÄÌÎÌÎÈblÈblĵÆ2ĵÆ2Á ìVÁ ìV½’Ü9½’Ü9ºM?!ºM?!·=ÓF·=ÓF´fñÅ´fñűË/±Ë/¯l ³¯l ³­L­L«lÍÍ«lÍÍ©ÏÍ¿©ÏÍ¿¨vhP¨vhP§aÆð§aÆð¦’ßᦒßᦠ^¦ ^¥ÈÞê¥ÈÞê¥Î‡B¥Î‡B¦·¦·¦¯»r¦¯»r§ŠÒ¨§ŠÒ¨¨«î2¨«î2ª­Ýª­Ý«½Ž²«½Ž²­«ß_­«ß_¯Û” ¯Û” ²K©Û²K©Û´ù•-´ù•-·ãÿ!·ãÿ!»ê»ê¾c§3¾c§3ÁóÚ>ÁóÚ>ŶtŶtɧӇɧӇÍÅ|sÍÅ|sÒ ©»Ò ©»Öw`ÜÖw`ÜÛâöÛâöß°šß°šäw Wäw WéSË›éSË›îD îD óB­óB­øL–”øL–”ý[BÆý[BÆq±Ýq±ÝnØ­nØ­ Xa§ Xa§>@¢>@¢Û¥|Û¥|( ( $(1;$(1;(¦ƒP(¦ƒP-¸:-¸:1C¨V1C¨V5[Zb5[Zb9I~¤9I~¤= Év= Év@ž¤l@ž¤lCÿ9Cÿ9G+ÃG+ÃJ   J   LÛÚ2LÛÚ2O[èO[èQœ‡Qœ‡SžØSžØU^AàU^AàVÛc+VÛc+X’„X’„YR›YR›Y¶=¤Y¶=¤ZB ZB Z=fVZ=fVZ¾Z¾Y§¥ÕY§¥ÕXòþXòþWö§Wö§V´%V´%U-`bU-`bSb°gSb°gQU›QU›O…O…LzMsLzMsI¯Ð¼I¯Ð¼FªD½FªD½CkõÙCkõÙ?÷lo?÷lo5ý¦>5ý¥ÛœÐ¥ÛœÐ¥ÃÔ­¥ÃÔ­¥ö¬¥ö¬¦t{¦t{§<~y§<~y¨N£Ø¨N£Ø©©©©«Lê8«Lê8­6¹­6¹¯fÖ¯fֱطS±Ø·S´/ð´/ð·€Õ}·€Õ}º±²hº±²h¾Ñô¾ÑôÁ¿®ÉÁ¿®ÉÅ—%©Å—%©É ©É ©Í×G’Í×G’Ò8íÕÒ8íÕÖÁùEÖÁùEÛmÄ{ÛmÄ{à9¢*à9¢*åêáåêáê²þê²þï.à@ï.à@ôPÂôPÂùxšùxšþ¬»öþ¬»öÏý+Ïý+ÜX¯ÜX¯ çÐ* çÐ*åW`åW`Ö9GÖ9G²Åð²Åð!y ´!y ´&$÷Ž&$÷Ž*²R-*²R-/ûì/ûì3aíå3aíå7}D¼7}D¼;k¸9;k¸9?*ß?*ßB´ô™B´ô™F ÃF ÃI%BI%BLN}LN}N¦ìÜN¦ìÜQq¹Qq¹S'9¿S'9¿UòUòV–©xV–©xWäI2WäI2Xé0Xé0Y¤òjY¤òjZbZbZ=wýZ=wýZ–öZ–öY«žY«žXñýJXñýJWîüŒWîüŒV¢¤YV¢¤YU§U§S2wXS2wXQFÓQFÓN¬,ÕN¬,ÕL9L9I(…I(…Eù²•Eù²•BšPUBšPU?¯”?¯”;5×G;5×G76Î76Î3ù|3ù|.¯²R.¯²R*.¯Ý*.¯Ý%‰”š%‰”š Ä[< Ä[<âä£âä£éa°éa°ÛånÛån ¾É2 ¾É2–ED–EDfË[fË[ý4«ý4«ø`ø`òÚB»òÚB»íºÊ,íºÊ,èªHièªHiã­Oã­OÞÇÞÇÙýÎ’ÙýÎ’ÕT‹ÕT‹ÐÎ+sÐÎ+sÌp=EÌp=EÈ=ù‰È=ù‰Ä;ÎÄ;ÎÀjûêÀjûê¼Ñ«¼Ñ«¹p¥¹p¥¶Lbƒ¶Lbƒ³g>¬³g>¬°Ãä°Ãä®dzš®dzš¬K_߬K_ߪz;&ªz;&¨òû–¨òû–§¶Ã§¶Ã¦Çâ¦Çâ¦$gÕ¦$gÕ¥ÏÕ¥ÏÕ¥Ég¥Ég¦‡å¦‡å¦§Ì¦§Ì§Œ `§Œ `¨½`Y¨½`Yª;¾ª;¾¬¬¬¬®å.®å.°p °p ³÷Õ³÷յ󿨵󿨹‹Õ¹‹Õ¼|3ɼ|3ÉÀ)aÀ)aÃó!ïÃó!ïÇÿÓÇÿÓÌ>æÌ>æЫSÝЫSÝÕBÒLÕBÒLÙÿ›ÖÙÿ›ÖÞßfÞßfãÜ$VãÜ$VèóŒmèóŒmîZyîZyó[q^ó[q^ø¢¬ø¢¬ýòò¶ýòò¶?ŸÙ?ŸÙm÷©m÷© —zÅ —zŵxÙµxÙÄ(çÄ(ç¿`|¿`|!¢C>!¢C>&iw9&iw9+Ù+Ù/’…¤/’…¤3ìcá3ìcá8ã8ã<()<()?äçë?äçëCy§Cy§FÕZFÕZIô/Iô/LÓÌLÓÌOqM¢OqM¢QÊùQÊùSÝùúSÝùúU©ŠU©ŠW*ÍW*ÍX_ó¶X_ó¶YIN]YIN]Yå~5Yå~5Z3ª¢Z3ª¢Z3›³Z3›³Yå!…Yå!…YHm¿YHm¿X]ó«X]ó«W&V4W&V4U¢£ÚU¢£ÚSÓö SÓö Q»íbQ»íbO\O\L¶¬´L¶¬´IÍ©¾IÍ©¾F£·¤F£·¤C;[›C;[›?—©¤?—©¤;»˜µ;»˜µ7ª Ž7ª Ž3h")3h").÷ìv.÷ìv*]¿î*]¿î%¶E%¶E »àÀ »àÀ¼—¼—¤,}¤,}w)Rw)R :ª :ªñ“ñ“¢Nœ¢NœüQ›üQ›÷e›÷e›ñ»7xñ»7xì€%ì€%çUêçUêâA¤âA¤ÝFU–ÝFU–Øj¡Øj¡Ó°ªÙÓ°ªÙÏmÑÏmÑÊ·ŽÊ·ŽÆö¡Æö¡Â{—PÂ{—P¾®ç¾®ç»Úë»Úë·ÅJh·ÅJh´°y²´°y²±ß=±ß=¯T8ϯT8Ï­Ôæ­Ôæ«(T«(T©o))©o))¨Sñ¨Sñ§)ȧ)ȦH‚x¦H‚x¥Ýgœ¥Ýgœ¥Ä ¥Ä ¥ü꟥ü꟦‡• ¦‡• §dd§dd¨‘CR¨‘CRª«‰ª«‰«Úw²«Úw²­ó¼­ó¼°X„°X„³ÙP³ÙPµú>>µú>>¹33¹33¼­AI¼­AIÀeÕ’ÀeÕ’ÄY"`ÄY"`ȃó•ȃó•ÌâI4ÌâI4Ñp=°Ñp=°Ö)Ï-Ö)Ï-Û K Û K à îùà îùå/ \å/ \êj=êj=ï¹0°ï¹0°õŠçõŠçúOúOÿôÞIÿôÞISÆSÆ ›üë ›üëá·­á·­€ € ;ik;ikGºGº$:÷$:÷) d‰) d‰-¹då-¹då2>W¤2>W¤6—5w6—5w:¿@:¿@>³5%>³5%Bo"9Bo"9Eï½Eï½I1Í„I1Í„L2+L2+NîJ+NîJ+QcF”QcF”S5ÅS5ÅUo–ãUo–ãWlWlXG³~XG³~Y<¨ýY<¨ýYàMYàMZ3:‘Y>:‘XIf~XIf~WÆWÆUn³^Un³^S‹E1S‹E1Q[Q³Q[Q³Nà”nNà”nL[ðL[ðI=I=EÇBòEÇBòB:1B:1>o>o:k99:k9960œš60œš1Þ1Þ-(/w-(/w(b—d(b—d#wJ#wJjPtjPt@Ä @Ä ÿJ{ÿJ{ª¦çª¦ç G×® G×®ÛÊcÛÊcþk’Hþk’Høü5ƒøü5ƒó’È.ó’È.î4X5î4X5è忇è忇ã¬wžã¬wžÞŒå/ÞŒå/ÙŒ~ÙŒ~Ô®¬ÁÔ®¬ÁÏù^¿Ïù^¿Ëp„üËp„üÇ’«Ç’«Âõ‡XÂõ‡X¿ ^¿ ^»^þ»^þ·ðúa·ðúa´ÇZ ´ÇZ ±äi°±äi°¯JÛ.¯JÛ.¬ýUÕ¬ýUÕªþ „ªþ „©O ã©O ã§òq§òq¦èI®¦èI®¦3é¦3é¥Ó­¥Ó­¥ÈË‚¥ÈË‚¦B5¦B5¦µ–𦵖ð§«ã¬§«ã¬¨öÔŽ¨öÔŽª”¼ª”¼¬„ÉÙ¬„ÉÙ®Ä%®Ä%±Rºo±Rºo´,(É´,(É·O·Oº·¥]º·¥]¾c •¾c •ÂN¡ÂN¡Æuæ[Æuæ[ÊÔ›©ÊÔ›©Ïgv8Ïgv8Ô)ZæÔ)ZæÙcÙcÞ)d]Þ)d]ã]ºŠã]ºŠè®„Ð讄Ðî Vî Vópœópœùʹùʹþ¦;ƒþ¦;ƒ,d,d ˆdŠ ˆdŠîÇÎîÇÎDè$Dè$ŠòŽŠòŽ·ì=·ì=#ÊAó#ÊAó(ºkK(ºkK-†w-†w2&®ç2&®ç6™‰Ÿ6™‰Ÿ:Ù+:Ù+>â+ï>â+ïB°>™B°>™F@L2F@L2IŽV*IŽV*L—ŽžL—ŽžOX¿µOX¿µQÏXØQÏXØSøçœSøçœUÓ3íUÓ3íW\ˆóW\ˆóX“mX“mYuúYuúZÖ}ZÖ}Z]>þÍ÷SþÍ÷Sù?>¬ù?>¬ó¶{ó¶{î9Éî9ÉèÌg,èÌg,ãuÂãuÂÞ:oFÞ:oFÙ‚­Ù‚­Ô*ÊÔ*ÊÏ_ Ï_ ÊÃ,ëÊÃ,ëÆZõíÆZõíÂ*ï6Â*ï6¾7#]¾7#]ºƒ¯çºƒ¯ç·)è·)è³ì-ß³ì-ß±Ð0±Ð0®)®)¬?”¬¬?”¬ªR¤¤ªR¤¤¨ºG¨ºG§x'Ÿ§x'Ÿ¦³¦³¥ûÐd¥ûÐd¥Ã\'¥Ã\'¥äl¥äl¦_OĦ_Oħ3E€§3E€¨`¨`©äÅ©äÅ«¾ˆZ«¾ˆZ­í‘­í‘°n/°n/³>×þ³>×þ¶]#«¶]#«¹Å ҹŠҽtpì½tpìÁf~aÁf~aŘb¹Å˜b¹Ê“Ê“ΨîNΨîNÓ~¬pÓ~¬pØ‚+AØ‚+AݭճݭճâüÜâüÜèiÞ¨èiÞ¨íïXíïXó‡ÒÖó‡ÒÖù,\ûù,\ûþÛèþÛèrtyrty û} û}«}«}òƒòƒS¶S¶š 8š 8$ÃŽ$ÃŽ)ÈpX)ÈpX.¦³.¦³3Uœñ3Uœñ7Ô!Ÿ7Ô!Ÿ<¶Ù<¶Ù@)G"@)G"C÷ÉC÷ÉG„11G„11JÊO-JÊO-MÇDJMÇDJPw·lPw·lRÙôRÙôTè×_Tè×_V¤Ñ—V¤Ñ—X LÿX LÿY›yY›yYÑÏÅYÑÏÅZ/ΩZ/ΩZ4m[Z4m[Yß3•Yß3•Y0±@Y0±@X)‚X)‚VÉ·DVÉ·DUlºUlºS'ˆS'ˆP©‰þP©‰þMúSMúSJü7kJü7kG²õÃG²õÃD!YþD!Yþ@K æ@K æ<3ª#<3ª#7ßZ7ßZ3RN43RN4.‘í.‘í) câ) câ$…(t$…(tDzÙDzÙãžëãžëgûgû×× 6‚ô 6‚ô‹ü§‹ü§ýÝ;JýÝ;Jø0‡ø0‡òŠ&òŠ&ìñO ìñO çkCcçkCcáý²?áý²?Ü®ªÜ®ª×‚ Hׂ HÒ~ÁÒ~ÁÍ©ÓÍ©ÓÉ4É4ÄœÅ-ÄœÅ-Àn·AÀn·A¼|£¼|£¸Ù#¸Ù#µy6µy6²fOp²fOp¯¢£¯¢£­1ŠS­1ŠS«´«´©Qà©Qà§åûw§åûw¦Õòë¦Õòë¦!ø/¦!ø/¥Ë7{¥Ë7{¥ÑÇô¥ÑÇô¦62¦62¦÷­â¦÷­â¨F¨F©Ü&©Ü&«d#!«d#!­zë­zë°oè°oè²éÇ ²éÇ ¶]ݶ]ݹ†LX¹†LX½E»|½E»|ÁK5šÁK5šÅ“'ºÅ“'ºÊµÊµÎ׃¬Î׃¬ÓʃJÓʃJØì|èØì|èÞ8reÞ8reã¨$¬ã¨$¬é7cé7cîÝ’HîÝ’Hô˜’ô˜’ú]bºú]bº.ï.ïçå‚çå‚ 20 20,О,О¸;]¸;]/ƒv/ƒv!ˆÕ!ˆÕ&Á÷&Á÷+ÒðG+ÒðG0¸—¯0¸—¯5l5b5l5b9ê5P9ê5P>,è£>,è£B0SB0SEð–ùEð–ùIi;hIi;hL–´KL–´KOuªÓOuªÓR&^R&^T<91T<91VÁŽVÁŽW¨YkW¨YkXׯÅXׯÅYªÿ£Yªÿ£Z!ÂKZ!ÂKZ:è Z:è Yö­¡Yö­¡YTÆÜYTÆÜXV,—XV,—Vû^äVû^äUF UF S7íS7íPÒŸPÒŸNê§Nê§K ÷K ÷G±G±D îwD îw@M@M;ë~e;ë~e7zœq7zœq2ÎùÒ2ÎùÒ-íng-íng(ÛO(ÛO# # 8è¶8è¶´\N´\NÝÝ a : a :ž0ž0Ò° Ò° üŽ«üŽ«ö:4ö:4ðy?Vðy?VêÈTÑêÈTÑå-MVå-MVß®7Áß®7ÁÚPìCÚPìCÕ3˜Õ3˜ÐªñЪñË<¸mË<¸mÆž§éÆž§éÂ=cãÂ=cã¾ÑP¾ÑPºDHPºDHP¶µ2C¶µ2C³t?˳t?˰…KX°…KX­ëN.­ëN.«© «© ©Â*©Â*¨7ž~¨7ž~§ yÔ§ yÔ¦?mC¦?mC¥Ô6¥Ô6¥ÊhÌ¥Êh̦"5i¦"5i¦Û‹s¦Û‹s§õ,§õ,©o7n©o7n«Gj«Gj­{<<­{<<° zU° zU²îøÊ²îøÊ¶(õñ¶(õñ¹³šŸ¹³šŸ½‹º½‹ºÁ¬vgÁ¬vgÆYòÆYòÊ·}°Ê·}°Ï˜JRϘJRÔ­ËVÔ­ËVÙôyÙôyßdCHßdCHäùüÔäùüÔê¬G—ê¬G—ðxâÀðxâÀöT]²öT]²ü?xþü?xþ%Vë%Vëîè‘îè‘ ´E[ ´E[j$j$ Ó Ó• n• n#ý˜##ý˜#)@k)@k.W Ñ.W Ñ3>F 3>F 7î[¨7î[¨.,û>.'ÄŸ'ÄŸ"`È&"`È&×ú×ú,þÁ,þÁhȸhȸ Ç> Ç>«[ó«[óÿ¿Æÿ¿ÆùÒVHùÒVHóëÌlóëÌlîtîtèKaqèKaqâžqÁâžqÁÝj·Ýj·×ª ø×ª øÒp*Òp*Íg‹Íg‹È–ÉÈ–ÉÄMßÄMß¿²'6¿²'6»¨Y±»¨Y±·êh¨·êh¨´|¬ù´|¬ù±c±c®¡"¢®¡"¢¬:(u¬:(uª0Øcª0Øc¨‡Àœ¨‡Àœ§@ª£§@ª£¦]j¦]j¥ÞÍ~¥ÞÍ~¥Åçë¥Åç릂§¦‚§¦Äî>¦Äî>§Û퇧Û퇩W ´©W ´«4è«4è­q§­q§° ¶° ¶³-ų-ŶPüá¶Püá¹óPŸ¹óPŸ½åV,½åV,Â#kÂ#kƨ"ÔÆ¨"ÔËoÚËoÚÐr=Ðr=Õ¬oVÕ¬oVÛ¤²Û¤²à­xQà­xQæh>·æh>·ì@1lì@1lò0Æò0Æø/–ø/–þ<¨Êþ<¨Ê3cð3cð T‰ T‰ùÅmùÅmÅüåÅüå}¸}¸!{ñ!{ñ&‰JÔ&‰JÔ+Ò­ª+Ò­ª0ìòc0ìòc5Ѓû5Ѓû:y`D:y`D>á ¤>á ¤CwýCwýFÛ7úFÛ7úJdq3Jdq3Mšµ´Mšµ´Pz‰Pz‰S€S€U)¡U)¡Vó€ŒVó€ŒX[ÇdX[ÇdYa˜Ya˜Z¡jZ¡jZ= ÎZ= ÎZ¼6Z¼6Y‚çÛY‚çÛX½X½W4•W4•UxržUxržS[‰S[‰PßÅìPßÅìN*fN*fJ׊CJ׊CGQ¦÷GQ¦÷Cz/jCz/j?U”ç?U”ç:èQ€:èQ€67tË67tË1H.í1H.í, â, â&Å«&Å«!<ú©!<ú©ŽHŽH¿^¿^Öâ1Öâ1 Û‹ì Û‹ìÔ<ÞÔ<ÞýÇØ½ýÇØ½÷½XÂ÷½XÂñ»±_ñ»±_ëÉЮëÉЮåîžñåîžñà0ÚÞà0ÚÞÚ—C(Ú—C(Õ(F”Õ(F”Ïê[ÃÏê[ÃÊデÊデÆÌËÆÌËÁ’®Á’®½S±½S±¹aª¹aªµÁ€%µÁ€%²wQÚ²wQÚ¯‡FH¯‡FH¬ô·N¬ô·NªÂñèªÂñè¨ô¨ô§‹¿ä§‹¿ä¦Šd—¦Šd—¥ñí¥ñí¥Â½ò¥Â½ò¥ý»¥ý»¦¢Jí¦¢Jí§°×§°ש&Æ©&Æ«Aö«Aö­C6©­C6©¯å¯ ¯å¯ ²ç|²ç|¶DCí¶DCí¹ù3˹ù3˾Ý}¾Ý}ÂWÚâÂWÚâÆ÷¾OÆ÷¾OËÜžãËÜžãÐÿ,ºÐÿ,ºÖ[ ¨Ö[ ¨Ûè2†Ûè2†á¡à’á¡à’çsaçsaí{ÞÁí{ÞÁóŽEóŽEù°ÜÉù°ÜÉÿÚ—ËÿÚ—Ëè<‹è<‹ í íÂæ`‡æ`‡Ê`bÊ`b”ÔI”ÔI#<—©#<—©(½T(½T.…H.…H3+çÜ3+çÜ8 ª8 ª<¯½µ<¯½µA ùA ùE#E#HÜx@HÜx@LHþsLHþsO\мO\мRFÇRFÇTl*—Tl*—VaöÞVaöÞWòÀFWòÀFYô)Yô)YÞÈ©YÞÈ©Z7j–Z7j–Z&1.Z&1.Y«AY«AXÆ’ÚXÆ’ÚWywWywUÅI—UÅI—S«Á–S«Á–Q/fÒQ/fÒNRÓ¦NRÓ¦K€¨K€¨G†æ©G†æ©CŸZ£CŸZ£?g)»?g)»:ãn_:ãn_6:f6:f1S1S+Èy«+Èy«&N›&N› ¥Ge ¥GeÕ¼Õ¼ä%Žä%ŽÙ«rÙ«r¼À7¼À7”ºÈ”ºÈühêjühêjö@¾‹ö@¾‹ð#Šð#ŠêÀ êÀ ä'ä'ÞW6DÞW6DØ®­ïØ®­ïÓ4îÓ4îÍð~VÍð~VÈçòÈçòÄ!DfÄ!Df¿¢ƒ8¿¢ƒ8»pÿ@»pÿ@·’!·’!´ u¤´ u¤°Þ£V°Þ£V®_4®_4«©q«©q©¦©K©¦©K¨ Ö®¨ Ö®¦ÝÚ¦ÝÚ¦u ¦u ¥Æ—B¥Æ—B¥ßàO¥ßàO¦gRÓ¦gRÓ§\]%§\]%¨¾g¨¾gªŠÉLªŠÉL¬À¨¬À¨¯\¬y¯\¬y²\_b²\_bµ»r–µ»r–¹vÄå¹vÄå½ˆÎæ½ˆÎæÁíàÁíàÆŸC§ÆŸC§Ë˜Új˘ÚjÐÒÑéÐÒÑéÖHÁ<ÖHÁ<ÛñÇúÛñÇúáÉcÅáÉcÅçŪ*çŪ*íâT4íâT4ô-Åô-ÅúX4«úX4«žË™žË™ÈÇŒÈÇŒ ì ì „õ„õþˆkþˆkß­·ß­·$›Ãd$›Ãd*-e*-e/‹ˆf/‹ˆf4±ö4±ö9˜°G9˜°G>;7>;7B’ B’ F™½ÂF™½ÂJK»•JK»•M¤§M¤§PŸD?PŸD?S8Í_S8Í_UmúUmúW: —W: —Xœà=Xœà=Y”çY”çZZZ:*¨Z:*¨Yè_Yè_Y(ZY(ZWúÐãWúÐãVaÄ•VaÄ•T^®ÍT^®ÍQóÚQóÚO$25O$25KòèµKòèµHcôKHcôKD{eÙD{eÙ@>'?@>'?;±!;±!6Ú_6Ú_1¾„k1¾„k,eñ,eñ&Óþb&Óþb!R±!R±&ìz&ìzG.G.ð¯oð¯o´é°´é°méméü"‹kü"‹kõÛŸõ۟éyo;éyo;ãm§Oãm§OÝ„ö?Ý„ö?ׯµÚׯµÚÒ:DÂÒ:DÂÌæ€–Ìæ€–ÇÒZ§ÇÒZ§ÃzÃz¾‚8¾‚8ºQ¶ºQ¶¶xÏQ¶xÏQ²ûø`²ûø`¯àŒ¯àŒ­(¶­(¶ªÙèªÙè¨öXy¨öXy§€Ýï§€Ýï¦{,‚¦{,‚¥æö‘¥æö‘¥ÄæÕ¥ÄæÕ¦x<¦x<¦ØPp¦ØPp¨ ¤œ¨ ¤œ©± x©± x«Ãª«Ãª®Bõ®Bõ±(Ás±(Ás´tÓº´tÓº¸!|¸!|¼*øÞ¼*øÞÀ‹?öÀ‹?öÅ=úØÅ=úØÊ;ä¨Ê;ä¨Ï€:TÏ€:TÕˆËÕˆËÚ½ÑÚ½Ñà¨}Ãà¨}Ãæ½“M潓MìòT"ìòT"óB8 óB8 ù õŒù õŒ Ýt ÝtpÅ’pÅ’ ²0û ²0ûæ:Çæ:ÇÔæÔæëë$Ù$Ù*ƒ|ª*ƒ|ª/ùµU/ùµU53ÚÓ53ÚÓ:,i4:,i4>Ûݧ>ÛݧC=q¥C=q¥GJRGJRJþz,Jþz,NSúNSúQG˜ QG˜ SÔoHSÔoHUøUøW®ãyW®ãyX÷CõX÷CõYÎÀYÎÀZ4ÄjZ4ÄjZ('Z('Y©(_Y©(_X¸UX¸UWV6WV6U„’U„’SF(SF(Pœì¦Pœì¦MŒ§5MŒ§5Jö=Jö=FF§FF§BèóBèó=–…ø=–…ø8Ľ8Ľ3©~23©~2.Khœ.Khœ(±!Z(±!Z"áöï"áöïå$¤å$¤ƒƒ¿)¿) +Ÿ +ŸÆv#Æv#ý\ZÛý\ZÛöôÛööôÛöð˜xfð˜xfêO@³êO@³ä!—zä!—zÞWÇÞWÇØ8^Ø8^ÒŒä|ÒŒä|Í×!Í×!ÇìiÝÇìiÝìììì¾mèã¾mèãº+m?º+m?¶C·<¶C·<²¼/²¼/¯™l­¯™l­¬ßÏ)¬ßÏ)ª’ôÁª’ôÁ¨¶n¨¶n§KÇG§KÇG¦Vè¦Vè¥ÖI¥ÖI¥Í@´¥Í@´¦;]§¦;]§§Ýå§Ýå¨z)ã¨z)ãªHͪHͬˆò¬ˆò¯6nد6nزP¶ ²P¶ µÑðøµÑðø¹¶§Ó¹¶§Ó½ø¥æ½ø¥æÂ“¡“¡Ç€;˜Ç€;˜Ì¹m¾Ì¹m¾Ò6×èÒ6×è×òËá×òËáÝäÃÝäÃäîäîêJ<^êJ<^ð®„ñð®„ñ÷'Yt÷'Ytý­Yý­Y6É…6É… ž—ó ž—óõ¡Fõ¡F9x9x^7¿^7¿#^î¾#^î¾)1 )1 .Ïbî.Ïbî40O˜40O˜9N̽9N̽>"0¿>"0¿B¥ÐåB¥ÐåFÒùFÒùJ¢ã¾J¢ã¾NÍmNÍmQSôQSôSºa³Sºa³Uì6þUì6þW­©W­©Xû+BXû+BYÔ|YÔ|Z6ïñZ6ïñZ"ÏZ"ÏY—ÏY—ÏX–lœX–lœWÔ$WÔ$U5ߊU5ߊRÚÑ‚RÚÑ‚PÏPÏLÞ/ºLÞ/ºIDMSIDMSEH‹òEH‹ò@ð^@ð^èðî>èð礘Ù礘Ùá,ç0á,ç0Úá8æÚá8æÔÊÎìÔÊÎìÎò…§Îò…§Éa Éa Äq Äq ¿2¦Á¿2¦Áº¤Ëɺ¤Ëɶ{ØF¶{ØF²½Æ9²½Æ9¯pzƒ¯pzƒ¬˜ê¬˜êª:à(ª:à(¨Zy¨Zy¦úÇâ¦úÇâ¦}¸¦}¸¥Ä’¥Ä’¥ð&Ü¥ð&ܦ ¹å¦ ¹å§ÔÝ$§ÔÝ$©‹‹h©‹‹h«ÁÕì«ÁÕì®u+ä®u+䱡9¿±¡9¿µAᣵA᣹Q” ¹Q” ½Ê§z½Ê§z¦‡Â¦‡ÇÞCÇÞCÍiâÍiâÓAßÓAßÙ\<;Ù\<;ß°ê"ß°ê"æ7–€æ7–€ìänìänó¯Õó¯Õú‹¤¶ú‹¤¶vvJ™1J™1dõdõ¨ô™¨ô™.Æ.Æ"Ž/¥"Ž/¥(º·ô(º·ô.­ÿõ.­ÿõ4];4];9ÁE«9ÁE«>Ñ^>Ñ^C†ÉTC†ÉTGÙèOGÙèOKÄ«KÄ«OAºOAºRI½7RI½7TÚXÖTÚXÖVî±Vî±Xƒã`Xƒã`Y— ¹Y— ¹Z&ÞxZ&ÞxZ1ÞšZ1ÞšY¸SY¸SXº<ëXº<ëW9lrW9lrU7kSU7kSR·„wR·„wO¼ÈO¼ÈLKç!LKç!Hij{Hij{DOŒDOŒ?g~¿?g~¿:U Ã:U Ã4ëZ…4ëZ…/2Z/2Z)2V)2V"ôW$"ôW$nÑnÑãQ°ãQ°#´"#´"LÀ6LÀ6h‘‰h‘‰ú:ú:ó¡ûó¡ûìÔ>åìÔ>åæ"„æ"„ß–öÊß–öÊÙ;n)Ù;n)Ó™ùÓ™ùÍ:ÂHÍ:ÂHǧÝýǧÝýÂipãÂip㽇}~½‡}~¹ “ï¹ “ï´öŠ™´öŠ™±TÓŸ±TÓŸ®)è`®)è`«zúº«zúº©KýU©KýU§ Æ§§ Æ§¦{¡Ü¦{¡Ü¥ÞõÎ¥ÞõÎ¥ËQ'¥ËQ'¦Ažq¦Ažq§@¦n§@¦n¨ÇÑY¨ÇÑYªÔ&-ªÔ&-­c‹l­c‹l°qX5°qX5³ù÷³ù÷·÷0~·÷0~¼cý¸¼cý¸Á8ÆëÁ8ÆëÆo"¾Æo"¾ËþZjËþZjÑÞ«cÑÞ«cØ–NØ–NÞmƒÞmƒå1å1ëÍKÐëÍKÐò³Lò³Lù­¤ù­¤µ»µ»¢8¢8zH¤zH¤Aê?Aê?ç|@ç|@"f "f (¯Å(¯Å.¾h.¾h4…þò4…þò: ð: ð?":¡?":¡CæR±CæR±HC˜WHC˜WL4yL4yO±äO±äR·)ö”U>ö”WE´ÕWE´ÕXÇÞlXÇÞlYà MYà MZ5ÆÌZ5ÆÌZäsZäsY~”ËY~”ËXUfÅXUfÅV¥9hV¥9hTp#žTp#žQ¹³gQ¹³gN…ˆEN…ˆEJØÂŒJØÂŒF¸~rF¸~rB+IçB+Iç=7§©=7§©7åg]7åg]2G„ô>Bö`ðBö`ð=üÕÍ=üÕÍ8ŸÜ{8ŸÜ{2è½2è½,Þf=,Þf=&Œoô&ŒoôüÁüÁ7Ú7ÚJtšJtš ?a ?a º ºüûtüûtõÙg»õÙg»îÇHÄîÇHÄçÐ(³çÐ(³àÿ*”àÿ*”Ú_}¯Ú_}¯Óûº•Óûº•ÍÞr·ÍÞr·Èu8Èu8žj žj ½Ž–½Ž–¸é6¸é6´¶®´¶®°þ)4°þ)4­Å£ï­Å£ï«yK«yK¨éXâ¨éXâ§MÄǧMÄǦBÑ ¦BÑ ¥ÊL¥ÊL¥äËG¥äËG¦’›v¦’›v§Ó0L§Ó0L©£í›©£í›¬⽬â½®ëhI®ëhI²Yï̲Yï̶Gà̶Gà̺°#캰#쿊Y¨¿ŠY¨ÄÏüÜÄÏüÜÊw þÊw þÐwô Ðwô ÖÇH¶ÖÇH¶Ý\°Ý\°ä*jôä*jôë(÷ë(÷òH´ZòH´Zù€çjù€çjÅjÅjìóºìóº`á`áššâ(àâ(à#“µ#“µ* èn* èn0>Ýã0>Ýã6%d>6%d>;¶ #;¶ #@å²Ð@å²ÐE­ ²E­ ²JY JY MälMälQE QE T"éåT"éåVw¯jVw¯jX@;ÃX@;ÃYx×3Yx×3ZÓ!ZÓ!Z3¦Z3¦Y³ùÃY³ùÃX¡Œ¸X¡Œ¸VýéÜVýéÜTË’PTË’PR ܬR ܬNÉ>âNÉ>âK¸NK¸NFÀÜFÀÜB ZB Z<å³<å³7[†7[†1vD€1vD€+>~ +>~ $¾¼;$¾¼;I@I@——ú¸ú¸ȼSȼS‡4ȇ4ÈúB}üúB}üó^Íó^Íëß.ëß.䨛)䨛)Ýþ£Ýþ£×\ ×\ Ðý³Ðý³Êì§ÏÊì§ÏÅ3Æ=Å3Æ=¿Ü´Ý¿Ü´Ýºð†ºð†¶w®˜¶w®˜²y¸h²y¸h®ý° ®ý° ¬ ]Þ¬ ]Þ©¢9 ©¢9 §ÌݧÌÝ¦Š½‡¦Š½‡¥ßë ¥ß력͔¾¥Í”¾¦SWº¦SWº§qJ†§qJ†©$ãb©$ãb«lZy«lZy®C \®C \±¥W±¥WµŒŸ×µŒŸ×¹óĹóľÑC¾ÑCĺ~ĺ~ÉÔoÉÔoÏåøÏåøÖJO˜ÖJO˜ÜöîíÜöîíãàÉãàÉêú êú ò9hÝò9hÝù}ù}õ>Yõ>Y>M>Mr‚r‚©²©²‡ÞK‡ÞK$P©ï$P©ï*Ûèa*Ûèa1!»ä1!»ä7à£7à£<­—Ð<­—ÐAàaÖAàaÖF¦!oF¦!oJõ4žJõ4žNÇyíNÇyíRN*RN*TÙÓWTÙÓWWèWèX²ùúX²ùúYÀâèYÀâèZ7‡-Z7‡-ZÄÛZÄÛY[°"Y[°"X XßX XßV#®_V#®_Sªà)Sªà)P£»‹P£»‹Mq†Mq†Hÿ¡àHÿ¡àDoTYDoTY?iàX?iàX9÷ð9÷ð4"i[4"i[-ó[:-ó[:'uÀ'uÀ ²“ ²“·[N·[N^‡^‡ Fºð Fºðé÷é÷ü…¥Îü…¥Îõ&‚õ&‚íÙ1ÿíÙ1ÿæªVæªVߦWlߦWlØÙ_¨ØÙ_¨ÒO:ÒO:ÌR²ÌR²Æ0{ÏÆ0{ÏÀ±ŽÀ±Ž»žµT»žµT·gô·gô²ä ¼²ä ¼¯KwL¯KwL¬>ƒy¬>ƒy©Ã&©Ã&§Ýo°§Ýo°¦‘`ó¦‘`ó¥àâ0¥àâ0¥ÍõP¥ÍõP¦XJú¦XJú§Ò‹§Ò‹©B©B«œ¿!«œ¿!®‹V®‹V² †² †¶ºI¶ºIºš›¦ºš›¦¿žà¿žàÂÅ4=Å4=Êóî`Êóî`Ñ0ÍÑ0Í×Á¦M§>¦M¨õN¨õN«O9Ê«O9Ê®G@®G@±ÙO±ÙOµýBµýBº¬÷Úº¬÷Ú¿ÞÄø¿ÞÄøÅŠ8ªÅŠ8ªË£†}Ë£†}Ò £uÒ £uØô9ÐØô9Ðà³’à³’çm´jçm´jîø=Ôîø=Ôö£ªö£ªþaW?þaW?$>y$>y ÀXT ÀXT>ì>ì˜ô˜ô#½Å#½Å*¢R›*¢R›18Nÿ18Nÿ7u˜u7u˜u=L„=L„B²íwB²íwGž+ƒGž+ƒL@·L@·OáK/OáK/S)P4S)P4UÖݪUÖݪWåÃäWåÃäYQ(¦YQ(¦ZÛQZÛQZ4°!Z4°!Yª™KYª™KXy“Xy“V¢gwV¢gwT)¡T)¡Q)Q)Md²VMd²VI$¿QI$¿QD[TD[T?øž?øž9O½÷9O½÷3!ý3!ý,“„Z,“„Z%°; %°; …M…Má|á|ŽFŽFÝÿ6Ýÿ6;{;{ø]XÄø]XÄðªðªéDéDᦧᦧÚs#[Ús#[Ó†gÓ†gÌí§Ìí§Æ´d†Æ´d†ÀèfrÀèfr»“ï!»“ï!¶Á³ú¶Á³ú²z±O²z±O®Ç¬9®Ç¬9«¯õ«¯õ©8¹1©8¹1§gáë§gáë¦A|¦A|¥ÆH“¥ÆH“¥ù—¥ù—¦Øý¦Øý¨dµ8¨dµ8ª™‰ ª™‰ ­s1û­s1û°ì˰ìË´ÿ?´ÿ?¹£¦ü¹£¦ü¾Ð6Z¾Ð6ZÄ|UhÄ|UhÊ›£vÊ›£vÑ$C‰Ñ$C‰ØeØeß:}Úß:}Úæ¬Pºæ¬PºîRšõîRšõöÎöÎýø­ýø­ÐÉ^ÐÉ^ …^ø …^ø%”Ç%”Çœfœf#Þî}#Þî}*Ýh®*Ýh®1‹ƒD1‹ƒD7Ûæí7Ûæí= = C4<C4<H&¯H&¯LŽÛƒLŽÛƒPetíPetíS£ S£ V@cßV@cßX9!ãX9!ãYˆh¢Yˆh¢Z,XZ,XZ"£‡Z"£‡Ykõ©Ykõ©X«X«Uûö´Uûö´SHàuSHàuOõ Oõ LLGƒüçGƒüçBvÀ\BvÀ\<èl<èl6ãó>Ã>ó>ÃD^ÚÏD^ÚÏIEIEMš×òMš×òQXe”QXe”Tu‹–Tu‹–VìD(VìD(X·K¥X·K¥YÒä›YÒä›Z<¸`Z<¸`Yó‹QYó‹QX÷õ‹X÷õ‹WK]|WK]|Tñ9!Tñ9!Qí™JQí™JNF­^NF­^J”J”E+¡­E+¡­?ÉNÍ?ÉNÍ9ç:9ç:39m39m,Ñ‘(,Ñ‘(%¸C%¸CRšRš¯5«¯5«ÝlšÝlšìâŸìâŸþíƒ.þíƒ.öïsöïsï¹öï¹öç7v0ç7v0ßQÃßQÃØCÛKØCÛKÑ9æ*Ñ9æ*Êê#Êê#ÄMtÄMt¾…e¤¾…e¤¹AŸ\¹AŸ\´Œôê´Œôê°qBi°qBi¬öé÷¬öé÷ª%x&ª%x&¨ŒÉ¨ŒÉ¦“,¡¦“,¡¥Ùú¥Ùú¥ÙLî¥ÙL¦©§ÿ©:§ÿ©:ª"¬bª"¬b¬ö|¬ö|°t¨»°t¨»´—--´—--¹T–µ¹T–µ¾¤ “¾¤ “Ä{8QÄ{8QÊÍÓ¨ÊÍӨюBáÑŽBáØ¯õôدõôà#.Cà#.CçÙŽ!çÙŽ!ïÂÆïÂÆ÷Íö÷ÍöÿìE8ÿìE8ïBïBÝÄÝį‘a¯‘aPŠ>PŠ>&´Ð&´Ð-Ê#O-Ê#O4„ä14„ä1:ÔÐw:ÔÐw@¯6R@¯6RF ´F ´JÐMJÐMOÓjOÓjR“ñ%R“ñ%U}·U}·Wº6Wº6YCFòYCFòZÂjZÂjZ1özZ1özY”êUY”êUX@EžX@EžV6ÄGV6ÄGS|3\S|3\Pý-Pý-L îÇL îÇGcóGcóB'ʬB'Ê¬Š»>Š»8]U8]U1¶éº1¶éº*¦H9*¦H9#:¨#:¨þ'þ'ŽewŽew p+™ p+™8œ8œúùCzúùCzòýòýꩰÌê©°Ìâ¼p>â¼p>Û ';Û ';Ó¬KÓ¬KÌ©÷=Ì©÷=Æ5íÆ5í¿üç¿üçºlü¹ºlü¹µrúvµrúv±H0±H0­iœ­iœªlªl¨'pÿ¨'pÿ¦ ÝÝî¥ÛÈ&¥ÛÈ&¥ÚXÿ¥ÚXÿ¦œzƦœzƨ!Aï¨!Aïªeuªeu­c×&­c×&±‚®±‚®µvM²µvM²ºx—½ºx—½À'ÓÀ'ÓÆ;0šÆ;0šÌâeèÌâeèÓùäÓùäÛr~ìÛr~ìã;Q·ã;Q·ëFºëFºó|ê§ó|ê§ûÓŽcûÓŽc-7#-7# báà báÀöЀöÐsRsR$)¯F$)¯F+“h+“h2Ÿÿ“2Ÿÿ“9@îÈ9@îÈ?fÚY?fÚYEm¯Em¯J5ëJ5ëNzTWNzTWR;ÒR;ÒULŒ²ULŒ²W¤yW¤yY?j`Y?j`Z‘YZ‘YZ.ÙfZ.ÙfY€â:Y€â:X¾@X¾@UàŠfUàŠfRõu´Rõu´OU ~OU ~KpLKpLFnÃFnÃ@‰è@‰è:p”·:p”·3Ö»Õ3Ö»Õ,Ê G,Ê G%[‚T%[‚T™¯þ™¯þ•å…•å… aëH aëHm´m´ü±Žü±ŽôXÜÑôXÜÑì¨rì¨rä: ä: Ü-öNÜ-öNÔ¤ÈûÔ¤ÈûÍzø’Ízø’ÆÀ\ÆÀ\ÀƒzzÀƒzzºÒåºÒåµ»}ìµ»}ì±Ho|±Ho|­„ ò­„ òªvö¾ªvö¾¨(4¨(4¦œð¢¦œð¢¥Ù¥Ù¥Þ§u¥Þ§u¦­™¦­™¨DÌ’¨DÌ’ª [lª [l­¼f­¼f±ì±ì¶SضSØ»@„<»@„<ÁÄ%ÁÄ%Ç\}„Ç\}„Î2£ãÎ2£ãÕx¢*Õx¢*Ý ÜˆÝ ÜˆåÏåÏíLûéíLûéõ«¤½õ«¤½þ&*]þ&*]žIÌžIÌìðìð݄݄ØiØi&Ö8B&Ö8B.;¡.;¡5;Bú5;Bú;Æ!:;Æ!:A̶1A̶1GBwRGBwRLûLLûLPInÊPInÊSÆÊSÆÊV‰5¼V‰5¼X‹)ëX‹)ëYÈYKYÈYKZ<³Z<³Yçê¤Yçê¤XÉ”…XÉ”…Vä½~Vä½~T<« T<« Pׯ$Pׯ$L¼¤ïL¼¤ïGôô,Gôô,BŠÐ°BŠÐ°<Šm<Šm6ú6ú.ý3.ý3'Ži''Ži'ň ň ´p´plsls@¹@¹þƒ…Yþƒ…Yö jZö jZí¤Èùí¤Èùåi"/åi"/ÝhÓöÝhÓöÕ¶Œ¨Õ¶Œ¨Îc¾Îc¾Ç`Ç`Á~’Á~’»JõØ»JõضÂs¶Âs±…÷±…÷­©«Ü­©«ÜªŠiCªŠiC¨.ò}¨.ò}¦œ¹¦œ¹¥×½µ¥×½µ¥áÇ¥áǦ»Î¦»Î¨b·s¨b·sªÔ†=ªÔ†=® ‡x® ‡x±þØ*±þØ*¶§(¥¶§(¥»ú|J»ú|JÁëÒÁëÒÈm Èm Ïo¨jÏo¨jÖäߟÖäߟ޹DýÞ¹DýæÝ%ÉæÝ%Éï;„ï;„÷•ò÷•ò[¯u[¯uØ Ø ?Ð?ЂoÁ‚oÁ!Šó=!Šó=)I Ð)I Ð0©ß0©ß7›Ùa7›Ùa>®>®C÷jžC÷jžIC©¸IC©¸M鸠M鸠QÝ7ýQÝ7ýUDëUDëW‹õÄW‹õÄY9ŒY9ŒZã"Zã"Z+˜þZ+˜þYmz¢Ymz¢Wá£Wá£UŠÈâUŠÈâRn„¡Rn„¡N“téN“téJp0Jp0DÅ·tDÅ·t>é,o>é,o8zIU8zIU1‡›(1‡›(*!T™*!T™"X3ù"X3ù>Š¢>Š¢æ·xæ·x dyÓ dyÓË1ØË1Øø/N×ø/N×龜«ï¤‡«ç?6£ç?6£ß·)ß·)×2ˆÖ×2ˆÖϰýþϰýþÈŸü)ÈŸü)Â'JÂ'J¼}¼}¶±,$¶±,$±ýû±ýû®]Õ®]ÕªÄR±ªÄR±¨QK¯¨QK¯¦¬Á[¦¬Á[¥Û‡û¥Û‡û¥ß Ï¥ß Ï¦¸oU¦¸oU¨dúq¨dúqªâ bªâ b®(Ùô®(Ùô²3p²3p¶ö#R¶ö#R¼h2мh2ŠÂ{:0Â{:0É"9É"9ÐLIÐLI×é™L×é™Lßç!¯ßç!¯è2¢Ûè2¢Ûð·ûÑð·ûÑùb„ßùb„ßV¯V¯ »î© »î©:/4:/4%%#£ ²#£ ²+eØö+eØö2ÂAg2ÂAg9©Ät9©Ät@ y@ yEÔyêEÔyêJúó'Júó'OrW|OrW|S.R3S.R3V':zV':zXT”ØXT”ØY²öY²öZ;'Z;'Yï/Yï/XÍíXÍíVÚFkVÚFkT2ÅT2ÅPŽCîPŽCîLDm‰LDm‰GDÁ€GDÁ€AšÜáAšÜá;TÎ;TÎ4²4²-+ï-+ï%l3Ÿ%l3ŸR oR oðî3ðî3 \" \"©ÚX©ÚXúí1Cúí1Cò;èCò;èC骒Ó骒ÓáN2=áN2=Ù:˜­Ù:˜­Ñƒ½у½Ê;è…Ê;è…ÃuKÂÃuK½?ï½?ï·«·«²ÅR–²ÅR–®™éÀ®™éÀ«3 Ý«3 ݨ™æ$¨™æ$¦Ô[;¦Ô[;¥çµc¥çµc¥ÕÄ™¥ÕÄ™¦Ÿ´K¦Ÿ´K¨C-ÿ¨C-ÿª½&xª½&x®:)®:)²1¢²1¢¶ë䃶ë䃼qå¼qåœ`œ`É^À#É^À#Ш&ÐШ&ÐØf2âØf2âà‡ tà‡ tèõQ/èõQ/ñžÍñžÍúj„új„I¤I¤ „a „aŸO-ŸO- ÔI ÔI%,‰%,‰,ø—,ø—4Vªß4Vªß;9B ;9B AŒd›AŒd›GB¾áGB¾áLLtLLtPžÈþPžÈþT-ŸäT-ŸäVñ EVñ EXál³Xál³Yú;`Yú;`Z8>Z8>Yš´Yš´X"ÖÎX"ÖÎUÓÒ°UÓÒ°R³9‘R³9‘NÈ}NÈ}J,‹J,‹Dº)‡Dº)‡>¯}ß>¯}ß8 ?¤8 ?¤0Û$0Û$)2Ú•)2Ú•!$ÖF!$ÖFÄõÄõ%ÍÃ%ÍÃ^u^uþ„Avþ„Avõ¬s~õ¬s~ìít#ìít#ä\`=ä\`=ÜdÜdÔzJÔzJ̪̪ŅU¢Å…U¢¿ +)¿ +)¹13¹13´Œ±´Œ±¯š›¯š›«ô\²«ô\²©ãÑ©ãѧ#ìÒ§#ìÒ¦ÍØ¦ÍØ¥Èe.¥Èe.¦lîʦlîʧñˆ§ñˆªS‘¹ªS‘¹­ŒIo­ŒIo±”öÕ±”öÕ¶bƒM¶bƒM»ê\»ê\´^´^ÈîŽ]ÈîŽ]ÐIÅÐIÅØ»ÔØ»ÔàY‰àY‰èæoªèæoªñ«ÛÛñ«ÛÛúšêzúšêzŽc`Žc` _Š` _Š`Ç?Ç?™.,™.,%Ô#Â%Ô#Â-±å™-±å™5d5d< ôÖ< ôÖB`ÇB`ÇHuHuM#!M#!QQIKQQIKTÆÑ8TÆÑ8WiÄ\WiÄ\Y2QY2QZ´ Z´ Z%_MZ%_MYLçêYLçêW”2'W”2'U)ÖU)ÖQ–#¼Q–#¼M_9”M_9”Hdÿ¢Hdÿ¢B´k|B´k|*¦">*§gÌå§gÌå©’8p©’8p¬›﬛ï°{þ°{þµ* ¥µ* ¥ºšŸéºšŸéÀ¾±ÆÀ¾±ÆÇ‡Â˜Ç‡Â˜Îã\çÎã\çÖ¿•VÖ¿•Vßf-ßf-ç¥òkç¥òkð„Üð„ÜùŒláùŒl᧬¢§¬¢ ¡( ¡(w=[w=[—U—U%x„u%x„u-vÜe-vÜe5¯‡5¯‡<9<9BpÖìBpÖìH4*H4*M>ŸM>ŸQ„ÈqQ„ÈqTùö™Tùö™W–MW–MYQ¼­YQ¼­Z(mqZ(mqZ0ëZ0ëYy!Yy!W@ [W@ [T€·FT€·FPçöPçöL|JëL|JëGKl|GKl|AašÃAašÃ:Íÿþ:Íÿþ3¡H=3¡H=+î£+î£#ÇÖh#ÇÖhCìšCìšx!¯x!¯ {a; {a;dçâdçâ÷Lk§÷Lk§îI ˜îI ˜åt âåt âÜâä:Üâä:Ô¬†¼Ô¬†¼Ìæ¿ÐÌæ¿ÐÅ¥ÔÐÅ¥Ôоý<Œ¾ý<Œ¸þS ¸þS ³¹fQ³¹fQ¯<4¯<4«“'«“'¨ÇÔh¨ÇÔh¦â/—¦â/—¥çEh¥çEh¥Ú)Š¥Ú)Ц»4ª¦»4ª¨ˆ_¼¨ˆ_¼«=Y<«=Y<®Òõ]®Òõ]³@z³@z¸y»±¸y»±¾rÖ¾rÖŜŜÌ]Ì]Ô+¤Ô+¤Üp°~Üp°~åËåËîŒîŒ÷Z÷ZXPxXPx ƒ™{ ƒ™{¥l¥lQ¨ Q¨ #Ú…²#Ú…²,Lâ,Lâ3¡G3¡G:öûÁ:öûÁA‘XA‘XG€)PG€)PL´…L´…QÓ0QÓ0T´Ù²T´Ù²WlüWlüY=kæY=kæZ#OÂZ#OÂZ¸FZ¸FY%¨çY%¨çWD)¿WD)¿T{ýT{ýPÒO5PÒO5LRqÐLRqÐGöGö@ÿÚ@ÿÚ:JªL:JªL2ùM¶2ùM¶+¸Z+¸Z"Ò g"Ò g&Ö&Ö4ŸB4ŸB¡ì¡ìþÛábþÛábõ¦FÄõ¦FÄì‹Oæì‹Oæã£‰o㣉oÛæÓÛæÓÒÌIÒÌIË î<Ë î<ÃÖÈuÃÖÈu½D `½D `·d3å·d3å²Gݨ²Gݨ­üz­üzªŽ› ªŽ› ¨ ¨ ¦mÇ2¦mÇ2¥Æˆµ¥Æˆµ¦c•¦c•§UÇÀ§UÇÀ©ˆ·Ÿ©ˆ·Ÿ¬¦dˬ¦d˰§ÌU°§ÌUµ&9µ&9»&©m»&©mÁˆfÁˆfÈ•E×È•E×Ð:A´Ð:A´ØcÉØcÉàù:àù:éäùòéäùòóÚÖóÚÖü\IÜü\IÜ·E²·E²èKvèKvêlÏêlÏ ±| ±|)em)em1 *71 *78†8†?ƒÖ?ƒÖE¿›E¿›K?ü(K?ü(Oõ‹Oõ‹SÔtÄSÔtÄVЄuVЄuXâšXâšZ¿ÖZ¿ÖZ1t‹Z1t‹Yj5…Yj5…W°^¼W°^¼UàuUàuQwøgQwøgM ÒMM ÒMGÉZÝGÉZÝAÄŠØAÄŠØ; “”; “”3°šµ3°šµ+Çz +Çz #e¸Z#e¸Z¢[¢[”x!”x!UŸUŸþþá‰þþá‰õ©Ü õ©Ü ìpßî>ßåÖfåÖfÜ+³Ü+³Ó¬>ðÓ¬>ðË©›Ë©›Ä9¼ Ä9¼ ½rÌî½rÌî·hqu·hqu²+_W²+_W­Ët›­Ët›ªTÀ_ªTÀ_§Òç§Òç¦JRå¦JRå¥Â³‘¥Â³‘¦<žx¦<žx§·al§·alª.⢪.⢭œp­œp±ö¬M±ö¬M·1 µ·1 µ½=tø½=tøÄ ÞàÄ ÞàË„@ƒË„@ƒÓ•—oÓ•—oÜ)¡Ü)¡å#3/å#3/în%ýîn%ý÷醈÷醈ƒÿƒÿ *å *åXmòXmòvíÈvíÈ&?õ.&?õ..ŸÍ.ŸÍ6{ =6{ ==½ÁÎ=½ÁÎDQR‡DQR‡J$&&J$&&O$‚^O$‚^SD‚cSD‚cVwÁwVwÁwX´øšX´øšYõv;Yõv;Z5-ÌZ5-ÌYsT$YsT$W±h‰W±h‰Tô‚CTô‚CQCµÏQCµÏL©¾cL©¾cG3$G3$@ïuS@ïuS9ðIŽ9ðIŽ2Iáù2Iáù*–W*–W!_\å!_\åK°K°ññj ƒj ƒûÒ„«ûÒ„«òEÎÞòEÎÞèàFèàFß¼ ¥ß¼ ¥ÖôçìÖôçìΣȇΣȇÆá}oÆá}o¿ÄG¿ÄG¹až\¹až\³ËËí³ËËí¯ù¯ù«G”í«G”í¨r¯3¨r¯3¦6g¦6g¥Í‹Ó¥Í‹Ó¦¹9¦¹9§F&§F&©Š»Ã©Š»Ã¬ÍÛ0¬ÍÛ0±¶ô±¶ô¶&š£¶&š£¼!y‚¼!y‚Âå Âå Ê]ÊíÊ]ÊíÒudÒudÛ¾Û¾ä!òä!òíƒÓGíƒÓG÷n÷nÒ‹ÌÒ‹Ì pm< pm<ãjÌãjÌ#$#$& Ó‘& Ó‘.‰Œ.‰Œ6!U6!U=Ø‘´=Ø‘´D}”kD}”kJ\ÓJ\ÓObðÑObðÑS‚¡áS‚¡áV®M€V®M€XÝO¿XÝO¿Z3âZ3âZ+ÅúZ+ÅúYFßýYFßýW\ øW\ øTppáTppáPŒYPŒYKºëŽKºëŽF ñjF ñj?Š þ?Š þ8Mí¸8Mí¸0jî¼0jî¼'÷ç!'÷ç! â âÆ×|Æ×| >h1 >h1{Æ{ÆøÚ‹øÚ‹ï7‘zï7‘z寰寰ܡiáÜ¡iáÓå7ÏÓå7ÏË«L¢Ë«L¢Ä ÂóÄ Âó½ ½ ¶ú€¶ú€±®Í±®Í­Lø ­Lø ©â {©â {§yK{§yK{¦„T¦„T¥È4¥È4¦…95¦…95¨P4¯¨P4¯«"âÆ«"âÆ®ö0º®ö0º³½È“³½È“¹l´Y¹l´Y¿ðìy¿ðìyÇ8$ÄÇ8$ÄÏ+ÍÏ+Í×´"¶×´"¶à·„^à·„^ê þê þóÂ!¹óÂ!¹ý|ý|f[f[ Ûˆ Ûˆy°Žy°Ž#œï¯#œï¯,Tí,Tí4‹šy4‹šy<$îV<$îVC ïIC ïII,/I,/NrcÃNrcÃRÍs˜RÍs˜V1ÔÒV1ÔÒX“lAX“lAYì,ÞYì,ÞZ6pxZ6pxYryYryW "³W "³TƃòTƃòPìÊ:PìÊ:LÏSLÏSFjLÅFjLÅ?àx?àx8”ÒE8”ÒE0‘0‘(.o(.o Ùm Ùm¥WR¥WR ýä ýä/:è/:èøY ?øY ?îšZdîšZdåßWåßWÛÔ²ÁÛÔ²ÁÓ¹JÓ¹JÊÃkâÊÃkâà ÁŠÃ Áм7Ýp¼7Ýp¶Š­¶Š­°åsñ°åsñ¬Ÿ'p¬Ÿ'p©Xê^©Xê^§<®§<®¥ñQh¥ñQh¥Û<¥Û<¦Û8ë¦Û8ë¨íáÖ¨íáÖ¬§âb>§ØÓ±ØÓ±ÏÆãµÏÆãµÇ[Ê0Ç[Ê0¿¯Ù¿¯Ù¸ÚA¸ÚA²ôùù²ôùù®®ªFO–ªFO–§šÈƧšÈƦõ™¦õ™¥ËO­¥ËO­¦®GÕ¦®GÕ¨ÀIj¨ÀIj«û›ª«û›ª°TÅ|°TÅ|µ¾µ¾¼$àμ$àÎÃtŒÃtŒË’´WË’´WÔeW«ÔeW«ÝÎfÝÎfç¬òÎç¬òÎñáOñáOüD°¬üD°¬ºm0ºm0¸Ì¸Ìµµ$±£o$±£o-â9-â96{•R6{•R>\ŒÕ>\ŒÕEm…%Em…%K“¼ÀK“¼ÀP¼M«P¼M«TÓ¢ÐTÓ¢ÐWÍaWÍaYœÎðYœÎðZ=n«Z=n«Y«œEY«œEWétiWétiTü!äTü!äPí|•Pí|•KÊÌ„KÊÌ„E¥EFE¥EF>‘‹ý>‘‹ý6§fá6§fá.·t.·t$½­¯$½­¯úð°úð°Ú¢öÚ¢öz—z—ü ØÓü ØÓñ¦¢—ñ¦¢—çp“çp“ÝêÊÝêÊÔ ÏŒÔ ÏŒËIÁ;ËIÁ;Ã'¬âÃ'¬â»Ö™^»Ö™^µpi]µpi]° -î° -N@«ºN@¨Œ²F¨Œ²F¦Ž&*¦Ž&*¥Åš¥Åš¦6‚¾¦6‚¾§ß|˜§ß|˜ª»Q̪»QÌ®Àl®Àl³áH³áHº ùº ùÁ+uGÁ+uGÉ'Ô=É'Ô=ÑäëÑäëÛCÙäÛCÙäå#Õ‡å#Õ‡ïe.¼ïe.¼ùÞÆQùÞÆQt¯Tt¯TèHBèHBÛyÛy"ö 5"ö 5,Z”â,Z”â5)›­5)›­=@‘^=@‘^D†:lD†:lJÞû(JÞû(P6:…P6:…Twí Twí W•Õ·W•Õ·Y„3mY„3mZ<;èZ<;èYºòåYºòåX–ïX–ïUÏUÏQ—aQ—aKÒ¬8KÒ¬8Eš[VEš[V>n¶<>n¶<6g·þ6g·þ-¡ùa-¡ùa$;X$;XT®KT®KiXiX“ “ ûгûгð~ÒÔð~ÒÔæ2"æ2"Ü?„Ü?„ÒÉ„¸ÒÉ„¸Éò(ïA>(ïA4ë'ƒ4ë'ƒ*¼ŸŒ*¼ŸŒÊP„ÊP„F¡áF¡áe¥e¥ü\,gü\,gðbWôðbWô䮢ÿ䮢ÿÙvK*ÙvK*ÎìðµÎìðµÅBùMÅBùM¼¤Ø*¼¤Ø*µ:£¹µ:£¹¯&aœ¯&aœª„ùĪ„ùħkwC§kwC¥é‚D¥é‚D¦ ¦ §À¼V§À¼V«Kö«Kö¯í¯í¶9F[¶9F[½ÜiýÜiÃÆ±寱åБ­Б­ÛMgKÛMgKæ¶¼ÿæ¶¼ÿò“ùò“ùþ´çþ´ç ÔRà ÔRà¨y¨y"yk"yk,î®É,î®É6ø%ø6ø%ø@é#@é#GñN GñN N’ÝzN’ÝzSÌF¦SÌF¦W…¯&W…¯&Y¬ÁY¬ÁZ7ÓÃZ7ÓÃY#8Y#8Vs¹ŽVs¹ŽR4ßVR4ßVLzPcLzPcE]a E]a <ÿç<ÿç3…Dä3…Dä)àÿ)àÿò‰Ìò‰Ì=X=X1†Ã1†Ãúçúçíø«ííø«íâ<ëâ<ë×ú×úÌ“ÂÂÌ“ÂÂà }|à }|º£>º£>³|b³|b­ºµº­ºµº©zÑ©zѦÎàÞ¦ÎàÞ¥ÅÌ&¥ÅÌ&¦dé;¦dé;¨¨éè¨éìˆÙh¬ˆÙh±ñ“]±ñ“]¸ËÕ?¸ËÕ?Àõ«ZÀõ«ZÊK‚ÊK‚ÔžÔžßÂúßÂúë|…Ñë|…Ñ÷ž ÷ž Ý•IÝ•IòyNòyNÂÂ'£'£1ªÈ¼1ªÈ¼;]¥‘;]¥‘CüwCüwK^7óK^7óQ_æ!Q_æ!Uå= Uå= X×ýX×ýZ*„™Z*„™YÕ5çYÕ5çWÚ ¬WÚ ¬T@ÃT@ÃOÜ.OÜ.H~ôµH~ôµ@ŒæÌ@ŒæÌ7hšN7hšN->C->C";Är";Är–Ék–Ék „ö¿ „ö¿þ@m…þ@m…ò\3ò\3æ×Çæ×ÇÚƒÚƒϱÚdϱÚdÅÅ'wÅÅ'w¼í3 ¼í3 µTõTïÎ-¯Î-ªkSçªkSç§P³(§P³(¥ÞdÍ¥Þdͦ¡…¦¡…¨Hå¨H嫚ý¹«šý¹°Äº°Äº·j¨·j¨¿nßé¿nßéȪIȪIÒóPšÒóPšÞÑ<ÞÑ<éݹ¡éݹ¡öŠtöŠtxZ2xZ2ÆVœÆVœ¹/¹/&3Å&3Å0öåu0öåu:Óã„:Óã„C˜HOC˜HOK‘K‘Q9]ZQ9]ZUÓ‹UÓ‹XÓ…mXÓ…mZ*˜FZ*˜FYÑÞYÑÞWÊ#WÊ#T>T>NÛ(òNÛ(òHé$Hé$@c@c6¶m6¶m,^‹ ,^‹ !0H}!0H}_ö_ö '’ '’üÁÏüÁÏðiOmðiOmä[LTä[LTØÒ~ØÒ~Î.ºÎ.ºÄ+ÛsÄ+Ûs»sÿ»sÿ´4s´4s® p<® p<©  ¤©  ¤¦ÙÕ¹¦ÙÕ¹¥Åü~¥Åü~¦kSĦkSĨƘ¢¨Æ˜¢¬Íɤ¬Íɤ²ljê²lj깉 j¹‰ jÁÿ]ëÁÿ]ë˨®å˨®åÖR“¸ÖR“¸áÍBÃáÍBÃíÚ„RíÚ„RúH1¼úH1¼ßÌßÌñÎñÎø¤šø¤š*P¦*P¦4Þ-ð4Þ-ð>jÕ’>jÕ’FÉ·×FÉ·×MÐsÍMÐsÍS]! S]! WSÃWSÃY §¡Y §¡Z8ýZ8ýYG½YG½V@ž×V@ž×QÄ %QÄ %K¶ZdK¶ZdD4ZiD4Zi;bÍ2;bÍ21l?51l?5&¢¿&¢¿Ø ¬Ø ¬©&H©&H0wR0wRõ«  õ«  éXoméXomÝsßfÝsßfÒ9NÒ9NÇß—§Çß—§¾›Wо›Wжšsà¶šsà°;R°;RªüÁýªüÁý§š¤ë§š¤ë¥ðMV¥ðMV¦yC¦yC§Ý“õ§Ý“õ«l4«l4°¢ãH°¢ãH·f1·f1¿–"v¿–"vÉÅQÉÅQÓ‘EôÓ‘EôÞø9rÞø9rë”öë”ö÷€Z1÷€Z1)ã,)ã,®14®14Ìv`Ìv`(cO×(cO×30S:30S:=þ6=þ6E¦°·E¦°·LòµLòµRÀx»RÀx»VóÿwVóÿwYvÚÃYvÚÃZ<ªuZ<ªuY@ŠRY@ŠRV‡SV‡SR0†R0†La5La5D–IñD–Iñ;»ål;»ål1µFo1µFo&´$&´$ï›%ï›%¢X9¢X9 :+ :+õf]Âõf]Âèö–jèö–jÜù]Üù]Ñ«è«Ñ«è«ÇFôèÇFôè½ÿ®õ½ÿ®õ¶*ã¶*㯀†°¯€†°ª’쇪’쇧VU[§VU[¥Û/¥Û/¦*J„¦*J„¨AË·¨AË·¬¼•¬¼•±šÈe±šÈe¸®l¸®lÁ,ó’Á,ó’Êï ùÊï ùÕ¿º©Õ¿º©álmálmí³í³ú^q?ú^q?ÐКá/šá/¿©Ô¿©Ô+Bõ…+Bõ…5îÁ5îÁ?Š"2?Š"2Gåä¬Gåä¬NÖ;ÆNÖ;ÆT8ÍT8ÍWïWïYèäYèäZyZyX€É|X€É|U%lÖU%lÖP™„P™„IqxIqxASbQASbQ7çfò7çfò-\ð-\ð!è6!è6ĿĿ 1B1 1B1ülülï¹M…ï¹M…ãWÌ+ãWÌ+׈®è׈®è̈&Ÿ&YÂÉþÂÉþ¹ÒÐJ¹ÒÐJ²º²º¬º»v¬º»v¨¤¨¤¦Q½¦Q½¥Í¥ͧ1[§1[ª;Aìª;A쯂\¯‚\µ•ÛIµ•ÛI½™Û"½™Û"Æ÷eÆ÷eÑê‹Ñê‹Üúv‘Üúv‘é/k(é/k(õÙ’4õÙ’4¿_ƒ¿_ƒŠ©¤Š©¤ï1hï1h'ÊI“'ÊI“2ב‡2ב‡<áŸÙ<áŸÙE²'ôE²'ôM‘°M‘°Rùr2Rùr2W*-\W*-\Y˜«eY˜«eZ7XZ7XYYV€ÇV€ÇQ?Ä Q?Ä J×ìùJ×ìùBêÄÕBêÄÕ9Ÿù÷9Ÿù÷/(Žo/(Žo#¹£b#¹£bŒ)Œ) 裢 裢þ·þ·ñ/VÛñ/VÛä£a—ä£a—Ø¥72Ø¥72Ít>EÍt>EÃKTQÃKTQº`(Ùº`(Ù²âDʲâDʬù!~¬ù!~¨Å t¨Å t¦[àø¦[àø¥Ì ‡¥Ì ‡§Æw§Æwª:n’ª:n’¯"3 ¯"3 µ·ÍJµ·ÍJ½Ö~ž½Ö~žÇVu ÇVu Ò”ÃÒ”Ãݦ4Þݦ4ÞéÿTéÿTöÒY²öÒY²ЋЋ fF fFž_ž_)ûè)ûè4Ä:4Ä:>•È>•ÈFÈ0€FÈ0€NéýNéýS».S».W¯w·W¯w·YÕhôYÕhôZ"Z"X’-tX’-tU.jûU.jûP1†P1†I8 „I8 „@ãµ3@ãµ376›»76›»,býí,býí ¢Ÿþ ¢Ÿþ3d3dVüìVüìúR7úR7íjE<íjE<àã÷žàã÷žÕ´wÕ´wʬäʬäÀ(ŠíÀ(Ší·Ÿàæ·Ÿàæ°š„°š„«=ù~«=ù~§¨VR§¨VR¥ìƒ+¥ìƒ+¦F¦F¨!ù€¨!ù€¬ÂÛ¬ÂÛ±³ðç±³ðç¹8!¹8!ÁÙ®ÚÁÙ®ÚËþ8ÜËþ8Ü×<|×<|ãYOPãYOPð” ð” ý#¼tý#¼t C-K C-Kp[p[#c˜0#c˜0.û¦€.û¦€9™‘9™‘C C Ko"Ko"Q|@AQ|@AV:§­V:§­Y+^›Y+^›Z¬K¨>¨F|ô¨F|ô¦ l ¦ l ¥ç.¥ç.§›<¥§›<¥«5Pz«5Pz° ÐA° ÐA·Á÷À·Á÷ÀÀp½*Àp½*ÊÊÕ´÷¸Õ´÷¸áÕÁáÕÁîžHoîžHoûÈ‚ûÈ‚ Èï Èïx­x­"~åò"~åò.Båâ.Båâ9 µ9 µB‚B‚JÄ5±JÄ5±QU'±QU'±V) 5V) 5Y'(Y'(ZcW?>cY·‡áY·‡áZ(4Z(4XnãXnãTôz=Tôz=OlÏÂOlÏÂHÌ&HÌ&?s˜?s˜4³˜;4³˜;)U)U‡;‡;Q‡<Q‡<À„ôÀ„ôô#¾Iô#¾IæÊî¹æÊî¹Úú»Úú»Î`¾Î`¾ÃS¦pÃS¦p¹ð"йð"в&—|²&—|¬&@ÿ¬&@ÿ¨‹¨‹¦˜ê¦˜ê¦¶>¦¶>¨3¨3¬9䧬9ä§²F—²F—ºG˜ºG˜Ã–ªÃ–ªÎtÍIÎtÍIÚy¡ÎÚy¡Îç_B£ç_B£ôÖïGôÖïG–%–%-´½-´½]ZI]ZI)çª)çª5yÇC5yÇC?Öf%?Öf%H»µzH»µzOø;Oø;U^2¸U^2¸XÏl,XÏl,Z53IZ53IYˆïYˆïVÊÞVÊÞR ÉÊR ÉÊKgÖ+KgÖ+C=C=9òk9òk-ÑBš-ÑBš!|Å2!|Å2_ñò_ñòÈå/Èå/ùµ€ùµ€ënÍûënÍûÞN’0ÞN’0ÑöLÑöLÆ®”ÆÆ®”Ƽ¼gS¼¼gS´Zë´´Zë´­½/­½/© §© §¦aŸù¦aŸù¥ÑjL¥ÑjL§^?Ÿ§^?Ÿ«ì«ì° ð° ð¸ ̨¸ ̨ÁQmÁQmËþ;ðËþ;ð×äV³×äV³äÀ<šäÀ<šò>ÿÕò>ÿÕß§ß§ â â D8|D8|( ó÷( ó÷3áSð3áSð>…D®>…D®G³”ÇG³”ÇO7AO7ATàÐTàÐX.X.Z*Ñ®Z*Ñ®Y©ÄY©ÄW8ëW8ëRgvRgvKÏå~KÏå~CoOêCoOê9w¿ 9w¿ .$#.$#!¹&F!¹&F€œ•€œ•Ë]Ë]øê}Oøê}Oë3Ⱥë3ȺÝùTÝùTÑ‹ýsÑ‹ýsÆ7xÆ7x¼@®y¼@®y³ä¶3³ä¶3­Wñ­Wñ¨Ál¼¨Ál¼¦?Oͦ?OÍ¥à ²¥à ²§¨5§¨5«‹ù?«‹ù?±uì±uì¹@ƃ¹@ƃ¿ ¿ ͵„<͵„<ÙâßeÙâßeæúùæúùô¯YÛô¯YÛ©½Å©½Åx¬ÿx¬ÿ⨪⨪*šmy*šmy6O£Š6O£Š@½R@½RI¡R’I¡R’PÇ.žPÇ.žVµ.Vµ.Y/_ãY/_ãZ=2Z=2Y$Ô²Y$Ô²Uê‰vUê‰vP¢þ@P¢þ@IlKFIlKF@s|d@s|d5í¡‡5í¡‡*"´*"´E÷UE÷Uºã´ºã´Ìù‡Ìù‡óÒæKóÒæKæ!ñ•æ!ñ•ÙÈÙÈÌë×?Ìë×?ÂéÀÂéÀ¸˜&¸˜&°æ½o°æ½o«µ «µ §d¤Ò§d¤Ò¥Ðs³¥Ðs³¦lbì¦lbì©5àÁ©5àÁ®ŠT®ŠTµ¢fµ¢f½¹[G½¹[GÈ×ÚÈ×ÚÓÇY?ÓÇY?à”øà”øî%!î%!ü,IÀü,IÀ 8‹ 8‹ô–·ô–·%$Ž%$Ž1m*D1m*D<‡ýÙ<‡ýÙF+¾3F+¾3NrñNrñT.»ZT.»ZX5eöX5eöZ&¾Z&¾YËÛ™YËÛ™WPŸÓWPŸÓRµô!Rµô!L@L@C‚êC‚ê9|Ë(9|Ë(-óàS-óàS!Jzæ!JzæÏ@Ï@Ö¬žÖ¬ž÷·´¼÷·´¼éËtZéËtZÜh·Üh·Ïä˜Ïä˜Ä.Ä.º«NWº«NW²|‹1²|‹1¬6^©¬6^©§ÿ‘D§ÿ‘D¥õ n¥õ n¦"§™¦"§™¨‰ñK¨‰ñK­S²­S²³¹à ³¹à ¼<Á‘¼<Á‘ÆpKMÆpKMÒ(¨Ò(¨ÞÙSýÞÙSýìs¶¬ìs¶¬ú1hú1hÈçqÈçq°ÉѰÉÑ$ $ 0‡ó90‡ó9;Òã ;Òã E¦Ê6E¦Ê6MăoMăoSù;‚Sù;‚X9X9Zk±Zk±YÐëÇYÐëÇWVŽCWVŽCR²OPR²OPLÆsLÆsCmìÈCmìÈ9-E09-E0-Ý¢-Ý¢ ¯ï‚ ¯ï‚c.c.ñô2ñô2ö´s§ö´s§è° +è° +Û@N«Û@N«Î¹K²Î¹K²ÃlxcÃlxc¹¢%J¹¢%J±š±š«‡êø«‡êø§“À§“À¥×AÚ¥×AÚ¦^³é¦^³é©'6Щ'6ЮŸö®Ÿöµ(ÙBµ(ÙB¾Œÿ¾ŒÿÈ­ÆEÈ­ÆEÔ«Ò–Ô«Ò–áÅE‰áÅE‰ï¡B”ï¡B”ýîmýîm 3- 3-AzAz'e¬®'e¬®3±Mß3±Mß>µÈY>µÈYH(ºH(ºOÍÿ™OÍÿ™Us¯Us¯Xõ÷“Xõ÷“Z<0RZ<0RY>mY>mVš$Vš$PšIoPšIoI*`I*`?áFò?áFò4úqÌ4úqÌ(»­æ(»­æt¦t¦ xí× xí×ÿ%ªÿ%ªðÕ ÃðÕ ÃâæÜâæÜÕ²°ýÕ²°ýÉ‘‡É‘‡¾Ð¹\¾Ð¹\µ·ßµ·ß®‚Û¨®‚Û¨©`¿³©`¿³¦t™ý¦t™ý¥Ñ9 ¥Ñ9 §|Ò.§|Ò.«k³«k³±†™4±†™4¹¤4¹¤4ÑóÍÑóÍÏ ºNÏ ºNÛÌ•¥ÛÌ•¥éz)£éz)£÷ÀÍ÷ÀÍ9YF9YFnÿ®nÿ®""pÚ""pÚ.ùT‚.ùT‚:Ÿ¥Ä:Ÿ¥ÄDÉÓ¸DÉÓ¸M4M4S¨sS¨sWùÖðWùÖðZ žZ žYÓÕ­YÓÕ­WNmnWNmnRŒLRŒLK¬ƒK¬ƒBÚ5)BÚ5)8Po8Po,RÙè,RÙè0m/0m/>ín>ínÚD2ÚD2ôa,uôa,uæ32½æ32½Ø®PAØ®PAÌ+óØÌ+óØÀÿÀÿ·sh’·sh’¯Ç¤¶¯Ç¤¶ª/mت/mئÑ®¦Ñ®¥ÃMì¥ÃMì§;‰§;‰ª©Ù骩Ùé°~ذ~ظgN<¸gN<Â.{›Â.{›Í”°³Í”°³ÚL{÷ÚL{÷èÉqèÉqöZ·¤öZ·¤ù ìù ìaxÃaxÃ!;vD!;vD.@âæ.@âæ:Ù:ÙDf]iDf]iLôL}LôL}S† ?S† ?WìqhWìqhZ ×iZ ×iYÓ²YÓ²WE“kWE“kRq-KRq-KKvžÃKvžÃBƒ2ÓBƒ2Ó7Òl#7Òl#+«R+«R^]^]D)ìD)ì»m»mó%Îîó%ÎîääAääA×X\Ð×X\ÐÊÛ¿‡ÊÛ¿‡¿ÄKï¿ÄKï¶[ì`¶[ì`®ä¬®ä¬©ŽTØ©ŽTئ¯¦¯¥ÏêÝ¥Ïêݧ‚;:§‚;:«‹YN«‹YN±Ò·±Ò·º,Seº,SeÄb]Äb]Ð-°*Ð-°*ÝA¡ÝA¡ëA*ëA*ùѰqùѰq‹‡y‹‡yð§¶ð§¶$»¼{$»¼{1’R@1’R@=„ =„ G 8ŸG 8ŸOÕúOÕúURtURtXÕŠÝXÕŠÝZ;mÙZ;mÙY=ÒFY=ÒFUä€áUä€áPC–êPC–êH‚AiH‚Ai>ÒÍì>ÒÍì3x53x5&½Æ&½Æù¡Ðù¡Ð ‰Ù ‰ÙûÑ#"ûÑ#"í2á¶í2á¶ßäÈßäÈÑÔ*öÑÔ*öÅÏC®ÅÏC®»W…é»W…é²µuS²µuS¬$懬$懧Ónj§Ónj¥ßêÒ¥ßêÒ¦WÞɦWÞÉ©9Ûô©9Ûô®q} ®q} µÝ@þµÝ@þ¿H|~¿H|~Êuy Êuy ×Ò×ÒäÑ×±äÑ×±óIèžóIèž!|Ü!|ÜÚñ¬Úñ¬ I# I#,rJ¸,rJ¸8¥±y8¥±yCXGýCXGýL=ðL=ðS­óS­óW¹¼;W¹¼;ZÀƒZÀƒYÜ“•YÜ“•WMÕ¬WMÕ¬Re¹Re¹KC„.KC„.B˜ŸB˜Ÿ7%õì7%õì*³Ã¦*³Ã¦¤­¤­²sy²syÿäÐ:ÿäÐ:ñ6ƒñ6ƒâ­©Èâ­©ÈÕ5GÕ5GÈš.`Èš.`½¥RŒ½¥RŒ´}ñò´}ñò­cþO­cþO¨ŠE™¨ŠE™¦Úú¦Úú¦Wò¦Wò¨ƒm¨ƒm­[:Ž­[:Ž´w>ä´w>佦꽦êȨ:>Ȩ:>Õ0(ÈÕ0(ÈâçÈâçÈñkµzñkµz[Ï·[Ï·0®²0®²“»ß“»ß+/?+/?7œ”d7œ”dBŠdBŠdK§û¥K§û¥R¸AüR¸AüW†¨>W†¨>Yòý÷Yòý÷Yé¹¥Yé¹¥WkÌWkÌRˆ˜Rˆ˜Kb¡ôKb¡ôB*w˜B*w˜7 Ýç7 Ýç*’? *’? ÖîþÖîþNÓ:NÓ:ÿ`s×ÿ`s×ðt¦^ðt¦^áõ%®áõ%®ÔH°ÔH°ÇÏ ÕÇÏ Õ¼â]¼â]³Ï³Ï¬ØD«¬ØD«¨.¯ã¨.¯ã¥óʇ¥óʇ¦9†²¦9†²¨ýNb¨ýNb®-ôŸ®-ôŸµ¥^µ¥^¿13U¿13UÊ‹ƒ.Ê‹ƒ.×fœŒ×fœŒåc©Àåc©Àô#AWô#AW4™–4™–‚ ‚ w ÿ w ÿ-õ½Ó-õ½Ó:0Œ°:0Œ°DÑ/jDÑ/jMŠÞyMŠÞyT &·T &·X`z‹X`z‹Z-þŸZ-þŸYyùYyùVI GVI GP±ß'P±ß'HÚªŽHÚªŽ>új9>új93W©N3W©N&Dd1&Dd1)‘)‘ IƒÛ IƒÛú0Ôôú0Ôôë@Åë@ÅÜâ¢ÚÜâ¢ÚÏÙ$ÏÙ$ÃxrFÃxrF¹#;̹#;̰Ëz*°Ëz*ª­ jª­ j¦÷ –¦÷ –¥Â®Ù¥Â®Ù§ó7§ó7ªõÙªõÙ±9¹¤±9¹¤¹¸#Þ¹¸#ÞÄ6•;Ä6•;Ðfy³Ðfy³ÝóâwÝóâwìw ìw û“ðû“ð ¹^¨ ¹^¨ù7ù7'š¡Š'š¡Š4•3Î4•3Î@öå@öåIÏ8ÙIÏ8ÙQsµQsµVÌþ`VÌþ`Y´Ø¯Y´Ø¯Z²XZ²XWé|Wé|SAÈ9SAÈ9L>™%L>™%Cù[D>[DHuñHuñP{xP{xV6¼œV6¼œYxôÒYxôÒZ,µZ,µXG«ÖXG«ÖSÚã·SÚã·MÊšMÊšCõCçCõCç8ðO¤8ðO¤,FX,FXSÖ¢SÖ¢¶ ¶ 7X7Xðë‰>ðë‰>â€â€Ô «:Ô «:ÇPvFÇPvF¼7rp¼7rp³ç>³ç>¬/Ϭ/ϧ¸›Þ§¸›Þ¥Òð ¥Ò𠦎妎å©åä[©åä[¯Áî¯Áî·õÊl·õÊlÂG(ŽÂG(ŽÎføÄÎføÄÛýqÛýqê¢Wðê¢Wðùê÷Aùê÷A `®. `®.uÌ uÌ &ÕHá&ÕHá4—4—?×1»?×1»I¾Å9I¾Å9Qšñ‚Ó>ñ‚ácÚ@ácÚ@ðpÉÉðpÉÉÿú¹€ÿú¹€{ï…{ï…pžpž,„9‰,„9‰9Hx‹9Hx‹D^³,D^³,Mq\Mq\T;(‰T;(‰Xˆi=Xˆi=Z7‡ìZ7‡ìY:÷=Y:÷=U™ðU™ðOlï¿Olï¿Fä2zFä2z/΃>!ð!V!ð!V (¤ (¤—Q—Qô!ô!äËÑäËÑÖ`^ÀÖ`^ÀÉ3,°É3,°½¨gÛ½¨gÛ´Ç-´Ç-¬Ð¨y¬Ð¨y¨Ÿ1¨Ÿ1¥à_‘¥à_‘¦p€×¦p€×©²+<©²+<¯ŽØ¯ŽØ·Ø·ØÂQ'ÂQ'Φ¢šÎ¦¢šÜ}ÔÜ}ÔëfBEëfBEúõ«Åúõ«Å .( .(ßMpßMp(b½5(b½55¯R¹5¯R¹Acá9Acá9K"‡K"‡R¢WöR¢WöW§ùW§ùZ ˜Z ˜Y¸­çY¸­çV³®.V³®.Q]-Q]-HüÑñHüÑñ>³RÖ>³RÖ2ƒñU2ƒñU$Ì-$Ì-õçðõçðs´Þs´Þö½ÁBö½ÁBçMùžçMùžØœt‘Øœt‘ËÈZËÈZ¿5nŠ¿5nеFɬµFɬ­Ì‰­Ì‰¨wJ\¨wJ\¥ûóÝ¥ûóݦ@žG¦@žG©C\¾©C\¾®î&®î&·$¦·$¦ÁyíÁyíÍɈ°ÍɈ°Û§5Û§5ê¡Yýê¡YýúJò—úJò— Õn ÕnrBrB("C("C5†K’5†K’AVSAVSK)kK)kR³Ú™R³Ú™W¸ W¸ ZÇZÇY©nY©nV„0zV„0zP¸=øP¸=øHs<ìHs<ì=ôSµ=ôSµ1Ž1Ž# p;# p;™Q™Qî Rî RõuØõuØåšÕ÷åšÕ÷Öê)Öê)É|I¦É|I¦½¼W»½¼W»´j´j¬«Q¬«Q§ãt§ãt¥ÖMÙ¥ÖMÙ¦”ÿߦ”ÿߪ¾Éª¾É°Lao°Lao¸ùN¸ùNÃݤŠÃݤŠÐ¢WýТWýÞã¤íÞã¤íî-Z÷î-Z÷þ þ  ß”š ß”š>‘>‘+¼€Î+¼€Î8ßE8ßEDDe0DDe0MŒC¦MŒC¦TpÀTpÀXµÔ6XµÔ6Z<î{Z<î{XödêXödêTí%Tí%N>àðN>àðE!CùE!Cù9Úú¦9Úú¦,ÆU,ÆUJ6çJ6çÚÖÚÖþòƒþòƒïEïEßµ‘bßµ‘bÑ[”Ñ[”ÄvþÄvþ¹mÒì¹mÒì°›qð°›qðªG•’ªG•’¦¤ÿ¦¤ÿ¥Òý—¥Òý—§×ò¢§×ò¢¬¥»¬¥»´'´'½ì=Û½ì=ÛÉÚÍCÉÚÍCׂ5ׂ5ærÊ<ærÊ<ö4ô²ö4ô²HVnHVn‚ÂÃ%!vq%!vq3€õ3€õ?aNC?aNCI¹±‡I¹±‡QÀÌ)QÀÌ)W7ñ%W7ñ%Yï¿Yï¿YÓ¨›YÓ¨›VáwVáwQ2%ÁQ2%ÁHðÙHHðÙH>a à>a à1ÖJj1ÖJj#¶—¿#¶—¿sFÖsFÖˆgˆgôvß{ôvß{äÁZsäÁZsÕèºÕèºÈcëÊÈcëʼ¤5м¤5г~ñ³~ñ«á.™«á.™§h)Χh)Î¥Äf¥Äf§èD§èD«ý~«ý~±ì뢱ì뢻A¸»A¸ÆÉÙ¨ÆÉÙ¨Ô, BÔ, Bâöþªâöþªò´ªÈò´ªÈÞíïÞíï×-/×-/"6/®"6/®0’§0’§=Aàq=AàqH H P“¸FP“¸FV…ó²V…ó²Y³ý·Y³ý·Z Z Ws~mWs~mR_¯R_¯J£J£?²¯?²¯3B†™3B†™%,Jù%,Jùáê˜áê˜áÁ8áÁ8õ¯Ýõ¯ÝåÏöHåÏöHÖÇ’'ÖÇ’'ÉTðÉTð½"±¾½"±¾³[di³[di¬Eä¬Eä§zrñ§zrñ¥Åo˜¥Åo˜¦ý¦ý«¿S«¿S±üCô±üCô»ic#»ic#ÇAÔÇAÔÔ™¶}Ô™¶}ã‹2¤ã‹2¤óoXgóoXg¸ßB¸ßBÉmøÉmø#8ëT#8ëT1‡Ê1‡Ê> L4> S® S® Xh(rXh(rZ8‘‘Z8‘‘YT³YT³TöÔ­TöÔ­N6N6D‘‚D‘‚8α|8α|+(U»+(U»êÅêÅ à" à"ûŸ#FûŸ#FëTp€ëTp€Û¸>£Û¸>£ÍOLÍOLÀ•/À•/µ÷Hµ÷H­Ð"Ÿ­Ð"Ÿ¨ggרgg×¥ëRq¥ëRq¦s2£¦s2£©ú0©ú0°d|,°d|,¹zŹzÅÄðLâÄðLâÒb½Òb½á`lDá`lDñeFBñeFBî~Šî~Š]‰9]‰9">Ú">Ú0¶sð0¶sð=´ÎÏ=´ÎÏH§TH§TQ-NuQ-NuVþÌ%VþÌ%YèKYèKYÐ%-YÐ%-V¶*ŸV¶*ŸP³ÄšP³ÄšGûðxGûðx<Ø;Í<Ø;Í/¨=®/¨=® Ü( Ü(ó°Gó°GvÛ¬vÛ¬ïô¨‘ïô¨‘ßúÄ#ßúÄ#Ñ‚“Ñ‚“ÃÂMÃÂM¸xŸo¸xŸo¯™RŸ¯™RŸ©sdÍ©sdͦ;’¦;’¦†¦†¨òÌ2¨òÌ2®Ìw@®Ìw@·iµ·iµÂ<íÂ<íϱuϱuÞ‹¾iÞ‹¾iî‰-î‰-ÿ%Ž‹ÿ%Ž‹¿ßf¿ßfº,Òº,Ò.¨hÔ.¨hÔ<A6<A6GW8GW8PByPByVv:DVv:DY»Ø„Y»Ø„Yö*ÌYö*ÌW!اW!اQV¤QV¤HƼHƼ=¹È•=¹È•0‘£Ã0‘£Ã!¿â!¿âÄê¨Äê¨,Àx,ÀxðˆÓðˆÓàjA6àjA6Ñ_‹Ñ_‹ÃìÎÃìθ‡Ç,¸‡Ç,¯–W@¯–W@©h§©h§¦4¢¦4¢¦ȦÈ©´©´¯ŒX¯ŒX·Ýßy·ÝßyÃ(6WÃ(6WÐŒÎàÐŒÎàß™ûß™ûïÅ"ïÅ"‡g‡g:'':''!>µð!>µð0%—¶0%—¶=e?à=e?àH‹Ë!H‹Ë!Q4ºµQ4ºµWØWØYô$tYô$tY»3ˆY»3ˆVjIVjIP%™P%™G ,;G ,;;‚ÿÚ;‚ÿÚ-ê»%-ê»%¹xѹxÑv9ƒv9ƒý°rüý°rüìýš9ìýš9ÜñæFÜñæFΪÃΪÃÁ{ Á{ ¶[¶[­Á¥Ø­Á¥Ø¨HIŸ¨HIŸ¥ßd7¥ßd7¦œK3¦œK3ª{dª{d±Wì–±Wì–ºøÑ»ºøÑ»Ç4.Ç4.Õ.cÕ.cä¦7 ä¦7 õ3Cõ3CGŒGŒ±ø±ø&„Þ1&„Þ15ðü5ðüA¦ä0A¦ä0LpLpS»Ï[S»Ï[Xˆ¼Xˆ¼Z<±Z<±XÉçqXÉçqT;9T;9L¸›IL¸›IB„ILB„IL5ù°²5ù°²'‡ì'‡ì±Hà±HàÿZÿZö14ö14å|}°å|}°ÕÒþVÕÒþVǤ\†Ç¤\†»r¯»r¯±«¡E±«¡Eªª ²ªª ²¦¬ù·¦¬ù·¥Û7Û¥Û7Û¨;P¨¨;P¨­»/­»/¶&±¢¶&±¢Á5–TÁ5–T΀T¾Î€T¾Ý’nÝÝ’nÝíÝÂGíÝÂGþÔÓîþÔÓîÏcÏc !†* !†*/VßË/VßË<à„Ù<à„ÙHEi»HEi»QÍ]QÍ]WßCWßCYù¼.Yù¼.Y¬”Y¬”V0ÒáV0ÒáO¤;mO¤;mFBYbFBYb:^Ó:^Ó,f§,f§Ö ¸Ö ¸ =P… =P…û2Š-û2Š-êRgêRgÚ6-ïÚ6-ïËröËrö¾`‘¾`‘´´¬3JѬ3Jѧc š§c š¥Â¿¥Â¿§a _§a _¬1Õà¬1Õà´—´—¾s’¾s’Ëw,Ëw,Új)gÚj)gê 3ñê 3ñû¡•Ûû¡•Û Æp› Æp›\X¨\X¨,èÅ),èÅ):Ú¡¦:Ú¡¦F±¾ïF±¾ïPgPgVqSâVqSâYÇgåYÇgåYâH YâH VÁCSVÁCSP~È{P~È{GTð¦GTð¦;–3Ã;–3Ã-¯….-¯….Ú¡Ú¡ wº wº üPŽîüPŽîëIì(ëIì(ۼۼ̼ªÌ¼ª¾ÿ˜?¾ÿ˜?´K@Ë´K@ˬWâ:¬Wâ:§oÂ$§oÂ$¥ÂÆ„¥ÂÆ„§`]/§`]/¬< *¬< *´'ž´'ž¾ÛëY¾ÛëYËó!•Ëó!•Úõ×iÚõ×iëT|}ëT|}üy“Ýüy“Ý ½|ï ½|ïfã"fã"-÷¦é-÷¦é;ÞÓ¬;ÞÓ¬G™„G™„Pºî¿Pºî¿Vë—±Vë—±YòTOYòTOY°ßY°ßV(FV(FOxO¸OxO¸EàJ°EàJ°9·#³9·#³+oüO+oüOŽ[@Ž[@ ¨ã; ¨ã;ù\Uù\UèMV èMV Øà Øà É_å‘É_呼¦U¼¦U²h9à²h9à«${«${¦È‚P¦È‚P¥Öº±¥Öº±¨< î¨< î­âÔu­âÔu¶–g€¶–g€ÂÂÏÁsšÏÁsšßK>ßK>ðºðºldSldS¢?“¢?“#%ñ©#%ñ©2b]}2b]}?Ã'Ÿ?Ã'ŸJÌŽJÌŽS´¢S´¢XHÄXHÄZ:I>Z:I>XÕ’%XÕ’%T%+yT%+yLU× LU× A¯­èA¯­è4—çÀ4—çÀ%‰¸C%‰¸CYáYáÔÔòmX òmX á†á†ÑÀóÖÑÀóÖôUôU·çÅ’·çÅ’®ÍC†®ÍC†¨¼Z§¨¼Z§¥ñP¥ñP¦‡]¦‡]ªz3ªz3±¤^y±¤^y»ÃÏ»ÃÏÈt¢Èt¢×?ýÝ×?ýÝ疹疹øÚ¿[øÚ¿[ g¥j g¥jw2¸w2¸+zÚ)+zÚ)9ãÁÓ9ãÁÓF!SžF!SžOÂ%OÂ%Ve0Ve0YÌÝØYÌÝØYÔœÍYÔœÍV}°’V}°’Oä™Oä™FJ%²FJ%²:Ð×:Ð×+”ÿ8+”ÿ8z¾;z¾; UÓ’ UÓ’øÊPøÊPçƒTîçƒTî×'@x×'@xÈV%^ÈV%^»Ÿ~ù»Ÿ~ù±€Nı€NĪ[Nª[N¦wqu¦wqu¥û|¡¥û|¡¨íGý¨íGý¯1}„¯1}„¸‹g¬¸‹g¬Ä¡žœÄ¡žœÒý0jÒý0jã¥ã¥ôFü”ôFü”òÚ®òÚ®NN'¼zŽ'¼zŽ6°?“6°?“C|?C|?MâÔMâÔU>?ŸU>?ŸY_ÆY_ÆZRUZRUWdE¹WdE¹QYî QYî H56àH56àe»²>e±oqÿ±oqÿª<Ï"ª<Ï"¦d¦d¦ º¦ º©:l©:l¯Îçy¯Îçy¹Š¤u¹Š¤uÆ yÆ yÔÔ3ÔÔ3åO{ªåO{ªöÞ:³öÞ:³¿Cl¿Cl1’O1’O*¥ba*¥ba9oJ:9oJ:EþÜåEþÜåOÓŽÑOÓŽÑV‹”qV‹”qYáÓ9YáÓ9Y´¢Y´¢VVNòA¸NòA¸DÈDÈ7èób7èób(Öbã(Öbã&^<&^<ÄbÄbô˜á.ô˜á.ã!î1ã!î1ÒËë‰ÒËë‰Ä>1­Ä>1­¸ Æ„¸ Æ„®°¦®°¦¨‹¸š¨‹¸š¥ßlÞ¥ßlަŦū75È«75ȳгнéME½éMEËlŒ$ËlŒ$Û ¡fÛ ¡fì#Uvì#Uvþ 3þ 3zz!=úï!=úï1,ýD1,ýD?+Ú­?+Ú­J¬¹sJ¬¹sS:\mS:\mX|ïX|ïZ=}²Z=}²Xit"Xit"S™^S™^Jm`1Jm`1>ÑhŠ>ÑhŠ0³€Ü0³€Ü £QO £QOCðæCðæýFªøýFªøëcT=ëcT=ÚPòbÚPòbÊ¿¡Ê¿¡½MhÀ½MhÀ²‡R‰²‡R‰ªÛ•gªÛ•g¦› ¦› ¥ñŽ·¥ñŽ·¨èCÚ¨èCÚ¯`›—¯`›—¹5¨¹5¨Å°„sŰ„sÔ£ržÔ£ržåXD½åXD½÷"ûŸ÷"ûŸ L' L' û«Ïû«Ï+“že+“že:q[T:q[TF÷*zF÷*zP§BP§BW"‡W"‡ZôñZôñYcçxYcçxU ”XU ”XMn©Mn©Bœ3@Bœ3@5sÄ5sÄ%n››%n››?c“?c“<¾Å<¾Åð ×ð ×Þ§¥&Þ§¥&ΆÝxΆÝxÀfk[Àfk[´Ú-ˆ´Ú-ˆ¬ZìͬZìͧB‰6§B‰6¥Æýø¥Æýø§ù+Þ§ù+Þ­ÃJâ­ÃJâ¶éÓu¶éÓuÃ¥UÃ¥UѲzѲzâ>Œüâ>Œüô„Zô„ZJÒðJÒð;ÙU;ÙU)%Fš)%Fš8j ô8j ôEcwÃEcwÃOŽWåOŽWåV{‡V{‡YåºQYåºQY¤ÒKY¤ÒKU½ U½ NS¢©NS¢©C¶ðƒC¶ðƒ6Sfž6Sfž&µ©Ì&µ©ÌÕ Õ f«šf«šñ'³ëñ'³ë߂Ŵ߂ŴÏ2 êÏ2 êÀáB ÀáB µ(ß½µ(ß½¬„7X¬„7X§Q"ô§Q"ô¥ÅÒA¥ÅÒA§ö!5§ö!5­É[ê­É[ê·GT·GTÃH­ÃH­Ò|%Ò|%âÂæ%âÂæ%ô± ]ô± ] vP vP}Î}Î*×*×9A}Â9A}ÂF(¶F(¶P,–P,–Vã›YVã›YZ@Z@YoÀYoÀU&]ŽU&]ŽMW"á’>"á’/{Ñ/{ÑÔùöÔùö ßF ßFú]e1ú]e1è‡gè‡gÖÎúÚÖÎúÚÇCiÇCiº3,º3,¯è!˜¯è!˜©òW©òW¥õF"¥õF"¦¤ A¦¤ A«É*«É*³5;³5;¾7¤¾7¤Ìµ…?̵…?Ý MGÝ MGîá&Mîá&Mv!v!â”êâ”ê%q9‡%q9‡5q&­5q&­C-ÍÃC-ÍÃN¶7N¶7U°¢{U°¢{Y«søY«søY×ÇcY×ÇcV5©V5©NçUüNçUüD>ÜaD>Üa6¬ÞÊ6¬ÞÊ&Åîá&Åîá5|Ë5|Ë»ôÛ»ôÛð"’ð"’Þ4!Þ4!Ͷ øÍ¶ ø¿]‘£¿]‘£³È•³È•«vòJ«vòJ¦ÅÃm¦ÅÃm¥èè¿¥è迨ìuE¨ìuE¯®»ü¯®»ü¹è¾u¹è¾uÇ'¿)Ç'¿)ÖÞtÖÞtèZB°èZB°úãbãúãbã ”ó5 ”ó5ŸzwŸzw0Wo0Wo>ü8Ÿ>ü8ŸJñàŒJñàŒS°S°XÙ»tXÙ»tZ1_Z1_W©RüW©RüQZ¾QZ¾GŠ¥uGŠ¥u:£î–:£î–+4+4å å uSâuSâô±ovô±ovâhE¶âhE¶ÑfÑfÂfJÂfJ¶Ç϶ÇϬòð¬òð§o˜0§o˜0¥Å9¥Å9¨ e¨ e®#e!®#e!·ÑW9·ÑW9Ä¥›§Ä¥›§Ôc}Ôc}åp>åp>÷ú ÷ú ÙÁ ÙÁ&&.3ƒÝ.3ƒÝ=Abì=AbìI¨E?I¨E?RÝ¡­RÝ¡­Xy(ÜXy(ÜZ:s@>:s@J|¦¿J|¦¿SzíSzíXÊÌìXÊÌìZ2­Z2­Wž™]Wž™]Q,|—Q,|—G"‚‚G"‚‚9òG+9òG+*/R´*/R´ŒfFŒfFÐx²Ðx²òдòдàd‹Öàd‹ÖÏ^ëÏ^ëÀ€gÀ€g´u7&´u7&«ÆƒŒ«ÆƒŒ¦ÙÁ¦ÙÁ¥æÖb¥æÖb¨ûä&¨ûä&¯ôáQ¯ôáQº…–"º…–"È2ÞßÈ2ÞߨdÈŸØdÈŸê\X€ê\X€ýTdýTd\\"–ÎÝ"–ÎÝ3NèÎ3NèÎA½ A½ M@ýiM@ýiURÙ»URÙ»Y—Ë{Y—Ë{YÛÜ›YÛÜ›V‚V‚N +N +CaxãCaxã5;'£5;'£$°3Ö$°3Ö}q}qÿt9îÿt9îìnîÄìnîÄÚI^hÚI^hÉÔ|°ÉÔ|°»Ï—>»Ï—>°Ü*°Ü*©|08©|08¦ÁL¦ÁL¦žc¦žc«D«D³ÂÎ3³ÂÎ3¿·ë¿·ëΘä…Θä…ß¹ÿÀß¹ÿÀòVR òVR ‘:>‘:>q;¨q;¨*8·G*8·G:±f:±fG`Å G`Å QoQoWÏÉDWÏÉDZ9=­Z9=­XŒñXŒñRÞ RÞ Il+‘Il+‘<¤¶Ä<¤¶Ä-Yì-Yìº<º<¦‚¦‚õdžÅõdžÅâœ,áâœ,áÑ)sÑ)sÁ×WÁ×Wµ[Bµ[B¬G‰r¬G‰r§(§(¥ÛP(¥ÛP(¨Ð÷ÿ¨Ð÷ÿ¯Æœ±¯Æœ±ºm?1ºm?1ÈF ¼ÈF ¼Ø³´`س´`êïÕêïÕþ*C*þ*C*fÂfÂ#Êj#Êj4“lå4“låBô¨ýBô¨ýNJRNJRV ŒkV ŒkYÜ|qYÜ|qYv}Yv}U'¹›U'¹›LÕ÷ãLÕ÷ã@ü/ @ü/ 2#€Ô2#€Ô úê7 úê7KŸKŸúðåzúðåzçÏóÃçÏóÃÕËSÀÕËSÀÅ·¹0Å·¹0¸U,»¸U,»®B#¹®B#¹§ø‚ǧø‚ǥ»Q¥Â»Q§¾&8§¾&8­Ò‡˜­Ò‡˜·»F‚·»F‚Å¥ÎÅ¥ÎÕ .Õ .ç{ç{úI¾júI¾j ¾î ¾î xëØ xëØ1¸j1¸j@«°ª@«°ªL£3ÃL£3ÃU°¿U°¿Y‰ÔÑY‰ÔÑYÝ·‹YÝ·‹V,_V,_N,©*N,©*B°ÛB°Û4}'4}'#¦#¦ccccüñ#Rüñ#Ré¡b#é¡b#×[Sz×[SzÆú:0Æú:0¹CJ¤¹CJ¤®ÛÉ®ÛɨB ¨B ¥Æ†1¥Æ†1§ˆ®Õ§ˆ®Õ­tZ†­tZ†·Cúá·CúáÄ‚ƒÄ‚ƒÔ&/Ô&/æ­)Ðæ­)ÐùýÂÁùýÂÁ ›H¡ ›H¡ |QÕ |QÕ1Ò®˜1Ò®˜@Ù_ý@Ù_ýLÔø¦LÔø¦U9o„U9o„YœžíYœžíYËýªYËýªUÀÀíUÀÀíM­ M­ Aî~¸Aî~¸3ω3ω!Í‚x!Í‚xíTíTûUÒ]ûUÒ]çõ Ýçõ ÝÕµ~¬Õµ~¬Åu'&Åu'&·ú·ú­è§³­è§³§½BY§½BY¥Ã:¢¥Ã:¢¨L¨L®—<®—<¸ü鎸üéŽÆÅ†ÆÅ†×Mà ×Mà éÆÉ«éÆÉ«ýWBHýWBHü~òü~ò#¾F#¾F4Õ4ÕCj&wCj&wNÏkNÏkVuûËVuûËZÃZÃYEZsYEZsTHAtTHAtKFdâKFdâ>«­l>«­l/ 7/ 766 ó@È ó@Èö3‚¾ö3‚¾âê³Èâê³ÈÑëÑëÁ]€‘Á]€‘´¶¸–´¶¸–«®Hí«®Hí¦²²„¦²²„¦°ë¦°ë©¬1‡©¬1‡±F\±F\½øç½øçËø* Ëø* ÝXùÞÝXùÞði«ði«=äa=äaÅ0Å0*$bÑ*$bÑ:ƒ2ó:ƒ2óHèbHèbR-:R-:XS»ùXS»ùZ;ž#Z;ž#WÉ´WÉ´QRÊQRÊF\¼F\¼8^8^'¾ÜW'¾ÜW i i[TÀ[TÀí“ ðí“ ðÚ­>ƒÚ­>ƒÉ•š€É•š€»!Xµ»!Xµ°+°+¨ÍB¨ÍB¥Ôý¥Ôý§A_s§A_s­Ï­϶Ô÷‹¶Ô÷‹Ä:EáÄ:EáÔ~¿Ô~¿çêçêú¼jªú¼jª§Ö—§Ö—!È…!È…3L~®3L~®BQgüBQgüN¥uN¥uV k²V k²Yð+ìYð+ìY]ÜY]ÜTm1ÆTm1ÆK\îÕK\îÕ>›æ¿>›æ¿.É|.É|ª“ª“ ! !õ#ZÒõ#ZÒá¬qêá¬qêϰóϰóÀB*ÀB*³™€³™€ªãRPªãRP¦]âB¦]âB¦EÓ"¦EÓ"ª›²Sª›²S³," ³," ¿Š x¿Š xÏ«!Ï«!áàáàô¤ökô¤ökÁÊ®ÁÊ®VŠýVŠý.ƒ©2.ƒ©2>kÙº>kÙºK@ÑÅK@ÑÅTc¼“Tc¼“Y\•Y\•YîÜYîÜV ßgV ßgMë1aMë1aAìVAìV2©'=2©'= àƒû àƒû tû| tû|ù[²¢ù[²¢å• å• Ó—¬Ó—¬ÂÞO˜ÂÞO˜µª:»µª:»¬)¡l¬)¡l¦×ÚÙ¦×ÚÙ¥ùC¥ùC©›òÒ©›òÒ±×W±×W½uä½uä̰pŽÌ°pŽÞ‚=ëÞ‚=ëò.ò.;ñ°;ñ°lãlã,”ö,”ö<à·0<à·0J"¨:J"¨:SµgZSµgZYcYcZ ¶\Z ¶\V}ã#V}ã#N›eN›eBÆó.BÆó.3˜Ø‚3˜Ø‚!Ñæô!ÑæôV„4V„4ú 2êú 2êæ3›†æ3›†Ó‘’Ó‘’Ã*‘Ã*‘µÒ eµÒ e¬8“š¬8“š¦Øñü¦Øñü¥û“¥û“©«vM©«vM±»åd±»åd½Åµ½ÅµÍ+ÝÂÍ+ÝÂß)•Gß)•GòÓËðòÓËð-¡ -¡ éqéq-“[<-“[<=Χß=ΧßJëJëTCMTCMYXªYXªYë 6Yë 6Uï;«Uï;«M™}®M™}®AR 7AR 71º§+1º§+™€ƒ™€ƒ Ûô Ûô ÷€õs÷€õsã“RQã“RQÑÏÑÏÀûQÀûQ´ôë‡^«‡^¦bñ¦bñ¦K[ΦK[ΪË ªË ³«2T³«2TÀukêÀukêІÛõІÛõãÖ‘ãÖ‘÷ &j÷ &j ~© ~©CICI1vƒ1vƒA#dÜA#dÜM€ÛM€ÛUçWUçWYêûœYêûœYT9_YT9_T*ÕT*ÕJ®J®=\=\,á`P,á`PKgKgñ`8ñ`8ñ{öìñ{öìÝÃÙBÝÃÙBËÍÃËÍü‡È$¼‡È$°¼¾û°¼¾û© 9© 9¥×7 ¥×7 §P2Ù§P2Ù­baá­baá·¿·3·¿·3ÅÞ3ÔÅÞ3Ô×iÑ×iÑêNIÛêNIÛþ¾Æbþ¾Æb(lÊ(lÊ&ŒÃœ&ŒÃœ7úN®7úN®F‚ÈF‚ÈQià]Qià]XiXiZ<š‡Z<š‡W°Ê5W°Ê5P™_/P™_/EPâ EPâ 6n[6n[$´ë$´ëÓÓü…€ü…€è'cè'cÕ5àÕ5àÄ „@Ä „@¶Zay¶Zay¬n*n¬n*n¦à=M¦à=M¥þ¦¤¥þ¦¤©Ô…X©Ô…X²2[²2[¾¦D;¦DÍÎ?:Î?:á ¶á ¶õ5“åõ5“å é—7 é—7ÿ®ÿ®0‰×N0‰×N@‹ŒÒ@‹ŒÒM/­€M/­€UÊ¡»UÊ¡»YèM8YèM8YO£ÑYO£ÑT7êT7êJT…ÿJT…ÿ<¸~š<¸~š+éIÒ+éIÒÈ; È; VÝnVÝn見見ÛÔóEÛÔóEÉè@QÉè@QºÖ¸ºÖ¸¯k4g¯k4g¨D)"¨D)"¥ÂÅ™¥ÂÅ™¨ €Õ¨ €Õ®ÿ³e®ÿ³eºCݺCÝÉ=ÊÉ=ÊÛ%¢\Û%¢\ïjLïjLÔÔUµ˜Uµ˜+„“+„“½’°>½’¨œW\¨œW\¥Æ$x¥Æ$x§ä1 §ä1 ®ÛŽŒ®ÛŽŒºJ½MºJ½MÉ’j[É’j[ÛÜhOÛÜhOð%×ëð%×ëT·ýT·ý!Xˆ!Xˆ-x Ç-x Ç>X;]>X;]K̶YK̶YUï;Uï;YÀfüYÀfüYwÈ8YwÈ8TB£TB£Jjó»Jjó»t¢á>t¢ÍÝ“vÍÝ“v½a»´½a»´°Âzd°Âzd¨º¶¡¨º¶¡¥Å»A¥Å»A¨”G¨”G¯xدxØ»‘‘!»‘‘!ˬ§Ïˬ§ÏÞÓÒLÞÓÒLóòÕ€óòÕ€ ¹*e ¹*eÛ’Û’2:Ù2:ÙB°ËiB°ËiOKއOKއWL}WL}Z;Z;Wê¥Wê¥P{©ôP{©ôD[{)D[{)4=%/4=%/!Ý›!Ý› ó óö!}€ö!}€àà_oàà_oÍp4ÏÍp4ϼô¤¼ô¤°eÚR°eÚR¨‚_+¨‚_+¥Âß÷¥Âß÷¨Q©„¨Q©„° v`° v`¼zQl¼zQlÌæ¯˜Ì毘àYÆÒàYÆÒõ¬tõ¬t  ¡  ¡ ÏG> ÏG>4 8J4 8JD<ûáD<ûáPn`¤Pn`¤WêT(WêT(Z:<ŸZ:<ŸW=JW=JOŒ„OŒ„BPØYBPØY1š8„1š8„õIDõIDˆËˆËò˜LÅò˜LÅÝpZ¼ÝpZ¼ÊSÊSºaˆ¡ºaˆ¡® L® L§“ÈÆ§“ÈÆ¥ØyŒ¥ØyŒ©yHŠ©yHвB3²B3¿­Z@¿­Z@ÐðøõÐðøõåÅ–åÅ–ú¸ŒËú¸ŒË½˜Û½˜Û%©éô%©éô8\$Ä8\$ÄG¹Ÿ»G¹Ÿ»RÖsRÖsY ˆBY ˆBYñ›2Yñ›2U€l U€l Kö—™Kö—™=åZ~=åZ~, ›x, ›x¸6©¸6©áî+áî+ëíKÈëíKÈ×(÷<×(÷<ÄÕ½ÞÄÕ½Þ¶ ²×¶ ²×«±s«±s¦e9³¦e9³¦|ëF¦|ëF«õ⮫õâ®¶€ì€¶€ì€ÅyÅy×ýYZ×ýYZìêÅ,ìêÅ,™$™$êqGêqG-9k1-9k1>Øíí>ØííL³‘L³‘Uö õUö õZêZêX¾$rX¾$rRöLRöLF{,ûF{,û6Ÿ‹?6Ÿ‹?#v1Z#v1Z&Â}&Â}÷ùÊê÷ùÊêâFáðâFáðÎ^/ØÎ^/ؽuZY½uZY°“ð˰“ð˨ƒ.j¨ƒ.j¥Â·B¥Â·B¨~Á¨~Á°Ž1ܰŽ1ܽt±^½t±^Îm'‘Îm'‘âjÜ‹âjÜ‹ø>ªwø>ªw{õ&{õ&#ÆöÑ#ÆöÑ6ï«6ï«FÂi¯FÂi¯RNu3RNu3XÚsíXÚsíZVZVU¯Ž³U¯Ž³L%öYL%öY=ö°á=ö°á+ÿBÔ+ÿBÔUÉXUÉX=«N=«NëD-ëD-Ö&ßjÖ&ßjÃÌ ÝÃÌ Ýµ 0¢µ 0¢« –ä« –ä¦+}d¦+}d¦ÑA!¦ÑA!¬ó@¶¬ó@¶¸3<.¸3<.Çà[¨Çà[¨Û^qÛ^qðtÖðtÖßJ¸ßJ¸ÆlÆl0âQý0âQýB)‘B)‘OéŒOéŒW\*W\*Z<ãyZ<ãyW“ÛW“ÛO„ŠÊO„ŠÊB3eB3e1²²1²²_äå_äåmwˆmwˆñ!Æñ!ÆÛƒÎxÛƒÎxÈD¾ÈD¾¸vž¸vž­ž"­ž"¦Û>h¦Û>h¦(1¦(1« ¡o« ¡oµ8@ µ8@ ÄäþÄäþÖ£íÖ£íëÎ\…ëÎ\…>J¼>J¼pïOpïO-eS-eS?ÂD?ÂDMw¾Mw¾VAê VAê Z"RZ"RXjOXjOQ0ûQ0ûDêmDêm4VEò4VEò }òt }òt ›BW ›BWô «ô «Þ;¸\Þ;¸\Ê…iWÊ…iWº%*wº%*w®%C#®%C#§EP §EP ¥ø>|¥ø>|ªQÛªQÛ´Bt´Bt—n‚—n‚ÕÇÕÇêÊ êÊ £´`£´`dd,G,G>1Ò¤>1Ò¤L{ÇÛL{ÇÛUü Uü ZË{ZË{X‹ X‹ QmzQmzE/ E/ 4”KÓ4”KÓ ¦â ¦â ¨` ¨`óúÔ®óúÔ®Þ –Þ –ÊCi¨ÊCi¨¹Þ ©¹Þ ©­è}¤­è}¤§&a§&a¦2¦2ªžYªžY´¤áÞ´¤áÞÃv‹ëÃv‹ëÖ'5Ö'5ë*-ë*-1Ö‡1Ö‡±#=±#=-=ã-=ã?º?ºM‰€öM‰€öVœáeVœáeZ1†ªZ1†ªX ìðX ìðPON—PON—Cu*Cu*2N1Ó2N1Óð‡ð‡¨JO¨JOðßþnðßþnÛ @Û @Ç”"pÇ”"p·µÝ+·µÝ+¬vÆ¥¬vÆ¥¦‘¯Â¦‘¯Â¦h½p¦h½p¬‡B¬‡B¶ÿ]é¶ÿ]鯰ÑeưÑeÚò¨Úò¨ïì,Ùïì,ÙÓ"èÓ"è6Fb6Fb1®=1®=CLUCLUP°—P°—WïçÃWïçÃZ4ijZ4ijV¯óV¯óM˜aM˜a?ƒ?ƒ-UC‘-UC‘: •: •ŒÒTŒÒTêÃLëêÃLëÕV¯ÕV¯Â©[,©[,³òR³òRª%ðƒª%ðƒ¥éUª¥éUª§ƒÂd§ƒÂd®Ý]\®Ý]\»}ž»}žÌ’âÌ’âᡟᡟ÷z—º÷z—º„ƒî„ƒî$…¿n$…¿n8$t8$tH'Ý5H'Ý5S~< S~< YowYowY’z±Y’z±Sç4Sç4HÆ?sHÆ?s8ê€<8ê€<%WU%WUTð½Tð½øNç±øNç±áÈ)›áÈ)›Í6ÔDÍ6ÔD»ö!)»ö!)¯%¶m¯%¶m§ § ¥âáö¥âáöªW)ªW)³ßw8³ßw8±œ1±œ1ÕŒ¼—ÕŒ¼—ë5LÜë5LÜ?Ó?Ó É É.0%.0%@V}/@V}/NH)NH)W×€W×€Z<’¾Z<’¾Wrû3Wrû3Në<ßNë<ßA4FÌA4FÌ/2°/2°TÖTÖ:…<:…<ì(×Rì(×RÖc¼GÖc¼GÃ[W3Ã[W3´S´SªIÑתIÑ×¥ì…Á¥ì…Á§… è§… è®ýµ…®ýµ…»Õ±ì»Õ±ìÍ7ŽÍ7Žáù¸/áù¸/øÀ"²øÀ"²ÿSËÿSË&lG&lG9­st9­stIvæJIvæJTfLaTfLaYÁiNYÁiNY*†0Y*†0R«ÅR«ÅF­ÂÍF­ÂÍ5þ‡Â5þ‡Â!µµè!µµè -´ø -´øóã†2óã†2Ýf±¸Ýf±¸É4ÒœÉ4Òœ¸ª•鸪•é¬á¬á¦¦ê­¦¦ê­¦eO¦eO¬%Õë¬%Õë·„ ö·„ öÇÃbÇÃbÛȈÛȈòB¯ òB¯ ¢–m ¢–m Fkï Fkï4ÈÇ4ÈÇEÆ1EÆ1R®R®XöÝ¥XöÝ¥YÝ™YÝ™T¿ÃaT¿ÃaIò§¥¬ì>¥¦˜ô/¦˜ô/¦F1¦F1¬©W¬©W¸¤œñ¸¤œñÉži¾Éži¾ÞiŠ'ÞiŠ'õxHõxH w w$VÆ$VÆ8¨u%8¨u%Iþ9Iþ9T^agT^agYÏ@YÏ@Xû‚Xû‚Qò"Qò"E-2èE-2è3Ì:3Ì:UûIUûIøÿŽøÿŽï&øï&øØl@@Øl@@Äœ4Äœ4´Ã£´Ã£ªO1ªO1¥â™p¥â™p§Ï³\§Ï³\¯õؤ¯õؤ½Ãvô½ÃvôÐA€„ÐA€„æ ß æ ß ýÚj%ýÚj%£k £k +àÌÞ+àÌÞ?Ê™?Ê™MÎ…~MÎ…~W–˜W–˜Z<éZ<éWù¿Wù¿M¬´jM¬´j>ÕÙ>ÕÙ+м+м*},*},ýF³¬ýF³¬å“üå“üÏ»xŽÏ»x޽OÚm½OÚm¯ž¦¯ž¦§£Bé§£Bé¥ð /¥ð /ª¨ö⪨öâµvÅܵvÅÜÅ—ÚÎÅ—ÚÎÙæMzÙæMzðð´ðð´  z  z sœ{ sœ{5†„r5†„rFѽFѽSÖSÖYoÝŒYoÝŒYmüQYmüQS ¥îS ¥îF¿Ï¯F¿Ï¯5d`c5d`c 6T| 6T|¸—ø—Ãð˜t•ð˜t•ÙöÙöÅFÀòÅFÀòµ1‰óµ1‰óªyûíªyûí¥ækb¥ækb§Íà§Íà°’¤°’¤¾<¾<ÐÚ•ÐÚ•ç ˆéç ˆéÿ ë ÿ ë Ð#Ð#-U ‹-U ‹@jýI@jýINá›HNá›HW±'kW±'kZ2(Z2(V7¼*V7¼*LØiLØi,©>,©)úJF)úJF–³±–³±ùÇÆùÇÆán}‰án}‰Ëf0ÄËf0Ĺ\¡‡¹\¡‡¬²å,¬²å,¦b^ø¦b^ø¦çÃÚ¦çÃÚ®<\µ®<\µ»Ñ#a»Ñ#aΠ™Π™å8 å8 ýâçýâç±þŸ±þŸ-®eO-®eOA6T¨A6T¨OÇr¤OÇr¤XE’}XE’}ZFÛZFÛTê¤WTê¤WIOa7IOa78O@8O@"ð["ð[ aô¾ aô¾ñeÄ~ñeÄ~Ù„mÙ„mÄ–ü+Ä–ü+´7/i´7/i©¬¡©¬¡¥Åed¥Åed¨Ôµ¨Ôµ²œK²œKÂa+[Âa+[ÖèmåÖèmå‚‚²-²- *Ø *Ø5ýÆ)5ýÆ)GÅÄ^GÅÄ^T ÎBT ÎBYÖ” YÖ” X¶ã=X¶ã=P¿_ãP¿_ãBŠ…ÏBŠ…Ï/0x/0x,ÍÑ,ÍÑÿH)ŸÿH)ŸæoSæoSÏŽ§Ïާ¼nŠ}¼nŠ}®‹µ$®‹µ$¦ý ð¦ý ð¦Z2ɦZ2ɬ³ŠÞ¬³ŠÞ¹Š˜K¹Š˜KËãàËãàâN`âN`û-×û-×1¸º1¸º+¨nk+¨nk?ÁÉ?ÁÉNç?éNç?éWíHðWíHðZ!äZ!äUH´UH´IÎ|jIÎ|j8§ê8§ê"çRA"çRA €{Ü €{ÜñEØ ñEØ Ù._fÙ._fÄ §Ä §³¿ô‹³¿ô‹©[]‰©[]‰¥Â* ¥Â* ©BXø©BXø³”…³”…Ãí°ZÃí°ZÙ‡»Ù‡»ñ0_ññ0_ñ …½Ž …½Ž"ïv—"ïv—8 |:8 |:IãX–IãX–U[ËU[ËZ!§’Z!§’WÑçñWÑçñNšQDNšQD?0ZQ?0ZQ*Ë)À*Ë)À|/|/ù¸gÔù¸gÔàé3ãàé3ãÊŽÊŽ¸iä ¸iä «ðìY«ðìY¦ö›¦ö›§oÑl§oÑl¯Ç…n¯Ç…n¾‚mO¾‚mOÒrzyÒrzyêì,êì,[U·[U·Q÷hQ÷h31|31|EÂì(EÂì(RòºŸRòºŸY‘:¾Y‘:¾Y¸¯Y¸¯Q…ÐïQ…ÐïCzüCzü0âÖ0âÖÐÂ0ÐÂ0ÿ”Sÿ”Sæ]?bæ]?bÏ/sVÏ/sV»å§Ü»å§Ü® uK® uK¦¿=¶¦¿=¶¦—«à¦—«à­›Â­›Â»;Ûî»;ÛîÎdrÎdråŠ #åŠ #þÕ“`þÕ“`6´x6´x/?/?CÍ`CÍ`QRŠ3QRŠ3Y—,Y—,Y˜ÎY˜ÎRüºwRüºwE¸avE¸av2ØfŸ2ØfŸá`†á`†¨•¨•é7ƒ\é7ƒ\јVƒÑ˜Vƒ½¶¦½¶¦¯)Û>¯)Û>§%`E§%`E¦M§7¦M§7¬¹©ö¬¹©ö¹ãS©¹ãS©Ì¿;§Ì¿;§ãíãíýgýg§…§….Iæú.IæúB2°óB2°óPÆŸæPÆŸæXÔªkXÔªkY¶_Y¶_SSÒHSSÒHF2nCF2nC3]Ÿ13]Ÿ1]4ç]4ç Y+ Y+éxÁ^éxÁ^Ñ·)Ñ·)½¹ ½¹ ¯ß÷¯ß÷§/Ö§/Ö¦WÆœ¦WÆœ¬è·Á¬è·ÁºDCòºDCòÍW†þÍW†þä‘§§ä‘§§þ€`þ€`¶Œ.¶Œ./U[˜/U[˜CÌ"CÌ"QkmÌQkmÌYøËYøËY‚(uY‚(uRšÔ­RšÔ­Dò)Dò)1£ œ1£ œA[ŸA[Ÿµófµófçó‹çó‹Ï„°QÏ„°Q»éïØ»éïØ­çï­ç捻ۦ¤Û¦¿িà®5±°®5±°¼mœÀ¼mœÀÐ<;Ð<;çÿͤçÿͤ×M×MIÌUIÌU2%2%E²6kE²6kSSY«çWY«çWXÙ´õXÙ´õPµ9Pµ9Aä<£Aä<£-¡§Ï-¡§Ï•Yg•Ygû¾ŽÃû¾ŽÃâ=Üâ=ÜË3OšË3Oš¸†¶¥¸†¶¥«ÈÚ·«ÈÚ·¦»È¦»È§Äü§Äü°Ù„&°Ù„&Àˆ1 Àˆ1 Õƒ®‹Õƒ®‹î >î >Â=Â=!df±!df±7ää7ääIÆ¥›IÆ¥›U‡Œ¼U‡Œ¼Z/¹‚Z/¹‚WUa„WUa„M6–jM6–j<¥”<¥”'A'AΓΓôø|ôø|ÚïÎÚïÎÄîwæÄîwæ³ÝE¤³ÝE¤©-0©-0¥Å¥Å©ð÷©ð÷µY¥?µY¥?Ç 5Ç 5Ý‹z¨Ý‹z¨öôÿöôÿ&"/&"/)Ð+)Ð+>óÍ,>óÍ,NÖÛONÖÛOX¿PX¿PYÿ¾‰Yÿ¾‰TR!MTR!MG¶G¶4Á˜4Á˜‚p>‚p>Ãf¨Ãf¨é°»<é°»<Ñ}%Ñ}%½5Ľ5Ä®’)Í®’)ͦ҅ͦ҅ͦŸôÞ¦ŸôÞ®×·®×·¼[²¼[²ÐuÅÐuÅèšÝQèšÝQÅUqÅUqŸQÏŸQÏ45M45MG ™G ™T *³T *³Yòã;Yòã;X9ÊCX9ÊCOàðOàð?:—?:—)ÑÎ)ÑÎö>ðö>ðö§ÕXö§ÕXÝ!ÄPÝ!ÄPÆ’²cÆ’²c´çH¢´çH¢©¤Ë7©¤Ë7¥ÂSq¥ÂSq©™)Ž©™)Ž´Õbu´ÕbuƆ `Ɔ `Ý$ UÝ$ UöÇýÿöÇýÿ&Mk&Mk)þ*w)þ*w?JÍ?JÍO-CO-CXQ#XQ#Y怗Y怗SËáOSËáOFÂÍFÂÍ3+™Ã3+™Ãn¤øn¤øT[T[çàÿçàÿÏÐ`ÏÐ`»•À»•À­'P]­'P]¦UÑ ¦UÑ §?ýÖ§?ýÖ¯ÖñÁ¯ÖñÁ¿[p¿[pÔ|“þÔ|“þíaS>íaS>ëñÉëñÉ!¸!¸8ŒV8ŒVJ‰WJ‰WV)‹V)‹Z<¼±Z<¼±V•žGV•žGKsP8KsP89È,¾9È,¾## `6µ `6µîÒûèîÒûèÕ¿ëdÕ¿ëdÀV‰BÀV‰B°s$/°s$/§{J_§{J_¦7(n¦7(n¬Èo¬ÈoºšÁ—ºšÁ—΀“ ΀“ æ¹ Kæ¹ K/ Ô/ Ô€§N€§N3Y- 3Y- FÂþñFÂþñT{¶T{¶YøÃöYøÃöXzªXzªN„‰½N„‰½>Là>Là(d°>d§HŧHŦfRɦfRÉ­±]˜­±]˜¼y¼yÑ{á Ñ{á ê¸Í´ê¸Í´ïá"ïá" ‰ù! ‰ù!8!ÅË8!ÅËJ§VJ§VV_C V_C Z<ð‰Z<ð‰UÞ¾UÞ¾I«w®I«w®6»2>6»2>ÈÑÈÑVþVþèÛ(/èÛ(/ÏÐ4ÏÐ4»-²Ì»-²Ì¬ÛD(¬ÛD(¦* צ* ×§¼±U§¼±U±mi±miÂ^àkÂ^àkØýR*ØýR*ó=™Yó=™YžØ žØ (•¼$(•¼$>Û—>Û—O\k(O\k(X–& X–& YªÞoYªÞoRíõRíõCº©±Cº©±.µÂX.µÂX_*ÿ_*ÿú Ð@ú Ð@ßDßDÇàÇà´óÐU´óÐU©Zsâ©Zsâ¥È=V¥È=Vª–O|ª–O|·Rï·RïÊÔŠ2ÊÔŠ2ãHrqãHrqþo²þo²µ\µ\2‚ÝÍ2‚ÝÍFª5XFª5XTF§TF§ZŸZŸW†gW†gL×nÏL×nÏ;í;í#®¤A#®¤A é éí‚dí‚dÓµøGÓµøG¾Qu¾Qu®ƒ°œ®ƒ°œ¦š¶'¦š¶'§–î§–î¯Ù›‘¯Ù›‘À)TaÀ)TaÖvN÷ÖvN÷ð®õð®õ Wv Wv&¿¾&¿¾=‹õß=‹õßNœ2Nœ2XSHXSHYȉYȉRÓíJRÓíJD_’D_’.ýÌR.ýÌRtÆ tÆ ùãR[ùãR[ÞãyPÞãyPÆýnÇÆýnÇ´uJJ´uJJ© Ôü© Ôü¥Ó…¥Ó…« ØÁ« ØÁ¸uĸuÄÌÿ‹Ìÿ‹å=)å=)¿v¿va•„a•„5ç5çH«SH«SUy/Uy/Z:?`Z:?`Vs®žVs®žJ‚#ÆJ‚#Æ7<7<=Š =Š K¡K¡è_á³è_á³ÎúØÎúغ:‡^º:‡^¬V»¬V»¥÷µ¥÷µ¨fl“¨fl“³/¹,³/¹,ÅPL¬ÅPL¬Ý r"Ý r"ø%žø%žìÂCìÂC-ÃO¡-ÃO¡CI€CI€Rg«¾Rg«¾Y²lÃY²lÃXp³ Xp³ NÁ‰”NÁ‰”=Œ^%=Œ^%&u-¦&u-¦ ­óQ ­óQïÅõïÅõÕhÐ ÕhÐ ¿r2¿r2¯ š¯ š¦¸ï¢¦¸ï¢¦üº¯¦üº¯¯ÎE¯ÎEÀ[+?À[+?×®×®ñ°1àñ°1à ¬½ ¬½(G-_(G-_? ï? ïOÇ‘ëOÇ‘ëXÜYþXÜYþYg–LYg–LQZl’QZl’AwÞùAwÞù+DüÐ+DüÐä5ä5ôÞ­rôÞ­rÙê+}Ùê+}  ±DÙø±DÙø§…Ë!§…Ë!¦Zqf¦Zqf­ÞìÓ­ÞìÓ½_ª"½_ª"ÓXJ¾ÓXJ¾í¯'_í¯'_ È{Ž È{Ž$Ø›`$Ø›`<^<ë<^<ëN€N€X2]´X2]´YË‹îYË‹îR®©³R®©³C‹2ÏC‹2Ï-Õ Ä-Õ Ä¨ï0¨ï0÷ŽÝy÷ŽÝyÜE—ÜE—Äs¶eÄs¶e²p*زp*اüWR§üWR¦#9ɦ#9É­çî­çî¼#z¼#zÑÚŒ{ÑÚŒ{ìEŽìEŽR¤‚R¤‚# Àñ# Àñ;u‰¨;u‰¨MÆÐMÆÐWü\¨Wü\¨Yà>„Yà>„R÷ÑR÷ÑCð¤Cð¤.=ã<.=ã<7¿7¿÷É—Ö÷É—ÖÜ^ÑÜ^ÑÄpË´ÄpË´²]ìQ²]ìQ§íÑ §íÑ ¦,.Þ¦,.Þ­FàP­FàP¼Ž¼ŽÒ£NÒ£NìöÐìöÐ T)£ T)£$¯ð7$¯ð7*Pú>*@Fˆ;@Fˆ;(ü´P(ü´P ½„ ½„ðœk<ðœk<ÕKP ÕKP ¾WÙw¾WÙw®!ÑÝ®!ÑݦS±¦S±§¿7‰§¿7‰²@°²@°ÄÈ!ÄÈ!Ýj‚¾Ýj‚¾ù§R6ù§R6}–2}–20ó»D0ó»DFlJèFlJèT§‡@T§‡@Z2wZ2wVs·tVs·tIΦpIΦp5Šê†5Šê†ÀÀÿ™†ÿ™†â}ªâ}ªÈð÷ÈÈð÷ȵ9µ9¨û£¨û£¥æqv¥æqv¬*a¬*a»&Q»&QÑJˆýÑJˆýìPš,ìPš, _“v _“v%]îº%]îº=„fú=„fúOM*OM*XàlŒXàlŒY;ØY;ØPSöÑPSöÑ?Ñ­?Ñ­'>ÏÓ'>ÏÓ S8* S8*î6³î6³ÒñÉÒñɼ]ºü¼]ºü¬×â"¬×â"¦Ñ»¦Ñ»¨•Þg¨•Þg´Qeh´QehÇýˆ;Çýˆ;á‹Ãá‹ÃþOÎ¥þOÎ¥)Š )Š 5+±5+±I¦ÃI¦ÃVo¡Vo¡Z0×sZ0×sT=¢T=¢E÷ï†E÷ï†0 â0 â'²'²÷ût»÷ût»Û¥…ÒÛ¥…ÒÊ-Ê-°ÿ@/°ÿ@/§0 §0 ¦¿¨}¦¿¨}¯¹``¯¹``Á1Ø«Á1Ø«ÙMDÙMDõ‰Pºõ‰PºΘúΘú. oW. oWDz.*Dz.*S°kUS°kUZBsZBsVý*5Vý*5J³ÑòJ³Ñò6‚Lp6‚Lp‹ëT‹ëTÿ‹Ÿúÿ‹Ÿúâ•ê@â•ê@Ⱥ]œÈº]œ´»ng´»ng¨·ýó¨·ýó¥üËp¥üËp¬ÓÓ,¬ÓÓ,¼‰Å¼‰ÅÓo£MÓo£Mï·ï· ‘ ‘ (™ ¿(™ ¿@Z-@Z-QEàMQEàMY‘ûÇY‘ûÇXV½XV½M´„¾M´„¾:ÈЈ:ÈЈ!–ù!–ùËëÖËëÖç{6oç{6oÌÅì‹ÌÅì‹·‰ªÖ·‰ªÖª |÷ª |÷¥Æñ¨¥Æñ¨«-‘·«-‘·¹°ø¯¹°ø¯ÏÃäÏÃäë ´ë ´“ž¼“ž¼%ÔÞ%ÔÞ=§×µ=§×µO ~£O ~£Yd‰Yd‰Xø‡¢Xø‡¢OQˆ‰OQˆ‰=$¸å=$¸å$b…;$b…;³æ-³æ-ê-9×ê-9×ÎþEÎþE¹.¹.ªÒð[ªÒð[¥Â·_¥Â·_ªuçmªuçm¸jʸjÊÎ$¬JÎ$¬JéF<@éF<@ç„ç„#³Y_#³Y_j§¯>j§¯%¨%¨{go{goéøéøÍ*Ç:Í*Ç:·*qo·*qo©‰Èa©‰Èa¥à¸È¥à¸È¬›}r¬›}r¼ù¿Ù¼ù¿ÙÕ4CÕ4Cò/Wûò/Wûâ¯Ñâ¯Ñ-Œ’Ž-Œ’ŽD÷nCD÷nCTvŠZTvŠZZ8ãZ8ãU•ª U•ª GŽGŽ0Q¥ù0Q¥ùú?´ú?´õQ%¼õQ%¼×àƒð×àƒð¿׿×­Î a­Î a¦ô¹¦ô¹¨Éx¥¨Éx¥µ¦N䵦NäË.R-Ë.R-æÞVæÞV„Nð„Nð#uTÓ#uTÓ=<l=<lOð=~Oð=~YZ°YZ°Xej¸Xej¸M&7…M&7…8ë í8ë í \H \Hÿ§·Ñÿ§·ÑáK€ZáK€Zƺƺ²o$6²o$6§mЧmЦËpÀ¦ËpÀ°°ÃÂÁñÃÂÁñÝú‚2Ýú‚2ü8ûÁü8ûÁãõ&ãõ&6SHð6SHðKm¥œKm¥œW¶/FW¶/FY¹û:Y¹û:Q9ôæQ9ôæ?0ª?0ª%ºÊ³%ºÊ³ÒœÒœèû²9èû²9ÌÖºRÌÖºR¶¶áï¶¶áï©8\ð©8\ð¥÷? ¥÷? ­XT­XT¾ÔC¾ÔC×i½T×i½Tõ$Jõ$J-‹<-‹<0¾[¡0¾[¡GŒÂGŒÂUð oUð oZ.œZ.œSÈ¡SÈ¡Cx\ Cx\ +,C+,C ¿o ¿oî¯1|î¯1|ѨKVѨKVº €º €ªâ9µªâ9µ¥Ãݤ¥Ãݤ«`@«`@»©Ì»©ÌÓ“WÓ“WðR}ðR}x^Ýx^Ý,´Úf,´ÚfDªh¿Dªh¿Twk‡Twk‡Z;£ÞZ;£ÞUB<¿UB<¿F -~F -~. . ŒŒoŒŒoò]öÁò]öÁÔÌp¶ÔÌp¶¼d²¼d²¬ ¬ ¥Ìâ¥ÌâªW‚ΪW‚ι-¼Õ¹-¼ÕІ£TІ£Tí™]†í™]† äW äW*‹¯´*‹¯´C|ÚC|ÚS¨‚†S¨‚†Z-ÇZ-ÇUäýUäýGH‰BGH‰B0þÚ0þÚ"¢”"¢”óÙˆ²óÙˆ²ÖÿµÖÿµ½9ûk½9ûk¬|Õ ¬|Õ ¥ÔK:¥ÔK:ªÆ8ªÆ8¸´¶¸´¶Ïü‘›Ïü‘›ílºílº ƒ0 ƒ0*ZªÂ*ZªÂC 2%C 2%Sªý'Sªý'Z.ÊÚZ.ÊÚUÏ'ŸUÏ'ŸG èåG èå/¬±N/¬±N‚üR‚üRóöóöÕ;—Õ;—¼éJ¼éJ¬r¬r¥ÊoÃ¥Êoê^Ъ^й£ÏW¹£ÏWÑ]†•Ñ]†•îÏfèîÏfèWc_Wc_, ¢¨, ¢¨Dg5Dg5Tt¼ÉTt¼ÉZ¶îd>¨”eI¨”eI¦y§½¦y§½°ï°ïÂÆ·tÆ·tä)âä)â»”»”&g¯&g¯AºÇïAºÇïSÛ?rSÛ?rZ=x‚Z=x‚S÷oS÷oAç#Aç#&’Ê&’ÊÍ?Í?ä4J)ä4J)ÆÁ3ÆÁ3°çý<°çý<¦t™¹¦t™¹¨¦åƒ¨¦åƒ·13#·13#Ð óÐ óï±ñï±ñ­íá­íá1w1wI‹É±I‹É±W§O9W§O9Ya–Ya–N{ž5N{ž58y¾G8y¾Gw.w.ø±]ø±]×ñ €×ñ €¼ÝI ¼ÝI «O^‹«O^‹¥Ë8Â¥Ë8­/—­/—À<À<Üs†ÜÜs†ÜýÃÄ_ýÃÄ_b!b!e¿s>e¿s!R Ë!R ËÿV¿ÔÿV¿ÔÝq)dÝq)dÀœ`UÀœ`U­æ%­æ%¥ÇZv¥ÇZv«ÀõG«ÀõG¾*Rg¾*RgÚJú…ÚJú…üüÅüüÅL~îL~î< ïS< ïSPþ|ÝPþ|ÝZ•Z•UÇq†UÇq†DãàDãà)Ò'·)Ò'·oioiæévæévÇR ÇR °þÞz°þÞz¦`BƦ`BÆ© [ç© [縣~¸£~ÒÖJ²ÒÖJ²óÄkØóÄk؉y‰y5ßà©5ßà©M8LM8LY$™…Y$™…WÕH¾WÕH¾I}©¢I}©¢05Ò 05Ò ÁþºÁþºìï¯Rìï¯RÌób®Ìób®´Ž ´Ž §k´ñ§k´ñ§€¨‹§€¨‹´Ô­´Ô­ÍeQÍeQí‘Úpí‘ÚpzÊGzÊG0Ù)0Ù)Iö Iö X ØX ØXù`PXù`PL›IÌL›IÌ4ÅTM4ÅTMϙϙò ;ò ;ÑDEËÑDEË·m0+·m0+¨{xĨ{xĦ²+¦²+²Y¢Š²Y¢ŠÉ¶#¬É¶#¬éCb¤éCb¤ EÕ, EÕ,-\A-\AG™þ(G™þ(W—†W—†Y„¾Y„¾Nu¼¨Nu¼¨7¤³7¤³JÓsJÓsõT¾hõT¾hÓùÙ„ÓùÙ„¹@óƹ@óÆ©;ÇÄ©;ÇĦVg3¦Vg3± û± ûǶ£¶Ç¶£¶æô_gæô_g þ› þ›+nè+nèFR $FR $V”éV”éY»ämY»ämOJh OJh 8Ð.µ8Ð.µ³è¶³è¶ö¬#3ö¬#3Õ ¬Õ ¬¹ò€¹ò€©QI©QI¦?b÷¦?b÷°®º.°®º.Ç=à—Ç=à—æzFYæzFY ¦5Ö ¦5Ö+Iê¶+Iê¶FH&íFH&íVšdQVšdQY¶ IY¶ IO$¯O$¯8xN÷8xN÷* \* \õýLâõýLâÔV—ðÔV—ð¹\I›¹\I›©6 Ÿ©6 Ÿ¦`P±¦`P±±PqαPqÎÈ[®È[®çù ¹çù ¹ Mæs Mæs,Ï_Ž,Ï_ŽGr3Gr3W$YîW$YîYucÿYucÿN ;üN ;ü6™èã6™èãÂ-²Â-²ócÒ½ócÒ½ÑõNªÑõNª·œíl±>íl¦S¦S©r;{©r;{º( :º( :ÕÔcŒÕÔcŒø'‹ªø'‹ª³†¹³†¹:Ò¤ :Ò¤ PœGPœGZ ýÐZ ýÐU<»ÇU<»ÇC —C —&Pü &Pü ŽB6ŽB6à8æà8æÁßÙVÁßÙV­Md­Md¥ÄœL¥ÄœL¬wf>¬wf>À_-ÊÀ_-ÊÞUX¤ÞUX¤§á§á$¨aŽ$¨aŽAÔʸAÔʸTªa6Tªa6Z#îZ#îQeó9Qeó9;ÈÖì;ÈÖì·z·zùÊùÊÖ‰-”Ö‰-”º‹]ú‹]élj©Ç‰¦M‹5¦M‹5±LT_±LT_ÈÐÒëÈÐÒëé!Rné!Rn V V.çÏ_.çÏ_IDvUIDvUXÊRXÊRXËȸXËȸKuû¿Kuû¿2¯q2¯qÅŸqÅŸqì¾1 ì¾1 ËÆó!ËÆó!³ ÛZ³ ÛZ¦Âym¦Âym¨¦*¨¦*¸‡ÆÁ¸‡ÆÁÓÚЖÓÚЖöI„öI„?B/?B/9ïÁƒ9ïÁƒPgßÖPgßÖZ‹õZ‹õUA^öUA^öBÔãæBÔãæ%±Éù%±Éùã±ã±Þã©éÞã©éÀ•k£À•k£¬u¹¢¬u¹¢¥ÅÌœ¥ÅÌœ­œ,ó­œ,ó¼‡h¼‡há¾ï)á¾ï)«”P«”P(›p((›p(DûÒ½v>ª‚¶=ª‚¶=¦Ë¦Ë°‚ö§°‚ö§È$È$èú½Vèú½V © © © ©0=0=Jo÷•Jo÷•X—ÑX—ÑXç¸Xç¸I ŸÊI ŸÊ-áÿÀ-áÿÀ ²ˆ ²ˆæy.׿y.ׯ·7Æ·7¯C·›¯C·›¥âÆ@¥âÆ@«~e0«~e0¿08¿08ݯš°Ý¯š°ññ%ѹÓ%ѹÓC[CC[CU»ïU»ïYØQˆYØQˆO{æO{æ6ÿ`î6ÿ`îÏ]Ï]ðöžAðöžAΞ1¼Îž1¼´‚Ùk´‚Ùk§oc§oc¨p¡¨p¡¸‡Õs¸‡ÕsÔž SÔž S÷ÿãå÷ÿã後o¾Œo<–Hw<–HwRJJRJJZ°Äæ>°åNýåNý Ä–Q Ä–Q. ðv. ðvIyUkIyUkXb:iXb:iX3OX3OHòLJHòLJ-4z’-4z’ ·_W ·_W䋼Á䋼ÁÄÝ¢ÄÝ¢­ÝëR­ÝëR¥ÃpÆ¥ÃpÆ­,­³­,­³ÂÖ ýÂÖ ýã "ã ">{m>{m+îý¶+îý¶H{˜H{˜WéÀPWéÀPXe¼Xe¼JþÉJþÉ.Æ2j.Æ2j gÿì gÿìæ —¨æ —¨Å+ÉÅ+É®mh®mh¥ÉI·¥ÉI·¬¾}#¬¾}#Â"Ä{Â"Ä{â>_Câ>_CIÄIÄ+|ýÐ+|ýÐGÝ»vGÝ»vWÚXèWÚXèX¤wX¤wJ\“J\“.±Ð6.±Ð6 0³# 0³#庢1庢1ÄÐÓcÄÐÓc®-Û®-Û¥Å1B¥Å1B­rè­rèÂÕ>ÂÕ>ãE%cãE%c¾”…¾”…,œi(,œi(H¶¢QH¶¢QX1ÇX1ÇXPГXPГIÛ+IÛ+- ¤u- ¤u +’† +’†ã¬ Ã㬠ÃÃÑ•ÃÑ•­1—P­1—P¥ÄR¦¥ÄR¦®'ä®'äÄæÀ ÄæÀ æ ¹^æ ¹^ ¼ ¼/Hè¨/Hè¨J–¡J–¡X×P±X×P±WˆôÈWˆôÈFàâŠFàâŠ)Ååæ)ÅåæR&)R&)ßéû»ßéû»À$µÀ$µ«™c.«™c.¥î‹ö¥î‹ö°$P*°$P*ÈxÈxêš^Hêš^Hd}d}3ˆf3ˆfMa@XMa@XYžã»Yžã»V ЃV ЃCM/CM/$¦+÷$¦+÷ÿ<ÿ<ÚoGAÚoGA¼a¼a©œ?©œ?¦‰px¦‰px³Yä³YäÍÉÇÍÉÇñ*Ÿ„ñ*Ÿ„5{75{79 é(9 é(PÃXÚPÃXÚZ-'ðZ-'ðS”¯ôS”¯ô>#Gÿ>#Gÿ¢ž]¢ž]÷س“÷س“Ó~£ÀÓ~£À·„0·„0§¡{§¡{§ø²Ò§ø²Ò¸ ³¸ ³Ôÿ‡JÔÿ‡Jùª«ùª«vçÒvçÒ?3?3TVbTVbZÛPZÛPOµ}Oµ}7òZ7òZš¤8š¤8îi~¡îi~¡Ë\RË\R±¼Na±¼Na¦(óÒ¦(óÒª¸Ìtª¸Ìt¾¢^”¾¢^”ÞOäµÞOäµÕ•Õ•))F§UF§UW¾W¾X»ÍƒX»ÍƒIôtåIôtå-Ú-Ú |+ |+ãc#àãc#àÂpÅùÂpÅù¬˜“°¬˜“°¥ÒZs¥ÒZs¯[%ϯ[%ÏÇ€f<Ç€f<éãg¶éãg¶P‰·P‰·3¶'3¶'M¾ŠÑM¾ŠÑYÁ/YÁ/U†ÂµU†ÂµAÒ9\AÒ9\"-Œú"-ŒúüS×öüS×ö× Ló× Ló¹U¾Á¹U¾Á¨`á¨`á§[[Χ[[ζzζzÎÓl°Ól°÷Á€Þ÷Á€ÞMfMf>ºoƒ>ºoƒT š-T š-Z³ñZ³ñO»ÀêO»Àê6Øì6Øìð 'ð 'íbb.íbb.Ê6@ÏÊ6@ϰÜi °Üi ¥ûYº¥ûYº«•‰«•‰ÀªšfÀªšfá^ÅMá^ÅM¹ªg¹ªg,¢Ç,¢ÇIMÅbIMÅbX—ê•X—ê•W§ç¤W§ç¤F© F© (±…(±…>Äã>ÄãÝ/¬‹Ý/¬‹½‚Ïz½‚Ïzª¯0ª¯0¦o,¦o,³S* ³S* ÎZ¨uÎZ¨uò– Çò– Ç;í&;í&;1]õ;1]õRJw+RJw+Z<òZ<òQ¿qQ¿q9Òjð9Òjðgœgœð¦¹ð¦¹Ì·$aÌ·$a²CY²CY¦3!b¦3!bªÈꩪÈê©¿/öè¿/öèߢ}qߢ}q‹T‹T+b“`+b“`HœZ0HœZ0XhêsXhêsWÑ@ýWÑ@ýFïfŽFïfŽ(Þ€[(Þ€[2Xí2XíÜéІÜéІ½%’D½%’D©Óª¯©Óª¯¦‘aÒ¦‘aÒ´™´™Ϥ oϤ oôW¯ôW¯6Zé6Zé<ìñ_<ìñ_SO:SO:Z*)†Z*)†P2/ÓP2/Ó7>_Â7>_ÂóÔóÔìê#Ñìê#ÑÉo°Éo°°*Âİ*Âĥݪ¥¥Ýª¥¬{f,¬{f,ÂÌ_cÂÌ_cä Eä E £ò £ò0k³0k³L öL öYv£9Yv£9VZxVZxB‚áB‚á"n‡x"n‡xûÝkùûÝkùÖ±[Ö±[¸$ÎÆ¸$ÎÆ§Æ³È§Æ³È¨Š¨Š¸ø½4¸ø½4×Q ×Q ýe9ýe9#åg#ågC˜(C˜(V’3sV’3sY3:Y3:JúœJúœ.‘™.‘™ T[ÿ T[ÿâO$%âO$%ÀæþúÀæþú«u†ù«u†ù¦5è¦5è±Äc ±Äc Ì[ùÌ[ùðÌnSðÌnS%?§%?§:Ò¦:Ò¦RUQYRUQYZ:n“Z:n“P÷0P÷08Mñ8Mñç qç qíƒ.bíƒ.bÉŸWÉŸW°ø°ø¥Öë<¥Öë<¬ÑÈϬÑÈÏõF±ÃµF±æ,˜àæ,˜à ’­ ’­2Kͨ2KͨMq[’Mq[’YÍÌYÍÌTÿz•Tÿz•?ìÏõ?ìÏõ™ ”™ ”÷d™e÷d™eÑÒ‰ÅÑ҉ŵƵƦÅ$ƦÅ$Æ©—‰©—‰½ý½ýÝjµ:Ýjµ:zrŒzrŒ*¡t*¡tHˆK¦HˆK¦XˆJ£XˆJ£W~˲W~˲E E &S@é&S@éÿ µÈÿ µÈØû“JØû“J¹ÜY©¹ÜY©¨I6³¨I6³§¬¬4§¬¬4¸,'v¸,'vÖ—3 Ö—3 ý\ý\$ ‰ª$ ‰ªD4D4Vã}PVã}PXïÓXïÓIÄí IÄí ,KlT,KlT7¿¥7¿¥ÞêìŠÞê슾Ša¾Ša©õ{a©õ{a¦ ð¦ ð´´Mà´´MàÑwJ£ÑwJ£÷S9‡÷S9‡â¶ â¶ @YØ@YØUM™VUM™VY«{kY«{kL¤•L¤•0ˆ– 0ˆ– ‹ ‹ãU²fãU²fÁ<0kÁ<0k«h®9«h®9¦ ›û¦ ›û²wtD²wtDÎ/ˆÎ/ˆóbß·óbß·9XÉ9XÉ=§ê<=§êA ~>AáNDXáNDX¿G|®¿G|®ªJkªJk¦“à…¦“à…´í®&´í®&ÒqiïÒqiïù4{ù4{!ME!MEBž†*Bž†*VŠÊ½VŠÊ½Y‡$Y‡$If«If«+!q+!q΃΃ܚܚ»j¿»j¿¨£hΨ£hΧ”xë§”xë¸} #¸} #×îçÝ×îçÝÿüÍÿüÍ'7’©'7’©Fá–YFá–YX4uX4uWž<:Wž<:E=È—E=È—$ÅB‚$ÅB‚üÏs$üÏs$Õzm¥Õzm¥¶Íz¶Íz§ ˆ2§ ˆ2©r¦Y©r¦Y½Š A½Š Aß;d[ß;d[§R§R.n=a.n=aKº•oKº•oYš'IYš'IU+ÿ U+ÿ ?WKŠ?WKЉú‰úóá°zóá°zͯÕ+ͯÕ+±Í…K±Í…K¥óy7¥óy7¬šÙ¬šÙÄeÄeèy?èy?e‹se‹s6©÷À6©÷ÀP» P» Z=SÝZ=SÝQ4éYQ4éY7yèi7yèiOßTOßTé]ìRé]ìRʼnʼn¬ê}[¬ê}[¥è>^¥è>^±‡û±‡ûÍ_y_Í_y_ó»bó»bš¨¯š¨¯?w¢?w¢UQ6UQ6Y„HY„HK7c¤K7c¤-Xô¡-Xô¡_*_*݇Þ`݇Þ`¼¼+¼¼+¨Éø¨Éø§öm§öm¸½ 4¸½ 4ؽË3ؽË3ôÀbôÀb(ìî(ìîHV¡`HV¡`XÅnXÅnV¿uêV¿uêB±iB±i ¼Ê‘ ¼Ê‘÷ôB±÷ôB±ÐÔÂÐÔ³ˆ·¬³ˆ·¬¦2Ôÿ¦2Ôÿ«¡”õ«¡”õ¸†®Â¸†®æ¥¯Ó楯Óêê5Èg5ÈgPd•”Pd•”Z=Z=Q5óQ5ó700i700i—f—fèL†ŒèL†ŒÃôÓ`ÃôÓ`¬6]á¬6]á¦O ¦O ²ÕN¹²ÕN¹ÏÙÕˆÏÙÕˆ÷Ì(÷Ì( Mè MèB[zÔB[zÔV«;˜V«;˜XƤhXƤhH4P#H4P#(l©ª(l©ª¢û¢û×Â}J×Â}J·âÙž·âÙž§¼WAVEfmt (ÿþ@ú  €ª8›qfactÐdata>€]Å{]Å{­þ*­þ*)GH )GH :žö”:žö”I`~I`~S®S®Y^êèY^êèYÃ!ÏYÃ!ÏUbédUbédKÂê*KÂê*> æ > æ ,ja,jaf¤ôf¤ô²—î²—îìøã#ìøã#Ø(ÙðØ(ÙðÅÍgDÅÍgD¶ÃT_¶ÃT_¬, Õ¬, Õ¦‰½¦‰½¦[ƒb¦[ƒb«™ r«™ r¶ þ¶ þÅt$Åt$׫p׫pìæSìæS@JÔ@JÔü ü -) Ì-) Ì>Ã0>Ã0L™'ïL™'ïUíõUíõZ ±ˆZ ±ˆXÁñ¤XÁñ¤RÒRÒFK¨ÅFK¨Å6-ãT6-ãT"¸Xg"¸Xg h hö›Ïö›Ïà} Ãà} ÃÌnmlÌnml»’£a»’£a¯|ñ¯|ñ§ ˜§ ˜¥ßˆŸ¥ßˆŸ©í6Ó©í6Ó³Öþ³ÖþÂ0—€Â0—€Ôá]«Ôá]«êyÜUêyÜUpupuÞnPÞnP,¿-a,¿-a>ãv>ãvM úýM úýV_uãV_uãZ)BhZ)BhX.ëhX.ëhP{?4P{?4CŽªôCŽªô2-^Ð2-^Ð|\ |\ ÉÓWÉÓWïšsbïšsbÙqQÙqQÅÐ~ÃÅÐ~ö ¦'¶ ¦'«7¨h«7¨h¦šÄ¦šÄ§ § ®2¾X®2¾XºéóAºéóAÌp…Ìp…á%Qá%QøáóóøáóóP&aP&a&n”Þ&n”Þ:1:1IàdÏIàdÏT½«T½«YÞÌFYÞÌFXêˆXêˆQÝ•ÊQÝ•ÊE0¨ÝE0¨Ý3²uÎ3²uΗL—LKKïpûoïpûoذ ذ Ä«–Ä«–´ÎÉ©´ÎÉ©ªHiÀªHiÀ¥ÝÃ¥Ýçðíw§ðíw°aX÷°aX÷¾£»>¾£»>Ѱ¡ŽÑ°¡Žè4î è4î oCŸoCŸ/ÜU/ÜU.2›³.2›³A¼¨A¼¨O=Ù¯O=Ù¯WÚDFWÚDFZ,-«Z,-«VÉ«VÉ«K–Ú!K–Ú!;§?Ú;§?Ú'P¼Ú'P¼Ú B B÷ˆš÷ˆšß—Dß—DÊÙÊÙ¸lˆ¸lˆ¬-ük¬-ük¦=꺦=꺧@§@®Â®¾®Â®¾¼¨Ò¼¨ÒÏÆ|ŽÏÆ|Žæ«›õæ«›õÿxÿxÔ.Ô..¦.¦AÙ¥BAÙ¥BPœýPœýXg¹Xg¹YüèCYüèCT½«GT½«GHû3üHû3ü7™0Ž7™0Ž!Þ4!Þ4 x(ù x(ùðDX[ðDX[Ø>ÑÆØ>ÑÆÃJþ“ÃJþ“³l+³l+¨øÕ¬¨øÕ¬¥Å&¥Å&©ÎH©ÎH´É0Ë´É0ËÅæ”ÛÅæ”ÛÛÀ–©ÛÀ–©ô«  ô«  4õƒ4õƒ&Q}O&Q}O;‡–;‡–L ¼dL ¼dV˜7èV˜7èZ<{ãZ<{ãVª­Vª­Læ4Læ4;ZL ;ZL %¼¿ÿ%¼¿ÿ þù þùó ó Ú@¸8Ú@¸8ÄtߌÄtߌ³OO³OO©)†©)†¥Ç‡¥Ç‡ª%4 ª%4 µË,µË,ÇÐOÇÐOÞ©]öÞ©]öøv¹±øv¹±ˆÓˆÓ*ÚÆÀ*ÚÆÀ?¼zf?¼zfORóÊORóÊXT£jXT£jYéIYéISéfSéfFÂÃ0FÂÃ03Âi3ÂißPÚßPÚ¾ý¾ýçe¹Ïçe¹ÏÏ#bÏ#b»1‚»1‚­ L­ L¦BôͦBôͧpÙZ§pÙZ°{Ýr°{ÝrÀ°+À°+Ö”•ôÖ”•ôðS-£ðS-£ D»P D»P$Û0e$Û0e;Qy8;Qy8LŸcsLŸcsW=v\W=v\Z*ÕàZ*ÕàUŽÄUŽÄHm¦Hm¦5®Ò>®Ò&0:&0: {©N {©Në¬øÛë¬øÛÐÓëÐÓ빟Íg¹ŸÍgª÷pªª÷pª¥Ãüþ¥Ãüþª¤ ª¤ ¹( V¹( VÏ®ÕÏÏ®ÕÏëÎ>¨ëÎ>¨ €Š €Š&Ã+õ&Ã+õ?SÃñ?SÃñPë/†Pë/†Y޼2Y޼2X3wäX3wäLïTcLïTc8öÊ‚8öÊ‚{ˆ{ˆyÁÁyÁÁâVçâVçÇŒ‘ÇŒ‘³6[³6[§ÁL9§ÁL9¦•W¦•W¯×{Z¯×{Z”_g”_gÜ¢òÜ¢òúìŸúìŸjÐjÐ4ÜoŸ4ÜoŸJS«gJS«gW.¼MW.¼MYð}3Yð}3R%Y^R%Y^@±Š_@±Š_'ˆç7'ˆç7 £ì$ £ì$êƒ;Öêƒ;ÖÍæËÍæË·@¦·@¦©[ˆ€©[ˆ€¥÷Ÿ¥÷Ÿ­-n­-n¿M®Æ¿M®ÆÙ ZôÙ Zô÷³S÷³SF5F53`Jï3`JïI«iEI«iEWðWðYì3QYì3QQÈ¥6QÈ¥6?›’]?›’]%‡4Q%‡4QÀóÀóç1ç1ÊjhkÊjhk´oC´oC§ôœ§ôœ¦›¡‹¦›¡‹°©•÷°©•÷Äã2—Äã2—àÉ0«àÉ0«°ÎI°ÎI Æ Æ;u&ø;u&øOm:sOm:sYda,Yda,X ¼ X ¼ Kpì8Kpì85&øÄ5&øÄõ„þõ„þ÷›iQ÷›iQØCf¯ØCf¯¾ X¾ X¬kPc¬kPc¥Èò™¥Èò™«Ô«Ô»²ù»²ùÕvÇÞÕvÇÞõ ÙMõ ÙMº<Óº<Ó3bã¹3bã¹JpõhJpõhW»ºW»ºY|Y­Y|Y­OZ˜OZ˜:Ÿ¾ :Ÿ¾ ü^²ü^²ý@Ìsý@ÌsÜÏz§ÜÏz§Á>iÁ>i­ßá­ßá¥åׯ¥åׯªNþªNþºœ·‰ºœ·‰Ô•­Ô•­ôµÿ)ôµÿ)üòüò47W47WKbu©Kbu©XA´åXA´åY ^Y ^M‚…GM‚…G73=¨73=¨"ËN"ËN÷{*S÷{*SÖó§;Öó§;¼&‹}¼&‹}ªðÓœªðÓœ¥Ô+$¥Ô+$­¨EÊ­¨EÊÁ[&•Á[&•Þ3}ÈÞ3}ÈÿíÔUÿíÔU!E}.>}.ìmìmËë{ŠËë{гŸ.³Ÿ.§I§I¨ír¨ír¶Ü}¶Ü}Ñ«ÐÑ«Ðò£~Zò£~Zièiè5ÞÐÚ5ÞÐÚM‹ñTM‹ñTYRþ£YRþ£W[O:W[O:GÐ>jGÐ>j- \Ø- \Ø )ò> )ò>çsvçsvLJÖ/LJÖ/°ƒÈy°ƒÈy¦!pì¦!pìª""î¿»ü»üØâLØâLü/Xü/X¹?̹?Ì>"×`>"×`RÉëŸRÉëŸZ;5¶Z;5¶S<@ÌS<@Ì>Çfy>Çfy k kü'ªÖü'ªÖØÀkTØÀkT»²I»²I©ßíG©ßíG¦Eû¦Eû±¥q‘±¥q‘Ê "»Ê "»ëÈOÅëÈOŨ8C¨8C2qóè2qóèL Œ!L Œ!YŒ]YŒ]WfÝÓWfÝÓGG*Ú+A*Ú+AN€^N€^âuñuâuñu‰å²Â‰å²­¨z­¨z¥Ââ¥Â⮃ƮƒÆÄ}º=Ä}º=åi^«åi^« ߯ž ߯ž.9.9I„ýëI„ýëXi}ÖXi}ÖX"YèX"YèHKSHKS,tÎ,tÎxwxwâí&¤âí&¤ÂhaÍÂhaͬ»n|¬»n|¥ÊñÌ¥ÊñÌ®ú¤c®ú¤cư”8ư”8èÙb˜èÙb˜ÿöæÿöæ2*äu2*äuL”0L”0YqA×YqA×VfˆVfˆCÝ®øCÝ®ø%rç%rçÿ„ÉÀÿ„ÉÀÙöeÙöe»C' »C' ©)w©)w¦èצè×µ69òµ69òÑq.áÑq.áötŽïötŽïìÚ4ìÚ4=ìv<=ìv‡=ë>‡=Å\Å\¬pجpئ `¦ `³ûÖ³ûÖÒÿìZÒÿìZüDŒüDŒ&tf&tfG@¶œG@¶œXº%]Xº%]V[Œ“V[Œ“@“ÿÈ@“ÿÈ%yý%yýñA·ïñA·ïÉŸªêÉŸªê®`í®`í¥ØkÉ¥Økɲ)¬†²)¬†Ð”×Д×ú iŠú iŠ$¬,)$¬,)FÂ'ÅFÂ'ÅX³‚]X³‚]V3RôV3Rô?·tP?·tPVÄÃVÄÃî·î·ÇË”ÇË”¬ÄlÖ¬ÄlÖ¦,àÞ¦,àÞ´úe´úeÕÍnHÕÍnHÃàƒÃàƒ+.û+.ûKköKköYáåçYáåçRúKBRúKB87B87Bå<˜å<˜ã¤Lyã¤Ly¾-ç¾-稧‡M¨§‡M¨|rà¨|rà½Í°æ½Í°æã•hã•h8q8q8›~8›~STé(STé(Y»h Y»h Jo·Jo·(.… (.… ü5Œü5ŒÑlÑl±šò"±šò"¥ÄsX¥ÄsX°¯“*°¯“*ÏÂéÖÏÂéÖû+ÿû+ÿ'x[ê'x[êIÏ1ÌIÏ1ÌY¾n{Y¾n{Sj-Sj-7I}Ô7I}Ô `¶è `¶èßø•Äßø•ĺ°jº°j§:÷§:÷ªÄ¤,ªÄ¤,Ä„žÄ„žíðÛ íðÛ ÝálÝálB[`àB[`àWÝÓkWÝÓkV˜rV˜r>É»>É»xnÑxnÑè*áè*áÀ"ëÀ"ë¨Õ)*¨Õ)*¨Ñ²q¨Ñ²qÀ#rÀ#rèÀNæèÀNæaå6aå6?”^«?”^«W ChW ChWOãïWOãï@5Bð@5BðÃ_âÃ_âèÎ ÊèÎ ÊÀ |À |¨§ÛŨ§ÛÅ©.¨ ©.¨ Á™!ªÁ™!ªëdãwëdãw§ÐÓ§ÐÓBjXõBjXõX.;X.;UÅÓ–UÅÓ–;½Šm;½ŠmH!H!áQ¢áQ¢º„ÃȺ„ÃȦØ5Ó¦Ø5Ó¬I d¬I dÉs—æÉs—æö;Lö;L%€O¡%€O¡J`¨J`¨Z3ßZ3ßPˆuáPˆuá05ì”05ì” ÞÛ ÞÛÓì­5>ì­5?‹~?‹~ÂÊõÍÂÊõÍ¥ð_ó¥ð_óºíìhºíìhöV¢ùöV¢ù6äÊ6äÊY¼3Y¼3J'î-J'î-ãÚãÚÏŒƒnÏŒƒn¨@ù,¨@ù,²W'²W'èq€èq€+¿—˜+¿—˜VFéVFéPW ýPW ýâkâkØîG™ØîG™«'ÿÕ«'ÿÕ­ö4ó­ö4óà¼(à¼($wLö$wLöSÌÍSÌÍS4ÿ±S4ÿ±"¤‘ "¤‘ ÝñšÝñš¬ì<‰¬ì<‰¬P¬PÜÜ)BÜÜ)B!ô‰Ë!ô‰ËSìSìS¸ŠpS¸Šp#Hr¢#Hr¢Ýó¼¢Ý󼢬«Gج«Gجҕ¬Ò•Þº°èÞº°è$Zäa$ZäaTA TA R*TgR*TgõµõµÙÙª‹'Gª‹'G¯©%“¯©%“å·¶å·¶+Ÿ­+Ÿ­VþŸ3VþŸ3MÊöÃMÊöÃ2oK2oKÏ›€Ï›€§‡ z§‡ z¶×¶×ò`°zò`°z7ÀÈ7ÀÈY­²{Y­²{E"´¶E"´¶£—2£—2ÂŽHÂŽH¥À¥ÀÁ¨Ý Á¨Ý ÛãåÛãåDΕzDΕzY®‘]Y®‘]6=ûE6=ûEðo! ðo! ´jL¢´jL¢¨kièkiÃÔŒØÔŒØp:Xp:XRšRšSd[lSd[lQC‘QC‘Öþ/¢Öþ/¢©©³}³}ïãBVïãBV6›ê¼6›ê¼YÕ_"YÕ_"BÊbBÊb§Ä§Ä½.½.¦1"̦1"ÌʬEʬE|úP|úPMæ– Mæ– Uÿ"»Uÿ"»% ¨ó% ¨óÛr†eÛr†eª€Gª€G²Såê²Såêï‘ï‘6ø,é6ø,éYûÚ7YûÚ7@^@^û€Ù;û€Ù;¹\Îà¹\Îà§4Jا4JØÑà®)Ñà®)†þ†þRõÍRõÍQV:CQV:C꣣꣣Íò RÍò R¦r¡2¦r¡2½%‰½%‰r^r^EÚ©rEÚ©rXá¤Xá¤.r[.r[ãɶãɶ¬'L:¬'L:°R×J°R×Jìû©(ìû©(6ïôa6ïôaZ–Z–=¼ƒ„=¼ƒ„õsæŠõs抴š´š©–Âc©–ÂcÜÆ‹ÜÆ‹)-(ÿ)-(ÿW÷x±W÷x±GÊnGÊnÎ4ÓÎ4Ó¼ý »¼ý »¦ºŠK¦ºŠKѱ—áѱ—árzrzTÞ…€TÞ…€M—¶M—¶ |Í@ |Í@ÃcЮÃcЮ¥á¿%¥á¿%Ë50µË50µÀpwÀpwR…ÜCR…ÜCPRç0PRç0i¦si¦sÆªà¢Æªà¢¥Â ¥Â ÈͶsÈͶsš š QÖn–QÖn–Pħ²Pħ²¶’ß¶’߯b1ûÆb1û¥ÇS›¥ÇS›Ê.+fÊ.+fÔÉMÔÉMStãStãOs/Os/RŸRŸÂ„¯Â„¯¦¦Ï‘ LÏ‘ L¤à¤àUÐ5{UÐ5{JcÎJcÎ,1ö,1ö»§«8»§«8§¯ï§¯ïÙuÁ:ÙuÁ:)Ù')Ù'XÛŒXÛŒBG¥ÚBG¥Ú÷*câ÷*câ²üMó²üMó¬'@¦¬'@¦è˜†I蘆I7¤I°7¤I°Z5]UZ5]U4©Í4©Íäª*:äª*:ª¤ªª¤ªµÃá¼µÃá¼ýdºÖýdºÖF÷vJF÷vJW0(W0( O® O®Ï.Ï.¥æÃª¥æÃªÆòFœÆòFœ$#$#TàëTàëKè̬Kè̬è‹«è‹«¹¿³¹¿³© Ia© Iaá:•há:•h3ëÉ3ëÉZ4ÉZ4É5í'5í'ä:jä:j©Ý`2©Ý`2¸qC5¸qC5ìüšìüšKã_*Kã_*S¡‰FS¡‰F;Œž;ŒžÃxh€Ãxh€¦|ýÿ¦|ýÿÖ¬ÁÞÖ¬ÁÞ*ew *ew Y—üY—ü;Æ9;Æ9ê/Ðê/Ыo­9«o­9¶[„X¶[„XÃÍÃÍKq© Kq© Smž¿Smž¿_öô_öôÁäâÁäâ§1…[§1…[ÜMµÜMµ0½”K0½”KZ6$XZ6$X3Ô†j3Ô†jß@œ‹ß@œ‹§Í¯¶§Í¯¶¿€Ç±¿€Ç±<&<&SZ³tSZ³tJÄpõJÄpõþÉ]­þÉ]­³ÊÇͳÊÇÍ­ô¶Û­ô¶Ûóo/óo/C¿_C¿_Vè…žVè…žÔeæÔeæÆ°íÆ°í¦{Š[¦{Š[Ù¦N Ù¦N 03Õt03ÕtZ:Z:0þ>0þ>Ú8üÛ±>üÛüåÂ.üåÂ.Ku·Ku·Q|ÇPQ|ÇP …j …j·¯&®·¯&®¬’+#¬’+#òÖ·5òÖ·5EÝòEÝòTÞ„TÞ„‹6‹6¼hØT¼hØTª4¦Œª4¦ŒìТ ìТ BWÝBWÝVY§MVY§M°°¾²Çñ¾²Çñ©g8}©g8}êÔ<˜êÔ<˜Age5Age5VŒ´VŒ´¾>t©¾>t©©ÊF©ÊFìÍ7ìÍ7C=ŠƒC=ŠƒUˆUˆkk»²º»²º«ks«ksòЭòòЭòGˆ(Gˆ(RãÂ-RãÂ- øÿ øÿµ·©Æµ·©Æ¯aD”¯aD”üúÐ\üúÐ\M§‹^M§‹^M t0M t0ü†|ü†|¯.R¯.R¶x§¶x§ Z×J Z×JT5s‹T5s‹DuUDuUìnRììnRì¨ûåï¨ûåïÂ<ŸÂ<Ÿk»k»Y*WÄY*WÄ5ä¢Ñ5ä¢ÑØçí«Øçí«¥Éª(¥Éª(ÔaÔa1Àš—1Àš—Y¼Ï‹Y¼Ï‹ ß?‘ ß?‘Ä=ÎÄ=Ψ¨ì“Ìôì“ÌôE¼L§E¼L§R°îFR°îF2ow2ow±Ò˱ÒË´¾Ç­´¾Ç­ ¶Ú ¶ÚUÅ4UÅ4A TÁA TÁäãäã¦È\ ¦È\ ̋ɰ̋ɰ+÷«¦+÷«¦Z#Z##aLÁ#aLÁÄ¿¥Ä¿¥¨÷«¨÷«ïÞn@ïÞn@HüúHüúOzO„OzO„ûÈB~ûÈB~¬º½O¬º½O½Ò0½Ò04©¿4©¿YCÃ_YCÃ_2±B2±BÑ#Ï’Ñ#Ï’¦Pd¦Pdãš £ãš £AÍ{kAÍ{kS°TæS°Tæbë¿b뿯͵¯Íµ¹5ø¹5øÈ"qÈ"qXºÂXºÂ3”î]3”î]Ñš¢·Ñ𢷦hÇ1¦hÇ1å«3µå«3µD+éÛD+éÛQ¼˜Q¼˜þq þq ¬–Ô¬–Ô¿"¯¿"¯³†q³†qZ^ôZ^ô(HÞ(HÞÅÇ:ÁÅÇ:Á©¸?©¸?ö—ðö—ðN×N×GUìGUìèôµhèôµh¦ ‘¦ ‘ÒŒ©ÒŒ©5ÿôé5ÿôéW‰¤°W‰¤° t:B t:B²š¦“²š¦“·Âæà·Âæàĸ‚ĸ‚YlÅÚYlÅÚ,ý®,ý®ÈZåÅÈZåÅ©YØA©YØA÷S_#÷S_#P'tÛP'tÛDI‰µDI‰µâdóÈâdóȥг٥гÙÛÛ<ÑÛÛ<Ñ?Ù&?Ù&R­RpR­RpüV;üV;ª†è%ª†è%ÆmNÆmN,Y#q,Y#qYA‘™YA‘™yÒyÒ´lÖ`´lÖ`·Td·Td°½°½Yî«~Yî«~&gå&gåÀ·}­À·}­­Õ£Ê­Õ£Êè* è* VÚ8ÐVÚ8Ð4Óe«4Óe«Í-oIÍ-oI¨©ÿ¨©ÿø(Kø(KQýÇcQýÇc?D?DØ>ÛWØ>ÛW¦du¦duìÈ\ìÈ\LîogLîogEågEågàëíÆàëíÆ¥ÄÃz¥ÄÃzäïµäïµHÄ&èHÄ&èIþ½çIþ½çæÁÝõæÁÝõ¥Ð ȥРÈàbÒèàbÒèF<(F<(KîÈKîÈéwéw¥ë¬$¥ë¬$ßßE¼ª/E¼ª/Ký€YKý€Yèê èê ¥Ú/í¥Ú/íàÒÔàÒÔG^G^J)réJ)réåvåv¥¾©_¥¾©_åçÂåçÂJè9jJè9jF„MF„MÞG ÞG ¦&H¦&HÂîo²/îo²/O¾<žO¾<ž?TrÓ?TrÓÔQÌ0ÔQÌ0§ôw“§ôw“úÄÀúÄÀT÷šT÷š4ìÕL4ìÕLÈY^—ÈY^—¬|C†¬|C† G¶È G¶ÈY@–Y@–&6&&6&»y·Ž»y·Žµ;u½µ;u½þ1 þ1 Z]Z]·¼·¼¯‹b¯‹bðï…ðï…1`xX1`xXU·iU·iú´o­ú´o­§x²v§x²vØèÎŒØèÎŒDý3lDý3lIœ/TIœ/T߯Ìë߯Ìë¦eWߦeWßôÇdôÇdT~yT~y4'4'ÄümÓÄümÓ¯¼ˆ¯¼ˆ4Ä4ÄZ;óZ;ó]jˆ]jˆ¯Ô¯ÔÅ»›rÅ»›r5ÓÛ95ÓÛ9RÓä‘RÓä‘ïån±ïån±¥ÖN-¥ÖN-è5€ôè5€ôO£ØO£Ø; ±; ±Ê;ߨÊ;ߨ­°à­°àª’ª’Z<ôÙZ<ôÙäZäZ®¼­®¼­ÊciÊci;±ª³;±ª³N­qN­qäœVäœV¦C-…¦C-…÷­¿‚÷­¿‚Vc»IVc»I*¾g]*¾g]ºaß´ºaß´ºN庺Nåº*î9*î9V%exV%exö Íö ͦ&i¦&ièÁ|‚èÁ|‚QkÔQkÔ5BÚ5BÚÁú¦€Áú¦€´_8´_8#a©M#a©MWùŒ°WùŒ°û®¢°û®¢°¦p儦på„åãøåãøPµ\Pµ\5{ 5{ Á2ˆ%Á2ˆ%µÞà͵ÞàÍ&Ù†’&Ù†’V¯*úV¯*úõ)ìõ)ì¥Ð%B¥Ð%BîߊöîߊöTݳéTݳé+nL+nL¸W!c¸W!c¿5‹'¿5‹'4£Yñ4£YñPE…ºPE…ºâá2ƒâá2ƒ§TÁ§TÁS¸°S¸°YÖ7¥YÖ7¥ÕøÍÕøÍ«ÉØø«ÉØøÔºˆeÔºˆeHÇúÀHÇúÀ>‰ ;>‰ ;ÇHbÇHb³„g³„g%IZ%IZV4sV4sð*@yð*@y¥ä«¥ä«ú¨Êðú¨ÊðXÑ»æXÑ»æ7›7›­!’­!’ÓfêÓfêILÿILÿ<°Aó<°AóÄ ´Ä ´¶Ät(¶Ät(,íÛl,íÛlR|ƒIR|ƒIãÙcËãÙc˧õ´2§õ´2 c¾Ý c¾ÝZ5T…Z5T…´\¨´\¨¦Ñ!ƒ¦Ñ!ƒêŠ2óêŠ2óUk7-Uk7-$v×È$v×ȰÂòm°ÂòmΤ‘òΤ‘òG[ܵG[ܵ<Í´<Í´Â'+ÕÂ'+Õ¹ùÞ¹ùÞ3®¿&3®¿&M‘´{M‘´{×b×b¬ðr^¬ðr^Áw¡Áw¡VýNìVýNìíkBíkB¦ÇõD¦ÇõD1¢u1¢uZ;!ÍZ;!Ír‡r‡¦ O`¦ O`ô»Ðô»ÐXçÈÜXçÈÜÁâÁâ©wx©wxäJ»°äJ»°T°›T°›"Ï{:"Ï{:®/ ®/ ×)Øc×)ØcOÁîOÁî.W¹.W¹´·Ú´·ÚÍ/wÍ/wI4Ø€I4Ø€6Ë 06Ë 0¹§ßŒ¹§ßŒÆj©Æj©Dø Dø <¡"º<¡"º¾/?±¾/?±Ás­Ás­@@Ës@@Ës@2è/@2è/Á*l®Á*l®¾ìSf¾ìSf>8´3>8´3A²>wA²>wÂ8Â8¾bT3¾bT3>"Â>"ÂAOô¹AOô¹ÁP¨jÁP¨j¿¸®–¿¸®–?ÿä2?ÿä2>þŸ>þŸ¾ƒ×ñ¾ƒ×ñÚñÚñCœCœ:™{q:™{qº$ º$ Ȩ¨‹È¨¨‹H©yH©y3±ír3±ír´”'7´”'7Ðø HÐø HNEèNEè)ÕÐ4)ÕÐ4®—œ®—œÜm* Üm* TY½TY½¹ªS¹ªS©OAZ©OAZëAFÇëAFÇXÄ”)XÄ”) 1( 1( ¦ΦÎý€ˆ,ý€ˆ,ZG4€ZG4€øV¬¨øV¬¨¦Æ6·¦Æ6·©y“©y“W)eW)eâ5â5­d­d)Oô))Oô)M,O-M,O-Ë¡rLË¡rLºÈ‹GºÈ‹G?û'?û';nÒ;nÒ·}öb·}öbЧ ÏЧ ÏP˜úP˜ú!œ7H!œ7H© ãí© ãíî*Õî*ÕYÊDDYÊDD1r1r¦&P¦&P«æF«æFV¢MV¢MÝÃbéÝÃbé°©Ç«°©Ç«3/£±3/£±DiþãDiþã½è7j½è7jÊ‘"åÊ‘"åNm³Nm³#T#T©bq©bqñ¢>_ñ¢>_Z>¬¡Z>¬¡øåVøåV§ê!|§ê!|›Éò›ÉòP=c&P=c&ÌWšPÌWšP½È•ä½È•äEшEш/ ýf/ ýf­(€D­(€Dè«è«Y±‰òY±‰òý;1ý;1§MBw§MBw•¦7•¦7OÌõ²OÌõ²Éë…âÉë…âÁLÝÖÁLÝÖJj²Jj²'x¦'x¦©aK©aKõ®a@õ®a@Z-”KZ-”KëÿV¨ëÿV¨¬Õþ¬Õþ0ïf0ïfBûJBûJ·ÉŸ(·ÉŸ(×쿇×쿇VØ-VØ-b¦Jb¦J¦8@¦8@pªjpªjP<#=P<#=ÇóáRÇóáRŧ£Fŧ£FO#7O#76º06º0¦L \¦L \ )’ )’VÀaVÀaÓ‡ÝӇݼž^/¼ž^/HéÇUHéÇU$e$e§›J¿§›J¿ÛÛW°aÈW°aÈׯ¹×ƹº{Âìº{ÂìGÀ\GÀ\% –% –§t;çt;ÃþaÌþaÌVÉXƒVÉXƒÓT:%ÓT:%¾œ÷羜÷çL•¶L•¶¸·ê¸·ê¦.õ¦.õ©]©]RA€bRA€bÇWö@ÇWö@ʆ=Vʆ=VSü‘qSü‘q |W© |W©¦É»Ø¦É»Ø$*Â($*Â(FN±FN±¶ÁÙ¦¶ÁÙ¦áAØáAØZø#Zø#î?¾î?¾¯à¥±¯à¥±> K> K-ÄáÐ-ÄáШ‹¼$¨‹¼$² ý² ýUst(Ust(Ë‘§êË‘§êÈý9¥Èý9¥Tƒ‚éTƒ‚é¤ /¤ /¨]‡¨]‡.D.D;à>Ù;à>Ù­…Á­…ÁöS*nöS*nXpI¸XpI¸ÓhÝRÓhÝRÃeÁ¼ÃeÁ¼RÝcRÝcâá#âá#¨¥¿¨¥¿/> v/> v9·3Ê9·3Ê«±è:«±è:ý?ñ±ý?ñ±V."TV."TÊ*‡LÊ*‡LͰvRͰvRWw.sWw.s÷¾Ñ÷¾ѮRPÖ®RPÖ?âs”?âs”&¿a&¿a¦ˆ¦ˆ_}f_}fH÷GöH÷Gö´Ÿ—´Ÿ—ìkaˆìkaˆY[v‡Y[v‡Óê³Óê³ÆŒïîÆŒïîU»8«U»8«û0@Vû0@V®Pÿ®PÿAH$AH$!¾úŒ!¾úŒ¥Ðê>¥Ðê>!ð†!ð†@´†@´†­>¿­>¿þnþnSí@WSí@WÀåô2Àåô2Ý5r¥Ý5r¥ZLp²ZLp²Ü%³Ü%³Â1”xÂ1”xTïXTïXú;Ú#ú;Ú#¯ë½¯¯ë½¯Fe œFe œ&.Ý&.ݦüv‡¦üv‡1ÞAU1ÞAU0 ùb0 ùb¦™Y4¦™Y4~¯~¯CMsƒCMsƒ­$v³­$v³ÝyáÝyáP{}P{}¸¬jÚ¸¬jÚìå!Qìå!QWݪÆWݪÆÇ%?ŽÇ%?ŽÙá÷Ùá÷ZGu×ZGu×ÖÛ¹ïÖÛ¹ïÊPHVÊPHVXåüXåüæ~ ùæ~ ù¾å$Z>å$ÄIøÄIøò)üÃò)üÃMiCáMiC᪺µ¯ªºµ¯ –Ìd –Ìd+,vS+,vS§¼þJ§¼þJG®ôÓG®ôÓú×(~ú×(~¿eF¿eFYüdYüdÊD-WÊD-Wí@¨Áí@¨ÁNŸ×NŸ×ª—¯zª—¯z#v¦b#v¦b&‡:&‡:©åAB©åABMìë§Mìë§í·í·Ì¤«Ì¤«Y}=Y}=ºH@ëºH@ë÷¼·÷¼·=‡õ˜=‡õ˜¥Ï(Ý¥Ï(Ý>ä2>ä2L{ L{ ¼Ú>]¼Ú>]Z¸UZ¸UŵAŽÅµAŽ÷µw÷µwEãçEãç¦JÅT¦JÅT8Äc8Äc sÖv sÖvº(0Ϻ(0ÏYç‘GYç‘GÅÅè<ÅÅè<ù§ïù§ïCJä€CJ䀥ÝC¦¥ÝC¦>ÓiÄ>ÓiÄÿQ‚KÿQ‚KÂ{ÿÂ{ÿZOZOºe¤=ºe¤= ß” ß”4/†•4/†•§Æÿ§ÆÿMã|ÌMã|Ìå<;{å<;{Úé Úé RþàRþઘ- ª˜- ,¥HZ,¥HZŸì‚Ÿì‚·À|Å·À|ÅZÐÔZÐÔÀŠ aÀŠ a$ ×$ ×6~w6~w¨Š­¨Š­OéIOéIÞÙ®ÞÙ®äbFŸäbFŸLOüÐLOüЦ‡³‘¦‡³‘=Íjz=Íjzù÷|4ù÷|4ËÞŸEËÞŸEWÔmWÔm¬à“¬à“*ù|Â*ù|ÂÑÔ±ÑÔ±¼²È½¼²È½YÕá}YÕá}¶¯¯¶¯¯û}¥û}¥R6 R6 ³ˆ,1³ˆ,1Zn¸Zn¸¼\aÀ¼\aÀ <É <É&ˆ¬f&ˆ¬f°¯ác°¯ácXÕX·XÕX·À}ãxÀ}ãx ÞZ¢ ÞZ¢)f)f¯·û™¯·û™Yq.‘Yq.‘¾»·¾»·ZãZã$æcÿ$æcÿ²c“¹²c“¹ZÐ8JZÐ8J¸²è¸²èŽŽTËŽTËŽ»úÿD»úÿDX g†X g†²^S™²^S™(äÅ(äÅ ˆ ˆÅÍXÅÍXXe*Xe*¤ëP¤ëPB=ÄÌB=ÄÌêx^êx^äx,Èäx,ÈBÝVBÝV¬T ˬT ËHÓÊBHÓÊBÜ’(MÜ’(Misawav_2_8_44100.wav000066400000000000000000000531161225012771600344120ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFFVWAVEfmt D¬ˆXdata"V€€„ƒ‡ˆ‹Œ”“––ššŸ¢¡¥¥¨¨¬«¯¯²³µµ¸¸»¼¿¾ÁÁÄÃÆÆÉÈÊÊÍÌÏÎÑÑÒÒÔÔÔÕÖÕ×ÖØ×ØØØÙÚØÙÙÙÙÙÙØÙØØØ×××ÖÖÕÔÓÓÑÑÐÐÏÍÌÌÊÊÇÈÆÆÃÄÁÀ¾¾º»¸·µµ±²®®««§¨£¤Ÿ œ˜™••‘‘‰Š……}~zzvvrqmmijgfbc__[\WXTUPPMNJKGGDCBB>><<:967443310//-.++++**))()'''''''&&'('(())))**++-,..0032446688;;>=A@CCFGJILLPPSSVW[[^^bbfgjjnnrsvvyz~~‚‚††ŠŠ’‘––𙢠¤¤¨¨¬«¯¯²³¶µ¹¹»»¿¿ÁÁÄÄÇÆÉÉÊËÍÍÎÎÐÐÒÒÔÔÕÕÖÖ×רØÙÙÙÙÚÙÙÚÙÙÙÙÙÙØØÖ×ÖÖÕÔÓÓÒÒÐÑÏÎÌÌËËÇÈÅÅÂÃÀÀ¼½»º¸·´´±°­­©ª¥¦¢¢ŸŸ›š–—’“Š‹‡‡ƒ‚~z{wvrsonjjggcc``[[XWTTQPMMJJGGCD@A>=;;9967432100./--+,+*)*((('(''''''''&((()))**,,,-./1022446799<<>?BAECHFJKNNQPVUXY\\``ddhillqquuyy||†…‰‰Ž‘‘••˜˜¡ ¥¤¨©¬«¯°³³¶µ¹¹¼¼¿ÀÂÂÅÅÇÈÊÉÌÌÎÎÏÏÑÑÓÓÕÕÕÖ×××ØØØÙÙÙÙØÙÙÙÙÙÙÙרÖ×ÖÖÖÕÔÓÑÑÐÐÎÎÌÍÊÊÇÇÅÅÃÿ¿¼¼¹¹µ¶²²¯°«¬¨§£¤  œœ˜˜””‘Œˆˆ„ƒ€{|wxssonjlghbb^_[[XWSTPQMLIIGFCC@@==;:88652321//---,+*))()((''''(''(''('()))++,,-...00324577::<>AADDHHKKONRRVUZZ^_cbhgkkppttyy}}‚ƒ‡†‹Š”“˜˜œœ  ¤¥¨©¬¬°°³´¸·»»½½ÁÁÄÄÆÆÉÊÌÌÎÏÐÐÑÓÔÔÕÕ×ÖØØ×ØØÙÙÙÚÙØÙÙÙØÙØ×ÖÖÕÖÔÔÒÒÑÑÏÎÍÍÊÊÇÇÄž¾º¼··³´°°¬¬©©¥¤¡ ›œ˜˜““ŠŠ…†}}xxssoojjfgcb^]ZYUURQNNJKGFBC@@<=::67452301..-,+*))()(('''''&''('(()*)**+-,./01325588;:==A@DDGHJKOOSSWWZ[__ddiillrquuz{~„ƒˆ‡Œ‘••ššŸž££¦¦««¯®²²·¶¹º¼½ÁÀÃÃÆÆÉÉÌËÎÎÐÐÒÒÓÓÕÕÖ×ØØØÙØØÙÚÙÚÚÚÙÙÙØ×ØÖÖÕÕÔÓÒÒÐÐÍÎËËÈÈÆÆÃÃÀÀ¼½¹¹µµ±²­­©¨¥¥  ˜˜”“ŽŠŠ††||wxsronjjeeab\\YYTTPPLLHHDFBA>?;;88653311//--,,*+))(((('''&'&''(())**++-,./01326588:;>=BBDDHILLOQTTXX\\aaffjjnossxx}}‚‡‡‹‹”•š™ž¢¢¦¦ªª®®²²¶µ¹¹½½ÀÁÃÄÆÇÉÉÌËÎÎÐÐÒÒÔÔÕÖ×רØÙØÙÙÙÙÙÚÙÙÙÙר××ÕÕÔÓÒÓÑÑÏÎÌËÉÉÇÇÃÃÀÀ½¼ººµ¶²±®­ªª¥¦¡¡œ˜˜“”ŠŠ†…€€||wwrrmniidd_`[[WWRSNNKKGFCCA@<=::674422/0-.+,++*)))(''&''&&'((())**++--..10436588;CBFFJIMMQRUVZZ^_bcihlmqrwv|{€„…Љޓ’˜˜œœ¢¡¥¥©©®­²±µ¶¹¹¼½ÀÀÃÃÇÇÉÉËÌÏÏÐÑÒÓÔÔÖÖ××ØØØÙÙÙÚÙÙÚÙÙØØ×××ÖÕÕÓÓÑÒÎÐÌÍÊÊÇÇÄÅÁÁ¾½º»·¶²²®¯©ª¦¦¡¡œ˜˜““ŽŠŠ„…{{vurqlmhhcc^^ZZUUQRMMJIEFAB??;;98653311/.--++))((('(''&'&'(((((**+,--..11336698==::774522//.-+,**))(('(&(''(''')())**,,..01335689<;??CCFFJJOORSWW\\a`efjjpoutyz„„‰ˆŽ’’—˜œ¡¡¦¥ªª¯¯³³··»»¾¿ÂÂÅÆÉÈËÌÎÎÑÐÒÒÔÓÖÖÖ×ØØØØÙÙÙØÙÙØÙØØ×ØÖÕÔÕÒÓÐÏÎÎËÊÈÈÆÅÂÁ¿¾»º¶¶³²®®ªª¥¥¡ œœ——‘’‡‡‚ƒ~}xxssnnhidd`_[ZUVQRLMIIEE@A>>::773412//-.,+**))'('''''''''(()*),+--//214577::>=@ADDHHMNQQVUZZ__ddjionttyy~}ƒƒ‰ˆŽ“’—˜œ¡¡¦¦ªª¯®´³·¸»»¿¿ÃÂÆÇÉÉËÌÎÏÑÑÓÓÕÕÖÖ×רÙÙÙÙÙØÙÙÙØØ××ÖÖÕÕÔÓÑÑÎÏËËÉÊÆÆÂÿ¿»¼¸¶³²¯®©«¤¦  œ›——’’Œ‡‡‚||wwsrllhhcc^]ZYTTPOKLGHCC@?<<99653301./,,**)*))''''''('(()())++--/0114487::=>ABEDIINNRSWV[\``efkkppuu{|€……‹‹•”ššŸ ¤¤¨©­­±±·¶º¹¾¾ÂÁÆÅÈÈÌËÏÎÑÑÒÒÔÔÖÖØ×ÙØÙÙÙÙÙÙÙØØØ××ÖÖÔÔÓÓÑÐÎÍÌËÈÈÅÅÂÁ¾½¹¹µ¶±²¬¬¨¨££žžšš”“ŽŠ‰ƒ„~~yxttnniidd__ZYUUQQMLGGDD@@<<99653311.-,,**)(((&(&''&'''(()*+,,-.0/215588;<@@CCGGLLPPUTZZ_^ddiinnttyy~„„Љ””™™žŸ£¤¨¨­®²±·¶ºº¾¾ÂÂÅÅÈÉÌËÏÏÐÐÓÓÕÔÖÖ×רØÙÙØÙÙÙÙÙØÙÖÖÖÕÓÓÒÑÐÐÌÍÊÊÆÆÃÿ¿¼»¶·³³­®©©¥¤ Ÿšš””ŠŠ„„yytsoniidd^_ZZTUPPLKGHDB@><;88542200--++))))((('&'''(()()*++-,//124487:;>>BCFFKKOOUTYY^^cciimnttzy~…„ŠŠ••™šž ¤¤©ª®®²³··»»¿¿ÂÃÇÇÊËÍÌÏÐÑÑÔÕÖÖÖרØÙØÙÚÙÙØØÙØ×××ÖÔÔÑÒÐÐÍÍÊÊÆÇÄÃÀÀ¼¼··³²®®©©¤¤žŸšš””ŽŽŠ‰ƒƒ~}xxrslnghcc]]XXSSNNKJEDBA==::763401..,,*+)*(((('(''(''())*+,,..113477;;>>BCFFKLPPUTZZ^^dcjjoout{{€€†…‹‹‘‘——œœ¢¡¦¦¬¬°°µ¶¹¹½¾ÂÁÅÅÈÈÌËÏÏÒÐÓÓÕÕÖ×ØØØØÙÙÙÚØÙØØ××ÖÖÔÕÒÒÐÐÍÎÊÊÇÇÃÿÀ»»··²±­®©©££žž™˜““‡‡‚||vvqqkkfe``[[VVQPLLGGCC??;:775422//--***)((((&'''('(())*+,,./214587;:??BCGGKLPPUU[Z``eekkqpvw||ƒ‡ˆŽŽ““˜˜žŸ£¤¨©¯­³³··¼¼ÀÀÃÄÇÇËËÍÎÑÑÓÓÔÕÖÖ×רØÚÙÚÚÙÙØÙ×××ÕÕÕÒÒÐÐÍÍÊÉÇÇÃÿ¾»»¶¶±±­¬¨§¢¢œœ——‘‘‹Œ††€€zzttnohhcb]^XXSSNNIJEDA@<=985631//--+,**(('''&'''')'))**--//104478:;>?CDGGLLQQUV[[aagglmrsyx~…„Š‹––››¡¡¦¦««°±¶µº¹¾¾ÂÂÆÇÊÊÍÍÐÏÒÒÔÔÖÖØØØÙÙÙÙÙÙÙÙØ×ØÖ×ÔÕÒÓÐÏÎÍÊÊÆÇ¿¿ººµ¶°°««¦§¡¢›œ•–ŠŠ…„~~xxqrllgfa`[\VVPPKKFFCB?>::773400..+,**))((''''&&((()*++,./104467;:>?CBHHMLRRVW\]bbhhnnttyz€††‹Œ’‘˜˜ž¢£¨¨®®³³··¼¼ÁÀÄÅÉÈËÌÏÏÒÑÔÓÖÕ××ØØØÙÚÙÙØÙÙØØÖÖÕÔÓÒÑÑÎÎÊÊÇÇÃþ¿ººµµ±°¬«¦¥¡ ›š”•ˆˆ‚ƒ||wvppjjdd_^XYSTNOJIEE@@<<995522/.,-*+))''''&''''()(+*+,..113377::>>CCGGLKQRWV]]bbihnntt{z€†‡Ž““™™žŸ¥¤ª©°¯´³¸¹¾½ÂÁÆÅÉÉÍÌÐÐÒÒÕÔ×××רÙÙÙÙÙÚØØÙØ×ÕÖÔÓÑÑÎÏËËÈÇÄÿ¿»»·¶±±¬­§§¡ ››•”ˆ‰‚ƒ||wvoqjjdd^^YXSSMNIHDD??::764311..,,))))''&'&'''((*)+*-,//3255:8<=ABFFKKPQUV\\aaggmnttzz€€††Œ“’™˜žŸ¥¥ªª¯¯µµº¹¿¾ÂÃÇÆËÊÍÍÑÑÒÓÕÕ×ÖØ×ÙÙÙÚÙÚØÙרÖÖÕÔÒÒÐÏÍÍÉÉÆÅÁÁ½½·¸³³®®©©£¢œ——‘‘ŠŠ„„~}wwqpjked^_YYSSMNHIDC??<;763300..+,**()('''&'('(()*+,.-003376;:??CDHINNSSXY^_ddkjqqvw~~…„‹‹‘‘——žž¤£¨©®¯´´¸¹¾¾ÂÂÆÆÊÊÍÍÏÐÓÓÖÕ××ØØØÙÙÙÙÙÙØ×ØÖÖÔÔÒÒÐÏÌËÉÈÄÄÀÀ»»¶·²±«¬¦§Ÿ ›š””އ‡z{uumnghaa[[UVPPKJFE@A;=894421//,+**))(('&'&'')()*++.-014378;:?>DDIHNNSSYZ__ffllrsyz€€…†Œ““™šŸ ¥¥««°°¶¶»»¿¿ÄÄÈÈÌËÏÎÑÒÔÕÖÖרÙÙÙÚÙÙÙÙÙ×Ö×ÕÕÒÒÐÏÍÍÉÉÆÅÁÁ¼»··²²¬­§¥ ¡šš””ކ‡€€zyssmlffa_ZYTTNNIIDD??;;773400.-++)*((''''''(()(*+,,//236599>>ACGHMMRRWW_^edkkqqxw……ŒŒ’“™™Ÿ ¥¥««±±¶·»»ÀÀÄÅÈÈÍÍÐÐÓÒÕÔÖר×ÙÙÙÙÚÙÙØ×ØÖÖÔÔÒÑÎÏËËÇÇÃÄ¿¾¹¹µµ®¯©©¤£œ——Љ‚ƒ|{uvonghba\\UUOPJJEEA?;<874311.-++))(('(&'''(())*+--/03266::>>DCIHNNSSZY``gfmntuz{‚ˆˆ––œ¢¡¨©¯®³´¹¹¿¾ÃÃÇÈËËÎÏÑÒÕÔÖÕØØÙØÙÚÚÙÙÙØ×ÕÖÔÕÒÒÏÏËËÈÈÃÿ¾º¹´´®¯©¨¢¢œœ––ˆˆ{{ttmlgg`_ZZTTNNHHCD?=9:6632/.-,+)()((('''('))**,+..115598==ABHFMMSSXY__eelksszzˆˆŽ–•›œ¢¡©¨®¯³´¹¹¿¿ÃÄÇÈËËÎÏÒÑÔÔ×ÖרÙÙÚØÙØÙÙØØÖÖÓÔÒÑÎÍÊÊÆÆÁÁ¼¼¸·²²¬¬¦¦ŸŸ™˜’‘Œ‹…„}}wvpohibc\\VUPOIIED??;:663300--+*()(''&''((()**,+//2165:9>>BCGHNNTSZY``ggnntu{|ƒ‚ŠŠ—˜ž¥¤««±°¶·»½ÁÀÅÅÉÊÍÎÐÑÓÓÕÖ×רØÚÙÚÚØØØØÖÖÓÕÒÒÎÎËËÇÆÃ½½¸¸²²¬­¦¦  ˜š’’‹‹„„}}vunohhaa[ZUUNOHJDD?>:96622//,-**)('''''''()*+*--003378<;A@FEKKQQWX]^edllrsyy€ˆ‡––œœ££ª©°°µ¶»»ÀÀÆÅÊÈÍÍÐÑÔÓÕÖ××ØØØÙÙÙØØ×××ÖÔÔÑÑÎÎÊÊÆÆÂÁ¼¼··±±«ª¥¤žž–—‰ˆ‚‚{zssllee^^XXRQLLFFAA<;883300--+*()'('(&&(')(*+,-0/3277;:?@DDJJPQWX^^ddllrr{z€‰‰–—ž¤¤ª«±°·¶¼½ÁÁÅÅËÊÎÎÐÑÔÔÖ֨רÙÙÚÙÙØØ××ÖÔÒÒÐÐÌÌÈÈÃľ¿º¹´³­®§§  ™™’’‹‹„„}}uumngga`YYSRMNFGBA<;784400--++))(''&('('))**,-/04387;;AAFEKLRRYX^_ffmmtu||ƒ„Š‹’’™™  §¦­®³³¹¹¿¾ÃÃÉÈËÍÏÐÒÓÔÕרÙÙÙÙÙÚÙÙØØÕÖÔÔÑÑÍÍÉÉÅÄ¿¿º»µµ®®©§¡¢šš“”‹‹„…}}utmngg`_ZZSSLLFGBA;<773400--+*)(('&''''()*++..014598>=CCHGONUU\\cciiqqyy€€‡ˆ––žž¥¤««±±··½¾ÂÂÈÇËËÏÏÓÓÖÕÖרØÚØÙÙÙÙØØÖÖÔÔÑÐÍÎÈÉÅÅÀÀº»´´¯­§§ ¡š™‘’‹‹ƒ„{|ttllee__XXQQKJEE??::6622./,,*)()''&''()(**,,//2377;>994510--+*))'((&'''')(++/.1266;:??EEKKRQXY``ggnowv~††––ž¤¥««²²¸¸¾¾ÄÄÈÈÌÍÐÐÔÔÕÕØ×ÙÙÙÙÙØØØ××ÔÔÒÐÎÎÉÈÄÄ¿¿¹¹²²¬¬¥¥ž–—‡‡wwoohh``YYQRLKEE??::5522..++))(('&&'(()),+..1155;:??EFLKRRYYaaihopwx€€ˆˆ——ŸŸ¦¦­­´´ºº¿¿ÅÅÊÊÎÎÒÒÔÕ×רÙÙÙÙÙÙÙ××ÕÕÒÒÏÏËÌÆÇÁ»¼µµ¯¯¨¨ ¡™™‘‘ŠŠ‚zzqqiiaaZ[SSLLFF@@:;6621/.+,))''''''(())++..2256;;?@FELMSSZZbcijqqzzŠŠ’’™š¡¡©¨°¯¶·¼¼ÂÂÈÇËÌÏÏÓÒÖÕØØÙÙÙÚÙÙØØÖÖÓÔÑÑÍÍÈÉÃþ¾·¸±²ª«£¢šœ“”‹‹ƒƒ{zsskkcd[\TTMMGGAA;;7621/.+,))'''&'&(()),+./2377;<8823/0,,)*('''&&(')),+//3387==DCJKPQXY``ihqqyy‚‚Š‹’“›œ¤£««²³¹¸¿¿ÅÅÊÉÎÎÒÒÕÖ×רØÚÚÙÚרÖÖÓÓÐÐÌËÇÆÁÁº»´³­­¦¥••Œƒƒ{{rrjjbbYZQRKKED=>894400-,**'((&'(('**,,//2377==CCJJPRYYaaijqr{{„ƒŒŒ”•œ¤¥­¬³´»»ÁÁÇÇËËÏÐÓÓÖÕØ×ÙÙÚÙØÙרÖÕÒÓÎÎÉÊÃľ¾··±°©¨¡¡˜™‡ˆ~vvnmee]\UULMFG@@:;5501--++(((''&'')(++..3378==BCJJPQXX`aijrr{{ƒ„Œ••ž¥¦®­´´¼¼ÁÂÈÈÌÌÐÑÔÔ×רØÙÚÚÙÙØÖ×ÔÔÑÐÌÌÈÇÁ»»¶´­­¥¥••ŒŒ„„{{rriia`WXQQJJBC=<7722-/++*(''&'''()+*.-1166<>8833/0++))'''&''()++--2267<=8832//*+))'''''((),+..2378>=DDKKSS[[ednmww€€‰Š’’œ›¤¤­¬´µ»»ÂÂÈÇÍÍÒÑÕÕ××ÙÙÙÙØØ×ØÕÕÒÒÎÎÈÉÃü¼µµ­®¦¦œœ””ŠŠ€wxnnee\]TTLLEE>>8834//++()''&'''))++..3389>>DEMMTT\]eennxx‚‚ŠŠ•”ž¦¥®®µ¶½¼ÄÄÉÊÎÏÓÒÖÕרÙÙÙÙÙØ×ÖÔÓÐÐÌÌÆÆ¿Á¹º²±©ª¡¡˜˜ŽŽ……{|ssii`aWXOOHH@A:;5601-,)*('&'''((*+-.2277=>8823..++)(''&&'')),,0055;:A@HHPPYXbajjtt~~‡‡‘‘šš¢£««´´»¼ÂÂÈÈÍÍÒÒÕÕ××ÙÙÙÙØØ××ÔÔÑÏËËÆÆ¾¿¸¸°°¨§ŸŸ••‹Œ‚ƒyxnofe\]STLLCD=>7631.-*+((''&'((**--1275<=DDLLUT^^hhrs}}†‡‘‘››¥¤­­¶¶¾¾ÅÄËËÑÏÓÔ×רÙÙÙÙÙרÔÔÐÏËÊÅž½µ·­®¤¤››‘‡‡|}rrhh^^UTLLCD<<6611--)*'(''''))+,0044;;BBJIRS\[eeppzz…„Ž˜™¢£¬«µµ¼½ÃÄÊÊÏÏÔÔ×רÙÙÙÙÚ××ÔÔÏÐËËÅž¾µµ­­¤¤šš…†|{qqgg\\TTKKCC;;5600,,))''''((**,,2177==DELMVV__iits~‰Š““¦§°°¸¹ÀÀÇÇÍÍÒÒÕÕרÙÙÚÙØØÕÖÒÒÍÎÇÈÁÀ¸¸°±¦§œž““‰‰~~stji`_VUMMEE==6612-,))'''''')*,-0066=6601,,*)'(''((**.-1298@>HGPPZZddooyz……‘šš¥¤®¯·¸ÀÀÆÆÍÌÑÒÖÖרÙÚØÚ××ÕÕÐÐËÌÄĽ¼´´«« ¡––‹Œuujj`_VVLLDD<<6500,,*)''''((+*//43:9ABJJRT]]hgss~~‰ˆ”“žž¨¨²±»»ÂÃÉÊÏÏÔÔ×רÙÙÙÙØÖÖÒÒÍÍÇÇÀÀ¹¸¯¯¥¤šš„„yynndcYYPOGG>?8721-,))'''('(**..2399?@IHRR\\gfrq}}ˆ‡““œž¨§²²»ºÂÂÉÉÎÏÔÔ××ÙÙÙÙÙØÖ×ÒÒÍÎÇÇ¿¿··®®¤¤š™Žƒ‚xwllbaWXNMDE<=6600+,))''''((**/.55;;CCLMUV_`kjvv‚——£¢¬­¶µ¾¿ÆÆÍÌÒÒÕÖרÚÙØØ×ØÓÔÏÐÉÊúº±±§§‘‘‡‡{|oodeZZPQHG?>7712-,))'('''(**/.34;:BBJJTT_^jjuu€‹˜—¢¢­¬¶µ¿¿ÆÆÍÍÑÒÖÖØØÙÙÙØÖ×ÓÔÏÎÉÈÁÁ¹¹°¯¥¥››„…xynlabWXMMDD<=55/0,+))''''((+,1166==EENNXYcdonzz††‘‘œœ§¨²±º»ÃÃÊÊÐÐÔÔØØÙÙÙÙØ×ÕÕÐÑËÊÄû¼³²©¨žŸ““‡‡||podeZZPOFF>>7601,,))'''')(++0/56<=EDNNYWccnoyz†…‘’œ¨§±²ººÃÂÊÊÑÏÕÕØØÙÙØÙØ×ÕÔÐÐÊÊÃú»±°§§œ›‘……yynnabWWMNDD;<45//**('&&'')*--1288?@HIRR]\ggst€€ŒŒ——¢¢­¬·¶¿ÀÇÆÍÎÓÓÖ×ØØØÙØØÖÕÑÑÍÍÆÆ½½µ´ªªŸŸ””‰‰}}ppeeYZPOFF==660/,+)('''()),,1177>?HGRQ\\ggss~‹Š–—¢¢¬­¶¶¿¿ÇÇÎÎÓÓÖÖØÙÚÙØØÖÖÒÑËËÄż¼³³¨©žž’“††zznnbbXWMMDC;<55..*+((''('))--3299BBKLUU``kkwwƒ„››¦§±±»ºÄÄÊËÐÐÖÕØ×ÙÙØÙÖ×ÓÓÎÎÈÇ¿À¶·­­¡¢—–ŠŠ~~rrff[[QQGF>=66/0+,((''&((),,2288@@JJSS__jjww‚ƒŽ›š§¦°°ººÃÃËËÐÑÕÕØØØÙÙÙ×ÖÓÔÎÍÇÈ¿¿¶¶¬¬¡¡••Љ}|qqeeYYOODE<<55/0+*)''&(')+..33;;CCMLWWccon{{††”“ŸŸªª´´½¾ÇÆÌÍÒÓÖרØÙÙÙÙÕÕÑÑËËÃĺº°±§¥ššŽ‚‚vwjj^_SRHH@?8820,,))&''')),-2278@@JJTT_`kkww„ƒ‘œ¨§³³½½ÅÅÌÌÒÒÖÖÙØÙÙØØÖÕÒÑËËÄû»±²¦§››ŽŽ‚uvhi]]RRHH?>7711,+)('&''*).-32::BBKKVVbbnn{z†‡”“  «ªµµ¿¾ÇÆÍÍÓÓÖ×ÙØÚÙרÔÕÏÏÉÉÀÁ¸·®­¢¢–•‰Š||qpdcXYNMDC;;33..**((&'((++0077>?GHQR]]ijvvƒƒ›œ¨§³²½¼ÄÅÌÌÒÒÖÖÙØØÙØØÔÕÐÐÊɹ¹¯¯££—˜‹‹}~rqeeYYNODD;;44./**'''&)(+*/076?>GIRS__jjww„„‘ž©©³´¾½ÆÆÌÎÓÓÖ×ÙØØÙØ×ÔÔÏÏÈÉÀÀ·¶¬¬¡ ”“‡‡zznmaaUVKKAA9812-,()&''')(-.33:9CCMMWWdcqq~~‰Š––££¯®¹¹ÂÂÊÊÑÑÕÖÙØÙÙÙÙÕÕÒÒËËÃĺº°°¤¤˜˜‹Œ~}rqeeXYNNDD::32.-)*'''&((-,2299AAKKVWbbon||‰‰––¢£­®¸¹ÁÁÉÊÐÐÕÕÙ×ÙÙØØÖÖÑÑËËÃù¹¯¯££——ŠŠ}|poccWWLKBA9922,-()&(('))--43;;DDMMYYeess€šš¦¦±²¼»ÅÅÍÌÒÒÖÖÙÙÙØ×ØÕÔÏÎÇǾ¿µµª©‘‘„„vvjj]\QQFG<=45/.**('(')(,,1188@AJJVUabno{|‰Š––££®®¹¹ÃÃËËÑÑÖÖØÙÙÚØØÔÕÏÐÉÈÁÁ·¶«¬ Ÿ““†…xxkk^^RRGG>=55//**('''()++1178@@JJVUbboo|}‹Š——¤£°°ººÄÃËÌÒÒ×ÖØÙÙÙ××ÓÔÏÎÇÇ¿¿´´©©œ‚ttgfZ[ONDD;:33-.*)''''()-,33<;EEON[\hgtu‚‚©ªµµ¿¿ÇÈÎÎÔÕØØÙÙØÙÖÖÐÑÊÊÂø¸­­¡¡””††yzkk^^SSHG=>54/.++'''&)(,+2199BBMLXXderr€€ŽŽ››¨§´³¾½ÇÇÏÏÔÔØØÙÚØØÖÖÑÒËËÂù¹®­¢¢”•‡†yykk^^RRGF<=54/.*)(''()(--32::DCNOZZgguu‚‚‘žžª«¶¶À¿ÉÉÐÐÖÖרÚÚØØÕÕÐÏÈÉ¿Áµµ©©‚ttgfZZMNBC9922-,(('''(**0/56>?IIUTa`on|}ŠŠ˜—¥¥°°¼¼ÆÅÍÎÓÓ××ÚÙØØÖÖÒÒËËÂù¸­­¡¡””††xxjj]]PPEE;<33.-))'''')*..55==GGSS_`mm{{‰ˆ––££°°»»ÅÅÍÍÓÓרÙÚÙÙÖ×ÒÒËËÂø¸­­¡ “’„…wwii\\OPDE;;22,,))''''+*//65?>IIUUbbpo}~Œ™™§§³³¾¾ÈÈÏÎÔÔØØÚÚØØÕÖÐÏÈÈ¿¿´µ¨©››€qqccVVJK@@7700**''(&)),,23;;ECOO]]jjxx††•”¡¡¯®»»ÃÄÌÍÓÓ×ØÙØÙÙÖÖÒÒËÊÂø¸¬¬ŸŸ‘’ƒ‚utfgZZMMBB8801++'(''((,,1299DCNN[[ihww……““¡¡­¯¹¹ÄÃÍÌÒÓÖ×ÙÙÙÙÖÖÒÒËË÷¶««žžƒtseeXXLLA@7700*+'(''(),,33:;EFRQ^^kkz{ˆ‰—˜¤¥±±½¼ÆÇÏÎÔÔØØÙÙÙÙÖÖÐÏÈǾ¾³³¦¦™™ŠŠ||mm_`SRGF<=34--(*''((**//68@AJKWXeett‚‚‘žŸ¬¬¸·ÂÂËËÒÒ×ÖÙØØØÖÖÑÒÊÊÁÁ¶¶«ªŽ€qrccVVJJ?>56//**'''(*)./56>>IJVVdcrq€€««··ÂÂËËÒÒÖÖÙÙÙÙÖ×ÑÑÊʶ¶ªªœŽŽpqbbTUHI>>55./))'(('**0/66A@LKXXffutƒƒ“’  ®®º¹ÄÄÌÌÓÓ××ÙÙØÙÕÕÐÐÈȾ¾²³¦¦˜˜‰‰z{kk^^OPDD::12-,((''((,-22;;EEQQ_^mm{|‹‹™™§¦´µ¿ÀÈÈÑÑÕÕÙØÙØ××ÒÓËÌø·«ªŽŽqqcbTTHH<=44--)(&'''+*1189BBNN[[ijxyˆˆ—–¥¤±±½½ÇÈÐÐÖÖÙÙÙÙØ×ÓÓÌÌÃø¸««Ÿž€€qrbcTUHG==34,.))'&'(,+1189CCOO]]klzyЉ™˜¦§³³¿¿ÉÉÑÑ×ÖÙÙÙØÖÖÑÒÊËÁ¶¶¨©››‹Œ|}nm__PQDE;:22,,)(''((--33<>54--*)'&'(*,11::DDQQ__oo~ŽŽž¬«¸¸ÃÃÍÍÓÓØØÚÙØ×ÔÔÍÍÅĹº¬¬žŽ€nn``RSEE;;22,+'(''))--55?>KJYXgfvv†‡•–¤¥³²¿¿ÈÉÐÐÖÖÙÙÙÙÕÖÐÐÉɾ¾±±¤£””……uuffVWII==44-,(('((),-33==HHTUcctsƒ‚““£¢°°¼¼ÇÇÐÏÕÕÙØÚÙ×ÖÑÑÉÊ¿¿³²¥¥•–†…vvffWWII>>44--()'&'(-,33==34,-(('&))//78BCQP`_pp‚‚’’£¢²±À¿ÉÊÒÓ××ÙÙרÔÔËËÁÀ³´¥¥••„„ssbbRREE990/**'(((+,33=>33,,')&(*)/098EDSSbbst†…–—§§µ·ÃÃÌÍÕÕØØÙÙÖÖÏÐÇÇ»¼¬­ŒŒzzhhXYII<=33++('''+*11:;GGVUeewv‰ˆššª«¸¹ÅÆÎÏÖÖÙÙÙØÕÔÍÎÄÄ··©¨˜˜‡†utdcSTEE9800**&'((,-44??LM\[lm~~¡¢±±¾¿ÊÉÒÓØ×ÚÚרÓÒÊʾ¾°° ¡}~kk[[KL?>33,,'(''**11::GFVUefxx‰‰›š«ªº¹ÆÆÐÐÖÖÙÙØØÕÔÍ͵´¥¦•”‚‚pp__OOAA66-.((''))..89DDRRcbtt††˜˜¨©¸¸ÅÄÏÏÕÕÙÙÙÙÕÔÍÍÃö¶¦¦–•„ƒpq``PPBA66.-()&&))..88DDRRcduu†‡™™©ª¸¹ÅÆÏÏÖÕÙÚÙÙÕÔÍÍÁ³´¤¤’“oo^]MM@?45,-'(('**10;;GGVWggzzŒ‹®­¼¼ÉÉÒÒ××ÙÙרÒÓÉɽ¾°¯ŸžŒzzihWWHH;;11**'('(,,44?@MM]]po””¥¥¶¶ÃÂÍÍÕÔÙÙØÙÕÕÎÍÄͶ§¦•–ƒƒpp__OO@A46,,(('&**01::HHWWhh{{ŒŸ °¯¿¾ÊËÒÓ×ÙÙÙ×ÖÐÐÆÇºº«ª™šˆ‡uucbRRCC67//()''*)/098EETTefxx‹‹®­½½ÈÉÒÑØ×ÙÙØ×ÑÑÇÈ»»¬¬›šˆ‰vvddRRDC88/.(((&))0099FFUUfgyyŒ‹ž¯¯½¾ÉÊÒÓØØÙÙ×ÖÑÑÆÆº¹ªª™˜†…ssaaOPBA65--'(''**12;>ML]^qq„„——©©º¹ÇÇÒÒ××ÙÙÖ×ÐÐÇÆ¸¸§¨••‚‚mn[[JK<<11*)'&)(-/78EEUVgg{{ŽŽ¢¢²³ÁÁÎÍÔÕÙØØØÔÔËʾ¾®®œœ‰ŠuubbPPBB54,+('((,,44A@PObbuu‰‰œ¯®¾½ÊËÔÔØÙÙÙÖÕÍÍÁ²² ¡yygfSTCD76.-(('(++32>>NM__sr…†šš¬¬¼¼ÉÈÓÓØÙÙÙÕÖÍͳ³¢¡ŽŽzygfTSDE77.-((''*+32??NM_`ssˆ‡››­­½½ÊÊÔÓÙÙÙÙÕÔÍÌÀÁ±²ŸŸ‹‹xxddQQBB55,,(('',-54AAQQccxxŒ‹žŸ±±ÁÁÌÍÕÕØÙÙÙÒÓÊɽ½«¬š™††rr^_MM>=22*)''()..89GFWWkj““¦¦¸·ÆÆÐÐÖ×ÙÙ××ÐÏÄͶ¤¥‘‘}}ihVUFD77.-(('&++33?@OObbvv‰Š°¯À¿ÌÌÕÕØÚØØÓÓÉÊ»¼«¬™™„„pp\\KK;<10**''()00;;JJ\\oo„„˜˜¬«¼¼ÊÊÓÔÙØÙÙÔÕÌË¿¿¯¯œˆˆut``NN?>22+*''((/.99HGYYlm‚••©©ººÈÈÓÒÙ×ÚÙÖÕÍÍÀÀ±±žž‹ŠuuaaPO?>33*+('()..89GGYZnl‚‚•–©©º»ÈÉÒÒØØÙÙÕÔÌÌÀ¿®¯œ‡ˆrs`_MN=>12*)(&))00;:KI]]pp……™š­®½¾ËËÕÔÙØÙØÔÓÊʼ»«ª—˜‚‚nmYZHH:9..((&'*+43@?QOccwxŒ¡ ´³ÃÂÏÎ×ÖÙÙÖ×ÐÑÄĵ¶££zzeeQQAA54**''((..88FFXYmm‚––ªª¼¼ÊÉÓÓØØÙÙÓÓËʼ¼¬¬—˜ƒƒnnZZHH98/.((('*+44AAQQeezz¤¤¶µÅÅÑÑ××ÙÙÕ×ÎÍÁÁ±±ž‰‰tt__LM=<11))''))11==NN`auv‹‹  ²³ÂÂÏÎÖÖÙÚÖ×ÏÏÃô´¡ ŒvvabOO>?22**&'))10<>12)*'&**21>>OOccxy£¤¶¶ÆÆÑÑØØÚÚÕÔË̽½«¬—–‚klWWED66,,''((--99IH[[qq‡‡œœ°±ÂÁÎÏ×ÖÙÚ××ÎÎÂÁ°±‡‡rr\\II::..(('(,,66EEWVml‚ƒ˜˜­¬¾¾ÌÌÕÕÙÙØØÑÐÄÄ´´  ŠŠtu_^KL;://))''+,65CCVVjj€——««½¾ÌÌÕÕØÚØØÑÐÄij´Ÿ ‹‹tt__KJ;;//((('++55DDWVlk‚‚˜™­­¿ÀÍÍÕÕÙÙØØÏÏÃò±ž‡ˆqq[[HH99-.((('-.88GH[Zpp‡†žœ²±ÂÂÏÏØ×ÙÙÖÕÍο¿¬­˜™kkVVCC55+*&')(00<>PQgg~}•–¬¬¾¿ÍÌÖÖÙÙÕÖÍ̽¿«¬•”~}ffPP>>00()'',+66GFZZqqЉ  µ´ÆÇÓÓÙØØÙÓ񮮵µ ŸˆˆqpZ[EE65,+(&)(11??QRhh——­®ÀÀÎÎ×ÖÚÙÕÕË̼¼¨§‘‘zybaLL;;..'('(..::KK``xx§§º»ËÊÕÕÙÙרÎÏÀÀ­­–—~ggQR?>11)(''-,77HH\\ts‹Œ£¤¸¸ÉÉÓÓÙÙØ×ÐÏÂÁ¯°™š‚jiTS@?21))'',,66GFZ[rrŠ‹¢¢·¶ÈÈÔÔÙØØ×Ðа±šš‚ijSRA@12))'&,+67GG[[ssŒ‹¤£¸¸ÈÉÔÔÙÙרÏÐÁÀ®­˜—€fgQQ=>0/((''--98JJ__ww§§¼»ËËÖÖÙÙÕÖÍͽ½ª©’’yzaaLK:;/-'(((0/=>00()''.-:;MNdd}}––­­ÂÁÐÐ×רÙÓÓÅų³œœƒƒjjRR>>10')('./<;NNee——¯¯ÃÂÑÑØØÙÙÑÑÅı±ššggPQ==./((((0/>=PQhi‚››³²ÅÅÒÒÙÙØ×ÐÐÁÁ­­••{|bcLL::,,&(()21AAVUonˆˆ¡ ·¸ÉÈÔÕÚÙÖÖÌÍ»»¦§ŽŽtu[\FF55+*''++66HG^^ww‘‘©©¾¾ÎÎ×רÙÓÓÇÆ´´„ƒjjRR??//((((//>=PPiiƒƒœ´´ÆÆÓÒÙÙ××ÎÍ¿¿©©‘vw]]GG66++''++66GH^]vw‘©ª¾¿ÎÏØ×ÙØÒӯŲ³››€‚hhOP<<..('))11@AUUmmˆˆ¡¡¸·ÉÉÕÔÙÚÕÖËʹ¹££‰‰ooVVAA11((''..<;POfg‚œ›³²ÅÆÓÓØÙ××Îͼ¼¨§ut[ZEE44)*'',,98LLcc~}——¯¯ÃÃÑÒØØ×ØÎÏ¿Àª©’’ww]]GG56++'(,,77JJba{|––®®ÂÂÒÑØØØ×ÏÐÀÀ««’’ww^]GG65*+''+,89JKbb}|—–¯¯ÄÄÒÑØÙרÏϾ¿©©vu\[FE44)*'',,9:LMee€€›š³²ÅÆÔÔÚÙÖ×ÌÍ»¼¥¥‹ŒqpWWAA11))'(..==RRkk†…  ·¸ÊÉÕÕÙÙÕÕÈÈ·¶žž…„iiQP;<..''()23CCZZssލ¨¾¾ÏÎרØÙÒÒÃ•zz``HH65+*'&,+98LLdc~šš²²ÆÆÓÓÚØ××Ì̺º££‰ŠmnTT>>/0('()11AAWWqqŒŒ§¦½¾ÎÍØ×ÙÙÒÒÄᮕ•zz_`GG54**&&,,9:NNfe‚œœ´µÈÈÔÕÙÙÖÕÉÊ··ŸŸ…„hiPO;:,-''))45FF]]xx””®­ÃÂÒÑØÙ××Î¦ŒŒpoVU@@0/(')(11AAWWrq¨§¾¾ÎÏØ×ÙØÑÑÁÀ««‘uvYZCD22()((//>?TTnn‰Š¥¥¼»ÍÎØ×ØÙÒÒÃí­””ww]\FF33))'&.-==RSllˆ‡£¤»»ÌÍ××ÙØÒÒÃî®””yx\]EE43))'(..==SSmm‰‰¥¤¼¼ÍÍ×רØÑÒ¬¬‘’vv[ZCC22((''/0@@WUpq§¨¾¿ÏÏØÙØØÏп¿¨©qqVV?@/0((((21CD\[vv’“¬­ÃÃÒÒÙÙ××Ì̺º¡¢‡†jjPP;;--&'**66JIbc~~›š´´ÈÈÕÕÙÚÔÕÇȲ²™™|}aaHH55*)'(-.==SRmm‰‰¥¤¼¼ÎÎ×רØÐÑ¿¿¨©qqVV@?//('))44FE^^zy——±±ÆÅÔÔÙÙÕÕÈɵµ››bcJI56**''.-<.-(')*56IHab~ššµ´ÉÉÖÕÙÙÔÓÆÆ¯°•”xx\\DD22))((10BBZZuv“’®­ÃÃÓÓÙÚÖÖÊɶ¶œœdcJI65+*''-.>=TTooŒ¨¨ÀÀÐÐØØ××Ì̺º¡¡„…hgNM98++'(,-;:QQkk‰‰¤¤½½ÏÏÙØØØÎμ¼¤¤ˆˆkjPP:9+,'&+,9:OOjiˆ‡¤¤»½ÎÎØ×ÙÙÏϼ½¥¤ˆ‰kkPP;:,,''+,99NOijˆ‡£¤½½ÎÎ×ØØØÏμ¼¢¤†‡iiON99++'',-;>UUsr««ÃÂÒÓÙÚÖÖÉɵµ™š||_^FE33((('12DC]\zz˜—³²ÈÇÕÕÙÙÓÔÄÄ­­‘‘ssVW??..''**66JKff„ƒ¡¡ººÍÍ×ØØØÏ커£††hgMM88**'&-->=UUqr¬¬ÃÄÓÒÙÙÕÕÈȲ²—–yx\[BC11((()43GHbbžž¸¸ÌË××ÙØÏо½¤¤ˆ‡jjMN87++''--=>VUrr‘­®ÅÅÓÓÚÙÕÕÇÆ°°“”vvYX@@/.''**66LLgg†…££½¼ÏÏÙ×××Ì̸¹žžbbGG34))('12CD^^||››¶¶ÊËÖ×ÙÙÑÑ¿¿¥¦ˆ‡jiML77**((/.??XXuu””°°ÆÇÕÕØÚÓÒÂ꫎ŽpoQR:<,,'',-<;SSpp¬¬ÄÄÔÔÙÙÓÕÅÆ®®‘‘srUU==-.'',,::QQnnªªÂÃÒÒÙÙÔÖÆÆ°¯““ttVV>>--'&,+9:QPmmªªÂÂÓÓÙÙÕÕÇÆ¯¯’“stVV==,-'&++::RQnoŽŽ¬¬ÅÄÓÓÚÚÔÔÅÅ­­pqSS;;,,(',,=>-,''..A@\[{|œº¹ÏÎÙÙ×ÖÈǰ¯ooPP88**'(12GGde†…¦¦ÁÁÓÒÚÚÔÓÀ§¦……eeGH22'(**88PQoq’‘±±ÉÉ×רØÍÍ·¸ššyyXX>=,,&'./AA\\}}Ÿ ¼¼ÐÐÙÙÕÔÆÅ¬«‹‹jjKK45'(()56MMllŽ®®ÆÇÖÖÙØÏϹºœ›z{YZ>>,,''..AA]\~~ŸŸ¼¼ÑÑÙÙÕÕÄŪª‰ŠhhJI33'(**78QPpp’’²±ÉÊØ×ØØÌÌ´¶—–utUT::+*'(20GFde††¨§ÂÂÔÓÙÙÑÒ¾½ ¡€^^AB..&'-,??[[|{žž¼»ÑÏÙÙÔÕÅÄ©©‰‰ffHH12('**99SStu•–µµËÌÙÙ××Éɯ°nmNM56)())66NNnm‘°±ÉÉ×רØÌÌ´´••rrRR88)*('43JJii¬®ÇÇÖÖÙÙÎÍ··˜˜uuUU9:*+'(22IHggЉ««ÅÆÖÖÙÙÎϸ¹™™wvUV:;++((21IIgh‹‰«ªÅÅÕÖÙÙÎϸ¸˜™vwUU::*+('22IJhh‹‹¬¬ÇÇÖ×ÙØÎͶ·——stRS88)*'(54KKll¯¯ÉÉÖØØ×Ë̲²’“poNO55))))77PPpp””´´ÌÌØØ×ÖÈÇ­­ŒŒhjII32('++;;WVxy››ººÐÐØÙÔÔ§¦„ƒaaCB./''.-AA__‚‚¤¤ÀÁÔÔÙÙÐл¼œœyyWW<;+*('22JIji¯®ÈÉ×רØÊ˱²‘lmLL44''))::TUwwš›º¹ÐÏÙØÔÕÂÂ¥¦ƒ‚__AA--''./CCbb…†¨¨ÄÄÕÖÙÙÎη¶––rsQQ78))()67QQrr––·¶ÎÍØÚÕÕÄç§…„`bCC..'(..CDbb††©©ÄÅÕÕÙÙÌ͵µ””ppON65((*)99SUwvš›»ºÐÐØÙÓÓÀÀ£¡Z[>=+,((11IIjiޝ°ÉÊ×ר×ÈÉ­®‹ŒhgFF01'',-@@^_‚‚¥¥ÂÂÔÔÙØÎζ·––qqOO56((**9:TVxyœ¼½ÒÑÚÙÒÒ½½žŸzzWV;:**((54MNpp•”¶µÍÎÙØÕÔÃÂ¥¥]]??,,''21IIjiޱ±ËË×ÙÖ×ÆÆªª‡†abBB..('0/FEef‹‹­­ÉÉ×ר×ÈÈ­¬ŠŠffDD//''./CCccˆˆ«¬ÇÇ×ר×ÊÉ®®Œ‹gfFF/0''.-CCcb‡ˆ««ÇÈ×רØÉÊ®®‹‹fgFF/.''..DCdcˆŠ¬¬ÈÈ××××ÉÈ­­‰‰ddDD..&'//GEgf‹Œ¯®ÊÊ×××ÖÇÆ©©…†a`AA,,('11HIkk‘³´ÌÍÙØÔÕ䤀[[==**((44NNrr˜—¸¸ÐÐÙÙÒÓ½½wwTU87())(99UVzzŸŸ¿¿ÔÓÙÚÎÏ··”•nnLL33'(,,@@__„„©©ÆÆ×ÖØØÉÉ®­‰‰ddDC..'&10IHji³³ÎÍÙÙÔÕÁÁ¡¡}|WW;:)))(77STwxž½½ÓÓÙÙÎÏ·¶“”mnLK22'',-ABbaˆˆ¬¬ÈÉ×××ÖÆÆ¨¨ƒƒ^]>>++('44NOst™™»»ÑÑÚÚÑѹ¸——qqNM33((,+@@_`‡†ª«ÇÈ××××ÆÇ¨©ƒ„]^>>++((55QQtu››½¼ÒÒØÙÏ϶·””mnJJ11''--CDeeŒŒ¯°ËËÙØÕÔ¢¢{|WV99)*))9:XX}~¤£ÃÃÖÖØ×ËÊ®®‰‰ccBA,,('23MMqq——ººÒÑÙÙÐз¸”•nmJJ11&&..DEgfޱ²ÌÍÙØÔÔ¿¿žŸxxRR66((+*>>^^…„ªªÈÇØ×××ÅŦ¦€€YZ:;)*((99WW}}£¤ÃÃÖÖØØÉɬ¬††`_>?,+'(66RSxwžž¿ÀÔÕØÙḬ̀±‹‹cdAB-,('44OOtsœ›½½ÓÓÙÚÍͳ³ŽŽgfDD.-&'22MLrq™˜¼»ÒÓÙÙÎÏ´³ihEE..'&32LLqq˜™¼»ÒÒÙÙÎδ´ŽggDE--''22MMrq™™¼½ÓÓÙÙÍͲ³ŽfeCC--''34NOtu¾¿ÕÔÙÙÌ˯°‰Šba@@,+('57SSzz ¡ÁÂÖÖØØÉÈ««„„]\<<)*)):9XX€§¦ÅÅ××××ÄÄ¥¥}}VV77)(++>?`_‡ˆ®®ËËÙÙÕÔ¿¿œœstNN33'(--EEih’‘¶¶ÐÏÙÚÑж·’’jjEF..'&22NNtsœœ¿¿ÕÔØØÊˬ­…†^]=<**)):9YZ‚¨©ÇÇרÖÖ¡ xyRQ44'',,CDggµ¶ÏÏÙÙÐз¶’‘hiEE.-''44QQxw  ÁÁÕÖØØÈǨ§€€XY99)(**>>aaЉ°°ÌÌÙÙÓÓ»»–—mmHH..''22NMttœœÀÀÕÔØÙÉɪªYY99)(**??a`Љ±±ÍÌÙÙÒѺº””lkFG-.''33OPxw¡ ÁÃÖÖרÆÅ¦¦}|UU66(',,CBff¶¶ÑÐÙÙÏϳ´cdAA++((89YYisawav_2_8_8000.wav000066400000000000000000000077141225012771600343340ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFFÄWAVEfmt @€>data ƒƒ•”¨©ººÉÈÒÒØØØÙÔÕÌ˽½¬¬™˜‚‚mmYYGG87--'(((-,76EFXYmmƒƒ™™­­¿½ÌÌÖÕØÙØØÐÑÆÅ¶¶¢¢wv``MM<<01)(''++45CCVVkk‚˜—­¬¾¾ÌÌÕÖÙÙ××Ðб²††ppZZGG67,-'')(./<;MLabyy¦¦¹ºÉÉÔÔÙØØØÑÑÄij³‡‡ooZZEE65+,''))21@@SRhi€€˜˜®­ÁÁÏÏ××ÙÙÕÕÊË»º§¨xxa`KK99--'(((//>>QQhf€˜—®®ÁÁÏÐ××ÚÙÓÔÉɸ·¢¢‰ŠppYYEC44)*&'++66GG\\uuŽŽ¦¦»»ËËÖÕÙÚÖÖËʺ»¦¦Œtt[ZFE54**'&,,76HH__yy“’ªª¿¿ÏÏ××ÙÙÓÓÅÆ³²››‚hgPQ<<..''()21ABWWpp‹‹¥¥»ºÍÌ××ÚÚÔÕÇȵµ‚‚hhOO;;-.'')*33DD[\ww’’«¬ÁÀÐÐØØØØÐÏÁÁ««‘‘ut[[DC22))'(//?>UTonŠŠ¦¥¼¼ÎÍ××ÙØÒÒ¬«’‘uvZ[CC12))('00AAYXut‘‘«ªÁÁÐÑÙØØØÌͺ¹¢¡…†jjNO::++&&+,::OOjj‡ˆ££¼¼ÎÎØØØØÏн½¦¦‰ŠkmPP::-,'',,;:PQmlЉ¦¦¾¾ÐÐØÙ××Í̹¸žŸcbHH45)('(00DC]]|{™š´´ÊÊÖ×ÙÙÒÑÀÀ¦§‰ŠjkNN88+*''//?@ZYwx—–³³ÈÉÕÖÚØÑп¿¥¥‡†ggKL66))((22FFab€Ÿ »»ÏÎÙØ××ËÊ´µ˜˜ywYX?>--''-,<=VVvu•–³³ÊÉ××ÙØÏκºž}}]]AB/.'',+;-,''./BC^^€¡¡½½ÑÑÙÙÕÔÃÅ©ªˆ‰fgHI33'(**::TStu––µ´ÌÍØÙ×ÖÉȯ¯llLM54(())88RRrs––¶µÍÍÙØ×ÖÇÇ­¬‹‹ghIH11'(+,<=ZY|{ŸŸ½½ÒÒØÙÓÒ¾¾  }|YY<=++''23JKll‘‘²²ÊËØØ×ÖÆÆª«ˆ‡bcCC..''//EEff‹Š®®ÉÊר××ÇȬ¬‰ˆbdCC-.''00GGiiޱ²ÌÌØÙÖÕÃÃ¥¥€ZZ=<*+((67RRwvœœ½½ÓÒÙÙÏз¶”“mlJI00''..EDgg޲³ÍÍÙÙÔÓ¿¿žwvQQ56''+,@?abŠˆ®®ËÊØÙÕÔÀÀ ŸwwQQ55((,,ABedŽŽ²²ÍÎÙÙÓÓ¼¼˜—ooJJ00''00JKqq𙽽ÔÔÙÙËË®­†‡^]=<)**)<<]]‡ˆ®®ËÌØØÓÓºº–•kkFF..'(55SS||¥¥ÇÇרÕÕÀ¿››rqJJ0/'&23QQ{{¤¤ÆÇØ×ÕÕ¿¿ššonHH..''66WV‚ªªËËÙÚÒÒ·¸dd@?*))*?>cd¸¸ÒÓÙÙÉɨ¨||QQ33''21PQ{{§§ÊÉÙÙÒÒ··Œa`;;((,,EEnn›œÂÂ××ÖÕ¿¾——ii@A))**AAhh——¿¾Ö×ÖÖ¿¿——ii@A*)**BBkk›šÂÂ××ÔÕ¼»‘bb<;('..KKvv¥¥ÉÉÙÙÐа¯‚‚TT13'(65[ZŠˆ¶¶ÓÒØØÃÛ›jk@A)*,,HFss£¤ÉÉÙÙÎϬ¬}}NO./''<=ee–—ÁÁØØÓÔ¶µ‡ˆWW23&'66^^¼¼ÖÖÕÕ¹¹Œ‹YZ44'&76]]½½ÖÖÔÔ··‡ˆVV12('::dd˜—ÂÂØØÑÑ®¯||KK,,)*CDsr¦¥ÍÌØÙÈÇžŸjj>>''00VUˆˆ¹¹ÖÕÕÕ·¶„…RR//((AAqp¥¦ÌÌØÚÆÅš™de98('66`_••ÄÂÙÙÎΨ§rrAA')00VVŠ‹½¼××ÑÒ®®yyFG)*--QP‡‡º¹×ÖÓÓ¯¯yzGF)*..SSЉ¼¼××ÑѪªssAA('12ZZ““ÄÃÙÙËË Ÿgg88''99ij¢¢ÌÍØÙÀÀUT./*)II€€·¶ÖÖÒÒ­¬ss@?''55cbËËÙÙÁÁŽŽTT.-**MM†…¼»ÙØÎÍ¢¢gg66''@?tt®®ÔÔÔÔ°¯ut@?('87ih¥¤ÏÏØ×··~}DE((44cbŸ¡ÎÎØØºº€€GG((34cc¡¡ÎÏר··|}DC'(67ii¦¦ÒÒÕÕ°°sr<<&'==tu±³ÖÖÑÑ¢¢dc33))JK‡ˆÀÀÙÙÅÅŽPP*+00__ ŸÏÏ××±²rr;:''AA}}ººØÙÉÉ““SS++00`a¡¡ÐÐÕÕ¬¬lk56((KJЉÄÄÙÙ¾¾‚‚CC'&;;vw¶¶ÙÙÊÊ’’PP))33iiª«ÕÕÏМœYY,,//a`¤¤ÒÓÒÓ¢¢_^..--^]¡¡ÒÒÓÓ¤£^^./-.``¤¤ÔÓÑÑŸŸYY,,10ef««ÖÖÍÍ•”OP((76sr·¶ØÙÄĆ…CC''BB„„ÄÄÙØ¶¶qq65)*UUœÑÑÒÒŸŸWX**55ppµ¶ÙÙ€€>=''KK“’ÍÍÕÕ¥¥[\++33op¶¶ÙÙ¿À||:;)(SRœ›ÑÒÐј—NN'(=>‚ƒÅÅØØ®­cc--22mn¶·ÙÚ¼½vu66+*^]©¨××ÇÇ„„=>((RRŸžÕÔÍÍŒŽDD&'LL˜˜ÒÑÏÏ’’HG''II•–ÒÐÐÐ’“GG''KK˜—ÒÓÎÎŽŽCC('PPžžÕÔÊÊ……=<))ZZ©©ØØÁÂww44.-ii¶·ÙÙµ´ed+,77~~ÆÆÖÖŸ OO''HG——ÒÔʈ…;;+*ba²³ÙÚµ¶dd++::„„ËÊÓÓ””DD''XXª«ØÙ»¼kk,-77‚ÊÊÒÒ’’BC((]\°°ÙÚ³´_`))@A‘‘ÓÒËÊ45./rsÃÂÖÖ›šFG((ZZ¯°ÙÙ±±[Z''GGœœ×ÖÀÀnn,-;:‹‹ÑÐËÊ}}2222}|ËÊÑЊ‰98.-ssÅÆÔÓ‘‘==+,mmÁÂÖÕ••@?**kkÁÁÕÖ••@>+*mmÂÂÕÕ‘‘<;--ttÇÇÒщˆ76/0}~ÍÌÍÍ|~0078‹ŒÓÓÄÃml+)CCØØµµYY''UU°±ÙØ  EE)*mmÄÅÒÑ…†3266‹ŠÔÔÁÀfe((MN««ÙÙ££EF*)poÈÇÏÎ||..>>™šØØ±±RR((ddÂÁÓÓ……11:9–•ØØ³³RR((ffÄÃÐÑ~~.-@@ ŸÙÙ¨©FF+*wwÏÎÆÇji((RSµ¶××3388—–ØØ­¬II*+wxÏÐÄÃcb&&]\À¿ÒÑ||+,GG¬«ØØ“”5688™˜ÙÙ¦¦AA./‡‡ÖÖ´´MN*)xxÑѾ¾XY('mmÍÌÅÅbb''efÈÈÊÉgg''aaÅÅËËjj(&__ÅÅËÊji''aaÇÆÊÉef''gfÉËÅÅ^^''ooÏϾ¾VU)(z{ÔÔ´´HI--‹ŠÙئ¦=<66ÚØ““10ED±±ÔÕ{z()ZYÅÃÉÈaa('uuÓÓ³³FF10•–ØÙ”•01GGµ¶ÒÑpp''hhÏÏ»ºKK/.’“ÙÙ““//KJ¼»ÍÎee''xxÕÕ«ª;;<;ª«ÖÖwv('iiÑеµDC66¤¢××{|('fgÐе¶BC76¦§ÕÖuv''ppÔÔ«ª:9@@´´ÏÏdc)(„„ØÙ””-,VUÈǾ¾HI44¤¥ÖÕqq&'{{ØØš™./TTÈÈ»¼EE88¬¬ÑÒdd))‹ŒÙÚ††((kkÔÔ¤¤22OOÆÆ»¼CC;:²´ÌÍXX..žÖÖmm'(ˆˆÙÙ‚ƒ('uuØØ”“**deÔÔ¢£//XXÎέ®54MMÈɶ¶:;GGÃü¼??CCÀÀÀÀCB?@½¾ÀÁCC??½½ÁÁBB@@ÀÀ¿¾?@DCÂĺº:;IIÇȳ³66QRÎΩ©0/\]ÔÓœ**llרŒŒ''}}ÙÙxy''’’ÖÖcb./¨©ÌÌLL<<¿¿º»88RQÏÏ¡¢*+nnØÙ‚((‘‘ÕÖ^^22²²ÄÄ?>JLÎΤ£*+rrÙÚxx()žžÏÏMM?>ÅÅ®¯..hhÙØ~~()žÏÏJJBCÉɦ¦+*vvÙÙlm..±°ÂÁ89XYÖÖ‰ˆ('˜™ÐÐIIFFÎΚœ''‰‰ÕÖST>>ÈȤ¤)(‚×ÖXX;;ÇÇ¥¤()„„ÖÖTS@@ÊËœ''ÒÑHGKKÓÓŠŠ((¤£ÅÅ88baÙØon11½¾­­*)„„ÕÕLLJIÓÓ…†*)¯­»»//wv××TTCDÒÑŠ‰))¯¯º¹--}}ÕÕKKNOÖÖxx//¿¿¥¦''˜˜ÈÈ55mnØØUTHGÕÕ{{//ÀÁ¡¢''¡¡Á¿/.~ÓÓBB^]ÙÚ]\CCÔÔzz11ÆÅ——((±±°¯((›šÂÂ..ƒƒÐÏ:9mm××GHZ[ÙÚXWKKØ×gf?>ÔÔvv66Î΂11ÉÇŒ-,Ö•*)¾½›œ))¸¹¡ ((·¶££('¶µ££('µµ¢£('¸¸ŸŸ((»»š›)*À¿“”+,ÆÅŠŠ0/ÌÌ~66ÒÒqr?>ÖÖccJKÙØSRZZÙØBCmnÒÒ45ƒ„ÇÆ++›œµµ''´´œ*+ÈÈ€99ÕÖ`aQPÙÙDDpqÏÏ//””¸¸''¸·•–00ÐÐllJIÚÙEDssÍÍ,+  ª«))ÇÇ{z@@ÙÙKJnmÎÎ+,££¦¥++ÍÍnmMLÙØ;;††½½''¿¿ƒƒ==ÙØGGxxÄÅ'(¹¹ŠŠ:;ÙØGGzzÂÃ''¾¾€CCÙÙ;;Œ³³))ÎÍefZZÒÒ+,¬¬“’99ÙÙAA††µµ)*ÏÏ_^edËË''½½yzMLÖÖ-.ª«>=ÙÙ77››žŸ45ÙÙ==‘’¦§22××BAŽŽ©¨01ØÙ@?‘’¤¥43ÚÚ99œœ˜˜<=××43¨¨‰ŠFG××%&ÂÂjjedÁÂ--ÈÈ^\nosampledata.wav000066400000000000000000000000541225012771600343610ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataRIFF$WAVEfmt D¬ˆXdatanotawav.wav000066400000000000000000000000341225012771600333660ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/dataCeci n'est pas une wav file onebyte.wav000066400000000000000000000000021225012771600333470ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/data1 qwavedecoder.pro000066400000000000000000000005211225012771600334530ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoderTARGET = tst_qwavedecoder HEADERS += ../../../../src/multimedia/audio/qwavedecoder_p.h SOURCES += tst_qwavedecoder.cpp \ ../../../../src/multimedia/audio/qwavedecoder_p.cpp QT += multimedia-private testlib network CONFIG += no_private_qt_headers_warning testcase TESTDATA += data/* DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 tst_qwavedecoder.cpp000066400000000000000000000306011225012771600343310ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/qwavedecoder/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include class tst_QWaveDecoder : public QObject { Q_OBJECT public: enum Corruption { None = 1, NotAWav = 2, NoSampleData = 4, FormatDescriptor = 8, FormatString = 16, DataDescriptor = 32 }; public slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); private slots: void file_data(); void file(); void http_data() {file_data();} void http(); void readAllAtOnce(); void readPerByte(); }; Q_DECLARE_METATYPE(tst_QWaveDecoder::Corruption) void tst_QWaveDecoder::init() { } void tst_QWaveDecoder::cleanup() { } void tst_QWaveDecoder::initTestCase() { } void tst_QWaveDecoder::cleanupTestCase() { } static QString testFilePath(const char *filename) { QString path = QString("data/%1").arg(filename); return QFINDTESTDATA(path); } void tst_QWaveDecoder::file_data() { QTest::addColumn("file"); QTest::addColumn("corruption"); QTest::addColumn("channels"); QTest::addColumn("samplesize"); QTest::addColumn("samplerate"); QTest::addColumn("byteorder"); QTest::newRow("File is empty") << testFilePath("empty.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("File is one byte") << testFilePath("onebyte.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("File is not a wav(text)") << testFilePath("notawav.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("Wav file has no sample data") << testFilePath("nosampledata.wav") << tst_QWaveDecoder::NoSampleData << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("corrupt fmt chunk descriptor") << testFilePath("corrupt_fmtdesc_1_16_8000.le.wav") << tst_QWaveDecoder::FormatDescriptor << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("corrupt fmt string") << testFilePath("corrupt_fmtstring_1_16_8000.le.wav") << tst_QWaveDecoder::FormatString << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("corrupt data chunk descriptor") << testFilePath("corrupt_datadesc_1_16_8000.le.wav") << tst_QWaveDecoder::DataDescriptor << -1 << -1 << -1 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_1_8_8000.wav") << testFilePath("isawav_1_8_8000.wav") << tst_QWaveDecoder::None << 1 << 8 << 8000 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_1_8_44100.wav") << testFilePath("isawav_1_8_44100.wav") << tst_QWaveDecoder::None << 1 << 8 << 44100 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_2_8_8000.wav") << testFilePath("isawav_2_8_8000.wav") << tst_QWaveDecoder::None << 2 << 8 << 8000 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_2_8_44100.wav") << testFilePath("isawav_2_8_44100.wav") << tst_QWaveDecoder::None << 2 << 8 << 44100 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_1_16_8000_le.wav") << testFilePath("isawav_1_16_8000_le.wav") << tst_QWaveDecoder::None << 1 << 16 << 8000 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_1_16_44100_le.wav") << testFilePath("isawav_1_16_44100_le.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_2_16_8000_be.wav") << testFilePath("isawav_2_16_8000_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 8000 << QAudioFormat::BigEndian; QTest::newRow("File isawav_2_16_44100_be.wav") << testFilePath("isawav_2_16_44100_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 44100 << QAudioFormat::BigEndian; // The next file has extra data in the wave header. QTest::newRow("File isawav_1_16_44100_le_2.wav") << testFilePath("isawav_1_16_44100_le_2.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100 << QAudioFormat::LittleEndian; // 32 bit waves are not supported QTest::newRow("File isawav_1_32_8000_le.wav") << testFilePath("isawav_1_32_8000_le.wav") << tst_QWaveDecoder::FormatDescriptor << 1 << 32 << 8000 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_1_32_44100_le.wav") << testFilePath("isawav_1_32_44100_le.wav") << tst_QWaveDecoder::FormatDescriptor << 1 << 32 << 44100 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_2_32_8000_be.wav") << testFilePath("isawav_2_32_8000_be.wav") << tst_QWaveDecoder::FormatDescriptor << 2 << 32 << 8000 << QAudioFormat::BigEndian; QTest::newRow("File isawav_2_32_44100_be.wav") << testFilePath("isawav_2_32_44100_be.wav") << tst_QWaveDecoder::FormatDescriptor << 2 << 32 << 44100 << QAudioFormat::BigEndian; } void tst_QWaveDecoder::file() { QFETCH(QString, file); QFETCH(tst_QWaveDecoder::Corruption, corruption); QFETCH(int, channels); QFETCH(int, samplesize); QFETCH(int, samplerate); QFETCH(QAudioFormat::Endian, byteorder); QFile stream; stream.setFileName(file); stream.open(QIODevice::ReadOnly); QVERIFY(stream.isOpen()); QWaveDecoder waveDecoder(&stream); QSignalSpy validFormatSpy(&waveDecoder, SIGNAL(formatKnown())); QSignalSpy parsingErrorSpy(&waveDecoder, SIGNAL(parsingError())); if (corruption == NotAWav) { QSKIP("Not all failures detected correctly yet"); QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == NoSampleData) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() == 0); QVERIFY(waveDecoder.duration() == 0); } else if (corruption == FormatDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == FormatString) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(!waveDecoder.audioFormat().isValid()); } else if (corruption == DataDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(waveDecoder.size() == 0); } else if (corruption == None) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() > 0); QVERIFY(waveDecoder.duration() == 250); QAudioFormat format = waveDecoder.audioFormat(); QVERIFY(format.isValid()); QVERIFY(format.channelCount() == channels); QVERIFY(format.sampleSize() == samplesize); QVERIFY(format.sampleRate() == samplerate); if (format.sampleSize() != 8) { QVERIFY(format.byteOrder() == byteorder); } } stream.close(); } void tst_QWaveDecoder::http() { QFETCH(QString, file); QFETCH(tst_QWaveDecoder::Corruption, corruption); QFETCH(int, channels); QFETCH(int, samplesize); QFETCH(int, samplerate); QFETCH(QAudioFormat::Endian, byteorder); QFile stream; stream.setFileName(file); stream.open(QIODevice::ReadOnly); QVERIFY(stream.isOpen()); QNetworkAccessManager nam; QNetworkReply *reply = nam.get(QNetworkRequest(QUrl::fromLocalFile(file))); QWaveDecoder waveDecoder(reply); QSignalSpy validFormatSpy(&waveDecoder, SIGNAL(formatKnown())); QSignalSpy parsingErrorSpy(&waveDecoder, SIGNAL(parsingError())); if (corruption == NotAWav) { QSKIP("Not all failures detected correctly yet"); QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == NoSampleData) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() == 0); QVERIFY(waveDecoder.duration() == 0); } else if (corruption == FormatDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == FormatString) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(!waveDecoder.audioFormat().isValid()); } else if (corruption == DataDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(waveDecoder.size() == 0); } else if (corruption == None) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() > 0); QVERIFY(waveDecoder.duration() == 250); QAudioFormat format = waveDecoder.audioFormat(); QVERIFY(format.isValid()); QVERIFY(format.channelCount() == channels); QVERIFY(format.sampleSize() == samplesize); QVERIFY(format.sampleRate() == samplerate); if (format.sampleSize() != 8) { QVERIFY(format.byteOrder() == byteorder); } } delete reply; } void tst_QWaveDecoder::readAllAtOnce() { QFile stream; stream.setFileName(testFilePath("isawav_2_8_44100.wav")); stream.open(QIODevice::ReadOnly); QVERIFY(stream.isOpen()); QWaveDecoder waveDecoder(&stream); QSignalSpy validFormatSpy(&waveDecoder, SIGNAL(formatKnown())); QTRY_COMPARE(validFormatSpy.count(), 1); QVERIFY(waveDecoder.size() > 0); QByteArray buffer; buffer.resize(waveDecoder.size()); qint64 readSize = waveDecoder.read(buffer.data(), waveDecoder.size()); QVERIFY(readSize == waveDecoder.size()); readSize = waveDecoder.read(buffer.data(), 1); QVERIFY(readSize == 0); stream.close(); } void tst_QWaveDecoder::readPerByte() { QFile stream; stream.setFileName(testFilePath("isawav_2_8_44100.wav")); stream.open(QIODevice::ReadOnly); QVERIFY(stream.isOpen()); QWaveDecoder waveDecoder(&stream); QSignalSpy validFormatSpy(&waveDecoder, SIGNAL(formatKnown())); QTRY_COMPARE(validFormatSpy.count(), 1); QVERIFY(waveDecoder.size() > 0); qint64 readSize = 0; char buf; for (int ii = 0; ii < waveDecoder.size(); ++ii) readSize += waveDecoder.read(&buf, 1); QVERIFY(readSize == waveDecoder.size()); QVERIFY(waveDecoder.read(&buf,1) == 0); stream.close(); } QTEST_MAIN(tst_QWaveDecoder) #include "tst_qwavedecoder.moc" qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/auto/unit/unit.pro000066400000000000000000000001461225012771600273720ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += multimedia.pro qtHaveModule(widgets): SUBDIRS += multimediawidgets.pro qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/global/000077500000000000000000000000001225012771600252015ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/global/global.cfg000066400000000000000000000002411225012771600271170ustar00rootroot00000000000000 qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/000077500000000000000000000000001225012771600263505ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/audio_playback/000077500000000000000000000000001225012771600313175ustar00rootroot00000000000000sys_audio.qtt000066400000000000000000000470671225012771600340070ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/audio_playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia testcase = { /* Notes Ensure various mp3, wav, ogg, oga, spx and flac audio files available for playback Ensure a valid m3u file referring to locations where indicated media is available on the device Ensure the device can ping destinations on the network (if applicable) Have an audio stream url available (e.g. http://202.6.74.107:8060/triplej.mp3 for example) Ensure access to Internet available to device either via 3G and WiFi */ initTestCase: function() { }, play_an_audio_file_data: { mp3:[".mp3", "filename", "mpeg audio layer 3"], wav:[".wav", "filename", "waveform audio"], ogg:[".ogg", "filename", "container format"], vorbis:[".oga", "filename", "audio compression format"], speex:[".spx", "filename", "speech audio format"], flac:[".flac", "filename", "audio file format"] }, play_an_audio_file: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Play Audio File"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify that various Audio files can be played."; testPreconditions = "Audio files in " + extension + " format are available on device. Launch the native Music player to populate the playlist before opening BGMPTest."; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Verify that the playlist has populated the application | | | Select the desired "+filename+extension+" and press play | Verify that the " + format + " file is audible on device | ")); }, basic_player_controls_for_audio_data: { mp3:[".mp3", "filename", "mpeg audio layer 3"], wav:[".wav", "filename", "waveform audio"], ogg:[".ogg", "filename", "container format"], vorbis:[".oga", "filename", "audio compression format"], speex:[".spx", "filename", "speech audio format"], flac:[".flac", "filename", "audio file format"] }, basic_player_controls_for_audio: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Audio Player Controls"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify basic API for controlling audio playback "; testPreconditions = "a test "+extension+" file is available on device"; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select the desired "+filename+extension+" in playlist and press [Play] | Verify that file plays properly from the start | | | Verify that the correct track details are displayed in the playlist | | Select [Pause] | Verify that file has paused | | Select [Play] | Verify that file continues to play properly from where previously paused. | | | Verify that the progress bar tracks the progression of the file playback | | Select [Next] control | Verify that next file in playlist is playing from start | | | Verify that the correct playlist title is highlighted and that the details are correct to reflect the selected audio track | | Select [Stop] control | Verify that file has stopped playing | | Select [Play] | Verify that file continues to play from start of file. | | With file playing, verify that UI volume control slider can change volume up and down | | | Select volume at 50% (or thereabout) | | | Select [Mute] | Verify that sound is muted while file is playing | | | Verify that [Mute] control is displaying the Muted icon | | Select [Mute] control again | Verify that sound has reverted back to level selected prior to muting | ")); }, hardware_volume_controls_for_audio_data: { mp3:[".mp3", "filename", "mpeg audio layer 3"], wav:[".wav", "filename", "waveform audio"], ogg:[".ogg", "filename", "container format"], vorbis:[".oga", "filename", "audio compression format"], speex:[".spx", "filename", "speech audio format"], flac:[".flac", "filename", "audio file format"] }, hardware_volume_controls_for_audio: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Audio Player Controls"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify hardware volume control of audio playback "; testPreconditions = "a test "+extension+" file is available on device"; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select the desired "+filename+extension+" in playlist and press [Play] | Verify that file plays properly from the start | | Press the hardware volume keys to increase the volume to the maximum | Verify that the device now plays at maximum volume | | Using hardware volume keys, select volume at about 50% | Verify that the device is now playing at about 50% volume | | Using hardware keys, take volume down to 0% | Verify that sound is muted while file is playing | | Using hardware keys, increase volume | Verify that sound is once again playing from device | ")); }, basic_playlist_controls_for_audio_data: { mp3:[".mp3", "filename", "mpeg audio layer 3"], wav:[".wav", "filename", "waveform audio"], ogg:[".ogg", "filename", "container format"], vorbis:[".oga", "filename", "audio compression format"], speex:[".spx", "filename", "speech audio format"], flac:[".flac", "filename", "audio file format"] }, basic_playlist_controls_for_audio: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Audio Player Controls"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify basic API for controlling playlist playback "; testPreconditions = "a test "+extension+" file is available on device"; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select 'Sequential' as the Play Mode | | | Select the desired "+filename+extension+" in playlist and press [Play] | Verify that file plays properly from the start | | | Verify that the correct track details are displayed in the playlist | | Select [Next] | Verify that the next file in the playlist is highlighted | | | Verify that the correct audio file is being played from the beginning of the track | | | Verify that there are no audible artifacts or undue lag during this change of track | | After some time (10-20 sec), select [Prev] icon | Verify that the previous file in the playlist is being played from start | | Let file play till end | Verify player continues playing the next file in the playlist window | | After some arbitrary time, Select [Stop] | | | Select [Next File] control | Verify that next file in playlist is highlighted | | | Verify that file is not automatically playing | | Select [Prev] control | Verify that previous file in playlist is highlighted | | Select file in playlist | Verify that file plays in player. | | Select number of files greater than can be displayed without scrolling in to playlist | Verify that list can be scrolled through | | Navigate to the last file in the playlist and select [Next] | Verify that no other track is played | | Select 'Loop' as the Play Mode | | | Select [Next] | Verify that the next song played is the first song in the playlist | | While first song is playing select [Prev] | Verify that the last song in the playlist is now playing | | Select [current Loop] from Play Mode | Verify that the same song now plays in a loop | | | Verify that selecting [Prev] or [Next] has no effect on the tune played | | Select [Current Only] in the Play Mode | Verify that only the selected song plays and stops at the end | | Select [Shuffle] | Verify that the playlist is now shuffled in a random fashion | | Select [Shuffle] again | Verify that the playlist is again shuffled in a random fashion | | Select [Reset] | Verify that the playlist is now back to its original order | ")); }, seek_controls_for_audio_data: { mp3:[".mp3", "filename", "mpeg audio layer 3"], wav:[".wav", "filename", "waveform audio"], ogg:[".ogg", "filename", "container format"], virbis:[".oga", "filename", "audio compression format"], speex:[".spx", "filename", "speech audio format"], flac:[".flac", "filename", "audio file format"] }, seek_controls_for_audio: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Audio Seek Controls"; testBinary = "AudioPlayer"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify FastForward and Rewind functionality of the API"; testPreconditions = "a test "+extension+" file is available on device"; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select [Play] to play the file | | | Click on the [Move Forward] control | Verify that file playback has moved forward 5 seconds | | Select [Pause] | Verify that the file has paused the playback | | Click on the [Move Forward] control | Verify that the file has moved 5 seconds forward, but is still paused | | Select [Play] | Verify that file is now playing from new position | | Click on the [Move Backwards] control | Verify that file playback has moved back 5 seconds | | Select [Pause] | Verify that the file has paused the playback | | Click on the [Move Backwards] control | Verify that the file has moved 5 seconds backwards, but is still paused | | Select [Play] | Verify that file is now playing from new position | ")); }, basic_controls_for_streamed_audio_content: function() { //*Note* For this test you need a playlist of streaming media urls. Suggest: http://202.6.74.107:8060/triplej.mp3 ; http://www.abc.net.au/streaming/triplej.asx ; rtsp://media1.abc.net.au/broadcast/triplej.rm ; mms://media3.abc.net.au/triplej ; depending on your platform and backend support. // Test meta data testTitle = "Multimedia - Content Streaming"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify playback of streaming audio media"; testPreconditions = ""; testGroups = "BAT, 5.0"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | In player application, Select or Tap [Open] | | | In [Open File] navigate and highlight test (streaming) playlist file | | | Select or Tap on selected file to return to player UI | Verify selected file has populated playlist | | Highlight file in playlist by selecting or clicking it | | | Select [Play] | Verify that stream is playing on device | | Select [Pause] | Verify that stream is paused on device | | | Verify that the [Pause] button has changed to a [Play] button | | Select [Play] again | Verify that stream is playing on device | | Select [Stop] | | | Open local mp3 file in to play list and select it to play | Verify that the mp3 plays while the stream name is still present in the playlist | | Re-select the stream in the playlist | Verify that the stream starts playing again | | Select [Next File] | Verify that the player started playing the next file in the playlist | | Select [Previous File] | Verify that the original stream is playing again | | During stream playback, have headphones connected to device | Verify that the sound is now playing through the headphones | | Invoke a system notification on the device (such as an incoming SMS) | Verify that the device correctly transmits the audible system notification through the devices speakers and then returns to playing the stream through the headphones | ")); }, play_sound_effects: function() { // Test meta data testTitle = "Multimedia - SoundEffects Playback"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify playback of sound effects."; testPreconditions = ""; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | Verify app launches normally | | play soundeffect | Verify that a sound effect is audible | | Close application | Verify that the application closes without issues | ")); }, change_volume_of_sound_effects: function() { // Test meta data testTitle = "Multimedia - SoundEffects Playback"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Change volume of sound effects."; testPreconditions = ""; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | Verify app launches normally | | Set volume of device to maximum | Verify that sound effect now plays at maximum volume | | Set volume of device to about 50% volume | Verify that the sound effect now plays at half volume | | Set volume of device to minimum | Verify that there is now no audio from device when sound effect is played | | Close application | Verify that the application closes without issues | ")); }, play_sound_effects_over_compressed_audio: function() { // Test meta data testTitle = "Multimedia - SoundEffects Playback"; testBinary = "player"; testSource = "$QTDIR/qtmultimedia/examples/player"; testGoal = "Verify playback of sound effects over audio track."; testPreconditions = "player application to provide background playback"; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch player, start playback of playlist | Audio should be heard from the device | | Swipe to background player | Audio should still be heard from player | | Launch " + testBinary + " | Verify app launches normally | | Touch red rectangle | Verify that a sound effect is audible together with the background track | | Touch blue rectangle | Verify that a sound effect is audible together with the background track | | Touch green rectangle | Verify that a sound effect is audible together with the background track | | Touch yellow rectangle | Verify that a sound effect is audible together with the background track | | Touch a combination of rectangles in quick succession | Verify that sound effects trigger on each touch and that the background track can still be heard | | Close application | Verify that the application closes without issues | | | Verify that player is still playing audio tracks | ")); } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/audio_recording/000077500000000000000000000000001225012771600315055ustar00rootroot00000000000000sys_audio_recording.qtt000066400000000000000000000062341225012771600362200ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/audio_recording/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia testcase = { initTestCase: function() { }, record_an_audio_file: function(extension, filename, format) { // Test meta data testTitle = "Multimedia - Record Audio File"; testBinary = "player"; testSource = "$QTDIR/qtmultimediia/examples/audiorecorder"; testGoal = "Verify that various Audio files can be recorded."; testPreconditions = ""; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select Default for Input Device, Audio Codec, File Container and Sample rate | | | Select Constant Quality for Encoding mode | | | Select output file and hit Record | Verify that Audio Level is responding to audio input | | Navigate to created audio file and play | Verify that audio is of intended quality | | Close application | Verify application closes cleanly | ")); } } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/radio/000077500000000000000000000000001225012771600274465ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/radio/sys_radio.qtt000066400000000000000000000370761225012771600322110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia testcase = { /* Notes Ensure radio reception is available in testing area Most tier 1 platforms require a radio module A device specific headset is required to be connected to device for radio testing */ initTestCase: function() { }, play_a_radio_transmission: function() { // Test meta data testTitle = "Multimedia - Play Radio Transmission"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that radio stations can be played."; testPreconditions = "1. Radio reception should be available in the test area.
2. Device must have a suppported radio module."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | | If not first time running application on image, verify that you are presented with a list of previously scanned radio stations | | Select a radio station from the list | Verify that the station is properly selected | | Select the power icon next to the station name | Verify that audio from the radio station is now heard through the headphones | | Deselect the power icon next to the station name | Verify that audio from the radio station is no longer heard through the headphones | | Exit the radio application | Verify that the radio application closes cleanly | ")); }, change_a_radio_station: function() { // Test meta data testTitle = "Multimedia - Radio: Change radio station"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that radio station can be changed from station playlist."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select a radio station from the list | Verify that the station is heard through the headphones | | If in the visualization view, select the down icon to return to the station selection view | Verify that you are presented with the list of stations | | Select a different station | Verify that you are now listening to a different radio station | | Deselect the power icon next to the station name | Verify that audio from the radio station is no longer heard through the headphones | | Exit the radio application | Verify that the radio application closes cleanly | ")); }, manually_tune_radio_station: function() { // Test meta data testTitle = "Multimedia - Manually tune radio station"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that user can manually change radio station."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select a radio station from the list | Verify that the station is heard through the headphones | | Select the up icon to be presented to the visualization view | | | Select the Plus icon on the menu bar | Verify that you are presented with the frequency dial | | Note the current selected frequency | | | Select the dot indicator on the frequency dial, and move finger to right | Verify that the frequency on the indicator is now rising and that the audio has gone off the previous station | | Keep moving selector until a radio station is heard | Verify that the frequency of the selected station is higher than the originally selected station | | | Verify that the station is playing properly | | Select to save the selected radio station frequency | Verify that the station is saved in the radio station playlist | | Exit the radio application | Verify that the radio application closes cleanly | ")); }, scan_up_and_down: function() { // Test meta data testTitle = "Multimedia - Scan up and down the frequency"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that radio can scan up and down the FM frequency."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select a radio station from the list | Verify that the station is heard through the headphones | | Select the up icon to be presented to the visualization view | | | Select the Plus icon on the menu bar | Verify that you are presented with the frequency dial | | Note the current selected frequency | | | Select the Scan Up Frequency control | Verify that application has located a new station and that the frequency displayed is of the new station | | | Verify that the station is playing properly | | Select to save the selected radio station frequency | Verify that the station is saved in the radio station playlist | | Select the Scan Down Frequency control | Verify that application has located the original station and that the frequency displayed is of the original station | | | Verify that the station is playing properly | | Select to save the selected radio station frequency | Verify that the station is saved in the radio station playlist | | Exit the radio application | Verify that the radio application closes cleanly | ")); }, scan_for_multiple_radio_stations: function() { // Test meta data testTitle = "Multimedia - Radio: Scan for multiple radio station"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that radio can scan for multiple stations at once."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | On the menu, select Find new station | In the Radio Dialog Scanning view, observe the number of stations found | | Exit the radio application | Verify that the radio application closes cleanly | ")); }, save_radio_station_list: function() { // Test meta data testTitle = "Multimedia - Radio: Save station playlist"; testBinary = "radio"; testSource ="qt5/qtmultimedia/examples/radio" testGoal = "Verify that radio can save station playlist."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select to scan for multiple stations | Verify that multiple stations have been found | | Select to save station playlist | | | Close application | Verify that the application closes | | Reopen " + testBinary + " | Verify that the app launches normally | | Go to station playlist | Verify that the stations from the previous search are listed | | Select various stations from playlist | Verify that radio station play properly | | Close application | Verify that radio application closes properly | ")); }, radio_interrupted_by_system_notification: function() { // Test meta data testTitle = "Multimedia - Radio interrupted by System Notification"; testBinary = "radio"; testSource ="$QTDIR/qtmultimediakit/examples/Radio" testGoal = "Verify that radio can recover audio playback from various system notifications."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Locate a strong radio station signal by scanning up/down | | | While on a strong and audible radio signal, evoke a system notification on device (eg: alarm notification) | Verify that the radio has muted, and after the system notification has been delivered, the radio reverts to outputting the audio signal back through the headphones | | While on a strong and audible radio signal, call the device | Verify that the radio has been muted, and stays muted during the duration of the call, and resumes once the call has ended | | Close application | Verify that radio application closes properly | ")); }, radio_volume_control: function() { // Test meta data testTitle = "Multimedia - Radio Volume Control"; testBinary = "radio"; testGoal = "Verify that the radio volume can be controlled via volume controls."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Locate a strong radio station signal by scanning up or down the frequency | | | While on a strong and audible radio signal, move volume slider to the right | Verify that the audio volume of the radio station is amplified | | Move volume slider to the left | Verify that the audio volume is lowered | | Move the volume slider all the way to the left | Verify that the sound is now completely muted | | Return the volume to a value above 50% and click the Mute/unmute command | Verify that the audio changes from being muted to unmuted and back | ")); }, display_radio_metadata: function() { // Test meta data testTitle = "Multimedia - Display Radio Meta data"; testBinary = "radio"; testGoal = "Verify that the radio API can display properly formatted meta data."; testPreconditions = "1. Radio reception should be available in the test area.
2. Wired headphones act as an antenna to the device and must be connected."; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Locate a strong radio station signal by scanning up or down the frequency | Verify that the Frequency field is populated with the correct frequency for the given radio station | | | Verify that the Volume field is displaying the proper volume % | | Click on the Mute/Unmute command | Verify that Muted field changes from 'false' to 'true' and back | | | If applicable, confirm that the Station Name field is properly displayed | | | If applicable, confirm that the Station Id field is properly displayed | | | If applicable, confirm that the Program Type field is properly displayed | | | If applicable, confirm that the Radio Text field is properly displayed | ")); }, } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/still_camera/000077500000000000000000000000001225012771600310075ustar00rootroot00000000000000sys_camera.qtt000066400000000000000000000217361225012771600336210ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/still_camera/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia testcase = { /* Notes */ initTestCase: function() { }, take_a_photo: function() { // Test meta data testTitle = "Multimedia - Still Camera"; testBinary = "camera"; testSource = "qt5/qtmultimedia/examples/camera" testGoal = "Verify that a photo can be taken with the camera."; testPreconditions = "None"; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testTitle + " | App launches normally | | If device has lens cover, make sure it is open | | | Select Image tab to put camera in still mode | Verify the intended scene is reproduced in the preview pane/viewfinder | | Select Capture Photo | Verify that image is shown on screen for preview | | | Verify that a new file is in the Images folder and accessible with the image viewer | | Select given image | Verify that it is a true representation of the intended screen | | | Verify the image has no unintended artifacts and noise and is properly formatted | ")); }, change_camera_settings: function() { // Test meta data testTitle = "Multimedia - Still Camera, Change Settings"; testBinary = "camera"; testSource = "qt5/qtmultimedia/examples/camera" testGoal = "Verify that the camera can change its Still Camera settings successfully."; testPreconditions = None"; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | If device has lens cover, make sure it is open | | | Select the primary camera device from Menu/Devices | Verify the viewfinder is displaying the scene from the main camera device | | Select Capture Photo | Verify that a photo was taken and that a preview image is shown on screen | | Select the secondary camera device from Menu/Devices | Verify the viewfinder is displaying the scene from the secondary camera device | | Select Capture Photo | Verify that a photo was taken from the secondary camera device and that a preview image is shown on screen | | Change Exposure Compensation on the slider in the main UI | Verify that the change in value affects the picture quality in expected fashion | | Select Settings/File/Settings | Verify that you have an option to change Image Resolution, Image Format and Quality | | Change Image Resolution to another supported resolution | Verify that you can take stills with various resolutions | | Select Flash always on from the settings menu | Verify that when photo is taken, the flash is always triggered | | Select No Flash on from the menu | Verify that despite the lack of natural light, the flash will not trigger when taking photos | | Change Image Format to another supported format | Verify that you can take stills with various Image Formats | | Select Settings/Device/Secondary Device | Verify that you can see the view from the Front Facing Camera on the viewfinder | | | Verify that you can take still images from the Front Facing Camera | | Select Settings/File/Exit | Verify that the application has now closed | ")); }, take_a_video: function() { // Test meta data testTitle = "Multimedia - Video Camera, Take Video"; testBinary = "camera"; testSource = "qt5/qtmultimedia/examples/camera" testGoal = "Verify that the camera can capture and save an audio/video file."; testPreconditions = "None"; testGroups = "BAT, 1.2"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select Video icon to put camera in video mode | Verify the intended scene is reproduced in the preview/viewfinder | | Select Record Video | Verify that video is shown on screen for preview | | Select Stop | Verify that the recording has now stopped | | | Verify that the video file is available in the camera preview pane | | Select given video | Verify that it is a true representation of the intended screen | | | Verify the image has no unintended artifacts and noise and is properly formatted | ")); }, change_video_settings: function() { // Test meta data testApplication = "Multimedia - Video Camera, Change Video Settings"; testBinary = "camera"; testSource = "qt5/qtmultimedia/examples/camera" testGoal = "Verify that the camera can change its Video settings successfully."; testPreconditions = "None"; testGroups = "BAT"; // Test steps prompt(twiki("---+++ " + testTitle + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | If device has lens cover, make sure it is open | | | Select Video tab to put camera in video mode | Verify the intended scene is reproduced in the preview/viewfinder | | In the Menu Bar, select Settings/Devices | Verify that you can select Primary and Secondary Camera on Device | | Select Secondary Camera | Verify that devise is now showing video stream from Front Facing camera | | Select Settings/File/Settings | Verify that you now have the option to select Audio Codecs, Resolution Sample Rate, Framerate, Quality, Video Codecs and Container Format | | Change Audio Codecs to another supported Codecs | Verify that camera can record | | Change Resolution to another supported Resolution | Verify that camera can record | | Change Sample Rate to another supported Sample Rate | Verify that camera can record | | Change Framerate to another supported Framerate | Verify that camera can record | | Change Quality | Verify that camera can record | | Change Video Codecs to another supported Video Codecs | Verify that camera can record | | Change Container Format | Verify that camera can record | | Change Quality | Verify that camera can record | ")); }, } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/video_playback/000077500000000000000000000000001225012771600313245ustar00rootroot00000000000000sys_video.qtt000066400000000000000000000240111225012771600340010ustar00rootroot00000000000000qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/systemtests/video_playback/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia testcase = { /* Notes Ensure 2 test .mp4 files are available on device Ensure the device can ping destinations on the network (if applicable) Have a video stream url available (e.g. http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4) Ensure access to Internet available to device Ensure an active SIM card is available on the device. As some video streaming tests are carrier specific, it is recommended in Australia to have access to Testra, Optus and Vodafone SIM's. */ initTestCase: function() { }, play_a_video_file_data: { mp4:[".mp4", "filename", "mpeg video layer 4"] }, play_a_video_file: function(extension, filename, format) { // Test meta data testApplication = "Multimedia - Play Video File"; testBinary = "player"; testGoal = "Verify that local, networked and carrier streamed video files can be played. "; testPreconditions = "1. A test "+extension+" file is available on device.
2. Internet access is enabled on the device.
3. Operator SIM cards are available to the device"; testGroups = "BAT"; // Test steps prompt(twiki("---+++ " + testApplication + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select [Open] | | | In [Open File] select the "+filename+extension+" file to return to player UI | | | Select [Play] to play the file | Verify selected file has populated playlist | | Highlight file in playlist by clicking on it | | | Select [Play] | Verify that .MP4 file is playing on device | ")); }, basic_controls_for_video_data: { mp4:[".mp4", "filename", "mpeg video layer 4"] }, basic_controls_for_video: function(extension, filename, format) { // Test meta data testApplication = "Multimedia - Video Controls"; testBinary = "player"; testGoal = "Verify the API for basic video playback functionality"; testPreconditions = "a test "+extension+" file is available on device."; testGroups = "BAT"; // Test steps prompt(twiki("---+++ " + testApplication + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | Select [Open] | | | In [Open File] select the "+filename+extension+" file to return to player UI | | | Select [Play] to play the file | | | Select [Pause] | Verify that file has paused | | | Verify that the [Pause] icon has changed to a [Play] icon | | Select [Play] | Verify that the [Play] icon has changed to a [Pause] icon | | | Verify that file continues to play from where previously paused. | | Select [Next File] | Verify that next file in playlist is playing from start | | After some time (10-20 sec) Select [Beginning of File] control | Verify that current file is being played from start | | Let arbitrary time pass, then Select [Beginning of File] control twice in quick succession.| Verify that previous file in playlist is playing from start | | Select [Stop] | Verify that file has stopped playing | | Select [Play] | Verify that file continues to play from start of file. | | Let file play till end | Verify player stops at end of file. | | Start playing file. | | | After arbitrary time, Select [Stop] | | | Select [Next File] | Verify that next file in playlist is highlighted | | | Verify that file is not automatically playing | | Select [Beginning of File] | Verify that previous file in playlist is highlighted | | Select file in playlist | Verify that file plays in player. | | Select number of files greater than can be displayed without scrolling in to playlist | Verify that list can be scrolled through | | With file playing, verify that hardware keys can change volume up and down | | | With file playing, verify that UI volume control slider can change volume up and down | | | Select volume at 50% (or thereabout) | | | Select [Mute] control | Verify that sound is muted while file is playing | | | Verify that [Mute] control is displaying the Muted icon | | Select [Mute] control again | Verify that sound has reverted back to level selected prior to muting | | Drag positional slider to right, then release | Verify that player continues to play file at later part of file | | Drag positional slider to left, then release | Verify that player continues to play file at earlier part of file | | Start playing file | | | Select [FullScreen] control | Verify that video is now playing in Fullscreen mode | | When at end of current file | Verify that next file in playlist is being played | | When at last file in playlist and at end of file | Verify that fullscreen mode is exited and user returned to player interface and that [FullScreen] is no longer selected. | ")); }, seek_controls_for_video: function() { // Test meta data testApplication = "Multimedia - Video Seek"; testBinary = "player"; testGoal = "Verify the API for Fast Forward/Rewind functionality."; testPreconditions = "Video files are available for testing on the device."; testGroups = "BAT"; // Test steps prompt(twiki("---+++ " + testApplication + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | While playing a video file, Select or Tap on Forward control | Verify that playback has moved five seconds forward | | Select or Tap Back control | Verify that playback has moved 5 seconds back | ")); }, basic_controls_for_streamed_content: function() { //*Note* For this test you need a playlist of streaming media urls. Suggest: http://202.6.74.107:8060/triplej.mp3 ; http://www.abc.net.au/streaming/triplej.asx ; rtsp://media1.abc.net.au/broadcast/triplej.rm ; mms://media3.abc.net.au/triplej ; depending on your platform and backend support. A stream that I have found that works is: http://chaos.troll.no/~tavestbo/webkit/mediaelement/transformers640.ogg // Test meta data testApplication = "Multimedia - Content Streaming"; testBinary = "Video player"; testGoal = "Verify various forms of video streaming."; testPreconditions = "For now you need to eddit the .qml file and hardcode the following URI: http://chaos.troll.no/~tavestbo/webkit/mediaelement/transformers640.ogg"; testGroups = "BAT"; // Test steps prompt(twiki("---+++ " + testApplication + "

*Goal:* " + testGoal + "
*Pre-Requisites:* " + testPreconditions + "
*Tested Binary:* " + testBinary + "
| *Step* | *Verification* | | Launch " + testBinary + " | App launches normally | | In Video player application, Select or Tap Play | Verify that the video stream plays in the application | | Select [Pause] | Verify that stream is paused on device | | | Verify that the [Pause] button has changed to a [Play] button | | Select [Play] again | Verify that stream is playing on device | | Select [Stop] | | | During stream playback, have headphones connected to device | Verify that the sound is now playing through the headphones | | Invoke a system notification on the device (such as an incoming SMS) | Verify that the device correctly transmits the audible system notification through the devices speakers and then returns to playing the stream through the headphones | ")); }, } qtmultimedia-opensource-src-touch-5.1.1+git20131205+8230c02/tests/tests.pro000066400000000000000000000001571225012771600256300ustar00rootroot00000000000000TEMPLATE = subdirs SUBDIRS += auto # Disabled since we don't have any source. # SUBDIRS += benchmarks manual