pax_global_header00006660000000000000000000000064152530076670014525gustar00rootroot0000000000000052 comment=54c3b153257d8e21d5ccd5603f7bea2db57d5ce4 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/000077500000000000000000000000001525300766700206755ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/.gitignore000066400000000000000000000002231525300766700226620ustar00rootroot00000000000000target/ build/ _build/ builddir/ build-aux/app build-aux/.flatpak-builder/ src/config.rs *.ui.in~ *.ui~ .flatpak/ vendor .vscode .flatpak-builder/ bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/.gitlab-ci.yml000066400000000000000000000033521525300766700233340ustar00rootroot00000000000000image: 'registry.fedoraproject.org/fedora:latest' stages: - check - test - deploy include: - project: "GNOME/citemplates" file: "flatpak/flatpak_ci_initiative.yml" - project: "GNOME/citemplates" file: "templates/basic-release-with-dist.yml" inputs: dist-job-name: "flatpak" - project: "GNOME/citemplates" file: "templates/default-rules.yml" variables: BUNDLE: "bustle-nightly.flatpak" MANIFEST_PATH: "build-aux/org.freedesktop.Bustle.Devel.json" FLATPAK_MODULE: "bustle" APP_ID: "org.freedesktop.Bustle.Devel" RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" flatpak: extends: ".flatpak@x86_64" publish-nightly: extends: ".publish_nightly" needs: ["flatpak"] # Configure and run rustfmt # Exits and builds fails if on bad format rustfmt: image: "rust:slim" stage: check script: - rustup component add rustfmt # Create blank versions of our configured files # so rustfmt does not yell about non-existent files or completely empty files - echo -e "" >> src/config.rs - rustc -Vv && cargo -Vv - cargo fmt --version - cargo fmt --all -- --color=always --check codespell: stage: check script: - dnf install --quiet -y codespell - codespell -L crate,trough -S "*.po,target,_build" -f check-potfiles: stage: check script: - dnf install --quiet -y gettext python3 - curl --proto '=https' --tlsv1.2 -sSf -O https://gitlab.gnome.org/msandova/check-potfiles/-/raw/master/check_potfiles.py - python3 check_potfiles.py --directory src --directory data cargo-deny: stage: test interruptible: true allow_failure: true script: - dnf install --quiet -y cargo-deny cargo - cargo-deny --version - cargo-deny check bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/CONTRIBUTING.md000066400000000000000000000070141525300766700231300ustar00rootroot00000000000000# Contributing > This document is based on Fractal's [CONTRIBUTING.md](https://gitlab.gnome.org/World/fractal/-/blob/7a35b0ac596b5a6c0704270bcb6ce4fa809d2947/CONTRIBUTING.md) file, which is licensed under the GNU General Public License v3.0. ## Newcomers [Bustle](https://gitlab.gnome.org/World/bustle) follows the [GNOME Newcomers workflow](https://welcome.gnome.org/app/Bustle/#getting-the-app-to-build). Check out these pages to learn how to contribute. Here are also a few links to help you get started with Rust and the GTK Rust bindings: - [Learn Rust](https://www.rust-lang.org/learn) - [GUI development with Rust and GTK 4](https://gtk-rs.org/gtk4-rs/stable/latest/book) - [gtk-rs website](https://gtk-rs.org/) Don't hesitate to join [our Matrix room](https://matrix.to/#/#bustle:gnome.org) to come talk to us and ask us any questions you might have. ## Build Instructions ### Setting up Your Development Environment Bustle is written in Rust, so you will need to have at least Rust 1.85 and Cargo available on your system. If you're building Bustle with Flatpak (via GNOME Builder or the command line), you will need to manually add the necessary remotes and install the required Freedesktop extensions: ```sh # Add Flathub and the gnome-nightly repo flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak remote-add --user --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo # Install the gnome-nightly Sdk and Platform runtime flatpak install --user gnome-nightly org.gnome.Sdk//master org.gnome.Platform//master # Install the required rust-stable extension from Flathub flatpak install --user flathub org.freedesktop.Sdk.Extension.rust-stable//25.08 ``` If you are building the flatpak manually you will also need flatpak-builder on your system, or the `org.flatpak.Builder` flatpak. ### Developing with Flatpak Using [GNOME Builder](https://apps.gnome.org/Builder/) or [Flatpak VSCode Extension](https://github.com/bilelmoussaoui/flatpak-vscode) is the recommended way of building and installing Bustle. ## Committing Please follow the [GNOME commit message guidelines](https://handbook.gnome.org/development/commit-messages.html). ## Creating a Merge Request Before submitting a merge request, make sure that [your fork is available publicly](https://gitlab.gnome.org/help/user/public_access.md), otherwise CI won't be able to run. Use the title of your commit as the title of your MR if there's only one. Otherwise, it should summarize all your commits. If your commits do several tasks that can be separated, open several merge requests. In the details, write a more detailed description of what it does. If your changes include a change in the UI or the UX, provide screenshots in both light and dark mode, and/or a screencast of the new behavior. Don't forget to mention the issue that this merge request solves or is related to, if applicable. GitLab recognizes the syntax `Closes #XXXX` or `Fixes #XXXX` that will close the corresponding issue accordingly when your change is merged. We expect to always work with a clean commit history. When you apply fixes or suggestions, [amend](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---amend) or [fixup](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt) and [squash](https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---autosquash) your previous commits that you can then [force push](https://git-scm.com/docs/git-push#Documentation/git-push.txt--f). bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/COPYING000066400000000000000000000636421525300766700217430ustar00rootroot00000000000000 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! bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/Cargo.lock000066400000000000000000001122511525300766700226040ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "aho-corasick" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] [[package]] name = "anyhow" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "async-broadcast" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-recursion" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", "syn 2.0.119", ] [[package]] name = "async-trait" version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", ] [[package]] name = "autocfg" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "base64" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "bitflags" version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bumpalo" version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bustle" version = "0.10.0" dependencies = [ "anyhow", "base64", "formatx", "futures-util", "gettext-rs", "gtk4", "indexmap", "libadwaita", "pcap-file", "shell-escape", "tokio", "tracing", "tracing-subscriber", "zbus", ] [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "byteorder_slice" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b294e30387378958e8bf8f4242131b930ea615ff81e8cac2440cea0a6013190" dependencies = [ "byteorder", ] [[package]] name = "bytes" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cairo-rs" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df683f1d30b457964673a5541a4603208ef95ab6873d2a55871895cf310f3b56" dependencies = [ "bitflags", "cairo-sys-rs", "glib", "libc", ] [[package]] name = "cairo-sys-rs" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee548131103ad8f698c6725669647b9c757b3b66992dd6a026037596417bee21" dependencies = [ "glib-sys", "libc", "system-deps 9.0.0", ] [[package]] name = "cc" version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" dependencies = [ "find-msvc-tools", "shlex", ] [[package]] name = "cfg-expr" version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4ece8474b5f766c63426647e7b4b316b67431ade1036a8313cee24a03ae917" dependencies = [ "smallvec", "target-lexicon", ] [[package]] name = "cfg-if" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "derive-into-owned" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9d94d81e3819a7b06a8638f448bc6339371ca9b6076a99d4a43eece3c4c923" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "endi" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enumflags2" version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", ] [[package]] name = "enumflags2_derive" version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", "syn 2.0.119", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", "windows-sys", ] [[package]] name = "event-listener" version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ "parking", "pin-project-lite", ] [[package]] name = "event-listener-strategy" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", ] [[package]] name = "fastrand" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "field-offset" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ "memoffset", "rustc_version", ] [[package]] name = "find-msvc-tools" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "formatx" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59d4b42303d6fdd5f2e058d7a420103752ec6c4bf260c08abd86a14ea5223a3" [[package]] name = "futures-channel" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", ] [[package]] name = "futures-core" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-lite" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", "futures-io", "parking", "pin-project-lite", ] [[package]] name = "futures-macro" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", ] [[package]] name = "futures-task" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-macro", "futures-task", "pin-project-lite", "slab", ] [[package]] name = "gdk-pixbuf" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f420376dbee041b2db374ce4573892a36222bb3f6c0c43e24f0d67eae9b646" dependencies = [ "gdk-pixbuf-sys", "gio", "glib", "libc", ] [[package]] name = "gdk-pixbuf-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5209294ba3775f9b650bf78bfadeba4332089f2329b3e2f6ce0a4957a45bff" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", "system-deps 9.0.0", ] [[package]] name = "gdk4" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d81e2a6c6ecba2aab60633a98df1868b03fa0bfdce8105edc27c1bccf71f0e39" dependencies = [ "cairo-rs", "gdk-pixbuf", "gdk4-sys", "gio", "glib", "libc", "pango", ] [[package]] name = "gdk4-sys" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d8f608d8d7d229975c4d0d026f5d3071598c4ddab3c5262b0a31840fec78d13" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gio-sys", "glib-sys", "gobject-sys", "libc", "pango-sys", "pkg-config", "system-deps 7.0.8", ] [[package]] name = "getrandom" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", "r-efi", ] [[package]] name = "gettext-rs" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9df5e3fa8c077b15fdfa8ce130e2bc73d663b8aaa6d51b71421b8659980b1d80" dependencies = [ "gettext-sys", "locale_config", ] [[package]] name = "gettext-sys" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4caa7e4460b196107cc1bb2629488e8b6dbb7f34f6683ea6753c4ac22f590785" dependencies = [ "cc", "temp-dir", ] [[package]] name = "gio" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b399f4650bb52c051f3fdf49a234e8a27ab5725c8cd774556c55eee64b2c0350" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-util", "gio-sys", "glib", "libc", "pin-project-lite", "smallvec", ] [[package]] name = "gio-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c28739f914c15b87a9856000bed9cbd5b3a8afbca5e982d9a299e1601422cb5" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps 9.0.0", "windows-sys", ] [[package]] name = "glib" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18b9b8d350db41f690ec1b87109f202782748bbd8ab2f2ede17cb40d29e2838c" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", "memchr", "smallvec", ] [[package]] name = "glib-macros" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9597c68fa7bdf4154a3079642cd21c4dccac0b0bdd2897d82861523bf91e7b9" dependencies = [ "heck", "proc-macro2", "quote", "syn 3.0.6", ] [[package]] name = "glib-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99b38907e67e40dec9b60f858bcada952598719cb512a13eb13d6cdcd16f8295" dependencies = [ "libc", "system-deps 9.0.0", ] [[package]] name = "gobject-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07595c9ba696bd9819cb6a8df39f08078f3dd679508fe052dd558492c2053834" dependencies = [ "glib-sys", "libc", "system-deps 9.0.0", ] [[package]] name = "graphene-rs" version = "0.22.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb856b9c558971c3f13ab692358926da710b046932a4e087aedcc35b040d7dff" dependencies = [ "glib", "graphene-sys", ] [[package]] name = "graphene-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97842c7543828f98aa5583aa54fcda28aa84fa2b0f8c556142177f7bbb638057" dependencies = [ "glib-sys", "libc", "system-deps 9.0.0", ] [[package]] name = "gsk4" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b867be1c5f14dcb8f552c0eff6e9a9b1da5f8b43943e8efc3a63c889d84952ff" dependencies = [ "cairo-rs", "gdk4", "glib", "graphene-rs", "gsk4-sys", "libc", "pango", ] [[package]] name = "gsk4-sys" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b7c7eb2e681ee896646cfb8872b431f24d09f53ba9283289d9b10caa6707088" dependencies = [ "cairo-sys-rs", "gdk4-sys", "glib-sys", "gobject-sys", "graphene-sys", "libc", "pango-sys", "system-deps 7.0.8", ] [[package]] name = "gtk4" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98a0a0466484f64b07b5b8184d43fa46be78eb0b8e04ae4e179af31d770b76d9" dependencies = [ "cairo-rs", "field-offset", "futures-channel", "gdk-pixbuf", "gdk4", "gio", "glib", "graphene-rs", "gsk4", "gtk4-macros", "gtk4-sys", "libc", "pango", ] [[package]] name = "gtk4-macros" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ac7179400a36a04de039c24206bb841c5596992b907b43b23ee8d5bdc40d00e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.119", ] [[package]] name = "gtk4-sys" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82b8f954786af0b1984425c4446b77f5ff6594346181316be3f850caab1c6f01" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "graphene-sys", "gsk4-sys", "libc", "pango-sys", "system-deps 7.0.8", ] [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "indexmap" version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "js-sys" version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libadwaita" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b9900e67182a4b5b1f157b448d94f0715c8b9770cce21cf000801917f53bfa" dependencies = [ "gdk4", "gio", "glib", "gtk4", "libadwaita-sys", "pango", ] [[package]] name = "libadwaita-sys" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3c27642b389852aa99341bd4a4c19ec6f8a2b63ebdd7f5ba1952198079ccd" dependencies = [ "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "gtk4-sys", "libc", "pango-sys", "system-deps 7.0.8", ] [[package]] name = "libc" version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ "lazy_static", "objc", "objc-foundation", "regex", "winapi", ] [[package]] name = "log" version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ "libc", ] [[package]] name = "memchr" version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "mio" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "wasi", "windows-sys", ] [[package]] name = "nu-ansi-term" version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ "windows-sys", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ "block", "objc", "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ "objc", ] [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "ordered-stream" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ "futures-core", "pin-project-lite", ] [[package]] name = "pango" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b2022dbbd82e1c42bd950a6f1df9b98c796e725dce5ec275e03cbf9772e4efa" dependencies = [ "gio", "glib", "pango-sys", ] [[package]] name = "pango-sys" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca02d64761b74d56cdd4b437db6d73dc95e6c0d40f27e1c707952c0f09052948" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps 9.0.0", ] [[package]] name = "parking" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "pcap-file" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc1f139757b058f9f37b76c48501799d12c9aa0aa4c0d4c980b062ee925d1b2" dependencies = [ "byteorder_slice", "derive-into-owned", "thiserror", ] [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "proc-macro-crate" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "regex" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys", ] [[package]] name = "rustversion" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", ] [[package]] name = "serde_repr" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", ] [[package]] name = "serde_spanned" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] [[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shell-escape" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" [[package]] name = "shlex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ "errno", "libc", ] [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" [[package]] name = "socket2" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys", ] [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-deps" version = "7.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "system-deps" version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a0dae2cbca1f0ff93795713cfe0a4c02f760e3c0b8ae2ab4ec4045808ff429f" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "temp-dir" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom", "once_cell", "rustix", "windows-sys", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn 2.0.119", ] [[package]] name = "thread_local" version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "tokio" version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", "mio", "pin-project-lite", "signal-hook-registry", "socket2", "tracing", "windows-sys", ] [[package]] name = "toml" version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", "serde_core", "serde_spanned", "toml_datetime", "toml_parser", "toml_writer", "winnow", ] [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" version = "0.25.15+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" dependencies = [ "indexmap", "toml_datetime", "toml_parser", "winnow", ] [[package]] name = "toml_parser" version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] [[package]] name = "toml_writer" version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tracing" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", "syn 2.0.119", ] [[package]] name = "tracing-core" version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", ] [[package]] name = "tracing-log" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "nu-ansi-term", "sharded-slab", "smallvec", "thread_local", "tracing-core", "tracing-log", ] [[package]] name = "uds_windows" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", "windows-sys", ] [[package]] name = "unicode-ident" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "uuid" version = "1.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ "js-sys", "serde_core", "wasm-bindgen", ] [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version-compare" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "winnow" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "zbus" version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" dependencies = [ "async-broadcast", "async-recursion", "async-trait", "enumflags2", "event-listener", "futures-core", "futures-lite", "hex", "libc", "ordered-stream", "rustix", "serde", "serde_repr", "tokio", "tracing", "uds_windows", "uuid", "windows-sys", "winnow", "zbus_macros", "zbus_names", "zvariant", ] [[package]] name = "zbus_macros" version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn 3.0.6", "zbus_names", "zvariant", "zvariant_utils", ] [[package]] name = "zbus_names" version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", "winnow", "zvariant", ] [[package]] name = "zcheapstr" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" dependencies = [ "serde", ] [[package]] name = "zvariant" version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" dependencies = [ "endi", "enumflags2", "serde", "winnow", "zcheapstr", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn 3.0.6", "zvariant_utils", ] [[package]] name = "zvariant_utils" version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" dependencies = [ "proc-macro2", "quote", "serde", "syn 3.0.6", "winnow", ] bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/Cargo.toml000066400000000000000000000014361525300766700226310ustar00rootroot00000000000000[package] name = "bustle" version = "0.10.0" authors = ["The Freedesktop community"] edition = "2024" rust-version = "1.92" license = "LGPL-2.1-or-later" [profile.release] lto = true [dependencies] adw = { package = "libadwaita", version = "0.9", features = ["v1_8"] } anyhow = "1.0.69" formatx = "0.4.2" futures-util = "0.3.31" gettext-rs = { version = "0.8", features = ["gettext-system"] } gtk = { version = "0.11.4", package = "gtk4", features = ["gnome_47", "v4_24"] } indexmap = "2.2.1" pcap-file = "2.0.0" shell-escape = "0.1.5" tokio = { version = "1.0", default-features = false, features = [ "rt-multi-thread", ] } tracing = "0.1.36" tracing-subscriber = "0.3.15" zbus = { version = "5.6", default-features = false, features = [ "tokio", ] } [dev-dependencies] base64 = "0.23" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/README.md000066400000000000000000000024151525300766700221560ustar00rootroot00000000000000Download on Flathub # Bustle

Visualize D-Bus activity

Bustle draws sequence diagrams of D-Bus activity, showing signal emissions, method calls and their corresponding returns, with timestamps for each individual event and the duration of each method call. This can help you check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based application isn't performing as well as you like. It also provides statistics like signal frequencies and average method call times. ## Screenshots ![screenshot](data/screenshots/bustle-diagram.png) ## Hack on Bustle To build the development version of Bustle and hack on the code see the [general guide](https://welcome.gnome.org/en/app/Bustle/) for building GNOME apps with Flatpak and GNOME Builder. ## Translations Helping to translate Bustle or add support to a new language is very welcome. You can find everything you need at: [l10n.gnome.org/module/bustle/](https://l10n.gnome.org/module/bustle/) ## Code Of Conduct This project follows the [GNOME Code of Conduct](https://conduct.gnome.org/). bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/build-aux/000077500000000000000000000000001525300766700225675ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/build-aux/dist-vendor.sh000066400000000000000000000022341525300766700253620ustar00rootroot00000000000000#!/bin/sh # Since Meson invokes this script as # "/bin/sh .../dist-vendor.sh ARG" we can't rely on bash features set -eu export CARGO_HOME="$1" export CARGO_TARGET_DIR="$2" cd "$MESON_SOURCE_ROOT" mkdir "$MESON_PROJECT_DIST_ROOT"/.cargo # cargo-vendor-filterer can be found at https://github.com/coreos/cargo-vendor-filterer # It is also part of the Rust SDK extension. cargo vendor-filterer --all-features --platform=x86_64-unknown-linux-gnu --platform=aarch64-unknown-linux-gnu > "$MESON_PROJECT_DIST_ROOT"/.cargo/config.toml set -- vendor/gettext-sys/gettext-*.tar.* TARBALL_PATH=$1 TARBALL_NAME=$(basename "$TARBALL_PATH") rm -f "$TARBALL_PATH" # remove the tarball from checksums cargo_checksum='vendor/gettext-sys/.cargo-checksum.json' tmp_f=$(mktemp --tmpdir='vendor/gettext-sys' -t) jq -c "del(.files[\"$TARBALL_NAME\"])" "$cargo_checksum" > "$tmp_f" mv -f "$tmp_f" "$cargo_checksum" # Don't combine the previous and this line with a pipe because we can't catch # errors with "set -o pipefail" sed -i 's/^directory = ".*"/directory = "vendor"/g' "$MESON_PROJECT_DIST_ROOT/.cargo/config.toml" # Move vendor into dist tarball directory mv vendor "$MESON_PROJECT_DIST_ROOT" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/build-aux/org.freedesktop.Bustle.Devel.json000066400000000000000000000021641525300766700310610ustar00rootroot00000000000000{ "id": "org.freedesktop.Bustle.Devel", "runtime": "org.gnome.Platform", "runtime-version": "master", "sdk": "org.gnome.Sdk", "sdk-extensions": [ "org.freedesktop.Sdk.Extension.rust-stable" ], "command": "bustle", "finish-args": [ "--device=dri", "--env=G_MESSAGES_DEBUG=none", "--env=RUST_BACKTRACE=1", "--env=RUST_LOG=bustle=debug", "--share=ipc", "--socket=fallback-x11", "--socket=session-bus", "--socket=wayland" ], "build-options": { "append-path": "/usr/lib/sdk/rust-stable/bin", "build-args": [ "--share=network" ], "test-args": [ "--socket=x11", "--share=network" ] }, "modules": [ { "name": "bustle", "buildsystem": "meson", "run-tests": true, "config-opts": [ "-Dprofile=development" ], "sources": [ { "type": "dir", "path": "../" } ] } ] } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/bustle.doap000066400000000000000000000056741525300766700230540ustar00rootroot00000000000000 Bustle Visualize D-Bus activity Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, method calls and their corresponding returns, with time stamps for each individual event and the duration of each method call. This can help you check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based application is not performing as well as you like. It also provides statistics like signal frequencies and average method call times. Rust Maximiliano Sandoval msandova msandova Bilal Elmoussaoui bilelmoussaoui bilelmoussaoui Dave Patrick Caberto SeaDve SeaDve Will Thompson wjt wjt bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/000077500000000000000000000000001525300766700216065ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/icons/000077500000000000000000000000001525300766700227215ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/icons/meson.build000066400000000000000000000004241525300766700250630ustar00rootroot00000000000000install_data( '@0@.svg'.format(application_id), install_dir: iconsdir / 'hicolor' / 'scalable' / 'apps' ) install_data( '@0@-symbolic.svg'.format(base_id), install_dir: iconsdir / 'hicolor' / 'symbolic' / 'apps', rename: '@0@-symbolic.svg'.format(application_id) ) org.freedesktop.Bustle-symbolic.svg000066400000000000000000000045261525300766700315470ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/icons bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/icons/org.freedesktop.Bustle.Devel.svg000066400000000000000000000464441525300766700310520ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/icons/org.freedesktop.Bustle.svg000066400000000000000000000214041525300766700300010ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/meson.build000066400000000000000000000041461525300766700237550ustar00rootroot00000000000000subdir('icons') subdir('resources') # Desktop file desktop_conf = configuration_data() desktop_conf.set('icon', application_id) desktop_file = i18n.merge_file( type: 'desktop', input: configure_file( input: '@0@.desktop.in.in'.format(base_id), output: '@BASENAME@', configuration: desktop_conf ), output: '@0@.desktop'.format(application_id), po_dir: podir, install: true, install_dir: datadir / 'applications' ) # Validate Desktop file if desktop_file_validate.found() test( 'validate-desktop', desktop_file_validate, args: [ desktop_file.full_path() ], depends: desktop_file, ) endif # Appdata appdata_conf = configuration_data() appdata_conf.set('app-id', application_id) appdata_conf.set('gettext-package', gettext_package) appdata_file = i18n.merge_file( input: configure_file( input: '@0@.metainfo.xml.in.in'.format(base_id), output: '@BASENAME@', configuration: appdata_conf ), output: '@0@.metainfo.xml'.format(application_id), po_dir: podir, install: true, install_dir: datadir / 'metainfo' ) # Validate Appdata if appstreamcli.found() test( 'validate-appdata', appstreamcli, args: [ 'validate', '--no-net', '--explain', appdata_file ], depends: appdata_file, ) endif # GSchema gschema_conf = configuration_data() gschema_conf.set('app-id', application_id) gschema_conf.set('gettext-package', gettext_package) configure_file( input: '@0@.gschema.xml.in'.format(base_id), output: '@0@.gschema.xml'.format(application_id), configuration: gschema_conf, install: true, install_dir: datadir / 'glib-2.0' / 'schemas' ) # Validate GSchema if glib_compile_schemas.found() test( 'validate-gschema', glib_compile_schemas, args: [ '--strict', '--dry-run', meson.current_build_dir() ], ) endif # D-Bus service service_conf = configuration_data() service_conf.set('app-id', application_id) service_conf.set('bindir', bindir) configure_file( input: '@0@.service.in'.format(base_id), output: '@0@.service'.format(application_id), configuration: service_conf, install_dir: datadir / 'dbus-1' / 'services' ) bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/org.freedesktop.Bustle.desktop.in.in000066400000000000000000000013201525300766700305450ustar00rootroot00000000000000[Desktop Entry] Name=Bustle Comment=Visualize D-Bus activity Type=Application Exec=bustle %F Terminal=false Categories=GTK;Development;Debugger;Profiling; # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=debug;profile;d-bus;dbus;sequence;monitor; # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=@icon@ DBusActivatable=true StartupNotify=true MimeType=application/vnd.tcpdump.pcap; Actions=new-window; [Desktop Action new-window] Exec=bustle --new-window Name=New Window # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=window-new bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/org.freedesktop.Bustle.gschema.xml.in000066400000000000000000000010271525300766700307010ustar00rootroot00000000000000 900 Window width 600 Window height false Window maximized state org.freedesktop.Bustle.metainfo.xml.in.in000066400000000000000000000175351525300766700314350ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data @app-id@ @app-id@.desktop CC-BY-SA-3.0 Bustle Visualize D-Bus activity

Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, method calls and their corresponding returns, with time stamps for each individual event and the duration of each method call. This can help you check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based application is not performing as well as you like. It also provides statistics like signal frequencies and average method call times.

LGPL-2.1-or-later https://static.gnome.org/appdata/circle/org.freedesktop.Bustle/9.1/bustle-diagram.png Explore sequence diagrams of D-Bus activity https://static.gnome.org/appdata/circle/org.freedesktop.Bustle/9.1/bustle-statistics.png See statistics summarizing the log https://static.gnome.org/appdata/circle/org.freedesktop.Bustle/9.1/bustle-welcome.png Relax with this soothing greyscale welcome page https://apps.gnome.org/Bustle/ https://gitlab.gnome.org/World/bustle/issues https://welcome.gnome.org/app/Bustle/ https://l10n.gnome.org/module/bustle/ https://gitlab.gnome.org/World/bustle https://matrix.to/#/#bustle:gnome.org will_at_willthompson.co.uk bustle bustle.desktop application/vnd.tcpdump.pcap

Minor release.

  • Improve pcap detection
  • Change record-address keybinding
  • Improve generation of busctl commands

Minor release.

  • Use newer features from libadwaita
  • Various bugfixes

Minor release.

  • Various bugfixes
  • Updated translations
  • Added "Copy as busctl" to copy commands
  • Add tag for secret service related messages
  • Fix open in new window

Minor release.

  • Various bugfixes
  • Updated translations

Minor release.

  • Use newer widgets from libadwaita 1.6
  • Use dbus-monitor for recording
  • Updated translations

Minor bugfix release.

  • metainfo: Add branding color

Translation updates:

  • Ukrainian (Yuri Chornoivan)

Minor bugfix release. Added some translations and missing links.

Bustle has been rewritten from scratch in Rust, in the process it was ported to GTK 4 and libadwaita.

  • The filtering and statistic views have been improved
  • Adaptive design
  • Improved performance

Bustle has a new icon, kindly provided by Tobias Bernard.

Closing a window without saving a recorded log no longer prompts for confirmation. Anecdotally, most users just want to record and read logs, not save them.

Bustle now uses GLib's implementation of the D-Bus wire protocol throughout. The only user-facing consequence is that message bodies are now pretty-printed in the GVariant text format.

Since Bustle no longer depends on any GPL libraries, the project license has been simplified to plain LGPL 2.1 or later.

As well as being able to filter out messages involving certain services, you can now also filter messages to only show certain services.

In the details for an error reply, the error name is now shown, and the error message is formatted more legibly.

The default file extension for log files is now ‘.pcap’, reflecting what they actually are.

Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in practice means that your file manager will offer to open pcap files with Bustle.

You can now explore messages while they're being recorded. Filtering, statistics and exporting are still only available once you stop recording.

The raw sender and destination for each message is now shown in the details pane.

Bytestrings with embedded NULs which are otherwise ASCII are now shown as ASCII strings.

It's now possible to monitor the system bus (from the user interface and with the bustle-pcap command-line tool), with no need to reconfigure the system bus. It's also possible to monitor an arbitrary bus by address.

Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on your system.

keyboard pointing touch 360 The Bustle developers The Bustle developers #99c1f1 #613583
bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/org.freedesktop.Bustle.service.in000066400000000000000000000001121525300766700301250ustar00rootroot00000000000000[D-BUS Service] Name=@app-id@ Exec=@bindir@/bustle --gapplication-service bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/000077500000000000000000000000001525300766700236205ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/000077500000000000000000000000001525300766700247335ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/000077500000000000000000000000001525300766700265015ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/actions/000077500000000000000000000000001525300766700301415ustar00rootroot00000000000000expander-arrow-symbolic.svg000066400000000000000000000003521525300766700353600ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/actionsbustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status/000077500000000000000000000000001525300766700300245ustar00rootroot00000000000000dock-right-symbolic-rtl.svg000066400000000000000000000042661525300766700351470ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status dock-right-symbolic.svg000066400000000000000000000010501525300766700343340ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status funnel-symbolic.svg000066400000000000000000000035121525300766700335750ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status question-round-outline-symbolic.svg000066400000000000000000000024721525300766700367630ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status statistics-durations-symbolic.svg000066400000000000000000000023741525300766700365130ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status statistics-frequencies-symbolic.svg000066400000000000000000000024711525300766700370120ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status statistics-sizes-symbolic.svg000066400000000000000000000015051525300766700356330ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/icons/scalable/status bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/meson.build000066400000000000000000000003161525300766700257620ustar00rootroot00000000000000# Resources resources = gnome.compile_resources( 'resources', 'resources.gresource.xml', gresource_bundle: true, source_dir: meson.current_build_dir(), install: true, install_dir: pkgdatadir, ) bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/resources.gresource.xml000066400000000000000000000046531525300766700303610ustar00rootroot00000000000000 icons/scalable/actions/expander-arrow-symbolic.svg icons/scalable/status/dock-right-symbolic-rtl.svg icons/scalable/status/dock-right-symbolic.svg icons/scalable/status/funnel-symbolic.svg icons/scalable/status/statistics-frequencies-symbolic.svg icons/scalable/status/statistics-durations-symbolic.svg icons/scalable/status/statistics-sizes-symbolic.svg icons/scalable/status/question-round-outline-symbolic.svg ui/shortcuts.ui ui/address_dialog.ui ui/details_view.ui ui/diagram.ui ui/diagram_header.ui ui/diagram_row.ui ui/diagram_row_tag.ui ui/diagram_view.ui ui/durations_page.ui ui/filter_pane.ui ui/filter_pane_bus_name_row.ui ui/filter_pane_message_tag_row.ui ui/frequencies_page.ui ui/sizes_page.ui ui/statistics.ui ui/window.ui style.css bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/style.css000066400000000000000000000017071525300766700254770ustar00rootroot00000000000000/* ColorWidget */ colorwidget { border-radius: 50%; } /* DetailsView */ .arguments-view textview, .arguments-view textview text { background: none; } /* DiagramHeader */ .diagram-header-arrow { transition: -gtk-icon-transform 200ms ease-out; } .diagram-header-arrow:dir(ltr) { -gtk-icon-transform: rotate(0.5turn); } .diagram-header-arrow:dir(rtl) { -gtk-icon-transform: rotate(-0.5turn); } .diagram-header-arrow.expanded { -gtk-icon-transform: rotate(0turn); } /* FilterPane */ .filter-pane-row { padding: 6px 12px; } /* ProgressCell */ progress-cell progress { background: var(--accent-bg-color); border-radius: 3px; } progress-cell { min-height: 18px; min-width: 100px; } progress-cell trough { background: color-mix(in srgb, var(--border-opacity) 50%, transparent); border-radius: 3px; } progress-cell label { font-size: 0.9em; padding: 1px 3px; } progress-cell label.in-progress { color: var(--accent-fg-color); } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/000077500000000000000000000000001525300766700242355ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/address_dialog.ui000066400000000000000000000017711525300766700275460ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/details_view.ui000066400000000000000000000225601525300766700272600ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/diagram.ui000066400000000000000000000012211525300766700261740ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/diagram_header.ui000066400000000000000000000020121525300766700275030ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/diagram_row.ui000066400000000000000000000026721525300766700270760ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/diagram_row_tag.ui000066400000000000000000000011631525300766700277230ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/diagram_view.ui000066400000000000000000000021441525300766700272330ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/durations_page.ui000066400000000000000000000115071525300766700276040ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/filter_pane.ui000066400000000000000000000061551525300766700270730ustar00rootroot00000000000000
Select All Tags filter-pane.select-all-message-tags Unselect All Tags filter-pane.unselect-all-message-tags
Select All Names filter-pane.select-all-bus-names Unselect All Names filter-pane.unselect-all-bus-names
bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/filter_pane_bus_name_row.ui000066400000000000000000000032711525300766700316270ustar00rootroot00000000000000 filter_pane_message_tag_row.ui000066400000000000000000000023731525300766700322400ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/frequencies_page.ui000066400000000000000000000074431525300766700301110ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/shortcuts.ui000066400000000000000000000075161525300766700266430ustar00rootroot00000000000000 General Show Shortcuts app.shortcuts New Window app.new-window Close Window window.close Quit app.quit Recording Record Session Bus win.record-session-bus Record System Bus win.record-system-bus Record Address win.record-address Open Log File win.open-log Diagram Save as PCAP File win.save Save as DOT Graph File win.save-dot Filter Services win.filter-services Statistics win.statistics bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/sizes_page.ui000066400000000000000000000127561525300766700267400ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/statistics.ui000066400000000000000000000055751525300766700270020ustar00rootroot00000000000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/resources/ui/window.ui000066400000000000000000000375151525300766700261160ustar00rootroot00000000000000
New _Window app.new-window _Open win.open-log action-disabled Open Pair of Logs win.open-pair-logs action-disabled
Save As…
PCAP win.save DOT Graph win.save-dot
_Statistics win.statistics action-disabled
_Keyboard Shortcuts app.shortcuts _About Bustle win.about
Record Session Bus win.record-session-bus Record System Bus win.record-system-bus Record Address… win.record-address
bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/screenshots/000077500000000000000000000000001525300766700241465ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/screenshots/bustle-diagram.png000066400000000000000000002673741525300766700275770ustar00rootroot00000000000000‰PNG  IHDRß�:Úc IDATxœìÝy\”ÕâðgfÀa“MpA4sMs —Ü·RRs»jv]3ŬŸi¹qÍë–H¹ï™¦7×J3EQKQSrCÜÊR”U•Mfæ÷Î43Ì 30Àóý|øÌ¼ÛyÏ{†’gÎyÏ U`‚ò®@%Ä6%""""¢Ê@QÞ¨LMÃv""""""Ò�A݆JMl""""""Ëa(¡ª‡Íª~ýDDDDDDe©Ê†ñª>«ÚõÙ²*Æ«B­ ×HDDDDDTÑUê ^™ƒie¾6"""""¢ÊªR†ðÊP+ÛõUe•&ˆW–°j‹×a‹u""""""2Ư-ÖÉ,•! –å5T†ö""""""²”² Å:€Wä0iͺ ¬\>Qe¥€uƒr… á1`Z£ÎB+”IDDDDDDEäV(³B…ðо-U_öl•KöŒW˜^‘hië*Ðz-ËsUf% Á ­×²eÒm-|ëê½V.ëZ®kör]÷p+{ÁEÐ à’ÌÌÌÕ«Wïoæõ‘Ož<Ùïîî>E\=x+ßkOʦÆa` ?|CÇz]ªlø67xkï£>‘šrYoðÎÉÉY/‘H:˜u%DDDDDDd²ÜÜÜ3NNNÀpWŸ ]{t]!:Ö«3µ÷»LÂwYÝÏlÍ�¯}�·öÄlê½Þê­UËÈÈXÈàMDDDDDd]‰¤CFFÆBÕ y °zNÓÎrB­ek)“Ni[šLÌØ$kúz½¡cY×psõ{¾ÅGŽéèîîÞÏ2U'""""""CÜÝÝû9r¤#4Ÿ.¥�Ùt…n]ÙOßœ`ÚlæiTeU‘’9Š?¿[ß½Þê½Þê¢4'Z³à$•J#íììêè«Ìö˜l½‘‹¿HmkŠ<&ä+FÏÆŒ v.ïê‘�),,L‹ÅoÈAѬçê¯)—µ‡œëš€M×Ðså1êlfè¹­ô|ë çºêgèžpõeõoL”Ë"v‘‘‘ôïÄŒBŒÜœ†U¿<Å-o³(Üz Ū_žbäæ4$f–w•ˆˆˆˆˆÈ†ØÙÙÕ‰ŒŒì€¢NQåðsíNTc#�¡cYy¼.6Ñû]•(Í,ç†z½Õ—uõz+{º•½ÞÊW’••µÞÙÙ¹½®ŠŒÜœ†[¤&T™Œià+Æö±5Ê»DDDDDdC²³³sqqQŸ|­š¯É ¿÷ÛØÄkÚ½ß63ë¹�5 ·ío?Œ­Óõ¼o‘D"i¬«ðí1Ù Þtë�Ûc²9�¨ ÉÊÊÂÕ«WñÑGaÅŠhÕªPXXˆ={öàèÑ£¸{÷.\\\ЩS'Lœ8ÎÎÿü?âÆ�X»v-nÞ¼‰Zµj¡ÿþ8""*¡ŒŒ lÙ²µjÕ|ðÁøî»ï�œœ\lßÜÜ\$%%ÁÉÉ 5jÔ@jj* Aƒû5lØTÛ •¡´hÑ" $$Ä些rþ—^z Í›77¹L]tÕYٻܻwotëÖ &LÀÅ‹‹kèüB¡ýúõCvv6†ŽiÓ¦!44-[¶Dhh(àþýûøã�?põêU¤§§›tnCÛµË3¥ Kò9+mݺqqqhÑ¢QeóüùóRo¥ÜÜ\…B£·Néa(×)Ô¶«OƦ¤¾]}t]3¢kŸ³Ü‚{y‡oS10WQR©ëÖ­Cdd¤ªÇD©Q£FX¾|¹Æ·e-<<{öì1û¸`öìÙV¨QùsttÔû�ðÍ›71{öl,Z´Hõ߯r¨ú­[·4öÿû￵k×6ZÆÚµkñìÙ3ìÞ½»wïÖ(§U«VhÔ¨æÏŸ_l¸q¯^½Ì:¿.OŸ>ÕY®²núê¬KÇŽ±ÿ~<~üØà9ÕÅÄÄàÊ•+ª{°`È�!6lÎ�;‡ÔÔTÕ5bì܆¶›Ò†¥mg%å}íþ ïÚ_¶ECÙßÿ}Ô¬Yaaax饗Š} a¬|"²]†þVÔÇÛÛ}úôÁ„ T_ºU%2™LõÿMKÈÎΆX,¶ÈDl¥P!zí¾K˜Kúˆ1K×C¯ÿ�«� ŸþC}–'Ç_iR|}* —M¿_¢,t}¥¾è�M§žaÓé,ãؘõë×cÛ¶m:·Ý¼y'NĺuëÊ-€O›6 <0ë¾ÀvíÚaÆŒV¬‘múóÏ?1yòd<þaaahÕª•j›¯¯/š6mŠk×®!::�:uBzz:Ž?WWWtèÐÁh8p Æ9øáÀÀ�áëë �÷S0éüú*×P�år9’““Q·n]Eá1&&Fu=¦RÞw—�� Z§þ‡�òõøñã°³³CçÎ��žÛ”º©—gÊg(‘HLjgõr•’’’�••ÕsÛUígΜÁǬÑû}åÊ<þíÛ·GëÖ­U“)'�3¥|"²]†þVÔ'==[·n…@ PÍ‹aMêÿß7‡¾WJË=ÞºÊÔ÷J3˜›ñ¬õÈ1«ùŠÒó]RVí1?y+29ðªŸ=Zù; Ù0{¼÷M:âÓùx-K‰ŒŒ|óÍ7hÖ¬™j}FF&Nœˆ;wî gÏžǔ巙B¡ ,Àøñã‹õäèòÒK/aÑ¢EåýÍ Q™KLLĤI“T�ýºxñ¢ê�Š.]º K—.˜8q"¦L™‚Y³fáõ×_Çü�§OŸbêÔ©�H$FË:th±ó^ºt III˜9s¦Ñ:;¿5®ÛÕÕ|ð‚‚‚àëë‹ëׯãñãÇðòòÂ;ï¼còyZµj…5jàÔ©S0`Z´h�?ÿüñññh×®|||�˜˜¨úâïàÁƒHII1xîØØXƒÛµËóõõ5© MùœµËU6lš7oŽÓ§OC ¨†ï7hÐ@õ¶‘#G"88·o߯„ àããØ¿?¤R)®\¹ h6~múÊ'"Û¥ïoEu­ZµÂÂ… UË Ø¸q#¤…‡žàižB°r˜ÚÔw@§ G†o RÎÈ«Fiê1eùm¦D"ÁòåË1jÔ(<|øPï~^^^XµjU±‰†ˆª‚Û·ok}úàòå˸wï<==U_V¯^Ýä󸺺bÓ¦Mظq#.\¸€¨¨(øúúb̘15jÀÇǯ¼ò D"<==‘——gðÜ·W«VM£ÚõT¿ÆÆ�ãìÙ³¨]»6&Nœˆ&Mš¨¶‡‡‡cåÊ•ˆ‰‰Á÷ß<þmÚ´Á˜1cðã�?âðáÃèܹ3üüüTÄ™Z>Ù&åߊú‚·.ÊÑ2Êc­ÍZ=Ø%a,xwïÞMš4Á¼yóT“a>{ö óæÍC\\Ž?n°ìRL¾fL…VnŒ5C«±²õÍd§oR5íe]“«©¿Ú©½ŠÔ^Ý ÅY]j³0Å„ËúgØy�¯îãi^ѽÿ£Ú¹`RW|}: O=C5±“º¸¢cP58;›X€/�>Áý§EÃÝ„àßí\л‰>®"ÜN“bÓégø=>¿Ø¶{�¤Øt: ¿Ýþg:ÿ“ÓkáÄŸyH}Rˆ~Í��úT†÷·¥Cb/ÀÿõpÃ/WCn�Oóäh\ËÞè°óñ]1þ Ó†Š˜;„ýülÓîáÓE9LÇœÿiÅÅÅaìØ±ðööÆáÇK|nsݺu ãÇ�×9”ÇÑÑ6l@ãÆ�ˬ>DD•EÇŽáééiµgo[»|"²SþVÔîù š{Ç–‚qYxúô)¤Rý…ãÆ�ý{÷P¿~}DDD>ûì3ܾ}uëÖÅ7ß|£÷X±X¬ ì¦í< P¨ö*W{UèxÕõË@ñàn,È[%èÛês¾+”Àbôl\ T÷|/zǃ[9ã¯Rœþû9Ú:`é`O_|�0½WuLìì ;!púï·o߆¯¯/-ZTª²©b;7åÙoeâØÔšË;Ïgãâ½|¼ì#Fû@Gü~7Ó¿/šÖÁN€n «¡¶»ò¥ hᄤŒB Û”†‚¾XñqaÀkNˆO—â½Íé(”+Я¹f÷©Ž‘m]p%Is†Ù÷·¥ãJRÀÏÃñà™ £¾):ö“žnÚÚ´aΛN �Ô×^‚wykß¾=>þøc|õÕWªuÿ÷ÿ‡N�:•c­ˆˆˆˆ¨¼ØÒ„kºž ¡ÎÛÛ˜6mîÞ½ ¨Q£–.]ª1GIʶí¡çn(º­õ|[*H—I �¾õÏ0ð<©ËŽ=3´¾gÑw¯×wÀùÙµq~vmtkXÔ3îVMˆÀb…À¹;Ï5‚7PÔ‹.1ñù(”m;v³hs}/ÍïJò ªà /½Ø~þî?ÇÆ&À›N=Ãê_Ÿé\ÏàmšáÇk,6¬œjBDDDDd±X¬ñÔ{{{�å2R¡r¡©*bÏ·ÍXp(3~”cÏøyØ¡m€#ÎÝy®ºü½|„y¢qÌý'2tjPôü[� øï‚£¸h�Hík; à¹T3¨çh.Û‰ŠŽÍÍ×~½y¶�+ Ù“»º`ð&"¢òeÎãm±|"ªÚlé¾r�@`°‡:##Ó§OGBB‚êQ“‰‰‰˜>}:""" >ÞWW¶!M¶Öó]áÈäÀ†è¢žâ�º¹B(âB.øˆ‘‘#GÂãBÕO�L�ÄŒ¢û!Ú:ÀÞNó—ôÞ£¢m^vTmkà�ªûºõIx¬,×ö/‚xß’=jkÛ¹,l:ýÏUlº³¨nÖ¬Yªà�ˆˆÔ­[‰‰‰˜5kV©Ê&ö|[ı›yøw;)^öãíæNØ›ƒýWrðÎkNØ2ÚQ×sáí"‚“ƒ³÷eàÖ)bóÑ¢®¾ã�ßãóPCŒM§žájrÎÞyŽvŽØ>¶n=(@Ç j(�)ðÍÃ!øvšW’ ÐÜÏߎõF|z!z4ªVâëRÞNDDDDDŸX,68ÛùíÛ·ˆE‹©z¹#""0kÖ,ܾ}ÛhÙd˜­‡ï’Œ](óñ kO>ò¡ž˜ÐÑGoä""ê)>“¡w F¶uArf!n¤¨føì‡ |ØÕ Á/9``K'$>.„ËžîÙû20¹‹:¼ìˆv�ޏžR€U¿>Uõ˜2ã‡Ç˜ù¦;^ó·GA¡3~ÈÀ'=MŸòßÖx{{#==qqqªYÌ�‰‹‹P49Qy’Édظq#&NœXÞU!"ª””+^½zÕäg}'$$(»¿miÂ5��ÅUÒõo¬_¿Þ¤²-¬$ªÙô$l¶öœo�Ö6¡Žeíg~ µÞ+D°Òs¾É<¥yÎ÷êÕ«±uëÖ;fÌLš4©Äç. õÿÉÚÒ}>D•Ý×_�!C†ÀÕÕµ¼«Àpø~òä N�:�@€��ÕúË—/ãæÍ›ÈÉÉ�³³3z÷î OOO¤¦¦"::ÙÙÙðööFÏž=!‘HÊòrˆˆlNEø[Ñ–Â7dee!??ߢe:88ÀÅE÷“ô1òœoÙ‹Wå�ò™Ýêï¡¶jë´—Õ÷‡Ö6}¬àË«ç›wã“I&L˜8tè�ÉÏí®Q£úöí‹ñãÇ[³jF¹ººbòäÉåZ"²MgÏžÅ�;wàíí­1ü/&&Ož<ÁàÁƒáàà€ÌÌL¸¸¸ ??‡ÂÀ�áî/âСCnnn:×§¥¥áøñãèÚµ+<==‘‘‘�üü|T«VÍìöÓwn�€ÿšY‹H$‚‹‹‹j"6©TŠÂÂB(EÉH ÀÎÎb± Ý¥ 4¾KÕäËÃ[Û”ˆÊ[Íš5qÿþ}Õ=Ð)))P(ðôôDÍš5‘ššŠ‡ÒÒÒTßüÚæëë‹§OŸ">>@Q–J¥�1ÆÑÑõêÕÃÙ³g¡P(�““ƒ„„Ô­[ …І•ÿöÛo¨]»¶Ù�uQ§ïòóóñüùs¼üòËèÑ£ž>>f=s¼[·n8vì¾ùæ888 sçÎpssCvv6Ž=ŠgÏžÁÑÑ���¥žˆLß5899áܹsÈÎΆL&Cpp0qÿþ}�ë‘��€­[·¢Zµj¨]»6ìììJÔ~úÎMDDTXk—±rum¨­W¾ u,«ï#T;N¹¬ü½xµ{ñ^ùê¦P(Îê«ØÈÍi¸õ@ªo3™¡�¯ÛÇÖ(ïj™,;;û÷ïÇ»ï¾kÖ62ŽíGDDêA;OȪ½Ê_¼—«ý(Ô~”ËP[†Ú:íetß]lìŽc‹ß‘ÌaçZð@•.µ¾b,Àg\‘íËÎÎVͪ}ýúu˜´�ŒcûýƒÃεÔõ°Ãö±5°=&Goäâ¯RNÂf"ŠîñîÙX‚‘ÁÎå]""“ܹs×®]PtŸw§N�LÚFƱýˆˆˆþÁaçDDDDDDT¦8윈ˆˆˆˆˆˆ,Žá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬¬J>jìþýû(,,„B¡€BÁ‰Y›@ €@ €�]•Œ¡U3|W¯^2™Œá›ˆˆˆˆˆ¨Œ(÷H$*杖‹*¾„¢÷ ßDDDDDDÖ'4^«š*¾•Á›ˆˆˆˆˆˆÊVUÍcU2|U÷'"""""¢²W%ÃwUæ@DDDDDDåƒÝ¿DDDDDDDVÆðýBRRöìÙƒ””�ÛSRR°wï^$''—q͈ˆˆˆÊ×Ó§O±råJtìØ±±±Å¶§¦¦",, !!!èÑ£f̘�G�þþûo̘1}ûöE—.]0qâDܺu«¬/Áfk[}û°Í-§4¿ß¤Ÿ)¿ÛUM•v®‹½½=d2¢¢¢Ð½{wÔ©SB¡r¹IIIøå—_P­Z5ˆÅâò®*Q™Ù³g6n܈ììl½ûDFFâÑ£G:t(nݺ…cÇŽA&“aéÒ¥ÈÌÌ„½½=F�…ŒŒ ìÚµ 3fÌÀ¾}ûÊð*l“)m«o¶¹e”ö÷›t3¥]«"†ï¼½½Ñ¶m[œ9sÇ�G‡P¿~}ÄÇÇãÌ™3pttD»víàíí]ÞU%"""*38p j×®�E‹éÜgäÈ‘7nœj911×®]´iÓmÚ´QmKKKÑ#G “ɪì³~•Li[}û°Í-£´¿ß¤›)íZ1|¿  Q·n]tíÚG�Źsç���€””ˆD"téÒ5kÖädmDDDTéÝ»wS¦LÁèÑ£ñî»ï~ûí7½û;88h,Ëårøøøh¬»|ù2nܸ�èèhŒ3¦Ê†@sÛVß>l󒳯ï7™ß®U÷¡PˆZµj¡_¿~Ø·oþüóO¸¸¸`À€pss+ïꕉœœddd ##ÃìcO�:…¿ÿþŸ}ö™ÆúI“&(ºÕ///Ï"õ¬ˆJÓ¶ú°ÍÍc�ßo²ÎïveÃ𭃻»;Þ|óM\½zÍš5cð&""¢*¥qãÆøå—_Šõø“��€  E‹xûí·5¶�={·o߯îÝ»±}ûv4iÒ�:u²dµ+„’¶­>lsóYã÷›,ÿ»]q¶s=jÖ¬‰^½z¡fÍšå]"""¢2'ÿ3Q*•ªÞß¿}ôÜÝݱhÑ¢bCœ…B!‚‚‚0pà@ECT«*sÛV¶yÉYú÷›ŠXêw»²bø&"""" üñºu놭[·š´OJJ >øàló’³äï7ýÜvݹsgÙŬpØ9ippp€››\]]MÚ'::>¬\¹RµÏºuëàêêŠäädœ>} …Xºt)5jdõë°Eæ¶­>ló’³äï·»»»Õë[Q˜Ó®...eX3Ûa­©»�•«k»@m½òU¨cY}¡ÚqÊeå�èū݋÷ÊW·‚‚‚³f\ Y�½½};OȪ½Ê_¼—«ý(Ô~”ËP[†Ú:íe…Ú{uºÖ™³ÝlvNDDDDDDde ßDDDDDDDVV%ïùNNN†\.7¾#Y”)³¢WFU2|שS§¼«@DDDTi$&&êÖ­[Î5©ÜØÎeƒíLÖR5¿r ¢r±wï^###£B•mIêõŒ‰‰Á¸qãеkW 4sçÎEVVRRRŒÈÈH“ËÕ>¦$e‘õ0|Q™‰��E@@<<<*TÙ–¤¬gff&¦M›¡Pˆ>ø={ö„X,®²�Þ """ªìªä°s"*±±±èÑ£G…+Û’”õ¼pá ññÇó¹«DDDDU{¾‰¨Lܽ{™™™hݺ5àÊ•+;v,ºvíŠ#Fà·ß~ðÏpéÿýï4h¦M›8yò$† ‚7ß|3gÎDpp0Ù.;'‹ ŦM›Š­¿sçîܹƒM›6aüøñX³fM9ÔŽlÁåË—ñÊ+¯ÀÅÅ¿þú+rss1mÚ4Áßß¡¡¡¸xñ"Z¶l 9r$BCC?þø#¤R)¦OŸŽ—_~r¹‹/ÖYö±cÇ î ³fÍÂÛo¿ „……!%%ñññFë¤<ÎÑÑóçÏÇûï¿�   ¤¤¤`Ïž=�Ëå¸xñ"är9vî܉Ç#//®®®Åê ÿþ÷¿1xð`œ8q;vìÀ–-[ðÊ+¯ 000gÎôíÛ‰óæÍCjj*®\¹¢·|""""²] ßTj}úôÁ±cÇŒî·iÓ&Ü»w‡*ƒZ‘­‰��Eß¾}ùùù€ÂÂB€££#ÀÞÞ^µ¿ŸŸŸê½T*ÕØ_,ë-ÛØ¾ê$ @¡P˜T'íãär¹jYÙc]½zuÀæÍ›Ñ¸qc½õT/«OŸ>¨[·.Æ��ÔÔTUøV>ÓÉÉIUO}姤¤è½N""sÉårDEEaëÖ­¨^½:6lØPl™L†Ÿþ‡ÂÍ›7�7Æ[o½…��ˆD¢²®6‘Mcø6Szz:,X€ÄÄDÔ©Saaa¨Q£FyW«Ü„††š¼•Ž;†ÐÐP£=àQQQضm²²²àîîŽ7ÞxãÆ�ƒ\.G÷îÝñ믿š|NõcJr<•Þ½{÷�‘‘�V­ZÚ´i‘H„ˆˆôïß„³³3Ú´iƒ¼¼¼bÇ·lÙ�4hþûßÿê-Ûо†˜['}‚ƒƒáì쌥K—â£�>Bnn.$ ÜÝÝ5ê�Ÿ~ú -Z´€½½=Ž;¡Pˆ×^{­Dåׯ_B¡·nÝÂo¼'''�e΢ND¦P†îo¾ùF5Ÿ„®Ñ5øôÓOqýúu@AAàêÕ«¸zõ*:„%K–Øü(ˆˆÊïù6Ó´iÓðÎ;ï`ß¾}èÒ¥ >ûì³ò®R¹9wîœÎ¡æÆlÚ´Éà=à7oÞĶmÛŽ`åÊ•bkÒïòåË‹ÅhÖ¬ ^½zX°`rss±lÙ2( ,[¶Lïi���˜>}:ÒÒÒ°yóf´hÑBoÙ†ö5ÄÜ:éãáá�/¿üvvv˜:u*V®\‰7n«§D"�T*ÅŽ;°nÝ:H¥R,Z´ 4(QùÕ«WÇ�!C‰#GŽ[&"2D.—ãðáÃ:t(æÍ›‡¤¤$øùùaîܹÅz½e2™*xתU óçÏÇÎ�;±sçNÌŸ?µjÕµk×ðÙgŸA&“•ÓÙA9•«k»@m½òU¨cY}¡ÚqÊeå�èū݋÷ÊW·‚‚‚³f\‹Êµk×°råJ�À9pà@,^¼AAA%)²BÓwŸ·) ÝÿýÃ?àæÍ› +¶�=ßÓœ9sðøñc¬[·Î"å-_¾{öìAtt4æÍ›g°lõ} A·6K·‘%èêéöóóØ1cЫW/Õí/êöïß�/¾øµjÕÂ×_ $&&êÖ­‹ŒŒ Œ;÷ïßÇÌ™3ѯ_¿2½¦ÊL½�ÉzØÎeÃÞÞ¾€§d Õ^å/ÞËÕ~j?Êe¨-Cm�ö²Bí½:]ëÌÙn6;7Ã�;wаaC�uMš4ABB‚Fø–ËåèÙ³'‚ƒƒqëÖ-ØÛÛcܸq8tèîܹ///,X°>>>�ÉdøòË/qáˆD"tîÜ|ðAY_Z‰”&À:¶Y³fX³f ñÖ[oÁÍÍMc{nn.>ÿüsüñÇøÏþ£zNrLL V­Z…ÜÜ\¼òÊ+˜={¶êþ\*?#FŒ€³³s©ÊØ¿?„B!rssqäÈ´oßb±XgÙúö-O–h""K)IèVRÎÝ2qâD�£ƒ<<<0iÒ$„……áСC ßDD/0|›!##£Ø}“nnn:ŸÏ›���?ü>>>ضmæÌ™ƒÈÈH¸¸¸`Ù²eøöÛoñé§ŸâܹsHHHP=ÃW9YTEpçΫûòË/cõêÕØ²e Ö­[‡ž={bÔ¨Q¨S§ŽjŸqãÆ¡N�:øá‡°bÅ lذ�=ÂâÅ‹ñõ×_ÃÓÓ«V­Â¶mÛ*Ì—•™ö—V%‘œœŒãÇ�#//¯¿þ:¦N�ª·l}û–'K´‘¥L˜0×®]ÓX—””„yóæaÞ¼y&•Ñ®];½Û‚ƒƒÝ®|O¥§¼·^×d d9lg뫪Ojaø6ƒ››îÝ»§±.;;[ç·¾‰>>>€.]º **JÕƒÛ¹sgüïÿÔ¯_IIIG×®]U“1Uu�5ÂÒ¥KñðáC|÷Ýw˜0aöíÛ;;;H$UïÖ­¾ýö[EÏD~øð¡ê™ÇOŸ>­Ò“áU6“'OÆäÉ“-¾/•Œò)DDd†o3øûûãàÁƒëþüóO¼ûî»�Ó\»vmìÝ»§N�®]»°mÛ6¬\¹Òr•¶¢€€€÷~˜´Ÿ��¦N�Š“'O"%%þþþÛíìþùvrrBëÖ­±lÙ2�}”�ƒ"""¢"6l(ñ°óñãÇãÚµk8wîœÞ Q•«6kÖ 7n´üTQ¼¹l°�ËFUYÀÙÎÍвeKäææâ—_~PôØ,WWW¼ôÒK%.3''yyyèÑ£æÌ™ƒ¸¸¸ »víj•cð÷ß( Î111P(ÃÎuiÚ´)âããqéÒ%E³±>þ@Ñ·óÊvUODDT …B¼ùæ›Ø½{7æÎ� ???Õ°ó¡C‡âðáÃzÿ­ìÓ§`íÚµÈÈÈ(¶=##C5¹¤r_""bø6‹@ ÀW_}…½{÷bРAˆŒŒT q.©øøxÌš5 ï¾û.fÍš…éÓ§ü¶Ù–ëñ/é±�?ÆÊ•+ѯ_?¼ýöÛøöÛontÂ,'''„‡‡cÆ ;v,¦L™‚7n@(¢oß¾7nrrrTï³²²J\²ÊÑ'ï½÷nÞ¼iñò @¿~ýRìB–ªC¿~ý0hÐ ì߿ߢå—Ö£G�ЧOŸRÿ÷/•J¬ú Á’%K�““c¡šZFrr2BBBUâ2.]º„?ü½{÷F�=Š %%ÁÁÁˆŒŒ´`�K'** ÁÁÁxðàAyW¥Â(I A“&Mpÿþ}Œ7ÇŽCnn.rssqôèQÕLçM›6Eß¾}Ëéʈˆl‡�›©víÚX¿~½Á}„B¡ÆlÞ¾¾¾øî»ïTËÍš5S �nÚ´)Ö®]k�ÊZYÛ¶m1~üx³76~üx´mÛVïö×^{ ¯½öšÎmÚmëì쌨–7n¬sxÛ'Ÿ|¢ó=U|kÖ¬Á”)SЦM›ò®ŠYÖ¬YƒAƒ©æ†°”-[¶ÀÃÃøñÇ1zôhìØ±Õ«WWí³yófxxxàþýû5jš5kfð¿É’Ö!!!¡¡¡¨S§N¹Îg¡ÞÖ +6yfIuìØ;vÄéÓ§±oß>è|LbY™?>6lˆAƒ(Òçåå''§•÷óÏ?cÑ¢EhÑ¢þýïãùóçˆ��‡§§'ÒÒÒ,Yu*gÊÞ«W/�áèóæÍÃ�?þ¨ño½H$Bxx8>ûì3\»v aaaÅ&¨jÚ´)–,Y‘HT.×CDd‹¾©TÖ¬Yƒ{÷îáØ±c&íߣG½Ï÷&*‰ŒŒ Ô®]»¼«a¶ØØX¼ùæ›V+ßÞÞÿú׿���€íÛ·ãÃ?,¶OÍš5ѬY3«=eÁßßo¿ý6bbbÊ5|«·µP(´èÌËèÛ·/úöí‹aÆáìÙ³+»$bbb4ÂN�5°eË–•õìÙ3¬X±�:uÂ_|a©*’�Óá[·nÕ9"ÏÃÃëׯÇÁƒ‰ëׯ(zë[o½…¾}û2xiaø¦R;tèBCC�ö€�?žÁ» »víV¬X�'OžÀÛÛ3fÌ€¿¿?är9þõ¯!88¿þú+fÏž�¶mÛââÅ‹XµjòóóQ¿~}$&&jŒ €+VàÎ�;9r$‚‚‚°víZ�eézþ»³³³Þõ—.]ÂÊ•+‘ŸŸwwwäçç«Î©ë˜jÕªáË/¿Ä…  ‰Ð¹sçb�¸ËÌÌć~ˆO?ý×®]Ãõë×1räHôîÝaaaÛ'$$ÁÁÁøã�?  1cÆ 4iÒĤvïÔ©¶mÛ¦Z~òä ._¾ œ}ú`Ö¬Yªí‰‰‰xõÕWqàÀ´mÛOŸ>EXX.\ˆ]»v¡eË–:gÖÿè£�€íÛ·«nÑ.Kùü÷åË—ã‡~€¯¯/¶mÛ¦wý³gÏ0gÎÕ¹»uë†äädÐ{̹sç���€½{÷b×®];v¬F=³³³ñÉ'Ÿ`Ò¤IhÖ¬FŒ�&Mš`ûöí 3Ú>�?Æ{g;v`„ ˜3gd2™Im_£F }Ю]»µ�D"Q=f¯C‡øâ‹/�œœ\ìÑ{º¤§§k<)ÀÓÓÛ·o‡‡‡`ÇŽˆˆˆ@ûöí –S¿~}½×¨îñãÇèß¿?|||àïï�yóæ¡^½z�Ëå:?›’\÷íÛ·u~@ñÏß�’|žÚ’““ñù矣V­Z˜0aFŽ©šìkäÈ‘ PÔ;œ››‹iÓ¦!((þþþ ÅÅ‹ѲeKÀ‚ н{wÔ«WãÇ�ÇÅ‹‘ŸŸ¹\Ž�;wâðáÃÈË˃«««êüêçŠ>ßW_}Íš5+V׋/ê,ËÛÛ°oß>´k×N5A–²M“’’¨· æÌ™ƒ¾}ûB"‘`Þ¼yHMME£F�àåå…¨¨(¤§§C¡P¨g@Õïââ‚°°0¤¤¤àï¿ÿ†T*ÅôéÓñòË/C.—cñâÅëþûï¿£°°PuŒ��>ÿüs½u%""*O ßDdu………>Éår¨†ˆjß(“ÉJX³f�j6c}=êµk×Ö{�ê´Ã½:íϦ¤×­ïs�ËåfÝcZ’ÏSÛèÑ£1aÂ�ÛüüüTï•·.h>ã4//T×ooo�jÕª(š$¯qãÆª}SRRŠ�Ãå¤{ÚeÀwß}‡#GŽà×_ÅöíÛ±k×.4jÔöööøßÿþ‡:èÒ­¼XùY* üòË/˜;w./^Œ×_]ï¬ÿ‰DuŒrîe©ŸO_Ý•·H(�¦6Q™ã°s"²º¦M›âÒ¥Kª¡ãÑÑѨ[·.ÜÜÜtîߤI\¼xQµÿ•+WT½fR©{öìQSέëùï†Ö_¸pAç¹õ“““ƒ¼¼<ôèÑsæÌA\\œÆ£yÆŽ‹ZµjaÁ‚ªuÕ«WW=ÌXûÈëÃÔb IDATårDGG._¾ gggøøøl ™L†}ûöáÆ�0`€Þö¹xñ"6l¡Pwww¤§§ãöíÛ€óçÏ#;;ô^£¹Ÿ‡º’^·¾ÏAõ¶Ö>¿9Ÿgi®µM›6‰DˆˆˆÀ�°bÅ 8;;kÌÒ¿páBDFFbÙ²e°··G›6m ggg,]º±±±øí·ß«÷}:„B¡FŸ={6>üðClÞ¼cÇŽÅðáñbÅ ìß¿K–,1Ø>B¡QQQX·nÜÝݱpáB�m1vìXUq«V­°nÝ:ØÙiþ¯þý÷߇H$‚X,†��æÍ›°³³Ã§Ÿ~Š)S¦À××5jÔPõÐÆÇÇë¼Æôôt³>uÆ~/ô]·¾Ï¡E‹:Ï£ÞÖÊaÌ%ù<Õ¯U}(¿)êÕ«‡ `Æ X¶l±lÙ2xxx¨z±ëׯ�Õ«WÃÅÅ‹-R=†îË/¿ÄªU«0uêTÔ¨Q!!!ª!áÚBCC±téR|òÉ'X±b…Æ#æ<< †ˆÌrëÖ-¬_¿^çðàÊN.—kÌÎ]UT¥ëVÎŽ®¼ç›Š,_¾{öìAtt4g1¯8ÛyÙ`;— ¶sÙ°··oà)€BµWù‹÷rµ…Ú�rjËP[§½¬P{¯N×:s¶›�=ßDd“ÒÒÒàîî±XŒC‡á�7Þ(ï*‘•íß¿B¡¹¹¹8räÚ·oÏàMDD•Ã7Ù¤'Nà矆H$BË–-ѯ_¿ò®YYrr2Ž?޼¼<¼þúë˜:ujyW‰ˆˆÈb8윈ˆˆˆJ…ÃtËÛ¹l°�ËFUvÎÙΉˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰ˆˆˆˆˆˆ¬Œá›ˆˆˆˆˆˆÈʾ‰¨ÌìÝ»ÁÁÁÈÈȨPe[’²ž>Dpp0ºwï®Qç«W¯"88±±±;grr2BBB…””#22²Ô媷yLL Æ�‡®]»bРA˜;w.²²²,P{ý ]‹T*Epp°ê'$$K–,ANNŽÅίޮڢ¢¢ŒXì|DDDT±1|Q™‰��E@@<<<*TÙ–¤]Ïììl¬^½Ú¢ç˜?>¾ÿþ{Õ²½½=¼¼¼àäädÑó(¯%33Ó¦MƒP(Ä|€ž={B,ÃÅÅÅ¢ç+‰Ž;bΜ9hÔ¨öíÛ‡¯¾úÊbe[«]‰ˆˆ¨r²+ï QÕ‹=zT¸²-I»žµjÕBdd$úõë‡W_}Õ"爉‰�H$R-רQ[¶lPÔ[l)Êk¹pá ññÇ£Q£F+ßзo_ôíÛÆ ÃÙ³g-V¶z»Þo"*wïÞEff&Z·n ¸rå ÆŽ‹®ÿÏÞ½ÇEUç�1%¢ ¢â ’©„šZa:iy • WÀ’R3o îb‚Êz+¼š«’-«¦‚—TJS÷×J‰ºd^ To r døýAs¾Ì   Vïçã1�™9çsÞŸË™’Ï9Ÿóù €¯¯/ß}÷ðC‰¿øâ ¼¼¼ àСCøøøðÚk¯TaHo娆ÒjcGDDàååÅàÁƒ‰��UÊX]™–-[†——nnnlÙ²…•+W2dȆÎ?ü ÄILLÄ××—þýûãïïÏåË—õ–ÀÇLJvíÚ±xñb4M…6KKKÃßßWWW Äœ9s¸{÷.'Nœ@­V“””ÀŠ+èÝ»7ï½÷·nÝ"..µZMnn®Rþ¸¸¸*çÅX¬’’-Z„››®®®øûûSVVV¥.­ZµÊï¸ùå—äääTÈC_{ª›¡óŸ’’¢ k=z4.\PâïÚµ‹#FàææÆÖ­[ üÁÊÊŠF�ÌÃÐù÷Ýwùë_ÿªÄY°`žžž\¹r¥B»&$$àãホ›[•Ñ úÚÀP9„BñÇ$�oQgR3ï±é‡BB¿Êcò¦&oÊ!ô«<6ýPHjæ½G]<ñˆ?~•JÅsÏ=ÇÍ›7 ÀÔÔ”©S§bbbBPPW¯^UÒúé§ôéÓ‡¡C‡’‘‘Ahh(ÖÖÖøûû“��`0vuibcc5jvvvDFF’��]£2mÙ²…7ß|[[[–-[Æ… ;v,ÅÅÅ„‡‡pþüy‚‚‚èÑ£áááäåå±páÂ*åÔjРï¿ÿ>©©©†ŠØØØÐ»wof͚ŨQ£Ø·oŸÑÎ%À´iÓptt$** KKËšœ½öïßÏ®]»ðóóã£�>ÂÇÇ“*uéÛ·/~~~deeާ§'kÖ¬¡¬¬Ì`{TW7ÝóŸ••Å{gF£aúôé 8PéðCyÇ|Ô¨QØÚÚòÉ'ŸTèüûí·ìÛ·�%K–�’’ÂàÁƒõæaìü{xxpõêUÒÒÒÐh4>|˜!C†(mTøÝM�:•ÌÌLeŸ±ßDår!„â�K†�‹:±é‡BÿR\e{f¾†ÌübÿRLŸöæŒêañJ'Ç�ÇÙÙ™Æ�sðàA ÄÉÉ GGG¦L™Brr2...¼ýöÛL™2€/¿ü’’’fΜI‡Ðh4,Z´Hoìo¿ýÖhZ€àà`† FãÆ� %##ƒ´´´jˤ=îÉ'ŸdÞ¼yLœ8'''222زe �†ääd4 ›7oæ›o¾¡¨¨ˆ&MšT)gII‰Ržnݺ1dÈ¢¢¢˜5k–²ÝÚÚ[[[âããÉÌ̤¬¬ŒË—/óì³Ïlç§Ÿ~šf͚ѭ[7ºvíú@ç¬yóæìرƒ^½zááá¡·ÍÆŒƒ··7 lÚ´‰èèhœ��ÉÈÈÐۆꦥ{þãââ(,,dÆŒtîܹJ9CBBðððÀ‚°°0®^½J‡€òIÑæÎ�Ë_þò&MšÄÛo¿­Œ˜ÐÍc×®]ÏÿÀ�‰ˆˆàðáÃܺu‹¼¼<ÜÝÝ+”áûï¿çÞ½{Êï®AƒÌ�;Àèo¢r9„BñÇ%�oñÀ–'púZõw¶ÿRLÖ ëÿwâÄï׉'”ÎÛ¯¿þ À½{å¿›'Ÿ|(ŸÀJËÁÁAù¬í¨jÓ›™™Œ]]Z]åƒÊÊÊjT¦ÊÇi‡‰[XX(ñ­­­øüóÏ«tuËYÙ´iÓøÏþSa¸ò�˜3g‹-¢gÏž 0 Â1Ú2×}±ºwïÎÆ�Ù»w/dÆ ÄÄÄкuk½u±°°ÀÝÝ�6mÚ0a®^½j°=ª«›îù/,, ´´ToÙUªòA\ډϴçà�wÞaÒ¤Iz�ÓÍÃØù·´´¤_¿~üç?ÿ!33“çž{ŽÖ­[Wx~¾òïN÷®¸¡6Я[!ÄŸÓ¤I“ÈÉÉaìØ± áÀ�|ýõ×ܽ{×è1µUÝù÷ððàÔ©Slß¾]ïÝßÝž={˜3g޲ÏP!„–F£áÒ¥K„……1räH¾ùæ›*ó€!~ÿ¤ó] ùùùLž<™½{÷VYZæ‰'žÀÇÇ‡ØØXvíÚÅsÏ=GDD„²?00�¿þõ¯ìرƒþýûóÁ(ûV®\INNÑÑÑìÞ½›   åNÉã,5óžÞ¡æÕ9üK±ÑgÀOŸ>Íúõë '..ŽåË—?–³XGGG³k×.–.]ÊÚµkINN®³Ø666„††>K5Õ…ãÇ�cff¦ ƒ~ê©§˜?>………DDDPVVFDD„ÁeÂÚ·oÏÌ™3¹yó&Ÿþ9Ï?ÿ¼ÁØÆÒSÛ2bccÃÒ¥KiР,_¾œS§NU)§>¯¿þz…;£îîîôë×�Õ«W³sçNeŸ��'N$==�ØØX† R!Δ)S(**bÆŒœ?¾Â>kkk|||سg{÷î5ëÆ�:tˆ™3g²k×.F�M—.]ªÔÅ‚’’6mÚĪU«())aáÂ…<óÌ3ÛÃPÝôéС³gϦ  € °gÏž 7ëBuç¿{÷î4oÞ•J¥÷"�îï.**ŠwÞy‡ Ê—j!„ÐZ³f , M›6\¾|™°°0å⾡Q?Bˆß“ê“ÔK\}ûMt¶kßUz¾ë¦Qé§ý®}™þöÞà·ÏÚw«âââû^kæÂ… ´mÛ–àà`ÜÝÝ•Y�+»xñ" .$**Š“'O²|ùr>ûì3eÿˆ#X´h­Zµâ�wÞ!&&FùCí÷ÂÐsÞ5aìùïíÛ·súôiBCC¤xµ¦ÑhpuuåàÁƒÕ¦uwwgÆ ÊæQQQ3uêÔú.&ׯ_gÆŒUîv>ÎBBB¸uë«V­ª“xŸ|ò [¶l!11‘°°0£±uÓ‚^ßêº ¥?R]„u#==€6mÚ<â’ü¾i4X³f�Ò¦ùË_=z´2)H;×7ù=?æææ½€\ ¸§ó®ùí³FçU¦óÒ~Gç;:Û*/Óù¬Kß¶Ú쯵ßWoï1жm[£ûËÊÊ8sæ ±±±Œ7€ÔÔT:vìX!ݳÏ>Ë¥K—øõ×_qttäÀ�ÄÅÅѰaCÞyç�*w�4 ƒ B­VsîÜ9ÌÍÍ?~<»wï&55[[[æÏŸOË–-)--eéÒ¥=zSSSúõëÇäÉ“ë¶!€37îscÇvíÚ••+WÒ¾}{† ‚••U…ýIII¬X±‚ÂÂBœ��™5kwïÞ%,,ŒË—/SRRÂÈ‘#=z4�†7ÞxµZÍÁƒ™5k/½ôgΜ!""‚ÜÜ\lllX¶lO<ñ………Ì�;—3gÎ`bbÂìÙ³k´nqQQ–––ó;yò$‘‘‘äääмys>üðC æå—_Vî6®\¹;;;†^áBÀ±cÇX¾|9¿þú+M›6­ð|®¾ö°°°Ð[ŽGÅ××÷�fÝعs'*•ŠÂÂBöîÝKïÞ½133ÓÛPÚG©.ÚàqñGª‹BleeENNæææ\¿~�Ë—/3oÞ<Ο?O@@Û·o¯òÇmAAÓ¦M£eË–¬_¿ž��öìÙCãÆ�‰ˆˆ`ݺu¼ÿþû9r„K—.)ËöT~æ³®dæßÿ³HÆŽíСŸ~ú)ÑÑѬZµŠAƒ1vìXìííÉÊÊbÑ¢E¬]»–fÍš±bÅ Ö¯_ϤI“ ¥E‹äääðæ›oâêêŠ��éééLš4‰éÓ§+²9sæ°téRÈÏϧaÆʳUãÇ�ÇÞÞžíÛ·Éš5k –µ´´”äädY¶l@•üòóó bõêÕØÛÛóõ×_ÌÆ�ñðð`Û¶mJçûðáÃFHäååÂgŸ}†½½=Û¶mcÉ’%ÛcòäÉUÊñ(U¾øt?®\¹Âþýû)**¢gÏžŒm(í£Tmð¸ø#ÕEQ7‚ƒƒ9}ú´ÞI*Eݸzõ*«V­RV•BüþH绎EFFR\\Ì‘#G ÃÅÅ+++.^¼X!]AA666XYY‘ššÊ_|�‰‰ jµNŸ>]e¢' Z¶l @ÿþý‰��Wî ÷ë×�/¾ø(¿;ùòeÂÃÃ0`€Á žg�:ubñâÅܸqƒ�72iÒ$vìØAJJ 7nÜPÖÈÍÍÍ¥E‹˜ššRPPÀîÝ»¹yó&¹¹¹deeaggÇO<Á«¯¾ªÄþñÇqrrRfÖ½0baa�½½=¯¾ú*ëÖ­Ó[¾[·náééIË–-qtt$,,Œ§žz �FS%¿””:tè Äõðð **Ь¬,Ôjµ²îozz::t I“&&YIIIÁÙÙY9þå—_fÇŽÊ>}íT)ÇïÝÔ©Sk<¬¿6i…Bˆß“G}A]qÿ¤ó]ÌÍÍéÛ·/íÚµãÚµk8::òõ×_WHsöìYÞzë-¬¬¬hÚ´)�SSS,--•φTB«û½uëÖlݺ•ÇÃúõëY¾|yÕîÿ4o¬ºï»ßÍ×쎖-[À¡C‡ÈÈÈ Q£F¼øâ‹&³ƒòöüøã�™9s&mÛ¶%))IYò§r[Þ¹s‡Û·oW›·±gð›5kVá™o]•ó»wï^… ú4 ÅÅŘ™™¡R©4h‰‰‰üòË/zgQ®|¼.Cí¡û{B!ê›ö"°<#[¿´Ï" !~ŸäÒYÉÈÈàôéÓ@yÇçØ±cdffÒ®];\\\(,,äÀ�|ûí·4iÒ„§Ÿ~šf͚ѹsg6lØ@YY¤¥¥=аÎ;wîPTTÄÀ� !%%¥^–«èØòþ¯Ý;öÒ¥KüüóÏ@y[&%%QVV†½½=]ºt!--�cÇŽåþïÞ½Kjj*Íš5ÃÙÙ™»wïríÚ5ƒ�ÏN�:ñÓO?)“–Ýw=j¢K—.;vŒÔÔT |Y¦6mÚ(£<<<Ø·o?þø£Þe­ºtéÂÑ£G•ãÿ÷¿ÿqùòeeŸ¾öB!„B<^äÎw-ùûûSPPÀõë×9wîkÖ¬!88•JÅÚµkIKK£´´{{{,X€…EùŒÞË–-cÞ¼y¬Zµ å 1@hh(óæÍcøðá4mÚ”ùóç+ÇÝ�´´4V­ZE^^Mš4aæÌ™õ2D©g[óûží¼g[Ãτݺu‹èèhÒÓÓ)--ÅÁÁ�ððpÌÌÌ033#<<œÈÈHJKKyòÉ'7n}ûöåÈ‘#øøøÐ´iSžyæLLôOºßªU+‚ƒƒ ¤I“&X[[VoÏ©5kÖŒ��fÏž­ä?oÞí„[ú´nÝšÕ«WëÝgee¥L eˆJ¥ªð­��]…?"»víª =îÒ¥‹ÑrÖ•vÍЧ}í;à}Ú›Ó®¹áŸÞ /¼À /¼`pçÎ�‰ŠŠª²}þüùzÓëë OZ½{÷6¸,”�†0§oß¾ôíÛWﱆڣ6:Qt×­oݺ5¹¹¹äääüáò¬©èèhlll¸téS¦LÁÞÞ¾Îæ¥°±±!44´N;d/^ÄËË‹nݺqñâEüýýéÖ­›2¡¦V||}z�–~4G!„xÔä™oñÀþÖß’>í«²Ý§½9ë/kÿY�|8&LàÆ�Jœ¤¤$|}}>|8AAAT(_×®]IHH`óæÍäææV)¿vmù‘#GV)cu± ©.O}q³²²˜6mžžž¸»»³~ýz£ççÌ™3Lœ8‘‘#Gâçç§Ì�`¬>•)ËüéËÃÐ9 fÏž=Jœ•+W²}ûv4  P¶;vLùm„……ñ믿mCåЕ™™‰££c…m§N�"//ooo£ïÄÄD|}}éß¿?þþþ\¾|™÷Þ{�[·n‡Z­Ö{¾222P«ÕDDDàååÅàÁƒ‰��­°/..No,ÝýiiiøûûãêêÊ Aƒ˜3gN�戸|ù2iii899­KII ‹-ÂÍÍ WWWüýý)++ãĉ¨Õj’’’X±b…Á‘@úêЪU+ üNö—_~YeÇý¶«Bñ°Iç[Ô‰Q=,˜9°¼®;“yóÆ*ú´7gæ@K¹ãý'¦]ë|îܹlÛ¶ www‚ƒƒ•ýééétëÖ�¸¸8^zé%rss eÁ‚ÄÄÄàââ¢L8§«ºtøûû³e˼½½‰ŒŒ¬Qy ˜6m[·neðàÁ„„„ÊöíÛqvvV– Ó®³þÉ'Ÿ°}ûvììì”N«–vÝúãÇ�3tèPæÏŸÏ•+W*¤?~<±±±ÊX“؆ËÓPܦM›ÊÎ�;Ù¸q#›7oæêÕ«zÏOaa!sæÌ!44”ØØXÂÃÃiذ¡Ñúè*--åûï¿'11QY¯rÆÎ‘‡‡û÷ïWâ>|˜�VÈ#//���å·ñꫯVÛúÊ¡ëçŸ&##£Ê�s툶¶¶@ùãIjµZyi4Ο?OPP=zôP–\¸p!Ó¦MÊGDEEaiiøell,£F�ÂÎÎŽÈÈH²³³+ì¯.–�� ½{÷fÖ¬YŒ5Š}ûö±uëVƒùEGG£V«ñöö¦¬¬Œ>øÀ`]öïßÏ®]»ðóóã£�>ÂÇÇÇà܆è«Cß¾}ñóó#++‹ððp<==Y³f eeeuÒ®B!ÄÃ"ÃÎE�i×¼�Ñg¹ÅŸ—±µÎmllô®Ånhms]Õ¥³°°ÀÎΨ¸n{uå±°° eË–ôïߟøøxeØv¿~ýøâ‹/”8†ÖY×ehÝú \[¾¦± 1”§¡¸¦¦¦°{÷nnÞ¼Inn.YYYØÙÙé=?NNN888TxöÖP} |2EOOOZ¶l‰££#aaa<õÔSh4š*y;GjµZéh¥§§Ó¡Cš4iRaU‡””ƒ¿ cm[¹Z………Ì›7�Ù³gW¹»Ý¼ys |r3'''ÜÜÜèØ±#TæsHNNF£Ñ°yóf¾ù把Š*¬zÑ­[7ºví `puŠàà`† FãÆ� %##£Âr‡úbé²¶¶ÆÖÖ–øøx233)G"ǹ IDAT++S.èÓ®];úõëÇçŸÎË/¿Lûöí�ÖEÛ;vì W¯^z—N¬Ž¡:Œ3oooØ´iÑÑÑ8;;“‘‘QãvB!5é) !ê�±µÎ¡êÚ襥¥5š ª¦é âºíÕ•GWåmºß ­³nHåuë+_Ö-£±5Ük£rž†âž={–�?þ˜™3gÒ¶m[’’’¸w¯|.‡ÊççÎ�;ܾ}»Ú¼uëå3ÿoذ¡B‡Q«rÆÎ‘J¥bРA$&&òË/¿èíäU>^—±¶Õ÷Œpii)³gÏÆÛÛ[ï3Ç�;wÆÜÜœ˜˜úôéÃÓO?ÍÓO?Í¥K—”ηµµ5Ÿþ9�;wÖ[®šÒNâVVVV«ã8Àœ9sX´h={ö¬0D_Ÿ>}ú0aÂÒÓÓÙ¹s'#GŽÄÞÞÞh]6nÜÈÞ½{9xð 6l &&FÙ§;ìÿ~XXXàîîN›6m˜0aW¯^­ÓvB!ê› ;BÔ»êÖ:¯ìÙgŸ%99YïÚæ%%%lÙ²…¢¢"£éê²<Æâè[g]·ŒÆÖ­¿ŸØPÞéÒvµŸk𧡏©©©4kÖ gggî޽˵k× NVÕ©S'~úé'222”ç½ëRuçÈÃÃ}ûöñã�?Ò£G½Ç=zTïoÃXÛV¦ÑhøÇ?þ�‹‹ C‡U¶ë¶wóæÍ7n?þø#&L &&†mÛ¶£ »V«ÕXZZ²xñbNœ8Áwß}lj'€ò ñNž>>4mÚ”gžyÆàóº­Zµ"88˜ÀÀ@š4i‚µµ5aaa˜›W?ñbMUwŽÚ´iÃÙ³gqssÓ;É™­­-ÁÁÁÊoÃÉɉ¶mÛmÛ矾Jœ¯¾úŠøøxN�:ÅöíÛpppàÃ?¬ð;;v,ÄÆÆ²víZ6lȳÏ>˸qãP©TØØØ°téRV¬XA@@-Z´`èС<ÿüóL™2…Å‹3cÆ "##+LlV[•ciï Cù:ë§N�bõêÕ´k×N¹Slmm���»wïÆÞÞ¾ÊÚë­[·ÆÓÓ“mÛ¶‘œœL÷îÝõÖ¥}ûö:tˆÏ>û 333F�M—.]˜8q"›6m"66–!C†¯7oooï*u°°° ¤¤„M›6QTT„££# .ä™gž¨q»Ê�q!„�ZífB©»¸úö›èl×¾«ô|×M£Ò9Nû]û2ýí½ÁoŸµïVÅÅÅÿ­E]„�عsçX½zuµÃ»kšN!DÝJOOÊ/Œ‰ú#íüpH;?æææ½€\ ¸§ó®ùí³FçU¦óÒ~Gç;:Û*/Óù¬«ºç·j÷|W Ȱs!ÄcéæÍ›ÊPÑÝ»wóÊ+¯þøcîܹSgùkãøøxÔj5ׯ_¯³ü„Bñû'�o!ÄCsâÄ Úµk‡��Íï*v]Ò–óöíÛ¢R©˜} ¡S§NìØ±ƒeË–ÕYì‡ÑÆB!„øci𨠄øó8qâüÝÅ®KÚr=z”{÷î1}út:uêTãã“’’0555º­E‹DGG×Y™õyÐz< íÚµÃÃÃÞ|óMþûßÿÖYì‡ÑÆB!„øc‘;ßBˆ‡âÂ… ܾ}›_|€ÿýï¼ûî» 0___¾ûî;àÿ†ñÅxyyÀ¡C‡ðññáµ×^#((¨Â°Þʱ ¥ÕÆŽˆˆÀËË‹Áƒ«”±º2-[¶ ///ÜÜÜØ²e +W®dÈ�! >œ~øA‰“˜˜ˆ¯¯/ýû÷Çßߟ˗/W)g«V­€ò»Ö_~ù%999ÚK_Œ÷Þ{�[·n‡Z­&77Wï6myãâ⪭³¡¶*))aÑ¢E¸¹¹áêꊿ¿?eeeuR�´´4üýýquueРAÌ™3‡»wï<÷)))ʰöÑ£GsáÂ%þ®]»1bnnnlݺÕàïÏÊÊŠF�ÌÃй÷Ýwùë_ÿªÄY°`žžž\¹rEic€„„|||pssãÓO?­¶ •C!„\Òùu&5ó›~($ô«<&oÊaò¦B¿ÊcÓ…¤fÞ{ÔÅ�ØñãÇQ©T<÷Üsܼy“€€LMM™:u*&&&qõêU%ý§Ÿ~JŸ>}:t(„††bmm�¿¿? cW— 66–Q£FaggGdd$ÙÙÙ5*Ó–-[xóÍ7±µµeÙ²e\¸p�±cÇR\\Lxx8çÏŸ'((ˆ=zN^^ .¬Rξ}ûâççGVVáááxzz²fÍÊÊÊ Æ˜6mŽŽŽDEEaii©w›>úêl¬­öïßÏ®]»ðóóã£�>ÂÇÇ“:©‡�� ½{÷fÖ¬YŒ5Š}ûöUè8ëžû¬¬,Þ{ï=4 Ó§OgàÀ�J‡Ê;æ£F�ÂÖÖ–O>ù¤BçÿÛo¿eß¾},Y²„””¬7cçÞÃëW¯’––†F£áðáà 2Di  B;N�:•ÌÌLeŸ±ßCår!„â�M†�‹:±é‡BÿR\e{f¾†ÌübÿRLŸöæŒêañJ'Ç�ÇÙÙ™Æ�sðàA ÄÉÉ GGG¦L™Brr2...¼ýöÛL™2€/¿ü’’’fΜI‡Ðh4,Z´Hoìo¿ýÖhZ€àà`† FãÆ� %##ƒ´´´jˤ=îÉ'ŸdÞ¼yLœ8'''222زe �†ääd4 ›7oæ›o¾¡¨¨ˆ&MšT)'À˜1cðöö&!!�M›6�³³3zc<ýôÓ4kÖŒnݺѵkW½ÛôÑWçŸþÙ`[5oÞ€;vЫW/<<<ô¶÷ýÔÃÚÚ[[[âããÉÌ̤¬¬LPùÜÇÅÅQXXÈŒ3èܹs•z…„„àáá�……aaa\½z•:å“¢Í�;—¿üå/Lš4‰·ß~[-¡›Ç®]» žû�Ááǹuëyyy¸»»W(Ã÷ßϽ{÷”vlРsçÎ0ú{¨\!„Bü±Iç[<°å œ¾Vý�íÿ“uGÃßúë¿3'þØNœ8¡tà~ýõWîÝ+ÿÝ<ùä“@ù$VZÊç’’’ éÍÌÌ Æ®.­. ‹ò‹Aeee5*Såã4�ò];$ÛÚÚ€Ï?ÿ¼JgQ·œº±ÜÝÝiÓ¦ &LàêÕ«Fc<(Ý:k«îÝ»³qãFöîÝËÁƒÙ°a111´nÝú�ëqàÀæÌ™Ã¢E‹èÙ³' ¨K÷ÜPZZª·>*Uù.íÄgÚóðÎ;ï0iÒ$½ÇéæaìÜ[ZZÒ¯_?þóŸÿ�™™ÉsÏ=GëÖ­ÉÈÈPŽ¯ÜŽºwÅ µ�öxÝr!„â�M:ß÷!11‘eË–ñþûïÓ»wonݺŊ+8sæ yyy8;;óá‡Ò²eK233™?>éééØÛÛJ‹-€ò?àÿýï³ÿ~rrr°··'<<\ù£íq¶é‡Âu¼µN_+š^ÝðøøxÖ¯_O~~>M›6å•W^aüøñZ\£4 ®®®Íúõë '..ŽåË—?–³XGGG³k×.–.]ÊÚµkINN®³Ø666„††>Ë5Õ…ãÇ�cff¦ ‹~ê©§˜?>………DDDPVVFDD„ÁeÂÚ·oÏÌ™3¹yó&Ÿþ9Ï?ÿ¼ÁØÆÒSÛ2bccÃÒ¥KiР,_¾œS§NU)§……%%%lÚ´‰U«VQRRÂÂ… yæ™g Ƙ2e EEE̘1ƒóçÏÜVÆÚêÆ�:tˆ™3g²k×.F�M—.]ê¤îîîôë×�Õ«W³sçN£w÷;tèÀìÙ³)((`Á‚ìÙ³‡7nÔêœT§ºsß½{wš7oŽJ¥ªr—¾r;FEEñÎ;ï(çŒ�K!„Bü¹˜TŸ¤^âêÛo¢³]û®Òó]7�Jç8íwíËô·÷¿}Ö¾[ß÷z3.\ mÛ¶ãîî®Üù®ìâÅ‹,\¸�¨¨(Nž<ÉòåËùì³Ï”ý#FŒ`Ñ¢E´jÕŠwÞy‡˜˜å�µß CÏyׄ±ç¿·oßÎéÓ§õÞaªOµ½ó½aÃå�ó¨¨(Š‹‹™:uj}ówyç;$$„[·n±jÕª:‰÷É'Ÿ°eË 3[7­±!èõ­®Û >Ô¤­~õB<|ééé´iÓæ—ä�MÚùá�v~8ÌÍÍ{¹@)pOç]óÛg�ΫLç¥ýŽÎwt¶Uþ^¦óY—¾mµÙ_k¿¯ÞÞc mÛ¶F÷—••qæÌbcc7n©©©tìØ±BºgŸ}–K—.ñ믿âèèÈ�ˆ‹‹£aƼóÎ;Uîi4 „Z­æÜ¹s˜››3~üxvïÞMjj*¶¶¶ÌŸ?Ÿ–-[RZZÊÒ¥K9zô(¦¦¦ôë×�É“'×mCgnÜÿ æÆŽíÚµ++W®¤}ûö 2++« û“’’X±b………8;;3kÖ,îÞ½KXX—/_¦¤¤„‘#G2zôh4 o¼ñjµšƒ2kÖ,^zé%Μ9CDD¹¹¹ØØØ°lÙ2žxâ ™;w.gΜÁÄĄٳg×hoQQ–––ó;yò$‘‘‘äääмys>üðC æå—_fÈ�!@ù(;;;†^áBÀ±cÇX¾|9¿þú+M›6UžQ5ÔzËñ¨øúúœ…»¦vî܉J¥¢°°�½{÷Ò»woÌÌÌôÆ6”öQª‹6¨µm«ÇµB!„�;é|×±éÓ§“œœŒµµ5½zõ ;;»Êða+++rrr077çúõë\¾|™yóæqþüyؾ}{•?p ˜6m-[¶dýúõ„„„°gÏ7nLDDëÖ­ãý÷ßçÈ‘#\ºtIYºG;P]ËÌ×TŸè>ŽíСŸ~ú)ÑÑѬZµŠAƒ1vìXìííÉÊÊbÑ¢E¬]»–fÍš±bÅ Ö¯_ϤI“”çèsrrxóÍ7quuÅÎÎŽôôt&MšÄôéÓ•NÆœ9sXºt)äççÓ°aCeò¬ñãÇcooÏöíÛ‰ŒŒdÍš5ËZZZJrr²2P%¿üü|‚‚‚X½z5ööö|ýõ׳qãF<<<ضm›Òù>|øp…yyy„„„ðÙgŸaoo϶mÛX²d €Áö˜Ý�+W®°ÿ~ŠŠŠèÙ³'cJû(ÕEÔ‡Ú¶ÕãZ!Ä£ÌéÓ§õNR)êNqqùˆCiçú%í\ÿtWþø3‘Îw‹ŒŒ¤¸¸˜#Gކ‹‹ VVV\¼x±Bº‚‚lll°²²"55•/¾øÔj5œ>}Z™ìGËÂÂB™À­ÿþÄÇÇ+w…ûõëÇ_|”ß�¿|ù2ááá 0@™é÷¤S§N,^¼˜7n°qãF&MšÄŽ;HIIáÆ�Ê:¹¹¹¹´hÑSSS ؽ{77oÞ$77—¬¬,ìììxâ‰'xõÕW•Ø?þø#NNNÊ,úF,,,°··àÕW_eݺuzËwëÖ-<==iÙ²%ŽŽŽ„……ñÔSO¡Ñhªä—’’B‡”¸DEE‘••…Z­VÖþMOO§C‡4iÒD¹ =ÞÙÙY9þå—_fÇŽÊ>}íT)ÇïÝÔ©Sk<¬¿6iÿ줭„B!é|×sssúöíK»ví¸v펎Ž|ýõ×Òœ={–·Þz +++š6mŠF£ÁÔÔKKKå³!•‡…ê~oݺ5[·nåðáÃÄÄİ~ýz–/_^Gµû?Í«îûîwóÆ5»Û²eK8tè4jÔˆ_|±ÂdvPÞžü13gΤmÛ¶$%%)ËþTnË;wîpûöíjó6ö ~³fÍ*<ó­«r~÷îÝ«0AŸF£¡¸¸333T*ƒ "11‘_~ù¥ÊòMúŽ×e¨=tOB!D}Ó^–gdë—<‹üpH;?Æ‘2ÛyÉÈÈàôéÓ@yÇçØ±cdffÒ®];\\\(,,äÀ�|ûí·4iÒ„§Ÿ~šf͚ѹsg6lØ@YY¤¥¥=ÐÐÎ;wîPTTÄÀ� !%%¥Â�ÔºÒ±åý_»1vì¥K—øùçŸ�ò¶LJJ¢¬¬ {{{ºtéBZZÇŽʇ}ß½{—ÔÔTš5k†³³3wïÞåÚµk;Ÿ�:uâ§Ÿ~RÖÙ­Í2R÷£K—.;vŒÔÔT |i¦6mÚ(£<<<Ø·o?þøc•ÑÚã�=ªÿ¿ÿý�Ë—/+ûôµ‡B!„âñ"w¾kÉßߟ‚‚®_¿Î¹sçX³f ÁÁÁ¨T*Ö®]KZZ¥¥¥ØÛÛ³`Á,,Êgô^¶lóæÍcÕªU888(WˆBCC™7oǧiӦ̟?_9î~¤¥¥±jÕ*òòòhÒ¤ 3gά—g~{¶5¿ïÙÎ{¶5|¥ëÖ­[DGG“žžNii)„‡‡cff†™™áááDFFRZZÊ“O>ɸqãèÛ·/GŽÁÇLJ¦M›òÌ3Ï`b¢ÒýV­ZL`` Mš4ÁÚÚš°°°z»úÖ¬Y3BBB˜={¶’ÿ¼yó”ýmÚ´áìÙ³¸¹¹é=O¶¶¶LÆ qrrR&þkÔ¨‘Þö¨éòZâá0´n}mfØ×Ò=ÆØñ†ò¬OÕÕÇÝÝ]QbffÆ[o½…§§g�埕•Ř1cˆ‰‰©2ÏÆý®píÚ5V®\É™3g(,,dذaøùùéM{úôiþõ¯ñóÏ?“››KëÖ­yë­·xíµ×j•gII ¯¼ò £G�ÆßßßhÚ+W®àççÇÔ©S}ú0`ÀΞ=ËÖ­[™;w.k×®­uœÚª\‡ÔÔTéÔ©“'O&''‡›7oV{ž¤]…Bˆú �oñ@Fõ° 뎆Ó×j¶ìX§V ®ï-ÄÑ™3gpvv¦uëÖ@ùŶÊËçýò¬-GGG† FRRR�u¾U*jµºNbié.Ñ×¶m[úöíË… *t¾óóóYºt)={ödéÒ¥µi”””tßs4´hÑ‚èèhƒ±*ï¯�víÚáææ†››W®\áèÑ£÷§¶*×áèѣܻw�éÓ§×héGCq„BˆGMžùìoý-éÓ¾ú!Û}Ú›ó·þ²>ðŸÕÉ“'?~<^^^øùùqéÒ% |¨²��Ë–-ÃÃÃ#GŽ�œœÌ˜1cxã�7 Â××Wo\Cé´C gÏž���o¼ñ†2/Cuåquu%$$ooo|}}IHH 00�áÇ3aÂnܸ¡ÄIJJÂ××—áÇDAAA…òuíÚ•„„6oÞLnnn•òk×–9rd•2VÛ�êòÔ7++‹iÓ¦áé鉻»;ëׯ7z~Μ9Ãĉ9r$~~~ÊÜ ÆêSYQQ‘²ÌŸ¾< �£àà`öìÙ£ÄY¹r%Û·oG£Ñ0`Àeû±cÇ”ßFXX¿þú«Ñ60T]™™™8::VØvêÔ)òòòðöö6ÚñNLLÄ××—þýûãïïÏåË—yï½÷¸uëqqq¨Õj½ç+##µZMDD^^^ <˜ØØØ ûâââôÆÒÝŸ––†¿¿?®®® 4ˆ9sæÔhŽˆË—/“––†“““Ѻ”””°hÑ"ÜÜÜpuuÅßߟ²²2Nœ8�Z­&)) €+V ¤¯­ZµÊïdùå—UFqÜo» !„›t¾E�Õ™Ë;áº3™7o¬¢O{sf´”;ÞbÚµÎçÎ�˶mÛpww'88XÙŸžžN·n݈‹‹ã¥—^"77—ÐÐP,X@LL ...Ê„sºªKWPP€¿¿?[¶lÁÛÛ›ÈÈÈ•§  €iÓ¦±uëVLHH¡¡¡lß¾ggge :í:ëŸ|ò Û·oÇÎÎNé´ji×­?~ü8C‡eþüù\¹r¥BšñãÇ[¡Œ5‰mˆ±< ÅmÚ´)¡¡¡ìܹ“�7²yóf®^½ª÷ü2gÎBCC‰��%<<œ† ­�®ÒÒR¾ÿþ{•åð*çaìyxx°ÿ~%ÞáÇ8p`…<òòò Q~¯¾újµm ¯º~þùg222ª 9×N€hkk ”?ž¤V«•—F£áüùóÑ£GeyÁ… 2mÚ4 |$@TT––†/PÆÆÆ2jÔ(ìì숌Œ$;;»ÂþêbÙØØÐ»wof͚ŨQ£Ø·o[·n5˜_tt4jµoooÊÊÊøàƒ ÖeÿþýìÚµ ???>úè#||| νaˆ¾:ôíÛ???²²²ÇÓÓ“5kÖPVVV'í*„B<,2ì\Ô™vÍ}–[üy[ëÜÆÆFïZì†Ö6×U]: ìì쀊ë¶WW Z¶l @ÿþý‰��W†m÷ë×�/¾øB‰ch�u]†Ö­oР�ÁµåkÛCyŠkjjJAA»wïææÍ›äææ’••…���Þóãä䄃ƒ@…go ÕÊ'Sôôô¤eË–8::ÆSO=…F£©’‡±s¤V«•ŽVzz::t I“&VuHII1øÛ0Ö¶•Ë¡UXXȼyó˜={v•»ÛÍ›7Ê'7srrÂÍÍ�Ž;rðàAe>‡ääd4 ›7oæ›o¾¡¨¨¨Âªݺu£k×®W§fذa4nܘÐÐP222*,w¨/–.kkklmm‰��'33“²²2åÂ�>íÚµ£_¿~|þùç¼üòË´oßÞh]´í°cÇzõê¥wéÄêªÃ˜1cðöö&!!�M›6�³³35nW!„âQ“ž’̤x  IDAT¢Þ[몮�^ZZZ£ ¢jš*®Û^]ytUÞ¦ûÝÐ:ë†T^·¾òðeÝ2[ý6*çi(îÙ³gùøã�™9s&mÛ¶%))‰{÷Êçr¨|~îܹÃíÛ·«Í[·>P>óÿ† *tµ*çaì©T* Dbb"¿üò‹ÞN^åãuk[}Ï—––2{öl¼½½õ>sܹsgÌÍ͉‰‰¡OŸ><ýôÓ<ýôÓ\ºtIé|[[[ðùçŸÓ¹sg½åª)í$neeeµ:îÀ�Ì™3‡E‹ѳgÏ CôõéÓ§&L ==��;w2räHìíí�ÖeãÆ�ìÝ»—ƒ²aÃbbb”}ºÃþ…îîî´iÓ† &põêÕ:mW!„¢¾É°s!D½«n­óÊž}öY’““õ®m^RR–-[(**2š®.Ëc,޾uÖuËhlÝúû‰ å�.m'\û¹¦yŠ›ššJ³fÍpvvæîÝ»\»vÍàdU�:uâ§Ÿ~"##@yÞ».UwŽ<<<Ø·o?þø#=zôÐ{üÑ£Gõþ6Œµme�†ü㸸¸0tèPe»n{7oÞœqãÆñã�?2aÂbbbضm111ʰkµZ�¥¥%‹/æÄ‰|÷Ýwœ8q(ŸïäÉ“¤¤¤PRRò@íf,–ö1‚¬¬,:¤loÔ¨*•ŠsçΑŸŸ_%æäÉ“)++cÅŠFëráÂ’““éÕ«ýúõ£¤¤„ììlå™íuëÖ±cÇŽ +uèË»r `Æ ÄÆÆ‰J¥â…^xhí*„BÔ¹ó-„¨wÕ­u^™­­-AAAÊÚævvvJg5;;›uëÖñâ‹/Ò¶m[ƒéê²<†ZgÝÞÞ^)ãíÛ· ®[oì.¶¡Ø...xxx0~üx"##•ϳfͪQžfffzãöíÛ—#GŽàããCÓ¦Myæ™g >¯ÛªU+‚ƒƒ ¤I“&X[[†¹yõ/ÖTuç¨M›6œ={777½“œÙÚÚ¬ü6œœœhÛ¶­Ñ¶}þùç«Äùꫯˆ��çÔ©Slß¾>üðà ¿Ã±cÇâàà@ll,k×®¥aÆ<û쳌7•J…�� K—.eÅŠТE †ÊóÏ?Ï”)SX¼x13fÌ 22²ÂÄfµU9–öÎ0”¯³~êÔ)V¯^M»ví”;ÅÖÖÖøøø°{÷nìíí«¬½Þºuk<==Ù¶mÉÉÉtïÞ]o]Ú·oÏ¡C‡øì³Ï033côèÑtéÒ€‰'²iÓ&bcc2dñññzóööö®R JJJØ´iEEE8::²páBžy怷«ÜBñ¨Õn&”º‹«o¿‰Îví»JÏwÝ4*�ã´ßµ/ÓßÞüöYûnU\\üßZÔEñˆ�;wŽÕ«WW;¼»¦é„BÔ­ôôt ü˜¨?Ò·´óÃannÞ ÈJ�{:ïšß>kt^e:/íwt¾£³­ò÷2�Ϻª{~«vÏwÕ€ ;B<–nÞ¼© ݽ{7¯¼òÊ¥B!„âQ’açBˆÇRBB_}õ¦¦¦¸¸¸ðúë¯?P:!„B!%v.„B!ˆ Ó}8¤�iç‡C†� !„B!„¢ÎIç[!„B!„¨gÒùB!„B!ê™t¾…B!„Bˆz&�o!„B!„¢žIç[!„B!„¨gÒùB!„B!ê™t¾…B!„Bˆz&�o!„B!„¢žIç[!„B!„¨gÒùB!„B!ê™t¾…B!„Bˆz&�o!„B!„¢žIç[!„B!„¨gÒùB!„B!ê™t¾…B!„Bˆz&�o!ÄC³uëVÔj5ÙÙÙõûÚµkøùùñꫯYçyÅÇÇ£V«¹~ýz­�ÍÈÈ@­V³gÏž:/WeõÙÞõ©rûÞ¾}›¥K—Ò»woÒÒÒqé„B!îOƒG]!ğlj'h×®666õ;88˜ŒŒ >øàZµjUçyÕ—yóæÑ±cG¼¼¼ê$^}´w]—±:›7oæ³Ï>£°°ð¡ä'„BQ_¤ó-„xhNœ8ÁÀ�ë=vZZÝ»wgРAõ’W}IJJÂÔÔ´ÎâÕG{×u«S\\Ìo¼�••-_!„Bˆº&�o!ÄCqáÂn߾͋/¾Àÿþ÷?V¬XÁ… hÕªþþþôîÝ›ŒŒ FŒÁÔ©SÙ¹s'O=õK–,áСCüóŸÿ$??Ÿçž{Ž„„vî܉��]…Øþþþ\¼x‘‹/²gÏfΜÉâÅ‹«ÄKLL$**Š«W¯Ò±cG‚‚‚ppp0¸=!!�U«V‘——‡™™Y…ºé;ÆÎÎNÉçÞ½{899±råÊ Ç1vìXLMMiÖ¬·nÝ"..ޏ¸8âãã±²²2ÚNÞÞÞøúúòí·ß0qâD† R¥½KJJô–åÝwß%//�mÛ¶°páB~øá¶lÙÂÒ¥K«¤Ð[F}õW©TŒ1þûßÿRPPÀ¸qãÈÌÌd÷îÝ<ñÄÑ£Gƒí;fÌ |(ºB!Äï™<ó-êLéÉŸ¸¾Œ;Þo‘ÿRò_êÏï·¸¾ŒÒ“?=êâ‰Gìøñã¨T*ž{î9nÞ¼I@@¦¦¦L�:‚‚‚¸zõª’þÓO?¥OŸ> :”ŒŒ BCC±¶¶Æßߟ„„ƒ±°··'**ŠÎ�;W‰wþüy¥ãN^^ .4¸]7ÿ©S§’™™©ämè˜ýû÷³k×.üüüøè£�ðññÁÄÄD9®¬¬Œùóç“��Mxx8ï½÷ŽŽŽDEEaiiYm;i46lØÀ»ï¾‹µµ5óçÏçÒ¥KUÚÄPY^{í5®\¹Â¥K—Ðh4ü¿ÿ÷ÿpssãÀ�zÓO›6­J Õ_kË–-¼ùæ›ØÚÚ²lÙ2.\¸Àرc)..&<<Àhû !„BüQÈ�oQ'î†/£dÇWU¶k®d ¹’AÉŽ¯0>”'ßx¥�ƒãÇ�ãììLãÆ�9xð ………âää„££#S¦L!99Þ~ûm¦L™À—_~III 3gΤC‡h4-Z¤7vãÆ�qttäÙgŸ¥k×®dddT‰·iÓ&4 ›7oæ›o¾¡¨¨ˆ&Mš�œœ¬wû÷ßϽ{÷”ü4hÀܹs Ó¼ysvìØA¯^½ððð¨Ð[¶láܹs„……aoo@³fÍèÖ­]»vàÈ‘#Õ¶Óüùóquuå©§žb„ÿÏÞÝÇÕ|÷uºABÚDZîg‘36¹Ém“ìÒÆfíBØÌÝH¡ ›!i&�¹0&fnFÓ†äú™v k.÷Ë}n‘¢túýÑÎ÷:§Î9§l¼Ÿ�Çyœ¾ßïçû¹y¿®kŸóý|?Ÿ÷IJJÂÅÅE/&ÆêÒµkW"""øå—_hÖ¬ééétïÞ�›7oLÿ /©£±ökÑ·o_*V¬ÈÌ™3ùç?ÿ‰››©©©¬_¿�Fc2¾B!„O é|‹Ç–=v=PlºÜM?�ù*•Î-‡Z‰¿šÃ‡+�¸ððáC*V¬€���’¾nݺÊß¹¹¹zé ûÖÍÛÝüìííX¾|¹òdPf /¼?&&F¯|Ý'ØÆòX³f ;vì`÷îݬ^½šuëÖ)ÇÜÜÜ8}ú4ñññtïÞÝ`�K§ììlà1ÑÓ�IëÖ­ Ö¥N�:¨Õj~ùåÒÓÓyñÅquuÅÕÕÕhúÂŒµ_û£‡–­­-Pð´^»�ŸŸ½¾ºñB!„xZȰóG���À믿ξ}û”}7oÞdÆŒ 4ˆž={òÑGqíÚ5åø�7øðÃéß¿?cÆŒáúõëìܹ“þýûë}Ôj5,÷v=Šûs”¨ã­õð×ÜŸ»  kT¾®^½Š¿¿ÿ“®Æ_Þ¹sçHOO§uëÖxzzbiiɼyóغu+ØÙÙ)ïÿæáá�……óæÍãÇä“O>1šwI¨ÕjìììøüóÏ9|ø0ûöíãðáÃF÷ë–ËôéÓ‹ÍëìÙ³$%%Ñ®];:vìHnn®Þ’_­ZµbèСìÙ³‡ï¿ÿ€jÕªqäÈ’““ÉÍÍ-QœfÍšEll,áááØØØàééY$&¦êÒ³gO>Ì�?þH�=ŠM_¸ŽÆÚ_¦â+„Bñ´�Îw)ܽ{—#F°cÇ*W®¬w¬B… øùùÖ-[x饗ôfæ�0ao¼ñ›6m¢S§N|üñÇx{{³iÓ&åE�:uhÕªU¹¶íQäù¯Á¡æÅÉÝôC¹½¾xñb½AÄ“qèÐ!¬­­•¡Êõë×',,Œ¬¬,ÂÃÃÉÏÏ'<<Üè’X 6dâĉ\¿~�åË—ëýû(œwI8880þ|¬¬¬7n‹-âèÑ£F÷ë–ͻヒ•••ɼ®]»Æž={˜8q"[¶laÈ�!4oÞ\¯4iÒ„… òÇ0jÔ(²³³?~<§N�*Qœ\]]ùâ‹/¸}û6³gϦvíÚEbbª.¯½öVVV¤¥¥)3£›J_¸ŽÆÚ_¦â+„Bñ´(«±}Ååk踅Î~í·ÊÀ¶n•ÎyÚmíÇòÏo«?ÿÖ~WËÉÉù¥mÑsöìY\]] ÂÇLJöíÛLwîÜ9fÏžMtt4GŽaÑ¢E|õÕWÊñ0gÎÜÜÜôÎ‹ŠŠ¢R¥JÊ ¿eÆÞó.‰òzÿ; €   ^xá…2ÉÿêÕ«Œ?ž5kÖ”IþO‹àà`n޼ɒ%KÌ’ßÂ… Y¿~= „††š5ï¿ í¬ðÚw¾u•6Þþþþ888YUB<.\¸@½zõžpMžnçò!q.666í€ x¨ó­ùóo�Î'_ç£ÝFg�}…·óuþÖeh_iŽ—š>žI“&ñÙgŸ‘––FµjÕ¸sçŽ^ºÌÌÌ"ï·nذ___£yÛÚÚ*O_;uêDýúõ©V­*•ŠŽ;råÊ àéüÅ‹™;w.IIIEf†þ«3VÿvíÚqâÄ ²³³9uêÎÎÎØÛÛ—¸½ÉÉÉ\»v�Ù³g3~üx’““•aE%�mrr2îîîÊÒP¯¾ú* 4(ë�`ôèÑlÞ¼™¸¸8>ùäe–ígU�:uHLL,2ä¼´ÆŽ˾}û¨V­š™j&„B! ‘'ßeÀÆÆ///4hÀ•+WpqqaÛ¶mziNœ8Á[o½¥·ýàÁƒ"2S¸ƒ©»]§N6lØÀÞ½{Y·n«V­bÑ¢E�Ñ"ÃTÎuùé·Ê¹è’EZÆêoee…——ûöíãôéÓôêÕËdúÂ*W®L›6mô&ƒÿ-}¤e*¶>,2ÙžB!„xzÌž=�w¾ËÚ³8²@ž|›Ijj*ÇŽ :säÆ�4hв²²Øµk?ÿü3U«VÕ›¬¸§Þ¥qïÞ=²³³éÚµ+ÁÁÁ$''é`šƒe›—Ëä\SõïÙ³'»víâÀ�¼öÚkŦ···Wf;oÞ¼9gΜQ–qËËËãþýû¥ªwóæÍ9pà)))üöÛo\¼x±t�B!„B—.]¢OŸ>ÄÅÅ™½ŽB!„�aç¥öå—_=¶`Á£ÇêÔ©CTT”ÁcU«V%66Öd¹*•ŠÝ»w+ÛNNNzË[µhÑBNݼys“õ4ËæÍ°îß§ÔË�Y÷ïƒeófF�Wÿ (“®—þå—_Ö›=¾iÓ¦DGGIWÒØxyyáååe´~¢|-^¼˜>øOOÏ']•RY¼x1¾¾¾Ê\%åY·%K–ðÿ÷Ô¯_ßhšœœ–/_^äýöõëד��]Æ5|vØØØàè証Z3sæL7nl¶QYB!ijNž|‹ÇRqÒ8¬Ú¶)qz«¶mk}ïÛ·o“’’BË–-9ñtIOO§NãsüU>|˜{÷î=éjTžuëÖ­«W¯69qœ¶SøË/¿(û²³³Ù³gÍšÿ!O”N­ZµX±b¯¾ú*‰‰‰œ:uê ×J!„xzÈ“oñØ*-œËý¹ Š}nÝ¿Ïcu¼¡`x¥——W™ £eëÈ‘#DDDpûömjÖ¬ÉäÉ“qqqA£Ñðæ›o¢V«Ù½{7S§Nå•W^!))‰ÈÈHýôS.]º¤ìôÖ»×­C»ví˜7oÙÙÙ\¼xgggìíí�¦7T7Cm°µµUžlwêÔIïéhÇŽùæ›o”<õzê:t(ÿú׿èÔ©^^^TªTI9fiiIff&Û·oçúõëddd�––†““¶¶¶899Ð¥KåGc礤¤”ú€¢÷^Iìß¿Ÿ¬¬,&L˜€››...Œ5Ф¤$úöí‹££#qqqܸqƒüü|.^¼È¯¿þÊÇ™8q"�5ÂÊÊŠ3f`aa,‹¨+//KKKe;((ˆ¾}ûR¥JBBBHMMÅÁÁA9þ /P£F Z¶lI‹-JÕ&!„B&�o!D™+¼>ºF£!''G.«Û)€‚ŽÂ£®§^8/cë»'&&Üo´lcyFךW©Txyy±k×.Þxã ƒC„‹‹�î’xXYYQ¡B½<Œ­woee…——ûöíãôéÓôêÕËdú’¶¹ðò……Û¥»]¸}�ªM›6,^¼˜Ù³g³cǽc'Nœà³Ï>câĉ¸ºº’˜˜X¤ `eeUì9¦î?Sñ(|ï•„vø½¶®+V ÞsßµkÓ§OgΜ9´mÛV™9?77Wïm‡àùçŸWÚ¦MìØ1çò!q.666í€ x¨ó­ùóo�Î'_ç£ÝFg�}…·óuþÖUÜ;Wf'K†� !þ’®_¿® uݾ}»2\Z”ÞíÛ·III¡eË–Oº*rÿ !„ÂÜdعâ/)>>ž~øKKK<<}úðÙgŸqïÞ=³•éÒ%úôéC\\\‘cqqq¨Õj®^½j¶ò„Bñ÷cõ¤+ „xv>|˜ àààð·ÊÛœ´õ¼uë&L I“&Œ1‚Û·osýúuªT©Rl‘‘‘¤¦¦òñÇóÜsÏ1sæL7nŒ¯¯o9´À0s´«¬uèÐ�:ðïÿ›M›6‘““CHHˆYò¶±±ÁÑёʕ+›%?!„B<}¤ó-„(7‡¦k×®»¼ÍI[ÏððáCÆŽK“&MJ•Ç™3ghݺ5ݺu`òäÉXZZ–EuKÌí*k 4 wïÞôîÝ›üãüòË/fË»V­Z¬X±Âlù !„âé#ÃÎ…åâìٳܺu‹6mÚðÛo¿ñÞ{ïѹsgüýýÙ·oð¿áÃß|ó ¾¾¾L˜0€={öàççGÏž=™2eŠÞ0ÞÂyK«Í;<<___ºwïNLLŒRÇâê´`Á|}}éÑ£ëׯgñâÅôêÕ‹þýûóŸÿüGÉ'!!:uêD`` /^,RÏçž{€™3gòý÷ßsûöm½x«K`` çÎ�#66µZ�ŸŸ7oÞdëÖ­¨Õj2226l˜òdÈΞ=«ä¿eË @�=ذaƒÑû±ZµjT®\ÙhÆâÿÞ{ïñÆo(ùÌš5‹~ýúqéÒ%Ôj5[·n >>???zôèÁ_|Ql ŒÕC!„Oé| ³I¹ñ�µÿÉ"ä‡;ŒX{›koòÃÖþ'‹”ŸtõÄvèÐ!T*/½ôׯ_gܸqXZZ2zôh,,,˜2e —/_VÒñÅtèÐ�>}ú�ššJHHöööo4ïâÒÄÄÄ0xð`œœœˆˆˆ ==½DuZ¿~=ÿøÇ?pttdÁ‚œ={–wÞy‡œœæÎ� À©S§˜2e žžžÌ�;—;wî0{öì"õôòòbäÈ‘¤¥¥1wî\úõëÇÒ¥KÉÏÏ7Ym§ÌÙÙ™èèh‚ƒƒpqq!::;;;¼½½¹téW¯^%99™»wïrþüyΜ9éS§¸uë�:uÂÁÁ�öíÛ3uêTÌO?ý¤×aÕ½æh—±úè#4 cÇŽ¥k×®J‡ :æƒÆÑÑ‘… êuþþùg~úé'æÍ›Grr2Ý»w7X†©ø÷îݛ˗/sæÌ4 {÷î¥W¯^XXX(yéÞƒ£G�æÆ�Ê1Sq,\!„B<]dع0‹µÿÉbï9Eö߸«áÆÝöþ‘C‡†6 ö´}µ‡ÂÝÝ�*Uª°{÷n²²²˜0annn¸¸¸0jÔ(’’’ðððàí·ßfÔ¨Q|ÿý÷äææ2qâD5j„F£aΜ9óþùçŸM¦ ¢oß¾T©R…��RSS9sæL±uÒžW±bEfΜÉ?ÿùOÜÜÜHMMeýúõh4’’’Ðh4|ûí·üøã�dggSµjÕ"õ:t($>>žµkײbÅ ÜÝݹ}û¶ÑºôíÛš5kF‹-¨Q£-[¶T¶»téBdd$ä�?þÀÇLJýû÷³wï^,,,ptt¤Y³f¨T*‰‹‹ãÆ�äçç+O³ _ƒµk×>v»RSS æaoo_âzlݺ•¬¬,Æ�OÓ¦M‹ÜgÁÁÁôîÝ[[[BCC¹|ù2�5 &E›1cÏ?ÿ<Ççí·ßVFOè–±eË£ñïÚµ+áááìÝ»—›7orçÎ|||ôêð믿òðáCå´²²bÆŒ&ï�ÂõB!ÄÓE:ßâ±-ŠÏ䨕âŸlïý#‡´{>èdWµ5‡¦wïÞ bÅŠ$$$P±bE¼¼¼P©TìÚµ‹éÓ§3gÎÚ¶mKçÎ�õòѽæh—±1š·©´¦”¶NƨÕjìììøüóÏùðÃÉÊÊÂÖÖ–êÕ«ëÕ3!!�-[¶ÐªU+llløùçŸQ©T¼üòËT¨PÁh] ©V­GŽ!99™&Mš`mm­,CV±bEÚ´iƒ­­-7n`ذaÊ�ú´´4öìÙSæíªY³¦ÁøàŽ=jp¶tÝ{pÀ€z÷ ±8ÖªUˬmB!ž�FÃùóç å믿fذaÒ ÿ“D î޽ˈ#رcG‘åd*T¨€ŸŸ111lÙ²…—^z‰ððpåø„ xã�7Ø´i�:uâã�?ÀÛÛ›M›6)Ÿ¨¨(êÔ©C«V­Êµm�"åÆCƒCÍ‹³÷�“ï€;vŒU«V1wî\¶nÝÊ¢E‹þ’³X¯X±‚-[¶0þ|–-[FRR’Ùòvpp $$ä/±<“9:tkkkeXtýúõ #++‹ððpòóó 7ºLXÆ ™8q"ׯ_gùòåzÿ> çm*­)¥­“1ÌŸ?+++Æ�Ç¢E‹8zôh‘zÚÚÚ’››ËÚµkY²d ¹¹¹Ìž=›_|±Ôu5jÙÙÙŒ?žS§NCÏ¡ #X¡B^zé%*UªÀË/¿ üˆÔ±cG¢¢¢Ø¼y³ÁaÜæl—±ù:í6:Ûèì+¼�¯ó·.CûJs¼ÔdØy)¹ººš<žŸŸÏñãlj‰‰Q†v¦¤¤Ð¸qc½tÍš5ãüùóz�ïÜÜ\bccY¹re‘|5 ݺuC­VsòäIlll`ûöí¤¤¤àèèHXXµk×&//�ùóçsàÀ,--騱##FŒ0Cëõ¿öè3˜›:·E‹,^¼˜† Ò«W/ªU«¦w<11‘ÈÈH²²²pwwgêÔ©Ü¿ŸÐÐP.^¼Hnn.ƒ bÈ�!h4Þ|óMÔj5»wïfêÔ©¼òÊ+?~œððp222ppp`Á‚T¨P�¬¬,f̘ÁñãDZ°°`Ú´i%Z«8;;;;;£å9r„ˆˆnß¾MÍš5™IæˆÁ_ÑÓÚ.!„B<•JE—.]èÔ©qqq|ýõ×\¼x‘O?ý”-[¶<éê=Òù6³±cÇ’””„½½=íÚµ ==½ÈðájÕªYÿv×®]´jÕŠêÕ«Ì;33“1cÆP»vmV­ZEpp0±±±T©R…ððpV®\ɤI“Ø¿?çÏŸW–êÑNþcn7îjŠOôç6jÔˆ/¾ø‚+V°dɺuëÆ;#³³3iiiÌ™3‡eË–Q£F "##YµjÇWÞ£¿}û6ÿøÇ?ðööÆÉɉ .0|øpÆŽ«tȦOŸÎüùó©[·.wïÞ¥R¥JÊäY8;;³qãF"""Xºt©Ñºæåå‘””¤Ì)ïîÝ»L™2…¨¨(œ��Ù¶mAAA¬Y³†Þ½{óÝwß)�ï½{÷ê��¸sçÁÁÁ|õÕW8;;óÝwß1oÞ<£ñ1bD‘zîØ±#ß|ó PðtþâÅ‹Ì�;—Î�;+!ý�4iÒ„Ï?ÿœk×®±f͆ΦM›HNNæÚµkʺ¸ÔªU KKK233Ù¾};ׯ_'##ƒ´´4œœœ¨P¡‚òþ+Àï¿ÿŽ›››2«°î#¶¶¶8;;ïÌ…ìõë×�ÚµkãââBhh(õë×G£Ñ)/99™F�)ùöîÝ›èèhÒÒÒP«ÕÊZ¿.\ Q£FT­ZUù!@{¾»»»rþ«¯¾Ê¦M›”c†â©ÇßÝèÑ£K<¬¿4i…B!„(Òù.666xyyÑ A®\¹‚‹‹ Û¶mÓKsâÄ Þzë-½íмyó•Qx­îv�:uذa{÷îeݺu¬ZµŠE‹=F‹ «YEõÈO¿kV)Ù“ØÚµk3nÜ8öìÙCjj*•+W¦M›6z“ÙAAü>ûì3&Nœˆ««+‰‰‰Ê2?Úe›´îݻǭ[·Š-[;A’!5jÔÐ{ç[Wáò>|¨7AŸF£!''kkkT*ݺu#!!�?þø£ÈrM†Î×e,�¦H=„Bˆ²¢ýXÞ‘-[ò.rù�8—�gqd�Ìvn&©©©;v (èøÚúL›6M™×B+77—×^{MÙ¶³³£yóæŒ?^yŦ<ê¡ëQb.„B”†t¾KéË/¿4zL;á–!uêÔ!**Ê౪U«k²\•J¥÷´NNNzÿÙ¢E eèqóæÍMÖÓ\Ô´¢CÃÒwÀ;4´¡AMã·ÞË/¿¬¬ClHÓ¦M‰ŽŽ.²?,,Ì`zC�îݻӽ{w“iíììØºu«Á<·oßnpáë¤Õ¾}{£ËÒAÁhSùxyyáååeð\cñ(M‡N”ÝuëëÔ©CFFF‘ÉŸ†2KjÅŠ888pþüyF�…³³³Ùæ¥ppp $$Ĭ�¥sçÎáëëKË–-9wî���´lÙR™PS+..ŽÐÐP7nŒ¯¯/œúè#nÞ¼ÉÖ­[Q«ÕdddðÜsÏOU¿ÿþ{½Q ‡F­V“˜˜@ddd‘Q5ß~û-ýúõ£ÿþüøã�@Á0ï9sæÐ£G¼½½ $??ßh½Îœ9C`` ÞÞÞtëÖ�éÓ§sÿþ}RSSQ«Õ|óÍ7øúú*¯K%''@çÎ�2dgÏžUê³eË @�=”%0 Ó–éææf2^ÆÚQ’¸h•6楹vB!„)Òùf1ØÓ–‰] :áº3™×¬¢¢CC&vµ“'ÞÏ0íZç3fÌà»ï¾ÃÇLJ   åø… hÙ²%[·nå•W^!##ƒ��f͚źuëðððP&œÓU\ºÌÌLY¿~=$""¢DõÉÌÌd̘1lذ�îÝ»LHH7nÄÝÝ]Y‚N»ÎúÂ… Ù¸q#NNNJ§UK»ný¡C‡èÓ§aaa\ºtI/M@@111zu,IÞÆ˜*ÓX¾Õ«W'$$„Í›7³f;ýö[._¾lðúdee1}útBBBˆ‰‰aîܹTªTÉd{tåååñ믿’�� ,‡W¸ SרwïÞìܹSÉoïÞ½tíÚU¯Œ;wî¬Ü]ºt)6†ê¡ëôéÓ¤¦¦r®�ÑÑÑ(x=I­V+�FéS§˜2e žžžÊò‚³gÏf̘1@ÁH€èèhìììðòòbäÈ‘¤¥¥1wî\úõëÇÒ¥K•ÎrqŽ=ʰað³³cæÌ™œ?ž�;w²eËFŽɧŸ~ŠŸŸFëåàà@ûöí™:u*ƒæ§Ÿ~Òë8ñÅtèÐ�>}ú�––ÆG}„F£aìØ±tíÚUéÌBAÇ|ðàÁ8::²páB½ŽíŠ+P«Õ 8�üü|>þøc£õ2ÖŽÒ(mÌKsí„BSdع0›5­L¾Ë-ž]¦Ö:wpp0¸»±µÍu—ÎÖÖ'''@ÝöâêckkKíÚµèÔ©qqqʰíŽ;òÍ7ß(ù[g]—±uë­¬¬Œ®-_Ò¼�1V¦±|---ÉÌÌdûöí\¿~�ŒŒ ÒÒÒprr2x}ÜÜܨ[·.€Þ{±ÆÚ“)öë×�ÚµkãââBhh(õë×G£Ñ)ÃÔ5R«ÕJ'èÂ… 4jÔˆªU«ê­ê�œœlôÞ0ÛÂõÐÊÊÊbæÌ™L›6­ÈÓíš5kpéÒ%ÜÜÜèÑ£�7f÷îÝÊ|IIIh4¾ýö[~üñG²³³•U/jÔ¨AË–-iÑ¢…’çСC8p ñññ¬]»–+VàîîNÕªU‹»ô„††Ò½{wêիLj#8xð ²\ΦM›h×®�²¬¡±zÙÛÛãèèH\\7nÜ ??_ù‘àí·ßfÔ¨Qlݺ•¬¬,Æ�OÓ¦M‹Ô'88˜Þ½{ckkKhh(—/_¦Q£F@Á°óŽ;²|ùr^}õU6lh²^ÚXnGi”6æ©©©¥ºvB!„1ÒSB”9Sk�CѵÑóòòŒ®mþ(é@Ýöâ꣫ð>Ýmcë¬SxÝúÂ×uëhj ÷Ò(\¦±|Oœ8ÁgŸ}ÆÄ‰quu%11‘‡ ær(|}îݻǭ[·Š-[·=P0óÿêÕ«qpp(’¶p¦®‘J¥¢[·n$$$ðÇì€>_—©Øz7//�iÓ¦1pà@ƒï7mÚÖ­[G‡xá…xá…8þ¼Òù¶··`ùòå;¨†ØÚÚâããC½zõxÿý÷¹|ù²ÒùÖBoŒv4‚¥¥%­[·fÍš5ìØ±ƒÝ»w³zõjÖ­[g´^»víbúôéÌ™3‡¶mÛê ç”^ à‡ mœ ÑþX¡½ºOð;tèÀûï¿Ï… ؼy3ƒ ÂÙÙÙd¼ µC«$q1ÅPÌåÚ !„†È°s!D™+n­óš5kFRR’ÁµÍsssY¿~=ÙÙÙ&Ó™³>¦ò1´ÎºnM­[ÿ(yCAçEÛ ×þ]Ò2�å›’’B�5pwwçþýû\¹rÅèDRMš4á¿ÿý/©©©ÊûÞæTÜ5êÝ»7?ýô¿ÿþ;žžžÏ?pà€Á{ÃTl Óh4|òÉ'xxxЧOe¿n¼k֬ɰaÃøý÷ßyÿý÷Y·nß}÷ëÖ­S†D«ÕjìììøüóÏ9|ø0ûöíãðáÃ@Á„xGŽ!99™ÜÜ\7n«W¯&&&†ˆˆT*/¿ü²2œ{åÊ•lÚ´ÉàÒiÓ§OçÇdÁ‚ØØØÐ¦MΞ=KRRíÚµ£cÇŽäææ’žžn´^ÚWÒÒÒØ³g�Ékåáá�J¥báÂ…ìÚµ‹mÛ¶�§1#FŒ ??ŸÈÈH“ñ2ÖSq©\¹2*•Š“'Or÷îÝRǼ4×N!„0Ež| !Ê\qk�æèèÈ”)S”µÍ�œœ”Îjzz:+W®¤M›6¸ººMgÎúcl�uggg¥Ž·nÝ2ºn½©§ØÆòöðð wïÞ¡ü=uêÔ•immm0_///öïß�ŸŸÕ«WçÅ_4ú.ísÏ=GPP&LP†(‡††bcSüÄ‹%UÜ5ªW¯'Nœ G�'9stt$((H¹7ÜÜÜpuu5ÛV­ZÉç‡~ ..Ž£G�²qãF à©ïäÉ“õîÃwÞy‡ºuëòe˨T©Íš5cذa¨T*˜?>‘‘‘Œ7ŽZµjѧOZµjŨQ£øüóÏ?~<ØÚÚ’››ËÚµkÉÎÎÆÅÅ…Ù³góâ‹/ðÏþ“µk×C¯^½ˆ‹‹SêkeeE‡ˆˆˆ ZµjÌœ9“矞ÄÄDöìÙÃW_}…µµ5C† ¡yóæëåããÃÑ£G‰ŠŠ¢Aƒ&Ÿø6jÔˆiÓ¦ñõ×_3kÖ,ÜÝÝiÞ¼y‘‘¦Ô©S‡~ýúñÝwß‘””DëÖ­ Ö«aÆFÛa,.öööøùù±}ûvœ��8p`©c^Òk'OÆ…B˜RºYJÌ—¯¡ã:ûµß*ÛºiT:çi·µË?¿­þü[û]-''ç—R´Eñ„�$ÎåC†� !„B!„Âì¤ó-„B!„B”1é| !„B!„eL:ßB!„B!D“ηB!„BQƤó-„B!„B”1é| !„B!„eL:ßB!„B!D“ηB!„BQƤó-„B!„B”1é| !„B!„eL:ßB!„B!D“ηB!„BQƤó-„B!„B”1é| !„B!„eL:ßB!„B!D“η¢ÜlذµZMzzz™æ}åÊFŽI—.]ˆˆˆ0{Yqqq¨Õj®^½ZêsSSSQ«ÕÄÆÆš½^…icÒ­[7Ôju‘O‡ÌRŽ9ÚtâÄ &NœH¯^½èܹ3cÆŒáüùózi´í¹víšÁöÌŸ?¿Te>ÎuÔºté}úô!..î‘óB!ijÁêIW@ñì8|ø0 4ÀÁÁ¡Ló "55•�?þ˜çž{Îìe••™3gÒ¸qc|}}Í’Ÿ6&äääpþüy¾þúkÞzë-5j„………YÊ1‡;wî`ooÏðáùví«W¯fÖ¬YDGG+i ß?:t K—.Êñºuë–{½mllptt¤råÊŦ5÷õB!Äß‹t¾…åæðáÃtíÚµÌó>sæ ­[·¦[·neRVYILLÄÒÒÒlùicÒ©S'~ÿýw¾þúkZ·n�Z­6[9æàé鉧§§²}êÔ)N�:¥—¦ðýÓ Aºwï^nu4¤V­Z¬X±¢DiÍ}}…Bñ÷"ÃÎ…åâìٳܺu‹6mÚðÛo¿ñÞ{ïѹsgüýýÙ·oð¿!Ìß|ó ¾¾¾L˜0€={öàççGÏž=™2eŠÞpaݼ9wî±±±¨Õj6nÜh0¿„„üýýéÔ©���\¼xÑäþøøxüüüèÑ£_|ñ…^Û �“››Ëœ9sèÑ£ÞÞÞ’ŸŸ¯w^vv6ƒ bðàÁŒ3†›7o²uëVÔj5ÅÆ©]»v,^¼˜~ýúѯ_?½aß…ãmŒ¡xŸ9s†ÀÀ@¼½½éÖ­Ó§Oçþýû$''@çÎ�2dgÏž5Ú¦ììlƒ±1v�óóó9rä«V­âðáà 6Ìd{Ξ=ËÎ�;•ÏíÛ·•¼ÃÃÃñõõ¥{÷îÄÄÄ(绎Åų¸ûuëÖ­&Ëþè£� ^_!„B<;¤ó-Ì&+ý*©É{8¹óŽlYÌ‘-‹9¹óR“÷�•þèïTŠ§Ã¡C‡P©T¼ôÒK\¿~�qãÆaiiÉèÑ£±°°`Ê”)\¾|YIÿÅ_СCúôéCjj*!!!ØÛÛH||¼Ñ¼µ9ggg¢££iÚ´i‘üN�:Å”)Sðôôdîܹܹs‡Ù³gݯ[þèÑ£¹qã†R¶±svîÜÉ–-[9r$Ÿ~ú)~~~züóóó #==�¹sçòÑGàââBtt4vvvÅÆI£Ñ°zõjÞ{ï=ìíí SÞ“Ö�IIèÆÇÁÁ�öíÛ3uêTÌO?ýĆ HKKã£�>B£Ñ0vìXºvíª7¬¿p›.^¼h06†Êxøð!ï¿ÿ>_~ù%ùùùÜ»wÏà5ÖÚ³gÁÁÁÊG÷‡€˜˜Œ““¤§§›¼Ž¦âY’ûU—¡²ÇŒSäú !„âÙ"ÃÎ…Y¤&ï!ýÜÑ"ûsîe�~/ƒôsGq¨ß”:-;–åÄ_¡C‡pww§J•*ìÞ½›¬¬,&L˜€››...Œ5Ф¤$<<<xûí·5jßÿ=¹¹¹Lœ8‘F�¡Ñh˜3gŽÁ¼«T©‚‹‹ Íš5£E‹¤¦¦ÉoíÚµh4¾ýö[~üñG²³³©Zµ*III÷ÿúë¯<|øP)ßÊÊŠ3f=§fÍšlÚ´‰víÚÑ»wo½x¬_¿ž“'Oг³35jÔ eË–´hÑ€ýû÷§°°0¼½½©_¿>ï¿ÿ>III¸¸¸èŤ$tãàèèH\\7nÜ ??Ÿ‹/òË/¿�••Åøñã•5LµÉXœ�•immÍ/¿üÂÉ“'ù׿þEdd$­[·æÅ_ÔkOnn.ï¾û.Ç׫ƒözÑ·o_ªT©BHH©©©œ>}ÚèuÔ2O++«b¯ƒ.Ce7oÞ¼ÈõB!ijE:ßâ±�Ý¿•Ìë‹M—~î(9Ywp}¥o9ÔJüÕ>|Xé€>xð(xÒ P±bE `ò*-Ýɳ´�-mzkkk£y£›Ÿ½½=Ë—/×ëDj‡Þ¯:¬-_÷ ¶±¼Ö¬YÃŽ;ؽ{7«W¯fݺuÊ1777NŸ>M||¼Ñ÷–K§ììlà1Ñ+ILtéÆg×®]LŸ>�9sæÐ¶m[:wî @VVyyyó(Ü&c±Ñv� M�¦R©hܸ1}ûö%!!�sçÎñâ‹/–º=Z¶¶¶@ÁSùÂ÷‘¡ ç ÅS»ÏÔu(®l!„Bé|?‚„„,XÀ¤I“hß¾=7oÞ$22’ãÇ�sçÎÜÝÝ™QQQÔ©S‡V­Z•kÛEVúUƒCÍ‹“~î¨ÉwÀ—-[ƦM›ˆŽŽ¦V­ZJlÌÑñOÆ¡C‡°¶¶V†ÛÖ¯_Ÿ°°0²²²'??Ÿððp£K�5lØ�‰'rýúu–/_®÷ï£pÞ%áààÀüùó±²²bܸq,Z´ˆ£G�ݯ[~tt4ï¾û.VVV&óºví{öìaâĉlÙ²…!C†Ð¼ys½zФI.\ÈüÁ¨Q£ÈÎÎfüøñœ:uªDqruuå‹/¾àöíÛÌž=›Úµk?RLtùøøÐ±cG¢¢¢Ø¼y³òÔºQ£FL›6�ÌÌLfÍšEll,×®]3Ú¦ôôtƒ±1¤råÊüñÇDDDðÕW_aooOxx8NNNFÛSø�ïmÛ¶™l—©ë¨e(ž¥½_�)|}…Bñl)«E^‹Ë×Ðq �ýÚo•�mÝ4*�ó´ÛÚ�åŸßVþ­ý®–““óK)Ú¢çìÙ³¸ºº„���òä»°sçÎ1{öl¢££9rä‹-⫯¾RŽ0€9sæàææ¦w^TT•*UbèС�ZÅrcì=ï’(ÉûßW¯^eäÈ‘lÚ´é‘Ê0Fž|—¿àà`n޼ɒ%KÌ’ßÂ… Y¿~= „††š5ï¿‹ÔÔT  ¼£¬ËÜñ~ÒÊ£=¦â)„(Þ… ¨W¯Þ®ÉÓMâ\>$ÎåÃÆÆ¦�äu¾5þ­Ñùäë|´Ûèl£³¯ðv¾ÎߺŠ{/Ììï�ɰóRruu5yuëÖåîÝ»TªT �¦àǰÌÌLÆ�O`` -Z´ --�9sæ°lÙ2jÔ¨Add$«V­bĈEÊ¥SøÇ§GqéÒ%vîÜIvv6mÛ¶U^C0GÞO›§-&O[{„âQqìØ±b'|�'''(~bMñètW?y–HçÛÌ"""ÈÉÉaÿþý„†þ?{wU¹?püÀ(ˆl¢¢ „^ 4#Œ4/*jîÞÊ´ë‚]±25·dÄÌTR\5­«f.¸å•‘–J‰bŠnˆ[ˆl‚ˆ ¿?¼œËÌ:ƒ¦ß÷ëÅ æœç<ç{¾3×Û3ç9Ïw^^^ØØØpþüùRírrrÊ=/Ř1ctömii©,àÖ¡C¢££±±± }ûö|ùå—À½»ó)))„……ѱcÇ^téqU½zuüüü”צ¦¦äää°{÷n®_¿Nff&iii\¼x777eEå’_€h4éÑ£‡ò%IBB×®]Sêgff* C•=§¨z#GŽdäÈ‘�:ŒÇ†““±±±�:Œ'†äS!„Æ&ƒo#077Ç××—&MšpåÊ\\\Ê-”””Ä AƒJ½ÎÏÏ/· “.eWÉ-ùÚÉɉ¨¨(8À† X³f ‹-zˆ+Òμ¦ÍßÁ6¯ióÀç555-õ:))‰Ù³g3aÂ\]]‰��åîݻܺu‹›7ojíC¥Ráëë˾}ûxýõשV­5kÖÄÛÛ»ÔBypo ^öœB!„U­ø�<‹l\òÌwÕxgÈüYIMMåäÉ“À½ÁÚÑ£Gù믿hÒ¤ ^^^äææ²oß>¾ûî;¬­­iܸ±r|TT}ûö5H,·nÝ"//�Î�;BBB‚2ÕÚ�¬ê8?’cËJNN¦víÚ¸»»sûöm®\¹‚©©)Í›7çĉJMá²%�hР3fÌÀÓÓ“³gÏrôèQà^-ãÛ·o,N!„B!ÄÓKî|WR`` 999\½z•Ó§O³|ùrÔj5*•Š•+WröìY qvvfæÌ™XZZ0þ|¦OŸNdd$ 6T¾¹ÈÊÊâðáÃŒ?Þ 1ž={–ÈÈH²²²°¶¶f„ FyNÙ®¡û¯vn×ÐÝ`qøúúrøðaúõë‡��Ï>û,&&&Ô¯_µZÍøñã±¶¶ÆÖÖ–iÓ¦•ú–mòäɱjÕ* #<<œÂÂBjÔ¨ÁСCÿeßžfIII̘1•JŤI“hÞ¼¹Aû¿zõ*ãÆ�cݺu•>¶*WÖ6l7nÜ °°�7n(�L´k×Î eú q-))),Y²„sçΑ™™É /¼@ppp¹51à^¹333³RÿvMœ8±R‹>Ì{W,--�!C†°aíqVÆ·ß~˦M›8{ö,uëÖåŸÿü'ï¼óŽÔûB!žRjL<”)7V‘2cBTTPPƒ¦uëÖFéßXƒï%K–зo_eCyœKô¥¥¥‘••EãÆ�ÉÍÍeùòåiýr G�¬]»¶Òµ´K2Äà[£Ñð믿âããsß¶úÞÓ/¿ü’ŋӱcG¼¼¼8}ú4;wîä…^`É’%Ÿ� ™¦[5$ÏUCò\5žÆRc2í\<§–í±ªÛ°Âí­ê6”�·0¨ôôtœœœu•Ï­[·uUÊÁÁAyÜÆÒÒ’¶mÛ’žžþˆ£ÒO¥RUhà ºßÓ›7o²jÕ*ºuëFhh(o¼ñjµš÷ߟ£G�²ÿ~C‡-„BˆÇ�L;ÍõåÞº.w¼Ÿn‰‰‰„‡‡“‘‘A�:u˜4i...Zk·¿üòËÄÅÅA~~>®®®\¼x±ÜÌððp’““vvväçç+çÔvŒ……óæÍãÈ‘#˜ššÒ¾}{†^*Ö’5å9q⃦k×®L™2Eo~zõê…��§N�R¦×{xxT8÷ÚrÜ´iS¦M›FJJ ôïßN�:Å‚ ÈÌÌÄÞÞžùóçS½zu­×Ò¢E ­9±´´Ôú^Ç“��ÀÖ­[2dH¥>G�†.]ºÐ¦M’’’P©T|ôÑGÊãºÞ»ûåQ_þ‹ïøë;÷ºuëʽ§Å~ÿýwòòòèÕ«W©kéÛ·/K—.å·ß~ÃÚÚš÷ߟ… âããCDD6lààÁƒìß¿Ÿ+Vpùòeš5kFpp0*•Š7Þxƒ‘#G²}ûvžyæÒÓÓÉÊÊbóæÍÀ½Å™~ýõW¶mÛ†‰‰±&» !„¢"dð- ©e{ìºs3%‰œ¿.)« ›×´ÁªŽ3v ݱ´w|ÄQŠG%;;›àà`–-[†³³3»víB­V+ƒé²uÔ333™2e Ÿ}öÎÎÎlÞ¼™˜˜˜rýŽ=š_ý•°°0œœœÐh4åúÒU¿½_¿~Z·4ˆ���Rçž;w.€Î¾Z´hÁ… ˆŠŠ    TœekÊ·hÑ‚˜˜Ôj5�7¾o~nܸ�¿¿?...üôÓO„„„°eË–J­Â_6/………L™2…ºuë’‘‘Á¿ÿýo:uê„­­-S§NeÞ¼y4lØ�ììl,,,”EË^‹®œ >¼Ü9‹ <˜äädœœœÈÌÔ]1á?ÿùO©ãЧÒçä䈣£#[¶l!<<œåË—“••¥ó½Ó—ÇÜÜ\½ù/û^j;÷À�K½§%]¹r€ÚµkPTTD^^–––X[[ó×_é}ïΜ9Cpp0ýû÷§M›6„‡‡JHH‹/fÀ€´lÙ’ëׯ3oÞ<.\¸@Æ ùùçŸéÝ»· ¼…BˆÇ€ ¾…ÁXÚ;Ê[h•��@Ó¦Mqv¾·Ê}Ïž=Y±biiiØÛÛ—«£~üøqÜÝÝ•ö¯¼òJ…Ÿa.Û—®úíú¶ë:·®cúôéCJJ aaatìØ‘_|Q9¿¶šò•Í�¥¥%...J<³fÍâÒ¥KʶÉ‹©©)999ìÞ½›ëׯ“™™IZZ/^ÄÍÍ�† ï=NRr‘1m×¢+'ÚÎYlݺuäååñý÷ß3eÊöìÙ£uѱ/¾øBë3ß–––8:Þû·ÆÏÏ�Õ«W+±èûÜèÊcJJŠÞüWäÜú888píÚ5\\\Xµj‡bîܹäääP¿~}½ÇÇÅÅ¡ÑhX¿~={÷î%//kkkeÿàÁƒ1b„‡‡sèÐ!<<| !ŒîîݻԬYSy­Ñh¸sçŽ2à*{·°°°TûÊ(Û—®úí±±±Z·ÇÄÄè<·®¾à^¹À°aÃÖ¬YâE‹í5å˺_~J–¼311ÁÌ̬Ô4ðŠ(›—¤¤$fϞ̈́ puu%66–»wïrëÖ-nÞ¼©µm×¢+'�Fï�y zõêÅÊ•+IOOà…çÌÌþÿÿÆÊæ±,]y¼_þ+rn}š7oŽ™™Û·o§uëÖtíÚ•;vн{w¼¼¼”¶%q(fkk ÀªU«xî¹ç”íÅe‹¿()nëããáC‡HOOçÙgŸÅÕÕµBq !„¸dÁ5!„ÑyzzrôèQ’““�{ϯ6jÔ­í=<<ˆ‹‹SÚÿöÛo¤¤¤÷¦toÚ´©\Ýv}çÖV¿]ßö#GŽh=·®cnݺE^^�;w&$$„„„eš6”¯)÷I×®]«P~4�²(×±cǰ²²¢^½z•ÎEIÉÉÉÔ®]wwwn߾͕+W055¥yóæœ8qBØ•í»ìµèʉ6þù'gÏžî½�û÷ïÇÜÜœºuë>ÔµÓ÷Þ�î>>XYY1gÎâãã9xð ñññ:ãèÖ­ñññìÝ»—®]»Vê„Baú€úõë3}út�íF­Vcaa�£££2%8==�Õ«Wãíí]¡;z5kÖÔZ¿ÝËËKçvµZ­œÛÍÍM9�®¾ÌÍ͉ŒŒ$++ kkk&L˜€J¥*5/[S~À€„‡‡³}ûvfÏž­7?*•Šèèh"##±³³cæÌ™˜˜˜T:%ùúúrøðaúõë‡��Ï>û,&&&Ô¯_µZÍøñã±¶¶ÆÖÖ–iÓ¦ann®óZ´å¤U«VåΙ••ÅçŸÎ¥K—¸{÷.M›6eΜ9:¯%  ÔÝóñãÇë-)çàà ó½Ó—ÇÊ~>u)ùžŽ;¶ÔõŒ1GGGvìØÁüùóiР=zô 66–Ù³g3cÆ Þ}÷]¾úê+6nÜH÷îÝ‰ŽŽÀÞÞžyóæÁرc©[·.½zõR¦÷—Õ®];ÌÌÌHKK£sçΕ¾!„B‡ÔùB<öNŸ>ͲeË´N÷~Ò¢¾¶x|ó˜ššŠ¹¹9uêÔ1h¿ÄÞÞžˆˆƒö+„.R¹jHž«†ä¹jH�o!„xL\¿~]Y5|÷îÝ´k×îG$„á999|àýÇ�œœL§N� Ú¯B!ŽL;B<–bbbعs'¦¦¦xyyѧOŸG’ »wïVêÍ !„âñ!ÓÎ…B!ÄC‘iºUCò\5$ÏUC¦� !„B!„Âàdð-„B!„B™ ¾…B!„B#“Á·B!„Bad2øB!„B!ŒLßB!„B!„‘Éà[!„B!„02| !„B!„F&ƒo!„B!„ÂÈdð-„B!„B™ ¾…B!„B#“Á·B!„Bad2øB!„B!ŒLßB!„B!„‘Éà[!„B!„02| !„B!„F&ƒo!D•ùþûï™1c†ÑûNJJbРAøûûsòäIƒŸëêÕ« 8ð�ŽÕh4tìØÑÀ•gÌ\KÙ¼^¸p�Ñ£Gú£B!„0 | !ªL||>ž[·n¤/cäÚ�ñÝO—.]X»v-�:uª’ó !„B›Ù£@ñtÈÊÊ"??GGG '##ƒ:uê0iÒ$\\\Ðh4¼õÖ[øøøðÃ?0yòd^~ùeââ∈ˆ ??WWW.^¼ÈºuëÊõNrr2ƒÆÍÍ�¥K—jí/66–ˆˆrssqwwgòäÉXYYéÜ~ôèQ-ZD~~>vvväçç+צí æÍ›Ç‘#G055¥}ûö >¼TNnÞ¼IPP'N$11‘'N0xð`ºvíÊ”)Sôæ¨W¯^øøøpêÔ)T*“&MÂÃã\> µÆ1iÒ$Ú·oO×®]Xºt)uêÔáõ×_×Ú~ݺuåâÓvÝ–––téÒNŸ>�¹¹9Æ c÷îÝ$''ãààÀŒ3¨W¯€Î¼6iÒĸH!„Bˆ*&ƒoa0…‰'(Øû-…GŽ¡¹” €ÊÙ Sï¨Ö­ ¦ž�8Bñ(ýöÛo´jÕ €ììl‚ƒƒY¶lÎÎÎìÚµ µZ­ ¦/^¼È{ï½Ç˜1cP©Tdff2eÊ>ûì3œ��Ù¼y3111Zû=z4¿þú+aaa899¡ÑhÊõ—––ƧŸ~ÊÊ•+©]»6¬Y³†~ýúiÝ>hÐ BBBJ�îܹ:ûjÑ¢.\ ** €‚‚‚RùÈÉÉaܸqÒ¢E Z´hALL jµšÆ�ß7G7nÜÀßß~úé'BBBزe ¦¦¦¥òqøða­qtïÞ�]»v)ƒï°lÙ2�íX*>]×=|øprrr ¢^½z¬Y³†��öìÙC­ZµX°`«W¯fâĉdeeéÌ«B!Ä“F¦� ƒ¸6ŸÜwƒ(ضSxh.¥R°m'¹ïqvý{ IDAT;lþ#ŒPø ÔªÀýõ£G�æµ×^#((ˆëׯ+ûŽ?Î�!CèÝ»7C† áøñãUz=ãvØü ¼‹ÝýåÈuüaJN=MrssÉÍÍUî†zzzrôèQ’““�{ÿ›jÔ¨666Z�÷ðð ..NiÿÛo¿‘’’¢µïŠðôôäìÙ³=z¸7¸¿}û¶ÞíGŽÑz~]Çܺu‹¼¼<:wîLHH ¥¦4hРT90[[[åß�ûåH£Ñ°ÿ~Ž;†••õêÕ+—}qtëÖ�}ûöqäÈÚµkwßöeãÓvÝ•¡/¯B!„O¹ó] ÙÙÙL˜0;;»rwkªW¯N¿~ýhÞ¼9wîÜaýúõ,X°€Y³f0~üx†Н¯/[·nåÃ?ä‹/¾ ¨¨µZÍìÙ³yî¹çØ»w/S§NeÛ¶m�â+¥0ñÛvVú¸‚m;«ìð%K–зoßJ Ì„á?~œ–-[*¯k×®MHH}ôõë×gúôé:�wpp 88µZ�……ŽŽŽÊTå²}WDÍš5 #<<œÂÂBjÔ¨ÁСCñòòÒ¹]­V+çwssÃÕÕUo_æææDFF’••…µµ5&L@¥R•€Ož<™   V­ZE@@ <<œíÛ·3{öl½9R©TDGG‰��3gÎÄÄĤ\>Ξ=«5€æÍ›“””DëÖ­•;ÒúÚ—�OÛu?k^:ó*„Bñ¤1yDýjÛoRb{ño•–×%Û¨JWüºøÇô¿Íþ÷wño›;wîªÄµ”rîÜ9\]]Q«Õôèу¶mÛjmwþüyBCCY±b‰‰‰,Z´ˆÏ>ûLÙÿÆoðé§ŸÒ¨Q#ºwïηß~‹™™™™™°yóæ ±ÊÜ›ÿ@ƒo€j¯õ¢ÆÄ±ލ¼aÆ) DÃÕ«W7nœ²–ÐnÙ²e¸ººòꫯ¤¿Ó§O³lÙ2,X`ð¾ÿ4 �:uâ‡~(·¯²ù?~<¬Ô Y!Ê*^ó¡Q£F�8’'›ä¹jHž«†¹¹y (î–ø­ùßßš?E%~Š_Sâ5%¶•}]Tâï’´m«ÌþJ“;ß•t¿»2EEEœ:uŠ�72tèP’““iÖ¬Y©v\¸p777^~ùeBBB}ú¬ï'Ieò�¯¯¯2­\!„ V«9yò$æææ�:”'–µµõ£á‘�ÿâ2°ððpbbb˜8q"³gÏ&-- ²²²JµËÉÉÁÞÞžŒŒ >øà"""8pà/½ôþþþåÚCÅË÷T´TÐãJJ# mú÷ïÏ—_~ÉêÕ«5jT¹ÌŸ&*•Jë”óÊêß¿?cÆŒ1@DB!Ä“£lå! Eî|�¹¹9¾¾¾4iÒ„+W®àââ®]»JµIJJbРAüú미»»óÜsÏ0hÐ ~ùåŽ=ªó8è/ßSÑRAKåìôÀw¿UÎN:÷Ii$!„Bñ¨„††røða¶mۦܨiРþþþôêÕ멾`HOã̹óm ©©©œ}X¹r%3gÎÄÒÒæÏŸOTT}ûöeÏž=„††÷Jý¼÷Þ{L�:•ž={2jÔ(F�MÓ¦M8ƳgÏ¢V«4hjµºT© CªÖ­‹QŽÕqi¤¦M›–*�¤«ý€X¶l~ø¡Rjùòå0jÔ(~ÿý÷JÅ]²4ÒÛo¿Í±cǤ4ÒcbÛ¶m 8�÷Þ{Ï(_6EEE±lÙ²:öÇdêÔ©Žèï¯dN‹ŠŠˆ‰‰áÍ7ßäçŸ.×öäÉ“´mÛ–[·n•Û·oß>þõ¯=^CØ·o>>>Ê®† AƒX¼x1¯¼òJ©5?âââðññQ¾€ÔeûöíôìÙ“7n�víÚѾ}ûJ»lÙ2lllø÷¿ÿ]jû‰'øý÷ßéß¿¿�¢4œªˆ­8§ 4`öìÙ<ûì³ìÝ»—¨¨(JµÝºu+aaa„……ñÏþSÙ~óæMúõ뇗—³fÍ2Z¬†²dÉÖ¯_OLLŒÁ×ãèÛ·/Ï?ÿͳÏ>[îÜÎÎÎzÞo¿ý6óçÏÇÌÌŒŸ~ú‰'NÈÀ[!¸w'¼[·nlܸ‘©S§âââ"CD¥È‚kâ¡Y, «Ðð‡½ã RéïîôéÓ,Y²„+W®`aaAHHnnn¼ñÆtíÚ•={ö@Ïž=ILLdéҥܸqƒ pùòe6mÚTªÏµkײfÍvíÚÅòåË4hP¹¾âã㉌Œäúõë8;;3sæLllltn?qâK–,áÆ�Ô«W�«W¯âèè õ˜Zµjñù矓��ÀÕ«WyñÅùðÕëvss#++ µZÍ믿N~~>Ë—/àØ±c,X°@o~ºuëFçÎ�IHH ;;›àà`¼½Kñ¥Ñh´Æ0oÞ<êÖ­ËàÁƒ�{Ó½ÓÒÒxï½÷´¶ß»wo¹ØtåÉÏÏ�N�:‘˜˜Hnn.���ùD9wãÆ�©U«€Îc¶oßNJJ DEE1vìXåÚjÕªEvv6ãÆ�# €Ž;Ò­[7êÕ«Ç·ß~Ë‚ ›7oÒ¿V¯^ͰaÃX¼xq¹\èŠÁÕÕU)————Ç×_Í�!Ct¶/›®k¾ví·nÝâ�wÞ᫯¾âŸÿü'‹/füøñlܸ‘gžy†ï¾û@oN‹éš!PPPÀõë×ñòòÂÌÌŒÔÔTnܸATTÇW޳´´d„ DEE±nÝ:Ö¯_Ï�;w”8‡Ê—_~I�=ضm€Îcô}þôå£ìg¯$]ƒâÓ§Oˆ……ǧ  €™3g’——GõêÕñööæÃ?¤wïÞ}š™3gpéÒ%Z·n­sûúõëK�ÛÙÙ™W_}Uo_*•ŠøøxV­ZE�=”c“’’°°°Àßߟe˖ѸqcàÞ#*• kkë å§sçÎ89Ýûb«U«V|þùçårQ£F ­1¸ººòÓO?°~ýzÞ|óM,--u¶×›¶k.Ž«xšxýúõéÞ½»2¨vttÄÖÖV9¯®œÓuWø�?þ I“&˜˜˜ðÒK/ñË/¿ð믿2jÔ(îÞ½Ë�;w°µµE£Ñ�””ĦM›¸vífff˜››+qÖ©S¸Wž0++ SSS­ÇèûüéËGÙÏ^ÙëÊ ¾?ûì3ììì ÅÌ̌˗/³~ýznß¾�……¹¹¹lÛ¶�#GŽ`eeÅ_|A½zõ ÅÔÔ”ØØXÎ�;GõêÕ9sæ ÿøÇ?”sœ:uŠ¢¢"<<<8uê[¶lÁÎÎŽÄÄD>\.ÆâJýû÷§E‹Z¯I!„'ƒo!D•8qâD©Å»âããñôôîýóæÍ˵0`€ò:))‰¶mÛ–ë·ìÝRm}¥¤¤°|ùòrklݺUëö 6”Z-))‰W^yEo_poÑ•èèhÞ~ûm>ýôSZµjERR/½ô;wîäêÕ«Êà»lÜ÷ËOÉ»ŽGŽÑ:êÞ½»Ö7nÌåË—ÉÈÈ 66VYa\Wû²±éºæåË—Ó¬Y3åõŸþ©”,~ݹsgåútå´ä¶÷ß¿Üu•Œç¥—^bìØ± <OOOŽ;¦<Û¬V«iÕªo¾ù&)))ÄÇÇ+Ç—�³¸?]ÇèûüéËGÙÏ^Ùë033+WÍ"!!ÌÌîý_òùóçqvvÆÆÆ†ÁƒS·n]&NœÈ7ß|ÃgŸ}†»»;'NœÀÓÓS©5›””¤Ä“���J¥*µêÿW_}E½zõðôôdëÖ­Ô­[;;;àÞ¬„âž:uŠºuëbooÏþýûÊ=;.„Bˆ#ÓÎ…U¢V­ZÊbY×®]cË–-¼õÖ[@ùÁQqûØØXÒÒÒØ½{·2`úæ›o”i¶ÚßeûªW¯ž2�”rUº¶[YYé<·¶c4 W®\¡aÆàââB~~¾���ãÇ�gÖ¬YÊ9Î�;§ ~î—Ÿï¾ûŽ={ö ÑhÈÈÈ`ãÆ�JI©â\è‹ÁÆÆ†üü|¾øâ Þyçe`¦«}ÙØtåI[îK¾þóÏ?•»¯úr pûöm²³³•»ÓºÞã^x�îÝ»óÎ;ï”Ú—‘‘Á¡C‡èÝ»7ÖÖÖLš4Iä–�ëÔ©S÷=FßçO_>Ê~öÊ^‡­­-?üðÑÑÑÊTu{{{Nœ8ÁÆ�™7o±±±¼ÿþû\¸p�äädjÔ¨Áùóç•ÕtëÖ­KÍš59~ü8QQQÌ™3‡K—.)ñ5nÜ�FCHH;wî$44”_~ù…?ü•JU*$''+¯Kî»zõª’¯ŒŒ „Bñpdð-„¨AAAìØ±ƒ0kÖ,¦OŸ®L£.^�¬¤#F°uëV† ÂâÅ‹±´´¤Aƒܽ{—Å‹+Ï0—XiëkäÈ‘œ}Zy�kÔ¨ÁG}¤ô[üþ[[[Ó¥KÞzë-F�EÆ éÑ£G¹85 çÏŸ§qãÆz�ÑõùÓ÷¹)ûÙÓviiiL�:UùÉÌÌ$88˜ºuë²lÙ2~ÿýwÂÂÂðóóÃÙÙooo:ĪU«xþùçiÓ¦ |ð|ùå—ÔªU sss%G}úô¡oß¾œ:uŠE‹qåÊ–.]J›6mÈËË#%%Ei{öìY pww/·¯}ûöÔ¯_ŸO>ù„„„„Bñp¤Î·â±wðàA~üñG&Ožü¨C©rׯ_'00�Í›7?pEEE 6Œ�>úF÷txš?BT”ÔŸ®’çª!y®Rç[!©©©À½çW×®]«L³~Ú~~~„‡‡ü\ÑÑÑøøøpõêÕJ›ššŠ��{öì1x\e3߯T6¿7oÞdÞ¼y´mÛ–³gÏ>âè„B!ŒÙ£@ñôˆ��§I“&ØÛÛµoµZMjj*~ø!õë×7ø¹Œeúôé4kÖŒ¾}û¤?cäÛÐ1ÞÏúõëùì³ÏÈÍÍ­’ó !„B‹ ¾…U&>>žÎ�;½ï³gÏòâ‹/Ò¥K£œËXbcc1555XÆÈ·¡c¼Ÿ;wîðÖ[oacc ªì¼B!„†&ƒo!D•8wî7oÞÄÛÛ€ß~û�ˆˆÎ�;Gýúõ ¤mÛ¶¤¦¦òÆo0räH¶oßÎ3Ï<ÃܹsùñÇYºt)ÙÙÙ<ÿüóÄÄİ}ûvKõÈùóç9þ<{öìa„ Ì™3§\û÷ïgÅŠ\¾|™fÍšLÆ un�‰‰!22’¬¬,ªU«VêÚ´ãè訜çîÝ»¸¹¹±dÉ’RÇåååñöÛocjjJíÚµ¹qã;vì`ÇŽDGGccc£7Oo¾ù&ä»ï¾àÝwߥ{÷îåò]PP 5–€€²²²Ø¼y3¡¡¡üúë¯lÚ´‰yóæ•k?vìX­1j»~•JÅo¼A¿~ý8tè999 :”¿þú‹Ý»wS½zu‚ƒƒiݺ5€Îü2¸7]!„âïLžùS˜x‚Ûaó¹õæ ²_î@ö˸õæ n‡Í§0ñÄ£Oøà\\\X±bVVV÷Í“F£aíÚµ`kkËŒ3¸páB¹œèŠ¥[·n\ºt‰ . ÑhøùçŸéÚµ+ûöíÓÚ>((¨\Œº®¿Ø¦M›ø÷¿ÿ�ƒƒóçÏçܹs¼ýöÛܹs‡°°0½ùB!„xRÈ�oa·ÃæS°mg¹íšK©h.¥R°m'Õ^ëE�‰cAtâqpìØ1ÜÝÝ©U«?üð¹¹¹Œ?777\\\1bqqqxyy0xð`FŒÀÖ­[)((`„ 4mÚ�FçŸ~ªµïZµjáâ₇‡-Z´ 55µ\_}õ�†õë׳wï^òòò°¶¶&..Nëö_~ù…»wï*ç733ãã�?ÐyL�:uضmmÚ´¡gÏž¥ò±iÓ&NŸ>Í´iÓpvv víÚ´lÙ’-ZpøðáûæiÆŒtêÔ‰gžy†wÞy‡¸¸8\\\JåDW,�;w&<<œC‡áááAzz:¯¾ú*7nÜÐÚ¾qãÆåbÔuýÅÔj5½{÷¦F�LŸ>�wß}777RSSÙ´i�Fo~…B!ž2ø-oÌDîþrä¾í ¶í¤èòU,†UATâq¯ âòóó¸{÷.5jÔÀÜÜ\iß°aCåï‚‚‚RíËNû.Ù·.%û³µµ`ÕªUÊ�q@Y�¼ìö�7–:É;غúX·nß|ó ?üðk×®eÆ Ê>777þøãbbbxõÕWµÆ\‘<åååÿŸ“â}%sòâ‹/j�ÅÉÉ :Dzz:Ï>û,®®®¸ººêl_–®ë/þÒ£˜¥¥%pïn}ñ뢢" üû[2¿BˆGC£ÑÍÿû_lmmY¾|ù£I!þödÚùØ¿?}úôáàÁƒÊ¶7nðñÇÓ¿ºuëÆ|Àµk×”ýýõ£G�æµ×^#((ˆëׯ+ûŽ?Î�!CèÝ»7C† áøñãUz=ãvØü ¼‹Ýýå·Ãæ1¢ªuõêUø¨Ãxì�?žôôt^|ñEZ·n�©©)sçÎeÇŽ„‡‡cee¥<ÿ[–——&&&Ì�;—½{÷òÉ'Ÿèì»"|||°²²bΜ9ÄÇÇsðàAâããun/yþ={ö0uêÔûöuîÜ9âââhÓ¦ íÛ·§   TɯV­Z1dÈ~üñG¶nÝ €�� ‰‰‰$$$PPPP¡<Íœ9“={ö°`ÁÌÍÍiݺu¹œè‹¥[·nÄÇdzwï^ºvízßöecÔuý•¡/¿Bˆª¥ÑhØ»w/ýû÷gÚ´iÊc)B!ž ¾+!;;›áÇóÍ7ßP³fÍRûªW¯N¿~ýظq#_ý5Ï?ÿ|©•yÇ�Ï믿ζmÛèС~ø!pï¹OµZÍĉÙ±co½õÖßæ?< Oh�j~?ÛvVÙ3àK–,)õ%ˆx4Ž;FµjÕ”©ÊÏ<ó 3fÌ 77— PTTÄ‚ t–ÄúÇ?þÁ„ ¸~ý:«V­¢U«V:û®{{{æÍ›‡™™cÇŽeÑ¢Eüþûï:·—<ÿŠ+øÏþƒ™™™Þ¾®]»Æ�?þÈ„ øúë¯ñ÷÷ÇÓÓ³TÆ £yóæ,\¸�?ÿü“#F�——Ǹqã8sæL…òäêêÊâÅ‹ÉÈÈ 44”zõê•ˉ¾XÚµk‡™™iiiÊÊèúÚ—�Q×õW†¾ü !ª†F£aß¾}¼õÖ[L›6�””4hÀ¤I“X¶lÙ£O!žÆšÛw¿~µí7)±½ø·JËë’mT%Ž+~]ücú¿ßfÿû»ø·Í�;wUâZJ9wî®®®¨ÕjzôèAÛ¶mµ¶;þ<¡¡¡¬X±‚ÄÄD-ZÄgŸ}¦ìã�7øôÓOiԨݻwçÛo¿ÅÌÌŒÌÌL”Õ‡gºžó®ˆªzþ{ذa¨Õj7nl”þ¯^½Ê¸qãX·n�QúR„„„pãÆ "## ÒßÂ… Ù´iû÷ïgÚ´iíûï¢xUøâg¾Kªl¾ˆ½½=ÆUñÓh4ÄÄİ|ùr.^¼@ƒ ð÷÷§W¯^.-X|l£F�Œ«�vvvÊs¹B·�beeõP}lß¾•JEnn.ß|ó mÛ¶¥ZµjéûIS™œüñÇ$''Ó¯_?#G%„xœjÐ-„¢âdðm`cÆŒ!..[[[Ú´i@zz:µjÕ*ÕÎÆÆ†ŒŒ †®<ûéííM‡´ö�““CPPõêÕcÍš5„„„°gÏjժł X½z5'NäðáÃ\¸p�¨¨(àÿ324Í¥Ôû7z€cuÅß½{wvíÚ¥ ¾8À²eËt¶8p 111Ê�ï´´4>ýôSV®\IíÚµ‰ˆˆ`Íš5 >¼Â¹ÍÊÊ"$$„Ï>û ggg6oÞÌܹs8O‹²_>=ˆK—.ñý÷ß“——ÇK/½Äرc Ö÷“¦29Ù½{·ò¥•âéñÞ{˜XjÛåË—™5k³fͪtwîÜJ/) Oò\5$ÏÆW²2ÊÓDžù6°ððpbbb˜8q"³gÏ&-- ²²²JµËÉÉÁÞÞžŒŒ >øà"""8pà/½ôþþþåÚýÕ�‹ï¾vèÐ�gžyT*íÛ·çÊ•+À½»ó)))„……WneèÇ�®øÛ´iCRRyyyœ9sggglmm+|½ \»v�ÐÐPÆ�GBB‚òmEs›��€»»»Rê•W^¡I“&ÆN‰FŽÉöíÛ‰ŽŽæ“O>QVÙ~Z999Êye�3†ƒbccc È„B!„6rçÛÌÍÍñõõ¥I“&\¹rvíÚUªMRRƒ â×_ÅÝÝ])Ñ3hÐ ~ùåŽ=ªó8”/µTòµ““QQQ8p€ 6°fÍ-ZdÀ+¼GåìôÀw¿UÎåKÓ¿™™¾¾¾¨[·n‘——GçÎ� !!!Á(eBL½_0ʱúâïÖ­ûöíãÈ‘#´k×î¾ímmm•ÕÎ===9{ö,G�î=[~ûöíJÅíééÉ‘#GHNNà·ß~#%%¥r/„Bê0…â‰"ƒïJ Äßߟ¸¸8æÏŸ�¿¿?IIIܺu‹•+Wò¯ý‹>}ú°råJfΜ‰¥¥%&&&ÌŸ?Ÿ¨¨(úöíËž={  yóæ¼÷Þ{L�:•ž={2jÔ(F�MÓ¦M8ƳgÏ¢V«4hjµš & Rþ­®Ö­‹QŽÕóæÍIJJ¢iÓ¦Êi}í À²eËøðéY³&aaa,_¾œ€€F�Ué’H¨ÕjÔj5o¿ý6ÇŽ»ï"|¸Šg‘øûû+_bÒÃÔr×h4tìØÑÀýý•Íé… =z´òïbY=zôàûï¿/·=33“:ðÇ-VC9~ü8>>>8p ÔöŽ;²páB½Ç^ºt‰^½z­uq½õN�:•ª%_|ÎÊÖ]O„ !DÕ‘iç•´téR�ûæÏŸ¯sŸ“““Î:™½{÷¦wïÞzÏ«R©øá‡”×ŽŽŽ¥Ê[µhÑB™Níéé©7NC1õô Úk½*]n¬Úk½0õôйÿ~ñ7iÒDYtí~í_xáV¯^­¼~î¹çX±bE¹vÍ-€¯¯/¾¾¾:ãUkÉ’%Œ5ŠÖ­[?êP*eÉ’%ôíÛWYkàqR•±EFFòóÏ?óÌ3ÏèlsçÎV­ZUîùöM›6‘——gä=sss”G^¦OŸN³fÍèÛ·o©v999,^¼˜�>úèQ„)þæŠá:t ::šÏ?ÿœ””fÍšÅîÝ»K•KBñ`äηx(5&ŽÅì%ï ·7{Éû¡ê{gdd�œœLË–-¸ñdIOOÇÉI÷�«øøxnݺõ¨ÃЪ*cëÒ¥ k×®Õ»p\ñàóСCʶ¼¼<~üñG<úˆæÍ›ë<ÐûùÓ•mŸ½ŠJMMå�7Þ ÿþ}ú(µæ;vìÈ‹/¾¨œ_£ÑH�=”»¶•Í�¥¥%...J<³fÍâÒ¥KÊ6 T½û’1´iÓ†¹sç’——GJJ ÎÎÎØÚÚêl¯-6m× `ii©ÜÙ.~N´¸^xûöíùòË/•>ôý,iÈ�!ü÷¿ÿ¥C‡øúúbaa¡ì355%''‡Ý»wsýúu233IKKÃÑÑKKKðóóS¾ÐuLrrr¥?Pþ³W’‰‰ p¯\aI………¥J:©Õjz÷îM­Zµ˜2e ©©©ØÛÛ+û7nLíÚµiÙ²%-Z´J—KlÙ²%Ý»wgÅŠLžÌ�011ÁÁÁᩘÚ/„BT| !Œ®l}t�FÃ�;w”ëËÖ“-,,|àzêeûÒUß=66Vëö˜˜�çÖÕ ³Ö¼J¥Â××—}ûöñú믗«#÷ÏOÉ’x&&&˜™™Q½zõR}èªwoff†¯¯/ä�?þ {÷îzÛWôšË–/,{]%_—½¾åííÍ’%K å›o¾)µ/))‰Ù³g3aÂ\]]‰��-7Ð…{w‡ïwŒ¾ÏŸ¾|è«‹Ü AåœÅ+àŸ]g{‚ƒƒQ«ÕXXXàèè¨LNOOgõêÕx{{W¨Æzq}÷ððp ©Q£C‡ÅËËKçöâZ¹)çÑÕ—¹¹9‘‘‘deeamm­Ôš/9Ÿ|˜~ýúaggdzÏ>«LõÖE×1ú>º>ÚòQö:>ùä-ZÄ®]»(((ÀÃÃ�?þkkk²³³+’JàÞsæÌaܸq„‡‡ãææV®MŸ>}عs'¿ÿþ;öööÌ›7�ˆˆÆŽKݺuéÕ«­ZµÂÏÏ�ððp¼¼¼¨^½:Ï?ÿ<äååñ /T8.!„Bè§ÿ¿LŒ×¯¶ý&%¶ÿViy]²�ªÄqů‹Lÿ÷Ûìÿ¶¹sçÎÿ׫B<öNŸ>ͲeË´N÷~Òi4:uêTjÑ´1~üxX©A³¸çiþü QQ/^Ðú…0ÉsÕ�}uH[ÑÑѲpV%ÉçO!„†&ÓÎ…B!ÄC‘iºUCò\5$ÏUC¦� !„B!„Âàdð-„B!„B™ ¾…B!„B#“Á·B!„Bad2øB!„B!ŒLßB!„B!„‘Éà[!„B!„02| !„B!„F&ƒo!„B!„ÂÈdð-„B!„B™ ¾…B!„B#“Á·B!„Bad2øâÿØ»ó¸¨êýñã/†E%LL Ñ$5Ü®Jˆ˜¹àVVŠZŠbBPšˆ†("¹¡ÞR¯©h‰$(ßTÄ_.%Jf‹ËEÜÀ PÑ@Y†ßƹÌ   š¾Ÿ�Ç}úô)—ï‚‚­±Œ3†œœ¶lÙ@HH?ÿü3ÑÑÑ,X° \y___­1j;•JÅàÁƒ6làöíÛŒ=šk×®G­Zµð÷÷ÇÅÅ@g~G�Ü›Š.„BñO&÷|‹jStü7î„.䯡os«K7nuéÆ_CßæNèBŠŽÿö°ÃÙÑ£GQ©T´oßž«W¯âë닱±1'NÄÈÈ222”ò_~ù%¯¼ò ýû÷'==�   ¬¬¬ðññ!11QgÛÓ¦MÀÞÞž¨¨(^xá…rí�:uJø…††’““CHHˆÎýšýOœ8‘k×®)}몳k×.¶mÛÆøñã™7oÆ ÃÈÈH©W\\Lpp0ÙÙÙ„††2eÊˆŠŠÂ¢Â<©ÕjÖ­[ǘ1c°²²"88˜sçΕˉ®X<==¹xñ"çÎ�C­Vóã�?Ò»wovïÞ­µü¤I“ÊŨëüKDGGóæ›obkkËÂ… IKKã�wÞ!??ŸÐÐP½ùB!„x\È•oQ-î„.¤`ë÷åö«/¦£¾˜NÁÖï1ØŸÚÓ}BtâQpôèQZ¶lIݺuÙ³g¹¹¹L›6 '''˜0aÉÉÉtìØ€‘#G2a¾ûî; ðóó£E‹¨ÕjæÎ�«µíºuëâàà€³³3mÛ¶%==½\{ß|ó jµš 6°cÇòòò¨W¯ÉÉÉZ÷ÿôÓO*ý›˜˜0sæL�u4hÀÖ­[qss£_¿~¥òÍÉ“'™5köööØØØÐ®];Ú¶m ÀÁƒ+ÌSpp0¯½öM›6å½÷Þ#99‡R9ÑK�=ˆˆˆàÀ�8;;“��M¯^½ÈÊÊÒZ¾Y³fåbÔuþ%0`µk×föìÙ¼ÿþû899‘žžNtt4jµZo~…B!2ø,oòt :\a¹‚­ßSœq™:‹Bk *ñ¨IIIQqwïÞ °°€Úµk`ff¦”oÒ¤‰ò¹   Tù²Ó¾5ÛÖE³=+++V¯^­\”'�—Ý¿iÓ¦Rýk^ÁÖÕÀúõëÙ¹s'{öìaݺulܸQ9æääÄéÓ§ILL¤W¯^Zc®Lžòòò€ÿå¤ä˜fN:uê¤5–Æ�ãêêÊ�ÈÎÎæùçŸÇÑÑGGG�åËÒuþ%?z”077î]­/Ù...Êÿ}5ó+„x8Ôj5 |ýõ×XYY±bÅŠ‡’BüãÉ´óû�””Ä믿Îþýû•}YYYÌœ9“áÇãééÉ”)S¸råŠrüÚµk|ôÑG 8�I“&qõêU娝¿þʨQ£0`£F�â×_­ÑóywBVjà]¢ð§ÃÜ ]hÀˆjÖåË—ñòòzØa<òΞ=Kvv6�:uÀÅÅcccˆ��%"" åþß²:v숑‘aaaìØ±ƒÏ?ÿ\gÛ•áêꊅ…óçÏ'%%…ýû÷“’’¢s¿fÿñññ|öÙg¶•––Frr2nnnxxxPPPPjɯ:0jÔ(öîÝËwß}€¥¥%Ç�çØ±cT*OsæÌ!>>žððpÌÌÌpqq)—}±xzz’’’ÂŽ;èÝ»w…åËÆ¨ëü«B_~…5K­V³cdžάY³”ÛR„B<8|WÁ­[·7n;wîä©§ž*u¬V­Z 6ŒM›6±mÛ6Ú·o_êɼӦMcРAlݺ•nݺññÇ÷îû `úôéÄÆÆ2bĈÌ?<‹Žÿ¦uªyE ¶~_c÷€/Y²¤Ô� âá8zô(¦¦¦ÊTå¦M›Lnn.ááá®sI¬çž{???®^½ÊêÕ«éСƒÎ¶+ÃÚÚš `bb‚¯¯/‹/æ÷ß×¹_³ÿ¨¨(Þ}÷]LLLô¶uåÊöîÝ‹ŸŸÛ¶mÃÛÛ›6mÚ”ŠcìØ±´nÝšE‹ñßÿþ— &�——ÇÔ©S9uêT¥òäèèÈ—_~É�7 ¡aÆår¢/–—_~233•'£ë+_6F]ç_úò+„¨jµšÝ»w3bÄf͚Ņ xæ™g˜1cË—/Øá !ÄcÁPsû*jWÛq#�ý%ï*-ÛšeTõJ¶K^Æ¿›üý¹äÝ2??ÿ@Î¥”´´4  oß¾tíÚUk¹³gÏBTTÇ�gñâŬ\¹R9>xð`æÎ�˳Ï>KŸ>}ø¿ÿû?LLL¸yó&cÆŒQž>ü(ÓuŸweÔÔýßcÇŽ% €fÍš¤ýË—/3uêTÖ¯_o�ö���dee±lÙ²jioÑ¢EDGG“””ĬY³ªµíŠ’§Â—Ü󭩪ùöòòÂÚÚšÈÈHC„*„x„©ÕjY±bçÏŸà™gžÁÛÛ›þýûWziÁ’ºÏ>û¬Áb’çš"y®fffnÀM (ÔxWÿýY­ñ*Öx•l£±�ƾ²ÛÅŸ5iÛW•ãU&—ªÈÑÑQïñââbþüóO6mÚÄèÑ£HMM¥U«V¥Ê9;;sîÜ9œœœèÒ¥ ���Œ9’Í›7ãíí]®]µZMÏž=quuåäÉ“˜™™1vìXâââHMMÅÖÖ–àà`6lHQQ ,àðáÃãááÁ¸qãª/ +:|Ô uuÅ?cÆ <<<”©±K—.¥Aƒ 4Hkùõë×óÛo¿1räHz÷îMPP‡"22’ÜÜ\Z¶lÉ'Ÿ|‚¹¹y¥s päÈ/^ÌÝ»w©_¿¾r_®ÐÍËË ‹j#&&•JEnn.;wî¤k×®˜ššVKÛ�›ªääôéÓ¤¦¦2lØ0G%„x”T× [!DåÉ໚Mž<™ääd¬¬¬pss ;;›ºuë–*giiÉ�77nœrïgçÎ�éÖ­›Ö¶o߾ͤI“hذ!k×®%00�øøxêÖ­Kxx8kÖ¬aúôéÝ�‹/²k×.òòòxñÅñõõ­¶¶7UÉI\\œò£•âÉñÁpüøñRû222˜7oóæÍ«r{ùùù@éBŠê'y®’gÃÓ\åI"÷|W³ˆˆ™>}:_|ñ™™™XZZ’““SªÜíÛ·±¶¶æÆ�L™2…ÈÈHöíÛÇ‹/¾ˆ··w¹òpïéÀ%W_»uëFÓ¦M±´´D¥RáááÁ¥K—€{Wç/\¸@hh(ÉÉÉåž ý¨Ó¿››'Nœ //�S§Naoo�••U¥Ï÷رc\¹r…��¦N�ʱcÇ”_û+›ÛcǎѲeKei¨—^z‰æÍ›:%˜8q"111$$$ðùçŸ+OÙ~R5nܘC‡•›r^U“'OfÿþýXZZVSdB!„B¹òmfff¸»»Ó¼ys.]º„ƒƒÛ·o/UæÄ‰¼ýöÛüüóÏ´lÙRY¢çí·ßæ§Ÿ~âÈ‘#:¯€Cù¥–4·7nÌæÍ›Ù·o7ndíÚµ,^¼¸Ïð•}ãû¾ú­²/¿dQ ]ñ›˜˜àîîÎþýû9}ú4}úôÑ[¾¬§žzŠÎ�;—zPî)®úr[XXXîa{B!Ä?ÍŠ+ªuÚ¹Ü#[3$Ï5Cò\3žÄ™r廚¤§§óÇ÷sGŽáÚµk4oÞœŽ;’››ËîÝ»øá‡¨W¯Íš5ÃÞÞž””¥î•+W”«º÷믿þ"//�=zȱcÇ ²Lˆq礮¾ø===Ù½{7‡æå—_®°¼•••ò´ó9\‚¾ IDAT6mÚpæÌŽ9Ü»·üÎ�;UŠ»M›6>|˜ÔÔT~ùå.\¸Pµ“B!2•JE÷îÝÙ¸q#sæÌáÙgŸU¦�:”˜˜ŠŠŠv˜BñX‘ÁwùøøàííMrr2 .ÄÛÛ›'Nð×_±jÕ*Þxã ^ýuV­ZÅœ9s077ÇÈȈ… ²yóf† B||ø€Ï>ûŒ~ýúñá‡òÑGÑ¢E‹ûŽñÌ™3ðöÛo€ŸŸ*Uõÿ©M={¤®¾ø[·n͉'hÑ¢…rEZ_ù·Þz‹åË—óñÇóÔSOÊŠ+3f ~øa•—D²µµ% €€€ÞyçŽ=ZáCø„a•Ì"ñööV~ĪN²–»Z­æÕW_­æˆþùÊæôܹs|ôÑGÊÿ.–Õ·o_víÚUnÿÍ›7éÖ­§OŸ6X¬Õå×_ÅÕÕ•}ûö•Úÿꫯ²hÑ"½u/^¼HÿþýIHHÐz¼d½õ’×k¯½Æ”)S¸xñbµÅoH ¸ººrùòå‡ÊIáBQsdÚy-]ºTç±… ê<Ö¸qc�ëd0€èíW¥R±gÏeÛÎήÔòVmÛ¶U¦S·iÓFoœÕŸ�3¦ûWy¹1Ó�ý1nã¬óxEñ7oÞ\yèZEåÿõ¯±fÍeû…^ **ª\¹ÊæÀÝÝwww�ñ‰šµdÉ>üðC\\\v(U²dɆ ¢8®dðyàÀe_^^{÷îÅÙY÷y�‹§Ÿ~š¯¾úŠ—^z €C‡qêÔ©råJ~˜œÃÁÁÁ ³ç„âI$W¾Å«³(”;¡ +¼n:°ÿ ¼áÞôDwwwù‡À?ÐñãljˆˆàÆ�4hЀ3fààà€Z­fĈ¸ºº²gÏ>ùäºtéBrr2‘‘‘ܽ{GGGΟ?_jFÜ[] 55•‘#GâääÄÒ¥Kµ¶¥m}w �ûõ­å®­N�:u´®5¯éúõëLš4‰éÓ§süøñrkÐëËOÿþýquuåÏ?ÿD¥R1cÆŒrƒÎ¢¢"­1̘1e¶ÈÒ¥KiРƒ ÒZ~ýúõåbÓvÎæææôìÙWWWNž<‰™™cÇŽ%..ŽÔÔTlmm V®žëÊieW ðööfÕªUÊŽ111ôíÛ—ü€ÌÌLf͚Ņ (((`øðáx{{£V«éÙ³§²Z‚J¥âÓO?¥uëÖ:ëz¿ºò¡í»WYééé <˜ádzÿ~nݺÅèÑ£>|¸r, €ÄÄD²²²ˆ��%66–„„ÌÍÍKµuáÂΜ9ƒ“““²/))‰¨¨(222hÕªþþþ¨T*̰aÃ8pà·oßfôèÑ\»v�¸¸8jÕª…¿¿¿2«ä—_~!22’´´45j„��]»ve̘1\¿~�ï¾û€9sæpøða¶nÝʾ}ûÊõÛ¤IY¶l999ÿ¸9ž%ƒpOOχŠB<6d#ªEí龘GEb:°©'™«ìc:°?æQ‘<ð>|8“'O~àvDͺuëþþþÌœ9“-[¶Ð·o_”ãçÏŸ§]»vÄÆÆÒ¥KnÞ¼IPPsæÌaãÆ�tìØQyÈ�¦�>úˆæÍ›³nÝ:å¶Ž²m•¬ï¾hÑ"¾ýö[ìììX»v­Îý%k¹—ôݽ{wåÞY]u4ך߸q#cÆŒ)çíÛ·™:u*>>>´mÛ///œ��Y·nAAAæ'++ ooo¾ùæ>øàË݃©+†>}ú”º­bß¾}ôèÑCgù²±é:ç’óš4i›7o¦W¯^Ä·ß~KË–-•[>ôå´²œ��155娱c°}ûv¨¯_¿>AAAÄÄİ~ýz6lØ@FF†§��ÑÑÑ :”ˆˆ½uô}ÿôå£ìwï~lÚ´‰·Þz ;;;"""ÈÎÎ.u|Ò¤I888…………r쫯¾ÂÕÕ•¡C‡R\\ÌÇ À©S§”Athh(999¥î¯�ŽŽæÍ7ßÄÖÖ–… ’––Æ;ï¼C~~>¡¡¡\½z___Œ��™8q"FFFøûû“‘‘A¿~ýÈÈÈàÌ™3¨ÕjöíÛGŸ>}8}ú´Ö~ÓÓÓ ÂÊÊŠ‰'ríÚµûÊ•BñO#W¾Eµ1nã¬÷^nñä:vì-Z´Pžâ߯_?¢¢¢ÈÌÌÄÚÚšZµjѽ{w¥ü¯¿þZn=õ­[·Vª¯²mi®ï÷ÒõôÓOëݯ«o]u^ýue­ùW_}•N�:)ý«Õj|||èÛ·¯rÕ¶ªù177ÇÁÁA‰gÞ¼y\¼xQÙ”Zï^3777ÂÂÂÈËËãÂ… ØÛÛcee¥³¼¶Ø´�3€¹¹¹re»ä>Ñ’õÂ=<<øÏþ£´q¿OM£F�â믿¦[·n¸»»S§N嘱±1·oß&..Ž«W¯róæM233±³³ÃÜÜ;;;ºwï®ü( «Njjj•¿Pþ»§ÉÈȸ·\¡¦¢¢¢RK:0`ÀêÖ­KPPéééX[[+Ç›5k†�� íÚµ£mÛ¶Àÿ–KlÞ¼9¬^½š—^z‰çž{¸w_­V³aÃvìØA^^õêÕ+×gíÚµ™={6ï¿ÿ>NNN¤§§�Z­æàÁƒäææ2mÚ4œœœppp`„ $''Ó£GÂÃÃÙ·oYYYäääзo_’’’´öûÓO?QXXˆŸŸ-Z´ÀÄÄ„™3gVú{ „BüSÉà[ape×GW«Õäçç+ÓMË®'[TTtßë©—mK×úî‡Òº?11QgߺÚt®5¯R©pwwg÷îÝ 4HëÛŠò£¹$ž‘‘&&&ÔªU«TºÖ»711ÁÝÝ�ýû÷súôiúô飷|eϹìò…eÏKs»ìùݯÎ�;³dÉBBBعsg©c'Nœà‹/¾ÀÏÏGGG:Tn  `bbRa}ß?}ùз.ò3Ï<£ôYòü?þøƒ»wïj]G¶d*yqq±Î6Ëzå•Wxï½÷8þ<111 >\ù±`õêÕ¼ð Jùôôt­}–ümÍÍÍ•þKn(ÉiíÚµ�{÷ã[XXàááÁÿûÿ�k׮Ѿ}{7n¬³ßM›6•j«ä‡ !„âq'ÓÎ…צMŽ9¢LÝMJJâÙgŸU®’–åììLrr²ÖõÔ ªô”k]ë»ëÛ¯k-w]uô­50fÌžy悃ƒ•}e× ×—µZMRRG�Å‚† –Ê…¾<==Ù½{7‡æå—_Ð[¾llÚι*ôåT}ã &ðÑG)»©©©ØØØÐ²eKîܹåK—ô†õÕÑ÷ý«J>4ÏÃÆÆ6nÜȲeËØ¶m¡¡¡X[[Ó­[7½q–eiiÉñãÇ•)øe�7Žââb"##puuÅ‚ùóç“’’ÂþýûIII©RŸ...Fll,XXX(÷ƒ÷ë×�ßÿ�o¿ý–~ýúéí·cÇŽF||<Ÿ}öY•bB!þ©äÊ·Âàlll äÓO? Q£FÌž=[gy[[[üýý  N�:ØÙÙ)S€³³³Y³f �;w®Ôë%ë»GDDPTTDíÚµ=z4;vÔ¹¿d-÷:uêàää¤ô£«-333åáQõêÕSÖš×€òÉ'Lš4‰Õ«W3fÌÞzë-"""ˆ‰‰á‹/¾Ð›•JEBBË–-£~ýúÌ™3##£R¹¸}û¶ÖZ·n͉'pqqQ®HŸ9sFgù²±i;ç:Túïokk«3§ÚèûwîÜ™Î�˯°àîîÎÁƒ6lõë×çùçŸ¯ðŠª®:ú¾º¾ÚòQö<>ÿüs/^ÌöíÛ)((ÀÙÙ™™3gR¯^=nݺU™T÷~€˜?>S§N%""¢ÔƒÕàÞ¬†7Þxƒ-[¶�œœL§N�X°`‘‘‘øúúòôÓOÓ¿eº|e4mÚ”àà`V¬XAxx8Ï=÷áááÊ”øN�:Ñ A²²²”+ûÖÖÖZû}ûí·ñóó㫯¾"**Šwß}—uëÖU:!„âŸÊPs½*jWÛq#�ý%ï*-ÛšeTõJ¶K^Æ¿›üý¹äÝ2??ÿëÕ!y'OždùòåZ§{?îÔj5¯½öZ©‡¦Ý�iÓ¦áååU¥A³¸çIþþ QYçÏŸÐz…¨>’çš!y®fffnÀM (ÔxWÿýY­ñ*Öx•l£±�ƾ²ÛÅŸ5UtoWåïýª$™v.„x$]½zU™R§L—UwãÆ RSSi×®ÝÃåC¾B!„¨n2í\ñHJLLäûï¿ÇØØ˜Ž;òúë¯?ì�þ±pwwW¦•‹ŠÉ÷O!„ÕM¦� !„Bˆ"Ótk†ä¹fHžk†L;B!„B!Dµ“Á·B!„Ba`2øB!„B! LßB!„B!„�Éà[!„B!„00| !„B!„&ƒo!„B!„ÂÀdð-„B!„B˜ ¾…B!„B“Á·B!„Ba`2øB!„B! LßB!„B!„�Éà[!„B!„00| !„B!„&ƒo!„B!„ÂÀdð-„B!„B˜ ¾…5fóæÍ¸ºº’��mж/]ºÄøñãéÞ½;ÕÞWBB®®®\¾|¹ÊuÓÓÓquu%>>¾Úã*Ë�ù6¤²ù½~ý: , k×®œ9sæ!G'„BqLvBˆ'GJJ Í›7ÇÚÚÚ m�žžÎÇL£F�ª½/C™={6­ZµbÈ�!ÕÒž!ò]Ý1VdÆ ¬\¹’ÜÜÜéO!„ÂPdð-„¨1)))ôèÑÃàmŸ9s†N�:ѳgOƒôe(‡ÂØØ¸ÚÚ3D¾«;ÆŠäçç3bÄ,-- ¯±~…B!ª› ¾…5"--�ëׯӹsg~ùå"##IKK£Q£FøøøÐµkWÒÓÓ>???æÏŸ_®½¤¤$¢¢¢ÈÈÈ U«VøûûÓ¤I�ûY¶l999˜šš–:7muììì”~ qrrbÉ’%¥êåååñÎ;ï`llŒ�� YYYÄÆÆKBB–––zó4tèP¼¼¼øá‡xÿý÷éÓ§O¹|h�e̘1äää°eËBBBøùçŸ‰ŽŽfÁ‚åÊûúúj�QÛù«T*̰aÃ8pà·oßfôèÑ\»v�¸¸8jÕª…¿¿?...:ó;jÔ(àÞTt!„Bˆ2¹ç[T›¢ã¿q't! }›[]ºq«K7þú6wBRtü·‡žxÈŽ=ŠJ¥¢}ûö\½z___Œ��™8q"FFFøûû“‘‘¡”ÿòË/yå•Wèß¿?éééaee…��‰‰‰:Ûž6möööDEEñ /”kïÔ©SÊÀ/44”œœBBBtî×ìâĉ\»vMé[W�]»v±mÛ6Æ�ϼyó6lFFFJ½ââb‚ƒƒÉÎÎ&44”)S¦ààà@TTæI­V³nÝ:ÆŒƒ••ÁÁÁœ;w®\NtÅâééÉÅ‹9wîjµšü‘Þ½{³{÷n­å'MšT.F]ç_"::š7ß|[[[.\HZZï¼óùùù„††èͯB!ÄãB®|‹jq't![¿/·_}1õÅt ¶~�éÀþÔžîû¢�‚£G�Ò²eKêÖ­Ëž={ÈÍÍeÚ´i899áààÀ„ HNN¦cÇŽŒ9’ &ðÝwßQPP€ŸŸ-Z´@­V3wî\­m×­[œ��iÛ¶-éééåÚûæ›oP«Õlذ�;v�——G½zõHNNÖºÿ§Ÿ~¢°°PéßÄÄ„™3gè¬Ó A¶nÝŠ››ýúõ+•�èèhNž<ɬY³°··ÀÆÆ†víÚѶm[Mbb"½zõÒseò”——ü/'%Ç4sÒ©S'­±4nÜWWW8@vv6Ï?ÿ<ŽŽŽ8::ê,_–®ó/ùÑ£„¹¹9pïj}Évqq1Pþï«™_!„BˆÇ…L;¿III¼þúëìß¿_Ù—••ÅÌ™3>|8žžžL™2…+W®TXàÚµk|ôÑG 8�I“&qõêÕ9�êp'ta¥Þ% :Ì�Ð…Œ¨f]¾|//¯‡Æ#ïìÙ³dggÓ©S'\\\066&,,ŒØØX"""°°°Pîÿ-«cÇŽÆŽ;øüóÏu¶]®®®XXX0þ|RRRØ¿?))):÷köÏgŸ}Va[iii$''ãææ†‡‡¥–üêС£F�bïÞ½|÷ÝwXZZrüøqŽ;FAAA¥ò4gÎâãã ÇÌÌ —r9Ñ‹§§')))ìØ±ƒÞ½{WX¾lŒºÎ¿*ôåW!„âq!ƒï*¸uëãÆ�cçÎ�<õÔS¥ŽÕªU‹aƱiÓ&¶mÛFûöí•'óê«0mÚ4 ÄÖ­[éÖ­üq�œÏƒ*:þ›Ö©æ)Øú}�ݾdÉ’r?‚ˆšwôèQLMM•©ÊM›6%88˜ÜÜ\ÂÃÃ)..&<<\ç’XÏ=÷~~~\½z•Õ«WÓ¡C�mW†µµ5 ,ÀÄÄ___/^Ìï¿ÿ®s¿fÿQQQ¼û˜˜èmëÊ•+ìÝ»???¶mÛ†··7mÚ´)ÇØ±ciݺ5‹-â¿ÿý/&L //�©S§rêÔ©JåÉÑÑ‘/¿ü’7nBÆ ËåD_,/¿ü2&&&dff*OF×W¾lŒºÎ¿*ôåW!„âqa¨¹}µ«í¸‘Æþ’w•–mÍ2*�z%Û%/ã¿ßMþþ\òn™ŸŸ  çRJZZŽŽŽзo_ºvíªµÜÙ³g !**Jo½ãÇ�³xñbV®\©ÔäHo’çš!y®fffnÀM (ÔxWÿýY­ñ*Öx•l£±�ƾ²ÛÅŸ5iÛW•ãU&—ªÈÑÑQïñââbþüóO6mÚÄèÑ£+¬—ššJ«V­JísvvæÜ¹s¥ßjµšž={âêêÊÉ“'133cìØ±ÄÅÅ‘ššŠ­­-ÁÁÁ4lØ�¢¢",XÀáÇ166ÆÃÃqãÆ=ÀYkWtø¨AêêŠÆŒxxx(Sc—.]Jƒ 4h�Öòëׯç·ß~cäÈ‘ôîÝ›   :Ddd$¹¹¹´lÙ’O>ùssóJçàÈ‘#,^¼˜»wïR¿~}å¾\¡›——ÔFLL *•ŠÜÜ\vîÜI×®]155­–¶7UÉÉéÓ§IMMeذaŽJ!„âÉ&ƒïj6yòd’““±²²ÂÍÍ­ÂòÙÙÙÔ­[·Ô>KKKnܸQ®ìíÛ·™4i 6díÚµOݺu gÍš5LŸ>�ƒrîÜ96oÞ üïaFÕM}1½âB÷QWWü}úôaûöíÊà{ß¾},_¾\gy///•+ß™™™Ì�;—U«VaccCdd$k×®eܸq•ÎmNN���¬\¹{{{¶lÙBXXØ}çáIQö¦ûqñâEvíÚE^^/¾ø"¾¾¾ÕÖöã¦*9‰‹‹S~´B!Ľ•:þøã�R8ÕKse”'‰Üó]Í"""HLLdúôé|ñÅdffê-oiiINNN©}·oßÖz﫹¹¹rõµ[·n4mÚKKKT*\ºt ¸w•ýÂ… „††’œœ\îÉÐ�:]ñ»¹¹qâÄ òòò8uêöööXYYUú|�;Æ•+W aêÔ©;vL™VTÙÜ;vŒ–-[*KC½ôÒK4oÞÜÐ)Àĉ‰‰‰!!!�Ï?ÿ\yÊö“ªqãÆ:t¨Ü”óªš}š>}úè-_ÖSO=EçÎ�•á•(Yú¨„¾Üj}hžB!„x<„„„rÏ·¡=‰3 äÊw5IOOç�?þî æŽ9µk×*¼*Ú±cGrssÙ½{7?üðõêÕ{ „ýõ×_äååÑ£G9vìX¹fu0îü/ƒÔÕ¿§§'»wïæðáüüòË–·²²RžvÞ¦MΜ9Ñ#G€{÷–ß¹s§Jq·iӆÇ“šš À/¿üÂ… ªvòB!„Bˆ'Ž\ù®"nß¾ÍåË—9yò$+V¬ •JŪU«8sæ EEEØÛÛ3gÎÌÍÍõÖkÙ²% .döìÙ,[¶Œ&Mš(¿¶Ý¯3gΰlÙ2rrr¨W¯~~~¨TÕÿ;‹©gÏûÚ¹gO�ÇôÅߺukNœ8�‹‹‹rEZ_ù·Þz‹ˆˆbbbøâ‹/ %""‚¢¢"j×®ÍèÑ£K-[U[[[ N�:899Uø>aX'Nœ 88•JÅŒ3hݺuµ¶ÿ O´W«Õ¼öÚkìÙ³§Zcú§+›ÓsçαpáB6lH@@@¹ò}ûöeÊ”)妨߼y“7Þxƒ¨¨(Z´hQ#±?ˆC‡)ÿ?ammÍ /¼À´iÓÊ=÷£:ôíÛ—¬¬¬rûÍÌÌØ·o_µ÷§éâÅ‹Œ?ž‰'Ò«W¯jió×_åý÷ß'44”W^yEÙÿꫯ2`À&Ož\£ñ!„÷CßU´téR�Ç.\x_õ7nÌòåËõö«R©JýÞÎήÔ` mÛ¶Êtê6mÚèí¯º·qÆt`ÿ*ÀMöǸ�³ÎãÅß¼yså¡k•ÿ׿þÅš5k”í^xAYþMSes àî»»ÎøDÍZ²d ~ø!...;”*Y²d C† Qž5ð(©ÉØ–-[Æ�?þHÓ¦Mu–ÉÏÏgõêÕåßÑÑÑäåå8ÂꑚšÊ´iÓhݺ5ãÆ�ãÆ�\½zUxÏž=›V­Z1dÈ�ûj¿lýiÓ¦‘ŸŸÏ¹sçø÷¿ÿÍÛo¿M‹-022Ô £ÿcff†­­íÝ¢ó ùÐOu¶-„BT… ¾Å©=Ý—âŒËþt¸RåM^ìü@ë{߸qƒÔÔTÚµkwßmˆÇKvv6�ë~†À£*%%OOχ†V5[Ïž=ùàƒHJJâàÁƒZË” ž8 ¬"‘——ÇÞ½{qvÖýCÞ£äðáÃ2yòd­³3:„±±ñ}·_¶~·nÝ€{WŒÿýïÓ©S'\]]ï»ýªxúé§ùꫯ¨�͇¾xª³m!„¢*dð-X�E¡Ü ]XápÓ�ýhà ���€»»»A¦Ñ Ã:~ü8ܸqƒ 0cÆ P«ÕŒ1WWWöìÙÃ'Ÿ|B—.]HNN&22’»wïâèèÈùóçËMýŽˆˆ 55•‘#GâääÄÒ¥Kµ¶¥m}w �ûõ­å®­N�:u´®5¯éúõëLš4‰éÓ§süøñrkÐëËOÿþýquuåÏ?ÿT¦×—ti�aÆŒxxx(³E–.]Jƒ 4h�Öòëׯ/›¶s677§gÏž¸ººròäIÌÌÌ;v,qqq¤¦¦bkkKpp°rõ\WN+»Z€··7«V­Rß111ôíÛ—ü€ÌÌLf͚Ņ (((`„¢™Ô IDATøðáx{{£V«éÙ³§²Z‚J¥âÓO?¥uëÖ:ëz¿ºò¡í»W¢Q£FÀ½«®C‡åÕW_UžØ?eʲ²²ˆ��%66–„„²²² ãÔ©S¨T*ºté‚¿¿?YYY |8„……‘””Daa!NNN,Y²„ŒŒ L@@ ))‰¨¨(222hÕªþþþ¨T*�íjËGEJÎI[{%ÇHLL¬R®„Bˆê$#Q-jO÷Å<*Ó�ýK=É\eßÓ�ý1�Š|à�7ÀðáÃõÞÛ'M·nÝÂßߟ™3g²eËúöí[êÞÞóçÏÓ®];bccéÒ¥ 7oÞ$((ˆ9sæ°qãF:vì¨<äNÓG}DóæÍY·n�rëFÙ¶JÖw_´hß~û-vvv¬]»Vçþ’µÜKúîÞ½;/^ÐYGs­ù�72f̘RqÞ¾}›©S§âããCÛ¶mñòòÂÙÙ™uëÖTa~²²²ðööæ›o¾áƒ> 00�¢¢¢R}芡OŸ>¥n«Ø·o=zôÐY¾llºÎ¹ä¼&MšÄæÍ›éÕ«���ñí·ßÒ²eKå–}9­,gggLMM9vìlß¾��*ÇëׯOPP111¬_¿ž 6�‘‘¡ÄéããCtt4C‡%""Bo}ß?}ù(ûÝÓäîîÎøñãÉÌÌ$44”7Þxƒ+VP\\̤I“€{«_DEEaaa�µµ5]»vå“O>á­·Þâÿþïÿؼy³ÒÞ—_~É+¯¼BÿþýµÖ¯ Í6*êoÓ¦M¼õÖ[ØÙÙAvv6»víbÛ¶mŒ?žyóæ1lذrÓÚO�:…¿¿?...„††’““Sê¹&ÚÚ½ßóÑÕž¦i[!„xPrå[Tã6ÎzïåO®cÇŽÑ¢E e}ô~ýúEff&ÖÖÖÔªU‹îÝ»+åýõ×rë©oݺµR}•mKs}w¸÷�®§Ÿ~Zï~]}ëªóúë¯+kÍ¿úê«têÔIé_­VãããCß¾}•«¶UÍ�¹¹9J<óæÍãâÅ‹Ê> Ôz÷š1¸¹¹F^^.\ÀÞÞ+++�åµÅ¦íœÌÍÍ•+Ûݺu+uÑÃÃÿüç?J÷û÷Ô4jÔ(¾þúkºu놻»;uêÔQŽsûömâââ¸zõ*7oÞ$33;;;ÌÍͱ³³ {÷îÊ�ºê¤¦¦Vù;å¿{Úâ:t(‰‰‰|óÍ7|õÕW´lÙwwwlllh×®mÛ¶î­Ô`kkKBB×®]£¸¸¸ÔÊ #GŽd„ ÊvÙú•Q¶ }ý•\Å®[·.AAA¤§§Ó A¶nÝŠ››ýúõ+×Grr2jµš 6°cÇòòò¨W¯žÞvÛ´iSî|Jõ………¥Ú/***5…\[{ÖÖÖÊñfÍšÝW®„Bˆê ƒo!„Á•]]­V“ŸŸ¯<±¾ìý—EEE÷ý°¦²méZßýСCZ÷'&&êì[W[€ÎµæU*îîîìÞ½›Aƒ•[G*Î�æ’xFFF˜˜˜P«V­RmèZïÞÄÄwwwöïßÏéÓ§éÓ§�Þò•=ç²Ë–=/Íí²çw¿:wîÌ’%K açÎ�¥Ž�8q‚/¾ø???9tèP¹�€‰‰I…uô}ÿôå£2÷›››Ó·o_ž}öYÞ{ï=åê|Y»wïæ³Ï>cîܹ¼øâ‹¼úê«¥Ž7iҤ¾*¢ÙFEýiÆP\\L§N�X¿~=;wîdÏž=¬[·Ž�7–*_2µ~õêÕ¼ð Êþôôt�íjóÌ3Ï÷þf%±ýñÇܽ{Wë:¼µ'„B< 2í\apmÚ´áÈ‘#ÊÔݤ¤$ž}öY�÷Z:;;“œœ¬u=õ‚‚‚*=åZ×úîúöëZË]W}kÍŒ3†gžy†àà`e_Ù5èõåG­V“””ÀÑ£G±°° aÆ¥r¡/OOOvïÞÍáÇyùå—ô–/›¶s® }9ÕFßßx„ |ôÑGÊ ®Djj*666´lÙ’;wîpéÒ¥ úêèûþU%šç‘””„¯¯/ëÖ­cÓ¦MDDD R©ø×¿þ€¥¥%Ç�W¦Õ— Ê333Ù»w¯ÞóÐV¿ªªÚ@ZZÉÉɸ¹¹áááAAAA¹iÞ®®®XXX0þ|RRRØ¿?)))U>\\\ظq#Ë–-cÛ¶m„††bmm­<\®²4WB!Äý’+ßBƒ³±±!00�O?ý¸÷ð©Ù³gë,okk‹¿¿¿²žº���28;;›5kÖйsçJ­±þÔSOi]ß½cÇŽ:÷ëZË]W[fffZך×€òÉ'Lš4‰Õ«W3f̘rkÐëË�J¥"!!�eË–Q¿~}æÌ™ƒ‘‘Q©\ܾ}[çz÷­[·æÄ‰¸¸¸(W¤Ïœ9£³|ÙØ´�s‡*ý÷·µµÕ™Smôý�;wîLçÎ�ËÕqwwçàÁƒ 6ŒúõëóüóÏW¸¬–®:ú¾º¾Úò¡yæææðÍ7ß�——‡ƒƒ!!!<ÿüóÀ½æÏŸÏÔ©S‰ˆˆ oß¾üþûï,_¾œæÍ›—ºj¬MÙú•/«ªý\¹r…½{÷²råJLMMñöö¦M›6¥®j[[[³`Á"##ñõõåé§Ÿ¦ÿþÊTýªœÏçŸÎâŋپ};8;;3sæLêÕ«Ç­[·*}®š+!„â~jÁÏŠÚÕvÜHcÉ»J˶f•F½’í’—ñßï&.y·ÌÏÏ?P…sB’çš!y®fffnÀM (ÔxWÿýY­ñ*Öx•l£±�ƾ²ÛÅŸ5UtoRµß»$ÓÎ…�¤«W¯*SBãââ”éÒ¢ênܸAjj*íÚµ{Ø¡ücÈ÷O!„ÕM¦� !I‰‰‰|ÿý÷Ó±cG^ýõ‡Ò?VBBîîîÊ´rQ1ùþ !„¢ºÉ´s!„Bñ@dšnÍ�<× ÉsÍ�içB!„B!„¨v2øB!„B! LßB!„B!„�Éà[!„B!„00| !„B!„&ƒo!„B!„ÂÀdð-„B!„B˜ ¾…B!„B“Á·B!„Ba`2øB!„B! LßB!„B!„�Éà[!„B!„00| !„B!„&ƒo!„B!„ÂÀdð-„B!„B˜ ¾…B!„B“Á·¢ÆlÞ¼WWW²³³ Úö¥K—?~<Ý»w'""¢ÚûJHHÀÕÕ•Ë—/W¹nzz:®®®ÄÇÇW{\e2߆T6¿×¯_gÁ‚tíÚ•3gÎ<äè„B!î�ÉÃ@ñäHII¡yóæX[[´í€€ÒÓÓùøã�iÔ¨Qµ÷e(³gϦU«V 2¤ZÚ3D¾«;ÆŠlذ�•+W’››[#ý !„BŠ ¾…5&%%…=z¼í3gÎЩS'zöìi�¾ åСCW[{†ÈwuÇX‘üü|FŒ�¥¥%ááá5Ö¯B!Du“Á·¢F¤¥¥qýúu:wî À/¿üBdd$iii4jÔºvíJzz:ƒfâĉÄÄÄдiSÂÂÂØ»w/K—.åÖ­[´oßžÄÄDbbb°³³+Õ¶��gÏžåìÙ³ÄÇÇãççÇüùó˵—””DTT´jÕ š4i¢sbb"Ë–-#''SSÓR禭Ž���ÒOaa!NNN,Y²¤T½¼¼<ÞyçŒ��±±±!++‹ØØXbccIHHÀÒÒRož†Š——?üðï¿ÿ>}úô)—ï‚‚­±Œ3†œœ¶lÙ@HH?ÿü3ÑÑÑ,X° \y___­1j;•JÅàÁƒ6làöíÛŒ=šk×®G­Zµð÷÷ÇÅÅ@g~G�Ü›Š.„BñO&÷|‹jStü7î„.䯡os«K7nuéÆ_CßæNèBŠŽÿö°ÃÙÑ£GQ©T´oßž«W¯âë닱±1'NÄÈÈ222”ò_~ù%¯¼ò ýû÷'==�   ¬¬¬ðññ!11QgÛÓ¦MÀÞÞž¨¨(^xá…rí�:uJø…††’““CHHˆÎýšýOœ8‘k×®)}몳k×.¶mÛÆøñã™7oÆ ÃÈÈH©W\\Lpp0ÙÙÙ„††2eÊˆŠŠÂ¢Â<©ÕjÖ­[ǘ1c°²²"88˜sçΕˉ®X<==¹xñ"çÎ�C­Vóã�?Ò»wovïÞ­µü¤I“ÊŨëüKDGGóæ›obkkËÂ… IKKã�wÞ!??ŸÐÐP½ùB!„x\È•oQ-î„.¤`ë÷åö«/¦£¾˜NÁÖï1ØŸÚÓ}BtâQpôèQZ¶lIݺuÙ³g¹¹¹L›6 '''˜0aÉÉÉtìØ€‘#G2a¾ûî; ðóó£E‹¨ÕjæÎ�«µíºuëâàà€³³3mÛ¶%==½\{ß|ó jµš 6°cÇòòò¨W¯ÉÉÉZ÷ÿôÓO*ý›˜˜0sæL�u4hÀÖ­[qss£_¿~¥òÍÉ“'™5köööØØØÐ®];Ú¶m ÀÁƒ+ÌSpp0¯½öM›6å½÷Þ#99‡R9ÑK�=ˆˆˆàÀ�8;;“��M¯^½ÈÊÊÒZ¾Y³fåbÔuþ%0`µk×föìÙ¼ÿþû899‘žžNtt4jµZo~…B!2ø,oòt :\a¹‚­ßSœq™:‹Bk *ñ¨IIIQqwïÞ °°€Úµk`ff¦”oÒ¤‰ò¹   Tù²Ó¾5ÛÖE³=+++V¯^­\”'�—Ý¿iÓ¦Rýk^ÁÖÕÀúõëÙ¹s'{öìaݺulܸQ9æääÄéÓ§ILL¤W¯^Zc®Lžòòò€ÿå¤ä˜fN:uê¤5–Æ�ãêêÊ�ÈÎÎæùçŸÇÑÑGGG�åËÒuþ%?z”077î]­/Ù...Êÿ}5ó+„x8Ôj5 |ýõ×XYY±bÅŠ‡’BüãÉ´óû�””Ä믿Îþýû•}YYYÌœ9“áÇãééÉ”)S¸råJ…õvíÚÅÀ�K½\]]9räH��σ¸º°Rï…?æNèBFT³._¾Œ——×Ãã‘wöìY²³³éÔ©...Fll,XXX(÷ÿ–Õ±cGŒŒŒ cÇŽ|þùç:Û® WWW,,,˜?>)))ìß¿Ÿ””�û5û���ç³Ï>«°­´´4’““qssÂRK~uèÐ�Q£F±wï^¾ûî;,--9~ü8ÇŽ£   Ryš3gñññ„‡‡cff†‹‹K¹œè‹ÅÓÓ“””vìØAïÞ½+,_6F]ç_úò+„¨Yjµš;v0|øpfÍš¥Ü–"„âÁÉà» nݺŸqãØ¹s'O=õT©cµjÕbذalÚ´‰m۶Ѿ}{åɼúê½öÚklݺUy-_¾œÆ�Ó¡C‡;¯ûUtü7­SÍ+R°õû»|É’%å~5ïèÑ£˜šš*S•›6mJpp0¹¹¹„‡‡S\\Lxx¸Î%±ž{î9üüü¸zõ*«W¯.õßGÙ¶+ÃÚÚš `bb‚¯¯/‹/æ÷ß×¹_³ÿ¨¨(Þ}÷]LLLô¶uåÊöîÝ‹ŸŸÛ¶mÃÛÛ›6mÚ”ŠcìØ±´nÝšE‹ñßÿþ— &�——ÇÔ©S9uêT¥òäèèÈ—_~É�7 ¡aÆår¢/–—_~233•'£ë+_6F]ç_úò+„¨jµšÝ»w3bÄf͚Ņ xæ™g˜1cË—/Øá !ÄcÁPsû*jWÛq#�ý%ï*-ÛšeTõJ¶K^Æ¿›üý¹äÝ2??ÿ@Î¥”´´4  oß¾tíÚUk¹³gÏBTTT•ê-_¾œ:uê(Oø}”éºÏ»2jêþï±cÇ@³fÍ ÒþåË—™:u*ëׯ7Hû�‹ÀÀ@²²²X¶lYµ´·hÑ"¢££IJJbÖ¬YÕÚö?EÉSáKîùÖTÕ|{yyammMdd¤!BB<ÂÔj5‰‰‰¬X±‚óçÏðÌ3ÏàííMÿþý+½´`IÝgŸ}Ö`± ÉsM‘<× 3337à&Pj¼«ÿþ¬Öxk¼J¶ÑØFc_Ùíb�Ïš´í«Êñ*“K Uäèè¨÷xqq1þù'›6mbôèÑ•®÷î{Œ��gÍš5厩Õjzö쉫«+'OžÄÌÌŒ±cÇGjj*¶¶¶Ó°aCŠŠŠX°`‡ÆØØÆ�Wõ“­@Ñᣩ«+þ3fàáá¡L�]ºt) 4`РAZ˯_¿žß~û�‘#GÒ»wo‚‚‚8tè‘‘‘äææÒ²eK>ùäÌÍÍ+�[€#GްxñbîÞ½Kýúõ•ûr…n^^^XXXàøñã¥öedd0oÞ<æÍ›Wåöòóó�Ò„ÕOò\3$φ§¹2Ê“Dîù®f$&&2}út¾øâ 233+]wóæÍ 2Dçqsssåêk·nÝhÚ´)–––¨T*<<<¸tépï*û…  %99¹Ü“¡uºâwssãĉäåýÿöî>¸Šêpãøs/á%‘"/‘¦ÀHiFŠ š†¢£ ˆB¤[¡ƒ6íHg:C 8R)PA`|!"/R°-Ô Š#Aó›"La�ÆL1BÃT Ø"*o™á^~„½l6»{_r_“ïg&sïÝ=»{öäÎÀ“söœZ9rD=zôPÇŽC¾ßòòrýïÿÓÂ… 5mÚ4•——þÚjÛ–——«OŸ>�¥¡î¹çeggǺI é7¿ù�6oÞ¬ÒÒRÍ›7/0ËvKÕ½{wíÛ·¯Ñ�óp=þøã*++ÓÍ7ߥšÀ=ß1ЦMåçç+;;[Ÿþ¹233ƒSYY©Ë—/7š�ɉ5`š?wïÞ]o½õ–vïÞ­ 6hݺuzùå—û‰x{t�¸÷ÛÛ£ñ’E§ú§¥¥)??_eee:zô¨F�åZÞꦛnR^^^`"<ƒuW·¶½zõj£IóH5¯¾újT‡�óŒl|ÐÎñA;ÇGKY@Ïw”TWWëðáÃ’êÃÜÁƒõÅ_„Ü+¬×;555ª­­Õ}÷ݧٳg«¼¼<&Ë„´Ê»3&ǺÕäȑڱc‡öï߯{ï½7hùŽ;f;ïß¿¿Ž;XÆÍçóéÒ¥KaÕ»ÿþÚ¿¿ªªª$Iÿüç?uâĉðn€óz½*((І ´`ÁÝzë­�aç?ü°6oÞ,ŸÏ—èj@³BøÓ¤I“TTT¤èÅ_TQQ‘*++USS£5kÖèG?ú‘ÆŒ£5kÖhÁ‚ÊÈÈp=N’Ο?¯½{÷êþûï�J�;¦ââb=úè£*..Ö“O>)¯7ú¿êÖ#GÄäX·ú÷íÛW•••ºí¶Û=Ònå'L˜ U«Véw¿û�nºé&-^¼X¯¾úª&Nœ¨)S¦„½$Rff¦Š‹‹U\\¬_üâúè£�BšL±SYY©G}TEEE�?€ESSÖr÷ûý6lX”k”ú¬múÙgŸiêÔ©Z¸p¡mùÂÂBýíok´ýܹs:t¨Ž=³ºFËǬÁƒk÷îÝ ¶6LK—.u=öäÉ“=z´JKKm÷ë­>¼ÁZòÆ5Ã]w- !â‡açaZ±b…ã¾_|1¢ã:tè íÛ·»^×ëõêƒ>|ÎÊÊj°¼Õ€éû÷ïïz½hiÕ?G­ÇŽ{¹±ÖcG«UÿÇýÁêŸ��˜t-Xù;ï¼³Áìñýúõ ,ÿfjÛJR~~¾òóóë‡øZ¾|¹¦L™¢Aƒ%º*aY¾|¹~ò“ŸæH&ñ¬ÛÊ•+õá‡êÛßþ¶c™+W®híÚµ�žoóÍ7U[[ã&^›6m”™™xäåÙgŸÕí·ßÞh´ÔÅ‹õÊ+¯è©§žJD5‘âŒ>tèP•––êµ×^Ó‰'ôÜsÏiÛ¶múýïŸè*@Ê£çMÒnúJûA^ÈåÓ~�פõ½Ïž=«ªª* 80âs yùꫯԽ»óÉêСCª©©It5lųn#FŒÐúõë]'Ž3Âç?þñ�À¶ÚÚZýýïWNŽóòš‹®]»êøƒî¹çIÒ¾}ûtäÈ‘Fåºuë¦íÛ·«¼¼<ÞUD3âõz5räHmܸQO?ý´zöì“ÑsÐÑó�&K_ºX—¿´¼õØÑM Þ’TZZªüü|þ#�‚***TRR¢³gÏê–[nÑŒ3Ô³gOùý~ýô§?ÕàÁƒõÁhÖ¬Yºë®»tàÀ-[¶L—/_V¯^½tüøñ#¤úÕªªªô³ŸýL½{÷ÖŠ+lÏe·¾{ûöí·»­ånwLzzºíZóf_ýµ&Ož¬éÓ§«¢¢¢Ñôní3zôh Û:̘1CC† ŒY±b…n¹å=ôÐC¶å_ýõFu³»çŒŒ �1BƒÖ§Ÿ~ª6mÚè—¿ü¥¶mÛ¦ªª*effjþüù�Þs§6 u^Œ¢¢"­Y³&°„ãæÍ›UXX¨?üP’tæÌÍ�;W'NœP]]�Æ�¯¢¢"ùý~�1"°Z‚×ëÕSO=¥¾}û:#ÉõûçÔvß½PUWWëÇ?þ±Æ�¯²²2]¸pA�=ö˜Æ�ØW\\¬�;wêË/¿Ô–-[´eË•––o7nœ¶nݪ%K–hݺu�®±k×.­^½Z§N�Òí·ß®™3gêé§ŸÖùóçµiÓ&ù|>=ðÀêܹ³6nܨk×®iÔ¨Qzà�4uêÔ�ï̓ÂGŽ™èª@³A‚AT´›þ„2V/Së±£ÌdîíÑ]­ÇŽVÆêeMÞ’4~üx=þøãM>âëÂ… š9s¦žyæmÚ´I………*..ì?~ü¸¨-[¶è®»îÒ¹sç4gÎ-X°@6lPnnn`’;³©S§*;;[ëׯתU«lÏe¬ï¾téR½ýöÛÊÊÊÒºuë·k¹×.((ÐÉ“'%ÉñóZó6lÐĉÔóâÅ‹š6mš&Mš¤è‘GQNNŽÖ¯_¯9sæmŸ/¿üREEEúË_þ¢_ýêWš={v£g0�ê0jÔ¨�UìÞ½[÷ÝwŸcykÝœîÙ¸¯É“'ë­·ÞÒý÷߯ٳgkΜ9zûí·Õ§OŸÀ#nmªœœµnÝZåå媫«Ó»ï¾«±cÇöwêÔIsæÌÑæÍ›õúë¯ë�7ÞЩS§õœ4i’Þ|óM=üðÃ*))q=ÆíûçÖÖï^$6nܨ &(++K%%% žá–¤É“'K’zöì©Õ«W«}ûö�}iiiš>}ºªªª´iÓ¦Ç9rD3gÎÔ Aƒ´xñb�?^ .ÔðáÃuòäIý÷¿ÿUyy¹.\¸ Ï>ûLÇŽÓ‘#Gôõ×_kèСÝ hˆžoDM«þ9®Ïr£å*//×m·ÝXýÁÔêÕ«uæÌuîÜYmÛ¶UAAA üÇÜh=õwÞy'¤kYÏe^ß]ªŸ¤«k×®®Û�®ít̘1ckÍ6Lßÿþ÷×÷ûýš4i’ ½¶á¶OFF†zöì¨ÏsÏ=§“'O¶Ij°Þ½¹wß}·žþyÕÖÖêĉêÑ£‡:vìèXÞ®nv÷,I�žmã9Qc½ð!C†èÏþsà‘þ>Í~þóŸë�ü£†ªüü|¥§§öµjÕJ/^Ô¶mÛtúôi�;wNgΜQVV–222”••%I*((üQÀ阪ªª°¿Rãïž™Çã‘T¿\¡™Ïçk°¤Sqq±~øÃêßø†æÌ™£êêjuîÜ9°ÿ;ßùŽºté¢�jÀ€’.—8pà@�5J«W¯Ö¬Y³Û8 ¿ß¯7ÞxCï½÷žjkkÕ¡ChÙ²e:xð þýï«°°P{÷îÕîÝ»åñx”™™Ù"†ö± ß×$ybtn)ƺ>ºßïו+W3Ö[דõù|¯§n=—Óúîûöí`¸›?IDAT³Ý¾sçNÇk;�K’ãZó^¯WùùùÚ±c‡zè¡FëÈKÁÛǼ$žÇãQZZšÚ¶mÛàNëݧ¥¥)??_eee:zô¨F�åZ>Ô{¶._h½/ógëýE*//OË—/×Â… õþûï7ØWYY©E‹éÉ'ŸT¯^½´oß¾FAWªïvŒÛ÷Ï­=ÜÖEîÖ­[àšÆ ø‡ÖåË—mב5†’_»vÍñœN&Ož¬={öè•W^ lëØ±£$iíÚµêׯ_ƒòýúõÓþýûuøðaM™2EíÚµÓ®]»Ô®];ó´Táÿ‚Tÿ5&� ºú÷﯃†îîÚµK·Þzk —Ô*''G°]O½®®.¬Y®�ÖwwÛî´–»Ó1nkÍKÒĉÕ­[7ÍŸ??°Íº½[ûøý~íÚµK’ôÑG©}ûöúæ7¿Ù -Üê0räHíØ±Cû÷ï×½÷Þ+I®å­u³»çp¸µ©·ßñ¯ýkM�:5& UUUêÒ¥‹úôé£K—.éóÏ?w ÃnǸ}ÿÂió}téÒEƒ Ò† ´råJýõ¯Õâŋչsç°‡uß|óͪ¨¨ Á·êر£&Mš¤êêêÀ¶Áƒ«}ûöZ²d‰:¤²²²Àdzÿý÷uúôiååå©  @Ÿ|ò‰:¤!C†„U7b,¥ó_¢†�Ó3´ ]ºtÑìÙ³K }ë[ßÒ³Ï>ëX>33S3gÎTqq±ÒÓÓ•••üÕW_éOú“òòòBZcÝXß½¤¤D>ŸOíÚµÓc�=¦ÜÜ\ÇíÆZîéééêÝ»wà:NçjÓ¦�V®\©óçÏ«C‡�µæÍ|Ö¬YšË²M–íÖ°,|·Èaç‘ÜtJEPïôéÓ�!µÛ¶m —FøÎž=«ªª* 80ÑUI|ÿH¸f—™í@RÚ¹s§¶nݪV­Z)77WcÆŒIt•RVii)g…‰ïˆ¶dvî±ÙlعGõÃËv Ó�Ú9>hçøaعO�‡šv~M�‡¡3쀖"ÙÂw´þÂàz�Çs:Jׄ!„<—\oɾCá6dÀnŸu¸�¯®®îÓÕ àâz3†•‡:<<Ü¡ãI'Y÷Ý8}ãÕnL¿Ý�ßôjüHRÝéÓ§IJò{×óXÝõ�Ö%ÅÌÏu;ýÈæ½ÝkRIdøµA"m8»¿’ø%]}íµ×Ê"<'  ®ç1cr5ɽ‡;T±Î—M–¬=ßfv�ãÖ`ÁþJâ›7oÞ‰ššš-Ñ®(ÀYMMÍ–yóæ�PÃaçn=ÜvÂ͈I!™ÂwS¦{·N9lxúå^xa}äU„ëz»¬Ð‡“CÑ�$dÙ°HÄ2|7u¸€ÓñáI5¹¹¹ÛçÎ�;ŽIØ :jjj¶Ì�;w\nnîvI5º‘ÁÌK‹™sš[®³n³{Mj­b|~O˜eìÞ;½Z·Y¯eÝç‘ó9|{öì9·hÑ¢}>Ÿïÿ²³³Oedd\MKKk'é¦î Åºpá‚<�:tè�èª4k´s|ÐΑóx<§ëêê�:uê�—^zé¥|pûž={¾PýkF¨ßæ½9ŒKöA<Ø£ÇÁÊ$\(á8Ö×p ÍÖWk€¶Ûæ5½êú«Wõh°{µ¾O3ýXÏ�ö€Ta Ì~ÕO¨füØ…mŸÃ«ßæ\N«XY·ÉåÕZ×`÷i±Œ¿¢xTÿ‹6ö·RÃ/‰G7º¹']"|€™9ÛÍZn7Ášu>.»ÉÕ¬!ãmWÎíðXõz‡S.bñêùŽåsßæoƒÝÄk¿e¿¹÷Û(ïÕ�Ñ�Îc¾´NÙÈïò9ØÄjN­ÙïXˆKOy²;—ìg27o3/)f=Æ:éšl>Û O7Êø]>C ЄJÝ&I³Z,ˆ;]?œ^ï¤Ï ­¡çÖ÷vË€Ù IwÛlr558³ Âv¥9 !eh¹ÓÒbI?ä\’ZÅã"&áÎzný솭ۯÙl³öœ;ÕÅîKAøgÖ ×œBµù}8ÁÛ) 7µ×;n=åñ•‘ô~›?ëývÚÊ„mNï="|€§áân¡Û¼-Xïv°^okˆNª^o)9{¾íÊ ÈÖÞi·pã½µ‘Cí Ôsš,ÍZF Ð# Þ)!=º± àRðp§cíz·�®áVGhÎ"þJ¯xS‚wÒ÷zKɾíʆ:[¸áÜi6§z„‹� ™55ˆºõv[÷‡®#™T-ÜÚã&Q¡0Ú½ßvû" çvûíÊnpëí¶+,\‡°S¢×[JþðmW6Òî~·r€ì¶l¶…¬c¼Ã-‰ •ñàÆçH–/ g´4¡„mó¶pB·S™Pö“�‰Úâ=Û¹U¬x¨ÛB�H-Òaò�Ê"Æî3ÚÁf1Oéà-%>,6%|[·…³ß­,½ÝžP{¼íÊ7%x;msÒb÷ÔônÝÞÔnÞ— í©ÂéÙoóþ`ïCÝï¶½©e£.Âe¸uˆ4€+,ˆ‡RZŠP±ݾpCu4‚w$å£*Y‚d´¸y_4Ât4zå •E«w9ܰN &¡Á[J®À‹êyƒödj'H6Áz§C ¿‘ö¤‡sÞ„I¶PI}b1\œç½ 2Ážû¶+o÷Þ­\$çN¨d ˜‘Ö'½Û±:š«pz¶›rl¤!šðí"–Ü\6š÷žŒíÑÍÛ”žñp¯“4’546¥^‘ëmÂõîüÓ”ðœTÁ[JÞð-Å?€[�Mæ¶€dÕ”¡èÖsÄûؘIö€ÙÔúEãþ’½� D#ô6õI¼¥Ô–É S¡í Úbp“!¸ÇT*ÈhÕ5•îš«h…å¤݆T ¢ÌP©-Ú3§§„T   !€Ô’¬CÕã&•Cg,ëžÊí‰Ë`œR¡ÛÐBf<ï¡9´DK<ƒpJ†nCs “ÉxÉX'&Cn2Ö),Í- 6·û€–,åC·¡9‡Õæ|oÐ\5›ÀmÖjK¸GHuÍ2tZZ0mi÷ ɬYn³–F[úý@<µ˜°mEølˆö€èi±aÛŠ°Ú œ²ƒ TFm  9 P¨÷ÿ¦4iÆžÁYIEND®B`‚bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/screenshots/bustle-statistics.png000066400000000000000000004165351525300766700303600ustar00rootroot00000000000000‰PNG  IHDR&Ø ãólsBIT|dˆtEXtSoftwaregnome-screenshotï¿>&tEXtCreation Timesáb 25 nov 2023 12:38:31×®Œ IDATxœìÝy\TåþðÏ0þ(ˆ¬.ˆk®¨]T4ÜZP+Ê[V¨Y˜¶šÛMÛ´4Å¥_×}©Ü®•Yš™»(ྥåЦ ¨ˆìË,¿?pN3Ãì ÌŸ÷ë5¯™9ç9ç<çœy`žï< @DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDõ–ÈÚ¨‡xM‰ˆˆˆˆˆê7…µ3PŸ°m^'""""""2ƒ°Â­Ž×ƒˆˆˆˆˆˆj5ôŠxC?""""""² 6PÑÐ*æ í|‰ˆˆˆˆˆ¨nj0�ІPQoçHDDDDDDõW½RÔçJ{}>7""""""jxêe€¢¾UÞëÛùiSo‚õ¥"o‹ça‹y"""""""óÙb0Àód’úPy®Ís¨׋ˆˆˆˆˆˆj^m êtp¢.W´k2ï¢Þ?5< Ôl¡N(êbå»&òlWû$""""""2D^û¬SŠº˜°T~Ù"‚ˆˆˆˆˆˆl�%[TÔ™àD]ªœW7¯"�çÚ<65LæϵyìZW*ÜÕÉ£¹ÁcÓ×…ëGDDDDDD5ÏØ €©ÁK)l:@aëksógj@ÂP:ŽAADDDDDDæ04†„© sƒ 6œ°åÀDu‚†¶Õ·^¤ã5‘¹:^ëK§k}½ NØjÅ»:ã@tÐ\nÎvDDDDDDDú BèZoLð¢:ãWØ [¬p›”05°PÁ[¼žDDDDDDdy– è R˜Ø07µÎÖ*ÒæR©¯%„¶eº–:Ž¡tDDDDDDDÕé¶aj€ÂÜÖ6œ°µJ¶)ù15(¡- ahÛêL1JDDDDDD¤80¶ë†¶…%ƒ LhajPÂÒ mA[º>DDDDDDTwikEaLËSu.8a+ïš JhNó©+@aN—ClåÚ‘eXr<C-)4ßkN;Zo‚¶Py®‰ „f:} SZSèKCDDDDDDdLë}­"ôm¯t¨Á [¨`›’ÍÚö¡/(¡+ a(ð ë¸DDDDDDDújé +ð +alpBó¸ú4èÀ„¥ƒv:–�0¥Å‘1Œ *˜ �ëXi ±ZpÂÚnc�oÌŸú‚Æ$ô�GÁDDDDDDd}¹–åÚæ'LéÒÑ Õm-aNPÂP@BWpÂ’ƒbQýcêTžr-¯uÍÜQ�à„Í·š°VÅÚ’A }�më4ÚZSè›­ƒÁ""""""ÒGßÔ Ú‚ Ê÷š c‚ÆŒ9aÓÁ [LWBWPÂNK:Õg;-Ûê‡ÂNO>ˆˆˆˆˆˆˆô‘£j«mAåk}Á @{ }³z¨æÃ "0a©ÖÆ%L H¨ngíû$""""""2…f Aí-$Œ PT'8a³­&l90alPBu¹)A ;-ËU_«nÏÀ™C5¡Ú%CŽªAÍ@…1Á cfóPÍ‹1j50!©ÍƒÁ´Y8Œ]§-(¡m��F:eB_`Bu9‘©Tª‘–תۈ4^+×+_ÛiY-ïaä:sÒYDm&ªC[ÀAß³1A ±Æ³•×Äþá2;˜>ÆÇ$"""""ªßL©´ËU2¤¨¬g*.=|VTŸ•ûPÖ5Uºž�Z.T‡-&4»ih®Ó•^×xº‚¨%ì8îÙ³§OïÞ½_vtt|T$yˆD"¶– """"""³) ¹B¡È/++ûëСCÿ4hP2€2T)”A þ Xè NêAá‡Ô”P nØŒÚüuß”nÚºk˜2í§®nvø§%„Xe™Ëž={"£¢¢¦‹Åâ cOˆˆˆˆˆˆˆÈT2™,#!!aÖ Aƒ’ãŸî2üÓ²B[mãU†§U¥m™.µÀ°µÀ„¶VÊ÷ººkh›eCÛ˜ÊÖb¨'\îß¿ÿEãÆ�Ÿ1ñ|ˆˆˆˆˆˆˆÌ–——·ÕÓÓó#T'TƒÊךdj* g ;0-˵i°� SƒšiTµT¾×”(**ZîââÒÛ¤3!""""""²€âââC®®®oBpBuÖÍÙ:´( e¹*c[MÔJ`¢¶ÆO¨Éˆæ˜šƒdª¶–PôÒ977wƒDDDDDDd-...½sssgp†ú�ªuXÍz®�ÆûšR+�li`GC^êj--ïµuáPcÂ~×®]‘žžžÃ,“u"""""""óxzzÛµkW$ÔgˆÔ¬Ïj Hh«ëŸQ“ÍÌ(Y[1· >¸¥j:]ƒ]ê7QõA/%\+**vH$’@ÓNƒˆˆH¿’’”••A*•Z;+T$ áììlí¬Q=#•JoÚÛÛ? •³s¨‚©|¯Ù�CÛ`˜Úºs(·Qe3Ý9l¥Å„®À…¶üéƒBõ½j4Iù^ @²cÇŽÞ J‘%Éd2äå塨¨ˆA‰zL*•¢¨¨yyy�ÉdÖÎÕ#‰$pÇŽ½Qùcº²K‡æ�ï†z@Ë{åöÚØD«‰ÚÈDufãÐ×ZBõ½¶ÖÊÊÖÊ›ëRPP°ÜÍÍ­—i§ADD¤[^^ ŒD"AãÆ�­� ""ªG »»»«„)…ú ˜2èn5ahLÍV63;‡­´˜0–fdÈÐ2Í)CEÄ...ík2“DDÔ°”””0(ÑI¥R”””X;DDT�<¬«ª¶–Ðü!Þ˜z°æk›gË� SZZh.S¶”PRüR$yT?{DDD•ÊÊʬ�²Þ{""²¤‡uUÍÁ/•T¬²©1»¯vkˆÄÚ€é#„šÒŸF³µ„€�H$²å€ Õ1l-ÑpñÞÕ2™ eee¨¨¨€T*…BQÙ«A$A"‘ÀÞÞŽŽŽ‹ÅÕ>ÖúªÖz,*»qºëÀ •÷Úº^˜º¼ÖÔt`”ˆŒ¡´ú‚ ÚÑܯ¶éUˆˆˆˆˆˆˆª�Éd(..ÖÙ:N¡P ¢¢(..†££#\\\, P Lú빀´ÏÆ¡ºc5¼°…Ú꣯5…®2õ/ˆˆˆˆˆˆˆ¥¥¥(,,4i›²²2”••ÁÍÍ NNNÕ9¼®:¬æ2c[?¨.³zëml50a cª­$ôõÇ!""²y_ý5öìÙƒ&Mš K—.ˆŽŽFóæÍ­�-""¢z¥¸¸ÅÅÅfo_XX¹\sw¡Y‡•ø)Am2è` k& �#¡íYW´H³޶~9úŽIDDdÓÒÓÓáìì ±XŒmÛ¶aÛ¶mˆŽŽÆøñãaoooíì‘�»|ù2<ˆóçÏãÆ�ÈË˃H$‚»»;š5k†öíÛ£oß¾hÛ¶­µ³JDd5¥¥¥Õ J(ÃÎÎÎÜ–úê¼ •õÚºj¨®W¾Öö¬í˜V jX;0a,ˆˆH«¬¬,€ŸŸŸ•sR;BBB°`Áäää`ÅŠøí·ßpóæMÌž=»N'rrr¾¾¾VÎIý"—˱k×.¬Y³×®]Óš¦°°·oßÆÑ£G±zõj4oÞ£F�“O> ;;ó‡æjhe“ˆê>™Lfr÷ } aooo‘A1«¡N´¢¨É ¿©Ó•èjü3`¥¶¾6šÝ5„iA>Û?|-yøÜH¡P1ýtˆˆl×Ë/¿ŒÔÔÔ*ËÅb1Ž?n…ÕŽââb 8°wïÞê4™¬–»wïZt.\@óæÍ«œÏŽ;O=õ”°lË–-X²d † †wÞyGï~ß|óM¤¥¥¨IÜÇÇ���xâ‰'eÑsÐ¥¬¬ R©...‰*ÿÍã…^lÞ¼ÎÎε’Kyä‘G¬��âââpæÌ€‡‡ €^½z¡mÛ¶B¾ïÞ½‹””:tûöíC~~> k×®X¹r¥Î}cÆ Ø·o233áêꊖ-[bôèÑèСƒM”M""SX|hGGG¸»»›´�H$Šð•³pH>W ²u„ìá³âá³òµ®ðO« …ʳBc™æk]j$ÈQWZL˜‹--ˆÈ¦=÷Üsøå—_,¶¿>}úÀÁÁAx_�_;ë'''„†† ¯ëƒëׯãý÷ßÇäÉ“1hÐ ¼ûî»xöÙgñøã�«$”ž}öYdffbÛ¶m2dš5kfðýúõƒH$Bff&Î�;‡3gÎ 113f̨�3R7þ|8p+V¬@Ë–-TÞ;e¾k< É�7T(bccÕʉ2áëë ___DFFâƒ>Àºuë°råJa[mär9&Nœˆ“'OÂËË �;wFVVNŸ>�W_}µ^–M"ªß”S‚ZZYY™¥fê¨×uÛú˜¨×7‰ˆê¯ôôtµ÷Õ T|üñÇðòòªn¶ê ;;;¬]»ÖÚÙ°¨mÛ¶ÁÉÉ €aÆaÖ¬Y8rä&L˜ õ—çQ£FaçÎ�øý÷ßñÖ[o<Æ„ àêê HMMÅ'Ÿ|‚Çc÷îݸzõªÎ_ô/;;“'O†»»;ž{î9”••!''Ǧ*7YYYèÕ«—ڲɓ'ãÍ7ßDFF>üðCüðÃU¶ Æ0•²u†©Ÿ»={öÇ …ƒƒŽ;†àà`´k×çÎ�æM›ààà€Q£F!22RLôêÕ ­ZµÒ¹ïE‹á·ß~C‹-Ž#GŽ`úôéøê«¯ðè£� évìØ???àܹsX¿~=Ú´iƒž={";;Ÿ}öÜÜÜ�²²2ܽ{·Á%€‚ þù'àÔ©S³rüÕeÀ?� Õ묩}ûöprrÂ… ƒ�"::-Z´Ðš¾uëÖxõÕWT6—Þ¸q#D"ºté î—["ªû¤R©Þõ_~ù%&Mš„¿ÿþ“&M‚H$µk×àçç‡Ù³gWkßT7ÆÌßJDd“ž}öYlÙ²Åè  2½±ÕÞ � Xµj•P¸|ù2>Œž={ ‘ÿÒÒRìß¿7oÞöçç燵k×B"‘àÓO?Åï¿ÿnt~ Cõ†Í›7ÃÁÁß~û-–.]ŠÓ§O£wïÞÈÉÉÁ–-[Œ~øAm S�—™™ ©TŠ.]ºàí·ß†Db{ÿµý‚íîîŽO>ùÓ§OG»ví,~L¸¸¸ ¸¸Øä/Oš�‚ÿýïÂëÛ·o#66'NœÀ¨Q£Ð§O<þøã8pàbcc…1&4ݹs¿ÿþ;š5k†¥K—B"‘`ÇŽX¸p!6mÚT¥ÂüÝwßÁÞÞÿûßÿðÝwßáܹsèÙ³'222 •Jñè£�b̘16y¿kZ»ví ‹qåÊ«ô222ª|ÞJKKqåʈÅb½Ó†úúú⫯¾Âÿýßÿ!55ë֭Æ 0pà@Lš4 žžžjé;uê„N�:€Ðºê¥—^B—.]êE¹%¢ºO¡ÐßPÀÇÇóçÏ‚@åßÂyóæœ}Èо-@³¥C�ëÞakÙ-d`°‚ˆl’¶J§%ÓïÙ³G玎ŽBP¨dŽ?Žððpµ´ùùùÂL=zô*}ûö5)0aèJ�7Ê~íyyy€´´4Èd2üë_ÿÒ”0æxmÚ´�‡‡пDDD`ôèÑB [àçç§5pÕºuklÞ¼YçvéééB³wS•••¡¤¤þþþ&Uú« RSSñË/¿àÂ… ÈÏχB¡P»×Ƹvíär9ÂÃÃ…ü<þøãX¸pa•5j$L“ª ÚrrrB«V­�’’‚””tíÚUX§­+ÇÅ‹!“Éжm[ƒ³£tïÞ6lÀÑ£G±sçN$$$]sfÍš¥u›«W¯båÊ• ÆC©å–ˆ{{{µï"¿›ÔKÖ™m&xak� "¢zMÙ}C³/¢®÷–gB³’¡¸©G�˜:uªÚº¦M› }È•ƒ$ê#—˵.7t m4+ÆÊùÄ�ùµÁÐñðã�?bãÆ�8pàöîÝ‹ýû÷cÍš55ÒÁ�;wÆîÝ»QTTdÔµ*§7ûã�?ðôÓO›uÌ?þø …¢J3|]÷UIs¶…¬¬,Lœ8¾¾¾˜8q"BBB0|øp“óSZZ  ²É¿Ryy9D"‘Þ4Gþõ¯aÉ’%xþùçÕÒL�:mÚ´AVVd2>øàƒûíÔ©FŒ‰D‚ýû÷#44}ûöUK3lØ0 0·o߯Î�;u¶Äøè£�0dÈ”””àĉÂÔ¥���FŸgEE<==‘��€ü"‘o½õzôèaô>ꃀ€“ιG�Ç+ Áˆ#àáá�””dff¢}ûö˜3g†Z%ý™3g„–37nÄš5k°fÍ,_¾\­Ë†——–/_.LYnî¾ÍPïêÉ5™9CûÖ6»†Hc��–÷"�ôv¯•ñÃgÉÃ×ÊçF …∉çBDD¨¬ÐN™2qqq&U„ë;å@¡–TQQ�åË—ã·ß~ƒ½½=ºuë†ÀÀ@ÈårdffâÌ™3(//ÇСC1vìXk ¾E=òÈ#ÖÎY@AAÊÊÊ,ºOGGG“§©‰D��ª<˾–«<ª¯¡² *Ë4ß«¦‡Æ:]jdÀLkuå°éh ‘µÙÛÛã�wÞÁ�!Cðûï¿ãìÙ³8{ö,d2üýýñÔSO!::Z��ˆˆˆªÇÅÅÅâ� Õišë«ÌÖQ×ǘ`€ƒˆˆêµfÍš Ó*QÍ‹ÅpssÓ;@³)ÜÜܪÌUƒljúOSÕÔ Q�âääd‘V...z§¸®Ãj¤®_SSÇ—P.3uŒ Õñ%8ÆYEMŒ1Auǘ "ªJKKÍn9áææV­ „™cL¨Ž3˜?Æt,3e½ÉêzW"""""""‹rrr‚½½=Š‹‹�wÂÑÑ...µÙ}£Þ``‚ˆˆˆˆˆˆHƒX,†»»»0(fEE¤R©0å¹H$‚D"�½½=�¨&ˆˆˆªI"‘@*•Z;d ¿JÕwb±¸.ήQ§ÔÔà—DDD †£££µ³@VÂ{ODDT} LU“³³39o€$ œ��­� ""¢:�� """ pwwgp¢‘H$pww·v6ˆˆˆê~ƒ"""²±XŒÆ�£¤¤eees¢ž’H$pttdK """ b`‚ˆˆÈ‚œ��Yi%"""2»r‘Õ00ADDDDDDDVÃÀY DDDDDDDd5 L‘Õ00ADDDD€7nX; TÃx�ë>ÞCª�˜ """""""«a`‚ˆˆˆˆˆˆˆ¬†� """""""²&ˆˆˆˆˆˆˆÈj˜ """""""«a`‚ˆˆˆˆˆˆˆ¬†� """""""²&ˆˆˆˆˆˆˆÈj$Ö΀­¹{÷.œ��áêêªu�““ÜÜÜLÚ§L&Ãýû÷áîîGGG³óVVV†‚‚xyyÁÎŽ1%"""ª=¹¹¹�ËåZ×=òÈ#9†¥¾3Qõ) B.—ÃÍÍ b±XgZÍûÆûh]5QŸ!ªi L¨�ËåHJJ‚‡‡ú÷ï‘H$¬ËÉÉÁ¡C‡Ð²eKtêÔɤý–––")) ááá6;9998yò$žxâ ¸¸¸˜½""""S;v ¥¥¥U–‹Åb¥Þ,E IDAT 6Ì"ǰÔw&2Ÿ\.Gjj*._¾ ™L�H$ˆŠŠÒY™Õ¼o¼�ÖSSõ¢šÆÀ„ùùù¸uë„e©©©Fo¿wï^øúú²ÀQ½…B�û÷ïãØ±cèÞ½»Ñ-%øÝ¨î8þ<®]»†Ö­[£iÓ¦�ÉdÈÏÏç/ìuLuë3Dµ�� RRR„‚œ››‹{÷îiMWVV†ââb¸»»C"‘ ??P(¸{÷.¼½½ÕÒ—”” ¢¢jË¥R) áââµu¥¥¥(//‡B¡°àÏÉÉ P\\ ppp€³³³Zmßg´}7‰D�Éd(,,„H$‚››»©Ú€¢¢"\½zaaahÛ¶­°\õû¬¹÷M¡PŸC]C”.]º„K—.µÿ¶mÛªå™Ì¯ÏÚï³²‹Î#�<¢³NCd.&´ Azz:nß¾�¦M›"55���ÈÎÎVK÷×_!-- @e·îÝ»ãÚµk€ÂÂB:tO=õ”�þÔ©SÂë   tïÞ�––†óçÏC.—C$¡uëÖh×®�pŒ+W®ÔèùU—®ï3çÏŸ þݨ  ‡†T*¸ºº¢OŸ>ÖÌ>ÈË˃B¡€ŸŸŸÖõ÷îÝ3뾕––"99‰D°··Gtt´Áí”�CÁ %ªªN}ÆÞÞ^ë}V(HJJ‚££#ÊÊÊèÙ³gížÕK Mkááá???¤¤¤ ??YYY SK“���+W® uëÖxüñÇáîîŽóçÏ#""NNNhÖ¬žyæµÖnnn8p üýý‘‘‘�¢¢"äåå᯿þB³fÍ0pà@ %%÷ïßǽ{÷påÊ´hуF£F�jûR¤ïûŒ¶ïFžžžèÓ§¢££Ñ§O ?î�õ(ÇÑÕšÁÜû–••…‚‚ôëׯ Cÿþý�Γ¡ ƒÚU§>cè>;;;càÀ� Dff&ŠŠŠjûô¨b‹ Z·n�ƒâСCðóó«ÒL)??pûömÜ»wb±Øà€”mÚ´�»»;‚‚‚pëÖ-”••!77 …­Zµ‚««+Z·n�›7oâþýûÂÈ×Êuaaa8yòdÍœ0‘™îÞ½«óûŒ§§g•ô …ׯ_GVV–0kCyyymg›4(Ç‘¸ÿ>7n\e½¹÷ÍÛÛNNNHJJ‚——š7oŽ   £óÕ¶m[ˆÅb¡õ�êr%t3·>cè>·hÑîîî ÄÍ›7QZZªu"S00¡ƒ——|||pçδjÕªÊze¢]»vhÚ´i•õúƃPí‹§ìÇUPPWWW”””¨ìÇ©üPXXWWWadd""""[¢ïûŒ’êw£ëׯãï¿ÿÆàÁƒáêêŠ_~ùEmWË:”„””øøøTðÒÔû¦|ïîîŽ'žxwîÜAzz:Nž< 777­A+]”¿ö+ƒ Jfn}æêÕ«zï³Ç…!Kb`B�.]ºàÁƒZGœnÚ´)ÜÝÝqúôi´lÙ2™ ®®®hÞ¼9ÜÜÜ�••…””´hÑBï1üýýqþüyœ:u ~~~ÈÎΆ»»;üüüP^^‰D‚“'O¢iÓ¦¸qãFM�*‘Ùô}ŸP廑²BsñâEµÊ�££#$ nÞ¼ OOO¬WË$ ºté‚“'O"!!ÞÞÞ‹ÅÈÏÏGTT”Ñ÷ÍÅÅEí}ii)®]»†F�¡¢¢BgÂTaaaÂu JÇœúŒ®ûLT“ ‡k‘ëE*Ëõ=k¾Öõ°SyV}8}öÙgc´eJ¡PàÞ½{ðññ�‡‡Ôþ!æææÂÓÓ^^^‰D ‚\.G^^ìììиqc¸»»ÃÛÛ¥¥¥(..†§§'ìíí‘——‡&MšÀÍÍ ååå(..F@@\\\©TŠÒÒRøùù¡[·n�H$�H$hÒ¤ ÊËË!‰Ð©S'””” 00Pøe‚ˆˆˆÈR Êw#___8::¢  nnnðõõ…““|||àêêŠÂÂB8;;ÃÝݽÆÏ¹¡1t�ÝÝÝ‘H„ŠŠ ˆÅb4mÚžžžðôô4ê¾5jÔHí½‹‹ ÊËËñàÁˆÅbtèÐ^^^fåßÇÇ>>>æž~½ ïZ¢> õ>7nܸJ�¦¨¨þþþB—²Œ3f|  €€\ãYó¡ÊÔ÷6ÃP¡¦ökl`ÂNË{Õ4v¨ŒP>ÄŸ%_+Ÿ)Š#&œ QƒpãÆ „„„X;Tƒx�ë>ÞÃúO$Ex@@ªò,øZ®òP R(ßCå=T–i¾×Ü€Že¦¬7Ûæ‘Õ00ADDDDDDDVÃÀY DDDDDDDd5 L‘Õ00ADDDDDDDVÃÀY DDDDDDDd5 L‘Õ00ADDDDDDDV#±v¬!##r¹ÜÚÙ """²97nܰv¨†ñ×}¼‡õ—�]Ãl;Ð AAAÖΑ͹qãBBB¬� ªA¼Çuï!ÕG 3CDDDDDDD6¡A¶˜ """""ur90|îa\¾–(ô$a-‚±ij/4ÐVçDda L†Ï=Œ«9åp é ˆôG®ÝÇ[«/bY\»ZÊÕgŒq._K‡½w¨Á Ø9{âL¶s-䊈&ˆˆˆ¨NÉÊÊBVV–µ³a ùÜ©(`TPBHnçPsy!¢…� "ª7är9æÍ›‡þýû#&&×®]«µc———#<<7oÞ¬ö¾bccñ믿ê/¾ø" í�¬SSSŽ3gÎX<ÏÖV\\Œ•+WbøðáèÕ« „qãÆáĉFm_ZZŠÂÂBµi¹ ŽÿûßUÒùå—7zÿÅÅň‰‰ALL Š‹‹u^~ùe„‡‡#<<=zôÀСC1sæLܹsǨcY“¶sÒvîµéÌ™3ÂõÔ|L˜0 •JñÓO?áµ×^CTTˆ?üÙÙÙjû*--ÅüùóñÔSOáÉ'ŸÄ矮õo„\.Ç–-[0hÐ £>#.\Àûï¿�ÁƒcÀ€˜>}:rssMNC¶­¨¨‹-ÂóÏ?�ÈÈHÄÄÄ`çÎ�:ÓÏž=“&MªÅZ—±Ÿq}å˘ò®ÉÒåŸ&ˆ¨Þøõ×_qêÔ)üøã�Xµj‚ƒƒ­�%‹ûæ›oðùçŸ[;&³…|_ºt qqq˜7o222 ¦OKKCrr²Öuß}÷�¥³gär9&Nœˆ•+W"//�;w†»»;NŸ> ©TjÔ>>ÿüsôë×iii5’G'''„††"44NNNF322½{÷Fii)¶mÛ†qãÆ¡¼¼¼Fòg)ÚÎI۹צÎ�;ãàÁƒj�„„xyyaðàÁ;;;¤¥¥aìØ±øá‡0cÆ áƒ>PÛ×_|�ÌÌL,[¶ ñññ¸rå &Ož¬–æøñã1b6lØ`Tà@*•bæÌ™0`V¯^�ùóç#-- 3fÌ0) Ù>‘Hooo,_¾{÷îÅøñã1wî\\¹r¥JÚ‹/b÷îÝVÈ¥uû7T¾Œ)ïš,Yþ©ááà—DTo¤§§£]»vxä‘G¬�²AÛ¶mCÿþýñì³Ïâý÷ß7˜ÞÝÝkÖ¬Add¤Úòôôtœ9s®®®5•U«IIIÁÉ“'ŽeË–A$JJJàèèhåÜU²³³ÃÚµkMÚæÓO?E£F�PXXˆQ£Fáúõë8xð  TC¹¬朻¥�ïææ¦¶ìÈ‘#€þýû i>üðCa½¯¯/:t耨¨(Ü»wÞÞÞÈÍÍÅÞ½{±gÏ4jÔ°`ÁDGGãòåË ƒB¡À† 0bÄDGGu¯$ ¾ÿþ{Ø=œ&"((&LÀ{gòòr888•†lŸ‹‹ FŒ!¼ïß¿?öíÛ‡‹/¢U«VÂr¹\Ž… "66—.]²FVk�1ŸqcÊ—1å]Û6–(ÿÔ010AD5N.—cíڵؾ};rssÑ©S'L™2þþþ*».¼òÊ+ؾ};Î�;‡øøxôìÙ2™ Ë–-î]» P(…ääd,^¼���jǘ={6~ùåÀŽ;вeKlܸQç¾+**°téRìÝ»eeeèׯ&L˜0¸^&“aùò娵kd2z÷î­–CÛ9rË—/ǵk×ðÈ#�`À€xûí·«\»ÂÂB¼öÚk8p ñÍ7ßöíÛ‡çž{S§N5êúFGGcß¾}HMME³fÍ0uêT´k§}$u]yûðÃáììŒO>ùDH»víZüùçŸX°`�ÎíÖ­[§5߆®Qll,úöí‹£G�âÊ•+Ƈ~ˆ?ÿü[·nÅíÛ·Ž�>úžžžïËÔ©SõP5<ûì³Ø¶mΜ9ƒ®]»ª�ó‹/¾ˆüQí~/Z´ÉÉÉÈÉÉ�ŸŸÆŒƒ§žzJH‹~ýúáØ±cHMME@@¦L™‚Î�;µ½¡ò`ÌõÔVT)›Û–”” ¢¢B¨¤9;ÿ3À]II –,Y‚¤¤$ k×®˜8q"üýý1}útá—É#F@,ãøñã&]÷ÈÈH 4ÎÎÎ8pàÊË˃±cǪ¥qppÀ¾}ûL:¦››žzê),]ºׯ_ölݺþþþX½z5är9Ö¬Yƒ�;w";;Í›7G\\zõ꥖�áÇ#//ÉÉÉpssÃ+¯¼‚gŸ}Ö¨ë¥ëøMš4ÑyNªçnÌþ“““±zõjüý÷ßpuuEóæÍ1gÎxxx˜t_tÙ´ižyæØÛÛëLsïÞ=¸¸¸ÇLOOG£F�„J øøø cÇŽ8tè ‰°hÑ"“óc§1w¥——är¹Z—cÒ¨2ço‘±ã©úJJJpòäIœùä¡2Ó¸qcÀˆ#ðè£� ëòóó±uëV¼öÚkVÌ¡m0¦¢¯¼k²tùgl˜ ¢U^^Ž 6`Ú´i E@@€ÐçPõËû°að°0899¡¬¬ ?ýô¦OŸŽ°°0aúôéfåAsßEEEغu+&Nœ///øúúâÍ7ßÄÁƒÀàúòòrlÚ´IgÞ mçÎTTT wïÞððð@Ë–-«´^P(ˆ��Gqq±Z s¯ïG}„Î�;Ã××&L€§§'öìÙSeúòÖ«W/”””àÂ… €ÜÜ\¤¦¦"22Ò¨sReè•_^¦OŸŽvíÚÁËË ¯¾ú*`̘1Fpp0†гgÏu_Ì1|øpüõ×_HIIlذC‡ÕZ±{á…вeK`ôèÑhÚ´©p­TϧC‡ðòò¨Q£pïÞ=a¼ }Û*Æ\O jYÐäë닯¾ú ­[·ÆíÛ·±nÝ:¼øâ‹˜>}:îß¿�Ë—/ãðáÃèÞ½;æÏŸ�3f oß¾HMMÅÍ›7%ô=Ž‹‹Ã믿nöµß¼y3–-[†7ß|púôi­éŒ=¦\.GJJ ¶lÙ‰D‚ððpµõ«V­ÂÏ?ÿŒ)S¦ ;;¿üò Z¶l‰õë×cîܹBóäõë×WÙ÷Æ�1gΡ¬*V5t½tߨs2´ÿëׯC*•¢K—.xûí·1uêT,X°@ë¾Ì±yófôîÝMš4©²n÷î݈ŒŒÄë¯¿Ž›7oªõaFhh(¾øâ ܽ{¹¹¹˜7o‚‚‚ðàÁ‹å¯´´kÖ¬Á+¯¼R­4¦þ-2õï!™oÊ”)HNNÆŠ+pîÜ9µ@êâÅ‹1vìX›é†f-Æ|Æ�¡¯¼k²tùglØ•ƒˆjTff&¤R)Ú´i#,svvÆ£�>*4¥€Ž;VÙN&“©m§Ù4ÑXšû¾qãär9ÆŒ#ô¡—J¥(**2jýÍ›7õæÍÐöÍ›7Gxx8†Ž>}ú`ذaèÑ£‡Z·mÛ†?ÿü»wïÖÛçÙØë«Ì‡2¯;vTû5^I_Þ‰äädtèÐIIIxì±Ç„æá†ÎI•¡k¤íº¶hÑ@åÌ^^^B~•³º/æpssà /¼€5kÖ`Ú´iؾ}»ZUyyyعs'Ξ=‹‚‚ܼy³Ê(ãªùñ÷÷‡³³³�}Û*Æ^OͲ M÷îݱaÃ=z;wîDBB‚Э oß¾*MÓ¬ØçççÜ·®YNõÏhãÆ�…Ï}‡T^s©¶@‹Å˜0a‚Úà¸ŽŽŽèÒ¥‹ð>-- r¹�=ö$’ʯJƒ Â_|Q¥IPP�ðK`¿~ý@({ÊgC×KóøÆ2´ÿ6mÚÀÃà èß¿?"""0zôh‹ôá.//ÇÖ­[1gέëŸ|òI<ñĸsç¶oߎyóæÁ××ýúõƒ��âãã1{öl<÷ÜsðôôÄÈ‘#À¢ƒzΙ3M›6UëeNÀ´¿E¦þ=¤êqpp@·nÝðàÁ,X°K–,ÁÅ‹QXXˆˆˆkgÏêŒýŒëc¨¼kª‰òÏ2Xÿ10AD5ª¼¼r¹2™L퟊ƒƒƒÞ ·T*úCV·r©ÉÝÝ@å¯ßª}�]_QQ¡7o†¶·³³ÃÒ¥KqúôiüöÛo˜¶mÛ†œœ”––âôéÓpvvFãÆ�ÕòùØc�aìØ±øä“O„qš4i‚3gÎàöíÛ())1êú*33ºú,ÅÅÅaåÊ•jÍÿUyyy •î3&[Ù6´}u?sÆžûÑ£G‹'Ÿ|cÇŽÅ«¯¾Š &¨Ã××Ï<ó òóó1zôh¬\¹³fÍ´iÓ„ý)§êSÒ©¬Ø¿óÎ;°³³ÃܹsñÚk¯aâĉx饗P\\Œ)S¦˜ý…Wß1ÍÕ²eKDDD 33¯¼ò >þøcÌ�;3fL•ô/½ô>úè#Ì™3"‘HèÿlÌõªÎ9ÚÿÕ«Wñâ‹/bÁ‚X¾|9öïßzƒÂÆ8þ<®_¿Žèèè*ëÒÓÓ1{öl=z·nÝBFF6lØ€ÄÄDµ¦ä›6m™3g�••…ÄÄDŒ?¯¿þº0¢¾±4ËnRR>ùä|úé§hÕªJJJ„YfLISÆþ�'ó9::"55cÆŒA¿~ý0sæLDDDèmaØ�Xò3®¯¼êe°¶Ë¿.,ƒu»rQ�›|ÿþ÷¿Ñ­[7|õÕW¯¯›› „9sæàîÝ»èØ±#V¬X{{û*×ј¼ 8'NÄÌ™3…e†¶Ó–oCר†î‹6Æ|–5j¤6e¨¦fÍšáÝwßÅŠ+°téRDDDàñÇ7:߯l¯¯<†?³Æœ{HHFŒ�ãÇ�#%%b±í۷Lj#0`À•å¹I“&عs'Ö­[‡   ´k×Nè¢1|øp\¾|IIIغu+úöí‹¶mÛ¢sçÎøæ›o°lÙ2\¾|hÛ¶-Þxã ½×ÖºŽY_~ù¥0…ëáÇѡC¼÷Þ{U‚Shß¾=Ž9‚€€Œ7N0|½ª{Núö_QQ///ìÚµ EEEðóóäI“ªý‹ñO?ý„'Ÿ|RLªrssC£F�ðõ×_ãÖ­[ppp@Û¶m±dÉ¡µIYYþüóO¬^½ååå Ä ªŒš?uêT!˜@¨t<³fÍÒZv?ýôSÈårL™2Em_cÆŒÁ¸qãŒNS¦ü�'óaÆŒF§�ŠŠjP³2ó7T¾”ô•wÍ2hÉò_,ƒu“ù?OTo¿ÚÖ‹T–+Ÿí´¼WMc§²�ò½ò!~ø,yøZùÜH¡P1á\ˆÈFÜ»wO<ñ>Ì.&ˆ��ELL † f‘ý¥§§cøðáØ·oŸÖ/*T;X¬/22ÞÞÞØ²e‹µ³b17nÜ@HHˆµ³A5Hß=îøú÷pj©u�.'¦X"[d–ÓúO$Ex@@ªò,øZ®òP¨<”ï¡ò*Ë4ß+T^«Ò=ZµqëMÆ®DTg¤¦¦"00�•0+;ˆÔÈ IDATxð zôèÁ „•±<‘ʼn(ä“ ÉåÕë6ED¤ÄÀÙ¬ëׯ#11………¸qã/^,ôÝ&ëÙ³g�IÝÈ2Xˆ¨¦…µFŽ4£‚ò’ûèÚ¤¤rED ǘ "›UPP€o¿ýÓ§OG“&Mƒçž{ÎÚÙjÐ222pùòeôíÛ×ÚYipXˆ¨¦mšÚ ÃçÆåk‡ô7ÔU1–¼Þ«ÖòFDõǘ """"ì»Þð×}¼‡õǘ """""""ªE ²+GFFärãö!"""j(nܸaí,P ã=®ûxë/å4à Mƒ LY; DDDD6‡MÄë?Þãº�÷�꣆Ž!"""""""›Ð [L‘:¹gåH×>´ÝÃÙ86Mí…ÚÚœˆjDDDDD„ásãjN9œBz"푇ëE÷ñÖê‹X×®–sGDõc�DDDDD„Ë×Òaïª3(vΞ8“í\‹¹"¢†€� """²ˆ¬¬,deeY;WçU_¯Õ1 è JÉìj>/DÔ °+Qt÷î]¬\¹ÇŽý{÷àåå….]º`Ò¤Iððð@ll,bbb0lØ0³ö¯¹½¡ýMŸ>ÞÞÞøàƒŒÚyy9är9œœœÌÊŸ-0å’““ñ믿âêÕ«ÈÉÉ�··7ºté‚1cÆ 88ب㕖–B*•ÂÅÅEm*±—_~©©©Â{„……!..]»v5ýÄÌT\\Œ˜˜ÀÞ½{áââbñc¬]»‹-|õÕWèÓ§�Å�‘‘‘pvvÆîÝ»-~^Úîcm\;K¹páV­Z…K—.A&“¡gÏž˜8q"¼¼¼ÔÒÉårüúë¯X¶l¾øâ ôèÑCm}ii)/^Œ„„( DDD`òäÉjåɘ4š***°bÅ ìÞ½yyy Å[o½…ððpµt<Àÿû_œ={999hÞ¼9âââлwo \%ªiEEEøöÛo‘˜˜ˆœœøøøàõ×_Ç“O>)¤‘J¥X¸p!<ÄÆÆbèСVÌuí8sæ âââ´®ëÓ§¾úê+H¥RlÙ²;wîÄõë×!‹Ž÷ßMš4Ѻ­1Û˜³_"%¶˜ "ªcÊËËñÖ[o¡¼¼ÿ÷ÿ‡ß~û óæÍC›6màææfíìå›o¾ÁçŸnílT‹1ç P(ðé§Ÿb„ 8zô(<<<Э[78;;cÇŽ‹ÅFïóÏ?G¿~ý�––¦uýã�?ŽþýûÃÁÁ§N�Â;#k×®™tNÕáää„ÐÐP„††ÖXÀiÏž=ÂëÔÈ14Yú¼´ÝÇÚ¸v– •J1sæL 0«W¯Æüùó‘––†3f¨¥;~ü8FŒ� 6 77Wë¾¾øâ dffbÙ²eˆ��Ç•+W0yòd“ÓhZ±b’““1sæL¬_¿�:u„ pçÎ!Mnn.^yå8::âóÏ?ÇúõëñüóÏW ®�í‰DðööÆòå˱wï^Œ?sçÎÅ•+W„4ñññÈËËÃO?ý„Ù³gcÑ¢E8|ø°s];:wª=àåå…Áƒììì�––†±cÇâ‡~ÀŒ3PTT¤÷Çc¶1g¿DJl1ADTÇ\ºt 7oÞÄÆ�…Š­——Ú´ic圑¦Ÿþ¿ÿþ;ºvíŠY³fÁÇÇGX———‡Æ�[ìX}ô5j¹\Ž·ß~'NœÀÁƒÑ¢E ‹C;;;¬]»¶ÆöŸ‘‘�ÔÔTÄÄÄ`×®]HLL„L&3)¸cŽš>¯Ú:†%H$|ÿý÷BK�   L˜0ï½÷ÊËËáàà…B� 6`ĈˆŽŽÆ Aƒªì'77{÷îÅž={ШQ#À‚ �Ë—/#,,̨4Ú$''ãßÿþ7ºtéxÿý÷‘��€K—. åoÍš5Ç”)S„íš5kf±ëD5ÏÅÅ#FŒÞ÷ïßûöíÃÅ‹ѪU+Ü¿»víÂöíÛáêꊰ°0Œ=7nD¯^½¬˜óšgggWåGŠ#Gލ¼NÊ4~ø¡°Þ××:t@TTîÝ»ooo­û5´�9û%Rb`‚ˆl†\.ÇÚµk±}ûväææ¢S§N˜2e üýýTv'xå•W°}ûvœ;wñññèÙ³'d2–-[†]»vA¡P ** ÉÉÉX¼x1«ÇPúØØXôë×ÇŽCjj*ðÿìÝy\ÍÙãøñW«J’Œ,)“¥ÁØ…*¡˜!K&Æ(ci<�%Kƒ‰¥ø•%L–ÉÒ| ²WbŒÉ‡ùLÆ>¥Y&EÑrûýÑÜ÷·Ûzo!Ëy>=êÞ÷9ç}Îy¿Ïí¾Ïûœóöðð C‡JçÓÆÆ†sçÎqãÆ ÌÌ̘?>üñáááܽ{KKK¾ýö[êÔ©? âØ±c¼xñ[[[ÜÝÝKÒ�ŸŸÏ‹/¸{÷n©å“»|ù2‡âêÕ«%Ê Êþ*£¼:ܶm›7oàøñã 6Œ¹sç–y|+ªï³gϲ~ýznß¾Í|@ß¾}™:uª”��rüøq®]»Æ‡~ÈܹsiݺµÒõʾ}ûxôèíÚµÃÃÃãÇ�—Z†¢d2AAAÒ]Ù¢�@‰N‰ììl‰ŽŽ&33“N�:1kÖ,5j„§§'‘‘‘Œ5 Ο?_jÝ«««Ó¥K~ûí7rssyüø1ööö´mÛ–ü€U«VŠ¿¿?666X[[coo�®®.§N�"'''''&Mš$¥«lmmmŽ?®tœ¬¬,V­ZEtt4µjÕbÀ€lݺ…áÈÇŽ ¿X§§§sâÄ .^¼H—.]öïììLzz:111èëë3zôh†ªR˜âŠ—K&“‘#G¸ÿ>Íš5câĉ|ôÑGsîÜ9ÒÒÒ022¢oß¾L™2mmír�cYû8|ø0÷ïß—¦½¨R¦~cbbØ´iÿý75kÖÄÜÜœ+V```PfyË£^ì‘FFFÈd2d2Px'[>ݦ,wîÜ¡víÚR‡@½zõh×®gΜÁÂÂB©0¥122R˜Ú”™™IFF†BÇÃÁƒ+ÌcQ•ùL/ïsIx¹²³³¹pá.\�:+þüóOš7o®pž[YY±~ýúêÊfµÚ³gC† AKK«Ì0�=BOOO¥ÏeâTF´/ANLåá�±qãFNœ8���;vì@[[›É“'“››+…Y°`666Ó¾}{Ö®]˹sçXµjëׯ'==�äää2÷SQøôôt‚‚‚˜6mûöí£M›6Ì�;WÊGEùLOOgݺuÌœ9“}ûöaff†««+IIIøúú²}ûv’““ ”ö¹råJRSSÙ¶m?ýô)))e~qnÓ¦ Í›7ç믿fëÖ­¤¥¥•óÏ?ÿpàÀ¦N�ZjTÙ_e”W‡®®®Œ?Ο?¯pA_Úñ-¯¾322˜3gŽŽŽ:tìììòâëë‹››aaa´k×777233•ª‡mÛ¶Á’%Kصk  N�:å–A.55•ŒŒ Z¶l©ÔÜÚyóæ±gÏ,,,°¶¶&66–9sæ “É¤»\¶¶¶|ýõ×e¦sóæMiʃ*kL„‡‡…©©)ééésæÌ•èšîÂ… §^½z˜™™±~ýz²³³K¤sìØ1jÖ¬I§N�°¶¶JŸÎÂåË—éØ±#÷îÝcÙ²eDGG«¦<¾¾¾‘——G¯^½ÈÎÎFOO�5jƒ©©)}ûöE&“±}ûv©K•ã(߇¦¦&Ý»wçêÕ«LŸ>�ÿþ÷¿ áʫ߻wï2gÎRSS6l¶¶¶èêêVºS¢4—.]¢iÓ¦*MA144äÉ“'R;„Âi"ÿýï¥)Ê„)ͤI“8|ø0‹/fïÞ½L›6�©S§Jk¹ddd�™™‰––³fÍÂÆÆ†Áƒ³gÏž2ÓTõ3]™Ï%áåðõõÅÖÖ–™3g2jÔ(Ú¶m @ZZ|ð�BXccc²²²xúôiudµÚ¤¦¦ò믿JëØ%“ÉÈÊÊâÒ¥K,_¾œE‹•Ûy¡lUÒíK�‚ ¼rrrرc , yóæ˜˜˜Hs‹^0 <''',,,ÐÑÑáÅ‹„……áé鉅…¦¦¦xzz–¹eÂâééI›6m022bìØ±]j´µµÙ²e _|ñ¡¡¡ 4OOO®_¿.…©S§sçÎ¥mÛ¶%Ê êþ*£¼:,Oñã[Q}?xð€ÜÜ\zöì‰��Íš5“FCÈ}ûí·tèÐcccÜÝÝ©S§G�­°òóóÙ²e óçϧU«Vãàà€®®r�ÉKHH ¿ Ë`ii)ý|ùå—\¿~�ØØXºt邟Ÿ^^^ØØØpíÚ5’““±³³“æOœ8‘ &”Ø_Ÿ>}°´´däȑܸqƒQ£F)Œ&PÆÏ?ÿ̺uë˜d2Ÿ|ò‰T/ööö|ÿý÷%4-¯~[¶l‰��'Ož¤OŸ>XYYñÕW_•9 BU+V¬ aÆ|úé§*ÅSWWÇ××ooo† F�:u3f €4òB™0¥ñòò"--�Ý»w£¥¥Å† :t(ÁÁÁ4kÖL-bmm-uÜõéÓ‡¸¸8Ž;VæS9TùL777¯ðsIxy´µµéܹ3Ož<ÁßߟÀÀ@Œ��KŒ¬yøð!úúúoôSo^¶œœÂÃÃY±bE©Û @ÿþýyðà¬\¹cccés±²qTMW´/DÇ„ où£óóóþAikk—úå_.//Ošß¬Ì]UÃËÉ/\+›Ï²Ò¨U«;vìP˜O­ MMMììì°±±ÁÙÙ™ãÇ�—yÑ!ßgUöWEˬ¬Šê[]]�   âââ8xð sæÌÁÒҲܻÂèèèTXòá¾2™¬R ,𛛣®®ÎÕ«WIIIÁÄÄ„>}úЧOŸòýwíڵĴ�† *µ¿… âããÃçŸÎ�;w8{ö,VVVÒöâwË#¿®j˜ŠâȧÕ¬Y³ÜxòŽ  D§Å©S§JthÉÉ;™jÔ¨QfÚÊ„)J~^”6R#55•‰'Ò°aC.\HÓ¦M¥ª�OeÉÏÏ—Þ{ñâjjjåŽØ)^¿uêÔa÷îÝ„††rêÔ)Ž;Ɖ' ©òÆÐÐPΜ9£°¯*LLL¦³¸¹¹)\¸(¦¨¤¤$"""ˆŒŒ”Ù[¶l³fÍbÓ¦M,_¾\z_Þ‰#פI“*=±¡x¨ªŸKBÕéëëKÁ­[·æÆ�<~üXº¸=þ¼´ÎÒûâÈ‘#Ô©S§ÜÑsjjj3nÜ8®]»Fttt¹ÊÆ©LºåíON´¯w×û5–I„7–©©)jjj ó§e2W®\¡yóæeÆkܸq‰xåQ5üËÊgy6lHÍš5‰ŠŠªT|(¼Øþàƒ”º¸zû{òòò* £l}wîÜ™ï¾ûNá¹öPx‡lïÞ½ iÆÇÇÓ¬Y³ ëÁÄÄ™LÆ_ýU©2èéé1tèPrrrX¸p¡ÂZ 999 aÍÍÍÑÐÐàêÕ«Ô©S‡&MšH?ò/ùEgÑ9÷ÅihhHÃù׬YƒL&“.doß¾-í÷Ö­[e¦ñ:ÉçýÇÆÆJy»|ù²B˜Û·osûöm:uêÄï¿ÿ.ýȧ^œ—„ª»yó&¡¡¡Ü¿ŸÜÜ\âââ ’ÖŸ166¦wïÞ,_¾œgÏž‘””Ä�?þ¨ð$�÷AXXŸþ¹Ò7´µµU^ƒF™8•I·"¢}½{DÇ„ o===Y±bW®\áñãÇøùùaddÄ'Ÿ|Rn¼Ï>ûŒåË—ÏÇY³f�B¶mÛ¦tøW‘ÏòhjjâêêÊÚµk9þ<ùùùÜ¿Ÿ+W®”Z†ÿýïøùùqþüyRSS¹sçÁÁÁüõ×_ôíÛ÷¥ìÏÐÐ�””éâ¬øë¢ù©ŒúõësñâEîÞ½[êB‡rÕwFF --�çÏŸ‡®®®tA¨££C||<.\àÉ“'lܸ‘¬¬,ììì*¬‡ÚµkÓ»wo|||HLL$++‹èèhi8iie(^/Ó¦Mã£�>â�?þÀÉɉ‰'2sæL¤»·ÆÆÆ 2„ŒŒ ¾úê+6nÜȲeËX°`�”V‹-¤E[‹_Ëõë× nݺÅþýûÑÕÕ¥eË–dgg3fÌÜÜÜÊ|¢ÇëfaaAûöí¹sç...,X°€Ÿ~úI!Œ|!Où‡\Ó¦MiÔ¨))) ë«|ñÅ|ûí·¬X±555iβ²a yüø1ëÖ­+1ýè£�>¢S§N¤¦¦âââÂêÕ«ùæ›oøã�?¤9Üááá¬\¹WWW@q$ƒ2DZY³fXYY‘’’ÂèÑ£¥Ñ0ÚÚÚŒ?¾üJ-âÖ­[Œ9Ö¯_/�6©l'*@tt4‹-bñâÅ´hÑ‚ììl²³³)VÆž={¸xñ"÷îÝ#** 777&L˜ M�R6LÑ6×¢E ÌÌ̘7oñññ|H»víØ°aƒ´¾@Eõ°páBüýý™0a¹¹¹XXXТE ©ƒ«hüýýKÔKÍš5¥'~ÄÄÄpóæM455ùðÙ|[[[LMM:ý”=ŽË—/gíÚµÄÄÄK›6m˜>}ºJwõsss122âÈ‘#<{öŒ 0{öl…)>ªZ¼x12™ …÷Ç�Ï”)S˜;w®Â”ùÅ¢ƒƒË–-ãÅ‹üñÇlÚ´‰œœ,,,pwwWXY_™0Å?µ´´ $((ˆÙ³g“™™‰©©)'NdذaRµk×fÍš5¤¦¦¢­­M«V­ ”>K‹·/eâ(¦ªDûzwUþ[tÕÒ-m»Z‘÷å¿ÕKy]4Œz‘xò×ò�kþû·üwí‚‚‚³*”E„·Ì£G�èß¿?±±±Jý£R5¼ðöpuuÅÉɉÁƒWwV%íÝ»ooo.\¨òq³¶¶¦nݺìÛ·¯JaÞg‰‰‰Jwp o§òŽq» ;Ñ1/Ù XšßqUà ‚ðêÔ®]›/^°wï^ê֭ˈ#øæ›oª;[‚ð^Ú3·Î>±\¿}¦ô�Új…��z¼ö¼ ‚ðnkL‚ ‚ €˜»þ>Çøí'Žá»O¬1!‚ ‚ ‚ ‚ð½—S9’’’�É*^ØGAá}“˜˜XÝY^1qŒß~â¾»”}|ý»æ½ì˜055­î,‚ ‚ ¼qÄñwŸ8Æo?q …wÑûÙ#‚ ‚ ‚ Âá½1!‚ ‚ ‚"™ŒŸÊq§Ü§rì™Ûƒ÷t´¹ ¯ˆè˜AAgŸXn¥å Ó¤'¨•Þó�ðì¾Ùt…u[¿æÜ ‚ð.}�‚ ‚ ‚ pýö´ê6/³S@]·ïë¾Æ\ ‚ð>‚ ‚ ‚ Nß(§SB ¦®ýêó"Â{EtL‚ ¨(''‡çÏŸ+¼çêêÊþýû•Šïé鉥¥%–––|òÉ'8;;³sçN¥c|8§OŸæàÁƒ¸¸¸°~ýz¥:lllhÙ²e•ö-÷2ÊÿW–ãÇ�ãííÍ_ýUæEþë¢jÙìíí9sæ 999 ïçääK¿~ý^v_©›7oSê¶üñ¥ï¯øyù²Î­ª�ÉdÌš5‹�7’žžN‡¨U«qqqäååUkÞT±téRlmm¹yófuguuun޼ɤI“صk^^^<{öŒ™3g*„{üø1£G�¦F�,]º”íÛ·3|øpŒŒŒT ST^^?íÆ IDATK–,¡oß¾lÚ´ ???nÞ¼‰———ÊùÞ~\¸p///Nœ8Á„ X¸p!©©©@ág÷ôéÓ2dÇ�ÇÍÍ OOÏ7¢½çÏŸgÔ¨QìØ±£ÔÎeÚSi*j·¢ U!¿A¨ÚÚÚèë룯¯Ï AƒÈÌÌdË–-Œ7®Üxnnn¯)‡Ê“— C‡Ìš5‹I“&ñìÙ3jÖ¬Y͹SŽ­­-ÞÞÞ\¸p�=zHïÿúë¯ÒºõÛµÈ[­Zµ ÁÚÚZáý;wîpñâÅ—~\ÞÄóòêÕ«\¸pKKKÖ­[‡ššÙÙÙÔ¨Q£šs÷vRWWgþüùÒkcccÚ´iƒ���=¢nݺ„„„`ii‰‡‡‡öÃ?THK™0Eijj²sçNÔÿ}„©©)îîîLŸ>�œœ´µµ•Οðö300P¸ˆîß¿?;wî$>>žF�ñ矢©©‰½½=VVV 2„°°0…sä]TPPÀŽ;5j”ê (eÚSi*j·¢ U!:&AxkÈd2¶nÝJDD�?¦}ûöxxxШQ# pýèÑ£‰ˆˆàòåËøúúÒ­[7òóóY·nGŽ¡  ;;;bbb qãÆ%öS^ø“'O²yófŽ?ΰaØ;w®Bü§OŸ2nÜ8úõëÇ×_­TÙ:tè@zz:YYYèéé•YWWWœœœ-1úFSS“«W¯VGÖ^+555¥ÚVeÚSeÚ­hƒ‚²ÄTAÞ7näĉøøø°cÇ´µµ™|È| pqYZYŠrpp ::ZáKÄéÓ§±··GKK SSSüüüسgÄËË‹ÄÄÄr˱råJRSSÙ¶m?ýô)))J )(( %%…€€ˆ¦¦¦Ri¦§§³nÝ:fΜɾ}û033ÃÕÕ•¤¤$|}}Ù¾};ÉÉÉJqÊ;*[6{{{…úÌÏÏ'::Za‡2ç **SveŽ‘ŽŽ£F�R˜¶‘––ÆéÓ§>|x‰|TT®ôôt‚‚‚˜6mûöí£M›6RgOqeÕeÛoyî޽˜9sHMMeذaØÚÚ¢««‹��ü1:::ÄÇÇãääÄ?üÀíÛ·+L³¸��._¾LÇŽ¹wïË–-#::Z¥0¾¾¾¡©©I÷îݹzõ*Ó§Oç¿ÿý¯B:lܸ]]],,,èÓ§�´ÍÖÖVá3eÞ¼yìÙ³ ¬­­‰��eΜ9Òù»páBÂÃéW¯Íš5#>>^å²—E&“‘••Å¥K—X¾|9‹-BKK (bŸ™™‰––³fÍÂÆÆ†Áƒ³gÏ)¾2a”qéÒ%š6mŠŽŽŽÒù+NÕ6˜‘‘Áœ9spttäСCøûûcgg§R¾…—ïÆ�üóÏ?´k×€6mÚpãÆ iíƒ+W®pâÄ ¥ÖPx_•ÕžäTi·¢ •!:&Ax+äää°cÇ,X@óæÍ111‘æ.½7ŒŒŒX¶lÿïÿý?úöíKPP“&Mze#‡Þvåµ'9UÚ­hƒBeˆ©‚ ¼RRRÈËËSX`OWW—¶mÛ’�� ½'¿[R4^~~¾B¼â뾨ðÇYæüL¹ÐÐPBCCQSS£Q£F|ùå—%îd/KqZZZôîÝ›¨¨(:uêÄéÓ§éÕ«—ôÅ,==�ÇséÒ%233INN.÷I ‰‰‰Èd2Æ�/ÍÇÏËËãÙ³gåæcøðáÌœ9“?ÿü“)S¦Ð·o_©üʦY´Ž›6m E—Å577'++ Pþ\PµlúúútïÞ�S§NѱcGNœ8¡07·2ûU†*eWåéëëóù矂 ˆˆˆ(1…C•rÍg£F�ÐÕÕ•òU‘ʶߊ´lÙNž}°²²â«¯¾Â€.]º°cÇÎ�;ÇáÇ9yò¤45bÖ¬YJíÃÔÔTºÓgkk Pâx—ææÍ›Èd2>ùäi‘½½=ßÿ}‰5jÔ cÇŽæIžöùóç±´´TØ–‘‘Á£G�èÚµ«´ÏN�:±k׮Р¬„пvìXììì˜4i 4`„ äçç—™V­Zµ€Â;ëªÜU’—¡S§NØÚÚ²zõj‚‚‚ª”fqò‹p¨Ü¹ l>äwÖf̘ÁéÓ§¦HTö¬ª¢eWµ>¿øâ † ‚��vvvÔ«W¯D˜Ê–«h¾*òªê®N�:ìÞ½›ÐÐPN�:űcÇ8qâ!!!Ò4555¬¬¬°²²ÂÑÑ‘)S¦(L¡På1œò òÏ,&;;@¡í½xñ555i½ ¹â¯Ë"?ö]»v-1�¬aÆÒ(”W¹ø¬ššÆÆÆŒ7Žk×®�­­­´¸]›6mÂ7iÒDZ[E™0å åÌ™3„††¢¡¡¡Rþ*£è¹®®®NPPqqqêÕ«ÇôéÓ g̘1Èd2~ÿýwrss¹råŠBXùzuëÖ•:nß¾-=&öÖ­[%ÒOJJ"33@Zx²xžË cnn.Ò)ßÏÙ³g)((P8¿Ê"ñ O_ž¦††W¯^¥N�:4iÒDúÑÖÖ¦I“&ÄÆÆJû|•‹þikkKwSÕÕÕéÑ£Ç�W“��€™™™ÒaÊräÈ6lØÀªU«066V9/KçÎ�ùî»ïزe QQQ¤¥¥½Ôô…Š=z”mÛ¶PâøÊd2Î�;Gnn.lÙ²…äädij”PH•öT•v+Ú   Ñ1!Â[AOOGGGV¬XÁ•+Wxüø1~~~IãeÅûì³ÏX¾|9ñññ<|ø�5kÖ(„ñðð`Û¶mJ‡¯_¿>/^äîÝ»ÒÝP¹O>ù„I“&±hÑ"iþ}Ñô_6uuuúõëÇ’%K°±±‘::ŒŒŒxúô)?ÿü3Ož<‘¾H}zDñrhjjâêêÊÚµk9þ<ùùùÜ¿_á⮢²˜ššòù石fÍòòò”JSUÊœ •)›::šE‹±xñbZ´hAvv¶ôÔUòW8p€´´4ž?N\\ººº¾”ôåÈ×rJJJÂÙÙ™Þ½{Ó»wo©�§§§³uëVúöíËèÑ£III!88¸ÜÚ”lƒµ[Ñ…ªS9AxkÌ™3‡~ø�Ù³g“——G·nÝX»vm…Ã7=<ûŒØØXFŒAçÎ�Y½zµÂþ¾úê+þüóO<<<ؼys‰ô_¶þýû³{÷næÍ›'½÷á‡2mÚ46lØ@PPVVVôîÝ[!^iå7n5jÔÀÏÏ�{÷îaddĘ1chݺu©uUš &AXX_|ñE¹iVVE炪e+ª_¿~œ:uªDÇ„2û5jÞÞÞܾ}???¦OŸŽ——#FŒÀÄÄ¥Œ,‹ªõY»vm…G†–¦²m«,¥ÕeöQÑ9—››‹‘‘GŽáÙ³g4hЀٳgceeEbb"£F�âüùó\½z >þøcF�%=ÖËË‹%K–���€��žžž,[¶Laò'|œ={¦L™Rb(sEa–/_.=¾766–6mÚ0}úô ï2Bá"¦×¯_'::šððplllhÕªsæÌ¡~ýú>|˜mÛ¶ajjJëÖ­)((@MM ___¼½½‰‹‹£F�øúú²råÊ ÷W}}}j׮͚5kHMME[[›V­Z¨0úÃÒÒ6oÞL@@æææ¬ZµJ¡¼…)íØ/^¼™L†‡‡‡B¾Æ�Ï”)S”Î_UdffròäIxöìMš4‘:š„×GOO�_ýµÌíFFF¬_¿þ5æèÍ2wî\©£�¦—:88HŸqµ§ÒÚ`EíV´A¡**÷�£êé–¶]­Èûòßꥼ.F½H<ùkù�Æ¿¿5ÿý[þ»vAAÁYÊ"Â;æÑ£GôïßŸØØX¥þ‘©^„wƒµµ5uëÖeß¾}U ó6ILL”¦‚ï¦òŽq» ;Ñ1·V*�ß}Jbb"¥Î¯lxAAxX45#÷ÑÍr;'dÙÿЩ~v™ÛA*C¬1!Â;/33“-[¶àééIýúõqrrbذa/-¼ ‚ ¼ öÌí�³O,×oŸ)} ¶ZaçEà„¯=o‚ ¼ÛÄ‚ ‚  殿Ä1~û‰cøîkL‚ ‚ ‚ ‚ ¼FïåTޤ¤$d²ŠöAAxß$&&Vw„WLã·Ÿ8†ï.ùãéß7ïeÇ„©©iugAAá�#†ˆ¿ûÄ1~û‰c(¼‹ÞÏîAAAAÞïåˆ AAAÉdüûTŽ;ÿ·´Ý¿OâØ3·ïésA^Ñ1!‚ ‚ Î>±ÜJËA§IOPû¿^ˆ„gÿðͦ+¬›Øºs'»Lô{ ‚ ‚ ‚ÀõÛwЪÛ\¡S@]·ïëVS®AxˆŽ AA„7ؽ{÷¸wï^ugCxP¢SBÚ¤®ýzó"Â{ELåA„bd2þþþ9rCCCV®\IÓ¦M_˾srr°²²"<<œÆ�W)-WWWœœœMdd$‹/ÆÐÐWWWŽ=ªîóÏ?'&&†£G�2þ|Ž9B@@À+Ï×Áƒqqqaýúõ„„„¼²ýUÄÚÚšž={òüùs8À”)SÈÉÉAGG‡æÍ›Ó¼yóWÚ‰¤¬¬¬,ºtéBLLŒÂO½zõ¤0G�Å××—‰'B�5˜0a/^¼(3]eâ<~ü˜Ñ£GS£F –.]ÊöíÛ>|x™[»+##ƒ .àååʼn'˜0a .$55(¼€ dìØ±$&&Vsn_¯¼¼<–,YBß¾}Ù´i~~~ܼy//¯2㨫«sóæM&MšÄ®]»ðòòâÙ³gÌœ9S!܆ ˆ‰‰aÉ’%lß¾�öíÛãîî΃^u±„÷€1!‚ Åܹs‡Ö­[óÁTwVÞzÚÚÚèëëP§N:tè@ƒ X¹r%Ý»w§V­Zhii¡««‹®®.Ý»wgĈœ8qâ•çK__ŸAƒ‘™™É–-[7nÜ+Ûgy/^LíÚµyúô)cÇŽ%!!�Ó§OcooÏÖ­[«%O¥ÉÎÎF__]ݲר´i3fÌ�F1,Y²GGG"##qtt¬tœ��,--ñðð�â}øá‡/©dÂÛÄÀÀ@áB»ÿþìܹ“øøx5j„¦¦&µjÕâçŸæ×_%<<¼sûzijj²sçNiô—©©)îîîLŸ>�œœœRG¡©««3þ|éµ±±1mÚ´ÁÎÎŽG�Q·n]bbb1b;v`ÆŒœ��� 4ˆO?ý???…üTÿìÙ³¸ººÒ³gO† Ræ(ƒ§OŸâììLpp0Û¶mcóæÍDFFÒ­[7|||”®ß={ö0qâDlll3f W®\Qîà1zôh ˆŽŽ.3LZZÍš5“^;88ðÛo¿I¯ÿúë/zôè¡r=”¥C‡¤§§Ku[ÕãZÖùR}}}>ýôS€ÂÑ}ûö•ÂX[[óý÷ßãïïÏÀ�±··gÆ édeeñý÷ßcoo�““›6m¢W¯^lܸQ¥z).++«ÜN‰Û·o“�� 0¤^KK‹Þ½{U¥8”¦µ(ÃÕÕ•Í›73aÂlllpqqáÊ•+ìÚµ‹‘#GbccìY³øçŸ¤8U=�„êóüùsj×® €šš®®®Ts®ªGñ)iFFFÈd2d2™ÒiáBÙú•çCž×víÚUjq¹ЫW/éõ¨Q£¤…Ö²ý©R IDAT²²Ø¿?þþþtîÜ›rÓR¦Š %445555jÄ—_~ÉðáÃ�ªW9UîÞí8ÐÐÐÀÝݽÜEW ¥ãÙ¦Mé"þï¿ÿ k×®hj~Õsppx)kv}:���ÞÞÞ :”ãÇ�3räH Kí€xúôi™‹T*G>œÜÚÚš.]º…uDZcÇÊ|*GÑö$Ï{VV–”®¹¹¹4§2ç‘PýÐÕÕeĈÕ�•7ÒŠ+hذ¡4E¬<  ÿþ}ú”ù%¿4òÎ9ùÔ›âS#^---Z´hÁýû÷�ÂEó222xòä‰Bݤ¦¦Ò AƒRÓP&Ž|ñ=y'Œ\“&Mˆ��­tþ‹w´©z Õkß¾}ÄÆÆ¬p,…B¡¡¡œ9s†ÐÐP444”Š£¦¦†±±1ãÆ�ãÚµkDGGckkKRRDFFJíqÙ²eÌš5‹M›6±|ùòJåQ´AANLåAÞ ¦¦¦¨©©ñßÿþWzO&“qåÊš7o^f¼Æ�—ˆ÷²4lØ�š5k–¹¨_EÛK+“*ñå:wîÌwß}Ç–-[ˆŠŠR˜ËߨQ#¼½½Ùºuk‰Å&óòòÊÍKñú}øð!{÷îUH#>>^¥‹h(ü²lbbB·nÝÊ W§N鉺ººÒH€¢ù+ª¼z(NþDŽÒ:]ªz\+Ã××—%K–0qâD•ë³8ùH‹ØØXrrr¸|ùr•óX™LÆßÿM“&M°°° ~ýú Ó{d2§N�*s®¸2qÔÕÕéÑ£Ç�Wˆ›��ðÒç«Êy$TŸ£G�²mÛ6ÞÛE.ËsäÈ6lØÀªU«066®TÚÚÚRÝÊ×*ÞôÑGñäÉ“ªe¶ÑßO¢cBAx+èééáèèÈŠ+¸rå �?ÆÏÏ###>ùä“rã}öÙg,_¾œøøx>|Èš5kÂxxx°mÛ6•󤩩‰««+k×®åüùóäççsÿþ}éIm¯(oÅÏÈÈàÀ�¤¥¥ñüùsâââÐÕÕÅÐÐP!ŸŸ|ò “&MbÑ¢E$%%P¿~}.^¼ÈÝ»wÉÎÎVª~uttˆ��çÂ… ööö@aÂØ±c  ::šû÷ï³bÅ 455:&ŠÖƒ²q\\\ #,,Œ´´4Ž;ÆáÇqvv~)eS¶= ÕO¾fNRRÎÎÎôîݛ޽{ãîî.…qssÃÁÁ�ï¾ûŽß~û ÆŒS�¹~}¢££Y´h‹/¦E‹dgg“��­°�qÑ6xçμ½½9wî©©©$%%±cÇ¢¢¢¤) -Z´ÀÌÌŒyóæσ8rä{÷îUxjPUˆ6ø~S9A„·Æœ9søá‡˜={6yyytëÖ�µk×V8„×ÃÃU«VáîîŽ���ÂE”L&#%%¥Òw”Æ�G�5ðóóãÞ½{1fÌiÁ®Š¶ÏÛ AƒhÔ¨‘RégffròäIxöìMš4ÁÇǧÔQ_}õþù'üøã�|öÙgÄÆÆ2bÄ:wîÌêÕ«+¬_}}}ìííY±b>¤]»vlذ--­2ëQ~!©¥¥EÓ¦Miß¾=»wï.1bÏž=Òj×®�……~~~Òè�éÓ§ãååň#011ÁÁÁAêd)¯*{|«z\KSÕsM¾¾¾x{{sñâEjÕª…££#¨Òpw™LF½zõX·nÉÉÉÔªU‹Ž;²qãFéi&ǧ  €ÀÀ@=zDçÎ�Ù¸q£´ºiõPQKKK|||ؼy3˜››³jÕª—6bB•ö$T/===~ýõ×rý¦Ü¼y/^ŒL&ÃÃÃCáýñãÇ3eÊ”mP__ŸÚµk³fÍRSSÑÖÖ¦U«VbaaNÛ $((ˆÙ³g“™™‰©©)'Ndذa/%ߢ ¾ß^Õd¬ŠÒ-m»Z‘÷å¿ÕKy]4Œz‘xò×ò�kþû·üwí‚‚‚³*”EAxÇ\íØ«B¥R1oÞ–––ØØØ`ccà /¼Àˆ#8xðà]�ËÎÎŽAƒ‘ŸŸÏÚµk7nÜ]ÛgMó÷÷¿kÛþæ›oøî»ïèܹ3 ,кhÎÉÉÁÞÞ¾Fö“ššJRR>>>ÄÅÅqäÈ E•:>ª#66–¢¢"\]]+¬[½z5S¦L¡gϞ̛7oooöîÝ‹···ÑiÊ+**ÂÎÎ�ë³³³Ù¿?ûöí£aÆ„‡‡3pà@Ο?¯3Vñ`²°° ~ýú|ýõ×üøã�lß¾]k}ƒ Ö¼ùå—ùòË/ILL¤yóæ÷:Ü{ÊÜÜœY³fiÞ;::Ò¡CúöíË�7xì±ÇŒJcÊváÎÝb#FŒà¹çž`Ê”):tˆsçÎi} QžÜ1!„�¥RÉ_|���}úôaÊ”)Z¿©‰ŸûŒ�òÒK/±`Á 5Û3´^¡PÅ AƒxõÕW ÓŠÇPþãÇ�ãççGÏž=2dH¥w0|øpV­Zņ X³f {÷î¥k×®,^¼Øèòݲe 'NÄÓÓ“Ñ£GsöìYãN^#GŽD¥RqôèÑJÓdffÒ¦MÍ{///Nž<©yîÜ9zôèQår¨L§N�ÈÉÉÑ”me绺edè|êÚoeçËÏÏ�;v½mcËH©T�µµ5óçϯð%¼|§DQQaaax{{Ó§O¦M›¦)“²Ãf|}}éÚµ«VÞýû÷Я_?ºuëFnn.§OŸ®ô<Õ¤ôôt¢¢¢˜9sf…Ž�K—.‘œœ¬u˼¥¥%}úôáÈ‘#F§Ñ¥°°°ÒN ¸Ó1Ú°aCM§@“&Mpssã‡~ЙÇÏÏ�5kÖ0aÂ<==5jgϞ嫯¾â_ÿúžžžL›6�¿ÿþ[“§ºmFTŸ™™~~~4hÐÀè<·nÝÒª�’7n`kk«·¼ŒIcL’’’4ïóóóÉËËã‰'žÐ¹ iƒBM:&„â°råJ<ÈâŋٴiVVV¼óÎ;”””hÒÌž=OOOV­ZEÇŽˆˆˆàĉ,]º”åË—“““£³SB�Ô¨Q 4ˆ„„bbbôn{É’%ddd°aÃþûßÿ’žž®/oÌúÈÈHŽ?Nxx8+V¬ ¨¨H+}ùóòò˜>}:ÞÞÞìÞ½›ððð cäáNçÇÌ™3quuåí·ßÆÏÏ�ñãÇãååEBB3fÌ0º|CCCñ÷÷'66777üýýÉÏÏ7îþÃÊÊŠ¶mÛjݺ|üøq~øáŽ9ÂܹsÙ½{·Ñw/[údeeѸqclmm5Ët�ïê–‘¡ú k¿•�¯òj¢®À�ñîyyy<õÔS•ŽÓ.kæÌ™lÙ²WWWzõêűcǘ>}:J¥R뢽wïÞ¼ýöÛZy÷ïßO½zõèܹ3½zõîÍpõ///žyæ™ ë¯^½Š½½=õêÕÓZÞ²eK233�N£Kaa!»wïÆÓÓ“À… 4ëíííÉÍÍÕjW¥¥¥üòË/•ÞFž““òe˘:u*Û¶mÃÅÅ???RSS eãÆ�¤¥¥ÔL›÷Þ… øûï¿qss«íPî¥RIaa!¿þú+ .dΜ9XZZV9MU·;iÒ$öìÙÃܹsÙºu+“'Oæý÷߯th§´A¡&Bñ�+..fÓ¦MÌž=›¶mÛâää¤Zö—÷Áƒããル«+uëÖåöíÛÄÆÆ„««+ÎÎΙCùmß¼y“íÛ·3mÚ4pttä�wÞáûï¿0¸¾¸¸˜-[¶T›¡üׯ_§¤¤„ž={Ò AÚ´iCûöíµbV©T„††RXXÈœ9sª]¾}ô�:uÂÑÑ‘€€5jTa¾c4iÒ„œœÍûääd¦L™Â´iÓøî»ï(**â›o¾1j[Æ”Ce IIIDEE1jÔ(­uåÏwuËÈÐù¬l¿Æ¨‰º¢–œœ  5�cdd$š×[o½Àùóç9vì]ºt!,,Œàà`<==IJJ"--�¾}ûâååÀĉ™0a‚Ö~.\¸@÷îݱ°° G�˜››søðaT*•QÇmª¯¿þš .ðÞ{ïé\Ÿ••¥fTVÆ 5õÖ˜4º 2„¯¾úŠo¿ý–ÈÈH,,,˜4iYYY¸¸¸Ð¶m[>ýôS²²²ÈÎÎfÉ’%8;;“››«s›öööѾ}{4uY=I©‹‹ ÞÞÞüúë¯@õÚŒ¨J¥’°°0Æ�÷HM‚ºwï^zõêÅ„ HKK#;;Û¤4UÍÓ±cGÆŒÃwß}GHHõë×祗^ªt{Ò…šÌ1!„¹ôôtJKKµ&û³±±áÙgŸÕ\H~IJOOG¡Phå3õÉ å·�’’‚R©düøñ˜™™w~Ù¼yó¦QëÓÒÒôÆf(«V­ððð`øðá¼øâ‹ <˜çŸ^+Æ�;wræÌöîÝ«÷ Æ–¯:u¬nnn:'m3äúõëZO_ðõõÕL>VXXÈŽ;ÇÝÝOOO½Û2¦Ê‹‰‰!&&333š7oÎ[o½Å°aôÒèªKÕ)#Cç³²ý£&êŠZ£F�¸víšfÙÓO?Í AƒP*•|÷ÝwšåêãNHH¨0[}^^žÞ˜ÕÃ8öïß�R©î\|]¿~�ÿýïwíWጌ """¨ô–x{{{�� 888�F—²OøiР!!!¼þúë8p€ýë_˜››JHHC‡¥Q£FŒ=@ïiÙÏõ> 5±´jÕJ3´Ç”6#jWdd$666Œ1¢¶C¹§^yå^~ùe®_¿Î®]»X²d ŽŽŽôîÝ»JiªºÝàà`233Ù¼y3–––¬X±‚×_�U«Vi 3,KÚ é˜Bˆ‡žúq‰ …Bë�¿•••Þ îÒÒR”J%J¥²Æ©þµtÓ¦M:/p ­/))Ñ›¡üæææDGGsêÔ)¾ýö[¦OŸŽ‡‡áááš4]ºt!99™Í›7ë�,ÑÔò­S§N•½+..æâÅ‹•>æÒÖÖ–7ß|“ƒrêÔ)ƒÆ”CyÞÞÞL�:Õàñ•�»:edè|VGMÔµV­ZannÎüAzz:NNNôë×�~ýúUè˜Pïëù矯0ÄäñÇ׳ºc¨0ÑéáÇïZÇĪU«(,,$$$„E‹wîœ ¤N�:|óÍ78::’——Gnn®VyfddЬY3£ÒÃÒÒ’víÚiu999inùVó÷÷×{¡eHù³ª¶Q{¶mÛÆ±cÇXµj•Öy|T˜™™áèèȸqãHJJâèÑ£Ú‚1iŒÝnjj*»víbïÞ½šÉ0,XÀ´iÓX½z5 .4ù8Ô¤ >¼d(‡B<äœ��133ã—_~Ñ,S*•œ={–¶mÛVš¯E‹òՔǜzõêU:Ñ�¡õºŽ©*ùÕÜÝÝùä“OX»v-GŽÑßÞ¼ysBBBX¿~}…É&KKKõÆR¾|³²²Øºu«Ö6+ýõ¨2111899U˜±¼F�ižèaccÃ_ý¥µ^ý+»š¾r(OýDc;% úedìù¬LÙóU^MÔ5[[[^ýuŠ‹‹ùøã�µÒk¥mÕªuêÔá�?þ Q£F´lÙRóR—­…Å�ß�ÊΙpéÒ%.]ºDçÎ�ùùçŸ5¯-[¶pèÐ!­ý”ÚQ�¡sçÎåçŸæ§Ÿ~"!!�„„Ú·oOhh( ´hÑWWWš6mª5LI©TrøðaÍ8pcÒC©Tò×_ѲeËJÓ¤¦¦’˜˜¨÷VrST¥ÍˆÚ±oß>6lØ@ddd•&t|XYYY,cÒèË£þ¬*ß ôä“OV:œÊTÒ>Ò1!„9[[[¼½½Y´hgÏž%;;›°°0èÖ­›Þ|¯½ö .$11‘¬¬,>ûì3­4���lذ¡Ê1YXXàççGDD ( ®]»¦y ƒ¡õ†b3”?//��;w’™™É­[·8uê666žšÐ­[7&MšÄœ9sHMM iÓ¦œ>}š+W®PTTdTùÖ­[—ÄÄD~úé'rssY¹r%………š‹0]åXRRBQQ$&&ÆW_}EPP�Ö—¾ÒÒRŠ‹‹)..&//�C‡qêÔ)Íä‰;vdÇŽ\¹r…ôôt,X ™pÒP9˜z~Ë«n:Ÿú”?_åU·®”/£É“'óä“OræÌ|||˜8q"S§NÕ<Sý+¢££#C† !//�±cDzråJ,XÀìÙ³5Ûj×®€fòÙââbÍżzÂKµÖ­[Ó¼ysÒÓÓ9þ}š«W¯räÈüýý™0a‚f˜MuûÙ!î>¼¼¼øä“O8yò$^^^š¡;ê¹�RSS>|8}úô¡OŸ>ÔrÔwßåË— áĉddd�ššÊ¦M›8r䯾úªÑi@» “§]»v¸¸¸0sæL¹~ý:qqqlݺ•þýû×ÈñI|xÉP!„xLŸ>�Ï?ÿœ?ü�ÒÒRºvíJDD„Á[[Yºt)4hÐ@s`nnŽR©$==]k¢¿ª7nÖÖÖ„……qõêU=z´f+CëËÇ6hÐ ­çÓëËŸŸŸÏ¡C‡ˆŒŒäæÍ›´lÙ’Å‹ë¼ `ìØ±üþûïòÅ_ðÚk¯qìØ1FŒ�»»;ÿþ÷¿ –¯�� `Ñ¢EdeeáææÆŠ+°´´¬´ccc‰��ÅÒÒ’Ö­[Ó±cG6oÞ\a¸Á–-[4¿–7lØWWWÂÂÂ4wc|ðÁ3bÄœœœðòòÒt²è+‡êžßòªSF†Î§>ºÎWy¦Ö]eT¯^=ÍÓ=âãã¹xñ"<ñļóÎ; 2D«Lš6mÊž={ذaÎÎδoß•J…™™Ççüùó=z”íÛ·ãé驯Q¾càÅ_dóæÍ:tWWW&OžÌ’%Køæ›oxá…*¼ïÔ©SÕO¤† †J¥"**Š7nàîîÎÊ•+µfî7”¦|Ù*•Jš4i²eËHKK£~ýú<÷Üs¬\¹RóD˜Û·osæÌV¯^Mqq1®®®ÔèŒýUùìwWttt¥ëlmmùñÇïa4÷;;;6lÈgŸ}FFFVVV<ýôÓDEEáêêjtšòmИ<–––DEE͇~H~~>ÎÎÎLœ8‘¡C‡ÖÈñI|xÝ­ÁV†¶«k½Y™åêÍu¼/›Æ¼L>õ{õ«Î?ÿZüóõ¿ U*Õñ*‹Bˆܸqƒ—_~™cÇŽÉ—€*ðóóÃÇLJÁƒ×v(÷-)£ûCJJŠÞ¡âÁ§ï»Mø’º­þ¯Óëd�Ó½ KT�´Ó‡Ÿ™™Yw P¥eþUþóe™—ªÌKýž2ï)³¬ü{U™ÿ—ehÜ_�?J†r!„0ZRR-Z´�N !„BQc¤cB!D¥’““9r䤤¤©yƸBˆ‡Œ™ª’;s±˜eÕr0BˆG‰Ì1!„¢Rùùù¬]»–   š6mŠ��O��BqÚ¯[þ¬ù¿BÜ+2Ç„B!„dìú£@ÎñƒOÎáÃOæ˜B!„B!„¸‡É¡©©©(•Jà …B!1)))µ‚¸Ëä?øä>¼ÌÍÍ{ÉŽ ggçÚA!„â¾#·ˆ?üä?øäŠ‡Ñ£Ù#„B!„BˆûÂ#yÇ„B!„B›ÏÂc\øó2íÚ¸ðͬµŽâ"B!„B.üy™º­z‘*S± !î1Ê!„B!„BˆZ#B!„B!„¨5Ò1!„x$)•J–,YB¿~ýðññáÒ¥K÷lßÅÅÅxxx�––Vímùùù±cÇŽJ÷sëÖ­jïCŸ#F°nݺs«1 IDAT»º}Çx7™R~†b ÂÃúuëÆðáÃùòË/kíÖ5uþjºdee‚··7=zô`РAÌ™3‡¼¼<àÞÔíʼõÖ[xxx�››{W÷Ó«W/¼¼¼îê>L¥T*Ù¶m àäÉ“:ÓÄÅÅáççGß¾}™:u*™™™•nïôéÓšvQþ 3OZZ={öäСC5rLâÁ”‘‘ÁŒ3ð÷÷¯°®´´”ÐÐP^}õU† ÆÎ�;k!ÂÚcL;-O_»5¥� Q2DŽ⑴cÇ~þùg6oÞŒ¹¹9 4¨í�jÜš5kHKKcÁ‚wmžžž<õÔSwmûµén•ß°aÃxÿý÷)**âÇ$,,Œ¢¢"Æ�W£û1FM�¿š¬ÅÅż÷Þ{<ýôÓüç?ÿÁÞÞžÌÌLNŸ>���poê¶Ð-!!�ÿûß”””���­3;}û eÞ¼y¸¸¸°lÙ2&L˜@ll,ÖÖÖÒwêÔ‰ï¿ÿ^k™R©dذa:;gT*óæÍãöíÛ5rLâÁSRRÂÊ•+Ù±c888THJAA±±±¤§§óÞ{ïñØc�Ñ£ÇÃ?©§1í´>žÈÈHZ´h¡µ���¶nÝ ÀîÝ»iÓ¦ 111•n»¤¤„èèhöïßÏíÛ·éÝ»7ØÚÚ\¯P(X¾|9qqq( zöì©�¡üÇ�gùòå\ºt‰Æ�Ó¿Þÿý eWPPÀ¸qãx饗°¶¶fÍš58p€¡C‡2cÆ £ÊwàÀ�8p€¤¤$žxâ f̘Aûöíuž/???||||8999ÄÇÇcggÇÈ‘#yýõ×M:.333"""ô¦¹téÉÉÉZ*–––ôéÓ‡#GŽàíímÔ¾¶lÙÂ�!C°´´ÔZžžžNTTÑÑÑ,^¼Xï6LiÆ~ÞŠÚeff†ŸŸ_¥ëÿýwÚ¶m«u7d÷îÝY¾|ù½¯VÓNË3µÝVÖNÕ¤ Šª�Ÿ„÷••+WrðàA/^̦M›°²²â�wÞ¡¤¤D“föìÙxzz²jÕ*:vì@DD'Nœ`éÒ¥,_¾œœœœJçp˜={6£F�bРA$$$hý‚¢kÛK–,!##ƒ 6ðßÿþ—ôôt­?ú†ÖGFFrüøqÂÃÃY±bEEEZñèËŸ——ÇôéÓñööf÷îÝ„‡‡Ó·oß Ç¤P(˜9s&®®®¼ýöÛøùù1~üx¼¼¼HHH`ÆŒF—ohh(þþþÄÆÆâææ†¿¿?ùùùF�¿œœ–-[ÆÔ©SÙ¶m...øùù‘ššJhh(7n$--�¨¨(­|ÕÙ§¡ü¦Ô)]ågii‰³³3aaalÙ²…�LJJŠÑqê’••EãÆ�5†ꓮxÁô²WÓW׌­‡j†Ê<''‡èèh&OžÌ¶mÛèС3fÌ ¤¤„:жm[Þ~ûmÖ¯__an‚êÔmSÚwU…††�……/¼ðüñ|ð¿üòK•Ò”Åùóç1b}úô1:–uëÖñÛo¿ñÜsÏqõêU,XÀÑ£GM>6c\½z{{{êÕ«§µ¼eË–zç™(+##ƒü­åê!^^^<óÌ3·SÕ6QÕz.î_™™™4nÜXk™££#………ÔRT÷/SÚmeí´,iƒ¢*¤cBqß(..fÓ¦MÌž=›¶mÛâääDpp07oÞÔú2=xð`|||puu¥nݺܾ}›ØØX‚‚‚puuÅÙÙ™   “b(¿í›7o²}ûv¦M›†ƒƒŽŽŽ¼óÎ;šq–†Ö³eË–Jc3”ÿúõë”””гgO4h@›6m*ÜI R© ¥°°�9sæT»|?úè#:uê„££#4jÔˆ}ûöU~öööѾ}{5jãÇ�ÇÅż½½ùõ×_µòUgŸúò›Z§*óÆoЦMœœœ;v,�?þ8‰‰‰FÇY–B¡ ))‰¨¨(M9ªúâ5µìÕôÕ5cꡚ1e®ŽµC‡8880fÌnܸAjj*VVV¬]»–7ß|“˜˜ DPPçÏŸ¯´,M=ÏÆ–·±®]»ÆÖ­[iÓ¦ 7ndñâÅÌš5 €�7�¦¬“'Oòßÿþ—'Ÿ|’>ø Ê1ÅÄİhÑ"ÍgÖ-[L:6ceeeQ¿~ý Ë6lHNNŽQÛøúë¯éÙ³'M›6­°üÂ… ¼÷Þ{Fm§ªm¢*õ\Üß E…I…ëÔ© CÂt0¥ÝVÖNË’6(ªB†r!îééé”––jM¢gccóÏ>Krr²f™››[…| …B+Ÿ©_<Êo;%%¥RÉøñã133îÌô}óæM£Ö§¥¥é�ÍPþV­ZáááÁðáÃyñÅ+Ëoj�ªLNN{öìá×_%??Ÿ´´´*?"&&†˜˜ÌÌÌhÞ¼9o½õÆ  ×CñšRöjúêš1õPÍØ2/kóæÍ±±±ÑÄfkk‹ŸŸ¾¾¾=z”˜˜ÆŒúuëtÎ+`êy6¶¼�uñâE”J%ݺuÓÌ[3`À>ýôSÍ“ŒI£vëÖ-æÎ�‹J¥"((HoûÖÅÙÙYs‹uïÞ½´Êãn°··×y!SPP s‚ÂòŠ‹‹Ù¾};‹-ÒZž‘‘ADD4lØÐèxªÒ&ªRÏÅýÍÑÑ‘ëׯk-ËÊÊÂÎÎÎäaZ³ª¶ÛÊÚ©.Ò…±¤cBqß(..F©T¢P(´þ�YYYéýB^ZZŠR©D©TÖø/!ê_6mÚ¤ó˰¡õ%%%zc3”ßÜÜœèèhN�:Å·ß~ËôéÓñðð <<\“¦K—.$''³yóf��LS3µ|ëÔ©£÷.‚ª*Û‰p·ö©Îoê1ëRTTĘ1cèÛ·/“&M¢Y³fL˜0…BQ¥íx{{3uêT�1ªÕ¥¯ìõÕ5cꡚ©e®+6 úöí‹§§'ÇçÀ�:;&LÝgM—·z˜VÙ:qûömÌḬ̀±±1:�šµµ5O>ù$ׯ_ç믿®pGTU3«îlÑõTŒšäèèH^^¹¹¹Zeš‘‘A³fÍ æ�‹‹£Q£FtéÒEkùªU«(,,$$$Ds1¤P( ¤N�:|óÍ7:ç$1¤|§¦±õ\ÜßÚ·oÏ… ÈÎÎÖ\'$$ЩS§ZŽìþTÕv[Y;5…´A¡&÷2 !îÎÎΘ™™i�³V*•œ={–¶mÛVš¯E‹òՔǜzõêqäÈ“Öë:¦ªäWswwç“O>aíÚµ9rDkÌgóæÍ aýúõÆ�—––ê�¥|ùfeei&UKLL¤M›6z㫎êîS_~Së”ZÙò;wî999Lž<™Ö­[ckkËùóç¹víšQqª©g3×uÁll}¸›ôÕ5}ëÔª[æºÔ©S‡Æ�k]TWµnëRÓåݪU+âãã)..îLä¦R©4*ƤQ333cöìÙÔ«W��;wrìØ1MÆ¥K—4ÛøóÏ?+Ä“ššª™k%!!Àäs`,WWWš6mª5K©Trøða£ÆŠÇÆÆòÆoT訚;w.?ÿü3?ýô $$$о}{BCCIHH0©S¢2ÆÔsqstt¤OŸ>,\¸�›7o’ššÊ_|�¯¯om‡v_ªj»­¬�Öiƒ�&é˜BÜ7lmmñööfÑ¢Eœ={–ììlÂÂÂpppÐû(B[[[^{í5.\Hbb"YYY|öÙgZiÙ°aC•c²°°ÀÏÏ�ˆˆP(\»v�³gϵÞPl†òçåå±sçN233¹uë§N�ÂÆÆ¦Â㿺uëÆ¤I“˜3g©©©4mÚ”Ó§OsåÊŠŠŠŒ*ߺuë’˜˜ÈO?ýDnn.+W®¤°°PóÅÄÔrÔÇÐ>íííIOOG¥RéŒA_~Së”®òspp   €¯¿þšÜÜ\8 yêƒ1±b¨>ÜMúêš±õLoÇjÿûßÿ #!!�ŒŒ ._¾ÌªU«8wîýû÷L«ÛºSÞ•�Ãàà`f̘¡y}ÿý÷´iÓ†îÝ»“žžÎÈ‘#ùøã�Y¼x1VVVŒ?À¨4e9::2yòd>ýôSòó󱱱ᩧž¢¨¨ˆÑ£Gãïï¯éx(ïÍ7ßä£�>bÑ¢E˜™™iÆxß-æææŒ3†ÈÈHŽ=ʵk×X´h‘æî5]åúûï¿“œœÌÀ�ïjŒ•©J=µÏßß///>ùäNž<‰——£G�Ö¬Ÿ3gvvvøøøðá‡òþûï˰€2ʶAcÛ-ÜÝv*mðÑ&C9„÷•éÓ§óùçŸóá‡RZZJ×®]‰ˆˆ0Ø+ÈÒ¥K  Aƒ 0¸óÇV©T’žžŽ£££I1�7kkk¸zõ*Œ=Z3!“¡õåc4h�ÖŬ¾üùùù:tˆÈÈHnÞ¼IË–-51å�;–ßÿ�ÀÀ@¾øâ ^{í5Ž;ƈ#pwwçßÿþ·Áòµ³³cÀ€,Z´ˆ¬¬,ÜÜÜX±b–––Õ.ÇÊèÛ'€¯¯/!!!\ºt‰ÐÐÐ 1Êoj�ÒU~“'OfÅŠDGGÓ½{÷ OH0«1 Õ§»E_]»~ýºÑõL/s@s±úøëÖ­ËÓO?ÍòåËiÙ²% ûܘºO}孯Η¿;I}~.\¨y¬ì±cÇèС|ð...𴯤)kèСìÝ»—Ó§OFpp0ÁÁÁÌ›7�ääd4h@PP ,ÐÊ× AžyæŽ?Ž““ï¾û.:t0pô›1cÔ¼WóòòÒìذa¨T*¢¢¢¸qãîîî¬\¹RÓ&++רØX^yåìì쪣©ªòy+j_tt´ÞõÖÖÖÌ�;÷Es1ÔNuµACíVín¶Siƒ�¶»sÿ�áíêZoVf¹ú_sï˦1/“Oý^ýªóÏ¿ÿü_ýoC•Ju¼ Ç"„xݸqƒ—_~™cÇŽÉ´*ðóóÃÇLJÁƒ?0û¬�˜…¸ßõêÕ‹Ç{ŒmÛ¶U)_JJЦH<œô�c· _R·U/N9Ý˰DH;}ø™™™urPZæ_å?ÿW–y©Ê¼Ôï)óž2ËÊ¿W•ùYº–Ue}•ÉP!ÄC)))‰-ZH§„B!„÷9Ê!„x($''“’’‚»»;7nÜ 22ò®�¥B!„BTŸtL! ùùù¬]»–   š6mŠ��C‡­í°„BˆF»6.\øó(íÚ¸2”CqïÈB!„�±ë�9Ç>9‡?™cB!„B!„âz$‡r¤¦¦¢T* 'B!„xĤ¤¤Ôvâ.“süà“søð274ïx$;&œ��k;!„BˆûŽÜ"þð“süà“s(F�fwŒB!„B!î �äB!„Bm> �qáÏË´kãÂ7³zÔv8BˆGˆtL!„B!¸ðçeê¶êEªLÅ&„¸Çd(‡B!„B!j�tL!„B!„¢ÖHÇ„⡦T*Y²d ýúõÃÇLJK—.ݳ}ãááAZZZµ·åççÇŽ;*ÝÏ­[·ª½}FŒÁºuëîê>ôãÝdJùŠ5((<<<èÚµ+ÞÞÞüç?ÿ¡¸¸¸ºáµÿ�±í#>>ž?ü�×_�=zàííÍܹs¹|ù²Ñûºuë•>*|ýúõšó_¥ã¨ŠÂÂBV®\ÉðáÃéÑ£ àÝwßåäÉ“FÅYSó™âÖ­[„……ñꫯòÊ+¯0þ|�í'77—ùóçãããË/¾ˆŸŸ?üðC¥Û-))!22’Aƒñâ‹/2vìX~þùçjoW<:þúë/üýýéÓ§#GŽäøñãµR­R*•lÛ¶�h>cÊ‹‹‹ÃÏÏ�¾}û2uêT233+ÝÞéÓ§5Ÿ“å_Zi¥� SHDŽ⡶cÇ~þùg6oÞ̪U«pqq©í�jÜš5k˜?þ]݇§§'O=õÔ]ÝGm¹[å÷ÆoϾ}û˜5kqqqDFFÖø~V*•йsçÀ‰'hРîîîØØØ°{÷nêÔ©cô¶æÏŸOïÞ½¹xñ¢ÎõûöíÓüÿðáÃÕŽ]¥RÉ´iÓX¹r%999têÔ‰úõësêÔ)JKK�г2¦æ3ŧŸ~Jzz:Ë–-#44” .0}út­4ÙÙÙŒ9kkkæÏŸÏÆ�6l•nwÅŠÄÇÇ3oÞ<6nÜHÇŽ àúõëÕÚ®x4óÁ0dÈ8€¿¿?AAA÷¤MÜ�ðõõeÓ¦MdggëL³oß>BCC™8q"ëÖ­ÃÚÚš &pûöm�é;uêÄ÷߯õ:tèxyyiÒI;¦’É/…µË—/Ó¾}{7n\Û¡<Ðüýýk;„Ž¥¥%666ØØØð /0bÄ??Ÿ¼¼<­ šªn×”Ï)c?‡Åý¥   Â/òüñǵQí1333ØN.]ºDrr²V‡‚¥¥%}úôáÈ‘#:;&tÙ²e C† ÁÒÒR³LÚ©0• åBÔŠ•+WrðàA/^̦M›°²²â�wÞ¡¤¤D“föìÙxzz²jÕ*:vì@DD'Nœ`éÒ¥,_¾œœœœJǨϞ=›Q£F1hÐ ˆ‰‰Ñ»í%K–�‘‘Á† øïÿKzzºÖWCë###9~ü8ááá¬X±‚¢¢"­xôåÏËËcúôéx{{³{÷nÂÃÃéÛ·o…cR(Ìœ9WWWÞ~ûmüüü?~<^^^$$$0cÆ £Ë744bccqssÃßߟüü|£Î_NNË–-cêÔ©lÛ¶ üüüHMM%44”�7’––FTT”V¾êìÓP~Sê”®ò³´´ÄÙÙ™°°0¶lÙÂÀ� &%%Åè8áΧ~ø�#GŽ0wî\vïÞ͸qãŒÚdž صkóæÍ㫯¾â•W^Ñ|)S+_À¸6¢«þS~úäääÍäɓٶm:t`ÆŒšü†ÚGYäååñÔSOÑ´iSƒûž9s&[¶lÁÕÕ•^½zqìØ1¦OŸŽR©ÔúâÝ»woM9©íß¿ŸzõêѹsgzõêèαnÝ:~ûí7ž{î9®^½Ê‚ 8zô¨ÑižyæêÖ­Kbb">>>|þùçZsÞT§µµ5ñññ8;;Ó¿”J%7nÔt¨é;>}åb {{{rssµÚlii)¿üò‹fÈE^^ùùùXZZ2mÚ4<==>^åî9s¦fYDD„VyúúúªT*•*))Iåîî®ò÷÷פ T¹»»«RRRT*Õÿ��¤¤$­ýüõ×_Zûùûï¿U]ºtQ½üòË*¥R©I÷â‹/ªÜÝÝUÅÅÅ*•J¥Š‹‹S¹»»«Þ{ï½*¥9yò¤Ê××W«NÌž=[•��­7βÒÒÒTª‘#Gj–éÊgL¹è’œœ\é:…B¡òõõUª®_¿®ºqã†*$$D5dÈÕ¬Y³T*Õ�Ï2wwwÕ¤I“T'OžTååå©8 êÞ½»*>>¾Òm+•JÕš5k4eóÿþßÿSåäähÖ›²Ýª~Nú~Xè;ÇÏŽ�Quù4MÕåÓ´{Q͈��Wùøø¨úõë§zï½÷Tqqqª·Þz«¶Ãº+ô�Ãòúõë§õÙ­R©T;vìP :´BÚ={ö¨hÔv?ûì3Õ´iÓ´–I;­9À ÿ\»>ùϵìÿ\Û6ÿçZ·É?×¾�þ¹nøÏµ±]™ëeÛ2×Ñêëjõu¶úº»N%׿†®çkœ åBÜsééé”––jM¦hccóÏ>Krr²f™››[…| …B+Ÿ¹¹i7~•ßvJJ J¥’ñãÇkÆ~—––róæM£Ö§¥¥é�ÍPþV­ZáááÁðáÃyñŧŒù÷¯ž={jÕƒ}ûöѬY³ZŒèþeooONNN…庆ÄèR\\ÌöíÛY´h‘Öri§¢:¤cBqÏ£T*Q(ZŒ¬¬¬ô^p—––¢T*Q*•&wHT¦~ýúlÚ´Ikü´±ëKJJôÆf(¿¹¹9ÑÑÑœ:uŠo¿ý–éÓ§ãááAxx¸&M—.]HNNfóæÍz'£4µ|ëÔ©£¹¸¨ e;îÖ>ÕùM=f]ŠŠŠ3f }ûöeÒ¤I4kÖŒ & P(LŽÓÖÖ–7ß|“ƒrêÔ)žþy½û(((î\$W6 £®ú`j©Éò+K] µ�òZµj…¹¹9üñééé899ѯ_?úõëW¡cBÝžžþyÍP&µÇ\ï~Ô@…‰I>\iG–ºCQߤ••¥133£{÷îtïÞoooÞ}÷]~ùå—J·“‘‘ÁĉyüñÇùøã�iݺµÖ ø•©N¹èãääTaˆ–¿¿¿¦#æ±ÇîÜZ_VË–-5ó‘”—ššÊ®]»Ø»w¯&ÿ‚ ˜6m«W¯fáÂ…&m×å;; }‹Ç�äÿJ8::’——Gnn®Öw’ŒŒ £:sâââhÔ¨‘Ö\<`Zû7†´ÓGƒÌ1!„¸çœ��133Óú2®T*9{ö,mÛ¶­4_‹-*ä«)�?þ8õêÕãÈ‘#&­×uLUɯæîîÎ'Ÿ|ÂÚµk9räˆÖXÏæÍ›Âúõë+ŒmW?n°²XÊ—oVV–fbPµÄÄDÍäŒwCu÷©/¿©uJ­lù�;wŽœœ&OžLëÖ­±µµåüùóZ¿Þ›ªQ£FØÙÙ܇““J¥’sçÎUº-]õÁÔ6bLùÙØØð×_iå3v®Cí£<[[[^ýuŠ‹‹ùøã�µÚAqq±VÚV­ZQ§Nþøã5jDË–-5/u§Š…Å�ßaÊÎ�péÒ%.]ºDçÎ�ùùçŸ5/õXèC‡ií'55U“_=¹dùº¥/MII gÏžÕJ¯žCýe^Wœ¿þú+·nÝ¢G�téÒE3ñgÙ:«+Ÿ1åRRSSILL䥗^î\4ôèуh¥KNN®ôqÍê¸Ëwf>ù䓚;CLÙ®©ô}‹û“R©äĉ”””�——ÇÚµkIKK3ªïQäêêJÓ¦Mµ•¬T*9|ø°Q�9±±±¼ñÆÚ¬´SQÒ1!„¸çlmmñööfÑ¢Eœ={–ììlÂÂÂppp [·nzó½öÚk,\¸�ÄÄD²²²øì³Ï´Ò²aÆ*Çdaa�ŸŸ$$$ P(¸víšæBÂÐzC±ÊŸ——ÇÎ�;ÉÌÌäÖ­[œ:u › OèÖ­“&MbΜ9¤¦¦дiSNŸ>Í•+W(**2ª|Õ“ðýôÓOäææ²råJ 5_HL-G} íÓÞÞžôôtî ­¬ƒ¾ü¦Ö)]åçàà@AA_ý5¹¹¹š/XeŸd`(V¸sáX\\Lqq1yyy:tˆS§Nѯ_?ƒûhذ!}úôañ⍤¤PXXÈÑ£G+ �)_Œi#ºS~;vdÇŽ\¹r…ôôt,X`ôʦ´ÝÉ“'óä“OræÌ|||˜8q"S§NÕ̯¾˜wttdÈ�!äåå1vìXV®\É‚ ˜={¶f[íÚµÐLZ\\¬ùB®žðR­uëÖ4oÞœôôtΟ?¯µîÍ7ßä£�>bÑ¢E˜™™1jÔ¨ ÇZYš'NàççÇ+¯¼Â¤I“5j¼ñƕƩžüsûöí,Y²???àÿ:#*ËgL¹˜bË–-œ>}š«W¯räÈüýý™0a‚ÖĬ£F�"66–ØØX233Ù¿?{öìaøðáš4eÏw»vípqqaæÌ™$&&rýúuâââØºu+ýû÷¯Òv«ÃØÏaqÿÉÉÉaýúõôïߟ‘#G’žžÎªU«jü±¿ sssÆŒCdd$G�åÚµk,Z´ ­Ž ]Û~ÿýw’““8p ÎmK;¦’¡BˆZ1}út>ÿüs>üðCJKKéÚµ+oÿ déÒ¥РAÍó¹ÍÍÍQ*•¤§§ãèèhRLãÆ�ÃÚÚš°°0®^½Šƒƒ£G�ÖŒó7´¾|lƒ Òº˜Õ—???ŸC‡ÉÍ›7iÙ²%‹/ÖùËæØ±cùý÷ß ä‹/¾àµ×^ãØ±cŒ1wwwþýï,_;;; À¢E‹ÈÊÊÂÍÍ�+V`iiYír¬Œ¾}Â�9BBB¸té¡¡¡b0”ßÔ:¥«ü&OžÌŠ+ˆŽŽ¦{÷îôéÓG+�¡XáΜú×÷† âêêJXX˜æCûøøã� g„ ”””àêêJ»ví4�—U+_ôµ} •ß|@pp0#FŒÀÉÉ ///Mç˜1ôµ]u®^½zš'ØÄÇÇsñâE,,,xâ‰'xç�w2dˆVìM›6eÏž=lذgggÚ·o�J¥ÂÌÌŒáÇsþüyŽ=ÊöíÛñôôÔ ã(ß1ðâ‹/²yóf:¤yfƒ xæ™g8~ü8NNN¼ûî»nWÖ—¦eË–øúú’��ÀüA�:uxæ™gðõõÕ\|ëŠÓÝÝ�qãÆ±uëVöìÙCïÞ½qvvÖºûBW¾§Ÿ~Ú`¹TÕíÛ·9sæ «W¯¦¸¸WWW*üÂêááÁâÅ‹Y³f ‘‘‘´jÕŠ¥K—j~1-¾---‰ŠŠ"::š?ü�üü|œ��™8q"C‡5z»ÕU•Ïaqqpp`ùò嵯}cÆŒZÃÓÔÃý¼¼¼4óÙ 6 •JETT7nÜÀÝÝ�•+Wjþ¦Vö] 66–W^y;;;�û–v*LuWfÔ4b»ºÖ—�áSý¯¹Ž÷eÓ”Ÿ1´üS>Ìù¿ÙFÕÿ6T©TÇ«p,BˆûØ�7xùå—9vì˜üQª???|||üÌÌ̺¹€(-ó¯òŸÿ+˼Te^ê÷”yO™eåß«Êü¿,]˪²¾Êd(‡â�–””D‹-ä‚KˆJHB!ÄýN†r!(ÉÉɤ¤¤àîîÎ�7ˆŒŒÔ9Î[ˆG•´!„B9‡?™cB!„B!„âz$‡r¤¦¦¢T* 'B!„xĤ¤¤Ôvâ.“süà“søð2ôxï‡Õ#Ù1áìì\Û!!„BÜwäñ‡ŸœãŸœCñ0z4»c„B!„Bq_�Ž !„B!ïoÇãýíµ†â$B!„BŠoaþx—ÚCñ’Ž !„B!„BÔé˜B!„x@\½z•«W¯ÖvB!D�z$ŸÊ!„U¥T* '..{{{–,YBëÖ­ïɾ‹‹‹éÞ½;Û·o§E‹ÕÚ–ŸŸ>>> jƒ)±ë+ €   öîÝ Üyt—““íÚµãí·ß¦]»v5÷ý¨¦êA||<;vìàÏ?ÿ$33“Ç{Œçž{ŽñãÇãââbÔ6nݺEii)¶¶¶Z�O{ë­·HJJâóÏ?§{÷îòíÝ»—   ºwïÎçŸ^­ã¨*C1Ã�úÔ¬Y3<<lØ0¾ÿþ{öîÝËܹs±··ÇÏÏï¡þ¢[ݲT©TÌ�;—€€Nœ8Aƒ pwwÇÆÆ†Ý»wS§N£·5þ|z÷îÍÅ‹u®_½zµÎåëÖ­3%ôa(æ^½zѳgOnݺÅÎ�;y÷Ýw)..6jÛuëÖ¥mÛ¶´mÛ¶JG†b2Vii)óæÍ£ÿþ¬^½š°°0.^¼Hpp°Vº„„|}}Ù´iÙÙÙ5¶Ý}ûöÊĉY·nÖÖÖL˜0�Û·oWë¸Äƒ¯wïÞ=zTë5jÔ(^}õÕÚíž377çâÅ‹Lš4‰¯¾úŠàà`nÞ¼ÉÔ©Sõæ3Ô¾Lݮƒ;&„—/_¦}ûö4nܸ¶C÷�••vvv4jÔˆN�:ѬY3–,Y /¼@ýúõk9ÂûÏ7ß|Ãwß}GçÎ�Y°`�ÖÝ999ØÛÛר¾Îœ9ÃO?ýD—.ÿ7Yß?üÀ… jl5mîܹ4lØ�‚‚ÆŒCrr2ßÿ= 0˜×ÜÜœõë×߃(u³°°àË/¿ÔÜuáììL@@|ðÅÅÅXYY¡R©Ø´i¾¾¾ 8Шã2f»p§#jÊ”)ôìÙ€yóæáííÍÞ½{ñöö¾KG-DÅÅÅ|ûí·¬]»¶¶C¹çÌÍÍ™5k–æ½££#:t o߾ܸqƒÇ{Lg>CíËÔí a,é˜B<ДJ%ëׯg×®]dggÓ±cGiÞ¼9pçvý‘#G²k×.~ûí7BCCéÚµ+ …‚eË–‡J¥¢oß¾ÄÇÇYa¸DHH[·n`÷îÝ´iÓ†˜˜˜J·]RRBtt4û÷ïçöíÛôîÝ›€€Ím׆Ö+ –/_N\\ …Bó%AÍPþãÇ�³|ùr.]ºDãÆ�éß¿?ï¿ÿ~…²+((`ܸq¼ôÒKX[[³fÍ8ÀСC™1c†Qå;pà@8@RRO<ñ3fÌ }ûö:Ï—¡ô¦œÏ¤¤¤ ±O�:•ˆˆâããÉÌ̤Y³fŒ?¾F~=9r$111=z”×^{Í`Ì111lÛ¶�7nàææ¦YïååÅüùó5·¹Ÿ;wŽ &pìØ1ÍñzzzrâÄ .\¸€‹‹ ³fÍâÌ™3lß¾�+W®àááÁG}D£F�ÃõÃÏÏ�Þ½{óã�?’””„““���têÔ‰ 6è¬ÆÖ)¥RItt4ÖÖÖÌŸ?¿Â…ò�EEEDEEqôèQòóóéܹ3Ó¦M£yóæZCi|}}©S§ Zù-,,X½zµVÇĺuë¨W¯7oÞ¬ÛºuëØ³g×®]£U«VLœ8‘=z���Í€xöÙgùâ‹/Xºt)111„‡‡ãééI¯^½0`666>|˜ââb|||˜4i€Q1«ÙÙÙñꫯMrr²Q1Â�;.¬¬¬8pà€æ}MÅdŒòCAPþöî<.Š#oüøTT’à‰·¬W³aŒ.* (èÆ›x¬+xÆë—G% *l4àz€bb@ˆ71Q|•xE ‡Ç’¨1î¢bX#r¨\ä˜þýAfæD•z¿^óÒ鮪þvu×0]ÓU-—#—Ë022"$$¤Ö˽}û6wîÜÁÅÅE™ÆÔÔ”Áƒ¯¶c¢&íGßs]x¹�:uŠîÝ»¿–w7ÖDNNXZZª]_“ö¥O¹¢ †C9Ax¥EDDpæÌ‰ŠŠÂÌÌŒ¹sçRZZªLãëë‹££#‘‘‘ôéÓ€��.^¼ÈÆ�Ùºu+¹¹¹ddd¨Ý†¯¯/Œ9’¤¤$öîÝ«µìõëד••ÅîÝ»ùꫯÈÌÌTù¢®k}hh(.\ 88˜ððpŠŠŠTâÑ–?//oooF�űcÇÆÙÙ¹Ú>•——³lÙ2lmmùðÃñôôdæÌ™¸¹¹‘””ÄÒ¥Kõ®ß   æÏŸOtt4½{÷fþüùäççk\ùL—ÜÜ\¶lÙÂÇÌ¡C‡hß¾=žžž¤§§Äž={ÈÈÈ`óæÍÊ<ºÎ¯ÜÜ\ÂÂÂX°`‡¢W¯^,]º”ÒÒRµu©ï9�••E^^Ý»w×kÌñ²eËØ¿?¶¶¶888pþüy¼½½‘Ëå*_��œœøðëå3f —/_æêÕ«üôÓO\½zOOÏjiƒ‚‚ ÃÄÄ„?ÿùÏܼy“… òÓO?錳²˜˜âãã±±±!77—ÈÈHÎ�; WÌ••——(ïĪiŒµ“¡®^½JçÎ�k}nšªåÞ¿ŸæÍ›Ó¸qc•t:t ;;[m†¶CÎuáåÍ|P×aÔ)¹\Naa!W¯^eíÚµ¬X±SSSµi i_†”+Ú `Ñ1!Â+«¤¤„¨¨(|}}éÚµ+mÛ¶UŽyLHHP¦=z4îîîØÚÚÒ¨Q#ž>}Jtt4~~~ØÚÚbccƒŸŸ_�b¨Zö“'Oˆ‰‰QNÚfmmÍܹs‰‹‹й¾¤¤„ýû÷kŒMWþ‡RZZÊÀ�±´´¤K—.Õî^�$‰   «MV“úýûßÿÎ;#µµ5^^^´hÑBë šÒ×ôxj2~üxºtéBÛ¶m™>}:­[·&99YczC¼õÖ[äææêŒ¹¼¼œíÛ·³|ùrzôè�µµ5nnn˜››ëµ�æÍ›ãççGÏž=±²²ÂÃÃ@9�dûöí5j”òÂ\×ùQ¹Ì^½zaeeÅ´iÓÈÉÉ!==]m úœS Š_þ+OFŠL&S¾þö·¿pëÖ-Ο?Oß¾}Ù°aþþþ8::’’’BFFÎÎθ¹¹0{ölfÍšUm{˜˜˜(ïòرcÖÖÖ 6L%݃8xð ]ºtaÏž=*oIÞ³g�Öc Î�زe sçÎàòåËzÅ _ìo޼ɡC‡011A&“=sŒÏSM³sçN¦L™Rkej*÷·ß~S;tªY³fäææª-ÇÐöcȹ.¼¼nܸÁÇqpp¨ëPêÔÉ“'qpp`Ö¬Ydddh�ïÅ�öeH¹¢ †C9AxeeffRVVF÷îÝ•ËÌÍÍùãÿ¨¼@èÝ»wµ|ååå*ùj:S}Õ²ÓÒÒ�ËåÌœ9### bb7ÅmåºÖgddh�MWþN�:!“ɘ0aƒ bôèÑÕfÃ?rä×®]ãäɓʱÛêè[¿Š8±öîÝ[ë� šÒ×ôxj’››Ëñãǹzõ*ùùùdddP\\¬W^]>|È AƒtÆœ™™Iaaá3}±ª|üO‚QÌ6Ǽ°°Ð}~¨+³M›6˜››+˨JŸsJAq'ȃ”ËzôèÁÈ‘#‘Ëå|ûí·ÊåŠcš””„L&S)'//OCm¨jݺ5ÇçèÑ£:tˆ .°hÑ¢j¿Þ¥¦¦"—Ëéß¿?&&_}\]]ùÇ?þÁíÛ·õÚ–BóæÍ•í¦W¯^/ŒÕ©|Cƒ ðòò¢}ûöœ?¾Æ1>kL5µnÝ:Z·n]ë ª+·yóæj÷©   Ú“;*3¤ýr® /¯èèhÜÝÝŸù 4¯ºáÇ3lØ0>|Hll,ëׯÇÚÚ''§ji i_†” ¢ ú‚ ¼²�5,//WùÃgff¦õ‚»¬¬L9v¹¶¿¸(~qˆŠŠ¢Y³f¯/--Õ›®üÆÆÆ„……qùòeŽ=Š··72™Œàà`eš¾}ûrçÎöíÛÇüùó5îKMë·AƒÝÖ­H_Óí©STTÄ´iÓpvvfΜ9´jÕŠY³f)o�%%%¤¦¦2mÚ4�1¿�ò4 CTîèÑu~èSFUúœS �:uÂØØ˜›7o’™™IÛ¶mqqqÁÅÅ¥ZÇ„"¾÷Þ{O9tH¡uëÖzÇ>uêT¾ýö[V¯^MÓ¦M7nœ²Þá*ÿ§OŸbddTíîÅœúPt ÂÎÎŽ–-[Ò®];\\\èÒ¥‹Á1ÖvL5±wï^Î�;ÇÞ½{kõÜÖT®µµ5yyy<~üXåÜÎÊÊ¢U«V5Þ^ÕŽR}Ïuáå”——Ç™3g”óBÕwFFFX[[3cÆ RRRHHHPÛ�`hûÒ·\}cTm°~«ß]‰‚ ¼Òlll022R-—˹~ý:]»vÕ˜¯]»vÕòÕ–Ö­[Ó¸qcâããk´^Ý>’_ÁÎÎŽO?ý”íÛ·¯2F´M›6¬Y³†]»v© ‘€ŠNm±T­ßß~û­ÚÀäädåÅVUÚÒ×ôxª‹ýÆ�äææ²`Á:w…·nÝRù%¿¦öîÝKÛ¶méׯŸÎ˜Û¶m‹\.çÆ�jË277ç×_UYfÈ…qUúžºT®Km甂……cÇŽ¥¤¤„O>ùD%MÕGbvêÔ‰ póæMZ´hA‡”/EG”â"[Ûœ%;vT~!?~¼r’ϪÛHLLTÆqáÂ$IÂÖÖ@yñûömešÿüç?·«‰®˜ƒ‚‚`öìÙ*íDŸkJŸz4ĉ'gãÆ�*Ãvžg¹¶¶¶´lÙRe˜˜\.çû￯õ1èúœëÂË)66{{{ñ„5ÌÌÌ4NRù,íK[¹5%Ú`ý$:&AxeYXX0jÔ(Ö­[Çõë×yôè6lÀÊÊŠþýûkÍ÷þûï³víZ’““ùí·ßØ´i“JvïÞmpL&&&xzzBRRååå}8|ø0÷îÝ#33“Õ«W«Lôi(]ç‡>ªÖ¥®sªj½-X°€?üá\»v wwwfÏžÍǬœÕ]qÁ`mm͘1cÈËËcúôéDDD°zõj|}}•euëÖ @9ImÕÎ …%K–ðùçŸkœë K—.ØÛÛ“™™É”)Søä“O ÄÌÌŒ™3gÝ»w§¨¨ˆ©S§2þü=½BߘkcMÕ4&uX±b+W®¤[·nQTTdðy[õ¼ÑU®±±1Ó¦M#44”„„ù„àà`fÍšEii)¶¶¶tëÖ .\ˆ¿¿?'N¤mÛ¶¸¹¹iœ„R_ºÎ/]ªÖå’%K4žSêŽqãÆ�•OILL$55:vìÈܹs3fŒJݵlÙ’ãÇ�³{÷nlllèÙ³'’$addÄ„ ¸uë ÄÄÄàèèH�=ªÅlmm­³½®]»VùÙóçÏÓ«W/.\¨ò8A¸sç–––øùù±zõj½êMAߘkcM|ø™Ë–Ëå¬_¿ÜÝݹ}û¶Aùýüü˜4i’$©]Ÿ’’‚L&ãÊ•+Ï«¾ªÖר±c‘Éd_ÏëñrµuŒ´ùÛßþ†L&ãñãÇÕÖâî»;………:Ë*..¦   Ú£ÃÛ¸pá‚Ú|'OžD&“±`Á‚šíÄ3г&eeeìÝ»—iÓ¦áèèȈ#X¿~=ÏGrr2‹-ÂÍÍ�!C†àççÇ£G�4¦ÏÈÈ`àÀ�œ={Vk¬ÑÑÑ̘1ggg†ÊòåËyðà�JºÒÒRBCC9r$ƒ búôé\ºté™öGx=ÄÅÅáàà ò’Éd¸ººÖuh/œ¾íIMíV´Aáy‚ ÂKcÛ¶m¬Zµê¹”}øða.]ºÄ¾}ûˆŒŒ¤}ûö—‘ššJbb¢Úu;vìxÖ Vµ¾¾úê+ââ∋‹cöìÙ¼óÎ;Ê÷qqq¯íã²5jD×®]éÚµ+�5Ò™~ÕªU899‘ššªvý—_~©vùÎ�;Ÿ%Ìg¢+檾úê+6nÜH~~>½{÷&??Ÿ}ûöPãÊÊÊ`È�!|ùå—lذ�ÔÔTüýýÕ¦—$‰€€ž>}ªµ\cccRSS™3gß|ó þþþ¬ñ> ¯'''T^üå/©ëÐ^8}Û“&ÚÚ­hƒÂódRׂ ‹p÷î]zöìÉ›o¾Yã2š6mÊÎ�;qpp¨Vö•+Whܸñ³†ùL,,,”ÿoذ! 4 I“&uÑ‹allÌ®]»j­¼k×®ñã�?Ò·ïÿMxîÜ9~ùå—ZÛÆó6xð`:v숣£#éééLœ8‘ï¿ÿžÂÂB•sE_&&&|ýõ×Wü®eccƒ—— .¤¤¤333•ôÑÑÑakk«µ\ccc–/_®|ommM¯^½pvv&''‡7Þx€ÄÄD&NœÈŸþô'-ZÄÙ³g¹qão½õ–Áû#¼¾JJJ8zô(Û·o¯ëP^8}Û“&ÚÚ­hƒÂó$î˜A�ËåìØ±wwwÌ¢E‹ÈÊÊR®÷ôôäÔ©S,X°GGG’’’(//'44”#Fðþûï̘1cÈÈÈP»méwïÞͶmÛ8yò$ýúõ#00°Zþ‚‚&L˜@dddµu¾¾¾Õ~ Þ±cÞÞÞ¬Y³†={öpôèQúõëÇäÉ“¸pážžž 8�1cƪµžÆŽ«ì„¨l×®]Lš4©Ú¯õºêÕÍÍ�~øAùþÆ� 0@ùÞÓÓ“íÛ·3{öl™|8óçÏ'//???Nž< ÀäÉ“éׯ_µ²LLLªÝ5±sçNµOr¹œíÛ·3~üx˜:u*çÏŸW®ôè2™ŒéÓ§+—mܸ™LF||¼2öüã3bÄ\]] W¦×³¦ýlß¾½²S*:Úµk‡$IäççëW©j(:%¬¬¬�ËåÕ†˜dff²yóf–-[Fƒ ÞNNNXZZªl+%%Eù>??Ÿ¼¼<:v쨶 OOO¶mÛÆ¬Y³pttÄÃÃëׯóÍ7ß0iÒ$Y¼x1ÿýï•y ýL^N§N�¢{÷î5º3îu¤®=©£«ÝŠ6(R~Ù áÇdãÆ�˜››¡±SBWzOOOž|¨ó–óF�1yòdvìØÁ»ï¾ @vv6qqq:tˆ}ûö\¯ÚäææÆÎ�;iÓ¦ [·neé񴀮Æê¬/mªKSSSlllذa�5âÔ©SøûûóöÛoÓ¡C ¢#äĉðÆoðÓO?Ñ¢E •rÕ£õë×óøñcvïÞMYYŸ~ú)!!!,]ºTc<ÏêÞ½{x{{Ó´iSÆ�ÇÓ§OÉÎÎÆÒÒåE¾““Ý»w¯–̘18p€«W¯òÎ;ïðÓO?qõêUæÍ›Ç–-[TÒqàÀºuëÆŸÿügâââX¸p!‘‘‘Ê_õC›6m°±±áòåËDFFòöÛo3pà@�1kÛϪ IOO§qãÆX[[ë—.W¯^¥sçÎ*�rŠ[ÁÝÜÜxûí·õ.K.—S\\Ì­[· cÅŠ*ídΜ9,X°€ââbúôéÃÑ£Gµž3¹¹¹lÙ²…Ý»wÓªU+‚ƒƒñôôdâĉàííÍæÍ›ùûßÿ^£Ïáå­ÒXéjOUéÓnEž'qÇ„ B=WRRBTT¾¾¾tíÚ•¶mÛ*Ǥ&$$(Ó�=wwwlmmiÔ¨OŸ>%::???lmm±±±ÁÏÏOãv M_™$IQXXÈŠ+Ô¦±··§¼¼\yGAvv6¿þú+ƒ R›þáÇ”––2pà@,--éÒ¥ ={öÔË„ ø×¿þÅÍ›7ˆŠŠbÔ¨QÕ.õ­Wmš7oŽŸŸ½zõÂÊÊŠiÓ¦‘““Czzº^ù5©z,Æ�O—.]hÛ¶-Ó§O§uëÖ$''Û·ogùòåôèÑkkkÜÜÜ077W–©î=yò„˜˜/^Œ••ÖÖÖÌ�;—¸¸8�ñ<‹;wîPVVÆŸþô'>úè#–.]Jpp0ÎÎθ¹¹0{ölfÍšU-¿‡‡&&&lÛ¶ ¨¸óÆÚÚšaÆ©¤{ðà¤K—.ìÙ³‡ÀÀ@å-Ô{öì18î°eËæÎ� ÀåË—µÆ¬m?«Úºu+¥¥¥Œ7###ƒcS§¸¸˜�;w2eÊ”jûñË/¿ðÿþßÿ3¨¼“'OâààÀ¬Y³ÈÈȨ6©fŸ>}˜6mß~û-kÖ¬¡iÓ¦ :TcyŠöÓ³gO¬¬¬ððð`æÌ™´oßžöíÛ3jÔ(ågFM?„—Ë�7xøðaµ!wõ�®öT•>íV´AáywL‚ Ôs™™™”••©ürlnnÎÿøGîܹ£\Ö»wïjùÊËËUòU½ÍûYÒWväÈ®]»ÆÉ“'«�cW055eðàÁÄÇÇóî»ïÇ Aƒ4^èvêÔ ™LÆ„ 4h£G�æ½÷ÞÓK“&M?~<;wîÄ××—ØØØjwJ(öWŸzÕ¥rµiÓsss½ž<¡MÕc ¿l?~œ«W¯’ŸŸOFF†ò‰™™™jý‚¨î¥¥¥!—Ë™9s¦òb¸¬¬Œ'OžèŒçYtïÞKKKΞ=‹‹‹ öööLŸ>]ç\ ­[·føðá=z”C‡qáÂ-ZTíׯÔÔTär9ýû÷ÇĤâ+•««+ÿøÇ? ~êKóæÍ•õÖ«W/ â˜ÔÆ~&$$ðÍ7ߨ\Ô†uëÖѺuk• ³²² ÁËË‹fÍšTÞðáÃ6l>$66–õë×cmm�““þþþdgg³oß>LMM gìØ±DFFÒ¥KµeVn?�;w*î±²²*>í©¦Ÿ ÂË%::www½ÿ¾¼®tµ§Êôm·¢ ÏSýn±‚ %%%ÈårÊËËU–›™™i쀊 LucËk+}e}ûöÅÒÒRm@eÆ Sþÿý÷ß+eVÇØØ˜°°0>ûì3LMMñööfñâÅzÅó׿þ• .ˆ³³³ÚI¿jZ¯ºÔ֯ݕ1mÚ4>|Èœ9sذa¶¶¶ÊØ�˜ÔvìÔ£¦M›w•9r„#GŽpìØ1½ï©©-Z°oß><<}8|ø0÷îÝ#33“Õ«WSZZªq›Ui«/CXYYQPPÀ�xüø1§OŸ*:š5kÆàÁƒ $--�ÂÂBª )©zŒLLLðôô$$$„¤¤$ÊËËyðà�^w.hª–.]ª|U�¯*.ü'MšDpp0[·nåÌ™3Ê¡nݺOÇØºu«²Ã ª%K–ðùçŸW›CA¡K—.ØÛÛ“™™É”)Søä“O ÄÌÌŒ™3gÝ»w§¨¨ˆ©S§2þü=yD]ÌÚöóîÝ»Ê'tH’Ä¥K—X±b+V¬àûï¿7xû ¬X±‚•+WÒ­[7ŠŠŠ(**2è¼Õã{÷î]Ö¬YÃÅ‹ÉÊÊ"==�¨¨(âãã•ÃDºuëFûöíY¶lÉÉÉ<|ø�'NpðàA•§±< ]Ÿ ÂËM’$8À|PסÔ)}ÚèþW•hƒÂó&æ˜Aðööæ‹/¾`É’%”••ѯ_?BBBtðññaãÆ�xyyaii‰««+PÑA —ËÉÌÌTùEU[z€÷ߟóçÏ3qâDìììøì³ÏT¶7}útþýïãããömÛª•Ã9öíÛDzeË´ÆžŸŸÏÙ³g åÉ“'tèÐAyQ©.öªš5k¦|2‡&ºêuáÂ…øûû3qâDÚ¶m‹›››A[êª/}uìØ‘ NXXööö ÷ï߯ë0 öªÆ-‚ Ô_¢cB„WŽ\.gýúõ¸¸¸àîîÎíÛ·_ضKJJ�Édddd|XãvŠ‹‹Ÿy/Z]Å­î¸ÄÅÅ1vìXöï߯1ŸŸŸ“&MB’$µëSRR�Éd\¹r¥Öc®k………DDD0a €««+óæÍã‡~ ¸¸˜‚‚‚Z{¼¶ºòþò—¿ “É4¾BCCkeÛ5QXXˆ»»;îîîÖZ¹êê¡  ™LÆÄ‰«¥_»v-2™Ly\jwmK¹\ΡC‡puuUWii)¡¡¡Œ9’Aƒ1}út.]º¤\_VVFtt43fÌÀÙÙ™¡C‡²|ùr|€±±1©©©Ì™3‡o¾ùžøà¬¬¬”iN�:EPP³gÏfçÎ�4lØ�Y³fñôéÓg®¡n899‘�� òòððà/ùK]‡öÂéÛvôi+ú´÷ªtµmPPϤ®A0ÔÝ»wéÙ³'o¾ùf]‡"¼„Ž9‚‹‹ cÇŽeÑ¢E:Ó7mÚ”�;wâàà ²üîÝ»\¹r…Æ�?¯PëÌÍ›7ùñÇ‘ÉdlÙ²###ŠŠŠhØ°á ‹Ã××WùŽ=Êܹsy÷Ýw_X š³k×®ºÃ`Ï3nI’ˆŠŠbòäÉŒ1Bã¯Ñ‰‰‰Lœ8‘?ýéO,Z´ˆ³gÏrãÆ Þzë-Œ��Y¾|¹2½µµ5½zõÂÙÙ™œœÞxã LLLøúë¯16®ø ÍÆÆ///.\HII fffj·½sçNd2>>>Êe;vTIóå—_²hÑ"@@@£F�âäÉ“Œ5ªÆõ#¼}Š““^^^XXXè\_^^ÎÖ­[9qâåååÊ?¢ ºò_¸p�­[·rûömÞ|óM† ÂG}T­î ˜1cC‡¥aÆlÛ¶ €Ó§O3nÜ8–.]ªWýŽ1‚Ó§O“’’BÇŽYºt)={öT{¼4Ŷ|ùrÌÍÍY±b…2í®]»¸víÁÁÁóíÞ½[mܺêÈÓÓGGG.^¼È/¿üBûöíY¾|9×®]#&&†{÷î!“ÉøûßÿN‹-t—¥K—j?Q«;v,GŽáÊ•+*Ä»víbÒ¤IìÛ·Oåx‡„„�˜˜Hvv6­ZµbæÌ™*¿ÊyzzâääÄ?ÿùORRRhÛ¶->>>¼óÎ;zå×Õô©Oum¡2Å-óEEE”––*¿¨š››C\Nž< ÀäÉ“iРIIIü÷¿ÿ%22’‹/’���••C† aÞ¼yÊ2pvv¦M›6ÄÄÄЦMZ¶l©¶<}©+sýúõzÅâêꊹ¹9ßÿ=%%%¸»»3gÎeÙ‰‰‰|ùå—üúë¯4nܘN�:±nÝ:,--qppÀÌ̌ӧO+ëkóæÍ$$$�ŸŸÏ»ï¾ËâÅ‹•mP×ö4Õ«!ôÙ§Êqׯ6ŒŒŒ Ñ™ÎÊÊŠ””åûüü|òòòªuT–““ƒ……–––ÊeŠ «ÊåÊår­CRŽ=ª5ÆÛ·osçÎ\\\”ËLMMõÄüù󉎎¦wïÞÌŸ?ŸüüüjÛÔÛСC9wîœÊ¼ ñññ 2Dk>MqëªãÜÜ\¶lÙÂÇÌ¡C‡hß¾=žžž¤§§Äž={ÈÈÈ`óæÍzC4jԈɓ'« ÛÈÎÎ&..Ž>ø@%­©©)666lذ�ýû÷3bÄüýýIKKSÙŸ°°0,XÀ¡C‡èÕ«—²ƒFŸüºÚƒ®úõm¡²·ß~›F�‘œœŒ»»;_|ñ…Ê\-•¿0:99ñá‡аaC±±±aÈ�!ÈåröìÙ£ì�Rˆ��%""ssslmm5–gˆªeêKLL ñññØØØ�››Kdd¤r õ½{÷ðöö&++‹qãÆáä䄹¹¹ÊÅqeË–-cÿþýØÚÚâààÀùóçñööVù²¯m{µQº¶QUmmÓsæÌáøñã¬\¹’ƒ²`Á>úè£j‰r¹œÂÂB®^½ÊÚµkY±b¦¦¦˽zõ*�;wÖ8´&//�üü|LMMY¼x1ŽŽŽŒ=Zež™û÷ïÓ¼yójwBuèÐAãwC?£ôý잟èèèjŸßõYÕ¶£O[©)]í_´AáE3Òñ2Vój@Å&€é﯆¿¿ýþ²ÿþjXÍ€æ@ à à- %Ðhtºz–A¨uOŸ>•  %''+—JÎÎÎÒéÓ§%I’$) @%_qq±doo¯’¯¨¨H²³³“ÒÓÓÕnëóÏ?—>ýôS•eêÊ.((�úöí+=xð@¹ì矖† ¦×ú§OŸj�MWþPÚŸ= IDATÔÔT©oß¾Ò½{÷Ô‡‡tèÐ!iÍš5ÒôéÓ¥§OŸ*×………I¾¾¾Ê÷úÖï¡C‡”ëËËË¥1cÆH¨¶mm±K”þõ¯I’$I999’½½½TPP sŸªÆ­«Žq\k[-**’†.9rDcšÔÔTÉÎÎNš3gŽôÃ?HyyyÒéÓ§%{{{)11Q’$I:|ø°4nܸjy�?.�1Bm¹†~Féúœ¬kÚŽñgî•úþ#ãFSû®_¿. >\*//¯ëPžCÚ©º¶£O[©JS{¯JWûmP?ÀŸ¿výÃïײ¿¶móûµî[¿_û¶øýZ¸ÙïׯM*]/[TºŽV\W+®³×Ý 4\›ëºž¯ub(‡ µ"33“²²2ºwï®\fnnÎÿøGîܹ£\Ö»wïjùÊËËUòU½Q_UËNKKC.—3sæLåú²²2ž¡sçθ¹¹UK§˜«¢6U-SßX*31QýÚÓ¢E öíÛÇÞ½{ùþûïùî»ï8sæ ;wî¬67‹¢¾ß{ï½jó˜(ž(¢k{š4nÜsss²³³‘$Iå|W|�WÌcQÓm¼(éééÄÆÆròäIÞxã  ¢£kñâÅ|ùå—¬]»V%½‘‘ÖÖÖ̘1ƒ””ªuLìÝ»—sçαwï^4h qÛŠí):k:tèÀùóç�Љ6óòòxüø±JÊÊÊ¢U«V5Þïª�†|N µ'//�3gÎ(碪ï4µ}ÚJMèÓþE4]‰‚ Ô ŒŒŒT.jär9ׯ_§k×®óµk×®Z¾ÚÒºuk7nL|||�Ö«Û'Cò+ØÙÙñé§Ÿ²}ûvâããUÆP¶iÓ†5kÖ°k×.Tò)Û¨)–ªõûÛo¿Uû2–œœ¬õ‘‹šb0`™™™üúë¯üôÓOÕžX¡mŸ*Ç­oB×q©)+++FŽÉÉ“'ñôôT›æÆ�äææ²`Á:w…·nÝRN&©‹®üºÚCmÕgii)ׯ_¯¶ þï «â‚·ò%W¯^¥¸¸˜зo_š7o¨sMÔ•÷,ž%–ÊÞzë-.\HLL S§NE.—séÒ¥jé:uêDƒ ¸yó&-Z´ C‡Ê—¶ÎÁªÔÕƒ‘‘¶¶¶pàÀåò{÷îñÏþ“7ÞxCcÇDM·ù¼(¶Qù"àøCµ»Yª233«6¿Ç‰'gãÆ�X[[kÍollÌ€”“•*ܹsG9¾ÝÖÖ––-[rêÔ)åz¹\Î÷ß_ëcе}N ÏGll,öööÊϱúL[Ûѧ­Ô„>í_´AAÑ1!B­°°°`Ô¨Q¬[·ŽëׯóèÑ#6lØ€••ýû÷ךïý÷ßgíÚµ$''óÛo¿±iÓ&•4>>>ìÞ½Ûà˜LLLðôô$$$„¤¤$ÊËËyðà�ò‚L×z]±éÊŸ——Ç‘#GÈÎΦ¸¸˜Ë—/cnn®¼€Rèß¿?sæÌaÅŠ¤§§вeK®\¹Â½{÷(**Ò«~“þøã�<~ü˜ˆˆ •è+×£®ØÌÌÌ4hëׯçÝwߥI“&zå«·®:ª }ÎMt�K³gÏ&""Bã3+++åÅããÇ�•_êô½hÔ•ÿYÏ9}÷ýâÅ‹xzz2|øpæÌ™ƒ‡‡^^^Œ?€nݺ('á,))¡eË–@Åä‹ëׯWvàè󫽺òžÅ³Ä¢ðŸÿü‡I“&ÌÖ­[9sæ €ÚÎTkkkÆŒC^^Ó§O'""‚Õ«W«<òTšêáþç066&00�3f°xñbþú׿RXXˆ��Oµ/úµ±Íç¡[·n´oßžeË–‘œœÌÇ9qâdÈ�!@Å£x׬YÃÅ‹ÉÊÊ"==�¨¨(âããUn7OHH`ÅŠ¬\¹’nݺQTT¤|’ŒBÕ6íááAtt4ÑÑÑdggóÝwßqüøq&L˜T\�M›6�ÐÐPxðàëÖ­ÃÄĤÖ.Šôýìj—$I8p@Lz‰~mGW[ÑWå6¨OûmPÐäåºÿO„Wš··7_|ñK–,¡¬¬Œ~ýú¢ó µ��7nÄËË KKKå³²���‘Ëådffêü¥L“3fаaC6lØÀýû÷±²²bêÔ©ÊÛ´u­¯ÛÈ‘#U.BµåÏÏÏçìÙ³„††òäÉ:tè@`` Ú_W§OŸÎ¿ÿýo|||رcï¿ÿ>çÏŸgâĉØÙÙñÙgŸé¬ß&Mšàêêʺuëøí·ßèÝ»7ááᘚšV«G}b:t(‹/& @¹LW>uqëªãšÐu\ÔÑç\jÖ¬™Ê#C«êر# , <<œ°°0ìííûÞ¡C&OžLRR7oÞ¤Aƒ¼ýöÛLžË6kbéÒ¥Ê@9ÍÍÍ�Õ«WcjjÊæÍ› cÉ’%äççcccÃìÙ³7nPñYÕ¬Y36mÚDVVfffôèу͛7«Ìï±råJär9>>>*1Ìœ9“yóæ©mÓ2™ŒÀÀ@¶mÛFhh(�:ubãÆ�*��|ð’$±yófrrr°³³#""BëA aÈg¿P{ŒŒŒÄŽßéj; _[ÑÕÞ«¶A}Ú?ˆ6(¨÷\fÔÔ£\uë+Ïð©ø×XÍûÊiªÎZõ)Æüßl£Š›I’tÁ€}áËÉÉaذaœ?^ü1€§§'îîîŒ=ºVÊ»{÷.&LàôéÓÊ;&„O´áEJKK£C‡u†ði;ƽg}M£Nüà×öG%B´Óן‘‘‘=ð(Ê*ý+ÿýÿòJ/©ÒKñžJï©´¬ê{©Òÿ+Ó<³~ë &†r‚ðÒIII¡]»vâ"¬ŽÅÅÅñÞ{ï‰N‰:&Úƒ ‚ ¯;Ñ1!B�»sçñññ�––Fhh(uV½wêÔ)ƒ†)µC´AAê1Ç„ u.??ŸíÛ·ãççGË–-qwwW‹(¼xéééܺu GGǺ¥ÞíA„ºbÖÈù½1”C„KÌ1!‚ ‚ bìz} Žñ«OÃן˜cBAAA᪗C9ÒÓÓ‘Ëåº ‚ ‚ Ô3iiiu‚ðœ‰cüêÇðõ¥x|˜K—.±oß>Œ��±´´¬ë�jݶmÛÈÈÈ`õêÕuŠA^†¸oܸÁgŸ}Fff¦^|©©©$&&âààPmÝŽ;žGˆÂsШQ#ºvíªü?ÀªU«8yò${÷îÅÖÖö™Ê/,,¤oß¾lܸ±Úv’’’øì³Ï(--UÛ)`llLjj*sæÌ¡S§N¤¦¦òÍ7ßðñÇóÕW_éŒA’$xúô©Êò²²2ððð`ñâÅäää°víZüýýÙ´iS ÷Xx899‘�� ²lÓ¦M;[_gï¼óqqq*Ëär9|ðnnn@ÍÚ ¾yôùŒuDÇ„ Â+êîÝ»ôìÙ“7ß|³®C^BGŽÁÅÅ…±cDzhÑ"�é›6mÊÎ�;«uLܽ{—+W®Ð¸qãçªP‹Œ��Ùµk×s+¿¨¨ˆ&Mš`nn®v½$IDEE1yòdFŒ¡ökccc–/_®|ommM¯^½pvv&''‡7ÞxCk ÑÑÑUëd111áë¯¿ÆØ¸â†`¼¼¼X¸p!%%%˜™™º»Â+ª¤¤„£G�²}ûöºå…366¦I“&*Ë.\¸€‹‹‹2�¡mPß<º>#AÑ1!‚PËär9»ví"66–G�ѧO|||hÓ¦ P1taÊ”)ÄÆÆòóÏ?D¿~ý(//gË–-œ8qI’pvv&11‘ÐÐPÚµk§²�5kÖpðàAŽ;F—.]Ø»w¯Æ²KKK ã»ï¾ãéÓ§899áåå………€Îõååålݺ•'NP^^ÎÀ�UâÑ•ÿÂ… lݺ•Û·oóæ›o2dÈ>úè£juWPPÀŒ3:t( 6dÛ¶mœ>}šqãÆ±téR½êwĈœ>}š””:vìÈÒ¥KéÙ³§Úã¥)¶åË—cnnΊ+”iwíÚŵk×Ö˜o÷îÝjãÖUGžžž8::rñâE~ùåÚ·oÏòå˹ví111Ü»w™LÆßÿþwZ´h¡ó¸,]ºTû‰ZÅØ±c9räW®\áÝwßUÙçI“&±oß>•ãBbb"ÙÙÙ´jÕŠ™3gò—¿üE™ÆÓÓ'''þùÏ’’’BÛ¶mñññá�wÞÑ+¿®ö O}ªk †’Ëåìܹ“ãÇ�óàÁ:uêÄìÙ³0`ÿýŒäâÅ‹dggceeÅ�!C˜7ožòB¸°°��7’��€……Íš538\]]177çûï¿§¤¤wwwæÌ™£’ÆÌ̌ӧOãççÇÉ“'˜„„„pñâE6nÜÈÖ­[ÉÍÍÕ8‡ƒ¯¯/Œ9’¤¤$öîÝ«µìõëד••ÅîÝ»ùꫯÈÌÌT¹xе>44” .Lxx8EEE*ñhËŸ——‡··7£F�âØ±cãìì\mŸÊËËY¶l¶¶¶|øá‡xzz2sæLÜÜÜHJJR^hëS¿AAAÌŸ?Ÿèèhz÷îÍüùóÉÏϯ¶Mm± :”sç멆 Ï�!C´æÓ·®:ÎÍÍeË–-|üñÇ:tˆöíÛãééIzz:AAAìÙ³‡ŒŒ 6oÞ¬÷q1D£F�˜·ê«¬¬,þùÏâîî^m�¡mPŸ<†~Fˆ6(}Z’$Iòðð�TòKööö*ùŠŠŠ$;;;)==]í¶>ÿüséÓO?UY¦®ì‚‚©oß¾Òƒ”Ë~þùgiذaz­úô©ÖØtåOMM•úöí+Ý»wOí~xxxH‡’Ö¬Y#MŸ>]zúô©r]XX˜äëë«|¯oý:tH¹¾¼¼\3fŒtàÀ�jÛÖ[qq±4pà@é_ÿú—$I’”““#ÙÛÛK:÷©jܺêH÷Áƒ•ïoܸ!ÙÙÙI999ÊeQQQ’»»»².ô=gæýöî=.ª:üø P4/”(*^(]3PÓÅ[–—’²ÖUT4/¬_7dÁ/ÑÐÖÀ¦«FTÚ&¥›šZ�¡abè¹&W …墀ÀÌüþ ™ÃÌpQTÞÏǃÌ9çsÎû|>ç3Ìç3çó9K–¨>ýôS�±ªT*•¿¿¿jûöíªââb•«««êâÅ‹*•J¥Ú°aƒêÿø‡J¥R©&L˜ JLL¬sÓ¦MSýûßÿ®ó|²³³UNNNªÿþ÷¿ÓªÆægͺ ËÌ™3UNNNª‚‚‚Zë®]»¦rqqQ͘1CUQQ¡R©Tª¨œœœTÞÞÞ:÷—••¥rvvVÍš5K¥R©Tééé*'''ÕóÏ?¯ÙGhh¨ÊÉÉIµ}ûv•J¥R«œœœT3f̨µ¿   •“““*!!A¥R©T#GŽT999iêÉÎ�;UNNNšrRo3vìXÍk•“““*55Õ`~\¹rEïúÿþ÷¿ª_ýUUXX¨JMMUýýïW�3Fuýúu�Û�;V{M_}õ•ÊÉÉIåä䤚4i’ÞkT¥R©öíÛ§3fŒ¦¬fÏž­:qâD�Û—––ª&Mš¤úòË/ëܦ¾õÎPÝ¿è+ã'æG«\Þɺ‹Ñ4½””Õ¤I“T …¢¹C¹c ÕÓê6mÚ¤òññѹ®¾uИ4õ}�h‰uÐÀÓ´]û£-ûèmÛn´u;ÿÑöíôG[¸ÃmãvÕÚËVÕÚÑêvµº�­nw›ÕÑ67Ôžor2”C!šPvv6•••<þøãše–––<ñÄ\¹rE³làÀ�µÒ) ­t5oI6VÍ}§§§£T*™?>&&UÿK*++¹uë–Që³²²ôÆf(½ƒƒÎÎÎ̘1ƒ‘#G2mÚ4† ¢ã—_~É… 8zô¨ÞqàÆæ¯:u¬Ôú6^M_lŒ5Š“'O2`Àâââ6lmÛ¶5Ꜫ3”GºòµW¯^@Õ·OÖÖÖšxÕOZ0T. Ñ®];^~ùevïÞ�¿¿?‡ÒÂQ]AA‡&))‰ââb²²²j=‰¤z<ݺuÃÒÒR¿¾ô†êƒ±ùY³.Ô×¥K—P*• 6ŒV­ª>2M˜0�wÞyGë)8)))|üñÇœ?žÂÂBT*•æ)¿ýöC† ÑìcðàÁ|òÉ'µŽ§Ò3Q_õkºcÇŽšz2`À *?ïõu о}{‚‚‚xñÅ9~ü8¯¾új½ö5iÒ$ž}öY®_¿Î¡C‡ ÅÆÆ†Ñ£G×Ú6''‡ððp¼½½� Œ­­­Ö!]êSïê[÷ÅÝ·ÿ~ÜÝÝý~ø (//'&&†àà`�ëëS�MÓ�÷©ƒ¤cB!šTyy9J¥…B¡õ�ÖÜÜ\oƒ»²²R3º©?L=ôÐCDEEéü@oh}EE…ÞØ ¥755eË–-$&&rðàA|}}qvvfÆ šm\\\¸rå Ÿ~ú)^^^užKCó×ÌÌLç­Ü†b7n;vì`É’%ÄÆÆ2~üx£Ï©>yd¬ê�SCåÒPþóŸyá…X¿~=nnntîܹÖ6¥¥¥Ì�;777-ZD×®]Y°` …¨ø ¥7Tš*? Q�©~^·o߯ÄÄD3†:''‡… bkkËêÕ«éÕ«—fæ{@3ÄHßä¡mÛ¶ÅÒÒ’ÜÜ\T*•V9«;Ôs¨Ô¤îìh.­[·¦oß¾õzÔgu&&&ØØØàééIjj*qqq:E;vì ¤¤„   M#K¡Pàç燙™ÿú׿´æâ‰ŽŽæûï¿'::33³ÅV=FµúÖ}qwqâÄ ÍL-Ý‘#GèÔ©...uncllhšÆ¾G¨�§&uðÁ%]‰BÑ„ììì011ÑŒ?‡ªñ˜)))šGøéÒ£G�Z隊­­-mÛ¶%66¶Aëu�S}Ò«999ñæ›o²k×.bccµžiÞ­[7‚‚‚سgO­G¾UVVê�¥fþÞ¸q£Ö‡Òäädz÷î]ïØFŒAvv6¿ýö?ýôS­'Vè;§êq›Gõa¨\ÊÚÚš)S¦pôèQ<<܉üÔÅÁÁ€“'OR^^TMº¦R©4O„HJJ¢¬¬Œ#FàââBÇŽ�ÿ_þ={ö >>^³�_~ùEë8&&&8::róæM>ûì3Íò«W¯òÃ?ððÃ×Ù1a uç…®yVK©TòÛo¿iγ1ÌÍÍëœxoíÚµœ={–ü‘„„èß¿?!!!$$$huJ9r„íÛ·³qãFlll—.úê¾h>‡bøðáŸìÒRìß¿Ÿ—_~Y«a¯�¾:ØÐ4MùQ�ÔÁ�tL!D²²²bêÔ©“’’B~~>aaaX[[3lØ0½éžþyÖ­[Grr27nÜ`Ó¦MZÛøùù±wïÞzÇÔªU+<<<'!!…BÁï¿ÿNJJŠQë Åf(}QQ_~ù%¹¹¹”••‘˜˜ˆ¥¥¥¦§6lØ0-ZÄš5kÈÌÌ K—.œ;wŽ«W¯RZZjTþ¶iÓ†ääd~üñG ‰ŒŒ¤¤¤D39Võ|4›¹¹9#GŽ$44”ÁƒkÁf(]͸ åQCsÍÔÅе´páB"##ëœÑÞÚÚZÓˆ.,,äøñã@Ýßê×7}c¯¹†œ{`` +V¬Ðü|÷ÝwôîÝ›áÇ“��ͬY³X½z5ëׯÇÜÜœùóçUe UR†††j:sÔ�}ûöeРAddd0{ölüýýu>ÂÍ­ IDATðÿþïÿ055eýúõxzzâããßÿügJJJðóó3ºa¡Kß¾}4‰ª;HbýúõÄÅÅqíÚ5._¾L`` …BçcAë’‘‘APP§OŸ&''‡ÌÌL¢¢¢ˆ��ÕvÑ�÷¼¸¸8Ö¬YÃÚµkéÛ·/¥¥¥”––jMŽÛƾŸ‰»O¥RñÙgŸÉ¤—øù矹rå “'O®µ®!uÐØ4Mñ¡�ÔÁ— åBˆ&æëëËûï¿Ïßÿþw*++:t(ááá~~~lܸoooÚ·o¯ù'njjŠR©$;;»ÁßþyzzbaaAXX×®]ÃÚÚš9sæh¡ih}ÍØ¦L™¢ÕÕ—¾¸¸˜o¾ù†ˆˆnݺEÏž=5�»šæÍ›ÇÏ?ÿŒŸŸÿüç?yþùç‰��ç•W^ÁÉɉ÷Þ{Ï`þ¶k׎ &Ì�78p Û·o§uëÖµòÑ˜ØÆ����o½õ–f™¡tºâ6”Ç a¨\t1æZêСƒÖ#CkzôÑGY¶lÛ·ogË–- >œ1cÆ·1éõÕ0|ÍÖ÷ÜkÞ©£ÞϺuë4�6���gÀ€üíoÓtÚ899áééÉçŸÎáÇ=z4vvvZ�$!!!‘˜˜ˆ……!!!„††joРAìܹ“­[·’––Fff&ýúõãµ×^Ó[Ƙ1ciiiÄÅŃ««+ýúõ«÷~”J%�;wfëÖ­deeñÐCñÔSO©yL+T=ªöĉš×êáY'NäÝwߥ]»vtèÐ�M›6‘““ƒ¹¹9ýúõcóæÍš;Qúž·víZ”J%~~~ZËçÏŸÏ’%Kê}Î5ÕçýLÜ]&&&2„£šýû÷3iÒ$M‡zu ©ƒÆ¦1æ=¢1¤>¸îÈŒšFìW×úê3|ª›êx]}›š3†Ö|ʇ)ÿ¶Qõï*•êT=ÎE!šE^^Ï>û,ñññò·<<!„.é˜Bˆ{Ä•+Wˆ��åæÍ›¤§§ÁìÙ³›;¬ï믿®×0Ñ4¤>!„-‡Ì1!„÷ˆââbvíÚE@@]ºtÁÝÝ�éÓ§7wX-Zff&iii¸ºº6w(-ŽÔ!î>ó6–(¯þÈP!ÄÝ%sL!„B@Æ®·RÆ÷?)ßÌ1!„B!„BqµÈ¡™™™(•Jà !„B´0éééÍ‚¸Ã¤ŒïR†.õc±[šÙ1agg×Ü!!„BÜsäñŸ”ñýOÊP<ˆZfwŒB!„B!î Ò1!„B!„Àyi ÎKcš; !D $B!„BÊËJ1µuiî0„-�tL!„B!„¢ÙHÇ„B!„B!š�tL!„ÐI©TÊØ±cqwwçòåËwíØååå8;;“••Õè}yxxðÅ_Ôyœ²²²FCŸW^y…Ý»wßÑcè;Ç;©!ùg(Ö7nÄÔ©S1bS¦LaÍš558&]ËîF¹Ôå/ù ÎÎΚ777/^̹sçîØ1¿ùæœ��‰ŒŒlô¾”J%`„ œ9s¦^i³²²xæ™gøæ›oj­;r丹¹±|ùrrss«hY.\¸€——nnn<÷ÜsMr½ß¯ê[Ÿ’““yýõ×™8q"ãÆ�# €üü|ÍúÊÊJöïß�§§'nnnŒ?ž•+Wòûï¿ßéS-„tL!„Ðé‹/¾àìÙ³|úé§ìر{{ûæ©Éíܹ“·ß~ûŽÃÕÕ•ÇüŽ£¹4uþ•——ó׿þ•òòrþñ�pðàABCCyüñÇi×®]ƒcÒµì^(—1cÆ0vìXÌÍÍ9{ö,ÿ÷ÿwW;"!!�™3g¥Õh1†J¥â­·ÞâöíÛµÖ}ýõׄ„„°páBvïÞ�…… ,й­º$%%áïïÏœ9s8rä{öìÁÙÙ¹¹Ãjõ­O•••¼õÖ[Œ7Ž>ø€°°0.]ºD`` fSSS.]ºÄ¢E‹øä“O äÖ­[,_¾ün�–xÀµjî„BÜ›222èß¿?�<òHs‡r_óòòjîî/^$++‹èèhÌḬ̀¶¶¾#÷B¹¬ZµŠ: T*Yºt)gΜá»ï¾£W¯^ÍšN*•Ѝ¨(fΜÉäÉ“™0aB½Òïß¿ŸÒÒRk­ûàƒxýõ×yæ™gxë­·˜:u*G�eêÔ©M¿x°EFFâëëËСCèܹ3�;wn樚G}ëS«V­øøã�15­úÎÚÎÎoooþö·¿Q^^޹¹9¦¦¦¬\¹R“ÆÆÆ†àææF^^?üðÝ99ñÀ’Ž !„¸Ï(•JöìÙáC‡ÈÏÏçÉ'ŸÄÏÏ�nݺU·ÊÏš5‹C‡qþüyBBB:t( …‚­[·räÈT*nnnœÿüs¾úê+z÷îMttt�û®¨¨`Ë–-;vŒÛ·o3zôh¼½½±²²0¸^¡P°mÛ6Ž9‚B¡Ð|˜R3”þÔ©SlÛ¶�Ë—/óÈ#�0nÜ8–.]Z+ïnÞ¼‰§§'ãÇ�Ç‚�;wpüøq¦OŸÎŠ+ŒÊßÉ“'süøqRSSyôÑGY±býû÷×Y^¸»»3mÚ4ÍkWWWNŸ>ͯ¿þн½=+W®äÂ… ÄÄÄpõêUœ��Yµj�:ujÐ1uÅ /}C®©ÔÔÔZù·|ùrÂÃÃ9yò$¹¹¹tíÚ•ùóçóÜsϧB¡àöíÛ\½zµÖ5©¦ïZØ»wo­˜lmmu–³®r=z4?üð©©©tïÞ??? ¤‰M_ý1öÔÅÔÔΜ9CEE¥¥¥lÞ¼™¸¸8Š‹‹>>tëÖ�ÿýïìØ±ƒÓ§O“››‹µµ5ãÆ�cÉ’%˜››PRRÂÆ�‰‹‹ÃÊÊŠ:‹>&&&„‡‡7(mvv6›7ofË–-¬_¿^kÝåË—¹rå cÇŽÕ,kݺ5cÆŒ!66VgCª!õ¨1e$îmÅÅÅüüóÏDDD4w(Í®!õ ÐtJ¨Y[[£T*Q*•u+//+++Ú·o¯s½ÔSQ2”C!î3‘‘‘œ8q‚õë×…¹¹9‹/Ö4hüýýquueÇŽ<ùä“„‡‡súôi6nÜȶmÛ(((¨sfϞ͔)SHHH ::Zï¾CCCÉÉÉaïÞ½|ôÑGdggk5` ­�ˆˆàÔ©Slذ�íÛ·SZZª�¾ôEEEøúú2uêT¾úê+6lØ€››[­sR(¼ñÆ8::òÚk¯áááÁüùó™8q" ¬X±Âèü ÁËË‹ýû÷3pà@¼¼¼(..6ªü غu+Ë—/çÀ�ØÛÛãááAff&!!!|øá‡dee±yóf­t�9¦¡ô ¹¦tå_ëÖ­±³³#,,Œ}ûö1yòdIOO7*ÆЧO^{í5öìÙ£sL´¾kAWLu•sMlÙ²…eË–qàÀ ÀŠ+4y ¯þ{ ÖåÒ¥K|ýõ× <€7Þxƒ}ûöáèèȨQ£ˆ��Ç××¥R‰……'OžÄÎÎŽqãÆ¡T*ùðÃ50«W¯&&&†Î�;Ó»wo’““�ާ©©‡pLœ8‘?ýéOµÖ_»v�Ž;Ò¶m[­å={ö¬s\|}ëQcËHÜÛ®]»FçÎ�ùöÛoy饗pssÃÇǧÞÃ� ©Oº$%%Ñ«W/Ú´i£µ\©TRRRBRRëÖ­cÍš5´nÝZç>¤žŠú�Ž !„¸�”——…¿¿?}úô¡{÷îšqžqqqší¦M›†»»;ŽŽŽ´iÓ†Û·o³ÿ~pttÄÎÎŽ€€€ÅPsß·nÝ"&&¬­­±±±añâÅ|÷Ýw×———³oß¾:c3”þúõëTTTðÌ3Ïо}{z÷î]ëN•JEHH%%%¬Y³¦Ñù»jÕ* „�� ÞÞÞtêÔIÓ°4¤cÇŽп¬­­™={6óçÏÇÞÞ{{{¦N�JRR’VºÆS_ú†^Suyùå—éÝ»7Ý»wgÞ¼yØÚÚÝ(677g×®]üùÏ&::š)S¦@ZZ`øZh u¹ 0kkkæÎ�K^^™™™ë�1× .cÇŽÅÙÙ™W_}•_ý•™3gâââBZZñññ¸¸¸F`` ®®®¤¦¦’••…••äý÷ß'00�ÈÈHLLL8uêP5 +66–®]»²gÏ6lØÀ«¯¾ÚèûŒ_ý•¿þõ¯:×߸qƒ‡z¨Öò:PPP 3M}ëQCËHÜŠŠŠÈÊÊâôéÓlݺ•ÇciiIXXXs‡v×5¤>ÕTVVÆîÝ»™5kV­uG�eÔ¨Q,X°€¬¬,½�?ROE}ÈP!„¸�dggSYY©5æÞÒÒ’'žx‚+W®h– 8°V:…B¡•®æm›Æª¹ïôôt”J%óçÏÇÄĨšHëÖ­[F­ÏÊÊÒ›¡ô8;;3cÆ FŽÉ´iÓ2dˆVŒ_~ù%.\àèÑ£š[Ýu16Õq¨c8p ÑwÔEGGóý÷ßkMB\“‰‰ 666xzz’ššJ\\\�†H=j2”C!î#vvv˜˜˜ðÓO?i–)•JRRRèÓ§O�ézôèQ+]S±µµ¥mÛ¶ÄÆÆ6h½®sªOz5'''Þ|óMvíÚEll¬ÖXÚnݺÄž={´†'@U£S_,5ó÷Æ�š‰AÕ’““éÝ»·Þø£±ÇÔ—¾¡×”Zõü»xñ",[¶Œ^½zaeeEZZZ£žsoffÆ#�<‚………Ñ×Bõ˜ô-3–±õGß5X333/^ À¦M›P*•888`ffÆ/¿üB§N�èÙ³§æÇÜÜœ¤¤$ÊÊÊ1b...tìØQë{öì @||<åååüòË/ >ÿÆX»v-gÏžåÇ$!!�„„ú÷ïOHH ôèÑGGGºté¢54I©Tòí·ß6ùøò†”‘¸÷™››3}út‚ƒƒÉÏÏçöíÛDGG3~üøæí®kL}:räÛ·ogãÆ�ØØØu†ŽÙ±cG²³³Q©T:cЗ¾¡×”®ü³¶¶ææÍ›|öÙgrüøqÍÓ= ÅúŸÿü‡°°0ÈÉÉ!##ƒ;vpñâEÆ�gðZÐS]ËêÃÐ5jè4tMŒ?GGGþûßÿòÅ_`ccà /¼@QQóæÍ#22’wß}ÍùÄÄÄЇ‡€fØFß¾}4hÌž=víÚUïón¨úÖSSSæÎ�KDDqqqüþûïkîši ƾOˆû×Ò¥Kyì±Ç˜5k/¾ø"666,Z´¨¹ÃºëŒ­O5ëi\\kÖ¬aíÚµôíÛ—ÒÒRJKK5w`eddÄéÓ§ÉÉÉ!33“¨¨(bcc�~ò’!RO[6Ê!„÷___Þÿ}þþ÷¿SYYÉСC 7xû¿ŸŸ7nÄÛÛ›öíÛ3a êCŒR©$;;ÛèoHjòôôÄ‚°°0®]»†µµ5sæÌÑLZeh}ÍØ¦L™¢Õ˜Õ—¾¸¸˜o¾ù†ˆˆnݺEÏž=Y¿~½ÎaóæÍãçŸÆÏÏ�þóŸ<ÿüóÄÇÇóÊ+¯àääÄ{ï½g0ÛµkÇ„ æÆ� 8�íÛ·ÓºuëFçc]ô`æÌ™qùòeBBBjÅ`(}C¯)]ù·lÙ2¶oßΖ-[>|8cÆŒÑJ£/VõmÇêrnÓ¦ ýúõcÛ¶mš» ]KºbÒµ¬¾ôÕ}× 1ׄ‰‰ ^^^¼þúëlÛ¶�‰'âëëK—.]8|ø0{÷îÅÎÎŽþýû£R©prrÂÓÓ“Ï?ÿœÃ‡3zôhììì´:hBBB "11 BBB ­÷y×´bÅ Nœ8¡y­5qâDÞ}÷Ý×�—^z •JÅæÍ›ÉËËÃÉɉÈÈÈ:gû¯¯ú¼Oˆû“™™Ë—/×ÌÕÒ’ªOºêéÚµkQ*•øùùiíkþüù,Y²„víÚÑ¡C6mÚDNNæææôë×�Í›7ãèèØ$qK=mÙ b½3ûÕµÞ¤ÚrõoS¯«ocZ-�úµúÇì�ß­þø[ý»ƒJ¥:U�sBˆR^^Ï>û,ñññòO¿<<ùä–/_ÎG}Ôt'(HÒ1!„âž•‘‘Aÿþýyä‘Gš;q\¼x‘¬¬,¢££133ÀÚÚúŽt xyy5ù>ëkÕªUtèÐ¥RÉÒ¥K9sæ ß}÷Ý=Û1‘ŸŸÏ±cÇøúë¯éС6l`òäɤ¥¥áèèhÔ65©T*¢¢¢˜9s&“'Of„ :�¿{÷nœ��ñóóÓ,{ôÑG›þDÅ})22___† @çÎ�éܹs3Gu÷ÝÉúTZZJ»ví°´´Ô¹ÞÔÔ”•+Wj^ÛØØ0`ÀÜÜÜÈËËãᇮÿ ‰C:&„BÔ›R©dÏž=:tˆüü|ž|òIüüüèÖ­Pu»þ¬Y³8tèçÏŸ'$$„¡C‡¢P(غu+GŽA¥RáææÆÉ“'‰ˆˆ G�ZÇ âóÏ?૯¾¢wïÞDGG׹ ¶lÙ±cǸ}û6£G�ÆÛÛ+++ƒë Û¶mãÈ‘#( žyæ­x ¥?uêÛ¶mãòåË<òÈ#Œ7Ž¥K—ÖÊ»›7oâééÉøñã±°°`çÎ�?~œéÓ§³bÅ £òwòäÉ?~œÔÔT}ôQV¬XAÿþýu–—¡íRž©©©µb_¾|9áááœÍ¯¿þн½=+W®äÂ… ÄÄÄpõêUœ��Yµj�:uŒ¯ÇâÞR\\ÌÏ?ÿLDDDs‡ÒìîT}‚ª÷•º:%ê’——‡••U�wøàºuëÆ‡~ˆ——䡇Ò™Ÿú¶oHy:Tgìvvv„……ѦM¾þúkùÓŸþDÏž=uÆUÝ€èÓ§¯½ö¯¾ú*“&MÂÆÆÆèrðððГ®e5°eËvïÞM·nÝØ¶m+V¬àСC´nÝZïµklù×åÒ¥K|ýõ× <€7ÞxƒÓ§O3jÔ(Ú¶mËÑ£G¹ví~ø!œ×®]£sçÎ|ûí·lݺ•üü|žzê)d¨� ©OPÕ1ñÕW_‹……úÓŸðòò¢oß¾ZÛ)•JÊÊÊHKKcË–-¬Y³Fó¿¤&©§BM&¿BQ/åååDEEáïïOŸ>}èÞ½;���ܺu‹¸¸8ÍvÓ¦MÃÝÝGGGÚ´iÃíÛ·Ù¿?8::bggG@@@ƒb¨¹ï[·nƒ��ÖÖÖØØØ°xñb¾ûî;ƒëËËËÙ·o_�±Jýúu***xæ™ghß¾=½{÷®u÷‚J¥"$$„’’Ö¬YÀ,^ IDATÓèü]µjƒ ÂÆÆooo:uê¤iÜêR×ö -Ϻ¼üòËôîÝ›îÝ»3oÞ¼óÎ;ܸqƒüü|BCC±³³£°°Ðèmâúõë¼÷Þ{¼úê«:tˆeË–±iÓ¦:'ëS—iÿþý±¶¶föìÙÌŸ?{{{ìíí™:u*IIIšc4¤Eó+**"++‹Ó§O³uëV>Œ¥¥%aaaÍÚ=©!õ à…^à“O>áàÁƒDDDЪU+-ZÄ�7´¶;zô(£F�bÁ‚deeÕ9ÏH=ÿŸÜ1!„¢^²³³©¬¬Ô÷oiiÉO<Á•+W4ËX+�B¡ÐJgjÚ°þñšûNOOG©T2þ|LLL€ªoioݺeÔú¬¬,½±Jïàà€³³33fÌ`äÈ‘L›6�!C†hÅøå—_ráÂŽ=ª¹Ý^cóW‡:Ö�’žž^ç~ëÚ¾¡åY—‚‚>LRRÅÅÅdeeÕëÉVVVxxx0sæLââ∎ŽfîܹìÞ½›ÊÊJ½åÐXÕ˼[·nXZZRRRbðÚ5¦üu=z´¦SÅÒÒ’åË—hò=!!ggg­4ê§“¤¤¤ðñÇsþüy Q©Tš†ÿo¿ýÀ�!ChÕªê£ÞàÁƒùä“Oꓵ˜ššBPPÓ§O§S§NÌ™3ОüÎÐ6 ¡¾ |Ô¨Q¸¸¸U;‰‰‰;v¬ÖЫê1«©çî())Ñ|‹îàà@II‰æï†”£h~?ü0 …ÍPƒ… âééÙ̑ݛZŸªÏÓ¾}{‚‚‚xñÅ9~ü¸Vçç¤I“xöÙg¹~ý:‡"44F�­s¿ROHÇ„Bˆz*//G©T¢P(´>L˜››ëmp«•J¥²ÁuQß2¥s,½¡õzc3”ÞÔÔ”-[¶�˜˜ÈÁƒñõõÅÙÙ™ 6h¶qqqáÊ•+|úé§z'^lhþš™™Õ«á§Þ¾¡ÇÓ¥´´”¹sçâææÆ¢E‹èÚµ+ ,@¡PÔk?­ZµÂÍÍ WWWf̘ÁñãÇ™2e Pw94µê�ú®cÊ_—Õ«W³~ýz^~ùe2228uêÇלÛ�!C4C�ÔlmmÉÉÉaáÂ…ØÚÚ²zõjzõêÅĉ5Û¨ç©hÛ¶m£Î_—îÝ»³yóf­e^^^Z c¶©/õ¤y ÐZÞ³gOâãã¼ßšv )GÑüºuëFÛ¶m¹ví@U'©z ¡­©êSëÖ­éÛ·¯ÎÇ�š˜˜`ccƒ§§'©©©ÄÅÅ5ø=@êiË C9„BÔ‹��&&&üôÓOšeJ¥’””½cÈ{ôèQ+]S±µµ¥mÛ¶uŽ£7´^×9Õ'½š““o¾ù&»ví"66Vólw¨úàÄž={´†H@UÃW_,5ó÷Æ�š‰AÕ’““éÝ»·Î¸ômßÐòÔûÅ‹)((`Ù²eôêÕ +++ÒÒÒõ {333yä,,,Œ.‡ê1é[f,c¯]}å_333/^ À¦M›P*•888`ffÆ/¿üB§N�èÙ³§æÇÜÜœ¤¤$ÊÊÊ1b...tìØQëÕóyÄÇÇS^^À/¿üÒàó×'33“äädÆ�ߨm 155eĈ?~\kù•+W4óÌ4•†”£h^æææLŸ>�àà`òóó¹}û6ÑÑÑ�ºædMUŸ”J%¿ýö›Á9„ÌÍÍ›üqßRO<Ò1!„¢^¬¬¬˜:u*ÁÁÁ¤¤¤�ŸŸOXXÖÖÖ 6LoºçŸžuëÖ‘œœÌ�7Ø´i“Ö6~~~ìÝ»·Þ1µjÕ ÂÃÃIHH@¡Pðûï¿“’’bÔzC±J_TTÄ—_~Inn.eee$&&bii©i0ª 6ŒE‹±fÍ233èÒ¥ çÎ�ãêÕ«”––•¿mÚ´!99™ü‘ÂÂB"##)))ÁÍÍMg>êÛ¾¡å©+vkkknÞ¼ÉgŸ}Faa¡æC¯úéP5ž8;;•JU+Öÿüç?„……‘��@NNìØ±ƒ‹/2nÜ8ƒå +¦º–Õ‡¡ëÃPùº®Ç��££#ÿýïùâ‹/°±±á…^ ¨¨ˆyóæɻヒ¿¿¿æ|bbb ÅÃÃ@3l£oß¾ 4ˆŒŒ fÏž�¿¿?»víª÷yë²oß>Î�;ǵk׈��ÅËË‹ hfË7v›†ÔõÙ³g³ÿ~öïßOnn.ÇŽãðáÃz'ë«c뱸7-]º”Ç{ŒY³fñâ‹/bccâE‹š;¬{–1õ©f=]¿~=qqq\»v�Ë—/ˆB¡Ð<’4##ƒ   NŸ>MNN™™™DEEkôÓ™ ‘zúà’¡B!êÍ××—÷ߟ¿ÿýïTVV2tèPÂÃõn·ÔÅÏÏ��7âííMûöí5fLMMQ*•dgg×z ƒ±<==±°° ,,Œk×®ammÍœ9s4“bZ_3¶)S¦h5¨õ¥/..æ›o¾!""‚[·nѳgOÖ¯_¯s(ļyóøùçŸñóóãŸÿü'Ï?ÿ<ñññ¼òÊ+899ñÞ{ïÌßvíÚ1a‚ƒƒ¹qãdûöí´nÝZg>êÛ¾1å©+öeË–±}ûv¶lÙÂðáÃ3fŒVš™3gÄåË— ÑŠU=„A�ÇmÚ´¡_¿~lÛ¶Mó�œ¡rÔ“®eõ¥ïÚÕWþÆ\×&&&xyyñú믳mÛ6&Nœˆ¯¯/]ºtáðáÃìÝ»;;;ú÷ï�J¥ÂÉÉ OOO>ÿüs>ÌèÑ£±³³Óê QÏó�˜˜ˆ……!!!„††Öû¼«»}û6.\àƒ> ¼¼GGG¼½½5bÆn£+OV¬XÁ‰'4¯ÕÃ�&Nœ¨yšŠ³³3ëׯgçÎ�DDDàààÀÆ�›ìމúÔcqï133cùòåš¹ZZ²¦¨O5ë©R©¤sçÎlݺ•¬¬,zè!žzê)"##5CfÚµkG‡Ø´i999˜››Ó¯_?6oÞ¬óQÁ !õôÁ¥ÿÇ�Û¯®õ&Õ–«›êx]}ÓjéÔ¯Õ?fünõÇßêßT*Õ©zœ‹Bˆ;$//�gŸ}–øøxùPQ¸»»3mÚ´;²½0ìA½vÓÓÓ�z´«¸é+ã� >¦�Ã(Ît¿ËQ‰ú�zúà311  ²Úoå+«ý¨ªý¨_Sí5Õ–Õ|­ªöwuº–Õg}½ÉP!„Í&55•=z

½¹Ã ¹vEK`ÞÆåÕÊ!„¸»dŽ !„BÈØõ–@Êøþ'eøà“9&„B!„B!î¢9”#33¥RixC!„Bˆ&==½¹Cw˜”ñýOÊðÁejÚ2ïh‘vvvÍ‚B!Ä=GnðIßÿ¤ ѨevÇ!„B!„âž B!„Bœ—Æà¼4¦¹ÃB´@Ò1!„B!„ ¼¬S[—æCÑIÇ„B!„B!š�tL!„B!„¢ÙHÇ„BÑÊËËqvv&++뎣¬¬¬Þiît\jJ¥’ÐÐPÆŽ‹»»;—/_ÖZïããÃòåËk¥ ÂÙÙ™’’­å 2„¢¢¢:�ùÊ+¯°{÷nÍë†äQ}}õÕW,[¶ŒI“&1jÔ(fΜ©‰aÔ¨QLœ8ñŽ¿¹)•J8À„ 8sæŒÖºÊÊJöïß�§§'nnnŒ?ž•+Wòûï¿kmWVVFXXÏ=÷“&Mâí·ß6ªÜ yûí·qwwgäÈ‘xxxðý÷ߟx°]¸p///ÜÜÜxî¹çˆŒŒlî�šErr2¯¿þ:'Ndܸq�ŸŸ¯Yol=­ï~Ï�;‡³³³Îooï;v¾âÁÐ"*„BÜ�vîÜIVVï¾ûns‡¢Ó_|ÁÙ³gùôÓO155¥}ûöZëŸ~úi"""P*•ZÏi?uê?üðnnnšågÏž¥_¿~µöS�««+�?þ¸æõ�Ì#…B�¯¯/qqq´mÛGGG”J%iii\ºt©É�w/JHHà½÷Þ£¢¢B«A¢fjjÊ¥K—X´h\ºt‰O>ù„åË—óÑGi¶{ç�w¸uë[·n¥¨¨ˆÐÐP|}} ¯óØùùùÌ™3‡‘#GòöÛoceeÅ… °¶¶6:>ñàJJJbÕªU¬^½š§žzŠÂÂB233›;¬»®²²’·Þz‹Ù³gãããC^^ëÖ­#00�M›6Æ×ÓúîwРA|÷ÝwZé”J%/½ôÒßa+O:&„BÑ$222èß¿?�<òˆÎõO?ý4ÁÁÁ¤¥¥i:~ûí7ÊËË™:u*'Ož¬Õ1ñôÓOë=¦——WÓ�€}ôqqqŒ9’ÀÀ@M‡‰R©äöíÛw-Žæ¢R©ˆŠŠbæÌ™Lž<™ &ÔÚÆÔÔ”•+Wj^ÛØØ0`ÀÜÜÜÈËËãá‡&??ŸcÇŽñõ×_Ó¡C6lØÀäÉ“IKKÃÑÑQçñwïÞ�³³3~~~še�>úh½â®ÈÈH|}}:t(�;w¦sçÎÍÕÝתU+>þøcMç¯��ÞÞÞüío£¼¼sss£êiC÷Û®];­têŽç±cÇÞ©Sé˜BÑ¢DGGsàÀòòò8p ~~~tîÜ™ððpNžù„I“&Ñ©S'Z·n���aaaìÛ·�É“'Hzzz�ûŠˆˆàÔ©Slذ�íÛ·SZZªµ>44”œœöîÝËG}Dvv¶¦ÑTTT„¯¯/S§N嫯¾bÆ Zw øûûãêêÊŽ;xòÉ'ñðð`þüùLœ8‘„„��ÆÄUW@Õ7Ž'Nœ`ýúõDEEannÎâÅ‹©¨¨   €-[¶°lÙ28À€4 fϞ͔)SHHH¨Õ)¡6lØ05¯ããã1bC‡¥¤¤„””._¾ÌíÛ·yâ‰'êÌ“šêÊ#}eaì¾333)--¥_¿~tìØQ繩ñÝwßÑ£Gþ÷¿ÿ©™Á‚“'ObggǸqãP*•|øá‡šµ˜˜bcc±³³£  €;vhÍ¥°zõjbbbèܹ3ööölÛ¶­VY¿ñÆìÛ·GGGF�E||<¾¾¾zME©TRRRBRRëÖ­cÍš5š†IÇŽ),,¤¸¸X³}ee%?ýôׯ_×¹¿¢¢"Š‹‹iݺ5>>>¸ºº2mÚ4öíÛר8 غu+Ë—/çÀ�ØÛÛãááAff&!!!|øá‡dee±yófM†ê®¸û®]»FçÎ�ùöÛoy饗pssÃÇÇG†óü!))‰^½zѦM­åúêicö«–““Ã?ü€»»{�û�:(Ô¤cB!D‹ P(صk+W®¤_¿~ØØØ0qâDÍ7Ý/¿ü2½{÷¦{÷îÌ›7[[[’““u¼œ}ûö€££#vvvhÖߺu‹˜˜|||°¶¶ÆÆÆ†Å‹kÆÞ^¿~�ŠŠ žyæÚ·oOïÞ½éß¿¿Ö1¦M›†»»;ŽŽŽu~è«o\úò ¼¼œ¨¨(üýýéÓ§Ý»w'00�[·nT5(0`ÖÖÖÌ�;—¼¼¼z�ã~úé§9wîJ¥’²²2.\¸ÀСC±°°`èСœûì3¶nÝÊâÅ‹4:ÄÆÆÒµkWöìÙÃ{ï½Wë6é´´4âããqqq!,,ŒÀÀ@\]]IMM½+¡=z”Q£F±`Á²²²´ˆöööôéÓ‡wÞy‡7n�ŸŸOhh(vvvêÜŸºÃâ½÷ÞãÕW_åСC,[¶ŒM›6Õšü²>Ô×tÿþý±¶¶föìÙÌŸ?{{{ìíí™:u*IIIš8 Õ]q÷‘••ÅéÓ§Ùºu+‡ÆÒÒ’°°°æ­Ù•••±{÷nfÍšUk�¾zÚ˜ýª}öÙg<óÌ3téÒ¥Îm¤ 5Ê!„¢EÈÎΦ¤¤¤Î0>|˜¤¤$Š‹‹ÉÊʪó)YYY( ­I«ßâšžžŽR©dþüù˜˜˜Ußߺu œ��™1c#GŽdÚ´i 2Dë¬÷9ŠK_dggSYY©•ÖÒÒ’'žx‚+W®èÜ_·nݰ´´¬õ4 }œ��¹}û6iii\¿~�~ýúñÐCUY~úé§,Y²Dçü ÉCeaì¾ÕcÕ³³³ óá‡ÆÂÂ@sÇGõ'‹¤¤¤ðñÇsþüy Q©Tµä;vÔ í0`Pu�BÕ¼C† ¡U«ª�r'Näĉšôê2KHHÀÙÙYkßúžrÒT&MšÄ³Ï>Ëõë×9tè¡¡¡ØØØ0zôhLMM !((ˆéÓ§Ó©S'æÌ™Pg‡“úöòQ£FáââT�YOLL䨱c:‡,«ú5Ý«W/ j¨ŒzRMÍ5nLÝwßÃ?ŒB¡ÀÇÇGÓÙ¼páB<==›9²æŒ­­­Î¡‰úêicö Uå111Ü—ÔAÒ1!„¢…¸yó&Puëjõoá¡j,þܹsqsscÑ¢EtíÚ•  P(tî«¢¢B3®¶æ˜[@ÓÐŽŠŠÒG¯fjjÊ–-[HLLäàÁƒøúúâìì̆ uކâÒ—ååå(•J …VZsssMYucßX––– 4ˆÄÄD²²²´”#GŽäÝwßåêÕ«$&&6Éãå •…±}ôQÌÌÌHKKãòåËšφÔÌ眜.\ˆ­­-«W¯¦W¯^g«Ww>¨©‡Ö´mÛ¶Î4ês2dH­a?¶¶¶FÅÞX&&&ØØØàééIjj*qqqšO÷îÝ5·f«yyyÕÙ ROƧî¤QëÙ³'ñññM{uÕ¯ñ;UwEãtëÖ�¶mÛríÚ5€ªŽ<õ<2-Utt4ßÿ=ÑÑѵދÔôÕÓÆì÷È‘#têÔIÓ‘ØR[Ê!„¢EèÞ½;J¥’‹/ÖZwñâE X¶l½zõÂÊÊŠ´´´:Ÿéngg‡‰‰ ?ýô“Îõ¶¶¶´mÛ–ØØX½1999ñæ›o²k×.bccÉÍÍ5x•••u®3—¾<ЕV©T’’’BŸ>} ÆUO?ý4gÏžÕÌ/¡Ö©S' ÀÎ�;騱#Ý»woÐþ«ç‘±eaH›6mx饗P(¬ZµªÖð•º:±jJJJ¢¬¬Œ#Fàâ⢢¯\k²··ªæç(//àüùóZÛ888`ffÆ/¿üB§N�èÙ³§æG_GÓ�bnn®wR½ÌÌL’““?~¼Îõ¦¦¦Œ1‚ãÇ�k-¿råŠ&?Ô]q瘛›3}út‚ƒƒÉÏÏçöíÛDGG×y=µGŽaûöílܸ£Òª§õÙïþýûyùå—ëÝym,©ƒé˜BÑ"tèÐ�1cư~ýzÒÓÓ)))!..Ns»èÍ›7ùì³Ï(,,Ô4~ª?½ÀÏÏ�½{÷Uó<ÿüó¬[·Žäädnܸ¡yŽ;T}ÃíááAxx8 ( ~ÿýwÍÄŽEEE|ùå—äææRVVFbb"–––ç/èÒ¥ çÎ�ãêÕ«š‰ë—¾<°²²bêÔ©“’’B~~>aaaX[[3lذç{õøÔ† ÆÉ“'©¨¨ wïÞZë\]]‰‰‰ið1kæ‘¡²¨Oì^^^<öØc¤¥¥ñÊ+¯0gΖ-[ƤI“X·n�ÑñAÕä–¡¡¡xxxµïŠÐÇÑÑ‘'Ÿ|’ŒŒ fÏž�¿¿?}ô‘Ö6666¼ð 1oÞ<"##y÷Ýwñ÷÷7ú8 ‘‘‘APP§OŸ&''‡ÌÌL¢¢¢ˆ��Õºå{ß¾}œ;wŽk×®‹—— ,ÐLÄ µóöìÙìß¿Ÿýû÷“››Ë±cÇ8|ø°æÉ-wCC뮸ó–.]Êc�=ƬY³xñű±±Ñz’MKÇš5kX»v-}ûö¥´´”ÒÒRÍÝVÆÖÓšuÐÐ~Õ~þùg®\¹ÂäÉ“›üܤ>¸d(‡BˆcõêÕlذ� PQQ�££#}ûöåÑGeÙ²elß¾�-[¶0|øpÆŒ£I§T*ÉÎÎÖúvÈÏÏ��7âííMûöí™2eŠVG†§§'„……qíÚ5¬­­™3gýû÷§øÿ±wçqQUýÇ? ¢ "b®…„©™©à.ƒ¸ …¸àRôÜ3õ‘67zDÅ%T¢ÔR4SqÔÄÔÌ'×ÌPwCP@–¹¿?lîÃÀ0s!\ÎûõšpçÜs¾çž{†¹gî9“•ÅÞ½{‰ŒŒäÁƒØÛÛlð“ì·ß~›C‡1lØ0œœœ +s\¥KKKX´hS§N¥  €Ž;aô'^ºŽ ¤““S‰}T*‹-*±¾„RÅ�Ñ—_~©·-Ê{�5X³f k×®%))‰‹/bff†½½}‰)¥qrrbÔ¨Qlܸ‘íÛ·ãêêŠ���¢�’¢4k4œ8q‚š5kâééÉ–-[´Ú* €úõë³}ûvÖ¬Yƒ��-[¶D’$£ÛtúôéZkYŒ?x´ÆÅ¼yó°²²¢V­Z,\¸�ôôtÌÍÍiÑ¢‹/–ÛýáÇœ:uŠ+V�——‡££#þþþZ+ëë:þÎÎγråJ"##qpp <<\ëŽ Cñ=.cû®PñªT©ÂäÉ“™ûì3Ôj5Ó¦MÓÚ>zôh>øàEýTW4”¯Æ† èÛ·/VVVå^7ÑŸ]so�á|u=oRd»æ§©Ž¿‹¦1-²ŸæoÍ£Êß?Íþþ]ó³–$I%—¾AAxJmܸ‘   >ùäú÷ïot>—/_ÆÞÞ¾#ž4úÚ¸õ˜o¨îÐ�£�ÆM£þ¢Ÿ>ûLLL\€{@!PPä§úïßÕER‘‡æoŠüM‘mÅÿ–Šü^”®mey¾ÌÄTAA„§Lñ5-4_ZÞë�‚ Â?ALåAAxÊlÞ¼™øøxÞxã þøãŽ=Ê›o¾Ék¯½VÙ¡ ‚ B™‰� AA„§L­Zµxøð!7n¤N�: 6Œ?ü°²ÃžræÕ-P_ûS9Aøg‰� AA„§L�=èÑ£Ge‡!œ3gÎðí·ßòÎ;ï R©˜2e ýõ—¼O~~> .ÄÃÃ^½z1oÞ<²³³K�ÿáÇ\»vMïñüõ×_ñóóÓY‡²”gˆ’xô•—ŸŸOxx8¤sçÎxyy±mÛ6­ýKk{€¸¸8† ‚››[‰¶Ðw tiÓ¦ rl¥•«ï˜9s&³gÏÖÊ÷«¯¾" @ÎsóæÍZÇoñâÅôë×�·Þz‹ÐÐPÅÇ®´uÝ&_§NòóóuÖ[­VEµjÕ˜3gŽÖ PbP"''‡ÐÐP<==éÞ½;S¦L‘ë_tŠŒ··7;vàÆ�ò¾Eã°°°ÀÔÔ”»wïâììÌÈ‘#åçÂÃÃqvvæÀ�ò¶ììl¦M›F·nÝðòòbÓ¦MZ±%%%áëëK·nÝèÛ·/ãÇ�'33Ó`Üýõ!!!òyد_?.\H^^žœw·nÝøüóÏ‰ŽŽæ­·Þb̘1òñ[µjC‡E¥R1jÔ(Ž9"ï§9Çß~ûmÜÝÝ‰ŽŽÖÙ¦¦¦´oß^Þ×Pìúê­ô¸jÛ~†b,-_c˜˜˜�§§§Þ)!?üð^^^eÊ{ýúõ 0€ªU«ÊÛlmmµ¦Údee‘™™©5È‘��­xPàÊ•+ÔªUKp¨[·.­[·æàÁƒŠÓgÌÿŸÃ‡ãããC—.]0`‘‘‘Šë!”$&JwçÎ,--õNñÔ•¦¬ý t÷å⊿~ØÚÚ¢V«Q«Õ\ºt‰””­Á�ªU«Ò½{w�¯Ÿ úà³@ L‚@tt4{öì!88˜ØØXÌÍÍ7nœÖ›à™3g¢R©X¾|9o¼ñüôÓO„‡‡³téR222J”P’>##ƒ¨¨(&NœÈ¦M›hÕªÓ§O—ã0gFFK–,aòäÉlÚ´‰Æ�ãããÃÕ«W aíÚµ¤¦¦²xñb¹Ì �žžÎš5køúë¯IKK+õVÝV­ZѬY3Þÿ}V¯^ÍÍ›7K¤ù믿زe &LÐY‡²”gˆ’xô•WµjUììì eýúõxxx0kÖ,._¾¬•‡®¶_³f [·neöìÙ|ûí·ôíÛ—Úµk+:ºÜ¾}›^xKKK½åê;ÜÝÝILL”ߨìß¿¿ÔOu###9|ø0aaa,[¶ŒœœÅÇN_ŒÅ�¯½öÕ«WçôéÓxyy±hÑ".]ºd°¬â222¸zõ*o¾ù&iiiÌ›7�ÄÄD®]»F@@ééé 4WWW,,,ä7¸úâ®V­IIIØÙÙѳgOÔj5k×®eåÊ•Zåoݺ•èèh,,,äO¬CBBˆŠŠ¢  €®]»’““£ueff²ÿ~^zé%þúë/¢££K½°¸xñ";wî�טл¡z—Åã´Ÿ1çEEÉÌÌ$++‹ªU«2eÊT*ýû÷gýúõ¥î“žžÎ‘#GJ føùù±}ûv>ûì36nÜÈĉ™0a‚Öš+ÙÙÙlÛ¶ •JEïÞ½ñ÷÷ç÷ß/µ,îÝ»GVV–¼­  €_~ù…[·n)NS\Yÿÿdff€§§'Û¶m#,, 777=GV0$''‡Y³f¡R©4h111Zÿž7jµšììlNž<É_|Á§Ÿ~Zb°ÀPš²ö¯Òú²!'Ož¤I“&òÀÒõë×±±±¡F�Zéìííu¾×Ñ…Ò™x˜êxTáÑÔ3 êß�j?ªÿý°jüý°¬�Z€ P¨Ôê�€—€—�¦À«@KàMIÙÇ¥Î�;K§OŸ–·eggKnnnÒîÝ»%I’¤áÇK³gÏÖÚ/77WrqqÑÚ/''Grrr’®^½Z¢%é‡.mܸQ~>--Mrrr’þøãÅqÝÿìÙ³’“““tçÎy[ll¬äåå%I’$Ý¿_jß¾½tãÆ ùù_ýUêÓ§O©ÇëÁƒÒêÕ«¥Þ½{K:t�fΜ)�?^~~øðáÒúõëuÖAIyÇ—âããKý»,ñS¿þýûK?þø£VùÅÛ¾  @R©TÒ©S§tæ¡ïH’$Íœ9S “ó:wîœ4tèP)66Vo¹†Î�¼¼<ÉÕÕU:~ü¸$I’tãÆ ©k×®RNNŽœ§æX>|øPïù¨´­ŠÇXÜþýû%•J%effê|>))Irrr’f̘!o‹ˆˆ�œœœä‡···$I’tþüyÉÉÉI?~¼œvÚ´i’“““tùòeùØ:99i�“’$IG�•¼½½å<Û·o/Íœ9Sº{÷®tçÎÉÉÉI1b„œ>,,Lrrr’öïß/I’$uíÚUrrr’ $I’¤-[¶HNNNÒ„ $I’¤Ã‡KNNNR@@€”ŸŸ¯U¶’¸‹JMM•œ��¥ÿû¿ÿ“·iÊ?qℼíÆ�R‡¤�J>,‘�fŸÜÜ\I’$iÙ²e’“““´páB9MÑcRô¡9? Å®¯ÞJ�kïÞ½åç�i¿Ç9/tIII1˜F£G�Rrr²Ö¶‹/JNNN’ŸŸŸtôèQ)33SÚ½{·äââ"%%%éÌgáÂ…Ò”)SJlW«ÕÒÊ•+åzÿë_ÿ’222´ÒüñÇÒï¿ÿ.Ý»wO:þ¼4uêT©{÷îÒ­[·t–UXX(y{{KÓ¦M“nݺ%ݹsG ’  ýûßÿVœ¦¸²þÿ¹xñ¢Ô¾}{éÚµk:ó«HúÚøõÑqÿ`$åëöíÛÒÇ¥ÂÂBéÔ©SÒ[o½%}ýõוV…PÒO·mÛ&÷�¾}ûJëÖ­+sš²ö¯Òú²>999Rß¾}¥-[¶ÈÛ6oÞ, 4¨DÚíÛ·K:óyšú À›_»¾ú÷µìË_Û6úûZ·îß×¾µÿ¾®õ÷µ±U‘ëeË"×ÑšëjÍu¶æº»J)׿†®çË�XcBžsiiih­K`aaÁ믿NJJм­uëÖ%ö+,,ÔÚOß­½JÓÝÖ¨Q#,,,ÈÎÎVgÑý5óó³³åE×äÛñ/_¾ŒZ­fôèÑò¼í‚‚ _ôªÕjE_?WÖôš‹Bcã,-?@¾XŒ��ÕšK¬„™™nnn¨T*†ÊîÝ»K½Ñ”ù8åO¿~ýô–—““È#pssÃÏÏ� 0fÌ õ–uÿþ}àÑ- š UCŠwOOO&Ož\¦öSrôéÓ‡yóæáïïϾ}ûx÷Ýwu敟Ÿ¯÷||ܶÊËË# ''' Tj:LMM9wîiii¼øâ‹ôèу=z”˜ÐÄÑ¡C¦OŸ®•OÆ Ædbb‚‹‹ ...xzzòÁðË/¿ÈÏ—å–gÍà•æ–ßÚµk³nÝ:âââØ·o»víbÏž=ÄÄÄŒ;==�±cÇÒ°aC>ùäš4i¢s5÷âóœ5çᣖ Ów®~òÉ'3dÈ®\¹ÂáÇqqq1»¹¹y©õnРP¶ãªOií§YÎØó¢¼i.[µj¥µÝÞÞžC‡•H¿cÇj×®-bh\½z•­[·’�� ç9oÞ<¦L™ÂŠ+øâ‹/t–_µjU^yå­Á¾â^|ñE­)}ðhqÜ¢lJÒ”UÑ×ASSS¢¢¢8~ü8?üð8;;ftþ‚633³ç~�_êիǨQ£8þ<‰‰‰%Îa%i4ôõ¯Òú²>qqqÿüsV­ZÅ�J�?/è'Ißÿ=·oßF’$~ÿýwbbbèÛ·oe‡öÄ0777¸þ�¡4úúWi}¹4;vì`Ù²e„‡‡S¯^=­ç©_¿¾¼æ�¦ì}ûö•û:¢>9Ä‚𜳴´ÄÓÓ“ùóç3wî\4hÀŠ+°µµ-õ¢N³ßÛo¿Í_|Áœ9s¨_¿>_}õ•VšiӦѪU+|||¥¯ˆ8õ133ÃÇLJˆˆêׯ�³³3·oßæÎ�;ò4…¢uøïÿKBB]»vÅÎÎŽ‚‚8{ö,3gÎ,—òlllHKKC’$LLLJü]–x •gkkËýû÷ùî»ïèÕ«?ÿü3ðè–}}jÕªE÷îÝ &((ˆºuërìØ1œ��µ,oJÎSSSzõêÅìÙ³Q©T¥|:•´•.jµšO?ý”K—.�$Iò¢šÕ«W/ц'Nä·ß~ãÔ©SxyyÑ¢E ¬¬¬øí·ß€ÿ}]¯^= À÷ßÏÈ‘#qwwçÖ­[˜˜˜È§Ÿ~Êüùóyå•Wäÿ“fffT­ZSSSFŒ!ÿ~õÕWY¹r¥|why}ðÉ#&A €E‹1uêT èØ±#G½§M›Fxx8þþþX[[Ëÿ¨LMMQ«Õ¤¥¥i�‚ëK_‘qê3jÔ(ªU«Fhh(ׯ_ÇÖÖ___Z¶lY¢šÛ 5i«W¯N‹-Xºt©âOçô•�.ü‚‚‚¸té¡¡¡Z‡„„”9}å½üòËLœ8‘eË–…‹‹ Ý»wWT�O>ù„°°0ÆŒC~~>ŽŽŽ¼òÊ+:0ÊÎ�>}ú°nÝ:f̘¡7¯âçc¿~ý´e µ•.IIIòÜÿ¢óeáÑW(Ö¯_¿D¿¨Q£†üÍIII\¼x333^~ùeÆ�Ç€´ê_¿~}ù"ÏÎÎŽ–-[ÊWC‡åÂ… $&&�J¥ÂÞÞooo’““9wîUªTáµ×^ÃÛÛ›ž={�æòÏž=›””¬­­ dÞ¼yZñ{yyqýúu|È©S§X±byyy8::âïï¯u±£$ÍãÊÊÊbïÞ½DFFòàÁìíí ®Ð£g™………¢žVVVÔªU‹… ’žžŽ¹¹9-Z´`ñâÅò”S%i”ô/ }}Y×ûÁÏ>û µZÍ´iÓ´ÒŽ=š>ø€Áƒ#I‹/æÎ�;899­÷kHËBôÁ'O…¬¨© _]Ï]áSóÓTÇßEÓ_1´ø·|˜ò¿ÕF5?kI’t¸ uA¡;wîЧO:¤è…½¬éA„Šuùòå2Mƒž>úÚ¸õ˜o8µB÷Ú<“CôÓgŸ‰‰‰ p( ŠüTÿý»ºÈC*òÐüM‘¿)²­øßR‘ß‹2´€“²žÊ@¬1!B¹9þþüyœ��9qâD¹•Yü¼,�s«4ï½÷ÎÎÎÜ»w¯ÄsÙÙÙxyyáååEvv¶Á¼rss¹ÿ~¹|Uú�?þ(÷…¢�›7oj•Ê[o½Eß¾}™3gŽÞãtâÄ �y:;;ãïï¯8�ð|[´h�;w¦{÷îòcÛ¶m•V¥Q«ÕlÚ´‰Þ½{sôèQ£Ó¥¤o+y�]žË¯ A [¹r%©©©Ì›7Ïè<Ì„ ÈÉÉáÈ‘#„††’““èQ£ôî§R©hÞ¼¹ÑåUõ€ÿÕ¥°°�?ÿü“ HTTT¹ÄiŒ²Ö­wïÞ„……‘——‡¹¹¹¼=//�C‡±téÒŠ µB\¼x‘¤¤$ºuëV⹯¾úªÜË+~^–×¹UVÕ«W§Y³fòï†Ì™3‡„„âââptt|¬²³³³iß¾=ááá%bÒ˜;w.<`É’%dff²`ÁˆˆˆÐ™g›6mØ¿¿Ö6µZÍàÁƒqwwWœFx¾åææòá‡âíí]Ù¡Tºääd¾üòKòóó¹{÷®ÑiŠSÒ·•¼F‚.b`BA¨0æææXYYaeeE¿~ýÈÊÊbÕªU&Æ�ÿE¨œ¦.ðè"iÊ”)øùùñàÁjÔ¨QÉÑ)ãêêJPP?ÿü3�;w–·9rZ¶lY‰Ñ•]Íš5‰‰‰)10qåÊNœ8Qîíò¤œ—¦¦¦¬^½ºRÊÎÉÉÁÊÊ �Ïß½{—]»v±sçNjÕª@XX\¸pAçÀˆ©©©Ü·4> @�=§žo999ââ�$‰ØØSb�Ž IDATX¼½½ñðð wïÞF¥)Niß6ô!¥S9Až0jµš¯¾ú ///ºwïΤI“HOO—Ÿ÷ññaçÎ�Lœ8•JErr2………DFFâááÁÛo¿MXX 55Ug9úÒ¯Y³†•+W’��@ÇŽ .±ÿýû÷:t(Ë—/W\·6mÚ�‘‘!ß~^Z]ŠN˜9s&³gÏÖÊ端¾" €üü|ÂÃÃ8p �;wÆËËKëÖÝÒꑟŸÏÂ… ñðð W¯^Ì›7OÑ-ñEU¯^�ªU«R­Z5Eyúøø°råJÆŒƒJ¥bøðáœ9s†o¿ý–wÞy•JÅ”)S´¦‡è;Œ©›µµ5;vdß¾}ZuÙ»w/={öTT®.îîîZ·Ÿ={VkàØº+i£�ʃE­^½šwÞy§ÄEŠ’¾µjÕ*ÆŽ‹J¥ÂÛÛ›“'Oj=¯9/K;þÆöß²êÖ­›V›%%%áëëK·nÝèÛ·/ãÇ�'33“ÀÀ@ðöö¦cÇŽF•§‘��­÷‚ãÊ•+ÔªUK¾p¨[·.­[·æàÁƒŠËY¿~=  jÕªF§1æ¼;|ø0>>>téÒ…©8f¡r‰�‰GLLLˆˆˆÀÓÓSSÝ—zJÒ§´oz�(NôSAC L‚ >>Œ=www’““™>}ºÖ¾………̘1GGGÞÿ}Åu»}û6/¼ð–––zëR”»»;‰‰‰Zóã÷ïßOïÞ½©Zµ*vvv„††²~ýz<<<˜5k—/_Ö[� �žžÎš5køúë¯IKK+õ6óâ$I"--MÔ133S”gFFK–,aòäÉlÚ´‰Æ�ãããÃÕ«W aíÚµ¤¦¦²xñby}炱uëÝ»·Öñ,,,$11‘^½z)*ׯÔ]IU¯^ooo­i7oÞdÿþý <¸D†ê•‘‘ATT'NdÓ¦M´jÕŠéÓ§ë¬wiÇߨþû8®]»F@@ééé 4WWW,,,°¶¶Öº›ÀÕÕµLýU—ììl¶mÛ†J¥¢wïÞøûûóûï¿ËÏÛØØpïÞ=²²²ämüòË/ܺuKQééé9r//¯ÇJSÖó.33“€€<==Ù¶maaa¸¹¹)ŠY¨|999Ìš5 •JÅ Aƒˆ‰‰)—uU„G”ömC¯ʼn~*hˆ� A„'H^^±±±Ìœ9“fÍšñâ‹/2kÖ,ýôSEûrþüy/^Ìðáõž+^—â\\\(,,”?¹¾yó&þù']»v`È�!4mÚ”_|‘‘#GÒ°aCNŸ>]j,< >>ž)S¦`kkK½zõ7n\‰ùëÅÅÅÅáììL‡ðóóãõ×_gêÔ©Šó´±±!00�–-[bkk+‡Ñ£GÓ¸qc7nŒ§§§\O¥çBYë¦R©¸ÿ>¿þú+Ç�§fÍš´hÑÂèr )kÝËÒFC‡å¿ÿý/çÎ� 66OOO¬­­µÒ)©—&ÎV­Zakkˈ#¸sçW¯^UTOcûïãJII¡  €¶mÛ2a¦OŸNXXnnnò cÇŽe̘1�UÖ€øöÛoùᇈŒŒÄÌÌ ???nß¾ @ãÆ�iÖ¬sçÎåöíÛܽ{— `gg§s!O]¾ûî;ºtéBýúõ+MYÏ»[·n‘ŸŸO—.]°¶¶¦iÓ¦OÝô¦çÙ§Ÿ~JRRûöícÖ¬Ylذ�o¿ý¶²Ãzf(íÛ†^#ŠýTÐkL‚ víÚÅž={ˆ‰‰©ðO«V­Ê+¯¼Â�7äm/¾ø¢Ö´x´p¨«««ÁüvìØAíÚµiß¾ýc¥QªhûšššÅñãÇùá‡ÀÙÙY¾ûDxº˜™™Ék 娾­ë5¢¬D?}>ˆ©‚ O;;;LLLøå—_ämjµš3gÎÈ_¨ËK/½Tb?}”¦/(((±­Q£F±zõjƒ·ök¾‘ãq/Êœ��ÉÉÉáøñã\¸p�N�:�YÌÈÈ`âĉ4iÒKKK.\¸Pâ PÑz4lØ�5jpàÀ£ã™0a'Nœ�ë_y§ô\0¦n*•Š»wï²aÃ,--µ>Y7æ´°°àÏ?ÿÔÚö8s»ËzÍíÛ·Y¸p¡VšiÓ¦±fÍÅéëׯω'¸ví999ZÏuêÔ ???>ýôSyþ}ÑüË›©©)½zõböìÙ¨T*y ÃÖÖ–û÷ïóÝwßqïÞ=vïÞ <<)­ffføøøArr2………ܸqƒ3gÎÈûª‹��C† aáÂ…(ʳ¬”œ ÆÔM“·‹‹ ,(ñ†RI¹666¤¥¥!Io¼ñ›7oæÚµk¤¥¥1oÞ<£ÊŒ:žcÇŽ%::šÆ�}<˪øñœ2J;çfÍšÅôéÓ凮u6þøãÞyçÂÂÂXºt){öì�C^yåy¡Û¼¼<£ê Lbb"ׯ_çÒ¥KÌš5‹ÂÂB­é@ëׯçĉ\¿~�0~üxÆŒCíÚµõÖ÷·ß~#%%�RËW’ÆX™™™lÙ²…›7o’››ËñãDZ°°ÀÆÆ¦ÜËÊWnn.çÏŸgäÈ‘¸ººòñÇãëë+&Sñ~ª¤o+y�x¢Ÿ>»ÄTA„'L@@‹-bêÔ©бcG""" ~:8mÚ4ÂÃÃñ÷÷ÇÚÚZ~`jjŠZ­&--�zõê)JðöÛosèÐ!† †““_~ù¥Vy#GŽä·ß~cÚ´i¬\¹²Dþå­OŸ>¬[·Ž3fÈÛ^~ùe&NœÈ²eËˆŠŠÂÅÅ…îÝ»kí§«£F�¢Zµj„††rýúulmmñõõ¥eË–:�•.cÆŒaëÖ­lذ�wß}WožÆ2t.”µnEõêÕ‹}ûöéü¤ËP¹ÞÞÞqéÒ%BCCùè£�˜5kÆ ãÅ_ÄÝÝ]ñ‚‘¥)ëñ¬U«íÚµÓ›§±}«4ºŽ¿1eè;çŠß•¤«þùùùØÚÚ²cÇ»*æ8ÃùêzÞ¤ÈvÍOSMcZd?ÍßšG•¿šýý»æg-I’—¡.‚ O¥;wîЧO:¤èvYÓ ‚ðì¹|ùr¹ßr-ûÄ‚ ‚ ‚ ‚ ÿ çr*ÇÕ«WQ«Õ† ‚ ‚ ¶³³Ãßߟ�>úˆ¼¼<ÌÍÍ‘$‰ØØX¼½½ñðð wïÞŠò6ÔO•”-¥‚ ” µZÍêÕ«Ùºu+wïÞå�7Þ`Ú´i4jÔxt[ùÿýßÿ±uëV~ýõWBBBèØ±#………,Y²„;v Innn$%%ÉK/½¤UFPP7n`Û¶m4mÚ”¸¸¸RóÎÏÏ'**Š]»vñðáC\]]ñ÷÷ÇÒÒÀàó………,]º”;vPXX(ÿ#Ö0´ÿáÇYºt)—.]â…^ gÏžL˜0¡Ä±»ÿ>£F�¢W¯^T«V�•+W°{÷n ÄôéÓ_vïÞÍùóçyùå—™>}:-[¶|ì¶ÍÏÏ'""‚¤¤$nÞ¼Iƒ =z4o½õk֬ѳ¾˜ å©ï½ÿþûZÏòðáC®]»Vâœ)ZcÛJßs>>>xyyÑ¿@Y?puuåÈ‘#œ?ž_|‘iӦѦM£ÚE_�Š3tŽʯ´~fˆ©©)íÛ·çèÑ£äçç�.æ/^Lbb"YYY´k׎)S¦ÈÇ);;›ððp©Y³&}úôá›o¾á�wÞaìØ±Ü½{—Þ½{óúë¯óÕW_N\\aaa¨T*ƒe$%%±bÅ þüóOjÔ¨�ƒƒóçÏ'88Xþ´ÕÛÛ›*Uª�œœÌ�7äØóóóå7Ør]�-ÓÚÚZïsݺuÃÜܜݻw�γ˜˜¶oßÎ�7ppp`ìØ±tîÜYŽ¥[·nôîÝ öíÛG^^^^^øùùl3}lmm9þ¼üwVV™™™¼üòËZéÒÒÒX¼x1QQQëÍóÒ¥K¤¤¤Ð£Gy[ÕªUéÞ½;ÀÓÓ“+W®P«V-yP nݺ´nÝšƒê˜ðññA¥RñÓO?ñûï¿Ó¸qcþýïsêÔ)âãã¹víÎÎÎ|üñÇÔ®]Pþº-<™6oÞŒ““ÏíÀ  hØÚÚ¢V«åéi&&&DDD”)O%ýTIÙʼn~*hˆ©‚ ”‹èèhöìÙCpp0±±±˜››3nÜ8ùB`æÌ™¨T*–/_Îo¼@DD?ýôááá,]º”ŒŒŒR×p˜9s&ǧ_¿~$''§7ï �žžÎš5køúë¯IKKÓúGlèùÈÈH>LXXË–-#''G+}ûgff€§§'Û¶m#,, 77·u*,,dÆŒ8::òþûïãããÃèÑ£qww'99Y^óAÉñ aüøñlذ�Ö­[3~üx²²²Jm³üü|rrr´ºÞ8T­Z;;;BCCY¿~=Ìš5‹Ë—/”³¾˜ å©ïתU+š5kÆûï¿ÏêÕ«KÌw}œ¶RÚŽ†Ú)##ƒ¨¨(&NœÈ¦M›hÕªÓ§O×jG]íRüÜ3T§Òè;G”ä§«ŸrñâEvîÜ @»ví˜1cëׯÇÑÑ‘nݺqèÐ!äóï“O>!>>žºuëbooϲeËʼ^ˆ¾2®]»F@@ééé 4WWW,,,°¶¶ÖzÓíêê*Ÿs¯½öÕ«WçôéÓxyy±hÑ¢SSŒ-Sßsº„„„…™™o¾ù&çÎ�ã£�>â—_~ÑJÏ�°³³###ƒåË—sðàÁ2Çâüüüؾ};Ÿ}ö7ndâĉL˜0AkZ�f ‡»»;¯½öšÁ<¯_¿Ž�� 5jÔÐÚnoo/÷gîÝ»§õšVPPÀ/¿ü¢s <êoK–,aòäÉlÚ´‰Æ�ãããÃÕ«W aíÚµ¤¦¦²xñb ìý]x²dffϨQ£*;”'ÎÉ“'iÒ¤ÉcMSÒO�)[ôSACÜ1!ÂcËËË#66–èèhš5kÀ¬Y³ððð 11Q~£ß¿¼¼¼äý>|Ȇ X¾|¹üiW`` Û·o/s Åó~ðàñññlݺ[[[Æ�ÇôéÓ™>}ºÁçóòòX¿~}©±ÚÿÖ­[äççÓ¥K¬­­u^`H’DHHˆüéðãß�?þXþäÝßߟƒ²sçN­ãRÔ† ذaƒÖ¶èèhùⱨ!C†È¿�9’Í›7súôiìííK�ÛPLJòTrŒÌÍÍYµjß}÷_ý5QQQôìÙ___«­”´£†’v²±±aäÈ‘´jÕ €#F°qãF®^½*OqÐÕ.ŪSiJk�>}ú(ʯx?Ó§è><ºû }ûö\¸p�C‡ѱcGBCC�G‹îÙ³G”>ž¹sç²víZyŠ…Æwß}'÷‘¨¨(Ž?^âxã�71bQQQüøã�¸¸¸Ð«W¯eþþûï„„„(ÊóöíÛÔ¬Y³ÄöZµj‘‘‘@ãÆ�iÖ¬sçÎ% SSS–-[†��÷îÝÓ™¯¦¿iî >|8 Œ=Z>Ï===Ù´iP¶þ.>>x{{“˜˜H\\#FŒ &&†‚‚£ÛJI;j(m§¢çQ£F�°°°Ðú¶…ÒÚÅÙÙYþÝÐùWšÒÚCi~Åû™>®®®ìß¿xt4uÒ‹ääd­:Á£OÂnß¾ @‡ä t•JU¦� Ce4oÞkkköîÝK�=pqqaäÈ‘×)hß¾=±±±üôÓOlß¾�½{÷ÊÓ>T*•Ñe–%ž‹/¢V«éÔ©“||z÷îÍܹsKÜÁacc#÷Í`XiJÍš5‹›7o²nÝ:ªV­Ê²eË8p Ë—/§iÓ¦¤§§�¿¿¿Ö´ }llltÆuÿþ}ùÂÄÔÔ”��‚‚‚4hµkׯ××@ï§ÀEû›fð/;;[Î×ÁÁAîeéï“åÌ™3Ü¿—Êå‰3þ|6lXêTI¥”ôScËýT10!B9ÈËËC­VSXX¨õÏÅÜÜ\ïŤæ‚Q­V= Qͨ~ll¬Î7džžÏÏÏ×›¡ýMMMåO'øápvv&,,LNÓ¾}{RRRX·n�ÞE�=¾UªT)—Uüsrr1bnnnøùùÑ AÆŒCaaa™óÒĤ4O¥ÇHÃÌÌ 777T*C‡e÷îÝôë×0®­”´£†±íTt°@)CçŸRšö(¯üŠúä“OfÈ�!\¹r…Çãââ"çß¡C‡ww4lØP^Ë¡øíº”6gÙPæææ¬[·Ž¸¸8öíÛÇ®]»Ø³g111×e111ÁÅÅ<==ùàƒøå—_äùÕÆ–©4Í´ž¢}åáǘ˜˜h­wQœ¾»0”ºzõ*[·n%!!�:uê0oÞ<¦L™ÂŠ+øâ‹/X¾|9ÙÙÙ1þ|9ÖiÓ¦Q¥J¾ÿþûkÁÔ«W�ÌÌLîÝ»§uþ¥§§Ó Aùï_|Q¾�[cüøñ¸ºº]§âƒuJû»ðdÙ´iÇ�ÇÝÝ€;wîàîîÎgŸ}öÜXÄÅÅqðàA­Å¡�¥´ŸVDÙ¢Ÿ>Ä‚ <6;;;LLL´æ7«ÕjΜ9#ßÒ®ËK/½Tb¿òÒ°aCjÔ¨Á�Œz^W�ʲ¿†““Ÿþ9«V­âÀ�Zó05jDPP«W¯&11Qk¿¢_?¨äøÞ¾}[^TãôéÓ4mÚTo|Jœ={–ŒŒ &NœH“&M°´´äÂ… ò¤®˜ Ť4O}ÇHŸ*Uªð /P­Zµri+}ÏiÛŒ¡´NEékcòS¢J•*Œ7€… ¢V«qpp J•*œ;wŽÚµkcoo/?ÌÍͱ³³àСCäååpêÔ)­|5à—.]’ÓüñÇòó†Ê€G '~ôÑGÄÇÇãëë‹Z­æØ±cÀÿ.â‹®g�ŸŸÏ™3g´âЬ R§N�Ç.SßsE988�ÒÔÔýðáÃH’TáßL¡9ŵȔ IDATÓ^}õUy:ÅgŸ}ƱcÇøùçŸINN&99™–-[Brr²Îj©_¿¾¼ <ê;ûöíÓ;wüêÕ«œ>}ºÄT’Ç¥¤¿ O–ÀÀ@äGHH®®®$$$<·ƒ;vì`Ù²e„‡‡S¯^½Çί,ý´¼ËÖEôÓg�˜á±YZZâééÉüùó9sæ wïÞ%44[[[:uê¤w¿·ß~›/¾ø‚Ó§Osûöm.\¨•fÚ´i¬Y³¦Ì1™™™áããCDDÉÉÉrãÆ ùÂÂÐó†b3´ff&[¶láæÍ›äæærüøq,,,°±±ÑгS§Nøùùñé§ŸrõêUêׯω'¸ví999ŠŽ¯fQ¾Ÿþ™{÷îMvv¶üf¡¬ÇÑÆÆ†´´4$IÂÖÖ–û÷ïóÝwßqïÞ=ù›4ß4 +fC1)ÉSß1*ZŸÿþ÷¿„††’œœLzz:W®\aùòåœ={–ž={>V[)mGÍ9cL?0†¡:�vj%ù•ÆÐ¹Õ«W/ùã�?ؼy3õêÕcÀ€dff2räH¢££™7o3gνùmݺ5W®\aøðáÌœ9“ØØX­<-,,hÞ¼9999øúú2~üxþŸ½;«ªÚ?þf �Ê233AíRŠâ€–â€i—«8^5o_H½R""Ð5pB+5³ÂL,KpR/¥fÞÄ!õ¢€9ÁEPP†³ØÙ?Î9 ŠÃçõ<ç�³÷Úk}öÞkØëìµvJJŠºÞXçÎ�ã­·Þ"""‚U«V±gϵ©M›6ꤼ………:t???ú÷ïϤI“5jþþþÀÝ9Xî¥Lcñ”ÖªU+ÜÝÝÉÌÌdäÈ‘ê�)VVVŒ?ÞèùºmÚ´¡yóæÌž=›'NpíÚ5âããùæ›oèÝ»w¥ò*]oÌÍÍ3f ÑÑÑ$%%qåÊBCCÕ; ´bcc9zô(—/_&11‘)S¦0aÂu¦þ{U™ö.ÄÃ,))‰ùóç³`ÁÚ´i£N¢\z¢eST¥�VWÙ‘vúø’¡BˆjÀG}ÄÌ™3)..¦k×®DEE½M=00�ÈÈHüýý±µµUŸ¥mnnŽF£!33³Ê½íãÆ�£víÚ„‡‡sùòe=z´zk´±õec8p Î…³¡íóòòØ»w/ÑÑÑܺu '''õ⡬±cÇòÛo¿ȧŸ~Êo¼Á�1b®®®|øá‡F�o½zõèÛ·/¡¡¡\¿~�:°zõjjÕªU¥ãèëëKHHçÏŸ'<<œ©S§²zõjV¬X�»»;={öÔI¯/fC1µhÑÂhž£�?þXg´·”jÏC�:uxþùçYµj•:‘fUÏÕµk×L>�PõvPÆêoÙshè|˜’Ÿ>¦Ô-333¦L™Â´iÓXµj^^^аaCvìØÁ† ptt¤]»v(Š‚™™K—.%$$„£G�R¯^= ÀöíÛuò]¸p!ÁÁÁ¤¥¥akkKPP‹-R×*£¨¨âãã¹uë�5bæÌ™ê7«Ã‡çÌ™3$%%‡‡‡NNNøúú’’’©S§°°°à…^À××W½(¯j™§N�2OY‹/V·{àÀÚ·oϻᆱódŒû¡V­Zê#@gΜI^^ŽŽŽLœ8‘¡C‡šœ�¾z3lØ0EaùòådeeáêêJLLŒZ?ïܹÃñãÇY»v-………¸¸¸àïï_­³ñWæs[<Ü<==Ÿè'5,X°�FC`` ÎòñãÇ«QΚ5KíÔá’^^^,Z´¨JíÔԲÓÇWõÿ§dZ¾úÖ›•Z®ýi®ç}é4楶Ӿ׾,þüiùçïÚŸõE9X‰}B<@YYYôë×�È™JðóóÃÇLJAƒÕt(ª‡1¦'Ù£|>öîÝK`` 'Ndâĉ5ÎcíÂ… FŸ¶#m†Îq‡ _p|í_pD¢²¤�>þÌÌÌÜ�@ P\ê§æÏß5¥^J©—ö=¥ÞSjYÙ÷J©ßKÓ·¬2ë+M†r!*§OŸ¦Y³fÒ)!„B!ÄB†r!jTZZ.\ÀÕÕ•¬¬,¢££5jTM‡%„B!„x@¤cBQ£òòòøä“O ¢aÆøøøTj¬²B!„âÑ&sL!„B@Æ®? ä?úä>þdŽ !„B!„Bˆè‰Ê‘žžŽF£1žP!„â sáÂ…šAÜgrŽ}r_ææOæ½OdÇ„££cM‡ „BñБ[ÄrŽ}rÅãèÉìŽB!„B!ÄCA:&„B!„t˜ðEM‡ „xBIÇ„B!„B!jŒtL!„B!„¢ÆHÇ„B!„B!jŒtL!„O�ýû÷3dÈbccMZnª   ÜÜÜpss£k×®x{{ó¯ý‹ÂÂÂê»BÉÉÉÌœ9“!C†ðꫯâííÍ‚ ¸xñ¢Éyܾ}››7oVø(ñõë׫û–œœl4¿½{÷âææFLLÌ=¥yXi4¶nÝJß¾}ùé§Ÿ ¦-..fóæÍŒ7OOOúôéÜ9s¸råŠNº'N0mÚ4¼¼¼èÝ»7AAAdggßÏÝ�±��fΜYÓaÔ¨øøxüüüðôôdúôé\½zµÂ´¦´SSÛ²U%B!ÄàäÉ“Lœ8‘¥K—’žžntyU¼ùæ›$''³sçNæÌ™C||<ÑÑÑ÷º^Š¢°`Áüýý9tè¶¶¶¸ººbmmÍ?ü€………Éy½ÿþûôèу³gÏê]¿sçNõ÷}ûöÝsì�²””|}}Ù¸q£Iæææœ={–I“&ñå—_²páBnݺÅôéÓÕ4ÅÅÅÓ»woÖ®]Kxx8gÏžeáÂ…÷sWÄc*55•„„„š£Fíܹ“°°0&NœÈºuë¨]»6&LàÎ�;zÓ›ÒNMI#Ľ°¬é„Bqÿ}ûí·ôêÕ‹!C†0mÚ4£Ë«¢V­ZX[[cmmÍ_þòFŒÁž={î5t½¶lÙÂ÷ßO§N�X´hÏ>û¬º.'';;»j)'==�Ó§OãããC||<‰‰‰”””Tªããq¡( 7nÄ××—зo_£Û˜››3gÎõ}ƒ hß¾=žžždeeñôÓOciiÉ_|�¹ùÝïËñ÷÷çÝwߥ°°++«û¶Oâñ¢ÑhˆŒŒÄÏÏ�“'OÖt85fíÚµL›6�×^{ €àà`¼½½IHHÀÛÛ»\zSÚ©)i„¸Ò1!„BÜg�†õë׳}ûv²³³y饗 ¤I“&øùù1räH¶oßί¿þJXX]»v¥¤¤„•+W�¢(xzz’œœLtt4Íš5Ó)£¨¨ˆ¨¨(’““¹zõ*�5büøñ¼þúëÌš5Kol-Ÿ3gÖÖÖÌŸ?_]¶~ýzŽ?NDD„Iû}õêUZµj¥¾÷òòâý÷ß§K—.ÀÝ»5&L˜À�8xð «V­âüùó<óÌ3ôîÝ›wÞyGïñ\±bµk׿ý÷ß×é”ÊuJ°|ùr’’’ÈËË£S§N̘1ƒ&Mš¤~»êëë‹……)))ê¶»ví W¯^äää°gÏŽ=JçÎ�Õ4ùùùDFF’””„�� õë×/³)iºw§'Mš4!..Ž&Mš°víZƒñÃÝá,k×®å¿ÿý/uëÖÅÙÙ™ÐÐPlmm ®«,333¢¢¢*½]YYYYØØØèÄ í”Ðrpp@£ÑT8¼ÆÏÏ:Äï¿ÿNóæÍ™3gÇ�'..Ž?þø777Þ{ï=ìííÓë—xtmÛ¶ WWWœ��ŸØŽ‰óçÏ“––F¯^½ÔeµjÕ¢gÏž$&&êí˜ÐG_;­li§¢2¤cB!„¸ÏbbbøñÇY²d ÖÖÖ,[¶ŒÉ“'³eËjÕªÀܹs™3gï¼óÍ›7 **ŠŸþ™ÈÈH¬­­‰‰‰!##CoµjÕÂÑÑ‘ððpêÔ©ÃÎ�;Y¸p!/¼ðNNN•޹OŸ>„††¢( fff$&&òæ›oV¸ÍÁƒéÒ¥ %%%ìÝ»—ýû÷³aÓÊËÍÍ% úöí˵k×*¼íøÒ¥KäææòÒK/ѰaC£yÏž=›C‡ѽ{wêÖ­KBB—/_æ³Ï>£W¯^jÇD�=hÛ¶­Î¶»ví¢nݺtêÔ‰k×®±gÏöíÛ§Ó11oÞ<yî¹çhÔ¨‰‰‰åb0% ÀöíÛprrÂÅÅÅhüW®\! €§žzŠ¡C‡rçή^½Š­­-üñG…ë4�FÃíÛ·9sæ +V¬`þüùjÝ×çØ±c´lÙ’:uêè]Ÿ““ÃÊ•+Ù°a�5"""???FŒAXX,_¾œ÷Þ{¯RõK<šrss‰‹‹#&&Fíì|]¾|;;;êÖ­«³ÜÉɉÿüç?·5¥�V¦-K;•!B!Ä}TXXÈÆ�‰‰‰¡uëÖ,\¸��””¤~«5hÐ |||ÔíîÜ¹ÃæÍ›Y³f�z�ÄŽ;*,«t§ÁرcÙ¶m'Nœ¨RÇÄ«¯¾JAA'Nœ }ûödggsúôiºwï^á6iii:ÃAÌÍÍÙ²e‹Ic�¯]»FQQ¯½ö¶¶¶/žÓÒÒ€»·kEGG³nÝ:õýsÏ=ÇçŸΙ3g8pà]»v%<<¸;Ùåž={ÈÈÈÀÓÓ///˜8q¢z¬µåüþûïôéÓKKK^}õUÌÍÍÙ·o˜™™qñâEiÔ¨ëׯÇÒÒ’ððp¾üòK5SÒ”¶fÍ^~ùe£ñgffR\\ÌË/¿Ì;#¥åÿÿ×.--­ÂuZBBóæÍîž7CóSܾ}›uëÖñöÛoW˜ÆÎÎŽ±cÇÒ®];F�EBBãÇ�ÇÁÁooo¶nÝ T®~‰GStt4“&M¢víÚ5J�º~ý:O=õT¹åõë×'''Çඦ´ÓÊ´ei§¢2¤cB!„¸�´Ž¥¿‰·¶¶æÅ_T/°:tèPn»’’�íÊÞî^VNN;vìàØ±cäåå‘‘‘ÁíÛ·«wíÚµéÞ½;ÉÉÉ´oßž¤¤$^yå•rß•æëë«vBäçç³mÛ6"""puuÅÃÃÃ`yÎÎθ¹¹1|øpºuëÆ AƒÔ!eioù-=üóÏ?ÏÀ�Ñh4|ÿý÷êrí1NIIÁÍÍM'ŸÜÜ\ƒ1i‡qìÚµKR Ñh¸víÿùÏèСÿýïèÒ¥‹záß©S'�NSÒhÕ®][í”0%þ¶mÛbkkËÞ½{éÕ«îîîŒ;ƒë´þýûÓ¯_?®]»ÆöíÛYºt) 4 G�åÒ†††Ò¸qcuREJ·‡–-[wë�ö‚ÇÙÙ™üü|õwSë—xô¤¦¦róæMÜÝÝk:”ggg§·âæÍ›jÛ¨ˆ)í´2m¤� ÓÉS9„Bˆû¨°°�FCII‰Îr+++ƒ“úc_VAAcÆŒáÚµkLš4‰ððp\\\Ê•[½{÷V�™˜˜¨3fÙþú׿ұcGŽ9b4½¹¹9+V¬àÃ?¤V­Z0cÆ ½i���177çÔ©Sdffwç€X°` ,ÐI«�Ë¡K—.lÙ²Eçeì]Û1°gÏ�‰<µOç(**0ØacJ-kkëJÅoooÏW_}ŨQ£°··g×®]Œ9’ÔÔTƒëj‚™™ 4P7˜””T.ͦM›øñÇY¼xñ=O0ª‚•«_âѳuëVŽ9‚——^^^²ÿ~¼¼¼8xð`M‡÷@5hЀÜÜ\nܸ¡³üÒ¥K4jÔÈèö¦´SSÒ˜JÚ©Ð’Ž !„â>rttÄÌÌŒ_~ùE]¦ÑhHMMU‡vèÓ¬Y³rÛròäIrrr˜:u*-[¶ÄÆÆ†3gÎÜÓ3æ_}õU233ùïÿË/¿übpGEìíí©W¯p÷¢[{÷€VÙŽWWWþùÏòÉ'Ÿ�˜˜ÈÕ«WËåiccÃ�!C(,,dÞ¼y:i uÒ:;;caaÁ©S§°··ÇÉÉI}i;†´w1äåå©Û�?žóçÏÓ©S'>¬¾bccØ»w/€:LæÀ�jÙ§N�Ò‰Á”41%þgŸ}–wß}—¸¸8F��F£áðáÃF×Õ$++«r·iÇÇdzzõj"##u†éT'Sê—xôh'±Õ¾ÂÂÂèÑ£ OÜ]...4lØPç1Ç�†}ûöáééY©¼ôµÓª¤©,i§O&Ê!„BÜG666x{{Ê|@£F�X»v-¼òÊ+·{ã�7X¼x1ï¿ÿ> 6äÓO?ÕIHûöíñóóÃÁÁ�›7oòõ×_Ó§O~þùgõÉ UaeeE·nÝXºt)�:uR;Ê–­U\\¬^xß¾}›Ã‡säÈ&Ož ÀK/½Ä¶mÛèÞ½;�†E‹©wäææ²ÿ~^yålmm9räÖÖÖê6Ê–7uêT~ûí7Ž?Ž��Ï?ÿ<õêÕã·ß~P]× AÌ–-[;v,^^^\»v�[·n@›6mˆŒŒ¤[·nŒ7Ný§¾lgLË–-iÒ¤ ™™™œ9s:vìȱcÇ5j­ZµÒ¹ Ðæo,MEŒÅîÜ9‚‚‚èܹ3uëÖUïêhݺµÁu÷SésuñâE6nÜHÏž=qrr¢¤¤„ÄÄDY»v­ºMRRóçÏ'44”6mÚPPPÜí424I¦©ŒÕ/!æææŒ3†¨¨(6lÈsÏ=ÇÇŒ¥¥¥NÇDeÛ©©mù^H;}²IÇ„BqŸðÑG1sæLŠ‹‹éÚµ+QQQ:·°êHdd$þþþØÚÚÒ·o_àî?ž�†ÌÌLõ›å-Z0uêTV¯^ÍŠ+pww§gÏž÷{Ÿ>}˜1cÁÁÁê²²ekÅÆÆªwÔ¯_ÂÃÃÕG†¾ûî»,\¸�#FдiS¼¼¼HOOîÞ­°wï^¢££¹uëNNN,Y²+++½åÕ­[— 6ðù矓œœÌÙ³g±´´¤E‹Lž<™Áƒ«ihذ!;vì`Æ 8::Ò®];õ‰#ÇçÌ™3$%%‡‡‡‡:ŒCß]"ݺu㫯¾bïÞ½¸¸¸FHHGŽ¡víÚ„……±téR�mLISCñáàà@||<·nÝ¢Q£FÌœ9wwwN�:UẪš5k–Î�–)S¦w»hÑ¢rçª^½zÔ¯_ŸeË–qéÒ%¬¬¬xþùçY¾|¹ÎPš  Ñh Ô)oüøñ'Á4•¡ú%?žžž•¾;àq2lØ0EaùòådeeáêêJLLŒÚÉW•vjj[¾ÒNŸl†ÿ#ºùê[oVj¹ö§¹ž÷¥Ó˜—ÚNû^û²øó§åŸ¿kÖWåÉl&„â±�••E¿~ý8pàÀûGíâÅ‹ >œÝ»wëÜ1!O.\¨ÒS\Ä£ÃÐ9î0á Ž¯ýëŽHT–´ÓÇŸ™™™;p(ŠKýÔüù»¦ÔK)õÒ¾§Ô{J-+û^)õ{iú–Uf}¥ÉB!Ä#âôéÓ4kÖì�~{´ÿ~ºté"�B!„¸o¤cB!„xH¥¥¥‘˜˜ÈÍ›7¹páÑÑÑŒ5ê�ưsçÎj"„BQ™cB!„xHåååñÉ'ŸDÆ ñññaèС¬üôôtΜ9ƒ‡‡Ç+S!„O™cB!„B2výI çøÑ'çðñ'sL!„B!„B<@OäPŽôôt4�ñ„B!„O˜ .Ôtâ>“süè“søø272ïx";&k:!„Bˆ‡ŽÜ"þø“süè“s(GOfwŒB!„B! Ò1!„B!„ Ã„/j:!ÄJ:&„B!„BQc¤cB!„B!„5F:&„B!A—/_æòåË5†BqϞȧr!Äý Ñhˆˆˆ >>;;;–.]JË–-HÙ………¸»»G³fÍî)/???|||4h�Þr4 uêÔ¹§2 1býû÷g̘1÷­ Cûx?Uåø‹5((ˆ„„„rË{õêÅ’%KÊϪîûž={øöÛoùý÷ß¹uëŽŽŽ :”¡C‡ÖØñ¬nÅÅÅlذ�ü‘sçÎñÌ3ÏЮ];&OžLÓ¦Mx<ûÛß8}út¹åìÛ·víÚ…�� Ý»wÇÚÚZo}¨.EEE¬^½š„„rrrhݺ5ÿøÇ?pssÓIϦM›ÈÈÈ cÇŽÌž=› w�óÖ­[Ù±ciiiXXXàææÆ´iÓhذ¡Éùèsûöm¢££Ù»w/Š¢àîîN@@@…m.##ƒ·Þz‹àà`<==ïñ與EHHÙÙÙ„‡‡×t(5âĉ¬Y³†“'ORRRB×®]™1c:éLi_†Ò=z”‰'ê�¡[·n|øá‡å–›²Me>#ÄãC:&„¢šlÛ¶�ÇóÕW_annŽ­­mM‡Tí>þøc222X´hÑ}+ÃÃömÛÞ·ükÒý:~Æ ã�wÞÑYfiy÷O|uÏ… räÈ&OžÌ´iÓ(**âÔ©SÔ«Wïžò}˜äçç3yòdRSSqpp }ûö¤¥¥±cÇ §K—.5[·nݰ²²Rß›››S§NZ·n p_; ËZ½z5ÉÉÉcooO\\þþþ|óÍ7<ûì³ìܹ“°°0‚ƒƒiÞ¼9+W®d„ lÞ¼™ÚµkcnnÎÙ³g™4iÎÎΜ={–/¿ü’éÓ§óù矫eËGŸ>ø€[·n±råJrssYºt)DEE•K«( ÁÁÁܹsçþ,Q#RSSIHH sçÎ5J�(..&88˜Q£F1cÆ ²²²X¼x1 .dÙ²ej:SÚ—±4;vdÿþý:åk4† †———ÞøLÙÆÔÏñx‘Ž !„¨&/^¤]»v<óÌ35Ê#mÊ”)5Â#ÇÊʪÂN‚{=ž >|˜/¿ü’ºuëªË]\\î)߇ÍÚµkIMM¥OŸ>,\¸+++E!&&†5kÖ°hÑ"6oÞ¬ÓAð Ì›7¯Ü7�ëׯà±$''3bÄ^~ùe¦M›ÆÞ½{9yò¤Ú1±víZ¦M›Æk¯½@pp0ÞÞÞ$$$àíí�¹¹9sæÌQólРíÛ·ÇÓÓ“¬¬,ž~úi“ò)+;;›]»v±sçNêׯ@DD àÌ™3åêìæÍ›)((xìêò“L£Ñ‰ŸŸ'Ož¬épj„¥¥%_|ñææwGì;::âïïÏ»ï¾Kaa¡úfJû2¥-—ýÛsðàAàî]{ú˜²�©Ÿâñ"BˆÇžF£aýúõlß¾�ììl^zé%iÒ¤ p÷Öö‘#G²}ûv~ýõWÂÂÂèÚµ+%%%¬\¹’øøxEÁÓÓ“ääd¢££Ë — á›o¾à‡~ U«VlÚ´©Â¼‹ŠŠX±b»víâÎ�;ôèÑlllŒ®/))aÕªUÄÇÇSRR¢þÓ elûƒ²jÕ*Ο?Ï3Ï}¨]»6ü1»wïfèС̚5ˤã;`ÀvïÞÍéÓ§iÑ¢³fÍ¢]»vzÏWÙa~~~xxxpèÐ!~ÿýwš7oΜ9s8~ü8qqqüñǸ¹¹ñÞ{ïaoo_¥2õÅ`hûªÔ©Ó§O—;~Ó§O'**Šääd®^½J£F�?~<¯¿þºIqšº/††Y«+111Lš4I§SBŸ_ý•~ø�S§NÑ´iS騱#`üx[o¨¾‹¿¢6XZaa!_|ñ666Ì™3GýÇÝÌÌŒI“&qàÀRSSINN¦W¯^tïÞ�áÇ“““Crr2õêÕcäÈ‘ 2Dͳ  €åË—“””D^^�:ubÆŒê>uïÞ�¾}ûbmm;}û(,,ÄÇLJI“&™|n»w•»wïÖ»ÞX Uáàà 3¼$//�ÜÜ\Z´hÀùóçIKKÓ¹(©U«={ö$11Qo‡@VV666ê�fUÉçâŋԯ__í”xöÙgéС?þø£NDff&Ë—/gÅŠ,Y²Äà>Wå3ÈÔÏXQ½¶mÛ†««+ÎÎÎOlÇ vJh988 ÑhÐh4€ií«ªm966–ÁƒS«V-“ã5e›²ŸeI;}ôÉä—BˆÇ^LL {öìaÉ’%lܸ+++&OžLQQ‘šfîܹxxx°fÍ^zé%¢¢¢8tè‘‘‘¬ZµŠœœ222ô–1wî\F�ÅÀ�IIIaÓ¦Mó^ºt)—.]bÆ |þùçdffêÜjll}tt4$""‚Õ«WSPP �¡ísss ÀÛÛ›~ø�ˆˆ½c«KJJ˜={6...üýïÇÏÏ�ñãÇãååEJJ ³fÍ2ùø†……1eÊ6oÞL‡˜òO±} IDAT2e yyy&�¿œœV®\ÉôéÓÙºu+Í›7ÇÏÏ�ôôtÂÂÂøì³ÏÈÈÈ`ùòå:ÛÝK™Æ¶¯J�ÒwüjÕª…££#áááÄÆÆ2`À.\È… LŽî^œè¼´ÿ€c¨®Ü¾}›‹/òâ‹/Ìãÿûß~û-ï¼ó[·n¥}ûöÌš5K=ÆŽ—¡õÆê«±¶úÛ`iéééÑ®];½ÿôöèѸûϼֺuëøõ×_yùå—¹|ù2‹-"))I]?{ölbccqqq¡{÷î8p€€€�óGbb"ŽŽŽäää°fÍ~üñÇrå/Z´ˆ   õµk×.ƒç£21TÖ¤I“رc ,à›o¾aêÔ©¼óÎ;4oÞ¸;!§��]¹Ž,'''®^½ª³L£Ñ�ŸŸÏ±cÇX¼x1óçÏW/L*“�–��7nÜÐiçÅÅÅüòË/\»vM]¦ÂáååÅ /¼`tŸ+ûdêg¬¨^¹¹¹ÄÅÅ1nܸšå¡sìØ1Z¶l©û2¥}U¥ ^ºt‰ÿûßêü7¦0´�¡Ïˆ²¤�>ú¤cBñX+,,dãÆ�Ì�;—Ö­[Ó´iS.\È­[·t." „��...Ô©S‡;wî°yóf‚‚‚pqqÁÑÑ‘   *ÅP6ï[·n§NDÕ A&Ož¬Ž¹4¶¾°°�ØØØ c3¶ýµk×(**âµ×^ÃÖÖ–V­Z•»“@QÂÂÂÈÏÏgþüù÷||ß{ï=:vìHƒ ð÷÷ÇÞÞž�;wštüììì ¢]»v8880jÔ(Æ�OóæÍiÞ¼9ÞÞÞ;vLg»{)ÓÐöU­SyóÍ7iÕªM›6eìØ±4nܘ'N˜'ܽ%½[·n:¯²ÇCcu%##EQÔo—*booϬY³xñÅqpp`̘1dee‘žžnôx[o¨¾‹_ËØ¹ÈÌÌÐ;\ Q£F:·›6m"44Tm#±±±œ9s†йsgÂÃÃY¸p!œ>}º\çæ×_ÍÊ•+™}Ôõׯ_ç©§ž*·]ýúõÉÉÉÑY–��@÷îÝ™0adggW)­æÍ›Óºuk>øà®_¿Nvv6K—.ÅÑÑ‘7n¨é¾þúk~ÿýwþñ�˜´Ï•ý 2å3VT¿èèh&MšTáü#OªÛ·o³nÝ:FŽ©.3¥}U¥ ~ýõ×¼öÚk•š ÒÐ6†>#Ê’vúè“¡BˆÇZff&ÅÅÅ:“ÿY[[óâ‹/’––¦.ëСC¹íJJJt¶+{k¤©Êæ}áÂ4 ãÇ�ÇÌÌ ¸û­Þ­[·LZŸ‘‘a06cÛ;;;ãææÆðáÃéÖ­ƒ *7©ß·ß~ËñãÇIHH08¦ÞÔã«�Ck‡*uW@éýÓ>é$??_½�tvv&??_g›{-³¢í«Z§*’““ÃŽ;8vìyyydddpûöm“ãðõõeúôé•ÚŒ×í|)Fÿa+]Oš4i‚µµ5ùùùF�WË–- ®ïÙ³g…õÕXüZÆÎ…v?¯\¹¢w}VV€Î.GGGõ›;íÚó¯ý™’’Rîi¹¹¹êïvvvêqkß¾=€ÞøwîÜYa§IEL�¡².\ÈÕ«Wùꫯ¨U««W¯fÈ�!¬Y³†V­Zagg§wnÞ¼Ynú÷ïO¿~ý¸víÛ·ogéÒ¥4hЀ=zT*-sss aèСØÛÛ3zôhàÿOzéÒ%¢¢¢ð÷÷×òaLe>ƒLùŒÕ+55•›7oâîî^Ó¡cEõÚºu+GŽQŸê íLôòòbÁ‚Ol‡Å¦M›øñÇÙ´iêrSÚWeÛ`||<ööö•zŠ)ÛTôQÒNn2”CñXsttÄÌÌŒ_~ùE]¦ÑhHMMUµ§O³fÍÊmW]7nLݺuILL¬Òz}ûT™íµ\]]ùç?ÿÉ'Ÿ|Bbb¢Î˜Ñ&MšÂúõëu†'ÀÝNC±”=¾×¯_W'Õ:qâ­Zµ2ß½¸×2 m_Õ:¥Uúø�йûæ›o¾á§Ÿ~â¹çžÓ¹¸IOOWç2HIIPãuvvÆÂ‚S§Naoo�“““úºßOõPå¾Å Ýß²�Ï=÷œ:TÂÅÅ…† ê ›Òh4ìÛ·Ïèøm+++uŽ�{ɧ´ôôtNœ8¡7Y°`‡æçŸ&%%…””ÚµkGXX)))Uꔨˆ¡ÏXQ½‚‚‚t†;………Ñ£GžØN‰øøxV¯^Mddd¹ÎVSÚWeÛàæÍ›yóÍ7Mú¢ ªÛ”þŒ¨.ÒNÒ1!„x¬i/8BCCIMM%;;›ððpxå•W n÷Æo°xñbNœ8Áõë×užÿ Ȇ *“¥¥%~~~DEE‘’’BII W®\!55Õ¤õÆb3¶}nn.ß~û-W¯^åöíÛ9rkkkìììtâ|å•W˜4ióçÏ'==€† rôèQþøã L:¾uêÔáĉüüóÏܸqƒ˜˜òóóÕlªz 1V¦��™™™êE\Ù m_Õ:¥ïø988póæM¾þúknܸ¡>]¡ôSŒÅZY¥ó3VWàî0‘¶mÛ2räHbcc9wî/^$>>¾\§•>ÆŽ—±õ†ê«)ñW¤ìqüÇ?þAóæÍ9xð äÿþïÿ1b!!!ØÛÛTþõ¯¼÷Þ{„††bff¦ŽinРƒ&77—±cÇâE‹˜;w®©§©JìììÈÎÎfåʕԫW¯ÚchÓ¦ Í›7göìÙœ8q‚k×®Ï7ß|CïÞ½�»ßBŽ3†èèh’’’¸rå ¡¡¡XZZªíïâÅ‹„„„pèÐ!.]ºDzz:7n$11Q½ÝÜ”| üyŒ��åèÑ£\¾|™ÄÄD¦L™Â„ ŒÎ“R�LýŒâ~IJJbþüù,X°€6mÚ¨“"k'6¥}™Ú~ûí7ÒÒÒ0`€ÞxôýÝ2´�)Ÿ÷JÚéÃG†r!{|ôÑGÌœ9“ââbºvíJTT”ÑúÀÀ@"##ñ÷÷ÇÖÖ–¾}ûwÿXk4233Ë} aªqãÆQ»vmÂÃù|ù2Œ=Z½]ÞØú²± 8PçbÖÐöyyyìÝ»—èèhnݺ…““K–,Ñû-êØ±cùí·ß äÓO?å�7ÞàÀ�Œ1WWW>üðC£Ç·^½zôíÛ—ÐÐP®_¿N‡X½z5µjÕºçãXCeÂÝ‹í��Ο?OXXX¹Œm_Õ:¥ïøM�:•Õ«W³bÅ ÜÝÝéÙ³§Î6Æb­¬Òù…‡‡­k–––¬\¹’¯¾úŠ]»v±bÅ ÌÍÍiÙ²%C‡5©LcÇËÐzcõÕXüúè«w|þùç¬Y³†Ÿ~ú‰cÇŽÑ´iS†ÊäÉ“Ë�©¶µµå…^ààÁƒ4mÚ”·ß~[�'B»O 6dÇŽlذGGGÚµk‡¢(•úF±2¦N�ÊÒ¥KÙ²e ùË_ª=†Zµj©�Øœ9s&yyy8::2qâD�º0lØ0EaùòådeeáêêJLLŒÚ~êÕ«GýúõY¶l—.]ÂÊʊ矞åË—ë<ÒÓX>eÏã�;w8~ü8k×®¥°°üýýøLû•ùŒ÷‡§§çý„…  Ñh ÔY>~üxÞ~ûmÀxû25 ܽó¡ÿþÔ«W¯\,ý�7´�©Ÿ÷BÚéÃçþüe4ž¯¾õf¥–kšëy_:�y©í´ïµ/‹?Zþù»ög}EQVb_„¸;fµ_¿~8p@þpU‚ŸŸ>>> 4è‘)³&b�ŽîÝ»óôÓO³uëÖš¥Ú]¸p''§šCÜG†Îq‡ _p|í_pD¢²¤�>þÌÌÌÜ�@ P\ê§æÏß5¥^J©—ö=¥ÞSjYÙ÷J©ßKÓ·¬2ë+M†r!„‰NŸ>M³fͤSB!„Bˆj$C9„¢iii\¸pWWW²²²ˆŽŽVÇ� !„B!ª‡tL!Dòòòøä“O ¢aÆøøø˜<¦^!„Ba™cB!„B2výI çøÑ'çðñ'sL!„B!„B<@OäPŽôôt4�ñ„B!„O˜ .Ôtâ>“süè“søø272ïx";&k:!„Bˆ‡ŽÜ"þø“süè“s(GOfwŒB!„B! Ò1!„B!„ Ã„/j:!ÄJ:&„B!„BQc¤cB!„B!„5F:&„BñP¹|ù2—/_®¶tB!„x¸=‘OåBˆGÑõë׉‰‰áßÿþ7YYY888ðòË/3sæLlmmñóóÃÇLJAƒU)ÿ²ÛËÏX<5ÁXÌAAA$$$`iiIóæÍ2d#FŒ¸¯�ç1býû÷g̘1z×âîîN\\Íš5«R�†/¿ü’„„þûßÿòôÓO3bÄÞzë-£Û&''³mÛ6Î�;ÇÕ«Wyúé§yùå—?~<Í›77©üÛ·oS\\Œ���αüÛßþÆéÓ§Ù¹s'FóÉÏÏÇÇÇ€]»vacc£7o}éŒéÞ½;ÖÖÖjÐÆ¦ekk‹‹‹ 'N¤S§N&í÷½(OEÇ0??Ÿ�7²{÷n233©[·.­ZµbìØ±téÒÅh9å[·oß&::š½{÷¢( îîîP§N�t7nÜà£�>âØ±c\½zggg&NœÈk¯½À‰'X³f 'Ož¤¤¤„®]»2cÆ �:bjYeUGÙâÑBvv6ááá5J�¨lÏÈÈà­·Þ"88OOO�uñññlÚ´‰ŒŒ :vìÈìÙ³iРG�eâĉzóìÖ­~ø¡ÑX •­Ñhضm+W®äƒ>0éóN<ºäŽ !„xò�üƒÂÂBþõ¯ñÝwß±téRÚ¶mK½zõžøx*cذaìß¿Ÿï¾ûŽQ£F±jÕ*Ö­[w_Ëôðð mÛ¶÷µŒ]»vqøðaþïÿþ�/¿ü’‘#GòᇲgÏž ·Q… àïïÏ¡C‡°µµÅÕÕkkk~øá,,,L.ÿý÷ß§G�œ={öžö£N�:´nÝšÖ­[« úòÖ—®ªzöìI¯^½°²²R�áùóçï)ϪзŸ�†3fCNN;vä©§žâÈ‘#W9ߪúàƒÈÌÌdåÊ•„……ñûï¿ “&;;›‘#GR»vmÞÿ}>ûì3† ¦^LïÞ½Y»v-áááœ={–… Vº¬²ª«lñèJMMU;ûžD•­ãŠ¢Ì�;wÊ­Û¹s'aaaLœ8‘uëÖQ»vm&L˜ ¦íر#û÷ï×yíÝ»¼¼¼ŒÆj¨ì””|}}Ù¸q#ÙÙÙ•< âQ$wL!Ä#àäÉ“ddd°iÓ&õbÑÁÁá¾_ì>*ñT†••õêÕ£^½z 8�¼¼<>ùäÆ�wßÊœ2eÊ}Ë[«OŸ>:ÿúøøpôèQ’’’èÕ«—Þm¶lÙÂ÷ßO§N�X´hÏ>û¬º.'';;»ûwYæææ¬_¿¾ÚÒ™â½÷Þ£~ýúh4Þyç~úé'öïßOË–-«%ÿ{qêÔ)~þùgÜÜÜX¹r%fffP»víKvv6»víbçÎ�Ô¯_€ˆˆ À™3gpqq`ݺu¸¹¹¨nÛ¢E õwKKK¾øâ õî GGGüýýy÷Ýw),,ÄÊÊÊä²ÊªŽ²Å£K£Ñ‰ŸŸ'Ož¬épjDeëøæÍ›)((ÐÛ¦Ö®]Ë´iÓÔ»�‚ƒƒñöö&!!oooÌÍÍË}qðàA€ ÿî˜R¶¢(lܸ___ @ß¾}M?â‘%wL!j”F£áÓO?ÅÇLJž={2mÚ4.]º¤®÷óócçÎ�L�:RRR())!::šðÆoÁàÁƒÉÈÈÐ[ޱô~~~|òÉ'Lœ8|}}9vìX¥âüøã�™0aŒ5ŠÔÔT¾üòKÞzë-<<<˜1cÿûßÿÔmŠŠŠX¶l  OŸ>,Z´ˆüüü ã¿sçüñ‡Áãù믿2iÒ$½ûP™òŒ1%CåÉ�!CxõÕWñññá‡~ÐÙ¾¢s°iÓ&Þ|óM<==Ë� CÇ@ŸŽ;’““£ÆVQ¹†êÀܹs ÖÉ÷ÓO?U¿ÝõóócÛ¶m:Çoùòå 8�×_½ÜíÆÆÎ•¾õÝ¢ÿôÓOSTT¤w¿5 +V¬P¿Y.Ý)”ë”((( <<ooozöìÉŒ3Ôý/=DÆ××—®]»ê-î_øàƒԋ̾}û²zõêriz÷îm4ïÒéþ÷¿ÿ¦Ö©�²lÙ2 +Œ¥,sss:wî  7Cû w‡ÁŒ=šîݻӿ¦L™Bnn.ÙÙÙ¸¹¹1vìX5mdd$nnn$&&–+»¢ý¼råŠGésimm­žóê:7Æ\¼x‘úõë«Ï>û,:tàÇT—}÷Ýwê0›Š”­¯h44M¥Ê*«:Ê.«*ŸïÄÏÏ�×^{�Áƒm0&Q=¶mÛ†««+ÎÎÎ5J�2µŽgff²|ùrfÏž]î¹óçÏ“––¦ÓÁP«V-zöì©÷3L+66–ÁƒS«V-ƒ1*ÛÌÌŒ¨¨(µóÃÒN}Ò1!„¨Q111ìÙ³‡%K–°qãF¬¬¬˜�­[·Ò¼ysüüüHOO',,ŒÏ>ûŒŒŒ –/_®–¹téR.]ºÄ† øüóÏÉÌÌ$**JoüíÛ·§uëÖüýïgýúõ\½zµ\šÿýï|ûí·¼óÎ;z÷¡2åcJ<†Ê«U«ŽŽŽ„‡‡Ë€X¸p!.\ÐÉC߹߰aÛ·o'88˜/¿ü’þýûcoooÒ1Ðçúõë<óÌ3:sè+×Pðòò"))I矾ýû÷Wø-Ott4$""‚Õ«WSPP`ò±3cYÇŽãùçŸ×»îÒ¥KäææÒ¶m[6lXáñÑš={6±±±¸¸¸Ð½{w8@@@�Fç×=zð÷¿ÿÝ`^qqq$&&âèèHNNkÖ¬©ðbÓÔ¼k×®Mrr2ŽŽŽôîÝ�FÃgŸ}ÆÇltߴΞ=ËÎ�;Ô9& í÷üA@@—.]bèСôèÑkkë*ͱRÑ~¾ð ԩS‡'NàããÃG}Tn˜IužCììì¸qãyyyê²ââb~ùå®]»@nn.yyyÔªU‹3fàááÁ Aƒˆ��5˜÷±cÇhÙ²¥:,Ç”²Êª®²Ëªìç{nn.x{{óÃ?Qn켨~¹¹¹ÄÅÅÝ×»ßUúê¸v…——/¼ðB¹m._¾Œ��uëÖÕYîää¤÷o>Üý»òïÿÛhç ±²«BÚ©¨ˆ™‘—¹ž—w‡–Xµþ|ÕþóUçÏ— P÷ÏW=À¨ØöÀÓÀ³@C  Ð h´žÚQ„…;wî(¯¾úªrâÄ uY~~¾âéé©ìÞ½[QE5j”¬³ÝíÛ·www�í WWW%==½\9¦¤5j”òÍ7ߨë333WWWåܹs&ÇYzû“'O*®®®JVV–ºlãÆ�Š���¢(ŠróæM¥sçÎÊ•+WÔõ¿þú«Ò¯_¿ �×­[·”õë×+}ûöUºté¢Ì�;W9}ú´º~Ô¨QJll¬Þ}0¥¼Q£F)qqq¾¯L|8ݺucРAò4�û,55•›7oâîî^Ó¡ÜdŽ !D�qttÄÌÌŒ_~ùE]¦ÑhHMM¥uëÖn׬Y³rÛRÙôÕ§!�7¦nݺ'�2ÆÂ‚gžyƤ™ù«£¼ÊÄc¬¼“'O’““ÃÔ©SiÙ²%666œ9sFçÛ{}š6mŠF£¹§ÙÖµOä¨L§’)uÀÍÍ�‚‚Ž9™3gxå•WLΫ´{9W%%%êDbóæÍ3˜ÖÆÆ†!C†PXXȼyótÆ —�0ÒÙÙ N�:…½½=NNNêK{µ ¥ç¨.¦ä}ìØ1n߾ͫ¯¾JçÎ�ÕÉ;Ë>Róî²åYXX0yòd–-[†F£1i¿Ÿ}öYÞ}÷]âââ=z4�†Ã‡cmm Ü�@N{<Ï�;W®ÜÒñèÛÏ¢¢"RSSu¶ÑΙòôÓO×ø¹IOOçĉôéÓ¸ûÏþ«¯¾ÊîÝ»uÒ¥¥¥Ñ¼ys�eñññ¬^½šÈÈH4hPé²ÊºŸeW…««+ÿüç?ùä“OHLL¬p\¾¸wÚI^µ¯°°0zôèABBÂÛ)a¨Ž/X°€Ã‡óóÏ?“’’BJJ íÚµ#,,Œ””š5k†‹‹ 6TçÝ�»÷öíÛ§w.†Í›7óæ›o–û2 ,SÊ~�¤�><¤cBQclllðöö&44”ÔÔT²³³ ÇÁÁ¡Â‹:ívo¼ñ‹/æÄ‰\¿~�eË–é¤ dÆ &§¿qbii‰ŸŸQQQ¤¤¤PRR•+Wt.@JïÃþóÂÃÃIIIáÒ¥K\¼x‘5kÖpòäIõ©÷Zž��™™™ê…RÙ÷•‰ÇXyܼy“¯¿þš7n¨Mš41¸õë×§gÏž,Y²„ .�ŸŸORRR•Ÿ.b*Sꀹ¹9}úô!88� ;>ŒÕGSΕ>�†ùóçsþüy/^Œ¢(PPP ÷L�:•çž{ŽãÇ�ãããÃĉ™>}ºú-¼öè 0xð`rss;v,111,Z´ˆ¹sçªyµiÓ@�`¶2OÃ0Æ”¼µxÆÅűtéRüüüÝ;2ìììÈÎÎfåÊ•zëLŸ>}pqqáܹslÛ¶Íè~Ÿ;wŽ·Þz‹ˆˆV­ZÅž={hݺ5ÖÖÖ´mÛ–‚‚F�Í”)Stž,£/}ûyèÐ!üüüèß¿?“&MbÔ¨Qøûûðæ›o>ðsËÑ£G¹|ù2‰‰‰L™2… &¨CƒF�ÅæÍ›Ù¼y3W¯^e×®]ìØ±ƒáÇ«i’’’˜?> , M›6j]-=Q­)e•­ÓÕUö½ÈÍÍåÛo¿åêիܾ}›#GŽ`mm]#�ßO¦ê¨ãæææŒ3†èèh’’’¸rå ¡¡¡ê]’¥ýöÛo¤¥¥1`À½y•m§i§Ê!„¨Q|ôÑGÌœ9“ââbºvíJTT”Ñ÷ÀÀ@"##ñ÷÷ÇÖÖV}ú�¹¹9�†ÌÌL�o ¥¿Ÿq2nÜ8j×®Mxx8—/_ÆÁÁ�Ñ£GÓ®]»rû ½�R›¶N�:<ÿüó¬Zµ ''§{.î>J0$$„óçÏ®ó>,,¬Òñ*¯E‹L�:•Õ«W³bÅ ÜÝÝéÙ³§Iû1oÞ<"""˜0aEEE¸¸¸Ð¦M�§jܦÔ�~ýúñÕW_1{ölƒy•­�Ôé”1v®ôINNVç(;^þ»ï¾£aÆåÚEݺuÕ'$''söìY,--iÑ¢“'OfðàÁ:ûß°aCvìØÁ† ptt¤]»v(Š‚™™ÇçÌ™3$%%‡‡‡G…O©,Sòvuueܸq|óÍ7ìØ±ƒ=zàèè¨Ó¡3uêT–.]Ê–-[øË_þR®333¦L™Â´iÓXµj^^^÷»¨¨âãã¹uë�5bæÌ™ê7´ .$88˜´´4lmm bÑ¢EÆ£o?�œœðõõ%%%…S§NaaaÁ /¼€¯¯¯Ú)ù ÎÍ�;w8~ü8k×®¥°°üýýË]¤¸¹¹±dÉ>þøc¢££qvv&22Rç®…  Ñh ÔÙvüøñ¼ýöÛ&•¥ï³¾:ʾWyyyìÝ»—èèhnݺ…““K–,©Ô]ZâÞxzz>ÑOX¨®:>lØ0EaùòådeeáêêJLLL¹G�nÞ¼™þýûS¯^½ryèk§¦˜5k–ÚÙ w‡qÁÝá9¥?G«JÚéÃç¾Ì¨iB¾úÖ—žáSûÓ\ÏûÒiÊÎZö)æüÿÙFµ?ë+Šr°û"„xdeeѯ_?8`Ò•ʦBˆ'Á… Lîì�&Cç¸Ã„/8¾Vÿü8âá!íôñgffæÜJ€âR?5þ®)õRJ½´ï)õžRËʾWJý^šþq�¦¯¯4Ê!„x,œ>}šfÍš™ÜÉPÙôB!„Bˆÿ×Þ½ÇEUíýÿ0ÜD ‘ uÈ´ó’ yíâ-é¨Ç”¼�0ó±ÐÀ ¦aA@ˆ?EA=jf)¤– ^ˆ"&e>‰©e(`ˆÂƒ ƒ3óûƒf73ì¹ràó~½æ53{¯½öÚ—¥¬ï¬µvãàP"j‘rssqýúu 0ÅÅň‰‰Á¬Y³,=5 &ˆ¨E*//ÇŽ;Œ®]»Â××Wç£�MODDDDDMƒsLŽ]o x�[>^ÃÖ�sL5¡69”#//r¹\B"""¢6æúõëÍ]jd¼Æ-¯aëeè£ì[›6˜pqqiî"™voýx�[>^Cj�Úf8†ˆˆˆˆˆˆˆÌDDDDD„~ó¿hî"QÅÀ5&ˆˆˆˆˆˆˆ¨Ù00ADDDÔH QXXØÜÅ ""2k Lµ0UUU¸ÿ¾Ú2???|ûí·FåsöìYxyyaåÊ•õÞÿ´iÓ°sçN£òi(¯¿þ:¼¼¼àåå…�â•W^ÁÂ… ‘’’Ò,åQ’J¥ðõõ…¯¯/¤R)ÀÇÇ'Nl�üwíÚ%÷É“'ë¬÷ññÁ¸qã´~7•\.Gbb"ÆŽ‹³gÏÖYÿÝwß åR}jjj���€¹sçbäÈ‘3f V¬X�[·n½/1wïÞŇ~___x{{ÃÏÏÂúû÷ï#** /¿ü2^zé%|øá‡uîgjÙÂÂÂðÞ{ï5w1š…¡õ«ºº111˜0a¼½½1gΜ;wN-ÍÅ‹ñî»ïbܸq=z4‚ƒƒQRR¢sÿ†Ô/Sò¥Ö�� ""¢fûöíøðÃë�Orr2úö틌Œ TUUÕkÿÇÇOûì3¼öÚkpttÒ|ôÑG(((@ll,"##qõêUšxFÈÜäää4{P²9Z¿¶nÝŠ“'ObíÚµøì³ÏпàöíÛjk×®ÅèÑ£±mÛ6DEEá·ß~CHHˆÎýë«_¦æK­ŸUs€ˆˆˆš^uu5Nœ8�M›6aÑ¢EÈÌÌÄðáÃMÎoáÂ… X:Ó£cÇŽj'K–,Áÿû_ûì3ܺu ���x衇0eÊ>0dÈTWWã‡~ÀСC!“ɰcÇlܸÿøÇ?À¨I 9W˜3gúöí ˜={6¾ùæäååA¡P ººÆ ƒ½½½Ú¯|ÆèС:tè€ŠŠ ÔÔÔàÚµk8uê „¨¨(µµ;v ùùù(((@MM žyæ,Z´VVÿ™TTT„ÄÄD¸ººâË/¿ÔÚÝ8>>^è­Ëž={`ii‰ƒ"$$ ðññÁ•+Wt–ÑÕÕ¹¹¹¸zõ*ÆŒ+++<ÿüó�H$8qâaaaaÒùj(“'OÆÄ‰áää„ÂÂBÄÇÇÃßßû÷ïÇ#�<"¤KIIÁûï¿ ¶»y}'¿SŽ�_¿~=æÍ›‡>øgÏžÅêÕ«áììŒaÆÁÕÕ½{÷ÆG}„ÀÀ@H$lݺ...¸{÷®h¾Ê{ÕÓÓ0kÖ,¤¤¤`Þ¼yÂÜ'NDbb¢Pކ¸É8111ð÷÷‡­­msÅ,è«_ýû÷ÇìÙ³±yóf|÷Ýw:t(ÆŒ£5¿û÷ïcçÎ�xë­·´¦1¥~’/ë`ÛÀÀ‘”�VÕ íììðÔSO!77WXÖ¯_¿:ÛÉd2µí4»±Ö'½ªàÂ… HIIÑ9N7==vvvpuuEee%€Ú?R�=Š¡C‡¢  R©Tø#ÐX†ž+Õãrvv†���°_///L�:ÞÞÞ˜4iž{î9£ËñàÁH¥RôèÑVVV¾³²²àå奖¶¬¬ O<ñìííqüøqŒ5 C‡Åœ9sàáá�ß~û 2™ C† Ñznmmm J8;; sAŒ=!!!BÙô•ø{GjjªÐõY.—ãöíÛøßÿýß:÷`SëÙ³§ðÙÞÞaaaxõÕWqôèQLŸ>]X÷ÒK/áÅ_ÄíÛ·qèÐ!|òÉ'prrˆ#LÚ¯²ñáãã#ô5j²³³‘ššŠaÆA"‘ 22aaa˜2e :wîŒ7ÞxtNPªz¯*�O*• �"wwwáÉ+îîî rÿ’árrrpïÞ= :´¹‹b6ôÕ¯��aß¾}°¶¶ÆÖ­[ñꫯ">>½zõª“_xx8ºu놗_~Yë>M©_†ä«Ì[‰u°ub`‚ˆˆÈUUU�Ëå�Édj ÙØØè ÔÔÔcg 0›^ÕÀ�‘››‹}ûö霌òÈ‘#())†¨ ƽ{÷Ô6vM™LÑÔs¥ü¥_"‘`óæÍÈÎÎÆÁƒ///¬[·Î¨rœ={ …BB ÷üÜsÏÕ™—£[·n°±±Á¾}û°wï^œ8q©©©8vìvîÜ)œ…B¡uÆÎ«@xŒž²‹µ¾2&àØ±cjiNœ8Ñì� MÖÖÖèÓ§�èã@-,,àä䄹sçâòåËHOO790¡œÔOÙ GÉÍÍM­k÷îݱiÓ&µ4 .4y¿Ôz©4ÔýK†KLLDvv¶Ð³«¸¸@mO¯5kÖ´Ù€…¶ú•——‡C‡!%%E¨7¡¡¡Xºt)¶mÛ†�?þX-Ÿ½{÷"##{÷îÕû‚1õ˘| 9V%ÖÁ–‰� %""2€‹‹ ,,,ðÓO? Ëär9rrrtŽ�íÑ£G�ít14}MMM�eÎÎÎ î]»�žž.º]yy9NŸ>�Ï>û çÎ�^G�…¥¥%²³³Ñ½{wÈår�“ljí_ÉÔs¥iÀ€øàƒ°cǤ¥¥¡¨¨Èàmóòò°~ýzXZZbþüùjE³´´Ä¯¿þŠÎ�;ÃÍÍMx)&]ºtÁ;#¤¤$¼ñÆ�Ëå8wîÜÜÜÀèG«Š¹yó¦0ÞùÌ™3BÙ )ãµk×píÚ5<ûì³j×oÿþý€ãÇ�«íK3�¢+°ÒXär9þøãájcccS¯.׉Ï?ÿ¼ÚD£@m/]ãæóòòpñâE�ÝØMQŸû—ŒŒ””á‰#F %%¥Í%4©Ö¯òòr¨3ìëñǯ3ä"99[·nEtt4œœœŒÞ¯¶úUß| Á:ز00ADDd€öíÛcâĉGNNJJJGGG þøc\¼xwîÜÁ† ÔÒa÷îݧïÚµ+~üñGüùçŸÂP ¥ÁƒÃßß«W¯F^^^�ü�?Ž.]ºsG(988 ÿþ8~ü8:uê„^x¸~ý:¤R)ÒÓÓ…n²ºö_Ÿs¥TVV† ¨¨÷ïßGvv6ìììàààPçxT…‡‡ãƒ>€¿¿?¦OŸŽ‚‚,^¼X˜«ÃÉÉ “'OFYYæÌ™ƒ¸¸8„††båÊ•€ßÿÓ§OǺuë°eË¡7BïÞ½ñøã�ãÙgŸÅÍ›71kÖ,¬_¿o¿ý6.\¸ ÷xÄ̘1«V­Bxx8€Ú1Ó†”ñÈ‘#P§·KÏž=áì쌂‚\¹r@í5-))All,¤Ri�ï�%""ééé(,,ĵk×™L&<òóÆ� Cff&nÞ¼‰¼¼<ìÙ³iiiz»skÒ¼fÍš…„„$$$ ¨¨©©©8|ø°0ù%ìß¿?þø# ‘––†… bþüùÂlþõ¥ïþ%jL†Ô¯>}úÀÕÕË—/ÇÅ‹qûöm$''ã›o¾&Ej‡ý­^½kÖ¬AŸ>}PYY‰ÊÊJTWW i4ë !õË�|ëƒu°eâP"""âÓO?Å{gšš 47nÔ;Ù`PP¢££{{{¡�&‘H —ËQPP ö‹‘®ôðÊ+¯àÔ©S˜6m €õë׫íoΜ9øå—_„íÛ·«å¯ú4M#FŒÀ®]»„÷ßëÖ­ÃüùóQ]] ôéÓGœèÚ}ÎPûkÞñãÇƒŠŠ ¸¹¹!""666¢çK)99–––pqq���fÏž�ǼN¹ºvíŠÃ‡c÷îÝpqq�§§§0ᦣ£#’““QQQ�G}ï½÷žð‹kdd$>ýôSœ9s_}õÜÜÜ„¡ÆðõõEaa!222àìì á1©úʨÆ!6 ÇÛÛûöíÃñãÇááá�Å‹ã“O>Á×_�!C†Ôù®ºOC-[¶LmøˆrÈиqã ¹\Ž.]º 66ùùùx衇ðÌ3Ï ..Nx‚IÇŽÑ©S'lذ7oÞ„�� þñ�`Ó¦MjO31d_š÷‚——"""°}ûvÄÄÄÀÝÝÑÑÑB�‰àÂ… ضmªªªàáá�€€Œ9Òès¡�®û—šÆÈ‘#ôš¶$†Ô/kkklÚ´ ›7oÆ{gòòr¸¸¸àÍ7ßÄ”)S„¼Ö¬Y¹\Ž   µ}Ì›7o½õV�:hhýÒ—o}±¶L�5m³¾|ÅÖ[¨,W¾KD¾«¦‘¨l§ü®|Yþõnõ×gå{'…BqÚˆc!""jPÅÅÅxñÅqêÔ)ƒþP26=‘©®_¿®wȵlº®q¿ù_à¶5q‰ÈX¬§­Ÿ……ÅPwÈÔ¨¼Ëÿú,Wy)T^ÊïPù•ešß*ŸUé÷×àã9”ƒˆˆ¨‰]¾|=zô08È`lz"""¢–„C9ˆˆˆYnn.®_¿Ž ¸¸111œ ‘žˆˆˆ¨%c`‚ˆˆ¨‘•——cÇŽF×®]áëë«6Ž·¾é‰ˆˆˆZ2Î1ADDDD8v½-à5nùx [?Î1ADDDDDDDÔ„ÚäP޼¼<Èårý ‰ˆˆˆÚ˜ëׯ7w¨‘ñ·|¼†­—òÑàmM› L¸¸¸4wˆˆˆˆÌ»ˆ·~¼Æ-¯!µFm3CDDDDDDDf�� """""B¿ù_4wˆ¨�b`‚ˆˆˆˆˆˆˆš DDDDDDDÔl˜ """j� QXXØÜÅ ""ª·Æz*‡€E#åMDDZÈår¬[·ÉÉÉpppÀ'Ÿ|‚ž={6ɾ«ªª0tèP$%%¡G�õÊËÏϾ¾¾˜4i’è~är9ÚµkW¯}4SÊ®ë\@pp0RRRê,5j"""0mÚ4¼ôÒK˜={¶AùisìØ18pW¯^EEE\\\0eÊL™2Åä<ÍMMM vïÞ�ŒŒ üþûïxä‘Gàéé‰  {÷îM^ž×_—/_®³ÜÒÒ'Nœ€¯¯/ 55íÛ·‡��ìììDï‡Æ�ŸŸ�éÓ§cíÚµ9r$àÇÄ›o¾)šÞÛÛëׯ¾'''cïÞ½ÈÏÏÇÓO?�åË—ÃÉÉIëþ.^¼ˆøøx\ºt 2™ ƒ ÂÒ¥Káèè(¤ùî»ï°fÍš:Û~ÿý÷:ó¦Ö%,, %%%ˆŠŠjî¢4¹\Žo¿ý±±±øè£�ðÜsÏ•Ƙº¬ÊÐ:x÷î]|úé§8þ<ŠŠŠàîîŽ7ß|Æ 3öP©é)#Ó–þ¸P@ˆˆT|ûí·8wîöíÛ‰D{{ûæ.RƒÛ¾};òóóÚÜE1Zc•ýµ×^âE‹Ô–YYÕþ?|øp<ñÄõÊ?$$ÙÙÙX°`Þ}÷]TWWã×_EÇŽ땯9‘J¥X°`rrràè舾}û"77‡FZZ¢¢¢Dÿ°o ÞÞÞ°±±¾K$´k×½{÷€f Ò) ¬]»>>˜:u*JKKqòäItìØ3gÎÄ«¯¾*äYYY‰M›6!==åååxöÙg±téRá˜|||0vìXØÙÙáĉ¨ªª‚¯¯/üýý ¾¶>>>°±±ÁÑ£GE×ë+ƒ© °iÓ&lÞ¼zÓïß¿“'O†µµ5àÚµkÈÍÍUkÜX[[ã…^@ZZšh`€”Prtt„\.‡\.–I¥R£‚~~~>|8233qõêU¸ººbÅŠ¸pá’’’ðçŸÂËË «V­BçÎ�þo5½o¿ý €»»{› LXXX`ãÆ�õN#F³.‹1¤¿‘‘‘X¸p!Я_?,\¸åååZ¯™®ô¦\O±²[[[ÃÅÅQQQØ¿?Æ����\¿~]k¹ÄTWW£²²Rí¥ÚXÓE×uºÿ>nܸ�§žzJgÿ÷ÿ‡`Ñ¢EHLLDß¾}±lÙ2á|è;_ºÖë»Wôݧ€øý¯*//ÕÕÕðôôþ4bĵ j¥�;wâçŸÆ3Ï<ƒÂÂB„††"==]X¿|ùrìß¿ðññÁ©S§¨v]’’’�––”––">>uöŠàà`ᕚšªózSc)‡pŒ7O>ù¤Þô7oÞÄ™3g„ù0€ÚI;ê»ÜÜÜPTTdpYΟ?�ž={ªu—J¥øþûï1|øpŒ;¸zõªÖ“&MÂþýûµæÉz*ªÕµ“Í=0ADÔâUUUaÏž=X¹r%z÷î�îÝ»#$$j ™I“&Á××h×®yòd|ùå—8xð bbb`eeܹsG4ÃÓÓŽŽŽ˜5k`Þ¼ypuu…««+&Nœ(Ô'Cþí¢æÑ9J¨þÄê²}uPùïèúõë1}út:t‹/Ɔ D³ëi[ÑÒ†rµ8¨©©Q›€ÐÎÎO=õrss…eýúõ«³�L&SÛN³+³¡4ó¾~ý:är9æÍ› ‹Úr555¨¨¨0h}~~¾Î²éÛÞÝÝ^^^˜:u*¼½½1iÒ¤: 8p.\@JJŠÎqý†ž_e9”eíׯŸÎž ÚÒ›z=µ)--ÅáÇqþüy”——#??÷ïß7h[¥3f`É’%Fmè¿NʹJòóóõþQ§z�œ��agg©Tª÷|õìÙSçú^xAë½¢¯üJú®…ò8oݺ%º¾¸¸Ô†O¹¸¸Ý™•=*”×_ùž••///µ¼ÊÊÊ„ÏÂyëÛ·/ˆ6Ì�9bô¤p†–Á7oÞÄÆ�€N�:éM_UU…¤¤$„‡‡«-wpp=Î{÷î|œáááèÖ­[�aOªO!²··GXX^}õU=zÓ§OÍKõß.åöR©T(‹»»;¤R©ðYß¿]ÔôrrrpïÞ= :´¹‹Ò*i«ËbôÕAe¯4a‚ÒQ£F!;;©©©ZŸÊÁzÚú10ADÔÈ”�ˆ”Édjÿ±ÚØØèlp×ÔÔã§M Hh£üµrÏž=¢ }ë«««u–Mßö‰›7oFvv6<ˆÀÀ@xyyaݺuBš�"77ûöíÓ9�£©ç×ÒÒÒ¨™ú•éMÝŸ˜ÊÊJÌž=#GŽ„¿¿?}ôQÌŸ?2™Ì¨|L¥ï:988ÀÑÑ™™™FÿÚ¤ è;_úÖëºWô•ßP�=ö,,,péÒ%Õy¬dff&h}ô®2¢ü¥VY–çž{Nn¤Ô­[7Ñ<”OQi(¦”AŸøøxH¥R„…… ™L†   XZZâ믿V Þ$''£sçÎužŽàä䄲²2ܽ{WíºÝ¼ySè�¢ËÞ½{‘‘‘�½{÷ÂÒÒRgZkkkôéÓGkÐÉšAJ}ÿvQÓKLLDvv¶ð´e0qܸqX³f õ¤­.B³>üðÃþÆ*¹¹¹áÔ©S&—‘õ´å3·¡ 5îŬÇÏQÛâââ üôÓOÂ2¹\ŽœœáqbzôèQg»†Ò­[7tèÐiii&­;&c¶W0`>øàìØ±iiijãË���†]»v© ‘jƒ6ºÊ¢y~ïܹ#L ªtñâEôêÕK´\ºÒ›z=ÅÊ~éÒ%”––bñâÅèÙ³'Ú·o�+W®Ô«e C®ÓÌ™3±{÷na¸ƒ±ô�/Cϧؽbè}¦Oûöí1qâDTUUá£�>~u€o¾ùgÏžÅã�?®Ö¸ÉËËæÉÊÊ¡¼îîî°´´Ä¯¿þŠÎ�;ÃÍÍMx5öS= E£•aÍš58wî~øádee!++ žžžˆŒŒDVVV� yðÏþS­ÁÔ>Ñ¥k×®jC©är9Nœ8¡wxrr2¶nÝŠèèè:$1r¹üñÜÜÜŒ8RýtýÛEM/88Xm¸Sdd$FŒ�””%€¶ºlÍ:(‘HðüóÏ×™´777®®® R^¥V\O[e›Ù܆Ð<� =ëŸeªADÔD”�žððpäää ¤¤QQQpttÄàÁƒun÷Ê+¯àã�?ÆÅ‹qçÎlذA-MPPvïÞmt™¬¬¬àçç‡�7"++ 2™ ·nÝBNNŽAëõ•Mßöeee8pàŠŠŠpÿþ}dggÃÎÎjåŒÝ»wÃÅÅžžžP(&ýêhˆÅ‹ã“O>Á×_�!C†4K”ðÒK/¡cÇŽ¢ë_{í5( lÚ´ ÅÅÅ0`âââ„:&v�Ö¬Y¹\Ž   µ¼æÍ›‡·Þz r¹]ºtAll,òóóñÐCá™gžA\\œðøØú2æß.j>#GŽl�Oa0زeËpìØ1á»r8ä¸qãjp@w]Ö¬§†ÖA///DDD`ûö툉‰�»»;¢££¬ÇDK¯§ÕÕÕ7ñ÷ér•—Bå]× "ŸÅÞÍJcþ¯dHÞ"ŸÅÞ-4¾K4ÖI4>+_–*/«¿Þm233§ <Ø´©í‰ˆšQqq1^|ñEœ:uªÅüküüüàëë‹I“&5Jzj[|||ððÃ#11±¹‹Òà®_¿ÞàÃÈ¼èºÆýæ� ÛþÕÄ%"c±ž¶ngΜ 2dÈ>U¨í9Qó×»ò¥¬Ð X@å; ´{×ü¬M£6ZÂP±×u2ôE�dC† 9 P(¤Ú³ "2O—/_F�=” """je …tÈ�! >”CWÏÑl \fVÌ)0¡ïdéZ¯!û¬úz�™™ùÿL/*QÓÈÍÍEZZîÝ»‡ëׯ#&&FÇNDDDD­Ç_mÔ0|ˆ†²·„6õic7©Æ L˜z�úƾ3±‡X÷9€šçŸ>Q*•þlb‰ˆšDyy9vìØ�_|K–,Áøñã ×ODDDD-ƒT*ýùùçŸODíÐ ±9%Œ @èkK×·­Þàwæ#ýùk®o¨y&Tçš°üëÝ Ï3¡|uxðàÁ~›†}6 Q ıë­¯qËÇkØúTUUݰµµ�  êóIÔàï@…êüª=)j~ ±ïš-0ÑÜC9ês`Ú ªë"hNRikk;�='ˆˆˆˆˆˆ¨©I¥ÒŸmmm§¨„z[U9Ï ¿­ •å¦jÖaÍÝcB3�¶€z åw±^ª½)”½&¬þZ®ÚcB¹\À.##còСCß±°°h˜çI‰P(ÒÓ§Oo6lXþJ¨öŽPö˜P¨,WçÐêÔò¡ÚƒËÌꉀù&T?«"4—kçÐÊ¡|·DÝaª�•°`›‘‘1aàÀ�¯ÛØØtûkQ}UWUUýùÃ?|>lذƒ¨�è²êÁÍ…ê»æÐ Ížš� å2ˆ,×õY›˜0dõ™gBÛÜb½&4ƒ–"ëT碰É«)ε|šeÐAuîÍù#4ƒªë4óÒö$JÍeÐñ®YV}ÇÒ(¬3s)`Xƒ_™NõËTÓÊQPP~Ö·Õ®/5Ðø """"""ÒG[à@5¸ 9¯„f0B5¡úYÛ>4—SÎfc� mŒ X(?+ÊïJÊ“j/´r½%Ôo üÈPí�00ADDDDDD†Q ˆ Á›ìR¦±Nl¢KÍE‹ @hcŽ� ±ÞÊ諾 4{Jh~VR¦S�D¢ñ®º^óÑ£2p(GlžÍ …f¯ ÍžºžÄ!öYפ—Ú¾7»¦LÚó¡>ùuƒÊ€„2˜¡ú®º­B#�f� Õa#ªû!""""""#ÖÃAß�±ÏªÛâÁ‰Æ44z £©Ù ùt@ÿ:T—i>ÕCõI-u=ÑC3oC�…ˆˆˆˆˆˆÚ.mC/t=YC38¨÷¶ÐöÔ CzK˜åÓ8”Ìq(`Z/ mÃ;€¿{A({L( >$D5hÁDDDDDDTºzL(×köˆÐ >hÑÌÛ”€�Ù ã̫DŽf:SzMèzœ¨fÏ ÕÞbÛ«ö’Pý¬Y"""""""%ÍÆ¿\ä³f BsN ±tºæœh¬ÞƤ3YSõ˜hÌy&T{J(‰M‚©$×X¯ÚkB™^‚¿ŸÜ¡-ÕýQÛ¦­Ý(×ñ]ß$—Ú&½ J4†&éaa®C9ñ'n¨.S},¨æ6š`B仨�e¹Žïú0XADDDDDÔºÓ`×5a¥Øp }A mû7¦·„YiÊFtC çÐü,ö(O±aº–ë›è’Á""""""2…X�@lÒJmÃ2 ®¡íñ f?Œ,›b'*Œ}:‡æwm�Íå ‘eš=.´•Eì¦``‚ˆˆˆˆˆˆL¡9ù¥¶€ƒêgc‚Ú‚õí-Ñd=,šºÁmJ¯ ÕïúzMh[nÈä™Ú>[€� """"""2�¶!ºªËôõŠÐ×[B3À`V½%óì1!–N_ð@³Wƒ®žÊÏš'ÙÐDDDDDDDúh›¸R3  ?xajP¢EhŽž�œô÷œÐ¶­X¯mûÐUF""""""j›LRaHoŠú%̾·`Þ� ±´†NŒilàBÛd˜ÚÊa,0ˆˆˆˆˆˆZ¦ú6Òuõ’Ð\ohàÁ” .�}’H“i®sC÷š[gJàBl½X"""""""Cèê%!–F_àÁÐàC‹è-˜`B,­©Á c×ëJGDDDDDDd±@D–thì „±iDs6¸›"8¡ünÊ#H�YFDDDDDD¤dH Bu™1 mi Y§O³LšÙÔOåÐÔXÁ C—:©¥©COˆˆˆˆˆˆ¨u2uh„±sBè{ÚF‹JÍß�®O`Bs™1ëu¥e/ """"""j(†ö”K_Ÿ „¶eÚ´ÙÀPÿà„æòú(T×™Ãù!"""""¢–OÛ\ªëõ}6t½®åõMÛàÌ¡ámlL NèK£/HaH:"""""""CbëŒ 84DP”ô Ê\Ù œP]×�††èÍADDDDDD­SCõJ06�aL°CŸf JæÕ˜nŒà„¡ùê f˜Óy""""""¢–C_¯C¦öÀ0&ßfcn nSÊÓC08¿54}óLˆ¥û¬+�)y7+sk|›Zž†èÑXÛQÛcL�ˆúlkj€�� 38¡š¶!�ÝÏ#5¾†là×§G…±û1æÚ ®O¹LÙVR�ý™JnÂ6õ ,˜UP0ßÀÐôÁ ÍmÍùÜQËSŸášy4õ¶�ÆÜßõ-_CŸ¹Ÿ#""""""2o ¨of”ZF£Û\ƒ -áÜQÓiŒÆ¿95UKj\7TY[Ò1QÛÓP�³H(µ´F:Ÿ¤ADDDDDD­UC?á£Eh‰�sË """""¢ÖÂ\‡4™–Ü o̲·äóBDDDDDDæ«1ƒ-* ¡ÔàMy ­á|QãkÊ A‹ H(µ–†¶9‡9–‰ˆˆˆˆˆˆLgŽs,“QZ[ã¹µ‘˜�PjÍ ùÖ|lDDDDDDÔö´š`„ª¶Ðxo ÇHDDDDDD­W« H(µµF{[;^""""""j™Zu0BU[o¨·õã'""""""óÐfšØ0WÇóADDDDDDM¡Í"4±!nž'""""""2z°ÁÝðxN‰ˆˆˆˆˆZ7ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ñÿ \�eQpIEND®B`‚bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/data/screenshots/bustle-welcome.png000066400000000000000000000760551525300766700276200ustar00rootroot00000000000000‰PNG  IHDRÊö™ oVsBIT|dˆtEXtSoftwaregnome-screenshotï¿>&tEXtCreation Timesáb 25 nov 2023 12:40:26'EG‘ IDATxœìÝy˜$w}çùOÞuuWßÕ·Ô­nµÔ- ��P·DKB#q‹cì•-ƒ �×»Œ<°àõÊ;XìØ;›Y#?¶Ö †±™áb@ #‰ÖI«¥>«ouÝwVUqìUYýˬȳ²2#+߯çÉ'2"2"¾•­‡âSß_üBÐõ.` â;Pkn½ XJu¥á{°Tª‹ fãûЬгš=6ûÏù4mpn¶ Øl?/TKÓçfŽÍð3@--éм”CäRþÙÀ–d`^jar©ý<Ð(–Lh^*ÁÒ�?‡k°´ø1œú±¦²,…0WËŸa)|_šS-lC‡åF~‹Y{`‘Ï~àjqCmCæF ƒ‹QspÎ �ÈY„s6T`n´ \­zé@qÕì87LXn¤°¸ÐZ9ËZ^ü¢’Àêæ,kyíšk„¸�+ Ç¥~¾¾?Í©ÔPZnx­Fhöu`ö{Ы´¾rr±Ïq3€¥¢Ø=ÈåìJC¯oòŸƒòBBr±c íäyK‰›ç}¡ÏåÛ¿¤Â²_ƒàBî#.5çn¯ä8h4ÅBq¾ý¥„é…Üÿì~ €•†ärƒîb„c?~ŸšCµCj¾Ð\iЮ´Žšó[°«tÒ­B�b¯mù¶»N±Ï€-d˜u¹�¹Òî²o²ßB_9õ”’½r±còH)ð£Ü [êPk¯À\ͰLPöPnH®v@ö Å~ú~ š¼ºÌ¥tŽË Ì –ý+$ç>Ö)_`®dw1~ùn,]Õ¼¸X§9w=÷1SK&,û!Ì-FHÎý\¡€\N·¹ÐgÀ�Jéþê:>7/‰°ì‡ÀWN ¹b¯s Éùr± œïºÐhŠu‚óá|�¸Ô°œ{ÝBš:(W;$ól/% —Ó‘€FUjÈ-70;y¶+ÏgŠ©[X®w,õú¥<Ò©PH.% ºŸ™Ž2€¥¢P u<¶{æJÃr9C°›2(/´›\IH.�ó…åjNòµP�÷ùfÆ^HXö}W¹^A¯š!¹PöÚ—�½ºÍ…fÃ&h4…åz3ë¹�¹”°\Ê=˾Ë~ÊÅîKÎ’ƒŸ3—A�cóÝÇ,P4Gó»¾^!7ó¾PX–¼;È…fÍ6ë(ESåju“K Éådó¸ ¼Ï �.7Ø:òî —˜–}ÛUösP.5$›ÛË ÉA�íæ{óx‚2€¥Â ÆæjGóCqnp.%,—2[¶YK)j”õ¼˜Ê›åºÔ}^!Ùk_0çs™P\((›Û`)0±ù x¼7� ä¼Ïìϼzì“ǺJÜWÉ窢ÖAy!ò=9ß²”�ÊY4ó�Df·Uþ=ÊLö ÖÊ ‘Žñ²%¥%YšÉ=îì¶Àì2~Íeæ™ìcë|K©Æaw!ü”s‡UçîË÷ù|÷+ç Éae‡äˆ¤ØW¾ò•m÷ÜsÏ­«V­º!_áºîºŠð¡@ ÐoYÖ‘ááá�>úè÷ßÿ)IIÍ„æLHèb€Î–¥ìPœ‘ˆó…d3lûF-»Ÿå »ö^]Îcžò £êb§8dlkûÊW¾²ýãÿøG[ZZÞ[êKA"‘øç¿ú«¿úëûï¿ÿ¤¤)]žmëbçÙkȶ×ýÎRñÇJ™¼¶åS“@í· ìÕάç^í5‹µ×=Ç™îrHÙa¹íÕW_}ïŽ;,óç€%åĉ_ؽ{÷?k&,›!9ó>w¯Üà¬Û¤üAYÛ½4mP.7$ç~Æœ¤+³ž7$Ÿ?þÃëÖ­ûtY? ,QýýýÿqóæÍ«ÂaÙœ;w6l¯À,�í¦R»Ê5 ʵšÍy1yî=ɹ“~™Ýds¯ÖC‡½�� ­[·îÓ‡zŸ¤Veß²jfªÜÜÌY_,5iö†jq-lØuîcŸŠ ·Îr�é"›ï£=ôÐŽw¾ó�—ý“À·zõê·,[¶ì‡�?þø¨²;Á¹“o{ô“×z±‰½ê®V…T:ìZ*”½&ï’²‡_‡•=‰WXRûØØØÿÑÚÚúž|Åd¯e¾¿^ä{”×_=À÷‰ÄBC®¤™°�HT<Ñn52X¡ŒWèšuáס׹·M*�Nëk_ûš~ðƒhpp0kß•W^©?ýÓ?ÕÊ•+ëT°xlÛ^P'9W<W$©Ê$_ àˡֹ3(Wn«=�xÕCößt�.ïŠÌ­�O;:ÖŸÖ_ÿ|B/œõ¾±¾^ÞrE«¾üoWéáŸ�ëá''ê]NÙ¾öµ¯éßø†ç¾Ã‡ë¾ûîÓ_üÅ_–°`7ÞxcEÇ=óÌ3U®dF5:É^ç\¶lÙBOSn+Œ+ Ï‹º¥£\©EíD?qtZ¶#½nKTo¼$¦k~3ªßþú€N¤ó²Må?ø�$éá‡ÖÕW_=·}ddD÷ÝwŸº»»õö·¿=ë˜5kÖèïx‡î½÷^E"�&ó¨jK&“Õš {I�ú]*A¹.ÿHü½Q�M; ¤?ÿÍ5ºa[L·\ÞBP®¢Ìpë{ï½·¬cyäýÞïýÞb•€%f±:Õ(’ßö¶·iÏž=ú⿨ÎÎNIÒøø¸|ðA÷¹Ï©»»[[¶lYй˰�¬VJ˜®[è®÷¬×KÂŽuݹ§U’æîQþ?ß¿J¿þÆëMëÉã íÛÓW~}µ‚³ÿ)ÝÿÖú½[—+”ž<>­¶h@SI7kŸí¸zædB»ÖGõgw¯Öë·D³®ûÎkÚtïþåšN»:Ö7óû½g•Þóúv ÆmuXÚ³1û˜|J ¿�p¯ó5×\#Ió&ÿ…mÛ÷ÿñÿ±6nܨӧOë�Ð< îînuuuéÁ\йјC¯Ky^WM<þ¿nÈZÿÄõÜé¤vvEtÓŽýòTR÷ÿÓ�$)èö+[µieXÉ´«÷½¡]ç†-ýæÃýJYÿHÒµ<¤÷]Û®“iýöß Èr\½çõíúü;Wèƒ{—é¥sCY×üØ#zé\J’´eUXû/oQ︭}}æØOßÙ©»¯ï(éçyøçã’”·³Ü!¨”Ÿ&órœÂ#C׬Y£‡zHŸùÌgtúôiIÒºuëôå/Y]]] :wäv‚n8¶ß:ÊÕ ½5 Ï?;zq(ôtÚÕŸ=>&IÚ¶zæïoÚÓ�ÏoÒ�ÏoÒíWÎtœ;[ƒÚ±.¢`Pzº;‘’¥™ît0 =s2)Ë™Ù÷ø«3³Ým[“ýw�¤åÎ…dIÚ>»ÿÀ©‹Ç¾x6¥r<üóqýÅOÆ=·’ÿ‡ÃŠF/Ž �D"Yë5ÒP®T�ØQö�¿7¢Ï~ÇÑ7?Þ¥-«ÂÚ{Y‹žîNÌÝüìé¤úáhÖ1=£¶nÙÕ"I æÿ·Ð™Ù2þ„ äºR"�ª§SÙëáÙû£§’ û Ñ#OÏâûÞ²\!ÍÁO“yƒÁ‚�ß‘‘=ðÀ:{öìÜ=ÉçÎ�Óg?ûY=ôÐCŸ ú­_ê?|C d;Ò_ýl¦û?ß¾\Á€trÐ’ãH»º"žttfÈš{¥lWg‡-IÒM;bІ³ÃòéÁ™}7ïl™Û·÷²š»9Ÿ3C™ó¶(:šw­¯ìñH�<=¡‡Ÿ¼øP;Åßô…/|a.$?ôÐCz衇´eË�;wN_øÂtnÐQ®ŠÇ_�ÖïìKkgWDw½¾]ÿüâ¤þù¥I½ÿÚvýí‡×ê±CSZ»,¤öXPŸÿ¯Ã:Ú›Ö‹g“zÃÖ˜þîw×ê—'“ºl]Dÿ|\ϧôTwBû.kÑ7>²NG{SÚy«R¶«¯ÿkáÀz¢?­—Î¥ôú-QýÝGÖê䀥;v·VüseîYP[‘H¤àìÔÝÝݺì²ËôàƒÎu�zè!}á _PwwwÑs£0¿åJÆ©×|l»+é«OŒëÏî^­�ï_¦½2¥ÿë±1õ�ÛzÛUmúàÞe:?bé• ©¹»Øøö°þÝ[:uãö˜þíuí:;d)6ÛAþüÖ}·uêæ�-Ú·£E‡^Ké?ÿdl®]Èg¿=¤Ï½}¥®½$ª”åê³ßÖ§ïì\ÔŸ1­Y³Fƒƒƒ:xðàÜlÖÅÌyŸy…f—áÙ÷™eg*•zÊ« ›ê/R2*ñ‹Ï¬«øØ¯~õ«zä‘G*:öCú�>ñ‰OT|m4?eIš˜˜P2™¬ê9c±˜–-ó~ÊM>ÑhtŸ¤1I¶$ËX:³ïãåξÌ÷2¶ÉØ–»n~^9ûòY”°]¯Ž²¯f4ƒÝ{ï½’¤ïÿû%?yíÚµzç;ß©�|ä#‹Y–?Mæ%ImmmUÊmmmU=_ Ô¥óì÷¡×Ÿ—¸H$¢O~ò“úä'?YïR€š …BêèèP<¯Êù:::j9‘—¯‡V³X³^``�ZZZªÒnkkSKKK*ò�EÉž< |¬­­MßÑÑшC®ëªÑ‡^À’×ÒÒ¢H$¢©©©’ï[ŽÅbjkkã¹É (@…BZ¶lÙÜ$_étZ¶mËqf&�ƒ …BŠD"ŠÅbä (.ï ëX_ñg£t—wñŸPM¡Pˆ¡Ô‹Œ{” w\¹$on¯+¾S�† l¸ç†6: UtyWX÷ÜÀ_º4‚rŽ?º«“°\—w…õGwuÖ» (‰0Ç–•!ýíï¬Ò£¦ôøá÷,—éò®°î¸²…N2€†µ(g.á¼^ûÆöÌ2è±n~&h—YϼB³Ëðìû̲3•J=UÆÏM+�î“4&É–dKgö½c¼\ã•Y—±.c[îºk¼7ym+gÙz €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €�  €!\ïX,®ëzn5®ÄõàOeÀ’�/Ô•úÙÅÔ@ã (Z9¯”óT;ðQ�‡  hH¥¼J†W+ðQ�иÊ€†R(à•ÚÍýœW¨«4ðQ_ögÌ€FDP4Œ|AÎk{±Ðg¸B¡ÎuÝ’Ãõ-¬>ü‚  ð½R^¥Re‚\¾ÀW¬;J} «¿!(|­”n§¹î8ŽlÛž{¹®›Ô�€B¡ÐÜ+ Î r¥¾Jh³×GX4‚2À·Š…dó½mÛJ&“šíSøÄc Ÿù¹bÃG›êQØŠK’¬p‡’m”\u¥[ß,kÇ[Õ¶²K±XL¡PÈ3ðºÿ¶XÍ^õ OŽé uFGí×Ô×x(¡dÈ’$Åì°–Û-Úàtêòà]¹D«ÛWÔ¶¾ñ)½ÚëèÄ€£þ©�&Ò¥œ $)´µ,’Öºv[;V´{}P«:Û˪�° h‹õ›ªØy½öŒí™eÐcÝüLÐ8.³žy…f—áÙ÷™eg*•zªŒŸP'…:Ÿ™÷®ëjrrRSg_RÇó©g~¨ �(éüN¨E£—¼]ñë>¥öK^¯¶¶¶¹g†¹Jîέ¯{ü¼~â¾¢W£½Jì’ÎqCÚ�Ú Û{tYçæE­ïTï„~~:¨c#­²œÒκڵrZo¾ÔÑö ËK®�  �%�î“4&É–dKgö½c¼\ã•Y—±.c[îºk¼7»7¨:Ï:4”¾TJH¶,KC½çÕö‹ÿ 5GÿA·´:ïZÁ°w}@S7}VkÖoV(’T^5ƒg†eYêìÓ·ž×³±3r•ý* —ê]ákµaíúêÖ×?¨uõb»Ü ÿoA0àê ë¦tçåÒ†®µ%ÕGX€ÆAP®Ýy Ê€¼J ÉÉdRÃÇ~©õ?þ¤ZÇ»«rÝÉÕW«ïŽÿ¢µÛ¯Q$™Û^(ðåÊœL&õj·þ!ò´ÓU©ocºS°öjçúmU©ïðé}ûp›†“UCW[J¿¾{Z;¶vÍÕGX€Æ×ŒA9Xü#Ô�WÐK$zùÇÚüßï®ZH–¤ö¡—µù_Þ¯�—ÿ‡R©TÞÌ—×g‰„žï}U_‹þ¬j!Y’.DÆôÕèOõü…W\ß‹Çûô�—;ª’%©o*ª¿}©]/뙫/_ øAà+ÅfjN§Ó:úŒ¶<þQER£U¿~tº_›üqõw”m_Ê]êYétZ‡z�ë-Ïh:”®z}ñPRßòŒŽõœª¸¾WNöé[G–+a‡ª^ߤÖ?Y¦ãgzçê+çùÍøAà[¹÷Õ:Ž£�žsÚðÓß_”�œ�îׯÇ?¦þ×ÎÈqœ¹íÅfávGú{ôÿÅž]”�œ%õ÷±§u¾ïBùõõöë_Žw,JHΘ´ÂúÖáv�ï雫ÏëiüŠ  ð�b]Ñññq-{úOÔ6v|Ñki9¬¶gÿ\ñx¼ä¡Íãããú¾û’"ñE¯¯7<®Çíƒe×÷ãA %¢‹^ßÀtT?ëÖ¼úrœ~DPøRnÒ²,MžyQkŽþCÍjXýêßiüµcr§hس,K'ÆÎéÙØ™šÕ÷Lô”ÎŽô”\ßÉžq½Øß^³úžëmÓ¹¾QºÊ€†CPøB± �ǵüÅÿRñ# *vê|þ?i|||®¯î­$MLLè‰ÀáŠU +äèÇÁWJ®ï_φ+~T%l…ôóÓMLLÐU4‚2Àwr;�®ëjj¤W«Îý¨æµ¬<õß45Ò7ï^àÜ{‡'Çt¤¥¿æõ½}MC“£ÅëŸÒ‰±Úu“3·jh4îùo €_”¾æº®‰„¢'WÈIÖüúa'©è©+™Læ�,+‘Hè�sNVÐñ8Ãâ²C®^µÏ­ïH¿d»µÿµo+¤#Ê[~DPø^2™TèôÏêvýÐéŸ)™œ é^ÏN¥R:b�¯Km’tØ:_´¾ãýµ²žëx¿­D"Q·ëP.‚2 î¼Â�¹Í²,µŽ«y]-£Ç”N_|ÜSîÐæt:­þðâÏt�Oh¢h}ƒ‰H=J“$ LGdYÖܺ׿1Ýf€Ÿ”¾gY–Z½u»~[¢W¶�¿#kÛ¶&"µž1M­/nÅjXQ¶);V°>ü†  ð-³óuê7t7bOå}“ëºrGv¸…ͲÂNÑúÕ¯À´Â󀟔¾çº®ŽUüƒ‹Ä¼v¾áÂv öyÍ][Þ5eÕWÇ|j»2 ¡”¾– Xvýr¨rG çÞ,I¶U¿­œk{Õ—®ãh¥g¾@Â2 Q” !Y¿[€•Ly®ë*•¨ß=¸©„U´¾D¢~_àT¯ @%Êßñ }“Óu(dÖT ×žŽ§¿�¼×NýÌx|ª•x›ð¸6Ýe€Ÿ” a|¢~×+áÚ#õKò£Å':©ß8<2^·kP ‚2 !ŒNHNn³uœÒ‚òØÐ´œ:Ì˜åØ®Æ‡Šw‹†Fe×á>eÛv48}®¯¶õ9ŽNŸíóÜ—ïß¡s IDAT? (|/È „•HICµ»nÿðìŒ×ÁpÁ`tJN[è‰×¬¾� J&,…(^_ÀÕÔtRg/ Ö¬¾3=ƒšN¤ ¸c@C!(|-˜ �v¤EÒL‡wªøÜU 65-õöϼ·#­ /þÊÌÔ” SH’ÔwvLS5˜{j"©Þ³3÷þÆÜPÑúZB3�äî³½‹/þÄccÓ:yf¦›Üv  Ë€†APø^8Vª}�¤™ÉµÎœ—ÒÖâ]ϲ¥³f†6KRª}­B¡™ l†½ÌûP(¤N7:[Ÿ«Ódž”N-Þs•Ói[gN Ï £^áÆŠÖ·¢Åš«ïå#g•L¤T¥’iK‡Ž�“3[ßÊ{®>Aà[™ ‡e­Þ6·Ý²¥s=3Ëj³,éìkÙAÜZ³Má°÷ðë@  p8¬�Áe?Ÿ¶uúø�Òéê˜NÙó‚øÆÐ²¢õmî¼xor*méå£ç•LUÿ¯ ÉTZŸË â›;]…Ãá¹zð;‚2À÷b±˜´ý�YÛ’É™@›HVï:‰äL'9™3r:°ýú™ Ô·»mCö¹¦Ó:qd@““Õ†==™Ò‰£ƒJLgwƒ÷´m(ZßÕ›"YÛâSI=ÿêY�Å«7Ž}|2©ŸÓätö?Ê5›£ëÀoÊ€ºó.ln‹ÅbZvÝÛe‡¢YÇÙ¶ÔÓ?óœã…LæìºÒøÄ̹re‡¢êxÃ�jiiɪѬ¯¥¥Eo^…Ânv·Ô²�>9¬��¸§ò]W˜ÔɓòrÚèa7 ›Ö_Q´¾[¯Z¥H0û1MiËÖ¡ã=:×;ºÀú\�ïÓËÇ.(•ÓE�ÝrÕꬠìõoL§à'e€ïƒAmÞ¾Sc[Þ4oŸëJcãRß 4�(/0»îÌ1ýCÒè¸÷±£›ß¤ÍÛw w�@@;¶nÓng•Ç5\õ÷Çu¢{P#cÓeRÇq526­î“ƒêëŸð|´Ónk•.ÛriÑúvnÛ¢«×ΟÄËq]�íÓóG{Õ7WÚ²uªgLç&µby«–·EÔ‹( (4ûÚŽ”J»šLYŸLjt<¡´eÉq¼¿ÀPÐÕû¯m-X~DPøN&Üe–’‰Dtù�·ëØsÿF›N?–÷XוÒiÉu¤PH ‡f–ÒL@¶ì‹ËbÝçþËîÐ{oW(òìÔfjËL˜µÿª7ê'¿8¢çÚò?«Øq\�O%5‘L) ̽$ɵݬ—Štw¯K®Õþ®/¹¾[o¸R?:ü’~Ù7¿ó�a;®†'’�´ ¦… †fk·åÚ¶gæå©ïÆ®qí¿þÚ¹‰¼ÌÚÍ?cÀ §Ì¾®®.EßöšèÜ–÷³Õ2±b»ZÞþZ»vmV¸Ë ¤æ¾®®.ýÖÆ½ZŸn]ôú6XmúÀæ}e×÷á›WhcÛâ?GySû´>¼¥Ö®];wý|Í¿¡£ ð%¯®r0ÔoܧÿÑ÷9µ=ö€ÂÖHÁs¤–_¢‘›ÿ½zÛwkxxT‘3Oj×™GÕa÷<.íTß­ŸÑ[®ÓܽµÅ‚žëº ƒÚ{ý›ôÁÇúõÿØ/(*üx¨õ�eú@Û Ú:ѪááQ½˜<¯'Vž×h¤ð3ŽÛí°î ^­®}cùõ½é�úHÿãúó1Å�ÂÏ6^ßáèot´µ¥o¦¾ó®žèÛ¨§¥àqá´>ô†)ÝðÆ}Y÷&ÓM4 :Êß(¥ë‰DtóÛÞ«“ûîW"º"ïçS˶èµw?¢émwÈ·É µêµ×ë»ÿ½FBkò—ˆ­Ô‰}ŸÑMo{Ÿ"‘ȼº2]Z¯î­4óÌçwÝz§~#u…Ú­ü�îrÛõ¥èzSx«bnXQ'¤�Ëõ®—»Ô1™ÿ×s‡Ö݉Ëõî[¾wß¹_Ü3¨ŽpþGWuµÛúÒ[&õ¦-¶b!GÑ ­�CzWçÓêÄó·,’Ö÷ôë®;߬h4:¯¾\„f€”¾•Û�Ì,ÛÛÛµ÷}ÒáÛþƒF:wzÛóº�ˉ-Ÿ·=jÓ“­wx3¶|»ŽÜò nzÿ‡ÕÑÑ1/Äå›,+w½½½]¿që»toâjmJ¶y^ë.]©ö@tÞö˜ÔîcÞÏ^ŸjÕG¦¯Ò=o¹kÁõÝóî7ëS¯ïÕæ6ïÐûž]j�ο9LkOàWžÇll�Ô'®éÕoÝu‹:::²®O7ÐHz ðs¨u¾í�@@���ºã½wë©U]öëÚÞû#…u±CïºNíy®q&rYÖºéä–;5ñÆ�èö[nSKKKY/w˜x¦¾_{Û]Zû‹'õ߯éÅò�‘ÎWº«óžoÝPö�è +½a|µÞÛ£[ߺ¿zõÝõV­]ù ýË¡i=7²^Ž.^÷ÊÕIIïú}ÙõÉÑukúôÞ=¶nÝGV}…j#4üŠ  ðµÜàl†½X,¦ýoù7:¾åýò¥·ik÷·téÈÓ +%'’/&K©ÀLÇÖ Fuzå :·í½Úví-ºn×®¬¤ =›8à ï¹a4‹éö[nÓÖã›õìуúyëy]1.+$µä ¡’¶f‡I;í]¦}Óµ÷ò×k×bÔwÛ-Úºù¸ž=xLO¼¶ZGâ]²RK8ÿŒÖaÍÜCØÚ¹¬W7oÖ¾×ïÈ[_¾Úð+‚2Àw …ãÜe(Ò®]»té¥—êØ±ëôd÷uœÿ…òß½<ãéKîU|Ó>mÞ¾K·îØ¡¶¶6ÏÀY¬3šÛéÎ�€Ì¬ïuÇŽéØ™n½ìöJ[ ×wç¹.]X¯�[·kG-ë;yDûÂ’Ö¬ï­këê®´vnÛ¢;Þ0W_¾Oh4‚2 ¡x ÍÎtG¯ºê*]yå•zùå’ ?ãwùM¿£}W]5×-6„¹”¡Íù¶çÖ·ýå—‹Ö÷ž-7ê*×÷ÞÖyÖWjMø“y|©X2_G5 iýúõEÏ¿nݺ¬aÂÅÎ]nÝùλ”ë+µ{L€øAДjÕ­ôœ�XKA°$,$¸•r¬ëºžÃ—óm¯ä 9ÖïõÐH¸GàK¥„;/Õ m™ûws·;¦Vê]_¥ßµWÝø eÀ’RIÌ“»,÷|^Çy�s©ÔWË? PKt”¾“oq¹Ç,´†L׳Üs×"@ú©¾bâ|�oºÊ¿¢£ ð•b!¹š�Z¯kä^«Ô{|½>[Íý^Ÿ×ùŠu¾éHüŠŽ2À×Jf¼ÐáÃfgÖ|æ°Ùñ\èç¥^_¾±WýøAà…‚Z<ÏÛ±Ì]Æãñ¢×ŠÇãYŸózðBå ¡K­¾Üç'{-;::òÖ@xøÍbýf*v^¯ýc{fôX7?4ŽË¬g^¡Ùexö}fÙ™J¥ž*ãgÔHnPά÷ôô¨ç¹z”„*Ù°q‹6lØ i~Ð'(€¿E£Ñ}’Æ$Ù’,cé̾wŒ—k¼2ë2ÖelË]w�÷¦bCžª~/e€ï¹®«eË–Õ» ,÷# Aà ùºÉ­­­µ,‹(w¸5ï~CP4„áá‘z— @  öŽvÅ'âU2™ÔÊ•�jii©wi’ü]ßšµ]õ.€’”¾–é, Õ7(‡‚Au­_«h$"i¦®x|RçÏ_ÐÆ�ÔÒ£¾Ö¬í¢s he@C¨wGy]׃ÁyÛÇQw÷)mØPߎ©ßë ‘”¾–é@Ö;(oݺ1ï¾ÉÉ)ê+Ýd@£ (B݇^‡By÷¹®K},!e€/�¬™®Íõ 6èêkvKÊž {19ä5ûöÈHñ�¹aã:­X±bÑŸì÷úrÏ™yŸy†²×5é4ü†  ð½@  w¼ãsëÕ Ë^ÇçnëééÑà@oÁóÜvÛmYaPò€å†B¿×Wèø|ïð;‚2À·Ì®r¡÷¦rƒsîó|Ím•†ðjvL©¾|Û Ì€FCPøFîðëÜmùrî�íJ˜�.ʽ^)çÌ|f±¢ßëËwŽb× 8üˆ  ð=¯€\­pœï Ò]( –Z¯ßë+õüÕ:'µBPøJ¾è5Ù—©’à˜Û•Î×Ñ®ä|¹Û* Š~¯¯Ô:Jž €Ÿ”¾S(,g,$0š¼†1ç ¥¥Ê Ÿ âì÷úŠ]£ÒýÔAàKÅ‚`¡ UN€ôÒ\Í¡Í ¡~®¯Ò°KHøAà[•Îî\JËwÿoîyªuírïÙõ{}• Aà{…†\/äœÕ:W%×.å3~®¯ç VÊ€†RɌхÎUès•Õb�kªfp¬g}`ÀR¬w,†@ �õò’/hšÛ]וeYE¯gYÖ¼ãʹf9êQ_)ß'Ke@S(Ô=Îl7÷Û¶­d2©©É!Åô’.YÝ­öÖQEƒãÚ´)!m’Òé°ÆâQ]è +¦_ix(¨öŽÕŠF£ …Bsç4'áªD¡ú&zò)­ù�ÚzûÖŠÉ)m—”ŽEomSO{›B›6hèÍ7©cíÚ²ë#šÍbýæ+v^¯ýc{fôX7?4ŽË¬g^¡Ùexö}fÙ™J¥ž*ãg,¹A97€º®+×u599©Éñ“juŸÐò؃Å;¶’ä8a�'¯Ð”nѲ;ÔÖÖ–Õ�-÷™Å…ê›8rTáúgµ?û‚©Tiç‹F5yÃuJ¿ÿ=êÜ}EÉõ” ¹E£Ñ}’Æ$Ù’,cé̾wŒ—k¼2ë2ÖelË]w�÷¦bñª>©AÐJ ɶmkpà‚böµ²åyμó”t-5Yõú££êüÊRÏ«‡åÌå^Ì»he@ÓÈ ©Žãh ÿ‚Ö¶|{QBrF$׺–T_ï¹¢�hÊÝßwþ¼–ÿùW%$gÌ„åÿ[}çÎÍ Ë„c@3"(–¬b]Ûññqµº�©52¸èµ´Fús~ªx<^òÐëññqEþþ;aÑ닞9§à7¿3¯¾\g@3 (šBn‡Ô²,ÅǺµ²åùšÕ°"v@c#粆`{É ¹?|D�ÿ´fõµÿðq�ž:MWÐôÊ€%©X�Çãjü¼âG@U"²Ôü‰ÆÇÇçêðê.KÒÄÄ„¢ßùnÅ�€ªD(•Vô›ßÑÄÄ]e@S#(–<¯ÇAMM©³õhÍkY{ES“Ãs]ÛL=føtGSƒƒêxîÅš××þÔ3Š x~g4 ‚2 ©¸®«D"¡°óªBA»æ×‡l…�W•L&óNæ•H$8ð¼‚étÍë ¥-<Ÿ·>šAÐt’ɤVí»É먒ɤ¤ù³\KR*•’óÂKu©M’œ_R"±x³€àweÀ’ã>Ím–e)¨y]±Ð€ÒF·8wèu:�VôÜkõ(M’9÷š,Ëš[÷úé6–2‚2 éX–¥ÖH¼n×o�ÆeÛù‡}Û¶­èÈH +ÊÖ22Z°>–:‚2 i˜�ÑH¸~A0Nç}D”ëºrG‘´åqdm„’Éy�ˆ ™”MÇu]õ ¢ÁÀüa͹ïUÇŽnÀ¶ È€¦FP4•¹hÕ/(+§[œ{�²$YNý‚ª5ûä*Â2 Y”MÉNLÖíÚNb²`u]W ÛÉ»±M×ñÚøA°äy…R{r¬•̰J¸ö¸U¿°:nÍöMwÐLÊ€¦d�ÖïñPé®=l<>ªÖ†SÌx hne@SJ õȭÄY®m+=Ü[ôsI[vº¸¶ëj0UÇû·ð‚2 )¹¶­ôàùš_75x¾¤€n»®úµï*÷%Òu èø A°äÏíÓç�Kníîv]G‰sÇJþü™©”jy§²#éÌTÒs_¾ï€¥ˆ  h:�@@®Âr“JôœªÙu“='å$§ä¸á‚Á3È 5mÛz-Op] ç§’š¶¹¡ÁÐÔÊ€¦”vc’¤äù£²ã£‹~];>¢äl79­ƒgjʃRKT’tz2©‰ôâß3<‘¶u&>ÊcQƒAÂ2 i”M'kÊY-Ir[“'ž—›J,ÚõÜtR“'^”ëÎÜ›<å®Q(’”=¤9ó> ÉYÑ)Ir\W‡Ç¦”ZÄg§GGÆâr4so²³ªs®>šAÐ42A4k*xÉÜv7�ÔT÷órÓÕËn:¡©Ïf�{:x‰Âaïá×�@@ápXÁÍëç¶¥GGGãJÙÕŸd+e;:2WʹxîЦ ‡ÃsõÐlÊ€¦‹Å”h}CÖ6{zB“Çž‘=U½aØÎÔ¨&�ýRöt¹‘pÖ±iÇÑÉá õONËYÀ#œ\Iƒ“ÓêžPÚÉÒíFÂêÚ¿/+({}‡tšKAÐt‚Á 6nÙ¡ëºyû\×Qzð¤'Èë)+0»Ž-{¼GÓ§(ÝR®Ç£§.¤¯ÓÆ-; †Ï@  ­;wȺúŠyÇ;rÕŸV÷à¨F§rËÌ®ëjl:¡“ƒ£ê�OÏÝ“lJ]}…6_¶=k²1šM¸øGX:�€\×ÕòåËu´ón9Éçå5m•k§”8!{ô´Bí«l]¡@´]�PL ÎáØrí¤ÜT\Îô˜ìÉ!9iKnž‰·\…5¾â7uegç\-…êë¸ë­²^zUòë–ãh`|R£“êˆFÕ + + I™�ë8²l[©´¥é´¥x2¥´+Í Þžm7ÒŠ÷¿S�ê ”K^&|f–’‰D´m÷m:õô›µ£ýɼǺŽ#{jHNrD�PH�PP�ÐLumgöeÏ,�Â3Sw'ökÇu·)”óœâÌûLm™ ½öܺ_Ïüè -{ê¹üõ¹®¦’I¥ …å*$)<Û)¶�=»´�Ù­ùÃoâÆ7èÚý7ÏMäeÖFh4ÆU–¤BÁ.³¯««KÉõŸÐpzË¢×3œÞªôÆOhíÚµYá370›ûºººÔõáßTjÓzÏsVSjózmøÝ{´víÚ¹ëçCh,ue@SðꌃA]wý>տӔݹhמ¶—éXà“zõoš»÷·”  uýÞ½rïý-YË;­>«£]îïÞ£ko¸!ëÞdºÉ€fEP,Y¥„ÑH$¢}·Þ¥—¦?®)kyÕk˜²–ëùÉOèÆýïQ4�WW¦‹ìÕ]ÎÔw˻ߥÉÿ†¬eíU¯ÏZÞ¡‰ß½[ûïz—g}¹Í€f@P4�ÜifÙÑÑ¡ný€~9y¿—TízCÉ-:0ùiÝø–jÙ²eY×Ì}ïµÍ¬ï–ßú �ýÁ½šÞº©jõ%6oÐØïD·}àžyõÑM4³ÅúíWì¼^ûÆöÌ2è±n~&h—YϼB³Ëðìû̲3•J=UÆÏhpæ#”¼Þg–‰DBOýâgZ‘ø¦._ñKE"öÜä]3¯"“y;,K:>r££ÿ“nºùVµ¶¶J*ï9Ä^u& ýâg?Sú[ßÕš§ŸU4m]œÀËu‹Næ•yŸ 5¸ïz…~ý.Ý|ëüúòÕIh€æ�F÷I“f•\\:³ïãå¯ÌºŒuÛr×]㽩سKVb‰Ê€%/÷YŲmÛ:~ü¸º�жÖÇtéÊWŒÀ\8(§Ó!�Ù­Ó“·êÒ]7k×®] …f%Ujø,ê3õ=ð¬–ÿà'ZsðÐL`.!(§"a ^½[co¹Y—ß|“g}…j#(@s"(×î¼e@M•–]×U2™ÔñãÇuöôQ­¿¬U-'µ²m@ËÚâŠÅfžDœL†51Ý¡‘ÉuNlרu•¶\r¹.»ì2µµµÆ\IGÙ«¾3GŽ*zð�Ú��Ô²ž^µ��«5‘�$M·´hrE§&6¬×äÎíJ]³G[wUV!šA¹vç%(j®œ°œyoÛ¶úûû544¤ññqMMMɲf‚r8V[[›–/_®Õ«WkݺuyŸ‘\Éf¿ÔGH€æFP®Ýy Ê€šË ʹÛò½Ïw¬©P¸\È}¾~¨�  Í­ƒr¸Ú'À¯�À¼@inËB×u³Þ›ûJ¹†×ûBçȽ–Ÿê#$šAÐTò…ei~è4i¹×(´^ìs~­€fAP4�r©×gó�³Ø¶BÛ¥>–:‚2 iyu—3Û¥ìðYNx,ôÙrÏãçúXªÊ€¦Vìþ`S¾®m)á²Òê÷úXŠʨp ÍýL%ç](¿×ÀRBPÀPJ -ç<Õæ÷úX ÊxÈ$K] ~¯€FFP  ~�~¯€F¬wø AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC¸Þ–®Ç{L_úÒ—²¶}ãßÐÎ�;ëT�ÿ½2ÊÐ@lÛÖ[ßúVÅãñ¬íó7£={öÌûüG?úQ em»ï¾ûtûí·Ïûì×¾ö5}ýë_ÏÚöío[›6mªBåhdz÷»ßí¹/ jåÊ•Z½zµ6nܨ;î¸Cû÷ïW$©q•TC¯ �„B!]ýõó¶:thÞ¶ÞÞ^:tH===Y¯§žzÊóÜÌZß¼y3!E9Ž£¡¡!;vLO<ñ„>ÿùÏëýï¿ÎŸ?_ïÒ¨eh0{÷îÕOúÓ¬m‡ÒÝwß�µí…^ð<þÀ�ó¶Ù¶­W^y%kÛ�7Þ¸ÀJQM>ø .\¸0·¾gÏ}êSŸªcEù è¾ûîÓ·¾õ-_t–黸AŒW€õê(ç Ê:}ú´.½ôÒ¹mG�ÕôôtÑë ~>¬îîî¹õX,VÇj¤Ý»wkëÖ­J$:|ø°úúú²ö÷ööêÈ‘#ºúê«ëTáE~ûîþÇÐkh0ëÖ­ÓöíÛ³¶õôôÌ»ùÅ_Ì{ŽgŸ}6k=wØu$Ñu×]·ÀJ±”½ãïÐþáêË_þ²¾ó�ïèÎ;ïœ÷™S§NÕ¡2Ž  È«Ûk�îëëÓk¯½–÷øÜá׿úÕ¯²Ö_÷º×©µµu�U¢Y„B!Ïɾ6oÞ\‡jX8†^@Ú»w¯}ôѬm‡Òþýû%î&K3òmÛV(’4¿£œoØõ¯~õ+}ÿûßWww·N�:¥åË—kÛ¶mºé¦›ô¾÷½OÁàÂþþÚÛÛ«o}ë[:yò¤NŸ>­¡¡!­ZµJ7nÔÞ½{õk¿ökó|__Ÿ}ôQ=÷Üsêëë“뺺ôÒKµíÿoïÞã¨>Žÿv“l.\’ ä)ŠˆŠP0ˆX¥Šh)rQ…V«bûJEÑ¢X|DAäQÔZ´Zµ Þ(ˆh(- ˆ¹ ˆH É^Þ?p׳÷M²×äûyž}vÐÆp IDATgæÌì™ÙÉ&¿œ3gÚµÓ€ÔµkW¿÷ñ½ Ð /¼ víÚiÉ’%Z¾|¹vïÞ­† ªcÇŽºá†ôÓŸþT’ôé§ŸjñâÅÚ²e‹ìv»:tè �jÀ€A÷©¦Çì®»îÒÊ•+ýæòÉ'žÏ©{÷îš5k–_™ê›êò½Æ½M›6êÒ¥‹×¼É“'ë�wÞñLÛl6­ZµÊ3}ÇwhõêÕžé¼¼<¯òn7nÔ믿®;v¨¨¨HÇŽSƒ ”——§:è¼óÎÓ€jtì"ëŸ@â” uéÒEYYY:qâ„gžy�²ïõÉ·Þz«žzê)Ïtii©6oÞ¬³Î:K{÷îõë¶í”ËÊÊ4{öl½þúër¹\^Ûq�¤½téRM›6M�7®òþTVVêùçŸ×‹/¾¨òòr¯eû÷ï÷ŒàmXæp8ôòË/kÁ‚~×WñÅúâ‹/ôöÛoë¿ø…Æ�¯† }ÿgžyFß}÷�¾üòK¯}Þ¿¿Ö¬Y£‡zH6lðûçĆ ´aÃmÙ²EãÇ�÷ZëcJ4�M0�=ö˜¶mÛ¦ÒÒR}ðÁ~Ë'Ožõ èt:uï½÷êÃ?ô[V\\¬ââbmß¾]ééé!ÿyQS‰ülñÁ¿: º†xË–-r:�’¼ƒ²ÍfÓСC•——çUÞ}�²o·ëÆ�{ZPݦM›¦¿þõ¯^¡À×_|¡Ç¼ê;#iöìÙzæ™güB²éœsΑÍfóLÏ›7O³gÏö ‚¾–/_®)S¦„,³jÕ*¯�lª¨¨ÐwÜá’M¯¾úªßú±>f¡DóØ„òæ›o É’ô·¿ýMÅÅÅÕÞv . ’}º…Z4%ò³ÄAR”o«ïñãÇõõ×_ëÀ�^÷°=묳”••¥óÎ;Ï«¼;(oܸÑk¾o¹Õ«Wkùòå^ó.¸à�7ίì|pîP>ûì3-^¼Øo~FF†š5kæ¹½ÐÏ~ö3ϲÿüç?zñÅýÖÉÏÏWNNŽßü•+WìÂ-.—Kýë_=ÓÑû¬_ËÜïÿ{ >\ééér:�Ú·oŸ4hàY>þ|Oë¹$Y,M™2E}ûö•ÓéÔÂ… 5oÞ<¯m~øá‡ºôÒKƒÖ£uëÖzôÑG•——§§Ÿ~Zo¼ñ†_™¹sçê§?ý©>ûì3ÝsÏ=^uصk—çu4�Ù�!C$�l¡4oqÔ³gOMœ8ѯ|,ŽMumÞ¼Y/¾ø¢ÆŒ•ííÛ·Ïkºuëֺ袋tÚi§©~ýú~å«zì"ëŸ@r (@ŠjÙ²¥Z¶léÕzüùçŸ{Z`ÝÜ]´ e±X<¡Ôn·kÅŠÚ¹s§§¬Õjõë¶úßÿþ×kzóæÍš3gŽgºaÆ^Á`ÇŽïƒÝn÷ëúݵkW]{íµ^ujÑ¢…gÚápø VÖ½{wõíÛ×S~̘1Z¶l™vïÞí)³mÛ¶�u¹óÎ;Õ¦MIÒ¯ýk¿ ÿüs¯ÖÙììluêÔIÒÉ®·§Ÿ~º¶nÝêY¾`Á¯ògœq†rss=Ó%%%:xð ßû¾ð AëTQQqý�9âÕú)…¿¥Ð‘#Güºó6oÞÜkÚb±¨mÛ¶^a°¨¨H.—K‹%l½|¯ç–ä×êí[¦²²RRì�Y(ñ86�X­VµiÓF÷ß¿  ÒÒRϲê„ð`Æ�§­[·êûï¿÷[¶ÿ~-]ºTK—.Õ¨Q£të­·Fí}ÝùÙâ‹k” …ù^§¼sçN¯.À]ºtQzú�ÿõíVí{¯eßåæº‘jÔ¨QÄeóòò¼è’äÕE6�ÜÜ\¿uÌVu·¢¢"¯éüüüˆƒ`$å‚•‰õ1 %Ç&”ÌÌÌ*�ò\QQ¡£G�z¦C Ž%�¼åÔ’%KtÛm·©gÏžúÉO~°Ü‹/¾¨íÛ·G\�H%ò³Ä-Ê�ºu릌Œ Okf å¦ÂÂB=÷ÜsA·ç;QNNŽ_÷,-\¸PmÛ¶­V�Í`”––¦öíÛ{µrñÅzþùç5jÔ(¯Û ¹ïûœ––¦‚‚mٲųlݺuZ¶l™.»ì2IÒßÿþw¿Q¨}�E¬Äâ˜IR½zõ¼¦¿úê+Ùív¯ð–èc³mÛ6¿`~Úi§y^çççû­³hÑ"]}õÕúæ›oôñLJÜ~EE…ÒÓÓuÍ5×èšk®‘tò|úÛßþ¦Ù³g{•ýòË/Õ¾}{I‘»`Ìó5VŸ- ù” …egg«K—.ž¬}ù Î�;«~ýú:vì˜_Ù èÌ3Ïô›?|øpMŸ>Ý3}âÄ ]wÝuºøâ‹Õ¦MÙl6íÛ·O{÷îõ»¾8Pëâ¬Y³Ô»wo�5Jºà‚ ¼‚²$=ýôÓzõÕWÕ®];•——ë믿Öõ×_¯Q£FI:y�°%éþûïדO>)I~]sm6›F�èÅDMŽY0íÛ·÷xíàÁƒºá†ô³ŸýLÍ›7×àÁƒ%ÅïØ,[¶Ìë}¾ÿþ{­[·N‡Ã«ÜСC=¯Ý×€›,X  DôžË—/×´iÓtÆg¨  @�7Vyy¹Ö­[çWÖìÂ鱋ä|�Åg H>eHq………ƒrýúõuúé§{ÍKKKS÷îݵbÅ ¿ò=zôðjÁu:t¨Ö¯_ï5HSEE…–.]êWö›o¾ñ JOO÷ºnvË–-Ú²e‹Î<óL�wÞy=z´V¯^í–8 x¦W¬Xá Ê#GŽÔªU«ün½èÚUI;v¬§u1jrÌ‚éׯŸßc[·nÕÖ­[Õ¬Y3O؋ױùâ‹/¼3 dĈž�Ä$©wïÞzòÉ'½»ªŠU«VÉn·kÓ¦MÚ´iSÐrM›6UÇŽ=Ó‘»HÎ×X|¶€äÃ5Ê�âÝ&J’Î=÷Ü€Á7Xyßë�M÷ÝwŸ®ºêª°]U¿ýö[mÞ¼Ù3�——§ë¯¿>`Yw7ÛôôtM�:Õo´m_›7oÖþýû%�<ꡇ º/n 4ÐwÜ¡áLJ, Õ=fÁtïÞÝÓÝØ×þýû=£—'ñÉÉÉј1cô»ßýÎkþ)§œ¢[n¹%àõЋE×\s�ß5ÖnåååZ»vmØ÷ÎÍÍÕã�?î5ú{¤Ç.’óUŠþg H>´(@Škß¾½š4iâ7@S°ëNƒbßë“M999ºóÎ;5bĽúê«Ú±c‡vïÞ­¢¢"Õ«WO�5RAA�ºuë¦SO=ÕkÝo¼Q­ZµÒ’%K´k×.edd¨  Àk ¦SO=U³fÍÒš5kôî»ïj×®]Ú½{·œN§š4i¢ÓN;M—^z©š4iâY§I“&züñÇõÑGéý÷ß÷Ô)77WíÛ·×i§�¦aƼ.6jrÌ‚¹í¶ÛÔ«W/-Z´H;vìPQQ‘š4i¢V­ZéÈ‘#žrñ>6™™™jÑ¢…Z´h¡ÓO?]C‡õ=Ý4tèPµhÑB/½ô’¶mÛ&«Õª³Î:K#FŒP×®]uøða-[¶Ìo=›Í¦¹sçê“O>ц tàÀ«¼¼\Mš4QÓ¦MÕ§O 8PÙÙÙÕ>v‘œ¯±ølÉ¥æC\Vo»�–[Œùîgk€i³ŒÕXÏ=í~¤ýðœþÃk÷snEEÅš*ì ÔY6›í|IG$9$Ù�gç¯�ÆÃe<ÜÓ2¦eÌó�v¯M¡o‹~y•ÑõAAAAAAAAAAAAAAAAAAAAA@Bw¨�Ò]u×–-[´{÷n½ð JKK“$5jÔ(¦°¶¸ùæ›cº}›ÍæùgE^^žÎ9ç5mÚT3fÌPaa¡4hrýŒŒ egg+;;[………:t¨>üðØÖ9ªr\cý€Ä¡E@Â8UTThÿþý—ÿùÏÖsÏ=§÷Þ{O½zõÒ£�>ªÊÊJ=ñÄ2dˆ~þóŸkذaZ¶l™×zcÆŒÑû￯?üáêׯŸÖ®]p[¾­'�lùž5k– ¤Ë.»LS§NÕñãǽÖ]´h‘®¾újõïß_ãÇ�×¾}û$IN§SÏ?ÿ¼† ¦K.¹ÄkY¨÷t8zúé§5hÐ ]y啚>}º_]Í®�cÆŒÑÂ… uË-·¨oß¾5j”þýï{ë9sæhРAúå/©Ç\C† ©Rׯ#FÈåré£�>Šx·¢¢"x¦/¿ür}öÙgžé­[·ê /ôLúé§3fŒúôé£!C†l�Žä\�6ÁÎó¸Þ{ï½zðÁ½¶õüóÏëî»ïö+h{÷Þ{¯_Kã‹/¾¨ &„ú¨²³³5þü�ÇòðáÚ;w®,X æÍ›kÞ¼yš8q¢Þxã eddè©§žÒúõë½¶·gÏžª|\²Ùl*((ÐîݻÖýä“OÔ½{w9ýãÿÐ?þñ=÷Üs½ÏÑ£G5aÂ�7N—\r‰8ðÚߌŒŒ°çB°Ï&عeêß¿¿zè!9�NY­'ÿ¯¼råJ]{íµ~emoÅŠzôÑGår¹d±X$I«V­Ò�!CBî¿~ýB®É9©`Ç'’cîœs‹d[¦pŸU÷?ÐÏW8‘î[°óèûï¿×[o½¥gžyF-Z´ð[?ÜwJ$ŸQ$ÇâðáÃú¿ÿû?=ûì³jÖ¬™fΜ©1cÆhذazøá‡år¹ôÇ?þQsæÌÑĉ=û^•u¢q®Tõûâ�e c³Ù4þ| >\‹-Ò Aƒ4iÒ$}õÕW!׻ꪫԾ}{µhÑB×_½š7o®Í›7{•¹òÊ+5xð`uèÐAYYY×Éw½ÒÒRýíoÓí·ß®F�©I“&úío«U«VI:Ù²páBÝu×]êØ±£~ò“Ÿ¨ÿþÊÎÎVee¥þò—¿è®»îRAA�Z´h¡?ýéO*--õj•õ}ÏŠŠ -Y²Dwß}·:tè –-[ê�ücÈzçååé�ü£Î<óLåççëºë®Ó¡C‡´{÷n•——ëÕW_­Òö‚iܸ±WëS0;wîÔøñã5aÂ-]ºT'NœÐo¼Ñ{8p@v»]½zõRƒ Ô¾}{uêÔ)`ÙPçB¨Ï&={ö”Ãáð´|iÇŽêÕ«WDëŸþù:~ü¸§>ÅÅÅÚ¶m›.¸à‚j¯é9‰pÇ'ÜÏY¨sÎW$?³n¡>ÿêìu¾ ª²o�äççëÎ;ïTçÎ�ýÖ÷�bªé÷‹{?:uê¤F�yþÉ3zôhµjÕJ­[·ÖÀ�½Zw«³NMΕê|ß@<Т ¡rrr4räH]}õÕZ½zµ^~ùeýæ7¿Ñ‚ Ô¡C‡€ë>|XË—/׿ÿýo=zT{öìñkqìܹsµêã»Þ®]»ät:uã�7zZ÷ìv»JKK%Iß~û­ÊÊÊtÆgømkïÞ½²ÛíêØ±£g^vv¶:wî¬�;w}Ï={öÈétz]«í¾†;wý$éÔSOUvv¶Ž?®½{÷Vk{�}4gÎ5kÖ,èÀOÇ�× 7Ü ƒê†nдiÓÔ¡C9�ΘÔË=hÕóÏ?¯×_]¯¿þºÞzë-OýŽ=*Iß¿¢¢BN§S‡Ãk~FF†l6[Ð÷´Ûír:�5Þ'ó�ðhl¯¢¢B_ýµÚ·o¯ÊÊJõêÕËëñŸÿü'àz999>|¸Î9çmذ!ìûX­VÍš5K�=ö˜l6›î¾ûî€×õ†;B}6‘êß¿¿§¥oåÊ•ºä’Kª´þÅ_¬Õ«WK:Ù}º_¿~5Z¯ºçT ¡ŽOuÎÌ0TÝm…úü£¹ÿUhߪ³~¸ïS´¿_ª³áÖ©é¹­ï'ˆ6‚2€¤’––¦Æ�{ý¡g·Û=¯·nݪÇëÖ[oUûöí•““£¯¾úJß}÷]DÛ7·‰fÍš)'''h·Î-ZÈétjëÖ­~ËZ¶l)IÚ¸q£gž»¬9°U$ë¹\®*Õ;Û[´h‘š7o®=z(##Cü±×ãì³Ï¹~~~¾g$íììlíØ±Ãk¹o�ºvíªI“&iþüùZµj•8àµ<ܹê³q w>tëÖMÇ�׆ ôÕW_©°°0dyßíõìÙS{÷îÕŽ;´qãÆˆZãC­É9ɱ•BŸšþœEc[�>ÿêþLùŠôEª*ß+á¾SL±ø~‰¶šž+Ñþ¾€h!(H˜Ï?ÿ\3fÌÐÚµkõí·ßj÷îÝZ°`�¶nݪ¾}ûJ’š6mª�7jÿþý:~ü¸5j¤cÇŽé¯ý«Ž9¢>ø@ÒÉ®|áøn+ééé5j”žzê)­]»V‡Cß}÷�¶lÙ"IÊÍÍUŸ>}ôØc�içÎ�*++ÓêÕ«uüøqåääèŠ+®Ð#�<¢Í›7«¸¸X�?þ¸òóóuÞyç}Ïœœ]~ùåš6mš6oÞ¬ƒjöìÙÕ7ZÛ«¬¬ÔñãÇuìØ1mÞ¼Y3fÌÐâÅ‹u÷ÝwGÔ*åp8TYY©ÊÊJ•””hÅŠZ¿~½çs=ûì³õæ›ojÿþýÚ»w¯¦N�ªÊÊJIRII‰Þ~ûmÏ N6lPvv¶rss½Þ#ܹ곑";¬V«.¾øbM™2E½{÷9XV íÙl6õîÝ[Ó§OW—.]<ÿ(�¤[n¹EóæÍ ¸­`ëErN…:¶¦Pǧ&?g¾"ÙV^^žöíÛ'—Ëòó¯îÏ”¯H�Q$ªú½î;Å‹ï—h«é¹íï;ˆ®Q�0 6”trTéï¾ûNYYYêØ±£fÏží-õ²Ë.Óš5k4bÄuíÚU�=ö˜~÷»ßiþüùš;w®zöì©>}úDô~�¶‰Ñ£G+33ÓSÏF�iäÈ‘žëï¹ç͘1C7ß|³*++Õ¡Cýô§?Uvv¶Æ�¯Ù³gë®»î’ÝnW�=4sæÌ°asüøñš9s¦Æ�¯† jàÀ�jÞ¼yDõ�d{î.ÄÁêñÚk¯éµ×^SFF†Úµk§³Ï>[/½ô’_X fÉ’%Z²d‰¤“ìwèÐA�<òˆÚ·o/IúÝï~§|P#FŒPóæÍÕ¿Ï(ÜG�ÕŠ+ôÔSO©´´TmÚ´ÑÔ©Sýº“¶iÓ&ì¹곉ô|èß¿¿/^pDbS°íõë×O&LПþô'¯ò%%%:å”S‚n/ØzáΩPÇÖW°ãɱ�T$Ûºúê«5mÚ4mß¾]ÿó?ÿòó¯îÏ”©*Ç(œê|¯„ûN1Åâû%š¢q®Dûû¢!Vߤá¶h¹Å˜ï~¶˜6ËX�õÜÓîGÚÏé?¼v?çVTT¬©Â¾@­sèÐ! 8P+W®Œùµ�uÝ®]»4bĽóÎ;^-Êýû÷×”)S‚Tl=âÍf³�/éˆ$‡$»ñìüáµÓx¸Œ‡{ZÆ´Œy¾Ó.ãµ)Ü5Q¿fƒ®×PmÛ¶M-Z´ $ÇÁªU«Ô½{w¯°ûí·ßª²²R]ºt©Òz >ÊPìܹS«V­Ò±cÇ´sçNÍ™3G#GŽLtµê„÷Þ{ϯ+jNNŽf̘òšç@ë€øàe¨Ž=ª… ê¾ûîS“&M4xð` 4(ÑÕªõöìÙ£¯¾úJ½{÷öšŸ——§sÏ=·Êë€øàe@P\£ @GPÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ@PÀ�žè €Éår%º €°X,‰®x”$\ pL`€ºÁ�Íï}B3€D#(Hó�"÷k§Ó´  öð ÃV«Õ3ßýÝO`�(eqç�݇Ã!‡Ã!»Ý“ÕjUzzºÒÒÒ”––&‹Åây˜$ A@\™!ÙétÊårÉn·«¢¢BV«UÙÙÙª_¿¾¬V+@-çr¹ät:UYY©ãÇ�«¼¼\6›Mééé²X,žVf—ËÅïqEP7î�ìnAv:�*//—$åææ*=�¯$¨K,‹§%9++Kv»]G�•ÝnWff¦§Œ»u™° ^¸=€¸0C²Óé”ÝnWYY™233•ŸŸOH(==]ùùùÊÌÌTYY™çRówÄA@Ìù^“ìt:uâÄ Õ¯__999 ¬ åää¨~ýú:qâ„WP–Ëâƒ&qãt:åp8T^^®ììleee%ºJ€$•••åù�áî†í¾fb�o1eÞöÉ=p—$Õ«W/‘Õ¤÷ï »Ýîé‘$Ѫ öÊâÆÝ2РAƒDW�"4h òòr9ŽDW@BP3¾­É‡CiiiÊÈÈHpÍ©"##Ciiir8´*ˆ‚2€¸pß'“Á»U•““£ÊÊJOH€X#(ˆ)÷=“Ý-Ê6›-ÑU¤›ÍæiQv? –ÊbÂ÷VîîrŒX ¨*«Õ까‡[EˆþbS¾×)[,–×�j, ×'ˆ+‚2€¸áÚ2@uñ;@<”ÄÿùD ¿SÄCz¢+€äiåRµAUn©u—'0¨�ÊuXM»2˜ÔF\£ PGEóz_®P›Ð¢ �ÊÊJÙíö€Á×b±(==]×å6€j ‚2@(úè#�1B[·nÕúõëuýõ×{º‹»\.-\¸P¯¾úª:¤–-[zÖ3ë¼oß>µoß^ï¾û®œN§¬±cÇzÊ|ýõ×>|¸gÚ·ëõÑ£GuÑEy¦§N�ª©S§J’î½÷^ 4(âúHÒk¯½¦9sæèá‡ÖÌ™3µ}ûvåççë±Ç‹{—ïI“&©¸¸X�7ÖêÕ«•žž®k¯½V×]w�W¹C‡iÖ¬YZ³f�JKKÕ¶m[ÝtÓMºð %I7nÔüùóõå—_ª´´T­[·ÖèÑ£uÙe—Uù½€ÚÀåréàÁƒš;w®Þ{ï={-�t€/H5e)ã¹çžÓòåËõ¿ÿû¿jÙ²¥žxâ í۷ϯÜÚµk5dÈýùÏÖ矮|P­ZµRÿþý#~¯µk×jæÌ™š:uªÎ:ë,kõêÕU®³ÃáPŸ>}TPP 'Ÿ|R÷ÝwŸ~þóŸë‘GÑu×]'«Õª·ÞzKóçÏ×ĉuöÙgëý÷ß×½÷Þ«–-[ªsçΞm­_¿^_|±Þyç­_¿^·Ür‹zöì©sÏ=WÒÉ.‘ëÖ­ó\£ì«AƒZ·n�¤Ð]¯#­�$�8qBsçÎÕ=÷Ü£víÚiÛ¶mªW¯^•�S4üóŸÿÔĉ5yòdmݺU7Ýt“Z·n­>}úxêúÛßþV™™™zðÁuê©§êË/¿Ôž={<Û(**Raa¡n½õVåææêã�?Ö}÷ݧSO=U]ºt‰ø½€ÚÀår©´´TsçÎõ ðe^Ûìn)6øºýöÛý¾hU�ŠÊRÆ’%K4|øpOëßĉ5pà@¿r¹¹¹ºýöÛ•––¦6mÚhÍš5Z²dI•‚òž={”••¥óÏ?_ÙÙÙjÒ¤‰:vìX­z÷îÝ[Û·oדO>©Þ½{«²²RÇ�×áÇըQ#½òÊ+ºôÒK=ûòë_ÿZ+W®Ô¢E‹ôàƒz¶Ó¢E ÒÉÁÆ�ïiA>çœs¢Z—ªhÞ¼¹çøœqÆêׯŸ–,Yâ ¯ï¾û®öìÙ£×_]Í›7—$µjÕÊk¾çȰaÃôæ›oê£�>ò ÊáÞ HuN§S’ÿ_gžy¦ÒÓüó1Ø_�ꬉ®DâèÑ£úþûïÕ¡Cϼ¦M›*77ׯlÛ¶m½FjíСƒvíÚU¥÷ûùÏ®¼¼<ýò—¿Ô¤I“ôòË/ûÝST’^zé%�wÞyžÇ§Ÿ~êµ<--ÍëÚ½ÌÌLÏëòòrIÒîÝ»uúé§{­wúé§ûÕùÔSOõš®W¯žJJJª´_‘ˆ´>’”‘‘Qí ¸…;†‘–iݺµ×t«V­´{÷nÏô—_~©–-[zBr %%%zòÉ'5jÔ( 0@ýû÷××_­ÒÒÒ*½�ЬV«ç;uãÆ�:v옜N§g€¯¨OŸ>ºà‚ <�>}úèòË/—tòÌî€ ©Že)ÁÝmÏlÉ4m–uó½ J .€¾Ü�rÊ)zíµ×´aÃýë_ÿÒâÅ‹µ`Á-^¼X�5ò”»âŠ+Ô«W/ÏtÓ¦M#Ü#ìÂh.ó�gµúÿo3Ð-^¢!’úHRNNNÀzUE$Ç0’2¾÷}u8^Ç'’cuÏ=÷èÈ‘#7nœZµj¥´´4Ý~ûí~çG¸÷RQff¦zöì©eË–éøƒÎ9ç=ðÀø2¹çó3 6!(H õë×W~~¾×õ¤ÇŽÓ÷ßïWö›o¾‘Ãáð´*ÿ÷¿ÿU›6m<Ë6l¨íÛ·{¦�N§¾ûî;¿ídddxZ0G�¥‹.ºH7nTß¾}½¶Õ°aÃí[«V­´uëV¯yÛ¶mSË–-k´ÝPl6›_ØKT}"9†‘”Ù¾}»×çþÕW_yu­îر£^{í5í۷ϯu^:y¬]»VS§NU·nÝ$�@nïÞ½~-ìáÞ HEõêÕÓoû[9­]»VÇŽKt• aèz e :TK–,Ñ�ät:5oÞ<9¿rGŽÑŒ3´sçNýýïׇ~¨aÆy–wêÔI[·nÕöíÛår¹ôòË/ëèÑ£^Ûøàƒ´xñb}ýõ×úî»ïôúë¯Ëb±¨   &ûõÎ;ïèí·ßÖ®]»ôì³Ïê‹/¾ðÁ:ÚÚ´i£Õ«W«¸¸X^-¦‰¨O49rDÓ§O×Î�;õæ›ojÕªU2dˆgyÿþýÕ²eKÝyç�úì³Ï´wï^­ZµJ¯¼òФ“-ö­ZµÒÚµkåt:e·ÛõÄOìÞî½€Td±XÔ¹sgM˜0AsæÌу>ðò¨ hQ�2ÆŒ£ââb >\¹¹¹êÛ·oÀëM{ôè¡òòr�9RÙÙÙºñÆuñÅ{–÷íÛWk×®Õ 7Ü úõëë²Ë.Ói§�æµ�úõëëå—_ÖÓO?­ÊÊJµmÛV�<òˆWËt´üò—¿Ô¡C‡4gÎÏí˜î¿ÿ~�}öÙUÚÎïÿ{}òÉ'ži÷íŠ ûq5· uÆÙÉ®CµG*ÖY°Æ, Þ¶%Àkßgéd 7çû>¬¦­’ÒŒGºñ\ÿûï¿¿§^½zWVm— n(--}3??Фc:–Ƴûa¶0ûöî Öºìüñ]B¶0G”c¦“©ëu¸ µÜü äµù(Ÿ>}ú‹Õ¯*Ôn?d¦rEÞ¥Ú7ûªIæ‹«X¶(G²}ßåÁZ•­¦->嬞Cµ*g¯_¿~àYg�õ§*ìÔz›6mº¿[·noK:®ÈZ“}Ÿ%ÿðl^+ù·"Wu°˜ëT Êf·j÷´ÕgY¨î×V� Çî ì~Ôûæ›o®nѢŸ*íÔR{÷î�Ù®]»E’JåŒíúñzåHº]K�ƒs¤{%,('ºëuMv,Ø­ B}æ‡é”t¼]»v¯lÚ´éþÔj…M›6Ýß®]»Wt²%ÙÌNî[DIá³—ŒùÕ•ÐnØi1Þ~4ô ×ÊhžÙUÛ¥À]¶íóæÍÛát:ßëÞ½{¦Íf;=‚:@­QZZúæÔ©S'�9r�¤2ù·›a9Ð}•¥Ða9©oå+Ñ]¯}Ë„ ƾ×)ê~h$l³ûµÙ Û¼~Ù*)CRæÄ‰[ýæ7¿9¿Y³fÝl6Ûi.—«Iû)Ãb±UTTlÛ¿ÿú ¬y衇vëäÀ]•ú1»ƒ²owk÷s¸®}»]»ç)ÀüP¯ƒIÙk”#y�š\§ìÚe3Dû^«ìûìû:Ýxøn+Ç bÁ7ÀºC°yí±oK²o86—ùn+Ø�‡|ç)ijo]ÃíKL¤Çrãr)²ê.g>ËgžYÖ©»\;#xóâs»‚qHEÁ‚¬v}»ZꂨÅ8Ø{øÎ«J=&‚r0U Ðî×î€ìžvsÿÇâ“´{yš¼O‹~ Öf µDP�ºÌÀ¨Ët¨ë‘�píæ˜S&“ŒA9Pë°{Úl%ömIö}íæ.çþp%ïnÙòYî{«)‡èz õºNØ74û¶*û¶$‡é:Ðkß÷ô-h:áâ”#m®Éö%ÿ�ìÈîpm>›ëº|Êù¶(›Ý¼Í÷€T¨8\ì@¯Íõ¥Àa9ÖÁ7æÁ:^¡/š£_KáGÀ6çùŽšm•÷ ]¡FÌöÝv¤ûÉ$XWéP#Wû†eÉ»5:ب֑´&'åh×nÉØõZª^+t°îØÒ�­Äîe—¼»p›!šeµM¨e÷rßcß0ìÛeÛwÛÕ °I×íZJ®eßrÕiUuû¨@÷cv/f³œïkßz@2ó £Î¯}ƒ³ï5É�Ê…ºf9V­ÉU)WmñjQŽåuÊfK²[ A½Üœ>ËÍVewy«~;ØvÌ÷€d,Ç8CL‡´+Ø ^�Br,Ä¥:Y»^K�G´6ç™·�ò]Çw@/˜ÔEÛ]Æb:Â3€x«J€ 5W îÕáBs°÷¯JkrR‰g¨‹V÷kß×�nݨ[v¨ùáî"ü¨-…Ö@ƒpëFI÷ê`·ƒJún×’”�71Tuôkßé`ÁÕw¾+À<ßé`u tR”Ô¾ƒy Àæëª„ä`a¶¦­Éqk�Žw¬N«²9®U9ØüH öÚ"‚2€Ú#X—éPÙœ®Õ8\k²oàMªÖd)9[”• f}[}Cµ,»_ûäH[˜ ˆË·Œ>LW7$§„D´”Æ*,Ká[–ƒ­¨Õ8Ø{„ª#$‹êt�ޤµ¹&!9é[“¥äÊ�ÊF:ÐWUƒt°Á½‚Õ£ªÔ¢¥¦¡1T+²ïòHƒpuìªêHÝq“¨íVå@˪¤-TRU¨Vä@eÂáHÃpJ´&KÉ”•­nX®êòPå U Æ 0/’ë�\Õ²Q‘È�°ìž®Î-§ª2’Y$ÁØœW•€¬L$ËÂIÈ `ñõÚW¬Âr¤ó"¤«º]Å ^ªÛ•¹ª×‡Í:¥C²”ø`W“ ì;¯*ËC•¥@miKr ò5 ÉÁæSgƒ²Tó°ì;¿¦�Ù\– Çb!ØµÊæòp¯#]j~MËF]2ÁªÖ¡ºa9\™p¡9’r�Œ" ²�–U5G#$W§|T%Kè‹VX6—E#øF£µâ%Z­¶U ÖU ßá$4$KÉîb–#Ýn¸p�LÇ j"\«o$Aµº-ÔUÙnÂ$[¬N}bÑešë“Ôá®ST>ÐëP媳í„J¶0XÝúD£Õ8Vë@2¨J‹qMÖ­nà%(‡˰l–�æ¾'ãqP7E3p֤Źªï“4’5àÕ¤^ÕY×Zƒ÷€ÚÄY�ujt“*$KÉ”¥ø‡eßu“ùØ@4Ô¤;¶ï6â½nÌ${¬iý¢±É~Œ ª¢Pkº�¤ ÉRj„Àd »©pìÔm±£É²c*•Â^´êšJû É ZÁ6©²[ª…FFª€ø‰öÚ)!Ã"ݨ v’µ»vܤr@ŒeÝSù¸@UÄ2ĦT@v« �0žûPŽ€º)ž¡5%²[m ~ɸÉX'µK2Òd¬S•Ô¶0WÛöREÊd·Ú,kó¾@2¨5áØTÂd]ØGˆ§Z�ÝêZˆ¬kû ÑR«Ã±©®Ǻ¾ÿL� ƾŠÞ8êª:Œ} #ÃqP[ˆÃ FÇ@¼~ ªþ<»âk¨êÇIEND®B`‚bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/deny.toml000066400000000000000000000004511525300766700225310ustar00rootroot00000000000000[advisories] yanked = "deny" # A list of advisory IDs to ignore. Note that ignored advisories will still # output a note when they are encountered. ignore = [ ] [licenses] allow = [ "Apache-2.0 WITH LLVM-exception", "Apache-2.0", "MIT", "LGPL-2.1-or-later", "Unicode-3.0", ] bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/hooks/000077500000000000000000000000001525300766700220205ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/hooks/pre-commit.hook000077500000000000000000000031731525300766700247650ustar00rootroot00000000000000#!/bin/sh # Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook install_rustfmt() { if ! which rustup >/dev/null 2>&1; then curl https://sh.rustup.rs -sSf | sh -s -- -y export PATH=$PATH:$HOME/.cargo/bin if ! which rustup >/dev/null 2>&1; then echo "Failed to install rustup. Performing the commit without style checking." exit 0 fi fi if ! rustup component list|grep rustfmt >/dev/null 2>&1; then echo "Installing rustfmt…" rustup component add rustfmt fi } if ! which cargo >/dev/null 2>&1 || ! cargo fmt --help >/dev/null 2>&1; then echo "Unable to check the project’s code style, because rustfmt could not be run." if [ ! -t 1 ]; then # No input is possible echo "Performing commit." exit 0 fi echo "" echo "y: Install rustfmt via rustup" echo "n: Don't install rustfmt and perform the commit" echo "Q: Don't install rustfmt and abort the commit" echo "" while true do printf "%s" "Install rustfmt via rustup? [y/n/Q]: "; read yn < /dev/tty case $yn in [Yy]* ) install_rustfmt; break;; [Nn]* ) echo "Performing commit."; exit 0;; [Qq]* | "" ) echo "Aborting commit."; exit 1 >/dev/null 2>&1;; * ) echo "Invalid input";; esac done fi echo "--Checking style--" cargo fmt --all -- --check if test $? != 0; then echo "--Checking style fail--" echo "Please fix the above issues, either manually or by running: cargo fmt --all" exit 1 else echo "--Checking style pass--" fi bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/meson.build000066400000000000000000000043251525300766700230430ustar00rootroot00000000000000project( 'bustle', 'rust', version: '0.14.0', meson_version: '>= 1.7', license: 'LGPL-2.1-or-later', ) i18n = import('i18n') gnome = import('gnome') base_id = 'org.freedesktop.Bustle' dependency('gio-2.0', version: '>= 2.66') dependency('gio-2.0', version: '>= 2.66') dependency('glib-2.0', version: '>= 2.66') dependency('gtk4', version: '>= 4.23') dependency('libadwaita-1', version: '>= 1.8.alpha') glib_compile_resources = find_program('glib-compile-resources', required: true) glib_compile_schemas = find_program('glib-compile-schemas', required: true) desktop_file_validate = find_program('desktop-file-validate', required: false) appstreamcli = find_program('appstreamcli', required: false) cargo = find_program('cargo', required: true) version = meson.project_version() prefix = get_option('prefix') bindir = prefix / get_option('bindir') localedir = prefix / get_option('localedir') datadir = prefix / get_option('datadir') pkgdatadir = datadir / meson.project_name() iconsdir = datadir / 'icons' podir = meson.project_source_root() / 'po' gettext_package = meson.project_name() if get_option('profile') == 'development' profile = 'Devel' vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD', check: false).stdout().strip() if vcs_tag == '' version_suffix = '-devel' else version_suffix = '-@0@'.format(vcs_tag) endif application_id = '@0@.@1@'.format(base_id, profile) else profile = '' version_suffix = '' application_id = base_id endif cargo_home = meson.project_build_root() / 'cargo-home' cargo_target = meson.project_build_root() / 'cargo-target' cargo_env = environment() cargo_env.set('CARGO_HOME', cargo_home) cargo_env.set('CARGO_TARGET_DIR', cargo_target) meson.add_devenv(cargo_env) meson.add_dist_script( 'build-aux/dist-vendor.sh', cargo_home, cargo_target, ) if get_option('profile') == 'development' # Setup pre-commit hook for ensuring coding style is always consistent message('Setting up git pre-commit hook..') run_command('cp', '-f', 'hooks/pre-commit.hook', '.git/hooks/pre-commit', check: false) endif subdir('data') subdir('po') subdir('src') gnome.post_install( gtk_update_icon_cache: true, glib_compile_schemas: true, update_desktop_database: true, ) bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/meson.options000066400000000000000000000003011525300766700234250ustar00rootroot00000000000000option( 'profile', type: 'combo', choices: [ 'default', 'development' ], value: 'default', description: 'The build profile for Bustle. One of "default" or "development".' ) bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/000077500000000000000000000000001525300766700213135ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/LINGUAS000066400000000000000000000001351525300766700223370ustar00rootroot00000000000000az bg ca cs de en_GB eo es eu fr he hi hu ia it ka kk nb nl pt pt_BR ru sl sr sv tr uk zh_CN bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/POTFILES.in000066400000000000000000000011251525300766700230670ustar00rootroot00000000000000data/org.freedesktop.Bustle.desktop.in.in data/org.freedesktop.Bustle.gschema.xml.in data/org.freedesktop.Bustle.metainfo.xml.in.in data/resources/ui/address_dialog.ui data/resources/ui/details_view.ui data/resources/ui/diagram_header.ui data/resources/ui/durations_page.ui data/resources/ui/filter_pane.ui data/resources/ui/frequencies_page.ui data/resources/ui/shortcuts.ui data/resources/ui/sizes_page.ui data/resources/ui/statistics.ui data/resources/ui/window.ui src/address_dialog.rs src/application.rs src/details_view.rs src/message.rs src/message_tag.rs src/message_type.rs src/window.rs bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/az.po000066400000000000000000000401561525300766700222730ustar00rootroot00000000000000# Azerbaijani translation for bustle. # Copyright (C) 2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Ramal RÉ™himov , 2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-08-08 14:14+0000\n" "PO-Revision-Date: 2025-08-09 14:28+0300\n" "Last-Translator: Ramal RÉ™himov \n" "Language-Team: Azerbaijani \n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 48.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-Bus fÉ™aliyyÉ™tini vizuallaÅŸdırın" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "xÉ™ta ayırma;profil;d-bus;dbus;ardıcıllıq;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Yeni PÉ™ncÉ™rÉ™" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "PÉ™ncÉ™rÉ™ eni" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "PÉ™ncÉ™rÉ™ hündürlüyü" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "PÉ™ncÉ™rÉ™nin maksimumlaÅŸdırılmış vÉ™ziyyÉ™ti" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle, D-Bus fÉ™aliyyÉ™tinin ardıcıllıq diaqramlarını çəkir. Siqnal " "emissiyalarını, metod çağırışlarını vÉ™ onların müvafiq qayıdışlarını, hÉ™r " "bir fÉ™rdi hadisÉ™ üçün vaxt damÄŸaları vÉ™ hÉ™r metod çağırışının müddÉ™ti ilÉ™ " "göstÉ™rir. Bu, arzuolunmaz D-Bus trafikini yoxlamaÄŸa vÉ™ D-Bus É™saslı " "tÉ™tbiqinizin istÉ™diyiniz kimi iÅŸlÉ™mÉ™mÉ™sinin sÉ™bÉ™bini müəyyÉ™nləşdirmÉ™yÉ™ kömÉ™k " "edÉ™ bilÉ™r. HÉ™mçinin siqnal tezliklÉ™ri vÉ™ orta metod çağırış vaxtları kimi " "statistikalar tÉ™qdim edir." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "D-Bus fÉ™aliyyÉ™tinin ardıcıllıq diaqramlarını araÅŸdırın" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Jurnalı xülasÉ™ edÉ™n statistikalara baxın" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Bu sakitləşdirici boz rÉ™ngli qarşılanma sÉ™hifÉ™si ilÉ™ rahatlayın" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:159 src/window.rs:416 msgid "The Bustle developers" msgstr "Bustle tÉ™rtibatçıları" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Ünvanı qeyd et" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus " "specification." msgstr "" "Ünvanlar haqqında É™traflı mÉ™lumat üçün D-Bus " "spesifikasiyasına baxın." #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "_İmtina et" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Qeyd et" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Server ünvanı" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Æ�laqÉ™li mesaj" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "busctl kimi kopyala" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Mesaj" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Növ" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Yol" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "İnterfeys" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Üzv" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "XÉ™ta növü" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "TÉ™fÉ™rrüatlar" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "GöndÉ™rÉ™n" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "TÉ™yinat" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponent" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "BÉ™dÉ™n ölçüsü" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Cavab vaxtı" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "İmza" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Bayraqlar" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "BÉ™dÉ™n" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Format haqqında sÉ™nÉ™dlÉ™ri aç" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "GeniÅŸlÉ™t" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "MüddÉ™tlÉ™r" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "HÉ™r metod çağırışının ümumi vÉ™ orta vaxtı" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metod" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Ümumi" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Çağırışlar" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Orta" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Bütün etiketlÉ™ri seç" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Bütün etiketlÉ™rin seçimini ləğv et" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Bütün adları seç" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Bütün adların seçimini ləğv et" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "HÉ™rÉ™kÉ™tlÉ™r" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "TezliklÉ™r" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Metod çağırışlarının vÉ™ siqnalların tezliklÉ™ri" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Mesaj növü" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Tezlik" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Ümumi" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Qısayolları göstÉ™r" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Yeni PÉ™ncÉ™rÉ™" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "PÉ™ncÉ™rÉ™ni BaÄŸla" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Çıx" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Qeyd" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Sessiya avtobusunu qeyd et" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Sistem avtobusunu qeyd et" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Ünvanı qeyd et" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Jurnal faylını aç" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diaqram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "PCAP faylı kimi saxla" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "DOT qrafik faylı kimi saxla" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "XidmÉ™tlÉ™ri süz" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistikalar" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "ÖlçülÉ™r" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "HÉ™r mesajın É™n kiçik, orta vÉ™ É™n böyük ölçüsü" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Æ�n kiçik" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Æ�n böyük" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistikalar" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Yeni _PÉ™ncÉ™rÉ™" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Aç" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Jurnal cütlÉ™rini aç" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Kimi saxla…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT Qrafik" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistikalar" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Klaviatura qısayolları" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Bustle haqqında" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Sessiya avtobusunu qeyd et" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Sistem avtobusunu qeyd et" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Ünvanı qeyd et…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Jurnal faylını aç" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Æ�sas Menyu" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bustle-a xoÅŸ gÉ™ldiniz" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "D-Bus fÉ™aliyyÉ™tini qeyd etmÉ™yÉ™ baÅŸlayın, hÉ™mçinin É™mri iÅŸÉ™ sala bilÉ™rsiniz" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopyala" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "YüklÉ™nir" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Dayandır" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "XidmÉ™tlÉ™ri süz" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "TÉ™fÉ™rrüat görünüşü" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "XahiÅŸ edirik, gözlÉ™yin" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "D-Bus trafiki gözlÉ™nilir…" #: src/application.rs:37 msgid "Open a new window" msgstr "Yeni pÉ™ncÉ™rÉ™ aç" #: src/details_view.rs:266 src/window.rs:670 msgid "Copied to clipboard" msgstr "BuferÉ™ kopyalandı" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "busctl É™mri yaradıla bilmÉ™di" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Cavab gözlÉ™nilmir" #: src/message.rs:209 msgid "No Auto Start" msgstr "Avtomatik baÅŸlama yoxdur" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "İnteraktiv autentifikasiyaya icazÉ™ ver" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Æ�lçatanlıq" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "CoÄŸrafi yerləşdirmÉ™" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Daxil etmÉ™" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Daxil olma" #: src/message_tag.rs:133 msgid "Network" msgstr "ŞəbÉ™kÉ™" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "SiyasÉ™t nÉ™zarÉ™ti" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portallar" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Axtarış tÉ™minatçısı" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Gizli mÉ™lumatlar" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessiya" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Qabıq" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Enerji" #: src/message_tag.rs:145 msgid "Unknown" msgstr "NamÉ™lum" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metod çağırışı" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metod qayıdışı" #: src/message_type.rs:36 msgid "Error" msgstr "XÉ™ta" #: src/message_type.rs:37 msgid "Signal" msgstr "Siqnal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Sessiya avtobusu qeyd olunur…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Sessiya avtobusunu qeyd etmÉ™k alınmadı" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Sistem avtobusu qeyd olunur…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Sistem avtobusunu qeyd etmÉ™k alınmadı" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "{address} qeyd olunur…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Ünvanı qeyd etmÉ™k alınmadı" #: src/window.rs:194 msgid "Failed to open file" msgstr "Faylı açmaq alınmadı" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "PCAP kimi saxlamaq alınmadı" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Qeyd PCAP kimi saxlanıldı" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "DOT qrafik kimi saxlamaq alınmadı" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Qeyd DOT qrafik kimi saxlanıldı" #: src/window.rs:415 msgid "translator-credits" msgstr "Ramal RÉ™himov " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP faylları" #: src/window.rs:517 msgid "Open Log" msgstr "Jurnal aç" #: src/window.rs:542 msgid "Save Log" msgstr "Jurnalı saxla" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Jurnalı DOT qrafik faylı kimi saxla" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:644 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} mesaj qeyd olundu" msgstr[1] "{n_messages} mesaj qeyd olundu" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/bg.po000066400000000000000000000454111525300766700222500ustar00rootroot00000000000000# Bulgarian translation of bustle po-file. # Copyright (C) 2026 twlvnn kraftwerk # This file is distributed under the same license as the bustle package. # twlvnn kraftwerk , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-07-01 21:14+0000\n" "PO-Revision-Date: 2026-07-05 21:50+0200\n" "Last-Translator: \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.8\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Визуализиране на дейÑ�твиÑ�та по D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;profile;d-bus;dbus;sequence;monitor;отÑ�транÑ�ване на " "грешки;профилиране;поÑ�ледователноÑ�Ñ‚;монитор;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Ð�ов прозорец" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Широчина на прозореца" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "ВиÑ�очина на прозореца" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "МакÑ�имизирано Ñ�ÑŠÑ�тоÑ�ние на прозореца" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle чертае диаграми на поÑ�ледователноÑ�тите на дейÑ�твиÑ�та по D-Bus, " "извежда излъчването на Ñ�игнали, извикваниÑ�та на методи и Ñ�ъответните " "връщаниÑ� от Ñ‚Ñ�Ñ…, времевите клейма на вÑ�Ñ�ко Ñ�ъбитие както и продължителноÑ�тта " "на вÑ�Ñ�ко извикване на метод. Това помага да откриете нежелан трафик по D-" "Busи да уÑ�тановите, кои приложениÑ� на D-Bus не Ñ�а доÑ�татъчно производителни. " "Програмата извежда Ñ�татиÑ�тики за чеÑ�тотите на Ñ�игнали и Ñ�редната " "продължителноÑ�Ñ‚ на извикване на метод." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Преглед на диаграми на поÑ�ледователноÑ�ти Ñ� дейÑ�твиÑ� на D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Преглед на обобщена Ñ�татиÑ�тика за журнала" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "ОтпуÑ�нете Ñ�е Ñ� тази уÑ�покоÑ�ващо Ñ�ива начална Ñ�траница" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Разработчиците на „Bustle“" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "ЗапиÑ�ване на адреÑ�а" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Отказване" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:199 msgid "_Record" msgstr "_ЗапиÑ�ване" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Ð�дреÑ� на Ñ�ървъра" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Свързано Ñ�ъобщение" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Копиране като busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Съобщение" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Вид" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Път" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "ИнтерфейÑ�" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Член" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Вид грешка" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "ПодробноÑ�ти" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Подател" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Цел" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Компонент" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Размер на Ñ‚Ñ�лото" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Време за отговор" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Сигнатура" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Флагове" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "ТÑ�ло" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "ДокументациÑ� в отворен формат" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Разгъване" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "ПродължителноÑ�ти" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Общо и Ñ�редно време за вÑ�Ñ�ко извикване на метод" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Метод" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Общо" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "ИзвикваниÑ�" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Средно" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Избиране на вÑ�ички етикети" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Без избиране на вÑ�ички етикети" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Избиране на вÑ�ички имена" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Без избиране на вÑ�ички имена" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "ДейÑ�твиÑ�" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "ЧеÑ�тоти" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "ЧеÑ�тотата на извикваниÑ�та на методи и Ñ�игналите" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Вид Ñ�ъобщение" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "ЧеÑ�тота" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Общи" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показване на клавишните комбинации" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Ð�ов прозорец" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "ЗатварÑ�не на прозореца" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Спиране на програмата" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "ЗапиÑ�ване" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "ЗапиÑ�ване на Ñ�еÑ�ийната шина" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "ЗапиÑ�ване на Ñ�иÑ�темната шина" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "ЗапиÑ�ване на адреÑ�а" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "ОтварÑ�не на журнала" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Схема" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Запазване като файл във формат PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Запазване като файл Ñ� граф във формат DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Филтриране на уÑ�луги" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Размери" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Ð�ай-малък, Ñ�реден и най-голÑ�м размер на вÑ�Ñ�ко Ñ�ъобщение" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Ð�ай-малък" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Ð�ай-голÑ�м" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "СтатиÑ�тики" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Ð�ов _прозорец" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_ОтварÑ�не" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "ОтварÑ�не на двойка журнали" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Запазване като…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Граф в DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_СтатиÑ�тика" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Клавишни комбинации" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_ОтноÑ�но „Bustle“" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "ЗапиÑ�ване на Ñ�еÑ�ийната шина" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "ЗапиÑ�ване на Ñ�иÑ�темната шина" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "ЗапиÑ�ване на адреÑ�а…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:232 msgid "Open Log File" msgstr "ОтварÑ�не на журнала" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:248 msgid "Main Menu" msgstr "ОÑ�новно меню" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Добре дошли в „Bustle“" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Ð�ачало на запиÑ�а на дейÑ�твиÑ�та по D-Bus, може Ñ�ъщо да изпълните командата" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "Копиране" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "Зареждане" #. This is a verb #: data/resources/ui/window.ui:215 msgid "_Stop" msgstr "_Спиране" #: data/resources/ui/window.ui:238 msgid "Filter Services" msgstr "Филтриране на уÑ�луги" #: data/resources/ui/window.ui:254 msgid "Details View" msgstr "ПодробноÑ�ти" #: data/resources/ui/window.ui:265 msgid "Please Hold" msgstr "Изчакайте" #: data/resources/ui/window.ui:266 msgid "Waiting for D-Bus Traffic…" msgstr "Изчакване за трафик от D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "За повече информациÑ� отноÑ�но адреÑ�ите вижте {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "ОтварÑ�не на нов прозорец" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Копирано в буфера за обмен" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Командата на busctl не може да Ñ�е генерира" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Ð�е Ñ�е очаква отговор" #: src/message.rs:209 msgid "No Auto Start" msgstr "Без автоматично Ñ�тартиране" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "ПозволÑ�ване на интерактивно удоÑ�товерÑ�ване" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "ДоÑ�тъпноÑ�Ñ‚" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "ГеолокациÑ�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Вход" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "ВпиÑ�ване" #: src/message_tag.rs:133 msgid "Network" msgstr "Мрежа" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Управление на политики" #: src/message_tag.rs:135 msgid "Portals" msgstr "Портали" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "ТърÑ�ачка" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Тайни" #: src/message_tag.rs:138 msgid "Session" msgstr "СеÑ�иÑ�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Обвивка" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "СиÑ�тема за проÑ�ледÑ�ване" #: src/message_tag.rs:144 msgid "Power" msgstr "Енергопотребление" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ð�еизвеÑ�тно" #: src/message_type.rs:34 msgid "Method Call" msgstr "Извикване на метод" #: src/message_type.rs:35 msgid "Method Return" msgstr "Резултат на метод" #: src/message_type.rs:36 msgid "Error" msgstr "Грешка" #: src/message_type.rs:37 msgid "Signal" msgstr "Сигнал" #: src/window.rs:135 msgid "Recording session bus…" msgstr "ЗапиÑ�ване на Ñ�еÑ�ийната шина…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "СеÑ�ийната шина не може да Ñ�е запиÑ�ва" #: src/window.rs:147 msgid "Recording system bus…" msgstr "ЗапиÑ�ване на Ñ�иÑ�темната шина…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "СиÑ�темната шина не може да Ñ�е запиÑ�ва" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "ЗапиÑ�ване на {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Ð�дреÑ�ÑŠÑ‚ не може да Ñ�е запише" #: src/window.rs:194 msgid "Failed to open file" msgstr "Файлът не може да Ñ�е отвори" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "ЗапиÑ�ÑŠÑ‚ не може да Ñ�е запази като PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "ЗапиÑ�ÑŠÑ‚ е запазен като PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "ЗапиÑ�ÑŠÑ‚ не може да Ñ�е запази като граф в DOT" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "ЗапиÑ�ÑŠÑ‚ е запазен като граф в DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "" "twlvnn kraftwerk <kraft_werk@tutanota.com>\n" "\n" "Проектът за превод на GNOME има нужда от подкрепа.\n" "Ð�аучете повече за наÑ� на уеб Ñ�айта ни.\n" "Докладвайте за грешки в превода в Ñ�ъответниÑ� раздел." #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Файлове във формат PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "ОтварÑ�не на журнала" #: src/window.rs:542 msgid "Save Log" msgstr "Запазване на журнала" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Запазване на журнала като граф в DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Заредено е {n_messages} Ñ�ъобщение" msgstr[1] "Заредени Ñ�а {n_messages} Ñ�ъобщениÑ�" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/ca.po000066400000000000000000000376001525300766700222440ustar00rootroot00000000000000# Catalan translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Victor Dargallo , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-05-09 14:13+0200\n" "Last-Translator: \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.6\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualitzeu l'activitat del D-Bus" #. Translators: Search terms to find this application. Do NOT translate or #. localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "depuració;perfilat;d-bus;dbus;seqüència;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Finestra nova" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Amplada de la finestra" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Alçada de la finestra" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Estat maximitzat de la finestra" #. Translators: These are the application description paragraphs in the #. AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal " "emissions, method calls and their corresponding returns, with time stamps " "for each individual event and the duration of each method call. This can " "help you check for unwanted D-Bus traffic, and pinpoint why your D-Bus-" "based application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "El Bustle dibuixa diagrames de seqüència de l'activitat D-Bus. Mostra les " "emissions de senyal, les trucades de mètode i els seus corresponents " "retorns, amb segells de temps per a cada esdeveniment individual i la " "durada de cada convocatòria de mètode. Això pot ajudar-vos a comprovar si " "hi ha un trànsit no desitjat de D-Bus i determinar per què la vostra " "aplicació basada en D-Bus no funciona tan bé com voleu. També proporciona " "estadístiques com les freqüències de senyal i els temps de crida del mètode " "mitjà." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Exploreu els diagrames de seqüències de l'activitat D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Vegeu estadístiques que resumeixen el registre" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Relaxeu-vos amb aquesta pàgina de benvinguda a escala de grisos" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Els desenvolupadors del Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Registra l'adreça" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Cancel·la" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Registra" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Adreça del servidor" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Missatge associat" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copia com a busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Missatge" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Tipus" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Camí" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interfície" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membre" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Tipus d'error" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detalls" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Remitent" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destinació" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Component" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Mida del cos" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Temps de resposta" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signatura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Paràmetres" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Cos" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Obre la documentació de format" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expandeix" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Duracions" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "El temps total i el temps mitjà de cada crida de mètode" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Mètode" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Trucades" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Mitjana" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Selecciona totes les etiquetes" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Desselecciona totes les etiquetes" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Selecciona tots els noms" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Desselecciona tots els noms" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Accions" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Freqüències" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Les freqüències de crides i senyals de mètode" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Tipus de missatge" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Freqüència" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra les dreceres de teclat" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Finestra nova" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Tanca la finestra" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Surt" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Enregistrament" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Enregistra el bus de sessió" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Registra el bus del sistema" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Registra l'adreça" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Obre un fitxer de registre" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagrama" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Desa com a fitxer PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Desa com a fitxer de gràfics DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtra els serveis" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Estadístiques" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Mides" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "La mida més petita, mitjana i gran de cada missatge" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Més petit" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Més gran" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Estadístiques" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Finestra _nova" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Obre" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Obre el parell de registres" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Desa com a…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Gràfic DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Estadístiques" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Dreceres de teclat" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Quant al Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Enregistra el bus de sessió" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Enregistra el bus del sistema" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Enregistra l'adreça…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Obre un fitxer de registre" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menú principal" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Us donem la benvinguda al Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Inicia l'enregistrament de l'activitat D-Bus, també podeu executar l'ordre" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copia" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "S'està carregant" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Atura" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtra els serveis" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vista de detalls" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Si us plau, mantingueu" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "S'està esperant el trànsit de D-Bus…" #: src/address_dialog.rs:42 msgid "" "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Per a més informació sobre les adreces, vegeu la {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Obre una finestra nova" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "S'ha copiat al porta-retalls" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "No s'ha pogut generar l'ordre busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "No s'esperava cap resposta" #: src/message.rs:209 msgid "No Auto Start" msgstr "Sense inici automàtic" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Permet l'autenticació interactiva" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Accessibilitat" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolocalització" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Entrada" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Inici de sessió" #: src/message_tag.rs:133 msgid "Network" msgstr "Xarxa" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Control de política" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portals" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Proveïdor de cerca" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Secrets" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessió" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Potència" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Desconegut" #: src/message_type.rs:34 msgid "Method Call" msgstr "Trucada del mètode" #: src/message_type.rs:35 msgid "Method Return" msgstr "Retorn del mètode" #: src/message_type.rs:36 msgid "Error" msgstr "Error" #: src/message_type.rs:37 msgid "Signal" msgstr "Senyal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "S'està enregistrant el bus de sessió…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "No s'ha pogut enregistrar el bus de sessió" #: src/window.rs:147 msgid "Recording system bus…" msgstr "S'està enregistrant el bus del sistema…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "No s'ha pogut enregistrar el bus del sistema" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 msgid "Recording {address}…" msgstr "S'està enregistrant {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "No s'ha pogut enregistrar l'adreça" #: src/window.rs:194 msgid "Failed to open file" msgstr "No s'ha pogut obrir el fitxer" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "No s'ha pogut desar com a PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "S'ha desat l'enregistrament com a PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "No s'ha pogut desar com a gràfic DOT" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "S'ha desat l'enregistrament com a gràfic DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "Victor Dargallo " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Fitxers PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Obre el registre" #: src/window.rs:542 msgid "Save Log" msgstr "Desa el registre" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Desa el registre com a fitxer de gràfics DOT" #: src/window.rs:646 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "S'ha registrat {n_messages} missatge" msgstr[1] "S'han registrat {n_messages} missatges" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/cs.po000066400000000000000000000405701525300766700222660ustar00rootroot00000000000000# Czech translation for bustle. # Copyright (C) 2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Dagobert Janota , 2025. # Daniel Rusek , 2025. # Patrik Sivek , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-06-02 00:43+0200\n" "Last-Translator: Patrik Sivek \n" "Language-Team: Czech\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-DL-Lang: cs\n" "X-DL-Module: bustle\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: None\n" "X-Generator: Gtranslator 50.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Vizualizujte aktivitu D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "ladÄ›ní;profil;d-bus;dbus;sekvence;monitorování;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nové okno" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Šířka okna" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Výška okna" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Stav maximalizovaného okna" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle vykresluje sekvence diagramů aktivity D-Bus. Zobrazuje vydané " "signály, volání metod a jejich pÅ™idÄ›lené odpovÄ›di, s Ä�asovými razítky pro " "každou individuální událost a délku každého volání metody. To vám může " "pomoci zkontrolovat nežádoucí provoz D-Bus a urÄ�it, proÄ� vaÅ¡e aplikace " "postavená na D-Bus nevykazuje tak dobré výsledky, jak byste chtÄ›li. Také " "poskytuje statistiku jako frekvenci signálů a průmÄ›rný poÄ�et volání metod." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Objevujte sekvenÄ�ní diagramy aktivity D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Podívejte se na statistiky shrnující záznam" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "OdpoÄ�iňte se si s touto uklidňující uvítací stránkou v odstínech Å¡edi" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Vývojáři Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Nahrát adresu" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "Z_ruÅ¡it" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Nahrát" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Adresa serveru" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "PÅ™ipojená zpráva" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopírovat jako busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Zpráva" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Typ" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Cesta" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Rozhraní" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "ÚÄ�astník" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Typ chyby" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detaily" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Odesílatel" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Cíl" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponenta" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Velikost tÄ›la" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Doba odpovÄ›di" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Podpis" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Příznaky" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "TÄ›lo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Otevřít dokumentaci formátu" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Rozšířit" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Délky tvrání" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Celková a průmÄ›rná doba, kterou zabralo každé volání metody" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metoda" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Celkem" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Volání" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "PrůmÄ›r" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Vybrat vÅ¡echny znaÄ�ky" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "ZruÅ¡it výbÄ›r vÅ¡ech znaÄ�ek" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Vybrat vÅ¡echna jména" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "ZruÅ¡it výbÄ›r vÅ¡ech jmen" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "ÄŒinnosti" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frekvence" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Frekvence volání metod a signálů" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Typ zprávy" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frekvence" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Obecné" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Zobrazit klávesové zkratky" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nové okno" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Zavřít okno" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "UkonÄ�it" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Nahrávání" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Nahrát sbÄ›rnici sezení" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Nahrát systémovou sbÄ›rnici" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Nahrát adresu" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Zobrazit záznamový soubor" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Uložit jako soubor PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Uložit jako soubor DOT Graph" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrovat služby" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistika" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Velikosti" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Nejmenší, průmÄ›rná a nejvÄ›tší velikost každé zprávy" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Nejmenší" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "NejvÄ›tší" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistika" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "_Nové okno" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Otevřít" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Otevřít pár záznamů" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Uložit jako…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT Graph" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistika" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Klávesové zkratky" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_O aplikaci Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Nahrát Session Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Nahrát System Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Nahrát adresu…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Otevřít záznamový soubor" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Hlavní nabídka" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Vítejte v Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "ZaÄ�nÄ›te nahrávat aktivitu D-Bus, můžete také spustit příkaz" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopírovat" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "NaÄ�ítání" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "Za_stavit" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrovat služby" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Zobrazení podrobností" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Prosím Ä�ekejte" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "ÄŒekání na provoz D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Chcete-li se dozvÄ›dÄ›t více o adresách, podívejte se na " "{dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Otevřít nové okno" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Zkopírováno do schránky" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Nelze vygenerovat příkaz busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Žádná odpovÄ›Ä� nebyla oÄ�ekávána" #: src/message.rs:209 msgid "No Auto Start" msgstr "Žádné automatické spuÅ¡tÄ›ní" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Povolit interaktivní ověřování" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Přístupnost" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalizace" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Vstup" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "PÅ™ihlášení" #: src/message_tag.rs:133 msgid "Network" msgstr "Síť" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Správa zásad" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portály" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Poskytovatel vyhledávání" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Utajení" #: src/message_tag.rs:138 msgid "Session" msgstr "Sezení" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Napájení" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Neznámý" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metoda volání" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metoda navrácení" #: src/message_type.rs:36 msgid "Error" msgstr "Chyba" #: src/message_type.rs:37 msgid "Signal" msgstr "Signál" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Nahrávání sbÄ›rnice sezení…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "NepodaÅ™ilo se nahrát sbÄ›rnici sezení" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Nahrávání systémové sbÄ›rnice…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "NepodaÅ™ilo se nahrát systémovou sbÄ›rnici" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "Nahrávání {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "NepodaÅ™ilo se nahrát adresu" #: src/window.rs:194 msgid "Failed to open file" msgstr "NepodaÅ™ilo se otevřít soubor" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "NepodaÅ™ilo se uložit jako PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Nahrávání uloženo jako PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "NepodaÅ™ilo se uložit jako DOT graph" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Nahrávání uloženo jako DOT graph" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Dagobert Janota \n" "Daniel Rusek \n" "Patrik Sivek " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Soubory PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Otevřít záznam" #: src/window.rs:542 msgid "Save Log" msgstr "Uložit záznam" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Uložit záznam jako soubor DOT Graph" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Zaznamenána {n_messages} zpráva" msgstr[1] "Zaznamenány {n_messages} zprávy" msgstr[2] "Zaznamenáno {n_messages} zpráv" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Pro více informací se podívejte na specifikaci D-Bus." bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/de.po000066400000000000000000000362021525300766700222460ustar00rootroot00000000000000# German translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # # Jürgen Benvenuti , 2024. # Gabriel Brand , 2024. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2024-04-01 19:50+0000\n" "PO-Revision-Date: 2024-04-08 19:51+0200\n" "Last-Translator: Jürgen Benvenuti \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:4 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-Bus-Aktivität visualisieren" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:10 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;profile;d-bus;dbus;sequence;monitor;Fehlersuche;Profile;D-Bus;Sequenz;" "Monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Neues Fenster" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Fensterbreite" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Fensterhöhe" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Fenstermaximierungsstatus" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle zeichnet Sequenzdiagramme von D-Bus-Aktivitäten. Es zeigt " "Signalemissionen, Methodenaufrufe und ihre entsprechenden Rückgaben, mit " "Zeitstempeln für jedes einzelne Ereignis und die Dauer jedes " "Methodenaufrufs. Dies kann Ihnen helfen, unerwünschten D-Bus-Verkehr zu " "erkennen und herauszufinden, warum Ihre D-Bus-basierte Anwendung nicht so " "gut funktioniert, wie Sie es sich wünschen. Es werden auch Statistiken wie " "Signalhäufigkeiten und durchschnittliche Methodenaufrufzeiten bereitgestellt." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Erkunden Sie Sequenzdiagramme der D-Bus-Aktivität" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Sehen Sie Statistiken, die das Protokoll zusammenfassen" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Entspannen Sie mit dieser beruhigenden Startseite in Graustufen" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:134 src/window.rs:408 msgid "The Bustle developers" msgstr "Die Bustle-Entwickler" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Adresse aufzeichnen" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus specification." msgstr "" "Weitere Informationen zu Adressen finden Sie in der D-Bus-Spezifikation." #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "A_bbrechen" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:91 #: data/resources/ui/window.ui:203 msgid "_Record" msgstr "_Aufzeichnen" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Server-Adresse" #: data/resources/ui/details_view.ui:22 msgid "Associated Message" msgstr "Dazugehörige Meldung" #: data/resources/ui/details_view.ui:38 msgid "Message" msgstr "Meldung" #: data/resources/ui/details_view.ui:41 msgid "Type" msgstr "Typ" #: data/resources/ui/details_view.ui:50 msgid "Path" msgstr "Pfad" #: data/resources/ui/details_view.ui:59 msgid "Interface" msgstr "Schnittstelle" #: data/resources/ui/details_view.ui:68 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Element" #: data/resources/ui/details_view.ui:77 msgid "Error Type" msgstr "Fehlertyp" #: data/resources/ui/details_view.ui:89 msgid "Details" msgstr "Details" #: data/resources/ui/details_view.ui:92 msgid "Sender" msgstr "Sender" #: data/resources/ui/details_view.ui:101 msgid "Destination" msgstr "Ziel" #: data/resources/ui/details_view.ui:110 msgid "Component" msgstr "Komponente" #: data/resources/ui/details_view.ui:125 msgid "Body Size" msgstr "Rumpfgröße" #: data/resources/ui/details_view.ui:135 msgid "Response Time" msgstr "Antwortzeit" #: data/resources/ui/details_view.ui:145 msgid "Signature" msgstr "Signatur" #: data/resources/ui/details_view.ui:154 msgid "Flags" msgstr "Flags" #: data/resources/ui/details_view.ui:165 msgid "Body" msgstr "Rumpf" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Erweitern" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Dauern" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Die gesamte und mittlere Zeit, die jeder Methodenaufruf brauchte" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Methode" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Gesamt" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Aufrufe" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Mittelwert" #: data/resources/ui/filter_pane.ui:51 msgid "Reset All" msgstr "Alles zurücksetzen" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Häufigkeiten" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Die Häufigkeiten von Methodenaufrufen und Signalen" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Meldungstyp" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Häufigkeit" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Allgemein" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Tastenkürzel anzeigen" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "New Window" msgstr "Neues Fenster" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Beenden" #: data/resources/ui/shortcuts.ui:34 msgctxt "shortcut window" msgid "Recording" msgstr "Aufzeichnung" #: data/resources/ui/shortcuts.ui:37 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Sitzungsbus aufzeichnen" #: data/resources/ui/shortcuts.ui:43 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Systembus aufzeichnen" #: data/resources/ui/shortcuts.ui:49 msgctxt "shortcut window" msgid "Record Address" msgstr "Adresse aufzeichnen" #: data/resources/ui/shortcuts.ui:55 msgctxt "shortcut window" msgid "Open Log File" msgstr "Protokolldatei öffnen" #: data/resources/ui/shortcuts.ui:63 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagramm" #: data/resources/ui/shortcuts.ui:66 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Als PCAP-Datei speichern" #: data/resources/ui/shortcuts.ui:72 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Als DOT-Graph-Datei speichern" #: data/resources/ui/shortcuts.ui:78 msgctxt "shortcut window" msgid "Filter Services" msgstr "Dienste filtern" #: data/resources/ui/shortcuts.ui:84 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistiken" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Größen" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Die kleinste, mittlere und größte Größe jeder Meldung" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Kleinste" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Größte" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistiken" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Neues _Fenster" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "Ö_ffnen" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Protokollpaar öffnen" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Speichern unter …" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:558 msgid "DOT Graph" msgstr "DOT-Graph" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistiken" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Tastenkürzel" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Info zu Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Sitzungsbus aufzeichnen" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Systembus aufzeichnen" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Adresse aufzeichnen …" #: data/resources/ui/window.ui:104 data/resources/ui/window.ui:235 msgid "Open Log File" msgstr "Protokolldatei öffnen" #: data/resources/ui/window.ui:112 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:251 msgid "Main Menu" msgstr "Hauptmenü" #: data/resources/ui/window.ui:119 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Willkommen bei Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:120 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Starten Sie die Aufzeichnung der D-Bus-Aktivität, Sie können auch den " "folgenden Befehl ausführen" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "Kopieren" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "Wird geladen" #. This is a verb #: data/resources/ui/window.ui:219 msgid "_Stop" msgstr "_Stoppen" #: data/resources/ui/window.ui:241 msgid "Filter Services" msgstr "Dienste filtern" #: data/resources/ui/window.ui:257 msgid "Details View" msgstr "Detailansicht" #: data/resources/ui/window.ui:267 msgid "Please Hold" msgstr "Bitte warten" #: data/resources/ui/window.ui:268 msgid "Waiting for D-Bus Traffic…" msgstr "Warten auf D-Bus-Verkehr …" #: src/message.rs:193 msgid "No Reply Expected" msgstr "Keine Antwort erwartet" #: src/message.rs:194 msgid "No Auto Start" msgstr "Kein automatischer Start" #: src/message.rs:196 msgid "Allow Interactive Authentication" msgstr "Interaktive Authentifizierung zulassen" #: src/message_tag.rs:110 msgid "Accessibility" msgstr "Barrierefreiheit" #: src/message_tag.rs:111 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:112 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:113 msgid "Geolocalization" msgstr "Geolokalisierung" #: src/message_tag.rs:114 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:115 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:116 msgid "Input" msgstr "Eingabe" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:118 msgid "Login" msgstr "Anmeldung" #: src/message_tag.rs:119 msgid "Network" msgstr "Netzwerk" #: src/message_tag.rs:120 msgid "Policy Control" msgstr "Richtlinienkontrolle" #: src/message_tag.rs:121 msgid "Portals" msgstr "Portale" #: src/message_tag.rs:122 msgid "Search Provider" msgstr "Suchanbieter" #: src/message_tag.rs:123 msgid "Session" msgstr "Sitzung" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:125 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:126 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:128 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:129 msgid "Power" msgstr "Energie" #: src/message_tag.rs:130 msgid "Unknown" msgstr "Unbekannt" #: src/message_type.rs:34 msgid "Method Call" msgstr "Methodenaufruf" #: src/message_type.rs:35 msgid "Method Return" msgstr "Methodenrückgabe" #: src/message_type.rs:36 msgid "Error" msgstr "Fehler" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:131 msgid "Recording session bus…" msgstr "Aufzeichnung des Sitzungsbusses …" #: src/window.rs:135 msgid "Failed to record session bus" msgstr "Aufzeichnung des Sitzungsbusses fehlgeschlagen" #: src/window.rs:141 msgid "Recording system bus…" msgstr "Aufzeichnung des Systembusses …" #: src/window.rs:146 msgid "Failed to record system bus" msgstr "Aufzeichnung des Systembusses fehlgeschlagen" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:160 msgid "Recording {address}…" msgstr "Aufzeichnung von {address} …" #: src/window.rs:169 msgid "Failed to record address" msgstr "Aufzeichnung der Adresse fehlgeschlagen" #: src/window.rs:186 msgid "Failed to open file" msgstr "Datei konnte nicht geöffnet werden" #: src/window.rs:198 msgid "Failed to save as PCAP" msgstr "Speichern als PCAP fehlgeschlagen" #: src/window.rs:201 msgid "Recording saved as PCAP" msgstr "Aufzeichnung als PCAP gespeichert" #: src/window.rs:212 msgid "Failed to save as DOT graph" msgstr "Speichern als DOT-Graph fehlgeschlagen" #: src/window.rs:215 msgid "Recording saved as DOT graph" msgstr "Aufzeichnung als DOT-Graph gespeichert" #: src/window.rs:407 msgid "translator-credits" msgstr "" "Jürgen Benvenuti \n" "Gabriel Brand " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:497 src/window.rs:521 msgid "PCAP Files" msgstr "PCAP-Dateien" #: src/window.rs:504 msgid "Open Log" msgstr "Protokoll öffnen" #: src/window.rs:528 msgid "Save Log" msgstr "Protokoll speichern" #: src/window.rs:565 msgid "Save Log as DOT Graph File" msgstr "Protokoll als DOT-Graph-Datei speichern" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:634 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} Meldung protokolliert" msgstr[1] "{n_messages} Meldungen protokolliert" #: src/window.rs:651 msgid "Copied to clipboard" msgstr "In die Zwischenablage kopiert" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/en_GB.po000066400000000000000000000367241525300766700226410ustar00rootroot00000000000000# British English translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Andi Chandler , 2024. # Bruce Cowan , 2024. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-07-27 14:45+0000\n" "PO-Revision-Date: 2025-09-02 11:15+0100\n" "Last-Translator: Bruce Cowan \n" "Language-Team: British English \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.7\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualise D-Bus activity" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profile;d-bus;dbus;sequence;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "New Window" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Window width" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Window height" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Window maximised state" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Explore sequence diagrams of D-Bus activity" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "See statistics summarising the log" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Relax with this soothing grey scale welcome page" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:159 src/window.rs:416 msgid "The Bustle developers" msgstr "The Bustle developers" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Record Address" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus " "specification." msgstr "" "For more information about addresses, see the D-Bus " "specification." #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "_Cancel" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Record" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Server Address" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Associated Message" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copy as busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Message" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Type" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Path" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interface" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Member" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Error Type" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Details" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Sender" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destination" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Component" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Body Size" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Response Time" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signature" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Flags" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Body" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Open Format Documentation" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expand" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durations" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "The total and mean time every method call took" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Method" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Calls" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Mean" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Select All Tags" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Unselect All Tags" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Select All Names" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Unselect All Names" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Actions" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequencies" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "The frequencies of method calls and signals" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Message Type" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequency" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Show Shortcuts" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "New Window" #: data/resources/ui/shortcuts.ui:21 #| msgid "New Window" msgctxt "shortcut window" msgid "Close Window" msgstr "Close Window" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Quit" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Recording" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Record Session Bus" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Record System Bus" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Record Address" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Open Log File" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Save as PCAP File" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Save as DOT Graph File" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filter Services" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistics" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Sizes" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "The smallest, mean and largest size of every message" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Smallest" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Largest" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistics" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "New _Window" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Open" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Open Pair of Logs" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Save As…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT Graph" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistics" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Keyboard Shortcuts" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_About Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Record Session Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Record System Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Record Address…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Open Log File" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Main Menu" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Welcome to Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Start recording D-Bus activity, you can also run the command" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copy" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Loading" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Stop" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filter Services" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Details View" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Please Hold" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Waiting for D-Bus Traffic…" #: src/application.rs:37 msgid "Open a new window" msgstr "Open a new window" #: src/details_view.rs:266 src/window.rs:670 msgid "Copied to clipboard" msgstr "Copied to clipboard" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Could not generate busctl command" #: src/message.rs:208 msgid "No Reply Expected" msgstr "No Reply Expected" #: src/message.rs:209 msgid "No Auto Start" msgstr "No Auto Start" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Allow Interactive Authentication" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Accessibility" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolocalisation" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Input" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Login" #: src/message_tag.rs:133 msgid "Network" msgstr "Network" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Policy Control" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portals" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Search Provider" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Secrets" #: src/message_tag.rs:138 msgid "Session" msgstr "Session" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Power" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Unknown" #: src/message_type.rs:34 msgid "Method Call" msgstr "Method Call" #: src/message_type.rs:35 msgid "Method Return" msgstr "Method Return" #: src/message_type.rs:36 msgid "Error" msgstr "Error" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Recording session bus…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Failed to record session bus" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Recording system bus…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Failed to record system bus" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "Recording {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Failed to record address" #: src/window.rs:194 msgid "Failed to open file" msgstr "Failed to open file" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Failed to save as PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Recording saved as PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Failed to save as DOT graph" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Recording saved as DOT graph" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Andi Chandler \n" "Bruce Cowan " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP Files" #: src/window.rs:517 msgid "Open Log" msgstr "Open Log" #: src/window.rs:542 msgid "Save Log" msgstr "Save Log" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Save Log as DOT Graph File" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:644 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Logged {n_messages} message" msgstr[1] "Logged {n_messages} messages" #~ msgid "Reset All" #~ msgstr "Reset All" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/eo.po000066400000000000000000000365761525300766700222770ustar00rootroot00000000000000# Esperanto translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Kristjan SCHMIDT , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-03-28 22:36+0100\n" "Last-Translator: Kristjan SCHMIDT \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 49.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Bildigu D-Bus-agadon" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "sencimigi;profili;d-bus;dbus;sekvenco;monitoro;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nova fenestro" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Fenestra larÄ�o" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Fenestra alto" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Maksimumigita stato de fenestro" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle desegnas sekvencdiagramojn de D-Bus-agado. Äœi montras signal-" "elsendojn, metodvokojn kaj iliajn respondojn, kun horstampiloj por ĉiu " "aparta evento kaj la daÅ­ro de ĉiu metoda voko. Tio povas helpi vin kontroli " "nedeziratajn D-Bus-trafikon, kaj precize trovi kial via D-Bus-bazita " "aplikaĵo ne funkcias tiel bone kiel vi deziras. Äœi ankaÅ­ provizas " "statistikojn kiel signal-frekvencojn kaj mezajn metodvok-tempojn." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Esploru sekvencdiagramojn de D-Bus-agado" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Vidu statistikojn resumantajn la protokolon" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Ripozu ĉe ĉi tiu kvieta greznivela bonvenpaÄ�o" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "La programistoj de Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Registra adreso" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Nuligi" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Registri" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Servila adreso" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Rilata mesaÄ�o" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopii kiel busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "MesaÄ�o" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Speco" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Vojo" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interfaco" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membro" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Eraro-tipo" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detaloj" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Sendanto" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Celo" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponanto" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Korpa grandeco" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Respondotempo" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Subskribo" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Flagoj" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Korpo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Malfermi formatan dokumentaron" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Etendi" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "DaÅ­roj" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "La tuta kaj meza tempo de ĉiu metoda voko" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metodo" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Totalo" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Vokoj" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Mezumo" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Elekti ĉiujn etikedojn" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Mallelekti ĉiujn etikedojn" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Elekti ĉiujn nomojn" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Mallelekti ĉiujn nomojn" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Agoj" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Oftecoj" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "La frekvencoj de metodvokoj kaj signaloj" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "MesaÄ�-tipo" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Ofteco" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Äœenerala" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Montri klav-mallongigojn" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nova fenestro" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Fermi fenestron" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Forlasi" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Registrado" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Registri seancan buson" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Registri sisteman buson" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Registra adreso" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Malfermi protokoldosieron" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagramo" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Konservi kiel PCAP-dosieron" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Konservi kiel DOT-grafeodosieron" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtri servojn" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistikoj" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Grandecoj" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "La plej malgranda, meza kaj plej granda grandeco de ĉiu mesaÄ�o" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Plej malgranda" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Plej granda" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistikoj" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nova _fenestro" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Malfermi" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Malfermi paron da protokoloj" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Konservi kiel…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT-grafeo" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistikoj" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Klav-mallongigoj" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Pri Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Registri seancan buson" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Registri sisteman buson" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Registra adreso…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Malfermi protokoldosieron" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Ĉefa menuo" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bonvenon al Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Ekregistru D-Bus-agadon; vi ankaÅ­ povas ruli la komandon" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopii" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Åœargado" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Halti" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtri servojn" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Detalvido" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Bonvolu atendi" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Atendante D-Bus-trafikon…" #: src/address_dialog.rs:42 msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "Por pli da informoj pri adresoj, vidu la {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Malfermi novan fenestron" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Kopiita en tondujo" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ne eblis generi busctl-komandon" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Neniu respondo atendota" #: src/message.rs:209 msgid "No Auto Start" msgstr "Ne aÅ­tomate startita" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Permesi interagan aÅ­tentikigon" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Alirebleco" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bludento" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalizado" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Enigo" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Saluto" #: src/message_tag.rs:133 msgid "Network" msgstr "Reto" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Reguladilo" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portaloj" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Serĉo-provizanto" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Sekretoj" #: src/message_tag.rs:138 msgid "Session" msgstr "Seanco" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Åœelo" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Spuristo" #: src/message_tag.rs:144 msgid "Power" msgstr "Energio" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Nekonate" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metoda voko" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metoda reveno" #: src/message_type.rs:36 msgid "Error" msgstr "Eraro" #: src/message_type.rs:37 msgid "Signal" msgstr "Signalo" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Registrante seancbuon…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Malsukcesis registri seancbuon" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Registrante sistembuon…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Malsukcesis registri sistembuon" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 msgid "Recording {address}…" msgstr "Registrante {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Malsukcesis registri adreson" #: src/window.rs:194 msgid "Failed to open file" msgstr "Malsukcesis malfermi dosieron" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Malsukcesis konservi kiel PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Registraĵo konservita kiel PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Malsukcesis konservi kiel DOT-grafeon" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Registraĵo konservita kiel DOT-grafeo" #: src/window.rs:415 msgid "translator-credits" msgstr "Kristjan SCHMIDT" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP-dosieroj" #: src/window.rs:517 msgid "Open Log" msgstr "Malfermi protokolon" #: src/window.rs:542 msgid "Save Log" msgstr "Konservi protokolon" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Konservi protokolon kiel DOT-grafeodosieron" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} mesaÄ�o protokolita" msgstr[1] "{n_messages} mesaÄ�oj protokolitaj" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/es.po000066400000000000000000000370241525300766700222700ustar00rootroot00000000000000# Spanish translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Sergio Gil , 2024-2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-04-13 14:52+0000\n" "PO-Revision-Date: 2025-05-10 17:30+0200\n" "Last-Translator: Sergio Gil \n" "Language-Team: es_ES \n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 48.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:4 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualizar la actividad de D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:10 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "depurar;perfilar;d-bus;secuencia;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:20 msgid "New Window" msgstr "Nueva ventana" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Anchura de ventana" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Altura de ventana" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Estado de ventana maximizada" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle representa diagramas de secuencia de la actividad de D-Bus. Muestra " "las emisiones de señales, llamadas de métodos y los retornos de esta, junto " "con marcas de tiempo para cada evento individual y la duración de los " "métodos. Esto puede ayudarle a comprobar si hay actividad de D-Bus no " "deseada y determinar por qué su aplicación basada en D-Bus no rinde como le " "gustaría. También proporciona estadísticas como la frecuencia de las señales " "y los tiempos promedios de llamadas a métodos." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Explora diagramas de secuencia del tráfico de D-Bus." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Ver estadísticas que resumen el diario" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" "Relájese con esta reconfortante página de bienvenida en escala de grises" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:147 src/window.rs:415 msgid "The Bustle developers" msgstr "Los desarrolladores de Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Dirección del registro" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus " "specification." msgstr "" "Para más información sobre las direcciones, consulte la especificación " "de D-Bus (en inglés)." #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "_Cancelar" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "G_rabar" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Dirección del servidor" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Mensaje asociado" #: data/resources/ui/details_view.ui:35 msgid "Message" msgstr "Mensaje" #: data/resources/ui/details_view.ui:38 msgid "Type" msgstr "Tipo" #: data/resources/ui/details_view.ui:47 msgid "Path" msgstr "Ruta" #: data/resources/ui/details_view.ui:56 msgid "Interface" msgstr "Interfaz" #: data/resources/ui/details_view.ui:65 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Miembro" #: data/resources/ui/details_view.ui:74 msgid "Error Type" msgstr "Tipo de error" #: data/resources/ui/details_view.ui:86 msgid "Details" msgstr "Detalles" #: data/resources/ui/details_view.ui:89 msgid "Sender" msgstr "Remitente" #: data/resources/ui/details_view.ui:98 msgid "Destination" msgstr "Destino" #: data/resources/ui/details_view.ui:107 msgid "Component" msgstr "Componente" #: data/resources/ui/details_view.ui:122 msgid "Body Size" msgstr "Longitud del cuerpo" #: data/resources/ui/details_view.ui:132 msgid "Response Time" msgstr "Tiempo de respuesta" #: data/resources/ui/details_view.ui:142 msgid "Signature" msgstr "Firma" #: data/resources/ui/details_view.ui:151 msgid "Flags" msgstr "Banderas" #: data/resources/ui/details_view.ui:162 msgid "Body" msgstr "Cuerpo" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expandir" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Duraciones" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "La duración total y media de cada llamada de método" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Método" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Llamadas" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Media" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Seleccionar todas las etiquetas" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Desmarcar todas las etiquetas" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Seleccionar todos los nombres" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Desmarcar todos los nombres" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Acciones" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frecuencias" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Las frecuencias de llamadas de métodos y señales" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Tipo de mensaje" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frecuencia" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostrar atajos del teclado" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "New Window" msgstr "Nueva ventana" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Salir" #: data/resources/ui/shortcuts.ui:34 msgctxt "shortcut window" msgid "Recording" msgstr "Grabando" #: data/resources/ui/shortcuts.ui:37 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Grabar sesión del bus" #: data/resources/ui/shortcuts.ui:43 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Grabar bus del sistema" #: data/resources/ui/shortcuts.ui:49 msgctxt "shortcut window" msgid "Record Address" msgstr "Grabar dirección" #: data/resources/ui/shortcuts.ui:55 msgctxt "shortcut window" msgid "Open Log File" msgstr "Abrir diario" #: data/resources/ui/shortcuts.ui:63 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagrama" #: data/resources/ui/shortcuts.ui:66 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Guardar como PCAP" #: data/resources/ui/shortcuts.ui:72 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Guardar como DOT Graph" #: data/resources/ui/shortcuts.ui:78 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrar servicios" #: data/resources/ui/shortcuts.ui:84 msgctxt "shortcut window" msgid "Statistics" msgstr "Estadísticas" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Tamaños" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "El tamaño más pequeño, el medio y el más largo de cada mensaje" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "El más pequeño" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Más largo" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Estadísticas" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nueva _ventana" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Abrir" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Abrir par de diarios" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Guardar como…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:568 msgid "DOT Graph" msgstr "Gráfico DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "E_stadísticas" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "A_tajos de teclado" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "A_cerca de Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Grabar sesión del bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Grabar bus del sistema" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Grabar dirección…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Abrir diario" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menú principal" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bienvenido a Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Empezar a grabar actividad de D-Bus. También puede ejecutar el comando." #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copiar" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Cargando" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Detener" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrar servicios" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vista de detalles" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Espere" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Esperando tráfico de D-Bus…" #: src/application.rs:37 msgid "Open a new window" msgstr "Abrir una nueva ventana" #: src/message.rs:204 msgid "No Reply Expected" msgstr "No se espera respuesta" #: src/message.rs:205 msgid "No Auto Start" msgstr "No comenzar automáticamente" #: src/message.rs:207 msgid "Allow Interactive Authentication" msgstr "Permitir autenticación interactiva" #: src/message_tag.rs:118 msgid "Accessibility" msgstr "Accesibilidad" #: src/message_tag.rs:119 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:120 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:121 msgid "Geolocalization" msgstr "Geolocalización" #: src/message_tag.rs:122 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:123 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:124 msgid "Input" msgstr "Entrada" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:126 msgid "Login" msgstr "Inicio de sesión" #: src/message_tag.rs:127 msgid "Network" msgstr "Red" #: src/message_tag.rs:128 msgid "Policy Control" msgstr "Control de políticas" #: src/message_tag.rs:129 msgid "Portals" msgstr "Portales" #: src/message_tag.rs:130 msgid "Search Provider" msgstr "Proveedor de búsqueda" #: src/message_tag.rs:131 msgid "Session" msgstr "Sesión" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:133 msgid "Shell" msgstr "Intérprete" #: src/message_tag.rs:134 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:136 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:137 msgid "Power" msgstr "Energía" #: src/message_tag.rs:138 msgid "Unknown" msgstr "Desconocido" #: src/message_type.rs:34 msgid "Method Call" msgstr "Llamada de método" #: src/message_type.rs:35 msgid "Method Return" msgstr "Retorno del método" #: src/message_type.rs:36 msgid "Error" msgstr "Error" #: src/message_type.rs:37 msgid "Signal" msgstr "Señal" #: src/window.rs:134 msgid "Recording session bus…" msgstr "Grabando el bus de sesión…" #: src/window.rs:139 msgid "Failed to record session bus" msgstr "No se pudo grabar el bus de sesión" #: src/window.rs:146 msgid "Recording system bus…" msgstr "Grabando el bus del sistema…" #: src/window.rs:151 msgid "Failed to record system bus" msgstr "No se pudo grabar el bus del sistema" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 msgid "Recording {address}…" msgstr "Grabando {address}…" #: src/window.rs:177 msgid "Failed to record address" msgstr "No se pudo grabar la dirección" #: src/window.rs:193 msgid "Failed to open file" msgstr "Error al abrir el archivo" #: src/window.rs:205 msgid "Failed to save as PCAP" msgstr "No se pudo guardar como PCAP" #: src/window.rs:208 msgid "Recording saved as PCAP" msgstr "Grabación guardada como PCAP" #: src/window.rs:219 msgid "Failed to save as DOT graph" msgstr "No se pudo grabar como gráfico DOT" #: src/window.rs:222 msgid "Recording saved as DOT graph" msgstr "Grabación guardada como gráfico DOT" #: src/window.rs:414 msgid "translator-credits" msgstr "Sergio Gil , 2024-2025" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:508 src/window.rs:533 msgid "PCAP Files" msgstr "Archivos PCAP" #: src/window.rs:516 msgid "Open Log" msgstr "Abrir registro" #: src/window.rs:541 msgid "Save Log" msgstr "Guardar registro" #: src/window.rs:575 msgid "Save Log as DOT Graph File" msgstr "Guardar registro como DOT Graph" # ¿A lo mejor es mejor reemplazar {n_messages} en «1» por «un»? #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:643 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Registrado {n_messages} mensaje" msgstr[1] "Registrados {n_messages} mensajes" #: src/window.rs:660 msgid "Copied to clipboard" msgstr "Copiado al potapapeles" #~ msgid "Reset All" #~ msgstr "Restablecer todo" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/eu.po000066400000000000000000000377061525300766700223010ustar00rootroot00000000000000# Basque translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Asier Saratsua Garmendia , 2024, 2026. # msgid "" msgstr "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-07-11 07:28+0000\n" "PO-Revision-Date: 2026-07-13 21:06+0000\n" "Last-Translator: Asier Saratsua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Bistaratu D-Bus jarduera" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "arazketa;profila;d-bus;sbus;sekuentzia;monitorizazioa;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Leiho berria" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Leihoaren zabalera" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Leihoaren altuera" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Leiho maximizatuaren egoera" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "Bustle aplikazioak D-Bus jardueraren sekuentzia-diagramak marrazten ditu. Seinale-igorpenak, metodo-deiak eta horiek itzulerak erakusten ditu, bakoizaren denbora-zigiluak eta iraupena ere erakutsiz. Horri esker, nahi gabeko D-Bus trafikoa aztertu daiteke eta D-Bus sisteman oinarritutako aplikazioak zergatik ez diren ongi portatzen. Seinale-maiztasunak eta metodo-deien batez besteko denbora bezalako estatistikak ere eskaintzen ditu." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Arakatu D-Bus jardueraren sekuentzia-diagramak" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Ikusi egunkaria laburbiltzen duten estatistikak" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Erlaxatu gris koloreko ongi etorriko orri honekin" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Bustle garatzaileak" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Grabatu helbidea" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Utzi" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:199 msgid "_Record" msgstr "_Grabatu" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Zerbitzari-helbidea" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Lotutako mezua" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopiatu busctl gisa" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Mezua" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Mota" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Bide-izena" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interfazea" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Kidea" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Errore mota" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Xehetasunak" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Bidaltzailea" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Helburua" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Osagaia" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Gorputzaren tamaina" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Erantzun-denbora" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Sinadura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Banderak" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Gorputza" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Ireki formatu-dokumentazioa" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Hedatu" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Iraupenak" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Metodo-dei bakoitzak behar duen batez besteko denbora eta denbora osoa" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metodoa" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Guztira" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Deiak" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Batez bestekoa" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Hautatu etiketa guztiak" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Desautatu etiketa guztiak" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Hautatu izen guztiak" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Desautatu izen guztiak" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Ekintzak" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Maiztasunak" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Metodo-deien eta seinaleen maiztasunak" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Mezu mota" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Maiztasuna" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Orokorra" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Erakutsi lasterbideak" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Leiho berria" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Itxi leihoa" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Irten" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Grabazioa" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Grabazioaren saioaren bus-a" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Grabazioaren sistemaren bus-a" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Grabatu helbidea" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Ireki egunkari-fitxategia" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagrama" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Gorde PCAP fitxategi gisa" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Gorde DOT grafikoen fitxategi gisa" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Iragazi zerbitzuak" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Estatistikak" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Tamainak" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Mezu bakoitzaren tamaina txikiena, batez bestekoa eta handiena" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Txikiena" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Handiena" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Estatistikak" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Leiho _berria" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Ireki" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Ireki egunkari-bikotea" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Gorde honela…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT grafikoa" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Estatistikak" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Las_ter-teklak" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Bustle aplikazioari _buruz" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Grabatu saioaren bus-a" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Grabatu sistemaren bus-a" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Grabatu helbidea…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:232 msgid "Open Log File" msgstr "Ireki egunkari-fitxategia" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:248 msgid "Main Menu" msgstr "Menu nagusia" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Ongi etorri Bustle aplikaziora" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Hasi D-Bus jarduera grabatzen, honako komandoa ere exekutatu dezakezu:" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "Kopiatu" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "Kargatzen" #. This is a verb #: data/resources/ui/window.ui:215 msgid "_Stop" msgstr "_Gelditu" #: data/resources/ui/window.ui:238 msgid "Filter Services" msgstr "Iragazi zerbitzuak" #: data/resources/ui/window.ui:254 msgid "Details View" msgstr "Xehetasunen ikuspegia" #: data/resources/ui/window.ui:265 msgid "Please Hold" msgstr "Itxaron" #: data/resources/ui/window.ui:266 msgid "Waiting for D-Bus Traffic…" msgstr "D-Bus trafikoaren zain…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "Helbideei buruzko informazio gehiagorako, ikus {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Ireki leiho berria" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Arbelean kopiatu da" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ezin izan da busctl komandoa sortu" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Ez da erantzunik espero" #: src/message.rs:209 msgid "No Auto Start" msgstr "Ez dago abio automatikorik" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Onartu autentifikazio interaktiboa" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Erabilerraztasuna" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetootha" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geokokapena" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Sarrera" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Saio-hasiera" #: src/message_tag.rs:133 msgid "Network" msgstr "Sarea" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Politika-kontrola" #: src/message_tag.rs:135 msgid "Portals" msgstr "Atariak" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Bilaketa-hornitzailea" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Ezkutukoak" #: src/message_tag.rs:138 msgid "Session" msgstr "Saioa" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell-a" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Aztarnaria" #: src/message_tag.rs:144 msgid "Power" msgstr "Energia" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ezezaguna" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metodo-deia" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metodo-itzulera" #: src/message_type.rs:36 msgid "Error" msgstr "Errorea" #: src/message_type.rs:37 msgid "Signal" msgstr "Seinalea" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Saioaren bus-a grabatzen…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Saioaren bus-a grabatzeak huts egin du" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Sistemaren bus-a grabatzen…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Sistemaren bus-a grabatzeak huts egin du" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "{address} grabatzen…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Helbidea grabatzeak huts egin du" #: src/window.rs:194 msgid "Failed to open file" msgstr "Fitxategia irekitzeak huts egin du" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "PCAP gisa gordetzeak huts egin du" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Grabazioa PCAP gisa gorde da" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "DOT grafiko gisa gordetzeak huts egin du" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Grabazioa DOT grafiko gisa gorde da" #: src/window.rs:415 msgid "translator-credits" msgstr "translator-credits" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP fitxategiak" #: src/window.rs:517 msgid "Open Log" msgstr "Ireki egunkaria" #: src/window.rs:542 msgid "Save Log" msgstr "Gorde egunkaria" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Gorde egunkaria DOT grafikoen fitxategi gisa" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Mezu {n_messages} erregistratu da" msgstr[1] "{n_messages} mezu erregistratu dira" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Helbideei buruzko informazio gehiagorako, ikus D-Bus " #~ "espezifikazioa." #~ msgid "Reset All" #~ msgstr "Berrezarri dena" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/fr.po000066400000000000000000000411341525300766700222650ustar00rootroot00000000000000# French translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Alexandre Franke , 2024. # Vincent Chatelain , 2024. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-04-01 08:09+0200\n" "Last-Translator: Guillaume Bernard \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.9\n" "X-DamnedLies-Scope: partial\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualisez l’activité D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "déboguer;profiler;d-bus;dbus;séquencer;surveiller;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nouvelle fenêtre" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Largeur de la fenêtre" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Taille de la fenêtre" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "État maximisé de la fenêtre" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle dessine des diagrammes de séquence sur l’activité D-Bus. Ces " "diagrammes montrent les émissions des signaux, les appels de méthodes et " "leurs résultats, avec un marqueur temporel pour chaque évènement unique et " "la durée de chaque appel de méthode. Cela peut vous permettre de vérifier un " "trafic D-Bus inattendu, et de comprendre pourquoi votre application " "utilisant D-Bus n’atteint pas les performances attendues. Bustle fournit " "également des statistiques, notamment sur les fréquence des signaux et les " "durées moyennes d’appel de méthode." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Explorer les diagrammes séquence de l’activité de D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Voir les statistiques résumant le journal" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" "Détendez-vous avec cette page d’accueil reposante tout en nuances du gris" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Les développeurs de Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Capturer l’adresse" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "A_nnuler" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Capturer" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Adresse du serveur" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Message associé" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copier comme commande busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Message" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Type" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Chemin" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interface" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membre" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Type d’erreur" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Détails" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Émetteur" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destination" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Composant" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Taille du contenu" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Temps de réponse" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signature" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Drapeaux" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Contenu" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Documentation en format ouvert" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Développer" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durées" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Le temps moyen et total pour chaque appel de méthode" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Méthode" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Appels" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Moyen" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Sélectionner toutes les étiquettes" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Désélectionner toutes les étiquettes" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Sélectionner tous les noms" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Désélectionner tous les noms" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Actions" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Fréquences" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Les fréquences des appels de méthode et des signaux" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Type de message" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Fréquence" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Général" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Afficher les raccourcis" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nouvelle fenêtre" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Fermer la fenêtre" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Quitter" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Capture en cours" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Capturer le bus session" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Capturer le bus système" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Capturer l’adresse" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Ouvrir un fichier journal" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagramme" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Enregistrer comme fichier PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Enregistrer comme graphe DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrer les services" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistiques" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Tailles" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "La taille minimale, moyenne et maximale de chaque message" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Minimale" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Maximale" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistiques" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nouvelle _fenêtre" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Ouvrir" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Ouvrir une paire de journaux" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Enregistrer sous…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Graphe DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistiques" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Raccourcis c_lavier" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "À _propos de Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Capturer le bus session" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Capturer le bus système" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Capturer l’adresse…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Ouvrir un fichier journal" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menu principal" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bienvenue sur Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Commencez à capturer l’activité D-Bus. Vous pouvez également exécuter la " "commande" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copier" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Chargement" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Arrêter" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrer les services" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vue détaillée" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Veuillez patienter" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Attente du trafic D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Pour davantage d’informations à propos des adresses, veuillez consulter " "{dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Ouvrir une nouvelle fenêtre" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Copié vers le presse-papier" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Impossible de générer une commande busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Aucun réponse attendue" #: src/message.rs:209 msgid "No Auto Start" msgstr "Pas de démarrage automatique" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Autoriser l’authentification interactive" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Accessibilité" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Géolocalisation" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Entrée" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Identifiant" #: src/message_tag.rs:133 msgid "Network" msgstr "Réseau" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Réglementation" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portails" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Fournisseur de services de recherche" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Secrets" #: src/message_tag.rs:138 msgid "Session" msgstr "Session" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Puissance" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Inconnu" #: src/message_type.rs:34 msgid "Method Call" msgstr "Appel de méthode" #: src/message_type.rs:35 msgid "Method Return" msgstr "Retour de méthode" #: src/message_type.rs:36 msgid "Error" msgstr "Erreur" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Capture du bus session…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Échec de capture du bus session" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Capture du bus système…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Échec de capture du bus système" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "Capture de {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Échec de capture de l’adresse" #: src/window.rs:194 msgid "Failed to open file" msgstr "Échec d’ouverture du fichier" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Échec de capture en tant que PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Capture enregistrée en tant que PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Échec de capture en tant que graphe DOT" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Capture enregistré en tant graphe DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Vincent Chatelain \n" "Guillaume Bernard " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Fichiers PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Ouvrir un journal" #: src/window.rs:542 msgid "Save Log" msgstr "Enregistrer le journal" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Enregistrer le journal en tant que graphe DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} message journalisé" msgstr[1] "{n_messages} messages journalisés" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Pour plus d’informations sur les adresses, référez-vous à la spécification D-Bus (en anglais)." #~ msgid "Reset All" #~ msgstr "Tout réinitialiser" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/he.po000066400000000000000000000424511525300766700222550ustar00rootroot00000000000000# Hebrew translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Yaron Shahrabani , 2024. # Yosef Or Boczko , 2024-2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-08-27 19:48+0000\n" "PO-Revision-Date: 2026-09-02 09:34+0300\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3);\n" "X-Generator: Poedit 3.9\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "המחשת הפעילות של D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "ניפוי שגי×�ות;פרופיל;דיב×�ס;די-ב×�ס;די-בס;d-bus;רצף;תרשי×� " "הרצף;מעקב;צג;מוניטור;×�פיק המערכת;×�פיק נתוני×�;×�פיק ההפעלה;×�פיק הפעלה;×�פיק " "מערכת;×�פיק;ב×�ס;בס;ב×�סטל;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "חלון חדש" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "רוחב חלון" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "גובה חלון" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "חלון במצב מוגדל" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "היישו×� Bustle מצייר תרשימי רצף של פעילות D-Bus. הו×� מציג פליטות של ×�ותות, " "קרי×�ות לשיטות והערכי×� שחוזרי×� מהן, ×¢×� חותמת זמן לכל ×�ירוע ו×�ירוע והמשך של כל " "קרי×�×” לשיטה. הניתוח ×”×–×” יכול לסייע לך לבדוק ×�×� מתקיימת תעבורת D-Bus ל×� רצויה " "ולהצביע על הסיבה לכך שהיישו×� מבוסס ×”Ö¾D-Bus שלך ל×� מתפקד כמו שציפית. היישו×� " "מספק ×’×� סטטיסטיקה כגון תדירות ×”×�ותו ו×�ת משך הזמן הממוצע לקרי×�ות לשיטות." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "חקירת תרשימי רצף של פעילות D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "הצגת סטטיסטיקה שמסכמת ×�ת היומן" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "×�פשר לנשו×� לרווחה מול מסך קבלת הפני×� ×”×–×” בגווני ×�פור" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:165 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "מפתחי Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "הקלטת כתובת" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_ביטול" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:199 msgid "_Record" msgstr "×”_קלטה" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "כתובת שרת" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "הודעה משויכת" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "העתקה ×›Ö¾busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "הודעה" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "סוג" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "נתיב" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "מנשק" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "חבר" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "סוג שגי×�×”" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "פרטי×�" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "מוען" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "יעד" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "רכיב" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "גודל מסר" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "זמן תגובה" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "חתימה" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "דגלוני×�" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "מסר" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "תיעוד תסדיר פתוח" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "הרחבה" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "פרקי זמן" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "הזמן הכולל והממוצע שלקח לכל קרי×�×” לשיטה" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "שיטה" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "סך הכול" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "קרי×�ות" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "ממוצע" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "בחירה של כל התגיות" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "ביטול בחירת התגיות" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "בחירת כל השמות" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "ביטול בחירת השמות" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "פעולות" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "תדירויות" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "תדירויות שיטות הקרי×�×” וה×�ותות" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "סוג הודעה" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "תדירות" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "כללי" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "הצגת קיצורי מקלדת" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "חלון חדש" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "סגירת חלון" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "יצי×�×”" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "הקלטה" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "הקלטת ×�פיק הפעלה" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "הקלטת ×�פיק מערכת" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "הקלטת כתובת" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "פתיחת קובץ יומן" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "תרשי×�" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "שמירה כקובץ PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "שמירה כקובץ תרשי×� DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "סינון שירותי×�" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "סטטיסטיקה" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "גדלי×�" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "הגודל הקטן ביותר, הממוצע והגדול ביותר של כל הודעה" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "הקטן ביותר" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "הגדול ביותר" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "סטטיסטיקה" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "חלון _חדש" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_פתיחה" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "פתיחת צמד יומני×�" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "שמירה בש×�…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "תרשי×� DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_סטטיסטיקה" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_קיצורי מקלדת" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_על Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "הקלטת ×�פיק ההפעלה" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "הקלטת ×�פיק מערכת" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "הקלטת כתובת…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:232 msgid "Open Log File" msgstr "פתיחת קובץ יומן" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:248 msgid "Main Menu" msgstr "תפריט ר×�שי" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "ברוך בו×�ך ל־Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "×�פשר להתחיל להקליט ×�ת הפעילות של D-Bus, ×�פשר ×’×� להריץ ×�ת הפקודה" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "העתקה" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "טעינה" #. This is a verb #: data/resources/ui/window.ui:215 msgid "_Stop" msgstr "_עצירה" #: data/resources/ui/window.ui:238 msgid "Filter Services" msgstr "סינון שירותי×�" #: data/resources/ui/window.ui:254 msgid "Details View" msgstr "תצוגה מפורטת" #: data/resources/ui/window.ui:265 msgid "Please Hold" msgstr "× ×� להמתין" #: data/resources/ui/window.ui:266 msgid "Waiting for D-Bus Traffic…" msgstr "בהמתנה לתעבורת D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "למידע נוסף על כתובות, ניתן לר×�ות בכתובת {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "פתיחת חלון חדש" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "הועתק ללוח הגזירי×�" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "ל×� ניתן ליצור פקודת busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "ל×� הייתה ציפייה לתגובה" #: src/message.rs:209 msgid "No Auto Start" msgstr "×�ין התחלה ×�וטומטית" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "ל×�פשר ×�ימות ×�ינטר×�קטיבי" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "נגישות" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "בלוטות׳" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "מיקו×� ×’×�וגרפי" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "קלט" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "כניסה" #: src/message_tag.rs:133 msgid "Network" msgstr "רשת" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "בקרת מדיניות" #: src/message_tag.rs:135 msgid "Portals" msgstr "שערי×�" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "ספק חיפוש" #: src/message_tag.rs:137 msgid "Secrets" msgstr "סודות" #: src/message_tag.rs:138 msgid "Session" msgstr "הפעלה" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "מעטפת" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "עוקב" #: src/message_tag.rs:144 msgid "Power" msgstr "חשמל" #: src/message_tag.rs:145 msgid "Unknown" msgstr "ל×� ידוע" #: src/message_type.rs:34 msgid "Method Call" msgstr "קרי×�×” לשיטה" #: src/message_type.rs:35 msgid "Method Return" msgstr "החזרה משיטה" #: src/message_type.rs:36 msgid "Error" msgstr "שגי×�×”" #: src/message_type.rs:37 msgid "Signal" msgstr "×�ות" #: src/window.rs:135 msgid "Recording session bus…" msgstr "×�פיק ההפעלה מוקלט…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "הקלטת ×�פיק ההפעלה נכשלה" #: src/window.rs:147 msgid "Recording system bus…" msgstr "×�פיק המערכת מוקלט…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "הקלטת ×�פיק המערכת נכשלה" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "מתבצעת הקלטה של {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "הקלטת הכתובת נכשלה" #: src/window.rs:194 msgid "Failed to open file" msgstr "פתיחת הקובץ נכשלה" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "השמירה ×›Ö¾PCAP נכשלה" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "ההקלטה נשמרה ×›Ö¾PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "השמירה כתרשי×� DOT נכשלה" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "ההקלטה נשמרה כתרשי×� DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "ירון שהרבני " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "קובצי PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "פתיחת היומן" #: src/window.rs:542 msgid "Save Log" msgstr "שמירת היומן" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "שמירת היומן כקובץ תרשי×� DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "תועדה הודעה ×�חת" msgstr[1] "תועדו שתי הודעות" msgstr[2] "תועדו {n_messages} הודעות" msgstr[3] "תועדו {n_messages} הודעות" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "למידע נוסף על כתובות, ניתן לר×�ות במפרט של D-Bus." #~ msgid "Reset All" #~ msgstr "×�יפוס של הכול" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/hi.po000066400000000000000000000446541525300766700222700ustar00rootroot00000000000000# Hindi translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Scrambled777 , 2024. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2024-04-01 19:50+0000\n" "PO-Revision-Date: 2024-04-05 19:40+0530\n" "Last-Translator: Scrambled777 \n" "Language-Team: Hindi\n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 46.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:4 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "डी-बस गतिविधि को देखें" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:10 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "डिबग;पà¥�रोफाइल;डी-बस;डीबस;अनà¥�कà¥�रम;निगरानी;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "नई विंडो" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "विंडो चौड़ाई" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "विंडो ऊंचाई" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "विंडो अधिकतमीकृत सà¥�थिति" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle डी-बस गतिविधि के अनà¥�कà¥�रम आरेख बनाता है। यह पà¥�रतà¥�येक वà¥�यकà¥�तिगत घटना के लिà¤� समय " "मोहरों और पà¥�रतà¥�येक विधि कॉल की अवधि के साथ संकेत उतà¥�सरà¥�जन, विधि कॉल और उनके संबंधित " "विवरणियां दिखाता है। यह आपको अवांछित डी-बस टà¥�रैफ़िक की जाà¤�च करने में मदद कर सकता है, और " "यह पता लगा सकता है कि आपका डी-बस-आधारित अनà¥�पà¥�रयोग आपकी इचà¥�छानà¥�सार अचà¥�छा पà¥�रदरà¥�शन कà¥�यों " "नहीं कर रहा है। यह संकेत आवृतà¥�तियों और औसत विधि कॉल समय जैसे आà¤�कड़े भी पà¥�रदान करता है।" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "डी-बस गतिविधि के अनà¥�कà¥�रम आरेखों का अनà¥�वेषण करें" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "लॉग को सारांशित करने वाले आà¤�कड़े देखें" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "इस सà¥�खदायक गà¥�रेसà¥�केल सà¥�वागत पृषà¥�ठ के साथ आराम करें" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:134 src/window.rs:408 msgid "The Bustle developers" msgstr "Bustle विकासक" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "पता रिकॉरà¥�ड करें" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus specification." msgstr "" "पतों के बारे में अधिक जानकारी के लिà¤�, D-Bus विशिषà¥�टता देखें।" #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "रदà¥�द (_C)" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:91 #: data/resources/ui/window.ui:203 msgid "_Record" msgstr "रिकॉरà¥�ड (_R)" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "सरà¥�वर पता" #: data/resources/ui/details_view.ui:22 msgid "Associated Message" msgstr "संबदà¥�ध संदेश" #: data/resources/ui/details_view.ui:38 msgid "Message" msgstr "संदेश" #: data/resources/ui/details_view.ui:41 msgid "Type" msgstr "पà¥�रकार" #: data/resources/ui/details_view.ui:50 msgid "Path" msgstr "पथ" #: data/resources/ui/details_view.ui:59 msgid "Interface" msgstr "इंटरफ़ेस" #: data/resources/ui/details_view.ui:68 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "सदसà¥�य" #: data/resources/ui/details_view.ui:77 msgid "Error Type" msgstr "तà¥�रà¥�टि पà¥�रकार" #: data/resources/ui/details_view.ui:89 msgid "Details" msgstr "विवरण" #: data/resources/ui/details_view.ui:92 msgid "Sender" msgstr "पà¥�रेषक" #: data/resources/ui/details_view.ui:101 msgid "Destination" msgstr "गंतवà¥�य" #: data/resources/ui/details_view.ui:110 msgid "Component" msgstr "अवयव" #: data/resources/ui/details_view.ui:125 msgid "Body Size" msgstr "शारीरिक आकार" #: data/resources/ui/details_view.ui:135 msgid "Response Time" msgstr "पà¥�रतिकà¥�रिया समय" #: data/resources/ui/details_view.ui:145 msgid "Signature" msgstr "हसà¥�ताकà¥�षर" #: data/resources/ui/details_view.ui:154 msgid "Flags" msgstr "à¤�ंडे" #: data/resources/ui/details_view.ui:165 msgid "Body" msgstr "तन" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "विसà¥�तृत" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "अवधियां" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "पà¥�रतà¥�येक विधि कॉल में लिया गया कà¥�ल और औसत समय" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "विधि" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "कà¥�ल" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "कॉल" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "औसत" #: data/resources/ui/filter_pane.ui:51 msgid "Reset All" msgstr "सभी रीसेट करें" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "आवृतà¥�तियाà¤�" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "विधि कॉल और संकेतों की आवृतà¥�तियाà¤�" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "संदेश पà¥�रकार" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "आवृतà¥�ति" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "सामानà¥�य" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "शॉरà¥�टकट दिखाà¤�à¤�" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "New Window" msgstr "नई विंडो" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "छोड़ें" #: data/resources/ui/shortcuts.ui:34 msgctxt "shortcut window" msgid "Recording" msgstr "रिकॉरà¥�डिंग" #: data/resources/ui/shortcuts.ui:37 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "सतà¥�र बस रिकॉरà¥�ड करें" #: data/resources/ui/shortcuts.ui:43 msgctxt "shortcut window" msgid "Record System Bus" msgstr "पà¥�रणाली बस रिकॉरà¥�ड करें" #: data/resources/ui/shortcuts.ui:49 msgctxt "shortcut window" msgid "Record Address" msgstr "पता रिकॉरà¥�ड करें" #: data/resources/ui/shortcuts.ui:55 msgctxt "shortcut window" msgid "Open Log File" msgstr "लॉग फाइल खोलें" #: data/resources/ui/shortcuts.ui:63 msgctxt "shortcut window" msgid "Diagram" msgstr "आरेख" #: data/resources/ui/shortcuts.ui:66 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "PCAP फाइल के रूप में सहेजें" #: data/resources/ui/shortcuts.ui:72 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "DOT रेखाचितà¥�र फाइल के रूप में सहेजें" #: data/resources/ui/shortcuts.ui:78 msgctxt "shortcut window" msgid "Filter Services" msgstr "सेवाà¤�ं छानें" #: data/resources/ui/shortcuts.ui:84 msgctxt "shortcut window" msgid "Statistics" msgstr "आंकड़े" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "आकार" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "पà¥�रतà¥�येक संदेश का सबसे छोटा, औसत और सबसे बड़ा आकार" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "सबसे छोटा" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "सबसे बड़ा" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "आंकड़े" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "नई विंडो (_W)" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "खोलें (_O)" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "लॉग की जोड़ी खोलें" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "à¤�से सहेजें…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:558 msgid "DOT Graph" msgstr "DOT रेखाचितà¥�र" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "आंकड़े (_S)" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "कीबोरà¥�ड शॉरà¥�टकट (_K)" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Bustle के बारे में (_A)" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "सतà¥�र बस रिकॉरà¥�ड करें" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "पà¥�रणाली बस रिकॉरà¥�ड करें" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "पता रिकारà¥�ड करें…" #: data/resources/ui/window.ui:104 data/resources/ui/window.ui:235 msgid "Open Log File" msgstr "लॉग फाइल खोलें" #: data/resources/ui/window.ui:112 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:251 msgid "Main Menu" msgstr "मà¥�खà¥�य मेनू" #: data/resources/ui/window.ui:119 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bustle में आपका सà¥�वागत है" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:120 msgid "Start recording D-Bus activity, you can also run the command" msgstr "डी-बस गतिविधि रिकॉरà¥�ड करना पà¥�रारंभ करें, आप कमांड भी चला सकते हैं" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "कॉपी" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "लोड हो रहा है" #. This is a verb #: data/resources/ui/window.ui:219 msgid "_Stop" msgstr "रोकें (_S)" #: data/resources/ui/window.ui:241 msgid "Filter Services" msgstr "सेवाà¤�ं छानें" #: data/resources/ui/window.ui:257 msgid "Details View" msgstr "विवरण दृशà¥�य" #: data/resources/ui/window.ui:267 msgid "Please Hold" msgstr "कृपया पà¥�रतीकà¥�षा करें" #: data/resources/ui/window.ui:268 msgid "Waiting for D-Bus Traffic…" msgstr "डी-बस यातायात की पà¥�रतीकà¥�षा में…" #: src/message.rs:193 msgid "No Reply Expected" msgstr "कोई उतà¥�तर अपेकà¥�षित नहीं" #: src/message.rs:194 msgid "No Auto Start" msgstr "कोई सà¥�वतः पà¥�रारंभ नहीं" #: src/message.rs:196 msgid "Allow Interactive Authentication" msgstr "अंतरà¥�कà¥�रियातà¥�मक पà¥�रमाणीकरण की अनà¥�मति दें" #: src/message_tag.rs:110 msgid "Accessibility" msgstr "अभिगमà¥�यता" #: src/message_tag.rs:111 msgid "Bluetooth" msgstr "बà¥�लूटूथ" #: src/message_tag.rs:112 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:113 msgid "Geolocalization" msgstr "भू-सà¥�थानीकरण" #: src/message_tag.rs:114 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:115 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:116 msgid "Input" msgstr "इनपà¥�ट" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:118 msgid "Login" msgstr "लॉग इन" #: src/message_tag.rs:119 msgid "Network" msgstr "नेटवरà¥�क" #: src/message_tag.rs:120 msgid "Policy Control" msgstr "नीति नियंतà¥�रण" #: src/message_tag.rs:121 msgid "Portals" msgstr "पोरà¥�टल" #: src/message_tag.rs:122 msgid "Search Provider" msgstr "खोज पà¥�रदाता" #: src/message_tag.rs:123 msgid "Session" msgstr "सतà¥�र" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:125 msgid "Shell" msgstr "शैल" #: src/message_tag.rs:126 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:128 msgid "Tracker" msgstr "टà¥�रैकर" #: src/message_tag.rs:129 msgid "Power" msgstr "ऊरà¥�जा" #: src/message_tag.rs:130 msgid "Unknown" msgstr "अजà¥�ञात" #: src/message_type.rs:34 msgid "Method Call" msgstr "विधि कॉल" #: src/message_type.rs:35 msgid "Method Return" msgstr "विधि वापसी" #: src/message_type.rs:36 msgid "Error" msgstr "तà¥�रà¥�टि" #: src/message_type.rs:37 msgid "Signal" msgstr "संकेत" #: src/window.rs:131 msgid "Recording session bus…" msgstr "सतà¥�र बस रिकॉरà¥�ड कर रहा है…" #: src/window.rs:135 msgid "Failed to record session bus" msgstr "सतà¥�र बस रिकॉरà¥�ड करने में विफल" #: src/window.rs:141 msgid "Recording system bus…" msgstr "पà¥�रणाली बस रिकॉरà¥�ड कर रहा है…" #: src/window.rs:146 msgid "Failed to record system bus" msgstr "पà¥�रणाली बस रिकॉरà¥�ड करने में विफल" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:160 msgid "Recording {address}…" msgstr "रिकॉरà¥�डिंग {address}…" #: src/window.rs:169 msgid "Failed to record address" msgstr "पता रिकारà¥�ड करने में असफल" #: src/window.rs:186 msgid "Failed to open file" msgstr "फाइल खोलने में असफल" #: src/window.rs:198 msgid "Failed to save as PCAP" msgstr "PCAP के रूप में सहेजने में विफल" #: src/window.rs:201 msgid "Recording saved as PCAP" msgstr "रिकॉरà¥�डिंग PCAP के रूप में सहेजी गई" #: src/window.rs:212 msgid "Failed to save as DOT graph" msgstr "DOT रेखाचितà¥�र के रूप में सहेजने में विफल" #: src/window.rs:215 msgid "Recording saved as DOT graph" msgstr "रिकॉरà¥�डिंग को DOT रेखाचितà¥�र के रूप में सहेजा गया" #: src/window.rs:407 msgid "translator-credits" msgstr "Scrambled777 " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:497 src/window.rs:521 msgid "PCAP Files" msgstr "PCAP फाइलें" #: src/window.rs:504 msgid "Open Log" msgstr "लॉग खोलें" #: src/window.rs:528 msgid "Save Log" msgstr "लॉग सहेजें" #: src/window.rs:565 msgid "Save Log as DOT Graph File" msgstr "लॉग को DOT रेखाचितà¥�र फाइल के रूप में सहेजें" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:634 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} संदेश को लॉग किया गया" msgstr[1] "{n_messages} संदेशों को लॉग किया गया" #: src/window.rs:651 msgid "Copied to clipboard" msgstr "कà¥�लिपबोरà¥�ड पर कॉपी किया गया" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/hu.po000066400000000000000000000401411525300766700222670ustar00rootroot00000000000000# Hungarian translation for Bustle. # Copyright (C) 2024, 2025, 2026 Free Software Foundation, Inc. # This file is distributed under the same license as the bustle package. # # Balázs Úr , 2024, 2025, 2026. msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-01-04 20:14+0000\n" "PO-Revision-Date: 2026-02-17 09:59+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 25.08.1\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-busz tevékenység láthatóvá tétele" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "hibakeresés;profil;d-bus;d-busz;dbus;sorozat;szekvencia;megfigyelés;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Új ablak" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Ablak szélessége" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Ablak magassága" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Ablak teljes méretű állapota" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "A Bustle szekvenciadiagramokat rajzol a D-busz-tevékenységrÅ‘l. Megjeleníti a " "szignálok kibocsátását, a metódushívásokat és a hozzájuk tartozó " "visszatérési értékeket az egyes eseményekhez tartozó idÅ‘bélyegekkel és az " "egyes metódushívások idÅ‘tartamával. Ez segíthet a nem kívánt D-busz-forgalom " "ellenÅ‘rzésében, és pontosan megállapíthatja, hogy a D-busz-alapú alkalmazás " "miért nem teljesít olyan jól, ahogy szeretné. Olyan statisztikákat is " "szolgáltat, mint a szignálok gyakorisága és az átlagos metódushívási idÅ‘k." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "A D-busz-tevékenység szekvenciadiagramjainak felfedezése" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "A naplót összegzÅ‘ statisztikák megtekintése" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Lazítson ezzel a megnyugtató szürkeárnyalatos üdvözlÅ‘ oldallal" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "A Bustle fejlesztÅ‘i" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Cím rögzítése" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Mégse" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Rögzítés" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Kiszolgáló címe" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Hozzárendelt üzenet" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Másolás busctl-ként" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Üzenet" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Típus" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Útvonal" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Csatoló" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Tag" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Hiba típusa" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Részletek" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "KüldÅ‘" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Cél" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "ÖsszetevÅ‘" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Törzs mérete" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "VálaszidÅ‘" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Aláírás" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "JelzÅ‘k" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Törzs" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Formázási dokumentáció megnyitása" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Kinyitás" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "IdÅ‘tartamok" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Az egyes metódushívások teljes és átlagos idÅ‘tartama" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metódus" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Összesen" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Hívások" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Ã�tlag" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Összes címke kijelölése" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Összes címke kijelölésének megszüntetése" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Összes név kijelölése" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Összes név kijelölésének megszüntetése" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Műveletek" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Gyakoriságok" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "A metódushívások és szignálok gyakorisága" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Üzenet típusa" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Gyakoriság" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Ã�ltalános" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Gyorsbillentyűk megjelenítése" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Új ablak" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Ablak bezárása" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Kilépés" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Rögzítés" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Munkamenetbusz rögzítése" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Rendszerbusz rögzítése" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Cím rögzítése" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Naplófájl megnyitása" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Mentés PCAP-fájlként" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Mentés DOT-grafikonfájlként" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Szolgáltatások szűrése" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statisztikák" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Méretek" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Az egyes üzenetek legkisebb, átlagos és legnagyobb mérete" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Legkisebb" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Legnagyobb" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statisztikák" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Új _ablak" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Megnyitás" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Naplópárok megnyitása" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Mentés másként…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT-grafikon" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statisztikák" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Gyorsbillentyűk" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "A Bustle _névjegye" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Munkamenetbusz rögzítése" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Rendszerbusz rögzítése" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Cím rögzítése…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Naplófájl megnyitása" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "FÅ‘menü" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Üdvözli a Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "A D-busz-tevékenység rögzítésének megkezdése, a következÅ‘ parancsot is " "futtathatja" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Másolás" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Betöltés" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Leállítás" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Szolgáltatások szűrése" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Részletek nézet" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Tartsa nyomva" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Várakozás a D-busz-forgalomra…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "A címekkel kapcsolatos további információkért nézze meg a(z) {dbus_specificati" "on_url} oldalt." #: src/application.rs:37 msgid "Open a new window" msgstr "Új ablak megnyitása" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Vágólapra másolva" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Nem sikerült előállítani a busctl parancsot" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Nem várható válasz" #: src/message.rs:209 msgid "No Auto Start" msgstr "Nincs automatikus indítás" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Interaktív hitelesítés engedélyezése" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Akadálymentesítés" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalizáció" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Bemenet" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Bejelentkezés" #: src/message_tag.rs:133 msgid "Network" msgstr "Hálózat" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Irányelvek ellenÅ‘rzése" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portálok" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Keresési szolgáltató" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Titkok" #: src/message_tag.rs:138 msgid "Session" msgstr "Munkamenet" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Energiagazdálkodás" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ismeretlen" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metódushívás" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metódus-visszatérés" #: src/message_type.rs:36 msgid "Error" msgstr "Hiba" #: src/message_type.rs:37 msgid "Signal" msgstr "Szignál" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Munkamenetbusz rögzítése…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Nem sikerült rögzíteni a munkamenetbuszt" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Rendszerbusz rögzítése…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Nem sikerült rögzíteni a rendszerbuszt" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "A(z) {address} rögzítése…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Nem sikerült rögzíteni a címet" #: src/window.rs:194 msgid "Failed to open file" msgstr "Nem sikerült megnyitni a fájlt" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Nem sikerült elmenteni PCAP-ként" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Rögzítés elmentve PCAP-ként" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Nem sikerült elmenteni DOT-grafikonként" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Rögzítés elmentve DOT-grafikonként" #: src/window.rs:415 msgid "translator-credits" msgstr "Úr Balázs , 2024." #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP-fájlok" #: src/window.rs:517 msgid "Open Log" msgstr "Napló megnyitása" #: src/window.rs:542 msgid "Save Log" msgstr "Napló mentése" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Napló mentése DOT-grafikonfájlként" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} üzenet naplózva" msgstr[1] "{n_messages} üzenet naplózva" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/ia.po000066400000000000000000000343271525300766700222550ustar00rootroot00000000000000# Interlingua translation for bustle. # Copyright (C) 2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # FIRST AUTHOR , YEAR. # Emilio Sepúlveda , 2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-07-04 10:51+0000\n" "PO-Revision-Date: 2025-07-10 19:55-0400\n" "Last-Translator: Emilio Sepúlveda \n" "Language-Team: Interlingua \n" "Language: ia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-DL-Lang: ia\n" "X-DL-Module: bustle\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: Translating\n" "X-Generator: Gtranslator 48.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:4 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualisa le activitate de D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:10 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "depuration;profilo;d-bus;dbus;sequentia;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:20 msgid "New Window" msgstr "Nove fenestra" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Largor de fenestra" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Altor de fenestra" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Stato maximisate de fenestra" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:159 src/window.rs:416 msgid "The Bustle developers" msgstr "Le disveloppatores de Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Registrar adresse" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus " "specification." msgstr "" #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "_Cancellar" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Registrar" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Adresse de servitor" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Message associate" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copiar como busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Message" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Typo" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Percurso" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interfacie" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membro" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Typo de error" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detalios" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Inviator" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destination" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Componente" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Dimension de corpore" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Tempore de responsa" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signatura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Bandieras" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Corpore" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Aperir documentation de formato" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expander" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durationes" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Methodo" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Appellos" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Seliger tote le etiquettas" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Disseliger tote le etiquettas" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Seliger tote le nomines" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Disseliger tote le nomines" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Actiones" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequentias" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Le frequentias de signales e appellos de methodo" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Typo de message" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequentia" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Monstrar vias breve" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nove fenestra" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Clauder fenestra" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Quitar" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Registration" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Registrar bus de session" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Registrar bus de systema" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Registrar adresse" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Aperir file de registro" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Salvar como file PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Salvar como file de grapho DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrar servicios" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statisticas" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Dimensiones" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Le plus parve" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Le plus longe" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statisticas" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "_Nove fenestra" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Aperir" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Salvar como…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Grapho DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statisticas" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Vias breve de _claviero" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_A proposito de Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Benvenite a Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copiar" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Stoppar" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vista de detalios" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "" #: src/application.rs:37 msgid "Open a new window" msgstr "Aperir un nove fenestra" #: src/details_view.rs:265 src/window.rs:670 msgid "Copied to clipboard" msgstr "Copiate al area de transferentia" #: src/details_view.rs:269 src/details_view.rs:273 msgid "Could not generate busctl command" msgstr "" #: src/message.rs:208 msgid "No Reply Expected" msgstr "" #: src/message.rs:209 msgid "No Auto Start" msgstr "" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Accessibilitate" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "" #: src/message_tag.rs:128 msgid "GTK" msgstr "" #: src/message_tag.rs:129 msgid "GVFS" msgstr "" #: src/message_tag.rs:130 msgid "Input" msgstr "" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Initio de session" #: src/message_tag.rs:133 msgid "Network" msgstr "Rete" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "" #: src/message_tag.rs:135 msgid "Portals" msgstr "" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "" #: src/message_tag.rs:137 msgid "Secrets" msgstr "" #: src/message_tag.rs:138 msgid "Session" msgstr "Session" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "" #: src/message_tag.rs:141 msgid "systemd" msgstr "" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "" #: src/message_tag.rs:144 msgid "Power" msgstr "" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Incognite" #: src/message_type.rs:34 msgid "Method Call" msgstr "" #: src/message_type.rs:35 msgid "Method Return" msgstr "" #: src/message_type.rs:36 msgid "Error" msgstr "Error" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "" #: src/window.rs:147 msgid "Recording system bus…" msgstr "" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "" #: src/window.rs:178 msgid "Failed to record address" msgstr "" #: src/window.rs:194 msgid "Failed to open file" msgstr "" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "" #: src/window.rs:415 msgid "translator-credits" msgstr "Emilio Sepúlveda " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "" #: src/window.rs:517 msgid "Open Log" msgstr "" #: src/window.rs:542 msgid "Save Log" msgstr "" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:644 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "" msgstr[1] "" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/it.po000066400000000000000000000377731525300766700223100ustar00rootroot00000000000000# # <>, 2025-2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-04-05 09:41+0200\n" "Last-Translator: <>\n" "Language-Team: Abkhazian\n" "Language: ab\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.15.0\n" "X-Generator: Gtranslator 50.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualizzatore dell'attività di D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profilazione;d-bus;dbus;sequenza;sorveglia;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nuova finestra" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Larghezza della finestra" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Altezza della finestra" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Stato di massimizzazione della finestra" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle disegna i diagrammi di sequenza dell'attività di D-Bus. Mostra " "l'emissione dei segnali, le chiamate ai metodi e i loro valori restituiti, " "contrassegnando l'orario di ciascun evento individuale e la durata di ogni " "chiamata ad un metodo. Questo può aiutare a controllare se c'è traffico " "indesiderato, e capire perché la propria applicazione basata su D-Bus non ha " "le prestazioni desiderate. Fornisce inoltre alcune statistiche come le " "frequenze dei segnali e i tempi medi di chiamata dei metodi." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Esplorazione dei diagrammi di sequenza dell'attività di D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Statistiche che riassumono il registro" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Una pagina di benvenuto rilassante in scala di grigi" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Gli sviluppatori di Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Registra indirizzo" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "A_nnulla" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Registra" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Indirizzo del server" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Messaggio associato" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copia come busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Messaggio" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Tipo" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Percorso" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interfaccia" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membro" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Tipo di errore" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Dettagli" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Mittente" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destinatario" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Componente" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Dimensione del corpo" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Tempo di risposta" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Segnatura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Bandiere" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Corpo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Apri la documentazione del formato" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Espandi" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durate" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Il tempo totale e medio trascorso per ciascuna chiamata" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metodo" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Totale" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Chiamate" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Media" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Seleziona tutte le etichette" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Deseleziona tutte le etichette" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Seleziona tutti i nomi" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Deseleziona tutti i nomi" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Azioni" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequenze" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "La frequenza di ciascuna chiamata ai metodi e di ciascun segnale" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Tipo di messaggio" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequenza" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Generali" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra le scorciatoie" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nuova finestra" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Chiude la finestra" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Esce" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Registrazione" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Registra il bus della sessione" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Registra il bus di sistema" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Registra indirizzo" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Apre il file di registro" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagramma" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Salva come file PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Salva come file grafo DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtra servizi" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistiche" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Dimensioni" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "La dimensione minima, media e massima di ciascun messaggio" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Minima" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Massima" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistica" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nuova _finestra" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Apri" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Apri coppia di registri" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Salva come…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Grafo DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistiche" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Scorciatoie da _tastiera" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Informazioni su Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Registra bus della sessione" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Registra bus di sistema" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Registra indirizzo…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Apri file di registro" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menù principale" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Benvenuto su Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Avviare la registrazione dell'attività D-Bus, oppure eseguire il comando" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copia" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Caricamento" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Ferma" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtra servizi" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vista dettagli" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Attendere prego" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "In attesa di traffico D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Per ulteriori informazioni sugli indirizzi, consultare la " "{dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Apre una nuova finestra " #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Copiato negli appunti" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Impossibile generare il comando di busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Nessuna risposta attesa" #: src/message.rs:209 msgid "No Auto Start" msgstr "No avvio automatico" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Permetti autenticazione interattiva" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Accessibilità" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolocalizzazione" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Input" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Accesso" #: src/message_tag.rs:133 msgid "Network" msgstr "Rete" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Controllo policy" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portali" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Cerca fornitore" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Segreti" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessione" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Energia" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ignoto" #: src/message_type.rs:34 msgid "Method Call" msgstr "Chiamata di un metodo" #: src/message_type.rs:35 msgid "Method Return" msgstr "Uscita da un metodo" #: src/message_type.rs:36 msgid "Error" msgstr "Errore" #: src/message_type.rs:37 msgid "Signal" msgstr "Segnale" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Registrazione del bus della sessione in corso…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Registrazione del bus della sessione non riuscita" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Registrazione del bus di sistema in corso…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Registrazione del bus di sistema non riuscita" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "Registrazione di {address} in corso…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Registrazione dell'indirizzo non riuscita" #: src/window.rs:194 msgid "Failed to open file" msgstr "Apertura del file non riuscita" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Salvataggio come PCAP non riuscito" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Registrazione salvata come PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Salvataggio come grafo DOT non riuscito" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Registrazione salvata come grafo DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "Davide Ferracin " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "File PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Apri registro" #: src/window.rs:542 msgid "Save Log" msgstr "Salva registro" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Salva registro come file grafo DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} messaggio registrato" msgstr[1] "{n_messages} messaggi registrati" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Per ulteriori informazioni sugli indirizzi, consultare la specifica D-Bus." bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/ka.po000066400000000000000000000506561525300766700222620ustar00rootroot00000000000000# Georgian translation for bustle. # Copyright (C) 2025 bustle's authors # This file is distributed under the same license as the bustle package. # Ekaterine Papava , 2025 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-03-25 08:31+0100\n" "Last-Translator: Ekaterine Papava \n" "Language-Team: Georgian \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.9\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-Bus-ის áƒ�ქტივáƒ�ბის ვიზუáƒ�ლიზáƒ�ციáƒ�" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profile;d-bus;dbus;sequence;monitor;გáƒ�მáƒ�რთვáƒ�;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "áƒ�ხáƒ�ლი ფáƒ�ნჯáƒ�რáƒ�" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "ფáƒ�ნჯრის სიგáƒ�ნე" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "ფáƒ�ნჯრის სიმáƒ�ღლე" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "ფáƒ�ნჯრის სრულáƒ�დ გáƒ�შლილი მდგáƒ�მáƒ�რეáƒ�ბáƒ�" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle D-Bus-ის áƒ�ქტივáƒ�ბის დიáƒ�გრáƒ�მებს ხáƒ�ტáƒ�ვს. ის áƒ�ჩვენებს სიგნáƒ�ლის " "გáƒ�მáƒ�ცემებს, მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხებებს დáƒ� მáƒ�თ დáƒ�ბრუნებულ მáƒ�ნáƒ�ცემებს დრáƒ�ის " "შტáƒ�მპებით თითáƒ�ეული მáƒ�ვლენისთვის დáƒ� თითáƒ�ეული მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხების " "ხáƒ�ნგრძლივáƒ�ბáƒ�ს. ეს შეიძლებáƒ�, დáƒ�გეხმáƒ�რáƒ�თ áƒ�რáƒ�სáƒ�სურველი D-Bus-ის ტრáƒ�ფიკის " "áƒ�ღმáƒ�ჩენáƒ�ში დáƒ� გáƒ�ნსáƒ�ზღვრáƒ�თ ზუსტáƒ�დ, რáƒ�ტáƒ�მ áƒ�რ მუშáƒ�áƒ�ბს თქვენი D-Bus áƒ�პლიკáƒ�ციáƒ� " "ისე კáƒ�რგáƒ�დ, რáƒ�გáƒ�რც ეს გნებáƒ�ვთ. ის áƒ�სევე მáƒ�გáƒ�წვდით ისეთ სტáƒ�ტისტიკáƒ�ს, " "რáƒ�გáƒ�რიცáƒ�áƒ� სიგნáƒ�ლის სიხშირეები დáƒ� მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხებების სáƒ�შუáƒ�ლáƒ� დრáƒ�." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "დáƒ�áƒ�თვáƒ�ლიერეთ D-Bus-ის áƒ�ქტივáƒ�ბის მიმდევრáƒ�ბის დიáƒ�გრáƒ�მები" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "ჟურნáƒ�ლის შეჯáƒ�მების სტáƒ�ტისტიკის ნáƒ�ხვáƒ�" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "დáƒ�ისვენეთ áƒ�მ ნáƒ�ცრისფერი მისáƒ�ლმების გვერდით" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Bustle-ის პრáƒ�გრáƒ�მისტები" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "მისáƒ�მáƒ�რთის ჩáƒ�წერáƒ�" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "გáƒ�უ_ქმებáƒ�" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_ჩáƒ�წერáƒ�" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "სერვერის მისáƒ�მáƒ�რთი" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "áƒ�სáƒ�ცირებული შეტყáƒ�ბინებáƒ�" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "კáƒ�პირებáƒ� busctl_ის სáƒ�ხით" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "შეტყáƒ�ბინებáƒ�" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "ტიპი" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "ბილიკი" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "ინტერფეისი" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "წევრი" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "შეცდáƒ�მის ტიპი" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "დეტáƒ�ლები" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "გáƒ�მáƒ�მგზáƒ�ვნი" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "დáƒ�ნიშნულებáƒ�" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "კáƒ�მპáƒ�ნენტი" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "სხეულის ზáƒ�მáƒ�" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "პáƒ�სუხის დრáƒ�" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "ხელმáƒ�წერáƒ�" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "დრáƒ�შები" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "სხეული" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "ფáƒ�რმáƒ�ტის დáƒ�კუმენტáƒ�ციის გáƒ�ხსნáƒ�" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "áƒ�მáƒ�კეცვáƒ�" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "ხáƒ�ნგრძლივáƒ�ბები" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "სრული დáƒ� სáƒ�შუáƒ�ლáƒ� დრáƒ�, რáƒ�მელიც თითáƒ�ეული მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხებáƒ�ს დáƒ�სჭირდáƒ�" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "მეთáƒ�დი" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "სულ" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "გáƒ�მáƒ�ძáƒ�ხებები" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "მნიშვნელáƒ�ბáƒ�" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "ყველáƒ� ჭდის მáƒ�ნიშვნáƒ�" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "ყველáƒ� ჭდის მáƒ�ნიშვნის მáƒ�ხსნáƒ�" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "ყველáƒ� სáƒ�ხელის მáƒ�ნიშვნáƒ�" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "ყველáƒ� სáƒ�ხელის მáƒ�ნიშვნის მáƒ�ხსნáƒ�" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "ქმედებები" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "სიხშირეები" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხებებისáƒ� დáƒ� სიგნáƒ�ლების სიხშირე" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "შეტყáƒ�ბინების ტიპი" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "სიხშირე" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "ზáƒ�გáƒ�დი" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "მáƒ�ლსáƒ�ხმáƒ�ბების ჩვენებáƒ�" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "áƒ�ხáƒ�ლი ფáƒ�ნჯáƒ�რáƒ�" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "ფáƒ�ნჯრის დáƒ�ხურვáƒ�" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "გáƒ�სვლáƒ�" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "მიმდინáƒ�რეáƒ�ბს ჩáƒ�წერáƒ�" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "სესიის მáƒ�ტáƒ�რებლის ჩáƒ�წერáƒ�" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "სისტემური მáƒ�ტáƒ�რებლის ჩáƒ�წერáƒ�" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "მისáƒ�მáƒ�რთის ჩáƒ�წერáƒ�" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "ჟურნáƒ�ლის ფáƒ�ილის გáƒ�ხსნáƒ�" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "დიáƒ�გრáƒ�მáƒ�" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "შენáƒ�ხვáƒ� PCAP ფáƒ�ილში" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "შენáƒ�ხვáƒ� DOT გრáƒ�ფიკის ფáƒ�ილში" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "სერვისების ფილტრი" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "სტáƒ�ტისტიკáƒ�" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "ზáƒ�მები" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "ყველáƒ� შეტყáƒ�ბინების უმცირესი, სáƒ�შუáƒ�ლáƒ� დáƒ� უდიდესი ზáƒ�მáƒ�" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "ყველáƒ�ზე პáƒ�ტáƒ�რáƒ�" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "უდიდესი" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "სტáƒ�ტისტიკáƒ�" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "áƒ�ხáƒ�ლი ფáƒ�ნჯáƒ�რáƒ�" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_გáƒ�ხსნáƒ�" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "ჟურნáƒ�ლის წყვილის გáƒ�ხსნáƒ�" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "შენáƒ�ხვáƒ�, რáƒ�გáƒ�რც…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT გრáƒ�ფიკი" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_სტáƒ�ტისტიკáƒ�" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "კლáƒ�ვიáƒ�ტურის მáƒ�ლსáƒ�ხმáƒ�ბები" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Busle-ის შეს_áƒ�ხებ" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "სესიის მáƒ�ტáƒ�რებლის ჩáƒ�წერáƒ�" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "სისტემური მáƒ�ტáƒ�რებლის ჩáƒ�წერáƒ�" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "მისáƒ�მáƒ�რთის ჩáƒ�წერáƒ�…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "ჟურნáƒ�ლის ფáƒ�ილის გáƒ�ხსნáƒ�" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "მთáƒ�ვáƒ�რი მენიუ" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "მáƒ�გესáƒ�ლმებáƒ�თ Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "D-Bus-ის áƒ�ქტივáƒ�ბების ჩáƒ�წერáƒ�. ეს áƒ�სევე შეგიძლიáƒ�თ, გáƒ�áƒ�კეთáƒ�თ áƒ�მ ბრძáƒ�ნების " "გáƒ�შვებით" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "კáƒ�პირებáƒ�" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "იტვირთებáƒ�" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_გáƒ�ჩერებáƒ�" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "სერვისების ფილტრი" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "დეტáƒ�ლური ხედი" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "გáƒ�ჩერდით" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "D-Bus-ის ტრáƒ�ფიკის მáƒ�ლáƒ�დინი…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "მისáƒ�მáƒ�რთების შესáƒ�ხებ მეტი ინფáƒ�რმáƒ�ციáƒ� იხილეთ ბმულზე {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "áƒ�ხáƒ�ლი ფáƒ�ნჯრის გáƒ�ხსნáƒ�" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "დáƒ�კáƒ�პირდáƒ� გáƒ�ცვლის ბáƒ�ფერში" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "bustctl-ის ბრძáƒ�ნების გენერáƒ�ციáƒ� შეუძლებელიáƒ�" #: src/message.rs:208 msgid "No Reply Expected" msgstr "პáƒ�სუხს áƒ�რ ველáƒ�დებáƒ�დი" #: src/message.rs:209 msgid "No Auto Start" msgstr "áƒ�ვტáƒ�გáƒ�შვების გáƒ�რეშე" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "ინტერáƒ�ქტიული áƒ�ვთენტიკáƒ�ციის დáƒ�შვებáƒ�" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "წვდáƒ�მáƒ�დáƒ�ბáƒ�" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "ბლუთუზი" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flat pak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "გეáƒ�ლáƒ�კáƒ�ლიზáƒ�ციáƒ�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "შეყვáƒ�ნáƒ�" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "შესვლáƒ�" #: src/message_tag.rs:133 msgid "Network" msgstr "ქსელი" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "პáƒ�ლიტიკის კáƒ�ნტრáƒ�ლი" #: src/message_tag.rs:135 msgid "Portals" msgstr "პáƒ�რტáƒ�ლები" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "სáƒ�ძიებáƒ� სისტემáƒ�" #: src/message_tag.rs:137 msgid "Secrets" msgstr "სáƒ�იდუმლáƒ�ები" #: src/message_tag.rs:138 msgid "Session" msgstr "სესიáƒ�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "გáƒ�რსი" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "ტრეკერი" #: src/message_tag.rs:144 msgid "Power" msgstr "კვებáƒ�" #: src/message_tag.rs:145 msgid "Unknown" msgstr "უცნáƒ�ბი" #: src/message_type.rs:34 msgid "Method Call" msgstr "მეთáƒ�დის გáƒ�მáƒ�ძáƒ�ხებáƒ�" #: src/message_type.rs:35 msgid "Method Return" msgstr "მეთáƒ�დის დáƒ�ბრუნებáƒ�" #: src/message_type.rs:36 msgid "Error" msgstr "შეცდáƒ�მáƒ�" #: src/message_type.rs:37 msgid "Signal" msgstr "სიგნáƒ�ლი" #: src/window.rs:135 msgid "Recording session bus…" msgstr "სესიის სáƒ�ლტის ჩáƒ�წერáƒ�…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "სესიის სáƒ�ლტის ჩáƒ�წერáƒ� ჩáƒ�ვáƒ�რდáƒ�" #: src/window.rs:147 msgid "Recording system bus…" msgstr "სისტემის სáƒ�ლტის ჩáƒ�წერáƒ�…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "სისტემის სáƒ�ლტის ჩáƒ�წერáƒ� ჩáƒ�ვáƒ�რდáƒ�" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "{address}-ის ჩáƒ�წერáƒ�…" #: src/window.rs:178 msgid "Failed to record address" msgstr "მისáƒ�მáƒ�რთის ჩáƒ�წერáƒ� ჩáƒ�ვáƒ�რდáƒ�" #: src/window.rs:194 msgid "Failed to open file" msgstr "ფáƒ�ილის გáƒ�ხსნის შეცდáƒ�მáƒ�" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "PCAP-ში ჩáƒ�წერáƒ� ჩáƒ�ვáƒ�რდáƒ�" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "ჩáƒ�ნáƒ�წერი შენáƒ�ხულიáƒ� PCAP-ის სáƒ�ხით" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "DOT გრáƒ�ფიკის ფáƒ�ილში შენáƒ�ხვáƒ� ჩáƒ�ვáƒ�რდáƒ�" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "ჩáƒ�ნáƒ�წერი შენáƒ�ხულიáƒ� DOT გრáƒ�ფიკის სáƒ�ხით" #: src/window.rs:415 msgid "translator-credits" msgstr "თემური დáƒ�ღáƒ�ნáƒ�ძე" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP ფáƒ�ილები" #: src/window.rs:517 msgid "Open Log" msgstr "ჟურნáƒ�ლის გáƒ�ხსნáƒ�" #: src/window.rs:542 msgid "Save Log" msgstr "ჟურნáƒ�ლის შენáƒ�ხვáƒ�" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "ჟურნáƒ�ლის შენáƒ�ხვáƒ� DOT გრáƒ�ფიკის ფáƒ�ილის სáƒ�ხით" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "ჟურნáƒ�ლში ჩáƒ�წერილიáƒ� {n_messages} შეტყáƒ�ბინებáƒ�" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/kk.po000066400000000000000000000445621525300766700222730ustar00rootroot00000000000000# Kazakh translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Baurzhan Muftakhidinov , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-01-04 20:14+0000\n" "PO-Revision-Date: 2026-01-25 23:15+0500\n" "Last-Translator: Baurzhan Muftakhidinov \n" "Language-Team: Kazakh \n" "Language: kk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.8\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-Bus белÑ�енділігін визуализациÑ�лау" #. Translators: Search terms to find this application. Do NOT translate or #. localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "жөндеу;профильдеу;d-bus;dbus;кезектілік;монитор;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Жаңа терезе" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Терезе ені" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Терезе биіктігі" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Терезенің жазылған күйі" #. Translators: These are the application description paragraphs in the #. AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal " "emissions, method calls and their corresponding returns, with time stamps " "for each individual event and the duration of each method call. This can " "help you check for unwanted D-Bus traffic, and pinpoint why your D-Bus-" "based application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle D-Bus белÑ�енділігінің кезектілік диаграммаларын Ñ�алады. Ол " "Ñ�игналдардың таратылуын, әдіÑ�терді шақыруды және олардың Ñ�әйкеÑ� жауаптарын, " "әрбір оқиға үшін уақыт белгілерін және әрбір әдіÑ�ті шақыру ұзақтығын " "көрÑ�етеді. Бұл Ñ�ізге қажетÑ�із D-Bus трафигін текÑ�еруге және D-Bus " "негізіндегі қолданбаңыз неге Ñ�із қалағандай жұмыÑ� Ñ–Ñ�темейтінін анықтауға " "көмектеÑ�еді. Сондай-ақ ол Ñ�игнал жиіліктері мен әдіÑ�терді шақырудың орташа " "уақыты Ñ�иÑ�қты Ñ�татиÑ�тиканы Ò±Ñ�ынады." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "D-Bus белÑ�енділігінің кезектілік диаграммаларын зерттеу" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Журналды қорытындылайтын Ñ�татиÑ�тиканы көру" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "ОÑ�Ñ‹ тыныштандыратын Ñ�ұр реңкті Ñ�әлемдеÑ�у бетімен демалыңыз" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Bustle әзірлеушілері" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Ð�дреÑ�ті жазу" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_БаÑ� тарту" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Жазу" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Сервер адреÑ�Ñ–" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "БайланыÑ�ты хабарлама" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "busctl ретінде көшіру" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Хабарлама" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Түрі" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Жол" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "ИнтерфейÑ�" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Мүше" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Қате түрі" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Мәліметтер" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Жіберуші" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "МақÑ�аты" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Компонент" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Дене өлшемі" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Жауап беру уақыты" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Қолтаңба" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Жалаушалар" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Дене" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Пішім құжаттамаÑ�ын ашу" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Жайю" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Ұзақтықтар" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Әрбір әдіÑ�ті шақыруға кеткен жалпы және орташа уақыт" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "ӘдіÑ�" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Жалпы" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Шақырулар" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Орташа" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Барлық тегтерді таңдау" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Барлық тегтерден таңдауды алып таÑ�тау" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Барлық атауларды таңдау" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Барлық атаулардан таңдауды алып таÑ�тау" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Әрекеттер" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Жиіліктер" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "ӘдіÑ�терді шақыру және Ñ�игналдар жиілігі" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Хабарлама түрі" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Жиілік" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Жалпы" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Жарлықтарды көрÑ�ету" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Жаңа терезе" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Терезені жабу" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Шығу" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Жазу" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "СеанÑ� шинаÑ�ын жазу" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Жүйелік шинаны жазу" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Ð�дреÑ�ті жазу" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Журнал файлын ашу" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Диаграмма" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "PCAP файлы ретінде Ñ�ақтау" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "DOT граф файлы ретінде Ñ�ақтау" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "СервиÑ�терді Ñ�үзу" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Өлшемдер" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Әрбір хабарламаның ең кіші, орташа және ең үлкен өлшемі" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Ең кіші" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Ең үлкен" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Жаңа _терезе" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Ð�шу" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Журналдар жұбын ашу" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Қалайша Ñ�ақтау…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT графы" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_СтатиÑ�тика" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Пернетақта жарлықтары" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Bustle _туралы" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "СеанÑ� шинаÑ�ын жазу" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Жүйелік шинаны жазу" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Ð�дреÑ�ті жазу…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Журнал файлын ашу" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Ð�егізгі мәзір" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bustle қолданбаÑ�ына қош келдіңіз" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "D-Bus белÑ�енділігін жазуды баÑ�таңыз, Ñ�ондай-ақ команданы орындауға болады" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Көшіру" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Жүктелуде" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Тоқтату" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "СервиÑ�терді Ñ�үзу" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Мәліметтер көрініÑ�Ñ–" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Күте тұрыңыз" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "D-Bus трафигін күту…" #: src/address_dialog.rs:42 #, rust-format msgid "" "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Ð�дреÑ�тер туралы көбірек ақпарат алу үшін {dbus_specification_url} қараңыз." #: src/application.rs:37 msgid "Open a new window" msgstr "Жаңа терезені ашу" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Ð�лмаÑ�у буферіне көшірілді" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "busctl командаÑ�ын жаÑ�ау мүмкін емеÑ�" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Жауап күтілмейді" #: src/message.rs:209 msgid "No Auto Start" msgstr "Ð�втоматты Ñ–Ñ�ке қоÑ�ылуÑ�ыз" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Интерактивті аутентификациÑ�ға Ñ€Ò±Ò›Ñ�ат беру" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Ð�рнайы мүмкіндіктер" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "ГеолокациÑ�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "КіріÑ�" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Жүйеге кіру" #: src/message_tag.rs:133 msgid "Network" msgstr "Желі" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "СаÑ�Ñ�атты баÑ�қару" #: src/message_tag.rs:135 msgid "Portals" msgstr "Порталдар" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Іздеу провайдері" #: src/message_tag.rs:137 msgid "Secrets" msgstr "ҚұпиÑ�лар" #: src/message_tag.rs:138 msgid "Session" msgstr "СеÑ�Ñ�иÑ�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Қоршам" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Трекер" #: src/message_tag.rs:144 msgid "Power" msgstr "Қуат" #: src/message_tag.rs:145 msgid "Unknown" msgstr "БелгіÑ�із" #: src/message_type.rs:34 msgid "Method Call" msgstr "ӘдіÑ�ті шақыру" #: src/message_type.rs:35 msgid "Method Return" msgstr "ӘдіÑ�ті қайтару" #: src/message_type.rs:36 msgid "Error" msgstr "Қате" #: src/message_type.rs:37 msgid "Signal" msgstr "Сигнал" #: src/window.rs:135 msgid "Recording session bus…" msgstr "СеÑ�Ñ�иÑ�лық шинаны жазу…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "СеÑ�Ñ�иÑ�лық шинаны жазу Ñ�әтÑ�із аÑ�қталды" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Жүйелік шинаны жазу…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Жүйелік шинаны жазу Ñ�әтÑ�із аÑ�қталды" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "{address} жазу…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Ð�дреÑ�ті жазу Ñ�әтÑ�із аÑ�қталды" #: src/window.rs:194 msgid "Failed to open file" msgstr "Файлды ашу Ñ�әтÑ�із аÑ�қталды" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "PCAP ретінде Ñ�ақтау Ñ�әтÑ�із аÑ�қталды" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Жазба PCAP ретінде Ñ�ақталды" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "DOT графы ретінде Ñ�ақтау Ñ�әтÑ�із аÑ�қталды" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Жазба DOT графы ретінде Ñ�ақталды" #: src/window.rs:415 msgid "translator-credits" msgstr "Baurzhan Muftakhidinov " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP файлдары" #: src/window.rs:517 msgid "Open Log" msgstr "Журналды ашу" #: src/window.rs:542 msgid "Save Log" msgstr "Журналды Ñ�ақтау" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Журналды DOT граф файлы ретінде Ñ�ақтау" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} хабарлама жазылды" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/meson.build000066400000000000000000000000731525300766700234550ustar00rootroot00000000000000i18n.gettext(gettext_package, preset: 'glib') bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/nb.po000066400000000000000000000325161525300766700222610ustar00rootroot00000000000000# Norwegian BokmÃ¥l translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Kjartan Maraas , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-07-01 21:14+0000\n" "PO-Revision-Date: 2026-07-10 13:31+0200\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian BokmÃ¥l \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualiser aktivitet pÃ¥ D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "feilsøk;profiler;d-bus;dbus;sekvens;overvÃ¥king;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nytt vindu" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Vindubrette" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Vinduhøyde" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Utforsk sekvensdiagrammer med D-Bus aktivitet" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Bustle utviklerene" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "A_vbryt" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:199 msgid "_Record" msgstr "_Ta opp" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Tjeneradresse" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Assosiert melding" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Melding" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Type" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Sti" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Grensesnitt" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Medlem" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Feiltype" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detaljer" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Avsender" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "MÃ¥l" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponent" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Svartid" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signatur" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Flagg" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Kropp" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Utvid" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Varigheter" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metode" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Totalt" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Handlinger" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frekvenser" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Meldingstype" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frekvens" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Generelt" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Vis snarveier" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nytt vindu" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Lukk vindu" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Avslutt" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrer tjenester" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistikk" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Størrelser" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Minst" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Størst" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistikk" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nytt _vindu" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Ã…pne" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Lagre som …" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistikk" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Tastatursnarveier" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Om Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:232 msgid "Open Log File" msgstr "" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:167 #: data/resources/ui/window.ui:248 msgid "Main Menu" msgstr "Hovedmeny" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" #: data/resources/ui/window.ui:140 msgid "Copy" msgstr "Kopier" #: data/resources/ui/window.ui:174 msgid "Loading" msgstr "Laster" #. This is a verb #: data/resources/ui/window.ui:215 msgid "_Stop" msgstr "_Stopp" #: data/resources/ui/window.ui:238 msgid "Filter Services" msgstr "Filtrer tjenester" #: data/resources/ui/window.ui:254 msgid "Details View" msgstr "Detaljvisning" #: data/resources/ui/window.ui:265 msgid "Please Hold" msgstr "Vennligst vent" #: data/resources/ui/window.ui:266 msgid "Waiting for D-Bus Traffic…" msgstr "" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" #: src/application.rs:37 msgid "Open a new window" msgstr "Ã…pne et nytt vindu" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Kopiert til utklippstavlen" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "" #: src/message.rs:208 msgid "No Reply Expected" msgstr "" #: src/message.rs:209 msgid "No Auto Start" msgstr "" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Tilgjengelighet" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "" #: src/message_tag.rs:133 msgid "Network" msgstr "Nettverk" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "" #: src/message_tag.rs:135 msgid "Portals" msgstr "Poraler" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Hemmeligheter" #: src/message_tag.rs:138 msgid "Session" msgstr "Økt" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Skall" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "" #: src/message_tag.rs:144 msgid "Power" msgstr "" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ukjent" #: src/message_type.rs:34 msgid "Method Call" msgstr "" #: src/message_type.rs:35 msgid "Method Return" msgstr "" #: src/message_type.rs:36 msgid "Error" msgstr "Feil" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "" #: src/window.rs:147 msgid "Recording system bus…" msgstr "" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "" #: src/window.rs:178 msgid "Failed to record address" msgstr "" #: src/window.rs:194 msgid "Failed to open file" msgstr "" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "" #: src/window.rs:415 msgid "translator-credits" msgstr "" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "" #: src/window.rs:517 msgid "Open Log" msgstr "" #: src/window.rs:542 msgid "Save Log" msgstr "" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "" msgstr[1] "" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/nl.po000066400000000000000000000377141525300766700223000ustar00rootroot00000000000000# Dutch translation for bustle. # Copyright (C) 2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Cirilla , 2025. # Nathan Follens , 2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-07-27 14:45+0000\n" "PO-Revision-Date: 2025-08-21 17:39+0200\n" "Last-Translator: Nathan Follens \n" "Language-Team: GNOME-NL https://matrix.to/#/#nl:gnome.org\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-DL-Lang: nl\n" "X-DL-Module: bustle\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: Translating\n" "X-Generator: Poedit 3.6\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualiseer D-Bus-activiteit" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profile;d-bus;dbus;sequence;monitor;profiel;sequentie;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nieuw venster" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Vensterbreedte" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Vensterhoogte" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Venster in gemaximaliseerde staat" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle tekent sequentiediagrammen van D-Bus-activiteit. Het toont " "signaalemissies, methode-oproepen en hun overeenkomende returns, met " "tijdstempels voor elke aparte gebeurtenis en de duur van elke methode-" "oproep. Dit kan u helpen om ongewenst D-Bus-verkeer op te sporen, en na te " "gaan waarom uw toepassing gebaseerd op D-Bus niet zo vloeiend werkt als u " "zou willen. Het levert ook statistieken zoals signaalfrequenties en de " "gemiddelde duur van methode-oproepen." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Ontdek sequentiediagrammen van D-Bus-activiteit" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Bekijk samenvattende statistieken over het log" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Ontspan met deze kalmerende welkomstpagina in grijstinten" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:159 src/window.rs:416 msgid "The Bustle developers" msgstr "De ontwikkelaars van Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Adres opnemen" #: data/resources/ui/address_dialog.ui:5 msgid "" "For more information about addresses, see the D-Bus " "specification." msgstr "" "Bekijk de D-Bus-specificatie voor meer informatie " "over adressen." #: data/resources/ui/address_dialog.ui:10 msgid "_Cancel" msgstr "_Annuleren" #. This is a verb #: data/resources/ui/address_dialog.ui:11 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Opnemen" #: data/resources/ui/address_dialog.ui:20 msgid "Server Address" msgstr "Serveradres" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Bijbehorend bericht" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopiëren als busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Bericht" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Type" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Pad" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interface" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Lid" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Fouttype" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Details" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Afzender" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Bestemming" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Component" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Inhoudsgrootte" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Reactietijd" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Ondertekening" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Vlaggen" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Inhoud" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Formaatdocumentatie openen" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Uitvouwen" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Duur" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "De totale en gemiddelde duur voor elke methode-oproep" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Methode" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Totaal" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Oproepen" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Gemiddeld" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Alle tags selecteren" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Alle tags deselecteren" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Alle namen selecteren" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Alle namen deselecteren" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Acties" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequenties" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "De frequenties van methode-oproepen en signalen" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Berichttype" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequentie" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Algemeen" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Sneltoetsen tonen" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nieuw venster" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Venster sluiten" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Afsluiten" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Opnemen" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Sessiebus opnemen" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Systeembus opnemen" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Adres opnemen" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Logbestand openen" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Opslaan als PCAP-bestand" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Opslaan als DOT-grafiekbestand" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Diensten filteren" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistieken" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Groottes" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "De kleinste, gemiddelde en grootste groottes van elk bericht" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Kleinst" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Grootst" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistieken" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nieuw _venster" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Openen" # ? - Nathan #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Logboekpaar openen" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Opslaan als…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT-grafiek" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistieken" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Sneltoetsen" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Over Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Sessiebus opnemen" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Systeembus opnemen" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Adres opnemen…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Logbestand openen" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Hoofdmenu" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Welkom bij Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Begin met opnemen van D-Bus-activiteit, u kunt ook de opdracht uitvoeren" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopiëren" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Bezig met laden" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Stoppen" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Diensten filteren" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Detailoverzicht" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Even geduld" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Wachten op D-Bus-verkeer…" #: src/application.rs:37 msgid "Open a new window" msgstr "Een nieuw venster openen" #: src/details_view.rs:266 src/window.rs:670 msgid "Copied to clipboard" msgstr "Gekopieerd naar klembord" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Kon busctl-opdracht niet genereren" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Geen antwoord verwacht" # Misschien nog aan te passen - Nathan #: src/message.rs:209 msgid "No Auto Start" msgstr "Start niet automatisch" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Interactieve aanmelding toestaan" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Toegankelijkheid" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalisatie" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Invoer" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Gebruikersnaam" #: src/message_tag.rs:133 msgid "Network" msgstr "Netwerk" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Beleidscontrole" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portalen" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Zoekprovider" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Geheimen" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessie" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Energie" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Onbekend" #: src/message_type.rs:34 msgid "Method Call" msgstr "Methode-oproep" # ? - Nathan #: src/message_type.rs:35 msgid "Method Return" msgstr "Methode-return" #: src/message_type.rs:36 msgid "Error" msgstr "Fout" #: src/message_type.rs:37 msgid "Signal" msgstr "Signaal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Sessiebus wordt opgenomen…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Kon sessiebus niet opnemen" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Systeembus wordt opgenomen…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Kon systeembus niet opnemen" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "{address} wordt opgenomen…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Kon adres niet opnemen" #: src/window.rs:194 msgid "Failed to open file" msgstr "Kon bestand niet openen" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Kon niet opslaan als PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Opname opgeslagen als PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Kon niet opslaan als DOT-grafiek" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Opname opgeslagen als DOT-grafiek" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Cirilla \n" "Nathan Follens \n" "Meer info over GNOME-NL https://nl.gnome.org" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP-bestanden" #: src/window.rs:517 msgid "Open Log" msgstr "Logboek openen" #: src/window.rs:542 msgid "Save Log" msgstr "Log opslaan" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Log opslaan als DOT-grafiekbestand" #. Translators: Do NOT translate the contents between '{' and '}', this is a #. variable name. #: src/window.rs:644 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} bericht gelogd" msgstr[1] "{n_messages} berichten gelogd" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/pt.po000066400000000000000000000374521525300766700223110ustar00rootroot00000000000000# Portuguese translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # André Moreira , 2026. # Hugo Carvalho , 2020-2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-01-04 20:14+0000\n" "PO-Revision-Date: 2026-03-23 15:05+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.9\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualize a atividade do D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "depurar;perfil;d-bus;dbus;sequência;monitorizar;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nova janela" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Largura da janela" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Altura da janela" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Estado de janela maximizada" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "O Bustle desenha diagramas de sequência da atividade do D-Bus. Mostra " "emissões de sinais, chamadas de métodos e os seus respetivos retornos, com " "marcas temporais para cada evento individual e a duração de cada chamada de " "método. Isto pode ajudar a verificar tráfego indesejado no D-Bus e a " "identificar por que razão a sua aplicação baseada em D-Bus não está a ter o " "desempenho desejado. Também fornece estatísticas como frequências de sinais " "e tempos médios de chamadas de métodos." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Explore diagramas de sequência da atividade do D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Consulte estatísticas que resumem o registo" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Relaxe com esta suave página de boas-vindas em tons de cinzento" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Os programadores do Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Gravar endereço" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Cancelar" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Gravar" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Endereço do servidor" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Mensagem associada" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copiar como busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Mensagem" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Tipo" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Caminho" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interface" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membro" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Tipo de erro" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detalhes" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Remetente" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destino" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Componente" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Tamanho do corpo" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Tempo de resposta" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Assinatura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Flags" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Corpo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Abrir documentação do formato" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expandir" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durações" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "O tempo total e médio que cada chamada de método demorou" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Método" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Chamadas" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Média" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Selecionar todas as etiquetas" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Desmarcar todas as etiquetas" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Selecionar todos os nomes" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Desmarcar todos os nomes" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Ações" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequências" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "As frequências de chamadas de métodos e sinais" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Tipo de mensagem" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequência" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Geral" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostrar atalhos" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nova janela" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Fechar janela" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Sair" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Gravação" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Gravar barramento de sessão (Session Bus)" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Gravar barramento de sistema (System Bus)" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Gravar endereço" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Abrir ficheiro de registo" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagrama" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Guardar como ficheiro PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Guardar como ficheiro de grafo DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrar serviços" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Estatísticas" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Tamanhos" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "O tamanho menor, médio e maior de cada mensagem" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Menor" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Maior" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Estatísticas" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nova _janela" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Abrir" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Abrir par de registos" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Guardar como…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Grafo DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Estatísticas" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Atalhos de _teclado" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Sobre o Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Gravar Session Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Gravar System Bus" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Gravar endereço…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Abrir ficheiro de registo" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menu principal" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bem-vindo ao Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Comece a gravar a atividade do D-Bus; também pode executar o comando" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copiar" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "A carregar" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Parar" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrar serviços" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Vista de detalhes" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Aguarde, por favor" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "A aguardar tráfego do D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Para mais informações sobre endereços, consulte a {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Abrir uma nova janela" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Copiado para a área de transferência" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Não foi possível gerar o comando busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Nenhuma resposta esperada" #: src/message.rs:209 msgid "No Auto Start" msgstr "Sem início automático" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Permitir autenticação interativa" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Acessibilidade" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolocalização" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Entrada" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Início de sessão" #: src/message_tag.rs:133 msgid "Network" msgstr "Rede" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Controlo de políticas" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portais" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Fornecedor de pesquisa" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Segredos" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessão" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Energia" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Desconhecido" #: src/message_type.rs:34 msgid "Method Call" msgstr "Chamada de método" #: src/message_type.rs:35 msgid "Method Return" msgstr "Retorno de método" #: src/message_type.rs:36 msgid "Error" msgstr "Erro" #: src/message_type.rs:37 msgid "Signal" msgstr "Sinal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "A gravar barramento de sessão…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Falha ao gravar barramento de sessão" #: src/window.rs:147 msgid "Recording system bus…" msgstr "A gravar barramento de sistema…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Falha ao gravar barramento de sistema" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "A gravar {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Falha ao gravar endereço" #: src/window.rs:194 msgid "Failed to open file" msgstr "Falha ao abrir ficheiro" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Falha ao guardar como PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Gravação guardada como PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Falha ao guardar como grafo DOT" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Gravação guardada como grafo DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "" "André Moreira \n" "Hugo Carvalho " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Ficheiros PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Abrir registo" #: src/window.rs:542 msgid "Save Log" msgstr "Guardar registo" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Guardar registo como ficheiro de grafo DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} mensagem registada" msgstr[1] "{n_messages} mensagens registadas" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/pt_BR.po000066400000000000000000000405211525300766700226630ustar00rootroot00000000000000# Brazilian Portuguese translation for bustle. # Copyright (C) 2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Jhonata Fernandes , 2024. # Rafael Fontenelle , 2024-2025. # Ã�lvaro Burns <>, 2025. # Juliano de Souza Camargo , 2025-2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-01-04 20:14+0000\n" "PO-Revision-Date: 2026-01-06 10:53-0300\n" "Last-Translator: Juliano de Souza Camargo \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 49.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualize atividade do D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "depuração;perfil;d-bus;dbus;sequência;debug;profile;monitor;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nova janela" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Largura da janela" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Altura da janela" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Estado maximizado da janela" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle desenha diagramas de sequência da atividade do D-Bus. Ele mostra " "emissões de sinais, chamadas de métodos e seus retornos correspondentes, com " "carimbos de data/hora para cada evento individual e a duração de cada " "chamada de método. Isso pode ajudá-lo a verificar tráfego indesejado de D-" "Bus e identificar por que seu aplicativo baseado em D-Bus não está " "funcionando tão bem quanto você gostaria. Ele também fornece estatísticas " "como frequências de sinal e tempos médios de chamada de método." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Explore diagramas de sequência da atividade do D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Veja estatísticas resumindo o log" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Relaxe com esta página de boas-vindas relaxante em tons de cinza" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Os desenvolvedores do Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Gravar endereço" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Cancelar" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Gravar" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Endereço do servidor" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Mensagem associada" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Copiar como busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Mensagem" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Tipo" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Caminho" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Interface" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Membro" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Tipo de erro" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detalhes" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Remetente" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Destinatário" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Componente" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Tamanho do corpo" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Tempo de resposta" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Assinatura" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Sinalizadores" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Corpo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Abrir documentação de formatação" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expandir" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Durações" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "O tempo total e médio que cada chamada de método levou" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Método" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Chamadas" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Média" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Selecionar todas tags" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Desmarcar seleção de todas tags" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Selecionar todos nomes" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Desmarcar seleção de todos nomes" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Ações" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frequências" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "As frequências de sinais de chamadas de métodos" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Tipo de mensagem" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frequência" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Geral" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostrar atalhos" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nova janela" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Fecha a janela" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Sai" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Gravação" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Grava o barramento da sessão" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Grava o barramento do sistema" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Grava um endereço" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Abri um arquivo de log" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagrama" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Salva como arquivo PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Salva como arquivo de grafo DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtra serviços" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Estatísticas" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Tamanhos" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "O menor, médio e maior tamanho de cada mensagem" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Menor" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Maior" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Estatísticas" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nova _janela" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Abrir" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Abrir par de logs" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Salvar como…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "Grafo DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Estatísticas" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Atalhos de _teclado" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Sobre o Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Gravar barramento de sessão" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Gravar barramento de sistema" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Gravar endereço…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Abrir arquivo log" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Menu principal" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Boas vindas ao Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "" "Comece a gravar a atividade do D-Bus. Você também pode executar o comando" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Copiar" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Carregando" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Parar" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrar serviços" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Visão de detalhes" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Por favor, aguarde" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Aguardando pelo tráfego do D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Para mais informação sobre endereços, veja em {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Abrir uma nova janela" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Copiado para a área de transferências" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Não foi possível gerar comando busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Nenhuma resposta esperada" #: src/message.rs:209 msgid "No Auto Start" msgstr "Sem autoinicialização" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Permitir autenticação interativa" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Acessibilidade" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolocalização" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Entrada" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Login" #: src/message_tag.rs:133 msgid "Network" msgstr "Rede" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Controle de políticas" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portais" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Provedor de pesquisa" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Segredos" #: src/message_tag.rs:138 msgid "Session" msgstr "Sessão" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Energia" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Desconhecido" #: src/message_type.rs:34 msgid "Method Call" msgstr "Chamada de método" #: src/message_type.rs:35 msgid "Method Return" msgstr "Retorno de método" #: src/message_type.rs:36 msgid "Error" msgstr "Erro" #: src/message_type.rs:37 msgid "Signal" msgstr "Sinal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Gravando barramento de sessão…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Falha ao gravar barramento de sessão" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Gravando barramento de sistema…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Falha ao gravar barramento de sistema" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "Gravando {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Falha ao gravar endereço" #: src/window.rs:194 msgid "Failed to open file" msgstr "Falha ao abrir arquivo" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Falha ao salvar como PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Gravação salva como PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Falha ao salvar como grafo DOT" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Gravação salva como grafo DOT" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Rafael Fontenelle \n" "Jhonata Fernandes " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "Arquivos PCAP" #: src/window.rs:517 msgid "Open Log" msgstr "Abrir log" #: src/window.rs:542 msgid "Save Log" msgstr "Salvar log" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Salva o log como arquivo de grafo DOT" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Registrada {n_messages} mensagem" msgstr[1] "Registradas {n_messages} mensagens" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Para mais informações sobre endereços, veja a especificação do D-Bus." #~ msgid "Reset All" #~ msgstr "Redefinir tudo" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/ru.po000066400000000000000000000453161525300766700223120ustar00rootroot00000000000000# Russian translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Sergej A. , 2024. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-11-23 10:38+0000\n" "PO-Revision-Date: 2025-12-26 17:06+1000\n" "Last-Translator: Ser82-png \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "ВизуализациÑ� активноÑ�ти D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profile;d-bus;dbus;sequence;monitor;отладка;профиль;монитор;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Ð�овое окно" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Ширина окна" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Ð’Ñ‹Ñ�ота окна" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "СоÑ�тоÑ�ние развернутого окна" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle риÑ�ует диаграммы поÑ�ледовательноÑ�ти дейÑ�твий D-Bus. Ð�а них " "отображаютÑ�Ñ� меÑ�та поÑ�влениÑ� Ñ�игналов, вызовы методов и Ñ�оответÑ�твующие им " "результаты, Ñ� временными метками длÑ� каждого отдельного Ñ�обытиÑ� и " "длительноÑ�тью каждого вызова метода. Это может помочь выÑ�вить наличие " "нежелательного трафика по D-Bus и точно определить, почему ваше оÑ�нованное " "на D-Bus приложение работает не так хорошо, как вам хотелоÑ�ÑŒ бы. Приложение " "также предоÑ�тавлÑ�ет Ñ�татиÑ�тичеÑ�кие данные, такие как чаÑ�тота Ñ�игналов и " "Ñ�реднее времÑ� вызова метода." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Изучите диаграммы поÑ�ледовательноÑ�тей вызовов D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "ПроÑ�мотрите обобщённую Ñ�татиÑ�тику в журнале" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "" "РаÑ�Ñ�лабьтеÑ�ÑŒ во времÑ� показа Ñ�той уÑ�покаивающей приветÑ�твенной Ñ�ерой Ñ�траницы" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Разработчики Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "ЗапиÑ�ать адреÑ�" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_Отменить" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_ЗапиÑ�ать" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Ð�дреÑ� Ñ�ервера" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "СвÑ�занное Ñ�ообщение" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Копировать как busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Сообщение" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Тип" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Путь" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "ИнтерфейÑ�" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Член" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Тип ошибки" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "ПодробноÑ�ти" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Отправитель" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Ð�азначение" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Компонент" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Размер Ñ�одержимого" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "ВремÑ� отклика" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "ПодпиÑ�ÑŒ" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Флаги" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Содержимое" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "ДокументациÑ� в открытом формате" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Развернуть" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "ПродолжительноÑ�ть" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Общее и Ñ�реднее времÑ�, затраченное на каждый вызов метода" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Метод" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Общее" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Вызовы" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Среднее" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Выделить вÑ�е метки" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "СнÑ�ть выделение Ñ�о вÑ�ех меток" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Выделить вÑ�е названиÑ�" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "СнÑ�ть выделение Ñ�о вÑ�ех названий" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "ДейÑ�твиÑ�" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "ЧаÑ�тоты" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "ЧаÑ�тота методов вызовов и Ñ�игналов" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Тип Ñ�ообщениÑ�" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "ЧаÑ�тота" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Общее" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показать комбинации клавиш" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Ð�овое окно" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Закрыть окно" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Выход" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "ЗапиÑ�ÑŒ" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "ЗапиÑ�ать Ñ�еÑ�Ñ�ионную шину" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "ЗапиÑ�ать Ñ�иÑ�темную шину" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "ЗапиÑ�ать адреÑ�" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Открыть файл журнала" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Диаграмма" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Сохранить как файл PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Сохранить как файл опиÑ�аниÑ� графов DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Фильтровать Ñ�лужбы" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Размеры" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Ð�аименьший, Ñ�редний и наибольший размер каждого Ñ�ообщениÑ�" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Ð�аименьший" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Ð�аибольший" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Ð�овое _окно" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Открыть" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Открыть пару журналов" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Сохранить как…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "DOT Graph" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_СтатиÑ�тика" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Комбинации клавиш" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_О приложении" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "ЗапиÑ�ать Ñ�еÑ�Ñ�ионную шину" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "ЗапиÑ�ать Ñ�иÑ�темную шину" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "ЗапиÑ�ать адреÑ�…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Открыть файл журнала" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Главное меню" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Добро пожаловать в Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Ð�ачать запиÑ�ÑŒ активноÑ�ти D-Bus вы можете из командной Ñ�троки" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Копировать" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Загрузка" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_ОÑ�тановить" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Фильтровать Ñ�лужбы" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "ПроÑ�мотр деталей" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "ПожалуйÑ�та, подождите" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Ожидание обмена данными D-Bus…" #: src/address_dialog.rs:42 msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "" "ДлÑ� получениÑ� дополнительной информации об адреÑ�ах Ñ�мотрите " "{dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Открыть новое окно" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "Скопировано в буфер обмена" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ð�е удалоÑ�ÑŒ Ñ�генерировать команду busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Ответ не ожидаетÑ�Ñ�" #: src/message.rs:209 msgid "No Auto Start" msgstr "Без автозапуÑ�ка" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Разрешить интерактивную авторизацию" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Специальные возможноÑ�ти" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "ГеолокациÑ�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Ввод" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Вход" #: src/message_tag.rs:133 msgid "Network" msgstr "Сеть" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Управление политиками" #: src/message_tag.rs:135 msgid "Portals" msgstr "Порталы" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "ПоиÑ�ковый провайдер" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Ключи" #: src/message_tag.rs:138 msgid "Session" msgstr "СеÑ�Ñ�иÑ�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Питание" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ð�еизвеÑ�тно" #: src/message_type.rs:34 msgid "Method Call" msgstr "Вызов метода" #: src/message_type.rs:35 msgid "Method Return" msgstr "Возврат результата" #: src/message_type.rs:36 msgid "Error" msgstr "Ошибка" #: src/message_type.rs:37 msgid "Signal" msgstr "Сигнал" #: src/window.rs:135 msgid "Recording session bus…" msgstr "ЗапиÑ�ÑŒ Ñ�еÑ�Ñ�ионной шины…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Ð�е удалоÑ�ÑŒ запиÑ�ать Ñ�еÑ�Ñ�ионную шину" #: src/window.rs:147 msgid "Recording system bus…" msgstr "ЗапиÑ�ÑŒ Ñ�иÑ�темной шины…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Ð�е удалоÑ�ÑŒ запиÑ�ать Ñ�иÑ�темную шину" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "ЗапиÑ�ÑŒ {address}…" #: src/window.rs:179 msgid "Failed to record address" msgstr "Ð�е удалоÑ�ÑŒ запиÑ�ать адреÑ�" #: src/window.rs:195 msgid "Failed to open file" msgstr "Ð�е удалоÑ�ÑŒ открыть файл" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "Ð�е удалоÑ�ÑŒ Ñ�охранить как PCAP" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "ЗапиÑ�ÑŒ Ñ�охранена как PCAP" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "Ð�е удалоÑ�ÑŒ Ñ�охранить как файл опиÑ�аниÑ� графов DOT" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "ЗапиÑ�ÑŒ Ñ�охранена как файл опиÑ�аниÑ� графов DOT" #: src/window.rs:416 msgid "translator-credits" msgstr "Ser82-png " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "Файлы PCAP" #: src/window.rs:518 msgid "Open Log" msgstr "Открыть журнал" #: src/window.rs:543 msgid "Save Log" msgstr "Сохранить журнал" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "Сохранить журнал как файл опиÑ�аниÑ� графов DOT" #: src/window.rs:647 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Ð’ журнал запиÑ�ано {n_messages} Ñ�ообщение" msgstr[1] "Ð’ журнал запиÑ�ано {n_messages} Ñ�ообщениÑ�" msgstr[2] "Ð’ журнал запиÑ�ано {n_messages} Ñ�ообщений" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "ДлÑ� получениÑ� дополнительной информации об адреÑ�ах Ñ�мотрите Ñ�пецификацию D-Bus." #~ msgid "Reset All" #~ msgstr "СброÑ�ить вÑ�Ñ‘" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/sl.po000066400000000000000000000373131525300766700223000ustar00rootroot00000000000000# Slovenian translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # # Martin , 2024,2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-11-23 10:38+0000\n" "PO-Revision-Date: 2025-12-23 09:16+0100\n" "Last-Translator: Martin Srebotnjak \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n" "%100<=4 ? 2 : 3);\n" "X-Generator: Poedit 2.2.1\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Ponazoritev dejavnosti vodila D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;razhroÅ¡Ä�evanje;odpravljanje;napake;napak;profil;profiliranje;vodilo;d-" "bus;dbus; zaporedje; monitor;beleženje;spremljanje;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Novo okno" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Å irina okna" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "ViÅ¡ina okna" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Stanje razpetega glavnega okna" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle nariÅ¡e diagrame zaporedja dejavnosti D-Bus. Prikazuje emisije " "signalov, klice metod in njihove ustrezne donose, s Ä�asovnimi žigi za vsak " "posamezen dogodek in trajanjem vsakega klica metode. To vam lahko pomaga " "preveriti neželen promet D-Bus in ugotoviti, zakaj vaÅ¡ program, ki temelji " "na D-Busu, ne deluje tako dobro, kot želite. Zagotavlja tudi statistiÄ�ne " "podatke, kot so frekvence signalov in povpreÄ�ni Ä�as klicev." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "RaziÅ¡Ä�ite diagrame zaporedja dejavnosti D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Oglejte si statistiÄ�ne podatke, ki povzemajo zapisnik" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Sprostite se s to pomirjujoÄ�o pozdravno sivinsko stranjo" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Razvijalci programa Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Beleži naslov" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "Pre_kliÄ�i" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Posnemi" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Naslov strežnika" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Povezano sporoÄ�ilo" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopiraj kot busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "SporoÄ�ilo" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Vrsta" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Pot" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Vmesnik" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "ÄŒlan" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Vrsta napake" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Podrobnosti" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "PoÅ¡iljatelj" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Cilj" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponenta" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Velikost telesa" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Odzivni Ä�as" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Podpis" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Zastavice" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Telo" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Dokumentacija odprtega zapisa" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "RazÅ¡iri" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Trajanja" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Skupni in povpreÄ�ni Ä�as, ki ga je opravil vsak klic metode" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metoda" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Skupno" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Klici" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "PovpreÄ�na vrednost" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Izberi vse oznake" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "PrekliÄ�i izbor vseh oznak" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Izberi vsa imena" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "PrekliÄ�i izbor vseh imen" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Dejanja" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frekvence" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Frekvence klicev in signalov metod" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Vrsta sporoÄ�ila" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frekvenca" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "SploÅ¡no" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Pokaže tipkovne bližnjice‫" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Novo okno" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Zapre okno" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "KonÄ�aj" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Snemanje" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Snemaj vodilo seje" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Snemaj sistemsko vodilo" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Beleži naslov" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Odpri zapisniÅ¡ko datoteko" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Shrani kot datoteko PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Shrani kot datoteko grafikon DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtriraj storitve" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistika" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Velikosti" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "NajmanjÅ¡a, srednja in najveÄ�ja velikost vsakega sporoÄ�ila" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "najmanjÅ¡a" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "najveÄ�ja" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistika" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Novo _okno" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Odpri" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Odpri par zapisnikov" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Shrani kot …" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "Grafikon DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistika" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Tipkovne bližnjice" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_O programu Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Snemaj vodilo seje" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Snemaj sistemsko vodilo" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Snemaj naslov ..." #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Odpri zapisniÅ¡ko datoteko" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Glavni meni" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "DobrodoÅ¡li v Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "ZaÄ�nite snemati dejavnost D-Busa, lahko tudi zaženete ukaz" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopiraj" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Nalaganje" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Zaustavi" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtriraj storitve" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Podroben pogled" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "PoÄ�akajte trenutek" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "ÄŒakanje na promet D-Bus ..." #: src/address_dialog.rs:42 msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "Za veÄ� informacij o naslovih glejte {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Odpri novo okno" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "Kopirano na odložiÅ¡Ä�e" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ukaza busctl ni bilo mogoÄ�e ustvariti" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Odgovor ni priÄ�akovan" #: src/message.rs:209 msgid "No Auto Start" msgstr "Brez samodejnega zagona" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Dovoli interaktivno preverjanje pristnosti" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Dostopnost" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalizacija" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Vhod" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Prijava" #: src/message_tag.rs:133 msgid "Network" msgstr "Omrežje" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Nadzor pravilnika" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portali" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Ponudnik iskanja" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Skrivnosti" #: src/message_tag.rs:138 msgid "Session" msgstr "Seja" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Lupina" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Sledilnik" #: src/message_tag.rs:144 msgid "Power" msgstr "Napajanje" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Neznano" #: src/message_type.rs:34 msgid "Method Call" msgstr "Klic metode" #: src/message_type.rs:35 msgid "Method Return" msgstr "VraÄ�ilo metode" #: src/message_type.rs:36 msgid "Error" msgstr "Napaka" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Snemanje vodila seje ..." #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Snemanje vodila sejne ni uspelo" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Snemanje sistemskega vodila ..." #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Sistemskega vodila ni bilo mogoÄ�e posneti" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "Snemanje {address} ..." #: src/window.rs:179 msgid "Failed to record address" msgstr "Beleženje naslova ni uspelo" #: src/window.rs:195 msgid "Failed to open file" msgstr "Odpiranje datoteke ni uspelo" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "Ni bilo mogoÄ�e shraniti kot PCAP" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "Posnetek, shranjeno kot PCAP" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "Ni bilo mogoÄ�e shraniti kot grafikon DOT" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "Posnetek, shranjen kot grafikon DOT" #: src/window.rs:416 msgid "translator-credits" msgstr "Martin Srebotnjak " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "Datoteke PCAP" #: src/window.rs:518 msgid "Open Log" msgstr "Odpri zapisnik" #: src/window.rs:543 msgid "Save Log" msgstr "Shrani zapisnik" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "Shrani zapisnik kot datoteko DOT Graph" #: src/window.rs:647 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Zabeleženo {n_messages} sporoÄ�ilo" msgstr[1] "Zabeleženi {n_messages} sporoÄ�ili" msgstr[2] "Zabeležena {n_messages} sporoÄ�ila" msgstr[3] "Zabeleženih {n_messages} sporoÄ�il" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/sr.po000066400000000000000000000443361525300766700223110ustar00rootroot00000000000000# Serbian translation for bustle. # Copyright (C) 2026 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Марко КоÑ�тић , 2026. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2026-02-28 08:07+0000\n" "PO-Revision-Date: 2026-03-24 23:08+0100\n" "Last-Translator: Марко М. КоÑ�тић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 3.9\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Вревар" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Визуализујте активноÑ�Ñ‚ Д-Ñ�абирнице" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;profile;d-bus;dbus;sequence;monitor;дебаг;профил;д-буÑ�;д-" "Ñ�абирница;дбуÑ�;Ñ�еквенца;монитор;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Ð�ови прозор" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Ширина прозора" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "ВиÑ�ина прозора" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Стање увећаног прозора" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "Вревар иÑ�цртава дијаграме низа Д-Ñ�абирничке активноÑ�ти. Приказује емиÑ�ије Ñ�игнала, позиве метода и њихове одговарајуће повратне вредноÑ�ти, Ñ�а временÑ�ким ознакама за Ñ�ваки појединачни догађај и трајањем Ñ�ваког позива метода. Ово вам може помоћи да проверите нежељени Ñ�аобраћај на Д-Ñ�абирници и утврдите зашто ваша апликација заÑ�нована на Д-Ñ�абирници не ради онако добро како биÑ�те желели. Такође пружа Ñ�татиÑ�тику као што је учеÑ�талоÑ�Ñ‚ Ñ�игнала и проÑ�ечно време позива метода." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "ИÑ�тражите дијаграме низа активноÑ�ти Д-Ñ�абирнице" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Погледајте Ñ�татиÑ�тику која Ñ�ажима дневник" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "ОпуÑ�тите Ñ�е уз ову умирујућу Ñ�иву почетну Ñ�траницу" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:416 msgid "The Bustle developers" msgstr "Програмери Вревара" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Ð�дреÑ�а Ñ�нимања" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "От_кажи" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Сними" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Ð�дреÑ�а Ñ�ервера" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Придружена порука" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Умножи као „busctl“" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Порука" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Тип" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Путања" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Прочеље" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Члан" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Ð’Ñ€Ñ�та грешке" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Детаљи" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Пошиљалац" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Одредиште" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Компонента" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Величина тела" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Време одговора" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "ПотпиÑ�" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Ознаке" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Тело" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Документација отвореног формата" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Прошири" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Трајања" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Укупно и Ñ�редње време које је заузео Ñ�ваки позив метода" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Метода" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Укупно" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Позиви" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Средња вредноÑ�Ñ‚" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Изабери Ñ�ве ознаке" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Поништи избор Ñ�вих ознака" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Изабери Ñ�ве називе" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Поништи избор Ñ�вих назива" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Радње" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "УчеÑ�талоÑ�ти" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "УчеÑ�талоÑ�Ñ‚ позива метода и Ñ�игнала" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Ð’Ñ€Ñ�та обавештења" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Фреквенција" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Опште" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Прикажи пречице" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Ð�ови прозор" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Затвори прозор" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Изађи" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Снимање" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Сними Ñ�абирницу Ñ�еÑ�ије" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Сними Ñ�абирници Ñ�иÑ�тема" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Ð�дреÑ�а Ñ�нимања" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Отвори датотеку дневника" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Дијаграм" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Сачувај као PCAP датотеку" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Сачувај као DOT Graph датотеку" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Филтрирај уÑ�луге" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Величине" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Ð�ајмања, Ñ�редња и највећа величина Ñ�ваке поруке" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Ð�ајмања" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Ð�ајвећи" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Ð�ови _прозор" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Отвори" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Отвори пар дневника" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Сачувај као…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:569 msgid "DOT Graph" msgstr "DOT график" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_СтатиÑ�тика" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "Пречице _таÑ�татуре" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "О Врев_ару" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Сними Ñ�абирницу Ñ�еÑ�ије" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Сними Ñ�абирници Ñ�иÑ�тема" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Ð�дреÑ�а Ñ�нимања…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Отвори датотеку дневника" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Главни мени" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Добродошли у Вревара" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Започните Ñ�нимање D-Bus активноÑ�ти, такође можете покренути наредбу" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Копирај" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Учитавање" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_ЗауÑ�тави" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Филтрирај уÑ�луге" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Преглед појединоÑ�ти" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Сачекајте мало" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Чекање на Д-баÑ� Ñ�аобраћај…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "За више информација о адреÑ�ама, погледајте {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Отвори нови прозор" #: src/details_view.rs:266 src/window.rs:675 msgid "Copied to clipboard" msgstr "Копирано у привременој меморији" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ð�иÑ�ам могао да генеришем наредбу „busctl“" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Одговор није очекиван" #: src/message.rs:209 msgid "No Auto Start" msgstr "Без аутоматÑ�ког покретања" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Дозволи интерактивну потврду идентитета" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "ПриÑ�тупачноÑ�Ñ‚" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Блутут" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Флетпек" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Геолокализација" #: src/message_tag.rs:128 msgid "GTK" msgstr "ГТК" #: src/message_tag.rs:129 msgid "GVFS" msgstr "ГВФС" #: src/message_tag.rs:130 msgid "Input" msgstr "Поље уноÑ�а" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Пријава" #: src/message_tag.rs:133 msgid "Network" msgstr "Мрежа" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Контрола полиÑ�е" #: src/message_tag.rs:135 msgid "Portals" msgstr "Портали" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "ДоÑ�тављач претраге" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Тајне" #: src/message_tag.rs:138 msgid "Session" msgstr "СеÑ�ија" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Шкољка" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Пратилац" #: src/message_tag.rs:144 msgid "Power" msgstr "Ð�апајање" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ð�епознато" #: src/message_type.rs:34 msgid "Method Call" msgstr "Позив методе" #: src/message_type.rs:35 msgid "Method Return" msgstr "Повратак методе" #: src/message_type.rs:36 msgid "Error" msgstr "Грешка" #: src/message_type.rs:37 msgid "Signal" msgstr "Сигнал" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Снимање Ñ�абирнице Ñ�еÑ�ије…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Ð�иÑ�ам уÑ�пео да Ñ�нимим Ñ�абирницу Ñ�еÑ�ије" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Снимање Ñ�иÑ�темÑ�ке Ñ�абирнице…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Ð�иÑ�ам уÑ�пео да Ñ�нимим Ñ�иÑ�темÑ�ку Ñ�абирницу" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:168 #, rust-format msgid "Recording {address}…" msgstr "Снимање {address}…" #: src/window.rs:178 msgid "Failed to record address" msgstr "Ð�иÑ�ам уÑ�пео да Ñ�нимим адреÑ�у" #: src/window.rs:194 msgid "Failed to open file" msgstr "Ð�еуÑ�пело отварање датотеке" #: src/window.rs:206 msgid "Failed to save as PCAP" msgstr "Ð�иÑ�ам уÑ�пео да Ñ�ачувам као PCAP" #: src/window.rs:209 msgid "Recording saved as PCAP" msgstr "Снимак је Ñ�ачуван као PCAP" #: src/window.rs:220 msgid "Failed to save as DOT graph" msgstr "Ð�иÑ�ам уÑ�пео да Ñ�ачувам као DOT график" #: src/window.rs:223 msgid "Recording saved as DOT graph" msgstr "Снимак је Ñ�ачуван као DOT график" #: src/window.rs:415 msgid "translator-credits" msgstr "" "Марко КоÑ�тић \\nПревод на Ñ�рпÑ�ки језик https://" "гном.Ñ�рб" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:509 src/window.rs:534 msgid "PCAP Files" msgstr "PCAP датотеке" #: src/window.rs:517 msgid "Open Log" msgstr "Отвори дневник" #: src/window.rs:542 msgid "Save Log" msgstr "Сачувај дневник" #: src/window.rs:576 msgid "Save Log as DOT Graph File" msgstr "Сачувај дневник као DOT датотеку графика" #: src/window.rs:646 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Забележена је {n_messages} порука" msgstr[1] "Забележене Ñ�у {n_messages} поруке" msgstr[2] "Забележене Ñ�у {n_messages} порука" msgstr[3] "Забележена је {n_messages} порука" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/sv.po000066400000000000000000000375271525300766700223210ustar00rootroot00000000000000# Swedish translation for bustle. # Copyright © 2024-2025 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # Anders Jonsson , 2024, 2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-11-23 10:38+0000\n" "PO-Revision-Date: 2025-12-23 00:09+0100\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.8\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "Visualisera D-Bus-aktivitet" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;felsök;profil;d-bus;dbus;sekvens;övervakning;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Nytt fönster" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Fönsterbredd" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Fönsterhöjd" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Maximerat tillstÃ¥nd för fönster" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle ritar sekvensdiagram med D-Bus-aktivitet. Den visar " "signalutsändningar, metodanrop och deras motsvarande returer, med " "tidsstämplar för varje individuell händelse och varaktigheten för varje " "metodanrop. Detta kan hjälpa dig söka oönskad D-Bus-trafik, och peka ut " "varför ditt D-Bus-baserade program inte har sÃ¥ bra prestanda som du önskar. " "Det tillhandahÃ¥ller ocksÃ¥ statistik som signalfrekvenser och genomsnittlig " "metodanropstid." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Utforska sekvensdiagram med D-Bus-aktivitet" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Se statistik som sammanfattar loggen" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Slappna av med denna avkopplande grÃ¥tonade välkomstsida" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Bustles utvecklare" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Spela in adress" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "A_vbryt" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "S_pela in" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Serveradress" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Associerat meddelande" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Kopiera som busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "Meddelande" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Typ" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Sökväg" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Gränssnitt" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Medlem" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Feltyp" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Detaljer" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Avsändare" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "MÃ¥l" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Komponent" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Textstorlek" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Svarstid" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "Signatur" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Flaggor" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Text" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Öppna formatdokumentation" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Expandera" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Varaktigheter" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Den totala tiden och medeltiden som varje metodanrop tog" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Metod" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Total" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Anrop" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Medelvärde" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Markera alla taggar" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Avmarkera alla taggar" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Markera alla namn" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Avmarkera alla namn" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Ã…tgärder" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frekvenser" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Frekvenserna för metodanrop och signaler" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Meddelandetyp" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Frekvens" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Allmänt" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Visa kortkommandon" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Nytt fönster" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Stäng fönster" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Avsluta" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Inspelning" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Spela in sessionsbuss" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Spela in systembuss" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Spela in adress" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Öppna loggfil" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Spara som PCAP-fil" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Spara som DOT-graffil" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Filtrera tjänster" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "Statistik" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Storlekar" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Den minsta, genomsnittliga och största storleken för varje meddelande" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Minsta" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Största" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "Statistik" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Nytt _fönster" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "Ö_ppna" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Öppna par med loggar" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Spara som…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "DOT-graf" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "_Statistik" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Tangentbordsgenvägar" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Om Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Spela in sessionsbuss" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Spela in systembuss" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Spela in adress…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Öppna loggfil" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Huvudmeny" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Välkommen till Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Börja spela in D-Bus-aktivitet, du kan ocksÃ¥ köra kommandot" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopiera" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Läser in" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Stoppa" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Filtrera tjänster" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Detaljvy" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Vänta" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Väntar pÃ¥ D-Bus-trafik…" #: src/address_dialog.rs:42 msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "För mer information om adresser, se {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Öppna ett nytt fönster" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "Kopierat till urklipp" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Kunde inte generera busctl-kommando" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Inget svar väntades" #: src/message.rs:209 msgid "No Auto Start" msgstr "Ingen autostart" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "TillÃ¥t interaktiv autentisering" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "Hjälpmedel" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "Geolokalisering" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Inmatning" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Inloggning" #: src/message_tag.rs:133 msgid "Network" msgstr "Nätverk" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "Policykontroll" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portaler" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Sökleverantör" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Hemligheter" #: src/message_tag.rs:138 msgid "Session" msgstr "Session" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Skal" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Ström" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Okänd" #: src/message_type.rs:34 msgid "Method Call" msgstr "Metodanrop" #: src/message_type.rs:35 msgid "Method Return" msgstr "Metodretur" #: src/message_type.rs:36 msgid "Error" msgstr "Fel" #: src/message_type.rs:37 msgid "Signal" msgstr "Signal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Spelar in sessionsbuss…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Misslyckades med att spela in sessionsbuss" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Spelar in systembuss…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Misslyckades med att spela in systembuss" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 msgid "Recording {address}…" msgstr "Spelar in {address}…" #: src/window.rs:179 msgid "Failed to record address" msgstr "Misslyckades med att spela in adress" #: src/window.rs:195 msgid "Failed to open file" msgstr "Misslyckades med att öppna fil" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "Misslyckades med att spara som PCAP" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "Inspelning sparad som PCAP" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "Misslyckades med att spara som DOT-graf" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "Inspelning sparad som DOT-graf" #: src/window.rs:416 msgid "translator-credits" msgstr "" "Anders Jonsson \n" "\n" "Skicka synpunkter pÃ¥ översättningen till\n" "." #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "PCAP-filer" #: src/window.rs:518 msgid "Open Log" msgstr "Öppna logg" #: src/window.rs:543 msgid "Save Log" msgstr "Spara logg" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "Spara logg som DOT-graffil" #: src/window.rs:647 msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "Loggade {n_messages} meddelande" msgstr[1] "Loggade {n_messages} meddelanden" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "För mer information om adresser, se D-Bus-" #~ "specifikationen." #~ msgid "Reset All" #~ msgstr "Ã…terställ alla" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/tr.po000066400000000000000000000402211525300766700222770ustar00rootroot00000000000000# Turkish translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # # Sabri Ünal , 2024. # Emin Tufan Çetin , 2024. # Muhammet Kara , 2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-12-27 21:15+0000\n" "PO-Revision-Date: 2025-12-29 15:45+0300\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.8\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "D-Bus etkinliÄŸini görselleÅŸtir" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;profile;d-bus;dbus;sequence;monitor;hata " "ayıkla;sekans;dizi;monitör;izle;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Yeni Pencere" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Pencere geniÅŸliÄŸi" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "Pencere yüksekliÄŸi" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Pencerenin ekranı kaplama durumu" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle, D-Bus etkinliÄŸinin sıra diyagramlarını çizer. Sinyal yayımlarını, " "yöntem çaÄŸrılarını, karşı dönüşlerini her tekil etkinlik için zaman " "damgalarıyla ve her yöntem çaÄŸrısının süresiyle gösterir. Bu istenmedik D-" "Bus trafiÄŸini denetlemenize yardım eder ve D-Bus tabanlı uygulamanızın neden " "istediÄŸiniz gibi iÅŸlemediÄŸini vurgular. Ayrıca sinyal frekansları ve " "ortalama yöntem çaÄŸrı zamanları gibi istatistikleri saÄŸlar." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "D-Bus etkinliklerinin sıra diyagramlarını keÅŸfet" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "Günlüğü özetleyen istatistikleri gör" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "Rahatlatıcı gri tonlamalı hoÅŸ geldiniz sayfasıyla rahatlayın" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Bustle geliÅŸtiricileri" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "Kayıt Adresi" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "İ_ptal" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "_Kaydet" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Sunucu Adresi" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "İliÅŸkili İleti" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "busctl olarak kopyala" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "İleti" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Tür" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "Yol" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "Arayüz" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Üye" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Hata Türü" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Ayrıntılar" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Gönderici" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "Hedef" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "BileÅŸen" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Gövde Ölçüsü" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "Yanıt Süresi" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "İmza" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Bayraklar" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "Gövde" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "Biçim Belgelendirmesini Aç" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "GeniÅŸlet" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "Süre" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Her yöntem çaÄŸrısının toplam ve ortalama süreleri" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Yöntem" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Toplam" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "ÇaÄŸrılar" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Ortalama" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Tüm Etiketleri Seç" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "Tüm Etiketlerin Seçimini Kaldır" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Tüm Adları Seç" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "Tüm Adların Seçimini Kaldır" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Eylemler" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "Frekanslar" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "Yöntem çaÄŸrılarının ve sinyallerin frekansları" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "İleti Türü" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "Sıklık" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Genel" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Kısayolları göster" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Yeni Pencere" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Pencereyi Kapat" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Çık" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "Kayıt" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "Oturum Veri Yolunu Kaydet" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "Sistem Veri Yolunu Kaydet" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "Kayıt Adresi" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Günlük Dosyasını Aç" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Diyagram" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "PCAP Dosyası Olarak Kaydet" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "DOT Grafik Dosyası Olarak Kaydet" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Hizmetleri Süz" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "İstatistikler" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Boyutlar" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Her iletinin en küçük, ortalama ve en büyük boyutu" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "En Küçük" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "En Büyük" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "İstatistikler" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Yeni _Pencere" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Aç" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Günlük Çiftini Aç" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Farklı Kaydet…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "DOT GrafiÄŸi" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "İ_statistikler" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Klavye Kısayolları" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "Bustle _Hakkında" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "Oturum Veri Yolunu Kaydet" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "Sistem Veri Yolunu Kaydet" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "Kayıt Adresi…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Günlük Dosyasını Aç" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Ana Menü" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Bustleʼa HoÅŸ Geldiniz" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "D-Bus etkinliÄŸini kaydetmeye baÅŸla, ÅŸu komutu da çalıştırabilirsiniz" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Kopyala" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "Yükleniyor" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "_Durdur" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Hizmetleri Süz" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Ayrıntılar Görünümü" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Lütfen Bekleyin" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "D-Bus trafiÄŸini bekleniyor…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "Adresler hakkında daha çok bilgi için, bkz {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Yeni bir pencere aç" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "Panoya kopyalandı" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "busctl komutu oluÅŸturulamadı" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Yanıt Beklenmiyor" #: src/message.rs:209 msgid "No Auto Start" msgstr "KendiliÄŸinden BaÅŸlatma Yok" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "EtkileÅŸimli Kimlik DoÄŸrulamaya İzin Ver" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "EriÅŸilebilirlik" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "CoÄŸrafi Konumlandırma" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "Girdi" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "GiriÅŸ" #: src/message_tag.rs:133 msgid "Network" msgstr "AÄŸ" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "İlke Denetimi" #: src/message_tag.rs:135 msgid "Portals" msgstr "Portallar" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Arama SaÄŸlayıcı" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Gizler" #: src/message_tag.rs:138 msgid "Session" msgstr "Oturum" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Kabuk" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" # Dikkat: Uygulama adı! #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "Güç" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Bilinmiyor" #: src/message_type.rs:34 msgid "Method Call" msgstr "Yöntem ÇaÄŸrısı" #: src/message_type.rs:35 msgid "Method Return" msgstr "Yöntem Dönüşü" #: src/message_type.rs:36 msgid "Error" msgstr "Hata" #: src/message_type.rs:37 msgid "Signal" msgstr "Sinyal" #: src/window.rs:135 msgid "Recording session bus…" msgstr "Oturum veri yolu kaydediliyor…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Oturum veri yolu kaydedilemedi" #: src/window.rs:147 msgid "Recording system bus…" msgstr "Sistem veri yolu kaydediliyor…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Sistem veri yolu kaydedilemedi" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 #, rust-format msgid "Recording {address}…" msgstr "{address} kaydediliyor…" #: src/window.rs:179 msgid "Failed to record address" msgstr "Adres kaydedilemedi" #: src/window.rs:195 msgid "Failed to open file" msgstr "Dosya açılamadı" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "PCAP olarak kaydedilemedi" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "Kayıt, PCAP olarak kaydedildi" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "DOT grafiÄŸi olarak kaydedilemedi" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "Kayıt, DOT grafiÄŸi olarak kaydedildi" #: src/window.rs:416 msgid "translator-credits" msgstr "" "Sabri Ünal \n" "Emin Tufan Çetin " #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "PCAP Dosyaları" #: src/window.rs:518 msgid "Open Log" msgstr "Günlüğü Aç" #: src/window.rs:543 msgid "Save Log" msgstr "Günlüğü Kaydet" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "Günlüğü DOT Grafik Dosyası Olarak Kaydet" #: src/window.rs:647 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "{n_messages} ileti günlüklendi" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Adreslerle ilgili daha çok bilgi için D-Bus " #~ "belirtimine göz atın." #~ msgid "Reset All" #~ msgstr "Tümünü Sıfırla" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/uk.po000066400000000000000000000454661525300766700223110ustar00rootroot00000000000000# Ukrainian translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # # Yuri Chornoivan , 2024, 2025. msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-11-23 10:38+0000\n" "PO-Revision-Date: 2025-12-23 11:53+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 23.04.3\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "ВізуалізаціÑ� дій D-Bus" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "" "debug;profile;d-bus;dbus;sequence;monitor;діагноÑ�тика;профіль;ді-" "баÑ�;поÑ�лідовніÑ�ть;монітор;Ñ�поÑ�тереженнÑ�;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "Ð�ове вікно" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "Ширина вікна" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "ВиÑ�ота вікна" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "Стан розгорнутого вікна" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle малює діаграми поÑ�лідовноÑ�тей дій D-Bus. Програма показує міÑ�цÑ� " "виданнÑ� Ñ�игналів, виклики методів та відповідні результати з чаÑ�овими " "позначками длÑ� кожної окремої події та тривалоÑ�Ñ‚Ñ�ми длÑ� кожного виклику " "методу. Це допоможе вам Ñ�тежити за небажаним обміном даними D-Bus та " "визначати точні причини того, що ваша заÑ�нована на D-Bus програма поводить " "Ñ�ебе не так, Ñ�к ви Ñ�подівалиÑ�Ñ�. Також програма надає Ñ�татиÑ�тичні дані, " "зокрема чаÑ�тоти Ñ�игналів та Ñ�ередні тривалоÑ�ті викликів методів." #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "Вивчіть діаграми поÑ�лідовноÑ�тей викликів D-Bus" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "ПереглÑ�ньте резюме Ñ�татиÑ�тичних даних журналу" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "РозÑ�лабтеÑ�Ñ� під чаÑ� показу цієї заÑ�покійливої Ñ�ірої Ñ�торінки вітаннÑ�" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Розробники Bustle" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "ЗапиÑ�ати адреÑ�у" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "_СкаÑ�увати" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "З_апиÑ�ати" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "Ð�дреÑ�а Ñ�ервера" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "Пов'Ñ�зане повідомленнÑ�" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "Копіювати Ñ�к busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "ПовідомленнÑ�" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "Тип" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "ШлÑ�Ñ…" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "ІнтерфейÑ�" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "Член" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "Тип похибки" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "Подробиці" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "Відправник" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "ПризначеннÑ�" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "Компонент" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "Розмір вміÑ�ту" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "ТриваліÑ�ть відповіді" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "ПідпиÑ�" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "Прапорці" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "ВміÑ�Ñ‚" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "ДокументаціÑ� у відкритому форматі" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "Розгорнути" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "ТривалоÑ�ті" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "Загальний Ñ– Ñ�ередній чаÑ� виклику кожного методу" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "Метод" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "Загалом" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "Виклики" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "Середнє" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "Позначити уÑ�Ñ– мітки" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "ЗнÑ�ти позначеннÑ� з уÑ�Ñ–Ñ… міток" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "Позначити уÑ�Ñ– назви" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "ЗнÑ�ти позначеннÑ� з уÑ�Ñ–Ñ… назв" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "Дії" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "ЧаÑ�тоти" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "ЧаÑ�тоти викликів методу та Ñ�игналів" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "Тип повідомленнÑ�" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "ЧаÑ�тота" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Загальне" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показати клавіатурні Ñ�короченнÑ�" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "Відкрити нове вікно" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "Закрити вікно" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "Вийти з програми" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "ЗапиÑ�" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "ЗапиÑ�увати шину Ñ�еанÑ�у" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "ЗапиÑ�увати Ñ�иÑ�темну шину" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "ЗапиÑ�ати адреÑ�у" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "Відкрити файл журналу" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "Діаграма" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "Зберегти Ñ�к файл PCAP" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "Зберегти Ñ�к файл графу DOT" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "Фільтрувати Ñ�лужби" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "Розміри" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "Ð�айменший, Ñ�ередній Ñ– найбільший розмір кожного повідомленнÑ�" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "Ð�айменший" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "Ð�айбільший" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "СтатиÑ�тика" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "Створити _вікно" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "_Відкрити" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "Відкрити пару журналів" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "Зберегти Ñ�к…" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "граф DOT" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "С_татиÑ�тика" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "_Клавіатурні Ñ�короченнÑ�" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "_Про Bustle" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "ЗапиÑ�увати шину Ñ�еанÑ�у" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "ЗапиÑ�увати Ñ�иÑ�темну шину" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "ЗапиÑ�ати адреÑ�у…" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "Відкрити файл журналу" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "Головне меню" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "Вітаємо у Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "Почати запиÑ�увати обмін даними D-Bus; ви також можете віддати команду" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "Копіювати" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "ЗавантаженнÑ�" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "З_упинити" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "Фільтрувати Ñ�лужби" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "Докладний переглÑ�д" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "Будь лаÑ�ка, зачекайте" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "Очікуємо на обмін даними D-Bus…" #: src/address_dialog.rs:42 #, rust-format msgid "" "For more information about addresses, see the {dbus_specification_url}." msgstr "" "Щоб дізнатиÑ�Ñ� більше про адреÑ�и, ознайомтеÑ�Ñ� зі Ñ�торінкою" " {dbus_specification_url}." #: src/application.rs:37 msgid "Open a new window" msgstr "Відкрити нове вікно" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "Скопійовано до буфера обміну" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "Ð�е вдалоÑ�Ñ� Ñ�творити команду busctl" #: src/message.rs:208 msgid "No Reply Expected" msgstr "Відповіді не очікуєтьÑ�Ñ�" #: src/message.rs:209 msgid "No Auto Start" msgstr "Без автозапуÑ�ку" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "Дозволити інтерактивне розпізнаваннÑ�" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "ДоÑ�тупніÑ�ть" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "Bluetooth" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "ГеопозиціюваннÑ�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "ВведеннÑ�" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "Вхід" #: src/message_tag.rs:133 msgid "Network" msgstr "Мережа" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "КеруваннÑ� правилами" #: src/message_tag.rs:135 msgid "Portals" msgstr "Портали" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "Ð�адавач пошуку" #: src/message_tag.rs:137 msgid "Secrets" msgstr "Ключі" #: src/message_tag.rs:138 msgid "Session" msgstr "СеанÑ�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Оболонка" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "ЖивленнÑ�" #: src/message_tag.rs:145 msgid "Unknown" msgstr "Ð�евідомий" #: src/message_type.rs:34 msgid "Method Call" msgstr "Виклик методу" #: src/message_type.rs:35 msgid "Method Return" msgstr "Результат методу" #: src/message_type.rs:36 msgid "Error" msgstr "Помилка" #: src/message_type.rs:37 msgid "Signal" msgstr "Сигнал" #: src/window.rs:135 msgid "Recording session bus…" msgstr "ЗапиÑ�уємо канал Ñ�еанÑ�у…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "Ð�е вдалоÑ�Ñ� запиÑ�ати канал Ñ�еанÑ�у" #: src/window.rs:147 msgid "Recording system bus…" msgstr "ЗапиÑ�уємо канал Ñ�иÑ�теми…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "Ð�е вдалоÑ�Ñ� запиÑ�ати канал Ñ�иÑ�теми" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 #, rust-format msgid "Recording {address}…" msgstr "ЗапиÑ�уємо {address}…" #: src/window.rs:179 msgid "Failed to record address" msgstr "Ð�е вдалоÑ�Ñ� запиÑ�ати адреÑ�у" #: src/window.rs:195 msgid "Failed to open file" msgstr "Ð�е вдалоÑ�Ñ� відкрити файл" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "Ð�е вдалоÑ�Ñ� зберегти Ñ�к PCAP" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "ЗапиÑ� збережено Ñ�к PCAP" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "Ð�е вдалоÑ�Ñ� зберегти у форматі графа DOT" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "ЗапиÑ� збережено Ñ�к граф DOT" #: src/window.rs:416 msgid "translator-credits" msgstr "Юрій Чорноіван , 2024" #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "файли PCAP" #: src/window.rs:518 msgid "Open Log" msgstr "Відкрити журнал" #: src/window.rs:543 msgid "Save Log" msgstr "Зберегти журнал" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "Зберегти журнал Ñ�к файл графу DOT" #: src/window.rs:647 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "До журналу запиÑ�ано {n_messages} повідомленнÑ�" msgstr[1] "До журналу запиÑ�ано {n_messages} повідомленнÑ�" msgstr[2] "До журналу запиÑ�ано {n_messages} повідомлень" msgstr[3] "До журналу запиÑ�ано {n_messages} повідомленнÑ�" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "Щоб дізнатиÑ�Ñ� більше про адреÑ�и, ознайомтеÑ�Ñ� зі Ñ�пецифікацією D-Bus." #~ msgid "Reset All" #~ msgstr "Скинути вÑ�е" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/po/zh_CN.po000066400000000000000000000366711525300766700226710ustar00rootroot00000000000000# Chinese (China) translation for bustle. # Copyright (C) 2024 bustle's COPYRIGHT HOLDER # This file is distributed under the same license as the bustle package. # lumingzh , 2024-2025. # msgid "" msgstr "" "Project-Id-Version: bustle main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/bustle/issues\n" "POT-Creation-Date: 2025-11-23 10:38+0000\n" "PO-Revision-Date: 2025-12-23 08:14+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese (China) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 49.0\n" #: data/org.freedesktop.Bustle.desktop.in.in:2 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:9 msgid "Bustle" msgstr "Bustle" #: data/org.freedesktop.Bustle.desktop.in.in:3 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:10 msgid "Visualize D-Bus activity" msgstr "å�¯è§†åŒ– D-Bus 活动" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.freedesktop.Bustle.desktop.in.in:9 msgid "debug;profile;d-bus;dbus;sequence;monitor;" msgstr "debug;profile;d-bus;dbus;sequence;monitor;调试;é…�置文件;åº�列;监视器;" #: data/org.freedesktop.Bustle.desktop.in.in:19 msgid "New Window" msgstr "新建窗å�£" #: data/org.freedesktop.Bustle.gschema.xml.in:6 msgid "Window width" msgstr "窗å�£å®½åº¦" #: data/org.freedesktop.Bustle.gschema.xml.in:10 msgid "Window height" msgstr "窗å�£é«˜åº¦" #: data/org.freedesktop.Bustle.gschema.xml.in:14 msgid "Window maximized state" msgstr "窗å�£æœ€å¤§åŒ–状æ€�" #. Translators: These are the application description paragraphs in the AppData file. #: data/org.freedesktop.Bustle.metainfo.xml.in.in:13 msgid "" "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, " "method calls and their corresponding returns, with time stamps for each " "individual event and the duration of each method call. This can help you " "check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based " "application is not performing as well as you like. It also provides " "statistics like signal frequencies and average method call times." msgstr "" "Bustle 绘制 D-Bus 活动的åº�列图表。它显示了信å�·å�‘å°„ã€�方法调用和它们相应的返" "回,带有时间戳的æ¯�个独立事件和æ¯�个方法调用的时长。这å�¯ä»¥å¸®åŠ©æ‚¨æ£€æŸ¥ä¸�需è¦�çš„ D-" "Bus 交æµ�,以å�Šæ‚¨åŸºäºŽ D-Bus 的应用程åº�为什么未按照预期良好è¿�行的精确ä½�置。它也" "æ��供了诸如信å�·é¢‘率和平å�‡æ–¹æ³•调用时间等的统计信æ�¯ã€‚" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:26 msgid "Explore sequence diagrams of D-Bus activity" msgstr "探索 D-Bus 活动的åº�列图表" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:30 msgid "See statistics summarizing the log" msgstr "查看统计摘è¦�日志" #: data/org.freedesktop.Bustle.metainfo.xml.in.in:34 msgid "Relax with this soothing greyscale welcome page" msgstr "通过这个镇é�™çš„ç�°åº¦æ¬¢è¿Žé¡µé�¢æ”¾æ�¾" #. developer_name tag deprecated with Appstream 1.0 #: data/org.freedesktop.Bustle.metainfo.xml.in.in:168 src/window.rs:417 msgid "The Bustle developers" msgstr "Bustle å¼€å�‘者" #: data/resources/ui/address_dialog.ui:4 msgid "Record Address" msgstr "记录地å�€" #: data/resources/ui/address_dialog.ui:9 msgid "_Cancel" msgstr "å�–消(_C)" #. This is a verb #: data/resources/ui/address_dialog.ui:10 data/resources/ui/window.ui:90 #: data/resources/ui/window.ui:198 msgid "_Record" msgstr "记录(_R)" #: data/resources/ui/address_dialog.ui:19 msgid "Server Address" msgstr "æœ�务器地å�€" #: data/resources/ui/details_view.ui:19 msgid "Associated Message" msgstr "相关的消æ�¯" #: data/resources/ui/details_view.ui:30 msgid "Copy as busctl" msgstr "å¤�制为 busctl" #: data/resources/ui/details_view.ui:39 msgid "Message" msgstr "消æ�¯" #: data/resources/ui/details_view.ui:42 msgid "Type" msgstr "类型" #: data/resources/ui/details_view.ui:51 msgid "Path" msgstr "路径" #: data/resources/ui/details_view.ui:60 msgid "Interface" msgstr "接å�£" #: data/resources/ui/details_view.ui:69 #: data/resources/ui/frequencies_page.ui:44 data/resources/ui/sizes_page.ui:43 msgid "Member" msgstr "æˆ�员" #: data/resources/ui/details_view.ui:78 msgid "Error Type" msgstr "错误类型" #: data/resources/ui/details_view.ui:90 msgid "Details" msgstr "详情" #: data/resources/ui/details_view.ui:93 msgid "Sender" msgstr "å�‘é€�者" #: data/resources/ui/details_view.ui:102 msgid "Destination" msgstr "目标ä½�ç½®" #: data/resources/ui/details_view.ui:111 msgid "Component" msgstr "组件" #: data/resources/ui/details_view.ui:126 msgid "Body Size" msgstr "消æ�¯ä½“大å°�" #: data/resources/ui/details_view.ui:136 msgid "Response Time" msgstr "å“�应时间" #: data/resources/ui/details_view.ui:146 msgid "Signature" msgstr "特å¾�" #: data/resources/ui/details_view.ui:155 msgid "Flags" msgstr "标志" #: data/resources/ui/details_view.ui:166 msgid "Body" msgstr "消æ�¯ä½“" #: data/resources/ui/details_view.ui:169 msgid "Open Format Documentation" msgstr "打开格å¼�化文档" #: data/resources/ui/diagram_header.ui:20 msgid "Expand" msgstr "展开" #: data/resources/ui/durations_page.ui:11 data/resources/ui/statistics.ui:43 msgid "Durations" msgstr "æ—¶é•¿" #: data/resources/ui/durations_page.ui:12 msgid "The total and mean time every method call took" msgstr "æ¯�个方法调用花费的总计和平å�‡æ—¶é—´" #: data/resources/ui/durations_page.ui:16 msgid "Method" msgstr "方法" #: data/resources/ui/durations_page.ui:45 msgid "Total" msgstr "总计" #: data/resources/ui/durations_page.ui:76 msgid "Calls" msgstr "调用" #: data/resources/ui/durations_page.ui:110 data/resources/ui/sizes_page.ui:102 msgid "Mean" msgstr "å¹³å�‡" #: data/resources/ui/filter_pane.ui:6 msgid "Select All Tags" msgstr "选择所有标签" #: data/resources/ui/filter_pane.ui:10 msgid "Unselect All Tags" msgstr "å�–消全选标签" #: data/resources/ui/filter_pane.ui:16 msgid "Select All Names" msgstr "选择所有å��ç§°" #: data/resources/ui/filter_pane.ui:20 msgid "Unselect All Names" msgstr "å�–消全选å��ç§°" #: data/resources/ui/filter_pane.ui:73 msgid "Actions" msgstr "动作" #: data/resources/ui/frequencies_page.ui:11 data/resources/ui/statistics.ui:33 msgid "Frequencies" msgstr "频率" #: data/resources/ui/frequencies_page.ui:12 msgid "The frequencies of method calls and signals" msgstr "方法调用和信å�·çš„频率" #: data/resources/ui/frequencies_page.ui:16 data/resources/ui/sizes_page.ui:16 msgid "Message Type" msgstr "消æ�¯ç±»åž‹" #: data/resources/ui/frequencies_page.ui:72 msgid "Frequency" msgstr "频率" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "常规" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "显示快æ�·é”®" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "New Window" msgstr "新建窗å�£" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Close Window" msgstr "关闭窗å�£" #: data/resources/ui/shortcuts.ui:27 msgctxt "shortcut window" msgid "Quit" msgstr "退出" #: data/resources/ui/shortcuts.ui:35 msgctxt "shortcut window" msgid "Recording" msgstr "记录" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "Record Session Bus" msgstr "记录会è¯�总线" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Record System Bus" msgstr "记录系统总线" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Record Address" msgstr "记录地å�€" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Open Log File" msgstr "打开日志文件" #: data/resources/ui/shortcuts.ui:64 msgctxt "shortcut window" msgid "Diagram" msgstr "图表" #: data/resources/ui/shortcuts.ui:67 msgctxt "shortcut window" msgid "Save as PCAP File" msgstr "ä¿�存为 PCAP 文件" #: data/resources/ui/shortcuts.ui:73 msgctxt "shortcut window" msgid "Save as DOT Graph File" msgstr "ä¿�存为 DOT 图表文件" #: data/resources/ui/shortcuts.ui:79 msgctxt "shortcut window" msgid "Filter Services" msgstr "筛选器æœ�务" #: data/resources/ui/shortcuts.ui:85 msgctxt "shortcut window" msgid "Statistics" msgstr "统计" #: data/resources/ui/sizes_page.ui:11 data/resources/ui/statistics.ui:53 msgid "Sizes" msgstr "大å°�" #: data/resources/ui/sizes_page.ui:12 msgid "The smallest, mean and largest size of every message" msgstr "æ¯�æ�¡æ¶ˆæ�¯çš„æœ€å°�ã€�å¹³å�‡å’Œæœ€å¤§å¤§å°�" #: data/resources/ui/sizes_page.ui:72 msgid "Smallest" msgstr "最å°�" #: data/resources/ui/sizes_page.ui:132 msgid "Largest" msgstr "最大" #: data/resources/ui/statistics.ui:4 msgid "Statistics" msgstr "统计" #: data/resources/ui/window.ui:6 msgid "New _Window" msgstr "新建窗å�£(_W)" #: data/resources/ui/window.ui:10 msgid "_Open" msgstr "打开(_O)" #: data/resources/ui/window.ui:15 msgid "Open Pair of Logs" msgstr "打开相é…�的日志" #: data/resources/ui/window.ui:22 msgid "Save As…" msgstr "å�¦å­˜ä¸ºâ€¦" #: data/resources/ui/window.ui:25 msgid "PCAP" msgstr "PCAP" #. Translators: Dot is a type of file, do not translate. #: data/resources/ui/window.ui:29 src/window.rs:570 msgid "DOT Graph" msgstr "DOT 图表" #: data/resources/ui/window.ui:35 msgid "_Statistics" msgstr "统计(_S)" #: data/resources/ui/window.ui:42 msgid "_Keyboard Shortcuts" msgstr "键盘快æ�·é”®(_K)" #: data/resources/ui/window.ui:46 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "_About Bustle" msgstr "关于 Bustle(_A)" #. Bus as in D-Bus #: data/resources/ui/window.ui:54 msgid "Record Session Bus" msgstr "记录会è¯�总线" #. Bus as in D-Bus #: data/resources/ui/window.ui:58 msgid "Record System Bus" msgstr "记录系统总线" #. Bus as in D-Bus #: data/resources/ui/window.ui:62 msgid "Record Address…" msgstr "记录地å�€â€¦" #: data/resources/ui/window.ui:103 data/resources/ui/window.ui:231 msgid "Open Log File" msgstr "打开日志文件" #: data/resources/ui/window.ui:111 data/resources/ui/window.ui:166 #: data/resources/ui/window.ui:247 msgid "Main Menu" msgstr "主è�œå�•" #: data/resources/ui/window.ui:118 msgctxt "Translators: Do not translate Bustle, its the app's name" msgid "Welcome to Bustle" msgstr "欢迎使用 Bustle" #. Translators: Do not localize D-Bus. It is a proper name #: data/resources/ui/window.ui:119 msgid "Start recording D-Bus activity, you can also run the command" msgstr "开始记录 D-Bus 活动,您也å�¯ä»¥è¿�行命令" #: data/resources/ui/window.ui:139 msgid "Copy" msgstr "å¤�制" #: data/resources/ui/window.ui:173 msgid "Loading" msgstr "正在加载" #. This is a verb #: data/resources/ui/window.ui:214 msgid "_Stop" msgstr "å�œæ­¢(_S)" #: data/resources/ui/window.ui:237 msgid "Filter Services" msgstr "筛选器æœ�务" #: data/resources/ui/window.ui:253 msgid "Details View" msgstr "详情视图" #: data/resources/ui/window.ui:264 msgid "Please Hold" msgstr "请ç¨�候" #: data/resources/ui/window.ui:265 msgid "Waiting for D-Bus Traffic…" msgstr "正在等待 D-Bus 交æµ�…" #: src/address_dialog.rs:42 #, rust-format msgid "For more information about addresses, see the {dbus_specification_url}." msgstr "è¦�获å�–更多关于地å�€çš„ä¿¡æ�¯ï¼Œè¯·å�‚阅 {dbus_specification_url}。" #: src/application.rs:37 msgid "Open a new window" msgstr "打开新窗å�£" #: src/details_view.rs:266 src/window.rs:676 msgid "Copied to clipboard" msgstr "å·²å¤�制到剪贴æ�¿" #: src/details_view.rs:270 src/details_view.rs:274 msgid "Could not generate busctl command" msgstr "无法生æˆ� busctl 命令" #: src/message.rs:208 msgid "No Reply Expected" msgstr "无预期回å¤�" #: src/message.rs:209 msgid "No Auto Start" msgstr "无自动å�¯åЍ" #: src/message.rs:211 msgid "Allow Interactive Authentication" msgstr "å…�许交互å¼�认è¯�" #: src/message_tag.rs:124 msgid "Accessibility" msgstr "æ— éšœç¢�" #: src/message_tag.rs:125 msgid "Bluetooth" msgstr "è“�牙" #: src/message_tag.rs:126 msgid "Flatpak" msgstr "Flatpak" #: src/message_tag.rs:127 msgid "Geolocalization" msgstr "地ç�†å®šä½�" #: src/message_tag.rs:128 msgid "GTK" msgstr "GTK" #: src/message_tag.rs:129 msgid "GVFS" msgstr "GVFS" #: src/message_tag.rs:130 msgid "Input" msgstr "输入" #. TRANSLATORS Noun, as in user login #: src/message_tag.rs:132 msgid "Login" msgstr "登录" #: src/message_tag.rs:133 msgid "Network" msgstr "网络" #: src/message_tag.rs:134 msgid "Policy Control" msgstr "策略控制" #: src/message_tag.rs:135 msgid "Portals" msgstr "门户" #: src/message_tag.rs:136 msgid "Search Provider" msgstr "æ�œç´¢æ��供者" #: src/message_tag.rs:137 msgid "Secrets" msgstr "ä¿�密" #: src/message_tag.rs:138 msgid "Session" msgstr "会è¯�" #. TRANSLATORS As in the GNOME Shell #: src/message_tag.rs:140 msgid "Shell" msgstr "Shell" #: src/message_tag.rs:141 msgid "systemd" msgstr "systemd" #. TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ #: src/message_tag.rs:143 msgid "Tracker" msgstr "Tracker" #: src/message_tag.rs:144 msgid "Power" msgstr "电æº�" #: src/message_tag.rs:145 msgid "Unknown" msgstr "未知" #: src/message_type.rs:34 msgid "Method Call" msgstr "方法调用" #: src/message_type.rs:35 msgid "Method Return" msgstr "方法返回" #: src/message_type.rs:36 msgid "Error" msgstr "错误" #: src/message_type.rs:37 msgid "Signal" msgstr "ä¿¡å�·" #: src/window.rs:135 msgid "Recording session bus…" msgstr "正在记录会è¯�总线…" #: src/window.rs:140 msgid "Failed to record session bus" msgstr "记录会è¯�总线失败" #: src/window.rs:147 msgid "Recording system bus…" msgstr "正在记录系统总线…" #: src/window.rs:152 msgid "Failed to record system bus" msgstr "记录系统总线失败" #. Translators: Do NOT translate the contents between '{' and '}', this #. is a variable name. #: src/window.rs:169 #, rust-format msgid "Recording {address}…" msgstr "正在记录 {address}…" #: src/window.rs:179 msgid "Failed to record address" msgstr "记录地å�€å¤±è´¥" #: src/window.rs:195 msgid "Failed to open file" msgstr "打开文件失败" #: src/window.rs:207 msgid "Failed to save as PCAP" msgstr "ä¿�存为 PCAP 失败" #: src/window.rs:210 msgid "Recording saved as PCAP" msgstr "记录已ä¿�存为 PCAP" #: src/window.rs:221 msgid "Failed to save as DOT graph" msgstr "ä¿�存为 DOT 图表失败" #: src/window.rs:224 msgid "Recording saved as DOT graph" msgstr "记录已ä¿�存为 DOT 图表" #: src/window.rs:416 msgid "translator-credits" msgstr "lumingzh , 2024-2025." #. Translators: PCAP is a type of file, do not translate. #: src/window.rs:510 src/window.rs:535 msgid "PCAP Files" msgstr "PCAP 文件" #: src/window.rs:518 msgid "Open Log" msgstr "打开日志" #: src/window.rs:543 msgid "Save Log" msgstr "ä¿�存日志" #: src/window.rs:577 msgid "Save Log as DOT Graph File" msgstr "将日志ä¿�存为 DOT 图表文件" #: src/window.rs:647 #, rust-format msgid "Logged {n_messages} message" msgid_plural "Logged {n_messages} messages" msgstr[0] "已记录 {n_messages} æ�¡æ¶ˆæ�¯" #~ msgid "" #~ "For more information about addresses, see the D-Bus " #~ "specification." #~ msgstr "" #~ "获å�–关于地å�€çš„æ›´å¤šä¿¡æ�¯ï¼Œè¯·å�‚阅 D-Bus 规范。" #~ msgid "Reset All" #~ msgstr "全部é‡�ç½®" bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/rustfmt.toml000066400000000000000000000003121525300766700232720ustar00rootroot00000000000000imports_granularity = "Crate" format_code_in_doc_comments = true group_imports = "StdExternalCrate" newline_style = "Unix" normalize_comments = true normalize_doc_attributes = true wrap_comments = true bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/000077500000000000000000000000001525300766700214645ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/address_dialog.rs000066400000000000000000000053551525300766700250060ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use formatx::formatx; use gettextrs::gettext; use gtk::glib; pub struct Cancelled; mod imp { use super::*; #[derive(Default, gtk::CompositeTemplate)] #[template(resource = "/org/freedesktop/Bustle/ui/address_dialog.ui")] pub struct AddressDialog { #[template_child] pub(super) entry_row: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for AddressDialog { const NAME: &'static str = "BustleAddressDialog"; type Type = super::AddressDialog; type ParentType = adw::AlertDialog; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for AddressDialog { fn constructed(&self) { const URL: &str = r#"D-Bus specification"#; self.parent_constructed(); self.obj().set_body( &formatx!( gettext( "For more information about addresses, see the {dbus_specification_url}." ), dbus_specification_url = URL, ) .expect("Wrong format in translatable string"), ); self.obj().update_record_response_enabled(); self.entry_row.grab_focus(); } } impl WidgetImpl for AddressDialog {} impl AdwDialogImpl for AddressDialog {} impl AdwAlertDialogImpl for AddressDialog {} } glib::wrapper! { pub struct AddressDialog(ObjectSubclass) @extends gtk::Widget, adw::Dialog, adw::AlertDialog, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } #[gtk::template_callbacks] impl AddressDialog { pub async fn choose(parent: &impl IsA) -> Result { let this = glib::Object::new::(); let entry_row = this.imp().entry_row.get(); match this.choose_future(Some(parent)).await.as_str() { "cancel" => Err(Cancelled), "record" => Ok(entry_row .text() .parse() .expect("address must have been validated")), response_id => unreachable!("unexpected response id `{}`", response_id), } } #[template_callback] fn update_record_response_enabled(&self) { self.set_response_enabled( "record", self.imp().entry_row.text().parse::().is_ok(), ); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/application.rs000066400000000000000000000130341525300766700243360ustar00rootroot00000000000000use adw::subclass::prelude::*; use gettextrs::gettext; use gtk::{ gio, glib::{self, clone}, prelude::*, }; use crate::{ config::{APP_ID, PKGDATADIR, PROFILE, VERSION}, window::Window, }; mod imp { use super::*; #[derive(Debug, Default)] pub struct Application; #[glib::object_subclass] impl ObjectSubclass for Application { const NAME: &'static str = "BustleApplication"; type Type = super::Application; type ParentType = adw::Application; } impl ObjectImpl for Application { fn constructed(&self) { tracing::debug!("GtkApplication::constructed"); self.parent_constructed(); self.obj().add_main_option( "new-window", glib::Char::from(b'w'), glib::OptionFlags::NONE, glib::OptionArg::None, &gettext("Open a new window"), None, ); } } impl ApplicationImpl for Application { fn handle_local_options( &self, options: &glib::VariantDict, ) -> std::ops::ControlFlow { let app = self.obj(); if options.contains("new-window") { if let Err(err) = app.register(None::<&gio::Cancellable>) { tracing::error!("Failed to register the application: {err}"); } if app.is_remote() { app.activate_action("new-window", None); return std::ops::ControlFlow::Break(glib::ExitCode::SUCCESS); } } tracing::debug!("GtkApplication::handle_local_options"); self.parent_handle_local_options(options) } fn activate(&self) { tracing::debug!("GtkApplication::activate"); self.parent_activate(); let app = self.obj(); if let Some(window) = app.active_window() { window.present(); return; } let window = Window::with_group(&app); window.present(); } fn startup(&self) { tracing::debug!("GtkApplication::startup"); self.parent_startup(); let app = self.obj(); // Set icons for shell gtk::Window::set_default_icon_name(APP_ID); app.setup_gactions(); app.setup_accels(); } fn open(&self, files: &[gio::File], _hint: &str) { let app = self.obj(); for file in files { let window = Window::with_group(&app); glib::spawn_future_local(clone!( #[strong] window, #[strong] file, async move { if let Err(err) = window.load_log(&file).await { tracing::error!("Failed to load log {err:?}") } } )); window.present(); } } } impl GtkApplicationImpl for Application {} impl AdwApplicationImpl for Application {} } glib::wrapper! { pub struct Application(ObjectSubclass) @extends gio::Application, gtk::Application, adw::Application, @implements gio::ActionMap, gio::ActionGroup; } impl Application { fn setup_gactions(&self) { // Quit let action_quit = gio::ActionEntry::builder("quit") .activate(move |app: &Self, _, _| { // This is needed to trigger the delete event and saving the window state if let Some(window) = app.active_window() { window.close(); } app.quit(); }) .build(); let new_window_action = gio::ActionEntryBuilder::new("new-window") .activate(|app, _, _| { let window = Window::with_group(app); window.present(); }) .build(); self.add_action_entries([action_quit, new_window_action]); } // Sets up keyboard shortcuts fn setup_accels(&self) { self.set_accels_for_action("app.quit", &["q"]); self.set_accels_for_action("app.new-window", &["n"]); self.set_accels_for_action("window.close", &["w"]); self.set_accels_for_action("win.statistics", &["F9"]); self.set_accels_for_action("win.filter-services", &["f"]); self.set_accels_for_action("win.record-session-bus", &["e"]); self.set_accels_for_action("win.record-system-bus", &["y"]); self.set_accels_for_action("win.record-address", &["a"]); self.set_accels_for_action("win.open-log", &["o"]); self.set_accels_for_action("win.save", &["s"]); self.set_accels_for_action("win.save-dot", &["s"]); } pub fn run(&self) -> glib::ExitCode { tracing::info!("Bustle ({})", APP_ID); tracing::info!("Version: {} ({})", VERSION, PROFILE); tracing::info!("Datadir: {}", PKGDATADIR); ApplicationExtManual::run(self) } } impl Default for Application { fn default() -> Self { glib::Object::builder() .property("application-id", APP_ID) .property("resource-base-path", "/org/freedesktop/Bustle/") .property("flags", gio::ApplicationFlags::HANDLES_OPEN) .build() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/bus_name_item.rs000066400000000000000000000053701525300766700246460ustar00rootroot00000000000000use gtk::{glib, subclass::prelude::*}; use indexmap::IndexSet; use zbus::names::{BusName, WellKnownName}; use crate::message::ReceiveIndex; /// The point at which to look up for well-known names. #[derive(Clone, Copy)] pub enum LookupPoint { /// Union of all well-known names at all indices. All, /// Well-known names at the given index. Index(ReceiveIndex), /// Well-known names at the last index. Last, } impl From for LookupPoint { fn from(receive_index: ReceiveIndex) -> Self { Self::Index(receive_index) } } mod imp { use std::{ cell::{OnceCell, RefCell}, collections::BTreeMap, }; use super::*; #[derive(Default)] pub struct BusNameItem { pub(super) name: OnceCell>, pub(super) wk_name_log: RefCell>>>, } #[glib::object_subclass] impl ObjectSubclass for BusNameItem { const NAME: &'static str = "BustleBusNameItem"; type Type = super::BusNameItem; } impl ObjectImpl for BusNameItem {} } glib::wrapper! { pub struct BusNameItem(ObjectSubclass); } impl BusNameItem { pub fn name(&self) -> &BusName<'static> { self.imp().name.get().unwrap() } /// Returns a copy of the well-known names that were known at the given /// lookup point. pub fn wk_names(&self, lookup_point: LookupPoint) -> IndexSet> { let wk_name_log = self.imp().wk_name_log.borrow(); match lookup_point { LookupPoint::All => wk_name_log.values().flatten().cloned().collect(), LookupPoint::Index(receive_index) => wk_name_log .range(..=receive_index) .next_back() .map(|(_, wk_names)| wk_names.clone()) .unwrap_or_default(), LookupPoint::Last => wk_name_log .last_key_value() .map(|(_, wk_names)| wk_names.clone()) .unwrap_or_default(), } } /// This must only be called on `BusNameList` pub fn new(name: BusName<'static>) -> Self { let this = glib::Object::new::(); this.imp().name.set(name).unwrap(); this } /// This must only be called on `BusNameList` pub fn insert_wk_name_log( &self, receive_index: ReceiveIndex, wk_names: IndexSet>, ) { let prev_entry = self .imp() .wk_name_log .borrow_mut() .insert(receive_index, wk_names.clone()); debug_assert_eq!( prev_entry, None, "duplicate entry `{wk_names:?}` for the same receive index `{receive_index:?}`" ); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/bus_name_list.rs000066400000000000000000000405161525300766700246640ustar00rootroot00000000000000use std::collections::HashSet; use anyhow::{Context, Result, bail}; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use indexmap::{IndexSet, map::Entry}; use zbus::{ fdo::DBusProxy, names::{BusName, UniqueName, WellKnownName}, proxy::Defaults, zvariant::Optional, }; use crate::{ bus_name_item::{BusNameItem, LookupPoint}, message::{Message, ReceiveIndex}, message_type::MessageType, }; mod imp { use std::cell::RefCell; use indexmap::IndexMap; use super::*; #[derive(Default)] pub struct BusNameList { pub(super) inner: RefCell, BusNameItem>>, } #[glib::object_subclass] impl ObjectSubclass for BusNameList { const NAME: &'static str = "BustleBusNameList"; type Type = super::BusNameList; type Interfaces = (gio::ListModel,); } impl ObjectImpl for BusNameList {} impl ListModelImpl for BusNameList { fn item_type(&self) -> glib::Type { BusNameItem::static_type() } fn n_items(&self) -> u32 { self.inner.borrow().len() as u32 } fn item(&self, position: u32) -> Option { self.inner .borrow() .get_index(position as usize) .map(|(_, v)| v.upcast_ref::()) .cloned() } } } glib::wrapper! { pub struct BusNameList(ObjectSubclass) @implements gio::ListModel; } impl BusNameList { pub fn handle_message(&self, message: &Message) -> Result<()> { match message.message_type() { MessageType::MethodCall => self.handle_method_call_message(message), MessageType::MethodReturn | MessageType::Error => { self.handle_method_return_message(message) } MessageType::Signal => self.handle_signal_message(message), } } /// Returns the `BusNameItem` with the given `bus_name` as item's `bus_name` pub fn get(&self, bus_name: &BusName<'_>) -> Option { self.imp().inner.borrow().get(bus_name).cloned() } fn handle_method_call_message(&self, message: &Message) -> Result<()> { debug_assert!(message.message_type().is_method_call()); let sender = message.sender().context("Call message has no sender")?; self.insert_bus_name(sender.to_owned().into()); let destination = message .destination() .context("Call message has no destination")?; self.insert_bus_name(destination.to_owned()); Ok(()) } fn handle_method_return_message(&self, message: &Message) -> Result<()> { debug_assert!(message.message_type().is_method_return()); let call_message = message .associated_message() .context("Return message has no associated call message")?; let call_header = call_message.header(); if call_header.interface() == DBusProxy::INTERFACE.as_ref() && call_header.member().is_some_and(|m| m == "GetNameOwner") { self.handle_get_name_owner_message(&call_message, message) .context("Failed to handle get name owner message")?; return Ok(()); } let imp = self.imp(); match call_message .destination() .context("Call message has no destination")? { BusName::Unique(unique_name) => { // Already inserted on MethodCall handling debug_assert!( imp.inner .borrow() .contains_key(&BusName::from(unique_name.as_ref())), "{unique_name:?} was not found" ); } BusName::WellKnown(dest_wk_name) => { if !Message::is_fallback_destination(&BusName::from(dest_wk_name.as_ref())) { // TODO All of these could be optimized by having a specialized `insert_wk_name` // function, so instead of emitting items-changed thrice, we only emit it once. // FIXME This disrupts ordering of names, see `IndexMap.move_index` let removed = imp .inner .borrow_mut() .shift_remove_full(&BusName::from(dest_wk_name.to_owned())); if let Some((old_index, old_name, old_bus_name_item)) = removed { debug_assert!(matches!(old_name, BusName::WellKnown(_))); debug_assert_eq!( old_bus_name_item.wk_names(LookupPoint::All), IndexSet::new() ); self.items_changed(old_index as u32, 1, 0); // There was a well-known name in bus names map (which we removed), and now // that we already know its unique name through this return message, we can // now add that unique name to the map as a key, and move the well-known // name to the items's well-known names. let sender = message.sender().context("Return message has no sender")?; self.insert_wk_name( sender.to_owned().into(), dest_wk_name.to_owned(), message.receive_index(), ); // After that, we need to go back in time when the well-known name was first // discovered, and add the well-known name to the entry at that index. // First, get the index and the bus name item we just inserted. let inner = imp.inner.borrow(); let (new_index, _, new_bus_name_item) = inner.get_full(&BusName::from(sender)).unwrap(); // Then add to the log entry the well-known name when it was first // discovered, which is the call message's receive // index let mut wk_names = new_bus_name_item.wk_names(call_message.receive_index().into()); wk_names.insert(dest_wk_name.to_owned()); new_bus_name_item .insert_wk_name_log(call_message.receive_index(), wk_names); // Finally, notify that we have modified an item's well-known names drop(inner); self.items_changed(new_index as u32, 1, 1); } else { // It was already handled by other return messages. debug_assert!(imp.inner.borrow().values().any(|bus_name_item| { bus_name_item .wk_names(message.receive_index().into()) .contains(&dest_wk_name) })); } } } } match message .destination() .context("Return message has no destination")? { BusName::Unique(unique_name) => { // Already inserted on MethodCall handling debug_assert!( imp.inner .borrow() .contains_key(&BusName::from(unique_name.as_ref())), "{unique_name:?} was not found" ); } BusName::WellKnown(dest_wk_name) => { let sender = call_message .sender() .context("Call message has no sender")?; self.insert_wk_name( sender.to_owned().into(), dest_wk_name.to_owned(), message.receive_index(), ); } } Ok(()) } fn handle_get_name_owner_message( &self, call_message: &Message, return_message: &Message, ) -> Result<()> { debug_assert!(call_message.message_type().is_method_call()); debug_assert!(return_message.message_type().is_method_return()); if return_message.message_type().is_error() { return Ok(()); } debug_assert_eq!( call_message.header().member().map(|m| m.as_str()), Some("GetNameOwner") ); let call_message_body = call_message.body(); let return_message_body = return_message.body(); let (name,) = call_message_body .deserialize::<(BusName<'_>,)>() .context("Failed to get call message body")?; let (owner,) = return_message_body .deserialize::<(UniqueName<'_>,)>() .context("Failed to get return message body")?; match name { BusName::Unique(unique_name) => { debug_assert_eq!(owner, unique_name); } BusName::WellKnown(wk_name) => { self.insert_wk_name( owner.to_owned().into(), wk_name.to_owned(), return_message.receive_index(), ); } } Ok(()) } fn handle_signal_message(&self, message: &Message) -> Result<()> { debug_assert!(message.message_type().is_signal()); let header = message.header(); if header.interface() == DBusProxy::INTERFACE.as_ref() && header.member().is_some_and(|m| m == "NameOwnerChanged") { self.handle_name_owner_changed_message(message) .context("Failed to handle NOC message")?; return Ok(()); } if let Some(sender) = message.sender() { self.insert_bus_name(sender.to_owned().into()); } if let Some(destination) = message.destination() { self.insert_bus_name(destination.to_owned()); } Ok(()) } fn handle_name_owner_changed_message(&self, message: &Message) -> Result<()> { debug_assert_eq!(message.message_type(), MessageType::Signal); debug_assert_eq!( message.header().member().cloned().as_deref(), Some("NameOwnerChanged") ); let body = message.body(); let (name, old_owner, new_owner) = body .deserialize::<( BusName<'_>, Optional>, Optional>, )>() .context("Failed to get NOC message body")?; if old_owner.is_none() && new_owner.is_none() { bail!("Invalid NOC message; both old and new owner are none"); } let wk_name = match name { BusName::Unique(ref unique_name) => { if let Some(old_owner) = old_owner.as_ref() { debug_assert_eq!(unique_name, old_owner); } if let Some(new_owner) = new_owner.as_ref() { debug_assert_eq!(unique_name, new_owner); } return Ok(()); } BusName::WellKnown(wk_name) => wk_name, }; // FIXME This should be specialized because, while it is harmless as // we remove first, there is a warning since we are trying to add a // log entry to the same receive index. Also, we emit items-changed twice if let Some(old_owner) = old_owner.as_ref() { self.remove_wk_name( old_owner.to_owned().into(), wk_name.to_owned(), message.receive_index(), ); } if let Some(new_owner) = new_owner.as_ref() { self.insert_wk_name( new_owner.to_owned().into(), wk_name.to_owned(), message.receive_index(), ); } Ok(()) } /// Insert `bus_name` with empty `wk_names` fn insert_bus_name(&self, bus_name: BusName<'static>) { let index = match self.imp().inner.borrow_mut().entry(bus_name) { Entry::Occupied(_) => None, Entry::Vacant(entry) => { let index = entry.index(); let bus_name_item = BusNameItem::new(entry.key().to_owned()); entry.insert(bus_name_item); Some(index) } }; if let Some(index) = index { self.items_changed(index as u32, 0, 1); } } /// Insert `wk_name` to `bus_name`'s `wk_names` or create `bus_name` entry /// first fn insert_wk_name( &self, bus_name: BusName<'static>, wk_name: WellKnownName<'static>, receive_index: ReceiveIndex, ) { let imp = self.imp(); let (index, removed, added) = match imp.inner.borrow_mut().entry(bus_name) { Entry::Occupied(entry) => { let bus_name_item = entry.get(); // Get last snapshot and create a new snapshot with the new well-known name let mut wk_names = bus_name_item.wk_names(receive_index.into()); // TODO We can return here early and dont emit items-changed if the given // well-known name exist already in the current snapshot, but we // want to ensure first that the messages we handle come in a // chronological order. wk_names.insert(wk_name); bus_name_item.insert_wk_name_log(receive_index, wk_names); (entry.index(), 1, 1) } Entry::Vacant(entry) => { let bus_name_item = BusNameItem::new(entry.key().to_owned()); let wk_names = IndexSet::from([wk_name]); bus_name_item.insert_wk_name_log(receive_index, wk_names); let index = entry.index(); entry.insert(bus_name_item); (index, 0, 1) } }; self.items_changed(index as u32, removed, added); if cfg!(debug_assertions) { // Ensure that all well-known names has a unique owner let mut unique = HashSet::new(); for (bus_name, bus_name_item) in imp.inner.borrow().iter() { assert_eq!(bus_name, bus_name_item.name()); for wk_name in bus_name_item.wk_names(receive_index.into()) { let was_inserted = unique.insert(wk_name.clone()); assert!(was_inserted, "duplicate well-known name: {wk_name}"); } } } } /// Remove `wk_name` from `bus_name`'s `wk_names` only if `bus_name` exists fn remove_wk_name( &self, bus_name: BusName<'static>, wk_name: WellKnownName<'static>, receive_index: ReceiveIndex, ) { let imp = self.imp(); let index = match imp.inner.borrow_mut().entry(bus_name) { Entry::Occupied(entry) => { let bus_name_item = entry.get(); // Get last snapshot and create a new snapshot without the well-known name let mut wk_names = bus_name_item.wk_names(receive_index.into()); // TODO We can return here early and dont emit items-changed if the given // well-known name does not exist anyway in the current // snapshot, but we want to ensure first that the messages we // handle come in a chronological order. wk_names.shift_remove(&wk_name); bus_name_item.insert_wk_name_log(receive_index, wk_names); Some(entry.index()) } Entry::Vacant(_) => None, }; if let Some(index) = index { self.items_changed(index as u32, 1, 1); } if cfg!(debug_assertions) { // Ensure that all well-known names has a unique owner let mut unique = HashSet::new(); for (bus_name, bus_name_item) in imp.inner.borrow().iter() { assert_eq!(bus_name, bus_name_item.name()); for wk_name in bus_name_item.wk_names(receive_index.into()) { let was_inserted = unique.insert(wk_name.clone()); assert!(was_inserted, "duplicate well-known name: {wk_name}"); } } } } } impl Default for BusNameList { fn default() -> Self { glib::Object::new() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/busctl_cmd.rs000066400000000000000000000243361525300766700241610ustar00rootroot00000000000000use anyhow::Context; use zbus::{ names::{BusName, InterfaceName, MemberName, UniqueName}, zvariant::{self, ObjectPath, Signature}, }; use crate::ConnectionType; pub enum BusctlSubCommand { Call, Wait, } impl BusctlSubCommand { fn as_str(&self) -> &str { match self { Self::Call => "call", Self::Wait => "wait", } } } pub struct BusctlCommand<'a> { pub sub_command: BusctlSubCommand, pub connection_type: ConnectionType, pub sender: Option>, pub destination: Option>, pub path: Option<&'a ObjectPath<'a>>, pub interface: Option<&'a InterfaceName<'a>>, pub body_structure: Option>, pub member: Option<&'a MemberName<'a>>, pub signature: &'a Signature, } impl<'a> BusctlCommand<'a> { pub fn into_command_string(self) -> anyhow::Result { let mut cmd = vec!["busctl"]; let session_flag = match &self.connection_type { ConnectionType::Session => "--user", ConnectionType::System => "", ConnectionType::Address(addr) => &format!("--address={addr}"), }; if !session_flag.is_empty() { cmd.push(session_flag); } let interface = self .interface .context("Message does not have a interface")?; let member = self.member.context("Message does not have a member")?; let is_getter = interface == "org.freedesktop.DBus.Properties" && member == "Get" && matches!(self.sub_command, BusctlSubCommand::Call); let is_setter = interface == "org.freedesktop.DBus.Properties" && member == "Set" && matches!(self.sub_command, BusctlSubCommand::Call); if is_getter { cmd.push("get-property"); } else if is_setter { cmd.push("set-property"); } else { cmd.push(self.sub_command.as_str()); } match self.sub_command { BusctlSubCommand::Call => { let destination = self .destination .as_ref() .context("Message does not have a destination")?; cmd.push(destination); } BusctlSubCommand::Wait => { let sender = self .sender .as_ref() .context("Message does not have a sender")?; cmd.push(sender); } } let path = self.path.context("Message does not have a path")?; cmd.push(path); if !is_getter && !is_setter { cmd.push(interface); } if !is_getter && !is_setter { cmd.push(member); } if is_getter { let structure = self .body_structure .context("Message does not have a body")?; let (object, prop_name) = <(zvariant::Str<'_>, zvariant::Str<'_>)>::try_from(structure) .context("body for Get has wrong signature")?; cmd.push(&object); cmd.push(&prop_name); Ok(cmd.join(" ")) } else if is_setter { let structure = self .body_structure .context("Message does not have a body")?; let (object, prop_name, owned_value) = <(zvariant::Str<'_>, zvariant::Str<'_>, zvariant::OwnedValue)>::try_from(structure) .context("body for Set has wrong signature")?; let value = owned_value .downcast_ref::>() .context("property value is not of type v")?; let mut value_string = String::new(); crate::message_fmt::value_display_fmt(&mut value_string, &value)?; cmd.push(&object); cmd.push(&prop_name); cmd.push(&value_string); Ok(cmd.join(" ")) } else if matches!(self.sub_command, BusctlSubCommand::Call) && *self.signature != zvariant::Signature::Unit { if let Some(structure) = self.body_structure { let mut body = String::new(); crate::message_fmt::structure_display_fmt(&mut body, &structure)?; let signature = self.signature.to_string_no_parens(); if !body.is_empty() { let signature_str = shell_escape::escape(std::borrow::Cow::Owned(signature)); cmd.push(&signature_str); cmd.push(&body); Ok(cmd.join(" ")) } else { Ok(cmd.join(" ")) } } else { anyhow::bail!("Message does not have a body"); } } else { Ok(cmd.join(" ")) } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_man_busctl_example() { // From busctl(1) examples. let expected = "busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager StartUnit ss cups.service replace"; let body_structure = zvariant::Structure::from(( zvariant::Str::from_static("cups.service"), zvariant::Str::from_static("replace"), )); let path = ObjectPath::from_static_str("/org/freedesktop/systemd1").unwrap(); let iface = InterfaceName::from_static_str("org.freedesktop.systemd1.Manager").unwrap(); let member = MemberName::from_static_str("StartUnit").unwrap(); let cmd = BusctlCommand { sub_command: BusctlSubCommand::Call, connection_type: ConnectionType::System, sender: None, destination: Some(BusName::from_static_str("org.freedesktop.systemd1").unwrap()), path: Some(&path), interface: Some(&iface), member: Some(&member), signature: &body_structure.signature().clone(), body_structure: Some(body_structure), }; assert_eq!(cmd.into_command_string().unwrap(), expected); } #[test] fn test_set_property_busctl_example() { // From busctl(1) examples. let expected = "busctl set-property org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager LogLevel s debug"; let body_structure = zvariant::Structure::from(( zvariant::Str::from_static("org.freedesktop.systemd1.Manager"), zvariant::Str::from_static("LogLevel"), zvariant::Value::new(zvariant::Value::new("debug")), )); let path = ObjectPath::from_static_str("/org/freedesktop/systemd1").unwrap(); let iface = InterfaceName::from_static_str("org.freedesktop.DBus.Properties").unwrap(); let member = MemberName::from_static_str("Set").unwrap(); let cmd = BusctlCommand { sub_command: BusctlSubCommand::Call, connection_type: ConnectionType::System, sender: None, destination: Some(BusName::from_static_str("org.freedesktop.systemd1").unwrap()), path: Some(&path), interface: Some(&iface), member: Some(&member), signature: &body_structure.signature().clone(), body_structure: Some(body_structure), }; assert_eq!(cmd.into_command_string().unwrap(), expected); } #[test] fn test_get_property_busctl_example() { // From busctl(1) examples. let expected = "busctl get-property org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager LogLevel"; let body_structure = zvariant::Structure::from(( zvariant::Str::from_static("org.freedesktop.systemd1.Manager"), zvariant::Str::from_static("LogLevel"), )); let path = ObjectPath::from_static_str("/org/freedesktop/systemd1").unwrap(); let iface = InterfaceName::from_static_str("org.freedesktop.DBus.Properties").unwrap(); let member = MemberName::from_static_str("Get").unwrap(); let cmd = BusctlCommand { sub_command: BusctlSubCommand::Call, connection_type: ConnectionType::System, sender: None, destination: Some(BusName::from_static_str("org.freedesktop.systemd1").unwrap()), path: Some(&path), interface: Some(&iface), member: Some(&member), signature: &body_structure.signature().clone(), body_structure: Some(body_structure), }; assert_eq!(cmd.into_command_string().unwrap(), expected); } #[test] fn test_shell_escape_example() { let expected = "busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SetUnitProperties 'sba(sv)' cups.service true 2 CPUWeight t 300 IOWeight t 500"; let mut array = zvariant::Array::new(&zvariant::Signature::try_from("(sv)").unwrap()); array .append(zvariant::Value::Structure(zvariant::Structure::from(( zvariant::Str::from_static("CPUWeight"), zvariant::Value::U64(300_u64), )))) .unwrap(); array .append(zvariant::Value::Structure(zvariant::Structure::from(( zvariant::Str::from_static("IOWeight"), zvariant::Value::U64(500_u64), )))) .unwrap(); let body_structure = zvariant::Structure::from((zvariant::Str::from_static("cups.service"), true, array)); let path = ObjectPath::from_static_str("/org/freedesktop/systemd1").unwrap(); let iface = InterfaceName::from_static_str("org.freedesktop.systemd1.Manager").unwrap(); let member = MemberName::from_static_str("SetUnitProperties").unwrap(); let cmd = BusctlCommand { sub_command: BusctlSubCommand::Call, connection_type: ConnectionType::System, sender: None, destination: Some(BusName::from_static_str("org.freedesktop.systemd1").unwrap()), path: Some(&path), interface: Some(&iface), member: Some(&member), signature: &body_structure.signature().clone(), body_structure: Some(body_structure), }; assert_eq!(cmd.into_command_string().unwrap(), expected); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/color_widget.rs000066400000000000000000000041271525300766700245170ustar00rootroot00000000000000use gtk::{gdk, glib, graphene, prelude::*, subclass::prelude::*}; const SIZE: i32 = 16; mod imp { use std::cell::Cell; use super::*; #[derive(Debug, glib::Properties)] #[properties(wrapper_type = super::ColorWidget)] pub struct ColorWidget { #[property(get, set = Self::set_rgba, explicit_notify)] pub(super) rgba: Cell, } impl Default for ColorWidget { fn default() -> Self { Self { rgba: Cell::new(gdk::RGBA::TRANSPARENT), } } } #[glib::object_subclass] impl ObjectSubclass for ColorWidget { const NAME: &'static str = "BustleColorWidget"; type Type = super::ColorWidget; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_css_name("colorwidget"); } } #[glib::derived_properties] impl ObjectImpl for ColorWidget { fn constructed(&self) { self.parent_constructed(); self.obj().set_overflow(gtk::Overflow::Hidden); } } impl WidgetImpl for ColorWidget { fn measure(&self, _orientation: gtk::Orientation, _for_size: i32) -> (i32, i32, i32, i32) { (SIZE, SIZE, -1, -1) } fn snapshot(&self, snapshot: >k::Snapshot) { let widget = self.obj(); let color = widget.rgba(); let width = widget.width() as f32; let height = widget.height() as f32; snapshot.append_color(&color, &graphene::Rect::new(0.0, 0.0, width, height)); self.parent_snapshot(snapshot); } } impl ColorWidget { fn set_rgba(&self, rgba: gdk::RGBA) { let obj = self.obj(); if self.rgba.get() == rgba { return; } self.rgba.set(rgba); obj.queue_draw(); obj.notify_rgba(); } } } glib::wrapper! { pub struct ColorWidget(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/colors.rs000066400000000000000000000106621525300766700233400ustar00rootroot00000000000000#![allow(unused)] use gtk::gdk; pub const BLUE_1: gdk::RGBA = gdk::RGBA::new(0.6, 0.756_862_76, 0.945_098_04, 1.0); // #99c1f1 pub const BLUE_2: gdk::RGBA = gdk::RGBA::new(0.384_313_73, 0.627_451, 0.917_647_06, 1.0); // #62a0ea pub const BLUE_3: gdk::RGBA = gdk::RGBA::new(0.207_843_14, 0.517_647_1, 0.894_117_65, 1.0); // #3584e4 pub const BLUE_4: gdk::RGBA = gdk::RGBA::new(0.109_803_92, 0.443_137_26, 0.847_058_83, 1.0); // #1c71d8 pub const BLUE_5: gdk::RGBA = gdk::RGBA::new(0.101_960_786, 0.372_549_03, 0.705_882_4, 1.0); // #1a5fb4 pub const GREEN_1: gdk::RGBA = gdk::RGBA::new(0.560_784_34, 0.941_176_5, 0.643_137_3, 1.0); // #8ff0a4 pub const GREEN_2: gdk::RGBA = gdk::RGBA::new(0.341_176_48, 0.890_196_1, 0.537_254_9, 1.0); // #57e389 pub const GREEN_3: gdk::RGBA = gdk::RGBA::new(0.2, 0.819_607_85, 0.478_431_37, 1.0); // #33d17a pub const GREEN_4: gdk::RGBA = gdk::RGBA::new(0.180_392_16, 0.760_784_3, 0.494_117_65, 1.0); // #2ec27e pub const GREEN_5: gdk::RGBA = gdk::RGBA::new(0.149_019_61, 0.635_294_14, 0.411_764_7, 1.0); // #26a269 pub const YELLOW_1: gdk::RGBA = gdk::RGBA::new(0.976_470_6, 0.941_176_5, 0.419_607_85, 1.0); // #f9f06b pub const YELLOW_2: gdk::RGBA = gdk::RGBA::new(0.972_549, 0.894_117_65, 0.360_784_32, 1.0); // #f8e45c pub const YELLOW_3: gdk::RGBA = gdk::RGBA::new(0.964_705_9, 0.827_451, 0.176_470_6, 1.0); // #f6d32d pub const YELLOW_4: gdk::RGBA = gdk::RGBA::new(0.960_784_3, 0.760_784_3, 0.066_666_67, 1.0); // #f5c211 pub const YELLOW_5: gdk::RGBA = gdk::RGBA::new(0.898_039_2, 0.647_058_84, 0.039_215_688, 1.0); // #e5a50a pub const ORANGE_1: gdk::RGBA = gdk::RGBA::new(1.0, 0.745_098_05, 0.435_294_12, 1.0); // #ffbe6f pub const ORANGE_2: gdk::RGBA = gdk::RGBA::new(1.0, 0.639_215_7, 0.282_352_95, 1.0); // #ffa348 pub const ORANGE_3: gdk::RGBA = gdk::RGBA::new(1.0, 0.470_588_24, 0.0, 1.0); // #ff7800 pub const ORANGE_4: gdk::RGBA = gdk::RGBA::new(0.901_960_8, 0.380_392_16, 0.0, 1.0); // #e66100 pub const ORANGE_5: gdk::RGBA = gdk::RGBA::new(0.776_470_6, 0.274_509_82, 0.0, 1.0); // #c64600 pub const RED_1: gdk::RGBA = gdk::RGBA::new(0.964_705_9, 0.380_392_16, 0.317_647_07, 1.0); // #f66151 pub const RED_2: gdk::RGBA = gdk::RGBA::new(0.929_411_77, 0.2, 0.231_372_55, 1.0); // #ed333b pub const RED_3: gdk::RGBA = gdk::RGBA::new(0.878_431_4, 0.105_882_354, 0.141_176_48, 1.0); // #e01b24 pub const RED_4: gdk::RGBA = gdk::RGBA::new(0.752_941_2, 0.109_803_92, 0.156_862_75, 1.0); // #c01c28 pub const RED_5: gdk::RGBA = gdk::RGBA::new(0.647_058_84, 0.113_725_49, 0.176_470_6, 1.0); // #a51d2d pub const PURPLE_1: gdk::RGBA = gdk::RGBA::new(0.862_745_1, 0.541_176_5, 0.866_666_7, 1.0); // #dc8add pub const PURPLE_2: gdk::RGBA = gdk::RGBA::new(0.752_941_2, 0.380_392_16, 0.796_078_44, 1.0); // #c061cb pub const PURPLE_3: gdk::RGBA = gdk::RGBA::new(0.568_627_5, 0.254_901_98, 0.674_509_8, 1.0); // #9141ac pub const PURPLE_4: gdk::RGBA = gdk::RGBA::new(0.505_882_4, 0.239_215_69, 0.611_764_7, 1.0); // #813d9c pub const PURPLE_5: gdk::RGBA = gdk::RGBA::new(0.380_392_16, 0.207_843_14, 0.513_725_5, 1.0); // #613583 pub const BROWN_1: gdk::RGBA = gdk::RGBA::new(0.803_921_6, 0.670_588_25, 0.560_784_34, 1.0); // #cdab8f pub const BROWN_2: gdk::RGBA = gdk::RGBA::new(0.709_803_94, 0.513_725_5, 0.352_941_2, 1.0); // #b5835a pub const BROWN_3: gdk::RGBA = gdk::RGBA::new(0.596_078_46, 0.415_686_28, 0.266_666_68, 1.0); // #986a44 pub const BROWN_4: gdk::RGBA = gdk::RGBA::new(0.525_490_2, 0.368_627_46, 0.235_294_12, 1.0); // #865e3c pub const BROWN_5: gdk::RGBA = gdk::RGBA::new(0.388_235_3, 0.270_588_25, 0.172_549_02, 1.0); // #63452c pub const LIGHT_1: gdk::RGBA = gdk::RGBA::WHITE; // #ffffff pub const LIGHT_2: gdk::RGBA = gdk::RGBA::new(0.964_705_9, 0.960_784_3, 0.956_862_75, 1.0); // #f6f5f4 pub const LIGHT_3: gdk::RGBA = gdk::RGBA::new(0.870_588_24, 0.866_666_7, 0.854_901_97, 1.0); // #deddda pub const LIGHT_4: gdk::RGBA = gdk::RGBA::new(0.752_941_2, 0.749_019_6, 0.737_254_9, 1.0); // #c0bfbc pub const LIGHT_5: gdk::RGBA = gdk::RGBA::new(0.603_921_6, 0.6, 0.588_235_3, 1.0); // #9a9996 pub const DARK_1: gdk::RGBA = gdk::RGBA::new(0.466_666_67, 0.462_745_1, 0.482_352_94, 1.0); // #77767b pub const DARK_2: gdk::RGBA = gdk::RGBA::new(0.368_627_46, 0.360_784_32, 0.392_156_87, 1.0); // #5e5c64 pub const DARK_3: gdk::RGBA = gdk::RGBA::new(0.239_215_69, 0.219_607_84, 0.274_509_82, 1.0); // #3d3846 pub const DARK_4: gdk::RGBA = gdk::RGBA::new(0.141_176_48, 0.121_568_63, 0.192_156_87, 1.0); // #241f31 pub const DARK_5: gdk::RGBA = gdk::RGBA::BLACK; // #000000 bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/config.rs.in000066400000000000000000000005061525300766700237050ustar00rootroot00000000000000pub const APP_ID: &str = @APP_ID@; pub const GETTEXT_PACKAGE: &str = @GETTEXT_PACKAGE@; pub const LOCALEDIR: &str = @LOCALEDIR@; pub const PKGDATADIR: &str = @PKGDATADIR@; pub const PROFILE: &str = @PROFILE@; pub const RESOURCES_FILE: &str = concat!(@PKGDATADIR@, "/resources.gresource"); pub const VERSION: &str = @VERSION@; bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/details_view.rs000066400000000000000000000226441525300766700245210ustar00rootroot00000000000000use adw::prelude::*; use gettextrs::gettext; use gtk::{ gio, glib::{self, closure_local}, subclass::prelude::*, }; use zbus::zvariant; use crate::{message::Message, message_type::MessageType}; mod imp { use std::{cell::RefCell, sync::LazyLock}; use glib::subclass::Signal; use super::*; use crate::color_widget::ColorWidget; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::DetailsView)] #[template(resource = "/org/freedesktop/Bustle/ui/details_view.ui")] pub struct DetailsView { #[property(get, set = Self::set_message, explicit_notify, nullable)] pub(super) message: RefCell>, #[template_child] pub(super) scrolled_window: TemplateChild, #[template_child] pub(super) associated_message_group: TemplateChild, #[template_child] pub(super) copy_as_busctl_group: TemplateChild, #[template_child] pub(super) type_row: TemplateChild, #[template_child] pub(super) sender_row: TemplateChild, #[template_child] pub(super) destination_row: TemplateChild, #[template_child] pub(super) component_row: TemplateChild, #[template_child] pub(super) component_color: TemplateChild, #[template_child] pub(super) path_row: TemplateChild, #[template_child] pub(super) member_row: TemplateChild, #[template_child] pub(super) interface_row: TemplateChild, #[template_child] pub(super) error_row: TemplateChild, #[template_child] pub(super) flags_row: TemplateChild, #[template_child] pub(super) size_row: TemplateChild, #[template_child] pub(super) signature_row: TemplateChild, #[template_child] pub(super) response_time_row: TemplateChild, #[template_child] pub(super) arguments_text_buffer: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for DetailsView { const NAME: &'static str = "BustleDetailsView"; type Type = super::DetailsView; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); klass.set_layout_manager_type::(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for DetailsView { fn constructed(&self) { self.parent_constructed(); self.obj().update_rows(); } fn dispose(&self) { self.dispose_template(); } fn signals() -> &'static [glib::subclass::Signal] { static SIGNALS: LazyLock> = LazyLock::new(|| { vec![ Signal::builder("show-message-request") .param_types([Message::static_type()]) .build(), ] }); SIGNALS.as_ref() } } impl WidgetImpl for DetailsView {} impl DetailsView { fn set_message(&self, message: Option) { if message == self.message.replace(message.clone()) { return; } let obj = self.obj(); self.message.replace(message.clone()); obj.update_rows(); obj.notify_message(); } } } glib::wrapper! { pub struct DetailsView(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl DetailsView { pub fn connect_show_message_request(&self, f: F) -> glib::SignalHandlerId where F: Fn(&Self, &Message) + 'static, { self.connect_closure( "show-message-request", false, closure_local!(|obj: &Self, message: &Message| { f(obj, message); }), ) } fn update_rows(&self) { let imp = self.imp(); let message = imp.message.borrow(); let message = message.as_ref(); let header = message.map(|message| message.header()); imp.copy_as_busctl_group .set_visible(message.is_some_and(|message| { matches!( message.message_type(), MessageType::MethodCall | MessageType::Signal ) })); imp.associated_message_group .set_visible(message.is_some_and(|message| message.associated_message().is_some())); imp.type_row .set_subtitle(&message.map(|m| m.message_type().i18n()).unwrap_or_default()); imp.sender_row .set_subtitle(&message.map(|m| m.sender_display()).unwrap_or_default()); imp.destination_row .set_subtitle(&message.map(|m| m.destination_display()).unwrap_or_default()); let message_tag = message.map(|m| m.message_tag()).unwrap_or_default(); imp.component_color.set_rgba(message_tag.color()); imp.component_row.set_subtitle(&message_tag.name()); imp.path_row .set_subtitle(&message.map(|m| m.path_display()).unwrap_or_default()); imp.interface_row .set_subtitle(&message.map(|m| m.interface_display()).unwrap_or_default()); imp.member_row .set_subtitle(&message.map(|m| m.member_display()).unwrap_or_default()); imp.error_row.set_visible( message .map(|m| m.message_type().is_error()) .unwrap_or(false), ); imp.error_row.set_subtitle( &header .as_ref() .and_then(|m| m.error_name().map(|e| e.to_string())) .unwrap_or_default(), ); let flags = message.map(|i| i.flags_display()).unwrap_or_default(); imp.flags_row.set_visible(!flags.is_empty()); imp.flags_row.set_subtitle(&flags); imp.size_row.set_subtitle( &header .as_ref() .map(|h| glib::format_size(h.primary().body_len() as u64)) .unwrap_or_default(), ); let signature = header .as_ref() .map(|h| h.signature()) .map(|s| s.to_string()) .unwrap_or_default(); imp.signature_row.set_visible(!signature.is_empty()); imp.signature_row.set_subtitle(&signature); let response_time = message.and_then(|m| m.response_time()); imp.response_time_row.set_visible( response_time.is_some() && message.is_some_and(|m| m.message_type().is_method_return()), ); imp.response_time_row.set_subtitle( &response_time .map(|ts| format!("{:.2} ms", ts.as_millis_f64())) .unwrap_or_default(), ); imp.arguments_text_buffer.set_text( &message .and_then(|m| { m.body() .deserialize::>() .ok() .map(|s| s.to_string()) }) .unwrap_or_default(), ); } } #[gtk::template_callbacks] impl DetailsView { #[template_callback] fn open_doc_button_clicked(&self) { let uri = "https://docs.gtk.org/glib/gvariant-text-format.html"; let launcher = gtk::UriLauncher::new(uri); let window = self.root().and_downcast::().unwrap(); launcher.launch(Some(&window), gio::Cancellable::NONE, move |res| { if let Err(err) = res { tracing::error!("Failed to launch uri {uri}: {err}"); } }); } #[template_callback] fn associated_message_activated(&self) { // It is safe to unwrap as the row is only visible when there is a message // that has an associated message. let associated_message = self.message().unwrap().associated_message().unwrap(); self.emit_by_name::<()>("show-message-request", &[&associated_message]); } #[template_callback] fn copy_as_busctl_activated(&self) { let window = self.root().and_downcast::().unwrap(); let connection_type = window.connection_type(); let toast = match self .imp() .message .borrow() .as_ref() .map(|message| message.print_as_busctl(connection_type)) { Some(Ok(incantation)) => { self.clipboard().set_text(&incantation); tracing::debug!("Copied '{incantation}' to clipboard"); gettext("Copied to clipboard") } Some(Err(err)) => { tracing::error!("Could not generate busctl cmd: {err}"); gettext("Could not generate busctl command") } None => { tracing::error!("Could not generate busctl cmd: there is no message"); gettext("Could not generate busctl command") } }; window.add_message_toast(&toast); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/000077500000000000000000000000001525300766700230705ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/header.rs000066400000000000000000000270451525300766700246760ustar00rootroot00000000000000use adw::prelude::*; use gtk::{ glib::{self, clone}, graphene::Point, pango, subclass::prelude::*, }; use zbus::names::BusName; use crate::{ bus_name_item::{BusNameItem, LookupPoint}, filtered_bus_name_model::FilteredBusNameModel, }; const TEXT_PADDING: i32 = 3; const EXPAND_ANIMATION_DURATION_MS: u32 = 200; // NOTE Keep in sync with diagram_header.ui const PIXEL_SIZE: i32 = 16; const MARGIN: i32 = 3; const IMAGE_SIZE: i32 = PIXEL_SIZE + 2 * MARGIN; mod imp { use std::cell::{Cell, OnceCell, RefCell}; use super::*; #[derive(Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::Header)] #[template(resource = "/org/freedesktop/Bustle/ui/diagram_header.ui")] pub struct Header { #[property(get, set = Self::set_column_width, explicit_notify)] pub(super) column_width: Cell, #[property(get, set = Self::set_first_column_x, explicit_notify)] pub(super) first_column_x: Cell, #[template_child] pub(super) arrow: TemplateChild, pub(super) default_height: Cell, pub(super) expanded_height: Cell, pub(super) current_height: Cell, pub(super) is_expanded: Cell, pub(super) expand_animation: OnceCell, pub(super) default_layout: OnceCell, pub(super) layouts: RefCell>, pub(super) model: OnceCell, } #[glib::object_subclass] impl ObjectSubclass for Header { const NAME: &'static str = "BustleDiagramHeader"; type Type = super::Header; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for Header { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); obj.set_direction(gtk::TextDirection::Ltr); let animation_target = adw::CallbackAnimationTarget::new(clone!( #[weak] obj, move |value| { obj.imp().current_height.set(value.round() as i32); obj.queue_resize(); } )); let animation = adw::TimedAnimation::builder() .widget(&*obj) .duration(EXPAND_ANIMATION_DURATION_MS) .target(&animation_target) .build(); animation.connect_done(clone!( #[weak] obj, move |_| { let imp = obj.imp(); // TODO Use Cell::update when stabilized imp.is_expanded.set(!imp.is_expanded.get()); } )); self.expand_animation.set(animation).unwrap(); let default_layout = obj.create_pango_layout(None); default_layout.set_alignment(pango::Alignment::Center); default_layout.set_ellipsize(pango::EllipsizeMode::End); self.default_layout.set(default_layout).unwrap(); obj.settings().connect_gtk_xft_dpi_notify(clone!( #[weak] obj, move |_| { obj.update_heights(); obj.queue_resize(); obj.queue_draw(); } )); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for Header { fn measure(&self, orientation: gtk::Orientation, _for_size: i32) -> (i32, i32, i32, i32) { if orientation == gtk::Orientation::Vertical { let height = self.current_height.get(); (IMAGE_SIZE.max(height), IMAGE_SIZE.max(height), -1, -1) } else { debug_assert_eq!(orientation, gtk::Orientation::Horizontal); (-1, -1, -1, -1) } } fn size_allocate(&self, width: i32, height: i32, baseline: i32) { self.arrow.size_allocate( >k::Allocation::new(0, 0, IMAGE_SIZE.max(width), IMAGE_SIZE.max(height)), baseline, ); } fn snapshot(&self, snapshot: >k::Snapshot) { let obj = self.obj(); let color = obj.color(); let column_width = obj.column_width(); let mut cursor_x = obj.first_column_x() - column_width / 2.0; for layout in self.layouts.borrow().iter() { snapshot.save(); snapshot.translate(&Point::new(cursor_x, TEXT_PADDING as f32)); snapshot.append_layout(layout, &color); snapshot.restore(); cursor_x += column_width; } self.parent_snapshot(snapshot); } } impl Header { fn set_column_width(&self, column_width: f32) { if column_width == self.column_width.get() { return; } self.column_width.set(column_width); for layout in self.layouts.borrow().iter() { layout.set_width(pango::units_from_double(column_width as f64)); } let obj = self.obj(); obj.queue_draw(); obj.notify_column_width(); } fn set_first_column_x(&self, first_column_x: f32) { if first_column_x == self.first_column_x.get() { return; } self.first_column_x.set(first_column_x); let obj = self.obj(); obj.queue_draw(); obj.notify_first_column_x(); } } } glib::wrapper! { pub struct Header(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl Header { pub fn set_model(&self, model: FilteredBusNameModel) { let imp = self.imp(); model.connect_items_changed(clone!( #[weak(rename_to = obj)] self, move |model, position, removed, added| { obj.on_model_items_changed(model, position, removed, added); } )); imp.model.set(model).unwrap(); } fn on_model_items_changed( &self, model: &FilteredBusNameModel, position: u32, removed: u32, added: u32, ) { let imp = self.imp(); let default_layout = imp .default_layout .get() .expect("default layout was not set"); let column_width = self.column_width(); let new_layouts = (0..added).map(|i| { let bus_name_item = model .item(position + i) .unwrap() .downcast::() .unwrap(); let name = bus_name_item.name(); let name_display = match *name { BusName::Unique(ref unique_name) => unique_name.as_str(), BusName::WellKnown(ref wk_name) => { wk_name.split('.').next_back().unwrap_or_default() } }; let mut lines = vec![format!( r#"{}"#, name_display )]; lines.extend( bus_name_item // FIXME We don't always want this as some well-known names are not valid at all // indices We want to somehow represent which well-known // names are valid as we scroll on the view .wk_names(LookupPoint::All) .iter() .filter_map(|other_name| { other_name .split('.') .next_back() .map(|last| format!(r#"{last}"#)) }), ); let text = lines.join("\n"); let layout = default_layout.copy(); layout.set_width(pango::units_from_double(column_width as f64)); layout.set_markup(&text); layout }); imp.layouts.borrow_mut().splice( position as usize..(removed + position) as usize, new_layouts, ); debug_assert_eq!(imp.layouts.borrow().len(), model.n_items() as usize); self.update_heights(); self.queue_resize(); self.queue_draw(); } fn update_heights(&self) { let imp = self.imp(); let layouts = imp.layouts.borrow(); let Some(first_layout) = layouts.first() else { imp.current_height.set(0); imp.default_height.set(0); imp.expanded_height.set(0); return; }; let first_line = first_layout .downcast_ref::() .unwrap() .line(0) .expect("there must be at least one line"); let (_, logical_extents) = first_line.pixel_extents(); let default_height = logical_extents.height() + TEXT_PADDING; imp.default_height.set(default_height); let max_line_count = layouts .iter() .map(|layout| layout.line_count()) .max() .unwrap(); debug_assert!(max_line_count > 0); // Since somehow a line's height extent can be greater than the entire layout's // height extent, workaround it by just using default height if the maximum // amount of line is 1. let expanded_height = if max_line_count == 1 { default_height } else { layouts .iter() .map(|layout| { let (_, logical_extents) = layout.pixel_extents(); logical_extents.height() }) .max() .unwrap() + TEXT_PADDING * 2 }; imp.expanded_height.set(expanded_height); if imp.is_expanded.get() { imp.current_height.set(expanded_height); } else { imp.current_height.set(default_height); } } } #[gtk::template_callbacks] impl Header { #[template_callback] fn gesture_click_released(&self, _n_press: i32, x: f64, y: f64, gesture: >k::GestureClick) { gesture.set_state(gtk::EventSequenceState::Claimed); if gesture .widget() .is_some_and(|widget| !widget.contains(x, y)) { return; } let imp = self.imp(); let animation = imp .expand_animation .get() .expect("animation was not set on constructed"); if animation.state() == adw::AnimationState::Playing { return; } if imp.is_expanded.get() { animation.set_value_from(imp.expanded_height.get() as f64); animation.set_value_to(imp.default_height.get() as f64); imp.arrow.remove_css_class("expanded"); imp.arrow.remove_css_class("accent"); imp.arrow.add_css_class("dimmed"); } else { animation.set_value_from(imp.default_height.get() as f64); animation.set_value_to(imp.expanded_height.get() as f64); imp.arrow.remove_css_class("dimmed"); imp.arrow.add_css_class("accent"); imp.arrow.add_css_class("expanded"); } animation.play(); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/mod.rs000066400000000000000000000162521525300766700242230ustar00rootroot00000000000000mod header; mod row; mod row_tag; mod view; use anyhow::Result; use gtk::{ gdk, glib::{self, clone}, prelude::*, subclass::prelude::*, }; use crate::{ diagram::{header::Header, view::View}, filtered_message_model::FilteredMessageModel, message::Message, }; const COLUMN_WIDTH_SP: f64 = 90.0; // This must be synced with DiagramRow label char widths const FIRST_COLUMN_INITIAL_X_SP: f64 = 600.0; mod imp { use std::{ cell::{Cell, OnceCell}, marker::PhantomData, }; use super::*; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::Diagram)] #[template(resource = "/org/freedesktop/Bustle/ui/diagram.ui")] pub struct Diagram { #[property(get, set, construct_only)] pub(super) model: OnceCell, #[property(get = Self::selected_message)] pub(super) selected_message: PhantomData>, #[template_child] pub(super) header: TemplateChild

, #[template_child] pub(super) separator: TemplateChild, // Unused, but needed for disposal #[template_child] pub(super) scrolled_window: TemplateChild, #[template_child] pub(super) view: TemplateChild, pub(super) should_stick: Cell, pub(super) is_sticky: Cell, pub(super) is_auto_scrolling: Cell, } #[glib::object_subclass] impl ObjectSubclass for Diagram { const NAME: &'static str = "BustleDiagram"; type Type = super::Diagram; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_layout_manager_type::(); klass.bind_template(); klass.bind_template_instance_callbacks(); klass.add_binding(gdk::Key::Escape, gdk::ModifierType::empty(), |obj| { obj.imp().view.unselect(); glib::Propagation::Stop }) } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for Diagram { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); let layout_manager = self .obj() .layout_manager() .and_downcast::() .unwrap(); layout_manager.set_orientation(gtk::Orientation::Vertical); let model = obj.model(); self.view.set_model(&model); self.header.set_model(model.filtered_bus_names().clone()); let hadj = self.view.hadjustment().unwrap(); hadj.connect_value_changed(clone!( #[weak] obj, move |_| { obj.update_first_column_x(); } )); let vadj = self.view.vadjustment().unwrap(); vadj.connect_value_changed(clone!( #[weak] obj, move |vadj| { let imp = obj.imp(); if imp.should_stick.get() { let is_at_bottom = vadj.value() + vadj.page_size() == vadj.upper(); if imp.is_auto_scrolling.get() { if is_at_bottom { imp.is_auto_scrolling.set(false); imp.is_sticky.set(true); } else { obj.scroll_to_end(); } } else { imp.is_sticky.set(is_at_bottom); } } } )); vadj.connect_upper_notify(clone!( #[weak] obj, move |_| { let imp = obj.imp(); if imp.should_stick.get() && imp.is_sticky.get() { obj.scroll_to_end(); } } )); vadj.connect_page_size_notify(clone!( #[weak] obj, move |_| { let imp = obj.imp(); if imp.should_stick.get() && imp.is_sticky.get() { obj.scroll_to_end(); } } )); obj.settings().connect_gtk_xft_dpi_notify(clone!( #[weak] obj, move |_| { obj.update_column_width_and_first_column_initial_x(); obj.update_first_column_x(); } )); obj.update_column_width_and_first_column_initial_x(); obj.update_first_column_x(); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for Diagram {} impl Diagram { fn selected_message(&self) -> Option { self.view.selected_message() } } } glib::wrapper! { pub struct Diagram(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl Diagram { /// Set whether to stick the view to the newest messages. pub fn set_should_stick(&self, should_stick: bool) { self.imp().should_stick.set(should_stick); } pub fn scroll_to(&self, message: &Message, flags: gtk::ListScrollFlags) -> Result<()> { self.imp().view.scroll_to(message, flags) } /// Returns the x coordinate where the first column should be drawn. fn first_column_initial_x(&self) -> f32 { adw::LengthUnit::Sp.to_px(FIRST_COLUMN_INITIAL_X_SP, Some(&self.settings())) as f32 } fn scroll_to_end(&self) { let imp = self.imp(); imp.is_auto_scrolling.set(true); imp.scrolled_window .emit_scroll_child(gtk::ScrollType::End, false); } /// This must be called when text scale factor changes fn update_column_width_and_first_column_initial_x(&self) { let imp = self.imp(); let column_width = adw::LengthUnit::Sp.to_px(COLUMN_WIDTH_SP, Some(&self.settings())) as f32; imp.header.set_column_width(column_width); imp.view.set_column_width(column_width); imp.view .set_first_column_initial_x(self.first_column_initial_x()); } /// This must be called when either: /// a. the view's horizontal adjustment changes /// b. the text scale factor changes fn update_first_column_x(&self) { let imp = self.imp(); let first_column_x = self.first_column_initial_x() - self .imp() .view .hadjustment() .map_or(0.0, |hadj| hadj.value() as f32); imp.header.set_first_column_x(first_column_x); imp.view.set_first_column_x(first_column_x); } } #[gtk::template_callbacks] impl Diagram { #[template_callback] fn view_selected_message_notify(&self) { self.notify_selected_message(); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/row.rs000066400000000000000000000120301525300766700242410ustar00rootroot00000000000000use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::{message::Message, timestamp::Timestamp}; mod imp { use std::cell::RefCell; use super::*; use crate::diagram::row_tag::RowTag; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::Row)] #[template(resource = "/org/freedesktop/Bustle/ui/diagram_row.ui")] pub struct Row { #[property(get, set = Self::set_message, explicit_notify, nullable)] pub(super) message: RefCell>, #[property(get, set = Self::set_head_message, explicit_notify, nullable)] pub(super) head_message: RefCell>, #[template_child] pub(super) timestamp_label: TemplateChild, #[template_child] pub(super) tag: TemplateChild, #[template_child] pub(super) vbox: TemplateChild, // Unused, but needed for disposal #[template_child] pub(super) title_label: TemplateChild, #[template_child] pub(super) subtitle_label: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for Row { const NAME: &'static str = "BustleDiagramRow"; type Type = super::Row; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_layout_manager_type::(); klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for Row { fn constructed(&self) { self.parent_constructed(); let layout_manager = self .obj() .layout_manager() .and_downcast::() .unwrap(); layout_manager.set_spacing(12); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for Row {} impl Row { fn set_message(&self, message: Option) { if message == self.message.replace(message.clone()) { return; } let obj = self.obj(); let message_tag = message.map(|m| m.message_tag()).unwrap_or_default(); self.tag.set_message_tag(message_tag); obj.update_timestamp_label(); obj.update_title_subtitle_labels(); obj.notify_message(); let manager = adw::StyleManager::default(); manager.connect_dark_notify(glib::clone!( #[weak] obj, move |_manager| { obj.update_title_subtitle_labels(); } )); } fn set_head_message(&self, head_message: Option) { if head_message == self.head_message.replace(head_message.clone()) { return; } let obj = self.obj(); obj.update_timestamp_label(); obj.notify_head_message(); } } } glib::wrapper! { pub struct Row(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl Row { fn update_timestamp_label(&self) { let imp = self.imp(); if let Some(message) = self.message() { let elapsed_ms = { let head_message = self .head_message() .expect("there must always be a head message if there is a message"); if head_message == message { Timestamp::default() } else { message.timestamp() - head_message.timestamp() } }; imp.timestamp_label .set_label(&format!("{} ms", elapsed_ms.as_millis_f64().round())); } else { imp.timestamp_label.set_label(""); } } fn update_title_subtitle_labels(&self) { let imp = self.imp(); if let Some(message) = self.message() { let title = message.path_display(); if message.message_type().is_method_return() { // We need to use `set_markup` even we don't use any markup because it somehow // fix issues where random part of the label is bold. Possibly, // a `GtkInscription` issue? imp.title_label.set_markup(&title); imp.subtitle_label .set_markup(&format!("{}", message.member_markup(true))); } else { imp.title_label .set_markup(&format!("{}", glib::markup_escape_text(&title))); imp.subtitle_label.set_markup(&message.member_markup(true)); } } else { imp.title_label.set_text(""); imp.subtitle_label.set_text(""); } } } impl Default for Row { fn default() -> Self { glib::Object::new() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/row_tag.rs000066400000000000000000000046141525300766700251050ustar00rootroot00000000000000use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::message_tag::MessageTag; mod imp { use std::cell::Cell; use super::*; use crate::color_widget::ColorWidget; #[derive(Debug, glib::Properties, Default, gtk::CompositeTemplate)] #[properties(wrapper_type = super::RowTag)] #[template(resource = "/org/freedesktop/Bustle/ui/diagram_row_tag.ui")] pub struct RowTag { #[property(get, set = Self::set_message_tag, explicit_notify, default)] pub(super) message_tag: Cell, #[template_child] pub(super) label: TemplateChild, #[template_child] pub(super) color: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for RowTag { const NAME: &'static str = "BustleDiagramRowTag"; type Type = super::RowTag; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.set_layout_manager_type::(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for RowTag { fn constructed(&self) { self.parent_constructed(); let layout_manager = self .obj() .layout_manager() .and_downcast::() .unwrap(); layout_manager.set_spacing(6); self.obj().update_color_and_label(); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for RowTag {} impl RowTag { fn set_message_tag(&self, tag: MessageTag) { let obj = self.obj(); if self.message_tag.get() == tag { return; } self.message_tag.set(tag); obj.update_color_and_label(); obj.notify_message_tag(); } } } glib::wrapper! { pub struct RowTag(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl RowTag { fn update_color_and_label(&self) { let imp = self.imp(); let tag = self.message_tag(); imp.color.set_rgba(tag.color()); imp.label.set_text(Some(&tag.name())); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/diagram/view.rs000066400000000000000000000720271525300766700244200ustar00rootroot00000000000000use anyhow::{Context, Result}; use gtk::{ gdk, glib::{self, clone}, graphene::{Point, Rect}, gsk, pango, prelude::*, subclass::prelude::*, }; use indexmap::IndexMap; use zbus::names::BusName; use crate::{ diagram::row::Row, filtered_message_model::FilteredMessageModel, message::{Message, ReceiveIndex}, message_type::MessageType, }; const COLUMN_LINE_WIDTH: f32 = 1.0; const ARROW_LINE_WIDTH: f32 = 2.0; /// Determines on what side the arc will curve enum ArcSide { Left, Right, } /// Determines the type of arrow tip enum ArrowTipType { Full, TopHalf, BottomHalf, } mod imp { use std::{ cell::{Cell, OnceCell, RefCell}, marker::PhantomData, }; use gtk::glib::WeakRef; use super::*; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::View)] #[template(resource = "/org/freedesktop/Bustle/ui/diagram_view.ui")] pub struct View { #[property(get = Self::selected_message)] pub(super) selected_message: PhantomData>, #[property(get, set = Self::set_column_width, explicit_notify)] pub(super) column_width: Cell, #[property(get, set = Self::set_first_column_x, explicit_notify)] pub(super) first_column_x: Cell, #[property(get, set = Self::set_first_column_initial_x, explicit_notify)] pub(super) first_column_initial_x: Cell, #[property(get = Self::hscroll_policy, set = Self::set_hscroll_policy, override_interface = gtk::Scrollable)] pub(super) hscroll_policy: PhantomData, #[property(get = Self::hadjustment, set = Self::set_hadjustment, override_interface = gtk::Scrollable)] pub(super) hadjustment: PhantomData>, #[property(get = Self::vscroll_policy, set = Self::set_vscroll_policy, override_interface = gtk::Scrollable)] pub(super) vscroll_policy: PhantomData, #[property(get = Self::vadjustment, set = Self::set_vadjustment, override_interface = gtk::Scrollable)] pub(super) vadjustment: PhantomData>, #[template_child] pub(super) list_view: TemplateChild, #[template_child] pub(super) selection_model: TemplateChild, pub(super) rows: RefCell>>, pub(super) row_width_request: Cell, pub(super) distance_between_rows_center: Cell>, pub(super) response_time_layout: OnceCell, } #[glib::object_subclass] impl ObjectSubclass for View { const NAME: &'static str = "BustleDiagramView"; type Type = super::View; type ParentType = gtk::Widget; type Interfaces = (gtk::Scrollable,); fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for View { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); obj.set_direction(gtk::TextDirection::Ltr); let layout = obj.create_pango_layout(None); self.response_time_layout.set(layout).unwrap(); obj.settings().connect_gtk_xft_dpi_notify(clone!( #[weak] obj, move |_| { obj.imp().distance_between_rows_center.set(None); } )); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for View { fn snapshot(&self, snapshot: >k::Snapshot) { let obj = self.obj(); if obj.model().n_items() == 0 { tracing::debug!("Filter list model is empty, not drawing"); self.parent_snapshot(snapshot); return; }; obj.draw_columns(snapshot); for row in self.rows.borrow().iter() { let Some(row) = row.upgrade() else { continue; }; if !row.is_drawable() { continue; } let Some(message) = row.message() else { continue; }; // Translate from row center coordinates to self coordinates let row_center_y = row .compute_point( &*obj, &Point::new(row.width() as f32 / 2.0, row.height() as f32 / 2.0), ) .unwrap() .y(); match message.message_type() { MessageType::MethodCall => { if let Err(err) = obj.draw_method_call(snapshot, &message, row_center_y) { tracing::warn!(%message, "Can't draw method call: {:?}", err); } } MessageType::MethodReturn | MessageType::Error => { let Some(call_message) = message.associated_message() else { tracing::warn!(%message, "Can't draw return message; it has no call message"); continue; }; if let Err(err) = obj.draw_method_return( snapshot, &call_message, &message, &row, row_center_y, ) { tracing::warn!(%call_message, %message, "Can't draw method return: {:?}", err); } } MessageType::Signal => { if let Err(err) = obj.draw_signal(snapshot, &message, row_center_y) { tracing::warn!(%message, "Can't draw signal: {:?}", err); } } } } self.parent_snapshot(snapshot); } fn measure(&self, orientation: gtk::Orientation, for_size: i32) -> (i32, i32, i32, i32) { self.list_view.measure(orientation, for_size) } fn size_allocate(&self, width: i32, height: i32, baseline: i32) { self.list_view .size_allocate(>k::Allocation::new(0, 0, width, height), baseline) } } impl ScrollableImpl for View {} impl View { fn selected_message(&self) -> Option { self.selection_model .selected_item() .map(|selected_item| selected_item.downcast().unwrap()) } fn set_column_width(&self, column_width: f32) { if column_width == self.column_width.get() { return; } self.column_width.set(column_width); let obj = self.obj(); obj.update_row_width_request(); obj.queue_draw(); obj.notify_column_width(); } fn set_first_column_x(&self, first_column_x: f32) { if first_column_x == self.first_column_x.get() { return; } self.first_column_x.set(first_column_x); let obj = self.obj(); obj.queue_draw(); obj.notify_first_column_x(); } fn set_first_column_initial_x(&self, first_column_initial_x: f32) { if first_column_initial_x == self.first_column_initial_x.get() { return; } self.first_column_initial_x.set(first_column_initial_x); let obj = self.obj(); obj.update_row_width_request(); obj.notify_first_column_x(); } fn hscroll_policy(&self) -> gtk::ScrollablePolicy { self.list_view.hscroll_policy() } fn set_hscroll_policy(&self, policy: gtk::ScrollablePolicy) { self.list_view.set_hscroll_policy(policy); } fn hadjustment(&self) -> Option { self.list_view.hadjustment() } fn set_hadjustment(&self, adj: Option<>k::Adjustment>) { self.list_view.set_hadjustment(adj); } fn vscroll_policy(&self) -> gtk::ScrollablePolicy { self.list_view.vscroll_policy() } fn set_vscroll_policy(&self, policy: gtk::ScrollablePolicy) { self.list_view.set_vscroll_policy(policy); } fn vadjustment(&self) -> Option { self.list_view.vadjustment() } fn set_vadjustment(&self, adj: Option<>k::Adjustment>) { self.list_view.set_vadjustment(adj); } } } glib::wrapper! { pub struct View(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible, gtk::Scrollable; } impl View { pub fn set_model(&self, model: &FilteredMessageModel) { let imp = self.imp(); model.filtered_bus_names().connect_items_changed(clone!( #[weak(rename_to = obj)] self, move |_, _, _, _| { obj.update_row_width_request(); } )); imp.selection_model.set_model(Some(model)); self.update_row_width_request(); } pub fn model(&self) -> FilteredMessageModel { self.imp() .selection_model .model() .expect("model must be set") .downcast() .unwrap() } pub fn unselect(&self) { self.imp() .selection_model .set_selected(gtk::INVALID_LIST_POSITION); } pub fn scroll_to(&self, message: &Message, flags: gtk::ListScrollFlags) -> Result<()> { let index = self .model() .get_index_of(message) .context("Message does not exist on the model")?; self.imp().list_view.scroll_to(index as u32, flags, None); Ok(()) } /// Returns the x coordinate where the given name must be placed fn x_for_name(&self, name: &BusName<'_>, receive_index: ReceiveIndex) -> Result { let model = self.model(); let bus_names = model.filtered_bus_names(); let bus_name_index = bus_names.get_index_of(name).or_else(|| { tracing::trace!("`{}` was not found in keys; looking for other names", name); match name { BusName::Unique(_) => None, BusName::WellKnown(wk_name) => { bus_names.get_index_of_wk_name(wk_name, receive_index.into()) } } }); if tracing::enabled!(tracing::Level::DEBUG) && bus_name_index.is_none() { // This makes it easier to read the names when debugging let bus_names = bus_names .iter() .map(|bus_name_item| { let name = bus_name_item.name(); let wk_names = bus_name_item.wk_names(receive_index.into()); ( name.to_string(), wk_names .iter() .map(|name| name.to_string()) .collect::>(), ) }) .collect::>(); tracing::debug!(?bus_names, "Index of `{}` in bus names was not found", name); } let bus_name_index = bus_name_index.context("Name not found in bus names")?; Ok(self.first_column_x() + self.column_width() * bus_name_index as f32) } /// Computes the distance from row center to an adjacent row's center, /// then caches and return it. This assumes that distance between row /// centers is consistent across rows, and thus heights. /// /// Returns None if there is no visible adjacent row /// /// This must be invalidated when the text scale factor changes fn distance_between_rows_center(&self, row: &Row, row_center_y: f32) -> Option { // FIXME Don't have any better idea to compute distance between rows centers let imp = self.imp(); if let Some(distance) = imp.distance_between_rows_center.get() { return Some(distance); } let parent = row.parent().unwrap(); // Get GtkListItemWidget let first_prev_adjacent_parent = parent.prev_sibling().filter(|w| w.is_drawable()); let second_prev_adjacent_parent = first_prev_adjacent_parent .as_ref() .and_then(|w| w.prev_sibling()) .filter(|w| w.is_drawable()); let first_next_adjacent_parent = parent.next_sibling().filter(|w| w.is_drawable()); let second_next_adjacent_parent = first_next_adjacent_parent .as_ref() .and_then(|w| w.next_sibling()) .filter(|w| w.is_drawable()); // Get the adjacent row which is farthest to the edge. For example, // we don't want to use an adjacent row clipped to the edge since GTK // doesn't correctly compute the row's center coordinates in that case. let adjacent_parent = match ( second_prev_adjacent_parent, first_prev_adjacent_parent, first_next_adjacent_parent, second_next_adjacent_parent, ) { (Some(_), Some(w), Some(_), Some(_)) | (Some(_), Some(w), Some(_), None) | (None, Some(_), Some(w), Some(_)) | (None, None, Some(w), Some(_)) | (Some(_), Some(w), None, None) | (None, Some(w), Some(_), None) | (None, None, Some(w), None) | (None, Some(w), None, None) => w, (None, None, None, None) => return None, (_, _, _, _) => unreachable!(), }; let adjacent_row = adjacent_parent .first_child() // Get our DiagramRow .unwrap() .downcast::() .unwrap(); debug_assert_eq!(adjacent_row.height(), row.height()); // Translate the adjacent row center coordinates into self's coordinates let adjacent_row_center_y = adjacent_row .compute_point( self, &Point::new( adjacent_row.width() as f32 / 2.0, adjacent_row.height() as f32 / 2.0, ), ) .unwrap() .y(); let ret = (adjacent_row_center_y - row_center_y).abs(); debug_assert!(ret >= row.height() as f32); imp.distance_between_rows_center.set(Some(ret)); Some(ret) } fn bounds(&self) -> Rect { Rect::new(0.0, 0.0, self.width() as f32, self.height() as f32) } fn arrow_stroke(&self) -> gsk::Stroke { gsk::Stroke::builder(ARROW_LINE_WIDTH) .line_join(gsk::LineJoin::Round) .line_cap(gsk::LineCap::Round) .build() } fn error_arrow_color(&self) -> gdk::RGBA { if adw::StyleManager::default().is_dark() { crate::colors::RED_1 } else { crate::colors::RED_3 } } fn method_arc_color(&self) -> gdk::RGBA { if adw::StyleManager::default().is_dark() { crate::colors::GREEN_3 } else { crate::colors::GREEN_5 } } fn draw_columns(&self, snapshot: >k::Snapshot) { let color = self.color(); let height = self.height(); let first_column_x = self.first_column_x(); let column_width = self.column_width(); let model = self.model(); let bus_names = model.filtered_bus_names(); let path_builder = gsk::PathBuilder::new(); let mut cursor_x = first_column_x; for _ in bus_names.iter() { let x = cursor_x.round(); path_builder.move_to(x, 0.0); path_builder.line_to(x, height as f32); cursor_x += column_width; } snapshot.push_stroke( &path_builder.to_path(), &gsk::Stroke::new(COLUMN_LINE_WIDTH), ); snapshot.append_color(&color.with_alpha(color.alpha() * 0.3), &self.bounds()); snapshot.pop(); } fn draw_method_call( &self, snapshot: >k::Snapshot, message: &Message, row_center_y: f32, ) -> Result<()> { let sender = message.sender().context("Call message has no sender")?; let destination = message .destination() .context("Call message has no destination")?; let start_x = self.x_for_name(&BusName::from(sender), message.receive_index())?; let end_x = self.x_for_name(&destination, message.receive_index())?; let path_builder = gsk::PathBuilder::new(); path_builder.add_arrow( &Point::new(start_x, row_center_y), &Point::new(end_x, row_center_y), ArrowTipType::TopHalf, ); snapshot.push_stroke(&path_builder.to_path(), &self.arrow_stroke()); snapshot.append_color(&self.color(), &self.bounds()); snapshot.pop(); Ok(()) } fn draw_method_return( &self, snapshot: >k::Snapshot, call_message: &Message, return_message: &Message, return_row: &Row, return_row_center_y: f32, ) -> Result<()> { const RESPONSE_TIME_LAYOUT_OFFSET_X: f32 = 20.0; let model = self.model(); let return_message_sender = return_message .sender() .context("Return message has no sender")?; debug_assert!( call_message .destination() .is_some_and(|call_message_destination| call_message_destination == return_message_sender || match call_message_destination { BusName::Unique(_) => false, BusName::WellKnown(ref wk_name) => model .filtered_bus_names() .get(&BusName::from(return_message_sender.as_ref())) .unwrap() .wk_names(return_message.receive_index().into()) .contains(wk_name), }) ); let call_message_sender = call_message .sender() .context("Call message has no sender")?; debug_assert!( return_message .destination() .is_some_and(|return_message_destination| return_message_destination == call_message_sender || match return_message_destination { BusName::Unique(_) => false, BusName::WellKnown(ref wk_name) => model .filtered_bus_names() .get(&BusName::from(call_message_sender.as_ref())) .unwrap() .wk_names(return_message.receive_index().into()) .contains(wk_name), }) ); let start_x = self.x_for_name( &BusName::from(return_message_sender), return_message.receive_index(), )?; let end_x = self.x_for_name( &BusName::from(call_message_sender), return_message.receive_index(), )?; let arrow_path_builder = gsk::PathBuilder::new(); arrow_path_builder.add_arrow( &Point::new(start_x, return_row_center_y), &Point::new(end_x, return_row_center_y), ArrowTipType::BottomHalf, ); let arrow_color = if return_message.message_type() == MessageType::Error { self.error_arrow_color() } else { self.color() }; snapshot.push_stroke(&arrow_path_builder.to_path(), &self.arrow_stroke()); snapshot.append_color(&arrow_color, &self.bounds()); snapshot.pop(); let call_row_center_y = { let return_message_index = model.get_index_of(return_message).unwrap(); let call_message_index = model.get_index_of(call_message).unwrap(); // We can't just use row heights as we also need to account for the paddings. let other_row_offset_y = self .distance_between_rows_center(return_row, return_row_center_y) .unwrap() * (return_message_index as f32 - call_message_index as f32); return_row_center_y - other_row_offset_y }; // TODO draw this arc as long as the rows in the middle of call and return // row is visible let arc_path_builder = gsk::PathBuilder::new(); arc_path_builder.add_arc( &Point::new(start_x, return_row_center_y), &Point::new(start_x, call_row_center_y), if (end_x - start_x).is_sign_positive() { ArcSide::Left } else { ArcSide::Right }, ); let arc_stroke = gsk::Stroke::new(ARROW_LINE_WIDTH); arc_stroke.set_dash(&[3.0, 3.0]); snapshot.push_stroke(&arc_path_builder.to_path(), &arc_stroke); snapshot.append_color(&self.method_arc_color(), &self.bounds()); snapshot.pop(); let response_time_layout = self .imp() .response_time_layout .get() .expect("response time layout must be set on construcetd"); response_time_layout.set_markup(&format!( r#"{} ms"#, (return_message.timestamp() - call_message.timestamp()) .as_millis_f64() .round() )); let (ink_extents, _) = response_time_layout.pixel_extents(); snapshot.save(); if (end_x - start_x).is_sign_positive() { snapshot.translate(&Point::new( start_x - RESPONSE_TIME_LAYOUT_OFFSET_X - ink_extents.width() as f32, return_row_center_y - ink_extents.height() as f32, )); } else { snapshot.translate(&Point::new( start_x + RESPONSE_TIME_LAYOUT_OFFSET_X, return_row_center_y - ink_extents.height() as f32, )); } snapshot.append_layout(response_time_layout, &self.color()); snapshot.restore(); Ok(()) } fn draw_signal( &self, snapshot: >k::Snapshot, message: &Message, row_center_y: f32, ) -> Result<()> { const CIRCLE_RADIUS: f32 = 5.0; const ARROW_END_OFFSET: f32 = 20.0; let sender = message.sender().context("Signal message has no sender")?; let start_x = self.x_for_name(&BusName::from(sender), message.receive_index())?; let path_builder = gsk::PathBuilder::new(); path_builder.add_circle(&Point::new(start_x, row_center_y), CIRCLE_RADIUS); if let Some(destination) = message.destination() { // This is a targeted signal let end_x = self.x_for_name(&destination, message.receive_index())?; path_builder.add_arrow( &Point::new( start_x + negate_if((end_x - start_x).is_sign_negative(), CIRCLE_RADIUS), row_center_y, ), &Point::new(end_x, row_center_y), ArrowTipType::Full, ); } else { let model = self.model(); let bus_names = model.filtered_bus_names(); let first_column_x = self.first_column_x(); let column_width = self.column_width(); // FIXME Is this correct that the arrows extend on all columns/names? // Left arrow path_builder.add_arrow( &Point::new(start_x - CIRCLE_RADIUS, row_center_y), &Point::new(first_column_x - ARROW_END_OFFSET, row_center_y), ArrowTipType::Full, ); // Right arrow path_builder.add_arrow( &Point::new(start_x + CIRCLE_RADIUS, row_center_y), &Point::new( first_column_x + column_width * (bus_names.n_items() - 1) as f32 + ARROW_END_OFFSET, row_center_y, ), ArrowTipType::Full, ); } snapshot.push_stroke(&path_builder.to_path(), &self.arrow_stroke()); snapshot.append_color(&self.color(), &self.bounds()); snapshot.pop(); Ok(()) } // This must be called when either: // a. the model is replaced // b. the filtered bus names items changed // c. first_column_initial_x or column_width changed fn update_row_width_request(&self) { let imp = self.imp(); let n_bus_names = self.model().filtered_bus_names().n_items(); let new_value = if n_bus_names == 0 { -1 } else { let column_width = self.column_width(); (self.first_column_initial_x() + column_width * n_bus_names as f32 - column_width / 2.0) .round() as i32 }; imp.row_width_request.set(new_value); for row in imp.rows.borrow().iter() { if let Some(row) = row.upgrade() { row.set_width_request(new_value); } } } } #[gtk::template_callbacks] impl View { #[template_callback] fn factory_setup(&self, list_item: &glib::Object) { let imp = self.imp(); let list_item = list_item.downcast_ref::().unwrap(); let row = Row::default(); row.set_width_request(imp.row_width_request.get()); list_item.set_child(Some(&row)); // Remove dead weak references imp.rows.borrow_mut().retain(|i| i.upgrade().is_some()); debug_assert_eq!(imp.rows.borrow().iter().filter(|i| **i == row).count(), 0); imp.rows.borrow_mut().push(row.downgrade()); } #[template_callback] fn factory_teardown(&self, list_item: &glib::Object) { let imp = self.imp(); let list_item = list_item.downcast_ref::().unwrap(); if let Some(row) = list_item.child() { let row = row.downcast_ref::().unwrap(); debug_assert_eq!(imp.rows.borrow().iter().filter(|i| *i == row).count(), 1); imp.rows .borrow_mut() .retain(|i| i.upgrade().is_some_and(|i| &i != row)); } } #[template_callback] fn factory_bind(&self, list_item: &glib::Object) { let list_item = list_item.downcast_ref::().unwrap(); let row = list_item.child().unwrap().downcast::().unwrap(); row.set_width_request(self.imp().row_width_request.get()); row.set_head_message( self.model() .item(0) .map(|model| model.downcast::().unwrap()), ); row.set_message( list_item .item() .map(|item| item.downcast::().unwrap()), ); } #[template_callback] fn factory_unbind(&self, list_item: &glib::Object) { let list_item = list_item.downcast_ref::().unwrap(); let row = list_item.child().unwrap().downcast::().unwrap(); row.set_width_request(-1); row.set_message(None::); row.set_head_message(None::); } #[template_callback] fn selection_model_selected_item_notify(&self) { self.notify_selected_message(); } } fn negate_if(negate: bool, num: f32) -> f32 { if negate { -num } else { num } } trait PathBuilderExt { fn add_arrow(&self, start: &Point, end: &Point, tip_type: ArrowTipType); fn add_arc(&self, start: &Point, end: &Point, arc_side: ArcSide); } impl PathBuilderExt for gsk::PathBuilder { fn add_arrow(&self, start: &Point, end: &Point, tip_type: ArrowTipType) { const TIP_OFFSET_X: f32 = 10.0; const TIP_OFFSET_Y: f32 = 5.0; self.move_to(start.x(), start.y()); self.line_to(end.x(), end.y()); let tip_offset_x = negate_if((end.x() - start.x()).is_sign_positive(), TIP_OFFSET_X); match tip_type { ArrowTipType::Full => { self.rel_move_to(tip_offset_x, -TIP_OFFSET_Y); self.line_to(end.x(), end.y()); self.rel_line_to(tip_offset_x, TIP_OFFSET_Y); } ArrowTipType::TopHalf => { self.rel_line_to(tip_offset_x, -TIP_OFFSET_Y); } ArrowTipType::BottomHalf => { self.rel_line_to(tip_offset_x, TIP_OFFSET_Y); } } } fn add_arc(&self, start: &Point, end: &Point, arc_side: ArcSide) { const MID_OFFSET_X: f32 = 50.0; let mid_x = (start.x() + end.x()) / 2.0; let mid_y = (start.y() + end.y()) / 2.0; self.move_to(start.x(), start.y()); self.quad_to( mid_x + negate_if(matches!(arc_side, ArcSide::Left), MID_OFFSET_X), mid_y, end.x(), end.y(), ); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/every_filter.rs000066400000000000000000000063221525300766700245340ustar00rootroot00000000000000use gtk::{ glib::{self, clone}, prelude::*, subclass::prelude::*, }; mod imp { use std::{cell::RefCell, collections::HashMap}; use super::*; #[derive(Default)] pub struct EveryFilter { pub(super) filters: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for EveryFilter { const NAME: &'static str = "BustleEveryFilter"; type Type = super::EveryFilter; type ParentType = gtk::Filter; } impl ObjectImpl for EveryFilter { fn dispose(&self) { let obj = self.obj(); obj.clear(); } } impl FilterImpl for EveryFilter { fn strictness(&self) -> gtk::FilterMatch { let mut ret = gtk::FilterMatch::All; for (filter, _) in self.filters.borrow().values() { match filter.strictness() { gtk::FilterMatch::Some => { ret = gtk::FilterMatch::Some; } gtk::FilterMatch::None => { return gtk::FilterMatch::None; } gtk::FilterMatch::All => {} _ => unreachable!(), } } ret } fn match_(&self, item: &glib::Object) -> bool { self.filters .borrow() .values() .all(|(filter, _)| filter.match_(item)) } } } glib::wrapper! { pub struct EveryFilter(ObjectSubclass) @extends gtk::Filter; } impl EveryFilter { pub fn contains(&self, id: &str) -> bool { self.imp().filters.borrow().contains_key(id) } pub fn insert(&self, id: impl Into, filter: impl IsA) -> bool { let imp = self.imp(); let signal_id = filter.connect_changed(clone!( #[weak(rename_to = obj)] self, move |_, change| { obj.changed(change); } )); let prev_value = imp .filters .borrow_mut() .insert(id.into(), (filter.as_ref().clone(), signal_id)); let had_prev_value = prev_value.is_some(); if let Some((prev_filter, prev_signal_id)) = prev_value { prev_filter.disconnect(prev_signal_id); self.changed(gtk::FilterChange::Different); } else { self.changed(gtk::FilterChange::MoreStrict); } !had_prev_value } pub fn remove(&self, id: &str) -> bool { let imp = self.imp(); let prev_value = imp.filters.borrow_mut().remove(id); let had_prev_value = prev_value.is_some(); if let Some((_, signal_id)) = prev_value { self.disconnect(signal_id); self.changed(gtk::FilterChange::LessStrict); } had_prev_value } pub fn clear(&self) { let imp = self.imp(); for (_, (filter, signal_id)) in imp.filters.take() { filter.disconnect(signal_id); } self.changed(gtk::FilterChange::LessStrict); } } impl Default for EveryFilter { fn default() -> Self { glib::Object::new() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filter_pane/000077500000000000000000000000001525300766700237545ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filter_pane/bus_name_row.rs000066400000000000000000000067451525300766700270160ustar00rootroot00000000000000use gtk::{ glib::{self, clone}, prelude::*, subclass::prelude::*, }; use crate::bus_name_item::BusNameItem; mod imp { use std::{cell::OnceCell, marker::PhantomData}; use super::*; use crate::bus_name_item::LookupPoint; #[derive(Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::BusNameRow)] #[template(resource = "/org/freedesktop/Bustle/ui/filter_pane_bus_name_row.ui")] pub struct BusNameRow { #[property(get, set, construct_only)] pub(super) bus_name_item: OnceCell, #[property(get = Self::is_active)] pub(super) is_active: PhantomData, #[template_child] pub(super) title: TemplateChild, #[template_child] pub(super) subtitle: TemplateChild, #[template_child] pub(super) check_button: TemplateChild, pub(super) check_button_active_notify_handler_id: OnceCell, } #[glib::object_subclass] impl ObjectSubclass for BusNameRow { const NAME: &'static str = "BustleFilterPaneBusNameRow"; type Type = super::BusNameRow; type ParentType = gtk::ListBoxRow; fn class_init(klass: &mut Self::Class) { klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for BusNameRow { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); let bus_name_item = obj.bus_name_item(); self.title.set_label(bus_name_item.name()); let subtitle_text = bus_name_item .wk_names(LookupPoint::Last) .iter() .filter_map(|n| n.split('.').next_back()) .collect::>() .join(", "); self.subtitle.set_label(&subtitle_text); self.subtitle.set_visible(!subtitle_text.is_empty()); let handler_id = self.check_button.connect_active_notify(clone!( #[weak] obj, move |_| { obj.notify_is_active(); } )); self.check_button_active_notify_handler_id .set(handler_id) .unwrap(); } } impl WidgetImpl for BusNameRow {} impl ListBoxRowImpl for BusNameRow {} impl BusNameRow { fn is_active(&self) -> bool { self.check_button.is_active() } } } glib::wrapper! { pub struct BusNameRow(ObjectSubclass) @extends gtk::Widget, gtk::ListBoxRow, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible, gtk::Actionable; } impl BusNameRow { pub fn new(bus_name_item: &BusNameItem) -> Self { glib::Object::builder() .property("bus-name-item", bus_name_item) .build() } pub fn handle_activation(&self) { let was_activated = self.imp().check_button.activate(); debug_assert!(was_activated); } pub fn set_selected_no_notify(&self, is_selected: bool) { let imp = self.imp(); let handler_id = imp.check_button_active_notify_handler_id.get().unwrap(); imp.check_button.block_signal(handler_id); imp.check_button.set_active(is_selected); imp.check_button.unblock_signal(handler_id); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filter_pane/message_tag_row.rs000066400000000000000000000063241525300766700274750ustar00rootroot00000000000000use gtk::{ glib::{self, clone}, prelude::*, subclass::prelude::*, }; use crate::message_tag::MessageTag; mod imp { use std::{cell::OnceCell, marker::PhantomData}; use super::*; use crate::color_widget::ColorWidget; #[derive(Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::MessageTagRow)] #[template(resource = "/org/freedesktop/Bustle/ui/filter_pane_message_tag_row.ui")] pub struct MessageTagRow { #[property(get, set, construct_only, default)] pub(super) message_tag: OnceCell, #[property(get = Self::is_active)] pub(super) is_active: PhantomData, #[template_child] pub(super) color: TemplateChild, #[template_child] pub(super) title: TemplateChild, #[template_child] pub(super) check_button: TemplateChild, pub(super) check_button_active_notify_handler_id: OnceCell, } #[glib::object_subclass] impl ObjectSubclass for MessageTagRow { const NAME: &'static str = "BustleFilterPaneMessageTagRow"; type Type = super::MessageTagRow; type ParentType = gtk::ListBoxRow; fn class_init(klass: &mut Self::Class) { klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for MessageTagRow { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); let message_tag = obj.message_tag(); self.title.set_label(&message_tag.name()); self.color.set_rgba(message_tag.color()); let handler_id = self.check_button.connect_active_notify(clone!( #[weak] obj, move |_| { obj.notify_is_active(); } )); self.check_button_active_notify_handler_id .set(handler_id) .unwrap(); } } impl WidgetImpl for MessageTagRow {} impl ListBoxRowImpl for MessageTagRow {} impl MessageTagRow { fn is_active(&self) -> bool { self.check_button.is_active() } } } glib::wrapper! { pub struct MessageTagRow(ObjectSubclass) @extends gtk::Widget, gtk::ListBoxRow, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible, gtk::Actionable; } impl MessageTagRow { pub fn new(bus_name_item: &MessageTag) -> Self { glib::Object::builder() .property("message-tag", bus_name_item) .build() } pub fn handle_activation(&self) { let was_activated = self.imp().check_button.activate(); debug_assert!(was_activated); } pub fn set_selected_no_notify(&self, is_selected: bool) { let imp = self.imp(); let handler_id = imp.check_button_active_notify_handler_id.get().unwrap(); imp.check_button.block_signal(handler_id); imp.check_button.set_active(is_selected); imp.check_button.unblock_signal(handler_id); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filter_pane/mod.rs000066400000000000000000000211471525300766700251060ustar00rootroot00000000000000mod bus_name_row; mod message_tag_row; use gtk::{ glib::{self, clone, translate::FromGlib}, prelude::*, subclass::prelude::*, }; use crate::{ bus_name_item::BusNameItem, bus_name_list::BusNameList, filter_pane::{bus_name_row::BusNameRow, message_tag_row::MessageTagRow}, filtered_message_model::FilteredMessageModel, message_tag::MessageTag, }; mod imp { use std::cell::{OnceCell, RefCell}; use super::*; #[derive(Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::FilterPane)] #[template(resource = "/org/freedesktop/Bustle/ui/filter_pane.ui")] pub struct FilterPane { #[property(get, set = Self::set_model)] pub(super) model: OnceCell, #[template_child] pub(super) toolbar_view: TemplateChild, /* Unused, but needed for * disposal */ #[template_child] pub(super) message_tag_list_box: TemplateChild, #[template_child] pub(super) bus_name_list_box: TemplateChild, pub(super) message_tag_model: RefCell>, pub(super) bus_name_model: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for FilterPane { const NAME: &'static str = "BustleFilterPane"; type Type = super::FilterPane; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); klass.set_layout_manager_type::(); klass.install_action( "filter-pane.unselect-all-message-tags", None, |obj, _, _| { obj.message_tag_rows_set_selected_no_notify(false); if let Some(model) = obj.imp().message_tag_model.borrow().as_ref() { for item in model.iter::() { let enum_list_item = item.unwrap(); let message_tag = unsafe { MessageTag::from_glib(enum_list_item.value()) }; obj.model().add_message_tag_filter(message_tag); } } }, ); klass.install_action("filter-pane.unselect-all-bus-names", None, |obj, _, _| { obj.bus_name_rows_set_selected_no_notify(false); if let Some(model) = obj.imp().bus_name_model.borrow().as_ref() { for item in model.iter::() { let bus_name_item = item.unwrap(); obj.model() .add_bus_name_filter(bus_name_item.name()) .unwrap(); } } }); klass.install_action("filter-pane.select-all-message-tags", None, |obj, _, _| { obj.message_tag_rows_set_selected_no_notify(true); obj.model().remove_all_message_tag_filters(); }); klass.install_action("filter-pane.select-all-bus-names", None, |obj, _, _| { obj.bus_name_rows_set_selected_no_notify(true); obj.model().remove_all_bus_name_filters(); }); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for FilterPane { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); let message_tag_model = gtk::EnumList::new(MessageTag::static_type()); self.message_tag_list_box.bind_model( Some(&message_tag_model), clone!( #[weak] obj, #[upgrade_or_panic] move |item| { let enum_list_item = item.downcast_ref::().unwrap(); let message_tag = unsafe { MessageTag::from_glib(enum_list_item.value()) }; obj.create_message_tag_row(message_tag).upcast() } ), ); self.message_tag_model.replace(Some(message_tag_model)); } fn dispose(&self) { self.dispose_template(); } } impl WidgetImpl for FilterPane {} impl FilterPane { fn set_model(&self, model: FilteredMessageModel) { let obj = self.obj(); self.bus_name_model.replace(None); model .filtered_bus_names() .connect_bus_name_list_notify(clone!( #[weak] obj, move |filtered_bus_names| { let imp = obj.imp(); obj.message_tag_rows_set_selected_no_notify(true); obj.bus_name_rows_set_selected_no_notify(true); let bus_name_model = filtered_bus_names.bus_name_list(); imp.bus_name_list_box.bind_model( bus_name_model.as_ref(), clone!( #[weak] obj, #[upgrade_or_panic] move |item| { let bus_name_item = item.downcast_ref().unwrap(); obj.create_bus_name_row(bus_name_item).upcast() } ), ); imp.bus_name_model.replace(bus_name_model); } )); self.model.set(model).unwrap(); } } } glib::wrapper! { pub struct FilterPane(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl FilterPane { fn create_message_tag_row(&self, message_tag: MessageTag) -> MessageTagRow { let row = MessageTagRow::new(&message_tag); row.connect_is_active_notify(clone!( #[weak(rename_to = obj)] self, move |row| { let model = obj.model(); let message_tag = row.message_tag(); if row.is_active() { model.remove_message_tag_filter(message_tag); } else { model.add_message_tag_filter(message_tag); } } )); row } fn create_bus_name_row(&self, bus_name_item: &BusNameItem) -> BusNameRow { let row = BusNameRow::new(bus_name_item); row.connect_is_active_notify(clone!( #[weak(rename_to = obj)] self, move |row| { let model = obj.model(); let bus_name_item = row.bus_name_item(); let name = bus_name_item.name(); if row.is_active() { model.remove_bus_name_filter(name); } else { model.add_bus_name_filter(name).unwrap(); } } )); row } fn message_tag_rows_set_selected_no_notify(&self, is_selected: bool) { let imp = self.imp(); let mut curr = imp.message_tag_list_box.first_child(); while let Some(child) = &curr { let message_tag_row = child.downcast_ref::().unwrap(); message_tag_row.set_selected_no_notify(is_selected); curr = child.next_sibling(); } } fn bus_name_rows_set_selected_no_notify(&self, is_selected: bool) { let imp = self.imp(); let mut curr = imp.bus_name_list_box.first_child(); while let Some(child) = &curr { let bus_name_row = child.downcast_ref::().unwrap(); bus_name_row.set_selected_no_notify(is_selected); curr = child.next_sibling(); } } } #[gtk::template_callbacks] impl FilterPane { #[template_callback] fn message_tag_list_box_row_activated(&self, row: >k::ListBoxRow) { let message_tag_row = row.downcast_ref::().unwrap(); message_tag_row.handle_activation(); } #[template_callback] fn bus_name_list_box_row_activated(&self, row: >k::ListBoxRow) { let bus_name_row = row.downcast_ref::().unwrap(); bus_name_row.handle_activation(); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filtered_bus_name_model.rs000066400000000000000000000075401525300766700266670ustar00rootroot00000000000000use gtk::{ gio, glib::{self, clone}, prelude::*, subclass::prelude::*, }; use zbus::names::{BusName, WellKnownName}; use crate::{ bus_name_item::{BusNameItem, LookupPoint}, bus_name_list::BusNameList, }; mod imp { use std::marker::PhantomData; use super::*; #[derive(Default, glib::Properties)] #[properties(wrapper_type = super::FilteredBusNameModel)] pub struct FilteredBusNameModel { #[property(get = Self::bus_name_list, set = Self::set_bus_name_list, explicit_notify, nullable)] pub(super) bus_name_list: PhantomData>, pub(super) inner: gtk::FilterListModel, } #[glib::object_subclass] impl ObjectSubclass for FilteredBusNameModel { const NAME: &'static str = "BustleFilteredBusNameModel"; type Type = super::FilteredBusNameModel; type Interfaces = (gio::ListModel,); } #[glib::derived_properties] impl ObjectImpl for FilteredBusNameModel { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); self.inner.connect_items_changed(clone!( #[weak] obj, move |_, position, removed, added| { obj.items_changed(position, removed, added); } )); } } impl ListModelImpl for FilteredBusNameModel { fn item_type(&self) -> glib::Type { BusNameItem::static_type() } fn n_items(&self) -> u32 { self.inner.n_items() } fn item(&self, position: u32) -> Option { self.inner.item(position) } } impl FilteredBusNameModel { fn set_bus_name_list(&self, bus_name_list: Option<&BusNameList>) { let obj = self.obj(); if bus_name_list == obj.bus_name_list().as_ref() { return; } self.inner.set_model(bus_name_list); obj.notify_bus_name_list(); } fn bus_name_list(&self) -> Option { self.inner.model().map(|model| model.downcast().unwrap()) } } } glib::wrapper! { pub struct FilteredBusNameModel(ObjectSubclass) @implements gio::ListModel; } impl FilteredBusNameModel { /// This must only be called within `FilteredMessageModel` pub fn set_filter(&self, filter: Option<&impl IsA>) { self.imp().inner.set_filter(filter); } pub fn iter(&self) -> impl Iterator + '_ { ListModelExtManual::iter(self).map(|item| item.unwrap()) } // TODO the following could be optimize if we don't rely on GTK's // `FilterListModel` /// Returns the `BusNameItem` with the given `bus_name` as item's `name` pub fn get(&self, bus_name: &BusName<'_>) -> Option { self.iter() .find(|bus_name_item| *bus_name_item.name() == *bus_name) } /// Returns the index of `BusNameItem` with the given `bus_name` as item's /// `name` pub fn get_index_of(&self, bus_name: &BusName<'_>) -> Option { self.iter() .position(|bus_name_item| *bus_name_item.name() == *bus_name) } /// Returns the index of `BusNameItem` containing the `wk_name` at the given /// lookup point. pub fn get_index_of_wk_name( &self, wk_name: &WellKnownName<'_>, lookup_point: LookupPoint, ) -> Option { debug_assert_eq!( self.get(&BusName::from(wk_name.as_ref())), None, "`get` or `get_index_of` must be used first" ); self.iter() .position(|bus_name_item| bus_name_item.wk_names(lookup_point).contains(wk_name)) } } impl Default for FilteredBusNameModel { fn default() -> Self { glib::Object::new() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/filtered_message_model.rs000066400000000000000000000245301525300766700265200ustar00rootroot00000000000000use anyhow::{Context, Result}; use gtk::{ gio, glib::{self, clone}, prelude::*, subclass::prelude::*, }; use zbus::{fdo::DBusProxy, names::BusName, proxy::Defaults}; use crate::{ bus_name_item::{BusNameItem, LookupPoint}, every_filter::EveryFilter, filtered_bus_name_model::FilteredBusNameModel, message::Message, message_list::MessageList, message_tag::MessageTag, multi_set::MultiSet, }; mod imp { use std::cell::RefCell; use indexmap::IndexSet; use super::*; #[derive(Default)] pub struct FilteredMessageModel { pub(super) inner: gtk::FilterListModel, pub(super) inner_index: RefCell>, pub(super) filtered_bus_names: FilteredBusNameModel, pub(super) used_bus_names: RefCell>>, pub(super) message_tag_filter: EveryFilter, pub(super) bus_name_filter: EveryFilter, } #[glib::object_subclass] impl ObjectSubclass for FilteredMessageModel { const NAME: &'static str = "BustleFilteredMessageModel"; type Type = super::FilteredMessageModel; type Interfaces = (gio::ListModel,); } impl ObjectImpl for FilteredMessageModel { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); let bus_names_filter = gtk::CustomFilter::new(clone!( #[weak] obj, #[upgrade_or_panic] move |bus_name_item| { let bus_name_item = bus_name_item.downcast_ref::().unwrap(); obj.bus_names_filter_func(bus_name_item) } )); self.inner.connect_items_changed(clone!( #[weak] obj, #[weak] bus_names_filter, move |_, position, removed, added| { obj.update_inner_index(position, removed, added); bus_names_filter.changed(gtk::FilterChange::Different); obj.items_changed(position, removed, added); } )); self.filtered_bus_names.set_filter(Some(&bus_names_filter)); let filter = gtk::EveryFilter::new(); filter.append(gtk::CustomFilter::new(|message| { let message = message.downcast_ref::().unwrap(); // TODO: define the exact rules and document why are these filtered out &message.destination() != DBusProxy::DESTINATION && message.sender().as_deref() != DBusProxy::DESTINATION.as_deref() })); filter.append(self.message_tag_filter.clone()); filter.append(self.bus_name_filter.clone()); self.inner.set_filter(Some(&filter)); } } impl ListModelImpl for FilteredMessageModel { fn item_type(&self) -> glib::Type { Message::static_type() } fn n_items(&self) -> u32 { self.inner.n_items() } fn item(&self, position: u32) -> Option { self.inner.item(position) } } } glib::wrapper! { pub struct FilteredMessageModel(ObjectSubclass) @implements gio::ListModel; } impl FilteredMessageModel { /// This also resets the filters pub fn set_message_list(&self, message_list: Option<&MessageList>) { self.remove_all_bus_name_filters(); self.remove_all_message_tag_filters(); let imp = self.imp(); // Must set the model for `inner` first to have used names updated imp.inner.set_model(message_list); imp.filtered_bus_names .set_bus_name_list(message_list.map(|l| l.bus_names())); } pub fn message_list(&self) -> Option { self.imp() .inner .model() .map(|model| model.downcast().unwrap()) } pub fn get_index_of(&self, message: &Message) -> Option { self.imp().inner_index.borrow().get_index_of(message) } pub fn iter(&self) -> impl ExactSizeIterator + DoubleEndedIterator + '_ { ListModelExtManual::iter(self).map(|item| item.unwrap()) } /// Returns the filtered bus names from self's message list with respect to /// self's filters pub fn filtered_bus_names(&self) -> &FilteredBusNameModel { &self.imp().filtered_bus_names } /// Adds filter that filters out messages with the given tag pub fn add_message_tag_filter(&self, message_tag: MessageTag) { let imp = self.imp(); let filter_id = message_tag.to_string(); if imp.message_tag_filter.contains(&filter_id) { return; } let custom_filter = gtk::CustomFilter::new(move |message| { let message = message.downcast_ref::().unwrap(); message.message_tag() != message_tag }); let is_unique = imp.message_tag_filter.insert(filter_id, custom_filter); debug_assert!(is_unique); } /// Removes the filter that filters out messages with the given tag pub fn remove_message_tag_filter(&self, message_tag: MessageTag) { let imp = self.imp(); let filter_id = message_tag.to_string(); let was_removed = imp.message_tag_filter.remove(&filter_id); debug_assert!(was_removed); } pub fn remove_all_message_tag_filters(&self) { let imp = self.imp(); imp.message_tag_filter.clear(); } /// Adds filter that filters out messages relevant to `BusNameItem` with /// `bus_name` equals given `name` /// /// Returns an error if self has no `message_list` pub fn add_bus_name_filter(&self, name: &BusName<'_>) -> Result<()> { let imp = self.imp(); if imp.bus_name_filter.contains(name) { return Ok(()); } let bus_name_item = self .message_list() .context("Message list was not set")? .bus_names() .get(name) .unwrap(); let custom_filter = gtk::CustomFilter::new(move |message| { let message = message.downcast_ref::().unwrap(); let name = bus_name_item.name(); message.sender().is_none_or(|sender| *name != sender) && !message.destination().is_some_and(|destination| { *name == destination || match destination { BusName::Unique(_) => false, BusName::WellKnown(wk_name) => bus_name_item .wk_names(message.receive_index().into()) .contains(&wk_name), } }) }); let is_unique = imp.bus_name_filter.insert(name.to_string(), custom_filter); debug_assert!(is_unique); Ok(()) } /// Removes the filter that is relevant to `BusNameItem` with `bus_name` /// equals given `name` /// /// Returns true if the filter existed and removed pub fn remove_bus_name_filter(&self, name: &BusName<'static>) { let imp = self.imp(); let was_removed = imp.bus_name_filter.remove(name); debug_assert!(was_removed); } pub fn remove_all_bus_name_filters(&self) { let imp = self.imp(); imp.bus_name_filter.clear(); } fn bus_names_filter_func(&self, bus_name_item: &BusNameItem) -> bool { let used_names = self.imp().used_bus_names.borrow(); used_names.contains(bus_name_item.name()) || bus_name_item .wk_names(LookupPoint::All) .iter() .any(|wk_name| used_names.contains(&BusName::from(wk_name.as_ref()))) } fn update_inner_index(&self, position: u32, removed: u32, added: u32) { let imp = self.imp(); let mut inner_index = imp.inner_index.borrow_mut(); let mut used_bus_names = imp.used_bus_names.borrow_mut(); let added_items = (0..added) .map(|i| { imp.inner .item(position + i) .unwrap() .downcast::() .unwrap() }) .collect::>(); let used_sender_names = added_items .iter() .filter_map(|message| message.sender().map(|s| BusName::from(s.to_owned()))); let used_destination_names = added_items .iter() .filter_map(|message| message.destination().map(|d| d.to_owned())); used_bus_names.extend(used_sender_names.chain(used_destination_names)); let removed_items = inner_index .splice( position as usize..(removed + position) as usize, added_items, ) .collect::>(); let removed_sender_names = removed_items .iter() .filter_map(|message| message.sender().map(|s| BusName::from(s.to_owned()))); let removed_destination_names = removed_items .iter() .filter_map(|message| message.destination().map(|d| d.to_owned())); removed_sender_names .chain(removed_destination_names) .for_each(|bus_name| { used_bus_names.remove(bus_name); }); // Ensure that `inner_index` items are exactly the same as the items in `inner` debug_assert_eq!(inner_index.len(), imp.inner.n_items() as usize); debug_assert!( self.iter() .zip(inner_index.iter()) .all(|(inner_item, inner_index_item)| inner_item == *inner_index_item) ); // Ensure that all bus names in `inner_index` are in `used_bus_names`. debug_assert!(self.iter().all(|message| { [message.sender().map(BusName::from), message.destination()] .iter() .flatten() .all(|bus_name| used_bus_names.contains(bus_name)) })); // Ensure that only bus names in `inner_index` are in `used_bus_names`. Note: // This assertion is very expensive. debug_assert!(used_bus_names.iter_unique().all(|bus_name| { self.iter().any(|message| { message.sender().is_some_and(|s| *bus_name == s) || message.destination().is_some_and(|d| *bus_name == d) }) })); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/main.rs000066400000000000000000000030171525300766700227570ustar00rootroot00000000000000#![warn(rust_2018_idioms)] mod address_dialog; mod application; #[rustfmt::skip] mod config; mod bus_name_item; mod bus_name_list; mod busctl_cmd; mod color_widget; mod colors; mod details_view; mod diagram; mod every_filter; mod filter_pane; mod filtered_bus_name_model; mod filtered_message_model; mod message; mod message_fmt; mod message_list; mod message_tag; mod message_type; mod monitor; mod multi_set; mod pcap_reader; mod statistics; mod timestamp; mod window; use std::sync::LazyLock; use gettextrs::LocaleCategory; use gtk::{gio, glib}; pub static RUNTIME: LazyLock = LazyLock::new(|| tokio::runtime::Runtime::new().unwrap()); use self::{ application::Application, config::{GETTEXT_PACKAGE, LOCALEDIR, RESOURCES_FILE}, }; #[derive(Debug, Clone)] pub enum ConnectionType { Session, System, Address(String), } fn main() -> glib::ExitCode { // Initialize logger tracing_subscriber::fmt::init(); // Safety: setlocale() is safe to call because at this point the program is // single-threaded unsafe { gettextrs::setlocale(LocaleCategory::LcAll, "") }; gettextrs::bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); gettextrs::textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); glib::set_application_name("Bustle"); let res = gio::Resource::load(RESOURCES_FILE).expect("Could not load gresource file"); gio::resources_register(&res); let app = Application::default(); app.run() } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/meson.build000066400000000000000000000037241525300766700236340ustar00rootroot00000000000000global_conf = configuration_data() global_conf.set_quoted('APP_ID', application_id) global_conf.set_quoted('PKGDATADIR', pkgdatadir) global_conf.set_quoted('PROFILE', profile) global_conf.set_quoted('VERSION', version + version_suffix) global_conf.set_quoted('GETTEXT_PACKAGE', gettext_package) global_conf.set_quoted('LOCALEDIR', localedir) config = configure_file( input: 'config.rs.in', output: 'config.rs', configuration: global_conf ) # Copy the config.rs output to the source directory. run_command( 'cp', meson.project_build_root() / 'src' / 'config.rs', meson.project_source_root() / 'src' / 'config.rs', check: true ) if get_option('profile') == 'default' cargo_release_options = [ '--release' ] cargo_clippy_deny_warnings = [] rust_target = 'release' message('Building in release mode') else cargo_release_options = [] cargo_clippy_deny_warnings = [ '--', '--deny', 'warnings', ] rust_target = 'debug' message('Building in debug mode') endif cargo_build_options = [ '--manifest-path', meson.project_source_root() / 'Cargo.toml', cargo_release_options, ] cargo_build = custom_target( 'cargo-build', build_by_default: true, build_always_stale: true, output: meson.project_name(), console: true, install: true, install_dir: bindir, depends: resources, env: cargo_env, command: [ cargo, 'build', cargo_build_options, '&&', 'cp', cargo_target / rust_target / meson.project_name(), '@OUTPUT@', ] ) cargo_extra_options = [ cargo_build_options, '--all-targets', '--all-features', '--workspace', ] cargo_test_options = cargo_extra_options test( 'cargo-test', cargo, args: [ 'test', cargo_test_options, ], env: cargo_env, timeout: 400, ) cargo_clippy_options = [ cargo_extra_options, cargo_clippy_deny_warnings, ] test( 'cargo-clippy', cargo, args: [ 'clippy', cargo_clippy_options, ], env: cargo_env, timeout: 400, # cargo might take a bit of time sometimes ) bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/message.rs000066400000000000000000000340031525300766700234560ustar00rootroot00000000000000use gettextrs::gettext; use gtk::{glib, prelude::*, subclass::prelude::*}; use zbus::{ names::{BusName, UniqueName, WellKnownName}, zvariant, }; use crate::{ ConnectionType, message_tag::MessageTag, message_type::MessageType, monitor::Event, timestamp::Timestamp, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct ReceiveIndex(u32); mod imp { use std::cell::{Cell, OnceCell}; use super::*; #[derive(Debug, Default, glib::Properties)] #[properties(wrapper_type = super::Message)] pub struct Message { #[property(get, set, construct_only, default)] pub(super) message_type: Cell, #[property(get, set, construct_only)] pub(super) timestamp: OnceCell, #[property(get, set, default)] pub(super) message_tag: Cell, pub(super) inner: OnceCell, pub(super) receive_index: OnceCell, pub(super) associated_message: OnceCell>, } #[glib::object_subclass] impl ObjectSubclass for Message { const NAME: &'static str = "BustleMessage"; type Type = super::Message; } #[glib::derived_properties] impl ObjectImpl for Message {} } glib::wrapper! { pub struct Message(ObjectSubclass); } impl Message { pub fn from_event(event: Event) -> Self { let this = glib::Object::builder::() .property( "message-type", MessageType::from(event.message.message_type()), ) .property("timestamp", event.timestamp) .build(); this.imp().inner.set(event.message).unwrap(); this } pub fn to_event(&self) -> Event { Event { message: self.imp().inner.get().unwrap().clone(), timestamp: self.timestamp(), } } fn inner(&self) -> &zbus::Message { self.imp().inner.get().unwrap() } /// Return the length of the whole message pub fn len(&self) -> usize { self.inner().data().len() } /// Return the message body pub fn body(&self) -> zbus::message::Body { self.inner().body() } /// Return the message header pub fn header(&self) -> zbus::message::Header<'_> { self.inner().header() } /// Return the time it took to receive a response or None if it is a signal /// or no message is associated to the current one pub fn response_time(&self) -> Option { let associated_message = self.associated_message()?; match self.message_type() { MessageType::Signal => None, MessageType::MethodReturn | MessageType::Error => { Some(self.timestamp() - associated_message.timestamp()) } MessageType::MethodCall => Some(associated_message.timestamp() - self.timestamp()), } } pub fn set_receive_index(&self, raw_receive_index: u32) { self.imp() .receive_index .set(ReceiveIndex(raw_receive_index)) .expect("receive index must only be set once"); } pub fn receive_index(&self) -> ReceiveIndex { *self.imp().receive_index.get().unwrap() } pub fn set_associated_message(&self, message: &Self) { if self .imp() .associated_message .set(message.downgrade()) .is_err() { // Method call can somehow be associated with multiple replies, so simply ignore // the subsequent ones. if self .associated_message() .is_some_and(|curr| curr.is_return_of(self) && message.is_return_of(self)) { tracing::debug!("Associated message was already set to the same message"); } else { unreachable!("associated message must only be set once"); } } } pub fn associated_message(&self) -> Option { self.imp() .associated_message .get() .and_then(|m| m.upgrade()) } pub fn sender_display(&self) -> String { if self.message_type().is_method_return() { self.associated_message() .as_ref() .and_then(|m| m.destination()) .map(|d| d.to_string()) } else { self.sender().map(|m| m.to_string()) } .unwrap_or_else(|| "(no sender)".to_owned()) } pub fn member_display(&self) -> String { if self.message_type().is_method_return() { self.associated_message() .as_ref() .map(|m| m.header()) .and_then(|h| h.member().map(|m| m.to_string())) } else { self.header().member().map(|m| m.to_string()) } .unwrap_or_else(|| "(no member)".to_owned()) } pub fn interface_display(&self) -> String { if self.message_type().is_method_return() { self.associated_message() .as_ref() .map(|m| m.header()) .and_then(|h| h.interface().map(|m| m.to_string())) } else { self.header().interface().map(|s| s.to_string()) } .unwrap_or_else(|| "(no interface)".to_owned()) } pub fn destination_display(&self) -> String { if self.message_type().is_method_return() { self.associated_message() .as_ref() .and_then(|m| m.sender()) .map(|s| s.to_string()) } else { self.destination().map(|m| m.to_string()) } .unwrap_or_else(|| "(no destination)".to_owned()) } pub fn path_display(&self) -> String { if self.message_type().is_method_return() { self.associated_message() .as_ref() .and_then(|m| m.header().path().map(|p| p.to_string())) } else { self.header().path().map(|p| p.to_string()) } .unwrap_or_else(|| "(no path)".to_owned()) } pub fn flags_display(&self) -> String { self.header() .primary() .flags() .iter() .map(|flag| match flag { zbus::message::Flags::NoReplyExpected => gettext("No Reply Expected"), zbus::message::Flags::NoAutoStart => gettext("No Auto Start"), zbus::message::Flags::AllowInteractiveAuth => { gettext("Allow Interactive Authentication") } }) .collect::>() .join(" | ") } pub fn member_markup(&self, render_error: bool) -> String { let interface = self.interface_display(); let member = self.member_display(); if self.message_type() == MessageType::Error && render_error { // This is the .error class at // https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/css-variables.html#error-colors. let foreground = if adw::StyleManager::default().is_dark() { "#ff938c" } else { "#c30000" }; format!( "{}.{}", glib::markup_escape_text(&interface), glib::markup_escape_text(&member) ) } else { format!( "{}.{}", glib::markup_escape_text(&interface), glib::markup_escape_text(&member) ) } } pub fn sender(&self) -> Option> { self.header().sender().cloned() } pub fn destination(&self) -> Option> { self.header().destination().cloned().or_else(|| { match self.message_type() { MessageType::MethodCall => Some("method.call.destination"), MessageType::MethodReturn => Some("method.return.destination"), MessageType::Error => Some("method.error.destination"), _ => None, } .map(|raw_name| { let ret = BusName::WellKnown(WellKnownName::from_static_str(raw_name).unwrap()); debug_assert!(Self::is_fallback_destination(&ret)); ret }) }) } /// Whether `name` is used as a fallback destination internally pub fn is_fallback_destination(name: &BusName<'_>) -> bool { match name { BusName::Unique(_) => false, BusName::WellKnown(wk_name) => matches!( wk_name.as_str(), "method.call.destination" | "method.return.destination" | "method.error.destination" ), } } /// Whether this is the return/error message of `other` pub fn is_return_of(&self, other: &Self) -> bool { debug_assert!(self.message_type().is_method_return()); other.message_type().is_method_call() && self.header().reply_serial() == Some(other.header().primary().serial_num()) && self.destination() == other.sender().map(From::from) } pub fn print_as_busctl( &self, connection_type: Option, ) -> anyhow::Result { use crate::busctl_cmd::{BusctlCommand, BusctlSubCommand}; let sub_command = match self.message_type() { MessageType::Signal => BusctlSubCommand::Wait, MessageType::MethodCall => BusctlSubCommand::Call, MessageType::MethodReturn | MessageType::Error => unimplemented!(), }; let body = self.body(); // TODO Do we need this guard? Add a test for a method without an arg. let body_structure = if self.header().signature() != &zvariant::Signature::Unit { match body.deserialize::>() { Ok(structure) => Some(structure), Err(err) => anyhow::bail!("Could not deserialize structure: {err}"), } } else { None }; let header = self.header(); let args = BusctlCommand { // NOTE: When reading a cap file there is no way to tell on which // bus we are. By default we assume it is a session connection connection_type: connection_type.unwrap_or(ConnectionType::Session), sub_command, destination: self.destination(), sender: self.sender(), path: header.path(), interface: header.interface(), member: header.member(), signature: header.signature(), body_structure, }; args.into_command_string() } } impl std::fmt::Display for Message { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Message") .field("path", &self.path_display()) .field("destination", &self.destination_display()) .field("sender", &self.sender_display()) .field("member", &self.member_display()) .field("interface", &self.interface_display()) .field("type", &self.message_type()) .field("associated_message", &self.associated_message()) .finish() } } #[cfg(test)] mod tests { use base64::prelude::*; use super::*; #[test] fn test_print_portal_call_as_busctl() { // This is a message captured with wireshark. The window handled comes // from test_shell_escape. let expected_cmd = "busctl --user call org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop org.freedesktop.portal.OpenURI OpenURI 'ssa{sv}' 'wayland:1zb*ehkl'\\''MwqCXbcN-T=8EGr&7'\\!'zB'\\''_0' 'https://github.com/bilelmoussaoui/ashpd' 3 ask b false handle_token s ashpd_VoXzDnLLr8 writeable b false"; let message_base64 = b"bAEAAbgAAAAoAAAApwAAAAEBbwAfAAAAL29yZy9mcmVlZGVza3RvcC9wb3J0YWwvZGVza3RvcAACAXMAHgAAAG9yZy5mcmVlZGVza3RvcC5wb3J0YWwuT3BlblVSSQAAAwFzAAcAAABPcGVuVVJJAAYBcwAeAAAAb3JnLmZyZWVkZXNrdG9wLnBvcnRhbC5EZXNrdG9wAAAIAWcAB3NzYXtzdn0AAAAABwFzAAYAAAA6MS42NTcAACgAAAB3YXlsYW5kOjF6YiplaGtsJ013cUNYYmNOLVQ9OEVHciY3IXpCJ18wAAAAACcAAABodHRwczovL2dpdGh1Yi5jb20vYmlsZWxtb3Vzc2FvdWkvYXNocGQAWAAAAAwAAABoYW5kbGVfdG9rZW4AAXMAEAAAAGFzaHBkX1ZvWHpEbkxMcjgAAAAAAAAAAAkAAAB3cml0ZWFibGUAAWIAAAAAAAAAAAMAAABhc2sAAWIAAAAAAAA="; let msg = message(message_base64).unwrap(); let cmd = msg.print_as_busctl(Some(ConnectionType::Session)).unwrap(); assert_eq!(cmd, expected_cmd); } #[test] fn test_print_ping_as_busctl() { // Tests a call without an argument let expected_cmd = "busctl --user call org.freedesktop.secrets /org/freedesktop/DBus org.freedesktop.DBus.Peer Ping"; let message_base64 = b"bAEEAQAAAAACAAAAiAAAAAEBbwAVAAAAL29yZy9mcmVlZGVza3RvcC9EQnVzAAAAAwFzAAQAAABQaW5nAAAAAAIBcwAZAAAAb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlcgAAAAAAAAAGAXMAFwAAAG9yZy5mcmVlZGVza3RvcC5zZWNyZXRzAAcBcwAHAAAAOjEuMjYyMgA="; let msg = message(message_base64).unwrap(); let cmd = msg.print_as_busctl(Some(ConnectionType::Session)).unwrap(); assert_eq!(cmd, expected_cmd); } #[test] fn test_set_property_as_busctl() { // Tests a call without an argument let expected_cmd = "busctl --user get-property :1.26 /org/freedesktop/secrets/collection/login org.freedesktop.Secret.Collection Label"; let message_base64 = b"bAEEATIAAABVBQAAlwAAAAEBbwApAAAAL29yZy9mcmVlZGVza3RvcC9zZWNyZXRzL2NvbGxlY3Rpb24vbG9naW4AAAAAAAAAAgFzAB8AAABvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzAAYBcwAFAAAAOjEuMjYAAAAIAWcAAnNzAAMBcwADAAAAR2V0AAAAAAAHAXMABgAAADoxLjMxNgAAIQAAAG9yZy5mcmVlZGVza3RvcC5TZWNyZXQuQ29sbGVjdGlvbgAAAAUAAABMYWJlbAA="; let msg = message(message_base64).unwrap(); let cmd = msg.print_as_busctl(Some(ConnectionType::Session)).unwrap(); assert_eq!(cmd, expected_cmd); } fn message(message_base64: &[u8]) -> anyhow::Result { let message_bytes = BASE64_STANDARD.decode(message_base64)?; let event = Event::from_bytes(message_bytes, Timestamp::now())?; Ok(Message::from_event(event)) } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/message_fmt.rs000066400000000000000000000206401525300766700243260ustar00rootroot00000000000000use std::{borrow::Cow, collections::btree_map::BTreeMap, fmt::Write}; use zbus::zvariant; pub fn structure_display_fmt( f: &mut W, structure: &zvariant::Structure<'_>, ) -> std::fmt::Result { let fields = structure.fields(); let len = fields.len(); match len { 0 => {} 1 => { value_display_fmt(f, &fields[0])?; } _ => { for (i, field) in fields.iter().enumerate() { value_display_fmt(f, field)?; if i + 1 < fields.len() { f.write_char(' ')?; } } } } Ok(()) } /// Implemented based on: /// - https://gitlab.gnome.org/GNOME/glib/-/blob/e1d47f0b0d0893ac9171e24cc7bf635495376546/glib/gvariant.c#L2213 /// - https://github.com/dbus2/zbus/blob/22182f00da8d7d29508aa9db58fd90fd583bd56f/zvariant/src/value.rs#L479 pub(crate) fn value_display_fmt( f: &mut W, value: &zvariant::Value<'_>, ) -> std::fmt::Result { match value { zvariant::Value::U8(num) => { write!(f, "0x{num:02x}") } zvariant::Value::Bool(boolean) => { write!(f, "{boolean}") } zvariant::Value::I16(num) => { write!(f, "{num}") } zvariant::Value::U16(num) => { write!(f, "{num}") } zvariant::Value::I32(num) => { // Never annotate this type because it is the default for numbers write!(f, "{num}") } zvariant::Value::U32(num) => { write!(f, "{num}") } zvariant::Value::I64(num) => { write!(f, "{num}") } zvariant::Value::U64(num) => { write!(f, "{num}") } zvariant::Value::F64(num) => { if num.fract() == 0. { // Add a dot to make it clear that this is a float write!(f, "{num}.") } else { write!(f, "{num}") } } zvariant::Value::Str(string) => { write!( f, "{}", shell_escape::escape(Cow::Borrowed(string.as_str())) ) } zvariant::Value::Signature(val) => { write!(f, "{}", val.to_string()) } zvariant::Value::ObjectPath(val) => { write!(f, "{}", val.as_str()) } zvariant::Value::Value(child) => { f.write_str(&shell_escape::escape(Cow::Owned( child.value_signature().to_string(), )))?; f.write_char(' ')?; value_display_fmt(f, child)?; Ok(()) } zvariant::Value::Array(array) => array_display_fmt(f, array), zvariant::Value::Dict(dict) => dict_display_fmt(f, dict), zvariant::Value::Structure(structure) => structure_display_fmt(f, structure), #[cfg(unix)] zvariant::Value::Fd(handle) => { write!(f, "{handle}") } } } pub(crate) fn dict_display_fmt( f: &mut W, dict: &zvariant::Dict<'_, '_>, ) -> std::fmt::Result { let mut bmap = BTreeMap::new(); for (k, v) in dict.iter() { bmap.insert(k, v); } write!(f, "{len} ", len = bmap.len())?; if !bmap.is_empty() { // Annotate only the first entry as the rest will be of the same type. for (i, (key, value)) in bmap.iter().enumerate() { value_display_fmt(f, key)?; f.write_char(' ')?; value_display_fmt(f, value)?; if i + 1 < bmap.len() { f.write_char(' ')?; } } } Ok(()) } pub(crate) fn array_display_fmt( f: &mut W, array: &zvariant::Array<'_>, ) -> std::fmt::Result { // Print as string if it is a bytestring (i.e., first nul character is the last // byte) write!(f, "{len} ", len = array.len())?; if let [leading @ .., zvariant::Value::U8(b'\0')] = array.as_ref() && !leading.contains(&zvariant::Value::U8(b'\0')) { let bytes = leading .iter() .map(|v| { v.downcast_ref::() .expect("item must have a signature of a byte") }) .collect::>(); let string = String::from_utf8_lossy(&bytes); write!(f, "b{:?}", string.as_ref())?; return Ok(()); } if !array.is_empty() { // Annotate only the first item as the rest will be of the same type. for (i, item) in array.iter().enumerate() { value_display_fmt(f, item)?; if i + 1 < array.len() { f.write_char(' ')?; } } } Ok(()) } #[cfg(test)] mod tests { use std::borrow::Cow; use zvariant::{OwnedValue, Value}; use super::*; #[derive(zvariant::Type, zvariant::OwnedValue)] struct Struct { field1: Vec, field2: String, } #[test] fn test_shell_escape() { let handle = "wayland:1zb*ehkl'MwqCXbcN-T=8EGr&7!zB'_0"; let expected = "'wayland:1zb*ehkl'\\''MwqCXbcN-T=8EGr&7'\\!'zB'\\''_0'"; let escaped = shell_escape::escape(Cow::Borrowed(handle)); assert_eq!(escaped, expected); } #[test] fn test_struct_display_fmt() { let mut s = String::new(); let expected = "2 0xda 0xff 'hello world'"; let structure = Struct { field1: vec![0xda, 255], field2: "hello world".to_string(), }; let v = OwnedValue::try_from(structure).unwrap(); value_display_fmt(&mut s, &v).unwrap(); assert_eq!("(ays)", v.value_signature().to_string()); assert_eq!(s, expected); } #[test] fn test_dict_display_fmt() { #[rustfmt::skip] // From: // // busctl --user call org.freedesktop.secrets /org/freedesktop/secrets org.freedesktop.Secret.Service \ // SearchItems a{ss} 1 e-source-uid c4df06dec5cc2eb0e992654d1aa42cd58cf05117 let mut s = String::new(); let expected = "1 e-source-uid c4df06dec5cc2eb0e992654d1aa42cd58cf05117"; let mut dict = zvariant::Dict::new(&zvariant::Signature::Str, &zvariant::Signature::Str); dict.append( Value::Str(zvariant::Str::from_static("e-source-uid")), Value::Str(zvariant::Str::from_static( "c4df06dec5cc2eb0e992654d1aa42cd58cf05117", )), ) .unwrap(); let v = Value::Dict(dict); value_display_fmt(&mut s, &v).unwrap(); assert_eq!("a{ss}", v.value_signature().to_string()); assert_eq!(s, expected); } #[test] fn test_value_display_fmt() { // Examples from busctl(1) man page. let mut s = String::new(); let v = zvariant::Value::Str(zvariant::Str::from_static("jawoll")); value_display_fmt(&mut s, &v).unwrap(); assert_eq!("s", v.value_signature().to_string()); assert_eq!(s, "jawoll"); let mut s = String::new(); let mut arr = zvariant::Array::new(&zvariant::Signature::Str); arr.append(zvariant::Value::Str(zvariant::Str::from_static("hello"))) .unwrap(); arr.append(zvariant::Value::Str(zvariant::Str::from_static("world"))) .unwrap(); arr.append(zvariant::Value::Str(zvariant::Str::from_static("foobar"))) .unwrap(); let v = zvariant::Value::Array(arr); value_display_fmt(&mut s, &v).unwrap(); assert_eq!("as", v.value_signature().to_string()); assert_eq!(s, "3 hello world foobar"); let mut s = String::new(); let mut dict = zvariant::Dict::new(&zvariant::Signature::Str, &zvariant::Signature::Variant); dict.append( Value::Str(zvariant::Str::from_static("One")), Value::Value(Box::new(zvariant::Value::Str(zvariant::Str::from_static( "Eins", )))), ) .unwrap(); dict.append( Value::Str(zvariant::Str::from_static("Two")), Value::Value(Box::new(zvariant::Value::U32(2))), ) .unwrap(); dict.append( Value::Str(zvariant::Str::from_static("Yes")), Value::Value(Box::new(zvariant::Value::Bool(true))), ) .unwrap(); let v = zvariant::Value::Dict(dict); value_display_fmt(&mut s, &v).unwrap(); assert_eq!("a{sv}", v.value_signature().to_string()); assert_eq!(s, "3 One s Eins Two u 2 Yes b true"); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/message_list.rs000066400000000000000000000142761525300766700245230ustar00rootroot00000000000000use std::{ borrow::Cow, collections::{HashMap, hash_map::Entry}, fs::File, io::{BufWriter, Write}, path::Path, }; use anyhow::{Context, Ok, Result}; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use pcap_file::pcap::{PcapHeader, PcapPacket, PcapWriter}; use crate::{ RUNTIME, bus_name_list::BusNameList, message::Message, message_tag::MessageTag, pcap_reader::Reader, }; mod imp { use std::cell::RefCell; use super::*; #[derive(Debug, Default)] pub struct MessageList { pub(super) inner: RefCell>, pub(super) bus_names: BusNameList, } #[glib::object_subclass] impl ObjectSubclass for MessageList { const NAME: &'static str = "BustleMessageList"; type Type = super::MessageList; type Interfaces = (gio::ListModel,); } impl ObjectImpl for MessageList {} impl ListModelImpl for MessageList { fn item_type(&self) -> glib::Type { Message::static_type() } fn n_items(&self) -> u32 { self.inner.borrow().len() as u32 } fn item(&self, position: u32) -> Option { self.inner .borrow() .get(position as usize) .map(|item| item.upcast_ref()) .cloned() } } } glib::wrapper! { pub struct MessageList(ObjectSubclass) @implements gio::ListModel; } impl MessageList { pub async fn save_to_file(&self, path: impl AsRef) -> Result<()> { let events = self .imp() .inner .borrow() .iter() .map(|message| message.to_event()) .collect::>(); let path = path.as_ref().to_owned(); RUNTIME .spawn_blocking(move || { let header = PcapHeader { datalink: pcap_file::DataLink::DBUS, ..Default::default() }; let file = File::create(path).context("Failed to create file")?; let mut writer = PcapWriter::with_header(BufWriter::new(file), header) .context("Failed to create writer")?; for event in events { let message_bytes = event.message.data(); writer .write_packet(&PcapPacket { timestamp: event.timestamp.into(), orig_len: message_bytes.len() as u32, data: Cow::Borrowed(message_bytes), }) .context("Failed to write packet")?; } Ok(()) }) .await .context("Failed to spawn blocking task")? .context("Failed to save to file") } pub async fn save_as_dot(&self, dest: &gio::File) -> Result<()> { let mut buffer = Vec::new(); let mut combinations = HashMap::new(); writeln!(&mut buffer, "digraph bustle {{")?; for message in self.imp().inner.borrow().iter() { let sender = message.sender_display(); let destination = message.destination_display(); match combinations.entry((sender, destination)) { Entry::Occupied(_) => continue, Entry::Vacant(entry) => { let (sender, destination) = entry.key(); writeln!(&mut buffer, "\t\"{sender}\" -> \"{destination}\";")?; entry.insert(()); } } } writeln!(&mut buffer, "}}")?; dest.replace_contents_future( buffer, None, false, gio::FileCreateFlags::REPLACE_DESTINATION, ) .await .map_err(|e| e.1)?; Ok(()) } pub async fn load_from_file(path: impl AsRef) -> Result { let path = path.as_ref().to_owned(); let events = RUNTIME .spawn_blocking(move || { let reader = Reader::new(&path).context("Failed to create reader")?; tracing::debug!(?path, "Loaded PCAP file"); let mut events = Vec::new(); for event in reader { let event = event.context("Failed to get packet")?; events.push(event); } Ok(events) }) .await .context("Failed to join handle")? .context("Failed to load from file")?; let this = Self::default(); for event in events { this.push_inner(Message::from_event(event)); } Ok(this) } pub fn push(&self, message: Message) { self.push_inner(message); self.items_changed(self.n_items() - 1, 0, 1); } pub fn bus_names(&self) -> &BusNameList { &self.imp().bus_names } fn push_inner(&self, message: Message) { let position = self.n_items(); message.set_receive_index(position); let imp = self.imp(); if message.message_type().is_method_return() { // Reverse so we first look at the most recent call. This speeds up the search // substantially in the common case where the return is close to the call. if let Some(associated_message) = imp .inner .borrow() .iter() .rev() .find(|other_message| message.is_return_of(other_message)) { message.set_associated_message(associated_message); associated_message.set_associated_message(&message); } } // Only handle message when we have its associated message if let Err(err) = imp.bus_names.handle_message(&message) { tracing::warn!(%message, "Failed to handle message: {:?}", err); } // Only try to guess the component once we have an associated message let message_tag = MessageTag::guess(&message); message.set_message_tag(message_tag); imp.inner.borrow_mut().push(message); } } impl Default for MessageList { fn default() -> Self { glib::Object::new() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/message_tag.rs000066400000000000000000000122631525300766700243150ustar00rootroot00000000000000use std::fmt; use gettextrs::gettext; use gtk::{gdk, glib}; use crate::message::Message; #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash, glib::Enum)] #[enum_type(name = "BustleMessageTag")] pub enum MessageTag { Accessibility, Bluetooth, Flatpak, Geoclue, Gtk, Gvfs, IBus, Logind, NetworkManager, PolicyKit, Portals, SearchProvider, Secrets, SessionManager, Shell, Systemd, Tracker, UPower, #[default] Unknown, } impl fmt::Display for MessageTag { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{self:?}") } } impl MessageTag { pub fn guess(message: &Message) -> Self { let object_path = message.path_display(); let interface = message.interface_display(); if object_path.contains("/org/a11y/bus") || interface.contains("org.a11y.Bus") { Self::Accessibility } else if object_path.contains("/org/bluez") { Self::Bluetooth } else if object_path.contains("/org/freedesktop/Flatpak") || interface.contains("org.freedesktop.Flatpak") { Self::Flatpak } else if object_path.contains("/org/freedesktop/GeoClue") { Self::Geoclue } else if interface.contains("org.gtk.Actions") || object_path.contains("/org/gtk/Settings") { Self::Gtk } else if object_path.contains("/org/gtk/vfs") || object_path.contains("/org/gtk/Private/RemoteVolumeMonitor") { Self::Gvfs } else if object_path.contains("/org/freedesktop/IBus") { Self::IBus } else if object_path.contains("/org/freedesktop/login") { Self::Logind } else if object_path.contains("/org/freedesktop/NetworkManager") || object_path.contains("/fi/w1/wpa_supplicant") { Self::NetworkManager } else if object_path.contains("/org/freedesktop/PolicyKit") { Self::PolicyKit } else if object_path.contains("/org/freedesktop/portal") || object_path.contains("/org/freedesktop/impl/portal") { Self::Portals } else if interface.contains("org.gnome.Shell.SearchProvider") { Self::SearchProvider } else if interface.contains("org.freedesktop.Secret") || object_path.contains("/org/freedesktop/secrets") { Self::Secrets } else if object_path.contains("/org/gnome/SessionManager") { Self::SessionManager } else if object_path.contains("/org/gnome/Shell") || object_path.contains("/org/gnome/Mutter") { Self::Shell } else if object_path.contains("/org/freedesktop/systemd") { Self::Systemd } else if object_path.contains("/org/freedesktop/Tracker") { Self::Tracker } else if object_path.contains("/org/freedesktop/UPower") { Self::UPower } else { Self::Unknown } } pub fn color(self) -> gdk::RGBA { use crate::colors; match self { Self::Accessibility => colors::PURPLE_5, Self::Bluetooth => colors::RED_3, Self::Flatpak => colors::RED_5, Self::Geoclue => colors::PURPLE_3, Self::Gtk => colors::YELLOW_5, Self::Gvfs => colors::BLUE_5, Self::IBus => colors::YELLOW_4, Self::Logind => colors::BROWN_3, Self::NetworkManager => colors::YELLOW_1, Self::PolicyKit => colors::GREEN_4, Self::Portals => colors::RED_1, Self::SearchProvider => colors::BLUE_2, Self::Secrets => colors::GREEN_2, Self::SessionManager => colors::ORANGE_3, Self::Shell => gdk::RGBA::BLACK, Self::Systemd => colors::RED_2, Self::Tracker => colors::BROWN_1, Self::UPower => colors::ORANGE_5, Self::Unknown => gdk::RGBA::TRANSPARENT, } } pub fn name(self) -> String { match self { Self::Accessibility => gettext("Accessibility"), Self::Bluetooth => gettext("Bluetooth"), Self::Flatpak => gettext("Flatpak"), Self::Geoclue => gettext("Geolocalization"), Self::Gtk => gettext("GTK"), Self::Gvfs => gettext("GVFS"), Self::IBus => gettext("Input"), // TRANSLATORS Noun, as in user login Self::Logind => gettext("Login"), Self::NetworkManager => gettext("Network"), Self::PolicyKit => gettext("Policy Control"), Self::Portals => gettext("Portals"), Self::SearchProvider => gettext("Search Provider"), Self::Secrets => gettext("Secrets"), Self::SessionManager => gettext("Session"), // TRANSLATORS As in the GNOME Shell Self::Shell => gettext("Shell"), Self::Systemd => gettext("systemd"), // TRANSLATORS As in the Tracker software. https://tracker.gnome.org/ Self::Tracker => gettext("Tracker"), Self::UPower => gettext("Power"), Self::Unknown => gettext("Unknown"), } } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/message_type.rs000066400000000000000000000032631525300766700245230ustar00rootroot00000000000000use gettextrs::gettext; use gtk::glib; #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash, glib::Enum)] #[enum_type(name = "BustleMessageType")] pub enum MessageType { MethodCall, MethodReturn, #[default] Error, Signal, } impl MessageType { /// Returns true if self is a method return or error pub fn is_method_return(self) -> bool { matches!(self, Self::MethodReturn | Self::Error) } pub fn is_error(self) -> bool { matches!(self, Self::Error) } pub fn is_signal(self) -> bool { matches!(self, Self::Signal) } pub fn is_method_call(self) -> bool { matches!(self, Self::MethodCall) } pub fn i18n(self) -> String { match self { Self::MethodCall => gettext("Method Call"), Self::MethodReturn => gettext("Method Return"), Self::Error => gettext("Error"), Self::Signal => gettext("Signal"), } } } impl From for MessageType { fn from(value: zbus::message::Type) -> Self { match value { zbus::message::Type::MethodCall => Self::MethodCall, zbus::message::Type::MethodReturn => Self::MethodReturn, zbus::message::Type::Error => Self::Error, zbus::message::Type::Signal => Self::Signal, } } } impl From for zbus::message::Type { fn from(value: MessageType) -> Self { match value { MessageType::MethodCall => Self::MethodCall, MessageType::MethodReturn => Self::MethodReturn, MessageType::Error => Self::Error, MessageType::Signal => Self::Signal, } } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/monitor.rs000066400000000000000000000253301525300766700235240ustar00rootroot00000000000000use std::{ffi::OsStr, fmt, path::Path, process::Stdio, sync::LazyLock}; use anyhow::{Context, Result, anyhow}; use futures_util::StreamExt; use gtk::{gio, glib}; use pcap_file::pcap::PcapPacket; use tokio::{ io::{AsyncReadExt, BufReader}, process::{Child, Command}, sync::{mpsc, oneshot}, task::JoinHandle, }; use zbus::zvariant; use crate::{ConnectionType, RUNTIME, timestamp::Timestamp}; static IS_RUNNING_IN_FLATPAK: LazyLock = LazyLock::new(|| Path::new("/.flatpak-info").exists()); pub struct Event { pub message: zbus::Message, pub timestamp: Timestamp, } impl Event { pub fn from_packet(packet: PcapPacket<'_>) -> Result { Self::from_bytes(packet.data.into_owned(), packet.timestamp.into()) } pub fn from_bytes(bytes: Vec, timestamp: Timestamp) -> Result { let ctx = zvariant::serialized::Context::new_dbus(zvariant::LE, 0); let data = zvariant::serialized::Data::new(bytes, ctx); let message = unsafe { zbus::Message::from_bytes(data).context("Failed to parse message")? }; Ok(Self { message, timestamp }) } } #[derive(Debug)] pub struct Cancelled(String); impl fmt::Display for Cancelled { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(&self.0) } } impl Cancelled { pub fn new(message: &str) -> Self { Self(format!("Cancelled monitoring: {message}")) } } #[derive(Debug)] pub struct Monitor(Inner, ConnectionType); #[allow(clippy::large_enum_variant)] #[derive(Debug)] enum Inner { DbusMonitor { command: Command, child: Option, tokio_handle: Option>, handle: Option>, }, // FIXME Use in session recording when Issue #28 is resolved #[allow(dead_code)] Zbus { tokio_handle: Option>, handle: Option>, }, } impl Drop for Monitor { fn drop(&mut self) { match &mut self.0 { Inner::DbusMonitor { child, tokio_handle, handle, .. } => { if let Some(mut child) = child.take() { glib::spawn_future(async move { if let Err(err) = child.kill().await { tracing::warn!("Failed to kill child process: {:?}", err) } else { tracing::debug!("Killed child process") } }); } if let Some(tokio_handle) = tokio_handle.take() { tokio_handle.abort(); } if let Some(handle) = handle.take() { handle.abort(); } } Inner::Zbus { tokio_handle, handle, .. } => { if let Some(tokio_handle) = tokio_handle.take() { tokio_handle.abort(); } if let Some(handle) = handle.take() { handle.abort(); } } } } } impl Monitor { fn new_dbus_monitor(command: Command, conn_type: ConnectionType) -> Self { Self( Inner::DbusMonitor { command, child: None, tokio_handle: None, handle: None, }, conn_type, ) } pub fn system() -> Self { let mut command = root_host_command("dbus-monitor"); command .stdout(Stdio::piped()) .arg("--binary") .arg("--system"); Self::new_dbus_monitor(command, ConnectionType::System) } pub fn session() -> Self { let mut command = Command::new("dbus-monitor"); command .stdout(Stdio::piped()) .arg("--binary") .arg("--session"); Self::new_dbus_monitor(command, ConnectionType::Session) } pub fn address(address: zbus::Address) -> Self { let mut command = root_host_command("dbus-monitor"); let address = address.to_string(); command .stdout(Stdio::piped()) .arg("--binary") .arg("--address") .arg(&address); Self::new_dbus_monitor(command, ConnectionType::Address(address)) } pub fn connection_type(&self) -> &ConnectionType { &self.1 } pub async fn start(&mut self, message_cb: impl Fn(Event) + 'static) -> Result<()> { match &mut self.0 { Inner::DbusMonitor { command, child, tokio_handle, handle, } => { let enter_guard = RUNTIME.enter(); let mut spawned_child = command.spawn().context("Failed to spawn command")?; drop(enter_guard); let stdout = spawned_child.stdout.take().expect("Child must have stdout"); let (tx, mut rx) = mpsc::channel(10); let (first_read_tx, first_read_rx) = oneshot::channel(); let mut first_read_tx = Some(first_read_tx); tokio_handle.replace(RUNTIME.spawn(async move { let mut reader = BufReader::new(stdout); loop { // Initialize space for the header let mut message_buf = vec![0u8; 16]; // Read the header let ret = reader.read_exact(&mut message_buf).await; if let Some(first_msg_tx) = first_read_tx.take() { let _ = first_msg_tx.send(()); } if let Err(err) = ret { tracing::warn!("Failed to read header bytes: {:?}", err); break; } let timestamp = Timestamp::now(); let bytes_needed = match gio::DBusMessage::bytes_needed(&message_buf) { Ok(n_needed) => n_needed, Err(err) => { tracing::warn!("Failed to get bytes needed: {:?}", err); break; } }; assert!(bytes_needed >= 16); // Make space for the body message_buf.resize(bytes_needed as usize, 0); // Read the body if let Err(err) = reader.read_exact(&mut message_buf[16..]).await { tracing::warn!("Failed to read body bytes: {:?}", err); break; } match Event::from_bytes(message_buf, timestamp) { Ok(event) => { let _ = tx.send(event).await; } Err(err) => { tracing::warn!("Failed to create event from bytes: {:?}", err); } } } })); // Wait for the first read before we check for child status to ensure that the // child already exited on error. first_read_rx.await.expect("rx unexpectedly closed"); if let Some(exit_status) = spawned_child.try_wait().context("Failed to wait child")? { debug_assert!(!exit_status.success(), "child must only exit on error"); let err = anyhow!( "Child exited with status `{:?}` and code `{:?}`", exit_status, exit_status.code() ); match exit_status.code() { Some(126) => { return Err(err.context(Cancelled::new( "User dismissed polkit authorization dialog", ))); } _ => return Err(err), } } else { child.replace(spawned_child); } handle.replace(glib::spawn_future_local(async move { while let Some(event) = rx.recv().await { message_cb(event); } })); } Inner::Zbus { tokio_handle, handle, } => { let cnx = RUNTIME .spawn(async { let cnx = zbus::Connection::session().await?; let proxy = zbus::fdo::MonitoringProxy::new(&cnx).await?; proxy.become_monitor(&[], 0).await?; zbus::Result::Ok(cnx) }) .await .context("Failed to spawn on runtime")? .context("Failed to setup monitoring")?; let (tx, mut rx) = mpsc::channel(10); tokio_handle.replace(RUNTIME.spawn(async move { let mut stream = zbus::MessageStream::from(cnx); while let Some(res) = stream.next().await { match res { Ok(message) => { let _ = tx .send(Event { message, timestamp: Timestamp::now(), }) .await; } Err(err) => tracing::warn!("Failed to receive message: {:?}", err), } } })); handle.replace(glib::spawn_future_local(async move { while let Some(event) = rx.recv().await { message_cb(event); } })); } } Ok(()) } } /// Runs a command in host as much as possible, falling back to `flatpak-spawn /// --host` if running in Flatpak. fn host_command(program: impl AsRef) -> Command { if *IS_RUNNING_IN_FLATPAK { let mut command = Command::new("flatpak-spawn"); command.arg("--host").arg(program); return command; } Command::new(program) } /// Runs a command as root using `pkexec`. fn root_host_command(program: impl AsRef) -> Command { let mut command = host_command("pkexec"); command.arg(program); command } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/multi_set.rs000066400000000000000000000063711525300766700240460ustar00rootroot00000000000000use std::{ collections::{HashMap, hash_map::Entry}, hash::Hash, }; /// Like a set, but keys can be inserted multiple times and, thus, /// removing a key only removes one occurrence. pub struct MultiSet { inner: HashMap, } impl Default for MultiSet { fn default() -> Self { Self { inner: HashMap::new(), } } } impl MultiSet where K: Eq + Hash, { /// Inserts an occurrence of a `key`. If it already exists, an occurrence is /// added. pub fn insert(&mut self, key: K) { match self.inner.entry(key) { Entry::Occupied(mut entry) => { *entry.get_mut() += 1; } Entry::Vacant(entry) => { entry.insert(1); } } } /// Removes an occurrence of a `key`. pub fn remove(&mut self, key: K) { if let Entry::Occupied(mut entry) = self.inner.entry(key) { let &count = entry.get(); debug_assert_ne!(count, 0); if count == 1 { entry.remove(); } else { *entry.get_mut() -= 1; } } } /// Returns true if `key` is exists in the set. pub fn contains(&self, key: &K) -> bool { let count = self.inner.get(key); debug_assert_ne!(count, Some(&0)); count.is_some() } /// Returns an iterator over the *distinct* keys in the set. pub fn iter_unique(&self) -> impl Iterator { self.inner.keys() } /// Returns the length of the *distinct* keys in the set. pub fn len_unique(&self) -> usize { self.inner.len() } pub fn is_empty(&self) -> bool { self.len_unique() == 0 } pub fn reserve(&mut self, additional: usize) { self.inner.reserve(additional); } } impl Extend for MultiSet where K: Eq + Hash, { fn extend>(&mut self, iter: T) { // Copied from std lib implementation // See https://docs.rs/hashbrown/0.14.3/src/hashbrown/map.rs.html#6499-6514 let iter = iter.into_iter(); let reserve = if self.is_empty() { iter.size_hint().0 } else { iter.size_hint().0.div_ceil(2) }; self.reserve(reserve); iter.for_each(move |k| { self.insert(k); }); } } #[cfg(test)] mod tests { use super::*; #[test] fn insert_and_remove() { let mut set = MultiSet::default(); assert!(!set.contains(&1)); assert!(!set.contains(&2)); assert_eq!(set.len_unique(), 0); set.insert(1); set.insert(1); assert!(set.contains(&1)); assert_eq!(set.len_unique(), 1); set.insert(2); assert!(set.contains(&1)); assert!(set.contains(&2)); assert_eq!(set.len_unique(), 2); set.remove(1); assert!(set.contains(&1)); assert!(set.contains(&2)); assert_eq!(set.len_unique(), 2); set.remove(1); assert!(!set.contains(&1)); assert!(set.contains(&2)); assert_eq!(set.len_unique(), 1); set.remove(2); assert!(!set.contains(&1)); assert!(!set.contains(&2)); assert_eq!(set.len_unique(), 0); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/pcap_reader.rs000066400000000000000000000110041525300766700242730ustar00rootroot00000000000000use std::{ io::{Read, Seek}, path::Path, }; use anyhow::Context; use pcap_file::{pcap, pcapng}; use crate::monitor::Event; // See https://www.ietf.org/archive/id/draft-tuexen-opsawg-pcapng-05.txt. const PCAPNG_BLOCK_TYPE: [u8; 4] = u32::to_le_bytes(0x0A0D0D0A); const PCAPNG_BYTE_ORDER_LE: [u8; 4] = u32::to_le_bytes(0x1A2B3C4D); const PCAPNG_BYTE_ORDER_BE: [u8; 4] = u32::to_be_bytes(0x1A2B3C4D); // See https://www.ietf.org/archive/id/draft-ietf-opsawg-pcap-08.txt. const PCAP_MAGIC_1_LE: [u8; 4] = u32::to_le_bytes(0xA1B2C3D4); const PCAP_MAGIC_1_BE: [u8; 4] = u32::to_be_bytes(0xA1B2C3D4); const PCAP_MAGIC_2_LE: [u8; 4] = u32::to_le_bytes(0xA1B23C4D); const PCAP_MAGIC_2_BE: [u8; 4] = u32::to_be_bytes(0xA1B23C4D); pub enum Reader { Pcap(pcap::PcapReader), PcapNg(pcapng::PcapNgReader), } impl Reader { pub fn new(path: impl AsRef) -> anyhow::Result { let extension = path.as_ref().extension(); let mut file = std::fs::File::open(&path) .with_context(|| format!("Failed to open file at `{}`", path.as_ref().display()))?; let is_pcapng = is_pcapng_from_magic(&mut file, extension).unwrap_or_else(|_| { if extension.is_some_and(|ext| &ext.to_ascii_lowercase() == "pcapng") { tracing::warn!( "Opening as pcapng based on extension, however the magic does not match", ); true } else { tracing::warn!("Opening as pcap, however the magic does not match",); false } }); if is_pcapng { let reader = pcapng::PcapNgReader::new(file)?; Ok(Reader::PcapNg(reader)) } else { let reader = pcap::PcapReader::new(file)?; let datalink = reader.header().datalink; if datalink != pcap_file::DataLink::DBUS { anyhow::bail!("Invalid datalink type `{datalink:?}`"); } Ok(Reader::Pcap(reader)) } } } impl Iterator for Reader { type Item = anyhow::Result; fn next(&mut self) -> Option { match self { Reader::Pcap(inner) => match inner.next_packet() { Some(Ok(packet)) => Some(Event::from_bytes( packet.data.to_vec(), packet.timestamp.into(), )), Some(Err(err)) => Some(Err(err.into())), None => None, }, Reader::PcapNg(inner) => match inner.next_block() { Some(Ok(pcapng::blocks::Block::InterfaceDescription(iface))) => { if iface.linktype != pcap_file::DataLink::DBUS { Some(Err(anyhow::anyhow!( "Invalid datalink type `{:?}`", iface.linktype ))) } else { self.next() } } Some(Ok(pcapng::blocks::Block::EnhancedPacket(packet))) => Some(Event::from_bytes( packet.data.to_vec(), packet.timestamp.into(), )), Some(Ok(_)) => self.next(), Some(Err(err)) => Some(Err(err.into())), None => None, }, } } } fn is_pcapng_from_magic( file: &mut std::fs::File, extension: Option<&std::ffi::OsStr>, ) -> anyhow::Result { let mut buff = [0_u8; 12]; file.rewind()?; file.read_exact(&mut buff)?; file.rewind()?; if buff[0..4] == PCAPNG_BLOCK_TYPE && (buff[8..12] == PCAPNG_BYTE_ORDER_LE || buff[8..12] == PCAPNG_BYTE_ORDER_BE) { if extension != Some(std::ffi::OsStr::new("pcapng")) { tracing::warn!( "Detected file with mismatching extension {:?} as pcapng based on magic", extension.map(std::ffi::OsStr::display) ); } Ok(true) } else if buff[0..4] == PCAP_MAGIC_1_LE || buff[0..4] == PCAP_MAGIC_2_LE || buff[0..4] == PCAP_MAGIC_1_BE || buff[0..4] == PCAP_MAGIC_2_BE { if extension != Some(std::ffi::OsStr::new("pcap")) { tracing::warn!( "Detected file with mismatching extension {:?} as pcap based on magic", extension.map(std::ffi::OsStr::display) ); } Ok(false) // Has the pcap magic. } else { anyhow::bail!("The magic does not match pcap nor pcapng"); } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/000077500000000000000000000000001525300766700236565ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/duration_item.rs000066400000000000000000000024411525300766700270700ustar00rootroot00000000000000use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::timestamp::Timestamp; mod imp { use std::cell::{Cell, OnceCell}; use super::*; #[derive(Debug, Default, glib::Properties)] #[properties(wrapper_type = super::DurationItem)] pub struct DurationItem { #[property(get, set, construct_only)] pub(super) method: OnceCell, #[property(get, set, construct_only)] pub(super) total: Cell, #[property(get, set, construct_only)] pub(super) calls: Cell, #[property(get, set, construct_only)] pub(super) total_calls: Cell, } #[glib::object_subclass] impl ObjectSubclass for DurationItem { const NAME: &'static str = "BustleDurationItem"; type Type = super::DurationItem; } #[glib::derived_properties] impl ObjectImpl for DurationItem {} } glib::wrapper! { pub struct DurationItem(ObjectSubclass); } impl DurationItem { pub fn new(method: &str, calls: u32, total_calls: u32, total: Timestamp) -> Self { glib::Object::builder() .property("method", method) .property("calls", calls) .property("total-calls", total_calls) .property("total", total) .build() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/frequency_item.rs000066400000000000000000000025001525300766700272400ustar00rootroot00000000000000use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::message_type::MessageType; mod imp { use std::cell::{Cell, OnceCell}; use super::*; #[derive(Debug, Default, glib::Properties)] #[properties(wrapper_type = super::FrequencyItem)] pub struct FrequencyItem { #[property(get, set, construct_only)] pub(super) member: OnceCell, #[property(get, set, construct_only)] pub(super) count: Cell, #[property(get, set, construct_only)] pub(super) total: Cell, #[property(get, set, construct_only, default)] pub(super) message_type: Cell, } #[glib::object_subclass] impl ObjectSubclass for FrequencyItem { const NAME: &'static str = "BustleFrequencyItem"; type Type = super::FrequencyItem; } #[glib::derived_properties] impl ObjectImpl for FrequencyItem {} } glib::wrapper! { pub struct FrequencyItem(ObjectSubclass); } impl FrequencyItem { pub fn new(member: &str, count: u32, total: u32, message_type: MessageType) -> Self { glib::Object::builder() .property("member", member) .property("count", count) .property("total", total) .property("message-type", message_type) .build() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/mod.rs000066400000000000000000000004251525300766700250040ustar00rootroot00000000000000mod duration_item; mod frequency_item; mod pages; mod size_item; mod window; pub use duration_item::DurationItem; pub use frequency_item::FrequencyItem; pub use pages::{DurationsPage, FrequenciesPage, SizesPage}; pub use size_item::SizeItem; pub use window::StatisticsWindow; bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/000077500000000000000000000000001525300766700247555ustar00rootroot00000000000000bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/durations.rs000066400000000000000000000136451525300766700273440ustar00rootroot00000000000000use adw::subclass::prelude::*; use gtk::{gio, glib, prelude::*}; use crate::{filtered_message_model::FilteredMessageModel, statistics::DurationItem}; mod imp { use std::cell::RefCell; use super::*; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::DurationsPage)] #[template(resource = "/org/freedesktop/Bustle/ui/durations_page.ui")] pub struct DurationsPage { #[property(get, set = Self::set_model)] pub(super) model: RefCell>, #[template_child] pub(super) column_view: TemplateChild, #[template_child] pub(super) method_column: TemplateChild, #[template_child] pub(super) total_column: TemplateChild, #[template_child] pub(super) calls_column: TemplateChild, #[template_child] pub(super) mean_column: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for DurationsPage { const NAME: &'static str = "BustleDurationsPage"; type Type = super::DurationsPage; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for DurationsPage { fn constructed(&self) { self.parent_constructed(); self.calls_column .set_sorter(Some(>k::NumericSorter::new(Some( &DurationItem::this_expression("calls"), )))); self.method_column .set_sorter(Some(>k::CustomSorter::new(|a, b| { let a = a.downcast_ref::().unwrap(); let b = b.downcast_ref::().unwrap(); a.method().cmp(&b.method()).into() }))); self.total_column .set_sorter(Some(>k::CustomSorter::new(|a, b| { let a = a.downcast_ref::().unwrap(); let b = b.downcast_ref::().unwrap(); a.total().cmp(&b.total()).into() }))); self.mean_column .set_sorter(Some(>k::CustomSorter::new(|a, b| { let a = a.downcast_ref::().unwrap(); let b = b.downcast_ref::().unwrap(); let mean_a = a.total() / a.calls(); let mean_b = b.total() / b.calls(); mean_a.cmp(&mean_b).into() }))); } } impl WidgetImpl for DurationsPage {} impl BinImpl for DurationsPage {} impl DurationsPage { fn set_model(&self, model: &FilteredMessageModel) { let mut durations_map = std::collections::HashMap::new(); let durations = gio::ListStore::new::(); for message in model.iter() { if !message.message_type().is_method_call() { continue; } let Some(return_message) = message.associated_message() else { continue; }; // Ignore errors when computing the time it took for a method to receive a reply // This is mostly done to be 100% compatible with Hustle // TODO: investigate if it makes sense to keep this or not if return_message.message_type().is_error() { continue; } let new_duration = return_message.timestamp() - message.timestamp(); let member_name = message.member_markup(true); durations_map .entry(member_name) .and_modify(|(calls, duration)| { *calls += 1; *duration += new_duration; }) .or_insert((1, new_duration)); } let total_calls = durations_map.iter().map(|(_, (call, _))| call).sum(); for (member, (calls, total_duration)) in durations_map.into_iter() { durations.append(&DurationItem::new( &member, calls, total_calls, total_duration, )) } self.column_view .sort_by_column(Some(&self.calls_column), gtk::SortType::Descending); let sorter = self.column_view.sorter(); let sorted_model = gtk::SortListModel::new(Some(durations), sorter); let selection_model = gtk::NoSelection::new(Some(sorted_model)); self.column_view.set_model(Some(&selection_model)); self.model.replace(Some(model.clone())); } } } glib::wrapper! { pub struct DurationsPage(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } #[gtk::template_callbacks] impl DurationsPage { #[template_callback] fn calls_fraction(_: &glib::Object, entry: Option<&DurationItem>) -> f64 { entry.map_or(0.0, |e| e.calls() as f64 / e.total_calls() as f64) } #[template_callback] fn total_duration(_: &glib::Object, entry: Option<&DurationItem>) -> String { entry .map(|e| format!("{:.2} ms", e.total().as_millis_f64())) .unwrap_or_default() } #[template_callback] fn mean_duration(_: &glib::Object, entry: Option<&DurationItem>) -> String { entry .map(|e| format!("{:.2} ms", e.total().as_millis_f64() / e.calls() as f64)) .unwrap_or_default() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/frequencies.rs000066400000000000000000000106471525300766700276440ustar00rootroot00000000000000use adw::subclass::prelude::*; use gtk::{gio, glib, prelude::*}; use crate::{filtered_message_model::FilteredMessageModel, statistics::FrequencyItem}; mod imp { use std::cell::RefCell; use super::*; use crate::statistics::pages::ProgressCell; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::FrequenciesPage)] #[template(resource = "/org/freedesktop/Bustle/ui/frequencies_page.ui")] pub struct FrequenciesPage { #[property(get, set = Self::set_model)] pub(super) model: RefCell>, #[template_child] pub(super) column_view: TemplateChild, #[template_child] pub(super) message_type_column: TemplateChild, #[template_child] pub(super) member_column: TemplateChild, #[template_child] pub(super) frequency_column: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for FrequenciesPage { const NAME: &'static str = "BustleFrequenciesPage"; type Type = super::FrequenciesPage; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { ProgressCell::ensure_type(); klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for FrequenciesPage { fn constructed(&self) { self.parent_constructed(); self.frequency_column .set_sorter(Some(>k::NumericSorter::new(Some( &FrequencyItem::this_expression("count"), )))); self.message_type_column .set_sorter(Some(>k::CustomSorter::new(|a, b| { let a = a.downcast_ref::().unwrap(); let b = b.downcast_ref::().unwrap(); a.message_type().cmp(&b.message_type()).into() }))); self.member_column .set_sorter(Some(>k::StringSorter::new(Some( &FrequencyItem::this_expression("member"), )))); } } impl WidgetImpl for FrequenciesPage {} impl BinImpl for FrequenciesPage {} impl FrequenciesPage { fn set_model(&self, model: &FilteredMessageModel) { let mut n_items = model.n_items(); let frequencies = gio::ListStore::new::(); let mut frequencies_map = std::collections::HashMap::new(); for message in model.iter() { let message_type = message.message_type(); if message_type.is_method_return() { n_items -= 1; continue; } let member_name = message.member_markup(true); frequencies_map .entry((member_name, message_type)) .and_modify(|count| *count += 1) .or_insert(1); } for ((member, message_type), count) in frequencies_map.iter() { frequencies.append(&FrequencyItem::new(member, *count, n_items, *message_type)) } self.column_view .sort_by_column(Some(&self.frequency_column), gtk::SortType::Descending); let sorter = self.column_view.sorter(); let sorted_model = gtk::SortListModel::new(Some(frequencies), sorter); let selection_model = gtk::NoSelection::new(Some(sorted_model)); self.column_view.set_model(Some(&selection_model)); self.model.replace(Some(model.clone())); } } } glib::wrapper! { pub struct FrequenciesPage(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } #[gtk::template_callbacks] impl FrequenciesPage { #[template_callback] fn fraction(_: &glib::Object, entry: Option<&FrequencyItem>) -> f64 { entry.map_or(0.0, |e| e.count() as f64 / e.total() as f64) } #[template_callback] fn message_type(_: &glib::Object, entry: Option<&FrequencyItem>) -> String { entry.map(|e| e.message_type().i18n()).unwrap_or_default() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/mod.rs000066400000000000000000000003061525300766700261010ustar00rootroot00000000000000mod durations; mod frequencies; mod progress_cell; mod sizes; pub use durations::DurationsPage; pub use frequencies::FrequenciesPage; pub use progress_cell::ProgressCell; pub use sizes::SizesPage; bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/progress_cell.rs000066400000000000000000000144431525300766700301740ustar00rootroot00000000000000// Rust rewrite of use adw::subclass::prelude::*; use gtk::{gdk, glib, graphene, prelude::*}; mod imp { use std::cell::{Cell, RefCell}; use super::*; #[derive(Debug, glib::Properties)] #[properties(wrapper_type = super::ProgressCell)] pub struct ProgressCell { #[property(get, set = Self::set_fraction, minimum = 0.0, maximum = 1.0, default = 0.0)] pub(super) fraction: Cell, #[property(get, set = Self::set_text)] pub(super) text: RefCell, pub(super) through: adw::Bin, pub(super) progress: adw::Bin, pub(super) label: gtk::Label, pub(super) alt_label: gtk::Label, } impl Default for ProgressCell { fn default() -> Self { Self { fraction: Default::default(), text: Default::default(), through: adw::Bin::builder().css_name("through").build(), progress: adw::Bin::builder() .css_name("progress") .visible(false) .build(), label: gtk::Label::builder() .halign(gtk::Align::Center) .label("0") .build(), alt_label: gtk::Label::builder() .halign(gtk::Align::Center) .label("0") .build(), } } } #[glib::object_subclass] impl ObjectSubclass for ProgressCell { const NAME: &'static str = "BustleProgressCell"; type Type = super::ProgressCell; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_css_name("progress-cell"); klass.set_accessible_role(gtk::AccessibleRole::ProgressBar); } } #[glib::derived_properties] impl ObjectImpl for ProgressCell { fn constructed(&self) { self.parent_constructed(); let widget = self.obj(); self.alt_label.add_css_class("in-progress"); self.label.add_css_class("numeric"); self.alt_label.add_css_class("numeric"); widget .bind_property("text", &self.label, "label") .sync_create() .build(); widget .bind_property("text", &self.alt_label, "label") .sync_create() .build(); self.through.set_parent(&*widget); self.label.set_parent(&*widget); self.progress.set_parent(&*widget); self.alt_label.set_parent(&*widget); widget.update_property(&[ gtk::accessible::Property::ValueMax(1.0), gtk::accessible::Property::ValueMin(0.0), gtk::accessible::Property::ValueNow(0.0), ]); } fn dispose(&self) { self.through.unparent(); self.progress.unparent(); self.label.unparent(); self.alt_label.unparent(); } } impl WidgetImpl for ProgressCell { fn size_allocate(&self, width: i32, height: i32, baseline: i32) { let widget = self.obj(); let allocation = gdk::Rectangle::new(0, 0, width, height); self.label.size_allocate(&allocation, baseline); self.alt_label.size_allocate(&allocation, baseline); self.through.size_allocate(&allocation, baseline); if self.progress.get_visible() { self.progress.size_allocate( &gdk::Rectangle::new( 0, 0, (width as f32 * widget.fraction()).max(1.) as i32, height, ), baseline, ); } } fn measure(&self, orientation: gtk::Orientation, for_size: i32) -> (i32, i32, i32, i32) { let (mut minimum, mut natural) = (0, 0); let (minimum_baseline, natural_baseline) = (-1, -1); let widgets = [ self.through.upcast_ref::(), self.progress.upcast_ref::(), self.label.upcast_ref::(), self.alt_label.upcast_ref::(), ]; for widget in widgets.into_iter() { let (child_min, child_nat, _, _) = widget.measure(orientation, for_size); if child_min > minimum { minimum = child_min; } if child_nat > natural { natural = child_nat; } } (minimum, natural, minimum_baseline, natural_baseline) } fn snapshot(&self, snapshot: >k::Snapshot) { let widget = self.obj(); widget.snapshot_child(&self.through, snapshot); widget.snapshot_child(&self.label, snapshot); widget.snapshot_child(&self.progress, snapshot); let w = widget.width(); let h = widget.height(); snapshot.push_clip(&graphene::Rect::new( 0., 0., w as f32 * widget.fraction(), h as f32, )); widget.snapshot_child(&self.alt_label, snapshot); snapshot.pop(); self.parent_snapshot(snapshot); } } impl ProgressCell { fn set_fraction(&self, mut fraction: f32) { fraction = fraction.clamp(0., 1.); let widget = self.obj(); if self.fraction.get() != fraction { self.fraction.set(fraction); self.progress.set_visible(fraction > 0.); widget.notify_fraction(); widget.update_property(&[gtk::accessible::Property::ValueNow(fraction.into())]); widget.queue_allocate(); } } fn set_text(&self, text: String) { if self.text.replace(text.clone()) != text { self.obj().notify_text(); } } } } glib::wrapper! { pub struct ProgressCell(ObjectSubclass) @extends gtk::Widget, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/pages/sizes.rs000066400000000000000000000136031525300766700264630ustar00rootroot00000000000000use std::collections::HashMap; use adw::subclass::prelude::*; use gtk::{gio, glib, prelude::*}; use crate::{ filtered_message_model::FilteredMessageModel, message_type::MessageType, statistics::SizeItem, }; mod imp { use std::cell::RefCell; use super::*; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::SizesPage)] #[template(resource = "/org/freedesktop/Bustle/ui/sizes_page.ui")] pub struct SizesPage { #[property(get, set = Self::set_model)] pub(super) model: RefCell>, #[template_child] pub(super) column_view: TemplateChild, #[template_child] pub(super) message_type_column: TemplateChild, #[template_child] pub(super) member_column: TemplateChild, #[template_child] pub(super) largest_column: TemplateChild, #[template_child] pub(super) mean_column: TemplateChild, #[template_child] pub(super) smallest_column: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for SizesPage { const NAME: &'static str = "BustleSizesPage"; type Type = super::SizesPage; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { klass.bind_template(); klass.bind_template_instance_callbacks(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for SizesPage { fn constructed(&self) { self.parent_constructed(); self.member_column .set_sorter(Some(>k::StringSorter::new(Some( &SizeItem::this_expression("member"), )))); self.message_type_column .set_sorter(Some(>k::CustomSorter::new(|a, b| { let a = a.downcast_ref::().unwrap(); let b = b.downcast_ref::().unwrap(); a.message_type().cmp(&b.message_type()).into() }))); self.largest_column.set_sorter(Some( >k::NumericSorter::builder() .expression(SizeItem::this_expression("largest")) .sort_order(gtk::SortType::Descending) .build(), )); self.smallest_column.set_sorter(Some( >k::NumericSorter::builder() .expression(SizeItem::this_expression("smallest")) .sort_order(gtk::SortType::Descending) .build(), )); self.mean_column.set_sorter(Some( >k::NumericSorter::builder() .expression(SizeItem::this_expression("mean")) .sort_order(gtk::SortType::Descending) .build(), )); } } impl WidgetImpl for SizesPage {} impl BinImpl for SizesPage {} impl SizesPage { fn set_model(&self, model: &FilteredMessageModel) { let mut sizes_map: HashMap<(MessageType, String), (usize, Vec)> = std::collections::HashMap::new(); let sizes = gio::ListStore::new::(); for message in model.iter() { let length = message.len(); let message_type = message.message_type(); let member_name = message.member_markup(true); sizes_map .entry((message_type, member_name)) .and_modify(|(calls, bytes_vec)| { *calls += 1; bytes_vec.push(length); }) .or_insert((1, vec![length])); } for ((message_type, member), (calls, mut bytes)) in sizes_map.into_iter() { bytes.sort(); let mean = bytes.iter().copied().sum::() / calls; sizes.append(&SizeItem::new( &member, *bytes.first().unwrap_or(&0) as u32, mean as u32, *bytes.last().unwrap_or(&0) as u32, message_type, )) } self.column_view .sort_by_column(Some(&self.mean_column), gtk::SortType::Ascending); let sorter = self.column_view.sorter(); let sorted_model = gtk::SortListModel::new(Some(sizes), sorter); let selection_model = gtk::NoSelection::new(Some(sorted_model)); self.column_view.set_model(Some(&selection_model)); self.model.replace(Some(model.clone())); } } } glib::wrapper! { pub struct SizesPage(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } #[gtk::template_callbacks] impl SizesPage { #[template_callback] fn message_type(_: &glib::Object, entry: Option<&SizeItem>) -> String { entry.map(|e| e.message_type().i18n()).unwrap_or_default() } #[template_callback] fn smallest_bytes(_: &glib::Object, entry: Option<&SizeItem>) -> glib::GString { entry .map(|e| glib::format_size(e.smallest().into())) .unwrap_or_default() } #[template_callback] fn mean_bytes(_: &glib::Object, entry: Option<&SizeItem>) -> glib::GString { entry .map(|e| glib::format_size(e.mean().into())) .unwrap_or_default() } #[template_callback] fn largest_bytes(_: &glib::Object, entry: Option<&SizeItem>) -> glib::GString { entry .map(|e| glib::format_size(e.largest().into())) .unwrap_or_default() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/size_item.rs000066400000000000000000000027331525300766700262210ustar00rootroot00000000000000use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::message_type::MessageType; mod imp { use std::cell::{Cell, OnceCell}; use super::*; #[derive(Debug, Default, glib::Properties)] #[properties(wrapper_type = super::SizeItem)] pub struct SizeItem { #[property(get, set, construct_only)] pub(super) member: OnceCell, #[property(get, set, construct_only)] pub(super) smallest: Cell, #[property(get, set, construct_only)] pub(super) mean: Cell, #[property(get, set, construct_only)] pub(super) largest: Cell, #[property(get, set, construct_only, default)] pub(super) message_type: OnceCell, } #[glib::object_subclass] impl ObjectSubclass for SizeItem { const NAME: &'static str = "BustleSizeItem"; type Type = super::SizeItem; } #[glib::derived_properties] impl ObjectImpl for SizeItem {} } glib::wrapper! { pub struct SizeItem(ObjectSubclass); } impl SizeItem { pub fn new( member: &str, smallest: u32, mean: u32, largest: u32, message_type: MessageType, ) -> Self { glib::Object::builder() .property("member", member) .property("smallest", smallest) .property("mean", mean) .property("largest", largest) .property("message-type", message_type) .build() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/statistics/window.rs000066400000000000000000000041121525300766700255310ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use crate::filtered_message_model::FilteredMessageModel; mod imp { use std::cell::OnceCell; use super::*; use crate::statistics::{DurationsPage, FrequenciesPage, SizesPage}; #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)] #[properties(wrapper_type = super::StatisticsWindow)] #[template(resource = "/org/freedesktop/Bustle/ui/statistics.ui")] pub struct StatisticsWindow { #[property(get, set, construct_only)] pub(super) model: OnceCell, #[template_child] pub(super) durations_page: TemplateChild, #[template_child] pub(super) sizes_page: TemplateChild, #[template_child] pub(super) frequencies_page: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for StatisticsWindow { const NAME: &'static str = "BustleStatisticsWindow"; type Type = super::StatisticsWindow; type ParentType = adw::Dialog; fn class_init(klass: &mut Self::Class) { klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } #[glib::derived_properties] impl ObjectImpl for StatisticsWindow { fn constructed(&self) { self.parent_constructed(); let model = self.obj().model(); self.durations_page.set_model(&model); self.frequencies_page.set_model(&model); self.sizes_page.set_model(&model); } } impl WidgetImpl for StatisticsWindow {} impl AdwDialogImpl for StatisticsWindow {} } glib::wrapper! { pub struct StatisticsWindow(ObjectSubclass) @extends gtk::Widget, adw::Dialog, @implements gtk::ConstraintTarget, gtk::Buildable, gtk::Accessible; } impl StatisticsWindow { pub fn new(model: &FilteredMessageModel) -> Self { glib::Object::builder().property("model", model).build() } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/timestamp.rs000066400000000000000000000021401525300766700240320ustar00rootroot00000000000000use std::{ ops, time::{Duration, SystemTime}, }; use gtk::glib; #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, glib::Boxed)] #[boxed_type(name = "BustleTimestamp")] pub struct Timestamp(Duration); impl Timestamp { pub fn now() -> Self { let dur = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("SystemTime before UNIX EPOCH!"); Self(dur) } pub fn as_millis_f64(self) -> f64 { self.0.as_micros() as f64 / 1_000.0 } } impl ops::Sub for Timestamp { type Output = Self; fn sub(self, rhs: Self) -> Self { Self(self.0.sub(rhs.0)) } } impl ops::Div for Timestamp { type Output = Self; fn div(self, rhs: u32) -> Self { Self(self.0.div(rhs)) } } impl ops::AddAssign for Timestamp { fn add_assign(&mut self, rhs: Self) { self.0.add_assign(rhs.0); } } impl From for Timestamp { fn from(dur: Duration) -> Self { Self(dur) } } impl From for Duration { fn from(ts: Timestamp) -> Self { ts.0 } } bustle-0.14.0-54c3b153257d8e21d5ccd5603f7bea2db57d5ce4/src/window.rs000066400000000000000000000567031525300766700233540ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use anyhow::{Context, Result}; use formatx::formatx; use gettextrs::{gettext, ngettext}; use gtk::{ gio, glib::{self, clone}, }; use crate::{ ConnectionType, address_dialog::AddressDialog, application::Application, config::{APP_ID, PROFILE, VERSION}, details_view::DetailsView, diagram::Diagram, message::Message, message_list::MessageList, monitor::{Cancelled, Monitor}, statistics::StatisticsWindow, }; #[derive(Default, Debug, Copy, Clone, glib::Enum, PartialEq)] #[repr(u32)] #[enum_type(name = "BustleView")] pub enum View { #[default] EmptyState, Loading, Diagram, } mod imp { use std::cell::RefCell; use super::*; use crate::{filter_pane::FilterPane, filtered_message_model::FilteredMessageModel}; #[derive(Debug, gtk::CompositeTemplate)] #[template(resource = "/org/freedesktop/Bustle/ui/window.ui")] pub struct Window { #[template_child] pub(super) toast_overlay: TemplateChild, #[template_child] pub(super) main_stack: TemplateChild, #[template_child] pub(super) empty_page: TemplateChild, #[template_child] pub(super) empty_status_page: TemplateChild, #[template_child] pub(super) loading_page: TemplateChild, #[template_child] pub(super) diagram_page: TemplateChild, #[template_child] pub(super) record_button_stack: TemplateChild, #[template_child] pub(super) diagram_title: TemplateChild, #[template_child] pub(super) diagram_page_stack: TemplateChild, #[template_child] pub(super) waiting_sub_page: TemplateChild, #[template_child] pub(super) split_view_sub_page: TemplateChild, #[template_child] pub(super) details_view_split_view: TemplateChild, #[template_child] pub(super) diagram: TemplateChild, #[template_child] pub(super) filtered_message_model: TemplateChild, #[template_child] pub(super) details_view: TemplateChild, #[template_child] pub(super) sidebar_button: TemplateChild, pub(super) settings: gio::Settings, pub(super) monitor: RefCell>, // The currently recorded filename pub(super) filename: RefCell>, } impl Default for Window { fn default() -> Self { Self { toast_overlay: TemplateChild::default(), main_stack: TemplateChild::default(), empty_page: TemplateChild::default(), empty_status_page: TemplateChild::default(), loading_page: TemplateChild::default(), diagram_page: TemplateChild::default(), record_button_stack: TemplateChild::default(), diagram_title: TemplateChild::default(), diagram_page_stack: TemplateChild::default(), waiting_sub_page: TemplateChild::default(), split_view_sub_page: TemplateChild::default(), details_view_split_view: TemplateChild::default(), sidebar_button: TemplateChild::default(), diagram: TemplateChild::default(), filtered_message_model: TemplateChild::default(), details_view: TemplateChild::default(), settings: gio::Settings::new(APP_ID), monitor: RefCell::default(), filename: RefCell::default(), } } } #[glib::object_subclass] impl ObjectSubclass for Window { const NAME: &'static str = "BustleWindow"; type Type = super::Window; type ParentType = adw::ApplicationWindow; fn class_init(klass: &mut Self::Class) { FilterPane::ensure_type(); klass.bind_template(); klass.bind_template_instance_callbacks(); klass.install_action("win.about", None, |window, _, _| { window.show_about_window(); }); klass.install_action("win.statistics", None, |window, _, _| { window.show_statistics(); }); klass.install_action("win.filter-services", None, |window, _, _| { let imp = window.imp(); imp.split_view_sub_page .set_show_sidebar(!imp.split_view_sub_page.shows_sidebar()); }); klass.install_action_async("win.record-session-bus", None, async |window, _, _| { if let Err(err) = window .start_recording(Monitor::session(), &gettext("Recording session bus…")) .await { tracing::error!("Failed to record session: {err:?}"); if !err.is::() { window.add_error_toast(&gettext("Failed to record session bus")); } } }); klass.install_action_async("win.record-system-bus", None, async |window, _, _| { if let Err(err) = window .start_recording(Monitor::system(), &gettext("Recording system bus…")) .await && !err.is::() { tracing::error!("Failed to record system: {err:?}"); window.add_error_toast(&gettext("Failed to record system bus")); } }); klass.install_action_async("win.record-address", None, async |window, _, _| { let Ok(address) = AddressDialog::choose(&window).await else { return; }; let address_display = address.to_string(); if let Err(err) = window .start_recording( Monitor::address(address), // Translators: Do NOT translate the contents between '{' and '}', this // is a variable name. &formatx!(gettext("Recording {address}…"), address = address_display) .expect("Wrong format in translatable string"), ) .await { tracing::error!( address = address_display, "Failed to record address: {err:?}" ); if !err.is::() { window.add_error_toast(&gettext("Failed to record address")); } } }); klass.install_action("win.stop-recording", None, |window, _, _| { window.stop_recording(); }); klass.install_action_async("win.open-log", None, async |window, _, _| { if let Err(err) = window.open_log().await { tracing::error!("Could not open log: {err:?}"); if !err .downcast_ref::() .is_some_and(|error| error.matches(gtk::DialogError::Dismissed)) { window.add_error_toast(&gettext("Failed to open file")); } } }); klass.install_action_async("win.save", None, async |window, _, _| { if let Err(err) = window.save().await { tracing::error!("Could not save: {err:?}"); if !err .downcast_ref::() .is_some_and(|error| error.matches(gtk::DialogError::Dismissed)) { window.add_error_toast(&gettext("Failed to save as PCAP")); } } else { window.add_message_toast(&gettext("Recording saved as PCAP")); } }); klass.install_action_async("win.save-dot", None, async |window, _, _| { if let Err(err) = window.save_as_dot().await { tracing::error!("Could not save: {err:?}"); if !err .downcast_ref::() .is_some_and(|error| error.matches(gtk::DialogError::Dismissed)) { window.add_error_toast(&gettext("Failed to save as DOT graph")); } } else { window.add_message_toast(&gettext("Recording saved as DOT graph")) } }); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for Window { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } self.empty_status_page.set_icon_name(Some(APP_ID)); // Load latest window state obj.load_window_size(); obj.update_details_view(); obj.set_view(View::EmptyState); } } impl WidgetImpl for Window {} impl WindowImpl for Window { // Save window state on delete event fn close_request(&self) -> glib::Propagation { if let Err(err) = self.obj().save_window_size() { tracing::warn!("Failed to save window state: {:?}", err); } // Pass close request on to the parent self.parent_close_request() } } impl ApplicationWindowImpl for Window {} impl AdwApplicationWindowImpl for Window {} } glib::wrapper! { pub struct Window(ObjectSubclass) @extends gtk::Widget, gtk::Window, gtk::ApplicationWindow, adw::ApplicationWindow, @implements gio::ActionMap, gio::ActionGroup, gtk::ConstraintTarget, gtk::Accessible, gtk::Buildable, gtk::ShortcutManager, gtk::Native, gtk::Root; } impl Window { fn new(app: &Application) -> Self { glib::Object::builder().property("application", app).build() } pub fn with_group(app: &Application) -> Self { let window = Self::new(app); let group = gtk::WindowGroup::new(); group.add_window(&window); window } pub async fn load_log(&self, file: &gio::File) -> anyhow::Result<()> { let path = file.path().context("Log file does not have a path")?; let prev_view = self.view(); self.set_view(View::Loading); let message_list = match MessageList::load_from_file(path).await { Ok(message_list) => message_list, Err(err) => { self.set_view(prev_view); return Err(err); } }; let imp = self.imp(); imp.filtered_message_model .set_message_list(Some(&message_list)); let filename = file.basename().unwrap_or_default().display().to_string(); imp.diagram_title.set_title(&filename); imp.filename .replace(Some(filename.trim_end_matches(".pcap").to_string())); self.set_view(View::Diagram); imp.diagram_page_stack .set_visible_child(&*imp.split_view_sub_page); Ok(()) } fn set_view(&self, view: View) { let imp = self.imp(); match view { View::EmptyState => imp.main_stack.set_visible_child(&*imp.empty_page), View::Loading => imp.main_stack.set_visible_child(&*imp.loading_page), View::Diagram => { imp.main_stack.set_visible_child(&*imp.diagram_page); } } let is_recording = imp.monitor.borrow().is_some(); self.action_set_enabled( "win.record-session-bus", view == View::EmptyState || (view == View::Diagram && !is_recording), ); self.action_set_enabled( "win.record-system-bus", view == View::EmptyState || (view == View::Diagram && !is_recording), ); self.action_set_enabled( "win.record-address", view == View::EmptyState || (view == View::Diagram && !is_recording), ); self.action_set_enabled("win.stop-recording", view == View::Diagram && is_recording); self.action_set_enabled( "win.open-log", view == View::EmptyState || (view == View::Diagram && !is_recording), ); self.action_set_enabled( "win.open-pair-logs", view == View::EmptyState || (view == View::Diagram && !is_recording), ); self.action_set_enabled("win.statistics", view == View::Diagram && !is_recording); self.action_set_enabled("win.filter-services", view == View::Diagram); self.action_set_enabled("win.save", view == View::Diagram && !is_recording); self.action_set_enabled("win.save-dot", view == View::Diagram && !is_recording); } fn view(&self) -> View { let imp = self.imp(); let visible_child = imp.main_stack.visible_child().unwrap(); if visible_child == *imp.empty_page { View::EmptyState } else if visible_child == *imp.loading_page { View::Loading } else if visible_child == *imp.diagram_page { View::Diagram } else { unreachable!("unexpected visible child: {:?}", visible_child) } } fn save_window_size(&self) -> Result<(), glib::BoolError> { let imp = self.imp(); let (width, height) = self.default_size(); imp.settings.set_int("window-width", width)?; imp.settings.set_int("window-height", height)?; imp.settings .set_boolean("is-maximized", self.is_maximized())?; Ok(()) } fn load_window_size(&self) { let imp = self.imp(); let width = imp.settings.int("window-width"); let height = imp.settings.int("window-height"); let is_maximized = imp.settings.boolean("is-maximized"); self.set_default_size(width, height); if is_maximized { self.maximize(); } } fn show_about_window(&self) { let dialog = adw::AboutDialog::builder() .application_name("Bustle") .application_icon(APP_ID) .copyright("© 2008–2023 Will Thompson, Collabora Ltd. and contributors") .license_type(gtk::License::Lgpl21) .website("https://apps.gnome.org/Bustle/") .version(VERSION) .translator_credits(gettext("translator-credits")) .developer_name(gettext("The Bustle developers")) .developers(vec![ "Bilal Elmoussaoui", "Dave Patrick Caberto", "Maximiliano Sandoval", "Will Thompson ", "Dafydd Harries", "Chris Lamb", "Marc Kleine-Budde", "Cosimo Alfarano", "Sergei Trofimovich", "Alex Merry", "Philip Withnall", "Jonny Lamb", "Daniel Firth", ]) .designers(vec!["Tobias Bernard"]) .build(); dialog.present(Some(self)); } fn show_statistics(&self) { let imp = self.imp(); debug_assert!(imp.filtered_message_model.message_list().is_some()); StatisticsWindow::new(&imp.filtered_message_model).present(Some(self)); } fn stop_recording(&self) { let imp = self.imp(); let monitor = imp .monitor .take() .expect("monitor must be set when recording"); drop(monitor); imp.diagram.set_should_stick(false); let filename = glib::DateTime::now_local() .unwrap() .format("%Y-%m-%d %H:%M:%S") .unwrap(); imp.diagram_title.set_title(&format!("*{filename}.pcap")); imp.filename.replace(Some(filename.to_string())); if imp.filtered_message_model.n_items() != 0 { self.set_view(View::Diagram); imp.diagram_page_stack .set_visible_child(&*imp.split_view_sub_page); imp.record_button_stack.set_visible_child_name("record"); } else { self.set_view(View::EmptyState); } } async fn start_recording(&self, mut monitor: Monitor, display_message: &str) -> Result<()> { let imp = self.imp(); let message_list = MessageList::default(); monitor .start(clone!( #[weak] message_list, move |event| { message_list.push(Message::from_event(event)); } )) .await .context("Failed to start monitor")?; imp.monitor.replace(Some(monitor)); imp.diagram.set_should_stick(true); imp.filtered_message_model .set_message_list(Some(&message_list)); imp.diagram_title.set_title(display_message); imp.diagram_title.set_subtitle(""); self.set_view(View::Diagram); imp.diagram_page_stack .set_visible_child(&*imp.waiting_sub_page); imp.record_button_stack.set_visible_child_name("stop"); Ok(()) } async fn open_log(&self) -> anyhow::Result<()> { let filter = gtk::FileFilter::new(); // Translators: PCAP is a type of file, do not translate. filter.set_property("name", gettext("PCAP Files")); filter.add_mime_type("application/vnd.tcpdump.pcap"); filter.add_suffix("pcapng"); let filters = gio::ListStore::new::(); filters.append(&filter); let chooser = gtk::FileDialog::builder() .title(gettext("Open Log")) .filters(&filters) .modal(true) .build(); let file = match chooser.open_future(Some(self)).await { Err(err) if err.matches(gtk::DialogError::Dismissed) => return Ok(()), res => res?, }; self.load_log(&file).await?; Ok(()) } async fn save(&self) -> anyhow::Result<()> { let imp = self.imp(); let filter = gtk::FileFilter::new(); // Translators: PCAP is a type of file, do not translate. filter.set_property("name", gettext("PCAP Files")); filter.add_mime_type("application/vnd.tcpdump.pcap"); filter.add_suffix("pcapng"); let filters = gio::ListStore::new::(); filters.append(&filter); let mut builder = gtk::FileDialog::builder() .title(gettext("Save Log")) .filters(&filters) .modal(true); if let Some(filename) = imp.filename.borrow().as_ref() { builder = builder.initial_name(format!("{filename}.pcap")); } let chooser = builder.build(); let file = chooser.save_future(Some(self)).await?; let path = file.path().context("Selected file does not have a path")?; let message_list = imp .filtered_message_model .message_list() .expect("message list must be set before saving"); message_list.save_to_file(path).await?; // Update the title once the save operation is done // removing the `*` prefix if let Some(filename) = imp.filename.borrow().as_ref() { imp.diagram_title.set_title(filename); } Ok(()) } async fn save_as_dot(&self) -> Result<()> { let imp = self.imp(); let filter = gtk::FileFilter::new(); // Translators: Dot is a type of file, do not translate. filter.set_property("name", gettext("DOT Graph")); filter.add_mime_type("text/vnd.graphviz"); let filters = gio::ListStore::new::(); filters.append(&filter); let mut builder = gtk::FileDialog::builder() .title(gettext("Save Log as DOT Graph File")) .filters(&filters) .modal(true); if let Some(filename) = imp.filename.borrow().as_ref() { builder = builder.initial_name(format!("{filename}.gv")); } let chooser = builder.build(); let file = chooser.save_future(Some(self)).await?; let message_list = imp .filtered_message_model .message_list() .expect("message list must be set before saving"); message_list.save_as_dot(&file).await?; Ok(()) } pub fn add_message_toast(&self, message: &str) { let toast = adw::Toast::new(message); self.imp().toast_overlay.add_toast(toast); } fn add_error_toast(&self, message: &str) { let toast = adw::Toast::builder() .title(message) .priority(adw::ToastPriority::High) .build(); self.imp().toast_overlay.add_toast(toast); } fn update_details_view(&self) { let imp = self.imp(); if let Some(message) = imp.diagram.selected_message() { imp.details_view.set_message(Some(message)); imp.details_view_split_view.set_show_sidebar(true); imp.sidebar_button.set_sensitive(true); } else { imp.details_view.set_message(None::); imp.details_view_split_view.set_show_sidebar(false); imp.sidebar_button.set_sensitive(false); } } } #[gtk::template_callbacks] impl Window { #[template_callback] fn diagram_selected_message_notify(&self) { self.update_details_view(); } #[template_callback] fn filtered_message_model_items_changed(&self, _position: u32, removed: u32, added: u32) { if removed == 0 && added == 0 { return; } let imp = self.imp(); let is_recording = imp.monitor.borrow().is_some(); if is_recording { let n_messages = imp.filtered_message_model.n_items(); imp.diagram_title.set_subtitle( &formatx!( // Translators: Do NOT translate the contents between '{' and '}', this is a // variable name. ngettext( "Logged {n_messages} message", "Logged {n_messages} messages", n_messages, ), n_messages = n_messages, ) .expect("Wrong format in translatable string"), ); if n_messages != 0 { imp.diagram_page_stack .set_visible_child(&*imp.split_view_sub_page); } } } pub fn connection_type(&self) -> Option { self.imp() .monitor .borrow() .as_ref() .map(|m| m.connection_type()) .cloned() } #[template_callback] fn copy_command_clicked(&self) { const CMD: &str = "busctl capture --user"; self.clipboard().set_text(CMD); self.add_message_toast(&gettext("Copied to clipboard")); } #[template_callback] fn details_view_show_message_request(&self, message: &Message) { if let Err(err) = self .imp() .diagram .scroll_to(message, gtk::ListScrollFlags::SELECT) { tracing::error!("Failed to scroll to message: {:?}", err); } } }